2013年11月28日木曜日

VelocityをTomcat(JSP)で使う

JavaテンプレートエンジンのVelocity。2011年から更新されていない様子で「いまさら」なのかはよく知らないが、見る限りテンプレートとしての機能は十分そうだし、導入が簡単そうなので試してみる。

Velocityの利点はたぶん、

  • jar2つで動く
  • Web画面の出力と非Web帳票出力との両方に使える
だ。



・・・更新がないのは安定しているからだろう。きっとそうだ。

http://velocity.apache.org 本家
http://velocity.apache.org/engine/releases/velocity-1.7/user-guide.html テンプレート記法


以下、Veloctityを、(Windows, Eclipse, Tomcatな環境で動かしてみた際のメモ。

  1. ダウンロード http://velocity.apache.org/download.cgi#engine
    1.   velocity-1.7.zip
  2.  解凍して、
    1. EclipseのDynamicWebProjectのプロパティで、
      1. velocity-1.7.jar ...本体
      2. velocity-1.7-dep.jar ...依存ライブラリ
    2. ..を外部JARファイルとして追加


これで、クラスが作れる。

サンプル。データを持つクラスはつまりgetXXXがあればいいらしい。ここではItemクラスを作った。
それを使うクラスは仮にこんな。

→ getXXXは、テンプレートから$item.XXXという$item.getXXX()の短縮系を使えるというだけだった。自分の好みとしては不要かも。最初からxxx()というメソッドを作って、$item.xxx()と呼ぶ方がいい。かも。いやどうかな?


package hoge;
import java.io.Writer;
import java.math.BigDecimal;

import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

public class Controller {
public static void write(Writer out, String tmpl){
Item item = new Item();
item.name = "Some Item";
item.price = new BigDecimal("1500");

Velocity.init();
VelocityContext vc = new VelocityContext();
vc.put("item", item);

Velocity.evaluate(vc, out, "logTag", tmpl);

}
}



Tomact側で動かす準備は、

まず、JSPを用意。一応はテンプレートエンジンのはずであるが、そこからテンプレートエンジンを呼ぶ。

<%@page import="hoge.Controller"%>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<html>
(...中略)
<body>
<%
  Controller.write(
out,
    "<h1>$item.name</h1><dl><dt>price</dt><dd>$item.price</dd></dl>"
  );
%>
</body>
</html>



  1. EclipseのプロジェクトのプロパティでDeployment Assemblyを選び、
  2. Java Build Path Entriesあたりから先ほどのVelocityのjar2つを追加


JSPにアクセスするとレンダリングされる。


通常は、テンプレートはitem.vmなどというテキストファイルを書いておいてVelocityに探させる。が、自分の好みとしては、そのテンプレートの内容も動的にしたいわけで、だからここでは仮にリテラルにしてある。


2013年11月25日月曜日

MediaWikiのCSS編集

以下のページで上書き用のCSSを追記する。

/wiki/index.php/MediaWiki:Common.css

"/wiki"はLocalSettings.phpの$wgScriptPath部分、"index.php"は隠すように設定しているなら抜く。


自分としては、標準のCSSで見出しの区切り目がわかりにくく、特にh3とh4の差がわからないのでh4が親のh3の節の中の小見出しなのに次の節のように見えてしまうのが気に入らない。

ので、

こんな風にしている。

body {
 font-family:'Lucida Grande','Hiragino Kaku Gothic ProN',Meiryo, sans-serif;
}
#bodyContent {
 line-height:175%;
}

h1, h2 {
 margin-top:1.5em;
}
h3, h4 {
 margin-top:1em;
}

h4 span.mw-headline {
 font-size:100%;
 font-weight:normal;
 color:#333;
 border-bottom:1px solid #999;
}

2013年11月20日水曜日

UMLのアグリゲーション(集約)とコンポジション

どう使い分ければいいかいつも悩んでしまう。

自分はJavaなので、フィールドに持つか持たないかとかで分けるかな?なんて考えたりもしたが、そんな内部設計的なことで考えるのも違うだろうという気がするし。

で、わかりやすいひとつの基準として、いくつかのサイトの解説をもとにまとめておく。


早い話が、コンポジションはアグリゲーションの一種だが、その対象要素がそれぞれ独立しては存在し得ないほど結びつきが強いものがコンポジションだそうで。

パソコンをUMLで表現するとして、「デスクトップPCとモニタは集約、ノートパソコンとそのスクリーンはコンポジション」だそうです。

この場合、モニタが壊れたてもPCは使い続けられるが、ノートPCでスクリーンが割れたら捨てるしかないし、付け替えはできない。(※修理の話しを始めるややこしくなるので、修理などいっさい出来ないと仮定する)

・・・アグリゲーションの構成は可変だが、コンポジションは構成が変わらないというのはひとつ明確な基準かも知れない。

なお、引数などとして一時的に参照するだけならば「依存(dependancy)」、has-a関係ではないただの関連付けは「関連(association)」となり、集約ではない。

依存や関連で参照するクラスを、効率上の都合などから実装時のクラスがフィールドも持つこともあるだろうが、それは集約とはしない方がいいのだろうと思う。

あくまでも、本来の意味、構造的に包含関係がある場合に、集約を用いるべきなのだろう。



参考にしたサイト:

  • http://www.itmedia.co.jp/im/articles/0302/22/news001.html パソコンのたとえ話の出典
  • http://itref.fc2web.com/uml/#dependency 

2013年11月19日火曜日

Apache2にダイジェスト認証

Apache2にダイジェスト認証をつける。



httpd.confに追記

<Directory "/home/venzoline/apache2/htdocs/wiki">
    AuthType Digest
    AuthName "Private Zone"
    AuthDigestDomain /wiki/
    AuthDigestFile /home/venzoline/apache2/.htdigest
    Require valid-user
</Directory>

Apache再起動。


これで、AuthDigestFileに定義したユーザ名とパスワードで認証要求される。
が、そんなファイルは実在していないので以下のコマンドで作る。
コマンド打つとパスワード設定のプロンプトが出る。


$ htdigest -c .htdigest 'Private Zone' myusername

 ※-cは新規に".htdigest"という名前でその場にパスワードファイルを作るの意

$ htdigest .htdigest 'Private Zone' myusername2

 ※その後のユーザ追加

ユーザの削除は・・・知らない。コマンドのヘルプにはない。パスワードファイルから消せばいんじゃないかな。ユーザ名は平文のテキストファイルだったので。

ユーザ追加時にはApacheの再起動は不要。


参考:http://www.atmarkit.co.jp/flinux/rensai/linuxtips/699apachedigest.html