<?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>「Tech」カテゴリの記事一覧 - 工夫と趣向と分別と。</title>
	<atom:link href="https://d.akinori.org/category/tech/feed/" rel="self" type="application/rss+xml" />
	<link>https://d.akinori.org/category/tech/</link>
	<description>おもしろく生きたいね</description>
	<lastBuildDate>Fri, 30 Dec 2022 13:11:08 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.1</generator>
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/><atom:link rel="hub" href="https://websubhub.com/hub"/>	<item>
		<title>ZFSは砕けない</title>
		<link>https://d.akinori.org/2016/12/31/zfs%e3%81%af%e7%a0%95%e3%81%91%e3%81%aa%e3%81%84/</link>
					<comments>https://d.akinori.org/2016/12/31/zfs%e3%81%af%e7%a0%95%e3%81%91%e3%81%aa%e3%81%84/#respond</comments>
		
		<dc:creator><![CDATA[Akinori]]></dc:creator>
		<pubDate>Sat, 31 Dec 2016 11:07:28 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[ZFS]]></category>
		<guid isPermaLink="false">http://d.akinori.org/?p=3145</guid>

					<description><![CDATA[<p>年の瀬、公園で糞寒い中でも元気な子供達を遊ばせていると、家で掃除をしてくれていた妻からビデオ通話が入った。曰く、サーバのケーブルが抜けちゃった！ 映像を見ると、抜けたのは外付けHD箱（まだこいつが動いている！）のeSAT… <span class="read-more"><a href="https://d.akinori.org/2016/12/31/zfs%e3%81%af%e7%a0%95%e3%81%91%e3%81%aa%e3%81%84/">続きを読む &#187;</a></span></p>
<p>The post <a href="https://d.akinori.org/2016/12/31/zfs%e3%81%af%e7%a0%95%e3%81%91%e3%81%aa%e3%81%84/">ZFSは砕けない</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->

» 関連記事 «<ul>
<li><a href="https://d.akinori.org/2010/04/14/%e3%83%89%e3%83%a9%e3%82%a4%e3%83%96%e3%83%89%e3%82%a2-ex35pm4b-pe%e3%81%8cfreebsd-8%e3%81%a7%e4%bd%bf%e3%81%88%e3%81%9f/" rel="bookmark" title="ドライブドア EX35PM4B-PEがFreeBSD 8で使えた">ドライブドア EX35PM4B-PEがFreeBSD 8で使えた</a></li>
<li><a href="https://d.akinori.org/2006/03/27/20060327p01/" rel="bookmark" title="メモリ故障確定キター！">メモリ故障確定キター！</a></li>
<li><a href="https://d.akinori.org/2010/04/15/wd15ears%e3%81%ae%e6%80%a7%e8%83%bd%e3%82%92%e8%a8%88%e6%b8%ac/" rel="bookmark" title="WD15EARSの性能を計測">WD15EARSの性能を計測</a></li>
</ul>
</div>
]]></description>
										<content:encoded><![CDATA[<p>年の瀬、公園で糞寒い中でも元気な子供達を遊ばせていると、家で掃除をしてくれていた妻からビデオ通話が入った。曰く、サーバのケーブルが抜けちゃった！<br />
<img fetchpriority="high" decoding="async" class="aligncenter wp-image-3150 size-medium" src="https://d.akinori.org/wp-content/uploads/2016/12/img_2123-300x225.jpg" width="300" height="225" srcset="https://d.akinori.org/wp-content/uploads/2016/12/img_2123-300x225.jpg 300w, https://d.akinori.org/wp-content/uploads/2016/12/img_2123-768x576.jpg 768w, https://d.akinori.org/wp-content/uploads/2016/12/img_2123-1024x768.jpg 1024w, https://d.akinori.org/wp-content/uploads/2016/12/img_2123.jpg 1280w" sizes="(max-width: 300px) 100vw, 300px" /><br />
映像を見ると、抜けたのは外付けHD箱（まだ<a href="http://d.akinori.org/2010/04/14/%e3%83%89%e3%83%a9%e3%82%a4%e3%83%96%e3%83%89%e3%82%a2-ex35pm4b-pe%e3%81%8cfreebsd-8%e3%81%a7%e4%bd%bf%e3%81%88%e3%81%9f/">こいつ</a>が動いている！）のeSATAケーブルのようだ。これ、抜けやすいんだよね…。しかたない。気にしないで、と返事して外遊びを続けた。<br />
しばらくして帰宅して、ケーブルを再接続してからサーバの様子を見ると、メインのpoolは外付け箱のディスク群に頼らず本体だけで動くのでおいておくとして、メディアファイル置き場にしていたpoolがUNAVAIL状態に落ちていた。ディスクは繋がっているのにおかしいな。と、dmesgを見るとこんなもので埋め尽くされていた。</p><pre class="urvanov-syntax-highlighter-plain-tag">Dec 30 14:22:56 daemon kernel: (aprobe0:siisch1:0:15:0): SOFT_RESET. ACB: 00 00 00 00 00 00 00 00 00 00 00 00
Dec 30 14:22:56 daemon kernel: (noperiph:siisch1:0:(aprobe1:siisch1:0:0:0): CAM status: Unconditionally Re-queue Request
Dec 30 14:22:56 daemon kernel: (aprobe0:siisch1:0:15:0): CAM status: Unconditionally Re-queue Request
Dec 30 14:22:56 daemon kernel: -1:(aprobe0:ffffffff): siisch1:0:rescan already queued
Dec 30 14:22:56 daemon kernel: 15:(noperiph:0): siisch1:0:Error 5, Retry was blocked
Dec 30 14:22:56 daemon kernel: -1:ffffffff): (aprobe1:rescan already queued
Dec 30 14:22:56 daemon kernel: siisch1:0:0:0): Error 5, Retry was blocked
Dec 30 14:22:56 daemon kernel: (aprobe1:siisch1:0:0:0): SOFT_RESET. ACB: 00 00 00 00 00 00 00 00 00 00 00 00
Dec 30 14:22:56 daemon kernel: (aprobe0:siisch1:0:15:0): SOFT_RESET. ACB: 00 00 00 00 00 00 00 00 00 00 00 00
Dec 30 14:22:56 daemon kernel: (noperiph:(aprobe1:siisch1:0:0:0): CAM status: Unconditionally Re-queue Request
Dec 30 14:22:56 daemon kernel: (aprobe0:siisch1:0:15:0): CAM status: Unconditionally Re-queue Request
Dec 30 14:22:56 daemon kernel: siisch1:0:(aprobe0:-1:siisch1:0:ffffffff): 15:rescan already queued
Dec 30 14:22:56 daemon kernel: 0): (noperiph:Error 5, Retry was blocked
Dec 30 14:22:56 daemon kernel: siisch1:0:-1:(aprobe1:ffffffff): siisch1:0:rescan already queued
Dec 30 14:22:56 daemon kernel: 0:0): Error 5, Retry was blocked</pre><p>うわー。軽く調べると、これはケーブル不良・接触不良の疑いがある。慌ててケーブルを抜くと埃だらけ…。やばい。埃を除去して再接続すると、今度はこう来た。</p><pre class="urvanov-syntax-highlighter-plain-tag">Dec 30 14:40:30 daemon kernel: GEOM: ada6: corrupt or invalid GPT detected.
Dec 30 14:40:30 daemon kernel: GEOM: ada6: GPT rejected -- may not be recoverable.</pre><p>ありゃりゃ。GPTが壊れた？でも、rawデバイスでpoolに入れているから、GPTがどうの出てくるのはおかしい。ということで、このpoolを構成している2台のディスクの頭の方を見てみる。</p><pre class="urvanov-syntax-highlighter-plain-tag"># dd if=/dev/ada6 count=4 | hd
...
00000200  45 46 49 20 50 41 52 54  00 00 01 00 5c 00 00 00  |EFI PART....\...|
...
4+0 records in
4+0 records out
2048 bytes transferred in 0.000387 secs (5294849 bytes/sec)
# dd if=/dev/ada7 count=4 | hd
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
4+0 records in
4+0 records out
2048 bytes transferred in 0.000433 secs (4725187 bytes/sec)
00000800</pre><p>なるほど、片方にEFIディスクラベルが残っており、GEOMがそれを拾ってしまったようだ。なぜ今になって問題となったのかはわからないが、変な信号でどこかが壊れたか、それによって回復処理が走ったとか？<br />
さて、ZFS On-Disk Specification（悲しいかな、オフィシャルな置き場所は失われたので<a href="https://www.google.com/search?q=ZFS+On-Disk+Specification">ググって探そう</a>）のSection 1.3によれば、ZFSボリュームの頭に置かれるvdev labelの頭の8KBはブランク、つまりZFSでは関知しないようなので、クリアしてしまおう。</p><pre class="urvanov-syntax-highlighter-plain-tag"># dd if=/dev/zero of=/dev/ada6 count=4
4+0 records in
4+0 records out
2048 bytes transferred in 0.000024 secs (87145228 bytes/sec)</pre><p>しばらくすると、ボリュームがZFSで認識されるようになったので、zpool importで無事poolが復活した。ああ、よかった。今年もデータロスなく年を越せそうです。</p>
<p>The post <a href="https://d.akinori.org/2016/12/31/zfs%e3%81%af%e7%a0%95%e3%81%91%e3%81%aa%e3%81%84/">ZFSは砕けない</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->
<p>» 関連記事 «</p><ul>
<li><a href="https://d.akinori.org/2010/04/14/%e3%83%89%e3%83%a9%e3%82%a4%e3%83%96%e3%83%89%e3%82%a2-ex35pm4b-pe%e3%81%8cfreebsd-8%e3%81%a7%e4%bd%bf%e3%81%88%e3%81%9f/" rel="bookmark" title="ドライブドア EX35PM4B-PEがFreeBSD 8で使えた">ドライブドア EX35PM4B-PEがFreeBSD 8で使えた</a></li>
<li><a href="https://d.akinori.org/2006/03/27/20060327p01/" rel="bookmark" title="メモリ故障確定キター！">メモリ故障確定キター！</a></li>
<li><a href="https://d.akinori.org/2010/04/15/wd15ears%e3%81%ae%e6%80%a7%e8%83%bd%e3%82%92%e8%a8%88%e6%b8%ac/" rel="bookmark" title="WD15EARSの性能を計測">WD15EARSの性能を計測</a></li>
</ul>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://d.akinori.org/2016/12/31/zfs%e3%81%af%e7%a0%95%e3%81%91%e3%81%aa%e3%81%84/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>MacBookでau Wi-Fi接続ツールを自動起動する</title>
		<link>https://d.akinori.org/2014/05/02/macbook%e3%81%a7au-wi-fi%e3%82%92%e6%8b%be%e3%81%a3%e3%81%9f%e3%82%89%e6%8e%a5%e7%b6%9a%e3%83%84%e3%83%bc%e3%83%ab%e3%82%92%e8%b5%b7%e5%8b%95%e3%81%99%e3%82%8b/</link>
					<comments>https://d.akinori.org/2014/05/02/macbook%e3%81%a7au-wi-fi%e3%82%92%e6%8b%be%e3%81%a3%e3%81%9f%e3%82%89%e6%8e%a5%e7%b6%9a%e3%83%84%e3%83%bc%e3%83%ab%e3%82%92%e8%b5%b7%e5%8b%95%e3%81%99%e3%82%8b/#respond</comments>
		
		<dc:creator><![CDATA[Akinori]]></dc:creator>
		<pubDate>Fri, 02 May 2014 07:37:08 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[macOS]]></category>
		<guid isPermaLink="false">http://d.akinori.org/?p=3114</guid>

					<description><![CDATA[<p>一般的に、Mac OS Xで「Wi-Fi接続をトリガーに（SSIDに応じて）何かを実行する」というのは容易に書ける。今回は、au Wi-Fiが提供するアクセスポイントに接続した際にすかさずau Wi-Fi接続ツールを起動… <span class="read-more"><a href="https://d.akinori.org/2014/05/02/macbook%e3%81%a7au-wi-fi%e3%82%92%e6%8b%be%e3%81%a3%e3%81%9f%e3%82%89%e6%8e%a5%e7%b6%9a%e3%83%84%e3%83%bc%e3%83%ab%e3%82%92%e8%b5%b7%e5%8b%95%e3%81%99%e3%82%8b/">続きを読む &#187;</a></span></p>
<p>The post <a href="https://d.akinori.org/2014/05/02/macbook%e3%81%a7au-wi-fi%e3%82%92%e6%8b%be%e3%81%a3%e3%81%9f%e3%82%89%e6%8e%a5%e7%b6%9a%e3%83%84%e3%83%bc%e3%83%ab%e3%82%92%e8%b5%b7%e5%8b%95%e3%81%99%e3%82%8b/">MacBookでau Wi-Fi接続ツールを自動起動する</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->

» 関連記事 «<ul>
<li><a href="https://d.akinori.org/2006/05/30/20060530p03/" rel="bookmark" title="携帯電話のアドレス帳同期について(3)">携帯電話のアドレス帳同期について(3)</a></li>
<li><a href="https://d.akinori.org/2012/01/02/%e3%82%bf%e3%83%bc%e3%83%9f%e3%83%8a%e3%83%ab%e3%81%aeemacs%e3%81%a7%e3%82%82%e7%89%b9%e6%ae%8a%e3%82%ad%e3%83%bc%e3%82%b3%e3%83%b3%e3%83%9c/" rel="bookmark" title="ターミナルのEmacsでも特殊キーコンボ">ターミナルのEmacsでも特殊キーコンボ</a></li>
<li><a href="https://d.akinori.org/2007/07/03/20070703p01/" rel="bookmark" title="Making Ctrl+W a tad smarter">Making Ctrl+W a tad smarter</a></li>
</ul>
</div>
]]></description>
										<content:encoded><![CDATA[<p>一般的に、Mac OS Xで「Wi-Fi接続をトリガーに（SSIDに応じて）何かを実行する」というのは容易に書ける。今回は、au Wi-Fiが提供するアクセスポイントに接続した際にすかさず<a title="au Wi-Fi接続ツール" href="http://www.au.kddi.com/iphone/service/app/wifi/">au Wi-Fi接続ツール</a>を起動するという機構を実現してみた。<br />
まずは、SSIDを判定してアプリを起動するスクリプトを書く。もちろん、shが苦手なら他の言語でも良い。</p><pre class="urvanov-syntax-highlighter-plain-tag">#!/bin/sh

ssid="$(/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | awk '$1=="SSID:"{print $2}')"

case "$ssid" in
  au_Wi-Fi|Wi2_club|Wi2premium_club|UQ_Wi-Fi|Wi2|Wi2premium|wifi_square|'[wi2]')
    app='au Wi-Fi接続ツール'
        killall -s "$app" &gt;/dev/null 2&gt;&amp;1 || open -ga "$app"
        ;;
esac</pre><p>細かいテクニックとして、<code>killall -s</code>でアプリが起動しているかをチェックし、<code>open -g</code>で前面に出てきてフォーカスを奪うのを抑制している。いきなりopenしてもよさそうだが、<code>-g</code>が利かないアプリもあるので一般的にこうするのが望ましい。<br />
さて、このスクリプトをcronに登録して定期実行しても動くといえば動くが、もうちょっとスマートな方法を考えよう。Unix系OSでは、ネットワークの接続・切断時には特定の設定ファイルが更新されることが多い。OS X 10.9の場合は、昔ながらの<code>/etc/resolv.conf</code>（実体は<code>/var/run/resolv.conf</code>）を含め、3つほどのファイルが、ネットワーク環境の変化に応じて更新されるようだ。<br />
そして、OS Xにはファイルの更新を検知する機構が備わっており、launchd(8)を使えば一般ユーザでも手軽に更新をトリガーに何かを実行するということが可能だ。<br />
つまり、こんなplistを書けば良い。（ホームディレクトリのパスは各自要修正）</p><pre class="urvanov-syntax-highlighter-plain-tag">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
&lt;plist version="1.0"&gt;
&lt;dict&gt;
    &lt;key&gt;Label&lt;/key&gt;
    &lt;string&gt;org.idaemons.wifido&lt;/string&gt;
    &lt;key&gt;LowPriorityIO&lt;/key&gt;
    &lt;true/&gt;
    &lt;key&gt;ProgramArguments&lt;/key&gt;
    &lt;array&gt;
        &lt;string&gt;/Users/knu/bin/wifidoit&lt;/string&gt;
    &lt;/array&gt;
    &lt;key&gt;RunAtLoad&lt;/key&gt;
    &lt;true/&gt;
    &lt;key&gt;WatchPaths&lt;/key&gt;
    &lt;array&gt;
        &lt;string&gt;/var/run/resolv.conf&lt;/string&gt;
        &lt;string&gt;/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist&lt;/string&gt;
        &lt;string&gt;/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist&lt;/string&gt;
    &lt;/array&gt;
&lt;/dict&gt;
&lt;/plist&gt;</pre><p>あとは、launchdに登録すれば完了。</p><pre class="urvanov-syntax-highlighter-plain-tag">% launchctl load -w ~/Library/LaunchAgents/org.idaemons.wifido.plist</pre><p>これで、対応アクセスポイントにつながるや否や、接続ツールが起動して認証され、Wi-Fiが使えるようになるはず。<br />
うまく動いたら、他の接続サービスでも同様にするとか、特定のSSIDのときだけdaemonを起動するとか、応用してみよう。</p>
<p>The post <a href="https://d.akinori.org/2014/05/02/macbook%e3%81%a7au-wi-fi%e3%82%92%e6%8b%be%e3%81%a3%e3%81%9f%e3%82%89%e6%8e%a5%e7%b6%9a%e3%83%84%e3%83%bc%e3%83%ab%e3%82%92%e8%b5%b7%e5%8b%95%e3%81%99%e3%82%8b/">MacBookでau Wi-Fi接続ツールを自動起動する</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->
<p>» 関連記事 «</p><ul>
<li><a href="https://d.akinori.org/2006/05/30/20060530p03/" rel="bookmark" title="携帯電話のアドレス帳同期について(3)">携帯電話のアドレス帳同期について(3)</a></li>
<li><a href="https://d.akinori.org/2012/01/02/%e3%82%bf%e3%83%bc%e3%83%9f%e3%83%8a%e3%83%ab%e3%81%aeemacs%e3%81%a7%e3%82%82%e7%89%b9%e6%ae%8a%e3%82%ad%e3%83%bc%e3%82%b3%e3%83%b3%e3%83%9c/" rel="bookmark" title="ターミナルのEmacsでも特殊キーコンボ">ターミナルのEmacsでも特殊キーコンボ</a></li>
<li><a href="https://d.akinori.org/2007/07/03/20070703p01/" rel="bookmark" title="Making Ctrl+W a tad smarter">Making Ctrl+W a tad smarter</a></li>
</ul>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://d.akinori.org/2014/05/02/macbook%e3%81%a7au-wi-fi%e3%82%92%e6%8b%be%e3%81%a3%e3%81%9f%e3%82%89%e6%8e%a5%e7%b6%9a%e3%83%84%e3%83%bc%e3%83%ab%e3%82%92%e8%b5%b7%e5%8b%95%e3%81%99%e3%82%8b/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>&#8220;z&#8221;のfork「knu-z」v2.0をリリース</title>
		<link>https://d.akinori.org/2013/03/06/z%e3%81%aefork%e3%80%8cknu-z%e3%80%8dv2-0%e3%82%92%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9/</link>
					<comments>https://d.akinori.org/2013/03/06/z%e3%81%aefork%e3%80%8cknu-z%e3%80%8dv2-0%e3%82%92%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9/#respond</comments>
		
		<dc:creator><![CDATA[Akinori]]></dc:creator>
		<pubDate>Wed, 06 Mar 2013 13:21:55 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[z]]></category>
		<category><![CDATA[zsh]]></category>
		<guid isPermaLink="false">http://d.akinori.org/?p=3012</guid>

					<description><![CDATA[<p>「賢いcd」&#8221;z&#8220;の俺版fork「knu-z」v2.0をリリースしました（英語版記事）。 オリジナル版をいじっているうちに修正箇所がたくさん見つかり、直しすぎて個別にpull requestするこ… <span class="read-more"><a href="https://d.akinori.org/2013/03/06/z%e3%81%aefork%e3%80%8cknu-z%e3%80%8dv2-0%e3%82%92%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9/">続きを読む &#187;</a></span></p>
<p>The post <a href="https://d.akinori.org/2013/03/06/z%e3%81%aefork%e3%80%8cknu-z%e3%80%8dv2-0%e3%82%92%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9/">&#8220;z&#8221;のfork「knu-z」v2.0をリリース</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->

» 関連記事 «<ul>
<li><a href="https://d.akinori.org/2004/04/23/20040423p02/" rel="bookmark" title="zshのホスト名補完強化">zshのホスト名補完強化</a></li>
<li><a href="https://d.akinori.org/2007/01/17/20070117p02/" rel="bookmark" title="zshのglobal alias">zshのglobal alias</a></li>
<li><a href="https://d.akinori.org/2007/07/03/20070703p01/" rel="bookmark" title="Making Ctrl+W a tad smarter">Making Ctrl+W a tad smarter</a></li>
</ul>
</div>
]]></description>
										<content:encoded><![CDATA[<p>「賢いcd」&#8221;<a title="rupa/z · GitHub" href="https://github.com/rupa/z">z</a>&#8220;の俺版fork「<a title="knu/z · GitHub" href="https://github.com/knu/z">knu-z</a>」v2.0をリリースしました（<a href="http://blog.akinori.org/2013/03/06/knu-z-v2-0-released-a-fork-of-z-a-better-cd/">英語版記事</a>）。</p>
<p>オリジナル版をいじっているうちに修正箇所がたくさん見つかり、直しすぎて個別にpull requestすることが困難になり、途中で作者のrupaさんにはforkの存在とそこそこ詳細な変更点リストをメールしたんだけど時すでに遅し。ほかにもforkがたくさんありすぎてうんざりだったかも。とはいえbashの補完は壊れているしzshの補完も古くて（compsys）いまいちだし、というわけでフィードバックについては気にせずにコアのアルゴリズム部以外を大幅に書き直しました。</p>
<p>ついでにcdの補完候補にzのスタック（ディレクトリ移動履歴に基づいてスコアリングされたディレクトリリスト）を含めるようにしたので、「zが使えるホストでだけzを使う」とか、「通常の移動はcd<sup><a href="https://d.akinori.org/2013/03/06/z%e3%81%aefork%e3%80%8cknu-z%e3%80%8dv2-0%e3%82%92%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9/#footnote_0_3012" id="identifier_0_3012" class="footnote-link footnote-identifier-link" title="cdはCDPATHを見るとか-に戻れるとかcdable_varsとかいろいろ特徴があるのでzだけでは済まない。">1</a></sup>、よく行くところへの移動はz」なんていう悲しい使い分けは不要になりました。普通にcdを使っていれば、zが有効なら補完候補の上位によく行くディレクトリが現れるという空気のような存在です。</p>
<p>ただし、bashでは補完候補の出現順序を制御する方法がない<sup><a href="https://d.akinori.org/2013/03/06/z%e3%81%aefork%e3%80%8cknu-z%e3%80%8dv2-0%e3%82%92%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9/#footnote_1_3012" id="identifier_1_3012" class="footnote-link footnote-identifier-link" title="よね？あったら教えて。compopt -o nosortとかあればいいのに。">2</a></sup>ため、cdにおいてはマッチするディレクトリがないときだけzのスタックから補完します。（常に含めてしまうと、辞書順ソートのおかげでうざいことになる）<br />
ていうかzshを使えばいいと思います。</p>
<p>インストールは<code>~/.bashrc</code>や<code>~/.zshrc</code>に一行足すだけなので、<a title="README" href="https://github.com/knu/z#readme">README</a>を読んで使ってみて。</p>
<ol class="footnotes"><li id="footnote_0_3012" class="footnote">cdは<code>CDPATH</code>を見るとか<code>-</code>に戻れるとか<code>cdable_vars</code>とかいろいろ特徴があるのでzだけでは済まない。</li><li id="footnote_1_3012" class="footnote">よね？あったら教えて。<code>compopt -o nosort</code>とかあればいいのに。</li></ol><p>The post <a href="https://d.akinori.org/2013/03/06/z%e3%81%aefork%e3%80%8cknu-z%e3%80%8dv2-0%e3%82%92%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9/">&#8220;z&#8221;のfork「knu-z」v2.0をリリース</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->
<p>» 関連記事 «</p><ul>
<li><a href="https://d.akinori.org/2004/04/23/20040423p02/" rel="bookmark" title="zshのホスト名補完強化">zshのホスト名補完強化</a></li>
<li><a href="https://d.akinori.org/2007/01/17/20070117p02/" rel="bookmark" title="zshのglobal alias">zshのglobal alias</a></li>
<li><a href="https://d.akinori.org/2007/07/03/20070703p01/" rel="bookmark" title="Making Ctrl+W a tad smarter">Making Ctrl+W a tad smarter</a></li>
</ul>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://d.akinori.org/2013/03/06/z%e3%81%aefork%e3%80%8cknu-z%e3%80%8dv2-0%e3%82%92%e3%83%aa%e3%83%aa%e3%83%bc%e3%82%b9/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Safari 6でRSSビューア機能が削られた</title>
		<link>https://d.akinori.org/2012/07/29/safari-6%e3%81%a7rss%e3%83%93%e3%83%a5%e3%83%bc%e3%82%a2%e6%a9%9f%e8%83%bd%e3%81%8c%e5%89%8a%e3%82%89%e3%82%8c%e3%81%9f/</link>
					<comments>https://d.akinori.org/2012/07/29/safari-6%e3%81%a7rss%e3%83%93%e3%83%a5%e3%83%bc%e3%82%a2%e6%a9%9f%e8%83%bd%e3%81%8c%e5%89%8a%e3%82%89%e3%82%8c%e3%81%9f/#respond</comments>
		
		<dc:creator><![CDATA[Akinori]]></dc:creator>
		<pubDate>Sun, 29 Jul 2012 00:20:24 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[macOS]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[Safari]]></category>
		<guid isPermaLink="false">http://d.akinori.org/?p=2980</guid>

					<description><![CDATA[<p>LionでSafariを6に上げたら、RSSフィードを扱えなくなっていた。Mountain LionのSafari 6もやはり同じだった。RSSのURLを開くと、それなりのスタイルを当ててブラウザ内に表示してくれるのが便… <span class="read-more"><a href="https://d.akinori.org/2012/07/29/safari-6%e3%81%a7rss%e3%83%93%e3%83%a5%e3%83%bc%e3%82%a2%e6%a9%9f%e8%83%bd%e3%81%8c%e5%89%8a%e3%82%89%e3%82%8c%e3%81%9f/">続きを読む &#187;</a></span></p>
<p>The post <a href="https://d.akinori.org/2012/07/29/safari-6%e3%81%a7rss%e3%83%93%e3%83%a5%e3%83%bc%e3%82%a2%e6%a9%9f%e8%83%bd%e3%81%8c%e5%89%8a%e3%82%89%e3%82%8c%e3%81%9f/">Safari 6でRSSビューア機能が削られた</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->

» 関連記事 «<ul>
<li><a href="https://d.akinori.org/2007/10/30/20071030p01/" rel="bookmark" title="Leopardでまだ使えないもの">Leopardでまだ使えないもの</a></li>
<li><a href="https://d.akinori.org/2014/05/02/macbook%e3%81%a7au-wi-fi%e3%82%92%e6%8b%be%e3%81%a3%e3%81%9f%e3%82%89%e6%8e%a5%e7%b6%9a%e3%83%84%e3%83%bc%e3%83%ab%e3%82%92%e8%b5%b7%e5%8b%95%e3%81%99%e3%82%8b/" rel="bookmark" title="MacBookでau Wi-Fi接続ツールを自動起動する">MacBookでau Wi-Fi接続ツールを自動起動する</a></li>
</ul>
</div>
]]></description>
										<content:encoded><![CDATA[<p>LionでSafariを6に上げたら、RSSフィードを扱えなくなっていた。Mountain LionのSafari 6もやはり同じだった。RSSのURLを開くと、それなりのスタイルを当ててブラウザ内に表示してくれるのが便利だったんだけど、外部アプリケーションが呼び出されてしまう。そして、大方のフィードハンドラアプリは「購読」するかを聞いてきてうっとうしい。その場でフィードの中身を見たいだけなのに。</p>
<p>さらにうっとうしいのは、私の環境の場合はなぜかThunderbirdが起動されることだった。というのも、Thunderbirdは確かにフィードリーダ機能を持つはずなんだが、Safariから起動されても何も起きないのだ。</p>
<p>というわけでフィードリーダを変更する必要があるのだが、Safariの環境設定画面からはRSS タブが消えていて、フィードリーダを選択することができない。困った！</p>
<p>そこで<a href="http://www.rubicode.com/Software/RCDefaultApp/">RCDefaultApp</a>（<a href="http://www.macupdate.com/app/mac/14618/rcdefaultapp/">MacUpdate</a>, <a href="http://download.cnet.com/RCDefaultApp/3000-2248_4-10676257.html">CNET Download</a>）ですよ。こいつは各種ファイルタイプ、URLスキーム、MIMEタイプなどに対応するアプリケーションを個別選択できるシステム環境変数ペインで、こいつでRSSハンドラを変更すればOK。</p>
<p>とりあえず安定のFirefoxにした。Firefoxはフィードの内容を表示しつつ、そこから一発で他のアプリやGoogle Readerなどのサービスで「購読」できるようになっていて完璧だ。</p>
<p style="text-align: center;"><a href="http://d.akinori.org/wp-content/uploads/2012/07/1c8d526d4f32df3e14bc8100d41ce52a.png"><img decoding="async" src="http://d.akinori.org/wp-content/uploads/2012/07/1c8d526d4f32df3e14bc8100d41ce52a-300x210.png" alt="デフォルトアプリケーション（RCDefaultApp）" title="デフォルトアプリケーション（RCDefaultApp）" width="300" height="210" class="size-medium wp-image-2981  aligncenter" srcset="https://d.akinori.org/wp-content/uploads/2012/07/1c8d526d4f32df3e14bc8100d41ce52a-300x210.png 300w, https://d.akinori.org/wp-content/uploads/2012/07/1c8d526d4f32df3e14bc8100d41ce52a.png 782w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>SafariからRSS対応が削られたのは、「通知」への移行を見ているんだろうけども、Lionは通知センターがないので中途半端で困るよなあ。</p>
<p>The post <a href="https://d.akinori.org/2012/07/29/safari-6%e3%81%a7rss%e3%83%93%e3%83%a5%e3%83%bc%e3%82%a2%e6%a9%9f%e8%83%bd%e3%81%8c%e5%89%8a%e3%82%89%e3%82%8c%e3%81%9f/">Safari 6でRSSビューア機能が削られた</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->
<p>» 関連記事 «</p><ul>
<li><a href="https://d.akinori.org/2007/10/30/20071030p01/" rel="bookmark" title="Leopardでまだ使えないもの">Leopardでまだ使えないもの</a></li>
<li><a href="https://d.akinori.org/2014/05/02/macbook%e3%81%a7au-wi-fi%e3%82%92%e6%8b%be%e3%81%a3%e3%81%9f%e3%82%89%e6%8e%a5%e7%b6%9a%e3%83%84%e3%83%bc%e3%83%ab%e3%82%92%e8%b5%b7%e5%8b%95%e3%81%99%e3%82%8b/" rel="bookmark" title="MacBookでau Wi-Fi接続ツールを自動起動する">MacBookでau Wi-Fi接続ツールを自動起動する</a></li>
</ul>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://d.akinori.org/2012/07/29/safari-6%e3%81%a7rss%e3%83%93%e3%83%a5%e3%83%bc%e3%82%a2%e6%a9%9f%e8%83%bd%e3%81%8c%e5%89%8a%e3%82%89%e3%82%8c%e3%81%9f/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>git mergetoolでEmacsのediff-merge-files-with-ancestorを呼び出す</title>
		<link>https://d.akinori.org/2012/07/23/git-mergetool%e3%81%a7emacs%e3%81%aeediff-merge-files-with-ancestor%e3%82%92%e5%91%bc%e3%81%b3%e5%87%ba%e3%81%99/</link>
					<comments>https://d.akinori.org/2012/07/23/git-mergetool%e3%81%a7emacs%e3%81%aeediff-merge-files-with-ancestor%e3%82%92%e5%91%bc%e3%81%b3%e5%87%ba%e3%81%99/#respond</comments>
		
		<dc:creator><![CDATA[Akinori]]></dc:creator>
		<pubDate>Mon, 23 Jul 2012 12:07:23 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[git]]></category>
		<guid isPermaLink="false">http://d.akinori.org/?p=2968</guid>

					<description><![CDATA[<p>git mergetoolに使えるツールとして、デフォルトで"emerge"というのが用意されており、Emacs使いはこれを使えばEmergeでマージが行えるわけだが、難点もある。ひとつは、新たなEmacsインスタンスを… <span class="read-more"><a href="https://d.akinori.org/2012/07/23/git-mergetool%e3%81%a7emacs%e3%81%aeediff-merge-files-with-ancestor%e3%82%92%e5%91%bc%e3%81%b3%e5%87%ba%e3%81%99/">続きを読む &#187;</a></span></p>
<p>The post <a href="https://d.akinori.org/2012/07/23/git-mergetool%e3%81%a7emacs%e3%81%aeediff-merge-files-with-ancestor%e3%82%92%e5%91%bc%e3%81%b3%e5%87%ba%e3%81%99/">git mergetoolでEmacsのediff-merge-files-with-ancestorを呼び出す</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->

» 関連記事 «<ul>
<li><a href="https://d.akinori.org/2004/05/12/20040512p04/" rel="bookmark" title="tDiary &#8211; tdiary-mode-hook">tDiary &#8211; tdiary-mode-hook</a></li>
<li><a href="https://d.akinori.org/2004/12/25/20041225p02/" rel="bookmark" title="xyzzy / mcalc">xyzzy / mcalc</a></li>
<li><a href="https://d.akinori.org/2007/10/23/20071023p02/" rel="bookmark" title="vc-svk.elが遅い">vc-svk.elが遅い</a></li>
</ul>
</div>
]]></description>
										<content:encoded><![CDATA[<p><code>git mergetool</code>に使えるツールとして、デフォルトで<code>"emerge"</code>というのが用意されており、Emacs使いはこれを使えばEmergeでマージが行えるわけだが、難点もある。ひとつは、新たなEmacsインスタンスを起動してしまうということだ。起動に無駄な時間が掛かるし、マージにあたって既存のセッションで開いているファイルをその場で参照できないのは不便だろう。もっとも、これは<code>emacsclient</code>を使うようにして、Emergeの呼び出し方を少し直せば済む。もうひとつは、EmergeではなくよりモダンなEdiffを使いたいということだが、これは思ったほど簡単ではないのでわざわざこうして記事を書くことになった。</p>
<p>というのも、Emergeには<code>emerge-files-with-ancestor-command</code>という便利なものがあり、「マージが終わったらマージ結果を保存して即終了」ということが一発で出来てしまうのだが、Ediffの方にはそういうものがない。こいつはマージを終了してもろくに片付けもせず、全部ほったらかしという行儀の悪さだ。<br />
そういうわけで、まずはEdiffの<code>ediff-merge-{files,buffers}</code>が終わったら起動前のウィンドウ設定を復元するようにしてみる。これは比較的簡単。<em>[2013-01-23改訂:フックにappendフラグを指定]</em></p><pre class="urvanov-syntax-highlighter-plain-tag">(eval-after-load "ediff"
  '(progn
     ; save and restore window configuration
     (defvar my-ediff-saved-window-configuration nil "Saved window configuration for ediff")
     (defun my-ediff-save-window-configuration ()
       (setq my-ediff-saved-window-configuration (current-window-configuration)))
     (add-hook 'ediff-before-setup-hook 'my-ediff-save-window-configuration)
     (defun my-ediff-restore-window-configuration ()
       (set-window-configuration my-ediff-saved-window-configuration))
     (add-hook 'ediff-suspend-hook 'my-ediff-restore-window-configuration t)
     (add-hook 'ediff-quit-hook 'my-ediff-restore-window-configuration t)))</pre><p>次に、Ediffが新たに開いたファイルのバッファをマージ終了時に自動的に閉じる、および、マージ終了時に自動的にセーブしつつEmacsフレームを閉じる「バッチ版<code>ediff-merge-files-with-ancestor</code>」を加える。<em>[2013-01-23改訂:ediff-filesに影響を与えるなどおかしかったので大幅修正; 続きは<a href="https://github.com/knu/emacsc">GitHub</a>で]</em></p><pre class="urvanov-syntax-highlighter-plain-tag">(eval-after-load "ediff"
  '(progn
     ; batch mode (for use from git mergetool etc.)
     (ediff-defvar-local my-ediff-batch-mode-p nil "True if in batch mode")
     (ediff-defvar-local my-ediff-close-on-quit nil "True if the buffer should be closed on quit.")

     (defun my-ediff-batch-mode (&amp;optional mode)
       (ediff-with-current-buffer ediff-buffer-A
                                  (case mode
                                    (set
                                     (setq my-ediff-batch-mode-p t))
                                    (unset
                                     (prog1 my-ediff-batch-mode-p
                                       (setq my-ediff-batch-mode-p nil)))
                                    (t
                                     my-ediff-batch-mode-p))))

     (defadvice ediff-find-file (around
                                 mark-newly-opened-buffers
                                 (file-var buffer-name &amp;optional last-dir hooks-var)
                                 activate)
       (let* ((file (symbol-value file-var))
              (existing-p (and find-file-existing-other-name
                               (find-buffer-visiting file))))
         ad-do-it
         (or existing-p
             (ediff-with-current-buffer (symbol-value buffer-name)
                                        (setq my-ediff-close-on-quit t)))))

     (defun my-ediff-save-merge ()
       (if (my-ediff-batch-mode)
           (let ((file ediff-merge-store-file))
             (if file
                 (ediff-with-current-buffer ediff-buffer-C
                   (set-visited-file-name file t)
                   (save-buffer))))
         (ediff-maybe-save-and-delete-merge)))

     (remove-hook 'ediff-quit-merge-hook 'ediff-maybe-save-and-delete-merge)
     (add-hook 'ediff-quit-merge-hook 'my-ediff-save-merge)

     (defadvice ediff-cleanup-mess (around
                                    support-batch-mode
                                    ()
                                    activate)
       (let ((batch-p (my-ediff-batch-mode 'unset))
             (buffers (list ediff-buffer-A ediff-buffer-B ediff-ancestor-buffer))
             (buffer-C ediff-buffer-C))
         ad-do-it
         (dolist (buffer buffers)
           (ediff-with-current-buffer buffer
             (and my-ediff-close-on-quit (kill-buffer))))
         (when batch-p
           (ediff-kill-buffer-carefully buffer-C)
           (delete-frame))))

     (defun ediff-merge-files-with-ancestor-in-batch-mode
       (file-A file-B file-ancestor &amp;optional startup-hooks merge-buffer-file)
       (ediff-merge-files-with-ancestor
        file-A file-B file-ancestor
        (cons (function (lambda () (my-ediff-batch-mode 'set))) startup-hooks)
        merge-buffer-file))))

(autoload 'ediff-merge-files-with-ancestor-in-batch-mode "ediff")</pre><p>これで、<code>~/.gitconfig</code>にこんな風に書けば<code>git mergetool</code>で瞬時にEdiffが起動し、マージが済んだら<kbd>q</kbd>, <kbd>y</kbd>で即コマンドラインに帰ってくる。既存Emacsセッションにゴミバッファも残らない。</p><pre class="urvanov-syntax-highlighter-plain-tag">[merge]
	tool = ediff
[mergetool "ediff"]
	cmd = emacsclient -a \"\" -t -e \"(ediff-merge-files-with-ancestor-in-batch-mode \\\"$LOCAL\\\" \\\"$REMOTE\\\" \\\"$BASE\\\" nil \\\"$MERGED\\\")\"</pre><p>あとは、たとえばラッパースクリプトを用意して、「<code>&lt;&lt;&lt;&lt;&lt;&lt;&lt;</code>」などの行が残っていたらマージ失敗とするとか、好きに改良すると良い。</p>
<h3>参考記事</h3>
<ul>
<li><a href="http://stackoverflow.com/questions/1817370/using-ediff-as-git-mergetool">emacs &#8211; Using ediff as git mergetool &#8211; Stack Overflow</a></li>
</ul>
<p>The post <a href="https://d.akinori.org/2012/07/23/git-mergetool%e3%81%a7emacs%e3%81%aeediff-merge-files-with-ancestor%e3%82%92%e5%91%bc%e3%81%b3%e5%87%ba%e3%81%99/">git mergetoolでEmacsのediff-merge-files-with-ancestorを呼び出す</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->
<p>» 関連記事 «</p><ul>
<li><a href="https://d.akinori.org/2004/05/12/20040512p04/" rel="bookmark" title="tDiary &#8211; tdiary-mode-hook">tDiary &#8211; tdiary-mode-hook</a></li>
<li><a href="https://d.akinori.org/2004/12/25/20041225p02/" rel="bookmark" title="xyzzy / mcalc">xyzzy / mcalc</a></li>
<li><a href="https://d.akinori.org/2007/10/23/20071023p02/" rel="bookmark" title="vc-svk.elが遅い">vc-svk.elが遅い</a></li>
</ul>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://d.akinori.org/2012/07/23/git-mergetool%e3%81%a7emacs%e3%81%aeediff-merge-files-with-ancestor%e3%82%92%e5%91%bc%e3%81%b3%e5%87%ba%e3%81%99/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Emacsの範囲選択UIを大幅拡張してくれるcua-mode</title>
		<link>https://d.akinori.org/2012/06/14/emacs%e3%81%ae%e7%af%84%e5%9b%b2%e9%81%b8%e6%8a%9eui%e3%82%92%e5%a4%a7%e5%b9%85%e6%8b%a1%e5%bc%b5%e3%81%97%e3%81%a6%e3%81%8f%e3%82%8c%e3%82%8bcua-mode/</link>
					<comments>https://d.akinori.org/2012/06/14/emacs%e3%81%ae%e7%af%84%e5%9b%b2%e9%81%b8%e6%8a%9eui%e3%82%92%e5%a4%a7%e5%b9%85%e6%8b%a1%e5%bc%b5%e3%81%97%e3%81%a6%e3%81%8f%e3%82%8c%e3%82%8bcua-mode/#respond</comments>
		
		<dc:creator><![CDATA[Akinori]]></dc:creator>
		<pubDate>Wed, 13 Jun 2012 18:47:38 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[Emacs]]></category>
		<guid isPermaLink="false">http://d.akinori.org/?p=2934</guid>

					<description><![CDATA[<p>Emacsのcua-modeを使っていない、あるいはそもそも知らない人が結構いるようなので紹介しておく。cua-modeは、Emacsの範囲選択にまつわるUIを改善し、Windows、Mac、GTK+/Qtなどにおけるテ… <span class="read-more"><a href="https://d.akinori.org/2012/06/14/emacs%e3%81%ae%e7%af%84%e5%9b%b2%e9%81%b8%e6%8a%9eui%e3%82%92%e5%a4%a7%e5%b9%85%e6%8b%a1%e5%bc%b5%e3%81%97%e3%81%a6%e3%81%8f%e3%82%8c%e3%82%8bcua-mode/">続きを読む &#187;</a></span></p>
<p>The post <a href="https://d.akinori.org/2012/06/14/emacs%e3%81%ae%e7%af%84%e5%9b%b2%e9%81%b8%e6%8a%9eui%e3%82%92%e5%a4%a7%e5%b9%85%e6%8b%a1%e5%bc%b5%e3%81%97%e3%81%a6%e3%81%8f%e3%82%8c%e3%82%8bcua-mode/">Emacsの範囲選択UIを大幅拡張してくれるcua-mode</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->

» 関連記事 «<ul>
<li><a href="https://d.akinori.org/2007/07/03/20070703p01/" rel="bookmark" title="Making Ctrl+W a tad smarter">Making Ctrl+W a tad smarter</a></li>
<li><a href="https://d.akinori.org/2004/11/30/20041130p02/" rel="bookmark" title="xyzzyイイ">xyzzyイイ</a></li>
<li><a href="https://d.akinori.org/2012/04/25/emacs-kill-region-or-backward-kill-word/" rel="bookmark" title="Emacs: kill-region-or-backward-kill-word">Emacs: kill-region-or-backward-kill-word</a></li>
</ul>
</div>
]]></description>
										<content:encoded><![CDATA[<p>Emacsの<code>cua-mode</code>を使っていない、あるいはそもそも知らない人が結構いるようなので紹介しておく。<code>cua-mode</code>は、Emacsの範囲選択にまつわるUIを改善し、Windows、Mac、GTK+/Qtなどにおけるテキスト編集操作との互換性も高めてくれるグローバルマイナーモードで、以下のような機能を提供する。</p>
<ul>
<li><code>Shift</code>+矢印による範囲選択</li>
<li>範囲選択状態で<code>BS</code>/<code>DEL</code>を押すと選択範囲をまるごと消去</li>
<li>範囲選択状態でキー入力やペーストを行うと選択範囲まるごと上書きされる</li>
<li>視覚化された矩形範囲選択モード（<code>C-w</code>, <code>M-w</code>, <code>C-y</code>など通常の範囲選択と同様の操作性）</li>
<li>矩形範囲選択モードでの複数行同時操作（文字入力、文字削除、連番挿入等）</li>
<li>Windows互換の<code>Ctrl</code>+<code>Z</code>,<code>X</code>,<code>C</code>,<code>V</code>（※）</li>
</ul>
<p>Emacs 22.1.1から標準添付されているので、試したければ何も設定せずに<code>M-x cua-mode</code>で使える。上記のうち最後の機能は率直に言って邪魔なのだが、これはWindowsから来た人をターゲットに据えた本モードの目玉機能のようで、デフォルトでオンになっている。ために、Emacsに慣れた人ほど、少し触ったところで戸惑いを感じて敬遠しがちなのが残念なところ。<br />
この<code>cua-mode</code>を起動時から有効化するには、<code>M-x customize-group RET cua RET</code>としてcustomize画面に入り、&#8221;Cua Mode&#8221;を&#8221;on&#8221;にする。私のように上記※が不要だと思う人は&#8221;Cua Enable Cua Keys&#8221;を&#8221;Disabled&#8221;にして、&#8221;Set for current session&#8221;を押す。これで<code>cua-mode</code>が（一時的に）有効な状態になるので、他のバッファで挙動を確認してみよう。満足したら、customizeバッファに戻って&#8221;Save for future sessions&#8221;を押せば恒久保存される。<br />
さて、<code>Shift</code>+矢印による範囲選択を試してみただろうか。GUI上のEmacsで動くのは当然として、xterm互換ターミナル上のEmacsでも動くのには軽い感動を覚えたかもしれない。ただし、Emacsのバグで、<code>S-left</code>, <code>S-right</code>, <code>S-down</code>は動くのになぜか<code>S-up</code>だけは期待通り動作せず、<code>select</code>キーとして認識されてしまう。これは以下のようなコードで期待通り動くようになる。(ついでに<code>end</code>キーがおかしいのも直している)</p><pre class="urvanov-syntax-highlighter-plain-tag">(defadvice terminal-init-xterm (after fix-some-keys activate)
  (define-key input-decode-map "\e[1;2A" [S-up])
  (define-key input-decode-map "\e[4~" [end]))</pre><p>ところで、矩形選択モードのトグルキーはデフォルトでは<code>C-RET</code>だが、私は<code>cua-toggle-global-mark</code>の方に割り当てられている<code>C-S-SPC</code>に変更している。これは、先のカスタマイズ画面で&#8221;Cua Rectangle Mark Key&#8221;を<code>C-S-SPC</code>に設定（入力欄で<code>C-q</code>を押してから設定したいキーコンボを押すのが楽）して保存すれば済むはずだが、cuaの初期化フローがおかしいため、以下のコードも必要のようだ。</p><pre class="urvanov-syntax-highlighter-plain-tag">(define-key cua-global-keymap cua-rectangle-mark-key 'cua-set-rectangle-mark)</pre><p><code>cua-toggle-global-mark</code>の方は、カスタマイズ変数がないので以下のようにコードを書いて<code>C-&gt;</code>に設定している。</p><pre class="urvanov-syntax-highlighter-plain-tag">(define-key cua-global-keymap (kbd "C-&gt;") 'cua-toggle-global-mark)</pre><p></p>
<p>なお、<code>C-RET</code>, <code>C-S-SPC</code>, <code>C-&gt;</code>などの特殊キーコンボをターミナル上で使うためにはターミナルエミュレータの設定が必要なので、<a title="ターミナルのEmacsでも特殊キーコンボ" href="http://d.akinori.org/2012/01/02/%e3%82%bf%e3%83%bc%e3%83%9f%e3%83%8a%e3%83%ab%e3%81%aeemacs%e3%81%a7%e3%82%82%e7%89%b9%e6%ae%8a%e3%82%ad%e3%83%bc%e3%82%b3%e3%83%b3%e3%83%9c/">こちらの記事</a>を参考にされたい。<br />
というわけでおしまい、でもいいのだけれど、矩形選択モードで単語単位の移動ができないのはちょっと不便だと思う私はこんな設定を施している。</p><pre class="urvanov-syntax-highlighter-plain-tag">(eval-after-load "cua-rect"
  '(progn
     (defun cua-resize-rectangle-move-bol ()
       "Resize rectangle to the BOL."
       (interactive)
       (while (not (bolp)) (backward-char)))
     (defun cua-resize-rectangle-move-eol ()
       "Resize rectangle to the EOL."
       (interactive)
       (while (not (eolp)) (forward-char)))
     (defun cua-resize-rectangle-right-word (n)
       "Resize rectangle to the right word."
       (interactive "p")
       (if (&lt; n 0)
         (let ((pos (save-excursion (backward-word (- n)) (point))))
           (while (&lt; pos (point)) (backward-char)))
         (let ((pos (save-excursion (forward-word n) (point))))
           (while (&lt; (point) pos) (forward-char)))))
      (defun cua-resize-rectangle-left-word (n)
        "Resize rectangle to the left word."
        (interactive "p")
        (cua-resize-rectangle-right-word (- n)))
      (defadvice cua--init-rectangles
        (after custom-key-bindings () activate)
        (define-key cua--rectangle-keymap [remap move-end-of-line]         'cua-resize-rectangle-move-eol)
        (define-key cua--rectangle-keymap [remap move-beginning-of-line]   'cua-resize-rectangle-move-bol)
        (define-key cua--rectangle-keymap [remap forward-word]             'cua-resize-rectangle-right-word)
        (define-key cua--rectangle-keymap [remap backward-word]            'cua-resize-rectangle-left-word)
        (cua--rect-M/H-key ?B 'cua-blank-rectangle)
        (cua--rect-M/H-key ?b 'cua-resize-rectangle-left-word)
        (cua--rect-M/H-key ?F 'cua-fill-char-rectangle)
        (cua--rect-M/H-key ?f 'cua-resize-rectangle-right-word))))</pre><p>癖のあるモジュールだけど、がんばって飼い慣らして使いましょう。</p>
<p>The post <a href="https://d.akinori.org/2012/06/14/emacs%e3%81%ae%e7%af%84%e5%9b%b2%e9%81%b8%e6%8a%9eui%e3%82%92%e5%a4%a7%e5%b9%85%e6%8b%a1%e5%bc%b5%e3%81%97%e3%81%a6%e3%81%8f%e3%82%8c%e3%82%8bcua-mode/">Emacsの範囲選択UIを大幅拡張してくれるcua-mode</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->
<p>» 関連記事 «</p><ul>
<li><a href="https://d.akinori.org/2007/07/03/20070703p01/" rel="bookmark" title="Making Ctrl+W a tad smarter">Making Ctrl+W a tad smarter</a></li>
<li><a href="https://d.akinori.org/2004/11/30/20041130p02/" rel="bookmark" title="xyzzyイイ">xyzzyイイ</a></li>
<li><a href="https://d.akinori.org/2012/04/25/emacs-kill-region-or-backward-kill-word/" rel="bookmark" title="Emacs: kill-region-or-backward-kill-word">Emacs: kill-region-or-backward-kill-word</a></li>
</ul>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://d.akinori.org/2012/06/14/emacs%e3%81%ae%e7%af%84%e5%9b%b2%e9%81%b8%e6%8a%9eui%e3%82%92%e5%a4%a7%e5%b9%85%e6%8b%a1%e5%bc%b5%e3%81%97%e3%81%a6%e3%81%8f%e3%82%8c%e3%82%8bcua-mode/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ML110 G6の起動ディスクをSSDに変更</title>
		<link>https://d.akinori.org/2012/05/11/ml110-g6%e3%81%ae%e8%b5%b7%e5%8b%95%e3%83%87%e3%82%a3%e3%82%b9%e3%82%af%e3%82%92ssd%e3%81%ab%e5%a4%89%e6%9b%b4/</link>
					<comments>https://d.akinori.org/2012/05/11/ml110-g6%e3%81%ae%e8%b5%b7%e5%8b%95%e3%83%87%e3%82%a3%e3%82%b9%e3%82%af%e3%82%92ssd%e3%81%ab%e5%a4%89%e6%9b%b4/#respond</comments>
		
		<dc:creator><![CDATA[Akinori]]></dc:creator>
		<pubDate>Fri, 11 May 2012 10:55:23 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[eSATA]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[GEOM]]></category>
		<category><![CDATA[ML110 G6]]></category>
		<category><![CDATA[ZFS]]></category>
		<guid isPermaLink="false">http://d.akinori.org/?p=2889</guid>

					<description><![CDATA[<p>先に起動ディスクをHDDからUSBメモリに変更してからしばらく運用を続けていたところ、深刻な性能問題に直面してHDDに戻したのは先月のことだった。 定常的に書込が発生するディレクトリは当然ながら外出ししており、たまのma… <span class="read-more"><a href="https://d.akinori.org/2012/05/11/ml110-g6%e3%81%ae%e8%b5%b7%e5%8b%95%e3%83%87%e3%82%a3%e3%82%b9%e3%82%af%e3%82%92ssd%e3%81%ab%e5%a4%89%e6%9b%b4/">続きを読む &#187;</a></span></p>
<p>The post <a href="https://d.akinori.org/2012/05/11/ml110-g6%e3%81%ae%e8%b5%b7%e5%8b%95%e3%83%87%e3%82%a3%e3%82%b9%e3%82%af%e3%82%92ssd%e3%81%ab%e5%a4%89%e6%9b%b4/">ML110 G6の起動ディスクをSSDに変更</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->

» 関連記事 «<ul>
<li><a href="https://d.akinori.org/2011/10/27/ml110-g6%e3%81%ae%e8%b5%b7%e5%8b%95%e3%83%87%e3%82%a3%e3%82%b9%e3%82%af%e3%82%92usb%e3%83%a1%e3%83%a2%e3%83%aa%e3%81%ab%e5%a4%89%e6%9b%b4/" rel="bookmark" title="ML110 G6の起動ディスクをUSBメモリに変更">ML110 G6の起動ディスクをUSBメモリに変更</a></li>
<li><a href="https://d.akinori.org/2011/10/27/freebsd-on-ml110-g6%e3%82%92%e3%81%a1%e3%82%87%e3%81%a3%e3%81%a8%e3%83%81%e3%83%a5%e3%83%bc%e3%83%8b%e3%83%b3%e3%82%b0/" rel="bookmark" title="FreeBSD on ML110 G6をちょっとチューニング">FreeBSD on ML110 G6をちょっとチューニング</a></li>
<li><a href="https://d.akinori.org/2010/04/15/wd15ears%e3%81%ae%e6%80%a7%e8%83%bd%e3%82%92%e8%a8%88%e6%b8%ac/" rel="bookmark" title="WD15EARSの性能を計測">WD15EARSの性能を計測</a></li>
</ul>
</div>
]]></description>
										<content:encoded><![CDATA[<p>先に<a title="ML110 G6の起動ディスクをUSBメモリに変更" href="http://d.akinori.org/2011/10/27/ml110-g6%e3%81%ae%e8%b5%b7%e5%8b%95%e3%83%87%e3%82%a3%e3%82%b9%e3%82%af%e3%82%92usb%e3%83%a1%e3%83%a2%e3%83%aa%e3%81%ab%e5%a4%89%e6%9b%b4/">起動ディスクをHDDからUSBメモリに変更</a>してからしばらく運用を続けていたところ、深刻な性能問題に直面してHDDに戻したのは先月のことだった。<br />
定常的に書込が発生するディレクトリは当然ながら外出ししており、たまの<code>make installworld</code>くらいしかろくな書込が発生することはなかったにも関わらず、気が付くと、その<strong><code>make installworld</code>に8時間も掛かる</strong>ようになってしまっていた。<br />
単に、USBメモリ自体がずっと通電しての読み書き（書くのはまれだが）に耐えうる設計になっていないからなのか、特定部分へのアクセスが重なった結果へたってしまったのかはよくわからないが、ともかく常時稼働は荷が重かったということは言えるだろう。</p>
<p>HDDに戻したところたちまち安定して快適にはなったが、ただの撤退ではおもしろくないので、安くなってきたSSDを導入することにした。ちょうど、<a href="http://ck.jp.ap.valuecommerce.com/servlet/referral?sid=2698830&#038;pid=880955024&#038;vc_url=http%3A%2F%2Fshop.tsukumo.co.jp%2Fgoods%2F0649528752178%2F" target="_blank" ><img decoding="async" src="http://ad.jp.ap.valuecommerce.com/servlet/gifbanner?sid=2698830&#038;pid=880955024" height="1px" width="1px" border="0"/>Crucial m4 64GBが7,000円を切っている</a>ので、これを採用した。</p>
<p>さて、FreeBSDに限らないが、SSDを使う上で当然気になるのがTRIM命令のサポート有無である。FreeBSD 9.0や8.3ではadaドライバ、GEOM、UFS2がこれをサポートしており、シンプルな非冗長構成ではすんなりこれを享受できる。だが、ZFSは未サポート、さらにGEOMもmirrorやjournalを通すとUFS2がTRIM命令のサポート有無を検知できず無効になってしまうようだ。<br />
何とも残念な現状だが、システム（前述のように<code>/usr/local</code>, <code>/var</code>等は含まない）は書込がほとんど発生せず、また同居予定のZFS ZIL, L2ARCパーティションは多くの書込があるものの、冗長化した上でたまに片肺にしてTRIMすれば十分だと考えた。そして<code>/</code>のファイルシステムは、ZFSとUFS+GEOM mirrorを比較検討し、読み込み主体であることと、先にTRIMがサポートされそうなことから後者にした。信頼性を重視し、ジャーナリングはGEOM journalではなくSUJを選択。</p>
<p>前置きが長くなったが、購入したSSD二台にシステムを載せ替える手順のメモを開陳。</p><pre class="urvanov-syntax-highlighter-plain-tag"># Suppose the SSD #2 is at /dev/ada2

# TRIM the disk using newfs(8)
newfs -E ada2

# Create a GPT partition table
gpart create -s got ada2

# Put the FreeBSD boot loader in it
#  "-b 34" will suffice but it is always nice to align partitions with 4KB
gpart add -b 40 -s 64k -t freebsd-boot ada2
#  Install the (non-ZFS) boot loader
gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 ada2

# Add a UFS partition for the system root
#  Create a partition for / (20GB)
gpart add -t freebsd-ufs -s 20g ada2
#  Make it GEOM mirrored
gmirror load
gmirror label root ada2p2
#  Make sure GEOM mirror is available on boot
echo 'geom_mirror_load="YES"' >> /boot/loader.conf
#  Create a UFS2 filesystem on it
newfs -j -t /dev/mirror/root

# Copy the system root to /dev/mirror/root using:
# - dump(8) & restore(8) from a snapshot of the current / if it is UFS
# - rsync -aHAX
# or:
# - good old tar|tar

# Add a swap partition (20GB - sufficiently bigger than the amount of RAM on this box)
gpart add -t freebsd-swap -s 20g ada2
#  Make it GEOM mirrored
gmirror label swap ada2p3

# Create a partition for ZIL (8GB - half the amount of the RAM on this box)
gpart add -t freebsd-zfs -l zil1 -s 8g ada2
zpool add tank log /dev/gpt/zil1

# Use the rest of the disk for ZFS L2ARC
gpart add -t freebsd-zfs -l l2arc1 ada2
zpool add tank cache /dev/gpt/l2arc1

# Edit /etc/fstab
/dev/mirror/root /    ufs  rw,noatime 1 1
/dev/mirror/swap none swap sw         0 0

# Edit /boot/loader.conf
vfs.root.mountfrom="ufs:/dev/mirror/root"

#
# Boot from the SSD #2
#

# This may be needed
zpool import -fa

# Suppose the SSD #1 is at /dev/ada2

# TRIM the disk using newfs(8)
newfs -E ada1

# Create a GPT partition table
gpart create -s gpt ada1

# Put the FreeBSD boot loader in it
gpart add -b 40 -s 64k -t freebsd-boot ada1
gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 ada1

# Get the system root mirrored
gpart add -t freebsd-ufs -s 20g ada1
gmirror insert root ada1p2

# Get the swap area mirrored
gpart add -t freebsd-swap -s 20g ada1
gmirror insert swap ada1p3

# Get the ZIL area mirrored
gpart add -t freebsd-zfs -l zil0 -s 8g ada1
zpool attach tank /dev/gpt/zil1 /dev/gpt/zil0

# Add a second L2ARC partition (mirroring N/A)
gpart add -t freebsd-zfs -l l2arc0 ada1
zpool add tank cache /dev/gpt/l2arc0</pre><p></p>
<p>こんな感じです。けっこう簡単だよね。<br />
ポイントは、移行後の新システムを作る際、単一パーティションでGEOM mirrorを構成し、そこに<code>/</code>を作って構築すること。GEOM mirrorは、マウントした状態のファイルシステムパーティションをミラー構成にすることはできないようだ。上記のように片肺（というか単肺）のGEOM mirrorボリュームを作ってそこからブートすれば、あとは二肺目をそこにアタッチ（GEOM用語ではinsert）するだけで良い。</p>
<h3 id="appendix1"><a href="#appendix1">おまけ情報1</a></h3>
<p>こうして構築は完了したが、不意のシステムダウンが起きると、リブート後にZFSボリュームが見えない（<code>zpool import</code>しないといけない）問題が発生しており少し困っている。最近VirtualBoxが不安定（4.1.10くらいから？）で、たまにカーネルパニックを起こすので少し深刻だ。<br />
そのときは<code>/var/named/etc/namedb</code>が見えないため<code>/etc/rc.d/named</code>が<code>/etc/namedb</code>を壊してしまうので、シングルユーザモードで</p><pre class="urvanov-syntax-highlighter-plain-tag">ln -sf /var/named/etc/namedb /etc/
zpool import -fa</pre><p>と直してからスタートアップする必要がある。</p>
<h3 id="appendix2"><a href="#appendix2">おまけ情報2</a></h3>
<p>GEOM mirrorは何やら曲者で、まちがえて作ってしまったときなどに、削除しようと<code>gmirror stop <i>name</i></code>としてもGPTラベル名やGPTIDやらのデバイス名で設定が生き残ってしまう。ちゃんと削除するには、</p><pre class="urvanov-syntax-highlighter-plain-tag">sysctl kern.geom.label.gpt.enable=0
sysctl kern.geom.label.gptid.enable=0</pre><p>と一時的に別名デバイスが生えない状態にしてから</p><pre class="urvanov-syntax-highlighter-plain-tag">gmirror stop <i>name</i></pre><p>とすれば良いようだ。</p>
<h3 id="appendix3"><a href="#appendix3">おまけ情報3</a></h3>
<p>以前<a href="http://d.akinori.org/2010/04/15/freebsd%e3%81%a7esata%e3%81%ae%e3%83%9b%e3%83%83%e3%83%88%e3%82%b9%e3%83%af%e3%83%83%e3%83%97%e3%81%af%e2%80%a6/" title="FreeBSDでeSATAのホットスワップは…">発見した問題</a>が解決。少なくともFreeBSD 9.0では、eSATA port multiplierにディスクを差したときに既存ディスクのデタッチが発生しないようになっていた。<span class="emoticon">ﾔｯﾀﾈ＼(^o^)／</span></p>
<p>The post <a href="https://d.akinori.org/2012/05/11/ml110-g6%e3%81%ae%e8%b5%b7%e5%8b%95%e3%83%87%e3%82%a3%e3%82%b9%e3%82%af%e3%82%92ssd%e3%81%ab%e5%a4%89%e6%9b%b4/">ML110 G6の起動ディスクをSSDに変更</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->
<p>» 関連記事 «</p><ul>
<li><a href="https://d.akinori.org/2011/10/27/ml110-g6%e3%81%ae%e8%b5%b7%e5%8b%95%e3%83%87%e3%82%a3%e3%82%b9%e3%82%af%e3%82%92usb%e3%83%a1%e3%83%a2%e3%83%aa%e3%81%ab%e5%a4%89%e6%9b%b4/" rel="bookmark" title="ML110 G6の起動ディスクをUSBメモリに変更">ML110 G6の起動ディスクをUSBメモリに変更</a></li>
<li><a href="https://d.akinori.org/2011/10/27/freebsd-on-ml110-g6%e3%82%92%e3%81%a1%e3%82%87%e3%81%a3%e3%81%a8%e3%83%81%e3%83%a5%e3%83%bc%e3%83%8b%e3%83%b3%e3%82%b0/" rel="bookmark" title="FreeBSD on ML110 G6をちょっとチューニング">FreeBSD on ML110 G6をちょっとチューニング</a></li>
<li><a href="https://d.akinori.org/2010/04/15/wd15ears%e3%81%ae%e6%80%a7%e8%83%bd%e3%82%92%e8%a8%88%e6%b8%ac/" rel="bookmark" title="WD15EARSの性能を計測">WD15EARSの性能を計測</a></li>
</ul>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://d.akinori.org/2012/05/11/ml110-g6%e3%81%ae%e8%b5%b7%e5%8b%95%e3%83%87%e3%82%a3%e3%82%b9%e3%82%af%e3%82%92ssd%e3%81%ab%e5%a4%89%e6%9b%b4/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Emacs: kill-region-or-backward-kill-word</title>
		<link>https://d.akinori.org/2012/04/25/emacs-kill-region-or-backward-kill-word/</link>
					<comments>https://d.akinori.org/2012/04/25/emacs-kill-region-or-backward-kill-word/#respond</comments>
		
		<dc:creator><![CDATA[Akinori]]></dc:creator>
		<pubDate>Wed, 25 Apr 2012 05:53:15 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[Emacs]]></category>
		<guid isPermaLink="false">http://d.akinori.org/?p=2880</guid>

					<description><![CDATA[<p>以前、kill-region-or-backward-kill-wordというのを紹介したが、たとえばcua-modeではkill-regionに割り当てられたキーに上位互換のコマンド（cua-cut-region等）を… <span class="read-more"><a href="https://d.akinori.org/2012/04/25/emacs-kill-region-or-backward-kill-word/">続きを読む &#187;</a></span></p>
<p>The post <a href="https://d.akinori.org/2012/04/25/emacs-kill-region-or-backward-kill-word/">Emacs: kill-region-or-backward-kill-word</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->

» 関連記事 «<ul>
<li><a href="https://d.akinori.org/2007/07/03/20070703p01/" rel="bookmark" title="Making Ctrl+W a tad smarter">Making Ctrl+W a tad smarter</a></li>
<li><a href="https://d.akinori.org/2012/06/14/emacs%e3%81%ae%e7%af%84%e5%9b%b2%e9%81%b8%e6%8a%9eui%e3%82%92%e5%a4%a7%e5%b9%85%e6%8b%a1%e5%bc%b5%e3%81%97%e3%81%a6%e3%81%8f%e3%82%8c%e3%82%8bcua-mode/" rel="bookmark" title="Emacsの範囲選択UIを大幅拡張してくれるcua-mode">Emacsの範囲選択UIを大幅拡張してくれるcua-mode</a></li>
<li><a href="https://d.akinori.org/2004/12/25/20041225p02/" rel="bookmark" title="xyzzy / mcalc">xyzzy / mcalc</a></li>
</ul>
</div>
]]></description>
										<content:encoded><![CDATA[<p>以前、<code><a href="http://d.akinori.org/2007/07/03/20070703p01/">kill-region-or-backward-kill-word</a></code>というのを紹介したが、たとえば<code>cua-mode</code>では<code>kill-region</code>に割り当てられたキーに上位互換のコマンド（<code>cua-cut-region</code>等）を割り当て直す、といったことをしているので、割り当ては変更せずに<code>kill-region</code>の挙動を変えてしまう方が都合がいい。<br />
というわけで、adviceを使って書き換えるとこうなる。</p><pre class="urvanov-syntax-highlighter-plain-tag">(defadvice kill-region
  (around kill-region-or-backward-kill-word (beg end) activate)
  (if (and (called-interactively-p 'any) (not mark-active))
      (backward-kill-word (prefix-numeric-value current-prefix-arg))
    ad-do-it))</pre><p>おまけで、選択モードでないときに<kbd>M-w</kbd>が現在行をコピーするようにするのがこれ。（プレフィックスにも対応）</p><pre class="urvanov-syntax-highlighter-plain-tag">(defadvice kill-ring-save
  (around kill-ring-save-or-copy-line-as-kill (beg end) activate)
  (interactive (list (point) (mark)))
  (if (and (called-interactively-p 'any) (not mark-active))
      (copy-region-as-kill (point-at-bol 1) (point-at-eol 2))
    ad-do-it))</pre><p>Emacsでイラつくことのひとつが行単位のコピー（viなら<kbd>Y</kbd>）の面倒さだが、こういう工夫で乗り越えよう。</p>
<p>The post <a href="https://d.akinori.org/2012/04/25/emacs-kill-region-or-backward-kill-word/">Emacs: kill-region-or-backward-kill-word</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->
<p>» 関連記事 «</p><ul>
<li><a href="https://d.akinori.org/2007/07/03/20070703p01/" rel="bookmark" title="Making Ctrl+W a tad smarter">Making Ctrl+W a tad smarter</a></li>
<li><a href="https://d.akinori.org/2012/06/14/emacs%e3%81%ae%e7%af%84%e5%9b%b2%e9%81%b8%e6%8a%9eui%e3%82%92%e5%a4%a7%e5%b9%85%e6%8b%a1%e5%bc%b5%e3%81%97%e3%81%a6%e3%81%8f%e3%82%8c%e3%82%8bcua-mode/" rel="bookmark" title="Emacsの範囲選択UIを大幅拡張してくれるcua-mode">Emacsの範囲選択UIを大幅拡張してくれるcua-mode</a></li>
<li><a href="https://d.akinori.org/2004/12/25/20041225p02/" rel="bookmark" title="xyzzy / mcalc">xyzzy / mcalc</a></li>
</ul>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://d.akinori.org/2012/04/25/emacs-kill-region-or-backward-kill-word/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Gitを使っていて zsh: no matches found: HEAD^ などと言われない方法</title>
		<link>https://d.akinori.org/2012/01/23/git%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%84%e3%81%a6-zsh-no-matches-found-head-%e3%81%aa%e3%81%a9%e3%81%a8%e8%a8%80%e3%82%8f%e3%82%8c%e3%81%aa%e3%81%84%e6%96%b9%e6%b3%95/</link>
					<comments>https://d.akinori.org/2012/01/23/git%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%84%e3%81%a6-zsh-no-matches-found-head-%e3%81%aa%e3%81%a9%e3%81%a8%e8%a8%80%e3%82%8f%e3%82%8c%e3%81%aa%e3%81%84%e6%96%b9%e6%b3%95/#respond</comments>
		
		<dc:creator><![CDATA[Akinori]]></dc:creator>
		<pubDate>Mon, 23 Jan 2012 08:09:34 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[zsh]]></category>
		<guid isPermaLink="false">http://d.akinori.org/?p=2865</guid>

					<description><![CDATA[<p>Gitを使っていると、今のcommitなし！とgit reset --soft HEAD^したり、abc1234以降のコミットをパッチ化したい！とgit format-patch abc1234^したくなることがよくある… <span class="read-more"><a href="https://d.akinori.org/2012/01/23/git%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%84%e3%81%a6-zsh-no-matches-found-head-%e3%81%aa%e3%81%a9%e3%81%a8%e8%a8%80%e3%82%8f%e3%82%8c%e3%81%aa%e3%81%84%e6%96%b9%e6%b3%95/">続きを読む &#187;</a></span></p>
<p>The post <a href="https://d.akinori.org/2012/01/23/git%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%84%e3%81%a6-zsh-no-matches-found-head-%e3%81%aa%e3%81%a9%e3%81%a8%e8%a8%80%e3%82%8f%e3%82%8c%e3%81%aa%e3%81%84%e6%96%b9%e6%b3%95/">Gitを使っていて zsh: no matches found: HEAD^ などと言われない方法</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->

» 関連記事 «<ul>
<li><a href="https://d.akinori.org/2004/01/24/20040124p01/" rel="bookmark" title="GNU screenのコマンドキー">GNU screenのコマンドキー</a></li>
<li><a href="https://d.akinori.org/2004/04/23/20040423p02/" rel="bookmark" title="zshのホスト名補完強化">zshのホスト名補完強化</a></li>
<li><a href="https://d.akinori.org/2007/01/17/20070117p02/" rel="bookmark" title="zshのglobal alias">zshのglobal alias</a></li>
</ul>
</div>
]]></description>
										<content:encoded><![CDATA[<p>Gitを使っていると、<em>今のcommitなし！</em>と<code>git reset --soft HEAD^</code>したり、<em><code>abc1234</code>以降のコミットをパッチ化したい！</em>と<code>git format-patch abc1234^</code>したくなることがよくあるわけだが、この<code>^</code>はzshの拡張グロブ有効化時（<code>setopt extended_glob</code>）はメタ文字として働くため、そのまま入力すると標記のエラーで怒られてしまう。<br />
いちいちエスケープするのは面倒だと思うのだが、ぐぐってみても正面から対処している人があまりいないようなので紹介しておくと、拙作の<a href="https://github.com/knu/zsh-git-escape-magic"><code>git-escape-magic</code></a>を使えば良い。リンク先のドキュメントの通り、ふつうに入力するだけで、いい感じに文脈を見て自動エスケープしてくれる。<br />
このように、zle（zshラインエディタ）をいじると結構おもしろいことができる。<br />
たとえば、3つ上のディレクトリを参照するために<code>../../..</code>などと打つのは指がつりそうな所作だが、カレントディレクトリが<code>.</code>で親ディレクトリが<code>..</code>であるならばn個上のディレクトリは(n-1)個の<code>.</code>の並びで表現できてもよさそうなものである。と、思ったなら、<a href="https://github.com/knu/zsh-manydots-magic"><code>manydots-magic</code></a>のような実装に至ることができる。<br />
もちろん正規表現、Gitのコミットの範囲指定、あるいはワンライナープログラム内で<code>...</code>という並びを使うこともあるので、引数の頭か<code>/</code>の直後でのみ動くようにしているほか、直後に<code>../..</code>の後には似つかわしくない文字が打たれたときは<code>...</code>に戻す工夫を加えた。また、指が滑って打ち過ぎたときに最後の<code>/..</code>をBSを3度も押して削るなどは面倒だから、<code>.</code>連打の後のBSは3文字分を削り直前の状態に戻るようにしてある。<br />
先ほどの<code>git-escape-magic</code>ともども、参考にした<code>url-quote-magic</code>では考慮外だったネストに対応しているので、いくつも併用できる。何かおもしろいものができたら、ぜひ公開してみてくれ。</p>
<p>The post <a href="https://d.akinori.org/2012/01/23/git%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%84%e3%81%a6-zsh-no-matches-found-head-%e3%81%aa%e3%81%a9%e3%81%a8%e8%a8%80%e3%82%8f%e3%82%8c%e3%81%aa%e3%81%84%e6%96%b9%e6%b3%95/">Gitを使っていて zsh: no matches found: HEAD^ などと言われない方法</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->
<p>» 関連記事 «</p><ul>
<li><a href="https://d.akinori.org/2004/01/24/20040124p01/" rel="bookmark" title="GNU screenのコマンドキー">GNU screenのコマンドキー</a></li>
<li><a href="https://d.akinori.org/2004/04/23/20040423p02/" rel="bookmark" title="zshのホスト名補完強化">zshのホスト名補完強化</a></li>
<li><a href="https://d.akinori.org/2007/01/17/20070117p02/" rel="bookmark" title="zshのglobal alias">zshのglobal alias</a></li>
</ul>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://d.akinori.org/2012/01/23/git%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%84%e3%81%a6-zsh-no-matches-found-head-%e3%81%aa%e3%81%a9%e3%81%a8%e8%a8%80%e3%82%8f%e3%82%8c%e3%81%aa%e3%81%84%e6%96%b9%e6%b3%95/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>FreeBSD 8-STABLEではZFS用チューニングはほぼ不要</title>
		<link>https://d.akinori.org/2012/01/03/freebsd-8-stable%e3%81%a7%e3%81%afzfs%e7%94%a8%e3%83%81%e3%83%a5%e3%83%bc%e3%83%8b%e3%83%b3%e3%82%b0%e3%81%af%e3%81%bb%e3%81%bc%e4%b8%8d%e8%a6%81/</link>
					<comments>https://d.akinori.org/2012/01/03/freebsd-8-stable%e3%81%a7%e3%81%afzfs%e7%94%a8%e3%83%81%e3%83%a5%e3%83%bc%e3%83%8b%e3%83%b3%e3%82%b0%e3%81%af%e3%81%bb%e3%81%bc%e4%b8%8d%e8%a6%81/#respond</comments>
		
		<dc:creator><![CDATA[Akinori]]></dc:creator>
		<pubDate>Tue, 03 Jan 2012 02:26:36 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[ZFS]]></category>
		<guid isPermaLink="false">http://d.akinori.org/?p=2856</guid>

					<description><![CDATA[<p>以前、メモリ8GBのマシンでのZFS用チューニング設定を紹介したが、昨年中に8.2-STABLEに入ったvm.kmem_size_scale, vm.kmem_size_max, vfs.zfs.arc_maxの自動設定… <span class="read-more"><a href="https://d.akinori.org/2012/01/03/freebsd-8-stable%e3%81%a7%e3%81%afzfs%e7%94%a8%e3%83%81%e3%83%a5%e3%83%bc%e3%83%8b%e3%83%b3%e3%82%b0%e3%81%af%e3%81%bb%e3%81%bc%e4%b8%8d%e8%a6%81/">続きを読む &#187;</a></span></p>
<p>The post <a href="https://d.akinori.org/2012/01/03/freebsd-8-stable%e3%81%a7%e3%81%afzfs%e7%94%a8%e3%83%81%e3%83%a5%e3%83%bc%e3%83%8b%e3%83%b3%e3%82%b0%e3%81%af%e3%81%bb%e3%81%bc%e4%b8%8d%e8%a6%81/">FreeBSD 8-STABLEではZFS用チューニングはほぼ不要</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->

» 関連記事 «<ul>
<li><a href="https://d.akinori.org/2010/04/15/freebsd-8amd64%e3%81%a7zfs%e3%82%92%e4%bd%bf%e3%81%86%e3%81%a8%e3%81%8d%e3%81%ae%e3%83%91%e3%83%a9%e3%83%a1%e3%83%bc%e3%82%bf/" rel="bookmark" title="FreeBSD 8/amd64でZFSを使うときのパラメータ">FreeBSD 8/amd64でZFSを使うときのパラメータ</a></li>
<li><a href="https://d.akinori.org/2011/10/27/freebsd-on-ml110-g6%e3%82%92%e3%81%a1%e3%82%87%e3%81%a3%e3%81%a8%e3%83%81%e3%83%a5%e3%83%bc%e3%83%8b%e3%83%b3%e3%82%b0/" rel="bookmark" title="FreeBSD on ML110 G6をちょっとチューニング">FreeBSD on ML110 G6をちょっとチューニング</a></li>
<li><a href="https://d.akinori.org/2012/05/11/ml110-g6%e3%81%ae%e8%b5%b7%e5%8b%95%e3%83%87%e3%82%a3%e3%82%b9%e3%82%af%e3%82%92ssd%e3%81%ab%e5%a4%89%e6%9b%b4/" rel="bookmark" title="ML110 G6の起動ディスクをSSDに変更">ML110 G6の起動ディスクをSSDに変更</a></li>
</ul>
</div>
]]></description>
										<content:encoded><![CDATA[<p>以前、<a href="http://d.akinori.org/2010/04/15/freebsd-8amd64%E3%81%A7zfs%E3%82%92%E4%BD%BF%E3%81%86%E3%81%A8%E3%81%8D%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF/">メモリ8GBのマシンでのZFS用チューニング設定</a>を紹介したが、昨年中に8.2-STABLEに入った<code>vm.kmem_size_scale</code>, <code>vm.kmem_size_max</code>, <code>vfs.zfs.arc_max</code>の自動設定が8GB超のメモリを積んだマシンにとっても適切なものとなり、無設定でも運用上支障がなくなった。<br />
<a href="http://www.freshports.org/sysutils/zfs-stats">zfs-stats</a>でカーネルメモリの使用状況やARCの統計情報を見て問題がなければ、これらの値を手で調整する必要はもうないだろう。あとは、どのくらい書き込みアクセスが発生するか、データロス時のダメージはどれほどかを見つつ、以下のような項目だけを残して運用している。<br />
<code>/boot/loader.conf</code>:</p><pre class="urvanov-syntax-highlighter-plain-tag">vfs.zfs.txg.timeout="5"
vfs.zfs.prefetch_disable="1"</pre><p><code>/etc/sysctl.conf</code>:</p><pre class="urvanov-syntax-highlighter-plain-tag"># 2GB
vfs.zfs.txg.write_limit_override=2147483648</pre><p></p>
<p>The post <a href="https://d.akinori.org/2012/01/03/freebsd-8-stable%e3%81%a7%e3%81%afzfs%e7%94%a8%e3%83%81%e3%83%a5%e3%83%bc%e3%83%8b%e3%83%b3%e3%82%b0%e3%81%af%e3%81%bb%e3%81%bc%e4%b8%8d%e8%a6%81/">FreeBSD 8-STABLEではZFS用チューニングはほぼ不要</a> appeared first on <a href="https://d.akinori.org">工夫と趣向と分別と。</a>.</p>
<div class='yarpp yarpp-related yarpp-related-rss yarpp-template-yarpp-template-akinori'>
<!-- YARPP List -->
<p>» 関連記事 «</p><ul>
<li><a href="https://d.akinori.org/2010/04/15/freebsd-8amd64%e3%81%a7zfs%e3%82%92%e4%bd%bf%e3%81%86%e3%81%a8%e3%81%8d%e3%81%ae%e3%83%91%e3%83%a9%e3%83%a1%e3%83%bc%e3%82%bf/" rel="bookmark" title="FreeBSD 8/amd64でZFSを使うときのパラメータ">FreeBSD 8/amd64でZFSを使うときのパラメータ</a></li>
<li><a href="https://d.akinori.org/2011/10/27/freebsd-on-ml110-g6%e3%82%92%e3%81%a1%e3%82%87%e3%81%a3%e3%81%a8%e3%83%81%e3%83%a5%e3%83%bc%e3%83%8b%e3%83%b3%e3%82%b0/" rel="bookmark" title="FreeBSD on ML110 G6をちょっとチューニング">FreeBSD on ML110 G6をちょっとチューニング</a></li>
<li><a href="https://d.akinori.org/2012/05/11/ml110-g6%e3%81%ae%e8%b5%b7%e5%8b%95%e3%83%87%e3%82%a3%e3%82%b9%e3%82%af%e3%82%92ssd%e3%81%ab%e5%a4%89%e6%9b%b4/" rel="bookmark" title="ML110 G6の起動ディスクをSSDに変更">ML110 G6の起動ディスクをSSDに変更</a></li>
</ul>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://d.akinori.org/2012/01/03/freebsd-8-stable%e3%81%a7%e3%81%afzfs%e7%94%a8%e3%83%81%e3%83%a5%e3%83%bc%e3%83%8b%e3%83%b3%e3%82%b0%e3%81%af%e3%81%bb%e3%81%bc%e4%b8%8d%e8%a6%81/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
