Code Journey #5

openSUSE

opi

  • 第一个可用版本发布
  • 打包推送到 openSUSE Factory

打包

  • 更新 adobe-sourcehansans-fonts
  • 更新 adobe-sourcehanserif-fonts
  • 更新 google-noto-emoji-fonts

Code Journey #4

KDE

翻译

  • Kdenlive

openSUSE

Geeko Store

  • 用 curl 测试 OBS 搜索 API

打包

  • 推送 vnote

Git Cola

  • 中文翻译

Code Journey #3

KDE

翻译

  • 翻译核心组件

openSUSE

维基

  • 修复打印布局
  • 修复头部脚部链接翻译
  • 修复目录的 sticky 布局
  • 编辑 Apache 相关页面
  • 编辑 Chromecast 防火墙内容

打包

  • 更新 WoeUSB

论坛

  • 更新 IRC 新帖同步机器人

翻译

  • yast-control 桌面列表

Code Journey #2

KDE

翻译

  • 更新核心翻译

openSUSE

打包

  • 更新 python-PyMuPDF 包

Bug

Geeko Store

  • 用 Qt Quick Controls 做了个界面
  • 尝试在 High DPI 下运行,发现 Native Text Rendering 不能缩放字体,所以只好有条件地使用 Qt Text Rendering

Code Journey #1

这是第一篇,把自己做的一些小事记录下来,激励自己坚持下去。自由软件是一个有意义的事情,这点我从没怀疑过。

KDE

翻译

  • 同步中文翻译,有大量来自钛山同学的 Krita 文档翻译。

openSUSE

打包

  • 更新 php-composer 包
  • 打包 python-PyMuPDF
  • 更新 riot-web 包

Geeko Store 开发

  • 开始施工

中午过了一阵雷雨,阳光穿透稀薄的云。短暂的,明媚,清凉和安宁。

路上深深的车辙,困住了些许雨水,此时已沉淀干净。

男孩子穿着凉鞋,脚上沾着泥沙,将捡来的木片,泡沫和其它小东西,放在小水洼中。水面的波纹折着耀眼的光,一圈一圈。影子投在水底,像漂在空气里。在很小的时候,人会忘记眨眼睛,盯着一个小小的世界,很久很久。

时间好像不会前进一样。

这一年,隹五岁。

隹晚了三个月入学。由于年纪稍小,母亲拜托了学校里的亲戚,才勉强让他上学。

学校里的小孩儿们大多都互相认识了。隹找不到说话的人,藏到了教室最后一排的角落。旁边的男孩在桌子上刻字,还有些女孩在玩贴纸。课间,教室吵得厉害,他感觉自己的猫耳朵太过灵敏了。隹走路没有声音,可以悄悄离开不适应的环境。

隹的第一本教科书是托人买的,在学期末的时候,他发现最后少了一页。他把最后一页的文字和插图临摹下来,夹在书里。不是因为喜欢,而是因为害怕。此后的每一本教科书,即使课外读本,他都要翻看好几遍。

这一年,隹七岁。

在村子的深处,有一处废弃的宅子。里面囚禁着疯子,一个没有名字的人。

偶尔,隹会跟着邻家的男孩子们从墙的坍塌处溜进来,因为院中有一棵非常甜的枣树。无人照看的地方,草木如妖化了一般疯长,诡异的绿色让人害怕。低矮的屋子,已没有了门窗。白色的墙皮脱落殆尽,露出了土坯。隹隐约听到铁链拖动的声音,那个眼睛如野兽般的人,在阴影里盯着他们。男孩子们朝屋子的方向扔石块,然后飞快地逃跑了,屋里传出令人毛骨悚然的叫声。

隹有时候会梦见,那个有着蓬乱长发的人在哭。

那一年,隹十岁。


隹的姐姐年长两岁。每天她都会教隹明天老师要讲的内容,还会画英文单词的卡片。她有各种各样的爱好,虽然村子里的孩子没有机会上兴趣班。她会拉着隹一起画画,绣花,织毛衣,抓蚱蜢,打游戏。

直到有一天,姐姐要去高中寄宿。一个星期后,隹和妈妈去县城的学校看望姐姐。姐姐刚刚结束军训,看到家人便哭得不停。这里的辛苦快让她崩溃了。隹只是在旁边呆呆地站着,吃着盒饭,不知道要说什么。夏天的燥热,树叶的哗啦声,感受不到清凉的树荫,小声的啜泣。

小时候觉得,哥哥姐姐天生就是哥哥姐姐。他们为各种事情都做好了准备,然后再来告诉你到时候要怎么做。这种错觉总是会不见的。

分别前,姐姐塞给隹一块巧克力,那是她趁着午休前的间隙去便利店买的。

那一年,隹十四岁。

隹遇到了第一个令他无可奈何的女孩——莺。

她是隹的对立面,做事很用力,却依然平平,很容易结交朋友,心里有情绪绝不会等下一分钟再爆发。她似乎一直看不惯隹的安静,孤高和并不努力的优秀。从偷保温瓶里的热水,到故意在教室门口挡路。课间的揶揄调侃,回答不出问题时的嘲讽。两个人的冲突一直一直持续着,直到这成为了他们日常的一部分。少男少女之间的感觉,很容易就转化成了什么了不得的东西。

莺留起长发,声音变得柔和温顺。隹有了积极的态度,去融入自己抗拒过的世界。没有触碰指尖的心跳,也少了让人踮起脚尖的温柔话语。只是在发呆的时候,不约而同地,远远望着对方。

这一年,隹十七岁。

南方的小城,从不缺雨水。一整个六月,总是湿透的。

隹还是形单影只,仍然不习惯带伞出门。虽然在社团和同班都有熟络的人,但他喜欢这样一个人在雨天,在校园的一角,听雨声。有人打扰的话,就可惜了。

他的单肩包里总是放着很多东西,必不可少的是糖,饼干和小瓶牛奶。没有糖分的话,就无法思考,这是他最清楚的事情。最近买了一本很艰涩的英文书,总是带在身上。他对未来没有计划,也没有期待。在别人谈论这些话题的时候,他总是悄悄地挪远一点。沉浸在今天的兴致里,已经让他感到别无所求了。

午餐和晚餐,他总会在食堂买一份最便宜的蔬菜。尝不出味道,也依然幸福着。

这一年,隹二十一岁。


二十三岁。

去了一趟日本

因缘

去年秋天 DYX 同学和越南同学拉我入伙,参加一个 Hackthon,以期获得免费的日本旅行机票。虽然最终获奖了,但是计算一下在这期间投入的时间成本,实际上不太划算的。连到了日本,都还要花一天时间做 Presentation 和 Social。

继续阅读 →

技术对 UX 的影响

做一个应用程序有非常多不同的技术选择。使用 Web 技术既可以用做小的开发成本做出跨平台的应用,但是性能和功能又有诸多限制。完全使用原生技术则需要极高的成本。选择技术的因素固然有很多,不同的技术可能实现相同的功能,但体验上是有差异的。

下面介绍的顺序是从更接近 Web 技术到更接近原生技术。

Web 后端渲染

典型的 Web 应用模式,网页在后端进行渲染,配合少量的 JavaScript而构成的应用。这种模式适合交互简单,以内容为主的应用。典型的例子是 GitHub, WordPress, Wikipedia 之类的网站。

后端渲染对服务器的压力更大,每跳转一个页面,浏览器都要等待至少数秒钟。除了 Safari 之外的移动浏览器都有一个刻意而为的点击延迟 (300ms),这让点击链接跳转在移动端的体验变得更差了。速度是最大的弊端。

单网页应用

使用 Angular, React, Vue 之类的 JavaScript MVC/MVVC 框架制作的应用。前端作为 JavaScript 被整个或部分加载到浏览器。然后只从服务器获取需要的数据,更新页面的部分内容而不需要重载页面。服务器不再需要处理网页渲染,数据可以缓存,数据库查询等耗时操作也更少。这种模式适合交互频繁,数据更新频繁的应用。典型的例子有 Twitter, Facebook, Instagram 之类的网站。

缺点仍然很多:

  1. 初次加载仍然非常耗时。
  2. 受到浏览器限制,尤其是移动浏览器。
    1. 大多数移动浏览器在滚动时会自动隐藏地址栏。如果有浮动元素的话,这会非常讨厌。
    2. iOS Safari 强制所有网页可两指手势缩放。这种缩放可能会破坏原有布局,给人一种不可靠的感觉。而原生应用是不可以被整个自由缩放的。
    3. 仍然有点击延迟 (300ms)。这是单网页应用给人一种比原生应用慢的最常见原因。
    4. 移动浏览器的性能导致很多动画变得缓慢卡顿。
  3. 设计/开发模式的问题。
    1. Web 开发者通常不会花心思去做手势操作和过渡动画。
    2. 在桌面用响应式设计模式开发,并不能完全模拟实际设备的交互感觉。主要问题在于屏幕尺寸,手指的精度和活动范围,以及导航栏和键盘的影响。
    3. 桌面和手机共用结构和组件,常常在手机上不太好用。

Electron 和 Cordova

这两个东西都是提供了原生系统接口的 Web 容器。Electron 主要用于桌面应用,只要 NodeJS 可以做到的它都可以做到,因此可以使用非常之多的原生接口。Cordova 或者 PhoneGap 面向移动平台,能使用的接口由插件提供,非常之有限。

  1. 加载时间快,不需要下载界面组件。
  2. 界面仍然是 Web 引擎渲染的。运行性能仍然比原生差,但是优于浏览器。
  3. 相比浏览器,消耗更多的系统资源。
  4. 浏览器界面的干扰被削弱。没有标签页,地址栏,更像是单应用。
  5. 无法使用一些原生的库和系统接口。

React Native

JavaScript + 原生 UI。一个性能和快速跨平台开发的折中选择。但也可能是一个陷阱。

  1. 界面与原生应用几乎没有差异,交互非常流畅。
  2. 只提供了原生 UI 组件的一个子集。
  3. 可用的原生系统接口有限,第三方 SDK 就更少了。很多功能仍然用 Web 技术实现,变成了混合式应用。
  4. 可能会使用更多的资源,启动较为缓慢。

原生应用

原生应用可以在所支持的平台上做尽可能多的优化,取得最好的效果。但代价是巨大的开发成本。

以视频播放器为例,原生应用可以支持任意视频格式,并尽可能优化性能,获得悬浮窗等系统权限。

总结

待续……

向日葵

夏天的中间,我搬到了离工作很近的地方。骑车需要十分钟,路上会经过很大一片花田。延伸到森林边缘的紫色,开过了整个夏天。燃烧殆尽,花穗只剩了白色。仅仅过了几天,一片看似荒废了的土地,向日葵压着杂草生长起来。向日葵田在路的转角。骑车经过的时候,总是会望着它们。

这一段不长,只有公路和两旁的树林,草地,溪流。上班和下班的时候,只有一辆旧自行车的我,独自消化着不知从哪里来的想法。人大多是实实在在地活着。出与归,作与息。幸福感来自无忧且知足,禁忌是:改变。

平平常常,短暂停留于世的花,不是轻易让人欣赏的。它们的孤高,无畏,从未随随便便生长。无法选择天气和土壤,也要用尽方法获取阳光和养分。

我羡慕那些还在困境中挣扎的人,因为挺过困境之后,其实什么也没有。

夏天已经结束,这片向日葵田也时日无多。它们只有一个夏天,而我们有几十个。

戚风研究报告

从零开始做蛋糕。

材料

面粉:芬兰超市里一般有三种面粉,包装上面画着面包的,画着蛋糕的,还有画着面条。用途就和画的一样,应该不会买错的。

牛奶:芬兰有三种牛奶,不论品牌都可以按包装颜色区分。红色的是全脂牛奶,深蓝色的是半脱脂牛奶,浅蓝色的是脱脂牛奶。我现在用的是半脱脂牛奶 kevytmaito。

色拉油:我用葵花油替代了。其实菜籽油,花生油都可以。专用的色拉油只是这些油提纯过,去除了味道而已。因为想省钱就没有专门买。可能用色拉油味道会更好一些。

鸡蛋:买最便宜的就好。

砂糖:大包的那种最便宜的。

嗯,用不到黄油。

巧克力坚果也别加。

不要在里面放水果。

把你的葡萄干收好。

配比

鸡蛋:5 个

砂糖:90 克(30 克用于面糊,60 克用于蛋白霜)

面粉:80 克

牛奶:40 毫升(40 克)

色拉油:45 毫升(40 克)

称量方法:我只有一个很便宜的量杯,它有三种刻度,分别测量液体体积,面粉重量,砂糖重量。液体材料我都用体积记录了,牛奶的密度大约是 1 克/毫升,油的密度是 0.9 克/毫升。

打发

蛋清必须完全不含任何蛋黄和水分,必须用电动搅拌机。

  1. 先搅拌到产生大量细小泡沫的膨胀状态。
  2. 加入 15 克糖。
  3. 继续搅拌到表面出现些许褶皱。
  4. 加入 15 克糖。
  5. 继续搅拌到能戳出坑,但能缓慢复合的程度。
  6. 加入 15 克糖。
  7. 继续搅拌到能戳出坑,且很难恢复的程度。
  8. 加入 15 克糖。
  9. 继续搅拌到能戳和拉出的形状比较锐利的程度。

其实也不用这么复杂,只要记住糖要晚点加分几次加,然后搅拌得足够久,让蛋白霜有点硬硬的,能成型感觉就行了。

面糊

  1. 加入蛋黄。
  2. 通过筛子筛入面粉。
  3. 倒入牛奶。
  4. 倒入色拉油。
  5. 手动搅拌。

尽量多搅拌,搅拌到均匀没有结块的感觉。可以用搅拌器拉起来看看能不能形成一张膜。

混合

将面糊倒到蛋白里,或者反过来?两种做法我都试过,好像没有什么差别。

用橡皮刮刀从下到上翻几下,然后将刮刀插进去,横着划一遍,竖着划一遍,重复几次。这个动作可以找网上的视频看看。直到颜色比较均匀了为止。不能搅拌太久,气泡会消失的。

搅拌之后倒入大约 8 英寸 / 20 厘米直径的圆形模具中。然后重重地在桌子上 Duang 几下,将里面的大气泡震出来。一些中等大小的气泡不可避免的会留在里面。

烤制

  1. 先预热烤箱到 140 摄氏度。
  2. 烤 25 分钟。
  3. 升温到 170 摄氏度。
  4. 烤 35 分钟。
  5. 拿出来迅速倒扣在案板上放凉。底下垫两根筷子啥的可以让蒸汽散出。

这个过程可以避免两个问题:鼓起塌陷。先用低温烤定型,可以避免鼓起。拿出后倒扣放置,可以防止塌陷。

这个方案尚不完善,持续修正中。

成品

2017 年十月 23 日。烤制时间不够,是 140 度 25 分钟 + 170 度 35 分钟。高温烤制时间应该延长。

继续实验中,持续更新……