ViユーザにもEmacsユーザにもなれなかったMac使いの小技

viとかemacsとか使ってる人はコマンドラインからエディタを立ち上げられて羨ましいと思っていたそこの貴方に朗報。

# .zshrcとかに
alias edit='open -a BBEdit'

openコマンドというものがありまして、引数で指定したファイルをFinderでダブルクリックした時のように開いてくれるのですが、-aオプションで使用するアプリを指定することができます。

openコマンドはよく使っていたけれど、少し前に-aオプションのことを知ったのであった。

金なし、コネなし、フィリピン暮らし! 改訂版

最近読んでいる本はこれです。

金なし、コネなし、フィリピン暮らし!改訂版

金なし、コネなし、フィリピン暮らし!改訂版

今度フィリピンで仕事をすることになっているので、この書籍から情報を仕入れています。
タイトルはけっこうふざけていますが、内容はしっかりしているように感じます。
現地に行ってからでないと、この本の内容が有用かどうかは判別できませんが。

Gitのリポジトリ眺めるのに便利なSourceTree

AppStoreをぼんやりと眺めていたら、SourceTreeというアプリが目に止まりました。
GitやMercurial、更にはSubversion(※)のリポジトリGUIから操作できるという代物。
Subversionはgit-svn経由

http://www.sourcetreeapp.com/

開発元を見たら、Bitbucketを傘下に収めたAtlassianの名前がありました。
しかしGitHub対応を謳っているので、GitHubでも安心して使えます。太っ腹。
というか、普通にGitクライアントなので当たり前ですね。

個人的には、コミットなどの操作はコマンドラインから行った方が便利だと思いますが、
履歴を眺めるには良いツールだと思います。特に履歴が入り組んでしまった時など。

バナナと日本人

「バナナと日本人 ーフィリピン農園と食卓のあいだー」(岩波新書鶴見良行著)という本を読みました。

30年も前の本なので、昨今の状況とはいささか異なるでしょうが、富が搾取から生まれていて、それを普段何気なく享受しているということがよく伝わる良書だと思いました。

Struts2あれこれ

仕事でStruts2を触ったので、そのメモ。

ActionFormみたいな何か

ModelDrivenインターフェースを実装することで、対象のモデルクラスのフィールドをアクションにMixinするような感じにできる。
getModel() メソッドでは、編集対象のモデルオブジェクトを返す。
通常は以下のような感じになるかと思う。

public class HogeAction extends ActionSupport implements ModelDriven<Hoge> {

    private Hoge hoge = new Hoge();

    public String execute() {
        return SUCCESS;
    }

    public Hoge getModel() {
        return hoge;
    }

}

リクエストパラメータで渡ってきた値は自動的にモデルオブジェクトに設定される。
モデルに設定されたプロパティはStrutsのタグなどで参照可能。

<s:textfield key="hogehoge" />

既存のデータをモデルオブジェクトに読み込む

編集処理などでは、DBからモデルの内容を読み込みたいと思うだろうが、通常のアクション処理の中でモデルを書き換えてもうまくいかない。
Struts2がgetModel()する前にモデルを初期化しなければいけないのだ。
アプローチはたぶん2つくらいある。

  1. getModel() 内でデータを読み込む
  2. Preparableインターフェースを実装して、prepare()内でデータを読み込む

まず、どちらにせよ、リクエストパラメータはServletRequestのものを生で使う必要がある。
implements ServletRequestAware ってやると幸せ。
Preparableの例は以下のような感じ。

public class HogeAction extends ActionSupport implements ModelDriven<Hoge>, ServletRequestAware, Preparable {

    private Hoge hoge = new Hoge();
    private HttpServletRequest request;

    public String execute() {
        return SUCCESS;
    }

    public Hoge getModel() {
        return hoge;
    }

    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
    }

    public void prepare() {
        int id = Integer.parseInt(request.getParameter("hoge_id"));
        hoge = モデルオブジェクト読込処理(id);
    }

}

CSSのclass属性を設定する

cssClass属性を設定すればOK.

<s:textfield key="hoge" cssClass="bar" />

org.apache.struts2.util.TextProviderHelperのWARNログがうるさい

log4j.xmlに以下の設定。

<category name="org.apache.struts2.util.TextProviderHelper">
  <priority value="error"/>
</category>

Actionで発生した例外をログ出力しつつエラーページを表示

struts.xml抜粋

<interceptors>
  <interceptor-stack name="myDefaultStack">
    <interceptor-ref name="defaultStack">
      <param name="exception.logEnabled">true</param>
      <param name="exception.logLevel">ERROR</param>
    </interceptor-ref>
  </interceptor-stack>
</interceptors>
<default-interceptor-ref name="myDefaultStack"/>
<global-results>
  <result name="systemError">/error.jsp</result>
</global-results>
<global-exception-mappings>
  <exception-mapping result="systemError" exception="java.lang.Exception"></exception-mapping>
</global-exception-mappings>

CygwinのPerlで "Unable to remap" とか言われたときの対処法

久々にCygwinPerlを使ったら、"Unable to remap xxxx.dll" とか言われた。

Perlのプロセスを全部落として perlrebase を実行したら解決した。

参考: http://u.hoso.net/2011/01/rebase-for-perlbrew-perl-on-cygwin.html