<?xml version="1.0" encoding="UTF-8" ?>
<feed
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"
	xml:lang="ja-JP"
>
	<title>txqz blog</title>
	<subtitle>3944件中1から15件目を表示します。</subtitle>
	<id>http://txqz.net/blog?1</id>
	<link rel="self" href="http://txqz.net/blog.atom?1"/>
	<link rel="alternate" type="application/rss+xml" href="http://txqz.net/blog.rdf?1"/>
	<link rel="alternate" type="application/xhtml+xml" href="http://txqz.net/blog.xhtml?1"/>
	<link rel="alternate" type="text/html" href="http://txqz.net/blog.html?1"/>
	<link rel="contents" href="http://txqz.net/blog/../" title="トップページ"/>
	<link rel="first" href="http://txqz.net.atom?1" title="その1"/>
	<link rel="next" href="http://txqz.net.atom?2" title="その2"/>
	<link rel="last" href="http://txqz.net.atom?263" title="その263"/>
	<author>
		<name>陽坂智佐</name>
		<email>spambasket@txqz.net</email>
	</author>
	<entry>
		<title>VIASO/K-power追悼</title>
		<id>tag:txqz.net,2010-02-14:/blog/2010/02/14/1221</id>
		<link rel="alternate" href="http://txqz.net/blog/2010/02/14/1221"/>
		<summary type="text">三菱UFJニコスが生まれて、今まで別だったUFJカード・NICOSカード・DCカードのログインポータルがひとつになった。とは言っても単に旧3種と新しいMUFGカードのログイン画面へのリンクや共通キャンペーン情報などがあるだけで、この先には元あったログイン画面が残っている。
私はMUFG系だとニコスのVIASOカードとUFJのK-powerカードを持っていて、どちらも目的を分けてそれなりに使っていた。そのうち私はこう使っているみたいなのを書こうと思っていたのだけど、旧来のカードの新規募集が軒並み終了 ……</summary>
		<content type="xhtml">
			<div xmlns="http://www.w3.org/1999/xhtml">
<p>三菱UFJニコスが生まれて、今まで別だったUFJカード・NICOSカード・DCカードの<a href="http://www.cr.mufg.jp/member/login/index.html" title="会員専用WEBサービス ログイン | クレジットカード(VISA/MasterCard)なら三菱UFJニコス">ログインポータル</a>がひとつになった。とは言っても単に旧3種と新しいMUFGカードのログイン画面へのリンクや共通キャンペーン情報などがあるだけで、この先には元あったログイン画面が残っている。</p>
<p>私はMUFG系だとニコスのVIASOカードとUFJのK-powerカードを持っていて、どちらも目的を分けてそれなりに使っていた。そのうち私はこう使っているみたいなのを書こうと思っていたのだけど、<a href="http://www.cr.mufg.jp/apply/card/info/index.html" title="新規募集終了のご案内 | クレジットカード(VISA/MasterCard)なら三菱UFJニコス">旧来のカードの新規募集が軒並み終了されてしまった</a>。もう遅いけど、<a href="http://shisobu.g.hatena.ne.jp/keyword/%E7%B4%AB%E8%98%87%E3%82%AB%E3%83%B3%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9%20Vol.1" title="紫蘇カンファレンス Vol.1 - しソ部">第1回紫蘇カンファレンス</a>で話したことも含めて、これらのカードについて振り返っておこうと思う。</p>
<h3>Viasoカード</h3>
<p>ニコスが発行しているものとUFJが発行しているものとで、海外旅行保険やポイントの付き方・モールの取り扱いや還元率が若干違うが、以下はニコス版の話。</p>
<p>100円で0.5ptついて12ヶ月で1000pt以上集めると集めたポイント分だけキャッシュバックされる。キャッシュバックされるタイミングを自分で選べないかわりに、1000pt以上あれば付いたポイントが無駄にならない。1年で1000pt集めるのは一見大変そうだが、「<dfn>楽ペイ</dfn>」で払うと100円で1ptになる。楽ペイは支払が自動的にリボルディング払いになるというものだが、最初の1ヶ月は金利が付かないので、限度額が10万なら楽ペイの月支払額を10万円にしておけば実質1回払いと変わらない。ETCやケータイ会社からの請求は100円で1ptつき、楽ペイと組み合わせると1.5ptになる。さらに、ショッピングモールが充実していて、たとえば<a href="http://www.boople.com/bst/html/index.html" title="オンライン書店 boople.com: 本・雑誌定期購読・CD・DVD の通販サイト">boople</a>での決済に+5%のポイントがつく。オリコモールだと「5倍」だけど、オリコはデフォルトで0.5%還元なので2.5%にしかならない。</p>
<p>ということでネット通販をするのに大変良かったのだが、2009年9月に楽ペイでのポイント2倍が廃止された。その旨伝えるハガキに、ちゃっかり退会方法が載っていたのが面白くて、これで退会してしまったらキャッシュバックが受けられない。10ヶ月で238958円このカードで決済して、7581円分のキャッシュバックを受ける権利があるので、それだけもらったら退会しようと思う。還元率は約3.3%になった。</p>
<h3>K-powerカード</h3>
<p>ドコモ・au・ソフトバンク・ウィルコムからの請求が、合計月1万円を上限に割り引かれるカード。パンフレットには「通話料金」とあるけど、端末の月賦やコンテンツ代金など、ケータイ会社からの請求ならなんでも対象になる。ケータイ会社からの請求が1000円ごとに1pt、その他の請求が1000円ごとに1ptついて、月に合計30pt集めると翌月のケータイ会社からの請求の10%が翌々月に還ってくる。VIASOカードと同様楽ペイで払うとポイントが2倍つく。つまり、最も都合のいい使い方(ケータイ10000円・その他5000円・楽ペイ)をすると、15000円で1000円還元、還元率6.67%となる。</p>
<table>
<caption>K-powerカードのキャッシュバック率</caption>
<thead>
<tr><th>1ヵ月の合計ショッピングポイント</th><th>キャッシュバック率</th></tr>
</thead>
<tbody>
<tr><th>0～29ポイント</th><td>0％</td></tr>
<tr><th>30～49ポイント</th><td>10％</td></tr>
<tr><th>50～99ポイント</th><td>15％</td></tr>
<tr><th>100～149ポイント</th><td>20％</td></tr>
<tr><th>150～199ポイント</th><td>30％</td></tr>
<tr><th>200～249ポイント</th><td>40％</td></tr>
<tr><th>250ポイント以上</th><td>50％</td></tr>
</tbody>
</table>
<p>実際はそんなに上手くいかない。まず、あくまで2種類のポイントを合算して30ptを超える必要があるので、ケータイ9500円・その他5501円だと、合計15000円を超えているからキャッシュバックされると思いがちだが、ケータイ18pt・その他10ptで合計28pt(楽ペイ前提)であり、30ptに満たないので1円も還元されない。</p>
<p>また、キャッシュバック率の決定→キャッシュバックされる金額の決定→実際のキャッシュバックまで2ヶ月のディレイがある。つまり、還元率を高くしようと思ったら、入会した最初の1ヶ月はケータイ代をこれで決済しないで、次の月から10000円を目指していく必要がある。やめるときはケータイ代だけ残し、翌月にキャッシュバックされたのを見て退会する必要がある。3ヶ月15000円を決済して3ヶ月目に1000円キャッシュバックされるので、この3ヶ月だけ見ると還元率は2.2%であり、記事広告だけ見て6%還元! すごい! と思って契約すると肩透かしを食らう。さらに2年目からは年会費1575円が必要になる。年間の還元率を一番都合のいいパターンで計算すると、1年目は最初の2ヶ月はキャッシュバックがないから(1000*10)/(15000*12)で5.6%、2年目からは年会費がかかって(1000*12-1575)/(15000*12)で5.8%となる。</p>
<p>これを去年の5月に契約してこれまで運用した結果、計算を間違えて多めに決済してしまったり逆に決済額が足らなかったりして、8ヶ月で154865円決済して還元額は4197円。還元率はほぼ3.0%になった。広告の数字ほどではないけど、決して悪くない数字だと思う。ケータイ代はもちろんこれで、あとプロバイダ代や電気・ガスなど毎月引き落とされるものを15000円分集めてほかっておけばいいので、そういうデッキを作れればあとは楽。</p>
<p>計算を間違えたというのは、クレジットカードへの請求の上がる日が各社によってまちまちなのを知らなくて、これは足りない!と思って30ptになるように買い物→あとから請求が上がってきて意味がなかったというのがあった。2月10日請求の利用明細を見ると、11月30日のNTT東日本から1月6日の東京電力まで幅広い利用日が並んでいる。NTT東日本の請求の上がるのが遅いからこうなるのだが、使いはじめでそういうのを知らなかったから、未確定請求に東京電力がなくて1ヶ月以上前のNTT東日本からのがあれば東京電力の請求が来月回しになってしまったのではないかと焦るのももっともだと思う。「<cite>東京電力からのお知らせ</cite>」には、<q>クレジットカード会社の締切日と当社の検針日の関係により、2ヶ月分の電気料金があわせてご請求となる場合がございます</q>と書いてあるし……</p>
<p>K-powerのほうは楽ペイ2倍が廃止されず、あまり考えないでこれだけ還元されるカードもなかなかないと思うので、まだ使い続ける予定。</p>
			</div>
		</content>
		<category term="クレジットカード"/>
		<trackback:ping>http://txqz.net/blog/2010/02/14/1221/tb</trackback:ping>
		<published>2010-02-14T12:21:39+09:00</published>
		<updated>2010-02-14T12:44:51+09:00</updated>
	</entry>
	<entry>
		<title>年収ジェネレータ</title>
		<id>tag:txqz.net,2009-12-28:/blog/2009/12/28/2206</id>
		<link rel="alternate" href="http://txqz.net/blog/2009/12/28/2206"/>
		<summary type="text">昨晩年収ジェネレータというweb5.0的サービスをリリースしまして、そのきっかけをここにまとめようとしていたのですが有志の方がすでにまとめてくださったので特に書くことがありません。まきもとさんのワンライナーを使っているとfuba様に思われたような感じですが、別の方法で実装しています。本当は平均年収がよく出るような実装にしたら良かったのですが、金額生成部分は1行で書いたので、だいたい0円～3400万円が均等に出るようになっています。確認したところ少ない人で4万円程度、検索結果を眺めると1000万から2 ……</summary>
		<content type="xhtml">
			<div xmlns="http://www.w3.org/1999/xhtml">
<p>昨晩<a href="http://youzaka.shisobu.in/nenshuu.php" title="年収ジェネレータ">年収ジェネレータ</a>という<a href="http://b.hatena.ne.jp/t/web5.0" title="タグ「web5.0」を含む新着エントリー - はてなブックマーク">web5.0</a>的サービスをリリースしまして、そのきっかけをここにまとめようとしていたのですが<a href="http://togetter.com/li/2368" title="Togetter(トゥギャッター) - まとめ「年収ジェネレータができるまで」">有志の方がすでにまとめてくださった</a>ので特に書くことがありません。<a href="http://twitter.com/makimoto/status/7091145015" title="Twitter / Shimpei Makimoto: % perl -e '$a=int(rand(100 ...">まきもとさんのワンライナー</a>を使っていると<a href="http://twitter.com/fuba/status/7104459582" title="Twitter / fuba: 年収ジェネレータの何がすごいってあんなワンライナーで ...">fuba様に思われた</a>ような感じですが、別の方法で実装しています。本当は平均年収がよく出るような実装にしたら良かったのですが、金額生成部分は1行で書いたので、だいたい0円～3400万円が均等に出るようになっています。確認したところ少ない人で4万円程度、<a href="http://pcod.no-ip.org/yats/search?query=youzaka.shisobu.in%2Fnenshuu.php" title="youzaka.shisobu.in/nenshuu.php - twitter検索">検索結果を眺める</a>と1000万から2000万の人が多い印象です。<a href="http://youzaka.shisobu.in/nenshuu.php?id=youzaka" title="年収ジェネレータ">私の場合約250万だった</a>ので、正直それほど高めに出てくるとは思いませんでした……ってアルゴリズムを知っている人が読むと白々しいのですが。</p>
<p>アドバイスをいただいたので途中からTwitterにPOSTするアンカーを設けました。それのおかげか、今日未明から昼過ぎくらいまで割と長い間Buzzっていたようです。ありがたいことです。なにがWeb5.0なのか知りませんが、こういうライトなものがどんどん広まっていく様子を観察できるのもTwitterのいいところですよね。ブログだとこんな1行ネタを脊髄反射で投稿してはい次なんてありえないし、まとめて観察もしにくい。気軽にアウトプットできないからこんなに広がらないし、今まで身内程度でしか面白がれなかったのがどんどんまきこめていける。個人ニュースサイトからソーシャルブックマーク、そしてマイクロブログと情報伝達がどんどんボトムアップ型へシフトしていく中で、そのエキサイティングさとエネルギーを久しぶりに実体験できました。</p>
<ins class="ps" datetime="2009-12-30T10:16:10+09:00" id="PS1262135770">
<p>4万円台をはるか下回る結果が出ました。おめでとうございます(謎</p>
<blockquote cite="http://youzaka.shisobu.in/nenshuu.php?id=%E4%BA%95%E8%9B%99" title="年収ジェネレータ">
<p>井蛙さんの今年の年収は313円でした。</p>
</blockquote>
</ins>
			</div>
		</content>
		<category term="Web5.0"/>
		<category term="Webサービス"/>
		<category term="ジェネレータ"/>
		<category term="Twitter"/>
		<category term="年収"/>
		<trackback:ping>http://txqz.net/blog/2009/12/28/2206/tb</trackback:ping>
		<published>2009-12-28T22:06:30+09:00</published>
		<updated>2009-12-30T10:16:10+09:00</updated>
	</entry>
	<entry>
		<title>ブログから性別を判定する研究とかありましたね</title>
		<id>tag:txqz.net,2009-12-20:/blog/2009/12/20/2320</id>
		<link rel="alternate" href="http://txqz.net/blog/2009/12/20/2320"/>
		<summary type="text">
ようざかは名前がちさですし、女の子ですよ


@youzaka さんの性別を疑った事はないです。あとトイレさんも


@okadapan はい……

一方@siro_xxは、先日のチームラボ&amp;pixiv合同会社説明会(便宜的に@tksさんのtweetにリンクを貼っているけど、もっとそれっぽいアンカー先募集)で性別詐称に成功していた。
</summary>
		<content type="xhtml">
			<div xmlns="http://www.w3.org/1999/xhtml">
<blockquote cite="http://twitter.com/youzaka/status/6590693448" title="Twitter / 陽坂智佐: ようざかは名前がちさですし、女の子ですよ">
<p>ようざかは名前がちさですし、女の子ですよ</p>
</blockquote>
<blockquote cite="http://twitter.com/okadapan/status/6590757452" title="Twitter / okada: @youzaka さんの性別を疑った事はないです。あ ...">
<p>@<a href="http://twitter.com/youzaka">youzaka</a> さんの性別を疑った事はないです。あとトイレさんも</p>
</blockquote>
<blockquote cite="http://twitter.com/youzaka/status/6590772198" title="Twitter / 陽坂智佐: @okadapan はい……">
<p>@<a href="http://twitter.com/okadapan">okadapan</a> はい……</p>
</blockquote>
<p>一方@<a href="http://twitter.com/siro_xx" title="シロ2.0 (siro_xx) on Twitter">siro_xx</a>は、先日の<a href="http://twitter.com/tks/status/6760740908" title="Twitter / 高須 正和(team-lab): 今週の土曜日 Pixivとチームラボ合同で静岡大学で ...">チームラボ&amp;pixiv合同会社説明会</a>(便宜的に@<a href="http://twitter.com/tks" title="高須 正和(team-lab) (tks) on Twitter">tks</a>さんのtweetにリンクを貼っているけど、もっとそれっぽいアンカー先募集)で<a href="http://twitter.com/siro_xx/status/6822844095" title="Twitter / シロ2.0: 「男性の方だと思ってました」やったー！ヽ(*'∀') ...">性別詐称に成功</a>していた。</p>

			</div>
		</content>
		<category term="ネタ"/>
		<category term="ポリタンク"/>
		<category term="性別"/>
		<trackback:ping>http://txqz.net/blog/2009/12/20/2320/tb</trackback:ping>
		<published>2009-12-20T23:20:27+09:00</published>
		<updated>2009-12-20T23:20:27+09:00</updated>
	</entry>
	<entry>
		<title>アンカー生成をブックマークレットで</title>
		<id>tag:txqz.net,2009-12-09:/blog/2009/12/09/2359</id>
		<link rel="alternate" href="http://txqz.net/blog/2009/12/09/2359"/>
		<summary type="text">たいした話でないばかりに書かずにいたら外で参照できずに残念な思いをしたので悔い改めるシリーズ。
IEだったらコンテクストメニュー追加セットでやっていたようなことをOperaではopera exを使ってしていたけど、いま更新停止中だし、よく考えたらブックマークレットで十分なのでブックマークレットを書いた、というか他にそういうことをやっていた人のを参考にした。


ニックネームアドレス


majavascript:window.prompt('','&lt;a\x20href=\x22' ……</summary>
		<content type="xhtml">
			<div xmlns="http://www.w3.org/1999/xhtml">
<p>たいした話でないばかりに書かずにいたら外で参照できずに残念な思いをしたので悔い改めるシリーズ。</p>
<p>IEだったら<a href="http://say.vis.ne.jp/script/etc/" title="その他 - スクリプト置き場">コンテクストメニュー追加セット</a>でやっていたようなことをOperaでは<a href="http://ja.opera-wiki.com/opera_ex" title="opera ex - Opera Wiki">opera ex</a>を使ってしていたけど、いま更新停止中だし、よく考えたらブックマークレットで十分なのでブックマークレットを書いた、というか他にそういうことをやっていた人のを参考にした。</p>
<table>
<thead>
<tr><th>ニックネーム</th><th>アドレス</th></tr>
</thead>
<tbody>
<tr><th>ma</th><td><code class="javascript">javascript:window.prompt('','&lt;a\x20href=\x22'+location.href+'\x22\x20title=\x22'+document.title+'\x22&gt;'+document.title+'&lt;/a&gt;')</code></td></tr>
<tr><th>ml</th><td><code class="javascript">javascript:window.prompt('',document.title+'\x0A'+location.href)</code></td></tr>
<tr><th>mb</th><td><code class="javascript">javascript:window.prompt('','&lt;blockquote\x20cite=\x22'+location.href+'\x22\x20title=\x22'+document.title+'\x22&gt;\x0A&lt;p&gt;'+window.getSelection()+'&lt;/p&gt;\x0A&lt;/blockquote&gt;')</code></td></tr>
<tr><th>mq</th><td><code class="javascript">javascript:window.prompt('','&lt;q\x20cite=\x22'+location.href+'\x22\x20title=\x22'+document.title+'\x22&gt;'+window.getSelection()+'&lt;/q&gt;')</code></td></tr>
</tbody>
</table>
<p>ということで、ウェブサイトを見ていてアンカーを生成したくなったら、<kbd>Ctrl</kbd>+<kbd>l</kbd>→<kbd>m</kbd><kbd>a</kbd>→<kbd>Enter</kbd>→<kbd>Ctrl</kbd>+<kbd>x</kbd>→<kbd>Esc</kbd>→<kbd>Alt</kbd>+<kbd>Tab</kbd>→<kbd>Ctrl</kbd>+<kbd>v</kbd>な感じ。</p>
<ins class="ps" datetime="2009-12-21T00:03:19+09:00" id="PS1261321399">
<p>ただ、window.getSelection()を使うと選択した箇所が単にテキストとして扱われるので、選択箇所にアンカーなどほかの要素がマークアップされていてもそれが反映できない。<a href="http://say.vis.ne.jp/script/etc/" title="その他 - スクリプト置き場">コンテクストメニュー追加セット</a>は選択範囲の子要素もうまく扱ってくれていたので、Operaでもそこらへんうまくやれるようなやり方を見つけていきたい。</p>
</ins>
<p>あとは<kbd>b</kbd>で<a href="http://www.hatena.ne.jp/tool/bookmarklet#addtobookmark" title="ブックマークレット - はてな">はてブにPOSTできるように</a>したり、<kbd>l</kbd>で<a href="http://reader.livedoor.com/utility/bookmarklet/" title="livedoor Reader - RSSリーダー : ブックマークレット">ldRにフィードを投げられるように</a>したり、<kbd>t</kbd>で<a href="http://www.tumblr.com/goodies" title="Goodies | Tumblr">TumblrにPOSTできるように</a>したり (Opera版Tomblooください)、<kbd>m</kbd>で<a href="http://mitter.jp/tools/bookmarklet" title="Mitter - Mitter ブックマークレット">mitterにPOSTできるようにしたり</a>している。これらはオフィシャルで配布しているブックマークレット。</p>
			</div>
		</content>
		<category term="Opera"/>
		<category term="ブックマークレット"/>
		<trackback:ping>http://txqz.net/blog/2009/12/09/2359/tb</trackback:ping>
		<published>2009-12-09T23:59:59+09:00</published>
		<updated>2009-12-21T00:04:09+09:00</updated>
	</entry>
	<entry>
		<title>解こう！イラストロジック！</title>
		<id>tag:txqz.net,2009-11-03:/blog/2009/11/03/2322</id>
		<link rel="alternate" href="http://txqz.net/blog/2009/11/03/2322"/>
		<summary type="text">
イラロジのセンスが無いだけなのかもしれんけど、これ解くのに３ヶ月かかりました。（DL-PDF 30KB）


ということでやってみる。
まず、セオリーに従って数字の大きいところに注目、あとはそこからどんどん論理的に考えて塗ったり×印をつけたりすればいい (図1; 茶色は塗るところ、灰色は×印を打つところ)。

図1 これ以上どうする?


図1まで塗り終わったあと手が止まった。これ以上どこを塗れるだろうか。
手詰まりなので、たとえば、[4 3]の列(左から4番目の列)に注目し ……</summary>
		<content type="xhtml">
			<div xmlns="http://www.w3.org/1999/xhtml">
<blockquote cite="http://blog.livedoor.jp/text_site/archives/50746556.html" title="できるかこんなの（笑）（TexTsiTe）">
<p>イラロジのセンスが無いだけなのかもしれんけど、これ解くのに３ヶ月かかりました。（<a href="http://www.geocities.jp/cure_wt/pdf/n-logic28.pdf">DL-PDF 30KB</a>）</p>
</blockquote>

<p>ということでやってみる。</p>
<p>まず、セオリーに従って数字の大きいところに注目、あとはそこからどんどん論理的に考えて塗ったり×印をつけたりすればいい (図1; 茶色は塗るところ、灰色は×印を打つところ)。</p>
<table>
<caption>図1 これ以上どうする?</caption>
<tbody><tr><td><img src="/figure/2009/11/03/a.png" alt="" /></td></tr></tbody>
</table>
<p>図1まで塗り終わったあと手が止まった。これ以上どこを塗れるだろうか。</p>
<p>手詰まりなので、たとえば、[4 3]の列(左から4番目の列)に注目してみる。この列は、[1 1 1 1 1 2]の行(上から7番目の行)に×があって上下2つにわかれている。上部は6マスあり、ここに[4]が来る可能性がある。一方下部は8マスあり、[4]と[3]が両方塗られる可能性がある。なので、現時点ではどちらが塗られるべきマスか確定しないのだが、とりあえず仮定して塗ってみる (図2、図3)。</p>
<table>
<caption>図2 上6マスに[4]が入ると仮定</caption>
<tbody><tr><td><img src="/figure/2009/11/03/b-1.png" alt="" /></td></tr></tbody>
</table>
<table>
<caption>図3 下8マスに[4 3]が入ると仮定</caption>
<tbody><tr><td><img src="/figure/2009/11/03/b-2.png" alt="" /></td></tr></tbody>
</table>
<p>このあと塗りすすめていくと、図3の場合、そのうち破綻してしまう (図4)。</p>
<table>
<caption>図4 図3の状態から論理的に塗りすすめていく</caption>
<tbody><tr><td><img src="/figure/2009/11/03/b-2-1.png" alt="" /></td></tr></tbody>
</table>
<p>たとえば、[2 2 1 2]の行(上から1番目の行)は、×が打たれていないマスが[2 1 2 2]となっていて明らかにうまく塗れない。[2 2 2]の列(左から1番目の列)も、空いた4マスに残った[2 2]を塗るのは不可能だ。</p>
<p>ということで、図2の状態に戻して再び考え始める。とはいっても、[3 2 1]の行(上から4番目の行)と[2 2 2]の列(左から1番目の列)の交点に×をつけられるくらいだ (図5)。</p>
<table>
<caption>図5 図2の状態に戻してまた塗り始める</caption>
<tbody><tr><td><img src="/figure/2009/11/03/b-1-1.png" alt="" /></td></tr></tbody>
</table>
<p>ただ、ここで×がつけられたのが大きい。いま[2 2 2]の列は3つの×で4つに分割されている。連続したマスは最大でも4であり、分割された空間に[2 2]が入ることはない。つまり、分割された4つの連続したマスのうちどれか3つにそれぞれ[2]が塗られることになる。そこで、分割された一番下に注目する。ここは2マスしか空いていないから、ほかの空間が塗られることを仮定するより多くのマスを塗ることができる (図6)。</p>
<table>
<caption>図6 左下隅のタテ2マスが塗られると仮定</caption>
<tbody><tr><td><img src="/figure/2009/11/03/c-1.png" alt="" /></td></tr></tbody>
</table>
<p>はたしてこれが大正解で、ここまでくると正解まで一気に塗り進めることができる (図7)</p>
<table>
<caption>図7 完成</caption>
<tbody><tr><td><img src="/figure/2009/11/03/d.png" alt="" /></td></tr></tbody>
</table>
<p>ということで、解いていく中で仮塗りを2回しないといけなかった。</p>
<p>個人的には、仮塗りをせずに解けるほうがイラストロジックとして完成度が高いと思う。消しゴムなしで解きたい。</p>
			</div>
		</content>
		<category term="イラストロジック"/>
		<category term="ピクロス"/>
		<category term="パズル"/>
		<trackback:ping>http://txqz.net/blog/2009/11/03/2322/tb</trackback:ping>
		<published>2009-11-03T23:22:17+09:00</published>
		<updated>2009-11-04T00:06:30+09:00</updated>
	</entry>
	<entry>
		<title>金やる</title>
		<id>tag:txqz.net,2009-10-25:/blog/2009/10/25/2316</id>
		<link rel="alternate" href="http://txqz.net/blog/2009/10/25/2316"/>
		<summary type="text">金くれについて
軽犯罪法違反だから閉鎖をお薦めしますというメールが来たらしいので、軽犯罪法に問われなくなるソリューションを考えた。
つまり、「金やる」というサービスを開設する。「金やる」は、金をやりたい人がサイトに載っている口座番号に向けて金をやることができる次世代ネット寄付プラットフォームということにする。これなら件のメールをよこした人も大満足だし、昨今上から目線が大人気なので「金やる」なんてサービス名はヒット間違いなし。ほげ。</summary>
		<content type="xhtml">
			<div xmlns="http://www.w3.org/1999/xhtml">
<p><a href="http://kanekure.ssig33.com/" title="金くれ">金くれ</a>について
<a href="http://rikukoike.tumblr.com/post/221551770" title="ssig33 - 愉快なメール来た">軽犯罪法違反だから閉鎖をお薦めしますというメールが来た</a>らしいので、軽犯罪法に問われなくなるソリューションを考えた。</p>
<p>つまり、「金やる」というサービスを開設する。「金やる」は、金をやりたい人がサイトに載っている口座番号に向けて金をやることができる次世代ネット寄付プラットフォームということにする。これなら件のメールをよこした人も大満足だし、昨今上から目線が大人気なので「金やる」なんてサービス名はヒット間違いなし。ほげ。</p>
			</div>
		</content>
		<category term="Webサービス"/>
		<category term="ネタ"/>
		<trackback:ping>http://txqz.net/blog/2009/10/25/2316/tb</trackback:ping>
		<published>2009-12-20T23:33:31+09:00</published>
		<updated>2009-12-20T23:33:31+09:00</updated>
	</entry>
	<entry>
		<title>やっと神保町二郎に行けた</title>
		<id>tag:txqz.net,2009-09-19:/blog/2009/09/19/2212</id>
		<link rel="alternate" href="http://txqz.net/blog/2009/09/19/2212"/>
		<summary type="text">二郎の中でも評判の高い神田神保町店へ行ってきた。開店30分前に着いたのにすでに20人も並んでいて、結局食券を買うまで1時間かかった。いくら土曜の朝だからって人大杉で、それだけ本当に評価が高いのだろう。普段行く桜台駅前店では、もうきつくなってきたので小豚も頼んでいないのだけど、今日はせっかくの機会なので小豚を頼んで、ニンニクマシマシヤサイとした。
まず、なにより豚が柔らかくてかなり美味い! これはすごい。最近桜台では豚の劣化が気になっていて、久しぶりに二郎らしい豚を食べられたと思った。あと、桜台だと ……</summary>
		<content type="xhtml">
			<div xmlns="http://www.w3.org/1999/xhtml">
<p>二郎の中でも評判の高い神田神保町店へ行ってきた。開店30分前に着いたのにすでに20人も並んでいて、結局食券を買うまで1時間かかった。いくら土曜の朝だからって人大杉で、それだけ本当に評価が高いのだろう。普段行く桜台駅前店では、もうきつくなってきたので小豚も頼んでいないのだけど、今日はせっかくの機会なので<a href="http://img.ly/4eE" title="img.ly photo sharing service for twitter">小豚を頼んで、ニンニクマシマシヤサイとした</a>。</p>
<p>まず、なにより豚が柔らかくてかなり美味い! これはすごい。最近桜台では豚の劣化が気になっていて、久しぶりに二郎らしい豚を食べられたと思った。あと、桜台だと客のコールを訊くのは完全に助手の役割になっていて店主はもっぱらラーメン作りだけど、ここは店主に近い客には店主がコールを訊いていたのが好印象だった。もっとも、桜台のイケメン店主に直接訊かれると客としてもすわりが悪いので、そこは店ごとの空気があると思う。</p>
<p>麺は桜台に比べるとやや細めで、カエシが底に沈んでしまっていて上のほうは味があまりなかったけど、本当においしかったし、やっぱり評判通りで来てよかった。店を出ると、行列は大通りの突き当りまで延びていた。どう見ても40人以上いる。さすがにどうかと思った。</p>
<p>二郎はおいしいけどどうみても太るので、せめて隔週にしようとしているのだけど、二郎に行かない週は大に行ってたり、今月はもう3回も行ってしまっている。毒に中っている。それでも3月の健診からは12kg痩せていてやっとBMIが25を切りそうな感じになってきた。バランスを取りつつおいしくいただいていきたい。</p>
			</div>
		</content>
		<category term="ラーメン二郎"/>
		<category term="ラーメン"/>
		<category term="外食"/>
		<category term="食"/>
		<trackback:ping>http://txqz.net/blog/2009/09/19/2212/tb</trackback:ping>
		<published>2009-09-22T23:01:46+09:00</published>
		<updated>2009-09-22T23:01:46+09:00</updated>
	</entry>
	<entry>
		<title>Favotterにcensoredされた</title>
		<id>tag:txqz.net,2009-09-08:/blog/2009/09/08/2350</id>
		<link rel="alternate" href="http://txqz.net/blog/2009/09/08/2350"/>
		<summary type="text">最近Favotterにcensored機能が実装され、Google AdSenseに怒られるような単語が&lt;censored&gt;に置換されて表示されるようになった。私の場合、いわゆる変態クラスタと呼ばれているような方々がなさっているような偽悪的な投稿は行っておらず、このようなフィルタに引っかかるはずはないと思っていたのだが、LLTVのときに投稿した幼女がcensoredされてしまっていたのに気づいた。なんということでしょう。いや、よくよく検索してみたら何度もそういう投稿をしていたのでそういう ……</summary>
		<content type="xhtml">
			<div xmlns="http://www.w3.org/1999/xhtml">
<p>最近<a href="http://favotter.matope.com/" title="ふぁぼったー">Favotter</a>にcensored機能が実装され、Google AdSenseに怒られるような単語が<samp>&lt;censored&gt;</samp>に置換されて表示されるようになった。私の場合、いわゆる変態クラスタと呼ばれているような方々がなさっているような偽悪的な投稿は行っておらず、このようなフィルタに引っかかるはずはないと思っていたのだが、<a href="http://twitter.com/youzaka/status/3623619350" title="Twitter / 陽坂智佐: できますとできませんを言い間違えても幼女だからしかたない">LLTVのときに投稿した<q cite="http://twitter.com/youzaka/status/3623619350" title="Twitter / 陽坂智佐: できますとできませんを言い間違えても幼女だからしかたない">幼女</q></a>が<a href="http://favotter.matope.com/status.php?id=3623619350" title="ふぁぼったー / youzaka : できますとできませんを言い間違えても&lt;censored&gt;だからしかたない">censoredされてしまって</a>いたのに気づいた。なんということでしょう。いや、よくよく検索してみたら<a href="http://favotter.matope.com/search.php?words=%E5%B9%BC%E5%A5%B3&amp;user=youzaka&amp;fav_or_favored=favored" title="ふぁぼったー検索:幼女/ ユーザー:youzaka">何度もそういう投稿をしていた</a>のでそういう投稿をした自分がアレなんだけど、はじめてFavotter上で自分の投稿がcensoredされたのを見て<a href="http://twitter.com/youzaka/status/3840677700" title="Twitter / 陽坂智佐: 私の上品な発言はよもやふぁぼったーでcensored ...">ちょっとショックだった</a>。</p>
<p>ところで、<a href="http://favotter.matope.com/status.php?id=3840677700" title="ふぁぼったー / youzaka : 私の上品な発言はよもやふぁぼったーでcensoredされまいと思っていたが、LLTVのときの「幼女」がcensoredされていた。自分の娘の写真が">件の投稿をふぁぼったーで見る</a>と、「幼女」がcensoredされていません。そりゃあそうですよね。「幼女」がcensoredされたことを嘆いているのに、肝心の「幼女」がcensoredされたらFavotter上で見たときに文意がつかめません。これはふぁぼったーが私のそういう気持ちを酌んでくれている、というわけではなくて<a href="http://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E5%8F%82%E7%85%A7#.E6.95.B0.E5.80.A4.E6.96.87.E5.AD.97.E5.8F.82.E7.85.A7.EF.BC.88.E6.96.87.E5.AD.97.E5.8F.82.E7.85.A7.EF.BC.89" title="文字参照 - Wikipedia">数値文字参照</a>で書き込んだからです。変換には「<a href="http://east.portland.ne.jp/~sigekazu/css/ascii.htm" title="使えない文字">使えない文字</a>」のHTML4文字参照フォームを利用し、これにより「幼女」の数値文字参照である<samp>&amp;#24188;&amp;#22899;</samp>を得ました。この文字列をTwitterに投稿すると、画面上には「幼女」と表示されますが、データとしてはあくまで"&amp;#24188;&amp;#22899;"なので、Favotterの検閲フィルタを突破できたということです。アドセンスの中の人が数値文字参照まで気にするかどうか知りませんが、もし数値文字参照に置換すればオッケーなのだとしたら、機械も人間もWin-Winですね。</p>
<ins class="ps" datetime="2009-12-06T00:27:53+09:00" id="PS1260026873">
<p>ところで、第9回<a href="http://bunfree.net/" title="文学フリマ - 文学フリマ公式サイト-お知らせ">文学フリマ</a>で頒布される<a href="http://tsuyabu.in/2009/12/tsuyabuhou_vol2/" title="つヤ部報vol2の発売迫るっ…！ - つヤ部">『つヤ部報vol2』</a>に、<q cite="http://tsuyabu.in/2009/12/tsuyabuhou_vol2/" title="つヤ部報vol2の発売迫るっ…！ - つヤ部">ふぁぼったー &lt;censored&gt; 徹底解説 ―これが卑猥語フィルタだ― @ono_matope</q>という記事が掲載されているようですね。楽しみです。</p>
</ins>
			</div>
		</content>
		<category term="Favotter"/>
		<category term="Twitter"/>
		<category term="HTML"/>
		<category term="数値文字参照"/>
		<trackback:ping>http://txqz.net/blog/2009/09/08/2350/tb</trackback:ping>
		<published>2009-12-06T00:27:53+09:00</published>
		<updated>2009-12-06T16:00:52+09:00</updated>
	</entry>
	<entry>
		<title>研究室の合宿で全自動メシをクソBotに変換しました</title>
		<id>tag:txqz.net,2009-08-23:/blog/2009/08/23/1812</id>
		<link rel="alternate" href="http://txqz.net/blog/2009/08/23/1812"/>
		<summary type="text">今日まで2日間、研究室の合宿でグランビュー熱海というコンドミニアムで開発合宿をしていた。これがとてもよくて、先生が授業で営業を精力的に行ったためとかでまず女子の割合が高い。そしてご飯が自動的に出てくる。屋上に風呂があって見晴らしがいい。すぐ前が海でリアルが爆発している。そんな中OB共は怠惰な時間をすごしておりまったく救いようがない。
たとえば私などはyozbotというクソみたいなBotを作成するのみで、これは私の今までの投稿をなんかマルコフ連鎖? とかいうので再構築しているもので、ていうかまず実装 ……</summary>
		<content type="xhtml">
			<div xmlns="http://www.w3.org/1999/xhtml">
<p>今日まで2日間、<a href="http://tai.ia.inf.shizuoka.ac.jp/" title="静岡大学情報学部佐藤研究室 - トップページ">研究室</a>の合宿で<a href="http://www.grandview-atami.com/" title="熱海のリゾートコンドミニアム「グランビュー熱海」オーシャンビュー展望風呂と海鮮料理">グランビュー熱海</a>というコンドミニアムで開発合宿をしていた。これがとてもよくて、先生が授業で営業を精力的に行ったためとかでまず女子の割合が高い。そしてご飯が自動的に出てくる。屋上に風呂があって見晴らしがいい。すぐ前が海でリアルが爆発している。そんな中OB共は怠惰な時間をすごしておりまったく救いようがない。</p>
<p>たとえば私などは<a href="http://twitter.com/yozbot" title="yozbot (yozbot) on Twitter">yozbot</a>というクソみたいなBotを作成するのみで、これは私の今までの投稿をなんかマルコフ連鎖? とかいうので再構築しているもので、ていうかまず実装したアルゴリズムがマルコフ連鎖になっているのかも不明で、ただPythonの勉強をしたかっただけだった。</p>
<p>まず、自分のタイムラインは古い分がすでにサーバにあるので、新しい部分を1時間おきくらいにでも取得してくる必要がある。こんな感じ:</p>
<pre><code class="python">#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import MySQLdb
import twitter
import time
import calendar

api = twitter.Api()
statuses = api.GetUserTimeline('youzaka')

def tosqltime(created_at):
    return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(calendar.timegm(time.strptime(created_at, '%a %b %d %H:%M:%S +0000 %Y'))))

data = [(s.id, s.text.encode('utf_8'), tosqltime(s.created_at)) for s in statuses]

con = MySQLdb.connect(db='*****', user='*****', passwd='*****')
cur = con.cursor()

for (id, body, date) in data:
    sql = "insert ignore into tweets(id, body, date, treated) values(%s, %s, %s, 0)"
    cur.execute(sql, (id, body, date))
cur.close()</code></pre>
<p>タイムライン取得APIを叩いて、IDと本文と日付を取得して、それをDBにつっこんでいるだけ。tweetsテーブルのidカラムは主キーになっているので、IGNOREをつけておく。15行目で、取得したtextをそのまま使っていたらDBにつっこむところでUnicodeEncodeErrorが出た。Pythonはここら辺が慣れない。</p>
<p>マルコフ連鎖みたいなのが以下:</p>
<pre><code class="python">#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import MeCab
import MySQLdb
import re
import random

mecab = MeCab.Tagger('-Owakati')
con = MySQLdb.connect(db='*****', user='*****', passwd='*****')
cur = con.cursor()
sql = 'select id, body from tweets where treated = 0'
cur.execute(sql)
rows = cur.fetchall()
id_list = []
markov = {}

for row in rows:
    id_list.append(row[0])
    body = row[1]
    first = ""
    second = ""
    body = re.sub('https?://[^ ]+', '', body)

    if body == '':
        continue;

    parsed = mecab.parse(body.rstrip()).split(' ')
    parsed.insert(0, '[start]')
    parsed[-1] = '[end]'
    for third in parsed:
        if first and second:
            if (first, second) not in markov:
                markov[(first, second)] = []
            markov[(first, second)].append(third)
        first, second = second, third
cur.close()

cur = con.cursor()
for (first, second), list in markov.items():
    for third in list:
        sql = "insert into markov(first, second, third) values(%s, %s, %s)"
        cur.execute(sql, (first, second, third))
cur.close()

cur = con.cursor()
for id in id_list:
    sql = "update tweets set treated = 1 where id = %s"
    cur.execute(sql, id)
cur.close()</code></pre>
<p>取得したTwitterの書き込みのうち未処理のものについて、URLを削除してMecabに投げて形態素の配列を取得して、先頭と最後にそれぞれ[start]、[end]のマークをつける。で、どんどんDBに投げていく。たとえば、「研究室の合宿で全自動メシをクソBotに変換しました」を形態素分解すると「研究室」「の」「合宿」「で」「全」「自動」「メシ」「を」「クソ」「Bot」「に」「変換」「し」「まし」「た」となる (デフォルトの辞書の場合) ので、この文章から以下のルールを得られる:</p>
<table>
<thead>
<tr><th>start</th><th>second</th><th>third</th></tr>
</thead>
<tbody>
<tr><td>[start]</td><td>研究</td><td>室</td></tr>
<tr><td>研究</td><td>室</td><td>の</td></tr>
<tr><td>室</td><td>の</td><td>合宿</td></tr>
<tr><td>の</td><td>合宿</td><td>で</td></tr>
<tr><td>合宿</td><td>で</td><td>全</td></tr>
<tr><td>で</td><td>全</td><td>自動</td></tr>
<tr><td>全</td><td>自動</td><td>メシ</td></tr>
<tr><td>自動</td><td>メシ</td><td>を</td></tr>
<tr><td>メシ</td><td>を</td><td>クソ</td></tr>
<tr><td>を</td><td>クソ</td><td>Bot</td></tr>
<tr><td>クソ</td><td>Bot</td><td>に</td></tr>
<tr><td>Bot</td><td>に</td><td>変換</td></tr>
<tr><td>に</td><td>変換</td><td>し</td></tr>
<tr><td>変換</td><td>し</td><td>まし</td></tr>
<tr><td>し</td><td>まし</td><td>た</td></tr>
<tr><td>まし</td><td>た</td><td>[end]</td></tr>
</tbody>
</table>
<p>このルールから文章を作成してTwitterに投げるところはこんな感じ:</p>
<pre><code class="python">#!/usr/local/bin/python
# -*- coding: utf-8 -*-

import MySQLdb
import re
import twitter

con = MySQLdb.connect(db='*****', user='*****', passwd='*****')
cur = con.cursor()
sql = "select second, third from markov where first='[start]' order by rand() limit 1"
cur.execute(sql)
row = cur.fetchone()

first = row[0]
second = row[1]
cur.close()

if re.search('[a-zA-Z]$', first) and re.search('^[a-zA-Z]', second):
    text = first + ' ' + second
else:
    text = first + second

while True:
    cur = con.cursor()
    sql = "select third from markov where first = %s and second = %s order by rand() limit 1"
    cur.execute(sql, (first, second))
    row = cur.fetchone()
    first, second = second, row[0]

    if second == '[end]':
        break

    if re.search('[a-zA-Z]$', text) and re.search('^[a-zA-Z]', second):
        text = text + ' ' + second
    else:
        text += second

api = twitter.Api('yozbot', '*****')
api.PostUpdate(text.decode('utf_8'))</code></pre>
<p>まず、最初の2語をランダムに選んで、その2語から次の単語をランダムに繋げていって、[end]が出たら終わりという単純なもの。次の単語を選ぶのに前の2語を使っているので、バリエーションの少ない組み合わせだと<a href="http://twitter.com/yozbot/status/4143245789" title="Twitter / yozbot: 北大クラスタ爆発しろ">そのままもとの投稿が出力されるということ</a>もありえて、そこらへんは調整したい。「北大」→「クラスタ」の連なりが1例しかなかったので、「北大」が選択された場合は100%「北大クラスタ爆発しろ」になってしまう。</p>
<table>
<thead>
<tr><th>first</th><th>second</th><th>third</th></tr>
</thead>
<tbody>
<tr><td>むしろ</td><td>クラスタ</td><td>内</td></tr>
<tr><td>特定</td><td>クラスタ</td><td>民</td></tr>
<tr><td>所属</td><td>クラスタ</td><td>以外</td></tr>
<tr><td>所属</td><td>クラスタ</td><td>ごと</td></tr>
<tr><td>から</td><td>クラスタ</td><td>臭</td></tr>
<tr><td>操作</td><td>クラスタ</td><td>[end]</td></tr>
<tr><td>関東</td><td>クラスタ</td><td>は</td></tr>
<tr><td>関東</td><td>クラスタ</td><td>と</td></tr>
<tr><td>て</td><td>クラスタ</td><td>解説</td></tr>
<tr><td>塚</td><td>クラスタ</td><td>の</td></tr>
<tr><td>北大</td><td>クラスタ</td><td>爆発</td></tr>
<tr><td>「</td><td>クラスタ</td><td>間</td></tr>
<tr><td>、</td><td>クラスタ</td><td>が</td></tr>
<tr><td>、</td><td>クラスタ</td><td>別</td></tr>
<tr><td>筑波大</td><td>クラスタ</td><td>に</td></tr>
<tr><td>筑波大</td><td>クラスタ</td><td>よく</td></tr>
<tr><td>ない</td><td>クラスタ</td><td>乙</td></tr>
<tr><td>の</td><td>クラスタ</td><td>の</td></tr>
<tr><td>大</td><td>クラスタ</td><td>より</td></tr>
<tr><td>大</td><td>クラスタ</td><td>っぽい</td></tr>
<tr><td>大</td><td>クラスタ</td><td>の</td></tr>
<tr><td>大</td><td>クラスタ</td><td>の</td></tr>
<tr><td>大</td><td>クラスタ</td><td>」</td></tr>
<tr><td>大</td><td>クラスタ</td><td>の</td></tr>
<tr><td>た</td><td>クラスタ</td><td>に</td></tr>
<tr><td>会話</td><td>クラスタ</td><td>と</td></tr>
<tr><td>で</td><td>クラスタ</td><td>内</td></tr>
<tr><td>京大</td><td>クラスタ</td><td>の</td></tr>
<tr><td>別</td><td>クラスタ</td><td>で</td></tr>
<tr><td>働く</td><td>クラスタ</td><td>甲</td></tr>
<tr><td>高専</td><td>クラスタ</td><td>?</td></tr>
<tr><td>新人</td><td>クラスタ</td><td>が</td></tr>
</tbody>
</table>
<p>これ、「大」→「クラスタ」ってなっているもののほとんどが「静大クラスタ」だったはずで、「京大」「北大」はあるのに「静大」はなくて辞書漏れ悲しいですという話ですね。</p>

			</div>
		</content>
		<category term="ポリタンク"/>
		<category term="Python"/>
		<category term="Twitter"/>
		<category term="Bot"/>
		<category term="自然言語処理"/>
		<trackback:ping>http://txqz.net/blog/2009/08/23/1812/tb</trackback:ping>
		<published>2009-09-22T22:58:13+09:00</published>
		<updated>2009-09-22T22:59:28+09:00</updated>
	</entry>
	<entry>
		<title>牛丼キングを食べに行った</title>
		<id>tag:txqz.net,2009-08-12:/blog/2009/08/12/2250</id>
		<link rel="alternate" href="http://txqz.net/blog/2009/08/12/2250"/>
		<summary type="text">噂の牛丼キングを食べに新宿南口のすき家へ行った。新宿駅の南口から出てすき家までの道中に吉野家が2軒もあったのが印象的だった。ていうか「牛丼キングを食べに行く会」ということで3人で行ったはずなのに、結局牛丼キングを頼んだのが私だけだったのがちょっとアレだった。

量はメガ牛丼の2倍、並の6倍ということで、普通に半分まで食べた時点でお腹一杯だし、これ以上同じ味というのもきついという感じになったけど、ご飯はこれを残してはならないと育てられたのでがんばって完食した。食器を下げに来た店員が空の丼を見て笑っ ……</summary>
		<content type="xhtml">
			<div xmlns="http://www.w3.org/1999/xhtml">
<p>噂の<a href="http://gigazine.net/index.php?/news/comments/20090812_gyudon_king_review/" title="肉が通常の6倍もある「牛丼キング」、極小サイズの「プチ牛丼」、その他含めてすき家牛丼シリーズ全8サイズを食べ比べてみた - GIGAZINE">牛丼キング</a>を食べに新宿南口のすき家へ行った。新宿駅の南口から出てすき家までの道中に吉野家が2軒もあったのが印象的だった。ていうか「牛丼キングを食べに行く会」ということで3人で行ったはずなのに、結局牛丼キングを頼んだのが私だけだったのがちょっとアレだった。</p>
<p><img src="/figure/2009/08/12/a" alt="" /></p>
<p>量はメガ牛丼の2倍、並の6倍ということで、普通に半分まで食べた時点でお腹一杯だし、これ以上同じ味というのもきついという感じになったけど、ご飯はこれを残してはならないと育てられたので<a href="http://www.bcphotoshare.com/photos/507982/1557863" title="ごちそうさまでした - Big Canvas PhotoShare">がんばって完食した</a>。食器を下げに来た店員が空の丼を見て笑っていたのがアレだった。よもや完食しまいと思っていたな。</p>
<p>関係ないんだけど、近所のラーメン大は野菜の量が「少し多め」、「多め」、「増し」などとあって「マシマシ」は明示されていない。<a href="http://img.ly/3xK" title="img.ly photo sharing service for twitter">増しでも二郎のそれより十分多い</a>のだけど、マシマシにすると野菜がこれの2倍来る。当然同じ丼には乗らないので、ラーメン+増し分の野菜が乗ったものと野菜だけが乗ったものの2つが供される。あのときは、店員から何も知らずに二郎のつもりでマシマシを頼みやがってという空気を感じたので、当然のように全部食べた。残したら負けだし、そしたら恥ずかしくて大に行けなくなってしまう。隣の人は、メニューにあるのはあくまで「増し」までなので「増し」を頼むとああなるのかと勘違いしたみたいで「少し多め」にしていた。すみません。二郎に比べて丼が小さいし麺も細いので、意外と無理なレベルではない。さすがに<a href="http://www.geocities.jp/zzr_1100c22004/contents_terameshi_club_92.html" title="一期一食・テラめし倶楽部（バトル92・昴神角ふじ）">昴神角ふじの野菜本増し</a>とか<a href="http://www.geocities.jp/zzr_1100c22004/contents_terameshi_club_202.html" title="一期一食・テラめし倶楽部（バトル202・麺香房暖々）">麺香房暖々の野菜多め</a>のレベルになるとごめんなさいだけど。</p>
			</div>
		</content>
		<category term="すき家"/>
		<category term="牛丼"/>
		<category term="食"/>
		<category term="外食"/>
		<trackback:ping>http://txqz.net/blog/2009/08/12/2250/tb</trackback:ping>
		<published>2009-09-22T23:07:12+09:00</published>
		<updated>2009-09-22T23:10:50+09:00</updated>
	</entry>
	<entry>
		<title>光が丘公園でジョギングしている</title>
		<id>tag:txqz.net,2009-06-13:/blog/2009/06/13/1902</id>
		<link rel="alternate" href="http://txqz.net/blog/2009/06/13/1902"/>
		<summary type="text">最近は週末に光が丘公園のジョギングコースでジョギングするようにしている。だいたい3kmのコースになっていて、ヘタレなので20分弱で1周して40分強休憩するみたいなペースで3周くらい走って帰る感じ。コースは緑が豊かで、走っていて気持ちいい。途中バーベキュー場の横を通るところがあって、そこに差し掛かると心が折れそうになる。
</summary>
		<content type="xhtml">
			<div xmlns="http://www.w3.org/1999/xhtml">
<p>最近は週末に<a href="http://www.tokyo-park.or.jp/park/format/index023.html" title="光が丘公園｜公園へ行こう！">光が丘公園</a>の<a href="http://www.horae.dti.ne.jp/~s-o/run/h/hikarigaoka.html" title="都立光が丘公園ジョギングコース">ジョギングコース</a>でジョギングするようにしている。だいたい3kmのコースになっていて、ヘタレなので20分弱で1周して40分強休憩するみたいなペースで3周くらい走って帰る感じ。コースは緑が豊かで、走っていて気持ちいい。途中バーベキュー場の横を通るところがあって、そこに差し掛かると心が折れそうになる。</p>
<p><img src="/figure/2009/06/13/a" alt="" /><img src="/figure/2009/06/13/b" alt="" /></p>
			</div>
		</content>
		<category term="公園"/>
		<category term="写真"/>
		<category term="ジョギング"/>
		<category term="健康"/>
		<trackback:ping>http://txqz.net/blog/2009/06/13/1902/tb</trackback:ping>
		<published>2009-09-22T23:06:20+09:00</published>
		<updated>2009-09-22T23:47:38+09:00</updated>
	</entry>
	<entry>
		<title>行列をスキップできる権利</title>
		<id>tag:txqz.net,2009-06-08:/blog/2009/06/08/2145</id>
		<link rel="alternate" href="http://txqz.net/blog/2009/06/08/2145"/>
		<summary type="text">らーめん大練馬店が開店して、通常600円のラーメンが100円で食べられるとのことでアホみたいな行列になっている。開店直後でも80人以上並んでいたりする。そりゃ100円は安いけど、高々500円引きですよ。吉野家コピペでは150円引きのために普段来ていない吉野家に家族連れで来ている半可通が揶揄されているが、500円のために数時間並ぶというのも同様に揶揄されてしかるべきだ。
たとえば、行列をスキップしていきなり専用席に座れる権利を500円で用意して、最後尾グループに数枚配布するとする。この権利は自由に売 ……</summary>
		<content type="xhtml">
			<div xmlns="http://www.w3.org/1999/xhtml">
<p><a href="http://ramendb.supleks.jp/shop/20843" title="らーめん大 練馬店 | ラーメンデータベース">らーめん大練馬店</a>が開店して、通常600円のラーメンが100円で食べられるとのことでアホみたいな行列になっている。開店直後でも80人以上並んでいたりする。そりゃ100円は安いけど、高々500円引きですよ。吉野家コピペでは150円引きのために普段来ていない吉野家に家族連れで来ている半可通が揶揄されているが、500円のために数時間並ぶというのも同様に揶揄されてしかるべきだ。</p>
<p>たとえば、行列をスキップしていきなり専用席に座れる権利を500円で用意して、最後尾グループに数枚配布するとする。この権利は自由に売買できて、値段も自由に決められるとする。どう値段が変化してどう売買されるのだろうか。</p>
<p>まず、このチケットを受け取った人は、そもそもラーメンを食べに来ているので早速権利を行使するだろう。しかし、周りの人も同じくラーメンが食べたいはずなので、もしかしたら600円とか1000円とかで買いたいと思うかもしれない。でも良く考えるとそれ買っちゃうと定価より高いし、かといって何時間も並ぶのやだし…みたいな葛藤が飛び交うようになって、観察する分にはおもしろいかもしれない。そこから適切な値段とかも見えてくるだろうしね。実際どうなるんだろう。</p>
			</div>
		</content>
		<category term="らーめん大"/>
		<category term="考察"/>
		<category term="練馬"/>
		<category term="市場"/>
		<trackback:ping>http://txqz.net/blog/2009/06/08/2145/tb</trackback:ping>
		<published>2009-09-22T23:06:52+09:00</published>
		<updated>2009-09-22T23:06:52+09:00</updated>
	</entry>
	<entry>
		<title>普通にphp-mysqliを使ってCRUDするコード例</title>
		<id>tag:txqz.net,2009-06-04:/blog/2009/06/04/0102</id>
		<link rel="alternate" href="http://txqz.net/blog/2009/06/04/0102"/>
		<summary type="text">普通にMysqliを使ってみます。特別なネタがあるわけではありません。リファレンスが分かりにくいという声を近くで聞いたので、まあだいたいこんな風にすれば良いんじゃない? というのをメモとして残しておきます。
個人ユースのデータベースといえばやはり住所録ということで、これにデータを出し入れする部分だけMysqliを使って書いてみます。住所録のデータスキームはこんな感じ:
create table addresses(
    id int unsigned not null primary ke ……</summary>
		<content type="xhtml">
			<div xmlns="http://www.w3.org/1999/xhtml">
<p>普通に<a href="http://www.php.net/manual/ja/book.mysqli.php" title="PHP: Mysqli - Manual">Mysqli</a>を使ってみます。特別なネタがあるわけではありません。リファレンスが分かりにくいという声を近くで聞いたので、まあだいたいこんな風にすれば良いんじゃない? というのをメモとして残しておきます。</p>
<p>個人ユースのデータベースといえばやはり住所録ということで、これにデータを出し入れする部分だけMysqliを使って書いてみます。住所録のデータスキームはこんな感じ:</p>
<pre><code class="sql">create table addresses(
    id int unsigned not null primary key auto_increment,
    name varchar(32) not null,
    kana varchar(64) not null,
    zipcode char(8) not null,
    address1 varchar(64) not null,
    address2 varchar(64) not null,
    tel char(13) not null,
    email varchar(255) not null,
    index(kana)
);</code></pre>
<p>IDを指定してデータを取得する関数は、だいたいこんな感じに書ける (実際はもっとまじめにエラー処理とかすべき):</p>
<pre><code class="php">// インスタンス変数として$con = new Mysqli("ホスト名", "ユーザ名", "パスワード", "データベース名");が存在することを前提としている。以下同様
function getAddressById($id) {
    $result = array();
    $sql = "select name, kana, zipcode, address1, address2, tel, email from addresses where id = ?";
    $stmt = $this->con->prepare($sql);
    $stmt->bind_param("i", $id);
    $stmt->execute();
    $stmt->bind_result($name, $kana, $zipcode, $address1, $address2, $tel, $email);
    if($stmt->fetch()) {
        $result = compact("id", "name", "kana", "zipcode", "address1", "address2", "tel", "email");
    }
    $stmt->close();
    return $result;
}</code></pre>
<p>1ページに20件表示させるとして、その20件分を持ってくる関数はこんな感じに書ける:</p>
<pre><code class="php">// $page: ページ数。最初のページは1
function getAddresses($page, $limit = 20) {
    $result = array();
    $sql = "select id, name, kana, zipcode, address1, address2, tel, email from addresses order by kana limit ?, ?";
    $offset = ($page - 1) * $limit;
    $stmt = $this->con->prepare($sql);
    $stmt->bind_param("ii", $offset, $limit);
    $stmt->execute();
    $stmt->bind_result($id, $name, $kana, $zipcode, $address1, $address2, $tel, $email);
    while($stmt->fetch()) {
        $result[] = compact("id", "name", "kana", "zipcode", "address1", "address2", "tel", "email");
    }
    $stmt->close();
    return $result;
}</code></pre>
<p>指定したカナに前方一致するものを取得したいならこんな感じ:</p>
<pre><code class="php">function getAddressesByKana($kana, $page, $limit = 20) {
    $result = array();
    $sql = "select id, name, kana, zipcode, address1, address2, tel, email from addresses where kana like ? order by kana limit ?, ?";
    $offset = ($page - 1) * $limit;
    $like = "{$kana}%";
    $stmt = $this->con->prepare($sql);
    $stmt->bind_param("sii", $like, $offset, $limit);
    $stmt->execute();
    $stmt->bind_result($id, $name, $kana, $zipcode, $address1, $address2, $tel, $email);
    while($stmt->fetch()) {
        $result[] = compact("id", "name", "kana", "zipcode", "address1", "address2", "tel", "email");
    }
    $stmt->close();
    return $result;
}</code></pre>
<p>新しいエントリを挿入するのはこんな感じ:</p>
<pre><code class="php">// $addressはnameやkanaなどのキーがある連想配列
function insert($address) {
    $result = 0;
    $sql = "insert into addresses(name, kana, zipcode, address1, address2, tel, email) values(?,?,?,?,?,?,?)";
    $stmt = $this->con->prepare($sql);
    $stmt->bind_param("sssssss", $name, $kana, $zipcode, $address1, $address2, $tel, $email);
    extract($address, EXTR_OVERWRITE);
    $stmt->execute();
    $result = $this->con->insert_id;
    $stmt->close();
    return $result;
}</code></pre>
<p>まとめて挿入するなら:</p>
<pre><code class="php">// $addressesはnameやkanaなどのキーがある連想配列の配列
function insertAll($addresses) {
    $result = array();
    $sql = "insert into addresses(name, kana, zipcode, address1, address2, tel, email) values(?,?,?,?,?,?,?)";
    $stmt = $this->con->prepare($sql);
    $stmt->bind_param("sssssss", $name, $kana, $zipcode, $address1, $address2, $tel, $email);
    foreach($addresses as $address) {
        extract($address, EXTR_OVERWRITE);
        $stmt->execute();
        $result[] = $this->con->insert_id;
    }
    $stmt->close();
    return $result;
}</code></pre>
<p>更新するなら:</p>
<pre><code class="php">function update($address) {
    $sql = "update addresses set name = ?, kana = ?, zipcode = ?, address1 = ?, address2 = ?, tel = ?, email = ? where id = ?";
    $stmt = $this->con->prepare($sql);
    $stmt->bind_param("sssssssi", $name, $kana, $zipcode, $address1, $address2, $tel, $email, $id);
    extract($address, EXTR_OVERWRITE);
    $stmt->execute();
    $stmt->close();
}</code></pre>
<p>ついでに削除:</p>
<pre><code class="php">function delete($id) {
    $sql = "delete from addresses where id = ?";
    $stmt = $this->con->prepare($sql);
    $stmt->bind_param("i", $id);
    $stmt->execute();
    $stmt->close();
}

function deleteAll($id_list) {
    $sql = "delete from addresses where id = ?";
    $stmt = $this->con->prepare($sql);
    $stmt->bind_param("i", $id);
    foreach($id_list as $id) {
        $stmt->execute();
    }
    $stmt->close();
}</code></pre>
<p>実際はフレームワークとかでささっとやってしまう部分かもしれませんが、あえてフルスクラッチするならこんな感じでしょうか。</p>
			</div>
		</content>
		<category term="php"/>
		<category term="mysql"/>
		<category term="mysqli"/>
		<category term="プログラミング"/>
		<category term="データベース"/>
		<trackback:ping>http://txqz.net/blog/2009/06/04/0102/tb</trackback:ping>
		<published>2009-06-04T01:02:31+09:00</published>
		<updated>2009-06-04T01:02:31+09:00</updated>
	</entry>
	<entry>
		<title>Yahoo Widgetで発車時刻表ウィジェットを作ってみた</title>
		<id>tag:txqz.net,2009-05-21:/blog/2009/05/21/0725</id>
		<link rel="alternate" href="http://txqz.net/blog/2009/05/21/0725"/>
		<summary type="text">最近まわりでYahoo!ウィジェットで何か作るのがブームなので、私もそれに乗って作ってみた。id:n_shuyoやid:BigFatCat、id:ksmemoの各氏によるメモを見ればだいたい分かる感じ。関係ないけどはてなダイアリーってこういう検索結果を日時の昇順で見ることはできないのだろうか。
XMLでUI仕様を書いて、動作をJavaScriptで書いていく。デバッガがついているので、まあそれで試行錯誤していけばいいのかも。JavaScriptは仕様と違う動作が行われるとかはないけど、Window ……</summary>
		<content type="xhtml">
			<div xmlns="http://www.w3.org/1999/xhtml">
<p>最近まわりで<a href="http://widgets.yahoo.co.jp/" title="Yahoo!ウィジェット">Yahoo!ウィジェット</a>で何か作るのがブームなので、私もそれに乗って作ってみた。<a href="http://d.hatena.ne.jp/n_shuyo/searchdiary?word=Yahoo%21%a5%a6%a5%a3%a5%b8%a5%a7%a5%c3%a5%c8%20%a4%ce%ba%ee%a4%ea%ca%fd" title="「Yahoo!ウィジェット の作り方」の検索結果 - Mi manca qualche giovedi`?">id:n_shuyo</a>や<a href="http://d.hatena.ne.jp/BigFatCat/20080420/1208706858" title="Yahoo!ウィジェット で Yahooウェブ検索Webサービスを使う - 英語とプログラミング気まぐれ日記">id:BigFatCat</a>、<a href="http://d.hatena.ne.jp/ksmemo/searchdiary?word=%A4%CF%A4%B8%A4%E1%A4%C6%A4%CEYahoo%21+Widget" title="「はじめてのYahoo! Widget」の検索結果 - ケーズメモ">id:ksmemo</a>の各氏によるメモを見ればだいたい分かる感じ。関係ないけどはてなダイアリーってこういう検索結果を日時の昇順で見ることはできないのだろうか。</p>
<p>XMLでUI仕様を書いて、動作をJavaScriptで書いていく。デバッガがついているので、まあそれで試行錯誤していけばいいのかも。JavaScriptは仕様と違う動作が行われるとかはないけど、WindowsオブジェクトがなくてsetTimeoutとかができないので、自動に表示が変わるみたいなのをするには<a href="http://d.hatena.ne.jp/n_shuyo/20070501/widgets" title="Yahoo!ウィジェット の作り方 (4) - インターバルとアニメーション - Mi manca qualche giovedi`?">一手間</a>必要。あと<a href="http://i.yimg.jp/images/widgets/data/workshop/WidgetEngineReference_4.5.0.pdf">リファレンス</a>が大量すぎて読み通す気力が起きなかったり<a href="http://i.yimg.jp/images/widgets/data/workshop/Widget_Creation_Tutorial.pdf">チュートリアル</a>と違うことが書いてあったりするけど、そこはがんばる。</p>
<p>で、せっかくのWidgetで、やっぱWidgetといえば画面常駐がキモで、ブラウザを開いてみればいいようなものはなるべく避けたい。あとインターネットとやりとりできるのを活かしたい。たとえば、書いた文書が(明示的にEnterなどを押さなくても)そのままインターネットに大公開されるようなテキストエディタだかWikiクライアントだかわからないようなものなどはぜひこのYahoo Widgetで作るべきだろう。しかし、今回は諸般の事情でPOSTできるようなものは歓迎されないので、GETに徹したものを作ることにする。</p>
<p>ということで、<a href="http://transit.goo.ne.jp/" title="乗換案内 時刻表 - goo 路線">goo時刻表</a>をスクレイピングして<a href="/test/traindeps.zip">現在の発車時刻表をそれっぽく表示するウィジェット</a> (拡張子を.widgetに変えてウィジェットエンジンにつっこめば動くはず) を作った。画面イメージは以下のような感じ:</p>
<p><img src="/figure/2009/05/21/traindeps" alt="" /></p>
<p>駅名を入力して路線と方面を選ぶと、右側に現時点での発車時刻が表示される。表示は1分毎に自動的にリロードされる。できれば運行情報が下のほうでスクロールしていたりパタパタみたいなエフェクトをかけたかったけどそこまでできなかった。あと、左ペインがマウスホイールでスクロールしてほしかったんだけど、なぜかそれもできなかった。将来的にこれのiPhone版も作りたい。</p>
<h3>ソース</h3>
<h4>traindeps.kon</h4>
<pre><code class="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;widget minimumVersion="4.0"&gt;
    &lt;settings&gt;
        &lt;setting name="debug" value="off" /&gt;
    &lt;/settings&gt;
    &lt;window name="main" width="180" height="30" style="background:#333;"&gt;
        &lt;title&gt;時刻表表示機&lt;/title&gt;
        &lt;text name="label" color="#fff" alignment="left" style="font-size:12px"&gt;
            &lt;hOffset&gt;10&lt;/hOffset&gt;
            &lt;vOffset&gt;20&lt;/vOffset&gt;
            &lt;data&gt;駅名&lt;/data&gt;
        &lt;/text&gt;
        &lt;textarea name="data" columns="14" lines="1" style="background:#fff;color:#999"&gt;
            &lt;hOffset&gt;40&lt;/hOffset&gt;
            &lt;vOffset&gt;7&lt;/vOffset&gt;
            &lt;data&gt;駅名を入力してください&lt;/data&gt;
        &lt;/textarea&gt;
        &lt;frame name="mframe" width="150" height="115" vLineSize="10" vScrollBar="mainv"&gt;
            &lt;hOffset&gt;7&lt;/hOffset&gt;
            &lt;vOffset&gt;30&lt;/vOffset&gt;
            &lt;vScrollBar&gt;mainv&lt;/vScrollBar&gt;
        &lt;/frame&gt;
        &lt;scrollbar name="mainv" height="115" width="15" autoHide="true" thumbcolor="#f00"&gt;
            &lt;hOffset&gt;160&lt;/hOffset&gt;
            &lt;vOffset&gt;30&lt;/vOffset&gt;
        &lt;/scrollbar&gt;
        &lt;text name="disptime" color="#fff"&gt;
            &lt;hOffset&gt;200&lt;/hOffset&gt;
            &lt;vOffset&gt;20&lt;/vOffset&gt;
            &lt;data&gt;&lt;/data&gt;
        &lt;/text&gt;
        &lt;text name="time" color="#fff" alignment="left" style="font-size:12px"&gt;
            &lt;hOffset&gt;200&lt;/hOffset&gt;
            &lt;vOffset&gt;45&lt;/vOffset&gt;
            &lt;data&gt;発車&lt;/data&gt;
        &lt;/text&gt;
        &lt;text name="type" color="#fff" alignment="left" style="font-size:12px"&gt;
            &lt;hOffset&gt;240&lt;/hOffset&gt;
            &lt;vOffset&gt;45&lt;/vOffset&gt;
            &lt;data&gt;種別&lt;/data&gt;
        &lt;/text&gt;
        &lt;text name="deps" color="#fff" alignment="left" style="font-size:12px"&gt;
            &lt;hOffset&gt;300&lt;/hOffset&gt;
            &lt;vOffset&gt;45&lt;/vOffset&gt;
            &lt;data&gt;行先&lt;/data&gt;
        &lt;/text&gt;
        &lt;frame name="tframe" width="300" height="120"&gt;
            &lt;hOffset&gt;200&lt;/hOffset&gt;
            &lt;vOffset&gt;55&lt;/vOffset&gt;
            &lt;text name="status" color="#fc0"&gt;
                &lt;hOffset&gt;0&lt;/hOffset&gt;
                &lt;vOffset&gt;15&lt;/vOffset&gt;
                &lt;data&gt;&lt;/data&gt;
            &lt;/text&gt;
        &lt;/frame&gt;
        
        &lt;script src="traindeps.js" charset="UTF-8" /&gt;
    &lt;/window&gt;
&lt;/widget&gt;</code></pre>
<h4>traindeps.js</h4>
<p>hogeという名前の関数オブジェクトがあったりしてひどい。</p>
<pre><code class="javascript">(function() {
items = {};
deps = {};
types = {};
prev = "";
done = false;

var reset = function() {
    items = {};
    deps = {};
    types = {};
    prev = "";
    done = false;
    main.width = 180;
}
var display = function(count) {
    if(done) {
        main.width = 450;
        
        var now = new Date();
        var hour = now.getHours() &lt; 3 ? now.getHours() + 24 : now.getHours();
        var minute = now.getMinutes();
        var current = (hour &lt; 10 ? "0"+hour : hour) + "" + (minute &lt; 10 ? "0"+minute : minute);
        if(current == prev) return;
        
        disptime.data = hour+"時"+minute+"分現在";
        if(tframe.hasChildNodes()) {
            var children = tframe.subviews;
            for(i=0; i&lt;children.length; i++) {
                tframe.removeChild(children[i]);
            }
        }
        var i = 0;
        var v = 15;
        var tomorrow = false;
        for(var j in items) {
            
            if(j &lt; current &amp;&amp; !tomorrow){
                delete items[j];
            } else {
                tomorrow = true;
                var line_time = new Text();
                line_time.hOffset = 0;
                line_time.vOffset = v;
                line_time.color = "#ffcc00";
                
                line_time.data = j.substr(0,2)+":"+j.substr(2,2);
                tframe.addSubview(line_time);
                
                var type = "普通";
                if(items[j].type in types) type = types[items[j].type];
                var line_type = new Text();
                line_type.hOffset = 40;
                line_type.vOffset = v;
                line_type.data = type;
                
                if(type.indexOf('特') &gt; -1 || type.indexOf("ラ") &gt; -1)
                    line_type.color = "#ff9999";
                else if(type.indexOf("準") &gt; -1)
                    line_type.color = "#ccff99";
                else if(type.indexOf("区") &gt; -1)
                    line_type.color = "#99ff99";
                else if(type.indexOf("勤") &gt; -1)
                    line_type.color = "#99ffff";
                else if(type.indexOf("新") &gt; -1)
                    line_type.color = "#ffcccc";
                else if(type.indexOf("快") &gt; -1)
                    line_type.color = "#cc99ff";
                else if(type.indexOf("急") &gt; -1)
                    line_type.color = "#9999ff";
                else line_type.color = "#ffcc00";
                
                tframe.addSubview(line_type);
                
                var line_deps = new Text();
                line_deps.hOffset = 100;
                line_deps.vOffset = v;
                line_deps.data = (deps[items[j].dep] || items[j].dep);
                line_deps.color = "#ffcc00";
                tframe.addSubview(line_deps);
                
                var line = j + " " + (deps[items[j].dep] || items[j].dep);
                if(items[j].type in types)
                    line += (" " + types[items[j].type]);
                //print(line);
                i++;
                v += 15;
            }
            if(i == count) break;
        }
        if(v == 15) {
            var status = new Text();
            status.color = "#ffcc00";
            status.data = "本日の運行は終了しました。";
            status.hOffset = 0;
            status.vOffset = v;
            tframe.addSubview(status);
        }
        prev = current;
    }
}
var setTimeout = function(func, delay) {
    var timer = new Timer();
    timer.interval = delay / 1000;
    timer.onTimerFired = function() {
        if((typeof func) == "function")
            func();
    else eval(func);
    }
    timer.ticking = true;
    return timer;
}

var timer3 = setTimeout("display(5)", 1000);

data.onGainFocus = function() {
    this.data = "";
    this.style.color = "#000";
};

var clearInterval = function(timer) {
    timer.ticking = false;
}
var getTimetable = function(path) {
    reset();
    var url = "http://transit.goo.ne.jp" + path;
    
    if(!done) {
        var req = new XMLHttpRequest();
        main.width = 450;
        
        if(tframe.hasChildNodes()) {
            var children = tframe.subviews;
            for(i=0; i&lt;children.length; i++) {
                tframe.removeChild(children[i]);
            }
        }
        
        status.data = "データ取得中";
        status.color = "#ffcc00";
        tframe.addSubview(status);
        disptime.data = "  時  分現在";
        
        req.onreadystatechange = function() {
            if(this.readyState == 4) {
                var text = req.responseText;
                var hour;
                var tags = text.match(/&lt;li&gt;&lt;font[\s\S]+?&lt;\/li&gt;|&lt;th&gt;\s*\d+\s*&lt;\/th&gt;|&lt;div class="fs12"&gt;[\s\S]+?&lt;\/div&gt;/g);
                if(tags) {
                    for(var i in tags) {
                        var each = tags[i].replace(/[ \t\n\r]+/g, "");
                        switch(each[1]) {
                        case 't' :
                            hour = each.match(/&lt;th&gt;\s*(\d+)\s*&lt;\/th&gt;/)[1];
                            hour = hour &lt; 3 ? parseInt(hour) + 24 : hour;
                            //print(hour);
                            if(hour.length == 1) hour = "0"+hour;
                            break;
                        case 'l' :
                            var m = each.match(/&lt;li&gt;&lt;font(color="(.+?)")?&gt;&lt;span&gt;(.+?)&lt;\/span&gt;&lt;\/font&gt;&lt;br&gt;&lt;font.*&gt;(.+?)&lt;\/font&gt;&lt;\/li&gt;/);
                            if(m[4].length == 1) m[4] = "0"+m[4];
                            items[hour+m[4]] = {dep: m[3].replace(/&lt;.+?&gt;/,''), type: m[2]};
                            break;
                        case 'd' :
                            var pair;
                            while((pair = (/&lt;fontcolor="(.+?)"&gt;(.+?)&lt;\/font&gt;/g).exec(each)) != null) {
                                types[pair[1]] = pair[2];
                            }
                            while((pair = (/(\S+?)＝(.+?)行(　|[\r\n]|&lt;)/g).exec(each)) != null) {
                                deps[pair[1]] = pair[2];
                            }
                        }
                    }
                    done = true;
                    display(5);
                } else {
                    status.data = "指定した時刻表データがありませんでした。";
                }
            }
        }
        req.open("GET", url, true);
        req.send();
    }
}
var hoge = function(e, path, i) {
    e.onClick = function() {
        getTimetable(path);
        if(mframe.hasChildNodes()) {
            var children = mframe.subviews;
            for(i=0; i&lt;children.length; i++) {
                if(children[i].hOffset == 15)
                    children[i].color = "#CCCCFF";
            }
            e.color = "#FFCCCC";
        }
    }
}
var searchStation = function() {
    reset();
    main.height = 30;
    if(mframe.hasChildNodes()) {
        var children = mframe.subviews;
        for(i=0; i&lt;children.length; i++) {
            mframe.removeChild(children[i]);
        }
    }
    var url = "http://transit.goo.ne.jp/tconfirm.php?an=7&amp;st_name=" + data.data;
    var req = new XMLHttpRequest();
    req.onreadystatechange = function() {
        if(this.readyState == 4) {
            var text = req.responseText;
            
            var stations = text.match(/&lt;dt&gt;&lt;a href="\/timetable\/.+?"&gt;.+?&lt;\/a&gt;&lt;\/dt&gt;|&lt;span&gt;&lt;a href="\/timetable\/.+?"&gt;\[&amp;nbsp;.+方面&amp;nbsp;\]&lt;\/a&gt;&lt;\/span&gt;/g);
            
            var v = 0;
            for(i = 0; i &lt; stations.length; i++) {
                station = stations[i];
                var line = new Text();
                line.id = "cand"+i;
                
                if(/^&lt;dt&gt;/.test(station)) {
                    line.hOffset = 2;
                    line.color = "#CCCCCC";
                } else {
                    line.hOffset = 15;
                    line.color = "#CCCCFF";
                    var anchor = station.match(/^.+?"(.+?)".+$/)[1];
                    
                    hoge(line, anchor, i);
                }
                line.vOffset = v = (v + 15);
                line.data = stations[i].replace(/&lt;.+?&gt;|[\[\]&amp;nbsp;]/g,'');
                mframe.addSubview(line);
            }
            main.height = 150;
        }
    };
    req.open("GET", url, true);
    req.send();
};

label.onClick = searchStation;
data.onKeyPress = function() {
    if(system.event.keyString == "Return" || system.event.keyString == "Enter") {
        searchStation();
        //getTimetable("");
    }
}
})();</code></pre>

			</div>
		</content>
		<category term="JavaScript"/>
		<category term="ウィジェット"/>
		<category term="時刻表"/>
		<category term="鉄道"/>
		<trackback:ping>http://txqz.net/blog/2009/05/21/0725/tb</trackback:ping>
		<published>2009-09-22T23:00:27+09:00</published>
		<updated>2009-09-22T23:00:27+09:00</updated>
	</entry>
	<entry>
		<title>フォーカスを当てるとデフォルト文字列が消えるinput text (jQuery編)</title>
		<id>tag:txqz.net,2009-05-16:/blog/2009/05/16/2312</id>
		<link rel="alternate" href="http://txqz.net/blog/2009/05/16/2312"/>
		<summary type="text">いろんな文献を気軽に参照しにくい環境になり、いちいち検索しなくてもいいようにここにまとめておきたい感じになったのでしばらくそんな普段書かないようなPOSTばかりします。
まず、最近良くある、デフォルトの状態では入力例を表示して、フォーカスを合わせると消えるというインプットボックスの実装例について。このブログのコメント入力フォームがまさにそんな感じ。

HTML:
&lt;form action="hoge.php" method="get"&gt;
&lt;p&gt;&lt;input t ……</summary>
		<content type="xhtml">
			<div xmlns="http://www.w3.org/1999/xhtml">
<p>いろんな文献を気軽に参照しにくい環境になり、いちいち検索しなくてもいいようにここにまとめておきたい感じになったのでしばらくそんな普段書かないようなPOSTばかりします。</p>
<p>まず、最近良くある、デフォルトの状態では入力例を表示して、フォーカスを合わせると消えるというインプットボックスの実装例について。このブログのコメント入力フォームがまさにそんな感じ。</p>
<dl>
<dt>HTML:</dt>
<dd><pre><code class="html">&lt;form action="hoge.php" method="get"&gt;
&lt;p&gt;&lt;input type="text" name="q" id="q" size="30" value="検索語を入力してください"&gt;&lt;input type="submit" value="検索"&gt;&lt;/p&gt;
&lt;/form&gt;</code></pre></dd>
<dt>JavaScript(jQuery):</dt>
<dd><pre><code class="js">$(function(){
    $("#q").focus(function() {
        if($(this).val() == $(this).attr('defaultValue'))
            $(this).val('');
    }).blur(function() {
        if(jQuery.trim($(this).val()) == "") {
            $(this).val($(this).attr('defaultValue'));
        }
    });
});</code></pre>
<ins class="ps" datetime="2009-05-19T00:19:07+09:00" id="PS1242659947">
<blockquote cite="http://b.hatena.ne.jp/kits/20090518#bookmark-13508664" title="はてなブックマーク - 徒栞">
<p>$(this) を3度実行するのは勿体無いので最初に var $this = $(this) して $this を使い回すとか。/ もしくは if ( this.value == this.defaultValue ) this.value = '' でもよさそう。</p>
</blockquote>
<p>確かに、このthisはわざわざjQueryオブジェクトにしなくても、そのままDOMのプロパティを参照すれば用が足りますね。このネタそのものが、単体だとわざわざjQueryを使うまでもないレベルですけど。</p>
</ins>
</dd>
<dt>実例:</dt>
<dd><script type="text/javascript" src="/scripts/2009/05/16/2312.js"></script>
<form action="http://www.google.co.jp/search" method="get">
<p><input type="text" name="q" id="q" size="30" value="検索語を入力してください" /><input type="submit" value="検索" /></p>
</form></dd>
</dl>
<p>フォーカスがあたったときにvalue属性の値がdefaultvalueだったら消して、逆にフォーカスが外れたときに値が空文字列だったらdefaultvalueを表示するというだけ。このdefaultvalueという属性、どうやら仕様書のいう<a href="http://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html#initial-value">initial value</a>を取得するためにW3C DOMのHTMLInputElementで定義されているもので、ちゃんとW3C DOMを実装しているブラウザならちゃんと使えそう。</p>
<p>デフォルト文字を薄くして実際に入力させるときは黒にしたいというときは、あらかじめCSSで<code class="css">#q{color: #999;}</code>などとした上で、</p>
<pre><code class="js">$(function(){
    $("#q").focus(function() {
        if($(this).val() == $(this).attr('defaultValue'))
            $(this).css('color', '#000').val('');
    }).blur(function() {
        if(jQuery.trim($(this).val()) == "") {
            $(this).css('color', '#999').val($(this).attr('defaultValue'));
        }
    });
});</code></pre>
<p>みたいにしたらいいと思う。</p>
<p>あと、Eventを指定するときに、clickとかkeypressみたいなデバイスに依存するものはなるべく避けてfocusやblurを使うべきだってばっちゃが言ってた。</p>
			</div>
		</content>
		<category term="HTML"/>
		<category term="&lt;input&gt;"/>
		<category term="JavaScript"/>
		<category term="jQuery"/>
		<trackback:ping>http://txqz.net/blog/2009/05/16/2312/tb</trackback:ping>
		<published>2009-05-17T14:45:43+09:00</published>
		<updated>2009-05-19T00:20:27+09:00</updated>
	</entry>
</feed>