<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CUACQ3wyfCp7ImA9WhRaFEQ.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282</id><updated>2012-02-18T00:49:22.294+09:00</updated><category term="Python" /><category term="Windows XP" /><category term="Aptana" /><category term="CotEditor" /><category term="Userscripts" /><category term="SciPy" /><category term="VMWare Fusion" /><category term="Xcode" /><category term="AppleScript" /><category term="DIY" /><category term="Statistics" /><category term="Machine Learning" /><category term="DataGrid" /><category term="Leopard" /><category term="Greasemonkey" /><category term="C++" /><category term="travel" /><category term="Chrome" /><category term="Camera" /><category term="Safari" /><category term="Notepad++" /><category term="iPod touch" /><category term="VAIO" /><category term="IronPython" /><category term="Android" /><category term="Application" /><category term="Yahoo API" /><category term="Homebrew" /><category term="Windows 7" /><category term="Go" /><category term="Lion" /><category term="Windows Vista" /><category term="jQuery" /><category term="MySQL" /><category term="Visualization" /><category term="mixi" /><category term="Javascript" /><category term="Office" /><category term="Extension" /><category term="docomo" /><category term="YouTube" /><category term="Mac mini" /><category term="LSA" /><category term="Blogger" /><category term="Word" /><category term="Google" /><category term="Google App Engine" /><category term="Snow Leopard" /><category term="misc" /><category term="Delicious" /><category term="C#" /><category term="GitHub" /><category term="Eclipse" /><category term="MacBook Air" /><category term="Ubuntu" /><category term="Emacs" /><category term="LaTeX" /><category term="Silverlight" /><category term="Excel" /><title>satomacoto</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://satomacoto.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>171</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Satomacoto" /><feedburner:info uri="satomacoto" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;Ck8EQHw5cSp7ImA9WhRaFEo.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-2643097918908155002</id><published>2012-02-17T18:26:00.000+09:00</published><updated>2012-02-17T18:26:41.229+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-17T18:26:41.229+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Machine Learning" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title>Pythonで線形動的システムのパラメータ推定を実装してみるもなんかうまくいってない</title><content type="html">線形動的システム（線形力学系，Linear dynamical systems; LDS）のEMアルゴリズムによるパラメータ推定を行いました．が，うまくいってない気がします．カルマンフィルタなどで扱う状態方程式（外部入力なし）と観測方程式において，状態と観測が与えられたときに，係数を求めるのが目的です．Ghahramaniらの&lt;a href="https://www.google.com/search?q=Parameter%20estimation%20for%20linear%20dynamical%20systems"&gt;論文&lt;/a&gt;&lt;a href="http://draft.blogger.com/blogger.g?blogID=4117638208883815282#Ghahramani"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt;の手法を実装します．&lt;br /&gt;
&lt;br /&gt;
状態方程式と観測方程式が&lt;br /&gt;
&lt;blockquote&gt;$\begin{align}&lt;br /&gt;
{\bf x}_{t+1}&amp;=A{\bf x}_t + {\bf w}_t\\&lt;br /&gt;
{\bf y}_{t}&amp;=C{\bf x}_t + {\bf v}_t\\&lt;br /&gt;
{\bf w}_t &amp;\sim N(0,Q)\\&lt;br /&gt;
{\bf v}_t &amp;\sim N(0,R)\\&lt;br /&gt;
\end{align}$&lt;/blockquote&gt;というように表され，$\{{\bf y}_1,...,{\bf y}_T\}$が与えられたときに，$A,C,Q,R$と初期状態の平均ベクトル$\pi_1$と分散共分散行列$V_1$を推定します．&lt;br /&gt;
&lt;br /&gt;
論文がとても分かりやすいので，実装に必要なところだけ抜粋します．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Eステップ&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
以下のように定義します．&lt;br /&gt;
&lt;blockquote&gt;$\begin{align}&lt;br /&gt;
{\bf x}_t^{\tau}&amp;=E({\bf x}_t|\{{\bf y}_1^{\tau}\})\\&lt;br /&gt;
V_t^{\tau}&amp;=Var({\bf x}_t|\{{\bf y}_1^{\tau}\})\\&lt;br /&gt;
\end{align}$&lt;/blockquote&gt;&lt;br /&gt;
Kalman filter&lt;br /&gt;
&lt;blockquote&gt;$\begin{align}&lt;br /&gt;
{\bf x}_1^0 &amp;= {\bf \pi}_1\\&lt;br /&gt;
V_1^0 &amp;= V_1\\&lt;br /&gt;
{\bf x}_t^{t-1} &amp;= A {\bf x}_{t-1}^{t-1}\\&lt;br /&gt;
V_t^{t-1} &amp;= A V_{t-1}^{t-1} A' + Q\\&lt;br /&gt;
K_t &amp;= V_t^{t-1}C'(CV_t^{t-1}C'+R)^{-1}\\&lt;br /&gt;
{\bf x}_t^t &amp;= {\bf x}_t^{t-1} + K_t({\bf y}_t-C{\bf x}_t^{t-1})\\&lt;br /&gt;
V_t^t &amp;= V_t^{t-1} - K_t C V_t^{t-1}\\&lt;br /&gt;
\end{align}$&lt;/blockquote&gt;&lt;br /&gt;
Kalman smoother&lt;br /&gt;
&lt;blockquote&gt;$\begin{align}&lt;br /&gt;
J_{t-1} &amp;= V_{t-1}^{t-1}A'(V_t^{t-1})^{-1}\\&lt;br /&gt;
{\bf x}_{t-1}^T &amp;= {\bf x}_{t-1}^{t-1} + J_{t-1}({\bf x}_t^T - A{\bf x}_{t-1}^{t-1})\\&lt;br /&gt;
V_{t-1}^T &amp;= V_{t-1}^{t-1} + J_{t-1}(V_t^T - V_t^{t-1})J_{t-1}'\\&lt;br /&gt;
V_{T,T-1}^T &amp;= (I - K_T C)AV_{T-1}^{T-1}\\&lt;br /&gt;
V_{t-1,t-2}^T &amp;= V_{t-1}^{t-1}J_{t-2}' + J_t-1(V_{t,t-1}^T - AV_{t-1}^{t-1})J_{t-2}'\\&lt;br /&gt;
\end{align}$&lt;/blockquote&gt;&lt;br /&gt;
これらを用いて，Mステップへの入力を求めます．&lt;br /&gt;
&lt;blockquote&gt;$\begin{align}&lt;br /&gt;
{\hat {\bf x}}_t &amp; = {\bf x}_t^T \\&lt;br /&gt;
P_t &amp; = V_t^T + {\bf x}_t^T {{\bf x}_t^T}' \\&lt;br /&gt;
P_{t,t-1} &amp; = V_{t,t-1}^T + {\bf x}_t^T{{\bf x}_{t-1}^T}' \\&lt;br /&gt;
\end{align}$&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Mステップ&lt;/b&gt;&lt;br /&gt;
&lt;blockquote&gt;$\begin{align}&lt;br /&gt;
C^{new} &amp; = (\sum_{t=1}^T {\bf y}_t {\hat{\bf x}}_t')(\sum_{t=1}^T P_t)^{-1} \\&lt;br /&gt;
R^{new} &amp; = \frac{1}{T}\sum_{t=1}^T({\bf y}_t{\bf y}_t' - C^{new}{\hat{\bf x}}_t{\bf y}_t') \\&lt;br /&gt;
A^{new} &amp; = (\sum_{t=2}^T P_{t,t-1})(\sum_{t=2}^T P_{t-1})^{-1} \\&lt;br /&gt;
Q^{new} &amp; = \frac{1}{T-1}(\sum_{t=2}^T P_{t} - A^{new}\sum_{t=2}^T P_{t-1,t}) \\&lt;br /&gt;
{\bf \pi}_1^{new} &amp; = {\hat {\bf x}}_1 \\&lt;br /&gt;
V_1^{new} &amp; = P_1 - {\hat {\bf x}}_1{\hat {\bf x}}_1'&lt;br /&gt;
\end{align}$&lt;/blockquote&gt;なおN個の観測列があるときは&lt;br /&gt;
&lt;blockquote&gt;$\begin{align}&lt;br /&gt;
{\bar {\hat {\bf x}}}_t &amp; = \frac{1}{N}\sum_{i=1}^N {\hat {\bf x}}_t^{(i)} \\&lt;br /&gt;
V_1^{new} &amp; = P_1 - {\bar {\hat {\bf x}}}_1{\bar {\hat {\bf x}}}_1' + \frac{1}{N}\sum_{i=1}^N [{\bar {\hat {\bf x}}}_1^{(i)}-{\bar {\hat {\bf x}}}_1][{\bar {\hat {\bf x}}}_1^{(i)}-{\bar {\hat {\bf x}}}_1]' \\&lt;br /&gt;
\end{align}$&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;実験&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/Kalman_filter#Example_application.2C_technical"&gt;Wikipediaのカルマンフィルタの例&lt;/a&gt;にあるシステムで実験してみました．トロッコが摩擦なしの無限レール上でランダムな力によって動くシステムです．&lt;br /&gt;
&lt;br /&gt;
データを生成するために用意したパラメータは&lt;br /&gt;
&lt;pre&gt;A
[[ 1.   0.1]
 [ 0.   1. ]]
C
[[ 1.  0.]]
Q
[[  2.50000000e-05   5.00000000e-04]
 [  5.00000000e-04   1.00000000e-02]]
R
[[ 1.]]
&lt;/pre&gt;でした．&lt;br /&gt;
&lt;br /&gt;
が，下のコードによって推定された結果は&lt;br /&gt;
&lt;pre&gt;A
[[ 0.62656567  0.64773696]
 [ 0.56148647  0.0486408 ]]
C
[[ 0.19605285  1.14560846]]
Q
[[ 0.15479875 -0.12660499]
 [-0.12665761  0.31297647]]
R
[[ 0.59216228]]
pi_1
[[-0.39133729]
 [-0.89786661]]
V_1
[[ 0.18260503 -0.07688508]
 [-0.07691364  0.20206351]]
&lt;/pre&gt;でした．下のコードでは生成されるデータは毎回異なるので結果はその都度変わります．がどうもうまくいかない．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-CBLHWyOmQgk/Tz4aSLxF7_I/AAAAAAAAExk/67hX49bU6Jc/s1600/result.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="240" width="320" src="http://2.bp.blogspot.com/-CBLHWyOmQgk/Tz4aSLxF7_I/AAAAAAAAExk/67hX49bU6Jc/s320/result.png" /&gt;&lt;/a&gt;&lt;/div&gt;赤が真の位置，マゼンダが推定された位置．青が真の速度，シアンが推定された速度．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
どこがおかしいのだろう(:D)|￣|_ =3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href="" name="Ghahramani"&gt;1.&lt;/a&gt; Z. Ghahramani and G.E. Hinton. Parameter estimation for linear dynamical systems. University of Toronto technical report CRG-TR-96-2, 6, 1996.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1852052.js?file=parameter_estimation.py"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-2643097918908155002?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/GjDXC8SExjX0XGptN72M3PNXhdE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GjDXC8SExjX0XGptN72M3PNXhdE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/GjDXC8SExjX0XGptN72M3PNXhdE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/GjDXC8SExjX0XGptN72M3PNXhdE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/mKSli7rzUTI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/2643097918908155002/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2012/02/python.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/2643097918908155002?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/2643097918908155002?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/mKSli7rzUTI/python.html" title="Pythonで線形動的システムのパラメータ推定を実装してみるもなんかうまくいってない" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-CBLHWyOmQgk/Tz4aSLxF7_I/AAAAAAAAExk/67hX49bU6Jc/s72-c/result.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2012/02/python.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMASH09fSp7ImA9WhRbEU0.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-1252459891331633605</id><published>2012-02-01T23:37:00.000+09:00</published><updated>2012-02-02T00:00:49.365+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-02T00:00:49.365+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Xcode" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title>Xcode 4でPythonの開発環境を整える</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-Lr7S5ZmhzcE/TylTQAcoreI/AAAAAAAAExM/exlutxohdhk/s1600/Fullscreen.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://2.bp.blogspot.com/-Lr7S5ZmhzcE/TylTQAcoreI/AAAAAAAAExM/exlutxohdhk/s400/Fullscreen.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
XcodeでPythonを開発することができるようです．はじめは少々面倒かもしれませんが．でもXcodeのPythonシンタックスハイライトはきれいな気もするし，&lt;a href="http://satomacoto.blogspot.com/2008/12/shortcut-english-computerese-new-line_6031.html"&gt;Emacs風のキーバインドも使える&lt;/a&gt;し，アリかも．&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://stackoverflow.com/questions/5276967/python-in-xcode-4"&gt;Python in Xcode 4 - Stack Overflow&lt;/a&gt;を&lt;strike&gt;訳しただけ&lt;/strike&gt;参考にしました．&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Xcode 4を開く．&lt;/li&gt;
&lt;li&gt;"File" → "New" → "New Project…"で新しいプロジェクトを作成．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-lYga2ANvr9c/TylBlR8iwMI/AAAAAAAAEvs/hTPJBEihNgM/s1600/Xcode.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="257" src="http://1.bp.blogspot.com/-lYga2ANvr9c/TylBlR8iwMI/AAAAAAAAEvs/hTPJBEihNgM/s400/Xcode.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;"Mac OS X"の"Other"を選択．&lt;/li&gt;
&lt;li&gt;"External Build System"を選択し，"Next"をクリック．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-9hPFChfuDXg/TylBnSNT8eI/AAAAAAAAEv0/NdKIXmFIkaE/s1600/Xcode-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="268" src="http://1.bp.blogspot.com/-9hPFChfuDXg/TylBnSNT8eI/AAAAAAAAEv0/NdKIXmFIkaE/s400/Xcode-1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;プロダクト名と識別名（Company Identifier）を入力．&lt;/li&gt;
&lt;li&gt;"Build Tool"には，/usr/bin/pythonを入力して"Next"をクリック．ほかの場所にPythonをインストールしてたらそれを入力．&lt;/li&gt;
&lt;li&gt;どこに保存するか決めて"Create"．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-eBPwNqyCOFI/TylBoE3n0gI/AAAAAAAAEv8/Xtyqne7fTVI/s1600/Xcode-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="268" src="http://4.bp.blogspot.com/-eBPwNqyCOFI/TylBoE3n0gI/AAAAAAAAEv8/Xtyqne7fTVI/s400/Xcode-2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;メニューバーから"File" → "New" → "New File…"を選択．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-hxArv9Nlz9w/TylBpOC690I/AAAAAAAAEwA/RHtHBNGUVSY/s1600/Xcode-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="198" src="http://1.bp.blogspot.com/-hxArv9Nlz9w/TylBpOC690I/AAAAAAAAEwA/RHtHBNGUVSY/s400/Xcode-3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;"Mac OS X"の"Other"を選択．&lt;/li&gt;
&lt;li&gt;"Empty"を選択し，"Next"をクリック．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-6Fl7z9AW9aI/TylBpxSUF5I/AAAAAAAAEwM/4i_udOCoJ6A/s1600/Xcode-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="268" src="http://3.bp.blogspot.com/-6Fl7z9AW9aI/TylBpxSUF5I/AAAAAAAAEwM/4i_udOCoJ6A/s400/Xcode-4.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;拡張子".py"を含んだPythonファイルをプロジェクトのフォルダに保存し"Save"をクリック．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-boFxz9Laqu4/TylBrOiprRI/AAAAAAAAEwQ/3niESgzoI4w/s1600/Xcode-5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="291" src="http://4.bp.blogspot.com/-boFxz9Laqu4/TylBrOiprRI/AAAAAAAAEwQ/3niESgzoI4w/s400/Xcode-5.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;メニューバーから"Product" → "Edit Scheme…"を選択．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-3qRFZMbPX-k/TylBtPuAIcI/AAAAAAAAEwo/LRiq5JiyJWw/s1600/Xcode-7.5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="271" src="http://3.bp.blogspot.com/-3qRFZMbPX-k/TylBtPuAIcI/AAAAAAAAEwo/LRiq5JiyJWw/s400/Xcode-7.5.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;左のコラムから"Run"を選択．&lt;/li&gt;
&lt;li&gt;"Info"タブから，"Executable"フィールドを選択し，"Other…"を選択．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-lJ6Ghn0V2dY/TylBrjRaRyI/AAAAAAAAEwY/vfjf43lH9Rs/s1600/Xcode-6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="308" src="http://2.bp.blogspot.com/-lJ6Ghn0V2dY/TylBrjRaRyI/AAAAAAAAEwY/vfjf43lH9Rs/s400/Xcode-6.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;手順6で選んだ場所に移動．⇧⌘G （shift + command + g）で移動する場所を指定できる．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-lENeLN4pT0E/TylBstbNkMI/AAAAAAAAEwg/rHxMWvi6T90/s1600/Xcode-7.0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="308" src="http://3.bp.blogspot.com/-lENeLN4pT0E/TylBstbNkMI/AAAAAAAAEwg/rHxMWvi6T90/s400/Xcode-7.0.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;"Executable"から選択．&lt;/li&gt;
&lt;li&gt;"Debugger"フィールドは，"None"を指定．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-EQN4cytgLRI/TylBtuRQDKI/AAAAAAAAEww/_4ssO-IMl-I/s1600/Xcode-8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="271" src="http://1.bp.blogspot.com/-EQN4cytgLRI/TylBtuRQDKI/AAAAAAAAEww/_4ssO-IMl-I/s400/Xcode-8.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;"Arguments"タブから"Base Expansions On"フィールドを選択，プロジェクトの名前を選択．&lt;/li&gt;
&lt;li&gt;"Arguments Passed On Launch"の"+"をクリック．&lt;/li&gt;
&lt;li&gt;$(SOURCE_ROOT)/実行したいファイル名 を記入．ファイルはプロジェクトフォルダの中にないと実行できない．もしほかの場所のものを実行したいときはフルパスを記入．スペースを含む場合はクォーテーションで囲む．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-1lSEWkNnrIg/TylBubW1L6I/AAAAAAAAEw4/twqCmcoZgI0/s1600/Xcode-9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="271" src="http://3.bp.blogspot.com/-1lSEWkNnrIg/TylBubW1L6I/AAAAAAAAEw4/twqCmcoZgI0/s400/Xcode-9.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;"OK"をクリック．&lt;/li&gt;
&lt;li&gt;コーディングをはじめましょう！&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-7tU1GE-CG8k/TylBvO_sV6I/AAAAAAAAExE/hhLMtoqtOFE/s1600/Xcode-10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="222" src="http://2.bp.blogspot.com/-7tU1GE-CG8k/TylBvO_sV6I/AAAAAAAAExE/hhLMtoqtOFE/s400/Xcode-10.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;⌘Rで実行できます．&lt;/li&gt;
&lt;li&gt;デフォルトでは出力は下のパネルに表示されます．&lt;/li&gt;
&lt;li&gt;タブ幅，文字コードは右のパネルから変更可能です．&lt;/li&gt;
&lt;li&gt;Pythonの自動インデントはできません．&lt;/li&gt;
&lt;li&gt;応用すれば他の言語の開発環境もつくれるかも．&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-1252459891331633605?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nLg6Nde67EuKGje7qSJAG2fOEc8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nLg6Nde67EuKGje7qSJAG2fOEc8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/nLg6Nde67EuKGje7qSJAG2fOEc8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nLg6Nde67EuKGje7qSJAG2fOEc8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/yU7qhcJr_Cc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/1252459891331633605/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2012/02/xcode-4python.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/1252459891331633605?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/1252459891331633605?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/yU7qhcJr_Cc/xcode-4python.html" title="Xcode 4でPythonの開発環境を整える" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-Lr7S5ZmhzcE/TylTQAcoreI/AAAAAAAAExM/exlutxohdhk/s72-c/Fullscreen.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2012/02/xcode-4python.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIGQX09fCp7ImA9WhRbFE8.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-8860073700728917445</id><published>2012-02-01T08:14:00.000+09:00</published><updated>2012-02-05T16:22:00.364+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-05T16:22:00.364+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MacBook Air" /><category scheme="http://www.blogger.com/atom/ns#" term="Lion" /><title>Macbook Airの環境を整える覚書 その２</title><content type="html">自分用．以前書いた&lt;a href="http://satomacoto.blogspot.com/2011/01/macbook-air.html"&gt;MacBook Airの環境を整える覚書&lt;/a&gt;と合わせて．&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Finder&lt;/h3&gt;&lt;br /&gt;
&lt;h4&gt;サイドバーの文字サイズ変更&lt;/h4&gt;&lt;br /&gt;
System Preferences &amp;gt; GeneralでSidebar icon sizeをSmallに．&lt;br /&gt;
ついでにRestore windows when quitting and re-opening appsはアンチェック．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-1E2Fg5BRnCM/TygYlBVlTeI/AAAAAAAAEus/4x8omSlB7s0/s1600/General-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="360" src="http://4.bp.blogspot.com/-1E2Fg5BRnCM/TygYlBVlTeI/AAAAAAAAEus/4x8omSlB7s0/s400/General-1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Terminal&lt;/h3&gt;&lt;br /&gt;
&lt;h4&gt;ログインシェルをzshに変更&lt;/h4&gt;&lt;br /&gt;
System PreferencesからUsers &amp;amp; Groups&lt;br /&gt;
左下のロックを外して，Current Userを右クリック，Advanced Options...&lt;br /&gt;
Login shellを/bin/zshに．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-0GDRwjSN9Bc/Tygasx77d4I/AAAAAAAAEu4/VFGyjtpUR_U/s1600/user.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="339" src="http://1.bp.blogspot.com/-0GDRwjSN9Bc/Tygasx77d4I/AAAAAAAAEu4/VFGyjtpUR_U/s400/user.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h4&gt;行数の変更，終了後の動作の変更，metaキーの設定の変更&lt;/h4&gt;&lt;br /&gt;
PreferencesからWindowでRowsを43に．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-7KGRiTZbD0I/Tyh0gEmWILI/AAAAAAAAEvM/Fnp5P2kWMlk/s1600/window.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="289" src="http://2.bp.blogspot.com/-7KGRiTZbD0I/Tyh0gEmWILI/AAAAAAAAEvM/Fnp5P2kWMlk/s320/window.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
PreferencesからShellでWhen the shell exits:をClose if the shell exited cleanlyに．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-H_xT55jOH9s/Tyh0fZm6GsI/AAAAAAAAEvE/b68BPo3J7p8/s1600/shell.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="289" src="http://4.bp.blogspot.com/-H_xT55jOH9s/Tyh0fZm6GsI/AAAAAAAAEvE/b68BPo3J7p8/s320/shell.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
PreferencesからKeyboardでUse option as meta keyにチェック．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-TJXdYpuky-I/TyiJ9txxLnI/AAAAAAAAEvc/khh70Td8gN0/s1600/keyboard-1.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="290" width="320" src="http://2.bp.blogspot.com/-TJXdYpuky-I/TyiJ9txxLnI/AAAAAAAAEvc/khh70Td8gN0/s320/keyboard-1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;キーボード&lt;/h3&gt;&lt;br /&gt;
フルキーボードアクセスをすべてのコンポーネントで．ダイアログでタブとスペースを組み合わせて選択できるようになる．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-b61cYvgcjbo/Ty4uEN4NjiI/AAAAAAAAExY/iTp-imIt5M8/s1600/Keyboard.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="286" width="320" src="http://2.bp.blogspot.com/-b61cYvgcjbo/Ty4uEN4NjiI/AAAAAAAAExY/iTp-imIt5M8/s320/Keyboard.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;IME&lt;/h3&gt;&lt;br /&gt;
&lt;h4&gt;Input Sources&lt;/h4&gt;&lt;br /&gt;
System Preferences &amp;gt; Language &amp;amp; Text &amp;gt; Input Sourcesから&lt;b&gt;Dvorak - Qwerty ⌘&lt;/b&gt;，Kotoeri &amp;gt; &lt;b&gt;Hiragana&lt;/b&gt;，&lt;b&gt;Romaji&lt;/b&gt;の3つを選択．ときどき気が向いたらDvorak←&lt;br /&gt;
ついでにKeyboard &amp;amp; Character Viewerにもチェック．&lt;br /&gt;
2つ以上のInput Sourceの切り替えは⌘長押しで．&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;&lt;a href="http://www.google.com/intl/ja/ime/index-mac.html"&gt;Google 日本語入力&lt;/a&gt;&lt;/h4&gt;&lt;br /&gt;
すばらしいんだけどDvorakとうまく共存できない…？&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;App Store&lt;/h3&gt;&lt;br /&gt;
&lt;h4&gt;Xcode&lt;/h4&gt;開発環境．ダウンロード後，Install Xcodeを実行．&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Stuffit Expander&lt;/h4&gt;解凍．&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;The Unarchiver&lt;/h4&gt;解凍．&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Evernote&lt;/h4&gt;メモ．&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Skitch&lt;/h4&gt;スクリーンキャプチャ．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;パッケージ管理&lt;/h3&gt;&lt;br /&gt;
&lt;h4&gt;&lt;a href="http://mxcl.github.com/homebrew/"&gt;Homebrew&lt;/a&gt;&lt;/h4&gt;&lt;br /&gt;
MacPortsより楽な気がする．&lt;br /&gt;
&lt;blockquote&gt;/usr/bin/ruby -e "$(curl -fsSL https://raw.github.com/gist/323731)"&lt;/blockquote&gt;要Intel CPU，OS X 10.5 or higher，Xcode with X11，Java Developer Update．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;フォント&lt;/h3&gt;&lt;br /&gt;
&lt;h4&gt;&lt;a href="http://save.sys.t.u-tokyo.ac.jp/~yusa/fonts/ricty.html"&gt;Ricty&lt;/a&gt;&lt;/h4&gt;&lt;br /&gt;
&lt;a href="http://levien.com/type/myfonts/inconsolata.html"&gt;Incosolata&lt;/a&gt; + &lt;a href="http://mix-mplus-ipa.sourceforge.jp/"&gt;Migu 1M&lt;/a&gt;．Terminalに開発環境に．RictyをインストールするためにはFontForgeを入れる必要があります．&lt;br /&gt;
&lt;blockquote&gt;brew install fontforge&lt;br /&gt;
ln -s /usr/local/Cellar/fontforge/20110222/FontForge.app /Applications&lt;/blockquote&gt;2行目のシンボリックリンクの張り方はFontForgeインストール後に表示される．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;テキストエディタ&lt;/h3&gt;&lt;br /&gt;
&lt;h4&gt;&lt;a href="http://sourceforge.jp/projects/coteditor/"&gt;CotEditor&lt;/a&gt;&lt;/h4&gt;&lt;br /&gt;
Preferences &amp;gt; Syntax &amp;gt; Delay coloringにチェック&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;ウェブブラウザ&lt;/h3&gt;&lt;br /&gt;
&lt;h4&gt;&lt;a href="http://www.google.co.jp/chrome/intl/ja/landing_ch.html"&gt;Chrome&lt;/a&gt;&lt;/h4&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/cfhdojbkjhnklbpkdaibdccddilifddb"&gt;AdBlock Plus&lt;/a&gt;&lt;br /&gt;
広告除去．&lt;a href="http://tofukko.blog113.fc2.com/"&gt;日本向けフィルタ&lt;/a&gt;を購読．&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/hdokiejnpimakedhajhdlcegeplioahd"&gt;LastPass&lt;/a&gt;&lt;br /&gt;
パスワード管理&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/ebojakelgejdogaleoeoaadjpefeifen"&gt;Mail Checker Minus&lt;/a&gt;&lt;br /&gt;
Gmailチェック&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/obciceimmggglbmelaidpjlmodcebijb"&gt;Better History&lt;/a&gt;&lt;br /&gt;
履歴を使いやすく&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/lcimnckjiicikfpppcgnjhiflibbnbel"&gt;Google Reader Open entry in background tab&lt;/a&gt;&lt;br /&gt;
Google Readerの記事をバックグラウンドで開く&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/eemleifbnibgnoifdjohpchdemidjibj"&gt;Language Links for Google&lt;/a&gt;&lt;br /&gt;
Googleをワンクリックで言語切り替え&lt;/li&gt;
&lt;li&gt;&lt;a href="http://espion.just-size.jp/archives/06/047231647.html"&gt;Deny Rakuten News&lt;/a&gt;&lt;br /&gt;
楽天メルマガ解除&lt;br /&gt;
&lt;/ul&gt;&lt;h4&gt;&lt;a href="http://mozilla.jp/firefox/"&gt;Firefox&lt;/a&gt;&lt;/h4&gt;&lt;h4&gt;&lt;a href="http://jp.opera.com/"&gt;Opera&lt;/a&gt;&lt;/h4&gt;&lt;h3&gt;LaTeX&lt;/h3&gt;&lt;h4&gt;&lt;a href="http://www2.kumagaku.ac.jp/teacher/herogw/"&gt;UpTeX.app&lt;/a&gt;&lt;/h4&gt;色々まとまって入ってる．    &lt;h4&gt;ghostscript&lt;/h4&gt;Homebrewインストール後  &lt;blockquote&gt;brew install ghostscript&lt;/blockquote&gt;&lt;h4&gt;&lt;a href="http://pages.uoregon.edu/koch/texshop/"&gt;TexShop&lt;/a&gt;&lt;/h4&gt;LaTeX書くときは便利．テキストエディタで書いちゃうことも多い．        &lt;h3&gt;ファイル共有&lt;/h3&gt;&lt;h4&gt;&lt;a href="http://draft.blogger.com/www.dropbox.com"&gt;Dropbox&lt;/a&gt;&lt;/h4&gt;よほど大きくならない限り計算結果なんかもここに．持ってるすべての端末でzsh, vim, emacs, CotEditorの環境設定も共有．~/Dropbox/Settings以下に共有する環境設定を置いておく．下は環境共有をまとめて設定するシェルスクリプト．つったってシンボリックリンク貼ってるだけ．  &lt;script class="brush: shell" type="syntaxhighlighter"&gt;
&lt;![CDATA[
#!/bin/sh

echo "Create a symbolic link..."
# .zshrc
if [ ! -e ~/.zshrc ]; then
    echo ".zsrhc"
    ln -s ~/Dropbox/Settings/.zshrc ~/.zshrc
fi
# .vimrc
if [ ! -e ~/.vimrc ]; then
    echo ".vimrc"
    ln -s ~/Dropbox/Settings/vim/.vimrc ~/.vimrc
fi
# .emacs
if [ ! -e ~/.emacs ]; then
    echo ".emacs"
    ln -s ~/Dropbox/Settings/emacs/.emacs ~/.emacs
fi
# CotEditor
if [ -e /Applications/CotEditor.app ]; then
    echo "Overwrite CotEditor Settings? [y/n]"
    read ANS
    if [ $ANS = 'y' -o $ANS = 'yes' ]; then
        rm -rf ~/Library/Application\ Support/CotEditor
        ln -s ~/Dropbox/Settings/CotEditor/ ~/Library/Application\ Support/CotEditor
    fi
fi
]]&gt;
&lt;/script&gt;       &lt;h3&gt;Python&lt;/h3&gt;&lt;h4&gt;pip&lt;/h4&gt;Python用パッケージ管理．&lt;a href="http://www.pip-installer.org/en/latest/index.html"&gt;http://www.pip-installer.org/en/latest/index.html&lt;/a&gt;  &lt;blockquote&gt;easy_install pip&lt;/blockquote&gt;easy_installのかわり．アンインストールもできる．    &lt;h4&gt;&lt;a href="http://fonnesbeck.github.com/ScipySuperpack/"&gt;ScipySuperpack&lt;/a&gt;&lt;/h4&gt;&lt;br /&gt;
Lionの環境に合わせたscipyやら入れるために．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-8860073700728917445?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-ky7W5gyNHe8XUzYiwS143ODCe0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-ky7W5gyNHe8XUzYiwS143ODCe0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-ky7W5gyNHe8XUzYiwS143ODCe0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-ky7W5gyNHe8XUzYiwS143ODCe0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/c6DQW2fgrBc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/8860073700728917445/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2012/02/macbook-air.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/8860073700728917445?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/8860073700728917445?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/c6DQW2fgrBc/macbook-air.html" title="Macbook Airの環境を整える覚書 その２" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-1E2Fg5BRnCM/TygYlBVlTeI/AAAAAAAAEus/4x8omSlB7s0/s72-c/General-1.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2012/02/macbook-air.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YEQnk8eSp7ImA9WhRUE0Q.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-4284550142504688241</id><published>2012-01-24T17:51:00.000+09:00</published><updated>2012-01-24T17:51:43.771+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-24T17:51:43.771+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="CotEditor" /><title>CotEditorで拡張子に関連付けられた実行ファイルを起動するスクリプトとか</title><content type="html">&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-VF9NNzcsVi0/Tx5obmLI1pI/AAAAAAAAEuU/bm08nVoRHY4/s1600/coteditor.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="170" src="http://2.bp.blogspot.com/-VF9NNzcsVi0/Tx5obmLI1pI/AAAAAAAAEuU/bm08nVoRHY4/s400/coteditor.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
CotEditor&amp;nbsp;&lt;a href="http://sourceforge.jp/projects/coteditor/"&gt;http://sourceforge.jp/projects/coteditor/&lt;/a&gt;&amp;nbsp;のためのスクリプトをまとめておきます．スクリプトを使うためには，メニューバーから Open Scripts Folder で ~/Library/Application Support/CotEditor/ScriptMenu/ を開いて，スクリプトファイルを置いて，Update Script Menu します．ファイル名を変えることでショートカットを変更することもできます．&lt;br /&gt;
&lt;br /&gt;
今のところ&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;関連付け実行&lt;/li&gt;
&lt;li&gt;テンプレートロード&lt;/li&gt;
&lt;li&gt;Finder 開く&lt;/li&gt;
&lt;li&gt;Terminal 開く&lt;/li&gt;
&lt;li&gt;実体参照置換&lt;/li&gt;
&lt;li&gt;C, C++, C#, Javaソース整形&lt;/li&gt;
&lt;/ul&gt;のためのスクリプトがあります．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ダウンロード&lt;br /&gt;
&lt;a href="https://github.com/satomacoto/CotEditor-ScriptMenu"&gt;https://github.com/satomacoto/CotEditor-ScriptMenu&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-MNnjg5hQLUA/Tx5tnMqmKUI/AAAAAAAAEuc/nOS-uihM8sE/s1600/githubzip.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="229" src="http://3.bp.blogspot.com/-MNnjg5hQLUA/Tx5tnMqmKUI/AAAAAAAAEuc/nOS-uihM8sE/s320/githubzip.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Run.@r.applescript&lt;/b&gt; (command + r)&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;ファイルの拡張子に関連付けられたスクリプトを実行します．スクリプトは"Run.d"ディレクトリに置いておきます．スクリプトのファイル名は"拡張子.applescript"です．&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;foo.py ってファイルを編集してる時に実行するとターミナルで python foo.py と実行してくれるとか&lt;/li&gt;
&lt;li&gt;bar.html ってファイルを編集しているときに実行すると Safari で開いてくれるとか&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;基本ターミナル経由&lt;/li&gt;
&lt;li&gt;自分がよく使うもの以外動作確認してない&lt;/li&gt;
&lt;li&gt;一応関連付けたスクリプトを確認してから使ったほうがいいかも&lt;/li&gt;
&lt;li&gt;拡張子一覧&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;applescript&lt;/li&gt;
&lt;li&gt;c&lt;/li&gt;
&lt;li&gt;cc&lt;/li&gt;
&lt;li&gt;cp&lt;/li&gt;
&lt;li&gt;cpp&lt;/li&gt;
&lt;li&gt;cron&lt;/li&gt;
&lt;li&gt;crontab&lt;/li&gt;
&lt;li&gt;cxx&lt;/li&gt;
&lt;li&gt;f&lt;/li&gt;
&lt;li&gt;f90&lt;/li&gt;
&lt;li&gt;go&lt;/li&gt;
&lt;li&gt;html : Safari&lt;/li&gt;
&lt;li&gt;java&lt;/li&gt;
&lt;li&gt;mp&lt;/li&gt;
&lt;li&gt;php&lt;/li&gt;
&lt;li&gt;pl&lt;/li&gt;
&lt;li&gt;py&lt;/li&gt;
&lt;li&gt;rb&lt;/li&gt;
&lt;li&gt;tex : &lt;a href="http://www2.kumagaku.ac.jp/teacher/herogw/"&gt;UpTeX.app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;texi&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;参考&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://macromates.com/"&gt;TextMate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://homepage.mac.com/zenitani/elisp-j.html#smart-compile"&gt;smart-compile&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Hello.^@l.applescript&lt;/b&gt; (ctrl + command + l)&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;ファイルの拡張子に基づいてテンプレートをロードします．テンプレートは"Hello.d"ディレクトリに置いておきます．スクリプトのファイル名は"hello.拡張子"です．&lt;/li&gt;
&lt;li&gt;Hello Worldって出力するテンプレ&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;拡張子一覧&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;applescript&lt;/li&gt;
&lt;li&gt;c&lt;/li&gt;
&lt;li&gt;cpp&lt;/li&gt;
&lt;li&gt;f&lt;/li&gt;
&lt;li&gt;f90&lt;/li&gt;
&lt;li&gt;go&lt;/li&gt;
&lt;li&gt;html&lt;/li&gt;
&lt;li&gt;java&lt;/li&gt;
&lt;li&gt;php&lt;/li&gt;
&lt;li&gt;pl&lt;/li&gt;
&lt;li&gt;py&lt;/li&gt;
&lt;li&gt;rb&lt;/li&gt;
&lt;li&gt;tex&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;参考&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Hello_world_program_examples"&gt;Hello world program examples - Wikipedia, the free encyclopedia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Open Finder.^@o.applescript&lt;/b&gt; (ctrl + command + o)&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;ファイルの場所でファインダーを開きます．&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Open Terminal.^@t.applescript&lt;/b&gt; (ctrl + command + t)&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;ファイルの場所でターミナルを開きます．&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Predefined entity reference.py&lt;/b&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;選択範囲の実体参照を置換します．スクリプトファイルはターミナルで"chmod 755"で実行できるようにしておく必要があります．&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;&lt;b&gt;Artistic Style.sh&lt;/b&gt;&lt;/li&gt;
&lt;ul&gt;&lt;li&gt;選択範囲のC, C++, C#, Javaのソースを整形します．スクリプトファイルはターミナルで"chmod 755"で実行できるようにしておく必要があります．Artistic Style&amp;nbsp;&lt;a href="http://astyle.sourceforge.net/"&gt;http://astyle.sourceforge.net/&lt;/a&gt;&amp;nbsp;が（デフォルトでは/usr/local/binに）インストールされている必要があります．Artistic Styleはhomebrewでインストールしました．&lt;br /&gt;
&lt;blockquote&gt;brew install astyle&amp;nbsp;&lt;/blockquote&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;
vim/emacs/coteditor/etc.で1/4くらいずつつかってるきがする．どれもおぼえらんない．&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-4284550142504688241?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8NcEe5djk1sEtru9I-iy7IWce7o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8NcEe5djk1sEtru9I-iy7IWce7o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8NcEe5djk1sEtru9I-iy7IWce7o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8NcEe5djk1sEtru9I-iy7IWce7o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/11wqk10ksJI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/4284550142504688241/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2012/01/coteditor.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/4284550142504688241?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/4284550142504688241?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/11wqk10ksJI/coteditor.html" title="CotEditorで拡張子に関連付けられた実行ファイルを起動するスクリプトとか" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-VF9NNzcsVi0/Tx5obmLI1pI/AAAAAAAAEuU/bm08nVoRHY4/s72-c/coteditor.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2012/01/coteditor.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEBQ3cyfip7ImA9WhRVFEg.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-4740178213092799681</id><published>2012-01-13T20:03:00.001+09:00</published><updated>2012-01-13T20:04:12.996+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-13T20:04:12.996+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title>PythonでMapReduceっぽいものを実装してみる</title><content type="html">&lt;a href="http://satomacoto.blogspot.com/2012/01/blog-post_13.html"&gt;satomacoto: 青空文庫のルビのマイニングをやり直した&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
MapReduceっぽいものを触ってみたかったのでPythonで実装．参考にしたのは&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Writing An Hadoop MapReduce Program In Python @ Michael G. Noll&lt;br /&gt;
&lt;a href="http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/"&gt;http://www.michael-noll.com/tutorials/writing-an-hadoop-mapreduce-program-in-python/&lt;/a&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
あんま意味ないけどdefaultdictを使ったものと比較．&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;コード&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
以下mapper.pyとreducer.pyのコード．ほぼコピペ．&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1605518.js?file=mapper.py"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;script src="https://gist.github.com/1605518.js?file=reducer.py"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
以下defaultdictのコード．&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1605518.js?file=count_defaultdict.py"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;実行結果&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;a href="https://github.com/downloads/satomacoto/Playground/count.zip"&gt;https://github.com/downloads/satomacoto/Playground/count.zip&lt;/a&gt;&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;pre&gt;% head count.txt
 obscene house ナンバー・ナイン 1
A l'odeur du soleil sur les lavandes douces. もうむらさきにうれているげな 1
Abaisse'〕 アベッセ 4
Autant de pluie autant de tristesse, Paris qui m'oppresse! くさくさするほどあめがふる 1
Aux figuiers qui 〔mu^riront〕, au vent qui passera, みなみのくにではいちじくが 1
Belle-vue de Tombeau ベル・ビュウ・ド・トンボウ 2
Bonjour Monsieur ボンジュール・ムッシュウ 1
But this fold flow'ret climbs the hill この花こそは山にも攀ぢよ 1
Cafe' カフエ 1
Cafe' カツフエ 1
% wc count.txt
  260652  834471 6590672 count.txt&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;速度比較&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;% time cat ruby_rev.txt | python mapper.py | sort -k1,1 | python reducer.py &gt; count_mapreduce.txt
cat ruby_rev.txt  0.00s user 0.07s system 0% cpu 59.480 total
python mapper.py  7.74s user 0.06s system 13% cpu 59.485 total
sort -k1,1  79.92s user 0.43s system 86% cpu 1:33.18 total
python reducer.py &gt; count_mapreduce.txt  10.48s user 0.12s system 11% cpu 1:33.17 total&lt;/pre&gt;&lt;br /&gt;
&lt;pre&gt;% time cat ruby_rev.txt | python count_defaultdict.py | sort -k1,1 &gt; count_defaultdict.txt 
cat ruby_rev.txt  0.00s user 0.07s system 1% cpu 6.228 total
python count_defaultdict.py  6.90s user 0.12s system 98% cpu 7.131 total
sort -k1,1 &gt; count_defaultdict.txt  6.21s user 0.06s system 46% cpu 13.438 total&lt;/pre&gt;&lt;br /&gt;
Hadoopではやってない．つーか入れてない．やってみるか…&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-4740178213092799681?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/V_lG-m3lZHZx3ieKgMkgpPKbtsQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/V_lG-m3lZHZx3ieKgMkgpPKbtsQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/V_lG-m3lZHZx3ieKgMkgpPKbtsQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/V_lG-m3lZHZx3ieKgMkgpPKbtsQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/_xbkXRJ3kI4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/4740178213092799681/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2012/01/pythonmapreduce.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/4740178213092799681?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/4740178213092799681?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/_xbkXRJ3kI4/pythonmapreduce.html" title="PythonでMapReduceっぽいものを実装してみる" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2012/01/pythonmapreduce.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUCQXc8eip7ImA9WhRbEUw.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-1985413651473619319</id><published>2012-01-13T18:36:00.002+09:00</published><updated>2012-02-02T01:21:00.972+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-02T01:21:00.972+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title>青空文庫のルビのマイニングをやり直した</title><content type="html">################&lt;br /&gt;
&lt;br /&gt;
「ヶケ」を漢字として扱っていなかったため，下のファイルでも取り切れていないようです．（&lt;a href="https://twitter.com/#!/POKEPEEK2011"&gt;bun&lt;/a&gt;さんにご指摘頂きました．ありがとうございます．）&lt;br /&gt;
&lt;br /&gt;
################&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://satomacoto.blogspot.com/2012/01/blog-post.html"&gt;ついカッとなって青空文庫からルビをマイニングしてみたものの&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
上のエントリでマイニングしたデータを少しちゃんと見たら，恥ずかしながらちゃんとルビが取れていないところがあったのでやり直しました．ごめんなさい．今度はあってるといいけど．ついでに"ファイル名\t文字\tルビ\n"だと後々使いにくいそうなので，&lt;br /&gt;
&lt;blockquote&gt;作品ID\t人物ID\t文字\tルビ\n&lt;/blockquote&gt;って形式にしました．&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;a href="https://github.com/downloads/satomacoto/Playground/ruby_rev.zip"&gt;https://github.com/downloads/satomacoto/Playground/ruby_rev.zip&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;
UTF-8．凡例含む出てきた順．被りあり．&lt;br /&gt;
&lt;br /&gt;
################&lt;br /&gt;
&lt;br /&gt;
「々仝〆〇ヶ」と「ケ」を漢字扱いにしてルビを抜き出しました．「ヶ原 はら」のような余計なものまで入っているので後処理が必要．&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;a href="https://github.com/downloads/satomacoto/Playground/ruby_rev.zip"&gt;https://github.com/downloads/satomacoto/Playground/ruby_rev3.zip&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;
################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;% head ruby_rev.txt
046658 001257 倦怠 けんたい
046658 001257 玩味 がんみ
046658 001257 倦怠 けんたい
046658 001257 窪地 くぼち
046658 001257 鶉 うずら
046658 001257 啄木鳥 きつつき
046658 001257 叩 たた
046658 001257 漲 みな
046658 001257 栗鼠射 りすう
046658 001257 胡桃 くるみ
% wc ruby_rev.txt
 2212232 9099124 66071554 ruby_rev.txt&lt;/pre&gt;&lt;br /&gt;
どうも&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;青空文庫では漢字扱いの「々」が抜けてた&lt;/li&gt;
&lt;li&gt;注釈つきの文字（「※［＃「火＋稲のつくり」、第4水準2-79-87］みたいなの）」が取れてなかった&lt;/li&gt;
&lt;/ul&gt;っぽいので，ルビを抜き出す正規表現を&lt;br /&gt;
&lt;blockquote&gt;((※［[^］]+?］|[一-龠々])+?|(?&amp;lt;=｜)([^｜]+?))《([^》]+?)》&lt;/blockquote&gt;としました．&lt;br /&gt;
&lt;br /&gt;
どうなんだろうまだ微妙なのかな…正規表現ェ…&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-1985413651473619319?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CEIsHW642HvdjdHe6vGkClq-a44/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CEIsHW642HvdjdHe6vGkClq-a44/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CEIsHW642HvdjdHe6vGkClq-a44/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CEIsHW642HvdjdHe6vGkClq-a44/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/crN5ZNaYQgQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/1985413651473619319/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2012/01/blog-post_13.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/1985413651473619319?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/1985413651473619319?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/crN5ZNaYQgQ/blog-post_13.html" title="青空文庫のルビのマイニングをやり直した" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2012/01/blog-post_13.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QDSHw7fCp7ImA9WhRVFEs.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-5451238058543808792</id><published>2012-01-07T18:01:00.000+09:00</published><updated>2012-01-13T22:29:39.204+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-13T22:29:39.204+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title>ついカッとなって青空文庫からルビをマイニングしてみたものの</title><content type="html">################&lt;br /&gt;
&lt;br /&gt;
下のzipは上手いことルビが取れてないので以下を参照．&lt;br /&gt;
&lt;a href="http://satomacoto.blogspot.com/2012/01/blog-post_13.html"&gt;&lt;b&gt;satomacoto: 青空文庫のルビのマイニングをやり直した&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
################&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://d.hatena.ne.jp/nokuno/20111104/1320358644"&gt;ついカッとなってWikipediaからカッコ表現をマイニングしてみた - nokunoの日記&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
を参考にさせていただき青空文庫のルビを抜き出してみました．なーんも使い道考えてないけど．MLやらNLPやらIMEやらの研究でもサーベイしてみて色々ゴニョゴニョしてみたい．まーでもとりあえずなんか適当に処理して辞書に登録してみて近代の文学者のごとく認《したた》めるかな．&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;a href="https://github.com/downloads/satomacoto/Playground/ruby.zip"&gt;https://github.com/downloads/satomacoto/Playground/ruby.zip&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;
データは&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;ファイル名\t語\tルビ\n&lt;/blockquote&gt;って具合に出てきた順にタブ区切りで出力しました．語のカウントとかしてません．被りあります．凡例の分も出力しちゃってます．&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;% head ruby.txt
1000_ruby_2956.zip 小焦 こじ
1000_ruby_2956.zip 尾 ぴき
1000_ruby_2956.zip 小焦 こじ
1000_ruby_2956.zip 強請 ねだ
1000_ruby_2956.zip 葛飾 かつしか
1000_ruby_2956.zip 堤 どて
1000_ruby_2956.zip 雪洞 ぼんぼり
1000_ruby_2956.zip 堰 せ
1000_ruby_2956.zip 御留川 おとめがわ
1000_ruby_2956.zip 殺生 せっしょう
% wc ruby.txt
 1847315 5750935 65440323 ruby.txt&lt;/pre&gt;&lt;br /&gt;
ルビ表記は&amp;nbsp;&lt;a href="http://ja.wikipedia.org/wiki/%E9%9D%92%E7%A9%BA%E6%96%87%E5%BA%AB"&gt;青空文庫 - Wikipedia&lt;/a&gt;&amp;nbsp;にあるルールに従って抜き出しました．&lt;br /&gt;
&lt;pre&gt;ルビの表記は ｜と《》によって表現される。ルビを《》で囲んだり｜でルビのかかる文字列を特定するのは、視覚障碍者読書支援協会（BBA）の原文入力ルールに合わせたものである。
&lt;blockquote class="tr_bq"&gt;青空｜文庫《ぶんこ》&lt;/blockquote&gt;とあれば、「ぶんこ」というルビが「文庫」についていることを示す。
&lt;blockquote class="tr_bq"&gt;本日は晴天《せいてん》なり。&lt;/blockquote&gt;のように、仮名と漢字の間に｜が入る場合は｜を省略することも出来る。
&lt;blockquote class="tr_bq"&gt;｜ブルースカイ《青空》&lt;/blockquote&gt;のように、仮名にルビを強制的に振る時に使用することもある。&lt;/pre&gt;&lt;br /&gt;
ちなみに「漢字《かんじ》」というパターン以外には&lt;br /&gt;
&lt;pre&gt;1029_ruby_20617.zip 接吻 ベエゼ
1040_ruby_20510.zip 然 きん／＼ぜん
1182_ruby_20549.zip 盡 こと／″＼
1067_ruby_1929.zip Esteros de Patino エステロス・デ・パチニョ
1317_ruby_22263.zip 三たび魔女の呪詛に萎れ毒気に染みぬる ウイズ・ヘキッツ・バン・スライス・プラステッド・スライス・インフェクテッド
1490_ruby.zip 願掛 がんがけ［＃底本では「け」が脱落］
15971_ruby_28461.zip 並木道 ブリ※［＃濁点付き片仮名ワ、1-7-82］ール&lt;/pre&gt;なんてパターンがあります．ほかにもパターンあると思う．漢字側に注があるのもあった．あとでなんとかするか．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
以下抽出した手順のメモ．Lion．要wget（←brew install wget）．&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;手順メモ&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;青空文庫リストCSVのダウンロード&lt;br /&gt;
&lt;br /&gt;
青空文庫の&lt;a href="http://www.aozora.gr.jp/index_pages/person_all.html"&gt;このページ&lt;/a&gt;の"「公開中　作家別作品一覧拡充版：全て(CSV形式、zip圧縮）」をダウンロード"からリストをダウンロードして解凍するとCSVファイルが．Shift_JISなのでUTF-8に変換しておく（別に変換しなくても大丈夫だけど）．適当にディレクトリ掘ってから．&lt;br /&gt;
&lt;blockquote&gt;wget http://www.aozora.gr.jp/index_pages/list_person_all_extended.zip&lt;br /&gt;
unzip list_person_all_extended.zip&lt;br /&gt;
iconv -f Shift_JIS -t UTF-8 &amp;lt; list_person_all_extended.csv &amp;gt; list_person_all_extended_utf-8.csv&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;テキストファイルURLの抽出&lt;br /&gt;
&lt;br /&gt;
ダウンロードするためにテキストファイルのURLの列だけ抜き出して保存．&lt;br /&gt;
&lt;blockquote&gt;python urls.py list_person_all_extended_utf-8.csv &amp;gt; urls.txt&lt;/blockquote&gt;&lt;script src="https://gist.github.com/1575291.js?file=urls.py"&gt;
&lt;/script&gt;&lt;/li&gt;
&lt;li&gt;テキストファイルのダウンロード&lt;br /&gt;
&lt;br /&gt;
"zip"フォルダをつくって，そこにテキストのzipファイルをwgetでダウンロード．&lt;br /&gt;
&lt;blockquote&gt;mkdir zip&lt;br /&gt;
wget -i urls.txt -P zip&lt;/blockquote&gt;&lt;/li&gt;
&lt;li&gt;ルビの抽出&lt;br /&gt;
&lt;br /&gt;
上のルールに従いルビを抽出．エラー起こっちゃったときは無視してるので，すべてのテキストに対してルビを取り出せているわけじゃない．&lt;br /&gt;
&lt;blockquote&gt;python ruby.py 'zip/*.zip' &amp;gt; ruby.txt&lt;/blockquote&gt;&lt;script src="https://gist.github.com/1575291.js?file=ruby.py"&gt;
&lt;/script&gt;&lt;/li&gt;
&lt;li&gt;（おまけ）ルビがひらがな（と'・'と'ー'）だけのもの&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1575291.js?file=hira.py"&gt;
&lt;/script&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;b&gt;わかんないこと&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;そもそもどうやって辞書に登録するんだろう？まとめてできんのかな？品詞どーすればいい？つーか既に辞書にある語もあるような．全部登録していいのかな？記号関連どうすんだろ？&lt;/li&gt;
&lt;li&gt;文語体⇔口語体，何とかできんのかな？音便やらの仮名遣パターンあるのかな？&lt;/li&gt;
&lt;li&gt;普通は「漢字《かんじ》」だけどそれ以外のも結構ある．おもしれーからむしろこっちをゴニョゴニョしてみるかな？&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
IME関連の研究おもしろそうだよなー&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-5451238058543808792?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pJ_PdfvDqD3WMakmbnjMgiQdbqM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pJ_PdfvDqD3WMakmbnjMgiQdbqM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pJ_PdfvDqD3WMakmbnjMgiQdbqM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pJ_PdfvDqD3WMakmbnjMgiQdbqM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/Od_tS6I_iYY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/5451238058543808792/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2012/01/blog-post.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/5451238058543808792?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/5451238058543808792?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/Od_tS6I_iYY/blog-post.html" title="ついカッとなって青空文庫からルビをマイニングしてみたものの" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2012/01/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UCQX4yfSp7ImA9WhRVEk0.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-2456373071479550825</id><published>2012-01-06T00:29:00.000+09:00</published><updated>2012-01-10T22:14:20.095+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T22:14:20.095+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Statistics" /><category scheme="http://www.blogger.com/atom/ns#" term="SciPy" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title>Pythonでカーネル主成分分析を実装してみる</title><content type="html">カーネル主成分分析(Kernel principal component analysis; kernel PCA)はその名のとおりカーネルを使って&lt;a href="http://en.wikipedia.org/wiki/Principal_component_analysis"&gt;主成分分析&lt;/a&gt;(PCA)を行う手法．カーネルっていうのは距離みたいなもん（→&lt;a href="http://en.wikipedia.org/wiki/Kernel_trick"&gt;Kernel trick - Wikipedia&lt;/a&gt;）．線形主成分分析はデータが元の変数のベクトルの線形結合で表されてるとしているけど，そうでもないときもあるよねってことで，非線形写像して主成分分析する．分散共分散行列の代わりに，各データ間のカーネルを要素とするカーネル行列の固有値固有ベクトルを求めるってこと．&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/Kernel_principal_component_analysis"&gt;Kernel pricipal component analysis - Wikipedia&lt;/a&gt;に載ってる画像っぽいのをつくってやってみた．つくったデータ→&lt;br /&gt;
&lt;blockquote&gt;&lt;a href="https://raw.github.com/gist/1565631/b3f3d392e2d9f3341203d345584b4adbc5e5dc0a/kpca.data"&gt;kpca.data&lt;/a&gt;&lt;/blockquote&gt;"x1 x2 class\n"．3つのクラス．各クラス100個ずつ．&lt;br /&gt;
&lt;br /&gt;
元データの描画．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/--GXOxB5FSpY/TwW9nDYTaRI/AAAAAAAAEoI/FtXIpz9v6l8/s1600/before.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="400" src="http://3.bp.blogspot.com/--GXOxB5FSpY/TwW9nDYTaRI/AAAAAAAAEoI/FtXIpz9v6l8/s400/before.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
カーネルは2通り試してみた．固有値大きい方から2つ取り出して固有ベクトルの要素の値をプロット．&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;その1&lt;/b&gt; 多項式カーネル&lt;br /&gt;
&lt;blockquote&gt;$$k({\mathbf x},{\mathbf y}) = ({\mathbf x}'{\mathbf y} + 1)^2$$&lt;/blockquote&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-DA-xlui9wCU/TwW9wajJ4rI/AAAAAAAAEoU/9FT4P7uasbQ/s1600/no1.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="400" src="http://2.bp.blogspot.com/-DA-xlui9wCU/TwW9wajJ4rI/AAAAAAAAEoU/9FT4P7uasbQ/s400/no1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;その2&lt;/b&gt; ガウシアンカーネル&lt;br /&gt;
&lt;blockquote&gt;$$k({\bf x},{\bf y}) = \exp \left( \frac{- ||{\bf x} - {\bf y}|| ^2}{2\sigma^2}\right)$$&lt;/blockquote&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-sE8er-4eAbk/TwW9_uPmJeI/AAAAAAAAEog/ghh8jBs602c/s1600/no2.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="400" src="http://4.bp.blogspot.com/-sE8er-4eAbk/TwW9_uPmJeI/AAAAAAAAEog/ghh8jBs602c/s400/no2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
以下実装．要numpy，matplotlib．&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1565631.js?file=kpca.py"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
距離（非類似度）行列の固有値固有ベクトル求めて描画するのは&lt;a href="http://satomacoto.blogspot.com/2012/01/python.html"&gt;MDSっぽい&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-2456373071479550825?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0Uzp12MlKcwJPegriaSRzkS9McU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0Uzp12MlKcwJPegriaSRzkS9McU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0Uzp12MlKcwJPegriaSRzkS9McU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0Uzp12MlKcwJPegriaSRzkS9McU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/DGlZPlU4pto" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/2456373071479550825/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2012/01/python_06.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/2456373071479550825?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/2456373071479550825?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/DGlZPlU4pto/python_06.html" title="Pythonでカーネル主成分分析を実装してみる" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/--GXOxB5FSpY/TwW9nDYTaRI/AAAAAAAAEoI/FtXIpz9v6l8/s72-c/before.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2012/01/python_06.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MEQ3k7fyp7ImA9WhRVEk0.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-2712515229435820793</id><published>2012-01-05T17:15:00.000+09:00</published><updated>2012-01-10T22:16:42.707+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-10T22:16:42.707+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Statistics" /><category scheme="http://www.blogger.com/atom/ns#" term="SciPy" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title>Pythonで多次元尺度構成法を実装してみる</title><content type="html">多次元尺度構成法(Multidimensional scaling; MDS)は多変量解析の手法です．よくデータ間の（非）類似度の情報可視化に用いられます．MDSは基本的には似ているものは近くに，似ていないものは遠くに配置するような座標を求めます．ここでは古典的（計量的; metric）MDSをPythonで実装してみます．&lt;br /&gt;
&lt;br /&gt;
古典的MDSは以下の手順で可視化．実装に必要なところのみ．&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;要素の値が距離の2乗と見なせる非類似度行列Sを用意する&lt;/li&gt;
&lt;li&gt;Sにヤング・ハウスホルダー変換を施してPとする&lt;/li&gt;
&lt;li&gt;Pをスペクトル分解する（固有値・固有ベクトルを求める）&lt;/li&gt;
&lt;li&gt;固有値の大きい方から2~3個選び，対応する固有ベクトルを取り出す&lt;/li&gt;
&lt;li&gt;各固有ベクトルの要素値をプロットする（2個の固有ベクトルの時は2次元，3個の固有ベクトルの時は3次元）&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
一応，下部に参考リンクを挙げましたが，詳しい説明は検索すれば山ほど…．ヤング・ハウスホルダー変換は距離の2乗の行列に両側から中心化行列をかける演算のことらしいです．中心化行列は距離の基準の原点を重心に移動するための行列らしいです．&lt;br /&gt;
&lt;br /&gt;
ヤング・ハウスホルダー変換:&lt;br /&gt;
SがN×N行列のとき&lt;br /&gt;
&lt;blockquote&gt;$$P = -\frac{1}{2}({\bf I}-\frac{1}{n}{\bf 11}')S({\bf I}-\frac{1}{n}{\bf 11}')$$&lt;/blockquote&gt;と計算します．&lt;b&gt;1&lt;/b&gt;は要素がすべて1のN次ベクトル[1,...,1]'です．なので&lt;b&gt;11&lt;/b&gt;'は要素がすべて1のN×N行列．&lt;br /&gt;
&lt;br /&gt;
アメリカの空港間の距離が与えられているときMDSで可視化してみます．&lt;br /&gt;
&lt;pre&gt;atl   chi   den   hou    la    mi    ny    sf   sea    dc
atl     0
chi   587     0
den  1212   920     0
hou   701   940   879     0
 la  1936  1745   831  1374     0
 mi   604  1188  1726   968  2339     0
 ny   748   713  1631  1420  2451  1092     0
 sf  2139  1858   949  1645   347  2594  2571     0
sea  2182  1737  1021  1891   959  2734  2408   678     0
 dc   543   597  1494  1220  2300   923   205  2442  2329     0
&lt;/pre&gt;&lt;br /&gt;
以下コード．要numpy, matplotlib．&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1564312.js"&gt; &lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
結果はこんなかんじ．ラベルは手作業で付けました．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-VohISJtjw8k/TwVidMLSrhI/AAAAAAAAEn8/p5dPrL6U4II/s1600/result.png" imageanchor="1"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-VohISJtjw8k/TwVidMLSrhI/AAAAAAAAEn8/p5dPrL6U4II/s400/result.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
ちなみに実際の位置はこんなかんじ．&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;iframe frameborder="0" height="350" marginheight="0" marginwidth="0" scrolling="no" src="http://maps.google.com/maps/ms?msid=216926479303536272762.0004b5c322ee112a7eec0&amp;amp;msa=0&amp;amp;ie=UTF8&amp;amp;t=m&amp;amp;vpsrc=6&amp;amp;ll=40.979898,-96.328125&amp;amp;spn=46.058485,74.707031&amp;amp;z=3&amp;amp;output=embed" width="425"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;small&gt;View &lt;a href="http://maps.google.com/maps/ms?msid=216926479303536272762.0004b5c322ee112a7eec0&amp;amp;msa=0&amp;amp;ie=UTF8&amp;amp;t=m&amp;amp;vpsrc=6&amp;amp;ll=40.979898,-96.328125&amp;amp;spn=46.058485,74.707031&amp;amp;z=3&amp;amp;source=embed" style="color: blue; text-align: left;"&gt;US 10 Airport&lt;/a&gt; in a larger map&lt;/small&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;
結果を180度回転すればだいたいなんとなくあってるかな？&lt;br /&gt;
&lt;br /&gt;
上の例では非類似度行列を実際の距離の行列としましたが，MDSはデータ間の非類似度を測ることができたらそれっぽく2次元(3次元)にマッピングできるよ，ってことなので色々使えるかも知れません．&lt;br /&gt;
&lt;br /&gt;
ちなみにRだったら&lt;i&gt;cmdscale&lt;/i&gt;でMDSが実装されてて楽&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://ja.wikipedia.org/wiki/%E5%A4%9A%E6%AC%A1%E5%85%83%E5%B0%BA%E5%BA%A6%E6%A7%8B%E6%88%90%E6%B3%95"&gt;多次元尺度構成法 - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Multidimensional_scaling"&gt;Multidimensional scaling - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lbm.ab.a.u-tokyo.ac.jp/~omori/similar_visual.html"&gt;類似度の視覚化(類似度による庭景観写真の評価) / visualize similarlity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.philender.com/courses/multivariate/notes/mds.html"&gt;Multidimensional Scaling&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-2712515229435820793?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-SdNB65vxymMlRo8w4pYmk2s3ps/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-SdNB65vxymMlRo8w4pYmk2s3ps/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-SdNB65vxymMlRo8w4pYmk2s3ps/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-SdNB65vxymMlRo8w4pYmk2s3ps/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/bd-fXzREYXg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/2712515229435820793/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2012/01/python.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/2712515229435820793?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/2712515229435820793?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/bd-fXzREYXg/python.html" title="Pythonで多次元尺度構成法を実装してみる" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-VohISJtjw8k/TwVidMLSrhI/AAAAAAAAEn8/p5dPrL6U4II/s72-c/result.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2012/01/python.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQARXY5cCp7ImA9WhRWE04.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-2366185204063323514</id><published>2011-12-31T22:32:00.000+09:00</published><updated>2011-12-31T22:32:24.828+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-31T22:32:24.828+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Blogger" /><title>LaTeX形式で記述した数式の画像を埋め込むBloggerガジェット</title><content type="html">Bloggerで数式を表示させるために&lt;a href="http://satomacoto.blogspot.com/2010/09/urlchrome-extension.html"&gt;以前つくったChrome Extension&lt;/a&gt;を使っていたのですが，再利用性を考慮して，LaTeX形式で記述された数式をBloggerで表示するためのHTML/Javascriptガジェットを作ってみました．ガジェットの設定の仕方は&lt;a href="http://satomacoto.blogspot.com/2011/11/gistblogger.html"&gt;こちらの記事&lt;/a&gt;の下の方に．jQueryが読み込まれている必要があります．&lt;br /&gt;
&lt;br /&gt;
レンダリングには Infographics / Google Chart API の &lt;a href="http://code.google.com/apis/chart/infographics/docs/formulas.html"&gt;Mathematical Formulas&lt;/a&gt; を利用しています．&lt;br /&gt;
&lt;br /&gt;
以下のコードを貼付けます．使い方はコード中のコメントの通りです．クラス名が他とバッティングするようならば，変更したほうが良いかもしれません．&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1523083.js"&gt; &lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;div class="equation"&gt;ax^2 + bx + c = 0&lt;br /&gt;
x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}&lt;br /&gt;
&lt;/div&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-2366185204063323514?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yrdBryv70NER1W4Nyv6kWVwYIbg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yrdBryv70NER1W4Nyv6kWVwYIbg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yrdBryv70NER1W4Nyv6kWVwYIbg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yrdBryv70NER1W4Nyv6kWVwYIbg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/_87YPB4Wolc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/2366185204063323514/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2011/12/latexblogger.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/2366185204063323514?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/2366185204063323514?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/_87YPB4Wolc/latexblogger.html" title="LaTeX形式で記述した数式の画像を埋め込むBloggerガジェット" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2011/12/latexblogger.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUADR3w6fip7ImA9WhRXFEU.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-4380939377216395771</id><published>2011-12-03T14:44:00.001+09:00</published><updated>2011-12-22T02:16:16.216+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-22T02:16:16.216+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SciPy" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title>Pythonで線形計画法を解いてみる</title><content type="html">&lt;br /&gt;
線形計画法（Linear Programming; LP or linear optimization）は，目的関数も制約関数も線形であるときの最適化問題を解く手法です．SciPy + GLPK + CVXOPT + OpenOpt + FuncDesignerで実装されているのを使ってみました．説明は&lt;a href="http://en.wikipedia.org/wiki/Linear_programming"&gt;Wikipedia&lt;/a&gt;から抜粋．&lt;br /&gt;
&lt;br /&gt;
線形計画法は以下のようにある制約関数のもとである目的関数を最大化あるいは最小化するもの．&lt;br /&gt;
&lt;br /&gt;
maximize or minimize （目的関数）&lt;br /&gt;
&lt;blockquote&gt;&lt;img alt="{\b c}^T {\b x}" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cb%20c%7D%5ET%20%7B%5Cb%20x%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;/blockquote&gt;subject to （制約関数）&lt;br /&gt;
&lt;blockquote&gt;&lt;img alt="{\mb A}{\b x} \le {\b b}" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cmb%20A%7D%7B%5Cb%20x%7D%20%5Cle%20%7B%5Cb%20b%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;br /&gt;
&lt;img alt="{\b x} \ge {\b 0}" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cb%20x%7D%20%5Cge%20%7B%5Cb%200%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;/blockquote&gt;xは変数，A,b,cは係数．制約関数の形が凸多面体であるので目的関数は最適化可能．&lt;br /&gt;
&lt;br /&gt;
たとえば&lt;br /&gt;
&lt;blockquote&gt;ある農夫がL [km^2]の広さの農地を持っているとき小麦と大麦を育てて売上を最大化させたい．農夫は肥料をF [kg]と農薬をP [kg]だけ持っている．小麦を育てるためには肥料F&lt;sub&gt;1&lt;/sub&gt;&amp;nbsp;[kg/km^2]と農薬P&lt;sub&gt;1&lt;/sub&gt;&amp;nbsp;[kg/km^2]が必要である．一方，大麦を育てるためには肥料F&lt;sub&gt;2&lt;/sub&gt;&amp;nbsp;[kg/km^2]と農薬P&lt;sub&gt;2&lt;/sub&gt;&amp;nbsp;[kg/km^2]が必要である．それぞれの売値が小麦S&lt;sub&gt;1&lt;/sub&gt;[yen/kg]，大麦S&lt;sub&gt;2&lt;/sub&gt;[yen/kg]だとすると，売上を最大化するためにはどのように農地を振り分ければいいでしょう？&lt;/blockquote&gt;&lt;br /&gt;
という問題を線形計画法で表すと&lt;br /&gt;
&lt;br /&gt;
Maximize:&lt;br /&gt;
&lt;blockquote&gt;S&lt;sub&gt;1&lt;/sub&gt;x&lt;sub&gt;1&lt;/sub&gt;&amp;nbsp;+ S&lt;sub&gt;2&lt;/sub&gt;x&lt;sub&gt;2&lt;/sub&gt;&lt;/blockquote&gt;Subject to:&lt;br /&gt;
&lt;blockquote&gt;0 ≤ x&lt;sub&gt;1&lt;/sub&gt;&amp;nbsp;+ x&lt;sub&gt;2&lt;/sub&gt;&amp;nbsp;≤ L&lt;br /&gt;
0 ≤ F&lt;sub&gt;1&lt;/sub&gt;x&lt;sub&gt;1&lt;/sub&gt;&amp;nbsp;+ F&lt;sub&gt;2&lt;/sub&gt;x&lt;sub&gt;2&lt;/sub&gt;&amp;nbsp;≤ F&lt;br /&gt;
0 ≤ P&lt;sub&gt;1&lt;/sub&gt;x&lt;sub&gt;1&lt;/sub&gt;&amp;nbsp;+ P&lt;sub&gt;2&lt;/sub&gt;x&lt;sub&gt;2&lt;/sub&gt;&amp;nbsp;≤ P&lt;br /&gt;
x&lt;sub&gt;1&lt;/sub&gt;&amp;nbsp;≥ 0, x&lt;sub&gt;2&lt;/sub&gt;&amp;nbsp;≥ 0&lt;/blockquote&gt;&lt;br /&gt;
これを行列形式で書くと&lt;br /&gt;
&lt;br /&gt;
Maximize&lt;br /&gt;
&lt;blockquote&gt;&lt;img alt="\left[\begin{array}{cc}S_1 &amp;amp; S_2 \\\end{array}\right]\left[\begin{array}{c}x_1 \\x_2\end{array}\right]" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%5Cleft%5B%0A%5Cbegin%7Barray%7D%7Bcc%7D%0AS_1%20%26%20S_2%20%5C%5C%0A%5Cend%7Barray%7D%0A%5Cright%5D%0A%5Cleft%5B%0A%5Cbegin%7Barray%7D%7Bc%7D%0Ax_1%20%5C%5C%0Ax_2%0A%5Cend%7Barray%7D%0A%5Cright%5D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;/blockquote&gt;Subject to&lt;br /&gt;
&lt;blockquote&gt;&lt;img src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%5Clef%5B%0A%5Cbeg%7Ba%7D%7Bc%7D%0A0%5C%5C%0A0%5C%5C%0A0%0A%5Cend%7Ba%7D%0A%5Cright%5D%0A%5Cle%0A%5Clef%5B%0A%5Cbeg%7Ba%7D%7Bcc%7D%0A1%261%5C%5C%0AF_1%26F_2%5C%5C%0AP_1%26P_2%0A%5Cend%7Ba%7D%0A%5Cright%5D%0A%5Clef%5B%0A%5Cbeg%7Ba%7D%7Bc%7D%0Ax_1%5C%5C%0Ax_2%0A%5Cend%7Ba%7D%0A%5Cright%5D%0A%5Cle%0A%5Clef%5B%0A%5Cbeg%7Ba%7D%7Bc%7D%0AL%5C%5C%0AF%5C%5C%0AP%0A%5Cend%7Ba%7D%0A%5Cright%5D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;br /&gt;
&lt;img alt="\lef[\beg{a}{c}x_1\\x_2\end{a}\right]\ge\lef[\beg{a}{c}0\\0\end{a}\right]" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%5Clef%5B%0A%5Cbeg%7Ba%7D%7Bc%7D%0Ax_1%5C%5C%0Ax_2%0A%5Cend%7Ba%7D%0A%5Cright%5D%0A%5Cge%0A%5Clef%5B%0A%5Cbeg%7Ba%7D%7Bc%7D%0A0%5C%5C%0A0%0A%5Cend%7Ba%7D%0A%5Cright%5D%0A&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;/blockquote&gt;&lt;br /&gt;
となる．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;準備&lt;/h4&gt;&lt;br /&gt;
環境はMac OS X 10.7 (Lion)．要&lt;a href="http://itunes.apple.com/us/app/xcode/id448457090?mt=12"&gt;XCode 4.2&lt;/a&gt;，&lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt;，&lt;a href="http://mxcl.github.com/homebrew/"&gt;Homebrew&lt;/a&gt;，&lt;a href="http://pypi.python.org/pypi/setuptools"&gt;setuptools&lt;/a&gt;．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;SciPy&lt;/b&gt;&amp;nbsp;&lt;a href="http://fonnesbeck.github.com/ScipySuperpack/"&gt;http://fonnesbeck.github.com/ScipySuperpack/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
以下を実行．&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;git clone git://github.com/fonnesbeck/ScipySuperpack&lt;br /&gt;
cd ScipySuperpack&lt;br /&gt;
sh install_superpack.sh&lt;/blockquote&gt;Are you installing from a repository from this machine?にはyと答える．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;&lt;b&gt;GLPK (GNU Linear Programming Kit)&lt;/b&gt;&amp;nbsp;&lt;a href="http://www.gnu.org/software/glpk/"&gt;http://www.gnu.org/software/glpk/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
GLPK(Gnu Linear Programming Kit)は，線形計画問題(LP)や混合整数計画問題(MIP)を解くためのソルバー．GNU GPL．Homebrewを使ってインストール．&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;sudo brew install glpk&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;CVXOPT&lt;/b&gt;&amp;nbsp;&lt;a href="http://abel.ee.ucla.edu/cvxopt/download/index.html"&gt;http://abel.ee.ucla.edu/cvxopt/download/index.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
CVXOPTはPythonの凸最適化(convex optimization)のためのパッケージ．&lt;a href="http://www.sagemath.org/"&gt;sage&lt;/a&gt;でも利用可．GNU GPL．左のメニューのDownloadを選び，Installation from sourceのPython 2.5+をダウンロードして./srcのsetup.pyのBUILD_GLPKを0から1に書き換え，&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;# Set to 1 if you are installing the glpk module.&lt;br /&gt;
BUILD_GLPK = 1&lt;/blockquote&gt;以下を実行．&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;sudo setup.py install&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;OpenOpt + FuncDesigner&lt;/b&gt;&amp;nbsp;&lt;a href="http://www.openopt.org/Install"&gt;http://www.openopt.org/Install&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
OpenOptは数値最適化フレームワーク．自前のソルバーに加え，複数のソルバーが使える．BSD．以下を実行．&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;sudo easy_install openopt&lt;br /&gt;
sudo easy_install FuncDesigner&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;実装&lt;/h4&gt;&lt;br /&gt;
上の問題でS&lt;sub&gt;1&lt;/sub&gt;=3, S&lt;sub&gt;2&lt;/sub&gt;=2, L=5,&amp;nbsp;F&lt;sub&gt;1&lt;/sub&gt;=1,&amp;nbsp;F&lt;sub&gt;2&lt;/sub&gt;=3, F=10,&amp;nbsp;P&lt;sub&gt;1&lt;/sub&gt;=2,&amp;nbsp;P&lt;sub&gt;2&lt;/sub&gt;=1, P=9とした線形計画法を解いてみる．&lt;br /&gt;
&lt;br /&gt;
Maximize:&lt;br /&gt;
&lt;blockquote&gt;3x&lt;sub&gt;1&lt;/sub&gt;&amp;nbsp;+ 2x&lt;sub&gt;2&lt;/sub&gt;&lt;/blockquote&gt;Subject to:&lt;br /&gt;
&lt;blockquote&gt;0 ≤ x&lt;sub&gt;1&lt;/sub&gt;&amp;nbsp;+ x&lt;sub&gt;2&lt;/sub&gt;&amp;nbsp;≤ 5&lt;br /&gt;
0 ≤ x&lt;sub&gt;1&lt;/sub&gt;&amp;nbsp;+ 3x&lt;sub&gt;2&lt;/sub&gt;&amp;nbsp;≤ 10&lt;br /&gt;
0 ≤ 2x&lt;sub&gt;1&lt;/sub&gt;&amp;nbsp;+ x&lt;sub&gt;2&lt;/sub&gt;&amp;nbsp;≤ 9&lt;br /&gt;
x&lt;sub&gt;1&lt;/sub&gt;&amp;nbsp;≥ 0, x&lt;sub&gt;2&lt;/sub&gt;&amp;nbsp;≥ 0&lt;/blockquote&gt;&lt;br /&gt;
コード&lt;br /&gt;
&lt;script src="https://gist.github.com/1506745.js"&gt;
 
&lt;/script&gt;&lt;br /&gt;
結果&lt;br /&gt;
&lt;blockquote&gt;------------------------- OpenOpt 0.36 -------------------------&lt;br /&gt;
solver: glpk   problem: unnamed    type: LP   goal: max&lt;br /&gt;
iter   objFunVal   log10(maxResidual)   &lt;br /&gt;
0  -0.000e+00            -100.00 &lt;br /&gt;
GLPK Simplex Optimizer, v4.47&lt;br /&gt;
3 rows, 2 columns, 6 non-zeros&lt;br /&gt;
Preprocessing...&lt;br /&gt;
3 rows, 2 columns, 6 non-zeros&lt;br /&gt;
Scaling...&lt;br /&gt;
A: min|aij| =  1.000e+00  max|aij| =  3.000e+00  ratio =  3.000e+00&lt;br /&gt;
Problem data seem to be well scaled&lt;br /&gt;
Constructing initial basis...&lt;br /&gt;
Size of triangular part = 3&lt;br /&gt;
*     0: obj =   0.000000000e+00  infeas =  0.000e+00 (0)&lt;br /&gt;
*     2: obj =  -1.400000000e+01  infeas =  0.000e+00 (0)&lt;br /&gt;
OPTIMAL SOLUTION FOUND&lt;br /&gt;
1  1.400e+01            -100.00 &lt;br /&gt;
istop: 1000 (optimal)&lt;br /&gt;
Solver:   Time Elapsed = 0.01  CPU Time Elapsed = 0.006718&lt;br /&gt;
objFunValue: 14 (feasible, MaxResidual = 0)&lt;br /&gt;
(4.0, 1.0)&lt;/blockquote&gt;最適解はx&lt;sub&gt;1&lt;/sub&gt;=4.0 x&lt;sub&gt;2&lt;/sub&gt;=1.0のとき14であることがわかりました．&lt;br /&gt;
&lt;br /&gt;
確認のためにGoogleを使ってグラフで描画してみます．制約条件が&lt;span style="color: #006ae0;"&gt;青&lt;/span&gt;，&lt;span style="color: red;"&gt;赤&lt;/span&gt;，&lt;span style="color: #ff8f00;"&gt;黄&lt;/span&gt;．目的関数が&lt;span style="color: #009a0a;"&gt;緑&lt;/span&gt;．最大化なら目的関数はなるべく右上の方に持っていきたい．ちょうど青と黄の交点が最適解(4,1)になっていることがわかります．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://www.google.com/search?q=5-x%2C10%2F3-1%2F3*x%2C9-2*x%2C7-3%2F2*x" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/--CuMBZlVULY/TvIMq-UzrgI/AAAAAAAAEns/O8VRosfFaPo/s1600/graph.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
今回はだいぶ簡単な例題を扱いましたが，OpenOptではもっと大規模なもの扱えるようです．またOpenOptでは線形計画法のみならず，二次計画法(QP)や非線形計画法(NLP)など様々な最適化問題が解けるようです．&lt;a href="http://www.scipy.org/Cookbook"&gt;Cookbook&lt;/a&gt;にOpenOptやFuncDesingerで扱えるサンプルがまとまっているようです．あ，っていうか&lt;a href="http://scikits.appspot.com/"&gt;SciKit&lt;/a&gt;のほうを使ってみればよかったか…？&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-4380939377216395771?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/o0jarIVq7lHBNpdyuQ5g7J5CqC0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o0jarIVq7lHBNpdyuQ5g7J5CqC0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/o0jarIVq7lHBNpdyuQ5g7J5CqC0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o0jarIVq7lHBNpdyuQ5g7J5CqC0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/Ae5GdfyfXmE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/4380939377216395771/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2011/12/python.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/4380939377216395771?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/4380939377216395771?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/Ae5GdfyfXmE/python.html" title="Pythonで線形計画法を解いてみる" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/--CuMBZlVULY/TvIMq-UzrgI/AAAAAAAAEns/O8VRosfFaPo/s72-c/graph.png" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2011/12/python.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UHSHw_fyp7ImA9WhRXGU0.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-4864866888054902448</id><published>2011-11-28T21:33:00.000+09:00</published><updated>2011-12-26T23:20:39.247+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-26T23:20:39.247+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GitHub" /><category scheme="http://www.blogger.com/atom/ns#" term="Blogger" /><title>Gistで書いたコードを行番号つきでBloggerに埋め込む</title><content type="html">Gistを使えば簡単なコード断片を管理して他の人と共有できるらしい（いまさら）．gitレポジトリなので色々gitっぽく使えるらしい．Gistで書いたコードをBloggerに埋め込んでみる．&lt;br /&gt;
&lt;br /&gt;
Gistでコードを書いて保存して，&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-kkcdfywh1gc/TtOBoCQT_5I/AAAAAAAAD_Q/-AbrKx_UehE/s1600/gist.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="295" src="http://4.bp.blogspot.com/-kkcdfywh1gc/TtOBoCQT_5I/AAAAAAAAD_Q/-AbrKx_UehE/s320/gist.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
embedをクリックするとスクリプトのリンク表示されるのでコピーして，&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-2Cj6d0Yhljk/TtOBnS-Dz2I/AAAAAAAAD_M/PTk2TM-Txsk/s1600/gist_embed.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="147" src="http://3.bp.blogspot.com/-2Cj6d0Yhljk/TtOBnS-Dz2I/AAAAAAAAD_M/PTk2TM-Txsk/s320/gist_embed.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
HTMLモードで編集して貼り付ける．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-z4MNN5rCHiI/TtOB8ri-F1I/AAAAAAAAD_c/4zIH_-lP82M/s1600/gist_html.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="205" src="http://1.bp.blogspot.com/-z4MNN5rCHiI/TtOB8ri-F1I/AAAAAAAAD_c/4zIH_-lP82M/s320/gist_html.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
すると以下のように表示されます．&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1400223.js?file=hello.py"&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
デフォルトだと行番号は表示されないので．表示させるために &lt;a href="https://gist.github.com/454771"&gt;https://gist.github.com/454771&lt;/a&gt; を参考にBloggerのレイアウトに以下のHTML/Javascriptガジェットを追加しました．（※他の場所でjQueryが読み込まれている必要があります．&lt;strike&gt;なんか番号のふられ方微妙だから後で直すかな…&lt;/strike&gt;直して行番号は選択されないようにしました）&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-zO-mXqTbAqM/TtOGgRCHYUI/AAAAAAAAD_w/s2XDl4Ww2Ps/s1600/gist-1.png" imageanchor="1"&gt;&lt;img border="0" height="86" src="http://2.bp.blogspot.com/-zO-mXqTbAqM/TtOGgRCHYUI/AAAAAAAAD_w/s2XDl4Ww2Ps/s320/gist-1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;script src="https://gist.github.com/1400302.js?file=gistfile1.html"&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
追記&lt;br /&gt;
&lt;br /&gt;
without jQuery&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1521244.js"&gt; &lt;/script&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-4864866888054902448?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9qE8FMJM9ZQ8xARCMktdCVGqPj8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9qE8FMJM9ZQ8xARCMktdCVGqPj8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9qE8FMJM9ZQ8xARCMktdCVGqPj8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9qE8FMJM9ZQ8xARCMktdCVGqPj8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/bteyucadyls" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/4864866888054902448/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2011/11/gistblogger.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/4864866888054902448?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/4864866888054902448?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/bteyucadyls/gistblogger.html" title="Gistで書いたコードを行番号つきでBloggerに埋め込む" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-kkcdfywh1gc/TtOBoCQT_5I/AAAAAAAAD_Q/-AbrKx_UehE/s72-c/gist.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2011/11/gistblogger.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEAQ3gzfSp7ImA9WhRREE8.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-4042876698677061856</id><published>2011-11-23T14:13:00.001+09:00</published><updated>2011-11-23T14:37:22.685+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-23T14:37:22.685+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="DIY" /><title>ヘッドホンのステレオミニプラグの交換</title><content type="html">SENNHEISER HD228の右が聞こえなくなりました．そこで秋月電子でステレオ・ミニプラグを買ってきて修理しました．&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;やり方は「3.5ステレオミニプラグ製作例」とか「How to replace a headphone jack」とかで検索&lt;/li&gt;
&lt;li&gt;ミニプラグは秋月で¥90&lt;/li&gt;
&lt;li&gt;HD228はeBayで$36&lt;/li&gt;
&lt;li&gt;リッツ線はライターで炙る&lt;/li&gt;
&lt;li&gt;赤は右，青は左，金はGND&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;a href="http://akizukidenshi.com/catalog/g/gC-02402/"&gt;秋月電子 3.5mmΦステレオ・ミニプラグ（金属タイプ）&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.amazon.co.jp/gp/product/B001UE6HZM/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=satomacoto-22&amp;amp;linkCode=as2&amp;amp;camp=247&amp;amp;creative=7399&amp;amp;creativeASIN=B001UE6HZM"&gt;SENNHEISER 密閉型ヘッドフォン HD 228&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.jp/e/ir?t=satomacoto-22&amp;amp;l=as2&amp;amp;o=9&amp;amp;a=B001UE6HZM" style="border: none !important; margin: 0px !important;" width="1" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-EBtTApi-URo/TsofTap1YyI/AAAAAAAAD2c/8-C3oiz0ha0/s1600/2011-11-21+17.02.39.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="233" src="http://1.bp.blogspot.com/-EBtTApi-URo/TsofTap1YyI/AAAAAAAAD2c/8-C3oiz0ha0/s320/2011-11-21+17.02.39.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;before&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-R5WGAuFzsKw/TsofTWFQyLI/AAAAAAAAD2U/aPiAlhzNRbQ/s1600/2011-11-21+18.25.07.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-R5WGAuFzsKw/TsofTWFQyLI/AAAAAAAAD2U/aPiAlhzNRbQ/s320/2011-11-21+18.25.07.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;after&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-4042876698677061856?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eh70wd9ED7WfJ144HnXDn7Bzkso/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eh70wd9ED7WfJ144HnXDn7Bzkso/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eh70wd9ED7WfJ144HnXDn7Bzkso/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eh70wd9ED7WfJ144HnXDn7Bzkso/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/JZB7x5v8Hy4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/4042876698677061856/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2011/11/blog-post.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/4042876698677061856?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/4042876698677061856?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/JZB7x5v8Hy4/blog-post.html" title="ヘッドホンのステレオミニプラグの交換" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-EBtTApi-URo/TsofTap1YyI/AAAAAAAAD2c/8-C3oiz0ha0/s72-c/2011-11-21+17.02.39.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2011/11/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04FQnY4eyp7ImA9WhRSE08.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-7302127397927105557</id><published>2011-11-14T23:29:00.001+09:00</published><updated>2011-11-15T11:58:33.833+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-15T11:58:33.833+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Application" /><category scheme="http://www.blogger.com/atom/ns#" term="MacBook Air" /><title>無料でGrowlをソースからインストールする</title><content type="html">Growl 1.3.1の通知がうるさいのでアップデートする．&lt;a href="http://itunes.apple.com/us/app/growl/id467939042"&gt;App Store&lt;/a&gt;で$1.99で手に入れることができますが，ソースからコンパイルしてインストールしちゃう．1.3だけど．&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://growl.info/documentation/developer/growl-source-install.php"&gt;Growl - Growl Mercurial Access&lt;/a&gt;を参考に．必要な環境は以下．&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;OS X Lion - 10.7&lt;/li&gt;
&lt;li&gt;Xcode&lt;/li&gt;
&lt;li&gt;Mercurial&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;手順&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Growl 1.2.2のアンインストール&lt;br /&gt;
アンインストーラは &lt;a href="http://growl.info/downloads"&gt;http://growl.info/downloads&lt;/a&gt;&lt;br /&gt;
ちなみに古いバージョンのインストーラもおなじところに．&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Mercurial SCMのインストール &lt;a href="http://mercurial.selenic.com/"&gt;http://mercurial.selenic.com/&lt;/a&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Google Code repositoryからソースを取得 &lt;a href="http://code.google.com/p/growl/source/checkout"&gt;http://code.google.com/p/growl/source/checkout&lt;/a&gt;&lt;br /&gt;
ターミナルから&lt;br /&gt;
&lt;blockquote&gt;hg clone https://code.google.com/p/growl/&lt;/blockquote&gt;を実行すると，growlってディレクトリができてローカルコピーされます．止まってんじゃないかくらい時間かかった．&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;growlディレクトリからGrowl.xcodeprojを開く&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Blyv_QTEDwg/TsHOK41Uy3I/AAAAAAAADx4/5D-SP0fXvYQ/s1600/growl.png" imageanchor="1" style=""&gt;&lt;img border="0" height="215" width="320" src="http://3.bp.blogspot.com/-Blyv_QTEDwg/TsHOK41Uy3I/AAAAAAAADx4/5D-SP0fXvYQ/s320/growl.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;ビルドターゲットをGrowl.appに&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-BPPWcBukfo8/TsHOaFyo0UI/AAAAAAAADyE/urUmz4pVrC0/s1600/Fullscreen.png" imageanchor="1" style=""&gt;&lt;img border="0" height="169" width="320" src="http://4.bp.blogspot.com/-BPPWcBukfo8/TsHOaFyo0UI/AAAAAAAADyE/urUmz4pVrC0/s320/Fullscreen.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;ビルドしようとするとエラーが起こるかも&lt;br /&gt;
&lt;br /&gt;
hgRevision.hがないとかそれっぽいこととか言われても無視．&lt;br /&gt;
&lt;br /&gt;
サインエラーに関してはGrowlのページには&lt;br /&gt;
&lt;blockquote&gt;A signing error. You will need to generate a self signed certificate, and can do so at Keychain Access.app -&gt; application's name menu -&gt; certificate assistant -&gt; create a certificate. Be sure to use the same prefix as the certificate that you are receiving errors about.&lt;/blockquote&gt;ってあるけどめんどくさいので Code Signing Identity を Don't Code Sign に．2箇所ある．&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-hJDHPUtZGBU/TsHPQID8HzI/AAAAAAAADyQ/-S_dDTsdivM/s1600/Xcode.png" imageanchor="1" style=""&gt;&lt;img border="0" height="78" width="320" src="http://4.bp.blogspot.com/-hJDHPUtZGBU/TsHPQID8HzI/AAAAAAAADyQ/-S_dDTsdivM/s320/Xcode.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-JEAI0BD0VrM/TsHPQJzagSI/AAAAAAAADyY/wTKx72m2zCI/s1600/Xcode-1.png" imageanchor="1" style=""&gt;&lt;img border="0" height="70" width="320" src="http://2.bp.blogspot.com/-JEAI0BD0VrM/TsHPQJzagSI/AAAAAAAADyY/wTKx72m2zCI/s320/Xcode-1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;ビルド（⌘B）&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Growl.appを右クリックしてShow in FinderするとGrowl.appが見つかるのでアプリケーションフォルダに移動して実行．終わり．&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-klPlmicChj8/TsHP7ywUwAI/AAAAAAAADyo/v-s2Y7Rtalc/s1600/growlapp.png" imageanchor="1" style=""&gt;&lt;img border="0" height="320" width="232" src="http://3.bp.blogspot.com/-klPlmicChj8/TsHP7ywUwAI/AAAAAAAADyo/v-s2Y7Rtalc/s320/growlapp.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-7302127397927105557?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EqBkIv5g25vwvtdCw1PFDcwRfrI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EqBkIv5g25vwvtdCw1PFDcwRfrI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EqBkIv5g25vwvtdCw1PFDcwRfrI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EqBkIv5g25vwvtdCw1PFDcwRfrI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/pgCky2vHrxg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/7302127397927105557/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2011/11/growl.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/7302127397927105557?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/7302127397927105557?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/pgCky2vHrxg/growl.html" title="無料でGrowlをソースからインストールする" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-Blyv_QTEDwg/TsHOK41Uy3I/AAAAAAAADx4/5D-SP0fXvYQ/s72-c/growl.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2011/11/growl.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4ESXg9eip7ImA9WhRTGU0.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-8812719373438461232</id><published>2011-11-10T14:18:00.001+09:00</published><updated>2011-11-10T15:01:48.662+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-10T15:01:48.662+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="Extension" /><category scheme="http://www.blogger.com/atom/ns#" term="Chrome" /><title>Google Scholarの検索結果に+1ボタンを追加するChrome Extension</title><content type="html">&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/---fE0w0TSgM/TrtlbZK1m2I/AAAAAAAADw0/PwU3BlbzQbs/s1600/scholar.png" imageanchor="1" &gt;&lt;img border="0" height="202" src="http://4.bp.blogspot.com/---fE0w0TSgM/TrtlbZK1m2I/AAAAAAAADw0/PwU3BlbzQbs/s320/scholar.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a href="http://scholar.google.com"&gt;Google Scholar&lt;/a&gt;の検索結果にはGoogle +1ボタンがついていないのでボタンを追加するChrome拡張機能をつくった．はじめは自分用に文献をソーシャルブックマークするシステムをApp Engineでつくろうかと思ったけどめんどくさいし，&lt;a href="http://www.google.com/events/developerday/2011/tokyo/"&gt;gdd11jp&lt;/a&gt;で+1ボタンの簡単だよって聞いたので．&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;インストール&lt;/b&gt;&lt;br /&gt;
&lt;a href="https://chrome.google.com/webstore/detail/kjgglcikkcmjbahnbnbknejhijcdbcdh"&gt;Chrome Web Store - +1 to Google Scholar&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;構成&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;manifest.json&lt;/li&gt;
&lt;li&gt;content_script.js&lt;/li&gt;
&lt;li&gt;jquery.js (&lt;a href="http://jquery.com/"&gt;http://jquery.com/&lt;/a&gt;からダウンロードしてリネーム）&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
- manifest.json&lt;br /&gt;
&lt;script class="brush: javascript" type="syntaxhighlighter"&gt;
&lt;![CDATA[
{
  "name": "+1 to Google Scholar",
  "version": "1.0",
  "description": "Add +1 buttons to Google Scholar results.",
  "content_scripts": [
    {
      "matches": ["&lt;all_urls&gt;"],
      "include_globs": ["*scholar.google*"],
      "js": ["jquery.js","content_script.js"]
    }
  ]
}
]]&gt;
&lt;/script&gt;&lt;br /&gt;
- content_script.js&lt;br /&gt;
&lt;script class="brush: javascript" type="syntaxhighlighter"&gt;
&lt;![CDATA[
$(function() {
  $(document).ready(function() {
    var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
    po.src = 'https://apis.google.com/js/plusone.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);

    $('.gs_r').each(function() {
      $('&lt;div class="g-plusone" data-size="small" data-href="'+ $('a',this)[0].href +'"&gt;&lt;/div&gt;').appendTo(this);
    });
  });
});
]]&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;参考にしたページ&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://draft.blogger.com/Content%20Scripts%20-%20Google%20Chrome%20Extensions%20-%20Google%20Code"&gt;Content Scripts - Google Chrome Extensions - Google Code&lt;/a&gt;&lt;br /&gt;
Content Scriptのつくりかた&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.google.com/webmasters/+1/button/"&gt;plusone-button&lt;/a&gt;&lt;br /&gt;
+1ボタンのつけかた&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;b&gt;備考&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;+1ボタンの読み込み遅いせいか知らんけど結果の表示が遅くてイライラする…たぶんこいつのせいでGoogle Readerももたついてんじゃないの…&lt;/li&gt;
&lt;li&gt;だからデフォルトで検索結果に+1ボタンつけてほしいです&lt;/li&gt;
&lt;li&gt;しかし拡張機能のアイコンとかタイルとかGoogleのもの勝手に使ってるの怒られるのかな&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-8812719373438461232?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Sa9_2BSV4wrfJwj2tWuDMXflh4I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Sa9_2BSV4wrfJwj2tWuDMXflh4I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Sa9_2BSV4wrfJwj2tWuDMXflh4I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Sa9_2BSV4wrfJwj2tWuDMXflh4I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/KrfyPz7cKu4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/8812719373438461232/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2011/11/google-scholar1chrome-extension.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/8812719373438461232?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/8812719373438461232?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/KrfyPz7cKu4/google-scholar1chrome-extension.html" title="Google Scholarの検索結果に+1ボタンを追加するChrome Extension" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/---fE0w0TSgM/TrtlbZK1m2I/AAAAAAAADw0/PwU3BlbzQbs/s72-c/scholar.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2011/11/google-scholar1chrome-extension.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4FQXg_fyp7ImA9WhdXEEg.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-3839278659398793570</id><published>2011-08-23T09:02:00.000+09:00</published><updated>2011-08-23T09:05:10.647+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-23T09:05:10.647+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title>PythonでA*アルゴリズムを実装してみる</title><content type="html">Pythonで&lt;a href="http://networkx.lanl.gov/"&gt;NexworkX&lt;/a&gt;を使ってA*アルゴリズムを実装してみます。まあNetworkXではA*アルゴリズムは&lt;a href="http://networkx.lanl.gov/reference/generated/networkx.algorithms.shortest_paths.astar.astar_path.html"&gt;実装されている&lt;/a&gt;のですが。 &lt;br /&gt;
&lt;br /&gt;
NetworkXは複雑ネットワークでいろいろやるためのPythonのパッケージ。&lt;a href="http://networkx.lanl.gov/install.html"&gt;easy_install&lt;/a&gt;でインストールするのが楽。&lt;br /&gt;
&lt;br /&gt;
A*（A-star, エースター） アルゴリズムは、経路探索アルゴリズムの一つ。Wikipediaの解説がわかりやすい。(→&lt;a href="http://ja.wikipedia.org/wiki/A*"&gt;Wikipedia ja&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/A*_search_algorithm"&gt;Wikipedia en&lt;/a&gt;) &lt;br /&gt;
&lt;br /&gt;
ここではWikipediaにある疑似コードをほぼそのままの形で実装してみます。ランダムな重みつきエッジで構成される3x3のグリッドにおいて(0,0)から(2,2)への最短ルートを探索します。&lt;br /&gt;
&lt;br /&gt;
以下ではヒューリスティック関数h&lt;sup&gt;*&lt;/sup&gt;(n)として直線距離を使います。&lt;br /&gt;
が、上の設定では直線距離は&lt;blockquote&gt;&lt;img align="middle" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;chl=%5Cforall%20n%2C0%5Cleq%20h%5E*(n)%20%5Cleq%20h(n)&amp;chs=&amp;chf=&amp;chco=" alt="\forall n,0\leq h^*(n) \leq h(n)"&gt;&lt;br /&gt;
&lt;/blockquote&gt;を満たさないので、最短経路であることは保証されません…。&lt;br /&gt;
&lt;br /&gt;
なので、一応、ヒューリスティック関数h&lt;sup&gt;*&lt;/sup&gt;(n)による推定値を常に0とすることで、&lt;a href="http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm"&gt;ダイクストラ法&lt;/a&gt;による最短距離を求めてみます。（A*アルゴリズムの意味なし。）&lt;br /&gt;
&lt;br /&gt;
&lt;script class="brush: python" type="syntaxhighlighter"&gt;
&lt;![CDATA[
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import networkx as nx
import random
from collections import defaultdict

def astar(G,start,goal,heuristic_cost_estimate,weight='weight'):
    """
    A*アルゴリズム
    
    G:グラフ(networkx.Graph)
    start,goal:ノード
    heuristic_cost_estimate:ヒューリスティック関数
    weight:エッジの重みのキー
    """
    closedset = [] # 計算済みノード
    openset = [start] # 計算中ノード
    came_from = {} # 親のノード
    
    g_score = defaultdict(float) # スタートノードからの（推定）最小コスト
    h_score = defaultdict(float) # ゴールノードまでの（推定）最小コスト
    f_score = defaultdict(float) # 最短経路の（推定）コスト
    
    # スタートノードの設定
    g_score[start] = 0
    h_score[start] = heuristic_cost_estimate(start,goal)
    f_score[start] = h_score[start]
    
    while openset:
        # 計算中ノードから推定コスト最小のxを取得
        x = min(openset,key=lambda k:f_score[k])
        # ゴールだったら終了
        if x == goal:
            return reconstruct_path(came_from,goal)
        
        openset.remove(x) # 計算中から削除
        closedset.append(x) # 計算済みに追加
        
        # 隣接ノードについて
        for y in G.neighbors(x):
            # 計算済みなら継続
            if y in closedset:
                continue
            # 移動コストを付加
            if weight in G[x][y]:
                tentative_g_score = g_score[x] + G[x][y][weight]
            else:
                tentative_g_score = g_score[x] + 1.0
            
            # 計算中でなければ
            if y not in openset:
                openset.append(y)
                tentative_is_better = True
            # 計算中でコストが下がるなら
            elif tentative_g_score &lt; g_score[y]:
                tentative_is_better = True
            # 計算中でコストが上がるなら
            else:
                tentative_is_better = False
            
            # もし今まで計算した中でコスト最小なら
            if tentative_is_better:
                came_from[y] = x
                g_score[y] = tentative_g_score
                h_score[y] = heuristic_cost_estimate(y,goal)
                f_score[y] = g_score[y] + h_score[y]
    # 到達しない場合はNoneを返す
    return None

def reconstruct_path(came_from,current_node):
    """
    結果表示用
    """
    if current_node in came_from:
        return reconstruct_path(came_from,came_from[current_node]) + [current_node]
    else:
        return [current_node]

if __name__ == '__main__':
    """
    S-o-o
    | | |
    o-o-o
    | | |
    o-o-G
    """
    G = nx.grid_graph(dim=[3,3])
    for s,t in G.edges():
        weight = random.random()
        G[s][t]['weight'] = weight
        print "%s %s %.2f" % (s,t,weight)
    print

    def dist(a, b):
        "直線距離"
        (x1, y1) = a
        (x2, y2) = b
        return ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5
    
    def monotone(a,b):
        "ダイクストラ法"
        return 0

    start = (0,0)
    goal = (2,2)
    
    print astar(G,start,goal,dist)
    print astar(G,start,goal,monotone) # equivalent to running Dijkstra
    print nx.astar_path(G,start,goal,dist) # NexworkX
]]&gt;
&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-3839278659398793570?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IKFpB0CztaFeRDdmGJVDEBun0xg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IKFpB0CztaFeRDdmGJVDEBun0xg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IKFpB0CztaFeRDdmGJVDEBun0xg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IKFpB0CztaFeRDdmGJVDEBun0xg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/XQ0YytDdVYA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/3839278659398793570/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2011/08/pythona.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/3839278659398793570?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/3839278659398793570?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/XQ0YytDdVYA/pythona.html" title="PythonでA*アルゴリズムを実装してみる" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2011/08/pythona.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIGRHo7fCp7ImA9WhRWGUs.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-7997901555491093570</id><published>2011-08-16T18:15:00.000+09:00</published><updated>2012-01-08T04:12:05.404+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-08T04:12:05.404+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="docomo" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>SIMロック解除とケータイ補償お届けサービスあるいは外装交換</title><content type="html">SIMロック解除をドコモに頼んでやってもらうと、ケータイ補償お届けサービス（1回目5,250円、2回目8,400円）あるいは外装交換（5,250円?）を利用して&lt;b&gt;新しい携帯電話にしてもSIMロック解除をされた状態にして受け取ることができる&lt;/b&gt;、と言う事をDSの店員さんに確認してGalaxy S2のSIMロック解除をしました（3,150円）。設定画面等からSIMロック解除されているかどうか確認することはできない、らしい…&lt;br /&gt;
&lt;br /&gt;
docomoでは「GALAXY S II SC-02C」、SAMSUNGでは「GALAXY S2(SC-02C)」という表記。どっちでもいいのか。&lt;br /&gt;
&lt;br /&gt;
(追記) 無事海外（タイ、中国、マカオ）でも使えました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-7997901555491093570?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yBX6O8Q7V8nP_lj5axSERdM0iqc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yBX6O8Q7V8nP_lj5axSERdM0iqc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yBX6O8Q7V8nP_lj5axSERdM0iqc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yBX6O8Q7V8nP_lj5axSERdM0iqc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/wg4DlGpEok4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/7997901555491093570/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2011/08/sim.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/7997901555491093570?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/7997901555491093570?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/wg4DlGpEok4/sim.html" title="SIMロック解除とケータイ補償お届けサービスあるいは外装交換" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2011/08/sim.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04HR306fCp7ImA9WhZbF04.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-1290547731403414562</id><published>2011-06-22T17:38:00.000+09:00</published><updated>2011-06-22T17:38:56.314+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-22T17:38:56.314+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Machine Learning" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title>Pythonで拡張カルマンフィルタを実装してみる</title><content type="html">&lt;a href="http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AB%E3%83%9E%E3%83%B3%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC#.E6.8B.A1.E5.BC.B5.E3.82.AB.E3.83.AB.E3.83.9E.E3.83.B3.E3.83.95.E3.82.A3.E3.83.AB.E3.82.BF.E3.83.BC"&gt;拡張カルマンフィルタ&lt;/a&gt;(&lt;a href="http://en.wikipedia.org/wiki/Extended_Kalman_filter"&gt;EKF; Extended Kalman Filter&lt;/a&gt;)は非線形カルマンフィルタのひとつ。&lt;a href="http://satomacoto.blogspot.com/2011/06/python.html"&gt;線形カルマンフィルタ&lt;/a&gt;は線形システムを対象としていましたが、拡張カルマンフィルタは非線形システムを対象とします。ナビゲーションやらGPSやらに利用されている、らしい。&lt;br /&gt;
&lt;br /&gt;
システムが非線形のとき、すなわち&lt;br /&gt;
&lt;blockquote&gt;&lt;img align="middle" alt="{\bf x}_{t+1}=f({\bf x}_{t},{\bf u}_{t})+{\bf w}_{t+1}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20x%7D_%7Bt%2B1%7D%3Df(%7B%5Cbf%20x%7D_%7Bt%7D%2C%7B%5Cbf%20u%7D_%7Bt%7D)%2B%7B%5Cbf%20w%7D_%7Bt%2B1%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （状態方程式）&lt;br /&gt;
&lt;img align="middle" alt="{\bf y}_{t}=h({\bf x}_{t})+{\bf v}_{t}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20y%7D_%7Bt%7D%3Dh(%7B%5Cbf%20x%7D_%7Bt%7D)%2B%7B%5Cbf%20v%7D_%7Bt%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （観測方程式）&lt;br /&gt;
&lt;img align="middle" alt="{\bf w}_{t}\sim N(0,{\bf Q})" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20w%7D_%7Bt%7D%5Csim%20N(0%2C%7B%5Cbf%20Q%7D)&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;img align="middle" alt="{\bf v}_{t}\sim N(0,{\bf R})" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20v%7D_%7Bt%7D%5Csim%20N(0%2C%7B%5Cbf%20R%7D)&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （ノイズは正規分布）&lt;br /&gt;
&lt;img align="middle" alt="p({\bf x}_{t}|{\bf y}_{0:t})=N({\bf x}_{t};{\bf \mu}_{t},{\bf \Sigma}_{t})" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=p(%7B%5Cbf%20x%7D_%7Bt%7D%7C%7B%5Cbf%20y%7D_%7B0%3At%7D)%3DN(%7B%5Cbf%20x%7D_%7Bt%7D%3B%7B%5Cbf%20%5Cmu%7D_%7Bt%7D%2C%7B%5Cbf%20%5CSigma%7D_%7Bt%7D)&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （状態は正規分布）&lt;/blockquote&gt;とするとき、関数 f は前の状態から推定値を与え、関数 h は観測値を与えますが、どちらの関数も直接共分散を求めることはできません。が、拡張カルマンフィルタでは状態方程式も観測方程式も微分可能であれば線形である必要はありません。&lt;br /&gt;
&lt;br /&gt;
拡張カルマンフィルタでは状態方程式と観測方程式の線形化をするために、線形カルマンフィルタにおける時間遷移モデルと観測モデルに各関数の偏微分行列（&lt;a href="http://ja.wikipedia.org/wiki/%E3%83%A4%E3%82%B3%E3%83%93%E3%82%A2%E3%83%B3"&gt;ヤコビアン&lt;/a&gt;）を用います。&lt;br /&gt;
&lt;blockquote&gt;&lt;img align="middle" alt="{\bf A}_{t} = \left\ \frac{\partial f({\bf x}_{t},{\bf u}_{t})}{\partial {\bf x}_{t}} \right|_{{\bf \mu}_t, {\bf u}_t}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20A%7D_%7Bt%7D%20%3D%20%5Cleft%5C%20%5Cfrac%7B%5Cpartial%20f(%7B%5Cbf%20x%7D_%7Bt%7D%2C%7B%5Cbf%20u%7D_%7Bt%7D)%7D%7B%5Cpartial%20%7B%5Cbf%20x%7D_%7Bt%7D%7D%20%5Cright%7C_%7B%7B%5Cbf%20%5Cmu%7D_t%2C%20%7B%5Cbf%20u%7D_t%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;br /&gt;
&lt;img align="middle" alt="{\bf C}_{t} = \left\ \frac{\partial h({\bf x}_{t})}{\partial {\bf x}_{t}} \right|_{{\bf \mu}_t}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20C%7D_%7Bt%7D%20%3D%20%5Cleft%5C%20%5Cfrac%7B%5Cpartial%20h(%7B%5Cbf%20x%7D_%7Bt%7D)%7D%7B%5Cpartial%20%7B%5Cbf%20x%7D_%7Bt%7D%7D%20%5Cright%7C_%7B%7B%5Cbf%20%5Cmu%7D_t%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;/blockquote&gt;あとは、&lt;a href="http://satomacoto.blogspot.com/2011/06/python.html"&gt;線形カルマンフィルタ&lt;/a&gt;と同じ。 μ&lt;sub&gt;t&lt;/sub&gt;, Σ&lt;sub&gt;t&lt;/sub&gt;, u&lt;sub&gt;t&lt;/sub&gt;, y&lt;sub&gt;t+1&lt;/sub&gt; を入力として、 μ&lt;sub&gt;t+1&lt;/sub&gt;, Σ&lt;sub&gt;t+1&lt;/sub&gt;を出力します。1ステップのプロセスは以下のとおり。&lt;br /&gt;
&lt;br /&gt;
# prediction&lt;br /&gt;
&lt;blockquote&gt;&lt;img align="middle" alt="{\bf \hat{\mu}}_{t+1} \leftarrow f({\bf \mu}_{t},{\bf u})" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20%5Chat%7B%5Cmu%7D%7D_%7Bt%2B1%7D%20%5Cleftarrow%20f(%7B%5Cbf%20%5Cmu%7D_%7Bt%7D%2C%7B%5Cbf%20u%7D)&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （現在の推定値）&lt;br /&gt;
&lt;img align="middle" alt="{\bf A}_{t} \leftarrow \left\ \frac{\partial f({\bf x}_{t},{\bf u}_{t})}{\partial {\bf x}_{t}} \right|_{{\bf \mu}_t, {\bf u}_t}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20A%7D_%7Bt%7D%20%5Cleftarrow%20%5Cleft%5C%20%5Cfrac%7B%5Cpartial%20f(%7B%5Cbf%20x%7D_%7Bt%7D%2C%7B%5Cbf%20u%7D_%7Bt%7D)%7D%7B%5Cpartial%20%7B%5Cbf%20x%7D_%7Bt%7D%7D%20%5Cright%7C_%7B%7B%5Cbf%20%5Cmu%7D_t%2C%20%7B%5Cbf%20u%7D_t%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （状態方程式の現在のヤコビアン）&lt;br /&gt;
&lt;img align="middle" alt="{\bf \hat{\Sigma}}_{t+1} \leftarrow {\bf Q}+{\bf A}_t{\Sigma}_t {\bf A}_t^T" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20%5Chat%7B%5CSigma%7D%7D_%7Bt%2B1%7D%20%5Cleftarrow%20%7B%5Cbf%20Q%7D%2B%7B%5Cbf%20A%7D_t%7B%5CSigma%7D_t%20%7B%5Cbf%20A%7D_t%5ET&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （現在の誤差行列）&lt;/blockquote&gt;# update&lt;br /&gt;
&lt;blockquote&gt;&lt;img align="middle" alt="{\bf C}_{t+1} \leftarrow \left\ \frac{\partial h({\bf x}_{t})}{\partial {\bf x}_{t}} \right|_{{\bf \hat{\mu}}_{t+1}}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20C%7D_%7Bt%2B1%7D%20%5Cleftarrow%20%5Cleft%5C%20%5Cfrac%7B%5Cpartial%20h(%7B%5Cbf%20x%7D_%7Bt%7D)%7D%7B%5Cpartial%20%7B%5Cbf%20x%7D_%7Bt%7D%7D%20%5Cright%7C_%7B%7B%5Cbf%20%5Chat%7B%5Cmu%7D%7D_%7Bt%2B1%7D%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （観測方程式のヤコビアン）&lt;br /&gt;
&lt;img align="middle" alt="{\bf \tilde{y}}_{t+1} \leftarrow {\bf y}_{t+1}-{\bf C}_{t+1}{\hat{\mu}}_{t+1}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20%5Ctilde%7By%7D%7D_%7Bt%2B1%7D%20%5Cleftarrow%20%7B%5Cbf%20y%7D_%7Bt%2B1%7D-%7B%5Cbf%20C%7D_%7Bt%2B1%7D%7B%5Chat%7B%5Cmu%7D%7D_%7Bt%2B1%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （観測残差）&lt;br /&gt;
&lt;img align="middle" alt="{\bf S}_{t+1} \leftarrow {\bf C}_{t+1}{\bf \hat{\Sigma}}_{t+1}{\bf C}_{t+1}^T+{\bf R}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20S%7D_%7Bt%2B1%7D%20%5Cleftarrow%20%7B%5Cbf%20C%7D_%7Bt%2B1%7D%7B%5Cbf%20%5Chat%7B%5CSigma%7D%7D_%7Bt%2B1%7D%7B%5Cbf%20C%7D_%7Bt%2B1%7D%5ET%2B%7B%5Cbf%20R%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （観測残差の共分散）&lt;br /&gt;
&lt;img align="middle" alt="{\bf K}_{t+1} \leftarrow {\bf \hat{\Sigma}}_{t+1}{\bf C}^T{\bf S}^{-1}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20K%7D_%7Bt%2B1%7D%20%5Cleftarrow%20%7B%5Cbf%20%5Chat%7B%5CSigma%7D%7D_%7Bt%2B1%7D%7B%5Cbf%20C%7D%5ET%7B%5Cbf%20S%7D%5E%7B-1%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （最適カルマンゲイン）&lt;br /&gt;
&lt;img align="middle" alt="{\bf \mu}_{t+1} \leftarrow {\bf \hat{\mu}}_{t+1}+{\bf K}_{t+1}{\bf \tilde{y}}_{t+1}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20%5Cmu%7D_%7Bt%2B1%7D%20%5Cleftarrow%20%7B%5Cbf%20%5Chat%7B%5Cmu%7D%7D_%7Bt%2B1%7D%2B%7B%5Cbf%20K%7D_%7Bt%2B1%7D%7B%5Cbf%20%5Ctilde%7By%7D%7D_%7Bt%2B1%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （更新された現在の推定値）&lt;br /&gt;
&lt;img align="middle" alt="{\bf \Sigma}_{t+1} \leftarrow {\bf \hat{\Sigma}}_{t+1}-{\bf K}_{t+1}{\bf C}_{t+1}{\bf \hat{\Sigma}}_{t+1}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20%5CSigma%7D_%7Bt%2B1%7D%20%5Cleftarrow%20%7B%5Cbf%20%5Chat%7B%5CSigma%7D%7D_%7Bt%2B1%7D-%7B%5Cbf%20K%7D_%7Bt%2B1%7D%7B%5Cbf%20C%7D_%7Bt%2B1%7D%7B%5Cbf%20%5Chat%7B%5CSigma%7D%7D_%7Bt%2B1%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （更新された現在の誤差行列）&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
例題。&lt;br /&gt;
&lt;blockquote&gt;2次元座標において、あるロボットがt=0に原点を出発して、速度(2,2)で動くとする。ロボットの進路は風などの影響を受け（σ&lt;sub&gt;x&lt;/sub&gt;=σ&lt;sub&gt;y&lt;/sub&gt;=1）、毎秒ごと3つの点(0,0),(10,0),(0,10)からの距離を計測できて、計測には距離によらない誤差がある（σ&lt;sub&gt;x&lt;/sub&gt;=σ&lt;sub&gt;y&lt;/sub&gt;=2）とする。このとき、観測された軌跡から実際の軌跡を推定する。&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-KOrtMQoPvuE/Tf9N8G19S-I/AAAAAAAADTk/s5iUo2FT9aQ/s1600/ekf0.png" imageanchor="1"&gt;&lt;img border="0" height="256" src="http://3.bp.blogspot.com/-KOrtMQoPvuE/Tf9N8G19S-I/AAAAAAAADTk/s5iUo2FT9aQ/s400/ekf0.png" width="372" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Fig.1&lt;/b&gt; ロボットの位置は(x&lt;sub&gt;0&lt;/sub&gt;,x&lt;sub&gt;1&lt;/sub&gt;)で、3点からの観測値(y&lt;sub&gt;0&lt;/sub&gt;,y&lt;sub&gt;1&lt;/sub&gt;,y&lt;sub&gt;2&lt;/sub&gt;)を得る。&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
状態方程式は線形、観測方程式は非線形となります。&lt;br /&gt;
&lt;blockquote&gt;&lt;img align="middle" alt="f({\bf x},{\bf u})=\left[\begin{a}{cc}1&amp;amp;0\\0&amp;amp;1\end{}\right]{\bf x}+\left[\begin{a}{cc}1&amp;amp;0\\0&amp;amp;1\end{}\right]{\bf u},\ \ \ {\bf u}=\left[\begin{a}{c}2\\2\end{}\right]" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=f(%7B%5Cbf%20x%7D%2C%7B%5Cbf%20u%7D)%3D%5Cleft%5B%5Cbegin%7Ba%7D%7Bcc%7D1%260%5C%5C0%261%5Cend%7B%7D%5Cright%5D%7B%5Cbf%20x%7D%2B%5Cleft%5B%5Cbegin%7Ba%7D%7Bcc%7D1%260%5C%5C0%261%5Cend%7B%7D%5Cright%5D%7B%5Cbf%20u%7D%2C%5C%20%5C%20%5C%20%7B%5Cbf%20u%7D%3D%5Cleft%5B%5Cbegin%7Ba%7D%7Bc%7D2%5C%5C2%5Cend%7B%7D%5Cright%5D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;br /&gt;
&lt;img align="middle" alt="h({\bf x})=\left[\begin{array}{c} \sqrt{x_0^2+x_1^2}\\ \sqrt{(x_0-10)^2+x_1^2}\\ \sqrt{x_0^2+(x_1-10)^2} \end{array}\right]" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=h(%7B%5Cbf%20x%7D)%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%0A%5Csqrt%7Bx_0%5E2%2Bx_1%5E2%7D%5C%5C%0A%5Csqrt%7B(x_0-10)%5E2%2Bx_1%5E2%7D%5C%5C%0A%5Csqrt%7Bx_0%5E2%2B(x_1-10)%5E2%7D%0A%5Cend%7Barray%7D%5Cright%5D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;/blockquote&gt;&lt;br /&gt;
観測方程式のヤコビアンは&lt;br /&gt;
&lt;blockquote&gt;&lt;img align="middle" alt="J=\left[\begin{array}{cc} \fr{\pa{h}_0}{\pa{x_0}}&amp;amp;\fr{\pa{h}_0}{\pa{x_1}} \\ \fr{\pa{h}_1}{\pa{x_0}}&amp;amp;\fr{\pa{h}_1}{\pa{x_1}} \\ \fr{\pa{h}_2}{\pa{x_0}}&amp;amp;\fr{\pa{h}_2}{\pa{x_1}} \\ \end{array}\right]" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=J%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bcc%7D%0A%5Cfr%7B%5Cpa%7Bh%7D_0%7D%7B%5Cpa%7Bx_0%7D%7D%26%5Cfr%7B%5Cpa%7Bh%7D_0%7D%7B%5Cpa%7Bx_1%7D%7D%20%5C%5C%0A%5Cfr%7B%5Cpa%7Bh%7D_1%7D%7B%5Cpa%7Bx_0%7D%7D%26%5Cfr%7B%5Cpa%7Bh%7D_1%7D%7B%5Cpa%7Bx_1%7D%7D%20%5C%5C%0A%5Cfr%7B%5Cpa%7Bh%7D_2%7D%7B%5Cpa%7Bx_0%7D%7D%26%5Cfr%7B%5Cpa%7Bh%7D_2%7D%7B%5Cpa%7Bx_1%7D%7D%20%5C%5C%0A%5Cend%7Barray%7D%5Cright%5D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;/blockquote&gt;として求められます。実装では上式を解析的に解く場合、数値的に解く場合を試してみます。なおSciPyには数値的にヤコビアンを求める関数が用意されているので、ここではそれを使ってみます。（微小区間ズラして傾き求めている…）&lt;br /&gt;
&lt;br /&gt;
以下、実装。61行目と62行目で解析的か数値的か切り替えます。&lt;br /&gt;
&lt;br /&gt;
&lt;script class="brush: python" type="syntaxhighlighter"&gt;
&lt;![CDATA[
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import scipy as sp
from scipy.optimize.slsqp import approx_jacobian
import matplotlib.pyplot as plt

def main():
    # 初期化
    T = 50 # 観測数
    p0 = (0,0); p1 = (10,0); p2 = (0,10) # 観測値の座標
    x = np.mat([[0],[0]]) # 初期位置
    X = [np.mat([[0],[0]])] # 状態
    Y = [np.mat([[0],[0],[0]])] # 観測

    # state x = A * x_ + B * u + w, w~N(0,Q)
    A = np.mat([[1,0],[0,1]])
    B = np.mat([[1,0],[0,1]])
    u = np.mat([[2],[2]])
    Q = np.mat([[1,0],[0,1]])
    # observation Y = h(x) + v, v~N(0,R)
    R = np.mat([[2,0,0],[0,2,0],[0,0,2]])
    def h_(x,p):
        return ((x[0]-p[0])**2 + (x[1]-p[1])**2)**.5
    def h(x):
        x = (x[0,0],x[1,0])
        return np.mat([[h_(x,p0)],[h_(x,p1)],[h_(x,p2)]])
    def Jh0(x):        
        """
        解析的に求めるh(x)のヤコビアン
        """
        x = (x[0,0],x[1,0])
        return np.mat([[(x[0]-p0[0])/h_(x,p0),(x[1]-p0[1])/h_(x,p0)],
                       [(x[0]-p1[0])/h_(x,p1),(x[1]-p1[1])/h_(x,p1)],
                       [(x[0]-p2[0])/h_(x,p2),(x[1]-p2[1])/h_(x,p2)]])
    def Jh1(x):
        """
        数値的に求めるh(x)のヤコビアン
        """
        x = (x[0,0],x[1,0])
        h = lambda x: np.asfarray([h_(x,p0),h_(x,p1),h_(x,p2)])
        return np.mat(approx_jacobian(x,h,np.sqrt(np.finfo(float).eps)))        
    
    # 観測データの生成
    for i in range(T):
        x = A * x + B * u + np.random.multivariate_normal([0,0],Q,1).T
        X.append(x)
        y = h(x) + np.random.multivariate_normal([0,0,0],R,1).T
        Y.append(y)
    
    # EKF
    mu = np.mat([[0],[0]])
    Sigma = np.mat([[0,0],[0,0]])    
    M = [mu] # 推定
    for i in range(T):
        # prediction
        mu_ = A * mu + B * u
        Sigma_ = Q + A * Sigma * A.T
        # update
        #C = Jh0(mu_) # 解析的
        C = Jh1(mu_) # 数値的
        yi = Y[i+1] - C * mu_
        S = C * Sigma_ * C.T + R
        K = Sigma_ * C.T * S.I
        mu = mu_ + K * yi
        Sigma = Sigma_ - K * C * Sigma_
        M.append(mu)

    # 描画
    a,b = np.array(np.concatenate(X,axis=1))
    plt.plot(a,b,'rs-')
    a,b = np.array(np.concatenate(M,axis=1))
    plt.plot(a,b,'bo-')
    plt.axis('equal')
    plt.show()

if __name__ == '__main__':
    main()
]]&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
割とうまくいっている実行結果。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-cfBtYZFzTqI/TgGbkAZ9PKI/AAAAAAAADTo/-jehzwULyL0/s1600/ekf_ana.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://3.bp.blogspot.com/-cfBtYZFzTqI/TgGbkAZ9PKI/AAAAAAAADTo/-jehzwULyL0/s200/ekf_ana.png" width="200" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-kEcOybHBLhg/TgGbkqsGCmI/AAAAAAAADTs/IzylKn7ykRQ/s1600/ekf_num.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/-kEcOybHBLhg/TgGbkqsGCmI/AAAAAAAADTs/IzylKn7ykRQ/s200/ekf_num.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Fig. 2&lt;/b&gt; &lt;span class="Apple-style-span" style="color: red;"&gt;赤&lt;/span&gt;が実際の軌跡。&lt;span class="Apple-style-span" style="color: blue;"&gt;青&lt;/span&gt;が推定値。&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;左が解析的なヤコビアン、右が解析的なヤコビアンを使った結果。&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
なんかうまくいってないような(?)結果も出てしまいます。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Wbf7EFq28No/TgGdNoIlptI/AAAAAAAADTw/ixQZw4BGxzE/s1600/ekf_ana_f.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://3.bp.blogspot.com/-Wbf7EFq28No/TgGdNoIlptI/AAAAAAAADTw/ixQZw4BGxzE/s200/ekf_ana_f.png" width="200" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-m5h3mu7IiSs/TgGdN2-2EZI/AAAAAAAADT0/PvtX-IOX91c/s1600/ekf_num_f.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://2.bp.blogspot.com/-m5h3mu7IiSs/TgGdN2-2EZI/AAAAAAAADT0/PvtX-IOX91c/s200/ekf_num_f.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Fig. 3&lt;/b&gt; なんか微妙…&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/Kalman_filter#Unscented_Kalman_filter"&gt;UKF&lt;/a&gt;も実装してみようかな。&lt;br /&gt;
&lt;br /&gt;
http://docs.scipy.org/doc/scipy/reference/optimize.html&lt;br /&gt;
http://old.nabble.com/calculating-numerical-jacobian-td20506078.html&lt;br /&gt;
http://projects.scipy.org/scipy/browser/trunk/scipy/optimize/slsqp.py&lt;br /&gt;
http://en.wikipedia.org/wiki/Broyden's_method&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-1290547731403414562?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KFiLOGwuDJRvOh1ITHaq-zTQMvY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KFiLOGwuDJRvOh1ITHaq-zTQMvY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KFiLOGwuDJRvOh1ITHaq-zTQMvY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KFiLOGwuDJRvOh1ITHaq-zTQMvY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/Z9qWaw3Nn9M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/1290547731403414562/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2011/06/python_22.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/1290547731403414562?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/1290547731403414562?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/Z9qWaw3Nn9M/python_22.html" title="Pythonで拡張カルマンフィルタを実装してみる" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-KOrtMQoPvuE/Tf9N8G19S-I/AAAAAAAADTk/s5iUo2FT9aQ/s72-c/ekf0.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2011/06/python_22.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUINSH0ycSp7ImA9WhZbFEU.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-4348179206044530632</id><published>2011-06-19T21:45:00.002+09:00</published><updated>2011-06-19T21:46:39.399+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-19T21:46:39.399+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Machine Learning" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title>Pythonでカルマンフィルタを実装してみる</title><content type="html">カルマンフィルタは、時間変化するシステムの、誤差のある離散的な観測から現在の状態を推定する手法。Wikipediaの記事（&lt;a href="http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AB%E3%83%9E%E3%83%B3%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC"&gt;カルマンフィルター&lt;/a&gt;）がわかりやすい。&lt;br /&gt;
&lt;br /&gt;
状態方程式と観測方程式が次のように与えられているとき&lt;br /&gt;
&lt;blockquote&gt;&lt;img align="middle" alt="{\bf x}_{t+1}={\bf Ax}_{t}+{\bf Bu}_{t}+{\bf w}_{t+1}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20x%7D_%7Bt%2B1%7D%3D%7B%5Cbf%20Ax%7D_%7Bt%7D%2B%7B%5Cbf%20Bu%7D_%7Bt%7D%2B%7B%5Cbf%20w%7D_%7Bt%2B1%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （状態方程式）&lt;br /&gt;
&lt;img align="middle" alt="{\bf y}_{t}={\bf Cx}_{t}+{\bf v}_{t}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20y%7D_%7Bt%7D%3D%7B%5Cbf%20Cx%7D_%7Bt%7D%2B%7B%5Cbf%20v%7D_%7Bt%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （観測方程式）&lt;br /&gt;
&lt;img align="middle" alt="{\bf w}_{t}\sim N(0,{\bf Q})" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20w%7D_%7Bt%7D%5Csim%20N(0%2C%7B%5Cbf%20Q%7D)&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;img align="middle" alt="{\bf v}_{t}\sim N(0,{\bf R})" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20v%7D_%7Bt%7D%5Csim%20N(0%2C%7B%5Cbf%20R%7D)&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （ノイズ）&lt;br /&gt;
&lt;img align="middle" alt="p({\bf x}_{t}|{\bf y}_{0:t})=N({\bf x}_{t};{\bf \mu}_{t},{\bf \Sigma}_{t})" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=p(%7B%5Cbf%20x%7D_%7Bt%7D%7C%7B%5Cbf%20y%7D_%7B0%3At%7D)%3DN(%7B%5Cbf%20x%7D_%7Bt%7D%3B%7B%5Cbf%20%5Cmu%7D_%7Bt%7D%2C%7B%5Cbf%20%5CSigma%7D_%7Bt%7D)&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （フィルタ分布）&lt;/blockquote&gt;線形カルマンフィルタ(LKF; Linear Kalman Filter)は μ&lt;sub&gt;t&lt;/sub&gt;, Σ&lt;sub&gt;t&lt;/sub&gt;, u&lt;sub&gt;t&lt;/sub&gt;, y&lt;sub&gt;t+1&lt;/sub&gt; を入力として、 μ&lt;sub&gt;t+1&lt;/sub&gt;, Σ&lt;sub&gt;t+1&lt;/sub&gt;を出力する。1ステップのプロセスは以下のとおり。&lt;br /&gt;
&lt;br /&gt;
# prediction&lt;br /&gt;
&lt;blockquote&gt;&lt;img align="middle" alt="{\bf \hat{\mu}}_{t+1} \leftarrow {\bf A\mu}_{t}+{\bf Bu}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20%5Chat%7B%5Cmu%7D%7D_%7Bt%2B1%7D%20%5Cleftarrow%20%7B%5Cbf%20A%5Cmu%7D_%7Bt%7D%2B%7B%5Cbf%20Bu%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （現在の推定値）&lt;br /&gt;
&lt;img align="middle" alt="{\bf \hat{\Sigma}}_{t+1} \leftarrow {\bf Q}+{\bf A\Sigma}_t {\bf A}^T" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20%5Chat%7B%5CSigma%7D%7D_%7Bt%2B1%7D%20%5Cleftarrow%20%7B%5Cbf%20Q%7D%2B%7B%5Cbf%20A%5CSigma%7D_t%20%7B%5Cbf%20A%7D%5ET&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （現在の誤差行列）&lt;/blockquote&gt;# update&lt;br /&gt;
&lt;blockquote&gt;&lt;img align="middle" alt="{\bf \tilde{y}}_{t+1} \leftarrow {\bf y}_{t+1}-{\bf C\hat{\mu}}_{t+1}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20%5Ctilde%7By%7D%7D_%7Bt%2B1%7D%20%5Cleftarrow%20%7B%5Cbf%20y%7D_%7Bt%2B1%7D-%7B%5Cbf%20C%5Chat%7B%5Cmu%7D%7D_%7Bt%2B1%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （観測残差）&lt;br /&gt;
&lt;img align="middle" alt="{\bf S}_{t+1} \leftarrow {\bf C}{\bf \hat{\Sigma}}_{t+1}{\bf C}^T+{\bf R}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20S%7D_%7Bt%2B1%7D%20%5Cleftarrow%20%7B%5Cbf%20C%7D%7B%5Cbf%20%5Chat%7B%5CSigma%7D%7D_%7Bt%2B1%7D%7B%5Cbf%20C%7D%5ET%2B%7B%5Cbf%20R%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （観測残差の共分散）&lt;br /&gt;
&lt;img align="middle" alt="{\bf K}_{t+1} \leftarrow {\bf \hat{\Sigma}}_{t+1}{\bf C}^T{\bf S}^{-1}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20K%7D_%7Bt%2B1%7D%20%5Cleftarrow%20%7B%5Cbf%20%5Chat%7B%5CSigma%7D%7D_%7Bt%2B1%7D%7B%5Cbf%20C%7D%5ET%7B%5Cbf%20S%7D%5E%7B-1%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （最適カルマンゲイン）&lt;br /&gt;
&lt;img align="middle" alt="{\bf \mu}_{t+1} \leftarrow {\bf \hat{\mu}}_{t+1}+{\bf K}_{t+1}{\bf \tilde{y}}_{t+1}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20%5Cmu%7D_%7Bt%2B1%7D%20%5Cleftarrow%20%7B%5Cbf%20%5Chat%7B%5Cmu%7D%7D_%7Bt%2B1%7D%2B%7B%5Cbf%20K%7D_%7Bt%2B1%7D%7B%5Cbf%20%5Ctilde%7By%7D%7D_%7Bt%2B1%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （更新された現在の推定値）&lt;br /&gt;
&lt;img align="middle" alt="{\bf \Sigma}_{t+1} \leftarrow {\bf \hat{\Sigma}}_{t+1}-{\bf K}_{t+1}{\bf C}{\bf \hat{\Sigma}}_{t+1}" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20%5CSigma%7D_%7Bt%2B1%7D%20%5Cleftarrow%20%7B%5Cbf%20%5Chat%7B%5CSigma%7D%7D_%7Bt%2B1%7D-%7B%5Cbf%20K%7D_%7Bt%2B1%7D%7B%5Cbf%20C%7D%7B%5Cbf%20%5Chat%7B%5CSigma%7D%7D_%7Bt%2B1%7D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt; （更新された現在の誤差行列）&lt;/blockquote&gt;観測を得るごとにPredictionとUpdateを繰り返すことで、現在の状態を推定します。&lt;br /&gt;
&lt;br /&gt;
導出は後述（予定）。&lt;br /&gt;
&lt;br /&gt;
例題を。&lt;br /&gt;
&lt;blockquote&gt;2次元座標において、あるロボットがt=0に原点を出発して、速度(2,2)で動くとする。ロボットの進路は風などの影響を受け（σ&lt;sub&gt;x&lt;/sub&gt;=σ&lt;sub&gt;y&lt;/sub&gt;=1）、毎秒ごとに観測できるGPSによる位置座標には計測誤差（σ&lt;sub&gt;x&lt;/sub&gt;=σ&lt;sub&gt;y&lt;/sub&gt;=2）があるとする。このとき、観測された軌跡から実際の軌跡を推定する。&lt;/blockquote&gt;係数は&lt;br /&gt;
&lt;blockquote&gt;&lt;img align="middle" alt="{\bf A}=\left[ \begin{array}{cc} 1 &amp;amp; 0 \\ 0 &amp;amp; 1 \\ \end{array} \right]" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20A%7D%3D%5Cleft%5B%0A%5Cbegin%7Barray%7D%7Bcc%7D%0A1%20%26%200%20%5C%5C%0A0%20%26%201%20%5C%5C%0A%5Cend%7Barray%7D%0A%5Cright%5D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;img align="middle" alt="{\bf B}=\left[ \begin{array}{cc} 1 &amp;amp; 0 \\ 0 &amp;amp; 1 \\ \end{array} \right]" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20B%7D%3D%5Cleft%5B%0A%5Cbegin%7Barray%7D%7Bcc%7D%0A1%20%26%200%20%5C%5C%0A0%20%26%201%20%5C%5C%0A%5Cend%7Barray%7D%0A%5Cright%5D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;img align="middle" alt="{\bf u}_{const}=\left[ \begin{array}{c} 2 \\ 2 \\ \end{array} \right]" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20u%7D_%7Bconst%7D%3D%5Cleft%5B%0A%5Cbegin%7Barray%7D%7Bc%7D%0A2%20%5C%5C%0A2%20%5C%5C%0A%5Cend%7Barray%7D%0A%5Cright%5D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;img align="middle" alt="{\bf Q}=\left[ \begin{array}{cc} 1 &amp;amp; 0 \\ 0 &amp;amp; 1 \\ \end{array} \right]" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20Q%7D%3D%5Cleft%5B%0A%5Cbegin%7Barray%7D%7Bcc%7D%0A1%20%26%200%20%5C%5C%0A0%20%26%201%20%5C%5C%0A%5Cend%7Barray%7D%0A%5Cright%5D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;br /&gt;
&lt;img align="middle" alt="{\bf C}=\left[ \begin{array}{cc} 1 &amp;amp; 0 \\ 0 &amp;amp; 1 \\ \end{array} \right]" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20C%7D%3D%5Cleft%5B%0A%5Cbegin%7Barray%7D%7Bcc%7D%0A1%20%26%200%20%5C%5C%0A0%20%26%201%20%5C%5C%0A%5Cend%7Barray%7D%0A%5Cright%5D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;img align="middle" alt="{\bf R}=\left[ \begin{array}{cc} 2 &amp;amp; 0 \\ 0 &amp;amp; 2 \\ \end{array} \right]" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20R%7D%3D%5Cleft%5B%0A%5Cbegin%7Barray%7D%7Bcc%7D%0A2%20%26%200%20%5C%5C%0A0%20%26%202%20%5C%5C%0A%5Cend%7Barray%7D%0A%5Cright%5D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;/blockquote&gt;初期値は&lt;br /&gt;
&lt;blockquote&gt;&lt;img align="middle" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;chl=%7B%5Cbf%20%5Cmu%7D_0%3D%5Cleft%5B%20%5Cbegin%7Barray%7D%7Bc%7D%200%20%5C%5C%200%20%5C%5C%20%5Cend%7Barray%7D%20%5Cright%5D&amp;chs=&amp;chf=&amp;chco=" alt="{\bf \mu}_0=\left[ \begin{array}{c} 0 \\ 0 \\ \end{array} \right]"&gt;&lt;img align="middle" alt="{\bf \Sigma}_0=\left[ \begin{array}{cc} 0 &amp;amp; 0 \\ 0 &amp;amp; 0 \\ \end{array} \right]" border="0" src="http://chart.apis.google.com/chart?cht=tx&amp;amp;chl=%7B%5Cbf%20%5CSigma%7D_0%3D%5Cleft%5B%0A%5Cbegin%7Barray%7D%7Bcc%7D%0A0%20%26%200%20%5C%5C%0A0%20%26%200%20%5C%5C%0A%5Cend%7Barray%7D%0A%5Cright%5D&amp;amp;chs=&amp;amp;chf=&amp;amp;chco=" /&gt;&lt;/blockquote&gt;&lt;br /&gt;
コードは以下。要&lt;a href="http://satomacoto.blogspot.com/2010/08/snow-leopardpython64bitscipy.html"&gt;SciPy&lt;/a&gt;。（やってる事自体はSciPyは必須ではないのだけど。）&lt;br /&gt;
&lt;br /&gt;
&lt;script class="brush: python" type="syntaxhighlighter"&gt;
&lt;![CDATA[
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt

def main():
    # state x = A * x_ + B * u + w, w~N(0,Q)
    A = np.mat([[1,0],[0,1]])
    B = np.mat([[1,0],[0,1]])
    u = np.mat([[2],[2]])
    Q = np.mat([[1,0],[0,1]])
    # observation Y = C * x + v, v~N(0,R)
    C = np.mat([[1,0],[0,1]])
    R = np.mat([[2,0],[0,2]])
    
    # 初期化
    T = 10 # 観測数
    x = np.mat([[0],[0]]) # 初期位置
    X = [x] # 状態
    Y = [x] # 観測

    # 観測データの生成
    for i in range(T):
        x = A * x + B * u + np.random.multivariate_normal([0,0],Q,1).T
        X.append(x)
        y = C * x + np.random.multivariate_normal([0,0],R,1).T
        Y.append(y)
    
    # LKF
    mu = np.mat([[0],[0]])
    Sigma = np.mat([[0,0],[0,0]])
    M = [mu] # 推定
    for i in range(T):
        # prediction
        mu_ = A * mu + B * u
        Sigma_ = Q + A * Sigma * A.T
        # update
        yi = Y[i+1] - C * mu_
        S = C * Sigma_ * C.T + R
        K = Sigma_ * C.T * S.I
        mu = mu_ + K * yi
        Sigma = Sigma_ - K * C * Sigma_        
        M.append(mu)

    # 描画
    a,b = np.array(np.concatenate(X,axis=1))
    plt.plot(a,b,'rs-')
    a,b = np.array(np.concatenate(Y,axis=1))
    plt.plot(a,b,'g^-')
    a,b = np.array(np.concatenate(M,axis=1))
    plt.plot(a,b,'bo-')
    plt.axis('equal')
    plt.show()

if __name__ == '__main__':
    main()
]]&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
実行結果は下図。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-p5iV6zySQjc/Tf279AdGPLI/AAAAAAAADTU/iixI3QrFQSU/s1600/lkf.png" imageanchor="1"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-p5iV6zySQjc/Tf279AdGPLI/AAAAAAAADTU/iixI3QrFQSU/s400/lkf.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;b&gt;Fig.1&lt;/b&gt; &lt;span class="Apple-style-span" style="color: red;"&gt;■&lt;/span&gt;が実際の軌跡。&lt;span class="Apple-style-span" style="color: #274e13;"&gt;▲&lt;/span&gt;が観測値。&lt;span class="Apple-style-span" style="color: blue;"&gt;●&lt;/span&gt;が推定値。&lt;/span&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
観測に対してカルマンフィルタによる推定値が、実際の軌跡に近いことがわかります。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-4348179206044530632?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vc1uUbfpS2eu4k4DFc3kP6ptfqw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vc1uUbfpS2eu4k4DFc3kP6ptfqw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vc1uUbfpS2eu4k4DFc3kP6ptfqw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vc1uUbfpS2eu4k4DFc3kP6ptfqw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/92n4AkMcFxU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/4348179206044530632/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2011/06/python.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/4348179206044530632?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/4348179206044530632?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/92n4AkMcFxU/python.html" title="Pythonでカルマンフィルタを実装してみる" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-p5iV6zySQjc/Tf279AdGPLI/AAAAAAAADTU/iixI3QrFQSU/s72-c/lkf.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2011/06/python.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcARXs_eCp7ImA9WhZbFEs.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-5924624551620094460</id><published>2011-06-19T02:19:00.001+09:00</published><updated>2011-06-19T14:07:24.540+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-19T14:07:24.540+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Machine Learning" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title>Python+SciPyでk-meansを実装してみる</title><content type="html">&lt;a href="http://en.wikipedia.org/wiki/K-means_clustering"&gt;k-means&lt;/a&gt;（&lt;a href="http://ja.wikipedia.org/wiki/K%E5%B9%B3%E5%9D%87%E6%B3%95"&gt;K平均法&lt;/a&gt;）はクラスタリング手法の一つ。&lt;br /&gt;
&lt;br /&gt;
Pythonでは&lt;a href="http://www.scipy.org/"&gt;SciPy&lt;/a&gt;に実装されているので簡単に利用することができます。&lt;br /&gt;
Macでは&lt;a href="http://satomacoto.blogspot.com/2010/08/snow-leopardpython64bitscipy.html"&gt;こちらの記事&lt;/a&gt;に書いてある方法で関連するソフトもインストールできます。&lt;br /&gt;
&lt;br /&gt;
たとえば下図のように2種類の2次元正規分布からサンプリングされたデータがあるとき&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-GWtHYeMT0cI/TfzbVvJTpBI/AAAAAAAADTA/kQvgKvPrGP4/s1600/kmeans0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-GWtHYeMT0cI/TfzbVvJTpBI/AAAAAAAADTA/kQvgKvPrGP4/s320/kmeans0.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
k-meansを用いると下図のようにクラスタリングされます。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-SQocoG22MWQ/TfzbeFag0nI/AAAAAAAADTI/dEEsLnjF8ko/s1600/kmeans1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-SQocoG22MWQ/TfzbeFag0nI/AAAAAAAADTI/dEEsLnjF8ko/s320/kmeans1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
以下、コード。&lt;br /&gt;
&lt;br /&gt;
&lt;script class="brush: python" type="syntaxhighlighter"&gt;
&lt;![CDATA[
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.vq import vq, kmeans, kmeans2, whiten

def main():
    # ２種類の２次元正規分布に基づきサンプリングして観測データを生成
    mean1 = [0,0]; cov1 = [[4,0],[0,100]]; N1 = 1000
    X1 = np.random.multivariate_normal(mean1,cov1,N1)
    mean2 = [10,-10]; cov2 = [[1,20],[20,50]]; N2 = 1000
    X2 = np.random.multivariate_normal(mean2,cov2,N2)
    X = np.concatenate((X1,X2))

    # 描画
    x,y = X.T
    plt.plot(x,y,'k.'); plt.axis('equal'); plt.show()
    
    # kmeans2でクラスタリング
    whitened = whiten(X) # 正規化（各軸の分散を一致させる）
    centroid, label = kmeans2(whitened, k=2) # kmeans2
    C1 = []; C2 = [] # クラスタ保存用
    for i in range(len(X)):
        if label[i] == 0:
            C1 += [whitened[i]]
        elif label[i] == 1:
            C2 += [whitened[i]]
    
    # 描画
    x,y = zip(*C1)
    plt.plot(x, y, 'r.')
    x,y = zip(*C2)
    plt.plot(x, y, 'g.')
    x,y = centroid.T
    plt.plot(x, y, 'bx')
    plt.axis('equal')
    plt.show()

if __name__ == '__main__':
    main()
]]&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
SciPyを用いるとk-meansは21~22行目の実質2行で利用することができます。&lt;br /&gt;
&lt;br /&gt;
なおサンプリングについては &lt;a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.multivariate_normal.html"&gt;ここ&lt;/a&gt; を、kmeansについては &lt;a href="http://docs.scipy.org/doc/scipy/reference/cluster.vq.html"&gt;ここ&lt;/a&gt; を参照。&lt;br /&gt;
&lt;br /&gt;
ちなみに正規化しないと下図のようになってしまいます。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-309j_d78nsY/TfzbztCGr9I/AAAAAAAADTM/icVG8yeP3vU/s1600/kmeans2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-309j_d78nsY/TfzbztCGr9I/AAAAAAAADTM/icVG8yeP3vU/s320/kmeans2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
k-meansのアルゴリズムについては、&lt;a href="http://www.geocities.jp/kashi_pong/course_machine_learning_2010.html"&gt;鹿島先生の講義資料&lt;/a&gt;の概論②の14~16ページの説明なんかが分かりやすいかもしれません。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-5924624551620094460?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/z-Z3GY5FS6Cb3nri5-YDhlJIIKo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/z-Z3GY5FS6Cb3nri5-YDhlJIIKo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/z-Z3GY5FS6Cb3nri5-YDhlJIIKo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/z-Z3GY5FS6Cb3nri5-YDhlJIIKo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/MgDop9vcKIY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/5924624551620094460/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2011/06/pythonscipyk-means.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/5924624551620094460?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/5924624551620094460?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/MgDop9vcKIY/pythonscipyk-means.html" title="Python+SciPyでk-meansを実装してみる" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-GWtHYeMT0cI/TfzbVvJTpBI/AAAAAAAADTA/kQvgKvPrGP4/s72-c/kmeans0.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2011/06/pythonscipyk-means.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAHRnsyeyp7ImA9WhRRGE8.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-6250257201250840605</id><published>2011-05-22T22:13:00.003+09:00</published><updated>2011-12-02T20:02:17.593+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-02T20:02:17.593+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MySQL" /><category scheme="http://www.blogger.com/atom/ns#" term="Homebrew" /><title>HomebrewでMySQL 5.5.10をインストール</title><content type="html">&lt;a href="http://mxcl.github.com/homebrew/"&gt;Homebrew&lt;/a&gt;で&lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt;をインストール。&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;brew install mysql&lt;/blockquote&gt;&lt;br /&gt;
でインストール。この後にすべきことはすべてターミナルに表示されています。ただ、ちゃんと見ないで適当に進めていたら、動きませんでした。ターミナルは管理者権限で実行しなければならないものもあります。（コマンドの前に sudo を付ける）&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;unset TMPDIR&lt;br /&gt;
mysql_install_db --verbose --user=&lt;span class="Apple-style-span" style="color: red;"&gt;satomacoto&lt;/span&gt; --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;satomacoto&lt;/span&gt;はオーナー権限のある自分のユーザ名を。--verboseで色々出力されているはずなので、&lt;b&gt;この時点でエラーが起きていないか要確認&lt;/b&gt;。&lt;br /&gt;
&lt;br /&gt;
（追記）&lt;br /&gt;
5.5.14にするときはwhoamiを使った&lt;br /&gt;
&lt;blockquote&gt;mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp&lt;/blockquote&gt;（追記終わり）&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;mysql.server start&lt;/blockquote&gt;で起動。なお、停止は mysql.server stop&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;/usr/local/Cellar/mysql/5.5.10/bin/mysql_secure_installation&lt;/blockquote&gt;でパスワードなど設定。&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;mysql -uroot -p&lt;/blockquote&gt;でrootで接続。&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;mkdir -p ~/Library/LaunchAgents&lt;br /&gt;
cp /usr/local/Cellar/mysql/5.5.10/com.mysql.mysqld.plist ~/Library/LaunchAgents/&lt;br /&gt;
launchctl load -w ~/Library/LaunchAgents/com.mysql.mysqld.plist&lt;/blockquote&gt;でOS起動時にMySQL起動。なお、このままだと、mysql.server stop で停止しようとしてもすぐに再起動されてしまうので、停止するときは launchctl unload -w ~/Library/LaunchAgents/com.mysql.mysqld.plist する。phpAdminがうまく動かないものだから、Property List EditorでWorkingDirectoryとUserNameの項目は削除してしまった。&lt;br /&gt;
&lt;br /&gt;
ソケットはデフォルトで /tmp/mysql.sock 。以下で確認。&lt;br /&gt;
&lt;blockquote&gt;mysql_config --socket&lt;/blockquote&gt;&lt;br /&gt;
うまく行かなかったので何度かやり直した。&lt;br /&gt;
削除は、&lt;br /&gt;
&lt;blockquote&gt;brew uninstall mysql&lt;br /&gt;
sudo rm -rf /usr/local/var/mysql&lt;/blockquote&gt;&lt;br /&gt;
MySQL 5.5ではデフォルトでutf-8設定になっている。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-6250257201250840605?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/h11Zkjrw3y2NCiUbvLFwsNeDJPI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/h11Zkjrw3y2NCiUbvLFwsNeDJPI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/h11Zkjrw3y2NCiUbvLFwsNeDJPI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/h11Zkjrw3y2NCiUbvLFwsNeDJPI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/nrOlpnwMViE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/6250257201250840605/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2011/05/homebrewmysql-5510.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/6250257201250840605?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/6250257201250840605?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/nrOlpnwMViE/homebrewmysql-5510.html" title="HomebrewでMySQL 5.5.10をインストール" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2011/05/homebrewmysql-5510.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8HQnkzeyp7ImA9WhZXFUs.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-803724821057144889</id><published>2011-05-05T12:55:00.002+09:00</published><updated>2011-05-05T12:57:13.783+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-05T12:57:13.783+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Extension" /><category scheme="http://www.blogger.com/atom/ns#" term="Chrome" /><title>Googleの検索結果に言語を変更するためのリンクを追加するChrome Extension</title><content type="html">Googleの検索設定では、たとえば表示言語を日本語に設定していると、英語だけの検索結果がほしいとき、優先する検索言語を英語“のみ”にすることが出来ません。たぶん。そこで、検索言語を変更するためのリンクをGoogleのサイドバーに追加するChromeの拡張機能を作ってみました。&lt;br /&gt;
&lt;br /&gt;
インストールは以下のページから。&lt;br /&gt;
&lt;a href="https://chrome.google.com/webstore/detail/eemleifbnibgnoifdjohpchdemidjibj"&gt;Language Links for Google - Chrome Web Store&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
（以前にも、Greasemonkeyで似たようなものを幾つか作りました。今は動くかわかりません。）&lt;ul&gt;&lt;li&gt;&lt;a href="http://userscripts.org/scripts/show/69936"&gt;Google Language Links&lt;/a&gt; サイドバーにリンクを追加。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://userscripts.org/scripts/show/66752"&gt;Google Search Language Jumper&lt;/a&gt; 演算子っぽく。（&lt;a href="http://satomacoto.blogspot.com/2010/01/googlegreasemokey_24.html"&gt;解説&lt;/a&gt;）&lt;/li&gt;
&lt;li&gt;&lt;a href="http://userscripts.org/scripts/show/66528"&gt;Google Search Language Selector&lt;/a&gt; 検索窓の下にラジオボタンを追加。（&lt;a href="http://satomacoto.blogspot.com/2010/01/googlegreasemokey.html"&gt;解説&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
使い方。&lt;br /&gt;
&lt;br /&gt;
インストールしてGoogleで検索するとアドレスバーにアイコンが表示されます。これをクリックするとオプションページに飛びます。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-NKWVbjQFjt8/TcIYz8UetMI/AAAAAAAADPE/UIF8OXZD-yc/s1600/ss2.png" imageanchor="1"&gt;&lt;img border="0" height="275" src="http://2.bp.blogspot.com/-NKWVbjQFjt8/TcIYz8UetMI/AAAAAAAADPE/UIF8OXZD-yc/s400/ss2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
オプションページで追加する言語を選択し保存します。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-a-UHH_ZK2lI/TcIY6uZ8-VI/AAAAAAAADPM/DDRDBASfqMs/s1600/ss3.png" imageanchor="1"&gt;&lt;img border="0" height="275" src="http://3.bp.blogspot.com/-a-UHH_ZK2lI/TcIY6uZ8-VI/AAAAAAAADPM/DDRDBASfqMs/s400/ss3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
サイドバーに選択した言語での検索結果へのリンクが追加されます。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-7XroKHedYzA/TcIYtQY7UAI/AAAAAAAADO8/Jn9763fEy0w/s1600/ss.png" imageanchor="1"&gt;&lt;img border="0" height="275" src="http://1.bp.blogspot.com/-7XroKHedYzA/TcIYtQY7UAI/AAAAAAAADO8/Jn9763fEy0w/s400/ss.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
リンクをクリックすると該当する言語で検索を行います。&lt;br /&gt;
（まだうまく動かない時もあります…。）&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
以下、開発メモ。&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Instantへの対応&lt;/h4&gt;&lt;pre class="javascript" name="code"&gt;function addLink() {
...
}

document.addEventListener('DOMNodeInserted', addLink, false);
&lt;/pre&gt;ページ要素が変化するたびにリンク先を変更。割と力技。もっと効率のよいやり方があるような。&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Page actionの表示&lt;/h4&gt;background.html&lt;br /&gt;
&lt;pre class="javascript" name="code"&gt;chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    if (request.method == "getLang") {
        sendResponse({lang: JSON.parse(localStorage.getItem("lang"))});
        chrome.pageAction.show(sender.tab.id);
    }
&lt;/pre&gt;&lt;a href="http://code.google.com/chrome/extensions/pageAction.html"&gt;Page Actions - Google Chrome Extensions - Google Code&lt;/a&gt;のExamplesから…&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Content scriptでlocalstorageを使用&lt;/h4&gt;&lt;a href="http://stackoverflow.com/questions/3937000/chrome-extension-accessing-localstorage-in-content-script"&gt;Chrome extension  accessing localstorage in content script - Stack Overflow&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;複数言語への対応&lt;/h4&gt;&lt;a href="http://dev.screw-axis.com/doc/chrome_extensions/guide/i18n/"&gt;国際化   Chrome Extensions API リファレンス&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-803724821057144889?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pQiUsN_dthqlrSSp7f0STjVKlSs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pQiUsN_dthqlrSSp7f0STjVKlSs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pQiUsN_dthqlrSSp7f0STjVKlSs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pQiUsN_dthqlrSSp7f0STjVKlSs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/pjjxIvYkSes" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/803724821057144889/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2011/05/googlechrome-extension.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/803724821057144889?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/803724821057144889?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/pjjxIvYkSes/googlechrome-extension.html" title="Googleの検索結果に言語を変更するためのリンクを追加するChrome Extension" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-NKWVbjQFjt8/TcIYz8UetMI/AAAAAAAADPE/UIF8OXZD-yc/s72-c/ss2.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2011/05/googlechrome-extension.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMHSXk_fSp7ImA9WhZXEkk.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-3381004282228394389</id><published>2011-05-01T18:33:00.000+09:00</published><updated>2011-05-01T18:33:58.745+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-01T18:33:58.745+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="misc" /><title>Googleの検索結果のイメージ</title><content type="html">&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/-6oQv2PX0rEk/Tb0n_jTbz3I/AAAAAAAADOU/3jPwfsqKe-k/s1600/googleimage.png" imageanchor="1" style="margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-6oQv2PX0rEk/Tb0n_jTbz3I/AAAAAAAADOU/3jPwfsqKe-k/s1600/googleimage.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Googleの検索結果の"Google"の画像を保存すると…&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/-spxhLUmDjUo/Tb0oB4KupHI/AAAAAAAADOY/sQ2rOeHf2-A/s1600/webhp.png" imageanchor="1" style="margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-spxhLUmDjUo/Tb0oB4KupHI/AAAAAAAADOY/sQ2rOeHf2-A/s1600/webhp.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
こんなかんじ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-3381004282228394389?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LRLaR7jhPv8nV-IYB50pNMI6bMk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LRLaR7jhPv8nV-IYB50pNMI6bMk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/LRLaR7jhPv8nV-IYB50pNMI6bMk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LRLaR7jhPv8nV-IYB50pNMI6bMk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/chmX8NUVb_g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/3381004282228394389/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2011/05/google.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/3381004282228394389?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/3381004282228394389?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/chmX8NUVb_g/google.html" title="Googleの検索結果のイメージ" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-6oQv2PX0rEk/Tb0n_jTbz3I/AAAAAAAADOU/3jPwfsqKe-k/s72-c/googleimage.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2011/05/google.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQAQ30-eip7ImA9WhZSE0Q.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-8201173743314432597</id><published>2011-02-02T18:44:00.002+09:00</published><updated>2011-03-29T20:32:22.352+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-29T20:32:22.352+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MacBook Air" /><title>TerminalでOptionキーをMetaキーとして使う</title><content type="html">デフォルトの状態ではTerminal上のEmacsではM-vと押すと√になってしまいます．&lt;br /&gt;
&lt;br /&gt;
そこでTerminalのEmacsでoptionキーでなくMetaキーとして使いたい時は，TerminalのPreferencesからSettingを選びUse option as meta keyにチェックを入れます．&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_zzlOmscOOTs/TUknUnvY1vI/AAAAAAAAC4s/YrbnIuH357Q/s1600/Settings.jpg" imageanchor="1" style=""&gt;&lt;img border="0" height="319" width="400" src="http://2.bp.blogspot.com/_zzlOmscOOTs/TUknUnvY1vI/AAAAAAAAC4s/YrbnIuH357Q/s400/Settings.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Carbon EmacsやらCocoa EmacsやらではcommandキーをMetaキーとして使うこともできるようです，&lt;br /&gt;
&lt;a href="http://www.emacswiki.org/emacs/MetaKeyProblems"&gt;http://www.emacswiki.org/emacs/MetaKeyProblems&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-8201173743314432597?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8lzHgM5WAATuvmFE0xXSG28Pa4U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8lzHgM5WAATuvmFE0xXSG28Pa4U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8lzHgM5WAATuvmFE0xXSG28Pa4U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8lzHgM5WAATuvmFE0xXSG28Pa4U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/iUJJdCDDhZA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/8201173743314432597/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2011/02/terminaloptionmeta.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/8201173743314432597?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/8201173743314432597?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/iUJJdCDDhZA/terminaloptionmeta.html" title="TerminalでOptionキーをMetaキーとして使う" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_zzlOmscOOTs/TUknUnvY1vI/AAAAAAAAC4s/YrbnIuH357Q/s72-c/Settings.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2011/02/terminaloptionmeta.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEENQHw6eSp7ImA9WhRUFEo.&quot;"><id>tag:blogger.com,1999:blog-4117638208883815282.post-6719779875306448120</id><published>2011-01-24T00:53:00.006+09:00</published><updated>2012-01-25T16:31:31.211+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-25T16:31:31.211+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MacBook Air" /><title>MacBook Airの環境を整える覚書</title><content type="html">MacBook Air (Late 2010)で基本的な環境を整えるためにやったことをメモ。&lt;br /&gt;
&lt;br /&gt;
環境設定はデフォルトだとドックバーからいける。Applicationsからも。メニューバーのリンゴマークからも。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/_zzlOmscOOTs/TTxJ0gZipFI/AAAAAAAAC2I/T6umPMYl2C0/s1600/System%2BPreferences.png" imageanchor="1"&gt;&lt;img border="0" height="154" src="http://3.bp.blogspot.com/_zzlOmscOOTs/TTxJ0gZipFI/AAAAAAAAC2I/T6umPMYl2C0/s400/System%2BPreferences.png" width="323" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
言語の設定&lt;/h3&gt;
&lt;br /&gt;
System Preferences → Language &amp;amp; Text。&lt;br /&gt;
&lt;br /&gt;
英語にする。&lt;br /&gt;
&lt;a href="http://www.google.co.jp/search?q=Mac+%E8%8B%B1%E8%AA%9E%E7%92%B0%E5%A2%83"&gt;サクサク動く&lt;/a&gt;気がする。&lt;br /&gt;
初回起動時に設定することもできるけど、後から 環境設定 → 言語 でも変更可能。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/_zzlOmscOOTs/TTxOkca-irI/AAAAAAAAC30/ypAE3JiStrc/s1600/Language%2B%2526%2BText.png" imageanchor="1"&gt;&lt;img border="0" height="347" src="http://2.bp.blogspot.com/_zzlOmscOOTs/TTxOkca-irI/AAAAAAAAC30/ypAE3JiStrc/s400/Language%2B%2526%2BText.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
ソフトウェアアップデート&lt;/h3&gt;
&lt;br /&gt;
とりあえず。&lt;br /&gt;
メニューバー左上のリンゴマークから。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/_zzlOmscOOTs/TTxJlJIp74I/AAAAAAAAC2A/yDqd7VShLuk/s1600/softwareupdate.png" imageanchor="1"&gt;&lt;img border="0" height="177" src="http://4.bp.blogspot.com/_zzlOmscOOTs/TTxJlJIp74I/AAAAAAAAC2A/yDqd7VShLuk/s400/softwareupdate.png" width="321" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
セキュリティ&lt;/h3&gt;
&lt;br /&gt;
System Preferences → Security。&lt;br /&gt;
&lt;br /&gt;
Require password ... にチェック。&lt;br /&gt;
スリープ、スクリーンセーバからの復帰は15 minutesにしておこうかな。様子見つつ。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/_zzlOmscOOTs/TTxPpvxUAfI/AAAAAAAAC4A/NDDFo1X-UqU/s1600/Security-1.png" imageanchor="1"&gt;&lt;img border="0" height="128" src="http://1.bp.blogspot.com/_zzlOmscOOTs/TTxPpvxUAfI/AAAAAAAAC4A/NDDFo1X-UqU/s400/Security-1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
アピアランス&lt;/h3&gt;
&lt;br /&gt;
System Preferences → Appearance。&lt;br /&gt;
&lt;br /&gt;
Use smooth scrolling をアンチェック。&lt;br /&gt;
Double-click a window's title bar to minimize をチェック。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/_zzlOmscOOTs/TTxRMOzJeKI/AAAAAAAAC4M/3Jxuxj7VM90/s1600/Appearance-1.png" imageanchor="1"&gt;&lt;img border="0" height="233" src="http://4.bp.blogspot.com/_zzlOmscOOTs/TTxRMOzJeKI/AAAAAAAAC4M/3Jxuxj7VM90/s400/Appearance-1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
キーボード&lt;/h3&gt;
&lt;br /&gt;
System Preferences → Keyboard。&lt;br /&gt;
&lt;br /&gt;
Use all F1, F2, etc. keys as standard function keys にチェック。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/_zzlOmscOOTs/TTxLkOD_oPI/AAAAAAAAC2s/s1daeV8wKoE/s1600/Keyboard-1.png" imageanchor="1"&gt;&lt;img border="0" height="357" src="http://2.bp.blogspot.com/_zzlOmscOOTs/TTxLkOD_oPI/AAAAAAAAC2s/s1daeV8wKoE/s400/Keyboard-1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
USキーボードではCaps Lockは使わないのでModifier Keys...でControlに変えちゃう。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/_zzlOmscOOTs/TTxM7s89fLI/AAAAAAAAC3c/_v616Lz4vGo/s1600/System%2BPreferences.png" imageanchor="1"&gt;&lt;img border="0" height="280" src="http://2.bp.blogspot.com/_zzlOmscOOTs/TTxM7s89fLI/AAAAAAAAC3c/_v616Lz4vGo/s400/System%2BPreferences.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
キーリピートを爆速にしたいので &lt;a href="http://pqrs.org/macosx/keyremap4macbook/index.html.ja"&gt;KeyRemap4MacBook&lt;/a&gt; を導入。&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;[Key Repeat] Initial Wait 100ms&lt;/li&gt;
&lt;li&gt;[Key Repeat] Wait 15ms&lt;/li&gt;
&lt;/ul&gt;
にしている。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/_zzlOmscOOTs/TTxLyOOHwbI/AAAAAAAAC20/j6FCBaYXpKU/s1600/KeyRemap4MacBook.png" imageanchor="1"&gt;&lt;img border="0" height="117" src="http://2.bp.blogspot.com/_zzlOmscOOTs/TTxLyOOHwbI/AAAAAAAAC20/j6FCBaYXpKU/s400/KeyRemap4MacBook.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;h3&gt;
トラックパッド&lt;/h3&gt;
&lt;br /&gt;
System Preferences → Trackpad。&lt;br /&gt;
&lt;br /&gt;
Tracking Speedを上から2番目、Double-Click Speedも上から2番目に。&lt;br /&gt;
One Fingerで Dragging と Drag Lock にチェック。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/_zzlOmscOOTs/TTxL_BBfefI/AAAAAAAAC28/wFrCpkWiWKg/s1600/Trackpad.png" imageanchor="1"&gt;&lt;img border="0" height="242" src="http://2.bp.blogspot.com/_zzlOmscOOTs/TTxL_BBfefI/AAAAAAAAC28/wFrCpkWiWKg/s400/Trackpad.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
マルチタッチにもいろんな機能を割り当てるBetterTouchTool, Windows 7みたいなウィンドウスナップ機能を追加するBetterSnapToolを導入するかは考えている。（&lt;a href="http://blog.boastr.net/"&gt;http://blog.boastr.net/&lt;/a&gt; リンク先上部からダウンロード）&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Exposé &amp;amp; Spacesの設定&lt;/h3&gt;
&lt;br /&gt;
System Preferences → Exposé &amp;amp; Spaces。&lt;br /&gt;
&lt;br /&gt;
Active Screen Cornersには以下のように割り当て。&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;（左上）Spaces&lt;/li&gt;
&lt;li&gt;（右上）Desktop&lt;/li&gt;
&lt;li&gt;（左下）Application Windows&lt;/li&gt;
&lt;li&gt;（右下）All Windows&lt;/li&gt;
&lt;/ul&gt;
ま、DesktopとAll Windowsは4本指スワイプに割り当てられてるんだけど…&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/_zzlOmscOOTs/TTxMR_j7giI/AAAAAAAAC3E/adZ6xa5buKQ/s1600/Expos%25C3%25A9%2B%2526%2BSpaces.png" imageanchor="1"&gt;&lt;img border="0" height="169" src="http://1.bp.blogspot.com/_zzlOmscOOTs/TTxMR_j7giI/AAAAAAAAC3E/adZ6xa5buKQ/s400/Expos%25C3%25A9%2B%2526%2BSpaces.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Spacesは今のところ変更なし。&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Spotlight&lt;/h3&gt;
&lt;br /&gt;
ソフトの起動は基本的にはSpotlightを使う。&lt;br /&gt;
&lt;a href="http://www.blacktree.com/"&gt;QuickSilver&lt;/a&gt;や&lt;a href="http://code.google.com/p/qsb-mac/"&gt;Google Quick Search Box&lt;/a&gt;よりこっちが好き。&lt;br /&gt;
たとえばTerminalを起動するときはSpotlightで「ter」と入力するとTerminalが候補に挙がってそれを選べば良い。（ただし日本語環境だと「Terminal」は「ターミナル」だからIME切り替えなきゃいけない(?)。日本語環境だと相性あんまりよくない気がする。）&lt;br /&gt;
System Preferencesの各要素にも直接行けたりして便利。&lt;br /&gt;
&lt;br /&gt;
System Preferences → Spotlight。&lt;br /&gt;
&lt;br /&gt;
ショートカットを ctrl + shift + Space に。&lt;br /&gt;
ctrl + SpaceはEclipseとかEmacsとかでかぶる。&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/_zzlOmscOOTs/TTxMgl-4kRI/AAAAAAAAC3M/a-hHwUkCXLQ/s1600/Spotlight.png" imageanchor="1"&gt;&lt;img border="0" height="377" src="http://1.bp.blogspot.com/_zzlOmscOOTs/TTxMgl-4kRI/AAAAAAAAC3M/a-hHwUkCXLQ/s400/Spotlight.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Finder&lt;/h3&gt;
&lt;br /&gt;
FinderにフォーカスしてPreferences。&lt;br /&gt;
（メニューバーからFinderを選んでPreferences、あるいはショートカットで command + ,）&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
Generalタブから&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Show these items on the desktopのすべてにチェック&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Advancedタブから&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Show all filename extensionsにチェック、&lt;/li&gt;
&lt;li&gt;When performing a searchでリストからSearch the Current Folderを選択。&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/_zzlOmscOOTs/TTxMqhqsG2I/AAAAAAAAC3U/V1weQHeQK94/s1600/Finder%2BPreferences.png" imageanchor="1"&gt;&lt;img border="0" height="267" src="http://1.bp.blogspot.com/_zzlOmscOOTs/TTxMqhqsG2I/AAAAAAAAC3U/V1weQHeQK94/s400/Finder%2BPreferences.png" width="355" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4117638208883815282-6719779875306448120?l=satomacoto.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IYgShaqhTFwMuGKgcxglO_WLvUo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IYgShaqhTFwMuGKgcxglO_WLvUo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IYgShaqhTFwMuGKgcxglO_WLvUo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IYgShaqhTFwMuGKgcxglO_WLvUo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/Satomacoto/~4/Ku5ikCpgSNU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://satomacoto.blogspot.com/feeds/6719779875306448120/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://satomacoto.blogspot.com/2011/01/macbook-air.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/6719779875306448120?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4117638208883815282/posts/default/6719779875306448120?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Satomacoto/~3/Ku5ikCpgSNU/macbook-air.html" title="MacBook Airの環境を整える覚書" /><author><name>Makoto Sato</name><uri>https://profiles.google.com/115510494979749407337</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-a2I0UevoEzI/AAAAAAAAAAI/AAAAAAAADzU/pyK6Fd6AsaE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_zzlOmscOOTs/TTxJ0gZipFI/AAAAAAAAC2I/T6umPMYl2C0/s72-c/System%2BPreferences.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://satomacoto.blogspot.com/2011/01/macbook-air.html</feedburner:origLink></entry></feed>

