2008年 5月 14日 水曜日 |
ねこび〜ん特集 English Translation: (Yahoo!) / (Google) 片貝さんのブログでこの間のSun Business .Nextの資料を案内されていますが、見事にねこびーん特集になっていますね。こちらも負けずにねこびーん特集です。
デスクトップにねこび〜ん。
これは宗形さんが作成されたねこび〜んです。手のりサイズ。すばらしい! そして初公開アイテム。
ねこび〜んシルバーアクセサリー。
しっぽもかわいいです。
なかよし。
どの角度からみてもほれぼれします。
大きさはこれぐらい。 HudsonをMacのデスクトップに English Translation: (Yahoo!) / (Google) 継続的インテグレーションツールでDuke's Choice Awardにも選ばれたHudsonを久しぶりに使っています。使い方は川口さんによる特集記事が技術評論社のページで読めますので、そちらを参考にしていただくこととして、今回はHudsonにちょっと工夫のお話です。
最近、原稿を書くのに8年ぶりにpLaTeXを使っています。といっても、原稿自体は普通のプレーンテキストなんですが、図表の確認のためにpLaTeXを使ってプレビューしています。プレーンテキストをRubyのスクリプトでTeXのソースにして、TeXでコンパイルして、dvipdfmxでPDFにするという作業。まあ、シェルスクリプトにしてあるので、それらの呼び出しが面倒くさいということもないのですが、原稿のバージョン管理をRCSからSubversionにすることにしたので、ついでにこれらのコンパイルもHudson化してやろうとの魂胆です。 さて、HudsonからはSubversionの更新をポーリングしてもらってシェルスクリプトを起動してもらうだけの設定ですから、とても簡単なんですが、コンパイルが自動化されたことによってターミナルを開く必要がなくなりました。そうすると、わざわざHudsonを起動するがためにターミナルを開くのもおっくうだ、という思考になぜかたどり着きMac用の単独アプリとしてラッピングすることにしました。Mac OS Xには開発ツール(Xcode)を入れると、/Developer/Applications/Java Tools/Jar Bundler.appというJarをラッピングしてMacアプリとしてパッケージングしてくれるツールがありますのでそれを使います。
その前にアイコンを作ります。hudson.warを展開するとimages/hudson.xcfというGIMP用のイメージファイルが出てきますので、オーバーレイレイヤを取り除いて、あとは背景を透明にしたpngファイルなんかを適当に作ります。次に、Mac用のアイコンを作るのですが、同じく開発ツール(Xcode)に/Developer/Applications/Utilities/Icon Composer.appというのがついてきます。これに画像ファイルをドラッグ&ドロップしてやればアイコンが出来上がります。アイコンの使われ方でいくつかサイズが違うのがありますのでそれぞれに同じ画像をドラッグ&ドロップ。48x48、32x32、16x16の所は元画像に透明属性があれば自動的にマスクを作ってくれます。
次にJar Bundlerでパッケージングします。Jar Bundlerはhudson.warをそのままではjarファイルだと認識してくれないので、hudson.warをhudson.jarに改名しておいてクラスパスに入れてやります。 ![]() あとはメインのクラス「Main」を設定したり、作ったアイコンを選択したりしてCreate Applicationとやればオッケーです。
できました。
Dockに入ったHudson。起動してみるといつものようにアイコンがぴょんぴょんはねながら起動してくれます。ところが、起動が完了しても起動中を示す三角マークが出ません orz ログをみる限り、起動しているし、8080ポートにつなぐと正常に稼働しています。
どうやら応答がないと判断されてしまったようです。GUIをたてないとだめなのかなあ。まあ、個人的に実用上困らないのでこのままでいいような気も・・・。強制終了をするときちんとハンドラが動いて、HTTPサーバが停止しているのがコンソールのログで確認できます。 ということで、デスクトップにHudsonさんをおいてみましたが、ちょっと微妙な感じで終わりました。ちゃんと三角マークがでたりするように暇ができたら改造してみます。 プロジェクトFuji、すごそうですよこれは。 English Translation: (Yahoo!) / (Google) mediacast.sun.comをうろうろしていたら、Project Fujiのスクリーンキャストを発見しました。まだざっとしか見てませんが、どうやらProject Fujiは結構クールな感じですね。
デモのシナリオです。(1) CNNのRSSを、インスタントメッセージングの標準プロトコルXMPPを使って配信、(2) もう少し進んで、JRubyを使ってRSSをフィルタリング、(3) 配信先をXMPPだけではなくてファイルにもアーカイブとして配信。といったシンプルな内容です。
これがIFL(Integration Flow Language)という記述言語でぱぱっとかけてしまうようです。JBIが出た当時(2005年)に、いろいろXMLを書きまくったあげくにようやく動いたのがこれか〜、とため息をついたのとは大違いです。ずいぶん簡単、シンプル。しかもスクリーンキャストを見る限りすでにこのIFLはNetBeansが構文サポートしているようです(左下のNavigatorペインや、右のエディタで構文ハイライトされています)。プロジェクト自体はMavenで管理されていて、Mavenからアプリケーションの構築から実行まで全部できるようです。ESBのようにやたらと依存関係が複雑になりそうなアプリケーションだとずいぶん楽になりそうですね。NetBeans 6.1のMavenサポートはよくできているそうですし、ちょっとしたことならMavenを意識すること無く開発ができるようになるのかも。 Open ESB v3とプロジェクトFuji、GlassFish ESB English Translation: (Yahoo!) / (Google)
JavaOne 2008および、プレイベントであるCommunity Oneもまだ始まっていませんが、フライングしているのか、もともとスケジュール通りなのかよくわかりませんが(笑)、なんだかいろいろと情報が出てきています。Open ESBはそろそろv2がリリース間近だったので、JavaOne/CommunityOneではてっきりv2の正式リリースが大きな節目だろうとおもっていましたが、ここにきてv3のアナウンスです。 さて、微妙にここでいくつか新出単語が出てきますので、キーワードまとめておきましょう。
Open ESBページのアナウンスより。 With Open ESB v2 core runtime winding down in terms of functionality, Open ESB team is proud to announce to v3 effort. Version 3 of Open ESB leverages OSGi and JBI to come up with a powerful service oriented integration platform that's agile and modular platform. The core framework for Open ESB v3 is implemented at Project Fuji. Check it out at http://fuji.dev.java.net. Open ESB v3 will be supporting various application server containers, like GlassFish, JBoss, WebSphere, WebLogic, etc, but also runs standalone on Java SE. In the Java SE case, all you need is an OSGi container like Apache Felix. Open ESB v3 on GlassFish is offered as GlassFishESB (http://GlassFishESB.org) which offers powerful integration with GlassFish v3 technology leveraging its modular implementation.また、Open ESB v3はGlassFish以外のアプリケーションにも組み込んで使えるようにするようで、JBossやWebSphere、Weblogicでも動作し、さらにはスタンドアロンのJava SE (+ OSGi)でも動作するようにするつもりのようです。つまり、Open ESB v3がリリースされると、GlassFish上でもOpen ESB v3が使えるし、JBossやWeblogic上でもOpen ESBが使えるようになります。そして特に、GlassFish上で使う場合にはGlassFish ESBを使うことになるのでしょう(おそらく管理機能などがGlassFishと連携するなどして強化されると思う)。今のところはこれ以上のことはわかりませんが、たぶん、ここ2〜3日のうちにどんどん情報が出てくることでしょう。(それにしてもなぜプロジェクト名がFujiになったのかが気になりますねぇ) 追記:Open ESBのWikiに載っていました。この書き方が一番わかりやすいですね。 Open ESB v3 = Project Fuji + Project Open JBI Components もうすぐJavaOne 2008ですね English Translation: (Yahoo!) / (Google) 太平洋時間5月6日より、サンフランシスコでJava系最大のイベントJavaOne 2008が始まります。今年はいろいろと都合が付かず現地では参加できないのですが、ストリーミング配信などもあるようなので遠隔で参加してみることにします。今年参加できないのは残念でならないのですが、同時にすこしほっとしています。なにせJavaOneは朝8時ごろから始まり、最後のBOFは夜11時頃まであるし、その上、行くからにはブログを書いたり、ハンズオンラボのお手伝いをしたりと休む暇がありません。
JavaOne 2006の時は本場のJavaOne初参加ということもありはりきって行ったのですが、ブログも初日、二日目ぐらいまでしか書けず・・。JavaOne 2007では、少し要領も得たのでセッションの合間にブログを書いたりしていましたが、さすがにハンズオンラボのお手伝い 2時間 x 4コマは堪えました。今年は現地にも行かないので速報的なネタを書くよりも、少しネタをしぼって何か紹介したいところです。 MavenのISO-8859-1化を阻止しよう、祭 English Translation: (Yahoo!) / (Google) 詳細はnekopさんのブログをご覧ください。MavenがISO-8859-1オンリーな感じになってしまいそうな状況(+1 on (b))を阻止すべく、みんなでWikiに(+1 on (a))を支持するぜ!って書き込みましょう。というキャンペーンというか祭りです。
Mavenファンな方、とにかく祭りが好きな方は詳細はnekopさんのページにやり方が書いていますのでご参照の上投票を! 絶望した!Mavenの開発者に絶望した! English Translation: (Yahoo!) / (Google) [java][maven] これだから世の中にはiso-8859-1しかないと思ってる奴らは..(川口耕介の日記)より。
とりあえずリンクはって置きます。 Without default value for source encoding, platform encoding is used, which is bad for build reproducibility. Then setting a default value consistently across every Maven plugin will improve build reproducibility. Proposed default value: ISO-8859-1, which must be supported by every JVM (see java.nio.Charset) and is already the default value for some plugins (the majority of plugins use platform encoding as a default value instead). Note: Using a fixed default value for the encoding instead of the platform encoding can potentially break builds that rely on a platform encoding other than the proposed Latin-1 but did not lock this down in the POM. It is assumed that those builds: ホットトピックセミナー 2008年4月号のストリーミング配信 English Translation: (Yahoo!) / (Google) 昨日行われました毎月恒例のJava Hot Topicセミナー4月号を収録したストリーミング配信のご案内です。資料はまた準備ができ次第Javaエバンジェリストブログにて公開させていただきます。
初心者のための実践 JRuby on Rails 講座 〜 RSS リーダを GlassFish で動かそう 〜野澤 智(のざわ とも)Javaパズラーズ大渕 雅子(おおふち まさこ)/片貝 正紀(かたかい まさき)その1 その2 Sun のオープンソース 暮らしの手帖 - OpenSSO 編岩片 靖(いわかた やすし)Sun Java CAPSの次のリリース English Translation: (Yahoo!) / (Google) すでに輪崎さんがブログで書かれていますが、SunのSOA基盤ソフトウエア製品であるSun Java CAPSの次のリリースであるRelease 6の最新情報をつかむべく先週は中国のシンセン(深圳)に行ってきました。シンセン旅行記については、まだ写真のアップロードが完了していないのでまた別途書きますが、とりあえず最新情報としてトレーニングの本題であるSun Java CAPSについてお伝えしておこうと思います。
Sun Java CAPSは2005年にSeeBeyond社を買収し、SeeBeyond社の持っていた主力SOA製品であるICANスイートをSunのJavaを基本とするテクノロジーをもとに洗練したソフトウエア製品群です。ICANスイートの時代からEAI/ESBの基盤であったeGateは日本でもかなりご利用いただいており、ミッションクリティカルな環境でもばりばり動作しています。そんなSunの次の手はオープンスタンダードへの準拠です。Current AnalysisのSOAスイートの評価でSun Java CAPSが一番たかく評価をいただいているのも標準準拠が高く評価されているからです。 Sun Java CAPS Release 6からは従来のSeeBeyond ICAN Suiteで培った技術、資産を活かしつつ、新たな基盤としてOpen ESBを選択しました。Open ESBはJavaのESB標準であるJava Business Integration (JSR 208、略称JBI)に準拠した実装です。Open ESBはもうそろそろバージョン2.0が正式リリースされるようなタイミングですが、Open ESB 2.0のリリースをベースにSun Java CAPS R6がリリースされます。 さて、Sun Java CAPS Release 6ではOpen ESB以外にも先進的なオープンソースの成果を取り入れています。それはご存知NetBeans 6です。SeeBeyondの時代から実は開発環境はNetBeansベースだったんですが、わりとNetBeansプラットホームからプラグインに至るまで結構なカスタマイズが入った、NetBeansをベースとした別物の開発環境でした。それが今回のリリースではNetBeans 6を基盤として、それに比較的プラグインのような形でNetBeansに開発環境として取り入れられているので、たとえばNetBeansのSOA機能、新しくなったエディタ、Java EEサポート、あるいはCVS/Subversionなどのバージョン管理機能といった使い勝手がそのまま統合されています。 つまりイメージとしてはこんな感じです。
ねこび〜ん by カネウチカズコ licensed under Creative Commons 2.1 By-SA JP。 NetBeansとJava CAPSの統合例。Java CAPSという名前でいつも思い描いていたのが帽子。ねこび〜んのかわいさにあわせるならこの新学期シーズン、黄色の帽子しかありません。 読みたい記事リストから English Translation: (Yahoo!) / (Google)
先週はDirectory Masters Eventのためにフランス/グルノーブルに行っていましたが、今週は別のイベントのために中国の深圳(シンセン)にいます。深圳は香港の隣の都市で、香港空港からバスで1時間ほどです。途中で香港当局のチェックと、中国当局による入国チェックの2回のチェックがあります。隣に乗っていたおじさんが親切に教えてくれたため、なぜバスをいきなりおりなければならないのか?のような疑問なく通過することができました。一方、フランスからスイスに抜けたときは国境をまたぐ道路のゲートでも、ジュネーブ空港の出国審査でさえもパスポートを見せること無く顔パスで通過。この24時間でずいぶん空気の違いを感じました。 さて、それはさておきフランス滞在中はインターネットアクセス事情があまり良くありませんでした。泊まっていたホテルにはWifiがあったのですが、2分使えて、その後15分は使えない。というような状況がずっと続き、写真のアップロードどころかメールのチェックすらまともにできませんでした。グルノーブルのオフィスではもちろんインターネットも使えましたが、イベント中のためメールチェック程度しか時間が取れませんでした。こうなってくると困るのがRSSの購読残の増加です。個人的にはRSSリーダとしてグーグルさんのGoogle Readerを使っているのですが、その統計によれば一日だいたい200エントリ程度を購読しているようです。 さて、Google Readerには個人的に気に入っている機能としてスターをつける、という機能があります。キーボードショートカットの「s」で記事に対して星をつけることができ、またスターをつけることができるエントリ数に制限が無い、極めつけにスターをつけた記事のRSSを公開できる。というところがとても気に入っています。おそらく、このスターは人によって使い方が若干違うと思いますが、個人的には「後で読みたい記事リスト」として機能しています。 さて、この中で興味深かったのがJames Goslingが取り上げていた川口さんの「Deep dive into assembly code from Java」という記事です(川口さんのブログも購読しているのにGoslingのブログで気がついたのもどうかと思いますが・・・)。JavaのHotSpot VMがどのように最適化をしているかを説明しています。これも後で読もうと思っていたんですが、同じく川口さんの記事で「I resurrected my Japanese blog」を見て、川口さんの日本語ブログがあるのを知りました。しかもそこにはなんと、読もうと思っていたDeep dive into assembly code from Javaの日本語版があるではないですか。これは早速読まねば、と思い先ほどから読み進めていました。 アセンブラもずいぶん触っていないので最初この記事を見たときも、SPARCのアセンブラなのか、x86のアセンブラなのか一瞬迷った、というお粗末ぶりですが、個人的にアセンブラできちんとプログラムを書いたのはz80とせいぜい80286アセンブラまでで、80386以降はまるでやっていませんでした。80386の知識と言えば、レジスタの名前が32bitならEAX、EBX、.. etcになるとか32bitと16bitの切り替えは66h(?)だったようなとか、大して実用的な物はありません。コンパイラの最適化処理、とかも、高校時代にがんばってバイトして買ったBorland C++ 4.0/Turbo Assemblerで、おお〜教科書通り。見たいな確認しかしていませんでした。最近のエスケープアナリシスとか、ロック粗粒度化あたりは理屈としてどういう物かは、知っている物のアセンブラのコードとしてどうなってるのか、ということまで気にしたことがありませんでした。 今回の川口さんの記事のおかげでJava VMが具体的にどういう最適化処理をやっているのか、ということがわかったことだけでなく、久々にほこりをかぶったアセンブラの知識をよみがえらせてみようと思うきっかけにもなりました。EM64T命令セットも具体的にどんな感じなのかイメージがつかめて参考になりました。読みたい記事リストにはまだまだこういうすばらしい記事が埋もれてるかもしれません。 Sun Javaエバンジェリストに新メンバー English Translation: (Yahoo!) / (Google) 書くのを忘れていましたが、鈴木さんが先日Javaエバンジェリスト・グループに参加されました。パチパチパチ!
ブログではまだまだ勉強中と謙遜されていますが、Sun Java CAPSを中心としたネタでばりばり活躍していただけると思います。岡崎はすっかり技術ネタよりカメラネタしかブログに書かなくなったので、そろそろおこられると思います。 ホットトピックセミナー 2008年3月号のストリーミング配信 English Translation: (Yahoo!) / (Google) 今週水曜日に行われました恒例のJavaホットトピックセミナー3月号を収録したストリーミング配信のご案内です。資料の文字は見づらいですが、PDFの資料が過去セミナー資料(16) : ホットトピックセミナー 2008年3月号に既にアップロードされておりますのでそちらをご覧ください。
Sun のオープンソース暮らしの手帖 - OpenDS 編塩田 智則(しおだ とものり)Java SE 6 Update N荻布 真也(おぎの しんや)Java Puzzlers荻布 真也(おぎの しんや) / 大渕雅子 (おおふち まさこ)(前半) (後半) JavaOne 2008−勝手に大予想大渕雅子 (おおふち まさこ)デキるエンジニアのための Java トレーニング/認定資格活用法原 剛 (はら たけし)ところで前回までのストリーミング配信ではMacBookビルトインのマイクを使っていたため、時々タイプ音が入っていたりしていましたが、今回はWebcam側にも実はマイクがついているのに気づいて、そちらに切り替えています。なので音質はずいぶんあがっているはずです (^^; Wicket English Translation: (Yahoo!) / (Google) 最近日本のユーザ会もできて、勢いのあるフレームワークWicketですが、昔のメモを読み返していたら、このフレームワークを知ったのはどうやら2005年6月30日のことだったようです。うーん、まったく記憶なし。メモによれば「要チェック!」と書かれているのでとりあえずブックマーク代わりにURLをメモしていただけのようです(その頃はWicketはApacheではなく、sourceforge上でのプロジェクトだったようですね)。
JDK/JREセキュリティアップデート English Translation: (Yahoo!) / (Google) Security Blogより。3月4日(日本時間だとたぶん5日)にセキュリティの問題を修正した各バージョンがリリースされるそうです。
JRubyでJMX English Translation: (Yahoo!) / (Google) ずいぶん前の話ですが、IdMセミナーより: Identity ManagerをJMXで監視するというエントリでJMXによるアプリケーションサーバ監視をJRubyからやる。というのをご紹介しました。そのときに、JRuby開発者Thomas Eneboにこんなモジュールを作ってもらいました。ずっと前から紹介しようと思っていたのに、今頃気づきました・・・。すいません・・・。
include Java
import javax.management.DynamicMBean
import javax.management.MBeanInfo
import javax.management.ObjectName
import javax.management.remote.JMXServiceURL
import javax.management.remote.JMXConnectorServerFactory
module JMX
class MBeanServerConnector
def initialize(location, server)
@url = JMXServiceURL.new location
@server = JMXConnectorServerFactory.newJMXConnectorServer @url, nil, server.server
if block_given?
start; yield; stop
end
end
def active?; @server.isActive; end
def start; @server.start; end
def stop; @server.stop if active?; end
end
# Represents both MBeanServer and MBeanServerConnection
class MBeanServer
import javax.management.remote.JMXConnectorFactory
import javax.management.MBeanServerFactory
import javax.management.Attribute
attr_accessor :server
@@classes = {}
def initialize(location=nil, username=nil, password=nil)
if (location)
url = JMXServiceURL.new location
if (username)
credentials = java.lang.String[2].new
credentials[0], credentials[1] = username, password
env = {"jmx.remote.credentials" => credentials}
else
env = nil
end
@server =JMXConnectorFactory.connect(url, env).getMBeanServerConnection
else
@server = MBeanServerFactory.createMBeanServer
end
end
def get_mbean(object_name)
name = ObjectName.new object_name
raise NoSuchBeanError.new("No name: #{object_name}") unless @server.isRegistered(name)
@server.getObjectInstance name
generate_proxy(name)
end
def create_mbean(class_name, object_name)
name = ObjectName.new object_name
@server.createMBean class_name, name, nil, nil
generate_proxy(name)
end
def default_domain; @server.getDefaultDomain; end
def domains; @server.domains; end
def mbean_count; @server.getMBeanCount; end
def query_names(name=nil, query=nil)
name = ObjectName.new name
@server.queryNames(name, query)
end
def register_mbean(object, object_name)
name = ObjectName.new object_name
@server.registerMBean(object, name)
generate_proxy(name)
end
def generate_proxy(object_name)
info = @server.getMBeanInfo object_name
class_name = info.className
return @@classes[class_name].new if @@classes[class_name]
# Make local so closure capturage.
server = @server
proxy = Class.new
# Attributes are supported using aref/aset syntax
proxy.class_eval do
define_method(:[]) do |name|
server.getAttribute object_name, name
end
define_method(:[]=) do |name, value|
server.setAttribute object_name, Attribute.new(attr.name, value)
end
end
# Operations get method names (collision potential)
info.operations.each do |op| proxy.class_eval do
define_method(op.name) do |*args|
args_array = JMX::MBeanServer.args_array(args)
signature_array = JMX::MBeanServer.signature_array(args_array)
server.invoke object_name, op.name, args_array, signature_array
end
end
end
# Add notification listener methods
proxy.class_eval do
define_method(:add_notification_listener) do |listener,*rest|
filter, handback = *rest
server.addNotificationListener object_name, listener, filter, handback
end
define_method(:remove_notification_listener) do |listener|
server.removeNotificationListener object_name, listener
end
define_method(:method_missing) do |method_name, *args|
args_array = JMX::MBeanServer.args_array(args)
signature_array = JMX::MBeanServer.signature_array(args_array)
server.invoke object_name, method_name.to_s, args_array, signature_array
end
end
@@classes[info.className] = proxy
proxy.new
end
class << self
def args_array(params)
return nil if params.nil?
array = java.lang.String[params.length].new
params.each_with_index { |parm, i| array[i] = parm }
array
end
def signature_array(params)
return nil if params.nil?
array = java.lang.String[params.length].new
params.each_with_index do |parm, i| array[i] = Java.ruby_to_java(parm).java_class.name
end
array
end
end
end
class NoSuchBeanError < RuntimeError
end
end
class RubyDynamicMBean import DynamicMBean
def initialize(name, description)
@info = MBeanInfo.new name, description, nil, nil, nil, nil
@name, @description = name, description
end
def getAttribute(attribute); $stderr.puts "getAttribute"; end
def getAttributes(attributes); $stderr.puts "getAttributes"; end
def getMBeanInfo; $stderr.puts "getMBeanInfo"; @info; end
def invoke(actionName, params=nil, signature=nil); send(actionName, *params)
end
def setAttribute(attribute); $stderr.puts "setAttribute"; end
def setAttributes(attributes); $stderr.puts "setAttributes"; end
def to_s; "#@name: #@description"; end
def inspect; "#@name: #@description"; end
def toString; "#@name: #@description"; end
end
これを使うと、JRubyからJMXを使うときにこんな感じでプログラムを書けます。
require 'jmx'
username = "admin"
password = "adminadmin"
url = "service:jmx:rmi:///jndi/rmi://localhost:8686/jmxrmi"
server = JMX::MBeanServer.new url, username, password
listener = server.get_mbean "com.sun.appserv:name=server,type=virtual-server,category=monitor,server=server"
puts "Server started at: #{Time.new(listener["hosts-starttime"])}"
こんな感じで、ほんの数行。JMXの手続きとかは知らなくても大丈夫。
|
Today's Page Hits: 3461 |