Recent Posts

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

Fish Shell 精简手册

Fish —— 一个友好的交互式终端
'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 -

Cunky's avatar

论安装Ubuntu遇见的迷之问题(黑人问号

来由

这些天Cunky心血来潮(闲的蛋疼),盯着自己VPS的Ubuntu发了一会儿呆,突然闪过一个念头,要不装个Ubuntu+Windows10双系统玩玩?

于是就有了接下来的安装Ubuntu18.04.1之旅

过程

安装Ubuntu跟其它GUN/Linux系统差不多 过程也是极其简单的了

首先从Ubuntu官网下载其镜像 很多朋友可能会有访问的问题 这里可以寻找国内镜像站下载 比如阿里云的OPSX或者清华大学开源软件镜像站

都是国内很不错的镜像站 这里Cunky使用的是清华的

(注意一点是下载完镜像一定要做md5或者sha512校验—像我这次在别的网站不小心下了一个错的镜像XD 然后才采用清华的)

这里提供一下Ubuntu18.04.1的md5码

f430da8fa59d2f5f4262518e3c177246 *ubuntu-18.04.1-desktop-amd64.iso
9b15b331455c0f7cb5dac53bbe050f61 *ubuntu-18.04.1-live-server-amd64.iso

具体别的可以自行去Ubuntu官网查看
接下来就很简单了 用软件将镜像写入U盘啥的 UltralISO使用USB-HDD+写入以后会出现错误
解决方法有

1.使用RAW写入
2.换用其它写入软件

这里我用了其它的写入软件 Rufus
写入完成就很简单了 直接U盘启动 安装Ubuntu就可以了
但这里就出现迷之问题了 如图

这个问题需要结合这张图食用(雾

可以说是非常奇怪了
于是Cunky寻找了各种方法 但因其没有提供任何原因 故Cunky一时难以判断 且当时已经是凌晨三点了 Cunky也是有些烦躁 就睡觉去了XD

解决

Day 2
起床后 Cunky看着Ubuntu的安装界面再次发起了呆
半天过去 Cunky打开了Ubuntu试用系统的硬盘分区软件
发现全部硬盘没有一个空分区或者ext4分区
于是重新分一下区 问题就解决了 ??????
好吧 这个问题纯属自己的原因 下次估计不会再犯了吧(

这些天Cunky打算将Ubuntu装到移动硬盘上 于是又遇见新问题 再次难住了入门新手Cunky

有时间再慢慢解决吧 233333333
To Be Continued…

论安装Ubuntu遇见的迷之问题(黑人问号最先出现在Cunkyの空想笔记~

ホロ'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
  • 任意一种支持 Live CD 的 Linux 发行版的 ISO(如果你尝试过 Boot Camp 安装,你可能要用到)
  • UNetbootin
  • 两个 8G 以上的 U 盘,建议使用 USB 3.0 的
  • USB Hub(建议使用 USB 3.0 的)
  • 外接键鼠套装
  • 机智的你

我的安装环境

  • 机型: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 安装,请跳过这一节!

本解决方案来自 Rod Smith这篇帖子 中的回答。十分感谢!

TBD

开始安装

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

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

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

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

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

安装驱动

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

然后就大功告成了。

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

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

使用Rclone在各系统挂载你的网盘

Rclone是啥?

Rclone是一款支持对接各种云盘同时实现你所需要的功能的同步工具

它支持的网盘有很多 具体如下表

Amazon Drive (See note)
Amazon S3
Backblaze B2
Box
Ceph
DigitalOcean Spaces
Dreamhost
Dropbox
FTP
Google Cloud Storage
Google Drive
HTTP
Hubic
IBM COS S3
Memset Memstore
Mega
Microsoft Azure Blob Storage
Microsoft OneDrive
Minio
Nextcloud
OVH
OpenDrive
Openstack Swift
Oracle Cloud Storage
ownCloud
pCloud
put.io
QingStor
Rackspace Cloud Files
SFTP
Wasabi
WebDAV
Yandex Disk
The local filesystem

可见其覆盖之广,而且它的使用也是极其简单的。

安装与配置Rclone

由于rclone官网提供了绝大多数平台的安装包 因此安装也是极其简单

==》Rclone官网传送门

打开官网后 点击上边的Downloads按钮

可以在官网是自行寻找合适的安装包

官网上面有提供快捷安装脚本 但我用了一下 发现脚本有些小毛病 故开始自行安装

我用的是Centos 7 其它版本的系统请自行下载相应的安装包并执行安装命令

yum -y install wget

wget https://downloads.rclone.org/v1.42/rclone-v1.42-linux-amd64.rpm

rpm -ivh rclone-v1.42-linux-amd64.rpm

安装完成以后就开始配置rclone了

rclong config

在输入 完这条指令后会弹出第一个选项

由于我们之前没有配置过rclone 于是按照提示输入

n/s/q>n

—创建一个配置

接着输入名字 这个可以随意设置 但一定要记住 以后管理这个网盘就靠这个名字了

name>cunky

—可以自行设置 但要记住

接着会弹出让你选择设置的网盘 这里我用的Google Drive 故选择11

(值得注意的是10号的Google Cloud Storage跟Google Drive不是同一个东西!

storage>11

接下来就是设置网盘了 由于手动设置比较麻烦 这里我们采用自动设置

直接跳过前面各种选项 直到弹出了   Use auto config?   这个询问语句

我们在选择处输入n表示我们要采用自动设置

y/n>n

这时会弹出一长串link 我们将其复制到自家的浏览器上 并且打开 登录自己的Google Drive账号 并且允许rclone获取相应信息 直到取得Verification Code

然后将此代码复制到rclone的设置过程中

Enter verification code>[Your verification code]

—每个人的verification code都是不一样的

最后就是设置这个网盘是否为Team Drive 由于我是个人的网盘 于是设置成no

之后确认一下网盘的设置 退出rclone config

至此 你的网盘已经可以通过rclone来访问了

具体指令可以参照指令

rclone help

挂载网盘到系统上

嘛 终于进入正题

虽然这个过程比安装要快xddd

首先要确认你安装的系统支持fuse并且安装了fuse

yum -y install fuse

—安裝fuse

接着创建你要挂载网盘的位置<Path>

mkdir /mnt/google

—位置可以自行选择 不必相同

最后输入rclone的挂载指令

rclone mount <name>:/ <Path> –allow-other –allow-non-empty –vfs-cache-mode writes

例子:

rclone mount cunky:/ /mnt/google –allow-other –allow-non-empty –vfs-cache-mode writes

结束…

最后在整个rclone安装结束以后 我想说的是 rclone的功能远不止这么一点 它可以做的比你想象中的还要强大

目前我的服务器用的就是rclone来进行的备份工作 希望各位可以发挥出rclone应有的实力

使用Rclone在各系统挂载你的网盘最先出现在Cunkyの空想笔记~

Cunky's avatar

网站重新搬迁了!

这一次算是服务器最后一次更改域名了(笑

嘛 至少以后五到十年不会再修改了

希望大家可以来支持我的博客 谢谢Thanks♪(・ω・)ノ

(至于更新?什么时候有时间了我就会来更新一些有趣的文章

网站重新搬迁了!最先出现在Cunkyの空想笔记~

ホロ'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 大概像这样……):

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

ホロ's avatar

Sailfish OS 移植中(0)- 挖坑

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

17windy's avatar

[美羽释厄录]开发进度

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

日常:和Unity2018.2和Bolt的各种Bug斗智斗勇

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

广告位招租……

😂

火村-LMDM387's avatar

好用的gnome-tweak-tool插件:wallpaper changer

优点:支持整个目录内的图片随机更换(暂未确定是否包括子文件夹)

设置简单(同时也是缺点,仅支持最快1分钟的自动切换)

支持wallhaven网站壁纸


缺点:可设置项太少



LOFTER:火村-LMDM387   http://lmdm387.lofter.com/post/3f2222_eece8dbf
's avatar

Lightful Sea - Hikari no Umi no Apeiria Review

The title comes from Sunless Sea, an adventure game where the player explore the dark sea of unknown. However, it has nothing to

依云'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

梦日记 01

#1

阳光透过五楼的窗户毫无遮拦地洒进教室。怠惰的蝉鸣,时不时夹杂在下课的吵闹声中。

教室里,有的同学摇晃着椅子和他人交谈;有一些在一张桌子旁围成一圈,看不到在做什么。有的人靠在窗边,朝着运动场的方向眺望,似乎在寻找什么。

看着黑板上的粉笔字,他感到一阵目眩。

这时,一个同学注意到了他,向他打了声招呼。他呆住了,没有反应。他不认识这位同学。

而且他满脑子里只有一件事。

20年之后,他又回到他以前就读的这座高中了。

#2

她放学后会去练弓。

但他不会射箭,辅助新手练习的射箭俱乐部的同学也不在。不过他不关心。他只对她感兴趣,所以他就跪坐在一旁看着。

他知道这所学校其实没有射箭俱乐部,也知道这个国家的人不会像他这样坐。他没想那么多。

当夕阳将要消失在远处教学楼的阴影中的时候,她开始收拾东西准备离开。

她没有向他搭话。她几乎不向任何人搭话。

他犹豫着是否要追上那提着包消失在门后的背影。

但他没有站起来。他的腿有点麻了。

#3.A

他的奶奶对他说过,爱一个人,就应该保护她的尊严。

他的奶奶也可能没对他说过这句话。她住在几百公里外的乡下,葡萄藤长得繁盛的地方。他几个月才会和她见一次面。

他暗自下定决心,如果这句话不是他奶奶说的,那他就自封为名言家。

名言家就是说名言的专家。比如说奥斯卡・王尔德,就是过去一位有名的名言家。

人总是在自己方便的时候想出一些名言,来作为自己的行动的理由。

想着这样的名言,他忍着发麻的腿,向着两位弓箭部的成员,一瘸一拐地走去。

向着背地里嘲笑她的两人走去。

#4

起因往往会是一些微不足道的事情。

望着街道另一头渐渐下沉的太阳,他走在放学后的路上。

沿街没有买小吃的小摊,到深夜才能看到这些推着小车的摊贩的身影。

他忍着饥饿,想着晚饭吃什么。

“嘿。”

他定住了。他认得几米之外,向他招手的这个人。

这个人和他穿着同样的校服,但在太阳光的对比下,显得有些暗。

20年前,记不清为什么了,他和这个同班同学的关系不太好。说是不太好,但连讨厌也算不上,就只是单纯的平行线,没有一点交集。

高中毕业之后,两人也分道扬镳了。

你,也回来了吗?

他嘴唇动了动,又随着口水一起,将这句话咽了回去。因为看着他的这个人的笑脸上,带着一抹感伤。

#3.B

他紧紧抱住了面前的她。

“我喜欢你!”他喊道。

他没有说下一句话。

在他怀里的她没有回过头来,也没有说话。

在他的眼前,一切都慢慢融解在金色的光芒中。

写在最后

我总有一些后悔的事。

不过有一些人,他们无忧无虑、达观岸然,他们对过去,对自己无怨无悔。

所以这里还是把人给划掉,改说我总有一些后悔的事好了。

回头看自己这些年,总感觉有一些后悔,有一些不甘:有的事情,自己本可以做得更好;如果那时候能那样,那说不定现在也不会这样了。

但即使这样感慨,也不会有任何改变。

无论是多么美好的梦,都有醒来的时候。

而新一天的太阳,照常会升起。

写在最后的后面

说好写 Apeiria 的感想的,结果鸽了5个月。这次可能要鸽到红瞳的后面了。

'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 中创建材质笔刷

火村-LMDM387's avatar

你眼里《龙族》最好的结局是什么...

你眼里《龙族》最好的结局是什么? - 梅内酷的回答 - 知乎https://www.zhihu.com/question/54898863/answer/412157900


推荐一下~答主写得挺不错的~



LOFTER:火村-LMDM387   http://lmdm387.lofter.com/post/3f2222_ee86c86d
Fenking's avatar

属于我的战争

高考结束了。
群里散发着等待考完同学水群的信息,数着人头数,看着大家一个一个加进来。
心情无比紧张,稳定地做完模拟题,没留下什么遗憾地走出图书馆,心砰砰跳。
我不高考。
我甚至不在中国,不会感同身受那种气氛,那种我也经历过的气氛。
他们结束了,我要开始了。
五味杂陈一瞬间用来,没有顶着一口气、但却有着说不出的滋味。
高中班有一半人去复读了,朋友顶着与985两分之隔,也去复读了。
现在他们已经出来了。
只剩下我了。
可能在身边的其他的留考考生感受不到这种气氛,也没兴趣去感受:他们有的是高三过来,没想着要高考;有的是根本没参加高考,完全不在意;有的是不想上国内大学,跪着舔着这个弹丸之地;也有的早就对自己高考水平产生了怀疑。
我的高三过得如此混沌,如此煎熬。
我没有校园,没有运动的空间和权力,也没有和同伴畅谈闲杂的选择。我和众多复读生一样,在没有学校没有校园的地方,从早上七点坐到晚上九点,被打压,被镇压,没有欢声笑语,没有同甘共苦。
我一个人放弃生命地战斗,最终也没有其他人的欢送和考前的放松,背负着各种各样的疾病和伤痕,顽强地走进考场。我不能说我是最痛苦的,因为肯定有比我痛苦的人存在;但是以此绑架自己,太卑鄙了。
然后我失败了。
然后我为了健康,没有去复读,我害怕那个地方,害怕那个我待了半年的地方。
我去日本了。用一年半的时间换取大学。时间是最宝贵的财富,我总为我感到不值,也对未来的我还要回去感到心酸。
现在是我的战争了。
6月17号考试。
前方还很漫长。

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,更换自己控制的域名,使用脚本更改页面中的旧链接,但是,它还是在一点一点、不可避免地衰老。

's avatar

Last Day

It was unreal, but it felt real.

We are facing a giant dragon – given that all dragons are large – to fight our ways up the tower.

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 以来,它总是给我无数的惊喜,无论是在现实中,还是游戏中。追求游戏中的成...[点击阅览全文]
依云'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

Ricter's avatar

Drupal 7 - CVE-2018-7600 PoC Writeup

null
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 跟 黄大师 聊天,谈到了副卡的事情,于是 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();
})();
Ricter's avatar

Drupal CVE-2018-7600 分析及 PoC 构造

null
'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

大概就可以用啦 😂 于是咱又水了一次……

IceHoney Blog's avatar

使用letsencrypt为自己的网站加密

好吧,这次博客的更新稍微有点迟到了。因为自己各种忙着考驾照什么的,不过新的一年又要有新的开始了。最近买了VPS也就开始折腾起来了,讲讲如何用letsencrypt来给自己的网站颁发不要钱的证书,而且最近还支持通配符的二级域名了,想怎么开子网站都行!!!

dehydrated

浏览器的证书签名的步骤实在是很麻烦,所以有位热心的学生做了一个自动化脚本,可以自动生成脚本并且可以和其他脚本一起使用。达到一键签名证书。

letsencrypt-cloudflare-hook

我把自己的DNS服务托管到cloudflare上,还可以使用cloudflare提供免费的CDN服务。最重要的一点是cloudflare有API接口。利用这个接口就可以自动完成DNS-01 challenge。简单的来说,就是通过添加一条DNS记录来证明自己对这个域名的所有权,才能给这个域名颁发证书。

安装过程

知道了这两个工具之后,我们就可以开始配置证书了。具体的流程都写在项目的文档里面了。我这里主要是讲述下遇到的坑,首先我自己的服务器环境是CentOS7,使用的是默认的python2的环境。需要安装cryptography的库才能顺利完成编译。

sudo yum install gcc libffi-devel python-devel openssl-devel

其次,配置环境最好保存在dehydrated/config里,这样就没必要每次都设置环境变量。

echo "export CF_EMAIL=user@example.com" >> config
echo "export CF_KEY=K9uX2HyUjeWg5AhAb" >> config
echo "export CF_DEBUG=true" >> config

CF_KEY就是cloudflare里面的Global API Key,替换一下就好了。因为我们要配置的域名包含所有的二级域名,所以需要新建一个dehydrated/domains.txt文件,并写入:

icehoney.me *.icehoney.me

这样就会对主域名和所有二级域名生效。

之后再执行命令,./dehydrated -c -t dns-01 -k 'hooks/cloudflare/hook.py'。如果没有问题就可以看到成功生成的日志。

参考:

dehydrated

letsencrypt-cloudflare-hook

Failed to install Python Cryptography package with PIP and setup.py Ask Question

依云's avatar

小米 Note 3 令人失望地方

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

小米 Note 3 入手的时候简单写过一篇文章。现在用了一些天了,有些新的体会,也是我最不满意的地方。

双摄像头看上去很厉害,但是照片大小只有1-2MB,不像我的 Z5C 一样有5-6MB。为什么呢? 在手机上,因为小米相册放大倍数有限,根本看不出来差别。但是传输到电脑上之后可以很明显地看出差别:

从图中可以看到,小米拍摄的照片(左)不仅比我的 Z5C 的(右)分辨率要低,而且有偏色、模糊不清(照片拍摄的是 Paperlike HD 的 Floyd 模式,所以那些沙粒一样的效果是本来就那样的;背景色有点偏绿也是肉眼所见之状态)。

这意味着,用于记录的时候,比如拍摄白板、幻灯片、小区通知,习惯了 Z5C 之后,用小米很可能在需要的时候才发现根本看不清(我已经有好几张记录用的照片现在才发现基本上是毁了)。

小米摄像头另外有一个大问题:在光照很强的时候(比如晴天室外),摄像头会有反光,在照片中呈现出一个偏绿色的亮点

之前已经提到过,这扬声器的设计挑握持姿势,很讨厌很讨厌:我左手握持的时候,为了保证手机不在遇到碰撞不稳等情况的时候意外滑落,我会用小指托住底边,刚好堵住扬声器的孔……

小米云同步能是能同步,但是很不及时。一般情况下,我 Z5C 拍好照片过一会儿,就可以在 Google Photos 上看到照片了。小米不知道怎么回事,经常看不到照片,需要手动打开相册然后等一会儿才会有。

啊对了,小米右上角那个天气,也是要点开才会更新的样子……

's avatar

土豆评论

2018 年 5 月更新:它开发完成了。


我想了想,决定捡起这个被我在去年弃掉的坑,并重新设计、编写相关代码,确保它有着更加科学的设计。撸起袖子加油干!

背景

Disqus 在中国大陆已经不能用很久了,好气啊。

使用 Disqus 的那些博客,往往会考虑换成多说、ISSO、原生或者一些小众评论框服务,或者直接拿 Github issues 托管评论,也有人(比如我)想:来我博客的人应该都会翻墙吧。

直到有一天,某人问我:

你博客的评论是怎么回事儿呀?好像自己没有看见回复按钮。

看来必须找个替代服务了,要不然我的一些(并不经常翻墙的)朋友没法往我的博客发布评论啊。

多说

多说就算了吧。

  • 抛开国产服务的通用问题不谈,首先它的 HTTPS 支持实在太不正经(博客一定会出现 Mixed Content),还要自己搭个 HTTPS 反代服务器来实现小绿锁。
  • 它的评论提醒也不正经到爆,除了浮窗以外似乎没有别的方法查看评论动态,有个邮件提醒也是摆设。
  • 只能通过社交网络登录,授权会过期,而且还会很烦人地提醒你去延期。
  • 多说带来的垃圾评论比原生 Wordpress 还多,太烦人。
  • 网站界面水平大概是 Disqus 的零头。

更新:多说下线了。

小众评论框

这也是我的考虑之一,但我后来放弃了。

  • 友言:看上去很久没有更新了,而且 UI 也没比多说好到哪去。更重要的是,它不支持 HTTPS
  • LiveRe:看上去是个很棒的评论服务,而且完整支持 HTTPS,然而免费版功能少到可怜,甚至不支持评论导出。网站界面不是韩文就是别扭的中文,想看看专业版有哪些功能,介绍只有韩文版本。英文界面也比这样强啊!
  • 萌评论:功能比 LiveRe 还少,而且看上去极不可靠。虽然我知道偷揉是个很棒的前端开发者,但至少目前没法考虑。

至于 GitHub issues?首先你要有一个 GitHub 帐号,然后还要知道如何使用 GitHub issues ...... 对于我这种所谓的技术宅问题是不大,但是对于圈子以外的朋友,门槛比翻墙用 Disqus 还高。

为了让我看起来是个真正的菊苣,我打算自己写一个(对我来说)最好的评论框服务!

于是 Pomment (Powerful Comment) 的故事就开始了。

Pomment 的计划特点?

  • 易于安装、更新
  • 采用多个 SQLite 数据库存储数据
  • 提供多种管理 API
  • 提供邮件提醒、webhook 支持
  • 前后端分离
  • ……

至于什么时候做好,也许是个谜(

kookxiang's avatar

在 Ryzen 平台上安装 macOS High Sierra

首先简单扔下目前电脑配置吧:

CPU:AMD Ryzen 5 1600X Processor

主板:ASUS PRIME B350M-A

内存:G.SKILL Ripjaws V Series 16GB (2 x 8GB) DDR4 Memory

硬盘:Samsung MZVLW256HEHP (PM961) 256GB SSD

硬盘:SanDisk 250GB Ultra 3D NAND SATA3 SSD

显卡:ASUS Strix GEFORCE GTX 970

基本配置就是这些,当然,SanDisk 的 SSD 是为了这次安装黑苹果系统新买的。因为不想影响原有的 Windows 的分区结构。

首先第一步是下载最新的 High Sierra 镜像,并写入到 U 盘(我用的是 SanDisk CZ80,现在最新升级款是 CZ880)。

< 访问完整版以查看此播放器 >

其实装黑苹果并不是没有苹果设备,相反我手边就有一台 MacBook Pro。黑苹果最诱惑的地方在于它的性能,比如我的 Ryzen 如果拿来日常开发的话构建编译速度绝对比 Intel 的移动 CPU 好得多。

而且,装 High Sierra 首先你需要一台 Mac。

先下载最新的系统镜像:打开 App Store,搜索 High Sierra;等到下载完成后不要点击继续,直接 cmd + Q 退出安装程序。

首先将 U 盘改成 GPT 格式并格式化成 HFS+:

然后打开终端,使用命令将安装程序写入 U 盘:

sudo /Applications/Install\ macOS\ High\ Sierra.app/Contents/Resources/createinstallmedia --applicationpath /Applications/Install\ macOS\ High\ Sierra.app  --volume /Volumes/kookxiang/

U 盘写好了以后不要急着推出,下载 Ryzen 内核补丁 解压

用 Finder 打开 U 盘,按下 cmd + shift + . 显示隐藏文件。

复制压缩包中的 Ryzen_Kernel_10.13/PreInstall/Prelinkedkernel/prelinkedkernel 文件 到下面的两个目录覆盖:

  • /Volumes/Install macOS High Sierra/.IABootFiles/
  • /Volumes/Install macOS High Sierra/System/Library/PrelinkedKernels/

顺便将 PreInstallPostInstall 两个文件夹放进 U 盘备用。

下载 Clover 配置工具 运行,找到左侧的 Mount EFI,挂载 U 盘的 EFI 分区,使用 Ryzen_High_Sierra_10.13_EFI.zip 解压覆盖。

确定你的 BIOS 没有开启奇怪的配置,或者直接重置一下,关闭 CSM 模块,这样 Clover 和 Windows 10 开机画面分辨率可以变成 native 的。开启 EHCI 和 XHCI Hands-off,确保 USB 能够正常工作。串口并口这种 20 年前的端口顺便就关了吧,就算开了你也没有对应设备的… HPET 建议打开,由于早期 Ryzen 官方超频软件依赖这个功能我就提前打开了。

需要注意的是直到 Clover 安装完成前硬盘都是没办法启动的,建议在 BIOS 中选择首选启动方式为 U 盘,使用 U 盘中的 Clover 启动安装程序或安装好的系统。

如果你像我这样比较慌,可以把 M.2 SSD 拆了,拔掉其他硬盘的 SATA 线,避免手滑一时爽。

接下来就可以使用 U 盘启动了,在 Clover 画面中选择 U 盘,稍等片刻就可以进入安装界面。如果出现禁止符号,别慌,这是玄学问题,洗洗脸重启几次就好了。

进入安装界面以后,点击上面的实用工具 - 磁盘工具。分区并格式化这里应该就不用说了,但是需要记住磁盘的名字,比如我这里用的 Hackintosh,中间不要空格。完成后退出回到主界面,接下来就跟白苹果一样一路下一步了。

安装完成后会自动重启,但是不要进入系统!

还记得我们的 PreInstall 和 PostInstall 吗?选择从安装 U 盘启动,打开终端,执行 /Volumes/Image\ Volume/PreInstall/pre,填写上一步中的磁盘名称。如果磁盘名称有空格或者其他特殊字符的,自己改脚本吧…

这一步的主要目的是复制补丁文件并替换系统内核为 Ryzen 修改版。

如果没有报错,重启电脑,选择从 Hackintosh 启动,会开始走进度条,其实这才是真正的系统安装过程。

等待进度条走完后再次选择从安装盘启动,打开终端,执行 /Volumes/Image\ Volume/PostInstall/post 替换内核。

替换好后重启,选择从 Hackintosh 盘启动,配置系统并创建账号。
这里不推荐绑定 iCloud,进了系统在绑都不迟。

系统部分基本就 OK 了,接下来需要安装 Clover,可以下载之前提到的 Clover 配置工具,同时挂载 U 盘和系统盘的 EFI 分区,将 U 盘的 EFI 文件夹复制到系统盘上,出现覆盖提示时选择”合并“。

接下来可以删除一些安装程序用的兼容组件,推出 U 盘,打开 /Volumes/EFI/EFI/Clover/kexts/Other 文件夹,删除 DummyUSBXHCIPCI.kextDummyUSBEHCIPCI.kextGenericUSBXHCI.kext 三个补丁。

为了让 Ryzen 在 macOS 下全速运行,使用 Clover 配置工具 打开 clover.plist,在启动参数中增加 busratio=xx,其中 xx 为倍频。例如我这块 1600X 日常超频到了 3.8G,那么这里就写成 busratio=38,因为 Ryzen 超频基本都是超倍频,外频默认都是 100MHz,如果你改了外频的自己慢慢算吧。

GTX 970 驱动还是比较简单的,首先到 Clover 配置工具 中点击安装驱动,点击安装 EmuVariableUefi,到 NVIDIA 下载 最新的 Web Driver 安装即可。

由于苹果本身配的显卡就是 ATI 的,所以 A 卡用户基本可以免驱动跑,有问题再搜吧。

确认基本 OK 后,重启,这回终于可以脱离 U 盘开机了,确认各功能都正常就告一段落了。

最后晒图:

Ricter's avatar

Exploiting Jolokia Agent with Java EE Servers

null
ホロ's avatar

所谓的近况2??

从摸鱼中惊醒

1月和2月,几乎全部家当都在学校(包括唯一一台放着登录 Github 和 VPS 的 SSH 私钥 和 GPG 私钥的笔记本),然后就咸了)

3月回学校以后又回到了以前沉迷游戏不能自拔的日子,又咸了……

😂

关于故人

其实每个月都有不少人去世(参照 https://zh.wikipedia.org/wiki/Portal:讣闻 ), 不过听说霍金去和爱因斯坦谈笑风生(那天其实也是爱因斯坦诞辰)时还是有点震惊(误)。 虽然咱也就是翻过《时间简史》和《果壳中的宇宙》而已😞

然后过几天看到了这个:

@ayakaneko 已确定在下午两点自杀并抢救失败(信息来源于她父母)

— 羽毛💔 (@zhangyubaka) March 24, 2018

其实和这俩人不能算是太熟 😔 ,不过在几天之前 @zhangyubaka 就一直在寻求帮助了, 还试图去找 @ayakaneko (虽然最后好像还是受到了威胁)。嘛现在就愿 Neko 安好吧~

有关事件的部分信息可以去看看某篇知乎专栏文章: https://zhuanlan.zhihu.com/p/34901959

呜呜……说不出话来,只能说咱没经历过不太懂得受到的伤害 😭

关于音乐游戏

从一个跟风总结开始 😂

/me 跟风来总结一下咱自己玩过的吧😂
现在经常玩的: IIDX,SDVX,Jubeat,maimai,Groove Coaster,Arcaea,Dynamix,Project DIVA Future Tone
现在在玩的;Cytus(1+2),OverRapid,Tone Sphere,Deemo,Superbeat XONIC,VOEZ
(未完待续) https://t.co/4c0sWUz9K1

— ホロ 🐺 (@Ken_Ookami_Horo) March 27, 2018

休闲了好几年…… 😂 顺便给新的 https://t.me/mug_zh 打个广告 (划掉

关于无名计划

说的就是 https://github.com/KenOokamiHoro/it_have_not_get_a_name_yet 啦😂

感觉当初定下来的目标太大了的样子,又要 GNU/Linux ,还要兼顾一些隐私和安全保护相关 的知识……加上咱有没有那么多技能点……

曾经一度想用一个 GNU 钦定的 GNU/Linux 发行版(参见 https://www.gnu.org/distros/free-distros.html ), 最后还是放弃了,Debian 其实也海星 😂

嘛总之还是慢慢填吧……

Librazy's avatar

[Dr.Lib] Data Mining: KNN and Decision Tree

Recently I want to write a technical post in English. I […...
h404bi's avatar

Microsoft Office 2016 自定义安装

作为宇宙第一 IDE Visual Studio 的兄弟,宇宙第一办公套件 Office 在 Windows 系统下更加常见。新安装的系统,即使刚开始不愿安装,等到要查看编辑 docx pptx 文档时,还是会乖乖就擒。只是没想到,Office 2016 这个 2.41GB 的安装镜像,居然是一个 Click-to-Run。

FILE cn_office_professional_plus_2016_x86_x64_dvd_6969182.iso
SHA1 277926A41B472EE38CA0B36ED8F2696356DCC98F
SIZE 2.41GB

点一下,就全自动帮你把 Office 全家桶完整安装上了,不需要你做任何的下一步设置,也不给你做任何的安装设置。

对于日常只使用 Word、Excel、Powerpoint,最多再加一个 Outlook 的人来讲,全家桶的 Access、Onedrive for Business、Publisher、Skype 等必然是多余的,装上了基本不会用到。如果你想干掉这些没用处的部分应用,又或者像我一样,此前已经知道过 Click-to-Run 的厉害,但新装系统后手抖直接点下了镜像的 setup.exe 的话,那就来与我一起“卸了又装”。

卸载已安装的 Office

Office 官方文档库里,选择第 2 种方法:

Option 2 - Completely uninstall Office 2016 with the easy fix tool

下载 easy fix tool: o15-ctrremove.diagcab,双击执行一路到底后重启计算机。

重新自定义安装 Office

第一步: 解压安装镜像。因为待会要替换文件,直接挂载 iso 的话无法进行替换。

安装镜像解压后

第二步: 下载 Office 2016 Deployment Tool。执行后会解压出两个文件,一个是 configuration.xml,另一个是 setup.exe。将两个文件覆盖到刚刚解压的镜像文件夹内(也可以改名备份原来的 setup.exe)。

第三步: 修改 Deployment Tool 配置。编辑 configuration.xml 文件,设定安装版本,更新频道,排除不想安装的应用。以下是我的配置文件,安装 64 位专业中文版(对应 cn_office_professional_plus),仅保留了 Word、 Excel、Powerpoint 以及 Outlook,其它全部排除。如果想把 Outlook 也排除的话,可以在此配置基础上再加上 <ExcludeApp ID="Outlook" /> 即可。具体配置说明可以看配置文件里面的注释。

第四步: 载入配置文件进行自定义安装。在镜像解压目录下,按住 Shift + 鼠标右键,在当前目录打开命令行。键入 ./setup.exe /configure configuration.xml 并执行。

UAC 弹窗确认后开始自动安装。不过这次可以很明显的看到不再是全家桶都给你安装上了。

结尾小 Tips

  1. Outlook 添加两步验证的帐号时,要使用 App Password 而不是帐号主密码。
  2. Outlook 默认下很奇怪的是,启动后你点最小化,它实际上并不会最小化到托盘,在任务栏上还是会有 Outlook 的图标。而如果你选择点关闭,则整个 Outlook 都会关掉。通常比较多的可能是误点关了 Outlook,而退出后的 Outlook 是不接收邮件的。这时可以使用一个小插件实现 Outlook 点关闭时最小化到托盘,解决这个问题。

完整的 gist 归档:gist.github.com/h404bi/62f65347d5784b37c8535aa371c59720

Kagurazaka Yashi's avatar

曾绽放于此的繁花

等待花开 写这篇博客的时候,我的内心似乎也是处于有问题的时候,不过每到心情不好的时候,我都会更愿意去写写东西,大概这能让心情安静一些,抒发一些。 十天前,我第一次去了医院...[点击阅览全文]
依云's avatar

小米 Note 3 入手体验

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

为了对付诸如支付宝、淘宝、摩拜等在我的 Z5C 上特别卡的手机软件,我入手了一台小米 Note 3。

最初的感觉是:很滑,手感很不错。下面指纹识别很方便。

有点大,单手不容易按到对面。因为下巴上都是按键,所以放桌面边缘时不容易拿起来,会误触那些键。不过作为备机,在家的时候放桌面上就好了,解锁直接按,不需要经常拿起来。

没有拍照键,但是可以设置音量当快门用。有快速启动,但是是在系统设置的「手势及快速启动」中配置的。另外有个「街拍模式」,就是拿着手机,长按快捷键开始连拍或者摄像,而屏幕没有任何显示。

拍照默认带水印,可以在选项里关掉。前置摄像头拍照时默认带美颜(i.e. 别当镜子用)。还带了性别和年龄检测,以及我没太搞懂的「魔镜」评分功能。

云存储会存储原始品质的照片,免费空间只有5G,不像 Google 是 10G,并且可以无限量存储高品质照片。黑屏的时候似乎并不会同步照片,反正我等了好久,在网页端没看到。等再次打开相册时,它告诉我正在同步呢。

自带手电筒功能,可配置成亮屏后长按菜单键启动。不能像我那个 Xposed 模块那样,直接从黑屏状态启动。不过也没多大差别。

音质好不好不清楚,反正是够响。不过扬声器位于下边缘右边,手挡到的话会非常影响音质。我用过的 Z5C、Z3C、LT26i 上均没有发现这种事情,倒是我第一个智能手机 E15i 是这样,扬声器在背面,听歌时得俯卧着。

充电很快。剩余一半多的电,开始充电时 5.7V 0.9A,后来到了 6.6V 0.7A。不过使用小米充电器,我的Z5C更快,系统显示充电电流为 1.9A。我原来的充电器给 Z5C 充电时只有 0.9A 的,快了一倍。不过发生了一件令人悲伤的事情——忘记取下我的USB电流电压测量仪,它工作太久,累坏了……

SIM 卡槽需要使用配备的捅针去捅出来。不过需要的时候,最好同时配备一只汉子,或者女汉子,因为真的要用很大力,偏偏捅针就一个圈,细细的,底端也是面积极小的边缘,皮肤不够糙的话很难使上劲。当然也可以想办法,比如把针插好,然后对着桌面使劲磕几下,卡槽就会出来个边了。这体验比起 Z5C 用指甲一剥即开的体验,是有趣不少。

不插SIM卡无法安装未知来源的应用(apk 文件),也不知道这是什么鬼逻辑。小米商店里的东西还比较多的,条码扫描器、Elixir 2、Telegram 都有。HE 的 Network Tools 没有,不过可以去百度那边搜到。Google 应用说是因为授权问题没有,会提供位于百度上的版本。我没试过能不能安装,反正安装了也用不了……

默认浏览器默认为MIUI自己的浏览器,如要更改,需要去「设置」->「更多应用」->右上角菜单「默认应用设置」里修改,不会像 Android 原生系统那样让用户自行选择,也不能通过默认浏览器应用信息里的「取消默认操作」来重置。

主页是类似于 iOS 的:没有下边的「所有应用」界面,只有混杂在一起的应用图标和小部件。最让人受不了的是,应用图标被加了个半径非常大的圆角矩形,还带个白底

顶栏默认不显示通知图标。这样也好,因为放一天之后我一看,近十条没什么用的通知呢……可以设置显示网速,不过不知道是下行速率还是总和。可惜不能显示时间显示秒数。

总体来说,功能挺丰富,但是有些混乱,界限不清。比如两种设置快捷键的途径(相机内、设置内,其实 Android 系统原生快捷键比如截屏也是可以用的,但是设置里是没有的),比如两种设置默认应用的方法。比如到处都是的推广。应用商店里几乎搜任何东西都能看到知乎,搜 Network Tools 能看到 RealCalc。「游戏」应用里竟然有「直播」。建立个放应用的文件夹都能给你推荐应用。说得好听点,叫「紧密集成」,说不好听,就叫「高耦合」。

哦对了,这机器需要保持干燥。也就是说,我洗澡时想听歌还是得带上我的 Z5C。

2018年04月06日更新:续篇《小米 Note 3 令人失望的地方》

Phoenix Nemo's avatar

迁移 DokuWiki 到 BookStackApp

Wiki 这么反人类的语法是怎么存在这么久的???????

总之受不了 Wiki 语法的可维护性了。什么?这玩意儿有维护性???

以及万年不更新的各种插件。系统升级后 PHP 7 不兼容,一看还是 swiftmail 的问题。生气。

正好有需求要整合一套知识库平台,搜索了一下 Confluence 的 alternative,发现了 BookStackAppPhabricator

前者适合个人或开源社区使用,后者则是一整套企业协作解决方案。对于我的需求来讲,BookStackApp 就足够啦。

页面数据

DokuWiki 并不使用数据库,因此没有一个通用的中间件来实现数据格式转换。而 DokuWiki 的语法非常奇葩——比如,它的一级标题是 ====== 这样 ======,六级标题才是 = 这样 =,正好和一般的 Wikitext 倒置。图片、内链等的表达方式也相当愚蠢,这些问题使我在思考迁移方案的第一个小时内就放弃了直接从源码转移的途径。

顺便,还有另外一个问题——本来为了使 Wiki 易于编写,这 DokuWiki 还安装了 Markdown 插件。因此部分页面中混杂着 Markdown 语法,更增加了源码处理的复杂度。

综合来看,最通用的数据格式,就是最终渲染出来的 XHTML 了。

图片

DokuWiki 的图片存储策略也是非常的奇特。由于它没有数据库,因此为了保持图片与页面的对应,它将图片存储在每个页面同样的路径下,并通过执行 PHP 的方式获取(扶额。

更甚者!!!

外链的图片,也是通过 /lib/exe/fetch.php 带参数来获取!!

我 的 天 哪。

因此既然在页面数据的考量中决定了使用最终渲染输出的 XHTML 来处理数据格式,图片也需要特殊的下载和归档技巧。这将需要使用 sanitize-html 提供的 transformer 方法来实现。

逻辑实现

一开始尝试了一些 Site Exporter 插件,但遗憾的是并没有什么真正能派上用场。甚至一些暴力递归下载所有页面和资源的脚本的表现也非常糟糕。

但是根据 DokuWiki 的官方 Tips,它可以将文章内容单纯导出 XHTML,只需要加上 ?do=export_xhtmlbody 参数即可。这就方便了,因为这样只需要一个完整的页面列表就可以了。随便找一个可以输出子命名空间的插件,新建一个页面用于从根命名空间展开就 OK 啦。

请求这个列表页面的 XHTML body 输出,使用 cheerio 遍历所有的 a 标签,就获得了所有要导出的页面地址。分别再去请求这些页面的 XHTML body 输出,做如下处理:

  1. 跟踪所有的 img 标签,下载图片文件并按预定义的路径规则和文件名归档。
  2. sanitize-html 清除所有不必要的标签、样式、id 和 class。
  3. sanitize-html 按预定义的路径规则更新所有 aimg 标签属性。

看代码

后来发现 DokuWiki 的性能不足以支撑异步请求的速度,额外加上了 sleep 模块来控制请求频率(扶额。

脚本执行完后,将图片目录移动到 BookStackApp 的对应位置,便可以直接读取所有的 HTML 文件来导入数据啦。

用了这么久,才发现原来还有比 raw HTML 更难以维护的数据格式啊…(望天。

HY's avatar

Android Apps

安卓手机用久了,手头也积累了一些解决不少使用上痛点的好应用。今天就来推荐一下这些应用吧。  去你大爷的内置浏览 […]
's avatar

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

更新 2.9

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

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

100% Orange Juice 修改器


没有什么令人期待的新功能。

灰灰's avatar

使用HTTP Alternative Services实现免备案

由于众所周知的原因,国内的主机都是封闭80端口需要备案才能开启的。 这对不能备案的域名(如moe)以及不想备案 […]
HY's avatar

Souls-Like Games

最近因为玩了血源以后一发不可收拾的喜欢上了魂类游戏,血源7周目通关之后紧接着开始打黑魂3(刚好HB月包里送了) […]
神楽坂伊織's avatar

俺说游戏EP10:如何语无伦次地给亲戚安利NS!

对不起!这期节目本来是想3月11日发布的,结果我懒了!
于是今次打算一刀不剪,直接发布!
中间的卡壳、瞎掰和语无伦次还请各位见谅!谢谢!
kookxiang's avatar

国家队 ED1 发售了吗

没有完整版的《トリカゴ》听,我要死了

发了 magnet:?xt=urn:btih:0E60761122A15F7AECE58E9BF61B653553785110

< 访问完整版以查看此播放器 >

SgDylan's avatar

Roland MIDI 软件合成器安装记录

这是一篇记录软件 MIDI 合成器安装的流水账,如有错误请及时指出。

Kagurazaka Yashi's avatar

夜与泡沫般的未来

失眠了,也是好久没有这样一直看着天空亮起来了。 通宵未眠的我,越是想着赶快睡觉,就越是烦躁。干脆抄起边上的掌上电脑,打开 vscode,打算还是不要浪费这时间,不如写写明...[点击阅览全文]
Dimpurr's avatar

校内应用个性化数据年报项目全程吐槽纪实 – 长单页面前端工程与 ECharts 图表可视化

这篇文章以全程实录的方式,记述了我在接到任务之后,从初期策划和出设计稿、组织文案撰写,再到前端工程开发、处理应用统计数据、利用 ECharts 绘制可视化图表,到最后部署上线的完整过程,以及在此期间内心满满的槽点。也许你可以从本文窥见一个完整有趣的项目流程,或者了解我在项目过程中收获到的经验;或者你发现了其中我犯的错误或不足,也请不吝赐教。

本文来自 钉子の次元 - Dimpurr - 千里之行,始於足下。 ,原文地址 校内应用个性化数据年报项目全程吐槽纪实 – 长单页面前端工程与 ECharts 图表可视化

via these people and places