我的第一个PHP程序

2010年9月5日
第一次听到PHP是从一个AR1688开发者那里. 他告诉我他在网页界面中写了些PHP代码自动计算网页总字节大小, 这样可以避免AR1688网页界面因为超过大小限制而静悄悄的自动罢工. 不过我现在知道他有关PHP的部分并不正确, 也许他想说的是Javascript的代码.
隔了段时间, Yahoo网站服务提示我把这个网站从PHP4升级到PHP5. 这是第二次, 我意识到了PHP就在我身边.
两个月前我知道了一个做电子商务的创业公司, 询问他们用什么语言开发, 结果在答案中又听到了PHP. 当时我很高兴, 觉得自己之前已经听说过两次了, 应该对它不再是一无所知.
由于我已经有了这么多PHP知识, 当PA6488摄像头管理器软件CamMan需要用户管理功能的时候, 我马上开始了在公司网站的PHP开发. 现在用户已经可以注册帐号测试. 由于基于PA6488的摄像头还没有面世, 用户可以先在这个网络日志上测试评论功能. 只有注册用户才能发表评论.
这就是我的第一个PHP程序: 用户和网络日志评论的CRUD(Create创建/Retrieve读取/Update更新/Delete删除).
PHP is the best programming language in the world!

女神: 你能让这个论坛的人都吵起来, 我今晚就跟你走.
程序猿: PHP语言是最好的语言!
论坛炸锅了, 各种吵架.
女神: 服了你了, 我们走吧, 你想干啥都行.
程序猿: 今天不行, 我一定要说服他们, PHP语言是最好的语言.

查询公网IP地址数据

2017年3月9日
因为偶然注意到^SPSIOP和XOP自动校准的数据异乎寻常的多, 让我发现了从去年11月中旬开始, 就有一个网络爬虫从相连的2个IP地址以每秒2次的频率自动爬华宝油气等4个页面, 持续爬了快4个月了. 在惊讶之余, 我的第一反应是每个月9.99美元的跑PHP代码的Yahoo网站服务太值了, 处理如此辛勤的爬虫, 竟然没有让我这种最常用用户感觉到任何性能上的变化, 看来未来即使正常访问量提高100倍都能应付过来. 其实我估值软件每分钟才访问一次新浪股票数据, 所以爬虫每秒都来爬是没有任何意义的, 每分钟来爬一次足够了.
我的第二反应, 是赶快加了一个对单个IP地址访问Palmmicro.com的次数统计. 每当访问次数累计到1000次就强制要求登录一次. 爬虫很快就被暂时挡在了数据之外, 不过这也会在以后给正常访问的常用用户带来一点小麻烦.
同时我很清醒的认识到, 为了克服我设置的这个小障碍, 爬虫要实现自动登录其实是很容易的. 另外即使是目前这种状态, 依旧有每秒2次的访问压在登录页面上, 一样给服务器带来了不必要的额外压力.
十多年前当我在PA1688上做H.323的时候, 曾经费尽心力从https://www.whatismyip.com这种类似网站查询PA1688所在的公网IP地址, 留下了很坎坷的回忆.
而今天在处理完网络爬虫的问题后, 我突然意识到查询公网IP已经成了现成的副产品, 激动之余写了这个IP地址数据的工具.

临时测试用户界面

2017年4月10日
做完IP地址数据这个最简单的单行输入然后把输入显示出来的用户界面后, 发现自己无意中实现了一个副产品. 一直有人用各种参数试探攻击我的网页, 所以我早就想解码这些%3A%2F%2F然后显示出来看看到底是些什么参数, 没想到这个界面调用urldecode后就直接实现了这个临时测试功能.
另外一个我一直想解码显示的是从1970年1月1日开始所有秒数Unix的时间戳, 也顺手加了is_numeric区分后显示出来.

个人常用短语

2017年12月26日
记得2000年刚到硅谷工作, 去电影院的时候总会在正片播放前看到一段让我自我感觉膨胀的广告. 大意是如果你知道一个等号和两个等号的区别, 就可以在我们这里找份工作了! 写PHP还需要知道三个等号跟前两个的区别. 事实上对习惯了C语言的人来说是个坑, 我今天就不幸踩了一个.
在修改用来方便股票交易记录的个人常用短语代码的时候, 我无意中在https://www.php.net/上看到有关strstr的一个信息:
如果你仅仅想确定needle是否存在于haystack中, 请使用速度更快, 耗费内存更少的strpos函数.
我马上如获至宝当即改用了几十个strpos, 却发现有些像if (strpos($str, 'www.'))的代码变得不工作了. 原因是strpos会返回位置0, 这时候要写成if (strpos($str, 'www.') !== false), 才跟原来if (strstr($str, 'www.'))的代码效果一致.
不过这不是我碰到的最深的PHP坑. 最坑人的PHP函数是array_merge, 它在全数字下标的时候居然会把所有数字下标从头开始排序! 这时候要把$ar = array_merge($arA, $arH, $arUS);简单的写成$ar = $arA + $arH + $arUS;

分解质因数

2019年4月12日
昨天是王小波忌日, 让我对自己的胸闷和牙疼症状充满了警惕. 最近整理华宝油气净值的软件代码真有种死去活来的感觉, 经常让我怀疑自己到底在干什么. 今天看到这个图片, 我觉得自己该做点简单的东西恢复一下信心, 就削尖铅笔写了这个分解质因数的工具.
The picture that encouraged me to write this prime nnumber tool.
分解质因数可以用最直接的方式实现, 对指定的数字n, 从2开始一个个反复除到n的平方根为止就行了. 下面用数字68举个具体的例子.

  1. 68的平方根在8和9之间, 我们从2到8都除一遍就可以了. 68/2=34, 68=2*?.
  2. 因为34还是偶数, 继续来除2. 34/2=17, 68=2*2*?.
  3. 17不是3的整数倍数.
  4. 17不是4的整数倍数. 这里可以看到, 虽然原来68是4的整数倍数, 但是我们已经在前面处理过了.
  5. 对数字5来说, 因为5*5已经比17大, 我们不用继续除下去了, 最终结果就是68=2*2*17.

接下来一个最直接的优化想法, 就是先把一定范围内的已知质数算出来, 这样我们在进行上面的计算时, 就不用算17是不是4的整数倍数了. 基于GB2312大数组的教训, 我这次直接把前4972个质数存到了MySQL的表中. 不过结果让我很失望, 查MySQL已知质数表的结果反而要比直接算慢很多倍.
当然还有像Pollard Rho这种效率更高的分解质因数算法, 不过看看这些有关质数的文章: https://taodaling.github.io/blog/2019/04/03/Pollard-Rho-%E5%9B%A0%E5%BC%8F%E5%88%86%E8%A7%A3/
是不是很容易觉得自己是数学白痴?
不过我还是很积极的在php下新建了一个子目录tutorial, 把这个新文件primenumber.php放了进去. 同时开始憧憬万一几年后我真的开始自己做软硬件课件教林近岚编程序的话, 今天这些工作可以做为其中的一节软件课.
做人要是没有梦想, 跟咸鱼有什么两样?

查询雪球关注的人

2019年4月24日
做完分解质因数后自我感觉很好, 所以我很快又给自己找了个新的小目标, 挽起袖子写了个雪球关注工具.
雪球有关注人数2000的上限, 对于一个像我这样乐于相互关注的人来说, 经常会碰到想新关注一个人的时候不知道该取消关注谁的问题. 雪球上可以查看关注的人, 每页显示20个, 查看所有2000个关注需要翻页100次. 我因此写了这个软件来自动做这100次翻页, 从中挑出从来不发言的人, 除我关注外没有其它粉丝的人, 以及跟我一样有接近2000关注的人. 本来我还挑出了没有自选股的人, 不过这个数据不准, 经常点进去用户雪球页面后发现有一堆自选股, 我就放弃了. 从我的Yahoo服务器跨越太平洋访问雪球, 每次要接近2秒时间, 连续100次就会慢的让人不可忍受. 还好我有一直闲置的腾讯云Linux虚拟机, 使用http://111.230.12.222/php/xueqiufriend.php, 大约能在40秒内返回结果, 勉强可用.
其实最应该被挑出来取消关注的是没有相互关注我的人. 在没有账号登录信息的情况下, 这意味着要把我的2000个关注人的全部关注页面都再次读一遍. 当然在时间上这是不现实的, 雪球自己的页面也不会愚蠢到这么做. 事实上, 如果能在Cookie中提供一点登录信息, 雪球就会在数据中提供相互关注的信息了. 跨域名访问Cookie是严重的安全性问题, 因此这几乎不可能自动做. 要用这个工具查没有跟自己雪球账号相互关注的, 只能自己先登录雪球后, 按下图在Chrome浏览器中找到Cookie位置.
Apr 24, 2019. Xueqiu woody1234 page and chrome Cookie entry.
然后点进去在下图中找到xq_a_token对应的值, 肯定不会是现在显示的这个.
Chrome Cookie settings where to find xueqiu.com xq_a_token value.
然后手工把它放在对应的输入框中即可.
Life is like a snowball. The important thing is finding wet snow and a really long hill. — Warren Buffett

用Cramer法则解二元一次方程组

2019年9月5日
过去2个月XOP持续暴跌吸引了大量抄底华宝油气的, 在很短时间内耗光了华宝基金公司的外汇额度. 华宝油气从7月31日起单日单个基金账户累计申购金额上限设置为10万, 8月2日周五限额变成了1万, 8月9日限额变成1000元人民币. 就像超新星爆发给天文学家提供了难得的测距参考一样, 限购给我提供了少有的观察套利者的机会, 所以我每天都在乐此不疲的追踪相关数据.
8月29日华宝油气收盘价0.387, 跟8月28日0.385的净值比溢价0.52%. 很多溢价申购套利老手都不会放弃这个蚂蚁也是肉的赚钱机会.
9月5日华宝油气场内新增72万股, 由于9月2日美股休市暂停申购, 这个数据可以看成是对应8月29日场外申购后转场内的份额. 假如都是在华宝官网0.1折最低费用申购的话, 限购1000块人民币下满额申购了:
720000/(998.5/0.397) = 286场外帐户
再回头看一下9月3日, 华宝油气场内新增695万股. 假如这些新增都来自场内申购的话, 对应8月29日场内限购1000块人民币下满额申购了:
6950000/(985/0.397) = 2801场内账户
之前还有一个机会可以同样看到在同一天场外申购的账户数比场内申购的账户数小一个数量级的情形, 可以跟这个结果交叉验证.
8月13日场内新增7408万股, 假定全部来自于8月6日(溢价1.78%)场外申购转场内和8月8日(溢价2.3%)的场内申购. 假定每户都是用满1万申购额度, 8月8日场内申购的净值为0.402, 场内一折券商实际使用了9850块申购, 每户实际到账2.450万股. 假定场外都是使用华宝官网0.1折, 实际使用申购金额为9998.5, 8月6日申购的净值为0.391, 每户实际到账2.557万股. 用未知数x表示场内申购的账户数, 未知数y表示场外申购转场内的账户数, 假定在我们考虑的最近一段时间这2个账户数都是固定不变的. 由此得出第一个方程:
2.450 * x + 2.557 * y = 7408
8月14日华宝油气场内新增810万股, 本来按上面的逻辑新增应该全部来自于8月7日(溢价1.53%)场外申购转场内和8月9日(折价0.25%)的场内申购. 8月9日是场内申购限购1000的第一天, 不过可惜这天场内交易折价0.25%, 应该同时出现了大量不限金额的赎回. 多了一个无法定量的赎回变量, 导致8月14日的数据无法像上面那列第2个方程.
8月15日场内新增1099万股, 继续按前面的假设列方程. 对应最后一天限购1万的8月8日(溢价2.3%)场外转场内, 和限购1000的8月12日(溢价1.01%)场内申购. 8日申购净值是0.402, 12日申购净值是0.393. 可以列出方程:
(985/0.393/10000) * x + (9998.5/0.402/10000) * y = 1099
保留4位有效数字合并常数后得到第二个方程:
0.2506 * x + 2.487 * y = 1099
使用Cramer法则解二元一次方程组的通用工具, 得到场内申购户数 x = 2864, 场外申购户数 y = 153.
原则上来说按我的假设, 任何2天的数据都可以用来联立一个2元一次方程组, 解出场内申购和场外申购的账户数. 我一定要选择从限购1万到限购1000的变化时2天的数据来估算是出于计算精度的考虑, 为了避免2个大数字相减后得到一个跟误差范围同一数量级的小数字, 让整个结论失去意义.
Cramer's rule calculation steps

And what in heaven's name brought you to Casablanca?
My health. I came to Casablanca for the waters.
The waters? What waters? We're in the desert.
I was misinformed.

一元线性回归工具

2019年9月20日
线性回归计算完华宝油气限额申购下溢价套利的基金申购账户统计后, 顺便把它做成了一个通用工具.
Linear regression calculation steps

本福特定律

2019年11月14日
本福特定律
Benford's Law equation

Pearson卡方检验

2019年11月15日
Pearson卡方检验
Pearson\'s Chi-squared Test equation and curve gif';

本页面评论:

Woody 发表于2019-05-10 17:06:41 222.248.121.177
Woody's test.

Palmmicro 修改于2019-05-10 17:14:57 222.248.121.177
Palmmicro's test

更多选项? 请先登录或者注册. metropolitan-tundra