<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Soul Of Free Loop &#187; 工具</title>
	<atom:link href="https://zohead.com/archives/category/tools/feed/" rel="self" type="application/rss+xml" />
	<link>https://zohead.com</link>
	<description>Uranus Zhou&#039;s Blog</description>
	<lastBuildDate>Sat, 19 Jul 2025 15:42:46 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.8</generator>
	<item>
		<title>Madoko Local本地使用的问题</title>
		<link>https://zohead.com/archives/madoko-local/</link>
		<comments>https://zohead.com/archives/madoko-local/#comments</comments>
		<pubDate>Mon, 27 Mar 2023 16:33:21 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[LaTeX]]></category>
		<category><![CDATA[Madoko]]></category>
		<category><![CDATA[Madoko Local]]></category>
		<category><![CDATA[Markdown]]></category>
		<category><![CDATA[编辑器]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1827</guid>
		<description><![CDATA[关于 Madoko Madoko 是微软研究院之前推出的一款在线 Markdown 编辑器，只不过更加偏向学术使用，主要亮点在于 Madoko 可以和 LaTeX 结合，支持 LaTeX 一些语法和功能。 LaTeX 是一种基于 TEX 的排版系统，功能非常强大，不少写学术论文的研究者们应该都用过，但其比较底层，学习曲线和难度也挺大。Madoko 可以将 LaTeX 与简单的 Markdown 语法相结合，大部分的文档格式和结构可以使用现有的 Markdown 语法，用户也可以使用 LaTeX 的语法和命令进行扩展，可以很轻松地生成 LaTeX 排版效果的文档，默认也支持输出 HTML 和 P [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2 id="about-madoko">关于 Madoko</h2>
<p><a href="https://github.com/koka-lang/madoko" target="_blank">Madoko</a> 是微软研究院之前推出的一款在线 Markdown 编辑器，只不过更加偏向学术使用，主要亮点在于 Madoko 可以和 LaTeX 结合，支持 LaTeX 一些语法和功能。</p>
<p>LaTeX 是一种基于 TEX 的排版系统，功能非常强大，不少写学术论文的研究者们应该都用过，但其比较底层，学习曲线和难度也挺大。Madoko 可以将 LaTeX 与简单的 Markdown 语法相结合，大部分的文档格式和结构可以使用现有的 Markdown 语法，用户也可以使用 LaTeX 的语法和命令进行扩展，可以很轻松地生成 LaTeX 排版效果的文档，默认也支持输出 HTML 和 PDF 文档。</p>
<p>Madoko 官方的在线编辑器 Madoko Editor 网站是：</p>
<p><a href="https://www.madoko.net/" target="_blank">https://www.madoko.net/</a></p>
<p>最近 Madoko Editor 网站访问有点问题，不过我之前也已经把 Madoko Editor 网站备份过了，能够自行部署运行，编辑器的界面和默认的示例文档如下：</p>
<p><img src="https://images.weserv.nl/?url=http://res.cloudinary.com/digwht2y0/image/upload/v1737372294/madoko-editor.png" alt="Madoko Editor"></p>
<p>可以看到 Madoko 文档的扩展名是 <code>mdk</code>，而且 mdk 文档基本都是使用现有的 Markdown 语法加上一点 LaTeX 语法，即使不使用 Madoko Editor，也可以用其它 Markdown 编辑器打开进行编辑。</p>
<h2 id="madoko-local">Madoko Local</h2>
<p>mdk 文档在 Madoko Editor 中编辑修改之后，支持保存到 Dropbox、GitHub、OneDrive 以及 Local Disk 本地：</p>
<p><img src="https://images.weserv.nl/?url=http://res.cloudinary.com/digwht2y0/image/upload/v1737442733/makodo-editor-save.png" alt="Madoko Local Disk 保存"></p>
<p>由于众所周知的原因，前面三个存储目标国内用起来都不太稳定，而且之前我使用 Madoko 的时候就发现用这些云存储进行文档编辑似乎也容易出问题，可能就用微软自己的 OneDrive 做存储稳定一些。</p>
<p>另外考虑到数据放在自己手里才是最安全的，因此我一般都是用 Local Disk 本地保存方式。</p>
<p>Madoko 的本地磁盘访问则需要 <a href="https://github.com/koka-lang/madoko/tree/master/support/madoko-local" target="_blank">Madoko Local</a> 这个程序的配合，另外如果想要本地生成 PDF 也需要使用 Madoko Local。</p>
<p>Madoko Local 是用 Node.js 编写的，本机安装完 Node.js 环境后，运行命令完成安装之后就可以使用 <code>madoko-local</code> 命令了：</p>
<pre class="brush: bash; title: ; notranslate">
~# npm install -g madoko-local
</pre>
<p><code>madoko-local</code> 命令使用起来也非常简单：</p>
<pre class="brush: bash; title: ; notranslate">
~# madoko-local -r -l .
listening on           : http://localhost:8080
connecting securely to : https://www.madoko.net
serving files under    : /home/zzm/Documents

---------------------------------------------------------------
access server at       : http://localhost:8080#secret=XXX
---------------------------------------------------------------
</pre>
<p>最后一个参数就是 Madoko 能够访问的本地目录，<code>.</code> 就表示只导出当前的目录。</p>
<p>Madoko Local 启动之后就会输出绑定的端口（默认为 <code>8080</code>）、导出的本地目录路径，最重要的是包含密码的访问地址，浏览器通过这个访问地址就可以打开 Madoko Editor 界面。</p>
<p>Madoko Local 程序的其它参数可以通过 <code>madoko-local -h</code> 命令来查询，另外也可以使用 <code>config.json</code> 配置文件来配置端口等参数，这里我把 Madoko Local 的监听端口改为了 <code>18080</code>，也可以使用 <code>mountdir</code> 来配置导出的本地目录：</p>
<pre class="brush: bash; title: ; notranslate">
~$ cat &gt; ~/.madoko/config.json
{
  &quot;port&quot;:18080,
  &quot;secret&quot;:&quot;XXX&quot;,
  &quot;origin&quot;:&quot;http://XXX&quot;,
  &quot;mountdir&quot;:&quot;/home/zzm/Documents&quot;
}
</pre>
<p>配置文件所在的 <code>.madoko</code> 目录默认位于当前用户的主目录下，这个主目录的路径也可以通过 <code>madoko-local</code> 命令的 <code>--homedir</code> 参数进行自定义。</p>
<p>如果对应目录下存在有效的 <code>config.json</code> 配置文件，后续就可以直接 <code>madoko-local</code> 命令启动程序而不需要加任何参数了。</p>
<h2 id="madoko-local-issue">Madoko Local 问题</h2>
<p>不过我在使用 Madoko Local 时也发现一些问题：</p>
<ol>
<li>通过 <code>madoko-local</code> 命令来指定端口、密码等各种参数可能存在问题；</li>
<li>如果 <code>madoko-local</code> 程序默认绑定了本地 IPv6 的 <code>::1</code> 地址（也就是 <code>localhost</code> 地址），会报 <code>only serving localhost</code> 错误。</li>
</ol>
<p>为此我稍微修改了一下 Madoko Local Node.js 程序源码，生成了 Madoko Local 最新 0.9.4 版本的 patch 文件，有需要的朋友可以从下面任选一个下载：</p>
<ol>
<li><a href="https://pastebin.com/raw/jcSFMVsH" target="_blank">Pastebin 分享链接</a></li>
<li><a href="https://github.com/zohead/madoko/commit/6fd522fca1f7b25bd51a1150ac988bb24d591636.patch" target="_blank">GitHub 提交</a></li>
</ol>
<p>下载了 patch 文件之后，就可以进入 Madoko Local 的安装目录运行命令进行合并了（假设下载保存的文件名是 <code>madoko-local-npm-v0.9.4.patch</code>）：</p>
<pre class="brush: bash; title: ; notranslate">
~# cd /usr/lib/node_modules/
~# patch -p2 madoko-local-npm-v0.9.4.patch
</pre>
<p>上面命令使用的是 Linux 系统下 <code>npm</code> 默认的全局安装路径 <code>/usr/lib/node_modules</code>，其他系统可以使用 <code>npm list -g | head -n 1</code> 命令来确认。</p>
<p>为了方便，我也直接 fork 了 Madoko 的源仓库，还把自己做的其它的一些修改也提交了：</p>
<p><a href="https://github.com/zohead/madoko" target="_blank">https://github.com/zohead/madoko</a></p>
<p>Madoko Local 程序的代码在 <code>support/madoko-local</code> 子目录下供大家参考。</p>
<p>最后祝跨过三年疫情的朋友们都能玩得开心 ^_^。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/madoko-local/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ge.tt文件分享服务CLI及API的问题</title>
		<link>https://zohead.com/archives/ge-tt-cli-api/</link>
		<comments>https://zohead.com/archives/ge-tt-cli-api/#comments</comments>
		<pubDate>Mon, 17 Apr 2017 18:16:13 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[cURL]]></category>
		<category><![CDATA[ge.tt]]></category>
		<category><![CDATA[gett-cli]]></category>
		<category><![CDATA[分享]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1421</guid>
		<description><![CDATA[关于 ge.tt 最近我一直在寻找支持直链形式的文件分享服务： 支持通过 cURL 或者公开 API 上传文件生成分享地址； 用户可以通过 wget、cURL 等程序直接下载文件； 上传者后续可以更新文件并保持分享地址不变； 国内的普通用户可以正常访问下载分享的文件。 如果使用 Dropbox、Google Drive 应该也可以实现前面几个需求，但这两个网盘的最大问题在于国内难以描述的墙，而且上传下载还是稍微有点复杂。 以前我使用过 DriveHQ 服务，免费用户支持通过 FTP 方式上传文件（付费用户还支持通过 WebDAV 上传），上传到 Web 分享目录的文件可以直接通过 HTTP 下 [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2 id="about-gett">关于 ge.tt</h2>
<p>最近我一直在寻找支持直链形式的文件分享服务：</p>
<ul>
<li>支持通过 cURL 或者公开 API 上传文件生成分享地址；</li>
<li>用户可以通过 wget、cURL 等程序直接下载文件；</li>
<li>上传者后续可以更新文件并保持分享地址不变；</li>
<li>国内的普通用户可以正常访问下载分享的文件。</li>
</ul>
<p>如果使用 Dropbox、Google Drive 应该也可以实现前面几个需求，但这两个网盘的最大问题在于国内难以描述的墙，而且上传下载还是稍微有点复杂。</p>
<p>以前我使用过 <a href="https://www.drivehq.com/" target="_blank">DriveHQ</a> 服务，免费用户支持通过 FTP 方式上传文件（付费用户还支持通过 WebDAV 上传），上传到 Web 分享目录的文件可以直接通过 HTTP 下载，这样也算能达到我的要求了，只是自动处理 FTP 上传覆盖要稍微麻烦点。</p>
<p>目前我使用的是 <a href="http://ge.tt/" target="_blank">ge.tt</a> 文件分享服务，相对 DriveHQ 来说其优势在于 ge.tt 开放了 API，而且也有第三方写的 Python / Perl / Java 等各种形式的文件管理工具。虽然 ge.tt 免费帐户只有 2GB 的存储空间，但仍然已经有 500 多万的用户分享了近 5000 万份文件，拿来分享一些小文件或者程序也是很方便的了。</p>
<p>ge.tt 提供了 REST 和 Live API，重点可以关注其 REST API（不过 ge.tt 官网的 API 说明文档暂时无法访问）：</p>
<p><a href="http://ge.tt/developers/overview" target="_blank">http://ge.tt/developers/overview</a></p>
<p>ge.tt 推荐在客户端上使用 gett-cli 工具来管理文件和分享，同样可以参考其官网说明：</p>
<p><a href="http://ge.tt/tools" target="_blank">http://ge.tt/tools</a></p>
<h2 id="gett-cli-problem">gett-cli 的问题</h2>
<p>gett-cli 工具基于 Python 3 实现，其 Bitbucket 项目主页为：</p>
<p><a href="https://bitbucket.org/mickael9/gett-cli/overview" target="_blank">https://bitbucket.org/mickael9/gett-cli/overview</a></p>
<p>查看项目说明显示该工具看起来也很简单，安装之后通过 <code>gett</code> 命令就可以管理了。<code>gett</code> 命令默认提供了上传文件、列表分享、删除分享、删除分享中的文件（一个分享地址支持包含多个文件）、搜索分享或文件的功能。</p>
<p>只是 gett-cli 在一开始登录的时候就碰到了问题，输入用户和密码之后直接登录失败：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads$ gett
Please enter your Ge.tt email: xxx@gmail.com
Please enter your Ge.tt password: 
Traceback (most recent call last):
  File &quot;/usr/local/bin/gett&quot;, line 11, in &lt;module&gt;
    load_entry_point('gett-cli==0.2.3', 'console_scripts', 'gett')()
  File &quot;/usr/local/lib/python3.4/dist-packages/gett_cli-0.2.3-py3.4.egg/gett/uploader.py&quot;, line 96, in entry_point
  File &quot;/usr/local/lib/python3.4/dist-packages/gett_cli-0.2.3-py3.4.egg/gett/uploader.py&quot;, line 198, in main
  File &quot;/usr/local/lib/python3.4/dist-packages/gett_cli-0.2.3-py3.4.egg/gett/gett.py&quot;, line 122, in login_auth
  File &quot;/usr/local/lib/python3.4/dist-packages/gett_cli-0.2.3-py3.4.egg/gett/gett.py&quot;, line 103, in _load
KeyError: 'accesstoken'
</pre>
<p>我在参考 ge.tt 的 REST API 说明之后使用 cURL 模拟登录请求，ge.tt 服务器也会返回 <code>Wrong credentials</code> 错误：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads$ curl -i -X POST --data '{&quot;email&quot;:&quot;xxx@gmail.com&quot;,&quot;password&quot;:&quot;test-pass&quot;}' http://
open.ge.tt/1/users/login
HTTP/1.1 403 Forbidden
Content-Type: application/json; charset=utf-8
Date: Wed, 05 Apr 2017 18:11:11 GMT
ETag: W/&quot;71-xxx+xxx&quot;
set-cookie: sails.sid=s%3Axxx-xxx%2FkOnG%2Bxxx%2Bxxx; Path=/; HttpOnly
Vary: X-HTTP-Method-Override, Accept-Encoding
X-Powered-By: Sails &lt;sailsjs.org&gt;
Content-Length: 113
Connection: keep-alive

{&quot;message&quot;:&quot;Wrong credentials&quot;,&quot;body&quot;:{&quot;err&quot;:&quot;Missing credentials&quot;},&quot;login&quot;:0,&quot;reason&quot;:{&quot;error&quot;:&quot;access denied&quot;}}
</pre>
<p>经过调试我才发现 ge.tt 的 REST API 请求中必须增加 <code>Content-Type: application/json;charset=UTF-8</code> 头才能正常返回数据。</p>
<p>修改 gett-cli 工具 Python 代码之后，现在 <code>gett</code> 命令可以正常返回用户使用的空间了：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads$ gett
Please enter your Ge.tt email: xxx@gmail.com
Please enter your Ge.tt password: 
Do you wish to store the session token? (y/n): y
Storage used: 232.81 KB out of 2.00 GB (0.0%)
</pre>
<p>登录成功之后 gett-cli 工具默认会将 Refresh Token 保存在用户主目录的 <code>.gett-token</code> 文件中：</p>
<pre class="brush: bash; title: ; notranslate">
root@ee9055d6b11f:~# cat .gett-token
r.0.user-25YKSbxxxxxxx-..xxxxxxx
</pre>
<p>这样后面再使用 gett-cli 工具就不用重复输入用户名和密码登录了。</p>
<h2 id="mod-gett-cli">修改 gett-cli</h2>
<p>另外我还发现 gett-cli 工具存在由于缺少文件大小参数导致上传的文件不正确等问题，为此我专门修改了 gett-cli 代码以解决登录和上传的问题。由于生成的 <code>gett-cli.patch</code> 补丁文件内容有点长这里就不贴出来了，有需要的话可以从下面的 Pastebin 地址下载：</p>
<p><a href="http://pastebin.com/raw/0siCtqkW" target="_blank">http://pastebin.com/raw/0siCtqkW</a></p>
<p>有动手能力的朋友们可以自行检出 Bitbucket 上的 gett-cli 版本库进行修改编译安装。</p>
<p>如果嫌编译麻烦也可以直接修改替换已经安装好的 gett-cli 工具 egg 文件，以我使用的 Ubuntu 系统上的 Python 3.4 为例，大概步骤如下（中间直接使用 <code>patch</code> 命令打补丁）：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads$ cp /usr/local/lib/python3.4/dist-packages/gett_cli-0.2.3-py3.4.egg .
(trusty)zzm@localhost:~/Downloads$ sudo unzip gett_cli-0.2.3-py3.4.egg &amp;&amp; rm -f gett_cli-0.2.3-py3.4.egg
Archive:  gett_cli-0.2.3-py3.4.egg
  inflating: EGG-INFO/zip-safe
  inflating: EGG-INFO/top_level.txt
  inflating: EGG-INFO/entry_points.txt
  inflating: EGG-INFO/dependency_links.txt
  inflating: EGG-INFO/SOURCES.txt
  inflating: EGG-INFO/PKG-INFO
  inflating: gett/uploader.py
  inflating: gett/gett.py
  inflating: gett/__init__.py
  inflating: gett/__pycache__/uploader.cpython-34.pyc
  inflating: gett/__pycache__/gett.cpython-34.pyc
  inflating: gett/__pycache__/__init__.cpython-34.pyc
(trusty)zzm@localhost:~/Downloads$ sudo patch -p2 &lt; gett-cli.patch
(trusty)zzm@localhost:~/Downloads$ sudo py3compile gett/gett.py gett/uploader.py
(trusty)zzm@localhost:~/Downloads$ sudo zip -r gett_cli-0.2.3-py3.4.egg EGG-INFO gett
  adding: EGG-INFO/ (stored 0%)
  adding: EGG-INFO/PKG-INFO (deflated 26%)
  adding: EGG-INFO/entry_points.txt (deflated 2%)
  adding: EGG-INFO/top_level.txt (stored 0%)
  adding: EGG-INFO/SOURCES.txt (deflated 48%)
  adding: EGG-INFO/dependency_links.txt (stored 0%)
  adding: EGG-INFO/zip-safe (stored 0%)
  adding: gett/ (stored 0%)
  adding: gett/uploader.py (deflated 68%)
  adding: gett/__pycache__/ (stored 0%)
  adding: gett/__pycache__/__init__.cpython-34.pyc (deflated 21%)
  adding: gett/__pycache__/gett.cpython-34.pyc (deflated 57%)
  adding: gett/__pycache__/uploader.cpython-34.pyc (deflated 48%)
  adding: gett/__init__.py (stored 0%)
  adding: gett/gett.py (deflated 71%)
(trusty)zzm@localhost:~/Downloads$ sudo mv gett_cli-0.2.3-py3.4.egg /usr/local/lib/python3.4/dist-packages/gett_cli-0.2.3-py3.4.egg
</pre>
<p>当然如果你不想在系统中安装 gett-cli 也可以直接下载使用我修改好的 gett 工具，解压缩之后运行其中的 <code>uploader.py</code> 程序即可（需要 Python 3 环境）：</p>
<p><a href="https://zohead.com/downloads/gett-cli-0.2.3.tar.gz">https://zohead.com/downloads/gett-cli-0.2.3.tar.gz</a></p>
<h2 id="use-gett-cli">使用 gett-cli 工具</h2>
<p>登录之后使用 gett-cli 工具上传文件非常简单，默认上传文件时都是创建新的分享，上传多个文件则直接附加多个文件参数：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads$ gett gett-cli-0.2.3.tar.gz
Creating file(s)...
--------------------------------------------------------------------------------
Share: Untitled (1 file(s)) [http://ge.tt/8D95lij2]
--------------------------------------------------------------------------------
 - gett-cli-0.2.3.tar.gz           6.54 KB  http://ge.tt/8D95lij2/v/0  remote

gett-cli-0.2.3.tar.gz  (  1/1) [########################################] 100 %

Storage used: 194.00  B out of 2.00 GB (0.0%)
</pre>
<p>上面结果中的 <code>http://ge.tt/8D95lij2</code> 就是新创建的文件分享地址，<code>http://ge.tt/8D95lij2/v/0</code> 则是该分享中某个文件的地址（<code>0</code> 是分享下的文件 ID，如果上传多个文件就会有 <code>v/1</code>、<code>v/2</code> 之类的文件地址）。</p>
<p>如果需要删除创建的分享可以运行：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads$ gett --delete http://ge.tt/8D95lij2
Deleted share: Untitled [http://ge.tt/8D95lij2]

Storage used: 6.74 KB out of 2.00 GB (0.0%)
</pre>
<p>用户如果需要下载分享中的文件那就更方便了，不需要 gett-cli 工具，直接一条 cURL 命令下载即可（替换命令中的分享地址和文件 ID）：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads$ curl -k -o gett-cli-0.2.3.tar.gz -L -e &quot;http://ge.tt/8D95lij2&quot; &quot;http://api.ge.tt/1/files/8D95lij2/0/blob?download&quot;
</pre>
<h2 id="postscript">后记</h2>
<p>ge.tt 文件分享服务还存在一些小问题，比如某个分享中已经上传的文件目前还无法直接以相同的文件 ID 进行覆盖替换（例如上面例子中的 <code>http://ge.tt/8D95lij2/v/0</code>），只能删除文件再上传新文件到该分享，新上传的文件的 ID 只能递增，不能保持原来的文件 ID（例如删除之后新上传的文件 ID 可能是 <code>http://ge.tt/8D95lij2/v/3</code>）。</p>
<p>结合这段时间我的使用感觉来看，ge.tt 用于分享小文件还算比较方便的，很适合一些需要通过工具或命令自动上传下载文件的场合。最后如果文章中有任何问题，还请提出指正，祝大家玩的开心。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/ge-tt-cli-api/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Win10 Bash下使用KeePass KeeAgent插件</title>
		<link>https://zohead.com/archives/win10-bash-keeagent/</link>
		<comments>https://zohead.com/archives/win10-bash-keeagent/#comments</comments>
		<pubDate>Mon, 05 Dec 2016 16:40:32 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[KeeAgent]]></category>
		<category><![CDATA[KeePass]]></category>
		<category><![CDATA[MSYS]]></category>
		<category><![CDATA[msysGit]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[Win10]]></category>
		<category><![CDATA[WSL]]></category>
		<category><![CDATA[证书]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1315</guid>
		<description><![CDATA[Win10 Bash 使用 KeeAgent 问题 出于管理不同服务器以及自己几个 VPS 的需要，我都会把这些 SSH 密钥保存到自己的 KeePass 密码数据库中，KeePass 软件安装了 KeeAgent 插件之后，可以在用户需要登录服务器时方便地自动加载 SSH 密钥。KeeAgent 同时支持 PuTTY 和 OpenSSH 格式的私钥，而且支持 Windows / Linux / Mac 系统。我在平时使用中无论用 Windows 下的 PuTTY / SecureCRT / XShell 软件还是 Linux 下用 ssh 命令都能愉快的自动加载 KeeAgent 保存的 S [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2 id="win10-bash-使用-keeagent-问题">Win10 Bash 使用 KeeAgent 问题</h2>
<p>出于管理不同服务器以及自己几个 VPS 的需要，我都会把这些 SSH 密钥保存到自己的 KeePass 密码数据库中，KeePass 软件安装了 <a href="http://lechnology.com/software/keeagent/">KeeAgent</a> 插件之后，可以在用户需要登录服务器时方便地自动加载 SSH 密钥。KeeAgent 同时支持 PuTTY 和 OpenSSH 格式的私钥，而且支持 Windows / Linux / Mac 系统。我在平时使用中无论用 Windows 下的 PuTTY / SecureCRT / XShell 软件还是 Linux 下用 ssh 命令都能愉快的自动加载 KeeAgent 保存的 SSH 证书，这里也强烈建议各位将 SSH 密钥用 KeeAgent 插件保存到 KeePass 密码库中。</p>
<p>不过自从将工作的电脑系统升级到 Windows 10 之后，虽然我使用 Win10 系统自带的 Bash shell 的场合也越来越多了（原来的 MSYS 和 Cygwin 环境基本很少开启了），但也发现 Win10 Bash 自带的 ssh 命令却不支持 KeeAgent 插件，仍然需要手工选择私钥文件或者输入密码登录服务器。</p>
<p>KeeAgent 在 Linux / Mac 系统下是支持原生的 SSH agent 的，SSH agent 使用的是基于 Unix socket 文件工作方式，也因此 Linux / Mac 系统下的 ssh 命令直接就能自动加载 KeeAgent 保存的密钥。</p>
<p>虽然 Win10 WSL（Windows Subsystem for Linux）子系统内部是支持 Unix socket 文件的，但 WSL 子系统外的 Windows 版本 KeeAgent 插件要想支持 WSL 内部的 socket 文件就不太容易了，还需要通过别的方法来绕过这个限制。</p>
<h2 id="msysgit-to-unix-socket-代理">msysGit to Unix socket 代理</h2>
<p>看了 KeePass 的 KeeAgent 插件选项可以看到该插件是支持 Cygwin 和 <a href="https://github.com/msysgit/msysgit">msysGit</a>（现在已更名为 <a href="https://git-for-windows.github.io/">Git for Windows</a>）兼容的 socket 文件的，这样原来的 Cygwin 和 MSYS 用户也可以自动加载 KeeAgent 中保存的密钥，例如我的 KeeAgent 配置如下：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737371494/keeagent-socket.png" alt="KeeAgent 的 msysGit socket 选项" title="KeeAgent 的 msysGit socket 选项"></p>
<p>虽然 KeeAgent 不能直接支持 Win10 WSL 子系统内的 Unix socket 文件，但已经有人写了个 msysGit socket to Unix socket 的 Python 代理程序，借助此 <a href="https://gist.github.com/FlorinAsavoaie/8c2b6cb00f786c2caab65b1a51f4e847"><strong>msysgit2unix-socket.py</strong></a> 代理程序就可以让 Win10 Bash shell 通过 SSH agent 加载 KeeAgent 中的密钥咯。</p>
<p>该代理程序启动时会创建一个用于 SSH 认证的 Unix socket 文件，然后 TCP 连接到本地 KeeAgent 插件创建的 msysGit socket 文件，收到 ssh、scp 等命令的认证请求后将数据转发到 KeeAgent 插件，最后将结果返回到 Unix socket 文件。代理程序的工作机制大概如我粗画的这张图：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442857/msysgit2unix-socket.png" alt="msysGit to Unix socket 代理工作机制" title="msysGit to Unix socket 代理工作机制"></p>
<p>不过我在使用中还是发现该代理程序存在一点小问题：</p>
<p>第一次 SSH 认证可以通过 KeeAgent 插件返回成功，后续再有新的认证请求时却会一直卡住。调试之后发现前面的认证请求完成之后，虽然 ssh 命令至 Unix socket 文件的连接关闭了，但是代理程序至 msysGit socket 文件的连接却一直保持着未关闭，这样新的认证请求将无法正常从 KeeAgent 插件获取有效的证书数据。</p>
<p>为了解决这个问题，我 fork 了这个 msysGit to Unix socket 代理程序，并做了小改动，也放到了 Gist 上：</p>
<p><a href="https://gist.github.com/zohead/b3cbb709fdfd2c0da31bff1b3f436af7">https://gist.github.com/zohead/b3cbb709fdfd2c0da31bff1b3f436af7</a></p>
<h2 id="使用-socket-代理程序">使用 socket 代理程序</h2>
<p>首先下载 <a href="https://gist.github.com/zohead/b3cbb709fdfd2c0da31bff1b3f436af7/raw/7afb94eeb531fc10f8168ad828e32103268d76b7/msysgit2unix-socket.py"><strong>msysgit2unix-socket.py</strong></a> 代理程序，可以直接放到 Win10 Bash shell 用户主目录中，然后编辑 <code>~/.bashrc</code> 文件增加下面这几行：</p>
<pre class="brush: bash; title: ; notranslate">
export SSH_AUTH_SOCK=&quot;/tmp/.ssh-auth-sock&quot;
if [ -s /mnt/d/msys/keeagent.sock ]; then
	~/msysgit2unix-socket.py /mnt/d/msys/keeagent.sock:$SSH_AUTH_SOCK 2&gt;/dev/null
	trap &quot;~/msysgit2unix-socket-exit.sh $$&quot; EXIT
fi
</pre>
<p>这样运行 bash 命令后会自动启动该程序，<strong>msysgit2unix-socket.py</strong> 程序启动之后会自动转为后台守护进程，并在 <code>/tmp</code> 目录（实际在 Windows 系统的 <code>C:\Users\user\AppData\Local\lxss\rootfs\tmp</code> 目录下）下生成兼容 ssh 命令的 socket 文件，而且如果开启多个 Bash 会话也不会影响，只会在后台保持运行一个 <strong>msysgit2unix-socket.py</strong> 代理程序。</p>
<p>上面内容第二行的 <code>/mnt/d/msys/keeagent.sock</code> 路径就是 KeeAgent 选项中的 <strong>Create msysGit compatible socket file</strong> 文件路径，请根据情况自行修改。</p>
<p>我增加的一行 trap 退出操作是为了能在最后一个 Win10 Bash 会话退出之时能执行自定义的清理脚本以删除 <strong>msysgit2unix-socket.py</strong> 程序产生的临时文件，不然下次再开启 Bash 运行 <strong>msysgit2unix-socket.py</strong> 程序时会因为已经存在临时的 socket 及 PID 文件导致程序退出。</p>
<p>我增加的 <strong>msysgit2unix-socket-exit.sh</strong> 脚本程序也非常简单：</p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/sh
BASHPIDS=`pidof bash -o %PPID -o $1`
[ &quot;x$BASHPIDS&quot; != &quot;x&quot; ] &amp;&amp; exit 0
rm -f /tmp/msysgit2unix-socket.pid /tmp/.ssh-auth-sock
</pre>
<p>这里使用 pidof 命令判断当前退出的是不是最后一个 Win10 Bash 会话（通过参数忽略了父 bash 进程和脚本程序自身进程），如果是最后一个 Bash 会话则删除 <strong>msysgit2unix-socket.py</strong> 程序产生的临时文件。</p>
<p>当然你也可以去掉增加的清理脚本，直接在 <code>~/.bashrc</code> 文件中判断 <strong>msysgit2unix-socket.py</strong> 程序运行状态并删除之前产生的临时文件：</p>
<pre class="brush: bash; title: ; notranslate">
export SSH_AUTH_SOCK=&quot;/tmp/.ssh-auth-sock&quot;
if [ -s /mnt/d/msys/keeagent.sock ]; then
	pgrep -f msysgit2unix-socket.py &gt;/dev/null 2&gt;&amp;1
	if [ $? -ne 0 ]; then
		rm -f /tmp/msysgit2unix-socket.pid /tmp/.ssh-auth-sock
		~/msysgit2unix-socket.py /mnt/d/msys/keeagent.sock:$SSH_AUTH_SOCK 2&gt;/dev/null
	fi
fi
</pre>
<p>这样修改之后就能在 Win10 Bash 里畅快地使用 ssh、scp 等命令通过 KeeAgent 插件自动登录服务器进行管理咯，祝大家在这个看起来不太冷的 12 月玩得开心 ^_^。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/win10-bash-keeagent/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Chromebook上使用Zed进行远程编辑</title>
		<link>https://zohead.com/archives/chromebook-zed-remote/</link>
		<comments>https://zohead.com/archives/chromebook-zed-remote/#comments</comments>
		<pubDate>Mon, 24 Oct 2016 17:35:38 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Chrome]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[Chromebook]]></category>
		<category><![CDATA[MDwiki]]></category>
		<category><![CDATA[Web服务器]]></category>
		<category><![CDATA[Zed]]></category>
		<category><![CDATA[zedd]]></category>
		<category><![CDATA[zedrem]]></category>
		<category><![CDATA[编辑器]]></category>
		<category><![CDATA[远程]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1287</guid>
		<description><![CDATA[之前我写过一篇文章介绍 Chromebook 上比较强大的 Zed 编辑器 的上手体验，目前主要用于编辑自己的 MDwiki 知识库 目录。不过本地文件编辑完之后需要用 BTSync 之类的工具同步到 VPS 上，因此还是想把 Zed 的远程编辑功能用起来，而且配合 Zed 自带的 Web Server 功能还能直接本地查看 MDwiki 知识库。 Zed 目前支持 zedrem 和 zedd 这两种远程编辑方式，下面分别介绍一下另，另外也说明了如何使用 Zed 自带的 Web Server。 zedrem 远程编辑 zedrem 是用 Go 语言编写的工具，按照 Zed 官网的介绍一条命令就 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>之前我写过一篇文章介绍 Chromebook 上比较强大的 <a href="https://zohead.com/archives/chromebook-zed/">Zed 编辑器</a> 的上手体验，目前主要用于编辑自己的 <a href="https://zohead.com/archives/wikitten-mdwiki/">MDwiki 知识库</a> 目录。不过本地文件编辑完之后需要用 BTSync 之类的工具同步到 VPS 上，因此还是想把 Zed 的远程编辑功能用起来，而且配合 Zed 自带的 Web Server 功能还能直接本地查看 MDwiki 知识库。</p>
<p>Zed 目前支持 <a href="http://zedapp.org/features/edit-remote-files/">zedrem</a> 和 <a href="http://zedapp.org/zedd">zedd</a> 这两种远程编辑方式，下面分别介绍一下另，另外也说明了如何使用 Zed 自带的 Web Server。</p>
<h2 id="zedrem-远程编辑">zedrem 远程编辑</h2>
<p>zedrem 是用 Go 语言编写的工具，按照 Zed 官网的介绍一条命令就可以安装成功，默认情况下在 VPS 上运行 zedrem 命令之后会自动连接 Zed 服务器注册并返回远程编辑地址，Chrome 应用后续的列举文件、打开文件、保存等操作都会通过 Zed 服务器进行中转，这样可以直接绕过防火墙之类的限制。</p>
<p>zedrem 的使用也非常简单，在 VPS 上运行 zedrem 跟上需要编辑的目录路径（不加目录参数则是直接编辑当前目录）：</p>
<pre class="brush: bash; title: ; notranslate">
root@zoserver:~# ./zedrem wiki-dir
In the Zed application copy and paste following URL to edit:

https://remote.zedapp.org:443/fs/c1e91639eede09e0be43a4cf3f22d036

Press Ctrl-c to quit.
</pre>
<p>看到上面 zedrem 命令给出的地址之后，就可以在 Zed App 的 <strong>选择项目</strong> 界面中选 <strong>Remote Folder</strong>，在出来的 <strong>Open Zedrem Folder</strong> 界面中直接输入上面的地址并点击 <strong>Open</strong> 就可以远程编辑 VPS 上的目录了。</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442981/zedrem-folder.jpg" alt="打开 Zedrem 文件夹" title="打开 Zedrem 文件夹"></p>
<p>如果你对 zedrem 默认通过 Zed 服务器进行中转的工作机制不放心的话，也可以让 Zed Chrome 应用与 VPS 服务器直接连接，首先在 VPS 上让 zedrem 作为转发服务器运行：</p>
<pre class="brush: bash; title: ; notranslate">
root@zoserver:~# ./zedrem --server
Zedrem server now running on ws://0.0.0.0:7337
</pre>
<p>然后另开一个终端再运行 zedrem 命令并增加 <code>-u</code> 参数指定转发服务器地址，这里可以直接填 VPS 服务器的 IP 地址或者域名：</p>
<pre class="brush: bash; title: ; notranslate">
root@zoserver:~# ./zedrem -u ws://xxx.xxx.xxx.xxx:7337 wiki-dir
In the Zed application copy and paste following URL to edit:

http://xxx.xxx.xxx.xxx:7337/fs/7d6f781a002875f0a9fb57e095f3ddec

Press Ctrl-c to quit.
</pre>
<p>刚才运行 zedrem 转发服务器的终端上也会显示新的客户端已经连接：</p>
<pre class="prettyprint"><code class=" hljs ">Client 7d6f781a002875f0a9fb57e095f3ddec connected</code></pre>
<p>同样 Zed Chrome 应用也只需要输入上面 zedrem 命令给出的地址就可以进行远程编辑操作了，实际使用中也可以直接把 zedrem 的转发服务器模式放在后台运行的。</p>
<p>当然如果你的 Chromebook 和 VPS 的连接速度比较慢（比如在移动宽带网络下连接我的美国 VPS 可能就会比较慢），也可以在别的主机（例如使用另一台香港 VPS）上运行 zedrem 的转发服务器，并通过 <code>-u</code> 参数指定通过新的主机进行转发，这样也可以加快远程编辑的响应速度。</p>
<h2 id="zedd-远程编辑">zedd 远程编辑</h2>
<h3 id="vps-上安装-zedd">VPS 上安装 zedd</h3>
<p>一般使用 zedrem 就能满足普通用户的基本远程编辑需求了，但如果你想实现远程编辑文件之后运行特定的命令等高级的需求（例如我修改的 MDwiki 系统在新增 Wiki 项目之后需要运行命令生成刷新 Wiki 目录文件），zedrem 对这种情况就无能无力了。</p>
<p>不过还好 Zed 也为我们提供了 Zedd 后台程序，Zedd 支持远程执行命令，而且导出远程文件系统的方式也更加高效，Zedd 远程目录也可以在 Chrome 应用的历史项目中直接显示，比较适合 Chromebook 用户。</p>
<p>Zedd 程序是用 Node.js 编写的，安装步骤相对 zedrem 会稍微复杂一点，其详细说明也可以参考 Zed 官方网站，首先 VPS 上需要安装 Node.js 环境，我的 VPS 使用的是 Debian 7 系统，可以通过下面的命令安装（假设你有 VPS 的 root 访问权限，同时也会自动安装必需的 Node.js 的 npm 包管理工具）：</p>
<pre class="brush: bash; title: ; notranslate">
root@zoserver:~# curl -sL https://deb.nodesource.com/setup_4.x | bash -
root@zoserver:~# apt-get install -y nodejs
</pre>
<p>安装完成之后就可以通过 npm 命令安装 Zedd 程序：</p>
<pre class="brush: bash; title: ; notranslate">
root@zoserver:~# npm install -g zedd
</pre>
<h3 id="使用-zedd">使用 zedd</h3>
<p>Zedd 安装好之后可以先看看其运行帮助信息：</p>
<pre class="brush: bash; title: ; notranslate">
root@zoserver:~# zedd --help
Zedd is the Zed daemon used to edit files either locally or remotely using Zed.
Options can be passed in either as environment variables, JSON config in
~/.zeddrc or as command line arguments prefixed with '--':

   user:       username to use for authentication (default: none)
   pass:       password to use for authentication (default: none)
   remote:     bind to 0.0.0.0, requires auth, and disables
               enable-run by default
   port:       port to bind to (default: 7337)
   root:       root directory to expose (default: $HOME)
   enable-run: enable running of external programs in remote mode
   tls-key:    path to TLS key file (enables https)
   tls-cert:   path to TLS certificate file (enables https)
</pre>
<p>默认如果运行 zedd 程序不加任何参数会导出用户的主目录，而且默认也只有 <code>localhost</code> 本地才能访问，导出地址为：</p>
<pre class="prettyprint"><code class=" hljs cs">http:<span class="hljs-comment">//127.0.0.1:7337/</span></code></pre>
<p>当然对于我们要在 Chromebook 上远程编辑 VPS 上的文件就不能这么做了，根据情况可以在 VPS 服务器上运行 zedd 程序时：</p>
<ul>
<li>增加 <code>--remote</code> 参数可以支持外部连接；</li>
<li>增加 <code>--root</code> 参数指定导出的根目录（默认为 <code>$HOME</code> 用户主目录）；</li>
<li>增加 <code>--enable-run</code> 参数可以允许执行外部命令；</li>
<li>另外可以指定 <code>--user</code> 和 <code>--pass</code> 参数配置访问的用户名和密码。</li>
</ul>
<blockquote>
<p><strong>提示</strong></p>
<p>为了 VPS 上文件的安全性考虑，如果你有可用的 SSL 证书的话建议使用 <code>--tls-key</code> 和 <code>--tls-cert</code> 参数，这样可以使用 https 模式替代默认的 http 模式。</p>
</blockquote>
<p>例如我的 VPS 上可以这样运行 zedd 程序：</p>
<pre class="brush: bash; title: ; notranslate">
root@zoserver:~# zedd --remote --enable-run --root wiki-dir --user zeduser --pass zedpass
Zedd is now listening on http://0.0.0.0:7337
Exposed filesystem : /home/root/wiki-dir
Mode               : remote (externally accessible)
Command execution  : enabled
Authentication     : enabled
</pre>
<p>Chromebook 上要使用 Zedd 远程文件夹也比较简单，在选择项目界面中点击 <strong>Zedd Folder</strong> 进入 <strong>Open Zedd Folder</strong> 界面，该界面中就可以输入远程 Zedd 导出地址和用户名、密码：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442977/zedd-folder.jpg" alt="打开 Zedd 文件夹" title="打开 Zedd 文件夹"></p>
<p>确认之后点击 <strong>Connect</strong> 按钮连接正常的话就可以看到远程的目录树，接着就可以任意选择下面的子目录进行编辑了。</p>
<h3 id="zedd-的外部命令支持">zedd 的外部命令支持</h3>
<p>对于打开的远程 Zedd 文件夹，Zed Chrome 应用是支持运行外部命令的，首先使用 Zed 命令快捷键（默认为 <kbd>Ctrl-Shift-.</kbd>，我的 Chromebook 上改成了 <kbd>Ctrl-Shift-C</kbd>）或者点击 <strong>Tools</strong> -&gt; <strong>Run Command</strong> 菜单项，在弹出的 <strong>Enter command</strong> 中输入 external，Zed 会自动搜索，默认匹配到的两个就是远程执行外部命令用的：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442973/zedd-command.jpg" alt="Zed 执行外部命令" title="Zed 执行外部命令"></p>
<p>一般使用第一个 <strong>Tools:External:Insert Command Output</strong> 命令，选择该命令会让你输入需要在 VPS 主机上执行的命令及参数，并将远程命令的执行结果插入到当前所打开文件的光标位置。</p>
<p>如果你想要执行的命令有输出又担心影响正在打开的文件（Zed 是编辑区内容有改动就实时保存的），那可以直接打开 Zed 保留的 <code>zed::start</code> 只读文件并执行 Insert Command Output 操作，这样既可以看到远程命令的输出结果又不会改动其它文件的内容。</p>
<p>例如我打开远程 MDwiki 目录之后进行编辑之后需要进行刷新 Wiki 目录文件的操作，这就需要执行我写的 <code>generate-index.sh</code> 脚本。我就可以切换到 <code>zed::start</code> 文件并执行 <code>generate-index.sh</code> 远程命令并查看输出结果。当然如果你不关心输出结果，也可以不管当前打开的是什么文件，直接执行命令并附加 <code>&gt;/dev/null</code> 以忽略输出：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442975/zedd-external-program.jpg" alt="忽略外部命令输出" title="忽略外部命令输出"></p>
<p>这样配置之后我就能实现不经远程登录或同步 VPS 就能直接远程编辑 MDwiki 知识库的需求了，而且编辑完成之后直接在 Chromebook 上执行外部命令就能更新 Wiki 目录。</p>
<h2 id="使用-zed-自带-web-server">使用 Zed 自带 Web Server</h2>
<p>由于我的 VPS 上的 MDwiki 目录同时也开启了 BTSync 同步，需要时也可以将远程的 Wiki 目录同步到本地，同步到 Chromebook 之后也可以使用 Zed 自带的 Web Server 功能本地查看 MDwiki 知识库。</p>
<p>Zed 打开 MDwiki 目录之后同样使用命令快捷键运行命令，输入 static server 进行搜索，就会匹配 Zed 自带 Web Server 的几个命令：</p>
<ul>
<li>Tools:Static Server:Stop</li>
<li>Tools:Static Server:Start</li>
<li>Tools:Static Server:Generate Full Site</li>
</ul>
<p>选择第二个 <code>Tools:Static Server:Start</code> 命令启动 Zed 自带静态 Web Server，Zed 会自动打开新 Chrome 标签页显示 MDwiki 知识库，如果当前打开的项目目录下没有 <code>index.html</code> 或者 <code>default.html</code> 等文件则会自动显示文件列表。不再需要查看 Wiki 知识库时选择 <code>Tools:Static Server:Stop</code> 命令停止 Web Server 即可。</p>
<p>不过我在使用 Zed 自带 Web Server 时发现其存在不支持中文等非 ANSI 路径名以及包含特殊符号的文件名的问题，默认的文件列表页显示中文文件名同样不正确，因此我检出了 Zed 官方的 staticserver 包进行了修正，并在 GitHub 上新创建了一个仓库：</p>
<p><a href="https://github.com/zohead/staticserver">https://github.com/zohead/staticserver</a></p>
<p>测试完成之后我也为官方 staticserver 仓库创建了新的 Pull Request，只是目前还没有得到回应。</p>
<p>有使用 Zed 自带 Web Server 需求的朋友可以检出上面我的 staticserver 代码，并替换到 Zed Chrome 应用的 staticserver 包路径：</p>
<pre class="prettyprint"><code class=" hljs ruby">~<span class="hljs-regexp">/Extensions/pfmjnmeipppmcebplngmhfkleiinphhp</span><span class="hljs-regexp">/1.1.0_0/config</span><span class="hljs-regexp">/packages/gh</span><span class="hljs-regexp">/zedapp/staticserver</span></code></pre>
<p>替换之后重新启动 Zed 应用再运行启动 Web Server 的命令应该就可以解决不能正常访问中文路径的问题了。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/chromebook-zed-remote/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>适合Chromebook的Zed编辑器上手</title>
		<link>https://zohead.com/archives/chromebook-zed/</link>
		<comments>https://zohead.com/archives/chromebook-zed/#comments</comments>
		<pubDate>Sun, 19 Jun 2016 16:05:21 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Chrome]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[Chromebook]]></category>
		<category><![CDATA[Markdown]]></category>
		<category><![CDATA[Sublime Text]]></category>
		<category><![CDATA[Zed]]></category>
		<category><![CDATA[ZPM]]></category>
		<category><![CDATA[命令]]></category>
		<category><![CDATA[快捷键]]></category>
		<category><![CDATA[编辑器]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1242</guid>
		<description><![CDATA[Zed 编辑器 对于很多 Chromebook 用户来说，缺少比较好用的本地编辑器是一个比较普遍的困扰，特别是我这样的程序员用户对于编辑器的要求就更多一些了。有一些同学是直接通过 crouton 安装 Sublime Text、GitHub Atom 等编辑器或者各种 IDE 软件来解决。 之前我介绍过 Caret 这款 Chrome 应用商店里的文本编辑器 App，如果只是用来编辑纯文本之类的文件那 Caret 是能胜任的，如果你需要额外的一些扩展功能，那只能另寻他法了。我还尝试过第三方开发者移植的 Chrome 版 Adobe Brackets 编辑器（和 Atom 有点类似），不过使用起 [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2 id="zed-编辑器">Zed 编辑器</h2>
<p>对于很多 Chromebook 用户来说，缺少比较好用的本地编辑器是一个比较普遍的困扰，特别是我这样的程序员用户对于编辑器的要求就更多一些了。有一些同学是直接通过 crouton 安装 Sublime Text、GitHub Atom 等编辑器或者各种 IDE 软件来解决。</p>
<p>之前我介绍过 <a href="https://zohead.com/archives/chromebook-caret/">Caret</a> 这款 Chrome 应用商店里的文本编辑器 App，如果只是用来编辑纯文本之类的文件那 Caret 是能胜任的，如果你需要额外的一些扩展功能，那只能另寻他法了。我还尝试过第三方开发者移植的 Chrome 版 <a href="http://brackets.io/">Adobe Brackets</a> 编辑器（和 Atom 有点类似），不过使用起来还是存在各种问题就作罢了。</p>
<p>还好后来我还是在 Chrome 商店里找到了今天要介绍的 Zed 编辑器，Zed 的使用方式和 Sublime Text 比较类似，其主要功能可以参考官网：</p>
<p><a href="http://zedapp.org/">http://zedapp.org/</a></p>
<p>Zed 编辑器其实是有 Chrome App 版本和 Windows、Mac、Linux 等系统下的 Standalone 版本的，Standalone 版本的功能比 Chrome App 版本要更多（例如可以直接运行本地命令等）。</p>
<p>对于 Chromebook 用户来说虽然默认只能用功能相对少的 Chrome App 版本，但相应的也能得到 Chrome 版本的带来的好处：</p>
<ul>
<li>一处安装多处直接运行；</li>
<li>自动通过 Google Drive 同步 Zed Chrome App 配置；</li>
<li>Zed Chrome App 默认自动从 Chrome 商店更新。</li>
</ul>
<p>而且开发者考虑到日益增长的 Chromebook 用户的需求目前也在不断更新 Chrome App 版本，我们可以从 <a href="https://chrome.google.com/webstore/detail/pfmjnmeipppmcebplngmhfkleiinphhp">Chrome 商店</a> 直接安装。</p>
<h2 id="初步使用">初步使用</h2>
<p>Zed 编辑器启动时会提示你使用哪种界面风格，默认是不带目录树甚至隐藏了菜单栏的风格，打开编辑器会显示选择项目界面：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442978/zed-initial.png" alt="Zed选择项目界面" title="Zed选择项目界面"></p>
<p>点击“Local Folder” 或者“Local File(s)”就可以打开本地的文件夹或文件编辑了，“Zedd Folder”和“Remote Folder”是两种直接编辑远程文件的方式后面单独再做介绍，另外 Zed 还直接支持打开 GitHub 版本库和 Dropbox 这点也比较方便。</p>
<p>打开具体的文件会直接显示文件内容，第一次打开某个项目文件夹的话则默认显示只读的 <code>zed::start</code> 内置使用介绍文件以帮助用户熟悉编辑器的各种快捷键之类的。</p>
<p>Zed 的文件编辑和 Sublime Text 这种类似是直接实时保存用户输入的结果，不需要单独的关闭保存操作。</p>
<p>通常的文件操作可以使用键盘快捷键或者 File 菜单完成：</p>
<ul>
<li><kbd>Ctrl-N</kbd> 键新建文件；</li>
<li><kbd>Ctrl-E</kbd> 键打开文件；</li>
<li><kbd>Alt-T</kbd> 键显示目录树；</li>
<li><kbd>F5</kbd> 键刷新文件夹中的文件列表。</li>
</ul>
<p>新建文件或者打开文件时会显示命令窗口，输入不存在的文件名就可以实现新建文件（当然也就可以直接在命令窗口中输入子目录路径）。</p>
<p>如果你在编辑的过程中需要打开另一个项目文件夹或者文件，那可以按 <kbd>Ctrl-Shift-o</kbd> 键显示最开始的选择项目界面，这样就不用重启 Zed App 了。</p>
<h2 id="zed-配置文件">Zed 配置文件</h2>
<p>这里先说 Zed 的配置文件是因为最常用的调出 Zed 命令窗口的默认快捷键 <kbd>Ctrl-.</kbd> 或 <kbd>Ctrl-Shift-.</kbd> 在 Chromebook 上是不起作用的，当然你也可以鼠标点击 Tools 菜单下的 Run Command 菜单项来实现，不过为了使用方便，我们还是先修改 Zed 配置文件来定制命令快捷键。</p>
<p>打开 Zed 编辑器开始显示的选择项目界面里可以看到 <code>Configuration</code> 项，使用此项就可以打开 Zed 自带的配置项目目录，默认第一次打开还是会显示 <code>zed::start</code> 文件，使用 <kbd>Ctrl-E</kbd> 快捷键或者打开菜单选择 <code>user.json</code> 文件进行编辑，这个就是 Zed 的用户配置文件。</p>
<p>默认的 <code>user.json</code> 用户配置文件可能是这样的（仅供参考）：</p>
<pre class="brush: jscript; title: ; notranslate">
{
    imports: [
        &quot;/default.json&quot;
    ],
    preferences: {},
    modes: {},
    keys: {},
    commands: {},
    handlers: {},
    themes: {},
    packages: [    ]
}
</pre>
<p>我们可以在 <code>keys</code> 中新增一项来修改默认的运行命令快捷键：</p>
<pre class="brush: jscript; title: ; notranslate">
    keys: {
        &quot;Command:Enter Command&quot;: {
            win: &quot;Ctrl-Shift-C&quot;
        }
    },
</pre>
<p>例如改成上面的内容就可以使用 <kbd>Ctrl-Shift-C</kbd> 键调出运行 Zed 命令的窗口了。</p>
<p>当然对于修改主题之类的常用配置，你可以使用 <kbd>Ctrl-,</kbd> 快捷键或者 Configuration - Preferences 菜单项进行图形化的配置，这样也更加方便。</p>
<h2 id="zed-命令">Zed 命令</h2>
<p>Zed 命令的使用方式也是和 Sublime Text 比较相似，经过上面的步骤修改命令快捷键之后就可以体验 Zed 的各项命令了，Zed 的命令窗口支持模糊查找识别的功能。</p>
<p>Zed 相对 Chrome 商店里其它各种编辑器的一大优势就是其支持 Zed Package Manager（简称 ZPM）包管理特性，第三方开发者可以根据需要为 Zed 开发各种扩展功能包，ZPM 的介绍可以参考 Zed <a href="http://zedapp.org/2014/05/zed-package-manager/">官网文章</a>，常用 ZPM 包在这里：</p>
<p><a href="https://github.com/zedapp/zed/wiki/Packages">https://github.com/zedapp/zed/wiki/Packages</a></p>
<p>按快捷键调出运行命令的窗口后，输入 install 就可以看到默认匹配的安装 ZPM 包命令：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442973/zed-command.png" alt="Zed命令窗口" title="Zed命令窗口"></p>
<p>同样输入 installed 就可以看到默认匹配的列出已安装的 ZPM 包命令，还是比较方便的。</p>
<h2 id="markdown-编辑与预览">Markdown 编辑与预览</h2>
<p>Zed 虽然不像 Sublime Text 那样支持多标签页功能，但也可以在一个 Zed 窗口中显示最多 3 个编辑窗口，通过快捷键可以切换：</p>
<ul>
<li><kbd>Ctrl-2</kbd> 将窗口分割为两个编辑窗口；</li>
<li><kbd>Ctrl-3</kbd> 将窗口分割为三个编辑窗口（最好高分屏才这么干哈）；</li>
<li><kbd>Ctrl-1</kbd> 恢复为单编辑窗口；</li>
<li><kbd>Ctrl-0</kbd> 在多个编辑窗口之间切换焦点。</li>
</ul>
<p>Zed 自带 Markdown 预览功能，如果编辑的是 Markdown 文件则可以通过 <kbd>Ctrl-P</kbd> 快捷键显示预览窗口，开启预览之后还可以多次使用 <kbd>Ctrl-P</kbd> 快捷键切换源 Markdown 文件编辑窗口和预览窗口的大小，当然也可以按 <kbd>Ctrl-1</kbd> 键关闭预览窗口。</p>
<p>我使用的 <a href="http://wiki.zohead.com/">Wiki 系统</a> 中的 Markdown 文件预览效果如下：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442978/zed-markdown.png" alt="Zed自带Markdown预览效果" title="Zed自带Markdown预览效果"></p>
<p>你可能从上面的截图可以看出 Zed 的 Markdown 预览功能似乎效果一般，这是因为 Zed 自带的 Markdown 预览模块对 GitHub 格式的 Markdown 文件的支持是不太好的。</p>
<p>不过还好已经有人为 Zed 写了一个支持 GitHub Flavored Markdown 的 ZPM 包，其项目地址如下：</p>
<p><a href="https://github.com/akoenig/zed-gfm-preview">https://github.com/akoenig/zed-gfm-preview</a></p>
<p>按照该项目主页的介绍，调出运行命令窗口，选择 <code>Tools:Zpm:Installed Packages</code> 命令准备安装新的 ZPM 包，包地址中输入 <code>gh:akoenig/zed-gfm-preview</code> 就可以完成安装。</p>
<p>安装完成之后编辑 Markdown 文件时可以通过 <code>GitHub:Markdown:Preview</code> 命令使用 zed-gfm-preview 方式来预览 Markdown，当然还是建议修改 Zed 用户配置文件直接将 zed-gfm-preview 配置为 Zed 默认的 Markdown 预览方式：</p>
<pre class="brush: jscript; title: ; notranslate">
modes: {
    markdown: {
        handlers: {
            preview: [
                &quot;!Tools:Preview&quot;,
                &quot;GitHub:Markdown:Preview&quot;
            ]
        }
    }
}
</pre>
<p>这样还是可以按默认的 <kbd>Ctrl-P</kbd> 快捷键直接预览 Markdown 文件：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442979/zed-markdown-github.png" alt="GitHub Markdown预览效果" title="GitHub Markdown预览效果"></p>
<p>可以看到效果也比 Zed 自带的实现好多了哦，代码块的显示也正确了。</p>
<h2 id="后记">后记</h2>
<p>本文只是对 Zed 编辑器的初步介绍，另外一些 Zed 自带的比较好用的远程编辑文件、自带 Web 服务器等特性后面有空再来写了，大家也可以研究折腾甚至开发自己的 ZPM 包哦。文章中有任何问题还请提出指正，火热的六月仍然祝大家玩的开心呢 ^_^。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/chromebook-zed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>发布360云盘播放助手Chrome扩展</title>
		<link>https://zohead.com/archives/cloud-player-helper/</link>
		<comments>https://zohead.com/archives/cloud-player-helper/#comments</comments>
		<pubDate>Fri, 08 Apr 2016 14:50:04 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Chrome]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[360]]></category>
		<category><![CDATA[VXG Media Player]]></category>
		<category><![CDATA[云盘]]></category>
		<category><![CDATA[助手]]></category>
		<category><![CDATA[扩展]]></category>
		<category><![CDATA[播放]]></category>
		<category><![CDATA[视频]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1207</guid>
		<description><![CDATA[最近一段时间以来由于我的个人电脑终端已经基本从 Windows PC 转向 Chromebook，自然之前的一些需求也要看看如何在 Chromebook 上实现。其中一个比较多的需求就是各种云盘中的在线视频播放问题（毕竟我也已经很久没有直接下载视频播放了，基本都是用云盘的离线下载）。 我目前使用的 360 云盘虽然有 Android 和 Windows 下的在线视频播放客户端，但是 Web 端的视频播放功能相对还是弱了一点，云盘里基本上只有标准 H.264 编码的 mp4 格式的视频才能直接用 Chromebook 进行在线播放。 这里还是提一下 360 云盘 Web 版的一个优点就是标准 H [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>最近一段时间以来由于我的个人电脑终端已经基本从 Windows PC 转向 Chromebook，自然之前的一些需求也要看看如何在 Chromebook 上实现。其中一个比较多的需求就是各种云盘中的在线视频播放问题（毕竟我也已经很久没有直接下载视频播放了，基本都是用云盘的离线下载）。</p>
<p>我目前使用的 360 云盘虽然有 Android 和 Windows 下的在线视频播放客户端，但是 Web 端的视频播放功能相对还是弱了一点，云盘里基本上只有标准 H.264 编码的 mp4 格式的视频才能直接用 Chromebook 进行在线播放。</p>
<blockquote>
<p>这里还是提一下 360 云盘 Web 版的一个优点就是标准 H.264 编码的 mp4 格式视频竟然还是以 html5 方式直接播放的。</p>
</blockquote>
<p>其它诸如 avi、wmv、mkv、rmvb 等很常见的视频文件都不能直接在线播放，点击时会直接提示用户下载视频到本地。</p>
<blockquote>
<p><strong>解释</strong></p>
<p>Chrome 浏览器默认只支持播放 H.264 和 WebM 编码的视频,而且 Chrome 45 以上的版本已经不支持不太安全的 NPAPI 形式的插件了（对于 Chromebook 这种终端使用 NPAPI 插件也不现实哦）。</p>
</blockquote>
<p>考虑到 360 云盘的 Android App 目前看起来通过 Chrome ARC 环境也不能正常运行，因此我就稍微花了几天时间写了一个针对 360 云盘的视频播放助手 Chrome 扩展，建议直接从 Chrome 应用商店中安装本扩展：</p>
<p><a href="https://chrome.google.com/webstore/detail/klomjfcgakppceibbbgkbdklmhiiidkl">https://chrome.google.com/webstore/detail/klomjfcgakppceibbbgkbdklmhiiidkl</a></p>
<p>本播放助手扩展主要对 360 云盘的 Web 版做了一些改进：</p>
<ul>
<li>360 云盘的文件列表界面中点击非 mp4(webm) 的视频文件也可以弹出视频播放网页；</li>
<li>视频分类界面中点击视频文件也能达到同样的效果；</li>
<li>视频播放网页上方增加播放助手图标，并显示 <code>[转码视频]</code> 和 <code>[原画视频]</code> 链接，点击可以直接播放，右键也可以复制视频链接地址到其它播放器中播放。</li>
</ul>
<p>特别需要说明的是虽然 Chrome 浏览器本身只支持播放 H.264 和 WebM 编码的视频,不过还好国外的 Video Experts Group 推出了适用于 Chrome 浏览器的 NaCl（PNaCl） 形式的视频播放插件 <code>VXG Media Player Plug-in</code>，此插件可以提升 Chrome 浏览器的视频播放能力，而且相比 NPAPI 插件也更加安全。</p>
<p>有关 <code>VXG Media Player</code> 视频播放器插件的详细介绍可以参考其官网：</p>
<p><a href="http://www.videoexpertsgroup.com/chrome-media-player-plug-in/">http://www.videoexpertsgroup.com/chrome-media-player-plug-in/</a></p>
<p><code>VXG Media Player</code> 插件的基本特性包括：</p>
<ul>
<li>支持 RTSP, RTP, UDP, RTMP, MMS， HLS 等各种常见的媒体协议；</li>
<li>支持 H.264, MPEG-4, MPEG-2 等众多的视频编码；</li>
<li>支持 AAC, PCM, G711, MP3 等音频编码格式；</li>
<li>视频解码支持硬件加速；</li>
<li>由于是 NaCl（PNaCl） 形式的插件，在不同硬件平台上兼容性比较好。</li>
</ul>
<p>安装 <code>VXG Media Player</code> 插件并经过基本测试之后发现该插件虽然也有一些问题，但也算能满足 Chromebook 上网页直接播放视频的需求了。因此经过研究 <code>VXG Media Player</code> 插件的 API 之后决定在我的云盘播放助手扩展中使用此插件以实现更加全面的视频播放支持，最终的使用方式就是：</p>
<ul>
<li>mp4(webm) 视频： <br />
直接使用 360 云盘自带的 html5 视频播放功能，效果最好；</li>
<li>avi、wmv、mkv、rmvb 等视频： <br />
调用 <code>VXG Media Player</code> 插件接口让这些格式的视频也能在云盘视频播放界面中直接播放。</li>
</ul>
<p>安装 <code>VXG Media Player</code> 插件请移步 Chrome 商店：</p>
<p><a href="https://chrome.google.com/webstore/detail/hncknjnnbahamgpjoafdebabmoamcnni">https://chrome.google.com/webstore/detail/hncknjnnbahamgpjoafdebabmoamcnni</a></p>
<p>这里贴上我的云盘播放助手扩展运行效果截图：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737370806/cloud-player-helper.png" alt="云盘播放助手扩展" title="云盘播放助手扩展"></p>
<p>从上面的截图可以看到本扩展在 360 云盘播放界面增加的图标和两个链接，本扩展不会修改云盘播放界面上的默认播放效果（不管是使用 html5 视频播放或者 360 云盘的 Flash 视频播放器），只有点击增加的链接之后才会切换播放方式。</p>
<blockquote>
<p><strong>提示</strong></p>
<p>对于 mp4(webm) 格式的视频文件，由于 360 云盘已经支持比较好的 html5 视频播放效果，本扩展就没有提供使用 <code>VXG Media Player</code> 插件进行播放的功能。</p>
</blockquote>
<p>上面截图展示的就是点击 <code>[转码视频]</code> 链接之后使用 <code>VXG Media Player</code> 插件播放 mkv 视频的效果；当然你也可以在增加的 <code>[转码视频]</code> 和 <code>[原画视频]</code> 链接上点右键复制视频地址在其它播放器中播放（强烈建议 Chromebook 用户安装 Chrome 商店中的 VLC 播放器应用）。</p>
<p>如果你的 Chrome 浏览器没有安装 <code>VXG Media Player</code> 插件，那么在点击 <code>[转码视频]</code> 和 <code>[原画视频]</code> 链接时会自动提示你转到 Chrome 商店安装该媒体播放器插件：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737371494/install-vxg-player.png" alt="提示安装 VXG Media Player 插件" title="提示安装 VXG Media Player 插件"></p>
<p>当然还是要说下本云盘播放助手扩展目前存在的问题：</p>
<ul>
<li><code>VXG Media Player</code> 插件的控制条暂时不支持拖动、快放、慢放、暂停操作，看起来是有些不足，视频插件更新之后应该会有改善；</li>
<li>mkv 等格式的高清视频效果没有外部 VLC 播放器的效果好；</li>
<li>360 云盘自动转码的 m3u8 HLS 视频某些情况下会出现播放速度过快的问题，还是 <code>VXG Media Player</code> 插件的锅，只能等后续更新了；</li>
<li>从上面的截图可以看到播放时会显示 <code>VXG Media Player</code> 插件的 logo 和评估版本的提醒，这个由于是个人使用也不好去掉咯。</li>
</ul>
<p>因此如果你发现 <code>VXG Media Player</code> 插件的播放效果不给力，也大可以使用其它播放器播放，本扩展并没有捆绑依赖 <code>VXG Media Player</code> 插件。</p>
<p>本扩展的源代码已经发布到 GitHub 上：</p>
<p><a href="https://github.com/zohead/cloud-disk-player-helper">https://github.com/zohead/cloud-disk-player-helper</a></p>
<p>如果你在使用云盘播放助手扩展的过程中发现任何问题，欢迎在本扩展的 Chrome 商店页面、GitHub 项目支持页面、本博客文章下提交 issue 或者留言，最后祝玩的开心～～～</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/cloud-player-helper/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>搭建自己的全文RSS系统</title>
		<link>https://zohead.com/archives/full-text-rss/</link>
		<comments>https://zohead.com/archives/full-text-rss/#comments</comments>
		<pubDate>Thu, 13 Aug 2015 13:06:43 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[fivefilters]]></category>
		<category><![CDATA[fulltextrssfeed]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[全文]]></category>

		<guid isPermaLink="false">http://zohead.com/?p=1028</guid>
		<description><![CDATA[最近在使用 feedly 阅读器查看之前订阅的一些文章发现有些博客网站的 RSS 输出已经改成只输出摘要信息而不输出全文的形式了，这样对于 RSS 阅读器来说可是很不方便的，我订阅的几个 RSS 源中像 虎嗅网、某个 51CTO 博客、Phoronix 这几个 RSS 源都已经不输出全文了。 之前我是使用 fulltextrssfeed.com 这个网站来辅助生成全文 RSS 输出的，但现在发现 fulltextrssfeed.com 对于我实际要用的几个 RSS 源没有什么作用了，经常不能输出有效的信息。 最后在网上找到 fivefilters.org 也提供了类似的服务，在其网站上输入原始 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>最近在使用 feedly 阅读器查看之前订阅的一些文章发现有些博客网站的 RSS 输出已经改成只输出摘要信息而不输出全文的形式了，这样对于 RSS 阅读器来说可是很不方便的，我订阅的几个 RSS 源中像 虎嗅网、某个 51CTO 博客、Phoronix 这几个 RSS 源都已经不输出全文了。</p>
<p>之前我是使用 <a href="http://fulltextrssfeed.com/" target="_blank">fulltextrssfeed.com</a> 这个网站来辅助生成全文 RSS 输出的，但现在发现 fulltextrssfeed.com 对于我实际要用的几个 RSS 源没有什么作用了，经常不能输出有效的信息。</p>
<p>最后在网上找到 <a href="http://fivefilters.org/content-only/" target="_blank">fivefilters.org</a> 也提供了类似的服务，在其网站上输入原始的 RSS 源地址就可以输出全文 RSS 内容，看起来确实是比较好用，但这个网站默认只输出 3 条最近的文章的限制确实还是有点坑。不过好在 fivefilters.org 把他们的全文 RSS 程序开源了，用户可以使用这个程序自己搭建一个全文 RSS 输出系统，虽然他们最新版本的全文 RSS 程序是需要购买的，但是老版本的程序是可以免费下载使用的（只是不对老版本提供技术支持）。</p>
<p>按照 fivefilters.org 网站的说明，找一个支持 PHP 的普通主机就可以使用了，首先访问其项目主页并检出最新的 full-text-rss 的源代码：</p>
<p><a href="https://bitbucket.org/fivefilters/full-text-rss" target="_blank">https://bitbucket.org/fivefilters/full-text-rss</a></p>
<p>解压缩放到 PHP 空间目录里，把目录中的 config.php 拷贝为 custom_config.php，然后就可以修改 custom_config.php 配置文件：</p>
<pre class="brush: php; title: custom_config.php; notranslate">
$options-&gt;max_entries = 10;
$options-&gt;caching = true;
$options-&gt;key_required = true;
$options-&gt;api_keys[1] = 'secret-key-1';
</pre>
<p>上面列出了几个常用的配置项，max_entries 表示最多输出多少篇文章，caching 最好改为 true 这样可以启用缓存防止每次请求时都需要重新产生 RSS 输出，另外 key_required 和 api_keys 也可以启用，这样就可以为 RSS 全文输出系统增加密码验证功能，防止被其它用户使用（如果你是壕而且主机毫无压力的话大可以不设置密码并共享给其他人使用哦 ^_^）。</p>
<p>修改完成之后通过浏览器访问 full-text-rss 目录就会出现全文 RSS 的界面了：</p>
<div style="width: 697px" class="wp-caption alignnone"><a href="http://res.cloudinary.com/digwht2y0/image/upload/v1737371061/full-text-rss.png" target="_blank"><img alt="全文RSS输出配置" src="http://res.cloudinary.com/digwht2y0/image/upload/v1737371061/full-text-rss.png" width="687" height="556" /></a><p class="wp-caption-text">全文RSS输出配置</p></div>
<p>输入原始 RSS 源的地址（这里以虎嗅为例），输入密码（就是 Access Key 了）并选择最大输出文章数，点击 Create Feed 按钮之后一切正常的话就会出现全文 RSS 输出了，此时显示的地址就可以给 feedly 等各种 RSS 阅读器使用咯。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/full-text-rss/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chromebook上使用KeePass的几种姿势</title>
		<link>https://zohead.com/archives/keepass-chromebook/</link>
		<comments>https://zohead.com/archives/keepass-chromebook/#comments</comments>
		<pubDate>Sat, 01 Aug 2015 17:06:16 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Chrome]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[ARC]]></category>
		<category><![CDATA[BrowsePass]]></category>
		<category><![CDATA[Chrome OS]]></category>
		<category><![CDATA[Chromebook]]></category>
		<category><![CDATA[Crouton]]></category>
		<category><![CDATA[KeePass]]></category>
		<category><![CDATA[keepass2]]></category>
		<category><![CDATA[KeePassDroid]]></category>
		<category><![CDATA[LastPass]]></category>
		<category><![CDATA[密码管理]]></category>

		<guid isPermaLink="false">http://zohead.com/?p=1016</guid>
		<description><![CDATA[KeePass 是一个开源的轻量级密码管理器，只需要记住一个 KeePass 主密码就可以用来管理所有其它各种网站或者服务密码，相对于 LastPass 这种在线同步的密码管理器最大的好处就是 KeePass 的密码数据库是完全由用户自己来掌控的，不用担心像 LastPass 被攻击泄漏密码之类的问题（今年就出现过一次哦）。 KeePass 目前相对也有个劣势就是浏览器插件功能不强，基本都需要配合 KeePass 客户端软件使用，好在 KeePass 也支持 Windows、Mac OS X、Linux、Android、iOS 等各种操作系统，可惜目前在 Chromebook 这种不能直接运行 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>KeePass 是一个开源的轻量级密码管理器，只需要记住一个 KeePass 主密码就可以用来管理所有其它各种网站或者服务密码，相对于 LastPass 这种在线同步的密码管理器最大的好处就是 KeePass 的密码数据库是完全由用户自己来掌控的，不用担心像 LastPass 被攻击泄漏密码之类的问题（今年就出现过一次哦）。</p>
<p>KeePass 目前相对也有个劣势就是浏览器插件功能不强，基本都需要配合 KeePass 客户端软件使用，好在 KeePass 也支持 Windows、Mac OS X、Linux、Android、iOS 等各种操作系统，可惜目前在 Chromebook 这种不能直接运行客户端软件的系统上使用时会有一些障碍。LastPass 由于是通过 Chrome 浏览器扩展直接在线同步的没有这个问题，而你如果是 Chromebook 和 KeePass 的重度用户，那还是相当不便的。</p>
<p>有关 KeePass 的详细介绍和原理请参考其官方网站：<a href="http://keepass.info/" target="_blank">http://keepass.info/</a>。</p>
<p>经过初步研究，这里我列出几种在 Chromebook 上使用 KeePass 的方法供读者参考：</p>
<ul>
<li><strong>Crouton + keepass2 + chromeIPass：</strong></li>
</ul>
<p>这个方法可能暂时只适用于使用 x86 处理器的 Chromebook，Chromebook 上可以使用 Crouton 安装基本完整的 Linux 系统，安装完成之后可以直接在 Linux 系统中安装 keepass2 软件包（比较新的 Linux 系统软件源中一般会自带这个的），并从 KeePass 官网下载启用 KeePassHttp 插件，这样就可以在 Chrome OS 系统里安装 chromeIPass 扩展愉快的使用 KeePass 密码数据库了。</p>
<p>这里就不详细介绍 keepass2 软件如何安装，chromeIPass 扩展如何使用之类的了。无奈由于目前 armhf 版本的 Linux 系统自带的 mono （KeePass 图形程序依赖开源的 mono .NET 开发环境）版本的问题，armhf 下的 keepass2 可以安装但无法正常运行。</p>
<p>笔者在目前使用的三星 ARM Chromebook 安装的 Ubuntu 14.04 版本上就无法正常运行，将 Crouton Linux 系统升级到最新的 Ubuntu 15.04 或者 15.10 等系统（自带的 mono 环境已经升级）有可能能正常运行，这里没有继续尝试了。</p>
<ul>
<li><strong>CKP Chrome 扩展程序：</strong></li>
</ul>
<p><a href="https://chrome.google.com/webstore/detail/ckp-keepass-integration-f/lnfepbjehgokldcaljagbmchhnaaogpc" target="_blank">CKP</a> （KeePass integration for Chrome）是 Chrome 应用商店里的一款 KeePass 嵌入式扩展程序，安装之后导入 KeePass 数据库就可以实现访问网站时自动填入用户名和密码，可惜就是 CKP 只能以只读方式使用 KeePass 密码数据库，如果数据库文件变化了只能重新导入（Chromebook 上还没有太好的办法能直接修改密码数据库文件）。</p>
<p>CKP 同时功能上也存在限制：无法完整浏览密码数据库里的全部条目，如果某个服务密码存在密码数据库里但不能直接通过 Chrome 浏览器访问这样就没法取出密码了。</p>
<ul>
<li><strong>BrowsePass Chrome 应用：</strong></li>
</ul>
<p><a href="https://chrome.google.com/webstore/detail/browsepass/pihdapfeofbodahcblfmeckjnfcigakb" target="_blank">BrowsePass</a> 则是另一款独立的 Chrome Packaged App，因此不能实现根据当前浏览的网页自动填写用户名和密码的功能，这个 App 目前对密码数据库文件支持文件好，可以完整浏览全部目录和条目，可以复制密码到相应的网页，但是仍然还有一个主要问题：BrowsePass 目前也只支持只读方式打开密码数据库，作者说后续可能会增加写数据库支持，但不保证什么时候能加入的。</p>
<ul>
<li><strong>Chrome ARC + KeePassDroid：</strong></li>
</ul>
<p>这个是目前我正在使用的方法，主要这种方式完全支持对密码数据库的各种写入操作，不需要另外运行一个 Crouton Linux 系统，而且这也是比较通用的方法哦，不只是能在 Chromebook 下使用，其实也可以直接在 Windows、Linux 等其它安装了普通 Chrome 浏览器的系统下使用。</p>
<p>Chrome 现在支持通过 ARC（App Runtime for Chrome） 直接运行 Android 程序，虽然目前兼容性还不是特别好，但 KeePassDroid 这种没有使用 NDK 代码的简单 Android 应用还是完全支持的。</p>
<p>首先安装 <a href="https://chrome.google.com/webstore/detail/arc-welder/emfinbmielocnlhgmfkkmkngdoccbadn" target="_blank">ARC Welder</a> Chrome 应用，安装完成之后会自动安装其依赖的 App Runtime for Chrome 运行环境，然后从网上下载 KeePassDroid 的安装 apk 文件，打开 ARC Welder 应用加载对应的 apk 文件将其转换为 Chrome 应用，不过需要注意的是转换的时候必须启用剪贴板访问权限，而且记得增加这个参数：</p>
<p><strong>{"enableExternalDirectory": true}</strong></p>
<p>启用外部 SD 卡目录访问权限，这样转换出来的 KeePassDroid Chrome 应用才可以正常打开 KeePass 密码数据库文件，具体如下图所示：</p>
<div style="width: 368px" class="wp-caption alignnone"><a href="http://res.cloudinary.com/digwht2y0/image/upload/v1737369840/arcwelder-keepassdroid.png" target="_blank"><img alt="ARC Welder转换KeePassDroid" src="http://res.cloudinary.com/digwht2y0/image/upload/v1737369840/arcwelder-keepassdroid.png" width="358" height="672" /></a><p class="wp-caption-text">ARC Welder 转换 KeePassDroid</p></div>
<p>然后点击 Download ZIP 按钮保存成 zip 文件，并将 zip 文件解压缩并在扩展程序界面加载为 Chrome 应用。</p>
<p>第一次启动 KeePassDroid 应用时 Chrome OS 系统会提示你选择一个 SD 卡目录，选择之后会让你选择密码数据库文件路径，只要把你的 KeePass 数据库文件放到对应的路径打开即可，例如我使用的路径就是这样：/storage/sdcard/Download/zzm.kdbx。</p>
<p>选择密码数据库文件之后输入你的数据库主密码，KeePassDroid 就会列出数据库里的所有目录和条目，进入一个任何条目，KeePassDroid 会自动弹出通知消息提示你复制用户名和密码，这样就可以正常在各类网站上使用 KeePass 密码咯。</p>
<p><strong>后记：</strong></p>
<p>目前 GitHub 上的 Pascal Mathis 开发了一款基于 Node.js 的 KeePass 库：<a href="https://github.com/NeoXiD/keepass.io" target="_blank">keepass.io</a>，这个 Node.js 库实现了完整的密码数据库读取和写入功能，在和开发者简单沟通之后，有想法在后面有空时基于 keepass.io 将其完整功能改为通过 Chrome Filesystem 等 API 实现从而不依赖 Node.js，这样能以单独 Chrome App 的形式使用 KeePass 密码数据库。只是在发现 KeePassDroid 能正常使用的情况，这个就当作后面有空时的一个念想再说咯～～～ 祝各位玩的开心。 ^_^</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/keepass-chromebook/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>树莓派上使用htpdate同步时间</title>
		<link>https://zohead.com/archives/htpdate-raspberry/</link>
		<comments>https://zohead.com/archives/htpdate-raspberry/#comments</comments>
		<pubDate>Mon, 13 Oct 2014 16:12:25 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[NTP]]></category>
		<category><![CDATA[ntpdate]]></category>
		<category><![CDATA[时间同步]]></category>
		<category><![CDATA[树莓派]]></category>

		<guid isPermaLink="false">http://zohead.com/?p=809</guid>
		<description><![CDATA[最近住处的网络由电信换为移动宽带之后，之前一直使用的 Raspberry Pi 树莓派板子上出现系统时间不正确的问题（显示为 1970 年 1 月 1 日），由于树莓派板子上没有 RTC 硬件和电池，因此树莓派上的系统时间重启是保存不了的。 之前设置的是每次开机自动使用 ntpdate 命令从 NTP 服务器上同步时间，但现在每次运行时都提示： 同时公司里电信网络环境下这个命令又是完全正常的，移动宽带环境下直接 ping 这个 NTP 服务器也是通的，因此估计就是移动宽带直接把 NTP 给封了。 在谴责移动的同时只能另想办法，还好网上已经有人想到这种应对 NTP 被防火墙封掉类似的需求了，开源 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>最近住处的网络由电信换为移动宽带之后，之前一直使用的 Raspberry Pi 树莓派板子上出现系统时间不正确的问题（显示为 1970 年 1 月 1 日），由于树莓派板子上没有 RTC 硬件和电池，因此树莓派上的系统时间重启是保存不了的。</p>
<p>之前设置的是每次开机自动使用 ntpdate 命令从 NTP 服务器上同步时间，但现在每次运行时都提示：</p>
<p><pre class="brush: bash; title: ; notranslate">
root@XBian:~# ntpdate ntp.sjtu.edu.cn
13 Oct 23:49:01 ntpdate[1484]: no server suitable for synchronization found
</pre>
</p>
<p><span id="more-809"></span></p>
<p>同时公司里电信网络环境下这个命令又是完全正常的，移动宽带环境下直接 ping 这个 NTP 服务器也是通的，因此估计就是移动宽带直接把 NTP 给封了。</p>
<p>在谴责移动的同时只能另想办法，还好网上已经有人想到这种应对 NTP 被防火墙封掉类似的需求了，开源的 htpdate 命令直接使用 HTTP 协议（这个是不可能封的了）来进行系统时间同步，项目主页在这里：</p>
<p><a href="https://github.com/iridium77/htpdate" target="_blank">https://github.com/iridium77/htpdate</a></p>
<p>htpdate 的原理也非常简单，直接解析 HTTP 协议头中的服务器时间信息，然后设置本地时间，我们来看百度返回的 HTTP 头：</p>
<p><pre class="brush: plain; title: ; notranslate">
HTTP/1.1 200 OK
Date Mon, 13 Oct 2014 16:05:18 GMT
Content-Type text/html
Transfer-Encoding chunked
Connection Keep-Alive
Cache-Control private
Expires Mon, 13 Oct 2014 16:05:18 GMT
Server BWS/1.1
BDPAGETYPE 2
BDQID 0x8b40c1f700000bd4
BDUSERID 13923551
Set-Cookie BDSVRTM=133; path=/
Set-Cookie BD_HOME=1; path=/
</pre>
</p>
<p>上面的 Date Mon, 13 Oct 2014 16:05:18 GMT 就是百度的 Web 服务器上的系统时间了。</p>
<p>htpdate 命令做时间同步会有 0.5 秒左右的误差（看看 HTTP 头就知道里面很多时间都是以秒为单位哈），对于我的树莓派来说就完全没有关系，如果对这个比较在意的话只能尽量用 NTP 时间同步了。</p>
<p>htpdate 使用上也很简单，简单编译安装之后把这条命令加到 Raspberry Pi Raspbian 系统的 /etc/rc.local 文件中（不加 -t 参数基本不能同步成功哦）：</p>
<p><strong>htpdate -t -s ntp.neu.edu.cn</strong></p>
<p>然后重启树莓派就可以正常同步系统时间了。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/htpdate-raspberry/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>使用AutoIt导出QQ群漫游聊天记录</title>
		<link>https://zohead.com/archives/autoit-export-qqmsg/</link>
		<comments>https://zohead.com/archives/autoit-export-qqmsg/#comments</comments>
		<pubDate>Tue, 08 Apr 2014 14:52:41 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[工具]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[AutoIt]]></category>
		<category><![CDATA[QQ]]></category>
		<category><![CDATA[脚本]]></category>

		<guid isPermaLink="false">http://zohead.com/?p=694</guid>
		<description><![CDATA[本文同步自（最佳显示效果请点击）：https://zohead.com/archives/autoit-export-qqmsg/ 近日需要将某个QQ群的聊天记录导出来查找需要的东西，但发现本地保存的聊天记录比较少，很多日志都在漫游的聊天记录里，QQ本身又没有提供直接导出漫游聊天记录的功能，因此就想到写一个 AutoIt 自动脚本来模拟鼠标和键盘动作自动导出日志了。 首先安装 AutoIt v3，然后打开需要导出的QQ群聊天窗口，点击 “消息记录” 按钮（消息会显示在右边窗口），然后切换到 “漫游消息” 标签；接着再开启一个空的 EditPlus 文档： 然后运行我写的这个简单的 copy_q [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>本文同步自（最佳显示效果请点击）：<a href="https://zohead.com/archives/autoit-export-qqmsg/" target="_blank">https://zohead.com/archives/autoit-export-qqmsg/</a></p>
<p>近日需要将某个QQ群的聊天记录导出来查找需要的东西，但发现本地保存的聊天记录比较少，很多日志都在漫游的聊天记录里，QQ本身又没有提供直接导出漫游聊天记录的功能，因此就想到写一个 AutoIt 自动脚本来模拟鼠标和键盘动作自动导出日志了。</p>
<p>首先安装 AutoIt v3，然后打开需要导出的QQ群聊天窗口，点击 “消息记录” 按钮（消息会显示在右边窗口），然后切换到 “漫游消息” 标签；接着再开启一个空的 EditPlus 文档：</p>
<div style="width: 650px" class="wp-caption alignnone"><a href="http://zohead.com/wp-content/uploads/qq-remote-msg.jpg" target="_blank"><img alt="QQ群漫游聊天记录" src="http://zohead.com/wp-content/uploads/qq-remote-msg.jpg" width="640" height="437" /></a><p class="wp-caption-text">QQ群漫游聊天记录</p></div>
<p>然后运行我写的这个简单的 <strong>copy_qqmsg.au3</strong> AutoIt 脚本就可以自动将漫游聊天记录复制到 EditPlus 中了，运行之前请先将第一行的 qqgroup 换成实际的QQ群或者聊天窗口的名字。</p>
<p>AutoIt 脚本内容其实非常简陋的，没有什么难度，内容如下：</p>
<pre class="brush: bash; highlight: [5,14]; title: copy_qqmsg.au3; notranslate">
Local $hWnd = WinGetHandle(&quot;[CLASS:TXGuiFoundation; TITLE:qqgroup]&quot;, &quot;&quot;)
Local $editWnd = WinGetHandle(&quot;EditPlus&quot;, &quot;&quot;)

$i=1
While $i&lt;=200
	WinActivate($hWnd)
	Local $aPos = WinGetPos(&quot;[ACTIVE]&quot;)
	MouseClick(&quot;left&quot;, $aPos[0] + $aPos[2] - 52, $aPos[1] + $aPos[3] - 18)
	Sleep(100)
	$i=$i+1
WEnd

$i=1
While $i&lt;=100
	WinActivate($hWnd)
	Local $aPos = WinGetPos(&quot;[ACTIVE]&quot;)
	MouseClick(&quot;left&quot;, $aPos[0] + $aPos[2] - 52, $aPos[1] + $aPos[3] - 18)
	Sleep(5000)
	Send(&quot;^a&quot;)
	Send(&quot;^c&quot;)
	WinActivate($editWnd)
	Sleep(500)
	Send(&quot;^v&quot;)
	Send(&quot;{ENTER}&quot;)
	Sleep(500)
	$i=$i+1
WEnd
</pre>
<p>先根据QQ聊天窗口类名（TXGuiFoundation）和标题名称（根据实际需要修改）查找到QQ聊天窗口句柄，再查找到 EditPlus 窗口句柄，接着将鼠标移动到QQ聊天窗口右下角的 “&lt;” 上一页按钮上自动点击并发送全选及复制按键，然后切换到 EditPlus 窗口中进行粘贴。程序运行过程中鼠标和键盘不要乱按哦。</p>
<p>第一个循环中的 200 表示当前页再往前翻多少页，第二个循环中的 100 表示自动拷贝多少页的聊天记录（方式比较土，没什么好办法判断什么时候结束）。鼠标点击之后的 Sleep 5秒钟是为了给QQ显示漫游聊天记录的时间。</p>
<p>需要的朋友可以到我的 Gist 上下载此 AutoIt 脚本，可以自己下载之后用 AutoIt 编译成可执行程序的：</p>
<p><a href="http://gist.github.com/zohead/10130455" target="_blank">http://gist.github.com/zohead/10130455</a></p>
<p>有任何问题的话欢迎交流哦~~~</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/autoit-export-qqmsg/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
