2012年6月9日

Windows/Mac/LinuxでSugarSyncの代わりに使えそうな4つのクラウドストレージ

いつまで経ってもSugarSyncからLinux用クライアントが出て来ない。

そのためしびれを切らしてSugarSyncから離れて他のサービスへ移行するユーザーも多いみたいだ。
SugarSync for Linux . Archive (504) . Feature Request . Forum . SugarSync Community

僕はと言えば以前にも書いた通り、Wine上でWindows版のクライアントを動かして凌いでいる。でもやっぱりネイティブなクライアントがあった方が良いに決まっている。

実際、Wine上のSugarSyncだと同期対象のフォルダ内でファイルを作成・変更してもリアルタイムにアップロードされないという問題がある。(SugarSyncクライアントを一旦終了して起動し直せばアップロードが開始される。)
SugarSync on Linux - Computer

単にLinuxユーザーの絶対数が少ないから開発費をかけるメリットが無い、という理由で切り捨てるのは馬鹿げている。Linuxだけを使っているユーザーよりも、WindowsやMacと併用しているユーザーの方が断然多いはずだからだ。

Windows/MacとLinuxを併用している場合、全ての環境で同じクラウドストレージを使いたいという要望が出て来るのは当然だ。DropBoxではかなり前からこれが実現出来ているし、他の多くのクラウドストレージサービスにも当たり前の様にLinuxクライアントが用意されている。


SugarSyncが何故これほどまでにLinux用クライアントを出さないのか、ここまで来るともうあきれるのを通り越して一種興味深いものがある。もしかすると水面下でMicrosoftと買収交渉でも進行中なのかな、と勘繰りたくもなってくる。(Microsoftは既にSkyDriveやLive Meshを提供しているので多分それは無いだろうけれど。)


さて、ここからが本題だ。

現時点で、Windows/Mac/Linuxで使える他のクラウドストレージサービスを探すとすれば、どんな選択肢があるのだろうか。

ざっと探したところ下の4つが見つかった。
















































さて、では実際にどれを使えば良いのだろうか。

上記のサービスについて、「運営会社の知名度・信用度」、「使われているセキュリティ」、「無料で使える容量」の3つの観点から比較してみた。

サービス名 運営会社 セキュリティ 無料容量
Wuala LaCie クライアント側で暗号化 5GB (+紹介ボーナス)
SpiderOak SpiderOak Inc. クライアント側で暗号化 2GB (+紹介ボーナス)
DropBox Dropbox Inc. サーバー側で暗号化 2GB (+紹介ボーナス)
4shared 4shared.com サーバー側で暗号化(?) 15GB


WualaをやっているLaCie社というのは、フランスのストレージ装置メーカー。米Seagate社に買収されるらしい。もしSeagateの一部門になれば資本規模も万全だし会社としての信用度はかなり高いと思って良いのではないだろうか。(買収後に切り離されたりしない限りは。)

セキュリティ的な観点から見ると、クライアント側での暗号化はぜひ欲しい。サーバー側での暗号化だと、従業員の不正やなんらかのミス、あるいは不具合などで暗号化前のファイルが流出してしまう可能性がどうしても否定出来ないからだ。

これを考えるとDropBoxは選択肢に入れづらい。
参考: Dropboxが約4時間すべてのアカウントのロックを解除してしまう事故が発生 : ライフハッカー

4sharedについてはセキュリティに関する説明があいまいで今ひとつ信頼出来ない印象を持ってしまったので個人的には選択肢からは外したい。

無料容量も出来ればSugarSyncと同等の5GBは欲しい。


以上の事から考えると、現時点ではWualaが最も有力な選択肢になりそうだ。

早速これから試してみようと思う。





追記1: 紹介ボーナスでWualaの初期容量が6GBになるリンクはこちら。→ Wuala


追記2: こちらの記事にも参考になる情報がたくさんあった。
Dropbox vs 他社オンラインストレージ:アナタに一番合っているのはどれ? : ライフハッカー[日本版]












.

2012年6月1日

UbuntuでFIT-PC2iの無線LANを有効にするには?

去年の1月から使っているFIT-PC2i。

前から気になっていた超小型省電力PCを試してみた
前から気になっていた超小型省電力PCを試してみた - その2 リベンジ編
超省電力な上に有線LANポート2つと無線LANが付いている面白いマシンだ。
8GBのUSBメモリに入れたUbuntu 10.04 Serverで順調に稼働している。

ただ、Ubuntu 10.04 Serverをインストールした直後の状態だと無線LANを認識してくれなかった。そのため今まで2つの有線LANポートを使って運用して来たのだけれど、やっぱりそろそろ無線LANも有効にして3つのLANをつなぐFirewallとして動作させてみる事にした。

無線LANを有効にする為の手順は次の通り。
  1. 無線LANチップのLinux用ドライバーをダウンロード。
  2. ドライバーのソースをコンパイル&インストール。
  3. wpa_supplicantの設定を追加。
  4. /etc/network/interfaceファイルに無線LANインターフェースの設定を追加。
  5. ネットワークサービスを再起動する。

1. 無線LANチップのLinux用ドライバーをダウンロード。


メーカのサイトからLinux用ドライバーをダウンロード。
http://www.ralinktech.com/en/04_support/support.php?sn=501
FIT-PC2iのハードウェア仕様を確認すると無線LANのチップは「RaLink RT3070」との事だったので、それに対応したものを選ぶ。


2. ドライバーのソースをコンパイル&インストール。


ダウンロードしたファイルを解凍して README_STA_usb というファイルを読むと、「Makefileを編集しろ」それから「 os/linux/config.mk」も編集しろ、と書いてある。
Build for being controlled by NetworkManager or wpa_supplicant wext functions
Please set 'HAS_WPA_SUPPLICANT=y' and
'HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y'.
とりあえず wpa_supplicant の wext を使うと行けそうなので、上の通りに編集しておく。


3. wpa_supplicantの設定を追加。


/etc に wpa_supplicant.conf というファイルを作って無線LANアクセスポイントへの接続方法を指定すれば良いらしい。
WPA2を使ったセキュリティ設定のやり方がなかなか見つからず、この設定で一番ハマってしまった。

結局このページにたどり着いて同じ様にしたらなんとかつながった。
nlog(n): Linux で無線 LAN の成功と挫折: WPA Supplicant の導入
/etc/wpa_supplicant.confの内容:
ctrl_interface=/var/run/wpa_supplicant
eapol_version=1
ap_scan=1
network={
        ssid="MYSSID"
        scan_ssid=1
        proto=WPA2
        key_mgmt=WPA-PSK
        pairwise=CCMP
        group=CCMP
        psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}
psk=xxxxx….xxxxの部分は、先にwpa_passphraseコマンドを使って暗号化しておく。


4. /etc/network/interfaceファイルに無線LANインターフェースの設定を追加。


これはいつも有線LANでやっている静的アドレス指定とほぼ同じ。最後の2行が増える点だけが異なる。
auto ra0
iface ra0 inet static
  address 192.168.1.10
  netmask 255.255.255.0
  network 192.168.1.0
  broadcast 192.168.1.255

  wpa-driver wext
  wpa-conf /etc/wpa_supplicant.conf


5. ネットワークサービスを再起動する。


/etc/init.d/networking restart


これで無線LANが動いた!

さてここから次はFirewallとして使う為の iptables との格闘が始ったのだけれども、それはまた別の話だ。

ネットワークは本当に面白い。







.

2012年5月26日

WebSocketについて押さえておきたいもう一つの視点


下の記事を読んで「やっぱりMeteorはすごいな~!」と思った。
体感!JavaScriptで超速アプリケーション開発 -Meteor完全解説:第1回 Meteorをはじめよう|gihyo.jp
と同時に、最近よく目にする様になった WebSocket について気になりだした。

そこで色々検索して解説記事や入門記事を読んでみた。

http://warmcat.com/_wp/2010/11/01/libwebsockets-html5-websocket-server-library-in-c/


多くの記事はAjax, Cometなどの延長・改良版としてのWebSocketという視点で書かれていたのだけれども、その中で少し視点の異なる次の3つの記事が目に留まった。

Tender Surrender: WebSocketのバイナリメッセージを試したら、ウェブの未来が垣間見えた
『今後インターネットでスピードを追求していく上で、WebSocketはなくてはならない存在になるでしょう。リアルタイムなサービスを作る必要がなくても使われるテクノロジーになります。理由は大きく2つ。WebSocketの持つオーバーヘッドの削減と、データの圧縮という特徴です。』
『僕はインターネット上でWebSocketを使って流れるデータが、将来的に全部バイナリーになる可能性すらあるのではないかと思っています。』
『少し大げさに言うと、これはウェブにおけるパラダイムシフトになり得ます。ウェブで使われるプロトコルがHTTPからWebSocketに乗る何かしらのプロトコルに置き換わる可能性は、全くないとは言い切れないのではないでしょうか。』

telnet over WebSocketを作ってみた&その意味
『WebSocketが新しいバージョンとなりbinary frameが扱えるようになったことで、今までTCPで実現されていたすべてのプロトコルとお話しできるようになります。今まで悩まされていたNAT, Firewallなどを超えて、様々なサーバと繋いでみるのも楽しいかもしれません。』

こてさきAjax:WebSocketから、これからのWebを予想してみる
『結論から先に言うと、「WebSocketはWeb上に、個々のVPNを作る技術である」と僕は思っています』
『こうなってくると、Webは、単にWebページ(コンテンツ)にアクセスするための仕組みとは言えなくなります。むしろ、Webが基本のプラットフォームとなり、そこの上に個別のポリシーのネットワークが形成される。そして、ユーザーは、それらのネットワーク上を自由に行き来するという世界観で捉えるほうが妥当であると僕には感じられます。』

これら3つの記事を読むと、WebSocketとは単なる「より良いAjax」ではなく、インターネットの世界にもっと大きなパラダイムシフトをもたらす可能性を持ったものだと言う事が言えそうだ。

これは少ないオーバーヘッドでバイナリデータを扱える様になった事によるところが大きい。これによって今現在はTCP/UDPのポート番号で区別されている通信を全てTCPの80番と443番ポートで(FirewallやNATを越えて)流す事が可能になる。(WebSocketを使ったVNCクライアントはその良い例だろう。) これが普及すればアプリケーションの区別はもっぱらWebSocket内のサブプロトコルによって行われる様になるかも知れない。

つまり こてさきAjax さんが予想されている様にネットワークのレイヤが一つ上がった形でアプリケーションが動くという事になる。

それがもっと具体的にどういう意味を持つのかはまだはっきりとイメージ出来ないけれど、何だか楽しいことになりそうな気はしている。









.

2012年5月5日

Sprintの携帯とGoogle Voiceが統合されてどうなったか

去年の5月頃から、Sprintの携帯の電話番号がGoogle Voiceでそのまま使える様になった。GoogleとSprintが提携したので、Sprint側のバックエンドがGoolge Voiceに直結された様なイメージだ。これは非常に便利な機能で重宝している。
ASCII.jp:Google Voiceと米Sprint端末の統合が可能に
GoogleとSprintがGoogle Voice導入で提携、Sprint版Nexus S販売も - ITpro

全ての発着信履歴、テキストメッセージやボイスメールにWebからアクセス出来る。
テキストメッセージやボイスメールを自動的に自分のEメールに転送する事も出来る。 

ブラウザから自分の電話番号を使って発信する事も出来る。
PCで通話する事も携帯で通話する事も可能。

特に、テキストメッセージを受け取った時にすぐにEメールに転送されて来るので、携帯を使わずそのままPCから返信出来てしまうのが気に入っている。


端末から電話をかける時は、Google Voiceを経由するのか従来通りSprintの電話網を通すのかを選択出来る。(もちろん前もって設定で決める事も出来る。)
通常はSprintを使って、国際電話の時だけGoogle Voiceを使うという設定も可能だ。(Google Voiceを通すと日本まで1分2セントで通話出来る。)

この機能のおかげでSprintの高い国際通話料金を払う必要が無くなった。

と、いい事づくめだったのだけれども、2日ほど前から問題が発生してしまった。


突然、端末から国際電話の発信が出来なくなってしまったのだ。
検索してみると5月2日から多くの人がこの問題で困っているらしい。

When trying to place a call via google voice i get: "this is not a valid number" 
Sprint Community: International calls - this is an invalid number, problem for Sprint users since 5/2/2012 - update?

国際電話の番号をダイヤルすると「This is not a valid number」という録音メッセージが返って来るだけだ。Google VoiceのWebサイトで発信履歴を見ると、記録されている電話番号が先頭の7文字までで切れている。

どうやらSprintとGoogleの間の連携が上手く行かなくなってしまっている様な感じだ。

それにしても、問題発生から2日も経っているので、きっと困っている人も多いだろうと思う。

携帯とGoogle Voiceが統合されて便利になったのは良いのだけれど、こういう問題は本当に困る。Googleがこれからもっと社会インフラ化して来るとしたら、もっと重大な問題が起こりそうな気がしてならない。









.



2012年5月3日

ASP.NET MVC 4 BetaでWebページを編集中にVisual Studioがフリーズする件

Visual Studio 2010 SP1 + ASP.NET MVC 4 Betaという環境でコピー&ペーストしようとするとIDEがフリーズしてしまうという現象に遭遇した。

再現手順は次の通り。

  1. 新規でASP.NET MVC4 Web Applicationプロジェクトを作成。

  2. テンプレートは「Empty」を選択

  3. Solution ExplorerでControllersを右クリックしてコントローラクラスを追加。

  4. 作成されたクラスのIndexメソッド上で右クリックしてViewを追加。

  5. Index.cshtmlファイルが作成され自動的にその編集画面が開くので、HTMLタグなどを適当に入力して、コピー&ペーストを実行。

  6. Visutal Studioがフリーズして、その後強制終了(再起動)してしまう!
  7. 場合によってはコピー&ペーストをしなくても編集中にフリーズする。

いろいろ検索して、唯一見つけた同様のケースの情報がこれだった。
VS 2010 freezes when pasting text into the editor | Microsoft Connect
一つの回避策として、.cshtmlファイルを開く際に右クリックして「Open With...」というメニューからデフォルトのRazer EditorではなくHTML Editorを選べばエラーが出ないとの情報が得られた。

確かにその通り、HTML Editorで開くと問題ない様だ。
でも毎回その操作をするのは面倒なのでなんとか解決したい。

まずはVS.NETの拡張機能を片っ端からDisableしたりUninstallしたりして試す。
それでもダメなので、ASP.NET MVC 4 Betaを再インストール。まだ直らないのでこの際MVC3, MVC2もアンインストール。

VS.NETのSP1もアンインストールした。すると今度はアンインストールに失敗してしまい、だんだん雲行きが怪しくなって来る。嫌なパターンだ。

結局、案の定Visual Studio 2010全体を最初から入れ直すはめになってしまった。
2010の再インストール後、SP1、MVC3, MVC4 Betaと順に再インストール。
その後気を取り直して、また上記の手順でMVC 4のプロジェクトを新規作成して試すと....

またまたフリーズ! 再インストールの苦労は一体何だったのか...。

と数時間に渡る格闘の末、ようやく解決策を見つけ出した。
その解決策とは...

『プロジェクトを新規作成した後、ALT + B, U または CTRL+Shift+B を押して一旦ビルドしておく事!』



これで万事OKだ。







.

2012年4月21日

今ならASP.NET MVC, Code First, HTML5, jQueryを学べる動画が1ヶ月間無料!

ScottさんのBlogにこんなお得情報があったので転載。
Great Free Course on Building ASP.NET MVC Apps With EF Code First, HTML5 and jQuery - ScottGu's Blog

コースの内容はこちらで確認出来る。
Building ASP.NET MVC Apps with EF Code First, HTML5, and jQuery


全部で約5時間程度の動画の様だ。

この Pluralsight というサイトの動画は以前にも観た事があるけど、英語も比較的分かりやすくて良かったのを覚えている。

リスニングの練習もしながら最新の開発スキルも習得出来るのだから、これは利用しない手はない。



無料で視聴するには、まずTwitterで@pluralsightのアカウントをフォローする。


その後、申し込み用のサイトから自分のTwitter IDを入力する。


後はTwitterのプライベートメッセージでアクセスコードが送られてくるのを待つだけ。

申込み期間は4月27日までだそうなので、お早めに!







.

2012年4月19日

Windows上でAndroid SDK Revision 17のandroidコマンドのエラーを回避する方法

久しぶりにWindows 7上でAndroid SDKのアップデートを実行しようとして、いつもの様に

android update sdk

と打ち込んだら、エラーになった。ここに書いてあるのと全く同じ現象だ。
rTAKI0329's android ブログ: android.bat が起動しないので、こんな回避策を実施してみました
こちらでも同じ現象が報告されていた。
Issue 23648: tools\lib\find_java.bat returns Java not found in your path

 上のブログに書かれている通りに lib\find_java.bat ファイルを編集してjava.exeのパスを直接書き込んだらエラーは出なくなったので、ひとまず安心した。

でもこれを知らなかったら、このエラーを修正したアップデートが出たとしても、それを適用する為のコマンド自体がエラーになるのだから、アップデートが出来ずに途方に暮れる事になっていただろうと思う。







.

2012年4月7日

携帯電話でも動くAndroidアプリ開発環境「AIDE」を使ってみた

「AIDE」というアプリが面白い。
AIDE - Android Java IDE - Google Play

InfoQ: AIDE 開発者に聞く - Android で動作する Android Java IDE

【コラム】イマドキのIDE事情 (126) ついに登場! Android上で動作する開発環境「AIDE」

これがあればAndroid端末上でAndroidアプリを開発する事が出来る。最初はもちろん「どうせエラーで落ちまくるんじゃないの?」と半信半疑だったが、試してみた所かなり安定している。

今回は3時間ほどかけてじっくりとこの「AIDE」で遊んでみた。

多分メインの用途としてはタブレット端末に外付けのキーボードをつないで使うという事を想定しているのだろうけど、なかなかどうして画面が4.3インチしかない携帯電話(HTC Evo)の上でもしっかりと動いている。

ソフトウェアキーボードでのコード入力は確かに辛い。でもコード補完もいい感じでやってくれるので、ある程度慣れればそれなりに打ち込める様にはなりそうだ。

まず何を試そうかと思ったのだが、以前に自分で作ったオセロゲームのEclipseのプロジェクトをそのまま読み込ませてみた。それなりの行数のコードなのでこれが問題なくビルド出来て動かせるのであれば、実際の開発でも使えそうだという事になる。

AIDEはGitに対応しているので、GitHubの公開リポジトリを指定して「Clone」を押すとなんの問題もなくソース一式を開く事が出来た。素晴らしい。

Gitのリポジトリを指定して「Clone」を押せばソースを取得してくれる。便利!
このサンプルのURLは、https://github.com/mikehibm/MiReversi.git
もしくは git://github.com/mikehibm/MiReversi.git

ソースに入っていた日本語のコメントも問題なく表示されている。
(ただし日本語の入力にはちょっと問題がある。)


ソースを取得した後、早速メニューから「Run」を選択して実行。

実行するとAPKファイルが作成され自動的にこの端末にインストールされる。

オセロゲームのアプリが問題なく起動した!

PC上のEclipseで作成したプロジェクトを開いてビルド・実行が出来る事が確認出来た。もちろんGitリポジトリからPullするだけでなく、ソースを変更した後、Commit/Pushする事も出来る。



つまり、これで通勤時間中に開発したり、ちょっとした空き時間にデバッグしたりという事が携帯だけで出来る、という事だ。ちょっと興奮してしまう。もちろん実際にやるかどうかは別だけれども、「やろうと思えば出来る」という事が凄いのだ。

さて次に、AIDEだけを使って小さなサンプルを一からコーディングしてみる事にした。

プロジェクトの新規作成画面。


新規作成後、res, src, gen, bin, assets などEclipseでも見慣れたフォルダが自動的に作成されている。

とりあえず、レシピ本の「No.88 カメラを呼び出す」サンプルを入力する。

IntentがImportされていないので赤い波線が表示された。

画面を長押しすると「Fix」というメニューが出てくるのでこれを選択。



さらに「Add Import ...」を選択すると、自動的にImport文を生成して追加してくれる。この辺りはEclipseと同等の使い勝手を実現している。



メニューボタンを押すと出てくるメニュー。




ソフトウェアキーボードと格闘しながらコードを入力する事約20分、AIDEだけで作ったミニアプリが出来上がった。ボタンを押すとカメラが起動して、撮った画像の縮小版がImageViewに表示される。



携帯でここまで出来るのだから、タブレット端末ならもっと快適だろうと思う。ましてや外付けキーボードなんかがあったら、もしかするとPC上でエミュレータを起動したりUSB経由で実機をつないだりするよりも快適かも知れない。

ただ、ひとつだけ欠点がある。AIDEでは現状ではデバッグ実行の機能が無い。もし将来的にデバッグ実行機能が付いてブレークポイントとかが設定出来るようになったら、本当に凄い事になるかも知れない。









.

2012年3月24日

「n件目からm件だけを取り出したい」場合のSQLクエリの書き方

Webアプリケーションで何らかのデータの一覧を表示する際に、ページング処理(Pagenation)を行うのはほとんど当たり前の事になっている。

EntityFrameworkでLINQを使って「100件スキップしてから20件だけ取得する」というクエリーを書きたい場合は、例えば下の様な書き方になると思う。

var list = db.Books
.OrderBy(itm => itm.id)
.Skip(100)
.Take(20);

これを実行すると実際にはどのようなSQLに変換されているのかを調べてみたい。

*ただし、以下の内容はMicrosoft SQLサーバーやOracleなど、分析関数が使用可能なデータベースサーバーを使っている場合に限られた話になると思う。


Microsoft SQLサーバーを使っている場合は、クライアントとデータベースの間でやりとりされているデータの内容を確認するには、「SQL Server Profiler」を使うのが便利だ。
「SQL Server Profiler」でキャプチャを開始する前の設定画面

キャプチャされたSQLの内容

実際にデータベースに送られたSQL文を少し読み易く書き直すと、下の様な感じになる。

SELECT TOP 20 *
FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY [bs_id] ASC) AS [row_number]
FROM [dbo].[Bookshelves]
) AS e
WHERE e.[row_number] > 100
ORDER BY e.[bs_id] ASC

なるほど、ROW_NUMBER() という関数を使って一旦全レコードに行番号を付けて、そこから100行目以降の20件だけを取り出すというロジックになっているのか。。。


多分、この様にサブクエリを使って書くとSQLサーバーの内部で最適化が行われて、実際には全件アクセスはせずに最小のコストで必要な部分だけを返す事が出来るのではないだろうか。

この書き方は自分でSQLを書くときにも使えそうだ。一つのひな型として覚えておこうと思う。








.

新しいiPadを触ってみた感想

今日初めて「新しいiPad」を触って来た。



印象が薄れないうちに感想を書いておこうと思う。

  1. 画面がキレイ。
  2. やっぱり重い。
  3. でもiPad2には戻れない。
  4. 結論: 重さが半分になれば買います。


1.画面がキレイ。

これは本当にその通り。細かい文字も確かに見易くて良い。これで電子書籍を読んだら快適だろうと思った。

2.やっぱり重い。

Apple Storeに居る間、片手で5分間持ち続けたのだけれど、やっぱり重い。ベッドに寝転んでWebを見るにはこれでは辛い。実は家に初代iPadがあって、買った当初は喜んでこれでWebを閲覧していたけれども、重さが気になって段々と使わなくなってしまったのだ。重さ的には新型もほぼ変わらないので、多分同じ結果になりそうな気がする。

3.でもiPad2には戻れない。

店内にはiPad2も展示されていたので、比べてみた。こちらの方がスペック的には少し軽いはずなのだけど、その場では体感的には違いが分からなかった。一目で歴然とした違いが分かったのは、解像度の差だ。一度新型の画面を見てしまった後では、これからiPad2を買おうと言う気にはまずなれないと思う。少なくとも、100ドル引きになったぐらいではこの解像度の差には代えられない。

4.結論: 重さが半分になれば買います。

自分としては新しいiPadを買わない最大の理由は、結局は重さになる。

もし7インチで350グラム程度、かつこの素晴らしいディスプレイをもった「もっと新しいiPad」が登場したら、その時こそはアップルストアに並んででも買おうかなと思う。









.

2012年3月23日

Android SDKをRevision 17に更新したらエミュレータがサクサクに!

Android SDK ToolsがRevision 17にアップデートされたので早速更新した。今回は比較的大きな更新になっている様だ。
Android SDKアップデート、Windows/Macでエミュレータが高速に | マイナビニュース

Updated SDK Tools and ADT revision 17 | Android Developers Blog

特に興味を惹かれたのが、
WindowsおよびMac OS Xにおいてエミュレータが仮想モードでAndroidx86システムイメージをサポートし、Androidが高速に動作するようになった。
という部分。

早速ここに書かれている手順通りにやってみた。
Using the Android Emulator | Android Developers


ただし、Intel VTによる仮想化支援を使うには、次の制限があるとの事。
  • ARMベースではなくx86のシステムイメージを使ったエミュレータしか動かせない。
  • 仮想化された環境内では動かせない。
  • 同一PC上でIntel VTを使う他の仮想化ソフト(VMwareやVirtualBoxなど)と同時に動かす事は出来ない。
  • OpenGL ESを使うアプリのパフォーマンスは実機ほどは出ない。



まずは、「Android SDK Manager」でx86のシステムイメージをインストールする。
現時点では、APIレベル10(Android 2.3.3)用のものしか無いみたいだ。


次に、SDK Managerのリストの一番下の方にある「Extras」の中の「Intel Hardware Accelerated Execution Manager」を選択してこれもインストール。
インストール後、コマンドラインから
sc query intelhaxm
を実行して、
SERVICE_NAME: intelhaxm
       ...
       STATE              : 4  RUNNING
       ...
と表示されればOK。



インストール完了後、AVD作成ダイアログのターゲットに「Intel Atom x86 System Image」が追加された。これを選択してAVDを作成すると、エミュレータ実行時にIntel VTによる仮想化支援機能が使われて動作が速くなるという事らしい。



早速エミュレータを起動してみると...

お、確かにブラウザが一瞬で起動する様になっている。

サンプル「APIDemos」を動かしてみる。
従来のエミュレータだとかなりカクカクしていたOpenGL ESのデモも、上述の様に実機ほどのパフォーマンスは出ないと但し書きはあったものの、x86イメージのエミュレータだとかなりスムーズに動いている。

(上)従来のエミュレータ (約8.5FPS)
(下)x86システムイメージを使ったエミュレータ (約27FPS)



普段からエミュレータ上で開発をしている人にはかなり嬉しい改善になりそうだ!


と思ったのだけれど...、

ここまで書いてから、さてVirtualBoxでいつも使っている仮想マシンを起動しようとしたら、「仮想マシンを起動出来ません...云々」のエラーが出てしまった。。。

「なんださっきインストールしたIntelのHAXMとか言うサービスを止めればいいんでしょ。」と思ってコマンドラインから、
sc stop intelhaxm
を実行。サービスが止まっているのを確認してから再度VirtualBoxの起動を試みても、やっぱり同じエラーが出る。検索したらMacでもやはり同じ問題に遭遇している人が居た。
HAXM stops VirtualBox fro ... - Intel® Software Network
PCを再起動しても同じなので、結局あきらめて「Intel Hardware Accelerated Execution Manager」をアンインストールする事にした。

アンインストール後は無事VirtualBoxの仮想マシンが起動出来たので、このIntelのHAXMサービスが原因だった事は間違いないと思う。

という事で、VirtualBoxとの相性は良くないみたいだ。残念。:-(









.

2012年3月21日

小さな子を持つ親としてAndroidタブレットに欲しい機能

我が家の子供達にひらがなやカタカナの練習をさせたいと思って、たまに初代iPadを使わせている。

ただ、子供にタブレット端末を使わせる場合、何も設定しないと大きな問題がある事に最近気付いた。というのも、子供達がYoutubeの使い方を覚えて、放って置くと1時間でも2時間でもアニメ(主にアンパンマン)の動画ばかり見続けるという状態になったからだ。

これではだらだらとテレビやDVDを見ているのと変わらないから、きっと教育上よろしくない。

そういう時に便利なのが、iOSの「機能制限」の設定だ。ここでYoutubeの使用を制限する事が出来る。さすが Apple、よく出来ている。


それはそれでいいのだけれど、せっかくだから出来れば自作のアプリでひらがな・カタカナを練習させたいなあと思い始めていて、そうなると今からiOSの勉強は大変なのでやはり子供用にAndroidのタブレット端末を買おうかなという事になる。

そこで気になるのが、Youtubeの存在だ。

Android端末でYoutubeのアプリを使用不可にする事は出来るのだろうか。少なくとも手元のAndroidスマホでは出来なさそうだ。

なんらかの方法で仮にYoutubeアプリを使えなく出来たとしても、多分ブラウザからは見る事が出来てしまう。

今年の5月か6月頃に出ると噂されているGoogle製の7インチタブレットには、ぜひこういったかゆい所に手が届く機能をOS標準の機能として付けてもらいたい。
Google タブレットは7インチ、 ASUS 製、5月発売? - Engadget Japanese

本当に200ドル前後という低価格で販売されるのだったら、iPad1台分の値段で2台買ってもまだお釣りが来る! 期待してしまうだけに、こういう細かい点がどうなるのかなあ、と気になる。




.

2012年3月17日

良い習慣付けをサポートしてくれそうなAndroidアプリ達

この記事を読んだのがきっかけで「習慣付けをサポートしてくれるアプリ」が気になりだした。
日記が全然続かない僕がたどり着いた『4行日記』を習慣化する為に行った方法 | ライフハック | Yu_notes.
僕も日記を続けようと思っていてなかなか続かないので何か良い方法はないかなと思っていた所だったので、Androidでも「21日習慣づけ」と同様のアプリが多分あるだろうと思って探してみた。

選んだ基準は、

  1. 見た目がシンプルでデザインが良い事。
  2. 入力が簡単そうな事。
  3. カレンダー表示やグラフ表示が出来る事。

の3つ。

とりあえず次の7つをインストールして試し中。

Routinely


Success Log: Goal Tracker


Habit Streak


My Effectiveness Habits (beta)


Habitlog - Habit Builder


GoalTracker


MyChain


一週間ほど使ってみて、どれが最も気に入ったかまた書こうと思う。






.

2012年3月1日

ASP.NET MVC4 が面白い!

今、ASP.NET MVC 4 が面白い。まだBetaだけど、正式リリースが待ち遠しくなって来た。

ASP.NET MVC 4 Beta 関連ドキュメント

特に興味を引かれるのは、「Web API」と「Single Page Application (SPA)」だ。

Web APIについてはこの動画と次の説明を見ればほぼ概要がつかめる様になっている。
http://www.asp.net/web-api/videos

ASP.NET Web API を使ってみよう: MVC 4 新機能シリーズ - THE TRUTH IS OUT THERE


出来ればいつかはこういう解説が出来るぐらいには詳しくなりたいものだ。
ControllerとApiController - 無聊を託つ



SPAについてはこのサンプルをチェックして次の説明を読めばなんとなく分かった気になれる。
SPA Samples: The Official Microsoft ASP.NET Site

Single Page Application (SPA) を使ってみよう: MVC 4 新機能シリーズ - THE TRUTH IS OUT THERE

SPAの標準テンプレートではクライアント側のJavascriptライブラリとして「Knockout.js」と「Upshot.js」などが使われている模様。またまた憶える事が増えたなぁ。。。


早速実際に試してみた方の記事も非常に参考になる。
ASP.NET MVC 4 Beta で追加された Web API プロジェクトを試す - まめしば雑記
ASP.NET MVC 4 Beta で追加された Single Page Application を試す - まめしば雑記


現時点の感触としては、Web APIとSPAの組み合わせで、プラグイン無しでクライアントサイドで動く操作性の良いアプリケーションが作れて、かつValidationなどはサーバーサイドのロジック(というより宣言的な記述)としっかり同期させられて、とっても良い感じ! という印象だ。

早速何か作って色々試してみたい。



(こちらはMVC 3ベースのWeb APIの例。実際にDBからデータを取得する部分などはこちらも参考になりそうだ。)
WCF Web API, WCF Data Servicesとはまた違うREST APIライブラリ | OPC Diary










2012年2月16日

Sony Tablet Sを数時間触ってみた感想

仕事でたまたまAndroidタブレット用アプリの開発案件が入って来た。
ターゲットの端末は今の所「Sony Tablet S」の予定なので、試しに実機を触らせてもらった。

Googleアカウントは設定せずに単にOSの設定画面やプリインストールのアプリをいじっただけなのだけれど、数時間ほど触った現時点での感想を書いてみたい。

1.外観


背面がプラスチックっぽくて少しチープに見えるけれども、慣れれば違和感は無くなりそうだ。手に取った時の体感的な重さはiPadとほぼ同じか少し軽いぐらい。片側が厚くなっているので持ちやすいのは確か。

2.液晶画面 


見やすく綺麗だけど照明の具合によっては指紋が目立ってしまう。

3.UIの反応


動作は軽快で快適。特にブラウザの起動は速く感じる。

4.最大の問題


OS(Android 3.2)のフリーズが何回か発生した。普通に設定画面を操作しているだけなのに、下の画面の様に「システムUI」のエラーが出て、「強制終了」ボタンを押すしか無くなる事がある。

アプリではなくOSの設定画面で「システムのエラー」が出るとは。


最悪なのは、その後、画面左下に3つ並んでいるバックボタン、ホームボタン、タスク一覧ボタンが消えてしまい、全く何も操作が出来なくなる事だ。

こうなると結局電源ボタンを長押しして端末を再起動するしか無く、本当にストレスが溜まる。

ちなみに、「タブレット情報」の画面で確認すると、
Androidバージョン:3.2
カーネルバージョン: 2.6.36.3
ビルド番号: 1.10.001100001
だった。

Androidのバージョンが4になれば改善するのかも知れないが、ソニーがOS標準のUIにだいぶ手を加えている様なので、その辺りとの兼ね合いで本当に不具合が完全に無くなるのか疑問が残る。

正直、ハードメーカーには、OSのカスタマイズには手を出さずにひたすら丈夫で軽くてバッテリーの持ちが良いハードウェアを作る事に徹してくれた方が有り難いと思う。












2012年1月6日

Android SDKのサンプル「LunarLander」でエラーが出るので修正してみた

Android SDKに含まれている「LunarLandar」というサンプルを試していて、エラーが出る事があるのに気付いた。

Homeキーなどで他のアプリケーションに移ってから LunarLander に戻って来た時に「Thread is already started」というエラーになる。

surfaceDestroyed で破棄されたThreadに対して、surfaceCreated で再び start() を呼んでしまっている事が原因らしい。

それにしても、標準のサンプルがどうしてこんな状態で放置されているんだろう。。。

ターゲットのVersionを1.5, 2.2, 4.03に変えて試してみたけれどもどれも同じ。
同じくSurfaceViewを使っている「JetBoy」というサンプルも試して見た。これも同じだった。

検索しても日本語の情報はあまり見つからなかった。
SurfaceViewとThreadのonPause、onResumeの処理について - shumach217の日記

英語だといくつかもう少し詳しい説明が見つかった。
Fixing the Lunar Lander example: a threaded gameloop for Android at michi's log 

Android - How to pause/unpause thread in games | Robert Green's DIY

Android crash when app is closed and reopened - Stack Overflow


対策方法としては以下の3つの選択肢が考えられそうだ。

  1. surfaceCreated で thread.start() する前にスレッドが無効な状態ではないか確認する。無効な場合はスレッドを新規作成(new)してから start する。
  2. surfaceDestroyed でスレッドを終了させずに、フラグを用いて擬似的に一時停止状態にする。
  3. surfaceDestroyed でスレッドを終了させずに、 object.wait() を用いてスレッドを一時停止状態にする。

まず1の方法でLunarLanderのソースを修正して試して見た。

これだとエラーは出なくなったけれども、復帰後の画面が真っ暗なまま何も表示されない。おそらく他の変数の内容が復元されていない状態になってしまうからだと思うが、きちんと動くようにしようとすると結構面倒そうなので、あきらめた。

次に2の方法。
変更点は以下の通り。
  • LunarThreadクラスに変数 mInBackground を追加。
  • isInBackground() and setInBackground() メソッドを追加。
  • run() メソッドで、isInBackground() をチェックして true なら 100ms スリープする様に変更。
  • surfaceDestroyed() メソッドでスレッドを停止しない様に変更。
  • surfaceCreated() メソッドで isInBackground() をチェックして true ならスレッドを start() するのではなく setInBackground(false) を呼ぶ様に変更。
変更後のLunarViewクラスのソースはこちら。
Fixed LunarView class in Android SDK Sample LunarLander. — Gist

これで一応問題なくバッチリ動く様になった。^^

ただ、100msのスリープを入れて擬似的にスレッドを一時停止状態にしているだけ、というのが、ちょっと気になる。

どうせならJavaの標準として定義されているwait/notifyの仕組みを使った方が良さそうな気がする。多分その方がCPUリソースの消費が少なくなりそうな気がする。多分。。。

ということで3の方法も試して見た。

変更点は、 run() メソッドでスレッドを待機させる時に sleep() ではなく wait() を使う様にした点だ。

変更後のLunarViewのソースはこちら。
Fixed LunarView class in Android sample LunarLander, using object.wait() method. — Gist


実際に2と3でCPUリソースの消費に違いがあるのか、Eclipseのデバッグモードでスレッドの状態を確認して見た。



2の方法の場合、Statusの表示が「timed_wait」になった後、何もしなくても utime, stimeの値が少しずつ増えていく。やはり少しずつCPUリソースを消費している様だ。

それに対して3の方法だと Statusが「wait」になり、utime, stime の値はピタっと止まったまま増えない。

端末のバッテリーにも多分この方が優しいだろうと思う。

ということで、スレッドを待機状態にする場合は、object.wait() と notify()/notifyAll() メソッドを使う方が良いみたいだ。












2012年1月4日

ASP.NETのセキュリティパッチ適用でエラー「Operation is not valid...」が発生する場合の対処

年末にこの記事を読んで、早速WindowsのWebサーバーにパッチを適用しておいた。
ASP.NET Security Update Shipping Thursday, Dec 29th - ScottGu's Blog

対処されている脆弱性の詳細な説明はこちら。
徳丸浩の日記: Webアプリケーションに対する広範なDoS攻撃手法(hashdos)の影響と対策


ところが今日になってある業務アプリケーションで「エラーが起きる」との連絡があった。

エラーの内容は、


Operation is not valid due to the current state of the object
「The URL-encoded form data is not valid.」

というもの。

いろいろテストして見ると、どうやら年末に適用したセキュリティパッチが原因らしい。

ASP.NET MS11-100: how can I change the limit on the maximum number of posted form values? - Stack Overflow

An ASP.NET request that has lots of form keys, files, or JSON payload fails with an exception and returns a 500 HTTP status code

上のページに解決方法が書かれていたので、何とかエラーは解消した。

web.config の appSettings セクション内に次の設定を追加すれば良い。
    <!-- Post Backで処理可能な最大フィールド数(Defaultは1000) -->
    <add key="aspnet:MaxHttpCollectionKeys" value="5000"/>

設定する値が大きくなるほどPostBackで処理出来るフィールド数に余裕が出来る。

でも、増やしすぎるとセキュリティパッチの意味が無くなるのであまり良くないと思う。


そもそも1000以上ものフィールドをPostBackする様な画面を作るのがおかしい。

とは思うけれども、とりあえず以前動いていたものは動く様にしないと行けないので、当面はこれで回避するしかなさそうだ。

ちなみにエラーが起きたページは、GridViewの各行の中にCheckboxやDropdownが複数配置されていて、ボタンが押された時にグリッド内の全行に対して何らかの処理をするという作りになっていた。それで大体250行以上表示している場合に1000フィールドの制限に引っかかっていた模様。

もちろんページングして一度に表示される行数を少なくしておけば問題は起きないのだけれど、「1トランザクションで全データを対象に処理する」という要件があったためにあえてページングしない様になっていたらしい。

ASP.NETだと一つのFormタグの中に全部の画面要素が入るので、何も考えずに一昔前のVBの延長的な感覚で作ってしまうとすぐにこんな事になってしまう、という良くない例だ。

でも、クライアント・サーバー型システムから移植した様な業務アプリケーションでこういうケースって、実際には結構あるんだろうなあ。