まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

タグ:eclipse

IBM Cloud(Bluemix) のアカウントを所有していると、マネージドサービスとして利用できる GitLab が使えるようになります。サーバーのインストールなどは不要で、プライベートリポジトリを作成することも可能です:
2018011701


使い勝手は GitLab そのものだと思ってください。Issues 管理の機能も使えますし、IBM Cloud の Continous Delivery サービスと連携した Delivery Pipeline による DevOps サービスの一部としても利用できるようになっています。アカウントをお持ちの方は、単にプライベートリポジトリが使える Git として考えるだけでも便利だと思うので、是非活用してください。


ところで、この IBM Cloud の Git を使って Java のアプリケーションコードを管理しようと、作成したリポジトリから Eclipse の Git 機能を使って clone を試みた際に、稀に以下のようなエラーメッセージに遭遇し、クローンに失敗することがあります:
  :
  :
!MESSAGE https://git.ng.bluemix.net/dotnsf/javatest.git: cannot open git-upload-pack
!STACK 0
org.eclipse.jgit.api.errors.TransportException: https://git.ng.bluemix.net/dotnsf/javatest.git: cannot open git-upload-pack
  at org.eclipse.jgit.api.LsRemoteCommand.call(LsRemoteCommand.java:196)
  at org.eclipse.egit.core.op.ListRemoteOperation.run(ListRemoteOperation.java:99)
  at org.eclipse.egit.ui.internal.clone.SourceBranchPage$8.run(SourceBranchPage.java:324)
  at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
Caused by: org.eclipse.jgit.errors.TransportException: https://git.ng.bluemix.net/dotnsf/javatest.git: cannot open git-upload-pack
  at org.eclipse.jgit.transport.TransportHttp.connect(TransportHttp.java:499)
  at org.eclipse.jgit.transport.TransportHttp.openFetch(TransportHttp.java:308)
  at org.eclipse.jgit.api.LsRemoteCommand.call(LsRemoteCommand.java:175)
  :
  :

「git-upload-pack がオープンできない」という耳慣れないエラーメッセージで、実はこのメッセージそのものからは原因の追求が難しいものでした。同じようなエラーに遭遇する人が現れた場合に備えて、自分の経験と回避策を紹介します。

エラーメッセージそのものからはわかりにくにのですが、実は直接の原因は暗号化方式の不一致による通信エラーでした。

まず上記で紹介した IBM Cloud の Git 機能を https 接続で使う場合の暗号化方式には TLS v1.2 を使う必要があります:
https://console.bluemix.net/docs/services/ContinuousDelivery/git_working.html#git_local


さて、Eclipse が使う Java のバージョンが 1.8 以上であれば、デフォルト設定のままで TLS v1.2 が使われます。したがってこの場合は何もしなくてもそのまま IBM Cloud の Git を利用することができます。

一方、Eclipse の Java バージョンが 1.7 以下だった場合、デフォルト設定で採用される通信方式は TLS v1.1 以下です。つまり条件を満たしていないことになります。そしてこの条件で Git に接続しようとすると上記のようなエラーメッセージが表示されてしまうのでした。


では、このエラーメッセージが出た場合の解決策はどうすればいいのでしょうか? 1つの方法としてJava のバージョンを 1.8 以上にするという簡単な方法があります。Java 1.8 以上であれば上記のように(デフォルトで) TLS v1.2 が使われるので、この条件を満たすことができるようになります。

ただ何らかの事情で Java 1.8 を導入するわけにはいかない場合もあると思っています。そのような場合は以下の1行を eclipse.ini に追加した上で Eclipse を起動する、という方法もあります:
  :
  :
-Dhttps.protocols=TLSv1.2

この記述により、Java が 1.7 以下であっても強制的に https 接続時の暗号化方式を TLS v1.2 に指定することができ、やはり上記のエラーを回避することができるようになります。


IBM Cloud 以外の Git でも、同様のエラーメッセージが出た場合にはこの対策が有効だと思っています。頭の片隅に入れながら、無料で便利な IBM Cloud の Git を是非使ってみてください。


EclipseNode.js アプリケーションの開発(というかデバッグ)を行うことができるような環境を作ります。そのために Nodeclipse というプラグインを導入します:
2017022001


導入手順は Eclipse のメニューから Help - Install New Software を選択し、インストール元の URL には "http://nodeclipse.org/updates/" を指定します。しばらく待つと導入可能なプラグインの一覧が表示されるので、"1st Nodeclipse Core" と "Enide Tools Collection" の2つにチェックを入れてインストール作業を続行します。最後に Eclipse を再起動するよう指示されるので再起動します:
2017022002


導入作業はこれで終わり。以下は使い方の説明です。Eclipse が再起動したら、Node.js のアプリケーションプロジェクトが作れるようになっています。

Eclipse のメニューから File - New - Project を選択するとプロジェクトウィザードが起動します。その選択肢の中に Nodeclipse カテゴリがあり、そこから Node.js や Node.js Express のプロジェクトが作れるようになっているはずです。今回は試しに "Node.js Express Project" を選んでみました:
2017022003


いつものようにプロジェクト名(以下の例では "MyExpress01")を入力し、属性を設定します。テンプレートエンジンが何種類かの中から選べそうだったので、今回は個人的に慣れている ejs を選んでみました。最後に "Finish" をクリックしてプロジェクトを作成します:
2017022004


Node.js Express プロジェクトが作成された直後の様子です。ejs テンプレートを使ったシンプルなアプリケーションが生成されています。興味ある方は中身を個別に確認してみてください:
2017022009


Eclipse の全体画面がこちら。右上を見ると Node.js 用のパースペクティブが追加され、同パースペクティブで開いていることが確認できます:
2017022000


特に明示的には何も手を加えていないこの状態で一度実行してみることにします。app.js を右クリックし、Run As - Node Application を選択します:
2017022006


コンソールに起動メッセージが表示されます。3000 番ポートで起動しているようです:
2017022007


というわけでウェブブラウザで localhost:3000 にアクセスしてみます。こんな画面になれば成功です。このページ自体は app.js から routes/index.js が呼ばれ、views/index.ejs をテンプレートとしたレンダリングが行われた結果が表示されています。ここまで確認できたら一旦サーバーを停止しておきましょう:
2017022008


では次に今の様子をデバッグしてみることにします。まず routes/index.js を開き、レンダリングを行っている箇所にブレークポイントを仕掛けてみます(該当行の左側をダブルクリックしてブレークポイントマークが付いたことを確認します):
2017022001


今度はデバッグモードで Node.js を起動します。app.js を右クリックして Debug As - Node Application を選択します:
2017022002


デバッグモードでの起動を明示したので、Eclipse のパークペクティブをデバッグ用に切り替えるか?という確認ダイアログが表示されることがあります。その場合は "Yes" を選択します:
2017022003


Debug パースペクティブに切り替わります。同時にアプリケーションがデバッグモードで起動し、最初の1行目で止まった状態になります(まだ起動していないのでブラウザからはアクセスできません)。F8 を押すか、メニュー下の Resume アイコン(右向きの緑の矢印)をクリックして、実行を続けます:
2017022004


コンソールに先程のようなメッセージが表示されるとサーバーが起動してことを意味します。ではあらためてこの状態でウェブブラウザから localhost:3000 にアクセスしてみます:
2017022005


先程のような画面が表示される前にブレークポイントを設定していたので、そこで停止しているはずです。Eclipse の画面を確認すると指定したブレークポイントで止まっている様子が確認できるはずです:
2017022006


この状態で各種変数の値を確認したり、ステップ実行したり、・・・といった、いわゆるデバッグ作業を行うことができるようになっています。最後にもう一度 Resume して処理を続けます:
2017022007


Resume 後にウェブブラウザを確認すると、先程と同じ画面が表示されているはずです:
2017022008



Nodeclipse の紹介はざっとこんな感じ。ところで、Node.js の開発に Eclipse を使うのって、結構マイノリティな気がしているが、実際のところどうなんでしょ??


(参考)
http://qiita.com/suesan/items/7f2c4863feb87a623517

普段は Eclipse で Java のコーディングをしています。そして開発時のアプリケーションサーバーには Jetty を使っています。最近この開発環境を構築する際の手順を久しぶりに行ったのでまとめておきました:

まず Eclipse に Java EE の開発環境までは導入済みであると仮定します(或いは初めから Java EE 開発環境を選択して Eclipse をインストールします)。その Eclipse に Jetty のプラグインを導入して、開発環境を構築します。

Jetty プラグインをインストールするには、Eclipse のメニューから Help - Eclipse Marketplace を選択します:
2017013101


マーケットプレースのダイアログが開いたら、検索ボックスに "jetty" と入力して検索します。検索結果の中に
 ・Eclipse Jetty
 ・Run-Jetty-Run
が含まれているはずなので、これらを1つずつインストールします(まとめての導入はできないので、2回に分けてインストールを実行します)。インストールが完了したら Eclipse を再起動:
2017013102


これで開発用アプリケーションサーバーに Jetty を使った開発が可能になります。開発中のウェブアプリケーションをこの環境下で実行するにはプロジェクトを右クリックし、Run As を選ぶと、実行方法の選択肢の中に "Run Jetty" というものが追加されているはずです。これを選択します:
2017013103


すると選択中のウェブアプリケーションが Jetty に読み込まれた形で起動します。起動時のポート番号は 8080 番です:
2017013104


ウェブブラウザで http://localhost:8080/(プロジェクト名) にアクセスすると、開発中のウェブアプリケーションに試験アクセスすることができます:
2017013105


今はいちいち Jetty を別途インストールする手間とか不要になったんですね。こりゃ便利!

自分はコーディング時のエディタを使い分けています。具体的には Java の場合は Eclipse 、それ以外は vi/vim を使うことが多いです。他がどうとかいうつもりはありませんが、指がショートカットを覚えているので生産性がいいと思っています。個人的にはこれらの使い分けで戸惑うことはありませんでした。

そんな時に Vrapper という Eclipse プラグインの存在を知りました。Eclipse 内のコーディングキーバインドを vi 風にする、というものです:
2017012801


そんなものが存在していてもおかしくはないだろうな、と思っていましたが、具体的なものを知ったのは初めてでした。試しに最新バージョンの 0.70.0 を使ってみました。

Vrapper を使う前提として、Eclipse は 4.0 以上である必要があるとのことでした。というわけで Juno (4.2)以降の Eclipse 環境を用意する必要があるのですが、今回は Eclipse Neon(4.6) 環境を用意して導入してみました。以下、その時の様子を紹介します:

Vrapper の導入方法は他の Eclipse プラグインと同様です。 まずはメニューの Help - Install New Software を選択:
2017012801


プラグインの Updatesite を指定します。このページによると同プラグインの安定版の Updatesite は http://vrapper.sourceforge.net/update-site/stable らしいので、この URL を指定します。するとインストール可能なプラグインの一覧が表示されるので、必要なもの(特定の言語依存のプラグインを導入しないのであれば) "Vrapper" 本体と "Optional Vimscript Plugins")にチェックを入れて先に進みます:
2017012802


インストール中の様子です。しばらく待ちます・・・:
2017012803


このようなダイアログが出たら Eclipse を再起動します。再起動後に Vrapper が有効になります:
2017012804


Eclipse 再起動後に、どんな感じが試すために1つプロジェクトを作ってみました:
2017012805


Java プロジェクトを作って、その中に MySample01.java というファイルを新規に追加しています:
2017012806


すると(静止画像では伝わりにくいのですが・・・)テキストファイル内のカーソル移動、編集モードへの移行(i)、ビューモードへの移行(ESC)など、キーバインドが vi/vim 風に切り替わっています。おお、なんか変な感じ(笑)!:
2017012807


":" を押してコマンドモードに移動する操作も再現できています。vi/vim では ":sp (ファイル名)" で画面を分割して2つのファイルを同時に編集することができますが、同じことをやってみます:
2017012808


Eclipse の2ファイル同時編集モードが上下にタイル分割されて実行されました!すげー、元の機能をうまいこと使って融合できているようです:
2017012809


もちろん ":q" で終了できます:
2017012810


はい、元の1画面モードに戻りました:
2017012811


というわけで、vi/vim の基本的なキーバインドは再現できているようです。これで Eclipse 内でも vi/vim のキー操作が使えるようになって超便利・・・なのかどうかはまだよくわかりません(苦笑)が、面白いプラグインであることは間違いなさげ。

IoT アプリ開発をする上で避けて通れないのが MQTT(Message Queuing Telemetry Transport) プロトコルです。デバイスやセンサーなどのマシン間接続(いわゆる "M2M")用に IBM を中心に提唱された軽量プロトコルで、Node-RED や IBM IoT Foundation Quickstart などでも使われています。

そして、この MQTT をアプリケーション実装する上で便利なライブラリPaho です。これも元々は IBM が開発したものをオープンソースとして Eclipse Foundation に寄贈し、現在は Eclipse プロジェクトの1つとして公開されています:

http://www.eclipse.org/paho/
paho_logo_400


この Paho ライブラリを使うことで MQTT の詳しいプロトコル仕様を理解することなく、MQTT アプリケーションを開発することが可能になります。プログラミング言語としても C/Java/Java Script/Python など、多くの言語に対応しており、PC やスマホ、組込機器など、多くのデバイスで利用することができるようになっています。

そして、この Paho の Java ライブラリを使って、実際に IBM IoT Foundation Quickstart の MQTT ブローカー( quickstart.messaging.internetofthings.ibmcloud.com:1883 )に接続して、MQTT パブリッシュ処理を行うサンプルを作ってみた時の様子をこちらで紹介しています:
QuickStart MQTT ブローカーに Java からパブリッシュする

QuickStart は IBM が公開している MQTT ブローカー(サーバー)で、認証なしであれば誰でも使うことができます。また上記リンク先でも紹介していますが、ここにパブリッシュされたメッセージは IBM BluemixNodeRED アプリケーションを使って簡単に取得したり、データベースに格納したり、データフローを定義することができるようになります。


IoT アプリ開発者にとって、この Paho は慣れておくことが必須のライブラリだと思いました。


このページのトップヘ