年末の感覚

昨日は家を出るときに外が真っ白になっていました。雨戸を閉めっぱなしにしていて気付かなかったのですが、雪が降ると冬になった気分になりますが、どうも年末だという気分になれていません。
年末という感覚は何を基準に感じ取るものなのでしょうか。

掲示板もRSS

知り合いのホームページの掲示板がteacupというサイトを利用しているのですが、最近RSSに対応していることがわかりました。
掲示板もRSSで購読するようになるとは思っていませんでしたが、1日に数件の書き込みであればかなりお勧めです。
コンピュータが出現して様々なものがアナログからデジタルになったと思います。自分の生活だけを考えても、音楽はコンパクトディスクやMP3プレイヤーで聴くようになり、映画はDVDで観るようになり、辞書はWEBサービスになり、新聞はRSSでの取得になり、メモ書きはテキストファイルかソーシャルブックマークとなり、仕事はプログラミングとなり・・・
共通しているのはどれも情報に関することである点でしょうか。記憶と計算はコンピュータが得意なので、その力に頼ることで別の新たな開拓を行うことが出来ます。欠点は頼ることで使わない能力が低下することですね。計算機を使えば計算できなくなりますし、タイプしてると漢字を書けなくなります。
今はまだコンピュータはツールですが、将来的には攻殻機動隊のようにツールではなく本体になってしまうかもしれませんね。いや、ゴーストがあればどんなに同化していようともツールなのかもしれませんが。

引数ありのカーソル定義

PL*SQLでカーソルを定義するときには

CURSOR my_cursor IS
SELECT
*
FROM
my_table;

とかやりますが、このカーソル定義に引数がとれることを知りませんでした。例えば引数の日付に一致するカーソルを定義するとこのようになります。

CURSOR my_cursor (target_date DATE) IS
SELECT
*
FROM
my_table
WHERE
my_date = target_date;

呼出元では

FOR my_record IN my_cursor(SYSDATE) LOOP
END LOOP;

というような感じになります。応用が利かないようで利くPL*SQLです。

はてなRSSのキーボード操作

jキー:次の記事へ
kキー:前の記事へ
nキー:次のグループへ
pキー:前のグループへ
mキー:「もっと読む」を開く・閉じる

このEmacs風味なキー操作は便利だなと思っているのですが、unDonutの検索バーで検索文字を入力しているときにフォーカスを取られるので少々困ったりもします。あとURLを直接入力しているときも同様です。
その場合はbrankページを開いてから入力したり、複数ページを開いている場合はタブを切り替えてから入力したりする訳ですが、どうもこの一手間が気になります。
設定画面の項目としてキー操作を利用するかどうかのチェックがあっても良いかなと思いますが、普段は利用したいので結局は我が儘なだけかもしれません。

PCサイトビューワ携帯

携帯を換えました。電話番号は同じが良かったのでAUのままですが、せっかくなので何か新しい機能の付いているものという基準で選び、着目したのがPCサイトビューワ。使ってみた印象は思っていたより良かったです。

  • 画面が綺麗。今までよりピクセルのサイズが小さくなっているので、同じ幅でも結構な情報量を表示してくれますし、色もGoodです。
  • 通信が速い。WINになるだけでこれ程体感速度が違うとは思いませんでした。通常のEZwebもかなり速くなりました。
  • UIもなかなか。画面のリンク一覧表示などブラウザも昔よりかなり良くなってます。

ただ、難点なのが通信料。ダブル定額なので上限は決まっているものの、まともに使ったらすぐに上限金額までいきます。なので、ものとしては面白いけど、実用で使うにはちょっとという感じです。
通信代が掛からなって、携帯とノートPCでWebをフル活用できるようになる日が早く来て欲しいものです。

文字を連ねて検索すると?(Yahooもマルチバイトも)

以前Googleで文字を連ねて検索するとPDFが検索結果になるということを書きましたが、マルチバイトでも同じ結果になります。因みに、Yahoo!で検索しても同じような症状になりました。

例えば「メメーールル」や「言言語語」で検索した場合のことなのですが、やっぱり原因は知らないままです。当然、PDFファイル内には連なった文字列は存在しないので、不思議な現象です。

unDonutのページが更新

unDonutのページがしばらく更新されていませんでしたが、久しぶりに更新がありました。
http://undonut.sakura.ne.jp/
最近のWebブラウザFirefoxの人気が高くIE離れとなってきていますが、どのブラウザもある程度同等の機能をサポートしてきていますので、動作の軽さやカスタマイズ性が選択の分岐点でしょうか。unDonutから乗り換えるべくいろいろ使ってはみるものの、まだ使い続けています。
別のブラウザを探している人はタブブラウザ推奨委員会とかで探してみるのもいいでしょう。

Hikiを入れてみました

PukiWikiからの乗り換え先を探していましたが、結局Hikiにしました。
とりあえずは移行せず触ってみていますが、PukiWikiよりはインタフェースが親切な印象です。自宅のサーバーのApacheはmod_rubyを入れていないので、CGI環境で動かしていますが、動作も問題なさそうなので慣れてきたらデータを移行しようかと思います。

Wikiのクローン同士でデータを移すときに良い方法はあるものでしょうか。エクスポートできたりすると楽なのですが、多分整理しながら作り直すことになるのかなとは思っています。それはそれで楽しいからいいのですが。

検索エンジンはGoogleばかり使ってましたが

GoogleとYahooで「java」という単語を検索するだけでも、結構上位の結果が違うものですね。Googleではもっぱらプログラミング言語Javaといった結果ですが、Yahooだと2位にNPO法人 動物実験廃止を求める会(JAVA)という結果があって、私自身知らなかったので勉強になりました。

たまには別の検索エンジンを使ってみると発見があるかもしれません。

Swingでウインドウを表示する

TestFrame

小さなJavaアプリケーションを作るときのやり方を一つ。
人によってかなり差があるかもしれませんが。
一応、実行時の画像も載せます。
Endボタンで終了するだけで機能は全然ないです。

とりあえず先にコードを。

ソースコード

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TestFrame extends JFrame {
private JPanel panel;
private JLabel label;
private JButton button;
public TestFrame() {
super("TestFrame");
initComponents();
initLayout();
setSize(150,70);
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public void initComponents() {
panel = new JPanel();
label = new JLabel("Hello World");
button = new JButton("End");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
actionButton();
}
});
}
public void initLayout() {
panel.setLayout(new BorderLayout());
panel.add(label, BorderLayout.NORTH);
panel.add(button, BorderLayout.CENTER);
getContentPane().add(panel);
}
protected void actionButton() {
System.exit(0);
}
public static void main(String[] args) {
new TestFrame();
}
}

私がいつもやるのはコンストラクタで、フレームやパネルのあるべき姿を作ることです。この例ではJFrameを継承してその持ち物に部品をフィールドとして持っています。このコードではフィールドにしなくてもよさそうですが、別のウインドウや処理から参照するアクセサメソッドが必要になると、このようにしている方が便利な場合が多いです。

コンストラク

    public TestFrame() {
super("TestFrame");
initComponents();
initLayout();
setSize(150,70);
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}

この部分がコンストラクタですが、親コンストラクタを呼び出した後に、コンポーネントの生成、レイアウトの調整を行って、最後にフレーム自体のレイアウトや初期設定を行っています。

コンポーネント生成

    public void initComponents() {
panel = new JPanel();
label = new JLabel("Hello World");
button = new JButton("End");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
actionButton();
}
});
}

コンポーネント生成のメソッドですが、未だにpublicかprotectedかで悩みます。ヘルパメソッドをprivateにすることはあまりありませんが、フレームの初期化を他から実行するかどうかは一般的にはどちらが良いのでしょうか。
内容は生成と部品の初期化で必要な作業のレイアウト以外を行います。この場合はボタン押下のアクションを定義しています。

レイアウト調整

    public void initLayout() {
panel.setLayout(new BorderLayout());
panel.add(label, BorderLayout.NORTH);
panel.add(button, BorderLayout.CENTER);
getContentPane().add(panel);
}

レイアウト作業です。この中身は時と場合によって大きく変化します。

アクションメソッド

    protected void actionButton() {
System.exit(0);
}

ここではイベントが一つしかないので直接処理を記述していますが、複数のアクションイベントがある場合はコントローラメソッドを作って分岐することもあります。

このようなイメージでフレームに外部で定義したJPanelの継承クラスなどを配置して作ってます。只、規模が大きくなるとレイアウトの調整などがまとまっていないとツライかなとも思いますが。

Swingは一つ一つがキレイなオブジェクトなので(勿論Javaのコアライブラリは遍くそう設計されていますが)同じ思想に乗っかるだけで簡単にオブジェクティブなコードを書くことができます。
今回はActionListenerを無名クラスにしているので少し手抜き感がありますが、これも必要であればクラスとして作っていくと、一つのクラスには一つの概念のみを定義すべきとのオブジェクト指向の考え方に則って作ることができて、スッキリしたコードで実現することができます。