月记201906
Okay, today is my gap day.
我现在越来越觉得每个月忙碌之后,必须给自己一个整理思考的时间。通常这天不能是周末或放假,因为我会忍不住跑去玩~~哈哈哈。只有被迫在公司的时候,才想忙里偷闲去做这些事。所以我一直蛮担心自己“如果真的时间自由后,会不会懒成废物”。
这一点之后要进行测试。
距离上一次整理之后半个月,不过这段时间倒确实非常的忙。
分布式爬虫框架
用了一个月的时间,用golang做了一个分布式爬虫框架,过程中还是学到挺多的。
资源整合
我最终发布的只有一个exe,so文件,但既可以打开为网页,也能打开为command命令行,还可以直接打开为WindowsGui。简直太神奇,我之前以为只有C#能做得到的说……
rsrc 可以很便利的进行Windows简易UI界面开发,虽然不强大,但是做做简单工具勉强可以一用。
bindata-assetfs 可以很方便的进行资源打包,例如我将一个网页(包括js,css,html)全部自动打包成一个go的二进制文件,直接在golang里调用,简直不要太爽。
跨平台爽爆的Go
秒秒支持windows,linux,darwin(MacOS),完全不需要跨平台编译。当然,平台特性的代码进行开发调试的话,还是需要在对应平台去做。
你可能不容易理解,像我这种没有MacOS开发经验的人,开发出来的东西在苹果机上直接运行成功时有多激动。
- golang能做到这一点的原理是,它编译打包后生成的exe文件中,一部分是我们的代码,一部分是它在对应平台的的runtime的代码。你可以理解为它生成的可执行文件中,自带了一个JVM。话说真是太牛了,java的JVM简直大的离谱,golang就这么简单解决了。
WebSocket
我之前多年都是游戏开发,即使中间做页游的时间,C/S连接使用的也是TCP长连接。
以至于后来我们游戏接腾讯平台API的时候,我栽了一个大跟头,很简单的https请求,我硬是用curl库慢慢的自己封装了个,记得没错的话,花费了一个月做了出来。然后,另外一个部门的哥们用了两天……我当时都快惊呆了。(没错,当时我对http/https简直到了一无所知的地步,虽然我可以对iocp, epull侃侃而谈)
所以,ws这种TCP长连接封装的东西简直太对我这种人的胃口了好吗?我简直快爱死它了,再也不用因为不知道403,404的区别而被PHP程序员歧视了=.=
话说,ws开发强烈推荐 websocketd ,非常方便非常舒服。
接口编程
这个项目因为我在不停的考虑其扩展性,所以沉迷于接口编程。
但golang其实并不是很好的面向对象的编程方式,所以我原本按照C++的方式设计的接口被迫进行了大幅度的调整,而且很多管理器被迫设置为了全局变量,这点令我很是不爽。
但是相对统一的接口编程风格,还是蛮不错的,我之后会更多这样开发。
又爱又恨的init
go语法规定 init() 函数会在程序main入口启动之前就调用。这样有一个好处:
- 假如我定义了一个接口类interface,一个全局管理mgr函数。那么写实现类son.go的时候,只需要在son.go的init()中,添加这么一行 mgr[“son”] = &son{…} ,直接就实现了一个新的继承类,对原代码丝毫无污染。做功能组合或者创建新对象的时候,简直很不要太方便。
但是,实际开发的时候特别讨厌的是:
- go的init()函数顺序太恶劣,它的顺序是按照文件名来处理的……假设A.go,B.go都有init(),A的init()依赖了B.go的功能,此时很可能B还没有正确init(),导致功能不完善。而这种问题很难处理,你总不能以为这个init顺序就去改文件名吧。而且也非常难调试。相当尴尬。
牛X的动态go加载
刚说的init()函数,仔细想想貌似没什么大用。为什么呢?
假设有人写了interface.go, SonA.go, SonB.go,你想自己扩展写个SonC.go,这是没问题的,因为init()机制,你新增加的这个子类,完全不会污染原本的任何一行代码。
但问题是你还是需要重新编译,代码只是相对规范了一点,并不能有太大意义。
如果新增加的SonC.go并不需要重新编译,可以像脚本一样动态更新,动态调用呢?
很完美对吧?但是似乎不可能。
编译型语言的编译特性决定了这一点,你听说过Java,C++编译后的可执行文件调用java,C++ 文件的吗?当然没有。
但是Go可以!
goloader 这东西很有点意思。它实现了一个类似链接器的功能。
刚才我们说了,go编译链接后发布的可执行程序是两部分组成,一部分是我们自己的代码地址,一个是go的runtime的代码,而这个东西就是动态加载代码再进行重链接的。
和脚本语言相比,它的特点是你的加载代码和原生编译链接代码是完全相同的,所以无法卸载。但GC,性能调试等都和原生代码完全一致。但它的缺点也很明显,使用的是Go自身的链接器,意味着只要Go版本更变,这个就一定需要修改代码。
源代码
源代码在 这里
其他
游戏
最近狠狠的沉迷了一段自走棋,这种策略类游戏我还是相当有天赋的,玩了87局,花费了40多小时,吃鸡率达68%,前三概率86%。
唯一不适应是当得罪发牌员导致长期2缺1的时候,舍不得弃牌更换阵型,临场反应能力还是不够,我果然还是擅长规划而不是战略更变。
不过,因此也在google play上使劲晃了一圈,感觉相当不错,国内现在游戏品质也上来了,特别是美术效果和优化方面,只是策划那个领域还是和前几年一样,依然是持续走偏了。
我想想也没办法,这是一个急功近利的环境,为了急功近利的目标,带着一票子急功近利的人做急功近利的事,倒也无奈。
只是,连国外游戏都被中国游戏整服了,各种圈钱游戏占领市场,令人非常扼腕叹息。快速圈钱->疯狂打广告->占领市场->更大规模圈钱-> …. -> 直到新爆款或者自己死,这也是游戏所在的生活娱乐圈必然的命运,没办法。清教徒都不做游戏的。
我现在都有点怀疑自己适合不适合做游戏了,这条路长期的发展和我的理念显然是异常相悖的。
嘛,现在这个问题先放放吧,之后需要整理一下。
生活
上个月基本都是很认真的工作,周末去潜了潜水,其他哪儿都没去。想旅游的心痒痒的,但是工签在办理过程中……(菲律宾的办四个月了!!!)菲律宾和新加坡的工签办理速度果然不是一个级别的……
因为办理工签状态下没有护照,无法出境,所以乖乖蹲着没能出去。
下一站想去寒带待会儿,这边呆久了人都热透了。附带PS一句,我已经三年没回国了.
现在小孩在身边,感觉挺幸福的,有个可爱的老婆,有个可爱的儿子,幸福的代价就是没有办法再唱“原谅我这一生不羁放荡爱自由”了,业余的时间变得少的可怜,很难自我提高。
所以,这个该死的问题也要先放放,现在只能求学习的持久力而不能求爆发力了。
这就是中年男人的悲哀么……
其他
自从我调到系统组后,大数据组原本9个人,离职成了2人,简直是血崩。当然,这事儿和我没什么关系,在大数据组我一直是游走在边缘的学习者。我说起这事儿,只是越发觉得自己的政治嗅觉很敏锐……好吧,虽然并改变不了什么。
其他组的情况是,Damon离职了,Bond离职了,Sigmund离职了,总之,基本上谈得来的熟人都没活口了。
我也准备跑的来着,公司加了点股票,加上现在做的渗透还是有点意思的,先待一俩月看看。
俩月后要么去找小D,要么看看3D页游那家公司,税后月薪10+W的收入还是值得考虑一下的。
之前的爬虫已经做完了,现在开始做PoC,Exp和APT,这才算是真正走入这个圈子的第一步,不知道这道门后到底是什么样子的,是否能吸引到我呢?令人有点小激动呢~
仔细看了看recter的github,看来也在学新鲜的东西,最近follow的一些人,都是超级全能,想想自己还差的蛮远的。不过还好,最近两三年,最大的优势就是视野打宽了。之前用了十年,语言只会c++,lua, 现在C#,GO,JS都有中大项目了,也从纯游戏开发各种转型,网站后端开发,大数据开发和现在的黑客黑帽SEO方面,某种意义来说,也挺好。
我还是忍不住的想弄一下TypeScript, Rust。我也要想想办法,要不要给自己开一个side project呢?