tag:blogger.com,1999:blog-15788657948017423292024-02-22T02:18:37.873+09:00Yet Another...Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.comBlogger19125tag:blogger.com,1999:blog-1578865794801742329.post-36071186695477827202015-02-16T19:48:00.002+09:002015-02-16T20:43:08.399+09:00PSGI Server がリクエストボディをどうしているのか知りたくなったので…<h4>
背景</h4>
<div>
諸般の事情により(お察しください)、巨大なファイル(おおむね2GB以上)が HTTP で POST された場合に、PSGIでどのように処理されるのかを調べてみましたよ。</div>
<div>
観点としては、PSGIより下のレイヤー(PSGI server)でリクエストボディをどのように扱っているのかを調査。全体をバッファリングしてしまうのか、またボディの読み込みを遅延(あるいは拒否)できるのかを確認した。</div>
<div>
<br /></div>
<div>
また、想定しているシステムの temp 領域がかなり小さいということもあって、PSGI app の中で HTTP ヘッダの内容にもとづいてボディの扱いを変えたい(指定したディスクにバッファリングするのか、それともそもそもボディを無視するのか)。そのため、バッファリングが遅延できるようになっていると嬉しい。</div>
<h4>
結論</h4>
<div>
総じていうと、 <a href="https://metacpan.org/pod/Stream::Buffered">Stream::Buffered</a> を使って事前にリクエストボディ全体をバッファリングしてしまう方法がスタンダード。(Starman から発祥し、Starletで固められたコードが決定版的な扱いになっている)</div>
<div>
<br /></div>
<div>
Stream::Buffered の挙動として、デフォルトでは 1MB まではメモリにバッファし、それ以上は tempfile に書き出してバッファリングするようになっている。($Stream::Buffered::MaxMemoryBufferSize で調整可能)</div>
<div>
See Also: <a href="https://metacpan.org/source/DOY/Stream-Buffered-0.03/lib/Stream/Buffered.pm">https://metacpan.org/source/DOY/Stream-Buffered-0.03/lib/Stream/Buffered.pm</a></div>
<div>
<br /></div>
<div>
PSGI app が呼ばれる前にバッファリングされてしまうので、メモリかディスクにボディ全体が一度保存されるのは避けられない模様(´・ω・`)</div>
<div>
<br /></div>
<div>
以下、それぞれの実装の該当箇所への参照とメモ↓</div>
<h4>
Starman</h4>
<div>
このあたり↓</div>
<div>
<a href="https://metacpan.org/source/MIYAGAWA/Starman-0.4011/lib/Starman/Server.pm#L412">https://metacpan.org/source/MIYAGAWA/Starman-0.4011/lib/Starman/Server.pm#L412</a></div>
<div>
<br /></div>
<div>
Plack::TempBuffer を使っているけど、現在 Plack::TempBuffer は Stream::Buffered のエイリアスになっているため上述の挙動となる。</div>
<h4>
<b>Starlet</b></h4>
<div>
このあたり↓</div>
<div>
<a href="https://metacpan.org/source/KAZUHO/Starlet-0.24/lib/Starlet/Server.pm#L287">https://metacpan.org/source/KAZUHO/Starlet-0.24/lib/Starlet/Server.pm#L287</a></div>
<div>
<br /></div>
<div>
Plack::TempBuffer を利用。Starman とだいたい同じ。</div>
<h4>
<b>Monoceros</b></h4>
<div>
このあたり↓</div>
<div>
<a href="https://metacpan.org/source/KAZEBURO/Monoceros-0.27/lib/Monoceros/Server.pm#L796">https://metacpan.org/source/KAZEBURO/Monoceros-0.27/lib/Monoceros/Server.pm#L796</a></div>
<div>
<br /></div>
<div>
Plack::TempBuffer を利用。Starman とだいたい同じ、というか Starlet のコードをそのまま使ってますね。</div>
<div>
<h4>
<b>Gazelle</b></h4>
<div>
このあたり↓</div>
<div>
<a href="https://metacpan.org/source/KAZEBURO/Gazelle-0.22/lib/Plack/Handler/Gazelle.pm#L145">https://metacpan.org/source/KAZEBURO/Gazelle-0.22/lib/Plack/Handler/Gazelle.pm#L145</a></div>
</div>
<div>
<br /></div>
<div>
Stream::Buffered を利用。Stream::Buffered を使っている以外は、ほぼ Starlet のコードそのまま。 </div>
<h4>
<b>Twiggy</b></h4>
<div>
このあたり↓</div>
<div>
<a href="https://metacpan.org/source/MIYAGAWA/Twiggy-0.1025/lib/Twiggy/Server.pm#L296">https://metacpan.org/source/MIYAGAWA/Twiggy-0.1025/lib/Twiggy/Server.pm#L296</a></div>
<div>
<br /></div>
<div>
PerlIOを利用して、すべてオンメモリにバッファリングしている。</div>
<div>
ちなみに、リクエストの chunked エンコーディングには対応していないようだ(´・ω・`)</div>
<h4>
<b>Feersum</b></h4>
<div>
や、やばい…何やってるのか全然理解できない…</div>
<div>
タンさんのコードが天才的すぎるのか…((((;゚Д゚))))</div>
<div>
<h4>
追記: AnyEvent::HTTPD</h4>
ついでに <a href="https://metacpan.org/pod/AnyEvent::HTTPD">AnyEvent::HTTPD</a> も読んでみた。このへん↓<br />
<a href="https://metacpan.org/source/AnyEvent::HTTPD::HTTPConnection#L352">https://metacpan.org/source/AnyEvent::HTTPD::HTTPConnection#L352</a><br />
<br />
Content-length 分だけ丸っとメモリに読み込んでいますね。<br />
ちなみに、chunked エンコーディングには対応していない様子。<br />
<br />
他にも読むべき PSGI Server があったら教えてください><<br />
<br /></div>
Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com0tag:blogger.com,1999:blog-1578865794801742329.post-67489525055171939422013-09-25T03:03:00.003+09:002013-10-06T00:55:30.209+09:00YAPC::Asia Tokyo 2013 に行ってきたので、Log::Minimal::Indent というモジュールを公開したという話<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHN53V1VFagZ3IM8LyMB6RG7SsLW-Zx_iGSLfCX3gJsxv7cnl8LUb_rcBdx0p0ilkR_W3oC2wW4z3NoC5pvURYs4uCQPqkKXBXKHdZ3QpauukkYYKXrw54SkbY9SBGxieVu3u68iiMopc/s1600/IMG_20130920_095634.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHN53V1VFagZ3IM8LyMB6RG7SsLW-Zx_iGSLfCX3gJsxv7cnl8LUb_rcBdx0p0ilkR_W3oC2wW4z3NoC5pvURYs4uCQPqkKXBXKHdZ3QpauukkYYKXrw54SkbY9SBGxieVu3u68iiMopc/s400/IMG_20130920_095634.jpg" width="400" /></a></div><br />
2年ぶりに YAPC::Asia Tokyo に参加してきました!<br />
<br />
一時は参加も危ぶまれましたが、皆さまのお力添えもあって、無事に参加することができました。ありがとうございましたm(_ _)m<br />
<br />
また、YAPCに関わっていたすべての皆様、お疲れ様でした><!<br />
<br />
……というのが既に先週末で、時すでに水曜日というこの体たらくなわけですが、<br />
<blockquote class="twitter-tweet">今回も楽しかった! さて、まだまだ終わってないですよ。ブログを書くまでがYAPCですからね><! <a href="https://twitter.com/search?q=%23yapcasia&src=hash">#yapcasia</a><br />
— yet another (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/statuses/381354147078893568">September 21, 2013</a></blockquote><script async="" charset="utf-8" src="//platform.twitter.com/widgets.js"></script><br />
というわけで、ブログ書きますよ><!<br />
<a name='more'></a><br />
<br />
今年は、回を重ねるごとにアツくなるAcme大全をゲットしたり、ついでに会場でエロ本と話題だった<a href="http://kazhiramatsu.hatenablog.com/entry/2013/08/07/132842">薄い本</a>を買ったりと、まずは物質的な面で大充実のYAPCでした。<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kaz_hiramatsu/20130807/20130807130256.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="222" src="http://cdn-ak.f.st-hatena.com/images/fotolife/k/kaz_hiramatsu/20130807/20130807130256.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">噂の薄い本、こと『雅なPerl入門』。これはエロい!<br />
と見せかけておいて、<br />
実はガチなポストモダンPerl入門書だったりする。</td></tr>
</tbody></table>Acme大全は、果たして読み終わることができるのか、よくわかりません。<br />
<br />
それから、たまたま最近、仕事の開発の上で GitHub をどう使うべきかねぇ…というのが職場で話題になっていたので、その手のセッションを狙って聞きにいってました。<br />
<br />
わかってはいたことですが、この界隈の GitHub 採用率は高いですね。<br />
まさに開発プラットフォームのデファクト・スタンダード。<br />
<br />
ちなみに自分の職場でも GitHub を採用しているのですが、人数10人にも満たない子会社ということもあり、GitHub Enterprise ではなく GitHub Business を使っています。<br />
なるべくサーバのお守りはアウトソースしたいですし、たまに GitHub が停まっててもクリティカルになるようなプログラムは運用はしていないし、ぶっちゃけ Enterprise を導入するほどの予算もない!<br />
<br />
Enterpriseでなくても、今のところまったく困ってはいません。<br />
むしろ、自前で SVNサーバを立てていたころと比べると、管理・運用の手間がものすっごく楽になりました。<br />
<br />
YAPCで聞いた話は色々勉強になりましたが、<a href="http://onishi.hatenablog.com/entry/2013/09/21/133132">@yasuhiro_onishiさんのセッション</a>を聞いて、やはり GitHub Issue をそのまま Scrum のバックログのように運用するのは無理だな、とか思いました。<br />
<br />
結局、職場で問題になっていたのは、GitHub Issue を完全に順序付けされたリストとして使うことができないこと + 簡単に並び替えできないことなんですよね。<br />
<br />
Onishiさんのセッションでは、結局はマネージャーが別に線表を管理しているという話だったので、結局はツールの二重化が必要ということでしょうかね。<br />
よくある、マネージャーがチケットとは別にストーリーリストをExcelで管理しているのと同じですね。<br />
まぁ、マネージャー1人が頑張ればすむ話で、開発者に負担がかかるわけではないですか、それはそれで良いのかも。<br />
<br />
といいつつ、弊社の場合は自分がマネージャーに相当するので、なんとか多重管理をさけたい><!というのが本音なのですけど。<br />
ここら当たり、自分の仕事を便利かするツールを作りたいな〜、と久々にふつふつとプログラミング欲が湧いてまいりました。<br />
<br />
が、そんなこととは関係なく(ぇ、<a href="http://lestrrat.ldblog.jp/archives/33304423.html">@lestrrat さんのセッション</a>で「ログ出力するのマジ大事、あとログ出力を階層化するの大事」という話を聞いて、激しく同意したので、Log::Minimal でインデントを補助するためのモジュールを書いてみました。<br />
<br />
さっさと書き終えるつもりだったのに、月曜日から台湾出張でバタバタしていたので、時間がかかってしまいました……というわけで、まさかの台北市からのコミットです。<br />
<br />
まだちゃんとテストを書いていないので、CPAN には上げずに、とりあえず <a href="https://github.com/Maki-Daisuke/p5-Log-Minimal-Indent">GitHub に公開してあります</a>。<br />
<br />
まぁ、Synopsis を見ての通りなのでが、こんなかんじでインデントができますよ:<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; font-family: Consolas, 'Liberation Mono', Courier, monospace; margin: 0px; padding: 0px;">use Log::Minimal::Indent;
infof("Level zero");
{
indent_log_scope("foo"); # Indent forward one level in this block.
warnf "Something to warn";
{
indent_log_scope("bar", "MUTE"); # You can mute enter/exit message.
critf "Something critical happens!";
}
infof "Indent back here";
}
infof("Level zero again");</code></pre>こんなかんじの出力になります↓<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 13px; line-height: 19px; margin-bottom: 15px; margin-top: 15px; overflow: auto; padding: 6px 10px;"><code style="background-color: transparent; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: none; font-family: Consolas, 'Liberation Mono', Courier, monospace; margin: 0px; padding: 0px;">2013-09-23T11:39:19 [INFO] Level zero
2013-09-23T11:39:19 [INFO] <Entering foo>
2013-09-23T11:39:19 [WARN] Something to warn
2013-09-23T11:39:19 [CRITICAL] Something critical happens!
2013-09-23T11:39:19 [INFO] Indent back here
2013-09-23T11:39:19 [INFO] <Exited foo>
2013-09-23T11:39:19 [INFO] Level zero again</code></pre>あと、今回はじめて Minilla を使ってモジュール書き始めたので、何か間違っているかも……<br />
<br />
<h3>それはともかく…</h3><br />
俺、前回のブログ記事ポストしてから、結婚したり名古屋に転勤になったり、色々ありすぎだろう……そういうことこそブログに書いとけよ…とか思いました。<br />
<br />
とりあえず、YAPCの熱が冷めやらず、Nagoya.pm に参加したいとか思っている今日このごろです。<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDygAydZnMSOW3U0afjOGXstvCi70pl0XrqhkCpHhyYjmiXfvS0gMPVE5RwEUgCa_7NslVsxCM97lcNRYDjh-TcSP5dzU1Xzwd1bhL54pE-2YNdQjNRYddATfuM1Boe7P0zSGk5OCgxC8/s1600/IMG_20130921_145458.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDygAydZnMSOW3U0afjOGXstvCi70pl0XrqhkCpHhyYjmiXfvS0gMPVE5RwEUgCa_7NslVsxCM97lcNRYDjh-TcSP5dzU1Xzwd1bhL54pE-2YNdQjNRYddATfuM1Boe7P0zSGk5OCgxC8/s320/IMG_20130921_145458.jpg" width="240" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">個人スポンサーとして提灯に名入れしてくれました<br />
提灯はあとでスタッフがおいしく…もとい、ありがたく持って帰ってきました</td></tr>
</tbody></table>Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com0tag:blogger.com,1999:blog-1578865794801742329.post-1879331585344183482012-10-30T13:49:00.001+09:002012-10-30T13:51:43.796+09:00Surfaceのファーストインプレッションをまとめたので…<blockquote class="twitter-tweet" lang="ja"><p>Surface買ったよー! <a href="http://t.co/b9ecddyV" title="http://twitter.com/Maki_Daisuke/status/261986144546336769/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/261986144546336769" data-datetime="2012-10-27T00:22:20+00:00">10月 27, 2012</a></blockquote><p> いきおいに任せてSurfaceを買ってしまいましたよっと。</p><p> 「周辺機器メーカー勤務者たるもの、つねに新しいものにふれて勉強しないとね!」などという言い訳をしつつ、発売日に購入してしまいました。断っておきますが、ちゃんと自腹です。だって、自腹じゃないと胸を張って人に自慢できないし、自腹ならずっと自分が使っていても誰に気兼ねすることもありませんしね!</p><p> というわけで、Surface開封の儀から、リアルタイムでつぶやいていたツイートをまとめ代わりに貼っておきますよっと。</p><a name='more'></a><br />
<h4>開封~設定編</h4><blockquote class="twitter-tweet" lang="ja"><p>Surface開けるでー!ちなみに、カバーはメカニカルキーボードのtype coverのほうを買いました <a href="http://t.co/6gLhRPiz" title="http://twitter.com/Maki_Daisuke/status/262029735436115968/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262029735436115968" data-datetime="2012-10-27T03:15:33+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>開封〜ちなみに、右上にあるのはNexus7です <a href="http://t.co/FCIlEBC8" title="http://twitter.com/Maki_Daisuke/status/262030216828956672/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262030216828956672" data-datetime="2012-10-27T03:17:27+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>起動! <a href="http://t.co/hDxlsi75" title="http://twitter.com/Maki_Daisuke/status/262030533159157762/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262030533159157762" data-datetime="2012-10-27T03:18:43+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>言語は3つしかありません>< <a href="http://t.co/RdwVOdl0" title="http://twitter.com/Maki_Daisuke/status/262038952222003200/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262038952222003200" data-datetime="2012-10-27T03:52:10+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>言語を選んだらパーソナライズです。色が変えられます。それだけ……。PC nameのexampleがliving-pcとかなってるのはご愛嬌w <a href="https://twitter.com/search/%23Surface">#Surface</a> <a href="http://t.co/REED5HyV" title="http://twitter.com/Maki_Daisuke/status/262039708870246400/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262039708870246400" data-datetime="2012-10-27T03:55:10+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>でも文字が打ちにくい><!そこで、キーボードを装着ですよ!こうなるともう、ほとんどノートPC! <a href="https://twitter.com/search/%23Surface">#Surface</a> <a href="http://t.co/XlZlRwzz" title="http://twitter.com/Maki_Daisuke/status/262040170558271488/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262040170558271488" data-datetime="2012-10-27T03:57:01+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>使い始める前にUpdateをやっておきまーす <a href="https://twitter.com/search/%23Surface">#Surface</a> <a href="http://t.co/rJ0xDvb9" title="http://twitter.com/Maki_Daisuke/status/262040768158515200/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262040768158515200" data-datetime="2012-10-27T03:59:23+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>アップデートの間、使い方ビデオがながれてます <a href="https://twitter.com/search/%23Surface">#Surface</a> <a href="http://t.co/g86eOEAS" title="http://twitter.com/Maki_Daisuke/status/262041260968255488/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262041260968255488" data-datetime="2012-10-27T04:01:20+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>Windows8 キタ━(゚∀゚)━! <a href="https://twitter.com/search/%23Surface">#Surface</a> <a href="http://t.co/WyxULdyV" title="http://twitter.com/Maki_Daisuke/status/262041901987950592/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262041901987950592" data-datetime="2012-10-27T04:03:53+00:00">10月 27, 2012</a></blockquote><p>※正確にはWindows RTです</p><h4>おさわり編</h4><blockquote class="twitter-tweet" lang="ja"><p>Office 2013 Previewがデフォでついてます。これだけでバリバリ仕事できちゃいそうです><; <a href="https://twitter.com/search/%23Surface">#Surface</a> <a href="http://t.co/4GsHCIkE" title="http://twitter.com/Maki_Daisuke/status/262042274639273984/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262042274639273984" data-datetime="2012-10-27T04:05:23+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>やはり、バリバリ使おうと思うとストレージが少ない、かな。ちなみに購入したのは32GBモデルです <a href="http://t.co/UEkesYcw" title="http://twitter.com/Maki_Daisuke/status/262042629120864257/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262042629120864257" data-datetime="2012-10-27T04:06:47+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>デスクトップはWindiws!ってかんじですね。普通にWin+DとかWin+Eとかのショートカットも効きますw <a href="https://twitter.com/search/%23Surface">#Surface</a> <a href="http://t.co/WioZVubZ" title="http://twitter.com/Maki_Daisuke/status/262044952505249792/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262044952505249792" data-datetime="2012-10-27T04:16:01+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>アプリストアです。なぜか検索ができません><; <a href="https://twitter.com/search/%23Surface">#Surface</a> <a href="http://t.co/rX3Uczlo" title="http://twitter.com/Maki_Daisuke/status/262046887929081856/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262046887929081856" data-datetime="2012-10-27T04:23:42+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>Video。ガンダムUCがある!さすがXboxストア! <a href="https://twitter.com/search/%23Surface">#Surface</a> <a href="http://t.co/owlon00g" title="http://twitter.com/Maki_Daisuke/status/262047129093148674/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262047129093148674" data-datetime="2012-10-27T04:24:39+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>すげぇ、Kindleある!さすがAmazon。でも、Amazon日本のアカウントではログインできませんでした。たぶん、日本のコンテンツもまだアクセスできないと思われ <a href="https://twitter.com/search/%23Surface">#Surface</a> <a href="http://t.co/dcO7hpWH" title="http://twitter.com/Maki_Daisuke/status/262048378748293120/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262048378748293120" data-datetime="2012-10-27T04:29:37+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>日本語入力が入ってないので、Google IMEをインストールしてみちゃうぜー <a href="https://twitter.com/search/%23Surface">#Surface</a> <a href="http://t.co/ev9GEAWr" title="http://twitter.com/Maki_Daisuke/status/262053487653842945/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262053487653842945" data-datetime="2012-10-27T04:49:56+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>っと思ったら、実行できませんでした(´・ω・`) <a href="https://twitter.com/search/%23Surface">#Surface</a> <a href="http://t.co/av4u7qCm" title="http://twitter.com/Maki_Daisuke/status/262053727488335872/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262053727488335872" data-datetime="2012-10-27T04:50:53+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>Chromeも当然のようにインストールできません。これは恐らく、CPUのアーキテクチャが違うからですね。世に溢れているWindowsアプリは、基本x86バイナリなので、ARMのWindowsRTで動かないのは当然。 <a href="http://t.co/ZxbiijPB" title="http://twitter.com/Maki_Daisuke/status/262071255371485184/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262071255371485184" data-datetime="2012-10-27T06:00:32+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>ちなみに、CPUとかのスペックはこんなかんじです <a href="https://twitter.com/search/%23Surface">#Surface</a> <a href="http://t.co/wCWOYwK2" title="http://twitter.com/Maki_Daisuke/status/262072029707116544/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262072029707116544" data-datetime="2012-10-27T06:03:36+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>さすがMSが親会社だけあって、Skypeはもうストアにあります!早速インストールします <a href="https://twitter.com/search/%23Surface">#Surface</a> <a href="http://t.co/Y2VTLuwa" title="http://twitter.com/Maki_Daisuke/status/262072102209875968/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262072102209875968" data-datetime="2012-10-27T06:03:54+00:00">10月 27, 2012</a></blockquote><h4>@kimitakeさん登場編</h4><p> できないと思っていたことは、どこからともなく現れた @kimitakeさんがだいたい教えてくれました。感謝!</p><blockquote class="twitter-tweet" data-in-reply-to="262046887929081856" lang="ja"><p>@<a href="https://twitter.com/maki_daisuke">maki_daisuke</a> 画面右の方からスワイプインするとスタートとかのボタンでてきますけどその一番上の検索でできませんか?</p>— ǝʞɐʇıɯıʞ @絶賛N型発病中さん (@kimitake) <a href="https://twitter.com/kimitake/status/262050910077874176" data-datetime="2012-10-27T04:39:40+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" data-in-reply-to="262055958442803200" lang="ja"><p>@<a href="https://twitter.com/kimitake">kimitake</a> ホントだ!やべぇ、これ便利!!ありがとうございます><! <a href="https://twitter.com/search/%23Surface">#Surface</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262061060444524544" data-datetime="2012-10-27T05:20:00+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>日本語が使えると @<a href="https://twitter.com/kimitake">kimitake</a> さんが教えてくれたので、早速設定!MS IME が入った!日本語打てる!これで勝つる! <a href="http://t.co/ZqJy7fdj" title="http://twitter.com/Maki_Daisuke/status/262249393229537281/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262249393229537281" data-datetime="2012-10-27T17:48:23+00:00">10月 27, 2012</a></blockquote><p> おかげさまで日本語入力も使えるようになりました。<br />
というわけで、実はこのブログ記事もSurfaceで書いているんです!</p><blockquote class="twitter-tweet" data-in-reply-to="262219044130783233" lang="ja"><p>@<a href="https://twitter.com/kimitake">kimitake</a> ホントだ!MS IME使えるようになりました!ありがとうございます!っていうか、なんでそんなに詳しいんですか><?</p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262245839060226048" data-datetime="2012-10-27T17:34:14+00:00">10月 27, 2012</a></blockquote><p> そして右も左もわからない自分にひとしきり助言をくれるだけくれて、@kimitakeさんは正体を明かすこともなく去っていったのでした…カコイイ…</p><h4>充電編</h4><blockquote class="twitter-tweet" lang="ja"><p>Surfaceですっかり遊び疲れて寝落ちしてしまいました(;´Д`) 起きたのでちょっとだけ続き。</p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262246613718794241" data-datetime="2012-10-27T17:37:19+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>起きたらすっかりバッテリーが干上がっていたので充電しますよっと。これが充電コンセントです。 <a href="http://t.co/tPZnBBH3" title="http://twitter.com/Maki_Daisuke/status/262247388603891712/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262247388603891712" data-datetime="2012-10-27T17:40:25+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>接続部分はマグネット。アップルのMagsafeと同じです。Macbook Airのと並べてみました。小さいですね! <a href="http://t.co/QlObsHF4" title="http://twitter.com/Maki_Daisuke/status/262247761246842880/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262247761246842880" data-datetime="2012-10-27T17:41:54+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>巻き取ったケーブルを止めておくパーツもそっくり。さすがMS、パク……じゃない、リスペクトの仕方がハンパない <a href="http://t.co/PTmeNPv0" title="http://twitter.com/Maki_Daisuke/status/262248482755207168/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262248482755207168" data-datetime="2012-10-27T17:44:46+00:00">10月 27, 2012</a></blockquote><blockquote class="twitter-tweet" lang="ja"><p>ケーブルはここに付きます <a href="http://t.co/0PmJl6Cn" title="http://twitter.com/Maki_Daisuke/status/262248731271905280/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262248731271905280" data-datetime="2012-10-27T17:45:45+00:00">10月 27, 2012</a></blockquote><script src="//platform.twitter.com/widgets.js" charset="utf-8"></script><br />
<blockquote class="twitter-tweet" lang="ja"><p>これ、タブレットじゃなくて、超薄型・軽量のラップトップだと思ったほうがいんじゃね?とかルームメイトと話してます <a href="https://twitter.com/search/%23Surface">#Surface</a> <a href="http://t.co/YOvnsLkX" title="http://twitter.com/Maki_Daisuke/status/262043380513652736/photo/1">twitter.com/Maki_Daisuke/s…</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/262043380513652736" data-datetime="2012-10-27T04:09:46+00:00">10月 27, 2012</a></blockquote><p> というわけで、Surfaceファーストインプレッションいかがだったでしょうか?いきおいで勝った時は、「こんなモン買っちまって、マジで大丈夫か…?」などと不安を感じていたわけですが、使ってみると意外や意外、かなりの可能性を感じさせるカジェットに仕上がっています。</p><p> これはまだしばらくブログを書いてるうちに、だいぶんこのキーボードにも慣れてきました。これは、もうちょっと使ってみるしかなさそうです。</p><p> 早く日本でも発売するといいですね><!</p>Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com0tag:blogger.com,1999:blog-1578865794801742329.post-35136627085310171222012-09-10T15:35:00.000+09:002012-09-22T09:04:53.810+09:00QemuでARM上にDebianをインストールしたので…<p> 諸般の事情で、ARMの実行環境が欲しくなったので、<a href="http://qemu.org">Qemu</a>を使ってARM上のDebian Linux環境を用意しましたよ。<br />
</p><p> 基本的な方法としては、Qemuを使ってDebianのネットブートインストーラを使うだけなんだけど、ところどころハマったので、自分用にメモっときますよ。<br />
というわけで、以下メモ。<br />
</p><h4>教訓1: MacじゃなくてUbuntuを使う<a name='more'></a></h4><p> Mac上の(Homebrewでインストールした)Qemuがうまく動かなかったので、さっさとあきらめてUbuntuで作業することにしました。<br />
VMware Fusionで適当に仮想マシンを作成して、普通にインストール完了。<br />
Macの上にUbuntuの仮想マシンを用意して、さらにその上にQemuとか、豪勢な時代になったもんですね。<br />
</p><p> インストール対象がDebianなのに、なんでUbuntuなのか、とかはツッコまない方向で><!<br />
</p><h4>教訓2: Qemuを直接使う</h4><p> ここからはUbuntuの上で作業。<br />
まず、apt-getでQemuをインストールします:<br />
</p><pre class="brush:shell">$ sudo apt-get update
$ sudo apt-get install qemu qemu-kvm-extras
</pre><p> 今回インストールされたバージョンは 1.0.50 でした。<br />
</p><p> 本当はGUIで操作できるQemulatorを使おうと思ったんだけど、GUIがフリーズするわ、正しくイメージ作れないわ で、さんざんな目にあったので、おとなしくCUIでやることにします。<br />
まぁ、この手の作業にGUIはいりませんね…<br />
</p><h4>教訓3: ディスクイメージはrawで作成する</h4><p> DebianをインストールするQemuのディスクイメージを作成します。<br />
適当に10GBで作っておきます:<br />
<p><pre class="brush:shell">$ qemu-img create Debian-ARM.img 10G
Formatting 'Debian-ARM.img', fmt=raw size=10737418240
</pre><p> オプションでQemuの圧縮形式とか選べるのですが、ここではデフォルトのraw形式で作っておきます。あとでこれが重要になってきます!<br />
ちなみに、Ubuntuで普通にext4とか使っていれば、10GBのディスクイメージを作成しても、本当に利用されている領域しか物理ディスクには割り当てられないので、容量はそんなに気にしなくて大丈夫です↓<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE6YOt_IrKXVRadrvzRZofMN-j5W76MwnR5T3RD8EUyl6-8GWdUAmSvfL9pbOa7H4sc6FWvIPjO_zZUTgceTDomiaIrcFo0xmbBsIwk_DlY1pR0AI92B_x5_wde1R_EkTJFpdw81j5KsI/s1600/Screen+Shot+2012-09-09+at+22.10.55.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="206" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjE6YOt_IrKXVRadrvzRZofMN-j5W76MwnR5T3RD8EUyl6-8GWdUAmSvfL9pbOa7H4sc6FWvIPjO_zZUTgceTDomiaIrcFo0xmbBsIwk_DlY1pR0AI92B_x5_wde1R_EkTJFpdw81j5KsI/s320/Screen+Shot+2012-09-09+at+22.10.55.png" /></a></div><p> 実際には2GBもあれば足りるかと。<br />
qemu-img convert を使えば、あとで形式を変更することもできます。<br />
</p><h4>教訓4: インストールはネットブートで</h4><p> i386系の場合は、普通にインストールCDのISOイメージから起動すればインストールできると思うのですが、ARMの場合は起動するのにもLinuxカーネルがいるんです><<br />
幸いにも、Debian公式でARM用のネットブート用のファイルが配布されています。<br />
<a href="http://ftp.debian.org/debian/dists/wheezy/main/installer-armel/current/images/versatile/netboot/">ここ</a>でLinuxカーネル(vmlinuz)と、initrd2つのファイルを取得してください。<br />
</p><p> インストール前に、Qemu仮想マシンからネットワークが使えるように準備します。<br />
<a href="http://wwwdantyo.wordpress.com/qemu%E3%81%A7arm%E7%92%B0%E5%A2%83%E3%82%92%E6%89%8B%E3%81%AB%E3%81%84%E3%82%8C%E3%82%8B/">こちらの團長さんの記事</a>を参考に(っていうか、そのまま使わせていただいて)スクリプトを用意します。<br />
</p><div>/etc/qemu-ifup: </div><pre class="brush:shell">#!/bin/sh
echo "Executing /etc/qemu-ifup"
sudo /sbin/ifconfig $1 0.0.0.0 promisc up
echo "Adding $1 to br0..."
sudo /usr/sbin/brctl addif br0 $1
sleep 3
#switch=$(/sbin/ip route list | awk '/^default / { print $5 }')
#/sbin/ifconfig $1 0.0.0.0 up
#/usr/sbin/brctl addif ${switch} $1
</pre><div>/etc/qemu-ifdown: </div><pre class="brush:shell">#!/bin/sh
# NOTE: This script is intended to run in conjunction with qemu-ifup
# which uses the same logic to find your bridge/switch
sudo /usr/sbin/brctl delif br0 $1
sudo /sbin/ifconfig $1 down
#switch=$(/sbin/ip route list | awk '/^default / { print $5 }')
#/usr/sbin/brctl delif $switch $1
#/sbin/ifconfig $1 0.0.0.0 down
</pre><p> これで、準備完了です。<br />
ターミナルから以下のようにコマンドを入力します:<br />
</p><pre class="brush:shell">$ sudo qemu-system-arm -M versatilepb -kernel vmlinuz-3.2.0-3-versatile \
-initrd initrd.gz -hda Debian-ARM.img \
-net nic -net tap,ifname=tap0 -m 256
</pre><p> ここで、vmlinuz-3.2.0-3-versatile と initrd.gz はDebianサイトから取得したファイル、Debian-ARM.img は上で作成したディスクイメージのファイル名です。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxPTbmartUlTH-t3_6lyUegSr6raZ3VITXsw_aPdj9jmHg_EnFrDuGnckaROQBFomwG7JAQj_yvohT4i3u26uuts89SZlcf346Ip9qdDrDSI6uYjVmJgwpELw10bAfAxtQx9Uk6BHT2oo/s1600/Screen+Shot+2012-09-09+at+23.39.17.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="254" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxPTbmartUlTH-t3_6lyUegSr6raZ3VITXsw_aPdj9jmHg_EnFrDuGnckaROQBFomwG7JAQj_yvohT4i3u26uuts89SZlcf346Ip9qdDrDSI6uYjVmJgwpELw10bAfAxtQx9Uk6BHT2oo/s320/Screen+Shot+2012-09-09+at+23.39.17.png" /></a></div><p> はい、インストールはじまりましたー。<br />
</p><p> あとは、Debianのインストーラに従って進めてください。<br />
簡単ですね><!<br />
</p><h4>教訓4: パーティショニングはディスク全体を使う</h4><p> 色々聞かれる質問は、好きなように答えてください。<br />
ただ、ひとつだけ、パーティショニングの際にディスク全体を使うようにします↓<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt-FkxAcedGqqz-WXm664iWBYnw-gO8As2HKPTfg6bGFBKQFrawnB0nyOBkWVNH0SAcL1YSGDDhxC15dcnfqWPkdR8fANwhbWWS_0OqjkjiFa6uxTcuq_tWUSR12OCjIVFbzj2bWqbpLs/s1600/Screen+Shot+2012-09-09+at+23.52.31.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="254" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgt-FkxAcedGqqz-WXm664iWBYnw-gO8As2HKPTfg6bGFBKQFrawnB0nyOBkWVNH0SAcL1YSGDDhxC15dcnfqWPkdR8fANwhbWWS_0OqjkjiFa6uxTcuq_tWUSR12OCjIVFbzj2bWqbpLs/s320/Screen+Shot+2012-09-09+at+23.52.31.png" /></a></div><p> ここ重要です!<br />
これはディスクイメージをrawにしたのとあわせて、次に効いてきますからね。<br />
</p><p> 順調にインスールが終わり、あとは再起動するだけです。<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlxul0BCbeqRaJRMWFlKybaF4I8xYZFAtfL7_erEcD4txDbxkZ3H6s5xIHEfa0k9q5o-_-6GZx8MmEdLfxNcFkvzZcPxt3GCsZeY_F5jV2tUBBdDoqtrRMB0TCbwEpPh315SQGzUaUUIU/s1600/Screen+Shot+2012-09-10+at+1.02.15.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="254" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlxul0BCbeqRaJRMWFlKybaF4I8xYZFAtfL7_erEcD4txDbxkZ3H6s5xIHEfa0k9q5o-_-6GZx8MmEdLfxNcFkvzZcPxt3GCsZeY_F5jV2tUBBdDoqtrRMB0TCbwEpPh315SQGzUaUUIU/s320/Screen+Shot+2012-09-10+at+1.02.15.png" /></a></div><p> 「続ける」をクリックして再起動します。<br />
まだかなまだかな〜+(0゚・∀・) + ワクテカ +<br />
</p><p style="font-size:xx-large;"> て、エッ( ゚д゚)!<br />
</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxPTbmartUlTH-t3_6lyUegSr6raZ3VITXsw_aPdj9jmHg_EnFrDuGnckaROQBFomwG7JAQj_yvohT4i3u26uuts89SZlcf346Ip9qdDrDSI6uYjVmJgwpELw10bAfAxtQx9Uk6BHT2oo/s1600/Screen+Shot+2012-09-09+at+23.39.17.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="254" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxPTbmartUlTH-t3_6lyUegSr6raZ3VITXsw_aPdj9jmHg_EnFrDuGnckaROQBFomwG7JAQj_yvohT4i3u26uuts89SZlcf346Ip9qdDrDSI6uYjVmJgwpELw10bAfAxtQx9Uk6BHT2oo/s320/Screen+Shot+2012-09-09+at+23.39.17.png" /></a></div><p style="font-size:x-large;"> またインストーラが起動しちゃった><;<br />
</p><p> これは、Qemuを起動する際に渡しているinitrdが、ネットブートインストール用のものだからです。(※initrdの細かい話は、他のサイトを参照のこと)<br />
ハードディスクのファイルシステムをマウントしてそっちから起動してくれるinitrdが必要なのですが、それが公式では見つからない……initrdは、通常mkinitrdコマンドを使って作成されるからだそうです。<br />
</p><p> こまけぇこたぁいいから、とにかく動くinitrdがいるんだよ(#゚Д゚)ゴルァ!!<br />
</p><p> というわけで、あれこれ考えた結果、正しくDebianがインストールされていれば、今ここにあるディスクイメージの中の/bootに、Linuxカーネルと一緒にinitrdも入ってるはずです。<br />
なので、ディスクイメージの中身を読み取ることができれば、手に入るはず!<br />
</p><p> で、調べていたら、<a href="http://d.hatena.ne.jp/kakurasan/20081006/p1">ディスクイメージがマウントできる</a>ことを知った!<br />
これはディスクイメージをraw形式で作っているからできることです(ついでに、LVMを使用していないから簡単にできます)。<br />
これまでの教訓はここで生きてくるんですね!<br />
</p><p> というわけで、fdiskでパーティションの位置を調べて、その位置をマウントします:<br />
</p><pre class="brush:shell; gutter:false">$ fdisk -lu Debian-ARM.img
Disk Debian-ARM.img: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0003f91b
Device Boot Start End Blocks Id System
Debian-ARM.img1 * 2048 20013055 10005504 83 Linux
Debian-ARM.img2 20015102 20969471 477185 5 Extended
Debian-ARM.img5 20015104 20969471 477184 82 Linux swap / Solaris
</pre><p> 先頭パーティションの位置を指定してマウントするわけですが、Startの値の単位はシリンダ数なのでバイト単位に換算する必要があります。<br />
この場合、512 * 2048 = 1048576 ですね。<br />
とりあえず、/mnt/temp にマウントすることにします:<br />
</p><pre class="brush:shell; gutter:false">$ sudo mkdir /mnt/temp
$ sudo mount -t ext4 -o loop,offset=1048576 Debian-ARM.img /mnt/temp
$ ls -l /mnt/temp/boot
total 4772
-rw-r--r-- 1 root root 89689 Jul 24 15:06 config-3.2.0-3-versatile
lrwxrwxrwx 1 root root 28 Sep 10 00:24 initrd.img -> initrd.img-3.2.0-3-versatile
-rw-r--r-- 1 root root 2268482 Sep 10 00:59 initrd.img-3.2.0-3-versatile
-rw-r--r-- 1 root root 1118575 Jul 24 15:06 System.map-3.2.0-3-versatile
lrwxrwxrwx 1 root root 25 Sep 10 00:24 vmlinuz -> vmlinuz-3.2.0-3-versatile
-rw-r--r-- 1 root root 1404680 Jul 24 15:05 vmlinuz-3.2.0-3-versatile
</pre><p> (゚∀゚)キタコレ!!<br />
</p><p> ここにある initrd.img-3.2.0-3-versatile がお目当てのinitrdです。<br />
これをコピーして、Qemuの起動に使います。また、ハードディスクから起動するために、-appendオプションを追加します:<br />
</p><pre class="brush:shell">$ cp /mnt/temp/boot/initrd.img-3.2.0-3-versatile .
$ sudo qemu-system-arm -M versatilepb -kernel vmlinuz-3.2.0-3-versatile \
-initrd initrd.img-3.2.0-3-versatile -hda Debian-ARM.img \
-append "root=/dev/sda1" -net nic -net tap,ifname=tap0 -m 256
</pre><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8t5BohBGtIoitRZW0bksjR36ppjeIn30J9lDdBw4Sgew8CzO06QPs5zmbtwxV50YMgfNGnEC0xhxo7rIDmSb3LtuEPDzE3GSNAz2zgqiaBqKAOsxOMUvIfqwoR4oPNgUySpheUnKTRI4/s1600/Screen+Shot+2012-09-10+at+1.32.45.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="254" width="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8t5BohBGtIoitRZW0bksjR36ppjeIn30J9lDdBw4Sgew8CzO06QPs5zmbtwxV50YMgfNGnEC0xhxo7rIDmSb3LtuEPDzE3GSNAz2zgqiaBqKAOsxOMUvIfqwoR4oPNgUySpheUnKTRI4/s320/Screen+Shot+2012-09-10+at+1.32.45.png" /></a></div><p style="font-size:x-large;"> キタ━(゚∀゚)━!<br />
</p><p> 起動には毎回、Linuxカーネルイメージ・initrd・ディスクイメージが必要ですので、このセットは大切に保存しておいてください。<br />
</p><p> あとは、お好きなように!<br />
</p>Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com0tag:blogger.com,1999:blog-1578865794801742329.post-35093854844216364812012-03-11T22:58:00.002+09:002012-03-13T12:23:05.232+09:00未踏カンファレンス2012でスポンサーとしてLTしてきたので…<p> 3/10(土)に開催された未踏カンファレンス2012に飛び入り参加してきました。<br />
企画・運営されていた皆さん、本当にお疲れ様でした。素晴らしいイベントをありがとうございます><!</p><p> 弊社メルコホールディングスもスポンサーとして協力させていただいておりまして、スポンサー枠ということでスピーチ(LT)してきました。発表スライドはこちらです↓</p><div style="width:425px" id="__ss_11981672"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/makidaisuke/2012pr-11981672" title="未踏カンファレンス2012「メルコグループと未踏ソフト」(スポンサーPR枠)<字幕付き>" target="_blank">未踏カンファレンス2012「メルコグループと未踏ソフト」(スポンサーPR枠)<字幕付き></a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/11981672" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> <div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/makidaisuke" target="_blank">Daisuke Maki</a> </div></div><p> 事前に人事の現場の人(今回お金出してるのは人事)には「時間もないし、好き勝手にやらせてもらいますから( ・`ω・´)!」と言っておいたのですが、よもや当日、人事部長が来ることになっているとはいざ知らず、でもLTの内容を変えるわけにもいかず「えいやっ(゚д゚)」っとやってしまいましたw(スライドの中で「そこの人事の偉い人」と言っているのは、部長のことです)</p><p> で、しゃべったあとに「好き勝手に言っちゃってスンマセン │・ω・;)」って謝りに行ったら「いいよ いいよ〜」って軽く流してくれたので、結果オーライですた(・∀・)!</p><h4>本心をお話ししたつもりです</h4><p> プログラミング系のカンファレンスに出かけると、やっぱり、企業の方は皆さん、「プログラマ募集中です」とか「入社してください」とか発表に付け加えてて、それを半ばネタにしたりする発表も時折ありますよね。今回のパネルディスカッション中にも、そんな"お約束"なシーンがありました。</p><p> でも個人的には、そういっていらっしゃるエンジニアの皆さんから、何というか、今ひとつ本気を感じることができないときがあったのです。</p><p> それが悪いと言っているわけではありません。もちろん、お金や発表者を送り込んでいる企業としてはリクルーティングが最大の目的でしょうし、現場の人間の視点から見てみても、人手が増えるのは助かるし優秀な人が入ってくれるのは大歓迎ですから。たとえば自分がエンジニアとして登壇してときのことを想像しても、会社から何も言われていなかったとしても、一言「ウチはイイトコ、一度はおいで!」と言わない積極的な理由はないわけです。</p><p> でも、「入社してくださいね」という一言が、本当に自分が伝えたい事なのかな?そんなことを会場で考えながら、スライドを作っていました。</p><p> 結果、人事の意図とはそぐわなかったとしても、正直に自分の伝えたいことをしゃべったほうが良いな、と思ったので、独断でスピーチさせていただきました。</p><p> っていうか、ぶっちゃけ、LTは自分が楽しんで話せる内容じゃないと、勢いがキープできませんからね><!</p><p> 「そんなのキレイ事だよ」とか「そんなこと言って下心あるんでしょ?」とか思われるかもしれません。もちろん、他社さんと同じく「ウチにももっと入社してください><!!」っていうのも本心ではあります。</p><p> でも、ウチはどっちかといえば昔気質のメーカー系でそんなに羽振りが良いわけでもないので、「誰でも彼でも来てちょうだい!」というわけにはいかないんですよね。だから、本当に我々と方向性が合って、「一緒にやろうよ!」と意気投合できる人に来て欲しいし、そういう人と一緒に仕事がしたいと思っているのです。</p><p> ちょっと長くなりましたが、とりあえず言いたいのは、やっぱり「一緒に楽しいこと、そしてデカいことしましょう!」そのためにまずは「一緒に飲みましょう!」ってことですよ><!</p>Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com0tag:blogger.com,1999:blog-1578865794801742329.post-59955262755245337282012-01-29T00:45:00.000+09:002012-03-12T14:25:09.249+09:00パワポとかワードのファイルをコマンドラインからPDFに変換したかったので…<p> Evernoteを使っているので、ドキュメントをなんでもかんでも放り込んでおくのですが、doc形式とかppt形式のまま放り込んでも、Evernoteでそのまま表示されないのです。もちろん、本文を検索することもできません。<br />
それではあんまりにも不便なので、PDFにして放り込んでいます。<br />
しかしまぁ、自分のいる会社ではあらゆる書類がOffice文書でとびかっているので、日々手作業でPowerPointを開いてはPDFで保存、保存、保存……とやっていたのです。</p><p> で、いいかげんバカらしくなってきて、オフィスで「パワポをコマンドラインから呼び出す方法はないもんかなぁ」とかぼやいていたら、<a href="http://twitter.com/_8bit_">@_8bit_</a>さんが「C#でコントロールすればいいんじゃないですか?」とか教えてくれた。</p><p>「そうか!COMで操作すればいんじゃね?なるほど、その手があったか!」</p><p> やっぱりWindowsのことは@_8bit_さんに聞いとけば間違いないなぁ、などと思いつつやってみた。</p><a name='more'></a><br />
<p> 参考にしたのはこのへん↓</p><ul><li><a href="http://did2.blog64.fc2.com/blog-entry-459.html">C#からPowerPointを操作していてつまづいたことメモ</a></li>
<li><a href="http://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.powerpoint.aspx">Microsoft.Office.Interop.PowerPoint Namespace</a></li>
</ul><p> VisualStudioでコンソールアプリケーションのプロジェクトを作成して、参照設定で「Microsoft.Office.Interop.PowerPoint」を追加すれば、COMでPowerPointにアクセスできるようになる。<br />
基本的なパターンはこんなかんじ:</p><pre class="code"><code><nobr>// PowerPointプロセスへのハンドルを作成<br />
PowerPoint.Application ppt = new PowerPoint.Application();<br />
<br />
// PowerPointファイルを開く<br />
//(後ろの引数でRead-Onlyで開くとかウィンドウを表示するとか設定できるけど、細かいことはリファレンスを参照)<br />
PowerPoint.Presentation p = ppt.Presentations.Open(@"C:\somewhere\パワポファイル名.ppt", MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);<br />
<br />
// PDF形式でファイルに保存する<br />
//(最後の引数は、フォントを埋め込むかの指定)<br />
p.SaveCopyAs(@"C:\somewhere\出力先ファイル名.pdf", PowerPoint.PpSaveAsFileType.ppSaveAsPDF, MsoTriState.msoTrue);<br />
<br />
// ファイルを閉じる<br />
//(これをやらないとファイルが開いたままになっちゃう)<br />
p.Close();</nobr></code></pre><p> 簡単ですね><!<br />
ハマりどころは、ファイルを開く時と保存するときに<b>絶対パスで指定しないといけない</b>ってとこくらい。</p><p> 同じ要領で、Wordを使ってdocファイルをPDF化することもできます。<br />
ただし、こちらは<a href="http://msdn.microsoft.com/ja-jp/library/microsoft.office.tools.word.documentbase.exportasfixedformat.aspx">ExportAsFixedFormat</a>というメソッドを使う。<br />
Wordのリファレンスは↓を参照。</p><ul><li><a href="http://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.word.aspx">Microsoft.Office.Interop.Word Namespace</a></li>
</ul><p> こんなかんじで、あとは細かいところをチョコチョコ作ってコマンドを実装した。<br />
一応、<a href="https://github.com/Maki-Daisuke/ConvertWithOffice">GitHub</a>に置いてあるので、使いたい人は勝手に使ってね。(自分の環境でしかテストしていないので、動かなければ自分でリビルドするなりしてお使いください)</p><p> コマンドラインツールといってもただ引数にファイル名を渡せば良いので、実行ファイルへのショートカットをデスクトップあたりに置いておけば、そこにPDFにしたいファイルをドロップするだけで変換可能!</p><p> これで日常的な作業にかかる時間をかなり削減できるよ。</p>Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com4tag:blogger.com,1999:blog-1578865794801742329.post-43028307934658566902012-01-04T05:48:00.000+09:002012-01-10T00:52:23.430+09:00Galaxy Nexusを買ったので…<blockquote class="twitter-tweet tw-align-center" lang="ja"><p>新しいケータイこうたったー (@ ドコモショップ 八重洲店) <a href="http://t.co/f4WGZcxC" title="http://4sq.com/rG84jJ">4sq.com/rG84jJ</a></p>— yet anotherさん (@Maki_Daisuke) <a href="https://twitter.com/Maki_Daisuke/status/153705732573888512" data-datetime="2012-01-02T05:14:37+00:00">1月 2, 2012</a></blockquote><script src="//platform.twitter.com/widgets.js" charset="utf-8"></script><br />
<br />
というわけで、Galaxy Nexusを買って約24時間が経過したので(執筆時点)、ちょっくらレビューでも書くとしますよ。<br />
あ。ちなみに、喪中につき、新年祝賀のご挨拶は控えさせて頂きます。ご了承下さい。<br />
<br />
<a name='more'></a><br />
<br />
<h4>その前に、馴れ初めについてちょっと</h4><br />
先月あたりからずっと、そろそろ次の携帯の購入を考えていた。<br />
というのも、1年半以上Nexus Oneを使っていたのだけれど、いい加減Nexus Oneに限界が来ていたから。<br />
限界というのは、主に端末のストレージ容量。ファームウェアのアップデートとかアプリとかでどんどん内部ストレージを食いつぶしてしまい、残り容量20MBを切って常に警告が出てしまう有り様。追加でアプリが入れたくても、そんな余裕はもちろんない。(SDカードに追い出せるアプリは全部SDカードに追い出している…)<br />
結果、厳選したアプリを我慢しながら使っている始末。<br />
<br />
思うに、最近のアプリはどんどんデカくなってるね。<br />
たとえばGoogle日本語入力(早くもAndroidでの日本語入力の決定版になりつつある!)はそれだけで20MB近くある。<br />
その分どんどん便利になってるからいいんだけどさ…<br />
<br />
不満はあったけどけっこうな間、Nexus Oneを使い続けてた。なんてたって、それくらいお気に入りのデバイスだったのさ!<br />
<br />
ところが、そんな愛するNexus Oneとの別れは突然やってきた。<br />
別れっていうか、単に落としたんだけど……orz<br />
しかもよりによって年末年始に家族で出かけたシンガポールで!シンガポールで落としたものはまず出てこないと前日に兄に聞いてはいたけど、ホントに出て来なかった…<br />
<br />
そんなわけで、ついに次の端末を買わざるを得なくなったのである…<br />
<br />
<h4>後継機種Galaxy Nexus!</h4><br />
次の端末としてGalaxy Nexusに目をつけていたのは、当然、Nexus Oneの後継機種だから。<br />
正確に言うと、Galaxy NexusはNexus Oneの次の次の機種(つまり孫)にあたる。間にNexus Sっていうのがあって、こいつが出たときにも実は購入を検討した。<br />
でも、その時にはそんなに購入意欲が掻き立てられなかった。そんなに大きな違いを感じられなかったし、まだまだNexus Oneでいけると思ってたから。<br />
<br />
Nexus Oneの後継を買おうと思った(というか、それ以外に眼中になかった)理由は、NexusシリーズがGoogleの認めるAndroidのリファレンスモデルであるという点に尽きる。<br />
Nexus Oneを使っていたことで、余計なアプリがついていない純粋さや、動作の軽快さ、またファームウェアアップデートの提供の速さなど、Google純正であることの醍醐味を思い知ってしまったのだ。<br />
それからもちろん、世界初のAndroid 4.0搭載端末ということで、早く試してみたかったのもある。<br />
<br />
<h4>ドコモ版Galaxy Nexusにはドコモ版ファームが入ってます</h4><br />
ドコモから発売しているGalaxy Nexusはドコモ用のファームウェアが入っていて、主な違いとして、テザリング機能が封印されていたりする。<br />
しかし、Googleが配布している公式のオリジナルファームウェアをインストールしてしまえば使えるらしいので(<a href="http://android.benigumo.com/20111206/galaxy-nexus-%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E3%81%AAandroid4-0-1itl41f%E3%81%A7%E3%83%86%E3%82%B6%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%82/">参考</a>)、オリジナルファームに入れ替えて使うつもりだった。<br />
でも、一応ファームウェアアップデートで対応予定とドコモは言っているので、ちょっと待ってこのまま使い続けようかと思う。具体的には、今回の米国出張から戻って本格的に使い出すまでにテザリングが開封されていなかったら、オリジナルファームを入れることにする。<br />
<br />
<h4>ドコモ版Galaxy NexusはLTE非対応です</h4><br />
また、ドコモ版はXi(LTE)に対応していない。<br />
これが気になってたから、最初はドコモではなく米国でLTEに対応しているバージョンを買って、ドコモのSIMを挿して使おうと思っていた。(Nexus Oneを落とすまでは…)<br />
ところが、買う段になってLTEがなくて正解だったと思う。<br />
というのも、購入したときに対応してくれたdocomoショップの店員さんが教えてくれたのだけれど、Xi対応のAndroid端末は、他のAndroid端末にも増して電池のもちが悪いとのこと。その店員さんはXi対応の機種を使っているそうだが、まったくもたないとのこと。<br />
普通のAndroid端末でもなかなか一日はもたないがもたないが、Xi対応のものだと半日ももたないくらいのイメージらしい。それじゃあ、メイン端末として使えんがな…<br />
<br />
店員さんによると、電池のもちが悪い理由は端末側ではなくむしろインフラ側にあるそうだ。<br />
現在Xiのカバーエリアはまだまだ狭く、通信エリアをカバーするため、Xi対応端末はFOMA(3G)を併用している。つまり、Xiが使えるエリアと使えないエリアを出入りするたびにXiとFOMAを切り替えている。そのため、頻繁に基地局を探索しているような状態にあるそうなのだ。<br />
ご存知のように、携帯は基地局との電波が届きにくいとき(アンテナがちょっとしか立っていないとき)や電波が届かなくて基地局を探しているときに、ものすっごい電池を消耗する。<br />
ガラケーならいざ知らず、ほとんど常時通信をしようとするAndroid端末では、あっという間に電池を使いきってしまうだろう。<br />
そんなわけでLTE対応のAndroid端末には、なんと補助充電器がついてくるそうだw<br />
HT-03Aにバッテリーが2個ついてたのとおんなじ様なノリやね。<br />
<br />
Xiの高速通信は魅力的だけれど、Xi対応のAndroidの購入を検討されている人はご注意を。<br />
Xiのエリアが広がるにつれて、少しずつ解消されていくことに期待したいね。<br />
<br />
<h4>ファーストインプレッション ― デカい!</h4><br />
Galaxy Nexusの第一印象は、とにかくデカい!ということに尽きるだろう。<br />
docomoショップの店員さんが、現在ドコモで販売しているスマートフォンの中で最大の大きさだと言っていた。<br />
<br />
最初はあまりのデカさに、ちゃんとポケットに入るんかいな…と購入をためらったんだけど、実際に使い始めてみると、思ったほど邪魔にはならない。<br />
四隅が丸くなってることに加え、画面を含む本体自身も微妙に曲線を描いているのがその理由かもしれない。<br />
<br />
とはいうものの、もう一回り小さくしてくれても良かったんじゃないだろうか?<br />
機種変更手続きを待っている間、「AndroidがiPhoneよりも良い理由」が書かれた冊子を店員さんが見せてくれたんだけど、そこにも「大画面!」って書いてあった。<br />
大画面って、そんなにウリになるのかねぇ?それよりも、必要十分な機能をコンパクトにまとめてほしいと、俺なんかは思うけど……(その点、ホントにiPhone4は美しいと思う)<br />
ちなみに、その他の利点としては「通信エリアが広い!」と「Flashが使える」とかが書いてあった。KDDIがiPhoneを扱い始めて、AdobeがFlashからHTML5に舵を切った今となっちゃ、もう利点にならない気がするなぁ…<br />
<br />
<h4>設定の移行について ― microSDスロットはありません</h4><br />
Androidだから、起動してGoogleアカウントを設定すれば基本的な設定は一発で完了!<br />
…といきたいのだけど、ちょっと注意しなくちゃいけないこともある。<br />
<br />
まず、Galaxy Nexusは潔くも、microSDスロットがついていない。つまり、今まで使ってたSDカードを入れ替えてデータを持ってくることができない。<br />
また、PCからファイルをコピーする場合にも、SDカードリーダーとしてマウントすることはできない。その代わり、<a href="http://www.android.com/filetransfer">Android File Transfer</a>というのを使わなければならないので注意が必要だ。<br />
(追記: Android File Transferが必要になるのはMacだけとのこと。Windowsは追加ソフトウェアはいらないらしい)<br />
<br />
SDカードが’使えないのは、ガラケーから初めてAndroidに乗り換えようとする人にとって、一番やっかいな問題とのこと。<br />
普通、ガラケーで機種変更した際にはSDカードに電話帳データを保存してそれを新しい機種に移すとのことだが(docomoショップ店員さんに聞いただけなので、本当のところは知らない)、Galaxy Nexusはこれができない。<br />
しかし、Gmailは色んな形式の電話帳データをインポートする機能を持っているので、電話帳データをPCにコピーして、PCからGmailにインポートしてやることができる。(自分はauのガラケーからAndroidに乗り換える際にこれをやった)<br />
Androidを使っている人なら当然Gmailを使っているだろうから、実のところ問題はなさそう。<br />
<br />
Galaxy Nexusはまだiモード(最近悪名高いspモードのことだ)に対応していないが、Android間でも、この電話帳は自動で移行されないので、SDカードがないと困ることになるだろう。<br />
ちなみに購入時にショップ店員さんに「iモードのメールはお使いですか?」と聞かれたけど「いいえ、まったく(キッパリ」と答えた俺にはまったく関係のない心配だ。店員さんは「そうですか…」ってさびしそうな声出してたけど、実際、なんのためにわざわざ使う必要があるのかサッパリまったくわからない。<br />
あと、ひとしきり設定が終わった後、店員さんが「他のメールアドレスの設定は必要ですか?moperaのメールアドレスとか?」って聞いてきたけど、「使ってないです(キッパリ」って答えたら、やっぱり「そうですか…」って元気ない声してた。<br />
<br />
<h4>設定の移行について ― 無料アプリは移行されません</h4><br />
以前にAndroidを使っていた場合は、初回起動時にGoogleアカウントを登録すると、そのアカウントで購入済みのアプリのダウンロードが自動的に始まり、インストールされる。<br />
無料アプリは自動でインストールされないので注意してください、と店員さんが言いかけたところで、なぜか自分の場合は無料アプリまで自動的にインストールが始まったことに気がついた。<br />
店員さんも驚いていたけど、どうやら原因は、自分は米国で購入したAndroid端末(Virgin Mobileの端末)も使っていたことが原因のようだ。あとで確認してみたら、たしかに、米国の端末で使っているアプリは自動でインストールされたけど、日本の端末でしか使っていなかったアプリはインストールされなかった。<br />
なんでこんなことになっているのか、店員さんも詳しい理由はしらないらしかったが、もしかしたら通信方式の違いが原因かも、と言っていた。<br />
<br />
そんなわけで、Androidをお使いの方は、米国の端末も同時にお使いになると、移行が大変楽チンですよw<br />
<br />
<h4>Android 4.0に慣れるにはちょっと時間がかかるかも…</h4><br />
さて、Galaxy Nexus最大のウリである最新OSのAndroid 4.0だが、正直、これまでのAndroidに慣れている人は、ちょっと戸惑うかもしれない。<br />
自分はAndroid 3.0のタブレットも使っていたので、大丈夫だろうとタカをくくっていたけど、やっぱりちょっと戸惑ったw<br />
特に、ハードウェアのボタンが廃止されたこと、しかも標準で表示される3つのボタンの中にメニューボタンがないのには、まだ慣れない。<br />
<br />
でも、機能性という観点からより洗練されたということはすぐにわかる。<br />
従来のAndroid端末には標準で「戻る」「ホーム」「メニュー」「検索」の4つのボタンが(多くの場合ハードウェアで)実装されていた。対して、4.0のAndroidでは標準は「戻る」「ホーム」「最近使ったアプリ」の3つだ。<br />
考えてみれば、「メニュー」と「検索」はアプリによっては使い道がないことに気づく(ゲームとかね)。こういうアプリ依存のボタンは、必要なときにソフトウェアで表示すれば良いのだ。<br />
Android 4.0では標準の3つのボタンは、アプリに関係なくOSで共通してよく使われる機能に集約されている。特に、「最近使ったアプリ」は従来はホームボタンの長押しで実現していたが、一瞬で呼び出せるようになったのは本当にありがたい。<br />
しかも、これら3つのボタンすら、ソフトウェアで必要なときにしか表示されないのだ。<br />
<br />
たぶん、毎日使っていればすぐに慣れることになるんだろうな。<br />
<br />
<h4>デュアルコア速いよ、デュアルコア!</h4><br />
HT-03AからNexus Oneに乗り換えたときにも「こいつは速ぇ!これでiPhoneに勝つる><!」と思ったものだったが、人間なんにでも慣れてしまうもので、そのNexus Oneですら、ちょっと重さを感じるようになってきていた。<br />
そこにきてGalaxy Nexusに乗り換えたら、速い速い!<br />
<br />
OSの最適化もあるんだろうけど、やっぱりデュアルコアCPUのおかげなんだと思う。<br />
おかげでネットサーフィンからメールの整理まで、当たり前だけど、今まで使ってたアプリが全体的に快適になった。<br />
<br />
そういえば、ゲームも試してみるべきかな。<br />
Nexus One時代には(容量の関係もあって)ほとんどゲームしてなかったけど、なにかゲームをやってみようかな。<br />
<br />
<h4>ぜんぜんまとまってないですが…</h4><br />
とりあえずユーザー歴24時間のレビューとしてはこんなかんじかな。<br />
ほとんど注意事項だった気もするけど…<br />
<br />
あと、Android 4,0になって、標準のGoogleアプリの使用感もけっこう変わってます。これもやっぱり慣れるまでにちょっと時間いりそうだけど、けっこういいかんじ。使ってるうちに気持ちよく使えるようになりそうな予感。<br />
最大の問題は、米国ではMorolora Triumph(Android 2.2)も同時に使わなくちゃいけないってこと。<br />
しばらくは2つの操作感の違いに戸惑いそうだなぁ……<br />Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com0tag:blogger.com,1999:blog-1578865794801742329.post-67877886270944889202011-11-16T14:29:00.001+09:002011-11-16T15:15:17.945+09:00祖父が亡くなって一週間になるので…先週の今日、早朝に祖父が亡くなった。<br />
享年94歳。一言で言えば、大往生というやつだ。<br />
ちょうど一週間で良い区切りなので、こんなポストを今、空港で書いている。<br />
<br />
歳も歳だし家族全員、"その時"がいつ来るのかと覚悟していたことではあるので、思いのほかショックはなかった。<br />
実際、もしかしたら、海外にいっている間にいってしまうかもしれないとも思ったかったからこそ、その前の土曜にわざわざ帰省して顔を見に行ったのだ。<br />
その時は、歳が越せるかな、とは思っていた。<br />
それがまさか、火曜に呼び戻されることになろうとは、想像もしていなかった。<br />
<br />
今回の死に際して、ひとつわかるようになったことがある。<br />
近年は、亡くなった家族の遺体を放置したまま同じ屋根の下で暮らしていたとか、曰く「どうすればいいかわからなかったから放っておいた」とか、想像を絶する事件がニュースになったりしていたが、その気持ちが少しだけわかったような気がするのだ。<br />
<br />
幸いなことに祖父は本当に眠るように亡くなった。<br />
死に顔を見ていると、ゆったり寝ているだけのようにも見えた。その内、また起きるんじゃないか、というくらい幸せそうな顔だ。<br />
そんな顔を見ていたら、ふっと、このままそっとしておいてあげたらいいんじゃないか、という思いすら過ぎった。<br />
もしかしたら、事件になっていた家族も、最初はそんな気持ちだったのかもしれない。<br />
そう考えると、何も想像を絶するニュースではなくて、少しだけ優しい話なのかもしれないと思った。<br />
<br />
でも、実際にはそんな悠長なことはいってられない。<br />
亡くなってすぐに親戚の人達が大勢やってきて(なにせ実家は田舎なので)、葬儀社の人がやってきて、やれ通夜と告別式の日取りはどうだの、納棺だの出棺だの、どんどん進んでいって、あっという間にお爺ちゃんは小さなお骨になって帰ってきた。<br />
本当に、色々な人達の力があって、お式を終えることができたんだと思う。<br />
もしかしたら、家族の死というのは、家族だけで乗り切るには切なすぎるものなのかもしれないね。<br />
それを親戚やら近所の人達やらが、よってたかって、明日に向かって押し出してくれる。<br />
本当にありがたい話だ。<br />
<br />
これから米国に発つけど、次に帰国するときは四十九日です。<br />Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com0tag:blogger.com,1999:blog-1578865794801742329.post-56077603521565196402011-10-14T13:27:00.000+09:002011-10-14T13:27:41.708+09:00YAPC::Asia 2011にやってきたので…<p> 今年もやって来ましたYAPC::Asia。<br />
まだ、一日目(前夜祭を入れると二日目?)の午前が終わったところなんだけど、KeynoteのJesse Vincentのトークを聴いて、Twitterで書き足りなかったところを書いとこうかと。</p>
<p> 実は、この話は事前に<a href="http://www.slideshare.net/obrajesse/oscon-2011-perl-516-and-beyond">OSCON 2011のスライド</a>を見ていたので知っていた。<br />
でも、実際にJesseのトークを直に聴くと、Perl5を良くしたい!という情熱がひしひしと伝わってくる。</p>
<p> 非常に大雑把に言ってしまうと、「Perl5をこれからも進化させ続けていくために、Perl5のコアを小さくしよう、過去の遺物を捨てられるようにしよう」、そういう方向に舵を切ったんだという話。<br />
でも、それをやりつつも、今動いているPerlプログラムは(可能な限り)動き続けるよう互換性を保つための提案をしている。<br />
とても野心的な話だ。(どんな方法を提案しているのかは、上のスライドを参照)</p>
<p> 個人的には、未来に向かって変わり続けようとする、この話には心から賛同している。<br />
一方で、この方向に舵を切ることで、Perl5が俺が大好きだったPerlではなくなってしまうのかもしれないなぁ…という一種の寂しさもよぎった。<br />
俺が大好きだったPerlというのは、つまり、なんでもござれの全部入りアーミーナイフなPerlのことだ。<br /><br />
「Perlが使えれば、なんとかなる!」<br /><br />
そんな妙な安心感をくれるPerlのことだ。</p>
<p> 一方で、コアを小さくして拡張はモジュールでやる方向性でいくと、その極限の解はSchemeだ。<br />
Schemeの世界は素直に綺麗だと思えるけど、俺の好きな世界ではなかった。<br />
やっぱり俺は、病的折衷主義者なのだね!</p>
<p> Jesseはアーミーナイフともチェーンソーとも表現していたけど、Jesseもこのチェーンソーが好きみたいだ。<br />
だから、Schemeみたいになることはないと思う。<br />
そんなことをしても、嬉しい人は少ないと思うし。<br />
一方で、病的折衷主義と純粋主義とのバランスの狭間で、難しい舵取りをすることになると思う。</p>
<p> 色々思うところはあるけれど、前に向かって変わり続けるというのには大賛成だ。<br />
変わり続けることのみが、自分たちが自分たちで在り続けられるたった1つの方法だと思うから。</p>
<p> 今はただ、そんな大それた決断をしたJesseとPerl Mongerたちを、自分なりにサポートできる方法ってなんだろう、とそれを考えている。</p>Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com0tag:blogger.com,1999:blog-1578865794801742329.post-28544773634608688492011-03-10T02:41:00.002+09:002011-03-10T03:04:57.675+09:00JavaScriptのオブジェクト指向は、逆の順番で学んだほうが理解しやすいと思うので…<p> 事の発端というか、きっかけは、<a href="http://d.hatena.ne.jp/perlcodesample/">id:perlcodesample</a>さんと<a href="http://d.hatena.ne.jp/gfx/">id:gfx</a>さんの下のポストを見て、</p>
<ul>
<li><a href="http://d.hatena.ne.jp/perlcodesample/20101124/1278596435">JavaScriptで一番簡単にオブジェクト指向プログラミングを行う方法</a> (<a href="http://d.hatena.ne.jp/perlcodesample/">id:perlcodesample</a>さん)</li>
<li><a href="http://d.hatena.ne.jp/gfx/20110226/1298705892">JavaScriptにおけるオブジェクトの定義</a> (<a href="http://d.hatena.ne.jp/gfx/">id:gfx</a>さん)</li>
</ul>
<p> newとかprototypeを使うのが推奨されてないとか、直接代入するほうが楽とかじゃなくて、挙動が違うんだよなぁ、と思ったこと。<br />
挙動が違うんだから、もちろん使いどころも違うんですよね。</p>
<p> でも実際、JavaScriptのオブジェクト指向は混乱しやすいと思います。<br />
自分もご多分にもれず、さんざん混乱させられたクチですしね。<br />
わかってしまえば、どってことなくて、とってもシンプルなんですけどね。</p>
<p> せっかくなので、今だからこそ言える、自分だったらこうやって教えて欲しかったなぁ、っていう説明をしてみようかと思います。<br />
題して、JavaScriptのオブジェクト指向は、<b>逆から入門しろ!</b></p>
<a name='more'></a>
<h4>逆からってどこから? → Object.createから</h4>
<p> 思うに、JavaScriptのオブジェクト指向は、newから入るよりも、Object.createから入ったほうが理解しやすいと思うんですよね。<br />
Object.createっていうのは、新しいJavaScriptの仕様(ECMAScript 5th Edition)で標準に取り入れられたメソッドで、引数で指定したオブジェクトをプロトタイプとする新しいオブジェクトを作ることができます。<br />
こんなふうにです:</p>
<pre class="code">var mam = {
given_name : "サザエ",
family_name: "フグタ",
who_am_i : function(){ alert(this.family_name + this.given_name); }
};
var kid = Object.create(mam);
kid.given_name = "タラオ";
mam.who_am_i(); // フグタサザエ
kid.who_am_i(); // フグタタラオ</pre>
<p> kidがmamのメソッドを継承していることがわかりますね。</p>
<p> そもそもJavaScriptのオブジェクト指向ってプロトタイプベースの継承なわけで、newとかコンストラクタっていうのはなくてもいいんです。<br />
このObject.createメソッドからはじめて、従来からあるnewとコンストラクタ、それからprototypeプロパティの挙動をみていこうと思います。<br />
つまり、歴史的に逆順というわけです。</p>
<p> ちなみに、このObject.createメソッドは、モダンなブラウザなら既に実装されているので、実際に実行して試すことができます。(今回自分は、Chrome 9.0で動作確認をしました。)<br />
</p>
<h4>そもそもプロトタイプってなんなん?</h4>
<p> 上のコードを見て、「Object.createの中では新しいオブジェクトを生成してmamのプロパティをコピってるんだな、こんなふうに↓」</p>
<pre class="code">Object.create = function ( o ) {
var p = {};
for ( var i in o ) {
p[i] = o[i];
}
return p;
};</pre>
<p> と思ったアナタ!イイ線いってます!<br />
でも、事はそれほど単純ではありません。次のコードを続けて実行してみましょう:</p>
<pre class="code">mam.call = function(){ alert("カツオ!"); };
mam.call(); // カツオ!
kid.call(); // カツオ!</pre>
<p> callはmamにしか追加していないのに、kidのほうでも使えるようになってしまいましたよ。<br />
実はmamとkidは同じオブジェクトを指している?いやいや、上のでwho_am_iを呼んだ時には、ちゃんと別々になってましたよね。</p>
<p> 種明かしをすると、kidは自身にセットされたgiven_nameプロパティ以外はなんにも持っていない、ほとんど空っぽのオブジェクトです。<br />
ただし、自分が持っていないプロパティについてはmamに問い合わせて、mamのものを自分のものとして使おうとするようになっています。<br />
実はkidはユーザの気づかないところでmamへの参照を隠し持っていて、自分が知らないことはmamのマネをするわけなんですね。<br />
このような特別な関係があるとき、mamはkidのプロトタイプだと言います。</p>
<p> また、kidがmamに問い合わせたプロパティをmamも持っていなかったとしましょう。<br />
するとmamは、やはり自分が持っている隠し参照を使って、自分自身のプロトタイプへと問い合わせを伝搬させます。</p>
<p> このようにプロパティの探索をたどっていくリンクの連なりを、プロトタイプチェインと呼んだりします。<br />
最終的に、この鎖の終端は通常はObject.prototypeになっており、終端にたどりついてもまだ該当するプロパティが見つからなかった場合に、プロパティが未定義ということになります。</p>
<p>
Object.createは、オブジェクト間でこのような特別な関係を築いてくれるわけですね。 </p>
<h4>オーバーライドは子供で値を設定するだけ</h4>
<p> ところで、上のcallメソッドでは、kidもmamのマネをしてカツオを呼び捨てにしてしまっていました。<br />
ここはひとつ、もう少し子供らしく呼ぶようにしつけをしてあげましょう:</p>
<pre class="code">kid.call = function(){ alert("カツオおにいちゃん"); };
kid.call(); // カツオおにいちゃん</pre>
<p> プロパティ探索の挙動がわかってしまえば、挙動を変えたい場合は単に値を代入してしまえば良いことがわかりますね。<br />
もちろん、この段階でもmamのcallの値は元のままです。</p>
<pre class="code">mam.call(); // カツオ!</pre>
<p> 逆に、kid独自の挙動を元に戻したいと思ったら、プロパティを削除してやればOKです:</p>
<pre class="code">delete kid.call;
kid.call(); // カツオ!</pre>
<p> kidからプロパティを消しても、mamからも消えるわけではないので、ふたたびマネをするようになるわけですね。</p>
<h4>継承とMixi-in</h4>
<p> ただ同じ振る舞いをさせたいだけであれば、単純に片方のオブジェクトからもう片方のオブジェクトへとすべてのプロパティをコピーしてしまえば良い話です。<br />
このように既存の実装コードを、まったく関係のないオブジェクト間で再利用するというのは、継承ではなくMix-in(Rubyのincludeとか)の考え方です。<br />
利用ケースによっては、Mix-inと継承はまったく同じような結果をもたらします。</p>
<p> しかしプロトタイプ継承を使うと、親への機能拡張(メソッドの追加)が、すぐさま子供からも使えるようになるという点が大きな違いです。<br />
実行時に、プロトタイプチェインに連なっているすべてのオブジェクトについて、一度の変更で機能を追加・変更できます。<br />
また、どれだけたくさんの子オブジェクトが作られていても、たとえ子オブジェクトにアクセスすることができなかったとしても、変更の影響を及ぼすことができます。<br />
Mixi-inとは違って、親子オブジェクト間で特別な絆ができている継承でなくては、こう柔軟にはいきませんよね。</p>
<p> しかし、継承がかさんでプロトタイプチェインがあまりに長くなってしまうと、ずっと親の代で定義されているプロパティを探索するのに多くの時間がかかってしまうことにもなります。(このあたりは処理系の最適化にも大きく依存しますが)<br />
だからといって、なんでもかんでもそれぞれのオブジェクトが自分で持っていては、メモリ効率も悪くなるでしょうし、継承を使った柔軟な挙動変更もできなくなってしまいます。</p>
<p> 結局、継承とMixi-inは適材適所。<br />
その場で相応しいほうを使い分けることができてこそ、真のJavaScripterというものですよね!</p>
<h4>プロトタイプ関係を作れるのはnewだけ(だった)</h4>
<p> ここからは、上で使ったObject.createの機能を、従来のJavaScriptだけで実装してみましょう。</p>
<p> いきなりコードで書くと、こういうことになります:</p>
<pre class="code">function dummy(){}
Object.create = function ( o ) {
dummy.prototype = o;
return new dummy();
}</pre>
<p>(<span style="color:red;">※実際のObject.createは、変更不可能なプロパティを定義できたりと、3rd Editionの範囲では決して実現できなかった機能も含む高機能なものです!ここではあくまで、プロトタイプの継承関係の構築のみに焦点を当てています。</span>)</p>
<p> 空の関数であるdummyをnewして返す前に、dummyのprototypeプロパティにプロトタイプとなるオブジェクトを設定しているのがミソです。<br />
JavaScriptでは、「new F(ARGS)」という式は、次のように処理されます:</p>
<ol>
<li>新しい空のオブジェクトを作る</li>
<li>新しいオブジェクトのプロトタイプとしてF.prototypeを設定する</li>
<li>F(ARGS)を呼び出す。この時、呼び出され側のthis値として新しく作ったオブジェクトを使う</li>
<li>3の結果がオブジェクトだったら、これを結果として返す。</li>
<li>そうでなければ、1で作ったオブジェクトを返す</li>
</ol>
<p> 擬似コード的に書くと、こんなかんじ:</p>
<pre class="code">function new ( F, ARGS ) {
var o = {};
o.__proto__ = F.prototype;
var r = F.apply(o, ARGS);
return r != null && r instanceof Object ? r : o;
}</pre>
<p> あれ、ここで使ってる<tt>__proto__</tt>って、どこかで見たことありませんか?<br /> そうです。継承するコードでたまに出てくるやつですね。FirefoxとかChromeとか、特定の処理系だけで使えます。<br />
実はこれが、上で言っていた「ユーザが気づかないところで持っている隠し参照」のことです。<br />
処理系によっては、これがユーザから直接触れるようになっているということですね。</p>
<p> 直接いじれちゃえば、もっと細かい制御もやり放題なので、これは便利!なのですが、もちろん、ブラウザ間の互換性が損なわれるので、あまりオススメはしません。<br />
非標準なAPIは、ちゃんと使える場所と使いどころとをわきまえて使いましょうね。JavaScripterとの約束だよ!</p>
<h4>newいらない子(ェ</h4>
<p> 上でnewを実装するために<tt>__proto__</tt>プロパティを使いましたが、Object.createを標準で手に入れた我々は今や、<tt>__proto__</tt>に頼らずともオブジェクトの親子関係を作れる力を手にしたのでした。<br />
つまり、newに相当する機能をJavaScript標準の機能だけで実装することができるようになったのです!<br />
こんなふうに:</p>
<pre class="code">function New ( F, ARGS ) {
var o = Object.create(F.prototype);
var r = F.apply(o, ARGS);
return r != null && r instanceof Object ? r : o;
}
function Cat ( name ) {
this.name = name;
}
Cat.prototype.caterwaul = function(){
alert(this.name + "「ニャーニャー」");
};
var cat = New(Cat, ["タマ"]);
cat.caterwaul(); // タマ「ニャーニャー」</pre>
<p> 上ではnewを使ってObject.createを実装する例を示しましたが、今回はその逆です。<br />
つまり、Object.createが最初からあれば、newっていらなかったってことですね(>_<)</p>
<h4>蛇足: なんでわざわざ関数のプロパティを経由するようになってるの?</h4>
<p> なんででしょうね?<br />
ここからは勝手に推測してみますが、たぶん、関数だけでなんとかしてJavaのコンストラクタの見た目をマネしたかったんじゃないでしょうか?</p>
<p> 普通は、一連の機能をもったオブジェクトをただひとつ一点物で作る(シングルトンパターンみたいな)ケースよりも、同じ機能をもったオブジェクトをたくさん量産するケースのほうが多いと思います。<br />
すると当然、オブジェクトの初期化を行う処理をサブルーチン化しておいて、その中でオブジェクトを生成して返すことを考えますよね。<br />
こんなふうに:</p>
<pre class="code">function bear ( name ) {
var k = Object.create(mam);
k.name = name;
return k;
}
var kid = bear("タラオ");</pre>
<p> つまるところこれって、コンストラクタですよね?</p>
<p> また一方で、JavaScriptはその出自から、Javaに見た目を似せなければならないという宿命を持って生まれてきました。(このあたりは、<a href="http://d.hatena.ne.jp/badatmath/20110308/1299554852">id:badatmathさんのプレゼン資料</a>がとってもわかりやすいです)<br />
で、Javaってコンストラクタを呼び出すときにはnewをつけますよね?<br />
そこで、newをつけて関数を呼び出したときに特別な処理を持たせ、関数にコンストラクタとクラスの2つの役割を押し付けてしまおうと考えたのではないかと思います。</p>
<p> そうなると、Javaのコンストラクタっぽく見せるためには、関数がnewをつけて呼び出されたときには、新しいオブジェクトが適切に(プロトタイプから継承されて)作られ、thisにバインドされていなければなりません。<br />
そこで、そのコンストラクタ(関数)がオブジェクトを生成する際に暗黙的に使うプロトタイプを、コンストラクタ自身に持たせておこう。でも、どの関数がコンストラクタとして呼び出されるかはわからないから、すべての関数にプロパティで持たせておこう。<br />
っていうことになったんじゃないかと。</p>
<p> えっ、JavaScriptは最初からプロトタイプベースのオブジェクト指向を採用するつもりだったのかって?<br />
それはわかりません。Sun Microsystemsがプロトタイプベースの始祖であるSelfの研究者を抱えていたってこと以外、私は知りません。<br />
開発者のEich氏は、最初からSchemeのような関数型言語を作るつもりだったようですけどね。</p>
<h4>書いたあとに一言</h4>
<p> うん!<br />
長々と書いたわりには、全然わかりやすくなってない気がするね(´・ω・`)</p>Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com0tag:blogger.com,1999:blog-1578865794801742329.post-79634501600854318422011-03-07T21:38:00.003+09:002012-02-04T10:47:25.120+09:00zshでperlbrewを補完するようにしたので…<p> zshの補完ってホントに便利ですよねー<br />
堕落しきった俺には、もはやperlbrewのサブコマンドを入力することさえ困難なのです。</p><p> というわけで、<a href="http://d.hatena.ne.jp/lapis25/20101024/1287923224">perlbrewのzshでのコマンド補完(改) - LAPISLAZULI HILL#Hatena</a> のルールを利用させてもらって、補完できるようにしました。</p><p> でも、このルールは若干古くなっていたので、ちょこっと修正しまった↓<br />
具体的には、switchとuseの補完候補にinstalledサブコマンド(listサブコマンドの古いやつ)を使うようになっていたので、修正しています。</p><script src="https://gist.github.com/858435.js?file=_perlbrew"></script> <p> あとついでに、install候補も補完できるようにしときました。(※CPANからリストを取ってくるので、最初の補完には時間がかかりますが(>_<;))
これで、いちいちバージョンを調べなくても気軽にいろんなperlを試せますね!</p><br />
<p> zshの補完関数はじめて書いたけど、こんなんでいいのかな?</p><h4>3/11追記</h4><p> App-perlbrew-0.17にアップデートしたら、switch候補がちゃんと動かなくなったぽいので、修正しました。</p>Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com0tag:blogger.com,1999:blog-1578865794801742329.post-41232407582976717442011-02-28T02:57:00.007+09:002012-02-04T10:47:48.376+09:00どうやらzshなしでは生きられない体になってしまったようなので…<!-- http://twitter.com/#!/Maki_Daisuke/status/41518570420711424 --> <style type='text/css'>.bbpBox41518570420711424 {background:url(http://a1.twimg.com/profile_background_images/183111296/twilk_background_4d0d87bdba232.jpg) #C0DEED;padding:20px;} p.bbpTweet{background:#fff;padding:10px 12px 10px 12px;margin:0;min-height:48px;color:#000;font-size:18px !important;line-height:22px;-moz-border-radius:5px;-webkit-border-radius:5px} p.bbpTweet span.metadata{display:block;width:100%;clear:both;margin-top:8px;padding-top:12px;height:40px;border-top:1px solid #fff;border-top:1px solid #e6e6e6} p.bbpTweet span.metadata span.author{line-height:19px} p.bbpTweet span.metadata span.author img{float:left;margin:0 7px 0 0px;width:38px;height:38px} p.bbpTweet a:hover{text-decoration:underline}p.bbpTweet span.timestamp{font-size:12px;display:block}</style> <div class='bbpBox41518570420711424'><p class='bbpTweet'>ついにWindowsにまでcygwin-zshを入れてしまった。minttyとの組み合わせで快適。今まで、なるべくcygwinは避けて生きてきたのに……ホントにzshがないと生きられなくなりつつある。堕ちるところまで堕ちた感じだ。<span class='timestamp'><a title='Sat Feb 26 15:22:53 +0000 2011' href='http://twitter.com/#!/Maki_Daisuke/status/41518570420711424'>2月27日</a> via web <a href='http://twitter.com/intent/favorite?tweet_id=41518570420711424'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/favorite.png' /> Favorite</a> <a href='http://twitter.com/intent/retweet?tweet_id=41518570420711424'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/retweet.png' /> Retweet</a> <a href='http://twitter.com/intent/tweet?in_reply_to=41518570420711424'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/reply.png' /> Reply</a></span><span class='metadata'><span class='author'><a href='http://twitter.com/Maki_Daisuke'><img src='http://a3.twimg.com/profile_images/921230471/228de2b7-d46e-4cde-a9e5-9ce2da7567aa_normal.png' /></a><strong><a href='http://twitter.com/Maki_Daisuke'>yet another</a></strong><br />
Maki_Daisuke</span></span></p></div><!-- end of tweet --> <p> 最近、上のようなことをTwitterでさんざんつぶやいてますが、表題のとおりです。<br />
もうTab補完でどこにでも行けるコレに慣れてしまうと、手放せなくなる、っていうか補完がきかないとコマンドラインでの作業ができないくらいになりつつあります(>_<)<br />
ホントにたくさんのコマンドの補完ルールが最初から入ってるので、どんどんオプションを覚えなくなって、どんどん堕ちていくw</p><p> そんな、イイカンジに人を堕落させてくれるzshをWindowsに入れる際に、いろいろとコツがいったので、メモがわりに書き留めておきます。<br />
自分以外にも、Windowsでzshを使うのをためらってた人がいたら、これでzshライフ始めましょう!</p><a name='more'></a> <h4>Cygwinを使います</h4><p> Windowsでzshを使うには、<a href="http://www.cygwin.com/">Cygwin</a>を使う必要があります。<br />
Cygwinについてはいくらでも情報があるので、ここではもうインストールされているものとします。</p><p> zshはCygwinのインストーラからインストールできます。<br />
setup.exeを起動して、Shellsカテゴリにあるzshとminttyを選択します:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK8-Ul_myM8Qp8nyICAhKgy2ErPaM9887K7KPvHB_Cn_vncJrzTANi44sRZhIU2m6V2LJbtcv5Auq9TfoxwqCmvJYM3EZeN3O5oHjzM3ft03RMsx9M7_mKfcnuQY5ewmQrRljxY6XMsUk/s1600/setup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="234" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK8-Ul_myM8Qp8nyICAhKgy2ErPaM9887K7KPvHB_Cn_vncJrzTANi44sRZhIU2m6V2LJbtcv5Auq9TfoxwqCmvJYM3EZeN3O5oHjzM3ft03RMsx9M7_mKfcnuQY5ewmQrRljxY6XMsUk/s320/setup.png" width="320" /></a></div><p> Windows標準のDOS窓は横幅が変えられなかったりして大変不便なので、今回はminttyをターミナルとして使います。<br />
他にも<a href="http://ja.poderosa.org/">Poderosa</a>とか<a href="http://d.hatena.ne.jp/lizy/20090427/cygterm">PuTTYを使う方法</a>がありますが、シンプルで簡単に使えるminttyをとりあえず使ってます。<br />
ホントは使い慣れた<a href="http://www.nyaos.org/index.cgi?p=Where+is+ckw+%3F">ckw</a>を使いたかったんですが、日本語まわりでcygwinと絶妙に相性がわるいので、断念しました。<br />
「こっちのほうがオススメだよ!」っていうのがあったら教えてください><!</p><h4>ログインシェルを変更する</h4><p> UNIXだったらchshするところですけれど、Cygwinにはついてこないようなので、/etc/passwdを直接書き換えてしまいましょう。<br />
エディタで/etc/passwdを開いて、自分のユーザ名に相当する行の一番後ろのカラムを以下のようにzshのパスにします:</p><pre class="code">ユーザ名:unused:UID:GID:…(中略)…:ホームディレクトリ:<span style="text-weight:bold;color:red;">/bin/zsh</span></pre><p> でも、これだけだとCygwin.batでは依然としてbashが起ち上がってしまいます。<br />
これは、Cygwin.batがbashを決め打ちで起動してしまっているためです。</p><h4>Cygwin.batを書き換える</h4><p> 自分はこんな感じにしてます:</p><script src="https://gist.github.com/846347.js?file=Cygwin.bat"></script> <p> 色々やってますが、重要なのは最後の行だけです。<br />
shを介してminttyをバックグラウンドで起動してます。minttyに「-」を渡して起動すると、ログインシェル、つまり上で設定したzshを起動してくれます。</p><p> なんでわざわざバックグラウンド起動するのかというと、minttyはCygwin.batの動いてるDOS窓とは別に、新しくウィンドウを開いてそちらにzshを表示するので、普通に起動するとウィンドウが2枚になってちょっとおマヌケだからです。<br />
バックグラウンドで開くと、Cygwin.batはminttyの実行終了を待たずに実行を終了してDOS窓を閉じてくれるというわけですね。</p><p> 残りはほとんど環境変数を設定してるだけ、他にもCygwin環境だけで有効にしたい環境変数があれば、ここで設定してしまいましょう。<br />
特に、Windows形式でPATHを設定したい場合には、ここがラストチャンスです。(Cygwin環境に入る際にUNIX風のパスに変換されてしまいます)</p><p> さて、これでめでたくzshが使えるようになりました!</p><p> 「起動してみたら、やたらいっぱい設定聞かれた。ワケわかんないしウザイからもういいよ」<p><p>っていう人は、ひとまず↓の内容をホームディレクトリの.zshrcに書いておけば、補完ライフを十分楽しめますよ!</p><script src="https://gist.github.com/846347.js?file=gistfile2.eclass"></script> <p> とりあえず、zshでTabキーを連打するところから始めましょう><<br />
「もっとzshの実力を味わいたい!」 という方は、有名な連載『漢のzsh』の「<a href="http://journal.mycom.co.jp/column/zsh/024/index.html">コピペでzsh</a>」からコピってみてくださいねっ!</p><p> さて、Windowsでzshライフを快適にするために、もう少しだけ設定が続きますよ。</p><h4>ウィンドウを出さないようにするとスマートだよね!</h4><p> すぐに閉じられるとはいうものの、起動時に2枚ウィンドウが出るのはちょっとウザイよね、っていう人は、ショートカットの設定で最小化状態で起動するようにしてしまいましょう:</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdaFkd_ZdePpsIAbwdM15jSWThL7cpFsp170AeQNcKiJIDkc7vF68pCIqTUxlJAPqDDFQ7kaqujxkQ5zDMWnUPMqu4GCZJkoAvNCgxaiT0B_m-V6Q7VsdiIberST4pfkQcrCS1VPSLgZk/s1600/shortcut.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="285" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdaFkd_ZdePpsIAbwdM15jSWThL7cpFsp170AeQNcKiJIDkc7vF68pCIqTUxlJAPqDDFQ7kaqujxkQ5zDMWnUPMqu4GCZJkoAvNCgxaiT0B_m-V6Q7VsdiIberST4pfkQcrCS1VPSLgZk/s320/shortcut.png" width="320" /></a></div><p> こうすると、一枚目のウィンドウは最小化のままで目に見えることなく、人知れず静かに閉じられるので、ずいぶんスマートになります。</p><h4>openコマンドを足す</h4><p> MacOS Xでコマンドラインをお使いの方はご存知かと思いますが、指定したファイルをOSで関連付けられたアプリケーションで開いてくれるとっても便利なコマンド、それがopenです。<br />
長年愛用していた<a href="http://www.nyaos.org/">NYACUS</a>にも同様のopenコマンドが実装されており、自分にとってはなくてはならないコマンドなのですが、zshにはないので、自分で用意することにします。</p><p> まず、関連付けられたアプリケーションで開く方法ですが、これはWSHの機能を使ってサクっとスクリプトに任せます。<br />
こんなスクリプトを書きました:</p><script src="https://gist.github.com/846347.js?file=open.js"></script> <p> 引数で並べたファイルをとにかく開いちゃうって内容です。<br />
これをcscriptコマンドで呼び出せばいいわけですが、毎度毎度、「cscript open.js 〜」なんて書くのは興ざめですよね?<br />
ここはzshで関数を書いてショートカットするようにします:</p><script src="https://gist.github.com/846347.js?file=gistfile3.eclass"></script> <p> これを.zshrcあたりに書いて、めでたく「open ファイル名」でファイルを開けるようになりました!<br />
ちなみに、cygpathはUNIX形式のパスからWindows形式のパスに変換するコマンドですね。cscriptは、当然Windows形式しか認識しないので、必須なのです。</p><h4>zshカワイイよ!!zsh!!</h4><p> こんなカンジで、Windowsでも、Enjoy zsh life!(>~<)b
とりあえず自分はこんな設定で使ってますが、「こうしたほうがもっとイイよ!」ってのがあったら教えてください〜</p><br />
<h4>※追記(2011/04/18)</h4><p> <a href="http://twitter.com/mongrelP">@mongrelP</a>さんに cygstart なる便利コマンドがあることを教えてもらいました。ありがとうございます><!</p><!-- http://twitter.com/#!/mongrelP/status/59902872577511424 --> <style type='text/css'>.bbpBox59902872577511424 {background:url(http://a2.twimg.com/a/1302724321/images/themes/theme14/bg.gif) #131516;padding:20px;} p.bbpTweet{background:#fff;padding:10px 12px 10px 12px;margin:0;min-height:48px;color:#000;font-size:18px !important;line-height:22px;-moz-border-radius:5px;-webkit-border-radius:5px} p.bbpTweet span.metadata{display:block;width:100%;clear:both;margin-top:8px;padding-top:12px;height:40px;border-top:1px solid #fff;border-top:1px solid #e6e6e6} p.bbpTweet span.metadata span.author{line-height:19px} p.bbpTweet span.metadata span.author img{float:left;margin:0 7px 0 0px;width:38px;height:38px} p.bbpTweet a:hover{text-decoration:underline}p.bbpTweet span.timestamp{font-size:12px;display:block}</style> <div class='bbpBox59902872577511424'><p class='bbpTweet'>@<a class="tweet-url username" href="http://twitter.com/Maki_Daisuke" rel="nofollow">Maki_Daisuke</a> →についてなんですが、openのかわりにcygstartというコマンドがあるそうです。aliasするだけでよろしい模様。 <a href="http://yanother.blogspot.com/2011/02/zsh.html" rel="nofollow">http://yanother.blogspot.com/2011/02/zsh.html</a><span class='timestamp'><a title='Mon Apr 18 08:55:32 +0000 2011' href='http://twitter.com/#!/mongrelP/status/59902872577511424'>4月18日</a> via web <a href='http://twitter.com/intent/favorite?tweet_id=59902872577511424'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/favorite.png' /> Favorite</a> <a href='http://twitter.com/intent/retweet?tweet_id=59902872577511424'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/retweet.png' /> Retweet</a> <a href='http://twitter.com/intent/tweet?in_reply_to=59902872577511424'><img src='http://si0.twimg.com/images/dev/cms/intents/icons/reply.png' /> Reply</a></span><span class='metadata'><span class='author'><a href='http://twitter.com/mongrelP'><img src='http://a3.twimg.com/profile_images/490736260/F1000011_normal.JPG' /></a><strong><a href='http://twitter.com/mongrelP'>mongrelP</a></strong><br />
mongrelP</span></span></p></div><!-- end of tweet --> <p> というわけで、 alias open=cygstart しておくだけで良かったんですね。なにコレ便利!</p>Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com0tag:blogger.com,1999:blog-1578865794801742329.post-37805929689291018422010-07-29T01:00:00.000+09:002010-07-29T01:00:52.552+09:00Sencha Touch 勉強会に行ってきたので<div>
メモるよ!
</div>
<div style="margin-top: 1em;">
ExtJS が Sencha となって,Sencha Touch という iOS とか Android 向けのライブラリを作っているという,どっかの誰かたちがやってることとモロかぶりじゃねーか!みたいな話を聞きつけたので,行ってきましたよ!</div>
<div>
しかも,会場がソフトバンク本社ということをすっかり忘れてサンダル出勤してしまっていたため,そのままサンダルで参戦しました(テヘッ</div>
<div style="margin-top: 1em;">
公式ブログポストはこちら: <a href="http://www.extjs.co.jp/blog/2010/07/13/tokyo-meetup-jul-2010/">http://www.extjs.co.jp/blog/2010/07/13/tokyo-meetup-jul-2010/</a></div>
<div style="margin-top: 1em;">
以下,自分が興味をひかれたところのメモ↓</div>
<div>
(ちなみに,※印は筆者の憶測です)</div>
<a name='more'></a><h4 style="margin-top: 1em;">Senchaへのブランド変更について(直鳥社長)</h4>
<ul style="margin-top: 1em;">
<li>なんで社名変更したのか?</li>
<ul>
<li>いろんなプロジェクトが加わったためブランド名と社名が一緒なのはめんどくさくなった</li>
<li>Extの名前空間は変わらないよ</li>
</ul>
<li>Sencha Touch のライセンスは GPL</li>
<ul>
<li>商用ライセンスもあり</li>
<li>ベータ中は商用も無料(正式版リリースから 30日で使用期限切れる)</li>
</ul>
<li>Raphael とか jQTouch も商用は有料になっちゃうの><?</li>
<ul>
<li>ハッキリとは断言できないけど,当面は MIT ライセンスのまま使えるよ</li>
</ul>
<li>Sencha Touch ってなに?</li>
<ul>
<li>iOS とか Android 向けの JS ライブラリ</li>
<ul>
<li>(WebOS とか Windows Phone も考えてるよ)</li>
</ul>
<li>HTML/CSS/JS だけで高度なアプリを作れるぜ</li>
<ul>
<li>End of Native (ネイティブアプリ時代の終焉)</li>
</ul>
</ul>
<li>基本的な考え方はこれまでの Ext 同じ</li>
<ul>
<li>Observable とか Component とか Layout とか・・・</li>
</ul>
<li>でも,ほぼスクラッチで書き直してる</li>
<ul>
<li>そのため,レガシーなクラスとかメソッドは削除されてる</li>
<li>(※軽量化のためと思われ)</li>
</ul>
<li>HTML5/CSS3 が前提条件</li>
<ul>
<li>当然,未対応のブラウザは動きません</li>
<li>(※要は WebKit ベースのブラウザを使えってことかね?)</li>
</ul>
<li>GWT 版も開発中!</li>
<ul>
<li>(※Sencha GWT?)</li>
<li>(※どーでもいいけど,<a href="http://code.google.com/p/smartgwt/">Smart GWT</a> とはどういう関係なんだろ?)</li>
</ul>
<li>あと,Connect っていう <a href="http://nodejs.org/">node.js</a>(V8 ベースイベント駆動Webアプリケーションサーバ)のバインディング(?)も開発してる</li>
<ul>
<li>全部 JavaScript で書ける世界がもうそこまで来てる><</li>
</ul>
</ul>
<div style="margin-top: 1em;">
あとのセッションで小堤さんが言ってましたが,Ext Core の API でも Sencha Touch では削除されてるものがあるとのこと,Core だからと思って油断するとハマるらしいです。</div>
<div>
また,アニメーションも CSS Animation を使うようになってたりと,ブラウザ(※WebKit)の機能をフル活用しているそうな.</div>
<div style="margin-top: 1em;">
ここまでで知りたかった情報はだいたい聞けたため,個人的にはお腹いっぱいになってしまいました(汗</div>
<h4>
Sencha Touch入門(株式会社sus4 佐竹さん)</h4>
<div style="margin-top: 1em;">
Sencha Touch で「Hello, world!」から始めようぜ!的なライブコーディング.<br />
ぶっちゃけ,ここで俺がなんか書くよりも,ご本人のブログとサンプルコードを見たほうが早いと思われ(ぉ</div>
<div style="margin-top: 1em;">
<a href="http://extjs.blog.sus4.co.jp/2010/07/27/sencha-studygroup-tokyo20100728/">http://extjs.blog.sus4.co.jp/2010/07/27/sencha-studygroup-tokyo20100728/</a></div>
<div>
<a href="http://jsdo.it/satake.sus4">http://jsdo.it/satake.sus4</a></div>
<div style="margin-top: 1em;">
あと,jsdo.it イイ(゜∀゜</div>
<div>
KAYAC++
</div>
<h4>
Sencha TouchとYubizoで作るネイティブアプリ(株式会社アイキューブドシステムズ 佐々木さん)</h4>
<ul style="margin-top: 1em;">
<li>HTML/CSS/JS な アプリを iPhone のネイティブアプリに変換してくれるよってツール</li>
<li>「End of Native とか言われてアウェー感」(笑)</li>
<li>ただネイティブアプリにパッケージングするだけじゃなくて,カメラとかDBとかに接続するための API も用意してるよ!</li>
<ul>
<li>ここがメインの仕事っぽい(※けっこう頑張ってる感)</li>
<li>ネイティブAPIとのバインディングはURLのフックにより実現</li>
<ul>
<li>yubizo://yubizo/device/info とかへのアクセスをフック</li>
<li>こんなかんじでURLを追加してやれば,機能拡張できるらしい</li>
</ul>
<li>Google Apps とか Twitter とかの API もある</li>
<ul>
<li>mixi と GREE も計画中だそうな</li>
</ul>
</ul>
<li>お金の話</li>
<ul>
<li>パートナー企業募集中!</li>
<li>Yubizo Engine 使って企業内システムとか作ってみませんか?</li>
<li>ライセンスは基本的に1台500円</li>
<li>パートナープログラムの会費は年間20万(※たしか)</li>
</ul>
</ul>
<h4>SpreadOfficeとSencha Touch(小堤さん)</h4>
<div style="margin-top: 1em;">
Ext Japan の中の人.
</div>
<div style="margin-top: 1em;">
時間おしおしで早口だったこともあり,よくわかりませんでした(=_=;;
</div>
<div>
でも,Ext で何も考えずに開発していくと大変なことになる => Omega Trick! っていうのには興味をひかれた.
</div>
<h4>ホワイトクラウド シェアードHaaSのご紹介(ソフトバンクテレコム株式会社 加藤様)</h4>
<div style="margin-top: 1em;">
ある意味で,今回一番のダークホース!最大の収穫!?(ぉ
</div><div style="margin-top: 1em;">
会場を提供してくれたソフトバンクさんの宣伝かーと思いきや,月額定額制ですと!?
</div>
<div>
どんだけ通信しても料金は変わらないんだって!
</div>
<div>でも,アクセスが集中した場合にはインフラ側で通信帯域をしぼるそうな.
</div><div>なので,大規模なサービスを展開する予定で,アクセス集中が事前に予想される場合は,あらかじめ相談してほしいとのこと.必要な帯域を用意できるそうな.
</div><div>もちろん,その場合の料金は別途お見積り.
</div><div style="margin-top: 1em;">まぁ,とりあえず実験的に使ってみるには,とっても嬉しい料金体系ですね><
</div><div style="margin-top: 1em;">
なんでも,いろんなユーザーさんから Amazon S3 の料金体系が分かりにくい,いきなり高額な請求が来そうで恐い,みたいな意見があったらしく,ユーザーのニーズにこたえる形でこうなったとのこと.
</div>
<div>やるなソフバン!!><
</div>
<div style="margin-top: 1em;">不躾な質問にもかからわず,ご丁寧にご回答くださったソフトバンクテレコムの鬼頭様,どうもありがとうございましたm(_ _)m
</div>Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com0tag:blogger.com,1999:blog-1578865794801742329.post-15364080226658330052010-07-21T16:32:00.000+09:002010-07-21T16:32:08.167+09:00JavaScriptは比較演算子"も"推移関係が成り立っていない件<div>
そういえばすっかり三連休も終わってたことだし,すっかり存在を忘れていたブログに小ネタでもメモっておくかー
<br />
<br /></div>
<div>
</div>
<div>
tweet もしたけど (<a href="http://twitter.com/Maki_Daisuke/status/18780506275">http://twitter.com/Maki_Daisuke/status/18780506275</a>),タイトルの通りのおはなしです.</div>
<div>
推移関係 (transitive relation) っていうのは,「風が吹けばほこりがたつ」「ほこりがたてば(略)桶屋が儲かる」だから「風が吹けば桶屋が儲かる」っていう三段論法みたいなやつですね.</div>
<a name='more'></a><div>
一般的には関係<i>R</i> が,どんな組み合わせの a, b, c についても下のように言えるとき,<i>R</i> は推移的であるといいます:
</div>
<pre class="code">a <i>R</i> b で b <i>R</i> c なら a <i>R</i> c</pre>
<div>
数値の大小比較が推移的だというのは直感的にわかるはず.
</div>
<pre class="code">a < b で b < c なら a < c</pre>
<div>
ですもんね.
</div>
<div>
で,上で使った「<tt><</tt>」演算子が,JavaScriptでは推移的ではないよ,というのが本題.</div>
<div>
推移的でないことを示すのは簡単で,ひとつでもいいから上の法則が成り立っていない a, b, c の組み合わせを見つけてやればいいだけ.</div>
<div>ここで以下の組み合わせを考える:
</div>
<pre class="code">a = 1;
b = "2";
c = "three";</pre>
<div>
さて,実行してみると結果は以下のとおり:
</div>
<pre class="code">a < b => 1 < "2" => true
b < c => "2" < "three" => true
a < c => 1 < "three" => false</pre>
<div>
見事に反例を示すことが出来ました.<br /><br />
</div>
<div>
なんでこんな結果になるのかというと,JavaScriptの「<tt><</tt>」は,両辺が文字列だった場合は文字列の辞書順で大小比較をするんですね.
</div>
<div>
どちらか片方でも文字列でなかった場合は,数値に変換して比較するわけです.</div>
<div>
そのため,値の型が揃っていない場合にはこんな珍妙なことが起きるというわけですね.<br /><br /></div>
<div>
そういえばタイトルに「"も"」と書きましたが,JavaScriptでは同様に「==」演算子も推移関係を満たしていないのですよ.
</div>
<div>
これはECMAScriptの仕様書で言及されているくらい有名な(?)事実:</div>
<blockquote>
NOTE 3 The equality operator is not always transitive. For example, there might be two distinct String objects, each representing the same String value; each String object would be considered equal to the String value by the == operator, but the two String objects would not be equal to each other.</blockquote>
<div>
文章で読むとなんだかわかりにくいですが,こういう意味ですね↓
</div>
<pre class="code">a = new String("hoge");
b = "hoge";
c = new String("hoge");</pre>
<div>
として,皆さんも実行してみてください:
</div>
<pre class="code">a == b => true
b == c => true
a == c => false</pre>
<div>
ほらね!<br /><br /></div>
<div>
だったら「<tt><</tt>」についてもNOTEしておけよ!とか思ったのは,別の話(ぉ</div>Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com0tag:blogger.com,1999:blog-1578865794801742329.post-6717787288319939462010-03-26T01:31:00.011+09:002010-08-01T03:27:06.735+09:00ECMAScriptのJIS委員会に行ってきたので...<div>せかっくだから,なんか書くよ.</div><div><br /></div><div>非常に大雑把にいうと今回の委員会は,ECMAScript 5th Edition(JavaScriptコア言語の最新仕様)がECMAで採択されてISO/IEC標準になりそうだから,日本でも審議しなきゃねーという流れで招集されました.</div><div>詳しい話は,委員である竹迫さんの<a href="http://www.slideshare.net/takesako/devsumi2010-ecmascript5-isoiec-jtc1sc22">デブサミ2010でのスライド</a>を見るとバッチリです!(いきなり他力本願だな)</div><div><br /></div><div>で,そういえば,自分も委員だったんですよねー・・・<a name='more'></a></div><div>委員に呼ばれた理由は至極単純.委員会の平均年齢が毎年1歳ずつ上がっていくという,よくある危機を回避すべく,ここらで平均年齢をガっと下げとこうぜ!的なノリで,たまたま委員の人と知り合いだった自分が呼ばれたみたいだよ(ぉぉ</div><div>ぶっちゃけ,ネットを見てると,自分よりもっと適任だよなーって人はたくさんいますね!</div><div><br /></div><div>それはさておき,今回は昨年末に続いて2回目の会合でした.</div><div>前回は顔合わせ程度だったのに対し,今回は具体的に仕様に対してツッコみを入れたりして,予定時間をオーバーする白熱した議論が展開されてましたよ!</div><div><br /></div><div>・・・と書いてきて,あそこでの話をどれくらい書いていいものなのか知らない自分がいました.</div><div>うーん・・・</div><div><br /></div><div>下手なこと書いてもいけないので,ミーティングの内容とは関係ない,ちょっとした小ネタでお茶をにごそう.(ちょっ,タイトルの意味無いじゃん!)</div><div><br /></div><div>すんげー細かい話ですが,5th になって 3rd では構文的に許されてなかった書き方が公式に許容されるようになりましたよ.</div><div>有名なところでは,Automatic Semicolon Insertionが賢くなって,ブロックの閉じブレース「}」の前でセミコロン「;」が省略できるようになりましたよ.</div><div>例えば:</div><pre class="code">do{ s += i } while ( ++i < 10 );<br />// ↑ココ!</pre><div>と一行で書いても,Perlみたいにセミコロン省略しておっけー!</div><div><br /></div><div>あと,閉じブレースに関していうと,オブジェクトリテラルの最後でカンマ「,」を余分に入れてもOKになった:</div><pre class="code">var o = {<br /> a: "hoge",<br /> b: "fuga",<br /> c: "piyo", // ←ココ!<br />};</pre><div>これは配列リテラルでもいっしょ:</div><pre class="code">var arr = [0, 1, 2,,,]; // ←何個でも!</pre><div>特に縦に並べて書くときとかに超便利!!(≧▽≦)b</div><div>・・・・えっ,知ってる?・・・・・・・あ,そう.</div><div><br /></div><div>じゃあじゃあ,これは?</div><div>5thからは,正規表現リテラルの中で使える文字がゆるくなって,文字クラスの中ではスラッシュ「/」をエスケープしなくてよくなりましたよ.</div><div> つまり:</div><pre class="code">var re = /[/]/;</pre><div>これはOK!<br /></div><div>3rdまでは「/[\/]/」って書かなきゃいけなかったケースですね.</div><div>なので,ECMAScriptのlexerとか作ったことある人は要注意ですよー.忘れずに修正しておいてくださいね!</div><div>・・・・・・え,どーでもいい?</div><div>ナニ?それってつまり,気にしてるの俺だけってこと!?</div><div><br /></div><div>ちなみに,これらはもうメジャーなブラウザの最新版ではサポートされてるので,試してみてくださいねー.っていうか,今回の仕様自体,ほとんど事実追認が主体なんで(ぉ</div>Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com0tag:blogger.com,1999:blog-1578865794801742329.post-92106191516035540642010-03-23T02:43:00.011+09:002018-11-01T14:12:06.099+09:00『決弾』を読んだので…<div style="float:right;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00CHRPZ5O" name="amazletlink" target="_blank"><img src="https://images-fe.ssl-images-amazon.com/images/I/516Ku8h5AIL._SL160_.jpg" alt="決弾 最適解を見つける思考の技術" style="border: none;" /></a><br />
</div><div>前回ポストした『ウェブ進化論』の前に読んだので順番が逆になってしまいましたが,忘れないうちに.</div><div><br />
</div><div>電車の中でなんか読むかーと思って,本屋で見つけて購入.なんか,気軽に読めそうだったので.</div><div><br />
</div><div>小飼 弾, 山路 達也『決弾 最適解を見つける思考の技術』 目次:<a name='more'></a></div><blockquote><ul><li>00<span class="Apple-tab-span" style="white-space:pre"> </span>決弾 Determination</li>
<li>01<span class="Apple-tab-span" style="white-space:pre"> </span>男女 Affection</li>
<li>02<span class="Apple-tab-span" style="white-space:pre"> </span>親交 Communication</li>
<li>03<span class="Apple-tab-span" style="white-space:pre"> </span>楽習 Education</li>
<li>04<span class="Apple-tab-span" style="white-space:pre"> </span>仕事 Occupation</li>
<li>05<span class="Apple-tab-span" style="white-space:pre"> </span>育児 Cultivation</li>
<li>06<span class="Apple-tab-span" style="white-space:pre"> </span>人生 From conception to termination</li>
<li>ADDITION<span class="Apple-tab-span" style="white-space:pre"> </span>対弾 v.s. 勝間和代</li>
<li>CONCLUSION</li>
<li>書棚 Information</li>
</ul></blockquote>まずは見出しの統一感にご注目!<div></div><div>漢字2文字で揃えるのはもちろん,横文字によるサブタイトルもすべて「ion」で終わる名詞で統一.</div><div>美しいですねー.</div><div><br />
</div><div>「決弾」とは著者である小飼弾だったらこう決断する,というような意味.</div><div>目次にあるジャンルごとに「こんな時どうしたらいいんですか?」という質問に著者(小飼弾)が答えるQ&A形式になっています.</div><div>副題が「最適解を見つける思考の技術」とありますが,HowToみたいなテクニックを教える本とは違いますね.</div><div><br />
</div><div>自分としては,例の中から「プライオリティ」を説く一冊と理解.</div><div>決断するのに悩むということは何らかの間で板ばさみになっているわけで(たとえば恋人と親友とか),あなたにとって大事なのはなんなの?と自己に問い掛けさせるための例示集なんだと思った.</div><div>著者は最後のQ&Aにおいて「残念ながら、命の重さは平等ではありません。(中略)余命が長い人の命ほど、重いのです。」と命の選択にすら優先順位があると説く.</div><div>これには自分も激しく同意.</div><div><br />
</div><div>しかし最後に著者はCONCLUSIONで次のようにして結ぶ:</div><blockquote> 僕が知らない状態の中で、最も知らないのは、あなたがどうなる、ということではなく、あなたがどうしたいか、ということ。決断の価値を決めるのは、どうなるという予測ではなく、どうしたいという欲求なのです。</blockquote><blockquote><span style="font-weight:bold;">「決弾」は、僕が書きました。</span><br />
<br />
ここから先は、あなたの決断です。</blockquote><div>これはもちろん,小飼弾ならこうだけどあなたは違うほうを選んでも構いませんよ,という意味合いを含んでいる.</div><div>それこそ,あえて優先順位をつけない生き方を選ぶという選択肢だってありうるということを示唆しているように思える.そう,自分がそうしたいのなら.</div><div>そんな選択の先には,それこそ,長編ドラマが撮りおろせちゃうくらいのアツイ人生が待っているかもしれない.</div><div>なんとも懐が深い話ではありませんか.</div><div><br />
</div><div>で,そんな本筋とはまったく関係なく,実のところ,本書で自分が一番印象に残ったのは,著者と勝間氏の対談における著者(小飼弾)の一言:</div><blockquote>いい本なら「私を読んで」という声があとで聞こえてきます。これは本当ですよ。</blockquote><div>ですよねー.と思った.</div><div><br />
</div><div>自分の場合は漫画だったけど,ある時期,くだらないものからメジャーなものまで,年間600冊以上の漫画を読みまくっていた時期があって,そのときには独特の感覚があった.</div><div>本屋に行って(ほぼ毎日ですね),「さーて今日はどいつを読んでやろうかなー」と何を見るでもなくキョロキョロしながら書棚の間を歩き回っていると,突然吸いよせられるように1冊の本が気になりはじめるんだよね.</div><div>もちろん,平積みのほうではなくて書棚に並んでる中から.</div><div>で,「そうかそうか,今日はおまえか」と,それを手にとってレジに持っていくわけ.</div><div>そうやって出会って,いまだにお気に入りでいる作品や漫画家は多い.</div><div><br />
</div><div>だから自分は,八百万の神はいると思ってる.だって,本の神様(精霊)は現にいるし(ぉぉ</div><div>このネタで中二的なラノベが一本書けるんじゃないか,とか本気で思ったりもする.</div><div><br />
</div><div>かなりアブないヤツみたいだが(実際そうなんだが),これはいわゆる「刑事のカン」っていうのと同じことなんだと思う.</div><div>著者と同じく多読家である勝間氏の言を引用しよう:</div><blockquote> 率直に言えば、目利きになるのに必要なのは知識です。「何とか出版」の「何とかさん」が「何とか」について書いているのだから、まあ大丈夫だろうという確率論と言えます。愚直に数を当たって、自分の中のデータベースを充実させれば、当たりの本に出会う確率も高くなるでしょう。</blockquote><div>人間の脳ってのは不思議なもんで,こんなふうにして積み上げられた有形・無形の知識が,無意識のうちに織り上げられて,無意識から意識に情報をインプットしてくれるようになるんじゃなかろうかと推測している.</div><div>だから小飼氏の「聞こえてくる」という表現は,かなり正鵠を射ているように思うのだ.</div><div>確かに,実際の聴覚とは異なる.</div><div>しかし,自分の意識をコンピュータ上のOSにたとえるなら,ある種の仮想デバイスからの入力のようなもんだと言えよう.</div><div>っつって通じるんかな?w</div><div>この喩えに比べれば,「本の精霊の声が聞こえる」という喩えのほうが,よっぽどuser friendlyでわかりやすいでしょ?</div><div><br />
</div><div>ま,そんな自分も,漫画読む量が減ったら,めっきりそんな感覚も衰えてしまいました.</div><div>今では書棚からどころか,平積みにされてる本からすら声が聞こえねーですよ.残念!</div><div><br />
</div><div>ちなみに,こういう感覚を磨くのに重要なのは,「あたり」だけでなく「はずれ」もいっぱい引いておくことなんだと,本当に思う.</div><div>失敗を恐れて前進なし!失敗なくして成長なし!</div>Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com0tag:blogger.com,1999:blog-1578865794801742329.post-55220535802304356432010-03-22T12:06:00.004+09:002018-11-01T14:15:40.416+09:00梅田望夫『ウェブ進化論』を読んだので…<div style="float: right;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4480062858" name="amazletlink" target="_blank"><img src="https://images-fe.ssl-images-amazon.com/images/I/511621HKYPL._SL160_.jpg" alt="ウェブ進化論 本当の大変化はこれから始まる (ちくま新書)" style="border: none;" /></a><br />
</div><div style="float: right;"><br />
</div><div style="float: right;"><br />
</div><div>梅田望夫・著『ウェブ進化論 ―本当の大変化はこれから始まる』 読了.</div><div><br />
</div><div>今更ですけどねー</div><div><br />
</div><div>もちろん,例の<a href="http://d.hatena.ne.jp/yappo/20090618/1245299768">騒動</a>のことも知った上で読んだ.</div><div>むしろ,知ったからこそ,どういうことなのか自分の目で確かめてみようとも思ったのだった.</div><div><br />
</div><div>とりあえず,小飼弾氏に倣って,目次をば:<br />
<a name='more'></a></div><br />
<blockquote><ul><li>序 章: ウェブ社会 ― 本当の大変化はこれから始まる</li>
<li>第一章: 「革命」であることの真の意味</li>
<li>第二章: グーグル ― 知の世界を再編成する</li>
<li>第三章: ロングテールとWeb 2.0</li>
<li>第四章: ブログと総表現社会</li>
<li>第五章: オープンソース現象とマス・コラボレーション</li>
<li>第六章: ウェブ進化は世代交代によって</li>
<li>終 章: 脱エスタブリッシュメントへの旅立ち</li>
<li>初出について</li>
<li>あとがき</li>
</ul></blockquote><div>率直に言って,4年前(実際に執筆されたのは2005年だろうけど)にこの内容を書いていたのは凄いことだと思った.</div><div>4年の間に実際に体験していることもあるので,多くは"復習"に過ぎないのだけれど,それでも言葉としてまとめられているのを見ると,自分の中の認識が他人の表現によって鮮鋭化されていくのを感じた.</div><div>その点については,件の騒動はどうあれ,本書の価値が貶められることはないだろう.</div><div>たしかに,Google礼讃一本やりという批判はある.しかしこの4年,Googleの存在は弥増すばかりだったわけで,その点においても著者に先見の明があったのだ――というのは甘すぎるだろうか.</div><div><br />
</div><div>"復習"と書いたが,この4年間を追体験できるということは,本書のあと書きにもあるような「若い世代」と「大人」のジェネレーションギャップを埋めるためのブリッジとしては使える一冊になっていると思う.</div><div>そしてそれこそが,多くの年配経営者を相手にコンサルティングを続けてきた著者の真骨頂でもある.</div><div>その点において,この本は成功だったのだと思っている.</div><div><br />
</div><div>一方で,他の章に比べて第五章が大きく精彩に欠くのは確かだ.これではオープンソースをまったく理解していないと言われても仕方がない.</div><div>でも,ちょっと強調しておきたいことが一点.</div><div>実はこの第五章,見出しに「オープンソース」と書いておきながら,実は著者はいわゆるオープンソースについて語る気は最初からないのだ.</div><div>これは本書p175を読めばわかる:</div><div><blockquote>ソフトウェア世界を超えたところでの「オープンソース」的な営みを「オープンソース現象」と呼ぶことにする。</blockquote>全36ページある第五章の3ページ目(扉ページを含むので実質2ページ目)でこう定義してからは,ずっと著者の定義する「オープンソース現象」について語っている.</div><div>この定義は見るからにいただけないが,それでも「ソフトウェア世界を超えたところ」と書いてあるので,少なくともソフトウェア開発者である我々が難癖をつけられる世界のことを指しているわけではないようである.</div><div>だから,オープンソースソフトウェアの見地から本章にケチをつけるのは,実は的はずれなのではなかろうか?</div><div><br />
</div><div>にも関わらず,こんな紛らわしい名前を与えてしまったのだから,非が著者にあるのは否めまい.これは完全にテクニカルタームの選択ミスだ.</div><div>しかも,もともとがいただけない定義なのにも関わらず,そのあとで「広義の「オープンソース現象」」なんて表現が出てくるもんだから,もうワケワカメな状態になってしまっている.</div><div>だからオープンソースを語るな!とか言われちゃっても,仕方がないということだ.</div><div>(まぁ,それをいったら,Thomas S. Kuhnだってparadigmなんて単語を使ってしまったばっかりに炎上しちゃったんだから,テクニカルタームの選択はそうそう上手くいくもんではないんですよねぇ)</div><div><br />
</div><div>では,<a href="http://d.hatena.ne.jp/higayasuo/20090619/1245401284">ひが氏が言う</a>ように「オープンソース」ではなく「<a href="http://ja.wikipedia.org/wiki/%E3%83%90%E3%82%B6%E3%83%BC%E3%83%AB%E6%96%B9%E5%BC%8F">バザールモデル</a>」という用語にすれば良かったのかというと,個人的にはそれもちょっと違う気がしている.</div><div>というのは,著者が「広義の「オープンソース現象」」としてあげている「グーグル・ブックサーチ」や「ブッククロッシング」がバザールモデルに当てはまるのかと言ったら,あてはまらないように思うのだ.</div><div>うーん,残念ながら,自分には適切な単語は思いつかない・・・</div><div>(※バザールモデルへの置き換えの是非については,<a href="http://d.hatena.ne.jp/ktdisk/20090619/1245399295">ktdisk氏が別の観点から言及している</a>ので,興味がある方はご一読を)</div><div><br />
</div><div>思うに,オープンソースとか集合知とかマス・コラボレーションとか,それぞれに異なる現象を十把一絡げに「オープンソース的なもの」として説明づけようとしてしまったところが,すべての失敗の始まりなのだろう.</div><div>まずは精細な対象の分析をしなかったことが,本章が精彩に欠く理由というのが自分の見解だ.</div><div><br />
</div><div>あと,ついでなので,もひとつ苦言を.</div><div>終章の見出しから自分は,読者に対して今後進むべき指針を示すような期待感を受けたんだけど,読んでみると,なんだか著者の近況報告と私信みたいになってしまっている.</div><div>こんな内容できれいっぽくまとめようとするくらいだったら,「大変化がどんなものかはわかんないけどね!」と開きなおって,読者を新時代の荒波に向かって投げっぱなしにするような内容のほうがよっぽど面白かったんじゃないかって思う.</div><div>はてな社での仕事にwktkしてたのはすっごく伝わってくるけど,それはあとがきに書くべきだったんじゃないかなぁ・・・</div><div><br />
<div style="float: right;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000GPPKZO" name="amazletlink" target="_blank"><img src="https://images-fe.ssl-images-amazon.com/images/I/51Znw2EM%2B9L._SL160_.jpg" alt="プロフェッショナル 仕事の流儀 スタジオジブリ 鈴木敏夫の仕事 自分は信じない 人を信じる [DVD]" style="border: none;" /></a><br />
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4004311438" name="amazletlink" target="_blank"><img src="https://images-fe.ssl-images-amazon.com/images/I/41UNUc1pN-L._SL160_.jpg" alt="仕事道楽―スタジオジブリの現場 (岩波新書)" style="border: none;" /></a><br />
</div><br />
<br />
</div><div>まぁ,色々書いてきましたが,個人的にはオススメの一冊です.</div><div>今度,ウチの親父様にも読ませようw</div><div><br />
</div><div></div><div>さて,話はガラリと変わりますが,本書第五章で『「みんなの意見」は案外正しい』に言及しているところで,ふっとスタジオジブリの鈴木敏夫の言葉を思い出したんです.ちょうど本書と並行して『仕事道楽 スタジオジブリの現場』を読んでいたからっていうのもあるんでしょうけどね.</div><div>その言葉というのは,</div><blockquote>自分は信じない 人を信じる</blockquote><div>ちなみにこれは,『仕事道楽』の中に書いてあることじゃなくて,NHKの有名番組「プロフェッショナル 仕事の流儀」で鈴木敏夫プロデューサーが取り上げられたときにキーワードとして使われたもの.DVDのタイトルにもなってますね.</div><div>番組中では,壁にぶち当たったときに人に答えを求める鈴木プロデューサーの流儀を象徴する言葉として使われている.</div><div>これってなんだか,うまいこと集合知を使っているように思えたのだ.</div><div><br />
</div><div>特に,ジブリ映画のキャッチコピーに,なぜかしら世相感というか,現代的なメッセージを感じてしまうのは,こうした鈴木プロデューサーの手法によっているんじゃないだろうか.</div><div><div>しかもこれは,「企画は半径3メートル以内にいっぱい転がっている」という宮崎駿監督の映画作りにも繋がっている気がする.(この言葉の意味するところは,是非『仕事道楽』を読んでお楽しみいただきたい)</div><div><br />
</div><div>それから鈴木プロデューサーと言えば,パーソナリティを努めるラジオ番組「<a href="http://www.tfm.co.jp/asemamire/">ジブリ汗まみれ</a>」に<a href="http://www.tfm.co.jp/asemamire/index.php?blogid=31&archive=2010-1-17">Google Japan社長の辻野晃一郎氏がゲストで出演した際</a>に,件の『ウェブ進化論』を読んで対峙している.</div><div>そいでもってそこで,iPhoneのビジネスがすごく古臭く見える,スティーブ・ジョブズは旧来の人,と一刀両断している(!).</div><div>その見解が正しいかどうかはさておき,その鈴木節は実に痛快だ.</div><div>興味がある人は,<a href="http://www.tfm.co.jp/asemamire/index.php?catid=173">バックナンバー</a>があるので聴いてみると面白いと思います.2010/01/19配信の回ですよ.</div><div><br />
</div><div>ところで今回,調子に乗ってアマゾンのリンクをぺたぺたと貼りまくってしまったけど,邪魔かなぁ・・・?</div><div>邪魔だったら言ってくらはい.</div><div><br />
</div><div>さて,次は<a href="http://blog.livedoor.jp/dankogai/archives/50452845.html">弾さんの教え</a>に従って『グーグル 既存のビジネスを破壊する』を読むかー</div></div>Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com0tag:blogger.com,1999:blog-1578865794801742329.post-49222556773117605982010-03-22T05:34:00.010+09:002010-08-01T03:43:18.417+09:00なんでBroggerにしたのかっていうと…<div style="text-align: left;">正直迷ったんですけどね.</div><div><div style="text-align: left;"><br /></div><div style="text-align: left;">やっぱり自分がよく読んでるプログラマの人たちのブログは<a href="http://d.hatena.ne.jp/">はてなダイアリー</a>が多い気がするし,<a href="http://twitter.com/dankogai">@dankogai</a> 氏を真似するなら <a href="http://blog.livedoor.jp/">livedoor Blog</a> だろうし,国内シェアでいったら<a href="http://ameblo.jp/">アメブロ</a>だろうし…<a name='more'></a></div><br /><div style="text-align: left;">ところが自分は,<a href="http://www.google.com/mail/">Gmail</a>も<a href="http://www.google.com/calendar/">Google Calendar</a>も使ってて<a href="http://groups.google.com/">Google Groups</a>をメーリングリスト代わりに使って会社のシステムも<a href="http://www.google.com/apps/">Google Apps</a>だし<a href="http://code.google.com/p/maketext-js/">Google Code</a><span><span>にプロジェクト上げてる</span></span>しブラウザは<a href="http://www.google.com/chrome/">Chrome</a>だし<a href="http://www.nttdocomo.co.jp/product/foma/pro/ht03a/">HT-03A</a>も発売日から使ってたりするわで,どんだけ?っていうくらい<a href="http://www.google.com/">Google</a>に依存してるので,ここまで来たら<a href="http://www.google.com/options/">Google系のサービス</a>を使わない選択肢はないんじゃないですかねー?ということで<a href="http://www.blogger.com/">Blogger</a>にしましたことよ.</div><div><div style="text-align: left;"><br /></div><div style="text-align: left;">まぁ,結局決め手になったのは,「これ以上管理するアカウントを増やしたくない」ということだったんですけどね.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">というわけで,リンクの貼り方はバッチリだ!(ぉ</div></div></div>Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com2tag:blogger.com,1999:blog-1578865794801742329.post-47924916388553893692010-03-22T04:37:00.012+09:002010-03-22T12:12:21.713+09:00よーし、ブログでもはじめるかぁ<div> 日曜 夜10時.</div><div> メシを食いに家を出た.</div><div> 3月も終盤だというのに思ったよりも寒かった.</div><div> あんまり寒いのでつい走り出してしまった.</div><div> ふだん運動なんてまったくしないのにそのまま1キロほど走った.</div><div> むしょうに気持ちよかった.</div><div> 自分の中で なにかのスイッチが切り替わった気がした.</div><div> 「よしブログはじめよう」</div><div> 今ここ↑<br /><a name='more'></a><div><br /></div><div> 実のところ2年くらい前までは自宅にサーバを立ててwikiでブログもどきをやっていたのだけれど,サーバマシンが壊れてからというもの,立て直すのが面倒でほったらかしになってた.</div><div> 要は,自分でサーバを設営して運用して管理して・・・っていうのがバカらしくなってしまったんですね.</div><div> それからは,たま~にmixiとかで散発的に書き散らす程度でした.</div><div><br /></div><div> それが何故今になってまたブログを始める気になったのかというと,アウトプットをする場所が欲しくなったから.</div><div> これはよく言われていることだと思うけれど,アイデアというのは情報をインプットするだけじゃダメで,アウトプットしなくちゃアイデアにならない.しかも,アウトプットすることで自分の中のアイデアは減るどころか,どんどん増える不思議な性質を持っている(と思っている).</div><div> だったらどんどんアウトプットしなきゃ損!</div><div><br /></div><div> これに関していつも思い出すのは,宮崎駿の言葉.</div><div> どこで言ってたのかうろ覚えだけど,たしか『もののけ姫』が公開された頃のインタビューだったと思う(今度時間がある時に調べよう).</div><div> どうしてそんなに次々とアイデアが出てくるのですか?というようなインタビュワーの質問に対して,アイデアを出しつくしたらすぐに次のものが出てくる.ため込んだらダメ.というようなことをおっしゃっていた.</div><div> ですよねー.(自分の記憶違いかもしれませんけどねー)</div><div><br /></div><div> それからもうひとつ重要なきっかけがある.</div><div> ここしばらくtwitterで,ほぼ毎日くだらないことをつぶやきまくっていたおかげで,アウトプットすることへの抵抗感がものすごく少なくなったこと.</div><div> やはり以前は,"ブログ!" とかいうとそれなりにまとまった文量と内容がないとあかんかなーと気にしてしまっていたけど,twitterは見事にその心理的障壁をぶち壊してくれた.</div><div> あえて140文字(256文字でも140 bytesでもない!)に制限するというデザインは,本当に絶妙の域であるとしか言えない.(これはやってみるまで想像だにしていなかった!)</div><div><br /></div><div> でも,やっぱりtwitterではうまくアウトプットできないこともある.</div><div> 140文字に収まらないこともそうだけど,プログラムのコードとかもね.</div><div> そんな時にブログを使おうという,至極当たり前のことを今更になって実行に移したと,そういうことです.</div><div><br /></div><div style="margin-left:4em; text-indent:-4em;">なので,基本的にはtwitter,それでもの足りなかったときのためのyet anotherがブログというゆる~いかんじです.</div><div style="margin-left:4em; text-indent:-4em;">そして,あくまで自分のアウトプットのためなので,それが人様の役に立つとは思っていません.</div><div style="margin-left:4em; text-indent:-4em;">しかし,そんな自己完結的な内容でも,誰かがくすっと笑えるような何かがあれば,それはとても嬉しい.</div><div style="margin-left:4em; text-indent:-4em;">なので,誰のためでもなく,マイペースに,ひっそりと,やっていけたらなぁということで,ひとつ,よろしくたのんます.</div></div>Anonymoushttp://www.blogger.com/profile/00092896614677500463noreply@blogger.com0