423世界读书日

今天是世界读书日,每年只有到这个时候,我可能才知道是世界读书日,毕竟我是一个有时候连自己生日都记不到的人。
说起读书,我曾经一直有一个误解,就是曾国藩说的读书不二,所以很长一段时间,我看书就看一本,看不进也死命看,最后实在看不下去了,就放弃了,就再也不看了。现在不会这样了,在读到《我不是教你诈》、《平凡的世界》、《精进》、《三体》、《薛兆丰经济学讲义》、《薄世宁医学通识》这类书的时候,我才发现,读书最重要的是,这本书与当时你是契合的。只有这样你读这本书的时候才能身心愉悦,收获满满。否则每一分钟可能都是痛苦的,会有收获,但不大。有可能过一个阶段,随着经历的事情更多,心境也会不一样,再来读这本书,可能就会释然了。所以后来我读书,如果看不进,我就换一本。当然也不能所有的书都这样,比如《数据结构》、《算法导论》、《曼昆经济学原理》,这类书就是要花力气去啃的。

还是看小说轻松,说起小说,我想说下最近在听的一本小说《赘婿》,我的小说史算算也有15、16年了,初中时候开始看小说,记得当时还是徐云飞同学带我看的一本网游小说,记不到名字,唯一记得最早开始看的小说是《缥缈之旅》,说起来可能一些00后都不知道这本书,十几年前网络小说不像现在这么多,我那时候看的也是纸质的。这本书的意义在于,它开创了修真界的等级划分,筑基期、金丹期、辟谷期、元婴期、大乘期等,以及现在大家经常挂在嘴边的「何方道友在此渡劫」中的「渡劫期」,以至于后来很多修真小说,都是以缥缈之旅划分的等级作为共识来描述实力的。包括很多后来小说里面出现的比如玉瞳简,储物戒指,丹药,飞剑,法宝,散仙,飞升等,都是出自《缥缈之旅》。知乎上有个网友说得好「世界上本来没有修真小说,萧潜写了《缥缈之旅》,世界上才有了修真小说」。
然而最近觉得这类玄幻类的小说都是爽文,主角光环不死。现在更喜欢看有一点“现实”意义的小说,这个现实意义不是说我们身边,而是指以人物的刻画、心理活动的描述、各方利益瓜葛等事情来讲述一个故事,比如《平凡的世界》、《侯卫东官场笔记》、《大宋的智慧》、《三体》之类。这类小说与玄幻小说的区别是,玄幻小说是没有边界的,比如《遮天》,本以为从大能到了王者,就已经是顶峰了,哪知道后面还有半圣、圣人、圣人王、大圣,到了大圣觉得应该到顶了,哪知道后来出了大帝,大帝后面还有个啥红尘仙。看到最后简直是圣人多如狗,大帝满地走,你不知道边界在哪里。而现实一点的小说,脱离不开社会群体这个大框架,任何事情都是有迹可循的,从各个角色角度都能说得通的。比如《三体》里面的执剑人、黑暗森林。

最近在喜马拉雅听的愤怒的香蕉写的《赘婿》,简直已经是我心目中写的最好的一本小说。这本小说描述了大量主角以外的故事,通过各个角色心理活动、所见所想把每一个角色的形象都刻画的淋漓尽致,仿佛在眼前就是一个有血有肉的人。作为普通人的主角宁毅,是一个手无缚鸡之力的书生,从一开始在小城市内将在生意场打败竞争对手,到被梁山好汉抄了家,只身上梁山,用计谋覆灭整个梁山,到最后女真人南侵,在京城外坚壁清野。然后弑君,建立黑旗军与女真人作斗争。

这里写的不好,没有承上启下

比如林冲,我觉得他是一个非常典型的汉人,逆来顺受,从来不会反抗。从老婆林娘子被高衙内欺辱,林冲被发配,到雪夜上梁山,梁山覆灭后,他就随波逐流,几乎没有一件事是他反抗过。林冲的师傅铁臂膀周侗说林冲心中没有一把刀。引用一下原文,写得真的很好在好的世道上,文人心里有一把尺,用之丈量世事人心,厘定规矩,而武人心里,要有一把刀,这刀太利了不行,但是没有也不行,当那些规矩老了,不合用了,世道走岔了,武人要用刀把它斩断,如此方有新的规矩出来。一直到他的几任老婆,都在这个世道巨大的碾轮下被人杀死,他也心灰意冷,也可能是这时候才幡然醒悟,做了一件大事 ,把武朝与女真之间的间谍名单护送到中原。

九纹龙史进也是如此,他比林冲更早醒悟。在梁山覆灭后,他重入江湖,正好遇到天下第一高手铁臂膀周侗去刺杀女真大将完颜宗望,一众江湖人士也跟随一起,周侗念在史进与林冲是兄弟,带着史进打了一套伏魔棍。然后周侗当然在刺杀过程中阵亡,史进也九死一生活了下来,在周侗前辈的影响下,史进下半辈子投入了与女真人抗衡的斗争之中。

比如晋王田实,出生草根,一家都是猎户,他本来就是芸芸众生中一个普通得不能在普通的过客,在乱世之中叔伯田虎成了虎王,他也在这时候见识到了主角宁毅的风采,立志要做一番像他一样的事业,就是一个渴望被认可的热血少年。但是他干不过叔伯田虎,知道虎王被废,他成为晋王后,决定不惜一切代价,抗击女真,甚至赌上性命,为了就是得到世人的认可,成为一个跟宁毅一样能做一番大事的人,事实是他注定是打不过女真人,他也知道自己这条路很可能走不通,他只是不想这样庸庸碌碌过一生,想要让后人记住他的名字。一直到死,他也不知道自己是否找到了答案。这个答案在读者心中。

田实的遗憾跟林冲的遗憾不一样,田实的遗憾是他清楚的知道自己要什么,并为之努力过,奈何能力不足。而林冲是他没有追求过自己想要的东西,没有与不公抗争过。

Git常用命令

项目中SVN用的比较多,最近用Git也只是一直停留在commit,push。记录一下用过的命令。

回滚整个版本库到指定版本

#先查看指定版本的版本号
git log
git reset --hard commit-id
git reset --hard 82bb80c9ea80b35377ac018f86dfc220670e9699

回滚部分文件到指定版本

git checkout commit-id  files
git checkout 82bb80c9ea80b35377ac018f86dfc220670e9699 app/Http/Controllers/Controller.php

解决冲突

最烦人的事情就是冲突了

git status #查看冲突文件
git mergetool #通过合并工具来查看冲突内容
git commit -a #合并完成以后,提交全部内容,保存退出
git push


image-20200408152238192

查看某个版本改变的内容

git show commit-id

下面显示的是本次修改的部分。

查看当前分支

git branch

查看所有分支

git branch -a

切换分支

git checkout 分支名称

合并分支

先切换到需要合并的分支git checkout master,例如主分支master,然后执行git merge dev

[root@VM_0_3_centos]git checkout master

M   storage/framework/sessions/M2bI0IwKicSqIu9685MlhlQx7yK0VTU6ut5wYL2M

切换到分支 'master'

[root@VM_0_3_centos]# git merge dev

更新 d5bd4d4..d4e81ca

Fast-forward

 readme.md | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------

 1 file changed, 107 insertions(+), 36 deletions(-)


放弃本地修改

# 下载远程仓库最新内容,不做合并,相当于强制覆盖本地
git fetch --all  
# 指令把 HEAD 指向 master 最新版本
git reset --hard origin/master

Nginx+Lua进行访问控制

背景

前阵子帮朋友做了个服务端,用来给他APP做一些基本的注册、付费等功能。但是他APP被盗版了,话说这盗版也是厉害,有时候注册量远远高于正版注册量,昨天盗版一天注册6000人,正版才2000人。于是乎服务器扛不住了,注册接口超时,客户端自动发起重连,又超时,又重连,如此往复,最后正常用户都没法访问了。

处理方案

要保证现有客户的能正常使用,还要限制盗版,那必须得知道盗版跟正版有啥区别了,检查过后,发现盗版应用在接口中有一个参数跟正版不一致。那当然得从参数上做限制。
两个方案:

  1. PHP接收到数据后,判断然后剔除。
  2. 使用Lua在Nginx层直接剔除

不用看,当然能在Web服务剔除最好了。为啥呢?如果在应用层提出,一样会进入PHPFPM消耗资源。

具体实施

安装Lua过程不表,可以参考https://segmentfault.com/a/1190000018641801

lua_need_request_body on;
location ~ \.php {
    access_by_lua '
        local uri = ngx.var.request_uri
        if string.find(uri,"/api/register") ~= nil then
            local body = ngx.req.get_body_data()    
            if string.find(body,"20200101") or string.find(body,"20200102") or string.find(body,"9.9.9") or string.find(body,"8.8.8") then
                ngx.exit(ngx.HTTP_NOT_FOUND)
            end
        end
    ';
    # 接着往下继续执行php,正常请求
}

这里提一个点access_by_lua用来进行访问控制,之前一直用content_by_lua_block,匹配成功以后,就不会继续执行php了。一定要用access_by_lua

网上是这么说的

access_by_lua 在请求访问阶段处理,用于访问控制,适用于 http、server、location、location if

content_by_lua 是内容处理器,接受请求并输出响应,适用于 location、location if

https://github.com/openresty/lua-nginx-module


2020年04月08日简单优化一下。随着盗版越来越多,盗版的关键字丢数组里

lua_need_request_body on;
location / {  
  access_by_lua '
    local uri = ngx.var.request_uri
    if string.find(uri,"/api/register") ~= nil then
        local body = ngx.req.get_body_data()
        local denyList = {"20200101","20200102","9.9.9","8.8.8"}
        for i = 1,#denyList do
            if string.find(body,denyList[i]) then
                ngx.header.content_type = "application/json";
                ngx.say(\'{"toast":"您正在使用盗版软件"}\');       
                ngx.exit(ngx.HTTP_OK);
            end
        end
    end
';
}  

细心的朋友会发现,上面的for循环中,i是从1开始的,没毛病,在很多语言中长度是从0开始,但是在lua里面,长度居然是从1开始。


2020年04月10日在优化一波,将所有处理失败的请求全部记录下来

在处理这个功能的时候,发现一个神奇的bug

在lua中,比如匹配8.8.8里面的居然会匹配成任意字符,也就是说,8d8c8也会被匹配成功,导致有一部分用户被误判。需要用%p来表示

将错误信息,写入文件中。

file = io.open("/tmp/lua.txt", "a")
io.output(file)
io.write(date)
io.write(body)
io.close(file)

以下是将lua脚本单独放在一个文件中的完整代码

lua_need_request_body on;
access_by_lua_file /usr/local/nginx/conf/lua.lua
local uri = ngx.var.request_uri
    if string.find(uri,"/api/register") ~= nil then
        local body = ngx.req.get_body_data()
        local denyList = {"20200101","20200102","9%p9%p9"}
        for i = 1,#denyList do
            if string.find(body,denyList[i]) ~= nil then
            local time = os.date("%Y-%m-%d %H:%M:%S")
                    local date = os.date("%Y-%m-%d")
                    local fileName = "/tmp/lua"..date..".txt"
            file = io.open(fileName, "a")
          io.output(file)
          io.write(time)
          io.write(body)
          io.write("\n")
          io.close(file)
                    ngx.header.content_type = "application/json";
          ngx.say(\'{"toast":"您正在使用盗版软件"}\');       
          ngx.exit(ngx.HTTP_OK);
            end
        end
    end

在努力的人就不丢人

罗老师昨天直播了,三个小时,抖音官方说卖了1.1个亿。人生中第一次守着看网红直播一血就奉献给了罗老师。网上有很多人在吹罗老师堕落了,我觉得并不是,不管罗老师欠了多少钱,只要他现在是在努力奋斗,在做实事,就是好的。更何况罗老师欠钱也不是花天酒地啊,都是用在锤子上。

罗老师能卖这么多,归根结底还是他这些年来沉淀下来的力量积攒在这一天爆发,他下一次直播一定不会是这样的数据。我们一个普通人去直播,也一定没有他的千万分之一的数据,原因就是没有影响力嘛。微博上看到很多人说也要去直播啥啥的。都是只见贼偷金,不见贼挨打。每一项成绩背后都有无数的努力啊。罗老师作为第一代网红,积攒的粉丝几百万,知道他的人几千万

欠钱丢不丢人得看是怎么欠的。别人给借钱给你,投资也好,借贷也好,可以说都是信任,最少是信任你的还款能力,可如果把这份信任用来花天酒地,做一些见不得光的勾当,不管最后换没换去,在我看来都不光彩。

前天我现在在的这家公司,所谓的董事长给我们开会,说建行有一笔1-10亿的授信可以给到我们的客户,但是需要我们提供客户的资金流水。董事长开心的说这个事情一旦谈成,客户一定就会来刷单,刷单我们抽点的基数就大了。听完我就觉得很反感,我挺不喜欢这种行为的。这点我觉得我跟我老婆的观点是挺像的,我们都非常不喜欢哪些作恶的人。「恶」不仅仅是说杀人放火,实际上有很多恶就在身边发生,可我们却习以为常。比如抖音上那些打着老农手工面条,实际上却是极其批量生产的三无产品。比如某搜索引擎现在还有一些特殊的推广账号,用来推广黑五类产品。比如那些搬运来搬运去的自媒体搬运工。他们都是在作恶。当然,存在即合理,就好像有人为此买单,说明市场需求存在,你不做总有人做。但我想说的是,我们自己内心要有正念,要有一些坚守。什么能做,什么不能做,自己有一杆秤。

给自己打个气

八月了,今年一整年都不是很顺利,无论是工作还是生活,最近一直都状态也不是很好。一切都是有因果的,今天的一切都是昨天的造成的,所以我也在想这些年以来,我有没有哪一步是走错了,才导致今天这样的结果。想了一下,我觉得有两点

没有认识到工作的天花板

说白了就是年少不想事。从我大学毕业的时候,三叔就一直劝我叫我做生意,不要上班打工。而我一直喜欢写代码,一直都在老老实实写代码,从来没想过未来怎么办,那时候也觉得未来很远,还有这么长时间,够我挥霍。到现在年近三十,结婚即将生子,已经没有再挥霍的资本,才发现一切都已经晚了。
那么工作的天花板在哪里呢?其实就是收入,大部分人工作就是普普通通的一份工作而已,我们不去讨论那些大企业总裁级别的,岗位收入的天花板一直都会在那里,当你走到一定高度的时候,就是需要走出来,离开这个岗位,才可能达到另一个层次。就好像在南昌,程序员一万多的工资已经差不多到天花板了。而随着年龄的增长,需要花钱的地方也越来越多,一万的收入已经完全不足以支撑日常开支。

没有在一件事上坚持做下去

是的,没有任何一件事情,我虽然这两年尝试了很多事,但是没有任何一件事情,是花了80%的力气去做的,顶多当时做kindle推送、Youtube搬运的时候花了一点心思,那是能看到实实在在的钱嘛。而我没有在其他任何一件事情上,付出同样的力气,总是在做一些以为随便花点力气就能有不错回报的尝试,却从来不够深入。

人生总是起起伏伏,也会有不同的阶段,我一直记得当年在沃尔玛的时候,当时店总东哥说过一句话,销售不好的是就做标准。现在看这句话,就是在劝我们,脚踏实地,稳扎稳打。越是在低谷的时候,越是需要打起精神,不要让自己走错一步。人生啊,坚持做对的事情,哪怕只是一个很小的选择,坚持下去,一定会让一切走入正轨。