| CARVIEW |
Select Language
HTTP/2 301
server: GitHub.com
content-type: text/html
location: https://scateu.me/feed.xml
x-github-request-id: A044:3C3317:34402:3EE3B:69799221
accept-ranges: bytes
age: 0
date: Wed, 28 Jan 2026 04:35:46 GMT
via: 1.1 varnish
x-served-by: cache-bom-vanm7210067-BOM
x-cache: MISS
x-cache-hits: 0
x-timer: S1769574946.894656,VS0,VE241
vary: Accept-Encoding
x-fastly-request-id: 0c26800ac5a67e4e1ad662990621c9365bdb4f43
content-length: 162
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 81810
Server: GitHub.com
Content-Type: application/xml
Last-Modified: Fri, 19 Dec 2025 01:57:40 GMT
Access-Control-Allow-Origin: *
ETag: W/"6944b114-2f97d"
expires: Wed, 28 Jan 2026 04:45:46 GMT
Cache-Control: max-age=600
Content-Encoding: gzip
x-proxy-cache: MISS
X-GitHub-Request-Id: 609D:48A87:345A4:3EFD3:69799222
Accept-Ranges: bytes
Age: 0
Date: Wed, 28 Jan 2026 04:35:46 GMT
Via: 1.1 varnish
X-Served-By: cache-bom-vanm7210039-BOM
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1769574946.416543,VS0,VE252
Vary: Accept-Encoding
X-Fastly-Request-ID: 288332e9665a58a1a0756c4554ca6648e6d3e1ea
Scateu Blog - S.B.
Yet another Scateu Blog (aka SB)
https://scateu.github.io/
Fri, 19 Dec 2025 01:57:25 +0000
Fri, 19 Dec 2025 01:57:25 +0000
Jekyll v3.10.0
-
便捷的Vim大纲写作状态
<p>有时候还是想写一些大纲,带有缩进。</p>
<p>但Tab或4空格的缩进太浪费空间,很容易把屏幕占满。</p>
<p>发现MIT的一些课程的<a href="https://css.csail.mit.edu/6.5660/2023/lec/l01-intro.txt">Syllabus</a>使用了双空格缩进,很科学,很紧凑。</p>
<p>不像Markdown或Org mode的井号、星号那样看起来令人惊恐。Omni Outliner或Bike.app那样又太重,数据格式乱七八糟。</p>
<p>所以可以这样做:</p>
<pre><code>:set tabstop=2 expandtab shiftwidth=2
</code></pre>
<p>或者使用Vim的Modeline技术,在文件首行或末行加上</p>
<pre><code># vim: tabstop=2 expandtab shiftwidth=2:
</code></pre>
<p>这样就可以用<code>>></code>或<code><<</code>来改变缩进状态了。</p>
<p>如果Modeline因为安全问题被Disable掉了,可以在<code>.vimrc</code>里加上:</p>
<pre><code>autocmd FileType text setlocal tabstop=2 shiftwidth=2 expandtab
</code></pre>
<p>来对所有<code>.txt</code>文件生效。</p>
Thu, 18 Dec 2025 00:00:00 +0000
https://scateu.github.io/2025/12/18/poor-man-vim-outliner.html
https://scateu.github.io/2025/12/18/poor-man-vim-outliner.html
-
可乐外交
<p>办公室里经常有一些同事在工位上直接开电话会议。</p>
<p>或者钉钉的响声不关,我以前还做过一个<a href="https://scateu.me/2017/10/30/office-sounds-like-shit.html">模拟器</a>,用来互喷。</p>
<p>开电话会议对别人的干扰不在于声音大小,而是只有TX,没有RX,你作为一个tap在中间,会下意识在RX没声音的时候增加耳朵大脑的灵敏度。</p>
<p>参见<a href="https://cn.nytimes.com/health/20130530/c30phone/">《听别人电话聊天为何让你心烦意乱》</a></p>
<blockquote>
<p>“如果你只听到一个人在说话,你会不断想要将这部分谈话内容置入到谈话语境中去,”加尔万博士说,“不管你想要做些什么,这都会自然而然将你的注意力给吸引过去。”<br />
加尔万和她的同事们说,这个问题还跟控制力有关。当人们坠入一场单方谈话的陷阱边时——现在人们称之为“半边对话”(halfalogue)——就会跟身处无法自由脱身的其他情况,比如等候火车一样,心中的怒火雄雄燃起。</p>
</blockquote>
<p>以前我会直接过去生怼。取决于你的气场。</p>
<p>但我最近一年发现了更好的办法 - 去自动售货机买一听可乐,先放到他桌上(毕竟不能空着手上人家工位),然后轻拍其背,指向远处的会议室/电话亭。要脸的同事马上会意,就拎起电脑走了。</p>
<p>可乐外交也有细分级别:</p>
<ul>
<li>无糖可乐</li>
<li>有糖可乐</li>
<li>冻瓷实的冰块可乐,用来砸对方</li>
<li>或者把可乐直接洒地上祭祀对方</li>
</ul>
<p>PS: 我还发现经常在工位上开会的人,一是会议内容不太重要,可以随便给人听;二是有表现的需要;这两种都不是什么走上坡路的迹象,加上没公德,也没啥发展,可以放心怼。</p>
Thu, 18 Dec 2025 00:00:00 +0000
https://scateu.github.io/2025/12/18/cola-diplomacy.html
https://scateu.github.io/2025/12/18/cola-diplomacy.html
-
再也不见了,RSS阅读器: 用rss2email, public-inbox, nntp
<h2 id="缘由">缘由</h2>
<ul>
<li>RSS一个一个地fetch太累,过于费网络资源</li>
<li>云端RSS阅读器收费,贵</li>
<li>RSS获得的消息,需要保留一段时间,本地的阅读器读完马上mark as read/删除,给我的阅读压力很大,总担心点了阅读又没读懂,就没了</li>
<li>不想折腾邮件服务器,包管理器总是装了好多不知道是啥的东西,即使是dovecot这样的IMAP Server</li>
</ul>
<h2 id="解决方案">解决方案</h2>
<pre><code>rss2email -> maildir -> public-inbox-watch -> .git目录 -> public-inbox-nntpd
\ \
\----> 本地mutt/alpine阅读 \----> 分享给朋友们,使用thunderbird订阅newsgroup
</code></pre>
<h2 id="public-inbox">public-inbox</h2>
<p>是Linux Foundation开发的基于perl的程序,lore.kernel.org里的邮件现在都由public-inbox来提供归档阅读</p>
<p>public-inbox主要的思路是用git仓库来存邮件,每个patch就是一封邮件。</p>
<p>同时有<code>public-inbox-watch</code>,从配置文件里监控各个渠道,如有新邮件进来,就把它写进对应的git目录。</p>
<p>后来有V2版本的git目录,增加了epoch分区,从而避免一个目录的邮件太太太太多。</p>
<p><code>public-inbox-imapd</code> <code>public-inbox-nntpd</code> <code>public-inbox-pop3d</code> <code>public-inbox-httpd</code> 如名字所示,就是对应的imap nntp pop3 http服务器。</p>
<p>用git有一个好处,任何人都可以很方便的mirror上游邮件仓库的数据,还可以更新。</p>
<h2 id="rss2email">rss2email</h2>
<p>由Aaron Swartz发起。可以看看关于他的纪录片 The Internet’s Own Boy。特别是片中有Tim Berners-Lee致的悼词。</p>
<p>它取了RSS之后,可以sendmail,可以IMAP,可以SMTP,也可以Maildir。</p>
<p>由于我不想把RSS跟我的主力IMAP电子邮件服务混到一起,Maildir最合适了。</p>
<h2 id="nntp">NNTP</h2>
<p>参考我之前的文章: <a href="https://scateu.me/2018/01/05/nntp.html">NNTP/USENET:旧世界的遗产和新世界的大门</a></p>
<p>朱令当年的求救邮件在<a href="https://groups.google.com/g/sci.med.nutrition/c/PnHC-1Ipr9Q/m/q6hgcOjGcZMJ">sci.med</a>里。底下有人上来就回复sound like Thallium。发信IP是162.105.195.2,所在地北京大学力学系。北大救清华,谢谢了。</p>
<p>水木清华BBS站也在USENET里有一个对应的分区。</p>
<p>NNTP就是Newsgroup,可以用Emacs Gnus / alpine / w3m / thunderbird等阅读。<br />
所有人共享一份数据,已读/未读标记是在本地的,存在于<code>.newsrc</code>里,里面只标记了从哪到哪读过,很简单。(据说水木的已读/未读也是类似)</p>
<h2 id="动手">动手</h2>
<h3 id="1-raspberry-pi---ssd">1. Raspberry Pi - SSD</h3>
<p>Maildir一封邮件就是一个文件,一定不能用SD卡了。<br />
RPi的较新版本可以直接从SSD引导,卡都不用插。</p>
<p>或许需要<code>rpi-eeprom</code>啥的更新一下,就可以了。</p>
<p>用SD卡的话,插个SSD硬盘,在/etc/fstab里配一下。</p>
<p>然后在无线路由器上端口转发一哈,联通不样用80/8080,http服务可以用8888,实测NNTP的110端口不受限。</p>
<h3 id="2-配rss2email">2. 配rss2email</h3>
<pre><code>sudo apt install rss2email
</code></pre>
<p><code>.config/rss2email.cfg</code> 配置:</p>
<pre><code>[DEFAULT]
from = pi@localhost
user-agent = rss2email/__VERSION__ (__URL__)
use-8bit = False
force-from = False
use-publisher-email = False
name-format = {feed-title}: {author}
to = pi
proxy =
feed-timeout = 60
same-server-fetch-interval = 0
active = True
digest = False
date-header = True
date-header-order = modified, issued, created, expired
bonus-header =
trust-guid = False
trust-link = False
reply-changes = False
encodings = US-ASCII, ISO-8859-1, UTF-8, BIG5, ISO-2022-JP
post-process =
digest-post-process =
html-mail = True
multipart-html = False
use-css = False
css = h1 {
font: 18pt Georgia, "Times New Roman";
}
body {
font: 12pt Arial;
}
a:link {
font: 12pt Arial;
font-weight: bold;
color: #0000cc;
}
blockquote {
font-family: monospace;
}
.header {
background: #e0ecff;
border-bottom: solid 4px #c3d9ff;
padding: 5px;
margin-top: 0px;
color: red;
}
.header a {
font-size: 20px;
text-decoration: none;
}
.footer {
background: #c3d9ff;
border-top: solid 4px #c3d9ff;
padding: 5px;
margin-bottom: 0px;
}
border: solid 4px #c3d9ff;
}
margin-left: 5px;
margin-right: 5px;
}
unicode-snob = False
links-after-each-paragraph = False
inline-links = True
wrap-links = True
body-width = 0
email-protocol = maildir
sendmail = /usr/sbin/sendmail
sendmail_config =
maildir-path = ~/Maildir
maildir-mailbox = INBOX
verbose = info
[feed.scateu]
url = https://scateu.me/feed.xml
</code></pre>
<p>对应的systemd配置:</p>
<pre><code>pi@rpi4:~ $ cat /etc/systemd/system/rss2email.service
[Unit]
Description=Fetches RSS feeds and send them to email
Wants=rss2email.timer
[Service]
ExecStart=/usr/bin/proxychains4 /usr/bin/r2e run
Environment = PATH=/usr/local/bin:/usr/bin:/bin
User = pi
[Install]
WantedBy=multi-user.target
pi@rpi4:~ $ cat /etc/systemd/system/rss2email.timer
[Unit]
Description=calling rss2email peridically
Requires=rss2email.service
[Timer]
Unit=rss2email.service
OnCalendar=*-*-* 00/8:00:00
[Install]
WantedBy=timers.target
</code></pre>
<p>然后</p>
<pre><code>sudo systemctl enable rss2email.timer
sudo systemctl enable rss2email.service
</code></pre>
<p>proxychains4是用来保持与国际互联网的通信用的。<br />
本机可以起一个socks5信道。</p>
<h3 id="3-public-inbox">3. public-inbox</h3>
<pre><code>sudo apt install public-inbox
public-inbox-init -V2 RSS /home/pi/RSS https://192.168.1.31/RSS pi@localhost
</code></pre>
<p>在配置里指定好上游maildir目录,在watch字段:</p>
<pre><code>pi@rpi4:~/.public-inbox $ cat config
[publicinbox "RSS"]
address = pi@localhost
url = https://192.168.1.31/RSS
inboxdir = /home/pi/RSS
newsgroup = RSS
watch = maildir:/home/pi/Maildir/INBOX/
address = pi@localhost
</code></pre>
<p>然后执行</p>
<pre><code>public-inbox-watch
</code></pre>
<p>就会从maildir里把邮件塞进public-inbox的git目录(在这里是<code>RSS/</code>)了,可惜这个程序没啥输出</p>
<p>可以进到目录里敲<code>git status</code>来看,或者用<code>tig</code>。但一定要进到对应的目录里先。</p>
<p>比如:</p>
<pre><code>cd RSS/git/0.git
git log
tig
</code></pre>
<p>示例输出:</p>
<pre><code>commit 509a34ca40cb884846bdb740c31dba79b1150fd6 (HEAD -> master)
Author: New Projects : Kickstarter: author <pi@localhost>
Date: Wed Aug 6 13:26:57 2025 +0000
Dream Fighters Children's Book: A–Z of Black STEM Pioneers by Shemeka Foster
commit 3c0e1bb5eae2915a5574dfc937c2e1379ae28c2a
Author: Newsshooter: Matthew Allard ACS <pi@localhost>
Date: Fri Aug 8 00:27:20 2025 +0000
LumaTouch 5.3 for iOS enables support for 3rd party editing and VFX plugins
commit 2187aea6c05ec5387b822fec93adef63a0da8e6c
Author: New Projects : Kickstarter: author <pi@localhost>
Date: Fri Aug 8 06:45:13 2025 +0000
The Stories of Tanith Lee by John Betancourt
commit a825201c2387c8b53449b4ea0bc1b593caeb776c
Author: Newsshooter: Matthew Allard ACS <pi@localhost>
Date: Fri Aug 8 00:44:34 2025 +0000
Ikan Aura PT419W-NDI– world’s first teleprompter that combines full NDI streaming with PoE++ power delivery
</code></pre>
<p>systemd的配置文件们:</p>
<pre><code>pi@rpi4:~ $ cat /etc/systemd/system/public-inbox-nntpd.service
[Unit]
Description=public-inbox-nntpd
After=network.target
[Service]
Type=simple
Environment = PI_CONFIG=/home/pi/.public-inbox/config \
PATH=/usr/local/bin:/usr/bin:/bin
ExecStart = /usr/bin/public-inbox-nntpd
Restart=always
User=root
Group=root
[Install]
WantedBy=multi-user.target
pi@rpi4:~ $ cat /etc/systemd/system/public-inbox-watch.service
[Unit]
Description = public-inbox Maildir watch
After = spamassassin.service
[Service]
Environment = PI_CONFIG=/home/pi/.public-inbox/config \
PATH=/usr/local/bin:/usr/bin:/bin
ExecStart = /usr/bin/public-inbox-watch
ExecReload = /bin/kill -HUP $MAINPID
# this user must have read access to Maildirs it watches
User = pi
KillMode = process
[Install]
WantedBy = multi-user.target
</code></pre>
<p>然后</p>
<pre><code>sudo systemctl enable public-inbox-watch.service
sudo systemctl enable public-inbox-nntpd.service
sudo systemctl start public-inbox-watch.service
sudo systemctl start public-inbox-nntpd.service
</code></pre>
<p>如果想提供imap服务,同理</p>
<h2 id="使用">使用</h2>
<pre><code>w3m nntp://pi.example.net/RSS
alpine -url nntp://pi.example.net/RSS
w3m nntp://news.public-inbox.org/inbox.comp.mail.public-inbox.meta
alpine -url nntp://news.public-inbox.org/inbox.comp.mail.public-inbox.meta
</code></pre>
<p>Thunderbird里添加Newsgroup账号先,服务器就是你的公网IP对应的域名,然后Subscribe里面的RSS频道。</p>
<h2 id="tip-rss去重---r2e-dedupsh">tip: RSS去重 - r2e-dedup.sh</h2>
<pre><code class="language-bash">#!/bin/bash
# simple bash script to remove duplicated RSS items from rss2email
r2e list > r2e-list.txt
cat r2e-list.txt |cut -d'(' -f2 |awk '{print $1}' |sort |uniq -c | grep '2 http' > a
while read line; do cat r2e-list.txt |grep `echo $line |cut -d/ -f3` | tail -n1; done < a > b
cat b |cut -d: -f1|sort |uniq | xargs r2e delete
rm -i a b r2e-list.txt
</code></pre>
Fri, 08 Aug 2025 00:00:00 +0000
https://scateu.github.io/2025/08/08/rss2email-public-inbox-nntp.html
https://scateu.github.io/2025/08/08/rss2email-public-inbox-nntp.html
-
Chromebook: Coreboot, Libreboot, Debian原生安装
<p>设备: Samsung Chromebook Plus V1 (arm64, codename: gru/kevin, CPU Rockchip RK3399, XE513C24)。 网卡型号 Marvell 88W8997</p>
<h2 id="安装libreboot">安装Libreboot</h2>
<h3 id="1-解除spi-flash写保护螺丝">1. 解除SPI Flash写保护螺丝</h3>
<p>参考文章:</p>
<ul>
<li><a href="https://libreboot.org/docs/install/chromebooks.html">https://libreboot.org/docs/install/chromebooks.html</a></li>
</ul>
<p>写保护螺丝是把SPI Flash的WE(Write Enable)线拉到GND上。需要拆除才能刷Libreboot</p>
<p>拆开机壳,把散热片拆下来,把HDMI连接器拆下来,把右下角的喇叭拆下(线先不拆)。把几个排线拆下(有一个黑色压条)<br />
目标是把主板翻个面,电池在下方的阵形中,右上角的散热片紧固螺丝(在背后,键盘与主板之间),拆下。</p>
<svg version="1.1" width="421" height="251" viewBox="-0.5 -0.5 421 251" content="<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:141.0) Gecko/20100101 Firefox/141.0" version="28.0.6" scale="1" border="0"> <diagram name="Page-1" id="FnR_vYXPwPDb_nKZf8h2"> <mxGraphModel dx="2210" dy="746" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="JAO4te28KZV7AeOYSjc_-1" value="" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="50" y="230" width="310" height="240" as="geometry" /> </mxCell> <mxCell id="JAO4te28KZV7AeOYSjc_-2" value="&lt;pre&gt;&lt;code&gt;屏线&lt;/code&gt;&lt;/pre&gt;" style="text;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="230" y="220" width="60" height="60" as="geometry" /> </mxCell> <mxCell id="JAO4te28KZV7AeOYSjc_-3" value="&lt;div&gt;黑&lt;/div&gt;&lt;div&gt;盖&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="330" y="240" width="20" height="60" as="geometry" /> </mxCell> <mxCell id="JAO4te28KZV7AeOYSjc_-4" value="&lt;pre&gt;&lt;code&gt;Type-C&lt;/code&gt;&lt;/pre&gt;" style="text;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="360" y="260" width="80" height="60" as="geometry" /> </mxCell> <mxCell id="JAO4te28KZV7AeOYSjc_-5" value="&lt;pre&gt;&lt;code&gt;Audio Jack&lt;/code&gt;&lt;/pre&gt;" style="text;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="360" y="230" width="110" height="60" as="geometry" /> </mxCell> <mxCell id="JAO4te28KZV7AeOYSjc_-6" value="主板" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="150" y="260" width="170" height="60" as="geometry" /> </mxCell> <mxCell id="JAO4te28KZV7AeOYSjc_-7" value="次板" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="60" y="260" width="60" height="60" as="geometry" /> </mxCell> <mxCell id="JAO4te28KZV7AeOYSjc_-8" value="电池" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="90" y="350" width="230" height="100" as="geometry" /> </mxCell> <mxCell id="JAO4te28KZV7AeOYSjc_-9" value="喇叭" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="330" y="360" width="20" height="80" as="geometry" /> </mxCell> <mxCell id="JAO4te28KZV7AeOYSjc_-10" value="喇叭" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="60" y="360" width="20" height="80" as="geometry" /> </mxCell> <mxCell id="JAO4te28KZV7AeOYSjc_-11" value="Flash" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="230" y="330" width="30" height="10" as="geometry" /> </mxCell> <mxCell id="JAO4te28KZV7AeOYSjc_-14" value="🛟" style="text;whiteSpace=wrap;html=1;" vertex="1" parent="1"> <mxGeometry x="280" y="260" width="40" height="60" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> " id="svg50" xmlns:xlink="https://www.w3.org/1999/xlink" xmlns="https://www.w3.org/2000/svg" xmlns:svg="https://www.w3.org/2000/svg" xmlns:xhtml="https://www.w3.org/1999/xhtml"> <defs id="defs1" /> <rect fill="#ffffff" width="100%" height="100%" x="0" y="0" id="rect1" /> <g id="g50"> <g data-cell-id="0" id="g49"> <g data-cell-id="1" id="g48"> <g data-cell-id="JAO4te28KZV7AeOYSjc_-1" id="g3"> <g id="g2"> <rect x="0" y="10" width="310" height="240" fill="#ffffff" stroke="#000000" pointer-events="all" id="rect2" /> </g> </g> <g data-cell-id="JAO4te28KZV7AeOYSjc_-2" id="g7"> <g id="g4"> <rect x="180" y="0" width="60" height="60" fill="none" stroke="none" pointer-events="all" id="rect3" /> </g> <g id="g6"> <g id="g5"> <switch id="switch4"> <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="https://www.w3.org/TR/SVG11/feature#Extensibility"> <xhtml:div style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 58px; height: 1px; padding-top: 7px; margin-left: 182px;"> <xhtml:div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> <xhtml:div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> <xhtml:pre> <xhtml:code>屏线</xhtml:code> </xhtml:pre> </xhtml:div> </xhtml:div> </xhtml:div> </foreignObject> <image x="182" y="7.5" width="58" height="41" xlink:href="data:image/png;base64,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" id="image4" /> </switch> </g> </g> </g> <g data-cell-id="JAO4te28KZV7AeOYSjc_-3" id="g11"> <g id="g8"> <rect x="280" y="20" width="20" height="60" fill="#ffffff" stroke="#000000" pointer-events="all" id="rect7" /> </g> <g id="g10"> <g id="g9"> <switch id="switch8"> <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="https://www.w3.org/TR/SVG11/feature#Extensibility"> <xhtml:div style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 50px; margin-left: 281px;"> <xhtml:div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> <xhtml:div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> <xhtml:div>黑</xhtml:div> <xhtml:div>盖</xhtml:div> </xhtml:div> </xhtml:div> </xhtml:div> </foreignObject> <image x="281" y="36" width="18" height="32" xlink:href="data:image/png;base64,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" id="image8" /> </switch> </g> </g> </g> <g data-cell-id="JAO4te28KZV7AeOYSjc_-4" id="g15"> <g id="g12"> <rect x="310" y="40" width="80" height="60" fill="none" stroke="none" pointer-events="all" id="rect11" /> </g> <g id="g14"> <g id="g13"> <switch id="switch12"> <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="https://www.w3.org/TR/SVG11/feature#Extensibility"> <xhtml:div style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 78px; height: 1px; padding-top: 47px; margin-left: 312px;"> <xhtml:div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> <xhtml:div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> <xhtml:pre> <xhtml:code>Type-C</xhtml:code> </xhtml:pre> </xhtml:div> </xhtml:div> </xhtml:div> </foreignObject> <image x="312" y="47.5" width="78" height="41" xlink:href="data:image/png;base64,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" id="image12" /> </switch> </g> </g> </g> <g data-cell-id="JAO4te28KZV7AeOYSjc_-5" id="g19"> <g id="g16"> <rect x="310" y="10" width="110" height="60" fill="none" stroke="none" pointer-events="all" id="rect15" /> </g> <g id="g18"> <g id="g17"> <switch id="switch16"> <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="https://www.w3.org/TR/SVG11/feature#Extensibility"> <xhtml:div style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 108px; height: 1px; padding-top: 17px; margin-left: 312px;"> <xhtml:div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> <xhtml:div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "> <xhtml:pre> <xhtml:code>Audio Jack</xhtml:code> </xhtml:pre> </xhtml:div> </xhtml:div> </xhtml:div> </foreignObject> <image x="312" y="17.5" width="108" height="41" xlink:href="data:image/png;base64,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" id="image16" /> </switch> </g> </g> </g> <g data-cell-id="JAO4te28KZV7AeOYSjc_-6" id="g23"> <g id="g20"> <rect x="100" y="40" width="170" height="60" fill="#ffffff" stroke="#000000" pointer-events="all" id="rect19" /> </g> <g id="g22"> <g id="g21"> <switch id="switch20"> <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="https://www.w3.org/TR/SVG11/feature#Extensibility"> <xhtml:div style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 168px; height: 1px; padding-top: 70px; margin-left: 101px;"> <xhtml:div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> <xhtml:div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">主板</xhtml:div> </xhtml:div> </xhtml:div> </foreignObject> <image x="101" y="63.5" width="168" height="17" xlink:href="data:image/png;base64,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" id="image20" /> </switch> </g> </g> </g> <g data-cell-id="JAO4te28KZV7AeOYSjc_-7" id="g27"> <g id="g24"> <rect x="10" y="40" width="60" height="60" fill="#ffffff" stroke="#000000" pointer-events="all" id="rect23" /> </g> <g id="g26"> <g id="g25"> <switch id="switch24"> <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="https://www.w3.org/TR/SVG11/feature#Extensibility"> <xhtml:div style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 70px; margin-left: 11px;"> <xhtml:div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> <xhtml:div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">次板</xhtml:div> </xhtml:div> </xhtml:div> </foreignObject> <image x="11" y="63.5" width="58" height="17" xlink:href="data:image/png;base64,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" id="image24" /> </switch> </g> </g> </g> <g data-cell-id="JAO4te28KZV7AeOYSjc_-8" id="g31"> <g id="g28"> <rect x="40" y="130" width="230" height="100" fill="#ffffff" stroke="#000000" pointer-events="all" id="rect27" /> </g> <g id="g30"> <g id="g29"> <switch id="switch28"> <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="https://www.w3.org/TR/SVG11/feature#Extensibility"> <xhtml:div style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 228px; height: 1px; padding-top: 180px; margin-left: 41px;"> <xhtml:div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> <xhtml:div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">电池</xhtml:div> </xhtml:div> </xhtml:div> </foreignObject> <image x="41" y="173.5" width="228" height="17" xlink:href="data:image/png;base64,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DuUTW4+P7XwNyLRL5szfSZbF7xtj+yfTJtafAAECBAiMElBA+m4QIECAwCwJ5HsgP1o54D1j+0cTTCIf6HN2xH5F31WxvktNro1iX/UpraPaVrtfETuysCuXlbFxacS9LY97zWi/eUT+DvQTNX1zTuVDdVqm15wAAQIECIwXUED6hhAgQIDALAkcEgd7bs0B3x378krifxpOZtNolw+gqS4nxY6javYfF/s+VdmfV0J/0GC8E6JNXbHXoGurJldH651b9dCYAAECBAi0FFBAtgTTnAABAgSWVCCf4vqniPKW0C4PKK8+rqokXD+28zbU8lbRO2J7q4inGgy+YbS5vdK/QbfWTfLpq/kUVgsBAgQIEOhNQAHZG63EBAgQINCTwG6R99s9FGT5Hsi81bT67sUPxr4vVeby/tj+aov57Rptvx7RR+GbxewREd9pcTyaEiBAgACBiQQUkBOx6USAAAECSyywSYx/bMROES+f4ljuj763RJwVcWFE3S2wW8b+/N3lh+bGyQftbBzxaMtx14n2e0Tka0K2iFi9Zf/55mvHyq0ReVX0zoi8dTXfp2khQIAAAQK9Cyggeyc2AAECBAj0LLBG5C9vL206XBaCTX8zmTk3iDg4Ih9S842mg2hHgAABAgSGJKCAHNLZNBcCBAgQIECAAAECBAj0KKCA7BFXagIECBAgQIAAAQIECAxJQAE5pLNpLgQIECBAgAABAgQIEOhRQAHZI67UBAgQIECAAAECBAgQGJKAAnJIZ9NcCBAgQIAAAQIECBAg0KOAArJHXKkJECBAgAABAgQIECAwJAEF5JDOprkQIECAAAECBAgQIECgRwEFZI+4UhMgQIAAAQIECBAgQGBIAgrIIZ1NcyFAgAABAgQIECBAgECPAgrIHnGlJkCAAAECBAgQIECAwJAEFJBDOpvmQoAAAQIECBAgQIAAgR4FFJA94kpNgAABAgQIECBAgACBIQkoIId0Ns2FAAECBAgQIECAAAECPQooIHvElZoAAQIECBAgQIAAAQJDElBADulsmgsBAgQIECBAgAABAgR6FFBA9ogrNQECBAgQIECAAAECBIYkoIAc0tk0FwIECBAgQIAAAQIECPQooIDsEVdqAgQIECBAgAABAgQIDElAATmks2kuBAgQIECAAAECBAgQ6FFAAdkjrtQECBAgQIAAAQIECBAYksD/AIB8+FSXLlOiAAAAAElFTkSuQmCC" id="image28" /> </switch> </g> </g> </g> <g data-cell-id="JAO4te28KZV7AeOYSjc_-9" id="g35"> <g id="g32"> <rect x="280" y="140" width="20" height="80" fill="#ffffff" stroke="#000000" pointer-events="all" id="rect31" /> </g> <g id="g34"> <g id="g33"> <switch id="switch32"> <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="https://www.w3.org/TR/SVG11/feature#Extensibility"> <xhtml:div style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 180px; margin-left: 281px;"> <xhtml:div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> <xhtml:div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">喇叭</xhtml:div> </xhtml:div> </xhtml:div> </foreignObject> <image x="281" y="166" width="18" height="32" xlink:href="data:image/png;base64,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" id="image32" /> </switch> </g> </g> </g> <g data-cell-id="JAO4te28KZV7AeOYSjc_-10" id="g39"> <g id="g36"> <rect x="10" y="140" width="20" height="80" fill="#ffffff" stroke="#000000" pointer-events="all" id="rect35" /> </g> <g id="g38"> <g id="g37"> <switch id="switch36"> <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="https://www.w3.org/TR/SVG11/feature#Extensibility"> <xhtml:div style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 18px; height: 1px; padding-top: 180px; margin-left: 11px;"> <xhtml:div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> <xhtml:div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">喇叭</xhtml:div> </xhtml:div> </xhtml:div> </foreignObject> <image x="11" y="166" width="18" height="32" xlink:href="data:image/png;base64,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" id="image36" /> </switch> </g> </g> </g> <g data-cell-id="JAO4te28KZV7AeOYSjc_-11" id="g43"> <g id="g40"> <rect x="180" y="110" width="30" height="10" fill="#ffffff" stroke="#000000" pointer-events="all" id="rect39" /> </g> <g id="g42"> <g id="g41"> <switch id="switch40"> <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="https://www.w3.org/TR/SVG11/feature#Extensibility"> <xhtml:div style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 115px; margin-left: 181px;"> <xhtml:div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "> <xhtml:div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Flash</xhtml:div> </xhtml:div> </xhtml:div> </foreignObject> <image x="181" y="108.5" width="28" height="17" xlink:href="data:image/png;base64,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" id="image40" /> </switch> </g> </g> </g> <g data-cell-id="JAO4te28KZV7AeOYSjc_-14" id="g47"> <g id="g44"> <rect x="230" y="40" width="40" height="60" fill="none" stroke="none" pointer-events="all" id="rect43" /> </g> <g id="g46"> <g id="g45"> <switch id="switch44"> <foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="https://www.w3.org/TR/SVG11/feature#Extensibility"> <xhtml:div style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 38px; height: 1px; padding-top: 47px; margin-left: 232px;"> <xhtml:div style="box-sizing: border-box; font-size: 0; text-align: left; color: #000000; "> <xhtml:div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">🛟</xhtml:div> </xhtml:div> </xhtml:div> </foreignObject> <image x="232" y="47.5" width="38" height="17" xlink:href="data:image/png;base64,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" id="image44" /> </switch> </g> </g> </g> </g> </g> </g> </svg>
<p>散热片的螺柱与主板的螺孔之间,有一圈金属网圈🔘,一定要撕下来,否则仍然WE线仍然在GND上。</p>
<pre><code> / \
\ /
</code></pre>
<p>撕掉金属网圈,露出上图螺孔的圈圈,实际上是四个小焊盘组成的一个圆形,如🛟。其中一组对角是GND。</p>
<p>记得要用螺丝刀把这四片焊盘之间划拉干净,不然还是接到GND上。SPI Flash没办法写。</p>
<h3 id="2-上编程器">2. 上编程器</h3>
<p>Samsung Chromebook Plus v1, codename: Kevin<br />
使用的Flash是GD25LQ64C,用的是1.8V电压.</p>
<p>买回来CH341A,还需要买1.8V的适配板。</p>
<p>用夹具夹上,烧写<code>libreboot-20241206rev11_gru_kevin.tar.xz</code> 中的.rom文件</p>
<p>Windows上有个比较好用的工具叫: <code>thereadreg/asprogrammer-dregmod</code></p>
<p>如果直接把这个SPI Flash吹下来烧录,就可以省得折腾第1步里的写保护螺丝了。</p>
<h3 id="2-如果没有编程器-flashrom-内置烧写">2‘. 如果没有编程器: flashrom 内置烧写</h3>
<p>就先进入Developer模式,或者各种方式能有flashrom工具(比如imagebuilder啊,各种虾系OS)<br />
的情况下:</p>
<pre><code>sudo flashrom -p internal -w uboot_gru_kevin_libgfxinit_corebootfb.rom
</code></pre>
<p>注意20241206版本的uboot有wifi, lspci:</p>
<pre><code>00:00.0 PCI bridge: Rockchip Electronics Co., Ltd RK3399 PCI Express Root Port
01:00.0 Ethernet controller: Marvell Technology Group Ltd. 88W8997 2.4/5 GHz Dual-Band 2x2 Wi-Fi® 5 (802.11ac) + Bluetooth® 5.3 Solution (rev 11)
</code></pre>
<p>https://mirror.math.princeton.edu/pub/libreboot/</p>
<p>最新版 FAILED: libreboot-25.06_gru_kevin.tar.xz 没有wifi。lspci里是空的。已经<a href="https://codeberg.org/libreboot/lbmk/issues/353">上报Bug</a></p>
<h2 id="装debian">装Debian</h2>
<p>参考: https://libreboot.org/docs/uboot/uboot-debian-bookworm.html</p>
<p>注意,最后一步</p>
<ul>
<li>YES: Force installation to removable media path</li>
<li>NO: Update NVRAM Variables</li>
</ul>
<p>网卡驱动在:</p>
<pre><code>sudo apt install firmware-libertas
</code></pre>
<h2 id="i3wm">i3wm</h2>
<p>/etc/i3status.conf:</p>
<pre><code>order += 'battery 0'
battery 0 {
format = "%status %percentage %remaining"
path = /sys/class/power_supply/sbs-9-000b/uevent
}
</code></pre>
<p><code>~/.config/i3/config</code>:</p>
<pre><code>exec xrandr --dpi 220
</code></pre>
<pre><code>sudo apt install suckless-tools
</code></pre>
<h2 id="中文console">中文Console</h2>
<ul>
<li>ucdos style: <code>sudo apt install zhcon; zhcon --utf8</code></li>
<li>
<p>很神奇的替代agetty的东西: <code>sudo apt install kmscon</code> 然后重启; 输入法可以配合github.com/scateu/ywvim,在Vim里打字得了</p>
<p>如果不想在所有tty上都打开kmscon。可以<code>sudo systemctl disable autovt@.service</code> 再 <code>sudo systemctl enable kmsconvt@tty1.service</code>,这样就只在tty1上有kmscon,其它的都是原来的了(原来的速度快一些)。</p>
</li>
</ul>
<h2 id="debian禁用启用图形界面">Debian禁用/启用图形界面</h2>
<pre><code>sudo systemctl set-default multi-user.target #禁用
sudo systemctl set-default graphical.target #启用
#systemctl restart sddm #不对头
#systemctl start sddm #不对头
systemctl start lightdm.service
systemctl stop lightdm.service
</code></pre>
<h2 id="see-also">See also</h2>
<ul>
<li><a href="https://libreboot.org/docs/uboot/uboot-debian-bookworm.html">https://libreboot.org/docs/uboot/uboot-debian-bookworm.html</a></li>
<li><a href="https://szclsya.me/zh-cn/posts/coreboot/x220/">https://szclsya.me/zh-cn/posts/coreboot/x220/</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/28760228700">https://zhuanlan.zhihu.com/p/28760228700</a></li>
<li><a href="https://github.com/mytbk/firmware_notes/blob/master/coreboot/x200-libreboot.md">https://github.com/mytbk/firmware_notes/blob/master/coreboot/x200-libreboot.md</a></li>
<li><a href="https://wiki.chucknemeth.com/laptop/lenovo-x230/flash-lenovo-x230-coreboot">https://wiki.chucknemeth.com/laptop/lenovo-x230/flash-lenovo-x230-coreboot</a></li>
<li><a href="https://github.com/corna/me_cleaner">https://github.com/corna/me_cleaner</a></li>
<li><a href="https://goos.blog/2023/10/chromebook-kevin/">https://goos.blog/2023/10/chromebook-kevin/</a></li>
</ul>
<h2 id="uboot-直接引导vmlinuz">Uboot 直接引导vmlinuz</h2>
<p>参考 <a href="https://docs.u-boot.org/en/latest/usage/cmd/booti.html">https://docs.u-boot.org/en/latest/usage/cmd/booti.html</a></p>
<pre><code>load mmc 0:2 $fdt_addr_r boot/rk3399-gru-kevin.dtb #从/usr/lib/linux-image-6.1.0-35-arm64/rockchip/rk3399-gru-kevin.dtb拷过来的
load mmc 0:2 $kernel_addr_r boot/vmlinuz
load mmc 0:2 $ramdisk_addr_r boot/initrd.img
#此行不用 用来参考 setenv bootargs root=/dev/mmcblk0p2 root=PARTUUID=$PARTUUID rootfstype=ext4 rw console=tty1 console=ttyS2,115200 earlycon rootwait LANG=en_US.UTF-8
setenv bootargs root=UUID=8f02889f-0c43-4163-9874-7e18d557cf17 # UUID是从/sbin/u-boot-update执行后产生的/boot/extlinux/extlinux.conf里看到的; 或者用blkid
setenv bootargs root=/dev/mmcblk1p2 ro #GRUB启动的是0p1,而用这种办法启动出来的是1p2,从1计数
booti $kernel_addr_r $ramdisk_addr_r:$filesize $fdt_addr_r
</code></pre>
<p>回车,就可以引导了。在思考是不是打印出barcode,用扫码枪输入。就跟摇把柴油机似的。</p>
<h2 id="用extlinuxconf引导">用extlinux.conf引导</h2>
<p>猜测这个libreboot里的uboot不支持ext4。</p>
<p>当前的盘的分区是:</p>
<ol>
<li>FAT EFI, 挂载到/boot/efi/</li>
<li>EXT4, 挂载到/</li>
</ol>
<p>用<code>u-boot-update</code>生成的<code>/boot/extlinux/extlinux.conf</code>是在EXT4分区里,因此识别不到。</p>
<p>于是把initrd dtb vmlinuz三个文件都拷到EFI目录里。</p>
<pre><code>.
├── EFI
│ ├── BOOT
│ │ ├── BOOTAA64.EFI
│ │ ├── BOOTAA64.EFI.bak
│ │ ├── fbaa64.efi
│ │ ├── grubaa64.efi
│ │ └── mmaa64.efi
│ └── debian
│ ├── BOOTAA64.CSV
│ ├── fbaa64.efi
│ ├── grubaa64.efi
│ ├── grub.cfg
│ ├── mmaa64.efi
│ └── shimaa64.efi
└── extlinux
├── extlinux.conf
├── initrd.img-6.1.0-35-arm64
├── rk3399-gru-kevin.dtb
└── vmlinuz-6.1.0-35-arm64
</code></pre>
<p>把extlinux.conf的路径也改好,在uboot里就可以识别到了。</p>
<pre><code>default l0
menu title U-Boot menu
prompt 0
timeout 50
label l0
menu label Debian GNU/Linux 12 (bookworm) 6.1.0-35-arm64
linux /extlinux/vmlinuz-6.1.0-35-arm64
initrd /extlinux/initrd.img-6.1.0-35-arm64
fdtdir /extlinux/
append root=UUID=8f02889f-0c43-4163-9874-7e18d557cf17 ro quiet
label l0r
menu label Debian GNU/Linux 12 (bookworm) 6.1.0-35-arm64 (rescue target)
linux /extlinux/vmlinuz-6.1.0-35-arm64
initrd /extlinux/initrd.img-6.1.0-35-arm64
fdtdir /extlinux/
append root=UUID=8f02889f-0c43-4163-9874-7e18d557cf17 ro single
</code></pre>
<h2 id="rescue-grub-load">RESCUE GRUB Load</h2>
<pre><code>U-Boot:
load mmc 0:1 $loadaddr efi/boot/BOOTAA64.EFI
bootefi $loadaddr
GRUB>
set root=(hd0,gpt2)
linux /boot/vmlinuz root=/dev/mmcblk0p2
initrd /boot/initrd.img
boot
</code></pre>
Tue, 22 Jul 2025 00:00:00 +0000
https://scateu.github.io/2025/07/22/chromebook-libreboot.html
https://scateu.github.io/2025/07/22/chromebook-libreboot.html
-
记事本随想
<h1 id="引言">引言</h1>
<p>“Write something down, so you can forget it.”</p>
<p>“Dear Diary,”常见于西方人的日记开头。《安妮日记》里作者甚至给这本日记起了个名字,”Dear Kitty”。可见记事本可以、本应与人多么亲密。再如,《The English Patient》里,女主角在山洞里撑不到出去求救的男主角回来,用随身的记事本,在最后的一点烛光写下文字留给对方。</p>
<p>但我所受的教育中,日记本、周记本、练习册,通常被用来使人劳顿、替代体罚(参见: 自动写字机器人),使人一笔一划不敢潦草态度要好,使人填满了上交而不一定有人看但空着一定会被人注意到。一本装订好了的本子,在我手里,经常会在写了几页之后,被我剖开,当成便笺使用。</p>
<p>而最近我才意识到,本子,Book,是时间长河里的竹筏,可以对抗遗忘。</p>
<blockquote>
<p>The struggle of man against power is the struggle of memory against forgetting. - Milan Kundera, The Book of Laughter and Forgetting</p>
</blockquote>
<p>Book-keeping is time-keeping.</p>
<p>Field Notes的创始人Aaron Draplin说笔记本可以 slow his ass down. “I’m not writing it down to remember it later, I’m writing it down to remember it now.”</p>
<p>从1997年成立的Moleskine公司,成为硅谷创业家、投资人<a href="https://www.newyorker.com/business/currency/why-startups-love-moleskines">手中的最爱</a>,字面意义上的手。据说Dropbox公司的文具角有足够多的Moleskine任取。</p>
<h1 id="名人的笔记本们">名人的笔记本们</h1>
<ul>
<li>居里夫人的<a href="https://wellcomecollection.org/works/cywqefw4">笔记本PDF</a>, 注意看她用的是网格本; (网格通常是5mm x 5mm) 网格本的好处是,可以随时随地填写实验数据,拉个表格出来。而且网格本可以Portrait,也可以Landscape来用,而横线不行。</li>
<li>
<p>达芬奇的笔记本,他镜像书写。有人扫描并OCR: <a href="https://www.leonardodigitale.com/en/browse/codex-arundel/0001-v/">https://www.leonardodigitale.com/en/browse/codex-arundel/0001-v/</a></p>
</li>
<li>我的一位<a href="https://xunjiexu.github.io/">物理学家同学</a>,他会随身带一个A4活页夹,四孔(两孔的打孔器,正反各打一次即可成为四孔)。首页会有一个Index,标注一个月的日期,每天在上面画”正”字,一划表示工作了一个40分钟时间段(番茄)。这样做的好处是,随身只要带一个打孔器,到处都有A4纸。定期将这些纸用线缝起来archive。他从大四(~2010年)开始一直保持这样的习惯,已经14年了。</li>
</ul>
<h1 id="从产品角度来看记事本有以下的好特性">从产品角度来看记事本有以下的好特性:</h1>
<ul>
<li>Sync</li>
<li>Battery-life</li>
<li>Markdown ready</li>
<li>OTP: One time programmable 下笔即不可改,使人make promise, make commitment, make a wish</li>
<li>as Outliner</li>
<li>as Planner, future proof</li>
<li>as Tracker: 什么东西在哪里,净水器滤芯台账</li>
</ul>
<h1 id="tips">Tips</h1>
<ul>
<li>标上页码: 新的本拿到之后,右下角先写上页码。一是这样就不会乱撕了,二是每一页都有了名字很亲切,三是写到这一页的时候没有未知带来的恐惧感,已经探索过</li>
<li>在记事本的底边骑缝上,可以起止日期,主题,方便寻找。</li>
<li>平摊: 可平摊性非常重要。一个可以平摊的本子,左右页面当成一体时,面积乘2,视野也乘2,思路也乘2</li>
<li>网格/点阵内页:
<ul>
<li>网格可以当Excel用。一定要注意网格的颜色要浅一些,不然会喧宾夺主。典型的5cm x 5cm最好。国产的没文化本子可能会用6cm x 6cm,不好。</li>
<li>点阵看起来有用,实际用起来体验不好。字经常写歪。把整页用尺子画成一个7x5的格子,当Monthly Calendar用或许不错</li>
<li>线(Ruled lines): 要留意线距,Moleskine是6mm线距,写起来很舒服。中文的可能会是8mm,或更宽,写起来有点傻</li>
</ul>
</li>
</ul>
<h1 id="手画calendar">手画Calendar</h1>
<p>以下这两种Layout参考自Moleskine。另外Moleskine的网站上有很多<a href="https://mymoleskine.moleskine.com/community/msk-templates/">Inserts Template</a>可以下载打印。</p>
<ul>
<li>本子摊开,左右各画两个横线,分成左三块右三块,再把右下区域竖切一根线,就有周一到周日了;</li>
<li>也可以左边分成7等分,右边用来当todo list,每周一页</li>
</ul>
<p>买现成的年度效率手册的问题是,经常买当年的新印本,到手一半已经过期了。</p>
<pre><code>+------------------------- ------------------------+
|mon | thu|
| | |
| | |
| | |
|-------------------------|------------------------|
|tue | fri|
| | |
| | |
| | |
|-------------------------|------------------------|
|wed |sat | sun|
| | | |
| | | |
| | | |
+------------------------- ------------------------+
+------------------------- ------------------------+
|mon | todos |
|-------------------------| |
|tue | |
|-------------------------| |
|wed | |
|-------------------------| |
|thu | |
|-------------------------| |
|fri | |
|-------------------------| |
|sat | |
|-------------------------| |
|sun | |
+------------------------- ------------------------+
+------------------------- ------------------------+
| +-----+-----+-----+-----|-----+-----+-----+ |
| | | | | 1 | 2 | 3 | 4 | |
| | | | | | | | | |
| +-----+-----+-----+-----|-----+-----+-----+ |
| | 5 | 6 | 7 | 8 | 9 |10 |11 | |
| | | | | | | | | |
| +-----+-----+-----+-----|-----+-----+-----+ |
| |12 |13 |14 |15 |16 |17 |18 | |
| | | | | | | | | |
| +-----+-----+-----+-----|-----+-----+-----+ |
| |19 |20 |21 |22 |23 |24 |25 | |
| | | | | | | | | |
| +-----+-----+-----+-----|-----+-----+-----+ |
| |26 |27 |28 |29 |30 |31 | | |
| | | | | | | | | |
| +-----+-----+-----+-----|-----+-----+-----+ |
+------------------------- ------------------------+
</code></pre>
<p><img src="https://scateu.github.io/images/notebooks_4.jpg" alt="图4: Calendar" /></p>
<h1 id="org-mode">Org Mode</h1>
<p>我的工作日志一开始是用国誉渡边的Steno小黄本来写,后来发现用Org Mode更好。Vim用户直接装Doom Emacs,略配置一下,<code>C-c c j</code>添加一行Journal。定期<code>C-c e</code>导出成LaTeX PDF,然后增量打印出来,活页夹打孔归档即可。</p>
<p>记录每天发生的Event。好处是可以grep,比如工位附近有不肖同事咆哮怒骂手下员工,就可以记一笔。有自动的时间戳。</p>
<p>最小配置(不依赖于Doom Emacs): <a href="https://gist.github.com/scateu/7261f78823ea3496094003fb4d5d4f8b">https://gist.github.com/scateu/7261f78823ea3496094003fb4d5d4f8b</a></p>
<details>
<summary>配置过程</summary>
<h4 id="macemacs">mac上装emacs</h4>
<p><a href="https://github.com/doomemacs/doomemacs/blob/master/docs/getting_started.org">https://github.com/doomemacs/doomemacs/blob/master/docs/getting_started.org</a></p>
<pre><code>brew tap railwaycat/emacsmacport
brew install emacs-mac --with-modules
#ln -s /usr/local/opt/emacs-mac/Emacs.app /Applications/Emacs.app
ln -s /opt/homebrew/opt/emacs-mac/Emacs.app /Applications/Emacs.app
</code></pre>
<h4 id="doom-">doom 配置</h4>
<pre><code>git clone --depth 1 https://github.com/doomemacs/doomemacs ~/.config/emacs
~/.config/emacs/bin/doom install
</code></pre>
<h4 id="texlive">装texlive</h4>
<pre><code>brew install texlive
</code></pre>
<h4 id="dimlight">配置字体 (参考自DimLight)</h4>
<pre><code class="language-elisp">(setq doom-font (font-spec :family "Sarasa Mono SC" :size 16)
doom-variable-pitch-font (font-spec :family "Libre Baskerville") ; inherits `doom-font''s :size
doom-unicode-font (font-spec :family "Sarasa Mono SC"))
</code></pre>
<h4 id="latex">配置LaTeX的模板</h4>
<p>可以在每个org mode文件里加上这个</p>
<pre><code>
#+title: Title
#+AUTHOR: Author
#+LATEX_CLASS: ctexart
# #+LATEX_CLASS_OPTIONS: [letter]
#+LATEX_HEADER: \usepackage[driver=dvipdfm,margin=1in,a4paper]{geometry}
#+OPTIONS: toc:nil num:nil
* COMMENT Configuration
#+begin_src emacs-lisp
(with-eval-after-load 'ox-latex
(add-to-list 'org-latex-classes
'("ctexart" "\\documentclass[11pt]{ctexart}"
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
("\\paragraph{%s}" . "\\paragraph*{%s}")
("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
(setq org-latex-default-class "ctexart")
(setq org-latex-compiler "xelatex"))
#+end_src
</code></pre>
<blockquote>
<p>参考自DimLight:
如果你不需要到处到英文的话,把Configuration里的elisp放进你自己的配置里(~/.config/doom/init.el)。 然后执行<code>~/.config/emacs/bin/doom sync</code>
否则需要在第一次开这个文件的时候选中这段代码,M-x eval-region</p>
</blockquote>
<pre><code>
#+TITLE: Title
#+LATEX_HEADER: \usepackage{ctex}
* COMMENT Config
#+begin_src emacs-lisp
(setq-local org-latex-compiler "xelatex")
#+end_src
* 测试中文
测试中文
geometry那一行是调整页边距的
一些文字 (图 ref:fig:billiboard)
#+CAPTION: 标题
#+LABEL: fig:billiboard
#+ATTR_LATEX: :height 0.95\textheight :float t
[[file:some_fig.png]]
</code></pre>
<blockquote>
<p>然后有个命令应该会喜欢:counsel-descbinds,可以让你interactive地查看命令跟快捷键的对应</p>
</blockquote>
<blockquote>
<p>比如跟buffer相关的在SPC b下面,跟window相关的在SPC w下面,跟搜索相关的在SPC s下面,等等</p>
</blockquote>
<h4 id="section">加速</h4>
<pre><code>$ tail ~/.emacs.d/init.el
(doom-initialize-modules)
(setq package-archives '(("gnu" . "https://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/")
("nongnu" . "https://mirrors.tuna.tsinghua.edu.cn/elpa/nongnu/")
("melpa" . "https://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/")))
(package-initialize) ;; You might already have this line
</code></pre>
<h4 id="doom-emacs">小结: 我的配置文件 (相比于原始的Doom Emacs)</h4>
<p><code>.doom.d/config.el</code>:</p>
<pre><code>
(setq user-full-name "John Doe"
user-mail-address "john@doe.com")
(setq doom-theme 'doom-one)
(setq org-directory "~/org/")
(setq display-line-numbers-type t)
;;brew tap laishulu/cask-fonts
;;brew install --cask font-sarasa-nerd
(setq doom-font (font-spec :family "Sarasa Term SC Nerd" :size 16)
doom-unicode-font (font-spec :family "file-icons"))
(with-eval-after-load 'ox-latex
(add-to-list 'org-latex-classes
'("ctexart" "\\documentclass[11pt]{ctexart}"
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
("\\paragraph{%s}" . "\\paragraph*{%s}")
("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
(setq org-latex-default-class "ctexart")
(setq org-latex-compiler "xelatex"))
(with-eval-after-load 'evil-maps
(define-key evil-normal-state-map (kbd "C-n") nil)
(define-key evil-normal-state-map (kbd "C-p") nil)
)
(eval-after-load "evil-maps"
(dolist (map '(evil-motion-state-map
evil-insert-state-map
evil-emacs-state-map))
(define-key (eval map) "\C-w" nil)))
;; macOS: use command key as meta
(setq mac-option-key-is-meta nil)
(setq mac-command-key-is-meta t)
(setq mac-command-modifier 'meta)
(setq mac-option-modifier nil)
(setenv "SHELL" "/bin/bash")
(global-set-key (kbd "C-c l") 'org-store-link)
(global-set-key (kbd "C-c a") 'org-agenda)
(global-set-key (kbd "C-c c") 'org-capture)
(advice-add 'ispell-lookup-words :around
(lambda (orig &rest args)
(shut-up (apply orig args))))
</code></pre>
</details>
<h1 id="价格">价格</h1>
<ul>
<li>Moleskine贵。200多一本。闲鱼上我找到了一家保健品联名款,我笃定没什么奸商去造一个小众联名款的假。30块一本,买了50本。用来武装周围的朋友们。(没错,是在我发现自己写不完之后) 联名款上有品牌名,拿到之后闭着眼把品牌名都划掉涂黑,就不会受它的心灵影响了。后来又看到了梅赛德斯联名款,怀疑被车贩咪了,于是又买了50本。我在工作上主力用它,摊开一面,大小可比拟A4 Landscape,作规划,平均两年写完一本。</li>
<li>Field Notes: 更贵,平均30人民币一小本。斥巨资买了4包(12本)网格,2包(6本)横线,结果发现横线款和网格款外观尺寸不一致,任拆一包网格款,三本里有两本的中间钉子没透全,还发现创始人之一此刻在狂踩川普力捧哈里斯,于是全退掉了… made in america my ass
<ul>
<li>万幸,手边买过一个三合一倒角器,找点废旧本子,直接按尺寸裁剪一下,倒个角,骑马钉钉上三个,效果也非常好</li>
<li>深圳前通(Front)这个品牌非常不错,可以入一点。3块5一本,分小本线装</li>
<li>淘宝上有卖FN尺寸的小册子,4块5一本,整本线装</li>
</ul>
</li>
</ul>
<p><img src="https://scateu.github.io/images/notebooks_1.jpg" alt="图1 DIY Field Notes 骑马钉" /></p>
<p>手边如果没有进深足够/可以旋转90度的装订机,可以用普通装订机,把接钉的底板展开,把中缝放到软的东西上垫着(比如吸甲醛的炭包,再比如把叠好成90度弯的一摞纸<a href="https://www.amazon.com/Bostitch-No-Jam-Booklet-Stapler-B440SB/dp/B0006HVU8S">骑在</a>废纸箱子的一个边上),钉之而不弯之。然后手工折一下,或者用大锤敲几下就行。</p>
<p><img src="https://scateu.github.io/images/notebooks_3.jpg" alt="图3: DIY 手缝" /></p>
<p>如果再讲究一点,可以用锥子钻上奇数个孔,从中间开始,<code>1 2 3 4 5</code>孔,以<code>3 -> 2 -> 1 -> 2 -> 4 -> 5 -> 4 -> 3</code>的顺序正反穿插缝之。最后绑一个<a href="https://knots3d.com/knots/en_us/37/two-half-hitches">two half hitches</a>。为了固定起手位置,可以在第一步,3号孔刚进来,生成一个loop,另一头(working end)过了2号孔后,先过一下3号孔这边的loop,这样不至于在后面拉线的时候松掉。手缝比想象中的简单。</p>
<p>最后,找个裁纸刀(可以用刀尾掰一下,用一段新刀片),用钢尺比着一页一页地切边,再厚的书也可以轻松切好。</p>
<h1 id="笔">笔</h1>
<ul>
<li>Bic Crystal很不错。圆珠笔的始祖,两三块钱一根。创始人Bich在业务扩展到英国的时候,被人提醒还是把h去掉吧,不然念起来不好听。也有四合一的版本。Fargo S01里,Nygarrd在店里向人推销的那根笔就是BIC 4-Color。《别惹我 Malavita (2013)》里,男主的儿子在校报上写下”If it’s good enough for you, it’s Godunov for me.”用的也是这支。</li>
<li>三菱 Uni Jetstream 也不错,可以买四种颜色四合一的,70块钱左右。三菱铅笔在2024年初把Lamy公司收购了。</li>
</ul>
<h1 id="尺寸">尺寸</h1>
<p><img src="https://scateu.github.io/images/notebooks_2.jpg" alt="图2: IKEA收纳" /></p>
<table>
<thead>
<tr>
<th>类型</th>
<th>长/cm</th>
<th>宽/cm</th>
<th>可写页数</th>
</tr>
</thead>
<tbody>
<tr>
<td>A6</td>
<td>10.5</td>
<td>14.8</td>
<td>-</td>
</tr>
<tr>
<td>Moleskine Medium</td>
<td>17.5</td>
<td>11.5</td>
<td>-</td>
</tr>
<tr>
<td>Moleskine Large</td>
<td>21</td>
<td>13</td>
<td>-</td>
</tr>
<tr>
<td>LEUCHTTURM 1917</td>
<td>19</td>
<td>12.8</td>
<td>-</td>
</tr>
<tr>
<td>Moleskine XL</td>
<td>25</td>
<td>19</td>
<td>-</td>
</tr>
<tr>
<td>A4</td>
<td>29.7</td>
<td>21</td>
<td>-</td>
</tr>
<tr>
<td>Moleskine XXL</td>
<td>27.94</td>
<td>21.59</td>
<td>-</td>
</tr>
</tbody>
<tbody>
<tr>
<td>Rite in the rain (On the go)</td>
<td>8.6</td>
<td>5.1</td>
<td>-</td>
</tr>
<tr>
<td>Rite in the rain (Stapled)</td>
<td>18</td>
<td>12</td>
<td>-</td>
</tr>
<tr>
<td>Rite in the rain (Stapled)</td>
<td>12</td>
<td>8.3</td>
<td>-</td>
</tr>
<tr>
<td>3x5 Index Cards 标准索引卡</td>
<td>12.5</td>
<td>7.6</td>
<td>-</td>
</tr>
<tr>
<td>Rite in the rain (Top Spiral, 3x5”)</td>
<td>13</td>
<td>7.6</td>
<td>-</td>
</tr>
</tbody>
<tbody>
<tr>
<td>Kokuyo Gambol Steno (6x4)</td>
<td>15</td>
<td>10</td>
<td>-</td>
</tr>
</tbody>
<tbody>
<tr>
<td>道林 40K 日历</td>
<td>21</td>
<td>11</td>
<td>-</td>
</tr>
<tr>
<td>Traveler’s Notebook (Regular)</td>
<td>22.2</td>
<td>12.1</td>
<td>-</td>
</tr>
</tbody>
<tbody>
<tr>
<td>Traveler’s Notebook (Passport)</td>
<td>13.7</td>
<td>10</td>
<td>-</td>
</tr>
<tr>
<td>量了一下我的护照</td>
<td>12.4</td>
<td>8.7</td>
<td>-</td>
</tr>
</tbody>
<tbody>
<tr>
<td>Field Notes (倒角 R=10mm)</td>
<td>14</td>
<td>8.9</td>
<td>48</td>
</tr>
<tr>
<td>Moleskine Cahiers</td>
<td>14</td>
<td>9</td>
<td>64</td>
</tr>
<tr>
<td>Moleskine Pocket</td>
<td>14</td>
<td>9</td>
<td>192</td>
</tr>
<tr>
<td>深圳造: Front <a href="https://www.sz-front.com/news_detail/2.html">前通 D15-A601</a></td>
<td>14</td>
<td>9</td>
<td>50</td>
</tr>
<tr>
<td>IKEA KNAGGLIG 木箱 (小号) 刚好收纳Pocket Size</td>
<td>15</td>
<td>23</td>
<td>9cm高</td>
</tr>
</tbody>
</table>
<h1 id="see-also">See Also</h1>
<ul>
<li>骑马订书机, Saddle Stitch, Booklet Stapler, 订折一体机</li>
<li>Bone Folder, 用以替代指甲来折纸</li>
<li>Book binding technique</li>
<li>Coil binding, 线圈本</li>
<li>Thread binding, 线装</li>
<li>EDC, EveryDay Carry</li>
<li>英文字体练习: <a href="https://www.youtube.com/watch?v=MpaUnhNpvOQ">https://www.youtube.com/watch?v=MpaUnhNpvOQ</a> 练上几十分钟,练到你对自己的英文连笔不讨厌,就上路了</li>
<li>Bullet Journal Legend. 子弹笔记定义了很多itemize的图标,可以参考</li>
<li>考研打格尺 - 这玩意用来DIY Calendar Book很有用:</li>
<li>British Royal Notebook - 据说英国皇室也每天填日历格子,左三右四这样</li>
</ul>
<h1 id="response">Response</h1>
<ul>
<li>中文古籍出版编辑李同学: “用完再说吧😂 纸会老的”</li>
<li>建筑系学分绩第一李同学: “Dropbox不是文具角,是个免费的自动贩卖机😆”</li>
<li>BH1RIO: “穷玩车付完本[机智]”</li>
</ul>
Mon, 05 Aug 2024 00:00:00 +0000
https://scateu.github.io/2024/08/05/notebooks.html
https://scateu.github.io/2024/08/05/notebooks.html
-
Chromebook装原生Linux
<p>2016年在xiaq大牛的推荐下,我<a href="https://scateu.me/2016/10/09/chromebook-rocks.html">买了Chromebook</a>,然后推荐了大鹰也<a href="https://bigeagle.me/2017/02/ASUS-chromebook-flip/">买了Chromebook</a>。</p>
<p>不多久,这款ASUS Chromebook Flip (armhf, codename: veyron-minnie) 被Google停止支持了。而且这款设备不支持KVM-based Linux,只能用chroot的方式用Linux。ChromeOS的底层应该是Gentoo。</p>
<p>于是我又在淘宝上买了一台Samsung Chromebook Plus V1 (arm64, codename: gru/kevin, CPU Rockchip RK3399, XE513C24)。虽然能用Linux子系统了,但在国内访问Google实在是麻烦,首次开机要Google,输密码要用Gmail账号,Proxy设置也奇怪。反正使用率很低。</p>
<p>特别是,这只Samsung Chromebook Plus在昨天被Google下达最后一次安全更新。不爽。于是花了一天一夜时间装好了Linux。</p>
<p>先说过程,再说结论。</p>
<h2 id="先一天一夜试了这几个海鲜项目">先一天一夜试了这几个海鲜项目</h2>
<p>(这几条路,1和5可以继续用,其它的可以不再看了。)</p>
<ol>
<li><a href="https://github.com/SolidHal/PrawnOS">PrawnOS</a>(只能用sd卡装)。完成度不错。但作者把所有专有固件什么的都干掉了,即使你找到了Firmware,Kernel也会拒绝load… 没有WiFi,有声音。串口驱动有些不支持。比如QRP Labs的QMX插上去玩FT8不行。貌似也可以<a href="https://github.com/SolidHal/PrawnOS/issues/282">手动编译</a>,<code>make BLOBBY_BUILD=1 TARGET=armhf kernel_config</code>这样。</li>
<li>Cadmium(只能用u盘装),装上有WiFi固件,但没声,原因是Kernel版本卡在不高不低,刚好把声音搞坏了。而且作者已经把项目Archive掉了。</li>
<li>Gentoo: <a href="https://wiki.gentoo.org/wiki/Samsung_Chromebook_Plus">https://wiki.gentoo.org/wiki/Samsung_Chromebook_Plus</a></li>
<li>Arch: <a href="https://archlinuxarm.org/platforms/armv8/rockchip/samsung-chromebook-plus">https://archlinuxarm.org/platforms/armv8/rockchip/samsung-chromebook-plus</a></li>
<li>hexdump0815/imagebuilder <strong>胜出!</strong> 最新Kernel!自动Build!支持设备种类多!有WiFi! 有声音! 开发活跃! 硬件解码视频正常!触摸屏正常!</li>
</ol>
<p>这些项目的名字都是海产品,吃多了海产品会镉中毒(Cadmium)吧。</p>
<p>我理解是,先有Prawn(对虾)。后有Shrimp(虾),再有Cadmium(镉 <del>中毒</del>),后来再有人基于这俩出了<a href="https://github.com/austin987/crawfishos">CrawfishOS</a>。</p>
<h2 id="柳暗花明-solution-hexdump0815imagebuilder">柳暗花明 SOLUTION: hexdump0815/imagebuilder</h2>
<h3 id="1-设置开发者模式">1. 设置开发者模式</h3>
<p>这些步骤可以参考<a href="https://github.com/SolidHal/PrawnOS">PrawnOS</a>的教程。</p>
<ol>
<li>先要在Chromebook上按 “ESC - Refresh - 电源” 开机,置为Developer模式。</li>
<li>Enable Debugging Features. 设置密码</li>
<li>登录google账号 (可以不做,直接Ctrl-Alt-F2, root 然后你的密码)</li>
<li>Ctrl-Alt-T 开终端</li>
<li>敲<code>shell</code>回车,再敲下面两行允许usb引导,不检查签名</li>
</ol>
<pre><code class="language-bash">crossystem dev_boot_signed_only=0
crossystem dev_boot_usb=1
</code></pre>
<h3 id="2-准备-烧u盘sd卡">2. 准备: 烧U盘/SD卡</h3>
<p>去<a href="https://github.com/hexdump0815/imagebuilder/releases">https://github.com/hexdump0815/imagebuilder/releases</a>里按你的机器的codename找到对应的release,比如这台Samsung Chromebook Plus V1机器codename是gru/kevin,按前面的gru算,下载这个就行:</p>
<p><code>https://github.com/hexdump0815/imagebuilder/releases/download/230220-03/chromebook_gru-aarch64-bookworm.img.gz</code></p>
<h3 id="3-装">3. 装</h3>
<p>开机,在原来按<code>Ctrl-D</code>才能进系统的位置,插上U盘/SD卡,按<code>Ctrl-U</code>,从U盘引导。</p>
<p>此时已经可以当LiveCD LiveUSB LiveSDCard用了!好多企鹅!最新内核!</p>
<p>按项目的教程 <a href="https://github.com/hexdump0815/imagebuilder/blob/main/doc/install-to-emmc-on-arm-chromebooks.md">https://github.com/hexdump0815/imagebuilder/blob/main/doc/install-to-emmc-on-arm-chromebooks.md</a> ,有三种方法可以装</p>
<p>我用方法1,直接<code>dd</code>就装好了。一定注意要找对codename,否则起不来。<br />
(注意ASUS Chromebook Flip, C100 codename: veyron-minnie,这台不能直接dd,得仔细看安装说明。)</p>
<p>具体来说</p>
<ol>
<li><code>Ctrl-U</code>进LiveUSB系统,启动用户名/密码为 linux / changeme</li>
<li>U盘LiveUSB系统里,先执行<code>/scripts/extend-rootfs.sh</code>,把U盘变大</li>
<li>然后再拷一份<code>chromebook_gru-aarch64-bookworm.img.gz</code>到U盘里</li>
<li><code>zcat *.img.gz | dd of=/dev/mmcblk1 bs=1024k status=progress</code> 此处的<code>mmcblk1</code>可以由<code>fdisk -l</code>看出,21GB左右。</li>
<li>写完eMMC后,重启,启动按Ctrl-D引导。(每次都要)</li>
<li>eMMC系统进去之后,再执行一下<code>/script/extend-rootfs.sh</code>,把eMMC撑大。</li>
</ol>
<h2 id="ref">REF</h2>
<details>
<summary>随手记的比较乱,也放这里备用吧。</summary>
<pre><code> armhf cpu:
Asus C201 (C201P) (C201PA) (veyron-speedy)
Asus C100 (veyron-minnie) — cyxu
BETA Asus Chromebit CS10 (veyron-mickey)
arm64 cpu:
BETA Samsung Chromebook Plus V1 (XE513C24) (gru-kevin)
ALPHA Asus C101p (gru-bob)
-----
Samsung Chromebook Plus
https://github.com/hexdump0815/imagebuilder/blob/main/systems/chromebook_gru/readme.md
https://github.com/Maccraft123/Cadmium/releases
https://tuxphones.com/cadmium-linux-for-chromebooks/
声卡:
https://archlinuxarm.org/platforms/armv8/rockchip/samsung-chromebook-plus
关键词: rk3399-gru-sound
https://github.com/thesofproject/linux/pull/3681
cd /usr/share/alsa/ucm2; sudo mv rk3399-gru-soun rk3399-gru-sound
Sound seems to be broken on all kernels above 5.10, so the only solution is to downgrade to that one following my example.
https://github.com/MichaIng/DietPi/issues/5337
编WIFI:
https://github.com/SolidHal/PrawnOS/issues/282
Did you build PrawnOS with the bobby kernel option or did you compile the non-free kernel independently to use with PrawnOS?
需要WiFi Firmware: 88W8997.bin
https://git.lsd.cat/g/PrawnOS-nonfree 这个Build可能可行
make BLOBBY_BUILD=1 TARGET=armhf kernel_config
https://github.com/SolidHal/PrawnOS#dependencies
https://github.com/SolidHal/PrawnOS/issues/282
C100PA:
https://gist.github.com/kapilhp/01c3e8fc24d938eeaa45c1c2ab02eaaa
https://github.com/SolidHal/PrawnOS
https://github.com/austin987/crawfishos
gru kevin Samsung Chromebook Plus V1 Convertible laptop eDP No 4GB atmel-mxt-ts atmel-mxt-ts ? / mwifiex-pcie No
veyron minnie Asus C100PA Convertible laptop 1280x800 eDP No 2-4GB 16-32GB BCM4354 SDIO / brcmfmac No
After rebooting/powering on, at the 'OS verification is off' screen, press 'CTRL' + 'U' to boot from USB/SD. Or 'CTRL' + 'D' to boot from the internal emmc.
Make sure the device is in developer mode. Open the terminal window by pressing Ctrl + Alt + F2. Log in as root . Type the default password test0000, or the custom password you set previously.
The device you inserted does not contain chrome os:
> Next time you see the missing or damaged screen press the tab key.
</code></pre>
</details>
<h2 id="小调整们">小调整们</h2>
<ul>
<li>xfce: settings >
<ul>
<li>Power Manager > Laptop Lid: When Laptop lid is closed: Switch off display</li>
<li>Login Window > Users > Hide the user list -> OFF</li>
</ul>
</li>
<li>i3status的电池: 在<code>/etc/i3status.conf</code>里<code>battery all</code>一节改成: (然后alt-shift-r重启i3才能生效)</li>
</ul>
<pre><code>battery all {
path = "/sys/class/power_supply/%d/uevent"
format = "%status %percentage %remaining %emptytime"
format_down = "No battery"
status_chr = "⚡ CHR"
status_bat = "🔋 BAT"
status_unk = "? UNK"
status_full = "☻ FULL"
low_threshold = 10
}
</code></pre>
<ul>
<li>Suspend的话, <del>以root<code># echo mem > /sys/power/state</code>,这个太猛了。 </del> 通常会用<code>systemctl suspend</code></li>
<li>PowerButton: 先在<code>/etc/systemd/logind.conf</code>里把<code>HandlePowerKey=ignore</code>,再在<code>.config/i3/config</code>里绑上<code>bindsym XF86PowerOff exec --no-startup-id systemctl suspend</code></li>
<li>关Trackpad,有时候容易误触 <code>synclient TouchpadOff=1</code> 开是<code>0</code></li>
</ul>
<h2 id="小结">小结</h2>
<p>Chromebook原生Linux: 进developer模式,<code>Ctrl-U</code>引导进U盘系统,hexdump0815/imagebuilder牛。</p>
<p>可惜bigeagle和<a href="https://blog.fugoes.xyz/2018/09/19/Notes-on-Chromebook.html">fugoes</a>都把Chromebook卖掉了。<del> “就差一步啊,就差一步 ….” </del></p>
<h2 id="又及">又及</h2>
<p>当年有幸<a href="https://github.com/scateu/scateu.github.io/blob/master/images/with_rms.jpg?raw=true">见过一回</a>Richard Matthew Stallman,当时没有理解他为什么若为自由故。现场貌似还有个哥们拿了台mba找他签名,RMS果然不签。</p>
<p>用了iPhone Android macbook越多,越觉得自由软件重要,起码不至于被强制报废。</p>
<h2 id="see-also-updated-may-9-2024">See Also (updated: May 9, 2024)</h2>
<ul>
<li><a href="https://wiki.postmarketos.org/wiki/Devices">https://wiki.postmarketos.org/wiki/Devices</a></li>
</ul>
Thu, 28 Sep 2023 00:00:00 +0000
https://scateu.github.io/2023/09/28/chromebook-linux.html
https://scateu.github.io/2023/09/28/chromebook-linux.html
-
IMAP Notes
<p>IMAP的实时性是非常好的。 它的和什么Handover速度不相上下。可惜作者Mark R. Crispin英年早逝,sigh。</p>
<h2 id="alpine-imap-notes">Alpine IMAP Notes</h2>
<p>我一度在<a href="https://scateu.me/2015/08/23/alpine.html">alpine电子邮件客户端</a>里配置了一个Role,新建一封消息,把所有都置空,只留Fcc (File Carbon Copy)到NOTE目录。</p>
<p>然后在主界面上按<code>#</code>,即可选这个<code>NOTE</code>的角色, 来写一封笔记。然后按<code>C-x</code>发送。</p>
<ul>
<li>由于我配置了允许空收件人,<code>[X] Send to Fcc Only Without Confirming</code>。所以当收件人为空时,按<code>C-x</code>之后无需再确认。</li>
<li><code>[X] Enable Reply Indent String Editing</code> 对于修改NOTE也是挺有用的。</li>
</ul>
<p>至此,可以优雅地把任何IMAP Server变成笔记工具。</p>
<pre><code>Current Folder Type =
(*) Specific (Enter Incoming Nicknames or use ^T)
Folder List = {mail.example.com:993/ssl/user=scateu@example.com}NOTE
Set From = NOTE <note@scateu.me>
Set Fcc = NOTE #注意,在Fastmail里或者其它主流邮箱,Notes名字是苹果Notes.app用的保留字。下面马上要讨论到。
Use SMTP Server = dumb
Use NNTP Server = dumb #防止误发
</code></pre>
<p>如果要修改NOTE,只需要在对应的Folder里,按<code>r</code>回复,Rules也会自动生效。</p>
<p>(btw: 而且这样还有机会做成一个Public IMAP BBS,我打算称它为Draft BBS。)</p>
<p>这个方法非常有效,我从2019年2月开始,一些很有趣的,不太敏感,但又不足以发到Blog的东西,就这样保存。</p>
<h2 id="iphone原生的notesapp">iPhone原生的Notes.app</h2>
<p>iPhone / macOS 上的 Notes.app 简直是扮猪吃老虎的典范。原来它本身就是个IMAP Client!</p>
<p>我之前还在奇怪,为什么苹果系统上添加新邮箱之后,邮箱下面总有一个Note开关。还以为是CalDAV/CardDAV的类似机制。没想到就是IMAP本身。</p>
<h3 id="imap-note-built-by-iphone长什么样">IMAP note built by iPhone长什么样?</h3>
<p>在手机上新建了一条备忘录。长这样。</p>
<pre><code class="language-eml">Content-Type: text/html;
charset=utf-8
Content-Transfer-Encoding: quoted-printable
From: sdf <scateu@sdf.org>
X-Uniform-Type-Identifier: com.apple.mail-note
Mime-Version: 1.0 (iOS/15.7.8 \(19H364\) dataaccessd/1.0)
Date: Tue, 29 Aug 2023 19:50:49 +0800
X-Mail-Created-Date: Tue, 29 Aug 2023 19:50:37 +0800
Subject: =?utf-8?B?5ZWKaG8g55yf5LiN6ZSZ?=
X-Universally-Unique-Identifier: 0AB01715-09B5-4925-A75D-DE9CCC03D8EA
Message-Id: <0EC3A552-1784-4784-9CA6-70AB043A1600@sdf.org>
Content-Length: 253
<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;">啊ho
真不错<div><br></div><div>啊哈哈吼</div><div><br></div></body></html>``
</code></pre>
<h3 id="alpine-上新建一封notesapp可读的备忘录">Alpine 上新建一封Notes.app可读的备忘录</h3>
<p>同理,新建一个Role。</p>
<pre><code>Set Fcc = Notes
Set Other Hdrs = X-Uniform-Type-Identifier: com.apple.mail-note
</code></pre>
<h3 id="troubleshoot-更新慢">Troubleshoot: 更新慢</h3>
<p>经测试,新建一封Notes是很快能推到IMAP服务器上的,无论是在iPhone、mac还是在alpine里。</p>
<p>但被更新方的手机的Notes.app可能不会及时拉取。而Notes.app界面上没有下拉刷新。</p>
<ol>
<li>只需要到Mail.app里下拉刷新一下,然后在Notes.app界面上退到列表上,就会更新了。</li>
<li>或者,在”设置>备忘录>账户>抓取新数据>[你的IMAP]” 由”抓取”改为”手动”。貌似效率反而更高。</li>
</ol>
<h2 id="android-上也能用">Android 上也能用!</h2>
<p>用ImapNote3即可!哇咔咔!可以和macOS/iOS同步!<br />
唯一的缺点是看不了图片。不过笔记嘛,看什么图啦。</p>
<ul>
<li><del> <a href="https://f-droid.org/packages/com.Pau.ImapNotes2/">https://f-droid.org/packages/com.Pau.ImapNotes2/</a> </del></li>
<li><a href="https://github.com/niendo1/ImapNotes3">https://github.com/niendo1/ImapNotes3</a>
<ul>
<li><a href="https://f-droid.org/en/packages/de.niendo.ImapNotes3/">https://f-droid.org/en/packages/de.niendo.ImapNotes3/</a></li>
</ul>
</li>
</ul>
<h3 id="see-also">See also</h3>
<ul>
<li><a href="https://jpmens.net/2015/09/28/experiments-using-imap-for-notes/">https://jpmens.net/2015/09/28/experiments-using-imap-for-notes/</a>
<ul>
<li><a href="https://gist.github.com/jpmens/4ffde3335d1479a9abf0">https://gist.github.com/jpmens/4ffde3335d1479a9abf0</a></li>
</ul>
</li>
<li>Thunderbird插件:
<ul>
<li><a href="https://addons.thunderbird.net/cs/thunderbird/addon/ios-imap-notes/">https://addons.thunderbird.net/cs/thunderbird/addon/ios-imap-notes/</a></li>
<li><a href="https://github.com/valinet/IMAPNotes">https://github.com/valinet/IMAPNotes</a></li>
</ul>
</li>
<li><a href="https://kevinlee.io/wiki/IPhone_Notes_Shell_Script">https://kevinlee.io/wiki/IPhone_Notes_Shell_Script</a></li>
<li><a href="https://forums.zimbra.org/viewtopic.php?t=66943">https://forums.zimbra.org/viewtopic.php?t=66943</a></li>
<li><a href="https://maft.co.uk/musings/2012/how-to-icloud-notes-in-mozilla-thunderbird/">https://maft.co.uk/musings/2012/how-to-icloud-notes-in-mozilla-thunderbird/</a></li>
</ul>
<blockquote>
<p>Well, I use the HeaderTools plugin with Thunderbird to accomplish this, so it’s certainly possible. The notes app picks up the changes right away.</p>
</blockquote>
<h3 id="tips">TIPS</h3>
<ul>
<li>在alpine里,按<code>D</code>删除一封Notes,但不急Expunge,传导到macOS上的Notes.app里似乎更好。如果D完了马上E,Notes.app反而收不到这个删除信息。</li>
</ul>
<h2 id="外一则-taskpaper-通过-alpine-的-imap-工具同步">外一则: taskpaper 通过 alpine 的 IMAP 工具同步</h2>
<p>用户在一个全新的机器上(比如图书馆公用计算机),可以直接敲</p>
<pre><code class="language-bash">alpine -p {imap.example.org:993/ssl/user=scateu@example.org}remote_pinerc
</code></pre>
<p>就会从IMAP服务器的<code>remote_pinerc</code>目录里把配置文件拉下来,然后收邮件。这个设计太妙了。<br />
而且所做的alpine配置的修改,可以直接被commit到这个IMAP目录。</p>
<p>alpine有一个remote folder机制。可以将配置文件写到一个同名的IMAP目录。可以保留5个版本。</p>
<p>比如<code>remote_pinerc</code>:</p>
<pre><code> 1 13/Feb/19 Pine Remote D Header Message for Remote Data
2 Aug 22 Pine Remote D Pine Remote Data Container
N 3 Wed 21:31 Pine Remote D Pine Remote Data Container
4 Wed 21:32 Pine Remote D Pine Remote Data Container
N 5 Tue 21:52 Pine Remote D Pine Remote Data Container
</code></pre>
<pre><code>Date: Wed, 13 Feb 2019 18:06:56
From: Pine Remote Data <nobody@nowhere>
Subject: Header Message for Remote Data
This folder contains a Alpine config file.
This message is just an explanatory message.
The last message in the folder is the live config data.
The rest of the messages contain previous revisions of the data.
To restore a previous revision just delete and expunge all of the messages
which come after it.
</code></pre>
<h3 id="同步任意文本文件">同步任意文本文件</h3>
<p>于是我借用这个机制,在多机之间同步几个小文本文件。</p>
<pre><code class="language-makefile"># password on macOS Keychain: add an item named 'taskpaper' in 'login' keychain.
upload:
for i in 0 A B P P2 imac; do sshpass -P 'ENTER PASSWORD:' -p $$(security find-generic-password -l taskpaper -g 2>&1 1>/dev/null | cut -d'"' -f2) rpload -s 5 -t sig -l $$i.taskpaper -r {imap.example.org:993/ssl/user=steve@example.org}INBOX.taskpaper.$$i;done
download:
for i in 0 A B P P2 imac; do echo $$i; sshpass -P 'ENTER PASSWORD:' -p $$(security find-generic-password -l taskpaper -g 2>&1 1>/dev/null | cut -d'"' -f2) rpdump -l $$i.taskpaper -r {imap.example.org:993/ssl/user=steve@example.org}INBOX.taskpaper.$$i;done
# Shortcuts: upload
# tell application "Finder" to set currentDir to (target of front Finder window) as text
# do shell script "export LANG=en_US.UTF-8; export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/homebrew/bin; cd ~/org/taskpaper;git commit -am 'before upload @iMac'; make upload"
# Shortcuts: download
# tell application "Finder" to set currentDir to (target of front Finder window) as text
# do shell script "export LANG=en_US.UTF-8; export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/homebrew/bin; cd ~/org/taskpaper;git commit -am '@iMac before download'; make download"
</code></pre>
Tue, 29 Aug 2023 00:00:00 +0000
https://scateu.github.io/2023/08/29/imap-notes.html
https://scateu.github.io/2023/08/29/imap-notes.html
-
VNC联sway(i3 on wayland)
<p>十分<a href="https://scateu.me/2016/07/19/i3-wm.html">怀念</a>i3wm。macOS上切来切去效率很低。</p>
<p>以下办法可以无头(headless)地联上Linux主机,效率还不错。随身用树莓派办公好了。</p>
<p>sway是i3在wayland上的实现,可能会比较快吧。wayland是X11的替代。<br />
wayvnc是wayland的vnc。</p>
<pre><code class="language-bash">$ sudo aptitude install xwayland sway wayvnc
$ XDG_RUNTIME_DIR=/tmp/ WLR_BACKENDS=headless WLR_LIBINPUT_NO_DEVICES=1 sway &
$ swaymsg --socket /tmp/sway-ipc.*.sock exec 'WAYLAND_DISPLAY=wayland-1 wayvnc'
$ swaymsg --socket /tmp/sway-ipc.*.sock output "HEADLESS-1" resolution 1920x1080
$ ssh -L 9901:127.0.0.1:5900 your_host
</code></pre>
<p>然后VNC Client联<code>127.0.0.1:9901</code>即可</p>
<ul>
<li>macOS Client: Real VNC Viewer</li>
<li><strong>FIXME:</strong> macOS原生的<code>vnc://</code>不知道为啥不好使</li>
</ul>
<p>好处:</p>
<ul>
<li>不引入额外的认证方式,全靠ssh</li>
</ul>
<h2 id="i3-sway-配置">i3 (sway) 配置</h2>
<ol>
<li>Windows键似乎在Real VNC客户端里不好使,要配成Alt (Mod1)。</li>
<li>sway的default terminal是foot</li>
</ol>
<details>
<summary>i3配置</summary>
<pre><code class="language-nginx"># This file has been auto-generated by i3-config-wizard(1).
# It will not be overwritten, so edit it as you like.
#
# Should you change your keyboard layout some time, delete
# this file and re-run i3-config-wizard(1).
#
# i3 config file (v4)
#
# Please see https://i3wm.org/docs/userguide.html for a complete reference!
set $mod Mod1
# Font for window titles. Will also be used by the bar unless a different font
# is used in the bar {} block below.
font pango:monospace 8
# This font is widely installed, provides lots of unicode glyphs, right-to-left
# text rendering and scalability on retina/hidpi displays (thanks to pango).
#font pango:DejaVu Sans Mono 8
# The combination of xss-lock, nm-applet and pactl is a popular choice, so
# they are included here as an example. Modify as you see fit.
# xss-lock grabs a logind suspend inhibit lock and will use i3lock to lock the
# screen before suspend. Use loginctl lock-session to lock your screen.
exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock --nofork
# NetworkManager is the most popular way to manage wireless networks on Linux,
# and nm-applet is a desktop environment-independent system tray GUI for it.
exec --no-startup-id nm-applet
# Use pactl to adjust volume in PulseAudio.
set $refresh_i3status killall -SIGUSR1 i3status
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status
# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod
# start a terminal
bindsym $mod+Return exec foot
# kill focused window
bindsym $mod+Shift+q kill
# start dmenu (a program launcher)
bindsym $mod+d exec wofi --show run
# wofi是wayland版的rofi
bindsym $mod+d exec --no-startup-id bemenu-run #这个快
# bindsym $mod+d exec rofi -show run
# There also is the (new) i3-dmenu-desktop which only displays applications
# shipping a .desktop file. It is a wrapper around dmenu, so you need that
# installed.
# bindsym $mod+d exec --no-startup-id i3-dmenu-desktop
# change focus
bindsym $mod+j focus left
bindsym $mod+k focus down
bindsym $mod+l focus up
bindsym $mod+semicolon focus right
# alternatively, you can use the cursor keys:
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right
# move focused window
bindsym $mod+Shift+j move left
bindsym $mod+Shift+k move down
bindsym $mod+Shift+l move up
bindsym $mod+Shift+semicolon move right
# alternatively, you can use the cursor keys:
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right
# split in horizontal orientation
bindsym $mod+h split h
# split in vertical orientation
bindsym $mod+v split v
# enter fullscreen mode for the focused container
bindsym $mod+f fullscreen toggle
# change container layout (stacked, tabbed, toggle split)
bindsym $mod+s layout stacking
bindsym $mod+w layout tabbed
bindsym $mod+e layout toggle split
# toggle tiling / floating
bindsym $mod+Shift+space floating toggle
# change focus between tiling / floating windows
bindsym $mod+space focus mode_toggle
# focus the parent container
bindsym $mod+a focus parent
# focus the child container
#bindsym $mod+d focus child
# Define names for default workspaces for which we configure key bindings later on.
# We use variables to avoid repeating the names in multiple places.
set $ws1 "1"
set $ws2 "2"
set $ws3 "3"
set $ws4 "4"
set $ws5 "5"
set $ws6 "6"
set $ws7 "7"
set $ws8 "8"
set $ws9 "9"
set $ws10 "10"
# switch to workspace
bindsym $mod+1 workspace number $ws1
bindsym $mod+2 workspace number $ws2
bindsym $mod+3 workspace number $ws3
bindsym $mod+4 workspace number $ws4
bindsym $mod+5 workspace number $ws5
bindsym $mod+6 workspace number $ws6
bindsym $mod+7 workspace number $ws7
bindsym $mod+8 workspace number $ws8
bindsym $mod+9 workspace number $ws9
bindsym $mod+0 workspace number $ws10
# move focused container to workspace
bindsym $mod+Shift+1 move container to workspace number $ws1
bindsym $mod+Shift+2 move container to workspace number $ws2
bindsym $mod+Shift+3 move container to workspace number $ws3
bindsym $mod+Shift+4 move container to workspace number $ws4
bindsym $mod+Shift+5 move container to workspace number $ws5
bindsym $mod+Shift+6 move container to workspace number $ws6
bindsym $mod+Shift+7 move container to workspace number $ws7
bindsym $mod+Shift+8 move container to workspace number $ws8
bindsym $mod+Shift+9 move container to workspace number $ws9
bindsym $mod+Shift+0 move container to workspace number $ws10
# reload the configuration file
bindsym $mod+Shift+c reload
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
bindsym $mod+Shift+r restart
# exit i3 (logs you out of your X session)
bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your X session.' -B 'Yes, exit i3' 'i3-msg exit'"
# resize window (you can also use the mouse for that)
mode "resize" {
# These bindings trigger as soon as you enter the resize mode
# Pressing left will shrink the window’s width.
# Pressing right will grow the window’s width.
# Pressing up will shrink the window’s height.
# Pressing down will grow the window’s height.
bindsym j resize shrink width 10 px or 10 ppt
bindsym k resize grow height 10 px or 10 ppt
bindsym l resize shrink height 10 px or 10 ppt
bindsym semicolon resize grow width 10 px or 10 ppt
# same bindings, but for the arrow keys
bindsym Left resize shrink width 10 px or 10 ppt
bindsym Down resize grow height 10 px or 10 ppt
bindsym Up resize shrink height 10 px or 10 ppt
bindsym Right resize grow width 10 px or 10 ppt
# back to normal: Enter or Escape or $mod+r
bindsym Return mode "default"
bindsym Escape mode "default"
bindsym $mod+r mode "default"
}
bindsym $mod+r mode "resize"
# Start i3bar to display a workspace bar (plus the system information i3status
# finds out, if available)
bar {
status_command i3status
#status_command i3blocks
#status_command waybar
}
input "1452:601:bcm5974" {
dwt enabled
tap enabled
natural_scroll enabled
}
output eDP-1 scale 1.5 res 1920x1080
default_border pixel 0
hide_edge_borders none
</code></pre>
</details>
<h2 id="troubleshoot">Troubleshoot</h2>
<p>如果 RealVNC VNC Viewer 报错:</p>
<blockquote>
<p>ZlibInstream: inflate failed with error “-3”</p>
</blockquote>
<p>参考: <a href="https://www.moonfly.net/archives/52.html">https://www.moonfly.net/archives/52.html</a></p>
<blockquote>
<p>只需要到该会话的连接属性中修改一下要显示的颜色质量就可以了; <br />
默认是“自动”模式就会出现上述的问题,只需要手动修改成“高,中,低”即可;</p>
</blockquote>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="https://github.com/novnc/noVNC/blob/master/README.md#quick-start">https://github.com/novnc/noVNC/blob/master/README.md#quick-start</a></li>
<li>vinagre可能是一个比较好的vnc工具: <a href="https://nth233.top/notes/wayvnc">https://nth233.top/notes/wayvnc</a></li>
<li><a href="https://ivonblog.com/posts/waypipe-wayland-over-ssh/">https://ivonblog.com/posts/waypipe-wayland-over-ssh/</a></li>
<li><a href="https://nth233.top/notes/wayvnc">https://nth233.top/notes/wayvnc</a></li>
<li><a href="https://n.ethz.ch/~dbernhard/wayvnc-server.html">https://n.ethz.ch/~dbernhard/wayvnc-server.html</a></li>
<li><a href="https://cloud-atlas.readthedocs.io/zh_CN/latest/linux/desktop/wayland/wayland_vnc.html">https://cloud-atlas.readthedocs.io/zh_CN/latest/linux/desktop/wayland/wayland_vnc.html</a></li>
<li><a href="https://blog.wirelessmoves.com/2013/04/ubuntu-remote-screen-viewing-fixed-with-x11vnc.html">https://blog.wirelessmoves.com/2013/04/ubuntu-remote-screen-viewing-fixed-with-x11vnc.html</a></li>
</ul>
Mon, 28 Aug 2023 00:00:00 +0000
https://scateu.github.io/2023/08/28/sway-wayvnc.html
https://scateu.github.io/2023/08/28/sway-wayvnc.html
-
Vim 糙音速剪辑 | rCut >
<p><a href="https://github.com/scateu/tsv_edl.vim">https://github.com/scateu/tsv_edl.vim</a> 欢迎使用。</p>
<h2 id="缘由">缘由</h2>
<p>2019年我剪了十几期<a href="https://podcast.scateu.me/">podcast</a>。一开始很兴奋,后来很疲惫,最后几期是由我[室友]{WiFe}帮我剪的。<br />
录一个小时的内容,得花三小时剪,而且这其间几乎没有创造性劳动。特别是在下还兼host,所以录到一小时左右,guest讲得越来越开心,我却越来越慌 – 因为剪辑实在是太累了。<br />
剪上四五小时精疲力尽之后,根本没有任何意愿去重新安排顺序、剪掉无关的话题、摘取精彩片段。</p>
<p>后来我看到了BBC Media Lab有一个实验性的项目,叫<a href="https://docs.google.com/presentation/d/1vVe_hgTj6JhLhU2WuZBOWx41ajcKX-8m8Xa0NIVZT2M/edit#slide=id.g6b51b79a88_2_245">Digital Paper Edit</a>。BBC一直以来用的工作流,就是</p>
<ol>
<li>狂录</li>
<li>转写,带着时码打印到纸上</li>
<li>标注分类</li>
<li>摘取,大剪刀大胶带糊在大纸上</li>
<li>送给剪辑师</li>
</ol>
<p>他们用electron实现了一套很fancy的东西,九个人的团队做的。(我2023年再去看<a href="https://bbcnewslabs.co.uk/projects/digital-paper-edit/">页面</a>已经离职得只剩一位了)</p>
<p>后来<a href="https://www.descript.com/">descript</a>、<a href="https://podcast.adobe.com">adobe podcast</a>都出了类似的方法。但都是租用式服务,或者不支持中文,用着不开心。</p>
<p>所以我自己用Vim实现了一个。</p>
<p>用Emacs打电话,用Vim剪视频,why not。</p>
<h2 id="摘要">摘要</h2>
<p>用Vim或Excel或Numbers.app或Google Spreadsheet配合字幕剪<strong>视频</strong>。 (纯音频也可以)</p>
<ul>
<li>定义了一种tsv格式(由srt 1:1转过来)
<ul>
<li>tsv实际上就是tab分隔的spreadsheet文件,可以直接用excel打开。tsv(tab)和csv(comma逗号)是同等的。</li>
</ul>
</li>
<li>Vim可以方便地编辑这个tsv,并唤起<a href="https://mpv.io/">mpv</a>来预览。</li>
<li>用V选中行
<ul>
<li>按空格,调用<code>tsv2roughcut</code>(python脚本,调ffmpeg)导出mp4;</li>
<li>按<code>x</code>,调用<code>tsv2fcpxml</code> 导出成fcpxml文件,送进fcpx或达芬奇再微调</li>
</ul>
</li>
<li>Vim里按两下<code>\\</code>,会后台调起mpv播放器,通过unix socket通信
<ul>
<li>Vim上下动光标,自动socat给mpv去seek。</li>
<li>然后再微调的话,可以在mpv里动进度条,然后再在vim里按<code>gi</code>,读当前mpv的位置,并覆盖到这一行tsv的起始时码</li>
</ul>
</li>
</ul>
<p>Cheatsheet pdf<a href="https://github.com/scateu/tsv_edl.vim/raw/main/docs/tsv_edl_refcard.pdf">在此</a>,demo在这里。</p>
<p><img src="https://github.com/scateu/tsv_edl.vim/blob/main/screenshots/h.png" alt="" /><br />
<img src="https://github.com/scateu/tsv_edl.vim/raw/main/screenshots/fcpx.jpg" alt="" /><br />
<img src="https://github.com/scateu/tsv_edl.vim/raw/main/screenshots/a.png" alt="" /><br />
<img src="https://github.com/scateu/tsv_edl.vim/raw/main/screenshots/c.jpg" alt="" /><br />
<img src="https://github.com/scateu/tsv_edl.vim/raw/main/screenshots/d.jpg" alt="" /><br />
<img src="https://github.com/scateu/tsv_edl.vim/raw/main/screenshots/e.jpg" alt="" /><br />
<img src="https://github.com/scateu/tsv_edl.vim/raw/main/screenshots/g.jpg" alt="" /></p>
<h2 id="主要特性">主要特性</h2>
<h3 id="1-格式简单">1. 格式简单</h3>
<pre><code>* 标题
只要开头没EDL的都算是注释。
## 子段落
EDL⇥00:00:01,000⇥00:00:05,000⇥|⎵image⎵|⇥subtitles….
EDL⇥00:00:01,000⇥00:10:01,422⇥|⎵clipname⎵|⇥[B]this is B-Roll
EDL⇥00:00:01,000⇥00:10:01,422⇥|⎵clipname⎵|⇥subtitles….
*** 子子段落
支持Markdown的#式标题,同时也混乱中立地支持org mode的*式标题。
</code></pre>
<ul>
<li>srt2tsv,简单到可以用纯sed命令来实现</li>
</ul>
<pre><code class="language-bash">cat some.srt | sed -n -r '1{/^$/n;};/^[0-9]+$/{n; s/ --> /\t/; s/$/\t| _CLIPNAME_ |\t/; N; s/\n//; h; d;}; /^$/! { H; $!d;}; x; s/\n/\\N/g; s/^/EDL\t/;p' > some.tsv
</code></pre>
<ul>
<li>clipname处只写文件名,不用带扩展名,会自动从当前目录里依次找<code>视频>音频>图片</code>。</li>
<li>按<code>\c</code>可以借用vim的conceal机制,把前几列隐藏掉</li>
<li>所有不带EDL行都可作为注释。
<ul>
<li>Markdown/org mode式折叠,按Tab键即可。</li>
</ul>
</li>
<li>tsv文件仅当前几行有EDL字样才会调起我的插件,其它tsv不用太担心</li>
</ul>
<h3 id="2-预览">2. 预览</h3>
<ul>
<li>简单预览可以直接在行上按tab键,即可从该行的起始播到结尾</li>
<li>按两下反斜杠<code>\\</code>可以通过unix socket与mpv播放器通信
<ul>
<li>在vim里按上下键的同时会向mpv发送时间码并定位到本行的起始时间码</li>
</ul>
</li>
</ul>
<h3 id="3-时间码编辑">3. 时间码编辑</h3>
<ul>
<li>一行字幕太长的话,可以按竖线<code>|</code>来从中间切开(按照字符长度推断)
<ul>
<li>按<code>J</code>键可以把两行合成一行粘起来</li>
</ul>
</li>
<li>如果这个时间推断的不准,可以先在要切断的字上按<code>mm</code>,表示文字要在这里断。然后左右动光标,按tab来预览,听声音,找到对应文字的音频位置,再按竖线<code>|</code></li>
</ul>
<h3 id="4-精选煎饼式剪辑-cherrypick--pancake-editing">4. 精选/煎饼式剪辑 Cherrypick / Pancake Editing</h3>
<ul>
<li>按<code>\P</code>或<code>\p</code>,出一个新的vim tab,上下按光标(也可以先打开mpv预览)</li>
<li>选到如意的,按回车,当前行即被粘到另一个tab里。
<ul>
<li>本行用过会变成<code>---</code>,以便使你知道这行已经被用了。</li>
</ul>
</li>
</ul>
<h3 id="5-b-roll">5. B roll</h3>
<ul>
<li>可以给podcast配图</li>
<li>可以给说话脑袋(talking heads)加配图视频(B roll)</li>
</ul>
<h3 id="6-http素材导入">6. HTTP素材导入</h3>
<ul>
<li>如果被竖线包围的<code>clipname</code>以<code>http</code>开头,<code>tsv2roughcut</code>(绑到了<code>V</code>键选后按空格)会自动用<code>youtube-dl</code>等工具帮你下回来并合成。而且只下其中要用的那段,而不是整个下回来。</li>
<li>如果觉得下载动作太宝贵,<code>tsv2roughcut</code>会停下来问你要不要删掉tmp文件夹,此时可以抢救</li>
</ul>
<h3 id="7-简单渲染">7. 简单渲染</h3>
<ul>
<li>用V键选上几行EDL,如果中间有文字注释也没关系,会忽略。按空格,即调用<code>tsv2roughcut</code>渲染mp4.</li>
<li>甚至可以用grep来剪视频
<ul>
<li>eg: Never, never. <a href="https://www.bilibili.com/video/bv19b4y1e7Cn">Bilibili</a> <a href="https://youtu.be/avIspauKS3c">Youtube</a></li>
<li><code>cat V Dont.Look.Up Inglourious No.Country.for.Old.Men The.Bourne.Supremacy 谍影重重3 Notting.Hill | grep -e god -e love -e beep -e shit | sort</code> <a href="https://www.bilibili.com/video/BV1RZ4y1S7JA/">B</a></li>
</ul>
</li>
</ul>
<h3 id="8-fcpxml导出">8. fcpxml导出</h3>
<ul>
<li><code>V</code>选之后按<code>x</code>键,导出成fcpxml,从而可以导入Final Cut Pro或DaVinci Resolve等工具做精调。注意会问你fps,视情况修改。</li>
</ul>
<h3 id="9-小工具">9. 小工具</h3>
<ul>
<li><code>audio2srtvideo</code> 把纯音频加上时码和字幕,方便把podcast传B站。顺便,我一个人校对了十几期<a href="https://space.bilibili.com/65817373/search/video?keyword=VfD">Voices from DARPA</a>和几期<a href="https://space.bilibili.com/65817373/search/video?keyword=radiolab">radiolab</a>的podcast,也放B站了</li>
<li>macOS的shortcuts: 在<a href="https://github.com/scateu/tsv_edl.vim/blob/main/README.macOS.shortcuts.md">README.macOS.shortcuts.md</a> 里,得手动配。可以用。凑合用。图形界面了算是。</li>
<li>其它工具都在<a href="https://github.com/scateu/tsv_edl.vim/tree/main/utils">utils</a>目录了。都是独立的工具,不是Vim用户也可以用。基本上都是从stdin读,输出到stdout</li>
<li><code>scenecut_preview</code>: 把视频的转场点切开,输出tsv文件,并把预览截图输出到子目录</li>
<li><code>audiocut</code>: 按视频中声音的silence位置切开,输出tsv文件</li>
</ul>
<p><img src="https://raw.githubusercontent.com/scateu/tsv_edl.vim/main/screenshots/shortcuts.png" alt="shortcuts" /></p>
<p><img src="https://github.com/scateu/tsv_edl.vim/raw/main/docs/tsv_edl_flow.png" alt="work flow" /></p>
<h2 id="键绑定">键绑定</h2>
<table>
<thead>
<tr>
<th>键</th>
<th>能</th>
</tr>
</thead>
<tbody>
<tr>
<td>⇥ (tab)</td>
<td>[mpv] 调mpv播放这一行(从光标位置推断),到此行结束停。</td>
</tr>
<tr>
<td>⇧⇥</td>
<td>[mpv] 同上,但从这一行头播,行尾停。</td>
</tr>
<tr>
<td>\ ⇥</td>
<td>[mpv] 同tab键,但本行尾结束后mpv不停。</td>
</tr>
<tr>
<td>\ ⎵</td>
<td>[mpv] 从本行起一行一行地播。直到文件尾。(相当于成片预览)</td>
</tr>
</tbody>
</table>
<h3 id="时间码编辑">时间码编辑</h3>
<table>
<thead>
<tr>
<th>键</th>
<th>能</th>
</tr>
</thead>
<tbody>
<tr>
<td>J</td>
<td>把下一行合并。如果本行和下一行的文字都是http开头,会生成一个EDL行,并把clipname填上。</td>
</tr>
<tr>
<td>|</td>
<td>把本行在光标位置切断。时间点由字符位置推断。</td>
</tr>
<tr>
<td>mm</td>
<td>先mark文字切断点,再左右找时间,按竖线切。特别是在时间推断不准的时候用,很有效。</td>
</tr>
<tr>
<td>⇧← ⇧→</td>
<td>与上一行卷动时码1秒,即本行入码减1秒,上一行的出码加1秒</td>
</tr>
<tr>
<td>g0</td>
<td>跳去字幕列</td>
</tr>
<tr>
<td>g8</td>
<td>去上一行的<code>record_out</code>出时码位置</td>
</tr>
<tr>
<td>g9</td>
<td>去本行的<code>record_in</code>入时码位置</td>
</tr>
<tr>
<td>gO</td>
<td>在本行后增加一行空隙,时长5秒</td>
</tr>
<tr>
<td>gN</td>
<td>在本行后增加一新行,时长10分钟,光标置于clipname字段</td>
</tr>
<tr>
<td>gB</td>
<td>切换本行subtitle段是否有’[B]’</td>
</tr>
<tr>
<td>gb</td>
<td>同gB</td>
</tr>
<tr>
<td>gc</td>
<td>计算本行的时长,加到末尾</td>
</tr>
<tr>
<td>\ c</td>
<td>隐藏/显示前四列; 从conceallevel=0, 1之间切换; <code>:set nowrap</code>可能会有用</td>
</tr>
</tbody>
</table>
<h3 id="剪辑决策-bbc纸式剪辑">剪辑决策/ BBC纸式剪辑</h3>
<table>
<thead>
<tr>
<th>键</th>
<th>能</th>
</tr>
</thead>
<tbody>
<tr>
<td>\ p</td>
<td>进入精选模式,在最左边起新标签页。将⏎绑到选择功能</td>
</tr>
<tr>
<td>⏎ (enter)</td>
<td>把此行复制到Vim的tab 1,然后将本行标记为<code>---</code></td>
</tr>
<tr>
<td>\ P</td>
<td>进入精选模式,将屏幕横分为二。将⏎绑到选择功能</td>
</tr>
<tr>
<td>⏎</td>
<td>将此行复制到屏幕的另一半里,然后将本行标记为<code>---</code></td>
</tr>
<tr>
<td>⌫ (BS)</td>
<td>拒绝本行,把行首标记为<code>xxx</code>然后去下一行</td>
</tr>
<tr>
<td>⌦ (DEL, fn⌫)</td>
<td>在<code>EDL</code> <code>xxx</code>之间切换; 会将<code>---</code>切回<code>EDL</code></td>
</tr>
<tr>
<td>V (高亮选择) ⎵</td>
<td>把高亮选中的行用 <code>tsv2roughcut</code> 进行简单渲染</td>
</tr>
<tr>
<td>V x</td>
<td>把高亮选中的行用<code>tsv2fcpxml</code>导出</td>
</tr>
</tbody>
</table>
<h3 id="mpv-ipc-control-mode">MPV IPC CONTROL MODE</h3>
<table>
<thead>
<tr>
<th>键</th>
<th>能</th>
</tr>
</thead>
<tbody>
<tr>
<td>\ \</td>
<td>拉起mpv,实际上是做<code>mpv --input-ipc-server=/tmp/mpvsocket --pause clipname.mp4</code></td>
</tr>
<tr>
<td> </td>
<td>进入IPC 控制模式 <code>s ← → ↑ ↓ ⎵ ⏎</code> 被重新定义, 再按<code>\\</code>这些键的定义复原</td>
</tr>
<tr>
<td>\ \ (再来)</td>
<td>通过ipc socket给mpv发退出</td>
</tr>
<tr>
<td>⎵</td>
<td>[mpv ipc] 放/停</td>
</tr>
<tr>
<td>← →</td>
<td>移动,并让mpv播放器的位置定到vim光标的位置</td>
</tr>
<tr>
<td>↑ ↓</td>
<td>同上,注意当clipname有变,mpv会不重启地自动切到新clipname上</td>
</tr>
<tr>
<td>\ ⎵</td>
<td>[mpv ipc] 从本行开始播到文件尾 (每一行的时间是猜的)</td>
</tr>
<tr>
<td>⏎ or s</td>
<td>[mpv ipc] 让mpv定位到光标的位置</td>
</tr>
<tr>
<td>ns</td>
<td>[mpv ipc] 找到下一个词,再seek。大招,很好玩</td>
</tr>
<tr>
<td>S</td>
<td>[mpv ipc] 从mpv上问到当前时间,然后让vim的光标跑到那一行。</td>
</tr>
<tr>
<td>\ S</td>
<td>同上,但向上找。</td>
</tr>
<tr>
<td>gS</td>
<td>同上,开启播放头定期同步,每1秒一次,再按关掉。⎵将暂停同步并恢复状态。</td>
</tr>
<tr>
<td>⇥</td>
<td>让mpv定到vim光标处,并让mpv播放. 如在注释区,跳到下一个<code>EDL</code>行</td>
</tr>
<tr>
<td>⇧⇥</td>
<td>seek到行首,然后按tab</td>
</tr>
<tr>
<td>gi</td>
<td>从mpv处问到当前时间码,覆盖到本行的起始时间码(in)</td>
</tr>
<tr>
<td>go</td>
<td>同上,但覆盖到本行的结束时码(out)</td>
</tr>
<tr>
<td>-</td>
<td>从mpv取当前时间,写到本行的out时码,并下移一行,覆盖其in时码。如下一行为纯文本,增加EDL头(便于给纯文本转写加时间轴)</td>
</tr>
</tbody>
</table>
<h3 id="orgmodemarkdown-折叠">Orgmode/Markdown 折叠</h3>
<table>
<thead>
<tr>
<th>键</th>
<th>能</th>
</tr>
</thead>
<tbody>
<tr>
<td>⇥</td>
<td>不在EDL或—或xxx行,等同于<code>za</code>切换折叠。<code>##</code>或<code>**</code>都算</td>
</tr>
<tr>
<td>⇧⇥</td>
<td>切foldlevel=0,1,2</td>
</tr>
<tr>
<td> </td>
<td>如果在EDL行上,你得按 <code>za</code> <code>zm</code> <code>zr</code> <code>zo</code> <code>zO</code> <code>zM</code> <code>zR</code></td>
</tr>
<tr>
<td>]]</td>
<td>去下一个heading</td>
</tr>
<tr>
<td>[[</td>
<td>去上一个heading</td>
</tr>
<tr>
<td>g]</td>
<td>去下一个comment行(不以EDL开始)</td>
</tr>
<tr>
<td>g[</td>
<td>去上一个comment行</td>
</tr>
</tbody>
</table>
<h2 id="项目名">项目名</h2>
<p>曾用名”超音速剪辑”,不够谦逊。</p>
<h2 id="fosdem-2024">FOSDEM 2024</h2>
<ul>
<li><a href="https://fosdem.org/2024/schedule/event/fosdem-2024-2804-edit-video-audio-with-or-without-vim/">https://fosdem.org/2024/schedule/event/fosdem-2024-2804-edit-video-audio-with-or-without-vim/</a></li>
</ul>
<p>去不了现场,但有幸被elvish作者xiaq和openwifi的作者jxj联合代为present。欢迎收看</p>
Sun, 19 Mar 2023 00:00:00 +0000
https://scateu.github.io/2023/03/19/tsv_edl.vim.html
https://scateu.github.io/2023/03/19/tsv_edl.vim.html
-
在2021年用电话线拨号上网管理服务器
<h1 id="电话线供电">电话线供电</h1>
<p>没有电话交换机。直接用电话线把两个MODEM接起来(Dry line)是不工作的。</p>
<p>据说电话线上的电压:</p>
<ul>
<li>没有电话呼入呼出 20V</li>
<li>有电话呼入’RING’: 20-25Hz, 50-120Vpp (也有说48V)</li>
<li>接听状态 10V</li>
</ul>
<p>电话交换机的作用是,制造一个’RING’信号,让MODEM振铃。MODEM会在串口上打出<code>RING</code>字样。</p>
<p>参考<a href="https://www.tldp.org/HOWTO/Modem-HOWTO-26.html">这个</a>和<a href="https://www.jagshouse.com/modem.html">这个</a></p>
<pre><code> + | | -
GREEN----------+---||||---/\/\/--+-------------RED
| | | R |
| 9 to 24V |
| |
+---||------------+
C .47uF
RED-----------------------------------------------GREEN
</code></pre>
<p>手边刚好翻出一个9V电池。用两个曲别针当电极。</p>
<p>并把家里墙上的电话插座拆了。搭出了下面的东西: (Dell RD02-D400)</p>
<p><img src="https://scateu.github.io/images/modem.jpg" alt="modem" /></p>
<h1 id="直接通信">直接通信</h1>
<p>客户端:</p>
<pre><code class="language-bash">picocom -b 115200 /dev/tty.usbmodem2
ATX0 #忽略拨号音
ATDT123123 #随便拨一个号, ATD也行, ATD100, ATDT100都可以
</code></pre>
<p>(服务器)局端:</p>
<pre><code class="language-bash">picocom -b 115200 /dev/ttyACM0
ATA #接电话, Answer
</code></pre>
<p>然后两只🐱就会协商,提示</p>
<pre><code>CONNECT 115200
</code></pre>
<p>然后链路就通了,继续在picocom里打字,对端就会显示</p>
<h1 id="进一步-getty">进一步: getty</h1>
<p>在服务器(局端)按<code>C-a C-q</code>退出picocom</p>
<pre><code class="language-bash">systemctl start getty@ttyACM0.service #在/lib/systemd/system/getty\@.service 里可以看到,实际上是/sbin/agetty
</code></pre>
<p>这时,在客户端就出现了</p>
<pre><code>login:
</code></pre>
<p>可以动手了。</p>
<p>有趣的是:</p>
<pre><code class="language-bash">$ w
USER TTY FROM LOGIN@ IDLE WHAT
scateu ttyACM0 .....
</code></pre>
<h1 id="无人值守-mgetty">无人值守: mgetty</h1>
<p>由于我们没有振铃信号,无法出现<code>RING</code>字样。因此让它自动回复<code>ATA</code>来强制接听。(不是好的选择)</p>
<pre><code class="language-bash">sudo /usr/sbin/mgetty -D -s 115200 -m '"" ATA' /dev/ttyACM0 #在客户端ATD指令之后再敲回车
tail -f /var/log/mgetty.ttyACM0
</code></pre>
<h1 id="see-also">See also</h1>
<ul>
<li>据说用<code>AT+MS=V32</code>设置波特率为9600,Skype上也很稳</li>
<li><a href="https://www.youtube.com/watch?v=XK0ReVwK8wE">Dialup modem trying to train on VoIP - YouTube</a></li>
<li><a href="https://albal21.wordpress.com/2013/01/21/using-a-voip-line-for-dun/">Using a VOIP Line for DUN – Albal’s Blog</a></li>
<li><a href="https://www.youtube.com/watch?v=AdgvceSBroU">Opera singers dubbed with dial up modems - YouTube</a></li>
<li><a href="https://www.youtube.com/watch?v=luarFqislIc">56k and 33.6k Modems Connecting to Each Other with no Phone Service - YouTube</a></li>
<li><a href="https://en.wikipedia.org/wiki/NO_CARRIER">NO CARRIER - Wikipedia</a></li>
<li><a href="https://en.wikipedia.org/wiki/Null_modem">Null modem - Wikipedia</a></li>
<li><a href="https://www.instructables.com/How-to-Get-Emergency-Power-from-a-Phone-Line/">How to Get Emergency Power From a Phone Line : 5 Steps - Instructables</a></li>
<li><a href="https://en.wikipedia.org/wiki/Dry_loop">Dry loop - Wikipedia</a></li>
<li><a href="https://tldp.org/HOWTO/Modem-HOWTO-26.html">Modem-HOWTO: Appendix F: Connecting 2 Modems Directly Back-to-Back (Leased Lines).</a></li>
<li><a href="https://www.jagshouse.com/modem.html">Connecting two computers using their modems, without a telephone line</a></li>
<li><a href="https://www.instructables.com/Direct-connecting-two-old-fashioned-modems-or-te/">Direct Connecting Two (old Fashioned) Modems or Telephones. : 5 Steps - Instructables</a></li>
<li><a href="https://electronics.stackexchange.com/questions/5531/wiring-up-old-phone-ringer-to-arduino">telephone - Wiring up old phone ringer to arduino - Electrical Engineering Stack Exchange</a></li>
<li><a href="https://www.youtube.com/watch?v=9afGtWbQDKw">Ring signal generator - YouTube</a></li>
<li><a href="https://bugzilla.redhat.com/attachment.cgi?id=1701152&action=diff">mgetty Attachment 1701152 Details for Bug 1856765 – Patch sent upstream</a></li>
<li><a href="https://dogemicrosystems.ca/wiki/Dial_up_server">Dial up server - Doge Microsystems</a></li>
<li><a href="https://www.youtube.com/watch?v=Bk86uqEiwpE">Setup your own Dial-Up Networking Server with real hardware! - YouTube</a></li>
<li><a href="https://dogemicrosystems.ca/wiki/Dial-up_pool">Dial-up pool - Doge Microsystems</a></li>
<li><a href="https://hackaday.com/2020/05/30/build-your-own-dial-up-isp-now-with-modem-pool/">Build Your Own Dial-Up ISP – Now With Modem Pool! | Hackaday</a></li>
<li><a href="https://www.youtube.com/watch?v=Fk4-pPati-U">Setting up my own Dialup Internet connection using a Mac, a PC, and an eBay PBX - YouTube</a></li>
<li><a href="https://arstechnica.com/civis/viewtopic.php?f=10&t=1012182">Direct connection between two modems for routing. - Ars Technica OpenForum</a></li>
<li><a href="https://tldp.org/HOWTO/Leased-Line/modem.html">Leased line Mini HOWTO: Modem</a></li>
<li><a href="https://xmodem.org/chipsets/conexant/conexant_dgc-usb.html">Conexant DGC-USB</a></li>
<li>搜索关键词 “Dial in” “Dial up” “Phone Line Simulator” “Dry line” “Dry Pair” “Wet line” “leased line”</li>
<li>“modem over voip” “modem over vonage” “modem over skype”</li>
<li>Minimodem - <a href="https://www.whence.com/minimodem/">https://www.whence.com/minimodem/</a></li>
</ul>
Fri, 29 Jan 2021 00:00:00 +0000
https://scateu.github.io/2021/01/29/modem.html
https://scateu.github.io/2021/01/29/modem.html