<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DEYBRH45fSp7ImA9WhRVFEU.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178</id><updated>2012-01-14T05:22:35.025+09:00</updated><category term="Xperia mini" /><category term="NyARToolkit" /><category term="SmartTraining" /><category term="IS03" /><category term="Arc" /><category term="LibAndrotranslation" /><category term="Xperia" /><category term="Google Fusion Table API" /><category term="open cola" /><category term="その他" /><category term="Security" /><category term="Fusion Table" /><category term="AWS" /><category term="Mixi" /><category term="イベント" /><category term="Google Apps Device Policy" /><category term="リク美女カレンダー" /><category term="Galaxy Tab" /><category term="HT-03A" /><category term="LiveView" /><category term="ANT+" /><category term="Honeycomb" /><category term="Google Maps Data API" /><category term="BeautyAlbum" /><category term="Android" /><category term="Palm Pre" /><category term="Facebook" /><category term="skyhook" /><category term="RKBJ" /><title>なにがでるか</title><subtitle type="html">モバイルがらみを中心としてコンピュータ関連のネタその他諸々を不定期で更新。</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://awwa500.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>85</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/iUnjw" /><feedburner:info uri="blogspot/iunjw" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DEYBRH4_eCp7ImA9WhRVFEU.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-2885284390878792884</id><published>2012-01-14T05:05:00.000+09:00</published><updated>2012-01-14T05:22:35.040+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-14T05:22:35.040+09:00</app:edited><title>ググれカス plug-in for twicca 1.1 リリースしました</title><content type="html">&lt;a href="https://market.android.com/details?id=com.awwa.twicca.plugin.gugurekasu" target="_blank"&gt;ググれカス plug-in for twicca&lt;/a&gt; の新バージョン1.1をリリースしました。今回のバージョンでは、以下を修正しています。&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;
ggrks plug-in enables to search the words in tweet .&lt;br /&gt;
This plug-in is for twicca.&lt;br /&gt;
ggrks means "You should search the word in google before ask other. fuckin' novice!".&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
あと、他の修正は微調整ということで。&lt;br /&gt;
その他としては、「ggrks」、「ググれカス」あたりでも検索に引っかかるように紹介文を変更してみたり。&lt;br /&gt;
&lt;br /&gt;&lt;/div&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/5587841204043490178-2885284390878792884?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CsRT-rj3Yav4wni4JBWuYSJ9_zM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CsRT-rj3Yav4wni4JBWuYSJ9_zM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CsRT-rj3Yav4wni4JBWuYSJ9_zM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CsRT-rj3Yav4wni4JBWuYSJ9_zM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/uEtd_ZR6vfs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/2885284390878792884/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2012/01/plug-in-for-twicca-11.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/2885284390878792884?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/2885284390878792884?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/uEtd_ZR6vfs/plug-in-for-twicca-11.html" title="ググれカス plug-in for twicca 1.1 リリースしました" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2012/01/plug-in-for-twicca-11.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4FSHszfip7ImA9WhRVEEk.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-2031140509308357543</id><published>2012-01-09T02:05:00.001+09:00</published><updated>2012-01-09T02:48:39.586+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-09T02:48:39.586+09:00</app:edited><title>ググれカス plug-in for twicca 公開</title><content type="html">新年明けましておめでとうございます。正月はTVを全く観ていないせいか、正月気分には浸れませんでしたが、表題の件、&lt;a href="https://market.android.com/details?id=com.awwa.twicca.plugin.gugurekasu" target="_blank"&gt;公開&lt;/a&gt;しました。&lt;br /&gt;
&lt;br /&gt;
twiccaで表示されているツイートの内容から単語を抽出し、ググるためのプラグインです。似たようなモノはありそうですが、まぁ、いいでしょう。&lt;br /&gt;
TL上のネットジャンキーのスラングがわけわかめー！という状況で使えるかもしれません。でも、わけわかめなスラングが単語として抽出できるかはわかりません。&lt;br /&gt;
&lt;br /&gt;
◆使い方&lt;br /&gt;
わけわかめなツイートを選択して、メニュー上から「ググれカス」を選択。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-YHMq688-yJM/TwnOCw7zuaI/AAAAAAAAEb0/OiUxFLbZupk/s1600/device-2012-01-09-015141.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-YHMq688-yJM/TwnOCw7zuaI/AAAAAAAAEb0/OiUxFLbZupk/s320/device-2012-01-09-015141.png" width="213" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
単語抽出されるまでしばし待つ。抽出されたら検索したい単語を選択する。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-Z1kJilsbv6s/TwnOFKK-s3I/AAAAAAAAEb8/vVLExgUXF4g/s1600/device-2012-01-09-015223.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-Z1kJilsbv6s/TwnOFKK-s3I/AAAAAAAAEb8/vVLExgUXF4g/s320/device-2012-01-09-015223.png" width="213" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
ググる。&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-JLP7ppeNEP8/TwnOHOhgBBI/AAAAAAAAEcE/EdynaOU-iNk/s1600/device-2012-01-09-015353.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-JLP7ppeNEP8/TwnOHOhgBBI/AAAAAAAAEcE/EdynaOU-iNk/s320/device-2012-01-09-015353.png" width="213" /&gt;&lt;/a&gt;&lt;/div&gt;
以上。&lt;br /&gt;
&lt;br /&gt;
◆仕組み&lt;br /&gt;
1. twiccaからTweetの文字列を受け取る。&lt;br /&gt;
2. 形態素解析とキーフレーズ抽出により単語抽出を行う。&lt;br /&gt;
3. 抽出した単語を一覧表示。&lt;br /&gt;
4. 選択された単語をググる。&lt;br /&gt;
単純ですね。&lt;br /&gt;
&lt;br /&gt;
難点は2.をWebサービスを利用して行っているので、&lt;br /&gt;
・数秒待たされる。なんて致命的。&lt;br /&gt;
・特に乱れた日本語の場合、思ったとおりに単語抽出してくれないことがある。なぁんて致命的。&lt;br /&gt;
って感じです。&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/5587841204043490178-2031140509308357543?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VuUpb15I7dCBV_gGOeuGdc8yKYY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VuUpb15I7dCBV_gGOeuGdc8yKYY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VuUpb15I7dCBV_gGOeuGdc8yKYY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VuUpb15I7dCBV_gGOeuGdc8yKYY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/WEo-yi1o_CM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/2031140509308357543/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2012/01/plug-in-for-twicca.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/2031140509308357543?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/2031140509308357543?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/WEo-yi1o_CM/plug-in-for-twicca.html" title="ググれカス plug-in for twicca 公開" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-YHMq688-yJM/TwnOCw7zuaI/AAAAAAAAEb0/OiUxFLbZupk/s72-c/device-2012-01-09-015141.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2012/01/plug-in-for-twicca.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcERHw7cSp7ImA9WhRWE0k.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-8251415312287762503</id><published>2011-12-31T23:49:00.000+09:00</published><updated>2011-12-31T23:50:05.209+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-31T23:50:05.209+09:00</app:edited><title>2年ちょっとを振り返って</title><content type="html">2009/10/17にver.1.0.0をリリースして以来、2年ちょっとの期間で94回のリリースを行ったSmartTraining。ver.6.8.1。たぶん、今年はこれが最後のリリースになると思うので、まとめてこれまでのことを振り返ってみます。去年は振り返ってなかったので今回2年分まとめて。&lt;br /&gt;
&lt;br /&gt;
ver.1.0.0(2009/10/17)のスクリーンキャプチャ。&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-WeRYw1OEmwQ/Tv33ElhYELI/AAAAAAAAEaM/DGgtBaWamiY/s1600/device-2011-12-31-023318.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-WeRYw1OEmwQ/Tv33ElhYELI/AAAAAAAAEaM/DGgtBaWamiY/s200/device-2011-12-31-023318.png" width="133" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;トップ画面(ver.1.0.0)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-H2ZSk8o-ap0/Tv33HvihIgI/AAAAAAAAEaU/T2tiVZiZNBA/s1600/device-2011-12-31-023237.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-H2ZSk8o-ap0/Tv33HvihIgI/AAAAAAAAEaU/T2tiVZiZNBA/s200/device-2011-12-31-023237.png" width="133" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;計測画面(ver.1.0.0)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div style="text-align: center;"&gt;
&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-uh_yaLujbrQ/Tv33JTPTAuI/AAAAAAAAEac/K5jasdW0aWg/s1600/device-2011-12-31-023245.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-uh_yaLujbrQ/Tv33JTPTAuI/AAAAAAAAEac/K5jasdW0aWg/s200/device-2011-12-31-023245.png" width="133" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;設定画面(ver.1.0.0)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
とにかく、「入門書読みながら初めて作りました」的な雰囲気が満載ですね。元々、Androidで動く万歩計が欲しかったのと、GPSデータの取り扱いの練習用に作ってみようということで作り始めたアプリでした。最初はServiceの使い方も手探り(つい最近のバージョンでようやく正しい使い方を知ったのですが)で、画面を閉じると計測も止まってしまう作りでした。ボタンや画面テーマも標準のものをそのまま使った貧相なもの。アイコンの作り方を知らなかったので、画面上に画像リソースは皆無。ただ、画面は殺風景ですが、基本的な画面遷移や構成は今と変わっていません。MapViewによる地図表示とGoogle Calendarにデータを保存するという機能が最初からありました。&lt;br /&gt;
確か、最初に作ろうと思ってから初期バージョンをリリースするまで3ヶ月ほどかかったと記憶しています。たぶん、今これと同じ機能を作ったら1日あれば余裕で作れます。というか、コードを書くことより、どういう画面遷移にしたら使いやすいか？、どういう機能があったら楽しいか？という点を考えることに時間を多く割いていました。あと、たった一個のアプリケーションアイコンがどうしても作れなくて結局嫁さんに作ってもらいました。&lt;br /&gt;
江川さんの「&lt;a href="http://ascii.asciimw.jp/books/books/detail/978-4-04-867956-5.shtml" target="_blank"&gt;Google Androidプログラミング入門&lt;/a&gt;」片手にひたすら真似するところからスタート。この本には本当にお世話になりました。&lt;br /&gt;
&lt;br /&gt;
そしてVer.6.8.1(2011/12/30)のスクリーンキャプチャ。&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-dL0rCbDF4UE/Tv37gFoY6HI/AAAAAAAAEao/T8nP8zAYd68/s1600/device-2011-12-31-023400.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-dL0rCbDF4UE/Tv37gFoY6HI/AAAAAAAAEao/T8nP8zAYd68/s200/device-2011-12-31-023400.png" width="133" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;トップ画面(ver.6.8.1)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-FcXC3-gnt-E/Tv37i5FNaEI/AAAAAAAAEa0/nIyv_3_8n6g/s1600/device-2011-12-31-023438.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-FcXC3-gnt-E/Tv37i5FNaEI/AAAAAAAAEa0/nIyv_3_8n6g/s200/device-2011-12-31-023438.png" width="133" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;計測画面(ver6.8.1)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-pSLKza6Ah-k/Tv37jSeacKI/AAAAAAAAEbA/Z0nJB6RYxSs/s1600/device-2011-12-31-023449.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-pSLKza6Ah-k/Tv37jSeacKI/AAAAAAAAEbA/Z0nJB6RYxSs/s200/device-2011-12-31-023449.png" width="133" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;設定画面(ver.6.8.1)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-BJo4JWQr8Ds/Tv37lP-IsEI/AAAAAAAAEbE/BlZqBg-XqrI/s1600/device-2011-12-31-023521.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-BJo4JWQr8Ds/Tv37lP-IsEI/AAAAAAAAEbE/BlZqBg-XqrI/s200/device-2011-12-31-023521.png" width="133" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;ラリー画面(ver6.8.1)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
だいぶ賑やかになりました。アプリを作っていて途中で気づいたのですが、GPS万歩計アプリはいろいろな技術要素の練習台としてはとても良い題材だったと思います。&lt;br /&gt;
・位置情報やMapViewの取り扱い&lt;br /&gt;
・方位センサーと連動して回転する地図&lt;br /&gt;
・Serviceによるバックグラウンド処理&lt;br /&gt;
・タイマー、AlarmManagerの利用&lt;br /&gt;
・Notificationによる音声・振動・画面通知&lt;br /&gt;
・AccountManagerやGoogle Data APIs(Calendar、Fusion tables、Docs)との連携&lt;br /&gt;
・AWSとの連携&lt;br /&gt;
・他アプリ(特にTwitter)との連携&lt;br /&gt;
・Felica連携(串かつ経由)&lt;br /&gt;
・Mixi voiceやFacebookなどのSNSとの連携&lt;br /&gt;
・音声合成サービスとの連携&lt;br /&gt;
・加速度、方位センサーの利用&lt;br /&gt;
・ANT+対応の外部センサーの利用&lt;br /&gt;
・カスタムViewによるグラフ描画&lt;br /&gt;
・QuickAction&lt;br /&gt;
・LibAndroTranslationによる翻訳サービス&lt;br /&gt;
・画面テーマ&lt;br /&gt;
・有料アプリ&lt;br /&gt;
・広告&lt;br /&gt;
&lt;br /&gt;
本質的に不要なものもあるかもしれませんが、自分としてはそんなことはどうでもよくて、全てのモチベーションは「その機能を使ってみたいから取り込んでみる」でした。結果、全体的にちぐはぐになったと思います。行き当たりばったりで追加した機能ばかりなので当然です。練習用に作ったアプリなのでそれで問題ありません。&lt;br /&gt;
&lt;br /&gt;
中でもラリー機能は、特に思い出深い機能です。子どもがもうすぐ産まれる、というタイミングでこの機能を思いついて、ラリーのコースデータを作っている途中で産まれました。車で1時間以上かかる病院に毎日のように通ってから帰ってきてからデータを夜中まで作る、という繰り返しでした。眠い中ひたすらGoogle Earthの画面上をクリックしてコースデータをチマチマ作っていて肘が痛かったことを覚えています。&lt;br /&gt;
&lt;br /&gt;
たぶん、アプリを作って公開されている方は皆さん感じていると思いますが、ユーザさんからのフィードバックが最も大きな収穫物だったと思います。時にはけちょんけちょんに叩かれることもありますが、現実世界でそこまでダメ出しされる機会というのはそうそうありません。ダメなところは時間をかけて真摯に改善していくことで必ず良い評価を得られると感じています。&lt;br /&gt;
&lt;br /&gt;
それと、いったん世間に公開してユーザさんがつくと、そのアプリは開発者個人のものだけではなく、ユーザさんのもの、という扱いをされることも認識しました。ユーザが望まないことは開発者といえども自由にはならないのだと。&lt;br /&gt;
&lt;br /&gt;
私の場合、Androidアプリを作成する作業に割り当てることのできる時間は、仕事を終えて、家に帰ってきて、家の事柄全てを終えた後のほんの僅かな自由時間だけです。たぶん1日平均30分もないと思います。本職ではあまりコードを書く機会はなく、見積もり、営業への同行、PLなどが主な仕事です。コードを書いていないとだんだんと見積もりの精度や技術的な難易度に対する勘が鈍くなり、自信を持って捌けなくなる場面が多いと感じています。アプリを作り始めてから、少なくともAndroid関連の案件であれば（判断が正しいかどうかはともかく）自信を持って捌けるようになったと思います。&lt;br /&gt;
&lt;br /&gt;
まだまだやりたい事がたくさん溜まっています。現在のところ30項目ほどあります。十分時間が取れないのでなかなか消化できません。それどころか、どんどん増えていきます。&lt;br /&gt;
&lt;br /&gt;
2011年の1年間に限っていうと、年間の目標としては、&lt;br /&gt;
1.ダウンロード数：25万&lt;br /&gt;
2.女子ウケ&lt;br /&gt;
3.日本以外でのユーザを増やす&lt;br /&gt;
でした。&lt;br /&gt;
1.については目標まであと8000というところまで来ましたが、残念ながら達成できそうにありません。2.はピンクの画面を作ってみましたということで頑張ってみました。達成できたかどうかは指標がないのでわかりませんが、某電話会社の女性向けスマホキャンペーン用パンフレットに何度も掲載していただいたので、広告制作側の方からは一応認識していただいたのではないかと勝手に思っています。3.については完全に失敗でした。たぶん、海外には日本国内よりも優れたサービスがあるからだろうと思っています。&lt;br /&gt;
&lt;br /&gt;
2012年の目標としては、&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;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5587841204043490178-8251415312287762503?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3ewXZrIy6atyRxb0a5k1szDUiIQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3ewXZrIy6atyRxb0a5k1szDUiIQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3ewXZrIy6atyRxb0a5k1szDUiIQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3ewXZrIy6atyRxb0a5k1szDUiIQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/VSoixQN-850" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/8251415312287762503/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/12/2.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/8251415312287762503?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/8251415312287762503?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/VSoixQN-850/2.html" title="2年ちょっとを振り返って" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-WeRYw1OEmwQ/Tv33ElhYELI/AAAAAAAAEaM/DGgtBaWamiY/s72-c/device-2011-12-31-023318.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/12/2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMARHg9eip7ImA9WhRWEEg.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-923686632509531155</id><published>2011-12-28T15:30:00.000+09:00</published><updated>2011-12-28T15:40:45.662+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-28T15:40:45.662+09:00</app:edited><title>AccountManagerから取得したauthtokenを使用するとFusion Tablesへのアップロードに失敗する件</title><content type="html">ユーザの認証情報をAccountManagerに変更した時から、時々「Fusion Tablesへのアップロードに失敗する」という報告を受けるようになりました。&lt;br /&gt;
手元にある端末で確認してみると、4台中1台だけがどうしてもうまくアップロードできません。エラーはcreate table時に401。&lt;br /&gt;
その後、原因がわからないまま1ヶ月程度過ぎた頃、またアップロードを試してみると、先日うまくアップロード出来ていた他の端末もことごとくエラーcreate table時に401が出ていることを確認。&lt;br /&gt;
&lt;br /&gt;
なんだろうねぇ。何気にと思いググって情報がみたら見つかりました。&lt;br /&gt;
http://d.hatena.ne.jp/yellow_73/20110819&lt;br /&gt;
まさにこれ。この問題です。&lt;br /&gt;
&lt;br /&gt;
端末に保存されているtokenの賞味期限が切れているっぽい。&lt;br /&gt;
401が発生したらAccountManager#invalidateAuthToken()を呼んでauthtokenを破棄した上でもう一回最初から認証のやり直しをすることでうまくアップロード出来るようになりました。&lt;br /&gt;
&lt;br /&gt;
Google DocsやGoogle Calendarにも似たような仕組みで認証かけてデータアップロードしているのに、こちらではそんな状況に陥ったことがない。なんでだろう？Fusion Tablesはtokenの賞味期限が他サービスよりもかなり短くせっていされているのか？と思いました。実際のところわかりませんが。&lt;br /&gt;
&lt;br /&gt;
「&lt;span style="background-color: #141414; color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"&gt;AccountManagerのgetAuthToken()をReflectionでヤッてみた&lt;/span&gt;」で書いたとおり、私のアプリは1.6もサポートしているので、AccountManagerを普通に使うことができない。というわけで、これまたReflectionの登場。前回の記事読めばReflectionのパターンはわかりますよね。ということで省略。&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/5587841204043490178-923686632509531155?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jhhw7WohM7IcRgSQxlRZsgciufY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jhhw7WohM7IcRgSQxlRZsgciufY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jhhw7WohM7IcRgSQxlRZsgciufY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jhhw7WohM7IcRgSQxlRZsgciufY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/EU6faYoM3f4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/923686632509531155/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/12/accountmanagerauthtokenfusion-tables.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/923686632509531155?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/923686632509531155?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/EU6faYoM3f4/accountmanagerauthtokenfusion-tables.html" title="AccountManagerから取得したauthtokenを使用するとFusion Tablesへのアップロードに失敗する件" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/12/accountmanagerauthtokenfusion-tables.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYAQXk_cCp7ImA9WhRRFE0.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-8480725082691678667</id><published>2011-11-27T23:46:00.001+09:00</published><updated>2011-11-28T00:35:40.748+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-28T00:35:40.748+09:00</app:edited><title>地味だけど重要な変更</title><content type="html">久々にSmartTrainingのバージョンアップ(6.6.0)を行いました。


&lt;br /&gt;
今回のバージョンでは、地味だけど重要な変更を加えています。&lt;br /&gt;
----&lt;br /&gt;
◇ Ver.6.6.0 変更内容&lt;br /&gt;
&lt;br /&gt;
・使用するパーミッションとライブラリの変更。&lt;br /&gt;
・Android 2.1以降でサービスをフォアグラウンドに設定&lt;br /&gt;
・Android 2.1以降で端末のGoogleアカウントと連動&lt;br /&gt;
・Android 2.1以降で過去に端末内に保存したGoogleパスワードの削除&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;・使用するパーミッションとライブラリの変更。&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
最近、Androidに対する情報セキュリティがいろいろとうるさくなってきました。アプリケーションが持つパーミッションに対する意識も高くなり、ただの万歩計なのになんでそんなパーミッションが必要なの？とコメントをいただくこともでてきました。このアプリケーションは元々私自身がAndroidアプリ作成と公開を通じて様々な知見を得ることが目的で作り始めたものでした。そのため、通常の利用者が必要としないいくつかの機能を含んでいます。ここのところ実験的に取り入れた機能のために与えたパーミッションが増えてきたので、一度整理してみました。合わせて、使用しているパーミッションとその使用目的をAndroid Market上に公開しました。&lt;/div&gt;
&lt;div&gt;
----&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
このアプリケーションが使用する各パーミッションが必要な理由は以下の通りです。&lt;/div&gt;
&lt;div&gt;
・データをGoogleサービスにアップロードする際に端末内のGoogleアカウント設定を使用するために必要としています。&lt;/div&gt;
&lt;div&gt;
android.permission.USE_CREDENTIALS&lt;/div&gt;
&lt;div&gt;
android.permission.GET_ACCOUNTS&lt;/div&gt;
&lt;div&gt;
android.permission.AUTHENTICATE_ACCOUNTS&lt;/div&gt;
&lt;div&gt;
・画面テーマ変更時に自アプリケーションのリセットのために必要としています。&lt;/div&gt;
&lt;div&gt;
android.permission.KILL_BACKGROUND_PROCESSES&lt;/div&gt;
&lt;div&gt;
・GPSによる位置情報を取得するために必要としています。&lt;/div&gt;
&lt;div&gt;
android.permission.ACCESS_FINE_LOCATION&lt;/div&gt;
&lt;div&gt;
・広告モジュールが動作するために必要としています。&lt;/div&gt;
&lt;div&gt;
android.permission.ACCESS_NETWORK_STATE&lt;/div&gt;
&lt;div&gt;
・データの送信および、広告モジュールが動作するために必要としています。&lt;/div&gt;
&lt;div&gt;
android.permission.INTERNET&lt;/div&gt;
&lt;div&gt;
・定期通知のために必要としています。&lt;/div&gt;
&lt;div&gt;
android.permission.VIBRATE&lt;/div&gt;
&lt;div&gt;
・画面OFF時にCPUがスリープしないようにするために必要としています。&lt;/div&gt;
&lt;div&gt;
android.permission.WAKE_LOCK&lt;/div&gt;
&lt;div&gt;
・バックアップデータをSDカードに出力するために必要としています。&lt;/div&gt;
&lt;div&gt;
android.permission.WRITE_EXTERNAL_STORAGE&lt;/div&gt;
&lt;div&gt;
・ANTデバイスを制御するために必要としています。ANTデバイスをサポートする端末でのみ有効です。&lt;/div&gt;
&lt;div&gt;
com.dsi.ant.permission.ANT_ADMIN&lt;/div&gt;
&lt;div&gt;
com.dsi.ant.permission.ANT&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
----&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;・Android 2.1以降でサービスをフォアグラウンドに設定&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
これまで、計測中に動作するサービスはService.setForeground()を使用していました。これって、APILevel4までしか有効じゃなかったんです。Level5以降はService.startForeground()なるものが用意されていましたが、Reflectionを使わないと1apkで複数のバージョンに対応できなかったので、面倒臭がって対応していませんでした。今回、Reflectionを使ってService.startForeground()に対応しました。やり方は&lt;a href="http://developer.android.com/intl/ja/reference/android/app/Service.html" target="_blank"&gt;ここ&lt;/a&gt;に書いてある通り。これで、画面がバックグラウンドにまわったら落ちやすい、とかいう現象が解消されるのではないかと期待しています。期待しているだけで、絶対大丈夫とは言いませんし、自分の場合、落ちやすい現象を再現できないので気休めだと思っています。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;・Android 2.1以降で端末のGoogleアカウントと連動&lt;/span&gt;&lt;br /&gt;
APILevel5以降で使用可能になったAccountManager対応をしました。AccountManagerを利用することで、ユーザは以下のメリットを受けることが出来ます。&lt;br /&gt;
・アカウントとパスワードをこのアプリケーションのためだけに再入力が不要になる。&lt;br /&gt;
・このアプリケーションがアカウントとパスワード情報をどこかに送信しているのではないかという不安を解消できる。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ちなみにLevel4以前ではAccountManagerが利用できないので既存の動作と同じです。両方のバージョンに対応するのは面倒なので、早くLevel4以前の端末には爆発して欲しいです。っていうかもう対応しちゃったんでどうでもいいです。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;・Android 2.1以降で過去に端末内に保存したGoogleパスワードの削除&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;div&gt;
もうこのアプリケーションでは保存する必要がなくなったので自動的に消します。&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
あと、どこにも記載していませんが、こっそりminSDKVersionを3から4に変更しました。さようならLevel3。たぶん、影響を受けるユーザのほとんどはHTC myTouch3Gかと思われます。でも、大丈夫。最近のAndroid MarketはマルチAPK機能をサポートしているのでLevel3の端末からでも旧バージョンのSmartTrainingはインストールできるはずです。マルチAPKマンセー。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5587841204043490178-8480725082691678667?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xEg8MoewK6CotS78YQPQNB9vRoQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xEg8MoewK6CotS78YQPQNB9vRoQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xEg8MoewK6CotS78YQPQNB9vRoQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xEg8MoewK6CotS78YQPQNB9vRoQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/HWdSeHxCvgQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/8480725082691678667/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/11/blog-post.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/8480725082691678667?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/8480725082691678667?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/HWdSeHxCvgQ/blog-post.html" title="地味だけど重要な変更" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/11/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIFQ3s-eyp7ImA9WhRSF08.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-5589049932555598921</id><published>2011-11-20T01:33:00.000+09:00</published><updated>2011-11-20T01:35:12.553+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-20T01:35:12.553+09:00</app:edited><title>AccountManagerのgetAuthToken()をReflectionでヤッてみた</title><content type="html">AccountManager#getAuthToken()を利用することでAndroid端末に登録したアカウント情報のTokenが取得できます。普通の使い方は&lt;a href="http://d.hatena.ne.jp/adsaria/20101012" target="_blank"&gt;こちらあたり&lt;/a&gt;に詳しく載っています。&lt;br /&gt;&lt;br /&gt;これを利用することで例えばGoogle Serviceへのアクセス時認証に利用できます。取得したTokenをClientLoginの際のAuthに設定してやればOKです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;と、普通はこれで話が済んでしまうのですが、AccountManagerはAPI Level 5以降じゃないと利用できない。これより古い環境でこのコードを実行するとjava.lang.VerifyErrorが起きてしまいます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;これは後方互換性の問題です。Androidアプリを開発する際に気をつけなければいけないのがこの問題。詳しい対処方法は&lt;a href="http://android-developers.blogspot.com/2009/04/backward-compatibility-for-android.html" target="_blank"&gt;こちら&lt;/a&gt;に掲載されています。これらの対処方法のうち、今回はReflectionを利用することで回避してみました。当然のことながら、Reflectionを使ったからといって古い環境でAccountManagerの機能が使えるようになるわけではありません。実行時のVerifyErrorが回避されるだけです。同等のことを古い環境でやる場合は、&lt;a href="http://code.google.com/intl/ja/apis/gdata/docs/developers-guide.html" target="_blank"&gt;Google Data API&lt;/a&gt;のClientLoginなりをHTTPリクエスト送ってやればOKです。Java(Android)向けのライブラリも公開されているのでそれを使っても良いと思います。まぁそれはそれで置いといて。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;今回主題のやり方はこちら。&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;public class AuthenticatorAfterForoyo extends AuthenticatorBase {&lt;br /&gt; &lt;br /&gt; private static final String ACCOUNT_TYPE_GOOGLE = "com.google";&lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * コンストラクタ&lt;br /&gt;  * @param context&lt;br /&gt;  */&lt;br /&gt; public AuthenticatorAfterForoyo(Context context)&lt;br /&gt; {&lt;br /&gt;  super(context);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * トークンの取得&lt;br /&gt;  * @param account&lt;br /&gt;  * @param passwd 不使用&lt;br /&gt;  * @param service&lt;br /&gt;  */&lt;br /&gt; public void getAuthToken(String acc, String passwd, String service)&lt;br /&gt; {&lt;br /&gt;  try {&lt;br /&gt;   // AccountManagerクラス取得&lt;br /&gt;   Class accountManager = Class.forName("android.accounts.AccountManager");&lt;br /&gt;&lt;br /&gt;   // Accountクラス取得&lt;br /&gt;   Class account = Class.forName("android.accounts.Account");&lt;br /&gt;&lt;br /&gt;   // AccountManagerCallback&lt;bundle&gt;のクラス取得&lt;br /&gt;   Class accountManagerCallback = Class.forName("android.accounts.AccountManagerCallback");&lt;br /&gt;   &lt;br /&gt;   InvocationHandler handler = new MyInvocationHandler();&lt;br /&gt;   &lt;br /&gt;   @SuppressWarnings("rawtypes")&lt;br /&gt;   Class[] proxyInterfaces = new Class[] { accountManagerCallback };&lt;br /&gt;   Object accountManagerCallbackInstance = Proxy.newProxyInstance(&lt;br /&gt;     accountManagerCallback.getClassLoader(), &lt;br /&gt;     proxyInterfaces, &lt;br /&gt;     handler);&lt;br /&gt;&lt;br /&gt;   if ( accountManagerCallbackInstance == null )&lt;br /&gt;   {&lt;br /&gt;    Log.w(Define.TAG, "accountManagerCallbackInstance is null");&lt;br /&gt;    return;&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   // getメソッド&lt;br /&gt;   Method get = accountManager.getMethod("get", Context.class);&lt;br /&gt;   if ( get == null )&lt;br /&gt;   {&lt;br /&gt;    Log.w(Define.TAG, "get is null");&lt;br /&gt;    return;&lt;br /&gt;   }&lt;br /&gt;   // AccountManagerクラスインスタンス取得&lt;br /&gt;   Object accountManagerInstance = (Object)get.invoke(accountManager, context);&lt;br /&gt;   if ( accountManagerInstance == null )&lt;br /&gt;   {&lt;br /&gt;    Log.w(Define.TAG, "accountManagerInstance is null");&lt;br /&gt;    return;&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   // AccountManager.getAuthToken()メソッド&lt;br /&gt;   Method getAuthToken = null;&lt;br /&gt;   Method[] accountManagerMethods = accountManager.getMethods();&lt;br /&gt;   for ( int i = 0; i &amp;lt; accountManagerMethods.length; i++ )&lt;br /&gt;   {&lt;br /&gt;    Method method = accountManagerMethods[i];&lt;br /&gt;    if ( method.getName().equals("getAuthToken") )&lt;br /&gt;    {&lt;br /&gt;     // 引数の数とタイプが一致する関数を取得&lt;br /&gt;     // TODO もうちょっとスマートな解決方法はないものか？&lt;br /&gt;     // APILevel4以前の環境では引数の型特定にAccountだのAccountManagerCallbackだのを利用できないため、&lt;br /&gt;     // こんな無様な方法で関数を取得している。&lt;br /&gt;     Class[] types = method.getParameterTypes();&lt;br /&gt;     if ( types.length != 6 )&lt;br /&gt;      break;&lt;br /&gt;     if ( !types[0].getName().equals("android.accounts.Account") )&lt;br /&gt;      break;&lt;br /&gt;     if ( !types[1].getName().equals("java.lang.String") )&lt;br /&gt;      break;&lt;br /&gt;     if ( !types[2].getName().equals("android.os.Bundle") )&lt;br /&gt;      break;&lt;br /&gt;     if ( !types[3].getName().equals("android.app.Activity") )&lt;br /&gt;      break;&lt;br /&gt;     if ( !types[4].getName().equals("android.accounts.AccountManagerCallback") )&lt;br /&gt;      break;&lt;br /&gt;     if ( !types[5].getName().equals("android.os.Handler") )&lt;br /&gt;      break;&lt;br /&gt;     //Log.d("TAG", "Found getAuthToken() method");&lt;br /&gt;     getAuthToken = method;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   if ( getAuthToken == null )&lt;br /&gt;   {&lt;br /&gt;    Log.w(Define.TAG, "getAuthToken is null");&lt;br /&gt;    return;&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   // AccountManager.getAccountsByType()メソッド取得&lt;br /&gt;   Method getAccountsByType = accountManager.getMethod("getAccountsByType", String.class);&lt;br /&gt;   if ( getAccountsByType == null )&lt;br /&gt;   {&lt;br /&gt;    Log.w(Define.TAG, "getAccountsByType is null");&lt;br /&gt;    return;&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   // Accountクラスインスタンス取得&lt;br /&gt;   Object[] accountObject = (Object[])getAccountsByType.invoke(accountManagerInstance, ACCOUNT_TYPE_GOOGLE);&lt;br /&gt;&lt;br /&gt;   java.lang.reflect.Field name = account.getField("name");&lt;br /&gt;   if ( name == null )&lt;br /&gt;   {&lt;br /&gt;    Log.w(Define.TAG, "name is null");&lt;br /&gt;    return;&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   for ( Object ac : accountObject )&lt;br /&gt;   {&lt;br /&gt;    if ( name.get(ac).toString().equals(acc) )&lt;br /&gt;    {&lt;br /&gt;     //Log.d(Define.TAG, "getAuthToken.invoke() name : " + name.get(ac).toString());&lt;br /&gt;     getAuthToken.invoke(&lt;br /&gt;      accountManagerInstance, &lt;br /&gt;      ac, &lt;br /&gt;      service, &lt;br /&gt;      null,&lt;br /&gt;      context,&lt;br /&gt;      accountManagerCallbackInstance,&lt;br /&gt;      null);&lt;br /&gt;     return;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  } catch (ClassNotFoundException e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  } catch (SecurityException e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  } catch (NoSuchMethodException e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  } catch (IllegalArgumentException e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  } catch (IllegalAccessException e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  } catch (InvocationTargetException e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  } catch (NoSuchFieldException e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class MyInvocationHandler implements InvocationHandler {&lt;br /&gt; @Override&lt;br /&gt; public Object invoke(Object proxy, Method method, Object[] args)&lt;br /&gt;   throws Throwable {&lt;br /&gt;  try {&lt;br /&gt;   //Log.d(Define.TAG, "MyInvocationHandler#invoke() method : " + method.getName() + ", args.length : " + args.length);&lt;br /&gt;   if ( method.getName().equals("run") &amp;amp;&amp;amp; args.length == 1)&lt;br /&gt;   {&lt;br /&gt;    Class accountManagerFeature = Class.forName("android.accounts.AccountManagerFuture");&lt;br /&gt;    Method getResult = accountManagerFeature.getMethod("getResult", null);&lt;br /&gt;    if ( getResult == null )&lt;br /&gt;     return null;&lt;br /&gt;    Bundle bundle = (Bundle)getResult.invoke(args[0], null);&lt;br /&gt;    String token = bundle.getString("authtoken");&lt;br /&gt;    listener.onGotToken(token);&lt;br /&gt;   }&lt;br /&gt;  } catch (ClassNotFoundException e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  }&lt;br /&gt;  return null;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;InvocationHandlerとかProxy.newProxyInstance()とか初めて使ったでござる。&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/5587841204043490178-5589049932555598921?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wcdbaclW0y_UdAFW9iJJ4KIRLGw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wcdbaclW0y_UdAFW9iJJ4KIRLGw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wcdbaclW0y_UdAFW9iJJ4KIRLGw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wcdbaclW0y_UdAFW9iJJ4KIRLGw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/Kd963K7BKUA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/5589049932555598921/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/11/accountmanagergetauthtokenreflection.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/5589049932555598921?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/5589049932555598921?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/Kd963K7BKUA/accountmanagergetauthtokenreflection.html" title="AccountManagerのgetAuthToken()をReflectionでヤッてみた" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/11/accountmanagergetauthtokenreflection.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IHSXYyeyp7ImA9WhdbEkg.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-8091466920759874132</id><published>2011-10-04T18:29:00.001+09:00</published><updated>2011-10-11T00:12:18.893+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-11T00:12:18.893+09:00</app:edited><title>AppLog対応しました</title><content type="html">2011/10/10　日本Androidの会10月定例会での発表内容を見た後で追記。&lt;br /&gt;
&lt;br /&gt;
非常に残念な発表内容でした。&lt;br /&gt;
Androidの可能性そのものが潰されている気持ちでいっぱいです。&lt;br /&gt;
下記の内容を撤回します。&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
SmartTrainingで&lt;a href="http://www.applogsdk.com/ja"&gt;AppLog&lt;/a&gt;対応しました。&lt;br /&gt;
Twitterでもいろんな意味で&lt;a href="http://togetter.com/li/195685"&gt;盛り上がって&lt;/a&gt;（炎上？）いたり。
AppLogを検出する&lt;a href="http://blogs.itmedia.co.jp/fukuyuki/2011/10/applog-a1c3.html"&gt;ツール&lt;/a&gt;がでたり。&amp;nbsp;
&lt;br /&gt;
実際使ってみなきゃ意見を言ってもねぇ。ってことで、使ってみての感想です。&amp;nbsp;
&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;ul&gt;
&lt;li&gt;サービス開始時に確認画面が表示されるわけではない。&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;どのアプリにAppLogが組み込まれているかわからない。&amp;nbsp;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;ユーザとのインターフェイスとして送信確認画面しかないので、このタイミングでどのアプリ経由でAppLogが動いているのかがわからない。&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;一度許可したら後で拒否するための方法がある。&amp;nbsp;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Marketから「AppLog Opt-in」をインストールして拒否設定に変更できる。後付けで作ったのでこういう状態。いずれSDKに組み込んだほうが良さそう。&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;br /&gt;
◆それぞれのメリット・デメリット&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;開発者&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;メリット&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;月額報酬 or 収集したログのいずれかが貰える。まだ導入して間も無いので何ももらえてないけど、ログを使って新しい視点で今後の開発に活用していければいいな、と。これまでこういうサービスはなかったので貴重だと思う。（似たような情報はGoogleも収集しているはずだけど、Android端末に関する情報は提供されていないはず）ただ、実際何にどう使えるかは未知（データを見てないので）。&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;デメリット&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;ちゃんとユーザに説明しないと拒否反応に合う。&lt;/li&gt;
&lt;li&gt;当初、Marketの更新情報に「微調整」と書いたことで不評を買ってしまいました。まぁ、ユーザ観点でみたら気持ちいいものではないので、面倒くさがらずにちゃんと「AppLog入ってます」って書くべきだったか。反省してコメント修正しました。&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;li&gt;ユーザ&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;メリット&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;直接的には無い。間接的にはあるかもしれないが、結局開発者次第か。&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;デメリット&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;気持ち悪いと感じられる人には気持ち悪く感じられる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;br /&gt;
◆感情面&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;「ログを取ってもいい？」って聞かれるだけで無条件で拒否反応を示す人は確実にいる。それは理解できる。&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
◆その他&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;AppLogサービス紹介サイトに英語版を追加して欲しい。英語圏のユーザに対しても説明が必要。（欲を言うならそれ以外の言語も）&lt;/li&gt;
&lt;li&gt;まだこのサービスは始まったばかりで、今後どうなるかはわからないが、新しい試み。&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
AppLogはリスクをとって新しいビジネスモデルを模索してチャレンジしている。&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/5587841204043490178-8091466920759874132?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-DioTHIor_xlR-qCZk_cNHklLts/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-DioTHIor_xlR-qCZk_cNHklLts/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-DioTHIor_xlR-qCZk_cNHklLts/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-DioTHIor_xlR-qCZk_cNHklLts/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/K5Kc-d2-gkI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/8091466920759874132/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/10/applog.html#comment-form" title="3 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/8091466920759874132?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/8091466920759874132?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/K5Kc-d2-gkI/applog.html" title="AppLog対応しました" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/10/applog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4FSXs6cSp7ImA9WhdVF04.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-3211832974289998519</id><published>2011-09-23T07:41:00.008+09:00</published><updated>2011-09-23T08:08:38.519+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-23T08:08:38.519+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="リク美女カレンダー" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="RKBJ" /><title>Android向けリク美女カレンダー非公式クライアント「RKBJ」リリースしました</title><content type="html">&lt;a href="http://carippo.com/calendar/"&gt;リク美女カレンダー&lt;/a&gt;がイイので、非公式にAndroid向けクライアント作りました。&lt;br /&gt;ダウンロードは&lt;a href="https://market.android.com/details?id=com.awwa.rikubijo"&gt;こちら&lt;/a&gt;からどうぞ。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-Rp8xzZrVV6g/Tnu7bpLCqBI/AAAAAAAADOY/xjDFH-SpsbM/s1600/device-2011-09-23-005307.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 180px; height: 320px;" src="http://2.bp.blogspot.com/-Rp8xzZrVV6g/Tnu7bpLCqBI/AAAAAAAADOY/xjDFH-SpsbM/s320/device-2011-09-23-005307.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5655319840676816914" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-2-_d0yoNEgM/Tnu7hObPKtI/AAAAAAAADOg/FtOMJ1rhGyU/s1600/device-2011-09-23-005333.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 180px; height: 320px;" src="http://1.bp.blogspot.com/-2-_d0yoNEgM/Tnu7hObPKtI/AAAAAAAADOg/FtOMJ1rhGyU/s320/device-2011-09-23-005333.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5655319936576203474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;アイコン他、レイアウト等、各種リソースは他アプリの使い回しという雑な仕様だけどいいじゃないか。&lt;br /&gt;リク美女が見れればそれでいい。&lt;br /&gt;RKBJはリク美女カレンダーを応援しています。&lt;br /&gt;&lt;br /&gt;技術的には、&lt;br /&gt;・&lt;a href="http://home.ccil.org/~cowan/XML/tagsoup/"&gt;Tagsoup&lt;/a&gt;でHTMLパース&lt;br /&gt;・&lt;a href="http://code.google.com/p/androidcalendarview/"&gt;CalendarView&lt;/a&gt;をライブラリ化して利用&lt;br /&gt;・最初からFragmentを使って実装&lt;br /&gt;ってあたりが自分にとって新しい点です。&lt;br /&gt;&lt;br /&gt;今時は必要な部品が全部揃っているので楽ですね。&lt;br /&gt;設計＋実装＋試験で工数は7人時くらいでした。&lt;br /&gt;たぶんまだ動作がこなれていないかも。&lt;br /&gt;まぁ、いいか。&lt;br /&gt;&lt;br /&gt;あと、使ってみてCalendarViewにサムネイル画像を埋め込みたいな。&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/5587841204043490178-3211832974289998519?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/J2O3P84Q0Z5lTUuO6xU7B5VAbnA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/J2O3P84Q0Z5lTUuO6xU7B5VAbnA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/J2O3P84Q0Z5lTUuO6xU7B5VAbnA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/J2O3P84Q0Z5lTUuO6xU7B5VAbnA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/L9TitFFjgUY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/3211832974289998519/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/09/androidrkbj.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/3211832974289998519?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/3211832974289998519?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/L9TitFFjgUY/androidrkbj.html" title="Android向けリク美女カレンダー非公式クライアント「RKBJ」リリースしました" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-Rp8xzZrVV6g/Tnu7bpLCqBI/AAAAAAAADOY/xjDFH-SpsbM/s72-c/device-2011-09-23-005307.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/09/androidrkbj.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUNSXo9fSp7ImA9WhdVFEk.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-4676656300790226411</id><published>2011-09-19T22:14:00.004+09:00</published><updated>2011-09-19T22:51:38.465+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-19T22:51:38.465+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SmartTraining" /><category scheme="http://www.blogger.com/atom/ns#" term="ANT+" /><title>ANT+なセンサー対応4つ目</title><content type="html">　今年の5月にSmartTrainingがANT+なフットポッドに対応した後(&lt;a href="http://awwa500.blogspot.com/2011/05/ant.html"&gt;ANT+なセンサーに対応してみました&lt;/a&gt;)、8月くらいに心拍計に対応と徐々にANT+対応を進めてまいりましたが、ようやく今回のバージョンVer.6.5.0で3・4種類目のケイデンス、スピードセンサーに対応しました。手元にあるセンサーはこれで全部対応しました。車椅子向けにちゃんと使えるかどうかはユーザさんからの声が聞けていないのでわかりません。是非車椅子ユーザさんからのご意見を聞きたいです。&lt;br /&gt;◆対応済みANT+センサー&lt;br /&gt;　・フットポッド&lt;br /&gt;　・心拍計&lt;br /&gt;　・Bikeケイデンスセンサー&lt;br /&gt;　・Bikeスピードセンサー&lt;br /&gt;　実は今回対応したセンサーからデータが取れること自体は5月の時点で確認済みでしたが、常に行き当たりばったりで開発の進むSmartTrainingの機能にハマり込むように機能拡張するために周辺機能の改造に手間取りました。&lt;br /&gt;　以前のSmartTrainingは、GPSからの位置情報がない限り、リアルタイム系のデータ(例えば速度や心拍数など)は記録できないような作りになっていましたが、今回からセンサーから取れる情報は位置情報とは切り離して記録するようにしました。心拍数やケイデンスも同様に記録するようになっています。&lt;br /&gt;　また、「ストローク」を廃止しました。元々、これはトレーニングタイプ水泳を選択した際に水をかいた回数を加速度センサーでカウントしようとしたものでした。これまで利用していた方がいらっしゃったかどうかはわかりませんが、ご不満があれば連絡ください。復活させるかどうか考えます。&lt;br /&gt;　あとANT+的には体重計とBikeパワーセンサーに対応できるかもしれませんが、センサー機材を入手するのが費用的に困難なので、対応は難しいかもしれません。ただ、ご協力いただける方がいらっしゃれば対応できるかもしれません。特にBikeパワーセンサーについてはどなたかご協力いただけると助かります。&lt;br /&gt;　まぁ、いずれにしてもこれで約2年前に初期バージョンをリリースした当時から頭の中にあったデータの種類的にはほぼ全て対応し終えました。次は本格的にクラウド対応しようと思います。この対応が完了すると、データのソースがクラウド上に移行できるようになるので、端末を変えてもデータが引き継がれます。バックアップ機能の替わりにもなります。(対応しようと思っているだけなので本当に対応できるかどうかはまだ保証の限りではありませんが。) 他にはWebサイト対応もしたいし、通信処理のリトライ処理も追加したいし、もう少しわかりやすい設定画面構成にしたいし、チャート機能ももう少しちゃんとしたいし、Bluetooth 4.0なセンサー対応もしたいし、とやりたい事はどんどん増えるのに時間が足りない状況は続きますので、いつ何に対応できるかはわかりませんが。ちなみに今溜まっている追加機能候補の数は26項目。。。毎週増えてます。&lt;br /&gt;　というわけで、今後もどこまでも行き当たりばったりという戦略で進めていきます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5587841204043490178-4676656300790226411?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VLPKH6rYFadk2XW2AEgSV8ZMxKY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VLPKH6rYFadk2XW2AEgSV8ZMxKY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VLPKH6rYFadk2XW2AEgSV8ZMxKY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VLPKH6rYFadk2XW2AEgSV8ZMxKY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/iNLsg7KtKk0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/4676656300790226411/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/09/ant4.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/4676656300790226411?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/4676656300790226411?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/iNLsg7KtKk0/ant4.html" title="ANT+なセンサー対応4つ目" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/09/ant4.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4DRnY7eyp7ImA9WhdVFE4.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-7844457542392513656</id><published>2011-09-15T19:18:00.005+09:00</published><updated>2011-09-19T22:12:57.803+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-19T22:12:57.803+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="open cola" /><title>オープンコーラ事始め</title><content type="html">@LuckOfWiseさんが開催されていた&lt;a href="http://togetter.com/li/171227"&gt;オープンコーラ&lt;/a&gt;が楽しそうだったので、いろいろと調べていたら材料が高い高い。全部揃えると送料込みで2万円なんだとか。&lt;br /&gt;などとTwitterに投げていたら@LuckOfWiseさんから材料譲りますよ、とのありがたいお言葉が。&lt;br /&gt;じゃ、遠慮なく、ということで送って頂きました。&lt;br /&gt;※オープンコーラについて詳しくは&lt;a href="http://www.google.co.jp/search?sourceid=chrome&amp;ie=UTF-8&amp;q=Google+%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%A9"&gt;ググレカス&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="https://picasaweb.google.com/lh/photo/TZILGeQkLqz6Bjh2FOk0wpL8ACFvXNAKCrKvZtgA_Bk?feat=embedwebsite"&gt;&lt;img src="https://lh4.googleusercontent.com/-FPGTltWWxCU/TnHTXfdll2I/AAAAAAAADMw/ADhLBDLZyGI/s800/DSC_0205.JPG" height="300" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;必要な材料はだいたい揃っているようです。&lt;br /&gt;しかも、ご丁寧にスポイトまで厳重に包装していただいてます。全てのオイルは丁寧に個包装されており、きっと、大変だっただろう、と思われます。&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="https://picasaweb.google.com/lh/photo/8rlkBBblWJh2lX5xOxX7wZL8ACFvXNAKCrKvZtgA_Bk?feat=embedwebsite"&gt;&lt;img src="https://lh6.googleusercontent.com/-sFXK9p8zvd4/TnHTci5ur6I/AAAAAAAADM0/QEi7cxR9dsY/s800/DSC_0206.JPG" height="300" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&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/5587841204043490178-7844457542392513656?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0VojUNnqeurgNpSMiYl8c_K8z7g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0VojUNnqeurgNpSMiYl8c_K8z7g/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0VojUNnqeurgNpSMiYl8c_K8z7g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0VojUNnqeurgNpSMiYl8c_K8z7g/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/2QYTaiCrdYo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/7844457542392513656/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/09/blog-post.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/7844457542392513656?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/7844457542392513656?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/2QYTaiCrdYo/blog-post.html" title="オープンコーラ事始め" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh4.googleusercontent.com/-FPGTltWWxCU/TnHTXfdll2I/AAAAAAAADMw/ADhLBDLZyGI/s72-c/DSC_0205.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/09/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ENRHw4cCp7ImA9WhdXE0Q.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-3756091959135475061</id><published>2011-08-27T07:09:00.007+09:00</published><updated>2011-08-27T08:01:35.238+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-27T08:01:35.238+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Mixi" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>Mixi Voiceに対応してみました</title><content type="html">&lt;a href="http://awwa500.blogspot.com/2011/08/facebook.html"&gt;Facebookに別れを告げた&lt;/a&gt;から、というわけではありませんが、MixiがAndroid向けにSDKを公開していたのでやっつけ仕事でSmartTrainingで対応してみました。
&lt;br /&gt;細かい話は&lt;a href="http://developer.mixi.co.jp/connect/mixi_graph_api/android/download/"&gt;Mixi Developer&lt;/a&gt;を見てください。必要な手続き、サンプル、SDKダウンロード等すべてが揃ってるので敢えてここでやり方を各必要もなかろうと思います。
&lt;br /&gt;んで、このAPIを使ってみての所感というか。
&lt;br /&gt;
&lt;br /&gt;・異常系の処理
&lt;br /&gt;例えば、投稿時に通信が利用できないケースでは、Mixiライブラリ側がcatchしてエラーメッセージ出してAPP側にthrowしてくれません。throwしてくれないのは、ちゃんとonFatal()あたりでコールバックしてくれるのでいいんですが、エラーメッセージがアプリ側とテーマが異なったり、メッセージ内容を変更したいといったことに対応できません。ライブラリなんだからUIの領域に踏み込んでほしくないなぁ。
&lt;br /&gt;
&lt;br /&gt;・onActivityResult()実装の必要性
&lt;br /&gt;Facebook SDKも同じですが、Mixiへのアクセス(具体的には認証処理)時に結果を受け取るためにonActivityResult()を実装する必要があります。つまり、Activityから要求を送信することが前提となっています。例えば、Serviceが直接Mixiにアクセスしたい場合もあるわけですが、そういうケースへの配慮がありません。
&lt;br /&gt;そんなときは、Mixi送信用のActivityを作って画面表示とともに送信→送信完了もしくは何か異常が起きたら画面終了します。Activityは背景を透明にしておくと見た目上Activityが起動されたことがわからないのでいいカモ。
&lt;br /&gt;
&lt;br /&gt;・Mixi Developerに登録できるアプリアイコン
&lt;br /&gt;サイズ76x76というAndroid標準ではあまり聞いたことのないサイズ。48x48とか72x72あたりにしてほしいな。まぁ、そんなことはいいんだけど、GIFかJPEGしか登録できない。いや、PNGでしょ。イマドキさ。。。
&lt;br /&gt;
&lt;br /&gt;・アカウントの登録
&lt;br /&gt;昔からなんだけど、Mixiはキャリアメールを持っていないとアカウントが作れない。当然、Developer登録もできない。なんでよ？Android向けのSDK提供してるならGmailくらい認めてよ。それでサポートやってんだからさ。
&lt;br /&gt;
&lt;br /&gt;いっぱい文句言ってごめんなさい。
&lt;br /&gt;というわけでやっつけ仕事のソースです。
&lt;br /&gt;
&lt;br /&gt;まずは、Mixi投稿だけをするカラのActivity。こいつをService側からStartActivity()してやればいい。いや、カラじゃないか。
&lt;br /&gt;&lt;pre name="code" class="java"&gt;
&lt;br /&gt;
&lt;br /&gt;public class SendMixiVoiceActivity extends Activity implements CallbackListener {
&lt;br /&gt;
&lt;br /&gt;    private static final int CODE_MIXI_VOICE = 0;
&lt;br /&gt;    public static final String KEY_MESSAGE = "key_message";
&lt;br /&gt;    private MixiVoiceManager mvm;
&lt;br /&gt;    private String message;
&lt;br /&gt;    private Context context;
&lt;br /&gt;    /**
&lt;br /&gt;      * 画面生成時処理
&lt;br /&gt;      */
&lt;br /&gt;    @Override
&lt;br /&gt;    public void onCreate(Bundle savedInstanceState) {
&lt;br /&gt;        super.onCreate(savedInstanceState);
&lt;br /&gt;        // 引数取得
&lt;br /&gt;        Bundle extras = getIntent().getExtras();
&lt;br /&gt;        message = extras.getString(KEY_MESSAGE);
&lt;br /&gt;        // 初期化
&lt;br /&gt;        context = this;
&lt;br /&gt;        mvm = new MixiVoiceManager(context){
&lt;br /&gt;            @Override
&lt;br /&gt;            public void onFinishSend() {
&lt;br /&gt;                finish();
&lt;br /&gt;            }
&lt;br /&gt;        };
&lt;br /&gt;
&lt;br /&gt;        if ( !mvm.isAuthorized() )
&lt;br /&gt;        {
&lt;br /&gt;            // セッションなし：認証開始
&lt;br /&gt;	    mvm.authorize(
&lt;br /&gt;	        this, 
&lt;br /&gt;	        new String[] {"w_voice"},
&lt;br /&gt;                CODE_MIXI_VOICE, 
&lt;br /&gt;	        this);
&lt;br /&gt;        }
&lt;br /&gt;        else
&lt;br /&gt;        {
&lt;br /&gt;            mvm.send(message);
&lt;br /&gt;        }
&lt;br /&gt;    }
&lt;br /&gt;    @Override
&lt;br /&gt;    public void onComplete(Bundle values) {
&lt;br /&gt;        mvm.send(message);
&lt;br /&gt;    }
&lt;br /&gt;    @Override
&lt;br /&gt;    public void onCancel() {
&lt;br /&gt;        finish();
&lt;br /&gt;    }
&lt;br /&gt;    @Override
&lt;br /&gt;    public void onFatal(ErrorInfo e) {
&lt;br /&gt;        finish();
&lt;br /&gt;    }
&lt;br /&gt;    @Override
&lt;br /&gt;    public void onError(ErrorInfo e) {
&lt;br /&gt;        finish();
&lt;br /&gt;    }
&lt;br /&gt;
&lt;br /&gt;    @Override
&lt;br /&gt;    public void onActivityResult(int requestCode, int resultCode, Intent data) {
&lt;br /&gt;        super.onActivityResult(requestCode, resultCode, data);
&lt;br /&gt;        mvm.authorizeCallback(requestCode, resultCode, data);
&lt;br /&gt;    }
&lt;br /&gt;
&lt;br /&gt;    // 呼ばれる保証のないonDestroy()で後始末処理しても意味ないんじゃない？onPause()でやったらいいんジャマイカ。
&lt;br /&gt;    @Override
&lt;br /&gt;    public void onDestroy() {
&lt;br /&gt;        mvm.close(this);
&lt;br /&gt;        super.onDestroy();
&lt;br /&gt;    }
&lt;br /&gt;}
&lt;br /&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;次はMixi投稿を管理する自作のMixiVoiceManager（Activity側に処理いれてしまえば別にこんなの作んなくてもいい。）
&lt;br /&gt;&lt;pre name="code" class="java"&gt;
&lt;br /&gt;public abstract class MixiVoiceManager {
&lt;br /&gt;
&lt;br /&gt;	private MixiContainer mContainer;
&lt;br /&gt;	private Context context;
&lt;br /&gt;
&lt;br /&gt;	public abstract void onFinishSend();
&lt;br /&gt;	
&lt;br /&gt;	/**
&lt;br /&gt;	 * コンストラクタ
&lt;br /&gt;	 * @param context
&lt;br /&gt;	 */
&lt;br /&gt;	public MixiVoiceManager(Context context)
&lt;br /&gt;	{
&lt;br /&gt;		this.context = context;
&lt;br /&gt;
&lt;br /&gt;		Config config = new Config();
&lt;br /&gt;		config.clientId = "Mixi Developer Centerに登録したID";
&lt;br /&gt;		config.selector = Config.GRAPH_API;
&lt;br /&gt;
&lt;br /&gt;		mContainer = MixiContainerFactory.getContainer(config);
&lt;br /&gt;		if ( mContainer == null )
&lt;br /&gt;			onFinishSend();
&lt;br /&gt;			
&lt;br /&gt;		if ( !mContainer.init((ContextWrapper)context))
&lt;br /&gt;			onFinishSend();
&lt;br /&gt;	}
&lt;br /&gt;
&lt;br /&gt;	/**
&lt;br /&gt;	 * 認証処理
&lt;br /&gt;	 * @param activity
&lt;br /&gt;	 * @param permissions
&lt;br /&gt;	 * @param activityCode
&lt;br /&gt;	 * @param listener
&lt;br /&gt;	 */
&lt;br /&gt;	public void authorize(Activity activity, String[] permissions, int activityCode, CallbackListener listener)
&lt;br /&gt;	{
&lt;br /&gt;		mContainer.authorize(activity, permissions, activityCode, listener);
&lt;br /&gt;	}
&lt;br /&gt;
&lt;br /&gt;	/**
&lt;br /&gt;	 * Voice投稿
&lt;br /&gt;	 * @param voice
&lt;br /&gt;	 */
&lt;br /&gt;	public void send(String voice)
&lt;br /&gt;	{
&lt;br /&gt;		Map&lt;String, String&gt; params = new HashMap&lt;String, String&gt;();
&lt;br /&gt;		params.put("status", voice);
&lt;br /&gt;		mContainer.send("/voice/statuses/update", HttpMethod.POST, params, new CallbackListener(){
&lt;br /&gt;
&lt;br /&gt;			@Override
&lt;br /&gt;			public void onComplete(Bundle values) {
&lt;br /&gt;				Toast.makeText(context, R.string.message_success_send_mixi_voice, Toast.LENGTH_LONG).show();
&lt;br /&gt;				onFinishSend();
&lt;br /&gt;			}
&lt;br /&gt;
&lt;br /&gt;			@Override
&lt;br /&gt;			public void onCancel() {
&lt;br /&gt;				onFinishSend();
&lt;br /&gt;			}
&lt;br /&gt;
&lt;br /&gt;			@Override
&lt;br /&gt;			public void onFatal(ErrorInfo e) {
&lt;br /&gt;				Toast.makeText(context, R.string.message_fail_send_mixi_voice, Toast.LENGTH_LONG).show();
&lt;br /&gt;				onFinishSend();
&lt;br /&gt;			}
&lt;br /&gt;
&lt;br /&gt;			@Override
&lt;br /&gt;			public void onError(ErrorInfo e) {
&lt;br /&gt;				Toast.makeText(context, R.string.message_fail_send_mixi_voice, Toast.LENGTH_LONG).show();
&lt;br /&gt;				onFinishSend();
&lt;br /&gt;			}});
&lt;br /&gt;	}
&lt;br /&gt;
&lt;br /&gt;	/**
&lt;br /&gt;	 * 認証状態チェック
&lt;br /&gt;	 * @return
&lt;br /&gt;	 */
&lt;br /&gt;	public boolean isAuthorized()
&lt;br /&gt;	{
&lt;br /&gt;		return mContainer.isAuthorized();
&lt;br /&gt;	}
&lt;br /&gt;
&lt;br /&gt;	public void authorizeCallback(int requestCode, int resultCode, Intent data)
&lt;br /&gt;	{
&lt;br /&gt;		mContainer.authorizeCallback(requestCode, resultCode, data);
&lt;br /&gt;	}
&lt;br /&gt;
&lt;br /&gt;	public void close(Context context)
&lt;br /&gt;	{
&lt;br /&gt;		mContainer.close((ContextWrapper) context);
&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;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5587841204043490178-3756091959135475061?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4DbjTzZimuBi3LX_OFoRJrK_P8o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4DbjTzZimuBi3LX_OFoRJrK_P8o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4DbjTzZimuBi3LX_OFoRJrK_P8o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4DbjTzZimuBi3LX_OFoRJrK_P8o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/5zcUbhODMkI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/3756091959135475061/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/08/mixi-voice.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/3756091959135475061?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/3756091959135475061?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/5zcUbhODMkI/mixi-voice.html" title="Mixi Voiceに対応してみました" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/08/mixi-voice.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4GQ3c_eyp7ImA9WhdQGEg.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-8652394751395125072</id><published>2011-08-20T16:05:00.007+09:00</published><updated>2011-08-20T23:35:22.943+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-20T23:35:22.943+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Facebook" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>さようならFacebook</title><content type="html">以前、SmartTrainingからFacebookのウォールに投稿する機能に関して&lt;a href="http://awwa500.blogspot.com/2011/01/facebook.html"&gt;書きました&lt;/a&gt;。
&lt;br /&gt;面倒、面倒と文句を言いつつもちゃんと投稿することができて「&lt;a href="http://awwa500.blogspot.com/2011/02/facebook.html"&gt;Facebookに対応してよかったこと&lt;/a&gt;」などというフォローの投稿も書きました。
&lt;br /&gt;しかし、今こう思っています。「さようならFacebook」
&lt;br /&gt;
&lt;br /&gt;理由：
&lt;br /&gt;2011/7/12をもってアプリ側が生成した文字列をウォール投稿用のテキストボックスに自動設定することを不可にしたから。
&lt;br /&gt;&lt;a href="https://developers.facebook.com/docs/reference/dialogs/feed/"&gt;情報ソース&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-P8gqhCVDF4I/Tk9iVvtfH5I/AAAAAAAADHA/HKcqdTeIfzI/s1600/device-2011-08-20-162850.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/-P8gqhCVDF4I/Tk9iVvtfH5I/AAAAAAAADHA/HKcqdTeIfzI/s320/device-2011-08-20-162850.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5642836983842545554" /&gt;&lt;/a&gt;
&lt;br /&gt;[何か書く...]の下のEditTextにアプリから文字列を設定できなくなった。
&lt;br /&gt;
&lt;br /&gt;文字はめんどくさがらずに全部手で入力しろ、だってさ！バカじゃねぇの？どうしてそんなに閉鎖的なのよ？何のためにデベロッパにハッシュキー登録だの面倒な手続きでアプリ登録させてアプリの認証をやってるのよ？Facebookへのアプリからのアクセスを信頼するためじゃないの？何がTwitterやFourSquareと並んで新しいタイプのIT企業だ。ただ閉鎖的なだけじゃないか。こういう意味ではGoogleの「何でもオールオッケー！でも後で問題があったら消すからね」的なスタンスの方が付き合いやすくて周囲に様々な可能性を提供してくれているんだなぁ、と思います（まぁ、いろいろ批判はあるみたいだけど）。それにしてもFacebook、ユーザーが何億いるか知らないけど小さい！本当に小さいね！
&lt;br /&gt;
&lt;br /&gt;もういいよ、さようならFacebook！
&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/5587841204043490178-8652394751395125072?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KyaFXji6hawT5zCb7KRGl5aijBE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KyaFXji6hawT5zCb7KRGl5aijBE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KyaFXji6hawT5zCb7KRGl5aijBE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KyaFXji6hawT5zCb7KRGl5aijBE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/ynMiYGgWGe4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/8652394751395125072/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/08/facebook.html#comment-form" title="1 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/8652394751395125072?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/8652394751395125072?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/ynMiYGgWGe4/facebook.html" title="さようならFacebook" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-P8gqhCVDF4I/Tk9iVvtfH5I/AAAAAAAADHA/HKcqdTeIfzI/s72-c/device-2011-08-20-162850.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/08/facebook.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4DSXs8fSp7ImA9WhdSFE8.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-4947962805167885488</id><published>2011-07-23T05:46:00.003+09:00</published><updated>2011-07-23T22:32:58.575+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-23T22:32:58.575+09:00</app:edited><title>ハニコム対応戦略　〜その3〜　やったことざざっと</title><content type="html">前回はどんな感じでPhone向けのアプリををTablet向けにした際に割り当てていったかを書きました。&lt;br /&gt;今回はもう少し細かく具体的に何やったかをまとめます。&lt;br /&gt;重ねて言いますが、&lt;a href="http://code.google.com/p/iosched/"&gt;Google I/O 2011公式アプリ&lt;/a&gt;がベストプラクティスなのでそちらを参照して真似るのが一番良いと思います。あと、&lt;a href="http://y-anz-m.blogspot.com/2011/05/androidfragment_19.html"&gt;ここ&lt;/a&gt;とか&lt;a href="http://techbooster.jpn.org/andriod/application/3220/"&gt;ここ&lt;/a&gt;見たらちゃんとやるべき事の詳細は書かれています。&lt;br /&gt;なので、このページで書いてあることは、ひとつのPhone向けアプリをTablet向けにする際の一例だと思っていただければと思います。&lt;br /&gt;&lt;br /&gt;1.テーマHoloの使用&lt;br /&gt;　TableでActionBarを利用したければ、ActivityのテーマをHolo系にする必要があります。&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&lt;stylename="CustomTheme.Black"parent="android:style/Theme.Holo" /&gt;　&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;みたいな感じ。&lt;br /&gt;&lt;br /&gt;2.ActionBarとMenuとTitleBar&lt;br /&gt;　ActionBarは普通にMenuを利用していればそのまま画面右上に表示されます。自分の場合、Phone向けのUIではあまり頻繁に操作することのない機能をMenuに入れることが多かったのですが、ハニコムでHoloテーマを使用した場合、ActionBar右側にこのMenuが出てくるので、それでいいのか考えましょう。&lt;br /&gt;　Phone前提の画面レイアウトでは、頻繁に利用するボタンを画面下部に配置することが多かったのですが、Tabletの場合にこれが適切か否かを検討しましょう。必要があれば、ActionBarにいれてしまいましょう。&lt;br /&gt;&lt;br /&gt;3.リソース&lt;br /&gt;　ちゃんとdp、sp指定して画面レイアウトを構成してあれば、基本的にリソースはいじる必要はないはずです。&lt;br /&gt;　ただ、Tabletでは画面サイズが大きくなるので、大きなサイズで綺麗に表示したい場合はそれ相応の画像リソースを用意する必要があります。&lt;br /&gt;&lt;br /&gt;4.android-support-v4.jarのインポート&lt;br /&gt;　ハニコム以前の環境でFragmentをサポートするためにandroid-support-v4.jarをインポートする必要があります。&lt;br /&gt;　android.app.Fragmentをimportする代わりにandroid.support.v4.app.Fragmentを#importします。&lt;br /&gt;　Fragment周りで主に利用するクラス。&lt;br /&gt;　android.support.v4.app.Fragment&lt;br /&gt;　android.support.v4.app.FragmentActivity　→　Activity継承のクラスはFragmentActivity継承に切り替える。&lt;br /&gt;　android.support.v4.app.FragmentManager&lt;br /&gt;　android.support.v4.app.FragmentTransaction&lt;br /&gt;　&lt;br /&gt;5.Phone/Tabletでの画面レイアウトの切り替え&lt;br /&gt;　PhoneとTabletで画面レイアウトを切り替えるために利用できる簡単な方法はLayout xmlをフォルダで分けることです。&lt;br /&gt;　例えばこんな感じ&lt;br /&gt;　　res/layout/main_activity.xml ・・・・・・ Phone用Activity&lt;br /&gt;　　res/layout-land-v11/main_activity.xml・・・Tablet横向き用Activity&lt;br /&gt;　トップ画面はランチャーから呼び出されるActivityがひとつなので、レイアウトで切り替える感じ。&lt;br /&gt;　&lt;br /&gt;6.Phone/TabletでstartActivity()するActivityクラスの切り替え&lt;br /&gt;　PhoneとTabletで呼び出すActivityをそれぞれ実装してstartActivity()のタイミングで呼び出すActivityを切り替えることができます。&lt;br /&gt;　例えばこんな感じ&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;　Intent intent;&lt;br /&gt;　if ( UIUtils.isHoneycomb() )&lt;br /&gt;　　intent = new Intent(getActivity(), ForTabletActivity.class);&lt;br /&gt;　else&lt;br /&gt;　　Intent intent = new Intent(getActivity(), ForPhoneActivity.class);&lt;br /&gt;　getActivity().startActivity(intent);&lt;br /&gt;&lt;/pre&gt;　&lt;br /&gt;※UIUtilsについては&lt;a href="http://code.google.com/p/iosched/"&gt;Google I/O 2011公式アプリ&lt;/a&gt;参照のこと。&lt;br /&gt;&lt;br /&gt;7.FragmentとActivity間のやりとり&lt;br /&gt;こんな感じでActivity側にコールバックを実装する。&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt; public interface PhotoListEventsCallback {&lt;br /&gt;  public void onThumbnailSelected(PhotoData photo);&lt;br /&gt;  public void onThumbnailSelected(List&lt;PhotoData&gt; list, int position);&lt;br /&gt;  public void onNextImage();&lt;br /&gt;  public void onPrevImage();&lt;br /&gt;  public void onChangeFavorite(FavoriteDataList favorites);&lt;br /&gt;  public void onStartProgress();&lt;br /&gt;  public void onStopProgress();&lt;br /&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/5587841204043490178-4947962805167885488?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ykbqhEeke5zBP259zlqPXbnPkq8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ykbqhEeke5zBP259zlqPXbnPkq8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ykbqhEeke5zBP259zlqPXbnPkq8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ykbqhEeke5zBP259zlqPXbnPkq8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/bsSZPrp-2AU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/4947962805167885488/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/07/3.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/4947962805167885488?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/4947962805167885488?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/bsSZPrp-2AU/3.html" title="ハニコム対応戦略　〜その3〜　やったことざざっと" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/07/3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cHQngyeCp7ImA9WhdSE0s.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-6086667651450643165</id><published>2011-07-21T23:04:00.006+09:00</published><updated>2011-07-23T06:10:33.690+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-23T06:10:33.690+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Honeycomb" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>ハニコム対応戦略　〜その2〜　Tablet対応する際の機能マッピング戦略</title><content type="html">前回はハニコム対応したアプリケーションの基本機能を紹介しました。&lt;br /&gt;今回はTablet対応した際にPhone上で実現していた機能をどういう風にTablet上で表現するかを説明していきます。&lt;br /&gt;&lt;br /&gt;まずは実際に対応を完了したアプリの画面を見ながら結果的にどうなったのかを説明していきます。&lt;br /&gt;&lt;br /&gt;◆Tablet用画面&lt;br /&gt;・画面を左右2分割して左側にサムネイル用のGridView、右側に選択した画像の高解像度表示を行います。&lt;br /&gt;・画面上部にはActionBarを配置して、左上にはアプリケーションロゴと名称。右上には各機能呼び出し用のボタンを表示します。&lt;br /&gt;・画面下部にはサムネイルの切り替え（ランキング／お気に入り）ボタンと、全ユーザのお気に入り登録回数とお気に入り登録ボタン（☆）を表示します。&lt;br /&gt;・画面右下にリング型のProgressBarを配置して、サムネイル更新中または高解像度画像ダウンロード中はProgressBarを表示します。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-XtwRs8LWjdA/TigzKnuXmyI/AAAAAAAAC5Y/JMQHTriUxOk/s1600/device-2011-07-21-230855.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 192px;" src="http://4.bp.blogspot.com/-XtwRs8LWjdA/TigzKnuXmyI/AAAAAAAAC5Y/JMQHTriUxOk/s320/device-2011-07-21-230855.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5631807591581981474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;フレーム表示だとこんな感じ&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-xPSiVOSMzvk/TinmkQiVIaI/AAAAAAAAC50/B4N9NkTO1Jg/s1600/balayout1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/-xPSiVOSMzvk/TinmkQiVIaI/AAAAAAAAC50/B4N9NkTO1Jg/s320/balayout1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5632286319592153506" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;◆Phone用画面&lt;br /&gt;基本的には対応前と変わりませんが、以下の点が変わります。&lt;br /&gt;・タイトルバーの代わりに、ActionBarっぽい感じで独自レイアウトのバーを画面上部に表示します。&lt;br /&gt;・詳細画面でアプリロゴを選択するとホーム画面(サムネイル画面)に戻ります。&lt;br /&gt;サムネイル画面&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-Sd1UNO008co/Tig165gnpFI/AAAAAAAAC5g/ajPiZNuaAs8/s1600/device-2011-07-21-231847.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 180px; height: 320px;" src="http://1.bp.blogspot.com/-Sd1UNO008co/Tig165gnpFI/AAAAAAAAC5g/ajPiZNuaAs8/s320/device-2011-07-21-231847.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5631810620013126738" /&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/-klb2kWY7250/TinmwfAiM-I/AAAAAAAAC58/fEgdLRQGGNU/s1600/balayout2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/-klb2kWY7250/TinmwfAiM-I/AAAAAAAAC58/fEgdLRQGGNU/s320/balayout2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5632286529635365858" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;詳細画面&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-FQJkL2mOOfk/Tig2B5gAYQI/AAAAAAAAC5o/S0Et-CdrEPg/s1600/device-2011-07-21-231957.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 180px; height: 320px;" src="http://2.bp.blogspot.com/-FQJkL2mOOfk/Tig2B5gAYQI/AAAAAAAAC5o/S0Et-CdrEPg/s320/device-2011-07-21-231957.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5631810740269637890" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;詳細画面フレーム&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-zqGTbt9dq_E/Tinm-yM9SuI/AAAAAAAAC6E/Uj3kHZ3Rqv0/s1600/balayout3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-zqGTbt9dq_E/Tinm-yM9SuI/AAAAAAAAC6E/Uj3kHZ3Rqv0/s320/balayout3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5632286775305915106" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;☆基本戦略&lt;br /&gt;◆Tablet画面&lt;br /&gt;・サムネイル画面と画像表示画面をひとつの画面に固めることで画面遷移をなくす。&lt;br /&gt;・画面下部に配置していたボタンのうち、よく操作するものをActionBar内に配置する。&lt;br /&gt;&lt;br /&gt;◆Phone画面&lt;br /&gt;・Tablet画面と画面デザインを合わせるため、タイトルバーに相当するバーの高さをTabletのActionBarと同じ高さにする。&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/5587841204043490178-6086667651450643165?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/d7spBbo5AUB-gZJbRYqJjCA28cA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d7spBbo5AUB-gZJbRYqJjCA28cA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/d7spBbo5AUB-gZJbRYqJjCA28cA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/d7spBbo5AUB-gZJbRYqJjCA28cA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/4MCfflU57Og" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/6086667651450643165/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/07/2tablet.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/6086667651450643165?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/6086667651450643165?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/4MCfflU57Og/2tablet.html" title="ハニコム対応戦略　〜その2〜　Tablet対応する際の機能マッピング戦略" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-XtwRs8LWjdA/TigzKnuXmyI/AAAAAAAAC5Y/JMQHTriUxOk/s72-c/device-2011-07-21-230855.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/07/2tablet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcHRno9fSp7ImA9WhdSEkg.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-5255120279831214284</id><published>2011-07-21T22:36:00.008+09:00</published><updated>2011-07-21T23:03:57.465+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-21T23:03:57.465+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Honeycomb" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>ハニコム対応戦略　〜その1〜　今回対応するアプリ</title><content type="html">画像閲覧アプリBeautyAlbumをハニコムTablet対応してみました。&lt;br /&gt;今回から数回に渡って、Phone向けのアプリをPhone対応を残しつつハニコムTablet対応する手順と気にしなくてはいけない点をまとめてみます。&lt;br /&gt;結論から言うと、&lt;a href="http://code.google.com/p/iosched/"&gt;Google I/O 2011公式アプリ&lt;/a&gt;がベストプラクティスなのでそちらを参照して真似るのが一番良いと思います。&lt;br /&gt;なので、あまり細かい実装の話はしません。&lt;br /&gt;さらに、&lt;a href="http://y-anz-m.blogspot.com/2011/05/androidfragment_19.html"&gt;ここ&lt;/a&gt;とか&lt;a href="http://techbooster.jpn.org/andriod/application/3220/"&gt;ここ&lt;/a&gt;見たほうが良いと思います。&lt;br /&gt;この場では、「私のアプリの場合こうしました」という具体例を示します。&lt;br /&gt;また、絶対こうしなきゃいけないわけではありませんので、ご自分のアプリの性格をよく考え、どういう対応をするのか（またはしないのか）を考えてくださいね。&lt;br /&gt;&lt;br /&gt;というわけで、まずは対応する前の元のアプリの機能を簡単に紹介します。&lt;br /&gt;&lt;br /&gt;アプリはAndroid Marketから&lt;a href="https://market.android.com/details?id=com.awwa.beauty"&gt;ダウンロード&lt;/a&gt;できます。&lt;br /&gt;サムネイル表示画面で画像を選択すると画像が拡大表示され、その画像をお気に入りに登録したり、他のアプリに共有したりすることができるといういたってシンプルなものです。&lt;br /&gt;&lt;br /&gt;【サムネイル画面】&lt;br /&gt;・ネットワーク上から画像のサムネイルをダウンロードしてGridViewに表示します。&lt;br /&gt;・サムネイルダウンロード中は画面右上のタイトルバー上にリング型のProgressBarを表示します。&lt;br /&gt;・画面下部に他のユーザのランキング表示と自分のお気に入り表示の切り替えボタンを配置してあります。&lt;br /&gt;・Menuキーを押すことでAboutダイアログを表示します。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-W-G4dUNuxpo/TigtrwrRzaI/AAAAAAAAC5I/DsCMlPDRbaM/s1600/ba1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 192px; height: 320px;" src="http://3.bp.blogspot.com/-W-G4dUNuxpo/TigtrwrRzaI/AAAAAAAAC5I/DsCMlPDRbaM/s320/ba1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5631801563850853794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;【詳細画面】&lt;br /&gt;・サムネイルを選択すると画面遷移して高解像度の画像をダウンロードして表示します。&lt;br /&gt;・画像のダウンロード中はサムネイル画面同様タイトルバー上にリング型のProgressBarを表示します。&lt;br /&gt;・画面下部に他のユーザがお気に入り登録した回数と自分のお気に入りマーク(☆)を配置してあります。&lt;br /&gt;・画面下部に画像の共有、ギャラリーアプリ起動、リスト上で次の画像、前の画像を表示する機能を呼び出すボタンが配置してあります。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-BxFYxTvJLu8/Tigt7kLzYsI/AAAAAAAAC5Q/MA3YHHOkIiU/s1600/ba2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 192px; height: 320px;" src="http://4.bp.blogspot.com/-BxFYxTvJLu8/Tigt7kLzYsI/AAAAAAAAC5Q/MA3YHHOkIiU/s320/ba2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5631801835375518402" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;◆UIの基本方針&lt;br /&gt;次の方針でPhone向け画面設計を行っています。&lt;br /&gt;・よく使用する機能は画面上にボタンを配置して呼び出すようにする。&lt;br /&gt;・画面上のボタンは押下しやすいように画面下部に固めて表示する。&lt;br /&gt;・Menuキーには滅多に使用することのない機能(About表示)を割り当てる。&lt;br /&gt;・ProgressBarは全画面共通でタイトルバーに表示するようにする。&lt;br /&gt;&lt;br /&gt;アプリケーションの機能的には以上です。&lt;br /&gt;それでは次回以降、Tablet対応する際のUIの設計変更の考え方を説明していきます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5587841204043490178-5255120279831214284?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ETHIC6dIKLXx-IV2r4sOCXHWtEQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ETHIC6dIKLXx-IV2r4sOCXHWtEQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ETHIC6dIKLXx-IV2r4sOCXHWtEQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ETHIC6dIKLXx-IV2r4sOCXHWtEQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/RIc3PFFY5d4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/5255120279831214284/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/07/1.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/5255120279831214284?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/5255120279831214284?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/RIc3PFFY5d4/1.html" title="ハニコム対応戦略　〜その1〜　今回対応するアプリ" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-W-G4dUNuxpo/TigtrwrRzaI/AAAAAAAAC5I/DsCMlPDRbaM/s72-c/ba1.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/07/1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08BQns9fyp7ImA9WhdTE0o.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-3078189816029487121</id><published>2011-07-11T19:09:00.004+09:00</published><updated>2011-07-11T19:24:13.567+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-11T19:24:13.567+09:00</app:edited><title>Mario with Widget</title><content type="html">I have created mario with widget.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-H0BDmMddUEw/Thil1t89J6I/AAAAAAAAC14/0OfYPvwRJM8/s1600/mario-ruise.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 480px; height: 800px;" src="http://2.bp.blogspot.com/-H0BDmMddUEw/Thil1t89J6I/AAAAAAAAC14/0OfYPvwRJM8/s1600/mario-ruise.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;* How do I create it?&lt;br /&gt;- Download &lt;a href="https://market.android.com/details?id=com.awwa.muskedwidget&amp;feature=search_result"&gt;MuskedWidget&lt;/a&gt; from Android Market.&lt;br /&gt;- Change Home application to Launcher Pro.&lt;br /&gt;- Change Home screen numbers to 6.&lt;br /&gt;- Change Home screen row and columns to 10x10.&lt;br /&gt;- Arrange the widget.&lt;br /&gt;&lt;br /&gt;I need 16x16 tiles on Home screen.&lt;br /&gt;If it is 16x16, I can create a character on 1 screen!!&lt;br /&gt;&lt;br /&gt;See &lt;a href="http://awwa500.blogspot.com/2011/07/blog-post.html"&gt;detail&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5587841204043490178-3078189816029487121?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sa1rn5fN6bMOdr1cFVacabTfoFQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sa1rn5fN6bMOdr1cFVacabTfoFQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sa1rn5fN6bMOdr1cFVacabTfoFQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sa1rn5fN6bMOdr1cFVacabTfoFQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/X3-0QNzUXJY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/3078189816029487121/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/07/mario-on-widget.html#comment-form" title="1 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/3078189816029487121?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/3078189816029487121?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/X3-0QNzUXJY/mario-on-widget.html" title="Mario with Widget" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-H0BDmMddUEw/Thil1t89J6I/AAAAAAAAC14/0OfYPvwRJM8/s72-c/mario-ruise.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/07/mario-on-widget.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUCSXk5eip7ImA9WhdTE00.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-1633053907681708123</id><published>2011-07-10T04:00:00.013+09:00</published><updated>2011-07-10T21:51:08.722+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-10T21:51:08.722+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>ウィジェットでマリオ</title><content type="html">Android Bazaar and Conference 2011 Summer 「頑張れ日本、頑張れAndroid」ということでウィジェットでマリオ作ってみました。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-H0BDmMddUEw/Thil1t89J6I/AAAAAAAAC14/0OfYPvwRJM8/s1600/mario-ruise.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 192px; height: 320px;" src="http://2.bp.blogspot.com/-H0BDmMddUEw/Thil1t89J6I/AAAAAAAAC14/0OfYPvwRJM8/s320/mario-ruise.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5627430076686346146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;☆作り方&lt;br /&gt;・Android Market から &lt;a href="https://market.android.com/details?id=com.awwa.muskedwidget&amp;feature=search_result"&gt;MuskedWidget&lt;/a&gt;をダウンロードする。&lt;br /&gt;・ホーム画面上にひたすら色指定したウィジェットを並べる。&lt;br /&gt;いじょ。&lt;br /&gt;&lt;br /&gt;☆なんだそりゃ&lt;br /&gt;&lt;br /&gt;意味分かんない人向け。&lt;br /&gt;MuskedWidgetはホーム画面上にただの四角いウィジェットを生成するアプリです。&lt;br /&gt;普通はこんな感じ。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-Pf267D8mfs8/ThimkwlAjOI/AAAAAAAAC2A/P_wNsdNS9WQ/s1600/device1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 192px; height: 320px;" src="http://2.bp.blogspot.com/-Pf267D8mfs8/ThimkwlAjOI/AAAAAAAAC2A/P_wNsdNS9WQ/s320/device1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5627430884845063394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;色指定できるので、好きなところに好きな色のウィジェットを置いていきます。&lt;br /&gt;普通のAndroidのホーム画面だと4x4しかウィジェットを置くことができませんね。&lt;br /&gt;これじゃ、つまらない。&lt;br /&gt;というわけで、かの有名なLauncher Proの登場。&lt;br /&gt;このホーム画面は、10x10までウィジェットを置ける。&lt;br /&gt;でも、マリオつくろうと思ったら、最低12x14はドットが必要。&lt;br /&gt;&lt;br /&gt;足りん。&lt;br /&gt;&lt;br /&gt;でもまだあきらめない。&lt;br /&gt;Launcher Proは最大7画面まで拡張できて、ホームキーを押すと、各画面がサムネイル化される。&lt;br /&gt;&lt;br /&gt;これだ。&lt;br /&gt;&lt;br /&gt;6画面でサムネイル化したら、都合20x30までドットが取れるではないか。&lt;br /&gt;というわけでできたのがこれ。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-H0BDmMddUEw/Thil1t89J6I/AAAAAAAAC14/0OfYPvwRJM8/s1600/mario-ruise.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 192px; height: 320px;" src="http://2.bp.blogspot.com/-H0BDmMddUEw/Thil1t89J6I/AAAAAAAAC14/0OfYPvwRJM8/s320/mario-ruise.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5627430076686346146" /&gt;&lt;/a&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/-hO-enmgwBs0/Thio4h1fOhI/AAAAAAAAC2I/33-bUSJcm1Y/s1600/mr1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 192px; height: 320px;" src="http://4.bp.blogspot.com/-hO-enmgwBs0/Thio4h1fOhI/AAAAAAAAC2I/33-bUSJcm1Y/s320/mr1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5627433423508290066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-Tm3_f8nMfmQ/Thio_LfSKYI/AAAAAAAAC2Q/s8fKV-GoIkU/s1600/mr2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 192px; height: 320px;" src="http://1.bp.blogspot.com/-Tm3_f8nMfmQ/Thio_LfSKYI/AAAAAAAAC2Q/s8fKV-GoIkU/s320/mr2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5627433537768663426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-onsXV4V1n8c/ThipEhl8s-I/AAAAAAAAC2Y/nKH1GQxIxHc/s1600/mr3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 192px; height: 320px;" src="http://1.bp.blogspot.com/-onsXV4V1n8c/ThipEhl8s-I/AAAAAAAAC2Y/nKH1GQxIxHc/s320/mr3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5627433629601543138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-RhWRjre9oKM/ThipLBFQR0I/AAAAAAAAC2g/N4k3DwIhgVY/s1600/mr4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 192px; height: 320px;" src="http://3.bp.blogspot.com/-RhWRjre9oKM/ThipLBFQR0I/AAAAAAAAC2g/N4k3DwIhgVY/s320/mr4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5627433741133563714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-N6gpBwShRUY/ThipQG2DOUI/AAAAAAAAC2o/2SpBf7ZI--0/s1600/mr5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 192px; height: 320px;" src="http://2.bp.blogspot.com/-N6gpBwShRUY/ThipQG2DOUI/AAAAAAAAC2o/2SpBf7ZI--0/s320/mr5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5627433828579752258" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-B4l5Cp-jzMw/ThipVaBHs6I/AAAAAAAAC2w/ubBDdaIr-1g/s1600/mr6.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 192px; height: 320px;" src="http://3.bp.blogspot.com/-B4l5Cp-jzMw/ThipVaBHs6I/AAAAAAAAC2w/ubBDdaIr-1g/s320/mr6.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5627433919625802658" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;さすがに夜中に600個ウィジェット並べる作業は疲れたよ。&lt;br /&gt;っていうか、Launcher Proのフォーラムに最低16x16は欲しい、とか投稿しとこうかな。&lt;br /&gt;あ、Launcher Proの設定でAuto-fit ItemsをONにしとくとわりと綺麗に敷き詰められるよ！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5587841204043490178-1633053907681708123?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BvVRFDf7bPNXujUU-ClVZ28HaBs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BvVRFDf7bPNXujUU-ClVZ28HaBs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BvVRFDf7bPNXujUU-ClVZ28HaBs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BvVRFDf7bPNXujUU-ClVZ28HaBs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/UDKpYSgFz44" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/1633053907681708123/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/07/blog-post.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/1633053907681708123?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/1633053907681708123?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/UDKpYSgFz44/blog-post.html" title="ウィジェットでマリオ" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-H0BDmMddUEw/Thil1t89J6I/AAAAAAAAC14/0OfYPvwRJM8/s72-c/mario-ruise.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/07/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIAQXw5fyp7ImA9WhdSE0s.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-4955622321405870815</id><published>2011-07-04T00:43:00.009+09:00</published><updated>2011-07-23T05:45:40.227+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-23T05:45:40.227+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>(Gallery起動的に)ハニコム対応したよｗ みたいな</title><content type="html">Honeycomb端末手に入れました。&lt;br /&gt;自分のアプリからGalleryアプリを起動しようとしたら異常終了してたので対応したよ。&lt;br /&gt;FragmentだのActionBarだのはまだまだこの後。&lt;br /&gt;っていうか、何とかしてくれ、このバージョン依存コードｗ&lt;br /&gt;この手がダメならあの手であの手がダメならこっちから攻めてそれでもダメならHTCだろ--!!!みたいな。&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;// ギャラリー表示&lt;br /&gt;Intent intent = null;&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;    // for Hanycomb&lt;br /&gt;    intent = new Intent();&lt;br /&gt;    intent.setClassName("com.android.gallery3d", "com.android.gallery3d.app.Gallery");&lt;br /&gt;    startActivity(intent);&lt;br /&gt;    return;&lt;br /&gt;}&lt;br /&gt;catch(Exception e)&lt;br /&gt;{&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;        // for Recent device&lt;br /&gt;        intent = new Intent();&lt;br /&gt;        intent.setClassName("com.cooliris.media", "com.cooliris.media.Gallery");&lt;br /&gt;        startActivity(intent);&lt;br /&gt;    }&lt;br /&gt;    catch(ActivityNotFoundException e1)&lt;br /&gt;    {&lt;br /&gt;        try&lt;br /&gt;        {&lt;br /&gt;            // for Other device except HTC&lt;br /&gt;            intent = new Intent(Intent.ACTION_VIEW);&lt;br /&gt;            intent.setData(Uri.parse("content://media/external/images/media"));&lt;br /&gt;            startActivity(intent);&lt;br /&gt;        }&lt;br /&gt;        catch (ActivityNotFoundException e2)&lt;br /&gt;        {&lt;br /&gt;            // for HTC&lt;br /&gt;            intent = new Intent();&lt;br /&gt;            intent.setClassName("com.htc.album", "com.htc.album.AlbumTabSwitchActivity");&lt;br /&gt;            startActivity(intent);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&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/5587841204043490178-4955622321405870815?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ayMfF8gF7CDbOS3NHhXXSHv-GxY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ayMfF8gF7CDbOS3NHhXXSHv-GxY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ayMfF8gF7CDbOS3NHhXXSHv-GxY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ayMfF8gF7CDbOS3NHhXXSHv-GxY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/XPk37nRG-gs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/4955622321405870815/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/07/gallery.html#comment-form" title="1 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/4955622321405870815?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/4955622321405870815?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/XPk37nRG-gs/gallery.html" title="(Gallery起動的に)ハニコム対応したよｗ みたいな" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/07/gallery.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMBRHs9eCp7ImA9WhZaFko.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-4567996162936927919</id><published>2011-07-03T14:36:00.002+09:00</published><updated>2011-07-03T16:00:55.560+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-03T16:00:55.560+09:00</app:edited><title>デ部9資料</title><content type="html">デ部9でANT+について話しました。&lt;br /&gt;&lt;a href="https://docs.google.com/viewer?a=v&amp;pid=explorer&amp;chrome=true&amp;srcid=0BwRvAQuV9tyYYTkyMDBhMzAtYzIxYS00YjU0LWFlOTgtOTI1M2E3ZGE4ZjFm&amp;hl=ja"&gt;資料&lt;/a&gt;です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5587841204043490178-4567996162936927919?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HHatCMCvFYQ_2QWx2DW94Q-qY9A/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HHatCMCvFYQ_2QWx2DW94Q-qY9A/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HHatCMCvFYQ_2QWx2DW94Q-qY9A/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HHatCMCvFYQ_2QWx2DW94Q-qY9A/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/bPtGGwJxdVQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/4567996162936927919/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/07/9.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/4567996162936927919?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/4567996162936927919?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/bPtGGwJxdVQ/9.html" title="デ部9資料" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/07/9.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAFRH04eyp7ImA9WhZaEEQ.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-2682228850091266230</id><published>2011-06-26T22:50:00.003+09:00</published><updated>2011-06-26T23:15:15.333+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-26T23:15:15.333+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>MacでAndroid実機が認識されない(EasyTetherが原因)</title><content type="html">Mac歴6ヶ月。&lt;br /&gt;MacでAndroidアプリ開発しようと思って使い始めたのに、どういうわけかDDMSが実機を認識してくれない。&lt;br /&gt;原因がわかったのでメモメモ。&lt;br /&gt;&lt;br /&gt;◆原因&lt;br /&gt;&lt;a href="http://www.mobile-stream.com/easytether/android.html"&gt;EasyTether&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;◆解決策&lt;br /&gt;&lt;a href="https://market.android.com/details?id=com.faveset.klink"&gt;KLink&lt;/a&gt;に切り替える。&lt;br /&gt;一度、EasyTetherを使ってしまったMacは以下の手順で設定ファイルを削除する必要があります。&lt;br /&gt;詳しくはKlinkの「&lt;a href="http://www.faveset.com/klink/docs/pc#h02_"&gt;Set up your Computer&lt;/a&gt;」参照。&lt;br /&gt;&gt; rm /System/Library/Extensions/EasyTetherUSBEthernet.kext&lt;br /&gt;&gt; reboot&lt;br /&gt;&lt;br /&gt;◆お断り&lt;br /&gt;本記事は、Androidでテザリング機能が標準搭載されない時代の話です。&lt;br /&gt;まもなくWiFiテザリングが標準搭載される機種が大量に発売されるはずです。&lt;br /&gt;そんな端末を持っていればここでの話でハマる必要もないでしょう。&lt;br /&gt;&lt;br /&gt;◆詳細&lt;br /&gt;&lt;a href="http://t.co/xZkdnZe"&gt;開発者はEasyTetherを使うな&lt;/a&gt;&lt;br /&gt;EasyTetherはとても良くできたアプリだと思います。&lt;br /&gt;Android側でUSBをEnableしておいて接続するだけでネットワーク接続されます。&lt;br /&gt;普通にMacでUSBテザリングするにはベストチョイスかと思います。&lt;br /&gt;でも、Macを使う上ではEasyTetherはUSB接続されたタイミングで、&lt;br /&gt;ネットワーク設定を強制的に書き換えてしまうため、&lt;br /&gt;DDMSで認識されなくなってしまいます。&lt;br /&gt;そんなわけでKlinkを使うことにしました。&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/5587841204043490178-2682228850091266230?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ciRlwAR7RPeMv7a1U4Og9OP_h2Y/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ciRlwAR7RPeMv7a1U4Og9OP_h2Y/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ciRlwAR7RPeMv7a1U4Og9OP_h2Y/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ciRlwAR7RPeMv7a1U4Og9OP_h2Y/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/5RGs_EefmUc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/2682228850091266230/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/06/macandroideasytether.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/2682228850091266230?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/2682228850091266230?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/5RGs_EefmUc/macandroideasytether.html" title="MacでAndroid実機が認識されない(EasyTetherが原因)" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/06/macandroideasytether.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YAQXk5cCp7ImA9WhZVFEs.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-3160310823644132397</id><published>2011-05-27T12:39:00.005+09:00</published><updated>2011-05-27T13:05:40.728+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-27T13:05:40.728+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ANT+" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>ANT+ なセンサーに対応してみました</title><content type="html">ここしばらくANT/ANT+について調べていましたが、ようやくSmartTrainingにANT/ANT+対応機能を乗せてみました。&lt;br /&gt;&lt;br /&gt;とりあえずできるのは&lt;a href="https://buy.garmin.com/shop/shop.do?pID=15516"&gt;Foot Pod&lt;/a&gt;で計測した歩数および距離データをスマトレ側で扱えるようにしたこと。&lt;br /&gt;スマトレの万歩計の精度が悪いとお嘆きのアナタ！本物のセンサーのデータが利用できるようになりましたよ！&lt;br /&gt;っていうか、事実上Xperia arcはスリープ中に万歩計が動かないので、Foot Podを利用すれば大丈夫！みたいな感じです。&lt;br /&gt;&lt;br /&gt;自分の理解では、&lt;br /&gt;・ANTは近距離無線の規格。&lt;br /&gt;・ANT+ではプロファイルを定義して一定の種類のセンサーのデータの受け渡しフォーマットを規定。&lt;br /&gt;です。&lt;br /&gt;&lt;br /&gt;ANTなセンサーからデータを受け取るには、&lt;br /&gt;・&lt;a href="http://www.thisisant.com/pages/developer-zone/android-api"&gt;ANT対応のAndroid&lt;/a&gt;が必要。&lt;br /&gt;・ANT Radio Serviceのインストールが必要(Marketで見つかるよ)&lt;br /&gt;・ANT API for Androidを扱うアプリケーションを作る。&lt;br /&gt;　ANTセンサーから取得したデータはANT+の仕様に則ってパースする必要がある。&lt;br /&gt;　仕様は&lt;a href="http://www.thisisant.com/"&gt;This is antサイト&lt;/a&gt;にDeveloper登録することで入手できる。&lt;br /&gt;ってな感じです。&lt;br /&gt;&lt;br /&gt;ANT+の仕様はオープンなので仕様書を読めばパースの方法はわかるのですが面倒(オイオイ)。&lt;br /&gt;そんな時は、Wahoo Fitnessが提供する「&lt;a href="http://api.wahoofitness.com/android/beta/"&gt;Wahoo Fitness API&lt;/a&gt;」を利用することでパース処理を書かなくてもデータが取得できるようになります。&lt;br /&gt;つっても、デバイスをほぼ直接制御するので接続、切断なんかの概念を理解するのにはやっぱり基本がわかってないと辛い。Wahoo Fitness APIはWahooの中の人にメールしたらくれました。ただし、「Garminのセンサーで動くよ！」って宣伝しないといけないという制約が付いてきちゃいますが。&lt;br /&gt;&lt;br /&gt;Garmin以外のセンサーについては、試してないので利用できるかは知りません。&lt;br /&gt;でもANT+はプロファイル含め規定されているので大丈夫なんじゃないかな！たぶん。&lt;br /&gt;&lt;br /&gt;あと、ANTなセンサーは電波を発する機械ですので日本国内では&lt;a href="http://www.tele.soumu.go.jp/giteki/SearchServlet?pageID=jk01&amp;NAM=Dynastream&amp;NUM=&amp;FOM=&amp;ERA=1&amp;YAR=&amp;MON=&amp;DAY=&amp;RAD=00-00-00-00&amp;TEC=1&amp;TEC=2&amp;TEC=3&amp;TEC=4&amp;TEC=5&amp;TEC=6&amp;TEC=7&amp;SK=0&amp;DC=0&amp;SC=1&amp;as_fid=z0wa1seoMr3XIknGemfr#searchlist"&gt;総務省が認可したデバイス&lt;/a&gt;じゃないといけないらしいです。技適マークってのがついてるヤツ。&lt;br /&gt;Xperia mini x10なんてのも見たけど技適マークないしなぁ。むむむ。&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/5587841204043490178-3160310823644132397?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/By7w3k55aL5e4ernluwCXOeDFaA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/By7w3k55aL5e4ernluwCXOeDFaA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/By7w3k55aL5e4ernluwCXOeDFaA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/By7w3k55aL5e4ernluwCXOeDFaA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/7kmehdx2Pkk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/3160310823644132397/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/05/ant.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/3160310823644132397?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/3160310823644132397?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/7kmehdx2Pkk/ant.html" title="ANT+ なセンサーに対応してみました" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/05/ant.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAFRHs8fSp7ImA9WhZRF0g.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-2237458053098949318</id><published>2011-04-14T12:51:00.005+09:00</published><updated>2011-04-14T13:01:55.575+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-14T13:01:55.575+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IS03" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>IS03とDesire比較(IS03リベンジ編)</title><content type="html">&lt;a href="http://awwa500.blogspot.com/2010/12/is03desire.html"&gt;IF03とDesire比較&lt;/a&gt;で、Eclair時代のIS03の性能を評価していましたが、この度、IS03がFroyoにバージョンアップしたので、もう一度ベンチマークやってみました。例によって、ザクっと触っただけだから深刻に受け止めないでね。&lt;br /&gt;結果は以下。&lt;br /&gt;&lt;br /&gt;◆結果&lt;br /&gt;I：IS03(Eclair)&lt;br /&gt;D：Desire&lt;br /&gt;If：IS03(Froyo)&lt;br /&gt;を意味する。&lt;br /&gt;&lt;br /&gt;1.定量的比較&lt;br /&gt;　◇結果&lt;br /&gt;　　※数値がデカイ方が速い。&lt;br /&gt;　　・Linpack(Mflops)&lt;br /&gt;　　　I：6.01&lt;br /&gt;　　　D：38.5&lt;br /&gt;　　　If：37.33&lt;br /&gt;　　・Composite&lt;br /&gt;　　　I：7.06&lt;br /&gt;　　　D：48.7&lt;br /&gt;　　　If：47.71&lt;br /&gt;　　・Fast Fourie Transform&lt;br /&gt;　　　I：4.97&lt;br /&gt;　　　D：30.5&lt;br /&gt;　　　If：30.36&lt;br /&gt;　　・Jacobi Successive Over-relaxation&lt;br /&gt;　　　I：13.3&lt;br /&gt;　　　D：107.8&lt;br /&gt;　　　If：103.69&lt;br /&gt;　　・Monte Carlo integration&lt;br /&gt;　　　I：1.53&lt;br /&gt;　　　D：8.43&lt;br /&gt;　　　If：8.04&lt;br /&gt;　　・Sparse matrix multiply&lt;br /&gt;　　　I：6.84&lt;br /&gt;　　　D：38.1&lt;br /&gt;　　　If：38.08&lt;br /&gt;　　・dense LU matrix factorization&lt;br /&gt;　　　I：8.67&lt;br /&gt;　　　D：58.7&lt;br /&gt;　　　If：58.39&lt;br /&gt;　　・Draw canvas&lt;br /&gt;　　　I：27.0&lt;br /&gt;　　　D：60.6&lt;br /&gt;　　　If：28.80&lt;br /&gt;　　・Draw Circle&lt;br /&gt;　　　I：29.0&lt;br /&gt;　　　D：58.3&lt;br /&gt;　　　If：29.84&lt;br /&gt;　　・Draw Cube&lt;br /&gt;　　　I：27.3&lt;br /&gt;　　　D：46.3&lt;br /&gt;　　　If：28.45&lt;br /&gt;　　・OpenGL Blending&lt;br /&gt;　　　I：28.3&lt;br /&gt;　　　D：47.6&lt;br /&gt;　　　If：29.38&lt;br /&gt;　　・OpenGL Fog&lt;br /&gt;　　　I：28.5&lt;br /&gt;　　　D：47.5&lt;br /&gt;　　　If：29.41&lt;br /&gt;　　・Flying Teapot&lt;br /&gt;　　　I：28.9&lt;br /&gt;　　　D：19.3&lt;br /&gt;　　　If：19.05&lt;br /&gt;&lt;br /&gt;2.定量的比較&lt;br /&gt;面倒なのでざっくり感触だけ。&lt;br /&gt;んー、なんか少しレスポンスは良くなったかな？&lt;br /&gt;でも、Desireほどじゃない気はする。&lt;br /&gt;&lt;br /&gt;◆まとめ&lt;br /&gt;演算系(DrawXX,OpenGLXX以外)はDesire並に高速化された。&lt;br /&gt;描画系(DrawXX,OpenGLXX)はあんまり変わらない。&lt;br /&gt;感覚的にはレスポンスよくなったかも。Desireほどじゃないけど。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5587841204043490178-2237458053098949318?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KprtBSpSUm2sGsmaomVEnasuJaE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KprtBSpSUm2sGsmaomVEnasuJaE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KprtBSpSUm2sGsmaomVEnasuJaE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KprtBSpSUm2sGsmaomVEnasuJaE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/Rdl7q1owPQg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/2237458053098949318/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/04/is03desireis03.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/2237458053098949318?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/2237458053098949318?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/Rdl7q1owPQg/is03desireis03.html" title="IS03とDesire比較(IS03リベンジ編)" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/04/is03desireis03.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ACRX04fSp7ImA9WhZRFk8.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-3000374728641559977</id><published>2011-04-12T23:16:00.010+09:00</published><updated>2011-04-13T00:22:44.335+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-13T00:22:44.335+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Google Apps Device Policy" /><category scheme="http://www.blogger.com/atom/ns#" term="Security" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>Google Apps Device Policyはじめました(冷やし中華風に)</title><content type="html">企業ユースではイマイチセキュリティ面で弱い、とされているAndroid。（ここでいう「セキュリティ」とは端末紛失時のデータ漏洩への対策という意味ね。ウイルス対策とかの話はここでは無関係）&lt;br /&gt;そんなAndroidのセキュリティ強化ソリューションの一つであるGoogle Apps Device Policy試してみました。&lt;br /&gt;詳しくは&lt;a href="http://www.google.com/support/mobile/bin/answer.py?hl=en&amp;answer=190930"&gt;こちら&lt;/a&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;・ドメイン内DNSにCNAMEレコードを追加できる、または、ドメイン内のWebサーバにコンテンツを追加することができる。&lt;br /&gt;・&lt;a href="http://www.google.com/apps/intl/ja/business/index.html"&gt;Google Apps&lt;/a&gt;に自ドメインを登録して利用開始する必要がある。ドメイン登録の際、ドメイン管理権限を持っていることを証明するため、上記CNAMEレコードの追加またはWebサーバにコンテンツを追加することを求められる。&lt;br /&gt;・Google AppsのEditionをBusinessまたはEducationにアップグレードする必要がある。Businessにアップグレードするためには、年間1アカウントあたり50ドルかかる。&lt;br /&gt;・Editionアップグレード時にクレジットカードの入力を求められる。(1ヶ月間の評価期間中は請求されない。それまでキャンセル可能。)&lt;br /&gt;・モバイルサービスの設定で端末の設定を行う必要がある。&lt;br /&gt;　端末の設定はいわゆるセキュリティポリシーの設定です。詳しくは「できること」参照。&lt;br /&gt;・Google Appsに各ユーザーのアカウントを登録する必要がある。&lt;br /&gt;&lt;br /&gt;☆各ユーザーがすべき準備&lt;br /&gt;・管理者が登録したアカウントでGoogleに一度ログインする。&lt;br /&gt;・Android2.2以上を持っている必要がある。&lt;br /&gt;・Android端末にGoogle Apps Device Policyというアプリをインストールする必要がある。Android Marketからダウンロード可能。&lt;br /&gt;・Google Appsに登録したアカウントをGoogle Apps Device Policy設定時に選ぶ。&lt;br /&gt;&lt;br /&gt;■なにが起こるか&lt;br /&gt;・端末がGoogle Syncすることで、管理者が設定したセキュリティポリシーが端末に強制適用されます。&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://3.bp.blogspot.com/-h3HCreN0cM0/TaRrHLEE4II/AAAAAAAACv8/KfBp25cNuns/s1600/DevicePolicy.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 160px;" src="http://3.bp.blogspot.com/-h3HCreN0cM0/TaRrHLEE4II/AAAAAAAACv8/KfBp25cNuns/s320/DevicePolicy.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5594714408074141826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Androidだと緑色の小さいアイコンがある奴だけが利用出来る。&lt;br /&gt;・端末へのパスワード設定をユーザーに要求&lt;br /&gt;・パスワードの安全度を2段階(普通、強)から選択可能。&lt;br /&gt;・パスワード最少文字数&lt;br /&gt;・自動的に端末をロックするまでの時間&lt;br /&gt;・誤ったパスワードを入力された際に端末をワイプするまでの回数&lt;br /&gt;・ユーザを指定して任意のタイミングでリモートワイプ&lt;br /&gt;・Android3.0だと端末内データの暗号化が利用可能&lt;br /&gt;・ほかにも&lt;a href="http://news.nifty.com/cs/technology/internetdetail/jic-20110411-20110411001/1.htm"&gt;Google Apps Lookup&lt;/a&gt;とかが利用出来るみたい。&lt;br /&gt;・&lt;a href="https://www.google.com/apps/mydevices?pli=1"&gt;My Device&lt;/a&gt;を利用すると紛失した端末の場所を地図上に表示したり、電話をかけたりすることができる。&lt;br /&gt;&lt;br /&gt;■感想&lt;br /&gt;・BlackBerry Enterprise Serverのセキュリティポリシー設定数が500項目近いことと比較すると機能的な充実度は圧倒的にBlackBerryの方が高いが、Androidだと最低限パスワードの強制適用とリモートワイプはできる。細かい設定したってどうせ使いこなせないんだったら、これで十分でしょ。みたいに思えなくもない。オレ、IT管理者じゃないから適当なこと言ってるけどｗ&lt;br /&gt;・ドメイン登録あたりはちょっと面倒だけど、そこさえ通過すれば、何もサーバだのハードウェアだのを準備する必要がない。DNS立てられればそれでOK。思い立ったその日に環境を整えることができる。恐ろしいほど手軽に利用開始できる。ちょっとしたセキュリティ対策ソリューション用のサーバを構築するのと比べたら雲泥の差だ。&lt;br /&gt;・自動的にGmailだのGoogleカレンダーだのがグループウェア的に利用出来るし、当然Androidとも何の違和感もなく連携する。うちの会社もこれ使えばいいのに。って本気で思う。きっとわけのわかんないウンコみたいな某リモートWebメールなんかより不正アクセスに対する強度は確実に高いし、死ぬほど見やすくて、メールの処理能力がハンパなく高い。&lt;br /&gt;・パスワード強制されるのがウザイ。これだけでAndroid端末使うモチベーションが半減する。（まぁ、ある程度しょうがないんだろうけどｗ）&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/5587841204043490178-3000374728641559977?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7fC6V_wWl1mFsV6ZySRK57u9aQQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7fC6V_wWl1mFsV6ZySRK57u9aQQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7fC6V_wWl1mFsV6ZySRK57u9aQQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7fC6V_wWl1mFsV6ZySRK57u9aQQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/f2NcebE7tks" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/3000374728641559977/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/04/google-apps-device-policy.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/3000374728641559977?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/3000374728641559977?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/f2NcebE7tks/google-apps-device-policy.html" title="Google Apps Device Policyはじめました(冷やし中華風に)" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-h3HCreN0cM0/TaRrHLEE4II/AAAAAAAACv8/KfBp25cNuns/s72-c/DevicePolicy.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/04/google-apps-device-policy.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQHQ3g8fSp7ImA9WhZRF0U.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-7578272740191772268</id><published>2011-04-11T12:52:00.009+09:00</published><updated>2011-04-14T22:38:52.675+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-14T22:38:52.675+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SmartTraining" /><category scheme="http://www.blogger.com/atom/ns#" term="LibAndrotranslation" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><title>翻訳リソースキター！</title><content type="html">ちょっと前にSmartTrainingに&lt;a href="http://code.google.com/p/libandrotranslation/"&gt;libandrotranslation&lt;/a&gt;を組み込んで、英語、日本語以外もまともに対応していこう、と思っていました。&lt;br /&gt;&lt;br /&gt;libandrotranslationについて詳しくは&lt;a href="http://sakaneya.blogspot.com/2011/02/android-libandrotranslation.html"&gt;こちら&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-o08T944IU0s/TaLBJHxfBII/AAAAAAAACv0/1QC5l85UwYs/s1600/device.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://4.bp.blogspot.com/-o08T944IU0s/TaLBJHxfBII/AAAAAAAACv0/1QC5l85UwYs/s320/device.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5594246049597162626" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;誰からも何も来なかったらそれはそれでネタにしようと思っていましたが、ついに対応から1ヶ月？ようやく初めての翻訳リソースが来ました！&lt;br /&gt;来た言語_国は、「pt_BR」。。。何それ、、、初めて見た。&lt;br /&gt;調べてみたらそれは、ptはポルトガル語、BRはたぶんブラジルじゃない？&lt;br /&gt;ブラジルといえば&lt;a href="http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1022990850"&gt;これ&lt;/a&gt;っていうか、遠すぎてよくわかんない、アツい、サッカー、鉄鉱石、くらいしか。&lt;br /&gt;でもGraças, Graças。開始ボタンだけポルトガル語らしい。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-g8YiymsP59U/Tab4lQabz2I/AAAAAAAACwE/62UO10sSptU/s1600/pt_BR.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://1.bp.blogspot.com/-g8YiymsP59U/Tab4lQabz2I/AAAAAAAACwE/62UO10sSptU/s320/pt_BR.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5595432905999109986" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;SmartTrainingはジーコを応援しています。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5587841204043490178-7578272740191772268?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FHlVp4gjQowz5m-iZQ3993Isht0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FHlVp4gjQowz5m-iZQ3993Isht0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FHlVp4gjQowz5m-iZQ3993Isht0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FHlVp4gjQowz5m-iZQ3993Isht0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/oJ0L3RBR-18" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/7578272740191772268/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/04/blog-post.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/7578272740191772268?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/7578272740191772268?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/oJ0L3RBR-18/blog-post.html" title="翻訳リソースキター！" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-o08T944IU0s/TaLBJHxfBII/AAAAAAAACv0/1QC5l85UwYs/s72-c/device.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/04/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcNRHY7fCp7ImA9WhZRFEQ.&quot;"><id>tag:blogger.com,1999:blog-5587841204043490178.post-364935302518894667</id><published>2011-04-11T11:29:00.004+09:00</published><updated>2011-04-11T12:21:35.804+09:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-11T12:21:35.804+09:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Xperia" /><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="Arc" /><title>Xperia Arcで画面レイアウトが崩れる時ー！崩れる時ー！（いつもここから風に）</title><content type="html">Xperia Arc上でSmartTrainingを起動すると画面が崩れるという問い合わせがあったので対応してみました。&lt;br /&gt;実機を持っていないので、強力な協力者(ええ、ダジャレですがなにか)にも支援いただきました。感謝。&lt;br /&gt;&lt;br /&gt;■原因&lt;br /&gt;AndroidManifest.xmlの記述がanyDensity=falseになっていた。&lt;br /&gt;&lt;br /&gt;■対応&lt;br /&gt;AndroidManifest.xmlの記述をanyDensity=trueに変更した。いじょ。&lt;br /&gt;&lt;br /&gt;■副作用&lt;br /&gt;MapView上のOverlayItemのサイズが解像度に依存してしまう。&lt;br /&gt;→dimens.xmlでdp指定したサイズを読み込んで描画することで対応。&lt;br /&gt;&lt;br /&gt;■経緯&lt;br /&gt;詳しくは協力者のるるるさんの&lt;a href="http://ru3memo.wordpress.com/2011/04/06/xperia%E3%81%8A%E3%81%9F%E3%81%8F%E3%81%B8%E3%81%AE%E9%81%93%EF%BC%92%EF%BC%8D%EF%BC%95/"&gt;ブログ&lt;/a&gt;参照。&lt;br /&gt;Twitterで呼びかけたところ、るるるさんにご協力いただくことになりました。何度も何度もインストールとキャプチャ繰り返していただき本当にありがとうございました。&lt;br /&gt;&lt;br /&gt;開発者視点で書くと、&lt;br /&gt;・ヒアリングした状況&lt;br /&gt;　・画面レイアウトが崩れる。&lt;br /&gt;　・トップ画面だけ崩れる(他画面もほぼ同じ作りなのに)。&lt;br /&gt;　・一度崩れた画面でも画面遷移で戻ると直る。&lt;br /&gt;・試したこと&lt;br /&gt;　・一部の文字のサイズ指定がdpになっていたので、sp指定に変更。&lt;br /&gt;　　→変化なし。&lt;br /&gt;　・SingleLine=trueのオプションを追加&lt;br /&gt;　　→ボタン文字列が2行に渡ることは無くなった。でも字がデカイまま。&lt;br /&gt;　・文字のサイズ指定そのものを小さくするように変更。&lt;br /&gt;　　→確かに小さくはなったが、許せん。&lt;br /&gt;　・「Xperia Arc 画面 崩れ」でググると、Spare PartsのCompatibility ModeをOFFにすると直るとの情報。&lt;br /&gt;　　→&lt;a href="http://www.datacider.com/tag/compatibility-mode/"&gt;画面の表示のズレを解消するアプリ「Spare Parts」&lt;/a&gt;&lt;br /&gt;　　→現象が発生しなくなることを確認。ってことはアプリ側の設定が古いバージョン向けになってるのね。というところにたどり着きました。&lt;br /&gt;&lt;br /&gt;元々、SmartTrainingのAndroidManifest.xmlはこうなっていました。&lt;br /&gt;＜uses-sdk android:minSdkVersion="3" /＞&lt;br /&gt;＜supports-screens  &lt;br /&gt;    android:smallScreens="true"  &lt;br /&gt;    android:normalScreens="true"  &lt;br /&gt;    android:largeScreens="true"  &lt;br /&gt;    android:anyDensity="false" /＞&lt;br /&gt;古いアプリなので、今時、minSdkが3となっています。そして、できるだけ広い範囲のデバイスで動作して欲しいのでsupprots-screensも書いてあります。&lt;br /&gt;anyDensityがfalseだとシステム側がいい塩梅で適当にやってくれるので楽～。だったのですが、Xperia Arcさんは「昔のことなんて覚えてねぇぜ(いや、時々忘れちゃうぜ、が正しいか)」とばかりにこの設定を無視してくれるので、画面が崩れます。&lt;br /&gt;というわけで、こいつをtrueにして対応だん。&lt;br /&gt;&lt;br /&gt;、、、としてリリースしたのですが、MapView上のOverlayItem(このアプリでいうと、ラリー画面の吹出しみたいなやつが該当します)が解像度に応じてサイズが大幅に変わる、という現象に気付いてしまいました。（ええ、テストしていませんがなにか）&lt;br /&gt;&lt;br /&gt;原因は簡単で、OverlayItemの描画をコード上で生々しく数値で座標指定していたのに、anyDensity=trueになってしまったから。例えて言うなら、農業保護政策がいきなり撤廃されて、それまで国外からの安い農産物が大量に輸入されるのが防がれていたのが、なくなっちゃった状況です。しょうがないね、ということで、dimen.xmlにdp指定で座標を定義してそれを読み込むことで解決。&lt;br /&gt;→答えはぜんぶここに書いてありました。「&lt;a href="http://y-anz-m.blogspot.com/2010/02/android-multi-screen.html"&gt;Y.A.M の 雑記帳 Android multi screen 対応&lt;/a&gt;」さすがです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5587841204043490178-364935302518894667?l=awwa500.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OAYHgtrZcTpfZs-UBSaAjrGGd3w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OAYHgtrZcTpfZs-UBSaAjrGGd3w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OAYHgtrZcTpfZs-UBSaAjrGGd3w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OAYHgtrZcTpfZs-UBSaAjrGGd3w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/iUnjw/~4/VnIuNf20XNw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://awwa500.blogspot.com/feeds/364935302518894667/comments/default" title="コメントの投稿" /><link rel="replies" type="text/html" href="http://awwa500.blogspot.com/2011/04/xperia-arc.html#comment-form" title="0 件のコメント" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/364935302518894667?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5587841204043490178/posts/default/364935302518894667?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/blogspot/iUnjw/~3/VnIuNf20XNw/xperia-arc.html" title="Xperia Arcで画面レイアウトが崩れる時ー！崩れる時ー！（いつもここから風に）" /><author><name>Wataru Sato</name><uri>https://profiles.google.com/101786994528911118320</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-fh56q49thbM/AAAAAAAAAAI/AAAAAAAAC0o/V1WJ8pwss-I/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://awwa500.blogspot.com/2011/04/xperia-arc.html</feedburner:origLink></entry></feed>

