Arch Linux 星球

December 27, 2016

ヨイツの賢狼ホロ

在腾讯云服务器中重装 Windows 系统为 Arch Linux

灵感来自 https://danknest.org/install-linux-on-qcloud-windows-cvm 😂

为啥?😂

腾讯云只给 Linux 系统的云服务器赠送 8G 20G 系统盘以强行推销数据盘, 而 由于这样抠门的限制在 Windows 系统上是显然行不通的, 给 Windows 系统赠送 50G 系统盘。

😒

所以…… 😏

前期准备

准备 Arch Linux 和 Debian 的安装 ISO 就行 😹

前期工作……

然后打开 控制面板-网络连接 记下现在的网络信息 (谁叫没有 DHCP 用😂

网络信息

然后照 这里

准备一个新分区出来,大小比 Arch Linux ISO 大点,然后记得格式化成 FAT32 😂

分区

接着把两个 ISO 挂载上。

挂载 ISO

用 Debian 安装程序加载器生成启动项

用兼容性选项设置 Debian 安装盘下的 setup.exe 以 Windows Vista 运行(不然会报错说不支持 Windows NT 6.x ( 好像只支持 Vista 就是 6.0 的样子 😂 )

兼容性设置

然后运行,不过先别忙着重启……

running……

这个时候把 Arch ISO 的文件复制到新的分区上,然后照着 ISO 改一下卷标 😂

改卷标……

改启动项 + 重启

把 ISO 或者硬盘上 /arch/boot/x86_64/ 里的 vmlinuz 和 archiso.img 复制到 C 盘的根目录,必要的话改成小写

这 那

然后打开 C:/win32-loader/grub.cfg 改成这样 (记得把卷标换成汝自己的):

linux /vmlinuz archisobasedir=arch archisolabel=ARCH_201612

initrd /archiso.img

boot

😂

最后重启,用 CVM 的控制台登录,选 Debian 啥的那项😂:

😂

等若干秒:

😂

😂😂

连上网

(之前说过企鹅云不给 DHCP 😂

于是拿出刚刚抄下来的网络信息备用。

首先,用 ip link 确定一下接口 (咱是ens3 😂

ip link

然后添加 IP 地址:

ip addr add {用 CIDR 表示的 IP 地址} dev {汝的网卡名称}

(CIDR = 无类别域间路由 )

例如咱的子网掩码是 255.255.192.0 就这么写:

ip addr add 10.141.60.78/18 dev ens3

接着添加网关:

ip route add default via {网关 IP 地址}

最后编辑 /etc/resolv.conf 改成抄下来的 DNS 服务器地址 😂:

/etc/resolv.conf

然后联网试试?😂

😂

然后在 CVM 上直接装或者打开 sshd 用自己的电脑连上去啥的就自己围观 ArchWiki 好啦:

https://wiki.archlinux.org/index.php/Installation_guide

https://wiki.archlinux.org/index.php/Install_from_SSH

by ホロ at December 27, 2016 04:00 PM

December 22, 2016

百合仙子

利用 systemd 的 watchdog 功能重启卡住的服务

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

我在用 offlineimap。用着用着就发现一个问题:偶尔 offlineimap 会卡在网络上不动弹了。跟 getmail 一个德性……

但是 offlineimap 又跟 getmail 有点不一样,它是持续运行着的。虽然非要把之前那个 killhung 程序拿来用不是不可以,但我还是重新弄了一个更优雅的方案:systemd watchdog。

我的 offlineimap 本来就是用 systemd 服务的方式来跑的,所以很适合这样的改造呢。只是,当我瞅了一眼源码之后,我就放弃了 patch offlineimap 的打算。很难在合适的地方添加 watchdog 相关的代码。

既然从内部着手不好做,那就从外部写一个 wrapper 好了,反正 offlineimap 跟 getmail 不一样,正常情况下一直在输出东西,就把这个作为它的「心跳」特征好了。当然这个 wrapper 还可以给其它程序用。

于是,watchoutput 程序诞生了!稍微改一下 offlineimap 的 .service 文件,像这样子就好了:

[Unit]
Description=Offlineimap Service

[Service]
Type=notify
ExecStart=.../watchoutput /usr/bin/offlineimap
TimeoutStopSec=3s
SyslogIdentifier=offlineimap
Restart=on-failure
WatchdogSec=70
LimitCORE=0

[Install]
WantedBy=default.target

加上LimitCORE=0是为了阻止重启的时候由于 SIGABRT 信号导致 coredump,浪费磁盘空间。

用了几天之后,终于观察到一次由 watchdog 触发的重启:

12月 19 12:26:53 lilywork offlineimap[21623]:  Establishing connection to imap.exmail.qq.com:993 (main-remote)
12月 19 12:28:03 lilywork systemd[687]: offlineimap.service: Watchdog timeout (limit 1min 10s)!
12月 19 12:28:03 lilywork systemd[687]: offlineimap.service: Killing process 21623 (python3) with signal SIGABRT.
12月 19 12:28:03 lilywork systemd[687]: offlineimap.service: Killing process 21625 (offlineimap) with signal SIGABRT.
12月 19 12:28:03 lilywork systemd[687]: offlineimap.service: Main process exited, code=dumped, status=6/ABRT
12月 19 12:28:03 lilywork systemd[687]: offlineimap.service: Unit entered failed state.
12月 19 12:28:03 lilywork systemd[687]: offlineimap.service: Failed with result 'core-dump'.
12月 19 12:28:03 lilywork systemd[687]: offlineimap.service: Service hold-off time over, scheduling restart.
12月 19 12:28:03 lilywork systemd[687]: Stopped Offlineimap Service.
12月 19 12:28:03 lilywork systemd[687]: Starting Offlineimap Service...
12月 19 12:28:04 lilywork systemd[687]: Started Offlineimap Service.

没过几天,我又给这个 watchoutput 的脚本找到另外的用处:自动重启网络。

我家里的笔记本连 Wi-Fi 不知怎么,这些天经常会卡住(只发不收,一直处于 ARP 找网关的状态)。内核之前报过一次错,现在也没反应了。

于是:

[Unit]
Description=Watch for network availability

[Service]
Type=notify
ExecStart=.../watchoutput --retry-on-exit 2 --wait-before-retry 30 --ignore-stderr \
    -- ping -i 30 192.168.1.1
Restart=on-failure
WatchdogSec=70
StandardOutput=null
StandardError=journal
LimitCORE=0
SyslogIdentifier=watch-network

[Install]
WantedBy=default.target

拿 watchoutput 监控 ping 网关的输出,每30秒 ping 一次,如果70秒还没反应就重启它自己。然后我们还需要重新连接网络。在 /etc/systemd/system 下建立 netctl-auto@wlan0.service.d 目录,并在其下建立一个 watchdog.conf 文件,给 netctl-auto@wlan0.service 服务增加一项配置:

[Unit]
PartOf=watch-network.service

这样当 watch-network.service 重启的时候,netctl-auto@wlan0.service 就会自动重启了~

by 依云 at December 22, 2016 10:17 AM

December 14, 2016

百合仙子

使用 RSS 订阅知乎用户的动态

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

之前做了一个知乎专栏转RSS的网关,这次又写了个针对知乎动态的。感兴趣的话去 https://rss.lilydjwg.me/ 看看用法吧。

此功能只支持用户的回答和发布文章两个操作。别的操作,比如赞了答案啦,关注了专栏啦,参加了 live 啦,没有实质性的内容,又可能会有非常多,不适合 RSS 这种面向内容发布的东西,所以就过滤掉了。即使如此,程序每次访问取最近40条动态,缓存有好几个小时,所以对于活跃的用户是可能漏掉一些动态的。反正现在信息这么多,漏了就漏了吧,去读读别的东西呗。

知乎这次暴露出来的 API 有点意思。它有一个 include 参数,看起来是指定要返回哪些字段的。看起来知乎也在解决 GitHub 遇到的同样的问题:RESTful API 太不灵活了。只是,为什么要造轮子啊,GraphQL 不是挺好的吗……

by 依云 at December 14, 2016 01:01 PM

December 13, 2016

ヨイツの賢狼ホロ

这不是结束

这不是结束,

因为根本就没有开始。

那场短暂的梦境,是时候该醒来了。

就这样吧,再见了。

(下一次会在哪里开始,又是以什么样开始呢,咱不知道……


借口都已经找好了呢(😂),对没错就是重新画了个主题😂😂

by ホロ at December 13, 2016 04:00 PM

December 12, 2016

ヨイツの賢狼ホロ

编译 OpenWrt 和加入 Alljoyn Framework 支持

编译 OpenWrt 和加入 Alljoyn Framework 支持(纯粹是为了完成任务……)😂

OpenWrt 和 Alljoyn 分别是啥?

OpenWrt是适合于嵌入式设备的一个Linux发行版。

相对原厂固件而言,OpenWrt不是一个单一、静态的固件,而是提供了一个可添加软件包的可写的文件系统。 这使使用者可以自由的选择应用程序和配置,而不必受设备提供商的限制,并且可以使用一些适合某方面应用的软件包来定制你的设备。 对于开发者来说,OpenWrt是一个框架,开发者不必麻烦的构建整个固件就能得到想要的应用程序; 对于使用者来说,这意味着完全定制的能力,与以往不同的方式使用设备,OPKG包含超过3500个软件。 默认使用LuCI作为web交互界面。

OpenWrt

AllJoyn,由高通公司主导的高通创新中心(Qualcomm Innovation Center)所开发的开放原始码专案, 主要用于近距离无线传输,透过Wifi或蓝牙技术,进行定位与点对点档案传输。

后来成为了 Linux 基金会赞助的项目之一。

AllSeen Alliance

第一步:准备编译环境

OpenWrt 官方的文档在这: https://wiki.openwrt.org/doc/howto/buildroot.exigence

首先需要保证汝的硬盘上还剩下至少 4GiB 左右的剩余空间啦~

然后安装编译所需的工具,Arch 的话大概 base-devel 组就够了吧 😂

# pacman -S base-devel git

官方文档 “Table of known prerequisites and their corresponding packages” 一节列出了编译不同组件各自需要的软件包, 还是装上吧😂,用 --needed 参数跳过已经安装的包。

# pacman -S asciidoc bash bc binutils bzip2 fastjar flex git gcc util-linux gawk gtk2 intltool zlib make cdrkit ncurses patch perl-extutils-makemaker python2 rsync ruby sdcc unzip wget gettext libxslt zlib boost libusb bin86 sharutils jdk7-openjdk

除了编译 lilo 需要的 bcc <- 这个在 AUR: https://aur.archlinux.org/packages/bcc/

第二步:准备源代码

这个时候就要打开汝的终端啦😋

和其它项目类似,不同的 git 分支也是不同的版本呗~:

git clone git://github.com/openwrt/openwrt.git

(master 分支,也就是 openwrt 的 trunk 版本)

git clone -b chaos_calmer git://github.com/openwrt/openwrt.git

(openwrt 的 chaos_calmer (15.05) 版本)

git clone -b barrier_breaker git://github.com/openwrt/openwrt.git

(openwrt 的 barrier_breaker (14.09) 版本)

如果要像咱一样添加第三方软件(例如 Alljoyn)的话,用文字编辑器打开汝的 feeds.conf (有可能是 feeds.conf.default,记得编辑完保存成 feeds.conf),加上适当的feed:

(咱还是用 Alljoyn 做例子呐~)

src-git alljoyn https://git.allseenalliance.org/gerrit/core/openwrt_feed;barrier_breaker

(因为咱是 barrier_breaker 啦,官方还支持 Attitude Adjustment 和 12.09,像下面那样)

src-git alljoyn https://git.allseenalliance.org/gerrit/core/openwrt_feed;attitude_adjustment

(Attitude Adjustment)

src-git alljoyn https://git.allseenalliance.org/gerrit/core/openwrt_feed;openwrt_12.09

(official OpenWrt v12.09 tagged release)

记住按汝自己的版本选择一个添加进去就好😂

然后更新 feeds 列表:

./scripts/feeds update -a

PS: 有拉黑过 Wosign 和 StartCom 证书的用户会在 clone Alljoyn 仓库时遇到证书错误,像这样😂:

fatal: unable to access 'https://git.allseenalliance.org/gerrit/core/openwrt_feed/': SSL certificate problem: unable to get local issuer certificate

( Linux Foundation 竟然没用自己赞助的 Let's Encrypt 😹)

所以只好委曲求全先让 git 对证书错误睁一只眼闭一只眼吧 😿:

export GIT_SSL_NO_VERIFY=true

./scripts/feeds update -a

unset GIT_SSL_NO_VERIFY

然后安装需要的包,安装以后稍后的 make menuconfig 中就可以见到了 😂

./scripts/feeds install {package_name}

要偷懒的话可以先全装上 😂

./scripts/feeds install -a

和咱一样要装 Alljoyn 的就再这样 😂😂

./scripts/feeds install -a -p alljoyn

第三步:设置编译选项

(咱不知道 menuconfig 怎么说😂)

接下来运行 make menuconfig 打开设置界面:

大概像这个样子😂

⬆️大概像这个样子,自己编译过 Linux 内核的话应该不会陌生吧😂

然而选项太多所以还是需要自己选择 😂

  • Target System 选择成汝路由器的平台,这个可以在 https://wiki.openwrt.org/toh/start 的每个型号的 TechData 中找到。

  • Target Profile 选择汝路由器的型号,或者保留默认的 Default Profile (all drivers) 选项,不过这会生成所有设备的映像😂

    对于选择的选项:

    [*] built-in ,表示这项功能内置在生成的映像中(小心映像空间爆炸装不上😂)

    [ ] excluded ,就是不含啦😂

    <M> module ,这项功能会在编译时生成将来能通过 opkg 安装的软件包呗~

    < > module capable (😂,这啥……)

    和咱一样要装 Alljoyn 的话,Alljoyn 在 Network 一节里。

编辑完成以后就用下边的 Save 选项保存呗~

*** End of the configuration.

*** Execute 'make' to start the build or try 'make help'.

应该会有这么两行😂

第四步:开始编译

接下来就开始编译呗:

make

或者后台编译:

ionice -c 3 nice -n19 make -j 2

或者打开喋喋不休模式😂:

make V=s

然后可以洗洗睡了(雾😹


转天早上醒来如果没出错的话就能在 /bin ( 换成汝 OpenWrt 目录的文件夹) 看到生成的映像了呗~

by ホロ at December 12, 2016 04:00 PM

Phoenix Nemo

重新迁移回 GCP

忍得住打 Call,忍不住折腾。看到黑科技就手痒。

Performance with GCP

虽然 AWS 用得挺安心不过越来越多的人向我抱怨博客打开速度很慢,想看文章都要等好久什么的。于是纠结了下,还是迁回了最贵但是最快的 Google Cloud Platform。这里记录一下调(zhe)教(teng)过程,毕竟 GCP 的 Cloud CDN 依然在 Alpha/Beta 阶段,可配置的选项实在太少而且很多 caveats。

前期准备

  • 域名
  • SSL 证书
  • 网站程序或内容

创建实例

我这样没什么访问量的静态网站用 f1.micro 就好啦~ 不过流量比较大的网站的话,还是建议选择高一些的配置和 SSD。

然后创建一个实例组(instance group),确保该实例组包含刚才创建的实例。

NGINX 配置

网站等会说。总之先配置好 SSL 和 Health Check。

1
2
# mkdir -p /var/www/hc
# touch /var/www/hc/index.html

默认站点配置 default.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 80;
listen [::]:80;
server_name hc; # health check
root /var/www/hc;
index index.html;
}

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 301 https://$host$request_uri;
}

网站配置 example.com.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com;

ssl on;
ssl_certificate /etc/ssl/private/example_com.pem;
ssl_certificate_key /etc/ssl/private/example_com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
keepalive_timeout 70;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_dhparam /etc/ssl/certs/dhparam.pem;

add_header Strict-Transport-Security max-age=63072000;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;

root /var/www/example.com;
location / {
# ...
}
}

(SSL 相关的很多配置步骤省略,请自行查阅其他文档)

创建负载均衡器

戳到 Networking 标签,选择 Load balancing 然后创建一个 HTTP(S) Load Balancing。首先为负载均衡器命名,因为要分别创建 2 个负载均衡所以这里可以写例如 website-http 之类作为区分。配置页面的三个标签:

  • backend
    • 创建一个新的 backend
    • backend service 选择 http
    • instance group 选择刚才创建的实例组
    • port numbers 80
    • health check 创建新的 health check 并设置 custom header,和之前 NGINX 里的配置一致,这里是 hc
    • 勾选 Enable Cloud CDN
  • Host and path rules
    • 添加域名对应的 //* 两个路径规则。如果有特殊需求则另外添加。
  • Frontend configuration
    • Protocol 选择 HTTP
    • Create IP Address 然后 reserve 一个 IP

第二个负载均衡器用于 HTTPS,名称可以是 website-https 这样。配置:

  • backend
    • 因为配置不一样,所以要再创建一个新的 backend
    • backend service 选择 https (要点 Edit)
    • instance group 选择刚才创建的同一个实例组
    • port numbers 443
    • health check 创建新的 health check 并设置协议为 https,custom header 为网站域名(因为要和 SSL 证书相符,示例里是 example.com
    • 勾选 Enable Cloud CDN
  • Host and path rules
    • 同上
  • Frontend configration
    • Protocol 选择 HTTPS
    • IP 选择刚才 reserve 的 IP
    • 创建证书,分别上传签发的证书、CA 证书链和私钥

更新解析&收尾

将域名的 DNS 解析到刚才 reserve 的 IP 即可。

至此就是基本的(当前版本的)Google Cloud CDN 配置步骤。还有很多可以自定义和扩展、优化的空间,但是这些需要根据特定的需求变化因此不再详细记录。

以及,不要忘记在虚拟机里把网站跑起来~

最后,南酱的 live 超棒(๑•̀ㅂ•́)و✧

忍得住打 Call,忍不住折腾。看到黑科技就手痒。

December 12, 2016 01:54 PM

November 21, 2016

ヨイツの賢狼ホロ

#archlinux-cn 活动手册(?)

Arch Linux 中文社区聊天频道 #archlinux-cn 活动手册 😋

话说又一个月啥也没写了啊……果然不够才思泉涌……

最近 #archlinux-cn 的新人越来越多了呐~ (这不是很好么,咱就不愁没的吃了是呗~) 😋

于是为了 帮助新人(凑数) 这篇文章就出炉啦 😂

前言

如果还不知道 Arch Linux 中文社区是啥的话……😋

去看看这个呗 Arch Linux 中文社区非官方生存手册

各个接入点

我们的同志遍布五湖四海,甚至打入了某些组织的内部……

简单说就是连接到 Arch Linux 中文社区聊天频道的方法有很多啦……

  • IRC

    IRC(Internet Relay Chat的缩写,“因特网中继聊天”)是一种通过网络的即时聊天方式。 其主要用于群体聊天,但同样也可以用于个人对个人的聊天。

    就是 #archlinux-cn 啦~

    直接戳上面的链接会打开 freenode 的 webchat 界面, 输入昵称然后完成Google 的 NoCaptcha 验证后,点击连接(Connect)就可以进入本IRC频道啦~

    正在使用某种 IRC 客户端的话参阅汝所使用的 IRC 客户端的文档在 irc.freenode.net 上加入 #archlinux-cn 就可以啦~

    想进一步了解 IRC 的使用方法的话推荐下维基百科的教程呗:

    Wikipedia:IRC教程

  • XMPP

    XMPP(Extensible Messaging and Presence Protocol,前称Jabber) 是一种以XML为基础的开放式即时通讯协定,是经由网际网路工程工作小组(IETF)通过的网际网路标准。

    习惯 XMPP 的用户可以添加 talk@archlinuxcn.org 为联系人,成功添加以后会收到一条消息呗~

    talk@archlinuxcn.org: 欢迎加入 Arch Linux 中文 XMPP 群!

    注意!非Arch系统的问题请提前声明系统

    你的昵称默认为「<这里应该是个随机昵称然而咱不记得是啥了……>」, 使用「-nick 新昵称」来修改。

    设置一个新昵称然后打下招呼吧 😄

  • Telegram

    Telegram Messenger 是一个跨平台的即时通讯软件,它的客户端是自由及开放源代码软件, 但是它的服务器是专有软件。

    使用者可以相互交换加密与自解构的讯息,以及相片、影片、文件,支援所有的档案类型。

    官方提供移动端(Android、iOS、Windows Phone)、 桌面端(Windows、macOS、Linux)和网页端(Web version)应用;

    同时官方开放应用程序接口,因此会有一些第三方的客户端。

    后来为了防止破坏 Telegram 的群链接就取消啦,所以先用其它的方法进入频道, 把自己的 Telegram Username 告诉其它人,再让已经在 Telegram 群里的人邀请呗~

  • Gitter

    用 Github 或者 Twitter 账户登录,然后加入 https://gitter.im/archlinuxcn/generic 这个聊天室呗~

  • Martix

    用汝自己的 Martix 客户端 (比较常见的是以前叫做 vector 的 Riot)添加 #freenode_#archlinux-cn:matrix.org 这个房间就可以啦~

熟读 topic 确保人身安全 (雾 😂

Topic set by farseerfc (~farseerfc@archlinux/tu/farseerfc) on Fri, 04 Nov 2016 21:11:36

Arch Linux 欢迎喵 *^-^* | 卖萌

不是 arch 请事先声明发行版 | 因为大家默认都是 Arch 😂 另外衍生发行版也要明确

ttf-dejavu 注意新闻 | FFmpeg 3.1.1 | 中间大概会插两行官网的新闻和新的软件包

https://wiki.archlinux.org | ArchWiki

https://bbs.archlinuxcn.org | 中文论坛

https://github.com/archlinuxcn | 中文社区软件仓库

长文 https://cfp.vim-cn.com | 因为 IRC 没断行于是直接贴长文会刷屏😂,用法见那个网站

贴图 https://img.vim-cn.com | 😂 如果用 Telegram 或者 Martix 的话可以直接发图,传话机器人能完成转换

不要对着 teleboto xmppbot 说话,它们都是桥接机器人,人类的名字在它们后面 | 桥接机器人就是打通各个聊天软件的机器人啦~ 😋

机器人列表

除了上面说的桥接机器人以外,目前待命中的机器人还有(括号里是操作者的名字):

具体的功能还是各位慢慢发掘呗~

  • xmppbot 里的 Lisa ( lilydjwg )
  • varia ( gauge )
  • labots ( lastavengers )
  • Horobot ( FiveYellowMice )
  • MoBot ( Youmu )

分支频道


说好的 FAQ 呢 (╯‵_′)╯ ┻━┻ ??

by ホロ at November 21, 2016 04:00 PM

Arch Linux 中文社区非官方生存手册

汝要入坑Arch Linux了吗?那还不赶紧加入Arch Linux中文社区~

什么是Arch Linux?

Arch Linux 是一个针对 i686/x86-64 平台独立开发的 GNU/Linux 发行版,遵循轻量、简洁、优雅的开发原则,借灵活的架构应用于各种环境。Arch 安装后只提供最基本的系统,用户可以根据自己的需求来搭建不同的系统环境。官方并不提供图形化的配置工具,多数系统配置是通过修改文本文件来进行的。Arch 尽力提供最新稳定版本的软件。

Arch Linux 使用 Pacman 作为包管理器,它在提供了一个简单的包管理器同时,也提供了一个易用的包构建系统,使用户能够轻松地管理和定制官方提供的、用户自己制作的、甚至是来自第三方的各种软件包。仓库系统也能够让用户轻松的构建和维护自己的编译脚本、软件包和仓库,这样将有助于社区的成长和建设。

Arch Linux 的基本安装包由 [core] 软件库提供。此外 [extra], [community] 和 [testing] 软件库则提供了大量的的高品质软件以满足你的需求。Arch Linux 同时也通过 Arch 用户软件仓库(AUR)提供了 [unsupported] 软件库,里面有大量的编译脚本,用户可以通过 makepkg 工具轻松地从源码中编译软件。

Arch Linux 采用“滚动升级”策略,这样可以实现“一次安装,永久更新”。升级到下一个“版本”的 Arch Linux 几乎不需要重新安装系统,只需一行命令,你就能轻松的享受到最新的 Arch Linux。

Arch Linux 努力和上游软件源码保持一致,只有使程序能够在 Arch Linux 正常编译运行的补丁才会被加入更新中。

总之, Arch Linux 是一个灵活、简洁的、满足有一定经验的 Linux® 用户的需求的发行版。它强大且易于管理的特性,使其成为可以完美胜任服务器和工作站的发行版。它可以变成任何你想要的样子。如果你也认为这是一个 GNU/Linux 发行版该做的,欢迎你来自由使用并参与其中,为社区做出贡献,欢迎来到 Arch Linux!

Arch Linux 中文社区 ,翻译自 Archlinux.org .

先把Arch Linux装上先~

ArchWiki的文档应该算比较详细的啦~

加入Arch Linux中文社区论坛呗~

用Arch Linux时发现了些问题?英文水平不足担心发到 官方论坛 泥牛入海? 来中文论坛呗~

中文论坛在这~: https://bbs.archlinuxcn.org/

和参加其他的论坛讨论一样,先读读 phoenixlzx 写的 Arch Linux 中文社区 新手生存指南 , 官方编写的论坛礼仪指南 也可以作为参考呗~

加入中文社区的聊天频道呗~

和论坛相比,中文社区聊天频道更 活跃(洪水) 呗~

在多才多艺的百合仙子 lilydjwg , Tox传教士 quininer (后来 toxsync 去了 #archlinux-cn-offtopic ) ,和 PhD farseerfc 的协力下,社区交流群实现了irc+Telegram+xmpp+Tox的多通道联通,撒花~

加入irc频道

Web界面在这: #archlinux-cn

如果汝使用irc客户端的话:

irc服务器: irc.freenode.net

端口: 7000 (SSL) / 6667 (Plain)

通过XMPP加入

使用XMPP帐号添加 talk@archlinuxcn.org 为好友即可加入。成功加入将收到欢迎信息。

通过Tox加入

添加下面那个Tox ID为好友,然后按照它的提示操作呗~

34922396155AA49CE6845A2FE34A73208F6FCD 6190D981B1DBBC816326F26C6CDF3581F697E7

通过Telegram加入

hmmm.....为保护群组不被外星人攻击,所以这里就不贴上链接啦~

汝可以通过其它方法加入,贴上汝在Telegram的用户名呗~(其它已经在群里的用户会帮汝拉进来......)

或者,在Telegram上添加@Jqs7Bot这个机器人,通过群组查询中的Linux分类找到#archlinux-cn(irc)的链接再加入呗~

(后来链接被撤销了)

群内的一般原则

  • 要优雅,不要污~
  • (irc/xmpp/tox) 推荐一个由百合仙子帮忙的图床 https://img.vim-cn.com/ 呗~
  • (Telegram) 发没压缩的图片和声音的话irc可是收不到的哟~

如果汝的英语水平也不错的话......

如果汝的英语水平不错的话,太棒啦~,社区正需要汝这样的人呐~

汝可以......

by ホロ at November 21, 2016 04:00 PM

November 20, 2016

Justin Wong

GPG 与 SSH Agent 转发

我一直有这样的问题,当我 SSH 到某个远程主机时,就很难进一步进行 SSH 和 GPG 相关操作,因为远端没有我的私钥,如果直接把私钥拷贝到远程,则非常不安全。 自从有了yubikey之后,这个问题更加严重:私钥在 yubikey 里,根本不可能“拷贝到远程”。

过去我的一些做法是使用 usbip,相当于把 yubikey “挂载”到远程的机器上,这个太 hacky 了,并且配置麻烦,不灵活。

直到我发现了 SSH 已经可以转发 UNIX Domain Socket。

首先 SSH Agent 的转发非常简单,只要你使用 SSH Agent 保存密钥,那么用 ssh -A 连接主机,或者在 ~/.ssh/config 里写上 ForwardAgent yes 即可。

GPG Agent 的转发相对麻烦一些,版本要求是: OpenSSH >6.7 以及 GnuPG >2.1 。

首先,本地的 GPG Agent 要加上 --extra-socket 选项,用于 SSH 转发。文档的解释是:

–extra-socket name

Also listen on native gpg-agent connections on the given socket. The intended use for this extra socket is to setup a Unix domain socket forwarding from a remote machine to this socket on the local machine. A gpg running on the remote machine may then connect to the local gpg-agent and use its private keys. This allows to decrypt or sign data on a remote machine without exposing the private keys to the remote machine.

一般在 ~/.gnupg/gpg-agent.conf 里加上 extra-socket /path/to/extra/socket 就好。

然后使用 SSH Remote Forwarding 将远端 socket 转发到本地,也就是让 SSH 在把远程主机的一个 unix socket 转发到本地 GPG Agent 监听的 extra socket 上即可。 这里需要注意几点:

  1. GPG 2.1 之后,不再使用 GPG_AGENT_INFO 环境变量,而是一定会连接 $GNUPGHOME/S.gpg-agent (一般是 ~/.gnupg/S.gpg-agent)。
  2. GPG 2.1.13 之后,如果存在 /run/user/$UID/gnupg 目录, 则会把 gpg-agent 的 socket 放过去,如果不存在,则 fallback 到 $GNUPGHOME 里。
  3. 如果远端已经跑着一个 gpg-agent 了,就需要先关掉,否则 ssh 就无法监听需要转发的 socket 了

所以,使用以下命令进行 SSH 连接,才能成功转发 gpg agent

1
2
ssh -R /run/user/REMOTE_UID/gnupg/S.gpg-agent:/path/to/S.gpg-agent.extra \
-o StreamLocalBindUnlink=yes user@example.com

这里的 StreamLocalBindUnlink 是让 ssh 连接断开的时候,把远端监听的 socket unlink 掉,不然下次连接就会转发失败了。

这个参数比较长,很麻烦,所以也可以在 ~/.ssh/config 里加上

1
2
StreamLocalBindUnlink yes
RemoteForward /run/user/REMOTE_UID/gnupg/S.gpg-agent /path/to/S.gpg-agent.extra

亲测,在使用 yubikey 的情况下,远程主机可以正常进行签名、解密等操作,但是gpg --card-edit是被禁止的。

p.s. 测试的时候,确保远端没有 gpg-agent 在运行,执行一下 gpg-connect-agent /bye, 如果提示说 no running gpg-agent - starting '/usr/bin/gpg-agent' 就说明转发失败了。

以上。

我一直有这样的问题,当我 SSH 到某个远程主机时,就很难进一步进行 SSH 和 GPG 相关操作,因为远端没有我的私钥,如果直接把私钥拷贝到远程,则非常不安全。 自从有了yubikey之后,这个问题更加严重:私钥在 yubikey 里,根本不可能“拷贝到远程”。

过去我的一些做法是使用 usbip,相当于把 yubikey “挂载”到远程的机器上,这个太 hacky 了,并且配置麻烦,不灵活。

直到我发现了 SSH 已经可以转发 UNIX Domain Socket。

November 20, 2016 05:08 PM

定制GH60机械键盘

引: 年初时开源哥搞了个喜闻乐见的团购定制vim键盘的活动, 我饶有兴致地参团了,然而这事儿最后被厂家(TEX)放了鸽子,也就不了了之了。

不过我对键盘的购买欲倒是被激活了,原有的FC660M是个好键盘,但是不能定制键位,切稍微比我的挎包长了那么一点点, 加之最近股市大跌,愈发觉得钱不花真不值钱(谁来打醒我),便总是想买个新的。

挑了半天,poker2 和即将上市的 poker3 还是不够灵活,不能为所欲为…… 所以目光转向了硬件开源的 GH60。

在哪儿买的

首先调研了一番,在这里看见博主推荐一个 常州的卖家,于是也就找这个卖家做了。掌柜很nice,我对键盘并不是很懂, 也是第一次买定制键盘,掌柜给我科普了挺多。

最后选了无钢板茶轴+塑料外壳+HHKB配列(左shift和backspace拆成两个按键),卖家帮我焊接组装,3天搞定发货了。

上王道。

先说下手感吧,感觉远不如原先的FC660M手感好,轴感觉有些「松」,不知是不是没有钢板的原因,虽然同为原厂茶轴, 这块键盘的轴感觉很硬,按键不干脆,有一种「没上润滑油」的摩擦感。另外就是空格键,卫星轴做过工很一般,左边 稍微用点力敲,右边就会脱出,需要再按回去。

卫星轴的问题,想了个土办法解决了,在空格键右边卫星轴孔处塞了点纸巾 -_-||| 。轴太硬的问题,淘宝买了WD40 润滑剂,打算加点试试。

所以如果想follow自己也去买的话,注意一定要买带钢板的,当然有能力的同学就自己组装了。

刷固件

说完不开心的,来说点开心的。GH60最爽的就是完全可编程。中国买到的GH60基本都是satan的版本,与GeekHack的有所不同, 需要用tmk_keyboard_custom 这个项目编译出来的固件, 并且在config.h中加入一行

1
#define GH60_REV_CHN 1

你可以选择自己定义keymap或者已有的keymap,不过 tmk_keyboard_custom 的 gh60 中 keymap_common.h 有些问题, 建议手动跟 tmk_keyboard 中的代码 merge 一下。另外,即使不少自带的keymap 也会报 keys_count 找不到的错,需要在对应的 keymap_xxx.c 中加入以下代码

1
2
3
4
5
6
7
8
9
#ifdef KEYMAP_IN_EEPROM_ENABLE
uint16_t keys_count(void) {
return sizeof(keymaps) / sizeof(keymaps[0]) * MATRIX_ROWS * MATRIX_COLS;
}
uint16_t fn_actions_count(void) {
return sizeof(fn_actions) / sizeof(fn_actions[0]);
}
#endif

也可以直接使用我 fork 的 tmk_keyboard_custom,就不用改那么多代码了。

1
git clone --recursive https://github.com/bigeagle/tmk_keyboard_custom.git

计算机上要装 avr-gccdfu-programmer,Arch 的话源和 AUR 里就有。进入 keyboard/gh60 目录可以看到一群 keymap_xxx.c, 首先把固件编译出来:

1
make KEYMAP=xxx

刷固件时需要按下键盘背面的按钮进入dfu模式。

1
sudo sleep 5; sudo make KEYMAP=xxx dfu # 先把 sudo 密码敲了,在之后的 5 秒期间,按下键盘背面的按钮进入 dfu 模式

可以看到内部其实就是一个Atmel的单片机。

另外比较坑的一点就是,刷完之后一定要清空EEPROM,否则keymap不生效。清空的方法是,刷完dfu之后, 拔USB,按住space+backspace,插USB,等三秒,松开。注意这里的 space 和 backspace 都是键位刷新之前对应的键位。 而某次和 @jeasinema 折腾的时候,把 space 键给弄没了,于是无法刷新键位,解决办法是,把 tmk_core/common/bootmagic.h 中的 BOOTMAGIC_KEY_SALT 定义到别的按键上去,再用 X+backspace 刷新键位……

更高级的用法可以参见项目文档

我的Keymap

这里发一下我的keymap,除了Fn0之外,把数字键3也变成了一个Fn键,也就是正常按时候是3,按住不放就是一个Fn,于是 3+hjkl = 左下上右(vim用户都懂的)。

代码在这里,实现了 tricky_esc 功能(就是shift+ESC=~)。

引: 年初时开源哥搞了个喜闻乐见的团购定制vim键盘的活动, 我饶有兴致地参团了,然而这事儿最后被厂家(TEX)放了鸽子,也就不了了之了。

不过我对键盘的购买欲倒是被激活了,原有的FC660M是个好键盘,但是不能定制键位,切稍微比我的挎包长了那么一点点, 加之最近股市大跌,愈发觉得钱不花真不值钱(谁来打醒我),便总是想买个新的。

挑了半天,poker2 和即将上市的 poker3 还是不够灵活,不能为所欲为…… 所以目光转向了硬件开源的 GH60。

November 20, 2016 05:08 PM

给妹子看的 Arch Linux 桌面日常安装

謝邀。

准备工作

首先,准备一张你参加活动得到的 Ubuntu 或者 Deepin ,或者其他什么发行版的安装光盘,是的它有包装很漂亮,哦别急着找光驱,找个打火机把它烧掉,以示决心。

然后,拿出你收藏多年的《鸟哥的Linux私房菜》,不用翻开,啊烧掉有点可惜,把他送给你的冤家就好了。 鳥哥是 RedHat 玩家,而且内容太老了,作为新手的你用鳥哥指导 Arch Linux 安装只能误入歧途。 (鳥哥很萌哒,我不该黑他)

洗个手,沐浴更衣,斋戒三天,挑选良辰吉日,面向紫禁城方向摆好计算机,准备迎接挑战。

在开始之前,请在心中默念三遍:

Arch Linux是世界上最好的发行版,我一定能掌握它!

安装

假设你的男朋友已经给你装过一个ArchLinux, 启动它,然后:

# pacman -S arch-install-scripts

保证你能连接Internet,且/mnt没有被挂上什么奇怪的东西

准备磁盘

首先进行分区,你新买的ssd,假设是/dev/sdb,我们使用fdisk进行分区,

先安装工具

# pacman -S fdisk parted

然后

# fdisk /dev/sdb

g建立分区表,然后n建立一个新分区,大小200MB,我们暂时不用它, 再n建立一个足够大的分区,如果你不需要交换空间,就把剩下的空间都分给他, 否则就再留下和内存大小相当的空间做swap。

于是我们得到了这样的分区结构:

  • /dev/sdb1: 200M,空着
  • /dev/sdb2: ~110G 用来装东西
  • /dev/sdb3: 交换区

接下来设置引导标签,

# parted /dev/sdb
set 1 bios_grub on
quit

然后格式化分区,对SSD,使用4K的块大小

# mkfs.ext4 -b 4096 /dev/sdb2

接下来就可以挂载了,使用discardnoatime选项对你的SSD有好处

# mount -t ext4 -o discard,noatime /dev/sdb2 /mnt

安装基本系统

运行

# pacstrap /mnt base base-devel vim

安装基本系统,base是基础软件包组,base-devel是基础开发包组,vim是世界上最好的编辑器。

配置基础系统

生成fstab

运行

# genfstab -U -p /mnt >> /mnt/etc/fstab

你可以先打开/mnt/fstab查看一下,保证/的挂载点有discardnoatime选项,如果分了交换区,就

# echo "$(blkid -o export /dev/sda3|grep '^UUID') swap swap defaults 0 0" >> /mnt/etc/fstab

chroot

chroot到新安装的基本系统中,chroot就是进入某个目录,把它变成/的意思啦

# arch-chroot /mnt

运行passwd,设置root密码,要敲两遍,不要忘了它。

主机名、时区、blah…

用vim打开/etc/hostname,往里面写一个作为主机名的名字,只要字母、横线和数字。

然后修改时区,

#  ln -s /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime

然后用vim打开/etc/locale.gen,然后找到以下四行,取消注释:

en_US.UTF-8
zh_CN.UTF-8
zh_CN.GBK
zh_CN.GB2312

然后运行# locale-gen

再编辑/etc/locale.conf,里面写上

LANG="en_US.UTF-8"

现在生成启动要用到的ramdisk,

# mkinitcpio -p linux

现在# pacman -S wpa_supplicant dialog,保证新系统可以联网。

现在你可以安装其他觉得需要的包,比如bash-completion什么的。

引导器

有很多引导器可以选,作为妹子的你,装grub-bios就好啦

# pacman -S grub

然后

# grub-install --target=i386-pc --recheck --debug /dev/sdb
# grub-mkconfig -o /boot/grub/grub.cfg

重启

退出chroot环境,exit, 接着就可以reboot了。

欢迎来到新大陆

这是一片新大陆,一片荒芜,却充满生机,欢迎成为这里的开垦者。

基础

先使用# wifi-menu连接互联网。

添加用户

# useradd -m yooo
# passwd yooo

你应该需要sudo,以运行# visudo,在root ALL=(ALL) ALL下面加一行yooo ALL=(ALL) ALL

装X

# pacman -S xorg xorg-xinit xterm xorg-xeyes xorg-xclock

然后就可以startx一下看看有没有一个完爆win 3.1的图形界面了,如果没有就给我打电话…

装yaourt

/etc/pacman.conf里加入

1
2
3
[archlinuxcn]
SigLevel = Optional TrustedOnly
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch

然后

# pacman -Sy archlinuxcn-keyring yaourt

这里添加的 ArchLinuxCN 源是 archlinuxcn.org 的第三方源,包括了不少常用软件。

做出选择

现在,你可以选择简单模式,还是Hard模式。

简单模式

安装gnome

# pacman -S gnome

完成之后,运行

# systemctl enable gdm
# systemctl start gdm

第一行是让gdm开机自启动,第二行是现在就启动它…

一切都应该work out of box, 如果没有的话,找gnome的人喷他们,他们觉得自己能造出普世的开箱即用桌面环境。

困难模式

安装i3窗口管理器

# pacman -S i3

安装 lightdm 显示管理器,

# pacman -S lightdm-gtk3-greeter

然后

# systemctl enable lightdm
# systemctl start lightdm

登陆进i3之后会自动加载配置向导,基本上一路next即可。

安装网络管理器

# pacman -S netork-manager-applet
# systemctl enable NetworkManager.service
# systemctl start NetworkManager.service

列个软件包列表,应该都是你需要的

  • firefox, flashplugin: 浏览器和flash插件
  • xfce4-terminal: 我推荐的终端模拟器
  • tmux: 你懂的
  • nautiluspcmanfmnemo: 文件管理器
  • rofi: 启动器
  • compton: 开透明什么的需要
  • pnmixer: 调音量
  • gthumb: 看图
  • gnome-screenshot, deepin-screenshot: 截图
  • lxappearence: 设置主题、外观
  • numix-theme, numix-circle-icon-theme-git: 我喜欢的主题和图标,装完用lxappearence设置生效
  • nitrogen: 设置壁纸
  • conky: 系统状态监视
  • xfce4-power-manager: 电源管理
  • mate-notification-daemon: 桌面通知

还有好多日常软件日后慢慢告诉你…

拷贝配置文件

把旧系统中,/home/yooo/里的以下文件拷到现在的$HOME对应的位置里:

  • .bashrc: Shell配置
  • .xprofile: 进入X时的环境文件
  • .i3/*: i3的配置文件
  • .vimrc, .vim/: vim配置文件
  • .tmux.conf: tmux配置文件
  • .fonts/: 一些字体
  • .config/fontconfig/: 字体配置

其他的,例如壁纸之类,看着拷回来就是了…

输入法

安装fcitx

# pacman -S fcitx-im fcitx-sunpinyin fcitx-cloudpinyin fcitx-configtool

然后,确保自己的~/.xprofile里有以下三行:

export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS="@im=fcitx"

你的~/.i3/autostart.sh会再启动i3时自动运行fcitx,右键那个图标,把sunpinyin给enable了。

多媒体

播放器和解码器:

# pacman -S gstreamer ffmpeg smplayer

音频

# pacman -S alsa-utils pulseaudio-alsa

把自己加到用户组里

# gpasswd -a yooo audio
# gpasswd -a yooo video

一些字体

你现在的字体应该还比较难看,装上这些包:

# pacman -S wqy-microhei ttf-dejavu ttf-droid cantarell-fonts adobe-source-han-sans-cn-fonts

你应该还需要写带中文的$\TeX$文档,

# pacman -S texlive-most
# yaourt -S acroread-fonts-systemwide

未完待续

以上。

謝邀。

准备工作

首先,准备一张你参加活动得到的 Ubuntu 或者 Deepin ,或者其他什么发行版的安装光盘,是的它有包装很漂亮,哦别急着找光驱,找个打火机把它烧掉,以示决心。

然后,拿出你收藏多年的《鸟哥的Linux私房菜》,不用翻开,啊烧掉有点可惜,把他送给你的冤家就好了。 鳥哥是 RedHat 玩家,而且内容太老了,作为新手的你用鳥哥指导 Arch Linux 安装只能误入歧途。 (鳥哥很萌哒,我不该黑他)

洗个手,沐浴更衣,斋戒三天,挑选良辰吉日,面向紫禁城方向摆好计算机,准备迎接挑战。

在开始之前,请在心中默念三遍:

Arch Linux是世界上最好的发行版,我一定能掌握它!

November 20, 2016 05:08 PM

November 13, 2016

Phoenix Nemo

使用 Unbound 搭建更好用的 DNS 服务器

用了好久的 DNSMasq 方案终于在大半年前彻底炸掉了。

原因不光是 DNSMasq 性能和安全性完全不足以撑起公网缓存/递归 DNS 的任务,也有想要做反污染和加速的时候确实太蛋疼的问题。

现在使用的方案是 Unbound+DNSCrypt,外带一份加速列表。这段时间看来,不管在我本机还是在公网服务的两台,效果和反馈都很不错。

准备工作

需要的程序:

  • unbound
  • dnscrypt-proxy
  • makefile
  • git

makefilegit 用于处理 dnsmasq-china-list

Unbound 配置

修改文件 /etc/unbound/unbound.conf。没有这个文件的话,一般需要找一下软件包里提供的配置 example 文件复制过去。这里列出的仅包含需要修改的部分,其他的按照默认配置一般没有问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
num-threads: 2 # 线程数可以修改为物理核心数
interface: 0.0.0.0 # 侦听所有 IPv4 地址
interface: ::0 # 侦听所有 IPv6 地址
# 如果只需要本机使用,则一个 interface: 127.0.0.1 即可
so-rcvbuf: 4m
so-sndbuf: 4m # 本机使用的话,这俩 buf 可以取消注释
so-reuseport: yes # 如果开了多线程,就写 yes
msg-cache-size: 64m # 本机可以设置 4m 或者更小
rrset-cache-size: 128m # 本机可以设置 4m 或者更小
cache-max-ttl: 3600 # 建议设置一个不太大的值...专治各种运营商 DNS 缓存不服
outgoing-num-tcp: 256 # 限制每个线程向上级查询的 TCP 并发数
incoming-num-tcp: 1024 # 限制每个线程接受查询的 TCP 并发数
# 下面这四个不需要解释了吧,不想用那个就写 no
do-ip4: yes
do-ip6: yes
do-udp: yes
do-tcp: yes
tcp-upstream: no # 默认是 no,隧道状态比较稳的话也不需要写 yes。一些情况下强制使用 tcp 连上游的话写 yes
access-control: 0.0.0.0/0 allow # 本机用的话建议设置 127.0.0.0/8 allow,局域网用适当调整
root-hints: "/etc/unbound/root.hints" # 没有的话在 ftp://FTP.INTERNIC.NET/domain/named.cache 下载一份
hide-identity: yes # 不返回对 id.server 和 hostname.bind 的查询。
hide-version: yes # 不返回对 version.server 和 version.bind 的查询。
# 不过下面有 identity 和 version 的自定义选项,不隐藏这些的话,修改下选项还可以卖个萌(´・ω・`)
harden-glue: yes # 建议打开
module-config: "iterator" # 禁用 DNSSEC 检查,如果上游不支持 DNSSEC 就关掉。注意这个选项有可能在其他 include 的文件里
unwanted-reply-threshold: 10000000 # 针对各种网络不服,数值为建议值,具体可以自己修改看看效果
do-not-query-localhost: no # 一般是为了防止扯皮丢包开着,不过等下要用 DNSCrypt 所以关掉
prefetch: yes # 蛮好用的,开着吧
minimal-responses: yes # 省带宽,开着吧。本机用可以关掉
# 关键部分来了,把默认查询全部丢给 DNSCrypt。使用 [地址]@[端口] 指定查询地址和端口,默认端口 53。
# 然后把国内的地址丢给国内的缓存服务器。这两个选项的顺序不能错哟。
# 如果使用隧道查询,把这个地址改为隧道对端的地址,或者一个国外的 DNS 服务器都可以,例如 8.8.8.8。
# 具体看是在对端开 DNS 还是直接用国外的服务器。后者的话,前面 outgoing-interface 可以直接设置隧道本地端的地址,不过要配合 dnsmasq-china-list 的话,还是写路由表比较合适,否则不够灵活。
include: "/etc/unbound/accelerated-domains.china.unbound.conf"
forward-zone:
name: "."
forward-addr: 127.0.0.1@5353

DNSCrypt 配置

修改文件 /etc/default/dnscrypt-proxy

1
2
DNSCRYPT_PROXY_LOCAL_ADDRESS=127.0.0.1:5353 # 设置侦听在 127.0.0.1 端口 5353
DNSCRYPT_PROXY_RESOLVER_NAME=cisco # cisco 其实蛮快的,但是慢的话就去用个别的吧。d0wn 的那堆服务器真的不稳定,和名字一个样...

如果使用 systemd 的话这个文件就没用辣,看这里看这里

修改文件 /usr/lib/systemd/system/dnscrypt-proxy.socket

要修改的部分:

1
2
ListenStream=127.0.0.1:5353
ListenDatagram=127.0.0.1:5353

127.0.0.1:5353 就是上面 unbound 配置里 DNSCrypt 的监听地址。

dnsmasq-china-list 来加速

首先 clone 这个仓库到本地。

执行 make unbound 来生成一份 unbound 配置,然后放在上面 unbound 配置里写的地址,也就是 /etc/unbound/accelerated-domains.china.unbound.conf。默认的 DNS 是 114DNS,最不太近的一段时间都挺残的所以不建议用。如果要改为其他的,例如 DNSPod PublicDNS 的话使用 make SERVER=119.29.29.29 unbound 即可。

如果还需要一些特定的缓存上游设置,要放在 include: "/etc/unbound/accelerated-domains.china.unbound.conf" 这句前面。来举一只栗子。

举一只果子的栗子。

AppStore 的加载和下载速度一直在国内饱受一些极客们的诟病,然而同时饱受诟病的运营商 DNS 解析 AppStore 的下载地址反而是国内的 CDN 地址,速度会非常快。

需要使用 dig 工具,并且要在国内的网络环境下测试。Linux 发行版里都有包可以装,OS X 则自带。

第一条命令:dig +trace a100.phobos.apple.com.

递归追踪解析结果,这个记录被 CNAME 到了 a100.phobos-apple.com.akadns.net.

第二条命令:dig +trace a100.phobos-apple.com.akadns.net.,得到这条记录被 CNAME 到了 a1-a200.itunes-apple.com.akadns.net.

第三条命令:dig +trace a1-a200.itunes-apple.com.akadns.net.,看到了 CDN 的地址,a1-a200.phobos.apple.chinacache.net.

所以如果有国内的地址直接去跟踪解析 akadns.net 的 DNS 的话,一般是可以正确解析到国内 CDN 的。先找一个 akadns.net 的权威 NS 地址,比如 a1-128.akadns.net 对应的 IP 是 193.108.88.128。同时还得有国内的 CDN 地址也从国内地址去解析,那么配置里这样写:

1
2
3
4
5
6
forward-zone:
name: "akadns.net."
forward-addr: 193.108.88.128
forward-zone:
name: "chinacache.net."
forward-addr: 119.29.29.29 # DNSPod PublicDNS 的服务器地址

多次尝试之后,发现还有一个 CDN 地址 0gq2p7eckbs26f.mwcname.com,那么也把这个地址交给 unbound 通过国内网络解析。

1
2
3
forward-zone:
name: "mwcname.com."
forward-addr: 119.29.29.29

一并加到上面的配置里,然后来测试下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Phoenix-X1-Carbon :: ~ » dig @127.0.0.1 a100.phobos.apple.com

; <<>> DiG 9.10.3-P4 <<>> @127.0.0.1 a100.phobos.apple.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24454
;; flags: qr rd ra; QUERY: 1, ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;a100.phobos.apple.com. IN A

;; ANSWER SECTION:
a100.phobos.apple.com. 3596 IN CNAME a100.phobos-apple.com.akadns.net.
a100.phobos-apple.com.akadns.net. 117 IN CNAME a1-a200.itunes-apple.com.akadns.net.
a1-a200.itunes-apple.com.akadns.net. 297 IN CNAME a1-a200.phobos.apple.chinacache.net.
a1-a200.phobos.apple.chinacache.net. 1799 IN CNAME a1-a200.phobos.apple.cncssr.chinacache.net.
a1-a200.phobos.apple.cncssr.chinacache.net. 1799 IN CNAME cc00109.h.cncssr.chinacache.net.
cc00109.h.cncssr.chinacache.net. 120 IN A 223.99.228.87
cc00109.h.cncssr.chinacache.net. 120 IN A 113.207.33.15
cc00109.h.cncssr.chinacache.net. 120 IN A 113.207.33.12
cc00109.h.cncssr.chinacache.net. 120 IN A 202.110.80.14
cc00109.h.cncssr.chinacache.net. 120 IN A 61.179.105.154
cc00109.h.cncssr.chinacache.net. 120 IN A 61.179.105.7
cc00109.h.cncssr.chinacache.net. 120 IN A 119.188.138.172
cc00109.h.cncssr.chinacache.net. 120 IN A 120.192.248.195
cc00109.h.cncssr.chinacache.net. 120 IN A 221.181.39.76

;; Query time: 233 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Apr 28 00:34:02 CST 2016
;; MSG SIZE rcvd: 387

走国内 CDN 了吧~

重启相关服务,更改自己所用的 DNS 地址,完事儿收工(「・ω・)「

=== 2016-04-30 14:00 更新 ===

如果需要 edns-client-subnet 支持的话,需要手动编译源码安装。命令

1
2
3
4
# 克隆源码
svn co http://unbound.nlnetlabs.nl/svn/branches/edns-subnet/
# 编译安装
./configure --enable-subnet --with-libevent && make && sudo make install

配置文件的格式

1
2
# 默认向所有服务器发送 edns-client-subnet
send-client-subnet: 0.0.0.0/0

如果只对特定权威 DNS 发送 edns-client-subnet 请求,则按照此格式写多行 IP。

用了好久的 DNSMasq 方案终于在大半年前彻底炸掉了。

原因不光是 DNSMasq 性能和安全性完全不足以撑起公网缓存/递归 DNS 的任务,也有想要做反污染和加速的时候确实太蛋疼的问题。

现在使用的方案是 Unbound+DNSCrypt,外带一份加速列表。这段时间看来,不管在我本机还是在公网服务的两台,效果和反馈都很不错。

November 13, 2016 04:54 AM

November 12, 2016

Phoenix Nemo

关于 SSL 和 IPKVM/VNC Applet 的笔记两则

虽然是没啥关系的两个东西不过最近没啥可写的所以放在一块做个笔记。

COMODO SSL CA 正确的串联姿势

有客户买了 COMODO Positive SSL 之后问我证书链变了要怎么串联。嘛确实文件变多了不过不至于这就不会了吧…

SSL 证书串联用 cat 命令的话顺序是自下而上,也就是 自己的证书 -> 二级 Intermediate CA -> 一级 Intermediate CA -> Root CA

所以不管文件有多少这个顺序总是有的。以 COMODO Positive SSL 为例,假设域名为 example.comcat 的串联命令:

1
cat example_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > example_com.signed.crt

于是就可以拿着 example_com.signed.crt 和生成 CSR 时一并生成的 example_com.key 去给 NGINX 咯。

附一份 NGINX 配置样例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {
listen 80;
listen [::]:80 ipv6only=on;
server_name example.com;
## redirect http to https ##
rewrite ^ https://example.com$request_uri? permanent;
}

server {
listen 443 ssl;
listen [::]:443 ssl ipv6only=on;
server_name example.com;

ssl on;
ssl_certificate /etc/nginx/ssl/example_com.signed.crt;
ssl_certificate_key /etc/nginx/ssl/example_com.key;
ssl_protocols SSLv3 TLSv1;
ssl_prefer_server_ciphers on;
ssl_ciphers ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM;
keepalive_timeout 70;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

location / {
# ...
}
}

最后不忘打广告: [https://c.phoenixlzx.com]

=== 2014-10-15 更新 ===

SSLv3 再次爆出漏洞,在 Google 的新草案 TLS_FALLBACK_SCSV 还未明朗的情况下,目前禁用 SSLv3 是一个 不考虑 IE6 的 workaround。

1
2
3
4
5
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

IPKVM/VNC Applet 的使用

从 7u45 版本之后的 Java Webstart 就不能再直接执行 Ubersmith/SolusVM/Proxmox 等等的 IPKVM/VNC Applet 了。虽然实际上是这些商业软件的错不过还是很想让人骂 Java。

解决方案:下载一个旧版的 Java,比如 jdk6。

但是直接安装也是不能运行的,因为实际上调用的 java executable 是最新版 Java 的,所以一样报错。

如果是在 Linux 下,jre6 的目录在 $HOME/jre6/jre1.6.0_38,那么下载到 Applet 之后用下面的命令启动:

1
2
applet_path=/path/to/your/applet.jnlp
~/jre6/jre1.6.0_38/bin/java -verbose -Xbootclasspath/a:~/jre6/jre1.6.0_38/lib/javaws.jar:~/jre6/jre1.6.0_38/lib/deploy.jar:~/jre6/jre1.6.0_38/lib/plugin.jar -classpath ~/jre6/jre1.6.0_38/lib/deploy.jar -Djava.security.policy=file:~/jre6/jre1.6.0_38/lib/security/javaws.policy -DtrustProxy=true -Xverify:remote -Djnlpx.home=~/jre6/jre1.6.0_38/bin -Dsun.awt.warmup=true -Djnlpx.origFilenameArg=$applet_path -Djnlpx.remove=false -esa -Xnoclassgc -Djnlpx.splashport=59999 -Djnlpx.jvm=~/jre6/jre1.6.0_38/bin/java -Djnlpx.vmargs="-esa -Xnoclassgc" com.sun.javaws.Main $applet_path

虽然是没啥关系的两个东西不过最近没啥可写的所以放在一块做个笔记。

November 12, 2016 01:47 AM

2014·夏

2014年的夏天应该是我一直以来度过的最繁忙和劳累的一段时光。多方面的压力、打击、困扰,加上自身各种情况条件不利,这个暑假真的让人感觉非常憋屈窝囊。

实习

最值得一提的当然是我的第一份实习。大三下学期那会也就是想找个实习锻炼下自己,也可以给家里减轻一些经济负担。在 Twitter / V2EX 发布求职贴之后陆续有不少公司找上门来,大部分公司都给出了非常不错的条件,有些甚至在我明确答应之前就问我什么时候过去…虽然简历写得比较糟糕,不过仅仅通过和各种公司打交道还是见识到了一点互联网行业的竞争状态。也算是头一回知道原来北京的创业公司工资可以给这么高

最终选择爱奇艺的原因大概就是 iven 前辈所说可以玩集群和虚拟化。虽然公司给的待遇实在让我不知道说啥比较好(除去房租几乎不够生活费,回学校一趟花掉一半工资在路费上…),但是在经济状况还没有糟糕到不得不去待遇最高的公司的时候,我还是想多见识点东西学学经验。说实话爱奇艺没怎么让我失望,工位上就有质量非常好的千兆公网带宽,配备23寸 Dell 显示器(虽然主机配置不怎么样…),弹性工作制,且几乎没有看到员工加班(虽然听说很多人回家后还是会挂上 VPN 连回公司继续工作),办公环境有物业定时打扫,茶水间的阿姨遇到自动售货机有优惠活动就会通知大家,看我打了几个喷嚏还专门去帮我拿了药,公司对于新员工和实习生的成长也算是费了脑筋…

感受颇深的是我所在的团队。在校期间经常和已经参加工作的前辈们闲聊,前辈们吐槽和抱怨比较多的基本上就是一些比较奇葩的同事,其次是公司的种种不合理。我一直认为在公司遇到奇葩同事属于及其正常甚至一定会发生的现象,在决定动身去帝都的时候也做了很多心理准备和各种应对处理办法。不过来到之后发现我想太多… 团队成员友好和睦程度完全超出我的想像,完全没有遇到之前朋友们吐槽的种种情况。每天中午都是一起出去吃饭,路上一边挑餐厅挑半天一遍各种调侃…互相尊重、理解、关心、帮助几乎是整个团队互动的原则。

说到这里其实我有些愧疚。因为自身的很多原因,每天工作的效率都非常低,心情也相当不好,写代码自然也极其浮躁。iven 前辈每次 review 代码的时候都会提出一大堆完美主义的问题,要我一遍一遍修改重构,甚至有时候让我感觉「为什么要把一大堆坑死人不偿命的框架揉在一起,为什么我有一只处女座的 mentor」… 不过事实是我发现自己在写代码的时候越来越想着更优化的解决方案,框架内提供了解决方案的尽量不去用 hack 的方法。在面对一堆完全陌生的框架揉在一起的坑,且自己整个人都很不好的情况下,还是发挥出了平日 1/3 的开发效率。韧性应该有不少提高吧…

跑路

曾经津津乐道卖 VPS 的某某某又跑路了~ (为何是「又」…) 可是现在我也要干这种事。想想真是可笑。

其实跑路并不是一方原因直接决定,也算是很多方面的共同作用结果。一直以来 UltraKVM 项目都处于亏损状态且耗费了我大量的精力,但是由于整个虚拟化平台上还有很多朋友在跑的应用,我也还是一直坚持着做下去。8月份的攻击事件之后我把机房寄发的账单转给了吸引攻击流量的客户,却被喷小公司服务不靠谱。客户修改了自己的联系信息之后不见踪影(其实修改客户信息,财务面板是会发邮件的… 所有历史信息都会留底,所以不要觉得自己改了信息就找不到了)。无奈之中找朋友诉苦,意想不到地得到了帮助。于是向机房发邮件请求下架机器,并向他们一直以来的高质量服务表示感谢(MultaCOM 机房是我目前见过的最好的机房没有之一,不管是网络还是服务)。机房帮我取消了攻击流量的账单,在我指定的日期帮我下架机器并寄送到另外的机房。因此对 MC 机房也抱有很深的歉意。

为了这件事情,我三天没吃下饭,睡不着觉,通知客户备份数据的邮件发了一遍又一遍,担心用 sendmail 发会被丢到垃圾箱还用自己的个人邮箱发了两遍,承诺会在新机房上线并为所有有效客户提供为期至少一年的免费 VPS 服务。(吐槽:就这样还有人在下架之后找我说 VPS 为啥不能访问了云云让我感觉非常不爽,同时感谢朋友的帮助才让我有偿还客户的机会)。一直到给机房发送了最后要付的所有费用之后才算是舒坦了一些。

权限狗

暑假里另外一件闹得比较欢乐的事情是喵窝服务器。应该是敖厂长的原因(?) 整个姬家都可以看到很多人在玩 Minecraft。一边在姬家宣传,管理组也是费尽了心思来准备向墙内玩家开放申请。

其实向墙内玩家开放也是我主要在推,因为墙内确实很多高素质的玩家(先不说游戏技术如何),我很希望能吸引到这些玩家来玩。17精心策划了宣传帖,二小姐把之前用的服务器寄到了帝都,我和壕桥手忙脚乱地把服务器送到机房调试了一个晚上,我还花了两个小时写了申请表单的程序,都是在为了迎接新玩家所做的准备。

不过事实上情况并没有我们想像得那么好。前三天来申请的玩家里,过审率只有不到1/12,接下来的两天里更是掉到了 1/20。从开放申请到开学之前,几乎每天都是好几十封白名单申请邮件。前几天去大概看了下,过审率依旧是 1/15 的样子。不过就算如此严格的审核,我们依然遇到了漏网之鱼…

事件经过详细说的话估计今晚我就不用睡觉了。大致就是先后有三个熊孩子在服里发飙被封,一个是要在毫无干系的百度贴吧到处发帖把我和其他几个管理骂了一通,要和我「正面刚」(…错字?),另一个则恐吓我说要去 mcbbs 「好好说说这件事」。再后面则是一个熊孩子根本没过审核,在群里刷屏伸手被拒绝后骂我们对新手不友好,是「虐待他」…..于是目前还记得的就这仨。

熊孩子被封么无非就是到处发帖子骂,是不是相关论坛也不管(素质…),然后拼命要求加群加好友然后在附言里破口大骂权限狗一类的词,或者是各种无理取闹要求入群入服或者挑衅之类。这么看咱这开源社区的管理员都算是非常好当的了233,对付熊孩子咱也只有放置 play 咯。”Argue with idiots, and you become an idiot.” – Hackers and Painters

客户中心

从大一开始我就在做各种域名/主机/数字证书的代理商,来找我买的都是姬家或者其他 SNS 的朋友,我也没怎么去宣传,权当是自己用也方便下朋友用吧。不过麻烦在于一个域名后缀在几家注册商都可以注册这样的问题,客户为了拿到更低的价格光在我这里就要注册好几个帐户。因此整合自己的业务,做统一的客户中心算是早就有的想法。在返校前两天的时候终于抽时间搭了起来,顺便用掉了两张阿里云的抵用券。广告:地址在 [https://c.phoenixlzx.com]

于是麻烦又来了——

坑:换了域名,支付宝的接口要重新审核。一连三次审核失败:

  • 第一次:网站无法访问——泥煤啊我是 https 好吗!
  • 第二次:网站非中文——泥煤啊我有多语言支持的好吗!另外狗爹那样的专业坑爹英文站怎么过审的?!
  • 第三次:网站未备案——泥煤啊我之前一样不备案怎么过审的?!一个二级域名你给我备案试试看啊!

于是干脆不提交审核了,我想其他办法用。

坑:Hostbill 默认货币选择的 USD,于是支付宝接口愣是不显示。不要那么智能好吗?敢不敢在结帐的时候自动转换?!

然后我批量更新了下产品价格,然后手残误操作把价格提太高了,想再降回去,于是玩完:所有产品的价格配置坏掉了。200多个产品啊!我一个个改得心脏都早搏了………

坑:Hostbill 自己的 whois 文件有问题,很多域名后缀无法正确查询可用性。Google 了半天找到一个论坛的帖子有解决方案,却没有提供 patch 过的文件。没办法自己一点点按照修改步骤打了 patch。由于在公司被 mentor 带出来的习惯,每一处独立的变更都会 commit 一次,然后创了一晚上80个 commit 的记录…..壕桥我超过你的一天50个记录了!

剩下没有的域名自己按照类似的方法也修了,文件丢在 Github

返校

学校的事情一直想等毕业以后再写,写本文的时候也纠结了很久,最后还是稍微写一点点。本来公司的项目第一个版本就要上线,还差最后的几个功能,突然接到母上大人的电话要求我返校报到。直接结果是——我下个月生活费不够了。

然后在学校便是各种跑宿舍分配、联系任课老师等等等…

比较让我提起精神的事情是发现社团办公室整洁了不少,书架上也放满了各种著名的计算机类书籍。新任主席也不像以前那么傲娇,而且一个月写出了一套很不错的前端页面(blueed 老伙计你可以安心的去了…

归京

明天就回帝都了。今晚好好休息… 虽然还有很多憋屈的事情根本都没提,不过也算是吐出来不少。希望回去公司可以有更好的状态吧。

晚安,好梦。

2014年的夏天应该是我一直以来度过的最繁忙和劳累的一段时光。多方面的压力、打击、困扰,加上自身各种情况条件不利,这个暑假真的让人感觉非常憋屈窝囊。

November 12, 2016 01:46 AM

Sierra 4G LTE EM7345 with Arch Linux

X1 Carbon 2015 内置 Sierra EM7345 4G LTE 适配器,系统里看到是这样:

1
2
$ lsusb
Bus 001 Device 002: ID 1199:a001 Sierra Wireless, Inc.

根据 ThinkPad EM7345 4G LTE Mobile Broadband - Overview and Service Parts 这块 EM7345 基本完美支持联通的 3G/4G 制式。

插入 microSIM 卡,然后安装需要的包:

1
# pacman -S usbutils usb_modeswitch modemmanager mobile-broadband-provider-info

启用 modemmanager 服务

1
systemctl enable modemmanager.service

然后加载内核模块 cdc_mbim,文件 /etc/mkinitcpio.conf

1
MODULES="... cdc_mbim"

重新生成内核镜像

1
# mkinitcpio -p linux # or change to your kernel preset here

重启即可在 NetworkManager 中新建 GSM 设备的 broadband (移动宽带) 连接。

顺便上一张图,老家小城市还是郊区所以 4G 信号几乎没有,还是达到了这个速度,点个赞(๑•̀ㅂ•́)و✧

Sierra EM7345 4G LTE Speedtest on China Unicom

参考文档:

X1 Carbon 2015 内置 Sierra EM7345 4G LTE 适配器,系统里看到是这样:

1
2
$ lsusb
Bus 001 Device 002: ID 1199:a001 Sierra Wireless, Inc.

根据 ThinkPad EM7345 4G LTE Mobile Broadband - Overview and Service Parts 这块 EM7345 基本完美支持联通的 3G/4G 制式。

November 12, 2016 01:46 AM

公共场合请使用指纹识别器

前几天带本本去导师办公室修改论文,虽然开机启动速度快,但是还是在老师的注视之下紧张敲错了三遍密码…得,本来没在意的也记住密码了(ry

所以为啥有指纹识别器的本子偏偏要输密码(:з」∠)

检查设备

总之先来看下指纹识别器是哪家生产的好了。

1
2
Phoenix-X1-Carbon :: ~ » lsusb | grep -i 'finger'
Bus 001 Device 003: ID 138a:0017 Validity Sensors, Inc. Fingerprint Reader

搜索一下就发现 X1 Carbon Gen3 这么受欢迎的本子早已上了 ArchWiki https://wiki.archlinux.org/index.php/Lenovo_ThinkPad_X1_Carbon_(Gen_3)

安装驱动

安装 fprintd 包,这个包会依赖 libfprint,但是官方仓库中的 libfprint 目前的版本在此指纹识别器上无法正常工作,表现为 enroll 只扫描一次,并且无法验证指纹。

Note that recent versions of fprint are broken for this model : One is able to enroll a finger but recognition always fails.

GitHub 上已经有了 vfs5011 相关的 issue 和 fix,但是还没有发布新的稳定版。所以暂时安装 aur/libfprint-git 包。

配置指纹验证

Fprint - ArchWiki 上已经给出了配置方法。将 auth sufficient pam_fprintd.so 加入 /etc/pam.d/system-local-login 中的第一位置即可。同样方法可以用于 /etc/pam.d/ 下的其他文件。例如 KDE 登陆使用的 sddm

扫描指纹,以普通用户身份命令:

1
$ fprint-enroll

默认是右手食指。可以使用 -f 选项指定手指。正常的表现为成功扫描五次即可保存指纹,并且在需要验证的时候自动启动指纹识别器。不过还有个小问题,如果保存多个指纹,似乎只能识别保存指纹列表中的第一个。

然而我懒得折腾了就这样吧

前几天带本本去导师办公室修改论文,虽然开机启动速度快,但是还是在老师的注视之下紧张敲错了三遍密码…得,本来没在意的也记住密码了(ry

所以为啥有指纹识别器的本子偏偏要输密码(:з」∠)

November 12, 2016 01:45 AM

在异步方法中使用 for 循环,以及循环中包含异步方法的几点坑

又是熬夜干活。

之前在 StackOverflow 上看到过 Array.forEach 是同步(阻塞)的,但是实际使用的时候,特别是我在写 Node.js 程序的时候几乎没感觉到过它的阻塞—— forEach 或者其他 for 循环之后的 callback 从来都是被立即调用,没有等待整个循环执行完。<== 这个命题是个假命题,下面会说明。

今天又一次掉进异步的坑里才发现 for 循环确实是阻塞的。至于为何它后面的回调函数会立即被调用,原因是 for 循环里有异步方法。整个循环不会等待异步方法结束,而是直接进入下一个循环,所以它 看起来 像是异步的,后面的回调函数「立即」被调用了。StackOverflow 上有更详细的例子和说明。

不过如果是数组,那么直接使用 async 替代原生的 forEach 和其他 for 语句即可简单解决。但是问题出在我这里的情况是要用 for in 语句处理 Object,虽说 Javascript 里 Object 和 Array 非常相似但是毕竟没有 Array 那些好用的方法,在这种情况下也不方便使用 prototype 来给我的 object 新增类似方法。二小姐给出的解决方案是手动设置计数器,获得 object 长度的办法是使用 Object.keys(obj).length

注意 Object.keys(obj).length 并不一定是要循环的次数,具体需要看 Object 的结构。我这里就是解析 DOM 得到的 Object 所以有额外的东西,length - 3 才是需要的结果。

代码写出来大概是这个样子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function(obj, callback) {

var tasks = Object.keys(obj).length;

var arr = ['one', 'two', 'three'];

for (key in obj) {

tasks--;

async.eachSeries(arr, someFunc(n, cb) {

// do stuff here.

cb();

}, function(err) {

// operations after array iteration completed.

if (tasks === 0) {

// All tasks done, return to callback
return callback();

}

});
}
}

判断的语句其实也可以放在 async.eachSeries 之后,这样可以明显减少判断的计算(虽然那点计算不算啥) 但是也有可能会在没等待最后一次 async 执行结束的时候就返回了,所以保险起见还是多花点处理器来保证全部任务执行完。以及在最后 callback 的时候如果不写 return 就会失效。我还没查原因,因为已经累得不行了… 所以(当回伸手党)如果哪位童鞋知道的麻烦告知… 有灵梦的节操相送哦 >///<

==== 2014-05-20 更新 ====

感谢 Xuetian Weng 菊苣为了灵梦的节操不远万里给我纠错 /w\ 上面的代码在 async.eachSeries 里有异步方法时存在多次 tasks === 0 的情况,因为同样的因为 for in 循环不会等待 async 结束,async 的回调不一定会在 tasks 下一次自减之前被调用。解决办法是 tasks-- 放在 async.eachSeries 的回调函数里。更好些的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function(obj, callback) {

var tasks = Object.keys(obj).length;

var arr = ['one', 'two', 'three'];

for (key in obj) {

async.eachSeries(arr, someFunc(n, cb) {

// do stuff here.

cb();

}, function(err) {

// operations after array iteration completed.

// tasks self-decrease should be here to ensure every async.eachSeries call has ended.
tasks--;

if (tasks === 0) {

// All tasks done, return to callback
return callback();

}

});
}
}

不过菊苣说最后的 return 是可有可无,我这里的测试是不加 return (不管是在前面还是后面) 这个 callback 都不会被正确调用… 所以 return 的问题并没有算是解决,于是放到后面有时间的话来满满折腾吧~看 Xuetian Weng 菊苣如此渴求节操的表情咱就给一点表示感谢好了呜(双手奉上

又是熬夜干活。

November 12, 2016 01:45 AM

使用 IPSec 连接带有 chnroutes 的隧道网络配置小记

标题似乎不是很易懂,于是解释下先。

位于大陆的服务器 A 和位于海外的服务器 B,A 与 B 之间使用隧道互联成内网,服务器 A 配置 chnroutes 以在必要的时候通过海外服务器访问网络,并在服务器 A 上配置 IPSec 服务器,从而使终端用户能够在任何网络环境下安全接入内网。大致描述如下:

需要加速海外访问时:终端用户 <- IPSec VPN -> 服务器 A <- 隧道 -> 服务器 B <-> 互联网

需要访问大陆网域时:终端用户 <- IPSec VPN -> 服务器 A <-> 互联网

此场景适用于互联网公司为员工提供快速、安全、便捷的工作网络环境,对于个人用户来说负担较大,不建议使用。

配置隧道

最简单的方案在服务器 A 和 B 上配置 GRE 隧道即可,步骤简单不再赘述。需要注意的是为了能让客户端的内网地址能够访问到隧道的对端,也就是服务器 B 端,服务器 B 上配置隧道时 peer 的参数应当是包含服务器 A 和 VPN 客户端 IP 的 IP 段,例如 ip addr add 10.7.0.1 peer 10.7.0.2/24 dev gre0

隧道打通后,服务器 A 的路由配置为:

  • 到服务器 B 的公网 IP 路由经服务器 A 的公网网关出站
  • 默认出口路由为隧道对端
  • 注意设置内网之间的路由
  • chnroutes 配置到大陆的流量经由服务器 A 的公网网关出站

配置 IPSec

安装 strongswan

1
# apt-get install strongswan

修改 /etc/ipsec.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
config setup
charonstart=yes
nat_traversal=yes
uniqueids=never # 修改为 yes 可以限制为单个设备连接

conn ios
keyexchange=ikev1
authby=xauthpsk
xauth=server
left=%defaultroute
leftsubnet=0.0.0.0/0
leftfirewall=yes
right=%any
rightsubnet=10.7.0.64/26 # 在配置的隧道网段中选择一个小段以避免地址冲突
rightsourceip=10.7.0.65/26 # rightsubnet 和 rightsourceip 按情况
pfs=no
auto=add

修改 /etc/ipsec.secrets

1
2
3
: PSK "Your pre-shared key" # 预共享密钥,注意修改引号内部分

username : XAUTH "userP@ss" # 用户名和密码,按格式每行一个

配置 iptables 转发

1
# iptables -t nat -A POSTROUTING -o <公网网卡> -s <VPN 网段> -j SNAT --to-source <公网地址>

在本例中,iptables 的命令为

1
iptables -t nat -A POSTROUTING -o eth0 -s 10.7.0.64/26 -j SNAT --to-source xxx.xxx.xxx.xxx

DNS 加速优化

既然是服务器中转分流,那么需要在服务器上进行 DNS 解析方可获得最佳效果。

安装 dnsmasq 和 git

1
# apt-get install dnsmasq git

修改 /etc/dnsmasq.conf 部分:

1
2
server=8.8.8.8 # 默认上游服务器通过隧道交由 Google DNS 解析以获得最佳海外站点效果
conf-dir=/etc/dnsmasq.d # 启用配置文件目录

获取 dnsmasq-china-list,将其中的配置文件软连接到 /etc/dnsmasq.d 下即可使用 114DNS 直接解析大部分需要加速的国内站点。

屏蔽公网对本机 DNS 服务的直接访问:

1
2
# iptables -A INPUT -p udp -d <服务器 A 公网 IP> --dport 53 -j DROP
# iptables -A INPUT -p tcp -d <服务器 A 公网 IP> --dport 53 -j DROP

修改 /etc/strongswan.confcharon { ... } 块内添加:

1
dns1 = 10.7.0.2  # 此处可填服务器 A 上除公网 IP 和 localhost 之外的任意可绑定 IP 地址,例如隧道的本地端地址

测试

一切就绪后重启 strongswan 服务:

1
# service strongswan restart

客户端的 IPSec VPN 配置:

  • 服务器地址为服务器 A 的公网地址
  • 用户名、密码、预共享密钥为服务器 A 中配置文件中的值

连接上之后在客户端 ping 任意公网 IP、服务器 A 和服务器 B 的隧道端 IP 应该都是通的。至此,客户端连接 IPSec VPN 后所有流量都会加密经由服务器 A 中转,在必要时会经由海外服务器 B 转发,保证了访问工作必需站点的速度和在任何公共网络环境下的数据安全。

标题似乎不是很易懂,于是解释下先。

November 12, 2016 01:45 AM

使用 iptables 过滤 DNS 放大攻击

昨晚开始我们的 DNS 日志中出现大量的针对wradish.comANY记录请求,导致大量正常解析请求超时。今天上午到中午时分再次出现流量更大、针对ping.zong.co.uaANY记录请求,导致整个 DNS 服务瘫痪,完全无法响应正常解析请求。

检查后发现 wradish.com 早已因多次 DNS 放大攻击而被列入开放 DNS 服务器黑名单,网络上也有大量的针对该域名攻击请求包的过滤方法。ping.zong.co.ua 却完全没有任何搜索记录。

DNS 放大攻击 (DNS Amplification Attack) 即通过向多台 DNS 开放服务器发送无意义的 recursive 解析请求,从而使得根域名服务器遭到超大流量的解析请求包,无暇顾及正常的解析请求,由此实现分布式拒绝服务攻击 (Distributed Denial of Service)。我们的 DNS 服务器在这里既是攻击者,也是受害者。

DNSMasq 默认允许 recursive 请求,且似乎本身就没有设计为开放 DNS 服务,所以貌似也没有办法禁用掉 recursive 请求。因此我们使用 iptables 规则来过滤掉这些请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Create a chain to store block rules in
iptables -N BADDNS

# Match all "IN ANY" DNS Queries, and run them past the BADDNS chain.
iptables -A INPUT -p udp --dport 53 -m string --hex-string "|00 00 ff 00 01|" --to 255 --algo bm -m comment --comment "IN ANY?" -j BADDNS
iptables -A FORWARD -p udp --dport 53 -m string --hex-string "|00 00 ff 00 01|" --to 255 --algo bm -m comment --comment "IN ANY?" -j BADDNS

# Block domains that are being used for DNS Amplification...
iptables -A BADDNS -m string --hex-string "|04 72 69 70 65 03 6e 65 74 00|" --algo bm -j DROP --to 255 -m comment --comment "ripe.net"
iptables -A BADDNS -m string --hex-string "|03 69 73 63 03 6f 72 67 00|" --algo bm -j DROP --to 255 -m comment --comment "isc.org"
iptables -A BADDNS -m string --hex-string "|04 73 65 6d 61 02 63 7a 00|" --algo bm -j DROP --to 255 -m comment --comment "sema.cz"
iptables -A BADDNS -m string --hex-string "|09 68 69 7a 62 75 6c 6c 61 68 02 6d 65 00|" --algo bm -j DROP --to 255 -m comment --comment "hizbullah.me"

# Rate limit the rest.
iptables -A BADDNS -m recent --set --name DNSQF --rsource
iptables -A BADDNS -m recent --update --seconds 10 --hitcount 1 --name DNSQF --rsource -j DROP

添加以上规则后执行 iptables-save 来使更改生效。

目前为止似乎没有报告出现了明显规模的 DNS 放大攻击征兆,攻击者针对我们防火墙封锁的反应速度、攻击所用的记录以及从日志中发现的大量不同请求源也暗示着我们的服务器可能是最终攻击目标,用攻击流量消耗尽服务器带宽而导致服务瘫痪。至于原因,我也没有想明白为何会有攻击者对一个小型私用服务器感兴趣。

PS. 到本文发表时,攻击依旧在继续,且流量越来越大。目前阿里云的云盾设置可以说无力,只能依靠 iptables 暂时缓解。后续的应对计划仍在制定中。

=== 2014-05-24 更新 ===

Aveline 菊苣给出了一个DNS Amplification IPTABLES block lists 给点128个赞!

昨晚开始我们的 DNS 日志中出现大量的针对wradish.comANY记录请求,导致大量正常解析请求超时。今天上午到中午时分再次出现流量更大、针对ping.zong.co.uaANY记录请求,导致整个 DNS 服务瘫痪,完全无法响应正常解析请求。

November 12, 2016 01:45 AM

Kancolle Broker - 舰娘直连游戏!

废话:啊……我终于治好了自己的拖延症。

事情的起因,无非就是 2015 年的第一场大戏——舰娘国服。嘛。不多评论,大家心里都明白。之后用 nginx + SNI Proxy 配置了一个代理服务器方便大家在日本地区外玩舰娘。但是这种代理服务有一个很大的问题就是会引起恶意攻击,被用作 DDoS 攻击的肉鸡使用,因此日本法律也是禁止 VPN 服务器的。

这个 idea 出现的时候还在帝都,房间里没开空调没有暖气,4M带宽20人用还有人开迅雷,无奈只好烧朋友送的 4G 流量卡来维持网络需求。完全没有力气做事情的时候偏偏看到 DMM 那个变态到极点的登录验证……

于是一直拖到回家之后碰上一大堆喵窝的活动… bangumi.moe 那边也在一直催着干活,直到今天我才良心发现用力让自己头脑清醒一点,认真分析了下 DMM 的登录验证。

整个过程大概是这样:客户端请求登录页面,页面中包含两个 token,加载完毕后一个 token 作为 header 数据,一个作为 XHR POST 请求数据发送给服务器,获得另外两个 token。这两个 token 将作为用户登录 email 和 password 的 key。用户登录时 post 给服务器的数据大概是下面这样:

1
2
3
4
5
6
7
8
9
{
"token": "11dde99d39af2287fc6eed02632ccbee",
"login_id": "user@example.com",
"save_login_id": 0,
"password": "P@ssw0rd",
"use_auto_login": 0,
"dfdfa8466f24710893d99529acaaeef0": "user@example.com",
"2760cb37702b03d10d92caf9daaaf675": "P@ssw0rd"
}

… 好了,看晕了吧。咱就不吐槽日本人脑子里到底在想啥了。总之来看代码 -> Github

原理就是登录后用 cookie 拿到游戏 link 的 apptoken,而这个游戏的 link 是不会验证日本 IP 的。

想测试效果的话,那么先关闭本地的各种舰娘代理,移除所有相关的 hosts,然后访问这里。使用 DMM 帐号登录,成功的话会跳到舰娘的游戏页面。适用于所有在日本境外没有日本代理的情况下使用。

问:会不会有安全问题?

必须的。而且比 SNI 代理更不安全。但是反过来说,也是比 SNI 更安全的。因为 DMM 登录发送密码完全没有加密,只是靠 HTTPS。所以用这个程序的话:

  1. 密码都是可以在服务端记录的。虽然程序里完全没有记录密码相关的代码,但是要加也不是难事。
  2. 没有 HTTPS 的情况下,你发送的所有数据都是明文的。所以我做的这个 demo 用了 HTTPS 加密链接。

所以如果是有 HTTPS 加密且 deploy 这个程序的人比较靠谱的话,安全性还是有保障的。

至于大家是不是相信我……嗯这个看各位如何考量啦。

最后:我真的没玩过舰娘,我也不会去玩。

废话:啊……我终于治好了自己的拖延症。

November 12, 2016 01:44 AM

懒(烂)办法制作 Telegram Sticker Pack

Telegram 支持表情包 (Stickers Pack) 之后各个群里就开始出现各种奇怪的聊天表情。嘛,虽然有些做得不错但是终究是别人分享的,自己有很多好看的表情图片就不便使用了。

所以今天折腾了下,用现成的图片集来制作 stickers pack。本文使用的 sips 命令内置于 OS X 操作系统,Linux 则可以更方便地使用 ImageMagick 来操作。

Telegram 要求 Sticker 图片为 PNG 格式,并且要有透明层,至少一边为 512 像素,另一边则不超过 512 像素。最大文件大小为 350KB。透明层就算了,我不会玩 PS。那么直接偷懒(死)来批量把当前目录下 JPG 和 PNG 混杂的图片们统一转换为 PNG 好了。

命令:

1
2
3
4
5
6
# 创建 output 目录以存放输出图片...
mkdir -p output
# 把当前目录下的所有 JPG 文件转换为 PNG 丢进 output 目录里。
for i in *.jpg; do sips -s format png $i --out output/$i.png;done
# 把剩下的 PNG 图片丢进 output 准备下一步的批量操作以及简单清理... 没有的话可以跳过。
mv *.png output/ && rm *.jpg

接下来把所有图片缩放为宽或高最大为 512 像素,并且保持比例。

1
2
cd output
sips -Z 512 *.png

搞定。最后一步就是添加 Stickers Pack。需要敲这位机器人

几条命令发给 stickers bot:

  1. /newstickerpack
  2. 发送表情包的名字…
  3. 在内置的 emoji 中发送一个最符合你要发送图片的表情…
  4. 然后把对应的图片作为文件发送
  5. 如果还有其他图片的话重复 3-4
  6. 全部表情图片设置完毕,发送 /publish 命令
  7. 为你的 stickers pack 取一个短名字 (用于 URL)

KABOOM! 新的 Stickers Pack 制作完成~ 快拿链接去和大家分享吧~

最后贴我的芙兰酱的表情包
这些图片木有高清的所以如果谁能做一份高清的表情来请务必告诉我_(:3」

=== 2015.06.07 更新 ===

Mika 菊苣制作了一份芙兰酱的高清表情包

Telegram 支持表情包 (Stickers Pack) 之后各个群里就开始出现各种奇怪的聊天表情。嘛,虽然有些做得不错但是终究是别人分享的,自己有很多好看的表情图片就不便使用了。

November 12, 2016 01:44 AM

迁移到了 uWSGI

虽然 PHP FPM 一直用得还行… 唔,大概已经不能叫做「还行」了,因为它总是莫名其妙地一个请求不响应然后阻塞掉了其他所有的请求。然后就是无止境的 504 Gateway Timeout… 唯一的解决方案是重启 FPM。

然后负载一高就%@T$#$#%@#$%什么的不说了。

无缝切换 PHP FPM 到 uWSGI

安装必要的包

1
apt-get install uwsgi uwsgi-plugin-php supervisor

如果是全新安装的话,php 的各种库也要一起装上

1
apt-get install php5-cgi php5-mysql php5-curl php5-gd php5-idn php-pear php5-imap php5-mcrypt php5-mhash php5-pspell php5-recode php5-sqlite php5-tidy php5-xmlrpc php5-xsl

创建文件 /etc/uwsgi/apps-available/uwsgi-php.ini 并软连接到 /etc/uwsgi/apps-enabled/uwsgi-php.ini

1
ln -s /etc/uwsgi/apps-available/uwsgi-php.ini /etc/uwsgi/apps-enabled/uwsgi-php.ini

文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[uwsgi]
plugins = php

; leave the master running as root (to allows bind on unix socket or low ports)
master = true
master-as-root = true

; listening on unix socket
socket = /var/run/uwsgi-php.sock
chown-socket = www-data:www-data

; drop privileges
uid = www-data
gid = www-data

; our working dir
project_dir = /var/www

; load additional PHP module ini files
env = PHP_INI_SCAN_DIR=/etc/php5/embed/conf.d

; ; or if you need to specify another PHP.ini
; php-ini = /etc/php5/embed/php.ini
; ; then load additional php module ini files manually
; for-glob = /etc/php5/embed/conf.d/*.ini
; php-ini-append = %(_)
; endfor =

; allow .php and .inc extensions
php-allowed-ext = .php
php-allowed-ext = .inc

; set php timezone
php-set = date.timezone=UTC

; disable uWSGI request logging
disable-logging = true
; use a max of 10 processes
processes = 10
; ...but start with only 2 and spawn the others on demand
cheaper = 2

如果要指定 php.ini 的话,env 会失效所以单独用一个循环来读入所有的额外模块配置。envphp-ini/for-glob 二选一。不知道有没有更优雅一些的方法呢…

创建 Supervisor 配置文件 /etc/supervisor/conf.d/uwsgi-php.conf

1
2
3
4
5
6
7
[program:uwsgi-php]
command = uwsgi --ini /etc/uwsgi/apps-enabled/uwsgi-php.ini
autorestart = true
user = root
stderr_logfile = /var/log/supervisor/uwsgi-php.log
logfile_maxbytes = 1048576
logfile_backups = 10

user 一定是 root,因为需要权限创建 unix socket。之后 uWSGI 会自动降权(参见前面的配置文件)。

然后在 NGINX PHP 的部分修改为

1
2
3
4
5
location ~ \.php$ {
include uwsgi_params;
uwsgi_modifier1 14;
uwsgi_pass unix:/var/run/uwsgi-php.sock;
}

最后重启所有服务并清理——

1
2
3
service supervisor restart
service nginx reload
apt-get purge php5-fpm

搞定(๑•̀ㅂ•́)و✧

虽然 PHP FPM 一直用得还行… 唔,大概已经不能叫做「还行」了,因为它总是莫名其妙地一个请求不响应然后阻塞掉了其他所有的请求。然后就是无止境的 504 Gateway Timeout… 唯一的解决方案是重启 FPM。

然后负载一高就%@T$#$#%@#$%什么的不说了。

November 12, 2016 01:44 AM

想要导出 Telegram 贴图

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

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

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

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

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

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

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

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

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

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

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

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

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

November 12, 2016 01:44 AM

搭建一套权威 DNS 服务架构

萌 DNS 已经年久失修。尽管一直有计划完全重写出一套应用目前各种 DNS 特性和优化的完整平台,但是目前的精力不允许。所以为了先让萌 DNS 的用户们至少先有一个能支持 Let’s Encrypt 的 DNS 服务,决定暂时舍弃 GeoDNS 功能,使用一套更加成熟的解决方案提供服务。

搭配方案如下:

服务器部署:

  • 管理服务器 x1
    • MySQL Master
    • PowerDNS
    • PowerDNS-Admin, supervisor, virtualenv, gunicorn…
    • NGINX, Let’s Encrypt
  • DNS 服务器 x4
    • MySQL Slave
    • PowerDNS

在管理服务器上安装 PowerDNS 和 MySQL Master 的考量是由于 PowerDNS-Admin 使用 PowerDNS HTTP API,在管理服务器(或管理私网中)启动一个仅用于提供 API 和操作主数据库的 PowerDNS 实例能够减轻 Primary NS Server 的压力并提升安全性。整套架构使用 Ansible 进行自动化部署,不过好久没用了各种生疏,照着文档折腾好久的配置…

于是这里暂且记录下整个过程。有些坑只是作者一时疏忽或者有别的考量但没有明确记录,也许在未来的版本中会修复。

安装 PowerDNS

所有服务器均使用 Ubuntu 16.04,需要 PowerDNS 4.0 以上的版本。按照此页面的说明添加 PowerDNS 官方的仓库即可。

1
# apt install pdns-server pdns-backend-mysql mysql-server

由 dpkg 自动配置 PowerDNS 的数据库,然后删除 /etc/powerdns/pdns.d无关的配置文件。

1
2
# rm /etc/powerdns/pdns.d/pdns.local.conf
# rm /etc/powerdns/pdns.d/pdns.simplebind.conf

配置 MySQL Replication,管理服务器作为 Master,其他 DNS 服务器作为 Slave。细节不多讲,官方文档 或者 DigitalOcean Tutorial

管理服务器 (MySQL Master) PowerDNS 配置文件 /etc/powerdns/pdns.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
api=yes
api-key=yourapisecretkey
api-logfile=/var/log/pdns-api.log
config-dir=/etc/powerdns
guardian=yes
include-dir=/etc/powerdns/pdns.d
launch=
local-address=127.0.0.1 # 不对外提供服务
local-ipv6=::1
security-poll-suffix=
setgid=pdns
setuid=pdns
webserver=yes
webserver-address=127.0.0.1 # 仅向本机的 PowerDNS-Admin 调用。如果配置在内网,请使用内网 IP
webserver-allow-from=127.0.0.1/32 # 同上,如果使用内网则写 PowerDNS-Admin 在内网的 IP
webserver-port=8081
default-soa-name=ns1.example.com # 改为 Primary NS 的地址
default-soa-edit=INCEPTION-INCREMENT
default-soa-mail=hostmaster.example.com # 改为默认服务器管理员的邮箱地址,并将 '@' 替换为 '.'
default-ttl=3600

DNS 服务器 (MySQL Slaves) PowerDNS 配置文件 /etc/powerdns/pdns.conf

1
2
3
4
5
6
7
8
9
10
11
config-dir=/etc/powerdns
daemon=yes
disable-axfr=yes
guardian=yes
include-dir=/etc/powerdns/pdns.d
launch=
security-poll-suffix=
server-id=ns1.example.com # 改为当前服务器的 ID,ns1/ns2/ns3/etc...
setgid=pdns
setuid=pdns
version-string=anonymous # 可以写任意字符串恶搞_(:з」∠)_

安装 PowerDNS-Admin

作者有提供详细的教程但是还是有坑

安装依赖:

1
# apt install git python-pip supervisor virtualenv python-dev libmysqlclient-dev libsasl2-dev libldap2-dev libssl-dev letsencrypt

创建数据库,切换到普通用户权限,clone 仓库到本地,然后一步一步操作即可。

1
2
3
4
5
6
7
8
$ git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git
$ cd PowerDNS-Admin
$ virtualenv flask
$ source ./flask/bin/activate
$ pip install -r requirements.txt
$ pip install mysql gunicorn
$ cp config_template.py config.py
$ vim config.py

配置文件 config.py 中需要更改的地方:

1
2
3
4
5
6
7
8
9
SECRET_KEY = 'yoursessionencryptkey'
SQLA_DB_USER = 'yourdbusername'
SQLA_DB_PASSWORD = 'yourdbpassword'
SQLA_DB_HOST = 'localhost'
SQLA_DB_NAME = 'yourdbname'
PDNS_STATS_URL = 'http://localhost:8081/'
PDNS_API_KEY = 'yourapisecretkey'
PDNS_VERSION = '4.0.0'
RECORDS_ALLOW_EDIT = ['A', 'AAAA', 'CNAME', 'SPF', 'PTR', 'MX', 'TXT', 'SRV', 'NS', 'SOA']

然后执行 ./create_db.py。如果没有报错说明数据库安装成功,执行 ./run.py 即可访问 http://127.0.0.1:9393 看到登陆页面了。

部署 Web 服务

直接跑 run.py 当然不科学。Supervisor 配置文件 /etc/supervisor/conf.d/pdnsadmin.conf

1
2
3
4
5
6
7
8
9
10
11
[program:pdnsadmin]
command=/home/pdns/PowerDNS-Admin/flask/bin/gunicorn run:app
directory=/home/pdns/PowerDNS-Admin/
user=pdns
autostart=true
stdout_logfile=/var/log/supervisor/pdns-stdout.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=2
stderr_logfile=/var/log/supervisor/pdns-stderr.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=2

创建 DHParam

1
2
# cd /etc/ssl/certs
# openssl dhparam -out dhparam.pem 4096 # 如果性能不够请使用 2048

NGINX 配置文件 /etc/nginx/site-enabled/pdnsadmin.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
server {
listen 80;
server_name dns.example.com;

location /.well-known {
default_type "text/plain";
root /var/www/html;
}

location / {
return 301 https://dns.example.com$request_uri;
}
}

server {
listen 443 ssl;
listen [::]:443 ssl;
server_name dns.example.com;

ssl on;
ssl_certificate /etc/letsencrypt/live/dns.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/dns.example.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
keepalive_timeout 70;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

add_header Strict-Transport-Security max-age=63072000;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;


access_log /var/log/nginx/dns.example.com.access.log;
error_log /var/log/nginx/dns.example.com.error.log;

location /.well-known {
default_type "text/plain";
root /var/www/html;
}

location /static {
alias /home/pdns/PowerDNS-Admin/app/static;
}

location / {
proxy_pass http://127.0.0.1:8000;
proxy_redirect default;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forward-IP $remote_addr;
port_in_redirect on;
server_name_in_redirect off;
proxy_connect_timeout 300;
}
}

记得把 dns.example.com 换成自己的域名。

签发 Let’s Encrypt。也不多讲。NGINX 配置中已经有了针对 Let’s Encrypt 的续期设置。

然后重启各项服务

1
2
# systemctl restart supervisor
# systemctl restart nginx

查看 PowerDNS-Admin 的运行状态,使用 supervisorctl status

添加 GLUE 记录

要使自己的 NS 生效,必须有保存在上级 NS 中的记录。很多域名注册商都提供了配置 GLUE 记录的功能,例如 Hexonet (1API):

Glue Records

简言之,需要把自己的 NS 服务器及对应的 IP 记录到上级 NS。完成之后,通过 PowerDNS-Admin 添加自己的域名,zone 类型为 NATIVE。然后添加所有 NS 服务器的 A/AAAA 以及所有的 NS 记录——你没听错,要自己写 NS 记录。其他域名也需要添加这些 NS 记录,否则不会托管。

Glue Records

收尾

全部完成之后就是一个完整功能的 DNS 服务了。如果希望启用 DNSSEC,需要在管理服务器中通过 pdnsutil 来添加 key。

由于目前 PowerDNS-Admin 没有限制不能添加提供的 NS 之外的名称服务器,所以其他域名按照添加 GLUE 记录的方法,也可以将这些 NS 服务器「变成」自己的 NS。

好了,不会说话了。讲效果——

一般来说,DNS 服务都会提供多台 NS 服务器域名,将域名的 DNS 改为这些 NS 服务器才能托管到该 DNS 服务上。但是现在只需要知道这套 DNS 的服务器 IP 地址,即可给自己的域名添加 GLUE 记录、NS 记录和 NS 对应的 A/AAAA 记录进而使用自己的域名作为 NS,而不需要用 DNS 服务的 NS 域名。当然一般就是看起来会比较厉害而已…

萌 DNS 已经年久失修。尽管一直有计划完全重写出一套应用目前各种 DNS 特性和优化的完整平台,但是目前的精力不允许。所以为了先让萌 DNS 的用户们至少先有一个能支持 Let’s Encrypt 的 DNS 服务,决定暂时舍弃 GeoDNS 功能,使用一套更加成熟的解决方案提供服务。

November 12, 2016 01:43 AM

修复 Arch Rollback Machine 磁盘占用

最近发现 downgrade 失效了,降级啥包都是直接错误退出。然后排查的时候发现是 Arch Rollback Machine 挂了,原因是——磁盘不足。

检查后发现 pm2 的日志有 7G,850天前的包有5000多个,365天内的包有10万余,磁盘已经被吃得满满当当。

日志好说,因为没啥特别有用的东西也不用拿来做分析,直接删掉就好。Felix 也把 850 天前的包全部删干净了。不过再次检查的时候 df -h 显示依旧是磁盘被吃满的,而 df -ih 显示 inode 占用没有问题。猫怀疑是有文件句柄还开着,但是把所有可能的进程杀掉之后依旧没有变化,排除。另外一个现象是文件删除进程完成后过了一段时间磁盘开始有少量空闲空间了,可能是磁盘缓存…?

于是靠着这空出来的 900M 多点的空间执行了几个操作:把有 HTTP flood 漏洞的 Node.js 0.10.16 升级到最新版 0.10.28,将包同步的 cronjob 降低到每天执行一次,压缩旧的 NGINX 日志。

以及用户一直要求的包归档功能,实际上是已经有了的,但是并没通过 NGINX 配置来实现(Pia!<(=o ‵-′)ノ☆猫) 所以准备把归档功能写到 API 服务端里。因为之前很有预见性的同步的时候把每天的包数据库按照 /year/month/day/repo 的结构保存起来(然后这部分的数据库文件就有 30G!),所以用户按照这个路径来请求包数据库的时候直接把对应的数据库文件丢给客户端,请求包文件的时候则直接从包目录里丢过去。这样的话其实从一个较早的时间结构最后请求一个较新的包文件也能拿到….不过这个不是问题,因为包归档给 pacman 用的话,有哪些包还是 pacman 要读数据库的。

包归档的 index 确实花了不少时间,目前的实现貌似也不很好,虽然貌似还挺快的,但是也挺吃硬盘的…而且一连好几次手残敲错了东西、少加了分隔符、加了冗余的配置变量…. 总之就是爆肝熬夜的效率超级差,4点多基本上没问题的时候已经能感觉到身体很不舒服了…

然后是一觉睡到第二天中午。觅食归来给 A.R.M 的 KVM 虚拟机硬盘增加了 100G。执行 resize2fs 的时候报错说已经达到最大空间,删掉 swap 之后依旧。接下来干了一件很作死的事情——把所有分区删掉了,然后按照原来的分区方案重建了新的分区。Reboot 之后 lsblk 是对了,但是 df -h 依旧是原来的分区。一叶说是 resize 没成功,要进 LiveCD 里面 resize2fs。不过我没镜像… 按照一叶的建议挂上 VNC 进 recovery 然后 fsck,再正常进系统执行 resize2fs,成功。

回过神来的时候发现这种作死的行为我居然手都没抖一下 = = 几百G的数据呐…

晚上还要做字幕,再去休息下好了…

最近发现 downgrade 失效了,降级啥包都是直接错误退出。然后排查的时候发现是 Arch Rollback Machine 挂了,原因是——磁盘不足。

November 12, 2016 01:43 AM

ThinkPad X1 Carbon 2015 与久违的 Arch Linux

对 X1 Carbon 2015 垂涎已久。然而中国市场不提供定制配置、没有 16G 内存的版本、512G PCIe SSD 的型号配置触控屏。这些都不能忍…于是折腾了好久,打扰了至少三位在美国的朋友,最终在黑色星期五当天下单,前天顺丰到手。

先晒一下单。这个配置在联想美国官网购买的原价是 2622.60 美元,黑色星期五的各种优惠后价格是 1630 美元。嘛… 多出来的预算败了一块 1TB SSD 当移动硬盘,真是麻烦帮忙带回国的朋友了(っ‘ω’c)

X1 Carbon 2015 20BSCTO1WW

  • Intel Core i7 5600U 2.6GHz / 3.6GHz
  • 16G (2x8G) DDR3 1600MHz On-board RAM
  • 512G PCIe SSD
  • 2560x1440 QWHD IPS
  • Fingerprint Reader
  • Sierra LTE EM7345

其中 SSD 是 SAMSUNG SM951,测试读写速度分别为 1546MB/s 和 1260MB/sdmidecode --type memory 显示有两条镁光制造的内存,这个倒是和网络上流传的单根内存不太一样。不过两根都是 on-board,所以是无法更换的。

屏幕颜色偏暖,大概是为了长时间工作不会太劳累设定的。ThinkScope 提供了一份 ICC 文件,效果有点偏蓝(紫红?)。不过屏幕型号并不是页面上写的 LG LP140GH1-SPA2,而是 LG LP140QH1-SPB1。总之雾面屏加 86% sRGB coverage 导致它的显示效果比旁边的 MacBook Pro Retina 差了一大截,而且 HiDPI 带来软件上的问题… 嘛这个后面再说。

X1 Carbon 2015 整个机身做工很好,拿着很有份量(不是沉!)给人一种很结实的感觉,完全没有其他 ThinkPad 的塑料感。唯一略心颤的是屏幕没办法像 MacBook Pro 一样稳,和其他笔记本一样调整屏幕角度还是会晃动几下,大概是铰链设计的差异导致。键盘仍然是那个熟悉的手感——哪怕是悬浮式键帽,仍然和老式 ThinkPad 键盘手感不相上下。换到这么舒服的键盘之后打字速度已经快到让 fcitx 分不清键序啦( ´∀ )σ)Д`)其实是 GTK 程序的 bug。ThinkLight 改到键盘下方,可以更好地看清键帽更高大上了,但是没办法当作光源看其他东西… 不过本来也不怎么亮还是爱护下眼睛吧。触控板很舒服,虽然大概还是不够和 MacBook Pro 相比,毕竟人家有底层驱动优化,系统层还支持很多手势。单从手感上来讲还是很不错的。

新本本送到后开机检查硬件,然后当然是要删掉预装的 Windows 10 然后换上 Arch Linux 啦。之前 T420 的 UEFI 安装 Arch Linux 总是启动不能,然而 X1 Carbon 就很顺利。当然是关掉了 Secure Boot 的。

续航感觉还不错,中午送到开箱检查的时候就还有 60% 的电量,然后从下午开始到晚上一直在安装配置系统,到半夜的时候报告还剩 15% 电量。中间有几次编译,所以顺便看了下散热。室内温度大概 10 摄氏度,sensors 检测高负载时最高温度 57 摄氏度,一般工作温度 35-40 摄氏度。这是有点出乎意料的,本来以为超极本的散热都会很悲剧。不过据说其他人也有到过 80 度的,所以要再用用看。

Sierra LTE EM7345 是 microSIM 槽,然而手头只有 nanoSIM 所以还没用上。回去学校把流量卡补成 microSIM 再玩玩看。

安装过程完全不折腾。硬件兼容性报告只有一句话:Everything works out of box.

如果一定要在兼容性上挑刺儿的话,大概是 GPS 只有在 Windows 下才有办法打开,打开之后就可以直接在 Linux 下用了。

回到 Arch Linux 上。一年没用,KDE 已经快不认识了。通过更改 DPI、字体大小和图标大小,Qt5 的程序算是很好的支持了 HiDPI。然而一些 GTK / Qt4 程序就没那么好说话了… 总之用各种奇怪的办法让这些跟不上时代的程序变得勉强能看。

刚开始用 MacBook Pro 不久的时候,除去再也无法接受 retina 之下的显示效果(retina 有毒啊)之外,由于键盘、输入法(!!!)、快捷键、工具链、UNIX 生态等等问题上,OS X 上的工作效率只有 Linux 的 1/3 左右(是真的,很早的时候解决一个问题大概花了一个多小时,后来在 OS X 上再次遇到却花了一个下午)。

总之用来这几天,可以说是非常满意的。没有任何生产商设置的门槛,OS-Specific 的东西通过各种 折腾 Google、折腾 IRC 频道里的各位、折腾 ArchWiki… 等基本都解决了。现在看到它就有想摸一摸、想用它工作的冲动(๑•̀ㅂ•́)و✧然后上个图~

Desktop

KInfoCenter

最后的一点牢骚。

一年多没怎么碰 Linux 桌面,虽然看起来变化很大,但是实际上的提升基本没有感觉到。倒不如说,由于硬件技术一直在革新,Linux 桌面却没有了当年的势头。前段时间去 KDE 主页看的时候发现他们把捐赠放到了首页上,而且赞助页看起来好粗糙,完全不像是 KDE 一贯精致的设计风格。从对 HiDPI 的支持来看更是如此。KDE/High-dpi issues 页面从半年前到现在基本没有太大的变化…

嘛。当然了就算是钱多得没处花的某有点软的公司也没让自己的操作系统好好的支持 HiDPI ( ´∀ )σ)Д`)

开源界仍然有大量被广泛使用的应用保持着粗制滥造、works for me 等等的心态。虽然绝大多数不会有人为之付费,但是这并不是不认真的理由。而且这样下去也并不会有多少杀手级的应用出现。

虽然作为 DevOps 的话只要有好用的命令行工具链就万事大吉了。 更何况现在厨子整天瞎搞,果子就算还能继续赚无脑追捧的大众的钱,它还能制作多少 developer-friendly 的产品呢…
(´・ω・`)

对 X1 Carbon 2015 垂涎已久。然而中国市场不提供定制配置、没有 16G 内存的版本、512G PCIe SSD 的型号配置触控屏。这些都不能忍…于是折腾了好久,打扰了至少三位在美国的朋友,最终在黑色星期五当天下单,前天顺丰到手。

November 12, 2016 01:43 AM

用优雅的方式在 OS X 中为单个应用设置语言

买到 CLIP STUDIO PAINT Pro,激活之后发现不给启动,显示 Unsupported OS 并退出。搜索了下发现是因为语言设置的问题导致,需要将系统环境设置为应用所支持的语言才能运行。

嘛。日本人做事情也是让人无话可说,那么多应用都没有多语言支持的… 用能支持的语言来显示就好了嘛。

话说回来,我一开始设置的系统语言是简体中文,虽然后备语言加了 English 和日本語,不过有些不能自动变更语言的应用在更换系统语言为 English 之后变得很别扭。于是寻找可以单独设置应用语言的方法。

用惯了 Linux 再用 OS X 其实并没有那么容易的改变习惯… 当我准备尝试单独 export 一份 locale 再运行 app 的时候 OS X 直接告诉我不适用我的表情简直和伊莉雅一样。

睡了一觉起来继续 Google。找到了可以单独为应用设置语言并且 launch 的 app Language Switcher,看起来不错,但是每次启动 CLIP STUDIO PAINT 都要先打开这货,这不是我想要的效果。

于是最终找到一个合适的解决方案:用 defaults 命令。

原帖在这里

设置 CLIP STUDIO PAINT Pro 语言环境命令:

1
defaults write jp.co.celsys.CLIPSTUDIOPAINT.lip AppleLanguages '("en-US")'

其中 jp.co.celsys.CLIPSTUDIOPAINT.lip 可以在应用的显示包信息 -> Contents -> Info.plist 中找到。

执行后就可以直接双击启动啦~

最后献丑一张w

Kira( > ◡╹)~

买到 CLIP STUDIO PAINT Pro,激活之后发现不给启动,显示 Unsupported OS 并退出。搜索了下发现是因为语言设置的问题导致,需要将系统环境设置为应用所支持的语言才能运行。

November 12, 2016 01:43 AM

在 Ubuntu 服务器上搭建 OpenConnect 服务器小记

最近猫给推荐的 Cisco AnyConnect,面基的时候也看到 Aveline 菊苣在用 AnyConnect(插嘴:正太菊苣果然好可爱!!!) 于是自己折腾了下。作为少有的能让我折腾起来的 VPN,暂且把搭建步骤简单记录下。

AnyConnect 的好处是基于 HTTPS,证书可以申请 StartSSL 的,而且配置也不很复杂。另外配置文件里发现了很多专门为商业化/企业服务定制的选项,例如最大同时在线客户端数量,同账户最大在线设备数量等等。

OpenConnect 是 AnyConnect 的开源实现。目前 0.8.0 版本需要 GnuTLS 3.1 以上版本,所以我们就直接在 Ubuntu 14.04 中搭建。另外 就算是基于 HTTPS,这货也是要用 TUN 设备的,所以 OpenVZ 用户们请注意。

准备

命令

1
2
3
apt-get install build-essential libwrap0-dev libpam0g-dev libdbus-1-dev \
libreadline-dev libnl-route-3-dev libprotobuf-c0-dev libpcl1-dev libopts25-dev \
autogen libgnutls28 libgnutls28-dev libseccomp-dev libhttp-parser-dev

安装

下载源码

1
2
3
wget -c ftp://ftp.infradead.org/pub/ocserv/ocserv-0.8.0.tar.xz
tar xvf ocserv-0.8.0.tar.xz
cd ocserv-0.8.0

编译安装

1
2
3
4
5
./configure --prefix=/opt/ocserv 
make
make install
mkdir /opt/ocserv/etc/
cp doc/sample.config /opt/ocserv/etc/config

配置

这里只记录需要修改的重点配置,其他配置请参照样例配置文件的注释按需修改。

文件 /opt/ocserv/etc/config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
auth = "plain[/opt/ocserv/etc/passwd]"
listen-host = connect.your.domain
max-clients = 128
max-same-clients = 4
server-cert = /opt/ocserv/etc/ssl/server-cert.pem
server-key = /opt/ocserv/etc/ssl/server-key.pem
ca-cert = /opt/ocserv/etc/ssl/ca.pem
mobile-idle-timeout = 2400
ipv4-network = 192.168.1.0
ipv4-netmask = 255.255.255.0
dns = 8.8.8.8
dns = 8.8.4.4
route = 192.168.1.0/255.255.255.0
route-add-cmd = "ip route add 192.168.1.0 dev tun0"
route-del-cmd = "ip route delete 192.168.1.0 dev tun0"

创建用户,命令

1
/opt/ocserv/bin/ocpasswd -c /opt/ocserv/etc/passwd username

按提示输入两次密码。

iptables 规则

1
iptables -t nat -A POSTROUTING -j SNAT --to-source <server ip> -o <nic>

记得把 <server ip><nic> 改为服务器公网 IP 和对应网卡的名称。

搞定

折腾完毕,AnyConnect 客户端可以成功使用了。

不过呢折腾完之后发现这货其实被干扰得很厉害啊…

最近猫给推荐的 Cisco AnyConnect,面基的时候也看到 Aveline 菊苣在用 AnyConnect(插嘴:正太菊苣果然好可爱!!!) 于是自己折腾了下。作为少有的能让我折腾起来的 VPN,暂且把搭建步骤简单记录下。

November 12, 2016 01:43 AM

末字幕组时代,我们何去何从

日本のアニメやドラマを勝手に翻訳して字幕を付け、違法配信する中国のアマチュア集団「字幕組」。北京在住のメンバーを取材してその実態や動機、違法性を伝えたところ、中国のネットメディアが本紙記事を翻訳、「字幕組がなくなれば抗日ドラマに洗脳される」などと擁護の声が殺到した。

这是好久之前出现在日本各大新闻站上的文章。今天偶然和朋友闲聊时再次聊到了版权问题。

前些时间开始,射手网、人人影视、极影等字幕发布站相继被 takedown,相关律师函甚至恐吓信开始出现在站长们的邮箱中。在中国,「版权」第一次闹得这么凶。然而可悲的是,这并不是因为中国人开始有了版权意识,而仅仅是影响了一些商业集团的利益。

在近期某字幕组发布的作品中,发布者这样写到:

現今,版權的世代到來
觀眾也都紛紛的看版權去了
這對我們來說不是什麼問題,因為我們本來就不在意什麼載量
做字幕本來就是自爽的,與其說是做給別人看,不如說是做給自己看
對字幕界比較大的問題其實是新人減少這件事

從這幾天MANGLOBE(動畫公司)倒閉事件來看
看似盛況的MAG(漫画、アニメ、ゲーム)也明確的顯示出,其實是正在走下坡的
但是國外購買版權這情況,是有助於動畫公司轉虧為盈,不再只是依靠BD賺錢
我們理所當然的是要感到高興
這絕對絕對不是壞事,有愛支持正版是對的

但同時我也希望各位,如果真的很喜歡某片的話
在經濟允許的情況下,買個BD原盤支持一下吧,因為並不是每個片子都有版權購買(AMAZON用郵局的VISA卡就能買囉)
請把口中的支持化作實際的支持吧,良好的作品不該讓它沈入水中

另一方面
由於版權大量崛起,似乎可以望見字幕組的數量會越來越少
有所謂的版權可以看後,也會大幅降低新人願意加入字幕組的意願,因此製作字幕的人會越來越少
最後,支撐著字幕組的人只剩下老人
工作,結婚,後宮,家庭,最後連老人們都各奔東西(現在越來越坑就是因為現實的干擾越來越多
接著就化作了時代的眼淚

曾经在早些年,在大陆的视频站大部分仍然只是互联网上用于大家互相上传视频自娱自乐的时候,并没有某相关部门令人无力吐槽的审查和胡搅蛮缠,日本动画也并没有那么大规模的影响力和市场。字幕组的相继出现,让国内的观众们能够看到制作精良的日本动画,也促进了国内 ACG 圈子的发展。更重要的,字幕组将日本的二次元文化、包含其中的人的素养,人性的光辉和思考,带给了越来越多的人。

在这个时候应运而生的发布站,整合了多个字幕组的作品给观众挑选,也直接加剧了字幕组之间的竞争。经过一段时间的发展,字幕组的工作流程越来越优化,翻译和字幕的质量越来越高,甚至做到了日本电视台首播后两三个小时就可以制作出精美字幕的程度。

字幕组的百家争鸣慢慢引起了商界的注意。好像就在一夜之间,各大视频站都开始争相购买日本动画的版权。这本来是一件好事,但是相关部门的审查、过长的广告等等问题引发了观众们的不满,他们开始将发布站和视频站推向一个对立面,微博上甚至出现了「视频站不给看,我们去xxx下载!」类似激进的言论。然而与此同时,某圈内朋友表示:

国内所有视频网站我都是VIP
我觉得体验还不错
就翻译有待加强

字幕组的建立,有些是因为兴趣爱好,也有些只是随口说出的玩笑。但是共有的一点,都对二次元文化充满了热爱。很多组员看到了喜欢的作品会攒下生活费购买蓝光盘用于收藏,根本不会拆封,只是为了支持一下制作公司而已。但是从法律上来讲,字幕组的行为依然不能被接受。

我们推动了动画在国内的推广,但是并没有实力给制作公司分钱。
所以是我们退场的时候了,让专业的来吧。

所有人都已经看到了残酷的现实。曾经为了兴趣抑或只是一句玩笑建立起的小组,一路走来承载着众多组员们的羁绊,转瞬间已经到了并不华丽的谢幕。

也许会有字幕组和发布站继续存在下去,但是更多人会选择在线观看视频站购买的正版动画。虽然并不是中国人的版权意识提高了,但是至少,视频公司不管是通过广告还是销售会员获得的利润,可以用来继续购买更多的版权动画给大家看。对动画制作公司,对观众们,都不是坏事。

说到底,大部分字幕组,只是为了大家能在一起玩得开心罢了。字幕只是让大家聚到一起的载体,就算没有再继续做字幕,这些「字幕组」之名也可以让组员们继续走在一起吧。想必,这段可能仅仅存在于近几代人中的记忆,会被小心翼翼地保存一生。

R.I.P

日本のアニメやドラマを勝手に翻訳して字幕を付け、違法配信する中国のアマチュア集団「字幕組」。北京在住のメンバーを取材してその実態や動機、違法性を伝えたところ、中国のネットメディアが本紙記事を翻訳、「字幕組がなくなれば抗日ドラマに洗脳される」などと擁護の声が殺到した。

November 12, 2016 01:42 AM

尝试迁移到 AWS Cloud

发了个帖子抱怨服务器一大堆却没个放自己个人站的地儿。其实是服务器都是生产环境要跑各种业务,不能放自己的东西。其实个人站就一个博客一个知识库,还都是静态的,连买个 Linode 都觉得资源浪费。放在 GCE f1.micro 上吧,是便宜了不过网络抽死。如果不是因为要用 SSL 防运营商劫持和中间人攻击,真的直接扔 GitHub 了。

感谢 @sparanoid 的建议,花了一下午尝试将自己的静态网站部署在 AWS 云上。

AWS 准备工作

S3 文件桶

创建一个 S3 文件桶,并在「属性」 -> 「静态网站托管」页选择「启用网站托管」,然后索引文件填写 index.html

在此页面会得到一个网站终端节点,例如 example.com.s3-website-ap-northeast-1.amazonaws.com 这样。先复制备用。

上传 SSL 证书

其实之前签发了一张三年的 ShinoSaki ECC 证书,然而 AWS 不认(ノ=Д=)ノ┻━┻ 只好去签了 AlphaSSL 的泛域名。

需要安装 awscli,可以直接 sudo pip install awscli

上传证书命令如下(示例名称记得改成自己的哦)

1
aws iam upload-server-certificate --server-certificate-name cert-name --certificate-body file://example_com.pem --private-key file://example_com.key --certificate-chain file://ca.pem --path /cloudfront/yoursite/

前面的 file:// 也不能移去,否则会报错 A client error (MalformedCertificate) occurred when calling the UploadServerCertificate operation: Unable to parse certificate. Please ensure the certificate is in PEM format.

创建 CloudFront Distribution

如果是 Jekyll 一类会创建「文件名.html」的程序,origin 直接下拉菜单中选择 S3 的文件桶地址即可。但是 Hexo 和 MinoriWiki 都是目录名下的 index.html,所以只能使用之前得到的网站终端节点。填入地址后,下面的配置随自己的想法选择即可。Alternate Domain Names (CNAMEs) 填写自己的域名,然后下面的 SSL 选择 Custom SSL Certificate (example.com) 和一个对应的证书。Default Root Object 填写 index.html

为什么只能使用网站终端节点而不是 S3 地址的原因是 CloudFront 和 S3 的 Default Root Object 工作原理不同,如果是请求子目录,那么 CloudFront 不会给默认加上 index.html 导致 403。

创建之后 CloudFront 需要(很长一段)时间来部署。于是先把分配的 CDN 地址 xxxxxxxxxxxxx.cloudfront.net. 复制备用。

设置 Route 53

建立一个 Route53 Hosted Zone,然后导入以前的 zonefile 或者什么的。网站的地址 Type 选择 A - IPv4 address,然后 Alias 选择 Yes。Alias Target 是刚才复制的 CloudFront 的 CDN 地址。Routing Policy 选择 Simple——GeoDNS 将交由 CloudFront 完成。

网站程序准备

Hexo

Hexo 已经有了现成的 S3 deployer,不过主页上的那个不工作也不管别人给提交的 PR。所以推荐使用 hexo-deployer-aws-s3

不过貌似是会强制覆盖每个文件的,上传花了好久啊比 Git 慢多了… S3 啥时候支持 Git (ノ=Д=)ノ┻━┻

MinoriWiki

MinoriWiki 从一开始就是面向 UNIX 系使用者的一套超简单个人知识库,所以压根没考虑用 S3 啊(ノ=Д=)ノ┻━┻

不过自己写的东西好处就是可以各种改(死)所以半个下午发布了一个带有 S3 支持的新版。使用了 node-s3-client 库,可以只上传修改了的文件。

搞定

一路搞下来,CloudFront 也就差不多了,域名解析应该也更新了。试试看效果吧~

没啥访问量的个人站,用 Route53 + S3 + CloudFront 的开支一个月可以控制在 2 美元左右,但是性能、网络和可用性远远比一个月 2 美元的 VPS 好得多。

然而在国内… AWS 被滥用还是挺凶的。所以各种服务被干扰,于是成了现在这惨样。

其实还不如直接托管在 GitHub 然后上个支持自定义 SSL 和 PAYG 的 CDN

发了个帖子抱怨服务器一大堆却没个放自己个人站的地儿。其实是服务器都是生产环境要跑各种业务,不能放自己的东西。其实个人站就一个博客一个知识库,还都是静态的,连买个 Linode 都觉得资源浪费。放在 GCE f1.micro 上吧,是便宜了不过网络抽死。如果不是因为要用 SSL 防运营商劫持和中间人攻击,真的直接扔 GitHub 了。

感谢 @sparanoid 的建议,花了一下午尝试将自己的静态网站部署在 AWS 云上。

November 12, 2016 01:40 AM

November 10, 2016

百合仙子

数据让 git 给吃了!

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

之前一直觉得 git 是很安全的,除非用户显式指定(比如 --force 啦,reset --hard 啦,checkout xxxx 啦),git 在用户会失去数据时都会停下来,让不小心的用户有机会处理被遗忘的修改。直到有一天,我们有个文件让 git 给吃了!

嗯,是「我们」,不是「我」。这是我们的代码部署服务器上出的事。这仓库不是我使用的,整个操作流程我也没有参与设计与评估。实际上我只是作为 troubleshooter 参与到这次神秘事件之中的。

要让 git 愉快地吃掉数据,只要这样就可以了:

  • 提交 A 不包含文件 f
  • 提交 B 包含文件 f
  • 当前工作区为提交 A,并且包含一份未被 git 管理的文件 f,并且 f 被 gitignore 忽略掉了

然后做如下操作,未被管理的那份 f 就会消失不见了:

  • 将工作区切换到提交 B。因为 f 被忽略,所以 git 不会报错(代码
  • 将工作区再切换回 A。因为 A 不包含 f,所以 f 被删掉了

正在吃 f 的 git:主人遗弃了的 f 就交给我好了~

要避免出现这种问题,当然是在 git 工作区会有修改的时候,不要依靠 git 来在多个版本间切换啦~btrfs 或者 zfs 的快照多好!如果文件系统不支持快照的话,那就用多个目录吧。

by 依云 at November 10, 2016 07:52 AM

November 07, 2016

Lainme

Gnome无法开机载入Xresource和Profile设置的问题

工作之后就很少更新博客了,恰逢今天解决了一个问题,就记录一下吧。

最近Arch更新后,我的Xterm被打回了原型不说,连fcitx都用不了了。查了一番后发现Gnome已经默认用Wayland了,因此不再载入~/.Xresources和~/.profile等配置文件。

这里有几个解决方案,一是在登录的时候选择Gnome on Xorg,不使用wayland。

如果不想这么做,也可以另行创建一个配置文件~/.pam_environment,在这里进行环境变量配置。关于pam_env的解释和示例可以参考 Arch Wiki

这里给出载入~/.Xresources和配置IM的示例

XENVIRONMENT            DEFAULT=@{HOME}/.Xresources
GTK_IM_MODULE           DEFAULT=fcitx
QT_IM_MODULE            DEFAULT=fcitx
XMODIFIERS              DEFAULT=@im=fcitx

by lainme at November 07, 2016 03:18 AM

November 03, 2016

百合仙子

诡异多多的 bash

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

要说哪个 shell 最复杂难学,我肯定回答 zsh。而要说哪个 shell bug 最多,毫无疑问是 bash 了。shellshock 这种大家都知道的我就不说了。bash 有很多很诡异的角落,昨天我亲身碰到一个。

我有一个 Python 程序 A,会使用 subprocess 带 shell=True 跑一行 shell 命令。那条命令会在后台跑另外一个 Python 程序 B。诡异的事情是,当我向 B 的进程发送 SIGINT 时,无法结束它,以及它下边带的一个 tail 进程。一开始我还没注意到 B 的进程本身没有被 SIGINT 杀死,是在无效的情况下被 A 用 SIGKILL 杀死的。我只看到那个 tail 程序还活着。所以我去处理了一下 KeyboardInterrupted 异常,来结束掉那个 tail。

结果很诡异:KeyboardInterrupted 异常并没有发生。通过 strace 观察可以看到,B 进程在读 tail 的输出,然后收到了 SIGINT,然后接着读 tail 的输出……我一开始还以为这个和 PEP 475 相关,以为是 Python 自动重启了被中断的系统调用,所以没来得及处理信号(Python 的信号并不是及时处理的)。然后就去仔细看文档。结果文档告诉我,如果注册了信号处理函数,并且它抛出异常的话,那么被中断的系统调用是不会被重试的。所以这就不对了。

然后我又测试了直接在终端运行 B,而不是通过 A 去运行。本来我开发的时候就是这么测试它的,也没遇到什么怪异的现象。结果确实没有什么怪异的事情发生:即使我使用 kill 命令只给 B 发送 SIGINT 信号,Python 的 KeyboardInterrupted 逻辑会被触发,然后它主动杀掉 tail 进程。(使用 Ctrl-C 的话,B 和 tail 都会收到 SIGINT 信号的。)

疑惑的时候,我又想到了拿 SIGINT 去杀那个不死的 tail 进程,这才发现它也出现奇怪的行为了:正在读 inotify 的文件描述符呢,来了个 SIGINT 信号,然后它接着读 inotify 去了……跟 B 出现的问题一样。我又去查了 tail.c 的源码,也没发现它对 SIGINT 有特殊的处理啊。

难道是继承过来的?man 7 signal 了一下,果然:

During an execve(2), the dispositions of handled signals are reset to the default; the dispositions of ignored signals are left unchanged.

所以 tail 和 B 继承了一个「忽略 SIGINT」的行为。(nohup 就是用的类似的手段啊。)

于是 strace -f 了整个从 A 开始的进程树,最后发现这问题和 Python 并没有什么关系,而是 bash 的错!

A 是用 shell=True 调用的命令,所以它调用了 /bin/sh。系统是 CentOS,所以 /bin/sh 是指向 bash 的。所以这里实际上调用了 bash,而它的处理有问题。

要重现这个 bug 很容易:

bash -c 'sleep 1000 &'

然后这个 sleep 进程就会忽略 SIGINT 和 SIGQUIT 了。我也不明白 bash 这是想要做什么。

之前也遇到过另外几个 bash 的 bug(或者是 feature?)——

  1. 在终端中,在脚本中执行交互式 bash 时,第一个 bash 进程会将自己设为前台进程组,导致后来的进程收到 SIGTTIN 或者 SIGTTOU。很神奇,两行同样的命令,第一条和后边的行为不一致

  2. 在 bash 中,执行不带 shebang 的 shell 脚本时,脚本会在当前 bash 进程内执行,造成 history 命令的行为异常

  3. 这个是听说的。输出失败时,未写入目标的内容仍留在缓冲区内,会在奇怪的地方冒出来

以后还是尽量避开 bash 吧。有 zsh 用 zsh,有 dash 用 dash;它们都没有本文提到的这些问题。

by 依云 at November 03, 2016 06:15 AM

October 31, 2016

中文社区新闻

ttf-dejavu 2.37 需要用 force 选项升级

ttf-dejavu 2.37 改变了安装 fontconfig 配置文件的方式。在之前的版本中配置文件是通过在 post_install/post_upgrade 里创建符号链接的方式安装的,在新版本中配置文件将被直接打包,如同 fontconfig 包的做法。

更多变更细节请参考: https://bugs.archlinux.org/task/32312

要升级到 ttf-dejavu 2.37 我们推荐单独升级这个包: pacman -S --force ttf-dejavu

by farseerfc at October 31, 2016 09:53 AM

October 27, 2016

ヨイツの賢狼ホロ

给 GNU/Linux 萌新的 Arch Linux 安装指南

给彻头彻尾的 GNU/Linux 新手的 Arch Linux 安装指南 😣

为啥要搞这个?

因为 ArchWiki 上的 Beginner Guide 已经和 Installation Guide 合成一个啦😂,然后有小白开始抱怨看不懂啦(误 (╯・∧・)╯ ┻━┻

其实咱最早看的也是 Beginner Guide ……

算了概念用到时再解释 😂

我是一个彻头彻尾的Linux新手,我应该用Arch吗?

如果你是新手,要使用 Arch 就必须愿意花时间学习新系统,接受 Arch 是一个 DIY 的系统,每个用户都是自己系统的组建者。

在开始问任何问题之前,自己先通过Google、Wiki或者论坛进行搜索。我们为你创建了这些资源并让你可以随时访问,上千志愿者为你提供了大量的信息资源。

推荐阅读: Arch terminology#RTFM

备份……

万一手抖格错了盘别抱怨 Linux ……

下载 ISO

https://www.archlinux.org/download/

BT 种子和磁力链接在上面,直接下载的话往下拉,找 China 下面的镜像网站挑一个下载就好。 (っ╹ ◡ ╹ )っ

确定启动类型

  • 首先打开设置 ( Windows 8/8.1 叫做 "电脑设置"),然后通过 "更新和恢复" -> "恢复" -> "高级启动" 重启电脑.

如果是 UEFI 启动的话,大概是这个样子:

UEFI 系统启动之后大概像这样

没错就是有个 "使用设备" 的选项 😂

  • 或者同时按下键盘上的 Windows 徽标键(就是有 Windows 标志那个) 和 R 键,会打开“运行” 对话框。
“运行”对话框

在里面输入 msinfo32 然后回车(按 Enter 键)确认,打开”系统信息”应用。

“系统信息”窗口

看“BIOS模式”里是不是 UEFI 😂😂,还有下面那个 “安全启动状态”是不是“以关闭”(咱这台电脑的 UEFI 太旧所以显示的是不支持)

如果安全启动是打开的还需要自己进 UEFI 固件设置里手动关闭 😂

具体怎么关因为每种电脑的方法不一样于是汝要自己 STFW (Search the f**king Web,搜索一下) 了😂
  • 再或者打开磁盘管理(Windows 8 以后的系统可以通过按下 Windows + X 的菜单里找到 “磁盘管理”)
磁盘管理在这~

嗯,大概就是这样子的呗 (虽然具体的磁盘分区可能和咱的不一样)

大概长这样~

看汝的硬盘上有没有一个 EFI 系统分区 😂😂😂


还是搞不懂的下面也不用看了,准备下最后的晚餐吧 😋 (误

在硬盘上准备一块空闲空间

不然要把 Linux 装到哪里去呐?

这里拿来演示的是 Windows 7 以后都自带的 “磁盘管理” 程序,应该能解决大多数问题 _(:з」∠)_

  • Windows 8 以后的系统可以通过按下 Windows + X 的菜单里找到 “磁盘管理”
磁盘管理在这~
  • 嗯,大概就是这样子的呗 (虽然具体的磁盘分区可能和咱的不一样)
大概长这样~
  • 汝哪个硬盘分区比较空闲? 右键点击它,有一个"压缩卷的选项"
”压缩卷“ 在这~
  • 输入压缩的大小 _(:з」∠)_
多少
  • 然后就多了一块未分配的空间 😂
多了一块未分配的空间

如果汝的硬盘分区有些刁钻而磁盘管理没法解决的话,AOMEI 家的分区助手不错, 这是官方网站 , 这是分区教程

制作启动盘

但前提是汝的电脑能从 U 盘启动 😂 (不过最近几年生产的电脑都应该可以了吧……

Windows 下咱比较推荐一个叫 rufus 的软件,官方网站在这

下载完以后双击运行,需要管理员权限,记得看有没有数字签名。(有数字签名时用户账户控制的对话框是蓝色的)

Rufus 自带多国语言(当然也包括中文啦),如果汝系统语言不是中文的话,点击那个地球图标就可以修改语言了啦~

选择语言

然后戳有点像光盘的按钮选择刚下载好的 ISO 镜像

选择映像

然后选择一种启动类型,UEFI 就选最后一个,不是的话就选第一个。

选择启动类型

写入方式选推荐的就好 (´_`)

选择写入方式

确认(要知道汝按下确认以后就没有回头路了,所以记得提前备份 U 盘上的资料 😂)

确认

然后坐等完成,完成以后汝的 U 盘卷标应该是 "ARCH_201610" 这样的 (后面四位年份和两位月份),不要改成别的,万一不对记得照 ISO 改回来 😂😂

准备启动

重启电脑,然后让电脑从 U 盘启动。

具体怎么搞还是要看电脑的硬件啦 😂
  • MBR 成功启动以后像这样
MBR

选第一项。😂 (除了 CPU 不支持的都应该用x86_64 😋)

  • UEFI 成功启动以后像这样
UEFI

还是选第一项。😂

然后等待一会以后会出现……

root@archiso ~ #

这就表示已经启动完毕啦 ~(>_<~)

root是用戶名,前面那個數字是上一個命令的exit status啦,如果正常結束的命令exit status是0,就不會顯示出來,你有 1 2 127 這種都是某種東西報錯了.

----现任 Arch Linux TU 之一的 farseerfchttps://www.zhihu.com/question/45329752/answer/98733823 中写到……

联网

首先当然是联网啦,如果是自动获取 IP 地址的有线网络,那么应该啥也不用做,ping 一下试试?

root@archiso ~ # ping archlinux.org

(把电脑用网线接到家里的路由器上就有相同的效果)

如果没网的话…… 😂


  • 先用 ip link 确定一下网卡
root@archiso ~ # ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp4s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
    link/ether c8:9c:dc:a8:ab:c3 brd ff:ff:ff:ff:ff:ff
3: wlp0s29u1u1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
    link/ether 44:94:fc:0f:63:b9 brd ff:ff:ff:ff:ff:ff

这个例子里,lo 是本地环回不用管它,enp 开头的是有线网卡,wlp 开头的是无线网卡。

如果汝明明有无线网卡却没识别的话,有可能汝是某无线网卡厂商受害者😂😂

这时可以:

  • 有 Android 手机的话,手机连 WiFi ,然后用“USB 网络共享”共享给电脑。
  • 找个 USB 无线网卡插上 😂
  • 连有线😂😂
  • 如果有无线网卡的话,试试连接到 WiFi ……

** 输入 wifi-menu ,等一下会看到找到的 WiFi 网络的列表

WiFi 列表

** 选择一个网络,保存网络配置文件

保存配置文件

** 如果有密码的话,输入密码

WiFi 密码

** 然后按 Enter 确认,连到 WiFi 的话会返回 Shell。

谁叫 Arch 连不上网的话都装不了 😂

时间同步

timedatectl set-ntp true 保证时间同步 。

root@archiso ~ # timedatectl set-ntp true
root@archiso ~ # timedatectl status
    Local time: Fri 2016-10-28 17:39:42 UTC
Universal time: Fri 2016-10-28 17:39:42 UTC
        RTC time: Fri 2016-10-28 17:39:42
    Time zone: UTC (UTC, +0000)
Network time on: yes
NTP synchronized: no
RTC in local TZ: no

准备硬盘空间

这里用 cgdisk (UEFI)/ cfdisk (MBR) 来给硬盘分区。

两个看起来差不多所以咱偷会儿懒😂

首先输入 lsblk 看看汝的硬盘是哪个设备:

root@archiso ~ # lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 463.9G  0 disk
├─sda1   8:1    0   512M  0 part
├─sda2   8:2    0    16M  0 part
├─sda3   8:3    0 103.4G  0 part
└─sda4   8:4    0 253.4G  0 part
sdb      8:16   1   7.5G  0 disk
└─sdb1   8:17   1   7.5G  0 part /run/archiso/bootmnt
sr0     11:0    1  1024M  0 rom
loop0    7:0    0 346.1M  1 loop /run/archiso/sfs/airootfs

比如咱这里 sda 是咱的硬盘,于是运行 cgdisk 时加上 /dev/sda 这个参数:

/dev 是一个虚拟文件夹(也就是并不在硬盘上),它会把电脑上的设备映射成一个个文件 _(:з」∠)_
root@archiso ~ # cgdisk /dev/sda
                                            cgdisk 1.0.1

                                        Disk Drive: /dev/sda
                                    Size: 972906545, 463.9 GiB

Part. #     Size        Partition Type            Partition Name
----------------------------------------------------------------
            1007.0 KiB  free space
1           512.0 MiB   EFI System                EFI system partition
2           16.0 MiB    Microsoft reserved        Microsoft reserved partition
3           103.4 GiB   Microsoft basic data      Basic data partition
4           253.4 GiB   Microsoft basic data      Basic data partition
            106.6 GiB   free space





    [ Align  ]  [ Backup ]  [  Help  ]  [  Load  ]  [  New   ]  [  Quit  ]  [ Verify ]  [ Write  ]

cgdisk 的界面大概像这样啦,用上下方向键把光标移动到汝之前的空闲空间上去(例如咱这里是最后一个)

新硬盘的话应该只有一个 free space 😂

用左右方向键把下面一排按钮上的光标移动到 New 上,然后按 Enter。

(这里看不出光标😂,黑色背景下光标应该是白的吧😂😂)

接下来会问几个问题(# 开头的是咱加上的注释😂):

# 数字可能和汝看到的不一样😂
# 起始扇区的位置,直接 Enter 就行
First sector (749424640-972906511, default = 749424640):
# 大小,可以是扇区数,也可以是实际的大小(例如 100M,20G一类的),要用掉整个剩余空闲空间的话,直接 Enter 就行。
Size in sectors or {KMGTP} (default = 223481872):
# 分区类型,默认的就好
# 但是如果要建立新的 EFI 系统分区的话 ,分区类型是 :code:`ef00`
# 但是如果要建立新的 交换空间(就是虚拟内存啦)的话 ,分区类型是 :code:`8200`
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300):
# 设置卷标,不设置也行。
Current partition name is ''
Enter new partition name, or <Enter> to use the current name:

然后汝应该会发现下面的空闲空间变成 Linux filesystem 了呗~

要保存分区表的话,用左右方向键把下面一排按钮上的光标移动到 Write 上,然后按 Enter。

Are you sure you want to write the partition table to disk? (yes or no):

        Warning!! This may destroy data on your disk!

在这里输入 yes (就是 yes,不是 y Y YES 啥的😂),然后按 Enter。

然后下面会闪过一行 "The operation has completed successfully" ,这时就可以退出了。

用左右方向键把下面一排按钮上的光标移动到 Quit 上,然后按 Enter。

然而汝以为这样就结束了?还没格式化呢 (╯°Д°)╯︵/(.□ . )

创建文件系统+挂载

首先还是用 lsblk 确定一下分区的名称,为了以防万一记得加上 -f 参数:

root@archiso ~ # lsblk -f
NAME   FSTYPE   LABEL       UUID                                 MOUNTPOINT
sda
├─sda1 vfat               3C44-B4ED
├─sda2
├─sda3 ntfs               42E243C5E243BBC3
├─sda4 ntfs   新加卷      58741F29741F0A00
└─sda5
sdb
└─sdb1 vfat   ARCH_201610 EAC8-F012                            /run/archiso/bootmnt
sr0
loop0  squashfs                                                  /run/archiso/sfs/airootfs

第一排分别表示设备名称,文件系统类型,卷标,UUID和挂载点。

咱这里的话 sda1 那个 vfat 分区就是 EFI 系统分区啦,sda5 就是刚刚新建的分区啦~(因为还没格式化所以没有文件系统😂)

mkfs.ext4 把那个分区格式化成 ext4 文件系统咯~

记得自己看清楚是哪个分区别格式化错了 😂
root@archiso ~ # mkfs.ext4 /dev/sda5
mke2fs 1.43.3 (04-Sep-2016)
Creating filesystem with 27935234 4k blocks and 6987776 inodes
Filesystem UUID: a3943e57-6217-4a5f-8e57-ade5771315c0
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done
Writing inode tables: done
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done

root@archiso ~ #

等一排文字闪过就格式化完了……

如果要格式化新的 EFI 系统分区的话,用 mkfs.vfat

如果要格式化新的 交换空间的话,用 mkswap

接下来用 mount 挂载分区啦~ (。>ω<)。

# mount <设备名称> <目标文件夹>
# /mnt 挺合适的
root@archiso ~ # mount /dev/sda5 /mnt
# 如果要挂载 EFI 系统分区的话,建议挂载到 /mnt/boot
# 所以先建立相应的文件夹
root@archiso ~ # mkdir /mnt/boot
root@archiso ~ # mount /dev/sda1 /mnt/boot
# 有交换空间的话不用挂载,用 swapon 命令。
root@archiso ~ # swapon /dev/sda6

选择软件仓库镜像

软件仓库(在Debian系发行版中,又叫做“软件源”)是软件包存储的地方。通常我们所说的软件仓库指在线软件仓库,亦即用户从互联网获取软件的地方。

用 nano 打开 /etc/pacman.d/mirrorlist

root@archiso ~ # nano /etc/pacman.d/mirrorlist


GNU nano 2.7.0                        File: /etc/pacman.d/mirrorlist

##
## Arch Linux repository mirrorlist
## Sorted by mirror score from mirror status page
## Generated on 2016-10-01
##

## Score: 0.2, France
Server = http://archlinux.polymorf.fr/$repo/os/$arch
## Score: 0.3, France
Server = http://arch.tamcore.eu/$repo/os/$arch
## Score: 0.3, Germany
Server = http://mirrors.cicku.me/archlinux/$repo/os/$arch
## Score: 0.3, Czech Republic
Server = http://ftp.sh.cvut.cz/arch/$repo/os/$arch
## Score: 0.3, Germany
Server = http://mirror.js-webcoding.de/pub/archlinux/$repo/os/$arch
## Score: 0.4, Netherlands
Server = http://ftp.nluug.nl/os/Linux/distr/archlinux/$repo/os/$arch
## Score: 0.4, Poland
                                        [ Read 517 lines ]
^G Get Help    ^O Write Out   ^W Where Is    ^K Cut Text    ^J Justify     ^C Cur Pos     ^Y Prev Page
^X Exit        ^R Read File   ^\ Replace     ^U Uncut Text  ^T To Spell    ^_ Go To Line  ^V Next Page

这是 GNU nano 的主界面,最简单的方法还是把下面那些 Mirrors 先全删掉然后输入一个新的, 用光标指向某一行以后同时按下 Ctrl+K 就好。然后自己输入一个 Mirror ,下面给出几个中国国内的 Mirror:

(所谓的 Ctrl+K 就是这两个键一起按😂)

# 网易
Server = http://mirrors.163.com/archlinux/$repo/os/$arch
# 清华大学 TUNA 协会
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch
# 中国科学技术大学
Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch
# 西安交通大学
Server = https://mirrors.xjtu.edu.cn/archlinux/$repo/os/$arch

输入完以后按下 Ctrl+O 写入,按 Enter 确定,再按 Ctrl+X 退出。

然后用 pacman -Syy 刷新一下软件包数据库。

root@archiso ~ # pacman -Syy
:: Synchronizing package databases...
core                                  120.9 KiB  4.92M/s 00:00 [##################################] 100%
extra                                1755.6 KiB  5.24M/s 00:00 [##################################] 100%
community                               3.7 MiB  6.82M/s 00:01 [##################################] 100%
root@archiso ~ #

安装基本系统

用 pacstrap 安装基本系统,默认会安装 base 组,要通过 AUR 或者 ABS 编译安装软件包,还需要安装 base-devel 啦:

评论里 farseerfc 提到装几个连接无线网络需要的软件包。(iw dialog wpa_supplicant wpa_actiond)
root@archiso ~ # pacstrap /mnt base base-devel iw dialog wpa_supplicant wpa_actiond

这个组并没有包含全部 live 环境中的程序,有些需要额外安装, packages.both 页面包含了它们的差异呗~

其他软件以后会用 pacman 再安装啦~

安装完以后大概会是这个样子 (´・ω・`)

pacstrap /mnt base base-devel   29.09s user 2.61s system 85% cpu 37.271 total

准备进入 chroot 环境

生成 fstab 啦 ~

# genfstab
usage: genfstab [options] root

Options:
    -L             Use labels for source identifiers (shortcut for -t LABEL)
    -p             Exclude pseudofs mounts (default behavior)
    -P             Include printing mounts
    -t TAG         Use TAG for source identifiers
    -U             Use UUIDs for source identifiers (shortcut for -t UUID)

    -h             Print this help message

genfstab generates output suitable for addition to an fstab file based on the
devices mounted under the mountpoint specified by the given root.
root@archiso ~ # genfstab -U /mnt >> /mnt/etc/fstab

然后向新系统出发~

root@archiso ~ # arch-chroot -help
usage: arch-chroot chroot-dir [command]

    -h                  Print this help message
    -u <user>[:group]   Specify non-root user and optional group to use

If 'command' is unspecified, arch-chroot will launch /bin/bash.
root@archiso ~ # arch-chroot /mnt /bin/bash

设置基本系统

# 开头只表示以 root 用户运行,汝不用把 # 输入到终端里啦~
  • 设置时区(中国的时区是 Asia/Shanghai)
# ln -s <源文件> <目标> 创建一个符号链接

# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  • 设置时间标准 为 UTC,并调整 时间漂移:
# hwclock --systohc --utc
  • /etc/locale.gen 是一个仅包含注释文档的文本文件。指定您需要的本地化类型,去掉对应行前面的注释符号(#)就可以啦,还是用 nano 打开,建议选择帶UTF-8的項:
# nano /etc/locale.gen

en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
zh_TW.UTF-8 UTF-8
  • 执行 locale-gen 以生成 locale 讯息:
# locale-gen
  • 创建 locale.conf 并提交您的本地化选项:

    将系统 locale 设置为en_US.UTF-8,系统的 Log 就会用英文显示,这样更容易问题的判断和处理。用户可以设置自己的 locale。

    警告: 不推荐在此设置任何中文locale,或导致tty乱码。

# echo 用来输出某些文字,后面的大于号表示把输出保存到某个文件里啦~

# echo LANG=en_US.UTF-8 > /etc/locale.conf
  • 设置一个喜欢的主机名(用汝的主机名代替 myhostname ):
# echo myhostname > /etc/hostname
  • 设置 root 的密码(输入密码的时候就是啥也没有 ╮( ̄▽ ̄)╭ ):
[root@archiso /]# passwd
New password:
Retype new password:
passwd: password updated successfully
  • 安装启动管理器(例如 GRUB ):

** UEFI 用户先再安装几个必要的软件包咯~

# pacman -S efibootmgr dosfstools

** 然后安装 GRUB

# pacman -S grub os-prober

** 把 GRUB 安装到硬盘:

# MBR 用户这么做 (记得用汝自己硬盘的名称代替 sda ,不要带上表示分区的数字啦~):

# grub-install --target=i386-pc /dev/sda --recheck

# UEFI 用户这么做:

# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --recheck

EFI 安装成功以后大概像这样 😂

[root@archiso /]# grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --recheck
Installing for x86_64-efi platform.
Installation finished. No error reported.

然后生成必要的配置文件:

[root@archiso /]# grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-linux
Found initrd image(s) in /boot: initramfs-linux.img
Found fallback initrd image(s) in /boot: initramfs-linux-fallback.img
WARNING: Failed to connect to lvmetad. Falling back to device scanning.
done

安装桌面环境 (可能不一定需要)

  • 安装桌面环境需要的基础包 (就是 xorg 啦)
[root@archiso /]# pacman -S xorg
:: There are 80 members in group xorg:
:: Repository extra
1) xf86-input-evdev  2) xf86-input-joystick  3) xf86-input-keyboard  4) xf86-input-libinput
5) xf86-input-mouse  6) xf86-input-synaptics  7) xf86-input-vmmouse  8) xf86-input-void
9) xf86-video-amdgpu  10) xf86-video-ark  11) xf86-video-ati  12) xf86-video-dummy
13) xf86-video-fbdev  14) xf86-video-glint  15) xf86-video-i128  16) xf86-video-intel
17) xf86-video-mach64  18) xf86-video-neomagic  19) xf86-video-nouveau  20) xf86-video-nv
21) xf86-video-openchrome  22) xf86-video-r128  23) xf86-video-savage  24) xf86-video-siliconmotion
25) xf86-video-sis  26) xf86-video-tdfx  27) xf86-video-trident  28) xf86-video-vesa
29) xf86-video-vmware  30) xf86-video-voodoo  31) xorg-bdftopcf  32) xorg-docs  33) xorg-font-util
34) xorg-fonts-100dpi  35) xorg-fonts-75dpi  36) xorg-fonts-encodings  37) xorg-iceauth
38) xorg-luit  39) xorg-mkfontdir  40) xorg-mkfontscale  41) xorg-server  42) xorg-server-common
43) xorg-server-devel  44) xorg-server-xdmx  45) xorg-server-xephyr  46) xorg-server-xnest
47) xorg-server-xvfb  48) xorg-server-xwayland  49) xorg-sessreg  50) xorg-setxkbmap
51) xorg-smproxy  52) xorg-x11perf  53) xorg-xauth  54) xorg-xbacklight  55) xorg-xcmsdb
56) xorg-xcursorgen  57) xorg-xdpyinfo  58) xorg-xdriinfo  59) xorg-xev  60) xorg-xgamma
61) xorg-xhost  62) xorg-xinput  63) xorg-xkbcomp  64) xorg-xkbevd  65) xorg-xkbutils  66) xorg-xkill
67) xorg-xlsatoms  68) xorg-xlsclients  69) xorg-xmodmap  70) xorg-xpr  71) xorg-xprop
72) xorg-xrandr  73) xorg-xrdb  74) xorg-xrefresh  75) xorg-xset  76) xorg-xsetroot  77) xorg-xvinfo
78) xorg-xwd  79) xorg-xwininfo  80) xorg-xwud

Enter a selection (default=all):

这时会让汝选择需要哪些软件包啦,其实大多数时候默认的就行……

  • 接下来挑一个喜欢的桌面环境包组装上咯~

    (咱这里就只举例 GNOME KDE 和 xfce 啦,其他官方支持的桌面环境可以去 ArchWiki 查看)

    GNOME , 想要 GNOME 全家桶的话带上 gnome-extras

    # pacman -S gnome

    KDE Plasma , 想要 KDE 全家桶的话用 kde-applications 代替 kde-applications-meta, 还有中文翻译包:

    # pacman -S plasma kde-applications-meta sddm kde-l10n-zh_cn

    或者只安装 Dolphin (文件管理器),Kate(文字编辑器)和Konsole(终端模拟器)

    # pacman -S plasma dolphin kate konsole sddm kde-l10n-zh_cn

    xfce4,xfce 不带显示管理器,所以要装个其他的(例如 sddm )

    # pacman -S xfce4 xfce4-goodies sddm

    桌面环境大多数使用 NetworkManager :

    # pacman -S networkmanager

  • 然后安装中文字体( 同样 pacman -S 😋)

    Google Noto Fonts 系列: noto-fonts noto-fonts-cjk noto-fonts-emoji

    思源黑体:adobe-source-han-sans-otc-fonts

    文泉驿:wqy-microhei wqy-zenhei

更多的字体可以在 https://wiki.archlinux.org/index.php/Fonts_(简体中文) 找到。

  • 新建一个用户

    -m 为新用户创建一个文件夹,-s 设置用户的登录 Shell

    记得最后是用户名就好 😂

    # useradd -m -s /bin/bash horo

    然后设置密码

    # passwd horo

  • 激活需要的服务(显示管理器啦)

    # systemctl enable gdm

    or

    # systemctl enable sddm

    当然还有 NetworkManager:

    # systemctl enable NetworkManager

    (这个里面有大写😂)

完工啦~

  • 离开 chroot 环境:

    # exit

  • 卸载挂载的分区,(其实不是必须的,因为马上就重启啦~)

    # umount -R /mnt

  • 重新启动,准备迎接新的系统吧 ~(>_<~)

by ホロ at October 27, 2016 04:00 PM

October 21, 2016

百合仙子

在 Python 里设置 stdout 的编码

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

有时候进程的运行环境里,locale 会被设置成只支持 ASCII 字符集的(比如 LANG=C)。这时候 Python 就会把标准输出和标准错误的编码给设置成 ascii,造成输出中文时报错。

一种解决办法是设置支持 UTF-8 的 locale,但是那需要在 Python 进程启动前设置。启动之后,初始化过了,再设置 locale 也不会重新初始化那些对象。

另一种办法是往 sys.stdout.buffer 这种地方直接写 bytes。理论上完全没问题,但是写起程序来好累……

我就去找了一下怎么优雅地弄一个新的 sys.stdout 出来。Python 3 的 I/O 不再使用 C 标准库的 I/O 函数,而是直接使用 OS 提供的接口。封装位于 io 这个模块里边,有带缓冲的,不带缓冲的,二进制的,文本的。

研究了一下文档可知,sys.stdout 是个 io.TextIOWrapper,有个 buffer 属性,里边是个 io.BufferedWriter。我们用它造一个新的 io.TextIOWrapper,指定编码为 UTF-8:

import sys
import io

def setup_io():
  sys.stdout = sys.__stdout__ = io.TextIOWrapper(
    sys.stdout.detach(), encoding='utf-8', line_buffering=True)
  sys.stderr = sys.__stderr__ = io.TextIOWrapper(
    sys.stderr.detach(), encoding='utf-8', line_buffering=True)

这里除了可以设置编码之外,也可以设置错误处理和缓冲。所以这个技巧也可以用来容忍编码错误、改变标准输出的缓冲(不需要在启动的时候加 -u 了)。

其实这样子还是不够彻底。Python 在很多地方都有用到默认编码。比如 subprocess,指定 universal_newlines=True 时 Python 会自动给标准输入、输出、错误编解码,但是呢,在 Python 3.6 之前,这里的编码是不能手动指定的。还有参数的编码,也是不能指定的(不过可以传 bytes 过去)。

所以,还是想办法去设置合适的 locale 更靠谱……

by 依云 at October 21, 2016 06:43 AM

October 03, 2016

ヨイツの賢狼ホロ

Windows Subsystem for Linux + Arch Linux

把 Bash on Ubuntu on Windows 上的 Ubuntu 换成 Arch Linux 😋

这啥?😂

从 Windows 10 Insider Preview 开始,加入了 Windows Subsystem for Linux (适用于 Linux 的 Windows 子系统) 功能.

Windows Subsystem for Linux(简称WSL)是一个为在Windows 10上能够原生运行 Linux 二进制可执行文件(ELF 格式)的兼容层。 它是由微软与 Canonical 公司合作开发,目标是使纯正的 Ubuntu Trusty Tahr映像能下载和解压到用户的本地计算机,并且映像内的工具和实用工具能在此子系统上原生运行。

WSL提供了一个微软开发的 Linux 兼容内核接口(不包含Linux代码),来自 Ubuntu 的用户模式二进制文件在其上运行

WSL 的具体应用就是 Bash on Ubuntu on Windows 啦,在 Windows 上实现了一个 Ubuntu 子系统。

和常见的 Windows 上运行 Linux 的一系列方法相比:

  • 相比虚拟机,不必运行整个系统,相应减少了资源占用(当然不保证提高编译效率🌚
  • 相比 Cygwin,Msys2 一类的解决方案,运行在 Ubuntu 上的软件(可能)不需要重新编译就能在 Bash on Ubuntu on Windows 上使用,也能使用 Ubuntu 软件仓库提供的软件包
  • ……

听起来是不是很诱人啊😋

然而…… ------------------------------‘

上面的子系统是 Ubuntu…… (╯•̀-•́)╯ ┻━┻

上面的子系统是 Ubuntu…… (╯・﹏・)╯ ┻━┻

上面的子系统是 Ubuntu…… (╯@△@)╯ ┻━┻

重要的事情说三遍 😂😂

于是把里面的 Ubuntu 换成其它系统的想法就应运而生了……

其实已经有人这么做过了虽然并不完美 😂: https://github.com/Microsoft/BashOnWindows/issues/992

直到最近 Insider Preview 更新到 14396,终于实现了 chroot 系统调用 ( -> Change Log ), 才使得在 WSL 上运行其它发行版的可用性更近了一步😂

作为现 Arch Linux 用户,当然想在 WSL 上运行 Arch Linux 啦😋

开工 😏

首先得首先是要把 Bash on Ubuntu on Windows 装上 😂

  • 更新到最新的 Windows 10 Insider Preview (现在是 14396.1000 )
  • 从”设置-更新与恢复-适用于开发人员“中把开发人员模式打开。
  • 从”控制面板-程序和功能-启用或关闭 Windows 功能“中打开”适用于 Linux 的 Windows 子系统“
  • 重新启动,打开命令提示符或者 Windows PowerShell ,输入 bash 回车然后按提示完成安装……

首先需要一个现成的 Arch Linux ,在上面用 arch-install-scripts 装好一个新的 Arch Linux,然后打包成 Tarball。

然后进入 Bash on Ubuntu on Windows ,把刚刚的 Tarball 解开到某个位置。

如果汝手边没有可用的 Linux 系统的话,也可以试试 ArchISO 的 rootfs:

  • 从 ArchISO 中提取出 /arch/x86_64/airoot.sfs 文件放在 Bash on Ubuntu on Windows 能读取的目录下,然后复制/移动到能写入的目录。
  • 安装 squashfs-tools ,然后以 root 用户运行 unsquashfs airoot.sfs ,把 ArchISO 的 Live 系统提取出来。

然后把 Bash 窗口关掉,到 C:\Users\<这是汝的用户名>\AppData\Local\Lxss 文件夹中。

这个文件夹可能在文件资源管理器里看不到咧?可以选择在文件夹选项 中把“隐藏受保护的操作系统文件”选项取消,或者直接在导航栏输入路径打开。

rootfs 文件夹就是 Bash 中的 / 啦,从里面找到刚解压出来的 tarball 的文件夹放在 lxss 目录下。

把原来的 rootfs 文件夹重命名一下,再把刚解压出来的 tarball 的文件夹重命名为rootfs。

打开命令提示符或者 Windows PowerShell ,输入 bash 等等先别着急打开 bash , 先用 lxrun /setdefaultuser root 把默认的用户换成root (或者其它已经在 tarball 的 /etc/passwd 里的用户,例如 AOSC 的 tarball 里默认还会有一个 aosc 用户)

然后再打开 bash ,Duang~

WSL with Arch Linux

那个 screenfetch 是咱后来装的 😂

现在还有点小问题 😂

fakeroot 在 WSL 里有点问题(可是咱忘了记下来日志了觉得咱自己好菜啊),只好写个假的 fakeroot 糊弄过去 😂:

#!/bin/bash

if [ "$1" = "-v" ]; then
    echo 1.0
    exit
fi

export FAKEROOTKEY=1

exec "$@"

unset FAKEROOTKEY

现在记得在 /etc/pacman.conf 里忽略 fakeroot 包 _(:з」∠)_

WSL 的 Change Log ,现在最新的 Build 14396 会在某些 Socket 连接(例如 ssh / X )时蓝屏报错 “ATTEMPTED EXECUTE OF NOEXECUTE MEMORY” ,这个只能等他们修复了_(:з」∠)_

by ホロ at October 03, 2016 04:00 PM

September 28, 2016

ヨイツの賢狼ホロ

从零开始的 GnuPG 学习笔记 [1] - 创建密钥对

在 GNU/Linux 上用 gpg 创建自己的密钥对~

对于 Windows 用户,可以试试 Gpg4win , Gpg4win 提供了一套 Windows 下可用的 GPG 解决方案.

Gpg4win内置的是 Kleopatra , 官方文档在这 , 其它人写的教程 Google 一下应该也找的到.

创建密钥对

从终端中运行 gpg --full-gen-key --expert :

--full-gen-key 是使用完整的步骤创建密钥对.

—expert 顾名思义就是 专家模式啦, 例如可以选择更多种(例如新式的)加密方式呗~

有些发行版可能会用 gpg2 来代表版本 2+ 的 gpg.
$ gpg --full-gen-key --expert
gpg (GnuPG) 2.1.15; Copyright (C) 2016 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

请选择您要使用的密钥种类:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (仅用于签名)
   (4) RSA (仅用于签名)
   (7) DSA (自定义用途)
   (8) RSA (自定义用途)
   (9) ECC and ECC
  (10) ECC (sign only)
  (11) ECC (set your own capabilities)
您的选择?

可能汝和咱的有些不一样(因为 ECC 加密算法在 gpg 2.14 才开始支持).

ECC 又称椭圆曲线密码学,主要优势是在某些情况下 它比其他的方法使用更小的密钥——比如RSA加密算法——提供相当的或更高等级的安全。

不过有些地方还不能用这种新加密算法,这里示范咱就只用默认的 RSA 啦😂

输入密钥种类前面的数字(不带括号),然后确认.

RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048)

在这里设置一个密钥长度,默认的长度应该足够安全了.如果有需要,也可以增加.

RSA 密钥长度应在 1024 位与 4096 位之间。
What keysize do you want for the subkey? (2048)

然后为子密钥设置密钥长度.

是不是想问啥是子密钥 (subkey) ?

一个密钥对下可以添加不同的子密钥,这样做的好处有啥咧?

  • 区分目的:例如一个子密钥用于加密,另一个子密钥用于电子邮件签名等等......
  • 区分设备:比如某些安全性稍差的设备(例如手机),汝可以只把一对专用的子密钥放到里面.
  • 保护主密钥:如果子密钥泄漏,只要吊销相应的子密钥就好,而主密钥依然安全~
请设定这把密钥的有效期限。
     0 = 密钥永不过期
  <n>  = 密钥在 n 天后过期
  <n>w = 密钥在 n 周后过期
  <n>m = 密钥在 n 月后过期
  <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0)

接下来为密钥设置有效期啦~

不用担心密钥过期啦,因为在密钥过期前汝还是可以用 gpg --edit-key 命令来重新设置有效期呗~

设定完过期时间以后输入 y 确认.

标识密钥对

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

真实姓名:
电子邮件地址:
注释:

在这里用姓名,电子邮件地址和注释标识这把密钥吧~

gpg 会用这些信息生成特定的用户 ID ,以后对密钥进行操作都需要用到用户 ID 呐~

您选定了这个用户标识:
    “ThisIsAName (Comment) <mailaddress@domain.tld>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)

在输入完成之后会有一次确认的机会,觉得没问题就输入 O 继续吧~

接下来会弹出一个对话框,提示汝输入一个密码来保护私钥.至于如何创建一个强密码......

然后.....

我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动 鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。

于是随便做些啥吧~

完工啦~

gpg: 密钥 A4A7BA4D077C612F 被标记为绝对信任
gpg: revocation certificate stored as
'/home/horo/.gnupg/openpgp-revocs.d/2A35F5ED3FB328E39DFADA2AA4A7BA4D077C612F.rev'
公钥和私钥已经生成并经签名。

pub   rsa2048 2016-09-29 [SC]
    2A35F5ED3FB328E39DFADA2AA4A7BA4D077C612F
    uid                      ThisIsAName (Comment) <mailaddress@domain.tld>
    sub   rsa2048 2016-09-29 [E]

这个时候就表示密钥生成好啦~

像 A4A7BA4D077C612F 这样的就是汝的用户 ID 啦,有时也会用到下面那个比较长的 ID.

同时会在 .gnupg/openpgp-revocs.d/ 文件夹下生成一份吊销证书,当汝因为某些原因 丢失了私钥或者怀疑密钥被窃时,可以用这个吊销证书来吊销汝的密钥.

这样一对密钥就创建好啦~,下次再细水长流密钥的应用咯 😂

by ホロ at September 28, 2016 04:00 PM

Felix Yan

修复 Android ROM 的 Google 网络定位

一些定制、第三方 ROM 在安装了 Google 框架后,仍然无法使用其网络定位功能。我在网上搜索了许多资料,整理如下。

本文假设你的设备已经 Root,并已经安装了 Google 框架。我测试用的 ROM 为一加氢 OS。

一、准备工具

需要准备的工具有 zip、unzip、apktool、adb、zipalign,以及一个好使的文本编辑器。

(注意 zipalign 工具可能不在 $PATH 中,如 Arch AUR 包 android-sdk-build-tools 安装后会放在 /opt/android-sdk/build-tools/$pkgver/zipalign)

二、提取需要的资源

取出 ROM 中的 framework-res.apk,并反编译得到需要修改的文件:

adb pull /system/framework/framework-res.apk
apktool if framework-res.apk
apktool d framework-res.apk

三、修改文件

修改位置提供商相关设置,使用 Google 提供网络定位。

1、修改 framework-res/res/values/arrays.xml,找到 config_locationProviderPackageNames 的位置,确保 Google 在列表中。如我的 ROM 默认只有 com.android.location.fused 和 com.amap.android.location 两项,这时应当加入 com.google.android.gms,使得最终结果类似这样:

<string-array name="config_locationProviderPackageNames">
        <item>com.google.android.gms</item>
        <item>com.android.location.fused</item>
        <item>com.amap.android.location</item>
    </string-array>

2、修改 framework-res/res/values/bools.xml,启用 config_enableNetworkLocationOverlay 和 config_enableFusedLocationOverlay。如果原来的值是 false,把它们改成 true:

<bool name="config_enableNetworkLocationOverlay">true</bool>
    <bool name="config_enableFusedLocationOverlay">true</bool>

3、修改 framework-res/res/values/strings.xml,设置 config_networkLocationProviderPackageName 为 com.google.android.gms。

<string name="config_networkLocationProviderPackageName">com.google.android.gms</string>

(我一并修改了 config_fusedLocationProviderPackageName 为 com.android.location.fused,虽然可能是不必要的)

四、应用修改

1、重新编译,并从结果中提取出需要的部分:

apktool b framework-res
unzip -j framework-res/dist/framework-res.apk resources.arsc -d ./

2、将提取出的文件替换到原来的 framework-res.apk 中:

cp framework-res.apk framework-res-modified.apk
zip -0 framework-res-modified.apk resources.arsc

3、对资源进行 4 字节对齐处理:

zipalign 4 framework-res-modified.apk framework-res-aligned.apk

4、将修改后的 ROM 和更新脚本上传到手机:

这个更新脚本是我自己写的,主要处理了权限问题:

install-framework-res.sh

#!/bin/sh
mount -o remount,rw /system
mv "$1" /system/framework-res.apk
chmod 644 /system/framework-res.apk
chown root:root /system/framework-res.apk
mv /system/framework-res.apk /system/framework/framework-res.apk

和修改后的 framework-res-aligned.apk 一起上传到手机:

adb push framework-res-aligned.apk install-framework-res.sh /sdcard/

5、运行脚本,替换 apk 文件:

adb shell

如果此时得到了 $ 命令符,请先获得 root:

su

然后运行脚本:

sh /sdcard/install-framework-res.sh /sdcard/framework-res-aligned.apk

6、重启到 Recovery,清空 Cache & Dalvik Cache,再次重启回到系统。

至此,你的手机应该重新拥有了网络定位功能,赶快打开一个除地图以外的需要定位的 App (比如 Ingress)测试吧!

参考资料:

by Felix Yan at September 28, 2016 02:39 PM

September 13, 2016

ヨイツの賢狼ホロ

利用 CUPS 和 Samba 在 Arch Linux 和 Windows 间共享打印机

社团新买的打印机到啦,于是就要设置一下呗~ 😋

CUPS,Samba 都是些啥?

CUPS(以前为 Common Unix Printing System,UNIX 通用打印系统的缩写,但现无官方全名) 是一个类Unix操作系统的组合式印刷系统,允许一台电脑作为打印服务器。 CUPS接受一个客户端的电脑进程,并送到相应的打印机。

虽然有其他的打印程序包例如LPRNG,但CUPS是相当流行和相对容易使用的。 它是Arch linux及许多其他Linux发行版缺省的打印系统。

ArchWiki:CUPS

Samba是一个用于局域网中的计算机间文件共享的软件,这么说您大概还摸不着头脑,那么网上邻居您听说过吧? 对,Samba就是干这个的。当年那个有点软公司设计了一套局域网计算机间的文件共享协议, 起名叫做SMB,就是Server Message Block的缩写。当时所有的Windows系统就都集成这种协议, 因此这个协议在局域网系统中的影响还比较大。后来,国际互联网,也就是Internet逐渐流行了起来, 有点软公司希望他们的这个协议能够一个用在Internet上,因此对其进行的整理, 更名为CIFS,也就是Common Internet File System。从名字可以看出,他们的期望是很高的 ,不过实际呢……反正,你现在用网上邻居上搜狐么?当然,不管怎样,CIFS或者说SMB协议在局域网中传输文件还是非常方便的。 当然,我们Linux系统之间也有很好的局域网共享文件的协议,叫做NFS, 网络文件系统的缩写。但无奈那该死的查皮不支持这个协议嘛,所以要想网络上的查皮和我之间能共享文件的话, 要么我这里有人能懂CIFS协议,要么查皮那里有软件能解析NFS协议。 然而毕竟还是我这里的软件大度一些,所以就有了用于支持SMB协议的软件——Samba。

笨兔兔的故事 - Ubuntu中文论坛

首先……😋

在 Windows 上连接好打印机,安装上驱动,再通过“设备与打印机”共享这个打印机,Windows 上的设置就完成啦~

记得记下来 Windows 电脑的 IP 地址和打印机的名称,还有给共享打印机的账户设置个密码。

然后……😋😋

打开汝的 Arch Linux ,先安装必要的软件包:

# pacman -S cups, ghostscript gsfonts samba

然后激活并启动 CUPS 服务:

# systemctl enable org.cups.cupsd.service --now

这个时候就可以通过 http://localhost:631 访问到 CUPS 的 Web 界面啦~

CUPS Web 界面

添加打印机 😋😋😋

首先点击 "Administration" 打开管理界面:

CUPS Administration 界面

然后点击 "Add printer",这时会要求汝登录.咱只试过 root 登录能成功.....

登录到管理界面

接下来选择要连接到哪种打印机啦,连接 Windows 打印机就选择 "Windows Printer via SAMBA" (通过 Samba 连接 Windows 打印机) 呗~

选择一种协议

接下来输入打印机的 URI 啦, 对于 Windows 打印机 ,URI 大概像这样:

smb://{用户名}:{密码}@{Windows 的 IP 地址}/{打印机名称}
要连接到哪个打印机?

接着用人类的语言描述一下这台打印机(例如名字和位置啦)~

描述这台打印机

然后依照打印机的品牌和型号选择适合的驱动程序呗:

咱这台 Samsung M2070 的打印机要从三星的网站上下载驱动 _(:з」∠)_

http://www.samsung.com/printersetup

选择打印机驱动程序

接着修改默认打印参数,保存,新的打印机就添加好啦~ 😋

修改默认打印参数

为了测试打印机,可以从 Maintaince 菜单中选择 “Print Test Page” 打印一张测试页试试 😋

Maintaince 菜单

还有记得添加汝自己成为可以使用打印机的用户:

Administration 菜单 添加允许使用打印机的用户

然后桌面环境下的程序应该可以看到打印机了啦~(例如 GNOME)

GNOME 下的打印机菜单

😋

by ホロ at September 13, 2016 04:00 PM

百合仙子

Linux 下的 Wi-Fi 分享

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

首先看看你的网卡和驱动组合是否支持这样的操作。

>>> iw list | grep -A2 combinations:
        valid interface combinations:
                 * #{ managed } <= 1, #{ AP, P2P-client, P2P-GO } <= 1, #{ P2P-device } <= 1,
                   total <= 3, #channels <= 2

上边这个输出说明支持,并且频道可以不一样。

然后,添加一个用途 AP 的网络接口,并配置 IP 地址。我的无线网络接口名字是 wlan0,因为我通过创建空 /etc/udev/rules.d/80-net-setup-link.rules 文件的方式禁用了 systemd 的网络接口改名。

sudo iw dev wlan0 interface add wlan0_ap type __ap
sudo ifconfig wlan0_ap 192.168.17.1

配置 NAT:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
sudo iptables -w -t nat -A POSTROUTING -s 192.168.17.0/24 -j MASQUERADE

配置 DHCP。我用的是 dnsmasq。它本来是作为 DNS 缓存用的,但是也支持 DHCP,那就用它了:

interface=wlan0_ap
no-dhcp-interface=wlan0
dhcp-range=192.168.17.50,192.168.17.150,12h

注意不要在其它只提供 DNS 服务的接口上提供 DHCP 服务,以免出现冲突。

然后就可以开启热点啦。hostapd 配置如下:

interface=wlan0_ap
driver=nl80211
ssid=名字
channel=1
hw_mode=g
ieee80211d=1
country_code=cn
ieee80211n=1
ieee80211h=1
ignore_broadcast_ssid=0
auth_algs=1
wpa=2
wpa_passphrase=secret
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

最后把它们跑起来就可以了。

为了方便使用,我创建了个 systemd 服务 wlan0_ap.service:

[Unit]
Description=Setup wlan0_ap
Before=hostapd.service
After=sys-subsystem-net-devices-wlan0.device
After=iptables.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/iw dev wlan0 interface add wlan0_ap type __ap
ExecStart=/usr/bin/ip address add dev wlan0_ap 192.168.17.1/24
ExecStart=/usr/bin/iptables -w -t nat -A POSTROUTING -s 192.168.17.0/24 -j MASQUERADE
ExecStop=-/usr/bin/iptables -w -t nat -D POSTROUTING -s 192.168.17.0/24 -j MASQUERADE
ExecStop=/usr/bin/ip address delete dev wlan0_ap 192.168.17.1/24
ExecStop=/usr/bin/iw dev wlan0_ap del

[Install]
WantedBy=hostapd.service

systemctl enable wlan0_ap 之后就可以直接 systemctl start hostapd 来启动了~当然也很容易停止服务:systemctl stop hostapd wlan0_ap。我的 dnsmasq 总是开启的,所以就不用加依赖了。还有 ipv4_forward 我也是早就写到配置文件 /etc/sysctl.d/99-sysctl.conf 里的。

by 依云 at September 13, 2016 04:26 AM

September 10, 2016

百合仙子

Jupyter + matplotlib = ♥

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

matplotlib 是很不错的数据可视化库,然而每次写一个脚本,跑出来看完又回头改,改完再跑,实在是累。所以就有 IPython Notebook 啦,后来改名叫 Jupyter 了,不光支持 Python,还支持 Julia 什么的样子(在下一盘很大的棋呢)。

Arch Linux 用户使用以下命令安装:

sudo pacman -S jupyter-nbconvert jupyter-notebook

我没有装 mathjax 这个包。我就用 MathJax 官方的 CDN 地址好了。所以我的启动命令是这样子:

jupyter notebook --NotebookApp.mathjax_url=https://cdn.mathjax.org/mathjax/latest/MathJax.js

然后界面就会在浏览器里打开啦~

Jupyter notebook 最令我不爽的一点是,它的编辑区用起来很不习惯: 不支持 readline 式快捷键(就是 Emacs / bash 风格那些啦),不支持选中复制、中键粘贴 * 不支持补全

我尝试过配置快捷键,但是还是不太会的样子,好像又没有现成而且可用的代码。

不过它的可视化和交互能力实在是太吸引人了~所以做一些交互式的数据处理时还是用用好了~

这里是演示。(当然只是导出的 HTML 页面~)

by 依云 at September 10, 2016 08:11 AM

如何取消对 WoSign 根证书的信任

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

WoSign 最近曝出一大堆问题,而且其处理问题的态度、解决问题的方式十分令人担忧。其官方形象也很糟糕,比如对国内 Let's Encrypt 用户进行 FUD 式威胁,比如只吊销了因 bug 误发的 GitHub 域名的证书,给某大学误发的证书视若无睹。具体问题有兴趣的可以去相关邮件组查看讨论。

这次问题我认为比起 CNNIC 要严重多了(最主要是这态度、这水准,就算它不主动作恶,也很容易被利用的样子),所以我获知情况之后就取消对了 WoSign 的信任。StartCom 签名 WoSign 的证书,所以需要一并吊销(反正也是一家人)。

火狐(桌面版)

依次打开「首选项」->「高级」->「证书」->「查看证书」,找到并选择 StartCom 和 WoSign 下的所有证书(使用 Shift 键可以选择连续的项目),然后点「编辑信任」按钮,取消弹出框中三个选项框的勾选。

Arch Linux

archlinuxcn 源用户直接执行命令:

sudo pacman -Sy revoke-disputable-ca

手动操作的话,是这样子。把需要取消信任的证书复制(不要软链接)到 /etc/ca-certificates/trust-source/blacklist/ 目录下,然后执行 update-ca-trust 命令即可。

我那个包里取消信任的证书是下边这八个:

CA_WoSign_ECC_Root.pem                    CNNIC_ROOT.pem                          StartCom_Certification_Authority_G2.pem  WoSign_China.pem
Certification_Authority_of_WoSign_G2.pem  StartCom_Certification_Authority.1.pem  StartCom_Certification_Authority.pem     WoSign.pem

Android

在「设置」->「安全」->「受信任的凭据」中禁用掉相关证书。这对 Opera Mobile 有效,但是对火狐无效。

目前还没找到火狐 Android 版禁用根证书的方式。

确认方法

访问 https://www.wosign.com/ 即可。

目前 USTC 已经更改证书,禁用这些根证书不影响 USTC 镜像源的使用。现在我因此不能访问的网站主要是 Python 邮件列表

by 依云 at September 10, 2016 07:39 AM

August 19, 2016

ヨイツの賢狼ホロ

知乎自答两则

farseerfc ,顺便测试一下咱写的 creatissue 脚本 😂😂

懒得加内文里的链接了呢~

使用 Arch Linux 做桌面有何优势和注意事项?

https://www.zhihu.com/question/46322733/answer/101649684

既然是前 Debian Testing 用户,就认为汝有一定的 Linux 发行版使用经验呗~

顺便猜汝问的是“日常使用 Arch Linux”呗.

  1. Arch Linux 有啥特性?

其实 Arch Linux 和其它发行版一样就只是一个发行版呐~然而每一个发行版的生态不一样, Arch 这边信奉的是以 “Keep It Simple, Stupid” 为核心的 Arch 之道啦。哦对了,还有一个名字叫做 Pacman 的软件包管理器。 滚动更新算不算是一个特性咧?

  1. Arch Linux 的优势?

应该是软件更新速度快和(更新时)比较稳定? (可以说都是拜 Arch 的滚动发行版属性所赐呗~)

还有比较完善的 Wiki ~

还有比较完善的 Wiki ~

还有比较完善的 Wiki ~ (重要的话说三遍2333)

Arch compared to other distributions (简体中文) 上有 Arch Linux 和几个发行版的比较,去看下呗~

  1. 安装 Arch Linux 要注意啥?

Beginners' guide (简体中文) 和 Installation guide (简体中文) 都是非常好的参考来源呐~ 按 wiki 的说法,前者适合新安装 Arch Linux 的用户,后者适合有经验的 Linux 用户呗。

  1. 使用 Arch Linux 时要注意啥?

首先要学习如何使用 Arch Linux 的招牌(?) pacman 啦。 Pacman (简体中文) 上有些常用命令,如果汝有使用其它软件包管理器 (例如 Debian 里的 apt)的经验,可以看一下 Pacman/Rosetta , 那里列出了几种不同的软件包管理器的不同命令的比较。

关于各种操作(例如安装各类软件,外观定制,系统维护等等) General recommendations 里有各种操作的索引,去看一下呗~

如果遇到了问题,ArchWiki ,Arch Linux Forums , Arch Linux 中文论坛 和 IRC channels (简体中文) 都是解决问题的合适的地方咯~ (当然要遵守各自的规则啦)

  1. 啥?有人说 Arch Linux 容易滚挂?

到底是从啥时候开始有这个说法的

怎样才能尽量避免archlinux滚挂? - Arch Linux 这里的几个回答非常棒,咱就简单的总结一下呗~

System maintenance (简体中文) 有些系统维护的常见技巧。

大家都认为长期不更新的 Arch Linux 更容易挂……所以至少要记得定期更新一下系统吧~

订阅 Arch Linux 新闻 (邮件列表 arch-announce 或者RSS: https://www.archlinux.org/feeds/news/ )消息不是很频繁,一般是在有重大更新时会提醒大家。

不要在一无所知的情况下打开 [testing] 仓库。如果想打开的话, Arch Linux TU 兼 Developer 成员 @晏然FelixYan 写了篇 Arch Linux [testing] 系列仓库简介 可以参考。

有时 pacman 会提示生成了一些 .pacnew 文件,这是为了避免覆盖一个之前被修改过的已存在文件呐 ,汝最好在更新完毕以后马上合并这些改动啦~(如果不处理,不当的配置可能导致软件功能出问题,甚至完全无法使用。)

不要使用某些 pacman 命令 (例如 --force,但是官方发通告要求这样做时除外~)

最后,手边最好准备一个 Live 环境(万一一不小心把系统搞挂了……)

  1. 最后……

每个人都可以为 Arch Linux 贡献自己的一分力量,如果汝有意愿的话, wiki 上的 Getting involved 页面有各种贡献的途径呐~

还有一件事…… 欢迎来 Arch Linux 中文社区玩! ( IRC 频道 #archlinux-cn @ freenode 是中心,同时还有 Telegram , XMPP,Tox 和 Gitter 多平台联通,可能是第二水的 IRC 中文频道?) 其他平台的加入方式在 IRC 上问问其他人就好啦~

Arch Linux的用户都有理想主义倾向吗?

https://www.zhihu.com/question/49439472/answer/116599094

(话说知乎啥时候能内置水平线标记……)

其实不止 Arch Linux ,几大主流发行版不都是一群有着相同理想主义倾向的用户/开发者们一手构建起来的呗~

Debian :以创建一个自由的类 Unix 操作系统为己任,大部分尽可能的采用自由软件 (后来从 Debian 衍生出的完全自由的发行版 gNewSense 获得了自由软件基金会的赞助 )。

Fedora :和 Debian 同样更多的专注于自由软件。和 Debian 偏向稳定不同, Fedora 的开发者更多的会和上游紧密协作,尽可能的快速推动新技术的应用和完善。

openSUSE:这个咱没用过,只知道他/她/它们做了个很出色的系统配置工具 YaST , 还有能给 openSUSE 和其他各种发行版构建软件包的 Open Build Service (OBS)。 至于 openSUSE 为啥没有其它发行版那么流行的原因,活跃于 openSUSE 社区的苏姐的回答应该解释的比较全面 : openSUSE 的人气为何远不如 Ubuntu 和 Fedora ? - 瑪麗蘇的回答

Gentoo:应该是除了 LFS (Linux From Scratch)以外定制程度最高的 Linux 发行版, 用户可以自由的选择自己喜欢的组件,无论是安装方式,需要的程序, 以至于init 程序( Gentoo 是目前为数不多的不默认采用 Systemd 的 Linux 发行版之一)。 许多用户喜欢的就是 Gentoo 的高度可定制性, 例如 长期使用Arch,Gentoo等滚动更新的发行版是怎样的一种体验? - 李小的回答 和 长期使用Arch,Gentoo等滚动更新的发行版是怎样的一种体验? - ZX Huo 的回答 。

Arch Linux:自称 " a lightweight and flexible Linux® distribution that tries to Keep It Simple." , 一个轻量化,可定制,试图遵循 KISS 原则 ( Keep It Simple, Stupid,对应中文为“保持简单,且一目了然”)的 Linux 发行版。 简洁,现代,实用和以用户为中心构成了 Arch Linux 用户和开发者们一贯共识的 “Arch 之道”(Arch Linux - ArchWiki)

(Ubuntu ?那是啥,好吃吗?啦啦啦……)

关于 Arch Linux 的可定制性,现任 Trusted User 之一的 fc farseer 这么写到:

我自己用 Ubuntu 從 8.04 經歷多次版本升級升到 12.04 ,期間雙系統裝裹 OpenSuSE 和Arch , 然後在 OpenSuSE 上完成了畢業設計(那時候只有suse提供了Xen補丁內核,這是我的畢業設計需要), 之後本科畢業後新臺機直接裝 Arch,現在3年多了一切穩定完好。這 3 年多我經歷了 Arch 從 rc.conf 到 systemd 的轉變, 經歷了 grub legacy 到 grub 2 的轉變,換過好幾個 DE 和 WM 然後現在穩定在 Awesome3.4 兩年多, 系統分區從原本的 ext4 換到過 btrfs 分區然後現在組 btrfs raid1 ,我換過顯卡,換過好幾塊硬盤, 期間滾掛過好幾次然後都修好了,自己作死折騰btrfs壞過也從備份中恢復好了。重要的是這個系統一直活着而且活得很好, pacman.log裏的裝機歷史能一直追溯到3年前裝的第一個包,我知道這裏面只有我需要的包, 只有我做過的配置,發生任何問題我都知道是系統的哪裏的問題。這是 Arch給我的安心感, 是Ubuntu不能給我的。反觀我用Ubuntu的那段時間,每次 dist-upgrade 都要麼立刻掛掉要麼用一段時間掛掉, 要麼就是升級的方案實在太將就然後換新的重裝。都說 debian穩定ubuntu穩定, 而那時的我沒有任何穩定的感覺,那時的我害怕每一個小包的升級,因爲我不知道升級了一個包之後會對別的包造成什麼不可預知的後果。 服務器系統那種有管理員管理的計算機集羣需要的穩定性,和桌面用戶需要的穩定性,在我看來是不同的概念。 我不怕一個升級之後東西壞掉然後需要我花兩個小時找方案把它修好, 但是我怕爲了某個新版本的庫而不得不升級的時候, 整個系統都變得面目全非導致我不得不花兩個小時重裝系統,然後這個全新的系統我不再認識了。

—长期使用Arch,Gentoo等滚动更新的发行版是怎样的一种体验? - fc farseer 的回答

所以嘛,既然选择了滚动更新的发行版,就要学会适应这种快速的变化呗~

另外还有一句,Arch Linux 的滚动更新模型是不支持部分升级的。

https://wiki.archlinux.org/index.php/System_maintenance#Partial_upgrades_are_unsupported

还有,Archer 哪里说要秒杀各大软件公司了啦 ?明明咱们连有多少用户都不怎么在意:

许多 Linux 发行版都试图变得更“用户友好”,Arch Linux 则一直是,永远会是“以用户为中心”。 此发行版是为了满足贡献者的需求,而不是为了吸引尽可能多的用户。 Arch 适用于乐于自己动手的用户,他们愿意花时间阅读文档,解决自己的问题。

报告问题、完善 Wiki 社区文档、为其它用户提供技术支持。 Arch 用户仓库 收集用户贡献的软件包。Arch 开发者都是志愿者,活跃的贡献者很快就能称为开发人员。

不要以偏概全好不好……

by ホロ at August 19, 2016 04:00 PM

August 17, 2016

百合仙子

换域名了

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

如题。域名换成了 blog.lilydjwg.me,别的暂时不变。浏览器访问时会自动跳转到新域名。

请 RSS 订阅读者更新订阅地址。

请网站上有链接到本博客的读者也更新一下旧链接。

我不知道旧域名到底能存在多久。当然也不知道这个网站还会存在多久。总之先把入口拿回来。

by 依云 at August 17, 2016 12:06 PM

August 09, 2016

ヨイツの賢狼ホロ

为MediaWiki安装可视化编辑器

为MediaWiki安装来自 维基媒体基金会可视化编辑器 .

连维基百科都要Hold不住啦~

许多新用户不会着手大幅度修改,而只是做些细节调整,不过仅仅阅读源代码就必须学标记语言了。当我们的用户在演示操作时,这把他们吓走了。

早在 2004 年,社群开始一再认识到必须采用更好的编辑方式。因为人们的请求,更重要的是他们的需要,所以我们开发了可视化编辑器。

Wiki 标记语言让新人害怕,这种程度会随着其他站点的迁离而加剧。如果我们不开发可视化编辑器,那么图表的走势会在接下来五年中变得更加糟糕。

MediaWiki.org

所以他们才 痛定思痛 决定开发可视化编辑器么😂

开始之前-检查一下要求

可视化编辑器(下面就说VisualEditor呗~)还需要一个叫 Parsoid 的程序来承担把wiki标记转化成html的任务啦(看下图)~,所以需要服务器来运行它呐~

Parsoid的工作原理

安装Parsoid(Ubuntu 14+ / Debian 7+ )

上游的指南在这(好好学英语呗~) https://www.mediawiki.org/wiki/Parsoid/Setup

Ubuntu和Debian系统的话直接添加MediaWiki.org的软件源然后通过apt安装就好了啦~

首先添加MediaWiki.org的GPG公钥:

sudo apt-key advanced --keyserver keys.gnupg.net --recv-keys 664C383A3566A3481B942F007A322AC6E84AFDD2

然后添加Parsoid源:

sudo echo "deb https://releases.wikimedia.org/debian jessie-mediawiki main" > /etc/apt/sources.list.d/parsoid.list

安装需要的软件包:

sudo apt-get update && sudo apt-get install curl parsoid

然后看下下面一节的内容修改一下配置文件呗~

其它系统?手动安装呗~

上游的指南在这(还是要好好学英语呗~) https://www.mediawiki.org/wiki/Parsoid/Developer_Setup

首先汝要装上Nodejs(>0.8,建议0.10或更新的版本呐~),还有git. 具体的安装方法为了避免降低正交性 (其实是系统太多不好写......),就麻烦汝自己去找了呐~

「呵。咱是贤狼,不是神呐。如果汝开始会期待起咱能够泄露天机给汝,那咱就得从汝眼前消失了呗。」
node --version # 如果是Debian或Ubuntu ,输入 nodejs --version

然后用git克隆版本库呗~

git clone https://gerrit.wikimedia.org/r/p/mediawiki/services/parsoid

用npm安装上相应的依赖:

npm install

然后看下面一节的内容修改一下配置文件呗~

修改配置文件

如果是通过软件源安装的,配置文件位于 /etc/mediawiki/parsoid/config.yaml

如果是通过git下载的,从parsoid目录中先复制一份样例出来呗~

cp config.example.yaml config.yaml

打开配置文件,找到这一段内容,然后改它~:

mwApis:
    - # This is the only required parameter,
      # the URL of you MediaWiki API endpoint.
      uri: 'http://localhost/w/api.php'
      # The "domain" is used for communication with Visual Editor
      # and RESTBase.  It defaults to the hostname portion of
      # the `uri` property below, but you can manually set it
      # to an arbitrary string.
      domain: 'localhost'  # optional

其中"uri"对应汝的wiki的api.php的位置,"domain"是汝的域名啦~. "prefix"可以自己起一个(反正因为换了API也没用啦~,不过测试时可能用得到) Prefix 真的没了……

启动服务

从软件源安装的?

sudo systemctl start parsoid # Debian Jessie ,用Systemd启动

sudo service parsoid start # Debian Wheezy 或Ubuntu ,用init.d脚本启动.

如果汝不是通过远程访问执行的命令,可以在浏览器上打开 http://localhost:8142 来进行测试.试着加载 http://localhost:8142/汝设置的前缀/汝的wiki上的一个页面 试试呗~

用git安装的?

npm start

或者:

node bin/server.js

可以用screen一类的工具让Parsoid在后台运行~

或者可以自己写一个 Systemd 单元 (听说这样更清真?

咱自己写了一个在这: https://gist.github.com/KenOokamiHoro/44d6e1b20f5bad4a0f56e9e225d2049a

如果汝不是通过远程访问执行的命令,可以在浏览器上打开 http://localhost:8000 来进行测试.试着加载 http://localhost:8000/汝设置的前缀/汝的wiki上的一个页面 试试呗~

修改监听地址便于远程测试

改这一段:

# Allow override of port/interface:
#serverPort: 8000
#serverInterface: '127.0.0.1'

反注释最后一行并改成0.0.0.0,就可以通过 http://服务器的IP地址:8000 访问啦~

安装VisualEditor扩展

上游的指南在这: https://www.mediawiki.org/wiki/Extension:VisualEditor

首先从 这里 获得扩展然后上传到汝的wiki上的extensions目录呗~

然后修改汝的LocalSettings.php:

require_once "$IP/extensions/VisualEditor/VisualEditor.php";

// 反注释下一行来默认启用可视化编辑器
#$wgDefaultUserOptions['visualeditor-enable'] = 1;

// 反注释下一行来启用测试中的功能
#$wgDefaultUserOptions['visualeditor-enable-experimental'] = 1;

//在除了主名字空间以外的名字空间中也启用可视化编辑器(下面的例子是用户名字空间)
$wgVisualEditorNamespaces=array_merge($wgContentNamespaces,array( NS_USER ));

完整的设置选项可以在扩展页面上找到.

然后在汝的wiki上试试看呗~

VisualEditor效果

by ホロ at August 09, 2016 04:00 PM

August 08, 2016

farseerfc

为什么 Linus Torvalds 不愿意将 Linux 变成 GPLv3 授权?

知乎 转载

和上篇文章一样,这篇也是来自一个知乎上我回答的问题。

原问题:为什么 Linus Torvalds 不愿意将 Linux 变成 GPLv3 授权?

我的回答:

这里有段 Linus Torvalds 在 DebConf 14 上的 Q&A: https://youtu.be/1Mg5_gxNXTo?t=47m20s

其中关于 GPLv3 和协议的那一段在47:20开始到57:00左右。 里面 Linus 对自己的观点澄清得很清楚了。 看u2b或者听英语有困难的请留评论,我抽空可以试着翻译一下。

DebConf 14: Q&A with Linus Torvalds

然后接下来就是我承诺的翻译了

Q: Do you agree that you undermine GPLv3? and ...

问:你是否同意说你贬低了 GPLv3 ? 以及……

L: Yes

L: 是的

Q: How can we get you to stop?

问:我们如何才能让你别这么做?

L: What?

L: 什么?

Q: How can we get you to stop?

问:我们如何才能让你别这么做?

L: Oh I hate GPLv3. I undermined it on purpose. I actually thought the GPLv3 extensions were horrible. I understand why people would want to do them but I think it should have been a completely new license.

L: 哦我讨厌 GPLv3 ,我是在故意贬低它。实际上我觉得 GPLv3 的扩展非常可怕。 我能理解为什么人们想要做这个,但是我觉得它本应是一个全新的协议。

Emm my argument for liking version 2, and I still think version 2 is a great license, was that, "I give you source code, you give me your changes back, we are even." Right? That's my take on GPL version 2, right, it's that simple.

嗯我喜欢版本 2 的那些理由,并且我仍然觉得版本 2 是一个非常棒的协议, 理由是:「我给你源代码,你给我你对它的修改,我们就扯平了」 对吧?这是我用 GPL 版本 2 的理由,就是这么简单。

And version 3 extended that in ways that I personally am really uncomfortable with, namely "I give you source code, that means that if you use that source code, you can't use it on your device unless you follow my rules." And to me that's, that's a violation of everything version 2 stood for. And I understand why the FSF did it because I know what the FSF wants. But to me it's not the same license at all.

然后版本 3 的扩展在某些方面让我个人觉得非常不舒服,也就是说「我给你源代码, 这意味着你必须服从我的一些规则,否则你不能把它用在你的设备上。」 对我来说,这是违反了版本 2 协议所追求的所有目的。然而我理解为什么 FSF 要这么做, 因为我知道 FSF 想要达成什么,但是对我来说这完全是不同的协议了。

So I was very upset and made it very clear, and this was months before version 3 was actually published. There was a discussion about this long before... There was an earlier version of version 3, years before actually, where I said "No, this is not gonna fly." And during that earlier discussion I had already added to the kernel that, "Hey, I don't have the version 2 or later". And there was no... And I was really happy then when version 3 came out, that I have done that something like 5 years before, because there was ever never any question about what the license for the kernel was.

所以我当时非常不安,并且表明了自己的观点,并且这是在版本 3 发布的数月之前。 在那很久之前曾经有过一场讨论……在版本 3 之前有一个早期的版本, 事实上几年之前,那时我就说过:「不,这不可能工作」。 并且在那个早期的讨论阶段我已经在内核里写好了「嘿,我可没有写过版本 2 或者更高版本」。所以之后也没有过(争议)……随后版本 3 出来的时候我非常开心, 因为我早在大概 5 年前做了预防,之后也就再也没有过关于内核的协议究竟是哪个 版本的讨论。

But I actually thought that version 3 is ... Uh, no ... I actually think version 3 is a FINE license, right. I'm a firm believer in, "If you write your code, it is your choice to pick a license." And version 3 is a fine license. Version 3 was not a good ... "Here we give you version 2, and then we tried to sneak in these new rules, and tried to force everybody to upgrade." That was the part I disliked. And the FSF did some really sneaky stuff, downright immoral in my opinion.

不过事实上我觉得版本 3 是……呃不……我事实上觉得版本 3 是个 不错 的协议, 对吧。我坚定地相信「如果是你写的代码,那么你有权利决定它应该用什么协议」。 并且版本 3 是个不错的选择。版本 3 不好的地方在……「我们给你了版本 2 ,然后我们试图偷偷混入这些新的规则,并且想逼着所有人都跟着升级」这是我不喜欢版本 3 的地方。并且 FSF 在其中做了很多见不得人的事情,我觉得做得很不道德。

Q: So you are talking about Tivoization?
译注: 关于 Tivoization
Tivoization 是 FSF 发明的一个词,表示 TiVo 的做法。 TiVo 是一个生产类似电视机顶盒之类的设备的厂商,他们在他们的设备中用到了 Linux 内核和很多别的开源组件,并且他们根据 GPLv2 协议开放了他们使用的组件的源代码。 然而他们在他们出售的设备中增加了数字签名,验证正在执行的系统和软件是他们自己 编制的软件,从而限制了用户修改运行软件的自由。这种做法在 FSF 看来是钻了 GPLv2 的法律上的空子,所以 FSF 提出了 GPLv3 封堵这种做法。

问:所以你在说 Tivoization 的事情么?

L: Ehmm, yeah the Tivoization is always my main, eh dislike of version 3. And, the FSF was being very dishonest thing. "Hey, we actually allow you to invalidate the Tivoization clause" and they tried to, they literally lied to people, and say "Hey, so that means that you can use GPLv3 without the Tivoization part", right. This is ... How many people heard this particular statement from the FSF? (Please raise your hands)

L: 没错,Tivoization 的事情一直是我反对版本 3 的主要根据。并且,FSF 在这件事上表现得极不诚实。「嘿,其实我们允许你无效化 Tivoization 条款」,这样他们试图, 应该说他们是在明白着欺骗别人,并且说「嘿,这意味着你可以使用除去 Tivoization 部分的 GPLv3」。 这很……在场的诸位中有谁从 FSF 那儿听过这个说法?(请举手)

Ok, maybe they only tried to convince me with that one. But they did try. And it was like, "I'm not stupid", right. Yes, you can ... The GPLv3 allows you to say "Ok, Tivoization is not an issue for us". But it allows somebody else to take the project, and say "Hey, I ... The GPLv3 without Tivoization is compatible with the full GPLv3, so I will now make my own fork of this, and I will start doing drivers that use the full version of version 3" And where am I stuck then? I am stuck saying "Hey I give you the source code, and now I can't take it back your changes". That's completely against the whole point of the license in the first place.

好吧,或许他们只试过对我用这套说辞,但是他们真的试过。我的反应是「我可不傻」,对吧。是的, 的确你可以…… GPLv3 允许你说「好, Tivoization 的事情对我们来说不是问题」, 但是它同时又允许别人接过这个项目,并且说「嘿,我觉得……去掉了 Tivoization 的 GPLv3 是兼容完整的 GPLv3 的,所以我可以 fork 这个项目,然后我将在自己的 fork 上用完整的 GPLv3 写驱动。」然后我就囧了。我的困境在于说「嘿,我给了你我的源代码,现在我却不能拿回你对它 的修改了」。这是彻底违背了我用这个协议最初的目的了。

So the FSF was, I mean the kind of stuff that was going on behind the scenes, ah, made me once and for all to decide to never had any thing to do with the FSF again. So if you wanted to give money to an organization that does good? Give it to the EFF. The FSF is full of crazy bittered people. That's just mine opinion. Uh, actually I have ... Ah ... I overstated that a bit, right. The FSF has a lot of nice people in it, but some of them are bit too extreme.

所以 FSF 是,我是说那时他们暗地里做的那些事情,让我当下决定永远不再和 FSF 有任何瓜葛。 所以如果你想捐钱给一个行善的组织,那就捐给 EFF 吧。FSF 充满了疯狂难处的人。这只是我的观点。 呃其实我……嗯……我说得有点过分了。FSF 里有很多不错的人,不过其中有些人有点过激。

Q: Well I wish the EFF care more about software freedom. But, uh, can you ... Do you think that Tivoization benefits me as a user somehow?

问: 嗯我也希望 EFF 能更多的关注于软件的自由方面。但是你能……你觉得 Tivoization 这种行为也能在某种方式上让我作为用户获益么?

L: No, no I don't. I mean that ... But that was never my argument. That was not why I selected the GPLv2. This is my whole point. It's not that I think Tivoization is necessarily something that you should strive for. But it is something that in my world view, it's your decision. If you make hardware that locks down the software, that's your decision as a hardware maker. That has no impact on my decision as a software maker to give you the software. Do you see where I am coming from? I don't like the locked down hardware, but at the same time that was never the social contract I intended with Linux.

L: 不,我不觉得。我的意思是……这从来都不是我的论据,这不是我选择了 GPLv2 的理由。 并不是说我觉得 Tivoization 是某种值得你去争取的权利,而是说在我的世界观中,这是你的决定。 如果你生产硬件去锁住了其中的软件,这是你作为一个硬件提供者的决定。 这完全不影响我作为一个软件提供者给你软件的决定。你能看出我的立场在哪儿了么? 我不喜欢上锁的硬件,但是同时这也从来不是我想要给 Linux 加上的的社会契约。

To me, umm, I mean, people may or may not realize GPLv2 wasn't even the first license for Linux. To me the important part was always "I give you software, you can do whatever you want with it. If you making improvements, you have to give them back." That was the first version of the license. It also had a completely broken clause which was completely insane and I was stupid. Hey it happened. My origin license says that you can't make money change hands. And that was a mistake. That was clearly just wrong and bad because it really didn't have anything to do with what I wanted. But I was young, I was poor, I didn't realize that the whole money thing wasn't the important part. And I have saw the errors in my ways, I saw the GPLv2 and said "Hey, that's the perfect license". And I saw the GPLv3 and I said "No, that's overreaching a lot, that's not what I wanted". And so I made Linux GPLv2 only, right.

对我来说,呃我想说,大家可能知道或者不知道, GPLv2 并不是 Linux 的最初的协议。 对我来说重要的部分一直是「我给你软件,你可以用它做任何你想要做的事情。如果你做了任何改进, 你需要把它交还给我。」这是协议最初的样子。最早的协议还有一条完全错误的条款,写得完全不合理, 那时我很傻。嘿我也傻过。我最初的协议说你不能用它赚钱。这是失策,这明显是不对的不好的, 因为它和我真正想要做的事情没有任何关系。但是那时我很傻很天真, 我没意识到钱的事情在其中完全不重要。然后我发现了其中的问题,我看到了 GPLv2 然后说「嘿, 这是个完美的协议」。然后我看到了 GPLv3 我说「不,这做得过分了,这不是我想要的」 所以我让 Linux 成为了仅限 GPLv2 ,对吧。

Q: So do you think getting the patches back is as useful even if you can't modify the device that it is used on?

问: 所以你是否认为,即使你不能修改跑着这个软件的设备,拿回对软件的修改也还是同样重要的?

L: Yeah, absolutely. And I mean TiVo itself is actually an example of this. Their patches were kind of crafty but I mean they were basically running on a, originally a fairly standard MIPS thing. And their patches were working around bugs in the chipsets they used. And they were valid patches. The fact that they then felt that their hardware had to be locked down someway. I didn't like it. But as I have mentioned, I felt that that was their decision.

L: 是的,当然。我想说 TiVo 它自己实际上就是一个例子。他们的修改有点复杂,但是我想说他们基本 是,一开始基本是运行在一套相当标准的 MIPS 设备上。然后他们的修改是想绕开他们用到的芯片上的 一些问题,并且这些是合格的修改。之后的事情是他们觉得他们需要锁住他们的硬件,我不喜欢这个。 但是就像我已经说的,我觉得这是他们的决定。

And they had real reasons for that. That's something people sometimes missed. There are sometimes reasons to do what TiVo did. Sometimes it's imposed on you by, wireless carriers. Sometimes it's imposed on you by Disney. Uh sometimes it's imposed on you by laws. The GPLv3 actually accepts the last one when it comes to things like medical equipment I think. But the point is that the whole Tivoization thing is, sometimes it's, there is a reason for it. And if you make ... I mean I am not a hardware designer. I think FPGA and stuff like that is really cool. But I always ... I mean I really don't want to impose my world view on anybody else. You don't have to use Linux. If you do use Linux, the only thing I asked for is source code back. And there is all these other verbiages in the GPLv2 about exact details, those aren't important. And that was always my standpoint.

并且他们有真正的理由去这么做。这是有时人们忽视的地方。有时是真的有理由去做 TiVo 他们做的事情。有时强加给你这种限制的是,无线运营商。有时强加给你的是迪士尼。 有时强加给你限制的甚至是法律。 GPLv3 在医疗设备之类的场合其实允许最后一种情况,我记得。 我的观点是,整个 Tivoization 的事情有时是有理由去这么做的。如果你生产…… 我是说我不是硬件设计者,我觉得 FPGA 之类的东西很酷,但是我……我的意思是我真的不想把我对世界的 看法强加给别人。你不是非得要用 Linux ,如果你想要用 Linux ,那么我唯一要求你做的事情是把源代码(变更)还给我。然后在 GPLv2 中还有很多繁文缛节规定了详细的细节,这些都不重要。这是我一直以来的观点。

Q: Ok, well I will stop my non-point of making noise now.
译注: 关于 ISC 协议
ISC 协议是一个开源软件协议,和两句的 BSD 协议功能相同。OpenBSD 项目选择尽量用 ISC 协议公开他们新写的代码。

问: 好吧那我就不浪费时间了。

L: I mean don't get me ... I mean I like other licenses too. I have used like the four, emmm... Which BSD license is the acceptable one? One of the BSD license is actually really nice. And it's actually the... What?

L: 我的意思是别误解……我也喜欢别的协议。我用过……到底是哪个 BSD 协议是可以接受的? 有一个 BSD 协议实际上非常不错。它实际上是……什么?

A: ISC

观众: ISC

L: ISC? And I actually encourage people who don't care about the giving code back but care about the "Hey, I did something cool, please use it". I encourage people to use the BSD license for that. And I mean the BSD license is wonderful for that. It so happens that I thought that for my project the giving back is equally important so I, for me BSD is bad. But the point is for me. The GPLv3 maybe the perfect license for what you guys want to do. And that's fine. And then it's the license you should use. It's just that when somebody else wrote the code you don't get that choice.

L: ISC?并且事实上我在鼓励那些不在意拿回修改但是在意「嘿,我做了一个很酷的东西,请用它」。 我鼓励这些人去用 BSD 协议做这些事情。我想说 BSD 协议在这种场合是完美的。 只是碰巧我觉得对于我的项目,拿回修改也同样重要,所以对我而言 BSD 不好。但是重点是 对我而言 。 GPLv3 可能对你们想要做的事情而言是完美的协议,这很好,并且这时你就应该去用 GPLv3 。只是当代码是别人写的时候,你没有这个选择权。

by farseerfc at August 08, 2016 07:15 AM

August 07, 2016

farseerfc

C语言中“.”与“->”有什么区别?

知乎 转载

转载几篇知乎上我自己的回答,因为不喜欢知乎的排版,所以在博客里重新排版一遍。

原问题:C语言中“.”与“->”有什么区别?

除了表达形式有些不同,功能可以说完全一样阿。那为何又要构造两个功能一样的运算符? 效率有差异?可是现在编译器优化都那么强了,如果真是这样岂不是有些多此一举


刚刚翻了下书,说早期的C实现无法用结构直接当作参数在函数间传递,只能用指向结构的指针在函数间进行传递!我想这应该也是最直观的原因吧。

我的回答

首先 a->b 的含义是 (*a).b ,所以他们是不同的,不过的确 -> 可以用 * . 实现,不需要单独一个运算符。 嗯,我这是说现代的标准化的 C 语义上来说, -> 可以用 * . 的组合实现。

早期的 C 有一段时间的语义和现代的 C 的语义不太一样。

稍微有点汇编的基础的同学可能知道,在机器码和汇编的角度来看,不存在变量,不存在 struct 这种东西,只存在寄存器和一个叫做内存的大数组。

所以变量,是 C 对内存地址的一个抽象,它代表了一个位置。举个例子,C 里面我们写:

a = b

其实在汇编的角度来看更像是

*A = *B

其中 A 和 B 各是两个内存地址,是指针。

好,以上是基本背景。

基于这个背景我们讨论一下 struct 是什么,以及 struct 的成员是什么。 假设我们有

struct Point {
        int x;
        int y;
};
struct Point p;
struct Point *pp = &p;

从现代语义上讲 p 就是一个结构体对象, x y 各是其成员,嗯。

从汇编的语义上讲, p 是一个不完整的地址,或者说,半个地址,再或者说,一个指向的东西是虚构出来的地址。而 x y 各是在 Point 结构中的地址偏移量。也就是说,必须有 p x 或者 p y 同时出现,才形成一个完整的地址,单独的一个 p 没有意义。

早期的 C 就是在这样的模型上建立的。所以对早期的 C 而言, *pp 没有意义,你取得了一个 struct ,而这个 struct 不能塞在任何一个寄存器里,编译器和 CPU 都无法表达这个东西。

这时候只有 p.x p.y 有意义,它们有真实的地址。

早期的 C 就是这样一个看起来怪异的语义,而它更贴近机器的表达。 所以对早期的 C 而言,以下的代码是对的:

p.x = 1;
int *a;
a = &(p.x);

而以下代码是错的:

(*pp).x = 1;

因为作为这个赋值的目标地址表达式的一部分, *pp ,这个中间结果没法直译到机器码。

所以对早期的 C 而言,对 pp 解引用的操作,必须和取成员的偏移的操作,这两者紧密结合起来变成一个单独的操作,其结果才有意义。

所以早期的 C 就发明了 -> ,表示这两个操作紧密结合的操作。于是才能写:

pp->x = 1;

嗯,这就是它存在的历史原因。 而这个历史原因现在已经不重要了,现代的符合标准的 C 编译器都知道 (*pp).x pp->x 是等价的了。

说句题外话, C++ 里面还发明了 .* ->* 这两个运算符(注意 ->* 不是单独的 -> * 并排放的意思),关于为什么要发明这两个运算符,而不能直接说 a ->* b 的意思就是 a ->(*b) ,这个就作为课堂作业吧。

by farseerfc at August 07, 2016 03:02 PM

启用 GitHub Issue 作为博客留言系统

从今天起本博客将启用 GitHub Issue 作为留言系统。 原本使用的 Disqus 将继续保留一段时间,目前没有关闭的计划。

换用 GitHub Issue 是计划了好久的事情了,最初重做这个主题的时候就有考虑过。 这个想法的契机是看到了这篇 GitHub hosted comments for GitHub hosted blogs ,然后立马觉得这个想法很符合寄宿在 GitHub Pages 上的博客。 一个限制是要求评论者必须有 GitHub 账户,考虑到我的博客的受众这个要求估计不算太过分。 使用 GitHub Issue 的好处么,比如自带的 GFMD 富文本格式,邮件通知,还有订阅和取消订阅通知,邮件回复, 这些方面都不比第三方留言系统逊色。

换用 GitHub Issue 另一方面原因是最近听说 Disqus 被部分墙了,想必以后墙也会越来越高。之前曾经试过在这个博客换上多说, 然而效果我并不喜欢,多说喜欢侵入页面加很多奇怪的东西,比如用户的头像通常是 http 的……也试过结合新浪微博的评论,而新浪微博越来越封闭,API 也越来越不靠谱。

使用 GitHub Issue 作为评论的方式比较简单,上面那篇博客里面提到了,代码量不比 加载 Disqus 多多少,而且没有了 iframe 的困扰,唯一麻烦的地方就是要稍微设计一下布局方式让它融入 现有的页面布局。 我参考上面的实现在这里 。 这个加载代码使用两个变量加载 Issue Comments ,一个是在 pelicanconf.py 里的 GITHUB_REPO ,可以指向任何 Repo ,我指向 farseerfc/farseerfc.github.io 的这个 GitHub Page repo ,另一个变量是每篇文章里需要加上 issueid 的元数据,关连文章到每个 Issue 上。

还有一个稍微麻烦的事情是现在每写一篇文章之后都要新建一个 issue 了。 手动操作有点累人,于是我 写了个脚本 自动搜索 pelican 的 content 文件夹里面文章的 slug 并且对没有 issueid 关连的 文章创建 issue 。

好啦新的留言系统的外观样式还在测试中,希望大家多留言帮我测试一下!

2016年8月7日19:30更新

新增了对 GitHub Issue comments 里面 reactions 的支持,套用 font-awesome 的图标(似乎没 GitHub 上的图标好看)。这个还属于 GitHub API 的实验性功能,要加入 Accept: application/vnd.github.squirrel-girl-preview HTTP 头才能拿到。

2016年8月7日23:16更新

感谢 @iovxw 的测试让我发现 github 的高亮回复和邮件回复是需要特殊处理的。 高亮回复用上了 这里的 CSS 邮件引言的展开事件直接用 jQuery 做了:

    $(".email-hidden-toggle > a").on("click", function (e){
  e.preventDefault();
  $(".email-hidden-reply", this.parent).toggle();
});

还得注意邮件的回复需要 CSS 里面 white-space: pre-wrap

by farseerfc at August 07, 2016 07:28 AM

August 06, 2016

中文社区新闻

TeXLive 2016 系列包发布

TeXLive 相关包已经更新到 2016 版。

最显著的变化是 biber 工具现在作为独立的包提供。 你可以用 pacman 像往常一样安装它。

现在 TeXLive 系列包会使用 Pacman 挂钩(Hook)升级了,所以它将比去年少一些输出。

by farseerfc at August 06, 2016 06:50 PM

August 05, 2016

ヨイツの賢狼ホロ

从零开始的 GnuPG 学习笔记 [0] - PGP,GPG 等相关概念扫盲

GnuPG 密钥从创建到注销,顺便丢一只雷姆 (雾 [1]

[1]雷姆(レム/Rem)是动画 「Re:从零开始的异世界生活 」(日文:Re:ゼロから始める異世界生活)的角色之一。

为啥需要密码学技术?

对于计算机的使用后果,没人比乔治·奥威尔在《1984》中的预言错得更离谱了。到目前为止,计算机创造的几乎所有实际的可能性空间都表明,计算机是权威的终结而非权威的开始。

—《失控》

在计算机和互联网的领域,自由和开放大概是主流。那些试图管制和封闭互联网的方法几乎都失败了呗~

类似 TorI2p 一类的匿名网络访问工具正被无数人(可能汝也是其中之一😋)用来因为各种原因隐藏自己的身份。 而类似 ZeroNet 的新兴软件更多的用到了 Bitorrent 一类的分布式技术。

而这些工具要如何安全的进行数据交换呢,就需要用到各种密码学技术了呐, 其实在上网的过程中,汝已经不知不觉的和各种密码学技术打交道了呢~

  • 在浏览各种 https:// 网站 (例如咱这里)时,汝的浏览器会和网站的服务器进行认证来保证汝要访问的服务器真的是这个网站所使用的服务器呐~
  • 在登录到各类网络服务时,总不能明文(就是按原样)传输汝的个人信息(其中可能会有汝的密码哦)吧?这时就需要客户端和服务器约定一种相互理解的方法来加密/解密各类数据呗~
  • ……

而各类密码学技术和工具正是帮助汝在这个无法完全(或是根本不能)信任的互联网中相对安全的传递数据的帮手咯~

好啦好啦……其实咱并不是密码学专家啦😋

PGP,OpenPGP 和 GPG(GnuPG)都是些啥玩意?

(啥,汝到现在连这三个词都没听说过?😂😂)

良好隐私密码法(英语:Pretty Good Privacy,缩写为PGP),一套用于讯息加密、验证的应用程序,采用IDEA的散列算法作为加密与验证之用。

PGP的主要开发者是菲尔·齐默尔曼(Phil Zimmermann)。齐默曼于1991年将PGP在互联网上免费发布。

后来,PGP 被 Symantec 公司收购成为了商业软件。

OpenPGP 是一套标准,大多数 PGP 软件(例如 GnuPG)都遵循这一标准。

GNU Privacy Guard(GnuPG或GPG)是一种加密软件,它是PGP加密软件的满足GPL的替代物。GnuPG依照由IETF订定的OpenPGP技术标准设计。GnuPG用于加密、数字签名及产生非对称匙对的软件。

GnuPG是自由软件基金会的GNU计划的一部分,目前受德国政府资助。以GNU通用公共许可证第三版授权。

而大多数 Linux 发行版中内置(或者在软件仓库中)的应该都是 GnuPG 啦。汝可以在终端里输入 gpg --version 来查看一下版本呗~(如果已经安装了的话)

#咱的 gpg --version 大概像这样,某些发行版(例如 Ubuntu )里可能还会有 gpg2~
gpg (GnuPG) 2.1.14
libgcrypt 1.7.2
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /home/horo/.gnupg
支持的算法:
公钥:RSA, ELG, DSA, ECDH, ECDSA, EDDSA
对称加密:IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256,
    TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256
散列:SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
压缩:不压缩, ZIP, ZLIB, BZIP2

GnuPG 的作用是?

至少咱自己经历过的作用有这两种呗~

  • 签名

    用来证明这个文件是某个人创建的,而且在到达汝的过程中没有被篡改呗~

    大部分 Linux 发行版的软件包管理器已经用上这个用途了呐~ (所以咱推测 gpg 应该已经安装在汝的系统上了呗~)

  • 加密

    在某处用汝自己的密钥对加密某些文字,或是文件。然后传输到某个地方以后再使用汝自己的密钥对解密这些内容,在传输的过程中,如果私钥不泄露的话,其他人只会看到约等于无意义的乱码而已呐~

然后请允许咱从维基百科上抄一张图下来😂😂

PGP 加密/解密的原理图

于是这另一个新坑就挖好了呢(雾😂😂,下次就文字直播生成一个汝自己的密钥对好啦~

by ホロ at August 05, 2016 04:00 PM

July 31, 2016

中文社区新闻

test-sec-flags: 需要协助

基于在 arch-general 邮件列表中的讨论, pid1 在 anthraxx, strcat, sangy, rgacogne 等人的帮助下创建了 test-sec-flags 项目用于测试诸多面向安全方面的编译和链接选项对于性能的影响。这个项目的目的是为了决定这些编译选项是否适合作为所有 Arch Linux 包打包时候的默认选项。我们的早期测试显示和我们目前使用的编译选项相比这些新的编译选项的性能损失几乎可以认为不存在,不过在进一步推进之前我们希望收集更多测试数据帮助判断。

请下载这里的源代码,根据 README 的提示安装和使用。在 results 子目录中关于如何从测试结果文件中提取需要的统计信息。

我们在 Github 的 test-sec-flags Wiki 页收集测试结果,请将你的测试结果添加到这里。特别的,我们非常期望看到 i686 的结果,因为之前的志愿者测试全部基于 x86_64 设备。

我们也欢迎改进补丁。

by farseerfc at July 31, 2016 11:20 AM

July 30, 2016

farseerfc

PacVis: 可视化 pacman 本地数据库

PacVis
Demo of PacVis

我为什么要做 PacVis

我喜欢 Arch Linux ,大概是因为唯有 Arch Linux 能给我对整个系统「了如指掌」的感觉。 在 Arch Linux 里我能清楚地知道我安装的每一个包,能知道系统里任何一个文件是来自哪个包, 以及我为什么要装它。或许对 Debian/Fedora/openSUSE 足够熟悉了之后也能做到这两点, 不过他们的细致打包的结果通常是包的数量比 Arch 要多个 3 到 10 倍,并且打包的细节也比 Arch Linux 简单的 PKGBUILD 要复杂一个数量级。

每一个装过 Arch Linux 的人大概都知道,装了 Arch Linux 之后得到的系统非常朴素,按照 ArchWiki 上的流程一路走下来的话,最关键的一条命令就是 pacstrap /mnt base , 它在 /mnt 里作为根调用 pacman -S base 装上了整个 base 组, 然后就没有然后了。这个系统一开始空无一物,你需要的任何东西都是后来一点点用 pacman 手动装出来的,没有累赘,按你所需。

然而时间长了,系统中难免会有一些包,是你装过用过然后忘记了, 然后这些包就堆在系统的角落里,就像家里陈年的老家具,占着地,落着灰。虽然 pacman -Qtd 能方便地帮你找出所有 曾经作为依赖被装进来,而现在不被任何包依赖 的包,但是对于那些你手动指定的包, 它就无能为力了。

于是我就一直在找一个工具能帮我梳理系统中包的关系,方便我:

  1. 找出那些曾经用过而现在不需要的包
  2. 找出那些体积大而且占地方的包
  3. 厘清系统中安装了的包之间的关系

关于最后一点「厘清包的关系」,我曾经看到过 macOS 系统架构图 和 Android 的系统架构图,对其中的层次化架构印象深刻,之后就一直在想,是否能画出现代 Linux 桌面系统上类似的架构图呢?又或者 Linux 桌面系统是否会展现完全不同的样貌? 从维基百科或者别的渠道能找到 Linux 内核、或者 Linux 图形栈, 或者某个桌面环境的架构,但是没有找到覆盖一整个发行版的样貌的。 于是我便想,能不能从包的依赖关系中自动生成这样一张图呢。

PacVis的老前辈们

在开始写 PacVis 之前,我试过一些类似的工具,他们都或多或少能解决一部分我的需要, 又在某些方面有所不足。这些工具成为了 PacVis 的雏形,启发了 PacVis 应该做成什么样子。

pactree

pactree 曾经是一个 独立的项目 ,现在则是 pacman 的一部分 了。 从手册页可以看出, pactree 的输出是由某个包开始的依赖树。 加上 --graph 参数之后 pactree 还能输出 dot 格式的矢量图描述,然后可以用 dot 画出依赖图:

pactree pacvis-git -d3 --graph | dot -Tpng >pacvis-pactree.png
pactree --graph
$ pactree pacvis-git -d3
pacvis-git
├─python-tornado
│ └─python
│   ├─expat
│   ├─bzip2
│   ├─gdbm
│   ├─openssl
│   ├─libffi
│   └─zlib
├─pyalpm
│ ├─python
│ └─pacman
│   ├─bash
│   ├─glibc
│   ├─libarchive
│   ├─curl
│   ├─gpgme
│   ├─pacman-mirrorlist
│   └─archlinux-keyring
└─python-setuptools
  └─python-packaging
    ├─python-pyparsing
    └─python-six
 $ pactree pacvis-git -d3 --graph | dot -Tpng >pacvis-pactree.png

从画出的图可以看出,因为有共用的依赖,所以从一个包开始的依赖关系已经不再是一棵 图论意义上的树(Tree) 了。最初尝试做 PacVis 的早期实现的时候,就是试图用 bash/python 脚本解析 pactree 和 pacman 的输出,在 pactree 的基础上把整个系统中所有安装的包全都包含到一张图里。 当然后来画出的结果并不那么理想,首先由于图非常巨大,导致 dot 的自动布局要耗费数小时,最后画出的图也过于巨大基本上没法看。

然而不得不说没有 pactree 就不会有 PacVis ,甚至 pacman 被分离出 alpm 库也和 pactree 用 C 重写的过程有很大关系,而 PacVis 用来查询 pacman 数据库的库 pyalpm 正是 alpm 的 Python 绑定。因为 pactree 的需要而增加出的 alpm 库奠定了 PacVis 实现的基石。

pacgraph

pacgraph 的输出
pacgraph

pacgraph 是一位 Arch Linux 的 Trusted User keenerd 写的程序,和 PacVis 一样也是用 Python 实现的。 比起 pactree , pacgraph 明显更接近我的需求,它默认绘制整个系统的所有安装包, 并且用聪明的布局算法解决了 dot 布局的性能问题。

pacgraph 的输出是一个富有艺术感的依赖图,图中用不同的字体大小表示出了每个包占用 的磁盘空间。通过观察 pacgraph 的输出,我们可以清楚地把握系统全局的样貌, 比如一眼看出这是个桌面系统还是个服务器系统,并且可以很容易地发现那些占用磁盘空间 巨大的包,考虑清理这些包以节约空间。

更棒的是 pacgraph 还提供了一个交互性的 GUI 叫做 pacgraph-tk ,显然通过 tk 实现。 用这个 GUI 可以缩放观察整幅图的细节,或者选中某个包观察它和别的包的依赖关系。

pacgraph 还支持通过参数指定只绘制个别包的依赖关系,就像 pactree 那样。

不过 pacgraph 也不是完全满足我的需要。如我前面说过,我希望绘制出的图能反应 这个发行版的架构面貌 ,而 pacgraph 似乎并不区别「该包依赖的包」和「依赖该包的包」 这两种截然相反的依赖关系。换句话说 pacgraph 画出的是一张无向图, 而我更想要一张有向图,或者说是 有层次结构的依赖关系图

于是就有了 PacVis

PacVis 刚打开的样子
PacVis on startup

总结了老前辈们的优势与不足,我便开始利用空余时间做我心目中的 PacVis 。 前后断断续续写了两个月,又分为两个阶段,第一阶段做了基本的功能和雏形, 第二阶段套用上 https://getmdl.io/ 的模板,总算有了能拿得出手给别人看的样子。

于是乎前两天在 AUR 上给 pacvis 打了个 pacvis-git 包,现在想在本地跑 pacvis 应该很方便了,用任何你熟悉的 aurhelper 就可以安装,也可以直接从 aur 下载 PKGBUILD 打包:

~$ git clone aur@aur.archlinux.org:pacvis-git.git
~$ cd pacvis-git
~/pacvis-git$ makepkg -si
~/pacvis-git$ pacvis
Start PacVis at http://localhost:8888/

按照提示说的,接下来打开浏览器访问 http://localhost:8888/ 就能看到 PacVis 的样子了。仅仅作为尝试也可以直接打开跑在我的服务器上的 demo: https://pacvis.farseerfc.me/ ,这个作为最小安装的服务器载入速度大概比普通的桌面系统快一点。

在 Windows msys2 跑 PacVis
PacVis on Windows msys2

另外补充一下,因为 PacVis 只依赖 pyalpm 和 tornado ,所以在别的基于 pacman 的系统上跑它应该也没有任何问题,包括 Windows 上的 msys2 里(尽管在 msys2 上编译 tornado 的包可能要花些功夫)。

PacVis 的图例和用法

操作上 PacVis 仿照地图程序比如 Google Maps 的用法,可以用滚轮或者触摸屏的手势 缩放、拖拽,右上角有个侧边栏,不需要的话可以点叉隐藏掉,右下角有缩放的按钮和 回到全局视图的按钮,用起来应该还算直观。

PacVis showing pacvis-git

pacvis-git 包的依赖

先解释图形本身,整张图由很多小圆圈的节点,以及节点之间的箭头组成。 一个圆圈就代表一个软件包,而一条箭头代表一个依赖关系。缩放到细节的话, 能看到每个小圆圈的下方标注了这个软件包的名字,鼠标悬浮在圆圈上也会显示响应信息。 还可以点开软件包,在右侧的边栏里会有更详细的信息。

比如图例中显示了 pacvis-git 自己的依赖,它依赖 pyalpm, python-tornado 和 python-setuptools ,其中 pyalpm 又依赖 pacman 。图中用 紫色 表示手动安装的包, 橙色 表示被作为依赖安装的包, 箭头的颜色也随着包的颜色改变。

值得注意的是图中大多数箭头都是由下往上指的,这是因为 PacVis 按照包的依赖关系做 了拓扑排序,并且给每个包赋予了一个拓扑层级。比如 pacvis-git 位于 39 层,那么它依赖的 pyalpm 就位于 38 层,而 pyalpm 依赖的 pacman 就位于 37 层。根据层级关系排列包是 PacVis 于 pacgraph 之间最大的不同之处。

除了手动缩放, PacVis 还提供了搜索框,根据包名快速定位你感兴趣的包。 以及在右侧边栏中的 Dep 和 Req-By 等页中,包的依赖关系也是做成了按钮的形式, 可以由此探索包和包之间的关联。

最后稍微解释一下两个和实现相关的参数:

Max Level

这是限制 PacVis 载入的最大拓扑层。系统包非常多的时候 PacVis 的布局算法会显得很慢,限制层数有助于加快载入,特别是在调试 PacVis 的时候比较有用。

Max Required-By

这是限制 PacVis 绘制的最大被依赖关系。稍微把玩一下 PacVis 就会发现系统内绝大多数 的包都直接依赖了 glibc 或者 gcc-libs 等个别的几个包,而要绘制这些依赖的话会导致 渲染出的图中有大量长直的依赖线,不便观察。于是可以通过限制这个值,使得 PacVis 不绘制被依赖太多的包的依赖关系,有助于让渲染出的图更易观察。

从 PacVis 能了解到的一些事实

一个 KDE 桌面的 PacVis 结果全图, 放大(17M)
A normal KDE desktop in PacVis

稍微玩一下 PacVis 就能发现不少有趣现象,上述「绝大多数包依赖 glibc 」就是一例。 除此之外还有不少值得玩味的地方。

依赖层次

系统中安装的包被明显地分成了这样几个层次:

  • glibc 等 C 库
  • Bash/Perl/Python 等脚本语言
  • coreutils/gcc/binutils 等核心工具
  • pacman / systemd 等较大的系统工具
  • gtk{2,3}/qt{4,5} 等 GUI toolkit
  • chromium 等 GUI 应用
  • Plasma/Gnome 等桌面环境

大体上符合直观的感受,不过细节上有很多有意思的地方,比如 zsh 因为 gdbm 间接依赖了 bash,这也说明我们不可能在系统中用 zsh 完全替代掉 bash。 再比如 python (在 Arch Linux 中是 python3)和 python2 和 pypy 几乎在同一个拓扑层级。

zsh depends on bash because of gdbm

zsh 因为 gdbm 间接依赖了 bash

不过偶尔显示的依赖层级不太符合直观,比如 qt5-base < qt4 < gtk2 < gtk3 。 qt5 因为被拆成了数个包所以比 qt4 更低级这可以理解,而 gtk 系比 qt 系更高级这一点是很多人(包括我)没有预料到的吧。

循环依赖

有些包的依赖关系形成了循环依赖,一个例子是 freetype2 和 harfbuzz,freetype2 是绘制字体的库,harfbuzz 是解析 OpenType 字形的库,两者对对方互相依赖。 另一个例子是 KDE 的 kio 和 kinit,前者提供类似 FUSE 的资源访问抽象层, 后者初始化 KDE 桌面环境。

freetype2 harfbuzz

freetype2 和 harfbuzz 之间的循环依赖

因为这些循环依赖的存在,使得 PacVis 在实现时不能直接拓扑排序,我采用环探测 算法找出有向图中所有的环,并且打破这些环,然后再使用拓扑排序。 因此我在图中用红色的箭头表示这些会导致环的依赖关系。

有些包没有依赖关系

PacVis Level 0

man-pages 和 licenses 没有依赖关系

有些包既不被别的包依赖,也不依赖别的包,而是孤立在整张图中,比如 man-pages 和 licenses 。这些包在图中位于最顶端,拓扑层级是 0 ,我用 蓝色 正方形特别绘制它们。

只看依赖关系的话 Linux 内核完全不重要

所有用户空间的程序都依赖着 glibc ,而 glibc 则从定义良好的 syscall 调用内核。 因此理所当然地,如果只看用户空间的话, glibc 和别的 GNU 组件是整个 GNU/Linux 发行版的中心,而 Linux 则是位于依赖层次中很深的位置,甚至在我的 demo 服务器上 Linux 位于整个图中的最底端,因为它的安装脚本依赖 mkinitcpio 而后者依赖了系统中的众多组件。

pacman -Qtd 不能找到带有循环依赖的孤儿包

pacman -Qtd cannot find packages with circle dependency

msys2 中带有循环依赖的孤儿包

这是我在 msys2 上测试 PacVis 的时候发现的,我看到在渲染的图中有一片群岛, 没有连上任何手动安装的包。这种情况很不正常,因为我一直在我的所有系统中跑 pacman -Qtd 找出孤儿包并删掉他们。放大之后我发现这些包中有一条循环依赖, 这说明 pacman -Qtd 不能像语言的垃圾回收机制那样找出有循环依赖的孤儿包。

PacVis 的未来

目前的 PacVis 基本上是我最初开始做的时候设想的样子,随着开发逐渐又增加了不少功能。 一些是迫于布局算法的性能而增加的(比如限制层数)。

今后准备再加入以下这些特性:

  1. 更合理的 optdeps 处理。目前只是把 optdeps 关系在图上画出来了。
  2. 更合理的 依赖关系抉择 。有时候包的依赖关系并不是直接根据包名,而是 provides 由一个包提供另一个包的依赖。目前 PacVis 用 alpm 提供的方式抉择这种依赖,于是这种关系并没有记录在图上。
  3. 目前的层级关系没有考虑包所在的仓库 (core/extra/community/...) 或者包所属的组。 加入这些关系能更清晰地表达依赖层次。
  4. 目前没有办法只显示一部分包的关系。以后准备加入像 pactree/pacgraph 一样显示部分包。

如果你希望 PacVis 出现某些有趣的用法和功能,也 请给我提 issue

by farseerfc at July 30, 2016 06:52 PM

July 24, 2016

ヨイツの賢狼ホロ

一瞥 Arch Linux 中的 filesystem 软件包

闲来无事,然后就没有然后啦😂

动机?

今天看了看知乎上的某个问题: 长期使用Arch,Gentoo等滚动更新的发行版是怎样的一种体验?

好几个 Arch Linux 用户都是在一开始列出了 /var/log/pacman.log 的第一行,用的是 head 命令。

# 咱没有各位的历史悠久啦~
$ head -1 /var/log/pacman.log
[2014-11-18 19:37] installed filesystem (2014.10-1)

然后这个 filesystem 是啥咧?

然后 farseerfc 这么写到:

pacman -Ql filesystem 看下它都有什麼唄。 這個包就是提供最基礎的 Arch Linux 的目錄結構和一些不屬於任何別的包的配置文件。 這樣 Arch Linux 裏面任何系統文件都在 pacman 管轄範圍內了。

嗯……😋

😋 开始行动

那就首先照着 fc 的写法来一遍呗~

[horo@yoitsu-surfacebook ~]$ pacman -Ql filesystem
filesystem /bin
filesystem /boot/
filesystem /dev/
filesystem /etc/
filesystem /etc/arch-release
filesystem /etc/crypttab
filesystem /etc/fstab
filesystem /etc/group
filesystem /etc/gshadow
filesystem /etc/host.conf
filesystem /etc/hosts
filesystem /etc/issue
filesystem /etc/ld.so.conf
filesystem /etc/ld.so.conf.d/
filesystem /etc/motd
filesystem /etc/mtab
filesystem /etc/nsswitch.conf
filesystem /etc/passwd
filesystem /etc/profile
filesystem /etc/profile.d/
filesystem /etc/profile.d/locale.sh
filesystem /etc/resolv.conf
filesystem /etc/securetty
filesystem /etc/shadow
filesystem /etc/shells
filesystem /etc/skel/
filesystem /home/
filesystem /lib
filesystem /lib64
filesystem /mnt/
filesystem /opt/
filesystem /proc/
filesystem /root/
filesystem /run/
filesystem /sbin
filesystem /srv/
filesystem /srv/ftp/
filesystem /srv/http/
filesystem /sys/
filesystem /tmp/
filesystem /usr/
filesystem /usr/bin/
filesystem /usr/include/
filesystem /usr/lib/
filesystem /usr/lib/modprobe.d/
filesystem /usr/lib/modprobe.d/usb-load-ehci-first.conf
filesystem /usr/lib/os-release
filesystem /usr/lib64
filesystem /usr/local/
filesystem /usr/local/bin/
filesystem /usr/local/etc/
filesystem /usr/local/games/
filesystem /usr/local/include/
filesystem /usr/local/lib/
filesystem /usr/local/man/
filesystem /usr/local/sbin/
filesystem /usr/local/share/
filesystem /usr/local/share/man
filesystem /usr/local/src/
filesystem /usr/sbin
filesystem /usr/share/
filesystem /usr/share/man/
filesystem /usr/share/man/man1/
filesystem /usr/share/man/man2/
filesystem /usr/share/man/man3/
filesystem /usr/share/man/man4/
filesystem /usr/share/man/man5/
filesystem /usr/share/man/man6/
filesystem /usr/share/man/man7/
filesystem /usr/share/man/man7/archlinux.7.gz
filesystem /usr/share/man/man8/
filesystem /usr/share/misc/
filesystem /usr/src/
filesystem /var/
filesystem /var/cache/
filesystem /var/empty/
filesystem /var/games/
filesystem /var/lib/
filesystem /var/lib/misc/
filesystem /var/local/
filesystem /var/lock
filesystem /var/log/
filesystem /var/log/old/
filesystem /var/mail
filesystem /var/opt/
filesystem /var/run
filesystem /var/spool/
filesystem /var/spool/mail/
filesystem /var/tmp/

嗯 filesystem 的作用大概有这几个:

  • 首先摆好一个 Linux 发行版基本的目录结构。

    大多数 Linux 发行版的目录结构都是遵循 文件系统层次结构标准 的啦,Arch 也不例外~

  • 然后放些 Arch 特有的文件

    例如默认设置啦( 这不是废话么 ),甚至还有一个手册页(汝不妨试试 man archlinux ?)

所以嘛……

by ホロ at July 24, 2016 04:00 PM

wicast

在非KDE桌面下Qt5.7主题崩坏的解决方案

前段时间 Qt5.7 更新移除了 QGtkStyle 这个模块,直接导致了非 KDE 环境下 Qt 应用主题直接崩坏(

在 ArchWiki 上找了下解决方案,发现一个叫 qt5ct 的包可以在非 KDE 下设定 Qt 应用的主题(oxygen、breeze)。

安装好后首先在菜单栏里打开 qt5ct(这玩意是有 .desktop 文件的),咱选择的是用 breeze,字体个人喜欢用 noto。

之后在你的 .xprofile 里加上一句 export QT_QPA_PLATFORMTHEME=qt5ct 重启 X 后那些 Qt 应用就能直接用 KDE 主题辣

已知问题:

ss-qt5 会崩溃,启动 ss-qt5 的时候记得去掉这个环境变量。 默认没法用暗色主题,breeze 自带的 color-scheme 和 qt5ct 不兼容,无奈花了点时间,对着 arc-dark 的颜色自己做了一份配色:https://github.com/wicast/dotfiles/tree/master/qt5ct/.config/qt5ct/colors

July 24, 2016 10:06 AM

July 23, 2016

ヨイツの賢狼ホロ

AOSCC 2016 游记 - 第三天

AOSCC 2016 围观日记最终章(大雾

去 AOSCC 会场围观了下,然后拖延症又发作了 *3 😂

怪了,今天有人没出席拖延症患者互助协会的活动。

第三天......

还是多图杀猫+原谅咱的渣照相技术😂

前奏

今天是个平常的一天,大家都在各自摸鱼🐟,甚至又玩起了 UNO 牌😂

又玩起了 UNO 牌😂

😐 果冻特首的打包教室

Install AOSC OS on  Deepin

特首试图用 Deepin 的 LiveUSB 安装 AOSC OS (然后失败了😂

这是色彩校正

这个看起来和摄像头类似的物体竟然是用来校正色彩的 🤦

ThinkPad 信仰充值中心二分部 😂

ThinkPad 信仰充值中心二分部 😂

换大屏幕

换大屏幕以后就舒服多了~

现场修 issue

特首施展了现场修 issue 技能 😂

😅 AST 讨论区兼微软信仰充值中心 😂

画风突变

画风突变😂😂

来排排坐

AOSCC 微软信仰充值中心 😂

😯 AOSC OS 要成为模拟器系统么 (雾

新鲜出炉的 vba-m

新鲜出炉的 vba-m 😂

隔壁 OS X 来砸场啦

OS X 来砸场啦 😂

NDSL

真机笑而不语😏

各种小插曲......

Icenowy Icenowy

被特首抢了观众的 Icenowy 在默默的继续调试自己的板子……

Icenowy

(好像有啥奇怪的东西混进来了😂

现场直播白学

白学家进入现场, 打死!

围观狮子赶工社区网站

🙄 围观狮子赶工社区网站中……

FSF FSF

听说有人要加入 FSF 神教? 😂

Coding.net x GitCafe

GitCafe 的精神继任 Coding.net 借尸还魂啦😂

这不清真 😂

这不清真 这不清真 Act 2 这不清真 Act 3

糟糕!你们竟然昏了头脑把圣战者公审了!他引爆了藏在衣服里的炸弹,和所有人同归于尽了 #圣战者胜。😂

然后……

Jelly Bai 在 BroncoTc 的提醒下发现忘记像去年一样照集体照了 🤣😂

BroncoTc | Keybase√, [18.07.16 19:16] 卧槽

BroncoTc | Keybase√, [18.07.16 19:16] 我们忘了拍合影。

liushuyu 🐟, [18.07.16 19:16] GG

liushuyu 🐟, [18.07.16 19:17] 建议开始 AOSCC 2017 的筹划

Mingcong Bai, [18.07.16 19:17] Oh sh*t.

ヨイツの賢狼ホロ 😋(*), [18.07.16 19:18] 下一次第一天就拍合影吼不吼啊😂

Mingcong Bai, [18.07.16 19:18] [In reply to ヨイツの賢狼ホロ 😋(*)] 吼啊

gumblex, [18.07.16 19:18] [In reply to BroncoTc | Keybase√] 🌚这应该是第一天中午的事情

Mogician Yang, [18.07.16 19:18] 滋磁一个

Jactry Zeng, [18.07.16 19:19] [In reply to Mingcong Bai] 这次会续了不少啊 xD

ヨイツの賢狼ホロ 😋(*), [18.07.16 19:19] [In reply to Mingcong Bai] 😂 /me 然而下一次来不来难说了

KayMW | Syntax-Breaker | 不想猎取灵魂的咸鱼不是好灵魂画手 | 0x547E5906116A1966, [18.07.16 19:19] [In reply to ヨイツの賢狼ホロ 😋(*)] 还真应该这样……有时候不知道谁就突然不见了(比如今天中午的A2

KayMW | Syntax-Breaker | 不想猎取灵魂的咸鱼不是好灵魂画手 | 0x547E5906116A1966, [18.07.16 19:20] [In reply to KayMW | Syntax-Breaker | 不想猎取灵魂的咸鱼不是好灵魂画手 | 0x547E5906116A1966] 还有昨天还是前天的 Bob Cao(

Icenowy 请大家不要在 SoC 上套用 PC 的 GPU 概念, [18.07.16 19:20] [In reply to KayMW | Syntax-Breaker | 不想猎取灵魂的咸鱼不是好灵魂画手 | 0x547E5906116A1966] a2 最后回来啦

IMisakaTransferFrame4e21 神乐坂美蒋, [18.07.16 19:21] 应该和AOSCC 2015一样,人没到齐就合多张

KayMW | Syntax-Breaker | 不想猎取灵魂的咸鱼不是好灵魂画手 | 0x547E5906116A1966, [18.07.16 19:21] [In reply to Icenowy 请大家不要在 SoC 上套用 PC 的 GPU 概念] 然而那个时候人基本走光啦(

by ホロ at July 23, 2016 04:00 PM

百合仙子

发包太快,请勿跟踪

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

之前写的那个处理 DNS AAAA 的程序,后来请求量大的时候就经常报错。经过研究,是在sendto的时候返回了「Pemission Denied」错误。后来的 Rust 版本也发生了类似的问题,得到操作系统返回的代码「EPERM」。

我翻了半天 man 手册,其中只说到向广播地址发包可能会得到 EACCES 错误。Google 也没有得到结果(都是些权限不够的问题,但我的程序是 root 跑的呀,并且错误比较零星)。后来发到 shlug 邮件列表中询问,才终于得知了和我有同样问题的人,但是也没有结论,只是说关掉 iptables 就正常了。可我的程序依赖 iptables 呢……而且我要的不仅仅是解决方案(实际上这个问题并没有造成什么可感知的影响,就算有,我也有办法 migrate),我更想知道为什么。

确定是发包太快造成的问题,拿着相关关键词去搜,还真找到了一些有用的信息。比如之前看过的 CloudFlare 低延迟 UDP 实验时会让 iptables 不跟踪相关数据包,有人在使用 SIP 协议时也遇到了同样的问题,并且在内核日志的帮助下解决了。于是我照着做,让 conntrack 放过我发出的 UDP 包:

iptables -t raw -I OUTPUT -p udp -m udp --sport 53 -j NOTRACK

然后不仅那些错误都没了,而且处理速度快了一倍!(图中红虚线是发生错误的时候。)

程序统计信息

by 依云 at July 23, 2016 06:40 AM

July 22, 2016

ヨイツの賢狼ホロ

AOSCC 2016 游记 - 第二天

AOSCC 2016 围观日记续集(误

去 AOSCC 会场围观了下,然后拖延症又发作了 *2 😂

你是拖延症患者,每天除了摸鱼🐟什么都不干,你很忧心,为此加入了拖延症患者互助协会。

第二天......

还是多图杀猫+原谅咱的渣照相技术😂

前奏:出发~

「昨晚,秘密警察突然失踪,说不定是有人报复?想必是凶多吉少了……」酒店老板在收了一笔可观的小费之后,告诉了大家这个情报。

还是A2的游戏直播

还是老样子,开始前先玩会儿游戏~

🐷 Gumblex 的表情高清重制直播

Gumblex 的表情高清重制直播

(道具是自由且开源的 Inkscape 哦~)

Gumblex 的表情高清重制直播 Gumblex 的表情高清重制直播

这张用了 全景(不能) 变焦以后更糊了 😂

Gumblex 的表情高清重制直播

😯 Junde Yhi 关于安同开始程序的介绍

安同开始程序(Anthon Starter Kit),可以去 repo.aosc.io 获取演讲时用到的幻灯片。

(原谅咱真找不到更合适的词啦,况且 LibreOffice Impress 也叫“幻灯片” 😂😂

https://repo.aosc.io/aosc-documentation/aoscc-2016/junde-yhi-ast-startup-kit/speech-anthon-starter.pdf

唔~

唔~

AST Speech Uno😂

然后后面有人玩起了 Uno 牌😂

😋 Junde Yhi 和 liushuyu 🐟 关于分布式 ABBS 的构想

ABBS ,全称 AutoBuild Build Service 。是 AOSC OS 管理软件包编译配置树的工具(目前是这样

还是老样子,演讲时的幻灯片在这:

https://repo.aosc.io/aosc-documentation/aoscc-2016/junde-yhi-distributed-abbs/distributed-abbs.pdf

DABBS_1 DABBS_2 DABBS_3 DABBS_4

(瓶装毒品😂😂)

照例还是 Extra:

Arthur2e5 is playing NEKOPARA ~

这回怪了,没人投票?你们终于意识到投票杀人是不人道的了吗?

夜幕降临,人们都活在恐惧中,彻夜难眠。这漫长的夜晚竟然......还是有好几个小时 😂😂

😋

by ホロ at July 22, 2016 04:00 PM

July 21, 2016

ヨイツの賢狼ホロ

AOSCC 2016 游记 - 第一天

AOSCC 2016 围观日记 (误

去 AOSCC 会场围观了下,然后拖延症又发作了😂😂

AOSC(C) 是啥?

AOSC ,全称 Always Overuse Shell Community Anthon Open Source Community ,安同开源社区。 是一个主要学生组成的开源社区,主要致力于 AOSC OS 的开发工作。

AOSC OS 是安同开源社区的主要项目,它是一个“白”手起家(?),采用 dpkg 作为软件包管理器的 Linux 发行版, 按照 jeffbai: 可爱的特首(误) Jelly Bai 的想法:

“在我们的发行版真的拿得出手前(希望至少能和 Arch 比比整洁度),真不希望我们像 Deepin 一样被捧来捧去......”

而后面加个 C (Conference) 就是一年一度的见面会啦~ (今年好像是第二届?

然后作为在其间打酱油的咱怎么会想到去参加这个呢? (难道是因为被调侃了?

liushuyu 🐟, [09.07.16 17:52] 萌狼跟谁住啊(

ヨイツの賢狼ホロ 😋(*), [09.07.16 17:55] 🌚

Cheng Cao, [09.07.16 17:57] [In reply to liushuyu 🐟] 会发生什么

ヨイツの賢狼ホロ 😋(*), [09.07.16 18:03] [In reply to Cheng Cao] 😋

liushuyu 🐟, [09.07.16 18:05] [In reply to Cheng Cao] 旭日初升,恶臭四溢。AOSCC 与会人员们寻着气味而走,赫然发现【xxx】身首异处,躯体被撕成了碎片。这回糟了!

KayMW | Syntax-Breaker | 不想猎取灵魂的咸鱼不是好灵魂画手 | 0x547E5906116A1966, [09.07.16 18:17] [In reply to Cheng Cao] 会被吃

KayMW | Syntax-Breaker | 不想猎取灵魂的咸鱼不是好灵魂画手 | 0x547E5906116A1966, [09.07.16 18:17] [In reply to liushuyu 🐟] 萌狼:“下一个吃谁呢~”

ヨイツの賢狼ホロ 😋(*), [09.07.16 18:18] 😂

请听题:上面要补多少个括号? 😂😂

第一天......

多图杀猫+原谅咱的渣照相技术😂

前奏:当地桥好像很多的样子......

(当地桥好像很多的样子~)

前奏:这是啥?

(当心电离辐射......#滑稽)

前奏:导向牌

(简朴的导向标志)

AOSCC 与会人员们聚集在会场 —— 大家都如释重负,因为昨晚似乎无人受袭。

正在打游戏的 A2 ww~ 正在打游戏的 A2 ww~

在白特首来之前先来围观下 A2 ~

维他柠檬茶

夭寿辣,会场聚众吸毒啦😂😂

locale-gen

现场生成 locale 中(貌似 AOSC 没给 /etc/locale.gen 上注释😂

ThinkPads

ThinkPad 信仰充值中心一分部 😂 (画面中间的是果冻特首的 W541 ,旁边的是 A2 的 X1 Carbon)

Longson

还有特首的龙芯笔记本~

WhiteBoard

Hmm...清真猪肉公共许可证, 嗯可以,这很清真

Raspberrypi

现场装 X 中的树莓派 (然而不久有人把线碰掉然后就关机了, 毕竟出来混迟早是要还的嘛 😂)

AOSCC17 AOSCC201

AOSCC 2017,下一站广州!😋

AOSCC Core 4

AOSCC 2016 与会者选出的 AOSC OS Core 4 的开发代号是 "Duang-Duang"(努力保持严肃……);

夜幕降临,人们都活在恐惧中,彻夜难眠。这漫长的夜晚竟然有几个小时! 😂😂

Extra

Naive Blue

😂😂

by ホロ at July 21, 2016 04:00 PM

July 16, 2016

Hexchain Tong

跨架构升级 Fedora

有个很久以前建立的 Linode VPS,系统是 32 位的 Fedora。在 Linode 换成 KVM 时被要求换成了 64 位内核,看似没有问题就一直在使用。前些天发现许久不用的 strongswan 不能连接,报错信息让人感觉用户空间的什么东西和内核的什么东西不合拍,加上这个 Fedora 20 已经停止了更新,便萌生了作死变换架构然后升级的念头。

在这期间 Linode 一共给我发了 27 封提醒邮件,Orz...

Linode Events Notification

整个过程中主要参考了这篇文章。

大致过程与原文相同,先滚系统,然后安装发行版提供的 64 位内核并确保启动,然后执行命令输出软件包列表,并替换 i686x86_64 生成要安装的软件包列表,然后下载所有软件包准备。

# rpm -qa --qf '%{name}.%{arch}\n' |grep -E '\.i.86' |sed s/i.86/x86_64/g >rpmlist.txt
# yum --downloadonly --downloaddir=$SOMEPLACEWITHSPACE install $(cat rpmlist.txt)

此时要注意,由于目录结构的区别,要首先安装 filesystem 这个包,否则 /lib64 会成为一个目录,而不是到 /usr/lib64 的软链接。安装完成后可以继续安装所有软件包:

# rpm -Uvh filesystem*.rpm --replacepkgs --replacefiles --ignorearch
# rpm -Uvh *rpm --replacepkgs --replacefiles --ignorearch

注意 SELinux 相关包的状态,如果出现问题可能无法启动。我遇到的情况是莫名其妙的丢了 selinux-policy-targeted 这个包,导致重启之后 dbus 启动不能,卡住 systemd。

重启,确定系统正常之后可以删掉剩余的 *.i686* 包了。如果需要的话,使用 rpmconf -a 来处理各类 .rpm{save,new}

接下来是 Linode 限定部分。

  • 先在控制面板里做一个 snapshot
  • 全程使用 Glish 进行操作
  • 启动卡住时,进 Rescue 模式,chroot 进去用 journalctl -b -1 看日志

Linode 给虚拟机分配的磁盘一般是格式化好的一个完整文件系统镜像,相当于只有分区的内容,不是完整的磁盘。好在 ext 系基本都可以缩小,Linode 控制面板里也方便修改分区大小。实际上中途折腾失败时恢复 snapshot 自动建立的磁盘只有 23GB,而实际文件系统的使用量不到 10GB,不知道这个数字是怎么算出来的。

磁盘镜像的问题带来了第二个坑:bootloader。由于只有文件系统,装不上 bootloader,只能使用 Linode 的 GRUB2 方式启动系统。这种方式是由 Linode 提供 GRUB2,然后读取分区中的 /boot/grub/grub.cfg 作为配置文件进行启动,而 Fedora 默认的 GRUB2 配置文件在 /boot/grub2 里…与此相关的还有诸如 GRUB 界面乱码、卡死等问题。

为了解决这些坑,并且避免这些神奇的配置在以后升级过程中带来其他玄学问题,我创建了一个新的 unformatted/raw 格式的磁盘,进入 Rescue 分区,并将原磁盘的内容 rsync 到新磁盘的分区中。然后 chroot 进去,用 grub2-install /dev/sda 科学的安装 GRUB2。最后将启动方式改成 Direct Disk。

最大的折腾感受:滚动大法好!跨版本升级什么的太坑啦!

by hexchain at July 16, 2016 03:33 PM