盗賊の極意

Feed Rss

malware

今天上班,刚打开fiddler就在自己的http log里发现了一条发自chrome扩展程序的可疑request。

打开这个扩展的chrome web store页面发现已经被下架。
网上搜了一圈发现有人有同样疑问,虽然没有完全解开谜团,但基本可以确定是可疑程序了。
打开扩展的js代码看了一下,全部重度混淆,果然是做贼心虚。
最可气的是他的代码中竟然包含 function(data){eval(data);} 这样的执行任意代码的后门,我操!

插件名: "Classic Scrollbar Buttons"
这是一个让chrome重新使用老式右侧滚动条外貌的常驻扩展。我已经用了很多年,竟然直到今天才发现带后门,真是……无语。
暂时先把它发出的request信息原样保存好,插件暂时禁用,等我有空了再回来收拾你。

mariokart8

时隔大约半个decade,终于又一次听到了D-Horse同学的声音。喜闻君亦入行IT,感慨良多。

连打6个小时的电话怕是我个人生涯的最高纪录了,话题竟然够讲这么久,我自己都觉得有点不可思议。

跟你倾诉我社交生活太少感觉寂寞之类凡人的苦恼,现在想想自己都觉得不好意思。这种事还是应该自己内部消化才比较成熟。不过谁让我们就是从幼稚时就相识的呢,这点任性,想你应该可以体谅:)

两个人联机马车确实是不如一大群人一起玩有意思,不愧是party game。下次看看有没有什么暗黑2那样两个人可以一起闯关,平时也能自己推进的游戏吧。明年王者荣耀如果评价不错,可以考虑联机一手,如果账号可以跨服联机的话。

关于理想的工作,我也有同样的苦恼,也是正在理想与现实之间难以做出抉择。只恨自己技不如人,年轻时没有花时间去精进自己的手艺,积累作品,落到现在不能随心愿选择工作的处境。不过过去的已经过去,现在的我是疯狂揽活填充业余时间,希望5年后的自己不会再同样怨恨现在的自已吧。

跟你说的我信息成瘾的事,正好在这里记下来提醒自己。今后刷微博刷新闻的时候要提醒自己停止,就像当年成功戒掉了愤世嫉俗关注政治新闻的习惯后,发现我的生活并没有因为缺少政治信息而有丝毫褪色一样,相信停止疯狂吸收信息也不会摧毁我的现有生活。省下来的时间嘛,把自己买的kindle电子书先消化一下吧。拿来玩游戏也很不错。我现在正处在怀疑自己是否真的喜欢游戏行业的自我怀疑阶段,多玩一些主机和PC游戏,让我仔细感受一下自己还会不会为这个行业兴奋吧。每次去秋叶原走一走我都感觉自己的信仰得到了充值,赴日留学时的心情又重新浮现。我对游戏行业的热情也需要像秋叶原这样可以帮我为信仰充能的象征,希望能在玩游戏的时间里找到。

听你讲的德国的福利真让我有点动心。现在日本的养老金制度是交足10年就有资格领取,随便你在日本还是在海外,对外国人非常友好。如果今后有机会去欧洲找一下工作,也许也是不错的生活。不过因为语言等原因,去欧洲工作的话我可能会去英国,到时候去找你玩要靠划船坐飞机了。

趁我还在日本,快来日本玩呀!我也努力提升专业技能,给转职之路攒一些筹码,顺利的话转职间隙也会去找你玩的!

harddisk

今天用两块新硬盘,试了一下用synology创建raid1后,故意破坏其中一片硬盘,再从剩余的另一块硬盘中恢复文件。实测给synology一块新硬盘,它自己可以修复raid1。

不过比较尴尬的是,当我破坏raid1后再拔掉两块硬盘,然后重新插上,这时synology就无法识别这两块硬盘内的raid1了,更无法修复,这就很恶心了。

上网查了一下,修复方法是用linux下的mdadm挂载raid1中剩下的一块硬盘,从中取出文件。

 

先说一下,我是在windows虚拟机 hyper-v 里创建了一个 centos6.9 的虚拟机,把硬盘挂在虚拟机上测试的。

 

官方给的命令是

# mdadm -Asf && vgchange -ay

执行之后会增加一个 /dev/md*, 比如我这里增加的是 /dev/md4。有了这个md之后可以用

# mount /dev/md4 /{empty_folder}

命令挂载硬盘到指定目录,然后就可以从这个目录中访问原始 raid1 中的文件了。

用完以后用

# umount /{empty_folder}

解除挂载,然后用

# mdadm --stop /dev/md4

解除对 raid 硬盘的解析。

 

不过之前不知道怎么回事,官方命令我没执行成功。后来用 blkid , fdisk -l 等命令调查过,根据种种迹象得知硬盘上的三个分区,我需要的是 /dev/sdb3。

之后执行

# mdadm --assemble --run /dev/md127 /dev/sdb3

mdadm: /dev/md127 has been started with 1 drive (out of 2).

(这里md127是随便写的,应该不是非得用这个名字。)

之后执行

# mount /dev/md127 /{empty_folder}

挂载硬盘后,一样可以访问。

取消的命令分别是

# umount /{empty_folder}

或者

# umount /dev/md127

然后执行

# mdadm --stop /dev/md127

mdadm: stopped /dev/md127

 

值得一提的是,有人说需要用

# mdadm --examine --scan >> /etc/mdadm.conf

来修改配置文件,就可以在启动时加载磁盘阵列了,不过我这次只是想知道取出文件的方法,懒得重启测试了,这里只做记录,不再测试。

 

要找出HTTP服务器的漏洞,先要确定这是用的什么服务器软件。
我发现 404 response 的 Reason-Phrase 是“Site or Page Not Found”,而不是最常见的"Not Found"。搜索“Site or Page Not Found”发现这很可能是某个早期版本的 goahead 服务器程序。
搜索可知 goahead 程序在早起有很多bug,甚至包括远程执行任意代码的漏洞。不过直接试用执行远程代码的漏洞失败了...
有一天突发奇想,能不能从固件升级包中找到 goahead 的版本信息呢?于是下载了一个 firmware 的 bin 文件,用 Binwalk 打开后,找到了 goahead 的可执行文件。此时终于可以确定服务器端软件用的就是 goahead 了。
不过开发方也不是拿来就用的,它们似乎注释掉了源代码中关于 goahead 版本信息的代码,这就很恶心了。好消息是这个 goahead 软件是开源的,不过官方 repo 里只有从2.5版至今的代码历史,但根据可执行文件中的内容推测,摄像头中的 goahead 是一个早于 2.5 版的版本。为什么官方不提供更早的版本管理信息呢?看源代码,我才之前是用 svn 管理的代码,后来在迁移到 git 时直接复制进来,放弃了 svn 时代的代码历史。现在官网也不提供更早版本的下载了,无奈之下在 github 上找到了几个包含早期 goahead 版本的 repo,从中提取出了几个离散的早期版本的 goahead。有趣的是,我无论如何也找不到1.x版本的 goahead,我猜这个软件是进入2.x时代开始才改名叫 goahead 的吧。
那么,我是怎么根据可执行文件推测程序版本的呢?说来惭愧,用的是一个很土很低效的方法。
首先,goahead 是一个 c 语言编译出来的程序。c 语言的编译器我不是很了解,但是直觉上来讲,编译后常量字符串应该原样储存在可执行文件体内。搜索发现事实符合我的猜测,而且编译器会就近把同一个原文件中出现的字符串按顺序放在相邻的位置。
根据以上信息,我通过比较代码的变更历史,找到了一些仅出现在特定版本中的字符串和它们的排列顺序,最终确定我的摄像头使用的是2.1.4到2.1.8之间的某个版本的 goahead。
根据这个版本信息,我找到了几个可能可用的 goahead 的漏洞信息,但这些漏洞信息都只说漏洞适用于2.1版本,没有小版本信息,没办法只好根据代码推测漏洞是否依然可用了。

养猫之后,家里架起了两台监控摄像头,以供我上下班无缝赏猫。

摄像头本身有ddns功能,但想想看自家的监控摄像头可以被整个网络直接访问到,纵使有密码保护,心里还是觉得很恶心的。所以我在公司都是用vpn连回家里,在家庭内网环境中访问摄像头。

事实上两台摄像头中有一台是几年前买来看家用的,另一台是为了看猫最近新买的高分辨率版。两台摄像头并不是同一厂家出品,外形也很不相同,但神奇的是网页端管理界面竟然迷之相似,我一度以为这是同一集团不同分公司的产品。

ipcam

后来经过我反复调查,发现这应该是某种现成的套件,各家厂商都在用罢了。

这个网页版管理界面做的可以说非常之 low。不说他杂乱的前端源代码,充满学生气息的界面设计,就连最重要的功能上都是严重缺失的。一个监控摄像头,竟然只有在IE下下载安装插件才能观看有声的实时直播,用 chrome 和手机浏览器都只能接收一张张的截图拼成一个幻灯片来看,声音更是甭想了。

我知道由于浏览器功能或者说 HTML 规则的限制,仅靠前端无法实现接收和播放 rtsp 直播流,但问题是服务器端也是你自家的啊,你做个 flv 直播流,做个 hls 直播流,怎么样都好,现成的库那么多,想让浏览器看个视频直播有什么难的= =

chrome 也真是讨厌,推翻 npapi 插件,又放弃了自家的 nacl 插件,跑去投奔一个不支持 socket 的 webassembly,导致我想自己写一个接收摄像头 rtsp 直播流的 chrome 插件都做不到了。虽然我也可以先写一个代理服务器,把 rtsp 流翻译成 flv 流或 hls 流,再用浏览器插件播放,可那很花功夫啊!我虽然喜欢写代码,但也会嫌麻烦的!

 

吐槽先放一放,说回到标题来。

从买到监控摄像头的第一天起,我就一直在担心摄像头被黑的问题。虽然我已经层层设防了,但每次进入摄像头的拍摄范围时还是时刻小心。没办法,我就是防人之心很重的人= =

想摄像头不被黑,先得知道摄像头会怎么被黑,然后才有办法防御嘛。再加上网络入侵本来就是一件对小青年很有吸引力的事,所以我开始好奇能不能入侵自己的网络摄像头。

参考这篇文章,我nmap了一下我的两台摄像头,发现并没有像作者遇到的情况那样简单的暴露出telnet端口或其他可疑端口。虽然证明我的摄像头更安全更不容易被人拿去搞ddos,但也让我更难入侵了...

直接登录不成,就从暴露出来的 http 服务器上找找线索吧。于是继续回来研究这个网页版后台。

大概看了一下,发现可能有多个服务器端程序在服务 http 请求:

看 response header 可知,服务器端的静态文件和 asp 脚本是跑在一个 http/1.0 服务器上的,返回的 server header 是厂商自定义的 "IPCamera-Web"。

另一方面,请求服务器上的 cgi 脚本或当请求返回 404 时,返回的 response 表明他的服务器使用 http/1.1 协议,此时返回的 server header 依然是厂商自定义的 "IPCamera-Web"。这个 1.1 的服务器的 200 response 总是会返回 "connection: close" header, 可见人家真的是 http/1.1 的服务器端呢。最后,当服务器请求失败返回 404 或 500 时,response 中不会携带 "connection: close" header,加上没有 content-length,也没有 chunked transfer encoding,仅从传输内容上已经无法判断这个 response 应该从何处结束了。不过从浏览器能正常访问后台页面这一点来看,1.1 的服务器端可能是发送 response 后直接断开了 connection,帮助客户端判断出了 response 的结束。不管怎么说,这最后一点使这个 1.1 服务器的实现显得很业余。业余好啊,说明代码中可能存在的安全隐患多,有助于我入侵系统。

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

----------

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

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

----------

ookami_1024_768

图文无关

 

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

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

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

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

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

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

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

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

......

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

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

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

 

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

 

liyutong-xuezhiqian.jpg

 

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

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

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

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

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

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

 

media-view

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

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

 

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

 

总结:

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

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

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

 

 

上一篇提到的“能编译通过这个 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号,解决了这个问题。

 

今天买了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中下断点调试(良好),可能的话希望自己能修改软件的菜单,加入自定义功能(优秀)。

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

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

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

 

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

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

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