Recent Posts

Kouga's avatar

Ghost 这个博客升级真是烦死了喵!

从 0.x 时代开始用的这货,竟然弄了个断崖式升级喵喵喵!所有 1.x 之前的数据无法直接导入到 2.x 喵!

于是升级流程就变成了(卧槽这货的编辑器支持中文输入法也有问题喵个咪……)

  1. 将0.x时代的所有博文用 JSON 导出(前提是你的 0.x 博客还能启动,此时推荐NVM来安装 node 6.x.x LTS 版本启动);
  2. 安装 Ghost Cli 工具(建议 nvm 切换到 8.x.x LTS 版本);
  3. 安装 Ghost 1.x 版本(只是过一遍数据,本地即可) ghost install local --v1 --db=sqlite3
  4. 在 1.x 的控制台上导入 0.x 时代的 JSON 文件,再导出一份 1.x 的JSON文件备份;
  5. 尝试直接升级 Ghost ghost update ,如果成功应该能升级到 2.x 的当前版本;
  6. 如果 步骤5 大量出错不可解,新建个文件夹再次安装 Ghost 当前版本 ghost install 然后尝试导入 步骤4 导出的 1.x JSON 备份文件;

如果以上都不行,那还是放弃这个平台比较好喵……我导入后只是不少文章顺序混乱了,但是都还在喵……

参考链接🔗:

IceHoney Blog's avatar

后端开发的技术总结

说实话,最近前端开发的事情并不是很多。所以自己也慢慢开始做后端开发,逐渐向全沾工程师靠拢。现在的开发工作,分工分明,后端也只需要专注API的请求与返回就好了。

API文档

使用API Blueprint作为API规范,并使用RSpec API Blueprint来自动生成文档。 生成的Markdown文件,可以很方便的转换成网页便于客户端开发。例如这个工具aglio

后端开发

现在采用的开发技术框架是Ruby on Rails。不得不吐嘈一句,Ruby on Rails在日本真是压倒性的流行。Ruby on Rails还是MVC架构,原生支持RESTful API。但我觉得下一代的接口标准应该是facebook推出的GraphQL,不过先阶段RESTful API也足够了。

Models

Models主要是用来描述数据库结构,表与表之间的关系。还可以定义对数据库操作的方法,数据之间复杂的业务逻辑基本都是放在这里。

Views

Views主要是用来定义相应的数据的格式,把数据整合成统一的JSON标准供客户端使用。

Controllers

Controllers是请求的入口,用来定义请求的参数,并接收请求进行参数的过滤处理。然后调用Models里定义的方法完成数据的操作,并调用Views来完成数据的响应。

权限管理

权限管理是一件非常复杂的事情,定义某个接口在什么条件下可以调用,需要检查用户是什么身份。所以推荐是使用现有的成熟框架来进行管理。这里使用pundit来管理各个请求的权限检查。

软删除

在实际的项目中,我们需要进行软删除操作。例如用户加入了某个组织,以组织成员的身份发表了文章。当用户退出这个组织的时候,我们并不能直接删除数据库记录。否则无法显示文章的作者。这时候我们就需要软删除操作,对用户来说这条记录已经消失了。但对开发者来说,这条记录还是需要的。我们也使用框架来解决这个问题,这里采用的是Paranoia

测试

后端开发是偏向于纯逻辑的开发,所以测试非常重要。正常情况下的输入输出非常简单,代码的80%都是需要考虑到各种各样的边界条件。需要考虑到用户的各种不同情况下的操作,给出合适的错误提示。所以需要完善的测试来覆盖所有场景,这里采用的是e2e测试,模拟请求,测试后端服务器的响应输出是否符合预期。采用的测试框架是rspec-rails

参考:

Ruby on Rails Guides

Roy Binux's avatar

少女前线拖尸脚本 和 生成它的可视化工具

最近在玩少女前线,这是一个手机游戏,over。不是,就真的没有什么好讲的嘛,了解的人早有耳闻,不了解的就只要知道这是个手机游戏就好了,嗯。

然后,我会好好地,正常地,氪金地去玩这个游戏吗?不可能的,玩游戏哪有破解它有意思呢。当年破解 Ingress 是因为它用的 HTTPS 通信的,算是本行。百万亚瑟王是因为别人已经逆向好了,我只是写了一些 bot。现在这么办,玩不了了吗?作为一个不会安卓,不会逆向,不会汇编的菜鸡,那我只好上按键精灵了啊。于是乎,我找到了这个: AnkuLua

AnkuLua 是一個專注在自動化的Android App
基本自動化動作有:

  • 抓取螢幕並找尋指定圖案
  • 對找圖結果採取使用者要的動作(例如點擊、抓放(drag and drop)、打字…等等)

最重要的是,它能运行 lua 脚本!虽然我是一个不会安卓,不会逆向,不会汇编的菜鸡,但是我会 lua 啊。

ankulua-vision

不过,在使用过程中发现,找寻指定图案,需要不断截图/裁剪,这样太麻烦了。于是我又用 electron 做了一个可视化的截图资源管理器 ankulua-vision,像这样的:

基本思路就是,一般游戏是由众多 UI 界面组成的,点击某个按钮能跳转到某个界面上去。那么通过截图,标注识别区域,那么程序就能知道游戏现在所处的界面。通过标注按钮区域,那么只需要 goto('battle'),程序就能自动规划从当前界面到 battle 的可行路径,然后点啊点啊就完成需要的操作了。这样一方面不需要自己去裁剪图片了,另一方面通过框架代码,在运行过程中能够有更多的错误检查,自动应对可能出现的各种异常。

理论上,对于点啊点的游戏,是能实现无代码的。即使不能,对于复杂的动作,也可以通过 lua 拓展。

源码在这里:https://github.com/binux/ankulua-vision

你依旧需要在安卓手机或者模拟器中安装 ankulua,然后加载生成的 start.lua 脚本。默认自带了一个简单的循环逻辑,运行后可以直接图形化界面配置运行。当然你也可以通过 lua 脚本拓展,除了 ankulua 本身的 API 可用之外,你也可以使用 stateMachine 这套界面跳转逻辑 API,重用简化步骤。stateMachine 的 API 在 README 中有简略的文档说明。

源码使用 GPLv3 或 MIT 许可证,取决于第一个有效 PR(例如 fix typo 不算),如果第一个 PR 之前有商业化需求或者 PR 作者要求,则 MIT。

少女前线拖尸脚本

WARNING: 任何使用脚本的行为都是官方禁止的,我不对下文所述任何内容以及其后果负责

于是,这里就是 少女前线的拖尸脚本:

https://github.com/binux/binux_github_com/releases/download/gf/shojo.zip

同时它也是一个 ankulua-vision 的项目,你可以通过 ankulua-vision 打开这个项目目录,调整截屏或者按钮位置。

脚本实现的功能

  • 43e, 02, 52n 拖尸
  • 自动重启后勤
  • 自动强化或者分解人形
  • 自动修理

使用方法

  1. 根据 [填坑结束?][失了智]萌新向拖尸教学帖[更新8-1N相关] 一文准备好打手和阵型,一队练级队,二队补给队,52n 还需要 3 队狗粮队。
  2. 解压拷贝脚本到手机中,在 ankulua 中加载 start.lua。
  3. 在启动界面中选择你的两个打手(每轮结束后,两个打手会交换),选择拖尸任务,如果仅自动后勤,选择 null 就好了。

其中 52n 会在战斗中撤退 5, 8 号位 (见 NGA 文 “43e的说明” 展开部分),02 在选择 m4a1 时会撤退 1, 7 号位。

然后开始吧!

WARNING: 任何使用脚本的行为都是官方禁止的,我不对上文所述任何内容以及其后果负责

over

依云's avatar

获得高精度环形镜子一枚

本文来自依云's Blog,转载请注明。

如图:

这面镜子上边有好几百G数据呢,然而早已读不出来了。

镜子来源于九年前的西数移动硬盘。因为太老了所以坏掉了吧,反正是识别不了了。最近看到 YouTube 上有人各种折腾硬盘,群里又有人拆了好几面镜子出来,所以我把它找出来拆啦。这镜子比我那总也擦不干净的丽塔芙镜子清晰多了呢,就是小了点儿。

拆起来也不难。首先想办法把壳弄开。然后见着螺丝就旋下来,见着贴纸就撕掉。那覆盖一个螺丝孔的小圆片不用撕下来,直接螺丝刀往中间捅,然后把螺丝旋下来就好了。

覆盖磁头的那块金属有两个螺丝,其中一个在洞里。它上边有块形状奇怪的磁铁,照片里吸了很多螺丝的就是了。磁头是直接翻个面,让重力把它拉下来就可以了,我之前以为还有螺丝之类的还弄了好久呢,结果手一翻它自己掉下来了。马达中间那个螺丝很不容易取下,因为整体会跟着转。我是用剪刀卡住它的两个洞才给旋下来的。剩下的手拆就可以了。

ホロ's avatar

利用 XMPP 和 OTR 进行私密聊天

基本上就是某篇文章的翻版……

Felix Yan's avatar

请不要把 Wifi Dongle 翻译成加密狗

在许多翻译过来的文本里,无线网卡(Wifi Dongle / Wifi Adapter)被翻译成了“加密狗”。最近在微博大火的一篇《俄罗斯特工又蠢了!实名行动暴露自己还卖了300多特工队友…..》里面,又出现了类似的错误,让我不得不想说说这个问题。

先来看看这个例子:

文章描述了几个黑客在目标附近发射伪造热点钓鱼,此处的未翻译单词包括了 Wifi 和 Dongle。根据上下文,带一个无线网卡发射热点应该是正确的意思,而加密狗在这里和上下文没啥关系……

我尝试在搜索引擎里搜索对应词组,很不幸,惨状令人叹息:

就连正规电子产品的用户界面都中了枪:

这个问题的来源,看起来是国内加密狗早年被简单称呼为 Dongle:

Dongle,按照维基百科的解释,是和 Adapter(适配器)很类似的一个词,泛指了一大类连接、转换器。

Wireless/Wifi Dongle = Wifi 适配器,Bluetooth Dongle = 蓝牙适配器,以此类推。所以,在看到类似 USB Dongle 这样模糊名字的时候,请务必联系上下文。如果原文用了 Wifi Dongle 这样比较明确含义的词组,请翻译为 Wifi 适配器,或者无线适配器,不要再翻译成加密狗了。

17windy's avatar

[美羽释厄录]更新预告

0.92更新预告(进行中):

1,主菜单UI美化

2,载入功能升级,实现战斗场景同步加载(即载入显示完成即可玩)

3,伤害系统重做,以期整体提升游戏性能减少卡顿

4,部分敌人刷新行为修改(影响全部小怪关卡)

5,美羽武器系统数值平衡

6,三大BOSS战继续完善,为不同BOSS增设不同的子弹造型,调整战斗难度,掉落物调整

7,商店场景为可购买物品增加鼠标悬停时的提示(可选,低优先度)

8,斩龙剑性能改造

9,BOSS战胜利自动消除全部子弹

0.91更新(已完成):

1,商店UI优化,商店物品价格调整

2,游戏场景载入时间可感觉的优化缩短

3,降低敌人普通小弹的伤害,大幅降低敌人追踪导弹的伤害

4,增加美羽初始弹药的伤害触发范围,稍微增加美羽初始弹药的伤害,稍微增加刀风类射击的射程

5,Level9 BOSS难度调整(P2弹幕修改、受弹面正常化、稍微降低防御力)

6,Level1+2难度降低

7,三路射击鱼形怪物首次射击延后0.5秒

8,主菜单开始游戏部分菜单底部增加当前Gems数量显示

9,所有战斗场景增加了暂停功能(Esc)

10,修复主菜单的语言本地化设置

11,修复Level6蛙人BOSS战不出小怪的问题

cunky's avatar

Cloud-Torrent搭建日志

很多人买了VPS以后 会出现资源闲置的情况
今天就给大家介绍一下Cloud-Torrent这款简单好用(还行吧XD)的BT下载工具

链接

GitHub项目:https://github.com/jpillora/cloud-torrent

准备

你需要一台能用的VPS 我这里用的是一台OVZ的小机子

安装

安装Cloud-Torrent十分简单
在终端输入

curl https://i.jpillora.com/cloud-torrent! | bash

即可
附:Cloud-Torrent最新版本:https://github.com/jpillora/cloud-torrent/releases/latest
成功安装以后输入 cloud-torrent --help 可以查看帮助

接下来是启动Cloud-Torrent

cloud-torrent \
  -t 'Cunky' \
  -p '9090' \
  -a 'cunky:testest0744'

完成后即可通过 http://ip:port 进入Web管理界面
注:cunky为用户名 testest0744为密码
其他安装方法 如docker等请参考GitHub的Cloud-Torrent项目
这里建议安装SSL证书保证安全性

使用

如图

可以直接将种子拖进去 也可以直接上传 或者填写磁力链接
我这的机子测试最高到过50MB/s
这个也可以结合脚本和Rclone来用 都是不错的

17windy's avatar

[美羽释厄录] 0.91先行版 发布贴 10.02.2018更新

0.91更新日志:

1,商店UI优化,商店物品价格调整

2,游戏场景载入时间可感觉的优化缩短

3,降低敌人普通小弹的伤害,大幅降低敌人追踪导弹的伤害

4,增加美羽初始弹药的伤害触发范围,稍微增加美羽初始弹药的伤害,稍微增加刀风类射击的射程

5,Level9 BOSS难度调整(P2弹幕修改、受弹面正常化、稍微降低防御力)

6,Level1+2难度降低

7,三路射击鱼形怪物首次射击延后0.5秒

8,主菜单开始游戏部分菜单底部增加当前Gems数量显示

9,所有战斗场景增加了暂停功能(Esc)

10,修复主菜单的语言本地化设置

11,修复Level6蛙人BOSS战不出小怪的问题


经过一段时间的开(gu)发(gu)惭愧,美羽释厄录先行版终于发布啦!希望各位朋友能够喜欢:)

游戏类型:

横版飞行射击

游戏主题:

东方+喵窝

游戏作者:

17windy

游戏版本:

先行0.9版

已知问题:

分辨率自适应脚本存在问题,切换分辨率数字标示不明确

游戏UI还很简陋,将在未来继续完善

虽然经过了大量的优化工作,部分战斗仍存在少量掉帧问题…

语言本地化未完工(道具部分多语言问题很大),目前暂以中文文本为主

部分场景载入速度较慢

首发网站:

17.works


感谢释萝对于黑洞背景和美羽人物形象设计的付出。

该版本游戏不用于任何商业目的,欢迎下载试玩,可在不修改游戏安装包并注明作者的情况下随意转载。


先行版目前暂时只提供windows版,还望谅解。

下载链接:

0.91版

下载 Miu DB V0.91
点击次数: 27, 文件大小: 233.9 MB, 日期: 2018 10月 02

0.9版

下载 Miu DB V0.9
点击次数: 11, 文件大小: 240.4 MB, 日期: 2018 10月 01

百度云分流:

0.91版 链接:https://pan.baidu.com/s/1cnWUV-QuDKuZ2rfO9QKtyA 提取码:8dmk

0.9版 链接:https://pan.baidu.com/s/1v2UfCHoyUyoct5AmZfofVA 提取码:0zx7

Phoenix Nemo's avatar

重构 StickerSetBot

关注 Telegraf 有一段时间了。特别是最近 Telegram 上 spammer 猖獗导致 Telegram 对于用户行为限制越来越严格,由此想过写一个简单的 bot 来处理加群请求之类的。

总之原因都是没时间。终于搞定一些事情之后发现之前瞎写的 Telegram 导出贴图 bot 居然备受欢迎…正好 Telegram Bot API 也更新了,来重构吧!

拆分逻辑代码

最头疼的事情首先是当时写这 bot 的时候只顾着考虑各种情况,逻辑像流水一样全部写成一坨。虽然实际不复杂吧但这不是 best practice。于是把每个功能单独拆出来先。

on('command') 的逻辑代码整块移出来作为 handler,然后能够原子化的功能再单独拆分成函数调用。目前的效果虽然还是有不少逻辑层在 handler 里,但是基本达到了比较方便维护的目的。

handler 本来就是拿来写逻辑的啊摔

接下来再清理冗余代码和各种 hard code,加了两个方法让代码看起来更整洁一些。于是就先这样。

迁移框架

好在 Telegraf 和之前用的框架在参数上很多兼容,所以这没有花太多时间。顺便尝试采用了一部分 ES6 的风格,嘛…果然不喜欢。

所以就不要吐槽为什么 ES5 和 ES6 的风格混写了。

之前要一大长串的传参现在只要一个 context 了好方便啊。中间件也好方便啊~

以上。

调试:无尽的 bugfix

并不指望一通大换血之后的代码能一次跑起来…但是没跑起来的原因是我传错了中间件值这不能忍!!为什么一会儿传的是函数本体一会儿传的是函数调用啊摔!!

而且这问题还让我调了两个小时!!!

调通了之后就很舒服了

遇到的坑还有 context 本身不能当 session 用,然而不想再引入 session 中间件于是自己写了个超简陋的内存 session。就是为了多语言支持。因为一觉醒来发现这 bot 语言莫名其妙变中文了(messages 成了全局变量 = =

当然还有 Telegram 自己的坑,比如什么贴纸就是死下载不能然后整个程序就 hang 着了。

一键导出贴纸包

终于!Telegram bot API 添加了 StickerSet 类型。只要有贴纸包名称,就可以获取整个贴纸包的信息。考虑不改变用户习惯的情况下(你哪有什么用户啊可恶)对本身处理贴纸和其他消息的函数做了修改,顺便又拆了俩函数出来(怎么代码越来越多了啊喂!

最后结果就是没有一屏看不到头的函数啦~(你快够

以及加入了用贴纸包链接导出一整组贴纸的功能,算是真正意义上的 StickerSetBot 了。

然后贴纸过多卡死了 Telegram 的 ratelimiting

直接导出单张贴纸

既然功能拆分了那也就方便加更多别的功能啦。比如不新建任务,直接甩过去一张贴纸来获得 PNG 文件~

这只 bot 在这里,源码在这里。欢迎各种玩坏~(记得去发 issue

就酱(,,•﹏•,,)

依云's avatar

每次修 Python 代码的 bug 的时候总会想念 Rust

本文来自依云's Blog,转载请注明。

俗话说:由俭入奢易,由奢入俭难。

之前写 Python,老是在实现完一个特性之后,弄出来几个 AttributeError: 'NoneType' object has no attribute 或者 TypeError: list indices must be integers or slices, not str,还有 TypeError: can only concatenate str (not "int") to str 这样的错误。一看就明白自己又是哪里一不小心疏忽了,稍微修一下就好。

后来啊,我遇见了 Rust,整个流程就变了。之前写的时候,基本上都是通过手动测试来发现这种问题。为了高效、不破坏性地测试,需要控制测试的数据量,需要保证出错的时候相关的数据不会处于某种中间状态。当然在服务器上跑的脚本,我还要来来回回地传更新的脚本,或者弄个本地测试环境。而这一切,可能不过是为了跑一个成功之后再也不会用到的小程序,比如之前分析抓包数据的那次。而在 Rust 里,这些最容易犯的错误,cargo check 一下,编译器基本上能全给你指出来。所以有时候写一些小工具我也用 Rust,虽然写起来慢,但写好就能正常运行,不用反复试错,多好啊!

最近给 Arch Linux 中文社区的自动打包机器人 lilac 增加新特性。结果实现完部署之后,夜里就被 lilac 叫起来修 bug 了,还一下子就是仨……(lilac 很难本地测试,而短暂地服务中断又没多大影响,所以我都是不进行本地测试的。)

第一个 bug 是,与 dict.get 不一样,getattr 是没有默认值的。Python 里这种不一致很多,比如 configparser 里默认值要用关键字参数指定。Rust 遇到类似的情况,就会返回一个 Option。或者如果 API 决定如果不存在就 panic 的话,那么它就会直接返回我要取的值的类型,而不会包一层 Option。而我后边的代码是预期到这里可能取不到那个属性的,所以弄错了就会类型不匹配。

第二个 bug 是局部变量在一个分支上没有初始化。Rust 当然不会允许这种情况了。实际上 C 都不用担心这种问题,编译器会给出警告的,还有一些 linter 可以用。而 Python,很遗憾的是,我所使用的 pyflakes 并没有对此发出警告。我当然知道 pylint 那些。我很讨厌 pylint 和 jslint 这种不区分潜在 bug 和风格问题的 linter。我只需要工具在我可能疏忽的时候提醒我,而不需要它对我的编码风格指指点点,特别是那些指指点点往往是不对的。比如我的文件描述符变量名不叫 fd 难道要叫 fildes?

第三个 bug 是一个可能为 None 的变量我忘了先作 is not None 判断。这段代码如果初写的话我肯定是会注意到的,但是改的时候,只想着如果 pkg 里有冒号我得处理一下,就忘记了根本没有关联的包名的情况。Python 的 None,以及 C 和 C++ 的 NULL、Java 的 null、Lua 和 Ruby 的 nil、JavaScript 的 undefined 和 null,被称作是十亿美元错误,给无数程序员和用户带来了无尽的 bug。幸好这个东西在 Rust 里不存在:表达「没有值」的值没有被作为特殊值存在于几乎所有类型中,而是作为一类类型的可能的值之一。想要使用「正常」的值,就需要显式地进行类型转换,所以不可能被不小心忽略掉。顺便说一下,Go 里也有 nil 这种东西,以至于会出现这种不容易发现的 bug

Python 现在也给出了解决方案:类型注解,提供类似的类型检查。不过检查器是第三方的,也并不十分完善。等我找到机会试用过之后再来写感想啦。

Felix Yan's avatar

Thunderbolt 3 eGPU Bumblebee 方案尝鲜

最近从公司淘了一块 GTX 1060,淘宝了一个显卡盒折腾 TB3 eGPU 方案。由于笔记本经常带出门,打算采用即插即用的 bumblebee 方案(回家插上盒子用独显,拔下盒子可以带出门,可以正常待机不用重启)。下面记录一下 Arch 上配置的步骤和遇到的坑。

1、准备软件包

# pacman -S bumblebee primus lib32-primus nvidia-dkms lib32-nvidia-utils bolt

2、修改 bumblebee 配置

修改 /etc/bumblebee/xorg.conf.nvidia,在 Section “Device” 中加入:

Option "AllowExternalGpus" "true"

修改 /etc/bumblebee/bumblebee.conf,在 [optirun] 中修改:

Bridge=primus

3、插入 TB 线,验证设备(不建议完全关闭设备验证!)

输入 boltctl 查看设备信息,记下设备的 uuid。

$ boltctl
 ● TUL TBX-550CA
   ├─ type:          peripheral
   ├─ name:          TBX-550CA
   ├─ vendor:        TUL
   ├─ uuid:          00xxxxxx-xxxx-xxxx-ffff-ffffffffffff
   ├─ status:        authorized
   │  ├─ domain:     domain0
   │  └─ authflags:  none
   ├─ authorized:    Fri 28 Sep 2018 08:23:25 AM UTC
   ├─ connected:     Fri 28 Sep 2018 08:23:21 AM UTC
   └─ stored:        Thu 27 Sep 2018 05:22:07 AM UTC
      ├─ policy:     auto
      └─ key:        no

验证设备并设置为自动验证:

$ boltctl enroll --policy=auto 00xxxxxx-xxxx-xxxx-ffff-ffffffffffff

4、启动 bumblebeed

# systemctl start bumblebeed

5、测试、运行程序

$ optirun glxspheres64
Polygons in scene: 62464 (61 spheres * 1024 polys/spheres)
Visual ID of window: 0x13f
Context is Direct
OpenGL Renderer: GeForce GTX 1060 5GB/PCIe/SSE2
……

6、安全删除设备(参考了 jpamills 博客里的脚本)

#!/bin/bash

secs=5
tbt_chain=/sys/bus/thunderbolt/devices/0-0/../../../..

echo "Unplug eGPU script started."
if [ "$(id -u)" != "0" ]; then
        echo "Please run using sudo. Exiting."
        exit 1
fi

systemctl restart bumblebeed
sleep 2
modprobe -r nvidia_modeset
modprobe -r nvidia-uvm
modprobe -r nvidia

if [ -e $tbt_chain/remove ]
then
        echo 1 > $tbt_chain/remove
        echo "Thunderbolt chain removed from PCI tree. Please unplug eGPU now."
        while [ $secs -gt 0 ]; do
                echo -ne "$secs to rescan...\033[0K\r"
                sleep 1
                : $((secs--))
        done
        echo 1 > /sys/bus/pci/rescan
        echo "Rescanned the PCI bus. Completed."
        exit 0
else
        echo "eGPU does not appear to be attached. Exiting."
        exit 1
fi

如果和我一样在盒子上插了外置硬盘,还可以在脚本里加上相应的 umount 语句。删除设备时需要先把使用设备的程序退出。

效果展示

剩下的问题

  • 脚本里可以考虑通过判断 nvidia-smi 列出的 PID 自动杀掉所有还在用卡的进程
  • Vulkan 应用程序暂时无法使用外置卡运行(仍然使用集显),可能需要 bumblebee 提供支持
Phoenix Nemo's avatar

想要导出 Telegram 贴图

Telegram 上出现了越来越多的优质贴纸,想要把这些贴纸用到其他 IM 平台上的时候就会比较麻烦,所以一直想要一键导出一个贴纸包的功能。

可惜的是,Telegram bot API 的限制,并没有任何简单的办法通过贴纸消息获得贴纸包的信息。寻找另外的途径,例如 telegram.me 的贴纸链接会定向到 tg://addstickers?set=[StickerSet]。搜索了一下现成客户端的源码,都是交给 MTProto 的 API 处理,也没有明确的解析过程。而这些客户端所调用的 messages.getStickerSet 也没有在官方的文档中列出。(吐槽:Telegram 的协议、文档和代码真是糟糕,查阅的时候我的表情一直是 黑人问号.gif

由于最近状况不是很好,所以只好暂时放弃继续读 webogram 的源码。因为读 Angular 的东西实在是折磨…

所以依然是选择直接发 sticker 再转为图片发给用户的模式。这样的已经有了相关的 bot,于是改为多个 sticker 打包、支持多语言、支持 jpg 和 png 以及批量缩放功能的 bot。需要安装 Node.js v4.0 及以上版本和支持 webp 的 ImageMagick。

虽然实现效果看起来还可以,但是并未实现最初希望的功能,所以只能是练手用的轮子而已。不过,这个轮子稍微尝试了一些新的东西。例如超简陋的内存数据库,而且很多细节考量更加周到,例如任务锁虽然不是写过最麻烦的,不过应该算是相对完善的。当然也考虑了内存数据库的手动释放以防内存爆炸为此还特地在群里讨论了 object children 被 undefine 而 object 其他 children 还在被引用的状态下是否可以回收部分内存的问题

源码的实现非常简单,但是好久不写代码还是手生,折腾了一下午写功能加一晚上和朋友们 debug。读源码戳 GitHub

这里有一只 bot 跑在测试环境,所以可以尝试一下。如果没理你说明沙盒没开,那么就请自己去跑源码来使用辣ᕕ(ᐛ)ᕗ

有几点坑,比如这个 node-telegram-bot-apionText 方法无法正确匹配 Negative Lookahead 的正则表达式(不应该啊…然而没深究),adm-zip 非常非常不好用,jszip 文档表述不清 API 调用复杂然而用起来了就还不错。

但是最坑的是,只为实现这么一个简单功能的 bot,我的 node_modules 目录下居然有

1
2
Phoenix-X1-Carbon :: js/telegram-stickerimagebot/node_modules ‹master› » ll | wc -l                                                                                               1
104

WHAT??? 104 个依赖包!!!

真是可怕…明明我已经尽可能减少不必要的依赖了…

===== 2018/9/28 更新 =====

Telegram bot API 更新了(早就)

于是这只 bot 可以一键导出一组贴纸了。详情

ホロ's avatar

扫盲 XMPP(Jabber) - 一个自由开放的即时消息协议

这标题的命名方式哪里眼熟……

想和谁在网上聊天的话,可以用的 IM 软件有不少,当然槽点也很多(这家伙要求真多.png):

  • WhatsApp , Line 之流: 从客户端到协议都是私有的,以及似乎有向审查屈服的倾向?
  • Telegram ,服务端是私有的,官方客户端的源代码经常咕咕咕……
  • Signal 和 Wire ,虽然服务端和客户端都是自由的,但是有人成功运行起来自己的服务端嘛 🤔

……

于是是时候试试看 XMPP 啦(编不下去了.webp.png 😂)

XMPP 是啥?

可扩展消息与存在协议(XMPP,全称为Extensible Messaging and Presence Protocol,前称Jabber) 是一种以XML为基础的开放式即时通信协议,是经由互联网工程工作小组(IETF)通过的互联网标准。

Jabber是一个开放源代码形式组织产生的网络即时通信协议。XMPP原本是为即时通讯而量身定制, 但由于XML Stanza本身是XML元素,在基于XML灵活发展的特性下,使得XMPP也可以适用其他方面, 已经得到了IETF的批准。XMPP与IMPP、PRIM、SIP(SIMPLE)合称四大IM协议主流,在此4大协议中,XMPP是最灵活的。

(从维基百科抄的(雾))

有不少聊天软件是 XMPP 的实现,例如 Google Talk 和 Facebook Messenger,以及 AOL 和 一些网络游戏的聊天等。

因为传送的是 XML 嘛,所以 XMPP 协议本身十分灵活,不过传送二进制文件来就稍微有些困难了(不过有不同的扩展 可以提供文件上传等功能)。

和电子邮件一样, XMPP 也是非中心化的协议,可以均衡负载和对抗封锁。当然有可以多处登录啦, XMPP 通过优先级来 区分不同的设备,优先级高的设备会收到相应的消息(有人认为这是个缺点,于是有了 MAM 在不同的设备间同步消息)。

XMPP/Jabber实现多人聊天(MUC,Multiply User Chat)是采用聊天室的方式实现的,形如 room@domain.tld 的形式, 用户可以添加这个聊天室进行群聊,不过介于不少客户端不支持群聊加密,于是 XMPP 更多的还是以私聊为主。

注册一个 XMPP/Jabber 帐号

因为 XMPP 是个自由开放的协议啦,所以网上有很多公开的 XMPP 服务, 这里 有一个大而全的列表。 但是如果汝只是想找个速度合适的服务器的话,BLUG 整理出了一个 经过测试的部分 XMPP 服务器清单

可以看到大多数的 XMPP 服务器对注册没有任何要求,只需要汝选择一个 Jabber ID 然后输入密码就 OK 啦, 当然这么做的后果之一就是忘记密码就不能找回了,所以创建一个强密码并记住它特别重要。

除了在网页上注册以外,不少服务器也支持在客户端上注册,所以……

安装一个 XMPP 客户端

不同平台上可以推荐的客户端有很多:

  • 比如跨平台的 Pidgin (顺便还可以跨协议,但是 Pidgin 支持 XMPP 是挺优秀的)。 Windows 可以从 https://pidgin.im/download/ 下载安装包,GNU/Linux 可以从包管理器安装,或者下载源代码编译
  • macOS 用户可以安装 Adium,可以从 https://adium.im 下载。
  • iOS 用户推荐 ChatSecure,可以从 App Store 下载安装。
  • Android 用户推荐 XabberConversations 前者支持 XMPP 中常用的 OTR 端到端加密, 后者支持 MUC 和新的 OMEMO 和 openPGP 加密。

每一个 XMPP 客户端的登录和注册方法都不尽相同,但都比较简单。这里就偷个懒不指导啦 😂

和好友聊天或进行群聊

添加汝好友或群聊的 Jabber ID 就 OK 啦~

加密聊天

主要说的是端到端加密,毕竟 8102 年了,传输加密已经是刚需了吧 😂

目前 XMPP 中常用的端到端加密方式有三种 ,都是通过非对称加密实现的:

  • OTR(Off-the-Record Messaging,不留记录即时通讯) 是 XMPP 中最常用的端到端加密方式,被大多数客户端所支持。加密迅速而且前向安全。 缺点是更换客户端或重新登录时 OTR 指纹会发生变化, 可能会无法保证消息身份的一致性而需要重新验证。以及对文件的加密尚未标准化(不同客户端加密的文件 可能无法相互存取,因此习惯是发送文件的链接),另外称为下一代 OTR 的 OTRv4 正在开发中。

Pidgin 通过插件可以支持 OTR,上面介绍的客户端中除了 Conversations 都支持 OTR。

  • OMEMO(OMEMO Multi-End Message and Object Encryption,OMEMO 多终端消息和对象加密) 是 一种新型的端到端加密协议,可以跨设备同步加密的消息记录和文件,验证起来也比较简单( 因为都盲目信任了? )。 不过除了 Conversations 以外好像都没支持好的样子……
  • openPGP 也能用于 XMPP 的端到端加密,不过毕竟是面向邮件的非对称加密,客户端不一定都支持 (Gajim、Psi+ 和 mcabber 支持)速度可能没那么快,还有可能把服务器娘累坏(雾)。

一些注意事项?

  • 因为大多数 XMPP 服务没有提供找回密码的功能,** 所以所以创建一个强密码并记住它!**
  • 传输加密是必须的,端到端加密最好也用上。
  • 端到端加密最好验证下双方的身份,除了传统的指纹验证以外 OTR 还可以通过共享秘密和问答验证。
  • 只使用自由开源的客户端, 这个不解释。

自己搭建 XMPP 服务器

好啊好啊,这就是非中心化服务的优势之一呢~

比较推荐的是 Prosodyejabberd , 前者轻量,配置简单。后者功能丰富,扩展性强。 咱就用 Prosody 搭了一个

读点别的?

https://tonghuix.io/2015/03/xmpp-chat/

⇪网页标题:弃用QQ和微信!全面转向基于XMPP(Jabber)的即时聊天

这篇文章简单的介绍了下 XMPP 的基本特点,也推荐了些不同平台的客户端。

https://beijinglug.club/wiki/lib/exe/fetch.php?media=xmpp-guide.pdf

⇪网页标题:XMPP(Jabber) 聊天快速指南

由北京 GNU/Linux 用户组(BLUG)成员编写的 XMPP 入门指南,图文并茂值得一读(?)

https://hardenedlinux.github.io/cryptography/2018/02/01/pidgin_xmpp_otr_debian.html

⇪网页标题:Debian/Ubuntu 用户使用基于 XMPP 即时通信协议的 OTR 保护隐私的标准化部署流程

介绍了 OTR 的原理, Debian 上使用 Pidgin 进行 OTR 聊天的流程,以及验证身份的一些技巧。

SgDylan's avatar

Tinc 笔记

Tinc 是一个 MeshVPN 网络的实现。
以下是这玩意的踩坑记录。

依云's avatar

永远不要 tail -f 管道

本文来自依云's Blog,转载请注明。

运维同事为了收集日志,配置程序将日志写入一个命名管道。然后他在外边拿 tail -f 去读,结果发生了灵异事件。通过 strace 可以看到,tail 进程读取了日志,但是却并没有再输出来。但是如果不启动输出日志的程序,而是在实例启动之后再进去往管道里写数据,却又是可以立即得到 tail 的输出的。

很奇怪的行为,一群人在那里研究半天,猜测是不是环境变量造成的啊,是不是放后台组执行造成的啊,是不是 XYZ 啊。——典型的「霰弹枪式」除错法

我当时也被带沟里了。于是跑去尝试复现,接着去读 tail 的源码。花了好久才明白这是一个很简单的问题:tail -f 的语义首先是 tail 这个词本身——先读文件最末尾的数据(默认是十行),然后再是 -f 选项的语义,即在文件更新时接着读取数据并输出。所以,当程序往里边写日志时,管道写端一直没关闭,tail 就一直读不到文件结束,也就无法确定最后十行是什么。当他们测试的时候,因为使用的是 echo shell 命令,打开文件、写入数据、关闭。这样 tail 一下子就读取到了文件末尾,然后把数据输出来了。接下来就是边读边输出了。

其实这种使用方法本身就很奇怪了,以至于这个执行流是兼容许多系统的 tail 的各种分支里,最最不常规、无可奈何的那一个分支。你都用管道了,cat 一下嘛。如果怕遇到管道被 reopen 的情况,就在 while true 里 cat 就好。

这个事件中,我也是见识了很多人解决问题的奇怪思路:「我猜猜猜。猜对了哦耶,猜错了,哎呀编程好难啊,Linux 系统好难啊……」猜你妹啊!你长的是大脑又不是骰子,用逻辑一步一步地取得结果不好吗!

有一个小游戏——猜数字。比如甲确定一个 1 到 1000 之内的整数,然后乙来猜。每当乙给出一个猜测时,甲回应猜对了,还是过大或者过小。如果乙知道什么叫二进制的话,乙可以保证在十次之内猜中的。

计算机系统和编程世界里,最棒的一点是确定性和逻辑性。虽然经常也不是像上例那样完全确定的,但至少比起人类社会要容易确定得多。特别是在有源码的时候。所以解决问题的路线也很简单,顺着问题的症状一路回溯,确认然后排除那些没有问题的部分,逐步缩小问题所在的范围,直接你看见它。就跟上边的猜数字游戏或者地毯式搜索一样。每一次猜测都是带着排除一部分没有问题的地方而去,而不是明明有证据表明某个地方不可能有问题,你还偏偏怀疑问题在那里,做无用功。

就像调查一个凶案,这些人放着有作案嫌疑的人不管,非要费劲地去调查那些有相当好的不在场证明的人。

Arch Linux 中文社区这边也有很多这种人。出了问题描述不清楚症状。新手嘛,没经验也没学习过如何描述事实,讲不清楚也没什么,引导对方获取截屏、日志,逐步排查问题就好了嘛。可就是有些热心人,喜欢提出自己的猜测。重点是:都不尝试证实猜测是否属实,就急着上解决方案。结果就是,我询问细节事实的消息没人理,求助者试试这个,试试那个,最终问题能否解决,就跟买彩票能否中奖一样,全凭运气。

AlisterTT's avatar

觉得有必要放点什么东西

突然发现最近一篇日志还是去年8月写的,这都9月了,一年没更新,还是随便写点吧。

分享个有意思的东西,关于皮神的奇妙旅行。

前两年基友在日本出差的时候,回来给我带伴手礼,选了个皮神的amiibo,刚好那两天要去Great Hall围观一个颁奖晚会,就顺手把皮神揣口袋里了,于是有了下面的照片:

Processed with VSCO with kk2 preset Processed with VSCO with hb1 preset

不出意外的话,这应该是历史上第一个在Great Hall里拍写真的皮神。

这两天刚好又有活动,去坝上那边参观,脑子一抽又把皮神揣口袋里了,于是有了下面的照片:

Processed with VSCO with c2 preset Processed with VSCO with hb2 preset

感觉还是棒棒的,以后出门都把他带上好了。

ホロ's avatar

听着节拍敲手指

这标题哪里眼熟……(划掉)

要是有一种游戏,它的唯一玩法就是按着音乐的节奏敲手指,要是有这样的游戏就好了。 但当时的我没有去做任何了解,只是将这个想法憋在了肚子里。 因为我觉得,这需求太小众了,才不会有人做这样的游戏的。

结果显然我错了,这样的游戏不但有,而且还有一大堆! 它们就叫做「音乐游戏」,简称「音游」。

听着节拍敲手指 - FiveYellowMice's Blog

不过按照维基百科的说法的话,音乐游戏其实还包括乐器模拟一类的游戏。而大家比较常说 的跟着节奏敲手指的那一类游戏的话,有一个更狭义的名称叫做节奏(动作)游戏 😂

所以下面所说的都是这种啦……

SgDylan's avatar

尝试在HEXO内嵌歌曲

SgDylan's avatar

在视频处理中使用SVP4

SVP 是一个不错的视频插帧工具,可以通过详尽的参数设定处理出适合自己的高帧率视频。
目前,SVP 的主要版本是 SVP4。
本次主要记录的是使用 SVP4 配合视频压制工具制作高帧率视频的过程。

依云's avatar

人生苦短,我用 skim

本文来自依云's Blog,转载请注明。

前两天我又看到了基于子序列匹配的字符串过滤工具 fzf 的绚丽效果了。实际上我很早就听说了这个工具,只是懒得动手配置。此次提及,我发现 fzf 已经在官方软件源里了,而我也正好有时间,所以打算试一试。

然后呢,Arch Linux CN 群组里艾穎初提到 skim 这么一个工具。了解了一下,这个就是 Rust 版本的 fzf,并且在 archlinuxcn 源里也有(git 版本,即 skim-git)。这太好了,就是它了!

skim 的操作很简单。文章开头的链接里已经有效果演示了。常用的也就是输入子序列去过滤,然后再输入一个进一步过滤,直到看到想要的。使用 ! 前缀可以反向过滤,^ 匹配开头 $ 匹配结尾。Ctrl-p/n 来上下移动。提示符那里也支持通常的行编辑。

到现在为止,我自行实现了 sk-cd、sk-search-history、sk-vim-mru 三个功能。另外使用了自带的 completion.zsh 文件。由于各种不满意,没有使用自带的 key-bindings.zsh 文件(也就包含 cd 和历史命令搜索功能啦)。

completion.zsh 里目前有两个功能。kill 时通过 ps 补全进程 pid。这个想法很好,以后我可能专门做一个通用的方便 strace 啊 lsof 啊 gdb 啊之类的用。

另一个是遇到两个星号(**)时按 Tab 补全,查找并替换成当前目录下的文件。

我实现的 sk-cd 是从 autojump 取目录列表,然后喂给 skim。于是就成了交互式的 autojump~这是一个我很需要的功能。原来我都是通过 Tab 补全列出可能的项,然后再 Tab 过去选的,有些慢也有些麻烦。

sk-search-history 就是在历史命令里找东西。因为遇到特殊字符时无法正确地加载预览,我并没有开启预览功能。反正找到的命令只会放在命令行上,并不会自动执行的,选错了可以及时取消。

以上两个功能分别绑定到 Alt-s d 和 Alt-s r 上。我使用 Alt-s 作为 skim 快捷键的开头,以便保留 zsh 原本的快捷键,避免冲突,特别是以后可能会有更多功能被加入。我在 Vim 里,也是类似的做法,Alt-q 是 easymotion 的开头快捷键,Alt-d 是 denite 的开头快捷键。

sk-vim-mru 仅仅是个命令了。使用的数据是 mru.vim 的历史记录文件。然后做了两个函数:vim-mru 使用 Vim 编辑文件,vv-mru 使用我自己的 vv 命令在已有的 gVim 里编辑文件。

我做的版本和 skim 自带版本,最大的差别在于,我的版本会尽量使用全部的窗口空间,而 skim 自带的总是会使用 40% 窗口高度。(所以我有个函数用来获取当前光标位置,有需要的可以自己拿去用。)

如果你想用我的配置,可以 wget https://github.com/lilydjwg/dotzsh/raw/master/plugins/sk-tools.zsh 回去,然后 source 一下就好。有需要的话(比如数据来源、键绑定等)可以自行修改。


2018年09月17日更新:我尝试了一下把 sk-search-history 映射到 Ctrl-r 上,然后很快就放弃了。因为 skim 的结果是不可预测的,而默认的 Ctrl-r 的结果是完全可预测的(只要还记得;当然你不能开(那个让我在服务器上误杀过进程的)实时历史共享)。可预测性对提高效率非常关键,因为你不需要中断思维,停下来等结果。

imi415's avatar

i.MX RT1050 简单上手

前言

i.MX RT1050大概是能买到的比较便宜的Cortex-M7 MCU了,本文介绍从裸Linux环境开始配置完整工作环境。

一、硬件准备

  • i.MX RT1050开发板
  • JTAG/SWD调试器
  • 足够多的USB线和杜邦线

二、软件准备

  • ARM GCC(任意版本,>= 7)
  • CMake
  • OpenOCD(越新越好)
  • 文本编辑器(任意)

三、OpenOCD调试环境准备

  • 在任意位置保存如下target配置
# NXP i.MX RT1050 family (Arm Cortex-M7 @ 600 MHz)
#

if { [info exists CHIPNAME] } {
        set _CHIPNAME $CHIPNAME
} else {
        set _CHIPNAME imxrt1050
}

source
IceHoney Blog's avatar

跨域请求中的cookies处理

现在的前后端开发已经完全分离,后端服务器和前端服务器分别部署在不同的服务器。同时也对应不同的域名,所以跨域请求领域方面的知识也需要补充。

跨域请求添加header

我们都知道,出于安全考虑,JS是有同源策略限制。所以,我们在对其他域名发起请求的时候需要添加 http header。

    Access-Control-Allow-Origin: *

这个参数的值只能为星号或者具体的网址,星号代表所有网站。

跨域请求添加cookie

JS跨域请求有两个API可以使用,XMLHttpRequestfetchXMLHttpRequest会默认带上cookies,但是fetch默认不会带上。如果需要带上cookies,需要把withCredentials设置为true

跨域请求服务器设置cookie

我们都知道服务器设置cookie是通过set-cookie的 http header来完成。浏览器会读取这个信息设置cookie。但是对于跨与请求,默认是无效的。我们需要再添加一个 http header。

    Access-Control-Allow-Credentials: true

当设置了这个 http header,Access-Control-Allow-Origin就不能设置为星号了,必须指定具体的网址。我们必须指定withCredentialstrue并且Access-Control-Allow-Credentialstrue的时候,服务器返回的set-cookie才会生效。

参考:

Access-Control-Allow-Credentials

CORS

ホロ's avatar

Sailfish OS 移植中(2)- droid-hal 和根文件系统

Droid HAL,对应 HADK 文档的第七,第八和第十章 _(:з」∠)_

Felix Yan's avatar

Arch Linux 社区中不成文的约定(一)

作为一个年轻和小众的社区(咳咳),Arch Linux 社区中有着许多不成文的约定。本文希望通过稍稍讲解一二,来消除一些新人们常常感到的困惑。由于预感到日后可能还会有更多问题,暂且认为这是系列里的第一篇

  • 修理“坏”包和提醒更新

仓库里一般的包可能有一个或多个维护者,也可能没有维护者,成为“孤儿”。如果坏掉或者过期的包是一个孤儿,申请从仓库里删掉是更有效的方法,这样它可以在 AUR 找到新的主人。发邮件到 aur-general 解释一下情况,并表明自己或者别人想维护它,一般都会很快得到解决。

如果“坏”包有维护者,但他太忙了呢?这种情况下,这个包很可能已经在 Bug Tracker 里泥足深陷。这种时候可以通过帮维护者一个小忙的方式来促进问题的解决。如果有人找到了上游 Bug Report,并且上游已经修复提供了 patch 的话,可以考虑把 patch 贴到 Arch 的 Bug Tracker;如果这件事已经有人做了,可以修改 PKGBUILD 打上 patch,然后把改好的 PKGBUILD 贴上去;如果连 PKGBUILD 都有人准备好了,而且过去了一段时间的话,可以考虑把这份准备好的 srcpkg 或者 diff 直接发邮件给维护者,附上简短的感谢和一个笑脸

同样的道理,如果一个过期包已经被标记过期很久了,也可以准备一个新版的 PKGBUILD 发邮件给维护者。

  • 提供旧版软件包

因为懒得迁移各种各样的原因,你可能希望某些软件包的新旧版本同时提供。在 Arch 的实践中,这种情况被尽量避免了。把无法迁移的古老软件删掉还是提供一个旧版库让古老的软件能用,一定程度上取决于维护者对这个古老的软件有多坚持。

另一个考虑的因素是上游如何看待新旧版本。有的软件新版发布后,旧版就不再维护了,这种情况下 Arch 通常尽力避免成为新的上游。而有的上游则同时维护多个版本,Arch 这边根据其他软件的依赖情况,可能会有选择性地同时维护几个。

  • 第三方 patch 能不能加上

Arch 对 patch 的态度比较保守,在规则里写的是一般只有修复编译和主要功能的上游已经接受的 patch 会考虑。在实践中,有些时候没有这么严格,比如开发者自己写的 patch 一边提交给上游,还没等答复,一边就加到了包里。因为 Arch 打包并没有 Review 过程,实际上加了什么 patch、靠不靠谱就全靠开发者自己掂量了。

一般来说,被上游明确拒绝的功能性 patch 是不怎么会考虑的。修复一个特定问题,尤其是影响比较大的问题的上游有点意见的 patch 有可能会被考虑。修复一个安全问题的 patch 经常会被接受,尤其是已经拿到 CVE 号的。

  • 使用上游二进制 vs 从源码编译

一般常识是发行版们倾向于从源码编译一个软件,理由包括确保二进制真的来自这份源码、尽量使用系统中的动态链接库而不是静态编译一份以满足安全更新和体积方面的考虑、进行必要的修改等。

但是因为太懒一些问题,即使是在 Arch 官方仓库里也直接重新打包了一些上游的二进制。这些问题包括:源代码不开放(nvidia、flash 等)、编译过程中会去下载东西,而且不容易解决(dart、一些 java 软件等)。

  • 文档是否打包

现在互联网十分发达,开发者们查询文档通常都是直接上网搜索。在这样的背景下,是否打包软件包的文档(通常都是开发文档)成为了一个问题。早些时候的包开启文档较多,如果太占体积还会考虑拆一个单独的文档包。后来才增加的新包则很多都没有启用文档,除非被用户要求提供文档才考虑这件事。

cunky's avatar

在阿里云免费申请SSL证书

SSL证书

在国内提供免费SSL证书服务的云厂商其实不少
比如阿里云 腾讯等
最近因为觉得Let's Energy证书需要3个月续签过于麻烦(虽然一个脚本的事...
于是生起在国内寻找是否有免费提供SSL证书服务的云厂商 一查 果然不少
由于对阿里云的偏好(不包括阿里云无尽的推销电话服务
果断选择了阿里云作为这次的目标

证书申请

阿里云提供的是Symantec的单域名证书申请
登录阿里云官网并进入控制台 搜索SSL证书
并在右上角点击购买证书

进入该界面 并做如下操作

请务必按照顺序操作

选择品牌> Symantec
保护类型> 1个域名
证书类型> 免费型DV SSL
立即购买

购买完成后 不要着急 阿里云还需要审核你的身份
进入控制台 > SSL证书管理
按照真实信息进行填写并审核(审核速度还可以的 至少没有网上说的一个小时 我只花了10分钟左右
之后在证书管理处直接下载证书并部署即可(阿里鱼有专门的安装证书的说明 很方便就安装完成了

笔记最后更新时间 2018-08-26 04:40

cunky's avatar

如何申请Let's encrypt免费证书

Let's encryptLet's Encrypt作为一个公共且免费SSL的项目逐渐被广大用户传播和使用,是由Mozilla、Cisco、Akamai、IdenTrust、EFF等组织人员发起...
cunky's avatar

Typecho博客的安装之旅

关于TypechoTypecho是一个简单而强大的PHP博客平台Typecho is a PHP Blogging Platform. Simple and Powerful.官网:https:...
cunky's avatar

网站从Wordpress搬迁至Typecho!

Wow~
由于Wordpress过于臃肿 很早就想换到另一个更好的博客
只是一直没下定决心 今天终于是从Wordpress搬到Typecho这个由国人开发的博客
网站的响应速度也是很快
嘛 总是一切都还不错
就这样啦~ 之后会发一篇新笔记吧...
咕咕咕~~

网站LOGO来源:Nahaki - 第六駆逐隊(58769413_p4)
网站背景图片来源:Natsu - * (59498721) 1ページ

笔记最后更新时间 2018-08-25 15:41

's avatar

好像太久没有更新了

这里的内容已经一年没有更新了。

与其说是懒得更新更应该说是没有做出什么能让我更新的事情吧。

说起来这段时间一直都比较糟糕,既没有搞出什么新的作品,在学业上也是遇到了一堆问题。真是太失败了。

今后的话……还是希望能提起精神造出一些新的内容来,不过我好像对自己失去信心了呢。

之后再看吧。

Dimpurr's avatar

钉子的谜之 SETUP 18 @ Ningen

本文原载于 人间 / Dimpurr Cheny ,前文 钉子的谜之 SETUP (2014) 。

简要介绍一下自己,并且谈谈正在做什么?

这里钉子,现役帝都大学生。曾经写写画画做过不少事情,当过宅圈内知名前端博主,设计过几个流行的 WordPress 主题,发起过一点音乐社区相关小项目,都已经成为过去。大一以来,唯一的成就是为了拯救北邮人技术组废部危机,不得不成为偶像,建立了 BYRIO 开源社区。目前在选择遵循自己内心去做游戏设计和编曲,还是顺应他人期待继续在 CASIA 和 MSRA 的 ML 搬砖日常前犹豫不决。

你使用的硬件有?

主役 MacBook Pro + Surface Pro ,经常同时携带 (虽然很重) ,前者用于影音处理、工程开发、平面设计、绘图板画画 (Wacom Intuos PTM CTH680) ,后者用于 PDF 阅读和批注、 OneNote 笔记、 Surface Pen 作画、推 Gal 和小游戏 (V-A HALL, FrostPunk) 。 Surface Pro 虽然性能有限,但是在轻薄的前提上能让自己在任何时空基本具备进行任何工作的能力。

宿舍配备 Linksys WRT1900AC v1 用于享受百兆校园网 (IPv6 免流 + 学校网络中心成员特权套餐) ,一块 26’ DELL UltraSharp Monitor U2415 外接屏一般连接 MBP 用于宿舍组团看 Rick and Morty 或少女歌剧、瀑布流展示作画和人体结构参考资料、工作时看论文和文档等,计划接上 Switch Dock 之后用来在宿舍玩舞力全开。配置 MIDIPLUS X6 键盘 + ATH-AD2000X 开放式大耳用于演奏。

随身 Sony XPERIA XZ1 ,佩戴 Moto 360 。 SHURE SE846 耳塞退烧,前端 iBasso DX90 和耳放 Sony PHA3 常年借给同学。 iPad mini 用于音游 (Cytus II, Arcera, Groove Coaster, Dynamix) , Nintendo Switch 用于 Party Game (分手厨房) 和沉迷死喷浪涂 (Splatoon) 。

你使用的软件有?

常年 macOS, Windows 和 Linux 跨平台用户,曾经是 OpenSUSE 党。 macOS 下剪贴板历史 Paste 和快速访问 Spotlight 重度用户, Win 对应工具是 Ditto 和 Keypirinha 。所有常用 App 必须选择跨平台解决方案, 必备滴答清单 + SimpleList 。日常 IM Telegram 和 QQ ,偶尔用 HexChat 挂 IRC 。念念不忘的 Mac 独占 App 有 Sketch, GarageBand, Agenda, OmniFocus 和 XLD 。念念不忘的 Win 或者 Unix 独占 App 没有,非要说的话 PC 游戏。

曾经 Sublime Text 2 党,如今 Visual Studio Code 忠实用户,必备插件是 background 自带魔理沙背景 + GitLens 。终端分别 iTerm2 和 Cmder / MobaXTerm 。 macOS 下用 SourceTree 做 Git GUI ,用 MAMP PRO 做服务器测试环境。写作环境 ByWord 和 Typora ,设计主 Sketch 辅 Axure 和 PhotoShop ,偶尔用 Illustrator 描矢量画或者 InDesign 做小册子。剪辑一般用 Final Cut Pro 或者 Premiere 。三维制作 3DS MAX 和 Blender 。

主要用 CLIP STUDIO PAINT 作画,新的拟真铅笔手感非常好。有时候会使用 Krita , Tyson 大大绘制的 Kiki 启动屏幕非常可爱,自带的丰富笔刷和镜像画笔等功能很能激发创作灵感, BYRIO 社区还组织参与过 Krita 中文文档的翻译工作,在此安利。

你梦想中的设备是怎么样的?

梦想是巨硬让 Surface Pro 性能、品控和售后再好一点,水果让 MacBook Pro 再便宜一点,索法不要搞 XZ2 这种歪门邪道好好出 XZP 这种全平衡侧面指纹带耳机孔的好手机。离开大学宿舍后可能会对个人工作站的设备有新的愿望,目前暂时并没有什么其他的梦想。

 以下附图。

Surface Pro 桌面

Surface Pro 开始

MacBook Pro 桌面

MacBook Pro LaunchPad

本文来自 钉子の次元 - Dimpurr - 千里之行,始於足下。 ,原文地址 钉子的谜之 SETUP 18 @ Ningen

kookxiang's avatar

安装 homebridge

说实在的,哪个土豪会只在一台机器上跑一个应用…
多个应用共用一台机器不是很正常吗?

node.js 一升级,homebridge 就挂了 23333333

那么,有没有什么办法能延续 homebridge 的寿命呢?

首先我们把锅烧热,新建一个目录(~/homebridge)
然后再在里面运行 npm init 初始化

接下来就是神奇的时刻了,这时候输入 npm install node@8
然后你就会惊奇地发现 node_modules 下面有个 node…

这时候再通过 npm i -S homebridge 安装 homebridge 和其他组件
这样再系统无论怎么升级都不会挂啦~

然后再在 package.json 添加一段

  "scripts": {
    "start": "homebridge"
  },

最后通过 npm run start 就能正常使用啦~
最后当然是写个 systemd service 调用 npm 启动啦

附上手游玩家氪金的悲惨故事:
< 访问完整版以查看此播放器 > 视频:

's avatar

NES 冒险岛 IV - 无敌修改

《高桥名人之冒险岛IV》(高橋名人の冒険島IV)是 Hudson Soft 在1994年6月24日在 FC 平台发售的一款横向卷轴平台类型游戏。 百科

补丁基于 20121002 NOKOH 汉化版本制作,网上随便搜了个日版的 ROM 能用,英文版基于日版翻译应该也可以用。

小时候玩的可是日版,根本没理解过里面的文字和剧情,因此这次算是好好的过了一遍了。

做补丁的原因主要是打到倒数第二个 BOSS 的时候实在是打不动,只好上 Fceux 调试看看了。




就目前发现的三种伤害计算来看,需要补丁下述文件位置:

伤害类型 文件地址 原始内容 修改内容
普通伤害 03C2AD B1 A9
刺的伤害 01C799 01 00
岩浆伤害 008BCB 6E 07 D0 6F 07 F0

如果还有伤害不能免除的话,可以在这里留言(如果能提供一下密码就更好了)。

IPS 补丁下载:Takahashi.Meijin.no.Bouken.Shima.IV.(J).Invincible.Patch.ips

以及在网上找到的 密码生成器

SgDylan's avatar

EmiyaEngine 杂谈录 「其一」

人耳是一对既简单又复杂的器官。
说它简单,是因为人类可以制造电子的替代品;说它复杂,是因为再好的替代品都不能完全还原其功能。
它的原理,简单说只是将声音的机械波转换为神经电信号,但实际上这是包括耳廓、耳洞甚至是表皮绒毛的系统工程。
这些部件通过发挥其物理结构的作用对外界声音进行加工,才有了人体感知声音的前提。
再往后,大脑通过对其进行一系列解构调味,才有了最终感受到的样子。
现在的我们,将这一些系列的调味成为「心理声学」。

Fenking's avatar

明日方舟,明年方舟

等明日方舟这款手游已经等了好久了。
这主要是因为对海猫氢弹库(海猫络合物)的个人风格的喜爱和敬佩。
没等到一测的我,也没等到二测。不过同学的朋友有幸得到了激活码,而且并不打算玩,就把号交给了同学。
可惜画风一转,在某二本的同学受难于周围同学过于傻逼,在7月31日的聚会上宣布自己复读去了,第二天就开学。
我们顺理成章的继承了他的所有个人”遗产”:fgo、少前、舰R账号,一部游戏手机以及一个欠了2000花呗没还的支付宝。
我没什么手游爱好,顺理成章地继承了明日方舟。

也许是某种魅力,我第一次沉迷于手游:每天畅游在托福与明日方舟的海洋里,拿着他瞎打的一堆废角色,重新练级,重新推图,在梦中思考每一关的战略,为了在二测结束前通关主线剧情——登上”dalao榜”,拼命的过图。
最终功夫不负有心人,4月9日上午,我通关了主线剧情,也放弃了只有真dalao才能打过的额外关卡回声测试。
盼望已久的德克萨斯(干员名称)也得到了,想舔的白金和蓝毒却也没得到(完全没有狙击单位)
现在游戏记名正式结束了,11、12两天就是资源大狂欢。
最后记录一下繁忙中自己的最终成果。
非抽卡
欧抽卡


各种剧情图







最后一关4-10的各种图










我的最终成果与纪念

23:59结束统计纪念







我的主力们


以及传说中的玫剑圣

明日方舟,明年再见(也许

lwl12's avatar

让小爱同学登上云村

前天 LWL 氪了一台垂涎很久了的小米小爱音箱 Mini,现在买还优惠十块只要 ¥159 快去买啊~(Mi Boy 打死),提回家后才发现这音箱居然没和云村合作???

个人喜欢的挺多歌都是同人角色曲一类的,好像除了云村和 5sing 也没什么别的地方能找到了。不支持云村显然忍不了,正巧之前酷安上有人拿了(我的?)一言 API 去接入小爱,让我记下来了这音箱还是有个开放平台的,然后我本来就有一个音乐搜索项目在跑着……(不去写个接入我都感觉亏

万事俱备只欠东风,说干就干!

接入开放平台

小爱开放平台,顾名思义也就是提供给开发者做高级技能的地方啦!(说起来小米这次感觉也是投了血本要扩大小爱的技能范围,这开放平台甚至能建免费云主机用……)

要在开放平台上创建应用的话需要上传手持身份证,给个差评,虽然最终还是传了(真香)。审核通过以后就可以开始建立应用了。

技能信息


除了技能名称和唤醒词,其他的项目如果不需要发布的话可以瞎填,没啥影响。不过这里不得不吐槽一下这糟糕的唤醒词功能,也不知道是不是我用法有误(文档反正是没写清楚),带意图的唤醒词实际用起来完全无效,于是整个语音请求一下子多了一轮对话,效率降低不少。

交互模型

交互模型这块的话,由于并没有什么公开的歌名/作者名数据库,所以词表可以忽略掉,主要是设置意图。

槽位

首先要添加意图,接着就可以开始添加槽位了。由于云村的搜索还挺智能的,所以只需要把用户提到涉及歌曲信息的文字全部选出来一股脑丢给搜索就行,省去了一部分麻烦。

虽然追问和回复似乎并没有什么用,但是在槽位必选的情况下一定要填……这个比较无所谓,开心就好(

语料

说白了就是猜用户会用什么语言来尝试调用这个应用,自用的话想想自己常说的就行

值得一提的是这个页面的底部有一个模糊匹配选项,虽然好像没什么用但是也没有负面影响,可以打开试试

配置信息

前面提到了小米这次免费给开云主机用,其实就是为这里的函数计算功能服务的。整体用下来应该是和 SAE 差不多一个性质的东西。

咱这次的代码也就跑在函数计算上面,所以按引导申请一下计算资源就行。注意在申请的最后一步会要求选择触发器,需要建立一个 SkillTrigger,并在创建完成后拿到他的 ID 填回开放平台。

函数代码放在后文了(

设备调测

全部配置好以后就可以在这里进行测试了,虽然这个测试真的很难用,出错了连个实际错误信息都没有……

函数代码

不废话直接放了:Github,记得给个 Star(
实质上就是一个类似中间件的东西吧,连接小爱的语音识别和我的 Music API (这 API 一直是半公开状态因此并没有文档_(:з」∠)_

填到函数计算后台的函数代码里就好~

使用条款

对于开发者

  • 禁止不合理利用源码内的 Music API,例如作为违法用途,高频率调用等
  • 禁止商业使用

对于音箱用户

虽然感觉应该过不了审但是如果过了的话……

  • 居然过审了,爱怎么用怎么用吧(
  • 我也不知道这些音乐是哪来的啊,完全不懂,好像都是随随便便就读到了,云村好像听着挺耳熟的不过我也不知道是哪家公司呢,总之能用就好吧(

其实呢,本来是不打算写这篇文章的……毕竟感觉这种作大死的东西拿出来摆着不知道什么时候就收到律师函了呢(疯狂毒奶
不过确实想填一下后台的使用条款和隐私政策所以还是写了(是的你现在看到的这条和后面那条才是本文最关键的地方了)

隐私策略

如果小爱的逻辑比较糟糕的话有可能会被 NGINX 记录到设备 IP,其他的信息则完全不会被记录。

最后

感觉大概应该是过不了审,所以发出来也还行吧……如果你碰巧有同样需求的话可以尝试自己搭建一个,然后让小爱音箱进入开发者模式就能自用了。
Enjoy music 🙂

- EOF -

ホロ's avatar

和 Android 玩耍的那些日子

也可以说是 root Android 的过程 ……

最近 Android Pie 发布了,于是随便写写杂感 (雾)

Android 2.x :蛮荒时代和 ZergRush

(记得那是咱自己的第一部 Android 手机, Motorola Defy XT535) 拿来的时候还是 Android 2.3,当然是不能用现在的审美去看 Gingerbread 的界面啦……(不过 2.3 时期的 TouchWiz 是真的比 Motorola 那几乎没怎么改 的漂亮,虽然现在……)至于当时怎么想到去 root 了呢,动机大概是 想不起来了,大概只是为了移除某些系统应用而已 😂 。2.x 时期最著名的 大概就是 ZergRush 漏洞了,通吃大多数 2.2-2.3 版本……

后记:那 XT535 后来收到了 4.0.4 更新,然后又坚持了两年,最后掉了……

Android 3.x :没用过

于是跳过 😂

Android 4.x:CyanogenMod,CWM,CF-Auto-Root,Superuser,SuperSU 和 Xposed

和 XT535 同时入手的其实还有 Samsung Galaxy Tab2,当时那上面已经是 Android 4.0.3 了。虽然三星魔改的很厉害,但是乍一看就和旁边的 2.3 不一样不是? 😂

以及到了 4.0 时代, ZergRush 就不能用咯。当时咱还处于一种啥都不懂的状态 (当然现在也只是懂些皮毛而已啦),上网搜索到了一个叫做 CF-Auto-Root 的家伙。 ( https://autoroot.chainfire.eu/

用过三星手机的应该都知道,人家是没有 fastboot 模式的,但是有个 Download 模式 (因为早些时候的 Download 模式上有个施工造型的 Android 机器人,所以有时有人 也把它叫做挖煤模式)。然后需要用到一个叫做 odin 的工具刷机。

当时 root 手机的方法,基本上都是先把一个称作 Recovery 的东西放在手机上, 然后利用一个小 zip 包把 su 可执行文件放在对应的位置上,再安装一个应用来控制 root 权限就 OK 啦~

其实汝的手机上是有一个 Recovery 的,重置或者系统更新的时候会需要。不过 官方的 Recovery 通常功能不多而且会检查更新的签名,所以就需要刷入一个第三方 的 Recovery 来实现更多功能。比较著名的第三方 Recovery 的话,以前有 ClockWorkMod (简称 CWM),现在有 Team Win Recovery Project(简称 TWRP)

而 CF-Auto-Root 把这些过程简化到一个供 odin 刷入的 tar 包中,于是咱当时就用它 root 了。

至于 Root 权限管理应用的话,当时比较流行的是 Superuser (忘了是谁开发的了) 和 SuperSU (Chainfire,也是 CF-Auto-Root 的作者,虽然已经是前开发者了)。两个当时都很优秀 (虽然现在都凉了)

然后有一次咱尝试系统加密玩脱了,系统进不去了,于是死马当活马医的装了个 CyanogenMod 进去, 打开了新世界的大门(雾)。

以至于现在咱用不习惯任何非类原生 Android 界面了 😂

大概是 4.4 时期,有了个叫做 Xposed 的东西。大概是一个通用的系统框架, 可以实现上至系统界面调节下到应用权限控制等一系列千奇百怪的功能。咱当时也 装了不少的模块用了一阵子。

后记:那个 Galaxy Tab 2 一直坚持到 CyanogenMod 13.0 ( Android 6.0.1),性能是真的不行了, 于是就闲置在家里,然后屏幕外面的玻璃被压碎了……

Android 5.x - 6.0 时期:没啥特别的

大概是 15 年的时候买了台 Galaxy A8 ,然后兴致勃勃的用以前的方法 root 的时候, 遇到了一个叫做 KNOX 的神奇大坑。

4.3 以前的三星手机刷入自定义操作系统以后,启动时会显示一个感叹号三角形, Download 模式里也会记录刷入了自定义操作系统。不过当时可以很轻松的去掉 (例如用 Triangle Away)。后来有了 KNOX 以后,修改操作系统的行为会导致 KNOX WARRANTY VOID 变成 0x1 从而失去保修。以及某些功能将无法使用(例如 My Knox 和后来的 S Health,Samsung Pay 等等),而且据说因为这是个硬件 设计于是不可逆……

自此咱就再也没买过新的三星 Android 手机……

如果不考虑那些的话,还有一个问题,修改过系统分区的话,就不能收到厂商的系统更新了。 于是不动 /system 的 system-less root 方法应运而生,典型的方法是修改内核映像(boot.img)……

以及那时候自从 ART 代替 Dalvik 以后, Xposed 适配新版本的速度慢了下来。

Android 7.x - 8.x 时期:SafetyNet,Magisk ,LineageOS 和 Project Treble

7.0 一上来就是猛料,比如所谓的 SafetyNet ,反正咱现在也没搞清楚这是啥…… 以及不知道是不是 7.0 的 Xposed 鸽了太久的原因, 有人写出了 Magisk。 和 Xposed 大概具有类似的功能,但是不动系统分区,于是接收 OTA 更新能稍微容易一点…… 以及介于 Superuser 年久失修和 Chainfire 宣布不再参与 SuperSU 开发以后, Magisk 还有一个 Root 权限管理程序。总之也有不少人用啦~

这个时期也出现了很多不必须 root 权限的系统管理工具,例如 Brevent 和 AppOps, 它们都是通过 adb 启动一个外部脚本来协助完成某些任务,给了不 root 或没法 root 手机的人一些选择。

以及那年商业化失败的 CyanogenMod 宣布关闭,不过过了一阵子以后又有一群有志之士 成立了 LineageOS 社区,目前正在活跃开发中。

Oreo 时有了 Project Treble 和 A/B 无缝系统更新,前者把 Android 系统的部件和 OEM 定制的部分分开,声称能使 OEM 适配最新版 Android 系统的速度提升。后者可以做到更新时可以 继续使用设备,而且不容易坏(笑)。

对于喜欢搞机的开发者们呢?看起来 Project Treble 使第三方 ROM 移植起来稍微容易了一些, 比如汝可以在 xda 上找到 Treble 兼容的 AOSP 和 LineageOS 的通用系统映像(GSI),然后 刷入进汝支持 Treble 的手机上,大多数的功能应该都能运作。 不过 A/B 无缝更新可能就是个 美丽的麻烦了,因为没有了单独的 Recovery 分区,所以给这种手机适配 TWRP 的进度似乎慢了下来。

Android P ?

咱现在用的是 Nokia 7 plus ,当时有官方的 Android P Beta 支持,于是咱就这么用了下去。 除了前几个 DP 每次都要全新安装以外其实海星 😂 。 Magisk 在 Android P 上也比较稳,原来 不少需要魔改的功能也或多或少的集成进系统里了。然而以前那个愉快的折腾的日子似乎回不来了呢……

PS: #when_I_buy_a_phone

如果咱要换手机的话:

  • 能解 Bootloader 锁的通常很快都会有 LineageOS 适配,优先考虑。
  • 上面一条不满足的话,如果是类原生系统的体验也可以考虑。
  • 最好不是异形屏幕(就是所谓的刘海啥的),屏幕比例最好是普通的 16:9/16:10 一类。
  • 有物理键盘最好。

于是现在(这篇文章完成的时候)这么下来,貌似就不剩几个了吧 😂

AprocySanae's avatar

恶龙会梦见经济学家吗?(其二)

SLAY MORE, GAIN MORE

AprocySanae's avatar

恶龙会梦见经济学家吗?

经济学就是屠龙术,字面意义上。

— 《高等宏观经济学》 王国历112年修订版 第一页第一行

's avatar

我喜欢网络上的大家,但是我好纠结

在现实中没有很好的社交能力、爱好小众、情商又不高,所以交不到什么朋友;即使是有相识的人,平常也会不会觉得有什么事情需要找对方,从而很久也不会联系——这样要怎么办呢?人类是社交性动物,如果没有与其他人类交流的话,迟早无聊或者孤单死的。有着这样情况的我,就只好投奔了网络,寻找与自己合得来的其它人类。

感谢科技,在网络上寻找朋友这样的事,已经不能变得再简单了。在现实中畏畏缩缩的我,终于在没有面对面的对话中,找到了新的生命。

我喜欢几乎我熟悉的每一个网友,大家都是那么的可爱。我明白,藏在萌妹头像背后的,也许是一个留着汗的大叔,但那样又有什么关系呢?即使是大叔,那也是可爱的大叔,是我喜欢的朋友。网络真是太好了,它给了这样多外表不惹人喜爱的人另一次机会,让他们也能被人喜欢。

长辈们跟我说,“网络上的东西都是虚拟的。”嘛……那确实没错,大家大都是拿着不真实的名称,不真实的头像,简直就像是用假身份在交流一样。但在这背后的,怎么说都是一个个真实的人呐。当然要说有机器人也没错,但机器人总归还是能够看出它的冰冷和机械的。因此,即使长辈如此告诫,我仍然是将整个身心都放给网络上的大家。

我是如此的迷恋于网络社交,以至于将它想象的太过美好,但经过了这么长的时间,直到现在,我才明白了它没有想象中那样美妙。它有着许多令我难以接受但也没有办法的事情,即使是我喜欢的网友之中,也不例外。

说不定在看这篇文章的你也会觉得“诶,这很正常啊“,然后觉得我的想法才是奇怪的。那你就有可能是上面所说的“我喜欢但拥有难以接受事情的网友”呢。不过别担心,我还是喜欢你的啦。

但问题是,这样的状况,出现得有些太频繁了。我害怕被大家讨厌,因为没有了网友,我的信息交流就少掉了几乎全部了。因此,我只好小心翼翼地在遇到难以接受的事情的时候,把自己的想法紧握在手中,只有在很少而且认为对方不会因为我提出意见就讨厌我的前提下,会让它从口中——不对——手指间传出。

我不想被大家讨厌,可是,今天我觉得我的承受能力已经快要见底了。所以我要这些事情,在这里一个一个地写出来。但是我还是不想被大家讨厌,所以在写完这些之后,还是会努力继续和大家交流下去的,也不指望能有什么改变。这些不是对谁的批评,只是我自己的抱怨罢了。


我觉得好多人都不珍惜网络上的友谊。在现实中,如果与朋友之间有不满,像比如对方有什么无关的事情老是叫我,觉得很烦,或者对方说话比较直接,批评不拐弯抹角。我接受不了了,这时候要怎么办?首先想到的,当然是跟那位提出这个问题啊。告诉对方自己觉得很烦,或者有些事情不想被批评。这是件很容易的事情吧?我觉得只要那位朋友是正常的人,在听到了这样的话之后,肯定会改善自己的做法的。这样,问题不是以双赢的方式解决了吗?

可是在网友之间,经常不是这样的状况。“绝交”这个字眼,应该是一个很严重的字眼了,我甚至在文学作品中都很少见到它。可是我悲哀的发现,它是许多网友处理矛盾的 首要 方式。网上不像现实,在一般的社交网络里,屏蔽一个人、断绝一切往来不过是按两下按钮那样简单的事情。而那实际上,就是绝交了。就因为一点小小的可以处理的矛盾,就抛弃了曾经一切的回忆,抛弃了所有和好的机会,这样的做法,太难以理解了。

而屏蔽,实际上比绝交还要残酷,绝交至少还有能有最后解释的机会,可屏蔽的话,那就是单方面、一刀斩、阻断全部解决方案了。

我看到其它的人之间发生这样的“绝交”,自己也同样害怕,不会自己那天也因为做了什么无意识的事情,就被屏蔽的?我害怕。也许可以说我不应该和这样的人做朋友,但是他们除了这一点以外,其它都是我所喜欢的朋友呀。如果因为这样程度的观念不符就“不和他做朋友”,那自己也就成为同样不珍惜友谊的人了。


同样是有关于屏蔽,另一件令我不解的事情,是许多人喜欢把自己在现实中认识的人,在网络上屏蔽掉。最奇怪的是,这样残酷的做法,甚至被当作一种政治正确被开着玩笑做到。这可是你现实中认识的人诶!如果只是对不想分享个人生活的长辈、同事之类的那还可以理解,但即使是朋友的话也这样做,那就太奇怪了啊。本来就是要分享个人生活的朋友,在网上却要互相屏蔽。而且还不是仅仅不互相搭理,是互相屏蔽!就是上一段所说的,比绝交还残酷的事情。

不过因为现实中还认识,所以实际上应该还没有绝交那样严重。但这样的做法被当作玩笑一样,以各种姿势哈哈笑着屏蔽掉各种人、还向其它网友互相笑嘻嘻地感叹“这才是正确做法”是怎么回事?夸张地说,这就像是两位杀人魔笑嘻嘻地说“哈哈,我今天杀掉了两个人,他们的表情真漂亮。”“呀嗬,不错嘛,我实际上前天杀了三个人,不过你干得漂亮。”

比喻可能夸张了几万倍不止了,但大体就是这样的感觉。这样的“正确做法”,我觉得难以接受,要是现实中有朋友在网上屏蔽我的话,我一定会觉得莫名其妙的。有好几次看到自己喜欢的网友有在这样做,我真的想冲进评论去,发出我的疑问,可是看到在评论里的所有人都是一片“和睦”的样子在说“哈哈哈,这才是正确做法”,我要是冲进去了,那我就又变成了不识趣的人了,会被讨厌吧。


我个人是觉得,政治话题这样的东西,在公开谈论不但不是禁忌,更是好事,它可以让更多思维的火花产生碰撞,说不定还可以让改善问题变得容易一些。但有些人不这么认为,许多人觉得政治这样的东西就要避免谈论,这样的想法也不奇怪——没有什么类型的话题能比政治更能让人恼羞成怒了。要是两个程序员之间在争论两个程序语言之间哪个更好,这争论很少是火力全开、互相破口大骂甚至人身攻击的。但要是两个政治观点相悖的人在吵,那就没边了,一前一后几句话,根本不忍直视。

恼羞成怒的人不会认真讨论,甚至有时候连骂都懒得了。于是便给对方批量地扣上各种帽子,像“屌圈”、“自由派”之类,原谅我没有搞清楚这两个词究竟代表的意思是什么。还有“川粉”和“白左”这样的分类,这我倒也许明白其中的一点意思,按照见到过的评判来看,我应该算是再典型不过的白左了,虽然没有被证实过。

以上都不是问题,人爱骂骂去吧,不关我事。但问题就在于,我喜欢的人中,有“屌圈”,有“自由派”,有“川粉”,有“白左”。除了遇到另一派的时候,他们都是很好的人。许多还有着许多的共通点——像是对猫咪的喜爱。可是,仅仅是因为政治观点上的不同,就让大家互相变成了仇人一般的存在。这样太可惜了。

夹在两个人中间,他们是互相屏蔽的,提到另一边就会“啊?”地提起眼角。这时候作为“胶水”,是要尽力粘住、让两人放下芥蒂才比较好呐。但事实上这样做,不但没有很大可能达到预期效果,还有可能自己也被两边仇视。那就鸡飞蛋打了。

能有什么办法呢?没有,我只能眼睁睁地看。


最后要从比较具体的一件事说起,羽毛的死。

是很沉重的话题,不过还是必须要讲。羽毛是一位药娘,就是原本是男性,后来认为自己应该生来是女性,决定吃激素变性的人。听起来可能不是那么令人轻松的描述,不过请相信我,药娘中有许多很棒的人。羽毛有一位关系非常好的另一位药娘,叫做 Neko ,但是因为整个社会对这个群体的歧视,还有和她的家人和各种各样的困难,自杀了。几个月后,肝肠寸断的羽毛也跟着自杀了,那就是前段时间的事情。

听起来很可怜,不是吗?但对于这位已经自杀之人,却有许多人向她的尸体投掷了更多的刀子。“不值得同情”,“这种人就是问题儿童”,“再转发羽毛死的消息我通通屏蔽”。这太荒唐了,尤其是其中有我曾经认为非常善良的人的时候。

不过荒唐的事情总有原因。公开发表了疑问的我,得到了这篇文章的一个链接,阅读之后,大概了解了几件事情:羽毛劝过别人自杀、羽毛在别人家制作过毒药。

不能否认,这是很严重的罪行,但是人家现在先是恋人死了,然后自己都死了,就是这样也不能有一点怜悯之心吗?没有怜悯之心也就算了,还要有憎恨之心,还不允许别人有怜悯之心,这就过分了。

不过我也不能乱说,因为我也不知道,羽毛是不是还犯过什么别的事情,什么让我听了之后也觉得该死的事情。但是我不知道啊,这种事情也没有人有客观的记录。所以我是不是也要悼念一下她呢?按照“再转发羽毛死的消息我通通屏蔽”这样的话来看,我不应该悼念,因为这样会被屏蔽,虽然被拥有这样心理的人屏蔽,是不是一件值得避免的事情还不好说。


几乎是通宵地完成了这篇文章,那么就告尾声吧。

最后,请不要把这篇文章的内容当作我其他人的意见或者建议,这文章只是我的抱怨。当然,你要是觉得你属于上述其中行列,然后觉得自己的做法值得改进的话,很感谢你能把我看那么重。不过,也请不要认为这篇文章包含了对任何人改变自己做法的希望。因为要是这样认为的话,我会被讨厌的,请不要讨厌我。

最后,爱大家 💕。


除特殊说明外,本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。转载时请注明来自 FiveYellowMice's Blog ,以及原文链接

虽然 RSS 是一种很好的新闻获取方式,但是不同的 RSS 阅读器所显示的内容可能会有很大差距,有些甚至无法显示所有内容。所以为了能够获取到完整的内容,最好还是点开网页链接看。
之所以还是保留了 RSS 的全文输出,是因为摘要输出会被很多人讨厌……

依云's avatar

XZ2C: 没有 root 的日子(也还过得去)

本文来自依云's Blog,转载请注明。

现在手机两三年不换新,日子就没法过了!所以我明知没有 root 还是买了 Sony Xperia XZ2 Compact(XZ2C),用于替换之前使用的 Z5C。

嗯,还是 Compact 版本。尤其是尝试在地铁上操作小米 Note 3,结果发现为了避免自己跌倒或者手机被摔地上,我不得不使用嘴唇来点击部分区域的时候,我决定绝不放弃能够安稳地握紧的 Compact 版本了。

啊,我知道有单手模式的!XZ2C 底部那三个虚拟键的位置,向左或右滑,就可以启动了,很方便!然而,最需要此功能的小米 Note 3,使用的是实体触摸按键,中间还是个凹下去的指纹识别,我很难成功启动单手模式。而且由于手机过大,这个动作操作的时候,手只能握住手机的下半部分,重心还是悬在外边,列车适时地颠一下说不定就会脱手而出了。

XZ2C 比 Z5C 重了很多,背面还是弧面的,手感意外地很棒呢。指纹识别在背部,拿在手里的时候倒是很好按,也不会有小米那握不稳的问题。不过你们懂的,放桌面上的时候,不拿起来就按不了。而且双击唤醒屏幕被禁用了(除非已抬起手机,屏幕已显示时间),密码解锁也并不方便。双击唤醒大概还是可以启用的吧,不过 Z5C 拿在手里走路的时候,屏幕经常被会意外点亮不说,还会一不小心就把锁屏时钟给换了样式。所以就不用啦。

这指纹解锁速度比起 Z5C 的侧面那个小的,快了非常多。而且可以配上很好看动画效果啊!就是 Sony 宣传片里的那种,不过它竟然不仅仅是在主屏幕上呈现,在任何应用打开的时候也能出现呢。

哦还有,XZ2C 充电、看视频时都不会像 Z5C 那样烫了~

系统是 Android 8 Oreo。最棒的莫过于通知管理了!之前我一直希望某些不重要的通知出现,但是不要发出声音(比如微信的「加好友」通知),但是只能寄希望于应用本身提供这种设置。现在不用啦,系统通知管理可以直接设置了。而且应用还可以给通知分门别类,然后用户按需要给不同类别的通知不同的设置(比如 Telegram 就能精确到会话)。在通知出现的时候,长按选择「所有类别」打开设置的时候,对应的类别也会闪动一下,不用用户去猜这是哪个类别的通知。

其次是应用图标的长按功能,可以查应用信息,可以访问应用提供的快捷入口,也可以把这些入口添加到主屏幕,或者添加该应用的小部件。而且应用信息里可以直接打开 Google Play 了!我之前都只好去搜索应用名的。在 YouTube 上看到有人直接把应用图标拖到一个控件上就能打开商店,然而我并不知道那是什么应用。

还有很重要的一点是:运行很流畅!不只是我以前新手机刚到手的那种流畅,而且装个应用一两秒、开机启动完了我还没反应过来,超出了预期好多!当然并不是说开机刷一下子就完了,而是我没想到 Android 的开机能有这么快。

啊,最后进入正题:没有 root,只能找替代了。

首先是权限管理。Android O 的权限管理已经强大了不少,而且我已经把大部分国内应用转移到小米上了,所以还好吧。

时间显示秒。这个功能,在「系统界面调谐器」里已经有选项了。长按下拉通知出现的齿轮图标,直接它转动起来,然后就可以在「设置」里看到「系统界面调谐器」了。

互联网访问。放弃修补好的 fqrouter,发现现在的主流软件其实也挺不错的。只是偶尔需要手动切换节点了。另外就是 SSRR 这个东西,连接上的时候如果切换节点,有大概率导致网络故障(DNS 解析异常等)。需要重启手机才可解决。

绿色守护。被黑阈取代了。但我发现其实需要黑阈掉的应用也不多。我目前添加到黑阈名单里的有微信、彩云天气、企业微信、Inoreader、形色、高德地图等,基本上都是国产应用。微信一大堆服务在后台跑着,虽然支持 FCM(GCM 升级版),被黑阈干掉之后会收不到新消息(而 Telegram 和 Twitter 什么的好像都能)。

Wi-Fi adb。这个其实开机后接 USB 线,adb tcpip 5555 一下,就可以一直通过网络连接了。黑阈等需要通过 adb 执行命令的应用,也可以自行调用。

「去你大爷的内置浏览器」。现在火狐支持 Custom Tabs 了呢,所以大部分应用都能够调用火狐了。虽然 Custom Tabs 里是不加载扩展的,不过再选择在火狐中打开就可以了,大部分内容都缓存了,再加载一遍也是挺快的。Inoreader 有「webview」、「chrome tab」和「外置浏览器」三种方案,其中「chrome tab」其实就是「Custome Tabs」。Google 自家的大部分应用也会使用「Custom Tabs」,除了「Google 搜索」仍然坚持调用 Chrome,不过它可以设置为在外置浏览器中打开。「新闻与天气」也需要设置为在外置浏览器中打开,不然因为没加载扩展,会有大量广告辣眼睛的。微信当然是无解的,只能在需要时浪费些流量和时间手动选择在浏览器里再开一次了。

五笔输入法。这个之所以和 root 权限有关,是因为之前我都是拿 XPrivacy 禁用输入法的联网能力,所以什么百度啊触宝啊,我都能接受。现在没法断它网了,我自然是不会再用不开源又非系统自带的输入法了,尤其是触宝这种,一联网立马弹出好几个广告的。一开始找到叫「五笔输入法」的试验品。功能很简洁,但不愧是试验品,不能输入中文标点也就算了,一次输入英文还不能超过四个字母……然后想起 trime——rime 在 Android 平台上的版本。使用感受是:我从未经历过如此简单的码表导入!把我的 fcitx 码表导出,然后一行命令调整一下格式就可以了!然后把码表和五笔输入方案推到内部存储设备上,「部署」一下,我终于可以在手机上使用我自己的码表了!

ssh、备份和调试。这个没办法。通过 termux 能很方便地启动个 sshd,但是权限很有限,比如只能只读访问外置 SD 卡。所以我通过 adb 起了一个 dropbear 来同步这些内容。系统分区没办法访问,只能依靠 Google 和 Sony 的在线备份功能了。

啊对了,Sony 的「Xperia 换机助手」真是垃圾啊。首先,很多应用不能带数据迁移。其次,我这里一次传输只能传一项内容!不然就会出现连接错误。好不容易在论坛上找到的方案,一次只传少量数据,所以短信和通讯录什么的都可以过来,小一些的应用也能过来。大的应用就没办法了。

还有些小功能。通话振动。这也是个 Xposed 模块,就是电话接通的时候振动一下。属于锦上添花的功能,没了就没了吧……还有 Xposed Torch 也是。不能长按音量键开手电筒,那就划开通知点按钮好了。微X模块,很好用,但也不是非要不可。

整理下来,因为没有 root 而失去的功能并不是很多,最严重的是没有完整、增量的备份了。其它的,相对于运行流畅所带来的体验提升,其实并没有那么重要。这次我真的是换了手机才知道旧手机已经全面卡顿了……

Phoenix Nemo's avatar

Office Service Router 解决方案:Arch Linux in RAM

一直把自己在办公室的 PC 保持开机用于连回办公区、存取数据工作需求。由于最近办公室所在的写字楼要全馆断电检点,所以诞生了构建一个 Service Router 的想法。

思路

运行在内存里对于 Linux 系统来说是完全可能(而且简单)的事情。

最直接的想法就是使用内核 hook 在启动时复制根分区到内存盘然后挂载内存里的数据作为根分区即可。

设备的话,设置 Power on AC 即可通电自启动。

ramroot

作为一只懒卷,这种简单的事情当然先顺手搜索下啦。然后就发现了几乎完美的解决方案——ramroot

ramroot 通过加入内核 hook 然后自动在内存建立 zram 分区,同步根分区数据再启动。还可以在启动时选择是否启动进内存,正好解决了所有的需求。

实现

硬件选择是一台便宜的 Intel NUC,安装两根 4GB LPDDR3 低压内存和一块 120G 2.5 SSD。虽然说起来其实并不需要 SSD(因为数据全部都在内存里,速度比 SSD 更快)但是毕竟日本多震,还是为数据安全着想。毕竟硬盘坏了的话内存系统也无法启动了。

当然如果有集成 32GB eMMC 的小型 PC 的话也是好的选择。

正常安装完 Arch Linux 系统,安装 openssh 和各种必要的服务程序,修改配置文件,然后安装 ramroot 并执行

1
# ramroot enable

此时先别急着重启,先把不需要的包、缓存等文件(/var/cache)删除,保持最小化的根分区。然后再重启。便可看到加载内核 hook 时的提示是否进入内存系统,默认超时后就会自动复制根分区到内存啦。

由于整个系统是运行在内存中的,所以完全没有等待读盘的时间。整个系统的响应速度非常快。限制是内存不够大的话运行一些业务会比较捉襟见肘,而且这样低功耗、低发热的 SoC 处理性能也只能运行一些轻型任务。

下面是一些 IO 性能测试

1
2
3
4
5
6
7
8
9
10
11
12
# ioping -s 1G /
1 GiB <<< . (ext4 /dev/zram0): request=1 time=1.04 s (warmup)
1 GiB <<< . (ext4 /dev/zram0): request=2 time=1.04 s
1 GiB <<< . (ext4 /dev/zram0): request=3 time=1.04 s
1 GiB <<< . (ext4 /dev/zram0): request=4 time=1.04 s
1 GiB <<< . (ext4 /dev/zram0): request=5 time=1.04 s
1 GiB <<< . (ext4 /dev/zram0): request=6 time=1.04 s ^C

--- / (ext4 /dev/zram0) ioping statistics ---
5 requests completed in 5.18 s, 5 GiB read, 0 iops, 988.4 MiB/s
generated 6 requests in 7.20 s, 6 GiB, 0 iops, 853.8 MiB/s
min/avg/max/mdev = 1.04 s / 1.04 s / 1.04 s / 550.7 us
1
2
3
4
5
6
# ioping -RD /

--- / (ext4 /dev/zram0) ioping statistics ---
530.0 k requests completed in 2.49 s, 2.02 GiB read, 212.9 k iops, 831.7 MiB/s
generated 530.0 k requests in 3.00 s, 2.02 GiB, 176.7 k iops, 690.1 MiB/s
min/avg/max/mdev = 3.44 us / 4.70 us / 69.0 us / 1.39 us

可以看到系统根分区在 zram 里,经过压缩因此 IO 带宽受到了 CPU 处理性能的限制。但是 IOPS 依然高得爆表,对比一下 Intel Optane 900P 的 IOPS 性能:

1
2
3
4
# ioping -RD /
--- / (ext4 /dev/nvme0n1p1) ioping statistics ---
163.1 k requests completed in 3.00 s, 56.5 k iops, 220.8 MiB/s
min/avg/max/mdev = 11 us / 17 us / 114 us / 4 us

炒鸡厉害对不对!

不过需要做永久性修改的话还是要下面的方法之一

  • 重新挂载磁盘(虽然并不麻烦)然后手动修改配置文件
  • 重新挂载磁盘然后 rsync zram 到磁盘(方便但是可能会多一些不必要的东西)
  • 重启进入磁盘系统然后运行修改(需要物理接触)

硬件设置

进入系统 BIOS 设置,开启 Power on AC 或设置 Power Failure 后的操作,选择为 Power On (默认一般是 Last State)。

关闭系统、拔出电源,或意外断电后,再接入电源即可自动开机引导系统。因为数据本身就只在内存中,除了运行中的临时更改会丢失,系统和硬盘本体都是安然无恙的。

再也不担心办公室断电检查啦。

大概就是这样。

Phoenix Nemo's avatar

通过 SSH 修正安装有 GPU 的 HPE Proliant 服务器

由于越来越多的渲染、压制等需求,托供货商的关系搞来一台带有独立显卡的 HPE 服务器。经过几番折腾(包括特别奇怪的 LS26-C14 电源线)麻烦了帮忙托管的数据中心的大兄弟好几回,终于算是上架可以开机了。

登入 iLO,安装许可证,启动 iLO Remote Console,打开电源,一切都很顺利。但是 Console 里显示 Early Initialization… 完成后,突然画面一黑,完全没了动静。

以为 iLO 出了 bug,冷重启好几次都是一样的结果。百思不得其解。

再重启一次。仔细观察了一番发现虽然没了画面,但是 POST Code 还是不断变化的,而且 Virtual Media 指示灯不断在闪烁,说明系统仍在正常运行,只是没有视频输出而已。

因此问题定位在视频输出而非系统硬件。既然这台服务器装了显卡,那么很可能是 PCI-e 初始化后视频输出全部交给显卡处理了。搜索了一下 HPE Community,确实有这样的情况存在。解决方案是通过 BIOS 修改显卡设置为默认集成显卡、备选独立显卡。

尝试在设备初始化阶段进入 BIOS,失败。

联系数据中心远程操作的话,可能要等一段时间。

纠结时随便点开 iLO 的管理页面,突然发现了华点:这货居然支持 SSH。

对啦,HPE 的底层系统几乎都是魔改版 Linux,连他们的 SmartArray 都是 Linux 启动一个 Firefox 浏览器来操作的(X

于是正好在网上搜到一篇通过 SSH 修改 BIOS 视频设置的方法。记录如下。

SSH 进入 iLO

确保 SSH 在 iLO 管理页面中已开启,然后使用 SSH 客户端正常连接:

1
ssh Administrator@10.6.254.121

(ssh 用户名是 Administrator 感觉各种违和)

连接到 Virtual Serial Port

命令很简单:vsp

在 iLO 管理页面重启系统,然后等待初始化完成。如果看到按下 F9 进入 BIOS 设置的提示,不要按下它否则会进入 GUI 模式(于是又去独立显卡了就。

看到 ESC + 9 进入 BIOS Setup Utility 时按下键组合,稍等一会儿应该就可以看到提示符 rbsu>

修改视频设置

命令 SHOW CONFIG VIDEO OPTIONS

显示如下

1
2
3
1|Optional Video Primary, Embedded Video Disabled <=
2|Optional Video Primary, Embedded Video Secondary
3|Embedded Video Primary, Optional Video Secondary

即默认关闭了集成显卡,只用独立显卡(不觉得很蠢吗!

于是修改为第三项,默认使用集成显卡,独立显卡作为备用。

1
SET CONFIG VIDEO OPTIONS 3
1
2
3
1|Optional Video Primary, Embedded Video Disabled
2|Optional Video Primary, Embedded Video Secondary
3|Embedded Video Primary, Optional Video Secondary <=

然后敲 EXIT 退出并重启系统。

安装系统和驱动

至此即可通过 iLO Advanced Console 正常安装操作系统。不过需要注意的是进入操作系统后即便安装了对应的显卡驱动,依然默认使用的是集成显卡。以及 RDP 只能使用软解,无法使用独立显卡加速视频输出。这不影响 Blender 或者 Cinema 4D 等直接操作显卡进行计算的程序,但是会影响直接输出视频到桌面的程序。通过 Teamviewer 则可以强制桌面运行在独立显卡上。

顺便吐槽:Blender 把我的工程材质弄丢了…

's avatar

在新款 MacBook Pro 以 EFI 的形式安装 Windows 10

为什么?

最近我想玩 Minecraft Windows 10 Edition,但是我在学校,我自己的电脑只有一部 MacBook Pro 2017。

那为什么不用 Bootcamp 呢?

因为我也不知道为什么,只有无尽的黑屏与 Windows 10 安装向导初始化的画面。我无法开始安装。

而且 Bootcamp 还有其它的缺点,具体可以看 这里

顺便少数派那个教程有点过时了,我在我的新款 MacBook Pro 安装时撞了些坑,所以决定写个新教程,造福人类。

准备材料

  • Windows 10 ISO
  • UNetbootin
  • 8G 以上的 U 盘,建议使用 USB 3.0 的
  • USB Hub(建议使用 USB 3.0 的)
  • 支持 Windows 的键鼠套装
  • 机智的你

我的安装环境

  • 机型:MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)
  • 操作系统:macOS 10.13.5 (17F77)
  • 磁盘:256GB,只有 macOS 分区

分出 Windows 分区

假如你打算留下 macOS,请使用这个命令调整 macOS 分区大小:

diskutil apfs resizeContainer disk1 200GB    # 200GB 指你给 macOS 留的分区大小

这些数值可以酌情调整。但是,请确保有足够的剩余空间。

制作 Windows 10 安装盘

下载好 Windows 10 ISO,插上你的 U 盘,然后先格式化一下:

我们把 格式 设置为 MS-DOS (FAT)方案 设置为 主引导记录

然后我们打开 UNetbootin,选择 Diskimage,打开我们准备好的 Windows 10 ISO。下面的 Type 当然选择 USB Drive,然后将 Drive 设置成你要制作安装盘的 U 盘(如果不确定的话,可以把主机上所有其它 U 盘和读卡器什么的都拔掉,这样就只有一个选项了)。

然后点击 OK,耐心等待写入完毕就是了。

在写入完毕后,我们打开 启动转换助理,选择 操作 => 下载 Windows 支持软件,并将保存位置设为我们的安装盘的根目录下。接下来我们会需要的。

下载即将结束时会向你请求权限,这是正常的,直接输入密码确认就行了。

如果你尝试过 Boot Camp 安装

如果你没有尝试过 Boot Camp 安装,请跳过这一节!

直接照着 这篇帖子 里面的方法做就行。

以及你需要先把 SIP 暂时关掉。

开始安装

把你的 U 盘、键盘和鼠标插上你的 USB Hub,并连接 MacBook。

重启你的 MacBook 并按住 Option 键,你会看到有好几个磁盘的选项。按方向键选择 黄色图标的 EFI Boot,然后回车。

然后先按提示一路走下去,然后到了选择磁盘这一步,你会发现没有磁盘可选。这是正常的,我们还需要加载驱动程序。

我们点击 加载驱动程序,再点击 浏览,找到 C:\WindowsSupport\$WinPEDriver$\AppleSSD64,确定。然后点击下一步。

稍后,我们就可以看到我们的磁盘分区了。我们按照正常的方法创建好分区,然后继续一路向前就是了。

安装驱动

当我们进入安装好的 Windows 10 以后,找到你安装 U 盘下的 WindowsSupport\BootCamp 文件夹,运行里面的 setup.exe,安装驱动程序,然后重新启动就是了。

然后就大功告成了,你的内置键盘、触摸板等一系列硬件都可以使用了。

(在我设备上的)已知问题

  • Windows 睡眠时间过长以后,你需要经过完整的开机过程才能还原。
  • 每次返回 macOS,你恐怕都需要按住 Option 键手工选择 macOS 分区。在设置里改 启动磁盘 不管用。
  • 蓝牙工作异常。
cunky's avatar

使用Rclone在各系统挂载网盘

Rclone是啥玩意儿?Rclone是一款命令行工具,支持在不同对象储存、网盘之间上传、下载以及同步数据Rclone官网:https://rclone.orgGitHub项目:https://g...
IceHoney Blog's avatar

伪随机的种子问题

最近前端的工作不是很多,所以就帮忙写写后端的ruby on rails。在写测试用例的时候,虽然单元测试的数据每次都是随机生成的,但是我们需要根据单元测试来生成API文档。如果测试文档每次都是随机的数据会很难检查每次API更新了什么,所以我们需要在生产测试文档的时候,保证随机数据的稳定性。

Random seed

seed的意义就在于,初始化了随机数生成器。保证了每次随机的结果都一样。例如代码:

@rand = Random.new(1234)

puts @rand.rand

puts @rand.rand(0..1050)

puts @rand.rand(0..1050)

puts @rand.rand

这段代码每次执行都会输出:

0.1915194503788923
674
699
0.2725926052826416

rand range

但是当我们把中间的rand的范围稍微修改:

@rand = Random.new(1234)

puts @rand.rand

puts @rand.rand(10..150)

puts @rand.rand(10..150)

puts @rand.rand

会发现输出发生了变化:

0.1915194503788923
48
63
0.4377277390071145

第一次的输出还是不变,当然2,3两次肯定是变化的,重点是最后一次。我们发现最后一次的随机数也发生了变化。

总结

通过调查ruby源码发现,对于有范围的rand。ruby会不断生成随机数,判断是否落在区间范围内,如果是在范围内就返回,否则继续尝试。默认在0到1之间是百分百命中,所以是随机一次。如果是其他范围,命中次数不一样会导致生成随机数的次数发生变化。所以影响到之后的随机数生成。

参考:

ruby

Random

cunky's avatar

网站重新搬迁了!

这一次算是服务器最后一次更改域名了(笑
嘛 至少以后五到十年不会再修改了
希望大家可以来支持我的博客 谢谢Thanks♪(・ω・)ノ
(至于更新?什么时候有时间了我就会来更新一些有趣的文章

笔记最后更新时间 2018-08-01 16:43

ホロ's avatar

Sailfish OS 移植中(0)- 挖坑

心血来潮,能不能成功还是个未知数 _(:з」∠)_

ホロ's avatar

su, sudo, pkexec 和 root 的二三事

到底有啥区别 _(:з」∠)_

什么是 root 权限?

这里的 root 权限,实际上指的是名为 root 的账户所具有的权限。“获取 root 权限”,指的实际是获取 root 账户的使用权。 root 是系统中权限最高的用户。和 Windows 的 Administrator 相比,权限不知道高到哪里去了。 (注:在 Windows 中想获取较高的权限,可以使用 NSudo)举个例子:Administrator 是删除不了 explorer.exe 文件的, 而 root 可以删除你当前正在使用的 shell 甚至整个系统 。

在 GNU/Linux 上 切换到 root 用户的方法大有三种:

su - 其实是切换用户 (switch user)

su [options] [-] [user [argument...]]

su 其实是用来切换用户的啦~ 如果没参数的话,默认是切换到 root 的,所以会询问 root 的密码。

以及 su 默认只改变 HOME 和 SHELL 变量,可以用 --login (或者更短些的 - )来规避混合环境变量的副作用:

su -

直到离开 shell 之前都能保持 root 权限。

sudo - 家庭常备(误)

sudo(substitute user do) 使得系统管理员可以授权特定用户或用户组作为 root 或他用户执行某些(或所有)命令, 同时还能够对命令及其参数提供审核跟踪。

一个典型的 sudo 操作大概像这样:

$ sudo pacman -Syu
# sudo 会请求当前用户的密码
[sudo] password for horo:
# 然后就可以用 root 权限执行某些操作啦~
:: Synchronizing package databases...

不过不是所有能用 sudo 这一个命令的家伙都能获得 root 权限的啦~ sudo 君有一个小名单,只有名单上的人才可以使用 sudo。这个名单就是 /etc/sudoers 。

为了确保正确的更改 /etc/sudoers 文件,通常会使用 visudo 命令。 visudo会锁住 sudoers 文件,保存修改到临时文件,然后检查文件格式, 确保正确后才会覆盖 sudoers 文件。

pkexec - Systemd 全家桶内置(误)

pkexec allows an authorized user to execute PROGRAM as another user. If PROGRAM is not specified.the default shell will be run. If username is not specified, then the program will be executed as the administrative super user, root.

pkexec 用法上和 sudo 大概差不多:

$ pkexec <command>

不过这个貌似桌面环境里用的比较多,在桌面环境上接下来会弹出一个对话框, 提示汝输入汝自己的密码,大概像这样(GNOME 大概像这样……):

所以这仨到底有啥区别还是没搞清楚 _(:з」∠)_

17windy's avatar

[美羽释厄录]开发进度

本地化 –> 玩家设定 –> 普通怪物设定  –> 小BOSS设定  –> 背包系统 –> 武器系统全家福 –> 经济系统设定 –> 对象池系统 –> 美术资源P1 –> 数据存储读取 –> 第一轮内部测试 –> 开箱系统 –> 商店系统 –> 物品几率掉落 –> 场景整合 –> 三大BOSS –> 美术资源P2 –> 各项菜单设定 –> 音乐音效整合 –> 打包发布

商店场景开箱测试B站 https://www.bilibili.com/video/av30563058/

由于Unity升级后和Bolt又出现了兼容问题,导致无法Build成功(Build的文件闪退),所以先在编辑器里录个屏,编辑器里卡卡的。

关卡战斗演示B站 https://www.bilibili.com/video/av32485793/

(使用初始武器战斗,难度中等。)

开发DLC:

1,解决了无法Build的问题 09-04

2,改进部分弹幕性能表现 09-04

3,游戏执行性能进一步优化 09-15

4,解决了一个导致掉落卡顿影响游戏体验的问题 9-30

更新日期:09-30-2018

Phoenix Nemo's avatar

NetFLOW / sFLOW 流量报告:FastNetMon + InfluxDB + Grafana

最近稍微有点时间折腾了下 Cisco 的三层交换,尝试搭建了一套数据中心用的流量统计/监控/报告系统。过程不是很复杂,但是也只算利用了一套高级软件组合的一点点功能。之后打算继续研究更多的功能实现,不过也要看有没有时间了…

准备工作

首先确认出口路由设备支持 netflow/sflow 的对应版本。一般 Cisco 的路由器或者三层交换都是支持的。

然后准备一个常见的 Linux 系统,虚拟机或者物理机都可以。

出口路由设备能够连通到该 Linux 系统,并且 flow collector 设置到该 Linux 系统的 IP 地址和对应端口。

FastNetMon

安装 fastnetmon,只需要一条简单的脚本命令。

然后将所有要监控的网段加入 /etc/networks_list。一行一个,例如:

1
2
3
10.1.0.0/16
192.168.254.0/24
8.8.0.0/16

按照安装文档打开两个终端,分别启动主进程和客户端

1
/opt/fastnetmon/fastnetmon
1
/opt/fastnetmon/fastnetmon_client

如果没有问题,应该在客户端上可以看到收到的 flow 数据。

先关闭 fastnetmon 进程,修改配置文件打开 Graphite 支持:

1
2
3
4
graphite = on
graphite_host = 127.0.0.1
graphite_port = 2003
graphite_prefix = fastnetmon

=== 2018-07-26 更新 ===

如果有比较新的发行版(内核 >= 3.6)可以开启 AF_PACKET,安装并启动 irqbalance 来获得更好的抓包性能。

InfluxDB

安装 InfluxDB,官方提供了各种包管理器的安装方式。

配置文件一般位于 /etc/influxdb/influxdb.conf,需要根据环境做安全相关设置(侦听地址、端口、鉴权、etc)并打开 Graphite Simulation

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[[graphite]]
enabled = true
bind-address = "127.0.0.1:2003"
database = "flow_dc1"
protocol = "tcp"
consistency-level = "one"
name-separator = "."

# batch-size / batch-timeout requires InfluxDB >= 0.9.3
batch-size = 5000 # will flush if this many points get buffered
batch-timeout = "1s" # will flush at least this often even if we haven't hit buffer limit

templates = [
"fastnetmon.hosts.* app.measurement.cidr.direction.function.resource",
"fastnetmon.networks.* app.measurement.cidr.direction.resource",
"fastnetmon.total.* app.measurement.direction.resource"
]

顺序重启 InfluxDB 和 fastnetmon。检查 flow 数据是否记录到 InfluxDB:

1
2
3
4
5
6
7
8
9
10
11
$ influx
Connected to http://localhost:8086 version 1.2.4
InfluxDB shell version: 1.2.4
> use flow_dc1
Using database flow_dc1
> select mean(value) from networks where direction = 'incoming' and resource = 'bps' group by *
name: networks
tags: app=fastnetmon, cidr=10_1_0_0_24, direction=incoming, resource=bps
time mean
---- ----
0 4735.049632696411

Grafana

Grafana 是一款非常强大且易用的数据可视化工具。安装 Grafana 然后修改配置文件的必要部分,配置文件一般位于 /etc/grafana/grafana.ini

完成后重启 Grafana,将浏览器指向 Grafana 的 HTTP 服务器地址即可看到登录界面。如果内部使用的话,建议关闭匿名访问和注册功能。

使用默认的 admin / admin 登录,按照引导完成配置、添加数据源(Data source),数据源即是 InfluxDB 的 HTTP API 地址。如果 Grafana 中限制了数据源白名单,需要将 InfluxDB 的 HTTP API 地址和端口加到白名单里。

添加面板、Graph,在 Graph 编辑模式里写入类似这样的查询语句:

1
SELECT mean("value") FROM "networks" WHERE "direction" = 'incoming' AND "resource" = 'bps' AND "cidr" =~ /^10_1_0_0_16/ AND $timeFilter GROUP BY time($interval) fill(previous)

即可看到有图表出现。根据需求完善查询语句和图表配置即可简单实现各种可视化效果。例如流量和数据包的实时报告:

总结

通过配合 FastNetMon,InfluxDB 和 Grafana 即可快速实现一套基于 NetFLOW / sFLOW 的流量统计报告系统。但是 FastNetMon 的功能远不止流量统计,Grafana 也有大量插件和灵活的用法可以满足更多需求。如果配置合理,此方案也可适用于 40Gbps+ 接入的中型数据中心且成本低廉。以及——

  1. InfluxDB 真的很快!
  2. Grafana 的图表真的很省资源!
  3. Chronograph 卡死了我的浏览器!(i7-7700K / Chrome)

以及一大早手工修好了 K812 的耳机线,省掉了 2 万日元的线材费用非常开心

's avatar

『博客六周年之旅』

7 月 20 日,我乘坐动车从上海虹桥到了厦门北。

qwe7002Librazy 在厦门北站接了我,带着我乘坐厦门地铁到了岛内。

当天晚上,我们和 TonyPrince、SJoshua 和 Lafit 进行了愉快的聚餐。

在 qwe7002 的劝说下,终于尝试了一下海鲜,感觉还行(

第二天和第三天,我们上午在鹭江道星巴克谈笑风生,下午瞎玩,晚上在厦大学生公寓附近继续谈笑风生。

我们陆续游览了世茂海峡大厦、厦门大学和鼓浪屿。芙蓉隧道超有趣的!

qwe7002 带着我和 Librazy 瞎转,去了各种未必能去的景点。这种悬念真是太奇妙了。

由于机票时间等原因,我在 22 号晚上与 qwe7002 和 Librazy 告了别,在 23 号抱着恋恋不舍的心情独自回到了呼和浩特。

这次厦门之旅真是太棒了,特别是有了 qwe7002 和 Librazy 的陪伴。

我们后会有期!


嗯,至于为什么叫『博客六周年之旅』,是因为在我前往厦门前一天,我的域名到期了,于是赶紧在上海的酒店完成了续费,所以就有了这个比较牵强的名字

ホロ's avatar

咕咕咕

咕咕咕咕咕,咕咕咕,咕咕咕咕,咕咕咕……

挖坑一时爽,填坑火葬场(咕)

  • 某无名魔法书(?)因为名字始终没决定就咕了(偏谁呢~)
  • 前两篇提到的给 Nexus 6 移植 SailfishOS 的工作其实已经接近完成了(大概只剩手机网络和蓝牙了, 不过后来更新 2.2.0.29 (大概是这个版本号吧)以后就炸了 😂
  • 这就是汝咕了接近两个月的理由?

最近?

并没有收广告费的广告

有人群的地方就需要信仰,在這廣大的姬家也不例外,所以就讓我們一起信奉「山景城的始祖鳥〜谷鴿」吧! 參拜時別忘了添香油錢哦!也請大家多多介紹本神社給其他信眾, 別讓巫女「+ 雪月秋水」沒事可做喔!希望本神社能成為姬家的信仰中心,祝福大家好運隨你身,有參拜有保佑。

人群れがあれば、信仰が必要であり、こんな広いG+でも外されないです。だから私達はいっしょにこの 「マウンテンビューの始祖島~グーグル」を信奉しましょう。参拝する時、お賽銭を忘れないでくださいね! 皆さんにぜひ林靜(リンジン)神社を紹介しなければならなくください。巫女(+雪月秋水) は信者のために祈ります! 我々は、この神社をG+の信仰のセンターになることを願います!すべての信者は、幸運を得ることができます。

Where there are people, there is faith. On Google+, we have built a Jinja (Shinto shrine) to collect wishes and good luck. We believe that the Jinja can be a place where people can spread love and peace, rather than a religious site. In this community, we encourage communication among different cultures as well as sharing your wishes and expressing good faith. You can also post your short-term or long-term goals here, and many people will come to encourage you and wish you good luck. Yukizuki Akimizu, our miko (Shinto priestess) is waiting for your arrival at the entry. Please make donations to the Jinja to support the daily expense such as food and drinks for the miko.

—林静神社 - https://plus.google.com/communities/117905230530560564263

并没有收广告费的广告 02

广告位招租……

😂

依云's avatar

使用 iptables 透明代理 TCP 与 UDP

本文来自依云's Blog,转载请注明。

很早之前,我在《Linux「真」全局 HTTP 代理方案》中介绍了 redsocks 方案。不过它只处理了 TCP,并没有处理 UDP,DNS 也是采用强制 TCP 的方式来处理的,再加上它本身还要将请求转发到真正的代理客户端,延迟比较高。然后,还可以结合 Wi-Fi 分享 或者网络命令空间,玩点更有趣的。

首先要有支持的代理客户端,比如 ss-redir。这个就不用多介绍了,配置好、跑起来即可。以下假设此代理跑在 127.0.0.1 的 $PPROT 端口上。

然后,TCP 的代理设置。使用的是和 redoscks 一样的方案。这个比较简单,除了有一点需要注意:DNAT 到 127.0.0.1 时,需要设置内核选项net.ipv4.conf.all.route_localnet=1

最麻烦的是 UDP 的代理,使用的是 TPROXY。首先,需要把要走代理的数据包路由到本地。以下假设我们给要代理的数据包打上标签 1。那么执行:

ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100

那个 100 是路由表的编号,可以自己选一个喜欢的。

然后,对于转发流量(来自局域网或者另外的网络命名空间),直接把需要代理的数据包扔给 TPROXY 目标,并且打上对应的标签即可。而对于本地产生的流量,不仅要带有对应的标签,而且需要在 OUTPUT 链打上一个(与之前不同的)标签,触发 reroute check 才行。

最后,对需要代理的数据包设置 iptables 规则:

协议 来源 目标
TCP 本地 nat OUTPUT -j REDIRECT --to-ports $PPROT
转发 PREROUTING -j DNAT --to-destination 127.0.0.1:$PPROT
UDP 本地 mangle OUTPUT
PREROUTING
-j MARK --set-mark 1
-j TPROXY --on-port $PPROT --on-ip 127.0.0.1
转发 PREROUTING -j TPROXY --on-port $PPROT --on-ip 127.0.0.1 --tproxy-mark 1/1

比如来自网络命名空间或者局域网的 IP 段 192.168.57.0/24 全部走代理:

iptables -t nat -A PREROUTING -p tcp -s 192.168.57.0/24 ! -d 192.168.57.0/24 -j DNAT --to-destination 127.0.0.1:$PPROT
iptables -t mangle -A PREROUTING -p udp -s 192.168.57.0/24 ! -d 192.168.57.0/24 -j TPROXY --on-port $PPROT --on-ip 127.0.0.1 --tproxy-mark 1/1
imi415's avatar

Arch Linux的蓝牙音频sink媒体控制配置

标题有点长……
ArchWiki里介绍了如何使用PC作为蓝牙音频Sink,将手机等设备的Bluetooth音频经由系统回放设备输出,本文章介绍如何将设备输出的媒体信息通过MPRIS兼容控制插件读取并控制。

TL;DR:

随便找个地方运行

mpris-proxy

Log

下面的部分介绍如何找到这个Bluez内置功能的

根据Ask Ubuntu等地的回复,Bluez从5.0起支持设备媒体信息发送到D-Bus,从位于 org.bluez/hciN/dev_YOUR_DEVICE_BT_MAC_ADDRESS/org.bluez.MediaControlN 的属性中即可读取音频信息,相同节点的方法即可控制设备播放状态(如下图)

这马赛克打得完全没意义,算了
然后就想到,能不能把这一部分和D-Bus的MPRIS消息对接,实现系统MPRIS控制设备播放状态。
搜索了一圈发现没有人做这一部分,还有点小兴奋,有坑?开!
然而,随便换了几个关键字,突然发现manpage里有一条名叫mpris-proxy的页面,打开一看居然是属于bluez本身的东西……看了看居然完全满足需求,一时间心情复杂……
所以……

"Comment and Close"

此坑已死。

mpris-proxy工具说明:

imi415@imi415 ~ % mpris-proxy -h
Usage:
  mpris-proxy [OPTION?]

Help Options:
  -h, --help        Show help options

Application Options:
  -v, --version     Show version information and exit
  -e, --export      Export remote players

imi415@imi415 ~ % 
依云's avatar

Linux 下获取文件的创建时间

本文来自依云's Blog,转载请注明。

其实 Linux 是支持文件的创建时间的呢。不过不是所有文件系统都支持,比如 ext4、xfs、btrfs 都支持,zfs、vfat、ntfs 不支持。

但是呢,用户基本上是看不到的。文件系统有记录,但是没有 API 可以获取到这个数据。所以你用 stat 命令的话,会看到「创建时间」一行总是「-」。用 debugfs 搞 ext4 是可以的,但是那个需要 root 权限,并且一不小心会搞坏文件系统。

最近,我阅读内核源码时,忽然发现内核已经通过 4.11 版本引入的 statx 系统调用支持获取创建时间了。字段名里用的是 btime(birth time),没有用 crtime(creation time),也没有用大写的 Btime 呢。

但是 glibc 并没有支持,所以要用 syscall 函数来调用。也不是很复杂。不过我正着手用 Rust 实现的时候,却在内核源码树里找到了 samples/statx/test-statx.c 这么个文件。原来有现成的啊!

gcc 编译一下,还真好用:

>>> statx /
statx(/) = 0
results=fff
  Size: 224             Blocks: 0          IO Block: 4096    directory
Device: fe:01           Inode: 96          Links: 17
Access: (0755/drwxr-xr-x)  Uid:     0   Gid:     0
Access: 2018-07-11 13:33:08.659477830+0800
Modify: 2018-03-30 15:06:02.645864827+0800
Change: 2018-03-30 15:06:02.645864827+0800
 Birth: 2017-06-19 21:07:53.653467000+0800
SgDylan's avatar

EmiyaEngine 杂谈录 「其二」

上一篇中谈到了心理声学与人造玄学,其中为说明采样虚拟乐器的不完全「HiRes」,
拿了两首所谓的「HiRes」音乐做了可视化谱分析,说到了一些可能不太正确的推论。
本篇继续推进,站到技术层面窥视他们背后的原理。

IceHoney Blog's avatar

Web离线的解决方案

最近的工作是做嵌入在IOS程序内部的页面,其中有一个需求就是需要满足在离线的情况下显示页面。当然,现在主流的离线方式是使用Service Worker来完成离线需求。 但是IOS内置的WKWebView并不支持最新的Service Worker(取决于IOS版本)最新版本已经支持,所以不得不想办法来解决。

Application Cache

AppCache是一个过时的技术,但是在IOS下勉强还能用。不过Chrome对这种过时的技术支持不是很好,单个缓存文件最大只支持5MB。而且还有请求的BUG:Accept header on GET request for appcache manifest。触发AppCache是在html标签中添加manifest属性。


  ...

通过manifest.appcache文件来定义需要缓存的文件,不过载入manifest.appcache的页面会被作为Master entries缓存起来。因为AppCache出现的时候还是以静态网站为主,所以并不能缓存请求的Ajax数据。我们需要自己再手动实现缓存所有请求在localStorage,但是localStorage同样也有最大5MB的限制。所以也需要考虑相应的解决方案。不过,我最终采取的方式是通过嵌入iframe来实现触发AppCache,这样做的好处是因为SPA应用是自己来控制路由的,所以导致每个路径都会保存一份Master entries。但是通过iframe的话,我们的Master entries永远只有一份。并且当前页面的所有资源也被顺利缓存,因为SPA无论访问哪个路径返回的都是相同的index.html。由JS来控制路由并加载相应的组件。

这里要补充的一点是,针对https的Application Cache是无法完成跨域请求的,所以请慎重。

WorkBox

Service Worker是现在主流的缓存技术,会帮你缓存所有的静态文件和数据请求。但是对于SPA项目,我们不可能自己手动书写缓存清单。所以还是借助现有的开源解决方案,这里最出名的解决方案是谷歌的Workbox。通过使用Webpack插件和简单的配置,我们便可以做到缓存所有的静态资源和数据。Service Worker有很多种缓存策略可以选择,例如Cache First和NetWork First。但是AppCache每次都会优先使用缓存,然后再去更新最新的文件。所以我们不得不在发生更新的时候去重新加载页面。

总结

最终的解决方案是优先使用Service Worker,当不支持Service Worker的时候再回退到AppCache。但是想要从AppCache升级到Service Worker的时候,必须清除所有AppCache的所有数据。浏览器并没有提供相应的接口,我们目前采用的方式是手动删除AppCache储存的数据库来完成这一需求。

参考:

Using the application cache

HTML5 Offline Application Cache

Application Cache plugin for Webpack

Workbox webpack Plugins

Appcache Facts

HY's avatar

Dark Souls II

魂2基本上玩的快通关了。 虽然魂2的确有不少亮点之处,但是也是知道了为什么魂2被骂得这么惨的原因。魂2整体作为 […]
's avatar

我(曾经)设想过的外置智能大脑

因为一些我不知道的原因,我感觉我情商是负的,在社交等场合常常遇到挫折。

我感觉我的大脑缺乏其它人在情感与社交方面的硬件加速。因此,我一直设想一款外置大脑,可以帮助我解决现实生活中的实际问题,令我的情商提升 -200%。

  • 通过机器学习,预测现实生活中我说出不同话语导致的不同结果,从而让矛盾最小化,生活顺利率和声誉最大化
  • 通过大数据技术:
  • 通过 AI,帮助我自动喷人,对抗那些喷子
  • 通过区块链技术记录下那些欺负我的人
  • 通过机器学习,制订出最好的计划

这样,我的大脑就省去了很多负担,我可以安心的写垃圾 JavaScript 代码了!

(未完待续

's avatar

100% 橙汁修改器更新 (3.1.271)

更新 3.1.271

游戏发布了新版本(v1.27.1),修改器进行了相应的维护性更新。

没有新增功能,仅修复了游戏版本更新带来的兼容性问题。

100% Orange Juice 修改器

's avatar

没用的无懈可击

近年来,我终于意识到为什么我总是不开心,因为我试图让自己无懈可击。

上初中的时候,我所在的班级管理严格,如果出现违反班规的情况,那么就会有惩罚。最常见的就是罚抄课文。

因为我初中的时候就被我同学在暗处捅过很多刀子,向负责罚抄课文的班干部举报我,本来无关紧要的小细节被炒成一件严重的问题(比如忘了关灯、迟到不到一分钟但老师都还没来),作为惩罚,我不得不常常一两点才睡觉。

天真的我以为,只要我做的更好,那么他们就不会惩罚我了。但我并不是计算机那样的东西,我还是偶尔会犯错误,被那些平时笑脸相迎的同学找到把柄,被拿去告状。(其实我们并没有那种告状就有奖励的机制,但也许他们告状的动机是为了看我被惩罚来获得愉悦感?不过我跟他们表面上的关系都不算很好。)

我找老师说他们老告我状,然而我们老师总会说类似『为什么人家不告别人就告你,肯定是你自己有问题』。我很难受但是无语。

于是,我开始试图让自己变得无懈可击,来确保人家根本抓不到我的把柄。有一次我意识到自己要迟到,马路上全是车,还努力往学校跑,差点被一辆疾驰的车撞飞,我恰好闪了过去,侥幸逃过一劫。

但后来我每天很累的努力让自己什么问题都没有,却还是会被同学抓住我的把柄,然后我依然要接受惩罚,抄课文抄到一两点。

最后在母上大人的支持下,我公然拒绝抄课文,最后强行把事件捅到了班主任那边,我们班主任还和母上进行了一番谈话……

就这样,我再也没有抄过课文。

然而我努力让自己无懈可击的心理并没有就这样消除。从各个方面,我害怕别人批评我、害怕我做的有一点不完美、害怕哪一天又有人从很小的细节抓住我的把柄,然后强行上升到某种高度,把我打压下去。于是总是习惯性的把自己搞的很疲惫,直到我有理由感叹『嗯,别人肯定找不到理由抓我把柄』了。

依云's avatar

递归遍历目录:Python vs Go vs Rust

本文来自依云's Blog,转载请注明。

群友提出了一个简单的任务:递归遍历一个很大的目录,根据文件名数一下有多少 JPEG 文件。怎么最快呢?然后他用了 Go 语言实现。

我忽略想起 Python 3.5 的 What's New 里提到,他们优化了 os.scandir 使得目录遍历快了好几倍(PEP 471)。其核心思想是:不进行不必要的 stat 系统调用,因为读目录获得了不少信息,原来都是丢弃掉了,现在改成了通过 DirEntry 对象来返回。这些信息包括文件名等,刚好有我们需要的。

于是 Go 做了这个优化没有呢?

翻了一下代码。Go 自带的实现位于 src/path/filepath/path.go 文件中。可以看到,它对每一个文件都 lstat 了。后来一阁指出,不仅如此,而且它还莫名其妙地对目录下的文件名进行了排序

呃,前者可以说是疏忽了,毕竟 Python 也是直到 3.5 才优化的。可是,它排那个序干嘛呢……

然后我又想到,Rust 那边如何呢?

结果是,Rust 对它所包含的东西非常审慎,标准库里并没有递归遍历目录的函数。那我们自己写一个?才不呢,用第三方库啦!可以看到,它也是返回 DirEntry 对象的。

后来了解到,Go 也有一个第三方的实现 godirwalk,对这些细节进行了优化。

光是了解实现不够。我们让它们来比试一下吧。顺便,把 find 和 fd 也拖进来好了。

任务:数一数一个拥有近万文件的目录下有多少 JPEG 文件。

实现代码:walkdir-test

结果:

   Rust: top:    4.78, min:    4.72, avg:    4.90, max:    5.46, mdev:    0.17, cnt:  20
 Go_3rd: top:    7.71, min:    7.64, avg:    7.79, max:    8.41, mdev:    0.16, cnt:  20
   find: top:   11.49, min:   11.32, avg:   11.76, max:   14.18, mdev:    0.59, cnt:  20
     fd: top:   18.17, min:   15.18, avg:   21.29, max:   29.94, mdev:    3.84, cnt:  20
     Go: top:   21.08, min:   20.91, avg:   21.28, max:   22.70, mdev:    0.37, cnt:  20
 Python: top:   29.66, min:   29.51, avg:   30.43, max:   35.84, mdev:    1.45, cnt:  20
Python2: top:   30.37, min:   30.10, avg:   30.85, max:   33.15, mdev:    0.75, cnt:  20

Rust 如预期一样是最快的。Go_3rd 就是那个第三方库的实现,也非常快的。fd 是 Rust 实现的,目标之一是快,但是这次并没有比老牌的 find 快。Go 自带的那个实现,十分令人遗憾地连 find 都没比过呢,不过还是比 Python 快了不少。Python 2 这次终于没有跑在 Python 3 前边了(虽然差距很小),我猜是 PEP 471 那个优化的功劳。

对了,还有代码行数:

  15 Python/walk
  29 Rust/src/main.rs
  30 Go/walk.go
  33 Go_3rd/walk.go

Rust 竟然不是最长的。不过确实是字符数最多的。

话说 Go 的 } 竟然也是有规定的,结构体的不能另起一行写,只能跟 Lisp 的风格那样堆在一行的尾巴里。

PS: 没想到之前给 swapview 写的 benchmark 程序在另外的项目里用上了呢,果然写东西还是通用些的好。


更新:在群友的提示下,我找了一个更大的目录来测试,结果很不一样呢。这次遍历的目录是 /usr,共有 320397 个文件。

     fd: top:  265.80, min:  259.84, avg:  273.89, max:  319.76, mdev:   15.03, cnt:  20
   Rust: top:  269.98, min:  266.86, avg:  272.82, max:  282.84, mdev:    4.17, cnt:  20
 Go_3rd: top:  361.17, min:  359.05, avg:  363.82, max:  370.22, mdev:    3.31, cnt:  20
   find: top:  454.03, min:  450.79, avg:  458.51, max:  467.31, mdev:    5.08, cnt:  20
 Python: top:  624.80, min:  615.73, avg:  630.67, max:  640.88, mdev:    6.79, cnt:  20
     Go: top:  890.03, min:  876.98, avg:  910.63, max:  967.14, mdev:   24.84, cnt:  20
Python2: top: 1171.38, min: 1157.19, avg: 1189.99, max: 1228.09, mdev: 4186.28, cnt:  20

可以看到,唯一的并行版本 fd 胜出了~Rust 版本紧随其后,显然在此例中并行并没有多么有效。Go_3rd 还是慢于 Rust 但也并不多。然后,经过优化的 Python 终于在更大的数据量上明显胜过了 Go 以及 Python 2 这两个浪费了很多系统调用的版本。

Dimpurr's avatar

如何在 Krita 中创建材质笔刷

Krita 是 KDE 基金会项目下的一款专注于数码图形绘画 (Digital Art) 的跨平台开源软件。

在 Krita 官方讨论区 Krita Tutorial & Resources 板块和官方文档 Resources 页面可以获得许多有用的材质和笔刷。本文主体内容改编翻译自 https://forum.kde.org/viewtopic.php?f=274&t=140349

钉子的知识库: http://note.dimpurr.com/#艺术和动漫绘画学习索引

今天我将教你们如何创建一个酷炫的材质笔刷。如果你需要一些类似 Photoshop 的双重画笔一样的工具,那就是这个没错了。我想这是材质绘制的极佳方式。让我们开始吧:

首先创建一个基本笔刷贴图尺寸的文件(我使用 300*300px)并删除背景。

插入(或者手动绘制)「基础」贴图。这个贴图会决定笔刷贴图的形式、尺寸、比例并仅用于创建选区。随后右键点击该图层,在菜单中选择「选择不透明度 (Select Opaque)」。

image

隐藏这个图层,并创建 5-10 个新图层。

选择某个材质笔刷,并在空白图层上绘画。使用随机的分散/镜像/旋转设置以增加贴图的多样性。对每个图层都这样做。你可以设置分离图层(Isolate layer)或者 Alt + 点击 切换单独绘制每个图层让这个过程舒服一点。

image

现在让我们创建新的动画笔刷材质。点击 +印戳 (+Stamp) 按钮并选择 风格:动态 ,模式 :随机 (当然你也可以是用别的)。

image

这将会使用目前所有的可见图层作为笔刷的贴图。不要使用自动间隙(Auto Spacing),记得为笔刷命名。你需要反复尝试让笔刷变得正常,可以直接在画布上测试你的新笔刷。

image

于是我们有了一个还未经设置的笔刷贴图,接下来进行一系列配置吧。对于方形笔刷贴图,我建议你使用镜像(Mirror)以增加多样性。对圆形笔刷贴图你也可以使用旋转(Rotation)。你也可以调节空隙曲线增加某种动态笔压,我以这种方式让高压力时能画出厚重的线条。

image

别忘了设置你还可以使用滤镜(filters),有时候我会使用非锐化蒙版(Unsharp)、模糊(Blur)、色彩调整曲线(Color Adjustment Curves)。色彩调整曲线(Color Adjustment Curves)在透明通道(Alpha channel )绘制的时候特别有用(当然平常也有效)。

后面是最终效果的一些例子。在我的笔刷包中,我做了许多有用的基本笔刷、材质笔刷并做好了预设。

image

本文来自 钉子の次元 - Dimpurr - 千里之行,始於足下。 ,原文地址 如何在 Krita 中创建材质笔刷

Phoenix Nemo's avatar

在线扩展 LVM root 分区

才不是没东西写了呢

遇到一个奇葩的原因导致 root 分区被占满的。而且还是奇葩的 CentOS,root 分区是 LVM,Hypervisor 里扩展磁盘后无法直接用 resize2fs。

ホロ's avatar

Sailfish OS 移植中(1)- hybris-hal

Android HAL _(:з」∠)_

lwl12's avatar

明日之心,高考加油~

如果结果不如你所愿,就在尘埃落定前奋力一搏。

 
现在是 2018 年高考前夕啦,去年差不多这个时候,lwl 也发了一篇贺文呢。
 
嘛,今年祝各位用明日之心成就明日之星!
 
本博主今年也有考试啦_(:з」∠)_
 

's avatar

与 tcdw 同款的博客主题 Egoist 发布了

我建设自己的个人独立博客已经有近六年时间,但是并没有真正属于自己的博客主题,因为我能力不足,加上当时我还在上中学,使用电脑并不方便。

大学以后,我就设想为自己设计一款专用的博客主题,并且在今年年初完成了这一目标。

虽然我之前制作和修改过一些符合我喜好的博客主题,但这的确是我第一个完全从零开始手写的主题,除了 Normalize.css、highlight.js(样式)和 FontAwesome。

于是,我删除了若干我个人的元素以后,将其以 HTML 模板的形式开源。本博客目前使用的主题,就是这篇博文发布的啦。

项目地址(无耻求 star

发布形式

我决定以 HTML 文件而非某款博客程序专用主题的形式开源,是因为我希望我的主题的定位是一款通用的博客主题,虽然需要被单独适配才能开始使用。

不过,如果你已经给你喜爱的博客程序适配了这款主题,欢迎提交 Pull Request 来加入列表。

IceHoney Blog's avatar

如何封装第三方vue组件

终于算是正式接触SPA的前端工作了,最近在解决很多Vue组件的问题,其中就有一个针对第三方组件的定制化需求,花了不少时间来折腾。

解决v-model绑定

这次封装的就是element的前端vue框架,因为框架本身对IOS兼容性不好,所以需要二次封装。封装的是一个select组件。所以需要数据的双向绑定,官方教程也已经解释了。 v-model 本质上就是绑定一个值和监听相应的事件。 这次本质是封装的一个input元素,所以我们需要手动绑定value和监听事件。


  
  

官方文档也解释了这个内置变量的用法vm-listeners

继承父元素的属性

父元素的属性继承可以使用v-bind="$attrs"来完成。所以完成组建的透明封装只需要加上三个指令。


  
  

虽然知道答案之后很简单,但是探索的过程中还是比较花时间的。希望能帮助大家解决这个问题,如果有什么疏漏之处,也请大家指正。

's avatar

tcdw 与 ECMAScript

其实 tcdw 小时候并没有对计算机特别感兴趣,tcdw 曾经的梦想是当一名建筑设计师。但是,因为在 tcdw 很小的时候家里就有了一台电脑,tcdw 还是玩了很多奇怪的东西,包括 Frontpage 2003。

那时 tcdw 出于好玩的目的,设计了一个又一个版本的个人网站框架,除了内容。 tcdw 还设计了一套自己的『前端样式库』(其实只是在 Frontpage 的 CSS 选项菜单里把所有 HTML 标签都那么定义了一下样式)。

然而 tcdw 发现自己的网站总是缺点什么。好奇的 tcdw 通过右键点击来观察,终于发现了有一种神奇的东西叫 Flash。2006 年, tcdw 的舅舅送给 tcdw 一张 Macromedia MX 全家桶光盘、一张网页素材大全 DVD,还有一本 Flash MX 教材。于是 tcdw 便很开心的开始制作奇怪的 Flash,并嵌入到自己做的网页里。后来 tcdw 又缠着母上大人买了一本《精通 Flash 8》和一张 Flash 8 的盗版 CD。有了滤镜特性,tcdw 做的更来劲了。

2007 年,tcdw 从《小读者》杂志注意到袁日涉拥有自己的环保网站,tcdw 很羡慕,便进去看了看。当 tcdw 看到她在 2006 年的获奖作品《从纸到树的生态研究》里的 Flash 导航菜单,tcdw 很诧异:为什么那个菜单背景可以跟着鼠标移动,而且还会缓动变色?

虽然那本书上已经讲了一些 ActionScript,tcdw 也能照着书上的例子使用 gotoAndPlay 之类的 API 控制播放,但是那两本书讲的非常粗略,因为都是主要讲 Flash 动画制作,而不是 Flash 编程。

后来 tcdw 摸爬滚打的求助度娘,终于发现有一家网站叫闪吧,那边有大量的 Flash 资源。tcdw 如饥似渴的下载了大量的 Flash 源文件,观察它们是如何运作的。这时 tcdw 才发现,原来 ActionScript 可以写的更加复杂!

于是,tcdw 照葫芦画瓢的尝试,凭借小学学的那点英语判断各种关键词的意图,初步建立了编程的概念。而当时 tcdw 也发现了有一款软件叫网页特效制作专家,里面集合了大量的网页特效。因为它们的本质都是 JavaScript,tcdw 也开始靠着复制粘贴奇怪的代码片段,试着拼凑一些不需要 Flash 的网页特效,结果还很成功。不过因为 HTML 4 的表现力太有限了(而且 tcdw 还在用 Frontpage 2003 + IE 6 的坑爹组合),所以 tcdw 的重心依然在 Flash 上。

闪吧投稿的质量也是参差不齐。因为很多投稿人本身对编程也没有太深入的研究,只是用一些意大利面代码完成一些交互性的东西,以至于他们写的代码就有很多逻辑缺陷,而 tcdw 盲目学习他们,对自己的编程思维产生了很多负面影响。

2008 年,tcdw 为杨静翻唱的《雪人》做了一个 Flash MV。那是 tcdw 当时做过的最复杂的 Flash 了,不仅用到了很多 Flash 元件,还使用了 tcdw 学到的 ActionScript 实现了雪花特效以及一个很中二的『拖动光盘到标题文字即可开始播放』的功能(用到了 hitTest 这个 API)。做完以后,得到了父母的赞扬,还在小学的多媒体设备上,向全班同学放了一遍。那是 tcdw 最信心满满的时刻之一了。

闪吧投稿

到了 2010 年,tcdw 感到自己的 Flash 制作已经有了套路,而且有些东西看起来比闪吧上已有的一些源文件(包括粗制滥造的、从同一个教程复制粘贴的)质量还要好。那时,tcdw 做过的最复杂的 Flash 作品是一个交互性比较高的音乐播放器,可以调节进度、音量、播放列表,还有 LRC 展示,以及 没有完工的、基于搜搜的在线搜索音乐并添加到当前播放列表的功能(换成 2018 年应该是基于网易云音乐的吧)。不过遗憾的是,这个播放器在 2010 年的一次 U 盘故障中丢失了。

于是,tcdw 大胆的尝试往闪吧投稿。tcdw 做的一个中看不中用的光影特效、俩鼠标特效和一个 Flash 调色板都审核通过了。 tcdw 在自己的作品介绍里都留下了 QQ 号,然后还真的有不少人加 tcdw 好友,而且大概有 30 多人吧。于是 tcdw 还建了一个 QQ 群,叫『闪客交流』。

每当有人问 tcdw 问题,tcdw 一般出于保持脸面的考虑,会凑合回答一下;tcdw 也遇到过一大堆伸手党,这时 tcdw 就很高冷的说:『闪客教学,收费。』然后他们就走了(没人真的来付费希望 tcdw 教他们

其实 tcdw 也不是没有接纳过伸手党的所谓任务。有一个伸手党希望 tcdw 帮忙做一下他的 Flash 作业, tcdw 当时傻乎乎的同意了。但 tcdw 后来发现他的那个作业还很难做,而 tcdw 还没在人家的 deadline 以前搞定。 tcdw 就想:『我凭什么要为他做作业?』

想到这里, tcdw 便告诉他:『你的作业我不做了。』因为 tcdw 当时的态度也不得当,人家便进 tcdw 的 QQ 空间大骂 tcdw 是骗子云云(当然那些评论都被 tcdw 删除了)。后来吸取了教训,就再也没有承担过那种一上来就求做作业的伸手党的任务。

牛逼的 QQ 空间红人

从闪吧过来加 tcdw QQ 的人,有两位开了很多钻,QQ 空间里面全是 Flash,看起来特别炫酷,还标榜是『blahblah 的腾讯博客』、『网络红人』什么的, tcdw 羡慕死了,为什么 tcdw 的同学开了黄钻,却还在用官方那几套模板?如果做一套很炫酷的 QQ 空间模板,一定会受到周围的人羡慕、尊敬啊!

当时 tcdw 也开通了自己的个人网站,用的是 5944 的免费空间,而且访问地址更新事宜已经在 tcdw 的 QQ 空间公告了好几次(虽然大概没人真的看过)。于是, tcdw 把专门为自己 QQ 空间做的 Flash 传到了自己的免费空间,再在 QQ 空间引用自己做好的 Flash。果然,有很多『萌新』开始加 tcdw 的 QQ 了。

其实 tcdw 当时做的 Flash 并没有什么技术含量:把一些非主流的元素加进去,用 tcdw 小时候学会的 Flash 动画制作方法把它们耦合在一起,再用意大利面的 ActionScript 代码让它们做点什么交互性的事情,最后把 Flash 糊上 QQ 空间就是了。

当时还有一种叫 QCC 的东西非常火爆。其中有一家推出的 QCC 模板非常华丽,功能也很齐全(比如可以读取你的日志列表、显示最近访客等等),收费还记得是 60 元一年、100 元永久。但人家的反逆向工程还是可以的,用 Sothink SWF Decomplier 和 ASV2010 打开,程序都会崩溃。不过后来 tcdw 还是想办法把他们的那个音乐播放器元件结构逆向了出来,并填充了 tcdw 自己写的 ActionScript 代码,实现了一致的功能。

至于空间日志展示等功能, tcdw 也解决了。2010 年的某一期《电脑爱好者》杂志,有篇文章安利了 Chrome 浏览器,表示你可以用里面的开发者工具做很多事情,比如通过录制 Network 动态来下载 FLV 视频。于是 tcdw 下载了 Chrome 浏览器,通过观察 Network 的动态,发掘了很多 tcdw 梦寐以求的 QQ 空间私有 API。然后 tcdw 通过 split 大法解析 JSON,实现了各种付费 QCC 才有的高级功能,吸引了好多人的目光(其实最多也就几十人)。同时 tcdw 发现 Chrome 浏览器在他爸花 2k 装的坑爹 Windows XP 台式机运行非常快,于是 tcdw 便从 IE 6 / 8 用户变成了一名 Chrome 用户,直到今天。

原来 Flash 已经开始被人讨厌了呢

然而好景不长,当 tcdw 在制作功能更高级的 QQ 空间 Flash 时,腾讯突然宣布:为了防止有人通过 Flash 盗取 QQ 密码,从 2011 年 8 月起只允许在白名单列表的网站的 Flash 被插入到 QQ 空间首页。

那还玩个屁啊!只见各种 QCC 卖家和 QQ 空间 FD 模块作者哭天喊地,希望 QQ 空间能够解除这种限制,但是并没有什么用。期间虽然有人发现了一些绕过方法,但是后来都被封堵了。再后来 QQ 空间推出 6.0 版,以前的一大堆套路全失效了。tcdw 也是在那时渐渐跟 tcdw 认识的那群闪客疏远,最后在一两年前的一次 QQ 好友清理中被 tcdw 删除了。

没有 Flash 的 QQ 空间是无聊的。再往后,tcdw 觉得 QQ 空间没什么好玩的,就不再续费黄钻。tcdw 的黄钻等级从 7 级一路下滑到 1 级了。

2011 年,tcdw 恰好通过 ZYH 的 NES 模拟器『ZYH Emulator』知道了百度超级马里奥吧,后来又找到了超吧大水库吧,然后认识了 Jixun。Jixun 菊苣是一个很厉害的人,不仅帮助 tcdw 修改过很多意大利面代码,还让 tcdw 知道了 HTML5、GitHub、响应式页面等很多新奇的东西,让 tcdw 大开眼界。

但在接下来几年里,由于学业原因,tcdw 的 JavaScript 学习就停滞了。虽然期间 tcdw 利用 HTML5 API 做过一些类似 HTML5 音乐播放器之类的东西,但是他的编程思维还是小时候的那套。

吐槽大王与主流 JavaScript

2014 年底,tcdw 在百度免费空间吧 QQ 群看到有人发布了 Hostker 的链接。tcdw 进去一看,发现跟自己熟悉的那种虚拟主机官网很不一样,看上去非常亲和。在示例用户那一栏,tcdw 看到了 卜卜口 的博客,点进去一看,发现样式很新奇,页面加载速度也很快。tcdw 试图查看源文件,却发现只有几个看似单薄的 js 文件。后来通过体验他的 妹 blog,tcdw 第一次拥有了关于 SPA 的概念。

后来,tcdw 在一次偶然的机会认识了 佳佳酱,进而认识了一群有趣的人。tcdw 从他们那里知道了 Node.js,便信心满满的开始编写一些会读取文件的、看起来很正经的东西。然后 tcdw 便发现,自己写的代码不符合他的期望:

var fs = require("fs");
var str;
fs.readFile("1.txt", {encoding: "utf8"}, function(err, txt){
    if (err) throw err;
    console.log("文件读取成功!");
    str = txt;
});
console.log(str);

tcdw 想:我是想先输出『文件读取成功』再输出 1.txt 的内容啊,为什么是先输出 undefined 再输出『文件读取成功』?tcdw 很困惑,他上网搜索答案,知道了这是因为 JavaScript 的异步处理方式导致的,但是一大堆文章都没有给出较好的解决方案。后来,tcdw 便改用了 fs.readFileSync 来读取他的文件,实现了他期望的那种顺序执行。

但后来 tcdw 想使用 superagent 库来读取网络的内容来帮他不断在 SMW Central 的某活动中刷帖,但那个库并没有提供同步方法。于是,tcdw 想到了一个馊主意来实现他期望的同步执行,其实就是 Callback Hell

tcdw 还通过 setTimeout 来延时,并递归调用请求函数,试图实现不间断定时刷帖。但 tcdw 的程序运行了没多久,就因为 Maximum call stack size exceeded 错误崩溃了。那时的 tcdw 想不到更好的办法,就只好在他的 VPS 上设置了一个 cron 任务,每半分钟重新调用一次脚本来发帖。

问题是解决了,但 tcdw 渴望知道究竟该如何玩转 JavaScript 的异步编程,于是通过不断努力,终于搞明白了这些奇怪的事情。

好耶,是 ES2015

直到 2017 年,tcdw 终于结束了高考。tcdw 终于开始系统性的学习 ES2015,不仅学到了很多已经存在几年的新特性,还拥有了新的思维。

同时,tcdw 终于开始大胆尝试接触以前他觉得很复杂、难以搞懂的东西,比如 webpack、rollup 之类的打包工具。与此同时,tcdw 深入的学习了一些更加抽象的知识,比如 DOM 和面向对象思维。总之大学以来的一年是 tcdw 进步最大的一年,算是可喜可贺吧。

总结

由此可见,tcdw 走的这条路其实非常不科学,以至于 tcdw 尽管很小就接触编程,但不仅没有取得骄人的成绩,还跟很多同龄菊苣的水平差距巨大。tcdw 还残留了很多古董的编程思想,以至于很多人看到 tcdw 写的代码都感到有些莫名其妙。

不过那些事情都过去了,而且我距离毕业还有几年。于是对于弥补一些事情来说,还是来得及的吧。

h404bi's avatar

再谈谈 Scoop 这个 Windows 下的软件包管理器

如果你是偏重度的用户,想尽量多的软件可以用命令行管理,又不在乎我前文说的 Chocolatey 的软件包描述文件相对复杂等缺点的话,其实可以去试试使用 Chocolatey。而如果你没那么强烈的需求,只是像我一样有一点点“绿色软件洁癖”, 同时想用命令行管理部分软件包,并且以此构建一个相对轻量的命令行环境的话, 不妨可以尝试一下 PowerShell + Scoop + Cmder 这套组合。
依云's avatar

这个博客要死了

本文来自依云's Blog,转载请注明。

很早的时候,那个时候我还在读大学,博客火了一阵。

那时候我刚拥有自己的计算机没多久。那时候我才开始在 Linux 系统里摸索着自学编程。犹犹豫豫地,我注册了一个 WordPress 账号。过了一两周的样子,我那个只有「Hello World」的博客随着众多 WordPress 博客一起被墙了。

那么就换一个地方吧。没过多久,我开通了 Google 提供的 blogger 博客。次日被墙。

那个时候,在国内的网站上发布内容还不需要提供手机号,位于国内的网站也不需要备案。所以我找了个国内的服务,也就是由当时我经常上的 Ubuntu 中文论坛所提供的博客服务。我在那里写过几篇不成熟的文章。过了挺长一段时间的。后来,他们宣布中止服务。

我后来就来到了这里,is-programmer.com。那时候这里还挺繁荣的,有好多人在这里写博客。那时候也没有多少垃圾评论。就这么安静地过了很长时间,站长突然联系不上了。再接着就是用户越来越少,垃圾评论越来越多。我挺担心哪天域名过期,然后自己的博客就消失了。还好我之前向站长申请过自定义域名,于是就用上了。使用 JavaScript 做了跳转和替换,Google 说这样子也是可以的,不过百度那边显然不认可这种做法。后来我又担心这VPS到期没人续费。还好这些都没有发生,域名和VPS都还活着。当然为了以防万一我写了个爬虫,把博客数据爬回来做了备份。

再后来,博客挂了差不多一天。我想方设法登录到了服务器上,删除了大量缓存和日志文件,腾出来些磁盘空间,这才又恢复。然后顺便把之前上传的文件也备份了回来,把域名跳转改成了通过301重定向的方式。不过很可惜,百度依旧不懂。

就这样勉强活着吧。我本来想自己写一个博客程序,可生活实在是太累了,就一直也没有写出来。也不太想用静态博客,因为不方便评论。特别是 Disqus 曾经用欺骗的方式拿了我的社交账号又要求注册 Disqus 账号,以及后来默认不允许匿名评论、匿名评论不显示头像,使得我对 Disqus 挺反感的。

而就在前几天,我这博客被入侵了。入侵者篡改了首页。虽然刷新缓存之后就恢复了,但我感觉很不好。

这博客,已经老了。就算我通过各种打补丁的方式,支持 HTTPS,支持 IPv6,更换自己控制的域名,使用脚本更改页面中的旧链接,但是,它还是在一点一点、不可避免地衰老。

Fenking's avatar

火种与传承

今天,我突然笑了。
笑的十分开心,有如不曾这么开心过。
都是因为目睹了我所无法预料的,有生之年的历史的传承。
2005年,玄女只做了中国第一张东方同人CD–《境界生命物语》
2006年,中国东方同人第一次打入日本cm,成为新的起点–《盈月纪年》
在那之后,我们又创作了更多奇迹。
时隔多年微博上在没有传出关于盈月纪年的消息,今天突然打破了那长久的宁静。
今年5月20日,zun终于来到中国大陆,在北大举办讲座。如此高规格的事件,自然请到了中国东方圈的大多数鼻祖和历史人物。
过去中国东方第一个论坛,也是创造奇迹的论坛——动漫渔场(东方小镇)的站长airzhangfish和论坛的主要音乐制作人haku_wang(月代彩)也被请到了现场,这是一场空前绝后的历史的聚集。
而在今天早上,囧仙把fish托付给的这两张有着起点意义的专辑亲手交给了zun。
东方同人的火苗在这两张cd中点燃。虽然一时好像熄灭,但是不会的,它终将被传承下去————
最终,它被交接到了东方的鼻祖——zun手中。我们的历史的成功,历史的结晶真正地被迎接下去,我们走过的路,我们会把它记录下来,然后这一份宝物,永远珍藏在历史的原点,我们的出发点。
这是里程碑。意义重大。

我是一个渺小的人,不过是一个微不足道的历史记录员罢了。
2011年,我从stg进入东方;
2011年,我接触到东方同人音乐;
2011年11月,我第一次听到盈月纪年;
2011年末,进入东方小镇,但是由于年少已经淡忘账号消息;
2013年,开始发掘盈月纪年1,2,以及境界生命物语级其他老同音专辑的信息
————2017年5月24日,获得《盈月纪年2》
————2018年5月21日,fish站长成功完成中国同人与东方本体的交付于对接。

如果历史的苏醒都能在有生之年让我亲眼所见,那么我也没有什么不可能完成的事情。

Fenking's avatar

生活记录ep1

一直以来十分忙碌,没有怎么管理网站,只是草草做了个日迹线就又回归到不堪的生活中了。
不过这种不堪的生活是在日本。
某种程度上,这是个令人抑郁的国度,但是这份抑郁的根本来源,或许是来自于现在的生活吧。
我们考试,我们徘徊在进学和回国的分界点,时间和情报的优势决定了一切,背后可以依靠的力量克服了一切问题。有人自信,有人自卑;有人计划长远,有人迫在眉睫;有人十项全备,也有人白手空拳。
我们焦躁地,不安地走着,心中没有那一份底。

下一篇生活记录可能还有一个月。

Fenking's avatar

宅所见的过去未来


仅仅在几年前,我们只靠“你是否看番”就能决定很多事情。
决定你是谁,决定我们是否能合得来,甚至做朋友。
那些年的宅们也是很普遍,就像大学里的学生们不问专攻,都会学英语。
也就在几年前,我们还晚上囤聚在熄灯的宿舍里,点起充电宝支持着的应急灯,三盏两盏,星火闪耀,伏案在桌前做题。我们取消了每人对应床位的限制,大家都在自己喜欢的地方躺着,学累了就躺下拿起手机和耳机,补一集旧番,或看一集新番。
不安分的我们甚至买了可以连接充电宝的小米wifi,把他和床下原本存在的校园网接口连在一起,享受这熄灯后点点明光和长久的黑夜带来的温暖与自由。
伏在床前,靠在墙边,或静或动地看着番的我们,或许有的痴迷于steam,有的日日夜夜满脑子lol,也许在苦苦挣扎中期待着rpg接下来的剧情,甚至有在考完试的那一天夜里,逃出学校在网吧通宵。
但我们也许是没有杂念的宅们。我们看番,互相推番,甚至在网吧被队友坑,一气关下游戏打开刀剑神域,隔壁的大叔都凑过来一起看。
Acg的气息愈来愈浓了。番不再是宅的象征,大家都在看,大家都乐于看。
专攻气息变得愈来愈浓,游戏和动漫慢慢分开。
来到日本以后,大家一起去秋叶原,结果却只是一群只喜欢里番拔作和一群在街机里沉迷不拔的人们。
身边的宅们一个个靠近了那些曾经不曾想象的人们,我渐渐分不清,哪边是真正原本宅的生态,哪边才是真正的有所发展。
想想如今b站三大点评,曾经顶尖的MAD工匠泛式到现在的专业点评家。
想想再也不会有一年四次出现,每季新番介绍的长门有C。
想想一部电影,能翻越千万障壁,冲击每一个区域的命脉。
想想那些因为喜爱和梦想而做成的游戏也好,音乐也好,漫画也好,视频也好,逐渐变成被群众所评价的事物,被“广泛”了起来。
再想想从一开始,那些更加深刻,更加硬核的事物就会占据圈子的主导,我们最终也不过是旁支罢了。
十年前的他们也许会一起探讨,一起创作:我们没有什么,我们有能力,有想法,有机会,有好的伙伴们。
十年后的我们或许共同的声音逐渐变少,我们开始各立独行,开始互相排斥,开始吧自己的意向植入的更深。
现在有很多事情都很晚了,我们变得愈加成熟;拥有能力的人们机会变得愈多,我们自己的机会变得愈少。
很有可能是我在矫情,我也许不太懂了。
不知道是我们、他们、大家变了,还是只有我变得不那么焦躁怪异。

's avatar

博客程序迁移到 SilverBlog

因为各种原因,迁移到了 qwe 开发的 SilverBlog

虽然部署的时候踩了 Python 的一些坑,也因此提交了一些 PR,结果还是挺好的。

主题是基于 Bootstrap 改的。这几天会试着去用 CSS Grid 重新设计一个。

网站主页已更新。

's avatar

100% 橙汁修改器更新 (3.1.262)

更新 3.1.262

游戏发布了新版本(v1.26.2),修改器进行了相应的维护性更新。

没有新增功能,仅修复了游戏版本更新带来的兼容性问题。

100% Orange Juice 修改器


试试重建的错误追踪,用 Redmine 搭建:jixun.moe 项目追踪

OX's avatar

令人作呕,妄为人。针对微博张洲言论的回应

微博原链:看到7旬老人照顾智商女儿40年的新闻,我有个“没人性”的建议

 

下面是正文:

明天,5月20日(本文写于5月19日)是大陆的助残日,在这个节骨眼上,微博认证为编导张洲的人发布了一篇令人作呕、反社会的恶劣言论。

很久没有写过博文了,但是看到这个东西,实在是忍无可忍!

这篇东西总结起来就是:智障儿累人累己,浪费社会资源,父母应该将他们杀掉,然后国家应该给杀死自己孩子的父母两万块钱

这是多没人性,多人渣的混账东西才可以将这个想法堂而皇之地写出来?!我想他应该是自己认真思考过了,因为他甚至都想好了将此付诸实际的做法和与其配套的规定标准!

不可原谅!能写出这些东西,并且擅自认为合情合理、理直气壮的人,我只能说:这个「人」是现代人类文明社会的残次品。此人作为现代人类文明社会的一员,完全没有一个成年人应有的价值观和同情心,我坚定地认为:他就是纳粹分子。

「因为他不聪明,所以我要把他杀了,我这是为全人类做贡献!」

这种做法,这他妈的不是纳粹是什么??!

这和把犹太人送进集中营、毒气室的做法有什么区别?犹太人和智力障碍儿童的区别?放屁!

犹太人和身障婴儿都是人啊!

 

「很多动物对自己生来残缺的孩子会采取自然淘汰的方法,不管不问,任由其死亡,因为父母知道在自然界,残缺的它生存会无比艰难。有的鸟类,只能抚养2个雏鸟却下了5个蛋,那么就从悬崖上让它们跳下来,仍然活着的就养,摔死的就算了。」——张洲

这句话,一下子摧毁了人类数千年来积累的普世价值:你会因为一只鸟妈妈抛弃了自己的雏鸟而逮捕它吗?肯定不会啊!因为它不是人!

那么一位母亲将刚出生的婴儿丢下悬崖犯法吗?当然犯法啊!这不是故意杀人是什么!?这种偷换概念的愚蠢理论真的可以将一个正常人类气到说不出话来,说出这种话的人,不是纯就是坏!恶毒的坏!

 

「智障儿自己的一生不可能幸福,父母不可能幸福,社会和国家也要花大本钱照顾他的生命。所以,若智障儿父母签署了“毁灭病婴”的协议书,国家应该给予补偿。」

这段话,令人语塞,全盘否定了全世界的智力障碍人士的生命价值。这种想法真的是一个生活在21世纪的人想出来的吗?最令人发指的最后一句「国家应该给予补偿」!张洲去你妈的吧。

 

「所有人类或其他动物,在最初的时候是无认知、无意识、无记忆的,有的只是痛感和肠胃需求。有个文明词儿叫“萌芽状态”,它们也就是个肉芽。当他们有了意识有欲望的时候,比如他们喜欢上了红色、美丽的阿姨和好吃的蛋糕时再毁灭,那从伦理上说不过去。任何新生儿还只是一条命,暂时还没有成为一个人。」

所以他想说新生儿不是人。只是一坨肉,只是一条命

「只是一条命」

张洲这个混帐东西,完全不理解一条人类的生命代表了什么。无语。

还有其他一些他列举的理由,无一例外都是一些妄为人类的纳粹言论。作为正常人都不应该认同。

世界上出现几个像张洲这样的混帐东西很正常,但是此人没有作为混帐的自觉,他竟然狂妄地站在了道德制高点,更令人心寒的是,评论下面附和他的混帐言论的混账比想象中要多,这很可悲!大陆的社会氛围,道德教育是出现了怎样的偏差才会导致现在的状况?

其中有一条评论更是让人异常作呕:

他有什么脸可以称自己「医护人员」?!建议严查此人背景,我认为这个人没有任何资格担任这个职业角色。

原作者的回复更是将他的丑恶嘴脸表露无遗。

这个混帐东西,按照他的提议,他就不应该能活到今天,但是「很可惜」,大家都很尊重生命,他还活着。

连这种混帐东西都能活着,还成了编导,身体残障的人怎么就不能好好活着?!怎么就不能?!

不去反思为什么有那么多残障人士在你们国家活得那么惨,反而想起了杀光他们的主意!

令人作呕,妄为人!

's avatar

小众的偏好

我最近有一种感觉,我们喜欢一样东西,也许不主只是因为喜欢这样东西本身,而是喜欢这样东西的「小众」属性。就是说,因为一样东西小众,所以我们会更容易喜欢它。我们会更偏好那些看起来「小众」、「独特」的东西,并常常认为那些东西是更高质量的。这种偏好经常被说是「装逼」,但我觉得,这没有什么可以批评的,装装逼也是很正常的事情嘛。

有个网站,名叫「少数派」,从名字就可以看出来,它就是以「少数」的定位自居的。少数派上面有许许多多的「小众」文章,介绍的就是相对比较「极客」的东西。这边奇奇怪怪的工作效率提升小技巧啦,那边五花八门的各种用途的应用啦,都是以一种「告诉你一个许多人都不知道的东西哦」的感觉,引起大家的兴趣。

尽管喜欢阅读少数派的人可能不同意,不过其实微信公众号上面那些吸睛的标题,许多也是利用了相同的心理。「震惊!百分之九十九的人都不知道的事实」,一看,「哇 99% 的人都不知道,那我看了之后就能成为那 1%了呢」,然后就回去看那篇文章。那至于实际上真的是不是 99% 的人都都不知道,那就肯定不用说了。不过现在,一般人也不会真的去相信「百分之九十九」这样毫无根据的数字了,但即使心知肚明这是瞎说的,在潜意识里面,对这篇文章的好奇心还是增加了。

GNU/Linux 用户群体也是如此。作为 1% 的超边缘用户,在各种角度都倍受歧视。这也是没办法的事情, GNU/Linux 用户这么少,做个支持,成本不值得嘛。但顶着这些困难,还是有许多人坚持了下来。 GNU/Linux 用户们被称作「不切实际」、「天真」,但还是有许多人没有正视这些嘲讽。这其中的原因,或多或少,都有一点「因为这件东西小众」的成分。

购买奢侈品的欲望也是一样。因为它们的价格,拥有奢侈品的人群,当然是小众的了。于是大家就都想跻身进入那个属于富人的行列,甚至不惜贷款,也要让自己爬到那块高耸的价格标签上。

同样的还有动漫文化。起初它们是小众的,人们看到它,觉得「这个东西好棒」便喜欢上了。那时候大家觉得自己对动漫的喜爱,是自己值得珍惜的一个部分。后来这个群体逐渐扩大了,尽管还没有成为主流,但至少已经可以满大街跑,影响到许多主流文化了。这时,便有许多人对这个文化觉得厌烦了,开始反感动漫,并用「二刺塬」这样的话嘲讽。不得忽视的原因,就是这时候反感动漫已经成为了小众。

上面提到的少数派,也是经历了相似的命运。一位独立 iOS 开发者说,他以前曾经很喜欢少数派的风格,经常给它写文章,但是现在「变得大众」之后,就不再喜欢,再也不为它写文章了。


对小众的东西的偏好,是毫无疑问的装逼。但是这样的心理,应该说每个人或多或少都有。我不知道它的心理学名词叫什么,但是要表示与大众不同,古语里面就有不少描述:鹤立鸡群、一枝独秀、红杏出墙——你看,还都是褒义词呢。所以这也不是个值得批评的东西。

实际上,想要追寻小众的东西的心理,与其它心理一样,人类社会长期演化的成果。总体而言,也是有益的。

因为人类会追寻小众,所以就会有富有创造力的东西被创造出来,满足小众的需求。无论是文学、绘画、音乐,还是餐饮、影视、设计。这些小众的东西,使世界充满活力。如果大家都随波逐流,小众的东西都被放弃,那么很快,所有的东西就会变得一成不变了。

因为人类会追寻小众,所以才会有各种观点诞生出来,相互碰撞、变化,在这样的过程中使世界变得更好——不止是政治方面的。如果没有这些小众的观点的话,所有人的心思一致,那就是最可怕的乌托邦了。

所以,请大家一定要好好守护自己所爱的、小众的东西哦。当然,贷款买奢侈品还是算咯。


除特殊说明外,本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。转载时请注明来自 FiveYellowMice's Blog ,以及原文链接

虽然 RSS 是一种很好的新闻获取方式,但是不同的 RSS 阅读器所显示的内容可能会有很大差距,有些甚至无法显示所有内容。所以为了能够获取到完整的内容,最好还是点开网页链接看。
之所以还是保留了 RSS 的全文输出,是因为摘要输出会被很多人讨厌……

's avatar

评论框

经过两个月的不懈努力,我填了我去年给自己挖的评论框 大坑 的一部分。

目前,我的博客已经开始使用我自己写的评论框了。目前基本完成了后端、访客前端、Telegram 提醒姬和 Disqus 导入工具的开发工作,但是管理面板还没有开工(于是我只有借助 cURL 来管理评论了

在这里要特别感谢一下 qwe7002老宋Jixun 姐姐,他们对 Pomment 的程序设计和实现提出了重要的建议。

总之非常开心用上自己写的评论系统。

Kagurazaka Yashi's avatar

Ingress: 北京盖场啦

(点击文中图片可以放大,点击动图可查看高清) 2018.5.15 盖场日记 自从玩 Ingress 以来,它总是给我无数的惊喜,无论是在现实中,还是游戏中。追求游戏中的成...[点击阅览全文]

Ingress: 北京盖场啦最先出现在雅诗的小世界

依云's avatar

Windows 10 中配置网络共享

本文来自依云's Blog,转载请注明。

有一个很讨厌的公司叫「深信服」,英文名叫「Sangfor」。它开发的私有协议的 SSL VPN 客户端 EasyConnect 终于支持 Ubuntu 了,然而我没能在 Arch Linux 上正确地把它跑起来。图形界面是 electron 之类的,这部分没有问题。但有一个会往 /usr/share 下写日志的 root 进程,应该是负责真正的 VPN 创建的,死活连不上。

那么就在 Windows 虚拟机里跑吧。所以我的 Linux 系统需要通过 Windows 访问部分网络了。只是 HTTP 的话倒是可以装个 HTTP 代理搞定,但是我还要连 ssh 的。

正文开始了。其实整个过程并不难,关键在于很难找到资料。

首先,当然是给 Windows 一张 host only 的网卡,用于两个系统之间的连接。以及,把那个 VPN 连上。

然后,打开「网络设置」,选择「更改适配器选项」。右键单击要共享的网络适配器(比如此例中是那张 Sangfor VPN 的网卡),选择「属性」。

选择「共享」选项卡,把第一个框给勾选上,下边下拉菜单选择那张 host only 的适配器。确定。

就这样,OK 了。

要注意的是,此操作会将网卡的 IP 强制设置为「192.168.137.1」。就像图中可以看到的那样,微软总喜欢「提供策略,而非机制」。假定你是给你的家庭共享。假定你要共享的是 Internet 连接(本例中其实是 VPN 连接)。所以它也假定了你的「家庭」网络中 Windows 可以随意选择 IP 地址,假定你需要 DHCP 服务。

Linux 这边配置起来就容易多了。Virtualbox 的 vboxnet0 接口本来用的是 192.168.56.0/24 网段,但是给它配置另外的 IP 地址,往它里边扔它不了解的目标地址的包,它也不介意的。

sudo ip a add 192.168.137.2/24 dev vboxnet0
sudo ip r add 172.16.2.9/32 via 192.168.137.1

以上给 vboxnet0 添加了 IP 地址,并且让需要走 VPN 的目标地址(172.16.2.9)走 Windows 的网络。

PS: 开着防火墙的话,Windows 10 默认是忽略 ping 的。在防火墙的「入站规则」里启用「文件和打印机共享(回显请求—ICMPv4-In)」之后才能 ping 它。

另见阿森人的《伪·如何在 Linux 下使用深信服 SSL VPN》一文。

AstroProfundis's avatar

于是我终于也换工作了

拖了一个月的博文,再不发就要烂在草稿箱里面了╮( ̄▽ ̄”)╭

阿里内部一直标榜自己是一所大学,同事之间也多以“同学”互称。从2014年4月3日入职实习,到2018年4月9日正式离职,4年了,我算是毕业了吧。

写离职贴向来是阿里内网的一项传统和一道风景(另一道风景是相亲贴),早在决定离职之前的一段时间,就想象过有朝一日我自己的离职贴会写成什么样子,一开始草拟的题目叫《我为什么从阿里离职》,但思来想去我并不像一些遭遇状况离开的同学那样苦大仇深,貌似没有必要玩这种噱头,甚至这篇文章本身也没必要真的发布到内网丢人现眼,就放在这个早已荒草两丈高的博客聊做记录呗。

2014年3月时侯,确定考研无望的我开始找工作,因为早就错过了当年的校招季,其实处境颇有点不尴不尬。先是面试了一两家小公司,互相都没太看上眼,在推上求RT的时候承 @bones7456 抬爱帮忙投了个内推,没两天就接到了阿里的面试电话。经过顺利到我自己都没感觉的面试流程,很快就拿到了 offer, 然后我鸽了在 Google Talk 上聊得很开心的兽兽,无视掉学校里面最后一两个月的课程,买了张卧铺票就跑来杭州了。

除了中间回学校补考高数&办毕业手续,我从14年4月就基本一直住在杭州,必需说,杭州的生活环境真是比北方舒服多了。到6月底我正式毕业,中间不仅没有办离职,甚至还拿着部门特批的笔记本回了学校(正常实习生是只配台式,笔记本是部门工作特性需要经常在工位和值班室来回移动所以特批的)…6月26号早上我直接用实习生工牌刷卡进园区,到4号楼办了第二次入职,主管给我说“这次我就不用来接你了吧”,啊哈哈,当然不用,听完培训我就丢下其他等着各自团队接人的大侠们溜去工位…

然后第二天就跑去千岛湖 Outing 了(乛.乛)

不知不觉过了三年多,部门没变但人来来去去,职责重点也多次变化。中间值了若干个夜班见过了随便几点的西溪园区,亲历了若干次超大型故障并且发了527第一条故障通告,一个人运维了几百台机器的监控系统大半年,徒手写了部署量上百万的监控脚本还搞出来个P2故障至今保持鄙部门记录,带着实习生倒腾出一个跨机房监控被老板拿着截图到故障 Review 上当证据,亲手应急切换过淘宝支付宝交易单元分分钟百万上下,经手和管理几百万的采购项目,和人邮件撕过逼也被人电话撕过逼,被其他部门主管私聊挖过墙角,拿过3.75A也拿过3.25B, 怎么看都是圆满了(

哦对,唯一的遗憾大概是某个再也看不到某个内部群里面老法师们斗法了(

至于为什么要走,怎么说呢,作为毕业直接进了巨头的我,见识了够多的标准化流程和体系化建设之后,慢慢地也开始对大公司的各种弊端产生了厌倦,总觉得如果再继续在这样的环境待几年,不管是技能树还是整个人的心态都会彻底被固化下来,并且很难有进一步突破的空间了。正好最近一年多以来组织架构数次大幅调整,阿里内部整体技术革新的背景下部门方向转型,工作内容里面非技术的内容越来越多、能关心技术的精力也越来越少,整天都埋没在无尽的会议和故障 Review 中,和各个部门各个团队的人在钉钉上电话上会议室里纠缠不清一个故障甚至一个改进措施的责任归属;偶而停下来看一看的时侯,猛然发现自己的发展路线已经不知不觉指向了技术运营和事件管理:这并不是我喜欢的方向,我也很难在这个领域作出漂亮的成果来。

最后那半年多每天的压力都非常大,并且几度出现了轻微的焦虑症状,再加上工作内容愈发混乱,在这里工作已经不能让我感到有趣,我意识到必需作决定了。

于是么,趁着手上几个主要的事情告一段落,我特意放慢了进一步的工作安排,开始准备另谋出路;大公司干了好些年,不如去小公司长长见识也很好啊。然后非常巧合地,在我简历还没改好的时侯,某 @Tiramisu1993 给我说他实习的公司在招人还发了 JD 过来,我上知乎随手一搜居然好(shui)评(jun)如潮,于是就连夜周末赶了份新简历出来投了过去…

反正中间因为我要压到4月之后离职所以大家都不着急地拖拖拉拉几个月的面试不表,春节后调休完上班第一天我把主管拖到小黑屋讲了离职计划,之后就进入了轻松愉快的工(hun)作(chi)交(deng)接(si)阶段…再然后我就变成了 PingCAP 员工了_(:зゝ∠)_

由于这篇文章拖了太久,我已经没有刚离职时侯那种沉重的心情了,所以只好写一些新东家一个月来的感受…

首先,作为一家名符其实的小公司,PingCAP 整个公司的规模和我之前所在的阿里 GOC 这么一个小 BU 相当,比起组织严密、流程翔实的大公司明显地要松散灵活很多,嗯,也就是说知乎上的软文基本属实…往好了说,是氛围轻松、迭代迅速、扁平化管理,往坏了说,是野蛮生长、制度残缺和技术沉淀薄弱,这些对于一个小公司来说都是显而易见甚至可以讲理所当然的,我也很庆幸自己有好几年大公司的经历,让我能直观地意识到这些问题,也就给了我进一步产出价值的更多机会与可能性。

嘛,至少目前来说,有两点让我非常满意目前的工作并且乐在其中:1. 可以100%工作时间放在技术领域,用来写代码读文档而非和人撕逼;2. 非工作时间不会被频繁打断,不用一睁眼睛先摸手机看未读消息

你们看我多容易满足(

ホロ's avatar

把电脑上的 Shadowsocks 配置分享给手机使用的一点思路

限于 shadowsocks-libev 😂

问题

手机上的 Shadowsocks 客户端只能从 ss:// 开头的链接读取配置, 并不能直接用 libev 的配置文件 😂

Windows

Windows 的 Shadowsocks-windows 是可以生成 ss:// 的链接的,还可以生成二维码,于是不在本文的讨论范围内 (雾

生成链接

一个普通的 Shadowsocks-libev 的配置文件大概长这样:

{
"server":"server_address",
"server_port":9999,
"local_address": "127.0.0.1",
"local_port":8888,
"password":"some_password",
"timeout":300,
"method":"aes-128-gcm",
}

在 Python 里可以用 json.read() 把 JSON 文件转换成一个字典:

# 偷点懒不单独写一行开文件啦……
import json
config = json.load(open("/path/to/config.json"))

一个普通的 ss:// 链接大概像这样

ss://{base64编码过的加密方式和密码,中间用冒号分开}@服务器:端口?插件;插件选项#配置名称

如果服务器是个 IPv6 地址,那么两边包上中括号……

对一个字符串直接 encode() 就有二进制流,反过来对着二进制流 decode() 就可以有字符串(感觉这说法好不正经 😂)

以及可以用 base64 模块对二进制流进行 base64 编码和解码:

import base64
encoded = base64.encodebytes("some_string".encode())

当然出来的也是个二进制流,需要的话可以再整成字符串,以及消除空白 😂

encoded_string = encoded.decode().strip()

其它的选项从配置文件里直接读就好,配置名称需要的话就写一个。

生成二维码

方法有很多 😂 例如用 pypi 里的 qrcode:

import qrcode
img = qrcode.make("some_text")

需要的话可以把这个图像保存到某个地方,然后打开它:

img.save("/path/to/images")

要在 Python 里运行其它程序?最简单的方法是 os.system() 😂 稍微复杂一点的可以试试 Subprocess:

import os
import subprocess

os.system("xdg-open /path/to/images")
subprocess.Call(["xdg-open","/path/to/images"])

这样就会用默认的图片查看器打开刚生成的二维码啦,用汝的手机扫一下看看? 😂

水文 +1……

Felix Yan's avatar

Linux 发行版:“强迫症患者”们的共识社区

世界上有几百个还在更新的 Linux 发行版。新手常常感叹挑花了眼,换来换去也找不到自己满意的。维护一个发行版需要花费很多时间、精力,为何人们要这样“重复劳动”呢?

  • “强迫症患者”

我小时候追求整齐、秩序,无论是家里的电灯开关还是电脑上的图标,一定要排列的整整齐齐,不惜自己接电线、一个个重命名文件。“我的电脑”、“我的文档”、“网上邻居”,下面的蓝色 e 名字太长,就改叫“上网浏览”吧……然而随着安装了越来越多的软件,这些“秩序”被不断破坏,自己不断妥协。有的程序在我的文档里乱放目录——忍。有的程序会自动下载更新,然后在我代码写到一半的时候弹出来更新提示——忍。有的程序会带各种运行时包安装、替换系统文件导致另外一个程序运行不了——忍。

每次出了大问题的时候,所有人都告诉我:“现在只能重装了。”

2008年的时候,厌倦了折腾各种魔改定制 WinPE 的我首次下定决心安装了 Ubuntu 8.04,从此打开了新世界的大门。

不再需要依赖猜测。手握源代码,就如同掌握了施工的图纸,一切不符合心中秩序的地方都能找到原理。一群志同道合的前辈早已构建了井井有条的目录结构、依赖关系、软件仓库、……一切都显得那么美好。和每个第一次玩 Linux 桌面的折腾狂一样,我花了很多时间试图让 GTK+ 和 Qt 的程序界面一样而且好看,以及折腾 compiz 特效。

然而事情也不是那么完美。当时我在压片组用 x264 压片,采用的方案是使用加上一些特别 filter、并且带 lavf 输入的 x264 命令行。我用 wxPython 做了一些小工具,比如音轨提取、mkv 合成等,但是自动压片脚本需要的 x264 不能用仓库里的版本。我注册了 Launchpad 帐号并创建了一个 PPA,接下去,我花了很长很长时间都没有学会打出一个靠谱的包。别说各种 macro 的使用,就连拆包的部分都让我焦头烂额了。

长久以来折腾的零碎结果——各种经验、配置文件、补丁、翻译,散落在各种网站、论坛、聊天工具,而自己真正想分享出去的成果——软件包,又不知如何下手。我想要为这份秩序做点贡献,怎么办呢?后来群里的大牛们给我了一个简单一些的方法——AUR。

我在 2011 年安装了 Arch,从此找到了贡献之路。

  • 共识社区

使用 Ubuntu 的时候,我有过很多想打包的软件,也曾经用简单的 checkinstall 打出过数个“勉强算是包”的包,但是这个过程一直十分痛苦,以至于我搁置了大量的 TODO。

而在 AUR 里,一个简单的十几二十行普通 bash 语法的 PKGBUILD 文件,就描述完了一个包。字体、游戏、输入法,开发中用到的 python 库,都被我轻松地打成了 Arch 的软件包。2012 年,我申请成为了 Arch 的 Trusted User,将这些包中使用率高的部分加入了官方仓库。在 IRC 和 TU 们的闲聊中,我能感受到或多或少大家都是因为 pacman / PKGBUILD 体系的简洁、维护轻松而走到了一起。

一个人的力量是有限的,我很高兴我找到了这样一群和我类似的“强迫症患者”。开源软件千千万万,自己选择费心费力。有的作者很马虎,有的作者不喜欢条条框框,有的作者对安全更新嗤之以鼻——而发行版的打包者们,则成为了一道防线。我们形成了一些共识,无论是代码里的编译选项还是软件的默认行为,都会尽力向上游作者们争取、提供修改意见,或者直接提交补丁。这样的共识或许不完全和内心的秩序一致,但也已经相当接近了。每人维护一部分的软件包,承担起相应的责任,而其他人就可以坐享这份成果,大家的“强迫症”都得到了满足。

在我看来,这就是一个发行版存在的意义。轻易切换发行版使用的用户们,可能只是不像我们这么傻,这么认真。

近年来每每被问起诸如“Flatpak 会让发行版大一统”、“Docker 会让发行版大一统”、“把 npm 仓库里的包打成 Linux 软件包毫无意义”等等问题时,我时常会感到难以回答。不是没有道理可讲,实在是不知如何讲起。这些都是很有意义的理念和技术,只是它们取代不了形成一个发行版的共识。所谓共识,无非是在取舍时看重哪边更多一点。

Linux 发行版,作为基于共识形成的社区,正是由我这样的“强迫症患者”所组成。

神楽坂伊織's avatar

俺说EP10:“核聚变”之后,“游戏云”之前

大家好,15个月没有更新的俺说终于又更新了……
我的年更进度快赶上某著名年更主播了……
这次聊聊自己对整个游戏工业的看法,欢迎收听,谢谢……
's avatar

修复 xfce 下使用 caja 无法右键打开终端

因为 caja 是 mate 的文件浏览器,对 xfce 支持有点小问题;稍微看了下源码,没有查询默认终端,而是直接跑的 mate-terminal 指令。

因此,直接建立一个软链接指向 xfce 的终端即可。

sudo ln -s $(which xfce4-terminal) /usr/local/bin/mate-terminal
Phoenix Nemo's avatar

制作 Arch Linux 系统模板镜像

阿里云镜像制作踩坑记。

此文章主要记录按照阿里云 Customized Linux 制作 VPC 镜像的过程。一些部分也可用作制作其他平台镜像的参考。

当然记录的原因主要是 Arch 上的 cloud-init 打死无法在阿里云上修改 root 密码,就很气。

's avatar

如何提出计算机相关问题(更新)

我发现很多计算机相关问题解决速度不够快,或者进度很快夭折的原因,是他们不会合理地提出计算机相关问题,不会合理地尝试解决问题。

有时他们试图在互联网上提问,但因为上述原因,他们往往会被潦草地告知先去阅读《提问的智慧》(或者 RTFM),或者被直接无视。虽然说这里面确实存在着不知感恩的伸手党,但也有很多人只是心急火燎地试图解决问题,因为上述原因走到了无可奈何的地步。

我看到这种场景一次次发生,顿生怜悯之心,决定撰写这篇博文。

先看看软件的官方说明

对于一些常见的错误,软件官方说明一般会以 FAQ(常见问题)的形式给出解决方法,看一看往往很有用。

尝试自行搜索

其实很多计算机问题,你往往不是第一个遇到的(特别是开源软件,一些问题往往可以在它们的 GitHub issue 中看到)。网络上的解决方案,也许比你询问别人得到的更加准确。

不要认为别人知道的跟你知道的一样

「这个 APP 为什么在我手机上闪退啊?」

这个问题看起来很简单,但是对于别人来说很难:你的手机是什么品牌的?配置如何?Android 版本是哪个?系统被厂商魔改程度如何?等等。

因此,提出计算机问题(特别是在网络社区提问),一定要考虑下这个问题,并提供必要的信息(你的系统版本等等)。

相信软件给出的提示

「你的计算机尚未安装 Java,请访问 https://www.java.com 下载 Java。」

嗯,软件已经给出了足够的建议,但是小明直接把这个提示截屏下来,去群里问如何解决这个问题。Geek 们会感觉不可思议:软件都提示你去下载 Java 了啊!小明听说以后,就去下载 Java,问题解决了。

小明为什么会无视软件提示,其实很大的一个原因就是很多用户对软件提示的盲目不信任。有时系统提示「请与系统管理员联系」,但是这是我家的电脑,系统管理员是谁啊?同时,某些国产软件通过恐吓等方式诱使用户去添加启动项等等,而用户反感这种流氓软件,不信任这些软件提示。

其实来自负责任的大厂的软件、「民间」的很多免费软件和开源软件的提示都很负责,照着它们去做其实是解决问题的第一途径。

先了解这是什么

看到一个陌生的格式,你只知道这是图片或者音频,你有转换成熟悉的格式的想法。请控制住你的这种想法,先去了解这个陌生格式到底是什么、它与其它格式有什么不同。

说到这一点,我必须提一下我的一个失败例子:很久以前,我拿到 m4a 格式的音乐,我甚至没有去了解 m4a 是什么,就直接寻求把 m4a 转换成 mp3 的方法。那时哪怕我查一下 m4a 与 mp3 的区别,也许就会改变我的想法,直接去下个好一点的音乐播放器,避免浪费大量转换格式消耗的时间,还毫无意义地降低音质。

合理提供日志

小明想用 MultiMC 启动器启动 Minecraft,结果启动不成功,软件弹出一个窗口,显示了出现的错误详情。于是,小明就把错误窗口截图,在群里提问。但是,由于他的窗口并没有显示足够完整的日志,问题无法继续解决。

也许他看不懂这些日志里到底说明了什么,便觉得屏幕上显示出来的就够了。这种情况下,最好把当时运行时出现的完整错误日志发上去,并说明你想做什么,然后又发生了什么。

顺便提醒一下,大段日志请截图,哪怕是拍照也可以。总之不要直接将文本贴到论坛上,甚至是聊天窗口里!被这样刷屏是很不爽的!

's avatar

XFCE-Superkey

灵感来自 ksuperkey,简单改了改,现在按下 Win/Meta/Super 键后直接启动 xfce4-popup-whiskermenu 弹出 xfce 菜单。

在 Fedora 27 x64 环境编译,其他同架构的系统应该能直接用吧。

源代码:GitHub

最新版本下载:GitHub Release

IceHoney Blog's avatar

JavaScript开发中的性能优化

最近工作比较清闲,5月又换了一个工作环境。总结下最近看的有关JavaScript性能的知识,并记下来供未来的自己参考。希望自己能不忘初心,继续成长!

使用requestAnimationFrame来更新动画

使用requestAnimationFrame把动画渲染交给浏览器,可以保证渲染保持在60FPS。应该避免使用setTimeout或者setInterval来实现动画,因为计时器和事件队列会消耗更多的资源,还会导致无用的页面重新绘制。

使用Web Workers来进行复杂的运算

可以把单纯的计算放在Web Workers中,这样不影响主页面的渲染和流畅,例如加密和矩阵变换的运算就可以完全放在Web Workers中来减少主线程的执行时间,避免浏览器渲染堵塞。

避免微优化JavaScript

举个最简单的例子,我曾经在一本书上看到过一个提升程序效率的例子。大致是这样的:

var array = [1, 2, 3, ... 100];

for( var i = 0; i < array.length; i++) {
  console.log(array[i]);
}

这里的array.length获取数组的长度,每次都要计算数组长度会消耗不少时间,优化之后的代码是这样的:

var array = [1, 2, 3, ... 100];
var len = array.length
for( var i =0; i < len; i++) {
  console.log(array[i]);
}

通过缓存数组的长度来保证只计算一次。这就是典型的微优化,说实话这段代码我一直在用,直到最近读了其他的书才发现,现在的JS解释器早就优化了对数组长度的计算。无论是读取一次还是一万次消耗的时间都没有太大差别。微优化应该是JS引擎需要做的事情,我们不应该在实际开发中在这方面耗费过多的时间。

滑动事件优化

当用户监听滑动事件并执行相关动画操作的时候,记得使用window.requestAnimationFrame来优化动画的执行。

function onScroll (evt) {
  // Prevent multiple rAF callbacks.
  if (scheduledAnimationFrame)
    return;

  scheduledAnimationFrame = true;
  requestAnimationFrame(readAndUpdatePage);
}

function readAndUpdatePage () {
  // do something
  requestAnimationFrame(readAndUpdatePage)
}

window.addEventListener('scroll', onScroll);

参考:

Debounce Your Input Handlers

Optimize JavaScript Execution

Phoenix Nemo's avatar

在 Linux 服务器配置 LACP 与 VLAN

存储服务器不想放在 OVH 了。所以自己来托管一台机器,顺便折腾下 2x1Gbps 组 LACP Bonding。

's avatar

提升古诗词背诵及脸部记忆能力

古诗词背诵与脸部记忆,对 tcdw 来说一直是个老大难的事情。

如果说在初一的时候,tcdw 还能在母上大人的呵斥下勉强背诵《木兰辞》,在高三时 tcdw 已经什么古诗词都背不下来了。

那些古诗词,tcdw 翻来覆去的试图记忆很多遍,但是一合上书,那古诗词瞬间从他的脑海中蒸发,一打开书又神奇的回来了。

tcdw 也记不住别人的脸部。tcdw 所在的专业人数就不算多,每当遇到集体活动(比如升旗),tcdw 就不知所措了,因为他永远没法自己找到他们的位置。于是,在类似活动,tcdw 只好四处随意走动,直到被同学们发现。

其实 tcdw 的记忆力本身大概没问题。地点、网址、事件什么的,他都有很好的记忆力。但是面对古诗词与别人的脸,tcdw 就抓瞎了。

tcdw 好希望通过记忆地点、网址、事件的渠道记住古诗词与别人的脸。比如,当我和最好的朋友在一起聊天,他说了一句古诗词,让我感到甜蜜,产生了深刻的印象;各个地点的建筑物,看起来就像我需要记忆的人脸一样,我便可以产生印象了。

然而现实是残酷的,这应该只是天方夜谭。

tcdw 急迫希望记忆他很难记住的,却很好的记住了其它一些奇怪的东西。于是 tcdw 也常常被批评:『背诵这么简单的事情,你多做不了啊』。好吧,那你为什么历史学的那么好,但是化学学的一塌糊涂呢?

那些对于别人来说很简单的事情,然而 tcdw 很难做到,这种体验也许是别人难以理解的吧。

ホロ's avatar

GNU/Linux 中为不同的应用程序设置代理

方法挺多……

Web 浏览器(例如 Firefox 和 Chromium)

Firefox 可以在设置中自行设置 (参见 https://support.mozilla.org/en-US/kb/connection-settings-firefox )。

Chromium 默认会用系统的代理设置,不过可以用一个命令行选项强行在这次会话中使用代理,例如:

chromium --proxy-server="socks5://127.0.0.1:1080" --host-resolver-rules="MAP * 0.0.0.0 , EXCLUDE localhost"

不过也可以用个代理扩展,例如 SwitchyOmega

GNOME 3

可以从设置-网络-网络代理中设置:

某些其它应用(是哪些 😂)

(例如 wget 和 curl),会使用形如 "proto_proxy" 的环境变量用来设置代理啦 (当然也有可能是全部大写的),例如:

# export var=value
export http_proxy=http://10.203.0.1:5187/
export https_proxy=$http_proxy
export ftp_proxy=$http_proxy
export rsync_proxy=$http_proxy
export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"

就设置成了 10.203.0.1:5187 作为 HTTP 代理,HTTPS、FTP 和 rsync 使用相同的代理。

于是可以把这样的语句写进一个脚本里在需要使用代理的时候 source 一下 😂

不过这样设置的环境变量一切换用户(例如 sudo)以后就没啦…… sudo 的话,可以用 -E 选项保持 环境变量,或者修改 /etc/sudoers 指定保持哪些环境变量:

Defaults env_keep += "http_proxy https_proxy ftp_proxy no_proxy"

socks5 代理

curl 和 pacman 可以设置 all_proxy 变量直接使用:

export all_proxy="socks5://your.proxy:1080"

那剩下的怎么办 😂

用 proxychains 让应用使用 socks5 代理

字如其名就是个链式代理工具啦 😂 Arch Linux 的话装上 proxychains-ng 就 OK 啦~

然后去修改 /etc/proxychains.conf ,选项有很多, 但是大多数时候只需要把最后一行换成汝自己的 socks5 代理的 IP 地址和端口就行😂

然后就可以像平常(?)一样:

proxychains -q /path/to/program

有关 proxychains 的更多用法可以去参考它的文档: http://proxychains.sourceforge.net/

用 privoxy 把 socks5 代理转化成 http 代理

Privoxy是一款不进行网页缓存且自带过滤功能的代理服务器,针对HTTP、HTTPS协议。 通过其过滤功能,用户可以保护隐私、对网页内容进行过滤、管理Cookie,以及拦阻各种广告等。 Privoxy可以单机使用,也可以应用到多用户的网络。 它也可以与其他代理相连(通常与Squid一起使用),更可以突破互联网审查。

https://zh.wikipedia.org/wiki/Privoxy

同样 Arch Linux 上装上 privoxy 就 OK 😂

然后去修改 /etc/privoxy/config ,选项还是有很多 😂, 但是大多数情况下只需要加上一行:

# forward-socks5   target_pattern  socks_proxy:port  http_proxy:port
# target_pattern 是 . 的话表示对所有域名适用
# http_proxy 是 . 的话表示继续不使用 HTTP 代理转发……
forward-socks5 . localhost:1080 .

然后启动 privoxy 服务,把 HTTP 代理设置成 localhost:8118 就好 😂

有关 Privoxy 的更多用法可以去参考它的文档: http://www.privoxy.org/user-manual/

's avatar

一袋凉皮引发的『血案』

我们都知道 XZ Premium 是防水溅的,而 tcdw 有时也会直接用水冲洗一下他的 XZ Premium,还在同学面前炫耀一番。

在一个天气还凑合的星期日下午,tcdw 回到了学校,舍友给 tcdw 所在寝室每个人都买了一袋凉皮,每袋凉皮都有附带辣椒油。

这些凉皮是装在塑料袋里的,包括辣椒油和蔬菜包。

tcdw 准备干掉这些凉皮,便把塑料袋打开,把凉皮倒进了饭盒。但是,辣椒油也是在塑料袋里的。

为了把辣椒油倒出来,tcdw 拿出剪刀,把塑料袋剪开了一个口,但没想到口剪得太大了,里面的辣椒油洒到了 tcdw 的桌子上。

tcdw 很慌张,他的手机被洒了,抽屉里的东西也被洒了。他慌里慌张的拿出纸巾、洗洁精和抹布,努力进行清理。

tcdw 的 XZ Premium 上全是辣椒油,为了清理的更干净一些,他把他的手机用洗洁精洗了一遍。

在报销了 1/4 瓶洗洁精和一大堆纸巾以后,终于把辣椒油清理干净了,味道也闻不到了。


就在前几天,tcdw 跟 qwe7002 聊天,谈到了副卡的事情,于是 tcdw 被安利买了一张米粉卡。

第二天,tcdw 的米粉卡到货了,他兴高采烈地给 XZ Premium 装上了米粉卡,然后上网冲浪。回去以后,他感到手机上全是汗渍,便在水龙头下又冲洗了一遍。

晚上,tcdw 绝望的发现,他的 XZ Premium 出现了奇怪的亮斑。

tcdw 瑟瑟发抖,赶紧跟 Telegram 群里的大佬们讨论,最后得出结论,大概是防水盖没弄好,或者防水胶出问题了。

于是,tcdw 只好把他的 XZ Premium 寄到了北京,开始返厂维修之路。

在此期间,tcdw 的舍友借给 tcdw 一部 vivo Y29L。这部手机小巧美观,内置了 Google 框架,但是 RAM 只有 1G,连正在播放的音乐播放器都有可能会自杀,而且系统是 Android 4.4 的。然而没办法啊,有舍友愿意借 tcdw 手机已经很不错了。

对 tcdw 来说,真是自作自受。

为了你的生活和谐,请确保在第一步做的事情就很靠谱,这样以后可能的不靠谱的事情就没机会做了(

5 月 13 日更新

经过一个月的漫长等待,tcdw 终于拿到了修好的 XZ Premium。于是,除了底部的磨损,这看起来就是部全新的机器了,因为整个屏幕和外框都被换掉了。

tcdw 终于把上个月买的 XZ Premium 贴膜和保护套用上了。但是这钢化膜居然左右两侧怎么也贴合不住,于是就有了奇怪的两边。。先这样吧 🌚

总之手机最后修好了,还是可喜可贺的。

's avatar

听着节拍敲手指

我喜欢节奏感强的音乐,戴着耳机,听着音乐,再跟着音乐的节拍,一边敲手指一边抖腿,那感觉真是太棒了。但那是一件缺乏成就感的事情,听了半天音乐,也就说明自己咸鱼了半天,手指敲地时间长了,也会感觉很累。而且因为敲手指没有一个标准的方式,经常会觉得自己敲地没有合拍,那感觉就不是特别爽快了。

于是很早我就在想,要是有一种游戏,它的唯一玩法就是按着音乐的节奏敲手指,要是有这样的游戏就好了。但当时的我没有去做任何了解,只是将这个想法憋在了肚子里。因为我觉得,这需求太小众了,才不会有人做这样的游戏的。

结果显然我错了,这样的游戏不但有,而且还有一大堆!它们就叫做「音乐游戏」,简称「音游」。

一次,我在网上看到了一个叫 osu! 的电脑游戏。出于好奇,我就把它打开来看了看,然后就发现,自己终于找到了梦寐以求的,玩法是按照音乐节奏点鼠标的游戏。但是 osu! 很难,做为新手的我连中等难度都过不去,没多久便放弃了。「音乐游戏原来这么难」,抱着希望破灭的失落,我将玩音乐游戏的想法抛之脑后。

一天,我又看到贴吧上有人在安利 osu! ,我回想起当时被虐地惨不忍睹的自己,摇了摇头,还是算了……不,我还是要试一试!抄起鼠标,我再次挑战了曾经将我阻挡的沟壑。出乎我的意料,那些曾经把我虐地死去活来的 Normal 难度,这次玩起来却没有那么困难了。于是我开始认真的了解 osu! ,知道了按 Z 和 X 键来分担右手压力的方法,努力着向更高一步进发。可是无论我多么努力,那些 Hard 难度在我的眼中还是像地狱一样可怕。「怎么会有能过得去的人嘛」,我嘟囔着,又删除了 osu! ,「除非有触摸屏,那才会好一点,可是这样的话,对于没有触摸屏的人不是不公平了吗?」

在去往堂哥的拜访中,我终于染指到了一台 Surface (第一代),Windows 8 的破烂缩放机制让它的屏幕不忍直视,但见到它,我还是按捺不住自己想用它来试一试 osu! 的心情。但当时似乎 osu! 还没有为触摸屏适配好,要点击到一个音符,需要双击,而拖动是正常的,这大大增加了难度,还不如鼠标呢。然后我找来了鼠标,但是……

(跑题了跑题了)

不的不提到的是,我在第一次看到 osu! 的介绍的时候,介绍的人把它叫做「节奏大师」,以至于我一直以为「节奏大师」就是 osu! 的中文名。以至于我后来见到了腾讯的《节奏大师》,都以为那是山寨的。

看到我把 osu! 叫做「节奏大师」,我的堂哥觉得很奇怪,便拿出了腾讯出品的国民级手游——《节奏大师》并展示了他的宏伟战绩,还向我介绍了他是怎样加入《节奏大师》的一个游戏社群,并且每周还要做任务,一点一点达到现在的位置……惊讶得我说不出话来。除了惊叹他的成就以及游戏社群的复杂以外,也惊讶地发现,原来世界上还有除了 osu! 以外的音乐游戏,还这么受欢迎,而我之前一点也没听说过。

不过我没有入坑《节奏大师》,因为当时我没有智能手机可以用。

后来,是我到澳洲以后了,拿着智能手机,在 Google Play 里面,看到了一个叫 Deemo 的游戏,它的图标吸引了我。

Deemo 是一个跟 osu! 完全不同的体验,倒是跟《节奏大师》比较像,但逼格看起来高很多。因为本身就比 osu! 简单,再加上没有半途失败的设定,我很快沉迷上了这款游戏,直到打通了能够完成的所有剧情。游戏刚出来的时候,剧情还没有出完,我还为此感伤了一下来着。

然后有朋友向我安利了 Cytus ,我一看,哇那跟横线上下扫来扫去,看得晕得要命,根本来不及反应,简直比 osu! 还难。我想这还是算了吧,就这样鸽了两年。

直到去年,我看到认识许久的网友萌狼在社群里发出了越来越多的音游截图,便搞得我也想重新试一试这个自己从来都不擅长的游戏类型了。顺着他的截图中的线索,我找到了两个手机上的音游: Arcaea 和 Dynamix 。前者一开始玩的简单曲谱都很简单,但困难的曲谱却难到爹妈都不认。后者标榜「硬核」,也确实很难,但熟悉了之后就感觉很爽。

自此,我才算是真正地踏上了音游的不归路。我将许多放学后的下午都贡献给了这二位音游。这带来的水平增长是不可忽视的,我以前以为我就是属于不擅长音游的人,但现在看起来,我那以前的水平,只是没怎么花时间玩过的正常水平呢。

我平常很少专门去听歌,所以动画中的歌曲是我最大的歌曲获取渠道。自从多了音游,音游就变成了我最大的音乐获取渠道。因为音游中的音乐大多来自独立艺术家,充满独立艺术家的 SoundCloud 成为了最常用的串流服务;甚至本来不喜欢的 K-Pop 风格,在玩过 DJMax Technika Q 之后,也开始听了起来。

以上,就是我对音游的经历,今天也在听着节拍敲手指。


除特殊说明外,本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。转载时请注明来自 FiveYellowMice's Blog ,以及原文链接

虽然 RSS 是一种很好的新闻获取方式,但是不同的 RSS 阅读器所显示的内容可能会有很大差距,有些甚至无法显示所有内容。所以为了能够获取到完整的内容,最好还是点开网页链接看。
之所以还是保留了 RSS 的全文输出,是因为摘要输出会被很多人讨厌……

's avatar

我写的一言轮播脚本(2018 更新)

看到很多 ACG 博客都用上了一言,但我觉得在同一个页面只显示一条内容未免有些单调,所以想让它定时轮播,而且采用较好的切换效果。

我后来在 WNJXYK 上看到了我想要的轮播效果,但那是基于 jQuery 制作的。

因为对于我这种讨厌为一个小功能放上大型前端库的人来说不能忍,所以我用原生 JS 写了一个。

2018 年,为了获得更佳的性能和稳定性,我把这个脚本进行了重写,从 JavaScript 动画更改为 CSS 渐变,并改掉了一些不科学的地方。

下面是实际效果:

如果你在使用 RSS 阅读器,请访问原文查看效果。

HTML 部分

<span id="hitokoto"></span>

JavaScript 部分

(function() {
    var server = 'https://api.lwl12.com/hitokoto/v1';
    var target = document.getElementById('hitokoto');
    var fadeDur = 1;
    var waitDur = 10;
    var errorMsg = '加载出现了问题!';
    /* -=-=-=-=-=-=-=-=-=-=-=- 你的配置部分结束 -=-=-=-=-=-=-=-=-=-=-=- */
    var first = true;
    var present = '';
    target.style.opacity = 0;
    target.style.transition = 'opacity ' + fadeDur + 's';
    function loadData() {
        var connect = new XMLHttpRequest();
        connect.open('GET', server, true);
        connect.onload = function() {
            if (connect.status >= 200 && connect.status < 400) {
                present = connect.responseText;
                if (first) {
                    first = false;
                    target.textContent = present;
                    fadeIn();
                } else {
                    fadeOut();
                }
            } else {
                  target.style.opacity = 1;
                  target.textContent = errorMsg;
                  setTimeout(loadData, (fadeDur + waitDur) * 1000);
            }
        }
        connect.onerror = function() {
            target.textContent = errorMsg;
            setTimeout(loadData, (fadeDur + waitDur) * 1000);
        }
        connect.send();
    }
    function fadeOut() {
        target.style.opacity = 0;
        setTimeout(function() {
            target.textContent = present;
            fadeIn();
        }, fadeDur * 1000);
    }
    function fadeIn() {
        target.style.opacity = 1;
        setTimeout(loadData, (fadeDur + waitDur) * 1000);
    }
    loadData();
})();
's avatar

一个简易的类 React.createElement 实现

今天突然就讨论到如何快速的建立一个元素,于是又糊了一遍简单的类 createElement 函数…

var h = (function () {
    function deref(fn) {
        return Function.call.bind(fn);
    }

    var slice = deref(Array.prototype.slice);

    // Lodash code starts here
    var MAX_SAFE_INTEGER = 9007199254740991;

    function isObject(value) {
        var type = typeof value;
        return value != null && (type == 'object' || type == 'function');
    }

    function isLength(value) {
        return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
    }

    function isArrayLike(value) {
      return value != null && isLength(value.length) && !isFunction(value);
    }

    function isObjectLike (value) {
        return value != null && typeof value == "object";
    }
    // Lodash code ends here

    function isFunction(value) {
        return value instanceof Function;
    }

    function makeArray(v) {
        return (isArrayLike(v) && typeof v !== "string") ? slice(v) : [v];
    }

    function isNode(el) {
        return el instanceof Node;
    }

    function isObjectLikeNotArray(value) {
        return isObjectLike(value) && !isArrayLike(value);
    }

    /**
     * 深度对象合并
     * @param {Object} src 需要扩展的对象。
     * @param {Object} [...ext] 待扩展的属性。
     */
    function merge(src) {
        slice(arguments, 1).forEach(function (ext) {
            if (isObjectLikeNotArray(ext)) {
                Object.keys(ext).forEach(function (key) {
                    var value = ext[key];
                    if (isObjectLikeNotArray(value)) {
                        if (!src[key]) {
                            src[key] = {};
                        }
                        merge(src[key], value);
                    } else {
                        src[key] = value;
                    }
                });
            }
        });

        return src;
    }

    /**
     * 建立一个 HTML 元素
     * @param {String|Function} tag 元素标签,或传入 Stateless 组件函数。
     * @param {Object.<String.String|Bool|Number>} [attrs = {}] 元素属性集合。
     * @param {Array.<String|Node>|String|Node} [...children] 子元素集合。
     */
    function h(tag, attrs) {
        var children = slice(arguments, 2);

        // Stateless 组件建立
        if (isFunction(tag)) {
            return tag(Object.assign({ children }, attrs));
        }

        var el = merge(document.createElement(tag), attrs);
        children.forEach(function (children) {
            makeArray(children).forEach(function (child) {
                el.appendChild(isNode(child) ? child : document.createTextNode(child));
            });
        });
        return el;
    }

    return h;
})();

/**
 * 将建立的元素挂载到一个 HTML 节点 (会先暴力清空节点内容)。
 * @param {HTMLElement} mnt 挂载点。
 * @param {Node} node HTML 元素或节点。
 */
function mount(mnt, node) {
    mnt.innerHTML = "";
    mnt.appendChild(node);
}

简单用例

简单的使用例子。部分使用到 JSX 特性写法的需要 Babel + React 插件进行预处理(或等价预处理方案)。

需要预处理

/** @jsx h */
var app = (
    <section>
        <h1>Test: <code>test</code></h1>
        <article className="post">
            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc quis ornare velit.</p>
            <p>Nullam interdum, lorem non volutpat auctor, quam ante tempus massa, eget dignissim ligula erat non arcu.</p>
        </article>
    </section>
)

mount(document.getElementById("app"), app);

不需要预处理

var app = (
    h("section", null,
        h("h1", null,
            "Test: ",
            h("code", null, "test")
        ),
        h("article", { className: "post" },
            h("p", null, "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc quis ornare velit."),
            h("p", null, "Nullam interdum, lorem non volutpat auctor, quam ante tempus massa, eget dignissim ligula erat non arcu."),
        ),
    )
);

mount(document.getElementById("app"), app);

Stateless 组件:

/** @jsx h */
// See https://c.jixun.moe/ui for live-demo
(function(root) {
    function UnsafeHtml({ html }) {
        var div = (<i />);
        div.innerHTML = html;
        return div.childNodes;
    }

    function ExternalLink({ className, href, children }) {
        return (
            <a className={className} href={href} target="_blank">
                { children }
            </a>
        );
    }

    function Author({ author, uri }) {
        var AuthorTag = uri ? ExternalLink : "i";
        return (
            <AuthorTag className="author" href={uri}>
                {author || "无名氏"}
            </AuthorTag>
        );
    }

    function Comment({ website, author, uri, text }) {
        return (
            <div className="comment">
                <p>
                    <Author className="author" author={author} uri={website} />
                    (来源: <ExternalLink href={`https://jixun.moe` + uri}>{uri}</ExternalLink>)
                </p>
                <div className="body">
                    <UnsafeHtml html={text} />
                </div>
            </div>
        );
    }

    function App({ comments }) {
        return (
            <div className="comments">
                {comments.map(comment => (
                    <Comment {...comment} />
                ))}
            </div>
        );
    }

    var xhr = new XMLHttpRequest();
    xhr.open("GET", "/latest");
    xhr.onload = xhr.onerror = function () {
        var data;
        try {
            data = JSON.parse(xhr.responseText);
            mount(root, <App {...data} />);
        } catch (error) {
            root.textContent = "获取评论出错。";
        }
    }
    xhr.send();
})(document.getElementById("app"));

2018.04.13: 加入了类 React Stateless 组件 支持。

以及使用上面这个修修补补过的版本重构了一下「近期评论」单页应用。

's avatar

GitLab Runner for autoscaling with Docker Machine on Google preemptible VM

前言
ホロ's avatar

在 GNU/Linux 下制作 Windows 的安装 USB

嗯……

UEFI

最简单的方法是把 U 盘格式化成 FAT32 文件系统,然后把 ISO 里的文件复制到 U 盘上。 (不是把那一个 ISO 文件复制到 U 盘上啦~)

BIOS

貌似直接 dd 不起作用……

有人说 unetbootin 可行,但是咱装好以后一片空白…… 😂

或者开个 Windows 虚拟机试试 rufus 或者巨硬的 Media Creation Tool ?(……)

于是就 ms-sys 了(不是 msys 😂,是 http://ms-sys.sourceforge.net/

  • 首先把汝的 U 盘格式化成 MBR 分区表,然后新建一个 NTFS 分区并把它设置成活动分区 (cfdisk 一气呵成(误))

    于是假设它是 /dev/sdb ,如果 mkfs.ntfs 的时候太慢的话可以加个 -Q 试试(

  • 然后把 Windows 的安装 ISO 挂载上,里面的文件复制到 U 盘上。

  • 把 Windows 7 的 MBR 写进 U 盘里去:

    sudo ms-sys -7 /dev/sdb

  • 把 NTFS 的 PBR 写进 U 盘的第一个分区(大概也是唯一一个)里去:

    sudo ms-sys -n /dev/sdb1

大概就可以用啦 😂 于是咱又水了一次……

via these people and places