<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>/home/hexchain</title><link href="https://hexchain.org/" rel="alternate"></link><link href="https://hexchain.org/feeds/all.atom.xml" rel="self"></link><id>https://hexchain.org/</id><updated>2019-02-08T21:46:00+08:00</updated><subtitle>drwxr-xr-x 25 hexchain hexchain   4096 Apr 17</subtitle><subtitle>drwxr-xr-x 25 hexchain hexchain   4096 Apr 17</subtitle><entry><title>在 Linux 上使用 Docker 和 Java 开发酷 Q 插件</title><link href="https://hexchain.org/develop-cq-plugins-on-linux-with-java.html" rel="alternate"></link><published>2018-04-30T18:10:00+08:00</published><updated>2019-02-08T21:46:00+08:00</updated><author><name>hexchain</name></author><id>tag:hexchain.org,2018-04-30:/develop-cq-plugins-on-linux-with-java.html</id><summary type="html">&lt;p&gt;最近出于一些奇怪的原因，我需要写个 QQ 机器人。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://cqp.cc/"&gt;酷 Q&lt;/a&gt; 是个比较常见且好用的机器人框架，但很可惜是 Windows only 的。虽然有官方 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;最近出于一些奇怪的原因，我需要写个 QQ 机器人。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://cqp.cc/"&gt;酷 Q&lt;/a&gt; 是个比较常见且好用的机器人框架，但很可惜是 Windows only 的。虽然有官方支持的（使用 Wine 的） &lt;a class="reference external" href="https://cqp.cc/t/34558"&gt;Linux Docker 镜像&lt;/a&gt;，但为了开发插件，还要设立交叉编译开发环境，十分麻烦。在论坛上发现酷 Q 有 &lt;a class="reference external" href="https://cqp.cc/t/37318"&gt;Java 插件&lt;/a&gt;，就可以借助 JVM 使用各种原生的工具开发插件，然后扔进 Docker 里的 Wine 的 JRE 去运行。&lt;/p&gt;
&lt;div class="section" id="docker-java"&gt;
&lt;h2&gt;获取 Docker 镜像和 Java 插件&lt;/h2&gt;
&lt;p&gt;首先要获取 CoolQ 的 Docker 镜像，并启动一次。这是为了建立基本的酷 Q 目录结构：&lt;/p&gt;
&lt;pre class="literal-block"&gt;
coolq/
├── app
│&amp;nbsp;&amp;nbsp; ├── com.coxxs.music.cpk
│&amp;nbsp;&amp;nbsp; ├── com.coxxs.start
│&amp;nbsp;&amp;nbsp; │&amp;nbsp;&amp;nbsp; └── start.cfg
│&amp;nbsp;&amp;nbsp; ├── com.coxxs.start.cpk
│&amp;nbsp;&amp;nbsp; ├── com.coxxs.status.cpk
│&amp;nbsp;&amp;nbsp; └── moe.min.qa.cpk
├── bin
│&amp;nbsp;&amp;nbsp; ├── CQP.dll
│&amp;nbsp;&amp;nbsp; ├── gzip.dll
│&amp;nbsp;&amp;nbsp; ├── htmlayout.dll
│&amp;nbsp;&amp;nbsp; ├── libeay32.dll
│&amp;nbsp;&amp;nbsp; ├── libiconv.dll
│&amp;nbsp;&amp;nbsp; ├── sqlite3.dll
│&amp;nbsp;&amp;nbsp; └── zlib1.dll
├── conf
└── CQA.exe
&lt;/pre&gt;
&lt;p&gt;然后下载 &lt;a class="reference external" href="https://cqp.cc/t/37318"&gt;酷 Q Java SDK&lt;/a&gt; 并按提示放入 &lt;tt class="docutils literal"&gt;coolq/app/&lt;/tt&gt; 目录中，启动酷 Q 并在插件管理器中启用 Java 插件。插件会提示找不到 JRE，暂时忽略。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="windows-jre"&gt;
&lt;h2&gt;下载 Windows JRE&lt;/h2&gt;
&lt;p&gt;然后，到 &lt;a class="reference external" href="http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html"&gt;http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html&lt;/a&gt; 获取&lt;strong&gt;32 位&lt;/strong&gt;的 Windows JRE &lt;strong&gt;压缩包&lt;/strong&gt;，如 jre-8u202-windows-i586.tar.gz。这里使用压缩包是为了避免额外的安装步骤。&lt;/p&gt;
&lt;p&gt;然后将 tar 包解压至 &lt;tt class="docutils literal"&gt;coolq&lt;/tt&gt; 目录下，解压之后应该有 &lt;tt class="docutils literal"&gt;jre1.8.0_202/bin&lt;/tt&gt; 等目录。&lt;/p&gt;
&lt;p&gt;编辑 &lt;tt class="docutils literal"&gt;coolq/data/app/com.sobte.cqp.jcq/conf/setting.ini&lt;/tt&gt; 文件，修改 &lt;tt class="docutils literal"&gt;JrePath&lt;/tt&gt;
指定 JRE 路径（Docker 中的根目录对应 wine 中的 &lt;tt class="docutils literal"&gt;Z:\&lt;/tt&gt;）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[JavaVM]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="na"&gt;JrePath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Z:\home\user\coolq\jre1.8.0_202\&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后重启酷 Q，此时插件应该能找到 JRE。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="section-1"&gt;
&lt;h2&gt;做插件&lt;/h2&gt;
&lt;p&gt;参考论坛提供的 Demo 写插件。需要注意 json 文件中的 &lt;tt class="docutils literal"&gt;appid&lt;/tt&gt; 字段，和 &lt;tt class="docutils literal"&gt;appInfo()&lt;/tt&gt; 的返回格式。&lt;/p&gt;
&lt;p&gt;然后编译构建，将 jar 包和 json 按正确的名称复制到
&lt;tt class="docutils literal"&gt;coolq/app/com.sobte.cqp.jcq/app/&lt;/tt&gt; 下，重启酷 Q 就会生效。&lt;/p&gt;
&lt;p&gt;使用 maven-assembly-plugin 可以将依赖打进最终生成的 jar 包中。&lt;/p&gt;
&lt;p&gt;stdout（竟然）是可用的，可以简单的使用 &lt;tt class="docutils literal"&gt;println()&lt;/tt&gt; 输出调试信息。但输出的中文会乱码，原因是 Java 在 Windows 上的输出并不是 UTF-8 编码的。参考 &lt;a class="reference external" href="https://stackoverflow.com/a/29231668"&gt;https://stackoverflow.com/a/29231668&lt;/a&gt;
修改 &lt;tt class="docutils literal"&gt;System.out&lt;/tt&gt; 的编码后解决。&lt;/p&gt;
&lt;/div&gt;
</content><category term="misc"></category><category term="coolq"></category><category term="java"></category><category term="docker"></category><category term="linux"></category></entry><entry><title>跨架构升级 Fedora</title><link href="https://hexchain.org/crossgrading-fedora.html" rel="alternate"></link><published>2016-07-16T23:33:36-08:00</published><updated>2016-07-16T23:33:36-08:00</updated><author><name>hexchain</name></author><id>tag:hexchain.org,2016-07-16:/crossgrading-fedora.html</id><summary type="html">&lt;p&gt;有个很久以前建立的 Linode VPS，系统是 32 位的 Fedora。在 Linode 换成 KVM 时被要求换成了 64 位内核，看似没有问题就一直在使用。前些天发 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;有个很久以前建立的 Linode VPS，系统是 32 位的 Fedora。在 Linode 换成 KVM 时被要求换成了 64 位内核，看似没有问题就一直在使用。前些天发现许久不用的 strongswan 不能连接，报错信息让人感觉用户空间的什么东西和内核的什么东西不合拍，加上这个 Fedora 20 已经停止了更新，便萌生了作死变换架构然后升级的念头。&lt;/p&gt;
&lt;p&gt;在这期间 Linode 一共给我发了 27 封提醒邮件，Orz...&lt;/p&gt;
&lt;img alt="Linode Events Notification" src="static/images/linode-27-mails.png" /&gt;
&lt;p&gt;整个过程中主要参考了&lt;a class="reference external" href="https://www.skuggor.se/converting-fedora-16-from-i686-to-x86_64.html"&gt;这篇&lt;/a&gt;文章。&lt;/p&gt;
&lt;p&gt;大致过程与原文相同，先滚系统，然后安装发行版提供的 64 位内核并确保启动，然后执行命令输出软件包列表，并替换 &lt;tt class="docutils literal"&gt;i686&lt;/tt&gt; 为 &lt;tt class="docutils literal"&gt;x86_64&lt;/tt&gt; 生成要安装的软件包列表，然后下载所有软件包准备。&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# rpm -qa --qf '%{name}.%{arch}\n' |grep -E '\.i.86' |sed s/i.86/x86_64/g &amp;gt;rpmlist.txt
# yum --downloadonly --downloaddir=$SOMEPLACEWITHSPACE install $(cat rpmlist.txt)
&lt;/pre&gt;
&lt;p&gt;此时要注意，由于目录结构的区别，要首先安装 &lt;tt class="docutils literal"&gt;filesystem&lt;/tt&gt; 这个包，否则 &lt;tt class="docutils literal"&gt;/lib64&lt;/tt&gt; 会成为一个目录，而不是到 &lt;tt class="docutils literal"&gt;/usr/lib64&lt;/tt&gt; 的软链接。安装完成后可以继续安装所有软件包：&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# rpm -Uvh filesystem*.rpm --replacepkgs --replacefiles --ignorearch
# rpm -Uvh *rpm --replacepkgs --replacefiles --ignorearch
&lt;/pre&gt;
&lt;p&gt;注意 SELinux 相关包的状态，如果出现问题可能无法启动。我遇到的情况是莫名其妙的丢了 &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;selinux-policy-targeted&lt;/span&gt;&lt;/tt&gt; 这个包，导致重启之后 dbus 启动不能，卡住 systemd。&lt;/p&gt;
&lt;p&gt;重启，确定系统正常之后可以删掉剩余的 &lt;tt class="docutils literal"&gt;*.i686*&lt;/tt&gt; 包了。如果需要的话，使用 &lt;tt class="docutils literal"&gt;rpmconf &lt;span class="pre"&gt;-a&lt;/span&gt;&lt;/tt&gt; 来处理各类 &lt;tt class="docutils literal"&gt;.rpm{save,new}&lt;/tt&gt; 。&lt;/p&gt;
&lt;p&gt;接下来是 Linode 限定部分。&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;先在控制面板里做一个 snapshot&lt;/li&gt;
&lt;li&gt;全程使用 Glish 进行操作&lt;/li&gt;
&lt;li&gt;启动卡住时，进 Rescue 模式，chroot 进去用 &lt;tt class="docutils literal"&gt;journalctl &lt;span class="pre"&gt;-b&lt;/span&gt; &lt;span class="pre"&gt;-1&lt;/span&gt;&lt;/tt&gt; 看日志&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Linode 给虚拟机分配的磁盘一般是格式化好的一个完整文件系统镜像，相当于只有分区的内容，不是完整的磁盘。好在 ext 系基本都可以缩小，Linode 控制面板里也方便修改分区大小。实际上中途折腾失败时恢复 snapshot 自动建立的磁盘只有 23GB，而实际文件系统的使用量不到 10GB，不知道这个数字是怎么算出来的。&lt;/p&gt;
&lt;p&gt;磁盘镜像的问题带来了第二个坑：bootloader。由于只有文件系统，装不上 bootloader，只能使用 Linode 的 GRUB2 方式启动系统。这种方式是由 Linode 提供 GRUB2，然后读取分区中的 &lt;tt class="docutils literal"&gt;/boot/grub/grub.cfg&lt;/tt&gt; 作为配置文件进行启动，而 Fedora 默认的 GRUB2 配置文件在 &lt;tt class="docutils literal"&gt;/boot/grub2&lt;/tt&gt; 里…与此相关的还有诸如 GRUB 界面乱码、卡死等问题。&lt;/p&gt;
&lt;p&gt;为了解决这些坑，并且避免这些神奇的配置在以后升级过程中带来其他玄学问题，我创建了一个新的 unformatted/raw 格式的磁盘，进入 Rescue 分区，并将原磁盘的内容 rsync 到新磁盘的分区中。然后 chroot 进去，用 &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;grub2-install&lt;/span&gt; /dev/sda&lt;/tt&gt; 科学的安装 GRUB2。最后将启动方式改成 Direct Disk。&lt;/p&gt;
&lt;p&gt;最大的折腾感受：滚动大法好！跨版本升级什么的太坑啦！&lt;/p&gt;
</content><category term="misc"></category><category term="fedora"></category><category term="linux"></category><category term="crossgrading"></category></entry><entry><title>使用 networkd 管理 HE.net TunnelBroker</title><link href="https://hexchain.org/he-net-tunnelbroker-with-systemd-networkd.html" rel="alternate"></link><published>2015-01-26T23:37:00+08:00</published><updated>2015-01-26T23:37:00+08:00</updated><author><name>hexchain</name></author><id>tag:hexchain.org,2015-01-26:/he-net-tunnelbroker-with-systemd-networkd.html</id><summary type="html">&lt;p&gt;systemd-networkd 是一个很科学的网络管理工具。支持 &lt;tt class="docutils literal"&gt;sit&lt;/tt&gt; 隧道，可以拿来管理 HE.net 的 TunnelBroker。&lt;/p&gt;
&lt;p&gt;进入 TunnelBroker 的隧道 -&amp;gt; Example Configuration 页面，在下拉菜单中选择 Debian/Ubuntu。&lt;/p&gt;
&lt;p&gt;例 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;systemd-networkd 是一个很科学的网络管理工具。支持 &lt;tt class="docutils literal"&gt;sit&lt;/tt&gt; 隧道，可以拿来管理 HE.net 的 TunnelBroker。&lt;/p&gt;
&lt;p&gt;进入 TunnelBroker 的隧道 -&amp;gt; Example Configuration 页面，在下拉菜单中选择 Debian/Ubuntu。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre class="literal-block"&gt;
auto he-ipv6
iface he-ipv6 inet6 v4tunnel
    address 2001:db8:12:34::2
    netmask 64
    endpoint 172.16.12.19
    local 192.168.24.17
    ttl 255
    gateway 2001:db8:12:34::1
&lt;/pre&gt;
&lt;p&gt;然后创建以下文件：
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/etc/systemd/he-tunnel.netdev&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;pre class="code ini literal-block"&gt;
&lt;span class="k"&gt;[Match]&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;[NetDev]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;HE.net Tunnelbroker sit device&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;he-ipv6&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;Kind&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;sit&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;MTUBytes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1480&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;[Tunnel]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;Local&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;192.168.24.17  # 上面的 &amp;quot;local&amp;quot; 字段&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;Remote&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;172.16.12.19  # 上面的 &amp;quot;endpoint&amp;quot; 字段&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;TTL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;255&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;/etc/systemd/he-tunnel.network&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;pre class="code ini literal-block"&gt;
&lt;span class="k"&gt;[Match]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;he-ipv6&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;[Network]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;Address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2001:db8:12:34::2/64  # &amp;quot;address&amp;quot;/&amp;quot;netmask&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;Gateway&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2001:db8:12:34::1     # &amp;quot;gateway&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;DNS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2001:4860:4860::8888      # 建议按照 IPv6 Tunnel 页上 Available DNS Resolvers 一节进行设置&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="na"&gt;DNS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;2001:4860:4860::8844&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;在样例配置中，Linux-net-tools 方案和 Linux-iproute2 方案都不需要指定 IPv6 的网关地址，我也不知道怎么让 networkd 实现同样效果…&lt;/p&gt;
&lt;p&gt;最后在主接口的&lt;tt class="docutils literal"&gt;.network&lt;/tt&gt;文件的&lt;tt class="docutils literal"&gt;[Network]&lt;/tt&gt;一节里加入如下内容：&lt;/p&gt;
&lt;pre class="code ini literal-block"&gt;
&lt;span class="na"&gt;Tunnel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;he-ipv6&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;这样就能让隧道随主接口自动建立。&lt;/p&gt;
</content><category term="misc"></category><category term="networking"></category><category term="linux"></category><category term="systemd"></category></entry><entry><title>LaTeX 笔记</title><link href="https://hexchain.org/latex-note.html" rel="alternate"></link><published>2015-01-09T20:44:00+08:00</published><updated>2015-01-09T20:44:00+08:00</updated><author><name>hexchain</name></author><id>tag:hexchain.org,2015-01-09:/latex-note.html</id><summary type="html">&lt;p&gt;编译环境：XeTeX&lt;/p&gt;
&lt;p&gt;每次都要翻以前的代码太麻烦了，干脆整理一下。随时更新。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;关于PDF阅读器&lt;/p&gt;
&lt;p&gt;zathura 是个不错的东西，界面简单，可以 continuous scroll，可以 …&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;编译环境：XeTeX&lt;/p&gt;
&lt;p&gt;每次都要翻以前的代码太麻烦了，干脆整理一下。随时更新。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p class="first"&gt;关于PDF阅读器&lt;/p&gt;
&lt;p&gt;zathura 是个不错的东西，界面简单，可以 continuous scroll，可以键盘操作，还支持 synctex。zathura-pdf-mupdf 后端目测比 zathura-pdf-poppler 后端好一点。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/lervag/vimtex"&gt;vimtex&lt;/a&gt; 已经支持了zathura，无需单独配置，正确姿势请阅读VimTeX项目说明文档。以下配置仅供参考。&lt;/p&gt;
&lt;pre class="code vim literal-block"&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;g&lt;/span&gt;:latex_fold_enabled &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;g&lt;/span&gt;:latex_view_method &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'general'&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;g&lt;/span&gt;:latex_view_general_viewer &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'zathura'&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; empty&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;v&lt;/span&gt;:servername&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; s:servername_option &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; s:servername_option &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;--servername &amp;quot;&lt;/span&gt;.&lt;span class="k"&gt;v&lt;/span&gt;:servername
&lt;span class="k"&gt;endif&lt;/span&gt;
&lt;span class="c"&gt;
&amp;quot; Detect vim/gvim&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; has&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gui_running'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; s:vim_invoke_command &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;gvim&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; s:vim_invoke_command &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;vim&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;endif&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;g&lt;/span&gt;:latex_view_general_options &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'-x '&lt;/span&gt;
            \ . &lt;span class="s1"&gt;'&amp;quot;'&lt;/span&gt;.s:vim_invoke_command.&lt;span class="s1"&gt;' '&lt;/span&gt;.s:servername_option
            \ . &lt;span class="s1"&gt;'--remote-send \&amp;quot;'&lt;/span&gt;
            \ . &lt;span class="s1"&gt;':drop \%{input}:\%{line}:normal\! zzzv'&lt;/span&gt;
            \ . &lt;span class="s1"&gt;':execute ''drop ''.fnameescape(''\%{input}'')'&lt;/span&gt;
            \ . &lt;span class="s1"&gt;':\%{line}:normal\!  zzzv'&lt;/span&gt;
            \ . &lt;span class="s1"&gt;':call remote_foreground('''&lt;/span&gt;.&lt;span class="k"&gt;v&lt;/span&gt;:servername.&lt;span class="s1"&gt;''')\&amp;quot;&amp;quot;'&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; SyncTexForward&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;call&lt;/span&gt; latex#&lt;span class="k"&gt;view&lt;/span&gt;#&lt;span class="k"&gt;view&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'--synctex-forward='&lt;/span&gt;
                \ . line&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; . &lt;span class="s2"&gt;&amp;quot;:&amp;quot;&lt;/span&gt;
                \ . &lt;span class="k"&gt;col&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; . &lt;span class="s2"&gt;&amp;quot;:&amp;quot;&lt;/span&gt;
                \ . expand&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%:p&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; . &lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt;
                \ . expand&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;%&amp;lt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; . &lt;span class="s2"&gt;&amp;quot;.pdf&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;endfunction&lt;/span&gt;
nmap &lt;span class="k"&gt;ls&lt;/span&gt; :&lt;span class="k"&gt;call&lt;/span&gt; SyncTexForward&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;vim退出插入模式后自动关闭输入法（fcitx有效）&lt;/p&gt;
&lt;pre class="code vim literal-block"&gt;
autocmd &lt;span class="nb"&gt;InsertLeave&lt;/span&gt; * &lt;span class="k"&gt;silent&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;fcitx&lt;span class="p"&gt;-&lt;/span&gt;remote &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;PNG截图插入后大小不对的解决方法&lt;/p&gt;
&lt;pre class="code sh literal-block"&gt;
convert &lt;span class="nv"&gt;$f&lt;/span&gt; -density &lt;span class="m"&gt;96&lt;/span&gt; -units PixelsPerInch &lt;span class="nv"&gt;$f&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;请将96改成实际的屏幕DPI。注意：不要对同一张图片多次执行此命令！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;截图颜色反转（用于深色终端截图，节省墨水，从我做起）&lt;/p&gt;
&lt;pre class="code sh literal-block"&gt;
convert &lt;span class="nv"&gt;$f&lt;/span&gt; -negate &lt;span class="nv"&gt;$f&lt;/span&gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;两图并列&lt;/p&gt;
&lt;pre class="code latex literal-block"&gt;
&lt;span class="k"&gt;\begin&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;figure&lt;span class="nb"&gt;}&lt;/span&gt;[h]
    &lt;span class="k"&gt;\begin&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;minipage&lt;span class="nb"&gt;}{&lt;/span&gt;.5&lt;span class="k"&gt;\textwidth&lt;/span&gt;&lt;span class="nb"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;\centering&lt;/span&gt;
        &lt;span class="k"&gt;\caption&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;pic1&lt;span class="nb"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;\includegraphics&lt;/span&gt;&lt;span class="na"&gt;[width=\textwidth]&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;pic1.jpg&lt;span class="nb"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;\end&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;minipage&lt;span class="nb"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;\begin&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;minipage&lt;span class="nb"&gt;}{&lt;/span&gt;.5&lt;span class="k"&gt;\textwidth&lt;/span&gt;&lt;span class="nb"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;\centering&lt;/span&gt;
        &lt;span class="k"&gt;\caption&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;pic2&lt;span class="nb"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;\includegraphics&lt;/span&gt;&lt;span class="na"&gt;[width=\textwidth]&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;pic2.jpg&lt;span class="nb"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;\end&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;minipage&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\end&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;figure&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;字上横线&lt;/p&gt;
&lt;pre class="code latex literal-block"&gt;
&lt;span class="k"&gt;\makeatletter&lt;/span&gt;
&lt;span class="k"&gt;\newcommand*&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\txtoverline&lt;/span&gt;&lt;span class="nb"&gt;}&lt;/span&gt;[1]&lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="s"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;\overline&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;\hbox&lt;/span&gt;&lt;span class="nb"&gt;{#&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="nb"&gt;}}&lt;/span&gt;&lt;span class="nv"&gt;\m&lt;/span&gt;&lt;span class="nb"&gt;&amp;#64;th&lt;/span&gt;&lt;span class="s"&gt;$&lt;/span&gt;&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\makeatother&lt;/span&gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;长得还不错的listing设置（不知道从哪抄来的）&lt;/p&gt;
&lt;pre class="code latex literal-block"&gt;
&lt;span class="k"&gt;\DeclareCaptionFont&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;white&lt;span class="nb"&gt;}{&lt;/span&gt;&lt;span class="k"&gt;\color&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;white&lt;span class="nb"&gt;}}&lt;/span&gt;
&lt;span class="k"&gt;\DeclareCaptionFormat&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;listing&lt;span class="nb"&gt;}{&lt;/span&gt;&lt;span class="k"&gt;\colorbox&lt;/span&gt;&lt;span class="na"&gt;[cmyk]&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;0.43, 0.35, 0.35,0.01&lt;span class="nb"&gt;}{&lt;/span&gt;&lt;span class="k"&gt;\parbox&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\linewidth&lt;/span&gt;&lt;span class="nb"&gt;}{&lt;/span&gt;&lt;span class="k"&gt;\hspace&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;15pt&lt;span class="nb"&gt;}&lt;/span&gt;#1#2#3&lt;span class="nb"&gt;}}}&lt;/span&gt;
&lt;span class="k"&gt;\captionsetup&lt;/span&gt;&lt;span class="na"&gt;[lstlisting]&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;format=listing,labelfont=white,textfont=white,singlelinecheck=false,margin=0pt,font=&lt;span class="nb"&gt;{&lt;/span&gt;bf,footnotesize&lt;span class="nb"&gt;}}&lt;/span&gt;

&lt;span class="k"&gt;\lstset&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;
    basicstyle=&lt;span class="k"&gt;\small\ttfamily&lt;/span&gt;,
    numbers=left,
    numbersep=5pt,
    numberstyle=&lt;span class="k"&gt;\ttfamily\color&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;gray&lt;span class="nb"&gt;}&lt;/span&gt;,
    tabsize=4,
    extendedchars=true,
    breaklines=true,
    frame=b,
    showspaces=false,
    showtabs=false,
    xleftmargin=17pt,
    framexleftmargin=17pt,
    framexrightmargin=6pt,
    framexbottommargin=4pt,
    escapechar=`,
    showstringspaces=false,
&lt;span class="nb"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;中文章节名&lt;/p&gt;
&lt;pre class="code latex literal-block"&gt;
&lt;span class="k"&gt;\usepackage&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;CJKnumb&lt;span class="nb"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;% for \CJKnumber{}
&lt;/span&gt;&lt;span class="k"&gt;\titleformat&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\chapter&lt;/span&gt;&lt;span class="nb"&gt;}&lt;/span&gt;[display]&lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\Huge\bfseries&lt;/span&gt;&lt;span class="nb"&gt;}{&lt;/span&gt;第&lt;span class="k"&gt;\CJKnumber&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\thechapter&lt;/span&gt;&lt;span class="nb"&gt;}&lt;/span&gt;章&lt;span class="nb"&gt;}{&lt;/span&gt;1em&lt;span class="nb"&gt;}{}&lt;/span&gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;章节名后划线&lt;/p&gt;
&lt;pre class="code latex literal-block"&gt;
&lt;span class="k"&gt;\titleformat&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\chapter&lt;/span&gt;&lt;span class="nb"&gt;}&lt;/span&gt;[display]&lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\Huge\bfseries&lt;/span&gt;&lt;span class="nb"&gt;}{&lt;/span&gt;第&lt;span class="k"&gt;\CJKnumber&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\thechapter&lt;/span&gt;&lt;span class="nb"&gt;}&lt;/span&gt;章&lt;span class="nb"&gt;}{&lt;/span&gt;1em&lt;span class="nb"&gt;}{&lt;/span&gt;&lt;span class="k"&gt;\Huge&lt;/span&gt;&lt;span class="nb"&gt;}&lt;/span&gt;[&lt;span class="k"&gt;\vspace&lt;/span&gt;&lt;span class="nb"&gt;{&lt;/span&gt;2ex&lt;span class="nb"&gt;}&lt;/span&gt;&lt;span class="k"&gt;\titlerule&lt;/span&gt;]
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content><category term="misc"></category><category term="latex"></category><category term="vim"></category></entry><entry><title>OpenWrt 编译配置笔记</title><link href="https://hexchain.org/openwrt-build-and-configure-notes.html" rel="alternate"></link><published>2014-12-18T22:34:00+08:00</published><updated>2014-12-18T22:34:00+08:00</updated><author><name>hexchain</name></author><id>tag:hexchain.org,2014-12-18:/openwrt-build-and-configure-notes.html</id><summary type="html">&lt;p&gt;近日购得 Netgear WNDR3700v4 二手路由器一台，有 128MB 内存和 128MB
NAND，自定义空间很大。但目前 OpenWrt 14.07 和 trunk 都只能识别 24MB
NAND，无法完全利用。网上 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;近日购得 Netgear WNDR3700v4 二手路由器一台，有 128MB 内存和 128MB
NAND，自定义空间很大。但目前 OpenWrt 14.07 和 trunk 都只能识别 24MB
NAND，无法完全利用。网上搜索后得知有人给出了 &lt;a class="reference external" href="https://forum.openwrt.org/viewtopic.php?id=49841&amp;amp;p=4#p240195"&gt;解决方法&lt;/a&gt; ，故动手下载
OpenWrt Buildroot，自己编译。&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p class="first"&gt;无需准备 cross-compile toolchain，OpenWrt Buildroot
会帮你下载。Buildroot 的具体设置过程详见
&lt;a class="reference external" href="http://wiki.openwrt.org/doc/howto/buildroot.exigence"&gt;官方文档&lt;/a&gt; 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;feeds 脚本用于管理对 menuconfig 可见的软件仓库和软件包，只有 feeds
install 过的软件包才会显示在 &lt;tt class="docutils literal"&gt;make menuconfig&lt;/tt&gt; 的菜单中。因此建议
&lt;tt class="docutils literal"&gt;feeds update &lt;span class="pre"&gt;-a&lt;/span&gt;&lt;/tt&gt; 和 &lt;tt class="docutils literal"&gt;feeds install &lt;span class="pre"&gt;-a&lt;/span&gt;&lt;/tt&gt; 以确保科学。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;oldpackages 仓库可以干掉了。修改 &lt;tt class="docutils literal"&gt;feeds.conf.default&lt;/tt&gt; 去掉相应行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;menuconfig 是整个编译系统的设置中心，一般情况下除了 make menuconfig
和 make 之外不需要干别的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p class="first"&gt;上面说到官方 OpenWrt 只能识别 24MB 空间，因此需要 patch 内核的 Makefile 来修改分区定义。&lt;/p&gt;
&lt;p&gt;所需 patch：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gh"&gt;Index: target/linux/ar71xx/image/Makefile&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="gh"&gt;===================================================================&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="gd"&gt;--- target/linux/ar71xx/image/Makefile  (revision 42081)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="gi"&gt;+++ target/linux/ar71xx/image/Makefile  (working copy)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="gu"&gt;@@ -285,7 +285,7 @@&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;wnr2000v3_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,3712k(firmware),64k(art)ro&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;wndr3700_mtdlayout=mtdparts=spi0.0:320k(u-boot)ro,128k(u-boot-env)ro,7680k(firmware),64k(art)ro&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;wndr3700v2_mtdlayout=mtdparts=spi0.0:320k(u-boot)ro,128k(u-boot-env)ro,15872k(firmware),64k(art)ro&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="gd"&gt;-wndr4300_mtdlayout=mtdparts=ar934x-nfc:256k(u-boot)ro,256k(u-boot-env)ro,256k(caldata),512k(pot),2048k(language),512k(config),3072k(traffic_meter),2048k(kernel),23552k(ubi),25600k@0x6c0000(firmware),256k(caldata_backup),-(reserved)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="gi"&gt;+wndr4300_mtdlayout=mtdparts=ar934x-nfc:256k(u-boot)ro,256k(u-boot-env)ro,256k(caldata),512k(pot),2048k(language),512k(config),3072k(traffic_meter),2048k(kernel),121856k(ubi),123904k@0x6c0000(firmware),256k(caldata_backup),-(reserved)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;zcn1523h_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,6208k(rootfs),1472k(kernel),64k(configure)ro,64k(mfg)ro,64k(art)ro,7680k@0x50000(firmware)&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;mynet_n600_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,64k(u-boot-env)ro,64k(devdata)ro,64k(devconf)ro,15872k(firmware),64k(radiocfg)ro&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;mynet_rext_mtdlayout=mtdparts=spi0.0:256k(u-boot)ro,7808k(firmware),64k(nvram)ro,64k(ART)ro,6848k@0x130000(filesystem)&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;将以上内容保存为 &lt;tt class="docutils literal"&gt;mtdlayout.patch&lt;/tt&gt;（文件名随意），放在 Buildroot 根目录中，然后执行 &lt;tt class="docutils literal"&gt;patch &lt;span class="pre"&gt;-p0&lt;/span&gt; &amp;lt; mtdlayout.patch&lt;/tt&gt; 即可。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;期间还刷挂了一次，无奈拆机上 USB TTL 工具。WNDR3700v4 的 PCB 与 OpenWrt
Wiki 中的 WNDR3700 页面上的照片不同而与
&lt;a class="reference external" href="http://wiki.openwrt.org/toh/netgear/wndr4300"&gt;WNDR4300&lt;/a&gt;
相似，画面左下角的四个串口 pin 依次为（从前到后，图中从下到上）：GND RX
TX VCC。电压为 3.3V 否则有烧板子的危险，请注意 USB TTL 上的开关或跳线。&lt;/p&gt;
&lt;p&gt;至于串口通信，我这里 minicom 无法输入，于是用的
screen。&lt;tt class="docutils literal"&gt;screen /dev/ttyUSB0 115200&lt;/tt&gt; 执行即可。&lt;/p&gt;
</content><category term="misc"></category><category term="openwrt"></category><category term="linux"></category><category term="cross-compiling"></category></entry><entry><title>tar 分卷压缩与解压缩</title><link href="https://hexchain.org/tar-split-compress.html" rel="alternate"></link><published>2014-02-14T20:04:00+08:00</published><updated>2014-02-14T20:04:00+08:00</updated><author><name>hexchain</name></author><id>tag:hexchain.org,2014-02-14:/tar-split-compress.html</id><summary type="html">&lt;p&gt;手机要去换主板，于是想把内存里的东西备份到 SD
卡上。尝试了几次均以失败告终，tar 提示 Broken pipe。ls -l
了一下发现文件大小 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;手机要去换主板，于是想把内存里的东西备份到 SD
卡上。尝试了几次均以失败告终，tar 提示 Broken pipe。ls -l
了一下发现文件大小是 4294967295，才想起 SD 卡是 FAT32 的，不支持大于 4GB
的文件，于是只好分卷压缩。&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
tar cJf - /data/media &lt;span class="p"&gt;|&lt;/span&gt; split -b 1024m - backup.tar.xz
&lt;/pre&gt;
&lt;p&gt;会生成名为 &lt;tt class="docutils literal"&gt;backup.tar.xzaa&lt;/tt&gt; &lt;tt class="docutils literal"&gt;backup.tar.xzab&lt;/tt&gt; &lt;tt class="docutils literal"&gt;backup.tar.xzac&lt;/tt&gt;
等的文件。&lt;/p&gt;
&lt;p&gt;对应的解压缩方法：&lt;/p&gt;
&lt;pre class="code bash literal-block"&gt;
cat backup.tar.xz* &lt;span class="p"&gt;|&lt;/span&gt; tar xf - -C /
&lt;/pre&gt;
</content><category term="misc"></category><category term="compression"></category><category term="linux"></category><category term="tar"></category></entry><entry><title>为不同 GitHub repo 使用不同 ssh key</title><link href="https://hexchain.org/github-repo-ssh-key.html" rel="alternate"></link><published>2013-11-21T14:49:00+08:00</published><updated>2013-11-21T14:49:00+08:00</updated><author><name>hexchain</name></author><id>tag:hexchain.org,2013-11-21:/github-repo-ssh-key.html</id><summary type="html">&lt;p&gt;最近在折腾 mirrors 的时候发现 scripts 和 web 两个不同的仓库不能有同一个 ssh identity，于是就在服务器上生成了两个 ssh key，稍微修改了下 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;最近在折腾 mirrors 的时候发现 scripts 和 web 两个不同的仓库不能有同一个 ssh identity，于是就在服务器上生成了两个 ssh key，稍微修改了下配置文件，使得两个 repo 在 push 的时候能使用对应的 identity。&lt;/p&gt;
&lt;p&gt;两个 identity 分别命名为 &lt;tt class="docutils literal"&gt;id_rsa_scripts&lt;/tt&gt; 和 &lt;tt class="docutils literal"&gt;id_rsa_web&lt;/tt&gt; ，存储在 &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;~/.ssh/&lt;/span&gt;&lt;/tt&gt; 目录下。&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;~/.ssh/config&lt;/span&gt;&lt;/tt&gt; ：&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
Host github-repo-scripts
    Hostname github.com
    IdentityFile ~/.ssh/id_rsa_scripts

Host github-repo-web
    Hostname github.com
    IdentityFile ~/.ssh/id_rsa_web
&lt;/pre&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;~/scripts/.git/config&lt;/span&gt;&lt;/tt&gt; 修改 &lt;tt class="docutils literal"&gt;[remote &amp;quot;origin&amp;quot;]&lt;/tt&gt; 下 &lt;tt class="docutils literal"&gt;url&lt;/tt&gt; 一项的值：&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
url = git&amp;#64;github-repo-scripts:UniqueStudio/mirrors-script.git
&lt;/pre&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;~/mirrorweb/.git/config&lt;/span&gt;&lt;/tt&gt; 修改 &lt;tt class="docutils literal"&gt;[remote &amp;quot;origin&amp;quot;]&lt;/tt&gt; 下 &lt;tt class="docutils literal"&gt;url&lt;/tt&gt; 一项的值：&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
url = git&amp;#64;github-repo-web:UniqueStudio/mirrors-web.git
&lt;/pre&gt;
</content><category term="misc"></category><category term="git"></category><category term="ssh"></category></entry><entry><title>Linux 上使用财付通控件</title><link href="https://hexchain.org/linux-tenpay-through-wine.html" rel="alternate"></link><published>2013-02-15T16:51:00+08:00</published><updated>2013-02-15T16:51:00+08:00</updated><author><name>hexchain</name></author><id>tag:hexchain.org,2013-02-15:/linux-tenpay-through-wine.html</id><summary type="html">&lt;p&gt;去年折腾了一个腾讯的财付通虚拟卡来买 Google Play
上的东西，方便是方便，但是腾讯没有提供原生的 Linux
控件，查安全码需要开 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;去年折腾了一个腾讯的财付通虚拟卡来买 Google Play
上的东西，方便是方便，但是腾讯没有提供原生的 Linux
控件，查安全码需要开虚拟机，今年年初更新后更是连查看卡号都要输入密码，越来越纠结。于是，和扫地大师
fracting 大大交流后，就想办法用 Wine 运行财付通的密码控件。&lt;/p&gt;
&lt;p&gt;首先用 Wine 安装一个 Firefox for Windows，可以直接运行
&lt;tt class="docutils literal"&gt;winetricks firefox&lt;/tt&gt;，也可以从 mozilla.org 网站上下载。我使用的是
&lt;tt class="docutils literal"&gt;Firefox Setup 18.0.2.exe&lt;/tt&gt;。&lt;/p&gt;
&lt;p&gt;然后，&lt;a class="reference external" href="http://help.tenpay.com/cgi-bin/helpcenter/help_center.cgi?id=9751"&gt;在这里&lt;/a&gt;下载&lt;strong&gt;用于
Windows XP 的&lt;/strong&gt;财付通控件：&lt;tt class="docutils literal"&gt;tenpaycert_xp.exe&lt;/tt&gt;，直接 wine
安装。如果文字是框框，则用 &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;LANG=zh_CN.UTF-8&lt;/span&gt; wine tenpaycert_xp.exe&lt;/tt&gt;
执行安装程序。&lt;/p&gt;
&lt;p&gt;安装完成后打开安装在 wine 中的 firefox，访问 &lt;tt class="docutils literal"&gt;about:addons&lt;/tt&gt;，在
Plugins 页面中禁用描述信息为 “QQCertificate”
的安全证书控件（会导致登陆后浏览器失去响应），仅保留 “QQPassword”
密码控件。&lt;/p&gt;
&lt;p&gt;至此，财付通密码控件已经可以正常使用。&lt;/p&gt;
</content><category term="misc"></category><category term="firefox"></category><category term="linux"></category><category term="tenpay"></category><category term="wine"></category></entry></feed>