<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>rn4ru diary</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/" rel="alternate"></link><link href="https://rn4ru.com/blog/feeds/all.atom.xml" rel="self" type="application/atom+xml"></link><id>https://rn4ru.com/blog/</id><updated>2017-01-24T07:50:03-06:00</updated><entry><title>ストレスフルな生活の中で心がけてること</title><link href="https://rn4ru.com/blog/posts/handling-stress-in-life/" rel="alternate"></link><published>2017-01-24T07:50:03-06:00</published><updated>2017-01-24T07:50:03-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2017-01-24:blog/posts/handling-stress-in-life/</id><summary type="html">&lt;p&gt;普段と違ったり、継続的に結果を求められたりするような環境で働いていると色々ストレスを感じることも多くなってくると思います。普段の生活でストレスに対して心がけてることを書いてみます。&lt;/p&gt;


&lt;p&gt;&lt;a href="https://flickr.com/photos/rdraio/269644977" title="A Sunny Saturday"&gt;&lt;img alt="sunny" src="https://farm1.static.flickr.com/105/269644977_7c53b7c7c5_c.jpg" /&gt;&lt;/a&gt;&lt;span class="nowrap"&gt;
&lt;a href="https://flickr.com/photos/rdraio/269644977" title="A Sunny Saturday"&gt;A Sunny Saturday&lt;/a&gt;&lt;/span&gt; flickr photo by &lt;a href="https://flickr.com/people/rdraio"&gt;rob surreal&lt;/a&gt; shared under a &lt;a href="https://creativecommons.org/licenses/by-nc-nd/2.0/"&gt;Creative Commons (BY-NC-ND) license&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最近になって根付いてきたものですが、ストレスへの対応としては自分の中で2つの軸があって、一つはそもそもストレスにしないこと。そしてもう一つはストレスと共存することです。&lt;/p&gt;
&lt;h2&gt;tl;dr&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;80/20ルールを意識しよう&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;h2&gt;80/20ルール&lt;/h2&gt;
&lt;p&gt;やらなきゃいけないことを1から100まで全部やろうという考えだと、そう思うだけで結構なストレスになってしまうんですよね。結果的に後回しにしてしまって後々泣きながらやることになってしまう。これをなくしたい。&lt;/p&gt;
&lt;p&gt;それで意識しているのは「とりあえずやる」ということです。といってもただやるだけじゃなくて、少ない時間で一番効果があるところからやる。いわゆる80/20ルールです。(これについては&lt;a href="https://rn4ru.com/blog/posts/80-20-rules-lets-try/"&gt;かなり前の記事&lt;/a&gt;にも書いてたのを見つけたのでリンクしときます。完全に忘れてた。)&lt;/p&gt;
&lt;p&gt;必ずしも全ての物事に当てはまるものでもないと思いますが、一つの基準としてとりあえず最短で80%を目指すというのを持っていると良いかもしれないです。&lt;/p&gt;
&lt;h2&gt;人に聞く&lt;/h2&gt;
&lt;p&gt;一人で3日悩んでいたのを、誰かに聞いたら5分で解決した。というような経験はありませんか？&lt;/p&gt;
&lt;p&gt;ここのところそんな感じで自分の問題を解決してもらったり、逆に他人の問題を解決したりということが多くあるので、改めて早めに誰かに尋ねることの大切さを実感しているところです。&lt;/p&gt;
&lt;p&gt;とりあえず80%終わったところで人からフィードバックをもらう、という80/20ルールとの合わせ技もよく使います。他の人からしてみたら「それ80%の中に必要ないよ」ということもあるので、(理想的には)20%しか使ってない比較的早い段階で方向修正できます。&lt;/p&gt;
&lt;h2&gt;他人を変えることはできないが自分は変われる&lt;/h2&gt;
&lt;p&gt;チームメンバーだったり、よく知らない人だったり、他人とのコミュニケーションが増えてくるとたまに自分と全く価値観が異なる人がいて面食らうことがあります。そりゃ自分が思う通りに周りの人が動いてくれればストレスもないでしょうが、なかなかそういうわけにはいかないですよね。そんな時に無理やり相手に変わってもらおうとしても大抵うまくいかないです。&lt;/p&gt;
&lt;p&gt;そこで誰かが言っていた受け売りなのですが、「相手のことは変えられないけど自分のことは自分次第で変われる」んです。自分の受け取り方や行動一つでストレスを軽減できるのならばそっちの方がトータルで必要な労力が少ないんじゃないかと思っています。&lt;/p&gt;
&lt;p&gt;もうかなり昔のことですが自動車学校へ通ってた時に、ちょっとしたミスでもなんでも怒鳴るように指摘する教官がいました。まあ車の運転はそういうミスが大惨事になることもあるのでそれは構わないんですが、逆にうまく操作できた時には当然であるかのように何も言わない人でした。&lt;/p&gt;
&lt;p&gt;叱られて伸びる人と褒められて伸びる人っていますよね。自分はどちらかというと後者よりなので最初は初心者ながらに「なんだかなー」って思っていたのですが、途中で考え方を変えてみました。その教官が助手席にいる間、できるだけ無言にさせることを目標にしたのです。&lt;/p&gt;
&lt;p&gt;それまでの価値観では教習中に叱られることは−50点、無言は0点のままとかだったのですが、それを叱られることは−50点だけど無言の間は20点ずつ加算という風に変えてみたらあまり嫌にならなくなったんです。するとその教官との教習でも萎縮しなくなって、しばらくすると怒鳴られるように注意されることもほぼなくなってました。&lt;/p&gt;
&lt;p&gt;自分の方を変えるというのは効果的ですがどちらかというと消極的に感じられるかもしれません。また、どうしても相手に変わってもらいたい時もあるでしょう。そんな時は相手に「自分を変えなきゃ」と思わせることが大切なのではないかなと思っています。この辺りのことはまだ模索中なのでもっと知見が貯まったら書いてみたいテーマの一つです。&lt;/p&gt;
&lt;h2&gt;ストレスって健康に悪いの？&lt;/h2&gt;
&lt;p&gt;最後に紹介する動画はTEDで見つけたものです。TEDについては&lt;a href="https://rn4ru.com/blog/posts/introducing-ted-how-to-use-paper-towel/"&gt;この前も書いた&lt;/a&gt;のでそっちも是非読んでみてください。&lt;/p&gt;
&lt;iframe src="https://embed.ted.com/talks/lang/ja/kelly_mcgonigal_how_to_make_stress_your_friend" width="640" height="360" frameborder="0" scrolling="no" webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;これは先に書いたようにストレスを減らす方向に自分を変えるというよりも、「別にストレスはあってもいいんだ」というふうに受け取り方を変えてみてはという話だと思います。&lt;/p&gt;
&lt;p&gt;ストレスそのものより「ストレスは害だと考えること」が害であるというのは別にストレスだけに限った話でもないかもしれないですね。&lt;/p&gt;
&lt;p&gt;もしストレスとの付き合い方や解消法があったら是非コメント欄などで教えてください。&lt;/p&gt;</summary><category term="mindset"></category><category term="ted"></category></entry><entry><title>Docker for MacでPelicanを動かす</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/pelican-on-docker-for-mac/" rel="alternate"></link><published>2017-01-15T07:00:00-06:00</published><updated>2017-01-15T07:00:00-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2017-01-15:blog/posts/pelican-on-docker-for-mac/</id><summary type="html">&lt;p&gt;このサイトを作るのに使っている静的サイトジェネレーターのPelicanをDocker for Macで動かせるようにDockerfileを書きました。&lt;/p&gt;


&lt;p&gt;&lt;a href="https://flickr.com/photos/jkirkhart35/7857348344" title="Humpback Whale enjoying a &amp;quot;snack&amp;quot;.   (not the pelican) :-)"&gt;&lt;img alt="whale pelican" src="https://farm8.static.flickr.com/7247/7857348344_36d969e06d_c.jpg" /&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="https://flickr.com/photos/jkirkhart35/7857348344" title="Humpback Whale enjoying a &amp;quot;snack&amp;quot;.   (not the pelican) :-)"&gt;flickr photo&lt;/a&gt; shared by &lt;a href="https://flickr.com/people/jkirkhart35"&gt;jkirkhart35&lt;/a&gt; under a &lt;a href="https://creativecommons.org/licenses/by/2.0/"&gt;Creative Commons ( BY ) license&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最近メインのMBPにmacOS Sierraをクリーンインストールしたのですが、それをきっかけにDocker for Macを使ってみることにしました。&lt;/p&gt;
&lt;p&gt;というわけでPelican用のDockerfileを作ってみます。DockerコンテナにPelicanの環境が閉じていればいろんなマシンで同一のPelicanを動かすことができるようになるので便利かなと。&lt;/p&gt;
&lt;p&gt;目標はDockerコンテナからpelicanのMakefileを叩いて一通りの作業ができることです。Pelicanには開発用のWebサーバがついてるので、そこに外部から接続できるようにしたいと思います。余計なものも入れない方針で。&lt;/p&gt;
&lt;p&gt;まず最初に調べてみたのは&lt;a href="https://hub.docker.com/"&gt;Docker Hub&lt;/a&gt;です。先人たちが既に用意してくれてるなら利用しない手はないので。&lt;/p&gt;
&lt;p&gt;しかし&lt;a href="https://hub.docker.com/search/?isAutomated=0&amp;amp;isOfficial=0&amp;amp;page=1&amp;amp;pullCount=0&amp;amp;q=pelican&amp;amp;starCount=0"&gt;リスト&lt;/a&gt;されてるものを上から順にいくつかみたのですがどうにもピンと来ません。一回HTML生成して終わりとか、自作のスクリプトが同梱されてるとかちょっと微妙だったので、参考にしながらも自分で作ってみることにしました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; alpine:3.4&lt;/span&gt;

&lt;span class="k"&gt;RUN&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot;@edge http://nl.alpinelinux.org/alpine/edge/main\n@testing http://nl.alpinelinux.org/alpine/edge/testing\n@community http://nl.alpinelinux.org/alpine/edge/community&amp;quot;&lt;/span&gt; &amp;gt;&amp;gt; /etc/apk/repositories

&lt;span class="k"&gt;RUN&lt;/span&gt; apk -U add --no-cache &lt;span class="se"&gt;\&lt;/span&gt;
    python &lt;span class="se"&gt;\&lt;/span&gt;
    python3 &lt;span class="se"&gt;\&lt;/span&gt;
    perl &lt;span class="se"&gt;\&lt;/span&gt;
    make &lt;span class="se"&gt;\&lt;/span&gt;
    bash &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apk -U add --no-cache --virtual deps &lt;span class="se"&gt;\&lt;/span&gt;
        py-pip &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pip install --upgrade pip &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pip install &lt;span class="nv"&gt;pelican&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.6.3 markdown &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apk del --purge deps

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8000&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /site&lt;/span&gt;
&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; [&amp;quot;bash&amp;quot;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;br/&gt;
とりあえず基本はalpineでいきます。リポジトリを設定してapkで色々取ってくるっぽいです。以下の記事も参考にさせてもらいました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://qiita.com/pottava/items/970d7b5cda565b995fe7"&gt;Alpine Linux で軽量な Docker イメージを作る - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;make devserver&lt;/code&gt;の為にbashが必要でした。&lt;code&gt;pip&lt;/code&gt;でpelicanとmarkdownを入れます。Pelicanは最新バージョンだとなぜか今のテーマの表示が崩れたので、バージョンを指定しています。&lt;/p&gt;
&lt;p&gt;開発サーバのためにポートを指定します。デフォルトでは8000です。作業ディレクトリとコンテナ起動時に実行するコマンドも設定しておきます。&lt;/p&gt;
&lt;p&gt;コンテナのビルドと起動は以下です。Dockerfileを&lt;code&gt;pelicanconf.py&lt;/code&gt;などがあるディレクトリに置くのを想定しています。カレントディレクトリをコンテナ内の&lt;code&gt;/site&lt;/code&gt;以下にマウントしてローカルの8000番ポートをコンテナにバインドします。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;docker build -t pelican .
docker run --rm -it -v &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;:/site -p &lt;span class="m"&gt;8000&lt;/span&gt;:8000 pelican
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;br/&gt;
コンテナを起動するとbashが立ち上がるのでそのまま&lt;code&gt;make devserver&lt;/code&gt;とかできます。&lt;code&gt;localhost:8000&lt;/code&gt;に接続すると開発サーバが生成されたHTMLを返すはずです。&lt;/p&gt;
&lt;p&gt;お疲れ様でした。&lt;/p&gt;</summary><category term="docker"></category><category term="pelican"></category></entry><entry><title>自分のTED観を変えたTED動画</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/introducing-ted-how-to-use-paper-towel/" rel="alternate"></link><published>2017-01-10T07:36:31-06:00</published><updated>2017-01-10T07:36:31-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2017-01-10:blog/posts/introducing-ted-how-to-use-paper-towel/</id><summary type="html">&lt;p&gt;あなたは皆に何か伝えたい、知ってほしいと思っていることはありますか？ここで紹介するのはそのうちの一つです。&lt;/p&gt;


&lt;p&gt;様々な人が、自ら伝えたいことを聴衆の前でプレゼンして、世界中に発信するTEDという場があります。サイトに行ってみると多くの動画がアップされています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ted.com/"&gt;TED: Ideas worth spreading&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一時期TEDブームみたいなのがありましたよね。このプレゼンがすごい！みたいな。自分もその時にいくつか動画を見たりしてたんですが、どうも話されてるテーマが「重い」というか壮大すぎてピンとこないことが多くてそのうち見なくなりました。&lt;/p&gt;
&lt;p&gt;そんな自分の中でTEDの価値観を変えたプレゼンを今回紹介しようと思います。5分以内の短い動画なのでまずは最後まで見てください。字幕もついてます。&lt;/p&gt;
&lt;iframe src="https://embed.ted.com/talks/lang/ja/joe_smith_how_to_use_a_paper_towel" width="640" height="360" frameborder="0" scrolling="no" webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;目から鱗が落ちるとはこのことでした。こういうのもあっていいんだ！って。よくよく聞けば根幹のテーマはペーパータオル削減による環境保護とかになると思うんですが、大上段に構えられるよりも、こうやってできることを実演されるとまずやってみようという気になりませんか？&lt;/p&gt;
&lt;p&gt;この動画の後、もっといろんなTED動画を見てみたいと思うようになります。例えばTEDの動画を視聴数で&lt;a href="http://www.ted.com/talks?sort=popular"&gt;ソート&lt;/a&gt;するとこの動画は６ページ目に来るんですよ。1ページに36本紹介されてるので、これより見られている動画がまだ200本近くあることになります。こう言われると見たくないですか？&lt;/p&gt;
&lt;p&gt;もちろんそれらのプレゼンの中にはテーマがめちゃくちゃでっかいものもあるでしょう。どうすんだこれ？みたいな。また、この動画みたいに見たらすぐわかるというスタイルでないものもあります。何が言いたいんだろう？みたいな。&lt;/p&gt;
&lt;p&gt;そんなプレゼンでも何か一つ日々の生活で応用できることを見つけられるかもと思って見ると、見るのが楽しみになりそうです。今後そういうのも紹介できたらいいなと思ってます。&lt;/p&gt;
&lt;p&gt;残念なことに自分の身の回りの洗面所はハンドドライヤーがあるところばかりなんですよね。しかしペーパータオルを使う必要があるときは必ずこの動画を思い出すようになりました。それから最後のトイレットペーパーの件、いつまでも待ってます。&lt;/p&gt;
&lt;p&gt;あなたのおすすめのTED動画があったらぜひコメント等で教えてください。&lt;/p&gt;</summary><category term="ted"></category></entry><entry><title>AWS S3のindex.htmlとCloudFrontのキャッシュ削除でちょいハマり</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/cloudfront-s3-invalidation-index/" rel="alternate"></link><published>2017-01-06T07:00:00-06:00</published><updated>2017-01-06T07:00:00-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2017-01-06:blog/posts/cloudfront-s3-invalidation-index/</id><summary type="html">&lt;p&gt;CloudFrontをS3にホストしたウェブサイトの前段として使っている場合、CloudFrontのキャッシュを削除しても思った通りの動作にならなかったので解決策を調べてみました。&lt;/p&gt;


&lt;h2&gt;tl;dr&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;S3のウェブサイトはデフォルトでURL末尾のスラッシュをindex.htmlとして解釈する。例えば、&lt;ul&gt;
&lt;li&gt;(1) &lt;code&gt;www.example.com/hoge/&lt;/code&gt; と&lt;/li&gt;
&lt;li&gt;(2) &lt;code&gt;www.example.com/hoge/index.html&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CloudFrontのキャッシュはURLそのものに効くので(2)のパスだけでなく(1)のパスをinvalidateしないと想定した動作にならない (っぽい)。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/LinkFormat.html#InvalidatingDirectories"&gt;ドキュメント&lt;/a&gt;にしっかり書いてありました (汗)。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://flickr.com/photos/mikecogh/5280585822" title="Facebook Connections"&gt;&lt;img alt="network" src="https://farm6.static.flickr.com/5048/5280585822_ed883a633a_c.jpg" /&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="https://flickr.com/photos/mikecogh/5280585822" title="Facebook Connections"&gt;flickr photo&lt;/a&gt; shared by &lt;a href="https://flickr.com/people/mikecogh"&gt;mikecogh&lt;/a&gt; under a &lt;a href="https://creativecommons.org/licenses/by-sa/2.0/"&gt;Creative Commons ( BY-SA ) license&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;CloudFrontのキャッシュとInvalidation&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://rn4ru.com/blog/posts/aws-cloudfront-and-s3-https-setup/"&gt;前回の記事&lt;/a&gt;でAmazon CloudFrontを利用してウェブサイトをSSL化することにしましたが、もう一つの機能としてCDN (Content Delivery Network)というものがあります。というかむしろこっちのほうがメインです。&lt;/p&gt;
&lt;p&gt;CDNを使うとインターネット上のコンテンツを効果的に配信することができます。詳しくはWikipedia等を参照してください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%83%87%E3%83%AA%E3%83%90%E3%83%AA%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF"&gt;コンテンツデリバリネットワーク - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CDNの機能として配信されたコンテンツをキャッシュしておいて配信元のサーバにアクセスする頻度を下げるというものがあります。逆に言うとCDNにキャッシュされているものは常に最新の状態ではないかもしれません。&lt;/p&gt;
&lt;p&gt;例えば、このサイトで新しい記事を書いたときにトップページやサイドバーに表示されている最新記事のリストを変更したかったりしますが、それらがキャッシュされてしまっているといくらリロードしても以前の表示のままになってしまいます。&lt;/p&gt;
&lt;p&gt;そこで登場するのがinvalidationです。この操作を行うとCloudFrontに対して指定したコンテンツのキャッシュを破棄するように伝えることができます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html"&gt;Invalidating Objects (Web Distributions Only) - Amazon CloudFront&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;自分の場合、ブログ記事を新たに書いたときに少なくとも&lt;a href="https://rn4ru.com"&gt;トップページ&lt;/a&gt;と&lt;a href="https://rn4ru.com/blog/"&gt;ブログトップ&lt;/a&gt;、&lt;a href="https://rn4ru.com/blog/archives/"&gt;アーカイブ&lt;/a&gt;は最新にしておきたかったのでそれぞれに対してinvalidationをしようと思いました。&lt;/p&gt;
&lt;p&gt;さて、ほとんどのWebサーバの動作としてURL末尾がスラッシュで終わっているときに指定したファイルを表示するということができます。&lt;/p&gt;
&lt;p&gt;S3をウェブサイトとして利用するときも例外ではなく、デフォルトでindex.htmlの内容を表示させることができます。つまり &lt;code&gt;rn4ru.com/&lt;/code&gt; にアクセスしたとき、 &lt;code&gt;rn4ru.com/index.html&lt;/code&gt; の内容が表示されます。&lt;/p&gt;
&lt;p&gt;そういうわけで実際に表示されているのはindex.htmlなのだから更新時はそのファイルのみをinvalidateすればいいと思っていました。実はそれだけでは不十分で、末尾スラッシュのほうもinvalidateしなければなりません。&lt;/p&gt;
&lt;p&gt;と、ここまで書いておいてもう一度公式のドキュメントを確認したら&lt;a href="http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/LinkFormat.html#InvalidatingDirectories"&gt;しっかり書いてありました&lt;/a&gt; (汗)。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Browsers and other web applications will resolve both formats to the same directory. &lt;strong&gt;However, CloudFront stores public URLs exactly as they appear in the request.&lt;/strong&gt; If you want to invalidate a directory, you'll need to specify the exact same directory, including or excluding the slash.&lt;/p&gt;
&lt;p&gt;(強調筆者)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;つまりブラウザのアドレスバーに表示されてるURLとしてキャッシュするということですね。&lt;/p&gt;
&lt;p&gt;しかしこの書き方だと末尾スラッシュなしのもinvalidateしないと駄目っぽいですが、ブラウザの挙動をみてるとスラッシュなしはスラッシュありにリダイレクトされてるみたいです。「リダイレクトされる」という動作がキャッシュされてるなら別にそれはそれでいいかなとも思うのですが、詳しい人がいたらアドバイスいただけると嬉しいです。&lt;/p&gt;
&lt;h2&gt;結論&lt;/h2&gt;
&lt;p&gt;ドキュメントはちゃんと読みましょう。&lt;/p&gt;</summary><category term="aws"></category><category term="s3"></category><category term="cloudfront"></category></entry><entry><title>AWS CloudFrontを使ってS3上のウェブサイトをHTTPSに対応した</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/aws-cloudfront-and-s3-https-setup/" rel="alternate"></link><published>2017-01-04T07:25:00-06:00</published><updated>2017-01-04T07:25:00-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2017-01-04:blog/posts/aws-cloudfront-and-s3-https-setup/</id><summary type="html">&lt;p&gt;AWSのCloudFrontを導入してHTTPをHTTPSにリダイレクトするようにしました。いまのところうまく動いてるっぽい。&lt;/p&gt;


&lt;p&gt;&lt;a href="https://flickr.com/photos/111692634@N04/16042227002" title="Cloud Security - Secure Data - Cyber Security"&gt;&lt;img alt="Cyber Security" src="https://farm9.static.flickr.com/8604/16042227002_1d00e0771d.jpg" /&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="https://flickr.com/photos/111692634@N04/16042227002" title="Cloud Security - Secure Data - Cyber Security"&gt;flickr photo&lt;/a&gt; shared by &lt;a href="https://flickr.com/people/111692634@N04"&gt;perspec_photo88&lt;/a&gt; under a &lt;a href="https://creativecommons.org/licenses/by-sa/2.0/"&gt;Creative Commons ( BY-SA ) license&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;理由としてはただ &lt;a href="https://aws.amazon.com/cloudfront/"&gt;Amazon CloudFront&lt;/a&gt; を使ってみたかったから。果たしてこの設定が報われる日は来るのだろうか。その他ウェブサイトのSSL化については以下の記事が詳しいです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hyper-text.org/archives/2015/01/full_time_ssl_website_quick_start.shtml"&gt;5分でわかる正しい Web サイト常時 SSL 化のための基礎知識 | WWW WATCH&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;まあそれはともかく、このサイトは以前より &lt;a href="http://www.rn4ru.com/"&gt;www.rn4ru.com&lt;/a&gt; から &lt;a href="http://rn4ru.com/"&gt;rn4ru.com&lt;/a&gt; にリダイレクトされるような設定になっていましたが (&lt;a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html#root-domain-walkthrough-s3-tasks"&gt;設定例&lt;/a&gt;)、今回はさらに &lt;a href="http://rn4ru.com/"&gt;http://rn4ru.com/&lt;/a&gt; から &lt;a href="https://rn4ru.com/"&gt;https://rn4ru.com/&lt;/a&gt; にリダイレクトされるようになります。&lt;/p&gt;
&lt;p&gt;導入には以下の記事を参考にさせてもらいました。というかほぼこの通りにやっただけ。記事の最後に「誰の役に立つのかわからない内容になってしまいましたが」と書かれていますが、大変役立ちました。このような記事をこのブログでも公開していけるようになるのが目標です。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.majimena.co.jp/tech/2016/03/31/aws-ssl.html"&gt;Amazon S3でSSL対応の静的ウェブサイトを公開する | マジメナラボ - majimena Inc.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;重要なところとしては、wwwつきとwwwなしのS3ウェブサイトに対してCloudFrontディストリビューションをそれぞれ作成することと、それらにDNSでAレコードを向けること (Route53を使っています) でしょうか。別の記事で一つのディストリビューションにAlternate Domain Namesを2つ設定して、wwwつきの方をCNAMEにするとあったのですがそれだとwwwつきがうまくリダイレクトされませんでした。&lt;/p&gt;
&lt;p&gt;証明書の発行については以下の記事が参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://dev.classmethod.jp/cloud/aws/acm-cloudfront-ssl/"&gt;[ACM] AWS Certificate Manager 無料のサーバ証明書でCloudFrontをHTTPS化してみた ｜ Developers.IO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回はrn4ru.comと*.rn4ru.comの証明書を発行しました。発行するドメインに対するメール(hostmaster@domainなど)を自ら受け取れる環境が必要です。ワイルドカードの証明書はプレフィックス無しのほうにも対応できるようなことが書いてありましたが、試せていません。&lt;/p&gt;</summary><category term="aws"></category><category term="cloudfront"></category></entry><entry><title>AWS CLIを使ってS3上でのリダイレクトを設定する</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/redirecting-on-s3-using-aws-cli/" rel="alternate"></link><published>2017-01-02T07:30:56-06:00</published><updated>2017-01-02T07:30:56-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2017-01-02:blog/posts/redirecting-on-s3-using-aws-cli/</id><summary type="html">&lt;p&gt;このブログは静的ファイルジェネレータのPelicanで作成したHTMLファイルをAWSのS3にホストしているのですが(&lt;a href="https://rn4ru.com/blog/posts/blog-moved-to-aws-s3/"&gt;過去記事&lt;/a&gt;)、今回URLを変更して、それに伴うリダイレクトをコマンドラインから設定しました。&lt;/p&gt;


&lt;p&gt;&lt;a href="https://flickr.com/photos/shan213/13959393796" title="Atlanta at Night"&gt;&lt;img alt="detour sign" src="https://farm8.static.flickr.com/7181/13959393796_434dc4c351.jpg" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;a href="https://flickr.com/photos/shan213/13959393796" title="Atlanta at Night"&gt;flickr photo&lt;/a&gt; shared by &lt;a href="https://flickr.com/people/shan213"&gt;ShanMcG213&lt;/a&gt; under a &lt;a href="https://creativecommons.org/licenses/by-sa/2.0/"&gt;Creative Commons ( BY-SA ) license&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;記事の年月日をURLからなくすことにしました。特に必要な理由もないし、短い方がいいなと思ったので。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="err"&gt;前: http://rn4ru.com/blog/posts/YYYY/bbb/DD/hogehoge/&lt;/span&gt;
&lt;span class="err"&gt;後: http://rn4ru.com/blog/posts/hogehoge/&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;すると問題になるのがリダイレクトです。URLを変更すると以前のURLでリンクされている記事が軒並みNotFoundになってしまい、せっかく見に来てくれた人をがっかりさせてしまうことになります。&lt;/p&gt;
&lt;p&gt;もしApacheのmod_rewriteを利用しているなら年月日を取り除くのは正規表現一発でできそうですが、AWSのS3ではどうでしょうか。&lt;/p&gt;
&lt;p&gt;結論から言うと、S3をWebsiteとして利用している場合には各オブジェクトに対してリダイレクトを&lt;a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html"&gt;設定すること&lt;/a&gt;ができます。ただし、すべてのリダイレクトを手作業でやっていくにはちょっと骨が折れそうです。&lt;/p&gt;
&lt;p&gt;そこでAWSのCLIを使ってS3のAPIを叩くことにします(&lt;a href="http://docs.aws.amazon.com/cli/latest/reference/s3api/put-object.html"&gt;リファレンス&lt;/a&gt;)。リダイレクトをオブジェクトに設定するコマンドは以下の通りです。ここではPelicanについてきたMakefileに追記しました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;REDIRECT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;aws s3api put-object --acl public-read --bucket hoge --key &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt; --website-redirect-location &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;リダイレクト前のオブジェクトを$(1)、リダイレクト対象のオブジェクトを$(2)に指定してください。あとはリダイレクト前、後のパスを一行に書いたリストのファイルを用意しておいてwhileループを回します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nf"&gt;redirect&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
 @while &lt;span class="nb"&gt;read&lt;/span&gt; line&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="k"&gt;$(&lt;/span&gt;call REDIRECT,&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;line%% *&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;line##* &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="k"&gt;done&lt;/span&gt; &amp;lt; redirect_file
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;0バイトのオブジェクトがS3上にできてしまうので、ちょっと気持ち悪いこともなくはないですが、無事にリダイレクトを設定することができました。&lt;/p&gt;</summary><category term="aws"></category><category term="s3"></category></entry><entry><title>タスク管理をToDoリストからカレンダーメインに変えてみた</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/task-management-from-todo-list-to-calendar/" rel="alternate"></link><published>2016-07-12T06:38:19-05:00</published><updated>2016-07-12T06:38:19-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2016-07-12:blog/posts/task-management-from-todo-list-to-calendar/</id><summary type="html">&lt;p&gt;先日&lt;a href="http://rebuild.fm/148/"&gt;Rebuild.fm&lt;/a&gt;を聞いていたら、&lt;a href="https://www.getplan.co/"&gt;Plan&lt;/a&gt;というカレンダーベースのタスク管理システムが紹介されていました。自分も最近カレンダーベースがいいかもなと思ってToDoリストメインから移行したのでそこに至った経緯を書いてみようかと思います。&lt;/p&gt;


&lt;p&gt;きっかけはproductivityistというpodcastの&lt;a href="https://productivityist.com/podcast-62-kevin-kruse/"&gt;1エピソード&lt;/a&gt;を聞いたときでした。ゲストのKevin Kruseさんは成功者の習慣をテーマに、7人の億万長者、13人のオリンピックメダリスト、29人のオールA成績保持者、239人の経営者を調査・インタビューした本を出したそうです。&lt;/p&gt;
&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B016FPTIZ6/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/514of%2BuR-mL._SL160_.jpg" alt="15 Secrets Successful People Know About Time Management: The Productivity Habits of 7 Billionaires, 13 Olympic Athletes, 29 Straight-A Students, and 239 Entrepreneurs (English Edition)" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B016FPTIZ6/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;15 Secrets Successful People Know About Time Management: The Productivity Habits of 7 Billionaires, 13 Olympic Athletes, 29 Straight-A Students, and 239 Entrepreneurs (English Edition)&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 16.07.12&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;The Kruse Group (2015-10-09)&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B016FPTIZ6/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;

&lt;p&gt;追記：日本語版も出てるみたいです。&lt;/p&gt;
&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B074GWMRFC/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="https://images-fe.ssl-images-amazon.com/images/I/51O1yQV3MZL._SL160_.jpg" alt="1440分の使い方 ──成功者たちの時間管理15の秘訣" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B074GWMRFC/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;1440分の使い方 ──成功者たちの時間管理15の秘訣&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 18.03.19&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;パンローリング株式会社 (2017-08-05)&lt;br /&gt;売り上げランキング: 39&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B074GWMRFC/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;24分すぎからタスク管理に話が移り、そこで話されていたことがとても印象的だったのでなにかと影響されやすい自分はさっそくKindle版をポチってみました。&lt;/p&gt;
&lt;p&gt;実際読んでみると、著者自身の体験と調査対象の人たちの発言、科学的裏付けの3つの要素で構成されていて、ちょっととっ散らかってる感はあるものの、各章は短くまとまっているし文章自体も読みやすい英語で書かれていたので気軽に読める感じでした。&lt;/p&gt;
&lt;h2&gt;問題点&lt;/h2&gt;
&lt;p&gt;タスク管理にToDoリストを使うな、というKevinさんの主張は&lt;a href="http://www.kevinkruse.com/list-important-things-go-die/"&gt;この記事&lt;/a&gt;にもまとまっていますが、本だと第3章にもうちょっと詳しく書いてあります。&lt;/p&gt;
&lt;p&gt;ToDoリストでタスク管理をする場合の問題点は、「各タスクが一元的に積まれている」というところにあります。タスクを一瞥しただけではそのタスクがどのくらいかかるのか、どれほど重要なのかということがわかりづらいということです。&lt;/p&gt;
&lt;p&gt;その結果、次のタスクを消化しようとするときに結局リストすべてをレビューしなくてはいけなかったり、瞬時に判断しやすい「簡単である」か「緊急である」タスクを優先して、「重要な」タスクを後回しにしてしまったり、さらにはリストに未消化のタスクが積んであるのを見るだけでストレスになったりする(&lt;a href="https://ja.wikipedia.org/wiki/%E3%83%84%E3%82%A1%E3%82%A4%E3%82%AC%E3%83%AB%E3%83%8B%E3%82%AF%E5%8A%B9%E6%9E%9C"&gt;ツァイガルニク効果&lt;/a&gt;による)そうです。&lt;/p&gt;
&lt;p&gt;実際この辺りの問題点ってGTDとかを実践してる方にとってはNext Actionや日次、週次レビューでカバーしたり、何が重要かを常に意識するマインドセットになってるのでしょうが、なんでもかんでもリストに放り込む使い方をしてた自分にとっては身につまされる思いでした。&lt;/p&gt;
&lt;p&gt;「ToDoリストに積まれている項目のうち41%は永遠に実行されない」という統計データもかなり自分の経験に近くて耳が痛いです。&lt;/p&gt;
&lt;h2&gt;解決法&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://flickr.com/photos/dafnecholet/5374200948" title="Calendar*"&gt;&lt;img alt="Calendar*" src="https://farm6.static.flickr.com/5126/5374200948_539b10fb1c.jpg" /&gt;&lt;/a&gt; &lt;br /&gt;
&lt;a href="https://flickr.com/photos/dafnecholet/5374200948" title="Calendar*"&gt;flickr photo&lt;/a&gt; shared by &lt;a href="https://flickr.com/people/dafnecholet"&gt;DafneCholet&lt;/a&gt; under a &lt;a href="https://creativecommons.org/licenses/by/2.0/"&gt;Creative Commons ( BY ) license&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;それでは、どうすればいいのかというとカレンダーにすべての予定を書いておき、そのスケジュール通りに行動するのです。まあ実際やってみようとするとわかりますが、いうほど簡単なことじゃないです。そこで予定を決める際のいくつかのTipsが紹介されてます。&lt;/p&gt;
&lt;ol&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;/ol&gt;
&lt;p&gt;3と4が特に肝かと。事前にスケジュールしたからといって、何が何でもその通りに動かなくてはならないわけではないんです。さっきのpodcastのエピソードでは「今日は素晴らしい天気だから午後からは予定を変更して子どもたちと外へ出かけよう」という例が紹介されてます。最も重要な事は午前中に終わらせているので、そういう判断もできるとのこと。&lt;/p&gt;
&lt;p&gt;一方で、なんでもかんでも予定を遅らせていたら終わるものも終わりません。そこで一度決めた予定は病院の予約や取引先とのアポイントと同じようにします。つまり15分予定を遅らせることは取引先とのミーティングに15分遅れていくことと同じです。それをするだけの特別な理由がメールや友人のFacebookをチェックすることにありますか？&lt;/p&gt;
&lt;p&gt;驚いたことに、タスクをカレンダーに落としこむだけで、実際に行動せずともツァイガルニク効果によるストレスが軽減されるという研究結果もあるそう。ToDoリストに積みっぱなしのタスクは一月先、半年先でもいいのでまずスケジュールしてしまいましょう。&lt;/p&gt;
&lt;h2&gt;自分の場合&lt;/h2&gt;
&lt;p&gt;環境としては、家でも研究室でも作業でき、ミーティングが多すぎない程度には定期的にあり、割り込み作業がほとんど発生しない(大抵非同期コミュニケーションで解決)という感じです。ツールはOS X標準のカレンダーと、タスクの一時退避用に&lt;a href="https://todoist.com/"&gt;Todoist&lt;/a&gt;のフリー版を使っています。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;とりあえず日時が決まっている予定は事前にすべてカレンダーに放り込んでおきます。&lt;/li&gt;
&lt;li&gt;タスクが発生した場合、&lt;ol&gt;
&lt;li&gt;2分以内にできることならその場でやる(GTDっぽく)&lt;/li&gt;
&lt;li&gt;日時が指定されている場合はカレンダーに記録&lt;/li&gt;
&lt;li&gt;それ以外はTodoistに放り込みます(プロジェクトごと)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;1日の最後に翌日の予定を立てます。Todoistにたまったタスクをカレンダーにマッピングしていきます。&lt;/li&gt;
&lt;li&gt;1日の最初にもう一度確認します。後は予定通りに1日を過ごすだけ。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;タスクと予定は必ずしも一対一対応しないこともあります。殆どの場合一つのプロジェクトに関する複数のタスクはそのプロジェクトの作業予定としてまとめて時間をとります。&lt;/p&gt;
&lt;p&gt;時間をポモドーロ(25分)単位で管理していて、各プロジェクトを最低1ポモドーロはやることにしています。その他重要度に応じてプロジェクトごとのポモドーロ数を調整しています。&lt;/p&gt;
&lt;p&gt;こうしておくと各プロジェクト毎日必ず何かしらの進展があり、プロジェクトごとの作業時間もカレンダー上で可視化できるので今のところ気に入っています。&lt;/p&gt;
&lt;p&gt;一日を予定通りに過ごすことを始めてから、8ポモドーロを超えると集中力がガクッと落ちることに気が付きました。今後の課題です。&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ToDoリストからカレンダーベースのタスク管理に移行した話を書きました。予定を事前に立てておくとその通りに行動することに適度な緊張感と達成感がある気がします。作業の内容と環境によってはうまく適用できないこともあるかもしれませんが、一度試してみてはいかがでしょうか。&lt;/p&gt;
&lt;p&gt;カレンダーを用いたタスク管理以外にもいろいろなことが書かれているこの本。おすすめです。&lt;/p&gt;
&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B074GWMRFC/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="https://images-fe.ssl-images-amazon.com/images/I/51O1yQV3MZL._SL160_.jpg" alt="1440分の使い方 ──成功者たちの時間管理15の秘訣" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B074GWMRFC/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;1440分の使い方 ──成功者たちの時間管理15の秘訣&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 18.03.19&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;パンローリング株式会社 (2017-08-05)&lt;br /&gt;売り上げランキング: 39&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B074GWMRFC/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B016FPTIZ6/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/514of%2BuR-mL._SL160_.jpg" alt="15 Secrets Successful People Know About Time Management: The Productivity Habits of 7 Billionaires, 13 Olympic Athletes, 29 Straight-A Students, and 239 Entrepreneurs (English Edition)" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B016FPTIZ6/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;15 Secrets Successful People Know About Time Management: The Productivity Habits of 7 Billionaires, 13 Olympic Athletes, 29 Straight-A Students, and 239 Entrepreneurs (English Edition)&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 16.07.12&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;The Kruse Group (2015-10-09)&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B016FPTIZ6/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;</summary><category term="productivity"></category><category term="calendar"></category><category term="todo"></category></entry><entry><title>正規表現が正しいことを数学的帰納法で証明する(その1)</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/regular-language-proven-by-induction-1/" rel="alternate"></link><published>2016-02-22T06:27:58-06:00</published><updated>2016-02-22T06:27:58-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2016-02-22:blog/posts/regular-language-proven-by-induction-1/</id><summary type="html">&lt;p&gt;自分がTAをやっている理論系のクラスの宿題から、多くの学生がつまづいていたところを紹介解説してみます。問題をかいつまんで言うと&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;アルファベットa、bからなる文字列のうち、aが偶数個ある文字列にマッチする正規表現を示し、それが正しいということを証明せよ。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;用語について英語日本語間の対訳は適当なのでご了承下さい。原文も並べて書きたいのですがそれはまずいかもなんでやめときます。&lt;/p&gt;
&lt;p&gt;この記事では&lt;a href="https://www.mathjax.org/"&gt;MathJax&lt;/a&gt;を利用して数式等を表示しています。環境によってうまく表示されない場合はパソコンやスマホのwebブラウザで表示してみてください。&lt;/p&gt;


&lt;p&gt;いくつかマッチする正規表現がありますが、とりあえず$(b\cup ab^*a)^*$としておきます。&lt;a href="https://ja.wikipedia.org/wiki/%E6%B1%BA%E5%AE%9A%E6%80%A7%E6%9C%89%E9%99%90%E3%82%AA%E3%83%BC%E3%83%88%E3%83%9E%E3%83%88%E3%83%B3"&gt;DFA&lt;/a&gt;や&lt;a href="https://ja.wikipedia.org/wiki/%E9%9D%9E%E6%B1%BA%E5%AE%9A%E6%80%A7%E6%9C%89%E9%99%90%E3%82%AA%E3%83%BC%E3%83%88%E3%83%9E%E3%83%88%E3%83%B3"&gt;NFA&lt;/a&gt;もそうですが、正規表現を構築するには多少のひらめきが必要だったりします。&lt;/p&gt;
&lt;p&gt;2つの言語$A$と$B$が等価であることを示すには$A\subseteq B$かつ$B\subseteq A$であることを両方示さないといけません。ここでは正規表現を$R$、aが偶数個あるような文字列の集合を$L$とします。&lt;/p&gt;
&lt;h2&gt;ステップ1&lt;/h2&gt;
&lt;p&gt;まずは$R\subseteq L$です。そもそも$R\subseteq L$とはどういうことなのでしょうか？$R$と$L$はそれぞれ集合なのでベン図を書いてみます。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Venn diagram" src="https://rn4ru.com/blog/images/venn_L_R_2.png" /&gt;&lt;/p&gt;
&lt;p&gt;すると$R\subseteq L$を示すには&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$R$の中にあるものが$L$の中にもある($w\in R\Rightarrow w\in L$)か、その対偶&lt;/li&gt;
&lt;li&gt;$L$の中にないものが$R$の中にもない($w\not\in L\Rightarrow w\not\in R$)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;のどちらかを示すことができれば良さそうです。どちらを示すかはケースバイケースです。&lt;/p&gt;
&lt;p&gt;$w\in R\Rightarrow w\in L$ということはつまり具体的に言うと、「正規表現にマッチする文字列はaが偶数個ある」ということです。「正規表現にマッチする文字列」というのを表現しなければいけないので数学的帰納法で証明しましょう。&lt;/p&gt;
&lt;h3&gt;命題&lt;/h3&gt;
&lt;p&gt;$w\in (b\cup ab^*a)^*$より$w$が0以上の$(b\cup ab^*a)$からなることがわかるので、命題を「$n$個の$(b\cup ab^*a)$にマッチする文字列はaが偶数個ある」としてみます。&lt;/p&gt;
&lt;h3&gt;Base case&lt;/h3&gt;
&lt;p&gt;まずは$n=0$の時にこの命題が成り立つことを証明します。&lt;/p&gt;
&lt;p&gt;$$w^0\in (b\cup ab^*a)^0=\epsilon$$&lt;/p&gt;
&lt;p&gt;ということで空文字$\epsilon$は明らかにaが偶数個の文字列ですね。&lt;/p&gt;
&lt;h3&gt;Induction step&lt;/h3&gt;
&lt;p&gt;ここで、$n=k$の時にこの命題が成り立つと仮定します。つまり「$k$個の$(b\cup ab^*a)$にマッチするような文字列$w^k$はaが偶数個ある」です。この仮定するところが数学的帰納法の肝かつややこしいところなのですが、ここでは置いておきます。で、この時に$n=k+1$に対してこの命題が成り立つことを証明すればいいわけです。&lt;/p&gt;
&lt;p&gt;$w^{k+1}\in (b\cup ab^*a)^k(b\cup ab^*a)$ですが、ここでわかることは$w^k$の後で$b$か$ab^*a$のどちらかがマッチするということです。&lt;/p&gt;
&lt;p&gt;もし$b$がマッチした場合、その文字列のaの数は増えていないことになります。一方$ab^*a$がマッチすると、aの文字数は2個増えたということになります。どちらにしても仮定より$w^k$は偶数個のaを含んでいるのですから$w^{k+1}$に含まれるaの数も偶数個であると結論付けることができます。&lt;/p&gt;
&lt;h3&gt;結論&lt;/h3&gt;
&lt;p&gt;上記より全ての$n\ (n\geq0)$において$n$個の$(b\cup ab^*a)$にマッチする文字列はaが偶数個ある」という命題が成り立つということを証明できました。&lt;/p&gt;
&lt;p&gt;ここまで出来てようやく半分です。&lt;/p&gt;
&lt;h2&gt;ステップ2&lt;/h2&gt;
&lt;p&gt;では次に$L\subseteq R$を証明しましょう、としたいところですが、だいぶ長くなってしまったので次回の記事にしようと思います。是非皆さんも考えてみてください。「aが偶数個の文字列」というのをどう表すかが微妙に混乱したりします。&lt;/p&gt;
&lt;p&gt;ついでにこの授業で使ってる教科書(の日本語版)をはっておきます。この本は状態遷移図から始まってチューリングマシンとNP問題にたどり着くんですが、アルゴリズムの方から考えるNP問題とは結論が同じだとしても視点が全く異なるので新鮮かつ、こっちの方がしっくり来るという人もいるかと思います。自分は結構好きです。&lt;/p&gt;
&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320122070/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51rjfNYrhjL._SL160_.jpg" alt="計算理論の基礎 [原著第2版] 1.オートマトンと言語" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320122070/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;計算理論の基礎 [原著第2版] 1.オートマトンと言語&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 16.02.22&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;Michael Sipser &lt;br /&gt;共立出版 &lt;br /&gt;売り上げランキング: 41,157&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320122070/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320122089/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/61G043odaFL._SL160_.jpg" alt="計算理論の基礎 [原著第2版] 2.計算可能性の理論" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320122089/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;計算理論の基礎 [原著第2版] 2.計算可能性の理論&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 16.02.22&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;Michael Sipser &lt;br /&gt;共立出版 &lt;br /&gt;売り上げランキング: 311,707&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320122089/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320122097/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51TQUqYmP0L._SL160_.jpg" alt="計算理論の基礎 [原著第2版] 3.複雑さの理論" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320122097/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;計算理論の基礎 [原著第2版] 3.複雑さの理論&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 16.02.22&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;Michael Sipser &lt;br /&gt;共立出版 &lt;br /&gt;売り上げランキング: 303,041&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4320122097/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;洋書では第3版が出ています。&lt;/p&gt;
&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/113318779X/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51yQiIxzRsL._SL160_.jpg" alt="Introduction to the Theory of Computation" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/113318779X/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Introduction to the Theory of Computation&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 16.02.22&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;Michael Sipser &lt;br /&gt;Course Technology Ptr (Sd) &lt;br /&gt;売り上げランキング: 116,769&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/113318779X/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;</summary><category term="lecture-note"></category><category term="theory"></category></entry><entry><title>シカゴの歩き方 (音楽、レストラン編)</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/chicago-travel-map-music-restaurant/" rel="alternate"></link><published>2016-02-09T06:29:43-06:00</published><updated>2016-02-09T06:29:43-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2016-02-09:blog/posts/chicago-travel-map-music-restaurant/</id><summary type="html">&lt;p&gt;シカゴのおすすめ観光名所を紹介しています。今回は音楽、レストラン編です。&lt;/p&gt;


&lt;p&gt;&lt;a href="https://rn4ru.com/blog/posts/chicago-travel-map-attraction/"&gt;前々回&lt;/a&gt;、&lt;a href="https://rn4ru.com/blog/posts/chicago-travel-map-sports-shopping/"&gt;前回&lt;/a&gt;の続きです。&lt;/p&gt;
&lt;h2&gt;音楽&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://www.bluechicago.com/"&gt;Blue Chicago&lt;/a&gt;は毎日ブルースのライブが開かれてるバーで、いつ行っても満席というかなり人気の高いスポットになっています。オープンは午後8時でライブは9時開始。ワンセッション1時間ちょっとで、だいたい4つのセッションが深夜過ぎまでおこなわれるみたいです。入場料は日から木曜まで一人10ドル。金土は12ドルとのことです。&lt;/p&gt;
&lt;p&gt;自分たちが着いたのは8時を少し回ったぐらいだったのですが、すでにテーブル席は埋まっていて、ギリギリ立ち見にならなくてすむという感じでした。そのおかげかめちゃくちゃステージから近いところで演奏を見ることができました。いやー、めっちゃうまかった。シカゴのブルースが聴きたい人は是非オススメです。見た目は少し入りにくいですが、中に入ってみると学生や旅行者もちらほらいたりとわりかし良い雰囲気です。&lt;/p&gt;
&lt;p&gt;地下鉄の幾つかの駅ではストリートミュージシャンが演奏してたりします。ほとんどが弾き語りですが、&lt;a href="http://www.transitchicago.com/travel_information/station.aspx?StopId=76"&gt;レッドラインのジャクソン駅&lt;/a&gt;ではバンド形式でやってます。ジャンルもジャズからブルースからハードロックまであるので駅を利用する毎に日替わりで楽しめます。多分許可もらってやってるのだと思うですが、一人でいきなりギターやらサックスやら演奏し始める人もいるので。もぐりの人もいるのでしょう。&lt;/p&gt;
&lt;p&gt;結構みんなチップを放り投げていきます。友人の一人も弾き語りのNo Woman, No Cryが良かったとかで1ドル渡してました。&lt;/p&gt;
&lt;iframe width="420" height="315" src="https://www.youtube.com/embed/mcTKcMzembk" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;h2&gt;レストラン&lt;/h2&gt;
&lt;p&gt;シカゴのピザといえばディープディッシュ。今回は&lt;a href="https://giordanos.com/"&gt;Giordano's&lt;/a&gt;で食べました。正直言うとそこまで頻繁に食べるようなものじゃないんですが、シカゴに来たからには是非とも体験して行っていただきたい。その他にも&lt;a href="http://www.loumalnatis.com/chicago-south-loop"&gt;Lou Malnati's&lt;/a&gt;や&lt;a href="http://761.unotogo.com/zgrid/themes/7/portal/index.jsp"&gt;Uno &amp;amp; Due&lt;/a&gt;が人気です。注文してから出てくるのに30−40分ほどかかるので、スケジュールにはご注意を。&lt;/p&gt;
&lt;p&gt;ファストフードで是非トライして欲しいのがホットドッグとイタリアンビーフ。&lt;a href="http://www.portillos.com/"&gt;Portillo's&lt;/a&gt;では両方注文できます。ボリュームがあるので胃袋も満足できると思います。内装も古き良きアメリカなイメージでいい感じです。シカゴのホットドッグはケチャップNGです。別に禁止まではされてないですけどね。イタリアンビーフは肉汁たっぷりのソースにパンが浸かるDippedというのもあるんですが、ここのはやや控えめでした。それでもびちゃびちゃになってましたが。&lt;/p&gt;
&lt;p&gt;シカゴにはチャイナタウンがあって、ダウンタウンからも電車一本とアクセスが良いのでオススメです。正式名称はちょっとわかりませんが新旧チャイナタウンとありまして、今回は旧の方にいきました。街並みからして完全に中華街です。&lt;/p&gt;
&lt;p&gt;&lt;a data-flickr-embed="true"  href="https://www.flickr.com/photos/rn4ru/4686875902/in/datetaken-public/" title="IMG_0412"&gt;&lt;img src="https://farm5.staticflickr.com/4015/4686875902_28b185377c_z.jpg" width="640" height="480" alt="IMG_0412"&gt;&lt;/a&gt;&lt;script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;この写真を撮ったのは2010年ですけど。&lt;/p&gt;
&lt;p&gt;で、入ったのが&lt;a href="http://www.triplecrownchicago.com/"&gt;Triple Crown&lt;/a&gt;こと大三元。なんか縁起が良さそうな名前です。大皿料理をがっつり頼むこともできますがこの日は飲茶スタイルで。Dim Sum(点心)とも呼ばれてますが、餃子や焼売、春巻きなどの小皿を多く頼んでつつく感じです。観光客も多く入ってるみたいですが、ここはアメリカ寄りの中華でした。より中華っぽい中華がいいという人は&lt;a href="http://www.cairestaurant.com/"&gt;CAI&lt;/a&gt;の方があってるかもしれません。&lt;/p&gt;
&lt;p&gt;と、駆け足で紹介してきましたが、皆さんも機会があったら是非シカゴに遊びに来てください。冬のシカゴも楽しいですが、夏はその２倍は楽しめるのでよろしくお願いします。&lt;/p&gt;
&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4478045496/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51dPFXOfq2L._SL160_.jpg" alt="B11 地球の歩き方 シカゴ 2014~2015" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4478045496/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;B11 地球の歩き方 シカゴ 2014~2015&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 16.01.27&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;地球の歩き方編集室 &lt;br /&gt;ダイヤモンド社 &lt;br /&gt;売り上げランキング: 94,515&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4478045496/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;</summary><category term="Chicago"></category><category term="Travel"></category></entry><entry><title>シカゴの歩き方 (スポーツ、ショッピング編)</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/chicago-travel-map-sports-shopping/" rel="alternate"></link><published>2016-02-08T06:29:43-06:00</published><updated>2016-02-08T06:29:43-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2016-02-08:blog/posts/chicago-travel-map-sports-shopping/</id><summary type="html">&lt;p&gt;シカゴの観光名所を歩く。今回はスポーツとショッピング編です。&lt;/p&gt;


&lt;p&gt;&lt;a href="https://rn4ru.com/blog/posts/chicago-travel-map-attraction/"&gt;前回&lt;/a&gt;の続きです。&lt;/p&gt;
&lt;h2&gt;スポーツ&lt;/h2&gt;
&lt;p&gt;シカゴといえば&lt;a href="http://www.nba.com/bulls/"&gt;ブルズ&lt;/a&gt;。ブルズといえばシカゴ。ということで&lt;a href="http://www.unitedcenter.com/"&gt;ユナイテッドセンター&lt;/a&gt;です。ダウンタウンの中心地からシャトルバスで15分くらいだったかな。ちょっと外れたところにどかんとあるかんじですね。実はシカゴに5年いながら初観戦です。&lt;/p&gt;
&lt;p&gt;&lt;a data-flickr-embed="true"  href="https://www.flickr.com/photos/rn4ru/24163116330/in/datetaken-public/" title="Jordan Statue"&gt;&lt;img src="https://farm2.staticflickr.com/1586/24163116330_a71a8e8ed5_z.jpg" width="640" height="480" alt="Untitled"&gt;&lt;/a&gt;&lt;script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;ユナイテッドセンターに着いたら中に入る前にまず見ておかなければならないものがあります。マイケルジョーダンの像！いやー神々しいですね。6番ゲートの近くです。中に入ると２度のスリーピートのトロフィーなんかもあります。&lt;/p&gt;
&lt;p&gt;試合はニューヨークニックスとだったんですが、無事勝利！さらに100点ゲームで無料ビッグマック引換券もゲットすることができました。安いチケットだったのでかなり高いところから見下ろすような席でしたが、関係なかったですね。周りも熱狂してました。&lt;/p&gt;
&lt;p&gt;ユナイテッドセンターはシカゴブラックホークス(アイスホッケー)の試合会場にもなってます。次はぜひアイスリンクを見に行きたいですね。シーズン中ならカブスやホワイトソックスの試合もそれぞれのスタジアムで観戦できたのですが。&lt;/p&gt;
&lt;h2&gt;ショッピング&lt;/h2&gt;
&lt;p&gt;ダウンタウンの東側を南北に通り抜けるのがミシガン通りです。おそらくシカゴで最も観光客が多くショッピングに訪れるところでしょう。北のほうに行くと通りの両サイドには高級ブランド店をはじめとした多くの店舗が所狭しと並んでいて、&lt;a href="http://www.apple.com/retail/northmichiganavenue/"&gt;アップルストア&lt;/a&gt;や昨年秋にオープンしたばかりの&lt;a href="http://www.uniqlo.com/us/stores/store-locations/michigan-avenue.html"&gt;ユニクロ&lt;/a&gt;もあります。時間がなかったのもあって実際入ったのは&lt;a href="http://www.nike.com/us/en_us/c/cities/chicago"&gt;ナイキタウン&lt;/a&gt;と友人がお土産を頼まれていた&lt;a href="https://www.victoriassecret.com/store-locator#/store/600"&gt;Victoria's Secret&lt;/a&gt;くらいですかね。&lt;/p&gt;
&lt;p&gt;お土産といえば、今回初めて知ったんですが&lt;a href="http://www.traderjoes.com/"&gt;Trader Joe's&lt;/a&gt;というスーパーのエコバッグが安くて種類が豊富ということで地球の歩き方で紹介されてるんですね。友人がまとめ買いしていましたが、次回帰国する際には自分もこのエコバッグをお土産として買っていこうと思います。&lt;/p&gt;
&lt;p&gt;よく聞かれるのが「シカゴのお土産っていったら何なの？」なんですが、正直よくわかりません。これといって名産品もないですし。多分シカゴでピンとくるようなお土産は各種スポーツグッズか、建築関連。食べ物でいったら無難なチョコレートくらいかなー。&lt;/p&gt;
&lt;p&gt;明日がこのシリーズ最終回です。&lt;/p&gt;
&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4478045496/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51dPFXOfq2L._SL160_.jpg" alt="B11 地球の歩き方 シカゴ 2014~2015" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4478045496/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;B11 地球の歩き方 シカゴ 2014~2015&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 16.01.27&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;地球の歩き方編集室 &lt;br /&gt;ダイヤモンド社 &lt;br /&gt;売り上げランキング: 94,515&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4478045496/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;</summary><category term="Chicago"></category><category term="Travel"></category></entry><entry><title>シカゴの歩き方 (アトラクション編)</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/chicago-travel-map-attraction/" rel="alternate"></link><published>2016-02-07T06:29:43-06:00</published><updated>2016-02-07T06:29:43-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2016-02-07:blog/posts/chicago-travel-map-attraction/</id><summary type="html">&lt;p&gt;年末から年始にかけて友人がこっちに遊びに来たので、その時に回ったところをまとめてみようかなと思います。ニューヨークで年越しして、シカゴに戻ってきたんですが、今回はシカゴ版ということで。ニューヨークのことは別の記事で書きます。多分。&lt;/p&gt;


&lt;p&gt;カテゴリ別でいきます。実質二日という短い期間でしたが、意外と満遍なく回れて、かつ今回行けなかったところは次があれば楽しみにできるというようなことになってると思います。次はぜひ夏に来て欲しい。シカゴの夏は最高なので。&lt;/p&gt;
&lt;h2&gt;アトラクション&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://www.360chicago.com/"&gt;ジョンハンコックセンター&lt;/a&gt;はいわゆる展望台です。たぶん有名なのは&lt;a href="http://theskydeck.com/"&gt;ウィリスタワー&lt;/a&gt;(旧シアーズ、未だにしっくりこない)の方なんでしょうが、自分はジョンハンコックの方が好きですね、なんとなく。高いビルとしてはあの有名な(?)トランプさんの&lt;a href="https://www.trumphotelcollection.com/chicago/"&gt;トランプタワー&lt;/a&gt;なんかもあります。&lt;/p&gt;
&lt;p&gt;展望台に上がるには大人19ドルかかりますが、裏技があって、展望台のさらに上にある&lt;a href="https://www.signatureroom.com/lounge/"&gt;ラウンジ&lt;/a&gt;には無料でのぼれるんです。もちろんそこでは飲み物や軽食を注文しないと駄目ですが、案外安く済むし、景色も堪能できるということでそちらの方が行列ができるほど人気です。そのためか従来の展望台でいいよって人はそれほど並ばなくて済みます。ウィリスタワーだと２時間待ちとかあるので。&lt;/p&gt;
&lt;p&gt;&lt;img alt="From John Hancock" src="https://rn4ru.com/blog/images/johnhancock2.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;ここは是非夜に来て欲しいです。シカゴの夜景が一望できます。おすすめは南側(上の写真もそう)ですが肉眼で見るとさらに感動します。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.artic.edu/"&gt;シカゴ美術館&lt;/a&gt;はダウンタウンの中心にあってアクセスしやすい美術館です。入り口の両脇にあるライオンの像が目印です。自分たちが行った時は閉館1時間前だったので大人12ドルで入館できました。展示品が多かったため1時間ではとても見切れませんでしたが、なんとなく雰囲気はつかんでもらえたと思います。&lt;/p&gt;
&lt;p&gt;ゴッホの自画像を始めこれ知ってる、見た事あるかもという作品もありますし、日本のコーナーが意外に見応えあります。年中いろんな企画が催されているので、毎回違った展示品を楽しめるんじゃないでしょうか。と言っても、シカゴに遊びに来た人を連れてったことぐらいでしか自分は訪れる事はないんですが。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.fieldmuseum.org/"&gt;フィールド自然史博物館&lt;/a&gt;はダウンタウンの外れにある博物館です。近くにはアメフトのスタジアムもあって、自分たちが行った時はちょうど観客たちの波にのまれたりもしました。しかもベアーズ負けてた…。&lt;/p&gt;
&lt;p&gt;それはともかく、普通の展示品(恐竜の化石や動物の標本がメイン)が見れるチケットと+αで特別展示品や、3Dムービーが見れるチケットがあります。イリノイ州に住んでる人は無料で入れる日もあります。というか&lt;a href="https://www.fieldmuseum.org/at-the-field/calendar/free-day-1"&gt;2月は毎日無料&lt;/a&gt;なのでイリノイ在住の人はぜひ行きましょう。見応えあります。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.cityofchicago.org/city/en/depts/dca/supp_info/millennium_park.html"&gt;ミレニアムパーク&lt;/a&gt;はシカゴ美術館のすぐ近くにあるでっかい公園です。The Beanことクラウドゲートと呼ばれる金属製のオブジェが特徴的です。冬になるとスケートリンクが設営されます。ここが今回回った中では唯一のアウトドアスポットでした。冬のシカゴは野外でのアクティビティが微妙なので、観光の際はぜひ夏に来て欲しいです。&lt;/p&gt;
&lt;p&gt;次点では&lt;a href="http://www.cbotbuilding.com/"&gt;シカゴ商品取引所&lt;/a&gt;とか、&lt;a href="http://www.lpzoo.org/"&gt;リンカーンパーク動物園&lt;/a&gt;とか、海でなく湖なのになぜか&lt;a href="http://www.cpdbeaches.com/home.cfm"&gt;ビーチ&lt;/a&gt;だったりとかいろいろあるんですが、寒かったのでね。ぜひ夏に（しつこい）。&lt;/p&gt;
&lt;p&gt;続きは明日です。&lt;/p&gt;
&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4478045496/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51dPFXOfq2L._SL160_.jpg" alt="B11 地球の歩き方 シカゴ 2014~2015" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4478045496/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;B11 地球の歩き方 シカゴ 2014~2015&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 16.01.27&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;地球の歩き方編集室 &lt;br /&gt;ダイヤモンド社 &lt;br /&gt;売り上げランキング: 94,515&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4478045496/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;</summary><category term="Chicago"></category><category term="Travel"></category></entry><entry><title>Safari 9におけるピンで固定されたタブがある時のCmd-Wの挙動</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/safari-command-w-behavior-with-pinned-tabs/" rel="alternate"></link><published>2015-12-20T07:19:18-06:00</published><updated>2015-12-20T07:19:18-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2015-12-20:blog/posts/safari-command-w-behavior-with-pinned-tabs/</id><summary type="html">&lt;p&gt;Safari 9ではタブをピンで固定することができるようになりました。これはこれで便利なんですが、これがある時にタブを閉じるキーボードショートカットを使った時の挙動が微妙なのでどうにかできないかと思って調べてみました。&lt;/p&gt;


&lt;h2&gt;タブを閉じるキーボードショートカット&lt;/h2&gt;
&lt;p&gt;Safariでは⌘Wでアクティブなタブを閉じることができます。一つのタブを閉じた時に、他にタブが残っていなければウィンドウが閉じられます。これ自体は問題ない動作だと思います。&lt;/p&gt;
&lt;h2&gt;ピンで固定したタブがあると…&lt;/h2&gt;
&lt;p&gt;問題なのは、ピンで固定したタブ(以下、固定タブ)がある場合です。どうやら固定タブが認識されていないらしく、固定されていないタブを⌘Wで閉じた時に残りのタブが固定タブのみの場合、そのままウィンドウが閉じられてしまいます。&lt;/p&gt;
&lt;p&gt;一方で固定されていないタブを手動、つまりタブ左側のxボタンを押して閉じてみます。すると、固定タブが残っている場合はウインドウが閉じられず、設定に応じた新規タブが表示されます。&lt;/p&gt;
&lt;p&gt;この違いが意図された動作かどうかはわかりませんが、自分としては⌘Wで閉じた時に手動で閉じた時と同じ動作になって欲しいのです。&lt;/p&gt;
&lt;h2&gt;システム設定からキーボードショートカットを上書きする&lt;/h2&gt;
&lt;p&gt;絶対誰かが解決してくれてるはずと調べてみると、案の定以下が見つかりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://apple.stackexchange.com/questions/209295/stop-safari-9-window-closing-when-only-pinned-tabs-are-left"&gt;osx - Stop Safari 9 window closing when only pinned tabs are left - Ask Different&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;どうやら、システムのキーボードショートカット設定でSafariの"Close Tab" (注: 英語版。日本語版の場合は"タブを閉じる"のはず)というメニューを呼びだすショートカットを⌘Wに設定すればいいみたいです。&lt;/p&gt;
&lt;p&gt;この通りにやってみると、うまく意図した動作にすることができました。このことから考察してみると、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;オリジナルの⌘Wは厳密にはタブを閉じるショートカットではない&lt;/li&gt;
&lt;li&gt;Safariのメニューにある"Close Tab"は手動でタブを閉じるのと同じ動作をする&lt;/li&gt;
&lt;li&gt;つまり⌘Wで"Close Tab"をするにはショートカットを上書きする必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Happy Safari life!&lt;/p&gt;</summary><category term="mac"></category><category term="safari"></category></entry><entry><title>Python 2.7.6でSSLが動かなくなっていたので、pyenvとvirtualenvで新しい環境を作った</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/python-2.7.6-SSL-doesnt-work/" rel="alternate"></link><published>2015-06-08T09:53:37-05:00</published><updated>2015-06-08T09:53:37-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2015-06-08:blog/posts/python-2.7.6-SSL-doesnt-work/</id><summary type="html">&lt;p&gt;久々にブログ書いたらいろいろ動かなくなってた。&lt;/p&gt;


&lt;p&gt;さっきすげー久しぶりにブログ書いたんですが、まあそんなことはどうでもよくて。このブログは&lt;a href="http://blog.getpelican.com/"&gt;Pelican&lt;/a&gt;で生成して&lt;a href="http://aws.amazon.com/cli/"&gt;awscli&lt;/a&gt;でamazon s3に投げてます。で、今回もおぼろげながらその通りにやろうとしたらawscliがSSLのエラーでこけました。&lt;/p&gt;
&lt;p&gt;というかPython 2.7.6だと&lt;code&gt;import ssl&lt;/code&gt;ですらコケる始末。調べてみると、以下の症状にしっかり当てはまったのでさてどうしたものかと。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Homebrew/homebrew/issues/31851"&gt;Python from Brew breaks &lt;code&gt;ssl&lt;/code&gt; after upgrade with &lt;code&gt;Symbol not found: _SSLv2_method&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;結局システム標準のpython 2.7.10では大丈夫だったので、新しくpelicanの環境を&lt;a href="https://github.com/yyuu/pyenv-virtualenv"&gt;pyenv と virtualenv&lt;/a&gt;で作りました。&lt;/p&gt;
&lt;p&gt;まずはvirualenv環境をシステム標準のpythonで作ります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pyenv virtualenv pelican35
pyenv activate pelican35
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;次に&lt;a href="http://docs.getpelican.com/en/3.5.0/install.html"&gt;これ&lt;/a&gt;に沿っていろいろインストールしていきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pip install pelican Markdown awscli
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;設定とかは既存のを使うので&lt;code&gt;pelican-quickstart&lt;/code&gt;は使いません。そのまま&lt;code&gt;make&lt;/code&gt;を走らせてみると&lt;code&gt;PLUGIN_PATH&lt;/code&gt;が&lt;code&gt;PLUGIN_PATHS&lt;/code&gt;に変更になったよと叱られたので設定ファイルをその通りに書きなおして終了です。無事再びブログを更新することができました。&lt;/p&gt;
&lt;p&gt;よかったよかった。&lt;/p&gt;</summary><category term="python"></category><category term="pelican"></category><category term="aws"></category></entry><entry><title>8月は航空券が安い？</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/airticket/" rel="alternate"></link><published>2015-06-08T07:44:43-05:00</published><updated>2015-06-08T07:44:43-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2015-06-08:blog/posts/airticket/</id><summary type="html">&lt;p&gt;8月に一時帰国します。&lt;/p&gt;


&lt;p&gt;で、そのことを知人としていたら、その人に「8月は夏も終わりだからチケット安かったでしょ？」と聞かれました。その場ではそうかもねと流したんですが、感覚的には違うような気がします。&lt;/p&gt;
&lt;p&gt;アメリカ人的には夏といえば5月から始まるものなので、8月を夏の終わりと言ったんでしょうが、そもそも日本では十分夏本番ですし。夏休みもお盆もあるしむしろ旅行シーズンなんじゃね？みたいな。実際のところどうなんだろ。まあ、あんまり調べる気もしない。&lt;/p&gt;
&lt;p&gt;それでも同じ航空会社の日本発とアメリカ発の往復チケットの値段を帰国日近辺で比べてみたらドル換算で前者のほうが安いんですよね ($1200 vs $1800)。価格はいろいろ変動するので一概には言えませんが、なんか日本発だと安くなる理由みたいなのがあるのかな？&lt;/p&gt;
&lt;p&gt;というわけでそのうち日本に帰ります。楽しみです。&lt;/p&gt;</summary><category term="diary"></category></entry><entry><title>機械学習： linear regression (1)</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/machine-learning-linear-regression-1/" rel="alternate"></link><published>2014-08-28T19:14:34-05:00</published><updated>2014-08-28T19:14:34-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2014-08-28:blog/posts/machine-learning-linear-regression-1/</id><summary type="html">&lt;p&gt;機械学習と聞いて思い浮かぶことはニューラルネットワークだとかフィードバックループだとか、面白そうだけどなんだか難しいんじゃないの？という感じでした。しかし講義を聞いてみると基礎の部分は以外とシンプルなことがわかりました。&lt;/p&gt;


&lt;p&gt;ツッコミ大歓迎です。&lt;/p&gt;
&lt;p&gt;機械学習の目的をものすごく簡単にいうと、「学習データを用いて未知のデータを分類できるようにする」ということです。例えば、過去の天気データをもとに明日の天気を予測するとか、あるいは過去の顧客データをもとに商品Aを買った人は商品Bも買う可能性が高いから推薦しようとかです。&lt;/p&gt;
&lt;p&gt;根本的なところは未知のデータxから分類データyを導くような関数f(x)を探せればいいことになります。一番簡単な例からから始めてみます。誰もが一度はIQテストで次のような問題を見たことがあるはずです。&lt;/p&gt;
&lt;p&gt;&lt;img alt="IQテスト" src="https://rn4ru.com/blog/images/iq.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;この場合f(x)はx(x-1)とできます(一例です)。このような問題では大抵見当がつくようになっていますが、まったく見当がつかなかったらどうすればいいでしょうか？例えば次のテーブルをみてください。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;走行距離 (km)&lt;/th&gt;
&lt;th&gt;売値 ($)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;100,000&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;80,000&lt;/td&gt;
&lt;td&gt;11,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;150,000&lt;/td&gt;
&lt;td&gt;6,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;75,000&lt;/td&gt;
&lt;td&gt;10,500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;n&lt;/td&gt;
&lt;td&gt;110,000&lt;/td&gt;
&lt;td&gt;8,500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;これはあなたが売りたい車の走行距離と売値に関する過去データの一部です。あなたの目的は現在の走行距離から適切な売値を計算することです。少なくとも計算された値より高値で買い取ってもらいたいものです。&lt;/p&gt;
&lt;p&gt;走行距離をx軸、売値をy軸にとったグラフを書いてみると、走行距離が長ければ長いほど、売値が低くなっているのでなんとなく負の相関がありそうです。計算を簡単にするためにf(x)は1次関数、いわゆるy=ax+bで表せられるような式であると仮定してみます。どうすれば適切なaとbを見つけることができるでしょうか。&lt;/p&gt;
&lt;p&gt;一つの方法としてはaとbをしらみつぶしに試すことができます。例えばaを-0.01、bを15000などとして、それぞれのデータを当てはめてみて売値が一致するかを見ます。一致するかどうかを測るのに予想値から実際の売値を引いて2乗したもののトータルを使うことにします。一致したならトータルが0になりますし、その値が小さければ小さいほど良い値だということになります。ということで&lt;img alt="J(a,b)" src="http://mathurl.com/l4uljwb.png" /&gt;が最小になるようなaとbを探します。後々のために1/2を掛けておきます。&lt;/p&gt;
&lt;p&gt;ただし、しらみつぶしにaとbを探すのは効率が悪すぎます。そこでJ(a,b)が2次関数であることを利用してその微分が0になるところ、つまりグラフの底を見つけることにします。aとbそれぞれについて微分します。&lt;/p&gt;
&lt;p&gt;&lt;img alt="微分" src="http://mathurl.com/lua7wu8.png" /&gt;&lt;/p&gt;
&lt;p&gt;変換すると&lt;/p&gt;
&lt;p&gt;&lt;img alt="微分その2" src="http://mathurl.com/k3dgkt5.png" /&gt;&lt;/p&gt;
&lt;p&gt;となります。データの個数n及び&lt;img alt="変数" src="http://mathurl.com/q582upa.png" /&gt;は過去データから計算できるので未知なのはaとbだけ、2つの式があるので連立方程式として解くことができます。これで過去データからf(x)=ax+bの近似式に必要なaとbを導くことができました。これも立派な機械学習です。思っていたよりもややこしくないような気がしませんか？&lt;/p&gt;
&lt;p&gt;もちろん現実には走行距離だけで売値が決まるとは限りませんし、実際の式が1次関数であるとも限りません。それでも一歩ずつ進んでいくために、次の記事では評価軸がたくさんある場合の1次関数の近似式を計算してみることにします。&lt;/p&gt;</summary><category term="machine-learning"></category><category term="lecture-note"></category></entry><entry><title>2014年秋セメスターはじまる</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/2014Fall-semester/" rel="alternate"></link><published>2014-08-27T08:11:27-05:00</published><updated>2014-08-27T08:11:27-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2014-08-27:blog/posts/2014Fall-semester/</id><summary type="html">&lt;p&gt;今週から秋セメスターが始まりました。&lt;/p&gt;


&lt;p&gt;さて、何事もなかったかのようにしれっと書いてますが、結局夏休みの間はほとんどブログをあげなかったですね(&lt;a href="https://twitter.com/rn4ru"&gt;ツイッター&lt;/a&gt;では結構つぶやいてましたが)。一応言い訳をさせてもらうと、夏休み自体は結構充実した気ではいるのですが、研究以外でーというとそれほどネタがあったわけでもなく、かといって研究してることをどんどん書いていく、というのもそれはそれでどうなのかなー？と思う次第でありまして…、って読んでくださっている方からすればどうでもいいですね。&lt;/p&gt;
&lt;p&gt;今後は授業で習ったことなど、面白かったことはどんどんブログに上げて行きたいですし、それ以外でも記事を書くハードルをちょっと下げようかな、とも思っています。短い日記みたいなのも増えるかもしれませんが、生存確認用かつ海外大学院生活のサンプルということで、ひとつどうぞよろしくお願いします。&lt;/p&gt;
&lt;p&gt;さてその授業ですが、この秋はネットワーク基礎と機械学習のクラスを取ることにしました。両方とも自分の研究にそれほど密接に関わってるわけではないのですが、ネットワークに関しては基礎くらいやっておかないとなと、機械学習については最近色んな所で目にするし興味もあるし、ということで教授と相談して取ることにしました。あとはカリキュラムの関係と、それ以外に面白そうなクラスがなかったというのもありますが。&lt;/p&gt;
&lt;p&gt;ネットワークで使う教科書は&lt;a href="http://highered.mheducation.com/sites/0073376043/index.html"&gt;TCP/IP Protocol Suite&lt;/a&gt;の第4版です。授業用にあらかじめ用意されているスライドの出来がいいから、ということなのですが実際に購入するかはちょっと考え中です。安い買い物でもないですし(教科書の値段ちょっと高すぎんよ)、どうしても必要になったら中古を友人から安く譲ってもらおうかと。この教授のクラスは以前受講したことがあるので、授業スタイルに関しては心配してません。&lt;/p&gt;
&lt;p&gt;もう一つ機械学習の教科書は、&lt;a href="http://statweb.stanford.edu/~tibs/ElemStatLearn/"&gt;Elements of Statistical Learning: data mining, inference, and prediction&lt;/a&gt;です。これはオフィシャルのサイト(上のリンク)からPDFをダウンロードできるので良心的ですね。つまり教科書を持たない理由はないわけで、クラスでもそれぞれのトピックを事前に読み込んでおくのを期待されてる感じがしました。この教授のクラスは初めてだったのですが、初回の授業の感じでは自分のペースでどんどん進んでいくタイプだったので、置いていかれないようにしないと。&lt;a href="http://www.cmpe.boun.edu.tr/~ethem/i2ml2e/index.html"&gt;Machine Learning Textbook: Introduction to Machine Learning&lt;/a&gt;と&lt;a href="http://research.microsoft.com/en-us/um/people/cmbishop/prml/"&gt;Pattern Recognition and Machine Learning&lt;/a&gt;も参考図書にあげられています。&lt;/p&gt;
&lt;p&gt;というわけで生存報告兼リハビリポストでした。&lt;/p&gt;
&lt;iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=FFFFFF&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=rn4ru-22&amp;o=9&amp;p=8&amp;l=as1&amp;m=amazon&amp;f=ifr&amp;ref=tf_til&amp;asins=0073376043" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;

&lt;iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=FFFFFF&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=rn4ru-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=0387310738" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;

&lt;iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=FFFFFF&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=rn4ru-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=4621061224" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;

&lt;iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=FFFFFF&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=rn4ru-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=4621061240" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;</summary><category term="diary"></category></entry><entry><title>vagrant-berkshelfでjenkinsをインストールする</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/vagrant-berkshelf-jenkins/" rel="alternate"></link><published>2014-06-10T23:12:11-05:00</published><updated>2014-06-10T23:12:11-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2014-06-10:blog/posts/vagrant-berkshelf-jenkins/</id><summary type="html">&lt;p&gt;CIサーバが急に欲しくなったのでVagrant+Chef+BerkshelfでJenkinsをインストールした仮想環境を作ってみました。多分最短距離。&lt;/p&gt;


&lt;p&gt;&lt;img alt="chef" src="https://rn4ru.com/blog/images/chef.jpg" /&gt;&lt;br /&gt;
&lt;a href="https://www.flickr.com/photos/rogodoun/898770048/"&gt;Chef's hands at work&lt;/a&gt; by &lt;a href="https://www.flickr.com/photos/rogodoun/"&gt;Rob van Hilten&lt;/a&gt; is licensed under &lt;a href="https://creativecommons.org/licenses/by-nc-sa/2.0/"&gt;CC BY-NC-SA 2.0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;とにかくJenkinsが動いてる仮想サーバがほしいという人向け。そもそもVagrantって何だろとか気になる人はいろいろググってみてください。ただ日進月歩の世界なので情報が陳腐化する速度がとんでもないです。&lt;/p&gt;
&lt;p&gt;Vagrant のインストールに &lt;code&gt;gem&lt;/code&gt; を使ってるもの(今はインストーラーがあります)、 Vagrantfile のconfig.vm.network が :hostonly になってるもの、(同 :private_network) Berksfile に site :opscode と書かれているもの(同 source "https://api.berkshelf.com")は古い情報となってるので、できれば最新の原典を当たるのがベストです。&lt;/p&gt;
&lt;h2&gt;構成&lt;/h2&gt;
&lt;dl&gt;
&lt;dt&gt;VirtualBox&lt;/dt&gt;
&lt;dd&gt;4.2.24&lt;br /&gt;
&lt;a href="https://www.virtualbox.org/wiki/Downloads"&gt;Downloads – Oracle VM VirtualBox&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;Vagrant&lt;/dt&gt;
&lt;dd&gt;1.6.3&lt;br /&gt;
&lt;a href="https://www.vagrantup.com/downloads.html"&gt;Download Vagrant - Vagrant&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;berks&lt;/dt&gt;
&lt;dd&gt;3.1.3&lt;br /&gt;
&lt;a href="http://berkshelf.com/"&gt;Berkshelf&lt;/a&gt;&lt;/dd&gt;
&lt;dt&gt;vagrant-berkshelf&lt;/dt&gt;
&lt;dd&gt;2.0.1&lt;br /&gt;
&lt;code&gt;vagrant plugin install vagrant-berkshelf --plugin-version "&amp;gt;= 2.0.1"&lt;/code&gt;&lt;/dd&gt;
&lt;dt&gt;vagrant-omnibus&lt;/dt&gt;
&lt;dd&gt;1.4.1&lt;br /&gt;
&lt;code&gt;vagrant plugin install vagrant-omnibus&lt;/code&gt;&lt;/dd&gt;
&lt;dt&gt;vagrant-vbguest&lt;/dt&gt;
&lt;dd&gt;0.10.0&lt;br /&gt;
&lt;code&gt;vagrant plugin install vagrant-vbguest&lt;/code&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;h2&gt;雛形の用意&lt;/h2&gt;
&lt;p&gt;適当なディレクトリで&lt;/p&gt;
&lt;p&gt;&lt;code&gt;berks cookbook myciserver&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;./myciserverに雛形ができます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cd myciserver&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Vagrantfileの編集&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;vim Vagrantfile&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;config.vm.network :private_network, ip: &amp;quot;192.168.33.10&amp;quot;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;仮想環境のipを192.168.33.10に設定します。もし他のboxを利用したいなら、config.vm.box (必要ならconfig.vm.box_urlも)を書き換えます。今回はデフォルトのままで。&lt;/p&gt;
&lt;h2&gt;metadata.rb&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;vim metadata.rb&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;depends &amp;quot;jenkins&amp;quot;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Jenkinsを依存関係に追加します。&lt;/p&gt;
&lt;h2&gt;recipes/default.rb&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;vim recipes/default.rb&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;include_recipe&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;apt&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;jenkins&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;master&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;install_method&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;package&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;include_recipe&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;jenkins::java&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;include_recipe&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;jenkins::master&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;apt-getのアップデートをした後に、jenkinsのパッケージをインストールしますが、その前にjavaを入れる必要があります。&lt;/p&gt;
&lt;p&gt;その他必要な設定があれば以下を参考に。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/opscode-cookbooks/apt"&gt;opscode-cookbooks/apt&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://github.com/opscode-cookbooks/jenkins"&gt;opscode-cookbooks/jenkins&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;起動&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;vagrant up&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;boxのダウンロード、VirtualBox Guest Additionのインストール, パッケージの更新、jenkinsのインストールが自動的に行われます。(初回のみ。結構時間かかります)&lt;/p&gt;
&lt;h2&gt;Jenkins&lt;/h2&gt;
&lt;p&gt;ブラウザから192.168.33.10:8080にアクセスするとJenkinsのホーム画面が表示されるはずです。お疲れ様でした。&lt;/p&gt;
&lt;p&gt;80番ポートからリダイレクトするならapache2とproxy及びproxy_httpモジュールをinclude_recipeして、sites-avarilableの設定が必要です。metadata.rbにdependsも忘れずに。&lt;/p&gt;
&lt;p&gt;詳しくは以下を参照.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Ubuntu"&gt;Installing Jenkins on Ubuntu - Jenkins - Jenkins Wiki&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://github.com/onehealth-cookbooks/apache2"&gt;onehealth-cookbooks/apache2&lt;/a&gt;
&lt;a href="http://misheska.com/blog/2013/06/16/getting-started-writing-chef-cookbooks-the-berkshelf-way/#iteration-4---add-content"&gt;Getting Started Writing Chef Cookbooks the Berkshelf Way, Part 1 - Mischa Taylor's Coding Blog&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;裏で妖精さんが働き過ぎていて怖いくらいですが、最初に&lt;code&gt;berks cookbook app_name&lt;/code&gt;しておけば、metadata.rbにdepends、recipes/default.rbにinclude_recipeを書くだけで、berkshelfが勝手にリポジトリからcookbookを取ってきてchef経由で料理してくれるということがわかりました。vagrant-berkshelf恐るべし。&lt;/p&gt;
&lt;p&gt;さて、せっかくセットアップしたJenkinsを何に使おうかなー。&lt;/p&gt;</summary><category term="tool"></category><category term="vagrant"></category><category term="berkshelf"></category><category term="chef"></category><category term="jenkins"></category></entry><entry><title>Chromecastへ給電するのにテレビのUSB端子を使ってはいけない、たった1つの理由</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/do-not-use-tvs-usb-port-for-chromecast/" rel="alternate"></link><published>2014-05-30T07:20:00-05:00</published><updated>2014-05-30T07:20:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2014-05-30:blog/posts/do-not-use-tvs-usb-port-for-chromecast/</id><summary type="html">&lt;p&gt;タイトルは釣りです。&lt;/p&gt;


&lt;h2&gt;HDMI連動がテレビの電源OFF中に機能しないから&lt;/h2&gt;
&lt;p&gt;以上。&lt;/p&gt;
&lt;p&gt;&lt;img alt="chromecast" src="https://rn4ru.com/blog/images/chromecast_h.jpg" /&gt;&lt;br /&gt;
&lt;a href="http://www.flickr.com/photos/ericajoy/9366309711/"&gt;Chromecast&lt;/a&gt; by &lt;a href="https://www.flickr.com/photos/ericajoy/"&gt;EricaJoy&lt;/a&gt; is licensed under &lt;a href="https://creativecommons.org/licenses/by-sa/2.0/"&gt;CC BY-SA 2.0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ここからは補足。ほとんどのテレビにはHDMI連動機能がついていて、HDMIでつながっている機器の動作に連動して、テレビの電源を入れたり、入力ラインを切り替えたりすることができます。&lt;/p&gt;
&lt;p&gt;Chromecastも例外ではなく、対応アプリやブラウザから送信先にChromecastを選ぶだけでテレビの電源オフの状態からでもシームレスに映像をみることができます。これがかなりスムーズで心地いい。&lt;/p&gt;
&lt;p&gt;しかし、多くのテレビでは電源オフ/待機中にUSBポートから電力が供給されません。このため、Chromecastの電源をテレビの端子からとっていると、テレビを起動しないとChromecastも起動しない、したがってHDMIリンクを使ってテレビを起動することができない、というなんとも残念な結果になってしまいます。&lt;/p&gt;
&lt;p&gt;Chromecastを利用するときにいちいちテレビの電源を入れないといけない、というのに耐えられないという人は、テレビ以外の外部電源を使いましょう。&lt;/p&gt;
&lt;p&gt;&lt;img alt="chromecast power cable" src="https://rn4ru.com/blog/images/chromecast_o.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;ただ、見た目がちょっとよろしくないことになるかもしれません。&lt;/p&gt;</summary><category term="chromecast"></category><category term="gadget"></category></entry><entry><title>Twitterクライアントtを使ってオレオレBufferを作る</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/my-own-bufferapp-twitter-t/" rel="alternate"></link><published>2014-05-27T03:44:45-05:00</published><updated>2014-05-27T03:44:45-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2014-05-27:blog/posts/my-own-bufferapp-twitter-t/</id><summary type="html">&lt;p&gt;Rubyで作られたコマンドラインのツイッタークライアントtを使って、自動投稿ツールのbufferをローカル環境に構築します。&lt;/p&gt;


&lt;p&gt;&lt;img alt="t_buffer" src="https://rn4ru.com/blog/images/t_buffer.png" /&gt;&lt;/p&gt;
&lt;h2&gt;Bufferとは&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://bufferapp.com"&gt;Buffer&lt;/a&gt;というSNS自動投稿ツールを知っていますか？TwitterやFacebookと連携させれば、つぶやきをどんどんストックしていくだけで指定した時間に投稿してくれるWebサービスです。&lt;/p&gt;
&lt;p&gt;Twitterで「なう」をつぶやくのも魅力のうちですが、やはりフォロワーさんとシェアしたい情報やつぶやきはなるべく多くの皆さんに見てもらいたいもの。そんな時にBufferを使えばアクティブなユーザが多そうな時間帯(例えば通勤時間帯やお昼休みなど)に自動で投稿してくれます。&lt;/p&gt;
&lt;p&gt;自分の場合、日本との時差の関係で共有したいタイミングがベストでない事が多いのでよく使わせてもらってます。Buffer自体の使い方は他サイトさんを参照してもらうとして、このBufferもどきを自前で構築してしまおうと思いました。つまり指定した時間になったときに用意しておいた文章を投稿できるようにします。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://nanapi.jp/62054/"&gt;Twitterをよく使う人必見！Bufferの使い方 | nanapi [ナナピ]&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;必要なもの&lt;/h2&gt;
&lt;p&gt;コマンドラインから投稿できる手段さえ見つければ後はスクリプトでなんとかなります。今回は&lt;a href="http://github.com/sferik/t"&gt;t&lt;/a&gt;を使います。&lt;/p&gt;
&lt;p&gt;tはRubyで書かれたtwitterのコマンドラインインタフェースです。つぶやきの投稿・削除はもちろん、タイムラインの取得、リツイート、フォロワー管理などさまざまなコマンドが用意されています。&lt;/p&gt;
&lt;h2&gt;セットアップ&lt;/h2&gt;
&lt;p&gt;インストールは &lt;code&gt;gem install t&lt;/code&gt; でできます。事前にシステムにRuby 1.9.2以上がインストールされていることを確認してください。&lt;/p&gt;
&lt;p&gt;このクライアントを利用するには自分でツイッターアプリとして登録しなければなりません。&lt;a href="http://apps.twitter.com/app/new"&gt;こちら&lt;/a&gt;でアプリの名前と概要、ウェブサイトを入力します。どうせ自分しか使わないので適当でいいでしょう(クライアントによっては投稿されたアプリの名前を表示するものがあるので名前くらいはいい感じにしておいた方がいいかもしれません)。アプリの権限をRead, Write and Access direct messagesにしておいてください。&lt;/p&gt;
&lt;p&gt;自分用のアプリを登録したらコマンドラインで&lt;code&gt;t authorize&lt;/code&gt;と入力します。指示にしたがってAPIキーとシークレットキーを入力します。これだけでセットアップは完了です。 &lt;code&gt;t update "つぶやく内容"&lt;/code&gt; でつぶやけたら成功です。&lt;/p&gt;
&lt;h2&gt;シェルスクリプトからtを使う&lt;/h2&gt;
&lt;p&gt;tはただのコマンドなので、シェルスクリプト内で簡単に実行できます。例えばqueue.txtに保存されたテキストから1行読み込んで投稿するシェルスクリプトは以下のように書けます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="nv"&gt;line&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;head -n &lt;span class="m"&gt;1&lt;/span&gt; queue.txt&lt;span class="sb"&gt;`&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; ! -z &lt;span class="nv"&gt;$line&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    t update &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    sed -e &lt;span class="s2"&gt;&amp;quot;1d&amp;quot;&lt;/span&gt; queue.txt &amp;gt; queue.tmp
    mv queue.tmp queue.txt
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;変数lineに1行読み込んで、それが空でなかった場合に &lt;code&gt;t update&lt;/code&gt; で投稿します。投稿した行はもう必要ないので &lt;code&gt;sed -e "1d"&lt;/code&gt; で削除したものを上書き保存します。&lt;/p&gt;
&lt;p&gt;このスクリプトをcronやlaunchAgent(macの場合)を使って定期的に実行するようにします。あとはqueue.txtに投稿したい内容を放り込んでいくだけです。&lt;/p&gt;
&lt;h2&gt;メリット/デメリット&lt;/h2&gt;
&lt;p&gt;Bufferの無料アカウントではキューを10個までしか貯めることができませんが、このオレオレBufferでは好きなだけ放り込むことができます。投稿時間もcron及びlaunchAgentを使ってフレキシブル(x分毎とか)にできます。またtは複数アカウントに対応しているので、投稿内容に応じてアカウントを切り替えるというのも簡単です(先の無料アカウントでは1つのみ)。&lt;/p&gt;
&lt;p&gt;Bufferでは投稿したそれぞれのつぶやきについてクリックやRTの統計を取ることができますが、本家Twitterでも&lt;a href="http://analytics.twitter.com"&gt;できる&lt;/a&gt;ようになったので、そこはもうアドバンテージではないかと。&lt;/p&gt;
&lt;p&gt;これを応用すれば指定した時間にRTしたり(Bufferでもできる)や削除したりするスクリプトも書くことができます。それぞれのコマンドについてはtのドキュメントを参照してください。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.lifehacker.jp/2014/05/140525delete_it_later.html"&gt;指定した時刻にツイートやFB投稿を自動的に削除するサービス「Delete it Later」 : ライフハッカー［日本版］&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;また、外部サービスを利用せずにローカルで完結しているというのもメリットかもしれません。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ushigyu.net/2013/10/27/buffer-hacked/"&gt;【復旧済】Bufferがハッキングされ、勝手にツイート・Facebook投稿されている人多数。自分のアカウントも要チェック！&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;デメリットとしては、ローカルに構築しているのでコンピュータが電源OFFの時はスクリプトが動きません。スリープにしておけば裏でサービスが動かしてくれます。あとはもちろんネットワークにつながってないとだめです。&lt;/p&gt;
&lt;p&gt;自宅サーバーやVPSで動かしてもいいでしょうが、このためだけに環境を構築するのはオーバーキルですね。普通にBuffer使ったほうがいいと思います。&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;今回はコマンドラインTwitterクライアントのtを使ってオレオレBufferを作ってみました。(ところで「t」って検索し辛い名称)&lt;/p&gt;
&lt;p&gt;Buffer自体はとても便利なサービスです。自分もずいぶん長い間利用させてもらってます。それでも無料で出来る範囲だとキューの数に制限があったり、複数アカウントが使えなかったりします。なら有料にしろっていう話ですが、そのために月10ドル払う気もしないという。オレオレBufferはそんな時にいいオプションになるのではないでしょうか。&lt;/p&gt;</summary><category term="twitter"></category><category term="tool"></category><category term="automation"></category></entry><entry><title>gshufでテキストシャッフル (OS X)</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/shuffling-with-gshuf/" rel="alternate"></link><published>2014-05-23T10:27:42-05:00</published><updated>2014-05-23T10:27:42-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2014-05-23:blog/posts/shuffling-with-gshuf/</id><summary type="html">&lt;p&gt;テキストファイルに格納されたデータをターミナル上でシャッフルしたかったので調べてみました。&lt;/p&gt;


&lt;p&gt;&lt;img alt="フォーチュンクッキー" src="https://rn4ru.com/blog/images/fortune_cookies.jpg" /&gt;&lt;br /&gt;
&lt;a href="https://www.flickr.com/photos/nomadic_lass/5322091121/"&gt;Good Fortune&lt;/a&gt; by &lt;a href="https://www.flickr.com/photos/nomadic_lass/"&gt;Nomadic Lass&lt;/a&gt; is licensed under &lt;a href="https://creativecommons.org/licenses/by-sa/2.0/"&gt;CC BY-SA 2.0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Linuxなどでは &lt;code&gt;shuf&lt;/code&gt; というツールがあるらしいのですが、OS Xにはデフォルトで見つかりません。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt; shuf
&lt;span class="go"&gt;-bash: shuf: command not found&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;そこで &lt;code&gt;brew install coreutils&lt;/code&gt; でサクッとインストールすると &lt;code&gt;gshuf&lt;/code&gt; が使えるようになりました。これでいつでもおみくじを引くことができますね。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt; cat unsei.dat
&lt;span class="go"&gt;大吉&lt;/span&gt;
&lt;span class="go"&gt;中吉&lt;/span&gt;
&lt;span class="go"&gt;小吉&lt;/span&gt;
&lt;span class="go"&gt;吉&lt;/span&gt;
&lt;span class="go"&gt;末吉&lt;/span&gt;
&lt;span class="go"&gt;凶&lt;/span&gt;
&lt;span class="go"&gt;大凶&lt;/span&gt;
&lt;span class="gp"&gt;$&lt;/span&gt; gshuf unsei.dat &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="go"&gt;中吉&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;参照元: &lt;a href="http://stackoverflow.com/questions/2153882/how-can-i-shuffle-the-lines-of-a-text-file-in-unix-command-line#comment20218454_2153897"&gt;random - How can I shuffle the lines of a text file in Unix command line? - Stack Overflow&lt;/a&gt;&lt;/p&gt;</summary><category term="homebrew"></category><category term="tool"></category></entry><entry><title>モンテカルロ法を用いた待ち行列モデルのシミュレーションについて</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/monte-carlo-queueing-system-simulation/" rel="alternate"></link><published>2014-05-19T22:39:22-05:00</published><updated>2014-05-19T22:39:22-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2014-05-19:blog/posts/monte-carlo-queueing-system-simulation/</id><summary type="html">&lt;p&gt;待ち行列のシミュレーションというと、顧客が何時何分に列に並んで、何分待って、窓口の処理に何分かかったか、など時間を軸にすることが多いです。一方で、時間の概念を一切使用しない、単純に乱数と確率のみを用いるモンテカルロ・シミュレーションを待ち行列モデルに応用したものを授業で習ったので紹介します。&lt;/p&gt;


&lt;h2&gt;モンテカルロ・シミュレーションでπを求める&lt;/h2&gt;
&lt;p&gt;モンテカルロ・シミュレーションでおそらくもっとも有名なのは、円周率πの近似値を求めるものではないでしょうか。xy座標の中心に縦横長さ2の正方形を置き、さらにその中に半径1の円を描きます。乱数生成器を用いてx座標とy座標をそれぞれ生成し、その点(x,y)が円の内側にある、つまり&lt;img alt="円の中" src="http://mathurl.com/q74ekfc.png" /&gt;になった回数をcとします。乱数が均一に(-1,1)の範囲の数値を生成すると仮定すると、点の総数Nが十分大きいとき、cとNの比は円と正方形に面積の比に等しくなるはずです(各点がまんべんなく正方形内に散らばってるのをイメージしてください)。円の面積:正方形の面積=π:4=c:Nなので、π=4c/Nが導けます。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pi estimation" src="https://rn4ru.com/blog/images/monte_carlo_pi.png" /&gt;&lt;/p&gt;
&lt;p&gt;というわけでJavaで書いてみました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Random&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Random&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100000000&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++){&lt;/span&gt;
        &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nextFloat&lt;/span&gt;&lt;span class="o"&gt;()*&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nextFloat&lt;/span&gt;&lt;span class="o"&gt;()*&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
            &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;実行するとπの近似値が表示されるはずです。Nの数値は適当に大きくしてください。&lt;/p&gt;
&lt;h2&gt;モンテカルロ・シミュレーションで待ち行列のブロック率を求める&lt;/h2&gt;
&lt;p&gt;さて、これを待ち行列に応用してみます。顧客が1単位時間の間に列に並ぶ頻度(例えば、10分間で3人並ぶのならば0.3人/分)を&lt;img alt="lambda" src="http://mathurl.com/c8c2x3.png" /&gt;とし、カウンターでの処理が終わって列から離れる頻度を&lt;img alt="mu" src="http://mathurl.com/ygnyf6e.png" /&gt;とします。列に並べるのは5人まで、としましょう。すると並んでいる顧客の数に注目した以下の図を導くことができます。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Birth and Death" src="https://rn4ru.com/blog/images/birth_and_death.png" /&gt;&lt;/p&gt;
&lt;p&gt;これは&lt;a href="http://en.wikipedia.org/wiki/Birth%E2%80%93death_process"&gt;Birth–death process&lt;/a&gt;という手法で、ある状態からその隣の状態に移る頻度を表したものです。この場合、列に並んでいる顧客の数がn人の時、&lt;img alt="lambda" src="http://mathurl.com/c8c2x3.png" /&gt;の頻度でn+1人になり、&lt;img alt="mu" src="http://mathurl.com/ygnyf6e.png" /&gt;の頻度でn-1人になることを表します。&lt;/p&gt;
&lt;p&gt;一般的なシミュレーションでは、それぞれイベントを単位時間あたりの頻度に応じて発生させ、その変化を記録するものですが、モンテカルロ・シミュレーションでは上でも上げたように時間の概念がありません。つまり単位時間あたりの頻度は意味をなしません。そこで次のように考えます。&lt;/p&gt;
&lt;p&gt;仮にあるイベントが起こったとして、そのイベントがArrival(顧客の到着)であるかDeparture(顧客の離脱)であるかを後から決めようじゃないか。もし、Arrivalだったら並んでいる顧客の数を増やし、Departureだったら減らせばいい。&lt;/p&gt;
&lt;p&gt;イベントが発生したのに、顧客が増えるか減るかどうかはそのイベントの中身が決まるまでわからないという、なんだかシュレディンガーの猫みたいな話ですが、問題はどうやって中身を決めるかです。ここで確率を使います。&lt;/p&gt;
&lt;p&gt;例えば&lt;img alt="lambda" src="http://mathurl.com/c8c2x3.png" /&gt;と&lt;img alt="mu" src="http://mathurl.com/ygnyf6e.png" /&gt;が同じ値であると仮定してみます。シミュレーション中はArrivalとDepartureが同じ頻度で発生するのですから、あるイベントが発生した時にArrivalである確率は50%であると簡単にわかります。それでは&lt;img alt="lambda" src="http://mathurl.com/c8c2x3.png" /&gt;が&lt;img alt="mu" src="http://mathurl.com/ygnyf6e.png" /&gt;の2倍だったら? 2/3でほぼ66.7%ですね。このように、Arrivalが起こる確率は&lt;img alt="lambda over lambda+mu" src="http://mathurl.com/kg5txsw.png" /&gt;で計算できます。例外は列に誰も並んでいないときで、この時発生したイベントは100%でArrivalです。&lt;/p&gt;
&lt;p&gt;というわけで、モンテカルロ・シミュレーションを用いて待ち行列をシミュレートするのは次のようになります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;イベント発生。&lt;/li&gt;
&lt;li&gt;もし顧客の数が0だったら、確実にArrivalなので顧客の数を1つ増やす。5.へ。&lt;/li&gt;
&lt;li&gt;そうでなければ乱数生成器を使って(0,1)の乱数xを発生させる&lt;/li&gt;
&lt;li&gt;もしxが&lt;img alt="lambda over lambda+mu" src="http://mathurl.com/kg5txsw.png" /&gt;より大きければ、Departureなので顧客の数を一つ減らす。そうでなければ、一つ増やす。&lt;/li&gt;
&lt;li&gt;1.に戻る。適当な数のイベントを発生させたら終了。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ところで、今回の目的はブロック率を求めることです。ブロック率はブロックされた数をArrivalの総数で割ればいいので2つのカウンターを用意しました。その名もarrivalとrejectionです。arrivalはArrivalが発生したときにインクリメントされ、rejectionはArrivalが発生し、かつ待ち行列が満杯(つまりN=5)の時にインクリメントされます。小数点以下第4位まで欲しかったのでArrivalを10000個発生させた時点で終了とします。Javaで書くと次のようになります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 顧客数&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;lambda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; 
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;mu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; 
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;arrival&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;rejection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;Random&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Random&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;    
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arrival&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// イベント発生&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// 確実にArrival&lt;/span&gt;
            &lt;span class="n"&gt;arrival&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;
            &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nextDouble&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;lambda&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lambda&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;mu&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; 
            &lt;span class="c1"&gt;// Departure&lt;/span&gt;
            &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="o"&gt;--;&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;arrival&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// キューが満杯なのでブロック&lt;/span&gt;
            &lt;span class="n"&gt;rejection&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;rejection&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;arrival&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;実行すると大体0.800ほどの値が得られます。これは&lt;img alt="lambda" src="http://mathurl.com/c8c2x3.png" /&gt;が5、&lt;img alt="mu" src="http://mathurl.com/ygnyf6e.png" /&gt;が2、行列の上限が5の理論値(0.80005…)ともほぼ一致します(理論値を求める方法はまたの機会にします)。つまり、モンテカルロ・シミュレーションを用いて、ある待ち行列モデルのブロック率を求めることに成功しました。&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;この記事ではモンテカルロ・シミュレーションを紹介しました。モンテカルロ・シミュレーションは乱数と確率のみを用いたシミュレーションで、有名なところでは円周率πの近似値を求めたりするのに使われます。&lt;/p&gt;
&lt;p&gt;これを待ち行列に応用するには、顧客が並ぶ(Arrival)、離れる(Departure)といったイベントの頻度を使ってそれぞれのイベントの発生確率を計算します。次に、あるイベントが発生したと仮定して、そのイベントを乱数発生器を用いて確定します。その確定したイベントにしたがって待ち行列の状態を変化させます。&lt;/p&gt;
&lt;p&gt;この手法のメリットの一つとして、プログラムを簡潔にすることができます。時間を軸にしたシミュレーションでは、シミュレーションクロックなどを用いて時間の流れを管理しなければならないからです。モンテカルロ・シミュレーションではシミュレーションクロックを完全に取り除くことができます。&lt;/p&gt;
&lt;p&gt;その一方でデメリットとして時間を元にしたメトリクスを記録することが難しくなることが上げられます。例えば顧客の平均待ち時間などです。&lt;/p&gt;</summary><category term="lecture-note"></category><category term="simulation"></category></entry><entry><title>シミュレーションで得た実測値を元に理論値を推測する方法。あるいは信頼水準とその区間について。</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/approximate-mean-with-confidence-interval/" rel="alternate"></link><published>2014-04-17T13:22:48-05:00</published><updated>2014-04-17T13:22:48-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2014-04-17:blog/posts/approximate-mean-with-confidence-interval/</id><summary type="html">&lt;p&gt;例えば、銀行窓口の平均待ち時間が5分であるモデルを用いてシミュレーションを何回か行った場合、その待ち時間の実測値は(実装にミスがなければ)5分に収束すると予想されます。&lt;/p&gt;
&lt;p&gt;それでは、逆にあるシミュレーションを行った結果、平均待ち時間が5分だったとして、それを元にしてこのモデルでは平均待ち時間は5分である、と言えるでしょうか？あるいはそのように主張する場合、どうすればより説得力を持たせることができるでしょうか？&lt;/p&gt;


&lt;h2&gt;シミュレーションでできること&lt;/h2&gt;
&lt;p&gt;シミュレーションは理論上のモデルだけでは計算するのが難しいパラメータを実際に計測するのに便利です。&lt;/p&gt;
&lt;p&gt;例えば先の銀行窓口の例で言うならば、単位時間あたりの顧客数がポアソン分布だとか、各窓口の平均処理時間が指数分布だとかは簡単にモデル化することができます。しかし、そのモデルにおける各顧客の平均待ち時間などという表にでてこないパラメータを計算だけで取得するのはそれほど簡単ではありません。(まあ、この例では簡単かもしれませんが、言いたいことは伝わるかと)&lt;/p&gt;
&lt;p&gt;そんなときにシミュレータをモデルに沿って構築すれば、そのようなモデルには直接出てこない数値を実測することができます。平均待ち時間ならば、シミュレーションの最中に各顧客の待ち時間をそれぞれ記録しておいて、終了後にそれらの平均を取ればいいのです。&lt;/p&gt;
&lt;h2&gt;実測値=理論値？&lt;/h2&gt;
&lt;p&gt;さてここで問題が出てきます。シミュレーションの実測値はあくまで一つの結果でしかありません。シミュレーションの結果がそうであったからといって、理論上のモデルでもそうなるに違いないと結論付けることができるでしょうか？&lt;/p&gt;
&lt;p&gt;例えば多くの場合、シミュレーションには擬似乱数を使うでしょうから、その結果は完全ランダムにはなりません。一方、モデル上で乱数といえば完全ランダムを指すので、ここに齟齬が生じます。&lt;/p&gt;
&lt;p&gt;それならば、と何回もシミュレーションした結果の平均をとってみるとどうでしょうか。回数が多くなればなるほど、実測値の平均=理論値であるという説得力が多くなるような気がします。それでは実際どのくらいの試行回数が必要なのでしょうか。&lt;/p&gt;
&lt;p&gt;ある偉い人が提唱した&lt;a href="http://ja.wikipedia.org/wiki/%E5%A4%A7%E6%95%B0%E3%81%AE%E6%B3%95%E5%89%87"&gt;大数の法則&lt;/a&gt;では次のように言われています。&lt;/p&gt;
&lt;p&gt;式1：&lt;img alt="大数の法則" src="http://mathurl.com/l265l56.png" /&gt;&lt;/p&gt;
&lt;p&gt;ここで、&lt;img alt="\overline{X}(n)" src="http://mathurl.com/nju8e7t.png" /&gt;は実測値n回の平均、&lt;img alt="\mu" src="http://mathurl.com/ygnyf6e.png" /&gt;は理論値の平均を表します。つまり、無限回試行した実測値の平均は理論値として扱ってもいいことになります。&lt;/p&gt;
&lt;h2&gt;時は金なり&lt;/h2&gt;
&lt;p&gt;とはいえ、シミュレーションを無限回やろうとする人はいないでしょう。なんとか有限時間内に収めたいものです。そこでまたまたある偉い人が&lt;a href="http://ja.wikipedia.org/wiki/%E4%B8%AD%E5%BF%83%E6%A5%B5%E9%99%90%E5%AE%9A%E7%90%86"&gt;中心極限定理&lt;/a&gt;というものを見つけました。&lt;/p&gt;
&lt;p&gt;式2：&lt;img alt="Z(x)" src="http://mathurl.com/qapp6jj.png" /&gt;の分布は正規分布に近似する。&lt;/p&gt;
&lt;p&gt;ここで、&lt;img alt="\overline{X}(n)" src="http://mathurl.com/nju8e7t.png" /&gt;と&lt;img alt="\mu" src="http://mathurl.com/ygnyf6e.png" /&gt;は先ほどと同じ、&lt;img alt="\sigma^2" src="http://mathurl.com/abetvkx.png" /&gt;は理論値の分散を表します。&lt;/p&gt;
&lt;p&gt;これはどういうことかというと、&lt;img alt="\overline{X}(n)" src="http://mathurl.com/nju8e7t.png" /&gt;がどのような分布をとるかどうかにかかわらず、それを変形した式2の極限の分布は標準正規分布になるということです。標準正規分布とは平均が0、分散が1となるような分布です。&lt;/p&gt;
&lt;p&gt;標準正規分布は完全にモデル化することができるので、次のような情報も計算することができます。&lt;/p&gt;
&lt;p&gt;&lt;img alt="正規分布" src="https://rn4ru.com/blog/images/confidence-level.png" /&gt;&lt;/p&gt;
&lt;p&gt;赤の斜線は標準正規分布に沿った変数の値が-zからzの範囲になる時の確率を表します。この場合90%の確率でその範囲に収まるということがわかります。先ほどの変数を用いた式で表すと、&lt;/p&gt;
&lt;p&gt;式3：&lt;img alt="変数が区間(-z,z)にあるときの確率" src="http://mathurl.com/npojmgy.png" /&gt;&lt;/p&gt;
&lt;p&gt;となります。これを&lt;img alt="\mu" src="http://mathurl.com/ygnyf6e.png" /&gt;について変形すると、&lt;/p&gt;
&lt;p&gt;式4：&lt;img alt="平均がある区間にあるときの確率" src="http://mathurl.com/lrn537c.png" /&gt;&lt;/p&gt;
&lt;p&gt;これは&lt;img alt="\mu" src="http://mathurl.com/ygnyf6e.png" /&gt;が区間&lt;img alt="\muの区間" src="http://mathurl.com/qjsqnkk.png" /&gt;内にある確率が90%であると読み替えることができます。このような区間を信頼区間と呼び、その確率を信頼水準または信頼係数と呼びます。改めて式を見てみると、実測値から得た理論値の信頼性とその上限及び下限を同時に示していることになります。&lt;/p&gt;
&lt;p&gt;ここまでをまとめてみましょう。今回の目的は理論値を実測値から推定することでしたが、100%完璧に推定するためには無限回の試行が必要だとわかりました。そこで式の変形と標準正規分布を利用して、理論値がある一定の信頼水準を持つという区間を求めることにしました。&lt;/p&gt;
&lt;p&gt;まず信頼水準を決めます。実際は90~95%が使われるとのことです。次に&lt;a href="http://www.koka.ac.jp/morigiwa/sjs/standard_normal_distribution.htm"&gt;標準正規分布表&lt;/a&gt;を用いて、標準正規分布に沿った変数がある区間に存在する確率が信頼水準となるような区間(-z,z)を求めます。zが見つかればあとは式4に基いて実際の上限と下限を計算するだけです。このような評価を行ったグラフを提示する場合、以下のように上限と下限の範囲を示すことで、理論値の「あそび」を可視化することができます。&lt;/p&gt;
&lt;p&gt;&lt;img alt="グラフ" src="https://rn4ru.com/blog/images/upper-lower-bound.png" /&gt;&lt;/p&gt;
&lt;h2&gt;いくつかの制限&lt;/h2&gt;
&lt;p&gt;このような信頼水準と区間を用いた手法は、ただ実測値の平均を示すよりも説得力があることは確かです。しかし、それでも信頼水準があくまで確率である以上、理論値がその区間外にある確率もまた0ではありません。(理論値がある区間に100%の確率で存在するということは、その区間は(-無限,無限)である必要がある)。その他にもいくつか問題があります。&lt;/p&gt;
&lt;p&gt;一つめは、式2が完全に正規分布と一致するには無限回の試行を必要とします。これは無理なので、nを十分に大きくしてできるだけ正規分布に近づくようにします。古い教科書では少なくとも30回以上としていますが、計算能力が発達した今日のコンピュータでは一つのシミュレーションにつき100回、1000回の試行はそれほど難しくないはずです。&lt;/p&gt;
&lt;p&gt;もう一つは、&lt;img alt="\sigma^2" src="http://mathurl.com/abetvkx.png" /&gt;です。理論値の平均を求めようとしているのに、その理論値の分散が必要になってしまいます。理論値の分散も未知の場合がほとんどなので、実際の手順では実測値の分散で置き換えるしかないとのことです。&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;シミュレーションは計算モデルでは簡単に計算出来ないようなパラメータを実測するのに便利ですが、果たしてその実測値がどのように理論値と関連するかを示すことが必要です。今回は実測値を元にある信頼水準を満たすような区間を計算する方法を学びました。&lt;/p&gt;
&lt;p&gt;上記の制限のおかげで、これらの区間はあくまでも近似値ということに注意する必要があります(&lt;a href="http://ja.wikipedia.org/wiki/T%E5%88%86%E5%B8%83"&gt;t分布&lt;/a&gt;を用いた手法など、ある条件のもとで近似でない値を示すことのできる方法もある)。しかしながら、信頼水準と区間を示すことはシミュレーションを用いたモデル評価においては最低限のマナーであるといえるでしょう。&lt;/p&gt;</summary><category term="lecture-note"></category><category term="simulation"></category></entry><entry><title>条件付き確率と独立性について</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/conditional-probability-and-independence/" rel="alternate"></link><published>2014-03-20T10:22:57-05:00</published><updated>2014-03-20T10:22:57-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2014-03-20:blog/posts/conditional-probability-and-independence/</id><summary type="html">&lt;p&gt;52枚のトランプセット(ジョーカーを除く)から続けて二枚カードを引いた時、両方とも絵柄(J、Q、K)のカードである確率を求めなさい。&lt;/p&gt;


&lt;p&gt;最初に52枚から12枚を選び、その後51枚から11枚を選ばなければいけないので、その確率は&lt;img alt="12/52*11/51" src="http://mathurl.com/o2wxj4b.png" /&gt;でおよそ5%となります。&lt;/p&gt;
&lt;h2&gt;条件付き確率&lt;/h2&gt;
&lt;p&gt;最初に絵柄のカードを1枚引いているのだから、その後の確率が影響をうけるのは自然なことにように見えますが、このように事象Aが起こったと仮定して、更に事象Bが起こる確率を&lt;strong&gt;条件付き確率&lt;/strong&gt;と呼び、&lt;img alt="条件付き確率の定義" src="http://mathurl.com/nw329my.png" /&gt;と定義されます。次のベン図を見てください。&lt;/p&gt;
&lt;p&gt;&lt;img alt="条件付き確率のベン図" src="https://rn4ru.com/blog/images/venn-conditional.png" /&gt;&lt;/p&gt;
&lt;p&gt;まず事象Aが起こったと仮定するので、分母は事象Aの確率そのものになります(赤の円)。その上で事象Bが起こらなければならないので、分子は赤の斜線部分、すなわち「AかつB」の確率です。&lt;/p&gt;
&lt;p&gt;両辺に事象Aが起こる確率P(A)を掛けて、式をちょっと変更してみると、&lt;img alt="AかつBの確率を得る" src="http://mathurl.com/ouwx3nc.png" /&gt;となり、AかつBの確率を得ることができます。先ほどの問題に戻ってみましょう。&lt;/p&gt;
&lt;p&gt;この場合P(A)が「最初に絵柄を引く」確率です。そしてP(B|A)が「Aが起こったとして、次に絵柄を引く」確率となります。それらをかけ合わせているので「AとBが両方起こる」確率を計算できていることがわかります。&lt;/p&gt;
&lt;h2&gt;事象の独立性&lt;/h2&gt;
&lt;p&gt;事象AとBが独立であるとします。それらはお互いに影響を受けないわけですから、&lt;img alt="独立な事象AとBの条件付き確率" src="http://mathurl.com/lx86hzm.png" /&gt;になります。さらに独立な事象AとBが共に起こる確率は&lt;img alt="確率A掛ける確率B" src="http://mathurl.com/mqpl4z8.png" /&gt;です。これらを使うとある2つの事象が独立であるかどうかを確かめることができます。&lt;/p&gt;
&lt;p&gt;例題1、2つのサイコロX、Yを同時に振る。事象Aを「サイコロXが奇数」、事象Bを「サイコロYが偶数」とするとき、AとBは独立か？&lt;/p&gt;
&lt;p&gt;まずそれぞれの確率を計算します。事象Aの確率は2分の1。事象Bの確率も2分の1なので、これらが独立であるためにはAとBが同時に起こる確率が4分の1でなければなりません。奇数と偶数の組み合わせは(1,2)、(3,2)、(5,2)、(1,4)、(3,4)、(5,4)、(1,6)、(3,6)、(5,6)の9通りで、確率は36分の9、約分して4分の1になります。したがって事象Aと事象Bは独立であるとわかります。&lt;/p&gt;
&lt;p&gt;例題2、互いに排他的な事象AとBがあり、事象Aが起こる確率P(A)が0&amp;lt;P(A)&amp;lt;1のとき、事象AとBは独立か？&lt;/p&gt;
&lt;p&gt;AとBは排他であるので、AとBが同時に起こる確率は0です。一方でBが起こる確率は問題文より1-P(A)&amp;gt;0なので、P(A)*P(B)&amp;gt;0。したがってAとBは独立ではありません。&lt;/p&gt;
&lt;p&gt;「互いに排他的」と文章で書くと両者に接点がなく、それぞれ独立であるように思えますが、確率論的には全く独立ではありません。むしろべったりです。コインの裏がでる確率はコインの表が出る確率に影響をうけることを考えるとわかりやすいかもしれません。&lt;/p&gt;
&lt;h2&gt;まとめ、あるいはハイジャック犯と乗り合わせる確率&lt;/h2&gt;
&lt;p&gt;これまで条件付き確率と事象の独立性について書いてきました。条件付き確率は日常でも無意識に活用している場面も多いと思います。しかし、それらの事象が独立であるかどうかには気をつけないといけません。最後に、統計的独立性について次のようなジョークを見つけたので引用してこの記事の結びにしたいと思います。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;あなたが旅行で飛行機に乗るとして、爆弾を持ったハイジャック犯と同じ飛行機に乗り合わせてしまう危険を避けるにはどうしたらよいか？答えは、あなたも爆弾を持って乗り込む、である。ある飛行機に爆弾を持った人間が一人乗っている確率をpとすると、爆弾を持った人間が二人乗っている確率は、統計的独立性から p×pとなる。明らかに p &amp;lt;&amp;lt;1 であるから、p×p は無視しうるほどに小さくなるであろう。よってあなたは安心して旅行ができる！
-- &lt;cite&gt;&lt;a href="http://www.ms.osakafu-u.ac.jp/~kayanuma/toukei.html"&gt;kakuritu&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;</summary><category term="lecture-note"></category><category term="probability"></category></entry><entry><title>AWS S3にブログを移行しました。</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/blog-moved-to-aws-s3/" rel="alternate"></link><published>2014-03-18T16:40:08-05:00</published><updated>2014-03-18T16:40:08-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2014-03-18:blog/posts/blog-moved-to-aws-s3/</id><summary type="html">&lt;p&gt;さくらインターネットのサーバーを使ってこれまでブログをホストしてきたのですが、今回Amazon webサービスのS3に移行することにしました。&lt;/p&gt;


&lt;p&gt;&lt;img alt="s3 header" src="https://rn4ru.com/blog/images/s3-header.png" /&gt;&lt;/p&gt;
&lt;p&gt;そもそもさくらインターネットさんのサーバーを使い始めたのは、wordpressでブログを始めたかったのがきっかけでした。が、その後紆余曲折を経て静的サイトジェネレーターのPelicanに落ち着き、それならサーバーでなくてもファイル置き場でいいや、と今回の移行に踏み切った次第です。&lt;/p&gt;
&lt;p&gt;S3は従量課金制ですが、このサイトの規模だと月々の料金がおそらく10分の1以下になると思います。一月たった頃に比較してみたいと思います。&lt;/p&gt;
&lt;p&gt;移行にあたってやったことはS3にログインし、ドメインに対応するバケットを作成。DNS設定をRoute 53に登録した後、ドメイン側でDNSサーバーを切り替えただけです。以下のスライドがとても参考になりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.slideshare.net/horiyasu/amazon-s3web-27138902"&gt;Amazon S3による静的Webサイトホスティング&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;実際のアップロード過程は、PelicanでHTML作成→GZIPで圧縮→s3cmdでアップロードという感じ。Pelicanの場合、全てのファイルを新たに作りなおすので、s3cmd (あるいはS3 API)のsyncがうまく動かない(rsyncの--size-onlyに相当するオプションがない)ので、ソースをちょっと書き換えたりもしました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://sukharevd.net/gzipping-website-in-amazon-s3-bucket.html"&gt;Gzipping website in Amazon S3 bucket&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://s3tools.org/s3cmd"&gt;Amazon S3 tools: s3cmd : command line S3 client&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今のところ特に変なことも起こってなさそうですが、何かありましたら&lt;a href="https://rn4ru.com/blog/about"&gt;連絡&lt;/a&gt;ください。&lt;/p&gt;</summary><category term="aws"></category><category term="s3"></category><category term="route53"></category><category term="pelican"></category></entry><entry><title>再帰関数の末尾再帰(最適化)について</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/tail-recursion/" rel="alternate"></link><published>2014-02-14T18:01:12-06:00</published><updated>2014-02-14T18:01:12-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2014-02-14:blog/posts/tail-recursion/</id><summary type="html">&lt;p&gt;関数の再帰と末尾再帰について学習したのですが、ちょうど&lt;a href="http://scripting.com/2014/02/13/tailRecursionInJavaScript.html"&gt;某所で話題&lt;/a&gt;にあがってたので良いタイミングだなと思って書き留めておきます。&lt;/p&gt;


&lt;p&gt;再帰とは自分自身を参照するようなアクションのことです。再帰関数が一番に思い浮かびますが、定義や言葉遊びなどでも使われます。例えばプログラム言語のPHPですが、この頭文字は現在「PHP: Hypertext Preprocessor」を意味するものとなっています。PHPを展開したのにまたPHPが出てきます。&lt;/p&gt;
&lt;h2&gt;階乗を計算する!&lt;/h2&gt;
&lt;p&gt;さて自分自身を呼び出す関数のことを再帰関数と呼びますが、一例としてnの階乗を計算する関数を見てみましょう。nの階乗とはn!と書き、1からnまでを乗算した数です。1の階乗は1、2の階乗は1×2で2、3の階乗は1×2×3で6となります。同様に、nの階乗は1×2×…×(n-1)×nとなります。&lt;/p&gt;
&lt;p&gt;もうちょっと詳しく計算を注目してみます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1! = 1&lt;/li&gt;
&lt;li&gt;2! = 1×2 = 1!×2&lt;/li&gt;
&lt;li&gt;3! = 1×2×3 = 2!×3&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;li&gt;n! = 1×2×…×(n-1)×n = (n-1)!×n&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;nの階乗は(n-1)の階乗にnを掛けたもの、ということがわかるので(n-1)の階乗を計算しようとします。そのためには(n-1)-1の階乗、つまり(n-2)!が必要です。そうやって一つ手前の階乗を順番に計算していって、最終的に1の階乗に来た時にやっと1!が1であることにたどり着きます。階乗を計算するのに階乗が必要になる、立派な再帰ですね。まとめると、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1! = 1&lt;/li&gt;
&lt;li&gt;n! = n × (n-1)!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;階乗の定義はこれだけです。簡単ですね。nの階乗を求めたいときには、nが1だったら1を、それ以外だったら(n-1)の階乗を計算してそれにnを掛けたものを返します。これをJavaで書くと次のようになります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;factorial&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;factorial&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;このように再帰関数は定義をそのまま表したものによく似ていることが多く、見た目にも何をしているのかわかりやすいのが特徴です。もう一つの例を見てみましょう。&lt;/p&gt;
&lt;h2&gt;フィボナッチ数&lt;/h2&gt;
&lt;p&gt;フィボナッチ数列は以下のように定義されます(一例)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1番目の数は1&lt;/li&gt;
&lt;li&gt;2番目の数も1&lt;/li&gt;
&lt;li&gt;n番目の数は(n-1)番目と(n-2)番目の数を足したもの&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;実際に計算してみると、1、1、2、3、5、8、13、…と続きます。そこでn番目の数を計算するプログラムはこうなります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;fib&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;イメージ通りだったでしょうか。&lt;/p&gt;
&lt;h2&gt;効率を考える&lt;/h2&gt;
&lt;p&gt;見た目もシンプルでわかりやすい再帰関数ですが、プログラム中で利用するにはいくつか問題があります。その内の一つが再帰から戻ってくるためにコールスタックを一つ消費する必要があるということです。&lt;/p&gt;
&lt;p&gt;コールスタックとは新たな作業を始めるためのスペースだと思ってください。人が並んで座れる長机だと考えるとわかりやすいかもしれません。このスペースがなくなるまで(つまり、隣に人が座れなくなるまで)再帰を続けるとスタックオーバーフローというエラーが起こります。このため無限に再帰関数を呼び続けることはコールスタックに制限がある以上簡単にはできません。&lt;/p&gt;
&lt;p&gt;もうちょっと具体的にみてみます。さっきのfactorial関数ですが、nを計算するときに(n-1)の階乗の結果を待たなければなりません。このため、この関数はコールスタックを一つ消費して(n-1)!を計算しようとします。座ってる机の隣のスペースにに人を呼んで仕事を頼む感じです。&lt;/p&gt;
&lt;p&gt;(n-1)!を頼まれた人は、また別の人を呼んで(n-2)!の計算を頼みます。このように次々に仕事を次の人に頼んでいき、最終的に1!の計算を頼まれた人が1を計算結果として2!を計算しようとしている人に返します。すると2!の人は、返ってきた1と2を掛けた2を計算結果として3!の人に返します。このようにして次々と結果が返ってきて、最終的にはn!の人が(n-1)!の人から返ってきた結果にnを掛けて計算終了となります。&lt;/p&gt;
&lt;p&gt;&lt;img alt="recursion" src="https://rn4ru.com/blog/images/recursion.png" /&gt;&lt;/p&gt;
&lt;p&gt;このやり方ですと100!を計算しようとすると100人が必要になることになります。さらに最初に仕事を頼んだ人は99!の人が計算を返すまでずっと待っていなければなりません。このような再帰は少し効率が悪そうに見えます。&lt;/p&gt;
&lt;h2&gt;隣の人に計算を投げっぱなしにする&lt;/h2&gt;
&lt;p&gt;ここで発想の転換を行います。頼んだ仕事が返ってくるのを待つのではなくて、自分の仕事を終わらせた後、隣に人を呼んで、後の作業を任せてしまうのです。任せてしまった後は自分は席を立って構いません。&lt;/p&gt;
&lt;p&gt;このようにすれば、計算中に同時に長机に座っている人は一人だけです。いくら再帰を呼んでもコールスタックを消費しないので無限に再帰することができます。これが末尾再帰の概念です。&lt;/p&gt;
&lt;p&gt;さて実際どのようにfactorial関数を末尾再帰にするかを考えます。最初の人が頼んだ計算結果を待たなければいけない理由は再帰を呼ぶ式に理由があります。関数の2行目を見てみましょう。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;factorial&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;作業を完了するには、返ってきた計算結果にnを掛ける必要があるので待っているわけです。ここを投げっぱなしにするにはどうすればいいでしょうか。勘の良い人は、関数を呼ぶだけにすればいいと気がつくかもしれません。つまり&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;factorial&lt;/span&gt;&lt;span class="o"&gt;(...);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;だけにするのです。こうすれば、最初の人は「あとはよろしく」と隣の人に任せて
席をたつことができます。戻ってきたところで自分は何もすることがないですし。問題は...の部分をどうするかです。どうすれば隣の人に自分が計算した分を渡すことができるでしょうか。末尾再帰では補助変数としてaccumulatorというものがよく使われます。長机の例で言うなら、隣の人に渡す作業メモにそれまでの結果を書き記すようなものです。このaccを使ってfactorial関数を末尾再帰にしてみます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;factorial&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;factorial&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;違いが分かりますか？この関数は2つの変数を受け取るようになっています。ひとつは今までどおり計算対象のn、もうひとつはaccです。さらに関数の2行目に注目してください、return文が再帰呼び出しだけになっています。これなら隣の人に任せて自分は席をたつことができます。&lt;/p&gt;
&lt;p&gt;&lt;img alt="recursion" src="https://rn4ru.com/blog/images/tail-recursion.png" /&gt;&lt;/p&gt;
&lt;h2&gt;ロジック&lt;/h2&gt;
&lt;p&gt;なるほど見た目は確かに末尾再帰になっているみたいですが、果たして計算結果は正しいのでしょうか。ちょっとロジックを見てみます。この関数はfactorial(n,1)のようにして呼び出します。&lt;/p&gt;
&lt;p&gt;まずnが1の時を考えると、この関数はaccを直接返します。つまりfactorial(1,1)=1となり、これは正しいです。それではfactorial(2,1)はどうでしょうか。nは1ではないので、関数はfactorial(1, 2)を呼び出します。今度はnが1なのでaccである2を返します。うん、あってる。factorial(3, 1)のときは再帰呼び出しはfactorial(3, 1)-&amp;gt;factorial(2, 3)-&amp;gt;factorial(1, 6)となります。これも正しい。&lt;/p&gt;
&lt;p&gt;accだけに注目してみましょう。nが1つずつ減っていくたびに、accにはその時のnが掛けられます。最初はn、その次はn-1、その次はn-2という風に。なんだか階乗の計算を逆からやっているような感じですが、実際その通りです。&lt;/p&gt;
&lt;h2&gt;再帰とループ&lt;/h2&gt;
&lt;p&gt;プログラムを勉強したことがある人は、再帰とループはいつでも相互に変換可能であると聞いたことがあると思います。再帰呼び出しをループに変換してしまえばもちろんコールスタックは消費しないので、いつまでもループすることができます。この点で末尾再帰とループ変換は同じ方向を向いていると言えます。末尾再帰が隣の人に作業を頼むなら、ループ変換は一人で黙々と計算し続けるイメージです。&lt;/p&gt;
&lt;p&gt;ところがいくつかのプログラム言語にはループが言語仕様として定められていない、あるいは煩雑であるようなものがあります。関数型言語がいい例です。そのため末尾再帰がより利用され、そのようなコンパイラも末尾再帰の最適化をサポートしています。しかし、ここまでの例で使っておいてなんですが、Javaのコンパイラは残念ながら末尾再帰の最適化をサポートしていません。&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;今回は末尾再帰を学習しました。末尾再帰とはプログラミングにおける再帰呼び出しの一種で、コンパイラの最適化によってはコールスタックを消費しないためネストが深くなりがちの再帰処理に向いています。末尾再帰になる条件は「再帰呼び出しを行う行がreturnと関数呼び出しだけで構成されていること」です。&lt;/p&gt;</summary><category term="programming"></category><category term="snippet"></category></entry><entry><title>Chromecast SDKが発表されたぞ。</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/chromecast-sdk/" rel="alternate"></link><published>2014-02-04T14:24:52-06:00</published><updated>2014-02-04T14:24:52-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2014-02-04:blog/posts/chromecast-sdk/</id><summary type="html">&lt;p&gt;&lt;a href="https://rn4ru.com/blog/posts/superbowl/"&gt;前回の記事&lt;/a&gt;でChromecastを買ったということを書きましたが、この度、グーグルがアプリケーションを開発するためのSDK(Software Development Kit)を公開したそうです。&lt;/p&gt;


&lt;p&gt;&lt;img alt="chromecast" src="https://rn4ru.com/blog/images/chromecast.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://news.cnet.com/8301-1023_3-57617969-93/google-opens-chromecast-to-all-developers/"&gt;Google opens Chromecast to all developers | Internet &amp;amp; Media - CNET News&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;改めて「Chromecastとはなんぞや」をおさらいしてみると、ChromecastはHDMI端子に接続できる親指大の端末で、PCやタブレットからデスクトップや動画を映し出すことができるというもの。AppleTVなどの類似の商品とは異なるのはそれ自体で動画を再生することはできず、あくまでもコントローラーとしてのGoogle ChromeやYoutubeなどの対応アプリが必要でした。&lt;/p&gt;
&lt;p&gt;となるとアプリの充実度が問題になってくるわけですが、これまでChromecastが対応していたのはYouTubeやNetflix、Pandoraなどの限られたアプリだけでした。しかしながら、今回のSDKの公開によって今後多くのアプリがChromecastのコントローラーとして使えるようになりそうです。&lt;/p&gt;
&lt;p&gt;個人的にはただ動画をテレビ画面に映し出すだけでない、+αで面白い発想のアプリが出てこないかなーと期待しています。&lt;/p&gt;
&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00DR0PDNE/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/31Hgfy4y9DL._SL160_.jpg" alt="並行輸入品 北米版 グーグルChromecast HDMIストリーミングメディアプレーヤー" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00DR0PDNE/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;並行輸入品 北米版 グーグルChromecast HDMIストリーミングメディアプレーヤー&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 14.02.03&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;Google &lt;br /&gt;売り上げランキング: 665&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00DR0PDNE/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;</summary><category term="news"></category><category term="gadget"></category><category term="chromecast"></category></entry><entry><title>テレビを買ってスーパーボウルを見る/おまけでChromecast</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/superbowl/" rel="alternate"></link><published>2014-02-02T19:24:19-06:00</published><updated>2014-02-02T19:24:19-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2014-02-02:blog/posts/superbowl/</id><summary type="html">&lt;p&gt;今スーパーボウルを見ながらこれを書いています。ハーフタイムショーのレッチリ一瞬だったなー。&lt;/p&gt;


&lt;h2&gt;ん？スーパーボウル？&lt;/h2&gt;
&lt;p&gt;&lt;a title="Popcorn" href="http://flickr.com/photos/alancleaver/3618369967/"&gt;&lt;img src="http://farm4.staticflickr.com/3647/3618369967_068739eca7.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;small&gt;&lt;a title="Popcorn" href="http://flickr.com/photos/alancleaver/3618369967/"&gt;cc licensed ( BY )  flickr photo&lt;/a&gt; shared by &lt;a href="http://flickr.com/people/alancleaver/"&gt;Alan Cleaver&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;今日の朝目が覚めた時に最初に思ったことは「あ、今日スーパーボウルじゃん。」そしてその次に思ったことは「そうだ、テレビ買いに行こう。」&lt;/p&gt;
&lt;p&gt;そうなんです。今のアパートメントに引っ越してきてからはもちろん、これまでのアメリカ生活、テレビ無しで過ごしていたのでした。特になくても困らなかったし。&lt;/p&gt;
&lt;p&gt;ところが今朝急になんとなくテレビが欲しくなったのです。せっかく契約したケーブルテレビがもったいないということもありました。無料だけど。&lt;/p&gt;
&lt;p&gt;あ、後半始まったばかりなのにシアトルがタッチダウン決めた。&lt;/p&gt;
&lt;p&gt;それでもそれでもBest Buyに行くまではまだ迷ってました。今まで必要なかったんだからこれまでも必要ないでしょって。引っ越すときめんどくさいでしょって。でもBest Buy(ヤマダ電機的な家電チェーン店)に入ってみたらセールしてたんです。32インチで170ドル。&lt;/p&gt;
&lt;p&gt;次の瞬間店員さんに言ってましたね。「これください。」&lt;/p&gt;
&lt;p&gt;そんなこんなでセットアップして今スーパーボウル見てます。&lt;/p&gt;
&lt;p&gt;&lt;img alt="32 inch TV" src="https://rn4ru.com/blog/images/tv.jpg" /&gt;&lt;/p&gt;
&lt;h2&gt;ケーブルTVってアナログじゃねーか&lt;/h2&gt;
&lt;p&gt;さすが無料サービスのケーブルTVだけあってアナログしか映りません。アメリカも地デジ的なものに移行してて、おそらくカスタマーサービスとかに連絡すればデジタルで見れるのかもしれないけど、まあそれはまたいつかということで。&lt;/p&gt;
&lt;p&gt;でもそれだけじゃせっかくの32インチ720pの能力をフルに発揮できてないですね。上下左右に黒帯ができてるし。しかし、そんなこともあろうかと一緒に買っておいたのがこれです。先の画像からも分かる人もいるかもしれませんが。&lt;/p&gt;
&lt;p&gt;&lt;img alt="chromecast" src="https://rn4ru.com/blog/images/chromecast.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;そうです。Chromecastです。クロームキャスト。PCやタブレット上で見ているYouTubeやNetflixの動画をテレビに映し出すことができます。最初かなり真剣にAppleTVにしようかと思っていたのですが、このChromecastが猛プッシュされてました。定価35ドル。衝動買いです。&lt;/p&gt;
&lt;p&gt;とりあえず動画をいくつか再生してみましたが、アナログ画質とは比べ物にならないほどキレイです。720pのところに1080pを投影してるので多少オーバースペックかもしれないですが。&lt;/p&gt;
&lt;p&gt;パソコンやタブレットの画面上で再生できるものをテレビで再生してどうすんのというつっこみがありそうですが、自分でもびっくりしてますけどこれがなかなか快適なんです。なぜか？おそらく適度な距離感が保てるからじゃないかなと思いました。&lt;/p&gt;
&lt;p&gt;言っても手元のMBPやiPadの画面までの距離は30-50cmくらいですよね。その距離で動画がチラチラ移り変わるとついそっちが気になってしまいます。これは「ながら作業」によくありません。いや、ながら作業自体あんまり良くないですが。&lt;/p&gt;
&lt;p&gt;それがテレビという2-3m離れた場所で再生することで、ある種の環境音みたいな感じでそこまで気にならなくなります。このスーパーボウルもいい感じでながら見できています。ちょっと試合展開一方的なんですが、これをもし手元で見ていたらおそらくもう画面閉じてると思います。&lt;/p&gt;
&lt;p&gt;まだYouTubeの動画しか試してないのですが、今度Netflixの映画とかも見てみようと思います。そう言えば1ヶ月無料の案内が来てましたし。&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;あ、またタッチダウンした。シアトルが。&lt;/p&gt;
&lt;p&gt;とにかくとにかく、今日はテレビとChromecastを買いました。今のところ満足してます。これに加えてゲームコンソールを買ってしまうと学校生活終わりそうなので、そこは自重しようと思います。&lt;/p&gt;
&lt;p&gt;Chromecastについて興味のある人は以下のリンクもどうぞ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://jp.techcrunch.com/2013/07/25/20130724google-chromecast/"&gt;Google、Chromecastを35ドルで今日から発売―居間のテレビに取り付けるとビデオコンテンツをストリーミング受信できる | TechCrunch Japan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogos.com/article/75325/"&gt;Googleの「Chromecast」はどのように世界を変えるか？&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00DR0PDNE/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/31Hgfy4y9DL._SL160_.jpg" alt="並行輸入品 北米版 グーグルChromecast HDMIストリーミングメディアプレーヤー" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00DR0PDNE/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;並行輸入品 北米版 グーグルChromecast HDMIストリーミングメディアプレーヤー&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 14.02.03&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;Google &lt;br /&gt;売り上げランキング: 665&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00DR0PDNE/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;</summary><category term="diary"></category><category term="gadget"></category><category term="chromecast"></category></entry><entry><title>Sifttter: IFTTTとDay Oneを使ってネット上のアクションを記録する。</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/sifttter/" rel="alternate"></link><published>2014-01-19T20:30:35-06:00</published><updated>2014-01-19T20:30:35-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2014-01-19:blog/posts/sifttter/</id><summary type="html">&lt;p&gt;&lt;a href="https://rn4ru.com/blog/posts/enhance-your-day-one-journals-with-slogger/"&gt;以前&lt;/a&gt;、RSSを含む様々なwebサービスの情報をDay Oneに集約できる&lt;a href="http://brettterpstra.com/projects/slogger/"&gt;Slogger&lt;/a&gt;というコマンドラインスクリプトを紹介しましたが、今回はそれをヒントに作られた&lt;a href="http://craigeley.com/post/72565974459/sifttter-an-ifttt-to-day-one-logger"&gt;Sifttter&lt;/a&gt;というアプリを紹介します。&lt;/p&gt;


&lt;p&gt;&lt;img alt="sifttter=IFTTT+Day One" src="https://rn4ru.com/blog/images/sifttter.png" /&gt;&lt;/p&gt;
&lt;h2&gt;IFTTT&lt;/h2&gt;
&lt;p&gt;S「log」gerに対するS「ifttt」erということですが、&lt;a href="http://ifttt.com"&gt;IFTTT&lt;/a&gt;をすでにご存知の方は多いのではないでしょうか。これはIf This Then That (もしこうするとこうなる)をもじったもので、あるサービスのアクションをトリガーにして他のサービスに対して指定したアクションができるというものです。&lt;/p&gt;
&lt;p&gt;例えば、RSSをトリガーにして更新されたアイテムをTwitterでつぶやくということができます。(1月19日現在)78個ものチャンネル(=サービス)に対応していて、それぞれのチャンネルを掛けあわせてさっきのRSS→Twitterのような「レシピ」を作ります。最近iOSアプリも提供されて、iOSのリマインダーや写真などもトリガーにできたりするので、是非チェックしてみるのをおすすめします。&lt;/p&gt;
&lt;h2&gt;+ Day One?&lt;/h2&gt;
&lt;p&gt;さてSiftterがどのように動くかというと、iftttを使ってアクショントリガーが起こった時にDropboxにそのログを保存するというレシピを作成します。その際フォーマットとして"- 日時 - 記録したい内容 @done改行"となるようにします。例えば次のレシピはTwitterのログを保存しますし、その他にもレシピをsifttterで検索すればいろいろ見つかります。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ifttt.com/view_embed_recipe/138670?" target = "_blank" class="embed_recipe embed_recipe-l_27" id= "embed_recipe-138670"&gt;&lt;img src= 'https://ifttt.com/recipe_embed_img/138670' alt="IFTTT Recipe: Sifttter: Tweets to Dropbox" width="370px"/&gt;&lt;/a&gt;&lt;script async type="text/javascript" src= "//ifttt.com/assets/embed_recipe.js"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;これを設定しておいて、あとは指定した時間にSifttterを起動するだけで、それまでに起きたイベントをファイルごとにまとめて日記のエントリにしてくれます。&lt;a href="http://craigeley.com/post/72565974459/sifttter-an-ifttt-to-day-one-logger"&gt;作者のサイト&lt;/a&gt;ではスクリーンショットも見れます。が、基本的にMarkdownのリスト形式で表示されるのでかなり見やすいです。&lt;/p&gt;
&lt;h2&gt;インストール&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://gist.github.com/craigeley/8301817"&gt;Mavericks対応&lt;/a&gt;、あるいは&lt;a href="https://gist.github.com/craigeley/8322805"&gt;OS X 10.8以前&lt;/a&gt;のスクリプトをダウンロードして適当な場所に置き、28行目付近(Day Oneエントリの保存先)と53行目(IFTTTのログフォルダ)のパスを適宜指定します。その後&lt;code&gt;chmod a+x&lt;/code&gt;で実行権限をつけます。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://itunes.apple.com/us/app/lingon-3/id450201424?mt=12"&gt;Lingon&lt;/a&gt;などを使って指定した時間にプログラムが起動するようにしましょう。アプリを使わなくても&lt;code&gt;~/Library/LaunchAgents/&lt;/code&gt;以下に次のファイルを置けば午後11時55分に起動できます。(再起動か、あるいはlaunchctlによるloadが必要です。)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;!DOCTYPE plist PUBLIC &amp;quot;-//Apple//DTD PLIST 1.0//EN&amp;quot; &amp;quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;plist&lt;/span&gt; &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Label&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;com.craigeley.Sifttter&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;ProgramArguments&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;array&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;ruby&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Path/to/sifttter_1.8.7.rb&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;string&amp;gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;StartCalendarInterval&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Hour&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;integer&amp;gt;&lt;/span&gt;23&lt;span class="nt"&gt;&amp;lt;/integer&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;Minute&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;integer&amp;gt;&lt;/span&gt;55&lt;span class="nt"&gt;&amp;lt;/integer&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/plist&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;Sloggerと比較すると&lt;/h2&gt;
&lt;p&gt;まず第1にあげられるのは、IFTTTを媒介としてる点です。これにより、IFTTTが対応するサービスすべてのログを毎日自動的にDay Oneに取り込むことができます。次にフォーマット変更が容易ということが挙げられます。&lt;/p&gt;
&lt;p&gt;Sloggerのフォーマットを変更するにはrubyで書かれたプラグインやコンフィグファイルを見なければならないので、不慣れな人にはすこしハードルが高いです。一方Siftterは1行フォーマットの最初の日時と最後の@doneこそ正しく動作するために必須ですが、それ以外のフォーマットはIFTTT上から簡単に変更することができます。また、自分で対象フォルダに直接テキストファイルを置くのもいいでしょう。&lt;/p&gt;
&lt;p&gt;とかなんとか言ってきましたが、自分自身はまだSloggerから乗り換えるには至りません。というのも自分の使い方ではSloggerのプラグインだけでも十分だからです。しかし今後のIFTTTのチャンネルの増え方とタイミング次第ではSifttterに乗り換えるかもしれません、&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;今回は以前紹介したSloggerにインスパイアされて作成されたSifttterを紹介しました。SifttterはIFTTTを組み合わせることで無限の可能性を発揮します。みなさんも是非試してみてはいかがでしょうか。&lt;/p&gt;</summary><category term="sifttter"></category><category term="ifttt"></category><category term="slogger"></category><category term="dayone"></category></entry><entry><title>分析モデルとシミュレーション -イントロダクション-</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/analytic-model-simulation-introduction/" rel="alternate"></link><published>2014-01-17T11:24:46-06:00</published><updated>2014-01-17T11:24:46-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2014-01-17:blog/posts/analytic-model-simulation-introduction/</id><summary type="html">&lt;p&gt;今週から春セメスターが始まりました。教授と相談した結果、研究と平行して分析モデルとシミュレーションのクラスを取ることに決めました。&lt;/p&gt;
&lt;p&gt;これまで火木と2回講義がありましたがまだ1週目なのでシラバスと簡単な用語説明だけでした。&lt;/p&gt;


&lt;h2&gt;何を学ぶか&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;コンピュータシステムとネットワークのモデルを評価するための分析とシミュレーションの手法&lt;/li&gt;
&lt;li&gt;確率理論の基礎と確率分布が異なるキューイングシステムの開発&lt;/li&gt;
&lt;li&gt;シミュレーション結果の統計的な評価を含めたDES(Discrete-Event Simulation)およびモンテカルロ法の性質&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;というわけで、確率理論とか統計的とかモンテカルロ法とかちょっと難しそうな用語が沢山ですが、おいおいと学習していくのでしょう。&lt;/p&gt;
&lt;h2&gt;待ち行列&lt;/h2&gt;
&lt;p&gt;キューイングシステムというのはいわゆる待ち行列モデルをつかったシステムです。銀行窓口からネットワークにおけるパケット伝送までさまざまなところで使われています。この待ち行列ですが、λとμという2つのパラメータが使われます。&lt;/p&gt;
&lt;p&gt;&lt;img alt="待ち行列モデル" src="https://rn4ru.com/blog/images/queue.png" /&gt;&lt;/p&gt;
&lt;p&gt;λはあるイベントが到着する分布(といえばいいのか、よくわかりませんがdistributionです)でμがそのサービスにかかる時間の分布です。銀行の窓口で言えば、人がどのように並び始めるかを決めるのがλで、窓口対応にかかる時間がμみたいな感じです。&lt;/p&gt;
&lt;p&gt;教授が言うには、λはpoissonianでμはexponentialであるというのが基本的な仮定なのだそうです。何が何だかちんぷんかんぷんなんですがpoissonianというのはポアソン分布に沿ったもの。そしてexponentialというのは指数分布に沿ったものというのが調べてわかりました。&lt;/p&gt;
&lt;p&gt;日本語でもわからん。うーん先行き不安になってきた。&lt;/p&gt;
&lt;p&gt;とにかくとにかく、セメスターの最初は確率理論の公式やらなんやらを基礎からやってくれるということなのでそこできっちり理解することを目標にしようと思います。で、残りの半分でシステムの分析と評価という応用をやっていくとのことです。&lt;/p&gt;
&lt;h2&gt;シミュレーションとその評価&lt;/h2&gt;
&lt;p&gt;システムをシミュレーションを使って評価する際にとても重要である項目を教授は何度も強調していました。それは、&lt;/p&gt;
&lt;h2&gt;モデル作成&lt;/h2&gt;
&lt;p&gt;まずは評価対象のシステムをモデリングしなければなりません。前述のパラメータをどのようにして調べるか。そのパラメータに見合うイベント群を生成することができるか。この前提が間違っているといくらシミュレーションしても正しい結果がでません。&lt;/p&gt;
&lt;h2&gt;試行回数&lt;/h2&gt;
&lt;p&gt;たった1回シミュレートしただけではもちろん不十分ですが、何度もやったところで例えば生成されるイベントの出現頻度、タイミングが全く同じならば同じ結果しかでないことになるので、やはりこれも適切ではありません。パラメータの範囲に収まってかつランダム性があるようにイベントを調整しなければなりません。&lt;/p&gt;
&lt;h2&gt;評価手法&lt;/h2&gt;
&lt;p&gt;きちんとランダムな環境で何十回、何百回とシミュレーションを繰り返したとしましょう。その結果をどのように評価するのかが最も重要です。先ほどの銀行の例でお客さんの平均待ち時間が10分になるというシミュレーション結果がでたとします。この結果はどれくらい正確で、どれほど信頼性があるのか、というのが問題です。&lt;/p&gt;
&lt;p&gt;平均はあくまで平均です。15分待つお客さんと5分待つお客さんが半分ずついても平均は10分になります。しかしこれで平均10分待つはずだと言われても困ります。正確さと信頼性はConfidence interval(信頼区間)とConfidence level(信頼水準)で測られます。&lt;/p&gt;
&lt;p&gt;信頼区間というのはその平均がプラスマイナスどの程度に収まるかという範囲です。そして信頼水準というのはその信頼区間に実際の結果が収まる確率を示します。通常90%から95%を目標にします。&lt;/p&gt;
&lt;p&gt;95%の確率で10±1分の待ち時間になるシステムと、10±5分の待ち時間になるシステムとでは当然前者のほうが信頼性が高いことになります。このようなシステムをうまくシミュレートすることができるでしょうか。&lt;/p&gt;
&lt;h2&gt;どう表現するか&lt;/h2&gt;
&lt;p&gt;教授は続けます。「たとえ有名なジャーナルに掲載されるような品質の論文でも、そこに示されてるグラフが正しく表記されていないものがある。しばしば執筆者やレビュアーもどのようにグラフを評価するのかわかっていないのが問題だ」&lt;/p&gt;
&lt;p&gt;&lt;img alt="上限と下限" src="https://rn4ru.com/blog/images/upper-lower-bound.png" /&gt;&lt;/p&gt;
&lt;p&gt;これまでの流れからわかるように、ただ平均をプロットしただけのグラフはその結果がどれほど正しいのか、信頼性があるのかを読み取るのが不可能です。時間に経つにつれてお客さんの待ち時間が増加する場合でも、その上限(upper-bound)と下限(lower-bound)がどの程度にどのような確率で収まるのかを示すことが重要です。&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;今回は分析モデルとシミュレーションについてのイントロダクションをまとめました。&lt;/p&gt;
&lt;p&gt;確率、統計、モデリング、シミュレーションとこれまで深く入り込んでこなかった分野に手を出してみるわけですが、今のところ結構面白そうだという感覚です。基本プログラミングが好きなので前半しっかりと基礎を学習して、後半のシステムモデル構築、シミュレーションのところをきっちりやり遂げたいと思います。&lt;/p&gt;</summary><category term="lecture-note"></category><category term="model"></category><category term="simulation"></category></entry><entry><title>Macbook Pro 15 inch Mid 2010がGPU Panicでほぼ全パーツ交換になった話</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/mbp-15-inch-mid-2010-gpu-panic-repair/" rel="alternate"></link><published>2014-01-14T06:36:23-06:00</published><updated>2014-01-14T06:36:23-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2014-01-14:blog/posts/mbp-15-inch-mid-2010-gpu-panic-repair/</id><summary type="html">&lt;p&gt;注) 結果的に無料で保証対象外のパーツも交換になりましたが、アップルストアや機種の状態によって対応が異なる場合がありますので予めご了承ください。&lt;/p&gt;
&lt;h2&gt;前兆&lt;/h2&gt;


&lt;p&gt;昨年の11月ごろから3年前に購入したMBPが頻繁にクラッシュ(灰色の画面になって強制再起動)するようになりました。
Consoleでクラッシュの原因を確認してみると「GPU Panic」と表示されているので最初は熱暴走かなと思っていました。
ところがそれほど本体が暖まっていないときにもクラッシュすることがあったので、これは何か他に原因があるのかもと考え検索してみました。&lt;/p&gt;
&lt;p&gt;すると、各種フォーラムでも同様の事例/質問があるのを見つけます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://forums.macrumors.com/showthread.php?t=1538800"&gt;2010 15" Macbook Pro GPU Kernel Panics - MacRumors Forums&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://forums.macrumors.com/showthread.php?t=1677807"&gt;2010 MacBook Pro GPU Crashing - MacRumors Forums&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://discussions.apple.com/thread/5084754?start=30&amp;amp;tstart=0"&gt;Kernel Panic GPU-related after 10.8.4...: Apple Support Communities&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;読み進めてみると、どうやらApple公式でも説明されてるとのこと。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://support.apple.com/kb/ts4088"&gt;MacBook Pro (15-inch, Mid 2010): Intermittent black screen or loss of video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ちょっと引用してみます。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Apple has determined that a small number of MacBook Pro (15-inch, Mid 2010) computers may intermittently freeze or stop displaying video on the built-in display or on an external display connected to the MacBook Pro. In this situation, you may also see a restart warning message before the video is lost or the display turns black or gray.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;要するに少数のMBP 15 inch mid 2010においてディスプレイが表示されなくなったり、フリーズしたりして、再起動が必要になるとのことです。&lt;/p&gt;
&lt;p&gt;対処法としては最寄りでアップルのサービスを受けてくれということらしいです。さらにこんなことも併記されています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Apple will service affected 15-inch MacBook Pro computers free of charge until three years from date of purchase. This worldwide Apple program does not extend the standard warranty coverage of the affected MacBook Pro.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;どうやら購入後3年以内なら保証範囲内だと。自分はアップルケアに入ってなかったのですがそれでも大丈夫でした。ただ、フォーラムでの後日談によると、購入後3年以上経っていたので修理費を請求された人もいるようです。&lt;/p&gt;
&lt;h2&gt;というわけでアップルストアに持っていく&lt;/h2&gt;
&lt;p&gt;&lt;a title="Chicago's Apple store - I bought my sister Simone an iPod." href="http://flickr.com/photos/terboven/5812113976/"&gt;&lt;img src="http://farm4.staticflickr.com/3244/5812113976_c109117fd2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;small&gt;&lt;a title="Chicago's Apple store - I bought my sister Simone an iPod." href="http://flickr.com/photos/terboven/5812113976/"&gt;cc licensed ( BY )  flickr photo&lt;/a&gt; shared by &lt;a href="http://flickr.com/people/terboven/"&gt;Christian Terboven&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;早速ジーニアスバー(要予約)に持って行ってみると簡単なテストを走らせた段階でGPUのエラーが見つかりました。対応してくれたお兄さんもこうなると話が早い、みたいな感じで「無償で交換できるよ、1週間くらいかかるかな」とのこと。&lt;/p&gt;
&lt;p&gt;原因が判明したことで多少ホッとしましたが、その時は学校もあったので1週間MBP無しは厳しいなあと思い、セメスターが終わったら持ってきますということに。ついでにバッテリーがかなりヘタってるとも言われ、こっちは交換に100ドルかかると。&lt;/p&gt;
&lt;p&gt;15インチでも全然モバイル用途として使っているので、バッテリーの持ちがやばいのも気づいていたのものあって、100ドルだったらいいかなと思ったもののそれも含めてまた今度持ってくるとしてその時は終わりました。&lt;/p&gt;
&lt;p&gt;余談ですが、その後クラッシュするときは必ずミッションコントロールを表示するとき(3本指でスワイプアップ)だということに気づいたので、ミッションコントロールの機能、ショートカットを封印して1ヶ月ほど過ごしました。そのためCommand+TabとDockの使用頻度があがり、直って返ってきたいまでもそのくせが抜けません。ミッションコントロール便利ですけどね。&lt;/p&gt;
&lt;h2&gt;ついに交換へ、そしてサプライズ&lt;/h2&gt;
&lt;p&gt;セメスター終了後、2回めのジーニアスバー訪問へ。前回のメモが残っていたので交換手続きもスムーズにできました。その時はバッテリーのことは言われなかったのでこっちから聞いてみると、電源容量が80パーセントを切っていたなら交換したほうがいいのだけど、今の時点では81パーセントだと言います。そんなに切迫してるわけでもないのでなければないでいいかなと。その時もらった明細にはロジックボードの交換修理、ということだけ書かれていました。&lt;/p&gt;
&lt;p&gt;受け取りはきっちり一週間後でした。携帯に連絡があったのですぐに行きますと伝え、ジーニアスバーのチェックインで身分証明書を見せてスタッフに現物を持ってきてもらいました(予約は不要)。受け取りの確認時に、スタッフが明細と共に「ほぼ全部取り替えてるね」と言っていたのですが、まさかそんなはずはないだろうと思っていたのと、早く家に帰りたかったことから特に確認もせずに流しておきました。だってバッテリー交換したなら100ドルはかかると言われていたのに、お金払えなんて一言も言われなかったし。&lt;/p&gt;
&lt;p&gt;さて、家についてから実物をじっくり見てみたところで驚きました。そりゃ3年も持ち歩いていれば外装に擦り傷がたくさんついています。でもそれらが綺麗さっぱりなくなっていたのです。「ほぼ全部取り替えてるね」という言葉がフラッシュバックします。改めて受領書を確認してみるとそこに交換したリストとして表記してあったのは、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Logic Board 2.4 GHz&lt;/li&gt;
&lt;li&gt;Battery Li-Ion 77.5 Whr&lt;/li&gt;
&lt;li&gt;Bottom Case&lt;/li&gt;
&lt;li&gt;Top Case w/Keyboard&lt;/li&gt;
&lt;li&gt;MagSafe Board&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なんということでしょう。交換対象だったロジックボード以外に、バッテリーから底面からキーボードまで、まさに「ほぼ全部」交換されていたのです。何度も記載を確認しましたがやはり作業費等の請求は一切ありませんでした、&lt;/p&gt;
&lt;p&gt;一番うれしかったのはやはりバッテリーが交換されていたことですね。これでまだモバイルでも戦えます。加えて、ありがたくこれからも大事に使おうと心に決めました。あと3年は使い続けようと思います。(でも本当はMacbook Airが欲しい…)&lt;/p&gt;
&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00DCMAHSS/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/21sLRgAX%2B7L._SL160_.jpg" alt="APPLE MacBook Air 1.3GHz Dual Core i5/11.6"/4GB/128GB MD711J/A" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00DCMAHSS/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;APPLE MacBook Air 1.3GHz Dual Core i5/11.6"/4GB/128GB MD711J/A&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 14.01.15&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;アップル (2013-06-11)&lt;br /&gt;売り上げランキング: 921&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00DCMAHSS/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;今回は公式に発表されていた不具合だったこともあり、アップルケアがなくとも3年の保証期間内なら無料で対応してもらうことができました。しかも返ってきた本体は不具合対象のパーツ以外も交換されていました。領収書を見る限りでは、出荷時にハードウェアテストを実行して問題ないことを確認しているようです。意外だったのはアップルストアではぎりぎりセーフだったバッテリーがテストに失敗していたことです。工場へ輸送されている間に容量80パーセントを下回ったのでしょうか。&lt;/p&gt;
&lt;p&gt;ということは、かなり限定された状況ではありますが、ジーニアスバーでオーダーしなかった故障対応でも直って返ってくる可能性があるということです。例えいくつか不具合があったとしてもあえて全部修理を頼まないという手も考えられますね。とはいえ冒頭にも書きましたがすべての状況にこれが当てはまるとは限りません。実際にやってみようという方は自己責任でお願いします。&lt;/p&gt;</summary><category term="mac"></category><category term="Chicago"></category></entry><entry><title>シカゴの冬は雨の日も危険/キーボードカバーが届いた。</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/chicago-winters-rain/" rel="alternate"></link><published>2014-01-11T00:23:36-06:00</published><updated>2014-01-11T00:23:36-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2014-01-11:blog/posts/chicago-winters-rain/</id><summary type="html">&lt;p&gt;ここ最近は氷点下の日々が続いてましたが、今日は久しぶりに暖かく外にでても耳が真っ赤にならなくてすみました。リスが駆けまわっているのを見たり、雨も降ってきたりして、色んな所で気温の高さを感じられる日でした。&lt;/p&gt;
&lt;p&gt;午後過ぎから降り始めた雨は、夕方に大学から帰ってくるときもまだパラパラと降っていたのですが、わずか10分足らずの帰り道がひどいことになっていました。&lt;/p&gt;


&lt;p&gt;歩道って水はけを良くするために傾斜がついてると思うんですが、その傾斜の先がここ3、4日ほどで積もった雪にせき止められていて、行き場を失った水がそこかしこに水たまりを作ってる状態。特に道路と歩道の境界では足首まで浸かるほど深く、しかも一見積雪のせいで渡れそうなところがズボっといったりするので足場を踏み固めたりジャンプしたりして帰ってきました。&lt;/p&gt;
&lt;p&gt;さらに多少雨が降ったくらいではしっかり踏み固められてアイスバーン状態になった歩道の雪が溶けるはずもなく、それどころか余計に滑りやすくなっているということで足元を何度もとられて転びそうになったり大変でした。雪は嫌いじゃないけど、ほどほどにしてもらえないかな。&lt;/p&gt;
&lt;h2&gt;Ultra Thin Keyboard Protector&lt;/h2&gt;
&lt;p&gt;&lt;a title="Silicone Keyboard Protector 11-25-09 4" href="http://flickr.com/photos/stevendepolo/4144279418/"&gt;&lt;img src="http://farm3.staticflickr.com/2740/4144279418_73a525f0cd.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;small&gt;&lt;a title="Silicone Keyboard Protector 11-25-09 4" href="http://flickr.com/photos/stevendepolo/4144279418/"&gt;cc licensed ( BY )  flickr photo&lt;/a&gt; shared by &lt;a href="http://flickr.com/people/stevendepolo/"&gt;Steven Depolo&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;そういえば学校に出かける直前に、アマゾンで注文していたキーボードカバーが届いたので早速MBPにセットしました。このMBPも3年前に買ったものですが、これまでは多少の傷はしょうがないと考えてカバーとかはしていませんでした。それがひょんなことから外装リニューアルされて返ってきたのですが(この顛末もあとで書くかもしれません)、ほぼ新品同様のボディを見て「せめてキーボードくらいはもう汚したくない」と思ってしまったのでした。&lt;/p&gt;
&lt;p&gt;いや、そこまで汚れてたわけじゃないですよ？ジュースをこぼすとかそういうことは全くなかったですし。でも明細に交換理由としてSticky keysと書いてあったのでおそらくどこかに動作がスムーズでないところがあったのでしょう。&lt;/p&gt;
&lt;p&gt;キーボードカバーを買うときはキー配列をきちんと確かめないと微妙にフィットしないことがあるので気をつけてくださいね。このMBPはキーボードの右上がCD取り出しキーですが、最新のやつはそれが電源キーになっていたはずです。&lt;/p&gt;
&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B009ANB67Y/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/5145z72kFBL._SL160_.jpg" alt="moshi clearguard (JIS)(2012model) [MacBook Pro等対応 日本語キーボードカバー]" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B009ANB67Y/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;moshi clearguard (JIS)(2012model) [MacBook Pro等対応 日本語キーボードカバー]&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 14.01.11&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;moshi &lt;br /&gt;売り上げランキング: 1,920&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B009ANB67Y/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;</summary><category term="diary"></category><category term="mac"></category></entry><entry><title>新年一発目。槍を買う</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/the-first-post-of-2014/" rel="alternate"></link><published>2014-01-08T18:20:00-06:00</published><updated>2014-01-08T18:20:00-06:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2014-01-08:blog/posts/the-first-post-of-2014/</id><summary type="html">&lt;p&gt;2014年も早いものですでに一週間が過ぎてしまいましたが、改めて新年明けましておめでとうございます。今年もよろしくお願いします。&lt;/p&gt;
&lt;p&gt;シカゴに来てから4回目の冬を迎えたわけですが、この冬が今のところ一番厳しい気がします。次点は2011年の2月くらいの大寒波かな。寒さに負けず頑張ります。&lt;/p&gt;


&lt;h2&gt;昨年&lt;/h2&gt;
&lt;p&gt;非常に変化の多い年でした、まず修士課程を5月に卒業してそのまま8月の後半から博士課程に入学しました。その間に学校の近くに引っ越してきましたが、この選択は大正解でした。&lt;/p&gt;
&lt;p&gt;前のアパートみたいにダウンタウンの中心までフラッと歩いていくなんてことはできず、周りには遊ぶところもありません(治安もあんまりよろしくない)。だけどその分より勉学に集中できていると感じるし、実際結果も出てきていますしね。今年は勝負の年でもあるので、この調子をキープしたいです。&lt;/p&gt;
&lt;p&gt;&lt;a title="Broccoli" href="http://flickr.com/photos/sk8geek/5478500913/"&gt;&lt;img src="http://farm6.staticflickr.com/5055/5478500913_a364fe642e.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;small&gt;&lt;a title="Broccoli" href="http://flickr.com/photos/sk8geek/5478500913/"&gt;cc licensed ( BY SA )  flickr photo&lt;/a&gt; shared by &lt;a href="http://flickr.com/people/sk8geek/"&gt;Steven Lilley&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;h2&gt;近況&lt;/h2&gt;
&lt;p&gt;みなさんはブロッコリーときいてどんなイメージが浮かびますか？おそらくほとんどの方は上の画像にあるような一房高さ3cmくらいのものを思い浮かべたと思います。&lt;/p&gt;
&lt;p&gt;自分がこの前パッケージをよく見ないで買った冷凍ブロッコリーを温野菜で食べようと出してみたところ、出てくるブロッコリーが揃いも揃って茎の長さが10cmくらいありました。パッケージには「spears」と書いてありました。日本語で言えば「槍」。なんかカッコいいですね。&lt;/p&gt;
&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B007653YOQ/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/61zuSH0u2ZL._SL160_.jpg" alt="ニチレイ　そのまま使えるブロッコリー　冷凍　５００ｇ　 冷凍" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B007653YOQ/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;ニチレイ　そのまま使えるブロッコリー　冷凍　５００ｇ　 冷凍&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 14.01.09&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;ニチレイフーズ &lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B007653YOQ/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;</summary><category term="diary"></category></entry><entry><title>80/20ルールを試してみる</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/80-20-rules-lets-try/" rel="alternate"></link><published>2013-10-29T22:46:00-05:00</published><updated>2013-10-29T22:46:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-10-29:blog/posts/80-20-rules-lets-try/</id><summary type="html">&lt;p&gt;80/20ルールというのを聞いたことはありますか？アウトプットの80%はインプットの20%から産出されるというアレです。&lt;/p&gt;


&lt;p&gt;もともとは庭に植えた豆の収穫量からヒントを得たものらしいのですが、それに限らず、色々な場面で80/20ルールに対応するような統計があるみたいです。&lt;/p&gt;
&lt;p&gt;まあ詳しいことは「パレートの法則」でググってもらうとして、ブログを巡回していたらこの法則をもっと積極的に生活のなかに活かそうじゃないかという主旨の記事がありました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://inspirationfeed.com/articles/self-development/how-to-add-the-8020-rule-to-your-life/"&gt;How to Add the 80/20 Rule to Your Life | inspirationfeed.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例えば、8割のアウトプットを生み出す2割に集中する。ストレスの8割の原因となる2割の問題を解決する。などなどです。まあ出来る人は自然にこういうことができているのでしょうが、自分なんかにとってはなかなかその感覚がつかめなかったりします。&lt;/p&gt;
&lt;p&gt;よくあるのが80%の出来のものを100%にしようとして時間をかけすぎてしまい、そのしわ寄せがまだやってないタスクにきてしまうようなことです。もちろんまったくアウトプットに関係ないことに没頭(現実逃避ともいう)してしまうことも多いのですが。&lt;/p&gt;
&lt;p&gt;一つ疑問なのが、例えば2割のことに集中してその日のアウトプットの8割を終わらせたとします。その余った時間をさらにもう一つの8割を生み出す2割に使うと最初の8割は相対的に8割以下になるじゃん！(逆にいわゆるアキレスと亀状態になることも)という。まあ1日のアウトプットの定義そのものが時間とともに変化するのならば矛盾はないんですかね。というか厳密な定義とかどうでもいいですね。&lt;/p&gt;
&lt;p&gt;というわけで、まずは1つのタスクにかかる時間を計測するところから始めてみようかなと思ってます。理論的にはいままで1時間かかってた作業の8割が15分以内にできるということなので、これが本当ならば凄いですよね。&lt;/p&gt;
&lt;p&gt;というかというか、このブログを書くということ自体がそもそもアウトプットの8割に属するような生産的な行動になっているのかどうかすでに疑問ですが、そこは気分転換ということで。&lt;/p&gt;</summary><category term="productivity"></category><category term="mindset"></category></entry><entry><title>ナヴラトリ</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/Navratri/" rel="alternate"></link><published>2013-10-14T20:58:00-05:00</published><updated>2013-10-14T20:58:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-10-14:blog/posts/Navratri/</id><summary type="html">&lt;p&gt;インドのお祭りのお祝いにお菓子の差し入れもらいました。&lt;/p&gt;


&lt;p&gt;うちのグループでは教授のスケジュールに合わせて月水金と個人およびグループミーティングを組んでいるのですが、今日ミーティングに行ったらインド人のメンバーがお菓子を差し入れしてくれました。&lt;/p&gt;
&lt;p&gt;なんでもインドでは9日間にわたるお祭りが終わったばかりで、その間よく食べられるものだそうです。ググったらそれっぽいものが見つかりましたが、おそらく&lt;a href="http://www.sailusfood.com/2011/09/28/navratri-recipe-special-sweet-pongal/"&gt;これ&lt;/a&gt;。米粉とバターなんかを色々混ぜて焼いたものということで、なんとも言えない食感だったのですが美味しかったです。不思議と懐かしさも感じたんだけどなんでだろう。&lt;/p&gt;
&lt;p&gt;そのお祭り(&lt;a href="http://ja.wikipedia.org/wiki/%E3%83%8A%E3%83%B4%E3%83%A9%E3%83%88%E3%83%AA"&gt;ナヴラトリ&lt;/a&gt;というらしい)ですが、学問の神様も崇めるためか、その間は勉強を一切しないのだとか。断食の勉学バージョン？みたいな。インドはその間休みだからいいとして、海外留学してるインド人学生は母国が懐かしくなるだろうなあ、と思ったのでした。&lt;/p&gt;</summary><category term="diary"></category></entry><entry><title>Pelian3のfeedで特定のカテゴリを除外したかったのでplugin書いたよ</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/pelican-feed-plugin-excluding-some-category/" rel="alternate"></link><published>2013-10-12T20:49:00-05:00</published><updated>2013-10-12T20:49:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-10-12:blog/posts/pelican-feed-plugin-excluding-some-category/</id><summary type="html">&lt;p&gt;この前wiki作ったまではよかったんですが、wiki記事への更新が全てRSSに流れてしまうのはよろしくないので、特定のカテゴリを除外したフィードを作成するプラグインを作ってみました。&lt;/p&gt;


&lt;p&gt;とりあえずプラグインの作り方の基本は&lt;a href="http://docs.getpelican.com/en/3.3.0/plugins.html"&gt;こちら&lt;/a&gt;を見てもらうとして、問題はPelicanがどうやってRSSフィードを作ってるかです。&lt;/p&gt;
&lt;p&gt;ソースを読んでみると、&lt;a href="https://github.com/getpelican/pelican/blob/master/pelican/generators.py"&gt;pelican/generators.py&lt;/a&gt;の&lt;code&gt;ArticlesGenerator&lt;/code&gt;の中で&lt;code&gt;generate_feeds()&lt;/code&gt;というのが呼ばれているので、プラグインでこれを真似してやればいいんじゃないかなと思いました。&lt;/p&gt;
&lt;p&gt;という訳で以下がそのソースです。Python初心者なので変なことしてるかもしれません。&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pelican&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;signals&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pelican.generators&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Generator&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;defaultdict&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;operator&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;attrgetter&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_generators&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;generators&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MyFeedGenerator&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_generators&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_generators&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyFeedGenerator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Generator&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Generate atom/rss feed except wiki articles&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyFeedGenerator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_feeds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Generate the feeds from the current context, and output files.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;FEED_ALL_ATOM&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;FEED_ALL_RSS&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
            &lt;span class="n"&gt;all_articles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;articles&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;article&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;articles&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
                &lt;span class="n"&gt;all_articles&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;translations&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;all_articles&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;attrgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;date&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="n"&gt;all_articles_but_wiki&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;all_articles&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;wiki&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;FEED_ALL_ATOM&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write_feed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all_articles_but_wiki&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                  &lt;span class="s1"&gt;&amp;#39;path/to/feed&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;generate_feeds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;&lt;code&gt;MyArticlesGenerator&lt;/code&gt;は&lt;code&gt;generate_feeds&lt;/code&gt;内で指定したカテゴリ(ここでは'wiki')を除外した記事リストをwriterの&lt;code&gt;write_feed&lt;/code&gt;に渡してます。その&lt;code&gt;generate_feeds&lt;/code&gt;は&lt;code&gt;generate_output&lt;/code&gt;から呼ばれていて、&lt;code&gt;generate_output&lt;/code&gt;自体はPelican本体から呼ばれています。&lt;/p&gt;
&lt;p&gt;プラグインの登録は&lt;code&gt;signal.get_generators.connect()&lt;/code&gt;に&lt;code&gt;MyArticlesGenerator&lt;/code&gt;を返す関数をセットしてあげればいいみたいです。&lt;/p&gt;</summary><category term="pelican"></category><category term="plugin"></category><category term="rss"></category></entry><entry><title>急がばまわれ</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/walk-dont-run/" rel="alternate"></link><published>2013-10-11T19:44:00-05:00</published><updated>2013-10-11T19:44:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-10-11:blog/posts/walk-dont-run/</id><summary type="html">&lt;p&gt;今日目にした単語「Oxymoron」&lt;/p&gt;


&lt;p&gt;意味：一見相反する2つの単語を並べること。語源自体がギリシャ語でoxus 'sharp'とmoros 'foolish'という単語の組み合わせより。&lt;/p&gt;
&lt;p&gt;例えば「小さな巨人」、「稀によくある」など。&lt;/p&gt;</summary><category term="english"></category></entry><entry><title>リニューアル</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/site-renewal/" rel="alternate"></link><published>2013-10-09T00:14:00-05:00</published><updated>2013-10-09T00:14:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-10-09:blog/posts/site-renewal/</id><summary type="html">&lt;p&gt;サイトのデザインを変更して、Wikiのページを作りました。&lt;/p&gt;


&lt;p&gt;いやー、早いもので今週は秋学期の中間テストウィークなんですが、テスト前になると他のことがしたくなるってあるあるにどっぷりハマってしまいました。&lt;/p&gt;
&lt;p&gt;まずはサイトのデザインを変えました。といっても、Pelican用のテーマを当てただけですが。レスポンシブがいいなあと前々から思っていたので、&lt;a href="https://github.com/getpelican/pelican-themes/tree/master/pelican-bootstrap3"&gt;twitter bootstrap&lt;/a&gt;互換にしました。CSSはreadableとかいうやつを使っています。&lt;/p&gt;
&lt;p&gt;気付いた人もいるかと思いますが、日本語タイトルです。この記事。前回のはアルファベットしか使いたくなくなるようなフォントだったんですけど、このreadableのおかげか、日本語フォントも違和感無いようになっています。&lt;/p&gt;
&lt;p&gt;それから前から欲しかった&lt;a href="http://rn4ru.com/blog/wiki"&gt;Wiki&lt;/a&gt;のページを作りました。こちらは時系列だとちょっと取り扱いが微妙なものをストックしていきます。ブログって何かと書きっぱなしになってしまうのですが、それはそれでいいとして、講義ノートや研究ノートなんかは後から追記して校正しての繰り返しなのでちょっと独立させてみました。&lt;/p&gt;
&lt;p&gt;書かれている内容は大多数の方にはちんぷんかんぷんだと思いますが、まれに誰かの役にたつかもしれません。&lt;/p&gt;
&lt;p&gt;それではテスト勉強に戻ります。&lt;/p&gt;</summary><category term="update"></category></entry><entry><title>Room Condition Form</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/room-condition-form/" rel="alternate"></link><published>2013-09-09T20:44:00-05:00</published><updated>2013-09-09T20:44:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-09-09:blog/posts/room-condition-form/</id><summary type="html">&lt;p&gt;いつの間にか記録上大学の敷地内にある大学院生用アパートに住んでることになっていた。&lt;/p&gt;


&lt;p&gt;今日の午後に大学のハウジング担当者から受け取ったメール、「あなたが住んでる大学院生用アパートのRoom Condition Formが未提出だから遅延手数料として50ドルかかるよ。あ、いまからそのフォームを提出したところで手数料が取り消されることはないのであしからず」&lt;/p&gt;
&lt;p&gt;はい？&lt;/p&gt;
&lt;p&gt;Room Condition Formというのはアパートなどに入居した時にどこか壊れている所や不具合がないか確認して、退去するときに同じように照らし合わせるための書類なんだけど、そもそも自分大学院生用のアパート(大学敷地内にある)に住んでないし！徒歩10分のところのアパートなんですけど！&lt;/p&gt;
&lt;p&gt;と、確認のために大学ネットワーク内ポータルから自分の住所情報参照してみたら今住んでるところとそのアパートの住所両方載ってるし。誰が入力したんだ、まさかなりすましか？家賃はどうなってるんだ？などと多少混乱しながら直接担当部署に出向いてみました。&lt;/p&gt;
&lt;p&gt;そこでわかったのは5月に専用フォームから申し込み手続きを開始した記録がある。その申し込みは完了していないが、システムの記録上の不具合か何かで院生用アパートが割り当てられている、とのこと。&lt;/p&gt;
&lt;p&gt;確かに5月頭ごろは引っ越し先を探していたときだったから、大学のハウジング情報も参考程度に見た気がするけど、夏学期のために借りるのは締め切りすぎてたんだよな。それがそのまま引き継がれているとは思いもよらなんだ。&lt;/p&gt;
&lt;p&gt;結局手数料はキャンセルされたし、家賃なんかももちろん発生してなかったから特に不満もないのだけど気になった所が一つ。「ところでその部屋はワンルームなの？」「いや、2Kでルームメイトがいる」「じゃあそのルームメイトからしてみたら同居人いつ来るんだって思ってるんじゃね？」「あ。」&lt;/p&gt;
&lt;p&gt;まあ羽伸ばしてそうだけど。でも2Kで一人も色々持て余すかもしれないなあ。&lt;/p&gt;</summary><category term="diary"></category></entry><entry><title>Cards Against Humanity</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/cards-against-humanity/" rel="alternate"></link><published>2013-09-05T22:47:00-05:00</published><updated>2013-09-05T22:47:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-09-05:blog/posts/cards-against-humanity/</id><summary type="html">&lt;p&gt;大喜利カードゲーム、Cards Against Humanityについて。&lt;/p&gt;


&lt;p&gt;ソフトウェアエンジニアリングクラスのグループプロジェクトでなにかゲーム的なものを開発しようと企画しているのだけど、なんかないかなーと探してたら見つけたゲーム。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B004S8F7QM/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img alt="card against humanity" src="https://rn4ru.com/blog/images/cah.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://cardsagainsthumanity.com/"&gt;Cards Against Humanity&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;黒いカードにはお題や虫食いの文章が書かれていて、出題者がその1枚を読み上げる。参加者はそのお題に当てはまるキーワードを手札の白いカードから選ぶというもの。それでもっとも面白い解答をした人がお題カードをゲットすることができ、その合計枚数を競うという、まあ平たく言えば大喜利のカードバトルみたいな感じ。&lt;/p&gt;
&lt;p&gt;こういうのはネイティブスピーカーだからわかるみたいなとこもあるんだろうし、企画としては却下なんだけど、発想に縛られないはずの大喜利の答えをあえて手札というもので縛ろうとするのは面白いところ。でもカード作るのにもセンスいるよね。Webで&lt;a href="http://s3.amazonaws.com/cah/CAH_MainGame.pdf"&gt;あげられてる&lt;/a&gt;サンプルにはかなりエグいのもあるなあ。&lt;/p&gt;
&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B001NPE1V0/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/51jaczEOZdL._SL160_.jpg" alt="大喜利トランプ" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B001NPE1V0/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;大喜利トランプ&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 13.09.06&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;ピーアンドエー &lt;br /&gt;売り上げランキング: 57,073&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B001NPE1V0/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;</summary><category term="diary"></category><category term="game"></category></entry><entry><title>With respect to, or wrt</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/with-respect-to-or-wrt/" rel="alternate"></link><published>2013-09-04T19:45:00-05:00</published><updated>2013-09-04T19:45:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-09-04:blog/posts/with-respect-to-or-wrt/</id><summary type="html">&lt;p&gt;今日覚えた短縮語。&lt;/p&gt;


&lt;p&gt;w.r.t: with respect to/with regard to&lt;/p&gt;
&lt;p&gt;&lt;a href="http://en.wiktionary.org/wiki/WRT#English"&gt;WRT - Wiktionary&lt;/a&gt;&lt;/p&gt;</summary><category term="english"></category></entry><entry><title>Chmod 600 authorized_keys to password free ssh connection</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/chmod-600-authorized_keys-to-password-free-ssh-connection/" rel="alternate"></link><published>2013-09-03T16:49:00-05:00</published><updated>2013-09-03T16:49:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-09-03:blog/posts/chmod-600-authorized_keys-to-password-free-ssh-connection/</id><summary type="html">&lt;p&gt;パスワード入力なしで、サーバにsshでつなぐにはauthorized_keysを600にする必要がある。&lt;/p&gt;


&lt;p&gt;パーミッションを600にしないまま、「できんなあ」と思ってたのでメモ。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/end0tknr/20081213/1229168575"&gt;パスワードなしssh loginに使用するauthorized_keysは、権限を600に - end0tknrのkipple - web写経開発&lt;/a&gt;&lt;/p&gt;</summary><category term="ssh"></category></entry><entry><title>Labor day travel: Anderson Japanese Gardens</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/labor-day-travel-anderson-japanese-gardens/" rel="alternate"></link><published>2013-09-02T21:11:00-05:00</published><updated>2013-09-02T21:11:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-09-02:blog/posts/labor-day-travel-anderson-japanese-gardens/</id><summary type="html">&lt;p&gt;今日はLabor day (勤労感謝の日)で休日だったのでシカゴ郊外にある日本庭園に行ってきました。&lt;/p&gt;


&lt;p&gt;友人に誘われてシカゴから北西へ1時間半のところにある&lt;a href="http://andersongardens.org/"&gt;Anderson Japanese Gardens&lt;/a&gt;に行くことに。日本庭園が近くにあるなんて初耳で実際あんまり期待してなかったのですが、すごくよかったです。&lt;/p&gt;
&lt;p&gt;以下撮ってきた写真を適当に。ここに載せきれなかったものは&lt;a href="http://www.flickr.com/photos/rn4ru/"&gt;Flickr&lt;/a&gt;にアップロードしました。&lt;/p&gt;
&lt;p&gt;&lt;img alt="koi" src="https://rn4ru.com/blog/images/koi.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;餌を投げられて荒ぶる鯉たち。&lt;/p&gt;
&lt;p&gt;&lt;img alt="waterfall" src="https://rn4ru.com/blog/images/waterfall.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;こういう小さな滝に風情を感じますね。アメリカとは思えない。&lt;/p&gt;
&lt;p&gt;&lt;img alt="guesthouse" src="https://rn4ru.com/blog/images/guesthouse.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;民家「安堵荘」の縁側。&lt;/p&gt;
&lt;p&gt;&lt;img alt="chashitu" src="https://rn4ru.com/blog/images/chashitu.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;茶室なんかもありました。侘び寂びの世界ですね。掛け軸には「日々是好日」と書いてあります。&lt;/p&gt;
&lt;p&gt;&lt;img alt="waterfall2" src="https://rn4ru.com/blog/images/waterfall2.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;これがメインの滝。紅葉の赤がいい感じに彩りを加えてました。&lt;/p&gt;
&lt;p&gt;&lt;img alt="angels" src="https://rn4ru.com/blog/images/angels.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;最後の方になって突然天使のモニュメントが出てきても許せてしまいます。&lt;/p&gt;
&lt;p&gt;&lt;img alt="santouka" src="https://rn4ru.com/blog/images/santouka.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;帰りに日系スーパーマーケットに寄り道して、ラーメン食べました。うまかった。&lt;/p&gt;
&lt;p&gt;最後に何度でもリピートできる映像を。&lt;/p&gt;
&lt;p&gt;&lt;object type="application/x-shockwave-flash" width="400" height="225" data="http://www.flickr.com/apps/video/stewart.swf?v=109786" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"&gt; &lt;param name="flashvars" value="intl_lang=en-us&amp;photo_secret=9f467a8d7e&amp;photo_id=9661111674&amp;hd_default=false"&gt;&lt;/param&gt; &lt;param name="movie" value="http://www.flickr.com/apps/video/stewart.swf?v=109786"&gt;&lt;/param&gt; &lt;param name="bgcolor" value="#000000"&gt;&lt;/param&gt; &lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/video/stewart.swf?v=109786" bgcolor="#000000" allowfullscreen="true" flashvars="intl_lang=en-us&amp;photo_secret=9f467a8d7e&amp;photo_id=9661111674&amp;hd_default=false" height="225" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;</summary><category term="diary"></category><category term="image"></category></entry><entry><title>It's been 2 weeks</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/its-been-2-weeks/" rel="alternate"></link><published>2013-09-01T23:17:00-05:00</published><updated>2013-09-01T23:17:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-09-01:blog/posts/its-been-2-weeks/</id><summary type="html">&lt;p&gt;秋学期が始まって2週間が経ちました。&lt;/p&gt;


&lt;p&gt;早いものでもう2週間が過ぎました。受講してるクラスの進め方にも大体慣れてきた感じです。計算理論のクラスはホワイトボードにバリバリ書き込みしまくる教授。数学や理論出身で、問題の解答や証明なんかをその場で検証して行きます。たまに計算が合わなくてクラス総出で間違ってるところを探すことになるのはご愛嬌。午前から頭をバリバリ回転させてる感じ。&lt;/p&gt;
&lt;p&gt;分散システムの教授はパワポメインで、午後にあることもあって正直眠いです。ただこのクラスはプログラムの宿題が面白そうなので期待しています。なんでもP2Pファイル共有システムを言語問わず作るというものとGPUクラスタで分散コンピューティングなんてのがあるので、楽しみ。&lt;/p&gt;
&lt;p&gt;やっぱり、それぞれのクラスの要点を多少なりともアウトプットしたほうがいいかなと思ってるので、そのうち。そ、の、う、ちやってみようかなと。&lt;/p&gt;
&lt;p&gt;このブログのデザインもちょっと変えてみたいんだけど、なかなか踏ん切りがつかないというか。すげーめんどくさいのでいつになるかわかりません。&lt;/p&gt;</summary><category term="diary"></category></entry><entry><title>Shortcuts: moving to next occurrence in Eclipse</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/shortcuts-moving-to-next-occurrence-in-eclipse/" rel="alternate"></link><published>2013-08-21T12:00:00-05:00</published><updated>2013-08-21T12:00:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-08-21:blog/posts/shortcuts-moving-to-next-occurrence-in-eclipse/</id><summary type="html">&lt;p&gt;Eclipseには選択した変数やメソッドをハイライトする機能がありますが、前後のハイライトに直接ジャンプするショートカットが便利だと思ったのでシェアします。&lt;/p&gt;


&lt;p&gt;今のプロジェクトで扱ってるソースファイルは長くて2000行くらいあったりするので、このメンバ変数どこでセットされてんだ？なんてことがあります。そんなときはいちいち検索ダイアログで調べたりしてましたが、毎回やるのは手間が掛かり過ぎなので、せっかくハイライトされるんだしショートカットキーがあってもよさそうだと思って調べてみました。&lt;/p&gt;
&lt;p&gt;&lt;img alt="highlight" src="https://rn4ru.com/blog/images/highlight.png" /&gt;&lt;/p&gt;
&lt;p&gt;指定した変数aaaの前後のハイライトに移動したい。&lt;/p&gt;
&lt;p&gt;結論から言うとアノテーションをoccurrenceに限定した後で⌘+.(ピリオド)および⌘+,(カンマ)でやりたいことを実現できました。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://stackoverflow.com/questions/4019818/eclipse-navigate-to-next-previous-marked-occurrence"&gt;Eclipse navigate to next/previous marked occurrence - Stack Overflow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="occurrence" src="https://rn4ru.com/blog/images/occurrence.png" /&gt;&lt;/p&gt;
&lt;p&gt;これを限定してあげないと変なところにも飛んでしまいます。&lt;/p&gt;
&lt;p&gt;その他、⌘+Kおよび⌘+shift+Kは文字列を検索して前後に移動するショートカットですが、検索文字列をセットするためにエディタ上でダブルクリックしなければならなかったのがNGでした。それと、文字列検索ということでabを探したくてもabcに引っかかるということもありました。ハイライト自体はカーソル合わせただけで起こるので⌘+.のほうがテンポがいいです。&lt;/p&gt;
&lt;p&gt;自分の環境では⌘+shift+Uでハイライトがリストされることを発見しました。しかし、リストから選ぶよりエディタ内で直接ジャンプしたほうが、コード前後の状況も把握できるので効率がいいかなと思います。時と場合によってはリスト形式のほうが便利かもしれません。&lt;/p&gt;</summary><category term="eclipse"></category><category term="tips"></category></entry><entry><title>Fall semester starts</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/fall-semester-starts/" rel="alternate"></link><published>2013-08-21T11:30:00-05:00</published><updated>2013-08-21T11:30:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-08-21:blog/posts/fall-semester-starts/</id><summary type="html">&lt;p&gt;5月からの夏休みもあっという間に過ぎて、今週から秋学期が始まりました。&lt;/p&gt;


&lt;p&gt;知ってる人がいるかどうかわかりませんが、rn4ruはこの5月に修士課程を卒業していました。にも関わらず学校の近くに引っ越しだとか、研究グループがとか今まで書いていたのは、この秋より博士課程に入学することが決まっていたからです。今後共精進していきたいと思います。&lt;/p&gt;
&lt;p&gt;という訳で、博士課程の最初のセメスターが今週から始まっています。今セメスターは分散システムと計算理論のクラスをとります。&lt;/p&gt;
&lt;p&gt;どこの博士課程もそうだと思いますが、博士候補として認められるにはまず試験をパスしなければなりません。筆記試験と口頭試験がありますが、両方をクリアして初めて博士課程のスタートラインに立てるようになります。&lt;/p&gt;
&lt;p&gt;筆記試験では言語、理論、システムの3つの分野を別々に受ける必要があるのですが、指定されたクラスの成績がよければ筆記試験を免除できるとされています。指定されたクラスのうち2つが先に上げた分散システムと計算理論のクラスなので、このクラスでいい成績を収めることができればシステムと理論の筆記試験は受けなくてすみます。正直かなり必死です。&lt;/p&gt;
&lt;p&gt;学んだことを積極的にアウトプットしたほうが体に染み付くかも、ということでこのブログでもあれこれ書くかもしれません。それか新しいカテゴリをつくるか。なんだかんだWebに置いてあるといつでも参照できるので便利だったりしますしね。&lt;/p&gt;
&lt;p&gt;それでは今学期もこのサイトをよろしくお願いします。&lt;/p&gt;</summary><category term="diary"></category></entry><entry><title>Chinese Valentine's Day</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/chinese-valentines-day/" rel="alternate"></link><published>2013-08-13T20:19:00-05:00</published><updated>2013-08-13T20:19:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-08-13:blog/posts/chinese-valentines-day/</id><summary type="html">&lt;p&gt;中国のバレンタインデーってもしかして…？&lt;/p&gt;


&lt;p&gt;リサーチグループのメンバーが同じアパートの違う階に引っ越してきたので、遊びに行ってきました。そこで今日は中国のバレンタインデーだと聞かされました。&lt;/p&gt;
&lt;p&gt;なんでも伝説によると、農民の娘と神様の息子が恋に落ちたところはいいものの、その後なんやかんやあって&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;、神様の怒りに触れ、その後1年に1度しか会えない日が今日なんです。というお話。&lt;/p&gt;
&lt;p&gt;ん？1年に1回しか会えないってそれ七夕じゃねーの？&lt;/p&gt;
&lt;p&gt;日本のと時期は違うけど、旧暦って考えたらこのくらいだしなあと思って帰ってきてから調べると、どうやらそうみたいです。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;七夕（たなばた、しちせき）は、中国、台湾、日本、韓国、ベトナムなどにおける節供、節日の一つ。旧暦の7月7日の夜のことであるが、日本では明治改暦以降、お盆が7月か8月に分かれるように、7月7日又は月遅れの8月7日に分かれて七夕祭りが行われる。五節句の一つにも数えられる。&lt;/p&gt;
&lt;p&gt;古くは、「七夕」を「棚機（たなばた）」や「棚幡」と表記した。これは、そもそも七夕とはお盆行事の一環でもあり、精霊棚とその幡を安置するのが7日の夕方であることから7日の夕で「七夕」と書いて「たなばた」と発音するようになったともいう。&lt;/p&gt;
&lt;p&gt;元来、中国での行事であったものが奈良時代に伝わり、元からあった日本の棚機津女（たなばたつめ）の伝説と合わさって生まれた言葉である。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ja.wikipedia.org/wiki/%E4%B8%83%E5%A4%95"&gt;七夕 - Wikipedia&lt;/a&gt;より&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;いやあ、色んな所でつながってたり影響しあったりしてるんですね。ちなみに伝統的に女性が織物をしたりする日だったらしいのですが、最近はバレンタインデーにちなんで男性が女性をもてなすんだそうです。&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;実際もこんな適当な説明でした。お互い英語だし&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</summary><category term="diary"></category></entry><entry><title>Solution: can't assign application to desktop</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/solution-cant-assign-application-to-desktop/" rel="alternate"></link><published>2013-08-13T14:56:00-05:00</published><updated>2013-08-13T14:56:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-08-13:blog/posts/solution-cant-assign-application-to-desktop/</id><summary type="html">&lt;p&gt;複数デスクトップを使っている時に、アプリケーションを指定のデスクトップで起動するメニューが出ないときの対処法です。&lt;/p&gt;


&lt;p&gt;&lt;img alt="Before and After" src="https://rn4ru.com/blog/images/assignTo.png" /&gt;&lt;/p&gt;
&lt;p&gt;最近仮想デスクトップを使うようになったrn4ruです。&lt;/p&gt;
&lt;p&gt;せっかくMIssion Controlで複数デスクトップを作ることができるので、それぞれのデスクトップを用途別に使い分けてみようと思いました。例えばデスクトップ2はカレンダーとタスク、デスクトップ5は論文書きと調べ物用という風に。つまり、Calendarアプリを開いたら常にデスクトップ2で起動して欲しいわけです。&lt;/p&gt;
&lt;p&gt;調べた結果、Dockにあるアプリケーションのメニューからそのアプリケーションを起動するデスクトップを指定することができるとのこと。&lt;/p&gt;
&lt;p&gt;&lt;img alt="paper2 will open at Desktop5" src="https://rn4ru.com/blog/images/paper.png" /&gt;&lt;/p&gt;
&lt;p&gt;この例では論文管理アプリの&lt;a href="http://www.papersapp.com/papers/"&gt;Paper2&lt;/a&gt;をデスクトップ5に指定しています。これで自分の好きなようにデスクトップをカスタマイズできると思った矢先、いくつかのアプリケーションではその項目が表示されない問題にひっかかりました。&lt;/p&gt;
&lt;p&gt;&lt;img alt="without menu" src="https://rn4ru.com/blog/images/withoutMenu.png" /&gt;&lt;/p&gt;
&lt;p&gt;そんなときは、そのアプリケーションを一旦終了して、LaunchPadから起動しましょう。Finderからでもいけるみたいです。(未確認)&lt;/p&gt;
&lt;p&gt;&lt;img alt="launchpad" src="https://rn4ru.com/blog/images/launchpad.png" /&gt;&lt;/p&gt;
&lt;p&gt;するとメニューが表示されるようになりました。&lt;/p&gt;
&lt;p&gt;&lt;img alt="with menu" src="https://rn4ru.com/blog/images/withMenu.png" /&gt;&lt;/p&gt;
&lt;p&gt;どうやら問題のアプリケーションは自動起動になっていたり、常にランチャーから呼び出したりしてたというのが原因だったみたいです。マウンテンライオンのバグという話もありますが、詳しいところはよくわかりません。ともあれ一度設定さえすれば、次からは指定したデスクトップで開くようになりました。&lt;/p&gt;
&lt;p&gt;参考元：&lt;a href="http://hints.macworld.com/article.php?story=20130514105015405"&gt;Fix for missing "Assign to..." Mission Control bug in 10.8.x - Mac OS X Hints&lt;/a&gt;&lt;/p&gt;</summary><category term="mac"></category></entry><entry><title>THERMAE ROMAE in Chicago</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/thermae-romae-in-chicago/" rel="alternate"></link><published>2013-08-10T22:41:00-05:00</published><updated>2013-08-10T22:41:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-08-10:blog/posts/thermae-romae-in-chicago/</id><summary type="html">&lt;p&gt;シカゴダウンタウンで開かれたテルマエ・ロマエの無料上映会に行ってきました。&lt;/p&gt;


&lt;p&gt;1月ほど前に、シカゴの総領事館からテルマエ・ロマエの上映会があることを知らせるメールが来たので、本日ワクワクしながら行ってきました。&lt;/p&gt;
&lt;p&gt;会場で配られたパンフレットによると、別にテルマエ・ロマエだけがピンポイントで上映されたわけじゃなくて、&lt;a href="http://www.cinemachicago.org/news_and_events/display_news.php?article=2013_international_screenings_program__may_1__sept_25"&gt;2013 International Screenings Program&lt;/a&gt;として5月から9月にかけて毎週1本各国の映画を上映してるそうです。今回は日本映画としてテルマエ・ロマエが選ばれたということです。&lt;/p&gt;
&lt;p&gt;予告編はこちら。&lt;/p&gt;
&lt;iframe width="500" height="281" src="//www.youtube.com/embed/naLPpDqoFu8" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;会場はシカゴダウンタウンにあるカルチャーセンターのシアター室で、上映開始時にはだいたい130〜150人くらいが座れるところが9割埋まっていたように思いました。客層は日本人ばかりかと言うとそうでもなくて、5:5か6:4で日本人ちょっと少ないくらいかなーという印象でした。&lt;/p&gt;
&lt;p&gt;で肝心の中身ですが。コミック版を読んだことはあったので、大体のストーリーは知っていましたが面白かったです。コミックはどんどん続けられますが、映画として2時間弱で起承転結つけなきゃいけないとなるとこうなるのかなーと思いました。それでもワニ園の前のシーンとか逆タイムスリップとか必要だったかな？&lt;/p&gt;
&lt;p&gt;なんかこういうのって我が子を発表会を心配する親の気持ちになるというか、どんな風に受け入れられるのかなって気になってしまいますが、笑わせたいところでしっかり笑いも起きてたし&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;、上映後も「よかった」という声が周りから聞こえてきたので意味もなくほっとしました。&lt;/p&gt;
&lt;p&gt;ただ結局日本人向けのエンターテイメントなわけで、そこに合わせると多少なりとも誇張されてしまうのはしょうがないわけですよね。その辺り外人目線で日本文化に詳しい人ほど「んん？」と思ってしまう所があったんじゃないかな。一緒に行った友人(日本語ちょっと話せる)はローマで日本語話してるところに凄い違和感あったみたいですがさすがにこればかりはねえ&lt;sup id="fnref:2"&gt;&lt;a class="footnote-ref" href="#fn:2" rel="footnote"&gt;2&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;p&gt;と、余計なこともいろいろ考えてしまいましたが、全体的には大満足です。行ってよかったなと思いました。今度久しぶりに映画館に行ってみようかな。それかNetflix契約するか。&lt;/p&gt;
&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00948JAIC/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/517TcwSHphL._SL160_.jpg" alt="テルマエ・ロマエ Blu-ray豪華盤(特典Blu-ray付2枚組)" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00948JAIC/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;テルマエ・ロマエ Blu-ray豪華盤(特典Blu-ray付2枚組)&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 13.08.11&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;東宝 (2012-11-23)&lt;br /&gt;売り上げランキング: 12,231&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00948JAIC/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;ウォシュレットがウケてたのが結構意外だった。&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;それならハリウッドとかどうなる。&amp;#160;&lt;a class="footnote-backref" href="#fnref:2" rev="footnote" title="Jump back to footnote 2 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</summary><category term="movie"></category></entry><entry><title>Homebrew installs ggrep for tmux powerline</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/homebrew-installs-ggrep-for-tmux-powerline/" rel="alternate"></link><published>2013-08-08T19:27:00-05:00</published><updated>2013-08-08T19:27:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-08-08:blog/posts/homebrew-installs-ggrep-for-tmux-powerline/</id><summary type="html">&lt;p&gt;tmuxのpowerlineを使うためにgrepをHomebrewでインストールしたらハマったのでメモ。&lt;/p&gt;


&lt;p&gt;最近ターミナルを使うことが多くなったので、tmuxというターミナルを分割したり、作業を途中で保存したり、後で再開したりできるユーティリティを使ってみることにしました。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://tmux.sourceforge.net/"&gt;tmux&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://succi.jp/blog/?p=562"&gt;ターミナルマルチプレクサtmuxのインストール&amp;amp;設定方法 | prime factor&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;tmuxにはpowerlineという拡張があって、これまた様々な情報を画面下部に表示してくれるという便利なもので、例えばCPU負荷やネットワーク利用状況はもちろん、現在流してる曲のタイトルや天気、はたまた地震情報まで表示してくれます。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/erikw/tmux-powerline"&gt;erikw/tmux-powerline · GitHub&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://matsu.teraren.com/blog/2013/02/10/moteru-tmux-powerline/"&gt;モテるtmux - まつぼ x Web&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;その天気を表示しようとするところでハマりました。作者の説明によると、天気を取得するにはGNUのgrepが必要で、OS Xのgrepは古いのでbrewでインストールする必要があるらしいのでそれに従ってサクッといれることにしました。&lt;/p&gt;
&lt;p&gt;その時のコマンドはこちら&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;brew install https://raw.github.com/Homebrew/homebrew-dupes/master/grep.rb
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;無事にインストールも終わり、さあこれで表示できるか。とワクワクしてみても一向に表示されません。スクリプトを読んでみると、一時ファイルを作成してるっぽかったのでその保存フォルダに行ってみても、そんなファイルは見つかりません。ほかのファイルはあるのに。&lt;/p&gt;
&lt;p&gt;これはなんか見落としてるなーと思いながらいろいろ設定をいじってみてもなかなか解決しなかったので、最終的にはその一時ファイルを手動で作ってみることにしました。&lt;/p&gt;
&lt;p&gt;スクリプトによるとyahooの天気情報APIを叩き、その結果をgrepして必要なところを一時ファイルに保存しているようでした。試した結果、APIは正しい結果を返しているように見えます。&lt;/p&gt;
&lt;p&gt;しかしgrepのところで、usageが違うと怒られました。よくよくバージョンをみてみると対応していないとされていた古いgrepだったのです。さっきインストールしたのはどこいった、と思って探してみると、/usr/local/bin/にggrepとしてあるではありませんか。試しにggrepを使ってみるとうまく動いてるみたいです。&lt;/p&gt;
&lt;p&gt;これで原因がわかりました。あとは.tmux-powerlinercのweatherセクションにgrepコマンドを指定するところがあったのでそこにggrepのパスを入れて見ます。するときちんと天気が表示されました。&lt;/p&gt;
&lt;p&gt;&lt;img alt="powerline" src="https://rn4ru.com/blog/images/tmux-powerline.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;これでターミナルをいじりながら天気を確認することができますね。&lt;/p&gt;</summary><category term="tmux"></category><category term="homebrew"></category><category term="grep"></category></entry><entry><title>Can you trust Random?</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/can-you-trust-random/" rel="alternate"></link><published>2013-08-07T17:16:00-05:00</published><updated>2013-08-07T17:16:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-08-07:blog/posts/can-you-trust-random/</id><summary type="html">&lt;p&gt;メンバーのデバッグを手伝ってるうちに、頭の痛くなるようなコードを見つけたのでシェア。&lt;/p&gt;


&lt;p&gt;そのコードは簡単に言うと、トランプで例えるとカードをよく切って1枚ずつ配っていくようなもの。&lt;/p&gt;
&lt;p&gt;もちろん1枚しかないカードを2回配ることはできないから、そのカードがすでに配られたかどうかを判定しなければならない、とでも思ったのだろう。&lt;/p&gt;
&lt;p&gt;加えて、トランプデッキの数も変わる(例えば2セットだったら全部で104枚のカードになる)というから、今そのカードが何枚あるかも保持しておきたい。&lt;/p&gt;
&lt;p&gt;そんな訳でできたコードがこれ。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numberOfDeck&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="c1"&gt;// デッキを初期化&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++){&lt;/span&gt;
        &lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numberOfDeck&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;Random&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Random&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;Card&lt;/span&gt; &lt;span class="nf"&gt;getCard&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nextInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 枚数0だったらやり直し&lt;/span&gt;

    &lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;]--;&lt;/span&gt; &lt;span class="c1"&gt;// 一枚引く。&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Card&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// xに応じてなんか返す。&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;頭痛い。&lt;/p&gt;
&lt;p&gt;だって、最初の1枚はどれ引いても当たりだけど、乱数rが最後の1枚引く確率は1/52ですよ。その分ループ回数も多くなるし、非効率すぎる。&lt;/p&gt;
&lt;p&gt;さらに乱数なんだから延々最後の1枚がでないってこともありうるし。仕事でこんなコード書いたら切れられる。いや、誰にかはわかりませんが。&lt;/p&gt;
&lt;p&gt;プロジェクトの極一部でしか使われていないコードだからそんなに影響もないんだろうけど、今度こっそり修正しとこうかな。&lt;/p&gt;
&lt;p&gt;ちなみに重複なしでランダムなカードを配るというときは最初にすべての配列を作っておいて(2セットなら104個)、それをシャッフルした後に最初から順番に配っていくというのが王道だと思います。&lt;/p&gt;
&lt;p&gt;選ぶときに乱数を生成するんでなくて、シャッフル時に乱数を使うというのがミソ。配るときには結局配列を総なめしてるだけなのでアルゴリズムのオーダーはO(n)で済みます。&lt;/p&gt;
&lt;p&gt;シャッフルするにも普通に乱数使うと偏ってしまうので、ちょっとだけ工夫します。&lt;a href="http://empirenews.blog53.fc2.com/blog-entry-43.html"&gt;こちら&lt;/a&gt;に実装例がありました。wikipediaなら&lt;a href="http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#The_modern_algorithm"&gt;こちら&lt;/a&gt;です。&lt;/p&gt;
&lt;p&gt;このアルゴリズムの考え方としてはn個の配列からはn!の順列組み合わせが作れるので、シャッフルされた配列がちょうどn!分の1の確率で出るようになればいいわけです。&lt;/p&gt;
&lt;p&gt;このアルゴリズムでは最初の1枚は1/nの確率で選ばれます。次の1枚は1/(n-1)の確率で、その次は1/(n-2)の確率でってやっていくと、最終的に選ばれる配列の確率は1/n * 1/(n-1) * ... * 1/1 = 1/(n!)ということでn!分の1になるのでした。&lt;/p&gt;
&lt;p&gt;おそまつさまでした。&lt;/p&gt;</summary><category term="java"></category><category term="algorithm"></category><category term="snippet"></category></entry><entry><title>Long day, Keema curry</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/long-day-keema-curry/" rel="alternate"></link><published>2013-08-02T21:51:00-05:00</published><updated>2013-08-02T21:51:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-08-02:blog/posts/long-day-keema-curry/</id><summary type="html">&lt;p&gt;今日は一日中ミーティング、そしてキーマカレーを作った話。&lt;/p&gt;


&lt;p&gt;今所属しているグループでは一番古参ということで、
ボスからメンバーのお目付け役に指名されている。&lt;/p&gt;
&lt;p&gt;お目付け役とは名ばかりで、要するに今やってるプロジェクトのプログラムにエラーや
バグがあったら真っ先に苦情が回ってくるような役なんだけど、毎日いろんなことが起こって結構勉強になる。&lt;/p&gt;
&lt;p&gt;そのボスが来週からバケーションに行くとのことで、今日は各個人が入れ替わり立ち代わり
ボスとミーティングするスケジュールだったのだけど、その全てに同席しろという。&lt;/p&gt;
&lt;p&gt;朝の10時から午後5時までぎっしり。昼食もボスがおごってくれたので、一日中そばにいて
あーでもないこーでもないと話し合った。&lt;/p&gt;
&lt;p&gt;そのおかげかどうかわからないが、後半のほうになると1を聞いて10を知る、
というような感じでボスの発言の主旨を理解できるようになっていた。&lt;/p&gt;
&lt;p&gt;これは不思議なんだけども、一つ前のミーティングでウンウン唸ってだした解決策を応用すると
その後のミーティングに出てきた問題も解くことができるということがいくつかあった。
なので、ボスが「そういえばさっきのミーティングもでこんなことがあって」と言い出すとピンとくるというわけ。&lt;/p&gt;
&lt;p&gt;意見の一致も多かったし、脳内が問題解決モードに入ってる時は案外こんなものなのかもしれない。&lt;/p&gt;
&lt;p&gt;&lt;img alt="keema" src="https://rn4ru.com/blog/images/keema.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;家に帰ってからはこの前ネットの海をさまよってたときに見つけた&lt;a href="http://blog.livedoor.jp/darkm/archives/51500936.html"&gt;キーマカレー&lt;/a&gt;を作った。&lt;/p&gt;
&lt;p&gt;カレー作るのも久しぶり、ルーも日本製のを以前見つけた時に買っておいた。
キーマカレーは初めて作ったけどもなかなかおいしかった。
なんかルーの色がパッケージと違う気がするけど。&lt;/p&gt;
&lt;p&gt;というかカレーはなんでもおいしい。余ったのはパックにいれて冷凍するので1週間は夕食毎日カレーだな。&lt;/p&gt;
&lt;div class="amazlet-box" style="margin-bottom:0px;"&gt;&lt;div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B0058BD0OO/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;&lt;img src="http://ecx.images-amazon.com/images/I/31LGQkLYIkL._SL160_.jpg" alt="S&amp;B ゴールデンカレーB-5 1kg" style="border: none;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"&gt;&lt;div class="amazlet-name" style="margin-bottom:10px;line-height:120%"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B0058BD0OO/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;S&amp;B ゴールデンカレーB-5 1kg&lt;/a&gt;&lt;div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%"&gt;posted with &lt;a href="http://www.amazlet.com/" title="amazlet" target="_blank"&gt;amazlet&lt;/a&gt; at 13.08.03&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-detail"&gt;エスビー食品 &lt;br /&gt;売り上げランキング: 15,127&lt;br /&gt;&lt;/div&gt;&lt;div class="amazlet-sub-info" style="float: left;"&gt;&lt;div class="amazlet-link" style="margin-top: 5px"&gt;&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/B0058BD0OO/rn4ru-22/ref=nosim/" name="amazletlink" target="_blank"&gt;Amazon.co.jpで詳細を見る&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="amazlet-footer" style="clear: left"&gt;&lt;/div&gt;&lt;/div&gt;</summary><category term="diary"></category><category term="food"></category></entry><entry><title>August has begun</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/august-has-begun/" rel="alternate"></link><published>2013-08-01T16:26:00-05:00</published><updated>2013-08-01T16:26:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-08-01:blog/posts/august-has-begun/</id><summary type="html">&lt;p&gt;8月に入った所でこのブログでも新展開を試みようかと。&lt;/p&gt;


&lt;p&gt;これまで1ヶ月ほど記事を書いてみましたが、
正直こんなに続くとは思ってませんでした。&lt;/p&gt;
&lt;p&gt;ここまで来たらどこまでやれるか試してみたいものですが、
前みたいに突然更新をやめてしまうかもしれません。&lt;/p&gt;
&lt;p&gt;そんな更新状況と自分へのプレッシャーを兼ねて、
今後ブログ書いたあとにTwitterで書いたよツイートを流してみたいと思います。&lt;/p&gt;
&lt;p&gt;最近のサービスには無駄に解析ツールなんかもついているので、
これまでのデータとあわせていろいろ試行錯誤してみようと思います。&lt;/p&gt;
&lt;p&gt;やっぱり多くの人に読まれることがあれば嬉しいですし、
だけどこのブログでこれまで一番アクセスを集めてるのはもう削除した旧URL(404になる)なんですけどね(涙)&lt;/p&gt;
&lt;p&gt;その記事こっちでも新しく書きなおそうかな。&lt;/p&gt;</summary><category term="challenge"></category><category term="thinking"></category></entry><entry><title>String.split in Java, retaining the delimiters</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/stringsplit-in-java-retaining-the-delimiters/" rel="alternate"></link><published>2013-07-27T17:12:00-05:00</published><updated>2013-07-27T17:12:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-07-27:blog/posts/stringsplit-in-java-retaining-the-delimiters/</id><summary type="html">&lt;p&gt;文字列をあるパターンによって区切るときはString.split()を使いますが、
そのときに区切り文字そのものも一緒に返してほしい。&lt;/p&gt;


&lt;p&gt;単純にString.split()を使うと、区切り文字で区切られた文字列が配列になって返ってきます。
例えば"AとBとC".split("と")は配列["A","B","C"]を返します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;AとBとC&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;と&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//=&amp;gt; [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;だけど今回は区切り文字も配列内に欲しい。
つまり、"AとBとC".split(ほげほげ)としたときに、["A","と","B","と""C"]にしたいわけです。&lt;/p&gt;
&lt;p&gt;結論から先に書くと、先読みと後読みを組み合わせて使います。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;AとBとC&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;pattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;(?&amp;lt;=と)|(?=と)&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//=&amp;gt; [&amp;quot;A&amp;quot;,&amp;quot;と&amp;quot;,&amp;quot;B&amp;quot;,&amp;quot;と&amp;quot;,&amp;quot;C&amp;quot;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;解説は後にするとして、その他の方法も紹介します。&lt;/p&gt;
&lt;p&gt;一つはStringTokenizerを使う方法。StringTokenizerはほぼString.split()と同じ働きをします。
さらにコンストラクタにreturnDelimsというパラメータがあり、
ここがtrueだと区切り文字も配列に含まれて返ってきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;StringTokenizer&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;StringTokenizer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;AとBとC&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;と&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasMoreTokens&lt;/span&gt;&lt;span class="o"&gt;()){&lt;/span&gt;
    &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nextToken&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="c1"&gt;//=&amp;gt; A&lt;/span&gt;
    &lt;span class="c1"&gt;//=&amp;gt; と&lt;/span&gt;
    &lt;span class="c1"&gt;//=&amp;gt; B&lt;/span&gt;
    &lt;span class="c1"&gt;//=&amp;gt; と&lt;/span&gt;
    &lt;span class="c1"&gt;//=&amp;gt; C&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;しかしこのStringTokenizer、APIドキュメントではレガシークラスという位置づけで、
新しいコードでの利用は推奨されていません。また、正規表現を区切り文字に使えないという欠点もあります。&lt;/p&gt;
&lt;p&gt;実はこの問題はもともとStringTokenizerで書かれていたコードを書きなおそうとしてぶち当たったのです。&lt;/p&gt;
&lt;p&gt;次に思いつく方法は、一旦文字列中に表れる区切り文字を絶対使わないような文字で囲んでから、
改めてその使わない文字でsplit()するというものです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;AとBとC&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;と&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;#と#&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;#&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//=&amp;gt;  [&amp;quot;A&amp;quot;,&amp;quot;と&amp;quot;,&amp;quot;B&amp;quot;,&amp;quot;と&amp;quot;,&amp;quot;C&amp;quot;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;これなら正規表現も使えますし、何も問題がないように思えます。  実際ほとんどの場合これで間に合うはず。
でもなんとなく気に入りません。スマートじゃないよなあと感じてしまいます。&lt;/p&gt;
&lt;p&gt;そもそも、絶対使わないような文字って意外に考えるのが難しいです。
そりゃ最悪ユニコードの制御文字(&lt;a href="http://ja.wikipedia.org/wiki/Unicode%E6%96%87%E5%AD%97%E3%81%AE%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0#.E4.B8.8D.E5.8F.AF.E8.A6.96.E3.81.AE.E5.8C.BA.E5.88.87.E3.82.8A.E6.96.87.E5.AD.97"&gt;不可視の区切り文字&lt;/a&gt;とか)でもいれとけばいいのでしょうが。&lt;/p&gt;
&lt;p&gt;というようなものを調べてきたところで、先に記した先読みと後読みを組み合わせた方法を見つけたのです。&lt;/p&gt;
&lt;p&gt;というわけで解説ですが、自分自身あんまり正規表現に関する知識はありません。
もしなにかあったらツッコミお願いします。&lt;/p&gt;
&lt;p&gt;さて、この正規表現"((?&amp;lt;=と)|(?=と))"のキモは先読み(?=)と後読み(?&amp;lt;=)を使っているところです。&lt;/p&gt;
&lt;p&gt;先読みはパターンがいま見ている文字の先にあるときにマッチします。
つまり、"AとBとC"だったら"A"を読み込んだ時点で"(?=と)"に該当するわけです。
あるいは文字列が"ABCと"だったら、"ABC"と読んだ時点でマッチします。&lt;/p&gt;
&lt;p&gt;また、先読みや後読みは一致文字そのものではなく、その位置に反応するみたいです。
そのため、String.split()では一致した区切り文字を配列から除きますが、
この場合"A"及び"と"の間に架空の文字があって、それを取り除いてるように動作します。&lt;/p&gt;
&lt;p&gt;さて、"A"を配列に格納した後の文字列は"とBとC"になりますが、この"と"(正確にはその次の位置)を読み込んだ時に
(?&amp;lt;=と)にマッチします。先ほどと同じように"と"そのものにマッチしたわけではないので、"と"が配列に格納されます。&lt;/p&gt;
&lt;p&gt;これを繰り返すことで、区切り文字そのものを含みつつ、その区切り文字で区切られた配列を得ることができます。&lt;/p&gt;
&lt;p&gt;参考サイトではString.format()を用いて、可読性と汎用性を改良したコードが紹介されています。&lt;/p&gt;
&lt;p&gt;おそまつさまでした。&lt;/p&gt;
&lt;p&gt;参考サイト：&lt;br /&gt;
- &lt;a href="http://stackoverflow.com/questions/2206378/how-to-split-a-string-but-also-keep-the-delimiters"&gt;java - How to split a string, but also keep the delimiters? - Stack Overflow&lt;/a&gt;&lt;br /&gt;
- &lt;a href="http://www.javadrive.jp/regex/lookahead/index1.html"&gt;先読みを使ったパターン - 先読みと後読み - Java正規表現の使い方&lt;/a&gt;&lt;/p&gt;</summary><category term="java"></category><category term="snippet"></category></entry><entry><title>git-svn committing to remote branch from local branch</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/git-svn-committing-to-remote-branch-from-local-branch/" rel="alternate"></link><published>2013-07-26T17:20:00-05:00</published><updated>2013-07-26T17:20:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-07-26:blog/posts/git-svn-committing-to-remote-branch-from-local-branch/</id><summary type="html">&lt;p&gt;昨日に引き続きgitの話。ローカルで色々いじってるブランチを、
リモートSVNのブランチに突っ込むにはどうするか。&lt;/p&gt;


&lt;p&gt;まだまだ始めたばっかりでよくわかってないところもあるんだけど、
gitでローカルに作ったブランチをSVNのリモートブランチに一旦置いときたいことがある。&lt;/p&gt;
&lt;p&gt;例えば、trunkをhotfixしようとローカルブランチ切ったはいいんだけど、
意外に影響範囲が大きくなりそうで、そのままマージするのちょっと気が引けるし、とか
チームメンバーにレビューしてもらうときとか、じゃあSVNのブランチに入れといて、って言われたりとか。&lt;/p&gt;
&lt;p&gt;最初からSVN側にブランチ作ればいいじゃんという人もいるかもだけど、
常にそういうことができるというわけでもないので…(まだ家にインターネット環境ないし)&lt;/p&gt;
&lt;p&gt;ちなみに、最初から作っとく場合はおそらく&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;git svn branch remotebranch &lt;span class="c1"&gt;# リモートにブランチ作成&lt;/span&gt;
git checkout -b localbranch remotebranch &lt;span class="c1"&gt;# ローカルに持ってくる&lt;/span&gt;
&lt;span class="c1"&gt;# 色々コミット&lt;/span&gt;
git svn dcommit &lt;span class="c1"&gt;# リモートにコミット&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;でおｋな気がする。試したことないけど。心配だったらdcommitのときに-nオプションつけて確認するとか。&lt;/p&gt;
&lt;p&gt;これがローカルブランチのがすでにある状態からだと、リモートブランチを作成して持ってきたあとに、
既存の奴をマージするという一手間があるのかと。つまり&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;git svn branch remotebranch
git checkout -b localbranch remotebranch
git merge --no-ff exsistingbranch &lt;span class="c1"&gt;# ローカルブランチに既存のをマージ&lt;/span&gt;
git svn dcommit
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;--no-ffオプションを使わないとなんかよろしくないことになるみたいなので常に使う方向で。
あるいはコミットログが多すぎるよ、ってときは--squashでマージしてからコミットする方向で。
(この前SVNにマージしようとして200超のコミットログを作った反省を込めて)&lt;/p&gt;
&lt;p&gt;何かもっといい方法あったら教えてください。&lt;/p&gt;
&lt;p&gt;参考にしたサイト:&lt;br /&gt;
- &lt;a href="http://d.hatena.ne.jp/walf443/20090521/1242860422"&gt;git-svnでリモートリポジトリのブランチにコミットする - I sort my thought...&lt;/a&gt;&lt;br /&gt;
- &lt;a href="http://stackoverflow.  com/questions/158514/is-it-possible-to-make-git-svn-dcommit-result-in-a-single-svn-commit"&gt;Is it possible to make git svn dcommit result in a single svn commit? - Stack Overflow&lt;/a&gt;&lt;/p&gt;</summary><category term="git"></category></entry><entry><title>Wasting my time</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/wasting-my-time/" rel="alternate"></link><published>2013-07-25T17:15:00-05:00</published><updated>2013-07-25T17:15:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-07-25:blog/posts/wasting-my-time/</id><summary type="html">&lt;p&gt;今やってるプロジェクトではソースコードを研究室にあるSVNサーバで管理してるのだけど、
個人的にはgit-svnを使って開発してる。細かくローカルにコミットするのとかが合ってるみたい。&lt;/p&gt;


&lt;p&gt;今日も今日とて、たまってたリファクタリングを午後からやっていて、
これがまた捗るんだ。&lt;/p&gt;
&lt;p&gt;Eclipseのリファクタリング支援のおかげか、メソッドを分割したりとか、ロジックの順序を良い感じに入れ替えても一発でテストが通る。ので安心してガツガツリファクタリングしてたのさ。&lt;/p&gt;
&lt;p&gt;で、あんまりうまい具合に進むもんだから途中でのコミットをすっかり忘れたのよ。
なんかそういうリズムを崩したくないときってあるでしょ。&lt;/p&gt;
&lt;p&gt;そんで結構いい感じで一段落したから、ローカルにコミットしようとしたわけ。
そしたらgit statusがなんの結果も返さないわけ。あんた何も変更なんてしてないでしょっていうわけ。&lt;/p&gt;
&lt;p&gt;確認用に置いといたSVN直のソースを直接変更してたのに気づくまでそこまで時間はかからなかったね。
SVNのトランクから持ってきたプロジェクトと、git-svnで持ってきたプロジェクトが並んでて、前者のほうをガツガツリファクタリングしてたって落ち。&lt;/p&gt;
&lt;p&gt;そりゃあテストも一発で通るはずだわ、だってテストにクラスパス通ってる方のは手付かずなんだもの。&lt;/p&gt;
&lt;p&gt;恐る恐るクラスパスを確認用プロジェクトに差し替えたら、まあエラーでるよね。これまでの3時間が無駄になった瞬間でした。&lt;/p&gt;
&lt;p&gt;その勢いのまま半ばやけくそでこの記事を書いてます。もうちょっと現実逃避してからやり直そうと思います。&lt;/p&gt;</summary><category term="failure"></category></entry><entry><title>Bring the house down</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/bring-the-house-down/" rel="alternate"></link><published>2013-07-24T19:02:00-05:00</published><updated>2013-07-24T19:02:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-07-24:blog/posts/bring-the-house-down/</id><summary type="html">&lt;p&gt;今日知った英語表現「bring the house down」、意味は…
&lt;/p&gt;
&lt;p&gt;「大喝采を浴びる」&lt;/p&gt;
&lt;p&gt;いやー、いつかは大喝采を受けるような発表をしてみたいもんだ。&lt;/p&gt;
&lt;p&gt;ちなみに目にしたのはこの動画の紹介欄。&lt;/p&gt;
&lt;iframe width="560" height="315" src="//www.youtube-nocookie.com/embed/a35XINnYFtA" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;この動画自体も微笑ましくて素晴らしいです。&lt;/p&gt;</summary><category term="english"></category></entry><entry><title>New phone</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/new-phone/" rel="alternate"></link><published>2013-07-23T19:14:00-05:00</published><updated>2013-07-23T19:14:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-07-23:blog/posts/new-phone/</id><summary type="html">&lt;p&gt;前々から怪しかった2年前に買ったプリペイドの携帯がついに壊れたっぽい。
電話を受けることはできるけど、相手の声が聞こえない。&lt;/p&gt;


&lt;p&gt;&lt;img alt="prepaid" src="https://rn4ru.com/blog/images/prepaid.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;しょうがないので、新しいプリペイド携帯を買うことにした。
実はiPhoneの5Sか6か新しいのが出たら今度こそ買ってやろうと思っていたのだけど、
もっとも早い噂のでも発売まで1ヶ月以上あるから断念。&lt;/p&gt;
&lt;p&gt;それでもつなぎの意味を込めて安いやつを選んだ。
買ったその場でアクティベートしてもらったので、新しい番号になったが、
その場では特に何も思わなかった。&lt;/p&gt;
&lt;p&gt;というのもこの壊れたプリペイド、SIMカードが元々入ってない。
ので、番号引き継ぎするのもSIM取っ替えるのよりはめんどくさそうだと。&lt;/p&gt;
&lt;p&gt;ところが今ネットで調べたら、意外に簡単にできることがわかった。
(アクティベート中にやることがちょっと増えるだけ)&lt;/p&gt;
&lt;p&gt;もうアクティベートしてしまった後だしなあ、とちょっと後悔する反面、
iPhoneに変えるときに今の電話番号に移せば混乱も少なく、
かつ緊急用のサブとの2台持ちになるじゃん、とポジティブでもあるのだった。&lt;/p&gt;</summary><category term="diary"></category></entry><entry><title>Markdown, clickable image with link</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/markdown-clickable-image-with-link/" rel="alternate"></link><published>2013-07-22T18:36:00-05:00</published><updated>2013-07-22T18:36:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-07-22:blog/posts/markdown-clickable-image-with-link/</id><summary type="html">&lt;p&gt;このブログの記事は(Multi)Markdownという記法で書かれているんだけど、
リンク付きの画像はどうやるんだろう、と調べたのでメモ。&lt;/p&gt;


&lt;p&gt;Markdownでは画像の埋め込みは![ALTテキスト](画像URL)で記述できます。&lt;/p&gt;
&lt;p&gt;一方リンクは[リンクテキスト](リンク先URL)です。&lt;/p&gt;
&lt;p&gt;さて、リンク付きの画像は一体どうすればいいんだろうと一瞬考えてしまったけど、
単純に[![ALTテキスト](画像URL)](リンク先URL)と入れ子にしてやれば出来ました。&lt;/p&gt;
&lt;p&gt;この辺がMarkdownのシンプルさだよねえ。
とはいえ最初に試してみたときはBywordが認識しなかったので焦ったのであった。&lt;/p&gt;</summary><category term="markdown"></category></entry><entry><title>og:image, Twitter cards, and Pubsubhunbub</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/ogimage-twitter-cards-and-pubsubhunbub/" rel="alternate"></link><published>2013-07-21T19:21:52-05:00</published><updated>2013-07-21T19:21:52-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-07-21:blog/posts/ogimage-twitter-cards-and-pubsubhunbub/</id><summary type="html">&lt;p&gt;この週末で、ブログをいくつかアップデートしてみました。
まずはog:imageを必要に応じて設定できるようにし、そのあとTwitter cardsの登録。
最後にフィードをPubsubhubbubに対応させました。&lt;/p&gt;


&lt;p&gt;個別記事のページを開くとhtmlのヘッダにmetaタグでいろいろ列挙されてるんですが、
それはオープングラフという規格で、これらを指定しておくとフェイスブックや
Twitterなどでシェアされたときに、タイトルや本文などを良い感じにしてくれます。
まあ、シェアされたことは一度もないんですが。&lt;/p&gt;
&lt;p&gt;その中には画像を指定できるタグ(og:image)があって、今までは固定の画像をつかっていました。
今回これを指定した画像に置き換えるようにしました。例えば、&lt;a href="https://rn4ru.com/blog/posts/taste-of-chicago/"&gt;この&lt;/a&gt;記事だと
Taste of Chicagoのゲートが指定されるようになってます。&lt;/p&gt;
&lt;p&gt;といってもPelicanのテンプレートをいじって、画像のパスが指定された時に置き換えるだけ。
画像のパス指定はmarkdownのmetadataでします。そのためにimg:という項目を追加しました。&lt;/p&gt;
&lt;p&gt;せっかくオープングラフも充実させたので、Twitter cardsにも登録してみたいと思います。
Twitter cardsの登録は&lt;a href="https://dev.twitter.com/docs/cards/validation/validator"&gt;ここ&lt;/a&gt;に指定項目を埋めて申請するだけでおｋ。
実はここで、og:imageに固定画像は望ましくないと書かれていたので、今回の画像指定機能をつけようと思ったのです。
申請には数日かかるかもと書かれてますが、数分で承認完了のメールが届きました。&lt;/p&gt;
&lt;p&gt;最後にPubsubhubbub対応にしてみました。これは記事の更新をリアルタイムに通知することが可能な技術で、
Google先生が対応しているということで、その効果の程はわかりませんが、
もしかしたら更新が即インデックスに反映されるかも、という期待を込めてやってます。&lt;/p&gt;
&lt;p&gt;といっても単に&lt;a href="https://pubsubhubbub.appspot.com/"&gt;ここ&lt;/a&gt;に書いてある項目にしたがっただけです。
ATOMフィードにlinkタグを追記しなければならないのですが、
例によって、PelicanのATOMフィード生成に介入する方法を知らないので、
フィード生成後にperlを使って必要な項目を追記しています。
発行したことをGoogleのサーバに知らせるのはcurl --dataを用いました。&lt;/p&gt;
&lt;p&gt;テストした限りでは、うまく行ってるみたいです。&lt;/p&gt;</summary><category term="update"></category></entry><entry><title>Heat index over 100 these days</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/heat-index-over-100-these-days/" rel="alternate"></link><published>2013-07-18T18:35:00-05:00</published><updated>2013-07-18T18:35:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-07-18:blog/posts/heat-index-over-100-these-days/</id><summary type="html">&lt;p&gt;暑い。&lt;/p&gt;


&lt;p&gt;今日明日過ごせば土日だー、というところ、気温が急激に上がってます。
いわゆる体感温度のことをHeat indexというのですが、&lt;a href="http://www.chicagotribune.com/news/local/ct-met-chicago-heat-0718-20130718,0,4703551.story"&gt;Chicago Tribune&lt;/a&gt;紙によれば昨日は103°F、
今日は105そして明日は108になるとのこと。実際の気温は95くらいらしいですが。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ja.wikipedia.org/wiki/%E8%8F%AF%E6%B0%8F"&gt;華氏 - Wikipedia&lt;/a&gt;によると、水が氷になる温度を32°F、沸騰する温度を212°Fとして
その間を180等分したもので、人の平熱が98.6ということなので、100超えともなれば暑いわけだなあ。&lt;/p&gt;
&lt;p&gt;ちなみに計算式は℃=5/9(°F-32)で、自分で軽く計算するときは半分にして16を引き、
それよりちょっと高いくらいと覚えています。&lt;/p&gt;
&lt;p&gt;学校に着いてさえしまえば、ほとんどのところで冷房が効いているのでゆったり過ごせるわけですが、
そこに行くまでのほんの10分ちょっとで、鞄を背負ってる背中に汗をかきます。
といっても、日本もこの夏は暑いと聞くので弱音を言ってる場合ではないですね。&lt;/p&gt;
&lt;p&gt;今日の○はお休みします。&lt;/p&gt;</summary><category term="Chicago"></category></entry><entry><title>Convert Byte[] to byte[] and vice versa</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/convert-byte-to-byte-and-vice-versa/" rel="alternate"></link><published>2013-07-17T20:20:00-05:00</published><updated>2013-07-17T20:20:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-07-17:blog/posts/convert-byte-to-byte-and-vice-versa/</id><summary type="html">&lt;p&gt;Javaでプリミティブ型の配列と、クラス型の配列を相互に変換するのに
スマートな方法ってないんだろうか。
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;b1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Byte&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;b2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
&lt;span class="c1"&gt;// Byte[] =&amp;gt; byte[]&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
 &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Byte&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="n"&gt;b2&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;++]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;byteValue&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
 &lt;span class="o"&gt;}&lt;/span&gt; 
&lt;span class="c1"&gt;// byte[] =&amp;gt; Byte[]&lt;/span&gt;
&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;b2&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;++]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 勝手に変換される&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;参考：&lt;a href="http://stackoverflow.com/questions/12944377/how-to-convert-byte-to-byte-and-the-other-way-around"&gt;java - how to convert byte[] to Byte[], and the other way around? - Stack Overflow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;プリミティブ=&amp;gt;クラスはオートボクシングされるとはいえ、
それでもイテレーションが必要なことに変わりはないしなあ。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://commons.apache.org/proper/commons-lang/javadocs/api-release/index.html"&gt;ArrayUtils (Commons Lang 3.1 API)&lt;/a&gt;というものを見つけたけど、そこまではちょっと。&lt;/p&gt;</summary><category term="java"></category><category term="snippet"></category></entry><entry><title>Why you shouldn't close the System.in</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/why-you-shouldnt-close-the-systemin/" rel="alternate"></link><published>2013-07-16T18:14:00-05:00</published><updated>2013-07-16T18:14:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-07-16:blog/posts/why-you-shouldnt-close-the-systemin/</id><summary type="html">&lt;p&gt;メンバーからBufferedReaderが例外を投げると聞かれたので、調べてみました。
&lt;/p&gt;
&lt;p&gt;サンプルコードはこんな感じ。これも例外処理とか投げっぱなしですが、
そこはまあ適当に。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;Exception&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Reader&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;InputStreamReader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;BufferedReader&lt;/span&gt; &lt;span class="n"&gt;br&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BufferedReader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readLine&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Reader&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;InputStreamReader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;BufferedReader&lt;/span&gt; &lt;span class="n"&gt;br&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BufferedReader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readLine&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;同じブロックが並んでますが、2つ目のブロックのreadLine()でStream closedというIOExcepitonが出ます。
なぜかというと、1つ目のブロックの最後で、br.close()する際に、System.inもクローズしてしまうからです。&lt;/p&gt;
&lt;p&gt;System.inというのはSystemクラス内に&lt;a href="http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#in"&gt;public static&lt;/a&gt;で定義されています。
なので1度クローズすると他の場所で使おうとしても閉じられたままです。
もっと言えば再オープンもできません。のでSystem.inやout、errはクローズしてはいけません。&lt;/p&gt;
&lt;p&gt;とのことでした。&lt;/p&gt;
&lt;p&gt;対処法としてはSystem.inはクローズしなくてもいい。ということですが、
それでもReaderやWriterを使った後に閉じないと気持ち悪いという人もいると思います。
そんなときは、InputStreamReaderを継承して、close()だけを何もしないように
オーバーライドした、UnclosableInputStreamを作ってみてはいかがでしょうか。
サンプルコードは&lt;a href="http://stackoverflow.com/questions/14962082/close-scanner-without-closing-system-in"&gt;こちら&lt;/a&gt;などにあります。&lt;/p&gt;
&lt;p&gt;あるいはApache Commons IOの&lt;a href="http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html"&gt;CloseShieldInputStream&lt;/a&gt;という手もあるそうです。&lt;/p&gt;</summary><category term="java"></category><category term="snippet"></category></entry><entry><title>Finer volume adjustment by keyboard on Mac</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/finer-volume-adjustment-by-keyboard-on-mac/" rel="alternate"></link><published>2013-07-15T16:06:00-05:00</published><updated>2013-07-15T16:06:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-07-15:blog/posts/finer-volume-adjustment-by-keyboard-on-mac/</id><summary type="html">&lt;p&gt;shift+option+fn+(F11 or F12)で音量を1/4単位で細かく調整できることを知ったのでメモ。&lt;/p&gt;
&lt;p&gt;参照元: &lt;a href="http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-adjust-a-sound-volume-more-delicate-in-macos.html"&gt;Macの音量を通常より細かく微調整する隠れ技 / Inforati&lt;/a&gt;&lt;/p&gt;</summary><category term="mac"></category></entry><entry><title>Taste of Chicago</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/taste-of-chicago/" rel="alternate"></link><published>2013-07-15T15:25:13-05:00</published><updated>2013-07-15T15:25:13-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-07-15:blog/posts/taste-of-chicago/</id><summary type="html">&lt;p&gt;昨日はシカゴにあるレストランの屋台が広場に一同に集う一大イベントTaste of Chicago
の最終日だったので行ってきました。
&lt;/p&gt;
&lt;p&gt;&lt;img alt="gate" src="https://rn4ru.com/blog/images/gate.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;というわけでやって来ました。&lt;/p&gt;
&lt;p&gt;&lt;img alt="live" src="https://rn4ru.com/blog/images/live.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;バンドがライブしてたり&lt;/p&gt;
&lt;p&gt;&lt;img alt="fountain" src="https://rn4ru.com/blog/images/fountain.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;公園内に噴水があったりします。&lt;/p&gt;
&lt;p&gt;&lt;img alt="tickets" src="https://rn4ru.com/blog/images/tickets.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;なにはともあれチケットを入手。12枚シートで8ドル、を2組買いました。&lt;/p&gt;
&lt;p&gt;&lt;img alt="burger" src="https://rn4ru.com/blog/images/burger.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;早速チケット10枚をハンバーガーと交換。ついでにドリンクの試供品ももらいました。&lt;/p&gt;
&lt;p&gt;&lt;img alt="burger2" src="https://rn4ru.com/blog/images/burger2.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;ブラックアンガスバーガーです。&lt;/p&gt;
&lt;p&gt;&lt;img alt="empty" src="https://rn4ru.com/blog/images/empty.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;ごちそうさまでした。&lt;/p&gt;
&lt;p&gt;&lt;img alt="fries" src="https://rn4ru.com/blog/images/fries.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;次の獲物はフライドポテトwithカレー。チケット4枚でした。残りは10枚。&lt;/p&gt;
&lt;p&gt;&lt;img alt="wine" src="https://rn4ru.com/blog/images/wine.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;ワインバーなんかもあります。が、チケットの枚数的にパス。&lt;/p&gt;
&lt;p&gt;&lt;img alt="beer" src="https://rn4ru.com/blog/images/beer.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;なので隣のビアホールへ、チケット6枚でした。&lt;/p&gt;
&lt;p&gt;&lt;img alt="watermelon" src="https://rn4ru.com/blog/images/watermelon.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;最後のデザートはスイカ。チケット4枚全部使いました。&lt;/p&gt;
&lt;p&gt;&lt;img alt="watermelon2" src="https://rn4ru.com/blog/images/watermelon2.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;ごちそうさまでした。&lt;/p&gt;
&lt;p&gt;ほとんどの屋台がメイン(チケット8-12枚)と、一口用(2-5枚)の食べ物を用意してくれているので、
いろんな食べ物にトライすることもできるし、メインをがっつり食べることもできます。
それにしてもめちゃくちゃ暑かったです。&lt;/p&gt;
&lt;p&gt;&lt;img alt="chic4go" src="https://rn4ru.com/blog/images/chic4go.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;おまけ。帰りに見つけたとても親近感のわくシカゴのロゴ。rn4ru的な意味で。&lt;/p&gt;</summary><category term="festival"></category><category term="Chicago"></category></entry><entry><title>Can you talk about Japanese political system in English?</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/can-you-talk-about-japanese-political-system-in-english/" rel="alternate"></link><published>2013-07-11T19:41:41-05:00</published><updated>2013-07-11T19:41:41-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-07-11:blog/posts/can-you-talk-about-japanese-political-system-in-english/</id><summary type="html">&lt;p&gt;この前、友人と食事に行った時に時期柄もあるのだろうけど日本の政治と
選挙システムの話題になった。日本でさえも政治の話なんかしたことないのに
加えて、英単語が出てこなくて焦る。というわけで英単語のお勉強。&lt;/p&gt;


&lt;p&gt;こんなときWikipediaはいいリソース。1つの記事がいろんな言語で翻訳されてる。
世間話くらいならちょっとくらい情報が不確かでもいいんじゃないの。&lt;/p&gt;
&lt;p&gt;なになに、国会は&lt;a href="http://en.wikipedia.org/wiki/National_Diet"&gt;National Diet&lt;/a&gt;というらしい。Dietには食事という意味もあるけど議会という意味もあるのね。
ちなみにアメリカではCongress。&lt;/p&gt;
&lt;p&gt;衆議院はThe House of Representativesで参議院はThe House of Councillors。
今回の比例選挙、非拘束名簿式は(the most) open listというらしい。&lt;/p&gt;
&lt;p&gt;英単語だけを考えてると内閣からgovernmentもとっさにはでてこない。連立政権はCoalition government。
ねじれ国会はぱっと見英語版の記事がなかったので、スペースアルクの&lt;a href="http://eow.alc.co.jp/search?q=%e3%81%ad%e3%81%98%e3%82%8c%e5%9b%bd%e4%bc%9a&amp;amp;ref=sa"&gt;“ねじれ国会”の検索結果&lt;/a&gt;へ、
the twisted Dietってホントか〜？&lt;/p&gt;
&lt;p&gt;三権分立は立法(the legislation)、行政(the exective)、司法(the judiciary)と、まあこのへんにしておいて、
日本のWikipediaの記事から英語の記事に飛ぶのはなかなかおもしろいのでオススメです。&lt;/p&gt;
&lt;p&gt;で。そのときはどうしたかというと、幸いその友人が日本語をよく知っていたので「コッカイ」とか
「サンギイン」とか交えながらすすめたけど、いまいちよくわからなかっただろうなあ。
興味を持ってくれるのは嬉しいことなので、選挙が終わったら改めて話してみよう。&lt;/p&gt;</summary><category term="english"></category></entry><entry><title>Enhance your Day One journals with Slogger</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/enhance-your-day-one-journals-with-slogger/" rel="alternate"></link><published>2013-07-09T19:18:00-05:00</published><updated>2013-07-09T19:18:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-07-09:blog/posts/enhance-your-day-one-journals-with-slogger/</id><summary type="html">&lt;p&gt;日記アプリのDay One、&lt;a href="https://itunes.apple.com/jp/app/day-one-journal-diary/id421706526?mt=8&amp;amp;uo=4"&gt;iOS版&lt;/a&gt;が7月9日現在無料になってるんだけど、
&lt;a href="https://itunes.apple.com/jp/app/day-one/id422304217?mt=12&amp;amp;uo=4"&gt;Mac版&lt;/a&gt;とSloggerというユーティリティを組み合わせることで、
色んな物を自動的に記録することができるよ、という話。
&lt;/p&gt;
&lt;p&gt;&lt;img alt="Day One Icon" src="https://rn4ru.com/blog/images/dayone.png" /&gt;
&lt;img alt="Slogger Icon" src="https://rn4ru.com/blog/images/slogger.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://brettterpstra.com/projects/slogger/"&gt;Slogger&lt;/a&gt;というのはMarkdownビューワの&lt;a href="http://markedapp.com/"&gt;Marked&lt;/a&gt;を開発した
&lt;a href="http://brettterpstra.com/"&gt;Brett Terpstra&lt;/a&gt;氏が作ったコマンドラインユーティリティ。&lt;/p&gt;
&lt;p&gt;Sloggerを使うと、さまざまなプラグインを利用することで、1日のツイートやRSS、
その日に終わらせたタスクなど、何から何まで全てをDay Oneのジャーナルに集約することができる。&lt;/p&gt;
&lt;p&gt;デフォルトで対応してるのは、以下のとおり。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Github&lt;/li&gt;
&lt;li&gt;Flickr&lt;/li&gt;
&lt;li&gt;Last.fm&lt;/li&gt;
&lt;li&gt;Blog entries&lt;/li&gt;
&lt;li&gt;RSS Feeds&lt;/li&gt;
&lt;li&gt;Twitter&lt;/li&gt;
&lt;li&gt;Instapaper&lt;/li&gt;
&lt;li&gt;Foursquare&lt;/li&gt;
&lt;li&gt;Pinboard&lt;/li&gt;
&lt;li&gt;Pocket&lt;/li&gt;
&lt;li&gt;Goodreads&lt;/li&gt;
&lt;li&gt;App.net&lt;/li&gt;
&lt;li&gt;OmniFocus complete tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Install&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;SloggerのプロジェクトをGithubから&lt;a href="http://github.com/ttscoff/Slogger"&gt;ダウンロード&lt;/a&gt;(cloneでもおｋ)して解凍。
そのディレクトリをどこでも好きなところに置く。&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ターミナルでそのディレクトリに移動した後、以下のコマンドを入力。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo gem install bundler
bundle install
&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;デフォルトのプラグインは/plugins/に置いてあるので、その他必要なものを/plugins_disabled/から持ってきたり、
逆に不必要なものを移動させたり。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最初はコンフィグファイルを作る必要があるのでターミナルで以下のコマンドを入力。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;./slogger --update-config
&lt;/pre&gt;&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;できたslogger_configに必要項目を設定していく。"storage:"、 "image_filename_is_title:"、"date_format:"、"time_format:"の4つは必須項目。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;"storage:"は"icloud"、&lt;a href="http://www.dropbox.com/"&gt;Dropbox&lt;/a&gt;に同期されてるDay Oneのファイル
(例えば/Users/username/Dropbox/Apps/DayOne/Journal.dayone)、またはmarkdownファイルと
画像を保存するフォルダから選べる。
Day OneをiCloudで同期する設定にして、iCloudを選ぶのが一番簡単。&lt;/p&gt;
&lt;p&gt;"image_filename_is_title:"はtrue/falseで、インポート時にファイル名を画像のタイトルにするかどうか。&lt;/p&gt;
&lt;p&gt;"date_format:"と"time_format:"は&lt;a href="http://doc.ruby-lang.org/ja/1.9.3/method/Date/i/strftime.html"&gt;strftime&lt;/a&gt;の書式にそって好きなように設定できる。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;その他、プラグインごとに必要な設定を埋めるんだけど、
例えばユーザ名とかRSSのURLとか、そんなに難しいこともないはず。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;設定し終わったら、次からSloggerを起動(ターミナルで./slogger)する毎に
指定した項目が勝手にジャーナルに書き込まれる。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;確かTwitterだけoAuthの関係で初回にインタラクティブに認証する必要があるはず、
でもそれもコマンドの指示に従っていれば問題ないです。&lt;/p&gt;
&lt;p&gt;毎回手動で起動するのもかったるいので、OSのサービスに登録するスクリプトもオマケでついてくる。
install.rbがそれで、実行すると毎日午後11時50分にSloggerが自動起動するようになる。
アンインストールしたいときは/Library/LaunchAgents/com.brettterpstra.slogger.plistを削除すればおｋ。&lt;/p&gt;
&lt;p&gt;その他オプションなど詳しいことは本家の&lt;a href="http://brettterpstra.com/projects/slogger/"&gt;ドキュメント&lt;/a&gt;を読んで下さい。
自分はダウンロードしたそのままといくつかプラグイン入れて使ってるけど特に不自由ないです。&lt;/p&gt;
&lt;p&gt;本文で使用したDay Oneの画像は&lt;a href="http://apple-operation.com/mac-how-to-use/mac%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3%E7%94%BB%E5%83%8F%E3%82%92%E3%81%82%E3%81%A3%E3%81%A8%E3%81%84%E3%81%86%E9%96%93%E3%81%AB%E4%BD%9C%E6%88%90/"&gt;Macアプリのアイコン画像をあっという間に作成 | MacとiPhoneたまにWindows&lt;/a&gt;
を参考にしました。&lt;/p&gt;</summary><category term="slogger"></category><category term="dayone"></category></entry><entry><title>Extend html head with Jinja2</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/extend-html-head-with-jinja2/" rel="alternate"></link><published>2013-07-08T16:24:00-05:00</published><updated>2013-07-08T16:24:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-07-08:blog/posts/extend-html-head-with-jinja2/</id><summary type="html">&lt;p&gt;ちょくちょくPelicanのテンプレートいじったりしてるんだけど、
記事が個別に表示されるときだけFBのOGPタグを出したかったのでちょっと調べた。&lt;/p&gt;
&lt;p&gt;PelicanはJinjaというDjangoに影響されたらしいテンプレートエンジンを使ってるので、
まあその&lt;a href="http://jinja.pocoo.org/docs/templates/#template-inheritance"&gt;ドキュメント&lt;/a&gt;を見ればいいかなと。&lt;/p&gt;


&lt;p&gt;なんでもbase.htmlに書いてあるheadタグ内に継承先から追記することができるらしい。
つまりbase.html冒頭が以下の様な感じだったら、&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;block&lt;/span&gt; &lt;span class="nv"&gt;head&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;rn4ru diary&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!-- 以下略 --&amp;gt;&lt;/span&gt;
    &lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;endblock&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;継承先のarticle.htmlでは&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;extends&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;base.html&amp;quot;&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;block&lt;/span&gt; &lt;span class="nv"&gt;head&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- 追記したい内容をここに --&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;{%&lt;/span&gt; &lt;span class="k"&gt;endblock&lt;/span&gt; &lt;span class="cp"&gt;%}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;という風にheadブロック内に追記することができる。
&lt;code&gt;{{ super() }}&lt;/code&gt;というのは継承元(つまりbase.html)のheadの中身をそのまま出力してるみたい。&lt;/p&gt;
&lt;p&gt;最初base.htmlに&lt;code&gt;{% block head %}&lt;/code&gt;が書かれてなくてハマったのでメモ。&lt;/p&gt;</summary><category term="Jinja2"></category><category term="snippet"></category><category term="pelican"></category></entry><entry><title>Remove invalid Characters from RSS XML</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/remove-invalid-characters-from-rss-xml/" rel="alternate"></link><published>2013-07-06T12:55:00-05:00</published><updated>2013-07-06T12:55:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-07-06:blog/posts/remove-invalid-characters-from-rss-xml/</id><summary type="html">&lt;p&gt;このブログの生成には&lt;a href="http://docs.getpelican.com/en/3.2/"&gt;Pelican&lt;/a&gt;っていうサイトジェネレーターを使ってるんだけど、
生成されたRSSをブラウザで見ると、なんかエラーがでてたので調べてみた。&lt;/p&gt;


&lt;p&gt;&lt;a href="http://stackoverflow.com/questions/12229572/php-generated-xml-shows-invalid-char-value-27-message"&gt;character encoding - PHP generated XML shows invalid Char value 27 message - Stack Overflow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;なんでも、XMLで使えないUTF-8文字が含まれてるときに出るエラーらしく、
それをすべて置換しないといけないらしい。&lt;/p&gt;
&lt;p&gt;とりあえず解答にのってるPHPコードみたいなのを生成後に走らせたら出なくなったので、
解決？したのかよくわからないけど、まあ直ったからいいか。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bak&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;CIO&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;nlp&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;s/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+//g&amp;#39;&lt;/span&gt; &lt;span class="sr"&gt;/path/&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="sr"&gt;/feeds/&lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="n"&gt;xml&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Perlのワンライナーについては&lt;a href="http://blog.livedoor.jp/dankogai/archives/51026593.html"&gt;こちら&lt;/a&gt;を参考にさせてもらいました。&lt;/p&gt;</summary><category term="perl"></category><category term="snippet"></category><category term="pelican"></category></entry><entry><title>Independence Day</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/independence-day/" rel="alternate"></link><published>2013-07-04T08:46:00-05:00</published><updated>2013-07-04T08:46:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-07-04:blog/posts/independence-day/</id><summary type="html">&lt;p&gt;今日はアメリカの独立記念日、Independence Dayなので、お決まりのこの動画でもどうぞ。
&lt;/p&gt;
&lt;iframe width="420" height="315" src="//www.youtube-nocookie.com/embed/f-beyMTEBys" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;関連動画は&lt;a href="http://youtu.be/VezP6yqhs9k"&gt;こちら&lt;/a&gt;。&lt;/p&gt;</summary><category term="video"></category></entry><entry><title>Timeout for reading input from System.in</title><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link href="https://rn4ru.com/blog/posts/timeout-for-reading-input-from-systemin/" rel="alternate"></link><published>2013-07-02T18:17:00-05:00</published><updated>2013-07-02T18:17:00-05:00</updated><author><name>rn4ru</name></author><id>tag:rn4ru.com,2013-07-02:blog/posts/timeout-for-reading-input-from-systemin/</id><summary type="html">&lt;p&gt;BufferedReader.readline()ってスレッドをブロックするから途中で処理やめることできなくて嫌だよね、って話がグループ内で話題になったので調べてみると、BufferedReader.ready()でI/O待ちするかどうかを判断できることを知ったのでとりあえずサンプルコード。&lt;/p&gt;


&lt;p&gt;タイムアウトを10秒に設定して入力待ち。&lt;/p&gt;
&lt;p&gt;例外処理なんかは適当に。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;IOException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InterruptedException&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;BufferedReader&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BufferedReader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;InputStreamReader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;timeout&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;Calendar&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Calendar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Calendar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SECOND&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Calendar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;before&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;)){&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ready&lt;/span&gt;&lt;span class="o"&gt;()){&lt;/span&gt;
            &lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readLine&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sleep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;参考: &lt;a href="http://www.javaspecialists.eu/archive/Issue153.html"&gt;[JavaSpecialists 153] - Timeout on Console Input&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;記事のタイトルは日本語よりも英語のほうが見栄えがいいみたい。フォントの問題だろうけど、細かく見る気力なし。&lt;/p&gt;</summary><category term="java"></category></entry></feed>
