Recent Posts

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

mmiaow's avatar

Day 10840 Apache、PHP NTS、FastCGI与Rewrite之间不得不说的故事(雾

为单位装新网站,出于安全考虑,环境需要由我自行配置,于是按照开发公司的要求去下载了Apache 2.4、PHP 5.6和MySQL,由于服务器系统为64位Windows,所以理所当然地都下载了64位的组件,其中PHP使用了比较顺手的TS(线程安全,Thread-safe)版本。

一切配置好后,发现说明书中组件要求有一个Zend Guard Loader,于是跑去下载,但当看到支持PHP 5.6的Zend Guard Loader的版本只有x86版本时心里就咯噔一下,尝试配置后,果不其然,64位的PHP无法与32位的Zend组件协作,不得已推倒重来,谁知这只是更大坑的开始。

将Apache 2.4和PHP 5.6 Non Thread-Safe的文件准备好后,却找不到php5_apache那个dll引用,一通检索得知NTS版本的PHP是没有这个文件的,需要采用FastCGI调用,于是在httpd.conf中增添如下行将Apache和PHP进行组合:

# PHP Modules.
LoadModule fcgid_module modules/mod_fcgid.so
<IfModule fcgid_module>
FcgidInitialEnv TEMP “C:/WINDOWS/Temp”
FcgidInitialEnv TMP “C:/WINDOWS/Temp”
FcgidInitialEnv windir “C:/WINDOWS”
FcgidInitialEnv PHPRC “F:/web/php”
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000

<Files ~ “\.php$>”
AddHandler fcgid-script .php
FcgidWrapper “F:/web/php/php-cgi.exe” .php
Options ExecCGI
Allow from all
</Files>
</IfModule>

测试安装phpMyAdmin,一切正常,于是按照手册继续向下配置,需要增添一部分Rewrite规则来支持系统的运行,结果这些规则一加,访问任何东西都是403 Forbidden,连一个html都访问不到了,试了很多方法都没有用,去查看日志时可以看到很多形如下文的错误信息:

[Mon Jun 11 17:39:15.291969 2018] [rewrite:error] [pid 7496:tid 896] [client —.—.—.—:—–] AH00670: Options FollowSymLinks and SymLinksIfOwnerMatch are both off, so the RewriteRule directive is also forbidden due to its similar ability to circumvent directory restrictions : D:/web/htdocs/site1/index.php

但是无论是在httpd.conf还是vhosts配置中的对应位置,增加FollowSymLinks或SymLinksIfOwnerMatch的Options都没有用。

在折腾了一个多小时后,终于发现了一个有用的方法(原文链接):

在FastCGI配置块中,需要将对*.php文件的处理配置增加(或修改为)如下设置:

Options ExecCGI FollowSymLinks

据说是因为FastCGI的配置是与TS的PHP不同造成的。

重启服务,终于可以正常访问了。

火村-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

Sailfish OS 移植中(0)- 挖坑

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

'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"来完成。所以完成组建的透明封装只需要加上三个指令。


  
  

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

mmiaow's avatar

Day 10826 数据恢复:《一面》

以前混迹在动漫渔场论坛时,心比天高,总喜欢在满是才华横溢的文人们齐聚的、一个叫同人故事的板块,发一些自己都看不下去的烂文,还自以为写得不错。

当然,后来因为一些事,大部分都被自己用编辑功能删掉了。

今天找以前的数据时,偶然又翻到这些幼稚的字符串,不由哂笑,一为自己曾经的心高气傲,一为自己曾经的为赋新词强说愁。

现在的东方Project可能与我记忆中(THA1/13以前的版本)的已有很大不同——或者换句话说,人总是容易沉湎在回忆里,所以在这里也转载保留一篇以前的改写文,留作一个沉湎的角落。

一面

2007年2月12日(转写自鲁迅《一面》)

  明治17年秋天,我在幻想乡整理着我的历史。

  一天中午,我放下手中的笔,外面依然阴沉,自来毛玉也有一阵没一阵的在窗外普通地飘飞,似乎才刚刚中午的样子。心里想:到巴瓦鲁图书馆去吧,在那里看一会书,顺便查查资料也好。因为接连几天的撰写,每天都要伏案工作十几个钟头,我已经十分地疲乏了。

  书店里空荡荡的没有一个人,只有中央的书桌上,帕琪依然在研究着她的魔法。金色的羽毛笔写的飞快,然而我却看不懂写的什么。有时笔忽然停住,像发现了什么新奇的东西。帕琪的面孔上,透露出她坚忍的性格。我向里面望了一下,灰暗却不晦涩,隐约辨认出坐在图书馆一角的小桌的的是一个瘦瘦的、十五上下的萝莉,旁边飞行着一只人偶,有规律地悬空沉浮着,闪着微弱的光芒。

  我什么也没有带来,帕琪似乎也没有注意到我,这样安静的氛围正是我所需要的。随便抽出几本书来,翻了一会儿,觉得没有什么合意的,就踱到窗边。

  地下室的窗外是魔法虚拟的风景,深邃的星空点缀着稀稀落落的星光。图书馆中并不冷,但却让人感到由衷的冷清。忽然,我在回头看见的架上横排着一本初版的《东方妖妖梦》。《东方妖妖梦》?我记得这是神主下一剧本的篇名,说是自然味道很浓的样子。看一下那书脊,赫然印着“3-爱丽丝篇”,我便像得到了保证似的,立刻从书架上抽下来。

  我先看那后记(我读神主的剧本,一向是这么读法),但是看完第一面就翻不开了:书上有封印。瘦弱而轻盈的萝莉——帕琪走了过来。

  “帕琪,能不能打开这个封印?”对于幻想乡不动的大图书馆,我总是喜欢叫她的昵称的,虽然并没有什么根据。

  她不情愿地摇头,接过书揽在怀里:

  “不可以。”

  一同踱回书桌,两杯冒着热气的咖啡已经放在书桌上了。像我,平素只喜欢喝绿茶,因为怕损伤记忆力而不喝咖啡的人,现在受到这样的礼遇,不容易推托,有些窘迫了起来。

  我不好意思地笑一下,解释说我不喝咖啡,却又被那咖啡的香气所吸引,那是品质极佳的咖啡豆才能含蓄的精华。然而我的心终究还是在书上的,于是便问道:

  “为什么?”

  她没有注意到我的解释,低垂着头,依然是一幅旁若无人的神情,用她那细弱的手在书上抚摩着,嘴里喃喃地自言自语:

  “冬天,距离这里已经不远了……”

  来的时候,路边的野蔷薇开得正欢,那充满生机的红色,让人无论如何无法联系到冬天即将到来。

  “我知道你不信,可这是神主的旨意。”

  我真踌躇起来了:戏是不能不演的,然而变化也太大了,刚刚布完夏天的红雾,转眼之间,就要飘落冬天的白絮,如果能过渡的缓一些,该多好!我面对着帕琪,竟一时语塞,无话可说。

  帕琪大概看出点什么苗头,就对着里面招了招手,小书桌前的人,慢慢地起身,走到这边来,跟随着她身后的人形。

  她的面孔只有白皙,少了应有的血色,好像大病初愈的人,但是精神好像还不错,没有一点颓唐的样子。金发约莫六寸长,红色的发带,白色的锯齿披肩,蓝色的连衣裙,年龄看起来也就十六七岁。

  “你要看这本书?”她看了我一眼。那种慈祥里包含着寂寞的眼光,使我立刻感到受了神主大人抚摩严肃和慈爱交织着的抚摩似的。

  “是的。”我低低地说。

  她招呼人形从书架上拿下一本书来,版式纸张和《3-爱丽丝篇》一样,只是薄一些,封面上印着两行小隶的字:《东方妖妖梦——故事梗概》。

  她用两只手将书递给我,那动作是小心谨慎的:

  “你看着一本吧,这本比那一本完整。”

  她是谁?对我这样一个根本没有出场过的角色致以如此的信任?我一进门的时候本来就有点疑惑,现在更加疑惑了;虽然猜不出是谁,但自己断定;一定是一个不平常的人。

  我一翻封一:作者是ZUN和爱丽丝!神主大人!

  “小姐,我消受不起,我心理准备不够……”我的话低得连自己都听不见了,我不知道怎样才好。

  我低了头,头脑里轰隆轰隆的。我不敢看他的脸。我只听见一个声音在问我:

  “你是不是叫阿求?是不是!”

  “是!”我抬起头,顿时恢复了勇气。

  “我送给你,两本。”

  什么?我很惊异地望着他:面孔只有白皙,少了应有的血色,好像大病初愈的人,但是精神好像还不错,没有一点颓唐的样子。金发约莫六寸长,红色的发带,白色的锯齿披肩,蓝色的连衣裙,年龄看起来也就十六七岁……这时,我忽然想起神主昨晚托梦来的人物设定。

  “哦!您,您就是……!”

  我结结巴巴的,欢喜得快要跳起来了。一定是他!不会错,一定是她!那个名字在我的心里乱蹦,我向四周望了一望,可没有蹦出来。

  他微笑,默认地点了点头,好像我心里想着要说的,他已经统统知道了一样。 这一来不会错了,正是他!站在我面前的,妖妖梦中幻乐团的代言人!她作为神主的精神寄托,降临在这无何有之乡,虽然是孤独的生活却不减她特殊的气质。她带着奖励似的微笑,指着《故事梗概》对我说明:

  “这本书本来是要好好保存的,但是你是阿求,所以也就交付给你。讲我那一本,算是我送你的。”

  我看这她将书上的封印解除,书上的结界发出浅蓝色的光芒,然后,缓缓地打开,将我带入一个雪花漫天,却夹杂着春天气息的世界……—————————————————————————————————————————————

  现在的日子,大约已是花开之夜之后又一年,然而我仍然认为,妖妖梦中神主寄托的精神,才是神主大人对幻想的乡村真正的想象,比起红雾的略显幼稚,和满月的异变来,要好得多了。

  “神主大人是同我们在一起的!”

  我一直都这么坚信。

'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 年应该是基于网易云音乐的吧

于是,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 Emualtor』知道了百度超级马里奥吧,后来又找到了超吧大水库吧,然后认识了 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 认真的学习了一些对他来说是新的编程思维,包括面向对象编程。总之大学以来的一年是 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》一文。

ホロ'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……

mmiaow's avatar

Day 10806 Give me an ORZ

一个很无聊的小应用,只做一件事:启动后向剪贴板写入一个『_(:з)∠)_』。

可以将其锁定到任务栏,以便随时随地ORZ。

下载地址

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();
})();
's avatar

rec-4-12-2018

Artificial Intell

's avatar

Notes for 4-10

Database

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 上看到照片了。小米不知道怎么回事,经常看不到照片,需要手动打开相册然后等一会儿才会有。

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

mmiaow's avatar

Day 10766 迟来的https启用

即日起,本站的Blog部分正式启用Let’s Encrypt签发的SSL证书,其它页面如“锟斤拷”域名、霞光之羽饭否机器人等页面,因实际上是静态页面,暂不列入启用范围。

由于本站采用的是非常实惠的虚拟主机(这种情况通常也称为网站主人没钱),且一开始并没有在主机的控制面板中找到相应的证书导入选项(直到现在也没有显示出来,是靠瞎猜误打误撞进去的),就一直将启动SSL搁置起来,没想到一放就是两三年。

大体就是这么一件小事。

'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 合成器安装的流水账,如有错误请及时指出。

本文主要为两种 Roload 软件合成器的安装过程,
包含直接输出播放及渲染输出音频文件的概要步骤。

安装

首先是 munt 的安装
munt 是 Roload MT-32/CM-32 的软件模拟器。
模拟器包括两个部分:

  • 开源的 munt
  • MT-32/CM-32 的官方 ROM(如下图)

安装方法很简单:

  1. 安装并重启
  2. 打开 mt32emu-qt.exe(在安装目录里)
  3. 打开菜单 Options -> ROM Configuration
  4. 将 ROM Directory 设置为存放 MT-32 ROM 文件的目录(注意路径必须全英文),然后按下 Refresh
  5. 勾选已加载的 CM32L 开头的两个文件并按下 OK 确认

然后是 Roload SOUND Canvas VA 的安装
这东西实际是 SC-55/88/88Pro/8820 的软件模拟器。

需要的软件有:

  • Roland SOUND Canvas VA: MIDI 音源本体
  • Midi Yoke: 虚拟 MIDI IO 驱动,可以在 Windows 10 使用
  • SAVIhost: 独立的 VST host 程序
  • TMIDI: MIDI 播放器(同时可用于 munt 模拟器)

安装步骤:

  1. 安装并破解 Roland SOUND Canvas VA
  2. 给 Midi Yoke 安装程序设置兼容性选项,并安装
  3. 重启系统,并在控制面板中找到并打开 MYokeNT(32 位),配置为如图选项

播放

使用 munt 直接播放 MIDI 文件

对于 munt,可以使用四种方法播放 MIDI:

  • 直接使用 mt32emu-qt.exe 打开 MIDI 文件(兼容性较差)
  • 使用专用的 MIDI 播放程序,如 TMIDI(兼容性好,界面丑)
  • 使用一般的音乐播放器,如 Foobar2000(兼容性一般,渲染效果一般)
  • 使用编曲软件,如 FL Studio(界面友好,可视选项丰富)

使用 mt32emu-qt.exe 播放非常简单,打开后的界面选择需要播放的 MIDI 文件即可。

需要注意的是,现代 MIDI 与 MT-32 的 MIDI 通道稍有不同,需要做通道重映射调整(如下图)。


使用 TMIDI 播放需要先配置 MIDI 输出接口。

选择 MT-32 则由 munt 渲染输出,选择 Out To MIDI Yoke 1 则由 Roland SOUND Canvas VA 渲染输出

播放文件很简单,直接把 MIDI 文件拖进窗口即可,如果没有声音请参考 mt32emu-qt.exe 播放重新映射通道。


使用 Foobar2000 播放存在多种选择,
既可以透过系统安装的 munt 播放,也可以使用 MIDI Player 插件内置的 munt 播放。
这里只介绍使用插件内置 munt 播放的配置。
配置非常简单,首先搜索安装 foo_midi.dll 插件安装,然后按下图配置修改模式,选择 ROM 所在路径即可


使用 FL Studio 播放也是很方便的,步骤如下:

  1. 戳 OPTIONS -> 勾上 Enable MIDI output
  2. 戳 OPTIONS -> MIDI settings
  3. 然后选择 MT-32 Synth Emulator,然后将 Port 改为 0,并选上 Send master sync
  4. 使用 FL Studio 打开任意 MIDI 播放,如果没有声音请参考 mt32emu-qt.exe 播放重新映射通道。

使用 Roland SOUND Canvas VA 直接播放 MIDI 文件

大体上支持的播放方式:

  • SAVIhost 加载 SOUND Canvas VA 的插件,透过 MIDI Yoke 变成类似 munt 的 MIDI 输出设备,然后配合支持 MIDI 输出的软件播放(例如 munt 播放使用的 TMIDI 和 FL Studio,操作上只是选择的输出接口变为 Out To MIDI Yoke: 1 而已)
  • 播放器挂载 VST Host,直接加载 SOUND Canvas VA 插件

第一种播放方式需要预先使用 SAVIhost 加载插件,
然后戳 Devices -> MIDI,如下图配置


由于 Roland SOUND Canvas VA 实际是一个 VST 插件,故第二种播放方式实际上就是使用音乐软件加载这个插件作为滤镜使用,具体可以参考其他 VST 插件的安装使用过程,这里只用 FL Studio 做介绍。

具体步骤如下:

  1. 打开 FL Studio,戳 ADD -> Manage plugins
    然后在 Plugin search paths 添加 Roland Sound Canvas 的安装路径 (包含 SOUND Canvas VA.dll 的路径),最后按下 Start scan 并等待扫描完成
  2. 打开任意 MIDI 文件
  3. 戳 OPTIONS -> 取消 Enable MIDI output
  4. 找到一个这样的界面,然后戳箭头所指的这个三角形
  5. 戳 Replace -> More Plugins,找到 SOUND Canvas VA 并双击加载
  6. 在界面里戳这个小齿轮图标
  7. 然后戳这个图标
  8. 接着把图上箭头所指两处改为 0
  9. 播放试试?

渲染输出

munt 可以使用三种方法渲染输出音频文件:

  • mt32emu-qt.exe 里 Tools -> Convert MIDI to Wave
  • 使用上文方法透过安装的 munt 播放 MIDI,然后按下 mt32emu-qt.exe 界面上 Audio Output 部分的 Record 按钮录制
  • 配置 Foobar2000 内置的 MIDI 插件,然后直接使用 Foobar2000 的文件转换功能转换为 WAVE 或其他格式

就个人感受而言,使用 FL Studio 播放,搭配第二种方法的录制效果是最好的

至于 Roland SOUND Canvas VA 渲染输出就很简单了,使用 FL Studio 按播放的方式加载插件,然后直接 export 音频文件即可。

参考

http://blog.sina.com.cn/s/blog_72b3301c0102wrvd.html
https://www.bilibili.com/video/av12246109/
https://www.bilibili.com/video/av7349488

Kagurazaka Yashi's avatar

夜与泡沫般的未来

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

Day 10657 自在观喵——文本文件监视器

一款为了在指定的文本文件中搜索特定关键字的Single-Purpose自制工具。

主要功能为:在『采样间隔』后,按照指定的扫描起点,在文件中按行搜索特定的关键字。

当前版本:1.1(2018/03/02),下载地址:点击此处下载

特色功能:

1、双关键字检测功能,使同一行同时命中2个指定的关键字时才进行提示,提升提示效果;

2、可选多种提示方式,包括在通知区域弹出气泡(注:关于『显示图标和通知』的操作系统设置请自理)和弹出对话框进行提示两种形式;

3、允许设置实例标识,当运行本程序的多个实例时,设置该标识可方便鉴别关键字的来源;

4、显示关键字所在行:当检测到关键字时,除提示关键字和时间外,可选显示关键字所在行的整行内容。


更新历史:

Ver 1.1(发布日期:2018年3月2日)

增加显示整行功能,当检测到指定关键字时,在提示中显示该关键字所在行的整行内容

启用显示整行内容时,对特定的字符串进行自动清理(目前为硬编码)

Ver 1.0(发布日期:2017年12月10日)

初始版本

Dimpurr's avatar

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

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

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

's avatar

永恒的快乐……吗?

你愿意与我缔结一个契约吗?承诺我,永远不要长大,永远不要成为大人,我便将你带入 Enles Land ,那个孩子们专属的天堂,在那里任何愿望都能得到实现,你将得到永恒的快乐。
—— Fairy Bell

一篇充满着童话气息的故事——这是 Mhakna Gramura and Fairy Bell 这部视觉小说从头到尾给人的印象。它是 fault 系列的一部番外,因为 fault 系列有着非常精彩的本篇故事(尽管第二部下卷已经跳票很久了),这部番外也一定很棒吧。于是在看到它发布后,我便很快将它买入并一口气看完了。作者没有辜负我的期望, Mhakna Gramura and Fairy Bell ,是又一部美妙的作品。

动听的铃铛旋律,泛黄的羊皮纸背景,简单又可爱的插画,这些标题画面的元素无一不渲染着浪漫的气氛,像是回到了电灯发明以前的时代,打着散发出微弱亮光的油灯,在床边翻开了一本古旧的童话。

我很想分享自己在阅读时的感受,但那样将不可避免地,会没有保留地把全部的故事讲出来,那样对没有玩过这部作品的人来说,就是不可挽回的剧透了。所以没有办法,只好建议下面的内容,大家最好玩过原作再读。它在 Steam 上有卖,整个流程也只需两个小时不到。即使没有看过 fault 系列的本篇也没有关系,它不需要对本篇的内容有了解,也不会有剧透。

那么剧透警告完了,我开始讲了哦?


Mhakna ,我们的主角,是由于母亲犯罪被带走,从而被丢进孤儿院的 10 岁女孩。孤儿院的生活很糟,住宿条件很差,又吃不饱。直到有一天, Mhakna 最好的朋友 Sebia ——一个年龄相仿的男孩,将生活的希望寄予了 Fairy Bell 的传说。传说只要生活苦难的孩子从心底呼唤这只精灵,她就会出现并将这个孩子带到永恒的乐园, Enles Land 。

Sebia 去了, Mhakna 同样向 Fairy Bell 许了愿,她出现了,并向 Mhakna 询问道:

你愿意与我缔结一个契约吗?承诺我,永远不要长大,永远不要成为大人,我便将你带入 Enles Land ,那个孩子们专属的天堂,在那里任何愿望都能得到实现,你将得到永恒的快乐。

可是永恒的快乐,真的能够实现吗?在继续点击鼠标前,我在内心发出疑问。

人们想要自己的愿望成真,想要达到自己的目标,这是很天然的事情。但是实现愿望需要大量的努力,却也不一定能够实现——所以要是能够心想事成,所有的愿望都能实现,那该有多好呀!

但那真的是美好的吗?想象一下如果自己真的能够心想事成,自己的每一个意志都会得到现实中的体现,想要拥有什么就拥有什么。没错,那样永远也不会缺乏物质,可是精神却会变得无比空虚。

自己的想象力很快就会被穷尽,自己创造的东西总是在自己想象中的,便没有任何东西能够产生新鲜的感觉了。周围的一切都按照自己想象的方式运作,没有任何的未知性。没有机遇,没有挑战,没有会反对自己的任何人,没有一点的惊喜。

那样的生活无聊透顶了。要是我在那种处境的话,一定会疯掉的。

拿电子游戏打比方。游戏有挑战,要是觉得太难了,就可以开作弊,可以做任何事情,像是上帝一样。可那样尽管一时爽,时间长了,就会觉得无聊了。因为挑战失去了,未知性失去了。

有些游戏让玩家扮演上帝,像是 Minecraft 的创造模式,许多人也乐此不疲地按照自己的意愿,做出各种各样的东西。但那是因为玩家们在发挥自己的创造力,而创造力在人与人之间交流互相产生。也就是说,因为在现实中的人会互相交流点子,所以在游戏里才会乐此不疲地创造出自己从未创造出的东西。可要是一个人单独地,没有任何其他人可以交流,却要不停地创造东西,那就是精神上的折磨了。

所以 Fairy Bell 所说的,「任何愿望都能得到实现」,怎么会是快乐的呢?

而「永恒的快乐」,也是做不到的。除非我们的大脑变得只能不停地接收快乐,换句话说,变成傻子。

为什么能够感到快乐呢?因为有悲伤与之相比较。在饥饿的时候,吃到食物是快乐;在寒冷的时候,得到温暖是快乐;在精疲力竭的时候,完成任务的成就感是快乐。都是有不快乐的事情,才将快乐的事情变得快乐。说吃糖能使人快乐,那是仅限于最近没有吃过很多糖的时候,如果一直能够吃到无限的糖,不用吃别的东西,那吃糖还会是令人快乐的事情吗?最喜欢的食物,也不能总是吃,对吧?

快乐不仅仅是由悲伤比较产生的,快乐的事情也总是与在另一个时间的悲伤的事情互相伴随着。相遇是快乐的,可是相遇就意味着一定会有离别,而离别是悲伤的。吃到糖使人快乐,可是在糖被吃完的时候,同样也是悲伤的。

只有快乐,没有悲伤,那是做不到的。

所以看到 Fairy Bell 描绘的 Enles Land ,我很担忧。她要求的「永远不要长大」的承诺,看起来就像是一个枷锁,让进入那所谓极乐世界的人无法逃脱。

单纯的 Mhakna 显然没有抱着与我一样的想法,听到「永恒的快乐」,便非常高兴得想要前往 Enles Land 了,那「永远不要长大」的承诺,也是很随便地定下了。

再可怕不过的悲剧预告。

还好还好,就从 Mhakna 刚到 Enles Land 的样子来看,这个故事还很单纯,没有往我想象的方向发展的样子。看到 Mhakna 穿着干净的白裙子,由衷地感到高兴。

然后 Mhakna 的呆毛也很可爱,这呆毛不像许多动漫角色一样拥有特异能力,但它立起来的样子在这清新的画风的衬托下,为本来备受折磨的孤儿增添了不少俏皮。

好景不长,在我刚刚感叹完呆毛,并截图留念后不久,故事的细节就开始展现不详的一面了。 Mhakna 丧失了时间观念;只会吆喝、对旁人说话不理不睬的发传单少年;除主角二人以外,空无一人的 Cotonne 演唱会;从 Fairy Bell 身边飘落的枯萎花瓣; Sebia 忘记了自己以前最爱的绘画;永无止境伐木的 Chromie ;许愿也无法找到 Mhaize 的哥哥……一件接一件,展现着「永恒的快乐」的虚伪。

然后不出意料地, Mhakna 因为好奇,前往了从起初就被 Fairy Bell 告诫不要前往的紫色森林。那当然是触碰了红线的了。在紫色森林的守门精灵 Garlutz 化作了 Mhakna 最害怕的东西——她的母亲的形象,将整个游戏之前的轻松氛围一扫而空。

逃离而回的 Mhakna ,面对的只有因承诺被打破而愤怒的 Fairy Bell 。还被告知更严酷的条件:如果有产生「爱」的感情的话,心会被取走。

Fairy Bell 给出了这样做的原因:因为感情太多了,便会是悲剧的源泉。

我好像猜得一点没错。永恒的快乐,是不可能的。 Mhakna 接下来惨了。

但 Fairy Bell 似乎没有那样残酷。 Mhakna 叫来了 Sebia ,从「永恒的快乐」的梦中唤醒了他。两人一起决定一起离开。 Fairy Bell 心软了,留着泪,挽留地说:「离开了 Enles Land 以后,你们就再也回不来了哦?」

但是 Mhakna 和 Sebia 已经知道了,这是虚假的极乐世界。对着哭泣的 Fairy Bell , Mhakna 说:

无论在那世界上有多少痛苦,有多少悲伤……真正的快乐,只有在克服它们全部时才会得到。这是 Enles Land 与你,所教给我的。

随着两人的离开,故事迎来了尾声。

结束后的标题画面换成了新的背景,那是长大后的 Mhakna 与 Sebia 。 Sebia 在背对着屏幕绘画,而 Mhakna 带着笑容端着食物。想必两人是快乐的吧,与在 Enles Land 不同的,真正的快乐。

所以,也还是快乐的结局呢。主角们领会到了「极乐世界」的虚假,精灵也不像暗黑故事的一样残酷。 Fairy Bell 是个善良的精灵,这多么美好呀。


截图来自游戏 Mhakna Gramura and Fairy Bell ,它们的版权归属 ALICE IN DISSONANCE 。


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

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

灰灰's avatar

Nginx with TLSv1.3

开发历时近2年,在上个星期,OpenSSL终于发布了v1.1.1的第一个预览版,这也是支持 TLSv1.3 的 OpenSSL 的第一个 Release 。
虽然 TLS1.3 的标准还未修改完成,但绝大部分的浏览器(Chrome)都已经内置了实验性TLS1.3的选项。
下面记录一下 Nginx built with OpenSSL 1.1.1 的过程吧

使用系统: Debian Stretch

编译准备

依赖安装,本人习惯性使用 clang 而非 gcc ,所以把 clang 装上了,不喜请忽略

sudo apt install build-essential clang-3.9 -y

Nginx 在 1.13 才加入了 TLS1.3 的支持,编译时要注意获取 1.13 以上的版本

OpenSSL 1.1.1 pre1 兼容的 TLS1.3 版本为 draft-23

  • 更新:
  • openssl-1.1.1-pre2 发布
wget http://nginx.org/download/nginx-1.13.9.tar.gz
wget https://www.openssl.org/source/openssl-1.1.1-pre2.tar.gz
tar zxvf nginx-1.13.9.tar.gz
tar zxvf openssl-1.1.1-pre2.tar.gz

编译

OpenSSL 1.1.1 默认开启 tls1.3 ,所以只需要在编译时追加 --with-openssl 即可

cd nginx-1.13.9
COMPILER=clang-3.9 CXX=clang++-3.9 CC=clang-3.9 ./configure \
  --with-openssl=../openssl-1.1.1-pre2 \
  # 其他编译开关
make
sudo make install

安装完成后的 Nginx 为 built with OpenSSL 1.1.1 就是支持 TLS1.3 的了

设定 TLS 1.3

TLS1.3中新增了5种加密套件,分别为

  • TLS13-AES-256-GCM-SHA384
  • TLS13-CHACHA20-POLY1305-SHA256
  • TLS13-AES-128-GCM-SHA256
  • TLS13-AES-128-CCM-8-SHA256
  • TLS13-AES-128-CCM-SHA256

Nginx 设定很简单,只需要

  1. ssl_protocols中新增TLSv1.3
  2. ssl_ciphers最前面加入以上5种加密套件

使用 Mozilla 提供的 SSL Configuration Generator 生成并修改即可。

最终看上去的配置是这样的

server {
    #...
    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    #...
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS;
   #...
}

启动 Nginx 无错误,然后在浏览器端还需要做一些工作。

要启用 TLS1.3 draft-23 至少需要 Chrome 65 以上( Chrome 64 以下支持的是 TLS1.3 draft-18)

在 chrome://flags/#tls13-variant 中选择 Enabled (Draft 23)并重启浏览器

访问网站时即可看到 TLS1.3 生效

 

喵~

Kagurazaka Yashi's avatar

开启 Windows 自带的 SSH 服务

Windows 10 终于可以有 SSH 官方包了,比起之前的 Telnet 安全多了。终于向 Linux 学习了。 今天尝试了一下开启 Windows 10 的 SSH...[点击阅览全文]
's avatar

给自己写的博客主题

嘛,最近我给自己写了第一个自己的博客主题,就是现在(这篇博文发表时)你们看到的这个样子啦。毕竟给别人做了好几个前端项目,却没有自己的博客主题,有点说不过去呢。

通过几天的爆肝,它终于顺利上线啦!

在这里留个文章做个纪念好了。

不过这主题的名字我还没想好,也没有做好发布的准备,先看看以后会不会爆出什么奇怪的 bug 吧(

顺便归档页面的 JavaScript 我还没写呢,你可能需要等一段时间

mmiaow's avatar

Day 10733 使用独立安装包安装.Net Framework 4.6.2时,提示『无法建立到信任根颁发机构的证书链』

出现该问题的原因是未能更新本机的受信任证书颁发机构证书列表,导致安装包验证失败,以下几种情况可以造成此问题:

1、安装该运行库的系统未接入互联网;

2、安装该运行库的系统所在的网络环境,屏蔽了对微软受信任根证书更新的URL。

(如果使用的不是独立安装包,而是Web Installer,问题可能为第2条,因为Web Installer未联网无法使用)

解决方法:

1、点击此处(微软官方链接)下载Microsoft Root Certificate Authority 2011证书。

2、开始—运行,输入mmc启动管理控制台。

3、文件—添加管理单元,在『可用的管理单元』中选择『证书』,点击『添加』,在弹出的对话框中选择『计算机账户』,下一步中选择『本地计算机』,一路确定至返回到MMC的主界面。

4、展开控制台根节点—证书(本地计算机)—受信任的根证书颁发机构—证书,点击『操作』菜单—所有任务—导入(如果没有导入,只有『打开』和『导出』,则点击右侧列表末尾的空白处取消选择,然后重新操作一次)

5、在导入向导中,『要导入的文件』选择在第一步中下载的cer证书文件,下一步的『证书存储』选择『将所有的证书放入下列存储』,点击『浏览』并选择『受信任的根证书颁发机构』,并在『下一步』后选择『完成』。

6、重新运行.Net Framework 4.6.2安装程序即可。

's avatar

360 快视频事件相关评论

数据库泄露

并没有任何证据表明 B 站数据库出现了异常泄露.无论是投稿视频,评论还是用户头像与用户简介,都是公开信息,并不需要拖库才能拿到.爬虫就足够了.

密码安全

这里给出三个忠告:

  • 不要在不同网站使用同一份密码
  • 不要在其他网站使用账号密码登入另一个网站的账户.任何情况下,账户密码只能在对应网站的域名下输入.如果您不能很好的分辨什么是对应网站域名,建议您遵从浏览器自动填充功能的指导.
  • 违反上述两个的,建议您修改相关密码.

举报

我不建议没有版权的用户滥发 DMCA 通知与以版权为理由进行举报.除了给监督部门和您的 UP 带来麻烦以外没有任何作用.
如果您看到您喜欢的 UP 的视频被盗用了,请联系他让他与 B 站版权部门进行沟通.联系方式见此链接.

停用某些国产软件

我相信您会在停用某型国产软件时遇到困难,例如反复的静默安装等.
您可以通过此工具永远远离这些软件.

关于 360 先锋队

emm 先锋队也就是个高级用户群,这也能叫做联系了有关人员么…

Android 权限

https://www.bilibili.com/video/av19811009/ 评论区#4

我是不会明白这样的评论能够拿到 700 个赞的理由的
从 “查看你系统中的所有账户” 得到 “可以查看密码”,
从 “通过电子邮件发送邀请” 得到 “安装的一瞬间你的手握所有权就归别人了”,
还 “支付宝都有可能被盗” 以及 “有root的赶紧看看有没有什么奇怪的文件夹,没有的赶紧查毒,自己查,不知道为什么所有杀毒软件都不会报毒”
这种钓鱼言论似乎评论区被骗得不少,我不知道的是此条评论的发出者是真的不懂而且想来搞事还是就是来钓鱼的.

列出账户只能获取到系统上的账户,没有可能获取到密码.什么想法才会认为 Google 会给一个获取密码的权限出来,除了密码管理器以外哪有明文密码让你来查?这个权限的风险在于能够更加准确的识别您的身份.

写入日历权限的发送电子邮件只是日历程序附带的功能.这个权限在大陆的风险更加小了,因为电子邮件和日历的使用率都不高.

支付宝不会因为你安装一个软件就可以这么简单的被盗,特别是快视频还没短信读取这个权限.

至于后面关于 Root 的描述,如果你是一个 Root 用户,还相信上述言论,我建议您立即联系您的设备制造商进行反 Root.

不过非常欣慰的是,终于有用户开始关注 Android 应用的权限状况了.大陆应用滥用权限的现象非常严重,用户的关注能够更好的监督厂商认真思考获取每个权限的意义.

's avatar

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

更新 2.8

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

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

100% Orange Juice 修改器


没有令人期待的分身功能。

OX's avatar

2018農曆新年快樂

又是新的一年!

祝我自己和我身邊重要的人還有各位訪客,身體健康,萬事如意。

新年好!

博客已經很久沒有更新了,自從最後一次公開發表文章以來,陸陸續續寫了不少草稿,但是最後都沒有選擇公開,可能是心態老了,有時候有很多想法,寫出來之後想了又想,最終還是不發表了⋯⋯

 

依云's avatar

使用 VirtualBox 启动本地磁盘上的其它系统

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

VBox 可以从一个指向本地硬盘的 vmdk 文件启动虚拟机。

首先,为了避免使用 root 运行 VBox,我们需要给自己访问磁盘的权限。我即将启动的是位于 sda5 上的 openSUSE。它使用 UEFI 启动,所以 UEFI 分区的权限也是需要的。创建 vmdk 文件的时候需要读取分区表,因此,还需要 sda 的权限:

sudo setfacl -m u:$USER:rw /dev/sda{,1,5}

然后我们创建 vmdk 文件。使用-partitions 1,5选项的话,只有这两个分区能在虚拟机里访问,别的分区读的时候是全零,写入操作会被忽略。-relative选择使用分区设备名(sda1、sda5),这样创建好之后 VBox 不再需要对整块硬盘 sda 的权限了。另外会附带创建一个名字以 -pt.vmdk 结尾的文件。它是单独的分区表。如果是 MBR 启动的话,是可以直接在虚拟机系统里更新引导器的,不影响外边的系统。不过我这次是使用 UEFI 启动,所以用不上了。

VBoxManage internalcommands createrawvmdk -filename hostdisk.vmdk -rawdisk /dev/sda -partitions 1,5 -relative

创建好之后就可以撤销对 sda 的权限了:

sudo setfacl -b /dev/sda

然后去 VirtualBox 界面那边创建新虚拟机,并「启用 EFI」。另外,可以在存储设置里,把「控制器: SATA」的「使用主机输入输出 (I/O) 缓存」启用,似乎这样 I/O 会快一点。

VBox 的 EFI 并不像电脑的那样,按 F12 可以选择启动项。因此,它会启动默认的那个,也就是 /EFI/Boot/bootx64.efi。如果你想启动的系统不是这个的话,就把它的 efi 文件复制过来覆盖它。比如我是这么做的:

cd /boot/EFI/Boot
sudo cp ../opensuse/grubx64.efi bootx64.efi

如果是 Windows 10 并使用 MBR 启动的话,可以在虚拟机里用如下命令更新 MBR,干掉原来用于多启动的 grub:

bootsect /nt60 c: /mbr

做好之后就可以启动啦~

对于设备的权限设置,重启之后会丢失的。需要的时候再加上好了。

PS: openSUSE 自带了 VBox 的驱动啊,不过剪贴板共享不能用,大概只有显示驱动没带上服务。

PPS: 启动没一会儿就通知我更新出现错误,一看软件源设置,果然是 HTTP 的,被垃圾鹏博士劫持了。

IceHoney Blog's avatar

浏览器的渲染性能

不知不觉,2018年的春节也要来临了。今年只是元旦回家了,春节并不打算回家。回家曾经是一件美好的事情,不知从何时开始,却是那么的揪心。最近也有读很多关于性能优化和底层的前端知识。不想就此停滞,只能不断前进。

浏览器渲染

我们都知道,现在主流显示器的频率是60Hz,也就是1秒要刷新60次。这样才能保持画面的流畅,特别是玩游戏的时候,我们非常在意帧数。前端开发也是一样,所以我们每一项操作都最好在10毫秒之内完成,否则会产生所谓的卡吨现象,影响用户体验。

渲染过程

浏览器的渲染主要是分为5个步骤,我们需要了解这些知识才能编写性能更好的代码。

  1. JavaScript 我们经常使用JS来实现一些复杂的视觉效果,数据排序,DOM操作等等。
  2. 样式计算 此过程是根据样式匹配选择器来计算哪些元素应用哪些CSS规则的过程。不过浏览器会对常用的选择器进行性能优化,例如类选择器。
  3. 布局 在知道每个元素的应用规则之后,浏览器开始计算所需要的空间大小以及其处在屏幕的位置。网页的布局中,一个元素的变化会影响到其他元素的位置。例如Body的宽度变窄之后其子元素的宽度也都会发生变化。
  4. 绘制 绘制是填充像素的过程。它涉及绘出文本、颜色、图像、边框和阴影,基本上包括元素的每个可视部分。绘制一般是在多个表面(通常称为层)上完成的。
  5. 合成 由于页面的各部分可能被绘制到多层,由此它们需要按正确顺序绘制到屏幕上,以便正确渲染页面。对于与另一元素重叠的元素来说,这点特别重要,因为一个错误可能使一个元素错误地出现在另一个元素的上层。

JS / CSS > 样式 > 布局 > 绘制 > 合成

如果修改了元素的布局属性,也就是改变了元素的几何属性(例如宽度,高度)。那么浏览器就必须检查所有元素,然后重新排版页面。任何受影响的部分都要重新绘制,再重新合成。

JS / CSS > 样式 > 绘制 > 合成

如果之修改了元素的绘制属性,例如背景图片或者文字颜色,并不会对其他元素的布局造成影响。浏览器会跳过布局,但仍然执行绘制。

JS / CSS > 样式 > 合成

目前既不要绘制也不要布局的属性只有transform属性和opacity属性。所以在实现CSS动画的时候,优先使用这两个属性。

如何查询CSS属性触发上面3个流程的哪一个,可以去CSS Triggers 查询。

参考:

Rendering Performance

依云's avatar

大上 Paperlike HD 电子墨水屏开箱体验

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

刚听说就已心动,无奈当时并不支持 Linux。后来由于一些事情耽搁到现在,终于到手了~

显示器整体尺寸是31cm×27cm,其中显示屏尺寸不到26cm×21cm(请注意:手工测量有误差)。分辨率是2200x1650。也就是200dpi多,和我的 Kindle Paperwhite 一代差不多的。

显示器下方是两个纸盒,里边是Y形线(照片中没有)、简易支架(那根根子)、螺丝和仅几百M的驱动U盘。

Y形线是附加了USB电源线的HDMI线。信号走HDMI,电源走USB,所以需要额外占用一个USB口。当然接充电器上也是可以的,只是在电脑边接个充电器更不方便。

工作时,USB端口的电流为30~50mA左右,并不像说明书上说的需要2A那么多,挺省电的。对比之下,我的罗技鼠标接收器也需要15mA左右的电流呢。

线都接上之后,屏幕会闪几下,然后就可以用了。只是每隔几分钟会弹出提示信息,要求安装并运行所谓的「驱动」。下图是默认的 floyd 模式:

为了更多的模式,以及最重要的,别显示那个提示信息,需要安装并运行大上提供的软件。

软件是为 Ubuntu 提供的,但是 Arch 下也可以使用。下载并解包,将得到的三个文件「PaperLikeHD」、「ResChange」、「DS.ico」放到/usr/local/sbin/下,然后sudo PaperLikeHD 运行,会弹出一个包含一列按钮的窗口。不给 root 权限是不行的,会什么也不做就退出。

但是这样还不够。我使用的时候它总是报告找不到显示器。客服不肯告诉我它到底使用什么机制检测的,所以我 strace 又反汇编看了一下,最后发现它在找 /dev/i2c-* 设备文件,而我的系统上没有它们。看了一下一堆以 i2c 开头的内核模块,最后发现只要加载 i2c-dev 模块就好了。大上的软件需要一些时间来检测,等一会儿它就会在终端打开出「setting...50」这样的文字,这时就好了。

过程中我还专门启动到 Ubuntu live 系统里测试来着。后来才知道原来是自己的手速太快,软件还没检测到,其实等等就好 (╯‵□′)╯︵┻━┻

从图片中可以看到,floyd 模式的显示很粗糙。这是因为它实际上只有二阶灰阶,通过不同密度的点来近似不同的灰度。虽然显示有很严重的颗粒感,但是它响应飞快,常规打字操作时几乎感觉不到延迟,很适合写作和阅读文本。而真正的二阶灰阶模式 A2,只有黑白两色,虽然依旧反应快速,但是因为非黑即白,只能用来读纯文本,任何阴影或者灰色的字都不好处理。

16灰阶的 A16 模式,显示清晰、层次丰富,但是响应速度非常慢。也不是非常啦,除了屏幕大小外,无论显示效果还是响应速度都跟我的 Kindle 一样的。而与 Kindle 不同的是,它会在更新时将更新区域变黑再显示,造成闪烁。在此模式下使用鼠标非常非常费力,任何非静止的元素(比如火狐载入中的动画、时钟、光标移动)都挺分散注意力的。

以上都是所谓的「可变分辨率模式」。另外有个「固定1100x825模式」,也就是使用一半的分辨率。至于另一半去了哪里,看看它所支持的模式就能猜到了:

  • A5,也就是五灰阶。这是用四个墨滴来显示一个像素,每个墨滴只有黑与白两种状态。
  • A61,所谓的61灰阶。也是用四个墨滴来显示一个像素。不过每个墨滴竭尽所能有16种状态,也不知道大上是怎么组合出这61灰阶的。

也不知道大上为什么把这两种墨滴用法叫作「可变分辨率模式」和「固定1100x825模式」。哪里可变了,又哪里固定了呢?这两种模式切换时,会调用「ResChange」程序,它会影响当前的显示器布局,需要重新使用 xrandr 进行设置。

以下是各种模式显示这个灰阶测试网页的照片:

A2 模式:

A16 模式:

floyd 模式:

A5 模式:

A61 模式:

半分辨率下,清晰度做出了很大的牺牲。以下是 A16 和 A61 模式显示 PaperLikeHD 软件自身界面的效果对比:

在 A2、A5、floyd 模式下,可以调节对比度,也就是墨滴到底显示为黑还是为白的值,以在显示不同的页面时都能将文本与背景良好区分开。

和 Kindle Paperwhite 不同的是,它没有背光。在晚上的时候,屏幕偏暗,附加一个台灯光源比较好。不过它的屏幕也不像 Kindle 那样偏黄。

这篇文章最终定稿,就是在 PaperLikeHD 上完成的,使用的是 floyd 模式。我个人觉得半分辨率的几个模式很鸡肋。目前觉得,写作用 floyd 模式,文本阅读使用 A2 模式,网页阅读使用 A16 模式,这样最好了~

floyd 模式还有个问题:在显示某些图片时(比如我的 Awesome 桌面壁纸),那些墨滴颗粒会不断地抖动,就像风在吹沙粒一样……

最后,这里是大上的官网链接

依云's avatar

加固 systemd 服务

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

最近学 wzyboy 搭了一套 collectd + Graphite + Grafana 监控。collectd 和 Grafana 都比较好搞,Arch 官方源里有。但是 Graphite 就没有了。

我没有使用 Python 2 版、带 Web 前端的 Graphite 包,而是使用 graphite-api 提供 Web API,python2-carbon 存储数据。它们在 AUR 上有,其中 python2-carbon 是相当危险的(现在已经改了)。

为什么危险呢?

首先,最明显的,carbon 服务以 root 用户运行。它本身没有任何使用 root 权限的必要,所以专门创建一个 carbon 用户更好。

其次,它运行起来之后,我发现是监听 0.0.0.0 的。这个也无必要:我的 collectd 就在本地呢。

最后,也是最吓人的:它默认开启了接收 pickle 数据的端口。Python pickle 模块的文档一打开,就能看到红色的警告,告诉人们不能接收不信任来源的 pickle 数据。而我曾经工作过的公司也发生过通过 pickle 注入代码的事情:攻击者发现了一个对外网开放的 Redis 服务,刚好那个 Redis 是给 Celery 用的。攻击者于是往里边写了条自己构造的 pickle,在解析时调用 curl 命令向其服务器报告IP、端口和当前UNIX用户的信息。

这接口,开在外网,就是远程代码招行;开在本地,就是本地提权。很危险的。

为了防止各种漏洞被利用,一个未雨绸缪的办法就是:权限最小化。本来这是件比较麻烦的事情,好在 systemd 提供了许多现成的配置项,使得给 carbon 这种服务加固简单易行。

首先创建用户,写一个 sysusers 文件就可以了:

u carbon - "carbon service" /var/lib/carbon

然后,它需要使用文件系统的某些部分。那么别的就用不着访问了,比如 /home。而 /dev、/tmp 这些,自己用自己的就好。连 / 也不让写,也不允许获取任何新特权了。其实使用 carbon 用户它本来就写不了 / 也没有任何特权了,但以防万一嘛,要是哪里来个本地提权漏洞呢?

[Unit]
Description=Graphite/Carbon
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/carbon-cache.py --config=/etc/carbon/carbon.conf start
User=carbon

PrivateTmp=true
PrivateDevices=true
ProtectSystem=full
ProtectHome=true
NoNewPrivileges=true
CapabilityBoundingSet=

ReadOnlyPaths=/
ReadWritePaths=/run
ReadWritePaths=/var/log/carbon
ReadWritePaths=/var/lib/carbon

[Install]
WantedBy=multi-user.target

限制文件系统的访问,systemd 配置起来很方便,我打包的时候喜欢尽量加上。

完整的 python2-carbon 服务配置和打包脚本在这里

以及,这里是 Arch Linux 中文社区的编译机的 Grafana

Roy Binux's avatar

2018 新的冒险

真的又是好久没有写 blog 了。

年纪大了,记忆力下降,没有学习新东西的动力,也没精力折腾新的技术,新的领域了。每天就是看看斗鱼,打打游戏就过去了,现在的理想就是早点退休,当条咸鱼就好了。

2017 年主要给公司开发了一套基于 electron (chromium) 的页面渲染后端,可以保证抓取时和用户浏览器中看到的保持一致。同时这个服务器端的浏览器,可以通过 websocket 连接用户浏览器,双向同步页面内容变化,录下用户操作,在抓取时进行重放。这些功能我真的很想做给 pyspider,但是确实不方便。眼见着 pyspider stars 过万,而我却渐渐没有精力去维护了。我的希望是以后从现在的公司离职之后能有2-6个月全职开发 pyspider,算是这几年项目荒废的补偿吧。

公司终于把伦敦办公室关闭了,我也随着搬到了美国(湾区)。随便写一点美国的感受吧:

  • 加州税真高,比英国还高,英国人家好歹有免费医保啊
  • 美国真的是物资极大的丰富,真的可以理解为什么很多中国人来了就想要留下来,小富即安
    • 地广人稀,使得超市都是 super 起步的,这样会让选择非常多,卖的量都是加大号的
    • 充足的停车场,汽车出行不用担心不方便停车
    • 汽车让生活半径极大扩大,湾区各种中餐半小时车程都能到达,而半小时车程也不过是正常通勤所花的时间
    • 各种服务比起英国齐全多了,而且周六日不休
    • apartment 社区大都自带 365 天 7 * 24 开放恒温游泳池,健身房等设施(即使大冬天根本没有人去用,水也是恒温并更新的)
  • 非实时记账,很多场合真的需要使用支票,需要通过账单付费;因为是后付费,需要 SSN 查询你的信用记录。真的很不方便。
  • 租房好贵,宽带好贵,手机卡好贵,小费好贵

总体来说,英国更接近国内的政府+生活模式,而美国是只要你花钱,什么都有,不花钱,滚蛋。反正 L1 签证也就 3 年,也不能跳槽,而且就美国这个 H1B 抽奖 + 绿卡排队,比起英国来简直就是地狱模式。趁着这几年,在美国多玩一玩吧。9酱。

's avatar

(GBA) 最终幻想 I - 锁血补丁

适用于 最终幻想 I & II 的 D商 汉化版;日版未测试。

  • 实测能防御战斗时的普通攻击、魔法伤害;不确定毒性能否防御。
  • 不防御战斗外伤害(如毒地)。

使用 IPS 补丁程序打入即可。

IPS 下载:Final.Fantasy.I+II.Advanced.(GBA)(C).FF1.1HP.Lock.ips

小视频演示锁血 (4 倍速);完整视频

相关实现代码:

's avatar

(GBA) 最终幻想 I+II 无限金币

200% 金币返还;但是需要有原始本金。

支持 D商 汉化版 + 日文原版;欧美版应该不通用吧?

使用 IPS 补丁程序打入即可。

IPS 下载:Final.Fantasy.I+II.Advanced.(GBA)(J)(C).Inf.Gold.Patch.ips

左为 FF1 武器店 右为 FF2 防具店

相关实现代码:

; ------------------------------------------------------------------------------
; 游戏: (GBA) 最终幻想 I+II
; 类型: 无限金币
; 说明: 需要本金,有了本金之后可以实现 200% 返利。
; ------------------------------------------------------------------------------
; 作者: Jixun
; 地址: https://jixun.moe/  --  季寻日志
; ------------------------------------------------------------------------------

.gba

.open "FF1+2.gba", "FF1+2_GOLD.gba", 0x08000000

; ------------------------------------------------------------------------------
; 补丁原始指令 (FF1 的扣钱函数)
; ------------------------------------------------------------------------------
.org 0x0807dd9c
.thumb
  FN_FF1_COST_GOLD_ORIG:
    LDR r3, =FN_FF1_COST_GOLD + 1
    BX r3          ; jmp_thumb FN_FF1_COST_GOLD
    .pool

; ------------------------------------------------------------------------------
; 补丁原始指令 (FF2 的扣钱代码部分)
; ------------------------------------------------------------------------------
; 08178f7c  4a13 ldr r2, [$08178fcc] (=$00004bdf)
; 08178f7e  18bb add r3, r7, r2
; 08178f80  781a ldrb r2, [r3, #0x0]        ; r2 = [r7 + $4bdf]
.org 0x08178f82
.thumb
  FN_FF2_COST_GOLD_ORIG:
    push {r2}        ; 备份 r2 值
    LDR r2, =FN_FF2_COST_GOLD + 1
    BX r2             ; jmp_thumb FN_FF2_COST_GOLD
    .pool

.org 0x08178f8E
  FN_FF2_CONTINUE:

; 08178F7C:  4A13       ldr r2, [$08178FCC]   ; $4bdf
; 08178F7E:  18BB       add r3, r7, r2
; 08178F80:  781A       ldrb r2, [r3, #0]

; 从此处开始放置钩子跳到自己的代码
; 08178F82:  4C13       ldr r4, [$08178FD0]   ; $4bdc
; 08178F84:  1938       add r0, r7, r4
; 08178F86:  8800       ldrh r0, [r0, #0]
; 08178F88:  4342       mul r2, r0            ; r2 = [r7 + $4bdc]*[r7 + $4bdf]

; 08178F8A:  6808       ldr r0, [r1, #0]
; 08178F8C:  1A80       sub r0, r0, r2

; 跳回来到这里
; 08178F8E:  6008       str r0, [r1, #0]      ; [r1] = [r1] - r2


; ------------------------------------------------------------------------------
; 随便找的一段空位
; 此处执行真正的代码。
; ------------------------------------------------------------------------------
.org 0x0881a640
; ------------------------------------------------------------------------------
; FF1 的补丁
; ------------------------------------------------------------------------------
.thumb
  FN_FF1_COST_GOLD:
    ; r0: BASE_ADDR
    ; r1: COST
    push {lr}               ; push [ret addr]

    ldr r3, =$0b84          ; r3 = GOLD_OFFSET
    add r2, r0, r3          ; r2 = 02001ec8 + $0b84 = 2002A4C[GOLD]
    ldr r0, [r2, #0x0]
    add r0, r0, r1          ; r0 = [r2] + r1
    ldr r3, =#999999
    cmp r0, r3              ; if r0 > 999999
  ble FF1_SKIP_RESET_MONEY  ;   goto FF1_SKIP_RESET_MONEY
    mov r0, r3              ; r0 = [DAT_SOME_MONEY]
  FF1_SKIP_RESET_MONEY:
    str r0, [r2, $0]        ; [r2] = r0

    pop {r0}
    bx r0                   ; ret
; ------------------------------------------------------------------------------
; FF2 的补丁
; ------------------------------------------------------------------------------
.thumb
  FN_FF2_COST_GOLD:
    pop {r2}                ; 还原 r2 值
; 08178F82:  4C13       ldr r4, [$08178FD0]
; 08178F84:  1938       add r0, r7, r4
; 08178F86:  8800       ldrh r0, [r0, #0]
; 08178F88:  4342       mul r2, r0          ; r2 = [r7 + $4bdf] * [r7 + $0b84]
    ldr r4, =$4bdc
    add r0, r7, r4
    ldrh r0, [r0, #0x0]   ; r2: COST
    mul r2, r0            ; r2 = r2 * [r7 + $4bdc]

; 08178F8A:  6808       ldr r0, [r1, #0]
; 08178F8C:  1A80       sub r0, r0, r2      ; 
; 08178F8E:  6008       str r0, [r1, #0]    ; [r1] = [r1] - r2
    ldr r0, [r1, #0]      ; r0 = [r1]
    add r0, r0, r2        ; r0 += r2

    ; 因为 r2 在之后的代码通过 ldr 赋值了,可以用来随意修改而不必备份
    ldr r2, =#999999      ; 防止数据过大溢出
    cmp r0, r2
  ble FF2_SKIP_RESET_MONEY
    mov r0, r2
  FF2_SKIP_RESET_MONEY:
    ldr r2, =FN_FF2_CONTINUE + 1
    bx r2
.pool
; ------------------------------------------------------------------------------


; ------------------------------------------------------------------------------
.Close
; ------------------------------------------------------------------------------
's avatar

简易 XOR 加解密工具

简简单单…

静态版(static)不需要 VS2010 运行时,但是文件大一些; 非静态版需要运行时,但是文件小一些。

下载:季寻储存

依云's avatar

嗨 Win10,这是我的浏览器

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

因为腾讯的关系,不得不使用 Windows。不是QQ也不是RTX,这次 Wine 帮不上忙了。那好吧,SSD + 16G 内存,跑个 Windows 虚拟机也没多大问题。

但是问题来了:我在虚拟机里每次点击链接,会调用安装于 Windows 上的浏览器来访问。可是我登录了各种工作账号的浏览器在外面的自由世界 Linux 主系统里啊。

办法也好想:来一个远程调用,让 Windows 调用咱自己的程序打开链接,然后咱自己的程序再把链接传给外面的 Linux 就好了。理想是美满的,可是 Windows 里设置默认浏览器并不是写个 .desktop 文件那么简单!

在 Google 上找了半天资料(真的花掉了半天!),最终终于确认,需要设置以下一大堆注册表键,Windows 才会认可咱自己的浏览器:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\RemoteBrowser]
@="RemoteBrowser"

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\RemoteBrowser\Capabilities]
"ApplicationName"="RemoteBrowser"
"ApplicationIcon"="C:\\RemoteBrowser\\launch.exe,0"
"ApplicationDescription"="RemoteBrowser"

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\RemoteBrowser\Capabilities\StartMenu]
"StartMenuInternet"="RemoteBrowser"

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\RemoteBrowser\Capabilities\URLAssociations]
"https"="RemoteBrowserHTML"
"http"="RemoteBrowserHTML"
"ftp"="RemoteBrowserHTML"

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\RemoteBrowser\DefaultIcon]
@="C:\\RemoteBrowser\\launch.exe,0"

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\RemoteBrowser\InstallInfo]
"IconsVisible"=dword:00000001
"ShowIconsCommand"="\"C:\\RemoteBrowser\\launch.exe\" --show-icons"
"HideIconsCommand"="\"C:\\RemoteBrowser\\launch.exe\" --hide-icons"
"ReinstallCommand"="\"C:\\RemoteBrowser\\launch.exe\" --make-default-browser"

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\RemoteBrowser\shell]

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\RemoteBrowser\shell\open]

[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\RemoteBrowser\shell\open\command]
@="\"C:\\RemoteBrowser\\launch.exe\" \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplications]
"RemoteBrowser"="SOFTWARE\\Clients\\StartMenuInternet\\RemoteBrowser\\Capabilities"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice]
"Progid"="RemoteBrowserHTML"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice]
"Progid"="RemoteBrowserHTML"

[HKEY_CLASSES_ROOT\RemoteBrowserHTML]
@="RemoteBrowser"
"FriendlyTypeName"="RemoteBrowser"
"URL Protocol"=""
"EditFlags"=dword:00000002

[HKEY_CLASSES_ROOT\RemoteBrowserHTML\DefaultIcon]
@="C:\\RemoteBrowser\\launch.exe,0"

[HKEY_CLASSES_ROOT\RemoteBrowserHTML\shell]
@="open"

[HKEY_CLASSES_ROOT\RemoteBrowserHTML\shell\open]

[HKEY_CLASSES_ROOT\RemoteBrowserHTML\shell\open\command]
@="\"C:\\RemoteBrowser\\launch.exe\" \"%1\""

相比之下 Linux 只需要以下这么几行:

Version=1.0
Name=Firefox
GenericName=Web Browser
Comment=Browse the Web
Exec=/usr/lib/firefox/firefox %u
Icon=firefox
Terminal=false
Type=Application
MimeType=text/html;text/xml;application/xhtml+xml;application/vnd.mozilla.xul+xml;text/mml;x-scheme-handler/http;x-scheme-handler/https;
StartupNotify=true
StartupWMClass=Firefox
Categories=Network;WebBrowser;
Keywords=web;browser;internet;

(不过真实的 firefox.desktop 有三百多行,因为各种语言的名字和描述的翻译。)

上边那个注册表文件,引用了一个 exe 文件,和里边的一个图标资源。我不知道图标使用独立的文件可不可以。加个图标并不难,上网搜一下就有了,使用 windres 命令即可。

首先准备好图标文件 icon.ico,然后写一个资源文件:

1 ICON DISCARDABLE "icon.ico"

用 windres 把它编译成 COFF 文件。因为我是在 Linux 上使用 mingw 操作,所以使用的命令叫 x86_64-w64-mingw32-windres。然后把它和其它目标文件链接到一起就可以了。因为我使用的是 Rust,它的 build.rs 脚本不支持目标文件,所以先打包成静态库,然后再链接:

x86_64-w64-mingw32-windres launch.rc -O coff -o icon.res
x86_64-w64-mingw32-ar q libres.a icon.res

然后 build.rs 脚本里说一下:

fn main() {
  println!("cargo:rustc-link-search=native=..");
  println!("cargo:rustc-link-lib=static=res");
}

然后咱的主程序,通过 TCP 把链接发到 Linux,以及 Linux 端的服务,接收链接并打开浏览器,因为很简单很常规,所以这里就不列出来了。有兴趣的去源码仓库看就好了。

exe 编译好之后,扔到之前注册表文件里提及的地方就好。然后双击那个注册表文件将其导入。接下来在默认软件的设置里就能够找到我们的「Remote Browser」了(虽然不知道为什么没有显示指定的名字,而是 exe 文件名)。

另外,那个图标资源,也可以使用 Resource Hacker 把图标文件给弄到 exe 文件里边去。

最后一步,写个用户级的 systemd 服务,把负责在浏览器里打开链接的程序给跑起来~


仓库地址在此。喜欢的话,记得 star 哦~

's avatar

2018 年对 IE 8 的支持?

最近我在填一个面向其它企业客户的、浏览者基本上是非 geek 的企业网站的坑。起初我的效率很低,因为很多心思都花在了对 IE 8 的支持(担心还有使用 Windows XP 的浏览者,我就差激动的给 IE 6 也做支持了),但经过对很多类似企业网站和目标访客类型的考察,发现了一些共同点:

  • 很多支持 IE 8 甚至是 6 的企业网站,其实设计风格、框架等等本身就比较陈旧,并没有使用任何 HTML5 的特性,在现代浏览器上也不会有更好的体验。
  • 很多近年来设计的企业网站都用上了若干 CSS3 的特性,并且没有提供 IE 8 的 Polyfill。
  • 很多近年来设计的企业网站都针对旧版 IE 增加了升级浏览器的建议提醒。
// 针对 Windows 7 / 8 用户
var isWindows7 = navigator.userAgent.indexOf("Windows NT 6.1") !== -1;
var isWindows8 = navigator.userAgent.indexOf("Windows NT 6.2") !== -1
    && navigator.userAgent.indexOf("Windows NT 6.3") !== -1;

var bannerHTML = '<div id="ie-sucks">'
    + '你使用的浏览器版本过低,当前网页已经 <strong>不再支持</strong>。为了正常的访问,请考虑更换其它浏览器:<br>'
    + '<a href="http://se.360.cn/" target="_blank">360 安全浏览器</a>'
    + '<a href="http://browser.qq.com/" target="_blank">QQ 浏览器</a>'
    + '<a href="http://pc.uc.cn/" target="_blank">UC 浏览器</a>'
    + '<a href="https://ie.sogou.com/" target="_blank">搜狗浏览器</a>';

if (isWindows7) {
    bannerHTML += '<a href="https://www.microsoft.com/zh-cn/download/internet-explorer-11-for-windows-7-details.aspx" target="_blank">IE 11 浏览器</a>';
}
if (isWindows8) {
    bannerHTML += '<a href="https://www.microsoft.com/zh-cn/download/details.aspx?id=40854" target="_blank">IE 11 浏览器</a>';
}
document.write(bannerHTML + '</div>');

(我知道你们会说为什么不推荐 Chrome 或 FireFox 什么的啊,因为这网站面对的是非 geek,用那种浏览器会让他们窒息的)

  • 大量国内用户用着 Chromium 核心的国产浏览器,比如这个企业的老板用的就是 360 安全浏览器。
    虽然我并不喜欢这些套壳国产浏览器,但是它们为一般的国内访客提供了具有较为现代的 Chromium 内核的浏览器,还支持 Windows XP(Chrome 49、FireFox 52 以后就不再支持了),极大减少了前端开发者的负担,其实还是大快人心的(
  • IE 已经被 Edge 取代,它的市场占有也在全球范围大幅萎缩。
  • 我没有理由支持一个近十年以前的古董。

所以,后来我删除了那些奇怪的 IE 8 Hack,大胆使用了一些属于 HTML 5 的新特性,目前的目标改为了保证在 IE 11 和四大国产浏览器正常显示。

至于你的项目是否需要有古董 IE 版本支持,当然是要看项目需求的,某些情况下你还是要努力搞些 Hack 的(曾经听说过有菊苣在近几年接过需要支持 IE 5 的项目)。不过对于面向大众的网站,我想大胆用一些 HTML 5 特性且不带 Polyfill 应该没啥问题。

(2018 年 2 月更新:原来淘宝早就连 IE8 都不支持了。嗯

IceHoney Blog's avatar

JavaScript中的数据类型

隔了一个月,我又来发博客了。最近的工作老是在写CSS和HTML。但是我更想学习JS啊!我一直都觉得HTML和CSS是属于设计范畴的,而JS才是真正属于工程师的逻辑范畴。 况且最近Github上有一个神奇的项目Screenshot-to-code-in-Keras可以把截图直接生成HTML代码,我觉得只是单纯的从PSD翻译成页面的工作迟早要被淘汰。

最近在读You Don't Know JS这本书。书上讲解了很多关于JS的细节知识,对于深入了解JS有很大帮助。所以想在读的过程中把一些觉得有意思的东西记下来,便于以后复习。

类型

JavaScript中有七种内置类型:

  1. 空值(null)
  2. 未定义(undefined)
  3. 布尔值(boolean)
  4. 数字(number)
  5. 字符串(string)
  6. 对象(object)
  7. 符号(symbol, ES6新增)

除了对象之外,通称基本类型。

JavaScript中的设计BUG

typeof null === "object"; // true

正确的返回结果应该是null。但这个BUG由来已久,修复反而会出问题。所以我们需要使用复合条件来判断:

(!a && typeof a === "object")

接下来是NaN的问题:

var a = 2 / "foo";
var b = "foo";
a; // NaN
b; "foo"
window.isNaN( a ); // true
window.isNaN( b ); // true
NaN === NaN // false

很显然"foo"不是NaN,但显然它也不是数字。这个BUG也存在很久了,在ES6时代,我们可以使用Number.isNaN来解决。 ES6之前的polyfill是:

if (!Number.isNaN) {
  Number.isNaN = function(n) {
    return (
      typeof n === "number" &&
      window.isNaN(n)
    );
  };
}

并且NaN是JS中唯一一个不等于自身的值。

值和类型

JavaScript中的变量是没有类型的,只有值才有。变量可以随时持有任何类型的值。

undefined 和 undeclared. 变量在未持有的时候为undefined, 此时typeof 返回 undefined. 大多数开发者倾向于将 undefined 等同于 undeclared(未声明),但在 JavaScript 中它们完全是两回事。已在作用域中声明但还没有赋值的变量,是 undefined 的。相反,还没有在作用域中声明过的变量,是 undeclared 的。

var a;
a; // undefined
b; // ReferenceError: b is not defined
typeof a; // "undefined"
typeof b; // "undefined"

虽然b 是一个 undeclared 变量,但 typeof b 并没有报错。这是因为 typeof 有一个特殊的安全防范机制。防止因为未定义导致程序终止运行。

值和引用

在许多编程语言中,赋值和参数传递可以通过值复制(value-copy)或者引用复制(reference-copy)来完成,这取决与我们使用什么语法。但是JavaScript 对值和引用的赋值 / 传递在语法上没有区别,完全根据值的类型来决定。

简单值(即标量基本类型值,scalar primitive)总是通过值复制的方式来赋值/传递,包括null 、 undefined 、字符串、数字、布尔和 ES6 中的 symbol 。

复合值(compound value)——对象(包括数组和封装对象)和函数,则总是通过引用复制的方式来赋值/传递。由于引用指向的是值本身而非变量,所以一个引用无法更改另一个引用的指向。

var a
var b
a; //
b; //
= [1,2,3];
= a;
[1,2,3]
[1,2,3]
// 然后
b = [4,5,6];
a; // [1,2,3]
b; // [4,5,6]

b=[4,5,6] 并不影响 a 指向值 [1,2,3] ,除非 b 不是指向数组的引用,而是指向 a 的指针,但在 JavaScript 中不存在这种情况!

参考:

You Don't Know JS

神楽坂伊織's avatar

俺说游戏EP09:Feel True Power!

《俺说游戏》回来啦!
2018年的《俺说》和《俺说游戏》将会有更多变化,敬请期待!
今天来聊聊世代最强主机——Xbox One X!
更有好书推荐!
欢迎收听!
Fenking's avatar

至我还未过去的2017

今天是2017年13月14日。
今年还没有过去,我姑且说它是上半年过完了,接下来是2017年的下半年吧,
就像口袋妖怪金银篇里一样城都完了关东地区同样是主线。
如果说为什么还是2017年
我想这一年大概什么都没获得吧。
每一次被告知的结果都是没有想象的好,但实际上都是相当绝望的答复。
每一次得到都是为接下来的得而复失作预告。
那些付出了生命一部分的努力们,什么都没有回报于我。
那些过去的美好一瞬间付之东流,那些过去的轻松转瞬间化为生活的淤泥和沼泽
深深陷住我的腿脚,我每一步都在为了活命而抗争。
我大概糟了什么罪,好像事与愿违。
一张张书写着绝望与愤慨的报告单和检查表、
一句句传达着操劳与表面的劝言和心里话、
一个个好似无知而又不断获取着身边一切;控制着它们的身影、
一堆堆视野之外的传达不到的话题与论点。
我像一个只留下了某些事物的半文盲,在半懂或懂的境界里徘徊,
看着身边的一步步前进,询问自己是否做出了内心的选择。
既然选择了去实现梦想,那是否要从一无所有开始?
还是说你并非一无所有,你脚下充满了那些其他人看不见的绊脚石?
我的2017还没有结束。他暂时不会结束的。
人们总说我年轻力壮,总说我能有什么病——年轻人怎么会有病?
我年轻,我希望我力壮,我不指望我没病,但我希望就算是病,也不是我一个人。
从2016年的8月开始,我走上了一个人的道路。我觉得我没有高一高二那么成熟有力了。
当年的我可以很自豪,很有力量地向周围默默传输我的能量,让他们知道我是谁;
可那之后的我,命运开始偏移,我的力量只能放在自己的心里,慢慢腐烂。
一气之下写了这么多的废话。
曾经很希望博客是私人的领地,愿观者自能观望。曾经也希望博客是那些“我们”的露营地,大家互相看着对方的未来。
如今的我希望,走在不同道路上的人即时看到了,也能欣慰地接受该多好。
希望我的2017,只有短短26个月。
2017 下半年快乐。
及时我笑不出来,哭不出来,我也希望能平静地活下去,活下去。
怒伤肝,思伤肝,愁伤肝。如果我是个暮年的老人,一生饱满,多好。
下半年,已经不会在去追求那些无关紧要的事物了,我只希望:健康,学业,知识。
2017年13月14日。今天的日期不错。

Cee's avatar

Oh My 2017

Summary

合縁奇縁 一期一会

Moments

1 在箱根,第一次泡温泉

2 在杭州见了 61,聊了独立开发

3 渡鸦被百度收购

3 有学上了

4工藤去了趟香港

4 香港回来的第二天骑摩拜摔断了腿

5 深圳,@Swift Conf,当了次主持

5 辞职回家

6 美国面签

7 补牙

8 ✈️ 去大美帝

9 拿到了新泽西驾照

10 万圣节

11 北美音游群聚会

12 无尽的作业和大作业

12 暴雪

12 决战 C93

Input & Output

+ iPad Pro 10.5-inch (Silver)

- Sony Z5 Dual (E6683)

+ Sony WI-1000X (Black)

+ iPhone X (Space Gray)

- iPhone 7 Plus (Jet Black)

Numbers

  • 7,481 photos
  • 4 posts
  • 2,535 twitter followers
  • 632 instagram followers
  • 6 books
  • 178 contributions (only on GitHub)
  • Maybe… almost wrote PHP & Java in this year

Hall of Fame

The Next

  • 找到一个好点的 Intern
  • 多写一点 Side Project(17 年基本没怎么写)
  • 努力找到另一半😘
's avatar

100% Orange Juice - 资源解包工具 v1.1

支持 XP 或以上的操作系统。

支持类型:

  • .dat 解密
  • 伪装为 ZIP 压缩包,内部包含后缀名为 .dat 的加密文件 (如 animation.pak)
  • 将合并后的 ogg 拆分成单独的文件 (如 bgm.pak)
  • 将合并后的 wav 拆分成单独的文件 (如 se.pak)

调用参数

OrangeDecryptor <输入文件> <输出路径/目录> [模式]

不带模式的话,将尝试自动识别。

下载

季寻储存 | 历史版本

更新记录

v1.1: 增加 XP 下运行的支持。

's avatar

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

更新 2.7

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

没有新增功能,仅修复了游戏版本更新带来的兼容性问题,以及测试时发现的一些小问题:

  • 先选择功能,然后点击「寻找游戏」会导致修改器崩溃的错误。
  • 默认界面字体修改为雅黑细体。

100% Orange Juice 修改器


另外在测试的时候发现可以分身,以下是演示视频 (马赛克版本,标清点我):

您的浏览器不支持在线播放,请下载后观看。

h404bi's avatar

推特背后的 Notch 之道

公众最近已较少听到著名游戏 Minecraft 的创造者“马库斯·佩尔松”相关的消息。在出售了 Mojang 与购买 7000 万美元贝弗利山庄巨型豪宅之后,他曾接受过一些采访,但自那以后他一直都很沉默
's avatar

再见 2017,你好 2018

又是新的一年,今年也请各位多多关照了。

今年发生了很多争议性的事件,不管国内还是国外。希望新的一年更加安稳吧。

是时候公开一波今年的坑了:


开新坑:

  • 网易云音乐非官方客户端 - for Chrome
  • Enhanced dnvod.tv (多瑙去广告与优化)
  • 赞助墙
  • 各类单机游戏修改器 / ct 修改表

网易云的第三方客户端项目其实年前就开始了。起因是在 ChromeBook 直接用网页版发现很多 API 已经不能用了。不过开发进度缓慢,现都还是 α 阶段(功能缺失)。

多瑙最初只是得知同学嫌弃网页上的广告做的去广告脚本。之后也跟着跟新了下其他的功能,与运维斗智斗勇。但是因为用户脚本的局限性,部分功能无法实现。于是想做成扩展程序来实现。

目前没多少人赞助,感觉「赞助墙」这个项目要无限期延后了。可能因为我只收 PayPal?之后可以尝试开个 Patreon 试试水。


继续维护:

  • 网易云音乐反代服务器
  • 维护部分用户脚本。

服务器续了一年,至少到今年结束之前为止不用担心。

用户脚本对我来说是一个很锻炼的开发方案,因为:

一、能在不考虑大多数兼容性问题的前提下尽可能的利用新的前端特性。
二、和网站斗智斗勇,感觉运维可能不太喜欢我… 还是尽量别太过分吧。 三、我编不下去了


放弃维护:

  • 针对多站实行特殊处理的用户脚本
  • 过气游戏 RabiRibi 游戏修改器的更新?
  • 其他很久没有动过了的东西…

针对性维护的成本太大。

每隔一段时间就会出现新的一批,也会死掉一批网站。

从当初「只是为了解除脚本针对 Opera 浏览器上执行的限制」到后来的巨无霸… 感觉已经越走越偏了 哈哈。

RabiRibi 这个游戏刚出的时候也玩得挺开心,因为手残的原因(或之一?)就打算做个修改器了。

开始的时候也就小圈子里在用,然后就放了出来。然后游戏开始经常小更新,但不知为何每次都会修改主程序,找到的地址都会随着游戏更新而失效。

于是找到了个对抗方法 - 特征码搜索。虽然小更新不断,但是基本上只要不是特大更新修改器都能直接用。一直到上次发现失效,拖延到现在都没更新。

新的一年又迷上了新的游戏,可能对兔子🐰修改器的更新也就到此为止了吧?有时间会把源代码放出来做个了断 - 因为当初没想着开源,代码写得很乱。


最后,各位看官,祝大家新年快乐!

lwl12's avatar

Bye 2017, Hi 2018

CE2018,LWL 的自由天空,雷达已识别,上升到高度层 1514736000。






- EOF -

brainbush's avatar

咸鱼2017

嗯,2017年就这样过去了。当了一年咸鱼……


今年只剁手了个27UD68,别的支出好像都拿去买书和给学校垫钱了的样子。

脚踏实地,勿忘初心。

和三年前想法差不多呢……(反正目标好像没变)

还是单身

Phoenix Nemo's avatar

自托管的在线协作翻译平台 Weblate

起因:Transifex 这货闭源一段时间后突然开始抢钱了。

正巧一堆开源项目需要一个在线协作的翻译平台,于是测试了几个比较知名的开源程序。一遍折腾下来,发现 Weblate 可以最大化满足要求。顺便提一句,Weblate 也是有 hosted 付费服务的,但是在预算内的源字符串等限制依旧太多,所以选择使用他们的源码来搭建一套。

以及:我讨厌 Docker。

via these people and places