2011年11月17日木曜日
GAE(Java)でBASIC認証
セッションが有効になっておらずエラーが出たので、
「appengine-web.xml」の<version>の次に
<sessions-enabled>true</sessions-enabled>を追加。
ローカルで成功するも、デプロイ後にUserInfoがシリアライズ不可と言われたので、
変更前:public class UserInfo{
↓
変更後:public class UserInfo implements Serializable{
としたら、動きました。
2011年5月21日土曜日
AmaterasUML
AmaterasUML_1.3.2.zip
解凍したものをEclipseのプラグインフォルダに移動。
「新規作成」で「クラス図」を選択・作成し、
クラスファイルをドロップすれば勝手に書いてくれる。
逆にクラス図を書いてから「エクスポート」すれば、クラスファイルを書いてくれる。
注意点として自動同期ではない模様。
クラスファイルを再度ドロップすればクラス図は更新されるが、
クラス図をエクスポートした場合、すでに書いてあるソースは上書きされてしまう。
2011年4月16日土曜日
GAE/J+Velocity
war/WEB-INF/libにコピーしたライブラリVelocity-1.7-dep.jarをプロジェクトに追加。
control.java
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
user user1 = new user(0, "ユーザ1", 176, 85);
user user2 = new user(1, "ユーザ2", 185, 120);
user user3 = new user(2, "ユーザ3", 168, 72);
LinkedList group = new LinkedList();
group.add(user1);
group.add(user2);
group.add(user3);
Velocity.init();
VelocityContext vc = new VelocityContext();
vc.put("group", group);
StringWriter sw = new StringWriter();
Template template = Velocity.getTemplate("/admin/velocity/foreach.vm", "UTF-8");
template.merge(vc, sw);
System.out.println(sw);
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html; charset=UTF-8");
resp.getWriter().print(sw);
}
web.xml
<servlet>
<servlet-name>control</servlet-name>
<servlet-class>scoreman.control</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>control</servlet-name>
<url-pattern>/admin/control</url-pattern>
</servlet-mapping>
war/admin/velocity/foreach.vm
<html>
<body>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<h1>Velocity</h1>
表示のテストです<br>
#easyMacro($group)
</body>
</html>
#macro(easyMacro $group)
#foreach($human in $group)
$velocityCount : $human.name<br>
#end
#end
参考サイトでは文字化け対策でpropertyファイルをコピーしてたりしてたけど、今のところこれでも問題ないのでこれでいきますかな。
表示画面
Flex勉強会第136回@東京(2011年4月13日)
に参加してきました。
FlexUserGroupの略でfxugといわれる集まりのようです。
今回は就活のネタとして行ったわけで、勉強会は初めてでしたが一流の技術者を目指すべく今何をすればいいかな~?って考えた結果。自分にはこれがぴったりだったわけです。
会場は大崎にあるAdobeのオフィスの一画で、洒落乙だったから緊張したわ。
Flexについては2年前にちょろっといじっただけでしたが1.5/3の内容は理解したつもりです。
Flexの本書いてる人だったり、フレームワーク作っちゃったりしてる人の発表でいい刺激を受けましたわ。
最後に本のプレゼントやらタンブラーのじゃんけんやらでプレゼントも豊富!
いやしんぼの私にはぴったりですね!
次回は何に参加しましょうかね?
2011年4月12日火曜日
Velocity
HTMLのテンプレートに変数を代入してから表示させる事が出来る。
他にもテキストファイルなら埋め込み可能。
これによって構成とデータを別々に管理しやすくなると。
eclipse用は→ここ
velocity-1.7.zip
この中のvelocity-1.7-dep.jarを使用。
テンプレート:index.vm
識別番号:$user.id
名前:$user.name
体重:$user.weight
身長:$user.height
データクラス:user.java
public class user {
private int id = 0;
private String name = "";
private int weight = 0;
private int height = 0;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public user(int id, String name, int weight, int height) {
this.id = id;
this.name = name;
this.weight = weight;
this.height = height;
}
public user() {}
}
マージクラス:test.java
import java.io.StringWriter;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
public class test {
public static void main(String[] args) {
user user = new user(1000, "銅鑼 衛門", 100, 200);
Velocity.init();
VelocityContext context = new VelocityContext();
context.put("user", user);
StringWriter stringWriter = new StringWriter();
Template template = Velocity.getTemplate("index.vm", "UTF-8");
template.merge(context, stringWriter);
System.out.println(stringWriter.toString());
stringWriter.flush();
}
}
2011年4月7日木曜日
GoogleMapsAPI V3で出来ること
- ちょろっとコードを書くだけでGoogleMapが自分のサイトに張り付けられる。
- 座標や住所によってピンを置くことが出来る。
- ルートの作成が可能
→中継地点も追加でき、巡回セールスマン問題を解いてくれるw - JavaScript、Flash、画像、3Dなどいろいろな形式が用意されている。
→PCからだったらJavaScript、モバイルだったら画像表示とかが可能。 - GoogleMap上やピンなどのイベントを処理できる。
→「クリックでズームする」など。
チュートリアルや解説が非常にわかりやすい
→Google Map JavaScript API V3 チュートリアル
2011年4月4日月曜日
ライブラリ
~jericho~
クラス・フォルダーを追加したらローカルでは動くがサーバ側でエラー。
JARファイルにしたら動いた。
URLフェッチ
URL url = new URL(req.getParameter("url")); BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); String line; String html = new String(); while((line = reader.readLine()) != null){ html += line + "\n" } reader.close();
トランザクション
PersistenceManager pm = PMF.get().getPersistenceManager(); Transaction ts = pm.currentTransaction(); Message message = new Message(); try { ts.begin(); message = pm.getObjectById(Message.class, keyParam); message.setName(nameParam); message.setMessage(messageParam); message.setCreatedAt(new Date()); pm.makePersistent(message); ts.commit(); } finally { if(ts.isActive()){ ts.rollback(); } pm.close(); }
こんな感じで、begin()、comit()、roolback()すればよろしい。
2011年4月3日日曜日
Googleアカウントを使う
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { UserService userService = UserServiceFactory.getUserService(); String thisURL = req.getRequestURI(); if(req.getUserPrincipal() != null){ resp.getWriter().print("<p>Hello, " + req.getUserPrincipal().getName() + "! You can <a href="" + userService.createLogoutURL(thisURL) + "">sign out</a>.</p>"); }else{ resp.getWriter().print("<p>Please <a href="" + userService.createLoginURL(thisURL) + "">sign in</a>.</p>"); } }からのweb.xml
<security-constraint> <web-resource-collection> <url-pattern>/admin/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint>とすれば/admin/以下は管理者のみしか見ることができない。
ちなみにローカルで実行するとダミーアカウントでの認証になる。
データの記録・取得・更新
オブジェクトを作成し、データをセット後、PMで記録する。
Message message = new Message(); message.setName(nameParam); message.setMessage(messageParam); message.setCreatedAt(new Date()); PersistenceManager pm = PMF.get().getPersistenceManager(); try { pm.makePersistent(message); } finally { pm.close(); }取得方法
プライマリキーで一つのデータのみ取得
PersistenceManager pm = PMF.get().getPersistenceManager(); Message message = new Message(); try { message = pm.getObjectById(Message.class, プライマリキー); } finally { pm.close(); }
すべて取得
PersistenceManager pm = PMF.get().getPersistenceManager(); Query query = pm.newQuery(Message.class); Listmessages = new LinkedList (); try{ messages.addAll((List ) query.execute()); } finally { query.closeAll(); pm.close(); }
PersistenceManager pm = PMF.get().getPersistenceManager(); Message message = new Message(); message = pm.getObjectById(Message.class, プライマリキー); message.setName(nameParam); message.setMessage(messageParam); message.setCreatedAt(new Date()); try { pm.makePersistent(message); } finally { pm.close(); }参考
データストアに保存するオブジェクトのクラスの書き方
//クラスがシリアライズ可能 @PersistenceCapable(identityType = IdentityType.APPLICATION) public class Message { @Persistent //シリアライズ可能 private String name; @Persistent //シリアライズ可能 private String message; @Persistent //シリアライズ可能 private Date createdAt; @PrimaryKey //シリアライズ可能 //プライマリキー @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) }
参考
日経ソフトウェア2010年8月号