tag:blogger.com,1999:blog-352391712024-03-07T17:53:08.069+09:00na2hiro's devlog (仮)na2hirohttp://www.blogger.com/profile/01938562923278765238noreply@blogger.comBlogger14125tag:blogger.com,1999:blog-35239171.post-73488185229784127882014-09-23T22:12:00.000+09:002014-09-23T22:13:54.817+09:00Kifu for JSを公開,AndroidやiOSで棋譜再生ができるように<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="https://github.com/na2hiro/Kifu-for-JS" target="_blank">Kifu for JS</a>とそのブックマークレットを公開しました.<br />
<br />
<ul style="text-align: left;">
<li>これまで</li>
<ul>
<li>将棋の棋譜再生盤といえばKifu for FlashやKifu for Java</li>
<li>iOSやAndroidでは動かない</li>
</ul>
<li>これから</li>
<ul>
<li>どの環境でも動くJavaScriptで作られたKifu for JS</li>
<li>Kifu for FlashやJavaをKifu for JSに置換して表示するブックマークレット</li>
</ul>
</ul>
<div>
<br /></div>
<div>
Kifu for JS本体に関してはgithubのREADMEを御覧ください.</div>
<div>
<br /></div>
<div>
ここではブックマークレットの使い方を紹介します.</div>
<div>
<br /></div>
<br />
<div>
<ol class="task-list" style="box-sizing: border-box; color: #333333; font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif; font-size: 16px; line-height: 25.6000003814697px; margin-bottom: 16px; margin-top: 0px; padding: 0px 0px 0px 2em;">
<li style="box-sizing: border-box;"><a href="javascript:!function(){var s=document.createElement("script");s.src="https://na2hiro.github.io/Kifu-for-JS/src/public-bookmarklet.min.js",document.body.appendChild(s)}();void 0;" target="_blank">このリンク</a>をブックマークへ追加する</li>
<li style="box-sizing: border-box;"><a href="http://live.shogi.or.jp/oui/kifu/55/oui201409100101.html" target="_blank">Kifu for FlashやKifu for Javaが使われているページ</a>を開く <a href="https://camo.githubusercontent.com/09c687065111780401a6c871d7392cd33f5720b5/68747470733a2f2f6e61326869726f2e6769746875622e696f2f4b6966752d666f722d4a532f726561646d652d73732f312e706e67" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; box-sizing: border-box; color: #4183c4; text-decoration: none;" target="_blank"><img alt="" data-canonical-src="https://na2hiro.github.io/Kifu-for-JS/readme-ss/1.png" src="https://camo.githubusercontent.com/09c687065111780401a6c871d7392cd33f5720b5/68747470733a2f2f6e61326869726f2e6769746875622e696f2f4b6966752d666f722d4a532f726561646d652d73732f312e706e67" style="border: 0px; box-sizing: border-box; max-width: 100%;" /></a></li>
<li style="box-sizing: border-box;">ブックマークレットを開く <a href="https://camo.githubusercontent.com/7ef4a1f88421c5a248b7eab447202321b0e9c54e/68747470733a2f2f6e61326869726f2e6769746875622e696f2f4b6966752d666f722d4a532f726561646d652d73732f322e706e67" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; box-sizing: border-box; color: #4183c4; text-decoration: none;" target="_blank"><img alt="" data-canonical-src="https://na2hiro.github.io/Kifu-for-JS/readme-ss/2.png" src="https://camo.githubusercontent.com/7ef4a1f88421c5a248b7eab447202321b0e9c54e/68747470733a2f2f6e61326869726f2e6769746875622e696f2f4b6966752d666f722d4a532f726561646d652d73732f322e706e67" style="border: 0px; box-sizing: border-box; max-width: 100%;" /></a></li>
<li style="box-sizing: border-box;">FlashやJava部分が置き換えられ,Kifu for JSの再生盤になる <a href="https://camo.githubusercontent.com/dac28fd07cec1ae224b156f036c7060ad532803a/68747470733a2f2f6e61326869726f2e6769746875622e696f2f4b6966752d666f722d4a532f726561646d652d73732f332e706e67" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; box-sizing: border-box; color: #4183c4; text-decoration: none;" target="_blank"><img alt="" data-canonical-src="https://na2hiro.github.io/Kifu-for-JS/readme-ss/3.png" src="https://camo.githubusercontent.com/dac28fd07cec1ae224b156f036c7060ad532803a/68747470733a2f2f6e61326869726f2e6769746875622e696f2f4b6966752d666f722d4a532f726561646d652d73732f332e706e67" style="border: 0px; box-sizing: border-box; max-width: 100%;" /></a></li>
</ol>
<div>
<span style="color: #333333; font-family: Helvetica Neue, Helvetica, Segoe UI, Arial, freesans, sans-serif;"><span style="line-height: 25.6000003814697px;">以上です.</span></span></div>
</div>
<div>
<span style="color: #333333; font-family: Helvetica Neue, Helvetica, Segoe UI, Arial, freesans, sans-serif;"><span style="line-height: 25.6000003814697px;">快適な観る将ライフをお楽しみ下さい.</span></span></div>
</div>
na2hirohttp://www.blogger.com/profile/01938562923278765238noreply@blogger.com1tag:blogger.com,1999:blog-35239171.post-27238876650440346272014-08-13T22:19:00.000+09:002014-08-14T10:10:24.957+09:00モナド教(Monadianity)のサイトについて<div dir="ltr" style="text-align: left;" trbidi="on">
<blockquote class="twitter-tweet" lang="ja">
モナド教のサイトを公開しました <a href="http://t.co/3JBfJQ8cPs">http://t.co/3JBfJQ8cPs</a><br />
— na2hiro@量子将棋の人 (@na2hiro) <a href="https://twitter.com/na2hiro/statuses/499545335165759488">2014, 8月 13</a></blockquote>
<br />
<script async="" charset="utf-8" src="//platform.twitter.com/widgets.js"></script>
補足<br />
<ul style="text-align: left;">
<li>モナド則を図示してたら天国っぽくなったので当てはめてみた,反省はしていない</li>
<li><b>新規性</b>: 天国が多重になっている宗教は他にないと思います.</li>
<ul>
<li>提案手法は,<b>既存天国の問題点</b>(天国が溢れかえる,天国の非現実的描写)<b>を解決</b>しています</li>
</ul>
<li><a href="http://ja.wikipedia.org/wiki/%E7%A9%BA%E9%A3%9B%E3%81%B6%E3%82%B9%E3%83%91%E3%82%B2%E3%83%83%E3%83%86%E3%82%A3%E3%83%BB%E3%83%A2%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%BC%E6%95%99" target="_blank">空飛ぶスパゲッティモンスター教</a>的な皮肉・ジョーク要素も少し混ぜています.</li>
<ul>
</ul>
<li>サイト内の宗教っぽい図は1564年のJohn Deeによる<a href="http://www.esotericarchives.com/dee/monad.htm" target="_blank">Monas Hieroglyphica</a>からです.哲学の話らしいです.</li>
<li>要望があれば「モナド教で学ぶモナド」も書きます.</li>
</ul>
<div>
<br />
Special Thanks (時系列順)</div>
<div>
<ul style="text-align: left;">
<li>Haskellとモナドの平易な理解を促してくださった<a href="http://www.amazon.co.jp/gp/product/4274068854/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4274068854&linkCode=as2&tag=shogipage-22">すごいH本</a><img alt="" border="0" src="http://ir-jp.amazon-adsystem.com/e/ir?t=shogipage-22&l=as2&o=9&a=4274068854" height="1" style="border: none !important; margin: 0px !important; padding: 0;" width="1" />
の筆者,Lipovačaさんと<a href="http://twitter.com/tanakh" target="_blank">@tanakh</a>さん,村主さん,</li>
<li><a href="http://nineties.github.io/category-seminar/" target="_blank">2013年圏論勉強会</a>において,圏論とそれを説明する可換図式などのツール,物事の本質とは内的性質ではなく外的関係性であることなどを教えて下さりインスピレーションの素地を作ってくださった<a href="http://twitter.com/9_ties" target="_blank">@9_ties</a>さん,</li>
<li>モナドへの考察を深めさせてくれる詳細な記述を与え,直接モナド教を発想するに至った<a href="http://www.amazon.co.jp/gp/product/427406896X/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=427406896X&linkCode=as2&tag=shogipage-22">IFPH(関数プログラミング入門)</a><img alt="" border="0" src="http://ir-jp.amazon-adsystem.com/e/ir?t=shogipage-22&l=as2&o=9&a=427406896X" height="1" style="border: none !important; margin: 0px !important; padding: 0;" width="1" />
の筆者Birdさんと<a href="http://twitter.com/nobsun" target="_blank">@nobsun</a>さん,</li>
<li>その他これらを確立した学者の方々,</li>
<li>サイト公開前にレビューをしてくださった,モナドを予め知っていた/いなかった友人の皆様,</li>
</ul>
<div>
この場を借りて感謝いたします.ありがとうございました.</div>
</div>
</div>
na2hirohttp://www.blogger.com/profile/01938562923278765238noreply@blogger.com0tag:blogger.com,1999:blog-35239171.post-51273587134890576942014-06-16T18:38:00.001+09:002014-06-16T19:31:42.977+09:00ホワイトプランからプリモバイル+Skype電話に切り替えて維持費を月額214円にした<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: left;">
せっかく調べたので公開します.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6mCtwzP-hOo8SIzSo8DU9ub4EvctchtU11XN8GZdInQw6cOSD3gQqQQtxw72NjVJZHNz2mDajvE5scOOvsJCZaMKiwsMSD4JaceKi8NTSBONXiKsnYkj1YI8KHeHb5BFr8jhd/s1600/2014-06-16+16.01.09-resized.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6mCtwzP-hOo8SIzSo8DU9ub4EvctchtU11XN8GZdInQw6cOSD3gQqQQtxw72NjVJZHNz2mDajvE5scOOvsJCZaMKiwsMSD4JaceKi8NTSBONXiKsnYkj1YI8KHeHb5BFr8jhd/s1600/2014-06-16+16.01.09-resized.jpeg" height="300" width="400" /></a></div>
<div style="text-align: left;">
プリモバイル301Z(左)と旧ガラケー830P<br />
<br /></div>
<h2 style="text-align: left;">
前提</h2>
<ul style="text-align: left;">
<li>ホワイトプランのガラケー所持</li>
<ul>
<li>家族もホワイトプランであり家族どうし無料通話</li>
</ul>
<li><b>携帯ではメールや電話の発信をほとんどしない</b>ライトユーザ</li>
<ul>
<li>(インターネット回線と電話回線がくっついていることへ懐疑的)</li>
</ul>
<li>WiMAX,Nexus 7 (Wi-fi)を持ち歩いている</li>
<li>携帯こじ○ではないので複雑なMNP・キャッシュバックは避けたい</li>
</ul>
<div>
<h2 style="text-align: left;">
現状</h2>
</div>
<div>
<ul style="text-align: left;">
<li>ホワイトプラン</li>
<ul>
<li>基本980円/月</li>
<li>メール300円/月</li>
<li>電話はソフトバンク宛無料,他は従量20円/30秒</li>
<li>平均して1500円/月で推移</li>
</ul>
<li>日頃から感じる<b>ガラケー使ってなさ</b></li>
<ul>
<li>就活前は年4回しか発信してなかった</li>
<li>そもそもろくに充電してなかったり</li>
</ul>
</ul>
<div>
<h2 style="text-align: left;">
契機</h2>
</div>
<div>
<ul style="text-align: left;">
<li>1本のクレーム(他会社宛)の電話をしたところ1620円かかった</li>
<ul>
<li>従量なので当たり前だが3万円が懸かっていてつい</li>
</ul>
<li>契約体系見直そう</li>
</ul>
</div>
<div>
<h2 style="text-align: left;">
代案</h2>
</div>
</div>
<div>
<ul style="text-align: left;">
<li>ソフトバンクのプリモバイル</li>
<ul>
<li>チャージ後60日間は発着信,その後360日は着信のみ</li>
<ul>
<li>途中でチャージすればまた同様の60日+360日になる</li>
<li>チャージ最低額は3000円なので,<b>3000円で420日間番号を持てる</b></li>
</ul>
<li>着信のみ期間でも緊急通話可能</li>
<li><b>受け専用にもってこい</b></li>
<li>ホワイトプランの家族がこちらにかけてくる無料が保たれる</li>
</ul>
<li>Skype電話(従量制)</li>
<ul>
<li><b>発信が安い</b></li>
<li>(電話番号付与は高い(年7500円)のでしない)</li>
<li><b>掛け専用にもってこい</b></li>
<li>Nexus 7+WiMAXで発信を行う</li>
</ul>
<li>上の2つを組み合わせる</li>
<li>参考: Skype電話(月額制)</li>
<ul>
<li>発信が多い場合は月額制のほうが安い</li>
</ul>
</ul>
<div>
<h2 style="text-align: left;">
比較</h2>
</div>
</div>
<div>
グレーがかった部分を利用する</div>
<div>
<style>
table#cellular th{text-align: center}
table#cellular td{text-align: right}
table#cellular td.pick{background-color:#DDD}</style>
<br />
<table border="1" id="cellular">
<tbody>
<tr>
<th rowspan="2"></th>
<th rowspan="2">ホワイトプラン</th>
<th rowspan="2">プリモバイル</th>
<th colspan="2">Skype電話</th>
</tr>
<tr>
<th>従量制</th>
<th>月額制(参考)</th>
</tr>
<tr>
<th>月間維持費</th>
<td>1,332</td>
<td class="pick">~214<br />
(年3,000(34分無料))</td>
<td class="pick" rowspan="2">0</td>
<td rowspan="2">130(固定のみ60分無料)<br />
690(固定のみ無制限)<br />
400(60分無料)<br />
790(120分無料)<br />
など</td>
</tr>
<tr>
<th>初年月間維持費</th>
<td>(上+機種代等)</td>
<td class="pick">~384<br />
(年5,378<sup>※1</sup>(8分無料<sup>※2</sup>))</td>
</tr>
<tr>
<th>通話従量</th>
<td>softbank宛: 0円<br />
他社宛: 20円/30秒</td>
<td>8.68円/6秒</td>
<td class="pick" colspan="2">固定: 4.82円+2.26円/分<br />
携帯: 8.75円+10.81円/分</td>
</tr>
<tr>
<th>電話番号</th>
<td>付与</td>
<td class="pick">付与</td>
<td colspan="2">付与なし(+年7500で付与)</td>
</tr>
<tr>
<th>緊急通話</th>
<td>可能</td>
<td class="pick">可能</td>
<td colspan="2">不可能</td></tr>
</tbody></table>
~は"相当"や"換算"の意味.<br />
※1: <a href="http://www.softbank.jp/mobile/campaigns/list/301z/" target="_blank">301Zキャンペーン</a>は6月末まで.以降6,458円.<br />
※2: (初期チャージ4,000円)-(手数料等3,251円)=749円 が8分間の通話に相当<br />
<br />
<h2 style="text-align: left;">
メリット</h2>
<ul style="text-align: left;">
<li><b>月額も従量もホワイトプランより安い</b></li>
<ul>
<li>最低維持費が1332円/月から3000円/420日(~214円/月)と月1000円減る</li>
<li>従量料金も1分の通話で40円から7円(固定),19円(携帯)と半分以下に減る</li>
</ul>
<li>3G圏での着信と緊急電話発信を備え,社会的生存を保てる</li>
<li><b>縛られない</b></li>
<ul>
<li>今どきは2年ごとの更新月でないと契約変更や解約に違約金がかかるらしい</li>
</ul>
</ul>
<div>
<h2 style="text-align: left;">
デメリット</h2>
</div>
<div>
<ul style="text-align: left;">
<li>家族等ソフトバンク宛通話が無料でなくなる</li>
<ul>
<li>通常Skypeで補う</li>
</ul>
<li>現状のホワイトプランから電話番号の引き継ぎができない</li>
<ul>
<li>もし他社の携帯使っていればMNPで可能という皮肉</li>
</ul>
<li>Skypeからの発信は非通知になる</li>
<ul>
<li>世界中で日本など数カ国だけなぜか非対応</li>
</ul>
<li>WiMAX範囲外では当然Skype通話ができない</li>
<ul>
<li>通話履歴によりそういうシチュエーションはほぼないと想定</li>
<li>いざとなればコンビニで3000円チャージすれば発信可能に</li>
</ul>
</ul>
<h2 style="text-align: left;">
まとめ</h2>
</div>
</div>
<div>
プリペイド携帯とSkype電話等のインターネット電話の相性が良いので試してみてはいかが<br />
<br />
<h2 style="text-align: left;">
参考</h2>
<ul style="text-align: left;">
<li><a href="http://www.softbank.jp/mobile/campaigns/list/301z/" target="_blank">プリペイド携帯電話301Zデビューキャンペーン</a></li>
<li><a href="http://www.softbank.jp/mobile/price_plan/3g/white-plan/#price-system" target="_blank">Softbank ホワイトプラン 料金プラン</a></li>
<li><a href="http://www.skype.com/ja/rates/" target="_blank">Skype 料金</a></li>
</ul>
<h2 style="text-align: left;">
余談</h2>
</div>
<div>
<ul>
<li>プリモバイル機を持ち込むと,契約手数料3240円+最低チャージ3000円と,買うより高い.</li>
<li>機種変更 = 既存の番号を保ったまま機械やプランを変更すること</li>
<ul>
<li>機種変更でプリモバイルにすることはできず,今回は新規扱い.</li>
</ul>
<li>ホワイトプラン歴5年以上で,更新月という概念の生まれる前だったため,任意のタイミングで違約金なしの解約ができた.</li>
<li>就職して会社から支給されたら面倒がないのかも.</li>
</ul>
</div>
</div>
na2hirohttp://www.blogger.com/profile/01938562923278765238noreply@blogger.com0tag:blogger.com,1999:blog-35239171.post-77871932269725925482014-02-16T14:37:00.000+09:002014-02-16T14:38:35.950+09:00最強の音楽サーバーを考える<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: left;">
一般に音楽サーバーといえばストリーミングができるものが想像されるようですが,回線がないまたは共用のものだと帯域が気になりますし,一番頻繁に聴く自宅でも回線を経由するのはスマートでないと思います.</div>
<h3 style="text-align: left;">
前提</h3>
<ul style="text-align: left;">
<li>音楽はロスレスでCD3桁枚ある</li>
<li>MacBook Pro 256GBを普段持ち歩いている</li>
<ul>
<li>音楽はあまり入らない</li>
</ul>
<li>Nexus 7を普段持ち歩いている</li>
<ul>
<li>音楽はあまり入らない</li>
</ul>
<li>自宅サーバは容量余裕あり</li>
</ul>
<h3 style="text-align: left;">
現状</h3>
<div>
<ul style="text-align: left;">
<li>MBPにロスレスが一部入っている</li>
<li>外付けに全てが入っている</li>
<ul>
<li>つないだ時しか音楽が聴けない→面倒</li>
</ul>
<li>Nexus 7には入っていない</li>
<ul>
<li>通学中は聴けない</li>
</ul>
</ul>
</div>
<div>
<h3 style="text-align: left;">
要望</h3>
</div>
<div>
<ul style="text-align: left;">
<li>より多くの音楽を聴きたい</li>
<li>MBPの容量に余裕を持たせたい</li>
<li>通学中にNexus 7でも聴きたい</li>
</ul>
<div>
<h3 style="text-align: left;">
最強の構成</h3>
</div>
</div>
<div>
<ul style="text-align: left;">
<li>すべての音楽をサーバに保存</li>
<li>A: リモート再生インターフェイスを作成</li>
<ul>
<li>サーバ上の音楽をサーバ上で再生するためのクライアント</li>
<li>サーバに直接つながったスピーカーで聴く</li>
</ul>
<li>B: Android用音楽ダウンローダ及び変換サーバを作成</li>
<ul>
<li>Lossyに変換しNexus 7に転送する</li>
<li>クライアントで容量上限を設定できその範囲内でやりくりする</li>
<li>何度か聞いたものは削除され新たな音楽に置き換わる</li>
</ul>
<li>自宅で聴く場合</li>
<ul>
<li>MBPなどでAを立ち上げ再生を指示する</li>
</ul>
<li>通学中に聴く場合</li>
<ul>
<li>Bがオンラインである適当なタイミングで適当な音楽をダウンロード</li>
<li>好きな時にローカルに保存された音楽を聴く</li>
</ul>
</ul>
<div>
<h3 style="text-align: left;">
メリット</h3>
</div>
</div>
<div>
<ul style="text-align: left;">
<li>自宅では</li>
<ul>
<li>全ての音楽を聴くことができる</li>
<li>スピーカーにMBPを繋ぐ必要がない</li>
<li>音楽が回線を通ることがない</li>
</ul>
<li>宅外では</li>
<ul>
<li>変換を考えること無く常に新しい音楽をポータブルできる</li>
</ul>
<li>容量に悩まなくて済む</li>
</ul>
<h3 style="text-align: left;">
デメリット</h3>
</div>
<div>
<ul style="text-align: left;">
<li>自宅で音楽以外をスピーカーで再生したい場合,繋ぎ直す必要あり</li>
<ul>
<li>スピーカーで2入力をmixする機能がありケーブルを買えば多分ok</li>
</ul>
<li>外で聴ける音楽は限定される</li>
<ul>
<li>優先度などの設定ができれば不満は減るか</li>
<li>回線の安定した場所で全てを聴くためにストリーミング鯖を用意してもいいかも</li>
</ul>
</ul>
<div>
Aは特にやりたいなと思っています.</div>
</div>
</div>
na2hirohttp://www.blogger.com/profile/01938562923278765238noreply@blogger.com0tag:blogger.com,1999:blog-35239171.post-72554204947734462452014-01-05T23:48:00.000+09:002014-01-05T23:51:14.288+09:00Let's Noteのワイヤレスネットワークが反応しない件<div dir="ltr" style="text-align: left;" trbidi="on">
妹の2010年のレッツノートのワイヤレスネットワークが効かなくなり,スイッチをON/OFFしてもうんともすんとも言わなくなった,というか,その状態で何年も使っていたらしい.デバイスマネージャを確認しても有線,VMwareなんとか,WiMAXアダプタしか表示されない.以下の記事を発見.<br />
レッツノートで無線LANが使えない,音が出ない <a href="http://matsup.blogspot.jp/2009/04/lan.html">http://matsup.blogspot.jp/2009/04/lan.html</a>
<br />
<div>
これにほぼならい,次の手順を実行した.<br />
<ol style="text-align: left;">
<li>c:\util\wswitch\Setup.exeを起動し,ドライバをアンインストールする</li>
<li>コンピュータを再起動した後(しなくていいかも),上と同じexeを起動し,ドライバをインストールする</li>
<li>再起動を要求されるため,再起動する</li>
<li>デバイスマネージャのデバイスが1つ増えた!</li>
</ol>
<div>
しばらくしたら接続のところに無線のアクセスポイントが表示された.</div>
</div>
<div>
スイッチソフトウェアのバグだったということだが,こんな昔から発見されていてもPanasonic側でソフトウェアアップデートをかける術はないんだろうか・・・.</div>
</div>
na2hirohttp://www.blogger.com/profile/01938562923278765238noreply@blogger.com0tag:blogger.com,1999:blog-35239171.post-50022139447681630752013-08-16T08:54:00.004+09:002013-08-16T08:54:59.772+09:00ApacheでWebSocketを通すリバースプロキシ(mod_proxy_wstunnel)<div dir="ltr" style="text-align: left;" trbidi="on">
mod_proxyがWebSocketを通してくれないので困っていましたが,Apache 2.4.5になってmod_proxyがWebSocketも通してくれるようになるモジュール<a href="http://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html">mod_proxy_wstunnel</a>が出来たようです.<br />
<br />
まずはApacheのバージョンを2.4.5以降にあげてください.<a href="http://www.amoss.me.uk/2013/06/apache-2-2-websocket-proxying-ubuntu-mod_proxy_wstunnel/">Apache 2.2のままやる方法</a>もあるそうですが知りません.<br />
そうしたらhttpd.confに次のような行が追加されると思います.コメントアウトされていたら外してください.<br />
<pre class="brush: plain">LoadModule proxy_wstunnel_module libexec/apache24/mod_proxy_wstunnel.so</pre>
最後にプロキシの設定をします.<br />
ProxyPassなどは上から順にマッチさせていくので,厳しい条件から書かなくてはいけません.また,httpとwsの2つのプロトコルを同じパスで共存させることはできないようですので,うまくhttpとwebsocketのパスを分けてマッチさせる必要があります.<br />
<pre class="brush: plain">ProxyPass /socket.io/1/websocket/ ws://81.la:8080/socket.io/1/websocket/
ProxyPass / http://81.la:8080/ retry=3
ProxyPassReverse /socket.io/1/websocket/ ws://81.la:8080/socket.io/1/websocket/
ProxyPassReverse / http://81.la:8080/</pre>
上はNode.jsのWebSocketライブラリであるsocket.ioのサーバの設定例です.httpもwsも喋るNodeアプリを8080番で起動し,8080番ポートは開かずに80番のApacheがクライアントとの間を仲介するというようなユースケースです.websocket通信が/socket.io/1/websocket/以下で行われるという前提を利用して条件が書かれています.</div>
na2hirohttp://www.blogger.com/profile/01938562923278765238noreply@blogger.com0tag:blogger.com,1999:blog-35239171.post-52950502732782931072013-07-16T01:42:00.004+09:002013-07-16T01:45:59.372+09:00zipWithフィボナッチ関数は正格評価でも書ける<div dir="ltr" style="text-align: left;" trbidi="on">
<pre class="brush: haskell">fibs = 0:1:zipWith (+) fibs (tail fibs)</pre>
Haskellでフィボナッチ数列を返す関数の一例.2番めを取りに行くとfibsの0番目と1番目を足したものが返り,3番目を取りに行くとfibsの1番目と2番目を足したものが返るというややキモい流れで,これをもって遅延評価怖いとする声があるが,実はこれは正格評価でも問題なく動く.<br />
<br />
正格評価で結果を得るには基底部を用意して有限列で止める必要があるため,fibs関数の引数でカウントダウンするようにする.(fibs(n)=フィボナッチ数列のn番目という意味ではないので注意)<br />
<br />
<pre class="brush: js">function fibs(n){
return n<=0 ? [] : [0,1].concat(zipWithPlus(fibs(n-1), fibs(n-1).slice(1)));
}
function zipWithPlus(arr1, arr2){
return arr1.map(function(e, n){return e+arr2[n]}).slice(0,arr2.length);
}
</pre>
<br />
nが0になったら空配列を返す以外はHaskellの場合と変わっていない.<br />
<br />
なお,Wikipediaにはこのfibsの定義を「共再帰の例」と書いてあるが,corecursionの訳としては余再帰が正しい.(coに対するcontraが存在すれば「共〜」と「反〜」という訳が当てはまる.)余再帰とは圏論でいう再帰の双対概念である.圏論勉強会 at ワークスアプリケーションズで聞きかじったところによると,F始代数にあたるデータ型を帰納的データ型(inductive data type),F終余代数にあたるデータ型を余帰納的データ型(coinductive data type)と呼び,前者が有限,後者が無限のデータ型を扱えるらしい.Wikipediaではcorecursionの実例としてこのfibsを与えているが,要は無限データ列を返す再帰関数なら全部corecursionなのだろう.</div>
na2hirohttp://www.blogger.com/profile/01938562923278765238noreply@blogger.com0tag:blogger.com,1999:blog-35239171.post-77973402271637176892013-05-28T22:18:00.000+09:002013-05-28T22:18:52.386+09:00オブジェクト指向言語とHaskellの対応関係について<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
どうも,Haskellerかつ圏論愛好家の卵です.<br />
<a href="http://www.amazon.co.jp/gp/product/4274068854/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4274068854&linkCode=as2&tag=shogipage-22">すごいH本</a>をひと通り読み終えて次は<a href="http://www.amazon.co.jp/gp/product/4873114233/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4873114233&linkCode=as2&tag=shogipage-22">Real World Haskell</a>を読み始めています.<br />
<br />
Haskellは関数型言語ながらオブジェクト指向と共通するものを感じたので,その比較・対応関係をまとめました.</div>
<table border="1"><tbody>
<tr><th><br /></th><th>Haskell</th><th>Java</th></tr>
<tr><th>クラス・メソッド定義</th><td>データ型(ここではレコード)<br />
data Human = Human{<br />
name::String,<br />
age::Int,<br />
sex::Sex<br />
}<br />
<br />
関数<br />
sayHello :: Human->String<br />
sayHello h = "my name is "++(name h)</td><td>クラス<br />
class Human{<br />
string name;<br />
int age;<br />
Sex sex<br />
Human(nam,ag,se){<br />
name=nam;<br />
age=ag;<br />
sex=se<br />
}<br />
//メソッド<br />
sayHello(){<br />
return "my name is"+name;<br />
}<br />
}</td></tr>
<tr><th>列挙型</th><td>データ型<br />
data Sex = Male | Female</td><td>列挙型<br />
enum Sex { Male, Female }
</td></tr>
<tr><th>インスタンス・<span style="text-align: left;">メソッド呼び出し</span></th><td>データ<br />
let uhyosan = Human{name="uhyo",age=18,sex=Male}<br />
<br />
関数適用<br />
sayHello uhyosan</td><td>インスタンス<br />
Human uhyosan = new Human("uhyo",18, Male);<br />
<br />
メソッド呼び出し<br />
uhyosan.sayHello();</td></tr>
<tr><th>クラスの性質</th><td>型クラス定義<br />
class Runner a where<br />
run :: a->Int<br />
run' _ = 0 --既定の実装も書ける<br />
<br />
型のインスタンス化<br />
instance Runner Human where<br />
run _ = 1</td><td>インターフェイス定義<br />
interface Runner{<br />
int run();<br />
}<br />
<br />
クラスの実装<br />
class Human implements Runner{<br />
int run(){<br />
return 1;<br />
}<br />
}</td></tr>
<tr><th>性質の継承</th><td>型クラスの継承<br />
class (Runner a, RoadRacer a, Swimmer a) => Triathlete a where<br />
triathlon :: a->Int</td><td>インターフェイスの継承<br />
interface Triathlete extends Runner, RoadRacer, Swimmer{<br />
int triathlon(){<br />
return 2;<br />
}<br />
}</td></tr>
<tr><th><span style="text-align: left;">抽象データ型</span></th><td>抽象データ型<br />
(LeafとNodeがモジュールの外から見えず,別の関数で生成する場合)<br />
data Tree a=Leaf|Node a a<br />
makeTree :: [a] -> Tree a<br />
makeTree = ~<br />
<br />
データ生成<br />
let tree = makeTree [1,2,3]</td><td>ファクトリパターン<br />
(コンストラクタが隠されファクトリが見える場合)<br />
class Tree{<br />
private Tree(){}<br />
public static make(){<br />
return new Tree()<br />
}<br />
}<br />
インスタンス生成<br />
Tree t = Tree.make();</td></tr>
<tr><th><span style="text-align: left;">(抽象クラス)</span></th><td>(抽象データ型の"抽象"は,その型のデータを持てないという意味ではない)</td><td>抽象クラス<br />
abstract class Shape{<br />
abstract void draw();<br />
}</td></tr>
<tr><th><span style="text-align: left;">(クラスの継承)</span></th><td>(型間の継承はない)<br />
(抽象クラスとそれを継承するクラスのようにも見える例)<br />
data Shape = Circle Int Int Int | Rectangle Int Int Int Int</td><td>クラスの継承<br />
class Circle extends Shape{<br />
void draw(){~};<br />
}<br />
class Circle extends Shape{<br />
void draw(){~};<br />
}</td></tr>
<tr><th>多相データ</th><td>データ型の引数<br />
data MyList a = MyNil | Cons a (MyList a)<br />
<br />
--MyList Human型 …Humanに固定<br />
Cons uhyosan MyNil<br />
<br />
--Num a=>MyList a型 …多相性を残している<br />
Cons 1 (Cons 2 (Cons 3 MyNil))<br />
<br />
--DoubleもIntもNumのインスタンスだが<br />
--別のRunnerとは交換不可<br />
Cons (1::Double) (Cons (2::Int) MyNil)<br />
<div>
<br /></div>
</td><td>ジェネリクス<br />
class MyList<T>{<br />
T data[10];<br />
void set(T t){<br />
data[0]=t;<br />
}<br />
}<br />
<br />
//Humanに固定<br />
MyList<Human> ml = new MyList<Human>();<br />
ml2.set(uhyosan);<br />
<br />
//多相性を残している<br />
MyList<Runner> ml2 = new MyList<Runner>();<br />
ml2.set(uhyosan);<br />
<br />
//別のRunnerと交換可能<br />
class Robot implements Runner{int run(){return 100;}}<br />
ml2.set(new Robot())</td></tr>
</tbody></table>
Haskellの型クラスは,オブジェクト指向言語でいう「既定の実装が書けるinterface」または「多重継承の出来るabstract class」と言えると思います.多くの単一継承の言語経験者にとっては「型クラスとはインターフェイスである」という表現がしっくり来るのではないでしょうか.</div>
na2hirohttp://www.blogger.com/profile/01938562923278765238noreply@blogger.com0tag:blogger.com,1999:blog-35239171.post-5900305981493559982013-04-30T02:17:00.000+09:002013-04-30T16:40:01.953+09:00Haskellで多項間比較演算子<div dir="ltr" style="text-align: left;" trbidi="on">
Haskell入門しています.<br />
<a href="http://www.amazon.co.jp/gp/product/4274068854/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4274068854&linkCode=as2&tag=shogipage-22">すごいHaskellたのしく学ぼう!</a> よいですね.最初のほうでHaskellの機能が紹介されていて面白い機能があるんだなあと思ったら,後半でファンクタ,アプリカティブファンクタ,モナドなどが尽くそれらの機能を統一的に説明し,面白い機能とはただの糖衣構文であったということを思い知らされます.まだ読みきっていませんが非常にわかりやすく,かつ引き込まれる内容だと思います.おすすめです.<br />
<br />
さて,Schemeでは<が多引数関数となっていて
<br />
<pre class="brush: lisp">(< 1 2 3) ; 1<2かつ2<3</pre>
<div>
のような記述ができるそうです.Haskellに(<)は2引数関数だけど 1 < 2 < 3みたいに書きたいなあ.Haskellに出来ないはずはない(断言).<br />
<br />
ひとつには,リストを引数としてそれらが昇順だったらokと言う関数myLTが考えられます.
</div>
<pre class="brush: haskell">myLT::[Int]->Bool
myLT = fst . foldl f (True, minBound)
where f (accBool, accNum) num = if accBool then (accNum<num, num) else (False, num)
myLT [1,3,5] -- True
myLT [1,3,2,4] -- False</pre>
<div>
アキュムレータを (今のところ昇順かどうか, 直前の値) :: (Bool, Int) として畳み込んでいます.初期値のminBoundはどんな値よりも小さいCのINT_MINのようなものです(本当はJSの-Infinityのほうが真に小さい).<br />
でも,「ファンクタ,アプリカティブファンクタ,モナド等は値を文脈で包むものだ,Maybeは失敗するかもしれないという文脈を表し,リストは結果がどれか1つに決まらない非決定性の文脈を表すものだ」と習いました.要素をリストで渡すのはモナド的にはおかしいのでは?<br />
<br />
そこで2つめの実装をしてみました.仮想的には,<br />
1 < 2 < 4 < 3<br />
こんなことがしたいです.モナドでは,<br />
return 値 >>= (値を取り文脈に包まれた値を返す関数) >>= (値を取り文脈に包まれた値を返す関数)...<br />
のように左から右に食わせていくことが出来たので,Maybeのような感じで昇順でない2項を発見した段階でNothingに落とすような流れが考えられます.
</div>
<pre class="brush: haskell">data OrderingOrNot a = OutOfOrder | OrderingForNow a deriving (Show)
OutOfOrder .< _ = OutOfOrder
(OrderingForNow a) .< b = if a<b then OrderingForNow b else OutOfOrder
OrderingForNow 1 .< 2 .< 4 -- OrderingForNow 4
OrderingForNow 1 .< 0 .< 4 .< 3 -- OutOfOrder
</pre>
<div>
まずはOrderingOrNotというデータ型を用意していますが,これはMaybeと瓜二つです.今までのところ昇順になっていればOrderingForNowに直前の値が入り,それ以前に照準でない箇所があれば以降はOutOfOrderのみを持ちます.これで仮想的なコードにそっくりな演算子が出来上がりました.<br />
なおMaybeでやっていれば,パターンマッチに失敗した時のfailの実装が「Nothingを返す」なので,2行目がなくて済みます.モナドのインスタンスにしてfailを実装したいところですね.<br />
<br />
ところで,この.<ができるOrderingForNowはファンクタ,アプリカティブファンクタ,モナドのどれなのでしょう.それぞれの演算子の型を見比べてみます.
</div>
<pre class="brush: haskell">fmap :: (a -> b) -> f a -> f b -- ファンクタ
(<*>) :: f (a -> b) -> f a -> f b -- アプリカティブファンクタ
(>>=) :: m a -> (a -> m b) -> m b -- モナド
(.<) :: Ord a => OrderingOrNot a -> a -> OrderingOrNot a -- OrderingOrNotを送っていく何か
</pre>
<div>
ファンクタは,値から値への関数で,文脈から文脈へ値を送りました.<br />
アプリカティブファンクタは,文脈に入った値から値への関数で,文脈から文脈に値を送りました.<br />
モナドは,値から文脈に入った値への関数で,文脈から文脈に値を送りました.<br />
でも.<は,文脈に入った値と値を使って別の文脈に入った値を作っています.ほかの3つと違って関数を受け取っていません.<br />
多分.<が両側を受け取る関数を吸収してしまっているためで,うまく分離すれば関数と>>=等になって,関数のほうはモナド等になれるのではないかと思います.が,いまいちピンときていません.<br />
<br />
また追記すると思います.<br />
<br />
4/30 15:00<br />
更に読み進めた所,モナド版畳み込みであるfoldMを知りました.<br />
foldMにより,前者のfoldlを使った実装をタプルではなくモナドの文脈に包むことが出来,より直感的で単純な書き方ができます.</div>
<pre class="brush: haskell">import Control.Monad
myLTM::[Int]->Bool
myLTM = toBool . foldM f minBound
where f acc num = if acc<num then Just num else Nothing
toBool (Just _) = True
toBool Nothing = False
myLT [1,3,5] -- True
myLT [1,3,2,4] -- False
</pre>
<div>
fが値を文脈に包まれた値に写しています.実にモナドらしいですね.</div>
</div>
na2hirohttp://www.blogger.com/profile/01938562923278765238noreply@blogger.com2tag:blogger.com,1999:blog-35239171.post-88819188918217306082013-03-07T01:58:00.000+09:002013-03-07T02:01:11.980+09:00レジューム付きアップローダ作った<div dir="ltr" style="text-align: left;" trbidi="on">
DnD対応しててWebSocketで送ってレジューム機能にも対応したアップローダ150行足らずで書いたよ<br />
<a href="https://github.com/na2hiro/uploader">https://github.com/na2hiro/uploader</a><br />
<br />
レジュームが欲しかったので作った.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://g.81.la/57462b82670c993aff17978d82dadf8d.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="79" src="http://g.81.la/57462b82670c993aff17978d82dadf8d.png" width="320" /></a></div>
<br /></div>
na2hirohttp://www.blogger.com/profile/01938562923278765238noreply@blogger.com0tag:blogger.com,1999:blog-35239171.post-2808520951832640432013-01-12T04:41:00.000+09:002013-01-12T12:49:10.053+09:00MacBook Pro Retina 15inchを購入<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: left;">
このたびMacBook Pro Retinaの15inchを購入.</div>
<div class="separator" style="clear: both; text-align: left;">
3年前に買ったMacBook Air (Mid 2009)のメモリ不足(2GB)が決定打となりポチりました.</div>
<div class="separator" style="clear: both; text-align: left;">
カスタマイズは,CPU標準(2.3GHz Core i7 Quad),メモリ最大(16GB),SSD標準(256GB).</div>
<div class="separator" style="clear: both; text-align: left;">
MBP Retina 15inchの理由は,</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<ol style="text-align: left;">
<li>画面が大きいのが良かった.持ち運べるのならいくらでも大きいワークスペース欲しい.</li>
<li>メモリをなるべく多く(16GB).MBAで耐えられなくなったのがメモリ不足なので,同様の悩みを壊れるまで持たなくてすむように.</li>
<li>非RetinaのProは重い(Retina 2.0kgに対し非Retina 2.5kg.)</li>
<li>SSD(熱とか音とか)</li>
</ol>
<div>
など.実家で親がMBP Retina 15を使っていたので,重さや大きさなど確認できてよかった.</div>
<div>
<br /></div>
<div>
さて,開封写真並べます.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdH4SRaDDiACdsUB-bxCMjooZBRAwDeKzn1g8GRRpwc97Jpwn3CzqgYvAQ8guWCOBwlsbDncEoMLsheAVRVnoEyLpj0_uZHK-zxy0n7E8bYgTvey49IeGWBxQju0eBXVXyONc1/s1600/13-01-06_001.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdH4SRaDDiACdsUB-bxCMjooZBRAwDeKzn1g8GRRpwc97Jpwn3CzqgYvAQ8guWCOBwlsbDncEoMLsheAVRVnoEyLpj0_uZHK-zxy0n7E8bYgTvey49IeGWBxQju0eBXVXyONc1/s320/13-01-06_001.jpg" width="240" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
到着.</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRNSYGI7FMognVC49CJUmmAmn4NHSbvrHcUtF0v1F-Lby9cm8K_Sw_PYynDcKBFdcYDasXFHeHnzptsCcgxRjTqVBptt1b-LbFN7rljPBJNocxmd4MuN3mt3obAoNIka1ZeWnc/s1600/13-01-06_002.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRNSYGI7FMognVC49CJUmmAmn4NHSbvrHcUtF0v1F-Lby9cm8K_Sw_PYynDcKBFdcYDasXFHeHnzptsCcgxRjTqVBptt1b-LbFN7rljPBJNocxmd4MuN3mt3obAoNIka1ZeWnc/s320/13-01-06_002.jpg" width="320" /></a></div>
<div style="text-align: center;">
箱がAirの時くらい薄っぺらい.</div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh21xkDAHXG1_7G4-93J_O6lnbTWww8-VMP6jJc-2KuNAKs91yrigeSiIwg56gjdpTLtX3fUHCb_kT9rBK1iTbU6ClE7w6l7vMQCg-TlY022VmIsNiuWuAUIxofAJnCozBCSYm3/s1600/13-01-06_003.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh21xkDAHXG1_7G4-93J_O6lnbTWww8-VMP6jJc-2KuNAKs91yrigeSiIwg56gjdpTLtX3fUHCb_kT9rBK1iTbU6ClE7w6l7vMQCg-TlY022VmIsNiuWuAUIxofAJnCozBCSYm3/s320/13-01-06_003.jpg" width="240" /></a></div>
<div style="text-align: center;">
Hello, world </div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMNtWexfYOYGg1R2sTe6sXkf-UL7oHyolyajqf5-1TmcFwHPklZtCjsSo1a01jstiAC5fuf8hMHcGkUz7qJU4eTixkrsdFRVRO93WizGFf_rXftE-oD7H_LgEUOSf8zNzOUG9S/s1600/13-01-06_004.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMNtWexfYOYGg1R2sTe6sXkf-UL7oHyolyajqf5-1TmcFwHPklZtCjsSo1a01jstiAC5fuf8hMHcGkUz7qJU4eTixkrsdFRVRO93WizGFf_rXftE-oD7H_LgEUOSf8zNzOUG9S/s320/13-01-06_004.jpg" width="320" /></a></div>
<div style="text-align: center;">
本体とACアダプタとミニ説明書だけ. </div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjqf7YrV3uqnxkIxlA6w2T_AsMxcxwBpBaIZEtF7S4cht9F9VVJQTD-I32CNrWzqK7wlxIWWziihm5PbBW9xB5Q2HWT3Q8DVhMYeOZZmsAk78HIP7yOfnnfDcUACZQPfSWrm9A/s1600/13-01-06_005.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjjqf7YrV3uqnxkIxlA6w2T_AsMxcxwBpBaIZEtF7S4cht9F9VVJQTD-I32CNrWzqK7wlxIWWziihm5PbBW9xB5Q2HWT3Q8DVhMYeOZZmsAk78HIP7yOfnnfDcUACZQPfSWrm9A/s320/13-01-06_005.jpg" width="240" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
薄すぎ.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpPIRaKEp58oXhrNmixCUtyg0hjkOBMJgaSPxaevt_44RoSjgbpHZCXGhJTfftD3z3cLMjAqoDW2Mhtg8qHVa-3VQUmQ7YFMd8623vXIrY3SyoQsRD96JBTNxo-jaB2DUItGJ2/s1600/13-01-06_006.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpPIRaKEp58oXhrNmixCUtyg0hjkOBMJgaSPxaevt_44RoSjgbpHZCXGhJTfftD3z3cLMjAqoDW2Mhtg8qHVa-3VQUmQ7YFMd8623vXIrY3SyoQsRD96JBTNxo-jaB2DUItGJ2/s320/13-01-06_006.jpg" width="240" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
開いた様子.13インチMBP/MBAと違ってキーボード左右にスピーカーがある.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFPQXAN0GdQZTog_6eeLZEhmpl_G6hMXiQ99WMttKo81oyuwCearyXvfcGkZ020AEyJwF1XwWXZQ8GEV7JAZkQXshDtFBncCeg7Vd82Ca-0hxuObaNndKfnIxYNCmnc1QS54g1/s1600/13-01-06_007.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFPQXAN0GdQZTog_6eeLZEhmpl_G6hMXiQ99WMttKo81oyuwCearyXvfcGkZ020AEyJwF1XwWXZQ8GEV7JAZkQXshDtFBncCeg7Vd82Ca-0hxuObaNndKfnIxYNCmnc1QS54g1/s320/13-01-06_007.jpg" width="240" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
電源つける.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgByobxXAdUJAjo8Jkl31_PwsKf54JYvNH8qscKM9jzoiJwGNHOifD34_XmthCNcS1W23_eulPA_X3adbbDN4tzUWwS65VMdR3B96VavLZTNHXtb5nGF9ZTTIo1vmlT2vWEWEcw/s1600/13-01-06_008.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgByobxXAdUJAjo8Jkl31_PwsKf54JYvNH8qscKM9jzoiJwGNHOifD34_XmthCNcS1W23_eulPA_X3adbbDN4tzUWwS65VMdR3B96VavLZTNHXtb5nGF9ZTTIo1vmlT2vWEWEcw/s320/13-01-06_008.jpg" width="320" /></a></div>
<div style="text-align: center;">
初期設定中,モーダルメッセージが二重に出て,一方消してももう一方が消せなくなった.大丈夫か.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjww9QMo6QHPT3F7pjdx-wkivG_JQPHrI8FhWPufF2-iiVC5MpOWcEv1wQoYuMYgMw3eWOqi0Q1UmiHL3_pJ7__hguX5mibtargEx4eArYjz3rX0OLGv6Wku10mTKV_KA1QdKLq/s1600/13-01-06_009.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjww9QMo6QHPT3F7pjdx-wkivG_JQPHrI8FhWPufF2-iiVC5MpOWcEv1wQoYuMYgMw3eWOqi0Q1UmiHL3_pJ7__hguX5mibtargEx4eArYjz3rX0OLGv6Wku10mTKV_KA1QdKLq/s320/13-01-06_009.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
無事完了.右上は<strike>偽Growl</strike>通知センター.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhojQ9RIBDm0kSOJa8xzpvUzvdR8bQT3hy7_ZM8ETWab00u70CJE67e2ZO6Px8GQurS9ruiyyiJu2sby96mJXO1gan0J5VqJVhJO7XINKwnjUh1TtSfAHTgcEDp3NqDXjyH9YcN/s1600/13-01-06_010.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhojQ9RIBDm0kSOJa8xzpvUzvdR8bQT3hy7_ZM8ETWab00u70CJE67e2ZO6Px8GQurS9ruiyyiJu2sby96mJXO1gan0J5VqJVhJO7XINKwnjUh1TtSfAHTgcEDp3NqDXjyH9YcN/s320/13-01-06_010.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
MBP Retina 15 と MBA 13.薄さは負けていない.</div>
<br />
数日使った印象では<br />
<br />
<ul style="text-align: left;">
<li>Retina綺麗すぎワロタ</li>
<li>やはり画面大きくて良い</li>
<li>空きメモリ2桁ギガ圧勝</li>
<li>バッテリMax残量が公称7時間よりなぜか多い</li>
<li>音が良い(旧MBAではキーボードの右手の直下あたりに1つだけだった)</li>
<li>仮想マシン複数起動してもへっちゃら</li>
<li>ファンあまりない,稼働しても静か</li>
</ul>
<div>
と,文句なし.バリバリ使っていきたい.</div>
<div>
旧Airはおでかけ用になりそうです.</div>
</div>
na2hirohttp://www.blogger.com/profile/01938562923278765238noreply@blogger.com0tag:blogger.com,1999:blog-35239171.post-59812681109791420542013-01-01T05:15:00.001+09:002013-01-01T05:15:08.369+09:00JavaScript S式パーサ "S.js"を公開<div dir="ltr" style="text-align: left;" trbidi="on">
General Game Playing (そのうち話す)の中でHTTPでS式をやりとりする話が出てきたのですが,JavaScriptによるS式のパーサが見当たらないので書いてみました.<br />
<a href="https://github.com/na2hiro/S.js">https://github.com/na2hiro/S.js</a><br />
<br />
パーサジェネレートは<a href="http://zaach.github.com/jison/">Jison</a>を使用.<br />
そのパーサは<a href="http://www.typescriptlang.org/">TypeScript</a>で書いたオブジェクトをツリー状に構成して返すようにしました.<br />
Jisonの出力したパーサのjsと,TypeScriptのコンパイル後のjsを,単純につなげるだけでnodejsでrequire可能なファイルになっていて分かりやすかったです.外から見えるようにしたいもの(exportしたいもの)についてはtsファイル中の関数宣言または変数名にexport修飾子をつけるだけでok.<br />
<br />
内容ですが,<br />
<pre class="brush: plain">(1 2 (3 . (4)) 5)</pre>
といったS式をパースし,
<br />
<pre class="brush: plain">["1", "2", ["3", "4"], "5"] //配列をリストとみなすList array方式
["1", ["2", [["3", ["4", []]], ["5", []]]]] //配列を対とみなすCons array方式
</pre>
のような配列を返したり,またその逆で配列をS式の文字列に直したりできたりします.</div>
na2hirohttp://www.blogger.com/profile/01938562923278765238noreply@blogger.com0tag:blogger.com,1999:blog-35239171.post-48843531879155248312013-01-01T03:18:00.001+09:002013-01-01T03:39:06.733+09:006年ぶり2度目のテスト<div dir="ltr" style="text-align: left;" trbidi="on">
投稿テスト</div>
na2hirohttp://www.blogger.com/profile/01938562923278765238noreply@blogger.com0tag:blogger.com,1999:blog-35239171.post-1159535115334139302006-09-29T22:04:00.000+09:002013-01-12T15:25:17.156+09:00testどうでしょうか?na2hirohttp://www.blogger.com/profile/01938562923278765238noreply@blogger.com0