Adsense_top

2010年12月17日金曜日

HTC Desire(X06HT)実質負担金がゼロ円に..

Desire (X06HT II)が実質負担金が、新スパーボーナス+パケットし放題MAX for スマートフォン(月々割適用条件)加入で「0円」になっちゃいました。
一括で6万数千円(当時の実質負担金は2万5千円位だったと思う)で買った者としては、何か悔しいような気分です。


詳細は、ソフトバンク オンラインショップのX06HT II実質負担額が載っているページで↓
https://onlineshop.mb.softbank.jp/ols/mobile/WOS001Control/WOS001003/TE001?applType=&srvcFlg=&modelId=1136&subId=0&agncyId=sbm_d2


スマートフォンの購入を考えている方には朗報なんだと思います。今日のネットでのニュースに載っていたスマートフォンを買わない理由のアンケート結果で価格がトップでした。
価格でスマートフォンの購入を躊躇している人にお勧めです。(なんでSoftBankの宣伝してるんだ?)


Android 2.2にアップデート出来ますし、性能的にも内部容量(Desireの唯一の欠点?)を除けば決して負けてない処が、十分上位に付けていると思います。
また、内部容量の問題もAndroid 2.2でSDカード側にアプリのインストールが可能になり、SDカードインストール可能なアプリ自体も、ここ2カ月ほどで急速に増えてきています。実際に私のDesireでも、以前から入れていたアプリのアップデートで対応されてSDカードに移すなどして、インストールしているアプリが相当増えていますが、空き容量は少し増えてきたぐらいです。(SDカードインストール対応のアプリでも一部は本体に残りますのでゼロになるわけではありませんので念のため)。
また、最近の機種が軒並み、予約・入荷待ち状態を考えると、入手しやすさからもお勧めです。


悔しいと書きながらも、仲間が増えるほうが嬉しいので、宣伝をしてしまいました。


2010年12月16日木曜日

HTC Desire(X06HT)マーケットのアプリが変わった

超久しぶりエントリーです。
今日の夜にDesireでAndroid Marketアプリを開くと、いつの間にか更新され、画面が変わっていました。
昼間に見た時は、変わっていなったので、今日の午後に更新がかかったのだと思います。


こんな感じです。


・縦


・横


見た目は良くなったような気がしますが、緑の部分が増えた結果、アプリ名の表示部分が少なくなりスクロールをやたらしなくてはいけなくなって、使用感という意味では少し使いづらくなっちゃったような...


2010年10月25日月曜日

HTC Desire(X06HT) Android 2.2でSDカードにアプリ移動

Android 2.2の目玉機能の、SDカードへのインストールの事を書くのを忘れていました。
 今のところ、この機能に対応しているアプリ自体少ないので、今まで試していませんでした。
 ただアプリの作成自体は基本的に設定を、端末内かSDカード内、またはいずれかを設定するだけなので、以降徐々に増えていく事を期待できます。

 私のDesireでは、4つのアプリしか対応していませんででしたが、8MBほどSDカードにインストールすることにより、端末内の容量を稼げました。
 Desire自体が内部ストレージが少ないので助かります。良いようにとれば、HTCはこれを見越して、内部メモリを少なくしコストを稼いだのかも知れません。

 移動した結果は、特に問題もなくアプリは動きました。また、起動が遅くなるということも、全く内部にインストールした場合と差は感じられませんでした。
 外部メモリーモードでPCと接続するとホーム画面のすべてのアプリ(ランチャー)に表示されなくなり、使用は出来なくなります。
 中々、Androidは賢いやつです。


2010年10月19日火曜日

HTC Desire(X06HT) Android 2.2で気がついた事2

昨日、気に入っていると書いた、2.2になり新たに追加されたアプリ「天気とニュース」で問題をみつけました。
 音楽再生中に、「更新」をすると断続的に音飛びを起こします。音楽を聴きながらニュースを見ようと、このアプリをを開きめにゅーから「更新」をすると、数秒後から、音飛びを起こし始めました。
 何度か同じことをしてみたところ、他のアプリを使っている時には音飛びは起こしませんでしたので、多分間違いないです。
 原因はよく解りませんが、推測するにニュースなど内容をSDカードにキャッシュしているのかなぁと思います。
 この場合は、アプリ、OS、SDカードの、いずれをを悪いと言うべきか悩みますが、最終的にはプラットホームに合わす以外ないので、アプリが対応すべきかと思いますので(どうしても回避出来ないOSの問題と言うの場合いもありますが..)、どちらにしてもGoogleさんが直してくれること期待します。


 もう一つ、同じく昨日書きました、SoftbankのWi-Fiスポット接続アプリのエラーの件です。これは確信を持っているわけではないのですが、「Norton Mobile Security(ベータ版)」が原因かもしれません。
 昨日、「もしかいて」と思い、Nortonをアンインストールしてから、エラーが出ていません。昨日エラーが出た場所付近でウロウロしましたが出ませんでした。推測なので、もし同様の環境で同じようなエラーが出る方、試して結果を教えていただければ有り難いです。


 悪い点ばかりじゃ寂しいので、良くなった所も一つ書いておきます。
Softbankの「Wi-Fiスポット接続」で認証中に、ホームの上部にあるステータスバーに状態が通知されるようになりました。


2010年10月18日月曜日

HTC Desire(X06HT) Android 2.2で気がついた事

Android 2.2にアップデートしてから、気がついた点が新たに出てきましたのでダラダラと書いておきます。


・「天気とニュース」というGoogleのアプリが追加されていました。ウィジェットとしてホーム画面に置く事も出来ます。
 「天気」は、そのまま現在地の天気が表示されます。「ニュース」はGoogle ニュースのタイトルを表示ます。
 ウィジェットでは、ニュースが順に送られていきます。アプリを開くと、通常の「Google ニュース」同様のカテゴリ分けされ(設定で表示するカテゴリは選択できます)ニュースをよく読む人には便利です。
 また、この手のアプリでよくある、更新中はアプリが使えない状態になるのではなく、バックグラウンドで更新される点も良いところです。
 何より、「Google ニュース」は一つのニュースソースから得られた情報でなく、収集されたニュースなのでパソコンでもよく使っていたので、Androidで同様に観られるので気に入っています。


 


・2.1の時は、たまにスクロールやタッチへの反応が緩慢になる時があったのが、多少は残っていますが大分改善されたように思います。タスクの管理が利口になったのかもしれません。


・HTC Sense(Desire標準のホームアプリ)が何度か応答なしで、再起動(本体でなくHTC Senseの再起動)することが起こるようになった。
 2.1の時も何度かは経験しましたが、2.2にしてからの頻度が多くなっているように感じられます。
 HTC Senseが悪いのか、2.2の絡みで他のアプリが原因となっているのかは現時点では判断できません。
 頻度が高いと言っても、一日に何度も起こるような頻度で起こるわけではないので少し様子見いします。


・SoftbankのWi-Fi接続ツールについて2つ。
 1つ目は、どうでも良いことだが、接続のON / OFF の位置が左右逆転して右がONに変わっていた。
 2つ目は、たまにWi-FiをONにしたまま外を歩いていると、接続ツールがエラーを表示させていることがある。
  どうもFONのアクセスポイントをツールがみつけて、接続し認証しようとしている時に移動してアクセスポイントの圏外に出た時に、そのタイミングによっては出るようだ。


2010年10月13日水曜日

HTC Desire(X06HT) Android 2.2で変わったところ

Android 2.2にアップデートした事を先日書きましたが、そのあとで気がついたことなど...


・音楽を聞いていると、以前はいちばん小さくしても結構大きかったのが、音量が下がっているように思えます。音量のステップ(段階)自体も増えているかもしれません。


・スリープからの復帰後Wi-Fiが繋がらない不具合が2.1でありましたが、その点は改善されたようです。ただ、スリープから復帰直後にワンテンポ遅れてWi-Fiに接続するようで、すぐにネットに繋ぐとMobile Networkが使用される時がありました。


・画面ロックタイマーが追加されていて(2.1には多分無かったと思う)、以前は省電力で画面が消えたてからの復帰時は、「パターン」「暗証番号」「パスワード」等でロックを解除する必要あったのが、このタイマーで設定した時間を経過するまではロック解除に上記のような入力をする必要がなくなった。一々ロック解除しなけらばならなかったのが、ある程度の時間の余裕が出来て助かる。


・小さな不具合もみつけました。起動直後のロック画面で、上部に表示れている時刻の横に、必ず「サービスがありませんと」表示されたままになっている。特に不都合はないので問題はないが気になる。


・Android Marketのインストール画面で、「自動更新を許可」がチェックできるようになっていた。


他にもあったような気がしますが、とりあえず覚えているのはこれぐらいでした。


2010年10月9日土曜日

HTC Desire(X06HT) Android 2.2にアップデートしました。

久しぶりのエントリーです。


ソフトバンクよりX06HT用のAndroid 2.2のアップデートがリリースされましたので、アップしました。
主な変更点はアンドロイダーの「ここが変わった! Desire 2.2特集ページ」を観てください。
ここでは、私が変わったなぁと感じた事を書いておきます。


・ウィジェットや設定画面にあるアイコンなどがカッコよくなりました。


・新たに「フラッシュライト」アプリが追加されていました。
このアプリは本体背面のライトを操作することが出来ます。明るさの変更が三段階に変えられます。他に下記の二つの機能があります。
 ・ライトを点滅させる「自動フラッシュ」
 ・ライトをモールス信号のSOS(トノトントン・ツーツーツー・トントントン)のタイミングで点滅させる「SOS」


・「アプリケーションの管理」画面がタブでの切り替えに変更され、使い勝手が良くなったと感じました。


・上記のような見た目の変更もありましたが、それ以上に感じたことは「2.2」発表時の言われていた通り動作が速くなっています。
実際にランチャー画面の表示や各アプリの起動も、体感できるほどに速くなっています。
また、ブラウザでのWEBページの表示も速くなんているように感じます。Wi-Fiの感度もWi-Fiの接続表示や「Android Market」からのダウンロード速度をみていると良くなったように感じます。


・ここまで書いたことは感覚的な事なので目に見えるように、ベンチマークアプリ「Qudrant Standard」の結果を載せておきます。
以前に行った「Android 2.1」時の結果(左図)とアップデート後「Android 2.2」の結果(右図)です。
 


今のところ、日本で売られているAndroid機の最強マシンなりました。


 


 


2010年7月23日金曜日

HTC Desire(X06HT) 販売終了!!

すでに知っておられる方も多いと思いますが、昨日 X06HT(Desire)の販売を終了するとのニュースがありました。販売店への通達が廻ったようです。
具体的には、今月29日まで予約受け付けを持って終了し、最終の予約分は8月ごろの引き渡しとなるとのことでした。


それを受けて、深夜にTwitterで、孫さんに、MMSへの対応とAndroid 2.2(Floyo)へのアップデートについて、尋ねられた方がいました。それに答えるかたちで、発売以前からアナウンスされていた、MMSへの対応は9月ごろを目指して進めているとの答えがあり、11月ごろを目途にAndroid 2.2(Floyo)のアップデートが出されるとの答えも担当の方からありました。


そして、今日夕方にSoftbankのプレスリリースで、正式に「HTC Desire SoftBank X06HT」の販売終了と「HTC Desire SoftBank X06HTII」の発表がありました。
X06HTとX06HTIIの違いは、仕様を見る限りディスプレーが有機ELからTFT液晶になってるだけです。(X06HTプレスリリース
以前より、サムスン製の有機ELの供給不足が、そのままDesireの供給が追い付かに原因と言われてきたので、TFT液晶に変えて需要に答えていくことにしたのだと思います。


TFT液晶、有機ELのどちらが良いかは、好みの問題もあると思いますが、有機EL版のDesireが欲しい方は、29日までに予約する必要があります。また、プレスリリースに「予約受付の状況によって、7月29日より前に終了する場合があります」と注釈されていますので、早めに予約された方がいいと思います。


少し先にはなりますが、Android 2.2(Floyo)にアップデートされることが、確実になったのが、昨日慌てて日経Linux(8月号でDesireのroot権限の取り方が解説されている)を買った私にとっては最大で最高に嬉しいのニュースでした。


2010年7月3日土曜日

HTC Desire(X06HT) Wi-Fiスポット 設定アプリ

 7月1日にソフトバンクからDesire対応のWi-Fiスポット設定アプリがAndRoid Marketで公開されたので導入しました。


 以前よりアナウンスされていた、7月1日からのケイタイWi-Fiサービスのサポートの合わせて公開してきました。
 ただ、実際は「BBモバイルポイント」と「FONフリースポット」が出来るアプリであって、「ソフトバンクWiFiスポット」は7月15日公開予定のアップデートでの対応になるとのことです。


 「FONフリースポット」は、そのまま「FON」によるフリースポットです。最近はLivedoorもFONと提携していますので、これから増えていくかもしれません。
 「BBモバイルポイント」は、マクドナルドで使えるフリースポットがこれです。他一部空港や駅でもあるようです。
 「ソフトバンクWiFiスポット」は少し前にニュースにもなっていた「スターバックコーヒー」での接続ははこのサービスです。また、7月1日に発表されていたコンビニの「ミニストップ」もこのサービスです。


 先ずFONフリースポットで試してみました。
 今まで、接続後にブラウザで更新か現在のページから移動をさせる過程で、FONのログイン画面を表示のさせてログインしなければいけなかったのが必要なくなりました。
 ただ、一度Desire側のWi-Fi設定から一度手動で接続してからでないと、アプリからの自動接続は働きませんでした。


 次に、BBモバイルポイントの接続もテストしてみました。
 マクドナルドでチーズとフィレオフィッシュ、ストロベリーシェークを片手に、店の隅の方で試してきました。
 BBのアクセスポイント「mobilepoint」はDesire側のWi-Fi設定でシッカリ電波を受けているのに、接続できませんでした。
 仕方ないのでネットにつないで調べてみると、普通にそのまま接続できる人が多いようですが、私の様に繋がらない人も出ているようでした。大分頑張ったのですが、電池がきつくなってきたので諦めて帰ってきました。
 後から考えたら、157に電話すれば良かったのですが、後の祭りでした。


 どちらにしても少数としても接続できないということは、アプリに何らかのバグがあるか、または接続開始の前提条件の見落としなど問題があるのは確かと言えると思います。
 明日も時間があればマクド(<-大阪なものでこのように呼びます。)に行って再チャレンジし、結果を書きたいと思います。


2010年6月29日火曜日

[Android]Google Develoepr Day 2010 Japan 事前登録

今日、9月28日に行われる「Google Develoepr Day 2010 Japan 」の事前登録の案内がメールで届いていましたので登録しました。


ご存知の方が多いとは思いますが、ご存じない方で興味がある方は、公式サイトを見てください。


参加するには、「Google Code Site Group Japan」に登録したのち、事前登録を行う必要があります。
また、実際の参加資格を得るには、「DevQuiz」というクイズに答える必要があります。
クイズに挑戦するだけでも楽しいと思います。


2010年6月23日水曜日

HTC Desire(X06HT)お勧めアプリ「日本のお天気レーダー」

梅雨時という事もあって、大変役立っているアプリを紹介したいと思います。
アプリ名は「日本のお天気にレーダー」です。もちろんAndroid Marketで入手できます。
国土交通省 防災情報提供センターがのリアルタイムレーダーの画像を表示するだけなのですが、昼食や、駅前に買い物などの1・2時間のお出かけの時に、傘が必要かの判断が出来て便利です。


勿論の全国の雨の様子も分かります。

各地域(中国、四国、近畿を表示しています。)拡大もでき、3時間前からの変化も下にあるシークバーでみられるので、予測も立てやすいです。
超お勧めです。

2010年6月16日水曜日

HTC Desire(X06HT) 購入時、気を付けた方が良い..事など

 思いつく事を、羅列しておきます。

 量販店でのポイントより、現金や商品券をサービスしてくれる店で購入の方が良い。
 ポイント付けてくれる店は、得てして小物などの値段が高い。
 前に書いたmicroSDカードでも、amazoneなどで同じ商品を比べるとダントツ高い。
 ガンガン量販店で買い物をし、ポイントを使いまくっている人は、量販店でも良いかもしれませんが...

 一括スーパーボーナスなしが、計算上は長く(1年半以上)使わないのなら一番お得。(店により販売価格が異なるようなので注意)
 毎月の払いを重視なら一括スーパーボーナスありでいいかも(私は月々の払いが安い方が気分が楽なのでこれにしました)

 しっかりオプションやキャンペーン(Fonルータープレゼントなど)のアナウンスなどを把握してから行く事。
 Softbankの場合、ショップが把握できていない事が多いような気がするので、アナウンスされているページのURLをメモって行った方が良いと思います。特に小規模のショップの場合は...。

 Fonルータープレゼントは販売代理店のような店では対応しない模様なので、購入後、Softbankショップに別途足を運ぶ必要がある可能性が大です。

 fonルーターを貰う為に、My Softbank でわざわざ先にケイタイWi-Fiに入っておく必要はない、ショップで登録してもらえばよい。どうせ今年末までに入れば、どうせタダだし、オプション付けるために普通は手数料は取られない。
 私の場合は、My SoftbankでケイタイWi-Fiのオプションを付けたので、ショップで一旦外したうえで、再度付けました。(もちろんショップの方が書類のサイン以外全て行ってくれましたが。)

 iPoneのようにプリペイド決済(iTuneカード)がAndroid マーケットには無く、有料アプリの購入にはクレジットカードが必要ですので、未成年の方などははこの点も考慮しておいた方が良いです。


2010年6月14日月曜日

HTC Desire(X06HT) 必須アプリ「発信確認 Call Confirm 」

以前に書いたと思うのですが、Desireのメインのスクリーンの下に電話をかけると時のバーがあり、選択後の画面に連絡先リストが表示されるためる、勢いで意図せず連絡先を選んでダイヤルしてしまう時があります。
実際にDesire購入直後に、、目覚まし代わりのアラームを止めた勢いでダイヤルをし、早朝から相手に迷惑をかけてしまいました。
 ロック解除用パターンを設定する事で、何もしない時よりは間違いは減りましたが、何度がダイヤル途中で慌てて切る事があり完全には防ぐことは出来ませんでした。

 先ほども、間違えて電話しそうになって、このアプリが止めてくれました。
 そこで、紹介せねばと思い急遽書いています。
 多分、このアプリを作った人も同じような経験をし、作ったのだろうと想像します。
 有名になっていますので、ご存知の方も多いと思いますが、同様の悩みがある方は一度入れてみてはいかがでしょうか

 Android Marketにありますので、アプリ名で検索してください。
 アンドロイダーでも紹介されています

2010年6月12日土曜日

HTC Desire(X06HT) 東芝のmicroSDHC 16GBに替えました

日本橋(にっぽんばし <- 大阪)のPCショップで東芝の海外向けmicroSDHC 16GB class2(SD-16GR5W2)を買ってきました。


元々Desireに入っていた2GBでは、流石に音楽も大して入れられないので買いにいてきました。
価格的には、ネットショップでの販売のほうが500円ほど安い店もあったのですが、行き慣れた店の方が安心なので、4,140円で買ってきました。
大手量販店では、16GBのmicroSDHC は安くても8、000円はしますので、ショップで買うのがお勧めです。


入れ替えるついでに、ベンチマークをとってみました。


----------------------------------------
ベンチマークアプリ: J Bench Mark 1.0
テスト内容:
 ファイルサイズ 50MB
 バッファサイズ 8KB
 5回テストの平均


付属のSanDisk 2GB microSDカード
書き込み:  6.17 MB/s
読み込み: 10.77 MB/s


東芝 microSDHC 16GB class2
書き込み:  6.82 MB/s
読み込み: 10.78 MB/s
----------------------------------------


ほとんど差はありませんでした。
SanDiskは最近良くないとのうわさでしたので避けたのですが、これなら3,500円を切る値段で16GBがあったので、そちらを買えば良かったと、少し後悔...


2010年6月8日火曜日

HTC Desire(X06HT) ジャケット買ってきました。

 レイ・アウトの「ラバーコーティングシェルジャケット」の黒色をヨドバシで買ってきました。


 写真を撮って載せようと思ったのですが、上手く撮れなかったので、興味のある方はメーカーの商品ページを観てください。


 一般のジャケットに比べ硬く、丈夫な感じがしました。
 普通のジャケットように本体を包むように付けるのでなく、ジャケットに本体にはめ込むような感じです。


 手触りは、Desireの背面や側面の感じに近く、滑ったりすることなくホールド感もあり、気に入りました。
 表側には一般のジャケットのような縁の出っ張りがありませんので、操作の妨げになることもなく、違和感なく操作することが出来ます。


 表側の保護を気にされる方は、他メーカーのジャケットでジョイスティック以外のボタン部を覆うような物が出ていますので、そちらを買った方が良いかもしれません。
 ただ、個人的な感想ですが、その商品の写真を観ると、どうしても電卓のボタンやテレビのリモコンを思い浮かべてしまうので、私は候補から外しました。


 気になる点としては、Desire上部の電源ボタンを背面から人差指で操作する場合に、指の腹にジャケットがフチがほんの少しあたります。
 しばらく使ってみて、それでも気なるようなら少し削ろうかと考えています。


ネットで当ジャケットのスピーカ部の穴と縁を巻くようにすればストラップを付けられるとの情報がありますが、シッカリ本体とジャケットは止まっているようには思いますが、ストラップ側を持ち強めにショックを与えると、接着されているのではないのでショックで本体が外れる心配があり個人的にはやめた方が良いと思います。


 書き忘れていましたが、画面保護フィルムが付属しています。既に貼っているので予備として置いておきますが、中途半端な抱き合わせはやめてほしいものです。
(ちなみに光沢仕様と書かれていましたが、同社が単品販売しているフィルムとは、材質は同じようですが、表面が異なるような感じがします)


 


2010年6月6日日曜日

[Android] Activityの表示アニメーション

久しぶりのプログラミングネタです。すっかりDesireにハマり、遊びすぎました。(Desireネタ、まだまだ続くとは思います。)


よくCMや動画で見るiPhoneやXperiaの画面が横からスライドしてフェードインしてくる奴がしたかったので、探して出来るようになったので、書いておきます。

基本的な事は、「adamrocker」様のブログ「throw Life」の「ActivityのOpenとCloseをアニメーションさせる」を参考(パクリ?)にさせていただきました。


あまり速く切り替わると動作が解りにくいので、少しゆっくり動くようにしています。
私自身がまだまだAndroid初心者ですので、出来るだけ簡潔に、また参考ページからコピってくるのではなく、書かれているコードの意味を調べつつ書いていますので、コメントが多くて見づらい点はご容赦下さい
 もし、実際に動かしてみる場合、該当のファイル、フォルダが無い場合は作って下さい。またパッケージ名、各クラスのソースファイルを入れるフォルダパスは「・・・」で書いていますので、ご自身の使用パッケージ名に合わせて書き換えて下さい。


2つのActivityの切り替え時にアニメーションするようにしますので、Activityクラスの派生クラスFirstActivity と SecondActivityを作成します。


親のActivity
・./src/・・・/FirstActivity

package ・・・.ActivityAnimation;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class FirstActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first);
// ボタンをひとつ配置
Button toBtn = (Button)findViewById(R.id.to_second);
// クリックイベントで、SecondActivityを起動
toBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent();
intent.setClass(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
}


子のActivity
・./src/・・・/SecondActivity

package ・・・.ActivityAnimation;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
// ボタンをひとつ配置
Button backToBtn = (Button)findViewById(R.id.back_to_first);
// クリックイベントで、このActivityを終了
backToBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}


次に各ActivityのレイアウトXMLを以下のようにします。


親Activityのレイアウト
・res/layout/First.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ff000000"
android:gravity="center"
>

<Button android:text="To Second"
android:id="@+id/to_second"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
</Button>
</LinearLayout>


子Activityのレイアウト
・res/layout/Second.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffffff"
android:gravity="center"
>
<Button android:text="Back To First"
android:id="@+id/back_to_first"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
</Button>
</LinearLayout>


基本部分はActivityの中心にボタンを配置しており、2つとも同じです。違いは、ボタンの文字が「To Second」/「Back To First」の違いと、Activityの背景色が「白」/「黒」の違いだけです。現在表示中のActivityが判別し易くしているだけです。


次はstring.xmlです。


・res/vaslues/string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">アクティビティーアニメーション</string>
<string name="activity_name1">FirstActivity</string>
<string name="activity_name2">SecondActivity</string>
</resources>


これは見たまんま、名前を設定ているだけです。


アプリケーション内のActivityに適用するテーマを指定します。
・res/values/theme.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AnimationTheme" parent="android:Theme">
<item
name="android:windowAnimationStyle">@style/AnimationActivity</item>
</style>
</resources>


テーマ名を AnimationTheme とし、AnimationActivityをスタイルとして使用する。


上記のテーマで使用するスタイルを定義します。
・res/values/style.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AnimationActivity" parent="android:Animation.Activity">
<item
name="android:activityOpenEnterAnimation">@anim/alpha_open_enter</item>
<item
name="android:activityOpenExitAnimation">@anim/alpha_open_exit</item>
<item
name="android:activityCloseEnterAnimation">@anim/alpha_close_enter</item>
<item
name="android:activityCloseExitAnimation">@anim/alpha_close_exit</item>
</style>
</resources>


スタイル名を AnimationActivity として、使用するアニメーションの指定を行っています。


スタイルで使用される、SecondActivityが開く時のFirstActivityのアニメーションを定義します。
・res/anim/open_exit.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<translate android:fromXDelta="0%"
android:toXDelta="-100%"
android:duration="300"
android:fillAfter="true"
android:fillEnabled="true"/>
</set>


FirstActivityのX座標を 0% の位置から、 -100% の位置に 300ミリ秒 掛けて移動する。(左側に消えていくイメージ)
fromXDelta:開始 X 座標を % で表記
toXDelta:終了 X 座標を % で表記
duration:開始から終了までの時間間隔(ミリ秒)
下記の二つの属性の意味は、英文の翻訳および動作させた感じからの想像です。あくまでも「たぶん」です。
fillAfter:アニメーション終了時の状態を保持する時は「true」にするそうです。
fillEnabled:「fillAfter」「fillBefor」を適用するかどうかの指示のようです。


スタイルで使用される、SecondActivityが開く時のアニメーションを定義します。
・res/anim/open_enter.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<translate android:fromXDelta="100%"
android:toXDelta="0%"
android:duration="300"
android:fillAfter="true"
android:fillEnabled="true"/>
</set>


SecondActivityのX座標を 100% の位置から、 0% の位置に 300ミリ秒 掛けて移動する。(右から滑って入ってくるイメージ)



スタイルで使用される、SecondActivityが閉じる時のアニメーションを定義します。
・res/anim/close_exit.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<translate android:fromXDelta="0%"
android:toXDelta="100%"
android:duration="300"
android:fillAfter="true"
android:fillEnabled="true"/>
</set>


SecondActivityのX座標を 0% の位置から、 100% の位置に 300ミリ秒 掛けて移動する。(右側に滑って消えていくイメージ)


スタイルで使用される、SecondActivityが閉じる時のFirstActivityのアニメーションを定義します。
・res/anim/close_enter.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<translate android:fromXDelta="-100%"
android:toXDelta="0%"
android:duration="300"
android:fillAfter="true"
android:fillEnabled="true"/>
</set>


FirstActivityのX座標を -100% の位置から、 0% の位置に 300ミリ秒 掛けて移動する。(左側に滑って入ってくるイメージ)


ここまで書いた内容は、ほぼ参考にした「throw Life」(http://www.adamrocker.com/blog/)の焼き直しです。


ここまで、出来たら一度動かしてしてみてください。
入ってくる新しい画面に押し出される様に前の画面が反対側にスライドしていきます。


 


次に「res/anim/」のアニメーションを定義した4ファイルを以下のように書き換えます。「fromXDelta」と「toXDelta」の値を書き換えています。


・res/anim/open_exit.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<translate android:fromXDelta="0%"
android:toXDelta="0%"
android:duration="300"
android:fillAfter="true"
android:fillEnabled="true"/>
</set>


FirstActivityはアニメーションの最初から最後までX座標は「0」に固定したままです。


・res/anim/open_enter.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<translate android:fromXDelta="100%"
android:toXDelta="0%"
android:duration="300"
android:fillAfter="true"
android:fillEnabled="true"/>
</set>


SecondActivityのX座標を 100% の位置から、 0% の位置に 300ミリ秒 掛けて移動する。(右から滑って入ってくるイメージ)


・res/anim/close_exit.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<translate android:fromXDelta="0%"
android:toXDelta="100%"
android:duration="300"
android:fillAfter="true"
android:fillEnabled="true"/>
</set>


SecondActivityのX座標を 0% の位置から、 100% の位置に 300ミリ秒 掛けて移動する。(右側に滑って消えていくイメージ)


スタイルで使用される、SecondActivityが閉じる時のFirstActivityのアニメーションを定義します。
・res/anim/close_enter.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<translate android:fromXDelta="0%"
android:toXDelta="0%"
android:duration="300"
android:fillAfter="true"
android:fillEnabled="true"/>
</set>


FirstActivityはアニメーションの最初から最後までX座標は「0」に固定したままです。
(左側に滑って入ってくるイメージ)


書き変えたら、もう一度動かしてみると、動作が変わっているはずです。


新しい方の画面が前の画面に被さるように入ってきます。出て行く時はそ逆にスライドしていきます。
こちらの方が、iPhoneなどのCMで観る動きに近い感じになります。


次回も、このソースを基に遊んでみます。


--- - --- - --- - --- - --- - --- - --- - --- - --- - --- - --- - --- - --- - -


動作を確認していただくために動画をYouTubeにでも上げようかと思いましたが、上手く動画を撮れなかったため断念しました。実機またはエミュレータから綺麗に撮れる方法をご存知の方が居られましたらお教え下さい。


 


2010年6月5日土曜日

HTC Desire(X06HT) ベンチマークしてみました

Quadrant Standard というベンチマーク アプリケーションションで Desireを計測してみました。


「Your device」と表示されているのか、Desireです。
「Nexus One 2.2」がAndroid2.2が元の「Nexus One < 2.2」の倍以上のスコアを叩き出しているのをみると、兄弟機のDesire(厳密にはX06HT)も早く「2.2」にしてくれることをSoftbankに祈りたくなります。


「Moto Shadow < 2.2」は「Nexus Two」と噂されている機種なので、「2.1」でこのスコアは流石って感じっです。


「SamSung Galaxy S < 2.2」は、今秋過ぎにドコモから発売が予定されているAndroidのベース機ですが、「2.1」でこのスコアを出しているが凄いです。ただ、Desire持ちからすると、少し悔しいですが、ドンドン性能アップしたデバイスが出てくるのは、この手の機器の宿命です。


「SE Xperia x10」には少しですが、スコアが優っているようです。


結果を購入の参考にされる方もおられるかとも思いますが、「ベンチ=使い勝手」ではありませんで、一つの情報程度に...


2010年6月2日水曜日

HTC Desire (X06HT) FONに繋げて来ました

今日、外で他の人が開放している FON_FREE_INTERNETに繋げて来ました。


繋いでブラウザでページを移動しようとしたら、メアドとパスワードの入力画面が表示され、入力後は、普通にページを移動出来ました。(ホテルとかの無線LANを使用する時のパターンです)


近くにFONルーターをもらったショップがあったので、そこに設置されていたのかもしれません。


駅前のショッピングセンターのベンチに座って、出来るので中々良かったです。


Wi-Fiの感度は・)「<-左90度回転してみて下さい」でしたが、なかなか快適に読み込んでいました。
この、APが偶然良かっただけかもしれませんが...


HTC Desire(X06HT) 貰ったFONルータを登録してみた。

昨晩、FONの登録をしました。
Desireが正式にまだケイタイWi-Fiに対応指定にないため、iPhoneのようにはいかないので、一般PCと同じ手順で登録しました。

私が行った手順を書いておきます。
1.PCで、https://www.fon.com/jp/register/form で、メールアドレスやパスワード、氏名、住所などを設定。
2.DesireでWi-Fiのアクセスポイント「FON_FREE_INTERNET」に接続して表示される画面で、先に登録したメールアドレスとパスワードでログイン。(家のPCはすべて固定アドレスにしているので、変更が面倒くさかったのでDesireでしました。)
3.「ルータの設定」(<-多分こんな表示だったと思う)を選んで表示画面でルーターの位置情報を入力。

 位置情報などで番地まで入力する欄がありましたが、何となくイヤなので、丁目までの入力にしました。

自身のAP以外繋いでいないので、正しく出来ているか... また見つけて繋げたら報告します

2010年6月1日火曜日

HTC Desire(X06HT) FONルータ貰ってきました。

 書くのが遅くなりましたが、先の日曜日「Softbank ショップ」で「FONルータ」を貰ってきました。
 ルータが欲しかった訳ではなく、FONのアクセスポイントへタダで繋げるなら、ラッキーなので戴きに行ってきました。

結構この件は情報が錯綜していて、Desireのユーザーは貰えるのかはっきりしていませんでしたが、TwitterでSoftbankのサポート担当者が、プレゼントするようになったと言っておられたので、念のため「157」に確認の上行く事にしました。

 「157」の方も、ハッキリ把握はしていなかったようで、時間はかかりましたが丁寧な対応をしていただけました。
 回答としては、機種が「X06HT」で「パケットし放題フラッ」、「ケイタイWi-Fi」加入しているので、条件は満たしているとの事でした。また、5月24日より可能になったとのことでした。
 ただ、ショップによっては、「ケイタイWi-Fi」を一度外して再度「ケイタイWi-Fi」加入する手続きをする可能性がありますとのことでした。
 また、購入店以外のショップでも大丈夫か確認したところ、念のため購入店に行かれた方がいいと聞き一旦電話を切りました。その後サポート担当の方から電話を頂き、確認したところ購入店以外でも大丈夫の旨連絡を入れてくれました。
 完璧なサポートとは言えませんが、親切なサポートだとは感じました。

 ショップの方もこの件について把握できていないようで、センターに確認をされていました。
 手続きとしては「157」で聞いたように解除->再加入する手続きを求められ、そのようにしました。
 ルータについては、プレゼントであり今後の解約などおこなっても、返却等する必要が無いものだと言われていました。

 家に持ち帰り繋ごうと箱を開けると、iPhone用やMMSが使用出来る機種の説明書しか入っていませんでしたので、ユーザー登録方法などが良く解りませんので、暇な時に調べつつ繋いでみようと思っています。

 使えるようになったら、この件また書きます。

2010年5月31日月曜日

HTC Desire(X06HT)ちょっと調子悪い3

全体に動作が遅くなってきたような気がすると書いた、前回の続きです。
長々と書いても仕方がないので結論から書いていいきますです。
・ダウンロードしたアプリを全てアンインストールした結果ですが、全体としてのモッサリ感も無くなり、「アプリケーションの管理」画面の開く時の長時間の待ちも無くなりました。
・ついでに「出荷時データにリセット」もしましたが、ここでの差は出ませんでした。単にバックアップを戻したり、SNS系のIDなどの登録する手間が掛っただけくたびれ儲けでした。


で、「アプリケーションの管理」が開くのが遅いのは、Windows XPの時の「プログラムの追加と削除」を表示するのが、インストール済みのプログラムの量に比例して遅くなるのと同じ症状だっただけだと思う事にしました。
 ただ、気になったのは以前の「出荷時データにリセット」を行った時にも少し書きましたが、今回も先のアップデートがされた状態になりました。これでは「出荷時データにリセット」になっていない事になります。どこかにアップデータのバックアップを保存していて、何らかの操作をすれば、本当の「出荷時データにリセット」になるのでしょうか? それとも、再起動後に私が操作するまでに、更新の確認とアップデートの適用を裏で行ってしまっているのでしょうか?


2010年5月28日金曜日

HTC Desire(X06HT) ちょっと調子悪い2

先のエントリでも書いたようにDesireの調子が少し悪くなってきました。
前にDesireを落としてしまったので、それが原因なのかと不安になってしまいました。


 症状としては、設定にあるアプリケーションの管理を開くのに長い時間がかかり、表示されるアイコン(Windows Vista のWaitアイコンのような円形が回転するもの)が回らず、ほぼフリーズと言える感じでした。2,3分待った後、アプリケーションのリストは表示されましたが、今までに無かった症状でした。
 それ以外にも、個々のアプリの切り替え時に少し間が空くような、レスポンスの悪さが感じられました。
 「アプリケーションの管理」で、フィルタに「実行中」を選び表示すると、今までに使用したアプリケーションがほとんど表示されていました。この表示を信じるならば、メモリが足りなくなるとバックグラウンドのアプリを自動終了するAndroid仕組みが働いていないか、閾値がメモリギリギリになっているのかもしれません。
 再起動すれば良くなるのだと考え再起動しましたところ、良くはなりましたが、やはり少しもたつく感じがしましたので、すぐに「アプリケーションの管理」で、フィルタに「実行中」で確認すると、「マップ」(Google Map)「FMラジオ」「音楽」などが表示されていました。起動時に開始しておく必要があるのでしょうか。
 原因とし考えられるのは、インストールしたアプリが悪いのか、21日にあったアップデートのどちらかだと想像されます。


 答えは出ていませんが、インストールしたアプリの全削除と、「出荷時データにリセット」をやってみようと思います。
 感覚的な比較になると思いますが、明日にでも改善したか報告します。 


2010年5月27日木曜日

HTC Desire(X06HT) ちょっと調子悪い

Desireの調子がちょっと悪いような気がする。
アプリケーションの管理を開くのに結構時間がかかったりする。
電源をOFFにするのにも時間が1分ほどかかる。
数日前のアップデートの後からのような。

詳細は、また夜にでも調べて書きます。
アップデートをまだしていない方は、少し様子を見た方がいいかも...


2010年5月22日土曜日

HTC Desire(X06HT) 落下試験敢行と言うか落とした

 やってしまいました。電車で胸ポケットから出す時に手を滑らせDesireを落としてしました。
 意図せず落下試験を行うことになってしました。結果的には、今のところ特に異常は出ていません。


結果報告
試験内容:
ジャケット等未装着
約1メートル超の高さからの自由落下。
下部より背面側へ約45度傾いた方向で着床。
床面の反発により背面を打ち付けた後、反転し表面を下に約20センチほど滑走。

ダメージ:
 背面:
  裏ぶたが少し開きました。
  裏ぶた表面のキズ等なし。
  カメラレンズ部および、カメラ枠部(少し背面より高い部分)キズなし。
 表面:
  液晶部、特にキズなし。
  ボタン部分および、その周辺にキズおよびヘッコミ等なし。
 側面:
  一切のキズ、変形なし。


以上。


全くダメージを受けていなかったようです。
Xperiaと違い側面や角が丸いので滑るように転がったため、ヘッコミ等や、角へのダメージが出なかったのかなぁと思います。
また、液晶部とその周辺部、ボタン、カメラ部以外の部分の表面素材がラバーのような感じなので、キズが出なかったなだと思います。
ジャケットやケース早く買おうと思う今日この頃でした(今一良いのが出てないので、躊躇していました)


2010年5月17日月曜日

HTC Desire(X06HT) 不満な点もあります。

心情的にDesire対して肯定的な話題を中心に書いてきましたが、全く不満が無いわけではないので、少し否定的な面を今日は書いてみよう思います。
 いつものようにダラダラ書いていきます。
 また、私の操作ミスなどが原因の可能性もありますので、気になる事が書かれてある場合、他のソースもあたって下さい。



・購入者が一番の不満点に上げるであろうMMSが使えない問題。
 私は新規で購入しましたが、機種変更で買われた方は、MMSで届いているメールはどうなるのでしょう?PCからの確認は出来るようですが、人によっては連絡を忘れていた方からのメールがきていても、直ぐに連絡できず不都合なことになる事もあるような。
 対応するのは、そんなに大変な作業を伴う事なのだろうか。


・2番目に大きな問題である、Wi-Fiが切れる問題。
 一度Wi-FiをOFFにして、再度ONにすることで復活するが、面倒なので早く修正してくれないだろうか。
 まだ、長くは試していないので結論ではないのですが、固定アドレスにしてから問題は起きていない。自宅以外Wi-Fiを使わないのであれば、この方法は使えそうに思うが、なにかスマートフォンの意味がないような気がしてイヤ。


・Desireへの直接の不満ではないが、携帯向けサイトデザインがあるように、スマートフォン向けのデザインをサイトがまだまだ少ない。
 縦に並んでいるリンクなどは間違えて目的のリンクの下のリンクをクリックしたりしてしまいます。拡大すれば問題はないのだが、このワンステップを入れるために、妙に使い辛いような感じを受けてしまいます。


・携帯サイトが観られない。
 携帯サイトを観たい時もたまにある。上記のスマートフォン用サイトが増えてくれば、そちらを観るようになると思いますが、それまでは携帯サイトをスマートフォンで観る需要はあると思うのですが、どうにかならないのでようか。
 (携帯サイトを閲覧する用のブラウザがあるようですが、それなりにという程度みたいです。)


・「音楽」のウィジェット をスクリーン上に配置し、別途「音楽」アプリを開いて(ウィジェットとは別にという意味)音楽を聴いている時、付属のマイク付きイヤフォンから操作(送り、戻し)の操作が聞かず、電話切り替え部のボタンを押したときに、元の曲の上に被さり別の曲が流れ始めた。つまり2曲が一度に聞こえている状態になった。
 これって、私の使い方が悪いのでしょうか?Desire、それともOS(Android)の問題?
 また、標準とは別のプレーヤーをインストールした場合も同じような症状が出ました。
・「マップ」つまりGoogle Mapの地図は回転しない。iPhoneでは端末の方向を判断して、地図を正しい方向に向けてくれるとの事なのですが、Desireは現在地を表す小さな二等辺三角形ぽいアイコンが進行方向を表すのみです。慣れれば大丈夫だといえばその通りかもしれませんが、感覚的に地図が端末に合わせて回転してくれた方が使いやすそうに思います。
 どうせコンパスが内蔵されているのだから、出来るようにして欲しかった。


2010年5月15日土曜日

HTC Desire(X06HT) 組み込まれているシーンの画像

Desireに最初から用意されている「シーン」(スクリーンのセット。Windowsで言うところのテーマみたいなもの)の画像を貼っておきます。


HTC


ソーシャル


ビジネス


オフタイム


トラベル


白紙の画面


2010年5月12日水曜日

HTC Desire(X06HT) 約半月使って.. 2

昨日に続いて、約半月使って来て感じた事や気がついた事を書いていきます。


・ホームに表示されている「天気」、既定で3時間ごとにネットワークに繋がり予報を取ってきています。もしいやなら、設定から更新を切っておくかモバイルネットワークを切っておけばぢ丈夫です。
パケ放題フラットに入っていない人は、特に注意した方が良いと思います。


・「音楽」と名のミュージックプレーヤーは、音楽ファイル見つけた時点で表示用サブネイルファイルを作っている模様、後から画像アイルを入れても、サブネイルを作り変えないようなので、一旦音楽ファイルを削除して起動後、再度音楽ファイルとイメージファイルを入れればサブネイルファイルを再度作成し直した。


・感覚的にだが、Wi-Fiを切るとバッテリの持ちが大きく改善されたような気がする。
 実際、現在のバッテリの使用割合が見れる画面で確かめると、「セルスタンバイ」「Androidシステム」についで「Wi-Fi」になっています。おおよその割合になっている事が多いことから、使い方にも拠りますが約15~30%ほど節約できるということだと思います。
 今は、Wi-Fi使う場所以外Wi-Fiを切るようにしています。


・タッチの感度は申し分なく良い、画面保護フィルムを貼ってあるが、検知されなかった事はなかったと思う。どちらかというと、良すぎると思う時が何回かあったぐらい。


・少しビビりながら「出荷時データにリセット」をやってみた。特に問題なく少しの時間で完了、購入当初の状態に戻りました。発売日当日に出されたアップデートが充てられた状態だったのは、なぜだろう。単に私が気がつかない間に自動更新でもしたのだろうか?そんな時間は空けていなかったと記憶しているのだけど。
 色々なアプリを入れすぎたり調子が悪くなたら、リセットするのが手っ取り早いかも。もちろん、連絡先などはmicroSDにエクスポートせずに行わないようにして下さい。


・抽象的な言い方になりますが、iPhoneを富士通やNECのパソコンとすると、DesireはDELLのような印象を受けています。
 カスタマイズではないですが、アプリを追加して行くことにより、より自分に合ったものにしていく楽しみがあるように感じます。もちろんiPhoneもアプリを入れることは出来ますが、最初からある程度仕上がっている感じがして、私の個人的な好みからすると、ある意味楽しさに乏しく感じます。
 パソコンで言えば先に書いた富士通、NECやSONYを買って、その中で楽しむ人もいれば、DELLやLenovo、HPの、ほとんどWindowsしか入っていないようなパソコンを買って、自分の使いやすいようにしていく人の違いと同じような感じを受けました。
 私はこのような事を書いているぐらいですので後者の方です。


2010年5月11日火曜日

HTC Desire(X06HT) 半月使って、気がついたこと

 


 使い慣れてきた中で当初と違う思いも出てきましたので、前に書いた事と重複する部分、全く逆の事もあるかと思いますが、購入を考えられておられる方は参考にて下さい。
 私の個人的な感想なので、個人の好き嫌い、使用法の無知からくる誤解も含まれているかもしれませんので、その点は考慮してお読みください。


 ・自宅内の、無線LANを使用しWi-Fiの接続を表す表示が出ているにも関わらず、ネットワークに繋がらない時が非常にまれですがありました。
 パソコンの方は問題が無いことから、Desireの問題だと思います。一旦Wi-Fiを無効にして有効にすると復活しました。2ちゃんねるのスレでも同様の報告があることから、バグの可能性が高いのではと思っています。私としては、頻繁に起きてはいないし、得接続し直せば大抵問題ないので、それ程気にしてはいません。


 ・バッテリの持ちについてですが、以前に持ちが悪いと書いたような気がするのですが、慣れてきて、アプリの起動を繰り返さなくなってからは、案外バッテリが持つのではと、思うようになってきました。
 動画を1時間半程観た日があったのですが、他にメールのなどもしていましたが(私の場合、メールを打つのに異常に時間がかかる)、余裕で1日持ちました。


 ・省電力状態から復帰の時、ロックを外すのに下部に表示されているアーチ状のバーを下方向にドラッグした時に、指の使い方が悪かったのか、ホーム画面の下部の電話ボタンをクリックし通話可能状態にしてしまい、おまけに登録済みの人に電話をかけてしまいました。(通話画面で連絡先の一覧が表示されたのをクリックしてしまったのだと思います。)私のミスではあるのですが、気をつける必要があると思います。
 ロック解除パターンを使うようにしてから、ホーム画面を表示する前に、ロック解除パターンの入力画面が表示されるようになり、操作ミスを起こさないようになりました。


・何度かアラームがセットした時間に鳴らない事がありました。多分ですが、「Advance Task killer Free」という、不要なタスクを終了させるアプリを使うと、この症状が出るような気がします。終了させるアプリに「時計」が含まれていなくてもアラームが鳴らなくなるようです。
 有名なアプリなので使われている方も多いと思いますが、「Advance Task killer Free」を使用していて、アラームが鳴らない症状が出る方は疑ってみてもいいかも知れません。


多分、明日に続きます。


2010年5月5日水曜日

HTC Desire(X06HT) 使用中-こんなアプリが入っています 3

予告していた通りDesireに標準でインストールされているソーシャル系、ネット系のアプリの使用した感想を書いていきます。


・「FriendStream」は「Twitter」「Facebook」「Flickr」をまとめて、管理することが出来ます。
 「Twitter」のツイートをタップすると「Peep」というTwitterクライアントに、別アプリであることを感じさせずに切り替わります。リスト機能には対応していませんが、タイムライン表示、フォローしているタイムラインの表示もできます。ダイレクトメッセージにも対応しており、Twitterを使うのには十分な機能を持っていると思います。
 Flickrは、私が使っていないので、どのように連携しているのかよくわかりませんでした。


 ソーシャル系の基本的なことを、このアプリでまとめて出来るところが便利だと思いました。ただ、mixiが入っていないのが残念だなぁ思いました。


・「FriendStream」とは別に「Facebook」は公式Facebookの公式アプリも入っています。です。コメントしたり、掲示板への書き込み、写真を直接アップすることも出来ます。


・「トーク」は Googleトークでのチャットを行うことが出来ます。メンバー管理も出来結構使い易かったです。


・「メール」アプリとは別に「GMail」アプリがありますが、Gmailのアカウントを「メール」に登録すると、ほぼリアルタイムにメール受信が通知され便利です。


・「News」という名のアプリがありますが、これが実質RSSリーダーです。時間間隔指定でも更新行うこともできます。初期値に「Yahoo ニュース」のみ登録されています。


こんなところです。
まだ、使いこんでいないので、アプリの便利な使い方を見つけたらまた続きを書きます。


2010年5月2日日曜日

HTC Desire(X06HT) 使用中-こんなアプリが入っています 2

昨日に続いてDesireに標準でインストールされているアプリケーションを使用した感想を書いていきます。


・「FM ラジオ」というFMを聞くアプリケーションがあります。このアプリはヘッドホーンのコードをアンテナに利用しているので、ヘッドホーンが刺さっていないと使用出来ません。
 オートでFM局をスキャンする機能がありますが、電波状態が良くなければ、上手く拾う事が出来ないようです。プリセットとして予め周波数を登録しておくか、直接周波数を選べば、スキャンに失敗しても、それなりに聞くことが出来ます。


・「Quickoffice」というOfiiceのファイルを閲覧するアプリケーション(HTCのものでなくサードパーティ製)少し試してみました。
 EXCELファイルは、97-2003型式「xls」、2007型式「xlsx」共に開くことが出来ました。計算も正しく行われていました。
 Wordファイルは、97-2003型式「doc」、2007型式「docx」共に開くことが出来ましたがワードアートにした部分は空白になり表示されませんでした。
 PowerPointファイルは、97-2003型式「ppt」、2007型式「pptx」共に開くことが出来ました。特に表示が変なところはないようです。
 簡単なファイルを作ってのテストでしたので、細かなところでは正しく表示されないところもあるかもしれません。PC上のOfiice互換ソフトでもオリジナルと比べ差異が出るのことを思えば合格点のような気がします。


残り、ソーシャル系、ネット系のアプリは次回にまとめて書きます。


2010年5月1日土曜日

HTC Desire(X06HT) 使用中-こんなアプリが入っています

今日は、Desireに標準でインストールされているアプリケーションを使用した感想を書いていきます。


・「音楽」というプレーヤーが入っているのですが、このプレーヤーにはイコライザーは付いていません。高機能なものでなくてよいので機能を付けてほしかったです。


・「株価」という株価表示のアプリなのですが、銘柄を登録するために検索画面が表示され、「記号または会社名」と書かれていたので、一般に「銘柄コード」または「証券コード」と言われるものを入力しました。試しにトヨタ自動車を登録しようとトヨタの銘柄コード「7203」入力すると聞いたこともない、「WANG-ZHENG BHD」と如何にも中国系ぽい名前の社名が検索されてきました。
 変だなぁと思って、よく見ると画面の下側に「Y! 金融」と書かれていました。「Y」の背景が紫色の楕円だったので、アメリカのYahoo!がデータの出元だとわかりました。つまり日本の株式市場のではなくアメリカの市場のデータだーた訳です。


・「PDF ビューア」は25MBほどのPDFファイルを開いてみたのですが、待つことなく開き、PC上のAdobe Reader より軽快なぐらいでした。ツールバーを表示させればタップでの送り、戻しも出来十分に使用できます。
 また、文字列の検索もストレスを感じることなく検索を完了しました。「再フォーマット済み」という表示があり、画面に合わせたレイアウトにする機能があり、多少の画像表示の崩れはあるが、文字だけを読むには役立ちそうな機能も付いています。
 ただ一つの不満は、ページ番号を指定してのジャンプの場合に、画面の完全にページ番号を入力する画面に一旦切り替わってからページ番号を入力しなければいけないのが、もう少しアイデアが欲しかったなぁと感じました。


アプリケーションの話、明日以降に続きます。(たぶん..)


2010年4月30日金曜日

HTC Desire (X06HT) 使用中

��日と少し Desire を使ってみての感想など書いておきます。レビューと言える程のものでなく、個人的感想ですので軽く読んで下さい。

・昨日、My SoftBank で確認したらパケット通信の金額が2万円を超えていました。パケット「パケットし放題フラット」に入っているので、実際の請求は「4,410円」になるので問題はないのですが、ビックリしました。これから購入される方は、最低でも「パケットし放題 for スマートフォン」に、出来れば「パケットし放題フラット」に入る事をお勧めします。
 実際、カタログなどに載っている Desire の写真に表示されている「カレンダ」のしたの「天気」の表示でも、デフォルトの設定では3時間おきにネットに繋がり確認しているようです。他にも設定を変えないと、バックグラウンドでネットに繋がるアプリが標準搭載の分も含めありますので、ネットは繋がないつもりをしていても、慣れるまで最初だけでも入っておいた方がいいと思います。

・電池の持ちは、予想通り余り良くなさそうです。購入直後という事もあって、音楽を聴きながら触りまくっていた事もあり1日持ちませんでした。使い方がよく解らずに、あっちこっち画面を切り替えていたのも一因かもしれませんので、もう少し慣れたら、電池の件は改めて書きたいと思います。

・最初はスクロールやフリックとタップが上手く使い分けられず、少し不安になりましが結構直ぐ問題なく使い分けられるようになりました。またピンチ(2本指でサイズを変えたりするやつ)も慣れれば、片手での操作も出来るようになってきました。ただ、女の子の小さい手では、少し操作し辛いかも知れません。

・Desire独自技術ではないのですが、「Voice Search(アプリ名)」=「google 音声検索」の認識率の高さにはビックリしました。感覚的には、ほぼ完ぺきに近いのではと思います。たしかに造語などは誤認識したり、英語のカタカナ読みを英語で認識(カタカナで入力したい時)などの事はありますが、機械的な判断なので無理からぬことだと思います。
 「Voice Search」は周りの目を気にしなければ、入力するより手っ取り早く結構使っていけると感じました。

・本体のホールド感に関しては、私の個人的な感想ですが、持ちやすく片手での操作も慣れてくると無理なく出来るようになってきました。
 ただ個人の癖によるのでしょうが、胸ポケットに入れる時に左右から挟むように持ってしまうために、本体横の左上方にあるボリュームのボタンを押してしまい、急に音量が変わりビックリする事が数回ありました。多分、これは慣れれば押さなくなると思いますが..。

・使用感でなく情報なのですが、購入時に「ケータイWi-Fi」「バリュープログラム」は申し込めないと言われたのですが、2ちゃんねるのスレによれば、どうも加入可能に傾きつつあるようです。実際「ケータイWi-Fi」はMy SoftBankの「オプションサービス変更」で申込可能になっているので、大丈夫そうです。ただ、「バリュープログラム」については、どうなるか2ちゃんねるでも情報が錯綜しています。(実際は2ちゃんねるでなくSoftBankがハッキリしないのが悪いのですが...)

とりあえず、今回はここまで。
暫く(私が飽きるまで) 「Desire」 ネタが続くと思います。


2010年4月28日水曜日

HTC Desire 手に入れました。

今日(正確には日付がかわったので昨日)HTC Desire (X06HT)購入してきました。


詳しく、使用感を書くつもりでいたのですが、遊んでいるうちに日付が変わってしまったので、詳しくは別の日に書くことにします。
今日は、気がついたことなどを箇条書きにしておきます。


・箱がビックリするぐらい小さかったです。
・裏ぶたがビビるぐらいちゃっちい(方言?) = 粗末でした。壁に付いている電燈のスイッチのカバーみたいな取り外し方をします。(分かりづらいかなぁ)
・詳しいマニュアルは同梱されておらず、SoftBankのページからのPDFファイルでの提供されていました。
・液晶面に保護シートが全く貼られていないので、すぐに購入しました。
以上が気がついた印象の悪かった部分です。


以降は、気に入った部分です。
・ほんの数回しかiPhoneを触ったことはありませんが、感覚的に画面の切り替えなどの動きはキビキビして優っているかもしれません。
・思っていたよりは、音楽を再生した時の音は悪くなっかた。
・液晶画面はハッキリして見やすかった。


今のところ、買って後悔はしていません、どちらかというと結構テンションあがっています。


他にも、良いところ、悪いところが出てくると思いますので、追々書いていきます。


 


2010年4月14日水曜日

HTC Desire 予約してきた。

 HTC Deesire(Softbank X06HT)をヨドバシで予約しました。


 価格も発売日も、まだ決まっていないとの事でした。
 キャンセルは出来るとの事でしたが、もし他の店で再度予約する場合は、先の予約をキャンセルする必要があると言われました。つまり、予約する店に関係なくソフトバンクに対して、一人一台の予約しか出来ないということらしいです。


 仕事に関係なく単に自分の興味だけで実機なしに、Android開発をしていましたが、あと半月ほどで実機上で動かせると思うと、結構待ち遠しいです。
入手出来たら使用感なども書いていこうと思っています。


SoftBank X06HT Wiki を観つつ、発売日のお知らせメールがSoftbankから来るのを待ちます。


 


2010年3月31日水曜日

Android開発のメモ その3 SHARP-開発者ページ OPEN

 シャープが昨日(3月30日)auのAndroid携帯「IS01」の発表に合わせて、、開発者向けウェブサイト「SH Developers Square」をオープンしています。
 ここで、以前紹介した「Xperia」の add-on と同様に 「JN-DK01(IS01)」のadd-onが公開されています。導入方法は同ページに書かれています。



 また、Androidのアプリケーション開発者向け専用端末の5月以降の製品化を予告しています。ニュースリリースによると、オペレーティングシステム(OS)の書き換えができるようです。
 SHシリーズのAPIの解説も公開されています。



 詳しくは「SH Developers Square」を覗いてみてください。


2010年3月21日日曜日

C# TreeViewNodeの文字列複数行表示

TreeViewのノードで長いラベルを使うと下図のようにスクロールバーが表示されたり、幅が広くなるのが気になりましたので、ラベルの複数行表示するように考えてみました。


FormにTreeVeiwをtreeView1として配置しています。
何をしているかはコメントを参考にしてください。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
treeView1.Nodes.Clear();
// ラベル部分のみ手動で描画する
treeView1.DrawMode = TreeViewDrawMode.OwnerDrawText;
// ノードごとには高さが変えられないので、
// 今回は2行分の高さにしておく
treeView1.ItemHeight =26;
// 仮に今回はお気に入りを登録しています。
// リストに登録しているのは、単に子ノードを複数登録するので
// 同じ事を複数回書かずにループで回すためで、実際に使用する時は、
// メソッドを分けた方が良いと思います。
List<TreeNodeText> lst = new List<TreeNodeText>();
lst.Add(new TreeNodeText(
"Android Developer\r\n[ http://developer.android.com/ ]"));
lst.Add(new TreeNodeText(
"MSDN ホームページ\r\n[ http://msdn.microsoft.com/ ]"));
lst.Add(new TreeNodeText(
"MSDN Code Gallery\r\n[ http://code.msdn.microsoft.com/ ]"));
lst.Add(new TreeNodeText(
"Eclipse.org home\r\n[ http://www.eclipse.org/ ]"));
TreeNode rootNode = treeView1.Nodes.Add("お気に入り");
Graphics graphics = treeView1.CreateGraphics();
Font font = treeView1.Font;
foreach (TreeNodeText treeNodeText in lst)
{
TreeNode node = new TreeNode();
// ノードのタグにTreeNodeTextクラスのインスタンスを登録
node.Tag = treeNodeText;
// ラベルの領域幅は文字列の幅で決まるために、複数行中の
// 一番幅の広い文字列を仮のラベルとしておく
node.Text =
MaxWidthString(graphics, font, treeNodeText.TextList);
rootNode.Nodes.Add(node);
}
font.Dispose();
graphics.Dispose();
}
private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
// タグに TreeNodeText のインスタンスが登録されている場合は、
// インスタンスに登録されている文字列を描画し、それ以外は
// ラベルに登録されている文字列を描画する
// 通常のノードの描画を e.DrawDefault を使ってシステムに任すと、
// 左上に描画されるために、オーナードローしている。
string text =
e.Node.Tag == null ? e.Node.Text :
((TreeNodeText)e.Node.Tag).DisplayText;
TextRenderer.DrawText(
e.Graphics, text, treeView1.Font, e.Bounds, Color.Black,
TextFormatFlags.VerticalCenter | TextFormatFlags.Left);
}
/// <summary>
/// 文字列のリストからTreeViewに描画した場合に、
/// 幅が最長の文字列を返します。
/// </summary>
/// <param name="graphics">TreeViewのGraphicsオブジェクト</param>
/// <param name="font">文字列の描画に使用するTreeViewのフォント</param>
/// <param name="list">文字列のリスト</param>
/// <returns>最長の文字列</returns>
private string MaxWidthString( Graphics graphics, Font font,
List<string> list)
{
int maxWidth = 0;
string maxString = string.Empty;
foreach (string text in list)
{
TextRenderer.DrawText(
graphics, text, font, new Point(0, 0), Color.Black);
Size stringSize =
TextRenderer.MeasureText(graphics, text, font);
if (maxWidth < stringSize.Width)
{
maxWidth = stringSize.Width;
maxString = text;
}
}
return maxString;
}
/// <summary>
/// TreeViewのタグに登録する情報をラップするクラス
/// </summary>
class TreeNodeText
{
private List<string> textList = new List<string>();

public TreeNodeText(string text)
{
string[] array =
text.Split(new string[]{"\r\n","\n"},
StringSplitOptions.RemoveEmptyEntries);
foreach(string s in array)
textList.Add(s);
}
// 表示する文字列を各行ごとのリストを返します。
public List<string> TextList
{
get { return textList; }
set { textList = value; }
}
// 表示する文字列を行ごとに改行を挟む形で返します。
public string DisplayText
{
get { return string.Join("\r\n", textList.ToArray()); }
}
}
}

以下のように表示されます。



各ノードの高さは、ラベル表示が出来る分をあらかじめ設定しています。
TreeViewのDrawModeをOwnerDrawAllにすれば細かな調整が出来そうですが、+/-ボタンや、ノード間の線の描画、およびインデントの幅等も計算もする必要が出てきそうなので、今回は多少の格好の悪さは我慢しこのようにしました。



2010年3月14日日曜日

Android Tips アプリケーション一覧の取得

起動可能なアプリケーションの一覧を取得する方法です。
リファレンスが英語のため、こんな簡単なことでも、内容が理解するために翻訳しながらしないといけないので、メモっておきます。



// 起動可能なIntent
Intent intent=new Intent(Intent.ACTION_MAIN,null);
// デスクトップから可能なIntent(つまり通常のアプリケーション)
intent.addCategory(Intent.CATEGORY_LAUNCHER);
// 通常のアプリケーションのリストを取得
PackageManager manager=getPackageManager();
List<ResolveInfo6gt; infoes=manager.queryIntentActivities(intent,0);
TextView textView = (TextView) findViewById(R.id.textView);
for (int i = 0;i < infes.size(); i++) {
ResolveInfo info=infes.get(i);
// TextViewにアプリケーション名を出力
textView.append(info.loadLabel(manager) + "\n");
}

ここではアプリケーション名をResolveInfoから取得していますが、アイコンや起動に必要なパッケージやクラスの名前の取得もできます。


2010年3月6日土曜日

C# 画像を使った変形ウインドウの改良

以前書いたエントリー「C# 画像を使った変形ウインドウを作ってみた。」で
「for文2つとwhileの中にGetPixel()2つはものすごい時間がかかりそう。
Byte配列で処理するように変更すれば実用性がでそうだね。

とのコメントをいただきましたので、透過色以外の部分をRegionとして構成する部分をバイト配列での処理に再考し変更してみました。
今回は、変更したメソッド部のみ書いておきますので、他の部分は「C# 画像を使った変形ウインドウを作ってみた。」や「C# 変形ウインドウにマウス操作を追加した。」をご覧ください。

//
// 画像からウインドウの領域を作成し返します。
//
// 引数 bmp:対象画像
// 引数 transparencyKey:透過色
private Region BitmapToRegion(Bitmap bmp,
Color transparencyKey)
{
int height = bmp.Height;
int width = bmp.Width;
int xStart = 0;
System.Drawing.Drawing2D.GraphicsPath path =
new System.Drawing.Drawing2D.GraphicsPath();
// 縦方向の走査
for (int i = 0; i < height; i++)
{
// 横方向の走査
for (int j = 0; j < width; j++)
{
if (bmp.GetPixel(j, i) != transparencyKey)
{
// 透過色でない部分の連続を1ピクセル高の矩形にまとめ、
// GraphicsPathに追加していく
// (点ごとに登録処理するより効率がよいので)
xStart = j;
while ((j < width) &&
(bmp.GetPixel(j, i) != transparencyKey))
j++;
path.AddRectangle(
new Rectangle(xStart, i, j - xStart, 1));
}
}
}
// GraphicsPathからRegionを作成し返す。
Region region = new Region(path);
path.Dispose();
return region;
}

を以下のように変更しました。結構長くなってしまいましたの、内容はコメントを参考にMSDNの各クラスのリファレンスをお読みください。

// 以下の3つの行は、前のコードでは使用していなかったり
// コード内部でフルに書いていたため記述していなかった
// namespaceですので以前の分に追加が必要です。
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

private Region BitmapToRegion(Bitmap bmp, Color transparencyKey)
{
// if (bmp == null)
// throw new ArgumentNullException(
// "Bitmap", "Bitmapがnullを参照しています");
int height = bmp.Height;
int width = bmp.Width;
// 画像データをバイト配列にコピー
BitmapData bmpdat =
bmp.LockBits(new Rectangle(Point.Empty, bmp.Size),
ImageLockMode.ReadOnly, bmp.PixelFormat);
// コピー先の配列に領域確保
// bmpdat.Strideはスキャン幅
byte[] bytes = new byte[bmpdat.Stride * bmp.Height];
Marshal.Copy(bmpdat.Scan0, bytes, 0, bytes.Length);
bmp.UnlockBits(bmpdat);

GraphicsPath path =
new System.Drawing.Drawing2D.GraphicsPath();
// 8ビット・24ビット画像時の、BitmapDataで行が4バイト毎に行が
// 切り上げられるために、実際の画像幅との差、
// および24ビット・32ビット画像時のループカウンタと配列位置の
// 差を埋めるために使用する値を、変数diffに設定します。
int diff = bmpdat.Stride - width
// ループカウンタと配列位置の差を格納する変数
int adjust = 0;
int xStart = 0;
// 8ビットインデックス付きカラーデータ
if (bmp.PixelFormat == PixelFormat.Format8bppIndexed)
{
// カラーパレット(Color配列)から、透過色のインデックスを取得
int index =
Array.IndexOf(bmp.Palette.Entries, transparencyKey);

for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
// 一次配列のため、位置を調節しながら透過色と異なるか確認
if (bytes[i * width + j + adjust] != index)
{
// 透過色でないピクセルを連続するパスとしてパスを追加
xStart = j;
while ((j < width) &&
(bytes[i * width + j + adjust] != index))
j++;
path.AddRectangle(
new Rectangle(xStart, i, j - xStart, 1));
}
}
adjust += diff;
}
}
// 24ビットカラーデータ
else if (bmp.PixelFormat == PixelFormat.Format24bppRgb)
{
// 透過色をバイト配列に変換
// (後で比較する時に分かり易いように、RGB順でなくBGR順にしています)
Byte[] transBytes =
new Byte[] { transparencyKey.B, transparencyKey.G,
transparencyKey.R };
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
// 一次配列のため、位置を調節しながら透過色と異なるか確認
// バイト配列に前方方向からBGRの順に値が入っている
if (bytes[i * width + j * 3 + adjust] != transBytes[0] ||
bytes[i * width + j * 3 + 1 + adjust] != transBytes[1] ||
bytes[i * width + j * 3 + 2 + adjust] != transBytes[2])
{
// 透過色でないピクセルを連続するパスとしてパスを追加
// 以下の配列の比較はC# 3.0では、SequenceEqualが使えます。
xStart = j;
while ((j < width) &&
(bytes[i * width + j * 3 + adjust] != transBytes[0] ||
bytes[i * width + j * 3 + 1 + adjust] != transBytes[1] ||
bytes[i * width + j * 3 + 2 + adjust] != transBytes[2]))
j++;
path.AddRectangle(new Rectangle(xStart, i, j - xStart, 1));
}
}
adjust += diff;
}
}
// 32ビットカラーデータ
// ビットマップ側のアルファ値は実質無視しています。
else if (bmp.PixelFormat == PixelFormat.Format32bppArgb)
{
// 透過色をバイト配列に変換
// (後で比較する時に分かり易いように、ARGB順でなくBGRA順にしています)
Byte[] transBytes =
new Byte[] { transparencyKey.B, transparencyKey.G,
transparencyKey.R,transparencyKey.A };
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
// 一次配列のため、位置を調節しながら透過色と異なるか確認
// バイト配列に前方方向からBGRAの順に値が入っている
if (bytes[i * width + j * 4 + adjust] != transBytes[0] ||
bytes[i * width + j * 4 + 1 + adjust] != transBytes[1] ||
bytes[i * width + j * 4 + 2 + adjust] != transBytes[2] ||
bytes[i * width + j * 4 + 3 + adjust] != transBytes[3])
{
// 透過色でないピクセルを連続するパスとしてパスを追加
xStart = j;
while ((j < width) &&
(bytes[i * width + j * 4 + adjust] != transBytes[0] ||
bytes[i * width + j * 4 + 1 + adjust] != transBytes[1] ||
bytes[i * width + j * 4 + 2 + adjust] != transBytes[2] ||
bytes[i * width + j * 4 + 3 + adjust] != transBytes[3]))
j++;
path.AddRectangle(new Rectangle(xStart, i, j - xStart, 1));
}
}
adjust += diff;
}
}
else
{
// 今回は上記の3つのみ対応したため他のPixelFormatは
// 例外をスローします。
throw new Exception(
string.Format("'{0}'はサポートされていないカラーデータ形式です。",
bmp.PixelFormat.ToString()));
}
Region region = new Region(path);
path.Dispose();
return region;
}

Stopwatchクラスで計測してみたところ、何と平均で100倍前後高速でした。
コメントをいただいた方(名前は入力されていませんでした)ご指摘ありがとうございました。


2010年2月20日土曜日

Android開発のメモ その2 (Xperia スキン)

Sony Ericsson の開発者向けページに、ドコモが発売を予定しているXperiaの Android SDK用のAdd-onがありました。
Devloper WORLDDownloadsページのAndroidの所の「 All Android downloads 」の先にあるページから「Sony Ericsson Xperia X10 add-on for the Android SDK」を落とします。


解凍後、Android SDKのフォルダ内の「add-ons」に置くと、「AVD manager」から選ぶことができるようになります。



書き忘れていましたが、そのままAVDを起動すると大きすぎるので、起動時に、「Launch Options」で「Scale display to real size」にチェックを入れ、「Screen Size」の値を「6」か「7」にすると丁度良いぐらいのサイズになります。

2010年2月15日月曜日

Android開発のメモ その1

AndroidのSDKののインストール時にハマった事がいくつがあったので、備忘録がわりにメモっておきます。


・SDカードイメージファイルの作り方
 コマンドプロンプトで
 adb -l<ボリュームラベル>(オプション) <サイズ>[K|M] <イメージファイルパス>
 [例]1024MBのSDカードのイメージファイルをC:\直下に作成する
 >adb 1024M C:\Sdcard.img


 同じSDカードイメージファイルを別のAVDで共用出来る。



・PCからファイルをエミュレータにコピーする
 >adb push 転送元ファイル 転送先ファイル
 エミュレーからファイルタをPCにコピーする
 >adb pull 転送元ファイル 転送先ファイル
 [例]
 >adb push C:\Test.txt /sdcard/Test.txt
 >adb pull /sdcard/Test2.txt C:\Text2.txt


上記ファイルのコピーは、Eclipse上のDDMSから同様の操作可能



以下の作業は、Androidのシェルを起動した上でコマンドを送ります。
・シェル起動
 >adb shell


・フォルダの作成
 #mkdir 作成フォルダパス
 [例]
 #mkdir /sdcard/NewFolder


・ファイル削除
 #rm 削除ファイルパス
 [例]
 #rm /sdcard/Test.txt


・フォルダ削除
 #rmdir 削除フォルダパス
 [例]
 #rmdir /sdcard/NewFoder


ファイル操作については、Android MarketのPCページから「OI File Manager」というフリーのアプリケーションをダウンロードしてAVD上でインストールすれば、コマンド操作しなくても出来ました。


2010年2月9日火曜日

C# POP3でAPOP認証を使用する

予告していた通りAPOPについて書きます。
あまり使われていないらしいですが、パスワードを暗号化するので平文でやり取るするPOP3よりは、セキュリティ的には高いと言っていいと思います。(ただし、すでに破られているとのことですが..)


POP3の認証の部分のみ異なるだけですので、その部分だけの記述にします。他の部分は、先に書いた、「C# POP3サーバーからメールを受信する」をご覧ください。


以下に引用した以前のコードの「----------ココから----------」から「----------ココまで----------」の部分

/// 
/// POP3サーバのすべてのメールを受信しサーバより削除します。
///

/// POP3サーバ名
/// ポート番号
/// ユーザー名(アカウント)
/// パスワード
public void ReceiveAll(string host, int port,
string user, string pass)
{
string result;
Stream stream = null;
TcpClient tcp;
tcp = new TcpClient();
try
{
// 接続
tcp.Connect(host, port);
// NetworkStreamを得る
stream = tcp.GetStream();
// タイムアウト時間の設定
stream.ReadTimeout = 30 * 1000;
stream.WriteTimeout = 30 * 1000;
// StreamReader、StreamWriterを被せる
StreamReader reader =
new StreamReader(stream, Encoding.ASCII);
StreamWriter writer =
new StreamWriter(stream, Encoding.ASCII);
// 改行文字とバッファフラッシュを設定
writer.NewLine = "\r\n";
writer.AutoFlush = true;
// サーバーからの挨拶コードを得る
//----------ココから----------
result = reader.ReadLine();
if (!result.StartsWith("+OK"))
throw new Exception(string.Format("エラー応答:{0}",result));
// USERコマンド
writer.WriteLine("USER {0}", user);
result = reader.ReadLine();
if (!result.StartsWith("+OK"))
throw new Exception(string.Format("エラー応答:{0}",result));
// PASSコマンド
writer.WriteLine("PASS {0}", pass);
result = reader.ReadLine();
if (!result.StartsWith("+OK"))
throw new Exception(string.Format("エラー応答:{0}",result));
//----------ココまで----------

を下記のように書き換えるだけです。


    result = reader.ReadLine();
if (!result.StartsWith("+OK"))
throw new Exception(string.Format("エラー応答:{0}",result));
Match challenge =
Regex.Match(result, @"^.+(<.+>).*$", RegexOptions.Compiled);
if (!challenge.Success)
throw new InvalidDataException(
string.Format(
"APOP認証のための識別子が見つかりません:{0}", result));
// チャレンジ文字列 + パスワードを元に生成します。
string plain = challenge.Groups[1].Value + pass;

// MD5に変換
MD5 md5 = MD5.Create();
byte[] bytes =
md5.ComputeHash(Encoding.ASCII.GetBytes(plain));

// 16進数小文字(x)の文字列にする
StringBuilder md5response = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
md5response.Append(data[i].ToString("x"));

writer.WriteLine("APOP {0} {1}", UserName,
md5response.ToString());
string result = ReadLine();
// 失敗
if (!result.StartsWith("+OK"))
throw new SecurityException(
string.Format("認証に失敗しました:{0}", result));

実際にテスト出来るサーバーのアカウントを持っていませんので、テストは出来ていません。
実際の使用する場合は必ずテストを行ってからにしてください。
また、テスト結果など教えていただければ嬉しいです。


2010年2月7日日曜日

Java Android、始めました。

なんとなく、Androidが気になりだしたので、今日は開発環境の準備などしていました。
わざわざ書かなくてもご存じだと思いますが、Androidとは、Googleが開発しオーぷソース化した、携帯端末(スマートフォンなど)用のOSです。日本でもドコモを皮切りに他のキャリアも春以降搭載スマートフォンが発表されてきます。


久しぶりのJavaでしたので、Eclipseと、Android Sdkを導入して、「Hellow Android」など初歩的な物を作り、Android エミュレータ上で動かして遊んでいました。
基礎的な部分を、まだよく読まずに遊んでいましたので、もう少し勉強して自分の独自に工夫できるようになったら、ここにも書いていきたいと思います。


先日から書いていた、C#でのメール受信は、もちろん続けます。明日か明後日ぐらいにAPOPに関して書きます。


2010年2月4日木曜日

C# DataGridViewTextBoxColumのMultiline入力枠を大きく

メール受信の方は、今回お休みして、DataGridViewTextBoxColumのMultiline入力用に改善してみました。

DataGridViewTextBoxColumnでは、WrapModeプロパティを設定する事により、複数行入力が可能になります。
また、AutoSizeRowModeを設定する事により、行(セル)の高さも調整されます。
ただ、入力時に表示される編集コントロールの高さは、編集コントロールが表示された、時点の行の高さであり、特に新規行など文字列1行分しか見えなくて入力に不便を感じる場合があります。

そこで、DataGridViewTextBoxColumを少しだけ改造してみました。
表示される編集コントロール(TextBox)の高さを設定できるように拡張してみました。
Visual StudioのデザイナでのTextBoxコントロールの Textプロパティの内容の入力時に表示される MultilineStringEditor ようにしようかとも思いましたが、結構大変そうなので簡単に出来る高さを広げるのみとしました。
そのため、DataGridViewのクライアント領域を超えて表示しない物になってしまいました。

クラスの構成は以下の通りです。
DataGridViewTextBoxColumn の派生クラスとして、DataGridViewTextBoxColumnEx。
DataGridViewTextBoxCell の派生クラスとして、DataGridViewTextBoxCellEx。
DataGridViewTextBoxEditingControlはそのまま使用します。
「Ex」と付けるほどの拡張はしていませんが、とりあえず以上のように命名しています。
まずは、DataGridViewTextBoxColumnExクラスから

public class DataGridViewTextBoxColumnEx
{
private int editingPanelHeight=65;

public DataGridViewTextBoxColumnEx() : base()
{
this.CellTemplate = new DataGridViewTextBoxCellEx();
}
// 今回の中心になる、TextBoxの高さを取得または設定するプロパティです。
[Category("配置")]
[Browsable(true)]
[DefaultValue(65)]
[Description("WrapMode プロパティが true の場合に表示される"
+ "編集コントロールの高さを指定します。")]
public int EditingPanelHeight
{
get
{
DataGridViewTextBoxCellEx cell =
(DataGridViewTextBoxCellEx)this.CellTemplate;
return cell.EditingPanelHeight;
}
set
{
if (this.editingPanelHeight == value)
return;
if(this.DataGridView != null)
{

if( value < this.DataGridView.RowTemplate.Height)
return;
}
else
{
if(value < 21)
return;
}

//CellTemplateの値を変更する
DataGridViewTextBoxCellEx cell =
(DataGridViewTextBoxCellEx)this.CellTemplate;
cell.EditingPanelHeight = value;
if (this.DataGridView == null)
return;
// 既に登録済みのセルの値を更新
int rowCount = this.DataGridView.RowCount;
for (int i = 0; i < rowCount; i++)
{
DataGridViewRow r = this.DataGridView.Rows.SharedRow(i);
DataGridViewTextBoxCellEx rCcell =
(DataGridViewTextBoxCellEx)r.Cells[this.Index];
rCell.EditingPanelHeight = value;
}
}
}

// EditingPanelHeight プロパティを追加しているので、
// Cloneメソッドをオーバーライド
public override object Clone()
{
DataGridViewTextBoxColumnEx col =
(DataGridViewTextBoxColumnEx)base.Clone();
col.editingPanelHeight = this.editingPanelHeight;
return col;
}
// CellTemplateをオーバーライド
public override DataGridViewCell CellTemplate
{
get { return base.CellTemplate; }
set
{
if (value != null &&
!value.GetType().IsAssignableFrom(
typeof(DataGridViewTextBoxCellEx)))
{
throw new InvalidCastException(
"Need DataGridViewTextBoxCellEx object");
}
base.CellTemplate = value;
}
}
}

大した事はしていませんが、大きく以下のような事を行っています。
コードを後述する DataGridViewTextBoxCellEx を CellTemplateに登録しています。
デザイナ用に属性を付けた形で EditingPanelHeight プロパティを追加し、それに伴い Clone() メソッドをオーバーライドしています。

次は、DataGridViewTextBoxCellEx です。
実際に 編集用のTextBox の高さの変更はこのクラスで行っています。

public class DataGridViewTextBoxCellEx
{
private int editingPanelHeight=65;
// Cloneメソッドをオーバーライド
public override object Clone()
{
DataGridViewTextBoxCellEx cell =
(DataGridViewTextBoxCellEx)base.Clone();
cell.EditingPanelHeight = this.EditingPanelHeight;
return cell;
}
// TextBoxの高さを取得または設定するプロパティです。
public int EditingPanelHeight
{
get { return editingPanelHeight; }
set { editingPanelHeight = value; }
}
// ホストされる編集コントロールの初期化部をオーバーライドします。
public override void InitializeEditingControl(
int rowIndex,
object initialFormattedValue,
DataGridViewCellStyle dataGridViewCellStyle)
{
base.InitializeEditingControl(
rowIndex, initialFormattedValue, dataGridViewCellStyle);
if (dataGridViewCellStyle.WrapMode ==
DataGridViewTriState.True)
{
// 境界線をセット
this.DataGridView.EditingPanel.BorderStyle =
BorderStyle.FixedSingle;
DataGridViewTextBoxEditingControl ctl =
DataGridView.EditingControl as
DataGridViewTextBoxEditingControl;
// スクロールバーをセット
ctl.ScrollBars = ScrollBars.Vertical;
}
}
// 編集パネルの位置とサイズを設定部をオーバーライドします。
public override Rectangle PositionEditingPanel(
Rectangle cellBounds,
Rectangle cellClip,
DataGridViewCellStyle cellStyle,
bool singleVerticalBorderAdded,
bool singleHorizontalBorderAdded,
bool isFirstDisplayedColumn,
bool isFirstDisplayedRow)
{
// 複数行である場合
if (cellStyle.WrapMode  == DataGridViewTriState.True)
{
Rectangle rect = cellBounds;
rect.Height = editingPanelHeight;
// 編集パネルの高さを広げた結果、
// DataGridViewのクライアント領域の下部よりはみ出さないか確認
if(rect.Bottom> this.DataGridView.ClientRectangle.Bottom)
{
下部にはみ出す場合はセルの上側に表示する。
rect.Y =
rect.Top - editingPanelHeight + cellBounds.Height;
//  DataGridViewのクライアント領域の上部よりはみ出さないか確認
if (rect.Top < 0)
{
// 上側表示の結果上部にはみ出す場合は上部ギリギリに調節
rect.Y = 0;
}
cellClip= cellBounds;
}

// セルにおけるセルの内容の場所を左上にします。
// 入力開始位置がこれによりパネルの左上からになります
cellStyle.Alignment =
DataGridViewContentAlignment.TopLeft;
cellClip = cellBounds = rect;
}
return base.PositionEditingPanel(
cellBounds,
cellClip,
cellStyle,
singleVerticalBorderAdded,
singleHorizontalBorderAdded,
isFirstDisplayedColumn,
isFirstDisplayedRow);
}
}

このクラスの中で編集コントロール(TextBox)の高さの変更と、境界線・スクロールバーを設定しています。
WrapMode が true 以外の場合は EditingPanelHeight プロパティを設定しても、通常の表示がおこなわれます。


実際に DataGridView の「列の編集」から、「DataGridViewTextBoxColumnEx」を列に追加し、入力を行うと以下の図のようになります。


最初に書いた、DataGridViewのクライアント領域を超えて表示できない件は、編集パネル部の高さを、クライアント領域より高くしなければ、どうにか使えると思うのですが...、いわゆる運用の方で....。




2010年2月3日水曜日

C# POP3サーバーからメールを受信する

今日は、POP3でメールボックス内の全てのメールを受信し、メールボックスから削除します。
前回書いた分は、大文字・小文字のタイプミスなどありました。すみませんでした。
重複する説明になる部分が出てくると思いますが、軽く流して下さい。
あっちこっち飛ぶと分かりにくいと思いますので、メソッドに割らないでダラダラ書いていきます。


カッコ等も省かず書きますので、コードをすべてまとめると、一つのメソッドになります。
/// 
/// POP3サーバのすべてのメールを受信しサーバより削除します。
///

/// POP3サーバ名
/// ポート番号
/// ユーザー名(アカウント)
/// パスワード
public void ReceiveAll(string host, int port,
string user, string pass)
{
string result;
Stream stream = null;
TcpClient tcp;
tcp = new TcpClient();
try
{
// 接続
tcp.Connect(host, port);
// NetworkStreamを得る
stream = tcp.GetStream();
// タイムアウト時間の設定
stream.ReadTimeout = 30 * 1000;
stream.WriteTimeout = 30 * 1000;
// StreamReader、StreamWriterを被せる
StreamReader reader =
new StreamReader(stream, Encoding.ASCII);
StreamWriter writer =
new StreamWriter(stream, Encoding.ASCII);
// 改行文字とバッファフラッシュを設定
writer.NewLine = "\r\n";
writer.AutoFlush = true;
// サーバーからの挨拶コードを得る
result = reader.ReadLine();
if (!result.StartsWith("+OK"))
throw new Exception(string.Format("エラー応答:{0}",result));
// USERコマンド
writer.WriteLine("USER {0}", user);
result = reader.ReadLine();
if (!result.StartsWith("+OK"))
throw new Exception(string.Format("エラー応答:{0}",result));
// PASSコマンド
writer.WriteLine("PASS {0}", pass);
result = reader.ReadLine();
if (!result.StartsWith("+OK"))
throw new Exception(string.Format("エラー応答:{0}",result));

ここまでは前回とほぼ同じです。
サーバーに接続し USER 、PASS コマンドでログインしています。
"+OK"とあるのは、POP3サーバーでは、正常にコマンドが実行された場合には「+OK」、異常がある場合には「-ERR」を先頭しにして応答する為、正常応答かを確認しています。


    // 一覧を取得(LISTコマンド)
writer.WriteLine("LIST");
result = reader.ReadLine();
if (!result.StartsWith("+OK"))
throw new InvalidDataException(
string.Format("エラー応答:{0}", result));
// 「.」が出てくるまでループして一覧番号(UID)を取得
List uidList = new List();
while ((result = reader.ReadLine()) != ".")
{
// [UID サイズ]の形式で返ってくるので、UIDのみリストとして取得
string[] val = result.Split(new Char[] { ' ' });
uidList.Add(int.Parse(val[0]));
}

ここでは、LISTコマンドでメールボックス内のメールのリストを取得しています。
各メールに振られている UID(ユニークな識別番号)の一覧をとしてListに格納しています。


    StringBuilder builder = new StringBuilder();
foreach (int uid in uidList)
{
builder.Length = 0;
// メールを取りだす(RETRコマンド)
writer.WriteLine(string.Format("RETR {0}", uid));
result = reader.ReadLine();
if (!result.StartsWith("+OK"))
throw new InvalidDataException(
string.Format("エラー応答:{0}", result));
// メール終端までループして受信
while (true)
{
if ((result = reader.ReadLine()) == ".")
{
// "." のみの場合はメールの終端を表す
break;
}
builder.Append(result);
builder.Append("\r\n");
}
// ここではコンソールに出力
Console.WriteLine(builder.ToString());

メール受信の部分です。
先に取得した UID を RETRコマンド の引数として送る事により、対象のメールを要求します。
whileループしている部分で、メールを受信しています。コメントに書いている通り、「.」(ピリオド)のみの行がメールの終端を表していますので、出現するでループしています。


      // 削除フラグを送信(DELEコマンド)
// 実際の削除は QUITコマンドにて行われる。
writer.WriteLine(string.Format("DELE {0}", uid));
result = reader.ReadLine();
if (!result.StartsWith("+OK"))
throw new Exception("エラー応答:{0}", result));
}

DELEコマンドに引数として UID を付けて送る事により、受信を完了したメールに削除フラグを付けています。
削除フラグと書いたのは、この後の QUIT を送る事により削除が実行されるからです。
QUITを送る前に何らかの理由で切断した場合は、メールは削除されません。


    // ログアウト(QUITコマンド)
writer.WriteLine("QUIT");
result = reader.ReadLine();
if (!result.StartsWith("+OK"))
throw new Exception(string.Format("エラー応答:{0}",result));
}
finally
{
if (stream != null)
stream.Close();
if (tcp != null && tcp.Connected)
tcp.Close();
}
}

QUIT コマンドでログアウトしています。先に書いたように、DELE コマンドで削除を指定したメールは正常にログアウトした時点で、削除された事になります。



メール受信に関するネタはもう少し続くと思います。


2010年1月27日水曜日

C# POP3への接続の続き(説明)

今日は、先日書いた「POP3へのログイン (リンクは別ウインドウで開きます)」の説明だけにしておきます。
その前にコードの訂正があります。「finally」ブロックの部分は、以下のように書かないと接続に失敗した時に、「finally」の所で例外が発生してしまうの可能性がありました。

finally
{
if(stream != null)
stream.Close();
if(tcp != null && tcp.Connected)
tcp.Close();
}

大体はコメントで分かると思いますが順に説明していきます。
1.サーバーとポートを指定して接続しています。
2.読み書き時のタイムアウト時間を設定しています。例では、30秒(30000ミリ秒)固定にしていますが、Outlookなどのデフォルトは60秒なので、サーバーなどに合わせて調整出来るようにした方が良かった思います。
3.「TcpClient.GetStream()」で取得した「NetworkStream」を、そのまま使って読み書きしても良いのですが、コードが簡単になるので、今回は StreamReader / StreamWriterを取得しています。
4.「result = reader.ReadLine();」は、サーバーからの応答を読みとっています。
5.「if(!result.StartsWith("+OK"))」は、応答が正常を表す「+OK」で始まっていない場合は、例外をスローしています。(if(result.StartsWith("-ERR"))でも可)
6.後は「USER」コマンドでユーザー名(アカウント)、「PASS」コマンドでパスワードを送り、認証されログイン出来たのち「QUIT」コマンドで接続を切断しています。


大体こんな感じです。
このままではメール受信もなにも出来ていないので、もう少し実用的な感じにして次の機会に書きます。


2010年1月25日月曜日

C# POP3へのログイン

メール受信をC#行うためのコードを書いていきたいと思います。


POP3、IMAP4 や 認証方法など結構多岐にわたるので、今日は基本的ところでなPOP3への平文でログインして閉じるだけのコードです。

public void Connect(string host, int port, string user, string pass)
{
string result;
Stream stream;
TcpClient tcp;
tcp = new TcpClient();
try
{
// 接続
tcp.Connect(host, port);
// NetworkStreamを得る
stream = tcp.GetStream();
// タイムアウト時間の設定
stream.ReadTimeOut = 30 * 1000;
stream.WriteTimeOut = 30 * 1000;
// StreamReader、StreamWriterを被せる
StreamReader reader = new StreamReader(stream, Encoding.ASCII);
StreamWriter writer = new StreamWriter(stream, Encoding.ASCII);
// 改行文字とバッファフラッシュを設定
writer.NewLine = "\r\n";
writer.AutoFlush = true;
// サーバーからの挨拶コードを得る
result = reader.Readline();
if(!result.StartsWith("+OK"))
throw new Exception(string.Format(
"サーバーからの応答コードが不正です:{0}", result));
// USERコマンド
writer.WriteLine("USER {0}", user);
result = reader.Readline();
if(!result.StartsWith("+OK"))
throw new Exception(string.Format(
"サーバーからの応答コードが不正です:{0}", result));
// PASSコマンド
writer.WriteLine("PASS {0}", pass);
result = reader.Readline();
if(!result.StartsWith("+OK"))
throw new Exception(string.Format(
"サーバーからの応答コードが不正です:{0}", result));
writer.WriteLine("QUIT");
result = reader.Readline();
if(!result.StartsWith("+OK"))
throw new Exception(string.Format(
"サーバーからの応答コードが不正です:{0}", result));
}
finally
{
stream.Close(); 
tcp.Close();
}
}

コメントである程度わかると思いますが、ソース内容の説明は、今日は眠たいので次回にします。


2010年1月18日月曜日

人気プログラミング言語ランキング でC#6位でした

マイコミジャーナルに人気プログラミング言語ランキングが載っていました。


人気プログラミング言語ランキング ‐ PHP、C++を抜いて3位


C#は6位で、私の思っているより人気があるように感じました。
このランキングでC#より下位の Ruby や Python の方が、ネットでの情報が多いように思っていたからです。
Microsoftの取り組み方がC#対して中途半端なのが、人気が伸びない原因だと思います。VBなのかC#なのかそろそろはっきりしてもらえないものでしょうか。
やっぱり C や Java に乗り換えようかなぁなんて考えてしまします。


話は変わりますが、次のテーマを考えています。
メール受信か、以前やったDataGridViewのセルの結合に再挑戦するかで悩んでします。
DataGridViewをやるなら、慎重に構成を考える必要がありそうなので...。メール受信かな?


2010年1月10日日曜日

C# 外部アプリケーションにキーストロークを送り操作する。

外部のアプリケーションにキーストロークを送りたかったのですが、「SendKeys」では、アクティブなウインドウが対象なので、WIN32 APIを使って書いてみました。


以下のコードでは、Internet Explorer を全画面表示にしています。


まずはP/Invoke定義部

[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(String lpClassName,
String lpWindowName);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern bool PostMessage(int hWnd, Int32 Msg,
int wParam, int lParam);

private const Int32 WM_KEYDOWN = 0x0100;

キーストロークを送る部分です。

// IEのウィンドウハンドル取得
IntPtr hWnd =
FindWindow(null, "Yahoo! JAPAN - Windows Internet Explorer");
// ハンドル取得失敗時
if (hWnd == IntPtr.Zero)
{
Console.WriteLine("ハンドルが取得できません");
return;
}

// メッセージPOST
bool result =
  PostMessage(hWnd, WM_KEYDOWN, (int)(Keys.F11),0);

以上で、IEが全画面表示になります。今回は簡単にするために、IEで YAHOO を表示していると仮定してしています。
実際に使用するには、ウインドウハンドルの取得部分に工夫が必要だと思います。


2010年1月6日水曜日

GodMode

今日、CNETを観ていたら、気になる記事があったので、メモとして残しておきます。(CLSIDの部分が絶対覚えられないので)


「Windows 7」「Vista」でフォルダを作成しフォルダ名を「GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}」にすると、コントロールパネルの拡張版のような物が出来上がるとのことです。
Vistaで試しましたが、結構便利そうに感じました。


元記事はCNET JAPANの「Windows 7」の管理機能を集約--「GodMode」の存在が明らかに」です。


2010年1月4日月曜日

明けまして おめでとうございます

明けまして おめでとうございます。
��ケ月以上、書いていませんでしたが、ネタが思いつかなかっただけで、止めたわけではありませんので、またお越しください。
去年以上に、頻繁に書いていくようにします。
と、書きつつ今日はネタが無かったので、挨拶だけで失礼します。