bookmark_border【突发奇想】关于代码美化,关于大神

记录一个突发奇想。一个有趣但逻辑还不完善的思考方法论。

———-

代码就像人的容貌。
没过脑子优化就直接写出来的代码是素颜照,写好之后反复打磨过的代码是浓妆照。
为了把项目开源,在公开前先狠狠整理一遍代码,就相当于去正式场合之前精心打扮,盛装出场。
在为了验证想法,为了个人使用之类不公开的场合随手写出来的代码,就像回到家里不用上妆的和家人平平淡淡打打闹闹。不求出风头长脸,只求自己舒服。

当一个人上妆后会被人称赞时,说明她知道美的方向,并能够朝使自己更美丽的方向努力了。(比如注意保养?)
当一个人素颜也会被人称赞时,说明她是真的美了。这种美不浮夸(可能不会有完备的文档和注释),但足以服众。

———-

ookami_1024_768

图文无关

 

我在工作中有幸遇到过一位”裸妆也很美”的大神,那是我的程序水平达到”知道自己很强”以来,第一次因为和别人的技术实力差距而感到震撼。
我可以做到模仿他的代码设计和注释厚度,但恐怕不会像他一样在项目等待他快速完成,而他也明知道这段底层代码今后除他以外几乎不可能有人碰的情况下,依然保持了如同开源项目一般高质量的代码结构设计和充足必要的注释。
在做截止日期比较近的任务时,我依然可以坚持给每一个函数和变量一个合理的命名,并尽可能避免同一段代码出现在多个地方,或者过长的函数体等等代码坏味道,除非是历史遗留原因。这些坚持在我看来根本不值一提,也没什么太大价值,但给10年前的我来看的话,这个水平”素颜颜值”也足以被称为”大神”。
“大神”不是一个绝对的评价,它只是说明我们之间有着遥远的距离。现在的我已经成为了10年前的我眼中的”大神”,希望接下来,5年后的我能成为现在的我眼中的”大神”。
但如果只是这样一说,我还是很难具体了解我5年后到底要做到什么程度才算达成目标,所以参考那位震撼了我的大神,再加上一些我个人在技术方向上的追求,列出我对”5年后的我”的期望:

1. 平时习惯性写注释,认真起来能写出商业工程级别的严谨注释。

2. 写1w行左右规模的单一功能模块时,有自己熟悉到伸手就来的框架设计。为此,希望能写至少5个1w行以上规模的模块的经验。

3. 有从头到尾一个人完成简单的网站前后端开发和底线级别商业网站页面排版布局的能力,尤其需要自动化测试、项目收尾和上线运营部分的经验。
不是徒手简单搭起来就行,要的是商业级的完成度。至少包括:
要有开发人员增加以后立刻就能扩充为一个团队开发项目的清晰功能划分。
新人加入时能快速搭建环境的自动化构建,辅以简单的构建指导文档。
后端要能够自动化测试,在代码规模膨胀之后,依然能够依靠便利的回归测试,进行各种影响范围巨大的代码变更。
有成熟的log管理方式。

4. 有至少两个自己主导程序开发的小型游戏项目上线。
不管是 app store / google play, 还是steam, 甚至 comike 都可以。

嗯,说实在的,就算现在有一个人向我展示了上述全部能力,我可能也不会觉得这个人是大神,至少不会被震撼。
震撼这个感觉,还需要一点偶然性。
如果是一个人不经意间流露出高超的程序能力被我察觉到,之后我搜索这个人的履历,自己发现了这个人的各项能力的话,才会更震撼一些。反正是有点主观要素在里面的。
不管怎样,为了尽快成为一个能震撼到2017年的我的人,努力的脚步不能停。而且要加速,更要有计划!

bookmark_border看过了太多会反转的新闻,如今已不敢轻易站队

上海沃尔沃车主扬言要撞死铃木隼摩托驾驶员,之后车主被人肉,被一波波人堵门口大骂。事后公布的行车记录仪却显示铃木隼车主恶意别车,赌气危险驾驶,把沃尔沃别到逆向车道。之后一边倒的舆论回到均衡对峙。

榆林产妇顺产时痛苦难忍,两次请求刨腹产被丈夫和婆婆拒绝后跳楼自杀,医院控诉丈夫一家残忍,舆论暴力强势问候丈夫一家。之后事件细节渐渐增加,包括当时产妇的母亲也在场,并不像是婆婆强迫顺产的戏码。也有人指出院方的可疑之处。此后之前一边倒的舆论回到了双方支持者的均衡对抗。

……

新闻看得多了,总会经历几次大型反转事件。大到被定了罪的冤案反转被判无罪,小到常见的舆论碾压过后发现被真凶利用。

我在过去的人生中几次站错队,每次事后都提醒自己不要过早下定论,即使看上去再理所当然的场景也要忍到双方都提出了足够的证据之后再做判断。

结果在最近的一次产妇跳楼案中,我依然是仅凭一篇新闻报道就持道德大旗愤然选择了阵营。惭愧。

 

大道理扯了这么多,其实都是为了引出我最近最关注的一桩让群众自发选边站的大事件:李雨桐诉薛之谦案!

 

liyutong-xuezhiqian.jpg

 

因为看过知乎的一些粉丝文章,让我对薛之谦塑造的人物形象有一定的好感。所以在事件之初,我在认可李雨桐的陈述的同时,还是很期待薛之谦的反驳的。毕竟真话也可以用来作为欺骗的手段,李小姐的话不可全信。这个时候舆论还算是比较克制,双方各自寻找论据支持己方阵营。

可随着李小姐冷静的抛出越来越多可信度较高的证据,加上她不夹杂过多煽动性言论,就事论事的严肃冷静的态度,观众们渐渐相信李小姐一方才是道义之所在。

在薛之谦几次避重就轻甚至煽动诋毁的回应之后,舆论的势力分布彻底崩盘。

包括我在内,那些想听薛之谦揭露李小姐隐藏在大义之下的私心的吃瓜群众们惊讶的发现,事情似乎真的如李小姐所言,她别无所求,只想倾诉。如果非要说她有什么目的的话,那就是让薛之谦付出代价

李小姐的几次发言都开门见山,不客套少抱怨,拿出来的都是公证一下就能直接提交作证物的干货证据。证据的提出也不是一股脑的抛出来,而是以一定的节奏逐步放出,让观众对事件长期保持兴趣。

比起其他人遇到类似遭遇时怨妇式的控诉,李小姐显然更擅长处理双方论点冲突时的应对之道。在驳倒对方的全部观点后,这场辩论已经渐渐变成了她单方面的演讲。甚至有评论希望李小姐办个语文辅导班,传授辩论(撕B)之道!

 

media-view

有分析指出图中左边的枪只是因透视原因偶然出现在俘虏头部附近。

但因为这张照片的经典性,我还是决定用它来解释用真话说谎的可行性

 

我个人热爱辩论。不是为了证明自己必须正确的抬扛式的辩论,而是我提出我对你论点中有漏洞的地方的反驳性看法,然后希望和你一同验证这两个矛盾观点为何发生冲突,从而将你的观点打磨成更加健壮的形态。

就像我经常会给别人的 pull request 写评语,不是为了批评他们做错了,而是用我的观点去打磨他提出的想法(pull request),最终获得一个更加健壮的系统。

事实上,最终经常会证明我的想法是多虑的 / 考虑不周的 / 逻辑错误的,这让我的观点被推翻了,但使我获得了思考同类问题时的经验,同时验证了对方的观点足以令人信服,如此双赢,何乐而不为?

然而最近一次在公司和中国人同事吃午饭的时候,我又一次抛出我的观点和同事的看法做辩论,却遇到了激烈的反击!

刚开始我们互相寻找对方观点中的漏洞,但渐渐的我不被允许说话,只能单方面的听他重申他的观点。本以为双方按顺序提出看法后自信的看对方如何反驳,没想到却变成了一场争夺话语权,以“你看你都急眼了吧,都开始打断我说话了(笑)。你知道你为什么要跟我争么,这表现出了你永远自以为正确的傲慢(笑)”的方式打压对方发言权的争斗。

我没有及时意识到这已经不是真理越辩越明,而是一场饭桌上的赌气战争。我一直等待对方发言结束好提出我满满的质疑却不可得,试图发声被打压和嘲弄。在这样焦急的忍受不公感受欺辱的过程中,我哭了。

真是连我自己都没有想到!为什么突然鼻子一酸,开始流眼泪了?!还是对方边忍着笑弯的嘴角,边指出“哎你别哭呀!(笑)”,我才发现自己的眼泪已经满出来了。

之后话题已经没法继续,午餐时间也快结束了。其他人不愿继续掺和,微笑退场,留下我和观点提出者两人自己收尾。

 

收尾时,在对这次事件的复盘中,他指出这件事起因在于我不应该在这个场合较真。

工作休息时间,大家聚在一起吃个午餐为的是休息放松。在这样的场合里我随便说一个话题,不是代表这是我经过严谨推理后得出的论点,请各位打磨,而是这是我抛出的一个话头,大家喜欢接可以接,没兴趣可以用一句“是吗!牛B!”带过即可。你在这里抓住这个话头展开分析,让场面变得严肃起来,结果可能给这次午餐的参与者留下不愉快的体验。这种较真应该用在工作之类更严所的场合,在娱乐场合营造轻松娱乐的氛围,会让人更容易接受你,也会为你创造更多人脉。

他在工作上是天才美术,轻松活动中是欢笑制造者,人缘无比好,公认情商高。而我工作上是自傲程序员,业余活动中是沉闷容易较真的话题终结者,人缘基本没有,情商是什么,能吃么?在这种巨大的差距面前,对方抛出的任何观点都可能被我照单全收。这很危险,所以我选择尽可能的记住当时的情况,等冷静下来之后再写出来慢慢思考。也就是说,在写这篇日志的时候,我对这件事还没有得出结论。我也不知道后面我会写些什么。但写成文字帮助分析这件事对我真的有效,所以下面我要开始用文字思考了。

就结果而言,这次辩论的结果显然是负面的,所以进行这场辩论是一个错误。但我最初的辩论是因为我对这个午餐话题有兴趣而进行的一种讨论,也是我参与这个娱乐话题的方式。如果因为是轻松场合就不允许有任何不同看法必须附和的话,那岂不是和跟领导吃饭没两样了。所以我最初接起这个话题的行为是没问题的,问题出在我接起话题到我被对方打压话语权到情绪失控的过程之间。

以他的情商,像这样不惜使用打压话语权的恶性话术和嘲弄的方式进行对话是很少见的,事实上是我第一次见到,没想到就亲身领教了。现在想想,原因可能是这次冲突的原始话题,一个传奇般的艺术工业院校。

他抛出了这个学校的一些传说和成就的话题,并表达了崇拜。我质疑传说的真实性和可行性。辩论到后面他提出你有没有想过我说的这些传说可能根本就不是真的,你的辩论没有意义?我表示我对你提出的这个传奇是否成立本身更有兴趣。即使你说的都是假的,甚至即使这个学校根本不存在我都毫不在意,我现在只想对你塑造的这个模型进行讨论。之后他拿出手机表示要证明这个学校真实存在,我则继续重申学校存在与否这一事实毫无意义,我只是看到那个“传说”的漏洞,想用我的质疑修正那个传说中不实的部分 …

写到这里我好像明白了。可能是因为他很喜欢那家学校,而我对那家学校本身存在的不屑激怒了他。而同时他对我对那个传说合理性的质疑表示不屑,认为我的观点没有意义一事激怒了我。所以之后进行的已经不是辩论,而是争斗。在与人争斗的经验方面,菜鸡如我显然不是他的对手,所以我的情绪崩溃本质上是打架打输了。这样我就明白了,在聚餐时打架显然是不可接受的。那么正确的做法是什么?下次遇到这种情况应该怎么办?

他说的注意休闲场合的空气氛围这一点是我之前没有想到的,它可以作为一个分辨辩论是否应该继续进行的参数指标。当对话进行到让周围的人无法参与,甚至感到不适时,就应该终止辩论,换一个话题了。

不过这样又有一个不可解释的问题,就是他既然可以感知到午餐的气氛不对,以他在制造轻松氛围的经验阅历和高超的情商加持下,为什么他没有去终止辩论,换一个话题呢?不是推卸终止话题一事的责任到他人身上,我现在知道该怎么做了,那以后肯定是以自己主动解决为默认行为倾向的。只是这次我确实还没有意识到这方面的问题,当时他是唯一一个有能力主动化解纷争的人啊。

既然之后复盘时他可以清晰的展示这次事件的内部逻辑给我看,我想他当时一定已经知道局面需要化解,但因为他被激怒了,所以他做出了打架的决定。这时候讨论别人应该怎么做是没有意义的,能控制的只有自己。所以,如果自己能意识到正陷入打架状态,就尽快脱身。那,如果是不能退缩的一场搏斗呢?

因为我和这次事件的当事人是同事,虽然没有交情但肯定也没有仇恨,我们“打起来”是因为上头了。他打败了我但肯定不是为了摧毁我,事实上他之后的复盘是有一定善意也可能是愧疚的(毕竟把我打哭了= =),展示了他一架打完还是朋友的姿态。像这种打架,如果意识到了,我中盘认输是最好的解决方法。但人生中总会遇到“不能退缩的搏斗”,比如老罗和王自如的优酷直播论战。王自如当时的状态和我打架时几乎一模一样,本以为是双方按顺序发言,文明交换意见,结果上来被一顿猛揍,根本甭想好好说话,罗老师就是来打架的,目的是你死我活,要么我摧毁你的事业,要么我的事业被你摧毁。我在国内还是挺常见到这种恶意对打的,虽然程度没有这么惨烈,但看到有人明明自己有理却被别人的语言技巧痛殴,最终被吃瓜群众认定错在自己然后又是一顿舆论迫害时,还是很想强化一下自己在语言打架方面的能力的。不为下次跟同事打起来能痛快反击,只为必要时有能力守住阵地,不让自己蒙受本不应承受的损失。关于如何强化自己战斗力的问题,下次有机会会新写一篇日志来帮助思考的。

 

总结:

1. 参与没有恶意的朋友的活动时,要时刻顾虑活动氛围,不恶化气氛。(不是要自己去附和别人,只是注意在没有被侵犯到自身阵地的情况下,以多数人的感受为优先)

2. 在非严肃场合有观点冲突时,时刻观察自己或对方是否陷入战斗状态。如果有,立刻结束话题。自己主动认错 / 承认对方观点 的方法最为简单,练习让自己说出违心违背事实的话而不自我厌恶(刻意增厚脸皮)。

3. 在对方有恶意,严肃场合,自由搏击的环境中,不要以公平辩论的心态应对,场面胜利和逻辑胜利同样重要。记住自己正在战斗

 

 

bookmark_border行侠仗义,连编译都通不过,那还搞个屁啊!

上一篇提到的“能编译通过这个 aseprite 软件(及格),能在IDE中下断点调试(良好),可能的话希望自己能修改软件的菜单,加入自定义功能(优秀)”。现在看来,我已经及格了(笑)。

附上 aseprite 的官方编译指南

aseprite_v1.2-dev

回过头来看我耗时十几小时的编译之战,真是教科书一般的犯下了几乎所有可以犯下的错误。幸好结果不错,让这些付出也显得有了很高的价值。

时间很晚了,我就不长篇大论了,直接上这次吸取的教训:

编译复杂度达到自己无法掌控的项目时,人家让你用什么版本的工具,你就一定要分毫不差的用那个版本,以免各个工具之间出现兼容性问题。

 

离月末还有些时间,工作上暂时还比较闲(很好!)。那么下一步,就是让这个项目能在IDE中下断点调试了。别看编译通过了,其实都是命令行调用visual studio的编译和链接工具直接生成exe的,至于能不能用IDE顺利编译运行这个程序,还真不好说呢 : )

 

———- 2017/09/20 更新 ———-

八小时前,aseprite 的作者更新了他的编译指南,使用了更新版本的 skia ,现在用 vs2017 也可以编译了。我作为编译指南更新前一天刚踩了一圈雷的无辜群众,可能是这世上最后一个被 aseprite 和 vs2017 的兼容性问题坑了的人吧。

关于为什么更新前不能用 vs2017 编译,我的观察是,之前编译指南推荐的 skia 版本是 m55, 那个版本里的 gyp 代码比较老,对 msvs 的版本只能识别到 2015 。我记得 gyp 对 vs2017 的识别能力是2017年四月份才加入的,m55 最后的更新是 2016 年 10月,当然不能识别 vs 2017。更新后的编译指南推荐使用 skia 的 m62 版本,目前最近更新日期是2017年8月31号,解决了这个问题。

 

bookmark_border写了太久外围,如今我的C++功底宛如一个废人

今天买了steam上的像素绘图软件aseprite,因为我们独立项目的美术素材都是用这个软件生产的。

因为我之前看过这个软件可以导出帧动画的json信息,所以希望它也能导出单幅图的图层信息,主要是各个图层的位置信息,以及使用的图在spritesheet上的位置。结果买来一用发现人家并不提供导出这些信息。

怎么办?我还指望靠这个能把美术做的大场景图自动导入unity呢!人少的小项目,各种自动化对项目推进速度影响很大的呀。于是我先看了看这个软件的文件格式,心想万一人家特别亲切,保存文件内是json呢?结果人家用的理所当然是2进制。慢慢扒这个文件格式对我们这种小项目来说投入产出肯定是巨亏无比,遂放弃。

第二步,我在asset store上搜了搜,看有没有人和我有同样的需求,而且已经写出了插件。结果还是没有,只有一个导出为动画的付费插件。唉,小众软件,不能期待过高。

最后我上github随便搜了搜,希望有人分析过这个软件的存档格式,最好是已经封装好的库或者软件。结果还是没有(想啥美事儿呢?)。。。但是,等等?!

aseprite-in-github

虽然没找到辅助程序,但是我找到本尊的源代码了啊!一个我花了1480日元买的软件竟然是开源的!

其实比起亏钱了,我更觉得是我赚到了。我可以深入了解甚至改造我们项目所使用的美术工具了,这是何等的牛B!

事不宜迟,赶紧找保存文件的格式吧。结果我在保存文件的逻辑中迷失了自我,原文件中的一切对我来说有如小天书一般,我甚至没信心只靠静态分析来找到关于保存文件内部格式的逻辑了。可下断点调试需要先搭建编译环境,看着我从来没用过的cmake,一时也是不知从何下手。那一瞬间,我感觉到自己离开C++阵营太久了。

其实cmake也不是最近几年才出现的新东西,把这份茫然归罪于太久没碰C++也是不妥。可能是,我在井里待太久,误以为自己C++已经十分了得,其实只是略懂编译链接运行,对C++11有了解,会写点有设计模式的业务逻辑的小爬虫而已。我以前总觉得底层这些都领悟到了,什么工具呀库啊框架之类的也就信手拈来了,然而见到人家用自己的框架写的代码逻辑时发现并拈不来呀并拈不来。

今年是我正式开始重视现有框架和库的一年,我恶补了一圈现役主流的网站前端后端和app开发常用框架和编程库,感觉受益颇多。接下来如果时间允许的话,我希望到这个月末为止,能补充一下C++方面的知识,至少做到能编译通过这个 aseprite 软件(及格),能在IDE中下断点调试(良好),可能的话希望自己能修改软件的菜单,加入自定义功能(优秀)。

bookmark_border读书笔记-《我的英雄学院》

经公司的天才美术推荐,这周末把《我的英雄学院》的动画补完(追到最新一集)了。之后改追漫画,发现动画现在连漫画的一半都还没画到,不错不错,存量这么充足,够我消化一个礼拜了,哈哈。

另外,很久没看新漫画,到现在才知道海外看热门漫画已经如此困难了。

我虽然国内有一台阿里云服务器,但上次搞坏了vpn服务器的配置,导致我现在没有很方便的方法翻墙回国内。平时因为有unblock youku这个大神器,我几乎没有翻墙回国的需求,所以修复vpn服务器总是提不起兴趣。这次也是,找到一个小漫画网站能凑合着看漫画了,就懒的弄阿里云了。

 

评论一下这部漫画,如果到贪婪之岛结束为止的《猎人》是5星,《一拳超人》是4.5星的话,这部漫画大概是3.5星的样子。

虽然有点对不住推荐这部漫画的天才美术(按他的说法这是部媲美《猎人》的神作),但至少这部作品我不会看第二遍,而《猎人》是让我重看了六七遍,《一拳超人》是让我重看了两三遍的作品,它们就是有那种“虽然知道每一处剧情,但还是愿意再看一遍”的独特魅力。《我的英雄学院》能让我一天追36集动画,外加等会儿可能会继续看一晚上的漫画,已经是一部很吸引人的好作品了。但这是一种“好想快点知道后面的剧情!”的新鲜感,就像很多游戏大作,我通一遍剧情之后就不会再碰了,但我依然认为它们是好作品。

当然我对“有重看价值”的评定是很独断专横的,和大众价值观恐怕有很大出入。一个明显的例子是,我玩《口袋妖怪》(《精灵宝可梦》)也只会通一遍剧情,之后就愉快的拿着卡去商店换别的卡玩了,而主流观点似乎更倾向于通关后继续刷精灵更有趣= =

bookmark_border微博宣布不交出手机号就别想发声,那我正好回来躲躲

本来觉得太短的感想不适合博客,想发微博的,但突然要我手机号实在是让人不爽。到我心情平复到能忍辱交出私人联系方式为止,短文章还是暂时发博客好了。
气死我了!不让人说话还行?

-- 本来想发微博的感慨 --

withings被nokia收购之后网站和app的图表界面就变得可用性超级差!本以为忍忍就习惯了,结果越用越窝火!真不知道该喷nokia health的产品经理无能还是设计师是废物,好端端一个withings品牌活生生被你做成垃圾。如果nokia这套界面还没有任何改进,等产品更新换代时我不会再考虑任何withings和nokia品牌的商品了!

bookmark_border之前的人生路太顺利,碰壁一次也挺好的

具体碰的什么壁我只会在私聊里说,这里主要是记录一下这件事对我的影响。

现在我写程序的心态很功利了,感觉没有前途容易被淘汰的知识就不想碰。后来甚至有点成了不想做作品时的万能借口。毕竟不会被淘汰的多是超级底层的知识,而用底层知识是很难做出作品的。

我以前读过一个故事,讲的好像是一个程序课,老师让学生们自己做一个喜欢的动画效果。
作者本身程序写的不错,就用算法写了一些简单的图形的规则运动动画交了上去。
作品发表的时候,作者看到一个程序完全写不来的同学做了一个超级酷炫的动画,骷髅眼窝中滴出血泪,落在地上溅起血花。
他当时完全被震撼了!怎么做到的?!
事后他去看了那位同学的代码,里面是无数的颜色数组。原来是那位同学用像素数组把动画一帧一帧画出来的。
那位同学没有可以方便他开发动画的技术,但有一颗无论如何也要把这个酷炫动画做出来的决心。

bookmark_border太久没写日志了,写点记录

记录一下最近的工作收获

1. 去年用chrome devtool extension给公司的页游做了一个辅助开发工具,结果一年来除了我都没人用= =。直到最近被engineer leader重新挖了出来,组内推广了一波,用的人多了一些,给发了个月度最佳工程师提名奖励(没入选T_T),感觉很棒。
其实这东西本身超级方便我调试bug(我在组内主要任务就是追踪各种难以解决的bug),所以我一个人用我也挺满足的。但有别人也开始用我做的东西而且非常满意,这种感觉还是挺爽的,漫画家收到鼓励的读者来信时大概也就是这种心情了吧。

2. 我开发了大半年的一个 ios / android 照相机应用核心库上个月实际投入使用了。首次上线应用的晚上我负责去公司参与值守。虽然这种事主要是靠服务器端,我客户端开发在场也没法当场修补程序,但当晚还是有一些收获的。因为这个功能是在动画播放的时候让用户用app开摄像头拍摄动画,然后app判断你现在是不是在看动画首播直播,是的话就发个奖品,所以动画开始时twitter上有爆发式的关于本功能的留言。负责算法设计的顾问在里面挑了几个称赞我们黑科技的留言,我看了有点感动。这也是一种类似于收到读者来信时的心情吧。
从第一个hello world到现在,我写程序已经10多年了,但至今为止都是在享受一个人解题的乐趣。在第一家游戏公司,因为做的游戏比较小众,我自己也不玩,所以没有在意过玩家反馈。在现在这家公司,总算参与到了日本顶级手游项目,但这次是因为我一直在做的是偏底层的开发和疑难bug追踪,没做过什么大部分玩家能感受到我的存在的工作,所以也没有什么我的作品有读者(用户)的感觉。因为底层代码和bug追踪本身都是对我来说比较有趣的工作,所以我一度以为我是不在乎用户鼓励的冷面工程师。但经历过最近的几件事以后,我还是不得不承认,有人在使用、在期待着我的程序的感觉,真的很美好,令人沉迷。

3. 亲人离开研究机构独立创业,期间我除了帮忙写程序老本行以外,还有申请域名邮箱、关联主机、做简单的首页,上周又帮忙给他们买来放在家里的服务器设计内网拓扑结构(其实就是把这台服务器和家里自用的局域网分割开来,防止主机被黑导致家庭局域网沦陷),开机启动sshd,开端口,创建账号给合作创业者使用等等。虽然都是简单的基础设置,但对不懂这些的家人来说真的是帮助非常大。

4. 为了确认编译好的release版apk内的各种api网址用的是production而不是develop环境的,领导让我反编译了自家的apk看看里面。我说每次出新版apk都要找gui工具手动反编译apk然后搜索这些网址字符串是否存在,这种重复工作咱们还是写个脚本自动化吧(潜台词是不要让我们enginner做这种无聊的重复性体力劳动),于是我花了两天读了一下 zip 格式android 的 dex 文件的格式以后,用nodejs的zlib解压apk,找出classes.dex,再解析classes.dex ,找出所有的字符串,最后在这些字符串中查看给定的 production 环境的 api 的 url 字符串是否存在。要自己用 zlib 解压 apk的原因是如果想使用其他开源的解压zip的库的话要向上层层申请,非常麻烦,最后跟领导合计一下反正也就1天的工作量,干脆都自己实现好了。
这个工作中我最满意的是自己用第一手资料解决了问题。之前自己读HTTP的rfc徒手写 http proxy server 时也是,读文档能力是最重要的。不过当时我看的rfc是别人翻译的中文版… 毕竟原版300多页英文,考虑到开发效率,还是偷懒看中文了 =w=