排列组合算法[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

Mac上配置GH60键盘

安装必要的工具 brew install Caskroom/cask/crosspack-avr brew install dfu-programmer cd ~ git clone --recursive https://github.com/kairyu/tmk_keyboard_custom.git 检查 avr-gcc 命令是否可用 直接在命令行执行 avr-gcc, 如果出现command not found, 在命令行执行: PATH="/usr/local/CrossPack-AVR/bin:$PATH" export $PATH 以上命令是临时把路径 /usr/local/CrossPack-AVR/bin 放到 PATH 中,关闭Terminal后失效 修改配置文件来支持GH60_REV_CHN cd ./tmk_keyboard_custom/keyboard/gh60 vi config.h 找到 #define CONFIG_H, 在底下加上 #define GH60_REV_CHN vi Makefile 注释或删掉下面这行代码 KEYMAP_IN_EEPROM_ENABLE = yes # Read keymap from eeprom 连接测试键盘 连接后输入入下列指令 system_profiler SPUSBDataType 应该会出现: GH60: Product ID: 0x6060 Vendor ID: 0xfeed Version: 0.01 Speed: Up to 12 Mb/sec Manufacturer: geekhack Location ID: 0x14400000 / 37 Current Available (mA): 500 Current Required (mA): 100 Extra Operating Current (mA): 0 然后按下键盘背部的按钮...

December 30, 2016 · 2 min · 303 words · Eric Yang

提升生产效率的工具集锦(APP)

按键说明 ⌘ – Command Key ⇥ – Tab Key ⌃ – Control Key ⌥ – Option Key ⇧ – Shift Key ⏎ – Return Key ← Left Arrow Key → Right Arrow Key APPS Alfred 3 强大的启动器, 拥有各种快捷入口, 不仅仅是用来代替Spotlight。增强的workflow更让繁琐的操作变得简单起来。 下载: 官网 Powerpack 需要付费, £19起 可设置启动命令, 本人使用 ⌥+⌘, 好像是默认的。 本人会禁用掉Spotlight及其索引功能来提升性能: 打开 系统设置 - Spotlight 取消掉所有在Spotlight中的搜索结果,以及建议查找的功能 左下角选择键盘快捷键, 取消两个已选中两个搜索 Flycut 剪切板管理器 下载: App Store / Github 快捷键:⇧+⌘+p, 可以不停地按p来切换,或者使用← →方向键 注:Alfred 3也提供了剪切板的功能,个人觉得不够便捷,在使用Flycut的时候,可以考虑给关了。 可设置为开机启动 f.lux 护眼神器。根据一天的时间来调节屏幕的亮度,在晚上屏幕会变成暖色调。...

December 11, 2016 · 2 min · 265 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