关于 HeYSH | 贺叶霜

博客名:林中阴影。分享一些智能设备的使用体验。

RSS 地址: https://blog.heysh.xyz/feed.xml

请复制 RSS 到你的阅读器,或快速订阅到 :

HeYSH | 贺叶霜 RSS 预览

旧手机做RDP客户端的一些尝试

2024-08-28 22:06:45

这样的话旧手机就可以作为瘦客户机用了,而且自带4G模块。

不要问为什么,工作造就人呀。

一些矿渣的耗电量

2023-08-10 20:35:54

最近在小黄鱼上淘到一个支持电量统计的插排(这个),卖家还贴心地刷好了ESPHome固件。

数据就不标了,有兴趣的可以自行使用Engauge Digitizer

于是我用Excel算好了:

功率/W 年功耗/kWh
插座 3.8 33.288
我家云 5.4 47.304
锐角云 4.7 41.172
蜗牛星际 40.8 357.408

顺便一提,我家今年的耗电量长这样。这才仅仅是8月而已……

OK,当我今天没有更新过。

穷人的IP-KVM远程访问

2023-05-20 16:06:47

说起DIY的IP-KVM,当然是PiKVM以及一系列衍生项目,可是对于那些把钱投入庞氏骗局的穷人来说,RPI4已经远不能称为inexpensive。近几天,我从垃圾堆里翻出了同样昂贵的Phicomm N1和一张30块的视频采集卡,发现正好也能用。

有较强的自我管理意识.png

有较强的自我管理意识.png

把远程控制取名叫作IP-KVM,这对于SEO来说过于不友好了。每当搜索Google的时候,总会看到有人试图在N1上跑虚拟化(aka KVM),可能是对2G内存有些什么不切实际的幻想。最后,在GitHub上找到了在N1上安装PiKVM的脚本:toss-a/pikvm-armbian。不过这里的说明也稍微有些简略,我会努力稍微详细一点点,尽量。

那么,需要准备下面这些东西:

  1. N1一台;

    我的N1是从垃圾堆里捡回来的,如果是新购的话,应该会有一些更新、更好的选择。注意,这些选择需要能够OTG。

  2. USB公对公数据线一条;

    因为N1的USB口有OTG功能,直接连接被控电脑就可以模拟鼠标和键盘。

  3. 视频采集卡一张,配HDMI线一条;

    因为N1没有USB3.0接口,MS2109芯片就足够了,可以跑1080p@30Hz。 大概长这样:

  4. U盘一块;
  5. Linux知识一些;
  6. 可能会需要:
    1. USB键盘一个;
    2. USB延长线一条;
    3. 理想的上网环境。

      根据相关法律法规和政策(下略)

不需要准备Arduino、BadUSB、USB Rubber Ducky,或者其他的单片机,虽然我的垃圾堆里也有不少。

安装系统:Armbian(Ubuntu口味的)

这部分已经有很多人写过了,大概步骤是降级—BalenaEcther镜像写入U盘—Armbian写入EMMC。可以参考GitHub说明其他人的博客或者B站。要注意,在盒子的原始系统尚未关机时不要插入U盘,Android系统会破坏U盘文件的权限。

Armbian镜像我使用的是Armbian_23.05.0_amlogic_s905d_jammy_6.1.27_server_2023.05.13.img.gz,其中,S905d是N1所用的芯片,Jammy是Ubuntu的版本号,6.1.27代表使用的是最新版本的Linux内核。如果安装PiKVM,Debian系列(bullseye)的软件包有些太老了。

修改dtb文件

好,到这里时,我会假设:N1已经刷成了Ubuntu风味的Armbian系统;连接好网络,有线无线都可以;能够输入命令——不管是直接插键盘显示器,或是通过SSH,还是直接从电路板上引出导线。

在上述的Armbian引导文件中,默认的USB模式是Host,为了模拟鼠标、键盘等设备,需要将dr_modehost更改为peripheral1。那么,我们需要重新编译dtb文件:

# 将dtb编译为dts文件
dtc -I dtb -O dts -o test.dts /boot/dtb/amlogic/meson-gxl-s905d-phicomm-n1.dtb
# 用你喜欢的编辑器打开这个文件
vim test.dts

test.dts中搜索dr_mode,寻找首个dr_mode = "host";,改为dr_mode = "peripheral";。 这里的上下文大概是这样: 注意红字位置 后面的dr_mode不必修改。不要问我为什么,这部分超出了我的能力。之后重新把dts编译回去,移动到/boot/dtb/amlogic/,并且修改启动项:

dtc -I dts -O dtb -o n1-test.dtb test.dts
sudo mv n1-test.dtb /boot/dtb/amlogic/
sudo vim /boot/uEnv.txt

FDT一行改为FDT=/dtb/amlogic/n1-test.dtb最近觉得carbon.now.sh还挺棒哒

然后重启系统。

安装脚本

此时,假设你能够透明地访问github和其他网站,curl google.com返回302或者200。如果不行的话,可以尝试在N1上安装zfl9/ss-tproxy,让N1同时承担旁路网关的功能。

git clone https://github.com/toss-a/pikvm-armbian.git
cd pikvm-armbian
./install.sh

在提示"Do you want to apply custom patches? [y/n] "时,选择N。

接下来,重启系统,再次运行install.sh,然后关机。

连线和启动

N1靠近HDMI接口的USB口已经改为OTG从机模式,把双公头USB线插在这里,另一头插到被控计算机上。这时候,如果视频采集卡插不上的话,拿出提前准备好的延长线。下面的照片来自这里,照相技术牛逼疯了。

牛逼疯了!

重新插入电源,用随便的浏览器访问N1的IP地址,并忽略证书错误提示。初始用户名和密码都是admin,别忘了修改登录密码,用sudo kvmd-htpasswd set admin

另外,感谢pikvm项目,有钱的话就去支持他们的硬件吧!


  1. Ref:README,这个写的其实挺清楚的,比我的好。 ↩︎

内网访问第三季:在运营商的CGNAT网络下

2023-05-10 21:05:13

是的,在这次这次之后,在酒店里百无聊赖的现在,我又开始折腾起VPN来了。

是的,在酒店里仍然没有IPv6地址。

为什么

正如前文所述,无论是Tailscale/Headscale、Nebula或Netmaker,原理均大同小异,都是在Wireguard基础上,用类STUN协议来穿越NAT,或利用TURN(DERP)服务器进行转发。在国内家庭宽带网络环境下,一般存在路由器、光猫、运营商三重NAT防火墙,STUN需要跨越多重阻碍,自动穿越希望渺茫;另一方面,公开转发服务多在国外,延迟高居不下,而国内私有云价格亦是高不可攀,自建服务并非经济的选择。

然而,三重NAT也并非坚不可摧。光猫一级,只要改为桥接,便可迎刃而解;路由一级,可以通过端口映射来绕过;而运营商级多为NAT1,通过Natternatmap,可以获得近似公网的效果。这样,使用纯粹的Wireguard,也能够直接回到家庭网络内部,免去国外中转的烦恼。

从广东联通到北京联通。

从广东联通到北京联通。

从广东联通经北京联通到甘肃移动。个人觉得,在这种延迟下追求Full Mesh也不再重要了。

从广东联通经北京联通到甘肃移动。个人觉得,在这种延迟下追求Full Mesh也不再重要了。

怎么做

在开始之前,首先检查是否满足以下要求:

  1. 一台长期开启的设备。

    既然有远程访问的要求,远处有一台服务器是很自然的吧。

  2. 光猫处于桥接状态。
  3. 主路由是OpenWRT,或者内网里有DMZ主机。

    或者,你是端口转发专家,可以从光猫外侧一路转发到最内部。

  4. 没有公网IPv4,但在路由器处测试NAT类型为NAT1。

    这里可以用Natter自带的功能来测试。如果你有公网IPv4的话,直接打开端口就好,而且我会很羡慕你。

  5. 一个自己的域名,最好是在Cloudflare上托管的。

    需要DDNS功能实时更新域名。如果没有域名的话,可能需要一些别的手段来实时得到端口。

具体配置部分已经有人写的很详细了。首先按照WireGuard Point to Site Configuration设置点到站点的连接,然后按照natmap Wiki设置NATMap即可。注意,在路由器上操作的时候,一定要记得在防火墙中打开对应端口

完成以上步骤之后,应该已经可以从移动网络访问内网的Wireguard Peer了。

一点问题

由于运营商网关不受我们控制,外网的IP和端口号都是随机分配的,每当地址变化时,NATMap将执行自定义脚本。在上面的Wiki中,利用DDNS,把IPv4地址和端口编码进IPv6的AAAA记录中。这并不是一种标准的技术,不过既然2001::就是给teredo使用的,在这里随便用用也无所谓。

对于Windows下的Wireguard客户端,我(和ChatGPT一起)写了一个PowerShell脚本,能够自动修改配置文件的Endpoint并调用wireguard.exe进行连接。

使用方法:

  1. 安装wireguard-windows,用客户端连接测试成功。
  2. 在文件夹C:\example下建立wg.ps1nat.conf,粘贴Gist内容。
  3. 按照实际情况修改nat.conf,以及wg.ps1$Hostname部分。Endpoint不必修改。
  4. 以管理员身份运行PowerShell
  5. 设置ps1脚本运行权限:Set-ExecutionPolicy RemoteSigned(或Unrestricted)
  6. 启动、重启Wireguard:C:\example\wg.ps1 -up
  7. 停止Wireguard:C:\example\wg.ps1 -down

在Windows 11, Powershell 5.1.22621.963测试通过,也可以配合Windows下的sudo使用。

另外,在Android下,也可以用termux运行nm-echo.sh来获得IP地址,手动修改Wireguard官方客户端中的IP。甚至,可以使用你喜欢的代理客户端(比如NB4A),配置好Wireguard Outbond和路由就可以了~

我这里最近一次分配的端口坚持了18天,所以应该不必时常刷新。

我这里最近一次分配的端口坚持了18天,所以应该不必时常刷新。

如果需要更为稳定的访问,可以参考reresolve-dns.ps1,这个脚本可以在上一次握手时间过久时刷新DNS,但是因为要添加计划任务,有一点过于复杂了。

Bonus

Natmap的另一种用法是映射BT客户端,从而使外来连接能够主动发起连接,获得所谓的High ID。见wits-fe/bittorrent-NAT-hole-punching。在PT站做种的时候应该会很有用。

附:性能测试

随便找了一个公共WiFi,用手机(一加7T)上Termux中的iperf3测速。

由于多层NAT的限制,Nebula类组网工具必须部署在路由器位置。可以看出,对路由器(万元级,K3)带来的压力还是比较大的。

WireGuard for Android

WireGuard for Android

NB4A提供的Wireguard Outbound

NB4A提供的Wireguard Outbound

Nebula,对端部署在路由器上

Nebula,对端部署在路由器上

很难想象,对于访问内网这样一个简单的需求,我居然花费了如此多的精力。不过,这次应该算是当前比较满意的方案,应该能坚持到下次水逆开始。

“智能”家居笔记,其之二

2023-03-08 21:32:06

书接上文。说起来,智能家居的可复制性在软件领域里是比较差的,在完成基础的环境搭建之后,功能需求要根据自己的实际情况来决定,以下的所有内容仅供抛砖引玉之用。

前端显示

隆重推荐Dwains dashboard,这是在HA生态系统下仅有的不怎么需要折腾的部分。只需要把每个设备的区域选好,就可以得到一组还不错的面板:

Dwains dashboard

Floorplan是另一个极端,这个组件需要很久——非常久——才能够完成,而完成之后也只有无尽的空虚。为了缓解这空虚我也姑且把截图放在这里。

Floorplan

手机消息提醒

作为没有统一推送服务的安卓用户,加入新的后台程序无异于火上浇油,所以最经济的方法是投靠大流氓微信。之前互联网上常见的方法是企业微信发送应用消息,不过到了2023年,这种方式需要绑定固定IP和域名,所以我换成了企业微信机器人。这种方法需要有一个微信群(两人以上),对单身贵族不是十分友好。

在获得Webhook地址之后,在HA配置文件中添加以下行:

# configuration.yaml
rest_command:
 wechat_message:
 url: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=略"
 method: post
 content_type: 'application/json'
 payload: '{"msgtype":"text","text":{"content":"{{ message }}"}}'

就可以在自动化中Call a service,调用wechat_message了。

另外,可以试试showdoc推送服务。我没用过,不对这个负责。

或者直接想办法给微信绑定的QQ邮箱发信,反正他们信用卡诈骗邮件都是这么干的。

推送的非常及时

或者直接用Home Assistant自带的HTML5 Push Notifications;或者TG机器人;或者自建ntfy.sh——反正都很复杂。

开关其他计算机

当前,因为不想和国家电网签约,我在平时保持台式机和NAS处于关闭状态,只在需要时通过HA所在的矿渣来Wake on LAN

开机问题解决了,关闭需要另外的解决方式。对于Windows系统,可以使用IOT Link;而对于更常用的Linux系统,可以使用SSH来运行shutdown。仍然是HA配置文件:

#configuration.yaml
switch:
 - platform: wake_on_lan
 name: Trashbin
 mac: 00:00:00:00:00:00
 host: 192.168.8.88 #用ping来检测是否已开机
 turn_off:
 service: shell_command.turn_off_trashbin
shell_command:
 turn_off_trashbin: "ssh -i /config/ssh_keys/id_rsa_homeassistant -o 'StrictHostKeyChecking=no' [email protected] 'sudo /usr/bin/systemctl poweroff'"

别忘了把私钥放在/config/ssh_keys/id_rsa_homeassistant,并上传公钥。在authorized_keys中动些手脚,可以限制SSH允许执行的命令。另外,需要设置sudo在运行poweroff时不需要密码。

## sudo visudo
%sudo ALL=(ALL) NOPASSWD: /usr/bin/systemctl poweroff

远程访问

之前这篇文章就是为了这个。

在家检测

又名device tracker,与路由器有关,我用了OpenWrt (luci)集成。独居的话,BLE门锁也能完成类似的工作。控制欲更强的朋友可以尝试ESPresense,应该是能到房间级别。

零冷水

如果你像我家一样,燃气热水器/壁挂炉离浴室太远,需要一套零冷水系统,那么首先需要把回水管留好。然后……最好能搞点成品系统,不要像我一样用屏蔽泵和智能开关解决,毕竟这玩意还是有一定难度的。

设计水路和买接头全要靠自己了。

设计水路和买接头全要靠自己了。

弄完之后,把水泵插在智能插座上,在卫生间安装人体传感器,每当卫生间有人经过的时候就运行半小时。

没有预留回水管的话可以参考这里

自适应照明

……感觉很高级,没了。

监控摄像

为了照料人类幼崽,我买了3个摄像头,是广受好评的TP-link系列1,ONVIF协议除了端口是:2020之外和标准一模一样,也自然支持HA的ONVIF集成。

因为正好有一台杂牌NAS,硬盘录像机的钱可以省掉了。NVR软件方面,我尝试了Shinobi.video2motioneye3,最后选了iSpy公司的Agent DVR,设置最简单,也具有最完善的HA集成,抱歉啦开源社区。

附:当前用到的自动化

暂时我还没搞懂NodeRED是干什么用的,看起来pyscript还更有趣一些。


  1. 型号是TL-IPC44AW Pro,那个Pro让它多了5G wifi支持。 ↩︎

  2. 不太支持H.265格式的录制,实时播放老有问题,而且没搞懂HA集成怎么用。 ↩︎

  3. 这个我没仔细试,祝你成功! ↩︎

“智能”家居笔记,其之一

2023-02-10 20:44:06

而RK3328的算力与草履虫大约能打成平手。所以,本文中的“智能”指的都是 不用按电钮就能控制™ 级别,当然,如果能够有一点点自动就更好了。

前期的准备

考虑一下

其实当个mi boy也不错——全屋小米设备是智能家居方案里面最不坏的选择,做完就可以成为合格的家居up主了1。不过,如果不想被锁定在米系势力范围内,可以尝试一下Home Assistant,尝试成本也不高:几十块钱的魔百盒或者玩客云,或者直接虚拟机都可以。另外,最好能有一个简单的设备来控制,我觉得带红外遥控的小爱音箱 Pro就挺好的。

装修时

当然是老生常谈的那些:在开关里面留零线、不要做双控(贵)、多做网线口、窗帘盒旁边做插座之类的,剩下的事情只能等到装完以后再后悔了。

就我来说,我比较后悔没有给拖地机器人留上下水的位置,没有把净水器的纯水管引到客厅,也没有留两个给摄像头和人体存在传感器的插座。

新手的采购清单

最好能够遵循 Graceful degradation 原则:保证有东西坏掉的时候至少还是个mi boy,然后就可以把所有问题推到米家服务器身上了。另一方面,如果要在熟练后彻底摆脱米家的控制,需要寻找那些离线仍然可以通过HA控制的设备,也就是说,最好不要选择米家臭名昭著的最新的BLE Mesh系列。那么,在2022年,我的选择是大量的Zigbee设备、少量的Wifi设备和更少的蓝牙设备。Nothing Matter.

下面是米系智能设备的列表,截至2022年。盛惠5527元。

设备 数量
墙壁开关E1(零火双键) 10
Aqara双色温LED灯泡T1 6
Aqara智能墙壁插座Zigbee 1
Aqara水浸传感器 2
Aqara人体传感器 2
Aqara门窗传感器 1
Aqara温湿度传感器 1
yeelight m3筒灯(BLE) 1
米家第三方壁灯(BLE) 2
米家客厅吸顶灯 1
米家卧室吸顶灯450 1
米家卧室吸顶灯350 2
杜亚M2米家款电机(Aqara的买不起) 3
门锁1s(BLE) 1
小米多模网关 1

Aqara在闲鱼买会显得不那么冤大头,杜亚牌电机也比杜亚代工的Aqara电机便宜很多。家电方面,美的和其副牌(小天鹅、华凌、colmo之类)一般自带网络功能,通过插件midea_ac_lan和HA配合的很不错。

美的营销号矩阵

美的营销号矩阵

对了,还需要一台能够24小时开机的设备,比如NAS啊、矿渣啊什么的。

安装和设置

安装HA的部分在此不再赘述。通过米家APP配置以上的所有设备,并使用hass-xiaomi-miotXiaomiGateway3导入HA。这里需要注意的是,hass-xiaomi-miot集成只能对WiFi设备进行本地控制,对Zigbee和BLE设备需要通过米家服务器。所以最好由gateway3控制这些设备,在hass-xiaomi-miot集成中禁用。

考虑到安装非智能灯的可能性,我采用了智能开关+智能灯的组合,这种组合更为保守,凌动开关+支持凌动的智能灯效果大概会更好。在把所有智能灯配置完成后,在米家APP上把链接智能灯的开关转为无线开关,然后在HA中设置自动化,感觉比米家自动化的反应更灵敏一些。不过,为了防止在HA断掉时挨骂,我也在米家APP上添加了备份:在同时按下开关左右键的时候关闭智能灯。

HA和米家设置自动化

HA和米家设置自动化

这样,在关闭智能灯的时候不会断电,可以实现灯光缓灭、自适应照明等高级功能。

窗帘的部分就更简单了,只要定时开关就行。通过HA的手机APP,可以将下一个闹钟时间导入自动化,实现闹铃响起时打开窗帘。

附加题部分

在基本框架(aka灯和窗帘)搭好之后,就可以放飞自我搞一些新花样,这里举两个例子。

智能面板

Sonoff NSPanel应该是最便宜的智能面板了,而且可以刷第三方固件lovelace-uiNSPanel_HA_Blueprint,可玩性非常高。

NSPanel Lovelace UI

如果需要更大的屏幕,甚至可以在仓库里找一些淘汰的设备,比如说还能亮的山寨平板、二手安卓手机、闲鱼低价带屏开发板之类。通过WallPanelHA的kiosk-mode插件,可以让这些设备直接成为HA的前端显示2

一个二手安卓触摸屏

一个二手安卓触摸屏

作为一个直男,还有一件事情要嘱咐:不要搞得太丑了,正常人不会喜欢满墙飞线的,至少拿个相框遮一下。这部分我也不会,所以我从网上找了一张图。

reddit:surface_pro_3_wall_tablet_install,这张图也挺丑的

ESPHome

传感器是从遥控家居走向智能的关键一步,在需要更多种类的传感器时,ESPHome能够派上用场。只需要一块ESP32,加上AHT20就是温湿度计,加上SGP30是TVOC检测仪3,加上PZEM-004T就是智能电流表,加上LD2410就是人体感应雷达,而且都可以与HA控制的所有设备联动。唯一的问题是,ESP32系列一般是通过Wifi联网,可能会对路由器造成一点点压力,如果是一万块钱的高级路由器K3就无所谓了。

另外,如果完全不想和小米打交道,易微联、涂鸦或小燕科技的设备也可以试试。没准过几年Matter设备也会上市?


那么关于智能家居的第一部分在此告一段落,之后会记录一些更为个性化的部分,而今天又是一个思念192.168.1.1的日子。虽然心已随着VPN回到家乡,但身体仍在公网上漂泊。

参考


  1. 那么你可以直接跳过这篇文章,不会有什么损失。 ↩︎

  2. HA前端对浏览器版本有一定要求。如果设备过于古老的话,可能需要手动更新Webview,见此处。 ↩︎

  3. 这个不要用,长期开机读数会暴涨。 ↩︎

仅IPv6家庭内网服务实现v6+v4双栈访问

2023-02-07 17:29:00

是的,连回家里NAS的正常手段,当然是ZeroTier/Tinc/OpenVPN之类。但是如果还有其他人想要看照片的话,不要期待手机上会有除了浏览器之外的东西。

在这种场景,如果:

  1. 有一台常开的NAS、矿渣或whatever,
  2. 在Cloudflare上有一个自己的域名,
  3. 家里的宽带有IPv6,而且防火墙可以自己控制(aka 光猫桥接),
  4. 不想或者不能打开80、443端口,没办法直接使用Cloudflare代理;

那么可以通过本文的方案,获得高位端口的CF代理。这样,在没有IPv6的地方也能够访问家里的服务了。

如果上面的条件不满足的话,可以尝试FRPCloudflare Tunnel之类的东西。

打开端口、DDNS

首先我们需要保证NAS上的IPv6端口能从公网访问,并把域名指向家里的IPv6地址。打开端口的部分可以看看之前的博文;DDNS我在使用ddns-go(这里可能需要科学上网)。注意,此时先不要开启Cloudflare代理。

完成这部分之后,我们的域名(比如说home.example.net)指向了家里的IP,并且防火墙打开了端口(比如38000)。可以在NAS上开个python -m http.server 38000,并用移动网络测试一下。

对了,Cloudflare的token不要扔,待会还有用。

Caddy

安装包含Cloudflare DNS插件的Caddy。因为家里没有80和443端口,所以需要用DNS-01方式申请TLS证书:

## cat /etc/caddy/Caddyfile
(cloudflare) {
 tls {
 dns cloudflare abcdefgh #刚才说的Cloudflare的token
 }
}
home.example.net:38000 {
 reverse_proxy http://localhost:1234 #这里是内网服务的地址
 import cloudflare #申请证书的部分

开启Caddy。这里结束后,移动网络(就是有IPv6地址的网络)应该能够通过https://home.example.net:38000访问服务了。

Cloudflare

把SSL/TLS加密模式改为完全;

添加Origin Rules,把请求转至高位端口;

开启Cloudflare代理。在DDNS服务上也开启Cloudflare代理

好了,大概就是这样。通过CF,也许自家的网络也能稍微安全一点。

下载装小蜜监理拍摄的图片

2022-12-15 22:47:11

最近,我家的装修终于告一段落,历时6个月,经验大概可以水三四篇博文——如果博主的拖延症能治好的话。今天先从最简单的部分开始。

装小蜜是北京地区比较流行的监理服务,价格比起正规监理(有监理证的那种)要便宜许多,在装修过程中应该也是有作用的。每次上门服务时,监理会在每个房间拍一张全景照片,如果工长不提供水电位置图的话,之后这些照片应该能派上用场。

像所有Web2.0之后的公司一样,这家公司主要在APP和微信小程序上提供服务,而且并不具备数据导出功能。这种情况的一般解决方案是抓包,只要配置好xposed、HTTPCanary,解决TLS证书固定之类的问题就行了,我一开始就是这么做的,之后发现了别的方法:只要屏蔽一个特定域名(zxm-oss3.oss-cn-beijing.aliyuncs.com),微信小程序上就会显示图片的实际位置。

图像实际存放地址

具体上,按照这里1的思路,我也使用Clash For Windows,把所有来自阿里云的请求屏蔽掉。然后在微信电脑版上打开小程序,就可以得到上图。之后,直接用鼠标把链接拖动到TXT里面,就可以用你最喜欢的工具下载了。

proxies:
 - name: Fiddler
 type: http
 server: 127.0.0.1
 port: 8888
proxy-groups:
 - name: Proxy
 proxies:
 - Fiddler
 type: select
rules:
 - DOMAIN-KEYWORD,aliyuncs.com,REJECT
 - PROCESS-NAME,Fiddler.exe,DIRECT
 - MATCH,DIRECT

另外,小程序是用Pannellum进行渲染的。下载到的照片可以用这个网站查看。好像和直接用小程序没有什么区别……

附:微信小程序缓存位置

C:\Users\me\AppData\Roaming\Tencent\WeChat\radium\web

我是用Process Monitor监测文件变化发现这个路径的。

几物互联

2022-05-22 22:45:39

我被封在外面了。这种时候非常想念192.168.1.1……也非常适合写博客来回忆熟悉的网络。

无论是在家里的组装机还是漂泊的笔记本,在工作的时候都能够获得相似的上下文,有的时候甚至可以在家CTRL+C,在公司CTRL+V。除了鸿蒙系统之外,通过一组软件也是可以实现的。

本人现在所使用的方案如下。设置难度由易到难排序。

同步存储:Syncthing

前置条件:两台(或以上)容量较高的电子设备

比起云存储,个人更倾向于Syncthing这样的本地同步方案:至少文件是属于自己的(而且还不用收钱)。安装也很简单:Windows下安装SyncTrayzor,Android下安装Syncthing-Fork,其他系统移步这里就可以。安装完以后,在两边选择工作目录,就可以完成双向同步了。得益于STUN服务器,无论是在内网还是外网,文件都可以完成传输。

当然,Syncthing也有一定的问题。首先是,因为是进行了同步,同一份文件会在每一个设备上都占用一份空间。在手机这样捉襟见肘的环境下,建议采用“仅发送”模式,只用来备份照片之类的。

另外,Syncthing在运行的时候必须要两侧的设备保持开机,电费账单+1。在有一方离线的时候,需要注意文件的版本,不要在两边都修改同一个文件。毕竟不是git,合并功能没有那么强。

笔记软件与文献管理

前置条件:同步的话需要Syncthing,或者云存储。

本人使用JoplinZotero来做笔记和进行文献管理,这两款软件都可以使用Syncthing作为同步后端1,而且都具有笔记功能。我的习惯是,在Joplin上写一些需要较长篇幅的笔记,文献阅读笔记放在Zotero中。

当然,作为一篇讲“互联”的博文,这两款软件当然也是可以相互连接的。我主要用到下面这些:

Joplin内部

当然Joplin不是为了双链笔记而设计的,但是通过插件plugin-note-link-system也可以获得一部分双链笔记的功能,比如说,方便地在一篇笔记里引用另外一篇笔记的某个小标题;或者是在另一篇笔记里看到backlinks。

笔记引用Zotero参考文献

通过Better BibTeX for ZoteroQuick Copy功能,按下Ctrl+Shift+C,就可以把当前文献复制成类似[xxx](zotero://select/library/items/AAAAAA)的链接。这种方式对别的笔记软件也适用,只要它能够打开URL Scheme

如果把链接改写为zotero://open-pdf/library/items/AAAAAA?page=114,可以直接打开文件的第114页。 p114

另外,Calibre也有类似的链接功能。我一般用Calibre来管理那些杂书。

calibre

引用计算机上的其他内容

肯定没有人想把所有文件都塞进笔记本的数据库里,总是要引用一些外部文件的,这时候还是需要用万能的链接。这里的链接格式类似[xxx](file://C:\工作\xxx.docx),在Windows系统下既有斜杠也有反斜杠,但是很神奇地能够正确找到。

实际上还有一个问题,通过Syncthing同步后,文件在每台电脑上的链接地址是不一样的。所以,我在每台电脑的C盘做了一个文件夹链接2。在Powershell下:

New-Item -ItemType Junction -Path "C:\工作" -Target "C:\实际的\工作\目录"

或者也可以用Link Shell Extension来做这件事。之后,在每台电脑上都可以访问C:\工作\xxx.docx了。

随处Ctrl+V,以及传文件

是这样的张总:你在家里的电脑上按了CTRL+C,然后在公司的电脑上再按CTRL+V是肯定不行的。即使同一篇文章也不行。不不,多贵的电脑都不行。

前置条件:需要在同一个局域网下面——所以确实不行。

隆重推荐KDE connect,虽然是KDE出品,但是Windows和Android也能用。给手机和电脑装上这个,在同一个局域网下面就可以共享剪贴板了,而且还能够互相传文件。

不过,有的时候KDE connect找不到局域网设备,这时候我会用Total Commander (Android)的Wifi传输插件,或者是python -m http.server

远程访问:Tailscale、Tinc或Wireguard

前置条件:家里24小时开机的矿渣/跳板机/树莓派/NAS;有公网IP的VPS

之前所说的那样,当前,如果我想要在外面访问家里的局域网,我会使用Tinc来建立隧道。运气好(外面有IPv6地址,大多是手机分享Wifi)的时候,可以直接连到自己的、IPv6地址与某个域名绑定的“跳板机”(ARM矿渣)上;运气不好的话,会自动有一台国外VPS进行转发,速度大概在~100K/s。如果用Wireguard的话性能会更好,可是我一直没有找到像Tinc一样简单的节点转发方案。

来自2023年的更新:现在我用回Wireguard了~

连接Tinc之后,就可以通过Wake On LAN唤醒自己的其他电脑,然后用samba、远程桌面之类的软件了。就好象回到家里居家办公一样!

当然,在这种需求下,最简单的应该是Tailscale,但是由于迫害妄想,我一直没有尝试,而是另外找了类似的东西:

剧透:最后这些我都没用

好了,这次我想说的就是这些。办公室冰冷的行军床正在等着我。


  1. Joplin使用File System作为同步目标,Zotero使用Zotfile插件。就我自己而言,Joplin用了OneDrive,在手机上同步比起SyncThing更方便一些;Zotero那边,我自建了WebDAV服务,这纯粹是因为那时候我还没找到插件。 ↩︎

  2. 其实是Junction,对于应用来说完全透明,两边的文件是完全一样的。 ↩︎

整了个“新”平板

2022-03-04 16:43:55

在过年期间,我突然想买一个大一些的平板。(PDF看不下去一定是因为小米平板4尺寸太小!)

刚好赶上网课热潮,最近安卓系统的新平板还挺多的,比如小米平板5啊、小新pad啊、华为平板啊什么的,可是都有一些这样那样的问题1

那就去看看Windows系统的平板吧。(自从我的寨板坏掉以后已经过去好多年了,最近的技术一定进步了很多吧。

然后我看到了2022年的上网本们,根据我五年之前的经验,那种东西大概率不是为Windows设计的。唯一看起来配置像是20年代的寨板,又听说有屏闪的问题。

再然后,找来找去,发现淘宝上居然有自称“官翻”的戴尔平板卖,2018年的I5-8250U大概也许会和2022年的I3-1115G3差不多

时间回到今天,我收到这台Latitude 5290刚满一个月,而且还没有爆炸,我感到十分欣慰:

第一次开机

第一次开机

啊,扯远了。大概现在就想到这些,再想起别的什么,或者平板真的爆炸了的话,我会再来更新的。


  1. 小米平板5没有USB3.0;联想小新系列国外版型号挺混乱的,估计不会有lineageOS支持了;华为……沸腾了,有点过热。 ↩︎

获取招商信用卡账单的另一种方法

2022-01-21 19:43:45

BGM: 懐かしき東方の血 ~ Old World

按:

最近招商银行不再给我发送EML格式的电子邮件账单了,取而代之的是邮件中的PDF附件,仅供人类阅读,基本上没有办法进行自动处理。于是我故伎重施,试图在IE驱动的网上银行中找到账单,可是找到的却只是用Electron包裹的丑陋电子银行客户端,理所应当地不提供下载服务。

紧紧关闭的大门前,仅有一点点光芒透出来:招行的手机版网站仍然可用。

好的,我们已经获得了本月账单的JSON文件了。

大概长得像这样

{
 "respCode": "1000",
 "respMsg": "操作成功",
 "data": {
 "rmbBillInfo": {
 "amount": "9999.90",
 "billCycleStart": "20211215",
 "billCycleEnd": "20220114",
 "repaymentDate": "20220202",
 "minPayment": "999.90"
 },
 "dollarBillInfo": {
 "amount": "0.00",
 "billCycleStart": "20211215",
 "billCycleEnd": "20220114",
 "repaymentDate": "20220202",
 "minPayment": "0.00"
 },
 "detail": [
 {
 "billId": "0",
 "billType": "DetailBill",
 "billDate": "20220113180009",
 "billMonth": "202201",
 "org": "999",
 "transactionAmount": "88.88",
 "amount": "88.88", //实际的RMB入账
 "description": "财付通",
 "postingDate": "20220114",
 "location": "CN",
 "totalStages": "",
 "currentStages": "",
 "remainingStages": "",
 "transactionType": "消费",
 "cardNo": "6666"
 },]
 }
}

接下来,可以使用你喜欢的方法对账单进行处理了。对于beancount,我写的importer放在这里


  1. Firefox似乎对所谓的“安全”键盘存在一些兼容性问题。 ↩︎

我在GitHub的⭐

2021-12-24 19:29:52

我想要去整理GitHub的star列表已经很久了。之前在同性交友上网冲浪时,经常会看到各式各样的库。怀着一种“这个之后可能会用到”的心情,把它们一一加入列表,然后抛诸脑后。下次重新发现的时候,starred状态仿佛是在嘲笑我一样。最近,正好有一个大项目的deadline横亘眼前,是做这种看似有意义的事情的最好时间。

在看完283/473个项目后1,我意识到自己所说的整理,不过是把链接列表应用猴子排序法而已,复杂度似乎并没有减少,花哨的图表、漂亮的分析更是一概欠奉。可能我应该回去干活儿了。

突然想起来,之前我好像说自己“很难有无聊的时候”,年轻真好啊。

高能预警:下面是一个超级长的列表,而且基本没有什么规律。粗体部分的是我之前用过的、感觉还不错的repo。


网络

DNS

软件

实用软件

这个分类就好像华军软件园一样……

下载

阅读与学习

系统

RSS reader

编辑器、笔记

standalone

浏览器端

博客

资料

嵌入式

新创意、DIY

Javascript 用来做网页的

Material Design for webpage

图片、素材、美术

字体

时髦的深度学习、以及大数据

OCR

量化与虚拟货币

谁都有年轻的时候……

Awesome list of Awesome

Nostalgia


意犹未尽?最新的180个⭐将在近期列出!敬请期待第二部!


  1. 给自己的note:我这次看到这个位置了 ↩︎

Python与光学计算,2021

2021-07-21 18:14:49

本文是2019年同名博文的更新版本。就像在那里说的,光学计算是一个非常宽泛的话题,把所有的库放在一起,倒是具有一种全栈(full-stack)工程师的气质,可是好像很容易造成Stack Overflow

这次,我尝试对这些代码进行简单的分类。因为我不属于光学前端工程师1,也不属于光学后端工程师1,而更像是光学系统运维1,分类得大概并不算准确。

物理光学演示:LightPipes

正像我之前说的那样,我使用opticspy/lightpipes完成了一部分激光物理过程的模拟,这个库大体上能够满足我当时的要求。但是要注意的是,个人感觉这个库是为了物理实验、教学演示而设计的,揭示原理的部分多于实际计算的部分,而且计算是序列化的。或许把它理解成类似虚拟物理实验室更好?

不过如果能力足够的话,大概能在上面实现一些比较复杂的功能。而且话又说回来,真正有一些严肃需求的人,早就去求助一些商业软件了。

光线追迹(Ray Tracing)

在上次的博文里,在光线追迹方面,我曾经介绍过Sterncat/opticspyRayOptcihologramas/pyoptools,其中,前两组大概已经停止更新了,反而pyoptools看起来处于活跃开发的阶段。另外,这次我还看到了三个新鲜面孔:mjhoptics/ray-opticsmess42/pyratebryancole/raypier_optics2

ray-optics

ray-optics的Qt界面

序列化的光线追迹,或成像光学,完成度很高,甚至自带一个类似Zemax的界面。在其手册上提到:

Rethink how image forming optical calculations are done absent historical constraints on computer speed and memory.

我学不会光学设计肯定是因为软件历史包袱太重,嗯。

Raypier

非序列的光学追迹,在几何光学传输的基础上增加了一部分高斯光束和衍射效应,并且可以(通过VTK)生成一些漂亮的三维模型。(之后我一定要想办法成功安装……)

文档在这里。

pyrate

正在写这篇博文的时候,我发现了这一套代码,似乎可以与FreeCAD互动,但是更具体的功能和特性还没有仔细看。毕竟我还没找到文档在哪里……

pyoptools

大概还在紧张地开发之中,等文档写好之后我会再回来看看的。

另:ricktu288/ray-optics

当然不是用Python编写的,但是谁不喜欢开箱即用的玩具呢?

另:Beam4及其他

也许代码就像蘑菇一样,找到一个又有另外两个出来。Beam4是用Java编写的,但看起来成熟度比这里的很多库高得多,比如将要提到的两个。

我把tracepyodakoptcom列在这里,只是为了之后不要重新发现它们了。求求你们好好写写文档吧……

光学设计:为望远镜/日冕仪准备的Python

你想学习怎样设计日冕仪吗?

詹姆斯·韦伯空间望远镜的光学设计,来自poppy

就像所有的专业软件一样,如果你理解了整个物理过程,中间的示意图就并不是那么重要了。这样的库包括:

  1. brandondube/prysm (examples)
  2. spacetelescope/poppy
  3. ajeldorado/falco-python3
  4. ehpor/hcipy (examples)

等。

它们大概都能够计算光学系统的点扩散函数(PSF)、调制传递函数(MTF)、点列图之类的,而优化算法似乎欠奉4。如果你对上面的一系列名词不大了解的话,建议和我一起补习《光学系统设计》

我逐渐理解一切

这些库的对比可以看这里5如果你真的想设计日冕仪的话也可以读一读这篇文献,那里对设计方法也有一些介绍。

就我而言,我比较喜欢HCIPy,至少这里面还包含一些传递过程的内容,不至于直接跳到结论,和上个部分的库们更加接近一些。

另一类光线追迹

这种的主要目的是为了让自己的文章显得更好看,所以我就直接放两张图:

Raysect生成的,就好像杂志封面一样

光线追迹——用inkscape更简单的画图方式

电磁场级别的仿真

无论是用EME法求解模式的CAMFR,还是用FDTD法计算电磁场的meep,都远远超出了我的能力,请有识之士自行判断。

激光谐振腔的简单计算

rezonatorsimcav/simcav等,或许过于简单了,可能LightPipes能做的事情还要更多一些。

大气光谱学

请移步这里这里

其他

pyNLO

总之祝大家好运吧。如果有条件的话,还是尽量使用商业软件。Seriously.


  1. 据我了解并不存在前两种职业。而运维在哪里都存在。 ↩︎ ↩︎ ↩︎

  2. 感觉这些既会光学又会Python的人,在起名字方面都没有什么创意。 ↩︎

  3. A J Eldorado Riggs, Garreth Ruane, Erkin Sidick, Carl Coker, Brian D. Kern, Stuart B. Shaklan, "Fast linearized coronagraph optimizer (FALCO) I: a software toolbox for rapid coronagraphic design and wavefront correction," Proc. SPIE 10698, Space Telescopes and Instrumentation 2018: Optical, Infrared, and Millimeter Wave, 106982V (9 August 2018); https://doi.org/10.1117/12.2313812PDF文件 ↩︎

  4. 如果尝试优化的话,可以看看doi:10.1016/j.ijleo.2018.10.073 ↩︎

  5. Ruane, G., “Review of high-contrast imaging systems for current and future ground- and space-based telescopes I: coronagraph design methods and optical performance metrics”, in Space Telescopes and Instrumentation 2018: Optical, Infrared, and Millimeter Wave, 2018, vol. 10698. doi:10.1117/12.2312948. ↩︎

你可能并不需要内网穿透

2021-07-20 17:03:31

最近搬家了,互联网从联通变成了便宜一些的电信。于是,我失去了之前的公网IP114.*.*.*,换来了100.64.*.*1。不过,IPv6地址仍然是2404::****,这个应该也算是所谓的 公网IP 吧?

准备

  1. 和安装网络的大叔说,我需要把光猫改成桥接模式,并保证“咱是专业的,不会弄坏网线,弄坏了也不会去投诉”;
  2. 找一个稍微新一点的路由器,我用的是刷了OpenWRT的,非常贵的跑路K3;
  3. test-ipv6.com显示了IPv6地址而且没有给你打零分。

比如这样

打开端口

虽然没有了NAT,但是防火墙还是必不可少的,毕竟在互联网上随意敞开自己的端口和裸奔没有什么区别。当然,稍微露出一点点的话没有什么问题,所以我开了几个五位数的端口,用来SSH。

就像这样(图像经过处理,实际上有更多规则,而且端口也不是这几个)

如果对安全要求更高的话,可以参考这里匹配IPv6地址的末几位,就像::abcd:1234:5678:90ef/::ffff:ffff:ffff:ffff这样。

在这个时候,你应该已经可以通过手机移动网络用SSH连接回自己主机的IPv6地址了。就和公网一模一样。

绑定域名

任何一个支持IPv6的AAAA地址绑定的DDNS服务都可以。我家里恰好有一个长期开机的矿渣贝壳云,是某次水逆之后想要买树莓派四,忍住了却又没有完全忍住的结果;之前写的cloudflare脚本刚好能用。

跳板机(自称)

如果想对内网完全控制,而不是仅仅几个端口的话,可能需要所谓跳板机的配合。仔细想想,这是一个跨越防火墙.little的活动,对付防火墙 the Great的软件也完全适用。所以我在内网设备(aka矿渣)上部署了某个V开头的软件,通过Android客户端连回家里完全没有问题2

如果外面的Windows想要进来的话,我现在用的是已经跑路的SocksCap643。把MSTSC.exe加到列表里,就可以愉快地远程桌面了。


来自210805的更新:后来我按照这篇教程在矿渣上部署了tinc,并且增加了ARP代理用来访问内网。我又不能直接把家里的老光猫换掉……


  1. 用于在电信级NAT环境中服务提供商与其用户通信,维基百科上说的。 ↩︎

  2. 记住客户端不要绕过局域网地址,我们用的就是局域网。 ↩︎

  3. TODO:急求一款没有跑路的、免费的、Windows下的全局代理软件。 ↩︎

2020

2021-02-21 21:57:08

生活并不是在铁轨上奔腾的火车。相反地,有点像是在铁轨上躺着的人。火车没准下一秒就会碾过去,没准明年。

没有没有,我并没有在2020年被火车碾,也没有被撞啊被剐蹭啊被碰瓷啊什么的。2020年,交通安全。HeYSH的总结就到这里。


不,2020年并不仅仅是这样。在这一年里,这个身份——上网冲浪的这一部分人格——出现的频率变得很少了,这大概是一件好事情。前几天看到有人说,在互联网上消失的朋友是在过着更好的人生;平心而论,对于我,这句话并没有什么问题。最近这个新年是我过得最幸福的一个,我不必再去反省自己的性格了;2020年本身也并不是一个难过的年份,虽然今年有不少悲剧,可(谢天谢地)并没发生在我身边。我对2020年的唯一的印象,只是在疯狂加班而已。

而且加班本身也并不是一件坏事,它会给你充实 ,可以治疗“野胡”的疾病,甚至能让人体验到自由——Arbeit macht frei,就像在集中营入口写道的。

于是,回望过去的那一年,就像在火车上急速奔驰,可我并不知道列车的下一站在哪里。窗外和煦的阳光洒在我身上,也许我应该稍稍休息一下。

或者,在2021年再多读一些书,赶在睡着,或者成为“无趣的大人”之前。

和(基本上)什么也不能连的电脑传递信息

2020-10-18 20:56:57

有时候你会1遇到一些电脑,孤零零的漂浮在互联网络之外,所有USB口都上了锁,要送进去一些文件,必须要找海关盖上十几个章才能够放行。

当然,显示器、鼠标和键盘还是可以用的,可以让上个世纪的打字小妹一点一点地敲击按键……或者在敲的同时走神,想一想有没有什么别的办法。

下面就是某一天下午,被锁链铐在工位上的我的白日梦。

好吧,现在的情况还不算太糟,至少还有输入设备(键盘,或者像是键盘的什么玩意儿),实在不行的话,我们也可以做出一个 超级打字机器人3000 之类的。

3000

想着这些,我把键盘上的导线扯了下来,我看见线的另一头连着的接口是——

a. 扁扁的长方形,里面只有四片铜片和一片塑料:

这么说他们也并没有把USB口完全封死嘛。

我想起还没有被奴役的时候,在网上自由自在地冲浪的时候,曾经看到过一种叫做badUSB的东西。

我记得那玩意就可以模拟USB键盘,没准正是我想要的。

我仔细阅读了README,但变得有些失望。

不,这个不行。每个键盘都有独一无二的UID和HID识别码,如果不能模拟这些号码,我会被守卫发现的。没准神秘的TB黑客能帮得上忙。

躲开守卫的视线,我开始翻阅黑客目录,接着,我发现了一块代号为CH3929的芯片。

这个应该可以,可能是设计给物理外挂用的,用上这个,我就可以用串口控制芯片,再用芯片模拟键盘,嗯,十分直接。

什么?直接用串口通信?不不不这太危险了。上工的铃声把我惊醒,我揉揉眼睛,发现手里的键盘接口变了形状——

b. 圆形,里面有6根金属圆柱和一块塑料块:

ps/2

居然PS/2这种接口还没有绝迹,真不愧是尊重传统的企业啊。我听说这种接口的协议就更简单了,完全没有识别环节,对电脑来说,所有键盘都是一样的,而且也有外面的好心人做了两种程序,只要烧进ESP32,就能够模拟PS/2键盘。

而且信息输出也不是不可能的,除了老土的屏幕照相之外,还能用视频二维码,看起来既迅速又高大上——

“小X,来新活了!”

“这就来!”

等我敲完这一批字之后,一定要去试一试。我这样想。

免责声明:上面的只是白日梦而已,完全没有测试过。请遵守本地法律法规和公司规章制度,不管你干了什么都跟我没有任何关系。

另外,这次的博文让我想起一个笑话,就是我请电脑高手重装系统,但是他只有一张光盘和一根针……哈哈哈,完全笑不出来。


  1. 怎么说呢,希望你不会——这种事情还是挺少见的,大概。 ↩︎

我将贻笑于大方之家

2020-06-10 21:32:25

不对,其实应该是“吾长见笑于大方之家”。

这体现出我当前在写字上的一些困难。

翻了翻自己的博客,上次正经写字大概是半年之前了,而这篇博文也在草稿箱中躺了很久,除了前面的两句引子之外,正文空无一字。

一部分原因可能是没有什么东西可以写。因为自己的被害妄想,在这个博客里并不会涉及过多的现实生活。另外,长时间对情感的否认也抹去了自己伤春悲秋的能力。小的时候语文老师教我:“须言之有物。”可是在无尽的将石头推向山顶的旅程中,能够提及的景色也确实十分有限。

当然原因并不仅仅在此。我常常幻想自己能够成为一位长文作者(就像Tim Urban一样),但每当我尝试进行这种写作的时候,总会有一种恐惧围绕在身边:如果文中出现了一些简单的常识性错误该怎么办?

事实上,当这种恐惧最强烈的时候,我甚至一句自己的话都说不出来。取而代之的是,疯狂地搜索有没有更加精辟、更加有说服力的句子。既然别人也曾经有过这样的想法,那么至少说出类似的话也情有可原。1

仔细想一想,这样的枷锁可能是常年的八股文、或科技报告写作给我戴上的2——却正好适用于现在,一个人人都可以成为审稿人的时代。

说到这里,我发现自己说不出话来的原因,只是追求完美……或是害怕被喷而已,即使是在完全属于自己的博客。

毕竟

一旦我成为人类,我只会跟你讲一些不太重要或者根本不重要的事,我会尽量避免谈论信仰和政治,因为如果我们意见不统一,你就不会再喜欢我了。

顺带一提,这种现象在传播学中可能叫做“沉默的螺旋”。我在准备一些严肃(……)的素材时,发现很多想法已经在传播学中出现过了。比如这个词,是我在《大众传播理论:范式与流派》的目录上发现的。对于一个新闻系的本科生来说,这个理论就是所谓简单的常识;而我刚刚看到这本大部头的第二章,素材们还要继续在笔记本里吃灰。


  1. 还有一个副作用是,更喜欢使用一些诘屈聱牙的成语。比如刚才的伤春悲秋,我查了好久,发现了“咏月嘲花”这个词,但并没有把它放进去——而且敲字的思路也被打断了。 ↩︎

  2. 同样带来的还有“滥用抽象动词”之类的。当然,这是 微不足道的 文风方面的问题。而且,是的,我又走神了。 ↩︎

一个新主题

2020-05-17 20:05:46

mockup

项目地址:https://github.com/heyeshuang/hugo-theme-tokiwa

大概是3月末,我在例行的检查博客有没有自己偷偷更新的活动中,开始对这个网页感到厌烦了。同时,我在一个月的高强度打牌狩猎之后,自我厌恶感达到了又一个峰值。又到了做些什么的时间了。

中间的事情,比如说连续加班21天啊,往肋间插了根管子啊,暂且按下不表。作为结果,我的博客变成了现在的样子。

(万一我在很久之后换掉了主题,这里还有一些截图。)

主页的样子

内文的样子

在手机上的样子

新主题继承了之前的配色,也以配色而命名。记得当时我选了主题blackburn,又觉得默认的蓝色有些“默认”,于是自己挑了一种,恰好是现在所说的常磐色。嗯,看起来绿油油的。

其他的方面,用了现在流行的、尽情浪费显示器空间的布局,还用了尽情浪费网路流量的网页字体。用2M流量换一个帅气的标题,feels good man1.

另外,现在正在试图向gohugoio/hugoThemes投稿,当前(2020-5-19)的进度是在与老外激情对线。都2020年了,我居然因为开源许可证气得睡不着觉,感觉自己的青春又回来了。

我没什么好交代的了。下次见。


来自2020-6-1的更新:

我突然发现自己连项目的主页都没有写……放在前面了。

另外,如果要剪裁字体,而且安装了node.js的话,可以使用下面的命令:

npx fontmin 字体名称.ttf -t "要用到的字形" > 字体名称-剪裁后.ttf

因为我一直没有一台特别可靠的服务器,正文用的字体就不自动剪裁了。也算是给5G一个应用场景吧?虽然还没有用上。


来自2020-6-12的更新:

终于通过了Hugo Themes的投稿:https://themes.gohugo.io/hugo-theme-tokiwa/

That's a long trip.


来自2020-6-14的更新:

专业人士那里学到了头图的做法。


  1. 说笑的,待会我就会把字体裁好。 ↩︎

2019过去了,我……

2020-01-27 19:40:10

第三旋臂边缘
一颗蓝色行星上
碳基生物正在庆祝
他们所在的行星
又在该恒星系里
完成了一次公转

而这次公转开始得格外颠簸——至少星星上的一部分碳基生物觉得格外颠簸。
下面是碳基生物中微不足道的一员,对自己的上一次公转过程进行的总结。

我觉得2020年亏欠我很多,没有飞出太阳系,没有受控核聚变,甚至连会飞的汽车也没有,只有战争、瘟疫和死亡。2020年可能觉得我不会在乎这些,毕竟我也确实到了应该关心琐碎现实的年纪。所以,我只会在这里提及一些琐碎的事情。

在去年我曾经提到,当时我“正在沼泽中慢慢下沉”。一年过去了,同伴们一些人跳出了泥坑,一些人去了…呃…水更深的地方,而我,感觉自己在逐渐长出呼吸根1。经过了一年的搬砖、填坑、背锅,我逐渐开始适应了这里的节奏,同时,相比于(传说中)其他地方的愁云惨雾2,这里的温度在慢慢地暖和起来。

问题是,这样的天气还能持续多久?我偶尔会在深夜提醒自己。可是,没有了溺死的压力,学习的动力也随之下降了。2019年,仍然没有完成CS109,作为替代,上半年读了林轩田的《深度学习基石》,然后遇到了这个领域常见的落地问题:我并不知道学完这些能够用来做些什么。

去年的投机也并没有收获什么——并没有一夜暴富。即使身处赌场一年,筹码数量竟然没有什么很大的波动,这不禁让我怀疑自己是不是拥有一些(打麻将的?)天赋,或是完全不适合赌博。另一方面,在A股那里,因为懒惰、或是厌恶风险,采用了完全躺好的策略,结果居然还不错——但这与当初的目标有一些微妙的差别。


2019年的某一天(大概是9月30日),我曾经列下了一个表格,写上我获得快乐的种种途径。可是到了2020年,这些事情都已经不再重要了,生命仍在我的体内流动,而我能够清楚地感受到。

多肉

至少我们仍然健康地活着。

在这个碳基生物敲键盘的时候,行星的公转并没有甚至一秒的延迟。它并不在意身上长出了什么,只是被引力牢牢牵住的同时努力向前运动,和它身上的生命一起。


  1. 也许我是一株红树植物 ? ↩︎

  2. 人类总是会盯着坏消息看,这给我带来了一些偏见。 ↩︎

Beancount试用,半年后

2019-11-07 21:58:22

自从2017年开始,我一直使用 网易有钱 记账。不得不说,如果像某落水狗讲的那样,“中国人不在乎隐私”的话,这确实是一个非常好用的APP,下载账单、导入数据一气呵成,连余额宝的利息都能够算得分毫不差——

直到最近,大概是骂挨得太多,或是界面里终于塞不下更多广告,这个APP①用“维护中”挡住了所有同步按钮,并且②停止了维护。

用8元买回了本属于自己的数据后,我想起之前听说过的Beancount。于是,我给那些数据找到了一些新用途。

冷启动

首先,我阅读了这篇博文,搭起了Beancount。接着,我又写了一些其它的脚本

自动建立收支账户

之前的理财软件大多会提供一些初始分类,比如说mint所用的类别列表在这里。 对于本人1之前的账本,有过记录的大概是这样几类:

{'交通,', '交通,打车', '交通,机票', '交通,火车', '人情,', '住房,', '住房,家具', '住房,家纺', '住房,物业水电', '住房,装修', '其他,', '医疗,', '医疗,药品', '娱乐,', '娱乐,电影', '投资亏损,', '文教,', '文教,书刊', '文教,文具', '旅行,', '旅行,景点门票', '旅行,酒店', '汽车,', '购物,', '购物,数码', '购物,日用', '购物,玩具', '购物,电器', '购物,美妆', '购物,运动用品', '购物,鞋服', '购物,饰品', '通讯,', '通讯,话费', '零食烟酒,', '零食烟酒,水果', '零食烟酒,烟酒', '零食烟酒,茶水', '零食烟酒,零食', '零食烟酒,饮料', '餐饮,', '餐饮,三餐', '餐饮,食材'}

对这些分类,利用人工智能,为每一项建立了对应的account,形成了一个dict

如果你已经下载了beancount-homemade-importers,你可以用里面的importers/ youqian/accountInit.py来自动建立这些accounts

python importers/youqian/accountInit.py > New_Accounts.bean
# 或:如果之前已经建立了一些账户的话
python importers/youqian/accountInit.py Existing_Accounts.bean > New_Accounts.bean

导入网易有钱的收入、支出数据

Beancount的文档里已经对导入脚本进行了比较详细的说明。从这个例子开始,基本上只要实现几个函数就行。

beancount-homemade-importers中,我写了一个简单的网易有钱导入脚本。在使用之前,需要用excel把默认的xlsx格式转换为收入.csv支出.csv

之后,使用

bean-extract importers/youqian/youqian_expense.import documents.tmp/支出.csv > 支出.bean
bean-extract importers/youqian/youqian_income.import documents.tmp/收入.csv > 收入.bean

来导入。

自动记账

写下这个标题是在2020年6月。在使用beancount半年之后,账本一共增加了270条内容,所需的时间每月不超过1小时。

梳理资金的流向

作为一个单身工薪族,我的主要全部收入来自于工资,在经过一些卡片后,从微信、支付宝和其他地方流走。

用mermaid画的流程图

(这张图是用mermaid画的,这里是源代码)

graph LR;
 linkStyle default interpolate basis
 subgraph one [开销]
 A([支付宝]);
 B([微信]);
 G(["京东、刷卡"]);
 H([理财]);
 end
 subgraph two [收入]
 C[工商银行];
 end
 D[农业银行];
 E([中国银行]);
 F([招商银行]);

 E --> H
 E & F --> A & B
 C --> E & D & F
 F --> G
 classDef auto fill:#9ACFBF
 class B,E,F auto

其中,有一些银行卡(比如图中的农业银行)每月的转账记录不超过2条,这时候只要手工敲上几行就可以了。对于另外的、日常生活的花费,手动记录带来了大量时间的浪费。这时候,找到流动的枢纽,并对它们的账单进行批量处理,就可以从重复劳动中解放出来。对于我来说,要进行批量处理的节点是中国银行招商银行微信2

写一些脚本

所以,我写了中国银行、招商银行和微信钱包对账单的导入脚本。Beancount拥有比较强大的导入功能,对于简单的、CSV格式的账单文件,只要在自带的beancount.ingest.importers.csv.importer稍作修改就可以了;对于其它较为复杂的账单,可以自行扩展ImporterProtocol的子类,在官方文档中有较为详细的说明。

另外,我还发现了smart_importer,只要简单地增加hook,就可以给导入脚本增加更好的去重、智能猜测分类等更帅气的功能。

在每个账单日运行一次

在账单目录下,我建立了一个TODO文件:

自动导入微信、中国银行和招商(账单日)
手动导入工行和农行

因为微信的账单信息比较多,我一般先从它开始。每月信用卡的账单日,下载微信钱包对账单,然后运行:

bean-extract importers/wechat.import documents.tmp/微信支付账单.csv -f main.bean > temp.bean

其中,-f用来为smart_importer提供学习素材。

接下来打开temp.bean,检查人工智障智能补充的分类条目有没有什么问题。(大概率问题很多,每个月大部分的时间会花费在这里。)

之后,将temp.bean重命名为一个有意义的名字,并在main.beanimport。接下來对银行账户的导入过程中,smart_importer会自动去除重复账单。

在上面的工作都完成以后,本月的账单也只剩下几条漏网之鱼了。把它们(手动)补充,并用balance命令检查。

并养成“记账的好习惯”

在某些问答网站上,在“相见恨晚的习惯”列表,记账大概能排在top10的位置;同时,在“半途而废的习惯”里,位置大概也在附近。原因并不仅仅是“缺乏自制力”,而是手动记账花费了太多时间,而效果并不是立竿见影的。在付出和反馈不成比例时,放弃就成了唯一的选择。

如果每个月只要十几分钟就可以获得成就感,习惯也就自然地养成了。

又及

我跟你港,这次的内容超适合作Python教程的,还能顺便学英语!只要学会了这个,年薪百万不是梦!

现在诚征 100 个凯子幸运读者给我打钱,我的支付宝是:……

呃,对不起。

以上不代表博主观点。


  1. 一个普通的、抠抠索索的中青年男性,未婚,不修边幅,被阳光照到会燃烧。 ↩︎

  2. 细心的读者可能会注意到,我并没有将支付宝也列入进来,即使和微信的地位相似。这是由于支付宝的账单并不能显示付款账户。通过余额宝和通过信用卡支付,在对账单上没有明确的区分,这会给之后的条目合并造成困难。在开始用beancount之后,因为手动记录太麻烦,我很少用支付宝付款。(update 220426:最近听说支付宝手机版能够看到付款账户,之后可以试试) ↩︎

自动输入剪贴板中的内容

2019-09-22 20:54:15

值此佳节之际,为了给伟大祖国献礼,让几个VPS炸成烟花是必不可少的庆祝活动。于是,我搭在Google Cloud Platform上的V2RAY理所当然地连不上了。1正好上次薅的羊毛也快要过期了,又到了交保护费的时间。

其实之前我有两页关于VPS(价格)的笔记,不过计划赶不上变化,今天看到了一个叫Veesp的公司,很便宜,而且速度居然也还不错。

惟一的缺点是,我买不到红墨水那里的终端noVNC不支持粘贴。

以上是(无关紧要的)背景。

附:Veesp的测速情况

北京联通表示情绪稳定

针对noVNC的问题,根据这个帖子,可以用xdotool来解决。

现在我用的KDE自带剪贴板管理程序Klipper,能够配置自定义动作处理剪贴板中的内容。这里的动作是xdotool type '%s',如图:

setting

另外,在我这里在当前剪贴板上手动执行动作的快捷键Ctrl+Alt+R似乎有冲突,我改成了Ctrl+Shift+Alt+R2

之后在noVNC界面上按刚才的快捷键就行。


来自19-10-4的更新:俄罗斯IP被某个熊猫网站(e-h)屏蔽了……我就随口一说。


  1. 具体地说,是在北京联通的4G网络,协议是WS+TLS,而且并不是永封,截至发稿前又可以连接了。在同个服务器上的$$被封得更彻底一些。 ↩︎

  2. 其实我还有点期待<kbd>标签能出个什么特殊格式呢…… ↩︎

Unicode与数学公式

2019-09-05 20:24:27

如果你混迹某小蓝鸟APP,或者像我一样常常用辣鸡微信干活,那么在你需要一点数学的时候,可能会觉得有些尴尬。如果直接写一些裸的LaTeX显得有些不近人情,可是像百度知道大神一样直接把公式“展平”,又显得有一点点……低龄。1

借助现代Unicode的力量,可以输入一些比较简单的数学,大概能到这种程度:√X̅ₘ̅²̅+̅Y̅ᵦ̅²̅≥0

这玩意粘贴到微信和小蓝鸟上效果居然还不错。(假装这里有个图)

(呃,上面输入的是 $\sqrt{X_m^2+Y_\beta^2}\geq0$。)

这里用到了Unicode数学符号上下标组合附加符号2

另外,在中日韩兼容字符集里还有类似这样的符号,个人觉得……有点玩过头了。


  1. 其实在这种情况下,AsciiMath可能是一个好选择,毕竟这玩意比LaTeX长得好认多了。还有一种格式叫做UnicodeMath,长得其实也不赖。 ↩︎

  2. 用来输入上划线,具体是U+0305,可是效果好像不大好。另外,这个网站可以直接添加上划线。 ↩︎

Python中光学计算相关的库/Awesome Python for Optics

2019-08-04 20:03:49

来自2021-07-24的更新:

本文的2021年版本在这里

以下是2019年的原文。


这大概是本博客第一次涉及博主在现实世界中的本职工作,大概算是一个好的开始。

在光学设计及模拟的领域,商业软件,比如Zemax/Code V、LASCAD、GLAD等,提供了较为完整的解决方案,对于较为前沿的领域,国内研究的事实标准是,通过MATLAB自行编写可靠性和可维护性都存在较大问题的脚本。但是,对于一些研究经费不足同时工作量不饱和的课题组,了解这个古老的学科与当今流行语言的交集,可能也具有一定的意义。

TL; DR:光学计算是一个很宽泛的话题,针对我的要求,之后我大概会试试LightPipes.

以下是我找到的一些库的对比。

spacetelescope/poppy

这个库本身是为詹姆斯·韦伯空间望远镜的模拟而设计的,从其tutorial也可以看出,这个库的主要目的大概是,在衍射明显的条件下模拟成像过程、计算点扩散函数并分析成像质量,特别是针对天文望远镜领域。

因为我并不真正 理解 光学成像,我并没有办法判断该库的潜在用途,不过在激光器设计方面该库可能并不适用。

Sterncat/opticspy

opticspy

看起来,这个库主要用于镜片设计,类似Zemax/Code V等软件所做的那样。具体上,能够完成光线追迹(但是没说能够优化),利用泽尼克多项式拟合(透镜表面/波前?),并计算镜片表面的干涉条纹。下次如果要计算纯粹干涉方面的内容我可能会尝试一下这个。

另外,这个库散发着一种爱好者的气息,施工中标志散落在文档各处。对于这种类型的项目可能还是让企业来做比较合适;可是开源之后又赚不到钱。

NanoComp/meep

meep

FDTD法计算电磁场。这玩意让我想起了我短暂的研究生岁月,那时我学到一件事……人的能力是有极限的。

下一个。

SymPy

SciPy的一个组成部分,拥有一个光学计算模块,但仅仅在代入公式的水平。嗯,如果只是要算算高斯光的传输矩阵什么的,问题应该不大。

cihologramas/pyoptools

大概也是Ray Trace,大概也是个人作品,而且例子都是用一种我看不懂的语言写的。下一个。

rezonatorsimcav/simcav

Rezonator其实不能算是Python库,不过倒也是免费的,而且做的比另一个程序更完整一些。这两个软件的功能比较类似,仅通过谐振腔传输矩阵计算激光谐振腔特性,对于简单的腔形,可能这个就足够了。

opticspy/lightpipes

lightpipes

最后我找到的是这个,它的官网上说,这本来是一个*nix下的C++库,1999年开源,并增加了免费Python接口——听起来很靠谱。 具体上来说,这玩意也包含几何光学和衍射光学的相关内容,而且在它的说明文档里直接体现了高斯光谐振腔矩阵计算强衍射条件下谐振腔的计算(虽然我还没有看懂)。

之后,可能会在这个的基础上对激光器进行一些分析——如果计划没有变更的话。


来自2019-10-23的更新:

Finesse and PyKat

为了LIGO设计的语言,用于引力波探测器的光路设计。Finesse有一种十分简单而复古的语法,而PyKat与其说是它的 封装 ,倒不如说是拿报纸包了一下。

当然,该程序的功能还是挺强大的,甚至还有一些量子光学的内容1。如果有人想要尝试的话,可以从这里开始。


来自2020-6-1的更新:

RayOpt

rayopt rayopt

opticspy一样,RayOpt也是一组用于代替Zemax的程序,看起来更不像一个玩具。当然,如果要对这样的库作出一个中肯的评价,我觉得至少还要学习十年左右。所以我只是把它列在这里,并且祝路过的旅行者好运。

另外,我下次更新这篇文章的时候,差不多要给它们分分类了。毕竟光学计算是一个很宽泛的话题。我先立一个flag在这里。


  1. 比如语法说明里提到了squeezed vacuum input source。不要问我那是什么。 ↩︎

一本厕纸小说

2019-06-02 19:18:27

甲:我有个创意。

甲:一个日本宅男让车给撞了,穿越到了异世界——

甲:别着急,我知道你想说什么,但是这种小说好卖啊!而且还好抄,随随便便就能写好几本,

甲:而且我的世界观挺特别的,是中世纪魔法世界,但是主角用的不一样,他嚷几个字就能伤人,而且还是说日语,

甲:啥,《上古卷轴》?没玩过没玩过,整天码字这么忙谁有空玩游戏啊!

甲:然后?然后就开始冒险了!在这里怎么也得水上几十章吧,打个四大天王,拿到神秘卷轴,学习新咒语!当然这些咒语也是汉字的哈,这儿先卖个关子。

甲:然后不知道怎么着主角就知道世界的真相了,这其实是个网游,就管它叫,什么来着?对,《上古卷轴98 online北极熊特别版》。

甲:主角拿到的也不是什么咒语,全是敏感词列表。这游戏是北极熊公司买的,加过滤系统的时候坐标没设好,本来是要惩罚玩家的,结果打到对面的人身上了。

甲:一下子就变成网游世界观了!无限流,是不是这玩意!哎,我要是跟那个谁一边儿有钱就好了啊。

甲:扯远了扯远了,反正最后又可以跟什么世界守卫者打一架,贼时髦!

乙:别的不说,这破玩意肯定过不了审。

甲:这句话把我伤着了,咱们是在网游里面吗?

乙:重写。

甲:行。

震惊!为了在Windows上访问EXT4分区,他竟然做出了这样的事!

2019-03-02 23:19:02

呃……原谅这次的标题党,但我觉得这次自己的操作实在是太蠢了。

事情是这样的,作为一个半吊子,我的电脑上同时有Windows 10和Manjaro Linux两个操作系统,也就有了从Windows上访问Ext4分区的要求。大约在一年之前,这个要求可以用Ext2fsd来满足,可是一年过去,它已经无法识别新的Ext4版本了。

于是,我……我做了一个linux虚拟机来帮我读这个分区。

具体来说,VirtualBox支持将单独的分区视为虚拟磁盘12。你需要在 具有管理员权限 的命令提示符中运行:

VBoxManage internalcommands createrawvmdk -filename "C:\Users\<user_name>\VirtualBox VMs\<VM_folder_name>\<file_name>.vmdk" -rawdisk \\.\PhysicalDrive0 -partitions 1,5 -relative

这个程序大概在VirtualBox的安装目录下,磁盘号和windows的“磁盘管理”程序一致,分区号可以用下面的命令获得。

VBoxManage internalcommands listpartitions -rawdisk \\.\PhysicalDrive0

之后,

就可以在宿主机上用网络硬盘访问Ext4分区了。

而且能够收获一次反思:我为什么要浪费宝贵的时间干这个?

我的2018

2019-01-27 00:22:48

又到了每年跟风写总结的时候,这一年里唯一确定的成就是,在“年龄”一栏里加了1。

关于工作

到今天为止,我已经在现在的岗位上待了五百多天了。之前可能也提到过,我去的是某家不能说的国企,工作内容“专业对口”(啧),并且和互联网行业毫无关系。我时常想象自己正在沼泽中慢慢下沉,虽然没过脚踝的泥浆并不冰冷。

“谁又不是呢?”而且我会这样安慰自己。

生活

今年四月份,我第一次获得了一间厨房的使用权,并且附带一间厕所。阅读了说明书之后,我很快就学会了厨房的用法,并且觉得自己做的菜还挺好吃的。

……嗯,对了,是成就感,我现在很需要这种感觉。做出点东西来,即使是做菜也好,能够稍稍平息内心的焦虑。即使今天依然一事无成,至少我可以做到这个,我并不是一个毫无用处的人。

而且食物本身就会让人高兴起来,我们就是被设计进化成这样的。副作用是,19年的体重比17年多了15斤。

码代码

而且我也不能用画个小网页来摄取成就感了。心中的声音对我说,这种东西并不是那么“高端”,而且也不能卖个好价钱。

于是我开始假装学习,年初姑且算是看完了Andrew Ng的课程,并且列出了计划,在2018年学完CS109。

后面的故事毫无新意:19年,课程的进度仍然停留在第七周。

其他的失败

疯狂相亲

……在这里我很想把一切归咎于自己,“沟通能力差”、“冷血”,或者其他什么,好像病因诊断出来之后,只要吃下合适的胶囊,一切问题就可以自己消失。可是生活并不是在铁轨上奔腾的列车,所以把失败推给“时运不济”也并不是不行。

——其实有在好好反省了…… 于下一次……………… 下次再有活力一些吧。

比特币?

之前拿到了一点点筹码,那么,不去来一局可就太没意思了。嗯,这里也获得了一些经验,另外还品尝了自己在受到损失时的感觉——如此的苦涩令人上瘾。

于下一次………………

够了够了,玩梗一次就行。1


……总之,2018年,依旧是一事无成,也并没有学会预测未来。

可是仍然希望2019年会更好。

……至少先把CS109看完。

……要是能知道哪个泥坑适合打滚就更好了。


  1. 这个梗出自《刃牙道》65话。虽然很血腥!但是很有趣!这就是刃牙! ↩︎

笔记软件踩雷

2018-11-17 18:26:30

大概是2017年的时候,我一直在使用的为知笔记开始收费了。在交了一年的订阅费(并写了小于10篇笔记)之后,我决定换一款新的笔记软件。

如果对自己的要求有清楚的认识,当查找 poor man's somewares 时,AlternativeToSlant这两个网站经常能够带来一些灵感。对于我来说,笔记软件需要:

这样的话,类似google keep、evernote的软件和收费软件(……)就首先被排除了;在markdown出现之前的老牌笔记软件也自动忽略。然后我试用了当红的boostnote和……什么来着,但这两个软件对附件的支持都不太好。最后,有两个软件满足我的大部分要求:

VNote

美丽的Qt程序,纯Markdown保存,直接粘贴HTML到笔记,甚至还有Vim按键绑定,一切都很好,除了没有同步和Android客户端;当然,纯文本文件可以很容易地用git同步,所以问题变成了另外两个:没有合适的git Android,以及没有Android上的Markdown阅读器1

Joplin

用javascript写应用虽然被很多人鄙视,但确实真正解决了跨平台运行的问题。这个程序似乎连Android客户端都在同一个代码仓库里,如果不在意肉眼可见的卡顿的话,react native能够让人少写好多代码,反观qt-Android……

咳咳,扯远了。总之Joplin有Android客户端,而且自带onedrive同步功能。Nothing to complain2.

另外还有两个小问题。

关于文章剪辑

试图将HTML转回markdown,就像是试图将pdf转回TEX、减少宇宙的熵、或者是把石头推上山一样徒劳,不过,仍然有勇士在尝试这个任务,效果嘛……差强人意,从两个方面理解都可以。

关于为知笔记导出

感觉基本上没什么戏……

为知笔记的markdown格式笔记不是纯文本,而是用HTML储存的,这就是说,打开笔记之后,需要看一整段 <!DOCTYPE html><html lang="en"(下略 才能看到自己的笔记。导出txt格式可能会好一些,代价是损失所有图片;另外,导出时是没有附件的……

理论上,这些都可以用一个脚本来解决,不过我看着自己一百多篇各种格式的笔记,决定还是把它们扔在硬盘里吧。“反正以后光纤也跟我没关系了……”……大概。


来自2019-09-18的更新:

最近在V2EX上看到了一个叫notable的软件,思路上和VNote类似,也是使用文件夹代替数据库,笔记用纯文本格式保存在磁盘中,而且对于图片和附件的位置处理得也很聪明。

另外,在这个项目的主页上还列出了很多常见的笔记软件,而且画了个漂亮的表格(在这里),来比较他们的区别,对某些功能有执念的朋友可以去看看。

当然我还是继续用joplin。feels good man.


来自2019-9-18更晚些时候的更新:

我又翻了一下那个项目的README,发现那个项目不再开源了。好吧,当我今天没有更新。


  1. 在VNote的某个Issue里提到过Markor,不过问题没有这么简单:git从来都没有自动同步功能,所以每次写完笔记之后还要push一次。 ↩︎

  2. 除了导出文件时的一个issue。It looks like Chinese to me. 18-11-20更新: 开发者回复我了!开心~ ↩︎

关于BitMEX的杠杆

2018-08-16 20:35:30

在比特币降到6000$以下的时候,加密货币最忠实的信徒是怎样的心情?作为一个骑墙派,我不敢妄加揣测。不过,有一点是可以肯定的:把加密货币留在账户上然后去睡觉,神经衰弱的一系列症状大约会加重。

所以BitMEX(这里是个返利链接)用XBT计算盈亏就显得很有趣了:当比特币上涨的时候,大家都很开心;可是万一下跌的话,实际盈亏还要乘上汇率的缩水,一不小心就会得到双倍的悲伤。这种时候,理解账户数字的 实际价值1,可能对控制风险有更为重要的意义。

根据官方指南,盈利的XBT数目可以这样计算:

win_BTC_long=(1/price_before-1/price_after)*count #做多
win_BTC_short=(-1/price_before+1/price_after)*count #做空

那么,经过这部分操作之后,账户的最终价值是:

win_BTC_long*price_after+cash/price_before*price_after #做多,或
win_BTC_short*price_after+cash/price_before*price_after #做空

其中,cash是操作前账户的实际价值,$cash*leverage=count$。

例如,当价格从1000$升至1250$,或从1250$降至1000$时,选用不同杠杆的盈亏如下:

leverage 作多,跌 作多,涨 作空,跌 作空,涨
0.0 800.0 1250.0 800.0 1250.0
0.1 780.0 1275.0 820.0 1225.0
0.2 760.0 1300.0 840.0 1200.0
0.3 740.0 1325.0 860.0 1175.0
0.4 720.0 1350.0 880.0 1150.0
0.5 700.0 1375.0 900.0 1125.0
0.6 680.0 1400.0 920.0 1100.0
0.7 660.0 1425.0 940.0 1075.0
0.8 640.0 1450.0 960.0 1050.0
0.9 620.0 1475.0 980.0 1025.0
1.0 600.0 1500.0 1000.0 1000.0
1.1 580.0 1525.0 1020.0 975.0
1.2 560.0 1550.0 1040.0 950.0
1.3 540.0 1575.0 1060.0 925.0
1.4 520.0 1600.0 1080.0 900.0
1.5 500.0 1625.0 1100.0 875.0
1.6 480.0 1650.0 1120.0 850.0
1.7 460.0 1675.0 1140.0 825.0
1.8 440.0 1700.0 1160.0 800.0
1.9 420.0 1725.0 1180.0 775.0
2.0 400.0 1750.0 1200.0 750.0
2.1 380.0 1775.0 1220.0 725.0
2.2 360.0 1800.0 1240.0 700.0
2.3 340.0 1825.0 1260.0 675.0
2.4 320.0 1850.0 1280.0 650.0
2.5 300.0 1875.0 1300.0 625.0
2.6 280.0 1900.0 1320.0 600.0
2.7 260.0 1925.0 1340.0 575.0
2.8 240.0 1950.0 1360.0 550.0
2.9 220.0 1975.0 1380.0 525.0
3.0 200.0 2000.0 1400.0 500.0
3.1 180.0 2025.0 1420.0 475.0
3.2 160.0 2050.0 1440.0 450.0
3.3 140.0 2075.0 1460.0 425.0
3.4 120.0 2100.0 1480.0 400.0
3.5 100.0 2125.0 1500.0 375.0
3.6 80.0 2150.0 1520.0 350.0
3.7 60.0 2175.0 1540.0 325.0
3.8 40.0 2200.0 1560.0 300.0
3.9 20.0 2225.0 1580.0 275.0

这样,通过恰当地选择做多和做空杠杆,可以使做空和做多的回撤接近。比如说,同样是在1000到1250之间运动,做空2.5倍的最大亏损与做多0.9倍类似。如果在两个方向都使用2.5倍杠杆,可能会造成不必要的损失。

——当然,以上分析对比特币狂信者来说并没有什么意义。


  1. 无意冒犯,这里的实际价值指的是能够换多少个比萨饼。 ↩︎

用Cloudflare的v4 API实现动态DNS(DDNS)

2018-07-05 21:41:42

如果你有一个经常变化的公网IP,你可能会需要用DDNS将这个IP绑定在同一个域名上,这样就可以不必每次输入一串IP地址了。我用的DNS服务商Cloudflare并没有提供名为DDNS的服务,但是其API可以实现类似的效果。

之前我用的是这里的方法,不过最近cloudflare更新了第四代API,那个方法已经失效。于是水博文的机会来了。

原料:

  1. 一个域名,并用Cloudflare管理
  2. 一台经常开着的,有计划任务或者cron,可以运行curl的电脑
  3. (可选)如果API地址被屏蔽的话,可能需要可用的代理

步骤:

curl -X GET "https://api.cloudflare.com/client/v4/zones/<ZONE_ID>/dns_records" \
 -H "Authorization: Bearer <API token>" \
 -H "Content-Type: application/json" \
 -x http://localhost:8087

其中 -x是本地代理地址,可选。大概能从返回的一坨json中找到id那一项。

IPv4的情况

#!/bin/sh
NEW_IP=$(curl http://members.3322.org/dyndns/getip)
CURRENT_IP=$(cat /var/tmp/current_ip.txt)
if [ "$NEW_IP" = "$CURRENT_IP" ]
then
 echo "No Change in IP Adddress"
else
 OUTPUT=$(curl -X PUT "https://api.cloudflare.com/client/v4/zones/<ZONE_ID>/dns_records/<RECORD_ID>" \
 -x http://<代理地址,不要的话删去这一行>:8087 \
 -H "Authorization: Bearer <API token>" \
 -H "Content-Type: application/json" \
 --data '{"type":"A","name":"<子域名地址>","content":"'$NEW_IP'","ttl":1}')
 if echo "$OUTPUT" | grep -q "$NEW_IP"; then
 echo "Update IP Success!"
 echo $NEW_IP > /var/tmp/current_ip.txt
 else
 echo "Update Error!"
 fi
fi

IPv6的情况,放在两个不同的脚本里面可以共存

#!/bin/sh
NEW_IP=$(ip -6 addr | grep inet6 | awk -F '[ \t]+|/' '{print $3}' | grep -v ^::1 | grep -v ^fe80 | head -n 1)
CURRENT_IP=$(cat /var/tmp/current_ip_6.txt)
if [ "$NEW_IP" = "$CURRENT_IP" ]
then
 echo "No Change in IP Adddress!"
else
 OUTPUT=$(curl -X PUT "https://api.cloudflare.com/client/v4/zones/<ZONE_ID>/dns_records/<RECORD_ID>" \
 -x socks5h://<代理地址,不要的话删去这一行>:1085 \
 -H "Authorization: Bearer <API token>" \
 -H "Content-Type: application/json" \
 --data '{"type":"AAAA","name":"<子域名>.<域名>.xyz","content":"'$NEW_IP'","ttl":1}')
 if echo "$OUTPUT" | grep -q "$NEW_IP"; then
 echo "Update IP Success!"
 echo $NEW_IP > /var/tmp/current_ip_6.txt
 else
 echo "Update Error!"
 fi
fi
# crontab -e
*/120 * * * * /path/of/your/script.sh

写字好累(躺


来自19-10-25的更新:DNSpod的公网IP查询服务响应有些奇怪,所以换成了3322。

来自20-06-23:增加了判断,现在不会在一次网络问题后直接写入current_ip.txt了。

另一些预测未来的尝试,以及问题

2018-05-02 20:30:20

之前写到,我们不能从水晶球中看到未来的清晰倒影。而本次的结论更加悲观:那些模糊的幻象基本上没有任何效果,并且很可能是有害的。

另,本文部分是《反脆弱》的读书笔记。虽然作者有的观点过于极端让人不爽,但是其理论仍能给人启发……特别是对于梦想预测未来的人来说。

现实:参数太多而数据量太少

作为一个实验室民工,当我在说“波长与温度成正比”的时候,大概只需要测量8次就够了。可是,当参数太多(而且不能控制变量)的时候,情况变得复杂起来。很多时候,能够得到的数据大概是这样:

time a b c d y
1996-03-16 1 1 0 0.75 5
2007-04-22 3 3 1 4 15
2018-09-01 6 10 6 18 30

提问:$y=?$

A. $y=5a$

B. $y=15b+10c-10d$

C. $y=\text{random}()$

D. $y$是当天大乐透的尾号

当然,作为实验民工的话,正交试验法典型相关分析主成分分析是找到复杂特性的好手段。可是,现实生活中,并不存在重复实验的条件,而且,我们甚至不能将所有参数一一列举出来。最糟糕的情况下,重要的原因仍然藏在水底。

大家喜闻乐见的冰山图.jpg

大家喜闻乐见的冰山图.jpg

这时候,关于预测未来这件事,出现了两种截然相反的手段。

(假)先知们的伎俩:冗余的参数与神秘主义

有时候,仅仅是声称能够预测未来就可以带来实际的好处,无论正确与否;1同时,生物似乎倾向于在事物中寻找规律2。于是,为了垄断对未来的解释权,在可以观察到的参数之外,这些预言家们倾向于将原因复杂化,典型的手法包括“神的旨意”、“群星的角度”和“技术分析”等等。

此时,由于参数的过量,过拟合能够获得对历史数据相当精确的表述(以及对占卜师的信任),然而其预测能力并不像看起来那样强。但是,我们并没有办法判断预言的正确程度(今天的恋爱运是69%),同时养成了在新事件发生之后不翻旧账的好习惯(没有“昨日运势”的地址)。这样的假先知在每个时代都能够占据一席之地。3

应对这样的预言家有一个简单的办法:“不要询问他的意见、预测或建议。只要问他们的投资组合中有什么或者没有什么就行。”换一个时髦一些的说法,叫做“利益相关”,这样的话,错误的预言至少能够得到一些代价。

奥卡姆剃刀,以及为什么在现实中(可能)失效

之前已经提到过过拟合这一概念:

当可选择的参数的自由度超过数据所包含信息内容时,会减少或破坏模型一般化的能力更甚于适应数据。(维基百科)

一般来说,奥卡姆剃刀是解决过拟合问题的有效途径。在预测能力相似的情况下,引入的假定越少越好。在贝叶斯理论下,可以通过贝叶斯因子(或其不够精确的代替品,赤池信息量准则等等)来进行判断。现实生活中的噪音比实验数据更多,按理说剃刀会更加锋利,但是,与数学模型不同,生活中:

样本(仍然)不足

我们再次遇到了这个问题。生活中很多时候,我们获得的信息类似这样:

仅看这些对话,可以得到一个解释力很强,假设又很少的理论,当然我们并不会相信它。日常生活中所能够得到的样本大概如此,有效信息量甚至比噪音还低。指望从中获取什么一般规律/人生哲理/生活智慧,基本上是不现实的——除了给自己增加一些盲目的自信之外。

“火鸡与农场主”、黑天鹅效应、以及损失敏感性

数学与现实生活的另一个区别是,数学是永恒的。只要公理和逻辑不变,同样的算式总是可以期待相同的结果。而现实生活则不同,每天的日常生活很可能是连续发生的奇迹,而且,一旦奇迹不再发生,很可能带来灾难性的结果。这一问题再次提升了预言的难度:不仅需要对未来的平均值,而且对其方差/极端情况进行描绘。

同时,相比正确的预测,错误的预测一般会带来更加恶劣的影响,在心理上也会更强的挫败感,这由我们的本能所决定。

那么……

很多时候,人们观察到了一个(或一组)现象,然后盲目地寻找到一个原因,并认为得到了正确的答案。这在我们进化初期十分有效,在今天也比投硬币决定稍微好一些——如果用于决策的证据真的不够的话。

在更多的情况下,预测未来(并信任这一预测)并不是个好主意。荷兰赌/两边下注/无风险套利可能是更明智的选择。由于日常生活并不是由精明的数学家所设计,这种机会仍是有可能存在的。

在必须要做出决定的时候,可能需要注意:

  1. 尽可能地获取无偏见的信息;
  1. 只下能够赔得起的赌注;

来自19-6-9:

前几天突然想起一个例子。我们宇宙的最终命运——是重新回到一个闪耀的奇点,还是变成冰冷稀薄的碎片,和一个常数相关。现在的观测结果显示,这个常数很接近两种可能的分界线,但我们并不能确定自己是对的:对暗物质质量的计算已经很困难,更不要提什么暗能量了。


  1. 一部分可能由于自证预言,另一部分可能就是流行的KOL什么的了。 ↩︎

  2. 不仅仅是条件反射,而且有非常类似人类的“迷信行为”('SUPERSTITION' IN THE PIGEON, B. F. Skinner)。我最近才在素材库里发现这个有趣的现象。 ↩︎

  3. 我试图让我不要再刷那些占星师的微博了,但是我瞪了自己一眼,然后说:“不”。 ↩︎

随机性从哪里来?

2018-03-26 21:03:21

当然,没准可以预测“真空中的球形未来”。

量子力学……

我们都听说过“两朵乌云”的故事,其中一朵后来变成了量子力学,告诉我们上帝(也许)是掷骰子的。这是截止到目前,所有苛刻的家伙都承认的“真正随机”。而且,通过一些简单的装置(比如盖格计数器或者一个虐猫狂人),这些随机可以进入宏观的现实生活。

或许有一天,我们会发现量子效应只是物质之海表面的涟漪,是物质更深层规律扰动的影子12——但是,这仍不能让我们真正成为预言家,还有一些东西在阻止我们。

……并不是随机的唯一来源

让我们回到乌云飘来之前。那时候的人们充满了工业革命带来的乐观精神,相信自然是和谐、简单、可预测的:穷尽数学系统,可以找到所有数学定理的证明;如果我们了解整个世界的状态,就可以计算出下一秒的世界。如果没有量子力学,这听起来似乎没有什么问题,除了——

这里不欢迎近似

即使是微小的误差,也会放大到不可接受的结果,这就是所谓的蝴蝶效应——

空白处太小,放不下计算机

——而且,计算机本身的计算能力也是有限的。不,这不是说Intel又开始挤牙膏了,而是说作为物质本身,其计算能力有限制。对于我们的宇宙来说,它能够计算的总数据不超过$10^{120}$比特3:可能做一根足够长的杠杆还要更简单一些。

甚至……

即使我们真的掏空宇宙做出一台超级计算机,当它真正开始计算的时候,首先需要计算自己的状态,那么,首先需要计算计算自己状态时自己的状态……

正如证明所有数学定律找到不属于自身的集合的集合或者判断是不是会停机一样,当我们观察系统的时候,需要把自己从系统中排除。


  1. 刘慈欣,《镜子》。原谅我总喜欢拿科幻小说作例子,这纯粹是因为它们“可能性”的种类比较多。 ↩︎

  2. 以上那一行叙述似乎暗示着隐变量理论,作为爱因斯坦从上帝手中夺过骰子的方案。然而,加上删除线的原因是,对贝尔不等式的实验宣告了这种理论的终结。个人而言,我还是比较喜欢这种随机性比较高的世界。 ↩︎

  3. https://doi.org/10.1103/PhysRevLett.88.237901。老实说,这个量与普朗克长度有关,我们还是躲不开量子力学 ;-) ↩︎

这次是纽约公共图书馆……而且居然还有第三部分?

2018-02-24 00:03:59

在图书馆的第三天,到了废纸回收环节

之前下到了一叠厚厚的图集,可是要真正用起来,还需要一点点简单的处理,比如说,沿着边线把图案剪下来:

加工前

加工后

通过一些简单的图形学处理就可以完成这项任务,当然,对于不懂画画的乡巴佬(我),要读好多skimage的教程才能搞定——总之,我把折腾的结果传到了github上,包括:

欢迎下载、使用、或者拿去卖钱,反正是公有领域。

这次是纽约公共图书馆……的第二天!

2018-02-22 16:03:59

(精神上)坐在图书馆里,我想:能不能把这些旧书借走呢?

当然是可以的!贴心的图书管理员已经提供了API接口:http://api.repo.nypl.org/,申请账号之后,就可以做各种各样的事了~

当然,如果只是想下片的话,用digital-collections可能会更简单一些:

digital-collections -t API_TOKEN -s UUID -o OUTPUT.json

其中,API_TOKEN在申请账号以后会得到一个;在你想要下载的专辑(比如这个)下面,可以看到UUID;运行这条命令之后,图片的信息列表会保存在OUTPUT.json里。

对,就是那个Universal Unique Identifier

之后,获得的json文件大概像是这样:

{
 "uuid": "510d47dd-c1f5-a3d9-e040-e00a18064a99",
 "imageLinks": {
 "imageLink": [
 "http://images.nypl.org/index.php?id=1125721&t=w&download=1&suffix=510d47dd-c1f5-a3d9-e040-e00a18064a99.001",
 "http://images.nypl.org/index.php?id=1125721&t=r&download=1&suffix=510d47dd-c1f5-a3d9-e040-e00a18064a99.001",
 "http://images.nypl.org/index.php?id=1125721&t=t&download=1&suffix=510d47dd-c1f5-a3d9-e040-e00a18064a99.001",
 "http://images.nypl.org/index.php?id=1125721&t=b&download=1&suffix=510d47dd-c1f5-a3d9-e040-e00a18064a99.001",
 "http://images.nypl.org/index.php?id=1125721&t=f&download=1&suffix=510d47dd-c1f5-a3d9-e040-e00a18064a99.001"
 ]
 },
 "apiUri": "http://api.repo.nypl.org/api/v1/items/mods/510d47dd-c1f5-a3d9-e040-e00a18064a99",
 "typeOfResource": "still image",
 "imageID": "1125721",
 "sortString": "0000000001|0000000002|0000000001",
 "itemLink": "http://digitalcollections.nypl.org/items/510d47dd-c1f5-a3d9-e040-e00a18064a99",
 "highResLink": "http://link.nypl.org/7nC9VyT_TJWvGX9_H0mYBQ8",
 "title": "Dandelion.",
 "dateDigitized": "2016-08-04T04:53:12Z",
 "rightsStatement": "The New York Public Library believes that this item is in the public domain under the laws of the United States, but did not make a determination as to its copyright status under the copyright laws of other countries. This item may not be in the public domain under the laws of other countries. Though not required, if you want to credit us as the source, please use the following statement, \"From The New York Public Library,\" and provide a link back to the item on our Digital Collections site. Doing so helps us track how our collection is used and helps justify freely releasing even more content in the future.",
 "rightsStatementURI": "http://rightsstatements.org/vocab/NoC-US/1.0/"
}

之后,只要下载imageLink就好了。我用了一个简单的python脚本来做这件事。

# 注意:这玩意没有经过测试,可能会爆炸
# 啊对了,而且是python3.6
import urllib.request as ur
import json
import os

dir_name="Himalayan_plants" #可能要改这里……
os.mkdir(dir_name)
with open("OUTPUT.json","r") as source: #……还有这里
 source_dict=json.load(source)

for _i,_s in enumerate(source_dict):
 file_name=dir_name+"/"+str(_i)+".jpg"
 if os.path.exists(file_name)==False:
 try:
 ur.urlretrieve(_s["imageLinks"]["imageLink"][0],file_name)
 except Exception as e:
 print(_i)
 print(str(e))

这次是纽约公共图书馆……

2018-02-21 22:03:59

是的,我去图书馆了,当然这次和戒网瘾没有什么关系。

纽约公共图书馆建立于1895年,馆藏里有大量古老的资料,古老到超出了版权法的管理范围,进入了公有领域。于是,勤奋的图书管理员们把它们数字化,送给了互联网。

所以,在春节假期,坐在电脑前面,我也可以来一次纽约公共图书馆了——而且是一百年前的!

这里是数字图书馆的首页。如果是一位上世纪的通才,通晓法文、英文拉丁文和其他鸟语,他一定会感觉像是回到了家里一样;当然,即使像我这样的乡巴佬,看一看泛黄的插画,或许也能得到一些乐趣,比如说:

看看喜马拉雅山上都长些什么

嗯,是杂草

学习下最新的流行风尚

唔哦,好男人

或者来辆新车?

如果从这时候就开始摇号的话……

当然,最重要的是,这些资料都是免费的,没有任何版权问题。如果你需要一张可爱的小画儿,这里可能可以提供一点点灵感——或者直接复制也可以,没有(活)人会来找你麻烦的!

History Data for Bitcoin and Altcoins

2018-01-23 17:31:33

Link

In this package, you'll find:

Before 2017-12-23.

These data (and honor) belong to alt19.com. This website says:

Any information on Alt19.com is provided free and "as is" and solely for informational purposes, not for trading purposes or advice, and may be delayed.

No action should be taken or omitted to be taken in reliance upon information on this site. Use it AT YOUR OWN RISK

Digital currencies may be illegal in your jurisdiction. These are high-risk investments with liquidity risks and other financial risks! Some altcoins are inactive or may become inactive in future. Please do your own research.

I think he/she is right, and, thank for these data.


Link

长话短说,这是比特币/山寨币 每小时 的历史数据。比如说,要是进行什么数据分析的话,至少会比泰坦尼克号有意思一些吧……

呃,事情是这样的。在我搜索山寨币的历史数据的时候,常常能看到alt19.com这个网站,但是在8012年,这个网站已经和两千年前的布局不太一样了……

……当然,这个网站仍然供应小时级别的数据——如果你肯花上一点时间做一点侦察工作的话。对于那些好奇心不是那么严重的用户来说,请直接使用本文最上面的链接;对于另外的人,请不要给那个网站的服务器带来太大压力,当然我也没什么资格说这些。

另外,就像上面所说的,一切风险请由使用者自己承担。


Edit in 18-03-26: 后来我觉得还是http://api.bitcoincharts.com/v1/csv/靠谱一些,当然,不包括山寨币。

幂律分布与Zipf's Law

2017-12-16 20:48:36

前几天读了《复杂》。对复杂学的研究,在人工智能重获热度的今天,似乎获得了新的意义——当然,我们还是不知道炼金术的大锅里面发生了什么。

幂律分布/Zipf定律/帕累托法则/80-20定律/whatever,本质上是同一种东西。这种分布模式和正态分布类似,广泛存在于大自然和人造物的各个角落。一般来说,对于具有:

的网络,其节点连接数较为满足幂律分布。

Youtube上有个视频对幂律分布讲得很清楚,对其中提到的两个实验,我利用python进行了模拟。模拟中使用的jupyter notebook文件放在了github gist上。

猴子和打字机

一只猴子(我们叫它Shashi Biya)在打字机上乱敲,它敲二十六个字母和空格概率都相等。那么,咱们能不能看出他的用词习惯?答案是肯定的。

import string,random
from collections import Counter
s=string.ascii_lowercase+" "
s="abcd "
monkey=''.join(random.choices(s, k=10000000))
monkey=[m for m in monkey.split(" ") if m]
c=Counter(monkey)
common=c.most_common()[:10000]
fre=[value for (key,value) in common]
plt.plot(fre)
plt.xscale('log')
plt.yscale('log')
plt.show()

阶梯形状可能是由于概率相等

我们的这位大文豪颇有古风,喜欢用单字(“a”)胜过长单词(“ffsda”),而且用词比例正符合幂律分布:在双log坐标系下,图像大致是一条直线。这很符合直觉:为了得到任何长度大于1的单词,猴子第二次敲的按钮必须不是空格。

不要嘲笑我们的前辈,人类的语言也具有相同的性质,虽然概率最高的字是the什么的。并不是Zipf’s law限制了猴子打出十四行诗,这或许是个好消息。

连接曲别针,第一种方法

在墙上钉100个钉子,然后随意把曲别针连在上面。哪个钉子上曲别针越多,下一个曲别针挂在上面的概率就越高。

l=100
list=np.ones(l)
for i in range(100000):
 s=sum(list)
 p=[j/s for j in list]
 k=np.random.choice(l,1, p=p)
 list[k]+=1
plt.plot(sorted(list,reverse=True))
plt.xscale('log')
plt.yscale('log')
plt.show() #指数分布

可惜这只是个指数分布

与幂律分布相比,指数分布更加“平缓”,而且在双对数坐标系下也并不是一条直线。

连接曲别针,the right way

现在,我有一把曲别针。我随便拿出两个曲别针,并把它们两个所在的串连接起来。

假设我对每一个曲别针没有特别的爱好,那么,某个串选中的概率,与串中的曲别针个数正相关。这就是所谓的优先连接性。

tic=timeit.default_timer()
l=20000
list=[1]*l
while len(list)>14000:
 s=sum(list)
 p=[j/s for j in list]
 k1=np.random.choice(len(list),1, p=p)
 a1=list.pop(k1[0])
 s=sum(list)
 p=[j/s for j in list]
 k2=np.random.choice(len(list),1, p=p)
 a2=list.pop(k2[0])
 list.append(a1+a2)
toc=timeit.default_timer()
print(toc-tic)
plt.plot(sorted(list,reverse=True))
plt.xscale('log')
plt.yscale('log')
plt.show()

png

好的,我们得到了 基于曲别针的互联网系统 ——至少可以算是个物联网。在这个网络里,(大概)80%的曲别针在20%的链子中,余下的曲别针散落在另外的地方。我们叫那些链子“曲别针巨头”。随着连接次数越来越多,链子越来越长,分散的曲别针越来越少,这就是“链子中心化”,我们现在互联网的状态。

当继续这个过程的时候,最终(很快)就只剩下唯一一条长链,这就是我们互联网的末日1

刘慈欣在还没有现在这么出名的时候,写过一篇叫做《赡养人类》的作品,提到了有关“终产者”的概念。当时,有人评论大刘“不懂政治,也不懂经济”,我十分希望这个人是对的。


2018年4年3日的编辑:

这里有另一个Zipf's Law的例子,可以看出,其仍然满足马太效应的性质。另外,别人的故事编的还是好啊。


  1. 这似乎和Net neutrality并不是一回事。并没有什么邪恶组织,邪恶的只有系统而已。 ↩︎

学习笔记:神经网络的优化策略

2017-12-09 16:53:50

本文基本上是 Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization 的知识点大纲。

具体的公式和理论,可以看Bin Weber的博客

训练/开发/测试集(Train/dev/test)

过拟合

欠拟合

初始化输入数据和参数

提高梯度下降速度:mini-batch

由于内存/计算单元不够(always),每次计算部分数据

提高mini-batch的稳定性,减小摆动

超参数的选择

需要的超参数

选择方案

r=-4*np.random.rand()
a=10**r

Batch-Norm

采用批标准化之后,尽管每一层的z还是在不断变化,但是它们的均值和方差将基本保持不变,这就使得后面的数据更加稳定,减少前面层与后面层的耦合 (via Bin Weber)

Softmax

当分类器需要分出更多类时使用

检验方程的梯度计算是否存在问题:梯度检验

用计算斜率的方式近似梯度

深度学习是否会陷入局部最优问题?


  1. 意义似乎略有不同 ↩︎ ↩︎

最近对博客的改动

2017-12-04 20:56:49

用chroma进行语法高亮

最近hugo内置了chroma,这是类似Pygments的语法高亮引擎,但是纯粹用GO完成,可以方便地集成在hugo中。今后,在生成的页面中可以不需要highlight.js等脚本文件,理论上可以提高网页加载的速度。

使用方法

config.toml中加入以下内容:

pygmentsCodefences = true #高亮markdown的代码块
pygmentsCodefencesGuessSyntax = true #高亮markdown中没有标注语言的代码块
pygmentsStyle = 'manni' #高亮主题

可用的主题见这里。更多的设置可以参见hugo帮助

用typography.js修改样式

Typography.js是生成网页字体排印格式的库。只要简单地利用已有的主题,就可以生成较为完善的CSS格式。当然,如果需要更精确的中文排版,请移步汉字标准格式

Typography.js本身不提供直接输出CSS的功能,必须引入npm库,降低了网页加载速度。为了解决这个问题,我写了一个简单的脚本:typography2CSS,用来直接生成CSS文件。

之后,经过少量修改,即可用于现有的主题,效果如此博客所示。

换了个新域名

2017-11-27 22:59:56

距我丢掉heysh.tk这个域名已经一年多了。在那之后,我失去了对tk域名的信任,趁着换hugo的功夫,直接使用github.io的二级地址。最近,我有了一份工作,手头也宽裕了一些,所以换个域名再次提上了日程。

我对自己博客的要求是,即使自己哪一天完全忘掉,这里还能存在比较长的一段时间。所以,我希望域名的续费价格尽量低一些——这并不(完全)是因为囊中羞涩。于是,在各个域名商的网站乱转的时候,我的心情颇有点像是在肉联厂门口徘徊的年轻母亲。“Namecheap的.me第一年只要$0.33……可是续费要120一年……”

最终,是Namesilo拯救了我。在pricing页面,把表格抄走,用Excel或者什么东西排个序,然后再把后面的那些行删掉,可选择的范围就少得多了。

总而言之,这里的新地址是https://blog.heysh.xyz/,没有什么特殊的意义,也许会用比较长的一段时间。

VPS初始化checklist

2017-11-25 12:35:54

仅供存档。另外,virmach黑五大减价了,KVM主机5.6$一年美滋滋。

这是我的邀请链接:https://billing.virmach.com/aff.php?aff=3032,优惠码是2017BFSAVE20

新建用户

感谢https://blog.roadofgrowth.com/2015/04/28/e6-96-b0-e8-b4-advps-e5-88-9d-e5-a7-8b-e5-8c-96-e5-ae-89-e5-85-a8-e9-85-8d-e7-bd-ae/

adduser hh
gpasswd -a hh sudo

添加SSH-KEY验证并禁用root用户SSH远程登录

su - hh
mkdir .ssh
chmod 700 .ssh
vi .ssh/authorized_keys

在这里粘贴你的公钥。什么?noVNC无法粘贴?我写了篇博文来解决这个。

#vi /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
Port 22222
sudo systemctl restart ssh

安装配置防火墙 (ufw)

sudo apt-get update&&sudo apt-get upgrade
sudo apt-get install ufw
sudo ufw allow 22222 #允许SSH
sudo ufw enable

安装vim

安装shadowsocks-libev

sudo sh -c 'printf "deb http://httpredir.debian.org/debian jessie-backports main" > /etc/apt/sources.list.d/jessie-backports.list'
sudo apt update
sudo apt -t jessie-backports install shadowsocks-libev
sudo vim /etc/shadowsocks-libev/config.json
sudo ufw allow <PORT>
sudo systemctl start shadowsocks-libev
sudo systemctl enable shadowsocks-libev

安装4.x内核

sudo apt-get install -t jessie-backports linux-image-amd64
sudo update-grub

启用BBR

https://github.com/iMeiji/shadowsocks_install/wiki/%E5%BC%80%E5%90%AFTCP-BBR%E6%8B%A5%E5%A1%9E%E6%8E%A7%E5%88%B6%E7%AE%97%E6%B3%95#%E5%BC%80%E5%90%AFbbr

利用kcpraw流量加速

2017-11-18 16:36:55

2015年2016年,我写过两篇关于 科学上网 的博客,之后,又在VPS上安装了v2ray,这个应用直接支持mKCP,在丢包严重的网络环境下效果不错。

然后是最近,为了贯彻**大精神,实现什么什么自信的目标,KCP依赖的udp包被自信的家伙们无情地屏蔽了。在标准的shadowsocks和使用websocket的v2ray下,网速在50k左右,我感觉自己的网瘾又要发作了——

以上是背景。

虽然UDP被屏蔽了,但是TCP暂时还幸免于难,所以,可以把UDP包伪装成TCP的样子来绕过检查。有两个程序可以实现这种功能:

在这里使用kcpraw包装原来shadowsocks的流量(纯粹是因为virtualbox没配好用不了udp2raw),假设读者有基本的linux知识并已经部署了shadowsocks。

服务器端

下载kcpraw

mkdir ~/kcpraw
cd ~/kcpraw
wget https://github.com/ccsexyz/kcpraw/releases/download/v20171019/kcpraw-linux-amd64-20171021.tar.gz
tar zxvf kcpraw-linux-amd64-20171021.tar.gz

在后台开启kcpraw

 sudo -b nohup ~/kcpraw/kcpraw_server_linux_amd64 -t "127.0.0.1:443" -l ":8388" -mode fast2 &

其中,443是要包装的shadowsocks端口,同时,8388是kcpraw使用的端口,请保证服务器防火墙允许8388端口通过。

客户端

安装winpcap(如果客户端是Windows的话)

对于最新版本的Windows10,原版的winpcapwin10pcap似乎都不能用,可以使用兼容的npcap

运行kcpraw

kcpraw_client_windows_amd64 -r "<服务器IP>:8388" -l ":1082" -mode fast2

其中1082是设定的本地kcpraw端口。

修改shadowsocks客户端配置

在你使用的客户端中把服务器地址设为localhost:1082,其余不变,即可使shadowsocks享受KCP加速。

天气越来越冷,似乎离互联网白名单也越来越近了。到那时,我可能会换一个爱好,比如做一个伟大的白日梦什么的。

Aeolipile boiling: Your blog (with code and formula) on Steem!

2017-11-12 22:12:00

These days I was busy tinkering with Aeolipile. Now it has more exciting features! Wanna know what is Aeolipile? See the posts above!

Now we have author page!

It has been at the checklist for a long time! A big fan of a Steemian? Here's a place for his/her any post at https://heyeshuang.github.io/aeolipile/#/@<USERNAME>!

For example, you can find @Elear's posts at https://heyeshuang.github.io/aeolipile/#/@elear, or my posts (contain some Chinese) at https://heyeshuang.github.io/aeolipile/#/@heyeshuang.

And finally, Aeolipile as your own blog!

Like aeolipile? Now you can bring it home!1 I have added blog mode to the page, which makes it possible to deploy aeolipile for your post only! In other words, a personal blog!

Check the instance of aeolipile-blog at https://aeolipile-blog.netlify.com/.

See the difference? A tidy URL without anyone else, like other blog systems do! You can modify the domain name, the title and anything you can imagine!

So, how can I get one?

And that's all! Enjoy!

Or if you are a guru developer...

Feel free (as in freedom) to star, fork and contribute to https://github.com/heyeshuang/aeolipile/! Basic config is at /src/config.js, and the CSS file /src/typo/typo-fangsong.css is for the typography. Transform aeolipile to your favourite! And don't forget to pull your code to me!


  1. Not responsible for damage, theft, etc. It bites! ↩︎

Aeolipile update: new theme, link generator and more!

2017-11-06 19:17:38

A few days ago I introduced Aeolipile, a steem post reader designed for coders, providing some advanced features. And now, it becomes more powerful!

As usual, you could see this post here.

You may wonder how did I get the post link before submit the post. The answer is: link generator. Just input your username and post title, and you'll have the Aeolipile Link(tm)!

2.gif

The generator uses the identical technology with Steemit, and is compatible with any language.

So, next time you write your post at Steemit (or other) editor, you may want to:

And this article will link to Aeolipile even before publish!

New loading page

1.gif

Stops everyone from getting bored!

and brand new theme!

With Chinese characters in mind (of course), I have carefully chosen proper fonts for both Chinese and English. Head to https://heyeshuang.github.io/aeolipile/#/@heyeshuang/hugo to see a Chinese example! Or, watch this post on Aeolipile, if you haven't!


And this is not the end, I still have some dark thoughts... Anyway, welcome to fork, push and comment! Your opinions and ideas are precious.

社交恐惧症患者也想用Steem,所以我做了Aeolipile

2017-11-04 11:55:46

TL;DR: 你可以在这个链接看到Aeolipile。

我曾经说不会把博客完全搬到Steem上。除了之前说过的原因之外,还有一些感性上的理由。

和那些网红博主(开玩笑的)不同,我的博客没有什么人会光顾,这并不是什么坏事:只有这样,我才能感到真正的自由。

但是Steemit不同。页面下面的评论框和小数字,这些东西时刻在提醒我,你的文字是有人看的。对其他人来说,这可能是一件好事。可是,对于我来说,意识到有人在看这些东西,让我不自觉地在意起别人的感受了。我在敲键盘的时候,常常会想:“别人是怎么看这段话的?”然后,强烈的自我厌恶就会让我没办法接着写下去了。

而那些小数字更是推波助澜,它们直接给我的文字标上了一个价码,然后跟我说:“大家好像不太喜欢你的东西啊,这次只有这些,下次继续努力吧。”

可是我是因为喜欢才踢罐子的啊。1

如果我的内心能够更强大一点的话,我当然可以说:“F**k yourself,老子乐意”。但是显然现在的我还不行。所以,我做了这个Aeolipile,来 暂时 平复一下内心的情绪。

言归正传。Aeolipile是一个Steem文章的渲染工具,(明面上的)用途是为了增强Steemit的Markdown功能,比如说代码、公式什么的。比如这篇文章,可能也需要访问这个页面才能看到脚注。具体支持的功能,可以看这篇文章。大体上说,你可以在这里使用几乎所有Markdown的扩展语法。(而且之后我可能会把页面做得更好看些……也许)

已有的文章都可以用Aeolipile渲染,只要访问这个页面就行:

https://heyeshuang.github.io/aeolipile/#/@作者名字/文章链接/

和Steemit本身链接的构成差不多。

如果你也想使用这个工具的话,我建议:

这个工具本身是开源的:

https://github.com/heyeshuang/aeolipile

欢迎fork,如果不嫌弃代码写得烂的话。

最后,我还想说一句台词:

I could be bounded in a nutshell and count myself a king of infinite space.2

当然,没准一个Aeolipile也行。

2017-11-04 11:48:41

我坐在家里自己的房间,母亲在外面忙碌。

我突然发现我爷爷坐在我旁边;他被一排椅子挡住,我只能看到他的白发和皱纹。

“您是回来看我了吗?”我想起身看他的脸,好像看到他对我笑了一下。

现在想起来,当时我可能意识到了什么,但是没有发现这是一个梦。

如果世界上真的有灵异事件该多好——我,一个飞面神教信徒,突然有这样的感觉。

Aeolipile: your code and formula on Steem

2017-11-02 19:17:38

https://heyeshuang.github.io/aeolipile/#/@heyeshuang/aeolipile-your-code-and-formula-on-steem

Please click ↑ to read the post!

Steem is a blockchain-based rewards platform for publishers to monetize content and grow community. However, the Steemit editor does not provide advanced markdown features, like code highlight, mathematical notation, etc. The lack makes it hard to write technical posts on Steem.

So I made this webpage to render Steem discussion with more markdown syntax enabled. Then we can use Steem for some...boring contents.

Usage

You can easily append author name and post link after https://heyeshuang.github.io/aeolipile/#/, like this:

https://heyeshuang.github.io/aeolipile/#/@USERNAME/PERMLINK/

Similar with the Steemit URL. And you can simply add this link before your post, just like me. :wink:

Features

With markdown-it, you can get almost every feature for GitHub Flavored Markdown .

Code!

Place your code between ``` like this, then you'll get a codeblock:

require 'redcarpet'
markdown = Redcarpet.new("Hello World!")
puts markdown.to_html

Math!

You can write TeX between $$ tags.

$$\hat{y}= \sigma(\omega^T X+b)=\frac{1}{1+e^{-(\omega^T X+b)}}$$

Emoji!

:)

Other advanced stynax!

You can check https://heyeshuang.github.io/aeolipile/#/@sean0010/markdown-test for the markdown test. Almost everything!

and ...

This page is not a replacement of steemit.com or else, so I will keep it simple & stupid. Welcome to fork me at https://github.com/heyeshuang/aeolipile!

2017年的fontconfig设置

2017-10-29 13:40:50

都7012年了linux还要自己设置字体……

不过思源(Noto)系列字体真的是开源界的福音,字重多,字符全,自带hinting,长得还漂亮,换上以后整个系统都显得高级起来了~

为了获得“高级感”,首先你需要安装noto-fontsnoto-fonts-cjk。因为是7012年,中文字体里自带的英文字符也不算太丑,所以不需要像ArchWiki这篇博文一样,分别定义中文和英文。全用Noto就好!(而且,分别定义的方法在chrome上有些小问题……)

~/.config/fontconfig/fonts.conf的内容附在这里,保存之后用fc-cache --force --verbose更新字体缓存就行了。

接下来是截图时间:

这才是真正的宋体

在正文也毫无压力

还有这个light字重

题外话,中文可用的字体实在是太少了。因为SimSun太渣,windows下的中文连个可用的serif字体都没有,每天只能对着呆板的雅黑干瞪眼……

不要脸的乞讨时间

2017-10-28 18:42:21

乞讨

万一有人想给我转账呢……梦想总是要有的……

所以说下面是我的各种钱包地址……

为hugo加入数学公式支持

2017-10-22 13:37:58

数学学渣也要公式?其实我也不清楚我要这个有什么用……反正先弄了再说。

官方文档中其实有这一部分内容,但是那里是用MathJax的,而且在标准markdown文件里需要进行额外的设置。如果像这里一样使用KaTeX+Mmark,写起来会方便许多。

Hugo自带Mmark的支持,只要在新建文章的时候使用.mmark后缀就行:

hugo new post/some-name.mmark

这种格式是markdown的超集,本来是用来写IETF文档的。具体支持的语法可以看这里

用这种渲染器,用$$包裹的文字会自动转成用\[或者\(包裹,比如, inline $$\sqrt{b^2-4ac}$$会转成\(\sqrt{b^2-4ac}\)

之后,只要修改主题,把$$\KaTeX$$引用进去就好了。对我自己使用的主题,改动见这里

效果如下:

行内公式:$$\sqrt{b^2-4ac}$$

单行公式:

$$\hat{y}= \sigma(\omega^T X+b)=\frac{1}{1+e^{-(\omega^T X+b)}}$$

另外,还有一种更加复杂的<shortcode>方法,如果你是完美主义者的话。

更琐碎的编辑器细节 / Some more trival details about Steemit

2017-10-14 23:04:00

Steemit的前端代码在https://github.com/steemit/condenser/,读一读它的源代码,可以了解一些关于编辑器的技术细节。

排版问题

Markdown

Steemit里所有的markdown指南都指向https://guides.github.com/features/mastering-markdown/,但其实并没有实现其中所有的功能。大体上,使用其中标准的 Basic syntax (或者叫做CommonMark)是比较安全的,但github favor的部分就说不定了。

编辑器使用的markdown渲染库是remarkable。除了基本语法以外,只支持脚注、删除线和表格等一些基本的语法,而且现在脚注的实现还有些问题。没有 代码高亮 ,更没有 数学公式渲染 ,可能这东西并不是面对我们这样的用户。

这里是关于高级markdown特性的测试。从这里可以看到其源码。

顺便一提,我用的hugo静态博客生成器使用blackfriday,配置项很多,我十分满意。

那么用HTML实现高级功能呢?

很遗憾,这也不大可能。经过sanitize过滤,编辑器只支持以下几个标签:

div, iframe, del,
a, p, b, i, q, br, ul, li, ol, img,
h1, h2, h3, h4, h5, h6, hr,
blockquote, pre, code, em, strong, center,
table, thead, tbody, tr, th, td,
strike, sup, sub

并没有什么超过Markdown语法的新功能。

当然,编辑器好心地提供了几个class来控制文字和图像的位置:

'pull-right', 'pull-left', 'text-justify', 'text-rtl', 'text-center', 'text-right', 'videoWrapper'

用法大概是 < div class="pull-right"> < img src="imglink" />< /div >,或者看这里的介绍。

文章的URL生成原理

如果我在发布之前就知道文章的URL的话,就可以在文中引用自己了。这大概是一种自举 ;-)

如果你的文章标题是纯中文的话就很简单了:地址是随机的。所以最好在标题里加上些英文(虽然看起来有点蠢)。

URL通过speakingurl生成。比如,本文标题经过处理(过程见此处),得到some-more-trival-details-about-steemit,如果我之前没有发过同名文章的话,本文的URL就是https://steemit.com/cn/@heyeshuang/some-more-trival-details-about-steemit,大概。

这里是源代码中具体的实现函数,适合像我这样刻薄的人。

对Steem的一些细节考察 / A closer look to Steem

2017-10-08 22:56:21

我的文章保存在哪里?会保存多久?

保存在各个矿工 (Miner / Witness Node) 的区块链上;很可能是永久保存。

和大多数区块链技术一样,一个矿工必须有完整的节点信息才可以进行挖矿。当然,具体的挖矿形式有一些区别,steem不需要超强的计算能力去破解hash,但是要求很低的网络延迟。

这听起来好像跟IPFSZeroNet差不多。分布式存储并不是什么新鲜事物,很久以前的bittorrent,emule什么的就已经做到了,但是问题是什么呢?

当你上网去寻找一份200x年的、并不是十分热门的资料,但是只找到一个种子的时候,问题就出现了:这份信息被网络所遗忘了,也就是说,它死掉了。一份信息的死亡,并不是因为它自己有什么问题,只是因为不够红而已。

当然,如果你恰巧拥有(原来的)迅雷会员,故事又将另当别论。在这个方面,商业公司比分布式存储更善良,或者说,记忆力更好。但是,当商业公司倒闭/转型/关闭离线下载服务的时候,我们就只能去爬虫的巢穴碰运气了。

举个例子。在榕树下如日中天,起点还没有出现的时候,我曾经看到过一篇名为《魂系大榕树》的知青文学,那种生活深深吸引了年幼的我。但是,这几天我再去找的时候,榕树下早已不复当时的枝繁叶茂,而且那篇文字,名字改成了《榕树魂》,散落在了互联网的各个角落。

听起来十分先进的IPFS和ZeroNet似乎并没有解决这个问题。现在,ZeroNet上搭建的一些网站已经无法访问了。但是,虽然Steem的评分规则也极端倾向热门文章,但这种技术确实让我看到了冷门信息生存的希望:

所以,Steem的各位,希望你们能够尽量产出更多的优秀内容,托你们的福,像我们这样不讨人喜欢的家伙们,也可以在互联网上找到一个不会被轻易遗忘的地方。

那么,我可以把自己的博客搬到这里来吗?

对我来说,暂时还不行。

正是因为Steem的记忆力太好,想要抹掉什么几乎不可能,所以很多东西并不适合写在上面。另外,一些 特别 不讨人喜欢的东西,我也不会放到这里,请移步我的博客

气温骤降,我必须更加谨慎一些。

另外的一些细节

Steemit使用的markdown解析器是remarkable,并通过sanitize对HTML进行清洁。更加精细的排版问题,我会另外找时间尝试一下。

在Hugo中折叠部分内容

2017-10-07 22:25:35

之前疯狂粘贴自己的扩展 凑字数 的时候,我发现这种又臭又长的列表需要稍微隐藏一下,但是这里用的静态博客生成器 Hugo 并不原生支持折叠。所以,我利用 shortcode 功能自己写了一个。

Shortcode 的介绍在这里,主要难度在于go的html模板引擎。

折叠部分用了 HTML5 的新特性:<details>,不支持 edge,这个浏览器应该没有人用吧……

下面是shortcode的代码,放在/themes/<THEME>/layouts/shortcodes/spoiler.html下:

shortcode,点击展开

<details>
<summary>
 <h4>
 {{ with .Get 0}}{{.}}{{else}}click to expand{{ end }}
 </h4>
</summary>
{{.Inner}}
</details>

用法是这样的:

{{% spoiler "You killed my father!" %}}
I am your father.
NOOOOOOO!
{{% /spoiler %}}

当然,我还稍微改了一下CSS,之后会在模板里面更新。

spoiler在steemit社区的讨论:https://github.com/steemit/condenser/issues/8

Brave New World: Firefox to Quantum

2017-10-01 10:29:28

在把现在的配置导入Waterfox之后,就可以升级Firefox Quantum了。强烈建议用离线模式启动,并取消登陆Firefox账号,防止污染自己的同步内容。

不支持的扩展页面,自带“查找替代品”功能,但是基本没有用,不如这个列表卡饭的帖子

另外,基于WE的扩展页面都有一种廉价感,不像XUL画的窗口那样专业——当然这只是我的偏见。

新Firefox一个进程的内存用量都快赶上整个Waterfox了,我怀疑这是三星的阴谋。

等等,servo是不是跟三星有关系来着……

下面是我安装扩展的完整列表,很长,没有什么用 可能会有点用

不兼容的扩展

原生Web Extension

Yesterday Once More: Firefox to Waterfox

2017-09-30 23:44:33

Firefox Quantum(就是Firefox 57) 发布了 beta 版,主动放弃了XUL和老版本扩展。我不知道这会不会又是一个“燃烧的平台”,只想体验一下Quantum传说中的新技术——顺便看看和Chrome有什么区别。

当然,在升级57之前,需要给 Firefox 的状态存个盘。Waterfox是一个很好的选择:

迁移

迁移的过程还是很简单的:只要还没升级到57,就可以用FEBE扩展进行备份和恢复。注意在恢复到Waterfox的时候(选择“恢复配置”),需要新建一个Profile。

中文

为了显示中文界面,需要安装Chinese Simplified (zh-CN) Language Pack,并访问about:config,将intl.locale.matchOS改为true。这样,Firefox Waterfox就可以按照系统的语言来显示了。

Pentadactyl

Waterfox默认开启了多进程模式,会导致Pentadactyl不能正常工作:

Error: Permission denied to access property "length"

仍然是在about:config页面,查找browser.tabs.remote.autostart,把所有找到的项都改成false

browser.tabs.remote.autostart=false
browser.tabs.remote.autostart.2=false

OK,保存完成,是时候升级Firefox Quantum了。

啊对了,本文同时发在我的博客Steemit上。基于时髦的区块链技术,应该会让我的博客活得时间稍微长一点。

——当然,一些更加私人的东西是只会在我的博客上发的。为了躲避猎人,有时候我需要把自己的脚印扫掉。

首都图书馆半日游

2017-09-09 12:44:02

之前说过我因为网瘾被送去荒山改造,不得不说,这还是颇有些效果的。比如,上上周日我久违地踏出了屋门,而且也并没有被阳光化为灰烬。也许再过上几个月,我可能能够真正地过上人类的生活——

这当然是在开玩笑,除了我踏出屋门这件事以外。那天我去了首都图书馆。拿到了教官/总长/特首的出门许可之后,中午,我穿过垃圾场,跳过泥潭,走过柳林,再从围墙的缺口钻过去,然后,又回到了文明世界。

我的部分旅途,右上角为文明世界

我真正到达的时间已经是下午了。站在首都图书馆的门口,我深深地吸了一口气——随即被臭豆腐的气味呛到——走了进去。

也许大多数图书馆都会把 棒针编织实用五金手册 放在一起,并在后面的书架上摆上一本川菜烹饪指南。但是,把J和TP类型的书扔到同一处的,我只见过首都图书馆一家。在我拿出一本男中音教材,想知道声乐有几种唱法的时候,可以瞟到一些男人,带着高耸的发际线、以及更加厚重的书籍,慌张地走来走去。那些书名虽然是中文,但总是夹杂着一些不知所云的英文单词。

不远处,有人蜷曲在凳子上,盯着腿上的一本《红楼梦》,一枚金属书签反射出刺眼的光芒。高大宽敞的桌椅很多,大多数被纸、笔、笔记本和笔记本电脑占据,那上面的文字大概与会计、法律、英语或计算机相关,或许这些才算是图书馆真正的主题。

窝在凳子上,我登陆图书馆网站,搜索《哥德尔、艾舍尔、巴赫》,我曾经尝试翻开这本书很多次,今天,它指引我去另外一座建筑,然后拒绝了我。沉迷网络时,我顺着超链接快速前进,可能走得太过遥远了。今天,看着门上“闭馆”的标志,我决定漫无目的地漂流一会儿。于是我找到一本塔罗牌意解释,随便翻了几页。

“这张牌的逆位并不是这个意思!异端!”忍住了把这本书送上火刑架的冲动,我离开了图书馆。几个小时之后,我穿过了围墙的缺口。在阴暗的柳林前面,有一条黄狗趴在路上,我们对视了几秒钟。接着,它慢悠悠地爬起来,向着另一边走去。我应该是摇了摇尾巴,跌跌撞撞地穿过泥泞的树林。

本文部分描写是虚构的。我并不在那种地方;没有什么教官;而且也不想过人类的生活。

互联网带来了极大量的信息,远远超过了个人的接受能力,于是,通过兴趣、习惯和“智能推荐”,我们选择了部分信息摄入,而这部分信息会使人“上瘾”,对另外的信息视而不见或产生负面的情绪。这可能会造成个人对于人群平均值的距离提高,影响人类社会的基础——同理心。

当然,这也是建立在我所获取的微量信息上的偏见,而且我会把这一段隐藏,因为如果我们意见不统一,你就不会再喜欢我了。

关于那个IME helper

2017-09-06 19:46:55

昨天前天我用鸟语写了一篇贼 正经说明,今天,我准备稍微介绍一下那里面的IME helper

正如之前所说,那东西是为了配合atom插件自动开关输入法用的。问题明确、思路清晰,google一下肯定有人做过……才怪呢

嗯,这种需求,我听过一个叫AHK的语言……

;来自https://github.com/lspcieee/lspcieee_ahk/blob/master/IME.ahk
;没有任何要黑别人的意思,将来报道出了偏差,你们(下略)
setChineseLayout(){
 ;发送中文输入法切换快捷键,请根据实际情况设置。
 send {Ctrl Down}{Shift}
 send {Ctrl Down},
 send {Ctrl Down}{Shift}
 send {Ctrl Down},
 send {Ctrl Up}
}

哇这语言真的是发送快捷键的哦!就没有什么更高级的方法吗?快捷键在win10里可是改了啊( >﹏<。)

然后就愉快地决定用 Python+ctypes 干这种脏活了,然后发现:windows API真是太难写了!一个更改输入法有4种写法!而且都不能用!

最后居然还是抄的AHK社区的东西……亏我还像白痴一样疯狂翻MSDN……

另外,pyinstaller生成的单文件exe跑得不够快用起来有延迟,大概是因为解压吧……

Auto-Switch IME in Vim-Mode-Plus for Atom Editor

2017-09-05 21:03:41

Update 2018-5: Now vim-mode-plus introduced new method to disable IME in the setting page. It's time for this post to retire.


As a vim-user and Chinese-speaker, I prefer vim-mode-plus for Atom editor, but always disrupted by the IME in normal mode, like this:

IME-in-atom

If we could disable IMEs in normal mode then everything will be fine again. However, due to the lack of the APIs, it is hardly possible to solve the problem in the editor.

Thus, we could solve it out of the box. There is a package named atom-vim-mode-plus-auto-ime, which could run a custom command when the mode changes. The goal now is to find some commands to control the IME:

Then we could configure this package.

#windows:
python E:\\path\\to\\ime_helper.py --current #Get Current Input Source
python E:\\path\\to\\ime_helper.py --dec ${source} #insert
python E:\\path\\to\\ime_helper.py --locale en_US #normal
python E:\\path\\to\\ime_helper.py --locale en_US #visual
#linux:
/usr/bin/fcitx-remote #Get Current Input Source
if (( "${source}" <= "1" ));then /usr/bin/fcitx-remote -c; else /usr/bin/fcitx-remote -o ;fi #insert
/usr/bin/fcitx-remote -c #normal
/usr/bin/fcitx-remote -c #visual
#macOS: just use the default config

configure

短消息:联通IPV6

2017-09-03 23:11:32

似乎是使用teredo。Good Job!

IPV6测试

PT测试

在网络的荒山野岭

2017-08-12 13:04:03

今年七月从学校滚蛋以后,我来到了某个不能说的国企。住在国民党留下来的建筑物里面,我看着被剪断的网线,感觉自己的指甲在疯狂生长。

然后,我就——当然没有成为变态剪线狂,而是办了一张电信的磅礴卡

而且这速度居然可以看斗鱼

于是,我与文明世界通过,嗯,无线电波,再次连接到了一起。我应该赞美现代科技,虽然网速和我高中时候的2m宽带没什么区别——或许更不稳定一些,但是可以把这个称作“现代科技的代价”。

还想说明的是,我的一加3在开启USB网络共享之后,可以完美地被Arch Linux(或,Manjaro Linux)识别为有线网卡,而且WLAN网络共享也没有了很久之前ad-hoc还是什么的问题。当然,同时连上两个设备之后,斗鱼就开始转圈了。我是不是对它要求太高了?

好的,大概就是这样,之后也许还会更新 用户体验 ,如果我还没有把线接上,而且还没有被网瘾或者其他的什么吞噬的话。

迁移到hugo,第三部分:可是我想要更多的feed地址…

2017-06-12 22:25:07

之前在 http://heyeshuang.tk 这个域名下的时候,wordpress提供的RSS feed地址格式类似 http://heyeshuang.tk/feed/ ,但是hugo提供的RSS地址是index.xml样子的,而且我翻遍了manual也没看到给RSS加alias的方法。

所以只能改模版了,思路是把/feed目录的列表页渲染成RSS的样子,我是直接在主题里面改的:

\themes\<主题名字>\layouts\feed\list.html

<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
 <channel>
 <title>{{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}{{ end }}</title>
 <link>{{ .Permalink }}</link>
 <description>Recent content {{ if ne .Title .Site.Title }}{{ with .Title }}in {{.}} {{ end }}{{ end }}on {{ .Site.Title }}</description>
 <generator>Hugo -- gohugo.io</generator>{{ with .Site.LanguageCode }}
 <language>{{.}}</language>{{end}}{{ with .Site.Author.email }}
 <managingEditor>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</managingEditor>{{end}}{{ with .Site.Author.email }}
 <webMaster>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</webMaster>{{end}}{{ with .Site.Copyright }}
 <copyright>{{.}}</copyright>{{end}}{{ if not .Date.IsZero }}
 <lastBuildDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
 <atom:link href="{{.Permalink}}" rel="self" type="application/rss+xml" />
 {{ range .Site.RegularPages }}
 <item>
 <title>{{ .Title }}</title>
 <link>{{ .Permalink }}</link>
 <pubDate>{{ .Date.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
 {{ with .Site.Author.email }}<author>{{.}}{{ with $.Site.Author.name }} ({{.}}){{end}}</author>{{end}}
 <guid>{{ .Permalink }}</guid>
 <description>{{ .Content | html }}</description>
 </item>
 {{ end }}
 </channel>
</rss>

基本上就是hugo自带的RSS模板,除了把{{ range .Data.Pages }}改成了{{ range .Site.RegularPages }},因为我需要生成整个网站的RSS。另外,修改过的主题在https://github.com/yoshiharuyamashita/blackburn,稍微改了一些小bug,还换了个颜色。哪天我要把名字改成greenfreeze。

然后别忘了新建一个\content\feed\chicken.md

---
title: 'chicken'
author: HeYSH
date: 2012-06-22T06:32:32+00:00
aliases:
 - /%3ffeed%3drss2
---
Nothing here.

当然,类似/?feed=rss2这样的地址就用不了了,我试过的。

由wordpress到hugo:I

2017-06-07 22:14:47

我之前的wordpress博客是建在redhat公司的OpenShift服务上的,距上次我更换博客后台过了快两年时间,wordpress(或是PHP)再次把空间占满了,而不懂PHP的我只能对着SFTP干瞪眼。于是,我又种了一棵新的树苗。

wordpress的文章是通过wordpress-to-hugo-exporter导出的,但是导出的文件有一些小问题:

对于正文,可以用pandocpypandoc转换:

import pypandoc,os
root = "./content"

for rt, dirs, files in os.walk(root):
 for filename in files:
 with open(os.path.join(rt, filename), 'r', encoding='utf-8') as fin:
 data = fin.read()
 ds = data.split('---')
 ds[2] = pypandoc.convert_text(ds[2], 'md', format='html')
 do = '---\n'.join(ds)
 with open(filename, 'w', encoding='utf-8') as file:
 file.write(do)

其他的……手改保平安……

……

……………

漫长的修改过后,用hugo server -w预览。

这时候还有一个小问题:hugo生成URL不一定遵循文件头url定义,比如,对 /2016/06/13/qart-coder:更友好的qr码/hugo会解析为/2016/06/13/qart-coder更友好的qr码/。看出区别了吗?

为了保证(不知道和谁的)兼容性,可以在文件头中增加aliases行,可以将原来的地址转发到新地址。

同样的,我也写了一个辣鸡脚本:

import pypandoc
import os
root = "./content"
for rt, dirs, files in os.walk(root):
 for filename in files:
 with open(os.path.join(rt, filename), 'r', encoding='utf-8') as fin:
 data = fin.readlines()
 try:
 urlIndex = [n for n, l in enumerate(data) if l.find("url:") != -1][0]
 url = data[urlIndex].split("url:")[1]
 aliasLine = " -" + url
 data.insert(urlIndex + 1, aliasLine)
 data.insert(urlIndex + 1, "aliases:\n")
 except:
 pass
 with open(filename, 'w', encoding='utf-8') as file:
 for d in data:
 file.write(d)

迁移到hugo,第二部分:部署到github

2017-06-07 22:07:44

书接上文 (虽然我是先写的这一篇),当我们有了一个可用的hugo目录后,就可以把它部署到github等静态网页托管服务了。如果你的强迫症不是很严重的话,可以把/public目录直接push到新的repo里;不过如果为了得到一个整洁的主页,可以用同一个repo的master分支保存源文件,gh-page分支来展示,像这里说的那样。

这里假设你已经init过了你的hugo目录:

# Create a new orphand branch (no commit history) named gh-pages
git checkout --orphan gh-pages

# Unstage all files
git rm --cached $(git ls-files)

# Grab one file from the master branch so we can make a commit
git checkout master README.md

# Add and commit that file
git add .
git commit -m "INIT: initial commit on gh-pages branch"

# Push to remote gh-pages branch
git push origin gh-pages

# Return to master branch
git checkout master

# Remove the public folder to make room for the gh-pages subtree
rm -rf public

# Add the gh-pages branch of the repository. It will look like a folder named public
git subtree add --prefix=public <你的.git地址> gh-pages --squash

# Pull down the file we just committed. This helps avoid merge conflicts
# 这里我先push了一次,否则会出现fatal: refusing to merge unrelated histories
# 好像是git的bug
git subtree push --prefix=public <你的.git地址> gh-pages
git subtree pull --prefix=public <你的.git地址> gh-pages

hugo

# Add everything
git add -A

# Commit and push to master
git commit -m "Updating site" && git push origin master

# Push the public subtree to the gh-pages branch
git subtree push --prefix=public <你的.git地址> gh-pages

之后每次更新需要

hugo
git add -A
git commit -m "some messages"
git push origin master
git subtree push --prefix=public <你的.git地址> gh-pages

像我这样的强迫症可以把主题也做一个subtree出来。

Dota 2里,什么技能的冷却时间最短?

2017-03-25 21:13:15

答案是各种法球~开玩笑的~

最近沉迷Dota2的一个RPG: Legends of Dota:Redux(当然是人机),在挑技能的时候常常需要一些短cd的技能,但是wiki里居然没有技能冷却时间的排序!

所以我就自己排了一个:https://gist.github.com/heyeshuang/8499513305ff5c92b16329f57a0f29c6

数据来源是客户端里面\dota2\steamapps\common\dota 2 beta\game\dota\scripts\npc\npc\_abilities.txt,在下可不是页游玩家!

这个文件看起来特别像是JSON,但是是用空格分割的,而且还有\\注释。本来把这东西转换成JSON才是工作的大头,可是我懒了:找到了另一个玩家的Dota 2 items.txt/npc_abilities.txt to xml/json tool v1.1,然后就是简单的排序了~

另外,除了法球,还有许多技能也是0秒CD的哦,比如幽鬼的降临什么的~

{
 "Name": " reality",
 "HeroName": "spectre",
 "ID": "5338",
 "Cooldown": 0.0
},

五年

2017-01-15 16:14:45

距离实现永生:5/∞

新的一年也要好好活下去哦~

用nethogs实时监控每个程序的流量使用

2017-01-13 20:25:31

适用于(没有cron和init的)debian 8.0

TIMEOUT=3600
TIMESTAMP=`date +%b_%d_%Y_%H_%M_%S`
OUTPUT=/var/log/nethogs/$TIMESTAMP.log
bash -ic "(/usr/local/sbin/nethogs -t -d 30&>$OUTPUT;kill 0;) | (sleep $TIMEOUT;kill 0; )" 3>&1 2>/dev/null
[Unit]
Description=Nethogs Daemon
[Timer]
OnBootSec=1min
OnUnitActiveSec=1h
[Install]
WantedBy=timers.target
[Unit]
Description=Nethogs run
[Service]
Type=oneshot
ExecStart=/root/monitor.sh
./hogs -type=pretty /var/log/nethogs/Jan_03_2017_09_20_36.log

为什么已经在Word里用M$的EMF格式了,图像还是不清楚?

2017-01-13 19:44:43

把EMF里的所有文字转换成路径就能解决了

应该是辣鸡windows的文字渲染问题

使用前 使用后

Word的bug在哪里报,挺急的

shadowsocks 2016: 一次性认证,KCP及其他

2016-10-25 21:03:46

今天下午我的Bandwagon服务器被人爆掉了,让人发了一大堆垃圾邮件,于是有了一个重装的理由。终于可以用服务器原生IPv6了~

距我上次配置shadowsocks服务端(2015.1)已经有一年半了,这次安装可以把上次没有加入的特性通通带上:

大概会稍微快一些吧……

对了,顺便配个iptables,象征性地防守下。


update 161122:

象征性的防守被漫不经心的进攻给破掉了,于是增加了一些稍微认真一点的防守:

最主要的,换了一个ip地址

Deus ex machina

2016-07-31 21:13:07

在真实生活中存不存在所谓的都合主义呢?

当睡过一场考试的时候,当被唾沫横飞地叱责的时候,当凝视着泛着莹莹白光的手机屏幕,却无法打出一个字的时候,当努力想要看清天花板,眼睛却被黑暗所刺痛的时候,我偶尔会想起这个问题。

也许会有一位闪闪发光的老人突然从阴影里跳出来,大喊“Deus ex machina”,一挥魔法棒,把一切处理的干干净净?

然后,王子和公主过上了幸福的生活,热烈鼓掌之后,故事就此结束,没有观众在意“Fin”的后面还有什么——以及舞台中央的活板门是怎么卸下去的。

在离席的时候,我并没有看到老人扯下胡子的样子。于是我依然想要相信奇迹。

然后现实继续滑落,就像牛顿所预测的一样。


今天读了《春宵苦短,(下略)》\

真是部洋溢着粉红气息的漫画(*´﹃`*)\

公主敲可爱(๑•̀ㅂ•́)و✧\

想喝伪电气白兰(๑´ڡ`๑)

 

QArt:更漂亮的QR码

2016-06-13 21:02:36

通过在网址后面加#tag,可以让QR码显示成更漂亮(是的,比中间贴膏药还要漂亮)的样子,Russ Cox管这个叫做QArt

在线生成网址:

效果还是蛮好的:\

刚写完,又在中文互联网上找到了另外一种思路:

http://spacekid.me/qart-code/

似乎更漂亮些的样子,不过对于像素控来说还是喜欢上面这个~

我失去了heysh.tk域名

2016-05-24 22:35:24

Dear 叶霜 贺,

The Freenom Review Team has visited your website today. Unfortunately we have to say that today we cancelled your domain HEYSH.TK.

The reason for the cancellation is that the website address you used for your free domain name was not accessible or did not follow the guidelines set in our terms and conditions.

At this stage, anyone, including yourself, is able to (re)register the cancelled domain HEYSH.TK. However, upon registration, an actual working website is needed to complete the registration process.

We thank you for using Freenom.

Freenom Review Team

Whatever.

之前的heysh.tk页面回到了heyeshuang.github.io,以上。

一个简单的在线LRC编辑器

2016-05-04 01:01:02

地址:http://heyeshuang.github.io/hieda-lrc-editor/

GITHUB:https://github.com/heyeshuang/hieda-lrc-editor

和依云这里差不多,我听到了一首悲伤的歌(精霊流し),也去找了歌词。在想要把歌词做成LRC文件的时候,我突然想起来,今年,2015年,千千静听已经不再存在了,而且我也不再有勇气到各种软件站下载来路不明的程序。

那么,就去做一个LRC编辑器吧!

——以上,是半年之前的事情了。

也许是拖延症的治疗有效果了,半年以后这东西居然真的跑了起来。这半年里我都跑了好几次……

另外,写前端/GUI真恶心……

另外的另外,名字来自稗田阿求,也许我应该换一个更萌一点的网页图标……

update: 萌萌的图标已经换了~

 

野路子科研工具二则

2016-03-21 22:28:29

读书人的事怎能算偷!

——小四

——拉比克

engauge digitizer

一个图表数字化程序,当你

的时候很管用

SCIHUB

免费午餐,比图书馆更好吃,用来对付抠门的出版社。

update:

我有显示器辣

2016-02-29 21:46:23

六年前的Y450在这个暑假挂掉了,获得杂牌SSD一个,屏幕一块,2G内存两条,上古CPU一个。

屏幕型号是LP140WH1,万能的淘宝上能找到支持的电视主板(搜索V29)。芯片是TSUMV29LU,支持HDMI、差分和VGA,还支持中二度爆表的隐藏菜单;不支持USB视频,不过也无所谓。配套的屏线是所谓的“40P,单6”。如果有像我一样无聊的家伙想知道更多的话,这里可以找到屏幕的datasheet——不过没什么用,基本上改改主板设置就行。

~~于是我现在的书桌长这样:~~照片没了没了~

多屏可以用ARandR管理。不得不说XFCE下的DPI处理比WIN10和KDE5好的多。

另外这篇博客是凑字数用的

pentadactyl 和 Firefox 43

2015-12-17 21:03:26

UPDATE: https://addons.mozilla.org/en-US/firefox/addon/pentadactyl-nightly-unofficial/别人的第三方编译版本


TL;DW: 百度盘GOOGLE DRIVE,编译好,签过名的版本,MaxVersion改到44;当然,不负任何责任。

众所周知,pentadacytl的nightly build已经坏掉好久了,现在的build在GitHub上,通过Travis CI编译,不明真相的我看得一愣一愣的。

另外,Firefox 43要求强制签名,幸好步骤还是挺简单的,先在install.rdf里把em:id="pentadactyl@mod"随便改一下,然后去这里上传就行了。别忘了把“不要在此网站上展示我的附加组件”勾上。

另外,firefox也发布了签名工具jpm,好像也可以放到Travis CI里面……

IPv6 season 2: 在DHCPv6网络环境下的OpenWRT Chaos Calmer

2015-09-09 21:58:27

背景:桥接3秒断一次的渣网,以及经常在我博客中出现的5手db120;还有经常更新以后把老版本脚本删掉的OpenWRT,这里用的是Chaos Calmer 15.05-rc3。

大概上思路和这里一样,因为学校给的地址位数只有/64,不够再去划分子网,所以要去启用邻居发现协议;但是因为6ndp,ndppdradvd都已经被始乱终弃,现在它们的功能被odhcpd给代替了。具体上,/etc/config/dhcp的关键几行大概应该是这样:

# /etc/config/dhcp:
config dhcp 'lan'
option interface 'lan'
option start '100'
option limit '150'
option leasetime '12h'
# option dhcpv6 'server'
option ra 'relay'
option ndp 'relay'
#config dhcp 'wan'
#option interface 'wan'
#option ignore '1'
config dhcp 'wan6'
option ra 'relay'
option ndp 'relay'
option master '1'

另外,还需要把luciinterface页面下的IPv6 ULA-Prefix删掉。

现在的问题是,LAN口和WAN口的IP地址是一样的,而且客户机必须先ping一下这个地址才能连接外网,有时候路由还要重启/etc/init.d/odhcpd;不管了,我先在这里存个盘。

有人说relay->hybrid也能成功的样子……我还没有测试过。

参考:

http://bbs.pku.edu.cn/new/bbs/article/showthread/Networking/15501646?1

http://ict.jingyan.info/openwrt-%e7%94%a8odpcpd%e9%85%8d%e7%bd%aerelay-%e6%96%b9%e5%bc%8f-ipv6/(链接不知道为什么已经失效了)

20160321更新:odhcp烂的抠脚,转用邪恶的IPV6 NAT,见这里

为什么我的手机用不了IPV6?

2015-08-23 22:25:21

背景:宿舍的无线是桥接模式,使用学校的DHCP服务器,另一台Android设备(寨板,4.4,Intel 3735)可以愉快地上网;这台设备之前也是可以用的,直到某次更新ROM前后,可能是5.1出没但CM组没人更新LG G2的那段时间。

症状:ip addr告诉我学校确确实实发来了(2402开头的真正的)IPV6地址,但是ping6 google.com显示Network unreachable,继续查找发现ip -6 route没有默认网关,就像这条ISSUE所说的一样。

解决方案:把内核参数改了就行。在su以后sysctl -w net.ipv6.conf.wlan0.accept_ra_defrtr=1可以坚持到下次启动。

更详细的说明见这里。简单概括一下,你需要在/etc/sysctl.conf里加上

net.ipv6.conf.wlan0.accept_ra_defrtr=1

这一行,然后每次启动尽量晚的以su身份运行sysctl -p就行,因为/init_qcom.sh运行的就挺晚的,所以直接写在/etc/init.d/里是不行的。

另外,这次应该是高通不知道在想什么user space,小米只是背锅。

另外,虽然可能看不出来,但是这个博客的后台已经换了一个。

无题

2015-05-18 16:29:24

突然想起一件小事。

那还是在初中的时候,班上有个同学的家庭似乎十分困难;母亲卧病在床,全家靠低保勉强维持—从班主任口中含情脉脉的话语,和全班同学低低的啜泣声中,传达的似乎是这样的信息。

在老师酝酿情绪的间隙,我偷偷地四处张望。当事人好像是满面笑容,或者说是”面容僵硬”——我一直不能分辨这细微的区别;而那些心地善良的人已经流下了晶莹的泪珠。

散场时月亮早已爬上了树梢,放学的铃声已经过去了一个半小时。在校门口的紫藤下面,一个问题挡住了我的去路:

“你刚才到底有没有哭?”

后来在布置的作文里,我写到:“回到家中,我的眼泪终于不争气地掉落下来。”

抱歉,这是假的——倒不如说,最后,我的眼泪仍然不争气地,没有出现。

事情已经过去将近十年,在我并不算漫长的生命中,居然也有了这样久远的回忆。然而,十年的时间,并没有给这个冷漠的人以稍许热量,只是把他包裹得更紧。偶尔从缝中透出的一丝寒气,便是所有拙劣悲剧的根源。

唯一值得慰藉的,是我在老实答“没有”的时候,作为回应的,如释重负的眼神。

于15年5月17日夜

罗马在哪里

2015-04-09 22:12:01

这是关于2月2号果壳和国王小剧场的故事。

我记得念过这样的怪诗:\

匈奴族的首长阿底拉
骑着马,
满身披着钢铁甲胄,
象坟墓般地阴郁和沉默,
在无人境中行走。
他的背后有一队乌云一样的大军在追寻着叫喊:
“何处是罗马?何处是雄伟的罗马?”

——高尔基,《在人间》

这是我很小的时候读过的书。封皮是米黄色的一套三卷,书页之间夹着酥糖的渣子,油渍扩散开来把纸张染成透明的微黄色;而内容却记不太清了,只记得阿廖沙家中无止境的争吵,小小的麻雀祭坛和上面这一首诗,还有,很奇怪的,老家里沙发套子在午后阳光下微黄的颜色。

当然,路过的旅行者,如果你也在找这一段文字的话,这首诗应该是波兰诗人约·波·扎列斯基(Józef Bohdan Zaleski,1802—1886)写过的一部抒情长诗《草原的精灵》(Duch od stepu ,The Spirit from the Steppe)。1877年俄译者译了该诗的一个片断,题为《阿底拉》。高尔基对这首诗的记忆并不准确,而我的记性不会比他更好。 


update 150419: 剧透醒目

TYPE-MOON / FGO PROJECT计划于今年年内推出智能手机游戏《Fate/Grand Order》,近日有关新Servant“Saber”的信息也已经曝光,而这个角色的声优将是能登麻美子。

大胸之王,阿提拉 from 《Fate/Grand Order》

匈奴王(18才)

请允许我做一个悲伤的表情~


Update 160816:

今天找到了记忆中的版本:

匈奴王阿提拉,
披甲戴盔走天下!
沿着荒无人烟的地方走去,
他面色阴沉,
像坟墓一样,一语不发。
他的武士们像一片黑压压的乌云,跟在他后面,大声叫喊:
哪里是罗马,哪里是强大的罗马?

稍微有一点押韵的感觉非常适合年幼的我。

2014年的总结

2015-02-14 23:44:05

寒假好闲啊~~~尤其是今天~~~~于是我来写博客了。

  1. 完成了毕业设计和毕业论文的撰写

等等我得稳定一下情绪……

shadowsocks,ipv6和便宜的VPS,还有OpenVPN

2015-01-07 23:05:56

那个……我还活着呢。

前几天睡不着的时候翻了一下这个博客,最后发布时间是去年的5月份。七个月的话应该是很多草本植物的一生了吧?幸好这里种的是树。

……算了过几天写一页年终总结来写这些充满腐烂气息的东西吧。今天是正经的技术环节,当然是剪切链接形式的技术。

那么首先是VPS,用的是便宜的Bandwagon(搬瓦工),因为穷,只买了64M内存的版本;因为没有信用卡(穷),用不了paypal,于是去淘宝找了一家代购,入手价格29¥/年。

然后是shadowsocks,按照这里的办法安装。根据这里的说法,就用python版的服务端就好。

为了看起来像是技术文档的样子,下面是/etc/shadowsocks.json:

{
"server":["[::0]","0.0.0.0"],
"server_port":443,
"local_address": "127.0.0.1",
"local_port":1080,
"password":"******",
"timeout":300,
"method":"aes-256-cfb",
"fast_open": false
}

update150208: “server” 行只写::0的话就是纯v6连接了……

最后是ipv6,在he.net申请tunnel breaker,因为便宜的VPS动不了内核,于是用TB-TUN弄一个用户态隧道,见~~这里~~这里这里,还有init.d的自启动脚本

update150409: 增加一个UStun的链接;更换了Googlecode的链接

Google带着小姨子code跑了!你王八蛋!你还我血汗码!

另外,chrome的SSH很好用,可以算是刚换电脑还没有买SSD装arch的人的福音。

update:听说libev版本的可以节省内存,安装方法在这里

update2:从这里看到可以在shadowsocks上飞OPENVPN,于是:

在服务器运行这个:

wget git.io/vpn --no-check-certificate -O openvpn-install.sh; bash openvpn-install.sh

然后设中转:

iptables -A INPUT -s 10.8.0.0/24 -j ACCEPT
iptables -I FORWARD 1 -s 10.8.0.0/24 -j ACCEPT
iptables -I FORWARD 2 -d 10.8.0.0/24 -j ACCEPT
iptables -I FORWARD 3 -j LOG --log-prefix "FORWARD-LOG "
iptables -I FORWARD 4 -j DROP

把在/root/生成的.ovpn文件复制到本机,这时我发现chrome并没有自带SCP……

在得到的.ovpn文件里加两行:

socks-proxy 127.0.0.1 1080
route [SHADOWSOCKS服务器地址] 255.255.255.255 net_gateway

然后去下客户端,不要手贱点xp版本,否则今天下午就没空写作业了~

如果windows的shadowsocks客户端支持UDP转发的话,这里就是终点了,否则,请将本机和服务端的.ovpn文件(etcopenvpnserver.ovpn)修改为tcp模式。

8.23:谨以此博文对领路人致敬。身处寒夜,你们为我们带来了微光。

红色楼梯

2014-05-16 23:09:05

用three.js试着做了点东西

Live demo : http://heyeshuang.github.io/three-stairs/

–你的下一句话是:“又做了没用的东西!”\

–是啊。\

–咦?这算是猜对了吗?

用于OPENWRT的流量监控脚本:wrtbwmon

2014-03-02 19:38:02

UPDATE at 15年平安夜:https://wiki.openwrt.org/doc/howto/wrtbwmon


在某次坑爹的网费改革之后校园网的免费流量变成了20G,于是流量监控这一需求变得迫切起来。Google之后,发现了这个脚本:wrtbwmon。不过这个是为dd-wrt设计的,而且也很久没有更新过了,要进行一些小修改才能用。

比如第24行,nvram在我这里挂掉了,于是我简单粗暴的把它改成了eth1``br-lan;还有那个publish函数,似乎是读取/etc/dnsmasq工作的,在OpenWRT上的对应文件似乎是/etc/dhcp.leases什么的,相应的167行也稍稍修改了一下……

TL;DR:请在这里下载修改过的版本,在本人的2成新db-120上测试通过。

把上面那东西扔到/bin里之后,在crontab里添上这么一段:

* * * * * /bin/wrtbwmon setup br0
*/30 0-3 * * * /bin/wrtbwmon update /tmp/usage.db peak
*/30,59 4-8 * * * /bin/wrtbwmon update /tmp/usage.db offpeak
*/30 9-23 * * * /bin/wrtbwmon update /tmp/usage.db peak
*/30 * * * * /bin/wrtbwmon publish /tmp/usage.db /tmp/usage.htm /tmp/dhcp.leases
30 * * * * cp /tmp/usage.db /root/usage.db
* * * * * [ ! -f /tmp/usage.db ] && cp /root/usage.db /tmp/usage.db

自带的教程写的crontab似乎跟OpenWRT不兼容……这里的一定是雨林木风精简版OpenWRT!

又及:为了凑字数,关于如何在nat后面使用isatap的方法参见这里

SFW:治疗拖延症的一次有益尝试

2013-12-21 15:24:39

在这里安装

源码

总而言之,是一个(某种程度上)减缓拖延症症状的脚本。

在“再刷15分钟论坛/微博/人人/豆瓣/etc.我就滚去写作业”这一情境下适用。

截图大概是这样的: 1 2

效果?在某些时候会有点用吧……

鸣谢:easydialog

对了,差不多又到了年终总结的时间了呢……

木漏れ日

2013-10-04 23:00:00

1

即使是在这种地方,偶尔也会有阳光透过来啊,一片枯叶这样想着。不过,也只是偶尔而已。

“天气越来越冷了。”一阵风吹过,几片叶子在空中旋转,然后一切又重回寂静。

2

月亮在林间的影子又是什么样子呢?

一次奇怪的firefox故障,还有,一个普通市民是怎么修电脑的

2013-09-08 23:22:01

有一天,我的firefox突然挂掉了。症状是chinese language pack无效,而且pentadactyl和ABP等一部分addons全都挂掉了——但是disable-enable之后又可以用,而且另外一些Addons居然好好的……

(中略)

解决:

用df检查磁盘空间,然后把/目录最大的文件夹干掉。顺便推荐一个软件:xdiskusage


没用的部分:

  1. 重新安装firefox(因为吃过好几次yaourt的亏)

  2. 无效。上Google,查资料,关键词”firefox 23 addon enable|disable”之类

  3. 尝试各种方法。无效

  4. 备份~/.mozilla/firefox/<乱码>.defaultprofile.ini

  5. (愤怒地)reset profile

  6. 问题没有解决

  7. 怀疑为权限问题,观察权限无异常。曾想递归把整个profile目录改为777~~(beast mode)~~,然后(用优秀的涵养)忍住了

  8. 干掉整个~/.mozilla/firefox/目录

  9. 出现欢迎界面(英文)

  10. 高兴地关闭Firefox,然后发现无法再次打开

  11. 尝试在terminal中打开,没有输出可用信息。顺便推荐tilda

  12. 观察\home目录,剩余空间2.0G
    <–最接近真相的位置,谁叫文件管理器(推荐spaceFM)看磁盘空间这么容易呢

  13. 到备份的<乱码>.default文件夹乱翻,找到一堆log,其中extensions.log有一段是这样的:

    2013-09-07 14:04:58 ERROR addons.xpi-utils: SQL error 13: database or disk is full at resource://gre/modules/XPIProvider.jsm -> resource://gre/modules/XPIProviderUtils.js:204
    2013-09-07 14:04:58 ERROR addons.xpi: Error processing file changes: [Exception… “Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [mozIStorageStatement.execute]” nsresult: “0x80004005 (NS_ERROR_FAILURE)” location: “JS frame :: resource://gre/modules/XPIProvider.jsm -> resource://gre/modules/XPIProviderUtils.js :: XPIDB_rollbackTransaction :: line 457” data: no] at resource://gre/modules/XPIProvider.jsm -> resource://gre/modules/XPIProviderUtils.js:457
    2013-09-07 14:04:58 ERROR addons.xpi: Error during startup file checks, rolling back any database changes: [Exception… “Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [mozIStorageStatement.execute]” nsresult: “0x80004005 (NS_ERROR_FAILURE)” location: “JS frame :: resource://gre/modules/XPIProvider.jsm -> resource://gre/modules/XPIProviderUtils.js :: XPIDB_commitTransaction :: line 442” data: no] at resource://gre/modules/XPIProvider.jsm -> resource://gre/modules/XPIProviderUtils.js:442
    2013-09-07 14:04:58 ERROR addons.manager: Exception calling provider startup: [Exception… “Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [mozIStorageStatement.execute]” nsresult: “0x80004005 (NS_ERROR_FAILURE)” location: “JS frame :: resource://gre/modules/XPIProvider.jsm -> resource://gre/modules/XPIProviderUtils.js :: XPIDB_rollbackTransaction :: line 457” data: no] at resource://gre/modules/XPIProvider.jsm -> resource://gre/modules/XPIProviderUtils.js:457

  14. 新关键词GET,查询结果乱七八糟。

  15. 怀疑sqlite有上限:database or disk is full

  16. 对于(不会SQL)的一般小市民,再次查询,未果

  17. 注意到脑内自动添加的删除线,删除删除线

  18. 跳至解决部分

总结:

fcitx的各种小功能

2013-08-23 21:39:02

首先是吐槽时间:藏得这么深谁找得着啊!!好多帅气的小功能连按钮都没有!!连快捷键都要四个按键一块按!!!

颜文字

钥匙是分号

对,就是那个不知道怎么回事的“快速输入”。比如说,输入;smile就是(・∀・),什么你说你看不懂英文?到这里,复制到一个文件里,然后导入就行了~

为什么不直接集成呢?谁知道呢……

输入unicode

Ctrl+Alt+Shift+U

快跑啊,野生的四按键快捷键出现啦o(≧口≦)o

有了这个,某痞子的:│▌就可以打出来了,输入male就可以找到可♂口的汉⚣子哦~

至于上面那个任务,好像还是用charmap或者gucharmap比较妥当……

更♂多♂可♂口♂的♂♂♂♂

这时就要用到fcitx的蹭得累插件了~还有菊҉花҉体҉放送哦~~

个人主页上线

2013-08-12 14:23:40

http://heyeshuang.github.io

请使用现代浏览器并开启硬件加速

2013-07-27 23:12:05

对面楼下有一小丛竹子,十余年来,似乎并没有什么变化。不过,从五楼的窗户看过去,这样的视角还是第一次。记忆中,楼道的窗台并不是这样低矮,然而阴暗和潮湿还是一样。\

耳边只有震耳欲聋的蝉鸣。不久,雨变得稍稍猛烈了一些,最后毫不留情地倾泄起来。

firefox主页被绑架

2013-05-28 16:48:31

如果你的firefox首页被绑架了(我是被dyy55),请不要像我一样恼羞成怒,抱着“就是不让你挣钱”的扭曲心态,直接修改C:\Windows\System32\drivers\etc\hosts加上一行:

127.0.0.1 ww w.dyy55.c om

(去掉空格)

这样虽然有效,但是过于简单粗暴(But I’m lovin’ it)

更加优雅的答案是去修改C:\Users\me\Application Data\Mozilla\Firefox\Profiles\********.default\user.js,或者直接把这个干掉。

这件事情告诉我们一个道理,firefox已经不再是一个比较小众的浏览器了;然而linux上仍然没有盗号木马。我不禁陷入了沉思。

测试VimRepress

2013-05-26 16:05:33

本来这时候我是应该滚去写实验报告的但却写了博客

不过大概这种东西应该花不了多久吧\

–我这样安慰着自己

总而言之,VimRepress是一个在VIM上用markdown写博客的插件,用于替代已经挂掉的VimPress;

说明

好吧我滚回去写作业……

电路图、流程图:diagram designer及其他

2013-05-25 23:41:17

一个月后的总结:当我用linux的时候,我会用dia画电路和流程图。yed只能画流程图,不过看起来稍微漂亮一点。\

在win下,dia的中文支持有些小问题,画电路图建议schemeit,流程图可以用chrome应用Gliffy。\

当然,你要是买得起VISIO/PROTEL/mutisim什么的请不要来鄙视我等穷人。另外,gEDA似乎也不是 特别 难学。


Tree diagram

designer(树状图设计者),是一个windows下画流程图以及各种示意图的软件,是我们实验报告的好伙伴。当然,用它画电路图其实不大好用……

另外,云端电路图还有circuitLabschemeIt等等。曾经用过一段circuitLab,不过那里的电路符号和我们的画风不一样;粗略的看了一眼schemeIt,元件种类似乎不少,待会试试?

另外值得一提的就是这两个web app似乎都没有用flash。

HTML5就是正义,真是个好时代啊。【HTML5が正义、いい时代になったものだ。】

其实我在写实验报告的时候也领悟了悲伤……

Doppelgänger

2013-05-23 00:25:05

分身(德语:Doppelgänger)本意是指某一生者在二地同时出现,由第三者目睹另一个自己的现象。该存在与本人长得一模一样,但不限定为善或恶。民间传说当自己见到自己的分身,代表「其人寿命将尽」。

在历史记载上,据说美国第16届总统亚伯拉罕·林肯与日本作家芥川龙之介等名人曾经见过自己的分身。另一种说法是:罹患脑癌的病人丧失了自我认识的感觉,而会感受到好像有肉体以外的「另一个自己」存在。换句话说也可以想成是脑部发生某种功能障碍,死期将尽的人看到了分身,而出现「见到另一个自己的人将会不久於人世」这样的说法。不过该说法仍然只是推测,因为有过「由第三者目击到分身」的案例,与前述说法会有不合逻辑的部分。总体而言,分身大抵上被视为神秘学的现象。

“你还记得那个德国传说吗?人要是遇到了长得跟他一模一样的幽灵,他就会死的。不记得?那个幽灵在一个孤寂的地方现身,绝望地挥动着他的胳膊。”     ——牛虻

作为结论,通过寻找和自己相似的人来获得自我认同,大概是十分危险的。

果壳和国王

2013-05-20 00:55:35

Hi,这里是19年1月份的说明。自从我下载了Twitter客户端之后,这些脑袋里飘舞的落叶都扫到那里面去了。

我的Twitter地址在左侧。希望大家多多关注。


A leaf is mortal. Leaves are not. –130520

今天只是我平凡而无聊的一生之中普通的一天。有的人可以从一天中预言一生,这样的人被教会烧死了。–130520

永生的预言家能不能看到自己的一生?–130520

鸡肉是穷人的好朋友!你们为什么要伤害鸡肉!–5.21

不停遗忘的永生者与无法忘记的凡人——5.24

我的特长是写热情洋溢的拒绝信 ——5.28

称号:冒牌瑞士军刀 –5.28

押韵就是正义(认真状)——5.29

每一天都在为了活下去而努力 –6.13

“即使这样也要活下去。活下去!我还不想这样放弃!” –6.14

人类是一种群居动物。现在,人类已经进化到没有集体(社会)便无法生存的程度,孤独感也正是群居生活的枷锁。但另一方面,人类却无法在基因库中彻底抹消个体的意识,这造成了社会的混乱,也导致很多孤独的人仍苟活于世。 –6.14

我之所以不为猪辩护,是因为我并不担心有一天会被吃掉。 –6.14

我只认为同情心是道德的基石。要得到同情心,需要一点点想象力——或者稍稍多一点的不那么愉快的经验。


上面那个是谁呀真恶心…另外,最近的新爱好是对着厕所里的大镜子做JOJO立 —6.20

短期梦想:把左手改装成机械臂||巨大机器人!! –6.26

后来,我选择了一条不同的道路。

这样的话就只能做beam系武器了……残念…… –10.14

今日经验:永远不要试探他人。 –7.8

—你知道吗?枯叶里面其实很暖和呢!虽然见不到阳光。 —那是因为细菌吧。 –131004

今日新能力:将所有社交网络用成阅读器的能力 –131016

今天的感想:被创造出来的东西一定有它的极限 –131110

就像是卧床不起的暮年浪子,也想再跳一支伦巴。—140204


新脑洞:

人类灭绝之后,机器人统治了地球。但是,机器人的AI具有缺陷,无法进行科学发现,于是,主脑使用古人类遗留的不完整基因序列和改造设施,制造了一种新的生物群系。该种群系适应制造的“实验室”环境,最低等级的“实验设备”器官高度特化,适于完成特定的“实验”;“实验设备”由“实验员”进行连接、转移和组合,“实验员”具有稳定的下肢和适于抓握的上肢,并具有复杂的趋利避害反射(被称作“安全准则”);“传感器”具有大量感受器官,与“实验设备”共生。“实验设备”、“实验员”、“传感器”与“大老板”通过某种(不会干扰试验)的方式相连。当一次实验产生与已知某项数据对比“较好”的结果时,“大老板”产生欣快感,保存“实验过程”,该群落的信息保存至数据库,销毁“实验室”。“大老板”再次制造“实验室”,以上一次结果为范本自然变异。

“隔壁实验室好像养了两只代数系统啊”——实验员们的寒暄,如果它们可以的话。

——141015


……他面色阴沉,一言不发。

“哪里是罗马,哪里是强大的罗马?”

-20150202


一切死亡都有冗长的回声。 ——北岛

——20150416


失眠时,秒针的声音是一种酷刑。

考虑在宿舍里也装上一座大钟。

–20150905


雪后,满地都是绿色的叶子。心疼那些镁。 –20151123

“有的时候我会忘记孤独”,千分尺说。 –20160113

当河流开始分叉时,会有树枝搁浅在三角洲上。 –20160920


这可以说是自我实现的预言了。肥肠豹笑。

下次请给我一个更好的预言可以吗?

预言家预言了自己的预言!效果拔群!系统崩溃了!

——170520 4:00 am


饶有兴致地观察着 -口不择言慌不择路风声鹤唳四面楚歌- 疯狂尬聊的自己,获得一种感受

——170817


真正的自由在拥挤的旷野和空无一人的街头。 -20180424

 

Mortal

2013-05-20 00:53:27

在我无助的时候,并不会有人来拯救我。这可谓是一种报应:我以冷脸示于人前,从未尝试拯救他人,从未想过被他人拯救。疏离,也许是永生所要的代价;如果真是如此,就让时间成为我唯一的朋友。\

然而我仍未得到永生,时间仍是我最大的敌人。

vim again

2013-05-17 21:38:22

vim是一种信仰。

上面这句话应该是从某个披头散发1年没洗澡的技术大牛嘴里说出来,尾音要长,眼神越死鱼越好。摄像白平衡一定不能调准,要沧桑要有feel。在下面再带个双语字幕就更好了,英文就写”you are all 渣渣”就行…… 咳咳,跑题了。


好吧那么我为什么又开始折腾vim了呢?因为eclipse太水了……

其实我本来是有一个vimrc来着,号称是“超级无敌”之类,不过在折腾了两个插件以后,我觉得还是对自己好一点吧……

于是我找到了这个,基本开箱即用,不过因为面对高贵的mac,linux用户需要一点点修改

//谁能告诉我linux下command键用哪个替代?

安装之后要装ctags,各种补全库,然后 :BundleInstall

用vim的时候还有一些小问题:

剪贴板

一番折腾之后,我决定把"+p"+y记住…… 另外,中键似乎能直接粘贴选中文字,好像有点用…的样子?

字体

可以看看这个这个,然后为了兼容性我选了最土的那个……

苹果的字体好漂亮……好想要……

输入法

安完fcitx.vim之后,要用ctrl+alt+p预编辑文字关掉


折腾完这个以后,我发现这几天都没时间写东西了~vim,有缘再见~~~

邪恶的Archlinux

2013-05-17 15:47:31

前几天archlinux更新后无法启动,提示”/bin/systemd not exist”,于是乖乖等官网说明,顺理成章的没等到。于是开始google,在g+发现一条线索:那群变态好像把/bin/systemd移到/usr/lib/systemd/systemd里了……\

于是解决方案是:在grub按e,把/bin/systemd换成/usr/lib/systemd/systemd就行了;进来之后,还要改/etc/default/grub,以及grub-mkconfig……\

所以说你们折腾这个到底是为什么呀?觉得系统太稳定还是想玩弄可怜的系统管理员??\

用一张图表达我的感想:

evil

十一年前,以及今天

2013-05-10 23:25:26

今天在互联网上hang about的时候,发现了这个

在h1位置就大张旗鼓的用p标签写着Posted July 2002,也完全是2002年的风格:table式排版,内嵌font,还有 大家都喜欢的 comic sans;再一看head,是长成这样的:

<meta content="text/html; charset=windows-1252" http-equiv="Content-Type">
<meta content="Microsoft FrontPage 6.0" name="GENERATOR">
<meta content="FrontPage.Editor.Document" name="ProgId">
<meta content="no" http-equiv="imagetoolbar">
<title>Fireworks</title>
<meta content="none, default" name="Microsoft Border">

看到了吗?死掉的FrontPage……

然而,打开java以后,这网页是这样的:\

fireworks

现在到了找不同环节:请找出它与这个的区别。

唯一的区别是,它早了11年。

当然,现在流行的是什么平面化设计风格,java applets也被flash挤出了浏览器;而现在flash在换了n次东家之后,也慢慢显出了颓势。

现在是HTML5的时代了!他们说。

于是,我们用先进的HTML5,代替了古老的java,然后发现风扇一样狂转。

当我们欢欣鼓舞地把frontpage丢进坟墓的时候,绝对不会想到今天的adobe muse。

当我们把“三剑客”奉为神器的十一年后,flash已经半死不活,真正的fireworks,刚刚咽下他最后一口气。

我们如今吹捧的新技术,是否又能活过十一年?我们今天所鄙视的,是否又会成为明日的风潮?

也许,我应该好好学学上个世纪的C语言?

又及

这个网页的直到10年还在更新。八年之后,我会在那里呢?这个博客肯定也会灰飞烟灭,随着某次大清理消失吧。或许可以在archive.org找到?

又及之又及

事实证明我还是过于乐观。archive上根本没有这个页面。

贺叶霜的树

2013-04-27 16:22:17

github

live demo(slow)

Limited Gear Works

2013-04-19 21:50:50

总之是一个画齿轮的canvas, 没用 而且速度慢,不过最终至少像那么回事了。

地址

永生,其二

2013-04-01 16:57:51

我仍然渴望永生。\

“相遇的人会再相逢”,我很喜欢这句话,但我又明白,很多时候这并不现实。在人类短暂的一生里,很多人只能擦肩而过,而所谓命中注定,可能出现在正确的地点,却错过了多年。\

而永生则不同。只要永远、永远的活着,总有一天会再次相遇。在这之前,彷徨也好,等待也罢,毕竟来日方长。只是,当偶然成为了必然,是不是会有些无聊?\

我并不期望所谓的“缘分”,因为这只是生命之有限的副产品,正如我不满于美丽的点滴,而是贪婪地妄图痛饮它的源泉。当世上的所有生命之可贵完全展开在我眼前之时,我才能够满足的拥抱永恒的虚无。

<=这段删掉吧,中二病爆发了

2013-04-01 12:24:00

跑。跑。跑。\

说是奔跑,但并不很快,喘着粗气,但头脑却极速转动。\

后面传来凌乱的脚步声,是很多皮鞋踏在一尘不染的木地板上,在空旷的大厅中回响。\

大门已经锁死,但是珍贵的檀木却并不结实,很快他们就会突破了吧。穿过金碧辉煌的长廊,红色地毯传来柔软的触感,但他并没空注意这个。\

他跑到走廊的终点,在墙上胡乱点了几下,拿出了一把很小的手枪,就像玩具一样——但是仍然能快速结束生命。\

一扇暗门缓缓滑开,他并不知道这扇门通向哪里,他本不需要这扇门——\

于是我就醒了。

我的云上逃亡,或,google reader的替代品

2013-03-29 16:47:24

之前也说过一次,openshift的域名被做掉了,于是这里顶着一个tk招摇过市,就像顶着叶子的狸猫,没有一个搜索引擎能看见。f××k G×W!

不过这次折腾PaaS是因为Google Reader 被干掉了,寻找到以下替代方案:

似乎PHP比较常见的样子,于是准备先试试TT-rss。

现在的进度是,appfog|CloundFoundry|openshift|dotcloud|heroku的账号集齐了,再加个GAE和主机屋(不要用!很麻烦!),就可以召唤神龙了?

过会放测试结果,如果没有下文的话,就是我被什么龙给吃掉了~

update:直接google找到了这个,还贴心的放出了脚本。heroku,就决定是你了!
这里还有一大把PHP云,大概够了?\

update 2013-3-31:TT-RSS的数据库用量已经达到90%了……另外,又找到两个可能的选择:

update 2013-04-04 还有:

4-6再次更新:最后(?),在openshift上用脚本搭了ttrss(并绑定了域名),对owncloud采取持续观望的态度。

5-29 另外:

又及:测试VimRepress的编辑能力

如果你像我一样主力使用xfce但又觉得GNOME3也许会变得好一点于是安装之后才发现果然还是无法接受

2013-03-29 15:21:48

这时全部删除GNOME却发现xfce变得特别丑陋的原因是GNOME-settings-daemon与xfdsetting冲突于是后者被自动关闭了。只要重新启动xfdsetting,然后去把g-s-d的自启关掉就好。\

题外话,lightdm设置好的话十分nice,有空放一份配置文件上来。

CATIA是个好软件

2013-03-21 13:18:05

作为一篇凑字数的日志,标题就充满了歪歪扭扭的无力感……\

其实我想说的是,在机械设计的时候用好参数的话效果拔群——比如这次的机身,隔板有四种,可是只画了一次!我跟你讲,CATIA,赞!\

……一不小心又开始自high了,用这些梗的时候有90%强制发动“大冷场术”,要注意.\

其实前几天早上下雪了,然后看到满地的黑色的车辙,想起一句古话:“一人は泥を見た。一人は雪を見た”,然后想起了这个。\

说到pixiv,我倒是一直有把自己down的照片传相册的冲动……不过还是算了。

blog再次复活

2013-02-01 12:45:08

rhcloud.com被墙了,没办法用wordpress的android版更新实在令人愤怒,幸好我还有个免费域名,虽然不上档次,不过恰好合适。

2012-2013

2013-01-01 01:35:53

2012年,玩了石头门,馄饨头,还有菲特今晚留下来。石头门不错,馄饨头渣。菲特?没印象了。不过爵迹零拍的不错……\

2012年,退了一个比较正式的社团,加了一个比较靠谱的社团,然后在两个社团打酱油。\

2012年下旬,开始把大把生命浪费在一个屎黄色论坛。\

2012年,写了几行代码,然后发现自己是个傻x。\

2012年,有了一些朋友。\

2012年,除了跟团之外,第一次跟着自己走,虽然走得不远。\

2012年,本来想做出点东西,然后发现空有热情是无法改变的。\

2012年,存在感仍然稀薄。\

2012年,因为仍然没有奖学金,因此还是一个穷人,今天也在绝赞苦逼中。\

啊,对了,还是有两件好事的:写博客和背单词都坚持了一段时间,虽然现在已经不再背单词了。博客的话,与其说“虽然没人看”,不如说“没人看真是太好了”。我要的是一座空无一人的城堡,或者说,属于自己的一棵树。再说偶尔也会有僵尸来看看我……\

说到这个,今年暑假玩了好长时间的minecraft。那真是美丽的世界,而且只有我一个人。\

即使到了2013年,一到夜里就乱说话的毛病还是没治好。\

2013年的愿望是永生,形式不限。其实也想要别人的认同的,不过既然都不切实际,那么还是永生更好一点。\

不过13年似乎会很忙,所以要是能慷慨的把时间停止的能力也给我就好了。

Texlive 在archlinux上的安装,以及中文字体的设置

2012-12-22 00:38:48

texmacs已经不能满足我了!

其实是想着反正这个软件已经挺难用了,要不就直接去挑战大魔王吧!

然后发现大魔王令人绝望的实力

然后用S/L大法加google作弊器成功——安装了字体

结果我还是不会用tex

所以我下了lyx

#期末考试就要到了我还在弄这个#

#挂科预感up(大)#

我说这个又没人爱听

反正也不会有人来

fin

骗你的

这里不是只有一个活人吗……不会有什么“你”在啦

好吧让我进入正题。

其实我一开始以为直接pacman就好了

但是后来我发现自己太甜了

于是我就下了texlive的镜像

后来发现直接安可能也可以??

按照这里的安装方式\

su –
wget -c http://mirrors.ustc.edu.cn/CTAN/systems/texlive/Images/texlive2012.iso
mkdir /mnt/tex
mount -o loop texlive2012.iso /mnt/tex/
cd /mnt/tex/
./install-tl
vim /etc/profile #在这里要设置全局变量PATH,加上/usr/local/texlive/2012/bin/i386-linux,否则找不到tlmgr……
tlmgr option repository http://mirrors.ustc.edu.cn/CTAN/systems/texlive/tlnet
tlmgr update –self
tlmgr update –all
umount /mnt/tex
rm -rf /mnt/tex

然后发现没有字体……

然后在这里发现要:

将 texlive-fontconfig.conf 文件复制到 /etc/fonts/conf.d/09-texlive.conf, 运行 fc-cache -fsv 以root的名义

接下来xetex就会提示你缺少字体了,是不是很高兴?

——才怪咧!

然后,你要用yaourt安装ttf-ms-fonts-zh_cn这个包——

然后fc-list|grep sim和fc-list|grep SIM各一次——

然后sudo vim /usr/local/texlive/2012/texmf-dist/tex/latex/ctex/fontset/ctex-xecjk-winfonts.def

把里面奇怪的[SIMKAI.TTF]和[SIMFANG.TTF]都换成刚才写着“楷体”和“仿宋”行中的英文名,我的是KaiTi_GB2312和FangSong_GB2312

编译用例:

\documentclass{ctexart}
\begin{document}
为什么大家都在这里写“你好”啊……我一点也不好……而且也没有什么“你”……
\end{document}

用的编译命令是xelatex……

然后……要是提示缺少Adobe Song Std什么的,应该yaourt acroread-font-chinese-simplified就行了吧……

啊啊,从这个过程里,我好像看到了我短暂的人生……越是精于算计,就越可能出现意想不到的状况……

老子不做人了!TeTe!

然后就想起这里还有一篇论文要写……

世界末日没有来真是令人沮丧啊……我好想变成橙汁啊……

最后祝你身体健康,再见

texmacs相关

2012-11-24 01:18:26

TexMacs可以快速排版文章,效果拔群,而且不必使用word式空格大法,实乃尔等强迫症患者之福音。\

其优势:

然而,作为一个(不挣钱的)开源软件,要用上也要下一番功夫。

对于windows,推荐(向谁?)使用itexmacs,对中文支持据说好了很多?

对于archlinux,community源和AUR上的包都太旧了,似乎无法正常输入中文的样子。不过这个bug已经解决,推荐直接编译安装SVN代码(仓库:svn://svn.savannah.gnu.org/texmacs/trunk/src)\

本人写了一个pkgbuild传到了AUR上,不过因为是第一次(羞),可能会出现“rm -rf /”的餐具……\

对于ubuntu,推荐换成archlinux

程序自带的手册很详细,不过因为中文化好像出了一些小问题,那么可以直接去http://www.texmacs.org/tmweb/manual/web-manual.en.html\

关于字体,见http://www.texmacs.org/tmweb/download/fonts.en.html ,大概就是要下一个字体放到~/.TeXmacs/fonts/truetype里面然后运行

texmacs --delete-font-cache &

亲测Simsun,wqy可用~

关于插入图片,似乎在win下只能插入png的样子,然后更改宽高还要写成”800px”,谁知道还要加单位啊……

至今尚未解决的问题:linux下一导出pdf就crash,好像只对中文有效,自带help无压力,什么时候我去报个bug……

那么如同标题一样,这里要变成树洞了

2012-10-05 23:15:48

\

明明不是tk域名了的说……搜索引擎都收录了的说……为什么没有人来……\

算了那就当私人空间好了,不过明明是私人空间却还对外开放,这是不是某种暴露癖呢?就像《monster》那样。\

其实有许多梗用的很高兴,但却没有看原作。\

……那么这里变成本大爷的私人树洞了!今后还请大家

……

……

………………呜呜呜我也想要另外一个人格……

又学到一个新词:树洞

其实严肃的想,在一个人写博客的时候,投射到文章里的只是他的一部分灵魂人格,在他做生活中其他事情的时候也是这样,那么完全了解一个人的可能性并不存在吧。

或许,脑内补完制作模型的方法可能管用?虽然里面是发条和齿轮,但是应激性是一样的,这样也就行了吧

当我画连杆时我想到什么——几何画板,geogebra及其它

2012-10-04 10:32:15

有没有专业画连杆的软件?没有,原因是这样的要求过于小众,而且有许多功能更加丰富的软件可以替代。\

前几天一直想要实现一个专业画连杆的软件,当时考虑用html5 canvas实现(太复杂的我都不会),还专门找了物理引擎——box2DJS(注意首页上的第二个例子)。然后发现自己又开始做无用功了,几何画板(和开源实现GeoGebra)完全能够实现我的要求。\

使用的时候只要注意主从关系就好。效果大概是这样的:

连杆

flask似乎不错

2012-09-11 23:30:08

首先接触的web框架是karrigell,也最后作出了点东西,感觉简单实用但是好像有点非主流。然后看到Django好像很流行,然后就在openshift上弄了一个,最终结果是只用到了statics目录。中间因为搭wordpress,曾经有一段学php的热情。后来……冷掉了。

然后下一个目标是flask。

不过没有内容,什么都白搭。

phpwind论坛刷分脚本(可用于openwrt)

2012-09-11 12:56:26

用Python2写成,为什么不用Lua?因为我不会

'''
Created on 2012-9-10
@author: hh
'''
import cookielib
import urllib2
import urllib
import time
username="Chetter.Hummin"
password="password"
def login(usr, pwd):
'login function'
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [('User-agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1')]
url_login = 'http://bbs.sarabalst.com/2b/login.php'
body={"step":"2","pwuser":usr,"cktime":"31536000","pwpwd":pwd,"lgt":"0"}
print 'login to get cookies'
urllib2.install_opener(opener)
req = urllib2.Request(url_login,urllib.urlencode(body))
resp = urllib2.urlopen(req)
#print (resp.read())
if __name__ == '__main__':
login(username,password)
print "login success"
print (time.strftime('%Y-%m-%d %H:%M',time.localtime(time.time())))
for i in range(0,23):
try:
str=urllib2.urlopen("http://bbs.sarabalst.com/2b/",timeout=100).read()
#print "success"
except:
str=""
#print "fail"
if str!="":
print str
print "refresh success"
else:
print "refresh fail"
print (time.strftime('%Y-%m-%d %H:%M',time.localtime(time.time())))
time.sleep(300);

在openwrt上测试成功。理论上可以加入crontab,现在还没测试(时间不够)
update :鉴于论坛和路由器双重不给力,给urllib2设了超时

2012-08-04 05:20:34

到了夜晚人就变得奇怪了……

好笑的是,高中三年匆匆过去,我对母校的记忆,竟然是几扇窗户。\

这是当我第一次踏入一中的图书馆时,印在我脑海中的景象。排排的书架旁边是窄窄的窗台,窗子里,是灰色高墙围成的天井。书架上,是密密麻麻摆放的书籍。有像“怎样心算快”这样浅显的画册,也有讲解e pi i之间奇妙关系的读本,更有着关于相对论的大部头{现在想起来,脑袋还是会隐隐作痛}。于是,周一的下午,大扫除的空闲,总会在这里随便抽出一本,或有图、或有趣,倚在窗户边上,随便翻看两页。窗中的阳光,让时间变得暧昧,也给回忆涂上了一层蜂蜜一样粘稠的颜色。晚秋的阳光消失的时候,正是第四节课下课铃声拉响的时间。穿过光亮而湿润的楼道,记忆中的是窗边一方并不宽敞的课桌。在书山中奋笔疾书的时候,偶尔会听到沙沙的风声,窗外是墨绿而坚韧的桦树叶子在轻轻的摇动。\

……\

啊啊,刚刚提起笔,窗中已经现出了曙光,乌云的缝隙被朝阳映成金黄。这些胡乱的文字要怎么结尾呢,就这样放着不管真的可以吗。\

太阳出来了,充满回忆的夜晚到此结束,今天又会是新的一天,可是我现在还无法迎接她。

THU课程表导出,油猴脚本,输出vcal

2012-07-14 16:41:26

脚本下载:http://userscripts.org/scripts/show/136856\

google code:http://code.google.com/p/js-thu-cal-outputer/

为什么自己总是做这些完全不会有人来用的东西啊为什么!

使用的网站:http://zhjwxk.cic.tsinghua.edu.cn/xsxk_index.jsp

->这个网站没几个人能上吧!就算是能连上也没有密码啊!

我写这个的意义到底是什么…………

html5-世界变动率计数器(仮)

2012-07-14 16:32:13

here

其实这个东西做好已经有小半个月了,但是后来又是mc又是出去玩什么的就忘了管……但是颓废下去终究是不对的,所以我又回来了。

代码简单到自己都觉得没有开project的必要,但是就这么点东西就折腾了好长时间,中途还把整个砍掉重练。我果然还是太年轻(?)\

如果有需要,请自行抓站,能署名的话本人当然会更高兴。

update 2012-9-11:\

github page

总结:简单的vCal/iCalendar/.ics格式说明

2012-06-25 16:12:57

E文好的话建议去看直接去看IETF的RFC5545定义;
中文版:

政府文件:中华人民共和国通信行业标准移动互联网可移动终端数据同步业务技…(下略)

某人翻译的标准文档(百度文库)

ical格式大概是这样的:

BEGIN:VCALENDAR
PRODID:-//HeYSH//HeYSH Calendar 70.9054//CN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:课程表
X-WR-TIMEZONE:Asia/Shanghai
X-WR-CALDESC:
BEGIN:VTIMEZONE
TZID:Asia/Shanghai
X-LIC-LOCATION:Asia/Shanghai
BEGIN:STANDARD
TZOFFSETFROM:+0800
TZOFFSETTO:+0800
TZNAME:CST
DTSTART:19700101T000000
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTART;TZID=Asia/Shanghai:20120901T092000
DTEND;TZID=Asia/Shanghai:20120901T105000
DTSTAMP:20120622T160054Z
UID:%u4F20%u70ED%u5B66%20%u5BF9%u6D41%u5B9E%u9A8C35@第 1 次
CREATED:20120622T154824Z
DESCRIPTION:教师:王五n
LAST-MODIFIED:20120622T160041Z
LOCATION:大礼堂
STATUS:CONFIRMED
SUMMARY:实验2
END:VEVENT
END:VCALENDAR

基本上只要修改中文部分的内容就好了

tips:

还是老老实实一个一个添加吧……不过删除起来也相应的麻烦了许多。

最后补一些相关代码段(javascript):

$vCalArea.append('BEGIN:VCALENDARnPRODID:-//HeYSH//THU Calendar 0.0002//CNnVERSION:2.0nCALSCALE:GREGORIANnMETHOD:PUBLISHnX-WR-CALNAME:课程表nX-WR-TIMEZONE:Asia/ShanghainX-WR-CALDESC:nBEGIN:VTIMEZONEnTZID:Asia/ShanghainX-LIC-LOCATION:Asia/ShanghainBEGIN:STANDARDnTZOFFSETFROM:+0800nTZOFFSETTO:+0800nTZNAME:CSTnDTSTART:19700101T000000nEND:STANDARDnEND:VTIMEZONEn');
/***************生成文件头****************/
$vCalArea.append("BEGIN:VEVENTnDTSTART;TZID=Asia/Shanghai:" + strBT + "nDTEND;TZID=Asia/Shanghai:" + strET + "nDTSTAMP:20120622T160054ZnUID:" + uid + "nCREATED:20120622T154824ZnDESCRIPTION:" + Data.courseInfo + "nLAST-MODIFIED:20120622T160041ZnLOCATION:" + Data.place + "nSTATUS:CONFIRMEDnSUMMARY:" + Data.courseName + "nEND:VEVENTn")
/****************VEVENT部分***************/
$vCalArea.append('END:VCALENDAR');
/****************文件尾****************/

全部脚本见http://code.google.com/p/js-thu-cal-outputer/

Hello Again~

2012-06-22 15:15:48

国内的免费主机始终是不靠谱的啊……

——以上为结论

由于这样那样的原因,上一个博客化为了时代的眼泪,确切的说是全灭。于是,这里作为博客No.3,希望大家(?)——,……

算了还是看看这里能坚持到什么时候比较好。

又及:博客搭建在redhat openshift服务上,应该是比某些30天一续期的主机好得多。

updated 2012-6-25:openshift虽然不会发生清空数据库的惨剧,不过这速度也……\

administrator@ubuntu:~$ ping wp-heysh.rhcloud.com
PING ec2-50-19-68-176.compute-1.amazonaws.com (50.19.68.176) 56(84) bytes of data.
64 bytes from ec2-50-19-68-176.compute-1.amazonaws.com (50.19.68.176): icmp_req=1 ttl=44 time=429 ms
64 bytes from ec2-50-19-68-176.compute-1.amazonaws.com (50.19.68.176): icmp_req=2 ttl=44 time=421 ms
64 bytes from ec2-50-19-68-176.compute-1.amazonaws.com (50.19.68.176): icmp_req=3 ttl=44 time=427 ms
64 bytes from ec2-50-19-68-176.compute-1.amazonaws.com (50.19.68.176): icmp_req=4 ttl=44 time=426 ms

四百多秒的延迟……果然国内连amazon的主机就是悲剧……\

希望GFW不要盯上亚马逊啊啊啊啊

chicken

2012-06-22 14:32:32

Nothing here.

关于我

2012-06-22 14:32:32

下面的介绍大概是2012年留下来的。除了年龄增大之外,我是不是成长了一些呢?


HeYSH——贺叶霜,如你所见,是个死宅,正在读帝都的大学,热爱自由,喜欢neta、潜水(论坛意味)、Arch Linux和干一些不务正业的事情。不喜欢M$、不让我看源代码的东西和买不起的东西——顺带一提,我买不起的东西很多,讨厌的事是失去和束缚,~~兴趣是人体改造和永生的研究。~~可能有轻微中二病,但是大概不是个坏人。

人人的日志里代码会变得很难看,而且“把这些东西发出去的话,大概会被人讨厌的吧”。抱着这样的想法,搭了自己的博客,但是很快就由于备份失误而灰飞烟灭。

“啊啊啊这样的话还不如去用Evernote,反正也没人会来看啦”,虽然这么想着,但还是像一个抖M一样重新开始了。

http://about.me/heyeshuang <–大概这样可以联系到我的样子……

来自20191205:其实我弄了个域名邮箱:i at heysh.xyz。很想炫耀一下,但又不知道贴在哪里。

另外,到了晚上会变得很奇怪,请勿投喂谢谢

update 130525:修改语病,主要是把逗号改成句号

update 131004:最近对衬线体产生了浓厚的兴趣,另外,发现大小写是有区别的