<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
   <channel>
      <title>Think Different.</title>
      <link>http://nanasess.net/mt/</link>
      <description>A dream does not escape. but He always escapes.</description>
      <language>ja</language>
      <copyright>Copyright 2008</copyright>
      <lastBuildDate>Mon, 05 May 2008 20:09:46 +0900</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/?v=4.1</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

      
      <item>
         <title>GW 中にやったこと</title>
         <description><![CDATA[<p>GW 中にやったことをちょっとまとめてみる...<br />
インフラまわりは, ほとんど深夜やっていたので, 寝るのは午前中って感じでした...<br />
でも, かなりすっきり.
</p>

<h4>確定申告</h4>
<p>毎年のことなのですが, うちの会社の「確定深刻」は GW 勝負なのです(汗)</p>
<p>今年は, <a href="http://www.e-tax.nta.go.jp/" target="_blank">e-Tax</a> を使ってみましたが, イマイチ便利になってない...<br />
税務署へ持って行く手間はなくなりましたが, 事業税などの申告は別にやらなきゃいけないし, 電子証明書の申請をしに法務局へ行かなきゃいけない.<br />
数字の計算くらい, 明細書から自動計算してくれれば楽なのに(苦笑)</p>

<h4>FreeBSD 4.x-RELEASE から 6.3-RELEASE へのアップグレード</h4>
<p>FreeBSD 4.11-RELEASE が, まだ4台稼動していたので, すべて 6.3-RELEASE にアップグレード.<br />
Celeron 700MHz という骨董品ですが, これでまた, 暫くは心おきなく使えますw</p>
<p>手順は, 下記とほとんど同じ<br />
<a href="http://nanasess.net/mt/2006/12/freebsd4_freebsd6.html">FreeBSD4 から FreeBSD6 へのアップグレード</a></p>

<h4>jail でまとめる</h4>
<p>上記の FreeBSD4.11-RELEASE で稼動していたうちの3台を, jail(8) を使って1台に統合しました.<br />
減らしたやつは, 予備機として頑張ってもらいます.</p>
<p><strong>sysutils/ezjail</strong> を使って構築も楽ちん.</p>

<h4>ipfilter から pf へ乗り替え</h4>
<p>ipfilter は, 今後メンテされなくなるようなので, 6.3-RELEASE へアップグレードしたついでに, pf へ乗り替え.<br />
構文もすっきりして, メンテもしやすくなりました.<br />
特に, ルータとして使っているやつは, 細かい設定ができてステキ.<br />
<strong>set block-policy drop</strong> とか良い感じです.
</p>
<p>下記を参考にしました<br />
<a href="http://www.daily-labo.com/content_22.html" target="_blank">FreeBSDでPacketFilter(pf)を使う</a></p>

<h4>過去の遺産の整理...</h4>
<p>4.11-RELEASE が現在までも稼動していたのもそうですが, 過去に書いたバックアップスクリプトとかを, メンテしやすいようにいろいろ更新. サーバーで USBキーボードを使えるようにしたりだとか...<br />
あ, DHCP サーバーも jail(8) で動くようにして, WIDE-DHCP を <strong>net/isc-dhcpd-server</strong> にしました.
</p>

<h4>Firemacs のアイコン</h4>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="firemacs.jpg" src="http://nanasess.net/mt/firemacs.jpg" width="127" height="137" class="mt-image-none" style="" /></span></p>
<p>山本さん, 大変永らくお待たせ致しました...(汗)<br />
また, <a href="http://d.hatena.ne.jp/kazu-yamamoto/20080505/1209973107">拙作のアイコンをご採用</a>頂き, ありがとうございました!</p>

<h4>心残り...</h4>
<p>EC-CUBE をほとんど触れなかったのがざんねん...<br />
もうちょっと精進します...</p>
]]></description>
         <link>http://nanasess.net/mt/2008/05/gw.html</link>
         <guid>http://nanasess.net/mt/2008/05/gw.html</guid>
         <category>Applications</category>
         <pubDate>Mon, 05 May 2008 20:09:46 +0900</pubDate>
      </item>
      
      <item>
         <title>NTEmacs にしてみた</title>
         <description><![CDATA[<p>今まで, Windows 環境では <a href="http://www.meadowy.org/meadow/" target="_blank">Meadow</a> を使っていましたが, NTEmacs もちょっと気になって <a href="http://ntemacsjp.sourceforge.jp/matsuan/IndexJp.html" target="_blank">NTEmacsJp project の NTEmacs</a> を入れてみました.</p>
<p>そしたら, アイコンが Emacs23 と同タイプになっているではありませんか!!<br />
感謝感激!! 廣松さん, ありがとうございます!</p>
<p>使い心地は, 良い感じ.<br />
気のせいかもしれませんが, Meadow に比べると, ちょっと速くなったような感じがします.<br />
でも, Meadow みたいに NetInstall で簡単に設定することができないので, 玄人向けですね.
</p>

<p>しかし, Windows 環境でも, Emacs23 のアイコンが使えてシアワセです.</p>
]]></description>
         <link>http://nanasess.net/mt/2008/04/ntemacs.html</link>
         <guid>http://nanasess.net/mt/2008/04/ntemacs.html</guid>
         <category>Emacs</category>
         <pubDate>Sun, 27 Apr 2008 02:29:34 +0900</pubDate>
      </item>
      
      <item>
         <title>BeanUtils の使い方</title>
         <description><![CDATA[<p><a href="http://nanasess.net/mt/2004/11/beanutils.html">かなり前に書いた記事</a>を, ちゃんとまとめてみました.</p>

<p>BeanUtils の使い方サンプルです.<br />
JUnit4 のテストケースとして書いてみました.</p>

<pre>
/*
 * $Id$ 
 */
package net.nanasess.examples;

import static org.junit.Assert.*;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.junit.Before;
import org.junit.Test;

/**
 * BeanUtils の使い方.
 * 
 * 基本的に, データ型を String に変換して返します.
 * 変換したくない場合は, {@link PropertyUtils} を使います. 
 * 
 * @author Kentaro Ohkouchi
 * @version $Revision$ $Date$
 */
public class BeanUtilsTest {
    
    private FooBar fooBar;
    
    @Before
    public void before() {
        fooBar = new FooBar();
    }
    
    /**
     * {@link BeanUtils#cloneBean(java.lang.Object)} の使い方.
     * 
     * Cloneable を implements してなくても Bean の複製ができます.
     */
    @Test
    public final void testCloneBean() throws Exception {
        Bar bar = new Bar("bar");
        String excepted = "bar";
        
        // bar を複製する
        Bar actual = (Bar) BeanUtils.cloneBean(bar);
        
        assertEquals(excepted, actual.getExample());
    }

    /**
     * {@link BeanUtils#copyProperties(java.lang.Object, java.lang.Object)} の使い方
     * 
     * 同じプロパティ名のデータを orig から dest へコピーします.
     * この場合, example というプロパティが双方に存在するので, example のデータがコピーされます.
     */
    @Test
    public final void testCopyProperties() throws Exception {
        Bar orig = new Bar();
        ExampleClass dest = new ExampleClass();
        
        // 同じプロパティ名のデータを orig から dest へコピーする.
        BeanUtils.copyProperties(dest, orig);
        
        // orig が Map の場合は, プロパティ名と Map の key が一致した場合コピーされる.
        Map<String, String> map = new HashMap<String, String>();
        map.put("foo", "foo");
        BeanUtils.copyProperties(dest, map);
        
        // example の内容がコピーされる
        assertEquals(orig.getExample(), dest.getExample());
        // Map の内容もコピーされる
        assertEquals(map.get("foo"), dest.getFoo());
        // baz は null のまま 
        assertNull(dest.getBaz());
    }

    /**
     * {@link BeanUtils#copyProperty(java.lang.Object, java.lang.String, java.lang.Object)} の使い方.
     * 
     * 指定したプロパティのデータをコピーします.
     * ネストしたプロパティもコピーできます.
     */
    @Test
    public final void testCopyProperty() throws Exception {
        Bar bar = new Bar();
        ExampleClass bean = new ExampleClass();
        
        // 指定したプロパティのデータを bean にコピーします.
        BeanUtils.copyProperty(bean, "foo", "foo");
        // ネストした Bean もコピーできます.
        BeanUtils.copyProperty(bean, "bar", bar);
        
        assertEquals("foo", bean.getFoo());
        assertEquals("example", bean.getBar().getExample());
        
    }

    /**
     * {@link BeanUtils#describe(java.lang.Object)} の使い方.
     * 
     * bean のプロパティ名を key, プロパティのデータを value とした Map を返します.
     * プロパティのデータ型に関わらず, value は String になります...
     */
    @Test
    public final void testDescribe() throws Exception {
        
        // value に格納されるデータを String にキャストして Map で返します.
        Map<String, String> map = BeanUtils.describe(fooBar);
        
        assertEquals("foo", map.get("foo"));
    }

    /**
     * {@link BeanUtils#getArrayProperty(java.lang.Object, java.lang.String)} の使い方.
     * 
     * プロパティ名を指定して, プロパティの値を String の配列で返します.
     * プロパティのデータ型が配列の場合は, String の配列に変換して返します.
     * コレクションの場合も, String の配列に変換して返します.
     * それ以外のデータ型の場合は, {@link Object#toString()} の値を String の配列に格納して返します.
     */
    @Test
    public final void testGetArrayProperty() throws Exception {
        
        // プロパティ名を指定して, String の配列を返します.
        String[] strings = BeanUtils.getArrayProperty(fooBar, "strings");
        assertArrayEquals(fooBar.getStrings(), strings);
        
        // プロパティが配列では無い場合も String の配列が返ってきます.
        String[] foo = BeanUtils.getArrayProperty(fooBar, "foo");
        assertArrayEquals(new String[]{"foo"}, foo);
    }

    /**
     * {@link BeanUtils#getIndexedProperty(java.lang.Object, java.lang.String)} の使い方.
     * 
     * プロパティ名[インデックス番号] のように, インデックスを保持するプロパティから, インデックス番号を指定して
     * 値を String で返します.
     * インデックスを保持しないプロパティは, {@link IllegalArgumentException} になります.
     */
    @Test(expected=IllegalArgumentException.class)
    public final void testGetIndexedPropertyObjectString() throws Exception {
        
        // プロパティ名とインデックス番号を指定して String の値を返します.
        String actual = BeanUtils.getIndexedProperty(fooBar, "strings[2]");
        assertEquals("ghi", actual);
        
        // インデックスを保持しないプロパティは IllegalArgumentException になります.
        String foo = BeanUtils.getIndexedProperty(fooBar, "foo[0]");
    }

    /**
     * {@link BeanUtils#getIndexedProperty(java.lang.Object, java.lang.String, int)} の使い方.
     * 
     * {@link BeanUtils#getIndexedProperty(java.lang.Object, java.lang.String)} に
     * 似ていますが, インデックス番号を int で指定するところが異なります.
     */
    @Test
    public final void testGetIndexedPropertyObjectStringInt() throws Exception {
        
        // プロパティ名とインデックス番号を指定して, String の値を取得します.
        String actual = BeanUtils.getIndexedProperty(fooBar, "strings", 2);
        assertEquals("ghi", actual);
    }

    /**
     * {@link BeanUtils#getMappedProperty(java.lang.Object, java.lang.String)} の使い方.
     * 
     * プロパティが Map の場合, プロパティ名(key) のように指定して, 値を String で返します.
     * プロパティが Map 以外の場合は, null を返します.
     */
    @Test
    public final void testGetMappedPropertyObjectString() throws Exception {
        
        // プロパティ名と key を指定して, String の値を返します. 
        String actual = BeanUtils.getMappedProperty(fooBar, "map(abc)");
        assertEquals("abc of value", actual);
        
        // プロパティが Map 以外の場合は, null を返します. 
        assertNull(BeanUtils.getMappedProperty(fooBar, "foo(key)"));
    }

    /**
     * {@link BeanUtils#getMappedProperty(java.lang.Object, java.lang.String, java.lang.String)} の使い方.
     * 
     * {@link BeanUtils#getMappedProperty(java.lang.Object, java.lang.String)} に
     * 似ていますが, key を第3引数で指定するところが異なります.
     */
    @Test
    public final void testGetMappedPropertyObjectStringString() throws Exception {
        
        // プロパティ名と key を指定して, String の値を返します.
        String actual = BeanUtils.getMappedProperty(fooBar, "map", "abc");
        assertEquals("abc of value", actual);
    }

    /**
     * {@link BeanUtils#getNestedProperty(java.lang.Object, java.lang.String)} の使い方.
     * 
     * ネストした Bean のプロパティをドットシンタックスで取得できます.
     * 値は String で返します.
     */
    @Test
    public final void testGetNestedProperty() throws Exception {
        
        // ネストしたプロパティを取得します.
        String actual = BeanUtils.getNestedProperty(fooBar, "bar.example");
        assertEquals("example", actual);
    }

    /**
     * {@link BeanUtils#getProperty(java.lang.Object, java.lang.String)} の使い方.
     * 
     * 便利屋さんです.
     * プロパティのデータ型に合わせた方法で, プロパティ名やインデックスを指定することで, プロパティの値を
     * String で取得できます.
     */
    @Test
    public final void testGetProperty() throws Exception {
        
        // プロパティ名を指定して String の値を返します.
        String foo = BeanUtils.getProperty(fooBar, "foo");
        assertEquals("foo", foo);
        
        // プロパティ名とインデックス番号を指定して String の値を返します.
        String strings = BeanUtils.getProperty(fooBar, "strings[2]");
        assertEquals("ghi", strings);
        
        // プロパティ名と key を指定して, String の値を返します. 
        String map = BeanUtils.getProperty(fooBar, "map(abc)");
        assertEquals("abc of value", map);
        
        // ネストしたプロパティを取得します.
        String actual = BeanUtils.getProperty(fooBar, "bar.example");
        assertEquals("example", actual);
    }

    /**
     * {@link BeanUtils#getSimpleProperty(java.lang.Object, java.lang.String)} の使い方.
     * 
     * プロパティ名を指定して, String の値を返します.
     * {@link BeanUtils#getProperty(java.lang.Object, java.lang.String)} とは挙動が
     * 異なるため, 単純な Bean の値を取得するのに適しています.
     */
    @Test(expected=IllegalArgumentException.class)
    public final void testGetSimpleProperty() throws Exception {
        
        // プロパティ名を指定して String の値を返します.
        String foo = BeanUtils.getSimpleProperty(fooBar, "foo");
        assertEquals("foo", foo);
        
        // プロパティが配列の場合は先頭の値を返します.
        String strings = BeanUtils.getSimpleProperty(fooBar, "strings");
        assertEquals("abc", strings);
        
        // プロパティが Map の場合はMap#toString() の値を返します. 
        String map = BeanUtils.getSimpleProperty(fooBar, "map");
        assertEquals("{abc=abc of value, ghi=ghi of value, def=def of value}", map);
        
        // ネストしたプロパティは取得できません...
        try {
            BeanUtils.getSimpleProperty(fooBar, "bar.example");
        } catch (IllegalArgumentException e) {
            throw e;
        }
    }

    /**
     * {@link BeanUtils#populate(java.lang.Object, java.util.Map)} の使い方.
     * 
     * Map に格納した値を key に対応する Bean のプロパティに設定します.
     * 値は, String にキャストして設定します.
     */
    @Test
    public final void testPopulate() throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("foo", "foo of value");
        map.put("bar.example", new Integer(1000));
        
        // Map の key に対応するプロパティに値を設定します.
        BeanUtils.populate(fooBar, map);
        assertEquals("foo of value", fooBar.getFoo());
        
        // Integer などの値も String にキャストされます.
        assertEquals("1000", fooBar.getBar().getExample());
    }

    /**
     * {@link BeanUtils#setProperty(java.lang.Object, java.lang.String, java.lang.Object)} の使い方.
     * 
     * {@link BeanUtils#getProperty(java.lang.Object, java.lang.String)} と同様の方法で,
     * プロパティ名を指定することで, 任意のオブジェクトを String にキャストして Bean に設定します.
     */
    @Test
    public final void testSetProperty() throws Exception {
        
        // プロパティ名を指定して String の値を設定します.
        BeanUtils.setProperty(fooBar, "foo", "foo of value");
        assertEquals("foo of value", fooBar.getFoo());
        
        // プロパティ名とインデックス番号を指定して String の値を設定します.
        BeanUtils.setProperty(fooBar, "strings[2]", "strings of two");
        String[] strings = fooBar.getStrings();
        assertEquals("strings of two", strings[2]);
        
        // プロパティ名と key を指定して, String の値を設定します. 
        BeanUtils.setProperty(fooBar, "map(abc)", new Integer(1000));
        assertEquals("1000", fooBar.getMap().get("abc"));
        
        // ネストしたプロパティを設定します.
        BeanUtils.setProperty(fooBar, "bar.example", "bar of example");
        assertEquals("bar of example", fooBar.getBar().getExample());
    }
}

</pre>


<p>Bean は下記のものを使っています.<p>
<div><strong>FooBar.java</Strong></div>
<pre>
/*
 * $Id$ 
 */
package net.nanasess.examples;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * FooBar クラス.
 * 
 * 内部で Bar クラスをネストしている.
 * 
 * @author Kentaro Ohkouchi
 * @version $Revision$ $Date$
 */
public class FooBar {

    private String foo;
    private Bar bar;
    private String[] strings;
    private List<Bar> bars;
    private Map<String, String> map;
    
    public FooBar() {
        this.foo = "foo";
        bar = new Bar();
        strings = new String[]{"abc", "def", "ghi"};
        bars = new ArrayList<Bar>();
        map = new HashMap<String, String>();
        for (String string : strings) {
            bars.add(new Bar(string));
            map.put(string, string + " of value");
        }
    }
    
    public String getFoo() {
        return foo;
    }
    public void setFoo(String foo) {
        this.foo = foo;
    }
    public Bar getBar() {
        return bar;
    }
    public void setBar(Bar bar) {
        this.bar = bar;
    }
    public String[] getStrings() {
        return strings;
    }
    public void setStrings(String[] strings) {
        this.strings = strings;
    }
    public List<Bar> getBars() {
        return bars;
    }
    public void setBars(List<Bar> bars) {
        this.bars = bars;
    }
    public Map<String, String> getMap() {
        return map;
    }
    public void setMap(Map<String, String> map) {
        this.map = map;
    }
}

</pre>

<div><strong>Bar.java</strong></div>
<pre>
/*
 * $Id$ 
 */
package net.nanasess.examples;

import java.sql.Timestamp;

/**
 * Bar クラス.
 * 
 * @author Kentaro Ohkouchi
 * @version $Revision$ $Date$
 */
public class Bar {

    private String example;
    private Timestamp created;

    public Bar() {
        this.example = "example";
        this.created = new Timestamp(System.currentTimeMillis());
    }
    
    public Bar(String example) {
        this.example = example;
        this.created = new Timestamp(System.currentTimeMillis());
    }
    
    public String getExample() {
        return example;
    }

    public void setExample(String example) {
        this.example = example;
    }

    public Timestamp getCreated() {
        return created;
    }

    public void setCreated(Timestamp created) {
        this.created = created;
    }
}

</pre>

<div><strong>ExampleClass.java</strong></div>
<pre>
/*
 * $Id$ 
 */
package net.nanasess.examples;

import java.sql.Timestamp;

/**
 * ExampleClass クラス.
 * 
 * @author Kentaro Ohkouchi
 * @version $Revision$ $Date$
 */
public class ExampleClass {
    
    private String foo;
    private String baz;
    private String example;
    private Bar bar;
    private Timestamp created;

    public String getFoo() {
        return foo;
    }

    public void setFoo(String foo) {
        this.foo = foo;
    }

    public String getBaz() {
        return baz;
    }

    public void setBaz(String baz) {
        this.baz = baz;
    }
    
    public String getExample() {
        return example;
    }
    
    public void setExample(String example) {
        this.example = example;
    }

    public Bar getBar() {
        return bar;
    }

    public void setBar(Bar bar) {
        this.bar = bar;
    }

    public Timestamp getCreated() {
        return created;
    }

    public void setCreated(Timestamp created) {
        this.created = created;
    }
}

</pre>

<p>以前の記事にも書いたのですが, <strong>BeanUtils</strong> は, 基本的に値を String にキャストします.<br />
<strong>PropertyUtils</strong> は, 型変換せずに扱います.<br />
それ以外の振舞いは, 基本的に同じです.</p>
<p>これらの API を使いこなすと非常に強力ですが, 最近はフレームワークがサポートしている場合が多いようです.<br />
(Seasar の <a href="http://s2container.seasar.org/2.4/ja/beans.html" target="_blank">S2BeanUtils</a> など)</p>
<p>今回ひさびさに, <string>BeanUtils</string> のソースを読んだんですが, やはりリフレクションの良いお手本です.</p>
<p><string>PropertyUtils</string> のサンプルコードは, また後日...</p>]]></description>
         <link>http://nanasess.net/mt/2008/04/beanutils_1.html</link>
         <guid>http://nanasess.net/mt/2008/04/beanutils_1.html</guid>
         <category>Java</category>
         <pubDate>Mon, 21 Apr 2008 01:47:54 +0900</pubDate>
      </item>
      
      <item>
         <title>JUnit4 ことはじめ</title>
         <description><![CDATA[<p>ずっと食わず嫌いだった JUnit4 を使ってみたので, コードを晒しておきます...</p>

<pre>
/*
 * $Id$ 
 */
package net.nanasess.examples;

import java.util.ArrayList;
import java.util.List;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

import static org.junit.Assert.*;

/**
 * HelloWorld のテスト.
 * 
 * @author Kentaro Ohkouchi
 * @version $Revision$ $Date$
 */
public class HelloWorldTest {

    private static String expected;
    private String actual;
    private static int counter;    

    /**
     * すべてのテスト前に実行するメソッド.
     * 
     * static にして {@link @beforeClass} アノテーションをつける.
     */
    @BeforeClass
    public static void beforeClass() {
        System.out.println("HelloWorld テストを始めます.");
        counter = 0;
        System.out.println("カウンターを初期化しました.");
        
    }
    
    /**
     * すべてのテストを終了した後に実行するメソッド.
     * 
     * static にして {@link @AfterClass} アノテーションをつける.
     */
    @AfterClass
    public static void afterClass() {
        System.out.println(counter + " 個のテストを実行しました.");
        System.out.println("HelloWorld テストを終了します.");
    }
    
    /**
     * 各テストをする前に実行するメソッド.
     * 
     * {@link @Before} アノテーションをつける.
     */
    @Before
    public void before(){
        expected = "HelloWorld";
        System.out.println("expected を初期化しました.");
    }
    
    /**
     * 各テストの後に実行するメソッド.
     * 
     * {@link @After} アノテーションをつける. 
     */
    @After
    public void after() {
        counter++;
        System.out.println(String.valueOf(counter) + " 番目のテストを実行しました.");
    }

    /**
     * HelloWorld のテスト.
     */
    @Test
    public void helloWorld() {
        actual = "HelloWorld";
        assertEquals(expected, actual);
    }

    /**
     * ちゃんと ClassNotFoundException になるかどうかのテスト.
     * 
     * @throws Exception エラーが発生した場合.
     */
    @Test(expected = ClassNotFoundException.class)
    public void classForNameFailure() throws Exception {
        Class.forName("org.postgresql.Driver");
    }

    /**
     * スタブなので, スキップするテスト.
     * 
     * {@link @Ignore} アノテーションをつけると, そのメソッドはテストしない.
     */
    @Ignore("スタブなのでテストしません...")
    @Test
    public void testStub() {
        assertEquals("test", "stub");
    }

    /**
     * 配列を比較するテスト.
     * 
     * {@link org.junit.Assert#assertArrayEquals(String[], String[])} を使ってます.
     * 配列や, List のテストも楽になったものです(しみじみ)
     */
    @Test
    public void arrays() {
        String[] expecteds = { "1", "2", "3" };
        List<String> actuals = new ArrayList<String>();
        actuals.add("1");
        actuals.add("2");
        actuals.add("3");

        assertArrayEquals(expecteds, actuals.toArray(new String[actuals.size()]));
    }
}

</pre>

<p>個人的には, 配列や例外のテストが解りやすく楽になったのが良い感じ.<br />
JUnit4 の関連ライブラリも充実してきたので, そろそろ乗り替え時かな...</p>
<p>ついでに, Eclipse 3.4M6a を Celeron 600MHz, メモリ 384MB という非力なノートPCで使ってみましたが, 思ったよりサクサクで良い感じでした☆</p>
]]></description>
         <link>http://nanasess.net/mt/2008/04/junit4.html</link>
         <guid>http://nanasess.net/mt/2008/04/junit4.html</guid>
         <category>Java</category>
         <pubDate>Sun, 20 Apr 2008 16:05:41 +0900</pubDate>
      </item>
      
      <item>
         <title>sitemap.xml</title>
         <description><![CDATA[<p><a href="http://www.kosaki.name/cms/movable-type/mt4-sitemapxml/" target="_blank">MT4 で サイトマップ（sitemap.xml）を作成</a> を参考に, sitemap.xml も作ってみました.</p>

<p>FastCGI といい, こうやって細かいチューニングができるのは, 自前サーバーの強みですね...</p>]]></description>
         <link>http://nanasess.net/mt/2008/04/sitemapxml.html</link>
         <guid>http://nanasess.net/mt/2008/04/sitemapxml.html</guid>
         <category>Movable Type</category>
         <pubDate>Wed, 16 Apr 2008 22:55:59 +0900</pubDate>
      </item>
      
      <item>
         <title>MovableType を FastCGI で動作させる</title>
         <description><![CDATA[<p>最近, スパムコメントやスパムトラックバックで, サーバーの負荷が酷な状態になっていたため, 負荷低減のために MovableType を FastCGI で動作するようにしてみました.</p>
<p>
<strong>参考</strong>
<a href="http://wiki.movabletype.org/Hosting_MT_under_FastCGI_(Japanese)" target="_blank">http://wiki.movabletype.org/Hosting_MT_under_FastCGI_(Japanese)</a>
</p>
<ol>
  <li>まず, 必要なライブラリをインストール. FreeBSD なので ports から...
       <pre>
# portinstall www/p5-FastCGI
# portinstall www/mod_fastcgi
       </pre>
<em>portupgrade を使わない場合は, /usr/ports/www/p5-FastCGI, /usr/ports/www/mod_fastcgi で make install で OK</em>
  </li>
  <li>httpd.conf に以下を追加
<pre>
LoadModule fastcgi_module     libexec/apache2/mod_fastcgi.so

&lt;IfModule fastcgi_module&gt;
    FastCgiIpcDir /var/tmp/fcgi_ipc/
    AddHandler fastcgi-script fcgi
    FastCGIConfig -autoUpdate -idle-timeout 120 -killInterval 3600 -maxClassProcesses 6 -maxProcesses 15
&lt;/IfModule&gt;
</pre>
  </li>
  <li>mod_fastcgi を有効にするため, apache を再起動
<pre>
# apachectl restart
</pre>
</li>
  <li>MovableType の mt*.cgi を mt*.fcgi にリネーム. とりあえず mt*.cgi も動くようにコピーしました.
<pre>
$ cp mt.cgi mt.fcgi
$ cp mt-tb.cgi mt-tb.cgi
$ cp mt-comments.cgi mt-comments.fcgi
$ cp mt-search.cgi mt-search.fcgi
$ cp mt-view.cgi mt-view.fcgi
</pre>
</li>
<li>mt-config.cgi の編集. とりあえず必要な箇所のみ *.fcgi にしました.
<pre>
 AdminScript mt.fcgi
 CommentScript mt-comments.fcgi
 TrackbackScript mt-tb.fcgi
 SearchScript mt-search.fcgi
# XMLRPCScript mt-xmlrpc.pl
 ViewScript mt-view.fcgi
# AtomScript mt-atom.pl
# UpgradeScript mt-upgrade.pl
</pre>
</li>
</ol>
<p>
あとは, mt.fcgi にアクセスして, FastCGI で動作することを確認し, サイトをすべて再構築してやれば OK です.
</p>
<p>
これで負荷が減ってくれれば良いのですが...
</p>]]></description>
         <link>http://nanasess.net/mt/2008/04/movabletype_fastcgi.html</link>
         <guid>http://nanasess.net/mt/2008/04/movabletype_fastcgi.html</guid>
         <category>FreeBSD</category>
         <pubDate>Wed, 16 Apr 2008 17:27:51 +0900</pubDate>
      </item>
      
      <item>
         <title>JIS X 0213:2004(JIS2004) と Java と PHP と RDBMS</title>
         <description><![CDATA[<p><em>ずいぶん前に, <a href="http://webml.ec-cube.net/comu-ml/200705/msg00003.html">EC-CUBE の ML  へ投稿した</a>話題ですが, どうも過去ログに埋もれているので, 再度まとめてみます...</em></p>

<p>Windows Vista で, 日本語の文字集合に, JIS X 0213:2004(JIS2004) が採用されました.<br />
このため, 扱える漢字が増えたり, 字体が変化したりして, さまざまな影響があります.</p>

<p>EC-CUBE を代表する PHP のアプリケーションや, Java の場合, どのような影響が考えられるでしょうか.</p>

<p>以前, Windows Vista での影響調査をする機会があり, いろいろ調べましたので, ちょっとまとめてみます.</p>

<h4>文字集合と文字エンコーディングについて</h4>
<p>文字のまとまりを規格化できるよう, 各文字に対して一連のコード(文字コード)を割り当てたものを「文字集合(文字セット)」と言います.<br />
 これには, <strong>Unicode</strong> や, <strong>JISX 0213:2004</strong> などがあたります.</p>
<p>
この文字集合をコンピュータで扱えるよう, 文字コードをバイトコードへ変換する仕組み(文字符号化方式)を文字エンコーディングと言います.<br />
これには, Shift_JIS や, EUC-JP, UTF-8, UTF-16 などがあります.</p>

<p>文字コードと文字エンコーディングと文字セットを混同してしまいがちですが, それぞれの意味は別物です.</p>

<p>UTF-8 というのは, 正確に言うと <strong>Unicode</strong> という<strong>文字セット</strong>で規定されている<strong>文字エンコーディング</strong>の一つです.</p>

<h4>Unicode で規定されている文字エンコーディングの抜粋</h4>
<ul>
<li><strong>UTF-1</strong> - 8bit</li>
<li><strong>UTF-5</strong> - 利用されていない</li>
<li><strong>UTF-7</strong> - UTF-16 で表した Unicode を Base64 で変換して表す方式. 非推奨</li>
<li><strong>UTF-8</strong> - 8bit 単位の可変長コードにエンコードする方式</li>
      <ul><li>1バイト - すべての ASCII</li>
            <li>2バイト - JIS X 0208の非漢字の一部</li>
            <li>3バイト - Windows-31J の拡張文字エリア全て, 第3・4水準漢字の一部</li>
            <li>4バイト - JIS X 0213:2004 の第3・4水準漢字の一部, UnicodeのBMP 面以外すべて</li></ul>
<li><strong>UTF-16</strong> - Windows XP, Vista の内部エンコーディング. Vista では, JIS X 0213:2004 の文字集合が採用された. 16bit 単位の可変長. 16bit のみで表現される BMP面と, 16bit + 16bit で表現される「サロゲート・ペア」から構成される.</li>
<li><strong>UTF-32</strong> - Unicode の全コードを単一長のコードとして 32bit で指定するコード. 実際に使用されるのは 21bit までの範囲.</li>
</ul>

<p><em>Unicode における BMP(Basic Multilingual Plane)面とは, UTF-16 にて, 16bit のみで表現できる領域の文字のことを言い, 16bit + 16bit で表現する文字の範囲を 「サロゲート・ペア」と言います.</em></p>

<p>Unicode 以外の文字集合としては, <strong>UCS-4 (ISO/IEC 1064)</strong>という良く似た別物があり, UCS-4 で規定されている文字エンコーディングにも UTF-8 があったりします.</p>

<p>UCS-4 と Unicode は 21bit までの範囲で互換性があります. UCS-4 は4バイトを基本とし, 31bit までの領域を使用します. ややこしい...</p>

<p>一方, JIS X 0213:2004 では, 文字エンコーディングとして, ISO-2202-JP-2004, EUC-JP-2004, Shift_JIS-2004 などがありますが, IANA に登録されていないため, あくまでも参考となっています.</p>

<h4>Windows Vista での問題</h4>
<p>Windows Vista では, 使用する文字セットに, JIS X 0213:2004 を採用したため, UTF-16 でエンコーディングされる場合, BMP面以外の文字(16bit + 16bit で表現される文字)までサポートされることとなりました.</p>

<p>このため, UTF-8 でエンコーディングされる場合は, 1文字が4バイトで表現される文字も含まれます.</p>

<h4>PHPでの扱い</h4>
<p><a href="http://jp.php.net/mbstring">http://jp.php.net/mbstring</a> を見るかぎりは, mbstring 関数を使用することで, サロゲート・ペアの文字が入力されても, うまく対応できそうです.<br />
 文字エンコーディングは, UTF-8 が無難でしょう.</p>

<h4>MySQL での問題</h4>
<p><a href="http://www.mysql.gr.jp/mysqlml/mysql/msg/13823">http://www.mysql.gr.jp/mysqlml/mysql/msg/13823</a><br />
これを見ると, DBエンコーディングに UTF-8 を使用した場合でも, 扱えるのは, 1文字3バイトまでの範囲に限られるようです...</p>

<p>つまり, Windows Vista で採用されたサロゲート・ペアの文字が入力された場合は, 確実に文字化けします(苦笑)</p>

<h4>PostgreSQL での扱い</h4>
<p>8.1.7以降、8.2.2以降であれば, UTF-8 で問題なく扱えるようです.<br />
それ以前のバージョンは, 1文字4バイトで表現される文字を使用した場合に問題がでる可能性あります.</p>

<p><a href="http://mlog.euqset.org/archives/pgsql-jp.ml.postgresql.jp/38404.html">http://mlog.euqset.org/archives/pgsql-jp.ml.postgresql.jp/38404.html</a></p>

<h4>Oracle は？</h4>
<p>Oracle は 10.1.0以降で対応とのことです.</p>

<h4>Java での問題</h4>
<p>char が 16bit であるため, 16bit + 16bit のサロゲート・ペアは正常に扱えません...</p>

<p>具体的には, <strong>String#length()</strong> や, <strong>String#substring()</strong> が正常に動作しません(苦笑)</p>

<p>プロパティファイルなど, \uXXXX で表わすものは 16bit なので, サロゲート・ペアの文字は使えません.<br />
プロパティファイルを XML で書けば, 任意のエンコーディングを使用できるので, サロゲート・ペアの文字も使用できます.</p>

<p>Java でサロゲート・ペアの文字列を扱うには, Java SE 5.0 以降で追加された API を使います.</p>

<p>サロゲート・ペアが含まれる文字数を正確に数えるには, <string>String#codePointCount()</string> を使ったりします.</p>

<p>文字列のソートとかも工夫が必要です. 手前味噌ですが, 下記にサンプルがあります.<br />
<a href="http://d.hatena.ne.jp/nanasess/20070819/1187700166" target="_blank">http://d.hatena.ne.jp/nanasess/20070819/1187700166</a></p>

<h4>さらに...</h4>
<p><a href="http://itpro.nikkeibp.co.jp/99/vista/index.html" target="_blank">http://itpro.nikkeibp.co.jp/99/vista/index.html</a><br />
これを見ると, Vista で入力できても, XP 以前では対応していない文字が183字あり, この中には人名漢字も含まれます.</p>

<p>仮にWebアプリケーション側が Vista にフル対応したとしても, XP では表示できないというトラブルも発生します.</p>

<p>XP に JIS2004対応フォントをインストールしたりすることで回避できますが, 対応をクライアント側に任せるのもどうかと...</p>

<p>いちばん良いのは, Vista で問題の文字を入力した場合に警告を出すことでしょうかねえ...</p>


<h4>参考</h4>
<p><a href="http://www.javainthebox.net/laboratory/J2SE1.5/MiscAPI/SupplementaryChar/SupplementaryChar.html" target="_blank">J2SE 5.0 Tiger 虎の穴 Unicode 4.0 の補助文字のサポート</a></p>

<p><a href="http://java.sun.com/developer/technicalArticles/Intl/Supplementary/index_ja.html" target="_blank">Java プラットフォームにおける補助文字のサポート</a></p>

]]></description>
         <link>http://nanasess.net/mt/2008/04/jis_x_02132004jis2004_java_php.html</link>
         <guid>http://nanasess.net/mt/2008/04/jis_x_02132004jis2004_java_php.html</guid>
         <category>Java</category>
         <pubDate>Fri, 11 Apr 2008 01:01:07 +0900</pubDate>
      </item>
      
      <item>
         <title>Google Analytics のトラッキングコードを新しくしてみた</title>
         <description><![CDATA[<p>今さらながら, <a href="http://analytics-ja.blogspot.com/2007/12/new-graphing-tools-gajs-tracking.html">Google Analytics のトラッキングコードを新しく</a>してみた.</p>

<p>こういう良くできたサービスの良いところをどんどん勉強し, 吸収していかなくてはなりません...</p>]]></description>
         <link>http://nanasess.net/mt/2008/04/google_analytics_1.html</link>
         <guid>http://nanasess.net/mt/2008/04/google_analytics_1.html</guid>
         <category>More...</category>
         <pubDate>Wed, 09 Apr 2008 21:15:55 +0900</pubDate>
      </item>
      
      <item>
         <title>職人のこだわり</title>
         <description><![CDATA[<blockquote>
<a href="http://satoshi.blogs.com/life/2008/04/born-to-code.html">Life is beautiful：　Born to code</a>

<p>そうやって愛しい我が子を育てる様にコードを一行一行書いていく</p>

<p>　何百万人、何千万人もの人に使ってもらえる日を夢見ながら</p>

<p>プログラミングという楽しみがある時代に生まれて来ることができた幸せを噛み締めながら<br />
</blockquote></p>

<p>前職が寿司屋の板前だった僕にとって, プログラミングというのは同じ職人気質の仕事.<br />
多くの共通している部分があります.</p>

<p>違う部分は, ドキュメントを書くことかな...</p>

<p>板前は, 先輩の仕事を見て覚える.<br />
エンジニアは, 後世のためにドキュメントを書く.</p>

<p>しかし, 現場が大規模化していったら, 職人の世界も同じようにドキュメントを書く能力が必要になってくると思います.</p>

<p>でも, 一番大切なのは, 「愛情」だと思っています.</p>

<p>料理に対して, いかに「愛情」を注げるか.<br />
コードに対して, いかに「愛情」を注げるか.<br />
チームに対して, いかに「愛情」を注げるか.<br />
顧客に対して, いかに「愛情」を注げるか.</p>

<p>「愛情」を実感することが一番の幸せではないでしょうか.</p>]]></description>
         <link>http://nanasess.net/mt/2008/04/post_8.html</link>
         <guid>http://nanasess.net/mt/2008/04/post_8.html</guid>
         <category>More...</category>
         <pubDate>Wed, 09 Apr 2008 13:28:36 +0900</pubDate>
      </item>
      
      <item>
         <title>Gnome 2.22.0</title>
         <description><![CDATA[<p>FreeBSD Ports の x11/gnome2 が 2.22.0 になったので早速アップグレードしてみました.</p>

<p><strong>参考 - <a href="http://gihyo.jp/admin/clip/01/fdt/200803/25">FreeBSD Daily Topics 2008年3月25日</a></strong></p>

<p>しかし, いくつか問題が...</p>

<h4>gstreamer-plugins-good がアップグレードできない</h4>
<p>/usr/ports/UPDATING に書かれているように, gstreamer-plugins-good を portupgrade(1) しようとしたら, 依存関係でコケました(汗)<br />
この ports をアップグレードするには, multimedias/gstreamer と, multimedias/gstreamer-plugins を先にアップグレードする必要があるようです.<br />
下記のようにすることで解消.<br />
<pre>
# portupgrade multimedias/gstreamer
# portupgrade multimedias/gstreamer-plugins
# portupgrade -f multimedias/gstreamer-plugins-good
</pre>

<h4>textproc/rarian を再三要求される</h4>
<p>Gnome 2.20.1 のアップグレードの際, portupgrade -o で textproc/rarian を textproc/scrollkeeper に置きかえたのに, 依存関係がおかしいのか, 再三 textproc/rarian を入れようとしてビルドに失敗する.<br />
良くないと思いつつも, /usr/ports/textproc/rarian/Makefile を編集し, コンフリクトしないようにした...</p>
<pre>
--- Makefile.orig       Fri Mar 28 02:25:54 2008
+++ Makefile    Fri Mar 28 02:26:35 2008
@@ -26,7 +26,7 @@

 DOCBOOK_VERSION=4.2

-CONFLICTS=     scrollkeeper-[0-9]*
+#CONFLICTS=    scrollkeeper-[0-9]*

 USE_BZIP2=     yes
 USE_GMAKE=     yes
</pre>

<p>これだけやったら, あとは /usr/ports/UPDATING の手順通りでアップグレードは無事完了.</p>
<p>しかし, また問題が...</p>

<ul>
    <li>インストールが終わって, X を立ち上げなおすと, 日本語入力ができなくなってしまった...</li>
       <ul>
           <li>Gnome 関連の dot ファイルを削除して解決</li>
       </ul>
  <li>何故か Compiz Fusion が core 吐いてお亡くなりになる...</li>
       <ul>
           <li>xorg-server も同時に更新されたので, そのせいかなと思いつつ, 調べる時間ない...(苦笑)</li>
       </ul>
  <li>gnome-vfs で Windowsサーバーに繋げない...</li>
       <ul>
           <li>nautilus で Ctrl + L で smb://IPアドレス/ディレクトリ と指定して
    あげたら, あっさり繋がった(汗)</li>
           <li>gvfs 経由で Windows サーバーに接続するようになったためで, ~/.gvfs 以下にマウントされるので便利</li>
       </ul>
   <li>/etc/rc.conf に gnome_enable="YES" が必要になったらしい.</li>
       <ul>
           <li>avahi や, dbus を動作させるため.</li>
           <li>これやったら, GDM も有効になってしまった(苦笑)</li>
       </ul>
</ul>

<p>GDM は使わないポリシーなので, /etc/rc.conf に enable_gdm="NO" としています.</p>
<p>また, DRM を有効にすると, ドロップシャドウがつくので, ちょっとかっこいいです.</p>
<p>あとは, compiz-fusion が動くように頑張らないと...</p>
]]></description>
         <link>http://nanasess.net/mt/2008/03/gnome_2220.html</link>
         <guid>http://nanasess.net/mt/2008/03/gnome_2220.html</guid>
         <category>FreeBSD</category>
         <pubDate>Sat, 29 Mar 2008 14:18:53 +0900</pubDate>
      </item>
      
      <item>
         <title>Samba の転送速度が遅い</title>
         <description><![CDATA[<p>Samba を使って Windows とファイルを共有している時, 環境によっては転送が非常に遅くなることがあるようです.<br />
小さなサイズのファイルが大量にある場合は特に顕著のようで, 「仕事にならん!」と不満の声が聞こえてきたので, smb.conf (5) に以下の設定をしてみました.</p>

<p><strong>socket options = IPTOS_LOWDELAY TCP_NODELAY</strong></p>

<p><br />
FreeBSD 6.3-RELEASE, Samba 3.0.28 の環境ですが, この設定で解消しました.</p>

<p>see.<br />
<a href="http://www.samba.gr.jp/project/translation/2.2.5/manpages/smb.conf.5.html#SOCKETOPTIONS">http://www.samba.gr.jp/project/translation/2.2.5/manpages/smb.conf.5.html#SOCKETOPTIONS</a></p>

<p>僕は, FreeBSD をクライアントにして開発しているので, あまり関係無いんですけどねw</p>]]></description>
         <link>http://nanasess.net/mt/2008/03/samba.html</link>
         <guid>http://nanasess.net/mt/2008/03/samba.html</guid>
         <category>FreeBSD</category>
         <pubDate>Fri, 28 Mar 2008 01:33:42 +0900</pubDate>
      </item>
      
      <item>
         <title>最新ブラウザあれこれ</title>
         <description><![CDATA[<p>昨日あたりから, Safari3.1 と Firefox3 Beta4  (どちらも Windows...) を使ってみてます.<br />
Safari は, Mac でよく使っていたので, 速いのはよく知ってるんですが, Firefox3 の速さにびっくり.</p>

<p>Safari に負けないくらい速い!</p>

<p>/.jp に, こんなタレコミもあったので本物らしい.<br />
<a href="http://slashdot.jp/it/article.pl?sid=08/03/23/2226206">Firefox 3はIEやOperaよりもメモリ効率が良くなる可能性</a></p>

<p>先月, 経理用に使っていた Windows ノートがお亡くなりになったので, 骨董品のような VAIO (Celeron 650MHz)を使っているのですが, それでも快適.</p>

<p>Firefox2 だと, たくさんタブを開いたり, Ajax 使いまくってるサイトを開いたりすると, かなり鈍重でしたが, Firefox3 はサクサク.<br />
もちろん Safari もサクサク.</p>

<p>Safari も快適ですが, 常用するなら, アドオンが豊富な Firefox がお好みです.<br />
僕の場合は, 必要に迫られて Windows を使い, 普段のお仕事はほとんど FreeBSD, たまに Mac(PowerPC G5) を使う感じなので, すべての環境で共通して使えるのが良いのです.</p>

<p>Firefox2 までは, <a href="http://www.google.com/tools/firefox/browsersync/" target="_blank">Google Browser Sync</a> でブックマークなどを同期していましたが, 最近はメンテされてないのか調子があまり良くないのと, Firefox3 になってから使えなくなるようなので, <a href="https://addons.mozilla.org/ja/firefox/addon/2888" target="_blank">GMarks</a> を使い初めました.</p>

<p>これ, Google ブックマークを Firefox のサイドバーなどで使えるようにするものですが, かなり便利.<br />
Google ツールバーについているブックマークより使いやすい!<br />
また, 必要に迫られて IE を使わなきゃいけない時でもブックマークの共有が簡単にできて最高ですw</p>

<p>あと, さっきちょっと Google Spreadsheet を初めてちょっとまともに使ってみましたが, これも意外に使いやすく, 常用しても良いなーという印象でした.<br />
</p>]]></description>
         <link>http://nanasess.net/mt/2008/03/post_30.html</link>
         <guid>http://nanasess.net/mt/2008/03/post_30.html</guid>
         <category>Applications</category>
         <pubDate>Tue, 25 Mar 2008 01:45:07 +0900</pubDate>
      </item>
      
      <item>
         <title>EC-CUBE 個人的ロードマップ</title>
         <description><![CDATA[<p>4月から, ちょっとだけ余裕が出る(かもしれない)ので, EC-CUBE で個人的にやりたい事を書いておこうと思います.</p>

<h4>SC_Query の拡張</h4>
<a href="http://webml.ec-cube.net/comu-ml/200803/msg00010.html">開発コミュ ML</a> でポストした PDO対応 SC_Query パッチを作る.

<p></p>

<h4>リファクタリング</h4>
徹底的にリファクタリングして, 開発チームの A さんや, S さんをマージ地獄に陥れるw

<p></p>

<h4>WYSIWYG</h4>
<a href="http://extjs.com/">Ext JS</a> がやたら良さそうなので, テンプレート編集画面を WYSIWYG にする.

<p></p>

<h4>Safari 対応</h4>
Windows 版の Safari も出たことだし, 管理画面を Safari 対応にする.

<p></p>

<p>どれだけやれるか不明ですが, 宣言しておかないとやれそうもないので, 宣言しておくことにします...</p>]]></description>
         <link>http://nanasess.net/mt/2008/03/eccube.html</link>
         <guid>http://nanasess.net/mt/2008/03/eccube.html</guid>
         <category>EC-CUBE</category>
         <pubDate>Sun, 23 Mar 2008 22:52:10 +0900</pubDate>
      </item>
      
      <item>
         <title>Akismet 入れてみた</title>
         <description><![CDATA[<p>今まで, このブログに Trackback やコメントがあっても大半はスパムという悲しい状態だったので, ほぼ全て非公開にして放置してました(汗)</p>

<p>さすがに最近の MT は, スパムフィルタも強化されているようで, 快調に弾いてくれています.</p>

<p>でも, せっかくならプラグインもいろいろ使ってみようということで GIGAZINE さんで紹介されていた「Akismet」を入れてみました.</p>

<p><a href="http://gigazine.net/index.php?/news/comments/20070127_akismet/">最強の呼び声高いブログ用対スパムプラグイン「Akismet」</a></p>

<p>どのくらい効果あるか楽しみw<br />
</p>]]></description>
         <link>http://nanasess.net/mt/2008/03/akismet.html</link>
         <guid>http://nanasess.net/mt/2008/03/akismet.html</guid>
         <category>Movable Type</category>
         <pubDate>Sun, 23 Mar 2008 20:59:51 +0900</pubDate>
      </item>
      
      <item>
         <title>Blog の使い方</title>
         <description><![CDATA[<p>いま, 自分が書くことができるブログとか, 日記がたくさんある...<br />
ていうか, 氾濫してる(汗)</p>

<ul>
	<li>mixi</li>
        <li><a href="http://nanasess.net/mt/">ここ</a></li>
        <li><a href="http://d.hatena.ne.jp/nanasess/">はてなダイアリー</a></li>
        <li>sourceforge.jp の日記とか, /.jp の日記とかいろいろ...</li>
</ul>

<p>超個人的な戯言みたいなことは, mixi に書いてる.<br />
でも, 技術的なことは, 他の人と共有したいし, もっとアウトプットしていきたい.</p>

<p>はてなは, その手段の一つだと思う.<br />
ソースコード載っけても, 綺麗に色つけてくれるしw</p>

<p>でも, せっかく自前のドメイン持ってるんだし, ここも活用してみたい.</p>

<p>と, 以前からいろいろ考えてたんだけど, 下記のようにしてみることにしました.</p>

<ol>
	<li>ここに記事を書く</li>
        <li>必要に応じて, はてなに引用(color syntax がステキ)</li>
        <li>はてなから, ここに Trackback する</li>
        <li>再編集で, ここからはてなに Trackback する</li>
</ol>

<p>こうすることで, はてなの住人にも, ある程度はアウトプットすることができるんじゃないかなぁ...<br />
と思っています.</p>

<p>その前に, どれだけ記事を書けるかが微妙なんだけど(汗)<br />
とりあえず, ちょっとやってみることにします.</p>

<h4>はてなの記事</h4>
<a href="http://d.hatena.ne.jp/nanasess/20080323/1206250950">http://d.hatena.ne.jp/nanasess/20080323/1206250950</a>]]></description>
         <link>http://nanasess.net/mt/2008/03/blog.html</link>
         <guid>http://nanasess.net/mt/2008/03/blog.html</guid>
         <category>More...</category>
         <pubDate>Sun, 23 Mar 2008 12:33:27 +0900</pubDate>
      </item>
      
   </channel>
</rss>
