<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-952281200000592126</id><updated>2011-11-05T11:52:51.381+09:00</updated><category term='LDReader'/><category term='OpenIdea.jp'/><category term='DbUtils'/><category term='タグクラウド'/><category term='会社'/><category term='サービス'/><category term='memcached'/><category term='GAE'/><category term='携帯'/><category term='autolink'/><category term='Perl'/><category term='起業'/><category term='JavaScript'/><category term='Java'/><category term='Android'/><category term='プログラム'/><category term='このサービスよさそう'/><category term='FastReader'/><category term='スターレイティング'/><title type='text'>もじゃの日記</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.utils.jp/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default?start-index=26&amp;max-results=25'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>51</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-1452629324271064783</id><published>2011-09-03T12:37:00.005+09:00</published><updated>2011-09-03T13:18:36.531+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><title type='text'>perl のマルチスレッド</title><content type='html'>ども。ある案件で perl の マルチスレッドを使うことになりました。&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;use threads;&lt;br /&gt;my @ts;&lt;br /&gt;for (1..5) {&lt;br /&gt;   my $t = threads-&amp;gt;create(sub {&lt;br /&gt;       # some code&lt;br /&gt;       …&lt;br /&gt;       # 1つのスレッド処理完了 *1&lt;br /&gt;   });&lt;br /&gt;   push(@ts, $t);&lt;br /&gt;}&lt;br /&gt;eval { $_-&amp;gt;join } for @ts;&lt;br /&gt;&lt;br /&gt;# 終了処理 *2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;このようなコードを書いたのですが、どれかのスレッドの「# 1つのスレッド処理完了 *1」のタイミング「Scalars leaked: 1」が発生します。&lt;br /&gt;このエラーが発生するとまだ「# 終了処理 *2」は実行されず、メインプロセスごと落ちてしまいます。&lt;br /&gt;まだ実行中のスレッドもメインプロセスとともに落ちます。&lt;br /&gt;&lt;br /&gt;再現率は 100％ではないのですが、スレッドでやる仕事時間が長ければ長いほど「Scalars leaked: 1」は 100％に近い状態で発生していました。&lt;br /&gt;&lt;br /&gt;スレッドの呼び出し方法が悪いのかと思い 事前に関数定義したり&lt;br /&gt;&lt;pre class="code"&gt;my $runnable = sub {&lt;br /&gt;   # some coe&lt;br /&gt;};&lt;br /&gt;my @ts;&lt;br /&gt;for (1..5) {&lt;br /&gt;   my $t = threads-&amp;gt;create($runnable);&lt;br /&gt;   push(@ts, $t);&lt;br /&gt;}&lt;br /&gt;eval { $_-&amp;gt;join } for @ts;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;こんなことしたり&lt;br /&gt;&lt;pre class="code"&gt;my @ts;&lt;br /&gt;for (1..5) {&lt;br /&gt;   my $t = threads-&amp;gt;create(\&amp;amp;runnable);&lt;br /&gt;   push(@ts, $t);&lt;br /&gt;}&lt;br /&gt;eval { $_-&amp;gt;join } for @ts;&lt;br /&gt;&lt;br /&gt;sub runnable {&lt;br /&gt;   # some coe&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;こんなことしたり、色々試しましたが症状は改善しません。&lt;br /&gt;&lt;pre class="code"&gt;my @ts;&lt;br /&gt;for (1..5) {&lt;br /&gt;   my $t = threads-&amp;gt;create('runnable');&lt;br /&gt;   push(@ts, $t);&lt;br /&gt;}&lt;br /&gt;eval { $_-&amp;gt;join } for @ts;&lt;br /&gt;&lt;br /&gt;sub runnable {&lt;br /&gt;   # some coe&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;perl 5.8.8 を使っていたので perl 5.14.1 にもしてみましたが、「Scalars leaked: 1」の代わりに「Segmentation fault」が発生するようになりました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;最終的に以下の方法でひとまず解決しました。perl 5.10.x あたりから登場する threads::shared を使います。&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;use threads;&lt;br /&gt;use threads::shared;&lt;br /&gt;&lt;br /&gt;my %alive :shared;&lt;br /&gt;my $keepalive :shared;&lt;br /&gt;&lt;br /&gt;$keepalive = 1;&lt;br /&gt;for my $i (1..5) {&lt;br /&gt;   $alive{$i} = time();&lt;br /&gt;   my $t = threads-&amp;gt;create(sub {&lt;br /&gt;       my $ii = shift;&lt;br /&gt;       # some code&lt;br /&gt;       $alive{$ii} = time(); # この時間にまだ生きいることを知らせる&lt;br /&gt;       # some code&lt;br /&gt;       $alive{$ii} = time(); # この時間にまだ生きいることを知らせる&lt;br /&gt;       # some code&lt;br /&gt;       delete $alive{$ii}; # このスレッドの処理が終わったので %alive を消す&lt;br /&gt;       while (1) {&lt;br /&gt;           last unless $keepalive; # 他のすべてのスレッドが終了し、メインスレッドの「# 終了処理 *2」が終わるまで待機&lt;br /&gt;           sleep(2);&lt;br /&gt;       }&lt;br /&gt;   }, $i);&lt;br /&gt;   $t-&amp;gt;detach; # join しない&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# join の代わりに %alive が全部なくなるまで待つ&lt;br /&gt;while (1) {&lt;br /&gt;   my @keys = keys %alive;&lt;br /&gt;   last if @keys == 0; # %alive が無くなったら終了&lt;br /&gt;   my $now = time();&lt;br /&gt;   for my $key (@keys) {&lt;br /&gt;       my $a = $alive{$key} or next;&lt;br /&gt;       if ($now - $a &amp;gt; 30) {&lt;br /&gt;            # %alive 処理ができずに落ちたスレッドがいるかも知れないので、最後の生存通知から 30秒以上たってる場合は以後処理しない。&lt;br /&gt;           warn "timeout $key";&lt;br /&gt;           delete $alive{$key};&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;   sleep(5);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# 終了処理 *2&lt;br /&gt;# some code&lt;br /&gt;&lt;br /&gt;$keepalive = 0; # すべてのスレッドに関数を終了して良いことを知らせる。このあとどこかで Segmentation fault が発生するかも知れないが、構わないものとする。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;たぶん、大丈夫だと思う。美しくはないですが。。&lt;br /&gt;あやうく Java で書きなおそうかと思いました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-1452629324271064783?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/1452629324271064783/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=1452629324271064783' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/1452629324271064783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/1452629324271064783'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2011/09/perl.html' title='perl のマルチスレッド'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-1317946986382815715</id><published>2011-08-23T14:06:00.001+09:00</published><updated>2011-08-23T14:10:24.133+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='memcached'/><title type='text'>memcached でキーの列挙 (3)</title><content type='html'>前回のエントリ &lt;a href="http://blog.utils.jp/2008/06/memcached-2.html"&gt;memcached でキーの列挙 (2)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;こんなん作りました。memcached-tool ぽく。既にあったらすません～。&lt;br /&gt;&lt;a href="http://code.google.com/p/memcached-keys/"&gt;http://code.google.com/p/memcached-keys/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-1317946986382815715?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/1317946986382815715/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=1317946986382815715' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/1317946986382815715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/1317946986382815715'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2011/08/memcached-3.html' title='memcached でキーの列挙 (3)'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-8438429639808630923</id><published>2011-06-07T18:37:00.002+09:00</published><updated>2011-06-07T18:42:42.043+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>Google App Engine (GAE) の runserver 停止</title><content type='html'>ども！ご無沙汰してます。&lt;br /&gt;&lt;br /&gt;近頃は受託案件に加え、モバゲー向けに自社製ゲームを出したりしてましたが、6月2日にサービスを終了しました。&lt;br /&gt;時間ができたら開発に至った経緯や失敗談など書いていこうと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;さて、最近は Google App Engine Java で試験的に開発などを行っています。&lt;br /&gt;ビルドは Windows にて ant を使っていますが、そこで遭遇した問題を 1つ解決したのでメモ書きです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ant でのビルドと動作確認は runserver タスクを実行しますが、ドキュメント通りに Ctrl+C でプロセスを落としても Jetty の java.exe が残ったままになる問題があります。&lt;br /&gt;&lt;br /&gt;残ったままでは次の変更が反映されないので、タスクマネージャで java.exe を手動で終了させます。&lt;br /&gt;めんどくさいので以下のように runserver を定義することで解決しました。&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;変更前&lt;br /&gt;    &amp;lt;target name=&amp;quot;runserver&amp;quot; depends=&amp;quot;datanucleusenhance&amp;quot;&lt;br /&gt;            description=&amp;quot;Starts the development server.&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;dev_appserver war=&amp;quot;war&amp;quot; /&amp;gt;&lt;br /&gt;    &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;変更後&lt;br /&gt;    &amp;lt;target name=&amp;quot;runserver&amp;quot; depends=&amp;quot;datanucleusenhance&amp;quot;&lt;br /&gt;            description=&amp;quot;Starts the development server.&amp;quot;&amp;gt;&lt;br /&gt;      &amp;lt;java classname=&amp;quot;com.google.appengine.tools.development.DevAppServerMain&amp;quot;&lt;br /&gt;            classpath=&amp;quot;${appengine.tools.classpath}&amp;quot;&lt;br /&gt;            fork=&amp;quot;true&amp;quot; failonerror=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;        &amp;lt;jvmarg value=&amp;quot;-javaagent:${appengine.sdk.home}/lib/agent/appengine-agent.jar&amp;quot; /&amp;gt;&lt;br /&gt;        &amp;lt;arg value=&amp;quot;--port=8080&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;arg value=&amp;quot;--address=localhost&amp;quot;/&amp;gt;&lt;br /&gt;        &amp;lt;arg value=&amp;quot;war&amp;quot;/&amp;gt;&lt;br /&gt;      &amp;lt;/java&amp;gt;&lt;br /&gt;    &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Google App Engine 標準の runserver は dev_appserver マクロを呼び出し、com.google.appengine.tools.KickStart を起動していますが、これをすっ飛ばして&lt;br /&gt;com.google.appengine.tools.development.DevAppServerMain を直接起動します。&lt;br /&gt;&lt;br /&gt;キモは -javaagent ですね。&lt;br /&gt;&lt;br /&gt;これで少し快適に開発ができるようになるはず。。&lt;br /&gt;&lt;br /&gt;　&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-8438429639808630923?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/8438429639808630923/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=8438429639808630923' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/8438429639808630923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/8438429639808630923'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2011/06/google-app-engine-gae-runserver_07.html' title='Google App Engine (GAE) の runserver 停止'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-2970187350799793160</id><published>2010-05-17T04:10:00.005+09:00</published><updated>2010-05-17T04:39:42.776+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FastReader'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>FastReader (android GoogleReader クライアント) のソースコードを公開しました</title><content type='html'>FastReader を公開して 1か月半がたちました。&lt;br /&gt;&lt;br /&gt;現在 9000件のダウンロード、34％のアクティブユーザ数です。&lt;br /&gt;まさかこれほどのダウンロード数があるとは思いもよりませんでした。&lt;br /&gt;&lt;br /&gt;さらに思いもよらぬことに、バグや機能改善要望などを（主に英語で）たくさん頂くことができました。&lt;br /&gt;この場を借りてお礼申し上げます。&lt;br /&gt;&lt;br /&gt;今、もっとも悩ましい問題は「同期が遅く CPU 使用率が高い状態が続く」ことです。&lt;br /&gt;開発者としての意地もあるの調査を続けてましたが、どうにも解決策が見いだせず、悶々として過ごしていました。&lt;br /&gt;&lt;br /&gt;いつまでも解決しないまま放置するのも申し訳ないので、ソースコードを公開して一緒に開発してくださる方を募集してみることにしました。&lt;br /&gt;&lt;a href="http://code.google.com/p/fast-reader/"&gt;http://code.google.com/p/fast-reader/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;もし参加しても良い、または少しでもお気づきの点がございましたら &lt;a href="mailto:android-support@trycatch.jp"&gt;android-support@trycatch.jp&lt;/a&gt; までお寄せいただければ幸いです。&lt;br /&gt;&lt;br /&gt;ちょっと恥ずかしいですが、広告を入れたり、有料バージョンを作ったりしようと目論んでいた時期もありました。&lt;br /&gt;このプロジェクトに関しては一切を放棄します。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-2970187350799793160?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/2970187350799793160/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=2970187350799793160' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/2970187350799793160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/2970187350799793160'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2010/05/fastreader-android-googlereader.html' title='FastReader (android GoogleReader クライアント) のソースコードを公開しました'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-2399897782218783768</id><published>2010-04-13T11:14:00.004+09:00</published><updated>2010-04-13T11:51:25.923+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FastReader'/><title type='text'>FastReader を公開してみました</title><content type='html'>4月2日に FastReader という Android用 Google Reader クライアントを公開してみました。&lt;br /&gt;&lt;br /&gt;最初は LDReader を改良して Google Reader にも対応するマルチなリーダを作ろうと試行錯誤をしていたのですが、カテゴリとタグ、既読管理の方法が大きく違うので断念しました。&lt;br /&gt;&lt;br /&gt;似たようなアプリに NewsRob、NetaShare という素晴らしいものがあるのですが、せっかく Google Reader と通信するクラスを作ったので LDReader の UI 部分を流用して公開に踏み切りました。&lt;br /&gt;&lt;br /&gt;今のところの特徴としては、&lt;br /&gt;- タブでフィード一覧、タグ一覧を分けて表示&lt;br /&gt;- オフラインでつけたスターも後で同期する&lt;br /&gt;- 「記事一覧を省略」の設定をすることで、短いステップでフィード消化が可能&lt;br /&gt;などです。&lt;br /&gt;&lt;br /&gt;↓のキャプチャは Android のデベロッパーコンソールのものです。（4月13日午前）&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_jzTRnLPvgEk/S8PTtwCQLvI/AAAAAAAAAFg/-FqeXD1csNs/s1600/marketHome.PNG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 87px;" src="http://1.bp.blogspot.com/_jzTRnLPvgEk/S8PTtwCQLvI/AAAAAAAAAFg/-FqeXD1csNs/s320/marketHome.PNG" alt="" id="BLOGGER_PHOTO_ID_5459439956245098226" border="0" /&gt;&lt;/a&gt;公開してみてびっくりしたのが、意外にダウンロードして使ってくれてる人がいらっしゃることです。&lt;br /&gt;2日で 1000 ダウンロードを超えました。英語でのバグ報告や機能改善要望も数件いただきました。&lt;br /&gt;&lt;br /&gt;また恥ずかしながら version 0.0.1 からバグがたくさんあり、一時期は☆が 2.5 まで下がったりもしましたがなんとか 3.5 付近まで回復しました。なんとか 4まではもっていきたいですね。&lt;br /&gt;&lt;br /&gt;というわけで、機能改善や追加を行っていきます。&lt;br /&gt;今後ともよろしくお願いいたします。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-2399897782218783768?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/2399897782218783768/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=2399897782218783768' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/2399897782218783768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/2399897782218783768'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2010/04/fastreader.html' title='FastReader を公開してみました'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_jzTRnLPvgEk/S8PTtwCQLvI/AAAAAAAAAFg/-FqeXD1csNs/s72-c/marketHome.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-3595285198061534103</id><published>2010-03-24T09:44:00.002+09:00</published><updated>2010-03-24T09:57:16.691+09:00</updated><title type='text'>Google Checkout 販売者登録</title><content type='html'>Google Checkout の販売者としての法人口座登録がようやく成功しました。&lt;br /&gt;&lt;br /&gt;銀行は東京三菱 UFJ 銀行です。英語名は「Bank of Tokyo-Mitsubishi UFJ」。&lt;br /&gt;3か月かかりました。&lt;br /&gt;&lt;br /&gt;何故 3か月もかかったのか、簡単に説明しますと、&lt;br /&gt;&lt;br /&gt;・失敗の理由が良く分からない。Google に問い合わせても分からない。&lt;br /&gt;・銀行側に問い合わせても分からない。何のことか理解してもらえず対応していないの一点張り。&lt;br /&gt;・Google Checkout に法人格の括弧「ｶ)」が登録できなかった。（今はできるようになりました）&lt;br /&gt;・会社名は「トライキャッチ」なのですが、口座名義は「トライキヤツチ」と小さいカタカナでないので気づくのに時間がかかった。&lt;br /&gt;&lt;br /&gt;てな感じです。&lt;br /&gt;&lt;br /&gt;Google のサポートさんとは 20通ぐらいのやり取りをさせていただきました。&lt;br /&gt;最後までご対応いただいてありがとうございます。&lt;br /&gt;&lt;br /&gt;有料の Android アプリはまだ無いですが、事前準備ができてやる気が沸いてきました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-3595285198061534103?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/3595285198061534103/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=3595285198061534103' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/3595285198061534103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/3595285198061534103'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2010/03/google-checkout.html' title='Google Checkout 販売者登録'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-9144259918825799682</id><published>2010-02-05T15:44:00.002+09:00</published><updated>2010-02-05T15:56:14.714+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='LDReader'/><title type='text'>LDReader 1.0.5 をリリースしました。</title><content type='html'>（LDReader のリリース記事ばっかりですが。。）&lt;br /&gt;&lt;br /&gt;LDReader 1.0.5 をリリースしました。主な変更点は以下です。&lt;br /&gt;1. 記事の削除機能を追加&lt;br /&gt;2. バックエンドで記事取り込み中のもっさり感を解消&lt;br /&gt;（&lt;a href="http://code.google.com/p/ldreader/source/detail?r=12"&gt;ソース差分 r12&lt;/a&gt;）&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1. 記事の削除機能を追加&lt;/span&gt;&lt;br /&gt;・全記事&lt;br /&gt;・未読記事のみ&lt;br /&gt;・特定フィードの全記事&lt;br /&gt;・特定フィードの未読記事のみ&lt;br /&gt;の削除機能を追加しました。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. バックエンドで記事取り込み中のもっさり感を解消&lt;/span&gt;&lt;br /&gt;一覧系の画面では、ResourceCursorAdapter の autoRequery オプションを true に設定していたのですが、記事が 1件挿入されるたびに SELECT文を発行しており、このせいで画面が固まったようになる問題がありました。autoRequery を false にして独自の更新通知を受け取った場合のみに requery するようにしました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-9144259918825799682?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/9144259918825799682/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=9144259918825799682' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/9144259918825799682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/9144259918825799682'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2010/02/ldreader-105.html' title='LDReader 1.0.5 をリリースしました。'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-5942175241452910137</id><published>2010-01-31T03:07:00.004+09:00</published><updated>2010-02-03T14:15:54.401+09:00</updated><title type='text'>LDReader 1.0.2 パフォーマンス改善と記事一覧画面追加</title><content type='html'>android の LDReader 1.0.2 をリリースしました。主な変更点はこちら。&lt;br /&gt;&lt;br /&gt;・記事一覧画面を追加&lt;br /&gt;・パフォーマンス改善&lt;br /&gt;・バグ修正&lt;br /&gt;（&lt;a href="http://code.google.com/p/ldreader/source/detail?r=10"&gt;ソース差分&lt;/a&gt;）&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;記事一覧画面について&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;今までの画面遷移は&lt;br /&gt;  フィード一覧 → 記事詳細&lt;br /&gt;だったのですが&lt;br /&gt;  フィード一覧 → 記事一覧 → 記事詳細&lt;br /&gt;としました。&lt;br /&gt;&lt;br /&gt;記事一覧を作ってみたら今まで無理して記事詳細に詰め込んでいた機能が、以外とすんなりおさまるようになりました。&lt;br /&gt;使用感もこちらの方が自然になったと思います。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;パフォーマンス改善&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;使っていてデータがたまってくると、記事詳細からフィード一覧へ戻るときどうしても遅いことに気づき調査したところ。。&lt;br /&gt;&lt;br /&gt;sqlite に対する次の SQL が遅いことが分かりました。&lt;br /&gt;&lt;pre class="code"&gt;select count(*) from item subscription_id = ? and unread = 1&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;item テーブルのスキーマはこんな感じです。id にアンダーバーがついてるのは android の慣例ですね。&lt;br /&gt;&lt;pre class="code"&gt;CREATE TABLE item (&lt;br /&gt;  _id integer primary key,&lt;br /&gt;  subscription_id integer,&lt;br /&gt;  uri text,&lt;br /&gt;  title text,&lt;br /&gt;  body text,&lt;br /&gt;  author text,&lt;br /&gt;  unread integer,&lt;br /&gt;  created_time integer,&lt;br /&gt;  modified_time integer&lt;br /&gt;);&lt;br /&gt;CREATE INDEX idx_item_created_time on item(created_time);&lt;br /&gt;CREATE INDEX idx_item_modified_time on item(modified_time);&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;CREATE INDEX idx_item_subscription_id on item(subscription_id);&lt;/span&gt;&lt;br /&gt;CREATE INDEX idx_item_title on item(title);&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;CREATE INDEX idx_item_unread on item(unread);&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;item テーブルの subscription_id と unread にはそれぞれインディクスを貼ってあるのにどーしてこんなに遅いんだろうと。&lt;br /&gt;&lt;br /&gt;色々と回り道しつつ、次のように複合インディクスを追加することで解決しました。&lt;br /&gt;&lt;pre class="code"&gt;CREATE INDEX idx_item_unread_by_sub_id on item(subscription, unread);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;使ってくださってる方がいらっしゃったら是非アップグレードをお勧めします＾＾&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-5942175241452910137?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/5942175241452910137/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=5942175241452910137' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/5942175241452910137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/5942175241452910137'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2010/01/ldreader-102.html' title='LDReader 1.0.2 パフォーマンス改善と記事一覧画面追加'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-1730584592918467753</id><published>2009-11-25T18:49:00.004+09:00</published><updated>2009-11-25T19:34:41.288+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='携帯'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラム'/><title type='text'>はじめての Wikipedia に携帯 IPアドレス一覧</title><content type='html'>携帯向けのサイトを作っていると、アクセス元の IPアドレスで携帯かそうでないかを判断する仕組みを導入することがあります。&lt;br /&gt;&lt;br /&gt;いろいろ試行錯誤してこんなページを Wikipedia に作っちゃいました。&lt;br /&gt;&lt;a href="http://ja.wikipedia.org/wiki/Mobile:GatewayIP"&gt;http://ja.wikipedia.org/wiki/Mobile:GatewayIP&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;（以下 Wikipedia にページを作った経緯など）&lt;br /&gt;&lt;br /&gt;IPアドレスリストは各キャリアがそれぞれのサイトで公開しています。&lt;br /&gt;&lt;br /&gt;  docomo（NTTドコモ）&lt;br /&gt;  http://www.nttdocomo.co.jp/service/imode/make/content/ip/&lt;br /&gt;&lt;br /&gt;  SoftBank（ソフトバンク）&lt;br /&gt;  http://creation.mb.softbank.jp/web/web_ip.html&lt;br /&gt;&lt;br /&gt;  au（エーユー）&lt;br /&gt;  http://www.au.kddi.com/ezfactory/tec/spec/ezsava_ip.html&lt;br /&gt;  「※本情報はEZサーバ以外のホストによる上記表のIPアドレスでのアクセスがないことを保証するものではありません。」とか書いてあるのであまり使っちゃいけないかもしれないですね。。&lt;br /&gt;&lt;br /&gt;かなり前もって情報は公開されるようなので普段気にしていればいいのですが、つい忘れてしまいがちです。（au は妙にコピペしずらいし）&lt;br /&gt;&lt;br /&gt;そういう情報をまとめているサイトが無いか、プログラムから利用しやすいウェブサービスは無いかと探しますが、なかなか見つかりません。&lt;br /&gt;&lt;br /&gt;プログラマなんで、各キャリアのサイトをスクレイピングして CIDR 形式のリストを抽出することが思いつきます。&lt;br /&gt;&lt;br /&gt;自分で書く前に情報を探すと Net::CIDR::MobileJP という CPAN モジュールを使った素晴らしい情報に出会います。&lt;br /&gt;  http://dsas.blog.klab.org/archives/51117561.html&lt;br /&gt;&lt;br /&gt;早速試してみましたが、最近 SoftBank の URL や構造が変わったようで情報が取れません。&lt;br /&gt;そこで Net::CIDR::MobileJP とそのプラグインのソースを見てみると数行の洗練されたコードが見つかります。&lt;br /&gt;&lt;br /&gt;これなら参考にして作れると思いますが、待てよと。&lt;br /&gt;この行為はいろんな人が同じことやってるんだろうなーとか、またキャリアのサイトの構造が変わったらやだなーとか。&lt;br /&gt;&lt;br /&gt;やっぱり公共性の高いスクレイピングできるまとめページがほしい。&lt;br /&gt;というわけで Wikipedia に恐る恐るページを作っちゃいました。&lt;br /&gt;&lt;br /&gt;決してスクレイピングしやすくは無いですが、ひとまず。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-1730584592918467753?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/1730584592918467753/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=1730584592918467753' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/1730584592918467753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/1730584592918467753'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2009/11/wikipedia.html' title='はじめての Wikipedia に携帯 IPアドレス一覧'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-1273191292212826474</id><published>2009-11-19T17:28:00.002+09:00</published><updated>2009-11-19T18:07:45.145+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラム'/><category scheme='http://www.blogger.com/atom/ns#' term='LDReader'/><title type='text'>LDReader 記事詳細の WebView をちょっと修正したり</title><content type='html'>LDReader 0.0.9 をリリースしました。&lt;br /&gt;・記事詳細の WebView でリンクをクリックしたときにダイアログ表示&lt;br /&gt;・ProgressDialog の表示後の処理を修正&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;記事詳細の WebView でリンクをクリックしたときにダイアログ表示&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;記事詳細では間違ってリンクをクリックしてしまってブラウザが起動してしまい、非常にストレスを感じていましたが確認用のダイアログを表示することで少し軽減されるようにしました。ソースはこちら。&lt;br /&gt;&lt;pre class="code"&gt;// NOTE: WebView#setWebViewClient を使用&lt;br /&gt;bodyView.setWebViewClient(new WebViewClient() {&lt;br /&gt;    @Override&lt;br /&gt;    public boolean shouldOverrideUrlLoading(WebView view, final String url) {&lt;br /&gt;        // NOTE: 設定でリンクを無効にした場合はそのまま終了&lt;br /&gt;        if (ReaderPreferences.isDisableItemLinks(getApplicationContext())) {&lt;br /&gt;            return true;&lt;br /&gt;        }&lt;br /&gt;        // NOTE: ダイアログ表示&lt;br /&gt;        new AlertDialog.Builder(ItemActivity.this)&lt;br /&gt;            .setTitle(R.string.msg_confirm_browse)&lt;br /&gt;            .setMessage(url)&lt;br /&gt;            .setPositiveButton("OK", new DialogInterface.OnClickListener() {&lt;br /&gt;                public void onClick(DialogInterface dialog, int whichButton) {&lt;br /&gt;                    // NOTE: OK がおされたら Intent を発行&lt;br /&gt;                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));&lt;br /&gt;                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);&lt;br /&gt;                    startActivity(intent);&lt;br /&gt;                }&lt;br /&gt;            })&lt;br /&gt;            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {&lt;br /&gt;                public void onClick(DialogInterface dialog, int whichButton) {&lt;br /&gt;                }&lt;br /&gt;            }).show();&lt;br /&gt;        return true;&lt;br /&gt;    }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;WebViewClient#shouldOverrideUrlLoading は true を返すことで、WebView の標準を動きをオーバーライドすることができます。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ProgressDialog の表示後の処理を修正&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ProgressDialog を表示後に Handler#post を使っていた箇所をすべて Thead を使うようにしました。&lt;br /&gt;実はここ、最初は Thread だったんですが Handler は post の他に postDelayed という遅延実行のメソッドも持っており、Thread のような動きをするので、「あ。こっちでいいのか」とつい思い込みをしてました。&lt;br /&gt;&lt;br /&gt;意図しているのは&lt;br /&gt;&lt;pre&gt;   プログレスバー表示&lt;br /&gt;     ↓&lt;br /&gt;   重い処理&lt;br /&gt;     ↓&lt;br /&gt;   終了&lt;/pre&gt;&lt;br /&gt;だったんですが、Handler#post を使うと&lt;br /&gt;&lt;pre&gt;   重い処理&lt;br /&gt;      ↓&lt;br /&gt;   プログレスバー表示（一瞬）&lt;br /&gt;      ↓&lt;br /&gt;   終了&lt;/pre&gt;&lt;br /&gt;になっちゃいます。&lt;br /&gt;&lt;br /&gt;ここに詳しい解説がのってました！&lt;br /&gt;http://www.adamrocker.com/blog/261/what-is-the-handler-in-android.html&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;// NOTE: 修正前&lt;br /&gt;final Handler handler = new Handler();&lt;br /&gt;final ProgressDialog dialog = new ProgressDialog(this);&lt;br /&gt;dialog.show();&lt;br /&gt;handler.post(new Runnable() {&lt;br /&gt;    public void run() {&lt;br /&gt;        // NOTE: ここで遅い処理&lt;br /&gt;        // (some code)&lt;br /&gt;        // NOTE: 終わったら ProgressDialog を閉じる&lt;br /&gt;        handler.post(new Runnable() {&lt;br /&gt;            public void run() {&lt;br /&gt;                dialog.dismiss();&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt;});&lt;/pre&gt;&lt;br /&gt;&lt;pre class="code"&gt;// NOTE: 修正後&lt;br /&gt;final Handler handler = new Handler();&lt;br /&gt;final ProgressDialog dialog = new ProgressDialog(this);&lt;br /&gt;dialog.show();&lt;br /&gt;new Thread() {&lt;br /&gt;    public void run() {&lt;br /&gt;        // NOTE: ここで遅い処理&lt;br /&gt;        // (some code)&lt;br /&gt;        // NOTE: 終わったら ProgressDialog を閉じる&lt;br /&gt;        handler.post(new Runnable() {&lt;br /&gt;            public void run() {&lt;br /&gt;                dialog.dismiss();&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt;}.start();&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-1273191292212826474?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/1273191292212826474/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=1273191292212826474' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/1273191292212826474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/1273191292212826474'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2009/11/ldreader-webview.html' title='LDReader 記事詳細の WebView をちょっと修正したり'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-1362134281694207110</id><published>2009-11-16T19:28:00.004+09:00</published><updated>2009-11-16T20:23:57.943+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラム'/><category scheme='http://www.blogger.com/atom/ns#' term='LDReader'/><title type='text'>LDReader フィード一覧の ListView, ListAdapter にハマる</title><content type='html'>ども。こっそり version 0.0.8 までバージョンアップしました。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;[0.0.6]&lt;/span&gt; ListView とデータベースとの不整合でたまに例外発生する問題を解消したつもりが失敗。&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;[0.0.7]&lt;/span&gt; android.widget.CursorAdapter を使うことで修正、等&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;[0.0.8]&lt;/span&gt; フィード一覧からピン一覧を開くと、背景が真っ暗になる問題を修正。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;[0.0.7] での主な変更&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;version 0.0.7 以前では、操作していると次のような例外がたまに発生しました。&lt;br /&gt;&lt;pre class="code"&gt;java.lang.IllegalStateException:&lt;br /&gt;  The content of the adapter has changed but ListView did not receive a notification.&lt;br /&gt;  Make sure the content of your adapter is not modified from a background thread, but only from the UI thread.&lt;/pre&gt;&lt;br /&gt;この例外はデータベースのレコード数と ListView のレコード数に違いがあるときに発生します。&lt;br /&gt;LDReader はバックエンドのサービスでレコードを挿入したりしているので自前で色々していたのですが、付け焼刃ではどうしてもこの例外を抑えることができませんでした。&lt;br /&gt;&lt;pre class="code"&gt;java.lang.Object&lt;br /&gt;   ↳  android.widget.BaseAdapter&lt;br /&gt;      ↳  android.widget.CursorAdapter&lt;br /&gt;         ↳  android.widget.ResourceCursorAdapter&lt;/pre&gt;&lt;br /&gt;BaseAdapter を継承してゴニョゴニョしていたのですが、探してみると CursorAdapter といクラスがあるではありませんか！&lt;br /&gt;&lt;br /&gt;ソースをのぞいて見るとデータベースの更新通知を受け取ってクエリを再発行し、ListView との不整合を解消しているようです。さらに ResourceCursorAdapter では、行ごとの View をリソースを使ってカスタマイズしている場合にピッタリなようです。ApiDemos を見ながら四苦八苦して作ったのですが、まだまだ知らないことがたくさんありそうです。&lt;br /&gt;&lt;br /&gt;ちゅうわけで主な変更はこちら。&lt;a href="http://code.google.com/p/ldreader/source/diff?spec=svn5&amp;r=5&amp;format=side&amp;path=/trunk/src/org/jarx/android/livedoor/reader/SubscriptionActivity.java"&gt;SubscriptionActivity (diff r5)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;[0.0.8] での主な変更&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cursor#deactivate を自前でやっていたのですが、Activity#managedQuery を使っていれば deactivate と requery は勝手にやってくれるようです。削除しました。&lt;br /&gt;&lt;br /&gt;ちゅうわけで主な変更はこちら。&lt;a href="http://code.google.com/p/ldreader/source/diff?path=/trunk/src/org/jarx/android/livedoor/reader/SubscriptionActivity.java&amp;format=side&amp;r=6"&gt;SubscriptionActivity (diff r6)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-1362134281694207110?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/1362134281694207110/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=1362134281694207110' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/1362134281694207110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/1362134281694207110'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2009/11/ldreader-listview-listadapter.html' title='LDReader フィード一覧の ListView, ListAdapter にハマる'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-4382698776305669723</id><published>2009-11-15T02:34:00.007+09:00</published><updated>2009-11-15T03:22:14.831+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラム'/><category scheme='http://www.blogger.com/atom/ns#' term='LDReader'/><title type='text'>LDReader ピンに対応しました</title><content type='html'>&lt;a href="/2009/11/android-ldreader.html"&gt;関連記事&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ども。LDReader をピンに対応させて ver 0.0.5 としました。このブログにコメントいただいちゃったので＾ ＾&lt;br /&gt;以下スナップショットです。&lt;br /&gt;&lt;br /&gt;&lt;div style="width:100%;"&gt;&lt;div style="float:left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_jzTRnLPvgEk/Sv7quTG4UQI/AAAAAAAAAEc/NuChDkHhR78/s1600-h/01.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 215px; height: 320px; float:left;" src="http://2.bp.blogspot.com/_jzTRnLPvgEk/Sv7quTG4UQI/AAAAAAAAAEc/NuChDkHhR78/s320/01.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5404014684015186178" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="float:left; margin-left:10px;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_jzTRnLPvgEk/Sv7quKEeHTI/AAAAAAAAAEU/aubwZpEgz9A/s1600-h/02.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://3.bp.blogspot.com/_jzTRnLPvgEk/Sv7quKEeHTI/AAAAAAAAAEU/aubwZpEgz9A/s320/02.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5404014681589161266" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="clear:left;"&gt;&lt;/div&gt;&lt;br /&gt;ちょと見づらいですが、記事タイトル右にピンアイコンがあります。このアイコンをクリックするかメニューから「Pin」を選択するとピンをつけたり外したりできます。&lt;br /&gt;&lt;br /&gt;ピンは本家同様に一覧でみることができ、ブラウザで閲覧することができます。&lt;br /&gt;その他、記事 1件の URL をクリップボードにコピーしたり、全件の URL リストをメールで送れるようにしときました。&lt;br /&gt;&lt;br /&gt;簡単なバージョンアップですが、今回は少し悩んだ点があります。&lt;br /&gt;&lt;br /&gt;単純に実装するとすれば、ピン操作は常にサーバに対して追加や削除を実行し、一覧は最新をサーバから持ってくれば良いです。しかし、これだと地下鉄のようなオフライン環境ではピンを追加することができません。&lt;br /&gt;&lt;br /&gt;そこで次のような pin テーブルを作成して、ユーザの操作をまず action として保存し、それから通信を行うようにしました。追加の場合は 1:ACTION_ADD, 削除の場合は 2:ACTION_REMOVE, サーバから取得した場合は 0:ACTION_NONE とします。&lt;br /&gt;&lt;pre class="code"&gt;create table if not exists pin (&lt;br /&gt;    _id integer primary key,&lt;br /&gt;    uri text,&lt;br /&gt;    title text,&lt;br /&gt;    action integer, -- 0:ACTION_NONE, 1:ACTION_ADD, 2:ACTION_REMOVE&lt;br /&gt;    created_time integer&lt;br /&gt;)&lt;/pre&gt;&lt;br /&gt;ピンの追加はロジックはこんな感じ。&lt;br /&gt;&lt;pre class="code"&gt;public boolean pinAdd(String uri, String title)&lt;br /&gt;        throws IOException, ReaderException {&lt;br /&gt;    if (!isLogined()) {&lt;br /&gt;        login();&lt;br /&gt;    }&lt;br /&gt;    try {&lt;br /&gt;        ContentResolver cr = this.context.getContentResolver();&lt;br /&gt;        // NOTE: 事前に uri が重複するピンアクションを削除&lt;br /&gt;        cr.delete(Pin.CONTENT_URI, Pin._URI + " = ? and " + Pin._ACTION &lt;br /&gt;            + " &amp;gt; " + Pin.ACTION_NONE, new String[]{uri});&lt;br /&gt;        // NOTE: ピンアクションを追加。&lt;br /&gt;        ContentValues values = new ContentValues();&lt;br /&gt;        values.put(Pin._URI, uri);&lt;br /&gt;        values.put(Pin._TITLE, title);&lt;br /&gt;        values.put(Pin._ACTION, Pin.ACTION_ADD);&lt;br /&gt;        values.put(Pin._CREATED_TIME, (long) (System.currentTimeMillis() / 1000));&lt;br /&gt;        Uri pinUri = cr.insert(Pin.CONTENT_URI, values);&lt;br /&gt;        // NOTE: 端末がオフラインの場合はここで終了&lt;br /&gt;        if (!isConnected()) {&lt;br /&gt;            return true;&lt;br /&gt;        }&lt;br /&gt;        // NOTE: サーバと http 通信。失敗したら IOException などがスローされる。&lt;br /&gt;        boolean success = this.client.pinAdd(uri, title);&lt;br /&gt;        if (success) {&lt;br /&gt;            // NOTE: 通信が成功したら既存の重複ピンを削除して、&lt;br /&gt;            //       1:ACTION_ADD を 2:ACTION_NONE に更新。&lt;br /&gt;            cr.delete(Pin.CONTENT_URI, Pin._URI + " = ? and " + Pin._ACTION&lt;br /&gt;                + " = " + Pin.ACTION_NONE, new String[]{uri});&lt;br /&gt;            values.put(Pin._ACTION, Pin.ACTION_NONE);&lt;br /&gt;            cr.update(pinUri, values, null, null);&lt;br /&gt;        }&lt;br /&gt;        return success;&lt;br /&gt;    } catch (ParseException e) {&lt;br /&gt;        throw new ReaderException("json parse error", e);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;このままでは、端末がオフラインのときには 1:ACTION_ADD と 2:ACTION_REMOVE が溜まります。&lt;br /&gt;そこで回線がオンラインになったら実行される処理にピンの同期処理を追加します。&lt;br /&gt;&lt;pre class="code"&gt;public int syncPins() throws IOException, ReaderException {&lt;br /&gt;    if (!isLogined()) {&lt;br /&gt;        login();&lt;br /&gt;    }&lt;br /&gt;    ContentResolver cr = this.context.getContentResolver();&lt;br /&gt;    // NOTE: 1:ACTION_ADD と 2:ACTION_REMOVE の検索。&lt;br /&gt;    String where = Pin._ACTION + " &amp;gt; " + Pin.ACTION_NONE;&lt;br /&gt;    String order = Pin._ID + " asc";&lt;br /&gt;    Pin.FilterCursor cursor = new Pin.FilterCursor(&lt;br /&gt;        cr.query(Pin.CONTENT_URI, null, where, null, null));&lt;br /&gt;    try {&lt;br /&gt;        while (cursor.moveToNext()) {&lt;br /&gt;            // NOTE: 順番にピンアクションを再現&lt;br /&gt;            Pin pin = cursor.getPin();&lt;br /&gt;            if (pin.getAction() == Pin.ACTION_ADD) {&lt;br /&gt;                pinAdd(pin.getUri(), pin.getTitle());&lt;br /&gt;            } else {&lt;br /&gt;                pinRemove(pin.getUri());&lt;br /&gt;            }&lt;br /&gt;            Uri uri = ContentUris.withAppendedId(Pin.CONTENT_URI, pin.getId());&lt;br /&gt;            cr.delete(uri, null, null);&lt;br /&gt;        }&lt;br /&gt;    } finally {&lt;br /&gt;        cursor.close();&lt;br /&gt;    }&lt;br /&gt;    // NOTE: サーバからピン一覧を全件取得。&lt;br /&gt;    PinsHandler pinsHandler = new PinsHandler();&lt;br /&gt;    try {&lt;br /&gt;        this.client.handlePinAll(pinsHandler);&lt;br /&gt;    } catch (ParseException e) {&lt;br /&gt;        throw new ReaderException("json parse error", e);&lt;br /&gt;    }&lt;br /&gt;    return pinsHandler.counter;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;関連するソースはこのへん。&lt;br /&gt;@see &lt;a href="http://code.google.com/p/ldreader/source/browse/trunk/src/org/jarx/android/livedoor/reader/Pin.java"&gt;org.jarx.android.livedoor.reader.Pin&lt;/a&gt;&lt;br /&gt;@see &lt;a href="http://code.google.com/p/ldreader/source/browse/trunk/src/org/jarx/android/livedoor/reader/PinActivity.java"&gt;org.jarx.android.livedoor.reader.PinActivity&lt;/a&gt;&lt;br /&gt;@see &lt;a href="http://code.google.com/p/ldreader/source/browse/trunk/src/org/jarx/android/livedoor/reader/ReaderManager.java"&gt;org.jarx.android.livedoor.reader.ReaderManager&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;このピンの実装によってずいぶんと使い勝手が向上したように感じます。ありがとうございます。&lt;br /&gt;次はウィジェットを実装予定です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-4382698776305669723?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/4382698776305669723/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=4382698776305669723' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/4382698776305669723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/4382698776305669723'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2009/11/ldreader_15.html' title='LDReader ピンに対応しました'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_jzTRnLPvgEk/Sv7quTG4UQI/AAAAAAAAAEc/NuChDkHhR78/s72-c/01.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-3790639644372348491</id><published>2009-11-11T21:17:00.006+09:00</published><updated>2009-11-11T21:41:36.973+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='LDReader'/><title type='text'>LDReader の画面遷移</title><content type='html'>&lt;a href="/2009/11/android-ldreader.html"&gt;前記事&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;LDReader の画面遷移は少し変かも知れません。&lt;br /&gt;&lt;br /&gt;現在の画面遷移は&lt;br /&gt;  フィード一覧 → 未読の最新の記事詳細 → （未読がなければ）既読の最新の記事詳細&lt;br /&gt;となっています。&lt;br /&gt;&lt;br /&gt;普通にやるなら&lt;br /&gt;  フィード一覧 → 記事一覧 → 記事詳細&lt;br /&gt;ですかね。&lt;br /&gt;&lt;br /&gt;記事一覧画面が無いです。個人的な需要の ”とにかく未読をチェックしたい”で作り始めたのでこうなっちゃってますが、どうでしょう？もし使いづらいとかコメントたくさんもらったら変えたいと思います。&lt;br /&gt;&lt;br /&gt;フィード一覧画面：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_jzTRnLPvgEk/SvqvrN_DB9I/AAAAAAAAAD8/unonnq7jTqY/s1600-h/subs.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://4.bp.blogspot.com/_jzTRnLPvgEk/SvqvrN_DB9I/AAAAAAAAAD8/unonnq7jTqY/s320/subs.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5402823860007667666" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;記事詳細画面：&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_jzTRnLPvgEk/SvqwuvxU8bI/AAAAAAAAAEE/1VYaXxTFCi0/s1600-h/item.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://3.bp.blogspot.com/_jzTRnLPvgEk/SvqwuvxU8bI/AAAAAAAAAEE/1VYaXxTFCi0/s320/item.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5402825020128162226" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-3790639644372348491?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/3790639644372348491/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=3790639644372348491' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/3790639644372348491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/3790639644372348491'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2009/11/ldreader.html' title='LDReader の画面遷移'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_jzTRnLPvgEk/SvqvrN_DB9I/AAAAAAAAAD8/unonnq7jTqY/s72-c/subs.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-601392264124536855</id><published>2009-11-11T19:08:00.006+09:00</published><updated>2009-11-11T21:25:25.107+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><category scheme='http://www.blogger.com/atom/ns#' term='LDReader'/><title type='text'>android アプリ LDReader を マーケットに公開しました</title><content type='html'>android で動く LDReader という livedoor Reader クライアントを作ってみました。&lt;br /&gt;&lt;br /&gt;androlib.com: &lt;a href="http://jp.androlib.com/android.application.org-jarx-android-livedoor-reader-zACz.aspx"&gt;マーケット紹介ページ&lt;/a&gt;&lt;br /&gt;code.google.com: &lt;a href="http://code.google.com/p/ldreader"&gt;Google Code プロジェクトページ&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;今のとこ 30件ぐらいダウンロードがあります。（紹介ページの星 4つは、つい自分で押してしまいましたｗ）&lt;br /&gt;&lt;br /&gt;この LDReader については何回か書いていきたいなと思います。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;LDReader とは：&lt;/span&gt;&lt;br /&gt;定期的にサーバと通信して端末内に情報を保存し、オフラインで RSS の内容を閲覧できるのが特徴です。端末で独自に既読/未読の管理を行います。表示形式はフラットのみです。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;作った経緯：&lt;/span&gt;&lt;br /&gt;android を入手して最初にほしいなと思ったアプリケーションで、探しても良さそうなのが見つけられなかったためです。地下鉄での移動が多いのでオフラインでも更新をチェックできることを重要視しました。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Google Code でソースコードを公開した理由：&lt;/span&gt;&lt;br /&gt;android の SDK やその特性は少しクセがあって作るのに結構苦労しました。つまづいた点の紹介をしたかったのと、ここはこれでいいのか？という疑問を持ったままリリースしたのでツッコミがほしかったのが一番の理由です。&lt;br /&gt;オープンソース版の FastLadder  もあるし、作ったのものをオープンにしてみたかったのもありますね＾＾&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;追加で考えている機能：&lt;/span&gt;&lt;br /&gt;・未読数と最新記事の何件かが表示されるウィジェットに対応する。&lt;br /&gt;・記事検索ができるように。&lt;br /&gt;・キャッシュ記事のクリア。&lt;br /&gt;・表示形式を livedoor Reader 本家と同じく、フォルダやレートに対応する。&lt;br /&gt;・FastLadder に対応する。（fastladder.org と任意のドメイン）&lt;br /&gt;・ピンをつけれるようにする。&lt;br /&gt;・レートをつけれるようにする。&lt;br /&gt;・android ではあまり見ないフィードを隠す。&lt;br /&gt;&lt;br /&gt;開発元は株式会社トライキャッチとしました。&lt;br /&gt;パッケージのドメインは org.jarx.android を使ってます。オープンソースモノはこのドメインを使っていこうと思ってます。そのうちウェブページも充実させないと。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-601392264124536855?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/601392264124536855/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=601392264124536855' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/601392264124536855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/601392264124536855'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2009/11/android-ldreader.html' title='android アプリ LDReader を マーケットに公開しました'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-1985767517707335372</id><published>2009-10-28T18:40:00.002+09:00</published><updated>2009-10-28T18:44:52.127+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>XML の Preference で Intent 呼び出し</title><content type='html'>ちょっとハマったのでメモ&lt;br /&gt;&lt;pre class="code"&gt;    &amp;lt;PreferenceScreen&lt;br /&gt;           android:title="[タイトル]"&lt;br /&gt;           android:summary="[サマリ]"&amp;gt;&lt;br /&gt;       &amp;lt;intent android:action="android.intent.action.VIEW"&lt;br /&gt;               android:targetPackage="[パッケージ名]"&lt;br /&gt;               android:targetClass="[パッケージ名].[クラス名]" /&amp;gt;&lt;br /&gt;   &amp;lt;/PreferenceScreen&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-1985767517707335372?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/1985767517707335372/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=1985767517707335372' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/1985767517707335372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/1985767517707335372'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2009/10/xml-preference-intent.html' title='XML の Preference で Intent 呼び出し'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-9201150342263625641</id><published>2009-08-14T02:15:00.006+09:00</published><updated>2009-10-28T18:45:35.111+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>android ソース入手。(CentOS 5.3  yum git-1.5.4)</title><content type='html'>簡単なことですが、すぐ忘れるのでメモ投稿です。&lt;br /&gt;&lt;br /&gt;android ソースを入手したくて repo コマンド実行しようとすると、git 1.5.4 以上が必要なんですって。&lt;br /&gt;&lt;pre class="code"&gt;repo init -u  git://android.git.kernel.org/platform/manifest.git&lt;br /&gt;fatal: git 1.5.4 or later required&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;私は yum(rpm)派なんですが、rpmforge には 1.5.2 しかなくてどうしようと思ってたら git 本家に yum リポジトリがあったのでそれを使いました。&lt;br /&gt;git は 1.5.4 の最新と思われるものを指定してます。&lt;br /&gt;&lt;pre class="code"&gt;wget http://kernel.org/pub/software/scm/git/RPMS/git.repo -O /etc/yum.repos.d/git.repo&lt;br /&gt;yum install git-1.5.4.6-1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;あとは repo というスクリプトをダウンロードして&lt;br /&gt;&lt;pre class="code"&gt;mkdir ~/bin&lt;br /&gt;wget http://android.git.kernel.org/repo -O ~/bin/repo&lt;br /&gt;chmod 755 ~/bin/repo&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;git config で user.email, user.name を設定して、repo init、repo sync でソースコードのダウンロードがはじまります。&lt;br /&gt;&lt;pre class="code"&gt;git config --global user.email "メアド"&lt;br /&gt;git config --global user.name "名前"&lt;br /&gt;repo init -u git://android.git.kernel.org/platform/manifest.git&lt;br /&gt;repo sync&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-9201150342263625641?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/9201150342263625641/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=9201150342263625641' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/9201150342263625641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/9201150342263625641'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2009/08/android-centos-53-git-154.html' title='android ソース入手。(CentOS 5.3  yum git-1.5.4)'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-3030742161179960779</id><published>2009-07-03T16:46:00.005+09:00</published><updated>2009-07-03T17:29:08.330+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='プログラム'/><title type='text'>論理削除とユニークキー制約</title><content type='html'>ども。久々に時間ができたのでぼちぼち日記書いてみようかなと。&lt;br /&gt;技術ネタですが。。&lt;br /&gt;&lt;br /&gt;データベース設計を行うとき、論理削除を採用することが多いです。&lt;br /&gt;論理削除用のカラムとしては boolean 型もしくは小さい数値型を使います。&lt;br /&gt;&lt;pre class="code"&gt;create table item (&lt;br /&gt;    id int not null,&lt;br /&gt;    code varchar(40) not null,&lt;br /&gt;    name varchar(240) not null,&lt;br /&gt;    removed boolean not null default false,&lt;br /&gt;    constraint item_pk primary key (id) /* ,&lt;br /&gt;    constraint item_code_uk unique key (code) 本当はユニークキー制約をつけたいが。。 */&lt;br /&gt;);&lt;/pre&gt;&lt;br /&gt;item（商品）テーブルに一意な code（商品コード）という人が認識しやすい番号を任意に設定できるテーブルを設計するとき、ユニークキー制約をつけてしまうと一度論理削除した商品コードが使いまわせない問題が発生します。仕方なくデータベース側のユニークキー制約は外していました。&lt;br /&gt;&lt;br /&gt;このテーブルを使うアプリケーション側では、挿入、更新前にユニークキーチェックを行いますが、アプリケーションサーバが複数台あったり、バッチ処理が平行して実行される可能性があったりでなかなか厳密な整合性はとりづらいです。&lt;br /&gt;&lt;br /&gt;最近になってふと、論理削除用のカラムをユニークキー制約に含めてインクリメントすればいいじゃんと思いつきました。そして、主キーが 1つあるタイプならばインクリメントとかしなくてそのまま使えるなーと。&lt;br /&gt;&lt;pre class="code"&gt;create table item (&lt;br /&gt;    id int not null, -- 0 以上の主キー&lt;br /&gt;    code varchar(40) not null,&lt;br /&gt;    name varchar(240) not null,&lt;br /&gt;    removed int not null default 0,&lt;br /&gt;    constraint item_pk primary key (id) ,&lt;br /&gt;    constraint item_code_uk unique key (code, removed)&lt;br /&gt;);&lt;/pre&gt;&lt;br /&gt;論理削除するときは、&lt;br /&gt;&lt;pre class="code"&gt;update item set removed = id where id = ?&lt;/pre&gt;&lt;br /&gt;通常の検索時には where 句に removed = 0 を指定します。&lt;br /&gt;&lt;pre class="code"&gt;select * from item where removed = 0&lt;/pre&gt;&lt;br /&gt;まだ実践で使ってないですが多分大丈夫なはず。&lt;br /&gt;いやースッキリした。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-3030742161179960779?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/3030742161179960779/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=3030742161179960779' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/3030742161179960779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/3030742161179960779'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2009/07/blog-post.html' title='論理削除とユニークキー制約'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-2491959231171092775</id><published>2009-04-06T03:19:00.002+09:00</published><updated>2009-04-06T03:26:10.776+09:00</updated><title type='text'>起業して1年</title><content type='html'>1年が早いです。去年の4月に起業してから過去お付き合いのある会社、知人から仕事をいただいて何とかやってこれました。ありがとうございます。&lt;br /&gt;&lt;br /&gt;今年は大きな仕事を受注し、社員を増やしたいと思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-2491959231171092775?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/2491959231171092775/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=2491959231171092775' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/2491959231171092775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/2491959231171092775'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2009/04/1.html' title='起業して1年'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-5069608222922049360</id><published>2009-01-20T14:03:00.006+09:00</published><updated>2009-01-20T18:24:03.167+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラム'/><title type='text'>Java のフレームワークどうしましょ</title><content type='html'>あけましておめでとうございます。&lt;br /&gt;&lt;br /&gt;次の受託開発案件で Java を使うことになりそうなのでフレームワークの比較検討しています。&lt;br /&gt;&lt;br /&gt;私が今まで使ったことのあるフレームワークは&lt;br /&gt;・Struts 1、2系 → EC など&lt;br /&gt;・Tapestry 3系 → 業務システム&lt;br /&gt;・Click Framework → 自社サービス（openidea.jp）&lt;br /&gt;の 3つです。&lt;br /&gt;&lt;br /&gt;一言にフレームワークといっても色々な役割がありますが、私は次の 4つが主要な機能だと考えます。&lt;br /&gt;・URI マッピング&lt;br /&gt;・フォームのバリデーション&lt;br /&gt;・テンプレート&lt;br /&gt;・データベースアクセス&lt;br /&gt;&lt;br /&gt;表にするとこんな感じでしょうか。かなり昔の記憶で書いているものあって、正確でなかったり、当時スキル不足や調べ切れなかったものもありますが。。&lt;br /&gt;&lt;br /&gt;&lt;table class="sheet" width="100%"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;br /&gt;&lt;/th&gt;&lt;th&gt;URI マッピング&lt;/th&gt;&lt;th&gt;バリデーション&lt;/th&gt;&lt;th&gt;テンプレート&lt;/th&gt;&lt;th&gt;データベースアクセス&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Struts&lt;/th&gt;&lt;td&gt;サーブレットフィルタ *.do 標準&lt;/td&gt;&lt;td&gt;独自&lt;/td&gt;&lt;td&gt;JSP 2.0 標準&lt;/td&gt;&lt;td&gt;なし&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Tapestry&lt;/th&gt;&lt;td&gt;サーブレットを /app などにマッピング&lt;/td&gt;&lt;td&gt;独自&lt;/td&gt;&lt;td&gt;独自 + ognl 形式&lt;/td&gt;&lt;td&gt;なし&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;Click Framework&lt;/th&gt;&lt;td&gt;サーブレットフィルタ *.htm 変更不可&lt;/td&gt;&lt;td&gt;独自&lt;/td&gt;&lt;td&gt;Velocity 標準&lt;/td&gt;&lt;td&gt;Cayenne、Spring サポート&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;この 3つはどれもぴったりハマることなく、気に入らないところは色々いじって使ってました。それぞれの使った感想を簡単にあげます。&lt;br /&gt;&lt;br /&gt;Struts:&lt;br /&gt;・設定ファイルが面倒。設定ファイルにして便利だったことはほとんどない。&lt;br /&gt;・*Form, *Action とたくさんのクラスができて管理が面倒。&lt;br /&gt;・学習は比較的容易？情報がたくさんある。&lt;br /&gt;&lt;br /&gt;Tapestry:&lt;br /&gt;・業務システムで採用したのが間違いだったかもしれないが、複雑な画面になるとイベントの制御がかなり難解になる。&lt;br /&gt;・カスタムコンポーネントを作り始めると面白い。&lt;br /&gt;・ページ制御側の学習コストは非常に高くつく。HTML テンプレートはスッキリ。&lt;br /&gt;&lt;br /&gt;Click Framework：&lt;br /&gt;・拡張子 *.htm が固定で変更できないのが痛い。&lt;br /&gt;・学習は容易。&lt;br /&gt;&lt;br /&gt;ほとんどのフレームワークはテンプレート部分や、データベースアクセスは他のプロダクトに変更することが可能です。実はここの選定が肝だったりします。別途テンプレートやデータベースアクセス部分のことは書きたいなと思います。&lt;br /&gt;&lt;br /&gt;これらの今まで使ってきたフレームワークの追加調査に加え、Wicket も調査したいです。Spring Framework、S2 など DIコンテナを含むものは今回はパスしようと思います。&lt;br /&gt;&lt;br /&gt;ここ 2、3年は Perl、PHP 案件がほとんどだったので忘れていましたが、Java 案件は&lt;br /&gt;→ 新しいフレームワークの選定&lt;br /&gt;→ 開発スタートしてから新しいフレームワークの細かい部分の調査ハマる&lt;br /&gt;で遅延しがちなので要注意ですねー。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-5069608222922049360?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/5069608222922049360/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=5069608222922049360' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/5069608222922049360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/5069608222922049360'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2009/01/java.html' title='Java のフレームワークどうしましょ'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-7895421518688142726</id><published>2008-12-22T07:22:00.003+09:00</published><updated>2008-12-22T07:36:32.426+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='このサービスよさそう'/><title type='text'>仕事でつながるサービス</title><content type='html'>どもどもー。起業して半年以上たちますが、未だに一人で受託案件こなしてます。&lt;br /&gt;今期は何とか黒字でしたが、そろそろこの一人受託開発スタイルから脱却しないとだめですね。&lt;br /&gt;&lt;br /&gt;つまり、社員を雇ったり仕事の一部を外注していきたいのですが。。&lt;br /&gt;&lt;br /&gt;そんなときに見つけたサービス「ランサーズ」さん。最近できた様子です。&lt;br /&gt;http://www.lancers.jp/&lt;br /&gt;&lt;br /&gt;楽天ビジネスっぽい仕組みは、世の中に無ければ作りたいなーと思ってましたが、これ大変分かりやすくて良いです。どんどん発展していきそうな予感です。&lt;br /&gt;&lt;br /&gt;試しに仕事の依頼をしてみようかなー。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-7895421518688142726?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/7895421518688142726/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=7895421518688142726' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/7895421518688142726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/7895421518688142726'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2008/12/blog-post.html' title='仕事でつながるサービス'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-2270102683177889721</id><published>2008-11-12T02:27:00.004+09:00</published><updated>2008-11-12T02:34:24.324+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='プログラム'/><title type='text'>mod_ktai バージョンアップ</title><content type='html'>mod_ktai がバージョンアップしたようです。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.utils.jp/2008/10/modktai.html"&gt;前回&lt;/a&gt;は mod_ktai おしいなぁという感想だったんですが、今度のバージョンは VirtualHost に対応しています。UTF-8 の PCサイトと Shift_JIS の携帯サイトが共存する環境でも問題なく使えるようになりました。&lt;br /&gt;&lt;br /&gt;よかったよかった＾ ＾&lt;br /&gt;&lt;br /&gt;これによって表示は mod_ktai に任せることができるので、あとは入力される 3キャリアの絵文字をノーマライズすればいいですね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-2270102683177889721?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/2270102683177889721/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=2270102683177889721' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/2270102683177889721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/2270102683177889721'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2008/11/modktai.html' title='mod_ktai バージョンアップ'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-1653661146963524393</id><published>2008-10-24T11:20:00.003+09:00</published><updated>2008-10-24T11:33:03.825+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラム'/><title type='text'>Shift_JIS で encodeURIComponent</title><content type='html'>Ajax が流行り始めてからほとんど UTF-8 でウェブアプリケーションを作っていたので気にならなかったのですが、Shift_JIS で作るとなるとちょっと面倒くさいです。&lt;br /&gt;&lt;br /&gt;例えば script.aculo.us の Ajax.InPlaceEditor のコールバックとかで普通に書くと encodeURIComponent が UTF-8 エンコードを施すので、サーバ側で Shift_JIS として受け取れません。&lt;br /&gt;&lt;pre class="code"&gt;new Ajax.InPlaceEditor(e, "/example/modify_text", {&lt;br /&gt;    callback: function(f, v) {&lt;br /&gt;        return "text=" + encodeURIComponent(v);&lt;br /&gt;    },&lt;br /&gt;    ajaxOption: {method: "post"}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;そこで思いついたのが encodeURIComponent を 2回行う方法。これでサーバ側で個別にデコードしてやれば良いです。JavaScript を使って日本語パラメータを送信する必要があるところだけです。&lt;br /&gt;&lt;pre class="code"&gt;new Ajax.InPlaceEditor(e, "/example/modify_text", {&lt;br /&gt;    callback: function(f, v) {&lt;br /&gt;        return "double_encoded_text=" + encodeURIComponent(encodeURIComponent(v));&lt;br /&gt;    },&lt;br /&gt;    ajaxOption: {method: "post"}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;他に方法あるのかなぁ。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-1653661146963524393?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/1653661146963524393/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=1653661146963524393' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/1653661146963524393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/1653661146963524393'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2008/10/shiftjis-encodeuricomponent.html' title='Shift_JIS で encodeURIComponent'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-7569657911342141721</id><published>2008-10-17T06:26:00.003+09:00</published><updated>2008-10-17T06:56:44.886+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='携帯'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラム'/><title type='text'>mod_ktai を試しました</title><content type='html'>避けてきた携帯3キャリアの絵文字対応をすることになりました。&lt;br /&gt;&lt;br /&gt;色々さがして mod_ktai を試しましたが、3つの不満点が・・・&lt;br /&gt;&lt;br /&gt;1) 入力のフィルタはしてくれない&lt;br /&gt;2) UTF-8 での閉じるダブルコーテーションが外れるバグ&lt;br /&gt;3) ダブルコーテーションバグを回避しようとして、UTF-8 で提供している他のサービスと分けて、VirtualHost 内に AddOutputFilterByType を記述してみたら、docomo 用のレスポンスヘッダ application/xhtml+xml に反応しないんです。&lt;br /&gt;そこで次のようにタイプを追加したら、docomo 端末でアクセスしても何故か PC 用の絵文字画像に変換されてしまう＞＜&lt;br /&gt;&lt;pre class="code"&gt;LoadModule ktai_emoji_module modules/mod_ktai_emoji.so&lt;br /&gt;KtaiEmojiConvertMode             auto&lt;br /&gt;KtaiEmojiConvertNativeEmojiDocomo   0&lt;br /&gt;KtaiEmojiEnableAddGuidOn            0&lt;br /&gt;KtaiEmojiHasIconFile                1&lt;br /&gt;KtaiEmojiIconDir           /img/emoji&lt;br /&gt;&lt;br /&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;ServerName example.com&lt;br /&gt;AddOutputFilterByType KTAI_EMOJI_OUTPUT_FILTER text/html application/xhtml+xml&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;おしい。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-7569657911342141721?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/7569657911342141721/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=7569657911342141721' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/7569657911342141721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/7569657911342141721'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2008/10/modktai.html' title='mod_ktai を試しました'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-8617082850101329036</id><published>2008-09-15T17:38:00.003+09:00</published><updated>2008-09-15T17:44:50.909+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラム'/><title type='text'>簡単クラスパス設定 シェルスクリプト</title><content type='html'>Java のクラスパス、設定するの正直面倒くさいです。そこで少しだけ便利なスクリプトを使っています。使い方はこんな感じ。&lt;br /&gt;&lt;pre class="code"&gt;Usage: . classpath.sh (option) [dir]&lt;br /&gt;(option)&lt;br /&gt;  -a  add CLASSPATH&lt;br /&gt;  -r  recursive&lt;/pre&gt;&lt;br /&gt;指定したディレクトリを走査して jar ファイルだけを環境変数 CLASSPATH に追加します。以下ソースです。&lt;br /&gt;&lt;pre class="code"&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;if [ -z "$1" ]; then&lt;br /&gt;  echo "Usage: . classpath.sh (option) [dir]"&lt;br /&gt;  echo "(option)"&lt;br /&gt;  echo "  -a    add CLASSPATH"&lt;br /&gt;  echo "  -r    recursive"&lt;br /&gt;  exit 0&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;_recursive=0&lt;br /&gt;_add=0&lt;br /&gt;dir=&lt;br /&gt;&lt;br /&gt;parse_arguments() {&lt;br /&gt;  for arg do&lt;br /&gt;    case "$arg" in&lt;br /&gt;      -r) _recursive=1 ;;&lt;br /&gt;      -a) _add=1 ;;&lt;br /&gt;      *) dir=$arg ;;&lt;br /&gt;    esac&lt;br /&gt;  done&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;classpath() {&lt;br /&gt;  for i in "$1"/*; do&lt;br /&gt;    if [ -d "$i" -a $_recursive -eq 1 ]; then&lt;br /&gt;      classpath "$i"&lt;br /&gt;    elif [ "${i##*.}" = "jar" ]; then&lt;br /&gt;      _classpath=$_classpath:$i&lt;br /&gt;    fi&lt;br /&gt;  done&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if [ $_add -eq 1 ]; then&lt;br /&gt;  _classpath=$CLASSPATH&lt;br /&gt;  if [ -z "$_classpath" ] ; then&lt;br /&gt;    _classpath=.&lt;br /&gt;  fi&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;parse_arguments $*&lt;br /&gt;classpath "$dir"&lt;br /&gt;export CLASSPATH=$_classpath&lt;br /&gt;unset _classpath&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-8617082850101329036?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/8617082850101329036/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=8617082850101329036' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/8617082850101329036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/8617082850101329036'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2008/09/blog-post.html' title='簡単クラスパス設定 シェルスクリプト'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-952281200000592126.post-631717924855532075</id><published>2008-08-29T13:30:00.005+09:00</published><updated>2008-08-29T14:05:11.957+09:00</updated><title type='text'>上流工程と下流工程の別の呼び方</title><content type='html'>いわゆるウォーターフォール開発の工程で、企画から要件定義や設計は「上流工程」、プログラミングからテストや運用は「下流工程」にあたります。私はこの言葉あまり好きではありません。&lt;br /&gt;&lt;br /&gt;水が流れる → 川 をイメージして出来たのでしょうが、どうも下流はイメージが良くないです。&lt;br /&gt;日本だけですかね？これって。&lt;br /&gt;&lt;br /&gt;全工程を半分に割ってそれぞれを呼べばよいのですが、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;前半工程、後半工程&lt;/li&gt;&lt;li&gt;往路工程、復路工程&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;むむむ。どれもしっくりこないですねぇ。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/952281200000592126-631717924855532075?l=blog.utils.jp' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.utils.jp/feeds/631717924855532075/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=952281200000592126&amp;postID=631717924855532075' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/631717924855532075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/952281200000592126/posts/default/631717924855532075'/><link rel='alternate' type='text/html' href='http://blog.utils.jp/2008/08/blog-post_29.html' title='上流工程と下流工程の別の呼び方'/><author><name>もじゃ</name><uri>http://www.blogger.com/profile/09064340083055620803</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
