<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>bisko.be</title><description>bisko 的个人博客与文字——关于开发、冒险和生活的思考。</description><link>https://bisko.be/zh/</link><language>zh-Hans</language><item><title>在 CachyOS 上用老显卡运行 Ollama</title><link>https://bisko.be/zh/posts/dev/running-ollama-with-older-gpus-on-cachyos/</link><guid isPermaLink="true">https://bisko.be/zh/posts/dev/running-ollama-with-older-gpus-on-cachyos/</guid><description>今天我把 Windows 11 虚拟机迁移到了 Linux,好让上面跑的服务更灵活,结果遇到了个问题:Ollama 没法在我的老显卡 GTX1070 和 GTX970 上运行</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h3 id=&quot;太长不看&quot;&gt;太长不看;&lt;/h3&gt;
&lt;p&gt;CachyOS 上的 &lt;code&gt;ollama-cuda&lt;/code&gt;(截至目前)只支持 &lt;code&gt;compute &gt;= 7.5&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果你的显卡比较老、&lt;code&gt;compute&lt;/code&gt; 版本更低,那你就必须二选一:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从源码编译 &lt;code&gt;ollama-cuda&lt;/code&gt;,并加上对旧 compute 目标的支持&lt;/li&gt;
&lt;li&gt;安装 &lt;code&gt;ollama-vulkan&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我选了 &lt;code&gt;ollama-vulkan&lt;/code&gt;,运行得完美无缺!&lt;/p&gt;
&lt;h3 id=&quot;故事时间&quot;&gt;故事时间&lt;/h3&gt;
&lt;p&gt;今天我灵光一闪,决定终于把 Windows 11 虚拟机关掉,迁移到 Linux 上。&lt;/p&gt;
&lt;p&gt;需求是要能运行:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ollama - 用来玩本地模型的魔法&lt;/li&gt;
&lt;li&gt;Docker - 用于远程开发&lt;/li&gt;
&lt;li&gt;Steam - 用来打游戏&lt;/li&gt;
&lt;li&gt;Jellyfin - 用来存放家庭视频档案&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里我只聊 Ollama,因为这段经历挺有意思,也让我琢磨为什么事情不能更直观一点。&lt;/p&gt;
&lt;p&gt;这台机器里有 2 块显卡:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GTX 1070 - 8GB&lt;/li&gt;
&lt;li&gt;GTX 970 - 4GB&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我想在它们上面跑 Ollama,折腾一下本地模型,看看怎么把它集成进一些项目里。比如:在本地对数据做匿名化、按我的使用场景搭一个非破坏性的 OpenClaw 实现、对手机扫描的文档做本地 OCR、自动化处理家里日常管理的一些事情。&lt;/p&gt;
&lt;p&gt;所以我很自然地装上了 &lt;code&gt;ollama&lt;/code&gt; 和 &lt;code&gt;ollama-cuda&lt;/code&gt;,毕竟里面有 2 块 Nvidia 显卡,我以为肯定没问题,毕竟几分钟前它在 Windows 上还跑得好好的。&lt;/p&gt;
&lt;p&gt;我启动了 Ollama,加载 &lt;code&gt;qwen3:8b&lt;/code&gt; 做个快速实验,然后……它居然在用 CPU 跑 🤔&lt;/p&gt;
&lt;p&gt;显卡的显存明明完全装得下,可不知为什么 Ollama 偏偏选择用 CPU 来跑。&lt;/p&gt;
&lt;p&gt;我试着从日志里找原因,后来请 Claude 帮了把手,它给出了一个相当让人头大的结论:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;The&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; logs&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; tell&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; story&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; clearly.&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Both&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; your&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GPUs&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; are&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; detected&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; but&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; then&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; filtered&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; out&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; because&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; they&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; fail&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; CUDA&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; initialization:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  &quot;filtering device which didn&apos;t fully initialize&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; id=GPU-eb132a13-b9f4-40e3-d85d-60f211dfd21e&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ...&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; library=CUDA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  &quot;filtering device which didn&apos;t fully initialize&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; id=GPU-550263c8-37e2-2a25-c0b6-10cc7511ed20&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ...&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; library=CUDA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  The&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; reason&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; is&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; CUDA&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; library&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; bundled&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; with&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Ollama&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0.17.4&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; was&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; compiled&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; these&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; architectures&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; only:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  CUDA.0.ARCHS&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;=750,800,860,870,880,890,900,1000,1030,1100,1200,1210&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  The&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; minimum&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; supported&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; compute&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; capability&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; is&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 7.5&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (Turing &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; RTX&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; 20xx&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; series&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;). Your GPUs are older than that:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  ┌──────────┬────────────────────┬──────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;   GPU&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;    │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Compute&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Capability&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Architecture&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  ├──────────┼────────────────────┼──────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GTX&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1070&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; │&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 6.1&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Pascal&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;       │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  ├──────────┼────────────────────┼──────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GTX&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 970&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;  │&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 5.2&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;                │&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Maxwell&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;      │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  └──────────┴────────────────────┴──────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  Neither&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; is&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; supported&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; list,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; so&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; CUDA&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; initialization&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; fails&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; both,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Ollama&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; falls&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; back&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; CPU-only&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; inference.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  Your&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; options:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  1.&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Downgrade&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Ollama&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; an&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; older&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; version&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; that&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; still&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; included&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Pascal/Maxwell&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; support&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (pre-0.6.x &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;era&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; had&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; broader&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; arch&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; coverage,&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; but&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; check&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; release&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; notes&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; specifics&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;).&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  2.&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Build&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Ollama&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; source&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; with&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; CUDA_ARCHITECTURES=&quot;52;61;75;80;86&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; include&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; your&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GPU&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; architectures.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;  3.&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Upgrade&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; GPUs&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; at&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; least&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; an&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; RTX&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2060&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; or&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; newer&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (compute &lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;7.5+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;).&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说实话,这让我有点失望,因为在换新显卡之前,我想尽可能把这些旧卡榨干。&lt;/p&gt;
&lt;p&gt;我真不想从源码重新编译 Ollama,它本来就该开箱即用,而且我很困惑它为什么不行,毕竟在 Windows 上安装的版本是支持这些架构的。&lt;/p&gt;
&lt;p&gt;这些显卡在 Ollama 官网上也被列为受支持的!&lt;/p&gt;
&lt;p&gt;长话短说,我在 Google 上折腾了一圈之后发现:&lt;/p&gt;
&lt;p&gt;原来 &lt;code&gt;ollama-cuda&lt;/code&gt; 就只满足上面列出的那些要求……而给出的建议是安装 &lt;code&gt;ollama-vulkan&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;装上之后,一切都顺滑地跑起来了!&lt;/p&gt;</content:encoded><category>dev</category><category>linux</category><category>llm</category><category>ollama</category><category>cachyos</category><category>vulcan</category><category>cuda</category></item><item><title>[Linux] 恢复断开连接的 `apt dist-upgrade` 会话</title><link>https://bisko.be/zh/posts/dev/linux-recovering-a-disconnected-apt-dist-upgrade-session/</link><guid isPermaLink="true">https://bisko.be/zh/posts/dev/linux-recovering-a-disconnected-apt-dist-upgrade-session/</guid><description>今天我通过内置控制台远程更新我的 Proxmox,但中途忘了自己在干什么,直接把标签页关掉了。结果就是我再也连不上了:软件包已经在后台更新,而升级过程弹出了一个是否替换文件的问题,正在等我回答</description><pubDate>Wed, 23 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今天我通过内置控制台远程更新我的 Proxmox,但中途忘了自己在干什么,直接把标签页关掉了。&lt;/p&gt;
&lt;p&gt;结果就是我没法再连上去了:软件包已经在后台更新,而升级过程弹出了一个是否替换文件的问题,正在等我输入。&lt;/p&gt;
&lt;p&gt;所以我虽然能 SSH 进去,却什么也做不了,因为它还在一个我连不上的控制台上等待输入,而那个界面根本打不开。&lt;/p&gt;
&lt;p&gt;四处查了一下之后,我偶然发现了一个 &lt;a href=&quot;https://serverfault.com/questions/19634/how-to-reconnect-to-a-disconnected-ssh-session&quot;&gt;Serverfault 帖子&lt;/a&gt;,里面提到可以用 &lt;code&gt;reptyr&lt;/code&gt; 通过 SSH 接管终端会话。&lt;/p&gt;
&lt;p&gt;这里记录一下具体做了什么,以便把会话拿回来并完成升级:&lt;/p&gt;
&lt;p&gt;来自&lt;a href=&quot;https://serverfault.com/questions/19634/how-to-reconnect-to-a-disconnected-ssh-session#comment1506308_979180&quot;&gt;这条评论&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; clone&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; https://github.com/nelhage/reptyr&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; reptyr&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;make&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样就在机器上安装好了 &lt;code&gt;reptyr&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;然后我用 &lt;code&gt;ps ax | grep pts&lt;/code&gt; 查找所有打开的会话,找到我要的那个进程。&lt;/p&gt;
&lt;p&gt;接着我在调用树中找到分配了 &lt;code&gt;pts&lt;/code&gt; 的最顶层父进程,并通过它的 PID 附加上去:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;reptyr&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -T&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1390511&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后我就能完成升级了!🎉&lt;/p&gt;</content:encoded><category>dev</category><category>Uncategorized</category></item><item><title>晨光下的木槿花</title><link>https://bisko.be/zh/posts/blog/hibiscus-plant-under-the-morning-rays/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/hibiscus-plant-under-the-morning-rays/</guid><pubDate>Sun, 21 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;一朵对焦清晰的大红色木槿花,上方有几个花蕾,背景是飘着薄云的蓝天和远处的村舍&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3024&quot; height=&quot;4032&quot; src=&quot;/_astro/img_2327-b97d8968.C7nMUQ33_Z1YnOwk.webp&quot; &gt;&lt;/p&gt;</content:encoded><category>blog</category><category>Photography</category><category>flower</category><category>flowers</category><category>nature</category></item><item><title>延时摄影:河边的波尔图</title><link>https://bisko.be/zh/posts/blog/timelapse-porto-by-the-river/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/timelapse-porto-by-the-river/</guid><description>几天前,我们在波尔图办了一次团队聚会。终于见到了几位过去两年里我只在 Zoom 上见过的同事。我们在很棒的 Porto I/O Riverside 联合办公空间待了几天。那里有个很赞的阳台,我们毫不客气地好好享受了一番,还有</description><pubDate>Tue, 07 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;几天前,我们在&lt;a href=&quot;https://en.wikipedia.org/wiki/Porto&quot;&gt;波尔图&lt;/a&gt;办了一次团队聚会。终于见到了几位过去两年里我只在 Zoom 上见过的同事。&lt;/p&gt;
&lt;p&gt;我们在很棒的 &lt;a href=&quot;https://porto.io/en/location/riverside/&quot;&gt;Porto I/O Riverside&lt;/a&gt; 联合办公空间待了几天。&lt;/p&gt;
&lt;p&gt;这里有个很赞的阳台,我们毫不客气地好好享受了一番,不少富有成效的讨论就是在那里进行的,当然,前提是我们没有太沉迷于盯着河上来来往往的船只发呆。&lt;/p&gt;
&lt;p&gt;就在其中一次大家安静地坐着、欣赏风景的时刻,我成功拍下了一段相当美的延时摄影。&lt;/p&gt;</content:encoded><category>blog</category><category>Adventures</category><category>Photography</category><category>Timelapse</category><category>travel</category><category>boats</category><category>Porto</category><category>Portugal</category><category>river</category><category>roofs</category></item><item><title>[Linux] Syncthing – 以服务方式运行时出现只读文件系统错误</title><link>https://bisko.be/zh/posts/dev/linux-syncthing-read-only-file-system-when-running-as-service/</link><guid isPermaLink="true">https://bisko.be/zh/posts/dev/linux-syncthing-read-only-file-system-when-running-as-service/</guid><description>我用 Syncthing 把工作副本同步到本地开发服务器已经有好几个月了。一开始我是登录后通过命令行手动运行它的,一直好好的,所以后来改成以服务方式运行时,我也没多想。</description><pubDate>Wed, 06 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我用 &lt;a href=&quot;https://syncthing.net/&quot;&gt;Syncthing&lt;/a&gt; 把工作副本同步到本地开发服务器已经有好几个月了。&lt;/p&gt;
&lt;p&gt;一开始我是登录后通过命令行手动运行它的。一切正常,所以后来改成以服务方式运行时,我也没多想。它启动了,也同步了一些数据,一切看起来都很好。&lt;/p&gt;
&lt;p&gt;当然,直到出问题为止!🙂&lt;/p&gt;
&lt;p&gt;原来日志里冒出了一堆错误,说开发服务器上的文件系统是只读的,导致 Syncthing 什么都同步不了,而我完全没注意到。&lt;/p&gt;
&lt;p&gt;我还以为是个 bug,只是文件夹显示为 &lt;code&gt;Out of Sync&lt;/code&gt;(不同步),实际上还是在同步的。结果我想错了。&lt;/p&gt;
&lt;p&gt;折腾了好几个小时,在论坛里搜了好几轮 Google 也没找到任何线索,最后我找到了 &lt;a href=&quot;https://wiki.archlinux.org/title/syncthing#read-only_file_system_error_on_/etc_although_run_as_root&quot;&gt;ArchWiki 上关于 Syncthing 的文章&lt;/a&gt;,里面提到的正是我遇到的情况:&lt;/p&gt;
&lt;p&gt;read-only file system error on /etc although run as root&lt;/p&gt;
&lt;p&gt;这和我的情况一模一样,只不过出问题的文件夹不是 &lt;code&gt;/etc&lt;/code&gt;,而是 &lt;code&gt;/usr/local/src&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;读完之后我才明白:如果你通过 &lt;code&gt;systemd&lt;/code&gt; 运行 Syncthing(或者任何东西),并且把服务的 &lt;code&gt;ProtectSystem&lt;/code&gt; 设成了 &lt;code&gt;full&lt;/code&gt;,那么某些目录默认就会变成只读,&lt;code&gt;/usr&lt;/code&gt; 就是其中之一。&lt;/p&gt;
&lt;p&gt;要解决这个问题,你需要在服务配置里加一行,然后重启服务(别忘了先 &lt;code&gt;daemon-reload&lt;/code&gt;):&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ReadWritePaths=/usr/local/src&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这样之后 Syncthing 就能正常工作了。&lt;/p&gt;</content:encoded><category>dev</category><category>Homelab</category><category>linux</category><category>permissions</category><category>read-only</category><category>syncthing</category><category>systemd</category></item><item><title>拒绝访问</title><link>https://bisko.be/zh/posts/blog/access-denied/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/access-denied/</guid><pubDate>Sat, 31 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;三只黄蜂在金属门柱上一个生锈的洞口周围爬行,其中一只停在插在锁孔里的钥匙上,旁边是白色的花朵&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3024&quot; height=&quot;4032&quot; src=&quot;/_astro/img_4506-8e7e236d.BcqhatkL_zWajt.webp&quot; &gt;&lt;/p&gt;</content:encoded><category>blog</category><category>Photography</category><category>door</category><category>insect</category><category>insects</category><category>key</category><category>lock</category><category>nature</category><category>wasp</category><category>wasps</category></item><item><title>薰衣草日落</title><link>https://bisko.be/zh/posts/blog/lavender-sunset/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/lavender-sunset/</guid><pubDate>Sat, 03 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;逆光下薰衣草花穗的剪影，低垂的太阳在最高的花茎后方发光，背景是蓝天和深色的树木&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/image_534908fa-cab6-4233-832b-e401bab27a30.img_3963-ccdc9838.CHRt9-9J_ZxRqVE.webp&quot; &gt;&lt;/p&gt;</content:encoded><category>blog</category><category>Photography</category><category>Uncategorized</category><category>flower</category><category>sun</category></item><item><title>延时摄影：风暴滚滚而来</title><link>https://bisko.be/zh/posts/blog/timelapse-a-storm-rolling-over/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/timelapse-a-storm-rolling-over/</guid><pubDate>Sat, 26 Jun 2021 00:00:00 GMT</pubDate><content:encoded/><category>blog</category><category>Photography</category><category>clouds</category><category>storm</category><category>Timelapse</category><category>weather</category></item><item><title>黄花上的阳光</title><link>https://bisko.be/zh/posts/blog/sunrays-on-yellow/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/sunrays-on-yellow/</guid><pubDate>Sat, 05 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;阳光下的黄色月见草花朵,雄蕊纤细,背景是虚化的绿叶和明亮的天空&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/image_42f35f6f-2341-47f4-a7a0-eb0a75d3678f.img_3167-8b4daa1a.WUo3hBS8_BI9FB.webp&quot; &gt;&lt;/p&gt;</content:encoded><category>blog</category><category>Photography</category><category>flower</category><category>sunrays</category><category>yellow</category></item><item><title>玫瑰</title><link>https://bisko.be/zh/posts/blog/roses/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/roses/</guid><pubDate>Sun, 23 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;蓝天映衬下，一丛攀缘玫瑰上鲜红的玫瑰花盛放，还有含苞待放的花蕾，右侧可见屋檐一角&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_2866-bd30e710.fEDlZ8s7_Z3rCvg.webp&quot; &gt;&lt;/p&gt;</content:encoded><category>blog</category><category>Uncategorized</category></item><item><title>多云,偶有郁金香</title><link>https://bisko.be/zh/posts/blog/cloudy-with-a-chance-of-tulips/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/cloudy-with-a-chance-of-tulips/</guid><description>回到 2013 年,那时我去村里看望爷爷。在路边发现了这朵被剪下来、随手丢弃的漂亮郁金香。</description><pubDate>Mon, 03 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;一朵红色郁金香逆着阳光,从下往上拍,背景是深蓝色的天空和白云,旁边有一片绿叶向上伸展&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1936&quot; height=&quot;2592&quot; src=&quot;/_astro/img_1645-bb728269.BHDQHNQt_1vNnmk.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;回到 2013 年,那时我去村里看望爷爷。在路边发现了这朵被剪下来、随手丢弃的漂亮郁金香。&lt;/p&gt;</content:encoded><category>blog</category><category>Photography</category><category>clouds</category><category>flower</category><category>flowers</category><category>nature</category><category>red</category><category>sky</category><category>travel</category></item><item><title>[Linux] 在多台服务器上并行执行多条命令</title><link>https://bisko.be/zh/posts/dev/linux-running-multiple-commands-on-multiple-servers-in-parallel/</link><guid isPermaLink="true">https://bisko.be/zh/posts/dev/linux-running-multiple-commands-on-multiple-servers-in-parallel/</guid><description>我家里有一个跑着 Docker Swarm 的树莓派集群。为了方便维护,它们使用相同的配置——用户、Docker 版本等等。有时候某些更新需要在集群的所有节点上执行同样的操作,比如创建一个新的 Docker macvlan 网络。要做到这一点,</description><pubDate>Mon, 19 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我家里有一个跑着 Docker Swarm 的树莓派集群。为了方便维护,它们使用相同的配置——用户、Docker 版本等等。&lt;/p&gt;
&lt;p&gt;有时候某些更新需要在集群的所有节点上执行同样的操作,比如创建一个新的 Docker macvlan 网络。&lt;/p&gt;
&lt;p&gt;要做到这一点,要么就得在所有节点上手动执行相同的命令:挨个 &lt;strong&gt;ssh&lt;/strong&gt; 进去,跑完命令,再换下一台。&lt;/p&gt;
&lt;p&gt;既然我想着从长远来看少干点活、把一切弄得尽可能井井有条,我就开始研究怎么同时在所有节点上执行命令。&lt;/p&gt;
&lt;h3 id=&quot;第一轮自己写-python-脚本&quot;&gt;第一轮:自己写 Python 脚本&lt;/h3&gt;
&lt;p&gt;第一次尝试是自己写一个 Python 脚本。一方面是想顺便把 Python 学得更扎实一点,另一方面是我找不到一种更原生的方式来执行命令。&lt;/p&gt;
&lt;p&gt;可想而知(嘿,我对这门语言还没多少经验 🙂),它很快就变成了一团臃肿的乱麻,而且特别容易出问题。&lt;/p&gt;
&lt;p&gt;我得找个别的办法,不用再去重新理解三周前写的东西,也不用再琢磨上次到底是什么搞崩了。&lt;/p&gt;
&lt;h3 id=&quot;第二轮pssh&quot;&gt;第二轮:&lt;code&gt;pssh&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;四处搜索的时候,我偶然发现了 &lt;code&gt;[pssh](https://linux.die.net/man/1/pssh)&lt;/code&gt;,它可以通过 SSH 并行执行任务。&lt;/p&gt;
&lt;p&gt;总的来说,把它跑起来还挺容易的。&lt;/p&gt;
&lt;p&gt;问题在于,有些操作需要通过 &lt;code&gt;sudo&lt;/code&gt; 来执行。到处传递密码可不是什么好主意,所以我又得去找办法,弄清楚怎么在远程服务器要求输入密码时把 &lt;code&gt;sudo&lt;/code&gt; 密码发过去。&lt;/p&gt;
&lt;p&gt;结果发现,只要你碰巧看到对的 &lt;a href=&quot;https://unix.stackexchange.com/a/487558/134974&quot;&gt;StackOverflow 评论&lt;/a&gt;,这事儿就简单得很。&lt;/p&gt;
&lt;h3 id=&quot;太长不看版&quot;&gt;太长不看版:&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;stty&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -echo&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;printf&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Password: &quot;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;read&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; PASS&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;stty&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; echo&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;echo&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;${&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;PASS&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;}&quot;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pssh&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -h&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;HOSTFIL&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;E&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -o&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; /tmp/output&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -t&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -I&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;`&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; ./commands.sh`&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;-I &quot;`cat ./commands.sh`&quot;&lt;/code&gt; 必须写成这样(用引号和反引号包起来),否则命令无法正确执行。密码会作为单独的一条命令发送,而不会被当作 &lt;strong&gt;sudo&lt;/strong&gt; 的输入。&lt;/p&gt;
&lt;p&gt;另一个要注意的地方是,由于这样的设置方式,执行 &lt;code&gt;sudo&lt;/code&gt; 时需要加上 &lt;code&gt;-S&lt;/code&gt; 参数,才能正确读取密码输入。&lt;/p&gt;</content:encoded><category>dev</category><category>Uncategorized</category></item><item><title>星空之夜</title><link>https://bisko.be/zh/posts/blog/starry-night/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/starry-night/</guid><description>最近我们去保加利亚的山里度了个假。其中一个晚上,天空晴朗得足以让我试试新款 iPhone 12 的夜景拍照模式。最初几次尝试的照片噪点有点多,细节也不太明显。幸好我把这张照片分享给了我表哥,他提到</description><pubDate>Tue, 09 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近我们去保加利亚的山里度了个假。&lt;/p&gt;
&lt;p&gt;其中一个晚上,天空晴朗得足以让我试试新款 iPhone 12 的夜景拍照模式。&lt;/p&gt;
&lt;p&gt;最初几次尝试的照片噪点有点多,细节也不太明显。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;阳台上透过屋檐下方望去,松树和星星上方泛着微弱的绿色极光光晕&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_1381-10c608c2.DVecqBvr_Z1VJ5i5.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;幸好我把这张照片分享给了我表哥,他说我也许可以试试用 RAW 格式拍摄,因为它能保留更多信息,拍完之后还可以再调整。&lt;/p&gt;
&lt;p&gt;于是我开启了以 ProRAW 格式保存照片。拍出来的结果和上面这张差不多,但接着我就在 iOS 的“照片”应用里编辑了这张照片,没有借助任何外部工具。&lt;/p&gt;
&lt;p&gt;稍微调整几下之后,深色的夜空背景上,细节一下子就清晰地浮现出来了。&lt;/p&gt;
&lt;p&gt;最终的成品看起来相当不错!&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;漆黑的星空,绿色灯光映照的松树上方有一片苍白发亮的雾霭,画面被阳台栏杆框住&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_1380-3c06f94f.9xJS155n_VMvSG.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;关于这张照片还有个有趣的小插曲——天空中那片明亮的光晕其实是酒店烟囱冒出的烟,我是拍照时才发现的,肉眼根本看不到。当时实在是太黑了。&lt;/p&gt;
&lt;p&gt;以后我肯定还会继续在更晴朗、更黑暗的夜空下尝试夜景模式摄影!&lt;/p&gt;</content:encoded><category>blog</category><category>Photography</category><category>night-photos</category><category>travel</category></item><item><title>怪怪雪人</title><link>https://bisko.be/zh/posts/blog/weirdy-the-snowman/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/weirdy-the-snowman/</guid><description>有时候雪冻得太硬,根本捏不成雪人需要的雪球。这种时候,干嘛不像搭乐高一样,一块砖一块砖、一层一层地把它砌出来呢?</description><pubDate>Sun, 31 Jan 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;一个雪人,头戴金属漏勺帽,胡萝卜鼻子,眼睛带红圈,嘴巴是红色的,两条青绿色树枝手臂,立在积雪的木桌上&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3024&quot; height=&quot;4032&quot; src=&quot;/_astro/image_af25d50e-4c23-444f-9224-f7c5c1bceca3.img_0953-83f032c2.C2lW_tiM_1jpdxL.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;有时候雪冻得太硬,根本捏不成雪人需要的雪球。这种时候,干嘛不像搭乐高一样,一块砖一块砖、一层一层地把它砌出来呢?&lt;/p&gt;</content:encoded><category>blog</category><category>Uncategorized</category><category>Winter</category><category>ice</category><category>snowman</category></item><item><title>蚱蜢</title><link>https://bisko.be/zh/posts/blog/the-grasshopper/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/the-grasshopper/</guid><description>某个相当寒冷的早晨，我发现这个小家伙正悠闲地待在我的车旁边。</description><pubDate>Tue, 08 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;一只绿色的、形似螽斯的蚱蜢站在粗糙的灰色柏油路面上，长长的触角拖在身后，背景是模糊的草地&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_0416-de3b3257.C7SwA0Oo_ZcuH8m.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;某个相当寒冷的早晨，我发现这个小家伙正悠闲地待在我的车旁边。&lt;/p&gt;</content:encoded><category>blog</category><category>Uncategorized</category><category>Animals</category><category>cold</category><category>grasshopper</category><category>green</category><category>morning</category><category>Photography</category></item><item><title>“铅笔”</title><link>https://bisko.be/zh/posts/blog/the-pencil/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/the-pencil/</guid><description>最近一次旅行,我们去了山里。那是个清幽僻静的好地方,只有几栋房子和一家餐馆,旁边是一座废弃的人工湖/水坝。蚊子和酷热是我们的头号敌人,不过我们还是勉强熬了过来。周围没什么可玩的,我们只好自己想办法找乐子。</description><pubDate>Sun, 08 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;一根饱经风霜的浮木棍,尖端被削尖,上面有几个小孔,躺在深色木板地面上&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_3189-041bec7e.ylsLA4bE_Zu4r9W.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;最近一次旅行,我们去了山里。那是个清幽僻静的好地方,只有几栋房子和一家餐馆,旁边是一座废弃的人工湖/水坝。&lt;/p&gt;
&lt;p&gt;蚊子和酷热是我们的头号敌人,不过我们还是勉强熬了过来。&lt;/p&gt;
&lt;p&gt;周围没什么可玩的,我们只好自己想办法找乐子。幸运的是,我儿子偶然发现了一块长方形的大石头,觉得抱着它到处走特别有意思。我也觉得挺有意思的。&lt;/p&gt;
&lt;p&gt;石头的每一面纹理都不一样,就像不同粗细的砂纸。&lt;/p&gt;
&lt;p&gt;我们还捡了一堆旧树枝,都是从周围的树上掉下来的。&lt;/p&gt;
&lt;p&gt;认真考虑了几秒钟之后,我们就开始探索把树枝磨得更尖的奇妙世界。&lt;/p&gt;
&lt;p&gt;其中一根树枝磨出来简直就像一支铅笔!它有个大小刚刚好的孔,正好可以塞进一小截真铅笔的笔芯,而且居然真的能写!&lt;/p&gt;
&lt;p&gt;我们用它在地上到处涂涂画画,太棒了。&lt;/p&gt;</content:encoded><category>blog</category><category>Quick &amp;amp; Easy</category><category>travel</category><category>Adventures</category><category>forest</category><category>stone</category><category>woodwork</category></item><item><title>雪花莲</title><link>https://bisko.be/zh/posts/blog/snowdrops/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/snowdrops/</guid><description>回到2007年。</description><pubDate>Thu, 08 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;三朵带绿色斑纹的白色雪花莲垂首立在纤细的花茎上，旁边是一截树干和一道木栅栏&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1024&quot; height=&quot;768&quot; src=&quot;/_astro/c7a42ddf-26db-487f-8ca3-20b5ef6704dc_1_105_c-bd84ccbc.nK60jHnF_Z1KzMGp.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;回到2007年。&lt;/p&gt;</content:encoded><category>blog</category><category>Photography</category><category>flowers</category><category>snowdrops</category></item><item><title>仅用命令行工具猜解纯数字 ZIP 文件密码</title><link>https://bisko.be/zh/posts/dev/guessing-a-numeric-zip-file-password-only-with-command-line-utilities/</link><guid isPermaLink="true">https://bisko.be/zh/posts/dev/guessing-a-numeric-zip-file-password-only-with-command-line-utilities/</guid><description>今天我收到了网络服务商的月度账单，有件事让我觉得挺奇怪。邮件里附带的账单是一个带密码的 ZIP 文件。先不说在当下这个年代（垃圾邮件、恶意软件、钓鱼攻击满天飞）收到一个 ZIP 格式的附件本身就很诡异，他们选的密码也弱得让人吃惊，</description><pubDate>Mon, 14 Sep 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今天我收到了网络服务商的月度账单，有件事让我觉得挺奇怪。&lt;/p&gt;
&lt;p&gt;邮件里附带的账单是一个带密码的 ZIP 文件。&lt;/p&gt;
&lt;p&gt;先不说在当下这个年代（垃圾邮件、恶意软件、钓鱼攻击满天飞）收到一个 ZIP 格式的附件本身就很诡异，他们选的密码也弱得让人吃惊。&lt;/p&gt;
&lt;p&gt;密码是账户持有人的生日，格式为 &lt;code&gt;YYMMDD&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;我在健身房的时候，脑子里粗略算了一下，发现可能的组合数其实少得可怜。用了个在线工具算出从 1900-01-01 到现在经过了多少天（因为不是所有组合都能对应一个有效日期）之后，发现组合数一共只有 44,075 种（截止到 2020-09-14）。&lt;/p&gt;
&lt;p&gt;我知道那些用 GPU 算力跑哈希破解的优化工具，每秒能猜几百万次。但我当时只能在健身房用一台 VPS，所以我想看看，不借助这些工具、只用 Linux/macOS 的命令行，能多快猜出密码。&lt;/p&gt;
&lt;p&gt;我写出了下面这段代码，可以在 macOS 上运行：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;echo {1..44000} | xargs -P 16 -n 1 -I{} date -v &quot;-{}d&quot; +&quot;%y%m%d&quot; | xargs -P 16 -I{} sh -c &apos;unzip -qqoP &quot;{}&quot; 0417160508.zip &amp;#x26;&amp;#x26; echo &quot;{}&quot; &amp;#x26;&amp;#x26; exit 255&apos;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这条命令看起来挺复杂，但原理其实很简单。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;echo {1..44000}&lt;/code&gt; 生成从 1 到 44,000 的数字，传给下一步。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;xargs -P 16 -n 1 -I{} date -v &quot;-{}d&quot; +&quot;%y%m%d&quot;&lt;/code&gt; —— 接收第一步的输入，利用 &lt;code&gt;date&lt;/code&gt; 的功能（给日期“加减”特定天数）生成 &lt;code&gt;YYMMDD&lt;/code&gt; 格式的日期。这里是从当前日期往回减去 X 天，X 就是第一步生成的数字。这样就能一路生成从今天到 1900 年代的日期。&lt;/p&gt;
&lt;p&gt;第三步是最有意思的部分，我把它拆成两块来说：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;xargs -P 16 -I{} sh -c &apos;...&apos;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这一步拿第二步生成的日期，对每个日期执行一条命令。&lt;code&gt;-P 16&lt;/code&gt; 表示用 16 个并行进程来跑，这样处理速度更快。第二步生成日期时也用了同样的技巧来提速。&lt;/p&gt;
&lt;p&gt;第二部分才是真正猜密码的地方：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;unzip -qqoP &quot;{}&quot; 0417160508.zip &amp;#x26;&amp;#x26; echo &quot;{}&quot; &amp;#x26;&amp;#x26; exit 255&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这段代码先尝试用第二步生成的密码解压 ZIP 文件。如果成功了，就会打印（&lt;code&gt;echo&lt;/code&gt;）这次猜中的密码，然后 &lt;code&gt;exit 255&lt;/code&gt; 强制让 &lt;code&gt;xargs&lt;/code&gt; 停止运行。毕竟密码已经找到了，没必要继续猜下去。&lt;/p&gt;
&lt;p&gt;总而言之，拿这个当作文件密码实在是个相当糟糕的决定，因为运行上面这条命令，大概只花了 10 秒钟就猜出了我账单的正确密码。换成别人来猜，估计也快不了多少。&lt;/p&gt;</content:encoded><category>dev</category><category>Uncategorized</category></item><item><title>世界各地的涂鸦:保加利亚,布尔加斯</title><link>https://bisko.be/zh/posts/blog/graffiti-around-the-world-burgas-bulgaria/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/graffiti-around-the-world-burgas-bulgaria/</guid><description>最近我偶然看到了朋友的这张照片。绝对符合这个系列!</description><pubDate>Tue, 08 Sep 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;一幅色彩缤纷的街头壁画:一只橙色的蜗牛,黄色螺旋形的壳上长着蘑菇,还有长着眼睛的小生物、一只不明飞行物和一个绿色外星人&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1440&quot; height=&quot;1087&quot; src=&quot;/_astro/img_1545-6a461b59.DrLukEK8_ozvWH.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;迷幻蜗牛&lt;/p&gt;
&lt;p&gt;最近我偶然看到了朋友的这张照片。绝对符合这个系列!&lt;/p&gt;</content:encoded><category>blog</category><category>Uncategorized</category></item><item><title>新轮子</title><link>https://bisko.be/zh/posts/blog/the-new-wheel/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/the-new-wheel/</guid><description>最近在一个山村旅行时，我们发现了这辆卡车，它少了一个后轮。儿子看到卡车“受伤”了很不开心，于是我们决定给它临时做一个轮子。找到一个水瓶盖后，我们用小刀施了点魔法，切掉瓶盖的一部分，让它刚好合适。</description><pubDate>Sat, 08 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;一辆黄色的玩具水泥搅拌车，后轮是手工做的蓝色轮子，和前面黑色配黄色轮毂的轮子很不搭&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_1070-1bce5de4.PNKa8g3z_Z1B6f9F.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;最近在一个山村旅行时，我们发现了这辆卡车，它少了一个后轮。&lt;/p&gt;
&lt;p&gt;儿子看到卡车“受伤”了很不开心，于是我们决定给它临时做一个轮子。&lt;/p&gt;
&lt;p&gt;找到一个水瓶盖后，我们用小刀施了点魔法，把瓶盖切掉一部分，让它刚好合适。&lt;/p&gt;
&lt;p&gt;再拿打火机快速烤一下，把塑料融化，我们就把它焊在了那个缺轮子的车轴上。&lt;/p&gt;
&lt;p&gt;而且它居然真的能用！&lt;/p&gt;
&lt;p&gt;快看它跑起来！&lt;/p&gt;</content:encoded><category>blog</category><category>Quick &amp;amp; Easy</category><category>Second Chances</category><category>diy</category><category>fixing</category><category>toys</category></item><item><title>处理 PHP 中的意大利面条式代码:用匿名函数提取模板代码片段</title><link>https://bisko.be/zh/posts/dev/dealing-with-spaghetti-code-in-php-using-anonymous-functions-to-extract-pieces-of-template-code/</link><guid isPermaLink="true">https://bisko.be/zh/posts/dev/dealing-with-spaghetti-code-in-php-using-anonymous-functions-to-extract-pieces-of-template-code/</guid><description>最近我在帮一个朋友理清一些代码,并研究怎么改才能很好地配合对后端的异步调用。如果还能顺便写得更模块化、更可复用,那就更好了。这些代码是一个 WordPress 插件,写的时候</description><pubDate>Sat, 08 Aug 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近我在帮一个朋友理清一些代码,并研究怎么改才能很好地配合对后端的异步调用。如果还能顺便写得更模块化、更可复用,那就更好了。&lt;/p&gt;
&lt;p&gt;这些代码是一个 WordPress 插件,用的是非常老派的写法:业务逻辑和前端逻辑混在一起,数据处理就夹在模板代码中间,诸如此类。&lt;/p&gt;
&lt;p&gt;基本上就是你在 21 世纪初的 PHP 站点里见过的那种东西,那时候这门语言还没有那些很棒的 OOP 特性,也没有一堆成熟的框架。&lt;/p&gt;
&lt;p&gt;我今天啃的这个场景是这样的:有一个表格,展示一堆条目。我们需要给表格加几个筛选器,并且通过 AJAX 来工作,这样就能快速刷新 UI,而不用重新加载整个 WordPress 后台页面。&lt;/p&gt;
&lt;p&gt;筛选数据很简单:写一个内联的 &lt;code&gt;array_filter&lt;/code&gt;,在数据传给模板代码之前先过滤一下(为了保持同样的代码风格,这段也写在模板文件里 😇)。&lt;/p&gt;
&lt;p&gt;问题出在我们开始让表格能通过 AJAX 渲染的时候。&lt;/p&gt;
&lt;p&gt;表格夹在一大堆其他模板代码和业务代码中间。如果想让 AJAX 只输出表格,我们只有几种办法。&lt;/p&gt;
&lt;p&gt;第一种办法,是把表格前后的 HTML 都包在巨大的 &lt;code&gt;if&lt;/code&gt; 语句里,确保它们不会被渲染出来。&lt;/p&gt;
&lt;p&gt;另一种办法,是把模板抽到单独的文件里,然后在我们于插件代码中定义的 AJAX action 里 include 它。&lt;/p&gt;
&lt;p&gt;匿名函数来救场!&lt;/p&gt;
&lt;p&gt;我琢磨着怎么用最简单的方式搞定这件事,就试着定义一个普通的 PHP 函数,把表格代码放进去,但这里有个问题。&lt;/p&gt;
&lt;p&gt;这段代码运行在一个类的方法里,表格模板中有对 &lt;code&gt;$this&lt;/code&gt; 的引用。如果不想大改代码,我们就得把 &lt;code&gt;$this&lt;/code&gt; 当作函数参数传进去。可惜这行不通,因为你没法把 &lt;code&gt;$this&lt;/code&gt; 当参数传 🤷‍♂️。&lt;/p&gt;
&lt;p&gt;我有点失望,因为这意味着模板里要重写一堆东西,而且有不少引用我们都得顾及到,才能保证它继续正常工作。&lt;/p&gt;
&lt;p&gt;然后我想起来,这个站点跑的不是 PHP5.2,而是 PHP7,支持匿名函数。&lt;/p&gt;
&lt;p&gt;匿名函数还有个很好用的特性:你可以指定调用时,从调用方作用域里把哪些变量传给这个函数。比如:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;php&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;$table_function &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ( $pages, $current_page, $items ) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // ... Table render code&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样你就可以在函数体里直接引用 &lt;code&gt;$pages&lt;/code&gt; 或 &lt;code&gt;$items&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;最棒的是,你还可以把 &lt;code&gt;$this&lt;/code&gt; 也作为变量传进函数作用域!&lt;/p&gt;
&lt;p&gt;于是我们就能把表格渲染代码完整地抽到一个单独的函数里,在 AJAX 调用时单独调用它了!&lt;/p&gt;
&lt;p&gt;当然,函数体里用到的变量必须是已定义的,所以一定要小心 AJAX 函数能在哪里被调用。&lt;/p&gt;
&lt;p&gt;对我们来说,这意味着会在主类里加一个很小的 action,它仍然会 require 那个文件,但我们能更好地控制并关掉其他所有会产生的输出。&lt;/p&gt;</content:encoded><category>dev</category><category>Snippets</category><category>lambda-functions</category><category>php</category><category>WordPress</category></item><item><title>世界各地的涂鸦:马</title><link>https://bisko.be/zh/posts/blog/graffiti-around-the-world-horses/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/graffiti-around-the-world-horses/</guid><description>保加利亚索非亚的儿童游乐场</description><pubDate>Wed, 08 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;一幅壁画,画着十个风格化的立体主义马头,颜色有黄、黑、紫、灰、橙、蓝、白和棕,背景为蓝粉相间&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;6435&quot; height=&quot;2755&quot; src=&quot;/_astro/img_1222-8152ca52.D5sLohsY_Z2jrb7b.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;保加利亚索非亚的儿童游乐场&lt;/strong&gt;&lt;/p&gt;</content:encoded><category>blog</category><category>Graffiti</category><category>horses</category><category>Photography</category><category>travel</category></item><item><title>延时摄影:多伦多皮尔逊机场的傍晚降落</title><link>https://bisko.be/zh/posts/blog/timelapse-evening-landing-at-toronto-pearaon-airport/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/timelapse-evening-landing-at-toronto-pearaon-airport/</guid><description>多伦多皮尔逊机场的傍晚降落——2018年9月28日</description><pubDate>Mon, 08 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;多伦多皮尔逊机场的傍晚降落——2018年9月28日&lt;/p&gt;</content:encoded><category>blog</category><category>Adventures</category><category>travel</category><category>Airplane</category><category>Canada</category><category>Landing</category><category>Timelapse</category><category>Toronto</category></item><item><title>长颈鹿</title><link>https://bisko.be/zh/posts/blog/the-giraffe/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/the-giraffe/</guid><description>玩乐高得宝时，冒出了一个很漂亮的图案</description><pubDate>Fri, 08 May 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;一面由紫色、黄色、红色、蓝色和绿色长方形玩具积木拼成的墙，靠近顶部有一块小长颈鹿身高尺图块&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2734&quot; height=&quot;3645&quot; src=&quot;/_astro/img_0214-37c92416.DWchMgfS_ZILsQg.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;玩乐高得宝时，冒出了一个很漂亮的图案&lt;/p&gt;</content:encoded><category>blog</category><category>Animals</category><category>Photography</category><category>blocks</category><category>building</category><category>duplo</category><category>lego</category></item><item><title>Arduino/ESP32:禁用任务看门狗</title><link>https://bisko.be/zh/posts/dev/arduino-esp32-disabling-the-task-watchdog/</link><guid isPermaLink="true">https://bisko.be/zh/posts/dev/arduino-esp32-disabling-the-task-watchdog/</guid><description>最近我一直在折腾 ESP32 的多核功能,以及把任务固定到特定核心上。我用 AutoConnect 来支持 WiFi 连接,这样就不用把凭据写死在代码里,还能通过网页界面进行 OTA 更新。这是为一个项目准备的,它要控制一些 CPU 4 针 PWM 风扇,这些风扇就放在</description><pubDate>Wed, 29 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近我一直在折腾 ESP32 的多核功能,以及把任务固定到特定核心上。&lt;/p&gt;
&lt;p&gt;我用 &lt;a href=&quot;https://github.com/Hieromon/AutoConnect&quot;&gt;AutoConnect&lt;/a&gt; 来支持 WiFi 连接,这样就不用把凭据写死在代码里,还能通过网页界面进行 OTA 更新。&lt;/p&gt;
&lt;p&gt;这是为一个项目准备的:控制我服务器机柜里的几个 CPU 4 针 PWM 风扇,给里面的空气降温。为此我想把逻辑拆成两个任务。&lt;/p&gt;
&lt;p&gt;一个任务负责处理 API、传感器读取、更新、WiFi 等等,另一个任务负责中断和风扇的 PWM 控制。&lt;/p&gt;
&lt;p&gt;一切都很顺利,任务也创建好了,但运行代码时,如果让 ESP32 进入需要你先连上它、再告诉它去连你的 WiFi 网络的那种模式,它就开始出现奇怪的行为:每隔几秒就重启一次控制器,我怎么都没法完成连接。&lt;/p&gt;
&lt;p&gt;那段时间真是烦人,我不得不把控制器从原位拆下来,接上 USB 去刷新固件。&lt;/p&gt;
&lt;p&gt;折腾完之后我注意到,错误来自看门狗:&lt;/p&gt;
&lt;p&gt;Task watchdog got triggered. The following tasks did not feed the watchdog in time:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;IDLE (CPU 1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Tasks currently running:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;CPU 0: ManageTask&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;CPU 1: ControllerTask&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;四处查了查,看起来这是由 ESP32 的任务看门狗(Task Watchdog)触发的,它用来确保各个任务都能轮到 CPU 执行。&lt;/p&gt;
&lt;p&gt;而且看起来,和直接跟其他所有代码、功能一起在任务之外运行相比,AutoConnect 在任务环境下运行时不太灵活。&lt;/p&gt;
&lt;p&gt;我挖了挖,试了各种办法,发现摆脱这种局面最简单的方法,就是直接禁用看门狗,然后祈祷一切都能及时执行 🙂 这个任务并不是关键任务,所以多等一会儿让它把手头的事做完也无妨。&lt;/p&gt;
&lt;p&gt;要禁用看门狗,你需要做两件事:&lt;/p&gt;
&lt;p&gt;第一,引入 &lt;code&gt;esp_task_wdt.h&lt;/code&gt; 头文件。为此,在你的 include 部分加上 &lt;code&gt;#include &amp;#x3C;esp_task_wdt.h&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;第二,让看门狗不再重置控制器,并且等待更长时间。为此,你需要在任务代码的开头加上 &lt;code&gt;esp_task_wdt_init(30, false);&lt;/code&gt;。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; manage_core_task&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt;pv_parameters&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    esp_task_wdt_init&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // .... rest of the code ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这会把看门狗的超时时间设为 30 &lt;strong&gt;秒&lt;/strong&gt;,并且在它被触发时不再重置控制器。&lt;/p&gt;
&lt;p&gt;如果你希望看门狗触发后仍然重置控制器,把函数调用的第二个参数从 &lt;code&gt;false&lt;/code&gt; 改成 &lt;code&gt;true&lt;/code&gt; 即可。&lt;/p&gt;</content:encoded><category>dev</category><category>Uncategorized</category><category>arduino</category><category>code</category><category>esp32</category><category>espressif</category><category>multi-core</category><category>multi-threading</category></item><item><title>🌼 &amp; 🐝</title><link>https://bisko.be/zh/posts/blog/%F0%9F%8C%BC-%F0%9F%90%9D/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/%F0%9F%8C%BC-%F0%9F%90%9D/</guid><pubDate>Tue, 14 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;一只蜜蜂停在一朵白色的雏菊状菊花上,四周是花坛里白色、黄色、粉色和橙红色的花朵&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1024&quot; height=&quot;768&quot; src=&quot;/_astro/image-1-c44a4a22.DM-UJBpr_ZsDCIE.webp&quot; &gt;&lt;/p&gt;</content:encoded><category>blog</category><category>Uncategorized</category><category>bee</category><category>bees</category><category>flower</category><category>flowers</category></item><item><title>旅行也需要从旅行中歇一歇</title><link>https://bisko.be/zh/posts/blog/when-travel-needs-a-break-from-travel/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/when-travel-needs-a-break-from-travel/</guid><description>当孩子觉得旅行箱也该休息一下的时候。</description><pubDate>Sat, 14 Mar 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;一顶橙色的室内弹出式帐篷，里面放着一张床垫和三个行李箱，背景是阳光洒满的客厅，有一张沙发和一个儿童滑梯&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1024&quot; height=&quot;768&quot; src=&quot;/_astro/image-ef37b29d.BszBkRqS_1jMq5e.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;当孩子觉得旅行箱也该休息一下的时候。&lt;/p&gt;</content:encoded><category>blog</category><category>Uncategorized</category><category>fun</category><category>travel</category></item><item><title>世界各地的涂鸦:都柏林</title><link>https://bisko.be/zh/posts/blog/graffiti-around-the-world-dublin/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/graffiti-around-the-world-dublin/</guid><description>几个月前我们去都柏林旅行,我惊讶地发现那里有这么多出色的涂鸦艺术家。下面是其中的几幅。</description><pubDate>Fri, 14 Feb 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;几个月前我们去都柏林旅行,我惊讶地发现那里有这么多出色的涂鸦艺术家。&lt;/p&gt;
&lt;p&gt;下面是其中的几幅。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&quot;模板喷绘风格的街头艺术:一位年轻女子肩上停着一只小鸟,画在一个配电箱上,旁边是 Powers 爱尔兰威士忌的橱窗&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3024&quot; height=&quot;4032&quot; src=&quot;/_astro/img_7482-63b60082.Bxx3TjUc_1oK5zc.webp&quot; &gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&quot;彩绘配电箱:两个戴着扑粉假发的人物坐在剧院包厢里,其中一个长鼻子的人拿着一朵黄玫瑰,身后还站着一名男子&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3024&quot; height=&quot;4032&quot; src=&quot;/_astro/img_7716-cf4a09eb.BXnFmORL_Zwb0W.webp&quot; &gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&quot;夜晚的配电箱壁画:两名女子用手机自拍,其中一人坐在另一人的腿上,周围环绕着金色星星&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3024&quot; height=&quot;4032&quot; src=&quot;/_astro/img_7465-a1ef02f7.dem_I3k3_1u9UWt.webp&quot; &gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&quot;被画成复古磁带的配电箱,带有彩虹条纹,标着“Mixtape for Dublin”和“Stereo 120”&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3024&quot; height=&quot;4032&quot; src=&quot;/_astro/img_7670-a65a7a2d.6pMYI6Bw_Z15AP4O.webp&quot; &gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&quot;红色墙面壁画:一位留着胡子的老水手抽着烟斗,身旁是一只小狗,彩色玻璃风格的招牌上写着“Auld Dubliner”&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_7672-dbb3a83b.DFWmxWvS_ZOjwzR.webp&quot; &gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&quot;彩绘配电箱:一位卷发指挥面对一群张着嘴、橘色头发、身穿白色罩袍的歌手合唱团&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3024&quot; height=&quot;4032&quot; src=&quot;/_astro/img_7362-681994c0.Cob4Td7H_2gJf3X.webp&quot; &gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>blog</category><category>Graffiti</category><category>Dublin</category><category>Ireland</category><category>Photography</category><category>travel</category></item><item><title>为 Git 提交签名设置 YubiKey</title><link>https://bisko.be/zh/posts/dev/setting-up-a-yubikey-for-git-commit-signing/</link><guid isPermaLink="true">https://bisko.be/zh/posts/dev/setting-up-a-yubikey-for-git-commit-signing/</guid><description>我一直把 YubiKey 当作两步验证密钥，同时用它来给 Git 提交签名。几天前之前，我用的一直是 YubiKey 4。由于我现在的电脑没有任何 USB-A 接口，我的背包里总得带着 USB-A 转 USB-C 的转接头，过去一年里使用这把密钥一直很麻烦，对于</description><pubDate>Wed, 08 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我一直把 YubiKey 当作&lt;a href=&quot;https://en.wikipedia.org/wiki/Multi-factor_authentication&quot;&gt;两步验证&lt;/a&gt;密钥，同时用它来给 Git 提交签名。直到几天前，我用的一直是 YubiKey 4。由于我现在的电脑没有任何 USB-A 接口，我的背包里总得带着 USB-A 转 USB-C 的转接头，过去一年里使用这把密钥一直很麻烦。所以我决定是时候换成我那把“新”的 YubiKey 5C 了，这样就不用再折腾那些转接头了。&lt;/p&gt;
&lt;p&gt;其实这把密钥我早就有了，当时是因为 &lt;a href=&quot;https://www.yubico.com/2017/10/infineon-rsa-key-generation-issue/&quot;&gt;Infineon TPM&lt;/a&gt; 那个被他们发现的问题，我订了一把 YubiKey 4 作为替换，同时一起买了它，但直到现在我才决定换用新密钥。&lt;/p&gt;
&lt;p&gt;现在换的另一个原因是我的旧 GPG 密钥过期了，我不得不重新签发，所以正好可以用这把密钥来给我的 Git 提交签名。&lt;/p&gt;
&lt;h3 id=&quot;gpg-的疯狂&quot;&gt;GPG 的疯狂&lt;/h3&gt;
&lt;p&gt;如果你以前（或者现在）处理过 GPG 密钥，你就知道，对于从没接触过的人来说，想把它正确又安全地跑起来相当困难。主密钥要离线保存，公钥要来回倒腾，密钥过期后要重新签发，可能还要用旧密钥给新密钥签名以便验证，还要吊销密钥……哪怕只是在理论上遵循最佳实践都不容易，真要在实践中做到，事情就变得极其复杂了。&lt;/p&gt;
&lt;p&gt;网上大多数教程都是让你用命令行生成密钥，在设计模式很不常见的菜单里跳来跳去，想把它弄好简直是一种折磨。大多数教程还说要用离线机器（比如树莓派）和/或在离线状态下生成主密钥和子密钥，并且不要把主密钥放在你的电脑上。&lt;/p&gt;
&lt;p&gt;🤯&lt;/p&gt;
&lt;p&gt;过去将近 4 年里，每年一月初我都得面对这件事。每次看到下面这个错误，提示我的签名密钥已经过期，我都心头一紧。&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;error: gpg failed to sign the data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;fatal: failed to write commit object&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;今年我决定让这个过程变得简单得多，直接使用内置的证书生成功能，避开生成 GPG 密钥之类的所有麻烦。&lt;/p&gt;
&lt;h3 id=&quot;在-yubikey-上直接生成密钥&quot;&gt;在 YubiKey 上直接生成密钥&lt;/h3&gt;
&lt;p&gt;这种方式仍然需要使用命令行界面，但步骤更少，所以更直观一些。&lt;/p&gt;
&lt;p&gt;首先我们要设置好卡片/设备。&lt;/p&gt;
&lt;h3 id=&quot;卡片设备设置&quot;&gt;卡片/设备设置&lt;/h3&gt;
&lt;p&gt;在终端中运行 &lt;code&gt;gpg --card-status&lt;/code&gt;，你应该会看到类似下面的内容：&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Reader ………..: Yubico Yubikey 4 OTP U2F CCID&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Application ID …: &amp;#x3C;Serial number&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Version ……….: 2.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Manufacturer …..: Yubico&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Serial number ….: &amp;#x3C;Device serial number&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Name of cardholder: unspecified&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Language prefs …: en&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Sex …………..: unspecified&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;URL of public key : \[not set\]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Login data …….: &amp;#x3C;e-mail or nothing&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Signature PIN ….: not forced&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Key attributes …: rsa4096 rsa4096 rsa4096&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Max. PIN lengths .: 127 127 127&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;PIN retry counter : 3 0 3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Signature counter : 9&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你看到类似的内容，并且没有出现错误，就可以继续了。&lt;/p&gt;
&lt;p&gt;运行 &lt;code&gt;gpg --card-edit&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;你会进入一个命令行界面，开头显示的是同样的信息，底部是命令提示符 &lt;code&gt;gpg/card&gt;&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;输入 &lt;code&gt;admin&lt;/code&gt; 并按回车。&lt;/p&gt;
&lt;p&gt;现在你可以输入 &lt;code&gt;help&lt;/code&gt;，查看如何修改卡片的持有者信息和 PIN。&lt;/p&gt;
&lt;p&gt;有一件事你&lt;strong&gt;&lt;em&gt;必须&lt;/em&gt;&lt;/strong&gt;做，就是修改卡片的默认 PIN。一共有两个：第一个是用来访问卡上密钥的 PIN，第二个是“管理员”PIN，也叫 PUK（Personal Unblocking Code，个人解锁码）。&lt;/p&gt;
&lt;p&gt;要修改它们，输入 &lt;code&gt;passwd&lt;/code&gt;，你会看到一个菜单：&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;gpg/card&gt; passwd  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;gpg: OpenPGP card no. &amp;#x3C;Serial number&gt; detected&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1 - change PIN  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2 - unblock PIN  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3 - change Admin PIN  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4 - set the Reset Code  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Q - quit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输入 &lt;code&gt;1&lt;/code&gt;，按提示更新你的 PIN。默认 PIN 是 &lt;code&gt;123456&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;完成后，选择 &lt;code&gt;3&lt;/code&gt; 来修改管理员 PIN。默认值是 &lt;code&gt;12345678&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;两个 PIN 都改完之后，回到主菜单，继续完善密钥信息。&lt;/p&gt;
&lt;p&gt;你可以使用的命令有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt; – 修改持卡人姓名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;login&lt;/code&gt; – 修改持卡人的电子邮件地址或登录名&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;之后我们就可以进入真正的密钥生成环节了。&lt;/p&gt;
&lt;h3 id=&quot;生成密钥&quot;&gt;生成密钥&lt;/h3&gt;
&lt;p&gt;现在是时候真正生成密钥了。&lt;/p&gt;
&lt;p&gt;输入 &lt;code&gt;generate&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;你会被问到 &lt;code&gt;Make off-card backup of encryption key? (Y/n)&lt;/code&gt;，不过正如 YubiKey 文档中提到的，这只是一个形式上的备份，并不会创建私钥的完整备份，所以回答 &lt;code&gt;Yes&lt;/code&gt; 还是 &lt;code&gt;No&lt;/code&gt; 都无所谓。我回答的是 &lt;code&gt;No(n)&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果卡上已经存有密钥，系统会问你是否要替换它们：&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;gpg: Note: keys are already stored on the card!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Replace existing keys? (y/N)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请确保你不会替换掉某些没有备份的重要东西，然后输入 &lt;code&gt;Y&lt;/code&gt; 继续。如果里面有重要的东西，最好用 &lt;code&gt;Ctrl+C&lt;/code&gt; 退出整个流程。&lt;/p&gt;
&lt;p&gt;系统会要求你输入之前设置的卡片 PIN。&lt;/p&gt;
&lt;p&gt;接着你需要选择密钥的有效期：&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Please specify how long the key should be valid.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        0 = key does not expire&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;      &amp;#x3C;n&gt; = key expires in n days&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     &amp;#x3C;n&gt;w = key expires in n weeks&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     &amp;#x3C;n&gt;m = key expires in n months&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     &amp;#x3C;n&gt;y = key expires in n years&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; Key is valid for? (0)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你希望密钥只有 1 年有效期，输入 &lt;code&gt;1y&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;系统会要求你确认到期日期。检查一切无误后确认。&lt;/p&gt;
&lt;p&gt;然后系统会要求你输入密钥所有者的信息：&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Is this correct? (y/N) y&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;GnuPG needs to construct a user ID to identify your key.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Real name: &amp;#x3C;Your name&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Email address: &amp;#x3C;Your e-mail&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Comment: &amp;#x3C;Comment is optional&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; You selected this USER-ID:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;     &quot;&amp;#x3C;Your name&gt; &amp;#x3C;comment&gt; &amp;#x3C;your e-mail&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt; Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Type `O` to confirm if everything seems correct.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来会要求你输入管理员 PIN 或 PUK。这是必需的，因为它要对卡片执行写操作。&lt;/p&gt;
&lt;p&gt;然后如果一切正常，YubiKey 会开始闪烁，并且会持续闪一阵子（我这边大约要五分钟）。&lt;/p&gt;
&lt;p&gt;完成后你会看到下面的消息&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;gpg: key &amp;#x3C;Short ID&gt; marked as ultimately trusted&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;gpg: revocation certificate stored as &apos;/Users/bisko/.gnupg/openpgp-revocs.d/&amp;#x3C;LONG ID&gt;.rev&apos; public and secret key created and signed.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;记下 &lt;code&gt;&amp;#x3C;Short ID&gt;&lt;/code&gt;，我们后面会用到。&lt;/p&gt;
&lt;p&gt;此时你可以用 &lt;code&gt;quit&lt;/code&gt; 或 &lt;code&gt;Ctrl+C&lt;/code&gt; 退出 GPG 提示符。&lt;/p&gt;
&lt;p&gt;现在该保存公钥了，这样我们就能在另一台电脑上复用这把密钥。&lt;/p&gt;
&lt;p&gt;为此，运行下面的命令：&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;gpg&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --armor&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --export&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Short&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; I&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;D&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Short&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; I&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;D&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;.asc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这会把公钥导出到名为 &lt;code&gt;&amp;#x3C;Short ID&gt;.asc&lt;/code&gt; 的文件中。以后如果你想在另一台电脑上使用这把 YubiKey，或者丢失了 GPG 配置，就会用到它。&lt;/p&gt;
&lt;p&gt;要把公钥恢复到你的密钥环中，需要这样做：&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;gpg&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --import&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Short&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; I&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;D&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;.asc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;gpg:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; key&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Short&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; I&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;D&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; public&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; key&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &quot;Your Name &amp;#x3C;your@email&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; imported&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;gpg:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; Total&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; processed:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;gpg:&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; imported:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;这里有个非常重要的提示。&lt;/em&gt;&lt;/strong&gt;如果这是新安装的 GPG 或者是另一台电脑，GPG 不会自己识别卡上的密钥。你需要运行 &lt;code&gt;gpg --card-status&lt;/code&gt;，让它读取卡片并获取卡上的密钥。&lt;/p&gt;
&lt;h3 id=&quot;设置-git-签名&quot;&gt;设置 Git 签名&lt;/h3&gt;
&lt;p&gt;要让 Git 给你的提交签名，你需要在 &lt;code&gt;~/.gitconfig&lt;/code&gt; 中添加以下内容。&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;[user]&lt;/code&gt; 部分下，添加（或更新）下面这一行：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;signingkey = 0x&amp;#x3C;Short ID&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;然后如果你想给所有提交都签名，在文件末尾添加以下内容：&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ini&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;[gpg]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  program&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; = /usr/local/bin/gpg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;[commit]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;  gpgsign&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; = true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这会让 Git 给你所有的提交签名。&lt;/p&gt;
&lt;p&gt;要设置 GitHub，你需要把公钥添加到你的个人资料中。具体做法是进入 &lt;code&gt;GitHub -&gt; Settings -&gt; SSH and GPG keys -&gt; New GPG key&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;然后你会看到一个文本框，把我们上面生成的 &lt;code&gt;&amp;#x3C;Short ID&gt;.asc&lt;/code&gt; 文件的全部内容粘贴进去。&lt;/p&gt;
&lt;p&gt;如果你想复制文件内容（在 macOS 上），可以这样：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cat &amp;#x3C;Short ID&gt;.asc | pbcopy&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这会把整个文件的内容复制到剪贴板。&lt;/p&gt;
&lt;p&gt;把它粘贴到 GitHub 的文本框里，然后点击 &lt;code&gt;Add GPG key&lt;/code&gt; 按钮。&lt;/p&gt;
&lt;p&gt;之后你可以试着提交并推送到 GitHub，应该就能看到漂亮的 &lt;code&gt;Verified&lt;/code&gt; 标签了。&lt;/p&gt;
&lt;h3 id=&quot;调试&quot;&gt;调试&lt;/h3&gt;
&lt;p&gt;有时候事情不会一帆风顺。为了收集更多信息，你可以试试下面这些方法：&lt;/p&gt;
&lt;h3 id=&quot;用-gpg-签名&quot;&gt;用 GPG 签名&lt;/h3&gt;
&lt;p&gt;首先试着用这把密钥给某个东西签名：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;gpg -s &amp;#x3C;file&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果失败了，试着弄清楚失败的原因，这方面我不是专家，帮不上忙。&lt;/p&gt;
&lt;p&gt;查看 Git 的输出GIT_TRACE=1 git commit -am “test”&lt;/p&gt;
&lt;p&gt;这会告诉你 Git 在尝试提交并签名时所做的每一步具体操作，能给你一些线索，看看签名为什么可能失败。&lt;/p&gt;
&lt;p&gt;从中你还可以看到，Git 执行了下面这条命令：&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;/usr/local/bin/gpg&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; --status-fd=2&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; -bsau&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt;Key&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; I&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;D&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你可以试着手动运行它，看看能不能得到更有用的错误信息。&lt;/p&gt;</content:encoded><category>dev</category><category>Snippets</category><category>Technology</category><category>git</category><category>github</category><category>gpg</category><category>key</category><category>public-key</category><category>secrets</category><category>sign</category><category>yubikey</category></item><item><title>e1000e eth0: Detected Hardware Unit Hang（检测到硬件单元挂起）</title><link>https://bisko.be/zh/posts/dev/e1000e-device-id-eth0-detected-hardware-unit-hang/</link><guid isPermaLink="true">https://bisko.be/zh/posts/dev/e1000e-device-id-eth0-detected-hardware-unit-hang/</guid><description>最近我的家用服务器兼虚拟机宿主机开始随机断网。从外面看，它似乎还在正常运行，可我却无法通过任何远程方式访问它。根据交换机的显示，以太网适配器好像是开着的，所以问题肯定出在软件层面。这不会是</description><pubDate>Wed, 18 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近我的家用服务器兼虚拟机宿主机开始随机断网。从外面看，它似乎还在正常运行，可我却无法通过任何远程方式访问它。根据交换机的显示，以太网适配器好像是开着的，所以问题肯定出在软件层面。&lt;/p&gt;
&lt;p&gt;驱动问题导致网络连接卡死，这可不是第一次了。过去我就被 Linux 和 Windows 电脑上有 bug 的 WiFi 驱动坑过。&lt;/p&gt;
&lt;p&gt;在系统日志里翻了一阵之后，我偶然发现了下面这些内容：&lt;/p&gt;
&lt;p&gt;vmhost kernel: e1000e 0000:00:1f.6 eth0: Detected Hardware Unit Hang:&lt;br&gt;
vmhost kernel:   TDH                  &amp;#x3C;0&gt;&lt;br&gt;
vmhost kernel:   TDT                  &amp;#x3C;1&gt;&lt;br&gt;
vmhost kernel:   next_to_use          &amp;#x3C;1&gt;&lt;br&gt;
vmhost kernel:   next_to_clean        &amp;#x3C;0&gt;&lt;br&gt;
vmhost kernel: buffer_info[next_to_clean]:&lt;br&gt;
vmhost kernel:   time_stamp           &amp;#x3C;10fbc2f81&gt;&lt;br&gt;
vmhost kernel:   next_to_watch        &amp;#x3C;0&gt;&lt;br&gt;
vmhost kernel:   jiffies              &amp;#x3C;10fbc3871&gt;&lt;br&gt;
vmhost kernel:   next_to_watch.status &amp;#x3C;0&gt;&lt;br&gt;
vmhost kernel: MAC Status             &amp;#x3C;40080083&gt;&lt;br&gt;
vmhost kernel: PHY Status             &amp;#x3C;796d&gt;&lt;br&gt;
vmhost kernel: PHY 1000BASE-T Status  &amp;#x3C;7800&gt;&lt;br&gt;
vmhost kernel: PHY Extended Status    &amp;#x3C;3000&gt;&lt;br&gt;
vmhost kernel: PCI Status             &amp;#x3C;10&gt;&lt;br&gt;
vmhost kernel: e1000e 0000:00:1f.6 eth0: Reset adapter unexpectedly&lt;br&gt;
vmhost kernel: vmbr0: port 1(eth0) entered disabled state&lt;/p&gt;
&lt;p&gt;然后它会重置网络适配器，过一会儿又来一遍，直到机器彻底掉线。&lt;/p&gt;
&lt;p&gt;我在网上找答案时，偶然发现了&lt;a href=&quot;https://serverfault.com/questions/616485/e1000e-reset-adapter-unexpectedly-detected-hardware-unit-hang&quot;&gt;这个 ServerFault 帖子&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;原因&lt;/p&gt;
&lt;p&gt;翻了不少资料和 bug 报告列表后，复现这个问题最好的办法似乎是让设备处于高带宽场景，也就是传输大量数据把网卡接口跑满。&lt;/p&gt;
&lt;p&gt;我的情况通常发生在从本地 Plex 服务器向某个设备串流媒体的时候。由于网络的搭建方式，运行 Plex 实例的 Windows 虚拟机必须先从另一台设备的 NFS 网络共享中取得媒体文件，在虚拟机里转码，再发送给播放设备。&lt;/p&gt;
&lt;p&gt;这样加起来网络流量相当大，通常在 ~40-100mbit/s 左右，取决于播放媒体文件的设备以及源媒体文件的质量。&lt;/p&gt;
&lt;p&gt;通过 Steam Link 向我们的 Apple TV 串流游戏时，也出现过同样的问题。连接是有线的，但网络掉线并不少见。我觉得这和上面是同一个问题，不过之后我会留意修复后是否还会发生。&lt;/p&gt;
&lt;p&gt;可能的修复方法&lt;/p&gt;
&lt;p&gt;看来一个可行的办法是在网络接口上关闭 &lt;strong&gt;GSO&lt;/strong&gt; &lt;em&gt;（Generic Segmentation Offload，通用分段卸载）&lt;/em&gt;、&lt;strong&gt;TSO&lt;/strong&gt; &lt;em&gt;（TCP Segmentation Offload，TCP 分段卸载）&lt;/em&gt; 和 &lt;strong&gt;GRO&lt;/strong&gt; &lt;em&gt;（Generic Receive Offload，通用接收卸载）&lt;/em&gt;*：&lt;/p&gt;
&lt;p&gt;ethtool -K eth0 gso off gro off tso off&lt;/p&gt;
&lt;p&gt;我已经在自己的环境里应用了这个设置，正在观察长期来看它是否真的能解决问题。&lt;/p&gt;
&lt;p&gt;脚注&lt;/p&gt;
&lt;p&gt;* 这些选项与把数据包分段工作卸载给网络接口控制器有关，目的是降低机器的 CPU 占用。更多细节可以参考&lt;a href=&quot;https://en.wikipedia.org/wiki/Large_send_offload&quot;&gt;这篇维基百科文章&lt;/a&gt;。&lt;/p&gt;</content:encoded><category>dev</category><category>Homelab</category><category>bandwidth</category><category>bug</category><category>network</category><category>nic</category><category>plex</category><category>proxmox</category><category>steam</category><category>streaming</category></item><item><title>南瓜</title><link>https://bisko.be/zh/posts/blog/the-pumpkin/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/the-pumpkin/</guid><description>拍摄于 Simple Food Punkt</description><pubDate>Sun, 03 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;平底锅里有个雕刻过的南瓜?我也不太确定。&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_8045-99331106.C4JicSzy_20be15.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;拍摄于 &lt;a href=&quot;https://www.facebook.com/Simple.Food.Punkt/&quot;&gt;Simple Food Punkt&lt;/a&gt;&lt;/p&gt;</content:encoded><category>blog</category><category>Uncategorized</category><category>fun</category><category>Halloween</category><category>Orange</category><category>pumpkin</category></item><item><title>小技巧:运行本地/私有的 swarm Docker 镜像仓库</title><link>https://bisko.be/zh/posts/dev/snippets-running-a-local-private-swarm-docker-image-registry/</link><guid isPermaLink="true">https://bisko.be/zh/posts/dev/snippets-running-a-local-private-swarm-docker-image-registry/</guid><description>今天我想从一个 Node.js 项目生成 Docker 镜像,然后把它部署到我本地的测试 swarm 上。不幸的是,如果在本地构建 Docker 镜像,这个镜像只会保存在创建它的那个节点上,只有该节点能访问,swarm 里的其他节点是访问不到的。</description><pubDate>Fri, 11 Oct 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今天我想从一个 Node.js 项目生成 Docker 镜像,然后把它部署到我本地的测试 swarm 上。&lt;/p&gt;
&lt;p&gt;不幸的是,如果在本地构建 Docker 镜像,这个镜像只会存储在创建它的那个节点上,只有该节点能访问,swarm 里的其他节点是访问不到的。&lt;/p&gt;
&lt;p&gt;解决办法是把镜像推送到 Docker 镜像仓库,这样 swarm 里所有节点都可以从那里拉取镜像。&lt;/p&gt;
&lt;p&gt;创建镜像仓库&lt;/p&gt;
&lt;p&gt;要在 swarm 中创建一个镜像仓库服务,运行:&lt;/p&gt;
&lt;p&gt;docker service create —name registry —publish 5000:5000 registry:latest&lt;/p&gt;
&lt;p&gt;这会创建 registry 服务并在 swarm 中运行它,swarm 里的所有节点都可以访问它。&lt;/p&gt;
&lt;p&gt;把镜像推送到镜像仓库&lt;/p&gt;
&lt;p&gt;要把镜像推送到镜像仓库,需要做两件事——先打标签,再推送镜像。&lt;/p&gt;
&lt;p&gt;下面是一个一步完成构建和打标签的例子:&lt;/p&gt;
&lt;p&gt;docker build . -t localhost.localdomain:5000/&lt;image-name&gt;:latest&lt;/image-name&gt;&lt;/p&gt;
&lt;p&gt;然后是如何把它推送到镜像仓库:&lt;/p&gt;
&lt;p&gt;docker push localhost.localdomain:5000/&lt;image-name&gt;:latest在服务/容器等中使用镜像&lt;/image-name&gt;&lt;/p&gt;
&lt;p&gt;要在服务或容器中使用这个镜像,需要指定上面的完整路径,即 &lt;code&gt;localhost.localdomain:5000/&amp;#x3C;image-name&gt;:latest&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;swarm 节点将能够访问该镜像,并拉取和运行它。&lt;/p&gt;
&lt;p&gt;关于仓库地址的重要说明&lt;/p&gt;
&lt;p&gt;网上大多数教程里,仓库地址写的都是 &lt;code&gt;localhost:5000&lt;/code&gt;。不幸的是,这样行不通,使用时通常会超时。如果把它改成 &lt;code&gt;localhost.localdomain&lt;/code&gt;,就能正常工作了!&lt;/p&gt;
&lt;p&gt;我也不清楚为什么会这样,明明 &lt;code&gt;localhost&lt;/code&gt; 和 &lt;code&gt;localhost.localdomain&lt;/code&gt; 都解析到 &lt;code&gt;127.0.0.1&lt;/code&gt;。&lt;/p&gt;</content:encoded><category>dev</category><category>Homelab</category><category>Snippets</category><category>Technology</category><category>docker</category><category>docker-swarm</category><category>registry</category><category>swarm</category></item><item><title>延时摄影：奥兰多国际机场的滑行与起飞</title><link>https://bisko.be/zh/posts/blog/timelapse-taxiing-and-takeoff-from-orlando-international-airport/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/timelapse-taxiing-and-takeoff-from-orlando-international-airport/</guid><description>这是返程之旅的开端，我们精彩的 2019 年 Automattic 大聚会刚刚落下帷幕。和一群很棒的人度过了美好时光！🤩</description><pubDate>Tue, 01 Oct 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;用 iPhone X 在飞机舷窗边拍摄&lt;/p&gt;
&lt;p&gt;这是返程之旅的开端，我们精彩的 2019 年 Automattic 大聚会刚刚落下帷幕。和一群很棒的人度过了美好时光！🤩&lt;/p&gt;</content:encoded><category>blog</category><category>Adventures</category><category>Photography</category><category>travel</category><category>Airplane</category><category>Flying</category><category>Orlando_FL</category><category>Timelapse</category></item><item><title>延时摄影:降落在雾蒙蒙的法兰克福</title><link>https://bisko.be/zh/posts/blog/timelapse-landing-in-foggy-frankfurt/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/timelapse-landing-in-foggy-frankfurt/</guid><description>法兰克福是我们前往一年一度的 Automattic Grand Meetup 途中的中转站之一。那天雾很大,降落的体验相当有意思。飞机先是在一层毛毯般的云海上方飞行,然后就这样,直接落在了跑道上!下面是一张额外赠送的照片,拍的是下降过程中从城市上空能看到的景象。</description><pubDate>Tue, 10 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;用 iPhone X 在飞机舷窗边拍摄&lt;/p&gt;
&lt;p&gt;法兰克福是我们前往一年一度的 Automattic Grand Meetup 途中的中转站之一。那天雾很大,降落的体验相当有意思。飞机先是在一层毛毯般的云海上方飞行,然后就这样,直接落在了跑道上!&lt;/p&gt;
&lt;p&gt;下面是一张额外赠送的照片,拍的是下降过程中从城市上空能看到的景象。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;从飞机上俯瞰厚厚的雾层和云层,两根烟囱从中探出头来,远处是深色的山丘&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_6547-fa702d62.ByzaITRP_2k3iLQ.webp&quot; &gt;&lt;/p&gt;</content:encoded><category>blog</category><category>Adventures</category><category>Photography</category><category>travel</category><category>Airplane</category><category>Frankfurt</category><category>Landing</category><category>Timelapse</category></item><item><title>牛油果:发芽啦!</title><link>https://bisko.be/zh/posts/blog/the-avocado-sprouting/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/the-avocado-sprouting/</guid><description>这是我们第一次成功让牛油果发芽!</description><pubDate>Sat, 03 Aug 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;牛油果种子在一盆土里裂开,裂缝中长出一根细细的棕色嫩芽,顶端是卷曲的绿色尖尖&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_5899-f2ad7864.YgnFMYgT_1cfcKJ.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;这是我们第一次成功让牛油果发芽!&lt;/p&gt;</content:encoded><category>blog</category><category>The Avocado</category><category>Avocado</category><category>Gardening</category><category>Plant</category><category>Sprout</category></item><item><title>小技巧:把 Apple 键盘上的分节符键映射为反引号键(§ 改成 `)</title><link>https://bisko.be/zh/posts/dev/snippets-map-apple-keyboard-section-sign-key-to-back-quote-%C2%A7-to/</link><guid isPermaLink="true">https://bisko.be/zh/posts/dev/snippets-map-apple-keyboard-section-sign-key-to-back-quote-%C2%A7-to/</guid><description>我用 Apple 键盘已经有一阵子了,但住在欧洲的话,想买到我用惯了的美式布局键盘可不容易。在 macOS 上有一个“简单”的办法,只需一条终端命令就能重新映射键盘:watch -n1 -x hidutil property -m ‘{“ProductID”:592, “VendorID”:1452}’ –set ‘{“UserKeyMapping”:[{“HIDKeyboardModifierMappingSrc”:0x700000035,”HIDKeyboardModifierMappingDst”:0x700000064}]}’ 这段代码的作用是</description><pubDate>Wed, 31 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我用 Apple 键盘已经有一阵子了,但住在欧洲的话,想买到我用惯了的美式布局键盘可不容易。&lt;/p&gt;
&lt;p&gt;在 macOS 上有一个“简单”的办法,只需一条终端命令就能重新映射键盘:&lt;/p&gt;
&lt;p&gt;watch -n1 -x hidutil property -m ’{“ProductID”:592, “VendorID”:1452}’ —set ’{“UserKeyMapping”:[{“HIDKeyboardModifierMappingSrc”:0x700000035,“HIDKeyboardModifierMappingDst”:0x700000064}]}’&lt;/p&gt;
&lt;p&gt;这段代码的作用,是把分节符键( § )改成输出反引号/波浪号( &lt;code&gt;`/ ~&lt;/code&gt; )键。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;watch -n1 -x&lt;/code&gt; 这部分会每秒执行一次,因为 macOS 有时会把这个设置弄丢,通常发生在电脑进入睡眠,或者键盘被拔掉再重新插上的时候。&lt;/p&gt;
&lt;p&gt;请注意,在某些版本的 macOS 上并没有预装 &lt;code&gt;watch&lt;/code&gt; 工具,需要通过 &lt;a href=&quot;https://brew.sh/&quot;&gt;Homebrew&lt;/a&gt; 或 &lt;a href=&quot;https://www.macports.org/&quot;&gt;MacPorts&lt;/a&gt; 之类的工具来安装。&lt;/p&gt;
&lt;p&gt;上面的代码适用于 USB 接口、带保加利亚语字母的欧洲布局 Apple 外接键盘。对于其他类型的键盘,可能需要对按键的十六进制值稍作调整。&lt;/p&gt;
&lt;p&gt;这条命令的一个变体,同样适用于 MacBook Pro 自带的同类键盘,只需要把 &lt;code&gt;0x700000035&lt;/code&gt; 和 &lt;code&gt;0x700000064&lt;/code&gt; 这两个值的位置对调即可。&lt;/p&gt;
&lt;p&gt;我一直在想要不要写个工具来自动帮我做这件事,不过现在我觉得,还是花钱买一把布局正确的新键盘更划算 🙂&lt;/p&gt;</content:encoded><category>dev</category><category>Uncategorized</category></item><item><title>紫色的花</title><link>https://bisko.be/zh/posts/blog/purple-flowers/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/purple-flowers/</guid><description>拍摄于前往博罗韦茨的旅途中,它坐落在里拉山。</description><pubDate>Fri, 28 Jun 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;紫色的紫菀状花朵和圆圆的花苞长在带绒毛的绿色花茎上,在蓝天中明亮的太阳逆光照射下,背景是深色的常青树&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_5256-c4ebab4e.B9-0LH79_ZcCswB.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;拍摄于前往&lt;a href=&quot;https://en.wikipedia.org/wiki/Borovets&quot;&gt;博罗韦茨&lt;/a&gt;的旅途中,它坐落在&lt;a href=&quot;https://en.wikipedia.org/wiki/Rila&quot;&gt;里拉山&lt;/a&gt;。&lt;/p&gt;</content:encoded><category>blog</category><category>Photography</category><category>flower</category><category>flowers</category><category>purple</category><category>sun</category></item><item><title>复古博物馆</title><link>https://bisko.be/zh/posts/blog/retro-museum/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/retro-museum/</guid><description>我们在黑海度暑假时，住在附近的一家度假村，于是抽空去了一趟瓦尔纳。在那里，我们偶然发现了一座特别有意思的复古博物馆。我惊喜地发现，小时候用过的东西几乎都能在这里找到。太多美好的回忆涌上心头</description><pubDate>Tue, 25 Jun 2019 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&quot;保加利亚老式玩具和拼图的展示柜：魔方、贪吃蛇拼图，以及 Ne se sardi 和 Idvat tankove 等棋盘游戏&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_5095-fff7354b.B87XGoKK_spbqC.webp&quot; &gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&quot;一排排苏联时代的闹钟，包括黄色小鸡造型的 Slava 闹钟、圆形金属闹钟和长方形台式闹钟&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_5094-03b89044.PJIIKBDz_ZrumKn.webp&quot; &gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&quot;玻璃柜里摆满了成捆、成扇形展开的旧保加利亚列弗纸币，旁边散落着硬币和银行捆钞纸带&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3024&quot; height=&quot;4032&quot; src=&quot;/_astro/img_5092-fe5af8eb.D8cpVmlj_Z2gS5rt.webp&quot; &gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&quot;复古护发用品展柜：黄色和橙色的吹风机、卷发棒、发卷，以及盒装的振动按摩器&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3024&quot; height=&quot;4032&quot; src=&quot;/_astro/img_5091-0793f161.ByQJsy2P_Z1u1ItY.webp&quot; &gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&quot;两台青绿色的老式吸尘器，两端为米白色，连着软管，躺在玻璃展柜里&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_5090-2e051edf.CX0aDctc_Zqdst9.webp&quot; &gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&quot;蓝色丝绒上的制图圆规套装，旁边是彩色铅笔、圆珠笔和绣花的学校体育徽章&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3024&quot; height=&quot;4032&quot; src=&quot;/_astro/img_5089-f1b68d98.DkuBHl-h_Zx4MsX.webp&quot; &gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&quot;博物馆地面上摆放的老式甩干洗衣机和洗涤剂盒子，背景中停着几辆老爷车&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3024&quot; height=&quot;4032&quot; src=&quot;/_astro/img_5088-53896321.yYoU5Fok_Z15PUQh.webp&quot; &gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&quot;玩具乐器收藏：口风琴、竖笛和口琴，旁边是一盒游戏套装和扑克牌&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_5086-09a7e3df.D4AuUo7d_Z16eSYx.webp&quot; &gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;img alt=&quot;绿色桌上足球游戏，红白两色的球员小人，周围是套娃、魔方和掌上电子游戏机&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_5085-b5ba1d92.CTJokrFJ_Z8Erqh.webp&quot; &gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些照片拍摄于&lt;a href=&quot;https://www.tripadvisor.com/Attraction_Review-g295392-d8441907-Reviews-The_Retro_Museum_In_Varna-Varna_Varna_Province.html&quot;&gt;位于保加利亚瓦尔纳的复古博物馆&lt;/a&gt;（链接来自 TripAdvisor，因为博物馆的官网似乎已经打不开了）。&lt;/p&gt;
&lt;p&gt;我们在&lt;a href=&quot;https://en.wikipedia.org/wiki/Black_Sea&quot;&gt;黑海&lt;/a&gt;度暑假时，住在附近的一家度假村，于是抽空去了一趟&lt;a href=&quot;https://en.wikipedia.org/wiki/Varna&quot;&gt;瓦尔纳&lt;/a&gt;。在那里，我们偶然发现了一座特别有意思的复古博物馆。&lt;/p&gt;
&lt;p&gt;我惊喜地发现，小时候用过的各种东西几乎都能在这里找到。参观的时候，童年的许多美好回忆一下子都涌了上来。&lt;/p&gt;
&lt;p&gt;来瓦尔纳的话，这里绝对值得一去！&lt;/p&gt;</content:encoded><category>blog</category><category>Adventures</category><category>memories</category><category>museum</category><category>retro</category><category>Varna</category></item><item><title>雏菊之海</title><link>https://bisko.be/zh/posts/blog/sea-of-daisies/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/sea-of-daisies/</guid><description>摄于乔鲁尔附近。</description><pubDate>Fri, 31 May 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;一片茂密的牛眼菊草甸,白色花瓣、黄色花心,花茎高而翠绿,草丛间点缀着几朵粉色的三叶草花&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_4633-ced55558.CA2pVc_h_cVSP7.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;摄于&lt;a href=&quot;https://en.wikipedia.org/wiki/Chorul&quot;&gt;乔鲁尔&lt;/a&gt;附近。&lt;/p&gt;</content:encoded><category>blog</category><category>Adventures</category><category>Photography</category><category>daisy</category><category>flower</category><category>flowers</category></item><item><title>延时摄影:蒙特塞拉特之旅</title><link>https://bisko.be/zh/posts/blog/timelapses-trip-to-montserrat/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/timelapses-trip-to-montserrat/</guid><description>我们最近在巴塞罗那举行团队聚会时,去了一趟蒙特塞拉特山。我们挑了个乌云密布的日子,不过云层还算够高,所以在下雨之前,我们还是成功看到了山谷。下面是这次旅行的两段延时摄影:</description><pubDate>Wed, 08 May 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我们最近在巴塞罗那举行团队聚会时,去了一趟&lt;a href=&quot;https://en.wikipedia.org/wiki/Montserrat_(mountain)&quot;&gt;蒙特塞拉特山&lt;/a&gt;。我们挑了个乌云密布的日子,不过云层还算够高,所以在下雨之前,我们还是成功看到了山谷。&lt;/p&gt;
&lt;p&gt;下面是这次旅行的两段延时摄影:&lt;/p&gt;
&lt;p&gt;云的魔法!&lt;/p&gt;
&lt;p&gt;乘坐&lt;a href=&quot;https://en.wikipedia.org/wiki/Aeri_de_Montserrat&quot;&gt;蒙特塞拉特空中缆车&lt;/a&gt;下山。&lt;/p&gt;</content:encoded><category>blog</category><category>Adventures</category><category>travel</category><category>Barcelona</category><category>Montseratt</category><category>Spain</category><category>Timelapse</category></item><item><title>延时摄影:降落巴塞罗那机场</title><link>https://bisko.be/zh/posts/blog/timelapse-landing-at-barcelona-airport/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/timelapse-landing-at-barcelona-airport/</guid><pubDate>Sat, 04 May 2019 00:00:00 GMT</pubDate><content:encoded/><category>blog</category><category>Adventures</category><category>travel</category><category>Airplane</category><category>Barcelona</category><category>Landing</category><category>Spain</category><category>Timelapse</category></item><item><title>灰猫</title><link>https://bisko.be/zh/posts/blog/the-grey-cat/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/the-grey-cat/</guid><description>我们在家附近的某个地方发现了这位小家伙!长得好看,还特别爱吃零食!</description><pubDate>Thu, 21 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img alt=&quot;一只黄眼睛的灰猫站在树干旁,身后是铺满落叶的草坡,附近有一块大石头和一堵混凝土墙&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_1995-f9f8058b.DJx6IsPU_1JdhCg.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;我们在家附近的某个地方发现了这位小家伙!长得好看,还特别爱吃零食!&lt;/p&gt;</content:encoded><category>blog</category><category>Animals</category><category>Photography</category><category>cat</category><category>grey</category></item><item><title>重置/重启 Apple TV 遥控器</title><link>https://bisko.be/zh/posts/dev/resetting-restarting-apple-tv-remote/</link><guid isPermaLink="true">https://bisko.be/zh/posts/dev/resetting-restarting-apple-tv-remote/</guid><description>昨晚家里来客人的时候，我居然把 Apple TV 遥控器泡进了水里。睡眠不足加上眼镜没戴稳，事故就这么发生了。昨晚遥控器还好好的，今天却罢工了，怎么按都没反应。我试着往手心里猛拍，又使劲把水甩出来。</description><pubDate>Sun, 17 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;昨晚家里来客人的时候，我居然把 Apple TV 遥控器泡进了水里。睡眠不足加上眼镜没戴稳，事故就这么发生了。&lt;/p&gt;
&lt;p&gt;昨晚遥控器还好好的，今天却罢工了，怎么按都没反应。我试着往手心里猛拍，又使劲把里面的水甩出来。完全没用。&lt;/p&gt;
&lt;p&gt;我们都以为它彻底报废了，开始在橱柜里翻找米袋。&lt;/p&gt;
&lt;p&gt;我上网搜了一下，其实主要是抱着开玩笑的心态，想看看能不能“重启”它。&lt;/p&gt;
&lt;p&gt;一篇很有用的指南让我同时按住音量加（Volume Up）键和菜单（Menu）键 2-3 秒，就能重置遥控器并进入配对模式。&lt;/p&gt;
&lt;p&gt;结果我真的大吃一惊，&lt;strong&gt;它居然真的好了&lt;/strong&gt;！&lt;/p&gt;
&lt;p&gt;所以，如果遥控器有点不对劲，先试试重置吧。如果不行，再去考虑埋进米里和拆机维修也不迟。&lt;/p&gt;
&lt;p&gt;简而言之：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;按住 Menu + Volume Up 2-3 秒&lt;/li&gt;
&lt;li&gt;等几秒钟&lt;/li&gt;
&lt;li&gt;试着操作一下 Apple TV&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>dev</category><category>Apple</category><category>Technology</category><category>AppleTV</category><category>Have you tried turning it off and on again?</category><category>remote</category><category>reset</category><category>restart</category></item><item><title>那辆老电车</title><link>https://bisko.be/zh/posts/blog/the-old-tram/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/the-old-tram/</guid><description>在 Instagram 上查看这条帖子 Biser Perchinkov (@biskobe) 分享的帖子 2018 年的最后几天，我们和几个朋友去参加了一场秘密派对。最大的惊喜是派对的举办地点！它就在保加利亚仅存的两辆最古老的在役电车之一上！它建于差不多一个世纪前，而且</description><pubDate>Fri, 04 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;[&lt;/p&gt;
&lt;p&gt;在 Instagram 上查看这条帖子&lt;/p&gt;
&lt;p&gt;](&lt;a href=&quot;https://www.instagram.com/p/Br8XYN5j0z9/?utm_source=ig_embed&amp;#x26;utm_campaign=loading&quot;&gt;https://www.instagram.com/p/Br8XYN5j0z9/?utm_source=ig_embed&amp;#x26;utm_campaign=loading&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.instagram.com/p/Br8XYN5j0z9/?utm_source=ig_embed&amp;#x26;utm_campaign=loading&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.instagram.com/p/Br8XYN5j0z9/?utm_source=ig_embed&amp;#x26;utm_campaign=loading&quot;&gt;Biser Perchinkov (@biskobe) 分享的帖子&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2018 年的最后几天，我们和几个朋友去参加了一场秘密派对。&lt;/p&gt;
&lt;p&gt;最大的惊喜是派对的举办地点！它就在保加利亚仅存的两辆最古老的在役电车之一上！&lt;/p&gt;
&lt;p&gt;这辆电车建于差不多一个世纪前，坐上去绝对能把你带回那个年代，虽然它也稍微现代化了一下，装了灯、暖气和一些音乐/媒体设备，好让导游可以一路讲解沿途的景点。&lt;/p&gt;
&lt;p&gt;我玩得特别开心，因为其中一位组织者就在电车库工作，所以我们拿到了头排的“门票”，可以近距离看电车司机是怎么操作的。我们还上了一堂速成课，搞清楚了每根操纵杆是干什么的，还敲了铃！Toma 也有机会试着把电车开动起来，结果发现操作它需要相当大的力气！也许再过几年吧 😝&lt;/p&gt;
&lt;p&gt;路过的人也都饶有兴致地看着这一幕，因为复古电车在这里可不是天天都能见到的。&lt;/p&gt;</content:encoded><category>blog</category><category>Adventures</category><category>Winter</category><category>joy</category><category>machinery</category><category>party</category><category>tram</category><category>travel</category></item><item><title>超棒的游戏原声——《Stellaris》</title><link>https://bisko.be/zh/posts/blog/amazing-game-soundtracks-stellaris/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/amazing-game-soundtracks-stellaris/</guid><description>前阵子我入手了《Stellaris》，很快就在里面不知不觉泡掉了好几个小时。这里我不打算聊游戏本身，评测、实况之类的内容已经够多了。反正我也没法用文字形容它有多棒，所以我只想说——听听看吧</description><pubDate>Mon, 02 Apr 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;前阵子我入手了 &lt;a href=&quot;https://en.wikipedia.org/wiki/Stellaris_(video_game)&quot;&gt;Stellaris&lt;/a&gt;，很快就在里面不知不觉泡掉了好几个小时。这里我不打算聊游戏本身，评测、实况之类的内容已经够多了。&lt;/p&gt;
&lt;p&gt;因为我没法用文字形容它有多棒，所以我只想说——去听听它的原声吧。闭上眼睛，想象自己正在深空，或者在你思绪带你去的任何地方展开一场冒险，好好享受。&lt;/p&gt;
&lt;p&gt;（如果你没有 Spotify，可以试试 &lt;a href=&quot;https://www.youtube.com/results?search_query=stellaris+soundtrack&quot;&gt;YouTube 的搜索结果&lt;/a&gt;）&lt;/p&gt;</content:encoded><category>blog</category><category>Music</category><category>games</category><category>ost</category><category>soundtrack</category><category>stellaris</category></item><item><title>重温回忆:玫瑰与蜜蜂</title><link>https://bisko.be/zh/posts/blog/diving-back-in-memories-of-roses-and-bees/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/diving-back-in-memories-of-roses-and-bees/</guid><description>几天前,我在翻看自己的照片收藏时,无意间发现了我最喜欢的一张照片。这张照片的诞生背后有一段有趣的故事。就在几天前,我爸买了一台新的数码相机,佳能 PowerShot A610。我迫不及待想试试,可他一直不给我机会拍几张,因为他正忙着把相机里里外外研究个透。</description><pubDate>Sun, 10 Dec 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;几天前,我在翻看自己的照片收藏时,无意间发现了我最喜欢的一张照片。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;一只蜜蜂正在探索玫瑰&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2592&quot; height=&quot;1944&quot; src=&quot;/_astro/img_0350-258314a7.DVI6yd6N_6PkwW.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;这张照片的诞生背后有一段有趣的故事。&lt;/p&gt;
&lt;p&gt;就在那几天前,我爸买了一台新的数码相机,佳能 PowerShot A610。我迫不及待想试试,可他一直不给我机会拍几张,因为他正忙着把相机里里外外研究个透。毕竟,这是我们家的第一台“高级”数码相机。&lt;/p&gt;
&lt;p&gt;拍下这张照片的那天,我和我爸一起出门去商店,他带上了相机。我让他把相机给我拿着,也看看我能不能拍点什么。我们一边争论我到底有没有能力拿着相机而不把它摔坏,一边走了五六分钟,刚好经过一丛玫瑰,我看到有几只蜜蜂在周围飞来飞去。&lt;/p&gt;
&lt;p&gt;那时候我就知道,我想拍下你在上面看到的那朵可爱的玫瑰花。我把相机拿出来,开机,等一只蜜蜂落在花上,然后按下了快门。&lt;/p&gt;
&lt;p&gt;就这样,它诞生了。这是我用那台相机拍的第一张照片。&lt;/p&gt;
&lt;p&gt;直到今天,这张照片仍然是我最喜欢的照片之一。&lt;/p&gt;</content:encoded><category>blog</category><category>Photography</category><category>bee</category><category>bees</category><category>flower</category><category>nature</category><category>outside</category><category>rose</category></item><item><title>奶爸日常:宝贝,在线游戏可不能暂停啊!</title><link>https://bisko.be/zh/posts/blog/dad-things-baby-you-cant-pause-an-online-game/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/dad-things-baby-you-cant-pause-an-online-game/</guid><description>所以……这个圆圈终于闭合了。今天,趁着棒极了的 Automattic 批给我的陪产假还剩最后几天,我决定一头扎进怀旧的海洋,玩几把经典的老《星际争霸》。听起来挺正常的,对吧?没错,确实正常!除了办公室里还有个宝宝陪着我</description><pubDate>Tue, 05 Dec 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;所以……这个圆圈终于闭合了。&lt;/p&gt;
&lt;p&gt;今天,趁着棒极了的 &lt;a href=&quot;https://automattic.com&quot;&gt;Automattic&lt;/a&gt; 批给我的陪产假还剩最后几天,我决定一头扎进怀旧的海洋,玩几把经典的老《星际争霸》(StarCraft)。&lt;/p&gt;
&lt;p&gt;听起来挺正常的,对吧?没错,确实正常!只不过办公室里还有个宝宝陪着我,这样妈妈去忙别的事时,我就可以照看他。&lt;/p&gt;
&lt;p&gt;一切都很顺利,宝宝睡着了,我找到了一局有意思的游戏,开始玩,结果玩到一半宝宝醒了。没关系。我哄了他一会儿,但他还是闹腾,于是我退出了游戏,专心照顾他。游戏和宝宝,实在没法同时兼顾。&lt;/p&gt;
&lt;p&gt;就这样,我一边把宝宝抱在怀里摇着,轻声细语地哄他,想让他平静下来,一边瞥了一眼显示器,看到游戏房主发来好几条消息:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“既然要走,当初为什么要加入游戏?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;一遍又一遍地刷屏。&lt;/p&gt;
&lt;p&gt;一开始我还想回复说我怀里抱着个宝宝,得照顾他,但紧接着,我脑海里闪回到小时候,我曾满腔愤懑地提高嗓门对我妈喊:在线游戏不能暂停!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;天哪,妈,在线游戏不能暂停啊!!!!1!1!1!!1!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;就在那一刻,我意识到自己得暂时告别在线游戏了。&lt;/p&gt;
&lt;p&gt;唉,好吧……¯\_(ツ)_/¯&lt;/p&gt;
&lt;p&gt;至少现在我可以专心清一清越堆越高的单机游戏库存了。《巫师 3》可不会自己通关!&lt;/p&gt;</content:encoded><category>blog</category><category>Gaming</category><category>Parenting</category><category>baby</category></item><item><title>世界各地的涂鸦——蒙特利尔</title><link>https://bisko.be/zh/posts/blog/graffiti-around-the-world-montreal/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/graffiti-around-the-world-montreal/</guid><description>几周前,我去蒙特利尔参加团队聚会,沿着街道溜达的时候,特别喜欢那里的涂鸦文化。跟我以前去过的其他地方相比,这里的涂鸦色彩缤纷,而且很有玩心,我超爱。以下是我最喜欢的几幅:</description><pubDate>Tue, 06 Jun 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;几周前,我去蒙特利尔参加团队聚会,沿着街道溜达的时候,特别喜欢那里的涂鸦文化。跟我以前去过的其他地方相比,这里的涂鸦色彩缤纷,而且很有玩心,我超爱。&lt;/p&gt;
&lt;p&gt;以下是我最喜欢的几幅:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;刺蛇!&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2694&quot; height=&quot;3495&quot; src=&quot;/_astro/img_7084-8397910a.ZIxhC7qM_1z6wBb.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;不确定我有没有认对,但以前玩了太多《星际争霸》,总觉得这些家伙就是刺蛇&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;街角的巨幅壁画:一位戴眼镜、盘着灰色发髻的老奶奶,两侧是鸽子和紫色的城市建筑&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2101&quot; height=&quot;2115&quot; src=&quot;/_astro/img_7096-cd130da6.CQOvGu0o_ZRu3Go.webp&quot; &gt;&lt;img alt=&quot;夜晚的《玛丽·波平斯》壁画,画着雨伞、大本钟和滴落的蓝色颜料,位于一栋白色建筑上,上面还有涂鸦签名&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2387&quot; height=&quot;2357&quot; src=&quot;/_astro/img_7083-a1cb125f.CBVRLzF4_Z1ImeId.webp&quot; &gt;&lt;img alt=&quot;粉紫色建筑上的彩色壁画,画着独眼冰淇淋球怪物,下方是 Dirty Dogs 餐厅,门口停着一辆自行车&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;4032&quot; height=&quot;3024&quot; src=&quot;/_astro/img_7098-99273db4.Bqxpgo6f_y2ISn.webp&quot; &gt;&lt;img alt=&quot;蓝色墙面上的模板喷绘壁画,画着撑黄色雨伞的男人们,下半部渐变成锈褐色,旁边是一段金属楼梯&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3384&quot; height=&quot;2901&quot; src=&quot;/_astro/img_7344-7ed4ce8e.CovT3-V7_hGgJI.webp&quot; &gt;&lt;/p&gt;</content:encoded><category>blog</category><category>Adventures</category><category>Graffiti</category><category>montreal</category><category>Photography</category><category>travel</category></item><item><title>怕狗</title><link>https://bisko.be/zh/posts/blog/fear-of-dogs/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/fear-of-dogs/</guid><description>我小时候,大概五六岁的样子,邻居家的狗在我和它玩的时候咬了我一口。伤得不重,就是一道抓痕,但在我那颗小孩子的心里,这简直是一场可怕的经历。那件事之后,我对狗产生了巨大的恐惧。我看到它们就跑,躲回家里或者躲进邻居的院子。</description><pubDate>Fri, 31 Mar 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我小时候,大概五六岁的样子,邻居家的狗在我和它玩的时候咬了我一口。伤得不重,就是一道抓痕,但在我那颗小孩子的心里,这简直是一场可怕的经历。&lt;/p&gt;
&lt;p&gt;那件事之后,我对狗产生了巨大的恐惧。我看到它们就跑,躲回家里或者躲进邻居的院子。如果是朋友家的狗,我也会一直保持警惕,只要那条狗稍微动一下,我就会跑到另一个房间,或者躲到狗够不着的地方。&lt;/p&gt;
&lt;p&gt;长大的过程中我一直躲着狗,不过随着时间推移,我开始慢慢接受它们。第一条我没有尖叫着逃跑的狗,是我表兄弟家的狗——一只名叫 Clara 的&lt;a href=&quot;https://en.wikipedia.org/wiki/Rough_Collie&quot;&gt;粗毛牧羊犬&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;clara&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1505&quot; height=&quot;1027&quot; src=&quot;/_astro/clara-de4f7f1b.CfG1RsCF_Z112bUQ.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;Clara 的英姿 🙂&lt;/p&gt;
&lt;p&gt;她简直是最棒的狗。主人把她训练得特别好,她非常温顺,当然打雷的时候除外。她怕雷怕得要命,必须紧紧抱住她,还得把门关好,不然她就会跑出去,想躲到离暴风雨很远的地方。&lt;/p&gt;
&lt;p&gt;我夏天都在村里度过,她时不时也会来做客,这真的帮我减轻了对狗的恐惧,以及对狗的那种整体上的焦虑。&lt;/p&gt;
&lt;p&gt;在保加利亚这里,到处还是有很多流浪狗,偶尔会构成威胁,因为狗群很容易达到五到十条甚至更多。这一直让我很害怕,天黑出门时,只要听到身后偶尔传来几声狗叫,我就会心慌。&lt;/p&gt;
&lt;p&gt;慢慢地,我发现狗其实没那么可怕,也学会了分辨哪些是有攻击性的狗,哪些是想找人玩的友善的狗。&lt;/p&gt;
&lt;p&gt;上周末,我为自己感到骄傲。&lt;/p&gt;
&lt;p&gt;过去几个月,我们注意到有一条流浪狗在别墅周围转悠。起初我挺害怕有条陌生的狗绕着我们转。来过几次之后,我发现这条狗并没有那么吓人 🙂 它会过来,看看我们,然后走开。&lt;/p&gt;
&lt;p&gt;我鼓起了一点勇气,最后终于攒够了勇气,买了些罐头狗粮,把食物装在一个塑料容器里,站在外面招呼那条狗过来美餐一顿。&lt;/p&gt;
&lt;p&gt;有意思的是,那条狗似乎比我还怕我。我叫了几声,又往后退了一步,它才走到那个临时拼凑的”餐盘”前开始吃。&lt;/p&gt;
&lt;p&gt;胜利了!🙂&lt;/p&gt;
&lt;p&gt;我们离开别墅的时候,从后视镜里看着它跟着车一路跑,也特别有趣。&lt;/p&gt;
&lt;p&gt;Radi 的妈妈甚至给它起了个名字,叫 Bear。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Bear 在偷杯子。&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2076&quot; height=&quot;1594&quot; src=&quot;/_astro/img_5556-54e1db0f.Dxlc4oQQ_1RmVVu.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;——这个杯子现在是我的了!&lt;/p&gt;</content:encoded><category>blog</category><category>Uncategorized</category></item><item><title>滑冰</title><link>https://bisko.be/zh/posts/blog/ice-skating/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/ice-skating/</guid><description>这事已经过去快一个月了,但我永远不会忘记 🙂 去年的最后一天,我表哥提议去一趟溜冰场。我从没去过,而且我怕得要命,生怕把四肢全摔断。幸好我小时候玩过一点轮滑,当时</description><pubDate>Mon, 30 Jan 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这事已经过去快一个月了,但我永远不会忘记 🙂&lt;/p&gt;
&lt;p&gt;去年的最后一天,我表哥提议去一趟溜冰场。我从没去过,而且我怕得要命,生怕把四肢全摔断。&lt;/p&gt;
&lt;p&gt;幸好我小时候玩过一点轮滑,这让我的自信心提升了不少。我知道滑冰大概和轮滑差不多。不过,当我穿上冰鞋踏上冰面的那一刻,我还是完全没有心理准备——实在是太滑了!&lt;/p&gt;
&lt;p&gt;我的恐惧很快就消失了,而且不用扶着护栏也能滑起来。以前轮滑的经验全都回来了,我可以稳稳地站在冰面上。&lt;/p&gt;
&lt;p&gt;这是一次超级有趣的体验,我绝对还会再去溜冰场!🙂&lt;/p&gt;
&lt;p&gt;作为额外福利,我还拍到了一段表哥在冰面上摔倒的“第一人称”视角:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.instagram.com/p/BOrgVw6j8O3/?taken-by=biskobe&quot;&gt;https://www.instagram.com/p/BOrgVw6j8O3/?taken-by=biskobe&lt;/a&gt;&lt;/p&gt;</content:encoded><category>blog</category><category>Adventures</category><category>Winter</category><category>fun</category><category>ice</category><category>skating</category></item><item><title>如何通过电子方式办理永久 EORI 号码，或者说：为什么纸质文件永远不会消亡</title><link>https://bisko.be/zh/posts/blog/%D0%BA%D0%B0%D0%BA-%D0%B4%D0%B0-%D1%81%D0%B8-%D0%B8%D0%B7%D0%B2%D0%B0%D0%B4%D0%B8%D0%BC-%D0%BF%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B5%D0%BD-eori-%D0%BD%D0%BE%D0%BC%D0%B5%D1%80-%D0%BF%D0%BE-%D0%B5/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/%D0%BA%D0%B0%D0%BA-%D0%B4%D0%B0-%D1%81%D0%B8-%D0%B8%D0%B7%D0%B2%D0%B0%D0%B4%D0%B8%D0%BC-%D0%BF%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B5%D0%BD-eori-%D0%BD%D0%BE%D0%BC%D0%B5%D1%80-%D0%BF%D0%BE-%D0%B5/</guid><description>重要说明——本文内容截至 2017 年 🙂 评论区里有几处流程更新，也请一并看看。评论 1 中的更新 另外，我收到过另一位最近（2020 年 9 月）走过这个流程的人发来的邮件，但还在等他告知目前的流程是什么样的。不过，如果你还是想看 2017 年的流程是怎样的</description><pubDate>Fri, 06 Jan 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;重要说明——本文内容截至 2017 年 🙂 评论区里有几处流程更新，也请一并看看。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bisko.be/2017/01/%d0%ba%d0%b0%d0%ba-%d0%b4%d0%b0-%d1%81%d0%b8-%d0%b8%d0%b7%d0%b2%d0%b0%d0%b4%d0%b8%d0%bc-%d0%bf%d0%be%d1%81%d1%82%d0%be%d1%8f%d0%bd%d0%b5%d0%bd-eori-%d0%bd%d0%be%d0%bc%d0%b5%d1%80-%d0%bf%d0%be-%d0%b5/#comment-16503&quot;&gt;评论 1 中的更新&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;另外，我收到过另一位最近（2020 年 9 月）走过这个流程的人发来的邮件，但还在等他告知目前的流程是什么样的。&lt;/p&gt;
&lt;p&gt;不过，如果你还是想看 2017 年的流程是怎样的，可以读完整篇文章。&lt;/p&gt;
&lt;p&gt;如果不想——&lt;a href=&quot;https://bisko.be/2017/01/%D0%BA%D0%B0%D0%BA-%D0%B4%D0%B0-%D1%81%D0%B8-%D0%B8%D0%B7%D0%B2%D0%B0%D0%B4%D0%B8%D0%BC-%D0%BF%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B5%D0%BD-eori-%D0%BD%D0%BE%D0%BC%D0%B5%D1%80-%D0%BF%D0%BE-%D0%B5/#comments&quot;&gt;直接跳到评论区&lt;/a&gt;，看看有哪些变化，以及大家又碰上了哪些新麻烦。&lt;/p&gt;
&lt;h4 id=&quot;2017-年的原文&quot;&gt;&lt;em&gt;&lt;strong&gt;2017 年的原文&lt;/strong&gt;&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;TL;DR 和具体步骤在文末 🙂&lt;/p&gt;
&lt;p&gt;圣诞节前后，我撞见了一个相当不错的优惠——Transcend 480 GB SSD 硬盘，只要 86 美元——赚到了！问题是：它来自 Amazon.com，这意味着会被海关拦下。&lt;/p&gt;
&lt;p&gt;价格和贪心占了上风，我在 12 月 28 日下了单，1 月 3 日它就已经到索非亚了。走的是 DHL，一切都很棒。DHL 的工作人员告诉我，他们需要一份委托书、一份保加利亚语的货物描述，以及那个梦寐以求的 EORI 号码。&lt;/p&gt;
&lt;p&gt;前两样很简单：跑一趟公证处，再写一行自由文本就行。&lt;/p&gt;
&lt;p&gt;但 EORI 号码就完全是另一回事了。&lt;/p&gt;
&lt;p&gt;凡是和海关打过交道的人都知道，EORI 号码有两种——永久的和临时的。临时的当场就能办，只对某一次具体的货运有效。如果以后的包裹还需要，每次都得重新办一个。&lt;/p&gt;
&lt;p&gt;我从熟人那里了解到，永久 EORI 号码可以通过海关的在线系统免费办理。而 DHL 呢，办一个要收一笔费用。我对电子系统还抱有信心（我真是太天真了），于是决定省点钱。&lt;/p&gt;
&lt;p&gt;3 号下午，我坐下来，开始琢磨这事到底怎么弄，到底该怎么“注册”一个 EORI 号码。&lt;/p&gt;
&lt;p&gt;海关的电子门户（ecustoms.bg）如果直接访问是毫无用处的。为什么？因为它要求你已经在里面注册过。我再重复一遍——要访问它，你得先在里面注册过。如果你还没注册，该怎么注册，对我来说依然是个谜。另一件小一点的糟心事是，访问它还需要电子签名。&lt;/p&gt;
&lt;p&gt;目前为止还好（才怪）。我打开 Google，开始念咒语，想搞清楚怎么提交那份梦寐以求的申请。搜了几轮之后，我来到了这个页面：&lt;em&gt;&lt;a href=&quot;http://ecustoms.bg/eportal/public/Controler?control=UpdateForm&amp;#x26;doc%5C_def%5C_id=24&amp;#x26;row%5C_id=1&amp;#x26;param%5C_selector=4&quot;&gt;http://ecustoms.bg/eportal/public/Controler?control=UpdateForm&amp;#x26;doc\_def\_id=24&amp;#x26;row\_id=1&amp;#x26;param\_selector=4&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Screen Shot 2017-01-06 at 11.13.28.png&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1287&quot; height=&quot;860&quot; src=&quot;/_astro/Screen-Shot-2017-01-06-at-11.13.28-f052b73c.B7w6nr_s_1fJCpg.webp&quot; &gt;&lt;/p&gt;
&lt;p&gt;目前为止还好，我仔细读着文字，好不容易才看到藏在“这里”上的链接，点击，然后……什么都没有。这个链接把我带到了一个不工作的系统——&lt;em&gt;&lt;a href=&quot;https://ecustoms.bg:18443/eportal/servlet/Controler?control=ReaderForm&amp;#x26;doc%5C_def%5C_id=3&amp;#x26;row%5C_id=5&quot;&gt;https://ecustoms.bg:18443/eportal/servlet/Controler?control=ReaderForm&amp;#x26;doc\_def\_id=3&amp;#x26;row\_id=5&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;我又念了一阵咒语，祈祷这不是那种只在工作日 9 点到 5 点运行的在线系统，但我没有放弃，继续往下找。&lt;/p&gt;
&lt;p&gt;又是 Google 里的咒语，几次失败之后，纯属天大的巧合，我找到了：&lt;a href=&quot;https://eori.customs.bg:8443/&quot;&gt;https://eori.customs.bg:8443/&lt;/a&gt;。接下来是惊讶、惊呼、庆祝，等等。&lt;/p&gt;
&lt;p&gt;我赶紧用上电子签名，急匆匆地研究界面，整个界面一共 4 个按钮，其中两个是&lt;strong&gt;退出&lt;/strong&gt;，一个是&lt;strong&gt;刷新&lt;/strong&gt;。最后一个按钮大概类似“注册”，但因为注册过一次之后就看不到它了，所以我没法确切告诉你上面写的是什么。&lt;/p&gt;
&lt;p&gt;点击，弹出一个表单，里面有好几种不同的字段，上面还有一些代码。我填了知道是什么意思的那些，其他的则是 terra incognita。有些加粗了，有些没有，但哪些是必填的、哪些不是，完全不清楚。&lt;/p&gt;
&lt;p&gt;回到 Google。咒语——没用。最后我决定按字段里的具体短语来搜，纯属偶然，我找到了 &lt;a href=&quot;http://ecustoms.bg/eportal/public/DocumentViewer?row_id=265&quot;&gt;http://ecustoms.bg/eportal/public/DocumentViewer?row_id=265&lt;/a&gt;，原来这是关于建立 EORI-BG 登记的条例。真是太好了。不是弹出几个带字段简短说明的小提示，而是要人去翻条例和法律，才能填好一张表。C’est la vie，或者用保加利亚化的说法——这里就是这样。&lt;/p&gt;
&lt;p&gt;一份条例可拦不住我。我斜着扫了一遍，一直读到末尾，在那里看到了几个用于纸质版申请的示例表格。我把表单补填完整，保存，用电子签名签署，然后开始祈祷。&lt;/p&gt;
&lt;p&gt;流程从大约 18 点开始，到 21:43 结束。就为了一份在线申请。&lt;/p&gt;
&lt;p&gt;如果我直接去索非亚的某个海关当场办，可能会更快，只不过这个 EORI 号码是按常住地址签发的，而我的户籍还在蒙大纳。是啊，可蒙大纳没有海关。最近的在洛姆，离蒙大纳大约 40 公里。而我在索非亚。如果用纸质方式提交申请，得跑那边两趟，我一点都不喜欢这样。外面下着雪，而且只能在工作日办，再加上国家行政机关的其他种种美妙之处。&lt;/p&gt;
&lt;p&gt;到这一步，我依然相信电子系统，还很高兴不用为这么点小事跑到保加利亚的另一头（还能省点钱，对吧，毕竟一切都是从这儿开始的）。&lt;/p&gt;
&lt;p&gt;两天过去了，已经是周四，申请毫无进展。我开始有点怀疑了。我打电话给海关相应的 Service Desk，一位女职员非常礼貌地告诉我，期限是最多 5 个工作日，如果之后还没办好，再打给她。好吧，我等等。&lt;/p&gt;
&lt;p&gt;白天我去读了关于这些梦寐以求的 EORI 在线申请的帖子，看看大家分享了什么经历，结果所有人都一样——有运气就有，没运气就等着。有人提到，他们去问了地区海关，对方说没有收到这样的申请。到这里，我对电子系统的信心开始岌岌可危。&lt;/p&gt;
&lt;p&gt;今天是周五，我觉得最好查一下，我是不是也碰巧成了这个电子系统的受害者之一。我打电话给洛姆海关。一位客气的女职员让我打给负责这块的部门。她报了一个洛姆的本地号码，没带区号，经过几个关于她念的这串数字是什么的蠢问题之后，我才搞明白，这其实是另一部电话，让我打那个。我们俩在电话里为这个局面相视一笑，然后我拨了她给我的号码。&lt;/p&gt;
&lt;p&gt;那边又是一位同样礼貌的先生接了电话，听完我的问题后说，他们是在申请送达后才处理的，他们这边什么都没收到，他会去查查怎么回事、为什么没收到。让我 10 分钟后再打。我很高兴，至少链条上所有人的态度都很有人情味，没有那种社会主义时代的呛声和傲慢腔调。我开始等待，不到 5 分钟，就收到了一封新邮件的通知，标题是：“&lt;strong&gt;Информация за вашата EORI регистрация!&lt;/strong&gt;”（关于您的 EORI 注册的信息！）耶！我拿到了！&lt;/p&gt;
&lt;p&gt;我把它转给了 DHL，现在只剩下清关放行，然后收货了。耶！（再来一次）&lt;/p&gt;
&lt;p&gt;最后（或者说 TL;DR），是一份更精炼的在线办理永久 EORI 号码指南：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果没有电子签名，先办一个。&lt;/li&gt;
&lt;li&gt;前往：&lt;a href=&quot;https://eori.customs.bg:8443/&quot;&gt;https://eori.customs.bg:8443/&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;下载 &lt;a href=&quot;http://ecustoms.bg/eportal/public/DocumentViewer?row_id=265&quot;&gt;http://ecustoms.bg/eportal/public/DocumentViewer?row_id=265&lt;/a&gt;，看看字段该怎么填。你需要的信息在最后几页。&lt;/li&gt;
&lt;li&gt;提交申请，并且务必签名。你应该能看到一行，其“操作”列的值为：&lt;strong&gt;EORI-REG-SIGN&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;等一天，或者如果你觉得自己运气不错，就打电话给你提交申请所对应的海关地区分支，委婉地问问他们是否收到了，因为电子系统给你报了一些错误。别说你很着急。&lt;/li&gt;
&lt;li&gt;过一阵子，你就会收到那个梦寐以求的 EORI 号码。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;几点说明：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;电子签名必须是你本人的名字，因为填写表单时，很多数据（姓名、身份证号、邮箱）都是从签名里提取的。也就是说，用朋友的签名是行不通的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这个系统用起来相当古怪，有时候还相当任性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;仔细检查完所有字段后，再发送并签名表单。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 Mac 的 Chrome 上配合 Infonotary 的签名可以成功使用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下面这条说明来自 &lt;a href=&quot;http://bisko.be/2017/01/%d0%ba%d0%b0%d0%ba-%d0%b4%d0%b0-%d1%81%d0%b8-%d0%b8%d0%b7%d0%b2%d0%b0%d0%b4%d0%b8%d0%bc-%d0%bf%d0%be%d1%81%d1%82%d0%be%d1%8f%d0%bd%d0%b5%d0%bd-eori-%d0%bd%d0%be%d0%bc%d0%b5%d1%80-%d0%bf%d0%be-%d0%b5/#comment-16471&quot;&gt;Петя&lt;/a&gt; 的评论：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;当我尝试用电子签名签署时，会开始下载一个文件（stampitls）。和海关的 HelpDesk 纠缠了两天之后，他们给我&lt;a href=&quot;http://bisko.be/wp-content/uploads/2018/05/stampit-sign-esig.pdf&quot;&gt;发来了一份说明&lt;/a&gt;，我照着做才成功签上了名。&lt;br&gt;
还有一点——如果你的地址在索非亚，并决定用电子签名办理 EORI 号码，在选择海关机构时请选 &lt;strong&gt;ТМУ Столична&lt;/strong&gt;——大约一小时就能搞定，而如果选 Летище София（索非亚机场），可能要花up to 5 个工作日&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;</content:encoded><category>blog</category><category>bisko.be</category><category>Митница</category><category>eori</category><category>еори</category><category>митница</category></item><item><title>《电子商务法》与商业信息(……未经请求的……)</title><link>https://bisko.be/zh/posts/blog/%D0%B7%D0%B5%D1%82-%D0%B8-%D1%82%D1%8A%D1%80%D0%B3%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D1%82%D0%B5-%D1%81%D1%8A%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BD%D0%B5%D0%BF%D0%BE%D0%B8%D1%81%D0%BA/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/%D0%B7%D0%B5%D1%82-%D0%B8-%D1%82%D1%8A%D1%80%D0%B3%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D1%82%D0%B5-%D1%81%D1%8A%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D1%8F-%D0%BD%D0%B5%D0%BF%D0%BE%D0%B8%D1%81%D0%BA/</guid><description>今天我又一次看到了“根据《电子商务法》第6条第(1)款,本商业信息可能是未经请求的”,然后紧跟着整整5页胡说八道的呕吐物,没有任何格式,没有清晰分隔的章节,等等。因为我实在受够了读这种破玩意儿,于是去翻了翻《电子商务法》,看看这个臭名昭著的条款到底说了啥</description><pubDate>Tue, 24 Aug 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今天我又一次看到了“根据《电子商务法》第6条第(1)款,本商业信息可能是未经请求的”,然后紧跟着整整5页胡说八道的呕吐物,没有任何格式,没有清晰分隔的章节,等等。&lt;/p&gt;
&lt;p&gt;因为我实在受够了读这种破玩意儿,于是去翻了翻《电子商务法》,看看这个臭名昭著的第6条到底说了啥,结果读到:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;第6条&lt;/strong&gt; (1) 未经收件人事先同意、通过电子邮件发送未经请求的商业信息的服务提供者,有义务确保该商业信息在到达收件人时即可被清楚、明确地识别为未经请求的信息。&lt;/p&gt;
&lt;p&gt;(2) (修订——《国家公报》2006年第105期,自2006年12月24日起生效)消费者保护委员会按照部长理事会条例规定的程序,维护一份电子登记册,登记不希望收到未经请求的商业信息的法人的电子地址。&lt;/p&gt;
&lt;p&gt;(3) 禁止向第2款所述登记册中登记的电子地址发送未经请求的商业信息。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;到这儿都挺好,一切清楚,我同意。我没必要跟法律条文较真,忍忍就过去了,要不就屏蔽,啦啦啦,然后继续往下读第4款,我看到了什么:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(4) &lt;strong&gt;禁止&lt;/strong&gt;未经消费者&lt;strong&gt;事先同意&lt;/strong&gt;而向其发送未经请求的商业信息。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;呃……啥?照这么说,他们应该先给我发一封小邮件,问问我是否同意收到这一大堆呕吐物,可他们根本没这么干。他们只是宣布,根据第6条第(1)款,这条商业信息可能不是我主动要求的,然后就在同一封邮件里把整堆呕吐物全倒了出来。压根没问我同不同意——直接一脚把门踹开。&lt;/p&gt;
&lt;p&gt;我就纳闷了,这种做法有多合法——没有我的明确同意就发垃圾邮件?&lt;/p&gt;</content:encoded><category>blog</category><category>bisko.be</category><category>Random rants</category><category>закони</category><category>спам</category></item><item><title>拼音式键盘布局与 xorg</title><link>https://bisko.be/zh/posts/blog/phonetics-and-xorg/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/phonetics-and-xorg/</guid><description>在今年一、二月前后出现的某个较新版本的 xorg 里,拼音式(фонетична)键盘布局被人悄悄改动了。改的人显然压根没考虑过普通用户,一心只想把拼音布局变成 БДС 标准布局。改动体现在:引入了上下引号字符,取代了 &lt;&gt;,用段落符号取代了 &amp;,用欧元符号取代了 ^。</description><pubDate>Sat, 15 May 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在今年一、二月前后出现的某个较新版本的 xorg 里,拼音式键盘布局里被人悄悄塞进了一些改动。改的人显然压根没考虑过普通用户,一心只想把拼音布局变成 БДС 标准布局。改动体现在:引入了上下引号字符,取代了 &amp;#x3C;&gt;;用段落符号取代了 &amp;#x26;;用欧元符号取代了 ^。&lt;/p&gt;
&lt;p&gt;要纠正这些恶行,在 &lt;strong&gt;~/.bashrc&lt;/strong&gt; 中加入以下几行:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;xmodmap -e “keycode 16 = 7 ampersand 7 ampersand”&lt;/p&gt;
&lt;p&gt;xmodmap -e “keycode 12 = 3 numbersign 3 numbersign”&lt;/p&gt;
&lt;p&gt;xmodmap -e “keycode 15 = 6 asciicircum 6 asciicircum”&lt;/p&gt;
&lt;p&gt;xmodmap -e “keycode 20 = minus underscore minus underscore”&lt;/p&gt;
&lt;p&gt;xmodmap -e “keycode 59 = comma less comma less”&lt;/p&gt;
&lt;p&gt;xmodmap -e “keycode 60 = period greater period greater”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;然后注销(logout),再重新登录(log-in)系统,你应该就能找回原来的符号布局了。&lt;/p&gt;
&lt;p&gt;P.S. 还有一处改动:原来大写的 ь(小写的 er,拉丁字母 x 的位置)被换成了 ѝ(带重音的 и),我觉得这个改动挺有用,所以上面的修改里没有把它改回去。&lt;/p&gt;</content:encoded><category>blog</category><category>bisko.be</category><category>Funny</category><category>Random rants</category><category>Tech</category></item><item><title>移除 iPhone 密码锁</title><link>https://bisko.be/zh/posts/blog/removing-iphone-passcode-lock/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/removing-iphone-passcode-lock/</guid><description>昨天我喝了点酒，决定给我的 iPhone 加个密码锁，以防万一有人想摸进去看看（蠢蠢的被害妄想症）……于是我就开始设置密码，在设置里输入了两遍，设成了我自以为是我输入的那个数字，然后</description><pubDate>Sat, 14 Nov 2009 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;昨天我喝了点酒，决定给我的 iPhone 加个密码锁，以防万一有人想摸进去看看（蠢蠢的被害妄想症）……于是我就开始设置密码，在设置里输入了两遍，设成了我自以为是我输入的那个数字，然后锁上了手机（电源/休眠按钮）。然后我想解锁的时候，貌似我输入的两次数字根本不是我想要的那个数字。于是那天晚上剩下的时间我都在想办法搞清楚那个号码到底是什么，但还是没成功。&lt;/p&gt;
&lt;p&gt;现在头脑清醒了点，我找到了一个移除密码锁的方法（不过手机上所有其他密码也会一并被清除）。&lt;/p&gt;
&lt;p&gt;步骤如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;进入手机的文件系统（Linux 下很简单——可以参考 &lt;a href=&quot;http://marcansoft.com/blog/2009/10/iphone-syncing-on-linux-part-2/&quot; title=&quot;Marcansoft&quot;&gt;http://marcansoft.com/blog/2009/10/iphone-syncing-on-linux-part-2/&lt;/a&gt; 关于访问 ipod 文件系统的说明——iPhone 和 iPod touch 同理）。&lt;/li&gt;
&lt;li&gt;然后进入 &lt;strong&gt;/private/var/Keychains&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;把名为 &lt;strong&gt;keychain-2.db&lt;/strong&gt; 的文件移动到其他位置，比如 /&lt;/li&gt;
&lt;li&gt;然后进入 &lt;strong&gt;/var/mobile/Library/Preferences/&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;把名为 &lt;strong&gt;com.apple.springboard.plist&lt;/strong&gt; 的文件移动到其他位置，比如 /&lt;/li&gt;
&lt;li&gt;然后你需要杀掉 springboard 进程（如果是通过 SSH 连接的，用 &lt;strong&gt;killall SpringBoard&lt;/strong&gt;）&lt;strong&gt;或者直接重启&lt;/strong&gt;手机。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;搞定，就是这样。&lt;/p&gt;
&lt;p&gt;这么做的副作用是你会丢失所有邮件账户、Exchange 账户的密码，以及主屏幕图标的排列顺序，但至少你不用刷机 🙂&lt;/p&gt;</content:encoded><category>blog</category><category>bisko.be</category><category>Random rants</category><category>Tech</category><category>drinkingisbad</category><category>Funny</category><category>iphone</category><category>ipod</category><category>ipod touch</category><category>lock</category><category>lockdown</category><category>passcode</category></item><item><title>最后几滴电量……</title><link>https://bisko.be/zh/posts/blog/last-drops-of-battery/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/last-drops-of-battery/</guid><description>今天晚上我们小区突然停了一会儿电,我决定是时候考验一下我那台 Acer 5935g 的电池了。我拔掉电源线,继续我的《嗜血法医》第二季电影之夜。这就是我这个小小电池测试的最终结果:看电影 1:30 小时,上网 35 分钟</description><pubDate>Tue, 08 Sep 2009 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今天晚上我们小区突然停了一会儿电,我决定是时候考验一下我那台 Acer 5935g 的电池了。我拔掉电源线,继续我的《嗜血法医》(Dexter)第二季电影之夜。&lt;/p&gt;
&lt;p&gt;下面就是我这个小小电池测试的最终结果:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1:30 小时 – 看电影&lt;/li&gt;
&lt;li&gt;35 分钟 – 上网&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;加起来一共是 2:05 小时的电池续航(至少是有保证的),而且我还剩下将近半小时的电量储备,可以把手头在写的一些文字收个尾。&lt;/p&gt;
&lt;p&gt;其实这是我第一次这么接近厂商规格里标称的电池续航时间。我很高兴当初选了 Acer 🙂&lt;/p&gt;
&lt;p&gt;我测试电池时的系统环境是:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Acer 5935g(原装电池)&lt;/li&gt;
&lt;li&gt;Windows Vista SP2 64 位&lt;/li&gt;
&lt;li&gt;启用 GeForce 130M(而不是板载的 Intel 4500)&lt;/li&gt;
&lt;li&gt;Razer Copperhead 鼠标&lt;/li&gt;
&lt;li&gt;亮度始终保持 60%&lt;/li&gt;
&lt;li&gt;Skype 在后台运行&lt;/li&gt;
&lt;li&gt;WiFi 开启,已连接网络&lt;/li&gt;
&lt;li&gt;KMplayer 播放 DivX(中间会频繁拖动进度条(我没法从头到尾不拖动地看完一部电影 🙂 )&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接下来会在 Linux 下用同样的操作再测一次。不过我得先安装和配置好系统,那得等我有空闲时间的时候了。&lt;/p&gt;</content:encoded><category>blog</category><category>bisko.be</category><category>Tech</category><category>acer</category><category>battery</category><category>cool</category><category>regards</category><category>video</category></item><item><title>Canon 相机 E16 错误</title><link>https://bisko.be/zh/posts/blog/error-e16-canon-camera/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/error-e16-canon-camera/</guid><description>事情从昨天说起,我爸跟我说他的相机(Canon A610)坏了,开机(拍摄模式下)唯一的动作就是镜头伸出来,再缩回去,然后黑屏上显示 Error E16。我上网翻了一圈,大多数信息都说这个问题原因不明,</description><pubDate>Wed, 02 Sep 2009 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;事情从昨天说起,我爸跟我说他的相机(&lt;strong&gt;Canon A610&lt;/strong&gt;)坏了,开机(拍摄模式下)唯一的动作就是镜头伸出来,再缩回去,然后在黑屏上显示&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Error E16&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我上网翻了一圈,大多数信息都说这个&lt;strong&gt;问题原因不明&lt;/strong&gt;,而且并不少见,建议把相机寄到 Canon,他们会给你换一台。&lt;/p&gt;
&lt;p&gt;到这儿都挺好,只可惜这台相机的保修在一年多前就过期了(总之&lt;strong&gt;不在保修期内&lt;/strong&gt;,因为它是 2006 年 5 月买的)。&lt;/p&gt;
&lt;p&gt;我一时也没辙,直到我爸突然开窍,试了”黄种人”设备的&lt;strong&gt;标准&lt;/strong&gt;招数——&lt;strong&gt;揍它&lt;/strong&gt;!🙂&lt;/p&gt;
&lt;p&gt;结果发现,对相机&lt;strong&gt;用力摇晃或者拍打几下&lt;/strong&gt;,&lt;strong&gt;错误&lt;/strong&gt;很有可能&lt;strong&gt;消失,相机也就恢复正常&lt;/strong&gt;了。&lt;/p&gt;
&lt;p&gt;不过这招也有它的&lt;strong&gt;风险&lt;/strong&gt;——一旦出现过,&lt;strong&gt;很可能还会再出现&lt;/strong&gt;,一切都只是&lt;strong&gt;时间问题&lt;/strong&gt;。所以你得考虑买&lt;strong&gt;新相机&lt;/strong&gt;了,在此之前就先靠这台旧的撑着吧。&lt;/p&gt;
&lt;p&gt;这整件事还有个”酷”炫的副作用——视频只能”工作一半”,你可以在下面的链接里看到:E16 error on Canon A610&lt;/p&gt;
&lt;p&gt;--- ## 本地保存的外部下载 - [&lt;a href=&quot;http://www.youtube.com/watch?v=fQGdaOgQt9M%5C&quot;&gt;http://www.youtube.com/watch?v=fQGdaOgQt9M\&lt;/a&gt;](media/грешка-e16-при-фотоапарат-canon-Canon A610 E16 error video.mkv)&lt;/p&gt;</content:encoded><category>blog</category><category>bisko.be</category><category>camera</category><category>canon</category><category>chinatech</category><category>e16</category><category>error</category><category>fix</category></item><item><title>iPhone 3.0</title><link>https://bisko.be/zh/posts/blog/iphone-30/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/iphone-30/</guid><description>哇啊啊啊…… 我开心得像个小孩 😉 我已经用上了最新版的 iPhone OS，也就是期待已久的 3.0 版本。乍一看它就是个大玩具，直到你摸清了新固件里那些（当然是有用的）新东西。下面是一些我个人觉得有用的：Spotlight（第一屏（如果把 Home 算作第一屏，那它就是第零屏）——超爽</description><pubDate>Fri, 19 Jun 2009 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;哇啊啊啊…… 我开心得像个小孩 😉&lt;/p&gt;
&lt;p&gt;我已经用上了最新版的 iPhone OS，也就是期待已久的 3.0 版本。&lt;br&gt;
乍一看它就是个大玩具，直到你摸清了新固件里那些（当然是有用的）新东西。下面是一些我个人觉得有用的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Spotlight&lt;/strong&gt;（第一屏（如果把 Home 算作第一屏，那它就是第零屏）——太让人开心了。输入 3 个字母，就能给想找的人打电话，或者播放想听的歌。还可以在设置里调成双击 Home 键时打开。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Landscape&lt;/strong&gt;（把屏幕横过来）——简直爽翻了 🙂 。短信、电子邮件、备忘录——全都支持横屏…… 啊啊啊啊啊啊啊啊啊（欢呼）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copy&amp;#x26;Paste&amp;#x26;Undo&amp;#x26;…&lt;/strong&gt;（以前没有的那些功能）——复制粘贴的功能设计得非常巧妙。（可以在各种评测里看到。）到目前为止我发现了 2 个 bug。第一次复制图片加文字时，只会复制图片。另一个 bug 是：如果你在 Safari 里选中了某些内容准备复制，把它关掉再马上重新打开，会先看到被选中的区域，然后才加载出别的内容。&lt;/li&gt;
&lt;li&gt;更详细的 &lt;strong&gt;Call Log&lt;/strong&gt;（通话记录）——现在在 Phone.app 里可以看到与某个号码通话的更详细信息，比如通话时长、通话时间、通话状态。&lt;/li&gt;
&lt;li&gt;可以关闭短信提醒：设置 -&gt; Settings -&gt; General -&gt; Messages -&gt; Repeat Alert——再也不用被手机那种吓人的震动声惊到了，比如你忘了打开那条在主屏幕上已经读过的短信的时候。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;iPod&lt;/strong&gt; 的改进——&lt;strong&gt;Shake to Shuffle&lt;/strong&gt;（把手机往旁边一甩，就会随机切换一首歌）——挺方便，不过得摇得相当用力才行。（给自己的备忘：要在小巴和市区公交上测试一下）；在播客里，有一个这——么大的&lt;strong&gt;后退 30 秒按钮&lt;/strong&gt;，用于正在播放的播客。旁边还有 &lt;strong&gt;1x（2x、1/2x）按钮&lt;/strong&gt;，想加快或放慢所听播客的速度就用它。（听起来非常搞笑，尤其是当你听的东西已经足够快的时候）；还可以在线浏览播客，然后再下载到手机上。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;速度&lt;/strong&gt;——我吓了一跳……手机至少比 2.2.1 快了 60%。打开应用快如闪电，关闭也一样。现在在我打开或关闭其他应用，或者 iPod 本身的时候，声音甚至不再卡顿了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;暂时想不到别的了，但我保证，等我发现新固件里更多有用的东西，就会来补充这份清单。&lt;/p&gt;</content:encoded><category>blog</category><category>bisko.be</category><category>cool</category><category>iphone</category><category>update</category></item><item><title>IE daily</title><link>https://bisko.be/zh/posts/blog/ie-daily/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/ie-daily/</guid><description>如果有时候，也不知道从哪儿冒出来的问题，你的某个元素的边框在 IE6、7 里“断断续续”的，试着给这个元素加上 background，很有可能就搞定了。</description><pubDate>Sat, 30 May 2009 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如果有时候，也不知道从哪儿冒出来的问题，你的某个元素的边框在 IE6、7 里“断断续续”的，试着给这个元素加上 background，很有可能就搞定了。&lt;/p&gt;</content:encoded><category>blog</category><category>bisko.be</category><category>bug</category><category>ie</category></item><item><title>Will it Lens?</title><link>https://bisko.be/zh/posts/blog/will-it-lens/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/will-it-lens/</guid><description>谷歌那帮家伙真是疯得不轻 🙂 http://googleblog.blogspot.com/2009/04/will-it-lens.html</description><pubDate>Sat, 11 Apr 2009 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;谷歌那帮家伙真是疯得不轻 🙂&lt;br&gt;
&lt;a href=&quot;http://googleblog.blogspot.com/2009/04/will-it-lens.html&quot;&gt;http://googleblog.blogspot.com/2009/04/will-it-lens.html&lt;/a&gt;&lt;/p&gt;</content:encoded><category>blog</category><category>bisko.be</category><category>google</category><category>lens</category></item><item><title>Vatsa大妈……或者说,和老头老太太同行的旅途</title><link>https://bisko.be/zh/posts/blog/lelq-vaca/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/lelq-vaca/</guid><description>周五13:30……上班的最后几分钟。我签好离职单,说完最后几句话,出发去中央火车站。上了电车,我小心翼翼地开始盘算时间,同时和我那贪吃的“我”作斗争——到底要不要顺路去McDonalds买点吃的……我成功地把它压下去了,</description><pubDate>Sun, 09 Nov 2008 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;周五13:30……上班的最后几分钟。我签好离职单,说完最后几句话,出发去中央火车站。上了电车,我小心翼翼地开始盘算时间,同时和我那贪吃的“我”作斗争,争论要不要顺路去McDonalds买点吃的……我成功地把它压下去了,因为粗略一算,我可能赶不及在3:15前到火车站,而那时我和Irji大哥约好了见面。&lt;/p&gt;
&lt;p&gt;当然,我的粗略计算压根儿不靠谱……我提前了将近40分钟就到了……这时我那贪吃的“我”(从这里开始,为了简短,我就叫它小猪仔),开始没完没了地唠叨:“你本来可以去买点吃的的,对吧!”。我对着小猪仔骂了几句之后走进车站,结果当场傻眼:“我靠!这火车站我从来没见过这么多人!!!”。那叫一个满,比……我也不知道比什么都满……简直是人挤人 🙂 。我看长椅上一个空位都没有,就走到外面,坐在钟楼下面的台阶上。我给Ivan发短信说这里简直是疯人院,他回我的指示是:立刻去买票 :)。&lt;/p&gt;
&lt;p&gt;我回到里面,直奔小售票窗口……过得飞快。这当然很正常,因为我前面只有两三个人,而其他窗口那边简直是一片疯狂。我买了票,当然是有座位的,然后又到外面等着。Ivan大约15:40才到,因为城市交通和出租车一样,都是坏人 🙂 。我们就守在显示屏前,等着它显示我们的火车从哪里编组发车。坐着等,坐着等,坐着等……已经到了:50了……还是一点消息都没有……此刻我们和整个车站里的其他人一样,处于“我靠,完了”的状态。&lt;/p&gt;
&lt;p&gt;终于有一刻,广播系统(或者这玩意儿叫什么来着)开始通报哪趟车在哪儿,我们眼看着整个车站的人都冲向了站台……&lt;/p&gt;
&lt;p&gt;经过一番推、搡、捅、踩,那场面连美式橄榄球运动员看了都要咋舌,我们终于挤到了站台,开始找自己的座位。这边是12号车厢,那边也是12号车厢……嘿,我们把整列火车都走了一遍,总算找到了我们的车厢。我们赶紧钻进去,因为已经是15:58了,火车随时都会开动,而里面……啊,里面……里面你要么得是个微生物才挤得过去,要么得是个超人才能推开那些在走廊里疯狂乱挤的人。幸好我们的座位在第二个包厢,而不是在中间什么地方,不然真有可能上演一幕《血腥运动X》。&lt;/p&gt;
&lt;p&gt;总之我们安顿好了,等着火车出发。过了差不多两分钟,来了几个老头老太太,说他们在我们这个包厢订了座位,三下两下就把“闯入者”赶走了(虽然我们认识他们,但是……命啊)。不幸的是,那两位来自Berkovitsa的讨厌老太太留了下来……大家都坐好了,我们开始等火车开动。&lt;/p&gt;
&lt;p&gt;这期间我当然认出了其中一位老爷爷,他几年前还住在我们家旁边。他却没认出我……看来是老年痴呆在发言了 😀&lt;/p&gt;
&lt;p&gt;大部分细节我就略过了,因为实在太多,很难记住,不过有一个我要提一下,它直接把我笑翻了:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;…&lt;br&gt;
– 哎,他每天早上都在Vatsa大妈那儿喝咖啡!&lt;br&gt;
– Vatsa大妈?&lt;br&gt;
– 对啊,杯子上写着Vatsa大妈,结果搞不好是lavAzza&lt;br&gt;
…&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;就这样,整整4个小时的老年幽默,有时候“笑得你膈肌撕裂,得在Septemvri(车站)下车去换个新的”。&lt;/p&gt;
&lt;p&gt;最后我们晚点了大约一个小时抵达Montana,不过这一个小时过得飞快 🙂 所以说——如果你要坐火车,而包厢里坐满了老人,至少还有两位老爷爷,别发愁,热闹是保证有的 😀&lt;/p&gt;</content:encoded><category>blog</category><category>bisko.be</category><category>Funny</category><category>Travel</category></item><item><title>这儿?</title><link>https://bisko.be/zh/posts/blog/post-2008-11-01/</link><guid isPermaLink="true">https://bisko.be/zh/posts/blog/post-2008-11-01/</guid><description>讲讲一个奇怪的日子,以及购买 DreamHost 主机的经过。</description><pubDate>Sat, 01 Nov 2008 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;昨天是个奇怪的一天……&lt;/p&gt;
&lt;p&gt;早上虽然出门有点晚、动作也慢吞吞的,我还是准时到了公司。看来堵车这回站在了我这边。这一天本来也过得很正常,直到下午1点左右,Cvetan 给我发来一个链接,是 DreamHost 庆祝11周年生日的促销活动。&lt;br&gt;
我点开就读了起来……主机配置表每往下看一行,我的眼睛就睁得更大、更贪婪一点(口水都快流出来了 :D)。&lt;br&gt;
很快就明白了:就是它了,必须买!但问题来了——怎么付款。我有一张开通了网上支付的卡,可里面没钱;Cvetan 有钱,却没有开通网上支付——撞上石头了……不对,简直是撞上花岗岩了。&lt;/p&gt;
&lt;p&gt;下一步——他通过 ePay.bg 给我转钱,我来付款。一切都挺顺利,直到发现我在那儿的身份是个什么”菜鸟”级别,每日收款上限是……50列弗。我赶紧去找怎么变成”熟客”用户,结果看到的信息让我目瞪口呆:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;如何升级到更高级别&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;要升级到”2”级——“熟客”,您需要在个人账户中绑定一张银行卡,并通过该系统用这张卡至少支付5笔电费、水费、电话费、暖气费等公用事业账单(预付费服务的支付不算作公用事业账单支付)。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;拜托!至少5笔公用事业账单……这都什么鬼东西。我又没有自己的房子,哪来的这些账单要交。纯属胡扯。要是让我拍张身份证照片之类的,行……可这也太过分了,尤其是当你急着马上就要转一笔钱的时候。&lt;/p&gt;
&lt;p&gt;我已经感觉到促销活动像一块涂满肥皂的杯子,正从我们的小手里滑走。事已至此,只剩下最极端的办法——他从瓦尔纳直接把钱转到我在邮政银行的账户上,然后祈祷能成。我把 IBAN 给他,他就去存钱了。25-30-40分钟后他打来电话:“转过去了,他们说最迟2点之前网银里会显示变动。“听到”2点”这个时间我当场傻眼,整件事居然是这么”压线”,于是我煞有介事地等了漫长的15分钟,登录 e-postbank,这回眼睛瞪得有这——么大,下巴都掉了——钱到账了。&lt;/p&gt;
&lt;p&gt;我手忙脚乱地打开 Cvetan 早些时候发给我的 Google Checkout 购物车链接,填好信息,点击 Check out,搞定……那一刻我脑子里冒出无数个问号:怎么这里什么账户验证都没有,不像 Moneybookers 或 PayPal 那样,也不要求什么小额扣款之类的破事,就只是填完信息、点付款,然后就完了……&lt;/p&gt;
&lt;p&gt;接着我给他发了条短信说我付完款了,然后拎起行李前往中央火车站,准备回蒙塔纳。在那儿碰到了几个”旅伴”,我们买了票上了火车。车开了,可我实在没法再等3个小时才知道付款到底成没成,就给 Cvetan 打了电话,他确认一切正常。我心里的大石头总算落了地,松了一口气。&lt;/p&gt;
&lt;p&gt;这一天之后,我得出4条结论:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ePay 是小气鬼,PayPal 和 Moneybookers 也一样。&lt;/li&gt;
&lt;li&gt;邮政银行继续巩固我的看法:它们是正确的选择。&lt;/li&gt;
&lt;li&gt;Google 一如既往地靠简化流程把人”秒”得服服帖帖。&lt;/li&gt;
&lt;li&gt;Dreamhost 让我很爽!(只是上传到那边的速度烂得要命,不过这事以后再说)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;P.S. 我去,我现在已经欠 Cvetan 90块钱了 :-D&lt;/p&gt;</content:encoded><category>blog</category><category>travel</category><category>random</category></item></channel></rss>