ちょっと変更した画像ビュア

ImageViewer.java

public class ImageViewer {
    public static void main(String[] args) {
        if (args.length > 0) javax.swing.JOptionPane.showMessageDialog(null, null, args[0], 0, new javax.swing.ImageIcon(args[0]));
    }
}

 せっかく画像をIconとして持っているのでJLabelに貼り付けたりせずに直接アイコンとして指定。大きい画像を開いてしまうと閉じるのが面倒なのは一緒。まあ了解ボタンが見切れていることを知っていれば全く面倒はないですが。

手っ取り早くイベントソース

 別にJavaBeansでないと利用できないわけではなし

DingEvent.java

import java.beans.PropertyChangeEvent;

public class DingEvent extends PropertyChangeEvent {
    public DingEvent(Object source) {
        super(source, null, null, null);
    }
}

DingListener.java

import java.beans.PropertyChangeListener;

public interface DingListener extends PropertyChangeListener {
}

Bell.java

import java.beans.PropertyChangeSupport;

public class Bell {
    private PropertyChangeSupport support = new PropertyChangeSupport(this);
    private String name;

    public Bell(String name) {
        this.name = name;
    }

    public void addDingListener(DingListener listener) {
        support.addPropertyChangeListener(listener);
    }

    public void removeDingListener(DingListener listener) {
        support.removePropertyChangeListener(listener);
    }

    public void ring() {
        support.firePropertyChange(new DingEvent(this));
    }

    @Override
    public String toString() {
        return name;
    }
}

Cittadino.java

import java.beans.PropertyChangeEvent;

public class Cittadino implements DingListener {
    public void propertyChange(PropertyChangeEvent e) {
        if (e instanceof DingEvent) {
            System.out.println(e.getSource() + ": dingdong");
        }
    }
}

BellRinger.java

public class BellRinger {
    public static void main(String[] args) {
        Bell bell = new Bell("Nona la campana");
        bell.addDingListener(new Cittadino());
        bell.ring();
    }
}

コーヒー豆

 まあ普通に

Bean.java

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;

public class Bean implements Serializable {
    private String property;
    private PropertyChangeSupport support = new PropertyChangeSupport(this);

    public String getProperty() {
        return property;
    }

    public void setProperty(String property) {
        String old = getProperty();
        this.property = property;
        support.firePropertyChange("property", old, property);
    }

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        support.addPropertyChangeListener(listener);
    }
}

BeanUser.java

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

public class BeanUser {
    public static void main(String[] args) {
        Bean bean = new Bean();
        bean.addPropertyChangeListener(new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent e) {
                System.out.println("source: " + e.getSource() + ", property: " + e.getPropertyName() + ", old: " + e.getOldValue() + ", new: " + e.getNewValue());
            }
        });
        bean.setProperty("foo");
        bean.setProperty("bar");
    }
}

バッチファイルの代わりにPerlスクリプトで

 linuxMacOSXではシェルスクリプトで十分なのですが、Windowsのバッチファイルではちょっと苦しい面が。メインで使用するコマンドラインシェルをcmdから変更する手もあるのですが、バッチファイルで記述する処理の一部をライトウエイト言語のスクリプトで代替させる方向に。手元のWindows環境には行指向なsedawkなどしか入れてませんので、メジャーなところでPerlを入れてみました。
 というわけでActiveじゃなくてStrawberry Perlです。Perlの最新リリースは5.12.3ですがこちらは5.12.2でした。zip配布のものをダウンロードして適当な場所に展開し、展開したディレクトリ下のperl\binにパスを通すバッチファイルを書きます。これはパスにパーマネントな設定をせず、使うときだけ使えるようにするためです。
 コマンドプロンプトで、

 > perl --version

This is perl 5, version 12, subversion 2 (v5.12.2) built for MSWin32-x86-multi-thread
...

 > perl -E "say \"こんにちは世界\""
こんにちは世界

 > type hello.sh
#!/bin/sh

echo 'hello world'

 > perl -nE "given($_){say'comment'when/^#/;say'empty'when/^$/;default{say'snip...'}}" < hello.sh
comment
empty
snip...

 > 

と、ぞんざいにインストールした割にちゃんと動いているようです。
 Strawberry Perlには展開したディレクトリ下のcにMinGW環境が付属しています。もしかしてこのbinにもパスを通すべきなのかもですが、元々MinGWは入れており、両者のバージョンも違うので扱いが悩ましいところです。まあ使っていて問題が出た時に適当に対処する方向で。
 目的がバッチファイルの代替であって、ばしばし機能を使いこなす方向にはもっていかないつもりなので多分大丈夫でしょう。制御構造だけを利用するのでなくデータ処理も組み込もうと思えば組み込める余裕ができるのは精神的に楽かもですが。

ECO 奇跡のチョコケーキ作り過ぎ

 ECO、ひっそり続けてます。というか、昨年10月末辺りから始まった夏休み朝のラジオ体操のスタンプ帳もてなしタイニーのおかげで接続するだけなら高頻度になってます。スタンプを押してもらうためだけに接続するとかもあったり。まあ結局のところ長時間プレイするほどに暇があることは滅多にないですけど。
 そんな中、今年もやってきましたバレンタインイベントが。いつもならメインPC用に奇跡なのが1個できれば十分だったのです。5,60セットくらいトライすれば1個は確実にできますから。
 でも今年は何を間違ったのか300セットも作ったところ奇跡のチョコケーキができあがる確率はいつも通りだったようで6個できました。チョコケーキの4材料はともにアクロポリスシティの近場で採れるものばかり*1なので時間さえあれば集めるのは難しくないとはいえ作り過ぎ。酒場のバレンタイン用代理作成クエストの報酬でもらえるアイテムがもう少し魅力的ならそちらに回してもいいのですが。
 できあがったチョコケーキ、誰に渡すかは内緒です。

*1:チョコの狩場は遠い世界といえば遠いですけど