ラベル プログラム の投稿を表示しています。 すべての投稿を表示
ラベル プログラム の投稿を表示しています。 すべての投稿を表示

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が便利?

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を利用しているので文字化けする可能性があります。
文字コードを指定してあげれば問題ないと思います。

2011年5月23日月曜日

Scalaでテキストファイルを出力(Windows)

Windowsで以下のように実行すると文字化けします

scala.io.Source.fromFile("test.txt").getLines.foreach{ println _ }

fromFileにはファイルのエンコードを渡せるので、

scala.io.Source.fromFile("test.txt", "UTF-8").getLines.foreach{ println _ }

としてあげればOK

サンプルコードは別記事にあります

2009年1月27日火曜日

ゲームプログラミングでMVC

今Pythonのpygameというライブラリを使ってゲームを作ってるんですがこれが中々難しい。
pygameを使うとC言語なんかでゲームを作るよりは遥かにプログラミングが楽になります。

ただ、常にループがガンガン回っているというのがWebプログラミングしかしたことのない自分には違和感があります。

やっとゲームプログラミングに慣れてきたので、ちょいとソースを奇麗にしてやろうと思っているんですが、ゲームプログラミング(ゲームに限らずスタンドアロンアプリ全般)のMVCはどう分離してやるべきですかね?

やっぱりゲームループがコントローラになるのかな?

もともとはスタンドアロンのGUIアプリのために考え出されたMVCなんですが、いざググってみるとWebアプリでのMVCサンプルばっかり・・・

まぁ、プログラムの本質なんてそんなに変わらないと思うので意識しなければ問題ない!・・・はず

2009年1月26日月曜日

Pythonのインスタンス変数

Pythonのインスタンス変数について調べていると亀鶴茄子さんという方のエントリーを発見しました。

亀鶴茄子: Pythonにおけるインスタンス変数の宣言

まだPython勉強中なので偉そうなことは言えないのですが、__init__内でインスタンス変数を宣言してしまうと、そのクラスを継承した子クラスを作ったときに、子クラスの__init__内で態々親クラスの__init__を呼び出してやらないと親クラスのインスタンス変数の宣言を継承できないと思うんですがどうなんでしょう?

そもそもPythonのインスタンス変数は__init__内でしか記述できないのかな・・・?
JavaやPHPみたいにメソッドの外側に変数宣言できれば良いのになぁ~

2009年1月9日金曜日

名前で性別を判断する方法は?

この概要は表示できません。投稿を閲覧するには ここをクリック してください。