2009年4月8日水曜日

ApacheTomcatの設定をCGI確認用に変更する

1.$CATALINA_HOME/conf/server.xmlを変更する
  ・ポート番号を「8080」から「80」へ変更
   94行目: 
  ・

2. コンテンツを入れる
 $CATALINA_HOME/webapps/ROOT/ ディレクトリの中身を全て削除する。

 $CATALINA_HOME/webapps/ROOT/ にコンテンツをアップロードする。

3.httpファイルの確認
 http://localhost/
  ・静的なコンテンツの確認ができます。
  ・デザインや外部リンク/内部リンクの確認
  ・文字化け等の確認


-------------------

CGI部分の確認

まず、「%CATALINA_HOME%\server\lib」フォルダ以下のservlet-cgi.renametojarファイルを、servlet-cgi.jarに名前を変更します。

1.$CATALINA_HOME/conf/web.xmlを変更する

PuppyLinuxにApacheTomcatをインストールする

1.ApacheTomcatをダウンロードする。
 http://tomcat.apache.org/ から[Download] => [Tomcat5.5]を選ぶ。
 ([Tomcat6.x]もありますが、不必要に最新版を求める必要はありません。ここでは使い慣れたTomcat5.5を採用します。)
 
 [5.5.27] => [Binary Distributions] => [Core] => [tar.gz]
をダウンロードします。
  apache-tomcat-5.5.27.tar.gz

2.Tomcatを解凍する。
 '/opt'に解凍することにしました。
Tomcatを解凍
# cd /opt
# tar -xvzf /root/apache-tomcat-5.5.27.tar.gz
/apache-tomcat-5.5.27/......
/apache-tomcat-5.5.27/......
:
:
#
'/opt/apache-tomcat-5.5.27/'ディレクトリが作成されます。

3.環境変数「CATALINA_HOME」を設定する。
環境変数の設定('/root/.bashrc'に追記する)

export CATALINA_HOME=/opt/apache-tomcat-5.5.27

いったん、ターミナルを閉じる。

4.TOMCATを起動する。
Tomcatを起動
# $CATALINA_HOME/bin/startup.sh
Using CATALINA_BASE: /opt/apache-tomcat-5.5.27
Using CATALINA_HOME: /opt/apache-tomcat-5.5.27
Using CATALINA_TMPDIR: /opt/apache-tomcat-5.5.27/temp
Using JRE_HOME: /opt/jdk1.6.0_10
#
5. TOMCATの動作を確認する
Webブラウザ
http://localhost:8080/
かわいくないトラ?ネコ?のマークが表示されれば成功です!

(補足)TOMCATを停止する。
Tomcatを停止
# $CATALINA_HOME/bin/shutdown.sh
Using CATALINA_BASE: /opt/apache-tomcat-5.5.27
Using CATALINA_HOME: /opt/apache-tomcat-5.5.27
Using CATALINA_TMPDIR: /opt/apache-tomcat-5.5.27/temp
Using JRE_HOME: /opt/jdk1.6.0_10
#

2009年4月6日月曜日

PuppyLinuxにsunのJavaSE(JDK/SDK)をインストールする

CGI動作確認環境を作成するために、PuppyにWebサーバーをインストールする。
Webサーバーには「Jakarta-Tomcat」をインストールすることにしました。

”CGIの動作確認に なぜ? 「Apache HTTPD」を使わないのか?”
という疑問をお持ちになる方が居るかと思いますが、説明が長くなるので"いろいろ検討した結果「Tomcat」がベスト!"との結論に達した。とだけ答えておきます。
選択理由に興味がある方はコメントください。

Tomcatの動作にはJavaが必要です。それも、普通のJavaRE(ランタイム)ではなく、JavaSE(開発キット)版が必要になります。こいつをインストールした時点でPuppyは「かわいい子犬」から「獰猛な大型犬」へ変身してしまいます。USBブートだの1CDだのという贅沢はとは決別して「FULLインストール」してください。
以降、「FULLインストール」でのやり方。
  OS: PuppyLinux 4.1.2.1 日本語版 (Full install)
  H/W: Virtual PC (128MB) - Windows XP


* PuppyLinuxにsunの純正JavaSE(JavaDevelopmentKit / Sdk)をインストールする。

1.JavaSEのSTSをダウンロードする。
PuppyのPET置き場から「jdk_netbeans-1.6u10_6.1.sfs」をダウンロードする。
http://www.puppylinux.ca/tpp/bugs/

2.ダウンロードしたファイルをpuppyのファイルマネージャでクリックすると、ファイル内に「root / opt / usr」の3つのディレクトリが見えます。この3つのディレクトリをまるごと「/」ルートディレクトリに上書きコピーします。

3. puppyを再起動させてください。

Javaの起動確認
# java -version
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) Client VM (build 11.0-b15, mixed mode)
#
'/opt/jdk1.6.0_10'にインストールされます。
リンク:'/usr/java'は、
'/opt/jdk1.6.0_10/jre'を指し示しています。


環境変数の設定('/root/.bashrc'に追記する)

export JAVA_HOME=/opt/jdk1.6.0_10

2009年4月3日金曜日

Apache2.2 のPETパッケージを作成してみた

PuppyLinux 4.1.2.1用のPetパッケージをソースからコンパイルして作成してみました。


[httpd-2.2.11-i686.pet] - Apache 2.2.11

インストールすると、「/usr/local/apache2」ディレクトリ配下に展開されます。
自動起動はしません。

Apache2の起動
#  /usr/local/apache2/apachectl start
httpd (pid 3916) already running
#
Apache2の停止
#  /usr/local/apache2/apachectl stop
#

Webコンテンツは、「/usr/local/apache2/htdocs」ディレクトリ配下に配置してください。


再度PETパッケージを作成するには(パッケージ作成者のみ)
Petの再作成
#  cd /root/mypet
# tar -c -f httpd-2.2.11-i686.tar httpd-2.2.11-i686/
# gzip httpd-2.2.11-i686.tar
# tgz2pet httpd-2.2.11-i686.tar.gz
#

2009年3月31日火曜日

JavaMailで日本語のメールを送信する

メールを送信するというとても基本的なプログラムのサンプルです。
このプログラムは、10年以上も前に書いたものですが、基幹システムの運用状況をレポートするためのツールとして今でも良く利用されています。

あまりにも基本的な機能のためかどうか知りませんが、メールを送信するサンプルプログラムは意外と少ないようです。
たまにサンプルが在っても、JavaMailの簡単な使い方だったり英語圏のサンプルだったりするわけです。
若いプログラマーや外人プログラマーが日本語のメール送信機能をプログラミングすると、必ずといっていいほど文字化けします。
これは、日本語の文字コードが'JIS'/'shift JIS'/'EUC'/'UniCode' と複数のコード体系があることに起因しているからでしょう。
他の国では、中国なら中国語の文字コード、韓国ならハンブル文字コードというようにたいていは国毎にひとつの文字コードとなっているようで、外国人のプログラマーに日本の文字コードのことを説明してもなかなか理解してもらえません。
外国人のプログラマーはたいてい、ロケール情報を取得して取得した文字コードでエンコードしてメールを送ってしまいます。(上の画像を参照)
たいていは送信者がWindowsXPから送信しますので'ShiftJIS'で送信することになります。
ほとんどのメーラーは「JIS」コードしか扱えませんので、受け取り側は文字化けして読めなくなります。
ところが、最近はメーラーも賢くなってきて、文字コードを自動判別してしまうものがあります。このようなメーラーの出現によってプログラマーのミスが顕在化しなくなってしまいました。
 「テストではちゃんと動きましたよ。お客様がお使いのメーラーのバグじゃないですか」
などとほざく若いプログラマーも出現しはじめて、事態をいっそう混乱させています。

いまどきの日本のプログラマーよ、メールはこうやって送ればいいのだよ!

JapaneseMailSample.java

package jp.co.areaweb.tools.common;

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class JapaneseMailSample {
static String to = "yuu.hayashi@gmail.com"; // あて先(To)
static String from = "hayashi.yuu@gmail.com"; // from
static String subject = "Java mail 日本語題名テスト"; // subject
static String content = "漢字本文\nカタカナ\nハンカク"; // content
static String mailHost = "smtp.gmail.com"; // SMTP(mailHost)

public static void main(java.lang.String[] args) {
try {
Transport.send(createMessage());
} catch (Exception e) {}
}

static MimeMessage createMessage() throws Exception {
Properties props = new Properties();
props.put("mail.smtp.host", mailHost);
Session session = Session.getDefaultInstance(props, null);
MimeMessage msg = new MimeMessage(session);

InternetAddress[] toList = new InternetAddress[1];
toList[0] = new InternetAddress(to);

// あて先(To)
msg.setRecipients(Message.RecipientType.TO, toList);

// 発信元(From)
msg.setFrom(new InternetAddress(from));

// 題名(Subject)
msg.setSubject(MimeUtility.encodeText(subject, "iso-2022-jp", "B"));

// 本文(Content)
MimeMultipart naiyou = new MimeMultipart();
msg.setContent(naiyou);
MimeBodyPart honbun = new MimeBodyPart();
honbun.setContent(content, "text/plain; charset=\"iso-2022-jp\"");
naiyou.addBodyPart(honbun);

return msg;
}
}

【ポイント】
題名と本文は、’JIS(ISO-2022-JP)’でエンコードしてから送ること!

実行には「mail-1.4.jar」と「activation-1.1.jar」が必要です。

2009年3月27日金曜日

PuppyLinux を自動起動させる

超初心者ねた

最近、PuppyLinuxにはまっている・・・
WindowsXPを入れると使い物にならないPC(Pen3-450MHz,128MB)にPuppyを入れると見事に現役に復帰した。
WindowsではできなかったネットラジオからのMP3もいとも簡単に実現したうえに、YouTUBEやらDivXまでこの非力なマシンでこなしてしまったのには驚いた。
昨日まで産業廃棄物だったものがいまや、Core2Duoマシンを押しのけてメインホームサーバーとしての地位を確立してしまいました。

さて、PuppyをインストしてHDDにFULLインストールしたところまではいいのだが、電源を入れると(リブートでも同様)GRUBの画面でEnterキーの入力待ちになってしまう。
ホームサーバーとしては、リモートで再起動させることが多いので、自動で起動してほしいのだが・・・

GRUBの設定ファイルをいじればよいのは判っているが、なんせ、GRUBなんぞ5年前にいじって以来そのままだからかな・・・また、GRUBの調査から始めるとなると気が重いな~

ということで、同じような問題に直面した人のためにPuppyLinuxが自動起動するように設定変更する手順を示します。


PuppyLinux をHDDにFULLインストールするとGRUB画面でEnterキー入力待ちになって自動起動しない問題の修正

(1) 「エディタ」を使って /boot/grub/menu.lst ファイルを開く
(2) 9行目の「#timeout 30」の1文字目の「#」を削除します。
  ついでに、30秒は長すぎるので5秒待ちに変更します。


7: #
8: # Start GRUB global section
9: timeout 5



(3) 保存しておわり

2009年2月10日火曜日

GoogleCalenderから予定を取り込んでみる

とあるシステムに「予約」機能を追加したいともくろんでいるのだが、そのシステムでは既に基本的な予約機能は実装されている。「予約時間」と「貸出先ユーザー」と「予約対象物」さえパラメーターで渡してあげればOKなのだ。
しかし、問題はこの3つのパラメータを利用者に入力してもらうためのユーザーインターフェイス部分を作らなければならないのが大変なのだ。理想としては「Googleカレンダー」のようにWebからでも予約でき、タイムチャート表示、説明書無しでも使える直感的なインターフェイス。なのだが・・・
ということで、「Googleカレンダー」に記入した予約データをJavaプログラムで読み込んでみよう!

まずは、「Google Calender API」に関する先人の苦労をパクッてみようと、ググッてみたが日本語のサイトを見つけることが出来ない。しぶしぶ、本家の「Google Calender API」ページを読むことにした。

Google Calendar APIs and Tools - API Developer's Guide: Java


対象読者
この文書は、Googleカレンダーと相互作用することができるGoogleデータAPI Javaクライアントライブラリを使って、クライアントアプリケーションを書きたいプログラマーのために意図されています。

はじめに
クライアントライブラリを設定については、"Getting Started Guide."を見てください。
Javaクライアントライブラリを使うためには,Java1.5実行環境が必要です。
クライアントライブラリをダウンロードすると、「java/lib/gdata-calendar-1.0.jar」と「java/lib/gdataclient-1.0.jar」の二つの jar ファイルが入っています。

1.クライアントライブラリの開発環境をセットアップする
   http://code.google.com/support/bin/answer.py?answer=78455

1.1 依存関係
  • JDK (Java Development Kit) version 1.5+
  • Apache Ant version 1.7+
  • mail.jar in Sun's JavaMail API 1.4+
  • activation.jar in Sun's JavaBeansActivationFramewrok.
    (This is only required for media specific APIs including Document List Data API, Picasa Web Album API, and YouTube Data API.)
  • servlet.jar in Sun's Servlet API version 2.3+.
    (This is required only if executing code samples in 'sample.authsub' or 'sample.gbase.recipe' packages.)
(本家のページにこれらの依存ファイルの入手方法がOSの種類別に解説されています。)

1.2 ’Google Data Client Library’のインストール

  1. このサイトに行け! http://code.google.com/p/gdata-java-client/downloads/list

  2. Click on the featured download.(どれをダウンロードすればよいか良くわからないが、とりあえず「gdata-samples.java-1.29.0.java.zip」をダウンロードしてみた

  3. あんたのPCに解凍しなさい.

  4. Navigate to gdata/java/build/build.properties and open the file.

  5. Edit the external dependencies to point to the locations of the .jar files on your local machine.

注意! バックスラッシュは次の例のように2個書いてね
servlet.jar=C:\\Program Files\\Apache Software Foundation\\Tomcat 6.0\\lib\\servlet-api.jar

1.3 サンプルを走らせる
「gdata/java/sample」フォルダに実行できるサンプルがあります。「gdata/java/build/build.properties」ファイルにサンプルの実行に必要なパラメータが定義されています
[sample.credentials.username] と [sample.credentials.password]に適当な値を設定しなさい。
サンプルをビルドするのに Ant を利用できますよ。

ちゃんとインストールされたかどうかテストするために、コマンドプロンプトを開いて、「gdata/java」に移動して、下記のコマンドを打ってみな:
ant sample.calendar.run
たぶん [info]やら[warning] などのわけのわからんメッセージが出るけども、最終的に[BUILD SUCCESSFUL]と表示されればOKです。成功メッセージが出なければ、 troubleshooting section 」を参照してね。

もっとインタラクティブなサンプルも試してください:
ant sample.spreadsheet.guidemo.run

どうやって特定のサンプルを動かすかを知りたければ、[gdata/java/build]ディレクトリに行き、そのサンプルについてBuildファイルをチェックしてください。
samples runセクションを捜してください。

1.4 自作アプリを作る
次の問題はどうすれば自作アプリケーションを作れるかです。カレンダーサービスを利用した "Hello, World!" みたいなプログラムを通じて基本的な機能を見てみましょう。
More detailed information can be found in the Java Client Library's developer guide, as well as the individual product developer guides.

「CalendarTest.java」というファイルを作りなさい。以下のimport文から始めてください。
import com.google.gdata.client.*;
import com.google.gdata.client.calendar.*;
import com.google.gdata.data.*;
import com.google.gdata.data.acl.*;
import com.google.gdata.data.calendar.*;
import com.google.gdata.data.extensions.*;
import com.google.gdata.util.*;

import java.net.*;
import java.io.*;

import sample.util.*;


プログラムはこれです。
public class CalendarTest {

public static void main(String[] args) throws Exception {
CalendarService myService = new CalendarService("exampleCo-exampleApp-1.0");
myService.setUserCredentials("root@gmail.com", "fortytwo");

URL feedUrl = new URL("http://www.google.com/calendar/feeds/default/allcalendars/full");
CalendarFeed resultFeed = myService.getFeed(feedUrl, CalendarFeed.class);

System.out.println("Your calendars:");
System.out.println();

for (int i = 0; i < resultFeed.getEntries().size(); i++) {
CalendarEntry entry = resultFeed.getEntries().get(i);
System.out.println("\t" + entry.getTitle().getPlainText());
}
}

}


この小さなプログラムは、あなたのカレンダーにあるすべての「予定」のタイトルを表示します。
これは本物の "Hello, World!" よりもちょっと長いけれど、冗談抜きにとてもシンプルです。

最初の2、3行はサービスオブジェクトを作成し、ユーザー認証をしています。
CalendarService myService = new CalendarService("exampleCo-exampleApp-1.0");
myService.setUserCredentials("root@gmail.com", "fortytwo");

次に、Googleカレンダー・リソースへのURLを設定します。この例では、認証を許可されたすべてのカレンダーのリストを示しています。
URL feedUrl = new URL("http://www.google.com/calendar/feeds/default/allcalendars/full");

次の行では、指定されたURLへ実際にGETコマンドを実行し、返信された結果はオブジェクトに格納されます。
CalendarFeed resultFeed = myService.getFeed(feedUrl, CalendarFeed.class);

下記のループで、カレンダーのタイトルが表示されます。
タイトルは TextConstruct として表現されます。従って、 プレーンテキストを得るためには特別なファンクションコールが必要です。
for (int i = 0; i < resultFeed.getEntries().size(); i++) {
CalendarEntry entry = resultFeed.getEntries().get(i);
System.out.println("\t" + entry.getTitle().getPlainText());
}

この例はちょっと基本的すぎましたね — もうちょっと実際的な例をやってみましょう。
以下では、オブジェクトの作成と追加の例を示しています。要するに、カレンダーに「新しい予定」を追加する例です。
URL postURL = new URL("http://www.google.com/calendar/feeds/gdata.ops.demo@gmail.com/private/full");
CalendarEventEntry myEvent = new CalendarEventEntry();

//Set the title and description
myEvent.setTitle(new PlainTextConstruct("Pi Day Party"));
myEvent.setContent(new PlainTextConstruct("I am throwing a Pi Day Party!"));

//Create DateTime events and create a When object to hold them, then add
//the When event to the event
DateTime startTime = DateTime.parseDateTime("2007-03-14T15:00:00-08:00");
DateTime endTime = DateTime.parseDateTime("2007-03-14T17:00:00-08:00");
When eventTimes = new When();
eventTimes.setStartTime(startTime);
eventTimes.setEndTime(endTime);
myEvent.addTime(eventTimes);

// POST the request and receive the response:
CalendarEventEntry insertedEntry = myService.insert(postURL, myEvent);

この例では、問い合わせを行います。
//Create a new query object and set the parameters
Query myQuery = new Query(feedURL);
myQuery.setFullTextQuery("Pi");

//Send the request with the built query URL
CalendarEventFeed myResultsFeed = myService.query(myQuery, CalendarEventFeed.class);

//Take the first match and print the title
if (myResultsFeed.getEntries().size() > 0) {
CalendarEventEntry firstMatchEntry = new CalendarEventEntry();
myResultsFeed.getEntries().get(0);
System.out.println(firstMatchEntry.getTitle().getPlainText());
}

While debugging, another useful operation is dumping out the raw XML. There's a handy utility that you can use to do this in the library. Make sure samples.util.* is imported. Then, dump the feed or entry.
CommonUtils.dump(resultFeed, System.out);

For even deeper debugging tools, check out this article about how to turn on logging from within the client library.

This should give you a feel for what building apps using the client library is like. For more detailed information, see the developer guides.