tag:blogger.com,1999:blog-17479865482941135722024-02-09T04:27:48.104+09:00年越しそばと初詣は絶対に欠かせないちょっとめもっぽいものfukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.comBlogger188125tag:blogger.com,1999:blog-1747986548294113572.post-24454453374063516772019-12-22T21:31:00.000+09:002019-12-22T21:32:29.502+09:00久しぶりの投稿かなり期間が空いてしまったが、ブログを再開してみようと思う。<br />
<div>
<br /></div>
<div>
2013年3月が直前の投稿だったが、頻繁に更新していた時期が 2011年11月までなので、8年間ぶりとなる。</div>
<div>
<br /></div>
<div>
8年間なにをしていたのかと言えば、2回転職して未だにIT技術者の職を得ている。</div>
<div>
<br /></div>
<div>
その期間、ざっくりと扱ったプラットフォームと言語は以下</div>
<div>
<br /></div>
<div>
<div>
2011/11〜</div>
<div>
<ul>
<li>Server Side Engineer</li>
<ul>
<li>PHP(CakePHP, Laravel), Perl(mod_perl,Catalyst)</li>
</ul>
<li>Infra engineer</li>
<ul>
<li>AWS / On-premises</li>
</ul>
<li>iOS / Android Engineer</li>
<ul>
<li>Objective-C / Swift / Java</li>
</ul>
</ul>
</div>
<div>
2016/8〜</div>
<div>
<ul>
<li>Android Engineer</li>
<ul>
<li>Java / Kotlin</li>
</ul>
<li>Server Side Engineer</li>
<ul>
<li>PHP(Phalcon, FuelPHP), Java/Kotlin(Spring Boot)</li>
</ul>
</ul>
<div>
あと docker とか ansible 等々、必要に応じて使ってきた。</div>
</div>
</div>
<div>
<br /></div>
<div>
色々ノウハウを溜め込んだが仕事以外で出力していない。</div>
<div>
<br /></div>
<div>
良くあるアウトプット不全症なのだが、リハビリ変わりに書き出していこうと思う。</div>
<div>
<br /></div>
<div>
まずは、このブログの表示も 8年前の感じでなので、、、直していこう。</div>
<div>
<br /></div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-40505954566294207282013-03-16T18:58:00.001+09:002017-05-21T04:44:16.360+09:00Cocoa Emacs 24.3 構築 (2013/03版)暫く使っている Cocoa Emacs を更新していなかったので、24.3 に上げてみた。<br />
当てるパッチは inline patch と<a href="http://moimoitei.blogspot.jp/2010/05/fix-cocoa-emacs-23.html">ポップアップフリーズ対応パッチ</a>くらい。<br />
24.3 には既にフルスクリーン実装が入っているので、よく使われているフルスクリーンパッチは外した。<br />
普通に安定してる。。。良い事。<br />
但し、フルスクリーン時に、ツールバー表示をトグルすると上下に変な隙間が出て、変だ。<br />
どうしたもんだかなぁ<br />
<a name='more'></a><br />
<div class="fullpost">
不具合の報告は既にあり(<a href="http://debbugs.gnu.org/cgi/bugreport.cgi?bug=13444">1</a>)、trunkでは既に解消済みらしい。<br />
イマイチ trunk を常用する気はないので、闇雲に探すと、<a href="http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=fff9c23ba2ab1c849d4b04122bdae1012aab2945">このコミット</a>がどうやら該当の修正らしい。<br />
適当に cherry-pick し衝突を修正して、24.3 用の適当な<a href="https://gist.github.com/fukusaka/5175662">パッチ</a>を使って、構築すると、確かに変な挙動は修正されている。<br />
良き事かなぁ</div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-51179206636939010802011-11-06T21:43:00.001+09:002019-12-22T21:49:36.019+09:00Ant を使って Android アプリを構築するEclipse を使って Android アプリのプロジェクトを作成すると build.xml が作られずに、 コマンドラインからの構築ができない。 ただ、ちょっと前の <a href="http://developer.android.com/sdk/eclipse-adt.html">ADT</a> の話なので定かでない。。。<br />
Eclipse を使うと署名済みの apk パッケージまで作れるが、 GUIを使って一連の操作を毎回するのは面倒なので、 ant を使ったリリース方法を調べてみた。<br />
<a name='more'></a><br />
<div class="fullpost"><h4>build.xml の作成</h4>ant 化対応は非常に簡単で、プロジェクトのトップディレクトリで次のコマンドを実行すれば良い。<br />
<pre class="screen"><code>% ${ANDROID_SDK}/tools/android update project --path .
</code></pre>この時点で「ant debug」を実行すると bin/${project名}-debug.apk にデバック用のアプリが作成できる。<br />
ただ、SDK Tools r14 から若干ファイルの構成が変更されているので注意が必要である。<br />
<dl><dt>build.xml</dt>
<dd>ant用の構築ファイル</dd>
<dt>ant.properties (旧 build.properties)</dt>
<dd>ユーザが追加して使用するもの。普通はコッチに書く。</dd>
<dt>local.properties</dt>
<dd>構築マシン固有の情報。現在は SDKへのパスのみ? VCSへの登録は避けるべきファイル</dd>
<dt>project.properties (旧 default.properties)</dt>
<dd>ADTによって維持される情報。</dd> </dl></div><h4>パスワードの自動入力</h4>プロパティ値として key.store/key.alias/key.store.password/key.alias.password を設定しておけば、あとは万事取り計らってくれるようである。ただ、パスワード情報を記載するので、VCSへの登録される可能性が高いant.properties への記述は避けるべきで、VCS には登録しない secure.properties を作成して、コイツを読み込むように build.xml を変更するべきかなぁ。。。<br />
<code>build.xml</code> <br />
<pre class="prettyprint screen"><code>...
<property file="ant.properties" />
<property file="secure.properties" /> <!-- ここ追加 --&gt
...</code></pre><code>secure.properties</code> <br />
<pre class="prettyprint screen"><code>key.store=path-of-keystore
key.alias=alias
key.alias.password=password
key.store.password=password
</code></pre>これで、 「ant release」の実行で bin/${project名}-release.apk に署名済みのapkパッケージが作成される。<br />
<h4>リリース apk パッケージのファイルのカスタマイズ</h4>ここまで来ると、リリース apk パッケージのファイル名に自動的に構築日時とversionCodeを埋め込みたいのが、エンジニアの心情だと思う。<br />
build.xml をよく読むと、一番最後の import 要素の上に、任意のターゲットを追加すると良さ気である。なので、 次の deploy ターゲットを追加してみた。<br />
<code>build.xml</code> <br />
<pre class="prettyprint screen"><code>...
<target name="deploy" depends="release" description="deploy">
<xpath input="AndroidManifest.xml"
expression="/manifest/@android:versionCode"
output="config.versionCode"
default="release"
/>
<tstamp>
<format property="config.versionDate" pattern="yyyyMMdd" />
</tstamp>
<property name="out.deploy.file"
value="${out.absolute.dir}/${ant.project.name}-${config.versionDate}-${config.versionCode}.apk"
/>
<copy file="${out.final.file}"
tofile="${out.deploy.file}"
overwrite="true"
/>
<echo>Deploy Package: ${out.deploy.file}</echo>
</target>
...</code></pre>これで、 「ant deploy」の実行で bin/${project名}-YYYYYMMDD-V.apk に署名済みのapkパッケージが作成される。<br />
ターゲット名はあまり良く無いかも。。。<br />
<h4>まとめ</h4>makeファイルでのスクリプト片をantのタスク等で作成しないといけないのでいまいち使い勝手がよくわからない。 が、スゲー便利なんだろうなぁ。。。ant <br />
<h4>参照</h4><ul><li><a href="http://www.androidengineer.com/2010/06/using-ant-to-automate-building-android.html" title="Android Engineer: Using Ant to Automate Building Android Applications">Android Engineer: Using Ant to Automate Building Android Applications</a></li>
<li><a href="http://d.hatena.ne.jp/unigo/20100715/1279200419" title="ant を使って Android の apk パッケージを作成する - unigoの日記">ant を使って Android の apk パッケージを作成する - unigoの日記</a></li>
</ul>fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-19860048463938485912011-06-05T01:15:00.001+09:002019-12-22T21:37:16.278+09:00Cocoa Emacs 23 構築 (2011/06版)定期的に<a href="http://moimoitei.blogspot.com/2010/05/build-cocoa-emacs-64bit.html">Cocoa Emacs 23 を構築</a>して使っていた。今日も定期作業とおもって、構築したらビルドが失敗してしまった。。。<br />
どうしたもんだかなぁ<br />
<a name='more'></a><br />
ググってみると、、、MLの「<a href="http://lists.gnu.org/archive/html/emacs-devel/2011-04/msg00857.html">Re: Emacs with Cocoa/GNUstep</a>」の内容の通りで、lisp.h の修正の影響で nsmenu.m のビルドが失敗したみたいで修正したよ。それで emacs-23 ブランチには lisp.h の修正のみしかマージされていないみたいで、、、、うまく行かなかったということらしい。<br />
masterブランチで作ってれば問題無しなのか、、、まぁそのうち emacs-23 ブランチに修正が降ってくるのかなぁ。<br />
それまでは、以下のように対処してみた。(ヘタレ git 使いだから bzr の人用の手順は分からん、、、)<br />
<pre class="code">% git clone git://repo.or.cz/emacs.git
% cd emacs
% git checkout emacs-23
% git cherry-pick -n <a href="http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=207421c0af4edf88943e270ad4bc83934cabcc04">207421c0af4edf88943e270ad4bc83934cabcc04</a>
...
# src/nsmenu.m の2箇所のコンフリクトを修正
# 1箇所目は、memcpy を使ってる奴を残す
# 2箇所目は、どっちでもいい
#
...
% patch -p 0 < favorite-patch-file
...
# で構築
% eval "$(PATH= /usr/libexec/path_helper -s)" # PATHをクリーンにする
% ./configure --with-ns
% make bootstrap
% make install
% open nextstep/Emacs.app
</pre>なかなか、いい感じだぁfukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-22667736108354811642011-05-26T01:25:00.001+09:002019-12-22T21:34:41.333+09:00MacOSX で Zen Touch 2 (Android2.2)を開発端末にしてみる<p>自分の携帯を Androidの開発端末として使うのは、日常生活でメールや連絡が来たりするときに結構困る場合がある。なので、3〜4インチ程度の安いAndroid 端末が無いかなと物色したら、Zen Touch 2 がよさげ。</p><p>、、、</p><p>静電式のものに慣れているので、感圧式タッチパネルが違和感ありまくり操作がし辛いこと。</p><p>実物を見ないで、購入したので自業自得だが、、、ついでに、Android Market 非対応のも、、、 余り Android 端末としてはお薦めできないなぁ。。。まぁ音楽プレーヤーですね。</p><p>今まで扱った Android 端末は、何もせずに MacOSX の Android 開発用の SDK で認識されたので、気に留めるなかったが、こいつは認識しない。。。</p><p>はて、どうしたもんだかなぁ</p><a name='more'></a><br />
<p>熟考の結果、下記の投稿記事と同じ対応をすれば、adb で認識して、開発に使えるようである。 <ul><li><a href="http://d.hatena.ne.jp/dot_h2o2/20101012/p1">Android(IS01向け)のアプリをOSXで開発 ~adb接続編 </a></li>
</ul></p><p>サクっと、認識させてみた。</p><pre class="screen"># Creative Zen Touch 2 のベンダーIDを追加
% echo "0x041e" >> ~/.android/adb_usb.ini
# adb を再起動
% ${ANDROID_SDK_DIR}/platform-tools/adb kill-server
% ${ANDROID_SDK_DIR}/platform-tools/adb start-server
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
# adb でデバイスのリストを確認
% ${ANDROID_SDK_DIR}/platform-tools/adb devices
List of devices attached
16XXXXXXXXXXXX 0 device</pre><p>これは adb が自前でAndroid のベンダーIDのリストを持っていることなのかぁ。。。</p><p>開発機としては、スペックも低いし解像度も高くなく無いので、下手な実装を洗い出せるので良いのかも。</p><p>ふむ、静電式でマーケット対応の一番安い奴でも探すかなぁ。。。</p><h4>追記 (2011/11/06)</h4><p>だれかに何故 0x041e なのか答えないといけない気がしたので。。。</p><p>単純に dmesg の直近で出てくるログ行で判断するのが正解かなぁ。。。</p><pre class="screen"><code>% sudo dmesg
...
USBMSC Identifier (non-unique): XXXXXXXXXXX 0 0x41e 0x4166 0x225
...
</code></pre><p>あとは USBストレージモードにして、システムプロファイルを参照するのも正解かぁ。。。</p>fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-21270727536644077812011-05-07T22:18:00.000+09:002011-05-07T22:22:04.607+09:00iOS の View Controller の lifecycle の図<p>iOS の VIewController のライフサイクル図を書き起こしてみた。</p>
<p>開発ドキュメントから読み取ったのだが、理解不足なためか不正確な部分も無きにしもあらず。精進せねば。</p>
<a href="http://www.flickr.com/photos/24156556@N07/5695587813/"><img src="http://farm4.static.flickr.com/3486/5695587813_7dc5299c64_t.jpg" height="71" width="100" alt="UIViewController のサイクル"/></a>
<p>まぁ、いらないと思うが<a href="https://docs.google.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BzuGmQrn2nhANTBlMWM3MjQtMmE1Yy00NmZjLWE1ZDYtMTBhNDYzNzZjYmVm&hl=ja">PDF版 @ Google Docs</a>もアップ。</p>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-10438332833110301972011-04-23T05:20:00.001+09:002011-05-07T22:21:50.925+09:00Android の Activity のlifecycleの図<p>Android の基本の Activity の<a href="http://developer.android.com/reference/android/app/Activity.html">ライフサイクルの図</a>が開発サイトに乗ってる。</p>
<p>これでも前後の文章で補完すれば分かるんだが、2〜3ヶ月後の自分はまた忘れてる可能性大なので、
ちょこっと弄ってみた。</p>
<a href="http://www.flickr.com/photos/24156556@N07/5643829497/"><img src="http://farm6.static.flickr.com/5105/5643829497_ffe0d80d04_m.jpg" height="85" width="115" alt="Android Activity 遷移図"/></a>
<p>まぁ、いらないと思うが<a href="https://docs.google.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BzuGmQrn2nhAZGI1NTgzZDMtNmQzMi00NjcyLWE4OGEtZDZiMTk2NDIyZTE5&hl=ja">PDF版 @ google docs</a> もアップ。</p>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-42261503555933587102011-03-04T22:10:00.000+09:002011-03-05T00:29:13.962+09:00Google提供の python ライブラリで Google Reader API を使ってみた<p>Google のサービスと連携するには <a href="http://code.google.com/intl/ja/apis/gdata/">Google Data API</a> を使う。Googleが公式にサポートしているので、とても安心して使える。RSS リーダーとしてよく使われている Google Reader 用のAPI も。。。は、まだ公式には無い。</p>
<p>まぁ、色々な人が解析しており、<a href="http://code.google.com/p/pyrfeed/wiki/GoogleReaderAPI">GoogleReaderAPI</a>のページが、詳細にまとまっている。</p>
<p>なので、Google 提供の python ライブラリで、Google Reader API を叩いてみた</p>
<p>ただ、サンプルを書いたあとで、<a href="http://code.google.com/p/pyrfeed/">pyrfeed</a>内にGoogleReader 用のライブラリが含まれていたのに気付いたので、そっちを使うのがいいのかも。</p>
<div class="fullpost">
<h4>インストール</h4>
<p>MacPorts を使っているので、さくっとインストール。</p>
<pre class="screen"><code>% sudo port install py27-gdata
</code></pre>
<p>そうでないならば、<a href="http://code.google.com/p/gdata-python-client/downloads/list">gdata-python-client</a>から最新版をインストールする。</p>
<h4>Google Reader 用の下準備と認証</h4>
<p>gdata-python-client には、Reader サービスの固有の API は無いので、ベースのモノを適当に設定する必要がある。</p>
<pre class="screen"><code>import gdata.service
config = { 'Email': 'foobar@gmail.com', 'Passwd': 'password' }
# Google Reader サービス設定
service = gdata.service.GDataService(account_type='GOOGLE',
service='reader',
server='www.google.com',
source='MyReaderHoge')
# Google アカウント設定とログイン
service.ClientLogin(config['Email'],config['Passwd'])
# 認証トークン(SIDの値)
print service.GetClientLoginToken()
# 書き込み用のトークンの取得
token = service.Get('/reader/api/0/token',converter=lambda x:x)
print "token:", token
</code></pre>
<p><code>'api/0'</code>以下のレスポンスが AtomPub 形式では無く、小細工が必要である。gdata-python-clientには、ちょうど隙間が開いてるようである。。。</p>
<h4>未読件数を取得</h4>
<p><code>'api/0/unread-count'</code>を JSON 形式で取得する</p>
<pre class="screen"><code>query = gdata.service.Query(feed='/reader/api/0/unread-count',
params={'all':'true', 'output':'json'})
feed = json.loads(service.Get(query.ToUri(), converter=lambda x:x))
unreadcounts = feed['unreadcounts']
# 全体の未読数を一番前に移動しとく
for i, item in enumerate(unreadcounts):
if re.match(r'^user/\d+/state/com.google/reading-list$',item['id']):
unreadcounts.pop(i)
unreadcounts.insert(0,item)
break
# 全体の未読数
print int(unreadcounts[0]['count'] if len(unreadcounts) > 0 else 0)
#=> 1
# 未読があるラベルとその未読数
for item in unreadcounts:
if not re.match(r'^user/\d+/label',item['id']): continue
print "count:%(count)s id: %(id)s" % item
#=> count:1 id: user/16814486509924941024/label/android
</code></pre>
<h4>すべてのラベルを取得</h4>
<pre class="screen"><code>query = gdata.service.Query(feed='/reader/api/0/tag/list',
params={'all':'true', 'output':'json'})
feed = json.loads(service.Get(query.ToUri(), converter=lambda x:x))
tags = feed['tags']
for item in tags:
tag = re.sub(r'^user/\d+/',r'',item['id'])
print "tag: %s" % tag
#=> tag: state/com.google/starred
#=> tag: state/com.google/broadcast
#=> tag: label/android
#=> tag: label/misc
#=> tag: label/neta
#=> tag: state/com.blogger/blogger-following
</code></pre>
<h4>ラベルを指定して取得</h4>
<p>android 関連の記事を 5 件見てみるかいな。。。</p>
<pre class="screen"><code>query = gdata.service.Query(feed='/reader/atom/user/-/label/android',
params={'n': str(5)})
feed = service.Get(query.ToUri())
for entry in feed.entry:
print "===="
dom = xml.dom.minidom.parseString(entry.ToString())
print dom.toprettyxml(indent=" ")
print "===="
print "href: %s" % entry.GetHtmlLink().href
print "title: %s" % entry.title.text
# print "%s" % entry.summary.text
</code></pre>
<h4>未読を既読に変更</h4>
<p>先の記事は、読んだから既読にする。</p>
<pre class="screen"><code># token, feed は、上に記載の書き込み用トークンと直前で取得した記事リスト
for entry in feed.entry:
i = entry.id.text
s = entry.source.extension_attributes['{http://www.google.com/schemas/reader/atom/}stream-id']
ret = service.Post(urllib.urlencode({'i':i,
'a':'user/-/state/com.google/read',
's':s,
'T':token,
}),
'/reader/api/0/edit-tag',
converter=lambda x:x,
extra_headers={'Content-Type': 'application/x-www-form-urlencoded'})
print i,ret
</code></pre>
<p>何でも無いが、この部分には半日悩んでしまった。</p>
<p>何気ない POST パラメータを送信する POST 処理なのだが、<code>gdata.service.Post</code> は <code>aplication/atom+xml</code>形式のデータ送信を想定するため、明示的に <code>Content-Type</code>を指定する必要がある!気づくまで、「<code>400 Bad Request</code>」+「<code>X-Reader-Google-Bad-Token: true</code>」に悩まされてしまった。</p>
<h4>新しいフィードを登録</h4>
<pre class="screen"><code>sub = r'feed/http://headlines.yahoo.co.jp/rss/rps_dom.xml'
ret = service.Post(urllib.urlencode({'s':sub,
'ac': 'subscribe',
'T':token,
}),
'/reader/api/0/subscription/edit',
converter=lambda x:x,
extra_headers={'Content-Type': 'application/x-www-form-urlencoded'})
print sub,'subscribe',ret
</code></pre>
<h4>購読しているフィードを解除</h4>
<pre class="screen"><code>sub = r'feed/http://headlines.yahoo.co.jp/rss/rps_dom.xml'
ret = service.Post(urllib.urlencode({'s':sub,
'ac': 'unsubscribe',
'T':token,
}),
'/reader/api/0/subscription/edit',
converter=lambda x:x,
extra_headers={'Content-Type': 'application/x-www-form-urlencoded'})
print sub,'unsubscribe',ret
</code></pre>
<h4>参考</h4>
<ul>
<li><a href="http://code.google.com/intl/ja/apis/gdata/">Google Data API</a></li>
<li><a href="http://code.google.com/p/gdata-python-client/">gdata-python-client</a></li>
<li><a href="http://code.google.com/p/pyrfeed/">pyrfeed</a> (python googlreader)</li>
<li><a href="http://code.google.com/p/pyrfeed/wiki/GoogleReaderAPI">GoogleReaderAPI</a></li>
<li><a href="http://d.hatena.ne.jp/dharry/20100117/1263724784">ruby の googlereaderライブラリ で Google Reader API を使ってみた</a></li>
</ul>
</div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-3595999799840146492011-02-15T18:27:00.001+09:002011-02-15T18:27:06.782+09:00polipo + MacOSX で使う<p>普通の PC にインストールした Linux サーバに Squid + Squidguard で使っていたんだが、
別サーバを必ず立ち上げていないと行けないのが面倒なので、、、
乗り遅れ感が否めないが、polipo を常用をする環境を整えてみた。</p>
<p>移行に関しては、GUIは必要ないが launchd との繋ぎの設定ファイルを準備するのが面倒なので MacPorts パッケージを使いつつ、自前に用意したバイナリを使った。</p>
<div class="fullpost">
<p><a href="http://www.pps.jussieu.fr/~jch/software/polipo/">本家サイト</a>で公開されている git レポジトリを元に数点修正したものを使った。</p>
<ul>
<li> 64 bit 環境だと stdarg 絡みで落ちるっぽい部分?を修正</li>
<li> redirector の入出力の行仕様をpolipo側でダミーで合わせた</li>
<li> censorReferer を maybe に設定した時、サブドメインに加えて指定のサイトリストも Referer を通す機能を追加</li>
</ul>
<p>修正した<a href="https://github.com/fukusaka/polipo">履歴</a>はgithubに公開してある。</p>
<p>最後の機能は、画像用を公開してるドメインが短縮した別ドメインに置き Referer で制限しているサイトに対応するためで、設定値<code>uncensorRefererFile</code>に、forbiddenと同じ形式で書けば、Referer を削除せずにスルーしてくれる。</p>
<p>まぁ、polipo も使えない事はないかなぁ。。。あとは、forbidden/redirector で Location を返す挙動がなんとかなれば、いいのになぁ。。。もうちょっと弄ってみるかなぁ</p>
</div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-4625756067596238052011-01-27T15:03:00.001+09:002011-01-27T15:09:00.890+09:00Mail.app の備忘録から Evernote に移行する<p>発売日に予約した IS03 が漸く入荷したので受け取ってきた。</p>
<p>いじり倒せる Android 端末が入手できた。
事前に電池のもちが異様に悪いと噂があったので、Killerアプリ等でコマメにアプリを終了し倒すように気を付けているので、ある程度許せる範囲に留まっている気がする。</p>
<p>まぁ、ノートパソコンにあるような大容量バッテリとかが出てくるのは、歓迎するが。。。どうなんだろう。</p>
<p>MacOSX の Mail.app には備忘録の機能が付いており、iOSとの組み合わせで同期が可能である。
結構便利でサクサク使っていたが、新規に Android でも同じようなことがしたくなって調べてみると、
どうも Evernoteが良いらしい。</p>
<p>メモに特化したアプリ、各プラットフォームにアプリがあり、相互に連携できる。。。なんか世の中凄いことになってるんだなぁ。。。</p>
<p>Mail.app の備忘録に蓄積したメモ書きを EverNote にサクっと移行するには、、、</p>
<p>どうすれば良いのだろうか?</p>
<div class="fullpost">
<p>何のことはない AppleScript を使うのが定石らしい。</p>
<p>参考URLの先コードを 「ユーティリティ」>「AppleScriptエディタ」にコピペして、「mailbox "Notes"」に書き換えて、実行すれば、「Imported Notes」という名前のノートブックの中にほぼ全部(「このMac内」の奴)コピー出来た。</p>
<p>あとは、ちまちまタグ付けや整理すればまた使いやすくなるのかなぁ。。。</p>
<h4>参考URL</h4>
<ul><li><a href="http://snipplr.com/view/37479/import-notes-from-mailapp-into-evernote-applescript/">Import Notes from Mail.app Into Evernote (Applescript)
</a></li></ul>
</div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-3063460409560724422010-11-09T03:12:00.001+09:002010-11-09T03:30:21.246+09:00Google Chrome が吐き出すログをちょっとだけ片付ける<p>Mac OSX 上の Google Chrome は、何故か system.log にデバックか実装上の何かしらの情報を沢山吐く。</p>
<p>システムの他の問題を調査するときジャマ臭い。。。なんとかならんのかなぁ。</p>
<div class="fullpost">
<p> syslogd には高度なフィルタ機能が実装されていないので、system.log に書き出される行に関しては何ともしがたい。</p>
<p>但し、MacOSXでは syslogd とは別に asl という仕組みが並行して導入されている。「コンソール.app」 のデータベース検索以下の情報は asl の仕組みから取得している。</p>
<p>asl には、結構便利なフィルタ機能が実装されている。なので、件のログを収集しないようにするには、/etc/asl.conf の最後に次の設定を付け加えれば良さそうである。
<pre class="screen"><code># /etc/asl.conf に追加
# ommit com.google.Chrome
? [S= Sender com.google.Chrome] ignore
</code></pre>
</p>
<h4>追記</h4>
<p>良く考えれば、Chromeからのログを除外した「新規データベース検索」を登録しとけば良かったのかぁ。。。</p>
</div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-423334268799714302010-11-06T20:34:00.001+09:002010-12-23T23:21:07.830+09:00MacOSXでRAMディスク上にブラウザのキャッシュを割り当てる<p>MacBook Pro 15(Late 2008)は公式では最大メモリ容量は4Gまでサポートなのだが、ファームウェアを最新のアップデート(<a href="http://support.apple.com/kb/DL975?viewlocale=ja_JP">MacBook Pro EFI ファームウェア・アップデート 1.8</a>)を適用すれば、最大 8G まで普通に認識し速度低下せずに使えるそうである。</p>
<p>2009年末位には結構高価だったのだが、最近値下がりして手ごろになってきたので、交換した。
次いで HDD も交換して SSD (TOSHIBA THNS256GG8BBAA)に入れ替えた。</p>
<p>まぁ、SSD に入れ替えたお陰でOSの起動もアプリの起動も機敏で、いい感じ。</p>
<p>空きメモリが増えてたので、ちょっと1Gくらいブラウザのキャッシュに割り当ててみた。</p>
<p>MacOSX では「<code>hdid</code>」コマンドを使えば簡単にRAMディスクを作成できる。
<pre class="screen"><code>ramlabel="RamDisk"
ramdev=$(hdid -nomount ram://10240)
diskutil eraseDisk HFS+ ${ramlabel} ${ramdev}
</code></pre>
で、コイツを <code>rc.local</code>に仕込んでやれば、起動時にRAMディスクを作成できる。</p>
<p>なぜか上手く行かない。起動後に手打ちで入力すれば、出来るのだが、、、</p>
<p>はて、なんでだろうかぁ?</p>
<div class="fullpost">
<p>まぁ、ググっても明快な正解がわからない。。。</p>
<p>当てずっぽに答えれば、『「<code>hdiejectd</code>」デーモンが起動して、正常に定常状態に無いときには「<code>hdid</code>」は機能しない』っぽいのかなぁ。。。多分 SSD で起動が拙速になったからだと思うが、、、</p>
<p>上記の憶測のもとに rc.local を次のようにすれば、起動直後にユーザ用にRAMディスクに載ってる作業領域が作れるようになる。
<pre class="screen"><code>#!/bin/sh
RAMSIZE=1024 # MBtyes
MP=/tmp/ramdisk
MYNAME=username
# Start hdiXXX
launchctl start com.apple.hdiejectd
sleep 5
# Make RamDIsk
RAMNUMSECTORS=$((${RAMSIZE}*2048))
ramdev=$(hdid -verbose -kernel -nomount ram://${RAMNUMSECTORS})
newfs_hfs -v ramdisk $ramdev
[ -d ${MP} ] || mkdir ${MP}
mount -t hfs -o nobrowse $ramdev ${MP}
# Finder.appで /Volume 以下で参照したいときは nobrowse を外す
# for ${MYNAME}
mkdir ${MP}/${MYNAME}
chown -R ${MYNAME}:${MYNAME} ${MP}/${MYNAME}
</code></pre>
</p>
<p>あとは、ログイン項目に、次のような キャッシュを調節するシェルスクリプトを埋め込んだ Automator アプリを登録すれば良い。
</p>
<script src="https://gist.github.com/730359.js?file=gistfile1.sh"></script>
<p>まぁ、サクサクになったのかなぁ?</p>
<h4>追記 (2010/11/06)</h4>
<p>コードをちょっとだけ整理して、Xcode と TMPDIR もRAMDISKにのせてみた。</p>
<h4>追記 (2010/12/23)</h4>
<p>TMPDIR もRAMDISKに載せると、どうも ramdisk のアクセス出来ない現象が時々発生し、キャッシュを載せている Chromeなどのブラウザが固まって、まともに使えない結果になる。。。どうも TMPDIR は ramdisk に載せて運用するのは難しそうである。仕方がないので、設定を削除してみた。。。ここ1ヶ月は、安定してるっぽいので正解かな。。。</p>
</div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-17472840036754462592010-10-16T15:59:00.001+09:002010-10-16T15:59:14.504+09:00dotfiles を github に上げてみた<p>dotfiles を公開レポジトリに上げるのが最近の流行らしい。なので、僕も github に上げてみた。</p>
<ul>
<li><a href="http://github.com/fukusaka/dotfiles">http://github.com/fukusaka/dotfiles</a></li>
</ul>
<p>結構古くから VCS に入れて適当に履歴を記録したんだが、
「git rebase -i 」を使うと commit を修正できるので、
CVS ~ Subversion ~ git に変更する過程の履歴を
適当に整理してみた。</p>
<p>うん、なんとも紆余曲折がある、、、未だにちょっと壊れ気味の設定だなぁ。。。</p>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-34393043475646497592010-10-01T03:29:00.001+09:002011-02-12T16:57:15.561+09:00Squeeze に移行してみる<p>
squeeze がフリーズされて、暫く経つので安定の良い頃合いかなと、
自宅のメインのサーバを lenny から squeeze に移行してみた。</p>
<p>何とも、安定してる。。。</p>
<p>lenny ベースだと、古く使いたい機能が無いので、
適当に野良バックポートしてた <code>netatalk</code> と <code>kvm/libvirt-bin</code> とか幾つかあったのが、
標準のパッケージで済むのが良い。</p>
<p>ただ、1点だけ手作業が必要だった。
どうも autofs のマップファイルが LDAP を参照しているとき、
マスタでは slapd が立ち上がらないタイミング(autofs より slapd が後)なので、
うまく機能しない。。。</p>
<p>まだ sysvinit ベースなので、次のようにした。</p>
<pre><code>update-rc.d -f slapd remove
update-rc.d slapd defaults 18 82
</code></pre>
<p><del><code>upstart</code>に移行した暁には、Debian もいい感じになるのかなぁ</del></p>
<div class="fullpost">
<h4>追記 (2011/02/12)</h4>
<p>Debian squeeze から upstart の時代だといった奴は、、、
sysvinit と insserv の合わせ技が標準じゃないかぁ!!</p>
<p>なので、<code>/etc/init.d/autofs</code> の先頭に書かれた insserv 設定行の該当部分を下記のように書き換えると、対処ができる。</p>
<pre><code>...
# Should-Start: ypbind nslcd slapd
# Should-Stop: ypbind nslcd slapd
...</code></pre>
</div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-11692105940476568122010-07-01T16:54:00.001+09:002010-09-06T23:39:56.724+09:00Linux SCSI Target Framework を使う<p>Debian/Ubuntu の iSCSI Target のお話が出てくると、<a href="http://iscsitarget.sourceforge.net/">iSCSI Enterprise Target (IET)</a>が必ず出てくる。</p>
<p>まぁ、良いんだけど kernel ソースに取り込まれていないモジュールを使うので、
時々、他の複合的な要因かもしれないが、あさっての場面で oops は吐いくれたりする。</p>
<p>Fedora/RHEL/CentOS とかだと、既に<a href="http://stgt.sourceforge.net/">Linux SCSI Target Framework(tgt)</a>に移行している。コイツは 2.6.20 頃 kernel ソースに取り込まれているので、
結構安定してるんじゃないかなと思う。</p>
<p>tgt の性能に関しては、2006 年頃の論文「<a href="http://ci.nii.ac.jp/Detail/detail.do?LOCALID=ART0007520362&lang=ja">Linuxにおけるストレージシステムフレームワークの実現(オペレーティングシステム)</a>」を見る限り、IET と若干落ちるぐらいなので、気にしなくても良いかも。</p>
<p>そろそろ Debian/Ubuntu でも Linux SCSI Target Framework(tgt)に移行する時期だ。</p>
<p>ユーザベースのツール群 <a href="http://packages.qa.debian.org/t/tgt.html">tgt パッケージ</a>は、squeeze/lucid で用意されているみたいなので、やってみた。</p>
<div class="fullpost">
<p>ハマりポイントが2点ある。</p>
<ol>
<li>init スクリプトが見当たらない。バグ(<a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=577925">#577925</a>、<a href="https://bugs.launchpad.net/ubuntu/+source/tgt/+bug/574554">BUG #574554</a>)として登録されている。</li>
<li>tgt-admin 内で、デバイスが既に利用してるかどうかチェックする部分が上手く動いていない。と言うか、Debian/Ubuntuでは /bin/sh が dash (ash の亜種) になっているため、perl の system関数の呼び出しのスクリプト片に移植性がある書き方が要求される。コイツを踏んでる。</li>
</ol>
<p>なので Fedoraのinitスクリプトを参考に、upstart 用のイベント設定ファイル? <a href="http://gist.github.com/459680#file_tgtd.conf">/etc/init/tgtd.conf</a>を書き下し、tgt-admin の修正パッチ<a href="http://gist.github.com/459680#file_tgt_admin.diff">tgt-admin.diff</a>を作ってみた。</p>
<p>例として、単一ディスクをiSCSIで公開する事を考える</p>
<p>以下の設定ファイルを書き下し、「tgt-admin -e」とタイプすれば良い。</p>
<p><code>/etc/tgt/targets.conf</code>
<pre class="screen">default-driver iscsi
<target iqn.2010-07.com.example:stroage.fserver.data>
driver iscsi
backing-store /dev/sdb
</target>
</pre></p>
<p>実際にiSCSIターゲット設定が上手く行ったかは、次のようにする。
<pre class="screen"># tgt-admin -s
Target 1: iqn.2010-07.com.example:stroage.fserver.data
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB
Online: Yes
Removable media: No
Backing store type: rdwr
Backing store path: None
LUN: 1
Type: disk
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 34360 MB
Online: Yes
Removable media: No
Backing store type: rdwr
Backing store path: /dev/sdb
Account information:
ACL information:
ALL
</pre>
</p>
<p>あとは、巷に溢れている tgt の設定方法が使える。
上手く設定すると、CDドライブやリムーバルディスクとかも、ネット越しで使えるようになるらしい。</p>
<h4>追記 (2010/09/06)</h4>
<p>気づいてみると、二番目のハマり点も修正済み(<a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=589716">#589716</a>)になったようである。</p>
<p>debian squeeze がリリースしたら、tgt をサクッと使うようになれる訳ですね。</p>
</div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-25805107106742093662010-06-08T13:27:00.001+09:002010-06-08T14:06:06.273+09:00日本語 texi から栞付きPDFを生成する<p>
GNU のドキュメントシステムに texi 形式のファイルがある。
この形式のファイルから適当なコマンドを使って、info / dvi / pdf / html 等の
文書に変換できる。</a>
<p>最近では PDF 形式に変換するのに pdfetex を使う事で dvi 経由せずに直接 pdf に変換できる。
ただ、pdfetex は日本語化されていないので、日本語で書かれた texi は pTeX と dvipdfmx を組み合わせて変換する必要がある。</p>
<pre class="screen">% TEX=ptex texi2dvi filename.tex
% dvipdfmx filename.dvi
</pre>
<p>このやり方でも pdfetex を使った変換と同様な PDF が作れるが、一つだけ違いがある。</p>
<p>栞/ブックマークが付かない。</p>
<p>実用上は問題は無いが、栞が付いた方が使い易い。。。はてどうしたもんだかぁ</p>
<div class="fullpost">
<h4>texinfo.tex の日本語化</h4>
<p>変換用のマクロ texinfo.tex の日本語化は本家 <a href="http://www.gnu.org/software/texinfo/">texinfo</a>には含まれていない。
現在良くメインテナンスされているものとして、<a href="http://w32tex.org/index-ja.html">角藤版pTeX</a>の texinfotools-w32.tar.bz2 がある。</p>
<p>ただ、僕も昔に texinfo.tex や makeinfo のナンチャって日本語化対応したことがある。
HDD の隅にある断片を探して調べてみたら、どうも elisp-manual-19-2.4-jp2.0.tar.gz を起点にして
作業したもので、検索をかけるとホンの僅かだが OSS の文書変換用に取り込まれている。。。</p>
<p>まぁ、自分の成果から起点とするのが、やり易いからコイツから作業するのがいいやぁ</p>
<p><a href="http://project.ktug.or.kr/dvipdfmx/">dvipdfmx</a> が PDF 生成用の special は
「<a href="http://gaspra.kettering.edu/dvipdfm/dvipdfm.pdf">Dvipdfm User’s Manual</a>」/「<a href="http://project.ktug.or.kr/dvipdfmx/doc/tb94cho.pdf">DVI specials for PDF generation</a>」
にキッチリ記載があり、栞の生成は難しくはなさそうである。</p>
<p>で、texinfo.tex の履歴だけ<a href="http://github.com/fukusaka/texinfo-ja">github fukusaka/texinfo-ja</a> に上げて、texinfo.tex の最新版と組み合わせて使えるように修正、同時に栞生成コマンド<code>@usedvipdfmx</code>を追加してみた。</p>
<h4>使い方</h4>
<p>texi のヘッダ部を次のように修正する。</p>
<pre class="screen"><code>\input texinfo @c -*-texinfo-*-
@c %**start of header
@setfilename filename.info
@settitle TITLE
@documentlanguage ja
@documentencoding utf-8
@iftex
@usedvipdfmx
@end iftex
@c %**end of header
</code></pre>
<p>で、pTeX / dvipdfmx を使って、栞付きのPDFが生成できる。</p>
<h4>まとめ</h4>
<p>iOS4のPDFリーダーは栞付きが上手く扱えるのだろうかぁ。。。</p>
</div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-7770563918063173872010-05-26T23:45:00.000+09:002010-06-16T08:42:00.557+09:00Cocoa Emacs のフレームをSpaces のワークスペースの上下左右に飛ばす。<p>個人的な使い方の問題だろうが、emacs に凝っていた頃は仮想ディスクトップ毎にフレームを置いた使い方をしていた。
<ul>
<li><a href="http://moimoitei.blogspot.com/2007/03/emacs.html">emacs のフレームを仮想ディスクトップの上下左右に飛ばす</a></li>
</ul>
この使い方の要は、elisp からフレームを任意の位置、任意のワークスペースに移動できる事であった。</p>
<p>既に MacOSX では仮想ディスクトップが Spaces としてサポートされている。
位置移動はできるようだが、ワークスペースの移動はどうもわからない。。。</p>
<p>マウスでチマチマ動かすのは、ちょっといただけない。。。</p>
<p>どうしたもんだろう?</p>
<div class="fullpost">
<h4>Quartz のなんか</h4>
<p>MacOSX の仮想ディスクトップは Leopard で初めてお目見えしたが、
結構前から Window Server (Quartz Compositor/Core Graphics Services/Quartz Window Services...一体いくつの名称があるんだか。。。)には実装されていたそうである。
Tiger の時代から仮想ディスクトップがサードパーティのものがあったのはそういう訳らしい。</p>
<ul>
<li><a href="http://www.cocoadev.com/index.pl?CoreGraphicsPrivate">CocoaDev: CoreGraphicsPrivate</a></li>
<li><a href="http://developer.apple.com/mac/library/documentation/Carbon/Reference/CGWindow_Reference/Reference/Functions.html#//apple_ref/doc/uid/TP40008073-CH2-SW1">Quartz Window Services Reference: Functions</a></li>
<li><a href="http://xcatsan.blogspot.com/2008/03/2-window.html">Cocoaの日々: 画面キャプチャその2 - Window選択の視覚効果</a></li>
<li><a href="http://stackoverflow.com/questions/2308820/how-can-i-programatically-move-one-terminal-app-window-to-another-space">How can I programatically move one Terminal.app window to another space? - Stack Overflow</a></li>
</ul>
<p>で、コイツのAPIのほとんどが今でも非公開になっている。。。断片的には、スクリーンキャプチャ用途レベルのものが公開されている。。。なんとも厄介。</p>
<p>先人が調べ尽くした結果として、最後のリンクの先の内容が、
特定のウィンドウを任意のワークスペースに移動する方法らしい。</p>
<p>模式コードは次のようになる。(CGSPrivate.hは一番目のリンク先にあるもの)</p>
<pre class="screen"><code>#import <CGSPrivate.h>
...
NSWindow *win = ...;
CGSConnection cid = _CGSDefaultConnection();
CGSWindow wid = [win windowNumber]; // ?
CGSMoveWorkspaceWindowList(cid, &wid, 1, workspace);
</code></pre>
<p>CGSを解析した作られた CGSPrivate.h でのCGSWindow と
Appleから出ているドキュメントに出てくる CGWindowID とは
window server 内で割り振られた番号で同じ実体と思われるが、
NSWindow の windowNumber のドキュメントには、それとは違うと書かれている。
混ぜても動いたから多分良いかと思われるが、、、ここいらはぼかしたい内容なのかなぁ。。。分からんなぁ林檎は。</p>
<p>まぁ、ここまで分かれば、出来たも同然〜。</p>
<p>で、適当にコマンドを作ってみた。</p>
<a href="http://gist.github.com/414559#file_cgsutil.m">cgsutil.m</a>
<h4>Emacs.appの改造</h4>
<p>(frame-parameters)には window-id があるから、Cocoa Emacs では多分コイツがフレームウィンドウの CGWindowID のはずで、コイツと飛ばしたい workspace 番号を適当に作ったコマンドに渡して、お仕舞いかなぁ。</p>
<p>わぁーい。らくちん。<br /><br />はぅ。。。</p>
<p>Cocoa Emacs では window-id の値は、1から単調増になるように割り振った全く意味の無い番号でした。</p>
<p>仕様が無いので、次の追加機能を付けるパッチ(<del>emacs-23-cgs-workspace.diff</del>)
を作ってみた。</p>
<ul>
<li>フレームパラメータ<code>ns-window-id</code>に、CGWindowIDと思われる値</li>
<li><del>フレームパラメータ<code>ns-workspace-id</code>に、フレームのworkspace番号</del></li>
<li>フレームを指定のworkspaceに移動する関数 <code>(set-frame-ns-workspace FRAME WORKSPACE)</code></li>
</ul>
<p>まぁ、最初の一つだけで十分だが、後二つは組込まなくてもいいかも。</p>
<h4>まとめ</h4>
<p>上のパッチを適用した Emacs.app に適当な elispを書くと、1コマンドで複数のフレームを特定のワークスペース/特定の位置に開く事が出来るようになった。</p>
<a href="http://www.flickr.com/photos/24156556@N07/4640977445/"><img src="http://farm5.static.flickr.com/4055/4640977445_5c74dec2ec_m.jpg" height="150" width="240" alt="screenshot-2010-05-26 17.54.51"/></a>
<p>うん〜〜。快適じゃ。<br /><br />はぅ。。。</p>
<p>Cocoa Emacs で8フレームも開くと、キー入力が引っ掛かるようになり、Emacsプロセス自体のCPU利用率もイマイチ高い。イベント処理方法にまだ難があるのかなぁ。</p>
<p>4フレームくらいで抑えないとスムーズに使えないかなぁ。。。</p>
<h4>追記 (2010/06/16)</h4>
<p>複数のフレームを開いたときCPU利用率が高くなるのは、本パッチ内のframe-paramaters にワークスペース番号を追加するのが原因だった。。。frame-parameters の取得は不随に起きるらしくのでどうも軽くなくては行けない。</p>
<p>なので、workspace番号は取得関数から得るように変更し、workspace 絡みの部分を分けたパッチにしてみた。</p>
<ol>
<li><a href="http://gist.github.com/414251#file_emacs_23_cg_window_id.diff">emacs-23-cg-window-id.diff</a>
<ul>
<li>フレームパラメータ<code>ns-window-id</code>に、CGWindowIDと思われる値</li>
</ul></li>
<li><a href="http://gist.github.com/414251#file_emacs_23_cgs_workspace.diff">emacs-23-cgs-workspace.diff</a>
<ul>
<li>指定フレームのworkspaceを取得する関数 <code>(frame-ns-workspace FRAME)</code></li>
<li>フレームを指定のworkspaceに移動する関数 <code>(set-frame-ns-workspace FRAME WORKSPACE)</code></li>
</ul></li>
</ol>
<p>ふむ。<br/>
8フレームを開いても、キー入力が引っ掛かる症状は無くなった!!<br/>
すごく快適〜ん。
</p>
<p>パッチを切ったり張ったり入れ替えたりする(<a href="http://progit.org/book/ja/ch6-4.html">1</a>)のに、git rebase -i は極めて便利。git 優秀だなぁ</p>
</div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-88882577014996728142010-05-18T00:13:00.001+09:002010-05-27T23:25:11.083+09:00Emacs で文法チェック<p>Emacs でプログラムを書く人々は、リアルタイムに文法チェックをするために <a href="http://www.emacswiki.org/FlyMake">flymake</a> を使うらしい。</p>
<p>以前聞き覚えがあるが、何をする物か分からないのでスルーした奴だが、結構使えるものだったのかぁ。</p>
<p>なので flymake の設定をしてみた。</p>
<div class="fullpost">
<h4>Quick Start</h4>
<p>詳細は info マニュアルに書かれているが、
使い始めの設定は次の通りになる。この状態で、何もせずに Perl/PHP の文法チェックは行なえる(perl/php コマンドがあればの話だが)。</p>
<pre class="screen"><code>(require 'flymake)
;; GUIの警告は表示しない
(setq flymake-gui-warnings-enabled nil)
;; 全てのファイルで flymakeを有効化
(add-hook 'find-file-hook 'flymake-find-file-hook)
;; M-p/M-n で警告/エラー行の移動
(global-set-key "\M-p" 'flymake-goto-prev-error)
(global-set-key "\M-n" 'flymake-goto-next-error)
;; 警告エラー行の表示
(global-set-key "\C-cd" 'flymake-display-err-menu-for-current-line)
</code></pre>
<p>次に C/C++ で文法チェックを可能にするには、
Makefile を使い、次の様な check-syntax ルールを追加すればよい。</p>
<pre class="screen"><code>PHONY: check-syntax
check-syntax:
$(CC) -Wall -Wextra -pedantic -fsyntax-only $(CHK_SOURCES)
</code></pre>
<p>ここまですると、編集途中にリアルタイムに文法エラー/警告の部分に色が付き、分かり易い。</p>
<p>なるほど、、、これは素晴らしい。</p>
<p>以下の設定は、好きずきだと思う</p>
<h4>警告エラー行の表示のカスタマイズ</h4>
<p>警告エラー行の表示は、
プラットホーム毎のポップアップメニュー実装が使われるが、
色々検索すれば出てくるが、2通りのカスタマイズが良く知られている。
<ol>
<li>Minibufに表示する。</li>
<li>popup.el(auto-complete に含まれている)のpopup-tipsで表示する。</li>
</ol>
</p>
<pre class="screen"><code>;; Minibuf に出力
(defun my-flymake-display-err-minibuf-for-current-line ()
"Displays the error/warning for the current line in the minibuffer"
(interactive)
(let* ((line-no (flymake-current-line-no))
(line-err-info-list (nth 0 (flymake-find-err-info flymake-err-info line-no)))
(count (length line-err-info-list)))
(while (> count 0)
(when line-err-info-list
(let* ((text (flymake-ler-text (nth (1- count) line-err-info-list)))
(line (flymake-ler-line (nth (1- count) line-err-info-list))))
(message "[%s] %s" line text)))
(setq count (1- count)))))
;; popup.el を使って tip として表示
(defun my-flymake-display-err-popup.el-for-current-line ()
"Display a menu with errors/warnings for current line if it has errors and/or warnings."
(interactive)
(let* ((line-no (flymake-current-line-no))
(line-err-info-list (nth 0 (flymake-find-err-info flymake-err-info line-no)))
(menu-data (flymake-make-err-menu-data line-no line-err-info-list)))
(if menu-data
(popup-tip (mapconcat '(lambda (e) (nth 0 e))
(nth 1 menu-data)
"\n")))
))
</code></pre>
<p>僕としては popup.el を使うのが結構好み</p>
<h4>check-syntaxターゲットルール</h4>
<p>先に述べて Makefile の check-syntaxターゲットルールでは一種類の文法チェックプログラムしか使えない。。。
gcc でチェックできるものは全てチェック出来るから、気を回す必要は無いかもしれない。</p>
<p>GNU make を使えば、拡張子毎に文法チェックプログラムを選べるルールの書き方がある。</p>
<pre class="screen"><code>CHECKSYNTAX.c = $(CC) $(CFLAGS) $(CPPFLAGS) -Wall -Wextra -pedantic -fsyntax-only
CHECKSYNTAX.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) -Wall -Wextra -pedantic -fsyntax-only
check-syntax: $(addsuffix -check-syntax,$(CHK_SOURCES))
%.c-check-syntax:
$(CHECKSYNTAX.c) $*.c
%.cc-check-syntax:
$(CHECKSYNTAX.cc) $*.cc
</code></pre>
<p>まぁ、ここまで書く奴はいないかぁ。。。</p>
<h4>Makefileが無くてもC/C++の文法チェック</h4>
<p>Makefileが無ければ、直接 gcc で文法チェックをし、
Makefileがあればcheck-syntaxターゲットルールを使いたい場合は、
次の設定をすれば良い。</p>
<pre class="screen"><code>(defun flymake-simple-generic-init (cmd &optional opts)
(let* ((temp-file (flymake-init-create-temp-buffer-copy
'flymake-create-temp-inplace))
(local-file (file-relative-name
temp-file
(file-name-directory buffer-file-name))))
(list cmd (append opts (list local-file)))))
;; Makefile が無くてもC/C++のチェック
(defun flymake-simple-make-or-generic-init (cmd &optional opts)
(if (file-exists-p "Makefile")
(flymake-simple-make-init)
(flymake-simple-generic-init cmd opts)))
(defun flymake-c-init ()
(flymake-simple-make-or-generic-init
"gcc" '("-Wall" "-Wextra" "-pedantic" "-fsyntax-only")))
(defun flymake-cc-init ()
(flymake-simple-make-or-generic-init
"g++" '("-Wall" "-Wextra" "-pedantic" "-fsyntax-only")))
(push '("\\.[cC]\\'" flymake-c-init) flymake-allowed-file-name-masks)
(push '("\\.\\(?:cc\|cpp\|CC\|CPP\\)\\'" flymake-cc-init) flymake-allowed-file-name-masks)
</code></pre>
<h4>まとめ</h4>
<p>取り敢えず、次いでに ruby/bash の文法チェックを追加したのが、
今現在の設定になっている。</p>
<a href="http://gist.github.com/403836#file_45flymake.el">45flymake.el</a>
<p>あとは Python/Java/HTML/CSS をチェックするのがあれば良いが、、、
これくらい素のflymakeに含まれていればいいのになぁ。。。</p>
<p>あと<a href="http://cedet.sourceforge.net/semantic.shtml">Semantic</a>かぁ。。。</p>
<h4>追記 (2010/05/24)</h4>
<p>暫く使ってみたが、基本動作で2点だけイマイチな挙動を修正しないと、ストレスが溜まりまくる。
<ol>
<li>ファイルもしくは上位ディレクトリに書き込み権限が無い場合、messageを吐いて開くのを諦めてしまう。。。</li>
<li>文法チェックプログラムが無い場合 flymake がオフになるが、それでも何かのプロセス?が残って、後々無意味な y の連打をしないといけない。。。</li>
</ol>
これも、素のflymakeで用意してくれれば良いのに、、、で場当たり的に次の設定を追加した。。。</p>
<pre class="screen"><code>;; flymake を使えない場合をチェック
(defadvice flymake-can-syntax-check-file
(after my-flymake-can-syntax-check-file activate)
(cond
((not ad-return-value))
;; tramp 経由であれば、無効
((and (fboundp 'tramp-list-remote-buffers)
(memq (current-buffer) (tramp-list-remote-buffers)))
(setq ad-return-value nil))
;; 書き込み不可ならば、flymakeは無効
((not (file-writable-p buffer-file-name))
(setq ad-return-value nil))
;; flymake で使われるコマンドが無ければ無効
((let ((cmd (nth 0 (prog1
(funcall (flymake-get-init-function buffer-file-name))
(funcall (flymake-get-cleanup-function buffer-file-name))))))
(and cmd (not (executable-find cmd))))
(setq ad-return-value nil))
))
</code></pre>
<h4>追記 (2010/05/25)</h4>
<p>上の修正は、ちょっと上手く行かない場合があったので修正っと。</p>
<h4>追記 (2010/05/27)</h4>
<p>tramp経由の場合も、イマイチ上手く動かないので、除外に加えてみた。</p>
</div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-57955782972305016092010-05-13T01:37:00.000+09:002010-06-08T13:32:31.775+09:00Emacs Refcard 日本語版<p>Emacs のチートシートは、Emacs と一緒に配布されている。
refcard.tex から pdfを作って印刷すれば良い。
少し古いバージョンだが、日本語に翻訳されたものは<a href="http://emacs-20.ki.nu/refcard.shtml">「Emacs-20/21 Reference Card
」</a>にある。</p>
<p>キー操作として、手に染み付いているものは半分くらいしか無い。。。
大抵 M-x コマンドで済まして場合が多いなぁ。</p>
<p>いかんなぁ。。。</p>
<div class="fullpost">
<p>再度覚え直す為に、先の日本語RefcardとEmacs23に入ってるrefcardと若干漏れている部分を補い、
一部語句を修正し、フォント関係を微調節してものを作ってみた。</p>
<a href="http://gist.github.com/398756#file_refcardja.tex">refcardja.tex</a>
<p>次いでに ptex/dvipdfmx を使って PDF を作って、Google Docs に上げてみた。</p>
<a href="http://docs.google.com/fileview?id=0BzuGmQrn2nhAYTg4NGYzNGQtZWNlOC00ZGUwLTlmODYtZDhkNWNhMzM1NjIx&hl=ja">refcardja.pdf</a>
<h4>まとめ</h4>
<p>うん、久しぶりに素のTeXを弄ったが本当にややこしい奴だな。</p>
</div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-76386476541602317392010-05-12T03:09:00.001+09:002010-05-12T03:09:52.465+09:00Cocoa Emacs が落ちる<p>Cocoa Emacs は安定していると思ったが、
どうもポップアップダイアログが出ると暫くして落ちてしまう。</p>
<p>flymake をチマチマ使えるように設定を弄ったら、時々でるポップアップに刺さる。。。</p>
<p>しようがないので、gdbで追っかけてみた。</p>
<div class="fullpost">
<p>調べてみたら、次のような簡単な処理でも、
ポップアップが出て暫くしてEmacsが落ちるようである。</p>
<script src="http://gist.github.com/397613.js"></script>
<p>どうも inline patch 側での処理抜けらしい。。。
こんな感じに修正すると落ちなくなった</p>
<script src="http://gist.github.com/397610.js"></script>
<p>うん、すこぶる快適</p>
</div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-75321653116434820412010-05-07T13:21:00.001+09:002010-11-03T20:48:15.855+09:00Emacs23 の フォント設定<p>新し目の Emacs ではフォントエンジンの改良が進んでおり、
antialiasing が効いた奇麗な表示が出来る。また、沢山の種類のフォントを扱えるようになっている。</p>
<p>プログラムの編集等をしてると等幅フォントが必要である。
特に、日本人としてはASCII文字と日本語文字の幅が 1:2 である事が強く望ましい</p>
<p>まぁ、いくつか設定方法が流れてるので、コピペして使えば良いのだが。。。
みんなどうやって見やすい設定を探してるのだろうか?</p>
<div class="fullpost">
<p>疑問に思ったので、次のような機能のelispを書いてみた</p>
<a href="http://gist.github.com/392981#file_my_sample_ascii.el">my-sample-ascii.el</a>
<dl>
<dt>my-sample-ascii</dt>
<dd>既定のフェース default/bold/italic/bold-italic それぞれで同じメッセージを
同一のバッファに出力する</dd>
<dt>my-sample-face-size</dt>
<dd>defaultのフェースを継承し(書体を引き継ぎ)、高さが 6〜20ptのフェースを作成し、同じメッセージを
同一のバッファに出力する</dd>
</dl>
<p>適当にdefaultフェースを設定した後だが、CocoaEmacs/NTEmacs/Emacs(onUbuntu)での、
my-sample-face-sizeの結果は次のようになる</p>
<a href="http://www.flickr.com/photos/24156556@N07/4585303919/"><img src="http://farm5.static.flickr.com/4005/4585303919_acce50607b_m.jpg" height="240" width="202" alt="ss-20100507-cocoaemacs"/></a><a href="http://www.flickr.com/photos/24156556@N07/4585928964/"><img src="http://farm4.static.flickr.com/3307/4585928964_a5581285ef_m.jpg" height="240" width="227" alt="ss-20100507-ntemacs23"/></a>
<a href="http://www.flickr.com/photos/24156556@N07/4585303395/"><img src="http://farm5.static.flickr.com/4009/4585303395_2ded68c187_m.jpg" height="240" width="226" alt="ss-20100507-ubuntu10.04"/></a>
<p>いくつか設定してみたが、全ての pt で、1:2 に揃うフォントの組み合わせはほんとに稀で、日常的に使うサイズに合わせて、サイズの微調節が必要のようである。
やはり、<a href="http://ossipedia.ipa.go.jp/ipafont/index.html">IPAフォント</a>の恩恵は結構でかいなぁ。
</p>
<p>今現在、いい感じに設定できたのは次の通り。</p>
<script src="http://gist.github.com/393042.js"></script>
<h4>まとめ</h4>
<p>なんか Emacs をガンガン使い倒したくなってきた!!</p>
<h4>追加 (2010/11/03)</h4>
<p>VMware 上の X で画面サイズの変化で dpi が変化し pt 単位でフォント指定すると、実際のフォントの大きさがまちまちになるので、 明示的にpixel単位?で指定する方法に切り替えてみた。</p>
</div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-13705245944222170032010-05-06T18:33:00.000+09:002010-05-27T23:30:12.303+09:00NTEmacs 23.1.Xを使ってみる<p>Windowsの定番は <a href="http://www.meadowy.org/meadow/">Meadow</a>であり、今でも十分安定している。
ただ、ベースにしてるのが Emacs 22系なので、ちょっと新しくないかなぁ。。。</p>
<p>今日では本家Emacsでも<a href="http://www.emacswiki.org/emacs/CategoryWThirtyTwo">Windows版</a>の<a href="http://ftp.gnu.org/pub/gnu/emacs/windows/">バイナリ</a>を配布している。Windows特有のInstallerが使いたければ、<a href="http://ourcomments.org/cgi-bin/emacsw32-dl-latest.pl">EmacsW32</a>から入手できる。</p>
<p>結構、安定して使える。かつ、アイコンが奇麗だ。。。</p>
<p>本家バイナリはネイティブのIMEのサポートが弱い気がする。。。と思ったら、有志によって<a href="http://ntemacsjp.sourceforge.jp/">IMEのinlineパッチ</a>も作成されいる。また、
VCSの新し目のタグに有用なパッチを当てたバイナリも「<a href="http://gnupack.sourceforge.jp/docs/UsersGuide_ntemacs_build_history.html">NTEmacs Build History
</a>」から入手できる。</p>
<p>なので有り難く使わせてもらいます。<br/>
らくちんだ。</p>
<div class="fullpost">
<h4>設定</h4>
<p>NTEmacs内部ではWin32のA系の呼び出し(ファイルI/Oやプロセス生成など)が使われるっぽいので、
現在の言語環境でのコードページに合わせなければ、奇妙な文字化けが発生する。
つまり、ファイル名とコマンド引数(processのdecoding)のcodingは shift_jis/cp932 じゃないとまずい。</p>
<p>と思うのだが、誰か大層語ってくれる人が見当たらないので、本当のところはさっぱり分かりません。。。</p>
<p>なので、「Cygwin 1.7でUTF-8サポートされたぜ!いぇーい!今時は UTF-8 ですが何か?」とは、口が裂けても言えない。。。僕は恨めしくshift_jis/cp932で使いますよ。。。へたれですから。。。</p>
<ul>
<li><a href="http://www.emacswiki.org/emacs/CygWin">EmacsWiki: Cyg Win</a></li>
<li><a href="http://homepage3.nifty.com/y3tk/emacs.html">NTEmacs</a></li>
</ul>
<p>上のサイトや他多数をちょっと参考にして、今現在の次のようにしている。今でもチマチマ書き換えているのでそのうちgithubで晒しとくかなぁ。。。</p>
<h5>Homeディレクトリの指定</h5>
<p>ホームディレクトリ指定を環境変数HOMEで与える必要があり、Cygwinでのホームディレクトリと同じにすると混乱せずに済む。</p>
<h5>Cygwin 1.7と組み合わせる設定</h5>
<p><a href="http://gist.github.com/391926#file_03cygwin.el">03cygwin.el</a></p>
<h5>IMEの設定 (04ime.el)</h5>
<script src="http://gist.github.com/391927.js"></script>
<h5>言語設定 (05lang.el)</h5>
<script src="http://gist.github.com/391929.js"></script>
<h5>VCS系の設定</h5>
<p>cygwinのsubversionやgitを使う場合、ログメッセージが文字化けするので、ちょっと設定が必要。。。</p>
<script src="http://gist.github.com/391954.js"></script>
<p>、、、VC-xx.elの実装では、ログメッセージはコマンド引数で受け渡されるようになっている。
一時ファイル経由で無いとWindowsではバケバケになるのだが。。。そのうち直るのかなぁ</p>
<h4>まとめ</h4>
<p>あと大事な Font 設定ですね。。。<a href="http://moimoitei.blogspot.com/2010/05/font-fot-emacs-23.html">次回</a>で。</p>
</div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-62428632148108613692010-05-01T19:07:00.001+09:002010-05-12T03:20:06.900+09:00Cocoa Emacs 64bit版を作ってみる<p>最近、また Emacs にはまっている。
<p>ここ数年は vi やら eclipse やら JeditX やら xcode やらを広く浅く使っていて、
いまいちスッキリしない感じで、まぁ年なのか諦めていた。
Snow Leopardにアップグレードを期に、
ちょっと設定等を手入れしてMacOSX/Windowsで使い出したらすこぶる手になじむ。。。</p>
<p>はて、なんでEmacsを使うのを忘れていたのかんなぁ。。。</p>
<p>そう、当時 Emacs 20か 21 (mule-2.3だったかもしれん、、、)だったかなぁ。
UTF8/Unicodeを使う為にはMule-UCSとかいうパッケージが必要で、
そいつを組み合わせると普通に使えるのだが、起動も動作ももっさりしていまいちだった。。。</p>
<p>今日のEmacsはサクッとUnicode系の一群のcoding-systemが使えて、それなりに軽快に動作する。</p>
<p>良い時代になったなぁ。。。</p>
<div class="fullpost">
<p>MacOSX 上の定番は <a href="http://homepage.mac.com/zenitani/emacs-j.html">CarbonEmacs</a>で、
かなりしっかりメンテナンスされており、実に安定している。ただ、ベースにしてるのがEmacs22だったり、Carbonベースだったり、32bitバージョンだったり、本当に細かく気になる人が気になる程度。</a>
<p>ふと気づくと 本家 Emacs では既に 64bit Cocoa版が構築でき、かつ日常作業で問題ならないくらいは安定してるらしい(<a href="http://hjmr.blog.so-net.ne.jp/2009-09-29">1</a>,<a href="http://borg4.vdomains.jp/~goro/diary/2010/770">2</a>)。また、<a href="http://d.hatena.ne.jp/kazu-yamamoto/20090122/1232589385">フォントの等幅調節設定</a>や日本語入力等の<a href="http://sourceforge.jp/projects/macemacsjp/svn/view/inline_patch/trunk/?root=macemacsjp">inline patch</a>などが入手が可能で、
ほぼ CarbonEmacs を置き換えて使えるレベルになっている(と思う)。</a>
<p>なので、Cocoa Emacs 64bit を構築してみる。</p>
<h4>ソースを取ってくる</h4>
<p>うん、一番の難関は Bazaar という分散VCSを使う事かもしれない。。。<a href="http://www.emacswiki.org/emacs/EmacsFromGit">準オフィシャルなGitレポジトリ</a>があるので、Gitに慣れてる場合はこっちを使うのが吉。僕は、へたれなので git の方を使った。</p>
<ul>
<li>Bazaar レポジトリ: <a href="http://savannah.gnu.org/bzr/?group=emacs">http://bzr.savannah.gnu.org/r/emacs/trunk/</a></li>
<li>Git レポジトリ: <a href="http://repo.or.cz/w/emacs.git">git://repo.or.cz/emacs.git</a></li>
</ul>
<p>取り敢えず、
ローカルネットに emacs.git のミラーレポジトリを立てて、そのマシン上でフォークして個人用の共用レポジトリを作る。
その個人用レポジトリから作業マシンに複製を展開する。
また、継続的にupstreamを追っかけるため、ミラーレポジトリもリモートとして登録する。</p>
<pre class="screen">% ssh server # ローカルネットの server にログイン
% cd /git
% git clone --mirror git://repo.or.cz/emacs.git
% git clone --bare --reference emacs.git emacs.git emacs-my.git
...
% ssh client # 作業マシンにログイン
% cd ~/work
% git clone git+ssh://server/git/emacs-my.git emacs
% cd emacs
% git remote add upstream git+ssh://server/git/emacs.git
% git fetch upstream
</pre>
<p>個人用レポジトリを挟んだのは、バックアップを意図してなんだが、、、git使いはそんな事はしないのかなぁ。。。分からんなぁ。。。</p>
<h4>パッチをあてる</h4>
<p>続いて<a href="http://sourceforge.jp/projects/macemacsjp/">MacEmacs JP</a>
から inline_patch を取って当てる。</p>
<pre class="screen">% ssh client # 作業マシンにログイン
% cd ~/work/emacs
% git checkout -b topic EMACS_PRETEST_23_1_96 # 次いでに topic ブランチも作っとく
% pathc -p0 < emacs-inline.patch
</pre>
<h4>構築する</h4>
<p>あとは、configure/make で問題が無ければ nextstep/Emacs.app の場所で 64bit Cocoa Emacs が構築される。</p>
<pre class="screen">% ssh client # 作業マシンにログイン
% cd ~/work/emacs
% eval "$(PATH= /usr/libexec/path_helper -s)" # PATHをクリーンにする
% ./configure --with-ns
% make install
% open nextstep/Emacs.app # Emacsの実行確認
</pre>
<p>なんともあっけなく構築できた。
ただ、僕は masterブランチの方にパッチを丁寧に当てた物(24.0.50とか)を使っている。すこぶる快適。</p>
<h4>定期的追っかける</h4>
<p>まぁ、忘れそうなので次いでに書いとく。</p>
<p>ミラーレポジトリは次のコマンドで更新する。</p>
<pre class="screen">% ssh server # server にログイン
% cd /git/emacs.git
% git fetch
</pre>
<p>そして、作業レポジトリで upstream を追っかけるには</p>
<pre class="screen">% ssh client # 作業マシンにログイン
% cd ~/work/emacs
% git fetch upstream
% git rebase upstream/master topic # upstream 先端に rebase
% git push origin :topic # topicブランチを削除し、
% git push origin topic:topic # 新しくtopicブランチをプッシュ
</pre>
<p>いまいち Git の使い方に慣れない/分からないので、間違ってるかもしれん。。。</p>
<p>そういえば、github にも Emacsの<a href="http://github.com/emacsmirror/emacs">ミラーレポジトリ</a>が上がってるので、そのうち生えてくるかもしれん。。。</p>
<p>それにしても覚える事が次から次と現れて、知恵熱が出っぱなしだなぁ。。。</p>
<p>初期設定のemacs.elはまた次回。</p>
<h4>追記 (2010/05/06)</h4>
<p>フォント以外の設定は、殆ど定型文っぽいので以下の用に設定した。</p>
<script src="http://gist.github.com/391971.js"></script>
<p>フォントの設定は「<a href="http://moimoitei.blogspot.com/2010/05/font-fot-emacs-23.html">Emacs23 の フォント設定</a>」を参照</p>
<h4>追記 (2010/05/12) </h4>
<p>どうもポップアップダイアログが出たとき落ちる問題には<a href="http://moimoitei.blogspot.com/2010/05/fix-cocoa-emacs-23.html">パッチ</a>が必要。</p>
</div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-81568998806699153292010-03-03T20:16:00.001+09:002010-04-19T04:04:00.928+09:00libvirtd を終了時にGuestOSを保存する方法<p>libvirt+QEMU/KVM を使った仮想化の運用を続けていると、どうしても気になる事がある。</p>
<p>libvirtd の設定には、自動起動するGuestVMは登録できるのだが、
終了時には有無を言わさず GuestVM を強制終了してしまう事である。</p>
<p>自前で libvirt (0.7.2)を入れているので今のバージョンでは何らかのサポートが入ってかもしれない。
ただ「<a href="http://libvirt.org/news.html">libvirt: Releases</a>」を見る限り入って無さそうである。</p>
<p>それにQEMU/KVMドライバだけの挙動かもしれない。他とドライバ(Xen等々)だと状況は違うかもしれない。</p>
<p>まぁ。。。そのうち何らかの対応が入るんだろうなぁ。。。</p>
<p>そうは言っても、ホストマシンを終了するときイチイチ確認するのは難儀である(とくにACPIサポートが悪く電源断しないGuestOSタイプとかねぇ)。</p>
<p>さて、QEMUにはVMの状態を保存復帰(save/restore)がサポートされている。コイツとストレージ共有を組み合わせると、ライブマイグレーションが一丁上がりになるので、つい何年か前に小躍りしてる人がたくさんいた気がする。</p>
<p>まぁ普通にサスペンド/レジュームの仕組みなので、コイツをなんとか上手く使うスクリプトを組んでみた。</p>
<div class="fullpost">
<p>指定する項目は3つで、それぞれスクリプト冒頭に書かれている。<p>
<a href="http://gist.github.com/370474#file_libvirt_start_stop_vm.sh">libvirt-start-stop-vm.sh</a>
<pre class="screen"><code>...
SAVEVMDIR="/var/lib/libvirt/save" # 保存するVMの置き場所
LISTVM_SHUTDOWN="linux_sid linux_fedora" # 終了時 shutdown するもの
LISTVM_SAVE="freebsd_cur netbsd_cur solaris" # 終了時 save するもの
...
</code></pre>
<p>やってる事は単純で virsh コマンドを叩いてるだけである。
ただ、LISTVM_なんたらで指定し無かったり、15分以内に正常に電源断しない奴は、
最後に念のためsaveしてある。</p>
<p>コイツを、/etc/init.d/libvirt-binのスクリプトの必要な部分に<a href="http://gist.github.com/370476#file_libvirt_bin.diff">入れ込む</a>だけ。</p>
<p>うん〜、これでマシンを立ち上げると前回マシンを落とした時の状態のままのSolaris10/FreeBSDが立ち上がるようになった。。。しかし、時刻が合わん。なんか、GuestOSが共通に取れるイベントの仕組みがあるのかなぁ。。。SNMPとかで叩くんかなぁ。。。SSHとかで叩くんかいなぁ。。。順当に cron でntp引っ張ってくるが原始的でいいのかぁ。。。でも、時刻合わせの精度は低いし、常時CPUをちょっとだけ使うのはなぁ。。。ぶつぶつ</p>
<p>あんまり、すっきりしないが個人で使う分には用は足りそうである。</p>
</div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0tag:blogger.com,1999:blog-1747986548294113572.post-544592874914548932009-12-09T17:28:00.001+09:002009-12-09T17:30:44.382+09:00VIA EPIA EN のその後<p>VIA EPIA EN12000 を24時間運転してサーバ運用してる。
以前は、時々ハングアップしていたのため、保険で watchdog 設定をしていたのだが、
奇妙なことに安定動作している。 </p>
<pre class="screen"># uptime
16:32:08 up 48 days, 21:24, 1 user, load average: 0.06, 0.07, 0.01
</pre>
<p>取り敢えず、1ヶ月半くらい連続運転している。</p>
<p>はて?<br/>なにが効果あったのかな?</p>
<div class="fullpost">
<p>
環境としては、
<ul>
<li>VIA-EN12000EG / VIA C7 1.2GHz</li>
<li>DDR2-533 1G (IO-DATA DX533-1G) </li>
<li>PATA SSD 32G (TS32GSSD25-M)</li>
<li>SATA HDD 1Tx2 (WDC WD10EADS-00L/WDC WD10EADS-00M)</li>
<li>Debian lenny の標準的なパッケージをほぼ使ってる。</li>
</ul>
TimeMachine の バックアップ先になっており、一時間ぐらいの間隔で
バースト的に Network I/O や Disk I/O が同時に発生する状況にある。</p>
<p>取り敢えずは、今のところ安定している。。。</p>
<p>まぁ、ネットワーク負荷を計測するときには、
負荷をかけるとハングアップすることが多々あった。
追っかけてみようかと思って保留して、
計測後の環境ではハングアップが全く無くなったので放置してしまった。</p>
<p>計測前と計測後には大きく2点の作業をしてある。</p>
<h5>メモリのフリーページの調節</h5>
<p>運良くコンソールにメッセージが出てきたとき「lockup」とかは見た記憶がある。
別のメッセージだったかもしれない。
色々調べて、「メモリーのフリーページの不足ぎみが NICドライバ内でのlockupを引き起こす」とか適当に結論づけて、
次の設定をした気がする</p>
<pre class="screen"># echo "vm.min_free_kbytes = 8192" >> /etc/sysctl.conf</pre>
<p>ただ、もっと良い設定があって次のようなスクリプトを自前のバックアップ処理の後に入れている</p>
<pre class="screen"><code>## pagecache clear & dirty page & inode cache clear
/sbin/sysctl -w vm.drop_caches=3
#
/sbin/sysctl -w vm.drop_caches=0
</code></pre>
<p>この設定は、結構気分の問題な気がする。</p>
<h5>NIC ドライバの変更</h5>
<p>計測中も、ベンダ提供のものか、自前で修正したものを使っている。
計測後は、自前で修正したものを使って長期運用している。。。ってその為に改良したしなぁ。</p>
<p>Debian 標準カーネルに含まれているvia-velocityドライバはバースト的なI/Oにはlockupするような、気がする。</p>
<h4>まとめ</h4>
<p>人生で初めて家の電灯の安定器のコンデンサが破裂していく音を聞いた。</p>
<p>「しゅるしゅるしゅる〜〜、ぷぅん」って。</p>
<p>VIA-EN12000EG のコンデンサが減ったった時が、VIA とのお別れですね</p>
</div>
fukusakahttp://www.blogger.com/profile/18029788760478806809noreply@blogger.com0