2008年2月27日水曜日

Boot Class PathからVMが使えるPackagesを見つけてくるTips

追記 2008/06/28 これを元にMac用のアプリを作りました.


Q: javax.swing.tableをsystem pcakgesとしてexportしてあげるためにVMがをexportできるパッケージを自動取得したい.

A: やってみた.

1.普通のclasspathでなくbootのclasspath (sun.boot.class.path)を得る.
2.区切り文字':'で分割.
3.jarが6個とれた.
  String bootclasspath = System.getProperty("sun.boot.class.path");
String[] paths = bootclasspath.split(":");

pathsにはいかが入る.
/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar
/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar
/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar
/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar
/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar
/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar


1.JarファイルのパスからJarFileクラスを生成
2.JarFileクラス通して得られるJarEntry(のEnumeration)でJar内の各ファイルが見れる.
3.基本的に「ファイル=クラス」であるのでパスの最後ファイル名を削除する.
4.ファイルの区切り文字'/'をパッケージの区切り文字'.'に置き換えて
5.同一パッケージのクラスが多数でてくるのでパッケージ名としては重複する.
  そこでListのcontainsによって重複を回避する.また,WEB-INF等もあるので
  大文字から始まる場合も回避した.

   JarFile j = new JarFile(f);
Enumeration<JarEntry> jeEnum = j.entries();
while (jeEnum.hasMoreElements()) {
JarEntry je = jeEnum.nextElement();
String className = je.getName();
String packageName = className.substring(0, className
.lastIndexOf("/"));
packageName = packageName.replaceAll("/", ".");
if (packages.contains(packageName) == false
&& Character.isLowerCase(packageName.charAt(0))) {
packages.add(packageName);
}
}

javax.swing
javax.swing.border
javax.swing.colorchooser
javax.swing.event
javax.swing.filechooser
(一部 全部で660あった MacOSX 10.5/ JRE1.5.0)


とさ.
ただやっぱり毎回やると時間がかかるので初回のみにしてファイルは作るようにした.
#だったらオリジナルのfelixみたいにconf.propertiesを使えば良いわけだがダイナミックにやってみたかった.

2008年2月26日火曜日

TIPS: JSP, Servletで使うライブラリ(jar)はWEB-INF/libに配置する

忘れないように…

タイトルのままです.
warで固めた奴らはclasspathとかどうすんだろう?とおもったらそういう事でした.

参考:
GWT RPCの例(というより梱包するjarについて
http://edotprintstacktrace.blogspot.com/2008/02/gwt-rpcjar.html

2008年2月25日月曜日

FelixApplication / OSGi Bundle 管理ツール

追記 2008/06/28 これを元にMac用のアプリを作りました.


勉強がてら'OSGi Bundle 管理ツール'みたいなものを作ってみた.



できること:
 Bundle の状態の閲覧?
 Bundle のInstall, Start, Stop, Update, Uninstall

(まだw)できないこと:
 classes.jarの中のパッケージ名文字列を取得して自動的にexport packagesとして提供できていない.
 update対象のBundleのバージョン番号の取得.(install済みと比較するため.)
  Lastmodifiedを比較する方法はわかったんだけどねぇ.
 他多数.

って感じです.

2008年2月23日土曜日

光学マウスでポインタが突然飛んでしまう問題でお困りのあなた!

本日AmazonよりMicrosoft Wired Laser Mouse 6000が届きました.

そして声を大にして言いたい!
「光学マウスでポインタが突然飛んでしまう問題でお困りのあなた!
ぜひレーザマウスに変えるべきです!」

いやほんとびっくり.ずっとイライラしていた自分が馬鹿みたい.
道具は高くていいものをっていうけど別にこれそんなに高くない.

むしろ高いのは無線式の方なのかな.
desktopのマウスが無線である必要って実はそれほどないと思う今日この頃
バッテリー切れとか心配するの意味ないし
マウスは認識するのも絶対であってほしいしものね.

他人にお勧めしたくなる良い買い物をしたという自慢w.
(商品固有ではなく機構(レーザ式)としておすすめできると思ってます..)

#この商品のレーザって赤かったりしないのね.
#最初不良品かと思ってびっくりした.
#考えてみればレーザポインタでないんだから可視光である必要はないんだよねw.

Apache Felix OSGi tutorial: Example 1 をEclipse 3.3で.

追記 2008/06/28 これを元にMac用のアプリを作りました.


1.Projectを作成
 New/'Project' を選択(Java Projectじゃないよ)

 Wizerdの選択にてPlug-in Projectを選択.


 Dialogに入力
  Project name: tutorial.example1
  Target Platform: an OSGi framework standard
  (ほかそのまま)
  Nextを押す.

#(OSGi framework standardが選べればEclipse 3.2でも良いはずです)

 'Plug-in Content'のDialogとなる.
  Finishを押す.


2.Activator.javaの編集
 (面倒な人は編集しなくてもテンプレートで十分だよ.)
 src/example/tutorial1/Activator.javaにここのコードを書き写す.

3.Plug-in Manifest Editorを使ってbuildする.
 このEditor, META-INF/MANIFEST.MFをクリックすると立ち上がる.(プロジェクトができた時も立ち上がってる.)
 一番左のタブ'Overview'にあるExportingの3項目
  '3. Export the plug-in in a format suitable for deployment using the(?) Export Wizard'をクリック(Export Wizard部分)
 で,Deployable Plugin-ins and fragmentsダイアログがでる.
 DestinationタブのDirectoryを選択しテキトーな場所(ディレクトリ)を指定.(以降ここを${DIRECTORY}と呼ぶ)
 Finishを押す.


 ${DIRECTORY}/plugins/tutorial.example1_1.0.0.jarが出来上がる.

4.FelixApplicationに対する修正.
 ここのMain.javaにおいて
public static String PLUGINS_LOCATION = "file:/path/to/plugins/";


public static String PLUGINS_LOCATION = "file:${DIRECTORY}/plugins/";

に変更.


5.実行!
 FelixApplicationプロジェクトのexample.Mainクラスを実行.
 Tutorial通りなら以下
Starting to listen for service events.

 Eclipseのテンプレートのままなら
 
Hello World!!

 とConsoleに表示されるはず.
 どっちも止められないからConsole Viewの停止ボタンで止めてね.


以上.

ちなみに「Windowを出したいな.」なんてことでSwingなんかを使いたくなったらこんな感じにする.
追記:上のはちょっとまった.Felix側でjavax.swingをexportしてあげないといけない.このやり方はまた今度!

追記2:plugin側でjavax.swingを'Imported Pakages'にて設定したら,このFelixApplicationではこの一行を追加する.
 private static String getString_SystemPackages() {
List list = new ArrayList();
list.add("org.osgi.framework; version=1.3.0");
list.add("org.osgi.service.packageadmin; version=1.2.0");
list.add("org.osgi.service.startlevel; version=1.0.0");
list.add("org.osgi.service.url; version=1.0.0");
list.add("javax.swing"); // <- これを追加
return join(list, ",");
}

Apache Felixをプラットフォームにする.

追記 2008/06/28 これを元にMac用のアプリを作りました.


Apache FelixはOSGi R4 Service Platformの実装です.
まぁ端的に言えばプラグイン(Plugin)型(OSGiではバンドル(Bundle)と呼ぶ)のアプリケーションを作る上での土台みたいなモノです.
で,そのやり方をちょこっと書いてみます.
0.材料
 ここからdownload. (Felix 1.0.3)
 必要なのはfelix-1.0.3/bin/felix.jar
1.Eclipse Projectでやってみる.
 ここではJava Project.
 'FelixApplicatin'という名前.
 '.class'ファイルの場所を分けるため,'project layout'の設定でsrc/binをもうける方にする.(趣味?)

 でとりあえず作成しちゃう.
2.外部jarの設定
 プロジェクト名上で右クリックにてコンテクストメニューを出す.
 'Build Path / Add External Archive...' にてfelix.jarを追加.


3.Main classを作る
 起動用のMain class( example.Main )をsrcの下に作る.
 で,コードはこんな感じ.
src/example/Main.java
package example;

import java.util.Map;
import java.util.List;
import java.util.ArrayList;
import org.osgi.framework.Constants;
import org.apache.felix.framework.Felix;
import org.apache.felix.framework.cache.BundleCache;
import org.apache.felix.framework.util.StringMap;
import org.apache.felix.main.AutoActivator;

public class Main {
private static Felix felix = null;

private static String join(List list, String d) {
if (list.isEmpty()) {
return "";
}
StringBuffer ret = new StringBuffer((String) list.get(0));
for (int i = 1; i < list.size(); i++) {
ret.append(d);
ret.append((String) list.get(i));
}
return ret.toString();
}

private static String getString_SystemPackages() {
List list = new ArrayList();
list.add("org.osgi.framework; version=1.3.0");
list.add("org.osgi.service.packageadmin; version=1.2.0");
list.add("org.osgi.service.startlevel; version=1.0.0");
list.add("org.osgi.service.url; version=1.0.0");
return join(list, ",");
}

public static String PLUGINS_LOCATION = "file:/path/to/plugins/"; // http:でもいいよ

private static String getString_AutoStartProp() {
List list = new ArrayList();
list.add(PLUGINS_LOCATION + "tutorial.example1_1.0.0.jar");
return join(list, " ");
}

public static void main(String[] argv) throws Exception {
Map configMap = new StringMap(false);
configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES,
getString_SystemPackages());
configMap.put(AutoActivator.AUTO_START_PROP + ".1",
getString_AutoStartProp());
configMap.put(BundleCache.CACHE_PROFILE_DIR_PROP, "cache");

List activators = new ArrayList();
activators.add(new AutoActivator(configMap));
felix = new Felix(configMap, activators);
try {
felix.start();
} catch (Exception ex) {
System.err.println("Could not create framework: " + ex);
ex.printStackTrace();
System.exit(-1);
}
}
}


4.で,このMainを起動.
 なんだけど上の例ではtutorial.example1_1.0.0.jarというjarをpluginとして読み込んでる.
 こいつは"Apache Felix Tutorial Example 1"で作り方が書かれているサンプルPlugin.
 で,これについてはまた今度.

ここまでのプロジェクトツリーはこんな感じ.

#'cache'は実行すると作られる.
#コードの'(1)'で定義している名前となる.

参考: ありがとうございました.
Apache Felix - Launching and Embedding Apache Felix
Gridshore » Blog Archive » Starting with OSGi using apache felix (step 1)

2008年2月22日金曜日

'a'のSymbolフォントが'α(アルファ)'だった時代: CarbonからCocoaへ

なんてエラそうなことをかけるほどではなくてTipsです.Carbonでは'a'を選択してFontをSymbolにすると'α'になりました.でもCocoaでは代理フォントでaのままです.

理由はUTF-8らしいです.UTF-8では'a'と'α'は違う番号が振られるのでそういうことになるらしいです.UTF-8やるな.

で,ふと疑問.IMEを使わずに'α'ってどうやっていれるの?ってことです.
調べると
環境設定/言語環境/入力メニュー/Greekにチェックを入れてGreekに切り替える.

とすると'a'をおして'α'がでるとのこと.おお.英語圏では常識なんでしょうか?論文書くときに困るよね.たぶん.texなら関係ないか.

ところでこれってショートカットキー設定できないものですかね? Control+Shift+';'みたいに…

#という妄想かもしれません.結局はっきりと原因わかんないんです.だれか教えてください.

2008年2月21日木曜日

Apache FelixにてSwingを使うには

2008/02/23 追記:こいつはこれ見たいに実行した場合ね.(ちゃんとfelixがjavax.swingをexportしてないとだめ.)

Apache FelixでSwingを使うにはMANIFEST.MFの'Import-Package:'にjavax.swingを加えておく事.
EclipseのPlug-in Manifest EditorならDependenciesタブのImported PackagesでAddにて加えれば良い.
なるほどねー.いずれHelloWorldを書こう.

2008年2月17日日曜日

GWT-Ext用のEclipse内でのbuild.xmlを考える.

・必要なファイル達についてはこちらの'0'の項を参照してください.
・プロジェクト('MyProject')の作成はこちらの'1-3'を参照してください.


(必要なら)web.xmlを用意.
MyProject/WEB/web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>

<welcome-file-list>
<welcome-file>MyProject.html</welcome-file>
</welcome-file-list>

</web-app>



MyProject/build.properties
#
src.dir=src
dist.dir=dist

#
gwt.location=GWT_HOME
gwtext.location=GWTExt_HOME
ext.location=ExtJS_HOME

#
project.package=com.mycompany
src.public.dir=${src.dir}/${project.package}/public
gwt.entrypoint.class=${project.package}.MyProject
content.dir=${dist.dir}/${gwt.entrypoint.class}
war.name=MyProjectWeb

#
tomcat.webapps=TOMCAT_HOME/webapps


MyProject/build.xml
<project name="MyProject" default="build" basedir=".">
<property file="build.properties" />

<path id="gwt.compile.classpath" >
<pathelement path="${java.class.path}/" />
<pathelement location="${src.dir}" />
<pathelement location="${gwt.location}/gwt-user.jar" />
<pathelement location="${gwt.location}/gwt-dev-mac.jar" />
<pathelement location="${gwtext.location}/gwtext.jar" />
</path>

<target name="clean" >
<delete dir="${dist.dir}" />
</target>

<target name="build" >
<java classpathref="gwt.compile.classpath"
classname="com.google.gwt.dev.GWTCompiler"
maxmemory="128m"
fork="true">
<arg value="-out" />
<arg value="${dist.dir}" />
<arg value="${gwt.entrypoint.class}" />
</java>
</target>

<target name="dist" depends="build">
<mkdir dir="${content.dir}/js/ext" />
<copy todir="${content.dir}/js/ext">
<fileset dir="${ext.location}">
<exclude name="*-debug.js" />
<include name="*.js" />
<include name="adapter/**/*" />
<include name="resources/**/*" />
</fileset>
</copy>
<copy todir="${content.dir}/WEB-INF">
<fileset dir="WEB-INF">
<include name="web.xml"/>
</fileset>
</copy>
<mkdir dir="${content.dir}/WEB-INF/lib" />
<copy todir="${content.dir}/WEB-INF/lib">
<fileset dir="${gwt.location}">
<include name="gwt-servlet.jar"/>
</fileset>
</copy>
<mkdir dir="${content.dir}/WEB-INF/classes" />
<copy todir="${content.dir}/WEB-INF/classes">
<fileset dir="bin">
<include name="**/*.class"/>
</fileset>
</copy>
<jar jarfile="${dist.dir}/${war.name}.war"
basedir="${dist.dir}/${gwt.entrypoint.class}" />
</target>

<target name="deploy" depends="dist">
<copy todir="${tomcat.webapps}"
file="${dist.dir}/${war.name}.war" />
</target>
</project>

#WEB-INF以下にclasses/**/*.class, lib/servlet.jarをcopyするところはRPC用.


プロジェクトはこんな感じ.



Ant実行終了時にできたファイル等をExplorerに反映するためにRefreshにチェックをいれておくと便利.


MyProject.javaをいじる前にMyProject.gwt.xmlのmodule要素の直下に一行追加するのをお忘れないように…
#私が忘れてハマっただけです…
MyProject/src/sample/MyProject.gwt.xml
<module>
<inherits name='com.gwtext.GwtExt' />

2008年2月16日土曜日

GWT RPCの例(というより梱包するjarについて

GWT RPCの例としてこちらを参考にしました.
最近のちょっ得: Google Web Toolkit まとめ
http://salt.air-nifty.com/salt/2006/06/google_web_tool_7bcf.html




で,
(ホントは、ここに書かれてるとおり、webapps/MyApplication/WEB-INF/lib の中に、gwt-user.jar から javax フォルダを消して再圧縮した gwt-user.jar を置けばいいみたいなのだけど。)

って事なんですがそんな面倒な,それくらい用意しているんじゃないの?ってことであれこれjarをあけてみるとgwt-servlet.jarがありました.これって最近のことなんでしょうかね?苦労された方々の上になりたっているですねきっと.

で,
WEB-INF/lib/gwt-servlet.jar

と置くだけであとは勝手に使ってくれました(JAKARTA_TOMCAT).

ちなみにMyApplicationはapplicationCreatorが作ったもののonClickの中を以下のようにしてみた.
client/MyApplication.java
 tService.myMethod("send message", new AsyncCallback() {
public void onFailure(Throwable caught) {
}
public void onSuccess(Object result) {
String str = (String) result;
if (label.getText().equals("----"))
label.setText(str);
else
label.setText("----");
}
});


MyServiceImplのmyMethodはこんな感じ
server/MyServiceImpl.java
 public String myMethod(String s) {
s+= "*";
return s;
}


warへ固めることを考えるとcompileした時に作られるwwwの下にWEB-INF関連も作ってくれれば良いのにね.
www/com.mycompany.MyApplication/WEB-INF/web.xml
www/com.mycompany.MyApplication/WEB-INF/classes/**/*.class
www/com.mycompany.MyApplication/WEB-INF/lib/gwt-servlet.jar

みたいに.

でもって
www/com.mycompany.MyApplication/*

も含めてwarを作ればよいわけだ.
> cd ${MyProject_loc}/www/com.mycompany.MyApplication
> jar cvf ../com.mycompany.MyApplication.war *

って感じ.

#あるのか?そういうオプションかなにかがあるのか?
#'-eclipse'みたいな何かが?

GWT自体がApacheライセンス2.0らしいのでApache2.0のライセンス文書もwarに梱包してgwt-servlet.jarも含めて配布ってことでいいっすか?

GWT開発をEclipseで開始する時の方法(これが正攻法?

ここに書いてあった.
Getting Started - Google Web Toolkit - Google Code
http://code.google.com/webtoolkit/gettingstarted.html



0.ディレクトリを用意.
> mkdir MyProject
> cd MyProject


1.Eclipseのプロジェクト(関連ファイル)作成
> ${GWT_HOME}/projectCreator -eclipse MyProject


2.GWTのプロジェクト作成
> ${GWT_HOME}/applicationCreator -eclipse MyProject com.mycompany.client.MyApplication


3.EclipseにImport
 メニューの'File/Import...'を選択.
 Dialogが表示される. 'General/Existing Projects into Workspace'を選択.
 Select root directory ...にてMyProjectディレクトリを選択.
 Projects中にMyProjectが表示される(はず).
 FInish!.

4.実行
 メニューの'Run/Open Run Dialog...'を選択
 Dialogが表示される.Java Applicationの中にMyApplicationという項があるので選択.
 Run!.


5.表示
 GWTのサーバが起動.
 ブラウザが以下のように表示される.
 

 こいつの苦労は...orz.

2008年2月15日金曜日

GWT-ExtのHelloWorldをやってみる / Eclipse 3.3 / MacOSX 10.5

追記(2008/09/29)
このページをみていただいたそうですが私よりわかりやすい文章の解説ページが作成されていました.
Ext.JS情報|株式会社エイシーエル
http://www.acl-inc.co.jp/modx/gwt_ext.html


追記
最近このページへのアクセスがちょっと多いのでコメントしときますがEclipse+GWTの開発はこっちがおそらく正攻法です.



参考はこれ.
Tutorial:Introduction to GWT-Ext 2.0
http://gwt-ext.com/wiki/index.php/Tutorial:Introduction_to_GWT-Ext_2.0



0. 用意するもの
 参考にある用意するもののうちJava SDKはLeopard付属のモノ(JDK1.5)をつかう.

0.1 GWT
 ここここからdownload (1.4.61).
 #10.5なのでLeopard用(!).
 どこかに展開しておく.

 開発用の道具等も含まれているのでそれなりの所に.
 この展開した場所をGWT_HOMEと呼ぶことにする.

0.2 Ext JS
 ここここからdownload (2.0.1).
 どこかに展開しておく.

 参考にもあるように最終的に必要なのは以下だ.
 (-debug.jsはいらないように思う)
* /adapter
* /resources
* ext-all.js
* ext-all-debug.js
* ext-core.js
* ext-core-debug.js


0.3 GWT-Ext
 ここここからdownload (2.0.1).

 こいつで必要なのは'gwtext.jar'のみ.
 この展開した場所をGWTExt_HOMEと呼ぶことにする.

1. プロジェクトの作成
 とりあえずJavaプロジェクト(名前は'GWTExt_HelloWorld'とした.)で.
 (あと作成時に'Project Layout'として'Create separate folders for sources and class files'を選んでます.

2.外部jarの設定
 必要なのjarとして以下のjarをプロジェクトのPropertiesでJava Build Path項のLibrariesタブにて設定する.
 #あとでlib/gwtext.jarを説明のしやすさの都合で置くのでgwtext.jarについてはこちらでも良い.
GWT_HOME/gwt-dev-mac.jar
GWT_HOME/gwt-user.jar
GWTExt_HOME/gwtext.jar

追記:gwt-dev-mac.jarはいらないみたいです.すみません.
   (画像との整合性の都合で消さないですけど…)



3.説明の都合で行う作業
 プロジェクト内にlibフォルダを作成.
 libにgwtext.jar(GWTExt_HOME/gwtext.jar)をimportする.

 ここまでのプロジェクトはこんな感じ.


4.(GWTとしての)プロジェクトの作成
 外部ツールの設定を行う.
 このアイコンからメニューを出して'Open External Tool Dialog ...'を選ぶ.


 で,左のツリーの中からProgramというアイテムを選択しておいて左上'New'(下のアイコン)のボタンを押す.

 でもって各値を設定(Mainタブだけですw).
Locatoin: ${GWT_HOME}/applicationCreator
Working Directory: ${workspace_loc:GWT_Ext_HelloWorld}
Argument: com.mycompany.mypackage.client.HelloWorld

 LocationはBrowse File System...でGWT_HOMEにあるapplicationCreatorを指定.
 ('${GWT_HOME}は自分で設定したら使えるけど通常はないので直接選択すればよい.
 Working DirectoryはBrowse Workspace...でGWTExt_HelloWorldを指定.
 Argumentsは参考のままw.(clientの文字はないといけないみたい.)
 Nameはテキとー.

 でRun!

 プロジェクトルートでコンテキストメニュ(右クリック)を出してRefreshすると作成されたファイルが見える.
 こんな感じ.


5.Ext JSを配置する.
 src/com/mycompany/mypackage/publicの下に'js/ext'ディレクトリを作成
 0.2でも書いた以下のファイルをこのextディレクトリにimportする.
* /adapter
* /resources
* ext-all.js
* ext-core.js

 こんな感じになる.


6.HelloWorld-compileを編集
 javaコマンドのクラスパス(-cpの次の引数)に'GWTExt_HOME/gwtext.jar'を追加する.
 3.をやっている人は'./lib/gwtext.jar'となる.
変更前: .../gwt-dev-mac.jar" com.google.gwt.dev.GWTCompiler ...
変更後: .../gwt-dev-mac.jar:./lib/gwtext.jar" com.google.gwt.dev.GWTCompiler ...


7.HelloWorld-shellを編集
 javaコマンドのクラスパス(-cpの次の引数)に'GWTExt_HOME/gwtext.jar'を追加する.
 3.をやっている人は'./lib/gwtext.jar'となる.
変更前: .../gwt-dev-mac.jar" com.google.gwt.dev.GWTShell ...
変更後: .../gwt-dev-mac.jar:./lib/gwtext.jar" com.google.gwt.dev.GWTShell ...


8.src/com/mycompany/mypackage/HelloWorld.gwt.xmlを編集
 参考のとおり内容を以下に置き換える.
<module>
<!-- Inherit the core Web Toolkit stuff. -->
<inherits name='com.google.gwt.user.User' />
<!-- Inherit the GWTExt Toolkit library configuration. -->
<inherits name='com.gwtext.GwtExt' />
<!-- Specify the app entry point class. -->
<entry-point class='com.mycompany.mypackage.client.HelloWorld' />
<stylesheet src="js/ext/resources/css/ext-all.css" />
<script src="js/ext/adapter/ext/ext-base.js" />
<script src="js/ext/ext-all.js" />
</module>



9.src/com/mycompany/mypackage/public/HelloWorld.htmlを編集
 参考のとおり内容を以下に置き換える.
 #開くときはそのままだとWeb Browserで開く(ことがある).
 #コンテキストメニュ(右クリック)でOpen With .../Text Editorとする.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Language" content="en-us">
<meta http-equiv="Content-Author" content="Sankar Gorthi">
<title>Hello World</title>
</head>
<body>
<iframe id="__gwt_historyFrame" style="width:0;height:0;border:0"></iframe>
<!-- The GWT js file generated at run time -->
<script type="text/javascript" src='com.mycompany.mypackage.HelloWorld.nocache.js'></script>
</body>
</html>


10.src/com/mycompany/mypackage/client/HelloWorld.javaを編集
 参考の通り'public void onModuleLoad()'メソッドの内容を以下に置き換える.
public void onModuleLoad() {
Panel mainPanel = new Panel();

// Setting the Panel's properties
mainPanel.setTitle("Hello World!");
mainPanel.setHeight(300);
mainPanel.setWidth(500);
RootPanel.get().add(mainPanel);
}

 Panelはcom.gwtext.client.widgets.Panelをimportする.

11.起動
 HellowWorld-shellを実行.

 外部ツールの設定を行う.
 このアイコンからメニューを出して'Open External Tool Dialog ...'を選ぶ.


 で,左のツリーの中からProgramというアイテムを選択しておいて左上'New'(下のアイコン)のボタンを押す.

 でもって各値を設定(Mainタブだけですw).
Locatoin: ${workspace_loc:/GWTExt_HelloWorld/HelloWorld-shell}
Working Directory: ${workspace_loc:GWTExt_HelloWorld}
Argument:

 LocationはBrowse Workspace ...でGWTExt_HelloWorld(プロジェクト)にあるHelloWorld-shellを指定.
 Working DirectoryはBrowse Workspace...でGWTExt_HelloWorldを指定.
 Argumentsは空.
 Nameはテキとー.

 でRun!

 'tomcat'というディレクトリができるこいつはGWTのサーバの環境用らしい.

12.表示.
 起動した'Google Web Toolkit Development Shell / Port 8888'ウインドウとそのブラウザでの表示.



13.コンパイル
 HellowWorld-compileを実行.
 外部で(GWTのサーバでなく)使うためのコードを用意するため(?).

 外部ツールの設定を行う.
 このアイコンからメニューを出して'Open External Tool Dialog ...'を選ぶ.


 で,左のツリーの中からProgramというアイテムを選択しておいて左上'New'(下のアイコン)のボタンを押す.

 でもって各値を設定(Mainタブだけですw).
Locatoin: ${workspace_loc:/GWTExt_HelloWorld/HelloWorld-compile}
Working Directory: ${workspace_loc:GWTExt_HelloWorld}
Argument:

 LocationはBrowse Workspace ...でGWTExt_HelloWorld(プロジェクト)にあるHelloWorld-compileを指定.
 Working DirectoryはBrowse Workspace...でGWTExt_HelloWorldを指定.
 Argumentsは空.
 Nameはテキとー.

 でRun!

 'www'というディレクトリにファイル群ができる.
 この中のHelloWorld.htmlファイルをFinder等で表示して直接クリックすればSafariがfile://...でアクセスして表示する.

GWT-ExtのShowcase2 Demoをローカルで動かす.

00. GWT-ExtDemo (Showcase2)が面白かったのでとりあえずダウンロード

01. で,展開してみた.

02. samplesディレクトリ発見.降りていく.

03. 'samples/Showcase2/www/com.gwtext.sample.showcase2.Showcase2/Showcase2.html'を発見.

04. こいつをクリック.file:...でブラウザ(Safari)が起動.

05. …おっイメージないけどInitalizingとか出てるなー.…止まってるのか..orz

06. Safari:ウインドウ/構成ファイル一覧を確認..../js/ext以下がないらしい.

07. そんな(''samples/Showcase2/www/com.gwtext.sample.showcase2.Showcase2/js/ext')ディレクトリない.

08. ‘!’.そっかextのjsはExt JSから取ってくるのか.

09. Ext JSからダウンロード

10. 'ext-2.0.1.zip'を取得. 展開. 'ext-2.0.1'ディレクトリができる.

11. 先ほどの'samples/Showcase2/www/com.gwtext.sample.showcase2.Showcase2/js/'に移動させる.

12. 'ext-2.0.1'から'ext'に名前変更.
結果jsディクレクトリの中はこうなる.


13. 再度'samples/Showcase2/www/com.gwtext.sample.showcase2.Showcase2/Showcase2.html'をクリック.

14. Safariが起動.

15. おぉ.でたでた.


って感じでした.
#経緯をそのまま.

2008年2月13日水曜日

改訂版: “Ruby on Railsで10分で作るTwitterもどき” を試す / Aptana on MacOS X (Leopard)

以前のエントリの改訂版
ちゃんとRails用のViewを使ってますw.



ZDnet
Ruby on Railsで10分で作るTwitterもどき
http://japan.zdnet.com/video/screencast/story/0,3800079413,20354695,00.htm

を見つけて自分でやってみたいなぁーと思いメモってみた.

そのままコマンドでやるとヒネリがないので環境をLeopard / Aptanaとしてやった内容を加えます.

Aptana StudioをLeopardに入れて遊んだ話はこれ.(RailsのPluginを入れるのもかいてある.)
http://edotprintstacktrace.blogspot.com/2007/11/ronraptana-studio.html



以下記録.


01.mysqlにdatabase, "twitter_development"を作成.
[9:53]


Aptana:
とりあえずOSに付属していて,Aptanaがデフォルトで作成してくれる
sqlite3を使うのでここは飛ばします.

02."rails twitter"
[9:49]


Aptana:
Railsパースペクティブを選び,

Rails Navigator内のコンテクストメニューで'New/Rails Project'を選択.

'Project name'にtwitterを入力.
Finishでプロジェクトができる.(ダイアログが消えないのでCancelで消す.2回目を押してしまった場合Consolでファイルの重複確認をすることになる)


03."cd twitter"
[9:47]


Aptana:
Navigatorのtwitterプロジェクトを開いてみるぐらい?

04."./script/plugin install acts_as_authenticated"
[9:41]


Aptana:
Rails Pluginsビューを利用.
左のセレクタから'Acs as Authenticated'を選択.下のように画面まで出るw.で'Go'!.


05."./script/generate authenticated user account"
[9:21]


Aptana:
Generatorsビューを利用.
セレクタから'authenticated'が選べると良いのだがないので入力.引数として'user account'といれ,'Go'!.


06."./script/generate model Friendship"
[9:11]


Aptana:
Generatorsビューを利用.
セレクタから'model'を選び,引数として'Friendship'といれ,'Go'!.
#セレクタがたまに空になるのでそういうときには直接入力.
#Frendshipsではないw.


07."./script/generate model Status"
[9:05]


Aptana:
Generatorsビューを利用.
セレクタから'model'を選び,引数として'Status'といれ,'Go'!.
#セレクタがたまに空になるのでそういうときには直接入力.


08."./script/generate controller User show"
[8:57]


Aptana:
Generatorsビューを利用.
セレクタから'controller'を選び,引数として'User show'といれ,'Go'!.
#セレクタがたまに空になるのでそういうときには直接入力.


09."rm public/index.html"
[8:54]


Aptana:
Navigatorでtwitter/public/index.htmlを選択,コンテクストメニュで削除.

10.edit "db/migrate/002_cretate_friendships.rb"
[8:50]
friendshipsテーブルにカラムの追加
"create_table :friendships do |t|"の下に以下追加
ーー
t.column :user_id, :integer
t.column :friend_id, :integer

ーー


Aptana:
Navigatorでtwitterを選択,コンテクストメニュでRefresh選択.
#これで生成されたものがNavigatorに反映される.

Navigatorでdb/migrate/002_cretate_friendships.rbをダブルクリック
で,編集.
#Shift+Apple+Fでフォーマット(インデント)が整えられるのが便利.

11.edit "db/migrate/003_create_statuses.rb"
[8:38]
statusesテーブルにカラムの追加
"create_table :statuses do |t|"の下に以下追加
ーー
t.column :user_id, :integer
t.column :desc, :string
t.column :created_on, :datetime

ーー


Aptana:
Navigatorでdb/migrate/003_create_statuses.rbをダブルクリック
で,編集.

12.edit "config/routes.rb"
[8:21]
1行目"ActionController::Routing::Routes.draw do |map|"の下に以下追加
ーー
map.connect "", :controller => "user", :action => "home"
map.connect ":user", :controller => "user", :action => "show"

ーー


Aptana:
Navigatorでconfig/routes.rbをダブルクリック
で,編集.

13.edit "app/models/friendship.rb"
[7:57]
1行目"class Friendship < ActiveRecode::Base"の下に以下追加
ーー
belongs_to :user
belongs_to :friend, :class_name => "User", :foreign_key => "friend_id"

ーー


Aptana:
Navigatorでapp/models/friendship.rbをダブルクリック
で,編集.

14.edit "app/models/user.rb"
[7:48]
2行目"class User < ActiveRecode::Base"の下に以下追加
ーー
has_many :friendships
has_many :friends, :through => :friendships
has_many :followerships, :class_name => "Friendship", :foreign_key => "friend_id"
has_many :followers, :through => :followerships, :source => :user
has_many :statuses

ーー


Aptana:
Navigatorでapp/models/user.rbをダブルクリック
で,編集.

15.edit "app/models/status.rb;
[7:06]
1行目"class Status < ActiveRecode::Base"の下に以下追加
ーー
belongs_to :user

ーー


Aptana:
Navigatorでapp/models/status.rbをダブルクリック
で,編集.

16.edit "app/controllers/account_controller.rb"
[6:57]
1行目"class AccountController < ApplicationController"の下,
"# Be sure ..."から "before_filter :login_from_cookie"までを削除
削除されているコメント以外の内容は以下.
ーー
include AuthenticatedSystem
before_filter :login_from_cookie

ーー
"/account"を"/"に置換(3カ所?)


Aptana:
Navigatorでapp/controllers/account_controller.rbをダブルクリック
で,編集.
#Apple+Fで'Find/Replace'パネルがでるのでこれでReplace.
#(カーソルを先頭にしてReplace All)


17.edit "app/controllers/application.rb"
[6:45]
16.で削除した行を"session :session_key => '_twitter_session_id'"の下に入れる.


Aptana:
Navigatorでapp/controllers/application.rbをダブルクリック
で,編集.

18.edit "app/controllers/user_controller.rb"
[6:34]
1行目"class UserController < ApplicationController"の下に以下追加

ーー
before_filter :login_required
helper_method :friend?

def home
@user = current_user
@statuses = Status.find(:all,
:conditions => {
:user_id => @user.friends.map(&:id)<<@user.id
},
:include => :user,
:order => "created_on desc",
:limit => 50)
render :action => "show"
end

ーー

"def show"の下に以下を追加
#show.rhtmlが使われるそうです.
ーー
redirect_to :action => "home" if current_user.login == params[:user]
@user = User.find_by_login params[:user]
@statuses = @user.statuses.find(:all, :order => "created_on, desc", :limit => 50)

ーー

"update"メソッドを追加以下最後のend前に入れる
ーー
def update
Status.create :user_id => current_user.id, :desc => params[:desc]
redirect_to "/"
end

ーー

"add"メソッドを追加以下最後のend前に入れる
ーー
def add
user = User.find_by_login params[:id]
Friendship.create :user_id => current_user.id, :friend_id => user.id
redirect_to "/#{user.login}"
end

ーー

protected で "friend?"メソッドを追加以下最後のend前に入れる
ーー
protected
def friend?
!!Friendship.find_by_user_id_and_friend_id(current_user.id, @user.id)
end

ーー


Aptana:
Navigatorでapp/controllers/user_controller.rbをダブルクリック
で,編集.

19.edit "app/views/user/show.rhtml"
[3:03]
まずは全部削除,以下を記述
ーー
Name: <%= @user.login %> <br />
<% if @user == current_user -%>
<% form_tag :action => "update" do -%>
<%= text_field_tag "desc" %>
<%= submit_tag "update" %>
<% end -%>
<% elsif !friend? -%>
<%= link_to "add", :action => "add", :id => @user.login %>
<% end -%>

<br />
<br />

Status<br />
<% for s in @statuses -%>
<%= s.created_on.to_s(:db)%> :
<%= h s.user.login %> :
<%= h s.desc %> <br />
<% end -%>

<br />
<br />

Friends<br />
<% for f in @user.friends -%>
<%= link_to f.login, f.login %><br />
<% end -%>

<br />
<br />

Followers<br />
<% for f in @user.followers - @user.friends -%>
<%= link_to f.login, f.login %><br />
<% end -%>

ーー


Aptana:
Navigatorでapp/views/user/show.rhtmlをダブルクリック
で,編集.

20."rake db:migrate"
[0:17]


Aptana:
rake tasksビューを用いてmigrateを反映させます.
セレクタより'db:migrate'を選択.引数は空で'Go'!.


21."./script/server"
[0:14]


Aptana:
あくまでAptanaでがんばるということで…
Server ビューでコンテクストメニュを出してAddを選択.

Server propertiesが出るのでとりあえずそのままの設定で'OK'.

追加時はStop状態.そこで今追加されたitem(server)上でコンテクストメニュを出してStartを選ぶ.

起動する.

22.ブラウザで起動,URL入力
[0:07]
とりあえずここを表示している''http://127.0.0.1:3000'


Aptana:
あくまでAptanaでがんばるということで…
ブラウザを起動.

URLを入力する.

23.表示.
[0:00]
でもアカウント作成のためにはここ.
'http://127.0.0.1:3000/account/signup'


Aptana:
/account/loginに飛ばされる.

/account/signupはこう.




以上.誰かの役に立てば幸い.
間違いとか色々教えていただけるとやっぱり幸いです.