以下の内容はhttp://blog.livedoor.jp/splus_r/archives/cat_50046708.htmlより取得しました。


JavaもEclipseもいろいろなパッケージがありすぎてどれをインストールしていいのか、よくわかりません。何度やっても忘れるので、ここに備忘録的に残しておきます。

Java JDKのインストール

Javaは現在は私企業であるOracleの所有物になりました。以下のサイトからダウンロードして、あとはインストーラーの指示に従うだけです。

http://www.oracle.com/technetwork/java/javaee/overview/index.html

最初の難関は、SEにするのかEEにするのかです。結論からいうと、Servletを使う場合はEEで、そうでない場合はSEです。僕はServletを使うので、EEの方です。

Java EE 6 SDK RefreshedのDownloadをクリックすると、Windowsの場合、次の4つが選べます。

java_ee_sdk-6u3-jdk7-windows-ml.exe
java_ee_sdk-6u3-jdk7-windows-x64-ml.exe
java_ee_sdk-6u3-jdk7-windows.exe
java_ee_sdk-6u3-jdk7-windows-x64.exe

-mlはMulti-Languageのことで、英語以外も使うことがある人は-mlを選びましょう。ほとんどの人がこちらだと思います。x64は64bit OSのことです。何もついていないのが32bit OSです。自分のWindowsがどちらかわからない方。すいません、僕には何ともできません。僕のPCは64bitのWindows7なので、x64の方をインストールしました。

Eclipseのインストール

まず、以下のサイトからダウンロードしましょう。

http://www.eclipse.org/

Downloadsというタブを押すといろいろ出てくると思います。たぶん、"Eclipse IDE for Java Developers"で十分なんですが、Servlet関係のプログラミングで必要なものが入ってる"Eclipse IDE for Java EE Developers"の方にしておきましょう。大は小を兼ねるので。ここでもOSが32bitなのか64bitなのか選ばなければいけません。僕は64bitです。

そしてEclipseのインストールは、ダウンロードした圧縮ファイルを解凍して、出てきたEclipseフォルダを丸ごとどこかに置くだけです。僕は自分のユーザー・フォルダのすぐ下に置いています。

実は、Eclipseはさまざまなプラグインが最初から入っている日本語化した全部入りパッケージというのがあって、業界ではそれを使うのが一般的なようです。僕は、英語のまま使いたいし、余分なものは極力入れたくない派なので、個別にインストールしています。

Pleiades - Eclipse プラグイン日本語化プラグイン

さて、以上が終わったら、ググッて、EclipseのHello Worldプログラムでも試してみましょう。

次回はSubversionとGoogle App Engine SDKのインストールの備忘録です。

GoogleはApp Engineという無料で使えるクラウド・システムを提供しています。最近までPythonしか使えませんでしたが、Javaもサポートするようになりました。サーブレットやJSPが動くので非常に便利なクラウドです。月間500万ページビュー程度までは無料でいけるようです。さらにリソースが必要だったり、パフォーマンスを上げたい場合は課金設定をしてGoogleに多少お金を払う仕組みです。いずれにしても個人営業のサイトだと、無料の範囲でほぼ問題なさそうです。

しかしこんな夢のようなシステムですが、現在稼動しているJavaのWebアプリケーションをそのまま使えるかというとそうは問屋が卸しません。次のような大きな制約があります。

1. SQLデータベースが使えない。
2. ファイルが書き出せない。
3. SwingやAWTなどのJavaのグラフィック関連のクラスが全滅。

1のSQLデータベースがそのまま使えないというのは、多くの業務用Webアプリケーションにとってそうとう痛いでしょう。これはBigtableというNon-SQLデータベースに置き換わります。これだけのクラウド・リソースを不特定多数のユーザーに無料で提供するには、やはりSQLデータベースは制限せざるを得ないようです。僕はまだあまり詳しくありませんが、BigtableはGoogleの様々なアプリケーションに応用されている高速データベースです。要はSQLデータベースで作ったものはそのままでは動かないということです。

2もセキュリティーの問題から制限せざるを得なかったようです。ファイルはもちろんアップロードできるのですが、App Engine上のプログラムからファイルを作ることはできません。データを動的にストアする必要があればBigtableを使うことになります。

3ですが、これはけっこう痛かったりします。というのも、JavaにはJFreeChartのようにフリーのグラフを作ったりするライブラリがたくさんあって、それらが全く使えなくなるからです。GoogleはSwingやAWTの代わりのクラス・ライブラリを提供していますが、長年使い込まれてきたライブラリが使えないのは痛いでしょう。その他にもグラフィックがなくても実はSwingやAWTのクラスを使っているライブラリはいろいろあって、ほぼ全滅状態です。

しかし、これらの制約を回避できるならば、Google App Engine for Javaは極めてパワフルなクラウド環境を無料、もしくは非常に安価に提供してくれます。個人で面白サイトを作ったりする場合なんかは非常にいいサービスですね。ただJavaの業務用アプリケーションを移植するのは結構大変そうです。

ここでは僕の備忘録も兼ねて、Google App Engineのはじめかたを簡単にまとめておきます。

I. Google App Engineのアカウント登録

とりあえずGmailアカウントが必ず必要なのでひとつ用意してください。それからGoogleサイトにわかりやすい説明があるのでひと通り読みます。

Google App Engine スタート ガイド

読み終わったらいよいよ登録しましょう。しかしここで携帯電話のメルアドがひとつ必要になります。ロボットによる大量アカウント取得を避けるために携帯電話のメルアドにパスワードを送って認証しています。Googleにまたひとつ個人情報を取られるわけですが、しょうがないので登録しましょう。あとは指示に従っていけば簡単にアカウントを作れます。ここでアプリケーションの名前を決めますが、URLは次のようになります。

    http://アプリケーション名.appspot.com

このアプリケーション名は10個までひとつのアカウントで作れますし、それぞれのアプリケーションが複数のバージョンを持つことができます。リリースするときは普通ドメインを取るでしょうから、これだけたくさん使えれば十分でしょう。もちろん独自ドメインを使うこともできます。

II. GoogleプラグインをEclipseにインストール

これもGoogleのサイトにわかりやすく書いてあります。

Google Plugin for Eclipse の使用

ツールバーの[Help]の[Install New Software...]にいって、"http://dl.google.com/eclipse/plugin/3.6"を[Add...]します。最後の数字がEclipseのバージョンに対応しています。僕は最新の3.6を使っているのでこのようになります。[Google App Engine Java SDK]と[Google Web Toolkit SDK]を選択してあとは指示に従っていけばインストールできます。

III. Google App Engineで"Hello World!"

それではいよいよ最初のプログラムをデプロイ(deploy)してみましょう。ちなみにWebプログラミングの世界ではプログラムをサーバーに上げることをデプロイといいます。もともとは英語の戦争用語で部隊を配備するというような意味です。

Eclipseのツールバーの[File]の[New]で[Web Application Project]を選択します。プロジェクト名とパッケージ名を決めましょう。それからUse Google Web Toolkitのチェックを外します。

Google App Engine のプロジェクトを作る


このプロジェクトにアプリケーション名を教えてやる必要があります。Project Explorerのプロジェクトの上で右クリックして[Properties]を選択します。[Google] > [App Engine]のApplication IDのところで最初に登録したアプリケーション名をいれてください。

それではデプロイしてみましょう。デプロイは飛行機ボタンです。ここでGoogle App Engineを登録したGmailアドレスとパスワードが必要になります。どうですか? うまくいきましたか? ブラウザで"http://xxx.appspot.com/"を見てみましょう。"Hello App Engine!"と出てくれば成功です。

これでJavaのサーブレットやJSPが動くようになりましたね。JSPで注意しないといけないのは、Google App EngineはコンパイラにJDKを指定しないとうまく動かないことです。Project ExplorerのJRE System Libraryを右クリックしてAlternate JREで最新のJDKを選択してください。JDKが登録されていなかったら登録してしてください。なぜかJSPはJDKじゃないとうまくコンパイルできませんでした。

以下に使えそうな参考書をリストしておきます。





Subversionというのはバージョン管理ツールの定番です。バージョン管理というと、ファイル名をhogehoge.java.bakとかにして古いコードのバックアップをとっていったり、フォルダごとコピーしておいたりする方法が最も原始的で簡単ですが、これだと複数のプログラマーで開発していたり、ひとりでも複数のPCで開発していたりするとかなり面倒になってきます。そこでバージョン管理してくれるSubversionというとても便利なフリーのプログラムがあります。僕はインストールしようとして、けっこうハマったので、このエントリーに備忘録的にインストールの仕方を書いておきます。

まずはコマンドラインで使うオリジナルのSubversionを落としましょう。公式サイトです。

Apache Subversion

ここで自分のOSのバイナリー・パッケージを探してください。僕は次のサイトで落としました。

SourceForge.net > Subversion for Windows

実際のところ、Eclipseから使うので、このコマンドラインのバージョンはあまり使うことはありませんが、最初にレポジトリを作るときに必要です。レポジトリはコマンドプロンプトを起ち上げて、レポジトリを置きたいフォルダに"CD"で移動して、"svnadmin create ."で作れます。このレポジトリを後からEclipseで使います。

さて、さっそくEclipseにSubversionをインストールするのですが、これがけっこう曲者で落とし穴がいくつかあります。コネクターを別にインストールしないといけないのですが、これがヴァージョンが最近上がったらしくて、本やググると出てくるサイトに書いてある通りにやってもうまくいかないからです。それでは順に説明していきます。Eclipseは最新の3.6(Helios)です。

メニューの"Help > Install New Software"で次のサイトを"Add"してください。

http://download.eclipse.org/technology/subversive/0.7/update-site/

ここで"Helios - http://download.eclipse.org/releases/helios"を選べと、本やググると出てくるサイトに書いてありますが、これをやるとなぜかコネクターがインストールできなくなります。

Subversive Install

"Subversive SVN Team Provider (Incubation)"を選んでください。あとは支持に従いインストールします。ちなみにEclipseのSubversionプラグインは他にもいいものがあるらしいですが、Eclipseは近い将来にSubversionを最初からサポートするらしくて、その際にSubversiveになるそうです。よってSubversiveが推奨されているので、僕もこれを入れました。

Eclipseで最初にSubversionを使おうとすると、コネクターのインストールを要求されます。コネクターが著作権の関係で別にインストールしなければいけないようです。

Subversive Connector

"SVN Kit"の最新バージョンをインストールしました。この場合は1.3.3ですね。

以上でSubversionのインストールは完了です。次回はSubversionの使い方を簡単に説明します。

参考資料



渋い本です。まさかJavadocだけで一冊の本があるとは。

Javadocというのは、Javaのソースコードでクラスやメソッドや引数や戻り値について決められた書式でコメントをつけていくと、ポンと自動的にマニュアルをHTMLドキュメントで作ってくれるプログラムです。Javaのコンパイラーに最初からついていますね。

ひとりでプログラムを書いているとJavadocなんて無視しちゃうんですけど、そうすると自分で書いたコードも何をやっているのか思い出すのに非常に時間がかかりますよね。ましてや人に使ってもらうためのコードだったらなおさらです。この本はどのようにコメントをつけていけば、役に立つドキュメントが作れるのかを懇切丁寧に説明しています。

コーディングの生産性を上げるためにはカプセル化(encapsulation)というのが欠かせません。カプセル化というのは、内部のデータ操作や計算処理を外からアクセスできなくして、クラスをブラック・ボックスにすることです。必要な機能を実現するために必要最小限のメソッドだけをパブリックにします。Javaでソースコードを書くとき、プログラムがインスタンス変数に直接アクセスできるようにしては絶対にいけません。どんな場合でもオブジェクトのデータを扱う場合は、そのオブジェクトのメソッドを通して「のみ」にしないといけません。

なぜそんなことが必要なのでしょうか。たとえばあるプロジェクトでは1000個の関数(メソッド)が必要だとしましょう。ある処理の途中でバグが発生して、データがおかしくなってしまったとします。そのデータがどの関数からもアクセス可能だったら、1000個のメソッドを調べていかなければいけません。ところが10個のメソッドを持つ100個のクラスで設計していたら、おかしくなったデータを持つクラスのなかの10個のメソッドだけを調べればいいでしょう。よって、クラスを作るときに、内部のデータには絶対に直接触れるようにしてはいけないのです。またそうすることによって、クラス内部のデータ構造や計算処理を変更しても、外からは最小限のメソッドだけを通してアクセスしていますから、他のクラスには影響しなくなります。

さて、うまくカプセル化されたクラスを作ったとして、そのクラスを他の人(自分も含む)がいつでもすぐに使えるようにするためにいいドキュメントが必要なのです。基本的にクラスを作るとき、そのクラスの使い方が中身を見なければわからなかったら「負け」なのです。カプセル化して自然言語で必要かつ十分な説明を書いて、はじめて完成されたクラスになります。

それではみなさんもこの本を読んで「ちゃんとした」ドキュメントを作れるようになりましょう。僕も心がけます。もう二度とコメントが全くないソースコードなんか書いたりしません。(笑)

ウェブでグラフをお気楽に動的に生成したいときはGoogle Chart APIがとても便利です。それではこのGoogle Chart APIの使い方を勉強しましょう。とりあえず下のURLをブラウザにコピペしてみましょう。
http://chart.apis.google.com/chart?cht=lc&chs=300x200&chxt=x,y&chxtc=0,5|1,5&chxr=0,0,1.0E2|1,0,5.35E1&chds=0,5.35E1&chtt=Premium&chco=00FF00&chd=t:0,0,7.05E-6,2.59E-3,6.39E-2,4.54E-1,1.64E0,3.99E0,7.55E0,1.21E1,1.75E1,2.33E1,2.94E1,3.57E1,4.21E1,4.86E1

すると下のようなグラフがでてくるはずです。
(このグラフもGoogle Chart APIで直接生成しています。)
Google Chart API実験

Google Chart APIとはこのようにURLにパラメータをいろいろ貼りつけてポンとチャートを作るサービスです。もちろん無料です。さまざまなことができるのですが、今日は一番良く使いそうなライン・チャートを勉強します。

http://chart.apis.google.com/chart?

この後にどんどんパラメータをわたしてやります。

cht=lc これはこのチャートの種類がライン・チャートですよとGoogleに教えています。
chs=300x200 300ピクセルx200ピクセルのチャートを作ります。
chxt=x,y 目盛りはx軸とy軸に用意します。
chxtc=0,5|1,5 x軸の補助目盛りとy軸の補助メモリをそえぞれ5ピクセルにします。
chxr=0,0,1.0E2|1,0,5.35E1 x軸(0)の範囲は0.0〜100、y軸(1)の範囲は0.0〜53.5です。
chds=0,5.35E1 y軸のスケールを教えてやります。
chtt=Premium チャートのタイトルです。
chco=00FF00 線の色です。

chd=t:0,0,7.05E-6,2.59E-3,6.39E-2,4.54E-1,1.64E0,3.99E0,7.55E0,1.21E1,1.75E1,2.33E1,2.94E1,3.57E1,4.21E1,4.86E1
最後のところでyの値を全部教えます。xの値を指定しなくていいのはこのライン・チャートではyのデータは等間隔にx軸上に並んでいると仮定されるからです。
ここがちょっとわかりにくいところなんですが、y軸の目盛りに何を指定しようとも、デフォルトではy軸は0が一番下で100が一番上になっていることです。chxrによるy軸の範囲の指定はあくまで見た目を変えるだけなのです。

そこで0〜100になるように元のデータを加工するか、y軸のスケールを明示的に変えてやる必要があります。後者のほうが簡単で、chdschxrと同じにしてやればOKです。

最後に参考のために、ライン・チャート用のURLを生成するJavaのクラスをコピペしておくので、必要な方は使ってみてください。バグを見つけたり、改善したりしたら教えてくれたらありがたいです(笑)。

参考資料
Google Chart Tools / Image Charts (aka Chart API)



Google Chart API 入門 その1 ライン・チャート
Google Chart API 入門 その2 その他のチャート
Google Chart API 入門 その3 数式


/**
* A class to generate a URL Get request for a line chart with Google API Chart
*
* @author Kazuki Fujisawa
*
*/
public class googleXYChart
{
 /**
  * @param xyData
  *
  * xyData[0][0,1,...n]: x date set, xyData[1][0,1,...n]: y date set.
  * x data points have to be placed evenly and in ascending order across the x-axis.
  */
 public googleXYChart(
   double[][] xyData
   )
 {
  data = xyData;
  numData = xyData[0].length;
  setXrange();
  setYrange();
 }

 /**
  * @param xSize chart x-size
  * @param ySize chart y-size
  */
 public void setSize(int xSize, int ySize)
 {
  x_size = xSize;
  y_size = ySize;
 }

 /**
  * @param chartTitle chart title
  * Space is +, eg., Kazuki Fujisawa is "Kazuki+Fujisawa"
  */
 public void setTitle(String chartTitle)
 {
  title = chartTitle;
 }

 /**
  * @param lineColor chart color
  * Red: FF0000, Green: 00FF00, Blue: 0000FF
  */
 public void setColor(String lineColor)
 {
  color = lineColor;
 }

 /**
  * @return A URL Get request
  */
 public String getChartURL()
 {
  String url = "http://chart.apis.google.com/chart?cht=lc&";
  url += "chs=" + Integer.toString(x_size) + "x" + Integer.toString(y_size)+ "&";
  url += "chxt=x,y&";
  url += "chxtc=0,5|1,5&";
  url += "chxr=0," + getStrEfficientRound(x_start,4) + "," + getStrEfficientRound(x_end,4) + "|";
  url += "1," + getStrEfficientRound(y_start,4) + "," + getStrEfficientRound(y_end,4) + "&";
  url += "chds=" + getStrEfficientRound(y_start,4) + "," + getStrEfficientRound(y_end,4) + "&";

  if(title!=null)
  {
   url += "chtt=" + title + "&";
  }

  if(color!=null)
  {
   url += "chco=" + color + "&";
  }

  url += "chd=t:";
  for(int i=0;i   {
   url += getStrEfficientRound(y[i],5);
   
   if(i!=numData-1)
   {
    url += ",";
   }
   else
   {
    url += "";    
   }
  }

  return url;
 }
 
 /**
  * @param value double value which will be rounded and converted into a String.
  * @param effectiveDigit effective digit for the rounding
  * @return String in the form of #.###E# like 1.2345E6
  */
 public static String getStrEfficientRound(double value, int effectiveDigit)
 {
  if(value == 0.0)
  {
   return "0";
  }
  
  int valueDigit = 0;
  double absValue = Math.abs(value);
  String sign = null;
  if(value < 0.0)
  {
   sign = "-";
  }
  else
  {
   sign = "";
  }
  
  valueDigit = (int)Math.floor(Math.log10(absValue));
    
  if(valueDigit < -10)
  {
   return "0";
  }

  double effNumber = absValue / Math.pow(10.0, (double)valueDigit);
  effNumber = (int)Math.round(effNumber*Math.pow(10.0, (double)(effectiveDigit-1)));
  effNumber = effNumber/Math.pow(10.0, (double)(effectiveDigit-1));

  String z = Double.toString(effNumber);
  
  if(z.length() <= effectiveDigit+1)
  {
   return sign + z + "E" + Integer.toString(valueDigit);
  }
  else
  {
   return sign + z.substring(0,effectiveDigit+1) + "E" + Integer.toString(valueDigit);
  }
 }

 private void setXrange()
 {
  x_start = data[0][0];
  x_end = data[0][numData-1];
 }

 private void setYrange()
 {
  setYminYmax();
  y = data[1];
  
  if((yMax-yMin)==0.0)
  {
   if(yMax==0.0)
   {
    y_start = -1.0;
    y_end = 1.0;
   }
   else
   {
    y_start = 0.0;
    y_end = yMax * 2.0;
   }
  }
  else
  {
   y_start = yMin;
   y_end = (yMax - yMin) * 0.1 + yMax;
  }
 }
 
 private void setYminYmax()
 {
  yMin = data[1][0];
  yMax = data[1][0];
  
  for(int i=0;i   {
   if(yMin > data[1][i])
   {
    yMin = data[1][i];
   }
   
   if(yMax < data[1][i])
   {
    yMax = data[1][i];
   }
  }
 }
 
 private int numData = 0;
 private double[][] data = null;
 private double[] y = null;
 private double yMin = 0;
 private double yMax = 100;
 private String title = null;
 private String color = null;
 private int x_size = 300;
 private int y_size = 160;
 private double x_start = 0;
 private double x_end = 100;
 private double y_start = 0;
 private double y_end = 1;
}



以上の内容はhttp://blog.livedoor.jp/splus_r/archives/cat_50046708.htmlより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14