minasa@hatenablog 2016-01-08T20:30:22+09:00 minasa757 Hatena::Blog hatenablog://blog/12921228815723638303 2015年 個人的お気に入り音楽 hatenablog://entry/6653586347152158007 2016-01-08T20:30:22+09:00 2016-01-08T20:30:22+09:00 新年明けました。本年もよろしくお願い致します。 去年を音楽で振り返りたいと思います。 星野源 - SUN こういうハッピーな曲が好きです。 響き重視の複雑なコードとそれに絡むベースがいい。 SUN星野源J-Pop¥250provided courtesy of iTunes Lolica Tonica - Make me feel (pop remix) remixながらオリジナルかと思わせる再構築の上手さがいいです。 一条蛍(村川梨衣),越谷夏海(佐倉綾音),越谷小鞠(阿澄佳奈),宮内れんげ(小岩井ことり) - おかえり ZAQ節と編曲とDメロが最高。 アニメ1期を見てから聴きましょう。 お… <p>新年明けました。本年もよろしくお願い致します。</p> <p>去年を音楽で振り返りたいと思います。</p> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B1%CC%EE%B8%BB">星野源</a> - SUN</h3> <p>こういうハッピーな曲が好きです。</p> <p>響き重視の複雑なコードとそれに絡むベースがいい。</p> <p><div class="itunes-embed freezed itunes-kind-song"><a href="https://itunes.apple.com/jp/album/sun/id1003258316?i=1003258781&uo=4&at=10l8JW&ct=hatenablog" rel="nofollow" target="_blank"><img src="http://cdn.image.st-hatena.com/image/scale/3fc7196e4debf68a758ea58d970d6402bd2d7b06/enlarge=0;height=200;version=1;width=200/http%3A%2F%2Fis1.mzstatic.com%2Fimage%2Fthumb%2FMusic7%2Fv4%2Fc8%2F5f%2Fe2%2Fc85fe29a-0a29-10f3-7d8f-15beaf43b745%2Fsource%2F100x100bb.jpg" alt="SUN" title="SUN" class="itunes-embed-image"/></a><div class="itunes-embed-info"><p class="itunes-embed-title"><a href="https://itunes.apple.com/jp/album/sun/id1003258316?i=1003258781&uo=4&at=10l8JW&ct=hatenablog" rel="nofollow" target="_blank">SUN</a></p><ul><li class="itunes-embed-artist"><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B1%CC%EE%B8%BB">星野源</a></li><li class="itunes-embed-genre">J-Pop</li><li class="itunes-embed-price">¥250</li><li class="itunes-embed-badge"><a href="https://itunes.apple.com/jp/album/sun/id1003258316?i=1003258781&uo=4&at=10l8JW&ct=hatenablog" rel="nofollow" target="_blank"><img src="/images/theme/itunes/itunes-badge-itunes@2x.png" width="44px" height="15px" /></a></li></ul><ul><li class="itunes-embed-preview"><audio src="http://a766.phobos.apple.com/us/r20/Music7/v4/60/8e/9f/608e9f8a-b66a-0930-aeda-5ae205d76bd8/mzaf_6030633794320517350.plus.aac.p.m4a" controls></audio></li><li><small class="provided-courtesy-of-itunes">provided courtesy of <a class="keyword" href="http://d.hatena.ne.jp/keyword/iTunes">iTunes</a></small></li></ul></div></div></p> <h3>Lolica Tonica - Make me feel (pop remix)</h3> <p>remixながらオリジナルかと思わせる再構築の上手さがいいです。</p> <iframe width="100%" height="166" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/228183449&amp;color=ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false"></iframe> <h3>一条蛍(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C2%BC%C0%EE%CD%FC%B0%E1">村川梨衣</a>),越谷夏海(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BA%B4%C1%D2%B0%BD%B2%BB">佐倉綾音</a>),越谷小鞠(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B0%A4%C0%A1%B2%C2%C6%E0">阿澄佳奈</a>),宮内れんげ(<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%AE%B4%E4%B0%E6%A4%B3%A4%C8%A4%EA">小岩井ことり</a>) - おかえり</h3> <p>ZAQ節と編曲とDメロが最高。</p> <p>アニメ1期を見てから聴きましょう。</p> <p><div class="itunes-embed freezed itunes-kind-song"><a href="https://itunes.apple.com/jp/album/okaeri/id1036053050?i=1036053554&uo=4&at=10l8JW&ct=hatenablog" rel="nofollow" target="_blank"><img src="http://cdn.image.st-hatena.com/image/scale/9cb4660d79557751b5593d08244683508810cbdb/enlarge=0;height=200;version=1;width=200/http%3A%2F%2Fis4.mzstatic.com%2Fimage%2Fthumb%2FMusic49%2Fv4%2F55%2Ff3%2Ff7%2F55f3f713-bd42-0dd5-cfb1-8f4f4b64d595%2Fsource%2F100x100bb.jpg" alt="おかえり" title="おかえり" class="itunes-embed-image"/></a><div class="itunes-embed-info"><p class="itunes-embed-title"><a href="https://itunes.apple.com/jp/album/okaeri/id1036053050?i=1036053554&uo=4&at=10l8JW&ct=hatenablog" rel="nofollow" target="_blank">おかえり</a></p><ul><li class="itunes-embed-artist">宮内れんげ(CV.<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%AE%B4%E4%B0%E6%A4%B3%A4%C8%A4%EA">小岩井ことり</a>)、一条蛍(CV.<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C2%BC%C0%EE%CD%FC%B0%E1">村川梨衣</a>)、越谷夏海(CV.<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BA%B4%C1%D2%B0%BD%B2%BB">佐倉綾音</a>)、越谷小鞠(CV.<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B0%A4%C0%A1%B2%C2%C6%E0">阿澄佳奈</a>)</li><li class="itunes-embed-genre">アニメ</li><li class="itunes-embed-price">¥250</li><li class="itunes-embed-badge"><a href="https://itunes.apple.com/jp/album/okaeri/id1036053050?i=1036053554&uo=4&at=10l8JW&ct=hatenablog" rel="nofollow" target="_blank"><img src="/images/theme/itunes/itunes-badge-itunes@2x.png" width="44px" height="15px" /></a></li></ul><ul><li class="itunes-embed-preview"><audio src="http://a593.phobos.apple.com/us/r30/Music49/v4/55/e1/7a/55e17a12-c6c0-c63e-14e7-edd1f569cc91/mzaf_6460362343473834231.plus.aac.p.m4a" controls></audio></li><li><small class="provided-courtesy-of-itunes">provided courtesy of <a class="keyword" href="http://d.hatena.ne.jp/keyword/iTunes">iTunes</a></small></li></ul></div></div></p> minasa757 Plack::Middleware::Static::Range が使えない問題の解決方法 hatenablog://entry/6653586347149848289 2015-12-25T13:02:11+09:00 2015-12-25T13:22:03+09:00 Plackを用いてHTTP pseudo-streamingを行いたい場合には、Plack::Middleware::Static::Range を用いれば良いという情報がよく書かれています。 しかしながらPerl 5.22.1のような新しいバージョンを利用している場合、依存している PerlIO::subfile というモジュールのインストールに失敗するため、インストールすることができません。 Plackとhtmlのvideoタグを一緒に使う場合に気をつける事 - Qiita 上記記事では開発版のPerlを用いていないことが原因とされていますが、本当の原因は、Perl 5.20あたりからus… <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Plack">Plack</a>を用いてHTTP pseudo-streamingを行いたい場合には、<a href="https://metacpan.org/pod/Plack::Middleware::Static::Range">Plack::Middleware::Static::Range</a> を用いれば良いという情報がよく書かれています。 しかしながら<a class="keyword" href="http://d.hatena.ne.jp/keyword/Perl">Perl</a> 5.22.1のような新しいバージョンを利用している場合、依存している <a href="https://metacpan.org/pod/PerlIO::subfile">PerlIO::subfile</a> というモジュールのインストールに失敗するため、インストールすることができません。</p> <p><a href="http://qiita.com/celeron1ghz/items/102a6f7e5a5c7f5c5fb1">Plackとhtmlのvideoタグを一緒に使う場合に気をつける事 - Qiita</a></p> <p>上記記事では開発版の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Perl">Perl</a>を用いていないことが原因とされていますが、本当の原因は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Perl">Perl</a> 5.20あたりからusesfioというビルドオプションが無くなってしまったためです。</p> <p>forkして修正しようかと思ったんですが、すでに作られていた方がいたのでそちらを利用しましょう。</p> <p><a href="https://github.com/nqounet/PerlIO-subfile">nqounet/PerlIO-subfile</a></p> <pre class="code" data-lang="" data-unlink>$ cpanm https://github.com/nqounet/PerlIO-subfile/archive/master.tar.gz</pre> <p>こんな感じでインストールしてから、もう一度<a class="keyword" href="http://d.hatena.ne.jp/keyword/Plack">Plack</a>::Middleware::Static::Rangeをインストールすると上手くいきます。</p> minasa757 3ヶ月ぶりに松屋に行きました hatenablog://entry/6653586347149046766 2015-12-18T23:58:23+09:00 2015-12-19T00:22:01+09:00 この記事は、松屋 Advent Calendar 2015 18日目の記事です。 3ヶ月ぶり(正確には2ヶ月と21日ぶり)に松屋に行きました。 なぜ3ヶ月もブランクが空いたのかと言えば、外食などという贅沢をする余裕がないためです。 貧乏学生たるもの、身の丈にあった食生活というものを送らざるを得ないのであります。 そんなことはさておき、久しぶりの松屋ですから楽しんでいきましょう! 17:16 - 到着 昼間にやらなければならないことは終えたので松屋にやって参りました。 いつも通りの佇まいです。 17:17 - 食券購入 大好きな塩ビ丼(ネギたっぷり ネギ塩豚カルビ丼)を購入。 同刻 - 着席 今… <blockquote><p>この記事は、<a href="http://www.adventar.org/calendars/777">松屋 Advent Calendar 2015</a> 18日目の記事です。</p></blockquote> <p>3ヶ月ぶり(正確には2ヶ月と21日ぶり)に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%BE%B2%B0">松屋</a>に行きました。 なぜ3ヶ月もブランクが空いたのかと言えば、外食などという贅沢をする余裕がないためです。 貧乏学生たるもの、身の丈にあった食生活というものを送らざるを得ないのであります。 そんなことはさておき、久しぶりの<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%BE%B2%B0">松屋</a>ですから楽しんでいきましょう!</p> <h4>17:16 - 到着</h4> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/minasa757/20151219/20151219001408.jpg" alt="f:id:minasa757:20151219001408j:plain" title="f:id:minasa757:20151219001408j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>昼間にやらなければならないことは終えたので<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%BE%B2%B0">松屋</a>にやって参りました。 いつも通りの佇まいです。</p> <h4>17:17 - 食券購入</h4> <p>大好きな塩ビ丼(ネギたっぷり ネギ塩豚カルビ丼)を購入。</p> <h4>同刻 - 着席</h4> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/minasa757/20151219/20151219001435.jpg" alt="f:id:minasa757:20151219001435j:plain" title="f:id:minasa757:20151219001435j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>今日はいい席に座れました。 あまり席にこだわりはなく適当に座ってしまいますが、空調の風が直撃する場所だったり、店員さんが目の前でずっと作業をしていたりすると、少しテンションが下がります。</p> <h4>17:19 - Swarm チェックイン</h4> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/minasa757/20151218/20151218235922.png" alt="f:id:minasa757:20151218235922p:plain:w320" title="f:id:minasa757:20151218235922p:plain:w320" class="hatena-fotolife" style="width:320px" itemprop="image"></span></p> <p>残念ながらメイヤーは取られてしまっているようです。 しかし200回目の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%BE%B2%B0">松屋</a> 西千葉店でのチェックインだったらしく、ボーナスポイントがもらえました! 人間とは画面に数字が出てくるだけで喜ぶ生き物なのです。</p> <h4>17:25 - 塩ビ丼 到着</h4> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/minasa757/20151219/20151219001452.jpg" alt="f:id:minasa757:20151219001452j:plain" title="f:id:minasa757:20151219001452j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>ギリギリワンオペの時間帯で、お弁当のお客さんの扱いに少し手間取っていたため、若干時間がかかりました。 いただきます!</p> <h4>17:38 - 完食</h4> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/minasa757/20151219/20151219001517.jpg" alt="f:id:minasa757:20151219001517j:plain" title="f:id:minasa757:20151219001517j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>ごちそうさまでした。</p> <h2>おまけ:<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%BE%B2%B0">松屋</a>遍歴</h2> <h4>店舗別</h4> <ol> <li>202回 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%BE%B2%B0">松屋</a> 西千葉店 (2011/07/13 23:06)</li> <li>5回 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%BE%B2%B0">松屋</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BD%A9%CD%D5%B8%B6">秋葉原</a>店 (2011/06/12 18:38)</li> <li>3回 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%BE%B2%B0">松屋</a> 稲毛店 (2011/12/18 06:28)</li> <li>2回 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%BE%B2%B0">松屋</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BD%A9%CD%D5%B8%B6">秋葉原</a>中央通り店 (2011/07/23 08:58)</li> <li>1回 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%BE%B2%B0">松屋</a> 蒲田東口店 (2011/10/08 12:54)</li> <li>1回 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%BE%B2%B0">松屋</a> 千葉幸町店 (2011/06/19 21:30)</li> <li>1回 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%BE%B2%B0">松屋</a> 渋谷並木橋店 (2011/09/23 14:17)</li> <li>1回 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%BE%B2%B0">松屋</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C3%E7%B8%E6%C5%CC%C4%AE">仲御徒町</a>店 (2012/07/01 13:29)</li> <li>1回 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%BE%B2%B0">松屋</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BD%C2%C3%AB%C6%BB%B8%BC%BA%E4">渋谷道玄坂</a>上店 (2011/05/08 14:55)</li> <li>1回 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%BE%B2%B0">松屋</a> 横浜西口店 (2013/01/15 11:52)</li> <li>1回 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%BE%B2%B0">松屋</a> 穴川オーツーパーク店 (2013/10/23 20:54)</li> <li>1回 <a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%BE%B2%B0">松屋</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C2%E7%B0%E6%C4%AE">大井町</a>店 (2011/08/12 07:37)</li> </ol> <p>約 5 年間で 12 店舗に 220 回行っているようです。 (チェックインしていないものもあるので、実際にはもう少し多いです)</p> <p>あと、Swarm のアプリには 200 回目のチェックインって言われたんですが 202 回目だそうです。</p> <h4>時間帯</h4> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/minasa757/20151218/20151218234808.png" alt="f:id:minasa757:20151218234808p:plain" title="f:id:minasa757:20151218234808p:plain" class="hatena-fotolife" itemprop="image"></span></p> <p>17 時が最も多く、2,3,4,8 時が最も少ないようです。 行ったことがない時間帯がないというのはどうかと思いました。</p> <h4>Swarm から<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BE%BE%B2%B0">松屋</a>遍歴を集計する<a class="keyword" href="http://d.hatena.ne.jp/keyword/Perl">Perl</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a></h4> <p>今回の記事を書くために使った<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>です。 <a href="https://ja.foursquare.com/feeds/">Check-in Feeds</a> から ics をダウンロードして、以下の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>に投げるといい感じに整形します。</p> <p><script src="https://gist.github.com/76979a48587a3ce65d27.js"> </script></p> <p><a href="https://gist.github.com/76979a48587a3ce65d27">matsuya.pl</a></p> <h2>ちなみに</h2> <p><a href="http://www.amazon.co.jp/registry/wishlist/BP17AOBKXYLN">来週水曜日(12/23)は、僕の誕生日です。</a></p> <h2>そして</h2> <p>明日の <a href="http://www.adventar.org/calendars/777">松屋 Advent Calendar 2015</a> は <a href="https://twitter.com/rakugou">rakugou</a> さんです。</p> minasa757 Haxe+OpenFL+Box2Dについていろいろ hatenablog://entry/6653458415127699830 2015-11-11T08:12:04+09:00 2015-11-11T08:12:04+09:00 先月末くらいから Haxe + OpenFL + Box2D でよくわからないものを作ってみたりしました。 そのときに思ったことをつらつらと書いてみます。 flash ターゲットはもちろん、windows や mac ターゲットも普通に動く 画像、音、キーボード、マウスは完璧 TextField がかなり怪しい フォントサイズ指定しても、環境によって大きさが違って崩れる ttfフォント指定してもだめだし、同じフォントなのに高さが違ったりする wrapping も挙動不審 mobile系のターゲットだとそもそも表示されないこともある Asset がすこし不安 動作自体は全く問題ないんですが、いざ… <p>先月末くらいから <a class="keyword" href="http://d.hatena.ne.jp/keyword/Haxe">Haxe</a> + OpenFL + Box2D でよくわからないものを作ってみたりしました。 そのときに思ったことをつらつらと書いてみます。</p> <hr /> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/flash">flash</a> ターゲットはもちろん、<a class="keyword" href="http://d.hatena.ne.jp/keyword/windows">windows</a> や <a class="keyword" href="http://d.hatena.ne.jp/keyword/mac">mac</a> ターゲットも普通に動く</li> <li>画像、音、キーボード、マウスは完璧</li> <li>TextField がかなり怪しい <ul> <li>フォントサイズ指定しても、環境によって大きさが違って崩れる</li> <li>ttfフォント指定してもだめだし、同じフォントなのに高さが違ったりする</li> <li>wrapping も挙動不審</li> <li>mobile系のターゲットだとそもそも表示されないこともある</li> </ul> </li> <li>Asset がすこし不安 <ul> <li>動作自体は全く問題ないんですが、いざ配布するというときに中身が丸見えでそれに対応する方法がなさそう</li> <li>ネイティブのファイルIOがあるので、それを使って自前で用意する必要がありそう</li> </ul> </li> </ul> <hr /> <ul> <li>ドキュメント少なすぎて最悪 <ul> <li>頻繁にソース読みにいったりした</li> </ul> </li> <li>よく見たドキュメント <ul> <li><a href="http://api.haxe.org/">Haxe API</a></li> <li><a href="http://api.openfl.org/">OpenFL API Documentation</a></li> </ul> </li> <li>ソースからドキュメント生成してるらしいけど、改行とかの扱いが雑でひたすら読みづらい</li> <li>鵜呑みにしてはいけないけど Haxe2 の古いドキュメントも役に立つ <ul> <li><a href="http://old.haxe.org/ref?lang=jp">Haxe 言語リファレンス - Haxe</a></li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Haxe">Haxe</a> の <a class="keyword" href="http://d.hatena.ne.jp/keyword/enum">enum</a> 最高!!!!!!</li> </ul> </li> <li>貴重な日本語情報 <ul> <li><a href="https://bitbucket.org/fukuokahaxe/haxe/wiki/Home">fukuokahaxe / Haxe勉強会 / wiki / Home — Bitbucket</a></li> <li>たまにリンク切れてたりしてちょっと不便なので <a href="https://bitbucket.org/fukuokahaxe/haxe/wiki/browse/">fukuokahaxe / Haxe勉強会 — Bitbucket</a> からみるといいかも</li> </ul> </li> </ul> <hr /> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/iOS">iOS</a>ターゲットが割と動いて楽しい</li> <li>ただしビルドと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>がひたすら苦痛 <ul> <li>シミュレータならそうでもない</li> <li>そもそも<a class="keyword" href="http://d.hatena.ne.jp/keyword/C%2B%2B">C++</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>が遅すぎる</li> <li>1から<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>すると4年前のマシンで10分ほどかかる</li> </ul> </li> <li>マルチタッチも簡単 <ul> <li><a href="https://github.com/frosty/NME-Multitouch-Example">frosty/NME-Multitouch-Example</a></li> <li>NME時代のコードなので適宜OpenFLに読み替えてください</li> </ul> </li> <li>Box2D が悪いのかひたすらメモリを食いつぶすバグが出来て困ってます <ul> <li>Instruments とか使ってみたけど<a class="keyword" href="http://d.hatena.ne.jp/keyword/C%2B%2B">C++</a>のコードを元に情報が表示されるので、なにがなんだかわからない</li> </ul> </li> </ul> <hr /> <ul> <li>OpenFL版Box2Dは、本家をどれくらい追いかけられてるのかが不明 <ul> <li>確か本家の新しいバージョンだとBodyからContactが取れなかったはずだけど、OpenFL版は取れる</li> </ul> </li> <li>困ったらソース読みましょう <ul> <li><a href="https://github.com/openfl/box2d">openfl/box2d</a></li> <li>samples/TestBed は非常に役に立ちますが、なかなかエグい実装</li> </ul> </li> <li>最初は HaxeFlixel も使っていたんですが、それについていた Nape という<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%AA%CD%FD%A5%A8%A5%F3%A5%B8%A5%F3">物理エンジン</a>の機能が少なすぎてやりたいことができなかったため、HaxeFlixel を諦めて OpenFL + Box2D という形になりました <ul> <li>OpenFL + HaxeFlixel + Box2D だと世界が3つになって管理が非常に難しい</li> <li>OpenFL + Box2D だと2つの世界の橋渡しをするだけなのでまだ楽</li> </ul> </li> </ul> <hr /> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a> で開発する場合は <a href="https://atom.io/">Atom</a> を入れるとよさげ</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/Haxe">Haxe</a> 向けのパッケージが充実 <ul> <li><a href="https://atom.io/packages/language-haxe">language-haxe</a></li> <li><a href="https://atom.io/packages/linter">linter</a></li> <li><a href="https://atom.io/packages/autocomplete-plus">autocomplete-plus</a></li> <li><a href="https://atom.io/packages/haxe">haxe</a></li> <li>とりあえずこれだけ入れればOK</li> </ul> </li> <li>lint と autocomplete を動かすためには、プロジェクトディレクトリに <code>hoge.hxml</code> が必要 <ul> <li><code>openfl display flash &gt; hoge.hxml</code> みたいな感じにすると生成できます</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/atom">atom</a> の tree view で <code>hoge.hxml</code> を右クリックすると <code>Set as active HXML file</code> という項目があるはずなので、それをクリックするとよい</li> </ul> </li> </ul> <hr /> <ul> <li>【完全な余談】</li> <li><a href="http://box2d.org/contributors/">Contributors | Box2D</a> にいる "Motokimi Kuzume" さんが気になる <ul> <li><a href="https://ja.wikipedia.org/wiki/%E3%83%99%E3%82%A2%E3%83%AB%E3%83%95%E3%82%A1%E3%83%AC%E3%82%B9">ベアルファレス</a> というプレステのゲームの開発チームの人らしい</li> <li>そのゲームのシナリオとかを書いていて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D1%A5%CD%A5%EB%A4%C7%A5%DD%A5%F3">パネルでポン</a>の音楽スタッフでもある 葛目将也 さんはご兄弟なんですかね?</li> </ul> </li> </ul> <hr /> <p>2D で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%EB%A5%C1%A5%D7%A5%E9%A5%C3%A5%C8%A5%D5%A5%A9%A1%BC%A5%E0">マルチプラットフォーム</a>なゲームを作りたければ <a class="keyword" href="http://d.hatena.ne.jp/keyword/Haxe">Haxe</a> + OpenFL は割とありな選択肢だと思います。 特に<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> + <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a> + <a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a> みたいな感じだったらソース書き換える必要すらないかと。</p> <p>ガリガリ気張って書かなければいけないこともなく、かといって果てしない<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D6%A5%E9%A5%C3%A5%AF%A5%DC%A5%C3%A5%AF%A5%B9">ブラックボックス</a>ということもないこのバランス感が好きです。</p> minasa757 Office for MacをインストールするとMS ゴシック等がWebサイトの表示に使用されてしまう問題を回避する方法 hatenablog://entry/8454420450100125522 2015-07-04T03:20:39+09:00 2015-07-04T03:20:39+09:00 Office for Macをインストールすると、WordやExcel、PowerPointが利用出来るかわりに、一部の 無能な Webエンジニアが書いたCSSによって、Webサイトの表示にMS ゴシックやメイリオといったフォントが使用されてしまいます。 美しいヒラギノフォントが使われないのはもったいないですし、なによりOS XのフォントレンダラによってレンダリングされたMS ゴシックほど醜いものはないので、一刻も早くユーザースタイルを適用しましょう。 方法 1. Stylish を導入する Stylish - Chrome ウェブストア Stylish :: Add-ons for Fire… <p>Office for <a class="keyword" href="http://d.hatena.ne.jp/keyword/Mac">Mac</a>をインストールすると、Wordや<a class="keyword" href="http://d.hatena.ne.jp/keyword/Excel">Excel</a>、<a class="keyword" href="http://d.hatena.ne.jp/keyword/PowerPoint">PowerPoint</a>が利用出来るかわりに、一部の <del>無能な</del> Webエンジニアが書いた<a class="keyword" href="http://d.hatena.ne.jp/keyword/CSS">CSS</a>によって、Webサイトの表示にMS ゴシックや<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%E1%A5%A4%A5%EA%A5%AA">メイリオ</a>といったフォントが使用されてしまいます。</p> <p>美しい<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D2%A5%E9%A5%AE%A5%CE">ヒラギノ</a>フォントが使われないのはもったいないですし、なにより<a class="keyword" href="http://d.hatena.ne.jp/keyword/OS%20X">OS X</a>のフォントレンダラによって<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%F3%A5%C0%A5%EA%A5%F3%A5%B0">レンダリング</a>されたMS ゴシックほど醜いものはないので、一刻も早くユーザースタイルを適用しましょう。</p> <h1>方法</h1> <h4>1. <a class="keyword" href="http://d.hatena.ne.jp/keyword/Stylish">Stylish</a> を導入する</h4> <ul> <li><a href="https://chrome.google.com/webstore/detail/fjnbnpbmkenffdnngjfgmeleoegfcffe">Stylish - Chrome ウェブストア</a></li> <li><a href="https://addons.mozilla.org/ja/firefox/addon/stylish/?src=external-userstyleshome">Stylish :: Add-ons for Firefox</a></li> </ul> <p>上記Webサイトからインストールできます。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Firefox">Firefox</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/Chrome">Chrome</a>以外はよくわかりません。</p> <h4>2. ユーザースタイルを適用する</h4> <p><script src="https://gist.github.com/dace183418fabd183994.js"> </script></p> <p><a href="https://gist.github.com/dace183418fabd183994">Do not use ms fonts</a></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Firefox">Firefox</a>では、アドオンマネージャから追加できます。それ以外の環境は調べてください。</p> <h4>3. 完了</h4> <p>醜いフォントが排除された快適なWebが待っています。</p> <h1>参考にしたサイト</h1> <ul> <li><a href="http://jeffreyfrancesco.org/weblog/2011013101/">Office for Mac のインストールするフォントが Web サイトの表示にも使われてしまうのはユーザ・スタイルシートで回避できるよ、というお話 / JeffreyFrancesco.org</a></li> <li><a href="http://ymkn.hatenablog.com/entry/2012/08/20/104641">@font-faceを使用してウェイト別に異なるフォントを割り当てる (太字に別フォントとか) - ymknの日記</a></li> </ul> minasa757 Firefoxでエクスポートしたブックマークに自動でタイトルを付ける hatenablog://entry/8454420450081380629 2015-01-25T23:09:27+09:00 2015-01-25T23:09:27+09:00 タイトルの通りです。 「すべてのタブをブックマーク」で追加した場合や、「Bookmark All」を使用して追加した場合に、タイトルが付加されずURLで表示されるブックマークをどうにかするために作りました。 1ページ1ページ丁寧にクロールして、title要素の中身をタイトルとして追加していきます。 並列処理は面倒なのでしていません。 いくつかのCPANモジュールに依存しているので、適当にインストールしてください。 addbookmarktitle <p>タイトルの通りです。</p> <p>「すべてのタブをブックマーク」で追加した場合や、「<a href="https://addons.mozilla.jp/firefox/details/542">Bookmark All</a>」を使用して追加した場合に、タイトルが付加されずURLで表示されるブックマークをどうにかするために作りました。</p> <p>1ページ1ページ丁寧にクロールして、title要素の中身をタイトルとして追加していきます。 並列処理は面倒なのでしていません。</p> <p>いくつかの<a class="keyword" href="http://d.hatena.ne.jp/keyword/CPAN">CPAN</a>モジュールに依存しているので、適当にインストールしてください。</p> <p><script src="https://gist.github.com/6eb27fc69b26384d1259.js"> </script></p> <p><a href="https://gist.github.com/6eb27fc69b26384d1259">addbookmarktitle</a></p> minasa757 Appleの電話サポートでなるべく喋らないようにする方法 hatenablog://entry/8454420450077666120 2014-12-21T19:31:37+09:00 2014-12-22T23:25:06+09:00 先日iPhone6を購入した際、契約の都合で分割のAppleCareに加入できなかったため、Appleから直接AppleCareを購入することになりました。 AppleStoreでも購入できますが、交通費をかけたくなかったので、仕方がなく電話で購入手続きをすることにしました。 ……したんですが、シリアル番号などを口頭で伝えなければいけないことが嫌で、AppleCareの加入期限ギリギリまでずっと先延ばしにしてしまっていました。 しかし、いざ手続きをしてみると、Web上であらかじめ情報を伝えられるシステムがあり、電話嫌いの方にもやさしいサポート体制になっていて最高でした。 嫌なことをしなくてよか… <p>先日iPhone6を購入した際、契約の都合で分割の<a class="keyword" href="http://d.hatena.ne.jp/keyword/AppleCare">AppleCare</a>に加入できなかったため、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Apple">Apple</a>から直接<a class="keyword" href="http://d.hatena.ne.jp/keyword/AppleCare">AppleCare</a>を購入することになりました。 AppleStoreでも購入できますが、交通費をかけたくなかったので、仕方がなく電話で購入手続きをすることにしました。</p> <p>……したんですが、シリアル番号などを口頭で伝えなければいけないことが嫌で、<a class="keyword" href="http://d.hatena.ne.jp/keyword/AppleCare">AppleCare</a>の加入期限ギリギリまでずっと先延ばしにしてしまっていました。 しかし、いざ手続きをしてみると、Web上であらかじめ情報を伝えられるシステムがあり、電話嫌いの方にもやさしいサポート体制になっていて最高でした。</p> <p>嫌なことをしなくてよかったのが嬉しすぎたので方法をまとめておきます。 電話嫌いの方は参考にしてみてください。</p> <h2>手順</h2> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/Apple">Apple</a> IDでログインしておく</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Apple">Apple</a> IDを持っていて、住所を登録してあることが必要です。</p> <p>「自分の製品を表示する」というリンクからログインができます。 ログインやらサインインのようなありがちな文言からログインできないのはダメだと思います。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/minasa757/20141221/20141221190446.png" alt="f:id:minasa757:20141221190446p:plain" title="f:id:minasa757:20141221190446p:plain" class="hatena-fotolife" itemprop="image" width="75%"></span></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/AppleCare">AppleCare</a>を購入する場合は、ログイン後の画面で「すべての製品とサービスを表示する」をクリックすると手続きを進められます。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/minasa757/20141221/20141221190444.png" alt="f:id:minasa757:20141221190444p:plain" title="f:id:minasa757:20141221190444p:plain" class="hatena-fotolife" itemprop="image" width="75%"></span></p> <h3>サポート対象の端末かどうか確認しておく</h3> <p>「詳細情報を表示および編集」をクリックすると、どの製品に対しどんなサポートを希望するかといった内容が表示されます。 どの製品に対してかは登録されていないはずなので、シリアル番号を入力して登録します。</p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/minasa757/20141221/20141221190443.png" alt="f:id:minasa757:20141221190443p:plain" title="f:id:minasa757:20141221190443p:plain" class="hatena-fotolife" itemprop="image" width="75%"></span></p> <p>登録するとサポート対象の期間に含まれているかどうかがチェックされます。</p> <h2>結果</h2> <p>以上の手順を踏んだ結果、口頭で伝えた情報は、</p> <ul> <li>郵便番号</li> <li>住所の町名以降</li> <li>メールアドレス</li> </ul> <p>のみです。 残りはサポートの方からの確認に対して「はい」やら「いいえ」と答えるだけです。</p> <h2>まとめ</h2> <p>シリアル番号のような長い英数字の羅列を口頭で伝えるのは苦痛でしかないので、他社のサポートもこれくらいできるようになってほしい。</p> minasa757 2014年 個人的お気に入り音楽 hatenablog://entry/8454420450077420897 2014-12-18T19:05:11+09:00 2014-12-18T19:07:08+09:00 TLでやってる人がいたので。 2014年に知った曲の中で個人的に好きな曲です。 安井洋介 - YO-KAI Disco まもるクンは呪われてしまった! サウンドトラックアーティスト: ゲーム・ミュージック,安井洋介出版社/メーカー: SuperSweep発売日: 2008/08/20メディア: CD購入: 4人 クリック: 27回この商品を含むブログ (8件) を見る VGMusic of the Day 607 Mamoru Has Been Cursed! YO KAI Disco - YouTube メロディ、コード進行、アレンジ、音色……全てにおいて最高。 とりあえず聴きましょう。 田… <p>TLでやってる人がいたので。<br/> 2014年に知った曲の中で個人的に好きな曲です。</p> <h2>安井洋介 - YO-KAI Disco</h2> <p><div class="hatena-asin-detail"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B001BZ8J3S/hatena-blog-22/"><img src="http://ecx.images-amazon.com/images/I/51HYEOs6oiL._SL160_.jpg" class="hatena-asin-detail-image" alt="まもるクンは呪われてしまった! サウンドトラック" title="まもるクンは呪われてしまった! サウンドトラック"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B001BZ8J3S/hatena-blog-22/">まもるクンは呪われてしまった! サウンドトラック</a></p><ul><li><span class="hatena-asin-detail-label">アーティスト:</span> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B2%A1%BC%A5%E0%A1%A6%A5%DF%A5%E5%A1%BC%A5%B8%A5%C3%A5%AF">ゲーム・ミュージック</a>,安井洋介</li><li><span class="hatena-asin-detail-label">出版社/メーカー:</span> SuperSweep</li><li><span class="hatena-asin-detail-label">発売日:</span> 2008/08/20</li><li><span class="hatena-asin-detail-label">メディア:</span> CD</li><li><span class="hatena-asin-detail-label">購入</span>: 4人 <span class="hatena-asin-detail-label">クリック</span>: 27回</li><li><a href="http://d.hatena.ne.jp/asin/B001BZ8J3S/hatena-blog-22" target="_blank">この商品を含むブログ (8件) を見る</a></li></ul></div><div class="hatena-asin-detail-foot"></div></div></p> <p><a href="http://www.youtube.com/watch?v=6NmQViTOpgo">VGMusic of the Day 607 Mamoru Has Been Cursed! YO KAI Disco - YouTube</a></p> <p>メロディ、コード進行、アレンジ、音色……全てにおいて最高。<br/> とりあえず聴きましょう。</p> <h2><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C4%C2%BC%A4%E6%A4%AB%A4%EA">田村ゆかり</a> - 秘密の扉から会いにきて</h2> <p><div class="hatena-asin-detail"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00GSWCGN8/hatena-blog-22/"><img src="http://ecx.images-amazon.com/images/I/51Ka6Un8PBL._SL160_.jpg" class="hatena-asin-detail-image" alt="秘密の扉から会いにきて" title="秘密の扉から会いにきて"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00GSWCGN8/hatena-blog-22/">秘密の扉から会いにきて</a></p><ul><li><span class="hatena-asin-detail-label">アーティスト:</span> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C4%C2%BC%A4%E6%A4%AB%A4%EA">田村ゆかり</a></li><li><span class="hatena-asin-detail-label">出版社/メーカー:</span> <a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AD%A5%F3%A5%B0%A5%EC%A5%B3%A1%BC%A5%C9">キングレコード</a></li><li><span class="hatena-asin-detail-label">発売日:</span> 2014/02/05</li><li><span class="hatena-asin-detail-label">メディア:</span> CD</li><li><a href="http://d.hatena.ne.jp/asin/B00GSWCGN8/hatena-blog-22" target="_blank">この商品を含むブログ (21件) を見る</a></li></ul></div><div class="hatena-asin-detail-foot"></div></div></p> <p><a href="http://www.youtube.com/watch?v=JMJ3nUVM9bk">田村ゆかり/「秘密の扉から会いにきて」MUSIC VIDEO*short ver - YouTube</a></p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%C4%C2%BC%A4%E6%A4%AB%A4%EA">田村ゆかり</a> x <a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%AA%B0%A1%B5%AE">畑亜貴</a> x 太田雅友 の組み合わせはずるい。</p> <h2>Dada Life - One Smile</h2> <p><div class="itunes-embed freezed itunes-kind-song"><a href="https://itunes.apple.com/jp/album/one-smile/id894912405?i=894912537&uo=4&at=10l8JW&ct=hatenablog" rel="nofollow" target="_blank"><img src="http://cdn.image.st-hatena.com/image/scale/64a94689851a1fb4d98688518bee4a9875f0cd76/enlarge=0;height=200;version=1;width=200/http%3A%2F%2Fa4.mzstatic.com%2Fus%2Fr30%2FMusic%2Fv4%2F60%2Fe1%2F40%2F60e1408c-11cc-67fa-095b-2fc3b5d98787%2F14UMGIM28269.100x100-75.jpg" alt="One Smile" title="One Smile" class="itunes-embed-image"/></a><div class="itunes-embed-info"><p class="itunes-embed-title"><a href="https://itunes.apple.com/jp/album/one-smile/id894912405?i=894912537&uo=4&at=10l8JW&ct=hatenablog" rel="nofollow" target="_blank">One Smile</a></p><ul><li class="itunes-embed-artist">ダダ・ライフ</li><li class="itunes-embed-genre">Dance</li><li class="itunes-embed-price">¥250</li><li class="itunes-embed-badge"><a href="https://itunes.apple.com/jp/album/one-smile/id894912405?i=894912537&uo=4&at=10l8JW&ct=hatenablog" rel="nofollow" target="_blank"><img src="/images/theme/itunes/itunes-badge-itunes@2x.png" width="44px" height="15px" /></a></li></ul><ul><li class="itunes-embed-preview"><audio src="http://a1542.phobos.apple.com/us/r2000/020/Music4/v4/41/d2/96/41d29628-2e78-985a-2b04-507a799a8b64/mzaf_5258211925817455629.plus.aac.p.m4a" controls></audio></li><li><small class="provided-courtesy-of-itunes">provided courtesy of <a class="keyword" href="http://d.hatena.ne.jp/keyword/iTunes">iTunes</a></small></li></ul></div></div></p> <p><a href="http://www.youtube.com/watch?v=PYy2ppx_TY0">Dada Life - One Smile - YouTube</a></p> <p>One Smile😄<br/> <a href="http://www.youtube.com/watch?v=PYy2ppx_TY0">メイキングが面白い。</a></p> <h2>まとめ</h2> <p>もっとあるかと思ってましたが、パッと出るくらい記憶に残ってるのはこの3曲。<br/> YO-KAI Discoが一番衝撃でした。こんな曲作りたい。</p> minasa757 Twitter公式にアップロードされた画像の高画質版を表示するBookmarklet hatenablog://entry/8454420450074582438 2014-11-20T20:31:49+09:00 2015-06-01T22:51:05+09:00 [2015/06/01] URLの判定漏れを修正しました。 YoruFukurouでTwitter公式にアップロードされた画像をブラウザで開くと、縮小された画像が表示されますが、細かな文字が潰れて一切読めなくなってしまっていて困ったことが割とあったので、原寸大で表示するBookmarkletを作りました。 Bookmarklet 動作の保障はしません。自己責任で使用してください。 Twitter公式にアップロードされた画像の高画質版を表示するBookmarklet D&Dでブックマークバーに登録したり、右クリックでブックマークしたりなど、お好きな方法でブックマークしてください。 画像を表示して… <p>[2015/06/01] URLの判定漏れを修正しました。</p> <hr /> <p>YoruFukurouで<a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a>公式にアップロードされた画像をブラウザで開くと、縮小された画像が表示されますが、細かな文字が潰れて一切読めなくなってしまっていて困ったことが割とあったので、原寸大で表示する<a class="keyword" href="http://d.hatena.ne.jp/keyword/Bookmarklet">Bookmarklet</a>を作りました。</p> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/Bookmarklet">Bookmarklet</a></h3> <p><strong>動作の保障はしません。自己責任で使用してください。</strong></p> <blockquote><p><a href="javascript:%28function%28%29%7bif%28location%2ehref%2ematch%28%2f%5c%2f%5c%2f%2e%2a%3f%5c%2etwimg%5c%2ecom%5c%2fmedia%5c%2f%2f%29%29%7bdocument%2elocation%3dlocation%2ehref%2ereplace%28%2f%3a%28large%7corig%29%24%2f%2c%22%22%29%2b%22%3aorig%22%7d%7d%29%28%29%3b">Twitter公式にアップロードされた画像の高画質版を表示するBookmarklet</a></p></blockquote> <p>D&amp;Dでブックマークバーに登録したり、右クリックでブックマークしたりなど、お好きな方法でブックマークしてください。</p> <p>画像を表示して登録したブックマークを呼び出すと、原寸大の画像が表示されます。</p> <h3>しくみ</h3> <pre class="code" data-lang="" data-unlink>javascript:(function(){if(location.href.match(/\/\/.*?\.twimg\.com\/media\//)){document.location=location.href.replace(/:(large|orig)$/,&#34;&#34;)+&#34;:orig&#34;}})();</pre> <p>単純にURLの末尾に <code>:orig</code> をくっつけているだけです。</p> <p>すでに原寸表示されている場合と、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a>公式にアップロードされた画像ではない場合には何もしないようになっています。</p> minasa757 ISUCON4 本選に出場した #isucon hatenablog://entry/8454420450072974600 2014-11-09T02:08:17+09:00 2014-11-10T21:19:15+09:00 (2014/11/10 18:29) 書き直しました。 ISUCON4の予選を学生枠5位でなんとか滑り込めたので、本選に出場してきました。 チーム名は、「☆(ゝω・)vキャピ」です。 アイコンがソーニャの人なんてメンバーにいなかったかもしれませんが、察してください。 本選まで メンバーのうちの一人が、本選当日の都合が付かなくなり、2名で出場することになりました。 残った自分ともう一人は、複数台のサーバーを組み合わせたWebサービスを作った経験がないため、これは大変なことになってしまったと焦るはめに…… とりあえず抜けるメンバーに聞けるだけいろいろ聞いて、なんとかしようとしました。 事前にやっ… <p>(2014/11/10 18:29) 書き直しました。</p> <hr /> <p><a href="http://isucon.net/">ISUCON4</a>の予選を学生枠5位でなんとか滑り込めたので、本選に出場してきました。</p> <p>チーム名は、「☆(ゝω・)vキャピ」です。 アイコンがソーニャの人なんてメンバーにいなかったかもしれませんが、察してください。</p> <h2>本選まで</h2> <p>メンバーのうちの一人が、本選当日の都合が付かなくなり、2名で出場することになりました。 残った自分ともう一人は、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%A3%BF%F4">複数</a>台のサーバーを組み合わせた<a class="keyword" href="http://d.hatena.ne.jp/keyword/Web%A5%B5%A1%BC%A5%D3%A5%B9">Webサービス</a>を作った経験がないため、これは大変なことになってしまったと焦るはめに…… とりあえず抜けるメンバーに聞けるだけいろいろ聞いて、なんとかしようとしました。</p> <p>事前にやったことは、<a class="keyword" href="http://d.hatena.ne.jp/keyword/MySQL">MySQL</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%D7%A5%EA%A5%B1%A1%BC%A5%B7%A5%E7%A5%F3">レプリケーション</a>の方法と、抜けるメンバーが環境構築をやっていたので、環境構築でしていることの確認です。</p> <h2>本選当日</h2> <h3>やりたかったこと</h3> <p>1台で大半の処理、残り2台はひたすら動画を返す、という形を目指していました。 具体的には、全ての処理は一旦メインのサーバーに飛ばし、入稿の場合はメインのサーバーで受けたリクエストをそっくりそのまま動画サーバーに投げ、reportはメインのサーバーが必要な情報を取りまとめるというアプローチです。</p> <h3>やったこと</h3> <p>やりたかったことが完成しなかったため、分散処理は一切できませんでした。 完全に1台で完結しています。</p> <p>その時点でなぜかは分かりませんでしたが、2号機で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF">ベンチマーク</a>を回すとスコアがよかったため、2号機を初期実装でセットアップして、最後に提出したベンチマーカーに渡すオプションは2号機のみを指定しました。</p> <p>というわけで、結果的にやったことは、 <strong>「2号機で<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>初期実装を動くようにしてベンチマーカーを設定した」</strong> だけです。</p> <p>一つでも何かできれば、もっとすっきりと終えることができたんですが……</p> <h3>結果</h3> <p><a href="http://isucon.net/archives/41187491.html">ISUCON4 本選結果 : ISUCON公式Blog</a></p> <blockquote><p>25位 7231 ☆(ゝω・)vキャピ</p></blockquote> <p>とにかくFAILはしないようにしようとずっと言っていたので、点数が残せたのはよかったです。</p> <h3>疑問点</h3> <p>特に使いこなせる言語が無かったので<a class="keyword" href="http://d.hatena.ne.jp/keyword/Python">Python</a>を選択しましたが、初期実装一切弄らず6000点を越えていました。 終わってから他のチームの話を聞いたところ、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Ruby">Ruby</a>の初期実装では1000点もいかなかったらしく……</p> <p>特にswapしてた感じも無かったはずなので別のなにかしらがあったんだと思いますが、知識不足でよく分かりません。</p> <h3>反省点</h3> <ul> <li>予選と同じことをひたすらやらかしたこと <ul> <li>実装してみたものの、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>がうまくいかず結局完成しないパターン</li> </ul> </li> <li>環境構築にかなり時間を食ってしまったこと <ul> <li>事前の確認不足</li> </ul> </li> <li>思い込みで動いてしまったこと <ul> <li>サーバーのスペックは全て同じ? <ul> <li>2号機と3号機のCPUに差があることに気付かなかった</li> </ul> </li> <li>初期実装の言語間にスコアの差はない? <ul> <li>今回はたまたま運がよかったものの……</li> </ul> </li> <li>その想定外の挙動はサーバー側が悪い? <ul> <li><strong><a class="keyword" href="http://d.hatena.ne.jp/keyword/AdBlock">AdBlock</a>が邪魔してました!</strong> 初歩的すぎて恥ずかしいです!</li> </ul> </li> </ul> </li> </ul> <h3>感想</h3> <p>非常に疲れましたが、非常に面白かったです。 フルメンバーで出場できていればもう少し勝負できたかなと思うと、少し心残りではあります。 でも、こうして一つの会場に集まってがっつりプログラムを書く機会なんて滅多に無いので、いい経験が出来たと思います。 問題を解いていて、気付いたというか学んだ点がたくさんあったので、初期状態で提出してしまったものの、得られたものはあったと思います。 来年も開催するそうなので、また来たいです。 予選突破できるかな……</p> <p>出題・運営スタッフの方々お疲れ様でした。 とても楽しかったです!</p> <p>特にテコラスさん! お寿司おいしかったです。 名前覚えました。</p> <h2>写真</h2> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/minasa757/20141109/20141109015031.jpg" alt="f:id:minasa757:20141109015031j:plain" title="f:id:minasa757:20141109015031j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/minasa757/20141109/20141109015143.jpg" alt="f:id:minasa757:20141109015143j:plain" title="f:id:minasa757:20141109015143j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/minasa757/20141109/20141109015017.jpg" alt="f:id:minasa757:20141109015017j:plain" title="f:id:minasa757:20141109015017j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/minasa757/20141109/20141109014913.jpg" alt="f:id:minasa757:20141109014913j:plain" title="f:id:minasa757:20141109014913j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/minasa757/20141109/20141109015043.jpg" alt="f:id:minasa757:20141109015043j:plain" title="f:id:minasa757:20141109015043j:plain" class="hatena-fotolife" itemprop="image"></span></p> <p><span itemscope itemtype="http://schema.org/Photograph"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/minasa757/20141109/20141109015058.jpg" alt="f:id:minasa757:20141109015058j:plain" title="f:id:minasa757:20141109015058j:plain" class="hatena-fotolife" itemprop="image"></span></p> minasa757 ドライブの空き容量を取得する (GetDiskFreeSpaceEx) hatenablog://entry/8454420450070914434 2014-10-28T23:50:25+09:00 2014-10-28T23:50:25+09:00 WinAPIを使用して接続されているドライブの情報を取得します。 たぶんWindows2000より前では動きません。 参考にしたページ GetLogicalDrives 関数 有効なドライブ名を調べる - プログラミングのメモ帳 GetDiskFreeSpaceEx 関数 SDK32:GetDiskFreeSpace と GetDiskFreeSpaceEx について GetVolumeInformation 関数 GetDriveType 関数 コード #include <stdio.h> #include <windows.h> int main(void) { DWORD dwDrive… <p>WinAPIを使用して接続されているドライブの情報を取得します。</p> <p>たぶん<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows2000">Windows2000</a>より前では動きません。</p> <h2>参考にしたページ</h2> <ul> <li><a href="http://msdn.microsoft.com/ja-jp/library/cc429329.aspx">GetLogicalDrives 関数</a></li> <li><a href="http://blog.goo.ne.jp/masaki_goo_2006/e/243664c01d35f678cffbc74345c530bc">有効なドライブ名を調べる - プログラミングのメモ帳</a></li> <li><a href="http://msdn.microsoft.com/ja-jp/library/cc429308.aspx">GetDiskFreeSpaceEx 関数</a></li> <li><a href="http://support.microsoft.com/kb/231497/ja">SDK32:GetDiskFreeSpace と GetDiskFreeSpaceEx について</a></li> <li><a href="http://msdn.microsoft.com/ja-jp/library/cc429511.aspx">GetVolumeInformation 関数</a></li> <li><a href="http://msdn.microsoft.com/ja-jp/library/cc429310.aspx">GetDriveType 関数</a></li> </ul> <h2>コード</h2> <pre class="code lang-cpp" data-lang="cpp" data-unlink><span class="synPreProc">#include </span><span class="synConstant">&lt;stdio.h&gt;</span> <span class="synPreProc">#include </span><span class="synConstant">&lt;windows.h&gt;</span> <span class="synType">int</span> main(<span class="synType">void</span>) { DWORD dwDrive; <span class="synType">char</span> pszDrive[<span class="synConstant">16</span>]; UINT DriveType; BOOL fResult; <span class="synType">unsigned</span> __int64 i64FreeBytesToCaller, i64TotalBytes, i64FreeBytes; <span class="synType">char</span> szVolume[<span class="synConstant">256</span>]; DWORD dwSerial, dwLength, dwFlags; <span class="synType">char</span> szSystem[<span class="synConstant">256</span>]; <span class="synComment">//ドライブレターを順番にチェック</span> dwDrive = GetLogicalDrives(); <span class="synStatement">for</span> (<span class="synType">int</span> nDrive = <span class="synConstant">0</span>; nDrive &lt; <span class="synConstant">26</span>; nDrive++){ <span class="synComment">//そのドライブレターが使用されているか</span> <span class="synStatement">if</span> (dwDrive &amp; (<span class="synConstant">1</span> &lt;&lt; nDrive)){ sprintf_s(pszDrive, <span class="synStatement">sizeof</span>(pszDrive), <span class="synConstant">&quot;</span><span class="synSpecial">%c</span><span class="synConstant">:</span><span class="synSpecial">\\</span><span class="synConstant">&quot;</span>, nDrive + <span class="synConstant">'A'</span>); <span class="synComment">//HDDかどうか</span> DriveType = GetDriveTypeA(pszDrive); <span class="synStatement">if</span> (DriveType == DRIVE_FIXED || DriveType == DRIVE_REMOVABLE) { printf(<span class="synConstant">&quot;</span><span class="synSpecial">%s\n</span><span class="synConstant">&quot;</span>, pszDrive); fResult = GetVolumeInformationA(pszDrive, szVolume, <span class="synStatement">sizeof</span>(szVolume), &amp;dwSerial, &amp;dwLength, &amp;dwFlags, szSystem, <span class="synStatement">sizeof</span>(szSystem)); <span class="synStatement">if</span> (fResult) { printf(<span class="synConstant">&quot;ボリューム名          :</span><span class="synSpecial">%s\n</span><span class="synConstant">&quot;</span>, szVolume); printf(<span class="synConstant">&quot;ボリュームのシリアル番号    :</span><span class="synSpecial">%08X\n</span><span class="synConstant">&quot;</span>, dwSerial); printf(<span class="synConstant">&quot;ファイル名の最大の長さ     :</span><span class="synSpecial">%lu\n</span><span class="synConstant">&quot;</span>, dwLength); printf(<span class="synConstant">&quot;ファイルシステムのオプション  :</span><span class="synSpecial">%08X\n</span><span class="synConstant">&quot;</span>, dwFlags); printf(<span class="synConstant">&quot;ファイルシステム名       :</span><span class="synSpecial">%s\n</span><span class="synConstant">&quot;</span>, szSystem); } <span class="synStatement">else</span> { printf(<span class="synConstant">&quot;エラー:</span><span class="synSpecial">%lu\n</span><span class="synConstant">&quot;</span>, GetLastError()); } fResult = GetDiskFreeSpaceExA(pszDrive, (PULARGE_INTEGER)&amp;i64FreeBytesToCaller, (PULARGE_INTEGER)&amp;i64TotalBytes, (PULARGE_INTEGER)&amp;i64FreeBytes); <span class="synStatement">if</span> (fResult) { printf(<span class="synConstant">&quot;呼び出し側が利用できるバイト数 :%I64u</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>, i64FreeBytesToCaller); printf(<span class="synConstant">&quot;ディスク全体のバイト数     :%I64u</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>, i64TotalBytes); printf(<span class="synConstant">&quot;ディスク全体の空きバイト数   :%I64u</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>, i64FreeBytes); } <span class="synStatement">else</span> { printf(<span class="synConstant">&quot;エラー:</span><span class="synSpecial">%lu\n</span><span class="synConstant">&quot;</span>, GetLastError()); } printf(<span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>); } } } } </pre> minasa757 ISUCON4 予選 に出場した hatenablog://entry/8454420450066553596 2014-09-29T03:53:11+09:00 2014-11-09T00:08:20+09:00 ISUCON4 の予選に出場しました。 同じ大学サークルの友人に釣られ、もう一人後輩を釣って3人で出ました。 アレがアレなのでチームについてはアレします。 予選まで メンバーを集めて2回勉強会を開きました。 1回目 計測周り、memcached、クエリ高速化についてそれぞれ喋る ISUCON3予選問題をやる 2回目 ISUCON3予選問題の前回の続きをやる 当日の動きを詰める アプローチの立て方を研究 本番では自分はアプリケーションサーバ側でやれることをやる感じになったので、9月中はそのことについて調べたりしていました。 EC2のインスタンス用意して練習したかったんですが、クレジットカード持っ… <p><a href="http://isucon.net/">ISUCON4</a> の予選に出場しました。 同じ大学サークルの友人に釣られ、もう一人後輩を釣って3人で出ました。 アレがアレなのでチームについてはアレします。</p> <h2>予選まで</h2> <p>メンバーを集めて2回勉強会を開きました。</p> <h4>1回目</h4> <ul> <li>計測周り、<a class="keyword" href="http://d.hatena.ne.jp/keyword/memcached">memcached</a>、クエリ高速化についてそれぞれ喋る</li> <li>ISUCON3予選問題をやる</li> </ul> <h4>2回目</h4> <ul> <li>ISUCON3予選問題の前回の続きをやる</li> <li>当日の動きを詰める</li> <li>アプローチの立て方を研究</li> </ul> <p>本番では自分は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%D7%A5%EA%A5%B1%A1%BC%A5%B7%A5%E7%A5%F3%A5%B5%A1%BC%A5%D0">アプリケーションサーバ</a>側でやれることをやる感じになったので、9月中はそのことについて調べたりしていました。</p> <p>EC2の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9">インスタンス</a>用意して練習したかったんですが、クレジットカード持ってないですし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/V%A5%D7%A5%EA%A5%AB">Vプリカ</a>買う余裕もなくて結局やりませんでした。</p> <p>運営さん!予選もchefのcookbook用意してください!</p> <h2>予選本番</h2> <p>とにかく計測第一ということを勉強会で言われたので、とりあえずアプリを触ってみつつ、スロークエリログを見たりdstat見たり<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%AF%A5%BB%A5%B9%A5%ED%A5%B0">アクセスログ</a>みたりしてから動き出しました。</p> <h4>自分がやったこと</h4> <ul> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/PSGI">PSGI</a>サーバを<a class="keyword" href="http://d.hatena.ne.jp/keyword/Starman">Starman</a>からStarletに変更</li> <li>テーブルにインデックスを張る</li> </ul> <h4>失敗</h4> <ul> <li>nginxとappの通信を<a class="keyword" href="http://d.hatena.ne.jp/keyword/TCP">TCP</a>から<a class="keyword" href="http://d.hatena.ne.jp/keyword/UNIX">UNIX</a> domain socketへ <ul> <li>app側は変更してサーバ周り担当に投げたものの結局反映させず放置 <ul> <li>とにかく一番遅い部分を直そうと放置してしまったけど直せばよかった</li> </ul> </li> </ul> </li> <li>banとlockの判定が重いので高速化 <ul> <li>遅いクエリがやっていることをそのまま<a class="keyword" href="http://d.hatena.ne.jp/keyword/Perl">Perl</a>+<a class="keyword" href="http://d.hatena.ne.jp/keyword/memcached">memcached</a>に落とし込もうとして失敗</li> <li>ベンチのログを見ると、ログインできないはずがログインできてしまっているのでロジックのバグを疑って再実装</li> <li>同じエラーが出続けるのでロジックをひたすら弄る <ul> <li>今思えばキャッシュ更新のタイミングが悪かったのでは……</li> </ul> </li> </ul> </li> </ul> <p>こう見るとなにもしてないですね…… banとlockの判定処理を修正するのに時間かけすぎました。</p> <h2>反省</h2> <p>何度も気をつけようと言っていた無茶なアプローチをやってしまったのが一番くやしい! ロジックの再実装はまず既存のコードを完全に理解した上でコーディングしなければならなくて、とてつもなく時間がかかるし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>も大変です。 初期実装自体は、よほど酷い何かが無い限り、弄らないで進めた方がよかったのかもしれません。</p> <p>1つの問題に3人でとりかかってしまっていたこともあったりと、折角のリソースを生かしきれていなかったように感じました。 それぞれが独立して動ける体制が最高ですが、それには全員が技術を持っていないと難しいとも思います。</p> <p>受け身な感じで単に投げられたアプローチをそのまま実装するといった思考停止していた場面があったので、落ち着いてそれが正しいのか流されず判断できればよかったです。</p> <h2>感想</h2> <p>IT系の競技というと競技プログラミングくらいしか知らなかったので、こんな形で競えるのかという意外性がとても面白かったです。</p> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/ACM">ACM</a>-<a class="keyword" href="http://d.hatena.ne.jp/keyword/ICPC">ICPC</a>に出た時も感じましたが、チーム制の競技はチームワークが何よりも大事だと思います。 チームで作業している以上、技術よりチームを回す方が大切になります。 コミュニケーションはそれなりに大きいオーバヘッドですが、生かせればそれ以上にいろいろなことができるようになれる気がしました。</p> <p>もちろん技術不足も作業中に何度も感じました。 特に、問題が起きた時にパッと思い付く原因の可能性がある箇所の数が少ないと、そこから何もできなくなってしまうので、もっとトラブルに遭遇できるようにいろいろ動かしてみたいです。</p> minasa757 YAPC::Asia Tokyo 2014 に行った hatenablog://entry/12921228815731691906 2014-09-01T00:15:08+09:00 2014-09-01T00:39:38+09:00 YAPC::Asia Tokyo 2014 に初参加してきました。 ブログ書こうってめっちゃ言ってたので感想を書きます。 参加まで 存在自体は前から知っていて、2011年に関東に出てきてから行ってみたいなとは思っていたんですが、気付いたらチケット売り切れてたりとかでなかなか参加できず。 今年はたまたまTwitterでYAPCのチケット発売の情報を見つけて、学生無料だし、Larry Wallさんを見れるっぽいという超適当な理由でチケット取りました。 結局Larry Wallさんは来日できなかったので残念でしたが、手術されてるということで早く元気になってほしいです。 学生チケットだったので2日間通… <p><a href="http://yapcasia.org/2014/">YAPC::Asia Tokyo 2014</a> に初参加してきました。 ブログ書こうってめっちゃ言ってたので感想を書きます。</p> <h2>参加まで</h2> <p>存在自体は前から知っていて、2011年に関東に出てきてから行ってみたいなとは思っていたんですが、気付いたらチケット売り切れてたりとかでなかなか参加できず。 今年はたまたま<a class="keyword" href="http://d.hatena.ne.jp/keyword/Twitter">Twitter</a>で<a class="keyword" href="http://d.hatena.ne.jp/keyword/YAPC">YAPC</a>のチケット発売の情報を見つけて、学生無料だし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Larry%20Wall">Larry Wall</a>さんを見れるっぽいという超適当な理由でチケット取りました。 結局<a class="keyword" href="http://d.hatena.ne.jp/keyword/Larry%20Wall">Larry Wall</a>さんは来日できなかったので残念でしたが、手術されてるということで早く元気になってほしいです。</p> <p>学生チケットだったので2日間通しで参加できたのですが、29日の早朝に実家から関東に到着した時点で体調が優れなかったのでその日は直帰して爆睡、結局2日目午後のみの参加でした。</p> <h2>全体的に</h2> <p>初参加で右も左も分からないままうろうろしたり適当にトーク聞いたりしてました。 1階の駅と繋がってる部分から入ったら、受付の場所が分からなくて2階を一周してしまったので、階段登ったところにでも受付の方向が書いてあるとよかったと思います。</p> <p>トークは噂通り<a class="keyword" href="http://d.hatena.ne.jp/keyword/Perl">Perl</a>の内容はほぼ無し。でも知らない話だらけで面白かったし、よい刺激になりました。細かい感想は後述。</p> <p>ぼっち参加だったので交流とか全く出来なかったのが残念でした。怖そうなおじさましか居ない。 輪に入れるような企画とかあればとも思いましたが、それはそれでつらいしどうにもならないですね。 交流したければ自ら動くべしという事でしょうか。</p> <h2>各トークについて</h2> <p>聞くトークを決めずに会場をふらふらしてしまいまして、中盤から入って内容がよく掴めてないものとかがあったり。ちゃんと計画立てるべきですね。</p> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/Plack">Plack</a> for Fun and Profit (But Mostly Profit)</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/PSGI">PSGI</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/Plack">Plack</a>とそれを用いたサイト運用の話。 大規模なサイトの運用にもまだまだ<a class="keyword" href="http://d.hatena.ne.jp/keyword/Perl">Perl</a>が使われているらしい。 ちゃんと儲けようぜという姿勢はとても見習いたいと感じました。</p> <h3><a class="keyword" href="http://d.hatena.ne.jp/keyword/Perl">Perl</a> For (Non?) <a class="keyword" href="http://d.hatena.ne.jp/keyword/Perl">Perl</a> Mongers</h3> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Perl">Perl</a>は悪い言語じゃないよという話。 軽く触れていく感じで紹介してたので、もうちょっと深く掘り下げて話を聞きたかった。</p> <h3>そんなにビッグでもないデータ処理手法の話</h3> <p>GB〜TB規模のデータ処理にはどんな<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DF%A5%C9%A5%EB%A5%A6%A5%A7%A5%A2">ミドルウェア</a>を使えばいいかという話。 <a class="keyword" href="http://d.hatena.ne.jp/keyword/Hadoop">Hadoop</a>と<a class="keyword" href="http://d.hatena.ne.jp/keyword/MapReduce">MapReduce</a>がとても気になったけど、データ処理する機会が無い……</p> <h3>Lightning Talks Day 2</h3> <p>LTの勢いのある喋りは別の勉強会などの配信で見てても楽しいし、実際の会場で見るとより楽しいです。 特にSawyer XさんのLTは完全に言葉の壁越えてて最高でした。</p> <p>TDDはとても重要だと思ったので真似していきたいです。 ただ、上を見過ぎると自分のキャパを越えてしまうので、その辺りの制御は難しいところ。</p> <h3>キーノート</h3> <p>20代の経験は非常に大事とのこと。もちろんそれまでもそれ以降も大事でしょうが、それぞれの年代にしかない意義みたいなものはありそうなので、自分がどうなりたいかとかは常に意識して動ければと思いました。</p> <h2>まとめ</h2> <p>せっかく人が集まってるので、聞くだけではなく交流やら発信やらしたいととにかく思いました。 そのためには何かしらの成果を持っていたいのですが、書いているものといえば細々した<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8">スクリプト</a>ばかり…… 何か作ると言うと、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Web%A5%B5%A1%BC%A5%D3%A5%B9">Webサービス</a>を作るといった大規模で必要なものが多くハードルが高いものををどうしても考えてしまうんですが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/OSS">OSS</a>にコミットしたり<a class="keyword" href="http://d.hatena.ne.jp/keyword/CPAN">CPAN</a>にモジュール書いたりといろいろ首を突っ込める方法はありそうなので、そういうことを見つけては首を突っ込めるように頑張ります。</p> minasa757 VimをHaxeの開発環境にしたい hatenablog://entry/12921228815730102524 2014-08-13T06:01:45+09:00 2014-08-13T06:06:56+09:00 まだ探り探りの状態です。 とりあえずjdonaldson/vaxeとShougo/neocomplete.vimは入れました。 .vimrcの設定は以下のような感じです。 " Shougo/neocomplete.vim ------------------------- let g:neocomplete#enable_at_startup = 1 let g:neocomplete#enable_smart_case = 1 let g:neocomplete#force_overwrite_completefunc = 1 if !exists('g:neocomplete#force_… <p>まだ探り探りの状態です。</p> <p>とりあえず<a href="https://github.com/jdonaldson/vaxe">jdonaldson/vaxe</a>と<a href="https://github.com/Shougo/neocomplete.vim">Shougo/neocomplete.vim</a>は入れました。<br/> .vimrcの設定は以下のような感じです。</p> <pre class="code lang-vim" data-lang="vim" data-unlink><span class="synComment">&quot; Shougo/neocomplete.vim -------------------------</span> <span class="synStatement">let</span> <span class="synIdentifier">g</span>:neocomplete#enable_at_startup <span class="synStatement">=</span> <span class="synConstant">1</span> <span class="synStatement">let</span> <span class="synIdentifier">g</span>:neocomplete#enable_smart_case <span class="synStatement">=</span> <span class="synConstant">1</span> <span class="synStatement">let</span> <span class="synIdentifier">g</span>:neocomplete#force_overwrite_completefunc <span class="synStatement">=</span> <span class="synConstant">1</span> <span class="synStatement">if</span> !<span class="synIdentifier">exists</span><span class="synSpecial">(</span><span class="synConstant">'g:neocomplete#force_omni_input_patterns'</span><span class="synSpecial">)</span> <span class="synStatement">let</span> <span class="synIdentifier">g</span>:neocomplete#force_omni_input_patterns <span class="synStatement">=</span> <span class="synSpecial">{}</span> <span class="synStatement">endif</span> <span class="synStatement">let</span> <span class="synIdentifier">g</span>:neocomplete#force_omni_input_patterns<span class="synStatement">.</span>haxe <span class="synStatement">=</span> <span class="synConstant">'\v([\]''&quot;\)]|\w|(^\s*))(\.|\()'</span> <span class="synComment">&quot; jdonaldson/vaxe --------------------------------</span> <span class="synStatement">autocmd</span> <span class="synType">FileType</span> haxe <span class="synStatement">setlocal</span> <span class="synPreProc">autowrite</span> <span class="synStatement">autocmd</span> <span class="synType">FileType</span> hxml <span class="synStatement">setlocal</span> <span class="synPreProc">autowrite</span> <span class="synStatement">autocmd</span> <span class="synType">FileType</span> nmml.xml <span class="synStatement">setlocal</span> <span class="synPreProc">autowrite</span> <span class="synComment">&quot;let g:vaxe_lime_target = </span><span class="synConstant">&quot;mac -neko&quot;</span> </pre> <p>残念ながらneocomplete.<a class="keyword" href="http://d.hatena.ne.jp/keyword/vim">vim</a>のomni補完には対応していないようなので、<code>force_omni_input_patterns</code>から<a class="keyword" href="http://d.hatena.ne.jp/keyword/vim">vim</a>標準のomni補完を呼び出しています。</p> <p><code>g:vaxe_lime_target</code>は、毎回どのターゲットにするか聞かれるのが邪魔な人向けです。 自分は開発時は<code>mac -neko</code>に決め打ちにしておいて、リリース時にはシェル上から任意のターゲットを指定してビルドするという流れを想定してこの設定にしました。</p> <h2>課題</h2> <ul> <li>makeした後のメッセージを<a class="keyword" href="http://d.hatena.ne.jp/keyword/vim">vim</a>上に出力したい</li> <li><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C7%A5%D0%A5%C3%A5%B0">デバッグ</a>がやりづらい</li> </ul> <h2>参考にしたサイト</h2> <ul> <li><a href="http://qiita.com/hatchinee/items/adb0b447bd1118ceb1eb">VimでHaxeを書く時に入れておきたいプラグイン1つ and more - Qiita</a></li> </ul> minasa757 AtCoder Beginner Contest #011 hatenablog://entry/12921228815726579520 2014-06-22T01:50:47+09:00 2014-06-24T00:51:53+09:00 AtCoder Beginner Contest #011 今日DP教えてもらったので頑張りました A問題 何も考えずに実装しました。 (余りを使うとかそんな発想全くなかった) #!/usr/bin/perl use strict; use warnings; my $N = <STDIN>; chomp($N); $N++; $N = 1 if $N == 13; print $N."\n"; B問題 Googleに頼り切った解答です。 他の人のを見ると正規表現とかで書けるっぽいですね。 #!/usr/bin/perl use strict; use warnings; my $S = <S… <p><a href="http://abc011.contest.atcoder.jp/">AtCoder Beginner Contest #011</a></p> <p>今日DP教えてもらったので頑張りました</p> <h2>A問題</h2> <p>何も考えずに実装しました。 (余りを使うとかそんな発想全くなかった)</p> <pre class="code lang-perl" data-lang="perl" data-unlink><span class="synPreProc">#!/usr/bin/perl</span> <span class="synStatement">use strict</span>; <span class="synStatement">use warnings</span>; <span class="synStatement">my</span> <span class="synIdentifier">$N</span> = <span class="synIdentifier">&lt;STDIN&gt;</span>; <span class="synStatement">chomp</span>(<span class="synIdentifier">$N</span>); <span class="synIdentifier">$N</span>++; <span class="synIdentifier">$N</span> = <span class="synConstant">1</span> <span class="synStatement">if</span> <span class="synIdentifier">$N</span> == <span class="synConstant">13</span>; <span class="synStatement">print</span> <span class="synIdentifier">$N</span>.<span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>; </pre> <h2>B問題</h2> <p><a class="keyword" href="http://d.hatena.ne.jp/keyword/Google">Google</a>に頼り切った解答です。 他の人のを見ると<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%AC%C9%BD%B8%BD">正規表現</a>とかで書けるっぽいですね。</p> <pre class="code lang-perl" data-lang="perl" data-unlink><span class="synPreProc">#!/usr/bin/perl</span> <span class="synStatement">use strict</span>; <span class="synStatement">use warnings</span>; <span class="synStatement">my</span> <span class="synIdentifier">$S</span> = <span class="synIdentifier">&lt;STDIN&gt;</span>; <span class="synStatement">chomp</span>(<span class="synIdentifier">$S</span>); <span class="synIdentifier">$S</span> = <span class="synStatement">ucfirst</span>(<span class="synStatement">lc</span>(<span class="synIdentifier">$S</span>)); <span class="synStatement">print</span> <span class="synConstant">&quot;</span><span class="synIdentifier">$S</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>; </pre> <h2>C問題</h2> <p>頑張ったやつ。 1から考えてDP使えたの初めてかもしれない。 一番外のループは0〜100まで回さないといけないので、継続条件は$i &lt; 101か$i &lt;= 100ですね。 一回間違えて$i &lt; 100としてしまいWA出しました。 くやしい。</p> <pre class="code lang-perl" data-lang="perl" data-unlink><span class="synPreProc">#!/usr/bin/perl</span> <span class="synStatement">use strict</span>; <span class="synStatement">use warnings</span>; <span class="synStatement">my</span> <span class="synIdentifier">$N</span> = <span class="synIdentifier">&lt;STDIN&gt;</span>; <span class="synStatement">chomp</span>(<span class="synIdentifier">$N</span>); <span class="synStatement">my</span> <span class="synIdentifier">@NG</span> = (); <span class="synStatement">my</span> <span class="synIdentifier">$buf</span> = <span class="synIdentifier">&lt;STDIN&gt;</span>; <span class="synStatement">chomp</span>(<span class="synIdentifier">$buf</span>); <span class="synStatement">push</span>(<span class="synIdentifier">@NG</span>, <span class="synIdentifier">$buf</span>); <span class="synIdentifier">$buf</span> = <span class="synIdentifier">&lt;STDIN&gt;</span>; <span class="synStatement">chomp</span>(<span class="synIdentifier">$buf</span>); <span class="synStatement">push</span>(<span class="synIdentifier">@NG</span>, <span class="synIdentifier">$buf</span>); <span class="synIdentifier">$buf</span> = <span class="synIdentifier">&lt;STDIN&gt;</span>; <span class="synStatement">chomp</span>(<span class="synIdentifier">$buf</span>); <span class="synStatement">push</span>(<span class="synIdentifier">@NG</span>, <span class="synIdentifier">$buf</span>); <span class="synStatement">my</span> <span class="synIdentifier">@dp</span>; <span class="synStatement">for</span> (<span class="synStatement">my</span> <span class="synIdentifier">$i</span> = <span class="synConstant">0</span>; <span class="synIdentifier">$i</span> &lt; <span class="synConstant">101</span>; <span class="synIdentifier">$i</span>++) { <span class="synStatement">for</span> (<span class="synStatement">my</span> <span class="synIdentifier">$j</span> = <span class="synConstant">0</span>; <span class="synIdentifier">$j</span> &lt; <span class="synConstant">301</span>; <span class="synIdentifier">$j</span>++) { <span class="synIdentifier">$dp[$i][$j]</span> = <span class="synConstant">0</span>; } } <span class="synIdentifier">$dp[</span><span class="synConstant">0</span><span class="synIdentifier">][$N]</span> = <span class="synConstant">1</span>; <span class="synStatement">for</span> (<span class="synStatement">my</span> <span class="synIdentifier">$i</span> = <span class="synConstant">1</span>; <span class="synIdentifier">$i</span> &lt; <span class="synConstant">101</span>; <span class="synIdentifier">$i</span>++) { <span class="synStatement">for</span> (<span class="synStatement">my</span> <span class="synIdentifier">$j</span> = <span class="synConstant">0</span>; <span class="synIdentifier">$j</span> &lt; <span class="synConstant">301</span>; <span class="synIdentifier">$j</span>++) { <span class="synStatement">for</span> (<span class="synStatement">my</span> <span class="synIdentifier">$k</span> = <span class="synConstant">1</span>; <span class="synIdentifier">$k</span> &lt; <span class="synConstant">4</span>; <span class="synIdentifier">$k</span>++) { <span class="synStatement">next</span> <span class="synStatement">if</span> (<span class="synIdentifier">$j</span> + <span class="synIdentifier">$k</span> &gt; <span class="synConstant">300</span>); <span class="synStatement">next</span> <span class="synStatement">if</span> (<span class="synIdentifier">$j</span> + <span class="synIdentifier">$k</span> == <span class="synIdentifier">$NG[</span><span class="synConstant">0</span><span class="synIdentifier">]</span>); <span class="synStatement">next</span> <span class="synStatement">if</span> (<span class="synIdentifier">$j</span> + <span class="synIdentifier">$k</span> == <span class="synIdentifier">$NG[</span><span class="synConstant">1</span><span class="synIdentifier">]</span>); <span class="synStatement">next</span> <span class="synStatement">if</span> (<span class="synIdentifier">$j</span> + <span class="synIdentifier">$k</span> == <span class="synIdentifier">$NG[</span><span class="synConstant">2</span><span class="synIdentifier">]</span>); <span class="synIdentifier">$dp[$i][$j]</span> = <span class="synIdentifier">$dp[$i</span> - <span class="synConstant">1</span><span class="synIdentifier">][$j</span> + <span class="synIdentifier">$k]</span> | <span class="synIdentifier">$dp[$i][$j]</span>; } } } <span class="synStatement">for</span> (<span class="synStatement">my</span> <span class="synIdentifier">$i</span> = <span class="synConstant">0</span>; <span class="synIdentifier">$i</span> &lt; <span class="synConstant">101</span>; <span class="synIdentifier">$i</span>++) { <span class="synStatement">if</span> (<span class="synIdentifier">$dp[$i][</span><span class="synConstant">0</span><span class="synIdentifier">]</span> == <span class="synConstant">1</span>) { <span class="synStatement">print</span> <span class="synConstant">&quot;YES</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>; <span class="synStatement">exit</span>; } } <span class="synStatement">print</span> <span class="synConstant">&quot;NO</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>; </pre> <h2>D問題</h2> <p>これもDPで解こうとしました。 最初、ゴールを含むギリギリの領域しか考慮していなかったせいで上手くいかず超悩みました。 間違えてることに気付いて修正しようとしたんですが、それっぽい解答は出たものの結局解けず。 ACとWAとTLEが入り交じってたので、計算量的に間に合わないのと、ループの範囲を間違えてる可能性が高い気がします。 以下は間違えているコードなので参考にしないでください。</p> <pre class="code lang-perl" data-lang="perl" data-unlink><span class="synPreProc">#!/usr/bin/perl</span> <span class="synStatement">use strict</span>; <span class="synStatement">use warnings</span>; <span class="synStatement">my</span> <span class="synIdentifier">$buf</span> = <span class="synIdentifier">&lt;STDIN&gt;</span>; <span class="synStatement">chomp</span>(<span class="synIdentifier">$buf</span>); <span class="synStatement">my</span> (<span class="synIdentifier">$N</span>, <span class="synIdentifier">$D</span>) = <span class="synStatement">split</span>(<span class="synStatement">/</span><span class="synConstant"> </span><span class="synStatement">/</span>, <span class="synIdentifier">$buf</span>); <span class="synIdentifier">$buf</span> = <span class="synIdentifier">&lt;STDIN&gt;</span>; <span class="synStatement">chomp</span>(<span class="synIdentifier">$buf</span>); <span class="synStatement">my</span> (<span class="synIdentifier">$X</span>, <span class="synIdentifier">$Y</span>) = <span class="synStatement">split</span>(<span class="synStatement">/</span><span class="synConstant"> </span><span class="synStatement">/</span>, <span class="synIdentifier">$buf</span>); <span class="synStatement">if</span> (<span class="synIdentifier">$X</span> % <span class="synIdentifier">$D</span> != <span class="synConstant">0</span> || <span class="synIdentifier">$Y</span> % <span class="synIdentifier">$D</span> != <span class="synConstant">0</span>) { <span class="synStatement">print</span> <span class="synConstant">&quot;0.0</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>; <span class="synStatement">exit</span>; } <span class="synIdentifier">$X</span> = <span class="synIdentifier">$X</span> / <span class="synIdentifier">$D</span>; <span class="synIdentifier">$Y</span> = <span class="synIdentifier">$Y</span> / <span class="synIdentifier">$D</span>; <span class="synStatement">my</span> <span class="synIdentifier">@dp</span>; <span class="synStatement">for</span>(<span class="synStatement">my</span> <span class="synIdentifier">$i</span> = <span class="synConstant">0</span>; <span class="synIdentifier">$i</span> &lt; <span class="synIdentifier">$N</span> + <span class="synConstant">1</span>; <span class="synIdentifier">$i</span>++) { <span class="synStatement">for</span> (<span class="synStatement">my</span> <span class="synIdentifier">$j</span> = <span class="synConstant">0</span>; <span class="synIdentifier">$j</span> &lt; <span class="synStatement">abs</span>(<span class="synIdentifier">$X</span>) * <span class="synConstant">2</span> + <span class="synConstant">5</span>; <span class="synIdentifier">$j</span>++) { <span class="synStatement">for</span> (<span class="synStatement">my</span> <span class="synIdentifier">$k</span> = <span class="synConstant">0</span>; <span class="synIdentifier">$k</span> &lt; <span class="synStatement">abs</span>(<span class="synIdentifier">$Y</span>) * <span class="synConstant">2</span> + <span class="synConstant">5</span>; <span class="synIdentifier">$k</span>++) { <span class="synIdentifier">$dp[$i][$j][$k]</span> = <span class="synConstant">0</span>; } } } <span class="synIdentifier">$dp[</span><span class="synConstant">0</span><span class="synIdentifier">][</span><span class="synStatement">abs</span>(<span class="synIdentifier">$X</span>) / <span class="synConstant">2</span> + <span class="synConstant">1</span><span class="synIdentifier">][</span><span class="synStatement">abs</span>(<span class="synIdentifier">$Y</span>) / <span class="synConstant">2</span> + <span class="synConstant">1</span><span class="synIdentifier">]</span> = <span class="synConstant">1.0</span>; <span class="synStatement">for</span>(<span class="synStatement">my</span> <span class="synIdentifier">$i</span> = <span class="synConstant">0</span>; <span class="synIdentifier">$i</span> &lt; <span class="synIdentifier">$N</span>; <span class="synIdentifier">$i</span>++) { <span class="synStatement">for</span> (<span class="synStatement">my</span> <span class="synIdentifier">$j</span> = <span class="synConstant">0</span>; <span class="synIdentifier">$j</span> &lt; <span class="synStatement">abs</span>(<span class="synIdentifier">$X</span>) * <span class="synConstant">2</span> + <span class="synConstant">5</span>; <span class="synIdentifier">$j</span>++) { <span class="synStatement">for</span> (<span class="synStatement">my</span> <span class="synIdentifier">$k</span> = <span class="synConstant">0</span>; <span class="synIdentifier">$k</span> &lt; <span class="synStatement">abs</span>(<span class="synIdentifier">$Y</span>) * <span class="synConstant">2</span> + <span class="synConstant">5</span>; <span class="synIdentifier">$k</span>++) { <span class="synIdentifier">$dp[$i</span> + <span class="synConstant">1</span><span class="synIdentifier">][$j</span> - <span class="synConstant">1</span><span class="synIdentifier">][$k]</span> = <span class="synIdentifier">$dp[$i</span> + <span class="synConstant">1</span><span class="synIdentifier">][$j</span> - <span class="synConstant">1</span><span class="synIdentifier">][$k]</span> + (<span class="synIdentifier">$dp[$i][$j][$k]</span> * <span class="synConstant">0.25</span>) <span class="synStatement">if</span> (<span class="synIdentifier">$j</span> - <span class="synConstant">1</span> &gt;= <span class="synConstant">0</span>); <span class="synIdentifier">$dp[$i</span> + <span class="synConstant">1</span><span class="synIdentifier">][$j</span> + <span class="synConstant">1</span><span class="synIdentifier">][$k]</span> = <span class="synIdentifier">$dp[$i</span> + <span class="synConstant">1</span><span class="synIdentifier">][$j</span> + <span class="synConstant">1</span><span class="synIdentifier">][$k]</span> + (<span class="synIdentifier">$dp[$i][$j][$k]</span> * <span class="synConstant">0.25</span>) <span class="synStatement">if</span> (<span class="synIdentifier">$j</span> + <span class="synConstant">1</span> &lt;= <span class="synStatement">abs</span>(<span class="synIdentifier">$X</span>) * <span class="synConstant">2</span> + <span class="synConstant">4</span>); <span class="synIdentifier">$dp[$i</span> + <span class="synConstant">1</span><span class="synIdentifier">][$j][$k</span> - <span class="synConstant">1</span><span class="synIdentifier">]</span> = <span class="synIdentifier">$dp[$i</span> + <span class="synConstant">1</span><span class="synIdentifier">][$j][$k</span> - <span class="synConstant">1</span><span class="synIdentifier">]</span> + (<span class="synIdentifier">$dp[$i][$j][$k]</span> * <span class="synConstant">0.25</span>) <span class="synStatement">if</span> (<span class="synIdentifier">$k</span> - <span class="synConstant">1</span> &gt;= <span class="synConstant">0</span>); <span class="synIdentifier">$dp[$i</span> + <span class="synConstant">1</span><span class="synIdentifier">][$j][$k</span> + <span class="synConstant">1</span><span class="synIdentifier">]</span> = <span class="synIdentifier">$dp[$i</span> + <span class="synConstant">1</span><span class="synIdentifier">][$j][$k</span> + <span class="synConstant">1</span><span class="synIdentifier">]</span> + (<span class="synIdentifier">$dp[$i][$j][$k]</span> * <span class="synConstant">0.25</span>) <span class="synStatement">if</span> (<span class="synIdentifier">$k</span> + <span class="synConstant">1</span> &lt;= <span class="synStatement">abs</span>(<span class="synIdentifier">$Y</span>) * <span class="synConstant">2</span> + <span class="synConstant">4</span>); } } } <span class="synStatement">print</span> <span class="synIdentifier">$dp[$N][</span>(<span class="synStatement">abs</span>(<span class="synIdentifier">$X</span>) / <span class="synConstant">2</span> + <span class="synConstant">1</span>) + <span class="synIdentifier">$X][</span>(<span class="synStatement">abs</span>(<span class="synIdentifier">$Y</span>) / <span class="synConstant">2</span> + <span class="synConstant">1</span>) + <span class="synIdentifier">$Y]</span>, <span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>; </pre> <h3>直した</h3> <p>100点の解答です。 考慮する領域の設定ミスと異常値の判定忘れが原因でした。 最初X,Yのギリギリの領域さえ計算すればいいかと考えて実装してしまったんですが、それだとゴールを通り過ぎてまた戻ってくるパターンが計算されなくてWAになります。 正しい領域設定は、ルール上可能な限り遠くまで移動した場合の位置を含む領域なので、X,Yそれぞれ-N〜Nまでを領域にします。 ただし、それだけだとNよりも遠い位置にゴールがあった場合に領域外参照してしまうので、その辺のチェックを入れましょう。</p> <p>101点にするにはN=1000を解けないといけませんが、このコードだとたぶんO(N<sup>3</sup>)(もっと大きいかも)で制限時間内に計算が終わらないので、DPじゃなくて数学的な解き方をする必要があるらしいです。 よくわかりません。</p> <pre class="code lang-perl" data-lang="perl" data-unlink><span class="synPreProc">#!/usr/bin/perl</span> <span class="synStatement">use strict</span>; <span class="synStatement">use warnings</span>; <span class="synStatement">my</span> <span class="synIdentifier">$buf</span> = <span class="synIdentifier">&lt;STDIN&gt;</span>; <span class="synStatement">chomp</span>(<span class="synIdentifier">$buf</span>); <span class="synStatement">my</span> (<span class="synIdentifier">$N</span>, <span class="synIdentifier">$D</span>) = <span class="synStatement">split</span>(<span class="synStatement">/</span><span class="synConstant"> </span><span class="synStatement">/</span>, <span class="synIdentifier">$buf</span>); <span class="synIdentifier">$buf</span> = <span class="synIdentifier">&lt;STDIN&gt;</span>; <span class="synStatement">chomp</span>(<span class="synIdentifier">$buf</span>); <span class="synStatement">my</span> (<span class="synIdentifier">$X</span>, <span class="synIdentifier">$Y</span>) = <span class="synStatement">split</span>(<span class="synStatement">/</span><span class="synConstant"> </span><span class="synStatement">/</span>, <span class="synIdentifier">$buf</span>); <span class="synStatement">if</span> (<span class="synIdentifier">$X</span> % <span class="synIdentifier">$D</span> != <span class="synConstant">0</span> || <span class="synIdentifier">$Y</span> % <span class="synIdentifier">$D</span> != <span class="synConstant">0</span>) { <span class="synStatement">print</span> <span class="synConstant">&quot;0.0</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>; <span class="synStatement">exit</span>; } <span class="synIdentifier">$X</span> = (<span class="synIdentifier">$X</span> / <span class="synIdentifier">$D</span>) + <span class="synIdentifier">$N</span>; <span class="synIdentifier">$Y</span> = (<span class="synIdentifier">$Y</span> / <span class="synIdentifier">$D</span>) + <span class="synIdentifier">$N</span>; <span class="synStatement">if</span> (<span class="synIdentifier">$X</span> &lt; <span class="synConstant">0</span> || <span class="synIdentifier">$Y</span> &lt; <span class="synConstant">0</span> || <span class="synIdentifier">$X</span> &gt; <span class="synIdentifier">$N</span> * <span class="synConstant">2</span> || <span class="synIdentifier">$Y</span> &gt; <span class="synIdentifier">$N</span> * <span class="synConstant">2</span>) { <span class="synStatement">print</span> <span class="synConstant">&quot;0.0</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>; <span class="synStatement">exit</span>; } <span class="synStatement">my</span> <span class="synIdentifier">@dp</span>; <span class="synStatement">for</span>(<span class="synStatement">my</span> <span class="synIdentifier">$i</span> = <span class="synConstant">0</span>; <span class="synIdentifier">$i</span> &lt; <span class="synIdentifier">$N</span> + <span class="synConstant">1</span>; <span class="synIdentifier">$i</span>++) { <span class="synStatement">for</span> (<span class="synStatement">my</span> <span class="synIdentifier">$j</span> = <span class="synConstant">0</span>; <span class="synIdentifier">$j</span> &lt; <span class="synIdentifier">$N</span> * <span class="synConstant">2</span> + <span class="synConstant">1</span>; <span class="synIdentifier">$j</span>++) { <span class="synStatement">for</span> (<span class="synStatement">my</span> <span class="synIdentifier">$k</span> = <span class="synConstant">0</span>; <span class="synIdentifier">$k</span> &lt; <span class="synIdentifier">$N</span> * <span class="synConstant">2</span> + <span class="synConstant">1</span>; <span class="synIdentifier">$k</span>++) { <span class="synIdentifier">$dp[$i][$j][$k]</span> = <span class="synConstant">0</span>; } } } <span class="synIdentifier">$dp[</span><span class="synConstant">0</span><span class="synIdentifier">][$N][$N]</span> = <span class="synConstant">1.0</span>; <span class="synStatement">for</span>(<span class="synStatement">my</span> <span class="synIdentifier">$i</span> = <span class="synConstant">0</span>; <span class="synIdentifier">$i</span> &lt; <span class="synIdentifier">$N</span>; <span class="synIdentifier">$i</span>++) { <span class="synStatement">for</span> (<span class="synStatement">my</span> <span class="synIdentifier">$j</span> = <span class="synConstant">0</span>; <span class="synIdentifier">$j</span> &lt; <span class="synIdentifier">$N</span> * <span class="synConstant">2</span> + <span class="synConstant">1</span>; <span class="synIdentifier">$j</span>++) { <span class="synStatement">for</span> (<span class="synStatement">my</span> <span class="synIdentifier">$k</span> = <span class="synConstant">0</span>; <span class="synIdentifier">$k</span> &lt; <span class="synIdentifier">$N</span> * <span class="synConstant">2</span> + <span class="synConstant">1</span>; <span class="synIdentifier">$k</span>++) { <span class="synIdentifier">$dp[$i</span> + <span class="synConstant">1</span><span class="synIdentifier">][$j</span> - <span class="synConstant">1</span><span class="synIdentifier">][$k]</span> = <span class="synIdentifier">$dp[$i</span> + <span class="synConstant">1</span><span class="synIdentifier">][$j</span> - <span class="synConstant">1</span><span class="synIdentifier">][$k]</span> + (<span class="synIdentifier">$dp[$i][$j][$k]</span> * <span class="synConstant">0.25</span>) <span class="synStatement">if</span> (<span class="synIdentifier">$j</span> - <span class="synConstant">1</span> &gt;= <span class="synConstant">0</span>); <span class="synIdentifier">$dp[$i</span> + <span class="synConstant">1</span><span class="synIdentifier">][$j</span> + <span class="synConstant">1</span><span class="synIdentifier">][$k]</span> = <span class="synIdentifier">$dp[$i</span> + <span class="synConstant">1</span><span class="synIdentifier">][$j</span> + <span class="synConstant">1</span><span class="synIdentifier">][$k]</span> + (<span class="synIdentifier">$dp[$i][$j][$k]</span> * <span class="synConstant">0.25</span>) <span class="synStatement">if</span> (<span class="synIdentifier">$j</span> + <span class="synConstant">1</span> &lt;= <span class="synIdentifier">$N</span> * <span class="synConstant">2</span>); <span class="synIdentifier">$dp[$i</span> + <span class="synConstant">1</span><span class="synIdentifier">][$j][$k</span> - <span class="synConstant">1</span><span class="synIdentifier">]</span> = <span class="synIdentifier">$dp[$i</span> + <span class="synConstant">1</span><span class="synIdentifier">][$j][$k</span> - <span class="synConstant">1</span><span class="synIdentifier">]</span> + (<span class="synIdentifier">$dp[$i][$j][$k]</span> * <span class="synConstant">0.25</span>) <span class="synStatement">if</span> (<span class="synIdentifier">$k</span> - <span class="synConstant">1</span> &gt;= <span class="synConstant">0</span>); <span class="synIdentifier">$dp[$i</span> + <span class="synConstant">1</span><span class="synIdentifier">][$j][$k</span> + <span class="synConstant">1</span><span class="synIdentifier">]</span> = <span class="synIdentifier">$dp[$i</span> + <span class="synConstant">1</span><span class="synIdentifier">][$j][$k</span> + <span class="synConstant">1</span><span class="synIdentifier">]</span> + (<span class="synIdentifier">$dp[$i][$j][$k]</span> * <span class="synConstant">0.25</span>) <span class="synStatement">if</span> (<span class="synIdentifier">$k</span> + <span class="synConstant">1</span> &lt;= <span class="synIdentifier">$N</span> * <span class="synConstant">2</span>); } } } <span class="synStatement">print</span> <span class="synIdentifier">$dp[$N][$X][$Y]</span>, <span class="synConstant">&quot;</span><span class="synSpecial">\n</span><span class="synConstant">&quot;</span>; </pre> <h2>感想</h2> <p>やっと簡単なDPが使えるようになった。 Cは貪欲法で解いてる人が多いみたいなので、そっちも難なく扱えるようにしたい。 Dみたいな満点取るには数学的な発想が必要になる問題はまだ難しい。</p> minasa757 ブログ作りました hatenablog://entry/12921228815723638318 2014-05-10T06:13:11+09:00 2014-05-10T06:13:11+09:00 ブログ作りました。 設定はあとでやります。 <p>ブログ作りました。</p> <p>設定はあとでやります。</p> minasa757