JavaOne 2014 現地レポート

月曜日から本格的に JavaOne のセッションが始まりました。JavaOne 参加者は約 500 程あるテクニカル・セッションから、事前に興味のあるセッションを選んで受講していくわけですが、全て受講すると 朝 8:30 〜夜 9:45 まで非常にハードなスケジュールになります。特に人気のあるセッションは、満員で入れなくなるセッションもあったりします。例えば Java EE のスペック・リードである Linda Demichel が Java EE 8 に含まれる予定のテクノロジーの概要を紹介したセッションは予想通りの満員セッションでした。


私は Java EE 関連のセッションを受講する事がおおく、基本的には Parc 55 にいるため、ヒルトンホテルで行われている Java SE, JavaFX, Java Embedded にご興味のある方々とは、なかなかお会いできません。

しかし、ヒルトン・ホテル側には、展示会場や、グッズ販売のお店、Duke’s Cafe 等があるので、時間の合間をみて訪れるようにしています。

グッズ・販売コーナでは、Duke 人形や Java ロゴの入った洋服、書籍販売等が行われています。


また、展示会場では実際のエンジニアに詳しく各製品技術に関して聞く事ができる場所なので、色々な製品を見たり、また説明員の方やエンジニアと交流を持って頂くのもよいかと思います。CloudBees のブースで Jenkins の作者で同社 CTO の川口耕介さんとお会いしたので久しぶりにご挨拶をしました。






今年は、日本から NTT さんが HeapStats という Java VM のトラブル解析ツールを展示会場で展示されていましたのでご挨拶もかねて伺いました。

また、JavaOne はセッション受講ももちろん重要ですが、Java のエンジニアやキーマンと直接交流を持ち親交を深める事もとても重要です。
今年、JCP が誕生して 15 周年の記念の年ですが、JavaOne 開催期間中に JCP 15 周年パーティが開催されていました。JavaOne 開催直前に JCP に正式参加された楽天の方と共に JCP パーティにも参加してきました。JCP の Party では最も優れた JSR や、最も優れたスペック・リード達が表彰されたり、Adopt a JSR の参加で素晴らしかった JUG 等も表彰されていました。





左側から一緒に参加した
Arshal Ameenさん(楽天)
Patrick Curranさん(JCP PMO の議長)
Donald Smithさん(Java SE Product Manager)
岩崎 浩文さん(楽天)

パーティだけではなくもちろん展示会場にもスペック・リードやエンジニア、キーマンは常にいますので、展示会場に足を運びそうした方々と直接話しをするのもとても楽しいと思います。こうした交流がまさに JavaOne の醍醐味です。参加者の皆様にはここでしかできない事を是非色々と体験して頂ければ幸いです。

今日は3日目です、夜には Oracle Appreciation Event が開催され、エアロスミスやその他複数のアーティストによるコンサートも行われます。今年も日本からの参加者の皆様とご一緒に参加する予定です。参加者サンフランシスコの夜はとても寒いのでコートを着てお越しください。

2014年10月2日 at 12:05 午前

JavaOne 2014 基調講演レポート

Java の将来にとって Java コミュニティは重要
(※ 文言、内容等修正をする可能性があります。)

●「Java とコミュニティ」
2014 年 9 月 28 日、JavaOne San Francisco 2014 ストラテジー・キーノートを皮切りにはじまりました。

今年の JavaOne は昨年よりも来場者が増加し、モスコーンセンターに世界中から非常に多くの Java 開発者が集まりました。基調講演を取りまとめたのは昨年に引き続き Java Product Management Vice President の  Peter Utzschneider で今年の JavaOne のテーマ “CREATE THE FUTURE” (未来を創る) を発表しました。

Peter は冒頭で、JavaOne は開発者による開発者のためのイベントとして位置づけ、このイベントは、Java コミュニティからのフィードバックを受けて、昨年以上により良いイベントにするために様々な趣向を取り入れ実際に実現していると説明しました。

例えば、社外の方々も含むコンテンツ選定委員の絶え間ない努力のおかげで、500 以上のセッションを選定しラインナップしています。

また今や JavaOne には必要不可欠となった毎年恒例のイベントとなった Geek Bike Ride も JavaOne 開催に先駆け、土曜日に開催されました。この Geek Bike Ride は世界中の開発者とよりよい交流を持つ事ができる貴重なイベントですので、今年参加できなかった方も是非来年に参加してくださいと Peter 自らが話をしていました。また、展示会場においても様々なイベントやショーケース、参加型のイベントなども用意している事を紹介しました。


さらに、今年のテーマは“CREATE THE FUTURE” (未来を創る) ですが、まさに将来を担うのは子供であり、今の子供達が将来 Java の開発者になるため、子供達に対するプログラミング教育の重要性を説き、JavaOne に先駆け子供向けのイベントを開催しました。元々は Devoxx というヨーロッパに存在する Java コミュニティが立ち上げた自らの子供達に Java を教えるイベントでしたが、その取り組みが世界的に評価され今や世界各国で Devoxx4kids というイベントが開催されています。JavaOne 前日に開催された Devoxx4Kids に実際に参加された子供達が壇上に招かれ、実際にイベントで取り組んだ内容を紹介しました。


また、Peter は Java の将来を創っていく上で欠かせないのは Java コミュニティの力で、Java の開発者に Java のコミュニティに参加する事の重要性を紹介し、実際に行われてきたコミュニティの活発な活動例や創造性、情熱などを紹介しました。一つ目はドイツの例でドイツに存在する 22 の JUG が共同でイベントを開催し2日間のイベントを成功におさまた事や、ロンドンの Java コミュニティでは Java SE 8 のLambda 式を勉強するための新しいツールを作成中で、もうすぐリリースされる事を紹介した他、Java のユーザ・グループとしてはロンドン、ブラジルに続き3つめとなりますが、モロッコの Java コミュニティがJCP のメンバーに参加した事も発表しました。

また、JCP に関連した内容として JCP は今年で生誕 15 周年を迎える記念の年で、Java の継続的な成長と成功のために標準化が重要である事、そして継続して技術革新をおこなうために開発者自らが標準化に対する積極的の重要性を伝えました。JCP の生誕 15 周年を祝うイベントも JavaOne 期間中に開催することも述べました。

今、世界規模で驚くほど Java のコミュニティが新規に立ち上げられており、昨年の
JavaOne から1年間で 80 以上のコミュニティが作られていることを紹介しました。
Peter はオラクルにとって Java コミュニティはとても重要で、コミュニティに対する投資は継続し、開発者との交流を大切にし、コミュニティを通じて次の Java を作りたい、Java の開発者と新たな関係を構築したいと語りました。

●「Java SE の現状と今後」
Peter は引き続き Java SE を紹介するために、Java Platform Development の
Vice President である Georges Saab を壇上に招きました。

Java SE 8 は世界中のコミュニティから長い間期待されていた機能が含まれており、
正式リリース後、様々なメディアで取り上げられ、統合開発環境もいち早く
対応し素晴らしい反応を得ている事を紹介しました。また中でもリリース以降
すでに、8 カ国語で 80 以上の Java 8 に関連した書籍が出版されている事をあげ、
OpenJDK や JCP における透明性の開発の結果、いち早く情報が得られる事、
そしてコミュニティ・メンバーの多大なる努力のおかげと伝えました。

Java SE 8 は近代的なプログラミング手法(関数型プログラミングやコレクションに対する一括処理など)を取り入れ、それ以外にも JavaFX, JavaScript エンジン、サブセットを提供するプロファイル等も取り入れたため、かつてない程の Java に対する変更が加わっているものである事を紹介しました。

また、パフォーマンスに関しても様々な箇所で大幅に改善しているため、Java SE 7 に比べ 40 % のパフォーマンス改善が見込まれ、運用面においても大きな利点が得られる点を言及しました。さらに、Java にとってセキュリティは非常に需要であるため、継続的に四半期に一度セキュリティのアップデートを提供することを紹介した他、

また、エンタープライズ領域で Java を使用する場合に、 Mission Control,
Advanced Management Console といった機能、さらにはサポート契約に
ついても紹介しました。

最後に、今後のロードマップとして Java SE 8 のアップデート予定、さらには
次期 Java SE 9 のリリース計画についても紹介し、Java SE 8 の利用を
呼びかけ、Java SE 9 もアーリ・アクセス版を試してフィードバックを提供して
欲しいこと伝え壇上をさりました。

●「Java Embedded の適用領域の拡大」

Java Embedded 1年間の急速な普及

ー 1年間で 50万ダウンロード
ー 20 以上のデバイスへのポーティング
ー 業界全体でのコラボレーション
ー オンライン学習サイトへ 83カ国 2400 以上の登録

Peter は引き続き、Java Embedded 関連の紹介を始めました。Embedded の領域で Java ME の CDC は Java SE のコンパクト・プロファイルに置き換えられ、組み込みの分野においても標準の Java SE の API の殆どが共通的に使えるようになっておりツール等も共通で使える事を紹介しました。そして Java SE との差分はデバイスに対するアクセスのような限定的な物となっていることを紹介し、今では Java の開発者は、組み込みのデバイスからデスクトップ、さらにはサーバ・サイドのアプリケーション開発まで同じ文法で同じライブラリを使用することができるようになっており同じ Java のスキルで開発者の幅が広がっている点について紹介しました。
Java SE Embedded 8 では Compact Profile で Mission Control, Flight Recorder 等が利用できる点を紹介し 8 月にリリースした Java SE Embedded Update 6 ではパフォーマンス改善などもおこなっている点を紹介しました。

また、新しく Java Embedded に関する新しいプロダクトのリリースも発表しました。

Java ME Embedded 8.1 EA リリース
基調講演であらたに、Java ME Embedded 8.1 のアーリ・アクセスをリリースした事を発表しました。
Oracle Java ME Embedded 8.1 Early Access Downloads

これは、ARM Cortex M3/M4 マイクロコントローラや、mbed を含む Freescale FRDM k64 ボードのサポートなどが含まれます。

Java とモバイルに置けるイノベーション
ー Oracle Mobile Application Framework
ー Java Card
ー RoboVM
ー Java for Trusted Execution Environment

Java はモバイル分野でも大幅な進歩をしていますが、Oracle の Mobile Application Framework はクロス・プラットフォーム・アプリケーションの開発が可能になっています。

Peter は IoT Device のアーキテクトである Jasper Potts と Richard Bair を壇上に招き入れ、Java Embedded で作成した車の制御アプリケーションのデモを行いました。これは車を模したボードで、車のペダルを踏むと速度表示パネルに速度がリアルタイムで表示され、タッチデバイスに表示される地図に位置情報を示し、地図をタッチしてを操作したりできるようになっています。さらには温度の測定、光度の測定など、各種センサーからの情報をリアルタイムに取得し、それらの情報をもとに車を制御したり、クラウド上にデータを送信したりする事ができるようになっています。
サーバ・サイドは Java EE 7 のアプリケーション・サーバを使用し、車とサーバ間は WebSocket の通信を行っています。これら全てが Java で実装されており、次世代の車でできる一部を参加者はみることができました。


●「活気のある Java EE」

続いて、Peter は Cloud Application Foundation の Senior Vice President である
Cameron Purdy を会場に招き入れ、Java EE の説明を Cameron に譲りました。

Java EE 6 に準拠するアプリケーション・サーバは 20 超え、Java EE 7 準拠のサーバも各社が積極的に対応をすすめています。また、Java コミュニティからも Adopt-A-JSR プログラムを通じて将来の Java EE の為に、積極的な貢献を頂いています。さらに開発環境においても著名な統合開発環境におけるJava EE 7 のサポートを提供し開発生産性が大幅向上する他、高品質なアプリケーションを作成するために、Hudson, Maven, Arquillian 等を使用する事ができます。

また、GlassFish に関しても商用サポートの打ち切りは行いましたが、Java EE の参照実装の基礎として GlassFish に対しては継続して投資を行っています。

また、最近次のバージョンである Java EE 8 に関する JSR が JSR-366 として JCP に登録され、最初の投票が行われましたが、Java EE 8 に関する投票は満場一致で承認されました。
Java EE 8 に含まれる機能は、世界中の Java EE の開発にアンケートを実施し、必要とする機能に関してフィードバックを頂いた後に検討した結果を踏まえた内容となっています。

Java EE 8 に含まれる機能例
ー JSON Binding
ー Java Message Service 2.1
ー Servlet 4.0
ー Model View Controller
など

Java EE 8 の議論はまだ始まったばかりですが、Java EE 8 は 2016 年の秋リリースの予定で現在進行しています。
最後に Cameron は Java コミュニティの参加社に Adopt-A-JSR というJavaコミュニティが将来の Java を創るために貢献できるプロジェクトをご紹介し参加を呼びかけました。

●「Duke Choice Award & Java EE コミュニティ・パーティ」
基調講演と同日「Duke Choice Award」の授賞式や、Java EE コミュニティの
パーティ等がありました。Duke Choice Award は今年で 13 年目という事もあり
13組の受賞者が発表されています。また、授賞式の後は、世界中の Java EE のコミュニティメンバーがあつまるパーティもあり、多くの日本人が海外のエンジニア達と交流をもっていました。

[Duke Choice Award]





[Java EE Community Party]


●「まとめ」
今年の JavaOne 基調講演では、最新の Java 情報に精通する開発者にとっては既知の内容が多く含まれていましたが、それは JCP の改革によるものです。Java の開発は現在全てオープンな場でディスカッションが行われ、プロセスを進めています。その為事前に得られる情報が多くなっているのも事実です。
一方で、この Java の透明性によって、開発者はいち早く事前に情報を収集する事が可能なため、今のような製品がリリースされた直後から大量の書籍や情報を入手できるようになっています。
JavaOne には1週間で 500 以上のセッションが存在し、Java に関する様々な情報を入手できます。また、Java の仕様を決める方や世界のエキスパートと直接意見交換ができる貴重な場ですので、そういった国際交流を持つ事も JavaOne の一つの楽しみ方かと思います。

Let’s Enjoy JavaOne !!

PS.
最後に、Peter が話をしていましたが来年の JavaOne は Java 生誕 20 周年の記念の年となります。来年の JavaOne はさらに色々な趣向をこらした内容を用意する予定ですので、来年もぜひご参加ください!!と申しておりました。

2014年9月30日 at 8:01 午後

javac コマンドの-source, -target オプションのルール変更について


Java SE 5 以前の Java のソース・コードを Java SE 7, Java SE 8 の環境でご利用頂いている皆様に、今後の JDK における仕様変更(予定)のご案内をさしあげます。

※ この情報は 2013 年 4 月 14 日に開発者 (Joseph D. Darcy) からアナウンスされた情報です(ご参照:Changing Sources and Moving Targets: Evolving the javac command line )。また、JEP(JDK Enhancement Proposal) 182 としてリストされている内容です。

今まで、javac のコンパイラ・オプションで “-source”, “-target” オプションを使用し、過去のバージョンで作成した Java のコードを現在の target で指定した Java の実行環境上で動作させる事ができました。

例えば、下記の簡単な AWT で実装したコードをご覧ください。ここでは、Frame の親クラスである Window クラスの Windows#show() メソッドが Java SE 5 で deprecated になっています。

import java.awt.Frame;

public class Test{
    public static void main(String argv[]){
        Frame frame = new Frame();
        frame.setSize(300 , 150);
        frame.show();
    }
}

上記のコードを、JDK 5 以降のバージョンでコンパイルすると下記のワーニングが出力されます。

ここでは、JDK 7 でコンパイルした例を示します。

> javac Test.java
注意:Test.javaは非推奨のAPIを使用またはオーバーライドしています。
注意:詳細は、-Xlint:deprecationオプションを指定して再コンパイルしてください

> javac -Xlint:deprecation Test.java
Test.java:8: 警告: [deprecation] Windowのshow()は非推奨になりました
frame.show();
^
警告1個

この J2SE 1.4 で実装されたコードを Java SE 7 の環境で動作させるためには、コンパイル・オプションに下記の “source”, “target” を指定する(bootclasspathは 1.4.2 の rt.jar を指定)事で Java SE 7 の環境で実行させる事ができました。

> javac -bootclasspath /tmp/rt.jar -source 1.4 -target 1.7 Test.java

今回、JEP 182 で提案された内容は、上記の ”source”, “target” で指定できるバージョンについてのルール変更です。

まず、Java SE 8 で Java SE 5 以前のバージョンが指定された場合に、「deprecated (非推奨) 」であるワーニングメッセージを出力するように変更されています。実際に、Java SE 8 の環境で ”source” に 1.4 を指定した場合の例を下記に示します。下記のように、Java SE 8 からワーニング・メッセージが出力されるようになっています。

> javac -bootclasspath /tmp/rt.jar -source 1.4 -target 1.8 Test.java
警告: [options] ソース値1.4は廃止されていて、今後のリリースで削除される予定です

警告: [options] 廃止されたオプションについての警告を表示しないようにするには、-Xlint:オプションを使用します。
警告2個

そして、Java SE 9 では Java SE 5 以降 以前のオプションを完全に削除するという内容になっております、もっと正確に申し上げるならば、今後の Java のリリースにおいて1プラス3バックのルールが採用されるようになります。

● Java SE 9 リリース時に指定可能な値: 9/1.9, 8/1.8, 7/1.7, 6/1.6
● Java SE 10 リリース時に指定可能な値: 10/1.10 9/1.9, 8/1.8, 7/1.7

この変更を行う理由ですが、Java の 1.0 のリリース以降、クラス・フォーマットは非常に多くのバージョン・アップを重ねており、Java コンパイラのメンテナンス・コストが非常に高まっています。このメンテナンス・コストを軽減するための措置として変更が考えられています。どうぞご理解の程宜しくお願いします。

日本においても、上記の仕様変更によって影響のある環境も少なからずあるかと想定します。現時点でも、Java SE 5 以前のコードを Java SE 8 以降の環境で動作させる事は非推奨となっております。また、Java SE 9 では上記を実現する事もできなくなります。仮に Java SE 5 以前のコードが存在する場合には、お早めに、deprecated なクラスやメソッドを取り除き、Java SE 7, 8 等の最新の環境で正常に動作するように移行をご検討いただければ誠に幸いです。

2014年7月2日 at 12:55 午後 1件のコメント

JavaOne 2014 San Francisco につきまして

JavaOne 2014 ディスカウント・コードのご案内


本日は、日本 Java ユーザ・グループ (JJUG) に所属する方々へ、JavaOne 2014 San Francisco のディスカウント・コードをお知らせいたします。今月 (6 月) 中に JavaOne 2014 San Francisco への参加チケットをご購入頂ける場合、JJUG 会員の皆様には現在の早期割引価格に加えて、さらに追加で $200 OFF でチケットをご購入頂く事が可能です。これは、当日のオンサイト価格に対して $600 OFF の割引になりますので、この機会にどうぞご登録ください。

ディスカウント・コードをご利用されたい場合は、登録時に下記をご入力ください。
※ ディスカウント・コード: DJU4

今年の JavaOne は継続して Java 開発者が必要とする情報をお届けするイベントで、9トラック 400 以上のセッションが用意されております。また、下記ブログでも情報共有されましたが、今年は次期Java EE 8 に関する情報も提供される事と想定しています。
Java EE 8 のプランニング

JavaOne には皆様が欲しい情報が必ずあると思います。是非、今年の JavaOne への参加をご検討ください。

また、これに併せて、JavaOne 2014 San Francisco のオフィシャルツアーにつきましてご案内を差し上げます。

JavaOne 2014 オフィシャルツアーのご案内



【JavaOne 2014 San Francisco オフィシャルツアーお申し込みページ】

 
★ お申込締切:2014年 7月 31日(木) 17時 ★

ご旅行代金:198,000 円(2名様1室利用時*1の1名様あたり料金)
※ 1室1名様ご利用も可能です
(追加ご旅行代金 上記および135,000円、合計 333,000円)
上記旅行代金には日本から米国までの航空運賃は含まれておりません。
詳細は上記サイトをご覧ください。

本ツアーは、ホテル代金、空港送迎、JTB 特設デスク(日本人)ご利用等をご利用頂く事ができ、2名1室でもご利用頂ける、JavaOne 参加者向け特別パッケージでございます。宿泊先の The Westing St. Francis はJavaOne 会場である、ヒルトン・ホテル、ホテル・ニッコー等から目と鼻の先にある、安全で好立地な場所に存在します。

Expedia によると
本日時点で、JavaOne 開催期間中のユニオンスクエア周辺の9/27-10/3までのホテル代金の平均は1泊 ¥45,940 でございました。
3つ星ホテル:¥51,968
4つ星ホテル:¥67,360
5つ星ホテル:¥75,237

一方で、本パッケージをご利用頂いた場合2名1室の場合、¥39,600 一人の場合、¥66,600となります。(The Westing St. Francis:4つ星ホテル)

JavaOne の会場からとても近く好立地で、安全な場所に宿泊されたい場合、是非、本パッケージのご利用をご検討頂ければ幸いです。(空港送迎の他、現地で日本人によるサポートもございます。)本パッケージは会社の同僚、もしくは Java のコミュニティのメンバーと相部屋でご利用されたい場合など柔軟にご利用頂けます。どうぞご活用ください。
※ 本パッケージに関する詳しいお問い合わせは上記 JTB までお問い合わせください。より多くの皆様のご参加を心より楽しみに致しております。

PS.
本パッケージをご利用頂くか否かで、私には一切見入りはございませんのでどうぞご理解ください。参加者の皆様に、より「好立地で安全な場所」を提供できないかと、今年初めて JavaOne 参加者の皆様向けに企画した内容です。どなたからもご利用頂けなかった場合は来年はないかもしれませんが、フィードバック等に応じて検討させて頂きたいと思いますので、フィードバックも頂ければ幸いです。

2014年6月5日 at 5:04 午後 1件のコメント

Java Day Tokyo 2014 終了の御礼

2014年 5/22(木)に今年最大の Java イベント Java Day Tokyo 2014 が無事終了しました。当日は、日本全国から多くの Java 開発者の皆様にお越し頂き誠にありがとうございました。昨年を上回る来場者数を記録し、ご参加頂いた全ての皆様に心より御礼申し上げます。

今年の Java Day Tokyo のテーマは、日本オラクル発の「Java SE 8」ローンチ・イベントでした。このイベントに併せて、US から Lambda の開発者を始めとして、多くのエンジニアに来日してもらい、丸一日 Java SE 8 関連セッションで様々な情報を入手して頂いたのではないでしょうか。多くの Java 開発者の皆様にとって今年のイベントが Java SE 8 採用に向けた出発点になって頂ければ誠に幸いです。

また本イベントに併せて、まだ完全ではないながらも日本語版 Java SE 8 API ドキュメントを公開できました。残りの部分につきましては随時対応をしてまいりますので、どうぞご安心頂くと共にご活用ください。

● 日本語版:Java Platform Standard Edition 8 ドキュメント
● OTN の「Java SE API & ドキュメント」サイトから:

● アーカイブ(zip)版も下記から入手可能です。

その他、JDK 8 のリリースノート等も一部日本語化を行いました。
下記リンクも併せてご覧ください。

● JDK 8の新機能
● JDK 8の既知の問題
● JDK 8およびJRE 8でサポートされるロケール
● Oracle JDK 8およびJRE 8認定システムの構成
● Java Platform, Standard Edition 8の名前とバージョン
● Java Mission Control 5.3リリース・ノート
● JDK 8採用ガイド
● JDK 8の互換性ガイド(翻訳中)

最後に、
今年、ご参加頂いた皆様、本当にありがとうございました。来年また Java 開発者の皆様と Java のお祭りができる事を心より楽しみにしております。

私の発表資料「Java SE 8時代のJava EE 7アプリケーション開発」も下記に公開しております。どうぞご参照ください。

また、上記発表中でご覧頂いた WebSocket のデモはここに公開しています。GlassFish v4.0.1 b5 以上でご確認頂けます。また、ソースコードはコチラからご覧頂けます

PS.
今年の夕方のイベントはグダグダになってすいませんでした。来年の夕方のイベントは、今一度仕切り直して、また楽しい夜のイベントを企画し実施したいと思っております。

2014年5月27日 at 2:54 午後

Java Day Tech Night の詳細な内容につきまして


Java Day Tokyo 2014 は早いものでもうあと3日に迫りました。すでに何名かの講演者が来日しておりイベントの準備もいよいよ最終段階に入ってきています。

さて、今日は「Java Day Tech Night」の詳細についてご案内します。

今年の「Java Day Tech Night」は、本場サンフランシスコの JavaOne さながらの BoF として「Ask The Experts」を行いたいと思います。本場 JavaOne では 「Meet the Spec Lead」という BoF セッションがあり、参加者が会場で自ら直接講演者に対して質問を投げかける事ができます。

今回は、その本場 JavaOne の「Meet the Spec Lead」を模して、今年来日した4名の講演者に対して、「Ask The Experts」セッションとして、会場にいらっしゃる皆様から直接ご質問やご意見をお伺いする場を設けたいと考えています。
※ 過去、お昼の時間帯に実施しておりましたが、人気セッションだったため、今年は規模と時間を拡大して、もっと多くの方に ご参加頂き、講演者と直接交流を持って頂ければと考えております。

また、本イベントの UStream 配信も正式に決定しました。関東近郊以外の皆様、もしくはお仕事でどうしてもお越し頂く事ができなかった皆様には、是非 UStream でご覧頂けないでしょうか。
※1: UStream を視聴頂くためには登録が必要です。登録用の URL は別途ご案内致します。
※2: 本 Stream 配信は録画はいたしません。リアルタイムでのみご視聴いただけます。

Twitter のハッシュタグ:#jdt2014_A5

Experts :
* Stuart Marks (Lambda 式の開発者)
* Simon Ritter (Java SE/SE Embedded/JavaFX のエバンジェリスト)
* Stephen Chin (JavaOne の Chair)
* Reza Rahman(Java EE のエバンジェリスト)

通訳:
David Buck

皆様から頂くご質問、ご意見のカテゴリとして下記を考えております。

* オラクルの Java 活動に関する質問、ご意見
 例:世界のコミュニティ活動について教えて欲しい
   日本のコミュニティについてもっと連携して欲しい
   日本のコミュニティに対してヘルプして欲しい。
   Adopt-A-JSR はどうしたら参加できるの?
   世界の何カ国にどの位の頻度で巡っているの?
  提案:
   もっと、海外のエンジニアに日本にきて欲しい。
   ***の部分をもっと改善して欲しい。

* Lambda 式について
 スペックを含む技術的なご質問、ご意見など
 セッション中で疑問に思った事。

* JavaSE/JavaFX/Java Embedded に関連する内容(Lambda 式以外)
 Lambda に関する以外の全てのご質問
 スペックを含む技術的なご質問、ご意見など

* Java EE に関して
 スペックを含む技術的なご質問、ご意見など
 次の Java EE 8 はこのような機能を入れて欲しい。
 
などなど。

皆様がお持ちの疑問や課題、ご意見等を是非我々に直接お届けください。
皆様の貴重なご意見、ご質問が「次の Java をさらに良くするため」の、きっかけになるかも知れません。多くの皆様のご参加とご意見・ご質問を心よりお待ち致しております。

ご意見・質問頂ける方へのご案内:
当日開場の両サイドに、ご質問者用のマイクを2本用意しています。ご質問を頂ける方は、直接マイクが置いてある場所までお越し頂けないでしょうか。またセッションが始まるとすぐに、1番目のカテゴリ「オラクルの Java 活動に関する質問、ご意見」に入りたいと思います。本プログラムが正式に始まる前から両サイドのマイクにお並び頂ければ誠に幸いです。

開場のマイクの置き場所について

2014年5月19日 at 6:32 午後

Java Day Tokyo で「教育版 LEGO Mindstorms EV 3」の限定3台販売決定

先日、leJOS + NetBeans 8.0 (Maven) + Java SE Embedded (7 or 8) で LEGO Mindstorms EV3のアプリケーション開発 のエントリで LEGO Mindstorms を Java で制御するためのエントリを記述しましたが、このエントリの中で 「教育版レゴ マインドストームEV3」 をお借し頂いた、(株)アフレルさんが Java Day Tokyo 2014 で協賛する事が正式に決まりました。そこで、Java Day Tokyo の当日、アフレルさんの展示ブースで生の「教育版レゴ マインドストームEV3」をご覧頂く事ができます。皆様、どうぞ楽しみにしてください。


また、これを記念してアフレルさんの展示ブースで、「会場販売特典付き」の『教育版EV3 Javaプログラミングセット』を限定3台販売する事も決まりました。

『教育版EV3 Javaプログラミングセット』+Java Day Tokyo 2014 会場販売特典
  価格:51,600円(55,728円)

 ◆教育版EV3 Javaプログラミングセット:51,600円
  教育版レゴマインドストームEV3
  DCアダプター
  無線LANドングル
  USB延長ケーブル
  EV3 Javaプログラミングガイド

 ◆JavaDayTokyo2014会場特典
  EV3インタラクティブサーボモーターM:3,200円相当
  非売品レゴセット×2種:プライスレス

ここでしか手に入らない、非売品レゴセット(内容は当日のお楽しみ)を含む、追加モータも頂けるので、まさに Java Day Tokyo だけのオリジナル特別限定販売になります。
また、現時点では Java で LEGO Mindstorms を制御するための日本語情報が少ないため、最初から英語で情報収集するのはちょっとという方には、付属の「Javaプログラミングセット」の日本語資料は、絵付きで丁寧に説明されているのでとても有用かと思います。

ご購入頂いた商品は、当日お持ち帰りいただく事も可能ですので、Java Day Tokyo の余韻がさめない内から LEGO Mindstorms をお楽しみ頂く事も可能です。また、大きい商品ですので、会場から郵送でお送りいただく事も可能です。(特典のレゴだけお持ち帰りいただく事も可能です!)
ここでしかご購入頂けない、限定 3 セットの『教育版EV3 Javaプログラミングセット』をご購入されたい方は、是非アフレルさんの展示ブースへお早めに御立ちよりください。

※ 当日、Java Store では、Java Day Tokyo 2014 オリジナル・ケース付き “Raspberry PI” を、こちらも限定 20 セットの販売を予定(¥7,500位)していますが、Raspberry PI と LEGO Mindstorms の販売場所は異なりますので、どうぞご注意ください。

2014年5月9日 at 4:20 午後

Java SE 8 & IoT ハンズオンのご紹介

今日は私、寺田が企画する Java ハンズオンセミナーを2つご紹介します。このハンズオンは、Java Day Tokyo 2014 に併せて来日するエンジニアと共に実施します。
実施内容は、午前 : Java SE 8 Lambda と午後: IoT に分けて2回実施し、各回とも先着 50 名で募集します。Lambda の開発者自らがお送りする Lambda 式のハンズオンの他、Raspberry Pi のハンズオンは、2人1組に Raspberry Pi を貸し出し、これを使った創作物を作って頂きます。とても面白い内容になると思いますので、ご興味のある方はどうぞお早めにご登録の程宜しくお願いします。

日時: 2014 年 5 月 23 日 (金)
場所:オラクル青山センター

Java SE 8 Lambda ハンズオンの参加ご登録
実施時間:AM 10:00 – 12:00

Internet-of-Things ハッカー・スペース !!の参加ご登録
実施時間:14:00 – 16:00

当日は、逐次通訳を行いフォローします。
皆様のご参加を心より楽しみに致しております。

2014年5月7日 at 12:00 午後

【若い方向け】Java Fan Meeting 2014 のご案内


今日は、若い方(20-30歳)向けの Java イベントのご案内を差し上げます。

5月22日(木)に「Java Day Tokyo 2014」を開催しますが、これに先駆けて、「Java Fan Meeting 2014」を5月16日(金)に開催します。

「Java Fan Meeting 2014」の登録サイト
https://fansfans.jp/campaigns/detail/1332

※ 本イベントへの参加は抽選による受付となります。
 また、本イベントは「ブログ」「Twitter」「Facebook」のうち
 1つ以上をお持ちの方が対象になります。
 応募時のアンケートに必ずご記入ください。

本イベントの趣旨は、若い Java エンジニアの方々と交流を持つ事ですので、若い方を優先とさせて頂きたいと思います。20 – 30代(学生、社会人何れも可)の若手の方の中で、Java に関する情報発信を行っている方、これから情報発信を行いたいと考えている方は是非、お気軽にご登録頂けないでしょうか。

また、JJUG 会員の皆様(ベテランの皆様)の身近にいらっしゃる新人や若手のエンジニアで、これから Java に関する情報発信をしたいと考えている方、新人 Javaエンジニアをご存知な方は是非、本情報をご案内頂けないでしょうか。

参加者には「Java Day Tokyo 2014」の見どころをいち早く紹介します。また、プログラミングロボット教材「教育版レゴ®マインドストー ム」や、子供向け Java教育のためのゲーム開発ツール「Greenfoot」を使った小中学生向けJava教育の取り組みについてもご紹介します。

イベントの最後には軽食と飲物をご用意しておりますので、どうぞお楽しみください。是非奮ってのご応募、お待ちしております!

————————————————
【イベント概要】
■タイトル:「Java Fan Meeting 2014」
■日時:2014年5月16日(金)19:00開場 19:30開始~21:00終了を予定
■会場:日本オラクル株式会社 本社
■住所:東京都港区北青山2-5-8 オラクル青山センター (13階の受付にお越しください)
■地図(URL):http://www.oracle.com/jp/corporate/branch/aoyama-078891-ja.html

■交通案内:地下鉄銀座線 外苑前駅 4B出口より接続 
      地下鉄銀座線・半蔵門線・大江戸線 青山一丁目駅より 徒歩9分
      地下鉄銀座線・半蔵門線・千代田線 表参道駅より 徒歩10分

■参加費用:無料(ソーシャルメディアアカウントをお持ちの方が応募対象になります。)
■募集定員:20名

■参加条件:
※ブログをお持ちの方はイベント内容についての率直なご感想を【2週間程度】で
 ご自身のブログに1記事以上書いていただける方、また当日の様子をTwitterやFacebookで
 投稿してくれる方を募集しています。

 ・ブログ記事について:
  【日本オラクル】のイベントに参加したということが読者にわかるように記載してください。
  (表記の仕方は自由)
  (例)【日本オラクル】のイベントに参加しました。

■注意事項:
※当落にかかわらず、5月9日(金)までにメールにてご連絡いたします。
※当日はお飲み物と軽食をご用意しております。
※当日は、メディア用の撮影が入る場合がございます。予めご了承ください。

※本イベントの注意事項については、Fans:Fansキャンペーンポリシーページをご参照ください。
 http://fansfans.jp/policy/

【主催】 日本オラクル株式会社

2014年4月30日 at 6:45 午後

leJOS + NetBeans 8.0 (Maven) + Java SE Embedded (7 or 8) で LEGO Mindstorms EV3のアプリケーション開発

今日は Java の開発者の皆様に、LEGO Mindstorms EV3 の制御を Java で行うために、環境構築から NetBeans を使用した Java のアプリケーションの開発方法までをご紹介します。LEGO 社は、幅広い年代の子供達に向けて LEGO ブロックを提供しています。最近では私の2歳になる子供も LEGO duplo という幼児向けのレゴで遊んでいます。

今日、ご紹介する「教育版レゴ マインドストームEV3」 は、LEGO Mindstorms を教育目的で使うために開発された製品で、これを使用するとブロックでロボットを作成した後、Java でそのロボットを制御する事もできるようになります。今回、Java でロボット制御を試すために、「教育版レゴ マインドストームEV3 / LEGO Mindstorms Eduation EV3 」の日本の正規代理店である(株)アフレル様のご協力を得て、LEGO Mindstorm を1台お借りし、実際に教育版レゴ マインドストームEV3 用の Java アプリケーションを書いてみました。

● アプリケーションの動作イメージ:

今回、作成した LEGO Mindstorms EV3 のサンプル・アプリケーションのソースコードは GitHub にアップしていますので、ご興味のある方はどうぞご覧ください。
https://github.com/yoshioterada/Java-Sample-app-for-LEGO-Mindstorms

本エントリでは、上記のサンプル・アプリケーションの実装に対する詳細の説明ではなく、Java でプログラムを書く事ができるように環境構築から最初のプログラム作成の部分までをご紹介します。

事前準備:

(1) レゴマインドストーム EV3 の入手

LEGO Mindstorms は 教育版と玩具版があり含まれる内容が異なります。
参考:教育版と玩具版の比較 (アフレル)

教育版
「教育版レゴ マインドストームEV3」の入手 (本エントリではこちらを使用)
販売先情報 :アフレル(株)


玩具版: Amazon 等から
レゴ マインドストーム EV3 31313(¥51,000)
レゴ マインドストーム EV3 31313 LEGO Mindstorms EV3 並行輸入品(¥ 44,320)
LEGO Mindstorms EV3 31313($349.95)

玩具版の レゴも Amazon で $350 〜 ¥51,000と少々高価な商品ですが、対象年齢は 10 歳以上のれっきとした LEGO です。機能的にこれは本当に子供向けなのか?!と思う程、自分でロボットを組み立てたり、そのロボットを制御するプログラムを書けたりと、子供よりも大人が熱中しそうな商品です。今回のエントリは玩具版でもご参考いただけるかと思います。

(2) USB WiFi アダプタの入手

USB の WiFi アダプタは EV3 に標準で付属していませんがあった方がとても便利です。開発時、開発環境から EV3 へネットワークを通じてアプリケーションをデプロイしたり、リモートから EV3 を制御したい場合、WiFi アダプタが必要です。今回、(株)アフレル様のご好意で「Roland Wireless USB Adapter WNA1100-RL」も借りる事ができたため、私はこの WiFi アダプタを使用します。Amazon から WNA1100-RL を購入していただく事も可能です。

その他、EV3 では下記の WiFi の USB アダプタが動作確認されています。特に EDIMAX EW-7811Un は EV3 からあまり突出しないのでオススメです。
動作確認済みの WiFi アダプタ

(3) leJOS 0.8.1 beta の入手


leJOS は LEGO Mindstorms EV3 のファームウェアを変更した OS で、この環境上で Java SE 7 Embedded 7 が稼働し、Java のアプリケーションを動かす事ができるようになります。
leJOS EV3 0.8.1 beta release より leJOS_EV3_0.8.1-beta.tar.gz を入手してください。

(4) Oracle Java SE Embedded の入手

Java for LEGO® Mindstorms® EV3 のサイト(オリジナルJRE入手先)から、Oracle Java SE Embedded を入手してください。
Java SE Embedded 7 の場合:
● ejre-7u55-fcs-b13-linux-arm-sflt-headless-17_mar_2014.tar.gz

Java SE Embedded 8 のインストール方法は、本エントリの最後に記載しています。

(5) 開発環境用 (Mac/Linux/Windows環境) に統合開発環境、Java SE をインストール

デスクトップの開発環境に NetBeans 8 と Java SE 7 をインストールしてください。(今回は各インストール方法の詳細は割愛)

NetBeans の入手はこちらから
Java SE 7 の入手はこちらから

leJOS 環境構築から開発までの手順

LEGO Mindstorms EV3 で Java アプリケーションを動作させるためには、下記の手順に従って行います。


  1. ブート可能なマイクロ SD カードへ leJOS のインストール
  2. ブート可能なマイクロ SD カードから起動
  3. leJOS で WiFi 設定
  4. ローカル Maven レポジトリに必要ライブラリをインストール
  5. Maven プロジェクトの作成
  6. アプリケーションの開発
  7. アプリケーションのビルド/デプロイ
  8. アプリケーションの実行

(0)ブート可能なマイクロ SD カードを作成

ブート可能で FAT 32 でフォーマットしたマイクロ SD カードを作成してください。Mac OS/X の場合、「アプリケーション」→「ユーティリティ」→「ディスクユーティリティ」を実行して作成できます。「パーティションのレイアウト」から「1パーティション」を選択し、「パーティション情報」に「名前」を記入してください。

次に「オプション…」ボタンを押下してください、すると下記のウィンドウが表示されます。ここで、「マスター・ブート・レコード」にチェックされている事を確認し「OK」ボタンを押下してください。

最後に「適用」ボタンを押下してください、押下すると下記の画面が表示されます。ここで「パーティション」ボタンを押下してください。

(1) SD カードへファイルのコピーと展開 (Mac/Linux/Windows 環境で実施)

事前準備の (3) でダウンロードした leJOS_EV3_0.8.1-beta.tar.gz を展開してください。

> tar xvf leJOS_EV3_0.8.1-beta.tar.gz
> ls

COPYING README.md bin lejosimage.zip lib samples.zip sd500.zip

展開すると lejosimage.zip が存在しますので、このファイルと JRE7 を SD にコピーしてください。ファイルをコピーした後、SD カード内で lejosimage.zip を展開してください (※ JRE の展開は不要です)。

> cp ejre-7u55-fcs-b13-linux-arm-sflt-headless-17_mar_2014.tar.gz lejosimage.zip /Volumes/LEGO-PART/
> cd /Volumes/LEGO-PART/
> unzip lejosimage.zip

Archive: lejosimage.zip
creating: lejos/
creating: lejos/bin/
inflating: lejos/bin/partition.sh
inflating: lejos/bin/partfuncs.sh
inflating: lejos/bin/install.sh
inflating: lejos/bin/funcs.sh
inflating: lejos/bin/spinner.sh
inflating: lejos/bin/check.sh
creating: lejos/images/
inflating: lejos/images/lejoslogo.ev3i
inflating: lejosimage.bz2
inflating: uImage
inflating: uImageStandard
extracting: version

# 展開した後の SD カードのディレクトリ構成
# ls -F
ejre-7u55-fcs-b13-linux-arm-sflt-headless-17_mar_2014.tar.gz*
lejos/
lejosimage.bz2*
lejosimage.zip*
uImage*
uImageStandard*
version*

以上で準備は完了です。マイクロ SD カードをアンマウントして、システムから取り出してください。

取り出した後、EV3 にマイクロ SD カードを挿入してください。またその際、WiFi の USB アダプタも USB ポートに挿入してください。

(2)ブート可能なマイクロ SD カードから起動(EV3 で実施)

LEGO MindStorm に SD カードが挿入されている事を確認し、EV3 のボタンを押して起動してください。すると自動的に Linux 環境の構築(ファイルシステム構築等も含む)やJava 環境の構築を実施します。 (作業終了まで:約 8 分)

内部的には下記の処理等が行われています。
1. Resize FAT32 fs
2. Resize Complete
3. Create Linux fs
4. Expand Image
5. Prepare Install
6. Deleting old files
7. Expand Image
8. Start Install
9. Installing rootfs
10. Installing modules
11. Installing leJOS
12. Configure network
13. Install links
14. Install lib jna
15. Copy config files
16. Install jre
17. Extracting jre
18. Optimize java
19. Remove temp files
20. Installing kernel
21. Sync disks
22. Unmount disks
23. Rebooting

EV 3 はインストールや設定が完了すると自動的に再起動します。正常に起動が完了すると大きなブザー音が鳴った後、leJOS のメニュー画面が表示されます。


(3) leJOS で WiFi 設定(EV3 で実施)

WiFi の設定は、WiFi の設定マークを選択して行います。選択すると接続可能なアクセス・ポイントの一覧が表示されます。

自身の適切なアクセス・ポイントを選択してください。選択すると下記の画面が出てきます。

ここで、アクセス・ポイントに接続するため WEP のパスワードを入力します。基本的にはキーボード配列と同様にローマ字が並んでいますので、適切なパスワード文字を入力してください。ここで画面の一番最下行に特別な命令用の文字 (U,l,x,D) が記載されています、それぞれの意味は下記の通りです。大文字のローマ字を入力したい場合は、U を押す等してパスワードを正しく入力してください。

U : 大文字に変換 (Upper)
l : 小文字に変換 (lower)
x : 1文字消去
D : 設定終了 (Done)

パスワードを正しく入力した後、D を押下すると WiFi での接続ができるようになります。EV3 のメニュー画面で、IP アドレス: 10.0.1.1 と記載された行の下側に、割り当てられた IP アドレス(ここでは 192.168.1.100)が記載されていますので、この IP アドレスで EV 3 に接続できるようになります。EV3 に接続できるようになっているかどうかを確認するために、TELNET でログインをして確認してください。

> telnet 192.168.1.100
Trying 192.168.1.100…
Connected to 192.168.1.100.
Escape character is ‘^]’.

_____ _ _ ___
| _ |_ _ _| |___| | __|
| _| | | . | . | | _|
|__|__|___|___|___|_|_|

Rudolf 2011.01 EV3

login: root
root@EV3:~#

正常に、WiFi の設定ができている場合、上記のようなログイン・プロンプトが表示されます。ここで login: 名に root を、パスワードは未入力(ノンパスワード)でエンター・キーを押下してください。すると EV3 にログインができるようになります。

(4) ローカル Maven レポジトリに必要ライブラリをインストール (Mac/Linux/Windows 環境で実施)

今回、統合開発環境には NetBeans を使用し、Maven プロジェクトとしてアプリケーション開発を行います。EV3 を制御する Java アプリケーション開発を行うためには、ev3classes.jar と dbusjava.jar が必要ですが、現在 leJOS 用の Maven レポジトリが存在していないようです。そこで、これら2つのファイルをローカルの Maven レポジトリにインストールしてください。2つのファイルは leJOS_EV3_0.8.1-beta.tar.gz を展開したディレクトリ内に含まれています。

> cd leJOS_EV3_0.8.1-beta/lib/ev3
> ls

dbusjava-src.zip dbusjava.jar ev3classes-src.zip ev3classes.jar

次に、2つのファイルを mvn コマンドでローカル・レポジトリにインストールします。下記の 2 つのコマンドを実行してください。仮に mvn コマンドが自身の実行パス内に見つからない場合は、NetBeans 付属のmvn コマンドをご利用ください。

例:Mac OS/X (Linux) の場合 mvn はデフォルトで下記に存在します。
“/Applications/NetBeans/NetBeans 8.0.app/Contents/Resources/NetBeans/java/maven/bin/mvn”

> mvn install:install-file -Dfile=ev3classes.jar -DgroupId=ev3.classes -DartifactId=ev3classes -Dversion=0.8.1 -Dpackaging=jar
[INFO] Scanning for projects…
[INFO]
[INFO] ————————————————————————
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ————————————————————————
[INFO]
[INFO] — maven-install-plugin:2.3.1:install-file (default-cli) @ standalone-pom —
[INFO] Installing /Users/USER_NAME/Downloads/leJOS_EV3_0.8.1-beta/lib/ev3/ev3classes.jar to /Users/USER_NAME/.m2/repository/ev3/classes/ev3classes/0.8.1/ev3classes-0.8.1.jar
[INFO] Installing /var/folders/5x/qqvk50_50xl7jvfhyf9_tdd40000gn/T/mvninstall6910985062740456417.pom to /Users/USER_NAME/.m2/repository/ev3/classes/ev3classes/0.8.1/ev3classes-0.8.1.pom
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 0.623s
[INFO] Finished at: Tue Apr 22 20:22:57 WIT 2014
[INFO] Final Memory: 5M/245M
[INFO] ————————————————————————

> mvn install:install-file -Dfile=dbusjava.jar -DgroupId=ev3.dbus -DartifactId=dbusjava -Dversion=0.8.1 -Dpackaging=jar
[INFO] Scanning for projects…
[INFO]
[INFO] ————————————————————————
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ————————————————————————
[INFO]
[INFO] — maven-install-plugin:2.3.1:install-file (default-cli) @ standalone-pom —
[INFO] Installing /Users/USER_NAME/Downloads/leJOS_EV3_0.8.1-beta/lib/ev3/dbusjava.jar to /Users/USER_NAME/.m2/repository/ev3/dbus/dbusjava/0.8.1/dbusjava-0.8.1.jar
[INFO] Installing /var/folders/5x/qqvk50_50xl7jvfhyf9_tdd40000gn/T/mvninstall6420442918254641308.pom to /Users/USER_NAME/.m2/repository/ev3/dbus/dbusjava/0.8.1/dbusjava-0.8.1.pom
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 0.597s
[INFO] Finished at: Tue Apr 22 20:25:04 WIT 2014
[INFO] Final Memory: 6M/310M
[INFO] ————————————————————————

例:Windows の場合 mvn はデフォルトで下記に存在します。
 C:\Program Files\NetBeans 8.0\java\maven\bin

Windows で mvn コマンドをターミナルから実行するために、下記2つの環境変数の設定を行ってください。
● JAVA_HOME を新規追加 : JDK をインストールした場所
● PATH へ追加 : maven コマンドへのパスの追加

上記、環境変数の設定を行った後、lib\ev3 ディレクトリに移動し下記のコマンドを実行してください。※ 大文字、小文字の打ち間違いにご注意ください。

C:\Users\USER_NAME\Desktop\leJOS_EV3_0.8.1-beta_win32\lib\ev3 > mvn install:install-file -Dfile=dbusjava.jar -DgroupId=ev3.dbus -DartifactId=dbusjava -Dversion=0.8.1 -Dpackaging=jar
[INFO] Scanning for projects…
[INFO]
[INFO] ————————————————————————
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ————————————————————————
[INFO]
[INFO] — maven-install-plugin:2.3.1:install-file (default-cli) @ standalone-po
m —
[INFO] Installing C:\Users\USER_NAME\Desktop\leJOS_EV3_0.8.1-beta_win32\lib\ev3\db
usjava.jar to C:\Users\USER_NAME\.m2\repository\ev3\dbus\dbusjava.8.1\dbusjava-0
.8.1.jar
[INFO] Installing C:\Users\USER_NAME\AppData\Local\Temp\mvninstall1908329777283214
622.pom to C:\Users\USER_NAME\.m2\repository\ev3\dbus\dbusjava.8.1\dbusjava-0.8.
1.pom
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 0.760s
[INFO] Finished at: Thu Apr 24 19:29:44 JST 2014
[INFO] Final Memory: 5M/155M
[INFO] ————————————————————————
C:\Users\USER_NAME\Desktop\leJOS_EV3_0.8.1-beta_win32\lib\ev3> mvn install:install-
file -Dfile=ev3classes.jar -DgroupId=ev3.classes -DartifactId=ev3classes -Dversion=0.8.1 -Dpackaging=jar

[INFO] Scanning for projects…
[INFO]
[INFO] ————————————————————————
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ————————————————————————
[INFO]
[INFO] — maven-install-plugin:2.3.1:install-file (default-cli) @ standalone-po
m —
[INFO] Installing C:\Users\USER_NAME\Desktop\leJOS_EV3_0.8.1-beta_win32\lib\ev3\ev
3classes.jar to C:\Users\USER_NAME\.m2\repository\ev3\classes\ev3classes.8.1\ev3
classes-0.8.1.jar
[INFO] Installing C:\Users\USER_NAME\AppData\Local\Temp\mvninstall2687157046215461
183.pom to C:\Users\USER_NAME\.m2\repository\ev3\classes\ev3classes.8.1\ev3class
es-0.8.1.pom
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 0.712s
[INFO] Finished at: Thu Apr 24 19:31:49 JST 2014
[INFO] Final Memory: 5M/158M
[INFO] ————————————————————————

(5) Maven プロジェクトの作成 (Mac/Linux/Windows 環境で実施)

NetBeans のメニューからプロジェクトを作成してください。まず、「ファイル(F)」→「新規プロジェクト(W)…」を選択してください。

選択すると下記の「新規プロジェクト」作成用のウィンドウが表示されます。ここで、「カテゴリ (C) :」から「Maven」を選択し、「プロジェクト (P) :」から「Javaアプリケーション」を選択し「次へ」ボタンを押下してください。

ボタンを押下すると下記の「新規 Java アプリケーション」ウィンドウが表示されます。ここで「プロジェクト名 (N) :」、「プロジェクトの場所 (L) :」、「グループ ID (G) :」、「バージョン (V) :」、「パッケージ (P) :」に適切な値を入力した後、最後に「終了 (F)」ボタンを押下してください。

プロジェクトが正常に作成されるとプロジェクト・タブに下記のようなプロジェクトが作成されます。

プロジェクトを作成した後、pom.xml ファイルに下記を記載してください。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yoshio3</groupId>
    <artifactId>LEGOMind</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>

    <build>
        <extensions>
            <extension>
                <groupId>org.apache.maven.wagon</groupId>
                <artifactId>wagon-ssh</artifactId>
                <version>1.0</version>
            </extension>
        </extensions>
        <plugins>
            <!--- MANIFEST ファイルを作成するプラグイン -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.yoshio3.legomind.EV3AppMain</mainClass>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>/home/root/lejos/lib/ev3classes.jar /home/root/lejos/libjna/usr/share/java/jna.jar</Class-Path>
                        </manifestEntries> 
                    </archive>
                </configuration>
            </plugin>
            <!--- デスクトップからネット経由で jar ファイルをコピーするためのプラグイン -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>wagon-maven-plugin</artifactId>
                <version>1.0-beta-5</version>
                <executions>
                    <execution>
                        <id>upload-jar</id>
                        <phase>package</phase>
                        <goals>
                            <goal>upload</goal>
                        </goals>
                        <configuration>
                            <!-- ~/.m2/settings.xml ファイルに記述したログインID、パスワードの参照 --> 
                            <serverId>ev3-root</serverId>
                            <!-- EV3 に割り当てられている IP アドレス --> 
                            <url>scp://192.168.1.100/</url>  
                            <fromDir>${project.basedir}/target</fromDir>  
                            <includes>*.jar</includes>  
                            <excludes>*-sources.jar</excludes>
                            <!-- EV3 のコピー先ディレクトリ --> 
                            <toDir>/home/lejos/programs</toDir>  
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>    

    <!-- ローカル・レポジトリにインストールしたファイルへの参照
    mvn install:install-file 
        -Dfile=ev3classes.jar 
        -DgroupId=ev3.classes 
        -DartifactId=ev3classes 
        -Dversion=0.8.1 -Dpackaging=jar
    -->
    <dependencies>
        <dependency>
            <groupId>ev3.classes</groupId>
            <artifactId>ev3classes</artifactId>
            <version>0.8.1</version>
        </dependency>
        
    <!-- ローカル・レポジトリにインストールしたファイルへの参照
    mvn install:install-file 
        -Dfile=dbusjava.jar 
        -DgroupId=ev3.dbus 
        -DartifactId=dbusjava 
        -Dversion=0.8.1
        -Dpackaging=jar
    -->
        <dependency>
            <groupId>ev3.dbus</groupId>
            <artifactId>dbusjava</artifactId>
            <version>0.8.1</version>
        </dependency>
    </dependencies>
</project>

また、Maven の設定ファイル ( ~/.m2/settings.xml (Windows では C:\Users\USER_NAME\.m2)) に下記を記載してください。

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                     http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <servers>
        <server>  
            <id>ev3-root</id>  
            <!---- EV3 の root ログイン ID -->
            <username>root</username>  
            <!---- EV3 の root ログイン パスワード -->
            <password>password</password>
        </server>
    </servers>
</settings>

※ ご注意
pom.xml ファイルを設定、保存後に wagon のライブラリが存在しないため、下記のようにプロジェクトが「ロード不可能」と表示されます。

この場合、プロジェクトを右クリックし、「プロジェクトの問題を解決…」を選択してください(Maven のセントラルレポジトリよりライブラリを入手)。

選択すると下記のウィンドウが表示されます。ここで「解決 (R) …」ボタンを押下してください。

(6) アプリケーションの開発(Mac/Linux/Windows 環境で実施)

Maven プロジェクトを作成したので実際にプログラムを初めてみましょう。今回は上記 pom.xml の MANIFEST ファイルの定義 <manifest> の <mainClass> タグ内でメイン・クラスとしてcom.yoshio3.legomind.EV3AppMain を定義しましたので、このクラスを作成します。また、初めての LEGO Mindstorms のアプリケーション開発ということで、やはり Hello World から初めてみましょう。プロジェクトの中に含まれる「com.yoshio3.legomind」パッケージを右クリックし「新規」→「Java クラス …」を選択してください。

選択すると下記のウィンドウが表示されます。ここで「クラス名 (N) :」に「EV3AppMain」と入力し「終了 (F)」ボタンを押下してください。

クラスを作成すると下記の画面が表示されます。

ここで、「EV3AppMain」クラスに対して、EV 3 のパネルに文字列を表示させ、3 秒程緑色の LED を点滅させるプログラムを下記のように記載します。

package com.yoshio3.legomind;

import lejos.hardware.Button;
import lejos.hardware.lcd.LCD;
import lejos.utility.Delay;

/**
 *
 * @author Yoshio Terada
 */
public class EV3AppMain {

    public static void main(String... argv) {
        //パネルに文字列を表示
        LCD.drawString("Hello World", 0, 0);
        //緑の点滅ボタンを3秒間光らせる(有効値: 0 - 9)
        Button.LEDPattern(4);
        Delay.msDelay(3000);
    }
}

(7) アプリケーションのビルド/デプロイ(Mac/Linux/Windows 環境で実施)

コードを実装した後、プロジェクトをビルドしてください。プロジェクト・タブから「LEGOMind-Sample」プロジェクトを右クリックし「ビルド」を選択してください。

ビルドを行うと下記のメッセージが表示され、org.codehaus.mojo の wagon-maven-plugin を通じて、WiFi のネットワーク経由で自動的に /home/lejos/programs ディレクトリ配下に LEGOMind-1.0-SNAPSHOT.jar ファイルが配備されます。

cd /Users/USER_NAME/NetBeansProjects/LEGOMind; JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home "/Applications/NetBeans/NetBeans 8.0.app/Contents/Resources/NetBeans/java/maven/bin/mvn" install
Scanning for projects...
------------------------------------------------------------------------
Building LEGOMind 1.0-SNAPSHOT
------------------------------------------------------------------------
--- maven-resources-plugin:2.5:resources (default-resources) @ LEGOMind ---
[debug] execute contextualize
Using 'UTF-8' encoding to copy filtered resources.
skip non existing resourceDirectory /Users/USER_NAME/NetBeansProjects/LEGOMind/src/main/resources
--- maven-compiler-plugin:2.3.2:compile (default-compile) @ LEGOMind ---
Nothing to compile - all classes are up to date
--- maven-resources-plugin:2.5:testResources (default-testResources) @ LEGOMind ---
[debug] execute contextualize
Using 'UTF-8' encoding to copy filtered resources.
skip non existing resourceDirectory /Users/USER_NAME/NetBeansProjects/LEGOMind/src/test/resources
--- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ LEGOMind ---
No sources to compile
--- maven-surefire-plugin:2.10:test (default-test) @ LEGOMind ---
Surefire report directory: /Users/USER_NAME/NetBeansProjects/LEGOMind/target/surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Results :
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
--- maven-jar-plugin:2.4:jar (default-jar) @ LEGOMind ---
Building jar: /Users/USER_NAME/NetBeansProjects/LEGOMind/target/LEGOMind-1.0-SNAPSHOT.jar
--- wagon-maven-plugin:1.0-beta-5:upload (upload-jar) @ LEGOMind ---
Uploading /Users/USER_NAME/NetBeansProjects/LEGOMind/target/LEGOMind-1.0-SNAPSHOT.jar to scp://192.168.1.100///home/lejos/programs/LEGOMind-1.0-SNAPSHOT.jar ...
--- maven-install-plugin:2.3.1:install (default-install) @ LEGOMind ---
Installing /Users/USER_NAME/NetBeansProjects/LEGOMind/target/LEGOMind-1.0-SNAPSHOT.jar to /Users/USER_NAME/.m2/repository/com/yoshio3/LEGOMind/1.0-SNAPSHOT/LEGOMind-1.0-SNAPSHOT.jar
Installing /Users/USER_NAME/NetBeansProjects/LEGOMind/pom.xml to /Users/USER_NAME/.m2/repository/com/yoshio3/LEGOMind/1.0-SNAPSHOT/LEGOMind-1.0-SNAPSHOT.pom
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 4.837s
Finished at: Tue Apr 22 21:09:27 WIT 2014
Final Memory: 11M/312M
------------------------------------------------------------------------

8. アプリケーションの実行(EV3 で実施)

leJOS のメニュー画面より Programs (/home/lejos/programs ディレクトリ)を選択してください。

選択するとデプロイされているファイル一覧が表示されますので、LEGOMind-1.0-SNAPSHOT.jar を選択してください。

選択すると下記の画面が表示されます。そのままエンター・キー(真ん中のボタン)を押下してください。


押下すると下記の Duke が手を振っている画面 (しばらくお待ちください) が表示されます。アプリケーションをロードするまで数秒かかりますのでそのままお待ちください。

アプリケーションがロードされると下記のように実行され、メニューに「Hello World」が表示され、ボタンの LED が緑色に点滅する事を確認できます。

9. LEGO を組み立てて、超音波センサー、タッチ・センサー、モータ(車輪)を取り付けます。

上記で、Java を使って LEGO Mindstorms を制御できる事がわかりました。後は EV3 に LEGO のパーツを組み立てて、超音波センサーやタッチ・センサー、モータ(車輪)などを取り付けて自分オリジナルのロボットを組み立ててみてください。

その後で、下記 GitHub にアップロードしているコード例をご参照いただき実装すると、センサーから受け取った情報を元に EV3 を制御できるようになります。

GitHub にアップしたサンプルは、タッチセンサーに何かがぶつかると車輪が逆方向に回転し、超音波センサーに物を近づけると車輪の回転スピードが遅くなります。最後に EV3 の何らかのボタンを押すとアプリケーションを終了します。
https://github.com/yoshioterada/Java-Sample-app-for-LEGO-Mindstorms

今回私の上記実装では、車輪毎にリスナーを登録しセンサーからの情報に応じて車輪を制御する方法で実装しましたが、leJOS で提供されているサンプルを確認すると、様々な方法で実装ができるようです。是非色々お試しください。

また、調べていてちょっとおもしろかったのが、上記のようにデプロイしなくても、デスクトップの Java アプリケーションからWiFi 経由 (RMI) でリモートのEV3 を制御する事ができるので、これと JavaFX や WebSocket と組み合わせて応用すればスマートフォンや他のデバイスからリアルタイムに EV3 を制御できるようになるのではないかと想定します。

package com.yoshio3.legomind;

import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.logging.Level;
import java.util.logging.Logger;
import lejos.remote.ev3.RMIRegulatedMotor;
import lejos.remote.ev3.RMISampleProvider;
import lejos.remote.ev3.RemoteEV3;
import lejos.robotics.RegulatedMotor;
import lejos.robotics.RegulatedMotorListener;

/**
 *
 * @author Yoshio Terada
 */
public class RemoteOperation {

    public static void main(String... argv) {
        RemoteEV3 ev3;
        try {
            ev3 = new RemoteEV3("192.168.1.100");
            RMISampleProvider sampleProv = ev3.createSampleProvider("S1", "lejos.hardware.sensor.EV3TouchSensor", "sensor");

            // 車輪の制御 
            RMIRegulatedMotor right = ev3.createRegulatedMotor("B", 'L');
            RMIRegulatedMotor left = ev3.createRegulatedMotor("C", 'L');
            right.resetTachoCount();
            left.resetTachoCount();

            ExecutorService execSvc = Executors.newFixedThreadPool(3);
            execSvc.submit(new RunMotor(right));
            execSvc.submit(new RunMotor(left));

            Future<Float> res = execSvc.submit(new MonitoringTouch(sampleProv));
            if (res.get() == 1.0f) {
                right.stop(true);
                left.stop(true);
            }
        } catch (RemoteException | MalformedURLException | NotBoundException | InterruptedException | ExecutionException ex) {
            Logger.getLogger(RemoteOperation.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

class RunMotor implements Runnable {

    RMIRegulatedMotor motor;

    RunMotor(RMIRegulatedMotor motor) {
        this.motor = motor;
    }

    @Override
    public void run() {
        try {
            motor.setSpeed(400);
            motor.rotate(360 * 20);
            motor.close();
        } catch (RemoteException ex) {
            Logger.getLogger(RunMotor.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
...

最後に

leJOS のオリジナルのサイトでは Eclipse でプラグインをインストールし ant を用いて開発する方法が紹介されていました。Eclipse ユーザの方はオリジナル・サイトをご参照いただければ幸いです。一応、私も Eclipse で試しましたが、上記オリジナルサイトの記載内容に従い設定を行う事で Eclipse で開発からデプロイまで行う事ができる所までは確認しました。

普段、私は NetBeans を使用しているため、今回 NetBeans で同様に開発ができないか?!と考え、上記環境設定を行いました。一旦、上記 1 〜 4 までの設定を行うと、以降の開発は 5 〜 8 までを繰り返し行うだけで NetBeans でも簡単に開発ができるようになります。また Eclipse と同様に、ビルドを行った時点で自動的に WiFi 経由でデプロイができるようになるためとても便利です。

どうぞ、Java で LEGO Mindstorms をお楽しみください。

PS.
Java SE 8 のローンチ・イベントで発表された Java SE Embedded で LEGO Mindstorms の説明資料も参考として紹介します。

また、Java Champion の Adam Bien もRun Java 7u40 Embedded on Lego Mindstormsのエントリで leJOS を使用した LEGO Mindstorms の制御のデモも公開していますので併せてご紹介します。

追記メモ2.
Java SE Embedded 8 を使う場合の手順。

1. Oracle Java SE Embedded version 8 の DownLoad

Oracle Java SE Embedded version 8のダウンロード

上記のページ内に下記の記述があります。
Java SE Embedded 8 enables developers to create customized JREs using the JRECreate tool. Starting with Java SE Embedded 8, individual JRE downloads for embedded platforms are no longer provided. To get started, download the bundle below and follow instructions to create a JRE that suits your application’s needs.

これは、Java SE Embedded 8 以降では、Java SE 7 のように個別の JRE を提供しないため、自分専用の JRE を、JRECreate ツールを使って作成する必要がある事が書かれています。

2. Create a Custom JRE with jrecreate

jrecreate コマンドを使用してカスタムの JRE を作成してください。

※ jrecreate コマンドの引数の詳細は下記をご参照ください。
jrecreate Options

上記、説明内容に従って、カスタムの JRE を作成してください。

> tar xvfz ejdk-8-fcs-b132-linux-arm-sflt-03_mar_2014.tar.gz
> cd ejdk1.8.0/
> ls
bin lib linux_arm_sflt
> cd bin
> ./jrecreate.sh -vm all -d /tmp/ejre1.8.0
Options {
ejdk-home: /Users/USER_NAME/Downloads/ejdk1.8.0
dest: /tmp/ejre1.8.0
target: linux_arm_sflt
vm: all
runtime: jre
debug: false
keep-debug-info: false
no-compression: false
dry-run: false
verbose: false
extension: []
}
を使用してJREを作成しています

ターゲットJREサイズは45,523 KBです(ディスクの使用量はこれより多いことがあります)。
埋込みJREが正常に作成されました
> cd /tmp/
> ls
ejre1.8.0
> tar cvf ejre1.8.0.tar ejre1.8.0
a ejre1.8.0
a ejre1.8.0/bin
a ejre1.8.0/bom
a ejre1.8.0/lib
a ejre1.8.0/release
a ejre1.8.0/lib/arm
a ejre1.8.0/lib/calendars.properties
a ejre1.8.0/lib/classlist
a ejre1.8.0/lib/content-types.properties
a ejre1.8.0/lib/currency.data
a ejre1.8.0/lib/ext
a ejre1.8.0/lib/hijrah-config-umalqura.properties
a ejre1.8.0/lib/jce.jar
a ejre1.8.0/lib/jsse.jar
a ejre1.8.0/lib/logging.properties
a ejre1.8.0/lib/meta-index
a ejre1.8.0/lib/net.properties
a ejre1.8.0/lib/resources.jar
a ejre1.8.0/lib/rt.jar
a ejre1.8.0/lib/security
a ejre1.8.0/lib/tzdb.dat
a ejre1.8.0/lib/security/blacklist
a ejre1.8.0/lib/security/cacerts
a ejre1.8.0/lib/security/java.policy
a ejre1.8.0/lib/security/java.security
a ejre1.8.0/lib/security/local_policy.jar
a ejre1.8.0/lib/security/trusted.libraries
a ejre1.8.0/lib/security/US_export_policy.jar
a ejre1.8.0/lib/ext/meta-index
a ejre1.8.0/lib/ext/sunjce_provider.jar
a ejre1.8.0/lib/arm/client
a ejre1.8.0/lib/arm/jli
a ejre1.8.0/lib/arm/jvm.cfg
a ejre1.8.0/lib/arm/libjava.so
a ejre1.8.0/lib/arm/libjsig.so
a ejre1.8.0/lib/arm/libnet.so
a ejre1.8.0/lib/arm/libnio.so
a ejre1.8.0/lib/arm/libverify.so
a ejre1.8.0/lib/arm/libzip.so
a ejre1.8.0/lib/arm/minimal
a ejre1.8.0/lib/arm/minimal/libjsig.so
a ejre1.8.0/lib/arm/minimal/libjvm.so
a ejre1.8.0/lib/arm/minimal/Xusage.txt
a ejre1.8.0/lib/arm/jli/libjli.so
a ejre1.8.0/lib/arm/client/libjsig.so
a ejre1.8.0/lib/arm/client/libjvm.so
a ejre1.8.0/lib/arm/client/Xusage.txt
a ejre1.8.0/bin/java
a ejre1.8.0/bin/keytool
a ejre1.8.0/bin/rmid
a ejre1.8.0/bin/rmiregistry
> gzip -c ejre1.8.0.tar > ejre1.8.0.tar.gz
> cp ejre1.8.0.tar.gz /Volumes/LEGO-PART/
> cp lejosimage.zip /Volumes/LEGO-PART/
> cd /Volumes/LEGO-PART/
> unzip lejosimage.zip
Archive: lejosimage.zip
creating: lejos/
creating: lejos/bin/
inflating: lejos/bin/partition.sh
inflating: lejos/bin/partfuncs.sh
inflating: lejos/bin/install.sh
inflating: lejos/bin/funcs.sh
inflating: lejos/bin/spinner.sh
inflating: lejos/bin/check.sh
creating: lejos/images/
inflating: lejos/images/lejoslogo.ev3i
inflating: lejosimage.bz2
inflating: uImage
inflating: uImageStandard
extracting: version

SD カードにファイルをコピーして展開した後、SD ディスクをアンマウントしてください。後は、上記 (2)ブート可能なマイクロ SD カードから起動(EV3 で実施)と同様に、作成した SD から EV3 を起動して(2)以降の処理を行ってください。
上記で、Java SE Embedded 8 で制御できるようになります。

Java SE 8 Embedded のコードを実装するためには、Maven の pom.xml の下記の行 (コンパイラのソース、ターゲット) をそれぞれ 1.7 → 1.8 に修正して実装してください。

  
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

備考:本来であれば、LEGO Mindstorms は Java SE Embedded 8 の “Compact Profile 2” で動作するようなのですが、現在 Compact Profile 2 で JRE を作成した場合は現時点で動作しません。本件は、leJOS のチームと Oracle の Embedded チームが現在調査中です。
上記は現時点(2014年4月28日時点)でのワークアラウンドとしてご利用ください。

2014年4月23日 at 6:05 午後 13件のコメント

Older Posts Newer Posts


Java Champion & Evangelist

Translate

ご注意

このエントリは個人の見解であり、所属する会社の公式見解ではありません

カレンダー

2025年12月
1234567
891011121314
15161718192021
22232425262728
293031  

カテゴリー

clustermap

ブログ統計情報

  • 1,312,017 hits

Feeds

アーカイブ