一名宅。 - 2017年7月
type: channel
link: https://zhaiyiming.com/2017/07/
description: 华山绝顶坐忘经
items: 解决 MacOS X 键盘HOME与END键功能不正确的问题
items: 制作一个gzip炸弹来保护你的网站
items: 禁用MacOS自带PHP环境 使用brew安装的PHP环境
items: 浮点数快速取整算法 - 解读LUA中number2int函数源码
items: A*算法

解决 MacOS X 键盘HOME与END键功能不正确的问题
type: item
date: 2017-07-24T11:14:06+08:00
description: 建立目录 mkdir ~/Library/KeyBindings 将以下内容写入文件 (UTF-8 encoding) vim ~/Library/KeyBindings/DefaultKeyBinding.dict { "\UF729" = "moveToBeginningOfLine:"; "\UF72B" = "moveToEndOfLine:"; "$\UF729" = "moveToBeginningOfLineAndModifySelection:"; "$\UF72B" = "moveToEndOfLineAndModifySelection:"; } 重新启动系统

制作一个gzip炸弹来保护你的网站
type: item
date: 2017-07-14T13:55:00+08:00
description: 看到访问日志里面总有脚本小子扫管理页面，不如丢个炸弹上去玩玩。 生成一个gzip炸弹 dd if=/dev/zero bs=1M count=1024 | gzip > bomb.gzip 修改nginx地址重写 location ~ /wp-admin { if (!-e $request_filename) { rewrite ^/.* /path/to/bomb.gzip; } include fastcgi-php.conf; } location ~ 1g\.bomb\.gzip { default_type 'text/html'; } 具体自由发挥，根据自己的站点调整即可。（滑稽脸）

禁用MacOS自带PHP环境 使用brew安装的PHP环境
type: item
date: 2017-07-12T11:29:50+08:00
description: 今天在配置环境时被自带的PHP环境坑了，一直报错然后看了下PHP版本居然是5.6，which php-fpm后发现在/usr/sbin下，这是MacOS自带的PHP环境，而我的PHP是通过brew安装的，位于/usr/local/sbin下。 于是我想到的是先卸载自带的PHP 5.6，然而MacOS 10.12下/usr/sbin属于被保护的目录，禁止修改，而且修改后下次系统更新又会装回来。 所以最好的方法是修改环境变量PATH的加载顺序，提前/usr/local/sbin。 具体操作如下 sudo vim /etc/paths 将 /usr/local/sbin 调整到 /usr/sbin 之前 保存文件 重启控制台

浮点数快速取整算法 - 解读LUA中number2int函数源码
type: item
date: 2017-07-10T11:48:00+08:00
description: 最近在看LUA源码时注意到这么一段有趣的代码。 /* @@ lua_number2int is a macro to convert lua_Number to int. @@ lua_number2integer is a macro to convert lua_Number to lua_Integer. ** CHANGE them if you know a faster way to convert a lua_Number to ** int (with any rounding method and without throwing errors) in your ** system. In Pentium machines, a naive typecast from double to int ** in C is extremely slow, so any alternative is worth trying. */ /* On a Pentium, resort to a trick */ #if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) && !defined(__SSE2__) && \ (defined(__i386) || defined (_M_IX86) || defined(__i386__) || \ defined(_M_X64) || defined(__x86_64__)) /* 32 windows system and microsoft compiler, use assembler */ #if defined(_WIN32) && !defined(_WIN64) && defined(_MSC_VER) #define lua_number2int(i,d) __asm fld d __asm fistp i #define lua_number2integer(i,n) lua_number2int(i, n) /* the next trick should work on any Pentium, but sometimes clashes with a DirectX idiosyncrasy on 32 windows system*/ #else union luai_Cast { double l_d; int l_i; }; #define lua_number2int(i,d) \ { volatile union luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_i; } #define lua_number2integer(i,n) lua_number2int(i, n) #endif /* this option always works, but may be slow */ #else #define lua_number2int(i,d) ((i)=(int)(d)) #define lua_number2integer(i,d) ((i)=(lua_Integer)(d)) #endif /* }================================================================== */ 在WIN32下lua_number2int函数中通过一些巧妙的方法来实现double转int。 浮点数 根据IEEE754描述，64位双精度类型浮点数表示方法各位作用如下 高位端 符号位 指数位 有效数字位 低位端 - 1 11 52 - 符号位占用1bit，0表示正数，1表示负数。 指数位由偏正值来表示，即用实际指数大小+1023来表示。 有效数字位为从低位到高位开始表示的52个二进制位。 浮点数运算 浮点数运算大体分为三步 提升指数较小的数的指数，使其指数与大数相同，从而进行运算 将两个数的有效数字位相加，由于指数相同，相加完得到的数即为结果 对结果数值进行规格化操作 发现 根据上述浮点数表示方式和其加法运算，我们发现只需要对一个浮点数F加上它所能表示的最大的包含所有整数位的浮点数A，得到的结果的数值位就是原浮点数F的整数部分加上加数A的结果。而由于double类型的数值位有52位，已超出int类型读取范围。恰好在x86架构下，内存为小端对齐，此时联合luai_Cast中的int部分得到的刚好是double类型的数值位低32位的结果，即我们的加数A只要保证加法得到的结果有效数字位是以1为前导的，就不会因为规格化而影响到结果的低位。 在接下来的示例中，我们会发现使用2^52(最高位为…

A*算法
type: item
date: 2017-07-06T15:48:00+08:00
description: Dijkstra就是A*的一个特例 先占坑 这周写 概述 A*算法是一种深度优先遍历，是Dijkstra算法的一种优化算法。该算法从一个指定的点开始创建一棵树，每步延伸一次这棵树的节点，直到这棵树的某一条路径抵达重点。在每一步操作时，A*算法需要决定它的哪一个部分子路径需要进行延伸 其他 由于A*算法判断不能到达的方式是穷举掉所有的路径，所以在游戏寻路算法中，通常不能到达的点计算量会非常大。所以在实际使用时，通常把不能互相到达的点提前标记好，寻路算法在计算前先判断两个点之间是否可以连通。