タイトル/名前 | 更新者 | 更新日 |
---|---|---|
日記/2013/04/06/本日の調査メモ : Yoxos | msakamoto-sf | 2013-04-06 18:23:56 |
Groovy/Gradleで活用されているJavaライブラリ | msakamoto-sf | 2013-04-06 16:14:43 |
Groovy/Gradle | msakamoto-sf | 2013-04-06 16:13:59 |
日記/2013/03/31/本日の調査メモ2 : JavaのPager系ライブラリ, Mustache テンプレートエンジン補足リンク | msakamoto-sf | 2013-03-31 17:49:54 |
Groovy/Gradle/Customizing Jar or War filename | msakamoto-sf | 2013-03-31 17:18:16 |
日記/2013/03/31/本日の調査メモ : JSP系式言語(EL), OGNL, MVEL | msakamoto-sf | 2013-03-31 17:08:45 |
日記/2013/03/30/本日の調査メモその3 : CRaSHの紹介 | msakamoto-sf | 2013-03-30 23:18:14 |
日記/2013/03/30/本日の調査メモその2 : zencoding-vim, surround.vim, READ_EXTERNAL_STORAGE | msakamoto-sf | 2013-03-30 22:08:16 |
日記/2013/03/30/本日の調査メモ : ClickJacking, OAuth 1.0周り | msakamoto-sf | 2013-03-30 11:13:00 |
Groovy/続・お手軽Web開発 (GroovyServlet, Hogan.groovy, Gradle, Tomcat) | msakamoto-sf | 2013-03-24 22:14:15 |
予め、Eclipseのディストリビューション+お気に入りのプラグインをプロファイルとして作成しておきクラウド上に保存、好きなときにDLして展開できるらしい。
ちょっと試してみたが、プラグインとして追加できるのはYoxos側でリストアップしたもののみらしい。GGTS(Groovy/Grails Tool Suite)など、Yoxos側にリストアップされてないのは追加できない。マイナーなプラグインとかYoxos側でリストアップされてないプラグインを使うケースだと少し不便かも。後になって手動でEclipse MarketplaceなどからインストールしたものなどはYoxos側のprofileには反映されないみたい。
無料だとpublicなprofileしか作成できない。enterprise版でお金を払うと、closedで例えば特定のプロダクト開発チーム専用のprofileを登録して、Eclipse環境を統一、というようなことも可能らしい。enterprise版だとどこまでの機能が使えるのか、不明点が多そう。
理想的には、現在インストールしたPluginの一覧をベースにdropinsとかにexportしてくれて、で、またそれを新しいEclipse環境にごっそりimportしてくれるような機能があると嬉しいのだけれど・・・。
他、Eclipseにインストールしたプラグインのバックアップ関連の話題を適当にググったの:
正直、良くわからない・・・。
Gradle 1.4 - 1.5で使われているJavaライブラリの中から、「へ~、こんなのあったんだ~」というのを駆け足で紹介していきます。自分たちのJava開発でも活用出来そうです。(Gradleのlib/およびlib/pluginsの中からjarファイル名を頼りに調べたもので、具体的にGradleのどの機能で使われているかまでは調べてないです。)
Pythonのctypesのように、JNIよりもシームレスにネイティブライブラリ(.dll, .so)のコードを呼び出せるライブラリ。
予めよく使われるプラットフォーム依存のネイティブAPIを、Javaでラップしてくれるように調整済みのライブラリのようです。
SSH2のJava実装。
JavaによるCIFS/SMBプロトコル処理系
グラフ構造のオブジェクトを効率的に、素早くシリアライズするためのJavaライブラリ。
割りと他のプロダクトでも見かけたことがありますが、serializationやaop/mockライブラリなどで使われている、動的にJavaのインスタンスを生成する処理をサポートしてくれるライブラリのようです。コンテナフレームワークでも使われているようです。
Javaのリフレクション処理によるフィールド・メソッド・コンストラクタへのアクセスを、動的にコード生成することで高速化しているようです(何を言ってるのか自分も理解できてませんが・・・)。
JavaによるHTMLパーサ
DSLスタイルでXHTML/XMLを生成するツールキット
JavaでのXPath/XSLT処理のライブラリ。
これもJavaでのXPath処理ライブラリみたいです。dom4jと組み合わせても使えるみたいです。
Java実装のJSON処理系
Java実装のYAML処理系
JavaのBeanShellスクリプト言語の実装。
コマンドライン引数を処理するためのライブラリ。"-xx"とか"--yy=xxxxx"などを、アノテーションを活用してJavaBeanに自動マッピングしてくれる機能などがある。
ANSIエスケープシーケンスの出力をサポートしてくれるライブラリ。公式Webサイトのデモ画像を見れば分かる通り、エスケープシーケンスの出力による多彩なコンソール出力が可能になりそう。
OSGiフレームワークで、外部ライブラリの依存関係やインポート・エクスポートするパッケージなどをメタ情報で柔軟に設定するためのフレームワーク・・・っぽいです。多分。
依存jarを集約して、一本のjarにまとめ上げるためのライブラリ。fatjarとかその系列かも。
日本語で読まれた人もいると思いますが、"Java Concurrency in Practice"(邦題「Java並行処理プログラミング ―その「基盤」と「最新API」を究める―」)を略してJCIPと呼んでいるらしく、その書籍中で、メソッドやクラスにおけるマルチスレッドプログラミング上の特性をアノテーションで表現する例が載っています。それを実際に実装してみたライブラリのようです。
Java実装の超シンプル・効率的なロギングライブラリのようです。slf4jなど外部ログ仕様と連携するわけではなく、完全に独自インターフェイスでコンパクト・高速・効率化を目指したようです。
Gradle周りの参考メモ集
本家ドキュメント:
本サイト内:
参考サイト:
JavaのPager系ライブラリ:
一覧を作るときのPagination(Pager)ライブラリ、最近のJavaってどうなってるんだろうと調べてみました。JSPやJSTL, JSFに強く結び付けられてるのはスルーして、どちらかと言うと単に文字列で生成するだけとか、小回りがきいてJSPなどの仕様から距離を置いているライブラリを中心に漁った時のリンクメモです。DBのマッパー系との連携が必須なのもスルーしてます。
個人的にはPHP時代にPEARのPagerというのを多用していて、あれの、特定のFWやDBと結びつかず、単独での使い回しの良さが好きでしたので、似たようなのはJavaで無いかなと。
jQueryやExt4JSなど、JavaScriptでインターフェイスを組み立てたりする場合も多くなってきてますので、それを使ったケースも増えてるんでしょうか。PagerといってもPEARのPagerがまさにそうだったのですが、結局「全件数 + 現在OFFSET + 一度に表示する件数」が揃えば構築できるので、JavaScript側で処理させるという考え方もありですね。
Mustache テンプレートエンジン補足リンク:
Graldeにおけるjarファイル/warファイルのファイル名設定について
Jarファイル名について
デフォルトのJarファイル名の構成:
archiveName : [baseName]-[appendix]-[version]-[classifier].[extension] baseName : デフォルトは project.name version : デフォルトは project.version
Warファイル名について
デフォルトのWarファイル名の構成:
archiveName : [baseName]-[appendix]-[version]-[classifier].[extension]
基本的には [baseName]-[version].war ([appendix], [classifier]はデフォルトnull)
baseName : デフォルトは project.archivesBaseName version : デフォルトは project.version
ただし、特にJarについての上の記述はあくまでも一般的なアーカイブの動作みたい。
→JarもZipも、baseNameのデフォルトは project.archivesBaseName になってる。
実際に試してみると、以下の設定でjarもwarも"gsst-0.0.1-SNAPSHOT"で生成できます。
archivesBaseName = 'gsst' version = '0.0.1-SNAPSHOT'
調べてみると"project.name"をカスタマイズする方法(デフォルトはReadOnlyの模様?)も出てきたりするはするのですが、archivesBaseNameで特に問題はなさげです。
PHPだと foo.php?a[]=10&a[]=20... が $_GET['a'] で array(10, 20) として取り出せますし、
foo.php?a[k1]=10&a[k2]=20... が $_GET['a'] で array('k1' => 10, 'k2' => 20) として取り出せます。
Servletで同等の事出来ないかなと思って調べてみたのですが、どうしてもStrutsやSpringなど、一定規模のフレームワークを導入した上で、Beanなどのクラスにマッピングするなどの手間をかけないと出来ない?っぽい?です。
リクエストパラメータに限ったことではなくて、JSPとかの一種のテンプレートエンジンでもよくあるニーズとして「動的にプロパティ参照やメソッド呼び出しを実行したい」というのがあって、割りとメジャーどころがライブラリを揃えてくれてます。文字列で表現された式(Expression)を動的に評価する一種のミニプログラミング言語(Language)なので、「式言語(Expression Language)」として、JSP周辺技術を調べているとよく目にします。
今回はMVELをGroovyで試してみました。
@Grapes([ @Grab('org.mvel:mvel2:2.1.4.Final') ]) import org.mvel2.PropertyAccessor def data = [ 'k1' : 'abc', 'k2' : 10, 'k3' : [10, 20, 30], 'k4' : [ 'k4_1' : 'def', 'k4_2' : 200, 'k4_3' : ['ABC', 'DEF', 'GHI'], ], 'k5' : 'xyz', 'k6' : [ ['id' : 1, 'name' : 'bob', 'age' : 10, 'hobby' : ['cooking'] ], ['id' : 2, 'name' : 'jon', 'age' : 20, 'hobby' : ['cooking', 'sports'] ], ['id' : 3, 'name' : 'eve', 'age' : 30, 'hobby' : ['programming'] ], ], ] assert 'abc' == PropertyAccessor.get('k1', data) assert 10 == PropertyAccessor.get('k2', data) assert [10, 20, 30] == PropertyAccessor.get('k3', data) assert 10 == PropertyAccessor.get('k3[0]', data) assert 20 == PropertyAccessor.get('k3[1]', data) assert 30 == PropertyAccessor.get('k3[2]', data) try { def r = PropertyAccessor.get('k3[3]', data) assert 'failed' == '' } catch (StringIndexOutOfBoundsException e) { /* expected */ } assert 'def' == PropertyAccessor.get('k4.k4_1', data) assert 200 == PropertyAccessor.get('k4.k4_2', data) assert ['ABC', 'DEF', 'GHI'] == PropertyAccessor.get('k4.k4_3', data) assert 'DEF' == PropertyAccessor.get('k4.k4_3[1]', data) assert 'bob' == PropertyAccessor.get('k6[0].name', data) assert 'jon' == PropertyAccessor.get('k6[1].name', data) assert 'eve' == PropertyAccessor.get('k6[2].name', data) assert ['cooking', 'sports'] == PropertyAccessor.get('k6[1].hobby', data)
こんな感じで、参照についてはかなり直感的に記述できます。
では肝心の、値の設定についてはどうかというと・・・
@Grapes([ @Grab('org.mvel:mvel2:2.1.4.Final') ]) import org.mvel2.PropertyAccessor def data = [:] PropertyAccessor.set(data, 'k1', 'abc')
→
Caught: [Error: could not access/write property (k1) in: Foo] [Near : {... k1 ....}] ^ [Line: 1, Column: 3] [Error: could not access/write property (k1) in: Foo] [Near : {... k1 ....}] ^ [Line: 1, Column: 3] at org.mvel2.PropertyAccessor.set(PropertyAccessor.java:374) at org.mvel2.PropertyAccessor.set(PropertyAccessor.java:135) at org.mvel2.PropertyAccessor$set.call(Unknown Source) ...
となってしまい、プロパティが無いのでassignが出来ずエラーになってしまいました・・・。
他、実際にStrutsでリクエストパラメータのマッピングに使われているOGNLも有力候補に考えてはいたのですが、"Object-Graph"とあるくらい、やっぱりBean構造と表裏一体で使われるものっぽいですね。なんというか、何が来るか分からないごった煮を乱暴にListやMapに変換する用途には全く向いてなさそうだなぁという感じでした。
「何が来るかわからないごった煮を乱暴にListやMapに変換する」手法は、どちらかというとJSONのパース処理系が近いことしてるんですよね。そうか、リクエストパラメータを一個のJSONパラメータとしてやりとりすれば良いのか・・・ってそんな乱暴な・・・とも言えないか。アリか?でも受け付ける側は楽ですが、HTMLのformとか生成する側が手間になりそうですね。Formのsubmitでもフォーム要素をJSONにまとめる必要が出てくるので、JavaScript必須ですね。
ただ、今日一日このテーマで午前中から「あーでもないこーでもない、このライブラリはどうだ?あのライブラリはどうだ?」と漁ってるんですが、じゃぁ実際、自分がPHPでオレオレフレームワーク作った時に、PHPが自動で処理してくれる連想配列の値をそのままビジネスロジックに渡したかというとそんなこたーないんですわ。必ずビジネスロジックにとって受け入れやすい形式に変換してから渡します。これは入力値チェックがどうのこうのという話ではなく、単純にURLクエリやPOSTパラメータって究極的には文字列なので、ビジネスロジックにまるごと渡すわけには行かず、やっぱり変換のために1レイヤー挟んだほうが圧倒的に構造が理解しやすいしプログラミングも安全になるわけです。もし入力値チェックやビジネスロジック側に渡すときの表現形式が変わっても、変更箇所を限定しやすくなります。そういう観点ではStrutsがOGNL使ってBeanに変換するのもその一環であって、Strutsの世界観に限定すれば全く何の異論もありません。
・・・なので、仮に、PHPライクな連想配列に変換するレイヤーを一枚挟んだとしても、結局、もう一枚ビジネスロジック向けの表現にvalidationと合わせて変換してあげるレイヤーが必要になってくることは確実です。それだったら、もうPHPライクな変換レイヤーなんか放り捨てた方が良いかなと。んなマイナーな中間レイヤー入れても、利用者が混乱するだけですし。
そんな感じで、この調査メモはクローズです。丸一日潰して何やってんだ感はありますが、まぁELとかOGNLの動向を復習できたのでそれはそれでいっか。
Twitterで見かけたのですが、JVMのモニタリング・・・というかJMX + 便利コマンド各種をSSHとかTelnet経由で使えるようにlistenしてくれる面白いツールがありました。
ソースコードはGitHubで、リリースファイルのダウンロードはGoogleCode使ってるようです。
公式の"Demo"からWeb上で試せるんですが、スレッドの一覧とか、スレッドにinterrupt送れたりと、スレッドが固まってしまった場合にインタラクティブに制御出来ます。実運用環境で利用できる代物かどうかは未知数ですが、アイデアとしては非常に面白いです。VisualVMのPluginとしても利用できるようです。Groovyでカスタムコマンドを作成出来るというのも面白そうですね。
今日は crash-1.2.0-war.tar.gz をDLして、Win上のTomcat6にデプロイしてみました。
tarボールを解凍すると crash.war が出てきますので、Tomcat6の /webapps/ 以下に配置してTomcatを起動します。
こんな感じで配備ログが出て来ました。
情報: Webアプリケーションディレクトリ crash を配備します 3 30, 2013 10:55:15 午後 org.crsh.plugin.PluginLifeCycle configureProperty 情報: Configuring property vfs.refresh_period=1 from properties ... 3 30, 2013 10:55:15 午後 org.crsh.plugin.PluginLifeCycle configureProperty 情報: Configuring property ssh.port=2000 from properties ... 3 30, 2013 10:55:15 午後 org.crsh.ssh.SSHPlugin init 情報: Booting SSHD .... 3 30, 2013 10:55:15 午後 org.crsh.ssh.term.SSHLifeCycle doInit 情報: About to start CRaSSHD 3 30, 2013 10:55:16 午後 org.crsh.ssh.term.SSHLifeCycle doInit 情報: CRaSSHD started on port 2000 ...
どうやらポート2000でSSHで接続できるようです。TomcatのJVMにSSHで接続できるなんて、新鮮ですね。
ログインするときのユーザ名とパスワードですが、warが展開されたあとの "/WEB-INF/crash/crash.properties" ファイルで指定します。1.2.0-warでのデフォルトは以下のようになっていて、"admin"ユーザ、パスワード"admin"でログインできます。
crash/WEB-INF/crash/crash.properties:
# SSH configuration crash.ssh.port=2000 #crash.ssh.keypath=/path/to/the/key/file # Telnet configuration crash.telnet.port=5000 # Authentication configuration crash.auth=simple crash.auth.simple.username=admin crash.auth.simple.password=admin
実際にSSHクライアントを起動し、接続してみます。
[user@LB-L400B-120908 ~]$ ssh -p 2000 admin@localhost admin@localhost's password: ______ .~ ~. |`````````, .'. ..'''' | | | |'''|''''' .''```. .'' |_________| | | `. .' `. ..' | | `.______.' | `. .' `. ....'' | | 1.2.0 Follow and support the project on http://www.crashub.org Welcome to LB-L400B-120908 + ! It is Sat Mar 30 22:55:23 JST 2013 now %
"help"と入力するとコマンドのヘルプが見れます。
% help Try one of these commands with the -h or --help switch: NAME DESCRIPTION dashboard env display the term env filter A filter for a stream of map help provides basic help java various java language commands jdbc JDBC connection jmx Java Management Extensions jndi Java Naming and Directory Interface jpa Java persistance API jvm JVM informations log logging commands man format and display the on-line manual pages shell shell related command sleep sleep for some time sort Sort a map system vm system properties commands thread JVM thread commands
各コマンドでも"-h"や"help"でコマンドごとのヘルプを表示できます。
% thread help usage: thread[-h | --help] COMMAND [ARGS] The most commonly used thread commands are: interrupt interrupt vm threads stop stop vm threads top thread top ls list the vm threads dump dump vm threads produce produces threads for pipe
"thread top"とかすると、TOPで3秒間隔くらいで更新されました。Ctrl-Cで戻れるとか、これがJavaで動いているのかとびっくりします。"thread dump"の使い方がちょっと分からない・・・。
Groovy読める人は、"/WEB-INF/crash/commands/base" の下に各コマンドのGroovyソースコードが置いてあるので、それ読むと良いかもしれません。
あと便利なことに、CRaSHのコマンドラインってTAB補完が効くんですよね。上下カーソルでコマンド履歴もアクセスできます。
まるでGNU readlineのようなのですが、依存ライブラリをチラ見したら "jline" とかいうjarが入ってました。
やっぱりreadlineみたいな機能をJavaで実現するためのライブラリのようですが、これもまた面白そうですね。
以上、CRaSHの紹介でした。
しばらくぶりにHTMLをvimで書きそうなので、最近はどんな感じか調べてみました。
surround.vim
zencoding-vim
zencoding-vimの便利さに鼻血吹くかと。
他、
経由で
JellyBeanになって色々セキュリティ面でも強化されてるので気になります。
ClickJacking関連:後半は流し読みレベル。
OAuthのConsumerKey/ConsumerSecretの扱いについて:
OAuth 1.0aベース:
Application-only authentication : OAuth 2.0, Client Credentials Grant を実装
xAuthに関連して、OAuthでは3-leggedと2-leggedと呼ばれる二種類がある。
今現在ホットなConsumerKey/ConsumerSecretのモバイルやデスクトップアプリケーションでの取り扱い周り
TwitterのConsumerKeyガー、ConsumerSecretガー、と騒動になった件の、顛末らしきまとめ。
単純にConsumerKey/Secretが漏洩しただけでは危険とは断定できなくて、ServiceProvider側のcallbackの取り扱いであるとか、認可画面のClickJacking対策とかが絡みあって結果として脆弱な状態になってたみたいです。下手に状況を説明するとどこかで間違ってる可能性があるので詳しくは上のmalaさんとかritouさんのGist読む。
Twitterの件が関連してたのかどうか分かりませんが、ClickJackingの話もタイムリーにIPAから出て来ましたので、これを機会に色々と復習します。
GroovyServlet + Hogan.groovyでお手軽Web開発が出来るように、超簡単なMVC紛いのWebフレームワークっぽい作りが出来るように調整した、Gradleプロジェクトのテンプレートを作ってみました。
https://github.com/msakamoto-sf/groovyservlet-sample-template
demoサンプルを幾つか作ってありますので、それを見て適当に弄って、貴方好みのオレオレフレームワークに仕立ててください。