如何使用 Tmux

Tmux 是什么? Tmux 是终端的多窗口工具,跟 screen 的功能差不多,能够将当前所有窗口的状态保存到session (会话)里并挂起,之后可以用 reattach session 的方式重新恢复。不同于 screen 的是,tmux能够在一个窗口添加多个面板。比较常用的场景比如,开两个面板,一个打开 vim, 一个用来运行命令;再比如,需要同时操作多个服务器的时候,打开多个面板,同步输入到所有面板上去。这样就能在多个服务器上同时执行同一条命令。 安装: Ubuntu & Debian: sudo apt install tmux CentOS: sudo yum install tmux macOS: brew install tmux 需要先安装 HomeBrew 什么是 session 以及如何管理 session ? 在终端输入tmux 后,窗口会自动创建一个session 。所有的操作都会在这个 session 中进行。比如创建多个面板,在面板之间切换等等。session 可以被保存和恢复。比如你在一个 session 中打开了很多窗口,但是需要重启电脑,这个时候就可把 session 保存起来,然后重启之后恢复 session 来继续工作。 新建 session tmux 或者 tmux new tmux new -s <session_name> [-n <window_name] 指定 session 的名字和窗口的名字 离开 session Ctrl+b d: 挂起session,可以随时恢复 恢复 session...

February 28, 2021 · 2 min · 308 words · Eric Yang

排列组合算法[Python]

两种排列组合算法 一个是在Edx课上看到的,一个是Python的源码 通过二进制中“1”所在位置的可能性来确定数组中的索引位置,进而求得所有排列组合 首先确定组合的数量是2的N次方个,然后循环2^N, 每个数字即代表一种可能。 比如数组长度是5的情况下,我们一共有2^5种可能,第 1 种可能 对应的二进制为 0 0 0 0 1,第 5 种 对应的是 0 1 0 0 1. 其次既是如何把对应位置的二进制转化成对应数组的索引位置,比如上例中 第 5 种可能 即为 5 转换的二进制:0 1 0 0 1,那么它对应的数据应该是数组种的 第二位和最后一位 算法中,通过 (i >> j) % 2 == 1 来确定 当前二进制位是否为 1,在此就不赘述了。 def powerSet(items): N = len(items) # enumerate the 2**N possible combinations for i in range(2**N): combo = [] for j in range(N): # test bit jth of integer i # test bit jth of integer i # >>j....

March 11, 2017 · 4 min · 706 words · Eric Yang

部署和测试工具 - PHP进阶 (5)

测试 概念分类 单元测试(Unit Test) - 在项目中独立测试函数、方法、类等。 TDD(Test-Driven Development) - 项目开始后,先写一部分测试用例,然后实现,然后继续写测试用例,继续实现,不断循环直至项目完成或终止。 BDD(Behavior-Driven Development) - 基于行为流程来描述程序的实现。类似于单元测试,只是在实现上应用了比较友好的表达方式便于理解。 SpecBDD - 面向开发人员。使用编程语言表达。例: phpspec StoryBDD - 面向产品经理。基于英语语言表达。例:behat 自动化部署工具 capistrano/capistrano magephp Rocketeer 代码分析工具 Xdebug blackfire

February 26, 2017 · 1 min · 28 words · Eric Yang

服务器配置及性能调优 - PHP进阶 (4)

PHP-FPM 配置 全局配置 emergency_restart_threshold = 10 如果子进程在 emergency_restart_interval 设定的时间内收到该参数设定次数的 SIGSEGV 或者 SIGBUS退出信息号,则FPM会重新启动。0 表示“关闭该功能”。默认值:0(关闭)。 emergency_restart_interval = 1m 用于设定平滑重启的间隔时间。这么做有助于解决加速器中共享内存的使用问题。 进程池配置 pm.max_requests = 1000 设置每个子进程重生之前服务的请求数。对于可能存在内存泄漏的第三方模块来说是非常有用的。如果设置为 ‘0’ 则一直接受请求,等同于 PHP_FCGI_MAX_REQUESTS 环境变量。默认值:0。 request_slowlog_timeout = 5s 当一个请求该设置的超时时间后,就会将对应的 PHP 调用堆栈信息完整写入到慢日志中。设置为 ‘0’ 表示 ‘Off’。 确定 PHP-FPM 的进程数 首先确定服务器可以分配给PHP的内存大小 其次确定单个PHP进程的内存消耗 最后确定进程数 上线前别忘了使用 Apache Bench 或者 Seige 来做压力测试 Zend OPcache 通俗来讲,OPcache 是用来预编译PHP的代码到缓存里来加速HTTP的请求。 Session 处理 由于PHP默认会将session以文件的形式存储在磁盘上,必然会加大磁盘的I/O,拖慢系统。使用内存存储的方式,比如 Memcached 或者 Redis 会是更好的选择。而且这种方式会便于以后扩展分布式系统时保证 Session 共享。

February 25, 2017 · 1 min · 60 words · Eric Yang

好的编程习惯 - PHP进阶 (3)

净化、验证、转义输入输出 需要注意的几个外部数据源 $_GET $_POST $_REQUEST $_COOKIE $argv php://stdin php://input file_get_contents() 远程数据库 远程 APIs 远程客户端获取的数据 净化输入 HTML 在接触存储层之前,使用 htmlentities() 来净化 HTML 的特殊字符: <?php $input = '<p><script>alert("You won the Nigerian lottery!");</script></p>'; echo htmlentities($input, ENT_QUOTES, 'UTF-8'); 避免使用 preg_replace(), preg_replace_all() 和 preg_replace_callback() 等正则函数在HTML代码里。 SQL 查询 使用 PDO prepared statement 的形式,避免SQL注入等问题。 用户信息收集 使用 filter_var() 和 filter_input() 来净化用户信息数据,如 emails, URL-encoded strings, integers, floats, HTML characters, URLs 等,例: <?php $email = 'john@example.com'; $emailSafe = filter_var($email, FILTER_SANITIZE_EMAIL); 验证数据 可以使用内置函数 filter_var() 来做简单的验证:...

February 20, 2017 · 4 min · 717 words · Eric Yang

VIM的基本命令使用以及插件配置

好不容易用英语写完了, 懒得翻译了 Basic Usage Normal Mode First Open file with VIM command, with get into Normal Mode h``j``k``l : ←``↓``↑``→ dd : delete current line x : delete current character yy : copy current line p : paste. It will paste last copied, cut or deleted texts. ^ : go to first non-blank character in current line, $ to the end u : undo, <C-r> : redo. g-/g+ : go to older/newer text state ....

January 4, 2017 · 9 min · 1864 words · Eric Yang

Elasticsearch Mapping - Elasticsearch 学习实践 (2)

Mapping Mapping是用于定义文档及其内部属性字段如何被索引及搜索的。 系统字段 首先了解下系统特别制定的字段及其用法。 结构定位字段 _index: 类似数据库的库名 _type: 类似数据库的表名 _id: 类似数据库中每条数据的ID _uid: 结构是{type}#{id},可用于直接准确查询某条数据 文档数据字段 _source: 原始数据JSON _size: 原始数据JSON的大小 可用于索引查询的字段 _all: 将_source数据用空格切分保存后作索引(不建议保存,影响性能) _field_names: 用于是否包含某字段查询 路由字段 _parent: 用于在两种数据类型之间创建父子关系 _routing: 用于路由到特定的分片(shard) 其他字段 _meta: 用于存储特定的信息,比如有效版本号、可调用的类函数等 用户定义字段 定义用户索引的文档字段属性,系统本身是提供动态mapping,也就是说,我们可以在不定义mapping的情况下直接导入,系统会根据用户的第一倒入生成mapping。 但如果文档相对复杂,还是建议完整设置动态mapping来避免异常错误。 Elasticsearch 为我们提供了常用的字段类型,包括:text, keyword, date, boolean, long, integer, short, byte, double, float, binary, 复杂点的array, object, nested, 用于定位的geo_point, geo_shape, 特殊的ip, completion, token_count, murmur3, attachments, percolator。 其中需要注意的是 text和keyword都是string, 前者会被当作文本分析并索引,可用于包含关键词搜索,后者会作为一个整体而被作为完全匹配搜索, 主要用于聚合、排序等功能使用。 array 并非数据类型,仅仅作为数据类型标识。 object 同array 仅作为数据类型标识,无任何意义。 nested 等同于object数据类型,将数据结构的KEY扁平化如: "user.first" : [ "alice", "john" ], 常用设置 index....

November 17, 2016 · 2 min · 283 words · Eric Yang

Get Start - Elasticsearch 学习实践 (1)

基本概念 索引(indix): 相当于关系型数据库的数据库。 类型(type):相当于关系型数据库的表。 文档(Document): 相当于关系型数据库中的每一行数据记录。 字段(field):相当于数据类型,例如字符串、整数、日期等。 映射(mapping): 用于定义文档及其内部属性字段如何被索引及搜索的。 节点(Node):单台服务器称为一个节点,默认情况下最好配置2+台保证可用性。 分片索引(Shard):Elasticsearch会把数据分发到多台服务器上存储。这个过程成为分片(Sharding)。 索引副本(Replica):副本主要是主分片的复制。在搜索请求阻塞在单个节点时,它可以像原来的主分片一样处理用户搜索请求。 安装 使用 Docker 安装 文件目录结构: Dockerfile // Docker安装文件 config/ elasticsearch.yml // Elasticsearch的基本配置 license.json // 在官网注册的Basic License x-pack/ roles.yml // 定义角色 Dockerfile FROM elasticsearch:5.2.0 # Define working directory. WORKDIR /tmp # Define default command. # CMD ["/elasticsearch/bin/elasticsearch"] RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install x-pack # 使用IK分词器 ENV IK_VERSION 5.2.0 RUN wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v$IK_VERSION/elasticsearch-analysis-ik-$IK_VERSION.zip RUN unzip elasticsearch-analysis-ik-$IK_VERSION.zip -d /usr/share/elasticsearch/plugins/ik/ RUN rm -f elasticsearch-analysis-ik-$IK_VERSION.zip # Mount elasticsearch....

November 17, 2016 · 2 min · 250 words · Eric Yang

RFC 2119 解读

简介 RFC2119 是技术文档中的规范用语要求,针对若干个关键词进行说明,解释其在文档中的具体用法。在使用中所有字母都必须是大写的。 了解它的规定有利于解读英文文档的具体用意。 所有遵循该规定的文档都在开头包含以下文字 The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119. 1. MUST:等同于"REQUIRED“和”SHALL"。 必须使用 2. MUST NOT:等同于"SHALL NOT"。 必须避免使用 3. SHOULD:等同于"RECOMMENDED"。 推荐使用方式,但在某些特定情况下可以忽略。如果需要采用不同的方式,请务必仔细斟酌 4. SHOULD NOT:等同于"NOT RECOMMENDED"。 推荐不使用方式,但在某些特定情况下可以忽略。如果需要采用不同的方式,请务必仔细斟酌 5. MAY:等同于"OPTIONAL"。 可选可不选 官方文档: https://tools.ietf.org/html/rfc2119

October 25, 2016 · 1 min · 55 words · Eric Yang

简要说明语义化版本号的具体用法

版本格式:主版本号.次版本号.修订版本号,版本号递增规则如下 主版本号:当你做了不兼容的 API 修改, 次版本号:当你做了向下兼容的功能性新增, 修订版本号:当你做了向下兼容的问题修正。 先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。 具体要求 必须包含公共API,定义在代码或文档中。 格式必须是 X.Y.Z。 非负,从0开始。 每次代码修改必须调整版本号。 主版本号为0时(0.Y.Z) 为开发阶段,可随意修整代码。 1.0.0 是公共API的起始版本号。 修订版本号为修复BUG递增版本号,向后兼容。 新增功能后次版本号增长。必须保证向后兼容。修订版本号归零。 新增不能向后兼容的功能后,主版本号增长,次版本号及修订版本号归零。 先行版本号,即已发布非正式的版本号标注。必须从1.0.0开始。 在版本号后以-a.a...的形式追加。 a 可为字母单词数字横杠(-), 不可为空。范例:1.0.0-alpha、1.0.0-alpha.1、1.0.0-0.3.7、1.0.0-x.7.z.92。 版本编译信息追加。在先行版本号以+b.b...的形式追加。 b可为字母单词数字横杠(-), 不可为空。范例:1.0.0-alpha+001、1.0.0+20130313144700、1.0.0-beta+exp.sha.5114f85。 版本优先级。 从左到右依次比较。先行版本号及版本编译信息的比较中以.切割比较,有编号高于无编号,字母编号高于编号数字。范例:1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0。 基于官方文档2.0.0版本翻译解释 文档地址: http://semver.org/

October 25, 2016 · 1 min · 47 words · Eric Yang