<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xml:lang="ja">
  <channel>
    <title>unknownplace.org - memo</title>
    <link>http://unknownplace.org/memo/</link>
    <description>just my memo</description>
    <dc:creator>typester</dc:creator>
    <item>
      <title>yokohama.pm tech talk #5</title>
      <link>http://unknownplace.org/memo/2010/03/06/1/</link>
      <description><![CDATA[<p>OpenSocial なモバイルアプリを書く場合、アプリ単体でテストできるようにしてくれる Moxy の OpenSocial プラグインの話と、外部 API 呼び出しを専用に行う非同期なプロクシサーバーの話をしました。</p>
<p>資料はこちら:</p>
<blockquote><p><a href="http://typester.stfuawsc.com/slides/yokohamapm5/start.html">OpenSocial mobile application development</a></p></blockquote>
<p>前者に関しては、個人的には OpenSocial モバイルアプリ開発には必須なツールなので良い感じにしていきたいところ。 ＆してくれるひと募集。</p>
<p>後者のプロクシサーバーは「あんまり頭よくない」だけれども、現在のウェブアプリケーションの構成で、API呼び出しの待ち時間をうまく使おうとするときにはこうなるのかなぁと思った。同じようなことをしているところもあるらしい！</p>
<p>個人的にはそれ〜でできるよ！ってのがないかなーと思っていたのだけど、ないっぽいのかなー。</p>
<p>nginx でおしいところまではできるので、モジュール書いたら出来るのか調べてみようと思う。</p>
]]></description>
      <dc:creator>typester</dc:creator>
      <pubDate>Sat, 06 Mar 2010 04:19:00 GMT</pubDate>
      <category>perl, yokohama.pm</category>
    </item>
    <item>
      <title>local::lib を切り替える</title>
      <link>http://unknownplace.org/memo/2010/03/01/1/</link>
      <description><![CDATA[<p>レガシーなアプリをメンテするのにレガシーな Perl モジュールが必要になることがあり、そのために古いアプリ用には専用の <code>local::lib</code> ディレクトリを切っているわけですが、普段から日常的に <code>local::lib</code> を使用しているため shell が上がったタイミングではデフォルトの <code>local::lib</code> 環境変数がセットされていて切り替えが非常に面倒だった。</p>
<p>これまではそれほど頻繁に使用しなかったので放置していたのだが、ここのところ頻繁に必要になるためいい加減うざくなってきて簡単に <code>local::lib</code> を切り替えられるよう設定をしてみた。</p>
<p>zsh に次のような関数をつくり、それで <code>local::lib</code> を切り替えるようにする。</p>
<pre><code>function locallib () {
    INSTALL_BASE=$1
    if [ -d $INSTALL_BASE ]; then
        eval $(~/bin/use-locallib $INSTALL_BASE)
    fi
}
</code></pre>
<p>これは</p>
<pre><code>$ locallib ~/perl5
</code></pre>
<p>などのように <code>INSTALL_BASE</code> を指定して使う。指定されたパスが存在したら <code>use-locallib</code> というコマンドを使用して環境変数を切り替えるという内容。</p>
<p>この <code>use-locallib</code> コマンドは以下のようなソースになっていて、古い <code>local::lib</code> の環境変数をクリアするとともに、新しい <code>local::lib</code> の環境変数を <code>print</code> するというものになっている。</p>
<pre><code><span class="comment-delimiter">#</span><span class="comment">!/usr/bin/env perl
</span>
<span class="keyword">use</span> <span class="function-name">strict</span>;
<span class="keyword">use</span> <span class="function-name">warnings</span>;
<span class="keyword">use</span> <span class="function-name">Pod::Usage</span>;

<span class="keyword">use</span> <span class="function-name">Config</span>;
<span class="keyword">use</span> <span class="function-name">File::Spec</span>;

<span class="keyword">my</span> <span class="variable-name">$install_base</span> = <span class="cperl-array">$ARGV</span>[0]
    <span class="type">or</span> pod2usage(-1);

$install_base = File::Spec-&#62;rel2abs($install_base);

<span class="keyword">my</span> <span class="variable-name">$path</span>     = <span class="cperl-hash">$ENV</span>{<span class="string">PATH</span>};
<span class="keyword">my</span> <span class="variable-name">$perl5lib</span> = <span class="cperl-hash">$ENV</span>{<span class="string">PERL5LIB</span>};

<span class="cperl-nonoverridable">push</span> <span class="cperl-array">@INC</span>, File::Spec-&#62;catdir($install_base, <span class="string">&#39;lib&#39;</span>, <span class="string">&#39;perl5&#39;</span>);

<span class="keyword">require</span> <span class="keyword">local</span>::lib;
<span class="keyword">my</span> <span class="cperl-hash">%env</span> = <span class="keyword">local</span>::lib-&#62;build_environment_vars_for($install_base, 1);

<span class="comment-delimiter"># </span><span class="comment">remove $PERL5LIB set by old local::lib if it exists.
</span><span class="keyword">if</span> (<span class="keyword">my</span> <span class="variable-name">$old_base</span> = <span class="cperl-hash">$ENV</span>{<span class="string">PERL_MM_OPT</span>}) {
    <span class="keyword">my</span> <span class="cperl-hash">%mmopt</span>;
    <span class="keyword">for</span> <span class="keyword">my</span> <span class="variable-name">$opt</span> (<span class="cperl-nonoverridable">split</span> <span class="constant">/</span><span class="string">:</span><span class="builtin">+</span><span class="constant">/</span>, $old_base) {
        <span class="keyword">my</span> (<span class="variable-name">$k</span>, <span class="variable-name">$v</span>) = <span class="cperl-nonoverridable">split</span> <span class="constant">/</span><span class="string">=</span><span class="constant">/</span>, $opt;
        <span class="cperl-hash">$mmopt</span>{$k} = $v;
    }

    <span class="keyword">if</span> (<span class="keyword">my</span> <span class="variable-name">$old_installbase</span> = <span class="cperl-hash">$mmopt</span>{<span class="string">INSTALL_BASE</span>}) {
        <span class="keyword">if</span> ($old_installbase <span class="type">eq</span> $install_base) {
            <span class="comment-delimiter"># </span><span class="comment">do nothing if install_base is equal to old one
</span>            <span class="keyword">exit</span>;
        }

        <span class="keyword">my</span> <span class="cperl-array">@old_perl5lib</span> = (
            File::Spec-&#62;catdir($old_installbase, <span class="string">&#39;lib&#39;</span>, <span class="string">&#39;perl5&#39;</span>),
            File::Spec-&#62;catdir($old_installbase, <span class="string">&#39;lib&#39;</span>, <span class="string">&#39;perl5&#39;</span>, <span class="cperl-hash">$Config</span>{<span class="string">archname</span>}),
        );

        <span class="cperl-hash">$env</span>{<span class="string">PERL5LIB</span>} = <span class="keyword">do</span> {
            <span class="keyword">my</span> <span class="cperl-array">@env</span>;
            <span class="constant">ENV:</span> <span class="keyword">for</span> <span class="keyword">my</span> <span class="variable-name">$e</span> (<span class="cperl-nonoverridable">grep</span> { $_ } <span class="cperl-nonoverridable">split</span> <span class="cperl-hash">$Config</span>{<span class="string">path_sep</span>}, <span class="cperl-hash">$env</span>{<span class="string">PERL5LIB</span>}) {
                <span class="keyword">for</span> <span class="keyword">my</span> <span class="variable-name">$old</span> (<span class="cperl-array">@old_perl5lib</span>) {
                    <span class="keyword">next</span> <span class="constant">ENV</span> <span class="keyword">if</span> $old <span class="type">eq</span> $e;
                }
                <span class="cperl-nonoverridable">push</span> <span class="cperl-array">@env</span>, $e;
            }
            <span class="type">join</span> <span class="cperl-hash">$Config</span>{<span class="string">path_sep</span>}, <span class="cperl-array">@env</span>;
        };

        <span class="keyword">my</span> <span class="variable-name">$old_path</span> = File::Spec-&#62;catdir($old_installbase, <span class="string">&#39;bin&#39;</span>);
        <span class="cperl-hash">$env</span>{<span class="string">PATH</span>} = <span class="keyword">do</span> {
            <span class="keyword">my</span> <span class="cperl-array">@p</span>;
            <span class="keyword">for</span> <span class="keyword">my</span> <span class="variable-name">$p</span> (<span class="cperl-nonoverridable">grep</span> {$_} <span class="cperl-nonoverridable">split</span> <span class="cperl-hash">$Config</span>{<span class="string">path_sep</span>}, <span class="cperl-hash">$env</span>{<span class="string">PATH</span>}) {
                <span class="keyword">next</span> <span class="keyword">if</span> $p <span class="type">eq</span> $old_path;
                <span class="cperl-nonoverridable">push</span> <span class="cperl-array">@p</span>, $p;
            }
            <span class="type">join</span> <span class="cperl-hash">$Config</span>{<span class="string">path_sep</span>}, <span class="cperl-array">@p</span>;
        };
    }
}

<span class="keyword">while</span> (<span class="keyword">my</span> (<span class="variable-name">$k</span>, <span class="variable-name">$v</span>) = <span class="cperl-nonoverridable">each</span> <span class="cperl-hash">%env</span>) {
    <span class="cperl-nonoverridable">print</span> <span class="cperl-nonoverridable">qq</span><span class="string">[export $k=&#34;$v&#34;\n]</span>;
}
<span class="comment">
=head1 </span><span class="variable-name">NAME</span><span class="comment">

use-locallib - set/switch local::lib environment

=head1 </span><span class="variable-name">SYNOPSIS</span><span class="comment">

use-locallib (MODULE INSTALL BASE)
</span></code></pre>
<p>これで <code>local::lib</code> を簡単に切り替えられるようになるけれど、複数の <code>local::lib</code> 環境を同時に使用しているとどのシェルがどの <code>local::lib</code> を使用しているかわからなくなってしまう。</p>
<p>そのためシェルのプロンプトに <code>INSTALL_BASE</code> を表示されるようにしてしのいだ。</p>
<p><a href="http://www.flickr.com/photos/typester/4397750144/" title="show INSTALL_BASE in terminal prompt by typester, on Flickr"><img alt="show INSTALL_BASE in terminal prompt" height="100" src="http://farm3.static.flickr.com/2758/4397750144_cd22b17a99_o.png" width="280" /></a></p>
<p>これは単純に以下のような <code>PERL_MM_OPT</code> の <code>INSTALL_BASE</code> をプリントするスクリプトを PROMPT 設定から読んでいるだけである。</p>
<pre><code><span class="comment-delimiter">#</span><span class="comment">!/usr/bin/env perl
</span>
<span class="keyword">use</span> <span class="function-name">strict</span>;
<span class="keyword">use</span> <span class="function-name">warnings</span>;

<span class="keyword">my</span> <span class="cperl-hash">%mm_opt</span>;
<span class="keyword">for</span> <span class="keyword">my</span> <span class="variable-name">$opt</span> (<span class="cperl-nonoverridable">split</span> <span class="constant">/</span><span class="string">:</span><span class="builtin">+</span><span class="constant">/</span>, <span class="cperl-hash">$ENV</span>{<span class="string">PERL_MM_OPT</span>} || <span class="string">&#39;&#39;</span>) {
    <span class="keyword">my</span> (<span class="variable-name">$k</span>, <span class="variable-name">$v</span>) = <span class="cperl-nonoverridable">split</span> <span class="constant">/</span><span class="string">=</span><span class="constant">/</span>, $opt;
    <span class="cperl-hash">$mm_opt</span>{$k} = $v;
}

<span class="keyword">my</span> <span class="variable-name">$install_base</span> = <span class="cperl-hash">$mm_opt</span>{<span class="string">INSTALL_BASE</span>};
<span class="keyword">if</span> (<span class="cperl-hash">$ENV</span>{<span class="string">HOME</span>}) {
    $install_base =~ <span class="cperl-nonoverridable">s</span><span class="constant">/</span><span class="function-name">^</span><span class="cperl-hash">$ENV</span><span class="variable-name">{</span><span class="string">HOME</span><span class="variable-name">}</span><span class="constant">/</span><span class="string">~</span><span class="constant">/</span>;
}

<span class="cperl-nonoverridable">print</span> $install_base || <span class="string">&#39;none&#39;</span>;
</code></pre>
]]></description>
      <dc:creator>typester</dc:creator>
      <pubDate>Mon, 01 Mar 2010 08:17:00 GMT</pubDate>
      <category>perl, zsh</category>
    </item>
    <item>
      <title>ライブラリをユニバーサルバイナリでインストールする</title>
      <link>http://unknownplace.org/memo/2010/01/08/2/</link>
      <description><![CDATA[<p>以下のサイトが詳しい</p>
<blockquote><p><a href="http://macwiki.sourceforge.jp/wiki/index.php/UniversalBinary">http://macwiki.sourceforge.jp/wiki/index.php/UniversalBinary</a></p></blockquote>
<p><code>Imager</code> に必要な <code>libjpeg</code> などをユニバーサルバイナリにしてみた時のメモ</p>
<p><code>-M</code> などがついていて <code>-arch</code> が複数指定できない場合以外は</p>
<pre><code>CFLAGS=&#39;-arch x86_64 -arch i386 -isysroot /Developer/SDKs/MacOSX10.6.sdk&#39; CXXFLAGS=$CFLAGS
</code></pre>
<p>とかすればいいということだが、<code>libjpeg</code> は <code>-M</code> られていて無理だったので、amd64 と i386 という二つのディレクトリにソースコードを展開、それぞれ以下のオプションで make まで終わらす：</p>
<pre><code>$ cd amd64
$ CFLAGS=&#39;-arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk&#39; CXXFLAGS=$CFLAGS ./configure ...
$ make

$ cd ../i386
$ CFLAGS=&#39;-arch i386 -isysroot /Developer/SDKs/MacOSX10.6.sdk&#39; CXXFLAGS=$CFLAGS ./configure ...
$ make
</code></pre>
<p>make されてできたバイナリを lipo コマンドでユニバーサルバイナリ化する。 上記サイトを参考にして、</p>
<pre><code>#!/bin/sh

filelist=$(find ./amd64 -type f |grep -v \\.o$ | xargs file | sed -e &#39;s,^\./amd64/,,g&#39; | \
               grep -E \(Mach-O\)\|\(ar\ archive\) |sed -e &#39;s,:.*,,g&#39; -e &#39;/\for\ architecture/d&#39;)

for i in $filelist
do
    echo $i
    /usr/bin/lipo -create amd64/$i i386/$i -output `basename $i`
    mv -f `basename $i` amd64/$i
done
</code></pre>
<p>このようなスクリプトを書いて、amd64 などのディレクトリの一つ上の階層で実行すると、amd64 ディレクトリのバイナリがユニバーサルバイナリ化されるという仕組みを作ってみた。</p>
<p>その後、amd64 のほうで <code>make install</code> してやれば OK。</p>
]]></description>
      <dc:creator>typester</dc:creator>
      <pubDate>Fri, 08 Jan 2010 02:28:00 GMT</pubDate>
      <category>osx</category>
    </item>
    <item>
      <title>Snow Leopard の Perl とアーキテクチャ</title>
      <link>http://unknownplace.org/memo/2010/01/08/1/</link>
      <description><![CDATA[<p>Snow Leopard には二つの Perl がインストールされている</p>
<ul><li>/usr/bin/perl5.10.0</li><li>/usr/bin/perl5.8.9</li></ul>
<p>デフォルトの <code>/usr/bin/perl</code> は 5.10.0 のほう。それぞれユニバーサルバイナリになっていて、</p>
<pre><code>$ file /usr/bin/perl5.10.0
/usr/bin/perl5.10.0: Mach-O universal binary with 3 architectures
/usr/bin/perl5.10.0 (for architecture x86_64):  Mach-O 64-bit executable x86_64
/usr/bin/perl5.10.0 (for architecture i386):    Mach-O executable i386
/usr/bin/perl5.10.0 (for architecture ppc7400): Mach-O executable ppc

$ file /usr/bin/perl5.8.9
/usr/bin/perl5.8.9: Mach-O universal binary with 2 architectures
/usr/bin/perl5.8.9 (for architecture i386):     Mach-O executable i386
/usr/bin/perl5.8.9 (for architecture ppc7400):  Mach-O executable ppc
</code></pre>
<p>という感じで、5.10 は 64bit 版があるが、5.8 にはない。</p>
<p>で、普通に perl を実行すると perl5.10.0 は <code>x86_64</code> で実行され、perl5.8.9 は <code>i386</code> で実行される。</p>
<p>このアーキテクチャの差が結構くせ者で Snow Leopard 上で普通にライブラリなどを make すると <code>x86_64</code> だけでビルドされてしまうため、そのようにして作ったライブラリはそのままでは perl5.8.9 からは使えないということになる。</p>
<p>デフォルトの 5.10.0 だけ使っている分にはなにも問題はないのだが、残念なことにこの 5.10.0 というのはいろいろな問題があり、開発に使用することはおすすめできない状況。(せめて 5.10.1 にしてくれればいいのに)</p>
<p>したがって無用なトラブルを避けるためにも 5.8.9 の方を使用するか、自前でビルドした perl を使用するのが良い。</p>
<p>またこのように <code>x86_64</code>、<code>i386</code> 両方のアーキテクチャの実行ファイルがあり得る Snow Leopard に対して自分でライブラリをインストールする場合それらもユニバーサルバイナリにしておくと良い。</p>
<p>念のため追記＠2010-01-08T15:19:23+09:00: もちろんこれは 64bit 対応の CPU の場合の話。そうでない場合はどちらも i386 で実行されるのでこの問題は起こらない。</p>
]]></description>
      <dc:creator>typester</dc:creator>
      <pubDate>Fri, 08 Jan 2010 01:51:00 GMT</pubDate>
      <category>osx, perl</category>
    </item>
    <item>
      <title>CocoaEmacs おかしいところ</title>
      <link>http://unknownplace.org/memo/2009/12/24/2/</link>
      <description><![CDATA[<p>anything-config.el も無事なおり、Shiftのバグなおして日本語入力も快適になり、あとはまぁだいたいいい感じに使えるようになった(現状では) CocoaEmacs だけど一点だけおかしいところがある。</p>
<p>僕は結構 Emacs の customize 機能をヘビーユーズしてて（コーディングしてて気に入らない色設定とか出てきたらその場ですぐ customize-face する）これで色設定はほぼ調整してるのだけど、customize するのをすべての Emacs で同じものを使うのは微妙なので、</p>
<pre><code>(setq custom-file <span class="string">"~/.emacs.d/conf/cocoa-emacs-99customize.el"</span>)
</code></pre>
<p>のようにして、 customize の保存先を Emacs 毎に変えている。</p>
<p>のだけどこれが、<code>init-loader</code> のフェーズで <code>(load custom-file)</code> しても設定が適用されないという現象に悩まされている。</p>
<p>立ち上がったあとに手動で <code>(load custom-file)</code> するとロードされる。。なぞ。</p>
<p>しょうがないので、</p>
<pre><code>(<span class="keyword">defun</span> <span class="function-name">reload-custom-file</span> ()
  (interactive)
  (load custom-file))
</code></pre>
<p>こんなの作っておいて起動後手動で実行している。不毛だけどまぁ Emacs たちあげっぱだからいいかなぁ。。</p>
]]></description>
      <dc:creator>typester</dc:creator>
      <pubDate>Thu, 24 Dec 2009 08:58:00 GMT</pubDate>
      <category>emacs</category>
    </item>
    <item>
      <title>elispエラーった時の追い方</title>
      <link>http://unknownplace.org/memo/2009/12/24/1/</link>
      <description><![CDATA[<p>(setq debug-on-error t)</p>
<p>しておいて、<code>eval-bufer</code>。StackTrace 出るのでそれを見る。</p>
<p>Emacs 23 にしたら anything-config.el が <code>Invalid depth in char-table</code> とかいって死ぬようになったけど原因わからなくてこまってたけどこれやったら <code>~/.emacs.d/anything-c-adaptive-history</code> のロードに失敗してるのがわかった。消したらなおりました。imakado++</p>
]]></description>
      <dc:creator>typester</dc:creator>
      <pubDate>Thu, 24 Dec 2009 08:48:00 GMT</pubDate>
      <category>emacs</category>
    </item>
    <item>
      <title>CocoaEmacsその後</title>
      <link>http://unknownplace.org/memo/2009/12/18/1/</link>
      <description><![CDATA[<p>フルスクリーン化以外にもいじりたくなったのでそれぞれブランチを切った。</p>
<ul><li><a href="http://github.com/typester/emacs/tree/feature/fullscreen">feature/fullscreen</a> - 今まで作業していたフルスクリーン化対応ブランチ</li><li><a href="http://github.com/typester/emacs/tree/fix/shift_modifier_with_ime">fix/shift_modifier_with_ime</a> - IME経由で入力するときShiftなんちゃらがIMEを素通りするのを直すブランチ</li></ul>
<p>という感じになっています。 master はこれらの統合ブランチになってますので使ってる人いたら注意です。</p>
<p>使いながらちょいちょいいじっていて、昨日からの更新としては</p>
<ul><li>フルスクリーン時に裏にノーマルなウィンドウが残ってしまっていたのを修正</li><li>日本語入力時に Shift なんちゃらが IME をとおらずそのまま Emacs に渡されてしまっているのを修正</li></ul>
<p>という感じになっております。</p>
]]></description>
      <dc:creator>typester</dc:creator>
      <pubDate>Fri, 18 Dec 2009 04:03:00 GMT</pubDate>
      <category>emacs, osx</category>
    </item>
    <item>
      <title>CocoaEmacsのフォント設定</title>
      <link>http://unknownplace.org/memo/2009/12/17/2/</link>
      <description><![CDATA[<p>現状こんな感じ。以前書いた<a href="http://unknownplace.org/memo/2009/01/20/2/">CarbonEmacsの設定</a>と大して変わってない。unicode コードセットで表示される文字が増えていたのでそれに対応した程度。</p>
<pre><code>(create-fontset-from-fontset-spec
 (concat
  <span class="string">"-*-fixed-medium-r-normal--12-*-*-*-*-*-fontset-tobi"</span>
  <span class="string">",ascii:-apple-codingfonttobi-medium-r-normal--16-120-72-72-m-120-*-*"</span>
  <span class="string">",japanese-jisx0208:-apple-osaka-*"</span>
  <span class="string">",katakana-jisx0201:-apple-osaka-*"</span>
  <span class="string">",unicode:-apple-osaka-*"</span>
  <span class="string">",chinese-big5-1:-apple-apple ligothic medium-*"</span>
  ))

(set-default-font <span class="string">"fontset-tobi"</span>)
</code></pre>
<p>ascii 用につかってる CodingFontTobi は <a href="http://www.proggyfonts.com/">proggyfonts.com</a> から。</p>
<p>もちろんビットマップ表示にするため</p>
<pre><code>$ defaults write org.gnu.Emacs AppleAntiAliasingThreshold 16
</code></pre>
<p>としている。</p>
<pre><code>(setq mac-allow-anti-aliasing nil)
</code></pre>
<p>は Snow Leopard では効かないみたいだ。</p>
]]></description>
      <dc:creator>typester</dc:creator>
      <pubDate>Thu, 17 Dec 2009 14:50:00 GMT</pubDate>
      <category>emacs, osx</category>
    </item>
    <item>
      <title>フルスクリーン Cocoa Emacs</title>
      <link>http://unknownplace.org/memo/2009/12/17/1/</link>
      <description><![CDATA[<p>emacs23 が正式にリリースされ、ちまたではウィンドウシステムが Cocoa になったぞ、とか 64bit 対応だぞ、とか multitty だぞ、と盛り上がっていますが、 個人的にほとんど興味のないまま今日まできました。というのも CocoaEmacs は<em>フルスクリーンにできない</em>という僕にとっては致命的な問題があったからです。</p>
<p>というのも最近は Emacs をフルスクリーンにし縦二分割で使ういわゆる imakado スタイルを実践しているため、それができない CocoaEmacs は眼中になかったのでした。</p>
<p>そんなわけでずっと CarbonEmacs を使ってきたのですが、 Snow Leopard に移行したのを機に CocoaEmacs に移行し、さらについでにフルスクリーン化できるようにしてみています。 github でやってます。</p>
<blockquote><p><a href="http://github.com/typester/emacs">typester&#39;s emacs at master - GitHub</a></p></blockquote>
<p>現状でも若干不具合がありますが、使える段階にはなっていると思います。</p>
<p>ビルドは</p>
<pre><code>$ git clone git://github.com/typester/emacs.git
$ cd emacs
$ ./configure --with-ns
$ make bootstrap
$ make install
</code></pre>
<p>こんな感じにすると、<code>nextstep</code> ディレクトリ以下に <code>Emacs.app</code> ができます。フルスクリーンにするには</p>
<pre><code>M-x ns-toggle-fullscreen
</code></pre>
<p>でいけます。キー割り当てておくと便利です。</p>
<p>対応環境は定かではありませんが、OS X 10.4 と 10.6 で動作確認しております。</p>
<p>また 10.6 の場合のみ、フルスクリーン時に隠れているメニューバーや Dock 領域にマウスカーソルを移動させると自動的に表示されるようになっています。 CarbonEmacs と違い Dock も自動で表示されるので個人的に非常に便利です。10.6 からの新 API のため、10.5 以前ではフルスクリーン時にメニューバー、Dock は強制オフになります。</p>
<p>既知の不具合として外部ウィンドウでフルスクリーン化して戻そうとすると落ちるというのが報告されており調査中です。 それ以外は便利に使用できています。この文章もフルスクリーン CocoaEmacs で書いています ;)</p>
<p>またこのハックをしたことで elisp から C や Objective-C のコードを呼ぶ方法がわかったのでいろいろ夢がひろがりんぐというところです。</p>
]]></description>
      <dc:creator>typester</dc:creator>
      <pubDate>Thu, 17 Dec 2009 11:27:00 GMT</pubDate>
      <category>emacs, osx</category>
    </item>
    <item>
      <title>A simple chat server in AnyEvent</title>
      <link>http://unknownplace.org/memo/2009/12/07/1/</link>
      <description><![CDATA[<p><a href="http://dhotson.tumblr.com/post/271733389/a-simple-chat-server-in-node-js">Node.js でつくってるやつ</a> をみて同じくらいで書けそうだなと思ったので試しに AnyEvent で書き直してみた。</p>
<pre><code><span class="comment-delimiter">#</span><span class="comment">!/usr/bin/perl
</span>
<span class="keyword">use</span> <span class="function-name">strict</span>;
<span class="keyword">use</span> <span class="function-name">warnings</span>;

<span class="keyword">use</span> <span class="function-name">AnyEvent::Socket</span>;
<span class="keyword">use</span> <span class="function-name">AnyEvent::Handle</span>;

<span class="keyword">my</span> <span class="cperl-array">@clients</span>;

tcp_server <span class="cperl-nonoverridable">undef</span>, 7000, <span class="keyword">sub</span> {
    <span class="keyword">my</span> (<span class="variable-name">$fh</span>) = <span class="cperl-array">@_</span> <span class="type">or</span> <span class="keyword">die</span> $!;
    <span class="keyword">my</span> <span class="variable-name">$h</span> = AnyEvent::Handle-&#62;new( <span class="string">fh</span> =&#62; $fh );

    <span class="keyword">my</span> <span class="variable-name">$leave</span> = <span class="keyword">sub</span> {
        <span class="keyword">my</span> <span class="variable-name">$client</span> = <span class="cperl-nonoverridable">delete</span> <span class="cperl-array">$clients</span>[ <span class="type">fileno</span>($fh) ];
        <span class="keyword">for</span> <span class="keyword">my</span> <span class="variable-name">$c</span> (<span class="cperl-nonoverridable">grep</span> { <span class="cperl-nonoverridable">defined</span> } <span class="cperl-array">@clients</span>) {
            $c-&#62;{<span class="string">handle</span>}-&#62;push_write(<span class="string">&#34;$client-&#62;{name} has left.\n&#34;</span>);
        }
    };

    $h-&#62;on_read(<span class="keyword">sub</span> {
        <span class="cperl-nonoverridable">shift</span>-&#62;push_read( <span class="string">line</span> =&#62; <span class="keyword">sub</span> {
            <span class="keyword">my</span> (<span class="variable-name">$h</span>, <span class="variable-name">$line</span>) = <span class="cperl-array">@_</span>;

            <span class="keyword">my</span> <span class="variable-name">$client</span> = <span class="cperl-array">$clients</span>[ <span class="type">fileno</span>($fh) ];

            <span class="keyword">unless</span> (<span class="cperl-nonoverridable">defined</span> $client-&#62;{<span class="string">name</span>}) {
                <span class="keyword">if</span> ($line =~ <span class="constant">/</span><span class="keyword">(</span><span class="builtin">\</span><span class="type">S</span><span class="builtin">+</span><span class="keyword">)</span><span class="constant">/</span>) {
                    $client-&#62;{<span class="string">name</span>} = $1;
                    $h-&#62;push_write(<span class="string">&#34;===========\n&#34;</span>);

                    <span class="keyword">for</span> <span class="keyword">my</span> <span class="variable-name">$client</span> (<span class="cperl-nonoverridable">grep</span> { <span class="cperl-nonoverridable">defined</span> } <span class="cperl-array">@clients</span>) {
                        <span class="keyword">next</span> <span class="keyword">if</span> $client-&#62;{<span class="string">handle</span>} <span class="type">eq</span> $h;
                        $client-&#62;{<span class="string">handle</span>}
                            -&#62;push_write( <span class="string">&#34;$client-&#62;{name} has joined.\n&#34;</span> );
                    }
                }
                <span class="keyword">return</span>;
            }

            <span class="keyword">my</span> (<span class="variable-name">$command</span>) = $line =~ <span class="cperl-nonoverridable">m</span><span class="constant">!</span><span class="function-name">^</span><span class="string">/</span><span class="keyword">(</span><span class="function-name">.</span><span class="builtin">+</span><span class="keyword">)</span><span class="constant">!</span>;
            <span class="keyword">if</span> ($command) {
                <span class="keyword">if</span> ($command <span class="type">eq</span> <span class="string">&#39;users&#39;</span>) {
                    $h-&#62;push_write(<span class="string">&#34;- $_-&#62;{name}\n&#34;</span>) <span class="keyword">for</span> <span class="cperl-nonoverridable">grep</span> { <span class="cperl-nonoverridable">defined</span> } <span class="cperl-array">@clients</span>;
                }
                <span class="keyword">elsif</span> ($command <span class="type">eq</span> <span class="string">&#39;quit&#39;</span>) {
                    $leave-&#62;();
                }
                <span class="keyword">return</span>;
            }

            <span class="keyword">for</span> <span class="keyword">my</span> <span class="variable-name">$c</span> (<span class="cperl-nonoverridable">grep</span> { <span class="cperl-nonoverridable">defined</span> } <span class="cperl-array">@clients</span>) {
                <span class="keyword">next</span> <span class="keyword">if</span> $c-&#62;{<span class="string">handle</span>} <span class="type">eq</span> $h;
                $c-&#62;{<span class="string">handle</span>}-&#62;push_write( <span class="string">&#34;$client-&#62;{name}: $line\n&#34;</span> );
            }
        });
    });

    $h-&#62;on_error(<span class="keyword">sub</span> {
        <span class="keyword">my</span> (<span class="variable-name">$h</span>, <span class="variable-name">$fatal</span>, <span class="variable-name">$msg</span>) = <span class="cperl-array">@_</span>;
        $leave-&#62;();
        $h-&#62;destroy;
    });

    <span class="cperl-array">$clients</span>[ <span class="type">fileno</span>($fh) ] = {
        <span class="string">name</span>   =&#62; <span class="cperl-nonoverridable">undef</span>,
        <span class="string">handle</span> =&#62; $h,
    };

    $h-&#62;push_write(<span class="string">&#34;Welcome, enter your username:\n&#34;</span>);
};

AE::cv-&#62;<span class="type">wait</span>;
</code></pre>
<p>行数的にはほぼ同じくらい。</p>
<p>追記＠2009-12-08T10:36:37+09:00： left なメッセージがおかしかったので直した。</p>
]]></description>
      <dc:creator>typester</dc:creator>
      <pubDate>Mon, 07 Dec 2009 11:38:00 GMT</pubDate>
      <category>perl, anyevent</category>
    </item>
    <item>
      <title>PhotoShare にアップロードするだけのアプリ</title>
      <link>http://unknownplace.org/memo/2009/12/06/2/</link>
      <description><![CDATA[<p><a href="http://www.bcphotoshare.com/">PhotoShare</a> は写真共有を軸にした SNS のようなサイトで結構好きなのですが。写真をアップロードしたいだけという状況で写真をアップロードしようと公式アプリを立ち上げると自分宛のコメントが来てないかとか、友達の写真が更新されてないかとかチェックするのですぐにアップロード画面にいけずイライラしたりします。</p>
<p>そんなわけでシンプルに PhotoShare にアップロードするだけなアプリを作りました。</p>
<p><a href="http://click.linksynergy.com/fs-bin/stat?id=epIEMEmECfk&#38;offerid=94348&#38;type=3&#38;subid=0&#38;tmpid=2192&#38;RD_PARM1=http%253A%252F%252Fitunes.apple.com%252Fjp%252Fapp%252Fps-up-simple-fast-uploader-for-photoshare%252Fid342421711%253Fmt%253D8%2526uo%253D6%2526partnerId%253D30" target="itunes_store"><img alt="PS up: simple, fast uploader for PhotoShare" height="15" src="http://ax.phobos.apple.com.edgesuite.net/images/badgeitunes61x15dark.gif" width="61" /></a></p>
<p>先日の<a href="http://d.hatena.ne.jp/tomyhero/20091120/1258718763">たこthon</a> で適当に書き上げたアプリなので本当にアップロードする以外の機能がありませんが、使いながら欲しい物を加えていこうと思ってます。使い方見つつインタフェースも。</p>
]]></description>
      <dc:creator>typester</dc:creator>
      <pubDate>Sun, 06 Dec 2009 05:10:00 GMT</pubDate>
      <category>iphone</category>
    </item>
    <item>
      <title>3GS 購入</title>
      <link>http://unknownplace.org/memo/2009/12/06/1/</link>
      <description><![CDATA[<p>アプリ開発で 3GS を借りたのが最後、もうどうしてもあの速さがうらやましくなってしまって結局買ってしまった。</p>
<p>今まで使用していた 3G の分割のこり10ヶ月分くらいは次の請求で一括で払うことに。そのまま分割したままでもよかったが割引きかなくなるから一括で払っても変わらないからそれなら払っちゃっておいた方が良いかなーと。なんかよくわからないけどホワイトWとかなんちゃらオプションとか加入させられたのでそれはわすれないうちにオフにした。</p>
<p>感想としてはいままで iPhone 使ってて一番不満だったメモリ足りなすぎて重いなーって言う感じがまったくしなくなってとても快適。これが本来イメージされてた iPhone かーという感じ。 3G ユーザーはみんな乗り換えたら感動すると思う。</p>
<p>でも液晶の色合いがなんか 3G と違って白っぽいのはきになるなー。液晶は前の方が好み。</p>
<p>本体の方の色は 3G が白つかってたので黒にしたが、白の方がよかったなーと若干後悔中。iPhone の黒はなんか下品な感じがする。まぁカバーつけるから関係ないんだけど。</p>
]]></description>
      <dc:creator>typester</dc:creator>
      <pubDate>Sun, 06 Dec 2009 04:57:00 GMT</pubDate>
      <category>life</category>
    </item>
    <item>
      <title>無線APによって自動でhostsを変える方法</title>
      <link>http://unknownplace.org/memo/2009/12/03/1/</link>
      <description><![CDATA[<p>OSX の LaunchAgents には特定のパスを監視して更新があったらプログラムを起動すると言うことが出来ます。例えば以下のような設定を書いてみると：</p>
<pre><code>&#60;<span class="keyword">?xml</span> <span class="variable-name">version</span>=<span class="string">&#34;1.0&#34;</span> <span class="variable-name">encoding</span>=<span class="string">&#34;UTF-8&#34;</span>?&#62;
&#60;<span class="keyword">!DOCTYPE</span> plist PUBLIC <span class="string">&#34;-//Apple Computer//DTD PLIST 1.0//EN&#34;</span>
          <span class="string">&#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd&#34;</span>&#62;
&#60;<span class="function-name">plist</span> <span class="variable-name">version</span>=<span class="string">&#34;1.0&#34;</span>&#62;
  &#60;<span class="function-name">dict</span>&#62;
    &#60;<span class="function-name">key</span>&#62;Label&#60;/<span class="function-name">key</span>&#62;
    &#60;<span class="function-name">string</span>&#62;org.unknownplace.wifi_switch&#60;/<span class="function-name">string</span>&#62;
    &#60;<span class="function-name">key</span>&#62;ProgramArguments&#60;/<span class="function-name">key</span>&#62;
    &#60;<span class="function-name">array</span>&#62;
      &#60;<span class="function-name">string</span>&#62;/usr/bin/zsh&#60;/<span class="function-name">string</span>&#62;
      &#60;<span class="function-name">string</span>&#62;-c&#60;/<span class="function-name">string</span>&#62;
      &#60;<span class="function-name">string</span>&#62;exec perl /Users/typester/dev/scratch/wifi_switch/switch.pl&#60;/<span class="function-name">string</span>&#62;
    &#60;/<span class="function-name">array</span>&#62;
    &#60;<span class="function-name">key</span>&#62;RunAtLoad&#60;/<span class="function-name">key</span>&#62;
    &#60;<span class="function-name">true</span>/&#62;
    &#60;<span class="function-name">key</span>&#62;StandardErrorPath&#60;/<span class="function-name">key</span>&#62;
    &#60;<span class="function-name">string</span>&#62;/dev/null&#60;/<span class="function-name">string</span>&#62;<span class="comment-delimiter">&#60;!-- </span><span class="comment">&#60;string&#62;/tmp/error&#60;/string&#62; </span><span class="comment-delimiter">--&#62;</span>
    &#60;<span class="function-name">key</span>&#62;StandardOutPath&#60;/<span class="function-name">key</span>&#62;
    &#60;<span class="function-name">string</span>&#62;/dev/null&#60;/<span class="function-name">string</span>&#62;
    &#60;<span class="function-name">key</span>&#62;WatchPaths&#60;/<span class="function-name">key</span>&#62;
    &#60;<span class="function-name">array</span>&#62;
      &#60;<span class="function-name">string</span>&#62;/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist&#60;/<span class="function-name">string</span>&#62;
    &#60;/<span class="function-name">array</span>&#62;
  &#60;/<span class="function-name">dict</span>&#62;
&#60;/<span class="function-name">plist</span>&#62;
</code></pre>
<p><code>/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist</code> を監視しそれが更新されたら <code>/Users/typester/dev/scratch/wifi_switch/switch.pl</code> を実行する。と言うことが実現できます。</p>
<p>この監視先のファイルは OSX の無線ネットワーク設定なので、これが更新されると言うことは無線通信の状態が変わったときと言うことを意味します。</p>
<p>これを有効にするにはこのファイルを適当な名前 <code>hoge.plist</code> で <code>/System/Library/LaunchDaemons/</code> 保存すれば次回起動から有効になります。すぐに有効にしたい場合は、</p>
<pre><code>sudo launchctl load /System/Library/LaunchDaemons/hoge.plist
</code></pre>
<p>などとすればOKです。詳しくは launchctl や LaunchAgent/LaunchDaemon のドキュメントを参照のこと。システムレベルの LaunchDaemon を使用しているのは <code>/etc/hosts</code> を書き換えるのに root 権限が必要だからです。</p>
<p>あとはここで起動されるスクリプト中でからAPの情報を取得しそれをもとに hosts を書き換えればいいわけです。APの情報は</p>
<pre><code>/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I
</code></pre>
<p>と言うコマンドで取得可能なのでそれをパースすればオッケーです。</p>
<p>以下に僕が実際に使用しているスクリプトを貼っておきます。</p>
<blockquote><p><a href="http://gist.github.com/247950">http://gist.github.com/247950</a></p></blockquote>
<p>このスクリプトと同じところに、<code>default.mt</code> と <code>特定のAPのSSID名.mt</code> と言うファイルで hosts を書いておくと、通常は <code>default.mt</code> が <code>/etc/hosts</code> に書き出され、SSIDにマッチするファイルがある場合には <code>SSID名.mt</code> が <code>/etc/hosts</code> に書き出されるという感じです。</p>
<p>AP によって hosts を変えたいという状況がそんなにあるとは思いませんが、ネットワークの状態によっていろいろ設定を変えると言う目的では便利で使えますので覚えておいて損はないでしょう。</p>
]]></description>
      <dc:creator>typester</dc:creator>
      <pubDate>Thu, 03 Dec 2009 07:00:00 GMT</pubDate>
      <category>osx</category>
    </item>
    <item>
      <title>CookPad の iPhone 用 API</title>
      <link>http://unknownplace.org/memo/2009/11/26/1/</link>
      <description><![CDATA[<p>こんな感じかな。</p>
<blockquote><p><a href="http://github.com/typester/cookpad-api-perl">typester&#39;s cookpad-api-perl at master - GitHub</a></p></blockquote>
<p><code>api_key</code> ないと動かないからあれだけど。</p>
]]></description>
      <dc:creator>typester</dc:creator>
      <pubDate>Thu, 26 Nov 2009 14:40:00 GMT</pubDate>
      <category>web, cookpad, iphone</category>
    </item>
    <item>
      <title>中里情報ソースに困る</title>
      <link>http://unknownplace.org/memo/2009/11/25/1/</link>
      <description><![CDATA[<p>巨人に移籍してしまったため現在まったく情報源がなくこまっている。巨人のサイトとかチェックしてねー。</p>
]]></description>
      <dc:creator>typester</dc:creator>
      <pubDate>Wed, 25 Nov 2009 06:00:00 GMT</pubDate>
      <category>baseball</category>
    </item>
  </channel>
</rss>
