ラシウラ bellbind Hatena::Blog hatenablog://blog/17680117127042737583 しばらくぶりにubuntu ppaへパッケージを上げるときの手順 hatenablog://entry/17680117127042737648 2012-03-24T02:19:07+09:00 2019-04-17T19:50:10+09:00 Ubuntu Preciseへのアップグレードをしたので、自分のppaのpythonライブラリのパッケージを更新した。launchpadへのgpg鍵の登録から行うことになり、そのメモ。 パッケージのPreciseへの対応 debian/controlのDependsでpreciseのパッケージに対応するパッケージ名に変える。preciseではPythonのバージョンはpythonが2.7でpython3が3.2で、2.6がpython2.6として独立してインストール可能である(3.1は消えた)。すなわち"debuild -uc -us"でビルドできるようにしておく。 gpg鍵生成 gpg --… <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a> Preciseへのアップグレードをしたので、自分のppaの<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>ライブラリのパッケージを更新した。launchpadへのgpg鍵の登録から行うことになり、そのメモ。</p> <div class="section"> <h4>パッケージのPreciseへの対応</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/controlのDependsでpreciseのパッケージに対応するパッケージ名に変える。preciseでは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>のバージョンは<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>が2.7でpython3が3.2で、2.6がpython2.6として独立してインストール可能である(3.1は消えた)。</p><p>すなわち"debuild -uc -us"でビルドできるようにしておく。</p> </div> <div class="section"> <h4>gpg鍵生成</h4> <pre class="code" data-lang="" data-unlink>gpg --gen-key</pre><p>有効期限は1yで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%EB%A5%B4%A5%EA%A5%BA%A5%E0">アルゴリズム</a>や鍵長はデフォルトで良いが、<b>名前とメールアドレスは<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/changelog">changelog</a>の名前とメールアドレスに合わせなくてはいけない</b>。鍵生成をサーバで行う場合rng-toolsパッケージを入れておくといい。passphraseは必須。</p> </div> <div class="section"> <h4>gpg鍵登録</h4> <p>まず鍵送信</p> <pre class="code" data-lang="" data-unlink>gpg --send-keys --keyserver keyserver.ubuntu.com 580B5697</pre><p>最後の引数は生成した鍵のID。"gpg --list-keys"コマンドで鍵一覧が見える。この限りストのうちuidが付いているpubの鍵IDを送る。</p><p>次にlaunchpad上で鍵を登録する。ブラウザで"OpenPGP Keys"のアイコンをクリックし、下部の"Import and OpenPGP Key"のフォームにfingerprintを入れ、"Import Key"ボタンを押す。(鍵送信からlaunchpadが利用可能になるまで少し時間がかかるので、失敗したら数分待ってから行う)</p><p>fingerprintの出し方は、以下のようにコマンドで鍵IDを指定して行う。</p> <pre class="code" data-lang="" data-unlink>gpg --fingerprint 580B5697</pre><p>ここで出る指紋の4x10文字をスペース入りのままフォームへコピペする。</p><p>するとメールが送られてくる。このメールのうち</p> <pre class="code" data-lang="" data-unlink>-----BEGIN PGP MESSAGE----- Version: GnuPG v1.4.10 (GNU/Linux) ... -----END PGP MESSAGE-----</pre><p>の部分をテキストファイルとして保存する。たとえばencrypt.txtというファイル名にする。</p><p>このファイルをgpgで復号する。</p> <pre class="code" data-lang="" data-unlink>gpg encrypt.txt</pre><p>復号したファイル内の一番下の行のURLへアクセスし、continueすればOpenPGP Keysに登録される。</p> </div> <div class="section"> <h4>この鍵でCode of Conductサイン</h4> <p>launchpad上で古いCoCをdeactivateすれば、CoC署名のインタフェースが出る。<br /> UbuntuCodeofConduct-1.1.txtをダウンロードし、署名する。</p> <pre class="code" data-lang="" data-unlink>gpg --clearsign UnbuntuCodeofConduct-1.1.txt</pre><p>UnbuntuCodeofConduct-1.1.txt.ascが生成されるので、そのファイルを開き内容全部をlaunchpadのフォームへコピペし送れば完了。</p> </div> <div class="section"> <h4>ppaへアップロード</h4> <pre class="code" data-lang="" data-unlink>dch -v 1.0.5.5-0nmu1ppa1 debuild -S -sa cd .. dput ppa:bellbind/python-simplexquery_1.0.5.5-0nmu1ppa1_source.changes</pre><p>上から順に、dchでppa用バージョン付をし、debuild -S -saで署名付きのchangesをつくる。dput出アップロードする。あとはlaunchpadでビルドが終わるのを待つ。</p> </div> <div class="section"> <h4>リソース</h4> <ul> <li><a href="http://d.hatena.ne.jp/bellbind/20100918/1284779708">ubuntu&#x30D1;&#x30C3;&#x30B1;&#x30FC;&#x30B8;&#x3092;launchpad ppa&#x3067;&#x516C;&#x958B;&#x3059;&#x308B;&#x65B9;&#x6CD5; - &#x30E9;&#x30B7;&#x30A6;&#x30E9;</a></li> </ul> </div> bellbind "大学生数学基本調査"を解いてみる hatenablog://entry/17680117127042737759 2012-02-24T01:27:02+09:00 2019-04-17T19:50:12+09:00 http://mathsoc.jp/comm/kyoiku/chousa2011/surveyslip0955.pdf 1-1 (1)× (2)○ (3)× 1-2 (1)○ (2)× (3)× 2-1 (b)○ 理由: 1は奇数である。あらゆる奇数は偶数+1で表現できる。あらゆる偶数+偶数は偶数である。偶数+奇数は偶数+偶数+1となり、すなわち偶数+1であるため必ず奇数となる。 1は奇数。任意の整数nにおいて、2n+1は奇数。任意の整数n,mにおいて、2つの偶数の和は、2n+2m=2(n+m)で偶数となる。任意の整数n,mにおいて、偶数と奇数の和は、2n+2m+1=2(n+m)+1で奇数とな… <p><a href="http://mathsoc.jp/comm/kyoiku/chousa2011/surveyslip0955.pdf">http://mathsoc.jp/comm/kyoiku/chousa2011/surveyslip0955.pdf</a><br /> </p> <ul> <li>1-1 (1)× (2)○ (3)×</li> <li>1-2 (1)○ (2)× (3)×</li> </ul> <ul> <li>2-1 (b)○ 理由: 1は奇数である。あらゆる奇数は偶数+1で表現できる。あらゆる偶数+偶数は偶数である。偶数+奇数は偶数+偶数+1となり、すなわち偶数+1であるため必ず奇数となる。 <ul> <li>1は奇数。任意の整数nにおいて、2n+1は奇数。任意の整数n,mにおいて、2つの偶数の和は、2n+2m=2(n+m)で偶数となる。任意の整数n,mにおいて、偶数と奇数の和は、2n+2m+1=2(n+m)+1で奇数となる。 </li> </ul></li> <li>2-2 1. y軸に(0, -8)で交わる。 2. x軸とは(2, 0)と(4, 0)トで交わる。 3. (3, 1)で傾きが0になり、yの最大値をとる <ul> <li>y = -x^2+6x-8 = -(x-2)(x-4), dy/dx = -2x+6</li> </ul></li> </ul> <ul> <li>3. <ul> <li>1. 定規で線分をb側に伸ばし、コンパスで2倍、3倍の点をつける: <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20120225010545" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20120225/20120225010545.jpg" alt="f:id:bellbind:20120225010545j:image" title="f:id:bellbind:20120225010545j:image" class="hatena-fotolife" itemprop="image"></a></span></li> <li>2. 2倍点をつかい、b点を通る垂線を引く: <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20120225010702" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20120225/20120225010702.jpg" alt="f:id:bellbind:20120225010702j:image" title="f:id:bellbind:20120225010702j:image" class="hatena-fotolife" itemprop="image"></a></span></li> <li>3. a点を中心に3倍点をとおる大円弧を書き、垂線と交わらせる: <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20120225011013" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20120225/20120225011013.jpg" alt="f:id:bellbind:20120225011013j:image" title="f:id:bellbind:20120225011013j:image" class="hatena-fotolife" itemprop="image"></a></span></li> <li>4. a点と垂線との各交点をつなぐ2線分を引く(2線分:線分ab=3:1): <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20120225011226" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20120225/20120225011226.jpg" alt="f:id:bellbind:20120225011226j:image" title="f:id:bellbind:20120225011226j:image" class="hatena-fotolife" itemprop="image"></a></span></li> <li>5. a点を中心にb点から小円弧を書く: <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20120225011625" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20120225/20120225011625.jpg" alt="f:id:bellbind:20120225011625j:image" title="f:id:bellbind:20120225011625j:image" class="hatena-fotolife" itemprop="image"></a></span></li> <li>6. 小円弧の上下の交点の間で線を引くと、aからabの1/3の位置で交わる垂線となる: <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20120225011812" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20120225/20120225011812.jpg" alt="f:id:bellbind:20120225011812j:image" title="f:id:bellbind:20120225011812j:image" class="hatena-fotolife" itemprop="image"></a></span></li> <li>7. 1/3点を中心にaを通る円弧を書くと、aから2/3の位置で交わる</li> </ul></li> </ul> <div class="section"> <h4>解答例</h4> <p><a href="http://mathsoc.jp/comm/kyoiku/chousa2011/answer.pdf">http://mathsoc.jp/comm/kyoiku/chousa2011/answer.pdf</a></p><p>そもそもコンパスで平行線ってどう引くんだっけ、って思った。</p> <ul> <li>線上で平行の点と重ならないような垂線を引く</li> <li>平行線の点からコンパスで垂線上に適当に2点つける</li> <li>二点からそれぞれ平行線の点を通る円弧をかく</li> <li>2円弧が交わる2点に直線を引くとそれが平行線</li> </ul><p>問3はその前に比べ面倒な問題だと思ったけど、FAQを見ると今の中学の教科書に同じ問題があるらしい</p> <ul> <li><a href="http://mathsoc.jp/comm/kyoiku/chousa2011/FAQ2_21.pdf">http://mathsoc.jp/comm/kyoiku/chousa2011/FAQ2_21.pdf</a></li> </ul> </div> bellbind ECMAScript5で作ったSameGameの更新 hatenablog://entry/17680117127042737877 2011-06-23T20:18:24+09:00 2019-04-17T19:50:13+09:00 ECMAScript5を使ってSameGameを書いてみた - ラシウラを少しアップデートしました。 エンジン共用でcanvasの他に、CSS3のUIをつくってみました。canvasのない3DSのブラウザでも動くようになったが、アニメーションも入れたので重いけど。デモ: canvas2d: http://dl.dropbox.com/u/14499563/es5samegame/samegame-canvas2d-view.html css3: http://dl.dropbox.com/u/14499563/es5samegame/samegame-css3-view.html SameGa… <p><a href="http://d.hatena.ne.jp/bellbind/20110521/1305995233">ECMAScript5&#x3092;&#x4F7F;&#x3063;&#x3066;SameGame&#x3092;&#x66F8;&#x3044;&#x3066;&#x307F;&#x305F; - &#x30E9;&#x30B7;&#x30A6;&#x30E9;</a>を少しアップデートしました。<br /> エンジン共用で<a class="keyword" href="http://d.hatena.ne.jp/keyword/canvas">canvas</a>の他に、CSS3のUIをつくってみました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/canvas">canvas</a>のない<a class="keyword" href="http://d.hatena.ne.jp/keyword/3DS">3DS</a>のブラウザでも動くようになったが、アニメーションも入れたので重いけど。</p><p>デモ:</p> <ul> <li>canvas2d: <a href="http://dl.dropbox.com/u/14499563/es5samegame/samegame-canvas2d-view.html">http://dl.dropbox.com/u/14499563/es5samegame/samegame-canvas2d-view.html</a></li> <li>css3: <a href="http://dl.dropbox.com/u/14499563/es5samegame/samegame-css3-view.html">http://dl.dropbox.com/u/14499563/es5samegame/samegame-css3-view.html</a></li> </ul><p>SameGameルールエンジン:</p> <ul> <li><a href="http://dl.dropbox.com/u/14499563/es5samegame/samegame-rules.js">http://dl.dropbox.com/u/14499563/es5samegame/samegame-rules.js</a></li> </ul><p>SameGame UI:</p> <ul> <li><a href="http://dl.dropbox.com/u/14499563/es5samegame/samegame-canvas2d-ui.js">http://dl.dropbox.com/u/14499563/es5samegame/samegame-canvas2d-ui.js</a></li> <li><a href="http://dl.dropbox.com/u/14499563/es5samegame/samegame-css3-ui.js">http://dl.dropbox.com/u/14499563/es5samegame/samegame-css3-ui.js</a></li> </ul><p>ES5互換ライブラリ:</p> <ul> <li><a href="https://gist.github.com/1000718">https://gist.github.com/1000718</a></li> </ul><p>更新したこと</p> <ul> <li>canvas2dのほかに、CSS3を使ったUIも用意した</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Opera">Opera</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/Safari">Safari</a>のようなES5標準関数が足りない環境でも動くように、ダミー実装ライブラリをいれた <ul> <li>CSS3のtransitionで少しアニメーションするようにした(<a class="keyword" href="http://d.hatena.ne.jp/keyword/IE9">IE9</a>以外)</li> </ul></li> <li>boardのcellはcolor値じゃなく、{color: color値}のオブジェクトに変えた</li> <li>多値や複数パラメータを単一オブジェクトにして受け渡しするようにした <ul> <li>forEachをArrayと同じインタフェースにした</li> </ul></li> </ul> <ul> <li>最小チェーン数をルール側に移動し、GameOver判定をいれた</li> <li>UIでスコアをつけた</li> <li>更新リスナをいれた</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%D6%A5%EC%A5%C3%A5%C8">タブレット</a>対応途中</li> </ul> bellbind 現在のmingw/msysのインストール方法 hatenablog://entry/17680117127042737984 2011-06-12T12:17:25+09:00 2019-04-17T19:50:14+09:00 以前のMSYSのインストールは、コア部分はバンドルインストーラでいれて、足りないものはアーカイブをダウンロードして展開する、という感じで、管理がおそろしくめんどくさかった記憶がありました。 しかし最近更新しようとしてみたら、mingw-getですべて完結するようになっていて、管理がとても簡単になっていた。 古いMinGWの完全削除 新しいmingwを入れる前に、MinGWとMSYS双方をアンインストールし、その後残ったc:\MinGWやc:\msysもディレクトリごと完全に消しておきます。 mingw-get-instでインストール 最新のming-get-inst-YYYYMMDD.exeを… <p>以前のMSYSのインストールは、コア部分はバンドル<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>でいれて、足りないものは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AB%A5%A4%A5%D6">アーカイブ</a>をダウンロードして展開する、という感じで、管理がおそろしくめんどくさかった記憶がありました。<br /> しかし最近更新しようとしてみたら、<a class="keyword" href="http://d.hatena.ne.jp/keyword/mingw">mingw</a>-getですべて完結するようになっていて、管理がとても簡単になっていた。</p> <div class="section"> <h4>古い<a class="keyword" href="http://d.hatena.ne.jp/keyword/MinGW">MinGW</a>の完全削除</h4> <p>新しい<a class="keyword" href="http://d.hatena.ne.jp/keyword/mingw">mingw</a>を入れる前に、<a class="keyword" href="http://d.hatena.ne.jp/keyword/MinGW">MinGW</a>とMSYS双方をアンインストールし、その後残った<b>c:\<a class="keyword" href="http://d.hatena.ne.jp/keyword/MinGW">MinGW</a>やc:\msysも<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リごと完全に消し</b>ておきます。</p> </div> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/mingw">mingw</a>-get-instでインストール</h4> <p>最新のming-get-inst-YYYYMMDD.exeをダウンロードします(今現在だと20110530)。</p> <ul> <li><a href="http://sourceforge.net/projects/mingw/files/Automated%20MinGW%20Installer/mingw-get-inst/">http://sourceforge.net/projects/mingw/files/Automated%20MinGW%20Installer/mingw-get-inst/</a></li> </ul><p>このexeを実行し、進めていけば、c:/<a class="keyword" href="http://d.hatena.ne.jp/keyword/MinGW">MinGW</a>以下に<a class="keyword" href="http://d.hatena.ne.jp/keyword/mingw">mingw</a>が、c:/<a class="keyword" href="http://d.hatena.ne.jp/keyword/MinGW">MinGW</a>/msys/1.0にMSYSが入ります。<br /> (自分はチェックで全部入れるようにしたが、あとで下記の<a class="keyword" href="http://d.hatena.ne.jp/keyword/mingw">mingw</a>-getコマンドでも追加できる)</p> </div> <div class="section"> <h4>minttyからMSYSを使う</h4> <p>スタートメニューから"<a class="keyword" href="http://d.hatena.ne.jp/keyword/MinGW">MinGW</a> Shell"ショートカットを実行すれば、MSYS環境に入ります。このMSYS環境でも<a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>と同じようにターミナル<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%DF%A5%E5%A5%EC%A1%BC%A5%BF">エミュレータ</a>でminttyが使えます。</p><p>まずMSYS環境で以下を実行し、MSYS用mintty.exeをインストールします:</p> <pre class="code lang-sh" data-lang="sh" data-unlink>mingw-get update mingw-get upgrade mingw-get install msys-mintty </pre><p>minttyを実行するには、</p> <ul> <li>"<a class="keyword" href="http://d.hatena.ne.jp/keyword/MinGW">MinGW</a> shell"のショートカットの"プロパティ"を開き、"リンク先"に"--mintty"オプションを入れる</li> </ul><pre class="code" data-lang="" data-unlink>C:\MinGW\msys\1.0\msys.bat --mintty</pre><p>ちなみにminttyコマンドを直接実行して開く場合は以下のようにすれば良いようです。</p> <pre class="code" data-lang="" data-unlink>c:\MinGW\msys\1.0\bin\mintty.exe /bin/bash --login -i</pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/MinGW">MinGW</a>と併用する場合、<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>ビルドの物を使う場合が多いと思いますが、xtermである<b>minttyでは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/irb">irb</a>の対話モードが機能しません</b>。なので、通常の"<a class="keyword" href="http://d.hatena.ne.jp/keyword/MinGW">MinGW</a> Shell"ショートカットのプロパティで"簡易編集モード"にチェックを入れておいて使うのが一番良いかもしれません。</p><p>簡易編集モードは、ドラッグ選択で(矩形)選択モードになり、右クリックでコピー&モード終了、左クリックでキャンセル&モード終了。通常モード時に右クリックでペーストになります。<br /> <br /> <br /> </p> </div> <div class="section"> <h4>その他msysパッケージのインストール</h4> <p>種類はそれほどないですが、追加のmsysパッケージは同様に<a class="keyword" href="http://d.hatena.ne.jp/keyword/mingw">mingw</a>-get installでいれられます。たとえば、</p> <pre class="code lang-sh" data-lang="sh" data-unlink>mingw-get install msys-openssl mingw-get install msys-openssh </pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/mingw">mingw</a>-getで入れられるパッケージの一覧は</p> <pre class="code lang-sh" data-lang="sh" data-unlink>mingw-get list | <span class="synStatement">less</span> </pre><p>で見ることができます。</p> </div> <div class="section"> <h4>MSYSの<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSL">SSL</a> CERTSを更新する</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>でのcerts更新方法( <a href="http://d.hatena.ne.jp/bellbind/20110609/1307622037">http://d.hatena.ne.jp/bellbind/20110609/1307622037</a> )とほぼ一緒です。</p> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">cd</span> /var/ssl/certs wget <span class="synSpecial">-O</span> - http://curl.haxx.se/ca/cacert.pem | awk <span class="synStatement">'</span><span class="synConstant">split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print &gt; &quot;cert&quot; n &quot;.pem&quot;}</span><span class="synStatement">'</span> c_rehash </pre><p>これで、<a class="keyword" href="http://d.hatena.ne.jp/keyword/wget">wget</a>でも<a class="keyword" href="http://d.hatena.ne.jp/keyword/https">https</a>サイトに普通にアクセスできるようになります。<br /> <br /> </p> </div> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/bash">bash</a>環境の設定</h4> <p>~/.profile (c:\<a class="keyword" href="http://d.hatena.ne.jp/keyword/MinGW">MinGW</a>\msys\1.0\home\USERNAME\.profile)を作ります。<br /> たとえば<a class="keyword" href="http://d.hatena.ne.jp/keyword/xyzzy">xyzzy</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>にpathを通す場合:</p> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synComment"># clean windows path</span> <span class="synStatement">export</span><span class="synIdentifier"> PATH=</span>/usr/<span class="synStatement">local</span>/bin:/mingw/bin:/bin <span class="synStatement">export</span><span class="synIdentifier"> PATH=</span><span class="synStatement">&quot;</span><span class="synPreProc">$PATH</span><span class="synStatement">&quot;</span>:/c/Python27:/c/Python27/Scripts <span class="synStatement">export</span><span class="synIdentifier"> PATH=</span><span class="synStatement">&quot;</span><span class="synPreProc">$PATH</span><span class="synStatement">&quot;</span>:/c/Ruby187/bin <span class="synStatement">export</span><span class="synIdentifier"> PATH=</span><span class="synStatement">&quot;</span><span class="synPreProc">$PATH</span><span class="synStatement">&quot;</span>:/c/Program\ Files\ <span class="synSpecial">\(</span>x86<span class="synSpecial">\)</span>/MiKTeX\ 2.9/miktex/bin/ <span class="synStatement">export</span><span class="synIdentifier"> JAVA_HOME=</span>/c/Program\ Files/Java/jdk1.7.0 <span class="synStatement">export</span><span class="synIdentifier"> PATH=</span><span class="synStatement">&quot;</span><span class="synPreProc">$PATH</span><span class="synStatement">&quot;</span>:<span class="synStatement">&quot;</span><span class="synPreProc">$JAVA_HOME</span><span class="synStatement">&quot;</span>/bin <span class="synStatement">export</span><span class="synIdentifier"> PATH=</span><span class="synStatement">&quot;</span><span class="synPreProc">$PATH</span><span class="synStatement">&quot;</span>:/d/opt/apache-ant-1.8.2/bin <span class="synStatement">export</span><span class="synIdentifier"> PATH=</span><span class="synStatement">&quot;</span><span class="synPreProc">$PATH</span><span class="synStatement">&quot;</span>:/d/opt/groovy-1.8.0/bin function xyzzy <span class="synSpecial">{</span> <span class="synPreProc">HOME</span><span class="synStatement">=&quot;</span><span class="synConstant">c:/Users/bellbind</span><span class="synStatement">&quot;</span> /d/opt/xyzzy/xyzzy <span class="synStatement">&quot;</span><span class="synPreProc">$@</span><span class="synStatement">&quot;</span> <span class="synStatement">&amp;</span> <span class="synSpecial">}</span> <span class="synComment"># fallback to cygwin commands</span> <span class="synStatement">export</span><span class="synIdentifier"> PATH=</span><span class="synStatement">&quot;</span><span class="synPreProc">$PATH</span><span class="synStatement">&quot;</span>:/c/cygwin/bin function emacs <span class="synSpecial">{</span> /c/cygwin/bin/emacs-nox <span class="synStatement">&quot;</span><span class="synPreProc">$@</span><span class="synStatement">&quot;</span> <span class="synStatement">;</span> <span class="synStatement">clear</span> <span class="synSpecial">}</span> </pre> </div> <div class="section"> <h4>リソース</h4> <ul> <li><a href="http://www.mingw.org/">MinGW | Minimalist GNU for Windows</a></li> </ul> </div> <div class="section"> <h4>おまけ: MSYSシェル上で<a class="keyword" href="http://d.hatena.ne.jp/keyword/scala">scala</a>実行</h4> <p>antやgroovyと違い<a class="keyword" href="http://d.hatena.ne.jp/keyword/scala">scala</a>-2.9.0.1の時点でコマンド<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>はMSYSに対応してません。<br /> そこでMSYS上でコマンドを動かすための簡単なpatchを作りました。</p> <ul> <li><a href="https://gist.github.com/1021305">https://gist.github.com/1021305</a></li> </ul><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/scala">scala</a>のREPLは<a class="keyword" href="http://d.hatena.ne.jp/keyword/bash">bash</a>風の編集コマンドが使えるmintty上のほうが使いやすいと思います。<br /> (<a class="keyword" href="http://d.hatena.ne.jp/keyword/scala">scala</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/github">github</a>に移行らしい <a href="https://github.com/scala/scala/wiki/Github-Move">https://github.com/scala/scala/wiki/Github-Move</a> )</p> <ul> <li><a href="https://github.com/scala/scala/blob/master/src/compiler/scala/tools/ant/templates/tool-unix.tmpl">https://github.com/scala/scala/blob/master/src/compiler/scala/tools/ant/templates/tool-unix.tmpl</a></li> </ul> </div> bellbind cygiwnでrvmを使ってruby-1.9.2をビルド&インストールする hatenablog://entry/17680117127042738345 2011-06-09T21:20:37+09:00 2019-04-17T19:50:18+09:00 herokuのデフォルトのrubyが1.9.2になるとのことで、cygwinにもruby-1.9.2を入れておくことにしました。 直接ソースをビルドしてシステムに入れるのではなく、rvmを使ってHOME下にインストールしました。以下は、その手順です。 事前準備1: cygwinパッケージのインストール cygwin上に以下のパッケージが入ってなければ入れます。当然cygwin自体も最新版にしておきます。(上からssl certの更新で使うもの、さらにrvmで必要なもの、さらにrubyのビルドで必要なもの、です) curl openssl ruby git patch gcc4 mingw-wi… <p>herokuのデフォルトの<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>が1.9.2になるとのことで、<a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>にも<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>-1.9.2を入れておくことにしました。<br /> 直接ソースをビルドしてシステムに入れるのではなく、rvmを使ってHOME下にインストールしました。</p><p>以下は、その手順です。</p> <div class="section"> <h4>事前準備1: <a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>パッケージのインストール</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>上に以下のパッケージが入ってなければ入れます。当然<a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>自体も最新版にしておきます。(上から<a class="keyword" href="http://d.hatena.ne.jp/keyword/ssl">ssl</a> certの更新で使うもの、さらにrvmで必要なもの、さらに<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>のビルドで必要なもの、です)</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/curl">curl</a></li> <li>openssl</li> </ul> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a></li> <li>git</li> <li>patch</li> </ul> <ul> <li>gcc4</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/mingw">mingw</a>-win32api</li> <li>make</li> <li>openssl-devel</li> <li>libgdbm-devel</li> <li>zlib-devel</li> <li>tcltk</li> <li>bison</li> <li>autoconf</li> <li>m4</li> <li>libffi4</li> <li>libreadline7</li> <li>libopenssl098</li> <li>procps</li> <li>quilt</li> </ul><p>(いらないものや足りないものがあるかも)</p> </div> <div class="section"> <h4>事前準備2: <a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSL">SSL</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EB%A1%BC%A5%C8%BE%DA%CC%C0%BD%F1">ルート証明書</a>のアップデート</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>付属の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EB%A1%BC%A5%C8SSL%BE%DA%CC%C0%BD%F1">ルートSSL証明書</a>は古いようで、gitや<a class="keyword" href="http://d.hatena.ne.jp/keyword/curl">curl</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/wget">wget</a>でrvmのサイトなどへ<a class="keyword" href="http://d.hatena.ne.jp/keyword/https">https</a>接続しようとすると失敗してしまいます。<br /> そこでまず、<b><a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>上のcertを更新する</b>必要があります。</p><p><a href="http://stackoverflow.com/questions/3777075/https-github-access">git - SSL certificate rejected trying to access GitHub over HTTPS behind firewall - Stack Overflow</a> の回答にあるやり方そのままでOKでした。<br /> 具体的には以下の3行を実行します:</p> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">cd</span> /usr/ssl/certs curl http://curl.haxx.se/ca/cacert.pem | awk <span class="synStatement">'</span><span class="synConstant">split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print &gt; &quot;cert&quot; n &quot;.pem&quot;}</span><span class="synStatement">'</span> c_rehash </pre> </div> <div class="section"> <h4>rvmのインストールと<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>-1.9.2-headのビルド</h4> <p>事前に<b>古いrvmデータは削除しておきます</b>。</p> <pre class="code" data-lang="" data-unlink>rm -rf ~/.rvm ~/.rvmrc</pre><p><a href="https://rvm.beginrescueend.com/">https://rvm.beginrescueend.com/</a>に書いてある方法でrvmを入れます。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>bash <span class="synStatement">&lt;</span> <span class="synStatement">&lt;</span><span class="synPreProc">(</span><span class="synSpecial">curl -s https://rvm.beginrescueend.com/install/rvm</span><span class="synPreProc">)</span> </pre><p>certが古いままならばここで何も表示されずに終わってしまいます。certが更新されていればgit経由でrvmをダウンロードしていきます。</p><p>次にrvmを使って<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>-1.9.2を入れます:</p> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">source</span> <span class="synPreProc">$HOME</span>/.rvm/scripts/rvm rvm install 1.9.2-head <span class="synSpecial">-C</span> <span class="synStatement">&quot;</span><span class="synConstant">--enable-shared optflags='-O2 -march=native'</span><span class="synStatement">&quot;</span> </pre><p>certが古かったり、<a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>パッケージが足りなかったりするとダウンロードやビルドに失敗し赤い文字が画面上に出ます(失敗しなければ緑か白の文字だけ出ます)。</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>-1.9.2のビルドの仕方は<a href="http://www29.atwiki.jp/akcnv/pages/26.html">cygwin&#x3067;rvm - akcnv&#x306E;&#x500B;&#x4EBA;&#x7684;&#x5099;&#x5FD8;&#x9332; @ &#x30A6;&#x30A3;&#x30AD; - &#x30A2;&#x30C3;&#x30C8;&#x30A6;&#x30A3;&#x30AD;</a>のものを参考にしています。今の1.9.2-headではLIBRARY_PATHの設定は不要のようです。(ちなみに1.8.7-headのほうは、上記記事にある対策を取る必要がありました。)</p><p>あとビルド時間は結構かかります(5%<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%ED%A5%C3%A5%AF%A5%A2%A5%C3%A5%D7">クロックアップ</a>した<a class="keyword" href="http://d.hatena.ne.jp/keyword/ASUS">ASUS</a> UL20Aで1時間くらい)。</p> </div> <div class="section"> <h4>rvmの<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>-1.9.2がきちんと入ったことを確認する</h4> <p>ビルド後、そのままコマンド</p> <pre class="code lang-sh" data-lang="sh" data-unlink>rvm use 1.9.2-head </pre><p>を実行すると<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>コマンドやgemコマンドが、rvm上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>-1.9.2のものを使うようになります。</p><p>以下のような結果になっていれば入っていることになります:</p> <pre class="code" data-lang="" data-unlink>$ ruby -v ruby 1.9.2p274 (2011-06-06 revision 31932) [i386-cygwin]</pre><p>システムの<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>コマンドに戻す場合は、</p> <pre class="code lang-sh" data-lang="sh" data-unlink>rvm use system </pre><p>です。</p> </div> <div class="section"> <h4><strike>起動時にrvmコマンドを使えるようにする</strike></h4> <p><strike>以下の行を~/.bashrcや~/.<a class="keyword" href="http://d.hatena.ne.jp/keyword/bash">bash</a>_profile等に追加すれば、ターミナルを立ち上げた時点でrvmコマンドが使えるようになります。</strike>以下の行はrvmの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>ーが自動で追加するようです。</p> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synSpecial">[[</span> <span class="synStatement">-s</span> <span class="synPreProc">$HOME</span>/.rvm/scripts/rvm <span class="synSpecial">]]</span> &amp;&amp; <span class="synStatement">source</span> <span class="synPreProc">$HOME</span>/.rvm/scripts/rvm </pre> </div> <div class="section"> <h4>デフォルトの<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>をrvmの<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>にする</h4> <p><strike>上記の.<a class="keyword" href="http://d.hatena.ne.jp/keyword/bash">bash</a>_profileに加え、</strike>以下を実行しておけば、次のターミナル起動からは最初から<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>コマンドやgemコマンドが、rvmの<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>-1.9.2のものを使うようになります。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>rvm use 1.9.2-head <span class="synSpecial">--default</span> </pre> </div> <div class="section"> <h4>rvm gemsetでgem環境を切り分けよう</h4> <p>rvmは<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>ランタイムだけでなく、gemパッケージの環境を切り替えることができます。たとえば、webア<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%EA%A5%D7%A5%ED">プリプロ</a>ジェクトごとに必要なgemパッケージだけを持った環境を作っておくことで、プロジェクトごとにgem環境を切り替えて使うことができます。</p><p>gem環境の管理はrvm useした状態に入ってる時にrvm gemsetコマンドを使って行います。</p><p>gem環境作成、たとえばminiblogプロジェクトのための"miniblog"環境を作る場合は</p> <pre class="code lang-sh" data-lang="sh" data-unlink>rvm use 1.9.2-head rvm gemset create miniblog </pre><p>を実行します。</p><p>次に作ったgem環境に切り替えます。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>rvm gemset use miniblog </pre><p>この状態であとはgemコマンドでgem installしていけば良いです。</p><p>rvm useコマンドで一緒にgem環境も切り替えることも可能です。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>rvm use 1.9.2-head@miniblog </pre><p>ちなみにデフォルトのgem環境は"global"です。</p> </div> <div class="section"> <h4>おまけ: <a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>でrvm install 1.8.7-headする方法</h4> <p>インストール方法</p> <pre class="code lang-sh" data-lang="sh" data-unlink>curl <span class="synSpecial">-O</span> http://dl.dropbox.com/u/<span class="synConstant">14499563</span>/ruby-1.8.7-p348-cygwin/current-cygwin-has-own-setjmph.patch rvm install 1.8.7-head <span class="synSpecial">-C</span> <span class="synStatement">&quot;</span><span class="synConstant">--enable-shared optflags='-O2 -march=native'</span><span class="synStatement">&quot;</span> <span class="synSpecial">--patch</span> ./current-cygwin-has-own-setjmph.patch </pre> <div class="section"> <h5>解説</h5> <p>普通にビルドして失敗するのは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>がすでにsetjmp.hを持っているのに、ソースeval.cと<a class="keyword" href="http://d.hatena.ne.jp/keyword/gc">gc</a>.c中でifdef __<a class="keyword" href="http://d.hatena.ne.jp/keyword/CYGWIN">CYGWIN</a>__内でsetjmp/longjmpのプロトタイプ宣言をしているからです(しかも型が違う)。<br /> そのためmakeを失敗させないためには、単純にこの宣言部分を削除するpatchをつくればいいことになります。</p><p>patchの作り方(<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>-1.8.7-p348の場合)</p> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">cd</span> ~/.rvm/src/ruby-1.8.7-head/ ed eval.c <span class="synStatement">&lt;&lt;EDIT</span> <span class="synConstant">210,212d</span> <span class="synConstant">wq</span> <span class="synStatement">EDIT</span> ed gc.c <span class="synStatement">&lt;&lt;EDIT</span> <span class="synConstant">42,44d</span> <span class="synConstant">wq</span> <span class="synStatement">EDIT</span> git diff <span class="synStatement">&gt;</span> ~/current-cygwin-has-own-setjmph.patch </pre><p>このpatchは<a class="keyword" href="http://d.hatena.ne.jp/keyword/dropbox">dropbox</a>上においておきます。</p> <ul> <li><a href="http://dl.dropbox.com/u/14499563/ruby-1.8.7-p348-cygwin/current-cygwin-has-own-setjmph.patch">http://dl.dropbox.com/u/14499563/ruby-1.8.7-p348-cygwin/current-cygwin-has-own-setjmph.patch</a></li> </ul><p><br /> <a href="https://rvm.beginrescueend.com/rubies/patching/">https://rvm.beginrescueend.com/rubies/patching/</a>によると、 ".rvm/patches/<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>/1.8.7/"にあるpatchは自動適用されているようで、そこに置くように<a class="keyword" href="http://d.hatena.ne.jp/keyword/github">github</a>でpull requestするのが良いようです。</p> </div> </div> bellbind naveを使ったnode.jsインストールと、最近のnpmの使い方 hatenablog://entry/17680117127042738995 2011-05-30T23:01:33+09:00 2019-04-17T19:50:26+09:00 今風のnode.js環境の作り方です。naveによって複数バージョンのnode.jsを共存させます。 またnpmも以前とは少し使い方が変わってるので、その使い方をフォローしています。 簡単な用語説明: node.js: イベント駆動アーキテクチャなサーバサイドJavaScript環境 nave: 複数node.jsバージョンを管理するシステム npm: node.js用パッケージシステム あらすじ naveダウンロード naveからnodejsインストール インストールしたnodejsにnpmインストール npmでグローバルモジュールインストール 確認した環境 ubuntu natty cyg… <p>今風のnode.js環境の作り方です。naveによって複数バージョンのnode.jsを共存させます。<br /> またnpmも以前とは少し使い方が変わってるので、その使い方をフォローしています。</p><br /> <p>簡単な用語説明:</p> <ul> <li>node.js: イベント駆動<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>なサーバサイド<a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>環境</li> <li>nave: 複数node.jsバージョンを管理するシステム</li> <li>npm: node.js用パッケージシステム</li> </ul> <div class="section"> <h4>あらすじ</h4> <ul> <li>naveダウンロード</li> <li>naveからnodejsインストール</li> <li>インストールしたnodejsにnpmインストール</li> <li>npmでグローバルモジュールインストール</li> </ul> </div> <div class="section"> <h4>確認した環境</h4> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/ubuntu">ubuntu</a> natty</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a> on Window7 x64</li> </ul> </div> <div class="section"> <h4>必要なもの</h4> <p>事前に必要なものは、あらかじめパッケージをいれておきます:</p> <ul> <li>naveやnpmで必要な物 <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/bash">bash</a>、git、<a class="keyword" href="http://d.hatena.ne.jp/keyword/curl">curl</a></li> </ul></li> <li>nodejsビルドに必要な物 <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/ubuntu">ubuntu</a> natty: <a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-all、build-essential、pkg-config、libssl-dev、libz-dev</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>: <b>gcc4-g++</b>、make、openssl、openssl-devel、<b>pkg-config</b>、zlib-devel、<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a> <ul> <li>/etc/resolv.conf がなければ以下の内容で作っておく</li> </ul></li> </ul></li> </ul><pre class="code" data-lang="" data-unlink>nameserver 8.8.8.8 nameserver 8.8.4.4</pre> </div> <div class="section"> <h4>naveを使ったnodejsのインストール</h4> <p>naveをgitでダウンロードし、そこからnode.js最新版をインストールします。以下コマンド:</p> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">mkdir</span> ~/.nave <span class="synStatement">cd</span> ~/.nave git clone git://github.com/isaacs/nave.git ~/.nave/nave/nave.sh install latest </pre><p>以下、nodejs最新版のダウンロードとビルドが走ります。完成後、</p> <pre class="code lang-sh" data-lang="sh" data-unlink>~/.nave/nave/nave.sh use latest </pre><p>とすると、さらにシェルが起動してその中でnodeコマンドが使えるようになります。(Ctrl+Dで抜けれる)</p> <pre class="code" data-lang="" data-unlink>$ node -v v0.4.8</pre><p>naveコマンドとして使えるよう、~/.<a class="keyword" href="http://d.hatena.ne.jp/keyword/bash">bash</a>_aliasesや~/.<a class="keyword" href="http://d.hatena.ne.jp/keyword/bash">bash</a>_profileなどに以下を追加しておくとよいです:</p> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">alias </span><span class="synIdentifier">nave</span><span class="synStatement">=</span><span class="synPreProc">$HOME</span>/.nave/nave/nave.sh </pre><p>このaliasで、nave.shはどこでもnaveコマンドとして使えます</p> <pre class="code" data-lang="" data-unlink>$ nave use latest Already installed: 0.4.8 using 0.4.8 $</pre> </div> <div class="section"> <h4>npm インストール</h4> <p>nodeコマンドが使えるようになった状態で、以下を実行します:</p> <pre class="code lang-sh" data-lang="sh" data-unlink>curl http://npmjs.org/install.sh | sh </pre><p>途中対話モードになり"Is this OK? enter 'yes' or 'no'"と聞いてくるので、"yes"と打ちます。</p><p>nodeコマンドが使える状態のとき、npmコマンドが使えるようになります。</p> <pre class="code" data-lang="" data-unlink>$ npm -v 1.0.6</pre> </div> <div class="section"> <h4>グローバルパッケージとしてインストール</h4> <p>コマンドを提供するパッケージは、グローバル(といっても、nodeコマンドのある場所)に入れる必要があります。<br /> たとえば以下のパッケージは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%DE%A5%F3%A5%C9%A5%E9%A5%A4%A5%F3">コマンドライン</a>用コマンドを提供しています:</p> <ul> <li>vows: BDD(Behavior Driven Development)システム</li> <li>docco: <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>からドキュメント生成するツール</li> </ul><p>グローバルに入れるには、npm install <b>-g</b>で入れます:</p> <pre class="code lang-sh" data-lang="sh" data-unlink>npm install <span class="synSpecial">-g</span> vows npm install <span class="synSpecial">-g</span> docco </pre><p>nodeコマンドが使える状態のとき、vowsコマンドとdoccoコマンドが使えるようになります。</p><p>アインインストールは以下のようになります:</p> <pre class="code lang-sh" data-lang="sh" data-unlink>npm uninstall <span class="synSpecial">-g</span> vows npm uninstall <span class="synSpecial">-g</span> docco </pre> </div> <div class="section"> <h4>おまけ: ローカルパッケージとしてダウンロード</h4> <p>オプション-gがないと、実行<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リ下に"node_modules"<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リを作り、そこにパッケージが入ります。</p><p>その位置でnodeコマンドを実行すれば、入れたモジュールをrequireで読み込めるようになっています。</p><p>例: underscore.js</p> <pre class="code" data-lang="" data-unlink>$ ls $ npm install underscore underscore@1.1.6 ./node_modules/underscore $ ls node_modules $ node &gt; var _ = require(&#34;underscore&#34;) &gt; _.map [Function] &gt;</pre><p>node_modulesはその直下の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リ内からも有効になっています。</p> <pre class="code" data-lang="" data-unlink>$ ls node_modules $ mkdir -p src/js $ cd src/js $ node &gt; var _ = require(&#34;underscore&#34;) &gt; _.map [Function] &gt;</pre><p>npmコマンドも上位<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リのnode_modulesに対して機能します</p> <pre class="code" data-lang="" data-unlink>$ npm install chaos chaos@0.1.7 ../../node_modules/chaos</pre> </div> <div class="section"> <h4>リソース</h4> <p> </p> <ul> <li><a href="http://d.hatena.ne.jp/bellbind/20101022/1287765064">cygwin&#x4E0A;&#x3067;nodejs&#x3068;npm&#x3068;CoffeeScript&#x306A;&#x3069;&#x3092;&#x30A4;&#x30F3;&#x30B9;&#x30C8;&#x30FC;&#x30EB;&#x3059;&#x308B; - &#x30E9;&#x30B7;&#x30A6;&#x30E9;</a>(node-0.2のころ)</li> <li><a href="https://github.com/isaacs/nave">GitHub - isaacs/nave: Virtual Environments for Node</a></li> <li><a href="http://npmjs.org/">npm | the &#x2764; of the modern development community</a></li> <li><a href="http://nodejs.org/">Node.js</a></li> </ul> </div> bellbind ECMAScript5を使ってSameGameを書いてみた hatenablog://entry/17680117127042739447 2011-05-21T01:27:13+09:00 2019-04-17T19:50:32+09:00 ECMAScript5の追加ArrayメソッドやObject.freeze/Object.createを使い、JavaScriptでSameGameを書いてみました。 2D Canvasによるデモ: http://dl.dropbox.com/u/14499563/samegame/samegame-view.html ソース: https://gist.github.com/984605 意識した部分 ピュアECMAScript5仕様の機能のみでゲームロジックを書く(HTMLの機能を使うUIは完全分離する) forループを使わず、forEachやmapを使う Object.createを適切… <p>ECMAScript5の追加ArrayメソッドやObject.freeze/Object.createを使い、<a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>でSameGameを書いてみました。</p> <ul> <li>2D <a class="keyword" href="http://d.hatena.ne.jp/keyword/Canvas">Canvas</a>によるデモ: <a href="http://dl.dropbox.com/u/14499563/samegame/samegame-view.html">http://dl.dropbox.com/u/14499563/samegame/samegame-view.html</a></li> <li>ソース: <a href="https://gist.github.com/984605">https://gist.github.com/984605</a></li> </ul><p><span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20110522082433" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20110522/20110522082433.png" alt="f:id:bellbind:20110522082433p:image" title="f:id:bellbind:20110522082433p:image" class="hatena-fotolife" itemprop="image"></a></span></p><p>意識した部分</p> <ul> <li><b>ピュアECMAScript5仕様</b>の機能のみでゲームロジックを書く(HTMLの機能を使うUIは完全分離する)</li> <li>forループを使わず、forEachやmapを使う</li> <li>Object.createを適切に使用する</li> <li>ステップで盤面生成し副作用なしなので、すべてObject.freezeする。</li> </ul><p>for文を避けるため、Array(n).forEach(...)/map(...)は機能しない仕様(呼び出しても引数を実行しない)のようなので、range(n)関数を用意しています。Selected.pointsはArrayのindexOfを使うため、座標を"x,y"形式の文字列にして保持させています。</p> <div class="section"> <h4>コード</h4> <p><script src="https://gist.github.com/984605.js?file=samegame-rules.js"></script></p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%B3%A5%E1">ブコメ</a>を見るとどうも誤解されているようですが、1個のSelectedが可能なのはバグではないです。デモUIの初期値が全部消せる設定になっているのも、コードを最後まで走れる(isClearがtrueになるところまで)ようにするため。</p><p><b>1個のSelectedが成立する設計は意図的なもの</b>です(そもそも0個のSelectedだって可能だ)。Boardが上書きせず、別Boardを生み出す構造で設計であるのと同様、数判定を混ぜないのも工夫によるものです(ヒントはコヒージョン)。</p> </div> <div class="section"> <h4>追記: 設計をいくつか更新</h4> <ul> <li>Selected.forEachをArray.forEachのように第二引数にコールバックのthisオブジェクトを設定できるようにした。</li> <li>Board.forEachを用意し、tableイテレートを抽象化し、実装でtableをパディングしないようにした</li> <li>UI部分も汎用化し、<a class="keyword" href="http://d.hatena.ne.jp/keyword/canvas">canvas</a>要素ごとに結合できるようにした <ul> <li>Viewオブジェクト定義でObject.createを使う</li> <li>Viewオブジェクトは、状態を更新するがプロパティ構成の変更はないのでObject.sealする</li> <li>イベントリスナー登録でFunction.bindを使う</li> </ul></li> <li>コード全体に"use strict"をいれた</li> <li>ES5では、オブジェクト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%C6%A5%E9%A5%EB">リテラル</a>の最後のプロパティのあとの","が使えるようになったのでいれておく</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>はそのままだとconstructorプロパティはObjectを返すので、constructorプロパティを上書きしておく</li> <li>Viewのパラメータを変えるUIをつけた。<a class="keyword" href="http://d.hatena.ne.jp/keyword/HTML5">HTML5</a>追加のinput要素のrangeとnumberを利用した。</li> <li>モジュール変数はトッ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%EC%A5%D9">プレベ</a>ルでthis.MyModule = ...のスタイルでセットするようにした。このスタイルで作れば、nodejsのrequire(jsfilename)でも読み込めるようになる。</li> </ul> </div> <div class="section"> <h4>感想</h4> <ul> <li>ES5で拡張された関数によって、だいぶシンプルにコードが書ける。</li> <li>Arrayがここまできたら組値としてのtupleかstructもほしい。ペア値で、===で同値比較したい。パターン展開出来ればなおよし。</li> <li>Object.freeze()がメソッドでもなく字面上も長いので、値オブジェクトで必要部分をfreezeして回ると結構ごちゃごちゃする。</li> <li>Object.createでの定義で、privateメソッドを使いたい場合は、PImpl風になるのかな?</li> <li>Arrayのコールバックを渡すメソッドでは第二引数でthisを渡せる。forEach(cb.bind(this))とforEach(cb, this)どっちがいい?</li> <li>さめがめは実装は数時間で作成できるので、設計演習にはちょうどいいかも。</li> </ul> </div> <div class="section"> <h4>リソース</h4> <ul> <li><a href="http://www.ecmascript.org/docs/tc39-2009-043.pdf">http://www.ecmascript.org/docs/tc39-2009-043.pdf</a></li> <li><a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create">Object.create() - JavaScript | MDN</a></li> <li><a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/freeze">Object.freeze() - JavaScript | MDN</a></li> <li><a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map">Array.prototype.map() - JavaScript | MDN</a></li> <li><a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach">Array.prototype.forEach() - JavaScript | MDN</a></li> <li><a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter">Array.prototype.filter() - JavaScript | MDN</a></li> <li><a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every">Array.prototype.every() - JavaScript | MDN</a></li> <li><a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf">Array.prototype.indexOf() - JavaScript | MDN</a></li> <li><a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind">Function.prototype.bind() - JavaScript | MDN</a></li> <li><a href="http://ja.wikipedia.org/wiki/%E3%81%95%E3%82%81%E3%81%8C%E3%82%81">&#x3055;&#x3081;&#x304C;&#x3081; - Wikipedia</a></li> </ul> </div> bellbind ubuntu natty(11.04) 日本語環境での文字入力のための設定 hatenablog://entry/17680117127042740386 2011-05-11T12:34:22+09:00 2019-04-17T19:50:43+09:00 Acer AspireOne AO753にUSBメモリからUbuntu nattyを入れる - ラシウラでAO753にいれたubuntu natty(amd64)をいれたけど、ここにはAO753関係のことだけ記述しました。以下はハードに依存しない部分での、nattyで行った個人向けの設定です。デスクトップはUnity日本語環境で、そこでの文字入力における難点を解決しています。 64bit版 flashplayerとfirefox上のflashでのASCII入力を可能にする設定 ibus-mozcと変換/無変換によるIMのON/OFF設定 ibusのトグルをCtrl+Alt+Shift+スペース… <p><a href="http://d.hatena.ne.jp/bellbind/20110417/1303051976">Acer AspireOne AO753&#x306B;USB&#x30E1;&#x30E2;&#x30EA;&#x304B;&#x3089;Ubuntu natty&#x3092;&#x5165;&#x308C;&#x308B; - &#x30E9;&#x30B7;&#x30A6;&#x30E9;</a>でAO753にいれた<a class="keyword" href="http://d.hatena.ne.jp/keyword/ubuntu">ubuntu</a> natty(<a class="keyword" href="http://d.hatena.ne.jp/keyword/amd64">amd64</a>)をいれたけど、ここにはAO753関係のことだけ記述しました。</p><p>以下はハードに依存しない部分での、nattyで行った個人向けの設定です。デスクトップはUnity日本語環境で、そこでの文字入力における難点を解決しています。</p> <ul> <li>64bit版 flashplayerと<a class="keyword" href="http://d.hatena.ne.jp/keyword/firefox">firefox</a>上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/flash">flash</a>でのASCII入力を可能にする設定</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>-mozcと変換/無変換によるIMのON/OFF設定</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>のトグルをCtrl+Alt+Shift+スペースキーに変える</li> <li>F10によるメニューへのフォーカス移動の抑制</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>-elによる<a class="keyword" href="http://d.hatena.ne.jp/keyword/emacs">emacs</a>上で<a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>入力を可能にする設定</li> </ul><p><b>システムのアップデートを妨害しない</b>よう、カスタマイズを最小化するポリシーの上で、日本語環境での文字入力の難点の解消を行っています。</p> <div class="section"> <h4>64bit版 flashplayerと<a class="keyword" href="http://d.hatena.ne.jp/keyword/firefox">firefox</a>上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/flash">flash</a>でのASCII入力を可能にする設定</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/amd64">amd64</a>上での32版flashplayerは文字入力に難があります。64版flashplayerではありませんでした。<br /> <a href="https://launchpad.net/~sevenmachines/+archive/flash">https://launchpad.net/~sevenmachines/+archive/flash</a>のppaを使いました。</p><p>ルートで、</p> <pre class="code" data-lang="" data-unlink># add-apt-repository ppa:sevenmachines/flash # apt-get update # apt-get install flashplugin64-installer</pre> <div class="section"> <h5>現状の<a class="keyword" href="http://d.hatena.ne.jp/keyword/firefox">firefox</a>上で、<a class="keyword" href="http://d.hatena.ne.jp/keyword/flash">flash</a>上の文字入力をできるようにする</h5> <p>パッケージをいれただけでは<b><a class="keyword" href="http://d.hatena.ne.jp/keyword/firefox">firefox</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/flash">flash</a>では、<a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>で入力できてもASCII入力ができません</b>。以下、その対策です。</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/firefox">firefox</a>の"about:config"を開き、右クリックのメニューから"新規作成"-"真偽値"を選び、</p> <ul> <li>"設定名"を<b>dom.ipc.plugins.enabled.libflashplayer.so</b>、 値を<b>false</b></li> </ul><p>で作ります。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/firefox">firefox</a>を再起動させればASCII入力もできるようになります。</p><p>(目玉のプロセス分離を無効にしてしまうので、将来不要になることを期待します)</p> </div> </div> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>-mozcと変換/無変換によるIMのON/OFF設定</h4> <div class="section"> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>-mozcのインストール</h5> <pre class="code" data-lang="" data-unlink># apt-get install ibus-mozc mozc-utils-gui ibus-qt4</pre> </div> <div class="section"> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>-mozcの設定</h5> <p>左上のキーボードアイコンの右クリックメニューから"設定"で<a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>設定ダイアログを開きます。</p> <ul> <li>"一般"タブ: "言語パネルの表示"のドロップダウンリストを<b>常に表示する</b>に変えます。 <ul> <li>"切り替え"で、"..."ボタンを押しダイアログを開き、"Control-space"を選び、"モディファイア"<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C1%A5%A7%A5%C3%A5%AF%A5%DC%A5%C3%A5%AF%A5%B9">チェックボックス</a>で<b>"Control"、"Shift"、"Alt"にチェックを入れ、"適用"ボタン</b>を押す。</li> </ul></li> <li>"インプットメソッド"タブ: "インプットメソッドの選択"ドロップダウンリストで"日本語"-<b>Mozc</b>を選び、"追加"ボタンを押します。リストから"日本語 - <a class="keyword" href="http://d.hatena.ne.jp/keyword/Anthy">Anthy</a>"を選び、"削除"ボタンを押します。</li> <li>(オプション) "詳細"タブ: "すべてのアプリケーション間で同じインプットメソッドを共有する"にチェックを入れる。</li> </ul><p>ダイアログを閉じ、再び左上のキーボードアイコンの右クリックメニューから"再起動"を選べば、<b>全角半角キーもしくはCtrl+Alt+Shift+スペースキー</b>でmozcが立ち上がり、画面上にMozcのバーが表示されます。</p> </div> <div class="section"> <h5>変換キー/無変換キーでのインプットメソッドのOn/Offを可能にする</h5> <p>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/mac">mac</a>上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%B3%A4%C8%A4%A8%A4%EA">ことえり</a>風のOn/Off設定です。ただし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>自体は立ち上げたままであり、ASCIIモードと平仮名モードを切り替えるようになります。そのため、"すべてのアプリケーション間で同じインプットメソッドを共有する"によって、各ウインドウ上で最初から<a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>はonの状態になるようにしています)</p><p>その言語バー上で、スパナアイコンをクリックし、"Property"を選べば、Mozcプロパティダイアログが開きます。そこから"一般"タブ、キー設定の"キー設定の選択"で、"カスタム"を選び"編集"ボタンを押し、"Mozcキー設定"ダイアログを開きます。</p><p>"編集"ドロップダウンから、"定義済みのキーマップからインポート"-"<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%B3%A4%C8%A4%A8%A4%EA">ことえり</a>"(もしくは"<a class="keyword" href="http://d.hatena.ne.jp/keyword/MS-IME">MS-IME</a>")を選びます。<br /> そのあとで再び"編集"から"エクスポート"を選び、適当な"名前"(例: mozc.cfg)を付けて"保存"します。</p><p>保存したファイルに以下の2行を追加して上書き保存します。</p> <pre class="code" data-lang="" data-unlink>DirectInput Henkan IMEOn Precomposition MuHenkan IMEOff</pre><p>ファイル編集後、"Mozcキー設定"ダイアログの"編集"から"インポート"を選び、上書きOK?の警告がでるのをスルーし、編集したファイルを開き、読み込ませます。読み込んだら"OK"ボタンダイアログを閉じていきます。</p><p>この後、<a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>起動中は、"変換"キーで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%D2%A4%E9%A4%AC%A4%CA%C6%FE%CE%CF">ひらがな入力</a>モード、"無変換"キーでASCII入力モードになります(ログイン後に初回だけは、Ctrl+スペースによる<a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>起動は必要)。</p> </div> </div> <div class="section"> <h4>F10によるメニューへのフォーカス移動の抑制</h4> <p>ASCII化キーとしてのF10を使う場合、UnityがF10キーをとってしまうのを避ける必要があります。</p> <pre class="code" data-lang="" data-unlink># apt-get install compizconfig-settings-manager</pre><p>"ccsm"コマンドがインストールされます。</p><p>ccsmを起動するとダイアログがでます。"デスクトップ"部の"<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a> Unity Plugin"をクリックします。"Key to open the first panel menu"が"F10"になっています。このボタンをクリックし、開いたダイアログで"Shift"を押し、"OK"すれば、ボタンが"<Shift>F10"となります。</p><p>最ログインしたあとは、F10キーでメニューにフォーカスが行かなくなります。</p> </div> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>-elによる<a class="keyword" href="http://d.hatena.ne.jp/keyword/emacs">emacs</a>上で<a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>入力を可能にする設定</h4> <div class="section"> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/emacs">emacs</a>のインストール</h5> <pre class="code" data-lang="" data-unlink># apt-get install emacs</pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/emacs">emacs</a>はデフォルトで<a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>が効かないようで、その対策として<a href="https://launchpad.net/ibus.el">ibus.el in Launchpad</a>をいれ、設定をします。</p> </div> <div class="section"> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>-elのインストール</h5> <pre class="code" data-lang="" data-unlink># add-apt-repository ppa:irie/elisp # apt-get update # apt-get install ibus-el</pre> </div> <div class="section"> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>.elの有効化</h5> <p>まず、<b>~/.Xresources</b>ファイルを以下の内容で保存し、再ログインします。</p> <pre class="code" data-lang="" data-unlink>Emacs*useXIM: false</pre><p>次に<b>~/<a class="keyword" href="http://d.hatena.ne.jp/keyword/.emacs">.emacs</a></b>で以下の記述を先頭にいれます。</p> <pre class="code lang-lisp" data-lang="lisp" data-unlink><span class="synSpecial">(</span><span class="synStatement">require</span> <span class="synSpecial">'</span><span class="synIdentifier">ibus</span><span class="synSpecial">)</span> <span class="synSpecial">(</span>add-hook <span class="synSpecial">'</span><span class="synIdentifier">after-init-hook</span> <span class="synSpecial">'</span><span class="synIdentifier">ibus-mode-on</span><span class="synSpecial">)</span> <span class="synSpecial">(</span>ibus-define-common-key [?\C-\s ?\C-/] <span class="synStatement">nil</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> ibus-cursor-color <span class="synSpecial">'(</span><span class="synConstant">&quot;red&quot;</span> . <span class="synConstant">&quot;blue&quot;</span><span class="synSpecial">))</span> <span class="synSpecial">(</span>global-set-key [?\C-\M-\S- ] <span class="synSpecial">'</span><span class="synIdentifier">ibus-toggle</span><span class="synSpecial">)</span> </pre><p>これによって、<a class="keyword" href="http://d.hatena.ne.jp/keyword/emacs">emacs</a>上でも他と同じように<a class="keyword" href="http://d.hatena.ne.jp/keyword/ibus">ibus</a>入力が機能します。</p> </div> <div class="section"> <h5>その他<a class="keyword" href="http://d.hatena.ne.jp/keyword/.emacs">.emacs</a>に書いている基本設定</h5> <pre class="code lang-lisp" data-lang="lisp" data-unlink><span class="synSpecial">(</span><span class="synStatement">setq</span> x-select-enable-clipboard <span class="synStatement">t</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> interprogram-paste-function <span class="synSpecial">'</span><span class="synIdentifier">x-cut-buffer-or-selection-value</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> inhibit-startup-message <span class="synStatement">t</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> indent-tabs-mode <span class="synStatement">nil</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> make-backup-files <span class="synStatement">nil</span><span class="synSpecial">)</span> <span class="synSpecial">(</span>column-number-mode <span class="synStatement">t</span><span class="synSpecial">)</span> <span class="synSpecial">(</span>cua-mode <span class="synStatement">t</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> dabbrev-case-fold-search <span class="synStatement">t</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> dabbrev-case-replace <span class="synStatement">t</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">require</span> <span class="synSpecial">'</span><span class="synIdentifier">font-lock</span><span class="synSpecial">)</span> <span class="synSpecial">(</span>global-font-lock-mode <span class="synStatement">t</span><span class="synSpecial">)</span> </pre><p>一番上の2行は<a class="keyword" href="http://d.hatena.ne.jp/keyword/emacs">emacs</a>上でデスクトップ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C3%A5%D7%A5%DC%A1%BC%A5%C9">クリップボード</a>を使ったコピーペーストを可能にするものです。</p> </div> </div> <div class="section"> <h4>リソース</h4> <ul> <li><a href="http://www11.atwiki.jp/s-irie/pages/21.html">ibus.el - irie @ &#x30A6;&#x30A3;&#x30AD; - &#x30A2;&#x30C3;&#x30C8;&#x30A6;&#x30A3;&#x30AD;</a></li> <li><a href="http://mogproject.blogspot.com/2011/05/ubuntu-mozcgoogle.html">mog project: Assigning &#39;henkan&#39; and &#39;muhenkan&#39; key to Mozc(Google Japanese Input) in Ubuntu</a></li> <li><a href="http://www.oreillynet.com/lpt/wlg/6162">O&#39;Reilly Media - Technology and Business Training</a></li> <li><a href="https://forums.ubuntulinux.jp/viewtopic.php?id=11159">Ubuntu&#x65E5;&#x672C;&#x8A9E;&#x30D5;&#x30A9;&#x30FC;&#x30E9;&#x30E0; / Xubuntu 11.04 (Natty)&#x3067;&#x30CB;&#x30B3;&#x30CB;&#x30B3;&#x52D5;&#x753B;&#x3067;&#x306E;&#x30B3;&#x30E1;&#x30F3;&#x30C8;&#x306E;&#x76F4;&#x63A5;&#x5165;&#x529B;&#x304C;&#x3067;&#x304D;&#x306A;&#x3044;</a></li> <li><a href="http://media.st/blog/2011/04/ubuntu-unity-f10/">http://media.st/blog/2011/04/ubuntu-unity-f10/</a></li> </ul> </div> <div class="section"> <h4>おまけ: <a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>-4.6のppa</h4> <p>gccgoが統合されたgcc4.6のppaは、<a href="https://launchpad.net/~ubuntu-toolchain-r/+archive/test">Toolchain test builds : &ldquo;PPA for Ubuntu Toolchain Uploads (restricted)&rdquo; team</a>にあります。</p> <pre class="code" data-lang="" data-unlink># add-apt-repository ppa:ubuntu-toolchain-r/test # apt-get update # apt-get dist-upgrade</pre><p>あとは<a class="keyword" href="http://d.hatena.ne.jp/keyword/aptitude">aptitude</a>等でgcc4.6系パッケージを選んでいけばよいでしょう。</p> </div> bellbind Acer AspireOne AO753にUSBメモリからUbuntu nattyを入れる hatenablog://entry/17680117127042742399 2011-04-17T23:52:56+09:00 2019-04-17T19:51:06+09:00 AO753を買った当時、Ubuntu 10.10ではネットワークデバイスが使えなかったりグラフィックが対応してなかったりとで諦めていたのですが、今度出るUbuntu 11.04(natty)ではAO753でも動くようになっています。そこで改めて、Ubuntu natty beta2をインストールしてみました。インストーラ用にUSBメモリを使います。用意するもの: AO753 空のUSBメモリ16GB(4GBでは無理、8GBはたぶんOK) (本当はwubi上のubuntuからインストールできるのがいいのですが...)ざっと手順は、以下のとおり: VirtualBoxの仮想マシンにUbuntuを入… <p>AO753を買った当時、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a> 10.10ではネットワークデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>が使えなかったりグラフィックが対応してなかったりとで<a href="http://d.hatena.ne.jp/bellbind/20100821/1282407285">&#x8AE6;&#x3081;&#x3066;&#x3044;&#x305F;</a>のですが、今度出る<b><a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a> 11.04(natty)ではAO753でも動く</b>ようになっています。</p><p>そこで改めて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a> natty beta2をインストールしてみました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>用に<a class="keyword" href="http://d.hatena.ne.jp/keyword/USB%A5%E1%A5%E2%A5%EA">USBメモリ</a>を使います。</p><p>用意するもの:</p> <ul> <li>AO753</li> <li>空の<a class="keyword" href="http://d.hatena.ne.jp/keyword/USB%A5%E1%A5%E2%A5%EA">USBメモリ</a>16GB(4GBでは無理、8GBはたぶんOK)</li> </ul><p>(本当は<a class="keyword" href="http://d.hatena.ne.jp/keyword/wubi">wubi</a>上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/ubuntu">ubuntu</a>からインストールできるのがいいのですが...)</p><p>ざっと手順は、以下のとおり:</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BE%C1%DB%A5%DE%A5%B7%A5%F3">仮想マシン</a>に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a>を入れる</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BE%C1%DB%A5%DE%A5%B7%A5%F3">仮想マシン</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/ubuntu">ubuntu</a>からUSB<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>を作る</li> <li>USB<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>で起動してAO753に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a>をインストールする</li> <li>インストール後、設定をいじって<a class="keyword" href="http://d.hatena.ne.jp/keyword/WiFi">WiFi</a>を使えるようにする</li> </ul> <div class="section"> <h4>事前準備(インストール領域の確保)</h4> <p>AO753で<a class="keyword" href="http://d.hatena.ne.jp/keyword/ubuntu">ubuntu</a>を入れるためのディスク領域を確保しておきます。(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BE%C1%DB%A5%DE%A5%B7%A5%F3">仮想マシン</a>を作るとき、大きくディスクを使うので先に領域確保しておきました)</p><p>「コン<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%ED%A1%BC%A5%EB">トロール</a>パネル」の「管理ツール」を開き、さらに「コンピュータの管理」を開きます。左のツリーから「ディスクの管理」を選ぶと、ディスク0のC:をクリックし、右クリックで「ボリュームの縮小」を選びます。</p><p>「縮小する領域のサイズ」に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a>で使うサイズ(MB)を指定します。約半分の150000MB程確保しました。</p> </div> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a>上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a>でUSB<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>をつくるまで</h4> <p>AO753は<a class="keyword" href="http://d.hatena.ne.jp/keyword/unetbootin">unetbootin</a>で作った<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>は起動できませんでした。<br /> しかし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a>の「スタートアップ・ディスク作成」で作ったUSB<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>は起動させることができました。</p><p>USB<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a>があれば作れます。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows7">Windows7</a>に<a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a>を入れ、まず<a class="keyword" href="http://d.hatena.ne.jp/keyword/VM">VM</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a> natty beta2を入れ、そこからUSBを差してUSB<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>を作りました。</p> <div class="section"> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a>のインストール</h5> <p>以下で、VrtualBoxの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>版とExtension Packをダウンロードし、インストールします。</p> <ul> <li><a href="http://www.virtualbox.org/wiki/Downloads">http://www.virtualbox.org/wiki/Downloads</a> (<a class="keyword" href="http://d.hatena.ne.jp/keyword/USB2.0">USB2.0</a>を使うため、Extension Packもいれました。)</li> </ul><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a>をインストールしたあとに、Extension Packのファイルをダブルクリックすれば、<a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a>にインストールされます。</p> </div> <div class="section"> <h5><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BE%C1%DB%A5%DE%A5%B7%A5%F3">仮想マシン</a>に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a>のインストール</h5> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>isoをダウンロードします。</p> <ul> <li><a href="http://releases.ubuntu.com/natty/">http://releases.ubuntu.com/natty/</a> の desktop <a class="keyword" href="http://d.hatena.ne.jp/keyword/amd64">amd64</a>のiso</li> </ul><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a>管理パネルを起動し、「新規」で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BE%C1%DB%A5%DE%A5%B7%A5%F3">仮想マシン</a>設定を作ります。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a>(64bit)を選び、インストール用の仮想ディスクは10GB程度で作成します。</p><p>作った<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BE%C1%DB%A5%DE%A5%B7%A5%F3">仮想マシン</a>設定を選び「設定」で開き、左の「ストレージ」を選び、「<a class="keyword" href="http://d.hatena.ne.jp/keyword/IDE">IDE</a>コントローラ」の右の「+」(CD/DVDデ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>の追加)を選び、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>のisoを選びます。</p><p>設定を閉じ、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BE%C1%DB%A5%DE%A5%B7%A5%F3">仮想マシン</a>を起動し、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a>をインストールします。<br /> インストールではディスクの全領域を使っていれて構いません。</p> </div> <div class="section"> <h5>スタートアップディスクの作成</h5> <p>インストール後、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BE%C1%DB%A5%DE%A5%B7%A5%F3">仮想マシン</a>を一旦停止し、<a class="keyword" href="http://d.hatena.ne.jp/keyword/USB%A5%E1%A5%E2%A5%EA">USBメモリ</a>をPCに差し込みます。</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a>の「設定」の「ストレージ」からインストール用に追加していたisoを選び、下の「-」(割り当ての除去)を押して外します。<br /> そして、左の「USB」を選び、「<a class="keyword" href="http://d.hatena.ne.jp/keyword/USB2.0">USB2.0</a>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/EHCI">EHCI</a>)コントローラを有効化」にチェックを入れ、左の「+」(デ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>からフィルタを追加する)から差し込んだ<a class="keyword" href="http://d.hatena.ne.jp/keyword/USB%A5%E1%A5%E2%A5%EA">USBメモリ</a>を選び、チェックが入った状態にします。</p><p>設定後、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BE%C1%DB%A5%DE%A5%B7%A5%F3">仮想マシン</a>を起動させます。起動後、ログインすると、デスクトップに差してある<a class="keyword" href="http://d.hatena.ne.jp/keyword/USB%A5%E1%A5%E2%A5%EA">USBメモリ</a>が見えているはずです。</p><p>まず<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BE%C1%DB%A5%DE%A5%B7%A5%F3">仮想マシン</a>上でブラウザを開き、同じように<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>をisoをダウンロードします。</p> <ul> <li><a href="http://releases.ubuntu.com/natty/">http://releases.ubuntu.com/natty/</a> の desktop <a class="keyword" href="http://d.hatena.ne.jp/keyword/amd64">amd64</a>のiso</li> </ul><p>ダウンロード後、(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a> Classicセッションの)デスクトップの上メニューから、「システム」-「システム管理」-「スタートアップ・ディスクの作成」を選び、起動します。</p> <ul> <li>「その他」ボタンを押し、ダウンロードしたisoを選びます。</li> <li>/dev/sdc1 (16GB)を選び、「ディスクの消去」を押します。</li> <li>確保する領域(最大4GB)を設定します。</li> <li>「スタートアップ・ディスクの作成」を押します。</li> </ul><p>作り終わったら<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B2%BE%C1%DB%A5%DE%A5%B7%A5%F3">仮想マシン</a>を止め、PCも電源を落とします。</p> </div> </div> <div class="section"> <h4>USBからインストール</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/USB%A5%E1%A5%E2%A5%EA">USBメモリ</a>を刺したまま、電源を入れます。すぐ<b>「F12」キー</b>を押せば、ブートセレクト画面になります。そこで<a class="keyword" href="http://d.hatena.ne.jp/keyword/USB%A5%E1%A5%E2%A5%EA">USBメモリ</a>を選び、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>をブートさせます。</p><p>カスタムで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D1%A1%BC%A5%C6%A5%A3%A5%B7%A5%E7%A5%F3">パーティション</a>を切りました。空き領域のうち、4096MiB(sda5)を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%EF%A5%C3%A5%D7">スワップ</a>領域にし、残りすべてを<a class="keyword" href="http://d.hatena.ne.jp/keyword/ext4">ext4</a>にしてそのマウントポイントを「/」に指定しました。また/dev/sdaに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A1%BC%A5%C8%A5%ED%A1%BC%A5%C0">ブートローダ</a>ーを入れるようにしました。</p><p>あとは同じようにインストールしていきます。</p> </div> <div class="section"> <h4>インストール後、AO753の<a class="keyword" href="http://d.hatena.ne.jp/keyword/WiFi">WiFi</a>を使えるようにする</h4> <p>インストール直後の設定では、<a class="keyword" href="http://d.hatena.ne.jp/keyword/WiFi">WiFi</a>が使えないようになっています。以下は<a class="keyword" href="http://d.hatena.ne.jp/keyword/WiFi">WiFi</a>を使えるようにするための手続きです。</p><p>(Unity)デスクトップで、左のバーで虫眼鏡+のアイコンを選び、上のアプリケーションの検索に"ter"と打つと出てくる「端末」を開きます。</p><p>その端末で"sudo gedit /etc/modprobe.d/blacklist.conf"を実行し、いちばんうしろに以下の行を追加して保存(Ctrl+S)します:</p> <pre class="code" data-lang="" data-unlink>blacklist acer-wmi</pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a>を再起動すれば、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B5%C0%FELAN">無線LAN</a>を使えるようになります。<br /> 上のバーのネットワークアイコンをクリックしたメニューから「無線を有効にする」を選べば、<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSID">SSID</a>が見えるようになります。</p> </div> <div class="section"> <h4>参考</h4> <ul> <li><a href="http://d.hatena.ne.jp/m_yanagisawa/20110212/p1">http://d.hatena.ne.jp/m_yanagisawa/20110212/p1</a></li> </ul> </div> bellbind HTML5 Canvasにベジエでトランプのマークを書くJS hatenablog://entry/17680117127042742512 2011-02-05T00:05:58+09:00 2019-04-17T19:51:07+09:00 ベジエの例は、ハートマーク以外はあまりみないのでスペードやクローバーも書いてみました。HTML5 canvas 2dの場合、Text APIでUnicodeの♡♢♤♧をつかうという手もありますね。 ソース: https://gist.github.com/812485 デモ: http://dl.dropbox.com/u/14499563/bezier/usage.html 図形データは、各ベジエ曲線[始点, 始点の制御点, 終点の制御点, 終点]の配列で半分だけ用意し、連続で書くようにしています。連続描画させるので終点と次の始点は同じになります。 <p>ベジエの例は、ハートマーク以外はあまりみないのでスペードやクローバーも書いてみました。<a class="keyword" href="http://d.hatena.ne.jp/keyword/HTML5">HTML5</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/canvas">canvas</a> 2dの場合、Text <a class="keyword" href="http://d.hatena.ne.jp/keyword/API">API</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/Unicode">Unicode</a>の&#9825;&#9826;&#9828;&#9831;をつかうという手もありますね。</p> <ul> <li>ソース: <a href="https://gist.github.com/812485">https://gist.github.com/812485</a></li> <li>デモ: <a href="http://dl.dropbox.com/u/14499563/bezier/usage.html">http://dl.dropbox.com/u/14499563/bezier/usage.html</a></li> </ul><p><span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20110206124014" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20110206/20110206124014.png" alt="f:id:bellbind:20110206124014p:image" title="f:id:bellbind:20110206124014p:image" class="hatena-fotolife" itemprop="image"></a></span></p><p><script src="https://gist.github.com/812485.js?file=cardsuits.js"></script></p><p>図形データは、各<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%B8%A5%A8%B6%CA%C0%FE">ベジエ曲線</a>[始点, 始点の制御点, 終点の制御点, 終点]の配列で半分だけ用意し、連続で書くようにしています。連続描画させるので終点と次の始点は同じになります。</p> bellbind 遺伝的アルゴリズムを書いてみる hatenablog://entry/17680117127042742599 2010-12-15T20:36:40+09:00 2019-04-17T19:51:08+09:00 hackernewsのリンク記事でに、Genetic Algorithm(遺伝的アルゴリズム)をJavaScriptで書いた http://www.puremango.co.uk/2010/12/genetic-algorithm-for-hello-world/ ってのを見たのですが、ソースがわけわからなかったので*1、理解するため、遺伝的アルゴリズムってのを調べて自分で書いてみました。 [python]Genetic Algorithm example · GitHub まず、Wikipediaをみたのですが、日本語と英語の記事に載せてある手続きが違うんですよね。 遺伝的アルゴリズム - … <p>hackernewsのリンク記事でに、Genetic Algorithm(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B0%E4%C5%C1%C5%AA%A5%A2%A5%EB%A5%B4%A5%EA%A5%BA%A5%E0">遺伝的アルゴリズム</a>)を<a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>で書いた</p> <ul> <li><a href="http://www.puremango.co.uk/2010/12/genetic-algorithm-for-hello-world/">http://www.puremango.co.uk/2010/12/genetic-algorithm-for-hello-world/</a></li> </ul><p>ってのを見たのですが、ソースがわけわからなかったので<a href="#f-066eb138" name="fn-066eb138" title="人工知能とかの分野などは、エンジニアリング技術が弱くてソースが汚いのはよくあることだが">*1</a>、理解するため、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B0%E4%C5%C1%C5%AA%A5%A2%A5%EB%A5%B4%A5%EA%A5%BA%A5%E0">遺伝的アルゴリズム</a>ってのを調べて自分で書いてみました。</p> <ul> <li><a href="https://gist.github.com/741853">[python]Genetic Algorithm example &middot; GitHub</a></li> </ul><p>まず、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Wikipedia">Wikipedia</a>をみたのですが、日本語と英語の記事に載せてある手続きが違うんですよね。</p> <ul> <li><a href="http://ja.wikipedia.org/wiki/%E9%81%BA%E4%BC%9D%E7%9A%84%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0">&#x907A;&#x4F1D;&#x7684;&#x30A2;&#x30EB;&#x30B4;&#x30EA;&#x30BA;&#x30E0; - Wikipedia</a></li> <li><a href="http://en.wikipedia.org/wiki/Genetic_algorithm">Genetic algorithm - Wikipedia</a></li> </ul><p>日本語版では交叉と突然変異は「どちらか」と書いてあるんですが、英語版は交叉したあと突然変異させるというようになってます。で、他のサイトをみると、どうも英語版の手続きが基本のようです。</p> <ul> <li><a href="http://www.obitko.com/tutorials/genetic-algorithms/japanese/ga-basic-description.php">&#x907A;&#x4F1D;&#x7684;&#x30A2;&#x30EB;&#x30B4;&#x30EA;&#x30BA;&#x30E0;(Genetic Algorithm) - &#x907A;&#x4F1D;&#x7684;&#x30A2;&#x30EB;&#x30B4;&#x30EA;&#x30BA;&#x30E0;</a></li> </ul><p>手続きもすごく短い。簡単に言うと「繰り返し、適当に近そうな奴を選んで混ぜてみたり、たまにちょっとずらしたりしてみてテストさせる」、ってことのようで、遺伝うんぬんとは無関係に、普通に正解探しをやってるのと変わらない気もする。</p><p>ということで、それをそのまま<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%EC%A1%BC%A5%E0%A5%EF%A1%BC%A5%AF">フレームワーク</a>化したのが、GeneticAlgorithmクラスです。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synStatement">class</span> <span class="synIdentifier">GeneticAlgorithm</span>(<span class="synIdentifier">object</span>): <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self, genetics): self.genetics = genetics <span class="synStatement">pass</span> <span class="synStatement">def</span> <span class="synIdentifier">run</span>(self): population = self.genetics.initial() <span class="synStatement">while</span> <span class="synIdentifier">True</span>: fits_pops = [(self.genetics.fitness(ch), ch) <span class="synStatement">for</span> ch <span class="synStatement">in</span> population] <span class="synStatement">if</span> self.genetics.check_stop(fits_pops): <span class="synStatement">break</span> population = self.<span class="synIdentifier">next</span>(fits_pops) <span class="synStatement">pass</span> <span class="synStatement">return</span> population <span class="synStatement">def</span> <span class="synIdentifier">next</span>(self, fits): parents_generator = self.genetics.parents(fits) size = <span class="synIdentifier">len</span>(fits) nexts = [] <span class="synStatement">while</span> <span class="synIdentifier">len</span>(nexts) &lt; size: parents = <span class="synIdentifier">next</span>(parents_generator) cross = random.random() &lt; self.genetics.probability_crossover() children = self.genetics.crossover(parents) <span class="synStatement">if</span> cross <span class="synStatement">else</span> parents <span class="synStatement">for</span> ch <span class="synStatement">in</span> children: mutate = random.random() &lt; self.genetics.probability_mutation() nexts.append(self.genetics.mutation(ch) <span class="synStatement">if</span> mutate <span class="synStatement">else</span> ch) <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">return</span> nexts[<span class="synConstant">0</span>:size] <span class="synStatement">pass</span> </pre><p>で、この中で使っている、initial()、fitness(chromo)、parents(pop)、crossover(parents)、mutation(chromo)などを、問題をこの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%EB%A5%B4%A5%EA%A5%BA%A5%E0">アルゴリズム</a>に合うように<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%B3%A1%BC%A5%C9">エンコード</a>し、各種戦術を選んで実装し、与えてあげれば計算してくれることになります。</p><p>選択や交叉、変異での戦術のほうは典型的なものから選べばいいので、結局<b>重要なのは、「解きたい問題をどう<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%B3%A1%BC%A5%C9">エンコード</a>するか」</b>、であると思います。(でも、これについても英語版<a class="keyword" href="http://d.hatena.ne.jp/keyword/Wikipedia">Wikipedia</a>には<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CA%A5%C3%A5%D7%A5%B5%A5%C3%A5%AF%CC%E4%C2%EA">ナップサック問題</a>ではどうするかについて書いてあるけど、日本語版には戦術のバリエーションばかりで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A8%A5%F3%A5%B3%A1%BC%A5%C9">エンコード</a>についての言及が一つもない状態だったりします。)</p><p>で、例の記事の問題は与えたテキストをGAで推測するもので、それをこのクラスでつかえるようにしたのが、以下です。</p> <pre class="code lang-python" data-lang="python" data-unlink> <span class="synStatement">class</span> <span class="synIdentifier">GuessText</span>(GeneticFunctions): <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self, target_text, limit=<span class="synConstant">200</span>, size=<span class="synConstant">400</span>, prob_crossover=<span class="synConstant">0.9</span>, prob_mutation=<span class="synConstant">0.2</span>): self.target = self.text2chromo(target_text) self.counter = <span class="synConstant">0</span> self.limit = limit self.size = size self.prob_crossover = prob_crossover self.prob_mutation = prob_mutation <span class="synStatement">pass</span> <span class="synComment"># GeneticFunctions interface impls</span> <span class="synStatement">def</span> <span class="synIdentifier">probability_crossover</span>(self): <span class="synStatement">return</span> self.prob_crossover <span class="synStatement">def</span> <span class="synIdentifier">probability_mutation</span>(self): <span class="synStatement">return</span> self.prob_mutation <span class="synStatement">def</span> <span class="synIdentifier">initial</span>(self): <span class="synStatement">return</span> [self.random_chromo() <span class="synStatement">for</span> j <span class="synStatement">in</span> <span class="synIdentifier">range</span>(self.size)] <span class="synStatement">def</span> <span class="synIdentifier">fitness</span>(self, chromo): <span class="synComment"># larger is better, matched == 0</span> <span class="synStatement">return</span> -<span class="synIdentifier">sum</span>(<span class="synIdentifier">abs</span>(c - t) <span class="synStatement">for</span> c, t <span class="synStatement">in</span> <span class="synIdentifier">zip</span>(chromo, self.target)) <span class="synStatement">def</span> <span class="synIdentifier">check_stop</span>(self, fits_populations): self.counter += <span class="synConstant">1</span> <span class="synStatement">if</span> self.counter % <span class="synConstant">10</span> == <span class="synConstant">0</span>: best_match = <span class="synIdentifier">list</span>(<span class="synIdentifier">sorted</span>(fits_populations))[-<span class="synConstant">1</span>][<span class="synConstant">1</span>] fits = [f <span class="synStatement">for</span> f, ch <span class="synStatement">in</span> fits_populations] best = <span class="synIdentifier">max</span>(fits) worst = <span class="synIdentifier">min</span>(fits) ave = <span class="synIdentifier">sum</span>(fits) / <span class="synIdentifier">len</span>(fits) <span class="synIdentifier">print</span>( <span class="synConstant">&quot;[G %3d] score=(%4d, %4d, %4d): %r&quot;</span> % (self.counter, best, ave, worst, self.chromo2text(best_match))) <span class="synStatement">pass</span> <span class="synStatement">return</span> self.counter &gt;= self.limit <span class="synStatement">def</span> <span class="synIdentifier">parents</span>(self, fits_populations): <span class="synStatement">while</span> <span class="synIdentifier">True</span>: father = self.tournament(fits_populations) mother = self.tournament(fits_populations) <span class="synStatement">yield</span> (father, mother) <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">def</span> <span class="synIdentifier">crossover</span>(self, parents): father, mother = parents index1 = random.randint(<span class="synConstant">1</span>, <span class="synIdentifier">len</span>(self.target) - <span class="synConstant">2</span>) index2 = random.randint(<span class="synConstant">1</span>, <span class="synIdentifier">len</span>(self.target) - <span class="synConstant">2</span>) <span class="synStatement">if</span> index1 &gt; index2: index1, index2 = index2, index1 child1 = father[:index1] + mother[index1:index2] + father[index2:] child2 = mother[:index1] + father[index1:index2] + mother[index2:] <span class="synStatement">return</span> (child1, child2) <span class="synStatement">def</span> <span class="synIdentifier">mutation</span>(self, chromosome): index = random.randint(<span class="synConstant">0</span>, <span class="synIdentifier">len</span>(self.target) - <span class="synConstant">1</span>) vary = random.randint(-<span class="synConstant">5</span>, <span class="synConstant">5</span>) mutated = <span class="synIdentifier">list</span>(chromosome) mutated[index] += vary <span class="synStatement">return</span> mutated <span class="synComment"># internals</span> <span class="synStatement">def</span> <span class="synIdentifier">tournament</span>(self, fits_populations): alicef, alice = self.select_random(fits_populations) bobf, bob = self.select_random(fits_populations) <span class="synStatement">return</span> alice <span class="synStatement">if</span> alicef &gt; bobf <span class="synStatement">else</span> bob <span class="synStatement">def</span> <span class="synIdentifier">select_random</span>(self, fits_populations): <span class="synStatement">return</span> fits_populations[random.randint(<span class="synConstant">0</span>, <span class="synIdentifier">len</span>(fits_populations)-<span class="synConstant">1</span>)] <span class="synStatement">def</span> <span class="synIdentifier">text2chromo</span>(self, text): <span class="synStatement">return</span> [<span class="synIdentifier">ord</span>(ch) <span class="synStatement">for</span> ch <span class="synStatement">in</span> text] <span class="synStatement">def</span> <span class="synIdentifier">chromo2text</span>(self, chromo): <span class="synStatement">return</span> <span class="synConstant">&quot;&quot;</span>.join(<span class="synIdentifier">chr</span>(<span class="synIdentifier">max</span>(<span class="synConstant">1</span>, <span class="synIdentifier">min</span>(ch, <span class="synConstant">255</span>))) <span class="synStatement">for</span> ch <span class="synStatement">in</span> chromo) <span class="synStatement">def</span> <span class="synIdentifier">random_chromo</span>(self): <span class="synStatement">return</span> [random.randint(<span class="synConstant">1</span>, <span class="synConstant">255</span>) <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synIdentifier">len</span>(self.target))] <span class="synStatement">pass</span> </pre><p>呼び出し方は、以下のようにするだけ</p> <pre class="code lang-python" data-lang="python" data-unlink>GeneticAlgorithm(GuessText(<span class="synConstant">&quot;Hello World!&quot;</span>)).run() </pre><p>結果は、このようになります。</p> <pre class="code" data-lang="" data-unlink>$ python3 genetic.py [G 10] score=(-136, -287, -503): &#39;BqSkp\x1aIri\x85|\x17&#39; [G 20] score=( -64, -94, -136): &#39;Bfgkp\x1a`qwgu\x1b&#39; [G 30] score=( -39, -54, -71): &#39;Gekkp\x1aVqwku\x1e&#39; [G 40] score=( -25, -32, -44): &#39;Gflln\x1fVoskt\x1f&#39; [G 50] score=( -12, -21, -30): &#39;Gemkp Woskd\x1b&#39; [G 60] score=( -4, -10, -19): &#39;Gfllo\x1fWorkd!&#39; [G 70] score=( -1, -3, -9): &#39;Hello World &#39; [G 80] score=( 0, -1, -6): &#39;Hello World!&#39; [G 90] score=( 0, 0, -8): &#39;Hello World!&#39; [G 100] score=( 0, 0, -7): &#39;Hello World!&#39; [G 110] score=( 0, 0, -8): &#39;Hello World!&#39; [G 120] score=( 0, 0, -6): &#39;Hello World!&#39; [G 130] score=( 0, 0, -12): &#39;Hello World!&#39; [G 140] score=( 0, 0, -9): &#39;Hello World!&#39; [G 150] score=( 0, 0, -9): &#39;Hello World!&#39; [G 160] score=( 0, 0, -5): &#39;Hello World!&#39; [G 170] score=( 0, 0, -8): &#39;Hello World!&#39; [G 180] score=( 0, 0, -8): &#39;Hello World!&#39; [G 190] score=( 0, 0, -6): &#39;Hello World!&#39; [G 200] score=( 0, 0, -6): &#39;Hello World!&#39;</pre><p>一般的にはbetterを見つけるものだとは思うんですが、この例ではだいたい70回から130回程度で正解にたどり着くようです。<br /> <br /> </p> <div class="section"> <h4>ソース全体</h4> <p><script src="https://gist.github.com/741853.js?file=genetic.py"></script></p> </div><div class="footnote"> <p class="footnote"><a href="#fn-066eb138" name="f-066eb138" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%BF%CD%B9%A9%C3%CE%C7%BD">人工知能</a>とかの分野などは、エンジニアリング技術が弱くてソースが汚いのはよくあることだが</span></p> </div> bellbind platexをやめてxelatexを使おう hatenablog://entry/17680117127042743373 2010-11-05T23:19:58+09:00 2019-04-17T19:51:17+09:00 以前、platexをUTF-8コードで使うための記事 UTF8でLaTeX(pLaTeX)を使う方法 - ラシウラ出張所 - coders を書いたけど、これからはxetexのxelatexを使うようにします。xelatexだと、フォント設定だけで欧文のスタイル上でUTF-8日本語文章からPDFを生成できるようになっています。 xetexのインストール Windows: platexの"TeXインストーラ3"を使っていれば自動で入ります http://www.ms.u-tokyo.ac.jp/~abenori/mycreate/ Windows: 欧文ベースのMiKTeX(2.9)でもxela… <p>以前、<a class="keyword" href="http://d.hatena.ne.jp/keyword/platex">platex</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/UTF-8">UTF-8</a>コードで使うための記事 <a href="http://coders.g.hatena.ne.jp/bellbind/20070511/p1">UTF8&#x3067;LaTeX(pLaTeX)&#x3092;&#x4F7F;&#x3046;&#x65B9;&#x6CD5; - &#x30E9;&#x30B7;&#x30A6;&#x30E9;&#x51FA;&#x5F35;&#x6240; - coders</a> を書いたけど、これからは<b>xetex</b>のxelatexを使うようにします。xelatexだと、フォント設定だけで欧文のスタイル上で<a class="keyword" href="http://d.hatena.ne.jp/keyword/UTF-8">UTF-8</a>日本語文章からPDFを生成できるようになっています。</p> <div class="section"> <h4>xetexのインストール</h4> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>: <a class="keyword" href="http://d.hatena.ne.jp/keyword/platex">platex</a>の"<a class="keyword" href="http://d.hatena.ne.jp/keyword/TeX">TeX</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%E9">インストーラ</a>3"を使っていれば自動で入ります <ul> <li><a href="http://www.ms.u-tokyo.ac.jp/~abenori/mycreate/">http://www.ms.u-tokyo.ac.jp/~abenori/mycreate/</a></li> </ul></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>: 欧文ベースのMiKTeX(2.9)でもxelatexが入っていて、インストールした状態のままで日本語も扱えます。こちらは欧米スタンダードな<a class="keyword" href="http://d.hatena.ne.jp/keyword/tex">tex</a>構成であり、外部ツールの対応も充実してオススメです。が、逆にascmac.styのような日本でよく使われるパッケージがないので、別の違和感があるかも。 <ul> <li><a href="http://miktex.org/">http://miktex.org/</a></li> </ul></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/ubuntu">ubuntu</a>: 標準の texlive-xetex パッケージを追加します。</li> </ul><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%A4%A5%EA%A5%AA">メイリオ</a>やMS明朝などのプラットフォーム固有のフォントが使えますが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/tex">tex</a>ソースのプラットフォーム依存をなくすように<a class="keyword" href="http://d.hatena.ne.jp/keyword/IPA%A5%D5%A5%A9%A5%F3%A5%C8">IPAフォント</a>を使うほうがいいかもしれません。</p> <ul> <li><a href="http://ossipedia.ipa.go.jp/ipafont/">http://ossipedia.ipa.go.jp/ipafont/</a></li> </ul><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>は上記リンクから4種入りzipを取ってきてコン<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%ED%A1%BC%A5%EB">トロール</a>パネルのフォントからインストールすることでxetexからも使えるようになります。<a class="keyword" href="http://d.hatena.ne.jp/keyword/ubuntu">ubuntu</a>はttf-ipafont-gothicとttf-ipafont-minchoパッケージが標準にあるので、それを追加します。</p> </div> <div class="section"> <h4>使い方</h4> <p>xelatexコマンドを使います。<b><a class="keyword" href="http://d.hatena.ne.jp/keyword/tex">tex</a>ファイルをxelatexコマンドに食わせると、(dviやpsではなく)直接PDFファイルが出来上がります</b>。</p> <pre class="code" data-lang="" data-unlink>xelatex hello.tex</pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/tex">tex</a>ソースは<b><a class="keyword" href="http://d.hatena.ne.jp/keyword/UTF-8">UTF-8</a>で書き</b>、欧文と同じスタイルを使います。ただし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CF%C2%CA%B8">和文</a>フォントの設定が必要です。以下一番シンプルな例。</p> <pre class="code lang-tex" data-lang="tex" data-unlink><span class="synStatement">\documentclass</span><span class="synSpecial">{</span><span class="synPreProc">article</span><span class="synSpecial">}</span> <span class="synStatement">\usepackage</span><span class="synSpecial">{xltxtra}</span> <span class="synStatement">\setmainfont</span><span class="synSpecial">{</span>IPAPMincho<span class="synSpecial">}</span> <span class="synStatement">\setsansfont</span><span class="synSpecial">{</span>IPAPGothic<span class="synSpecial">}</span> <span class="synStatement">\setmonofont</span><span class="synSpecial">{</span>IPAGothic<span class="synSpecial">}</span> <span class="synStatement">\XeTeXlinebreaklocale</span> &quot;ja&quot; <span class="synPreProc">\begin{document}</span> こんにちは世界 <span class="synPreProc">\end{document}</span> </pre><p><code>\XeTeXlinebreaklocale "ja"</code>がないと、空白がなければ長い文章を途中で折り返してくれなくなります。</p> </div> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/%CF%C2%CA%B8">和文</a>書類向けのカスタマイズ</h4> <p>欧文文書のスタイルの上での日本語文章が乗るので、少し違和感があるかもしれません。たとえばjarticleなどと比べると余白が大きく感じてしまいます。<br /> 以下のように余白を調整すると、若干違和感も薄れるかも。</p> <pre class="code lang-tex" data-lang="tex" data-unlink><span class="synStatement">\documentclass</span><span class="synSpecial">[</span><span class="synConstant">12pt,a4</span><span class="synSpecial">]{</span><span class="synPreProc">article</span><span class="synSpecial">}</span> <span class="synStatement">\setlength</span><span class="synSpecial">{</span><span class="synStatement">\textwidth</span><span class="synSpecial">}{</span><span class="synConstant">17cm</span><span class="synSpecial">}</span> <span class="synStatement">\setlength</span><span class="synSpecial">{</span><span class="synStatement">\textheight</span><span class="synSpecial">}{</span><span class="synConstant">24cm</span><span class="synSpecial">}</span> <span class="synStatement">\setlength</span><span class="synSpecial">{</span><span class="synStatement">\leftmargin</span><span class="synSpecial">}{</span>-<span class="synConstant">1cm</span><span class="synSpecial">}</span> <span class="synStatement">\setlength</span><span class="synSpecial">{</span><span class="synStatement">\topmargin</span><span class="synSpecial">}{</span>-<span class="synConstant">2cm</span><span class="synSpecial">}</span> <span class="synStatement">\setlength</span><span class="synSpecial">{</span><span class="synStatement">\oddsidemargin</span><span class="synSpecial">}{</span><span class="synConstant">0cm</span><span class="synSpecial">}</span> <span class="synStatement">\setlength</span><span class="synSpecial">{</span><span class="synStatement">\evensidemargin</span><span class="synSpecial">}{</span><span class="synConstant">0cm</span><span class="synSpecial">}</span> </pre><p>こういう応急処置ではなく、<a href="http://zrbabbler.sp.land.to/xelatex.html">XeLaTeX &#x3067;&#x65E5;&#x672C;&#x8A9E;&#x3059;&#x308B;&#x4EF6;&#x306B;&#x3064;&#x3044;&#x3066; [&#x96FB;&#x8133;&#x4E16;&#x754C;&#x306E;&#x5965;&#x5E95;&#x306B;&#x3066;]</a>の"よりよい日本語<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C1%C8%C8%C7">組版</a>を目指して"のパッケージ群を使えば、日本語として見栄えのよい書類が出来るようです。</p> </div> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/tex">tex</a>例</h4> <ul> <li><a href="http://dl.dropbox.com/u/14499563/xetex/xetex-jp-example.pdf">http://dl.dropbox.com/u/14499563/xetex/xetex-jp-example.pdf</a></li> </ul><p>のソースが以下の<a class="keyword" href="http://d.hatena.ne.jp/keyword/tex">tex</a>です:</p><p><script src="https://gist.github.com/664195.js?file=xetex-jp-example.tex"></script><br /> </p> </div> <div class="section"> <h4>リソース</h4> <ul> <li><a href="http://tug.org/xetex/">XeTeX - TeX Users Group</a> (公式サイト)</li> <li><a href="http://miktex.org/">Home - MiKTeX.org</a></li> <li><a href="http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?XeTeX">XeTeX - TeX Wiki</a></li> <li><a href="https://forums.ubuntulinux.jp/viewtopic.php?id=9469">Ubuntu&#x65E5;&#x672C;&#x8A9E;&#x30D5;&#x30A9;&#x30FC;&#x30E9;&#x30E0; / xelatex &#x3067;&#x65E5;&#x672C;&#x8A9E;&#x3092;&#x304B;&#x304F;&#x4ED5;&#x65B9;</a></li> <li><a href="http://zrbabbler.sp.land.to/xelatex.html">XeLaTeX &#x3067;&#x65E5;&#x672C;&#x8A9E;&#x3059;&#x308B;&#x4EF6;&#x306B;&#x3064;&#x3044;&#x3066; [&#x96FB;&#x8133;&#x4E16;&#x754C;&#x306E;&#x5965;&#x5E95;&#x306B;&#x3066;]</a></li> <li><a href="http://ch10007.kitaguni.tv/e346935.html">http://ch10007.kitaguni.tv/e346935.html</a></li> </ul> </div> bellbind cygwin上でnodejsとnpmとCoffeeScriptなどをインストールする hatenablog://entry/17680117127042743962 2010-10-22T01:31:04+09:00 2019-04-17T19:51:25+09:00 (追記: nodejsのバージョンが0.2時代のやり方です。0.4.8でのやり方はnaveを使ったnode.jsインストールと、最近のnpmの使い方 - ラシウラに書きました)(まとめ)コマンドラインJavaScript環境nodejsと、そのパッケージマネージャnpmをいれ、npmからスクリプト言語CoffeeScriptを入れる手順です。CoffeeScriptというのは、rubyベースでpython風味を付け足したような文法のJavaScript環境で動く言語です。以下すべてWindow7 Home Premium x64上で行っています。nodejsのインストールの仕方は、Buildi… <p>(追記: nodejsのバージョンが0.2時代のやり方です。0.4.8でのやり方は<a href="http://d.hatena.ne.jp/bellbind/20110530/1306764093">nave&#x3092;&#x4F7F;&#x3063;&#x305F;node.js&#x30A4;&#x30F3;&#x30B9;&#x30C8;&#x30FC;&#x30EB;&#x3068;&#x3001;&#x6700;&#x8FD1;&#x306E;npm&#x306E;&#x4F7F;&#x3044;&#x65B9; - &#x30E9;&#x30B7;&#x30A6;&#x30E9;</a>に書きました)</p><p>(まとめ)<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%DE%A5%F3%A5%C9%A5%E9%A5%A4%A5%F3">コマンドライン</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>環境nodejsと、そのパッケージマネージャnpmをいれ、npmから<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8%B8%C0%B8%EC">スクリプト言語</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/CoffeeScript">CoffeeScript</a>を入れる手順です。<a class="keyword" href="http://d.hatena.ne.jp/keyword/CoffeeScript">CoffeeScript</a>というのは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>ベースで<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>風味を付け足したような文法の<a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a>環境で動く言語です。以下すべてWindow7 Home Premium x64上で行っています。</p><p>nodejsのインストールの仕方は、<a href="http://github.com/ry/node/wiki/Building-node.js-on-Cygwin-(Windows)">Building node.js on cygwin (windows) &middot; nodejs/node-v0.x-archive Wiki &middot; GitHub</a> にあり、結果的にこの手順で可能です。<br /> 注意点は以下:</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA">リポジトリ</a>のheadは<a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>対応出来ていなかった。最新リリースバージョン(0.2.3)は大丈夫</li> <li><span style="font-weight:bold;">pkg-configパッケージを入れるのを忘れない</span>(openssl等それを使う他パッケージの依存関係では入らない)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>.exeでDLLエラーが出る場合は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>を閉じたあと、スタートメニューの検索などからash.exeを開いてそこで"rebaseall"する</li> <li>nodejsからの通信で<span style="font-weight:bold;">/etc/resolv.confが必要</span>。<a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>上で、/etc/resolv.conf(nameserver 8.8.8.8)を作り、一旦<a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>をログアウトしてからnode.exeを実行する</li> </ul><p>make installで/usr/localを汚したくないので、以下のような配置にするようにしました</p> <ul> <li>~/.nodejs/bin/node.exe</li> <li>~/.nodejs/bin/npm</li> <li>~/.nodejs/share/man/...</li> <li>~/.node_libraries/...</li> </ul> <div class="section"> <h4>事前準備</h4> <p>最新版の<a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>で以下のパッケージ(とその依存パッケージ)を入れます</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>-g++</li> <li>make</li> <li>openssl</li> <li>openssl-devel</li> <li>pkg-config</li> <li>zlib-devel</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/curl">curl</a></li> </ul><p>(存在しなければ)/etc/resolv.conf(c:\<a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>\etc\resolv.conf)を作ります(これがないとnpmは動きません)</p> <pre class="code" data-lang="" data-unlink>nameserver 8.8.8.8 nameserver 8.8.4.4</pre> </div> <div class="section"> <h4>nodejsインストール</h4> <pre class="code lang-sh" data-lang="sh" data-unlink>curl <span class="synSpecial">-O</span> http://nodejs.org/dist/node-v0.2.3.tar.gz tar zxf node-v0.2.3.tar.gz <span class="synStatement">cd</span> node-v0.2.3 ./configure <span class="synSpecial">--prefix=~/.nodejs</span> make make install </pre><p>./configureの結果は、以下の出力になるはずです</p> <pre class="code" data-lang="" data-unlink>$ ./configure --prefix=~/.nodejs Checking for program g++ or c++ : /usr/bin/g++ Checking for program cpp : /usr/bin/cpp Checking for program ar : /usr/bin/ar Checking for program ranlib : /usr/bin/ranlib Checking for g++ : ok Checking for program gcc or cc : /usr/bin/gcc Checking for program ar : /usr/bin/ar Checking for program ranlib : /usr/bin/ranlib Checking for gcc : ok Checking for library dl : yes Checking for openssl : yes Checking for library rt : yes --- libeio --- Checking for library pthread : yes Checking for function pthread_create : yes Checking for function pthread_atfork : yes Checking for futimes(2) : yes Checking for readahead(2) : no Checking for fdatasync(2) : yes Checking for pread(2) and pwrite(2) : yes Checking for sendfile(2) : no Checking for sync_file_range(2) : no --- libev --- Checking for header sys/inotify.h : not found Checking for header sys/epoll.h : not found Checking for header port.h : not found Checking for header poll.h : yes Checking for function poll : yes Checking for header sys/event.h : not found Checking for header sys/queue.h : yes Checking for function kqueue : not found Checking for header sys/select.h : yes Checking for function select : yes Checking for header sys/eventfd.h : not found Checking for SYS_clock_gettime : no Checking for library rt : yes Checking for function clock_gettime : yes Checking for function nanosleep : yes Checking for function ceil : yes Checking for fdatasync(2) with c++ : yes &#39;configure&#39; finished successfully (21.674s)</pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>のpkg-configが入っていなければ、"Checking for openssl"がnoとなるでしょう。<br /> またconfigure実行中に、<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>.exeで"unable to remap 〜"といったDLLのエラーが出る場合があります。その場合は<a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>を閉じ、rebaseallコマンドをash上から実行すると治ります。</p><p>出来上がったnode.exeにPATHを通します。</p> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">export</span><span class="synIdentifier"> PATH=</span><span class="synPreProc">$PATH</span>:~/.nodejs/bin </pre><p>nodejs.orgのトップにあるexample.jsを実行して確認します。</p> </div> <div class="section"> <h4>npmインストール</h4> <p>(npmを入れるためには、nodejsから通信するために/etc/resolv.confが存在する必要があります。)<br /> まず、~/.npmrcを作成します。</p> <pre class="code" data-lang="" data-unlink>root = ~/.node_libraries binroot = ~/.nodejs/bin manroot = ~/.nodejs/share/man</pre><p>rootの~/.node_libraries/は、node.exeがデフォルトでモジュールを読み込むPATHです(0.3では~/.node_modulesも読み込むようになってます)。<br /> それ以外にnpm root置く場合、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%C4%B6%AD%CA%D1%BF%F4">環境変数</a>NODE_PATHでそこを指定する必要があります。</p><br /> <p>~/.npmrcをつくったら、以下のコマンドを実行します:</p> <pre class="code lang-sh" data-lang="sh" data-unlink>curl http://npmjs.org/install.sh | sh </pre><pre class="code lang-sh" data-lang="sh" data-unlink>npm list stable </pre><p>など実行し、npmコマンドの動作確認します。</p> </div> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/CoffeeScript">CoffeeScript</a>のインストールとexample実行</h4> <p>npmから<a class="keyword" href="http://d.hatena.ne.jp/keyword/CoffeeScript">CoffeeScript</a>インストール</p> <pre class="code lang-sh" data-lang="sh" data-unlink>npm install coffee-script </pre><p>coffeeコマンドなどがインストールされます。</p><p>以下のコードがnodejsのexample.jsの<a class="keyword" href="http://d.hatena.ne.jp/keyword/CoffeeScript">CoffeeScript</a>版example.coffeeとなります</p> <pre class="code" data-lang="" data-unlink>#!/usr/bin/env coffee http = require &#34;http&#34; server = http.createServer (req, res) -&gt; res.writeHead 200, {&#34;Content-Type&#34;: &#34;text/plain&#34;} res.end &#34;Hello World\n&#34; server.listen 8124, &#34;127.0.0.1&#34; console.log &#34;Server running at http://127.0.0.1:8124/&#34;</pre><p>実行は、</p> <pre class="code lang-sh" data-lang="sh" data-unlink>coffee example.coffee </pre> </div> <div class="section"> <h4>jisonインストールと利用</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/CoffeeScript">CoffeeScript</a>で使われてる、パーザーjisonを入れます。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>npm install jison </pre><p>jisonは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%DE%A5%F3%A5%C9%A5%E9%A5%A4%A5%F3">コマンドライン</a>から文法ファイルをJSに変換するパーザージェネレータですが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/JSON">JSON</a>形式の文法データを渡してパーザーとなるモジュールとしても使えるようにもなってます。</p><p>簡単な<a class="keyword" href="http://d.hatena.ne.jp/keyword/LISP">LISP</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%BF%A5%D7%A5%EA%A5%BF">インタプリタ</a>を、jisonをつかって<a class="keyword" href="http://d.hatena.ne.jp/keyword/CoffeeScript">CoffeeScript</a>(0.9.4)で書いたものが以下です:</p> <pre class="code lang-ruby" data-lang="ruby" data-unlink><span class="synPreProc">#!/usr/bin/env coffee</span> <span class="synComment"># for coffee 0.9.4</span> jison = <span class="synPreProc">require</span> <span class="synSpecial">&quot;</span><span class="synConstant">jison</span><span class="synSpecial">&quot;</span> grammar = <span class="synSpecial">&quot;</span><span class="synConstant">lex</span><span class="synSpecial">&quot;</span>: <span class="synSpecial">&quot;</span><span class="synConstant">rules</span><span class="synSpecial">&quot;</span>: [ [<span class="synSpecial">&quot;\\</span><span class="synConstant">s+</span><span class="synSpecial">&quot;</span>, <span class="synSpecial">&quot;&quot;</span>] [<span class="synSpecial">&quot;\\</span><span class="synConstant">(</span><span class="synSpecial">&quot;</span>, <span class="synSpecial">&quot;</span><span class="synConstant">return 'LPAREN'</span><span class="synSpecial">&quot;</span>] [<span class="synSpecial">&quot;\\</span><span class="synConstant">)</span><span class="synSpecial">&quot;</span>, <span class="synSpecial">&quot;</span><span class="synConstant">return 'RPAREN'</span><span class="synSpecial">&quot;</span>] [<span class="synSpecial">&quot;\\</span><span class="synConstant">d+</span><span class="synSpecial">&quot;</span>, <span class="synSpecial">&quot;</span><span class="synConstant">return 'NUMBER'</span><span class="synSpecial">&quot;</span>] [<span class="synSpecial">&quot;</span><span class="synConstant">[^</span><span class="synSpecial">\\</span><span class="synConstant">s</span><span class="synSpecial">\\</span><span class="synConstant">(</span><span class="synSpecial">\\</span><span class="synConstant">)]+</span><span class="synSpecial">&quot;</span>, <span class="synSpecial">&quot;</span><span class="synConstant">return 'SYMBOL'</span><span class="synSpecial">&quot;</span>] [<span class="synSpecial">&quot;</span><span class="synConstant">$</span><span class="synSpecial">&quot;</span>, <span class="synSpecial">&quot;</span><span class="synConstant">return 'EOF'</span><span class="synSpecial">&quot;</span>] ] <span class="synSpecial">&quot;</span><span class="synConstant">bnf</span><span class="synSpecial">&quot;</span>: <span class="synSpecial">&quot;</span><span class="synConstant">program</span><span class="synSpecial">&quot;</span>: [ [<span class="synSpecial">&quot;</span><span class="synConstant">exprs EOF</span><span class="synSpecial">&quot;</span>, <span class="synSpecial">&quot;</span><span class="synConstant">return $1</span><span class="synSpecial">&quot;</span>] ] <span class="synSpecial">&quot;</span><span class="synConstant">expr</span><span class="synSpecial">&quot;</span>: [ [<span class="synSpecial">&quot;</span><span class="synConstant">NUMBER</span><span class="synSpecial">&quot;</span>, <span class="synSpecial">&quot;</span><span class="synConstant">$$ = parseInt(yytext)</span><span class="synSpecial">&quot;</span>] [<span class="synSpecial">&quot;</span><span class="synConstant">SYMBOL</span><span class="synSpecial">&quot;</span>, <span class="synSpecial">&quot;</span><span class="synConstant">$$ = yytext</span><span class="synSpecial">&quot;</span>] [<span class="synSpecial">&quot;</span><span class="synConstant">LPAREN exprs RPAREN</span><span class="synSpecial">&quot;</span>, <span class="synSpecial">&quot;</span><span class="synConstant">$$ = $2</span><span class="synSpecial">&quot;</span>] ] <span class="synSpecial">&quot;</span><span class="synConstant">exprs</span><span class="synSpecial">&quot;</span>: [ [<span class="synSpecial">&quot;</span><span class="synConstant">expr</span><span class="synSpecial">&quot;</span>, <span class="synSpecial">&quot;</span><span class="synConstant">$$ = [$1]</span><span class="synSpecial">&quot;</span>], [<span class="synSpecial">&quot;</span><span class="synConstant">expr exprs</span><span class="synSpecial">&quot;</span>, <span class="synSpecial">&quot;</span><span class="synConstant">$$ = [$1].concat($2)</span><span class="synSpecial">&quot;</span>] ] lparser = new jison.Parser grammar lget = (env, name) -&gt; <span class="synStatement">return</span> env[name] <span class="synStatement">if</span> name of env <span class="synStatement">return</span> lget(env.__parent__, name) <span class="synStatement">if</span> <span class="synSpecial">&quot;</span><span class="synConstant">__parent__</span><span class="synSpecial">&quot;</span> of env undefined leval = (env, expr) -&gt; switch typeof expr when <span class="synSpecial">&quot;</span><span class="synConstant">number</span><span class="synSpecial">&quot;</span> then expr when <span class="synSpecial">&quot;</span><span class="synConstant">string</span><span class="synSpecial">&quot;</span> then lget env, expr when <span class="synSpecial">&quot;</span><span class="synConstant">object</span><span class="synSpecial">&quot;</span> switch expr[<span class="synConstant">0</span>] when <span class="synSpecial">&quot;</span><span class="synConstant">define</span><span class="synSpecial">&quot;</span> name = expr[<span class="synConstant">1</span>] value = leval env, expr[<span class="synConstant">2</span>] env[name] = value when <span class="synSpecial">&quot;</span><span class="synConstant">quote</span><span class="synSpecial">&quot;</span> then expr[<span class="synConstant">1</span>] when <span class="synSpecial">&quot;</span><span class="synConstant">lambda</span><span class="synSpecial">&quot;</span> parent = env params = expr[<span class="synConstant">1</span>] body = expr[<span class="synConstant">2</span>] -&gt; frame = {} <span class="synStatement">for</span> i <span class="synStatement">in</span> [<span class="synConstant">0</span>...params.length] frame[params[i]] = arguments[i] frame.__parent__ = parent leval frame, body else [func, args...] = leval(env, e) <span class="synStatement">for</span> e <span class="synStatement">in</span> expr func args... run = (env, code) -&gt; trees = lparser.parse code <span class="synComment">#console.log trees</span> <span class="synStatement">for</span> tree <span class="synStatement">in</span> trees leval env, tree top = <span class="synSpecial">&quot;</span><span class="synConstant">+</span><span class="synSpecial">&quot;</span>: (params...) -&gt; params.reduce ((a, b) -&gt; a + b), <span class="synConstant">0</span> <span class="synSpecial">&quot;</span><span class="synConstant">*</span><span class="synSpecial">&quot;</span>: (params...) -&gt; params.reduce ((a, b) -&gt; a * b), <span class="synConstant">1</span> <span class="synSpecial">&quot;</span><span class="synConstant">write</span><span class="synSpecial">&quot;</span>: console.log <span class="synComment"># examples</span> run top, <span class="synSpecial">&quot;</span><span class="synConstant">(write (+ 10 20))</span><span class="synSpecial">&quot;</span> run top, <span class="synSpecial">&quot;</span><span class="synConstant">(define sq (lambda (a) (* a a)))</span><span class="synSpecial">&quot;</span> run top, <span class="synSpecial">&quot;</span><span class="synConstant">(write (sq 5))</span><span class="synSpecial">&quot;</span> </pre><p>(<a class="keyword" href="http://d.hatena.ne.jp/keyword/ubuntu">ubuntu</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/maverick">maverick</a>にもnodejsや<a class="keyword" href="http://d.hatena.ne.jp/keyword/coffeescript">coffeescript</a>パッケージがあるのですが、バージョンが古いのでこのコードは解釈できないでしょう)</p> </div> <div class="section"> <h4>リソース</h4> <ul> <li><a href="http://www.cygwin.com/">Cygwin</a></li> <li><a href="http://nodejs.org/">Node.js</a></li> <li><a href="http://github.com/ry/node/wiki/Building-node.js-on-Cygwin-(Windows)">Building node.js on cygwin (windows) &middot; nodejs/node-v0.x-archive Wiki &middot; GitHub</a></li> <li><a href="http://www.google.co.jp/search?hl=ja&safe=off&q=cygwin+rebaseall&aq=f&aqi=g1&aql=&oq=&gs_rfai=">cygwin rebaseall - Google &#x691C;&#x7D22;</a></li> <li><a href="http://npmjs.org/">npm | the &#x2764; of the modern development community</a></li> <li><a href="http://jashkenas.github.com/coffee-script/">http://jashkenas.github.com/coffee-script/</a></li> <li><a href="http://github.com/zaach/jison">GitHub - zaach/jison: Bison in JavaScript.</a></li> </ul> </div> bellbind ubuntuパッケージをlaunchpad ppaで公開する方法 hatenablog://entry/17680117127042745064 2010-09-18T12:15:08+09:00 2019-04-17T19:51:37+09:00 以前から、バイナリパッケージであるpython-simplexqueryをlaunchpadの自分のPPA(private package archive)上に置いています。 https://launchpad.net/~bellbind/+archive/python-simplexquery PPAを作ることで、ユーザーがソースパッケージをアップロードすると、launchpad上で各アーキテクチャ用のバイナリパッケージをビルドし、aptでインストール可能にしてくれます。 PPAでビルドが成功したら、以下のようにubuntu上で利用する事が可能になります(ユーザーbellbindでPPA名p… <p>以前から、バイナリパッケージである<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-simplexqueryをlaunchpadの自分のPPA(private package archive)上に置いています。</p> <ul> <li><a href="https://launchpad.net/~bellbind/+archive/python-simplexquery">https://launchpad.net/~bellbind/+archive/python-simplexquery</a></li> </ul><p>PPAを作ることで、ユーザーがソースパッケージをアップロードすると、launchpad上で各<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>用のバイナリパッケージをビルドし、aptでインストール可能にしてくれます。<br /> PPAでビルドが成功したら、以下のように<a class="keyword" href="http://d.hatena.ne.jp/keyword/ubuntu">ubuntu</a>上で利用する事が可能になります(ユーザーbellbindでPPA名<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-simplexqueryを作り、<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-simplexqueryの<a class="keyword" href="http://d.hatena.ne.jp/keyword/deb">deb</a>を公開した場合)。</p> <pre class="code lang-sh" data-lang="sh" data-unlink>sudo apt-add-repository ppa:bellbind/python-simplexquery apt-get update apt-get install python-simplexquery </pre><p>PPAの作り方は以下の記事(の2ページ目)が一番分かりやすいでしょう</p> <ul> <li><a href="http://gihyo.jp/admin/serial/01/ubuntu-recipe/0046?page=2&skip">&#x7B2C;46&#x56DE; PPA&#x306E;&#x6D3B;&#x7528;&#xFF1A;Ubuntu Weekly Recipe&#xFF5C;gihyo.jp &hellip; &#x6280;&#x8853;&#x8A55;&#x8AD6;&#x793E;</a></li> </ul><p>しかしPPA作成前に一度行う必要があるgpg鍵生成登録やCoCについて紛らわしい箇所があるので補足しておきます。</p> <ul> <li>gpgコマンドについて <ul> <li>gpg --gen-keyでの重要な点は、<b>launchpadに登録したメールアドレス</b>で鍵を生成すること</li> <li>gpg --gen-keyで鍵のオプションの選択がある。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%EB%A5%B4%A5%EA%A5%BA%A5%E0">アルゴリズム</a>や有効期限などのオプションは(DSA署名専用1yなど)デフォルトでよいです。<b><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D1%A5%B9%A5%D5%A5%EC%A1%BC%A5%BA">パスフレーズ</a>は付けておく</b>こと。</li> <li>gpg --list-keysで生成した鍵一覧が見れる。gpg --send-keyで送る鍵は、uidが上記のメアドである鍵を使う</li> <li>gpg --send-keyで指定する鍵IDは、"972DB0DC"のような形式です。</li> <li>gpg --send-keyで送ったあと、自分のlaunchpadアカウントの"OpenPGP keys"にfingerprintを追加します。</li> </ul></li> <li>さらに"Signed <a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a> Code of Conduct"を有効にする必要があります。 <ul> <li><b>OpenPGP keysにfingerprintを追加しただけでは、 パッケージをppaに登録できません</b>。CoCがyesになって初めてパッケージ登録が可能になります。</li> <li>HTML上で署名するCoCバージョンは記事上では1.0.1ですが、今は1.1です。</li> <li>いまはCoC署名はファイルダウンロードではなく、ブラウザ上で該当部分をコピペしてファイルを作りそれをgpgで署名し、署名した全体をコピペしてブラウザでアップします。ターミナルを使っている場合、空白や改行が変わらないように注意します。</li> </ul></li> </ul> <div class="section"> <h4>ソースパッケージのPPAアップロード手順</h4> <p>基本的に"debuild -uc -us"できちんとエラーやlintian警告なしでバイナリパッケージが作れていることが前提です。(ちなみに、<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>用<a class="keyword" href="http://d.hatena.ne.jp/keyword/deb">deb</a>パッケージの作り方は、<a href="http://d.hatena.ne.jp/bellbind/20100728/1280334070">python3&#x7528;&#x3068;python2&#x7528;&#x306E;multiple&#x306A;deb&#x30D1;&#x30C3;&#x30B1;&#x30FC;&#x30B8;&#x3092;&#x4F5C;&#x308B;ubuntu&#x30D1;&#x30C3;&#x30B1;&#x30FC;&#x30B8;&#x306E;&#x4F5C;&#x308A;&#x65B9; - &#x30E9;&#x30B7;&#x30A6;&#x30E9;</a>に書きました。<a href="http://github.com/bellbind/python-simplexquery">http://github.com/bellbind/python-simplexquery</a> 中の<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/* は<a class="keyword" href="http://d.hatena.ne.jp/keyword/maverick">maverick</a>用のパッケージ記述になっています)</p><p>毎回のソースパッケージアップロードで行うのは、以下のようにdebuildとdputの2コマンドだけです(<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-simplexquery-1.0.5-0nmu1ppa2例):</p> <pre class="code lang-sh" data-lang="sh" data-unlink><span class="synStatement">cd</span> python-simplexquery-1.0.5.1 debuild <span class="synSpecial">-S</span> <span class="synSpecial">-sa</span> <span class="synStatement">cd</span> .. dput ppa:bellbind/python-simplexquery python-simplexquery_1.0.5.1-0nmu1ppa2_source.changes </pre><p>dputでppa名をフルに指定すれば上記記事上にある~/.dput.rcは不要です。</p><p>またPPAアップロードでも注意点は幾つかあります。</p> <ul> <li>パッケージのバージョンには、"1.0.5.1-0nmu1ppa1"など<b>メンテナーバージョン中に"ppa"という文字列が入る必要があります</b>。</li> <li>パッケージを署名してない、署名が違う、CoCをyesにしていない、などミスがあるとdputで失敗した旨のエラーメールで送られてきます。</li> <li>launchpad上のビルドは、ビルドマシン待ち時間とビルド時間の双方でそれなりに時間がかかります(速くても1時間ほど、長くて半日)。アップする前にパッケージを十分チェックしておきましょう。 <ul> <li>特に<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/control中の"Build-Depends"と"Depends"は記述漏れがないように注意する</li> </ul></li> <li>ソース<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AB%A5%A4%A5%D6">アーカイブ</a>(XXX_A.B.C.orig.tar.gzなど)は一度dputでアップすると、同じファイル名でつくり直してdputしても更新されません。 <ul> <li>ソースを変えたい場合は、圧縮形式を変える(tar.bz2にするなど)か、バージョンを上げるかしたほうがいいでしょう。</li> </ul></li> </ul> </div> <div class="section"> <h4>リソース</h4> <ul> <li><a href="http://gihyo.jp/admin/serial/01/ubuntu-recipe/0046">&#x7B2C;46&#x56DE; PPA&#x306E;&#x6D3B;&#x7528;&#xFF1A;Ubuntu Weekly Recipe&#xFF5C;gihyo.jp &hellip; &#x6280;&#x8853;&#x8A55;&#x8AD6;&#x793E;</a></li> <li><a href="https://help.launchpad.net/Packaging/PPA/BuildingASourcePackage">Packaging/PPA/BuildingASourcePackage - Launchpad Help</a></li> </ul> </div> bellbind ACER AspireOne 753購入 hatenablog://entry/17680117127042745538 2010-08-21T01:14:45+09:00 2019-04-17T19:51:43+09:00 去年はASUSだったので、今年はACERということで、49800円のときに2GBのDDR3メモリとともに AO753をamazonで購入しました。acer Aspire one AO753-N32C S ノートPC11.6インチWXGA Celeron U3400 Windows 7 Home Premium 64bit シルバー AO753-N32C/S出版社/メーカー: 日本エイサー発売日: 2010/07/02メディア: Personal Computers購入: 2人 クリック: 457回この商品を含むブログ (4件) を見るBUFFALO ノート用増設メモリ PC3-8500(DDR… <p>去年は<a class="keyword" href="http://d.hatena.ne.jp/keyword/ASUS">ASUS</a>だったので、今年は<a class="keyword" href="http://d.hatena.ne.jp/keyword/ACER">ACER</a>ということで、49800円のときに2GBのDDR3メモリとともに AO753を<a class="keyword" href="http://d.hatena.ne.jp/keyword/amazon">amazon</a>で購入しました。<div class="hatena-asin-detail"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B003U9VJ94/bellbind-22/"><img src="https://images-fe.ssl-images-amazon.com/images/I/3141Mjnb8-L._SL160_.jpg" class="hatena-asin-detail-image" alt="acer Aspire one AO753-N32C S ノートPC11.6インチWXGA Celeron U3400 Windows 7 Home Premium 64bit シルバー AO753-N32C/S" title="acer Aspire one AO753-N32C S ノートPC11.6インチWXGA Celeron U3400 Windows 7 Home Premium 64bit シルバー AO753-N32C/S"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B003U9VJ94/bellbind-22/">acer Aspire one AO753-N32C S ノートPC11.6インチWXGA Celeron U3400 Windows 7 Home Premium 64bit シルバー AO753-N32C/S</a></p><ul><li><span class="hatena-asin-detail-label">出版社/メーカー:</span> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C6%FC%CB%DC%A5%A8%A5%A4%A5%B5%A1%BC">日本エイサー</a></li><li><span class="hatena-asin-detail-label">発売日:</span> 2010/07/02</li><li><span class="hatena-asin-detail-label">メディア:</span> Personal Computers</li><li><span class="hatena-asin-detail-label">購入</span>: 2人 <span class="hatena-asin-detail-label">クリック</span>: 457回</li><li><a href="http://d.hatena.ne.jp/asin/B003U9VJ94/bellbind-22" target="_blank">この商品を含むブログ (4件) を見る</a></li></ul></div><div class="hatena-asin-detail-foot"></div></div><div class="hatena-asin-detail"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B002ZNKDRU/bellbind-22/"><img src="https://images-fe.ssl-images-amazon.com/images/I/5173wgQJhhL._SL160_.jpg" class="hatena-asin-detail-image" alt="BUFFALO ノート用増設メモリ PC3-8500(DDR3-1066) 2GB D3N1066-2G/E" title="BUFFALO ノート用増設メモリ PC3-8500(DDR3-1066) 2GB D3N1066-2G/E"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B002ZNKDRU/bellbind-22/">BUFFALO ノート用増設メモリ PC3-8500(DDR3-1066) 2GB D3N1066-2G/E</a></p><ul><li><span class="hatena-asin-detail-label">出版社/メーカー:</span> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%C3%A5%D5%A5%A1%A5%ED%A1%BC">バッファロー</a></li><li><span class="hatena-asin-detail-label">発売日:</span> 2009/12/11</li><li><span class="hatena-asin-detail-label">メディア:</span> Personal Computers</li><li><span class="hatena-asin-detail-label">購入</span>: 44人 <span class="hatena-asin-detail-label">クリック</span>: 441回</li><li><a href="http://d.hatena.ne.jp/asin/B002ZNKDRU/bellbind-22" target="_blank">この商品を含むブログ (11件) を見る</a></li></ul></div><div class="hatena-asin-detail-foot"></div></div></p><p>届いて<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B3%AB%C9%F5">開封</a>してみると、<b>メモリスロットカバーのネジに保障封印</b>がしてありました。ちょっと迷ったけど、保障なんて受けたことないしいいやと思い封印を破りメモリ増設しました。そのカバーには、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>のライセンスシールの中央の上あたりに爪もついているので、ネジを緩めるだけでははがれず、つめをはずすのに苦労しました。</p><p>メモリ増設後のパフォーマンス エクス<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DA%A5%EA%A5%A8">ペリエ</a>ンスインデックスは以下のとおりです。<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20100821235409" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20100821/20100821235409.png" alt="f:id:bellbind:20100821235409p:image" title="f:id:bellbind:20100821235409p:image" class="hatena-fotolife" itemprop="image"></a></span></p><p>1世代前である<a class="keyword" href="http://d.hatena.ne.jp/keyword/Celeron">Celeron</a> U2300機で、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D0%A1%BC%A5%AF%A5%ED%A5%C3%A5%AF">オーバークロック</a>済みのUL20Aのパフォーマンスインデックスは<a href="http://d.hatena.ne.jp/bellbind/20091118/1258549543">ASUS UL20A&#x5C4A;&#x3044;&#x305F; - &#x30E9;&#x30B7;&#x30A6;&#x30E9;</a>にあるとおりですが、ベースとしてみれば<a class="keyword" href="http://d.hatena.ne.jp/keyword/Celeron">Celeron</a> U3400機は、旧<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>にくらべ全体的にパフォーマンスがあがっているようです。</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/ASUS">ASUS</a>との比較をすると、<a class="keyword" href="http://d.hatena.ne.jp/keyword/ACER">ACER</a>よりも<a class="keyword" href="http://d.hatena.ne.jp/keyword/ASUS">ASUS</a>のほうが評価は上です。というのもメモリ増設の封印してあるのは、はっきりいってほかの評価をどうでもよくするほどのマイナス評価です。<a class="keyword" href="http://d.hatena.ne.jp/keyword/ASUS">ASUS</a>はほかにも<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D0%A1%BC%A5%AF%A5%ED%A5%C3%A5%AF">オーバークロック</a>できたりするのもプラスです。逆に<a class="keyword" href="http://d.hatena.ne.jp/keyword/ACER">ACER</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/BIOS">BIOS</a>はほとんど何もできません。</p><p>つくりも若干安っぽく、ACアダプタは立体的だし、キーボードはぺこぺこさがあるし、液晶背面も貧弱で背面でも指でつかむと画面がすぐへこみますし、スピーカーもUL20Aのほうが音がよいです。とはいえ、これは<a class="keyword" href="http://d.hatena.ne.jp/keyword/ASUS">ASUS</a>のが値段のわりにすばらしいのだと思ったほうがいいでしょう。あと無駄なプレインストール体験版も<a class="keyword" href="http://d.hatena.ne.jp/keyword/ASUS">ASUS</a>にくらべ多いです。</p><p>一方、<a class="keyword" href="http://d.hatena.ne.jp/keyword/ACER">ACER</a>機のいい面は小ささと軽さ、キーボードのPageUp PageDownが独立キーになっている、タッチパネルの左右クリックボタンが分離している点(押すのに力が要らない、同時押しがしやすい)、運搬用ケースがついてる、というデザイン面でしょうでしょうか。</p><br /> <p>今見ると<a class="keyword" href="http://d.hatena.ne.jp/keyword/Amazon">Amazon</a>での値段も値上がりしたようなので、<a class="keyword" href="http://d.hatena.ne.jp/keyword/ASUS">ASUS</a>のUL20FTのほうがいいかもしれません。<div class="hatena-asin-detail"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B003VM7N04/bellbind-22/"><img src="https://images-fe.ssl-images-amazon.com/images/I/41KQ%2BxgAziL._SL160_.jpg" class="hatena-asin-detail-image" alt="ASUS UL20FT 12.1型ワイド ノートPC Office無 Windows7搭載 シルバー UL20FT-2X034V" title="ASUS UL20FT 12.1型ワイド ノートPC Office無 Windows7搭載 シルバー UL20FT-2X034V"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B003VM7N04/bellbind-22/">ASUS UL20FT 12.1型ワイド ノートPC Office無 Windows7搭載 シルバー UL20FT-2X034V</a></p><ul><li><span class="hatena-asin-detail-label">出版社/メーカー:</span> <a class="keyword" href="http://d.hatena.ne.jp/keyword/Asustek">Asustek</a></li><li><span class="hatena-asin-detail-label">発売日:</span> 2010/07/17</li><li><span class="hatena-asin-detail-label">メディア:</span> Personal Computers</li><li><span class="hatena-asin-detail-label">購入</span>: 2人 <span class="hatena-asin-detail-label">クリック</span>: 795回</li><li><a href="http://d.hatena.ne.jp/asin/B003VM7N04/bellbind-22" target="_blank">この商品を含むブログ (3件) を見る</a></li></ul></div><div class="hatena-asin-detail-foot"></div></div></p> bellbind Python 2.6以降で作ったコードを 2.5へ対応するときに引っかかる点 hatenablog://entry/17680117127042745904 2010-08-07T06:08:33+09:00 2019-04-17T19:51:48+09:00 python-specfor · PyPI を作るとき、Python2.6と3.1を中心に書いてました。 これを2.5にも対応させたのですが、そのときその差が意外と大きかったのが新鮮だったのでメモ。 該コミットの一つ with文 2.5では、with文を有効にするには、そのファイルで__future__指定する必要があります。 from __future__ import with_statement これは今回の中で一番分かりやすかった違いですが、specfor自体がwith文を使わせるものであるため、そこそこ多くのファイルに埋めこむことになりました。 namedtuple collecti… <p><a href="http://pypi.python.org/pypi/python-specfor">python-specfor &middot; PyPI</a> を作るとき、Python2.6と3.1を中心に書いてました。<br /> これを2.5にも対応させたのですが、そのときその差が意外と大きかったのが新鮮だったのでメモ。</p> <ul> <li><a href="http://github.com/bellbind/python-specfor/commit/465938e786575ebf04e14afd1cbb7e2caff22736">&#x8A72;&#x30B3;&#x30DF;&#x30C3;&#x30C8;&#x306E;&#x4E00;&#x3064;</a></li> </ul> <div class="section"> <h4>with文</h4> <p>2.5では、with文を有効にするには、そのファイルで__future__指定する必要があります。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> __future__ <span class="synPreProc">import</span> with_statement </pre><p>これは今回の中で一番分かりやすかった違いですが、specfor自体がwith文を使わせるものであるため、そこそこ多くのファイルに埋めこむことになりました。</p> </div> <div class="section"> <h4>namedtuple</h4> <p>collections.namedtupleも2.6からの機能です。<br /> 自らはnamedtuple型を定義しなかったのですが、標準モジュールのほうで結構使っていて、それに依存したコードがありました。</p> <div class="section"> <h5>対策A: 代入時tuple展開</h5> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># difflib.SequenceMatcher.get_matching_blocks()の戻り値 macthesにて</span> <span class="synStatement">for</span> match <span class="synStatement">in</span> matches: vindex = match.a + match.size </pre><p>を以下のようにする<br /> <br /> </p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># difflib.SequenceMatcher.get_matching_blocks()の戻り値 macthesにて</span> <span class="synStatement">for</span> a, b, size <span class="synStatement">in</span> matches: vindex = a + size </pre> </div> <div class="section"> <h5>対策B: classを作る</h5> <p>matchはループ中でのみ使うものだったので、展開するのが楽です。<br /> しかし、tupleを持ち運んで使っている場合もあって、その場合には、同じインタフェースを持ったclassを作成しました。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synStatement">class</span> <span class="synIdentifier">funcspec</span>(<span class="synIdentifier">object</span>): <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self, argspec): self.args, self.varargs, self.keywords, self.defaults = argspec <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">def</span> <span class="synIdentifier">getargspec</span>(func): <span class="synPreProc">import</span> inspect <span class="synStatement">return</span> funcspec(inspect.getargspec(func)) </pre><p>argspecがnamedtupleですが、それをfuncspecクラスで同じ名前のメンバーとなるよう調整しています。</p> </div> </div> <div class="section"> <h4>相対import</h4> <p>python2.5は2.6以降にくらべ、相対importの能力が低いです。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> .framework <span class="synPreProc">import</span> * <span class="synComment"># 2.5ではここで*は使えない。</span> </pre><pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># 2.5の場合、__main__モジュールでは、-mオプション経由の起動でも、相対importが使えない</span> <span class="synPreProc">from</span> . <span class="synPreProc">import</span> version <span class="synStatement">def</span> <span class="synIdentifier">main</span>(): ... <span class="synStatement">if</span> __name__ == <span class="synConstant">&quot;__main__&quot;</span>: main() </pre><p>これは、以下のように対策しました</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> .framework <span class="synPreProc">import</span> spec <span class="synComment"># 個別の名前で指定する</span> </pre><pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># main内で、絶対importを使う</span> <span class="synStatement">def</span> <span class="synIdentifier">main</span>(): <span class="synPreProc">from</span> specfor <span class="synPreProc">import</span> version ... <span class="synStatement">if</span> __name__ == <span class="synConstant">&quot;__main__&quot;</span>: main() </pre> </div> bellbind python3用とpython2用のmultipleなdebパッケージを作るubuntuパッケージの作り方 hatenablog://entry/17680117127042746171 2010-07-28T01:21:10+09:00 2019-04-17T19:51:52+09:00 debパッケージの作るのにはdebianディレクトリ以下の記述ファイルが多く必要で、その管理のためにコマンドやツールを多用したりするため、(rpmのspec作成がコピペから始められるのに比べると、)最初のものを用意するまでに多くの知識を得る必要があります。 そして、pythonパッケージを作る、python2系だけじゃなくpython3系でも使えるようにするパッケージの作るための情報というのは特に少なく、他の構成でのやり方をいろいろ試していきながらうまくいく方法を得ました。 この記事では、python-helloソースから、python2系用のpython-helloパッケージと、python… <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/deb">deb</a>パッケージの作るのには<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リ以下の記述ファイルが多く必要で、その管理のためにコマンドやツールを多用したりするため、(<a class="keyword" href="http://d.hatena.ne.jp/keyword/rpm">rpm</a>のspec作成がコピペから始められるのに比べると、)最初のものを用意するまでに多くの知識を得る必要があります。<br /> そして、<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>パッケージを作る、python2系だけじゃなくpython3系でも使えるようにするパッケージの作るための情報というのは特に少なく、他の構成でのやり方をいろいろ試していきながらうまくいく方法を得ました。<br /> この記事では、<b><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-helloソースから、python2系用の<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-helloパッケージと、python3系用のpython3-helloパッケージを同時に作成する</b>ことを想定したもので、応用可能な方法を記述していきます。</p> <div class="section"> <h4>パッケージ対象</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/deb">deb</a>の元となるパッケージは、<b>python2でもpython3でも、同一のsetup.pyでbuild/installできる<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>パッケージ</b>である必要があります。</p><p>こうになっていればpure <a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>モジュールでも、dllモジュールでも基本は同じやり方で<a class="keyword" href="http://d.hatena.ne.jp/keyword/deb">deb</a>パッケージ化できます。</p> </div> <div class="section"> <h4>例題: <a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-helloの<a class="keyword" href="http://d.hatena.ne.jp/keyword/deb">deb</a>パッケージ化</h4> <p>以下のような簡単な3ファイルだけで構成された<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>パッケージを例に、<a class="keyword" href="http://d.hatena.ne.jp/keyword/deb">deb</a>の作り方を説明します。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello/hello.py</li> </ul><pre class="code lang-python" data-lang="python" data-unlink><span class="synStatement">def</span> <span class="synIdentifier">world</span>(): <span class="synStatement">return</span> <span class="synConstant">&quot;Hello World!&quot;</span> </pre> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello/setup.py</li> </ul><pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> distutils.core <span class="synPreProc">import</span> setup setup( name=<span class="synConstant">&quot;hello&quot;</span>, version=<span class="synConstant">&quot;1.0.0&quot;</span>, py_modules=[<span class="synConstant">&quot;hello&quot;</span>], ) </pre> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello/README.txt</li> </ul><pre class="code" data-lang="" data-unlink>module example: hello</pre> </div> <div class="section"> <h4>dh_makeによる<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リ雛形作成</h4> <p>まず<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リ名をpackagename-versionとなるように変更し、その中で<b>dh_make</b>します。</p> <pre class="code" data-lang="" data-unlink>mv python-hello python-hello-1.0.0 cd python-hello-1.0.0 dh_make --createorig -b -c bsd rm debian/*.ex debian/*.EX rm debian/docs rm debian/README.source</pre><p>(以下、このカレント<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リから、すべてコマンドを実行していきます)</p><p>man dh_makeで出てくるオプションをつけることで、例えば"-c <a class="keyword" href="http://d.hatena.ne.jp/keyword/bsd">bsd</a>"とすることでライセンス情報なども含んだ雛形が作れます。<br /> dh_makeをすると、いっぱいファイルが出来ますが、生成されるファイルのうち*.exや*.EXは追加処理用のテンプレートであり、不要なので全部消します。docsファイルもmultipleパッケージでは、バイナリパッケージごとに用意することになるので消します。<br /> また、<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/README.sourceも特に書く事がないのであれば消します。すると、以下のファイルだけが残ることになります。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/README.<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/copyright</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/compat</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/changelog">changelog</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/control</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/rules</li> </ul><p>以下これらのファイルが適切なものになるよう編集していくことになります。</p><p>まず、<b><a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/README.<a class="keyword" href="http://d.hatena.ne.jp/keyword/Debian">Debian</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/copyrightを適切に編集します</b>。"<"と">"で括られた箇所は何か書けと書いてある部分であり、そこを埋めるか削るかします。</p><p>comaptファイルは、この<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リ下ファイルの仕様バージョン(debhelperのバージョン)です。ふつうそのままでOKです。</p> </div> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/changelog">changelog</a> の編集</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/changelog">changelog</a>ファイルは生成バイナリパッケージのバージョン情報となるので、適切に編集していく必要があります。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/changelog">changelog</a>を編集するためのコマンド<b>dch</b>があるので、それを使うのがいいでしょう。</p><p>最初の<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/changelog">changelog</a>を編集します。</p> <pre class="code" data-lang="" data-unlink>dch -v 1.0.0-1nmu1</pre><p>このコマンドでは、雛形が埋められてエディタが立ち上がります。そのまま編集してから、保存終了させます。<a class="keyword" href="http://d.hatena.ne.jp/keyword/changelog">changelog</a>エントリは、たとえば以下のように書きます。</p> <pre class="code" data-lang="" data-unlink>python-hello (1.0.0-1nmu1) lucid; urgency=low * packaging for ubuntu -- bellbind &lt;bellbind@gmail.com&gt; Wed, 28 Jul 2010 23:58:57 +0900</pre><p>"<a class="keyword" href="http://d.hatena.ne.jp/keyword/nmu">nmu</a>"とはNone Maintainers Updateの略で、野良パッケージではこれをパッケージバージョンに入れておけば、チェックでいろいろ警告がでるのを抑えることができます。</p> </div> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/rules の編集</h4> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/rulesは、本来ビルドやインストールの方法を書くファイルです。</p><p>標準では以下の3行にします。</p> <pre class="code makefile" data-lang="makefile" data-unlink>#!/usr/bin/make -f %: dh $@</pre><p><br /> <s><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>パッケージで、setup.pyが使える場合、<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/rulesは以下の五行にしておけば良いです。</p> <pre class="code makefile" data-lang="makefile" data-unlink>#!/usr/bin/make -f DEB_PYTHON_SYSTEM=pysupport include /usr/share/cdbs/1/rules/debhelper.mk include /usr/share/cdbs/1/class/python-distutils.mk DEB_COMPRESS_EXCLUDE := .py</pre><p></s></p><p></p> </div> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/control の編集</h4> <p>このファイルには、ソースパッケージとバイナリパッケージの説明や依存関係等の情報を記述します。<br /> このソースパッケージの情報をもとにビルドし、インストール時は、その下のバイナリパッケージの情報に基づいて管理されます。</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-helloのcontrolファイルの全体を書いておきます。<br /> このファイルだけは、パッケージ化する<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>モジュールがpure <a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>だけか、native moduleを含むかで若干記述が変わるので、両方載せておきます。</p> <div class="section"> <h5>pure <a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a> module用 <a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/control</h5> <pre class="code lang-mail" data-lang="mail" data-unlink>Source: python-hello Section: python Priority: extra Maintainer: bellbind &lt;<span class="synSpecial">bellbind@gmail.com</span>&gt; Build-Depends: debhelper (&gt;= 7), python-support, python-setuptools, python3-setuptools Standards-Version: 3.8.4 XS-Python-Version: 2.6, 3.1 Homepage: <span class="synConstant">http://example.com/python-hello</span> Package: python-hello Architecture: all Depends: ${shlibs:Depends}, ${misc:Depends}, python Description: Example python module pakage Usage: . import hello print(hello.world()) . Package: python3-hello Architecture: all Depends: ${shlibs:Depends}, ${misc:Depends}, python3 Description: Example python module pakage Usage: . import hello print(hello.world()) . </pre><p>重要なポイントは、<b>XS-<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>-Versionにpython2とpython3の両方のバージョンを書く</b>ことです。Build-DependsとDependsも適切なものを指定する必要があります。</p> </div> <div class="section"> <h5>native module用<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/control</h5> <pre class="code lang-mail" data-lang="mail" data-unlink>Source: python-hello Section: python Priority: extra Maintainer: bellbind &lt;<span class="synSpecial">bellbind@gmail.com</span>&gt; Build-Depends: debhelper (&gt;= 7), python-support, python2.6-dev, python3.1-dev, python-setuptools, python3-setuptools Standards-Version: 3.8.4 XS-Python-Version: 2.6, 3.1 Homepage: <span class="synConstant">http://example.com/python-hello</span> Package: python2.6-hello Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, python2.6 Description: Example python module pakage Usage: . import hello print(hello.world()) . Package: python3.1-hello Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, python3.1 Description: Example python module pakage Usage: . import hello print(hello.world()) . </pre><p>pure <a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>版との違いは、以下3点だけです(<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/rules, .install等も変更不要です)。</p> <ul> <li>バイナリパッケージを<b><a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>のバイナリバージョンごとに用意する</b>(python2系でもpython2.6とpython2.7で別パッケージにする必要がある)</li> <li>Archtecture: allを <b>Archtecture: any</b> にする(もしくは特定の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>名をリストアップ)</li> <li><b>Build-Depends に python2.6-dev, python3.1-dev</b>を入れる</li> </ul><p><br /> 2.6系と3.1系バイナリでメジャーパッケージのProvidesを設定してもよいでしょう。</p> <pre class="code lang-mail" data-lang="mail" data-unlink>Package: python2.6-hello Provides: python-hello ... </pre><p>将来、2.7系が<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>のメジャーパッケージに変わったらReplacesを設定して置き換えることになります。たとえば、1.0.1からpython2.7系を<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-helloのメインにする場合以下のようになります。</p> <pre class="code lang-mail" data-lang="mail" data-unlink>Package: python2.7-hello Provides: python-hello Replaces: python-hello (&lt;&lt; 1.0.1) ... </pre> </div> </div> <div class="section"> <h4>追加ファイル: packagename.install</h4> <p>マルチバイナリパッケージの場合、<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/tmp以下にinstall後のファイル構造が作られます。<br /> その中にあるファイルを各バイナリパッケージに振り分ける必要があります。<br /> それを指定するのが、*.installファイルです。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リトップからのファイルglobパターンで記述します。</p><p>この例では、バイナリパッケージは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-helloとpython3-helloがあるので、</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello.install</li> </ul><pre class="code" data-lang="" data-unlink>debian/tmp/usr/lib/python2.6/*</pre> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/python3-hello.install</li> </ul><pre class="code" data-lang="" data-unlink>debian/tmp/usr/lib/python3.1/*</pre><p>を用意します。</p> </div> <div class="section"> <h4>追加ファイル: packagename.docs</h4> <p>同様に、パッケージの追加ドキュメントになるファイルは、*.docsファイルで指定します。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello.docs</li> </ul><pre class="code" data-lang="" data-unlink>README.txt</pre> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/python3-hello.docs</li> </ul><pre class="code" data-lang="" data-unlink>README.txt</pre> </div> <div class="section"> <h4>確認</h4> <p>ここまでできていれば、ファイル構成は以下のようになっているはずです。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello-1.0.0/<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/README.<a class="keyword" href="http://d.hatena.ne.jp/keyword/Debian">Debian</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello-1.0.0/<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/changelog">changelog</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello-1.0.0/<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/compat</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello-1.0.0/<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/control</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello-1.0.0/<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/copyright</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello-1.0.0/<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello.docs</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello-1.0.0/<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello.install</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello-1.0.0/<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/python3-hello.docs</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello-1.0.0/<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/python3-hello.install</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello-1.0.0/<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/rules</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello-1.0.0/README.txt</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello-1.0.0/hello.py</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-hello-1.0.0/setup.py</li> </ul> </div> <div class="section"> <h4>パッケージビルド</h4> <p>この記述でバイナリパッケージを生成できるかチェックします。</p> <pre class="code" data-lang="" data-unlink>debuild -uc -us</pre><p>作成時、多くのlintianのエラーや警告が出ますが、上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%A3%A5%EC%A5%AF%A5%C8">ディレクト</a>リには<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-helloとpython3-helloの二つの<a class="keyword" href="http://d.hatena.ne.jp/keyword/deb">deb</a>ファイルが生成できているはずです。<a class="keyword" href="http://d.hatena.ne.jp/keyword/deb">deb</a>ファイルの生成確認を持って、ここで終わりとします。launchpadのppa等に公開するためには、このlintianエラーや警告が消えるように頑張っていくことになります。<br /> <br /> </p> </div> <div class="section"> <h4>応用</h4> <ul> <li>binaryモジュールは、必要なライブラリをcontrolに書く必要があります。</li> <li>/etc等どっちのモジュールでも使うものはpackagename-commonパッケージをつくるようにし、それを各バイナリパッケージのDependsに入れておけばいいでしょう。</li> <li>ソースがpython3とpython2でsetupファイルが別の場合、sys.versionでimportするsetupファイルを切り替えるsetup.pyを用意します。</li> <li><s><a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/rulesのpysupportでだめなら、pycentralを使う</s></li> </ul> </div> <div class="section"> <h4>おまけ: <a class="keyword" href="http://d.hatena.ne.jp/keyword/deb">deb</a>ファイル中のファイルリスト一覧を取り出すには</h4> <pre class="code" data-lang="" data-unlink>dpkg-deb -c ../python-hello_1.0.0-1nmu1_i386.deb</pre> </div> <div class="section"> <h4>おまけ: lintianメッセージを詳細情報つきで出すには</h4> <pre class="code" data-lang="" data-unlink>lintian -i ../python-hello_1.0.0-1nmu1_i386.changes | lv</pre> </div> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%D6%A5%EB%A5%B7%A5%E5%A1%BC%A5%C6%A5%A3%A5%F3%A5%B0">トラブルシューティング</a></h4> <ul> <li>ログで「XS-<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>-Versionはdeprecateで、<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/pyversionを使え」のようなメッセージが出るが、lucidではこのやり方ではmulti packageではエラーになってしまい、<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/pyversionsは使えなかった</li> <li><s>python3パッケージのモジュールが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>系でsys.pathが通っているdist-packagesではなく、site-packages下に入る。python2では同じ記述でpyshared下に入るので、まだ<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-support/<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-centralがpython3向けにうまく機能していないのだろう。これはsys.pathにsite-packagesへのPATHを追加すれば使うことはできるが...</s> <ul> <li>→ <a class="keyword" href="http://d.hatena.ne.jp/keyword/debian">debian</a>/rulesを(cdbsではなく)dhで書く</li> </ul></li> </ul> </div> <div class="section"> <h4>リソース</h4> <ul> <li><a href="http://joey.kitenet.net/talks/debhelper/debhelper-slides.pdf">http://joey.kitenet.net/talks/debhelper/debhelper-slides.pdf</a></li> </ul> </div> bellbind emacsのpython-modeで、TABキーでのインデント位置を固定する方法 hatenablog://entry/17680117127042746405 2010-07-23T02:24:02+09:00 2019-04-17T19:51:55+09:00 自分はキーボタンにモードがあるのが嫌いです。たとえばIMEではトグルは使わず、macのように変換/無変換キーにON/OFFを割り当てて使っています。これによってキーを何度押してもASCIIはASCIIだし、ひらがなはひらがなになります。*1emacsのpython-modeでは、同じ位置でTAB keyを複数回押すと、インデントが下がる(outdent)ようになっていて、これが非常にいらつかせます。そこで、以下のようなフックを.emacsで入れることで、cやrubyなどの言語モードと同じように、python-modeでも何回TABを押してもインデント位置が変わらないようにしています。 (add… <p>自分はキーボタンにモードがあるのが嫌いです。たとえば<a class="keyword" href="http://d.hatena.ne.jp/keyword/IME">IME</a>ではトグルは使わず、<a class="keyword" href="http://d.hatena.ne.jp/keyword/mac">mac</a>のように変換/無変換キーにON/OFFを割り当てて使っています。これによってキーを何度押してもASCIIはASCIIだし、ひらがなはひらがなになります。<a href="#f-242357b0" name="fn-242357b0" title="つまりはドナルド・ノーマンの言うmodeless、またはRESTの冪等性(idenpotent)のメリットをWebだとか以前に実感しているわけですわ">*1</a></p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/emacs">emacs</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-modeでは、同じ位置でTAB keyを複数回押すと、インデントが下がる(outdent)ようになっていて、これが非常にいらつかせます。</p><p>そこで、以下のようなフックを<a class="keyword" href="http://d.hatena.ne.jp/keyword/.emacs">.emacs</a>で入れることで、cや<a class="keyword" href="http://d.hatena.ne.jp/keyword/ruby">ruby</a>などの言語モードと同じように、<b><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-modeでも何回TABを押してもインデント位置が変わらない</b>ようにしています。</p> <pre class="code lang-lisp" data-lang="lisp" data-unlink><span class="synSpecial">(</span>add-hook <span class="synSpecial">'</span><span class="synIdentifier">python-mode-hook</span> <span class="synSpecial">'(</span><span class="synStatement">lambda</span><span class="synSpecial">()</span> <span class="synSpecial">(</span><span class="synStatement">defun</span> my-indent-line <span class="synSpecial">(</span>&amp;optional arg<span class="synSpecial">)</span> <span class="synConstant">&quot;modeless indent for python indentation&quot;</span> <span class="synSpecial">(</span>interactive <span class="synConstant">&quot;P&quot;</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">let</span> <span class="synSpecial">((</span>old-this-command this-command<span class="synSpecial">))</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> this-command <span class="synStatement">t</span><span class="synSpecial">)</span> <span class="synSpecial">(</span>py-indent-line arg<span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> this-command old-this-command<span class="synSpecial">)</span> <span class="synSpecial">))</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> indent-line-function 'my-indent-line<span class="synSpecial">)</span> <span class="synSpecial">))</span> </pre><p>ちなみに、インデントを戻すときはブロックの最後に必ず pass や return を入れることになります。<a href="#f-8652e945" name="fn-8652e945" title="py-indent-lineを別キーにでも割り当てるのでもいいだろうけど。">*2</a><br /> </p> <div class="section"> <h4>emacs23 progmodes/<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>.elの場合</h4> <p>コマンド名や引数が<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-mode.elから若干変わっていますが、やり方は一緒です。</p> <pre class="code lang-lisp" data-lang="lisp" data-unlink><span class="synSpecial">(</span>add-hook <span class="synSpecial">'</span><span class="synIdentifier">python-mode-hook</span> <span class="synSpecial">'(</span><span class="synStatement">lambda</span> <span class="synSpecial">()</span> <span class="synSpecial">(</span><span class="synStatement">defun</span> my-indent-line <span class="synSpecial">()</span> <span class="synConstant">&quot;modeless indent for python indentation&quot;</span> <span class="synSpecial">(</span>interactive <span class="synConstant">&quot;P&quot;</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">let</span> <span class="synSpecial">((</span>old-this-command this-command<span class="synSpecial">))</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> this-command <span class="synStatement">t</span><span class="synSpecial">)</span> <span class="synSpecial">(</span>python-indent-line<span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> this-command old-this-command<span class="synSpecial">)</span> <span class="synSpecial">))</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> indent-line-function 'my-indent-line<span class="synSpecial">)</span> <span class="synSpecial">))</span> </pre> </div> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>-mode.elとprogmodes/<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>.el両方に対応するフック</h4> <pre class="code lang-lisp" data-lang="lisp" data-unlink><span class="synSpecial">(</span>add-hook <span class="synSpecial">'</span><span class="synIdentifier">python-mode-hook</span> <span class="synSpecial">'(</span><span class="synStatement">lambda</span> <span class="synSpecial">()</span> <span class="synSpecial">(</span><span class="synStatement">defun</span> my-indent-line <span class="synSpecial">(</span>&amp;optional arg<span class="synSpecial">)</span> <span class="synConstant">&quot;modeless indent for python indentation&quot;</span> <span class="synSpecial">(</span>interactive <span class="synConstant">&quot;P&quot;</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">let</span> <span class="synSpecial">((</span>old-this-command this-command<span class="synSpecial">))</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> this-command <span class="synStatement">t</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">cond</span> <span class="synSpecial">((</span><span class="synStatement">fboundp</span> <span class="synType">#'python-indent-line</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">funcall</span> <span class="synType">#'python-indent-line</span><span class="synSpecial">))</span> <span class="synSpecial">((</span><span class="synStatement">fboundp</span> <span class="synType">#'py-indent-line</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">funcall</span> <span class="synType">#'py-indent-line</span> arg<span class="synSpecial">))</span> <span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> this-command old-this-command<span class="synSpecial">)</span> <span class="synSpecial">))</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> indent-line-function 'my-indent-line<span class="synSpecial">)</span> <span class="synSpecial">))</span> </pre> </div> <div class="section"> <h4>リソース</h4> <ul> <li><a href="http://www.gnu.org/s/emacs/manual/html_node/elisp/Command-Loop-Info.html">Command Loop Info - GNU Emacs Lisp Reference Manual</a></li> </ul> </div><div class="footnote"> <p class="footnote"><a href="#fn-242357b0" name="f-242357b0" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">つまりは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C9%A5%CA%A5%EB%A5%C9%A1%A6%A5%CE%A1%BC%A5%DE%A5%F3">ドナルド・ノーマン</a>の言うmodeless、またはRESTの冪等性(idenpotent)のメリットをWebだとか以前に実感しているわけですわ</span></p> <p class="footnote"><a href="#fn-8652e945" name="f-8652e945" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">py-indent-lineを別キーにでも割り当てるのでもいいだろうけど。</span></p> </div> bellbind Cythonを使ってみる hatenablog://entry/17680117127042746602 2010-07-19T02:50:31+09:00 2019-04-17T19:51:57+09:00 python-simplexqueryでは、C&C++でpythonのextensionを書いたけど、これ以上ベタでpython層変換を書くのはきついので、このあたりをサポートするツールを試すことにし、まずcythonを使ってみました。 http://www.cython.org/ cythonはpyxというpython言語の拡張言語(pyrex)のソースファイルを、cファイルに変換するpythonモジュールです。distutilsのコマンド拡張も入っているので、setup.pyに.cや.cpp同様直接.pyxを混ぜて入れることができ、cコードに変換後にコンパイルさせることも可能です。 set… <p><a href="http://pypi.python.org/pypi/python-simplexquery">python-simplexquery</a>では、C&<a class="keyword" href="http://d.hatena.ne.jp/keyword/C%2B%2B">C++</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>のextensionを書いたけど、これ以上ベタで<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>層変換を書くのはきついので、このあたりをサポートするツールを試すことにし、まずcythonを使ってみました。</p> <ul> <li><a href="http://www.cython.org/">http://www.cython.org/</a></li> </ul><p>cythonはpyxという<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>言語の拡張言語(pyrex)のソースファイルを、cファイルに変換する<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>モジュールです。distutilsのコマンド拡張も入っているので、setup.pyに.cや.cpp同様直接.pyxを混ぜて入れることができ、cコードに変換後に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>させることも可能です。</p> <div class="section"> <h4>setup.py</h4> <pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> distutils.core <span class="synPreProc">import</span> setup, Extension <span class="synPreProc">from</span> Cython.Distutils <span class="synPreProc">import</span> build_ext setup( name = <span class="synConstant">'hello'</span>, cmdclass = {<span class="synConstant">'build_ext'</span>: build_ext}, ext_modules = [Extension(<span class="synConstant">&quot;hello&quot;</span>, [<span class="synConstant">&quot;chello.c&quot;</span>, <span class="synConstant">&quot;hello.pyx&quot;</span>])] ) </pre><p>ミソは、build_extをCythonのものに指定すること</p> </div> <div class="section"> <h4>chello.c</h4> <pre class="code lang-c" data-lang="c" data-unlink><span class="synPreProc">#ifdef _MSC_VER</span> <span class="synPreProc">#define _CRT_SECURE_NO_WARNINGS</span> <span class="synPreProc">#endif</span> <span class="synPreProc">#include </span><span class="synConstant">&lt;stdio.h&gt;</span> <span class="synPreProc">#include </span><span class="synConstant">&lt;string.h&gt;</span> <span class="synType">extern</span> <span class="synType">void</span> * (* get_malloc(<span class="synType">void</span>))(<span class="synType">size_t</span>); <span class="synType">extern</span> <span class="synType">char</span> * say_hello(<span class="synType">const</span> <span class="synType">char</span> * name) { <span class="synType">char</span> * hello = <span class="synConstant">&quot;Hello&quot;</span>; <span class="synType">int</span> hellolen = strlen(hello); <span class="synType">int</span> namelen = strlen(name); <span class="synType">int</span> buflen = hellolen + <span class="synConstant">1</span> + namelen + <span class="synConstant">1</span>; <span class="synType">char</span> * buf = get_malloc()(buflen); sprintf(buf, <span class="synConstant">&quot;</span><span class="synSpecial">%s</span><span class="synConstant"> </span><span class="synSpecial">%s</span><span class="synConstant">&quot;</span>, hello, name); <span class="synStatement">return</span> buf; } </pre><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/malloc">malloc</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>のものを使うことにします。ここでは、それを外で定義させるため、関数get_<a class="keyword" href="http://d.hatena.ne.jp/keyword/malloc">malloc</a>()経由で取得させました。最初のdefineはcl.exeの警告を消すためのおまじない。</p> </div> <div class="section"> <h4>hello.pyx</h4> <pre class="code lang-pyrex" data-lang="pyrex" data-unlink><span class="synStatement">cdef</span> <span class="synStatement">extern</span> <span class="synPreProc">from</span> <span class="synConstant">&quot;Python.h&quot;</span>: <span class="synType">void</span> * PyMem_Malloc(size_t) <span class="synType">void</span> PyMem_Free(<span class="synType">void</span> *) <span class="synStatement">pass</span> <span class="synComment">#cdef extern char * say_hello(char *)</span> <span class="synComment"># or</span> <span class="synStatement">cdef</span> <span class="synStatement">extern</span>: <span class="synType">char</span> * say_hello(<span class="synType">char</span> *) <span class="synStatement">pass</span> <span class="synStatement">ctypedef</span> <span class="synType">void</span> * malloc_t(size_t) <span class="synStatement">cdef</span> <span class="synStatement">extern</span> malloc_t * get_malloc(): <span class="synStatement">return</span> PyMem_Malloc <span class="synComment"># function returned func cdef requires arg name of its func type</span> <span class="synStatement">cdef</span> <span class="synStatement">extern</span> <span class="synType">void</span> (* get_free())(<span class="synType">void</span> * ptr): <span class="synStatement">return</span> &amp;PyMem_Free <span class="synStatement">def</span> <span class="synIdentifier">say_hello_to</span>(name): <span class="synComment"># convert py to c</span> <span class="synComment"># cannot mix py exp in cdef exp without pyvars</span> bname = name.encode(<span class="synConstant">&quot;utf-8&quot;</span>) <span class="synStatement">cdef</span> <span class="synType">char</span> * cname = bname <span class="synStatement">cdef</span> <span class="synType">char</span> * buf = say_hello(cname) <span class="synComment"># convert c to py</span> ret = buf PyMem_Free(buf) <span class="synStatement">return</span> ret.decode(<span class="synConstant">&quot;utf-8&quot;</span>) </pre><p>いくつかポイント</p> <ul> <li>pyxはcにソースtoソースで変換される。</li> <li>型定義では、constや引数なし指定voidは書かない</li> <li>typedefしないで関数型を返す関数の宣言部で、関数型に引数名が必要だったりする(型だけだとそれがobject型の変数とみなされる)。ctypedefではいらない</li> <li>cdef文中で<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>の式は書けない。<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>の変数だけは使える</li> <li>var = cvarでは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a> objectが生成される。</li> <li>ちなみにprintfのextern記述は、'cdef extern from "stdio.h": int printf(char *, ...)'</li> </ul> </div> <div class="section"> <h4>実行</h4> <p>普通のと同じで、<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a> setup.py build でビルドできます。できたモジュールはcythonライブラリを必要としません。</p> </div> <div class="section"> <h4>python3対応</h4> <p>cythonの生成cファイルは、python2でもpython3でも対応している。</p><p>ただし、Cython-0.12.1のCython/Compiler/Main.pyがpython3非互換なのでsetup.py build時に修正する必要がある。</p> <ul> <li>build時のエラー部分をprint(msg)、raise Excep(msg)、except Excep as ex: などにする程度。2to3でいける?</li> </ul> </div> <div class="section"> <h4>リソース</h4> <ul> <li><a href="http://docs.cython.org/">http://docs.cython.org/</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Wiki">Wiki</a>: <a href="http://wiki.cython.org/">http://wiki.cython.org/</a> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/C%2B%2B">C++</a>のラップもできるとか: <a href="http://wiki.cython.org/WrappingCPlusPlus">http://wiki.cython.org/WrappingCPlusPlus</a></li> </ul></li> </ul> </div> bellbind twitter記法をつかってみる hatenablog://entry/17680117127042746736 2010-07-02T21:42:16+09:00 2019-04-17T19:51:59+09:00 久々にはてなダイアリーに書いてみました。 window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; … <p>久々に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%C0%A5%A4%A5%A2%A5%EA%A1%BC">はてなダイアリー</a>に書いてみました。</p><p><script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-17567533456'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('17567533456',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-17567533456"></div><script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-17567947028'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('17567947028',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-17567947028"></div><script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-17567986895'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('17567986895',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-17567986895"></div><script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-17568106708'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('17568106708',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-17568106708"></div><script> window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs); t._e = []; t.ready = function(f) { t._e.push(f); }; return t; }(document, "script", "twitter-wjs"));</script><script> twttr.ready(function (twttr) { var el = document.getElementsByClassName('twitter-syntax-tweet-id-17568222059'); for (var i=0;i<el.length;i++) { if (!!el[i].getAttribute('data-is-tweet-loaded')){ continue; } el[i].setAttribute('data-is-tweet-loaded', '1'); twttr.widgets.createTweet('17568222059',el[i],{}); } });</script><div class="twitter-syntax-tweet-id-17568222059"></div></p><br /> <p>この<a class="keyword" href="http://d.hatena.ne.jp/keyword/twitter">twitter</a>記法だけど、最初URLしかでなくて戸惑った。リンクが <iframe marginwidth="0" marginheight="0" src="http://b.hatena.ne.jp/entry.parts?url=http%3A%2F%2Ftwitter.com%2Fbellbind%2Fstatuses%2F17568222059%3Atwitter" scrolling="no" frameborder="0" height="230" width="500"><div class="hatena-bookmark-detail-info"><a href="http://twitter.com/bellbind/statuses/17568222059:twitter">http://twitter.com/bellbind/statuses/17568222059:twitter</a><a href="http://b.hatena.ne.jp/entry/http%3A%2F%2Ftwitter.com%2Fbellbind%2Fstatuses%2F17568222059%3Atwitter">はてなブックマーク- http://twitter.com/bellbind/statuses/17568222059:twitter</a></div></iframe> じゃだめで、<iframe marginwidth="0" marginheight="0" src="http://b.hatena.ne.jp/entry.parts?url=http%3A%2F%2Ftwitter.com%2Fbellbind%2Fstatus%2F17568222059%3Atwitter" scrolling="no" frameborder="0" height="230" width="500"><div class="hatena-bookmark-detail-info"><a href="http://twitter.com/bellbind/status/17568222059:twitter">http://twitter.com/bellbind/status/17568222059:twitter</a><a href="http://b.hatena.ne.jp/entry/http%3A%2F%2Ftwitter.com%2Fbellbind%2Fstatus%2F17568222059%3Atwitter">はてなブックマーク- http://twitter.com/bellbind/status/17568222059:twitter</a></div></iframe> だといいようだ。シビアな。</p><br /> <p>この記事は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Google%20Chrome">Google Chrome</a>拡張のcrxパッケージ作成をするコマンドを<a class="keyword" href="http://d.hatena.ne.jp/keyword/python">python</a>で書くことで学んだ、crxの仕組みやそこで使ってる<a class="keyword" href="http://d.hatena.ne.jp/keyword/RSA">RSA</a>/OpenSSLの使い方への感想です。</p> <ul> <li><a href="http://github.com/bellbind/crxmake-python">http://github.com/bellbind/crxmake-python</a></li> </ul><p>そもそも記事風に<a class="keyword" href="http://d.hatena.ne.jp/keyword/twitter">twitter</a>を使うのもいまいちなじめない。。。書いたあとも文面をなんども書き直すタイプだし、コードも書けないしなあ。</p> bellbind 暫定、完成版 hatenablog://entry/17680117127042746897 2010-04-13T09:01:00+09:00 2019-04-17T19:52:01+09:00 (未完成)やってみた。麻雀の上がりチェックプログラム - ラシウラから、ちょっと修正して要件を満たしたものです。 # -*- coding: utf-8 -*- class Hai(object): def __init__(self, num, tsumo=False): self.num = num self.tsumo = tsumo pass def __eq__(self, other): return self.num == other.num and self.tsumo == other.tsumo pass class Tenpai(object): def __init__… <p><a href="http://d.hatena.ne.jp/bellbind/20100413/1271106107">(&#x672A;&#x5B8C;&#x6210;)&#x3084;&#x3063;&#x3066;&#x307F;&#x305F;&#x3002;&#x9EBB;&#x96C0;&#x306E;&#x4E0A;&#x304C;&#x308A;&#x30C1;&#x30A7;&#x30C3;&#x30AF;&#x30D7;&#x30ED;&#x30B0;&#x30E9;&#x30E0; - &#x30E9;&#x30B7;&#x30A6;&#x30E9;</a>から、ちょっと修正して要件を満たしたものです。</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># -*- coding: utf-8 -*-</span> <span class="synStatement">class</span> <span class="synIdentifier">Hai</span>(<span class="synIdentifier">object</span>): <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self, num, tsumo=<span class="synIdentifier">False</span>): self.num = num self.tsumo = tsumo <span class="synStatement">pass</span> <span class="synStatement">def</span> <span class="synIdentifier">__eq__</span>(self, other): <span class="synStatement">return</span> self.num == other.num <span class="synStatement">and</span> self.tsumo == other.tsumo <span class="synStatement">pass</span> <span class="synStatement">class</span> <span class="synIdentifier">Tenpai</span>(<span class="synIdentifier">object</span>): <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self, toitsu, sumentsu): self.groups = [toitsu] + <span class="synIdentifier">sorted</span>(sumentsu, self.rimentsu) <span class="synStatement">pass</span> <span class="synStatement">def</span> <span class="synIdentifier">__hash__</span>(self): <span class="synStatement">return</span> <span class="synIdentifier">hash</span>(<span class="synIdentifier">str</span>(self.group)) <span class="synStatement">def</span> <span class="synIdentifier">__eq__</span>(self, other): <span class="synStatement">return</span> self.groups == other.groups <span class="synStatement">def</span> <span class="synIdentifier">rimentsu</span>(self, mentsua, mentsub): <span class="synStatement">if</span> is_juntsu(mentsua): <span class="synStatement">return</span> <span class="synConstant">1</span> <span class="synStatement">if</span> is_juntsu(mentsub): <span class="synStatement">return</span> -<span class="synConstant">1</span> <span class="synStatement">return</span> <span class="synConstant">1</span> <span class="synStatement">def</span> <span class="synIdentifier">format</span>(self): <span class="synStatement">return</span> <span class="synConstant">&quot;&quot;</span>.join(self.format_group(group) <span class="synStatement">for</span> group <span class="synStatement">in</span> self.groups) <span class="synStatement">def</span> <span class="synIdentifier">format_group</span>(self, group): <span class="synStatement">if</span> <span class="synIdentifier">any</span>(hai.tsumo <span class="synStatement">for</span> hai <span class="synStatement">in</span> group): <span class="synStatement">return</span> <span class="synConstant">&quot;[%s]&quot;</span> % <span class="synConstant">&quot;&quot;</span>.join(<span class="synIdentifier">str</span>(hai.num) <span class="synStatement">for</span> hai <span class="synStatement">in</span> group <span class="synStatement">if</span> <span class="synStatement">not</span> hai.tsumo) <span class="synStatement">else</span>: <span class="synStatement">return</span> <span class="synConstant">&quot;(%s)&quot;</span> % <span class="synConstant">&quot;&quot;</span>.join(<span class="synIdentifier">str</span>(hai.num) <span class="synStatement">for</span> hai <span class="synStatement">in</span> group) <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">def</span> <span class="synIdentifier">main</span>(): <span class="synStatement">while</span> <span class="synIdentifier">True</span>: <span class="synStatement">try</span>: tehai_str = <span class="synIdentifier">raw_input</span>(<span class="synConstant">&quot;haipai&gt; &quot;</span>).strip() <span class="synStatement">if</span> <span class="synStatement">not</span> tehai_str: <span class="synStatement">break</span> tehai = parse(tehai_str) <span class="synStatement">for</span> tenpai <span class="synStatement">in</span> iter_tenpai(tehai): <span class="synIdentifier">print</span>(tenpai) <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">except</span>: <span class="synPreProc">import</span> traceback traceback.print_exc() <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">def</span> <span class="synIdentifier">parse</span>(tehai): <span class="synStatement">if</span> <span class="synIdentifier">len</span>(tehai) != <span class="synConstant">13</span>: <span class="synStatement">raise</span> <span class="synType">Exception</span>(<span class="synConstant">&quot;tehai should be 13 hai&quot;</span>) <span class="synStatement">return</span> [Hai(<span class="synIdentifier">int</span>(tehai[i])) <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synIdentifier">len</span>(tehai))] <span class="synStatement">def</span> <span class="synIdentifier">iter_tenpai</span>(tehai): tsumo_list = [Hai(i, <span class="synIdentifier">True</span>) <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">1</span>, <span class="synConstant">10</span>)] <span class="synComment"># TBD: check: count of same num &lt;= 4</span> tenpaiset = <span class="synIdentifier">set</span>() <span class="synStatement">for</span> tsumo <span class="synStatement">in</span> tsumo_list: tsumotehai = rihai(tehai + [tsumo]) <span class="synStatement">for</span> toitsu, rest <span class="synStatement">in</span> iter_toitsu(tsumotehai): <span class="synStatement">for</span> sumentsu <span class="synStatement">in</span> iter_allmentsu(rest): tenpai = Tenpai(toitsu, sumentsu).<span class="synIdentifier">format</span>() <span class="synStatement">if</span> tenpai <span class="synStatement">in</span> tenpaiset: <span class="synStatement">continue</span> tenpaiset.add(tenpai) <span class="synStatement">yield</span> tenpai <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">def</span> <span class="synIdentifier">rihai</span>(tsumo_and_tehai): <span class="synStatement">return</span> <span class="synIdentifier">sorted</span>(tsumo_and_tehai, <span class="synStatement">lambda</span> a, b: <span class="synIdentifier">cmp</span>(a.num, b.num)) <span class="synStatement">def</span> <span class="synIdentifier">iter_toitsu</span>(ritsumo): same = [] <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synIdentifier">len</span>(ritsumo) - <span class="synConstant">1</span>): <span class="synStatement">if</span> ritsumo[i].num == ritsumo[i+<span class="synConstant">1</span>].num: toitsu = ritsumo[i:i+<span class="synConstant">2</span>] rest = ritsumo[:i] + ritsumo[i+<span class="synConstant">2</span>:] <span class="synStatement">if</span> toitsu <span class="synStatement">in</span> same: <span class="synStatement">continue</span> same.append(toitsu) <span class="synStatement">yield</span> (toitsu, rest) <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">def</span> <span class="synIdentifier">is_juntsu</span>(mentsu): <span class="synStatement">return</span> (mentsu[<span class="synConstant">0</span>].num + <span class="synConstant">1</span> == mentsu[<span class="synConstant">1</span>].num <span class="synStatement">and</span> mentsu[<span class="synConstant">0</span>].num + <span class="synConstant">2</span> == mentsu[<span class="synConstant">2</span>].num) <span class="synStatement">def</span> <span class="synIdentifier">is_kotsu</span>(mentsu): <span class="synStatement">return</span> mentsu[<span class="synConstant">0</span>].num == mentsu[<span class="synConstant">1</span>].num == mentsu[<span class="synConstant">2</span>].num <span class="synStatement">def</span> <span class="synIdentifier">is_mentsu</span>(mentsu): <span class="synStatement">return</span> is_juntsu(mentsu) <span class="synStatement">or</span> is_kotsu(mentsu) <span class="synStatement">def</span> <span class="synIdentifier">pick1</span>(hailist): <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synIdentifier">len</span>(hailist)): <span class="synStatement">yield</span> (hailist[i], hailist[:i] + hailist[i+<span class="synConstant">1</span>:]) <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">def</span> <span class="synIdentifier">iter_allmentsu</span>(rest): <span class="synStatement">if</span> <span class="synIdentifier">len</span>(rest) == <span class="synConstant">0</span>: <span class="synStatement">yield</span> [] <span class="synStatement">return</span> a = rest[<span class="synConstant">0</span>] r1 = rest[<span class="synConstant">1</span>:] same = [] <span class="synStatement">for</span> b, r2 <span class="synStatement">in</span> pick1(r1): <span class="synStatement">for</span> c, r3 <span class="synStatement">in</span> pick1(r2): mentsu = [a, b, c] <span class="synStatement">if</span> mentsu <span class="synStatement">in</span> same: <span class="synStatement">continue</span> same.append(mentsu) <span class="synStatement">if</span> <span class="synStatement">not</span> is_mentsu(mentsu): <span class="synStatement">continue</span> <span class="synStatement">for</span> allmentsu <span class="synStatement">in</span> iter_allmentsu(r3): <span class="synStatement">yield</span> [mentsu] + allmentsu <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">if</span> __name__ == <span class="synConstant">&quot;__main__&quot;</span>: main() </pre> <div class="section"> <h4>追記: <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C9%A5%E1%A5%A4%A5%F3">ドメイン</a>知識を利用する</h4> <p>上の四面子の探し方(<a class="keyword" href="http://d.hatena.ne.jp/keyword/iter">iter</a>_allmentsu)は、先頭の牌に対し全ての三牌の組を列挙してそれが順子か<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%EF%BB%D2">刻子</a>かを判定していく方式をとってます。これは細かい性質を知らなくても問題文からすぐ割り出せるやり方です。</p><p>しかし麻雀のルールから考えれば、先頭の牌に対し<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%EF%BB%D2">刻子</a>となる組み合わせ、順子となる組み合わせを探していく方が、効率が良いと思います。なぜなら探索範囲の限定がしやすいから。整牌済なら、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B9%EF%BB%D2">刻子</a>なら数値が違う牌が出た時点で失敗となり、順子なら一つ上二つ上の牌それぞれがない時点で失敗とわかるからです。それが下記のコードです:</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synStatement">def</span> <span class="synIdentifier">iter_allmentsu</span>(hai_list): <span class="synStatement">if</span> <span class="synIdentifier">len</span>(hai_list) == <span class="synConstant">0</span>: <span class="synStatement">yield</span> [] <span class="synStatement">return</span> juntsu, rest = find_juntsu(hai_list) <span class="synStatement">if</span> juntsu: <span class="synStatement">for</span> allmentsu <span class="synStatement">in</span> iter_allmentsu(rest): <span class="synStatement">yield</span> [juntsu] + allmentsu <span class="synStatement">pass</span> <span class="synStatement">pass</span> kotsu, rest = find_kotsu(hai_list) <span class="synStatement">if</span> kotsu: <span class="synStatement">for</span> allmentsu <span class="synStatement">in</span> iter_allmentsu(rest): <span class="synStatement">yield</span> [kotsu] + allmentsu <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">def</span> <span class="synIdentifier">find_kotsu</span>(hai_list): <span class="synStatement">if</span> (hai_list[<span class="synConstant">0</span>].num == hai_list[<span class="synConstant">1</span>].num <span class="synStatement">and</span> hai_list[<span class="synConstant">0</span>].num == hai_list[<span class="synConstant">2</span>].num): <span class="synStatement">return</span> hai_list[:<span class="synConstant">3</span>], hai_list[<span class="synConstant">3</span>:] <span class="synStatement">return</span> [], hai_list <span class="synStatement">def</span> <span class="synIdentifier">find_juntsu</span>(hai_list): juntsu = [hai_list[<span class="synConstant">0</span>], <span class="synIdentifier">None</span>, <span class="synIdentifier">None</span>] rest = [] <span class="synStatement">for</span> hai <span class="synStatement">in</span> hai_list[<span class="synConstant">1</span>:]: <span class="synStatement">if</span> juntsu[<span class="synConstant">1</span>] <span class="synStatement">is</span> <span class="synIdentifier">None</span> <span class="synStatement">and</span> hai.num == juntsu[<span class="synConstant">0</span>].num + <span class="synConstant">1</span>: juntsu[<span class="synConstant">1</span>] = hai <span class="synStatement">pass</span> <span class="synStatement">elif</span> juntsu[<span class="synConstant">2</span>] <span class="synStatement">is</span> <span class="synIdentifier">None</span> <span class="synStatement">and</span> hai.num == juntsu[<span class="synConstant">0</span>].num + <span class="synConstant">2</span>: juntsu[<span class="synConstant">2</span>] = hai <span class="synStatement">pass</span> <span class="synStatement">else</span>: rest.append(hai) <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">return</span> (juntsu, rest) <span class="synStatement">if</span> juntsu[<span class="synConstant">1</span>] <span class="synStatement">and</span> juntsu[<span class="synConstant">2</span>] <span class="synStatement">else</span> ([], hai_list) </pre> </div> bellbind (未完成)やってみた。麻雀の上がりチェックプログラム hatenablog://entry/17680117127042747843 2010-04-13T06:01:47+09:00 2019-04-17T19:52:13+09:00 http://alfalfalfa.com/archives/391753.html 洗濯の合間1時間ほどでできたところまでです。 問題の要件的には未完成で、重複がでる状況があり、コードの最後に書いてあります。基本のアルゴリズムは簡単です(ただし七対子チェックは入ってません)。 全体的には、各通りツモってみて、その14牌で上がりパターンかチェックして、上がってれば出力する 上がりチェックは、まず頭の対子をすべて列挙し、各対子に対しそれを除いた12牌で4面子になるか検査する コードはPythonで、generatorを多用しています。 一番時間かかったのは用語選びでしょうか。呼び方がわからないも… <ul> <li><a href="http://alfalfalfa.com/archives/391753.html">http://alfalfalfa.com/archives/391753.html</a></li> </ul><p>洗濯の合間1時間ほどでできたところまでです。<br /> 問題の要件的には未完成で、重複がでる状況があり、コードの最後に書いてあります。</p><p>基本の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%EB%A5%B4%A5%EA%A5%BA%A5%E0">アルゴリズム</a>は簡単です(ただし<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%B7%C2%D0%BB%D2">七対子</a>チェックは入ってません)。</p> <ul> <li>全体的には、各通りツモってみて、その14牌で上がりパターンかチェックして、上がってれば出力する</li> <li>上がりチェックは、まず頭の対子をすべて列挙し、各対子に対しそれを除いた12牌で4面子になるか検査する</li> </ul><p>コードは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>で、generatorを多用しています。<br /> 一番時間かかったのは用語選びでしょうか。呼び方がわからないものもありました:</p> <ul> <li>手配+ツモ牌 のことをなんて呼ぶのだろうか</li> <li>面子と対子(や単騎、カンチャン、両面なども)といった組になるものをなんと呼ぶのだろうか</li> </ul><p>識別子は漢字で書けばよかったかな(とはいえ<a class="keyword" href="http://d.hatena.ne.jp/keyword/google">google</a>入力も麻雀用語には強くないようで、読みからは変換できないので大変ですが)。</p><p>以下コード:</p> <pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># -*- coding: utf-8 -*-</span> <span class="synStatement">class</span> <span class="synIdentifier">Hai</span>(<span class="synIdentifier">object</span>): <span class="synStatement">def</span> <span class="synIdentifier">__init__</span>(self, num, tsumo=<span class="synIdentifier">False</span>): self.num = num self.tsumo = tsumo <span class="synStatement">pass</span> <span class="synStatement">def</span> <span class="synIdentifier">__eq__</span>(self, other): <span class="synStatement">return</span> self.num == other.num <span class="synStatement">and</span> self.tsumo == other.tsumo <span class="synStatement">pass</span> <span class="synStatement">def</span> <span class="synIdentifier">main</span>(): tehai_str = <span class="synIdentifier">raw_input</span>(<span class="synConstant">&quot;haipai&gt; &quot;</span>).strip() tehai = parse(tehai_str) tsumo_list = [Hai(i, <span class="synIdentifier">True</span>) <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">1</span>, <span class="synConstant">10</span>)] <span class="synComment"># TBD: validate: count of same num &lt;= 4</span> <span class="synStatement">for</span> tsumo <span class="synStatement">in</span> tsumo_list: tsumotehai = rihai(tehai + [tsumo]) <span class="synStatement">for</span> toitsu, rest <span class="synStatement">in</span> iter_toitsu(tsumotehai): <span class="synStatement">for</span> sumentsu <span class="synStatement">in</span> iter_allmentsu(rest): <span class="synIdentifier">print</span>(format_tenpai(toitsu, sumentsu)) <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">def</span> <span class="synIdentifier">parse</span>(tehai): <span class="synStatement">if</span> <span class="synIdentifier">len</span>(tehai) != <span class="synConstant">13</span>: <span class="synStatement">raise</span> <span class="synType">Exception</span>(<span class="synConstant">&quot;tehai should be 13 hai&quot;</span>) <span class="synStatement">return</span> [Hai(<span class="synIdentifier">int</span>(tehai[i])) <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synIdentifier">len</span>(tehai))] <span class="synStatement">def</span> <span class="synIdentifier">rihai</span>(tsumo_and_tehai): <span class="synStatement">return</span> <span class="synIdentifier">sorted</span>(tsumo_and_tehai, <span class="synStatement">lambda</span> a, b: <span class="synIdentifier">cmp</span>(a.num, b.num)) <span class="synStatement">def</span> <span class="synIdentifier">iter_toitsu</span>(ritsumo): same = [] <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synIdentifier">len</span>(ritsumo) - <span class="synConstant">1</span>): <span class="synStatement">if</span> ritsumo[i].num == ritsumo[i+<span class="synConstant">1</span>].num: toitsu = ritsumo[i:i+<span class="synConstant">2</span>] rest = ritsumo[:i] + ritsumo[i+<span class="synConstant">2</span>:] <span class="synStatement">if</span> toitsu <span class="synStatement">in</span> same: <span class="synStatement">continue</span> same.append(toitsu) <span class="synStatement">yield</span> (toitsu, rest) <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">def</span> <span class="synIdentifier">is_juntsu</span>(mentsu): <span class="synStatement">return</span> (mentsu[<span class="synConstant">0</span>].num + <span class="synConstant">1</span> == mentsu[<span class="synConstant">1</span>].num <span class="synStatement">and</span> mentsu[<span class="synConstant">0</span>].num + <span class="synConstant">2</span> == mentsu[<span class="synConstant">2</span>].num) <span class="synStatement">def</span> <span class="synIdentifier">is_kotsu</span>(mentsu): <span class="synStatement">return</span> mentsu[<span class="synConstant">0</span>].num == mentsu[<span class="synConstant">1</span>].num == mentsu[<span class="synConstant">2</span>].num <span class="synStatement">def</span> <span class="synIdentifier">is_mentsu</span>(mentsu): <span class="synStatement">return</span> is_juntsu(mentsu) <span class="synStatement">or</span> is_kotsu(mentsu) <span class="synStatement">def</span> <span class="synIdentifier">pick1</span>(hailist): <span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synIdentifier">len</span>(hailist)): <span class="synStatement">yield</span> (hailist[i], hailist[:i] + hailist[i+<span class="synConstant">1</span>:]) <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">def</span> <span class="synIdentifier">iter_allmentsu</span>(rest): <span class="synStatement">if</span> <span class="synIdentifier">len</span>(rest) == <span class="synConstant">0</span>: <span class="synStatement">yield</span> [] <span class="synStatement">return</span> a = rest[<span class="synConstant">0</span>] r1 = rest[<span class="synConstant">1</span>:] same = [] <span class="synStatement">for</span> b, r2 <span class="synStatement">in</span> pick1(r1): <span class="synStatement">for</span> c, r3 <span class="synStatement">in</span> pick1(r2): mentsu = [a, b, c] <span class="synStatement">if</span> mentsu <span class="synStatement">in</span> same: <span class="synStatement">continue</span> same.append(mentsu) <span class="synStatement">if</span> <span class="synStatement">not</span> is_mentsu(mentsu): <span class="synStatement">continue</span> <span class="synStatement">for</span> allmentsu <span class="synStatement">in</span> iter_allmentsu(r3): <span class="synStatement">yield</span> [mentsu] + allmentsu <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">pass</span> <span class="synStatement">def</span> <span class="synIdentifier">format_tenpai</span>(toitsu, sumentsu): <span class="synStatement">return</span> (format_group(toitsu) + <span class="synConstant">&quot;&quot;</span>.join(format_group(mentsu) <span class="synStatement">for</span> mentsu <span class="synStatement">in</span> sumentsu)) <span class="synStatement">def</span> <span class="synIdentifier">format_group</span>(group): <span class="synStatement">if</span> <span class="synIdentifier">any</span>(hai.tsumo <span class="synStatement">for</span> hai <span class="synStatement">in</span> group): <span class="synStatement">return</span> <span class="synConstant">&quot;[%s]&quot;</span> % <span class="synConstant">&quot;&quot;</span>.join(<span class="synIdentifier">str</span>(hai.num) <span class="synStatement">for</span> hai <span class="synStatement">in</span> group <span class="synStatement">if</span> <span class="synStatement">not</span> hai.tsumo) <span class="synStatement">else</span>: <span class="synStatement">return</span> <span class="synConstant">&quot;(%s)&quot;</span> % <span class="synConstant">&quot;&quot;</span>.join(<span class="synIdentifier">str</span>(hai.num) <span class="synStatement">for</span> hai <span class="synStatement">in</span> group) <span class="synStatement">pass</span> <span class="synStatement">if</span> __name__ == <span class="synConstant">&quot;__main__&quot;</span>: main() <span class="synComment"># </span><span class="synTodo">TODO</span><span class="synComment">: unify tamen machi: 1113335557778 makes same two pattern</span> <span class="synComment"># </span><span class="synTodo">TODO</span><span class="synComment">: unify juntsu/kotsu order: 1111222233339 makes same two pattern but different order </span> </pre> <ul> <li>つづき: <a href="http://d.hatena.ne.jp/bellbind/20100413/1271116860">&#x66AB;&#x5B9A;&#x3001;&#x5B8C;&#x6210;&#x7248; - &#x30E9;&#x30B7;&#x30A6;&#x30E9;</a></li> </ul> bellbind Windows7でHYBRID W-ZERO3をインターネット共有するのに苦労した hatenablog://entry/17680117127042748022 2010-01-31T09:21:44+09:00 2019-04-17T19:52:16+09:00 http://willcom-blog.com/archives/2010/01/00484.phpを読んでやってみても全く上手くいかない。色々調べたりした結果、なんとかWindows7標準UIで、Bluetooth PAN接続できるようになりました。以下、ハマった点 デフォルトのアイドル時間設定が1分なので長くしておく "スタート"-"設定"-"システム"-"バックライト"/"パワーマネジメント"の時間を5分とかにするか、切る ペアリングするときのパスワードの入れ方 Windows7には自動生成したパスワードを表示して電話側にいれさせるのが一番上にきてるが、それだと入力が間に合わなくタイムア… <p><a href="http://willcom-blog.com/archives/2010/01/00484.php">http://willcom-blog.com/archives/2010/01/00484.php</a>を読んでやってみても全く上手くいかない。色々調べたりした結果、なんとか<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows7">Windows7</a>標準UIで、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a> PAN接続できるようになりました。</p><p>以下、ハマった点</p> <ul> <li>デフォルトのアイドル時間設定が1分なので長くしておく <ul> <li>"スタート"-"設定"-"システム"-"バックライト"/"パワーマネジメント"の時間を5分とかにするか、切る</li> </ul></li> <li>ペアリングするときのパスワードの入れ方 <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows7">Windows7</a>には自動生成したパスワードを表示して電話側にいれさせるのが一番上にきてるが、それだと入力が間に合わなく<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%A4%A5%E0%A5%A2%A5%A6%A5%C8">タイムアウト</a>する</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%A4%A5%E0%A5%A2%A5%A6%A5%C8">タイムアウト</a>したらまた繰り返せばいい</li> <li>二番目の自分で設定するようにする</li> </ul></li> <li>デ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>一覧で、ダブルクリックしてはいけない <ul> <li>一覧上でシングルクリックすると、上の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C4%A1%BC%A5%EB%A5%D0%A1%BC">ツールバー</a>?に「接続方法」が出てくる。その「アクセスポイント」を選ぶ</li> <li>ダブルクリックで出てきたダイアログの「接続」はモデム接続のためのもので、PANとは無関係</li> </ul></li> </ul> <div class="section"> <h4>手順</h4> <p>1.<a class="keyword" href="http://d.hatena.ne.jp/keyword/HYBRID%20W-ZERO3">HYBRID W-ZERO3</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>を有効にする。</p> <ul> <li><a href="http://willcom-blog.com/archives/2010/01/00484.php">http://willcom-blog.com/archives/2010/01/00484.php</a>のとおり。1と2まで。(USBの部分はやる必要なし)</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a> PANで3Gを選んでます</li> </ul><p>2.<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows7">Windows7</a>のタスクバーの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>アイコンをクリックすると出すメニューから、「<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>デ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>の表示」を選ぶ<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20100131092057" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20100131/20100131092057.png" alt="f:id:bellbind:20100131092057p:image" title="f:id:bellbind:20100131092057p:image" class="hatena-fotolife" itemprop="image"></a></span></p><p>3.ダイアログの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C4%A1%BC%A5%EB%A5%D0%A1%BC">ツールバー</a>?から「デ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>の追加」を選ぶ<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20100131092329" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20100131/20100131092329.png" alt="f:id:bellbind:20100131092329p:image" title="f:id:bellbind:20100131092329p:image" class="hatena-fotolife" itemprop="image"></a></span></p><p>4.「<a class="keyword" href="http://d.hatena.ne.jp/keyword/WS027SH">WS027SH</a>」が見つかるので選択して「次へ」<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20100131092330" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20100131/20100131092330.png" alt="f:id:bellbind:20100131092330p:image" title="f:id:bellbind:20100131092330p:image" class="hatena-fotolife" itemprop="image"></a></span></p><br /> <p>5.次のダイアログで、「デ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>のペアリングコードの入力」を選ぶ<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20100131092331" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20100131/20100131092331.png" alt="f:id:bellbind:20100131092331p:image" title="f:id:bellbind:20100131092331p:image" class="hatena-fotolife" itemprop="image"></a></span></p><p>6.<a class="keyword" href="http://d.hatena.ne.jp/keyword/W-ZERO3">W-ZERO3</a>側に入れるコード(自由に決めていい)を入れ、「次へ」を押します<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20100131092332" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20100131/20100131092332.png" alt="f:id:bellbind:20100131092332p:image" title="f:id:bellbind:20100131092332p:image" class="hatena-fotolife" itemprop="image"></a></span></p><br /> <p>7.<a class="keyword" href="http://d.hatena.ne.jp/keyword/W-ZERO3">W-ZERO3</a>で同じコードをいれ<b>下の</b>「次へ」を押す。<br /> <a href="http://willcom-blog.com/archives/2010/01/00484.php">http://willcom-blog.com/archives/2010/01/00484.php</a>の7</p> <ul> <li>注: <b>ソフトキーボードのEnterでは入力されません</b></li> </ul><p>ペアリングは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BF%A5%A4%A5%E0%A5%A2%A5%A6%A5%C8">タイムアウト</a>などして失敗しやすいです。失敗したら3から繰り返します。<br /> 成功すると以下のような画面が出ます。<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20100131092333" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20100131/20100131092333.png" alt="f:id:bellbind:20100131092333p:image" title="f:id:bellbind:20100131092333p:image" class="hatena-fotolife" itemprop="image"></a></span></p><br /> <p>8.デ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>一覧に、<a class="keyword" href="http://d.hatena.ne.jp/keyword/WS027SH">WS027SH</a>が追加されているので、それを<b>シングルクリックし選択</b>します</p> <ul> <li>注: <b>ダブルクリックしてはいけません</b>(これをやると別な道にハマります)</li> </ul><p><span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20100131092334" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20100131/20100131092334.png" alt="f:id:bellbind:20100131092334p:image" title="f:id:bellbind:20100131092334p:image" class="hatena-fotolife" itemprop="image"></a></span></p><p>9.選択すると<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C4%A1%BC%A5%EB%A5%D0%A1%BC">ツールバー</a>?に、「接続方法」メニューが出ます。その「アクセスポイント」を選べばインターネットにつながります。<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20100131092335" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20100131/20100131092335.png" alt="f:id:bellbind:20100131092335p:image" title="f:id:bellbind:20100131092335p:image" class="hatena-fotolife" itemprop="image"></a></span></p><br /> <p>二回目以降は、WZERO3側で、「インターネット共有」を実行し、そのあと<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows7">Windows7</a>側で「アクセスポイント」を選ぶことになります。</p> </div> <div class="section"> <h4>感想</h4> <p>電話としては色々問題ありだけど(BTヘッドセット接続が有効な状態で<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bluetooth">Bluetooth</a>をつなげたまま、電話かけてベルが鳴ったら即切るとフリーズするしね)、設定が面倒なもののルータとしてはなかなかいい感じでした。</p> </div> bellbind cygwin-1.7.1になったついでにminttyに乗り換えた hatenablog://entry/17680117127042748127 2010-01-23T04:42:34+09:00 2019-04-17T19:52:17+09:00 cygwinでパッケージを追加しようとしたら、setup.exe更新の警告が出たので、公式からダウンロードしてアップデートかけたら、普段使っていたターミナルckが立ち上がらなくなりました。 http://www.cygwin.com/ バージョンを意識してみるとcygwinが1.7系になっていて、検索かけると年末の記事でみなck3が動かなくなってたらしい。ck2はうごくとか。 http://www.google.co.jp/search?q=cygwin-1.7+ck cygwin-1.7の大きな変更はutf-8化で、公式のターミナルを試すと、確かにlsで日本語表示も日本語入力も、日本語ファイ… <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>でパッケージを追加しようとしたら、setup.exe更新の警告が出たので、公式からダウンロードしてアップデートかけたら、普段使っていたターミナルckが立ち上がらなくなりました。</p> <ul> <li><a href="http://www.cygwin.com/">http://www.cygwin.com/</a></li> </ul><p>バージョンを意識してみると<a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>が<b>1.7</b>系になっていて、検索かけると年末の記事でみなck3が動かなくなってたらしい。ck2はうごくとか。</p> <ul> <li><a href="http://www.google.co.jp/search?q=cygwin-1.7+ck">http://www.google.co.jp/search?q=cygwin-1.7+ck</a></li> </ul><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>-1.7の大きな変更は<b><a class="keyword" href="http://d.hatena.ne.jp/keyword/utf-8">utf-8</a>化</b>で、公式のターミナルを試すと、確かにlsで日本語表示も日本語入力も、日本語ファイルのタブ補完もできる。ただ、このターミナルの難点はコピペがしにくいところです。</p> <ul> <li><a href="http://sourceforge.jp/magazine/09/12/24/0429208">http://sourceforge.jp/magazine/09/12/24/0429208</a></li> </ul><p>そこで、<a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>パッケージにある<b>mintty</b>を使ってみました。以前試したときは日本語関係がダメダメだったが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/UTF-8">UTF-8</a>化されたならうまく行くのではと。そしてその予想通りでした。</p> <ul> <li><a href="http://code.google.com/p/mintty/">http://code.google.com/p/mintty/</a></li> </ul><p>setup.exeでminttyのパッケージを入れると、スタートメニューの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Cygwin">Cygwin</a>の中にショートカットが追加されます。ターミナルを起動するには、それを実行すればいいです。</p><p><span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20100124041725" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20100124/20100124041725.png" alt="f:id:bellbind:20100124041725p:image" title="f:id:bellbind:20100124041725p:image" class="hatena-fotolife" itemprop="image"></a></span></p><p>Optionsで、フォントを「MSゴシック」10ptに変え、透過を「Med」に、マウスを「Copy on select」にし、右クリックを「Paste」に割り当ててました。上のように日本語表示も入力もTAB補完もOKです。</p><p>基本的にckで必要だったことはすべてできたので、ターミナルはこのminttyに乗り換えました。</p><br /> <br /> <p>minttyがckと大きく違うのは、ckが自動文字判定してくれる点です。たとえば<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>ではjavacコマンドはエラーメッセージを<a class="keyword" href="http://d.hatena.ne.jp/keyword/SJIS">SJIS</a>で出力します。ckだとこれはふつうに表示してくれますが、minttyでは文字化けします。(ちなみに"-J-Dfile.encoding=<a class="keyword" href="http://d.hatena.ne.jp/keyword/UTF-8">UTF-8</a>"オプションをつければメッセージは<a class="keyword" href="http://d.hatena.ne.jp/keyword/UTF-8">UTF-8</a>で出せます)。</p> bellbind Virtual Routerを使ってみた hatenablog://entry/17680117127042748212 2009-12-09T02:14:33+09:00 2019-04-17T19:52:18+09:00 Windows7専用ですが、無線LANデバイスをシェアしてWindows7機を無線LANルータ化してくれるプログラムVirtual Routerを試してみました: http://virtualrouter.codeplex.com/ 入れたのはUL20A(Windows7 Home Premium 64bit)です。結果としては満足でした。USBアクセスポイントでよくあるブリッジ式ではなく、ホストPCの接続先とは別のプライベートネットをつくり、接続したマシンには(DHCPで?)ブリッジせずに独自にIPを振ってくれたからです。暗号化方式は選択肢はなくWPA2になります(なのでDS LiteやPS… <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows7">Windows7</a>専用ですが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B5%C0%FELAN">無線LAN</a>デ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%B9">バイス</a>をシェアして<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows7">Windows7</a>機を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B5%C0%FELAN">無線LAN</a>ルータ化してくれるプログラムVirtual Routerを試してみました:</p> <ul> <li><a href="http://virtualrouter.codeplex.com/">http://virtualrouter.codeplex.com/</a></li> </ul><p>入れたのはUL20A(<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows7">Windows7</a> Home Premium 64bit)です。結果としては満足でした。USBアクセスポイントでよくあるブリッジ式ではなく、<b>ホストPCの接続先とは別のプライベートネットをつくり、接続したマシンには(<a class="keyword" href="http://d.hatena.ne.jp/keyword/DHCP">DHCP</a>で?)ブリッジせずに独自にIPを振ってくれた</b>からです。暗号化方式は選択肢はなく<b>WPA2</b>になります(なので<a class="keyword" href="http://d.hatena.ne.jp/keyword/DS%20Lite">DS Lite</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/PSP">PSP</a>ではつなげないですが)。</p><p>インストールすると、"Virtual Router Manager"がメニューに追加されるので、そこで8文字以上のパスワードを入れて、"Start Virtual Router"ボタンを押すだけで、無線アクセスできるようになります。PCで接続すると以下のようにアイコンが追加されます。<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20091210020833" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20091210/20091210020833.png" alt="f:id:bellbind:20091210020833p:image" title="f:id:bellbind:20091210020833p:image" class="hatena-fotolife" itemprop="image"></a></span><br /> この窓は閉じてもサービスとして動いてるので大丈夫です。止めるときは"Stop Virtual Router"ボタンを押せばOKです。</p><p>ここに接続したPC(<a class="keyword" href="http://d.hatena.ne.jp/keyword/WindowsXP">WindowsXP</a>)の設定では、このときはホストPC側の<a class="keyword" href="http://d.hatena.ne.jp/keyword/IP%A5%A2%A5%C9%A5%EC%A5%B9">IPアドレス</a>192.168.137.1が<a class="keyword" href="http://d.hatena.ne.jp/keyword/gateway">gateway</a>, <a class="keyword" href="http://d.hatena.ne.jp/keyword/DNS">DNS</a>に設定されました(ホストの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows7">Windows7</a>の通常の<a class="keyword" href="http://d.hatena.ne.jp/keyword/IP%A5%A2%A5%C9%A5%EC%A5%B9">IPアドレス</a>は192.168.10.23でした)。ちなみに、以下、確認したことです:</p> <ul> <li>ホスト側で(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%A2%A5%A6%A5%A9%A1%BC%A5%EB">ファイアウォール</a>ブロックを解除しておいた)<a class="keyword" href="http://d.hatena.ne.jp/keyword/rails">rails</a>を起動し、<a href="http://192.168.137.1:3000/">http://192.168.137.1:3000/</a> でXP側からブラウザでアクセスした</li> <li>ホスト側で<a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/SSH">SSH</a>を2122へポート<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A9%A5%EF">フォワ</a>ードしかつ2122を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%A2%A5%A6%A5%A9%A1%BC%A5%EB">ファイアウォール</a>を解除し、XP側から192.168.137.1:2122に<a class="keyword" href="http://d.hatena.ne.jp/keyword/PuTTY">PuTTY</a>で接続した</li> <li><b>有線接続へ送る<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%B5%C0%FELAN">無線LAN</a>ルータ</b>にした: ホスト側の無線接続を切ってLANケーブルでインターネット側に接続し、Virtual Routerを立ち上げ、XPから無線でVirtual Routerに接続してインターネットアクセスした</li> </ul><p></p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9">ソースコード</a>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/C%23">C#</a>で書かれています。ソースではWlanapi.dllのDllImportが大部分でしょうけど。DOT11_CIPHER_ALGORITHMとかあるので、WEPでも選べるようにしたらDSとかでもつかえるようになるのかな。。。</p> <ul> <li><a href="http://virtualrouter.codeplex.com/SourceControl/ListDownloadableCommits.aspx">http://virtualrouter.codeplex.com/SourceControl/ListDownloadableCommits.aspx</a></li> </ul> bellbind XMouse設定ツールにGUIをつけてみた hatenablog://entry/17680117127042748286 2009-12-03T06:37:12+09:00 2019-04-17T19:52:19+09:00 Windows7用X Mouse設定ツール(コマンドライン)を作ってみた - ラシウラのX-Mouseレジストリ設定ツールにGUIをつけてみました。 GUIのライブラリは、Windows7に入ってるWPFを使いました(これも初挑戦か)。.NET SDKは不要なままです。 http://github.com/bellbind/XMouseSetting ソース: http://github.com/bellbind/XMouseSetting/blob/master/XMouseSetting.cs exe: http://cloud.github.com/downloads/bellbind/… <p><a href="http://d.hatena.ne.jp/bellbind/20091202/1259772563">Windows7&#x7528;X Mouse&#x8A2D;&#x5B9A;&#x30C4;&#x30FC;&#x30EB;(&#x30B3;&#x30DE;&#x30F3;&#x30C9;&#x30E9;&#x30A4;&#x30F3;)&#x3092;&#x4F5C;&#x3063;&#x3066;&#x307F;&#x305F; - &#x30E9;&#x30B7;&#x30A6;&#x30E9;</a>のX-Mouse<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%B8%A5%B9%A5%C8%A5%EA">レジストリ</a>設定ツールに<a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>をつけてみました。<br /> <a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>のライブラリは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows7">Windows7</a>に入ってる<a class="keyword" href="http://d.hatena.ne.jp/keyword/WPF">WPF</a>を使いました(これも初挑戦か)。.NET <a class="keyword" href="http://d.hatena.ne.jp/keyword/SDK">SDK</a>は不要なままです。</p> <ul> <li><a href="http://github.com/bellbind/XMouseSetting">http://github.com/bellbind/XMouseSetting</a> <ul> <li>ソース: <a href="http://github.com/bellbind/XMouseSetting/blob/master/XMouseSetting.cs">http://github.com/bellbind/XMouseSetting/blob/master/XMouseSetting.cs</a></li> <li>exe: <a href="http://cloud.github.com/downloads/bellbind/XMouseSetting/XMouseSetting.zip">http://cloud.github.com/downloads/bellbind/XMouseSetting/XMouseSetting.zip</a> <ul> <li>(このexeは<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows7">Windows7</a> x64でビルドしたものですが、64bit版<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vista">Vista</a>および.NET3.5が入ってる<a class="keyword" href="http://d.hatena.ne.jp/keyword/WindowsXP">WindowsXP</a> 32bit版でも動作することを確認しました)</li> </ul></li> </ul></li> </ul><p>exe実行で出るWindow<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20091205180334" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20091205/20091205180334.png" alt="f:id:bellbind:20091205180334p:image" title="f:id:bellbind:20091205180334p:image" class="hatena-fotolife" itemprop="image"></a></span></p><br /> <p>saveボタンを押した後出るログオフするかどうかのダイアログ<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20091203063622" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20091203/20091203063622.png" alt="f:id:bellbind:20091203063622p:image" title="f:id:bellbind:20091203063622p:image" class="hatena-fotolife" itemprop="image"></a></span></p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%DE%A5%F3%A5%C9%A5%E9%A5%A4%A5%F3">コマンドライン</a>機能はそのまま残してあります。</p> <div class="section"> <h4>リソース</h4> <p>(追記: アイコンイメージを加え、見た目は若干変えました)</p><p>ローカル変数の型は明示するのをやめ、なるべくvarを使うようにしました。</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/C%23">C#</a>からのログオフ処理は、<a href="http://www.eggheadcafe.com/tutorials/aspnet/e5ef4e3e-6f42-4b9b-8834-04366ce32c96/net-lock-logoff-reboot.aspx">.NET Lock, Logoff, Reboot, Shutdown, Hibernate, Standby</a>を参考にしてます。</p><p>また、<a class="keyword" href="http://d.hatena.ne.jp/keyword/WPF">WPF</a>を<a class="keyword" href="http://d.hatena.ne.jp/keyword/C%23">C#</a>で使う方法は、<a href="http://msdn.microsoft.com/ja-jp/library/ms752324.aspx">http://msdn.microsoft.com/ja-jp/library/ms752324.aspx</a>から調べていきました。いまいちよい書き方がつかめてません(全部windowのコンスト<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E9%A5%AF">ラク</a>タ内で作れないかな...)。</p> </div> bellbind Windows7用X Mouse設定ツール(コマンドライン)を作ってみた hatenablog://entry/17680117127042748519 2009-12-02T01:49:23+09:00 2019-04-17T19:52:22+09:00 (追記: GUIつけました→ XMouse設定ツールにGUIをつけてみた - ラシウラ)UL20A Windows7セットアップ - ラシウラのXMouse化ですが、Vistaのときでも同じことやっていて、いちいち覚えてられないので、C#でX-Mouse設定のレジストリをいじるコードを書きました(UL20Aでの初プログラミングです)。このツールは、コンソールで使うようになってます。 http://gist.github.com/247329 ビルド XMouse.exeのビルドは、上記gistからrawでファイルを落としてから、cscにかけるだけです。cygwinがあれば、以下の二行を実行すれ… <p>(追記: <a class="keyword" href="http://d.hatena.ne.jp/keyword/GUI">GUI</a>つけました→ <a href="http://d.hatena.ne.jp/bellbind/20091203/1259789832">XMouse&#x8A2D;&#x5B9A;&#x30C4;&#x30FC;&#x30EB;&#x306B;GUI&#x3092;&#x3064;&#x3051;&#x3066;&#x307F;&#x305F; - &#x30E9;&#x30B7;&#x30A6;&#x30E9;</a>)</p><p><a href="http://d.hatena.ne.jp/bellbind/20091123/1259001927">UL20A Windows7&#x30BB;&#x30C3;&#x30C8;&#x30A2;&#x30C3;&#x30D7; - &#x30E9;&#x30B7;&#x30A6;&#x30E9;</a>のXMouse化ですが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vista">Vista</a>のときでも同じことやっていて、いちいち覚えてられないので、<a class="keyword" href="http://d.hatena.ne.jp/keyword/C%23">C#</a>でX-Mouse設定の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%B8%A5%B9%A5%C8%A5%EA">レジストリ</a>をいじるコードを書きました(UL20Aでの初プログラミングです)。このツールは、コンソールで使うようになってます。</p> <ul> <li><a href="http://gist.github.com/247329">http://gist.github.com/247329</a></li> </ul> <div class="section"> <h4>ビルド</h4> <p>XMouse.exeのビルドは、上記gistからrawでファイルを落としてから、<a class="keyword" href="http://d.hatena.ne.jp/keyword/csc">csc</a>にかけるだけです。</p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>があれば、以下の二行を実行すればいけるでしょう:</p> <pre class="code lang-sh" data-lang="sh" data-unlink>wget http://gist.github.com/raw/<span class="synConstant">247329</span>/cb6c5cf89c8b9453d502310fb4e6a6c2b4b4f78b/XMouse.cs /cygdrive/c/Windows/Microsoft.NET/Framework64/v3.5/csc.exe XMouse.cs </pre><p>また、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows7">Windows7</a>標準添付の<a class="keyword" href="http://d.hatena.ne.jp/keyword/PowerShell">PowerShell</a>を使うなら、以下の二行で同じことができます:</p> <pre class="code" data-lang="" data-unlink>(New-Object System.Net.WebClient).DownloadFile(&#34;http://gist.github.com/raw/247329/cb6c5cf89c8b9453d502310fb4e6a6c2b4b4f78b/XMouse.cs&#34;, &#34;XMouse.cs&#34;) C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe .\XMouse.cs</pre><p>(gistは編集するとrawのURLが変わるため、実際のXMouse.csのURLは違うかもしれません。また環境によっては、<a class="keyword" href="http://d.hatena.ne.jp/keyword/csc">csc</a>.exeのありかは、Framework64がFrameworkだったり、v3.5がv3.0だったりするかも)</p> </div> <div class="section"> <h4>使い方</h4> <p>注: 設定変更後にマウス設定が機能するのは、いったんログアウトして再ログインしたときになります。</p> <div class="section"> <h5>ヘルプと現在のX-Mouse設定</h5> <p>(引数なしで実行)</p> <pre class="code" data-lang="" data-unlink>$ ./XMouse.exe Usage: XMouse [on [NUM]|off] Options: on: follow mouse activation on NUM: follow activation then auto raise after NUM msec off: disable follow activation/auto raise Current XMouse Setings: Follow Activation: True Auto Raise: True Raise Time (msec): 500</pre> </div> <div class="section"> <h5>自動フォーカスを有効にする</h5> <pre class="code" data-lang="" data-unlink>./XMouse.exe on</pre> </div> <div class="section"> <h5>自動フォーカスに加え、500msec後にオートレイズを有効にする</h5> <pre class="code" data-lang="" data-unlink>./XMouse.exe on 500</pre> </div> <div class="section"> <h5>X-Mouse設定をやめる</h5> <pre class="code" data-lang="" data-unlink>./XMouse.exe off</pre> </div> </div> <div class="section"> <h4>ソース</h4> <p><script src="http://gist.github.com/247329.js"></script></p><p></p> <div class="section"> <h5>感想</h5> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/csc">csc</a>では、</p> <pre class="code csharp" data-lang="csharp" data-unlink>masks[0] |= 0x40</pre><p>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>がとおるのに</p> <pre class="code csharp" data-lang="csharp" data-unlink>masks[0] &amp;= ~0x40</pre><p>は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>がとおらないんだなあ。</p> </div> </div> <div class="section"> <h4>リソース</h4> <ul> <li><a href="http://msdn.microsoft.com/ja-jp/library/microsoft.win32.registry_members.aspx">http://msdn.microsoft.com/ja-jp/library/microsoft.win32.registry_members.aspx</a></li> <li><a href="http://msdn.microsoft.com/ja-jp/library/microsoft.win32.registrykey_members.aspx">http://msdn.microsoft.com/ja-jp/library/microsoft.win32.registrykey_members.aspx</a></li> <li><a href="http://msdn.microsoft.com/ja-jp/library/system.net.webclient_members.aspx">http://msdn.microsoft.com/ja-jp/library/system.net.webclient_members.aspx</a></li> </ul> </div> bellbind Windows7で初BSOD hatenablog://entry/17680117127042748744 2009-12-01T02:18:45+09:00 2019-04-17T19:52:25+09:00 VirtualBox-3.1.0で、ゲストubuntu amd64を立ち上げたまま、ゲストubuntu x86を立ち上げようとしたらおきた。 3.1.0でゲスト→ホストでクリップボード共有できてる模様。以下はゲストからコピーしてホスト側でペーストした現在の.emacs (set-language-environment "Japanese") (prefer-coding-system 'utf-8-unix) (set-keyboard-coding-system 'utf-8-unix) (set-terminal-coding-system 'utf-8-unix) (toggle-in… <p><span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20091202021656" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20091202/20091202021656.png" alt="f:id:bellbind:20091202021656p:image" title="f:id:bellbind:20091202021656p:image" class="hatena-fotolife" itemprop="image"></a></span></p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a>-3.1.0で、ゲスト<a class="keyword" href="http://d.hatena.ne.jp/keyword/ubuntu">ubuntu</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/amd64">amd64</a>を立ち上げたまま、ゲスト<a class="keyword" href="http://d.hatena.ne.jp/keyword/ubuntu">ubuntu</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/x86">x86</a>を立ち上げようとしたらおきた。</p><br /> <p>3.1.0でゲスト→ホストで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C3%A5%D7%A5%DC%A1%BC%A5%C9">クリップボード</a>共有できてる模様。以下はゲストからコピーしてホスト側でペーストした現在の<a class="keyword" href="http://d.hatena.ne.jp/keyword/.emacs">.emacs</a></p> <pre class="code lang-lisp" data-lang="lisp" data-unlink><span class="synSpecial">(</span>set-language-environment <span class="synConstant">&quot;Japanese&quot;</span><span class="synSpecial">)</span> <span class="synSpecial">(</span>prefer-coding-system <span class="synSpecial">'</span><span class="synIdentifier">utf-8-unix</span><span class="synSpecial">)</span> <span class="synSpecial">(</span>set-keyboard-coding-system <span class="synSpecial">'</span><span class="synIdentifier">utf-8-unix</span><span class="synSpecial">)</span> <span class="synSpecial">(</span>set-terminal-coding-system <span class="synSpecial">'</span><span class="synIdentifier">utf-8-unix</span><span class="synSpecial">)</span> <span class="synSpecial">(</span>toggle-input-method <span class="synStatement">nil</span><span class="synSpecial">)</span> <span class="synSpecial">(</span>global-set-key <span class="synConstant">&quot;\C-q&quot;</span> <span class="synSpecial">'</span><span class="synIdentifier">toggle-input-method</span><span class="synSpecial">)</span> <span class="synSpecial">(</span>global-set-key [delete] <span class="synSpecial">'</span><span class="synIdentifier">delete-char</span><span class="synSpecial">)</span> <span class="synSpecial">(</span>global-font-lock-mode <span class="synStatement">t</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> indent-tabs-mode <span class="synStatement">nil</span><span class="synSpecial">)</span> <span class="synSpecial">(</span><span class="synStatement">setq</span> make-backup-files <span class="synStatement">nil</span><span class="synSpecial">)</span> </pre> bellbind UL20Aデスクトップ hatenablog://entry/17680117127042748821 2009-11-24T22:04:28+09:00 2019-04-17T19:52:26+09:00 Windows7 Windows7は、デフォルトでこういったアートワークテーマがあるのがいい。一定時間ごとにと背景が別の絵に切り替わっていきます。画面は1366x768だけど、そこそこ広く使えてます。 Ubuntu 9.10 on VirtualBox ホスト→ゲストへのクリップボードはコピーされます(逆はできていない)。chromium-browserを入れてます。 sudo add-apt-repository ppa:chromium-dailyを数回やるとapt lineに追加されます。 おまけ: CPU-Z BIOSでのオーバクロック5%設定ですが、利いてるようです。 <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows7">Windows7</a></h4> <p><span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20091124220342" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20091124/20091124220342.png" alt="f:id:bellbind:20091124220342p:image" title="f:id:bellbind:20091124220342p:image" class="hatena-fotolife" itemprop="image"></a></span></p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows7">Windows7</a>は、デフォルトでこういったアートワークテーマがあるのがいい。一定時間ごとにと背景が別の絵に切り替わっていきます。画面は1366x768だけど、そこそこ広く使えてます。</p> </div> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/Ubuntu">Ubuntu</a> 9.10 on <a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a></h4> <p><span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20091124220421" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20091124/20091124220421.png" alt="f:id:bellbind:20091124220421p:image" title="f:id:bellbind:20091124220421p:image" class="hatena-fotolife" itemprop="image"></a></span></p><p>ホスト→ゲストへの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A5%C3%A5%D7%A5%DC%A1%BC%A5%C9">クリップボード</a>はコピーされます(逆はできていない)。<a class="keyword" href="http://d.hatena.ne.jp/keyword/chromium">chromium</a>-browserを入れてます。</p> <pre class="code" data-lang="" data-unlink>sudo add-apt-repository ppa:chromium-daily</pre><p>を数回やるとapt lineに追加されます。</p> </div> <div class="section"> <h4>おまけ: <a class="keyword" href="http://d.hatena.ne.jp/keyword/CPU-Z">CPU-Z</a></h4> <p><span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20091125205709" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20091125/20091125205709.png" alt="f:id:bellbind:20091125205709p:image" title="f:id:bellbind:20091125205709p:image" class="hatena-fotolife" itemprop="image"></a></span></p><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/BIOS">BIOS</a>でのオーバクロック5%設定ですが、利いてるようです。</p> </div> bellbind UL20A Windows7セットアップ hatenablog://entry/17680117127042748893 2009-11-23T03:45:27+09:00 2019-04-17T19:52:27+09:00 ASUS UL20A届いた - ラシウラのUL20Aを整備しました。UL20Aは、ふたを閉じるとハイバネーションで、電源ボタンがサスペンドになっていたりとというような、なかなか愉快なデフォルト設定で、そのあたりから直していきました(Express Gateを使うためには、サスペンドじゃいけないからだろうけど)。 入れたパッケージ 初のWindows7機だけど、あまりVistaと変わらなくて拍子抜けかも。最近は、昔ほどソフトを入れることもなくなってきたなと感じました。(サブノートなので、VisualStudio環境や動画編集環境は今回はパスしてます)。 chrome: http://www.go… <p><a href="http://d.hatena.ne.jp/bellbind/20091118/1258549543">ASUS UL20A&#x5C4A;&#x3044;&#x305F; - &#x30E9;&#x30B7;&#x30A6;&#x30E9;</a>のUL20Aを整備しました。UL20Aは、ふたを閉じると<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CF%A5%A4%A5%D0%A5%CD%A1%BC%A5%B7%A5%E7%A5%F3">ハイバネーション</a>で、電源ボタンが<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A5%B9%A5%DA%A5%F3%A5%C9">サスペンド</a>になっていたりとというような、なかなか愉快なデフォルト設定で、そのあたりから直していきました(Express Gateを使うためには、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B5%A5%B9%A5%DA%A5%F3%A5%C9">サスペンド</a>じゃいけないからだろうけど)。</p> <div class="section"> <h4>入れたパッケージ</h4> <p>初の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows7">Windows7</a>機だけど、あまり<a class="keyword" href="http://d.hatena.ne.jp/keyword/Vista">Vista</a>と変わらなくて拍子抜けかも。最近は、昔ほどソフトを入れることもなくなってきたなと感じました。(サブノートなので、VisualStudio環境や動画編集環境は今回はパスしてます)。</p> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/chrome">chrome</a>: <a href="http://www.google.com/chrome/">http://www.google.com/chrome/</a> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/flash">flash</a> player 10.1 plugin: <a href="http://labs.adobe.com/downloads/flashplayer10.html">http://labs.adobe.com/downloads/flashplayer10.html</a></li> <li>JDK6(32bit版): <a href="http://java.sun.com/javase/ja/6/download.html">http://java.sun.com/javase/ja/6/download.html</a></li> </ul></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/7-Zip">7-Zip</a> (x64): <a href="http://sevenzip.sourceforge.jp/">http://sevenzip.sourceforge.jp/</a></li> <li>WECP: <a href="http://www.mediacodec.org/">http://www.mediacodec.org/</a></li> <li>doPDF6: <a href="http://www.dopdf.com/download.php">http://www.dopdf.com/download.php</a></li> <li>Alcohol52%: <a href="http://www.free-downloads.net/programs/Alcohol_52__Free_Edition">http://www.free-downloads.net/programs/Alcohol_52__Free_Edition</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/AVG">AVG</a> Free 9: <a href="http://www.avgjapan.com/avgfree80-dl.html">http://www.avgjapan.com/avgfree80-dl.html</a></li> <li>KeySwap for XP: <a href="http://www.vector.co.jp/soft/winnt/util/se228667.html">http://www.vector.co.jp/soft/winnt/util/se228667.html</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/PuTTY">PuTTY</a>ごった煮 0.60: <a href="http://yebisuya.dip.jp/Software/PuTTY/">http://yebisuya.dip.jp/Software/PuTTY/</a></li> <li>WinRoll 2.0: <a href="http://www.palma.com.au/winroll/">http://www.palma.com.au/winroll/</a> <ul> <li>左ダブルクリックdll: <a href="http://bellbind.net/wiki.cgi?page=WinRoll%BA%B8%A5%AF%A5%EA%A5%C3%A5%AF%CD%AD%B8%FA%B2%BDdll">WinRoll&#x5DE6;&#x30AF;&#x30EA;&#x30C3;&#x30AF;&#x6709;&#x52B9;&#x5316;dll - bellbind.net</a></li> </ul></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/WinSCP">WinSCP</a> 4.2.4: <a href="http://winscp.net/eng/download.php">http://winscp.net/eng/download.php</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/xyzzy">xyzzy</a>: <a href="http://www.jsdlab.co.jp/~kamei/">http://www.jsdlab.co.jp/~kamei/</a> <ul> <li>caldix: <a href="http://www.kmonos.net/lib/caldix.ja.html">http://www.kmonos.net/lib/caldix.ja.html</a></li> <li>NetInstaller: <a href="http://xyzzy.s53.xrea.com/wiki/index.php?QuickTour/ext/NetInstaller">http://xyzzy.s53.xrea.com/wiki/index.php?QuickTour/ext/NetInstaller</a></li> </ul></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/GIMP">GIMP</a> 2.6.7: <a href="http://gimp-win.sourceforge.net/stable.html">http://gimp-win.sourceforge.net/stable.html</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Inkscape">Inkscape</a> 0.47: <a href="http://www.inkscape.org/">http://www.inkscape.org/</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/OOo">OOo</a> 3.1.1: <a href="http://www.forest.impress.co.jp/lib/offc/document/offcsuite/openoffice.html">http://www.forest.impress.co.jp/lib/offc/document/offcsuite/openoffice.html</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/cygwin">cygwin</a>: <a href="http://www.cygwin.com/">http://www.cygwin.com/</a> <ul> <li>ck-3.2.1: <a href="http://sohda.net/cygwin/dist/mirror/www.geocities.jp/meir/cygwin_ck/">http://sohda.net/cygwin/dist/mirror/www.geocities.jp/meir/cygwin_ck/</a></li> </ul></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a> 3.0.12: <a href="http://dlc.sun.com/virtualbox/vboxdownload.html">http://dlc.sun.com/virtualbox/vboxdownload.html</a> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/ubuntu">ubuntu</a> 9.10 <a class="keyword" href="http://d.hatena.ne.jp/keyword/i386">i386</a>: <a href="http://www.ubuntu.com/getubuntu/download">http://www.ubuntu.com/getubuntu/download</a></li> </ul></li> </ul><p>ひとつ残念なのは<b><a class="keyword" href="http://d.hatena.ne.jp/keyword/VirtualBox">VirtualBox</a> 3.0.12上のゲスト<a class="keyword" href="http://d.hatena.ne.jp/keyword/ubuntu">ubuntu</a> karmic <a class="keyword" href="http://d.hatena.ne.jp/keyword/amd64">amd64</a>が異様に重くなってしまう</b>点。<a href="http://www.tolaris.com/2009/11/04/poor-virtualbox-guest-performance-with-intel-vt-x/">Intel VT-x&#x304C;&#x539F;&#x56E0;&#x3001;&#x307F;&#x305F;&#x3044;&#x306A;&#x5831;&#x544A;</a>もありますが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/linux">linux</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/amd64">amd64</a>で使うにはそれをoffにすることもできないようなので、32bit版<a class="keyword" href="http://d.hatena.ne.jp/keyword/ubuntu">ubuntu</a>を入れました。(もしかしてハード側の<a class="keyword" href="http://d.hatena.ne.jp/keyword/BIOS">BIOS</a>設定が必要なのかも)。</p> </div> <div class="section"> <h4>設定</h4> <p>KeySwapで<b>「CAPS Lock」キーには「右Ctrl」</b>を割り振ったほかには、regeditを使って<b>X-Mouse化</b>してます。</p> <ul> <li>"HKEY_CURRENT_USER\Control Panel\Desktop"の <ul> <li>"UserPreferencesMask"編集: 最初の数値を0x41足し上げる(元が0x9eなら0xdfになる)</li> <li>"ActiveWndTrkTimeout"作成: DWORD値でつくり、10進で500にする(0x000001f4) <ul> <li>(既存のActiveWndTrackTimeoutではないので注意)</li> </ul></li> </ul></li> </ul><p>タスクバーは右置きにしました。デフォルトでは出ていない<b>quick launchを表示</b>させています。</p> <ul> <li>右クリックメニュー「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C4%A1%BC%A5%EB%A5%D0%A1%BC">ツールバー</a>」-「新規<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C4%A1%BC%A5%EB%A5%D0%A1%BC">ツールバー</a>(N)」で出るファイルダイアログの「フォルダー」欄に"shell:quick launch"といれ、「フォルダーの選択」ボタンを押せばクイックランチが出てくる。</li> </ul><p><a class="keyword" href="http://d.hatena.ne.jp/keyword/IME">IME</a>設定はいつものように、キー設定で、<b>「無変換」に「<a class="keyword" href="http://d.hatena.ne.jp/keyword/IME">IME</a> OFF」、「変換」に「<a class="keyword" href="http://d.hatena.ne.jp/keyword/IME">IME</a> ON」となるよう割り当て</b>る。オートコレクトは<b>ASCIIがある文字は半角になるように設定</b>しました。</p> </div> <div class="section"> <h4><a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows7">Windows7</a>での<a class="keyword" href="http://d.hatena.ne.jp/keyword/IE">IE</a>無効化</h4> <p>コン<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%ED%A1%BC%A5%EB">トロール</a>パネルで<b>「プログラムと機能」を開き、左にある「<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>の機能の有効化または無効化」を押す</b>とダイアログが出るので、その一番上にある「<a class="keyword" href="http://d.hatena.ne.jp/keyword/Internet%20Explorer">Internet Explorer</a> 8」のチェックをはずして「OK」ボタンを押し、再起動したら<a class="keyword" href="http://d.hatena.ne.jp/keyword/IE">IE</a>が無効化されます。<br /> <span itemscope itemtype="http://schema.org/Photograph"><a href="http://f.hatena.ne.jp/bellbind/20091124213157" class="hatena-fotolife" itemprop="url"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/b/bellbind/20091124/20091124213157.png" alt="f:id:bellbind:20091124213157p:image" title="f:id:bellbind:20091124213157p:image" class="hatena-fotolife" itemprop="image"></a></span></p> </div> bellbind