Amp

PHP进阶通讯、实现消息队列操作

半腔热情 提交于 2020-08-10 04:03:33
一、进程的基本知识 什么是进程,所谓进程其实就是操作系统中一个正在运行的程序,我们在一个终端当中,通过php,运行一个php文件,这个时候就相当于我们创建了一个进程,这个进程会在系统中驻存,申请属于它自己的内存空间系统资源并且运行相应的程序。 对于一个进程来说,它的核心内容分为两个部分,一个是它的内存,这个内存是这进程创建之初从系统分配的,它所有创建的变量都会存储在这一片内存环境当中。 一个是它的上下文环境我们知道进程是运行在操作系统的,那么对于程序来说,它的运行依赖操作系统分配给它的资源,操作系统的一些状态。 在操作系统中可以运行多个进程的,对于一个进程来说,它可以创建自己的子进程,那么当我们在一个进程中创建出若干个子进程的时候那么可以看到如图,子进程和父进程一样,拥有自己的内存空间和上下文环境。 二、进程间通讯 进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法。每个进程都有自己的一部分独立的系统资源,彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。 进程通信有如下的目的: 数据传输,一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M之间; 共享数据,多个进程想要操作共享数据,一个进程对数据的修改,其他进程应该立刻看到; 进程控制

Spring Boot (二):模版引擎 Thymeleaf 渲染 Web 页面

亡梦爱人 提交于 2020-08-10 03:52:39
1. 什么是 Thymeleaf ? 虽然我们目前拥有许多十分优秀的前端框架,例如: Vue 、 React 等,非常适用于前后端分离的场景,前端可以独立部署成为服务,前后端从物理上完全进行隔离,降低程序耦合度。但是 Spring Boot 官方依然为我们提供了模版引擎用于一些无需前后端分离的场景。 Thymeleaf 是新一代的模板引擎,在 Spring Boot 中,官方推荐使用 Thymeleaf 来做前端模版引擎。打开 https://start.spring.io/ 可以看到,在当前Spring Boot 的版本中( 2.1.8.RELEASE ), 官方提供的模版引擎有以下几种: Thymeleaf FreeMarker Mustache Groovy Spring Boot 建议使用这些模版引擎,而并不推荐我们继续使用 JSP 。(了解源码可+求求: 1791743380) Thymeleaf 具体特性如下: Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式。浏览器解释 html 时会忽略未定义的标签属性,所以 Thymeleaf 的模板可以静态地运行;当有数据返回到页面时

吐血搞定binder机制

回眸只為那壹抹淺笑 提交于 2020-08-10 03:17:06
前言   binder机制作为android进程间通信一种非常重要的手段,在android系统中起到重要的作用,在应用层中我们所使用的activity,service等组件都需要和ActivityManagerService通信,包括我们使用的各种系统service,这种跨进程的通信都是通过binder来完成的,java层的代码经过jni调用最终由内核binder驱动进行数据传输,有人把binder比喻成android系统的血管,看不见摸不着但是却非常重要,可以说没有binder我们的app将孤立于android系统甚至无法正常运行,在学习binder机制的过程,整个过程是比较枯燥,需要一点点的耐心,这里要吐槽下android底层代码,用c,c++感觉真的是写的随心所欲,晦涩难懂,但是没有办法再难也得硬着头皮上啊,我不如地狱谁如地狱,之前断断续续看过几次binder,但最终都应该公司事多而放弃,这次也算是利用闲暇时间搞定了这块难啃的骨头。 binder中几个重要角色   binder机制中会涉及到4个主要角色分别是Client,Service,ServiceManager,Binder内核驱动。binder的设计理念其实是采用C/S的架构,整个请求过程可以非常形象的用网络请求进行描述,Client就是我们的浏览器,Service即服务端,Binder内核驱动就是我们的网络

C语言探索之旅 | 第一部分第十一课:函数

女生的网名这么多〃 提交于 2020-08-10 02:53:51
>作者 谢恩铭,公众号「 程序员联盟 」。 转载请注明出处。 原文: https://www.jianshu.com/p/148564646b7f > 《C语言探索之旅》 全系列 内容简介 前言 函数的创建和调用 一些函数的实例 总结 第一部分练习题预告 1. 前言 上一课是 C语言探索之旅 | 第一部分第十课:第一个C语言小游戏 。 这一课我们将会用 函数 这个重中之重来结束《C语言探索之旅》的第一部分(基础部分),而第二部分将要迎接我们的就是 C语言的高级技术了。 第二部分会比较难,不过不用担心,我们会循序渐进,一点点地学习。只要方向对,肯花时间,C语言一点也不可怕。 这一课里我们也会给大家讲 C语言程序所基于的原则。 我们将要学习如何将程序分块管理,有点像乐高积木。 其实所有 C语言的大型程序都是小程序块的集合,而这些小程序块我们称之为 函数 。函数的英语是 function,function 表示“功能;[数]函数”。 在面向对象的语言(如 Java,C++)里面,函数又被称为 方法 (method)。当然这里我们只讨论 C语言(面向过程的语言),不讨论面向对象的语言。 2. 函数的创建和调用 在之前的课程中我们已经学过:所有的 C语言程序都是由 main 函数开始运行的。那时候我们也展示了一个概要图,里面有一些术语: 最上面的部分我们称之为“预处理指令”,很容易辨识

计算机基础知识01

我们两清 提交于 2020-08-10 02:04:44
PC -> Program Counter 程序计数器 (记录当前指令地址) Registers -> 暂时存储CPU计算需要用到的数据 ALU -> Arithmetic & Logic Unit 运算单元 CU -> Control Unit 控制单元 MMU -> Memory Management Unit 内存管理单元 cache 超线程 双核CPU中,每个核中有一个ALU(运算单元),每个ALU对应一组Registers&PC,这样每核可以同时跑两个线程,两个核可以跑4个线程。双核4线程 CPU中的cache 缓存行 从硬盘读数据室都是一行一行的读,每一行包含16个内存页,每一缓存行大小为64k,内存页4k 缓存行越大,局部性空间效率越高,但读取时间慢 缓存行越小,局部性空间效率越低,但读取时间快 缓存一致性协议(MESI) 缓存行对齐 对于有些特别敏感的数字,会存在线程高竞争的访问,为了保证不发生伪共享,可以使用缓存航对齐的编程方式 ;可以使用注解@Contended缓存行对其,保证该数据不跟其他数据在一个缓存行 对象的创建过程 volatile保证内存可见性、禁止指令重排序,volatile使用内存屏障来实现指令禁止重排序 来源: oschina 链接: https://my.oschina.net/u/3141521/blog/4341855

数据结构(六)——循环链表

放肆的年华 提交于 2020-08-10 02:02:53
一、循序链表简介 1、循环链表的定义 循环链表的任意元素都有一个前驱和一个后继,所有数据元素在关系上构成逻辑上的环。 循环链表是一种特殊的单链表,尾结点的指针指向首结点的地址。 循环链表的逻辑关系图如下: 2、循环链表的设计实现 循环链表的设计实现要点: A、通过模板定义CircleList,继承自LinkedList B、定义连接链表首尾的内部函数 C、实现首元素的插入和删除操作 D、重写清空操作和遍历操作 3、循环链表的实现关键 A、插入位置为0时,头结点和尾结点均指向新结点,新结点作为首结点插入链表。 B、删除位置为0时,头结点和尾结点指向位置为1的结点,删除销毁首结点 二、循环链表的操作 1、尾结点获取 Node* last () { return this ->position( this ->m_length - 1 )->next; } 2、首尾结点连接 void lastToFirst () { last()->next = this ->m_header.next; } 三、循环链表的实现 template < typename T> class CircleList : public LinkedList<T> { protected : typedef typename LinkedList<T>::Node Node; //尾结点 Node* last ()

Hacker News 简讯 2020-07-05

廉价感情. 提交于 2020-08-10 02:01:31
最后更新时间: 2020-07-05 23:02 The Car, Reinvented. From Scratch - (mondaynote.com) 这辆车,改头换面。从头开始 得分:37 | 评论:38 Bible API - (bible-api.com) 圣经API 得分:108 | 评论:54 A Journey building a fast JSON parser and full JSONPath, Oj for Go - (github.com) 构建一个快速JSON解析器和完整的JSONPath,Oj for Go的旅程 得分:40 | 评论:16 A ‘viral’ new bird song in Canada is causing sparrows to change their tune - (gizmodo.com) 加拿大的一首“病毒性”新歌正引起麻雀们改变调子 得分:198 | 评论:60 Apple Bringing Back Fun in Visual Design - (applypixels.com) 苹果在视觉设计中带来乐趣 得分:68 | 评论:56 Rust on the ESP32 (2019) - (mabez.dev) ESP32上的铁锈(2019年) 得分:39 | 评论:23 Repairing your

leetcode8(字符串转换整数 (atoi))--Java语言实现

泄露秘密 提交于 2020-08-10 02:01:15
求: 请你来实现一个 atoi 函数,使其能将字符串转换成整数。 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下: 如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。 假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。 该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。 注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。 在任何情况下,若函数不能进行有效的转换时,请返回 0 。 提示: 本题中的空白字符只包括空格字符 ' ' 。 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。 示例 1: 输入: "42" 输出: 42 示例 2: 输入: " -42" 输出: -42 解释: 第一个非空白字符为 '-', 它是一个负号。 我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。 示例 3: 输入: "4193 with words" 输出

我的另一种参与 RocketMQ 开源社区的方式

橙三吉。 提交于 2020-08-10 00:42:11
首先先“SHOW”一波我在 RocketMQ 开源社区所获得的成就:2019年RocketMQ社区授予我优秀布道师荣誉称号,证书很高大上,奖品丰厚哦。 布道师是什么?开源项目不是都在追求如何成为一名 Committer?其实这个就是参与开源项目的两种不同方式。如何参与一个开源项目,容我慢慢道来。 1、与 RocketMQ 相识、相知到“在一起” 在2017年听到阿里巴巴将 RocketMQ 捐赠给 Apache基金会成为 Apache 的顶级项目,我内心是无比激动,因为终于可以一睹一款高性能的消息中间件的实现原理。 通过阅读 RocketMQ 官方文档,以下几个特别的点吸引了我的注意,让我下定决心深入研究一番。 RocketMQ 为什么性能高效,到底运用了什么“厉害”的技术 RocketMQ 如何实现刷盘(可以类比一下数据库方面的刷盘、redo、undo日志) RocketMQ 文件存储设计理念、基于文件的 Hash 索引是怎么实现的 定时消息、消息过滤等实现原理 如何进行网络编程(Netty实战) 心动不如行动,下定决心后便开始了我的源码分析 RocketMQ 之旅,大概在4个多月的时间中连续发表了30余篇文章,从 Nameserver、消息发送高可用设计、消息存储、消息消费、消息过滤、事务消息等各个方面对其进行了体系化的剖析,边写边分享,边分享边传播

iOS PHLivePhotoView 生成、展示、保存

删除回忆录丶 提交于 2020-08-10 00:32:22
展示和保存 导入头文件 import PhotosUI let imagePath = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first! + "/live.jpg" let videoPath = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first! + "/live.mov" 展示 PHLivePhoto.request(withResourceFileURLs: [URL(fileURLWithPath: videoPath), URL(fileURLWithPath: imagePath)], placeholderImage: nil, targetSize: .zero, contentMode: .default) { (livePhoto, info) in self.livePhotoView.livePhoto = livePhoto self.livePhotoView.startPlayback(with: PHLivePhotoViewPlaybackStyle.full) } 保存 PHPhotoLibrary.shared()