bookmark_border好久没更新了

虽然没什么值得写的事,不过作为写给未来的自己看的日记来说,能坚持写下去才是最重要的。所以上来写一点。

前段时间接了一个截止日期比较近的活儿,触发了我的焦虑症状,之后就一直在持续焦虑、注意力不能集中的生活中煎熬。家里剩下的一些药断断续续吃完了,不想去医院结果药就停了。这服药停药的一来一回净是不良反应了根本没捞着好,到后期甚至演化到失眠到凌晨6点睡不着,不得不反复请假在家睡觉的地步。行吧,怕了你了,只好乖乖请假去医院开了安眠药和焦虑药。焦虑药生效要吃很久,不过这安眠药就厉害了,立竿见影药到病除!虽然没有柯南那么速效,但只要不顽强抵抗,服药后一小时之内睡着是完全没有问题的,第二天起床还没有宿醉问题,完美。拜安眠药所赐,这两周难得的恢复了比较平稳的心情。不过这种药似乎是适用于短期失眠的,还能用多久是个问题啊。现在能做的只有珍惜眼前的平静生活,暂时不要想特训跳槽什么的容易让自己焦虑的事情了。

bookmark_border又一次阿里面试一轮游

作为一个native端开发者,当年不知道怎么想的,把简历投给了阿里的前端部门。。

因为是同学帮忙联系的内推,所以很快得到了好几个部门的面试电话,但无一例外都是一轮挂。虽然大部分是因为我想跨领域但是对主流前端框架和css之类基础知识的缺乏,但其中有一个手机native部门的面试也挂了,这给了我很大的冲击。连最对口的领域都过不了一面,就不用拿跨端跨行业之类的理由来搪塞了。菜就是菜。

菜

总结一下这次面试的收获
1. 学的太杂,native app,前端,node.js,java后端,没一个有独当一面的专业能力。
2. native app 没有自己制作的上架 app
3. 前端基础的css不懂。
4. 前端常用框架里react全家桶只知道和react-native互通的一小部分,没有作为前端项目使用全部全家桶开发项目的经验。
5. 后端 node.js 只有简单工具的开发经验,没有大型项目的开发经验。
6. 后端 node.js 没有主流框架的相关知识。
    说了一个express,被说那已经是几年前的技术了。。。
7. 想做 java 后端,但完全没有一点准备。
    这个是我想的太少了。既然完全没准备,就不该提这个的,徒增坏印象
8. 列举自己做过的有价值的项目,都不是很有价值。
    完全理解http/1.1协议,独立实现http代理服务器,被说http只是基础而已。举了几个debug的例子,但显然debug能力对提升印象并没有什么帮助。虽然实践工作中debug能力强弱基本可以区分一个程序员的能力强弱,但在面试的时候很难把现场工作时的那种重要性传达出来。毕竟只是区区debug而已嘛。

整理一下思路
1. 考虑到服务器端知识衰减的速度更慢,适用行业更多所以就业机会更多,我长远的打算还是转到服务器端。
2. native app 能力是我现在的主要门面,所以 native app 的开发能力一定要优先提升到让人无可挑剔的程度。至少不要在一面就落了吧。
    要做一个上架 google play 的作品。
    熟悉 android 主流开发中各个环节常用的库。能用一下最好用一下,不然至少知道名字和特点,不要在面试的时候没得说。
3. 前端技能树是我第二接近实战级的能力,而且看起来学前端并不会投入太多时间。可以考虑少量投入时间,填补现在的几个太明显的缺陷。
    css,拿 mdn 顺一遍。因为很枯燥,最好做个打卡。
    react 全家桶,在自己的项目里用一次就会了。全家桶具体有哪些,得找些文章确定一下。
4. 后端技术,这个比较纠结。
    就职来说,php是最好学,需求也最大的,做好了也有很高工资。但是技术深度太浅了,老年程序员和新手程序员之间拉不开差距,后期收益低。
    保值增值方面,java的后端几十年如一日的缓慢更新十分保值,同时java版本更新和jvm的深度让深入研究也有一定的回报,后期收益至少不会一路减少。但java后端我现在真的是一片空白,毫无概念。这样的跨专业押注会不会太过无谋了?暂时先考几个java的证书,熟悉一下这些年来java语言的变化吧。就算后来java后端做不成,至少对android开发还有帮助嘛。
5. 准备一下面试常见题型。
    从业经历呀,自己做过的比较有代表性的项目什么的,这类每次都问的问题干脆写好背下来算了,也免得临时想出来的项目不够酷炫。
    不过工作中确实很少有机会让一个人做一个特别有挑战又很尖端很出彩的工作啊。业余项目我说做fc模拟器什么也完全被无视了。不过这个和商业开发无关,不算数我也不是不能理解就是了。

所以,接下来首先应该怎么做
接下来应该…先什么都不做,等我的焦虑症状消退,恢复平日的战斗力再说!
焦虑真的太痛苦了,焦虑得什么都做不了,同时又为什么都做不了而感到焦虑。真的恐怖而且绝望。
我需要严肃考虑一下,如果我注定无法再做有挑战性的工作的话,该如何在不能继续保持技术力压制的情况下,作为一个平庸的技术人员度过这一生了。
为干枯的生活,注入新的活力。

bookmark_border回复笃志的《日记2018-12-29》

笃志日志原文: https://duzhi5368.github.io/2018/12/%E6%97%A5%E8%AE%B02018-12-29/

本来下面这段话是留给笃志的日志原文的,无奈他的博客使用的 disqus 评论系统反复吞我的评论,把我的评论标记为垃圾评论且申诉无效,我决定把我的评论拿来直接当自己的日志发了。disqus,这下你满意了?

—— 以下评论原文 ——

哇,竟然说我不沉迷技术了,这不能忍(笑)。
目前来说技术还是我第一追求的目标。看起来不沉迷技术了是因为这我些年确实懈怠了。尤其进了个在本地相对来说稍微大一点但其实在国际上根本排不上号的手游公司以后,之前在小公司时的那种被命运步步紧逼的焦虑感一度消失了。
焦虑像饮酒,适度焦虑有益身心健康(不过最新研究成果表示饮酒绝对有害,无论多少…)。
如今我已年过30,离35岁这个传说中平庸程序员的职业终点越来越近了。虽然在公司里我的技术力和学习能力还是最强的一级(自认为),但在网上随便逛逛年轻人的博客和github就会发现,我已经被同龄人甩在了后面。用依云博客里的一句话来说就是“我已经不再年轻,也不再优秀了”。
日本公司对程序员似乎比较宽容,以我的能力和比较唬人的学历,貌似也能平稳过完一生,但这是建立在行业和社会情况30年不改变的前提下。这么脆弱的前提实在是给不了我太多的安全感,所以,我又开始对前途感到焦虑了。
如何才能让我安心?一夜暴富当然是首选,还要继续上班的话,那就是35岁前进一家可以安度晚年的it企业了。
为什么不是“将自己的技术提高到永远不用担心失业”呢?这就要说到我的变化,和笃志一样,我也不再是唯技术论者了。
it技术的更新换代太过残酷,可能你投入了30年做到一个领域的第一人,但1年后这项技术被淘汰,你30年的心血一夜间付诸流水。虽然可以不停的补充新的知识,但这种知识淘汰率还是让我很痛苦。我也想像医生律师甚至以前的工匠一样,随着年龄增长积累宝贵的经验,受到年轻从业者的尊重。可惜在现在这个时代,专精太危险,只好把精力分散在多处,但这样就很难做到领域内的专家,对我这种搞不懂底层不舒服司机很不友好。
既然无论如何技术路线都不能让我无所顾虑的去追求,那我索性就不追求了,普普通通上班过日子吧,剩下的时间投入到自己的爱好里就好了。虽然我的爱好也是写程序= =
不再是为技术论的另一个理由是5年多的工作让我认识到了程序员是如此的不重要。一个游戏项目是否大卖,在我看来最重要的就是策划,其次是美术,程序最次。程序和美术无可挑剔策划不行最后凉凉的比如风暴英雄和dota卡牌,策划的玩法爆炸吸引人但美术一坨X程序不过不失比如dreamquest和大多数fc游戏甚至广义上围棋象棋麻将牌都算。策划精彩美术具备平均水准程序比较烂的比如pubg甚至能让玩家和网吧花大价钱帮程序弥补优化问题也要玩,这很让我震撼。
在到达笃志所说的“无所不能”(青春版)的境界以后,比起继续收集武功秘籍,我更想用我的能力去做成一些事情和项目了。

 

bookmark_border抢救我的动漫之家(一)

dmzj_closed

2018年12月5号动漫之家网页版入口被封,让我有了一定的压力。毕竟是最后一个可以好好看漫画的平台了,不希望他倒掉。 到今天动漫之家已经被封超过3个月,为了防止最坏的情况,是时候开始对他进行整站备份了= =! 最初比较担心他会防御别人整站下载,幸好实际测试下来并没有遇到ban ip之类无法应对的情况。 我花了几天的时间写下载脚本,目前的效果已经比较平稳了。

下一步就是如何把下载好的漫画转移到其他文件存储服务上去,毕竟我在用的vps只有区区50GB,并不适合存储大量文件。 考虑到我买的 office 365 自带 1TB oneDrive 空间,目前最理想的做法就是文件传进 oneDrive 了。怎么做呢?暂时还不清楚,先读读文档吧。

bookmark_bordernes模拟器开发记录(三)

1. 解决了 js/ppu.js 被adblock误伤导致游戏无法执行的bug。方法是把所有js打包在一个文件里,靠sourceMappingURL度日。

2. 用户输入实现了,玩起来意外的顺利。
其实我ppu还有些功能没实现呢,8×16精灵什么的。我本来是想等遇到了显示bug再去实现,也好检查自己是不是实现对了,可就是没遇到这种场景,算了不测了,下次盲写吧。

3. 下一步是实现声音处理。
先读文档吧,一边看文档一边参考别人的实现。因为基本能玩了,我的“业余项目完成75%就失去兴趣”的症状开始发作了。这时候更要坚持!2019年将是见证奇迹的一年。

bookmark_bordernes模拟器开发记录(二)

滚屏实现完了,效果如下:

 

期间修复了一处笔误,当时是把0xff3f算错了,写成了0xffcf, 两个0bit歪了两位,害我排查了老半天,惨。

不过这种bug很难避免,只能继续提高debug能力了。幸好我有正确答案可以参考,修起来比较容易。

有这么优越的条件,这次一定要坚持做完这个项目呀!

后面还差手柄控制和音频输出和执行效率优化了。加油!

bookmark_bordernes模拟器开发记录(一)

nes

如图,我正在开发nes模拟器,也就是2018年5月份这篇日志里说的黄卡游戏机的模拟器。
本来想等到做完之后再突然贴出来的,不过这个个人项目实在是拖的太久了,其中有很多感想我担心到最后写日志的时候已经忘记了,所以还是以定期总结记录的形式发出来吧。

关于nes模拟器的开发难度。
开发nes模拟器对技术深度没有要求,可以说会写程序,会显示图像,会播放声音的人就能开发。只是模拟器的细节比较多,所以做起来耗时比较长,有点累而已。和自己设计一个应用程序呀游戏什么的比起来,制作模拟器的好处在于完全省略了设计部分,所有的设计细节都是现成的,你只需要充分施展你的工程能力即可。对于我这种没有产品能力没有营销能力唯独喜欢搞工程的人来说是最适合的业余项目了。说起来自己重新实现一些rfc协议也有类似的乐趣,还是我那个提了一万回的自制http服务器项目,就是重新实现rfc2616,也是乐趣无穷。

再介绍一下我现在的进度。
如图所示,我现在做到了正确显示游戏内的背景图像了。具体来说就是实现了全部的cpu指令,实现了显示背景nametable中的内容。
没实现的呢,主要是音频完全没做,手柄操作完全没做,屏幕滚动还没做,甚至按固定帧率执行游戏都还没做。上面的截图是我顺序执行了大约350000条汇编指令后的效果。不过这个固定帧率不难,我因为一直在修一些低级bug,都是跑几帧就出问题的地方,所以就没着急做按帧率执行。

关于这个项目的预期时间投入。
目前看来总时间投入要在200小时甚至以上了。当初觉得自己两个礼拜就能搞定,真是太可笑了。
时间分配上,阅读和查阅文档和参考项目要占70%的时间,代码实现占10%的时间,修bug占剩余的20%的时间,大概是这样。因为nes模拟器是一个比较常见的个人项目选题,github上有很多别人实现好的项目可以参考,我甚至可以实际运行别人的模拟器,逐命令比较我和他执行结果的不同,所以调试方面已经比早期那些第一代做模拟器的人们简单很多了。但越做到后面遇到的硬件细节越多,而且错误越来越隐蔽,还是花掉了我两倍于开发的时间来调试bug。如果这个趋势继续恶化的话,我接下来要考虑先做一个高效率的模拟器调试器了。

最后记录几个我踩过的坑,留给未来的自己回顾时回忆。
1. cpu读取当前显存地址的内容时,得到的永远是自己上一次读取显存时的缓存值! (https://wiki.nesdev.com/w/index.php/PPU_registers#The_PPUDATA_read_buffer_.28post-fetch.29
这个太反直觉了,一定是当时的硬件限制导致的。没有正确实现这个细节导致我的地图贴图序号部分出现了错误,甚至我的贴图图案都被污染了一部分。

broken-nes

比如下图的上边两张是原始的贴图,下边是被污染后的贴图。为了清楚分辨,我给他们上了比较艳丽的颜色。可以看到右下的©中间被污染了,显示在屏幕上就是中间出现了一些多余的黑色的像素。

broken-texture

调查这个bug花了我大概一整个上午的时间,期间发现用chrome调试面板在高频执行处下断点会极大的影响程序执行速度,甚至有时候会内存使用量过大导致页面崩溃。就是那时候我开始考虑是不是应该做一个模拟器专用调试器了。

2. 2d canvas 的绘制效率。
html5的canvas我工作中经常接触,但大多是在使用现有绘制库的基础上。徒手操作canvas绘制时的绘制效率方面我之前并没有研究。
最开始我按照我知道的方法, ctx.fillStyle=”rgb(r,g,b)”; ctx.fillRect(x, y, 1, 1); 来绘制每一个像素。一帧两帧还好,当我执行到一口气绘制30多帧的时候,绘制部分的耗时陡增到5秒多。当时我就意识到方法错了。毕竟有现成的jsnes模拟器,每秒跑60帧都没问题的,所以肯定有更高效的绘制方法。
稍微搜了一下,找到了创建 imagedata,然后直接修改 imagedata.data 数组里的数字来设置每个像素的颜色,最后把imagedata整个画到 canvas 上的方法。换这个方法以后绘制部分耗时只有原来的1/10了。虽然离60帧每秒还有一点距离,但至少不影响我调试了,暂时先这样吧。

bookmark_border我的微博时间线有点失控了

rss

我现在关注的新闻类微博有点多,已经超过10个了。导致的结果就是时间线混乱拥挤,把不常发微博但我很在意的人的信息冲走了!
这可忍不了了。todo list里加一项:清理新闻类微博关注到rss阅读器中,重新开始使用rss阅读器。
自从google reader关闭了以后,我的rss阅读习惯就没能再继续下去。一方面是因为主流网站放弃对rss的支持,另一方面是现有rss阅读服务都会把30天以前的全部未读强制标记为已读,彻底搞乱了我的阅读计划。
主流网站放弃rss,有人手写各个网站的网页转rss工具,我自己写也不难。rss阅读器这个釜底抽薪式的破坏用户体验的做法,就只有用self-hosted的私人定制rss阅读器来解决了。
feedly的人解释过30天这个限制是出于服务器性能开销的考虑,这个理由我可以理解但无法接受,结果就是分手只是时间问题了。

self-hosted的rss阅读器一直在我的个人项目列表里,但一直没有什么特别紧迫的压力去做它。
目前业余项目的优先级是: NES模拟器 > 微信公众号网站头像设置功能收尾 > 和亲友一起做一个预计工期3个月的小游戏上线。
和rss阅读器一样想做但动力不足以给它设定优先级的候选项目还有其他好几个,加上我业余做兴趣项目本来就是三天打鱼两周晒网,清理微博关注的事不知道什么时候才能上线呢。
毕竟这混乱的时间线已经忍了两年了。再说twitter已经把恢复时间线顺序的功能添加到首页了,搞不好我出手之前微博就跟进这个功能了呢!

bookmark_border无事也要写日志,写给未来的自己看

博客不再流行真的是有他的道理的。文采好的,去各大平台开专栏开公众号了。只是想记录生活的,微博朋友圈更轻松,还能收获更多评论,开心。

我对我博客的定义比较模糊。

首先作为程序员,写博客的第一印象肯定是技术博客。可是翻了翻我至今为止的日志内容,称得上技术的真是少得可怜,就算有,很多也是我学会或者攻克某个技术细节之后的文字总结,并不是通常意义上给新手入门用的技术日志。

因为想听听其他熟人的评价,所以曾经把博客介绍给同事看了,结果被说都是“无病呻吟”,没有技术含量…

虽然有点受伤,不过人家说得没错啊,想在我这里学到技术,还不如问自己波棱盖儿呢(突然想起这句老话,强行用上=v=)。

最初把博客改名盗贼的极意,本来是想敦促自己要从公司或者其他可以接触到成熟解决方案的地方“偷师”,即使与自己无关的部门的技术框架也要偷学回来的。但是现在看来,我这其实不是个讲技术的地儿啊。所以这个新名字,就单纯的用来耍帅吧。

 

技术博客是做不了了,那就记录生活吧。

说记录生活也有点说大了,我这里更多的是记录一些心情,想法。

翻翻五六年前的日志,看到当时我的希望在工作中不计较工资,以吸取技术经验为主,现在看来真是惭愧得很。对现在的我来说,技术已经不是一个遥远到需要虔诚仰望的存在了。比起追求模糊的“技术”这一概念,现在的想法更加具体。我知道我需要学习什么,也知道怎么学,甚至也知道自己肯定能学会。当一切变得唾手可得时,它也同时失去了曾经的神奇魅力。

现在的我,更想做事。想用自己的技术去做成些什么。公司内的项目也好,兴趣项目,玩具app,网站,游戏,什么都好。而做成一件事所需要的能力很多,技术只是其中最容易入手的一种,容易到你甚至可以不懂技术,只靠外包来完成项目。

说远了。还是说说记录心情吧。

我是一个行动力执行力自控力很差的人,日语叫对自己太好(自分に甘い),想放弃就放弃,我甚至很想在简历里添一句“擅长放弃”。因此日志里有很大一批自我激励的鸡汤类内容,也就是同事说的“无病呻吟”了。说实在的,总是自我反省,总是立大志,然后总是放弃,连我自己都不好意思再写这类日志了。我也想像其他我佩服的人一样,某一天冷不丁甩出一篇日志说,我最近做成了这个这个这个,然后附上github链接,超吊。

可能立志这件事,说出来就不灵了吧。

bookmark_borderchrome 的 tab 设计恶心到我了!

每次多开一点tab他就隐藏网站图标,让我摸黑使用,怎么用嘛!

useless-tab

 

本来前一版(67.0?)那个锯齿状tab的解决方案蛮好的,怎么这两天又给改没啦?!

 

锯齿状tab

 

好吧,在这里立下Flag,等我的nes模拟器写完,下一个就是定制自己的锯齿状tab的chromium!