tag:blogger.com,1999:blog-90300113266895389422024-03-14T09:11:03.077+09:00もがわのほとり試してみたことをメインに。
検索して来た人の情報になれるように。後で自分が使えるように。caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.comBlogger25125tag:blogger.com,1999:blog-9030011326689538942.post-52680741339017667172009-09-10T19:20:00.000+09:002009-09-10T19:20:03.747+09:00追記: Rainmeterのスキン、10-Foot HUDの天気予報カスタマイズ<a href="http://mogawa.blogspot.com/2008/11/rainmeter10-foot-hud.html#links">もがわのほとり: Rainmeterのスキン、10-Foot HUDの天気予報カスタマイズ</a><div><br /></div><div>天気予報カスタマイズだけど、weather.comのxoapのフォーマットが変わったらしく、しばらく前から表示されなくなってた。</div><div><br /></div><div><div>;URL=http://xoap.weather.com/weather/local/JAXX0004?cc=*&unit=m&dayf=6</div><div>URL=http://xoap.weather.com/weather/local/JAXX0004?cc=*&unit=m&dayf=6&xoap&link=xoap&par=1003666583&key=4128909340a9b2fc</div><div><br /></div><div>とすれば良い。</div><div>parとkeyはUbuntuから流用。</div><div>ほんとはちゃんとキーを取得すべきなんだろうけど…どうやら結構流用してる人が居るみたいだからまあ良いやで:P</div></div>caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-83958441151700700742009-02-22T01:56:00.002+09:002009-02-22T02:37:44.582+09:00DD-WRTの設定にはChromeが使えない<div>fonにDD-WRTを入れた。</div>暫く使ってなかったので、イーサネットコンバータにしようと思って色々やった。<div>(それは今度まとめる)</div><div><br /></div><div>で、大きくはまったので。</div><div>DD-WRTはWebインタフェースで設定できる。</div><div>ブラウザからアクセスして使うのだが、これにGoogleのChromeが使えない。</div><div>一見普通にアクセスできるし動くように見えるんだけど、保存も設定の反映も出来ない。</div><div><span class="Apple-style-span" style="font-family: arial; font-size: 13px; "><pre style="font-size: 110%; overflow-x: hidden; overflow-y: hidden; ">ERR_INVALID_RESPONSE.</pre><pre style="font-size: 110%; overflow-x: hidden; overflow-y: hidden; ">というエラーコードが出てたらソレ。素直に諦めよう。 <span class="Apple-style-span" style="font-family: Georgia; font-size: 16px; white-space: normal; "><a href="http://code.google.com/p/chromium/issues/detail?id=1863">http://code.google.com/p/chromium/issues/detail?id=1863</a><span class="Apple-style-span" style="color: rgb(85, 26, 139); text-decoration: underline;"><br /></span>chromiumだとパッチが当たってるみたいだけども・・・</span></pre></span></div><div><div><br /></div><div>FireFoxだと問題ないので、そっちを使うこと。</div><div>(IEも微妙に不自然な挙動をすることがあるので)</div></div>caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-15569619726519883972009-02-10T12:32:00.002+09:002009-02-10T13:22:59.220+09:00iPod TouchでGoogle SyncGoogle Syncが提供され始めました。<div>iPhoneとか携帯電話向けってばっかりでTouch向けの記事が無いのでやってみた。<div>GoogleカレンダーがPushで同期(ネットに繋いだタイミングで双方向に同期)できるのすげく便利。</div><div>(コンタクトリストは使ってないから便利さは不明)<br /><div><br /></div><div>m.google.com/sync</div><div>に繋ぐと、日本語の場合は「提供されてない」とか言われるけど、言語の選択でEnglishとか選ぶと繋がる。</div><div><br /></div><div>PCでm.google.com/syncにつなげって言われるので繋ぐと説明のページに飛ぶ。</div><div>そこでiPhoneを選んで…とやってくと↓に行く。要はセッティングの説明。</div><div><a href="http://www.google.com/support/mobile/bin/answer.py?answer=138740&topic=14252">http://www.google.com/support/mobile/bin/answer.py?answer=138740&topic=14252</a><br /></div><div><br /></div><div>Microsoft Exchangeを使って繋ぐみたいだ。日本語でざっくり解説。</div><div><ol><li>Touchの「設定」から、Mailとかのを選ぶ<br /></li><li>アカウントの追加を選ぶ</li><li>Microsoft Exchangeを選ぶ</li></ol><div>次に、アカウントの設定をする。</div><div><ol><li>Emailフィールドは何でも良い</li><li>Domainフィールドは空白で</li><li>UsernameフィールドにはGoogleのアカウントを(google.comまで含めて)</li><li>PasswordフィールドにはGoogleのパスワードを</li></ol><div>これで、上にある次へ(Next)ボタンを押す</div><div><ol><li>Serverフィールドに「m.google.com」と入れる</li></ol></div><div><br /></div><div>あとは完了したりOKしたりしていけばできる。(メール、カレンダー、コンタクトリストの3つのON/OFFがあるけどメールだけOFFで)</div><div>双方向同期なので、今のiPhod Touchのコンタクトリストとカレンダーは一旦全部消えます。バックアップをとってからにしよう。<br /></div><div><br /></div><div>びっくりするくらい便利。設定も簡単。オススメ。</div></div></div></div></div>caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-33382523364866978162009-01-21T14:26:00.002+09:002009-01-21T15:25:25.033+09:00Pythonで日本語文字列を扱う<div>Pythonで日本語文字列を置換しようとする度にググるのでいい加減まとめておく。</div><div>前提としてPython 2.6.1だと、文字列は全部Unicodeだと見なされる。で、Unicodeじゃない文字列は単なるバイト列として扱われる。</div><div>(Python 2.6.1対応。Python 3.0では未確認)</div><div><br /></div><div>まず、日本語(たぶんマルチバイト文字全般)の処理方法。</div><div><code></div><div># -*- coding: utf-8 -*-</div><div></code></div><div>先頭にこれを書いて、ソースはutf-8で保存する。</div><div><br /></div><div><code></div><div># -*- coding: utf-8 -*-</div><div>str = "こんにちは世界"</div><div>print str</div><div></code></div><div>strは当然utf-8で保存されてるし、出力もそう。</div><div>Windowsのコンソールなんかでやると文字化けする。</div><div><br /></div><div><code></div><div># -*- coding: utf-8 -*-</div><div>str = "こんにちは世界"</div><div>print str.decode('utf-8')</div><div></code></div><div>pythonはユニコードが標準らしい。utf-8をデコードして(ユニコードにして)やる。</div><div>Windowsのコンソールだとちゃんと表示する。</div><div><br /></div><div><code></div><div># -*- coding: utf-8 -*-</div><div>str = u"こんにちは世界"</div><div>print str</div><div></code></div><div>最初からハードコーディングするならこっちが簡単。uを付けるとユニコードになる。</div><div>やっぱりWindowsのコンソールだとちゃんと表示する。</div><div><br /></div><div><code></div><div># -*- coding: utf-8 -*-</div><div>str = u"こんにちは世界"</div><div>print str.encode('utf-8')</div><div></code></div><div>意味はないけど、ユニコードをutf-8にエンコードすることも出来る。</div><div>Windowsのコンソールだとちゃんと(?)文字化けする。(化け方はさっきと同じ)</div><div><br /></div><div><code></div><div># -*- coding: utf-8 -*-</div><div>str = "こんにちは世界"</div><div>print unicode(str, 'utf-8')</div><div></code></div><div>実は、ユニコードへの変換を受け持つ関数(constructor)もある。</div><div>encode, decodeよりも判りやすいかも。実は便利な機能付き。</div><div><code></div><div># -*- coding: utf-8 -*-</div><div>import sys</div><div>str = "\x80こんにちは世界"</div><div>print unicode(str, 'utf-8', errors='ignore')</div><div><br /></div><div>try:</div><div> print unicode(str, 'utf-8', errors='replace')</div><div>except:</div><div> print sys.exc_info()[:]</div><div><br /></div><div>try:</div><div> print unicode(str, 'utf-8', errors='strict')</div><div>except:</div><div> print sys.exc_info()[:]</div><div><br /></div><div></code></div><div>errorsにオプションが指定できる。</div><div>ignoreを設定すると、変なのが混じってたら無視してくれる。</div><div>replaceは、置き換え文字列(REPLACEMENT CHARACTER, U+FFFD)に置き換えてくれる。Windowsだとcp932でエンコードできねえって怒られる。</div><div>strictは、そのまんま処理する。当然デコードできねえって怒られる。(これがデフォルト値)</div><div><br /></div><div>ファイルを読み込んだり書き出したりするときの文字コードで覚えておくのは次のくらいかな。</div><div>euc-jp, utf-8, cp932, shift-jis</div><div><br /></div><div>個人的には、pythonの文字列に戻してやるdecodeと、書き出すときのencodeを使うのが判りやすいと思う。(変な制御コードが入ってるかもしれないから、エラー処理は必要になっちゃうけど)</div><div>文字コードの自動判別とか無理しないで、ちゃんと指定するのが良さそう。</div><div><br /></div><div>参考:</div><div><a href="http://www.python.jp/Zope/articles/japanese/Python4Japanese-2">日本語環境でのPython(for Python 2.3 or later)</a> </div><div><a href="http://www.amk.ca/python/howto/unicode">Unicode HOWTO</a> , <a href="http://www.geocities.jp/tan9ent/unicode.html">日本語訳</a></div><div><br /></div>caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com1tag:blogger.com,1999:blog-9030011326689538942.post-22083604853031602372008-11-18T16:30:00.005+09:002010-02-17T21:44:51.477+09:00Rainmeterのスキン、10-Foot HUDの天気予報カスタマイズ<span class="Apple-style-span" style=" white-space: pre; font-family:Arial;font-size:13px;"><div><a href="http://www.lifehacker.jp/2008/11/10-foot_hudrainmeter.html">http://www.lifehacker.jp/2008/11/10-foot_hudrainmeter.html</a><br /></div></span><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;"><br /></span></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;"><a href="http://www.ipi.fi/~rainy/legacy.html">Rainmeter</a>は、時刻とかの表示ツールだけど、lifehacker.jpで紹介されてた10-foot HUDはいい感じ。壁紙に時計がくっつくみたいで便利。</span></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;">いじると判るんだけど、結構癖がある。スキンと言うよりも、URLを指定して正規表現で情報を抜き出したりもできるっぽい。</span></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;">Weather-BlackとかのEditしようとすると、.iniファイルが直接開かれてちょっととまどうので、以下にやってみた情報を出しておく。</span></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;"><br /></span></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;"><br /></span></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;">まず、コメントが ; らしいことは見たら判る。次に、Weather.comでお天気コードを探せと言われる。</span></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;">;Find your weather code at Weather.com (like UKXX0296 below) and replace the one in this URL.<br /></span></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;"><br /></span></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;">色々やった結果、日本を指定してそっから近い場所を探すのがよさそう。(クリックしづらいので根気よく探そう)</span></div><div><a href="http://www.weather.com/outlook/weatherbycountry/japan">http://www.weather.com/outlook/weatherbycountry/japan</a><br /></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;"><br /></span></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;">たとえば青森だと天気予報のページは <span class="Apple-style-span" style=" white-space: normal; font-family:Georgia;font-size:16px;"><a href="http://www.weather.com/outlook/travel/businesstraveler/local/JAXX0004">http://www.weather.com/outlook/travel/businesstraveler/local/JAXX0004</a><span class="Apple-style-span" style=" white-space: pre; font-family:Arial;font-size:13px;"> になる。</span></span></span></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;"><span class="Apple-style-span" style=" white-space: normal; font-family:Georgia;font-size:16px;"><span class="Apple-style-span" style=" white-space: pre; font-family:Arial;font-size:13px;">だから、青森はJAXX0004というお天気コードなのが判る。</span></span></span></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;">あとは、Weather-Black.iniの該当箇所を書き換える。(Weather-White.iniも同じ)</span></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;">URL=http://xoap.weather.com/weather/local/JAXX0004?cc=*&unit=m&dayf=6<br /></span></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;">&unit=mを抜くと華氏表示になるけど、日本人なら摂氏じゃないかな。だからそのままで良い。</span></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;"><br /></span></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;">あと、[MeterTemp]の所に、Postfix="ー"って表示があるけど、これどうも°が文字化けしてるっぽい。</span> </div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;">Postfix="°"<br /></span></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;">こうしてやる。人によっては℃とかが良いかも。</span></div><div><span class="Apple-style-span" style=" white-space: pre;font-family:Arial;font-size:13px;">(日本語表示させたいとかは、見たら判るはずだから省略。僕は、英語のままで使ってる)</span></div><div><span class="Apple-style-span" style="font-family:Arial;"><span class="Apple-style-span" style="white-space: pre; font-size:-webkit-xxx-large;">***</span></span></div><div><span class="Apple-style-span" style="font-family:Arial;"><span class="Apple-style-span" style="white-space: pre; font-size:-webkit-xxx-large;">Weather.comの書式が変わったらしい。<a href="http://mogawa.blogspot.com/2009/09/rainmeter10-foot-hud.html">追記</a>を参考に修正して欲しい。</span></span></div><div><span class="Apple-style-span" style="font-family:Arial;"><span class="Apple-style-span" style="white-space: pre; font-size:13px;"><br /></span></span></div><div><span class="Apple-style-span" style="font-family:Arial;"><span class="Apple-style-span" style="white-space: pre; font-size:13px;"><br /></span></span></div><br /><iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=FFF3DB&IS2=1&bg1=FFF3DB&fc1=000000&lc1=0000FF&t=tamamonorail-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=4492042598" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-59750142479793446492008-10-21T19:08:00.002+09:002008-10-21T19:25:19.929+09:00荷物の分類<span class="Apple-style-span" style="border-collapse: collapse; font-family: arial; font-size: 13px; "><div style="margin-top: 0px; margin-bottom: 0px; "><span class="Apple-style-span" style="white-space: pre;">整理のコツ。</span></div><div style="margin-top: 0px; margin-bottom: 0px; "><span class="Apple-style-span" style="white-space: pre;"><br /></span></div><div style="margin-top: 0px; margin-bottom: 0px; "><span class="Apple-style-span" style="white-space: pre;"></span></div><blockquote><div style="margin-top: 0px; margin-bottom: 0px; "><span class="Apple-style-span" style="white-space: pre;">4つの容器に、ラベルを貼る。</span></div><div style="margin-top: 0px; margin-bottom: 0px; "><span class="Apple-style-span" style="white-space: pre; ">捨てる(Throw Away):要らないモノ。好きじゃないモノ。ぐちゃぐちゃと台所にあるもの。</span><br /></div><div style="margin-top: 0px; margin-bottom: 0px; "><span class="Apple-style-span" style="white-space: pre;">あげる(Give Away):寄付か友達に--どちらにせよ、良いことだし要らないものをはき出せる。</span></div><div style="margin-top: 0px; margin-bottom: 0px; "><span class="Apple-style-span" style="white-space: pre;">しまう(Put Away):他の部屋に入る?でも持ってくために片付けを止めないで!寄り道するから。この箱に入れてあとでやろう。</span></div><div style="margin-top: 0px; margin-bottom: 0px; "><span class="Apple-style-span" style="white-space: pre;">とっとく(Keep or Toss?):ソレ、どうするか決まらない?この箱に入れてテストしよう:ソレについて考えないか探しにいかなければ、遠慮せずに放り出そう。毎月チェックしよう。</span></div><div style="margin-top: 0px; margin-bottom: 0px; "><span class="Apple-style-span" style="white-space: pre; ">http://www.squidoo.com/homemaking</span></div><div><span class="Apple-style-span" style="white-space: pre;">より抜き書き</span></div><div></div></blockquote><div><span class="Apple-style-span" style="white-space: pre;"><br /></span></div><div><span class="Apple-style-span" style="white-space: pre;">これで整理が進む。ハズ。</span></div></span>caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-41182146551304008282008-09-11T15:18:00.003+09:002008-09-11T15:25:15.863+09:00batの威力Windowsのコンソールでスクリプト走らせると、どうしてもスクリプト内で完結してしまいがち。<div>(pythonだとos.walkとかでフォルダの中を走査したり)</div><div><br /></div><div>でも、bat使って連続してファイル読み込ませると、状況見ながらリファクタリングできることに気がついた。</div><div>なんかボトルネックになってるところを発見したときに、そこを直すと、次に実行されるときには治ったやつが実行されるので便利。</div><div><br /></div><div>for %%A in (%1) do python hoge.py < %%A<br /></div><div>とか覚えとくと便利。<br /></div><div><br /></div><div>for %%A in (%2) do %1 < %%A<br /></div><div>は、うっかり変なコマンド走らせて吃驚したのでやらない方が良さそう。</div>caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-22617759655694491922008-09-09T19:43:00.003+09:002008-09-09T19:51:59.667+09:00PythonでSQLiteを使う(データを書き込む)<div>・データを書き込む</div><div><br /></div><div><a href="http://mogawa.blogspot.com/2008/04/pythonsqlite_30.html">カーソルを作成した</a>ので、データベースにテーブルを作る準備ができました。テーブルの作成には、必要なステートメントを入れて、カーソルからexecuteメソッドを呼ばなければなりません。名前(name)とメアド(email)を保存するテーブルを作ってみましょう。ついでに、それぞれの列(row)に、ユニークな番号を振るようにもしてみましょう:</div><div><br /></div><div>>>> cursor.execute('CREATE TABLE names (id INTEGER PRIMARY KEY, name VARCHAR(50), email VARCHAR(50))')</div><div><br /></div><div>これでテーブルが出来ました。同様にして、データの追加もexecuteメソッドで行うことが出来ます:</div><div><br /></div><div>>>> cursor.execute('INSERT INTO names VALUES (null, "john Doe", "jdoe@jdoe.zz")')</div><div>>>> cursor.execute('INSERT INTO names VALUES (null, "Mary Sue", "msue@msue.yy")')</div><div><br /></div><div>カーソルから、最後に登録した列(row)番号を得ることも出来ます。たぶん必要でしょう:</div><div><br /></div><div>>>> cursor.lastrowid</div><div>2</div><div><br /></div><div>そうそう、「ユーザの入力に応じてデータベースに入れたい」と言うでしょ。明らかに、ユーザの入力はそのままでは危ないです。悪意あるユーザは、簡単にクエリーを操ってデータベースに通せるし、深刻なダメージをデータベースに与えることが出来ます。これは許容できません。でも、ありがたいことにpysqliteにはセキュリティを確保する手段があります。ある人の名前(name)とメアド(email)を、2つの変数で持っているとしましょう:</div><div><br /></div><div>>>> name = "Luke Skywalker"</div><div>>>> email ="use@the.force"</div><div><br /></div><div>このとき、(自分たちで定義したんだから)これらはまあ安全です。でも、いつもそうだとは言えないでしょう。安全なクエリーに変数を入れたい時は、単にその場所にクエスチョンマークを入れればいいだけです。すると、pysqliteが残りをやってくれます(<span class="Apple-style-span" style=" line-height: 17px; white-space: pre; font-family:-webkit-monospace;font-size:15px;"><a href="http://www.python.org/dev/peps/pep-0249/">paramstyleを参照のこと</a><span class="Apple-style-span" style=" line-height: normal; white-space: normal; font-family:Georgia;font-size:16px;">):</span></span></div><div><br /></div><div>>>> cursor.execute('INSERT INTO names VALUES (null, ?, ?)', (name, email))</div><div><br /></div><div>今、私たちは変更を加えたので、保存しなければなりません。(もしくは、データベースに変更を通知しなければなりません)これには、コネクションのcommitメソッドを呼び出します:</div><div><br /></div><div>>>> connection.commit()</div><div><br /></div><div>もしも、変更したにもかかわらずcommitを呼ばず、コネクションを閉じようとすると、pysqliteはエラーを返すでしょう。こういう行動は、トラブルのもとになります。でも、やってしまった変更を保存したくないときもあるでしょう。そんなときは、rollbackメソッドを使います。(色々保存せずに電源を切るというやり方もありますけど)例えば、もう一列テーブルに加えるとしましょう:</div><div><br /></div><div>>>> cursor.execute('INSERT INTO names VALUES (null, "Bobby John", "bobby@john.qq")')</div><div><br /></div><div>この変更を無かったことにしたい、としましょう。我々は単にrollbackメソッドを呼べば良いのです:</div><div><br /></div><div>>>> connection.rollback()</div><div><br /></div><div>ほら、これで変更は消えました。</div><div>次のステップでは検索をしてみましょう。</div>caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-52913294252211235452008-08-12T13:20:00.002+09:002008-08-12T13:47:39.151+09:00パノラマ写真に関して単一のレンズで全方位を映せるレンズをオリンパスが出してるが、これからはいろんなレンズで撮った画像を1枚にまとめられる技術の方が重要なのではないだろうか。<br />その手の技術は、技術者には普通のことなんだろうけれども、あんまりよく知らなかったので調べてみよう。<br /><br />・<a href="http://www.planewave.org/translations/hugin/create-panorama.html">パノラマ写真</a>をつくる<br />・<a href="http://nikq.nothing.sh/pkn/ms.cgi?t=sketch&blogid=&ShowDiary_file=/program/1138546687">技術としてのSIFTに関して</a><br /><br />・パノラマ写真を作るで紹介されているソフト<a href="http://user.cs.tu-berlin.de/%7Enowozin/autopano-sift/"><br /></a><ol><li><a href="http://user.cs.tu-berlin.de/%7Enowozin/autopano-sift/">autopano-sift</a></li><li><a href="http://hugin.sourceforge.net/">hugin</a></li><li><a href="http://enblend.sourceforge.net/">Enblend</a></li></ol>説明をざっと見た感じでは、autopano-siftで特徴点の算出、huginで画像の変形、Enblendで画像の合成を行っているようだ。<br />何れもLinux版、Windows版ともにある。フリーでこういうものが開発されてるのはすごいなあ。見習いたい。<br />SIFTとか画像処理の根幹の部分は、こらからさらに重要になってくるような気がする。音声処理も。素人が処理できるレベルまでPCのスペックが上がってきてるので楽しそう。データマイニングも面白そうだし。caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-77318925877416700092008-07-15T18:31:00.005+09:002008-07-15T18:47:48.198+09:00javascriptでクロージャクロージャとか、無名関数とか、引数として関数を渡すとか、javascriptって色々できるな。<br />難しそうだからさわってなかったけど、その場だけでごりごり書くときに便利そう。<br /><br /><pre class="prettyprint"><br />/* New document created: 6.2.2008 18:34:27 */<br /><br />function map(fn, a)<br />{<br /> for (i = 0; i < a.length; i++)<br /> {<br /> a[i] = fn(a[i]);<br /> }<br />}<br /><br />function reduce(fn, a, init)<br />{<br /> var s = init;<br /> for (i = 0; i < a.length; i++)<br /> s = fn( s, a[i] );<br /> return s;<br />}<br /> <br />function sum(a)<br />{<br /> return reduce(function(x, y){ return x+y; }, a, 0);<br />}<br /><br />function cntYear(x) //Closure<br />{<br /> var i = 0;<br /> return function()<br /> {<br /> i = i + 1;<br /> return x + i;<br /> }<br />}<br /><br />var a = [1, 2, 3];<br />map( function(x){return x*2;}, a );<br />map( alert, a );<br /><br />years = new Array(400);<br />map( cntYear(2008), years );<br />map( function(x){ if(x%400==0 || x%100!=0 && x%4==0){return 1;}else{return 0;} }, years);<br />alert(sum(years));<br /><br /></pre>caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-73482989715619329242008-07-07T13:54:00.004+09:002008-07-07T14:02:18.220+09:0013日は何曜日が多い?<a href="http://ja.wikipedia.org/wiki/13%E6%97%A5%E3%81%AE%E9%87%91%E6%9B%9C%E6%97%A5">13日の金曜日</a>を見ていて「金曜日が最も多い」というが気になって確認してみた。<br /><br /><pre class="prettyprint"><br />import calendar<br /><br />MON, TUE, WED, THU, FRI, SAT, SUN = 0, 1, 2, 3, 4, 5, 6<br />dict = {MON:0, TUE:0, WED:0, THU:0, FRI:0, SAT:0, SUN:0}<br />for y in range(2008, 2408):<br /> for m in range(1, 13):<br /> w = calendar.weekday(y, m, 13)<br /> dict[w] = dict[w] + 1<br />print dict<br /></pre><br />実行すると、以下のような結果に。<br /><a href="http://codepad.org/MuBsSX7M">http://codepad.org/MuBsSX7M</a><br /><pre class="prettyprint"><br />{0: 685, 1: 685, 2: 687, 3: 684, 4: 688, 5: 684, 6: 687}<br /></pre><br />金曜日が688回、水・日が687回、月・火が685回、木・土が684回と言う結果に。caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-73554002263170697352008-07-02T18:49:00.003+09:002008-07-02T18:57:03.894+09:00pythonでtwitterクライアント。コマンドプロンプト版。作ったやつを張っとこう。<br />ざっくり判った。twitterのAPIは簡単で判りやすい。json便利。<br /><br /><br />Windowsならではの小細工が。<br />でもこれcmdで立ち上げとくと便利。メモ代わりにどんどん書き込める。<br /><pre class="prettyprint"><br /># -*- coding: utf-8 -*-<br /><br />'''<br />twitter<br />friends timeline post<br />'''<br />import urllib, urllib2<br />import json<br />import calendar<br />import time<br />import sys<br /><br />toplevel_url = 'twitter.com'<br />target_url = 'twitter.com/statuses/update.json'<br />protocol = 'http://'<br />proxy = {'http':'http://hogehoge.com:80/'}<br />username = 'hogehoge@gmail.com'<br />password = 'xxxxx'<br /><br />proxy_handler = urllib2.ProxyHandler(proxy)<br />passman = urllib2.HTTPPasswordMgrWithDefaultRealm()<br />passman.add_password(None, toplevel_url, username, password)<br />authhandler = urllib2.HTTPBasicAuthHandler(passman)<br />opener = urllib2.build_opener(proxy_handler, authhandler)<br />urllib2.install_opener(opener)<br /><br />def twitter_post(text):<br /> params = urllib.urlencode({'status':text.encode('utf8')})<br /> #print params<br /> urllib2.urlopen(protocol + target_url, params)<br /><br />def twittertime2time(created_at):<br /> unix_time = calendar.timegm(time.strptime(created_at, '%a %b %d %H:%M:%S +0000 %Y'))<br /> return time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime(unix_time))<br /><br />while ( True ):<br /> utext = raw_input('What are you doing?: ')<br /> text = unicode(utext, 'mbcs')<br /> twitter_post(text)<br /><br /></pre><br /><br />毎分チェックに行く方<br /><pre class="prettyprint"><br /># -*- coding: utf-8 -*-<br /><br />'''<br />twitter<br />friends timeline loop_get<br />'''<br /><br />import urllib2<br />import json<br />import calendar<br />import time<br />import shelve, sha<br /><br />SLEEP_TIME = 1 * 60<br />HISTORY_FILE = 'tw.log'<br />toplevel_url = 'twitter.com'<br />target_url = 'twitter.com/statuses/friends_timeline/screen_name.json'<br />protocol = 'http://'<br />proxy = {'http':'http://hogehoge.com:80/'}<br />username = 'hogehoge@gmail.com'<br />password = 'xxxxxxx'<br /><br />proxy_handler = urllib2.ProxyHandler(proxy)<br />passman = urllib2.HTTPPasswordMgrWithDefaultRealm()<br />passman.add_password(None, toplevel_url, username, password)<br />authhandler = urllib2.HTTPBasicAuthHandler(passman)<br />opener = urllib2.build_opener(proxy_handler, authhandler)<br />urllib2.install_opener(opener)<br /><br />def twittertime2time(created_at):<br /> unix_time = calendar.timegm(time.strptime(created_at, '%a %b %d %H:%M:%S +0000 %Y'))<br /> return time.strftime("%b %d %H:%M:%S", time.localtime(unix_time))<br /> #return time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime(unix_time))<br /><br />def memory_log(time, text):<br /> FLG = True<br /> log = shelve.open( HISTORY_FILE )<br /> s = sha.new( text.encode('utf-8') )<br /> if ( not log.has_key( s.digest() ) ):<br /> log[ s.digest() ] = time<br /> FLG = False<br /> log.close()<br /> return FLG<br /><br />def print_twitt(contents):<br /> for content in contents:<br /> if ( not memory_log(content['created_at'], content['text']) ):<br /> print twittertime2time(content['created_at']), content['user']['screen_name'], content['text']<br /><br />while ( True ):<br /> pagehandle = urllib2.urlopen(protocol + target_url)<br /> json_contents = pagehandle.read()<br /> contents = json.read(json_contents)<br /> print_twitt(contents)<br /> time.sleep( SLEEP_TIME )<br /> print '.',<br /><br /></pre>caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-24156446874607218052008-07-02T17:39:00.005+09:002008-07-02T17:59:12.460+09:00ベリサインは何を見てる?公開鍵証明書について調べてるときに、気になった。<br />有名なベリサインは何を持って証明書を発行するのか。<br />発行先を確かにその発行先だと証明するために何を調査するのか。<br />それは、結構クリティカルな部分じゃないのかなあ。<br /><br />で、<a href="http://www.verisign.co.jp/serveronsite/register/flow_5.html">結局第三者がまとめたデータベースから、その会社の代表電話番号を持ってきて、そこにかける</a>と。<br />で、技術担当者に電話で確認すると。<br />後は、<a href="http://www.verisign.co.jp/serveronsite/register/flow_2.html">登記事項証明書を郵送する</a>ことで確認する。<br />(法人じゃないと、士には出してるらしい。<a href="http://www.verisign.co.jp/server/about/eligibility.html">弁護士とか</a>)その場合、証明するのは印鑑証明。<br /><br />つまり<br />1.第三者がまとめたデータベースの電話番号と、実際の企業電話番号との一致<br />2.申請書と、技術担当者の在籍&申請意志との一致<br />3.登記事項証明書(or 印鑑証明)による申請者の身分保証<br />の3点で確認してるわけだ。<br /><br />つまり、攻撃は2点必要。<br />1.第三者(帝国データバンクっぽい)のデータベース<br />2.登記事項証明書(or 印鑑証明)<br />両方が攻撃できれば、その本人でなくても証明書を発行してもらえる。<br /><br /><br />…気がついたときの証明書無効の方法も調べておかないとなあ。<br />参考:<br /><a href="http://mars.elcom.nitech.ac.jp/security/">名古屋工業大学大学院おもひ領域 情報工学専攻 岩田研</a><br /><a href="http://www.verisign.co.jp/personal/class2/help/faq/520078/index.html">.p12の証明書が流出するとなりすまされる</a>とかベリサインが書いてて何言ってんだろうと思ったけど、<br />証明書に秘密鍵がくっついてるファイルなんてのがあるのね。ということが一覧で判って便利。caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-17726161102114283892008-07-02T10:40:00.002+09:002008-07-02T10:49:21.037+09:00urllib2でproxyを使うにはurllib2を使ったpythonのスクリプトは結構便利なのが多い。<br />でも、プロキシ使ってると通らないのが多い。<br />以下のコードを加えると、特に手を加えなくてもproxy使えるので、メモ。<br /><br /><pre class="prettyprint"><br />proxy = {'http':'http://hogehoge.com:8080/'}<br />proxy_handler = urllib2.ProxyHandler(proxy)<br />opener = urllib2.build_opener(proxy_handler)<br />urllib2.install_opener(opener)<br /></pre>caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-51340408130937084772008-07-01T21:46:00.008+09:002008-07-01T22:12:22.004+09:00発作的にtwitter クライアントをpythonで実装してみるなんとなくで出来た。pythonってすごいなあ。<br />urlib2が便利すぎる。<br /><br />参考:<br /><a href="http://blog.livedoor.jp/dankogai/archives/50807384.html">perlでの実装例</a><br /><a href="http://209.85.175.104/search?q=cache:vfXxt8stO3EJ:d.hatena.ne.jp/showyou/searchdiary%3Fword%3D*%255B%25A5%25D7%25A5%25ED%25A5%25B0%25A5%25E9%25A5%25DF%25A5%25F3%25A5%25B0%255D+python+json+read&hl=ja&ct=clnk&cd=5&gl=jp">jsonのパージの仕方</a><br /><a href="http://groups.google.com/group/twitter-development-talk/web/api-documentation#StatusMethods">twitterAPI DOC</a><br /><a href="http://www.python.jp/doc/nightly/lib/urllib2-examples.html">urlib2でプロキシ通すとき参考にした</a><br /><a href="http://www.python.jp/doc/release/lib/module-time.html">twitter時間を日本時間に直すとき使った</a> <a href="http://www.python.jp/doc/release/lib/module-time.html">もいっこ時計型</a><br /><a href="http://www.python.jp/doc/release/tut/node7.html#SECTION007500000000000000000">python辞書型</a><br /><a href="http://python-twitter.googlecode.com/svn/trunk/twitter.py">時間の処理だけ参考にしたpython実装</a><br /><pre class="prettyprint"><br />'''<br />twitter<br />friends timeline get<br />'''<br /><br />import urllib2<br />import json<br />import calendar<br />import time<br /><br />toplevel_url = 'twitter.com'<br />target_url = 'twitter.com/statuses/friends_timeline/screen_name.json'<br />protocol = 'http://'<br />proxy = {'http':'http://hogehoge.com:8080/'}<br />username = 'hogehoge@gmail.com'<br />password = 'xxxxxxx'<br />proxy_handler = urllib2.ProxyHandler(proxy)<br /><br />passman = urllib2.HTTPPasswordMgrWithDefaultRealm()<br />passman.add_password(None, toplevel_url, username, password)<br />authhandler = urllib2.HTTPBasicAuthHandler(passman)<br />opener = urllib2.build_opener(proxy_handler, authhandler)<br />urllib2.install_opener(opener)<br />pagehandle = urllib2.urlopen(protocol + target_url)<br />json_contents = pagehandle.read()<br />contents = json.read(json_contents)<br /><br />def twittertime2time(created_at):<br /> unix_time = calendar.timegm(time.strptime(created_at, '%a %b %d %H:%M:%S +0000 %Y'))<br /> return time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime(unix_time))<br /><br />for content in contents:<br /> print twittertime2time(content['created_at']), content['user']['screen_name'], content['text']<br /># for k, v in content.iteritems():<br /># print k, v<br /># if k == 'user':<br /># for uk, uv in v.iteritems():<br /># print uk, uv<br /><br /># print contents<br /></pre><br />驚くくらいjsonの解説が少なくて吃驚。ググり方が悪いのか。<br />また、twitter APIの戻り値(jsonで渡される中身の数々)に関しても、情報が無い。<br />取り敢えずcreated_atが作られた時間、userの中に入れ子で色々入ってて、textには本文が入ってる。<br />以下取れる情報を列挙しとこう。後日何が何かを調べよう。<br /><pre class="prettyprint"><br />favorited<br />truncated<br />text<br />created_at<br />source<br />in_reply_to_status_id<br />in_reply_to_user_id<br />id<br />user<br /> name<br /> url<br /> profile_image_url<br /> screen_name<br /> followers_count<br /> protected<br /> location<br /> id<br /> description<br /></pre><br />とりあえず取れるのはこんなところ。caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com1tag:blogger.com,1999:blog-9030011326689538942.post-76908621990163534092008-06-27T16:49:00.002+09:002008-06-27T17:00:27.074+09:00Google App エンジン AU対応!こないだまで出来なかったけど、@ezweb宛にメール送ってくれるようになってる…<br />これで開発できるぞー<br /><br />http://code.google.com/intl/ja/appengine/<br /><br />この辺にドキュメントが。メール受けたり送ったりも出来るし、至れり尽くせり。<br />個人のWeb開発だと、もうこれ一本で十分だなあ。<br />http://code.google.com/appengine/docs/whatisgoogleappengine.html<br /><br />この辺読みながら、ぼちぼちやってみよう。夏休み前までに一本データベース使うアプリ作りたいなあ。<br />http://code.google.com/intl/ja/appengine/docs/gettingstarted/caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-59291710081786504662008-04-30T15:18:00.006+09:002008-09-09T19:51:13.525+09:00PythonでSQLiteを使う(データベースへの接続)・データベースに接続する<br /><br /> pysqliteを使う準備が出来てますね?まだなら<a href="http://mogawa.blogspot.com/2008/04/pythonsqlite.html">前のステップ</a>へ。<br /> Pythonを対話モードで起動して、早速ライブラリーを使ってみましょう。インポートすれば使えます。(pysqliteは、いろんな系列やapiがありましたが、SQLiteバージョン3用になってpythonに同梱されてからは、pysqlite3で統一されました)インポートは、sqlite3という名前でします。<br /><code><br />>>> import sqlite3<br /></code><br /> これで、pysqliteを使う準備が出来ました。<br /> まず、作業用の新しいデータベースを作ってみましょう。作るには、コネクションオブジェクトをつくって、データベースファイル名を指定します。(もしデータベースファイルが存在しなければ作成され、存在すればそれをオープンします)<br /><code><br />>>> connection = sqlite3.connect('test.db')<br /></code><br />メモリ上に、一時的なデータベースを作ることも出来ます。<br /><code><br />>>> memoryConnection = sqlite3.connect(':memory:')<br /></code><br />コネクションオブジェクトを得たら、何かするためにカーソルオブジェクトを作らなければなりません。作るには、コネクションオブジェクトから、カーソルメソッドを呼びます。<br /><code><br />>>> cursor = connection.cursor()<br /></code><br /><br />以後、このカーソルを使ってデータベースを操作します。<br />では次のステップでは<a href="http://mogawa.blogspot.com/2008/09/pythonsqlite.html">データを書き込んでみましょう</a>。caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-5427414581918718192008-04-30T14:34:00.005+09:002008-04-30T15:32:13.573+09:00PythonでSQLiteを使う(データベースのインストール) Python2.5でデータベースを使うときに真っ先に考えつくのがSQLite。(Python2.5に元々入ってるから何もしなくても使える)2.4までは入ってなかったので、情報が少ない。せっかくなので使い方の紹介をしようと思います。<br /><br /> SQLiteは、Cの小さなライブラリで、データベースエンジンとして十分な機能を持っています。Pythonには、pysqliteというSQLiteのインタフェースとして使えるライブラリがあって、Python2.5からは標準ライブラリになっています。<br /><br /> SQLiteは小さなデータベースエンジンで、アメリカでは結構な人気が(ちゃんとその人気に値する実力も)あります。SQLiteはスタンドアローンで動いて、依存関係はありません。データベースのデータは、単一のファイルに保存されます。煩わしい設定ファイルはいらないし、サイズは小さいし、多くのアプリに組み込めるし、結構早いです。さらにパブリックドメインでリリースされています。<br /><br /> pysqliteでSQLiteを使うのは簡単です。実際にやってみましょう。簡単なサンプルを通して、SQL構文そのものに慣れ親しむことも出来ます。<br /><br />・まず、ライブラリーを手に入れる。<br />Python2.5以降には、同梱されています。<a href="http://mogawa.blogspot.com/2008/04/pythonsqlite_30.html">次のステップ</a>へ。<br /><br />もしも、2.4.1までのPythonを使っている人が居たら、これを機に、Python2.5にするのをお薦めします:-)<br /><br />いろんな理由でPython2.5に出来ない方は、以下のウェブサイトからライブラリーを入れましょう。<br />http://initd.org/tracker/pysqlite<br /><br />Windowsユーザなら、ダウンロードしてインストールするだけで動きます。(SQLite本体も同梱されています)<br /><br />Linuxユーザだと、ディストリビューション毎のソースを落としてきて入れるのにあわせて、SQLite本体も必要かもしれません。ただ、多くのディストリビューションでは、SQLiteは既に入っているはずです。チェックしてみてください。もし入っていなければ、SQLiteは以下のウェブサイトから得られるハズです。<br />http://sqlite.org/<br /><br />他の多くのPythonライブラリーと同じように、このライブラリーもインストールできます。まずライブラリーをビルドします。<br /><br />python setup.py build<br /><br />次に、インストールしましょう。インストール権限があるかは確認しておいて下さい。<br /><br />python setup.py install<br /><br />もし全部出来たら、pysqliteはインストールされて、使えるようになっています。<br />では、<a href="http://mogawa.blogspot.com/2008/04/pythonsqlite_30.html">次のステップ</a>へ行きましょう。caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-45108927270732878582008-04-11T19:08:00.001+09:002008-04-11T19:11:11.882+09:00FFCCの収益予想(小さな王様と約束の国) Wiiは国内で400万台売れているらしい。そのうちネットに繋がっているのは200万台。感覚的にも半分くらいはネットに繋がっていない(半分はつなげている)というのは納得できる数値だと思う。じゃあこのうちお金を払ってVCを買う人はどのくらいだろう。半分は買わないだろうけど、10分の1くらいじゃないだろうか(仮定1)<br /> FFCCは1500円だから、おおよそWiiソフト1/3の値段だ。VCとしては高いけど、Wiiウェアという新作ソフトの値段としてはまあまあだと思う。RPGが好きな人ばかりではないだろうから、やっぱり1/10くらいの人が買うんじゃないだろうか(仮定2)<br /> すると、200万台 x 10% x 10% = 2万本くらいは売れてるんじゃないかなあと言う予想になる(予想1)<br /> どうやらWiiウェアの任天堂の取り分は、3割のようだ(仮定3)まあ流通だとかなんだとか考えたら、妥当なラインのような気がする。すると、2万本 x 1500円 x 70% = 2100万円となる。(予想2)<br /><br /> なんかずいぶん少ない気がする。実験プロジェクトだから収益がとんとんでも構わないとする事も出来るけど、一回出しちゃったら同じ値段でしか売れない(高くなるのはどうなのよ)気がする。からちゃんと採算ベースに乗ってるのじゃないかな。人件費の10%の売り上げがあったら良しとするのはどうだろう。(仮定4)若手の育成かつ、ブランド認知でお金が稼げるなら御の字、とか。すると、1909万円 x 110% = 2100万円となるので、1909万円が人件費になる。(予想3)<br /> 開発スタッフが色々と出てくるけど、まあまあ1人平均月30万円としてみる。(仮定5)だと、1909万円 / 30万円 = 63人月。(予想4)半年ぐらいのさっくり開発だってインタビューもあったから、だいたい10人で半年で作ったことになる。まあ、スタッフロールから推定できる(6ヶ月まるまる働いてる人は少ないだろうし)人数と近い気がする。(予想5)<br /> おおよそ、10人のスタッフが半年で、2万本の売り上げのソフトを作ることが目標だったんじゃないだろうか。<br /><br /> さらに、追加ダウンロード販売(DLC)を考えてみよう。仮定した2万本の売り上げが正しいとして、ダウンロードするのはどのくらいの数だろう。100円~800円といっても(Wiiでは初めての追加課金だから)追加課金になれていない人が多いだろうし、元値が1500円のソフトに800円払えるかどうかはその人次第だ。面白いから良いと思う人であれば買うだろうし、嫌な気分になった人も居るだろう。これはじゃあ1/3ぐらいは何かしら買うとしよう(仮定6)<br /> すると、2万本 x 30% = 6000人がDLCをするという事になる。(予想6)<br /> 中身によるけれども、FFCCの場合、新しいダンジョンの追加(300円)、種族の追加(セットで800円)がある。これはいくらの売り上げになるだろうか。たとえばダンジョンのみ買う人ばっかりだと、6000人 x 300円 x 70% = 126万円の売り上げになる。たいしたことはなさそうだけど、実は元々2100万円の売り上げ予想だったので、6%にあたる。300円のDLCを16本だすと、だいたい本体を売り上げたのと同じくらいの売り上げが見込める。ダンジョンの追加はデータ作成が楽だろうから、これはかなり人件費を引いても儲かるんじゃないだろうか。<br /> 逆に、コスチュームチェンジの100円はどうだろう。これも1/3が買うとして、6000人 x 100円 x 70% = 42万円。これはだいぶ少ない。原画→モデリング→販売が1週間ぐらいのタスクだとして8万円ぐらい。1着34万円の売り上げ。けっこう稼ぐように見えるけど、全然小さい。会社の仕事じゃなくて個人的な趣味なら稼ぐ方なんだろうけど。会社の売り上げには貢献しないような気がする。<br /><br />ただ、3つの仮定が非常に重要である。<br />1.「200万台 x 10% x 10% = 2万本」<br />2.「2万本 x 30% = 6000人」<br />3.「任天堂の取り分は3割」<br />これのどちらかが違うと、結果もかなり異なる。<br /><br /> 例えば、すごく売れるとする。200万台のうち、ダウンロード販売をするひとがほとんどで、そのほとんどがFFCCを買った(面白いから・評判がよいからとじわじわ売れる可能性はある。店頭と違って販売機会喪失は0に近いから)とする。すっごくうれて20万本売れたとする。これで2億円の売り上げだ。人件費が仮定通りだとすると、会社は1億8000万近く儲けた事になる。これは十分商売になる。コスチュームも充実してきて半分くらいの人が買うとする。10万 x 100円 x 70% = 700万円。これは例えば10着作れば半分くらいの人はどれか一着を買うという前提に立っても、まあまあ儲かる。1着10万円のタスクで100万円。600万円の売り上げなら、まあ継続的な商売になる。<br /><br /> というわけで、普通に2万本くらい売れると、社員教育+経験+ブランド認知が出来るという事になる。(たとえば駆け出しのデザイナーとかモデラーを使っても、そんなに悪くないだろう)<br /> すごく売れて、20万本とかになると、会社は大もうけできる。<br /> これは、スクエアエニックスにとってプラスにはナリこそスレ、マイナスにはならない。(1万本しか売れないと足がでるんじゃないかな。5人で半年で作ってればやはりそれでも問題ないけど)<br /><br />***<br /><br /> また逆に、3人で3ヶ月で作るミニゲームなら何本売れればよいか、なんてのも計算できる。30万 x 3人 x 3ヶ月 = 270万円。任天堂の取り分を考えると、386万円の売り上げでとんとん。300円のゲームにしたら1万3000本売れればよい。こりゃきついかも。じゃあ600円なら?6500本でいい。これならまあ無理じゃないかも。面白そうならもっと売れるだろうし。<br /> たとえば、ワリオみたいなミニゲームを3人チームで1日1個つくれ!みたいな社内公募があって、100個で売りに出すとする。100個のミニゲームが600円なら、僕は買う。30個でも買うかもしれない。30個なら1ヶ月で出来るかも。なら300円でも儲かる。3人 x 1ヶ月 = 90万円, 300円 x 70% = 210円, 90万円 / 210円 = 4300本売れれば良い。300円で30個のミニゲームなら売れるだろう。<br /><br /> 結果、Wiiウェアだとちっちゃいゲームをクイックに安く提供することが勝利の鍵だというのが判る。5000円のゲームを1年書けて開発するより、300円のゲームを3週間で作る方が良い。また棲み分けが出来ているとも言える。Wiiウェアでは5000円のゲームを作るのは不合理だし、300円のゲームを作っても儲かる環境が出来てる。<br /> 買う人も安く買える。作る方も楽に作れる。会社はゲームクリエイターに経験を積ませることができるし、ゲーマーも新しいゲームを結構な頻度で遊べる。300円なら、ちょっと毛色の違うのも遊んでみようかな、という気になるし。<br /><br /> というわけで、Wiiウェアというのはなかなか面白い環境(売れれば儲かるし、Wiiウェアを買うマニアックな人が5000人も居れば市場として成り立つ)だと言える。<br /><br />***<br />あとで追加すること<br />・400万台売れたとする資料にリンクすること<br />・200万台はネットに繋がってるとする資料にリンクすること<br />・3割が任天堂の取り分だとする噂にリンクすること<br />・開発期間のインタビュー記事にリンクすること<br />・販売本数とか数値があったら、探してリンクすることcaqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-59599415169557294072008-04-03T20:18:00.004+09:002008-04-03T20:29:23.620+09:00帳票を作ってみた申請書類をReportLabで作ってみた。そう難しくはない。<br />ただし、目的の申請書類専用のハードコーディングになる。データベースと連携させて自動で帳票を出力したいとか、印刷の見栄えを制御したいとかでなければ使わないかも。<br />Webサービスに組み込むのは印刷機能との連携で面白いかもしれない。HTMLの印刷制御って難しいし。(というか、自分のWebサービスには組み込む予定)<br /><br />変換ツールは作るの面倒そうだから市販ソフト使った方が良い。ハナからpdfを作りたいならやっぱりそれ専用のツールが良いと思う。(あるとすれば自分のサーバに仕込んでおいて、出先で使うとか。便箋とかノートとかToDoリストを出先で印刷する機会があれば)<br />自分で作ったソフトで、なんか紙に出力する予定がある場合には覚えておくと良いかもしれない。caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-24890784129727431262008-04-03T17:25:00.006+09:002008-04-03T17:34:51.082+09:00ReportLabはドキュメントじゃなくてソースを読め結局、ドキュメントを探すよりソースを読むのが一番早かった…<br />Python25\Lib\site-packages\reportlab\libとかに入ってる、styles.pyとか読むとよくわかる。(結局ソース見ればわかる話だし、ドキュメントはいらないって事なのかな)<br />StyleSheet1()クラスは、<br /><code><br /> def __init__(self):<br /> def __getitem__(self, key):<br /> def has_key(self, key):<br /> def add(self, style, alias=None):<br /> def list(self):<br /></code><br />てなメソッドを持ってる。辞書型じゃないのね。でもキーは拾えると。<br /><br />getSampleStyleSheetで拾えるスタイルは、<br /><code><br />'Normal', 'BodyText', 'Italic', 'Heading1', 'Title', 'Heading2', 'Heading3', 'Bullet', 'Definition', 'Code'<br /></code><br />の10種類だった。結局こりゃサンプルだから、自分で定義して使えって事みたい。<br /><br />イメージ的にはTeXが一番近いかな。残念ながら横着は出来ないという結果になりました。<br />(でもSampleのを書き換えて使う予定。楽なんだもの)caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-65572002808193163092008-04-03T16:11:00.003+09:002008-04-03T16:18:46.354+09:00簡単なParagraphStyleの定義方法よくよく調べると、parentを指定するとその内容を引き継げることが判った。<br /><br /><code><br /> stylesheet.add(ParagraphStyle(name='BodyRightText',<br /> parent=stylesheet['BodyText'],<br /> alignment=TA_RIGHT) )<br /></code><br />とかすると、BodyTextの内容を引き継いで、上書きすることが出来る。<br />もちろん<code>ParaStyle.fontName = "HeiseiMin-W3"</code>とかってやり方もできる。直接書き換えてしまう。<br /><br />でも、親を引き継いで新しく指定する方がスマートな気がする。<br />しかし、HeiseiMin-W3とHeiseiKakuGo-W5しか無いのがなあ。まあadobeがフリーで出してる言語パックだし仕方がないが…caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-69212593603371701322008-04-03T11:19:00.003+09:002008-04-03T11:25:34.928+09:00ReportLabで使えるSampleStyleSheetのstyle名結局、サンプルスタイルシートはサンプルでしかないのか。<br />自分で作れって事なのかもしれない。<br /><code><br />from reportlab.lib.styles import getSampleStyleSheet<br />styles = getSampleStyleSheet()<br />TitleStyle = styles['Title']<br />HeaderStyle1 = styles['Heading1']<br />HeaderStyle2 = styles['Heading2']<br />HeaderStyle3 = styles['Heading3']<br />#HeaderStyle4 = styles['Heading4']<br />#HeaderStyle5 = styles['Heading5']<br />#HeaderStyle6 = styles['Heading6']<br /><br />ParaStyle = styles['BodyText']<br />#ParaCenterStyle = styles['BodyCenterText']<br />#ParaRightStyle = styles['BodyRightText']<br />#IndentStyle = styles['Indent']<br />BulletStyle = styles['Bullet']<br /># new styles<br />#IndentIndentStyle = styles['IndentIndent']<br />#BulletIndentStyle = styles['BulletIndent']<br />PreStyle = styles['Code']<br /></code><br />結局、'Title', 'Heading1', 'Heading2', 'Heading3', 'BodyText', 'Bullet', 'Code'sしか定義されてない。<br /><code><br /><pre> stylesheet.add(ParagraphStyle(name='BodyRightText',<br /> parent=stylesheet['BodyText'],<br /> alignment=TA_RIGHT) )<br /></pre><br /></code><br />みたいな形で定義してやるしかないのかも。日本語だから結局そうなるんだけどね。<br />ただ、一回作ってやれば後々まで応用が利くので、暇なときに作り込むのも良いかもしれない。caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-41132576748391063942008-04-03T10:57:00.005+09:002008-04-03T11:26:38.106+09:00ReportLabのStyleSheetについてわーいHelloWorldかけたーじゃなくて、まともにpdfを作ろうとすると、ParagraphStyleを使いたくなる。<br />日本語だと、せっかく定義されてるParagraphStyleが使えないのは、前述の通り。<br />…そもそも、英文のParagraphStyleの一覧自体がreference.pdfに載っていないというとんでも具合。<br /><a href="http://two.pairlist.net/pipermail/reportlab-users/2006-June/005106.html">reportlab-usersのMLアーカイブ</a>で見つけた。<br /><br /><pre>platypus examples in version 1.2って書いてあるので古いんだろうけど。<br /><code><br />styles = get_stylesheet()<br /><br />TitleStyle = styles['Title']<br />HeaderStyle1 = styles['Heading1']<br />HeaderStyle2 = styles['Heading2']<br />HeaderStyle3 = styles['Heading3']<br />HeaderStyle4 = styles['Heading4']<br />HeaderStyle5 = styles['Heading5']<br />HeaderStyle6 = styles['Heading6']<br /><br />ParaStyle = styles['BodyText']<br />ParaCenterStyle = styles['BodyCenterText']<br />ParaRightStyle = styles['BodyRightText']<br />IndentStyle = styles['Indent']<br />BulletStyle = styles['Bullet']<br /># new styles<br />IndentIndentStyle = styles['IndentIndent']<br />BulletIndentStyle = styles['BulletIndent']<br /><br /><br /><br />PreStyle = styles['Code']<br /></code><br />って事らしい。<span style="font-family:Georgia,serif;"><br />もちょっと探してみよう。絶対リファレンスには載ってると思うんだがなあ。<br /></span></pre>caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0tag:blogger.com,1999:blog-9030011326689538942.post-19402316882550429742008-04-02T19:22:00.009+09:002008-04-02T22:59:08.299+09:00ReportLabを使ってみるpythonでpdfを作成しようとするとひっかかる<a href="http://www.reportlab.org/">ReportLab</a><br /><a href="http://www.reportlab.org/">http://www.reportlab.org/</a><br /><br />Reportというだけあって、英文であれば簡単にPDFのレポートが作成できそう。報告書とか見栄えを気にしないような書類を作成するのは楽ちん。<br />問題は日本語。「ReportLab Library is 2.1.」だと、特に問題なく日本語の作成までは通る。<br />Windowsでやってみてるから、「Precompiled DLLs」もダウンロードして使ってみた。Python2.5版を使った。<br />(ReportLab Toolkit Version 1もダウンロードできるけど、紛らわしいから止めて欲しい。それでハマった)<br />Acrobatのフォントを探してきて使えるようにしてくれる。Version 1はAcrobatの5までになってて、ハマりがち。Version2.1.だと、Acrobatの9まで自動で探すようになってる。<br />\Python25\Lib\site-packages\reportlabのrl_config.pyのなかの、~SearchPathでフォントを探してるので(CMapSearchPathとか)、そこを確認したら使えるかも。Acrobat10とか使う頃にはReportLabもヴァージョンアップしてるだろうけど:-)<br /><br /><code><br />from reportlab.pdfbase.cidfonts import UnicodeCIDFont<br />from reportlab.pdfbase import pdfmetrics<br /></code><br />をインポートして<br /><code>pdfmetrics.registerFont(UnicodeCIDFont('HeiseiKakuGo-W5'))</code><br />をセットしておくだけで、基本的には使える。<br />ただ、使えるだけじゃ意味がない。<br /><code><br />from reportlab.lib.styles import getSampleStyleSheet<br />from reportlab.platypus import Paragraph, SimpleDocTemplate<br />from reportlab.lib.pagesizes import letter<br />styles = getSampleStyleSheet()<br />styleN = styles['Normal']<br />styleH = styles['Heading1']<br />story = []<br />story.append(Paragraph("This is a Heading",styleH))<br />story.append(Paragraph("This is a paragraph in <i>Normal</i> style.", styleN))<br />doc = SimpleDocTemplate('mydoc.pdf',pagesize = letter)<br />doc.build(story)<br /></code><br />とかで、英文であればあっさりそれっぽいPDFが作成できる。正直、グラフや表を使わない報告書ならこれで十分対応できる。<br /><br />日本語だと<br /><code><br />from reportlab.lib.styles import ParagraphStyle<br />styleJ = ParagraphStyle(name='Normal',<br /> fontName='HeiseiKakuGo-W5',<br /> alignment = 0, #or TA_LEFT, TA_CENTER, TA_RIGHT of 0, 1, 2<br /> fontSize=10,<br /> leading=12)</code><br />とかで、スタイルを定義してやる必要がある。仕方がないんだが面倒だなあ…<br />(定義してやれば、Paragraphでちゃんと書き出してくれる)<br /><br />表組みを使うときも、英字であればちゃんと「右寄せ」とか「中央寄せ」とか通るのに日本語だと通らない。(Paragraphで右寄せ中央寄せは通る。だから、Paragraphで定義してやって表組みするのが正解)<br /><br />pythonでなんか大量にpdfにしたいとかなら便利かも。ただ、通常はフリーソフトとか良いのがいっぱいあるし、そっち使うのが無難かと思う。組み込み向けかなあ。caqhttp://www.blogger.com/profile/09544575437149660523noreply@blogger.com0