2011年7月21日木曜日

スマートフォンのこれからの進化予想(ver1)

今後どういった形でスマートフォンが進化していくか考えてみました。
個人的には、スマートフォンと呼ばれている所謂携帯電話は、間違いなくPCを置き換えていくことになると思っています。
家の外では現在と同じような使い方で、家に帰った時にはドックのような物にセットすれば、現在PCで使っているようなサイズのディスプレイとキーボード、マウスが使えるようになるのではと。

キーボードに関しては既にBluetoothのものがあるし、ディスプレイに関してもAndroidであればHDMI経由でディスプレイに出力できる端末もあります。
CPU、メモリの性能が鍵になると思いますが、こちらに関しても今後ドンドン性能が上がっていくでしょう。
データの保存先はクラウド側にすればいいのであまり問題にはならないと思います。

個人情報に関して。
GoogleであったりFacebook、TwitterのIDを使って外部サイトの認証が出きるサイト、サービスが増えています。
現状ではどのサービスが1番!という決め手がないので、各々が好きなサービスに登録して、サービスの提供側もメジャーなAPIは網羅するという形です。
今後はスマートフォンが個人情報のマスターになり、クラウド側は、プライマリのスマートフォンから許可を貰って個人情報を取得、そして個人情報のバックアップ側(スレーブ)になるのではないでしょうか。

以上、妄想していることはザックバランにまとめてみました。
個人的には当たらずとも遠からずあと思っています。
具体例や、こうすれば良いといったネタが思いついたらまた書きます。

2011年7月20日水曜日

Scalaでx桁の文字列を出力

ドキュメントとか書くときに、「ここにはx桁の文字列を記述してください」的な事をよく書きます。
サンプルデータとか特にそうですね。

例えば、md5の値は32文字なので、よくサンプルとして、


// md5には32文字の文字列が入ります。
String md5 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

と書きます。
32文字なんだから、サンプルも32文字書かないといけないのですが、数えながら書くのが面倒・・・
ということでScalaで32文字の文字列(今回はx)を出力する式を書いてみました。
REPLで実行すると以下の通りです。

scala> (for(i <- 1 to 32) yield {"x"}) mkString
res18: String = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

これでx...の部分をコピーすればOK

Scala、というよりREPLが便利?

今更Googleリーダー

今日から使い始めてみましたが、良いですね。
今まではiGoogleをRSSリーダー代わりにしてきましたが、Googleリーダーの方が多機能だし見やすいですね。
ただ調子に乗っていっぱい登録した挙句結局見るのがしんどくなりそうで怖い・・・

2011年7月16日土曜日

PlayFrameworkチュートリアルでcoberturaのエラー

最近、週末はPlayFrameworkの勉強をしています。
非公式のようですが、マニュアルが日本語化されているのでスムーズに勉強できます。
http://playdocja.appspot.com/

チュートリアルが逸脱で、今まで様々な環境のチュートリアルを見てきましたが、PlayFrameworkのチュートリアルは群を抜いて分かりやすいです。(といっても一回読んだだけで全てを理解するのは難しいですが)

基本的に書いてあるとおりに勉強していけば問題ないのですが、最後の方のテストの完了で躓いたので備忘録としてまとめます。

ページ下部の方に、コードカバレッジ計測、という項目がありますが、公式も含めてここに書かれている通りにしてもエラーが発生します。
説明どおりにapplication.confを修正してEclipseからPlayをテストモードで起動しても、Play終了時にcoberturaはコードカバレッジレポートを生成してくれません。
何故かというとPlay本体にはcoberturaは含まれていないからです。

以下、PlayをEclipseから起動した際のコンソールビューの内容です。
---------------------------------------------
Listening for transport dt_socket at address: 8000
00:09:42,662 INFO ~ Starting /home/dev-user/work/play_projects/yabe
00:09:42,666 WARN ~ Declaring modules in application.conf is deprecated. Use dependencies.yml instead (module.crud)
00:09:42,667 INFO ~ Module crud is available (/home/dev-user/local/play-1.2.1/modules/crud)
00:09:42,667 WARN ~ Declaring modules in application.conf is deprecated. Use dependencies.yml instead (module.secure)
00:09:42,667 INFO ~ Module secure is available (/home/dev-user/local/play-1.2.1/modules/secure)
00:09:42,667 WARN ~ Declaring modules in application.conf is deprecated. Use dependencies.yml instead (module.cobertura)
00:09:42,668 ERROR ~ Module cobertura will not be loaded because /home/dev-user/local/play-1.2.1/modules/cobertura does not exist
00:09:43,380 WARN ~ Actually play.tmp is set to null. Set it to play.tmp=none
00:09:43,391 WARN ~ You're running Play! in DEV mode
---------------------------------------------

なので、coberturaをインストールしなければなりません。
インストールにはplay installコマンドを使います。
プロジェクトディレクトリに移動したら「play install cobertura」を実行します。これだけでインストール完了です。
続けて「play test」を実行してからhttp://localhost:9000/@testsにアクセスして、テストを実行してからコンソールでctrl-cでPlayサーバを停止すると、正常にcoberturaがコードカバレッジレポートを生成してくれます。

ただし、Eclipseを使っている場合はこれだけではエラーになってしまいます。
通常、クラスパスを変更するような修正を行った場合、プロジェクトディレクトリで再度eclipsifyコマンドを実行する必要がありますが、今回はそれを実行してもEclipseからテストモードでPlayを起動してアクセスするとエラーが表示されてしまいました。



EclipseのコンソールビューはJavaのエラーが延々と
--------------------------------------------
Listening for transport dt_socket at address: 8000
20:43:48,811 INFO ~ Starting /home/dev-user/work/play_projects/yabe
20:43:48,816 WARN ~ Declaring modules in application.conf is deprecated. Use dependencies.yml instead (module.crud)
20:43:48,817 INFO ~ Module crud is available (/home/dev-user/local/play-1.2.1/modules/crud)
20:43:48,817 WARN ~ Declaring modules in application.conf is deprecated. Use dependencies.yml instead (module.secure)
20:43:48,817 INFO ~ Module secure is available (/home/dev-user/local/play-1.2.1/modules/secure)
20:43:48,817 WARN ~ Declaring modules in application.conf is deprecated. Use dependencies.yml instead (module.cobertura)
20:43:48,817 INFO ~ Module cobertura is available (/home/dev-user/local/play-1.2.1/modules/cobertura-2.1)
20:43:49,465 WARN ~ You're running Play! in DEV mode
~
~ Go to http://localhost:9000/@tests to run the tests
~
20:43:49,578 INFO ~ Listening for HTTP on port 9000 (Waiting a first request to start) ...
20:44:07,139 ERROR ~

@67578a30n
Internal Server Error (500) for request GET /@tests

Compilation error (In {module:cobertura-2.1}/app/controllers/Cobertura.java around line 6)
The file {module:cobertura-2.1}/app/controllers/Cobertura.java could not be compiled. Error raised is : play.modules.cobertura.CoberturaPlugin cannot be resolved

play.exceptions.CompilationException: play.modules.cobertura.CoberturaPlugin cannot be resolved
at play.classloading.ApplicationCompiler$2.acceptResult(ApplicationCompiler.java:246)
at org.eclipse.jdt.internal.compiler.Compiler.handleInternalException(Compiler.java:672)
at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:516)
at play.classloading.ApplicationCompiler.compile(ApplicationCompiler.java:278)
at play.classloading.ApplicationClasses$ApplicationClass.compile(ApplicationClasses.java:249)
at play.classloading.ApplicationClassloader.loadApplicationClass(ApplicationClassloader.java:150)
at play.classloading.ApplicationClassloader.loadClass(ApplicationClassloader.java:84)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at play.classloading.ApplicationClasses.getAssignableClasses(ApplicationClasses.java:61)
at play.classloading.ApplicationClassloader.getAssignableClasses(ApplicationClassloader.java:435)
at {module:crud}/app/views/tags/crud/types.tag.(line:3)
at play.templates.GroovyTemplate.internalRender(GroovyTemplate.java:213)
at play.templates.GroovyTemplate$ExecutableTemplate.invokeTag(GroovyTemplate.java:347)
at {module:crud}/conf/routes.(line:4)
at play.templates.GroovyTemplate.internalRender(GroovyTemplate.java:213)
at play.templates.Template.render(Template.java:26)
at play.mvc.Router.parse(Router.java:162)
at play.mvc.Router.parse(Router.java:190)
at play.mvc.Router.parse(Router.java:164)
at play.mvc.Router.load(Router.java:50)
at play.mvc.Router.detectChanges(Router.java:219)
at Invocation.HTTP Request(Play!)
20:44:07,561 ERROR ~

@67578a30o
Internal Server Error (500) for request GET /favicon.ico

Compilation error (In {module:cobertura-2.1}/app/controllers/Cobertura.java around line 6)
The file {module:cobertura-2.1}/app/controllers/Cobertura.java could not be compiled. Error raised is : play.modules.cobertura.CoberturaPlugin cannot be resolved

play.exceptions.CompilationException: play.modules.cobertura.CoberturaPlugin cannot be resolved
at play.classloading.ApplicationCompiler$2.acceptResult(ApplicationCompiler.java:246)
at org.eclipse.jdt.internal.compiler.Compiler.handleInternalException(Compiler.java:672)
at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:516)
at play.classloading.ApplicationCompiler.compile(ApplicationCompiler.java:278)
at play.classloading.ApplicationClasses$ApplicationClass.compile(ApplicationClasses.java:249)
at play.classloading.ApplicationClassloader.loadApplicationClass(ApplicationClassloader.java:150)
at play.classloading.ApplicationClassloader.loadClass(ApplicationClassloader.java:84)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at play.classloading.ApplicationClasses.getAssignableClasses(ApplicationClasses.java:61)
at play.classloading.ApplicationClassloader.getAssignableClasses(ApplicationClassloader.java:435)
at {module:crud}/app/views/tags/crud/types.tag.(line:3)
at play.templates.GroovyTemplate.internalRender(GroovyTemplate.java:213)
at play.templates.GroovyTemplate$ExecutableTemplate.invokeTag(GroovyTemplate.java:347)
at {module:crud}/conf/routes.(line:4)
at play.templates.GroovyTemplate.internalRender(GroovyTemplate.java:213)
at play.templates.Template.render(Template.java:26)
at play.mvc.Router.parse(Router.java:162)
at play.mvc.Router.parse(Router.java:190)
at play.mvc.Router.parse(Router.java:164)
at play.mvc.Router.load(Router.java:50)
at play.mvc.Router.detectChanges(Router.java:219)
at Invocation.HTTP Request(Play!)
---------------------------------------------------

EclipseからPlayを起動する際のクラスパスの設定が異なっているためで、eclipsifyではcoberturaを追加してくれない様です。

そこで、Eclipseの実行構成から、eclipsifyで自動的に生成されているサーバに、coberturaのjarファイルを手動で追加してあげる必要があります。







ユーザエントリーを選択して、外部Jar追加を選択後、cobertura/lib/*.jarを選択して追加してください。
それが終わった後にEclipseからPlayサーバをテストモードで起動すれば、問題なくcoberturaが動作します。

2011年7月13日水曜日

Javaで外部サイトのHTMLを取得する

PHPのfile_get_contents()は外部サイトのHTMLを取得できます。
さらに、クエリストリングを付与してなんちゃってサーバ間通信までできてしまいます。
Javaでもそんなの欲しいな~ということで作ってみました。

Windows7のコマンドプロンプトから実行して、EUC-JPのサイトのHTMLを取得、表示で問題なく動作しています。
ただ、文字コードを自動判別することろにJISAutoDetectを利用しているので文字化けする可能性があります。
文字コードを指定してあげれば問題ないと思います。