<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9176588</id><updated>2011-11-07T21:44:04.474+09:00</updated><title type='text'>304 - narucissus is Not Modified</title><subtitle type='html'>あんまり変更されないnarucissusブログ。
コンピュータに関する子ネタと備忘録。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default?start-index=101&amp;max-results=100'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>161</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9176588.post-2507250187005326848</id><published>2011-11-07T21:44:00.000+09:00</published><updated>2011-11-07T21:44:04.755+09:00</updated><title type='text'>CentOSのSubversionを1.4から1.6にアップグレード</title><content type='html'>&lt;div class="paragraph"&gt;現在使っているSubversionのリポジトリサーバがCentOS 5.2でSubversionは1.4.2-2(r22196)がインストールされている。これまではサーバ側のバージョンとクライアント側のバージョンをなるべく1.4に統一してやっていた。最近はGitを使うことが増えてきて、既存のsvnリポジトリと連携したいケースも出てきたが、git-svnを使うには1.6が必要。いま（2011年11月）はCentOS 5.2上でyum updateを実行しようとするとSubversion 1.6.11-7がインストールされるようだが、1.4.xと1.6.xでは互換性がどうなっているのかよくわからないので、いろいろ試してからアップグレードすることにした。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;現在の環境&lt;/li&gt;
&lt;li&gt;Subversion 1.4でリポジトリ作成&lt;/li&gt;
&lt;li&gt;1.4のリポジトリに1.6.x系のクライアントでアクセス&lt;/li&gt;
&lt;li&gt;yumでSubversion 1.6をインストール&lt;/li&gt;
&lt;li&gt;1.4で作成されたリポジトリに1.4と1.6でアクセス&lt;/li&gt;
&lt;li&gt;1.4でチェックアウトした作業コピーを1.6で操作&lt;/li&gt;
&lt;li&gt;1.6で作成されたリポジトリに1.4からアクセス&lt;/li&gt;
&lt;li&gt;まとめ&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h4&gt;現在の環境&lt;/h4&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;OS: CentOS release 5.2 (Final)&lt;/li&gt;
&lt;li&gt;Subversion: バージョン 1.4.2 (r22196)&lt;/li&gt;
&lt;li&gt;mod_dav_svn: 1.4.2&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;※いきなり本番環境のSubversionをアップデートするわけにもいかないのでVMを構築しようと思ったら、いま（2011年11月）CentOS 5.2を入手してSubversionとmod_dav_svnをyumインストールしようとすると1.6系しかインストールできない。昔のVMを引っ張り出してなんとかSubversionとmod_dav_svnが両方1.4.2の環境を用意した。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;h4&gt;Subversion 1.4でリポジトリ作成&lt;/h4&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;リポジトリは以下のように作成。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;pre class="prettyprint"&gt;# cd /var/www/svn
# svnadmin create project1 --fs-type fsfs
# chown -R apache.apache project1
&lt;/pre&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;ブラウザから http://[ip]/svn/project1 にアクセスして「Revision 0」と表示されればリポジトリの作成は成功。この状態で/var/www/svn/project1/db/formatを確認すると「2」と書いてあり、formatタイプが2であることが分かる。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;ここに適当にファイルをコミットしておく。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;pre class="prettyprint"&gt;$ mkdir project1
$ ethna add-project sample
$ cd ..
$ svn import -m "New Import" project1 http://[ip]/svn/project1/trunk/project1
$ rm -fr project1
$ svn checkout http://[ip]/svn/project1/trunk/project1 ./project1
&lt;/pre&gt;&lt;br /&gt;
&lt;h4&gt;1.4のリポジトリに1.6.x系のクライアントでアクセス&lt;/h4&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;CentOS 5.6にインストールされているsvn 1.6.11（r934486）でプロジェクトをチェックアウトし、ファイルを変更する。その後svn 1.4.2からも問題なくリポジトリの操作が行えたため、この操作によって1.4のリポジトリのフォーマットが変わっていないことが分かる。&lt;br /&gt;
（db/formatも2のまま）&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;同様にTortoiseSVN 1.6.11でプロジェクトをチェックアウトし、ファイルを変更したが結果はsvnコマンドと同じだった。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;h4&gt;yumでSubversion 1.6をインストール&lt;/h4&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;CentOS 5.2でyumを使ってSubversion 1.6をインストールする。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;pre class="prettyprint"&gt;# yum update subversion
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.khlug.org
 * updates: mirror.khlug.org
 * extras: ftp.daum.net
Setting up Update Process
Resolving Dependencies
--&amp;gt; Running transaction check
---&amp;gt; Package subversion.i386 0:1.6.11-7.el5_6.4 set to be updated
--&amp;gt; Processing Dependency: subversion = 1.4.2-4.el5_3.1 for package: mod_dav_svn
--&amp;gt; Running transaction check
---&amp;gt; Package mod_dav_svn.i386 0:1.6.11-7.el5_6.4 set to be updated
--&amp;gt; Finished Dependency Resolution

Dependencies Resolved

=======================================================================================================================================================
 Package                               Arch                           Version                                     Repository                      Size
=======================================================================================================================================================
Updating:
 mod_dav_svn                           i386                           1.6.11-7.el5_6.4                            base                            78 k
 subversion                            i386                           1.6.11-7.el5_6.4                            base                           3.1 M

Transaction Summary
=======================================================================================================================================================
Install      0 Package(s)         
Update       2 Package(s)         
Remove       0 Package(s)         

Total download size: 3.2 M
Is this ok [y/N]: y
Downloading Packages:
(1/2): mod_dav_svn-1.6.11-7.el5_6.4.i386.rpm                                                                                    |  78 kB     00:00     
(2/2): subversion-1.6.11-7.el5_6.4.i386.rpm               (13%) 11% [=====                                           ]  0.0 B/s | 360 kB     --:-- ETA 
(2/2): subversion-1.6.11-7.el5_6.4.i386.rpm               (27%) 25% [============                                    ] 738 kB/s | 816 kB     00:03 ETA 
(2/2): subversion-1.6.11-7.el5_6.4.i386.rpm               (35%) 33% [================                                ] 744 kB/s | 1.1 MB     00:02 ETA 
(2/2): subversion-1.6.11-7.el5_6.4.i386.rpm               (60%) 60% [============================-                   ] 868 kB/s | 1.9 MB     00:01 ETA 
(2/2): subversion-1.6.11-7.el5_6.4.i386.rpm               (71%) 70% [=================================-              ] 883 kB/s | 2.2 MB     00:01 ETA 
(2/2): subversion-1.6.11-7.el5_6.4.i386.rpm               (76%) 75% [====================================            ] 862 kB/s | 2.4 MB     00:00 ETA 
(2/2): subversion-1.6.11-7.el5_6.4.i386.rpm               (81%) 81% [======================================-         ] 843 kB/s | 2.5 MB     00:00 ETA 
(2/2): subversion-1.6.11-7.el5_6.4.i386.rpm               (86%) 86% [=========================================       ] 822 kB/s | 2.7 MB     00:00 ETA 
(2/2): subversion-1.6.11-7.el5_6.4.i386.rpm               (91%) 91% [===========================================-    ] 807 kB/s | 2.9 MB     00:00 ETA 
(2/2): subversion-1.6.11-7.el5_6.4.i386.rpm               (95%) 95% [=============================================-  ] 784 kB/s | 3.0 MB     00:00 ETA 
(2/2): subversion-1.6.11-7.el5_6.4.i386.rpm               (99%) 99% [===============================================-] 762 kB/s | 3.1 MB     00:00 ETA 
(2/2): subversion-1.6.11-7.el5_6.4.i386.rpm                                                                                     | 3.1 MB     00:03     
-------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                  764 kB/s | 3.2 MB     00:04     
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Updating       : subversion                                        [1/4] 
  Updating       : mod_dav_svn                                       [2/4] 
  Cleanup        : subversion                                        [3/4] 
  Cleanup        : mod_dav_svn                                       [4/4] 

Updated: mod_dav_svn.i386 0:1.6.11-7.el5_6.4 subversion.i386 0:1.6.11-7.el5_6.4
Complete!
&lt;/pre&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;mod_dav_svnもアップデートされたのでhttpdを再起動する。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;pre class="prettyprint"&gt;# /etc/init.d/httpd restart
&lt;/pre&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;アップデートしただけでは/var/www/svn/project1以下のファイルには変化はないようだ。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;h4&gt;1.4で作成されたリポジトリに1.4と1.6でアクセス&lt;/h4&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;ここへんからが一番知りたいところ。現状/var/www/svn以下には1.4で作成されたformat=2のリポジトリがある。ローカルにインストールされたsvnは1.6.11(r934486)になったので、チェックアウトしてみる。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;pre class="prettyprint"&gt;$ cd /tmp
$ svn checkout http://[ip]/svn/project1/trunk/project1 ./project1
$ cd project1
$ vim sample/www/index.php
$ svn commit -m "index.phpの変更"
&lt;/pre&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;さらに別のLinuxに入っているsvn 1.4.2でチェックアウトやコミットを試してみるが...なんともない。db/formatも2のまま。むむ。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;h4&gt;1.4でチェックアウトした作業コピーを1.6で操作&lt;/h4&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;上記の例ではSubversionを1.6に上げたが、1.4で作られたformat=2のリポジトリをチェックアウトして作業する想定だった。今度は1.4の時点で取得した作業コピーをsvn 1.6.11で操作するとどうなるのか試す。サーバのSubversionも1.6.11に上がっている。作業コピーだけが1.4という状況。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;pre class="prettyprint"&gt;$ cd /path/to/project1
$ vim sample/www/index.php
$ svn commit -m "index.phpの変更"
&lt;/pre&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;1.6で操作後別のマシンから1.4で操作してみたが問題なし...db/formatも2のまま。フォーマットは変わっていない。むむむ。うまく操作できなくなると予想していたけど予想はハズレ。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;h4&gt;1.6で作成されたリポジトリに1.4からアクセス&lt;/h4&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;以下のコマンドで新たにリポジトリを作成する。1.6にバージョンが上がっているのでformat=4のリポジトリが作成される。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;pre class="prettyprint"&gt;# cd /var/www/svn
# svnadmin create project2 --fs-type fsfs
# chown -R apache.apache project2
&lt;/pre&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;このリポジトリに1.4と1.6の両方でアクセスしたが、1.4からでも問題なく操作できた。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;h4&gt;まとめ&lt;/h4&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;ここから分かったことを（多くないけど）とりあえずまとめてみる。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;yum updateによるSubversion 1.4.2 -&amp;gt; 1.6.11のアップデートではリポジトリのフォーマットは変更されない&lt;/li&gt;
&lt;li&gt;1.4.2で作成されたリポジトリにsvn 1.4とsvn 1.6の両方でアクセスしても問題ない&lt;/li&gt;
&lt;li&gt;1.6.11で作成されたリポジトリにsvn 1.4とsvn 1.6の両方でアクセスしても問題ない&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;ただし、今回試したのはcheckoutして編集してcommitするという非常に単純な作業だったし、ファイル数も多くない。&lt;br /&gt;
Subversion 1.5で追加されたshardingという機能はリビジョンが1000を超えると影響がありそうだが、それもテストできていない。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;だが互換性は1.1系から1.4系に上げるときより格段に高いようなので、本番環境ではsvnadmin dumpでリポジトリのダンプを取得した状態でアップグレードを実施してみようと思う。&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-2507250187005326848?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/2507250187005326848/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=2507250187005326848' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2507250187005326848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2507250187005326848'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2011/11/centossubversion1416.html' title='CentOSのSubversionを1.4から1.6にアップグレード'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-3756305691611552945</id><published>2011-09-16T19:23:00.002+09:00</published><updated>2011-09-16T19:23:28.625+09:00</updated><title type='text'>PHPでセッション情報をDBに格納するときの注意点</title><content type='html'>&lt;div class="paragraph"&gt;最後の更新から１年以上経ってる...orz&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;session_set_save_handlerを使ってDBにセッション情報を保存するのは以前からやっていたけど、Ethnaに組み込んだ時にたまに以下のようなエラーが出ていた。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;pre class="prettyprint"&gt;Fatal error: session_start(): Failed to initialize storage module: user (path: /tmp) in ...（以下略）
&lt;/pre&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;たまにではなく、DBにセッション情報がない状態でアクセスすると初回のみ毎回エラーが出る。これはまずい。調べた結果PHPのバグだったらしい。先人に感謝。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/sfio/20070317"&gt;2007-03-17 - だいこんの日々&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/matbluecat/20100318/1268894535"&gt;PHPセッション周りのバグ - にっき&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.itt-web.net/modules/bwiki/index.php?Ethna%A4%C7Session%A4%F2DB%A4%CB%BB%FD%A4%C3%A4%C6%A4%DF%A4%EB"&gt;ITT-WEB - B-Wiki - EthnaでSessionをDBに持ってみる&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;具体的にはEthnaのカスタムのセッションクラスに以下のような変更を追加。&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;pre class="prettyprint"&gt;//以下をコンストラクタに追加
        ini_set('session.save_handler', 'user');

        session_set_save_handler(
            array($this, "_open"),
            array($this, "_close"),
            array($this, "_read"),
            array($this, "_write"),
            array($this, "_destroy"),
            array($this, "_gc")
        );

//クラスに_open, _close, _read, _write, _destroy, _gc関数を作成

//isValid関数をオーバーライド
    function isValid()
    {
        if (!$this-&amp;gt;session_start) {
            if (!empty($_COOKIE[$this-&amp;gt;session_name]) || session_id() != null) {
                setcookie($this-&amp;gt;session_name, "", 0, "/");
            }
            return false;
        }

        // check remote address
        if (!isset($_SESSION['REMOTE_ADDR'])
            || $this-&amp;gt;_validateRemoteAddr($_SESSION['REMOTE_ADDR'],
                                          $_SERVER['REMOTE_ADDR']) == false) {
            // we do not allow this
            setcookie($this-&amp;gt;session_name, "", 0, "/");
            session_destroy();
            
            //session_destroy直後にsession_set_save_handlerを再呼び出し
            session_set_save_handler(
                array($this, "_open"),
                array($this, "_close"),
                array($this, "_read"),
                array($this, "_write"),
                array($this, "_destroy"),
                array($this, "_gc")
            );
            
            $this-&amp;gt;session_start = false;
            return false;
        }

        return true;
    }

//destroy関数をオーバーライド
    function destroy() {
        if (!$this-&amp;gt;session_start) {
            return true;
        }
        
        session_destroy();

        //session_destroy直後にsession_set_save_handlerを再呼び出し
        session_set_save_handler(
            array($this, "_open"),
            array($this, "_close"),
            array($this, "_read"),
            array($this, "_write"),
            array($this, "_destroy"),
            array($this, "_gc")
        );

        $this-&amp;gt;session_start = false;
        setcookie($this-&amp;gt;session_name, "", 0, "/");
        
        return true;
    }

&lt;/pre&gt;&lt;br /&gt;
&lt;div class="paragraph"&gt;Ethnaを使わないで作成していた頃は上記のエラーは出ていなかったので、たぶんEthnaのセッションのクラスとの相性が悪いんだと予想。open,close,read,write,destroy,gcの呼び出しの順番とかが影響しているんだと思われる。今度時間があったらログつけてどういう順番なのか調べてみると理解が深まるかもしれない。&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-3756305691611552945?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/3756305691611552945/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=3756305691611552945' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3756305691611552945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3756305691611552945'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2011/09/phpdb.html' title='PHPでセッション情報をDBに格納するときの注意点'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-5607657728915970268</id><published>2010-07-19T16:24:00.003+09:00</published><updated>2010-08-15T22:19:57.727+09:00</updated><title type='text'>動画変換のあいまに</title><content type='html'>&lt;p&gt;久しぶりにブログなど書いてみるなう。&lt;/p&gt;

&lt;h4&gt;8mmビデオテープあらわる&lt;/h4&gt;

&lt;p class="paragraph"&gt;先日実家に帰ったときに8mmビデオのテープの話題に。小学校の時に撮ったテープはすでに20年近く前のものだが、テレビの脇に無造作に積まれたままで保存状態が悪く、いつ再生できなくなるかわからない。しかもアダプターみたいなものを使ってVHSのデッキに入れないと見られないので、そもそも再生する機械がなくなってしまう。そんなわけでたまの親孝行にDVDに変換してみることにした。&lt;/p&gt;

&lt;h4&gt;8mmをDVDに変換&lt;/h4&gt;

&lt;p class="paragraph"&gt;8mmからDVDへの変換はそういう作業を専門で行っている業者にお願いした。これは後で分かったことだが、テープにカビが生えていたためカビ取りの費用が余分にかかった。変換自体はVHSを再生できるデッキと入力した映像を録画できるDVDデッキさえあれば自分でできないこともないが、カビ取りはさすがに素人はムリだ。心配な人は専門業者にお願いしたほうがよい。&lt;/p&gt;

&lt;h4&gt;DVDからvob形式に取り込み&lt;/h4&gt;

&lt;p class="paragraph"&gt;計12本の8mmを送付して待つこと数週間、DVD12本とオリジナルの8mmが帰ってきた。代金は2万を超えてしまったが、半分のテープでカビ取りが必要だったのでまぁ仕方がない。実家に持っていく前にMacTheRipperでHDDにデータをコピーしておいた。&lt;/p&gt;

&lt;h4&gt;ビデオの編集&lt;/h4&gt;

&lt;p class="paragraph"&gt;ビデオの中身は親戚が集まった時のものや家族旅行だったが、1本あたり30分程度で、8mmを2,3本に分けて撮ってあった。これを親戚にも配りたいわけだが、せっかくだからちょっと編集してDVD1本に全部収められるとスマートだ。&lt;/p&gt;

&lt;p class="paragraph"&gt;ただしここで問題があって、iDVDではvob形式の動画形式は扱うことができないのでまた変換が必要になる。iSquintというフリーソフトを使用してvob形式のファイルをmp4形式に変換してやればよい。まとめて複数のファイルを変換できるが、同じファイル名のファイルを変換しようとするとちょっと動作がおかしいようだ。&lt;/p&gt;

&lt;h4&gt;DVDの作成&lt;/h4&gt;

&lt;p class="paragraph"&gt;mp4形式になったらiDVDで編集できるようになるので、数本の動画をまとめてチャプターに分けてDVDを作成完了。mp4を結合するなら事前にiMovieで編集しておくとよい。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-5607657728915970268?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/5607657728915970268/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=5607657728915970268' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/5607657728915970268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/5607657728915970268'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2010/07/blog-post.html' title='動画変換のあいまに'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-4939408552146829690</id><published>2010-06-08T09:33:00.000+09:00</published><updated>2010-06-08T09:44:28.922+09:00</updated><title type='text'>特に設定を変えていないのにORA-12154またはORA-12560が発生した</title><content type='html'>&lt;p class="paragraph"&gt;
Oracle 11gにsqlplusから接続しようとしたら急に接続できなくなった。
ウェブアプリやOracle SQL Developerからは接続できるのにsqlplusだけダメ。
変更したことと言えばOSのパスワード変えたぐらいか？と思ってたら重要なことを忘れてた。
&lt;strong&gt;Oracle Data Access Components（ODAC）インストールしてた！&lt;/strong&gt;
&lt;/p&gt;

&lt;p class="paragraph"&gt;
ODACをインストールすることで、今までsqlplus.exeがC:\app\Administrator\product\11.1.0\db_1\BINにだけあったのに、
C:\app\Administrator\product\11.1.0\client_1にもsqlplus.exeが追加され環境変数Pathが書き換わっていた。
ということで環境変数PathからC:\app\Administrator\product\11.1.0\client_1を除いて無事接続できるようになりましたとさ。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-4939408552146829690?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/4939408552146829690/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=4939408552146829690' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/4939408552146829690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/4939408552146829690'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2010/06/ora-12154ora-12560.html' title='特に設定を変えていないのにORA-12154またはORA-12560が発生した'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-3820743994651208871</id><published>2010-02-17T19:57:00.001+09:00</published><updated>2010-02-17T19:57:47.251+09:00</updated><title type='text'>iMacrosで時間も操作</title><content type='html'>&lt;p class="paragraph"&gt;
Firefoxのプラグイン&lt;a href="https://addons.mozilla.org/ja/firefox/addon/3863"&gt;iMacros&lt;/a&gt;を使えばFirefoxの操作を記録できるが、
記録した操作はPlayボタンで即時実行することしかできない。
さいわいJavaScriptも併用できるので、何時になったらスクリプト実行、みたいなことが実現できる。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
実行するJavaScriptは「遅延実行.js」として以下のように作成する。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
iimDisplay ("実行開始")

var run_time = new Date(2010, 1, 17, 19, 0, 0);
var timer_id;

timer_id = setInterval(
 function(){
  ret = iimDisplay ("現在時刻：" + new Date());
  
  if (run_time.getTime() &lt; new Date().getTime())
  {
   ret = iimPlay("本体");
   
   clearInterval(timer_id);
  }
 },
 1000
);
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
実行されるiimファイルは「本体.iim」として以下のように作成する。
サンプルなので中身はどんな処理でも問題ない。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
VERSION BUILD=6500125 RECORDER=FX
TAB T=1
URL GOTO=http://www.yahoo.co.jp/
TAG POS=1 TYPE=INPUT:TEXT FORM=NAME:sf1 ATTR=ID:srchtxt CONTENT=ラーメン
TAG POS=1 TYPE=INPUT:SUBMIT FORM=NAME:sf1 ATTR=ID:srchbtn
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
以上の２つをiMacrosのマクロが保存されているフォルダ以下にutf-8で保存して、
Editタブの「Refresh Macro List」をクリックして「遅延実行.js」をPlayで実行すれば、
2010年2月17日の夕ごはん時にYahoo! JAPANに移動してラーメンを検索してくれる、というわけ。
深夜にどこかに記事をポストしたいとかいうときに使えそう。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-3820743994651208871?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/3820743994651208871/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=3820743994651208871' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3820743994651208871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3820743994651208871'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2010/02/imacros.html' title='iMacrosで時間も操作'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-2702188988738679226</id><published>2009-09-04T19:36:00.002+09:00</published><updated>2009-09-04T19:36:54.388+09:00</updated><title type='text'>PHPでMIMEタイプを取得する方法（画像限定）</title><content type='html'>&lt;p&gt;
mime_content_type関数が使えない環境で別の関数がなんだったか思い出せなくなるのでメモ。
ただしMIMEタイプを取得できるのは画像限定。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
&amp;lt;?php
$array = getimagesize("Winter.jpg");
var_export($array);
&lt;/pre&gt;

&lt;pre class="prettyprint"&gt;
$ php get_mime_type.php
Content-type: text/html
X-Powered-By: PHP/4.3.9

array (
  0 =&gt; 800,
  1 =&gt; 600,
  2 =&gt; 2,
  3 =&gt; 'width="800" height="600"',
  'bits' =&gt; 8,
  'channels' =&gt; 3,
  'mime' =&gt; 'image/jpeg',
)
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-2702188988738679226?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/2702188988738679226/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=2702188988738679226' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2702188988738679226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2702188988738679226'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/09/phpmime.html' title='PHPでMIMEタイプを取得する方法（画像限定）'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-5593590981022790484</id><published>2009-09-03T14:41:00.001+09:00</published><updated>2009-09-03T14:41:56.200+09:00</updated><title type='text'>bashのプロンプトにIPアドレスを表示</title><content type='html'>&lt;p&gt;
sshでマシンを行ったり来たりしていると自分がどのマシンを操作しているのか分からなくなるので、
bashのプロンプトにIPアドレスを設定することにした。
IPアドレスはifconfigで取得し、環境変数に設定してからPS1に設定。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
export IPADDR=`/sbin/ifconfig | /bin/grep 172.16 | /usr/bin/perl -nle '/172\.16\.\d+.\d+/ &amp;&amp; print $&amp;;'`
export PS1='[\u@$IPADDR \W]\$ '
&lt;/pre&gt;

&lt;p&gt;
NICが２つある場合は考慮していない。
IPアドレスは172.16.x.xに固定。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-5593590981022790484?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/5593590981022790484/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=5593590981022790484' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/5593590981022790484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/5593590981022790484'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/09/baship.html' title='bashのプロンプトにIPアドレスを表示'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-304081890883234990</id><published>2009-09-02T15:38:00.002+09:00</published><updated>2009-09-02T15:41:07.702+09:00</updated><title type='text'>odの使い方とUnocodeコードポイント・UTF-8バイト列の簡単な変換方法</title><content type='html'>&lt;h4&gt;odの基本的な使い方&lt;/h4&gt;

&lt;p&gt;
以下のようなテキストをUTF-8で保存したと仮定。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
abcdefghijklmn
あいうえおかきくけこ
㈱のような機種依存文字。
&lt;/pre&gt;

&lt;p&gt;
odコマンドで中身を見るとこうなる。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
$ od -tx1 -w16 od.txt 
0000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 0a e3
0000020 81 82 e3 81 84 e3 81 86 e3 81 88 e3 81 8a e3 81
0000040 8b e3 81 8d e3 81 8f e3 81 91 e3 81 93 0a e3 88
0000060 b1 e3 81 ae e3 82 88 e3 81 86 e3 81 aa e6 a9 9f
0000100 e7 a8 ae e4 be 9d e5 ad 98 e6 96 87 e5 ad 97 e3
0000120 80 82 0a
0000123
&lt;/pre&gt;

&lt;p&gt;
「a」は61、「LF」は0a、「あ」はe3 81 82、「㈱」はe3 88 b1であることが分かる。
&lt;/p&gt;

&lt;p&gt;
-tx1ではなく-xを指定して実行すると、以下のようにエンディアンの関係で表示が異なるので注意。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
$ od -x -w16 od.txt 
0000000 6261 6463 6665 6867 6a69 6c6b 6e6d e30a
0000020 8281 81e3 e384 8681 81e3 e388 8a81 81e3
0000040 e38b 8d81 81e3 e38f 9181 81e3 0a93 88e3
0000060 e3b1 ae81 82e3 e388 8681 81e3 e6aa 9fa9
0000100 a8e7 e4ae 9dbe ade5 e698 8796 ade5 e397
0000120 8280 000a
0000123
&lt;/pre&gt;

&lt;p&gt;
パイプを使ってodに文字列を流し込むこともできる。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
$ echo "あいうえお" | od -tx1 -w16
0000000 e3 81 82 e3 81 84 e3 81 86 e3 81 88 e3 81 8a 0a
0000020
&lt;/pre&gt;

&lt;h4&gt;Unocodeコードポイント・UTF-8バイト列の簡単な変換方法&lt;/h4&gt;

&lt;p&gt;
perl使います。
まずはUTF-8のバイト列からUnicodeコードポイントへの変換。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
$ echo -n "e3 81 82" | perl -nle 'use Encode;s/ //g;$_=pack("H*",$_);Encode::from_to($_,"utf8","utf16");print unpack("H*",$_);'
feff3042
&lt;/pre&gt;

&lt;p&gt;
e3 81 82は「あ」のUTF-8バイト列。
feffはBOMなので、「あ」のコードポイントは3042であることが分かる。
&lt;/p&gt;

&lt;p&gt;
次にUnicodeコードポイントからUTF-8のバイト列への変換。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
$ echo -n "3042" | perl -nle 'use Encode;s/ //g;$_=pack("H*","feff".$_);Encode::from_to($_,"utf16","utf8");print unpack("H*",$_);'
e38182
&lt;/pre&gt;

&lt;p&gt;
「あ」のUnicodeコードポイントである3042を指定し、BOMのfeffをつけて変換してe38182が得られた。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-304081890883234990?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/304081890883234990/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=304081890883234990' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/304081890883234990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/304081890883234990'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/09/odunocodeutf-8.html' title='odの使い方とUnocodeコードポイント・UTF-8バイト列の簡単な変換方法'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-1053743831601431771</id><published>2009-08-27T20:50:00.001+09:00</published><updated>2009-08-27T21:01:06.776+09:00</updated><title type='text'>VMware上のLinux(CentOS)にLVMでHDD追加</title><content type='html'>&lt;p&gt;
CentOS5.3のHDD容量がまた足りないケースが出てきたので、
今度はLVMを使ってディスク容量を増やしてみる。
CentOS5では最初からLVMが使用されているので、
いちいちマウントする場所を気にしたりせずにディスク容量が増やせて非常に楽。
CentOS5のインストール時には「高度なストレージ設定」をしなかったと仮定。
今回のVMwareはServerではなくVMware Workstation 5.5。
&lt;/p&gt;

&lt;h4&gt;VMwareにHDDを追加&lt;/h4&gt;

&lt;p&gt;
まずゲストOSをシャットダウン。
CentOSなので&lt;code&gt;shutdown -h now&lt;/code&gt;を実行した。
終了後以下の手順でHDDを追加。
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;お気に入りからHDDを追加したい仮想マシンを右クリックして設定を選択&lt;/li&gt;
&lt;li&gt;ハードウェアタブの追加ボタンをクリック&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ハードウェア追加ウィザードへようこそ&lt;/strong&gt;: 「次へ」ボタンをクリック&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ハードウェアの種類&lt;/strong&gt;: 「ハードディスク」を選択して「次へ」ボタンをクリック&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ディスクの選択&lt;/strong&gt;: 「仮想ディスクの新規作成」を選択して「次へ」ボタンをクリック&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ディスクタイプの選択&lt;/strong&gt;: この仮想マシンで使用しているHDDと同じタイプを選択して「次へ」ボタンをクリック。SCSI (推奨)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ディスク容量の指定&lt;/strong&gt;: ディスクサイズ(GB)を好きなサイズに設定する。
今回は「ディスクを2GBに分割」を選択するがどちらでもＯＫ。「次へ」ボタンをクリック&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ディスクファイルの指定&lt;/strong&gt;: 好きなファイル名を指定。「完了」ボタンをクリックしてウィザードが終了し、HDDが追加される&lt;/li&gt;&lt;li&gt;Virtual Machine Settings画面のHardwareタブにHard Disk 2 (SCSI 0:1)が追加されているはず&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Linuxのパーティション設定&lt;/h4&gt;

&lt;p&gt;
仮想マシンを起動すると、以下のようにデバイスファイルsdbが増えていることが分かる。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# cd /dev
# ls -l sd*
brw-r----- 1 root disk 8,  0  8月 27 18:39 sda
brw-r----- 1 root disk 8,  1  8月 27 18:40 sda1
brw-r----- 1 root disk 8,  2  8月 27 18:39 sda2
brw-r----- 1 root disk 8, 16  8月 27 18:39 sdb
&lt;/pre&gt;

&lt;p&gt;
SCSI 0:0はsdaに、SCSI 0:1はsdbになっている。
fdisk -lの実行結果は以下の通り。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# fdisk -l

Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13      104391   83  Linux
/dev/sda2              14        2610    20860402+  8e  Linux LVM

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

ディスク /dev/sdb は正常な領域テーブルを含んでいません
&lt;/pre&gt;

&lt;p&gt;
/dev/sda2がId:8eでLinux LVMになっていることが分かる。
sdbはまだ初期化されていないのでなにも表示されない。
&lt;/p&gt;

&lt;p&gt;
ちなみに現在のディスク容量は以下の通り。
インストール時に「高度なストレージ設定」を行っていないが、
ファイルシステムがVolGroup00-LogVol00になっている。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       19G  2.9G   15G  17% /
/dev/sda1              99M   18M   76M  19% /boot
tmpfs                 125M     0  125M   0% /dev/shm
&lt;/pre&gt;

&lt;p&gt;
以下のようにしてパーティション設定を行う。
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;fdisk /dev/sdbを実行&lt;/li&gt;
&lt;li&gt;nコマンドで新たに領域を作成&lt;/li&gt;
&lt;li&gt;拡張または基本領域を聞かれるのでpをタイプ&lt;/li&gt;
&lt;li&gt;領域番号を聞かれるので1をタイプ&lt;/li&gt;
&lt;li&gt;最初シリンダ（First cylinder）を聞かれるのでそのままEnter&lt;/li&gt;
&lt;li&gt;終点シリンダまたは+サイズ...を聞かれるのでそのままEnter&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tコマンドで領域のシステムIDを変更（ここ前回と違うので注意！）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;16進数でLinux LVMのシステムID「8e」をタイプ（ここ前回と違うので注意！）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;wコマンドで書き込み、fdiskを終了&lt;/li&gt;
&lt;li&gt;（fdisk /dev/sdbを実行してpコマンドで領域を確認）&lt;/li&gt;
&lt;/ol&gt;

&lt;pre class="prettyprint"&gt;
# fdisk /dev/sdb
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更は
メモリ内だけに残します。その後はもちろん以前の内容は修復不可能になります。

このディスクのシリンダ数は 1044 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

コマンド (m でヘルプ): m
コマンドの動作
   a   ブート可能フラグをつける
   b   bsd ディスクラベルを編集する
   c   dos 互換フラグをつける
   d   領域を削除する
   l   既知の領域タイプをリスト表示する
   m   このメニューを表示する
   n   新たに領域を作成する
   o   新たに空の DOS 領域テーブルを作成する
   p   領域テーブルを表示する
   q   変更を保存せずに終了する
   s   空の Sun ディスクラベルを作成する
   t   領域のシステム ID を変更する
   u   表示/項目ユニットを変更する
   v   領域テーブルを照合する
   w   テーブルをディスクに書き込み、終了する
   x   特別な機能 (エキスパート専用)

コマンド (m でヘルプ): p

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-1044, default 1): 
Using default value 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-1044, default 1044): 
Using default value 1044

コマンド (m でヘルプ): t
Selected partition 1
16進数コード (L コマンドでコードリスト表示): L

 0  空             1e  Hidden W95 FAT1 80  古い Minix    bf  Solaris        
 1  FAT12           24  NEC DOS         81  Minix / 古い  c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          82  Linux swap / So c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  83  Linux           c6  DRDOS/sec (FAT-
 4  FAT16 &lt;32M      40  Venix 80286     84  OS/2 隠し C:  c7  Syrinx         
 5  拡張領域    41  PPC PReP Boot   85  Linux 拡張領 da  非 FS デー  
 6  FAT16           42  SFS             86  NTFS ボリュ  db  CP/M / CTOS / .
 7  HPFS/NTFS       4d  QNX4.x          87  NTFS ボリュ  de  Dell ユーテ 
 8  AIX             4e  QNX4.x 2nd part 88  Linux plaintext df  BootIt         
 9  AIX ブート   4f  QNX4.x 3rd part 8e  Linux LVM       e1  DOS access     
 a  OS/2 ブート  50  OnTrack DM      93  Amoeba          e3  DOS R/O        
 b  W95 FAT32       51  OnTrack DM6 Aux 94  Amoeba BBT      e4  SpeedStor      
 c  W95 FAT32 (LBA) 52  CP/M            9f  BSD/OS          eb  BeOS fs        
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad    ee  EFI GPT        
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a5  FreeBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a6  OpenBSD         f0  Linux/PA-RISC  
11  隠し FAT12    56  Golden Bow      a7  NeXTSTEP        f1  SpeedStor      
12  Compaq 診断   5c  Priam Edisk     a8  Darwin UFS      f4  SpeedStor      
14  隠し FAT16 &lt;3 61  SpeedStor       a9  NetBSD          f2  DOS セカン  
16  隠し FAT16    63  GNU HURD また ab  Darwin boot     fb  VMware VMFS    
17  隠し HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE 
18  AST SmartSleep  65  Novell Netware  b8  BSDI スワッ  fd  Linux raid 自 
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  隠し Boot Wiz fe  LANstep        
1c  Hidden W95 FAT3 75  PC/IX           be  Solaris boot    ff  BBT            
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 1 から 8e (Linux LVM) に変更しました

コマンド (m でヘルプ): w
領域テーブルは交換されました！

ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。
&lt;/pre&gt;

&lt;pre class="prettyprint"&gt;
# fdisk /dev/sdb

このディスクのシリンダ数は 1044 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)

コマンド (m でヘルプ): p

Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1044     8385898+  8e  Linux LVM

コマンド (m でヘルプ): q
&lt;/pre&gt;

&lt;h4&gt;PVの作成&lt;/h4&gt;

&lt;p&gt;
fdiskでパーティションを設定したら通常はext3でフォーマットするところだが、
LVMの場合はPV(Physical Volume、物理ボリューム)を作成するためpvcreateコマンドを実行する。
&lt;p&gt;

&lt;pre class="prettyprint"&gt;
# pvcreate /dev/sdb1 
  Physical volume "/dev/sdb1" successfully created
&lt;/pre&gt;

&lt;p&gt;
あっけなく終了。
pvdisplayで確認してみる。
&lt;p&gt;

&lt;pre class="prettyprint"&gt;
# pvdisplay 
  /dev/hdc: open failed: メディアが見つかりません
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               VolGroup00
  PV Size               19.89 GB / not usable 19.49 MB
  Allocatable           yes (but full)
  PE Size (KByte)       32768
  Total PE              636
  Free PE               0
  Allocated PE          636
  PV UUID               WtrOWh-XLaf-IPdj-cBPh-Tytj-IWJW-pPaJGP
   
  "/dev/sdb1" is a new physical volume of "8.00 GB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name               
  PV Size               8.00 GB
  Allocatable           NO
  PE Size (KByte)       0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               MJOW2Y-dMXr-SvOy-zUT3-w53h-OWgh-eUZf8U
&lt;/pre&gt;

&lt;p&gt;
/dev/sdb1の記述が追加されていることが確認できる。
&lt;p&gt;

&lt;h4&gt;PVをVGに登録&lt;/h4&gt;

&lt;p&gt;
PVが作成できたらVG(Volume Group、ボリュームグループ)にPVを登録する。
VG自体はすでに作成されているのでvgcreateの必要はない。
現在の状況をvgdisplayで確認してみる。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# vgdisplay 
  --- Volume group ---
  VG Name               VolGroup00
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               19.88 GB
  PE Size               32.00 MB
  Total PE              636
  Alloc PE / Size       636 / 19.88 GB
  Free  PE / Size       0 / 0   
  VG UUID               3VAI4V-VILP-LfJF-YL3l-qEde-Dwyd-XlFFPV
&lt;/pre&gt;

&lt;p&gt;
VolGroup00が約20GBであることが分かる。Free PE / Sizeは0。
これにvgextendコマンドでsdb1を追加する。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# vgextend VolGroup00 /dev/sdb1
  Volume group "VolGroup00" successfully extended
&lt;/pre&gt;

&lt;p&gt;
もう一度vgdisplayしてみるとこう変わっている。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# vgdisplay 
  --- Volume group ---
  VG Name               VolGroup00
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               27.84 GB
  PE Size               32.00 MB
  Total PE              891
  Alloc PE / Size       636 / 19.88 GB
  Free  PE / Size       255 / 7.97 GB
  VG UUID               3VAI4V-VILP-LfJF-YL3l-qEde-Dwyd-XlFFPV
&lt;/pre&gt;

&lt;p&gt;
VG SizeとFree PE / Sizeがともに約8GB増えていることが確認できる。
が、この状態でdf -hを実行するとまだ使える領域は増えていない。
LVの拡張とファイルシステムの拡張が必要。
道のりは長い...
&lt;/p&gt;

&lt;h4&gt;LVの拡張&lt;/h4&gt;

&lt;p&gt;
LV(Logical Volume、論理ボリューム)の拡張を行う。
lvextendコマンドを使用するが、指定可能な最大サイズがいくつか分からないので以下のように100%FREEを指定する。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# lvextend -l +100%FREE /dev/VolGroup00/LogVol00 
  Extending logical volume LogVol00 to 26.84 GB
  Logical volume LogVol00 successfully resized
&lt;/pre&gt;

&lt;p&gt;
lvdisplayで確認するとLV Sizeが26.84 GBまで増えていることがわかる。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# lvdisplay 
  --- Logical volume ---
  LV Name                /dev/VolGroup00/LogVol00
  VG Name                VolGroup00
  LV UUID                lfmle5-GyOh-aYPD-IrFo-FL27-ogtz-Iw4xWk
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                26.84 GB
  Current LE             859
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0
&lt;/pre&gt;

&lt;h4&gt;ファイルシステムの拡張&lt;/h4&gt;

&lt;p&gt;
やっとラスト。resize2fsコマンドでext3を拡張する。
オンラインリサイズが可能なのでOSを止める必要がない。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# resize2fs /dev/VolGroup00/LogVol00
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/VolGroup00/LogVol00 is mounted on /; on-line resizing required
Performing an on-line resize of /dev/VolGroup00/LogVol00 to 7036928 (4k) blocks.
The filesystem on /dev/VolGroup00/LogVol00 is now 7036928 blocks long.
&lt;/pre&gt;

&lt;p&gt;
１分程度で終了。df -hを実行すると、残り15GBだった/が22GBまで増えたことが確認できる。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       27G  2.9G   22G  12% /
/dev/sda1              99M   18M   76M  19% /boot
tmpfs                 125M     0  125M   0% /dev/shm
&lt;/pre&gt;

&lt;p&gt;
以前のHDDの追加方法だとマウントする場所を決める必要があったが、
このやり方なら特定のディレクトリ以下だけ増やすわけではないのでより使いやすい。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-1053743831601431771?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/1053743831601431771/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=1053743831601431771' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1053743831601431771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1053743831601431771'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/08/vmwarelinuxcentoslvmhdd.html' title='VMware上のLinux(CentOS)にLVMでHDD追加'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-8902376825334031462</id><published>2009-05-14T00:50:00.001+09:00</published><updated>2009-05-14T00:52:35.202+09:00</updated><title type='text'>やっちまったなー</title><content type='html'>iPod shuffleシャツのポケットに入れたまんま洗濯してしまった...
怖くて電源入れられません。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-8902376825334031462?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/8902376825334031462/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=8902376825334031462' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/8902376825334031462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/8902376825334031462'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/05/blog-post.html' title='やっちまったなー'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-7297060568401391204</id><published>2009-05-07T21:53:00.002+09:00</published><updated>2009-05-07T22:01:06.249+09:00</updated><title type='text'>開発者別Adobe AIRの始め方</title><content type='html'>&lt;p&gt;
いざAdobe AIRを始めようと思ったらいろんなやり方があって迷ってしまったので、
開発者別のAdobe AIRの始め方をえらそうにメモってみる。
&lt;/p&gt;

&lt;h4&gt;開発パターン3つ&lt;/h4&gt;

&lt;p&gt;
大きく分けると以下の3通りの方法がある。
それぞれ使うソフトも必要な費用も違う。
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flashベースの開発&lt;/li&gt;
&lt;li&gt;Flexベースの開発&lt;/li&gt;
&lt;li&gt;HTML/JavaScriptベースの開発&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
以下詳細。
&lt;/p&gt;

&lt;h4&gt;Flashベースの開発&lt;/h4&gt;

&lt;p&gt;
まずは&lt;a href="http://www.adobe.com/jp/products/flash/"&gt;Adobe Flash CS4 Professional&lt;/a&gt;を使用する方法。
単品で購入すると88,200円。
ウェブで調べてもなかなかFlash Professionalで開発している例を見つけることができないが、
&lt;a href="http://www.adobe.com/jp/special/air/tutorials/"&gt;Flashユーザ向けAdobe AIRチュートリアル&lt;/a&gt;がわかりやすい。
本では&lt;a href="http://www.amazon.co.jp/dp/4839931674"&gt;Flashで作る AIRアプリケーション レシピブック&lt;/a&gt;があったが、入門にはならないのでチュートリアルを読んでからのほうがよい。
&lt;/p&gt;

&lt;p&gt;
使用する言語はMXMLとActionScript（ざっくり言うとHTMLとJavaScriptみたいな感じ）、
加えてFlashのリッチな表現が可能。
あまりプログラム的な要素がないFlashアプリをAIR化するようなケースではFlashベースの開発がよさそう。
&lt;/p&gt;

&lt;h4&gt;Flexベースの開発&lt;/h4&gt;

&lt;p&gt;
Flexはプログラマ向けFlashみたいな認識しかないけどもうバージョン3。
遅ればせながら勉強します。
Flashベースの開発とわざわざ分けてFlexベースの開発を書いたけど、Flashベースと言ってもいいかもしれない。
Flexは製品版の&lt;a href="http://www.adobe.com/jp/products/flex/"&gt;Flex Builder&lt;/a&gt;を購入する（31,500円なのでFlash Professionalよりはお手軽）か、
フリーのFlex SDKをダウンロードしてコマンド+テキストエディタで開発することができる。
ウェブでAIRの例を検索すれば一番ヒットするのはFlexベースの開発だと思う。
（ただしAIRがまだApolloのころのソースもよくヒットしてしまって、
そのままコピって実行しようとしてもAPIが違って実行できないことがあるので注意）
&lt;/p&gt;

&lt;p&gt;
使用する言語はFlash同様、MXMLとActionScript。
Flexのコンポーネントのスタイル設定にはCSSが使える。
&lt;/p&gt;

&lt;p&gt;
お金がないからと言ってFlex SDK+コマンド+エディタで開発しようとすると、仕組みを覚えるにはいいけど結構面倒。
GUIがないからコンポーネントの配置なんかやってられない。
Flex Builderがあるとよいが、いまならEclipseに&lt;a href="http://amateras.sourceforge.jp/cgi-bin/fswiki/wiki.cgi?page=AmaterasAIR"&gt;AIR GEAR&lt;/a&gt;というプラグインをインストールすることでFlex Builderに近い環境が準備できる。（このプラグインの名前、マンガのタイトルぱくったんじゃあるまいか...）
GUIでコンポーネントの配置ができるし、内部的にfcshコマンドを使ったりしてコンパイルもそこそこ高速。ありがたし。
Flex関連の書籍も多いので、新しく始めるのには情報量が多くてよい。
（WEB+DB PRESS Vol.46がわかりやすかった）
&lt;/p&gt;

&lt;h4&gt;HTML/JavaScriptベースの開発&lt;/h4&gt;

&lt;p&gt;
HTML/JavaScriptベースの開発には&lt;a href="http://www.adobe.com/jp/products/dreamweaver/"&gt;Adobe Dreamweaver CS4&lt;/a&gt;を使用する。
価格は49,875円。
Dreamweaver以外にもIDEの選択肢は多く、Eclipse+AIR GEARでもAptanaでも開発ができる。
その代わりウェブ上には情報があまり多くない。
前述の&lt;a href="http://www.adobe.com/jp/special/air/tutorials/"&gt;Flashユーザ向けAdobe AIRチュートリアル&lt;/a&gt;にはDreamweaverで開発する例が載っていてわかりやすい。
&lt;/p&gt;

&lt;p&gt;
使用する言語は名前の通りHTML, JavaScriptを使用することになる。
ウェブアプリ開発者には新しく言語を覚える必要がなくコストが下がる。
さらにjQueryやYahoo! UI Libraryといった通常のウェブアプリで使用されているJavaScriptライブラリまで使用できるので、
慣れている人にはさらにうれしい。
（といいつつも、いつもYUIを使ってウェブアプリ開発してるのにHTML/JavaScriptベースのAIRアプリ開発は考えてないオレ）
&lt;/p&gt;

&lt;h4&gt;まとめ&lt;/h4&gt;

&lt;p&gt;
どれを使っても最終的にできあがるパッケージは同じように実行できる。
（もちろん見た目やできることには差が出る。HTML/JavaScriptベースの開発ではFlashのようなアニメーションを作ることはできない（はず））
&lt;/p&gt;

&lt;p&gt;
プログラム的な要素が多いか少ないか、
IDEにお金をかけられるかかけられないか、
既存のスキルはなにかで上記の3パターンからどれを選ぶか決まってくると思う。
個人的にはEclipse+AIR GEARでの開発がコストもかからず勉強には一番よいと感じているが、
ちゃんとしたアプリケーションを作るとなったらFlex BuilderかFlash Professionalを購入した方がいいだろう。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-7297060568401391204?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/7297060568401391204/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=7297060568401391204' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/7297060568401391204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/7297060568401391204'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/05/adobe-air.html' title='開発者別Adobe AIRの始め方'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-6854187745739249803</id><published>2009-04-09T23:21:00.002+09:00</published><updated>2009-04-09T23:23:58.637+09:00</updated><title type='text'>Oracleセミナーで覚えたこと（その３）</title><content type='html'>&lt;p&gt;
もう4日目か。結構あっという間。
言うまでもないけど寝てる受講生なんていませんな。
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;フラッシュバック関連続き
  &lt;ul&gt;
    &lt;li&gt;フラッシュバック・データベース：データベースに対するすべての変更をある時点まで&lt;strong&gt;迅速に&lt;/strong&gt;戻せる（戻す時間が短いなら不完全リカバリするよりこっちのほうが速い）&lt;/li&gt;
    &lt;li&gt;フラッシュバック・データ・アーカイブ：長期間フラッシュバック・問い合わせができる。１年前の状態のテーブルからSELECTできたりするのでコンプライアンス等に便利。いちいち履歴テーブルとか用意しなくても済むのがすばらしい（アプリケーション側に修正が必要ない）&lt;/li&gt;
  &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;自動診断リポジトリ関連。ほとんどOEMでグラフィカルに確認できる&lt;/li&gt;
&lt;li&gt;データ・リカバリ・アドバイザを使うと障害の検出・分析・修復が驚くほど速い。データファイルのブロックにddコマンドで適当なデータ書き込んでブロック破損させたのに、コマンド何個か打てば短時間で復旧できる。滅多に起こらないことだろうけど、普段からやり慣れた作業じゃないこんなケースこそ簡単なのが嬉しい&lt;/li&gt;
&lt;li&gt;メモリ管理。SGAまわりでまだちゃんと理解してなかったところがボロボロと出てくる。Oracleをちゃんと理解するにはちゃんとハードウェアからマシンを理解しないとダメだなーと痛感。普段ウェブアプリばっかり作ってると共有メモリとかまず出てこないわけで...&lt;/li&gt;
&lt;li&gt;SQLチューニング・アドバイザ：あるSQLに対して「統計が古くないか」「インデックスの追加で速くならないか」「不適切な計画を使用していないか」などチェックしてくれる&lt;/li&gt;
&lt;li&gt;SQLアクセス・アドバイザ：インデックス、マテリアライズド・ビュー、パーティショニングなどをすることで大幅にパフォーマンスが向上するかチェックしてくれる&lt;/li&gt;
&lt;li&gt;受講中はテキストだけでなく、自分で持ち込んだ本やMacBookにダウンロードしたオンラインマニュアルなんかも（勝手に）読んでる。「Oracle Database 2日でデータベース管理者11g リリース1（11.1）」をダウンロードするのはこんな感じ。
  &lt;ol&gt;
    &lt;li&gt;MacPortsでwgetをインストール&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;cd Sites&lt;/code&gt;&lt;/li&gt;
    &lt;li&gt;&lt;code&gt;wget -r -L http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05759-03/toc.htm&lt;/code&gt;&lt;/li&gt;
  &lt;/ol&gt;
&lt;code&gt;-r&lt;/code&gt;で再帰、&lt;code&gt;-L&lt;/code&gt;で相対リンクのみ。たまにCSS内で参照している画像とかがうまくリンク辿られずに取得できないので、そういう場合はFirebugでURLを調べて&lt;code&gt;-x&lt;/code&gt;オプションをつけてwget。
&lt;/li&gt;
&lt;li&gt;いまさらだけどSpotlightに辞書も入っててうれしかった&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;東京はもう桜が散り始め。仙台はいまちょうど見頃かなぁ...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-6854187745739249803?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/6854187745739249803/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=6854187745739249803' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/6854187745739249803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/6854187745739249803'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/04/oracle_2356.html' title='Oracleセミナーで覚えたこと（その３）'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-1759895446694358238</id><published>2009-04-09T00:11:00.000+09:00</published><updated>2009-04-09T00:12:21.948+09:00</updated><title type='text'>Oracleセミナーで覚えたこと（その２）</title><content type='html'>&lt;p&gt;
Recovery Managerに慣れてきたー。&lt;br&gt;
&lt;code&gt;RMAN&amp;gt; backup 脳みそ;&lt;/code&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SCN：System Change(またはCommit) Numberの略。コミットごとにインクリメントされる番号。PostgreSQLのXIDみたいなもの？（と思ったら違った。トランザクションIDというのが別に存在する。ただしOracleのトランザクションIDは文字列みたいな識別子。SCNは数値）&lt;/li&gt;
&lt;li&gt;インカネーション：データベースのバージョンを識別するための番号。リカバリ・カタログを使用した管理の場合のみ発生する。&lt;/li&gt;
&lt;li&gt;ステージング領域：$ORACLE_HOME/dbsのこと。このディレクトリを指す&lt;/li&gt;
&lt;li&gt;Oracleホーム：環境変数ORACLE_HOMEと同義だと思われる&lt;/li&gt;
&lt;li&gt;RAWデバイス：ファイルシステムを作っていないパーティションのこと。通常REDOログの書き込みが最大パフォーマンスになるが、これにRAWデバイスを使うといいらしい。生デバイスってなにかと思った&lt;/li&gt;
&lt;li&gt;DBID：データベース識別子。&lt;code&gt;SELECT DBID FROM v$database;&lt;/code&gt;で取得。DB複製のときとか意識する&lt;/li&gt;
&lt;li&gt;用語どころか英語もわからん...（retentionとかpurgeとかauxiliaryとか普段使わない）&lt;/li&gt;
&lt;li&gt;ストリーミングって動画のことかと思ったらストリーミング・テープ装置っていうのがあるらしい&lt;/li&gt;
&lt;li&gt;PCTFREEってなんだっけ（最後にこの単語を見たのは4年ぐらい前かと...）&lt;/li&gt;
&lt;li&gt;表領域Point-in-Timeリカバリすばらしい&lt;/li&gt;
&lt;li&gt;フラッシュバック・テクノロジもすばらしい（用語が多くて混乱。以下かなり大雑把＆嘘あり御免）
  &lt;ul&gt;
    &lt;li&gt;フラッシュバック・ドロップ：DROP TABLEしてしまった表を元に戻せる&lt;/li&gt;
    &lt;li&gt;フラッシュバック・問い合わせ：DML実行前のある時点のデータをSELECTできる&lt;/li&gt;
    &lt;li&gt;フラッシュバック・バージョン問い合わせ：ある範囲の時間にあったトランザクションの履歴を問い合わせることができる。変更の履歴が見れるという理解であってるのか？これで取得した情報をもとに次のフラッシュバック・トランザクション問い合わせを実行したりする&lt;/li&gt;
    &lt;li&gt;フラッシュバック・トランザクション問い合わせ：フラッシュバック・バージョン問い合わせで取得したトランザクションIDを使って、データベースに対して行われた変更をトランザクションレベルで追える。トランザクション1とトランザクション2で同じレコードを更新しているから二つのトランザクションには依存性がある、とかもわかる。これすごいなぁ&lt;/li&gt;
    &lt;li&gt;フラッシュバック・データベース：明日やる予定&lt;/li&gt;
    &lt;li&gt;フラッシュバック・データ・アーカイブ：明日やる予定&lt;/li&gt;
    &lt;li&gt;全然関係ないけどFLASH BACKといえばcapsule（プレイバックは山口百恵）&lt;/li&gt;
  &lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;「Oracleだったら○○があるからすぐデータ戻せるのになぁ」とかいうケースが研修終わった後にありそう...でも好きですポスグレ&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-1759895446694358238?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/1759895446694358238/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=1759895446694358238' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1759895446694358238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1759895446694358238'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/04/oracle_09.html' title='Oracleセミナーで覚えたこと（その２）'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-3292633318864090044</id><published>2009-04-08T00:40:00.001+09:00</published><updated>2009-04-08T00:42:38.037+09:00</updated><title type='text'>Oracleセミナーで覚えたこと（その１）</title><content type='html'>&lt;p&gt;
5日間Oracleの管理ワークショップII（Iを受講せずいきなりII）に通うことになった。
業務で使ったことないからちょっとビビリつつもMacのVMにCentOS追加してOracle 11gR1入れていろいろ試して、いざセミナー。
覚えたことはアウトプットしないとすぐ忘れるから&lt;code&gt;pg_dump -d my脳みそ&lt;/code&gt;してみる。
（まだまだPostgreSQL脳だからデータをダンプするコマンドがすんなり出てこないよ...）
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Oracle青山のビル立派！&lt;/li&gt;
&lt;li&gt;講師の人カッコいい&lt;/li&gt;
&lt;li&gt;ドリンク飲み放題&lt;/li&gt;
&lt;li&gt;ノート持ち込みOKなのでMacにDokuWiki入れてメモメモできる&lt;/li&gt;
&lt;li&gt;でもDokuWikiのテキストエリアで編集するのはかったるいのでFirefoxにIt's All Text!をインストールしてEmacsでテキストエリアを編集できるとすばやくタイピングできていい&lt;/li&gt;
&lt;li&gt;2cmくらいのテキスト3冊（2冊が座学用で1冊は演習用）を5日間でこなすらしい。ひー&lt;/li&gt;
&lt;li&gt;演習用の環境がすでに準備してあり、演習は基本的にテキストに沿ってコマンドを実行するだけ。でも座学の内容を実際にコマンドで打つだけでも記憶の定着度が上がる気がする。さらにOEMでもすぐ表示できるからいろんな視点から設定を確認したり処理が実行できてこれまたいい&lt;/li&gt;
&lt;li&gt;環境変数ORACLE_SIDをexportコマンドでいちいち設定してからsqlplusを実行する代わりに&lt;code&gt;env ORACLE_SID=orcl sqlplus / as sysdba&lt;/code&gt;みたいにしても問題ない（え？常識？こんなんばっかりですごめんなさい）&lt;/li&gt;
&lt;li&gt;SYSAUX表領域のAUXはauxiliaryの略。「補助の」「追加の」&lt;/li&gt;
&lt;li&gt;PostgreSQLの表領域のイメージをそのままOracleに当てはめてちょっと混乱。PostgreSQLで表領域を作成する際はディレクトリを指定するけど、Oracleで表領域を作成する際は「ファイルシステム」「OMF」「RAWデバイス」「ASM」のような選択肢がある。テーブルは表領域Aに割り振ってインデックスは表領域Bに振って負荷分散、というのはOracleでもやるらしい&lt;/li&gt;
&lt;li&gt;ASM
  &lt;ul&gt;
    &lt;li&gt;Oracleの提供する「ストライピング＋ミラーリングができるソフトウェアRAID」みたいなもの（RAID01とRAID10どっちだ？）&lt;/li&gt;
    &lt;li&gt;ASMでディスクを１つ手動で止めてリバランスされる様子が見れる。ちょっと感動。PostgreSQLではまだできないよなぁ&lt;/li&gt;
    &lt;li&gt;ハードウェア側でしっかりRAIDができているのであればRAIDコントローラ積んでるマシンのほうが処理速いので、ASMの冗長性を「外部」に設定してASMで冗長化しないようにする&lt;/li&gt;
    &lt;li&gt;ハードウェアRAIDとか用意できないような環境ならASMで冗長化がよさげ。10g以降なら積極的に使ってみたい&lt;/li&gt;
  &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;バックアップとリカバリ
  &lt;ul&gt;
    &lt;li&gt;制御ファイル、REDOログ・ファイルなどのバックアップを取った後にそれらのファイルを削除してリストア・リカバリする、という手順を一通り演習で学べる&lt;/li&gt;
    &lt;li&gt;よくファイルを間違って消してしまう自分としては、復旧手順がすでに演習のテキストにあると思うとなんだか安心&lt;/li&gt;
    &lt;li&gt;でもARCHIVELOGモードで動かすことを忘れずに&lt;/li&gt;
    &lt;li&gt;リカバリ・カタログの利用目的はわかるけどそんなところまでバックアップをきっちりやる必要性って本当にあるのかな、という感想。実際の業務で使ってみないとピンとこない&lt;/li&gt;
  &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;なんでsqlplusはヒストリをたどれないんだろう...イライラ（調べたらrlwrapっていうのをインストールするとreadlineがサポートされるという記事発見。でも演習環境には勝手にインストールできねー）&lt;/li&gt;
&lt;li&gt;演習用のマシンから接続できるサイトはドメイン制限かかってるみたい。oracle.co.jpとgoogle.co.jpは行けた。Googleの検索結果画面のキャッシュのリンクは直IPでドメインないので見れなかった&lt;/li&gt;
&lt;li&gt;演習用のマシンはHDD１個しか積んでないが、複数のデバイスがあるように見せかけてディスクグループを作っている。そのためか結構遅いことがある。処理中にロードアベレージ6とか超えてるけど大丈夫か？実運用時は物理的に違うメディアを使うだろうからこれよりは全然速いんだろう&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
あと3日がんばります。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-3292633318864090044?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/3292633318864090044/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=3292633318864090044' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3292633318864090044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3292633318864090044'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/04/oracle.html' title='Oracleセミナーで覚えたこと（その１）'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-8948476510631575804</id><published>2009-04-03T14:24:00.002+09:00</published><updated>2009-04-03T14:28:05.556+09:00</updated><title type='text'>うっかりCentOS5.3にアップデート完了</title><content type='html'>&lt;p&gt;
さっきCentOS5.3がリリースされたらしい。
CentOS5.2から5.3にするには&lt;code&gt;yum upgrade&lt;/code&gt;するんだろうと思っていたら&lt;code&gt;yum update&lt;/code&gt;だけで300MB近いアップデートがあって、
試しに&lt;code&gt;yum update&lt;/code&gt;してみると見事に&lt;code&gt;cat /etc/redhat-release&lt;/code&gt;が「CentOS release 5.3 (Final)」になってた。うっかり。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-8948476510631575804?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/8948476510631575804/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=8948476510631575804' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/8948476510631575804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/8948476510631575804'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/04/centos53.html' title='うっかりCentOS5.3にアップデート完了'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-4103710422589593107</id><published>2009-03-23T12:57:00.000+09:00</published><updated>2009-03-23T12:59:33.559+09:00</updated><title type='text'>PostgreSQLのソート順がおかしいためロケール再設定とinitdbやり直し</title><content type='html'>&lt;p&gt;
またPostgreSQLのソート順でおかしくなったのでメモ。
&lt;/p&gt;

&lt;p&gt;
普段使っているCentOS5ではロケールをja_JP.UTF-8に設定し、
その状態でPostgreSQLもインストール＆起動しているので気づかなかったのだが、
あるお客さんに収めるサーバをRHELで構築する際ロケールをen_US.UTF-8に設定してインストールしたところ日本語列のORDER BYの順番が明らかにおかしい。
どうやらまたロケールの問題がでてしまったらしい。
&lt;/p&gt;

&lt;p&gt;
現状と調べてみた情報を列挙。
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;initdbした時点でのロケールがずっと使われるため、postgresql.confのlc_で始まる設定値を変更してもダメ&lt;/li&gt;
&lt;li&gt;現在のPostgreSQLのロケールは&lt;code&gt;pg_controldata /var/lib/pgsql/data&lt;/code&gt;で確認できる&lt;/li&gt;
&lt;li&gt;/etc/init.d/postgresql startを実行したときに/var/lib/pgsql/dataディレクトリがないと自動的にinitdbが動くが、その際のinitdbには--localeが指定されていないのでOSの環境を引き継いでいる&lt;/li&gt;
&lt;li&gt;initdbを再度実行するには/var/lib/pgsql/dataディレクトリを消してしまえばよい（つまりデータは使えなくなる、と。ダンプ必要）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
幸い今回の環境ではen_US.UTF-8をja_JP.UTF-8に変更しても影響を受けるプログラムがない（と考えられる）ので、
OS全体のロケールを書き換え、PostgreSQLをinitdbからやり直すことにした。
（/etc/init.d/postgresqlを書き換えてinitdb時に--localeオプションを追加するという手もあるけど、今回はパス）
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
データのバックアップ
&lt;p&gt;pg_dumpコマンドを使用してダンプ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
DBを停止
&lt;pre class="prettyprint"&gt;# /etc/init.d/postgresql stop&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
OSのロケール変更
&lt;pre class="prettyprint"&gt;# vim /etc/sysconfig/i18n&lt;/pre&gt;
&lt;p&gt;en_US.UTF-8をja_JP.UTF-8に変更し保存。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
OS再起動
&lt;pre class="prettyprint"&gt;# shutdown -r now&lt;/pre&gt;
&lt;p&gt;chkconfigでpostgresqlが自動起動するようになっている場合は再起動後PostgreSQLを停止。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
initdbやり直し

&lt;pre class="prettyprint"&gt;
# cd /var/lib/pgsql
# mv data data_old
# mkdir data
# chown postgres:postgres data
# chmod 700 data
# /etc/init.d/postgresql start
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
PostgreSQLのロケール確認

&lt;pre class="prettyprint"&gt;
# pg_controldata /var/lib/pgsql/data
pg_control version number:            812
Catalog version number:               200510211
Database system identifier:           5316336277145481133
Database cluster state:               in production
pg_control last modified:             2009年03月23日 20時09分29秒
Current log file ID:                  0
Next log file segment:                1
Latest checkpoint location:           0/38C484
Prior checkpoint location:            0/33B194
Latest checkpoint's REDO location:    0/38C484
Latest checkpoint's UNDO location:    0/0
Latest checkpoint's TimeLineID:       1
Latest checkpoint's NextXID:          1607
Latest checkpoint's NextOID:          24576
Latest checkpoint's NextMultiXactId:  1
Latest checkpoint's NextMultiOffset:  0
Time of latest checkpoint:            2009年03月23日 20時09分29秒
Maximum data alignment:               4
Database block size:                  8192
Blocks per segment of large relation: 131072
Bytes per WAL segment:                16777216
Maximum length of identifiers:        64
Maximum columns in an index:          32
Date/time type storage:               floating-point numbers
Maximum length of locale name:        128
LC_COLLATE:                           ja_JP.UTF-8
LC_CTYPE:                             ja_JP.UTF-8
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
これで日本語列のソート順が意図したとおりになった。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-4103710422589593107?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/4103710422589593107/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=4103710422589593107' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/4103710422589593107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/4103710422589593107'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/03/postgresqlinitdb.html' title='PostgreSQLのソート順がおかしいためロケール再設定とinitdbやり直し'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-8659438211445814095</id><published>2009-02-07T21:40:00.025+09:00</published><updated>2009-02-07T22:34:48.685+09:00</updated><title type='text'>Time Capsule 500GBの購入とインストールと設定</title><content type='html'>&lt;p&gt;
バックアップに泣いた去年ですが、会社はとりあえずバックアップを自動化したりして対処済みなので、今年は自宅のバックアップをするのであります。
（というもっともな理由を付けたTime Capsuleの購入）
&lt;/p&gt;

&lt;h4&gt;現状の家庭内ネットワーク&lt;/h4&gt;

&lt;p&gt;
フレッツ光でプロバイダはKDDI。
PPPoEで、壁からLANケーブルをBUFFALOの無線LANルータに接続。
無線LANの規格は802.11gで暗号方式はWEP。
&lt;del&gt;BUFFALOだとAOSSが使えるのでWiiと簡単に接続ができる代わりに、
Wiiのほうで暗号方式がWEPしか使えないので、
MacBookとの通信もWEPになってしまい十分にセキュアでない。&lt;/del&gt;
と思っていたら、&lt;a href="http://www.nintendo.co.jp/wii/q_and_a/045.html"&gt;WiiでもWPA2で接続できる&lt;/a&gt;みたい。
&lt;/p&gt;

&lt;p&gt;
せっかく今回Time Machineを買って高速な802.11nが使えるようになるので、
MacBookは802.11n（暗号方式はWPA2パーソナル）で接続し、
Wiiからも接続できるならBUFFALOの無線LANルータを使わないようにしてしまいたい。
&lt;/p&gt;

&lt;h4&gt;Time Machine開封&lt;/h4&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-sif9wLT5H0/SY2Mgaq9nkI/AAAAAAAABWI/SFdY8E47mj0/s1600-h/IMGP1805.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_-sif9wLT5H0/SY2Mgaq9nkI/AAAAAAAABWI/SFdY8E47mj0/s320/IMGP1805.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5300046825028165186" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-sif9wLT5H0/SY2MlNdIdMI/AAAAAAAABWQ/lXR6vdX6mjY/s1600-h/IMGP1807.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_-sif9wLT5H0/SY2MlNdIdMI/AAAAAAAABWQ/lXR6vdX6mjY/s320/IMGP1807.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5300046907379840194" /&gt;&lt;/a&gt;

&lt;p&gt;
Apple製品はカッコいいですな。開封後は以下のように設置。
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;BUFFALOの無線LANルータを停止&lt;/li&gt;
&lt;li&gt;Time Machineの電源ケーブルを接続&lt;/li&gt;
&lt;li&gt;壁のモジュラージャック（ていう呼び名で合ってるのかな？）とTime MachineのWANポートをLANケーブルで接続&lt;/li&gt;
&lt;li&gt;Time MachineのLANポートとMacBookをLANケーブルで接続&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
まだこの時点ではTime Machineのステータスランプはオレンジ点滅のままで正しく設定されていない状態。
&lt;/p&gt;

&lt;h4&gt;AirMacユーティリティのインストールと設定&lt;/h4&gt;

&lt;p&gt;
付属のインストールディスクを使用してAirMacユーティリティをインストール。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-sif9wLT5H0/SY2BYsA4U0I/AAAAAAAABTY/Vp7OV0dNtw0/s1600-h/TimeCapsule_1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 182px;" src="http://2.bp.blogspot.com/_-sif9wLT5H0/SY2BYsA4U0I/AAAAAAAABTY/Vp7OV0dNtw0/s320/TimeCapsule_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300034597616636738" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-sif9wLT5H0/SY2BjqggelI/AAAAAAAABTg/4IKAQi6nd6Y/s1600-h/TimeCapsule_2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 227px;" src="http://2.bp.blogspot.com/_-sif9wLT5H0/SY2BjqggelI/AAAAAAAABTg/4IKAQi6nd6Y/s320/TimeCapsule_2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300034786190981714" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-sif9wLT5H0/SY2BrfhyQnI/AAAAAAAABTo/5P7uFmyrRbo/s1600-h/TimeCapsule_3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 227px;" src="http://3.bp.blogspot.com/_-sif9wLT5H0/SY2BrfhyQnI/AAAAAAAABTo/5P7uFmyrRbo/s320/TimeCapsule_3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300034920682504818" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-sif9wLT5H0/SY2B55j4GlI/AAAAAAAABTw/i0ZLqyhO1uY/s1600-h/TimeCapsule_4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 227px;" src="http://3.bp.blogspot.com/_-sif9wLT5H0/SY2B55j4GlI/AAAAAAAABTw/i0ZLqyhO1uY/s320/TimeCapsule_4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300035168188766802" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-sif9wLT5H0/SY2CBqJPLbI/AAAAAAAABT4/2TfgkTMBVlE/s1600-h/TimeCapsule_5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 227px;" src="http://1.bp.blogspot.com/_-sif9wLT5H0/SY2CBqJPLbI/AAAAAAAABT4/2TfgkTMBVlE/s320/TimeCapsule_5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300035301489454514" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-sif9wLT5H0/SY2CIDsSEWI/AAAAAAAABUA/1Gj-cHO5Y5s/s1600-h/TimeCapsule_6.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 227px;" src="http://2.bp.blogspot.com/_-sif9wLT5H0/SY2CIDsSEWI/AAAAAAAABUA/1Gj-cHO5Y5s/s320/TimeCapsule_6.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300035411426546018" /&gt;&lt;/a&gt;

&lt;p&gt;
インストールが完了するとアプリケーションのユーティリティ以下に
「AirMac ユーティリティ」が追加されている。
起動して設定に進む。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-sif9wLT5H0/SY2CO6ffXEI/AAAAAAAABUI/9_EOg0sbr6Y/s1600-h/TimeCapsule_7.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 174px;" src="http://2.bp.blogspot.com/_-sif9wLT5H0/SY2CO6ffXEI/AAAAAAAABUI/9_EOg0sbr6Y/s320/TimeCapsule_7.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300035529216056386" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-sif9wLT5H0/SY2CYGGn2PI/AAAAAAAABUQ/Blt3V-brUq0/s1600-h/TimeCapsule_9.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 206px;" src="http://3.bp.blogspot.com/_-sif9wLT5H0/SY2CYGGn2PI/AAAAAAAABUQ/Blt3V-brUq0/s320/TimeCapsule_9.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300035686951803122" /&gt;&lt;/a&gt;

&lt;p&gt;
BUFFALOのワイヤレスネットワークはもう使用しないつもりなので
「ワイヤレスネットワークはなく、作成したい」を選ぶ。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-sif9wLT5H0/SY2CfpY863I/AAAAAAAABUY/FKEESHtozWs/s1600-h/TimeCapsule_10.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 206px;" src="http://2.bp.blogspot.com/_-sif9wLT5H0/SY2CfpY863I/AAAAAAAABUY/FKEESHtozWs/s320/TimeCapsule_10.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300035816683006834" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-sif9wLT5H0/SY2Cmmr_m7I/AAAAAAAABUg/oAmoYOcrgMw/s1600-h/TimeCapsule_11.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 206px;" src="http://1.bp.blogspot.com/_-sif9wLT5H0/SY2Cmmr_m7I/AAAAAAAABUg/oAmoYOcrgMw/s320/TimeCapsule_11.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300035936216652722" /&gt;&lt;/a&gt;

&lt;p&gt;
Time MachineがPPPoEで直接インターネットに接続するので以下のように選ぶ。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-sif9wLT5H0/SY2CqFZu4qI/AAAAAAAABUo/jx9MpNoBkHM/s1600-h/TimeCapsule_12.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 206px;" src="http://2.bp.blogspot.com/_-sif9wLT5H0/SY2CqFZu4qI/AAAAAAAABUo/jx9MpNoBkHM/s320/TimeCapsule_12.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300035996001165986" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-sif9wLT5H0/SY2CuES8cCI/AAAAAAAABUw/twukqeT7C44/s1600-h/TimeCapsule_14.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 206px;" src="http://4.bp.blogspot.com/_-sif9wLT5H0/SY2CuES8cCI/AAAAAAAABUw/twukqeT7C44/s320/TimeCapsule_14.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300036064423735330" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-sif9wLT5H0/SY2CyEEKKHI/AAAAAAAABU4/CEmit_WwNdA/s1600-h/TimeCapsule_15.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 206px;" src="http://2.bp.blogspot.com/_-sif9wLT5H0/SY2CyEEKKHI/AAAAAAAABU4/CEmit_WwNdA/s320/TimeCapsule_15.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300036133081196658" /&gt;&lt;/a&gt;

&lt;p&gt;
設定が正しいことを確認して「アップデート」ボタンを押すと、
以下のようにTime Capsuleの画像横のステータスランプと本体のステータスランプがオレンジから緑に変わり、
正しく設定が完了したことがわかる。
802.11nを802.11gにしたり、暗号方式を変えたりしたいときは「手動設定」ボタンから詳細な設定に進むことができる。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-sif9wLT5H0/SY2C2r6lhpI/AAAAAAAABVA/fdgI57xdMLA/s1600-h/TimeCapsule_16.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 206px;" src="http://3.bp.blogspot.com/_-sif9wLT5H0/SY2C2r6lhpI/AAAAAAAABVA/fdgI57xdMLA/s320/TimeCapsule_16.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300036212497942162" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-sif9wLT5H0/SY2C5zAKbYI/AAAAAAAABVI/3CUB02x_2NI/s1600-h/TimeCapsule_17.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 206px;" src="http://1.bp.blogspot.com/_-sif9wLT5H0/SY2C5zAKbYI/AAAAAAAABVI/3CUB02x_2NI/s320/TimeCapsule_17.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300036265939987842" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-sif9wLT5H0/SY2C-uUZDkI/AAAAAAAABVQ/7h_9c8WW3Rw/s1600-h/TimeCapsule_18.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 206px;" src="http://3.bp.blogspot.com/_-sif9wLT5H0/SY2C-uUZDkI/AAAAAAAABVQ/7h_9c8WW3Rw/s320/TimeCapsule_18.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300036350582001218" /&gt;&lt;/a&gt;

&lt;p&gt;
MacBookからLANケーブルを抜いて、AirMacを入に変更し、正しく無線LANで接続できるのか確認してみた。
体感的にわかるぐらい802.11gに比べて802.11nのほうが速い。よしよし。
（BNRスピードテストで測定したところ、BUFFALO、802.11g、WPA-PSK（AES）では約24Mbps、
Time Capsule、802.11n、WPA2パーソナルでは約51Mbpsで倍近く違っていた）
&lt;/p&gt;

&lt;h4&gt;VistaマシンとWiiのネットワーク設定&lt;/h4&gt;

&lt;p&gt;
ほかにDellのWindows Vistaマシンがあり、Intel Intel Wireless WiFi Link 4965AGNが装備されている。
何回か接続に失敗したが、何度か繰り返したら正しく接続できた。
Wiiも正しく接続できた。
これでBUFFALOの無線LANルータは使用しなくてすみそう。
&lt;/p&gt;

&lt;h4&gt;Time Machineの設定&lt;/h4&gt;

&lt;p&gt;
Time Machineのバックアップはかなり時間がかかるとのことなので、
AirMacを切に戻してLANケーブルをつなぎ直し、DockからTime Machineを起動。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-sif9wLT5H0/SY2D4Fo_HUI/AAAAAAAABWA/JqvU5aUX9Ts/s1600-h/TimeMachine_1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 114px;" src="http://3.bp.blogspot.com/_-sif9wLT5H0/SY2D4Fo_HUI/AAAAAAAABWA/JqvU5aUX9Ts/s320/TimeMachine_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300037336094940482" /&gt;&lt;/a&gt;

&lt;p&gt;
「Time Machineを設定」ボタンをクリックすると以下のような画面になる。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-sif9wLT5H0/SY2Dz0qqqYI/AAAAAAAABV4/Cl30pFQv7W0/s1600-h/TimeMachine_2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 213px;" src="http://1.bp.blogspot.com/_-sif9wLT5H0/SY2Dz0qqqYI/AAAAAAAABV4/Cl30pFQv7W0/s320/TimeMachine_2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300037262819109250" /&gt;&lt;/a&gt;

&lt;p&gt;
バーを「切」から「入」のほうにドラッグすると次のダイアログが出るので、
Time Capsuleを選択する。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-sif9wLT5H0/SY2DvTinM-I/AAAAAAAABVw/j5VtMDdxHA0/s1600-h/TimeMachine_3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 182px;" src="http://4.bp.blogspot.com/_-sif9wLT5H0/SY2DvTinM-I/AAAAAAAABVw/j5VtMDdxHA0/s320/TimeMachine_3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300037185207481314" /&gt;&lt;/a&gt;

&lt;p&gt;
「バックアップに使用」ボタンをクリックすると次の画面のようになり、
２分ほどで自動的にバックアップがスタートする。
基本的にすべてのディスクがバックアップ対象になるが、
VMwareのLinuxのイメージはバックアップする必要はないので
「オプション」ボタンをクリックして除外する項目を選択しておく。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-sif9wLT5H0/SY2DqEHoJVI/AAAAAAAABVo/89TOAucrrX8/s1600-h/TimeMachine_4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 213px;" src="http://4.bp.blogspot.com/_-sif9wLT5H0/SY2DqEHoJVI/AAAAAAAABVo/89TOAucrrX8/s320/TimeMachine_4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300037095168419154" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-sif9wLT5H0/SY2DmOBcwpI/AAAAAAAABVg/YZ7uw9eRq34/s1600-h/TimeMachine_5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 250px;" src="http://4.bp.blogspot.com/_-sif9wLT5H0/SY2DmOBcwpI/AAAAAAAABVg/YZ7uw9eRq34/s320/TimeMachine_5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300037029107384978" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-sif9wLT5H0/SY2DhcltqrI/AAAAAAAABVY/5sPQjh6vErU/s1600-h/TimeMachine_6.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 214px;" src="http://2.bp.blogspot.com/_-sif9wLT5H0/SY2DhcltqrI/AAAAAAAABVY/5sPQjh6vErU/s320/TimeMachine_6.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5300036947118238386" /&gt;&lt;/a&gt;

&lt;p&gt;
87GBのバックアップを作成するのに約3.5時間かかった。
&lt;/p&gt;

&lt;p&gt;
これで基本的な設定は完了。
できれば復旧の様子をブログに載せることがないことを祈って。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-8659438211445814095?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/8659438211445814095/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=8659438211445814095' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/8659438211445814095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/8659438211445814095'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/02/time-capsule-500gb.html' title='Time Capsule 500GBの購入とインストールと設定'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-sif9wLT5H0/SY2Mgaq9nkI/AAAAAAAABWI/SFdY8E47mj0/s72-c/IMGP1805.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-908035041718641205</id><published>2009-02-03T01:18:00.002+09:00</published><updated>2009-02-03T01:25:20.753+09:00</updated><title type='text'>そりゃStrutsよりよくなってるんだろうけども</title><content type='html'>&lt;p&gt;
S2StrutsとかSAStrutsとかMayaaとかS2DaoとかS2DtoとかS2DxoとかS2JDBCとかJTAとかS2JSFとかTeedaとかDoltengとか、多すぎるの、もうちょっとなんとかならんかね。
やっぱりJavaでウェブアプリ作るの嫌かも...
&lt;/p&gt;

&lt;p&gt;
仮に自分が使えるようになったとしてもプロジェクトメンバーにこれ覚えてもらうの無理ジャマイカ。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-908035041718641205?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/908035041718641205/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=908035041718641205' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/908035041718641205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/908035041718641205'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/02/struts.html' title='そりゃStrutsよりよくなってるんだろうけども'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-8729005377790406247</id><published>2009-01-30T11:54:00.002+09:00</published><updated>2009-01-30T12:29:53.224+09:00</updated><title type='text'>setter, getterの使いどころ</title><content type='html'>&lt;p&gt;
JavaScriptのsetter, getterの使いどころってどこなの？という疑問。
&lt;/p&gt;

&lt;h4&gt;Javaのsetter, getter&lt;/h4&gt;

&lt;p&gt;
Javaでいうsetter, getterは、privateで宣言されたメンバ変数に対するアクセサとして使われることがほとんどだと思う。
Servlet/JSPのBeanとか。
直接オブジェクトを操作する代わりに関数を呼び出すことで以下のようなメリットがある。
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;setterで値のチェック処理を追加できる&lt;/li&gt;
&lt;li&gt;setter, getterにログを埋め込めばデバッグに便利&lt;/li&gt;
&lt;li&gt;setter, getterの処理内容が変わっても、呼び出している箇所には影響がない&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
とはいえ普段これらのメリットを受けるようなコードってそんなに書かないので、
Eclipseでsetter, getter自動生成するの面倒だなーっていう感じ。
&lt;/p&gt;

&lt;h4&gt;JavaScriptのsetter, getter&lt;/h4&gt;

&lt;p&gt;
さてJavaScriptでも同じ役割なのかというと、JavaScriptにはそもそもprivate変数がないので、
obj.valueのようにプロパティに直接アクセスすることは避けられない。
避けられないが、setter, getterを使うと単なる代入または取得の処理を関数で置き換えることができる。
&lt;/p&gt;

&lt;h4&gt;JavaScriptのsetter, getterを使ったカプセル化の例&lt;/h4&gt;

&lt;p&gt;
例えばageプロパティは数値（または数値の文字列）しか代入を許可しない、とか。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
person = {_age:null,get age(){return this._age;},set age(num){if(num&amp;&amp;/^[0-9]+$/.test(num)){this._age=num;}}};
person.age = 21;
person.age //「21」が出力される
person.age = "abc";
person.age //「abc」は代入されなかったので「21」が出力される
&lt;/pre&gt;

&lt;p&gt;
Firebugで上記のコードを１行ずつ入れれば実行結果が得られる。
&lt;/p&gt;

&lt;p&gt;
結局これだと_ageが隠蔽されていないが、
わざわざ_ageという変数名にしたのは、
setterのほうで同じ変数にthis.age=numのように値をセットすると再帰的にsetterが呼ばれてしまうため。
そういうもんなのね。
set _ageというsetterも用意してエラーを発生させるようにすればperson._ageに直接アクセスすることは防げる。
&lt;/p&gt;

&lt;h4&gt;JavaScriptのsetter, getterを使ったクロスブラウザ処理の例&lt;/h4&gt;

&lt;p&gt;
これはメリットが具体的にイメージできて納得できた。
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/amachang/20070627/1182922058"&gt;IE 以外の JavaScript で getter setter が使えるようになる！ - IT戦記&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
setter, getterを利用したライブラリを読み込んでおけば、
IE向けにしか作っていないウェブアプリのJavaScriptが他のブラウザでも動く、
というのが実現できそう。
（IEでCanvasを使えるようにするExplorerCanvasを連想したけどちょっと違うか...）
&lt;/p&gt;

&lt;h4&gt;参照&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/ja/Core_JavaScript_1.5_Guide/Creating_New_Objects/Defining_Getters_and_Setters"&gt;https://developer.mozilla.org/ja/Core_JavaScript_1.5_Guide/Creating_New_Objects/Defining_Getters_and_Setters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/amachang/20080821/1219302804"&gt;http://d.hatena.ne.jp/amachang/20080821/1219302804&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/amachang/20070627/1182922058"&gt;http://d.hatena.ne.jp/amachang/20070627/1182922058&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ejohn.org/blog/javascript-getters-and-setters/"&gt;http://ejohn.org/blog/javascript-getters-and-setters/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://fukumori.org/oo/why_use_getters_and_setters_j.html"&gt;http://fukumori.org/oo/why_use_getters_and_setters_j.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
ほかにもsetter, getterの使いどころってあるだろうか。
IE8でもsetter, getterが使えるようになって、
prototype.jsやjQueryやYAHOO! UIのメソッドを使うクロスブラウザのやり方が変わって来るのかも。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-8729005377790406247?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/8729005377790406247/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=8729005377790406247' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/8729005377790406247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/8729005377790406247'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/01/setter-getter.html' title='setter, getterの使いどころ'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-2817829552235947868</id><published>2009-01-26T16:42:00.002+09:00</published><updated>2009-01-26T16:51:01.663+09:00</updated><title type='text'>LinuxからWindows共有フォルダをマウントしてバックアップを保存</title><content type='html'>&lt;p&gt;
Linux上のファイルのバックアップを別メディアに保存するとき、同じマシンにバックアップを取っても意味がないので保存先を探したらNAS上のWindows共有フォルダしか見あたらなかった。
調べてみたらLinuxからWindows共有フォルダをマウントできることが分かったのでメモ。
&lt;/p&gt;

&lt;p&gt;
以下を参考にした。 
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://wiki.centos.org/TipsAndTricks/WindowsShares"&gt;TipsAndTricks/WindowsShares - CentOS Wiki&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
root権限で/etc/fstabに以下の一行を追加する。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
//servername/dir1 /mnt/win cifs user,uid=0,rw,suid,username=narucissus,password=hogehoge 0 0
&lt;/pre&gt;

&lt;p&gt;
共有フォルダのアドレスは「//servername/dir1」のように記述する。
認証がかかっている場合は、上記の例のようにオプションでusernameとpasswordを指定する。
スペースで区切られた値がなにを指すのかは&lt;a href="http://narucissus.blogspot.com/2008/10/vmware-serverlinuxcentoshdd.html"&gt;以前メモった&lt;/a&gt;のを参照。
マウントオプションは「mount cifs」などで検索すれば出てくる。
&lt;/p&gt;

&lt;p&gt;
マウントするディレクトリ/mnt/winを以下のように作成して、
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# cd /mnt
# mkdir win
&lt;/pre&gt;

&lt;p&gt;
作成したらマウントしてみる。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# mount /mnt/win
&lt;/pre&gt;

&lt;p&gt;
これで/mnt/winをlsしたりtouchしてみて読み書きができれば成功。
/etc/fstabに記述したのでLinuxを再起動しても起動時に自動でマウントされる。
あとはcrontabでバックアップ処理を書いて保存先を/mnt/winにすればOK。
&lt;/p&gt;

&lt;p&gt;
もしかしてこれってSambaをインストールしてないとできないのかも。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-2817829552235947868?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/2817829552235947868/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=2817829552235947868' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2817829552235947868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2817829552235947868'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/01/linuxwindows.html' title='LinuxからWindows共有フォルダをマウントしてバックアップを保存'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-2063899863033399384</id><published>2009-01-25T18:59:00.003+09:00</published><updated>2009-01-25T19:03:47.203+09:00</updated><title type='text'>初滑り</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-sif9wLT5H0/SXw4igBX4TI/AAAAAAAABP0/tHCbj2ljFv4/s1600-h/090125_1359~01_0001.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_-sif9wLT5H0/SXw4igBX4TI/AAAAAAAABP0/tHCbj2ljFv4/s320/090125_1359~01_0001.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5295169427243262258" /&gt;&lt;/a&gt;

&lt;p&gt;
ギャグも滑りまくり。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-2063899863033399384?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/2063899863033399384/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=2063899863033399384' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2063899863033399384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2063899863033399384'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/01/blog-post.html' title='初滑り'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-sif9wLT5H0/SXw4igBX4TI/AAAAAAAABP0/tHCbj2ljFv4/s72-c/090125_1359~01_0001.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-1503921108419816361</id><published>2009-01-23T17:39:00.000+09:00</published><updated>2009-01-23T17:40:18.654+09:00</updated><title type='text'>ただデータを書き込みするPythonプログラム</title><content type='html'>&lt;p&gt;
Linuxでtopやらvmstatやらiostatやらでパフォーマンスをチェックする方法がいまいちわからない。
勉強しよう。勉強するにはLinuxに負荷かけないと。
ということでPythonでデータを一定量書き込むだけのプログラムを作成。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# -*- coding: utf-8 -*- 
# I/Oの負荷をチェックするためファイルにデータを書き込む

# http://www.python.jp/doc/nightly/lib/module-tempfile.html
# http://www.python.jp/doc/nightly/lib/bltin-file-objects.html

import tempfile
import os
import datetime

before_time = datetime.datetime.now()

# 一時ファイルの生成
fn = tempfile.mkstemp()

fp = file(fn[1], "w")

for i in range(0, 4000000):
        fp.write('http://www.python.jp/doc/nightly/lib/module-tempfile.html\n')
        fp.flush()

fp.close()

os.close(fn[0])
os.remove(fn[1])

after_time = datetime.datetime.now()

print("generate: %s" % fn[1])
print("spent time: %s" % (after_time - before_time))
&lt;/pre&gt;

&lt;p&gt;
上記のプログラムをio_bench.pyというファイル名で保存してpython io_bench.pyを実行。
そのあいだvmstat 2を実行して以下のような結果を得た。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0 352800  72716   6772 126476   16   23   101    67 1050  696  7 10 81  3  0
 0  0 352800  72592   6772 126480    0    0     0    22 1022  354  5  6 89  0  0
 0  0 352800  72592   6780 126472    0    0     0    30 1022  377  6  5 90  0  0
 0  0 352800  72716   6780 126480    0    0     0    56 1028  354  5  4 91  0  0
 2  0 352800  20700   6860 126480    0    0    50     0 1028  379  6 53 39  3  0
 1  1 352800   4928   5864 136496    0    0     0     0 1018  366 38 62  0  0  0
 0  3 352800   5384   5592 133804    0    0    36 15022 1082  500 35 61  0  5  0
 1  1 352800   5168   4912 136428    0    0     2 13530 1200  740 30 54  0 17  0
 2  1 352800   5148    496 142232    0    0     0    34 1024  360 39 61  0  0  0
 1  1 352800   5648    320 149528    0    0     2 28242 1213  736 27 49  0 25  0
 2  1 352800   5052    392 151000    0    0    18   146 1085  497 38 62  0  0  0
 1  3 352800   5776    424 148720    0    0    14 17612 1114  578 38 59  0  4  0
 2  2 352800   4968    452 151400    0    0     2 14658 1207  747 35 60  0  5  0
 3  0 352800   8572    464 150600    0    0     0    48 1028  401 43 58  0  0  0
 0  0 352800 182448    492  38852    0    0    20    32 1023  329  5 20 73  2  0
 0  0 352800 182576    492  38872    0    0     0     0 1016  321  5  3 92  0  0
 0  0 352800 182576    496  38868    0    0     4     0 1019  326  5  6 88  0  0
 0  0 352800 182712    496  38876    0    0     0     0 1016  341  5  5 90  0  0
&lt;/pre&gt;

&lt;p&gt;
中央あたりで負荷かかってるっぽい。
これをどう読むかはこれからウェブで調べる。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-1503921108419816361?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/1503921108419816361/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=1503921108419816361' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1503921108419816361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1503921108419816361'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/01/python.html' title='ただデータを書き込みするPythonプログラム'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-5579825473107911339</id><published>2009-01-22T19:28:00.002+09:00</published><updated>2009-01-22T20:37:54.980+09:00</updated><title type='text'>Subversionサーバを5分で立てるメモ</title><content type='html'>&lt;p&gt;
CentOS5.2でぱぱっとSubversionリポジトリを作ってインポート＆チェックアウトするまでの手順をメモ。
CentOS5.2でインストールされるSubversionは1.4.2。
&lt;/p&gt;

&lt;h4&gt;必要なパッケージのインストール&lt;/h4&gt;

&lt;pre class="prettyprint"&gt;
# yum install mod_dav_svn subversion
&lt;/pre&gt;

&lt;h4&gt;設定ファイルの修正&lt;/h4&gt;

&lt;p&gt;
リポジトリはプロジェクトごとにたくさん作る可能性があるので、
http://127.0.0.1/svn/project1, http://127.0.0.1/svn/project2のように区別できるようにする。
/etc/httpd/conf.d/subversion.confを以下のように修正する。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

#
# Example configuration to enable HTTP access for a directory
# containing Subversion repositories, "/var/www/svn".  Each repository
# must be readable and writable by the 'apache' user.  Note that if
# SELinux is enabled, the repositories must be labelled with a context
# which httpd can write to; this will happen by default for
# directories created in /var/www.  Use "restorecon -R /var/www/svn"
# to label the repositories if upgrading from a previous release.
#

#
# To create a new repository "http://localhost/repos/stuff" using
# this configuration, run as root:
#
#   # cd /var/www/svn
#   # svnadmin create stuff   
#   # chown -R apache.apache stuff
#

&amp;lt;Location /svn&amp;gt;
   DAV svn
   SVNParentPath /var/www/svn

   # Limit write permission to list of valid users.
   &amp;lt;LimitExcept GET PROPFIND OPTIONS REPORT&amp;gt;
      # Require SSL connection for password protection.
      # SSLRequireSSL

      AuthType Basic
      AuthName "Authorization Realm"
      AuthUserFile /var/www/svn.passwd
      Require valid-user
   &amp;lt;/LimitExcept&amp;gt;
&amp;lt;/Location&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
SVNParentPathで指定した/var/www/svnを作成する。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# cd /var/www
# mkdir svn
&lt;/pre&gt;

&lt;p&gt;
AuthUserFileで指定したBasic認証用のファイルを用意。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# cd /var/www
# htpasswd -c svn.passwd user1
&lt;/pre&gt;

&lt;p&gt;
上記が完了したらhttpdを再起動。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# /etc/rc.d/init.d/httpd restart
&lt;/pre&gt;

&lt;h4&gt;リポジトリの作成&lt;/h4&gt;

&lt;pre class="prettyprint"&gt;
# cd /var/www/svn
# svnadmin create project1 --fs-type fsfs
# chown -R apache:apache project1
&lt;/pre&gt;

&lt;p&gt;
ここまで正しくできれば、ブラウザからhttp://127.0.0.1/svn/project1にアクセスして
「Revision 0」
と表示されるはず。
&lt;/p&gt;

&lt;h4&gt;インポートとチェックアウト&lt;/h4&gt;

&lt;p&gt;
すでにあるディレクトリ（例えば/usr/local/tomcat6/webapps/project1）をSubversionで管理するには、
ローカルのファイルをリポジトリにインポートしてから現在のディレクトリを一度退避し、
リポジトリからファイルをチェックアウトする、という手順になる。
その際ディレクトリのパーミッションなどが変わってしまい動作しないことがあるので、
Apacheの書き込み権限が必要になったりするディレクトリがある場合は注意。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# cd /usr/local/tomcat6/webapps

（インポート）
# svn import -m "New Import" project1 http://localhost/svn/project1/trunk/project1

（退避）
# mv project1 project1_bak

（チェックアウト）
# svn checkout http://localhost/svn/project1/trunk/project1 ./project1

（権限などをもとの状態に戻すため退避したバックアップからファイルをまるごとコピー）
# cd project1_bak
# cp -pr * ../project1
&lt;/pre&gt;

&lt;p&gt;
タイピングが速ければこれで5分！
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-5579825473107911339?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/5579825473107911339/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=5579825473107911339' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/5579825473107911339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/5579825473107911339'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/01/subversion5.html' title='Subversionサーバを5分で立てるメモ'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-521251424169093527</id><published>2009-01-19T19:04:00.001+09:00</published><updated>2009-01-19T19:07:40.735+09:00</updated><title type='text'>SubversionとSubversiveとsvnコマンドのあれこれ</title><content type='html'>&lt;p class="paragraph"&gt;
普通開発サーバにはCentOS4またはCentOS5を使用し、Subversionでバージョン管理をし、
Eclipse3.4(Ganymede)でソースコードを修正している。
EclipseのSubversiveプラグインを使っているが、
動作が結構重いので大量のファイルの同期・更新を行う場合は直接svnコマンドを実行することもある。
なにげなく上記の環境を使用していたが、最近頻繁に見かけるメッセージがある。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
svn: このクライアントは、作業コピー '...' を扱うには古すぎます。もっと新しい Subversion クライアントをダウンロードしてください。
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
（...はディレクトリが表示される）
Subversion自体にもバージョンがあることを考えていなかったが、どうやらSubversionリポジトリにアクセスするいろんなクライアントのバージョンが混在しているのでエラーが起きているようだ。
登場人物のSubversionのバージョンをまとめると以下のようになる。
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CentOS4.7にyumでインストールされるmod_dav_svn：&lt;strong&gt;1.1.4&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;CentOS4.7にyumでインストールされるsvnクライアント：&lt;strong&gt;1.1.4&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;CentOS5.1にyumでインストールされるmod_dav_svn：&lt;strong&gt;1.4.2&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;CentOS5.1にyumでインストールされるsvnクライアント：&lt;strong&gt;1.4.2&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;SVNKit 1.1.7：&lt;strong&gt;1.4.x&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;SVNKit 1.2.0：&lt;strong&gt;1.5.x&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class="paragraph"&gt;
SVNKitはJavaによるSubversionライブラリ。
EclipseのSubversionプラグイン「Subversive」が内部で使っているっぽい。
バージョンが1.1から1.5まであり、なんだかまずそう。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
そこで、エラーが発生しないようにこれらの環境を統一した。
CentOS5.1をリポジトリサーバにすることがほとんどなので、Subversion 1.4.x系で統一するのが現実的だ。
&lt;/p&gt;

&lt;h4&gt;Subversionリポジトリの準備&lt;/h4&gt;

&lt;p class="paragraph"&gt;
CentOS 5.1のyumでインストールしたmod_dav_svnをそのまま使用する。
Subversionは1.4になる。
&lt;/p&gt;

&lt;h4&gt;Eclipseの設定&lt;/h4&gt;

&lt;p class="paragraph"&gt;
Subclipseというプラグインがあるがこれは想定しない。
Subversiveプラグインを使用する場合は、SVNkit 1.2.0をインストールしないようにする。
すでにインストールされている場合はアンインストールする。
&lt;/p&gt;

&lt;h4&gt;svnクライアントコマンドの設定&lt;/h4&gt;

&lt;p class="paragraph"&gt;
svnコマンドを実行するOSがCentOS 5.1ならsvnコマンドのバージョンは1.4系なので問題ないが、
CentOS4系の場合はsvnコマンドのバージョンが1.1.4とかなり低い。
（一応1.1と1.2、1.2と1.3、1.3と1.4は互換性があるらしいが、さすがに違いすぎるようで「古すぎます」のメッセージが出た）
CentOS4では別途svnコマンドをインストールした方がよさそう。
バイナリパッケージを探したが、1.5しかなかったので、しょうがなくソースからコンパイルした。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
まず以下のリンクからapr(Apache Portable Runtime)とSubversionのtar.gzをダウンロード。
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://apr.apache.org/download.cgi"&gt;http://apr.apache.org/download.cgi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://subversion.tigris.org/"&gt;http://subversion.tigris.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class="paragraph"&gt;
aprはyumでもインストールできるのだが、
subversion-1.4.6.tar.gzのconfigureのときにyumでインストールしたaprがうまく見つからないようだったので、
しかたなく別途インストール。
neon（C言語用のWebDAVクライアントライブラリ）はyumによるインストールで問題ない。
必要なパッケージは以下のようにインストールしておく。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# yum install gcc zlib-devel neon neon-devel
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
それぞれ以下のようにコンパイル。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# tar xzf apr-1.3.3.tar.gz
# cd apr-1.3.3
# ./configure
# make
# make install

# tar xzf apr-util-1.3.4.tar.gz
# cd apr-util-1.3.4
# ./configure --with-apr=/usr/local/apr
# make
# make install

# tar xzf subversion-1.4.6.tar.gz
# cd subversion-1.4.6
# ./configure --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr --with-berkeley-db=no --with-neon=/usr
# make
# make install
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
これで/usr/local/bin/svnがインストールされた。
このsvnクライアントコマンドを使用した限りでは、Subversive(SVNKit 1.1.7)と併用してエラーが出ないようだ。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
Subversionのバージョンややこしー！
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-521251424169093527?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/521251424169093527/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=521251424169093527' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/521251424169093527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/521251424169093527'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2009/01/subversionsubversivesvn.html' title='SubversionとSubversiveとsvnコマンドのあれこれ'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-1193078917202558981</id><published>2008-11-02T15:20:00.002+09:00</published><updated>2008-11-02T15:26:36.043+09:00</updated><title type='text'>移行アシスタント断念</title><content type='html'>&lt;p&gt;
以前使っていたiMac G5は10.3だったためか、10.5の移行アシスタントを起動しても10.3の移行アシスタントを起動してもうまく連携できそうにない。
新MacBookはFirewireもない。
&lt;/p&gt;

&lt;p&gt;
技術的に本当にできないのかどうか裏付けはないが、&lt;a href="http://support.apple.com/kb/HT2288?viewlocale=ja_JP"&gt;MacBook Air: 移行アシスタントの使い方&lt;/a&gt;を見ると10.4以降でないとダメっぽい記述がある。
結局Ethernet経由でデータ全部コピーして済ませちゃいましたとさ。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-1193078917202558981?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/1193078917202558981/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=1193078917202558981' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1193078917202558981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1193078917202558981'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/11/blog-post.html' title='移行アシスタント断念'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-762655425108487256</id><published>2008-10-27T22:46:00.004+09:00</published><updated>2009-02-07T16:28:14.391+09:00</updated><title type='text'>Spacesを使ってMacとVMware Fusion上のLinux(CentOS)をすばやく切り替える</title><content type='html'>&lt;p&gt;
ボタン一つでMacの画面とCentOSの画面を一発切り替えできるとすごく楽。
試しにMacのSpacesを使ってみたら簡単にできた。
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;システム環境設定からExposeとSpacesを開き、Spacesタブを選択する&lt;/li&gt;
&lt;li&gt;今回はMacとCentOSだけでよいので、１行に２列あれば足りる。行のマイナス（−）をクリックする&lt;/li&gt;
&lt;li&gt;アプリケーションの割り当ての下にあるプラス（＋）ボタンをクリックし、VMware Fusionを選択する&lt;/li&gt;
&lt;li&gt;VMware Fusionの操作スペースを「操作スペース２」にする&lt;/li&gt;
&lt;li&gt;操作スペース間の切り替えに「^ 矢印キー」を選択する&lt;/li&gt;
&lt;/ol&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-sif9wLT5H0/SQXGfAX3A4I/AAAAAAAAAZM/yCL9H4E6je8/s1600-h/Expose%E3%81%A8Spaces%E8%A8%AD%E5%AE%9A.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 314px;" src="http://3.bp.blogspot.com/_-sif9wLT5H0/SQXGfAX3A4I/AAAAAAAAAZM/yCL9H4E6je8/s320/Expose%E3%81%A8Spaces%E8%A8%AD%E5%AE%9A.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5261829975630611330" /&gt;&lt;/a&gt;

&lt;p&gt;
これでCtrlキーを押しながら右または左矢印キーを押せば、
通常のMacアプリケーションが動作する操作スペース１とVMware Fusionが起動する操作スペース２が簡単に切り替えられる。
CentOSは常にフルスクリーンで動作させるようにすると、
MacとCentOSが一瞬で切り替わり非常に便利。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-762655425108487256?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/762655425108487256/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=762655425108487256' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/762655425108487256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/762655425108487256'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/10/spacesmacvmware-fusionlinuxcentos.html' title='Spacesを使ってMacとVMware Fusion上のLinux(CentOS)をすばやく切り替える'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-sif9wLT5H0/SQXGfAX3A4I/AAAAAAAAAZM/yCL9H4E6je8/s72-c/Expose%E3%81%A8Spaces%E8%A8%AD%E5%AE%9A.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-6075849461962599604</id><published>2008-10-27T22:36:00.003+09:00</published><updated>2008-10-27T22:41:28.879+09:00</updated><title type='text'>VMware Fusion 2にインストールしたLinux(CentOS)にVMware Toolsをインストール</title><content type='html'>&lt;p&gt;
タイトルそのまんま。
Mac上のVMで動くCentOS 5.2にシームレスにアクセスできるようにしたい。
作業手順は以下。
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;仮想マシン(CentOS)を起動&lt;/li&gt;
&lt;li&gt;起動が完了したら、Control-commandで一度仮想マシンを抜けて、
メニューから&lt;code&gt;仮想マシン&amp;gt;VMware Toolsのインストール&lt;/code&gt;を選択

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-sif9wLT5H0/SQXEnHxFHxI/AAAAAAAAAZE/pqwcr-3iAGk/s1600-h/vmwaretools%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 70px;" src="http://1.bp.blogspot.com/_-sif9wLT5H0/SQXEnHxFHxI/AAAAAAAAAZE/pqwcr-3iAGk/s320/vmwaretools%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5261827916031139602" /&gt;&lt;/a&gt;

&lt;/li&gt;
&lt;li&gt;CentOSに戻ると&lt;code&gt;/media/VMware Tools&lt;/code&gt;がマウントされているので、以下のようにしてインストールするファイルを取得・解凍（rootで作業）

&lt;pre class="prettyprint"&gt;
# cd /root
# tar xzf /media/VMware¥ Tools/VMwareTools-e.x.p-116369.tar.gz
&lt;/pre&gt;

VMware WorkstationでCentOS 5.2をインストールしたときはrpmがあった気がしたけど...
&lt;/li&gt;
&lt;li&gt;インストール

&lt;p&gt;
事前にkernel-headersとgccをインストールしておく。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# yum install kernel-headers gcc
&lt;/pre&gt;

インストールが完了したらVMware Toolsを以下のようにインストール。

&lt;pre class="prettyprint"&gt;
# cd /root/vmware-tools-distrib
# ll
合計 132
-r--r--r--  1 root root 108263  9月 11 10:34 FILES
lrwxrwxrwx  1 root root     13 10月 25 22:03 INSTALL -&amp;gt; ./doc/INSTALL
drwxr-xr-x  2 root root   4096  9月 11 10:34 bin
drwxr-xr-x  3 root root   4096  9月 11 10:34 doc
drwxr-xr-x  3 root root   4096  9月 11 10:34 etc
drwxr-xr-x  2 root root   4096  9月 11 10:34 installer
drwxr-xr-x 14 root root   4096  9月 11 10:34 lib
lrwxrwxrwx  1 root root     31 10月 25 22:03 vmware-install.pl -&amp;gt; ./bin/vmware-uninstall-tools.pl
[root@localhost vmware-tools-distrib]# ./vmware-install.pl 
Creating a new VMware Tools installer database using the tar4 format.

Installing VMware Tools.

In which directory do you want to install the binary files? 
[/usr/bin] &lt;code&gt;&lt;strong&gt;[ENTER]&lt;/strong&gt;&lt;/code&gt;

What is the directory that contains the init directories (rc0.d/ to rc6.d/)? 
[/etc/rc.d] &lt;code&gt;&lt;strong&gt;[ENTER]&lt;/strong&gt;&lt;/code&gt;

What is the directory that contains the init scripts? 
[/etc/rc.d/init.d] &lt;code&gt;&lt;strong&gt;[ENTER]&lt;/strong&gt;&lt;/code&gt;

In which directory do you want to install the daemon files? 
[/usr/sbin] &lt;code&gt;&lt;strong&gt;[ENTER]&lt;/strong&gt;&lt;/code&gt;

In which directory do you want to install the library files? 
[/usr/lib/vmware-tools] &lt;code&gt;&lt;strong&gt;[ENTER]&lt;/strong&gt;&lt;/code&gt;

The path "/usr/lib/vmware-tools" does not exist currently. This program is 
going to create it, including needed parent directories. Is this what you want?
[yes] &lt;code&gt;&lt;strong&gt;[ENTER]&lt;/strong&gt;&lt;/code&gt;

In which directory do you want to install the documentation files? 
[/usr/share/doc/vmware-tools] &lt;code&gt;&lt;strong&gt;[ENTER]&lt;/strong&gt;&lt;/code&gt;

The path "/usr/share/doc/vmware-tools" does not exist currently. This program 
is going to create it, including needed parent directories. Is this what you 
want? [yes] &lt;code&gt;&lt;strong&gt;[ENTER]&lt;/strong&gt;&lt;/code&gt;

The installation of VMware Tools e.x.p build-116369 for Linux completed 
successfully. You can decide to remove this software from your system at any 
time by invoking the following command: "/usr/bin/vmware-uninstall-tools.pl".

Before running VMware Tools for the first time, you need to configure it by 
invoking the following command: "/usr/bin/vmware-config-tools.pl". Do you want 
this program to invoke the command for you now? [yes] &lt;code&gt;&lt;strong&gt;[ENTER]&lt;/strong&gt;&lt;/code&gt;


Stopping VMware Tools services in the virtual machine:
   Guest operating system daemon:                          [  OK  ]
   Virtual Printing daemon:                                [  OK  ]
The bld-2.6.18-8.el5-i686smp-RHEL5 - vmmemctl module loads perfectly into the 
running kernel.

The bld-2.6.18-8.el5-i686smp-RHEL5 - vmhgfs module loads perfectly into the 
running kernel.

The bld-2.6.18-8.el5-i686smp-RHEL5 - vmxnet module loads perfectly into the 
running kernel.

The bld-2.6.18-8.el5-i686smp-RHEL5 - vmblock module loads perfectly into the 
running kernel.

[EXPERIMENTAL] The VMware FileSystem Sync Driver (vmsync) is a new feature that
creates backups of virtual machines. Please refer to the VMware Knowledge Base 
for more details on this capability. Do you wish to enable this feature? 
[no] &lt;code&gt;&lt;strong&gt;[ENTER]&lt;/strong&gt;&lt;/code&gt;

The bld-2.6.18-8.el5-i686smp-RHEL5 - vmci module loads perfectly into the 
running kernel.

The bld-2.6.18-8.el5-i686smp-RHEL5 - vsock module loads perfectly into the 
running kernel.



Detected X.org version 
X Window System Version 7.1.1
Release Date: 12 May 2006
? 7.1 : '0.0.0'.1
Build Operating System: Linux 2.6.18-53.1.14.el5PAE i686 Red Hat, Inc.
Current Operating System: Linux localhost.localdomain 2.6.18-92.el5 #1 SMP Tue 
Jun 10 18:49:47 EDT 2008 i686
Build Date: 21 June 2008
Build ID: xorg-x11-server 1.1.1-48.41.el5_2.1 
        Before reporting problems, check http://wiki.x.org
        to make sure that you have the latest version.
Module Loader present
.


Please choose one of the following display sizes that X will start with (1 - 
29):

[1]  "320x200"
[2]  "320x240"
[3]  "400x300"
[4]  "512x384"
[5]  "640x400"
[6]  "640x480"
[7]  "720x480"
[8]  "800x480"
[9]  "854x480"
[10]  "720x576"
[11]  "800x600"
[12]&lt; "1024x768"
[13]  "1280x720"
[14]  "1280x768"
[15]  "1152x864"
[16]  "1280x800"
[17]  "1366x768"
[18]  "1280x960"
[19]  "1440x900"
[20]  "1280x1024"
[21]  "1400x1050"
[22]  "1680x1050"
[23]  "1600x1200"
[24]  "1920x1080"
[25]  "1920x1200"
[26]  "1920x1440"
[27]  "2048x1536"
[28]  "2560x1600"
[29]  "2560x1920"
Please enter a number between 1 and 29:

[12] 16&lt;code&gt;&lt;strong&gt;[ENTER]&lt;/strong&gt;&lt;/code&gt;


X Window System Version 7.1.1
Release Date: 12 May 2006
X Protocol Version 11, Revision 0, Release 7.1.1
Build Operating System: Linux 2.6.18-53.1.14.el5PAE i686 Red Hat, Inc.
Current Operating System: Linux localhost.localdomain 2.6.18-92.el5 #1 SMP Tue Jun 10 18:49:47 EDT 2008 i686
Build Date: 21 June 2008
Build ID: xorg-x11-server 1.1.1-48.41.el5_2.1 
        Before reporting problems, check http://wiki.x.org
        to make sure that you have the latest version.
Module Loader present
Markers: (--) probed, (**) from config file, (==) default setting,
        (++) from command line, (!!) notice, (II) informational,
        (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(++) Log file: "/tmp/vmware-config0/XF86ConfigLog.21358", Time: Sat Oct 25 22:19:13 2008
(++) Using config file: "/tmp/vmware-config0/XF86Config.21358"

X is running fine with the new config file.

FreeFontPath: FPE "unix/:7100" refcount is 2, should be 1; fixing.
   Checking acpi hot plug                                  [  OK  ]
Starting VMware Tools services in the virtual machine:
   Switching to guest configuration:                       [  OK  ]
   Guest filesystem driver:                                [  OK  ]
   Mounting HGFS shares:                                   [失敗]
   Guest memory manager:                                   [  OK  ]
   Guest vmxnet fast network device:                       [  OK  ]
   VM communication interface:                             [  OK  ]
   VM communication interface socket family:               [  OK  ]
   Blocking file system:                                   [  OK  ]
   Guest operating system daemon:                          [  OK  ]
   Virtual Printing daemon:                                [  OK  ]

The configuration of VMware Tools e.x.p build-116369 for Linux for this running
kernel completed successfully.

You must restart your X session before any mouse or graphics changes take 
effect.

You can now run VMware Tools by invoking the following command: 
"/usr/bin/vmware-toolbox" during an X server session.

You will need to either manually start /usr/bin/vmware-user or log out and log 
back in to this desktop session to obtain the following features: guest 
resolution fit, drag and drop, and file and text copy/paste.  vmware-user is 
configured to automatically start at a graphical login, but that won't take 
effect until the next login.

To use the vmxnet driver, restart networking using the following commands: 
/etc/init.d/network stop
rmmod pcnet32
rmmod vmxnet
modprobe vmxnet
/etc/init.d/network start

If the virtual printer feature is enabled, you will need to restart the CUPS 
service to make use of this feature.

Enjoy,

--the VMware team

Found VMware Tools CDROM mounted at /media/VMware Tools. Ejecting device 
/dev/hdc ...
&lt;/pre&gt;

&lt;p&gt;
MacBookの解像度に合わせて[16]の"1280x800"を選択したが、
再起動後にCentOSでディスプレイの設定をしたところマウスポインタの位置がおかしくなってしまった。
再度vmware-config-tools.plを実行して[12]の"1024x768"を選択し直した。
フルスクリーン表示にすれば1280x800に自動的に合うので特に問題ない。
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;shutdown -r now&lt;/code&gt;を実行して再起動する。
&lt;code&gt;chkconfig --list | grep vmware&lt;/code&gt;を実行すると起動時に自動的にvmwareサービスが立ち上がるように設定されていることがわかる。
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
WindowsのVMware Server上にインストールしたCentOS 5.2では過去に失敗したけど、
VMware Fusionではうまくインストールできた。
次はSpacesを使ってMacの作業領域とCentOSの作業領域を簡単に切り替えられるように設定してみる。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-6075849461962599604?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/6075849461962599604/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=6075849461962599604' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/6075849461962599604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/6075849461962599604'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/10/vmware-fusion-2linuxcentosvmware-tools.html' title='VMware Fusion 2にインストールしたLinux(CentOS)にVMware Toolsをインストール'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-sif9wLT5H0/SQXEnHxFHxI/AAAAAAAAAZE/pqwcr-3iAGk/s72-c/vmwaretools%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-889203316882109882</id><published>2008-10-25T18:46:00.005+09:00</published><updated>2008-10-25T21:10:37.860+09:00</updated><title type='text'>MacBook起動後にやったことリスト</title><content type='html'>&lt;p&gt;
購入直後の状態から変更した点の一部をメモ。
&lt;/p&gt;

&lt;h4&gt;トラックパッドの設定&lt;/h4&gt;

&lt;p&gt;
感触がよくて感度もちょうどよい。
見た感じはちょっと大きすぎるんじゃないかと思ったけど、使ってみると大きい方がダンゼン使い勝手が良い。
こうやって文章を書いているときに手のひらの親指の腹がタッチしてしまってもそれでフォーカスが失われたりしないのでイライラしなくてすむ。
二本指のスクロール初めてつかった（いまさら）けどこれもまたべんりー。
&lt;/p&gt;

&lt;p&gt;
トラックパッドはどの部分でも押すことができるが、ちょっと固い。
あんまりしっかり押したくないので、「タップでクリック」を有効にした。
右クリックはCtrlキーを押しながらパッドを押せばよいが、それでは使いづらいので「セカンダリータップ」を有効にした。
これで日本指で軽くタップするだけで右クリックの代わりになる。
次にドラッグ＆ドロップ。トラックパッドを押し下げたまま指を移動させればドラッグ＆ドロップになるが、この操作は慣れない。
固めのトラックパッドを押したまま力を込めつつ指を移動させると壊しちゃいそうな感じがしてしまうからだろうか（そんなことでは壊れないだろうけど）。
基本的にパッドを押したくないので、「ドラッグ」も有効にした。
これで「タンタン」とタップして、２回目のタップで指を離さずに動かせばドラッグになる。
ただし、このままだと指を離しただけでドロップになってしまい、
移動距離が足りなくて意図しない場所に落としてしまうことがある。
これが嫌なので、指を離してもドロップされないようにさらに「ドラッグの維持」を有効にした。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-sif9wLT5H0/SQLtlhhzeFI/AAAAAAAAAY0/T5rpcZkArPM/s1600-h/%E3%83%88%E3%83%A9%E3%83%83%E3%82%AF%E3%83%91%E3%83%83%E3%83%89%E8%A8%AD%E5%AE%9A.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 162px;" src="http://2.bp.blogspot.com/_-sif9wLT5H0/SQLtlhhzeFI/AAAAAAAAAY0/T5rpcZkArPM/s200/%E3%83%88%E3%83%A9%E3%83%83%E3%82%AF%E3%83%91%E3%83%83%E3%83%89%E8%A8%AD%E5%AE%9A.png" alt="" id="BLOGGER_PHOTO_ID_5261028543633258578" border="0" /&gt;&lt;/a&gt;

&lt;p&gt;
アップルらしいhospitalityが感じられるのがタップなどの実際の操作映像。
言葉で説明されるより何倍もわかりやすい。
&lt;/p&gt;

&lt;h4&gt;キーボード&lt;/h4&gt;

&lt;p&gt;
キーは小さすぎるとタイプミスが増えるので、このぐらいがちょうどいい感じ。
CtrlキーがAの左にあるのもまたいい感じ。
斜めにキーを押し込んでもひっかかるような違和感はない。
一カ所だけ設定を変えたのはファンクションキー。
一番上の段のキーは特殊機能とファンクションキーが割り当てられていて、そのまま押すと特殊機能が、fnキーを押しながら押すとファンクションキーが機能する。
そのままだと日本語入力中にカタカナ変換しようとF7を押しても変換されない（fnキーを押しながらF7を押せばいいけど面倒）。
そんなわけで環境設定からキーボードとマウスを選び、「F1、F2などのすべてのキーを標準のファンクションキーとして使用」を有効にして、fnを押しながら操作したときの動作を逆にした。
&lt;/p&gt;

&lt;h4&gt;ソフトウェア&lt;/h4&gt;

&lt;p&gt;
とりあえず以下のソフトウェアをインストールした。
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;iWork '08&lt;/li&gt;
&lt;li&gt;VMware Fusion 2&lt;/li&gt;
&lt;li&gt;Firefox&lt;/li&gt;
&lt;li&gt;Opera&lt;/li&gt;
&lt;li&gt;Carbon Emacs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
設定が必要だったemacsのみちょっと設定を書く。
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;C-hでバックスペースにならないので、~/.emacs.elに&lt;code&gt;(global-set-key "\C-h" 'delete-backward-char)&lt;/code&gt;と書いて保存&lt;/li&gt;
&lt;li&gt;C-spaceでコピーを開始しようとするとSpotlightがキーイベントをとってしまうので、環境設定からSpotlightを開いて以下のように設定&lt;/li&gt;
&lt;/ul&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-sif9wLT5H0/SQLtxeAvuWI/AAAAAAAAAY8/CaPFtgDQJBo/s1600-h/spotlight%E8%A8%AD%E5%AE%9A.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 188px;" src="http://1.bp.blogspot.com/_-sif9wLT5H0/SQLtxeAvuWI/AAAAAAAAAY8/CaPFtgDQJBo/s200/spotlight%E8%A8%AD%E5%AE%9A.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5261028748847724898" /&gt;&lt;/a&gt;

&lt;p&gt;
やっぱりEmacs書きやすいなぁ。
viは嫌いじゃないけど、日本語が含まれるような文章を書くにはちょっとわずらわしい。
&lt;/p&gt;

&lt;h4&gt;あとやること&lt;/h4&gt;

&lt;p&gt;
まずメモリの増設。アップルストアに行って4GBに増やしてもらう。
iMac G5からのデータ移行はこれから。移行アシスタントを使ってみる。
MacPortsも入れる。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-889203316882109882?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/889203316882109882/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=889203316882109882' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/889203316882109882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/889203316882109882'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/10/macbook_25.html' title='MacBook起動後にやったことリスト'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-sif9wLT5H0/SQLtlhhzeFI/AAAAAAAAAY0/T5rpcZkArPM/s72-c/%E3%83%88%E3%83%A9%E3%83%83%E3%82%AF%E3%83%91%E3%83%83%E3%83%89%E8%A8%AD%E5%AE%9A.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-8691553295745703348</id><published>2008-10-25T11:51:00.002+09:00</published><updated>2008-10-25T11:58:01.369+09:00</updated><title type='text'>VMware Server上のLinux(CentOS)にHDD追加</title><content type='html'>&lt;p&gt;
VMware Server上で動かしていたCentOS5のHDD容量が8GBで足りなくなってきたので追加した。
&lt;/p&gt;

&lt;h4&gt;VMware ServerでHDDを追加&lt;/h4&gt;

&lt;p&gt;
まずゲストOSをシャットダウン。
CentOSなので&lt;code&gt;shutdown -h now&lt;/code&gt;を実行した。
終了後以下の手順でHDDを追加。
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;InventoryからHDDを追加したい仮想マシンを右クリックしてSettingsを選択&lt;/li&gt;
&lt;li&gt;HardwareタブのAddボタンをクリック&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Welcome to the Add Hardware Wizard&lt;/strong&gt;: 次へボタンをクリック&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hardware Type&lt;/strong&gt;: Hard Diskを選択して次へボタンをクリック&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Select a Disk&lt;/strong&gt;: Create a new virtual diskを選択して次へボタンをクリック&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Select a Disk Type&lt;/strong&gt;: この仮想マシンで使用しているHDDと同じタイプを選択して次へボタンをクリック。SCSI (Recommended)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Specify Disk Capacity&lt;/strong&gt;: Disk size(GB)を好きなサイズに設定する。
ディスクに余裕があればAllocate all disk space nowをチェック。
Split disk into 2GB filesはチェックしない。次へボタンをクリック&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Specify Disk File&lt;/strong&gt;: 好きなファイル名を指定。完了ボタンをクリックしてウィザードが終了し、HDDが追加される&lt;/li&gt;&lt;li&gt;Virtual Machine Settings画面のHardwareタブにHard Disk 3 (SCSI 0:2)が追加されているはず（実は２つめ。１回目ではSCSI :0:1が追加される）&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Linuxのパーティション設定&lt;/h4&gt;

&lt;p&gt;
仮想マシンを起動すると、以下のようにデバイスファイルが増えていることが分かる。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# cd /dev
# ls -l sd*
brw-r----- 1 root disk 8,  0 10月 25 10:38 sda
brw-r----- 1 root disk 8,  1 10月 25 10:39 sda1
brw-r----- 1 root disk 8,  2 10月 25 10:38 sda2
brw-r----- 1 root disk 8, 16 10月 25 10:38 sdb
brw-r----- 1 root disk 8, 17 10月 25 10:38 sdb1
brw-r----- 1 root disk 8, 32 10月 25 10:38 sdc
&lt;/pre&gt;

&lt;p&gt;
SCSI 0:1がsdbに、SCSI 0:2がsdcになっている（らしい）。
fdiskコマンドで中身を見てみると以下のようになっている。
（fdisk -lで表示した方がはやいかも）
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# fdisk /dev/sda

このディスクのシリンダ数は 1044 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)

コマンド (m でヘルプ): p

Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13      104391   83  Linux
/dev/sda2              14        1044     8281507+  8e  Linux LVM

コマンド (m でヘルプ): q

# fdisk /dev/sdc
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更は
メモリ内だけに残します。その後はもちろん以前の内容は修復不可能になります。

このディスクのシリンダ数は 1305 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

コマンド (m でヘルプ): p

Disk /dev/sdc: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System

コマンド (m でヘルプ): q
&lt;/pre&gt;

&lt;p&gt;
/dev/sdcのほうはpコマンドで表示してもなにも出てこない。
以下のようにしてパーティション設定を行う。
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;fdisk /dev/sdcを実行&lt;/li&gt;
&lt;li&gt;nコマンドで新たに領域を作成&lt;/li&gt;
&lt;li&gt;拡張または基本領域を聞かれるのでpをタイプ&lt;/li&gt;
&lt;li&gt;領域番号を聞かれるので1をタイプ&lt;/li&gt;
&lt;li&gt;最初シリンダ（First cylinder）を聞かれるのでそのままEnter&lt;/li&gt;
&lt;li&gt;終点シリンダまたは+サイズ...を聞かれるのでそのままEnter&lt;/li&gt;
&lt;li&gt;wコマンドで書き込み、fdiskを終了&lt;/li&gt;
&lt;li&gt;（fdisk /dev/sdcを実行してpコマンドで領域を確認）&lt;/li&gt;
&lt;/ol&gt;

&lt;pre class="prettyprint"&gt;
# fdisk /dev/sdc 
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更は
メモリ内だけに残します。その後はもちろん以前の内容は修復不可能になります。

このディスクのシリンダ数は 1305 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

コマンド (m でヘルプ): m&lt;strong&gt;[ENTER]&lt;/strong&gt;
コマンドの動作
   a   ブート可能フラグをつける
   b   bsd ディスクラベルを編集する
   c   dos 互換フラグをつける
   d   領域を削除する
   l   既知の領域タイプをリスト表示する
   m   このメニューを表示する
   n   新たに領域を作成する
   o   新たに空の DOS 領域テーブルを作成する
   p   領域テーブルを表示する
   q   変更を保存せずに終了する
   s   空の Sun ディスクラベルを作成する
   t   領域のシステム ID を変更する
   u   表示/項目ユニットを変更する
   v   領域テーブルを照合する
   w   テーブルをディスクに書き込み、終了する
   x   特別な機能 (エキスパート専用)

コマンド (m でヘルプ): n&lt;strong&gt;[ENTER]&lt;/strong&gt;
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p&lt;strong&gt;[ENTER]&lt;/strong&gt;
領域番号 (1-4): 1&lt;strong&gt;[ENTER]&lt;/strong&gt;
最初 シリンダ (1-1305, default 1): &lt;strong&gt;[ENTER]&lt;/strong&gt;
Using default value 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-1305, default 1305): &lt;strong&gt;[ENTER]&lt;/strong&gt;
Using default value 1305

コマンド (m でヘルプ): w&lt;strong&gt;[ENTER]&lt;/strong&gt;
領域テーブルは交換されました！

ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。

# fdisk /dev/sdc

このディスクのシリンダ数は 1305 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)

コマンド (m でヘルプ): p

Disk /dev/sdc: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/sdc1               1        1305    10482381   83  Linux

コマンド (m でヘルプ): q
&lt;/pre&gt;

&lt;h4&gt;フォーマット&lt;/h4&gt;

&lt;p&gt;
パーティションを設定したらディスクのフォーマットを行う。
一応現在のファイルシステムを確認。
&lt;p&gt;

&lt;pre class="prettyprint"&gt;
# df -T
Filesystem    Type   1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
              ext3    15518680  14073940    643668  96% /
/dev/sda1     ext3      101086     16749     79118  18% /boot
tmpfs        tmpfs      127812         0    127812   0% /dev/shm
&lt;/pre&gt;

&lt;p&gt;
ext3を使用していることが分かるので、追加するsdcもext3を使用する。
ext3でフォーマットするにはmkfsコマンドかmke2fsコマンドを使うとよい。
パラメータには作成されたデバイス/dev/sdc1を指定する。
&lt;p&gt;

&lt;pre class="prettyprint"&gt;
# mkfs -t ext3 /dev/sdc1
または
# mke2fs -j /dev/sdc1
&lt;/pre&gt;

&lt;pre class="prettyprint"&gt;
# mke2fs -j /dev/sdc1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
1310720 inodes, 2620595 blocks
131029 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2684354560
80 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
&lt;/pre&gt;

&lt;h4&gt;マウント&lt;/h4&gt;

&lt;p&gt;
最後にマウントしてディレクトリとしてアクセスできるように設定。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# cd /mnt/
# mkdir work
# mount /dev/sdc1 /mnt/work/
# df -T
Filesystem    Type   1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
              ext3    15518680  14073960    643648  96% /
/dev/sda1     ext3      101086     16749     79118  18% /boot
tmpfs        tmpfs      127812         0    127812   0% /dev/shm
/dev/sdc1     ext3    10317828    154236   9639476   2% /mnt/work
&lt;/pre&gt;

&lt;p&gt;
起動時に自動でマウントするように、/etc/fstabに以下の１行を追記。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
/dev/sdc1               /mnt/work               ext3    noatime         0 2
&lt;/pre&gt;

&lt;p&gt;
順番に
[1番目:マウントするブロックデバイス]
[2番目:マウントポイント]
[3番目:ファイルシステムの種類]
[4番目:マウントオプション]
[5番目:ファイルシステムをdumpする必要があるかどうか]
[6番目:システム起動時にfsckチェックを行うかどうか]
らしい。

5番目は不要なので0を指定。
6番目は0（チェックを行わない）、
1（ルートファイルシステムでチェックを行う）、
2（ルートシステム以外でチェックを行う）となっている。
&lt;/p&gt;

&lt;p&gt;
再起動する。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
# shutdown -r now
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-8691553295745703348?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/8691553295745703348/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=8691553295745703348' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/8691553295745703348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/8691553295745703348'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/10/vmware-serverlinuxcentoshdd.html' title='VMware Server上のLinux(CentOS)にHDD追加'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-4737763947607855701</id><published>2008-10-24T01:08:00.005+09:00</published><updated>2008-10-24T01:29:14.376+09:00</updated><title type='text'>MacBook購入</title><content type='html'>&lt;p&gt;新しいMacBook(mb467)を購入した！&lt;/p&gt;

&lt;p&gt;
遡ること４年ほど前、先輩にすすめられて初めて買ったMacはiMac G5だった。Black Eyed Peasが紹介ムービーに出ていて、Let's get startedという曲のPVもカッコよかった。ディスプレイと本体が一緒になっている合理的なデザインがすごく新しいものに見えた。
&lt;/p&gt;

&lt;p&gt;
実際それはカッコよかったし、当時としては満足いく速度で動作していた。が、最近はブラウザの起動でさえファンがうなり声をあげ、熱気を出すようになった。ウェブアプリ開発者としてはウェブサーバとDBとEclipseのような統合開発環境ぐらいは同時に起動したいのだが、それも難しい。次はかさばらないMacBookを買おうと心に決め、モデルチェンジを待っていたというわけだ。
&lt;/p&gt;

&lt;p&gt;
今回購入したMacBookの構成は以下。
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; MacBook 13インチ アルミニウム
&lt;ul&gt;&lt;li&gt;製品番号: Z0FV&lt;/li&gt;&lt;li&gt;2.4GHz Intel Core 2 Duo&lt;/li&gt;&lt;li&gt;4GB 1066MHz DDR3 SDRAM - 2x2GB&lt;/li&gt;&lt;li&gt;250GBシリアルATAドライブ@ 5400 rpm&lt;/li&gt;&lt;li&gt;SuperDrive 8x (DVD±R DL/DVD±RW/CD-RW)&lt;/li&gt;&lt;li&gt;バックライトキーボード (JIS) + 製品マニュアル&lt;/li&gt;&lt;li&gt;iWork '08（プリインストール）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AppleCare Protection Plan for MacBook Air/MacBook&lt;/li&gt;
&lt;li&gt;MobileMe&lt;/li&gt;
&lt;li&gt;VMware Fusion 2.0 for Mac&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;メモリを2GBから4GBに増やして、VMware Fusionを購入。残念ながら今日はメモリを4GBに増設できないので後日アップルストアを再訪問することになったけど、親切に対応してくれたショップのお姉さんに感謝。&lt;/p&gt;&lt;p&gt;ニヤニヤしながら撮った写真はこちら。&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-sif9wLT5H0/SQCk9p-XPrI/AAAAAAAAAYc/aUInP8mYJ3I/s1600-h/IMGP1501.JPG"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_-sif9wLT5H0/SQCk9p-XPrI/AAAAAAAAAYc/aUInP8mYJ3I/s200/IMGP1501.JPG" alt="" id="BLOGGER_PHOTO_ID_5260385743915138738" border="0" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-sif9wLT5H0/SQClLik1T-I/AAAAAAAAAYk/qAYoEOYg8_c/s1600-h/IMGP1502.JPG"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_-sif9wLT5H0/SQClLik1T-I/AAAAAAAAAYk/qAYoEOYg8_c/s200/IMGP1502.JPG" alt="" id="BLOGGER_PHOTO_ID_5260385982447177698" border="0" /&gt;&lt;/a&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_-sif9wLT5H0/SQClXejIaTI/AAAAAAAAAYs/e1DZsSqObSs/s1600-h/IMGP1503.JPG"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_-sif9wLT5H0/SQClXejIaTI/AAAAAAAAAYs/e1DZsSqObSs/s200/IMGP1503.JPG" alt="" id="BLOGGER_PHOTO_ID_5260386187524729138" border="0" /&gt;&lt;/a&gt;

&lt;p&gt;
いまアプリケーションなどをインストールしながら触ってみた感じでは、トラックパッドの感じが非常によい。ただし個人的にはちょっと設定の変更は必要。キートップの沈み方も違和感がなく、キーが小さすぎないのがうれしい。細かい点はまた次回。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-4737763947607855701?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/4737763947607855701/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=4737763947607855701' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/4737763947607855701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/4737763947607855701'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/10/macbook_24.html' title='MacBook購入'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_-sif9wLT5H0/SQCk9p-XPrI/AAAAAAAAAYc/aUInP8mYJ3I/s72-c/IMGP1501.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-4053280950424431111</id><published>2008-10-21T13:30:00.001+09:00</published><updated>2008-10-22T09:42:32.042+09:00</updated><title type='text'>PHPの終了タグより後にある空白を削除する</title><content type='html'>&lt;p&gt;
PHPでは&amp;lt;?phpから?&amp;gt;までがPHPスクリプトとして処理され、
この開始・終了タグに含まれない部分はそのまま出力される。
このとき?&amp;gt;より後に余分な改行や空白があるとそれが出力されてしまい、
処理がおかしくなる場合（特にファイルダウンロード処理など）がある。
別に?&amp;gt;はなくても正しく動くので取ってしまえばいいのだけど、
大がかりに変更を入れるのも好ましくない。
そんなわけで余計な空白のあるファイルのみ探して手動で変更することにした。
&lt;/p&gt;

&lt;p&gt;
以下のようなperlスクリプトを作成した。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
#!/usr/bin/perl
# 終了タグ「?&amp;gt;」の後に空白または改行が余計に挿入されていないかチェックする

use strict;
use warnings;

# 検索ディレクトリ
my $base_dir = "/path/to/dir";

# 対象となるディレクトリから拡張子が.phpのファイルをすべて取得
open(FIND, "find $base_dir -name '*.php' |");

while (&amp;lt;FIND&amp;gt;)
{
    # それぞれの.phpファイルに対して「?&amp;gt;」からファイル末尾までをsedコマンドで取得
    open(SED, "sed -n '/?&amp;gt;/,/^END/p' $_ |");
    my @result = &amp;lt;SED&amp;gt;;

    # sedで取得した結果の行数が0以外の場合は余計な文字が入っていると判断できる
    if ($#result != 0)
    {
        # ファイル名表示
        print $#result,"\t",$_;
    }
}
&lt;/pre&gt;

&lt;p&gt;
キモはsed。grepでは改行を含んだ検索ができないが、
sed -n '/AAA/,/BBB/p'でAAAからBBBまでの範囲を取得できる。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-4053280950424431111?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/4053280950424431111/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=4053280950424431111' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/4053280950424431111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/4053280950424431111'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/10/php.html' title='PHPの終了タグより後にある空白を削除する'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-7095738302635467762</id><published>2008-09-30T19:22:00.001+09:00</published><updated>2008-09-30T19:25:57.740+09:00</updated><title type='text'>HDDのローレベルフォーマットに挑戦</title><content type='html'>&lt;p&gt;
古いPCを破棄する前にHDDをきれいにしようという試み。
参照したのは以下。
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.dtpwiki.jp/dtp/2004/09/hdd.html"&gt;M.C.P.C.: HDDをローレベルフォーマットする&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hdd.iemoto.org/hgst_002.html"&gt;Drive Fitness Test HGST ハードディスク 診断&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.seagate.com/ww/v/index.jsp?locale=ja-JP&amp;name=DiscWizard&amp;vgnextoid=fd42e92f955ce010VgnVCM100000dd04090aRCRD"&gt;Seagate Technology - DiscWizard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
まず&lt;a href="http://www.hitachigst.com/portal/site/jp/"&gt;日立グローバルストレージテクノロジーズ&lt;/a&gt;にアクセスして、
サポート＞ダウンロードからDrive Fitness TestのCD imageをダウンロード。
DeepBurnerを使ってISOファイルをCDに書き込みしようとしたが失敗したので（なんで？）、
Mac OS XのディスクユーティリティからISOファイルをCDに書き込み。
&lt;/p&gt;

&lt;p&gt;
削除するPCをCDからブートできるようにBIOS設定してCD入れて起動。
UtilitiesのErase Diskを実行したが、このHDDは対応していないみたいなメッセージが出て削除できず...orz
&lt;/p&gt;

&lt;p&gt;
しばしの脱力感の後、今度はSeagate TechnologyのDiscWizardに挑戦。
サイトからインストーラをダウンロードし、まずWindows PCにインストール。
（要PC再起動）
正しくインストールされたらSeagate DiscWizardを起動し、ツールのブータブルメディアの作成を選択。
手順に従ってCD-Rを作成する。
&lt;/p&gt;

&lt;p&gt;
ブータブルメディア（CD-R）ができたら再度削除するPCをCDからブートし、
無事にHDDの削除を実行。
せっかく作ったメディアは二つとも保存しておこう。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-7095738302635467762?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/7095738302635467762/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=7095738302635467762' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/7095738302635467762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/7095738302635467762'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/09/hdd.html' title='HDDのローレベルフォーマットに挑戦'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-7997714434719803963</id><published>2008-09-19T11:48:00.003+09:00</published><updated>2008-09-19T11:50:48.999+09:00</updated><title type='text'>シェルのループ</title><content type='html'>&lt;p&gt;
シェルの配列使うなんて何年ぶりだ...大学３年のときぶりぐらいかも。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
#!/bin/sh

# 配列
list=(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)

for i in "${list[@]}"; do
        echo $i
done
&lt;/pre&gt;

&lt;p&gt;
${list[@]}のところは１週間後に思い出す自信がないなぁ。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-7997714434719803963?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/7997714434719803963/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=7997714434719803963' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/7997714434719803963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/7997714434719803963'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/09/blog-post.html' title='シェルのループ'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-1198877435907022754</id><published>2008-09-09T08:20:00.004+09:00</published><updated>2008-09-09T12:59:23.528+09:00</updated><title type='text'>Macでカーオーディオ用のMP3ディスクを作る（スクリプト）</title><content type='html'>&lt;p&gt;
ファイル名の文字コードも変更しないとなーと思って作ったPerlスクリプト。
結局ファイル名の文字コード変更処理がうまくいかなかったのだけど、
久しぶりにまとまった量のPerlを書いていい勉強になったので晒しておく。
&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
#!/usr/bin/perl

use strict;
use warnings;

use utf8;
use Encode;
use Encode::Guess;
use Unicode::Normalize;

# requires one parameter(target directory)
die("Usage: perl ./convert_filename.pl [directory]\n") if $#ARGV != 0;
die("Usage: perl ./convert_filename.pl [directory]\n") unless -d $ARGV[0];

# begin preview
&amp;amp;convert_filename_recursive($ARGV[0], 0);

# dialog
while (1)
{
        print "Convert? [Y/N]: ";

        my $yesno = &amp;lt;STDIN&amp;gt;;
        chomp($yesno);

        if ($yesno eq 'Y')
        {
                &amp;amp;convert_filename_recursive($ARGV[0], 1);
                exit;
        }
        elsif ($yesno eq 'N')
        {
                exit;
        }
        else
        {
                print "Invalid Input.\n";
                next;
        }
}

sub convert_filename_recursive {
        my $dir = $_[0];
        my $execute_flag = $_[1];

        if (!(-d $dir)) {
                return;
        }

        # open directory
        opendir(DIR, $dir);
        my @file_list = readdir(DIR);
        closedir(DIR);

        foreach (@file_list)
        {
                # skip [.], [..] and hidden files
                next if /^\./;

                my $filepath = Encode::decode("utf-8", $dir . "/" . $_);
                my $filename = Encode::decode("utf-8", $_);
                $filepath = Unicode::Normalize::NFC($filepath);
                $filename = Unicode::Normalize::NFC($filename);

                # printf "%s\n", Encode::encode("utf-8", $filepath);

                # process recursively if $_ is directory
                if (-d $dir . "/" . $_)
                {
                        &amp;amp;convert_filename_recursive($dir . "/" . $_, $execute_flag);
                }

                if ($execute_flag)
                {
                        chdir($dir);

                        system "/bin/mv", $_, Encode::encode("SJIS", $filename);//error
                        my $result = $? &amp;gt;&amp;gt; 8;
                        printf("rename...%s: %s\n", $result ? "o" : "x" , Encode::encode("utf-8", $filepath));
                }
                else
                {
                        printf("%s\n", Encode::encode("utf-8", $filepath));
                }
        }
}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-1198877435907022754?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/1198877435907022754/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=1198877435907022754' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1198877435907022754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1198877435907022754'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/09/macmp3_09.html' title='Macでカーオーディオ用のMP3ディスクを作る（スクリプト）'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-2258091431667056479</id><published>2008-09-08T13:49:00.002+09:00</published><updated>2008-09-08T18:30:20.731+09:00</updated><title type='text'>OperaからGoogle Bookmarksにブックマークを追加するBookmarklet</title><content type='html'>&lt;p&gt;
ブックマークはすべてGoogle Bookmarksにまとめてしまいたいけど、
Operaに対応したGoogleツールバーがないからURLをコピーしてFirefoxに貼り付...
なんて非SE的な。
Opera用のBookmarklet書きました。
&lt;/p&gt;

&lt;p&gt;
まず新規ブックマークを作成。
「名前」には「Googleブックマークに追加」とでも書いておく。
保存先やパーソナルバーに表示する・しないは自由に。
「アドレス」には以下を指定。
&lt;/p&gt;

&lt;pre class="code"&gt;
javascript:var _e=encodeURIComponent;location.href='http://www.google.com/bookmarks/mark?op=add&amp;hl=ja&amp;bkmk='+_e(location.href)+'&amp;title='+_e(document.title);
&lt;/pre&gt;

&lt;p&gt;
「http://www.google.com/bookmarks/mark」というアドレスにオプションをつけると自動的にフィールドに値を入れた状態で画面が開くらしい。
op=addは追加のオペレーションの意だ、きっと。
bkmkはブックマークするURLかな？
titleがページのタイトルっぽい。
それぞれエンコードして渡しているだけ。
Googleのどこかのサイトにはログインしていることが必要。
なんか３分クッキングみたいで楽しい。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-2258091431667056479?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/2258091431667056479/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=2258091431667056479' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2258091431667056479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2258091431667056479'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/09/operagoogle-bookmarksbookmarklet.html' title='OperaからGoogle Bookmarksにブックマークを追加するBookmarklet'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-5069613898933714871</id><published>2008-09-06T21:01:00.002+09:00</published><updated>2008-09-09T00:04:55.913+09:00</updated><title type='text'>Macでカーオーディオ用のMP3ディスクを作る</title><content type='html'>&lt;p&gt;
トヨタ純正DVDナビゲーション「ND3T-W55」で聞くことのできるMP3のディスクをMac OS X 10.3（泣）で作るテスト。オーディオ取り扱い説明書P.76付近を参照して対応している規格などを確認。
&lt;/p&gt;

&lt;h4&gt;オーディオの規格&lt;/h4&gt;

&lt;pre class="code"&gt;
○再生可能なMP3ファイルの規格について

対応規格：MPEG Audio レイヤ３（=MPEG1 Audio Layer III）
サンプリング周波数（kHz）：44.1、48
固定ビットレート（kbps）：64〜320
　※フリーフォーマットには対応していません。
　※MPEG1,2でビットレートが異なります。
対応チャンネルモード：ステレオ、モノラル、デュアル、ジョイント
&lt;/pre&gt;

&lt;pre class="code"&gt;
○ID3タグ／WMAタグについて

本機はID3v.1.0、ID3v1.1のID3タグに対応しています。
（Ver 2.xには対応していません）
日本語に対応していますが、文字コードはシフトJISで書き込んでください。
それ以外の文字コードで書き込むと文字化けすることがあります。

（WMAタグは省略）
&lt;/pre&gt;

&lt;p&gt;
ほかにはファイルフォーマットはROMEOまたはJOLIET形式を使えとのこと。はいはいー。
&lt;/p&gt;

&lt;h4&gt;iTunesで音楽ファイルを作成する&lt;/h4&gt;

&lt;p&gt;
市販の音楽CDから取り込む場合は、iTunesの環境設定＞詳細＞読み込みの読み込み方法で「MP3エンコーダ」を選択してから読み込み。
すでに取り込んであるファイルをMP3に変換するには、
エンコーダを同じくMP3エンコーダに設定した状態でファイルを右クリックして「選択項目をMP3に変換」する。
設定を変更しなければビットレートは160kbpsになっているので、ビットレートはいじらなくてもよい。
ただしID3タグのバージョンが2.2なのでこれは変更の必要あり。
しかしiTunesではID3タグ情報を変更せず、別のツーツを使用する。
&lt;/p&gt;

&lt;h4&gt;ID3TagEditでID3タグ情報を変更する&lt;/h4&gt;

&lt;p&gt;
まず&lt;a href="http://www.ne.jp/asahi/techno/ostra/down/down.html"&gt;ID3TagEdit 2.0&lt;/a&gt;をダウンロード。
解凍して起動してもウィンドウは開かないので、メニューからFile＞Newを選択。
空のウィンドウが開くので、ここにMP3ファイルをフォルダごとドラッグ＆ドロップ。
ただし、MP3ファイルは上書きされるので、iTunesの音楽が格納されているフォルダのファイルをそのまま突っ込まずにコピーしたものを用いた方がよい。
（iTunesのファイルをコピーせずそのまま上書きしたらiTunesで正しく読めなくなった）
&lt;/p&gt;

&lt;p&gt;
フォルダをドラッグ＆ドロップするとファイルの一覧が表示される。
Ctrl-Aですべてのファイルに対して設定を行うダイアログを表示して、
Tag Versionをv1.1に、Target EncodingをShift_JISに変更する。
正しく変更したらFile＞Saveで変更を保存する。
&lt;/p&gt;

&lt;p&gt;
と、ここまでの手順でCD6枚分のMP3をアルバムごとフォルダに分けてそのままCDに焼いたところ、
問題なく再生できた。
ファイル名をShift_JISに変えていないにもかかわらず、ファイル名も化けていない。
うーんいいのかなー。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-5069613898933714871?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/5069613898933714871/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=5069613898933714871' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/5069613898933714871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/5069613898933714871'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/09/macmp3.html' title='Macでカーオーディオ用のMP3ディスクを作る'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-3805073718141026254</id><published>2008-09-05T13:19:00.002+09:00</published><updated>2008-09-05T13:25:39.495+09:00</updated><title type='text'>はしご高（髙）や立ち崎（﨑）をJIS基本漢字（JIS X 0208）に変換するマップ作成の手順</title><content type='html'>&lt;p&gt;
以下黙々と手順のみ列挙。
正確な内容ではありませんよう。
&lt;/p&gt;

&lt;h4&gt;文字コード表の入手&lt;/h4&gt;

&lt;p&gt;
&lt;a href="http://www.supee.jp/chrc/"&gt;「文字コード超研究」という書籍のサポートページ&lt;/a&gt;から文字コード表をダウンロード。
wincode2.zipを解凍する。wincode2.txt（文字コードはSJIS）が出てくる。
&lt;/p&gt;

&lt;h4&gt;変換が必要な区のピックアップ&lt;/h4&gt;

&lt;p&gt;
wincode2.txtから&lt;a href="http://www.asahi-net.or.jp/~ax2s-kmtn/ref/mdc.html"&gt;Windowsの機種依存文字&lt;/a&gt;を参考にして機種依存する文字をピックアップ。
例えば13区、89区、90区、91区、92区、115区、116区、117区、118区、119区。
この区に該当する行のみを残し、別ファイルとして保存（special_chars.txtとする）
&lt;/p&gt;

&lt;h4&gt;マップ作成&lt;/h4&gt;

&lt;p&gt;
そもそも今回の目的は、mbstring.internal_encodingがUTF-8の環境で携帯向けにSJIS-winに文字コードを変えて出力した場合、
機種依存文字も正しく変換されるんだけど、携帯自体が機種依存文字扱えない、という現象への対処。
SJIS-winに変換されたあとに文字を置き換えてもいいけど、
できればソースコード自体はUTF-8で記述したいので、
special_chars.txtはUTF-8で保存しておいて、UTF-8→SJIS変換前に処理を行うためのPHPコードを作ろうと思う。
（文字コードの変換にはサクラエディタを使った）
&lt;/p&gt;

&lt;p&gt;
special_chars.txtのデータを元にPHPの配列を生成。
&lt;/p&gt;

&lt;pre class="code"&gt;
&amp;lt;?php
$line_list = file("special_chars.txt");

print("\$map = array(\n");

foreach ($line_list as $line)
{
    $items = preg_split('/\s+/', $line);
   
    if (7 &lt; count($items) &amp;amp;&amp;amp; $items[6] != "・")
    {
        printf("\t'%s' =&gt; '%s',\n", $items[6], "□");
    }
}

print(");\n");
&lt;/pre&gt;

&lt;p&gt;
変換後の文字はとりあえず全部「□」で統一。
後は手動で変換後の文字を入れ込んでいく、と。
（とりあえず13区全部と、名前でよく使用される機種依存文字、よく使う外字などのみを入れてみた）
変換マップと実行サンプルは以下のような感じ。
&lt;/p&gt;

&lt;pre class="code"&gt;
&amp;lt;?php
$map = array(
    //13区
    '①' =&gt; '１',
    '②' =&gt; '２',
    '③' =&gt; '３',
    '④' =&gt; '４',
    '⑤' =&gt; '５',
    '⑥' =&gt; '６',
    '⑦' =&gt; '７',
    '⑧' =&gt; '８',
    '⑨' =&gt; '９',
    '⑩' =&gt; '10',
    '⑪' =&gt; '11',
    '⑫' =&gt; '12',
    '⑬' =&gt; '13',
    '⑭' =&gt; '14',
    '⑮' =&gt; '15',
    '⑯' =&gt; '16',
    '⑰' =&gt; '17',
    '⑱' =&gt; '18',
    '⑲' =&gt; '19',
    '⑳' =&gt; '20',
    'Ⅰ' =&gt; 'I',
    'Ⅱ' =&gt; 'II',
    'Ⅲ' =&gt; 'III',
    'Ⅳ' =&gt; 'IV',
    'Ⅴ' =&gt; 'V',
    'Ⅵ' =&gt; 'VI',
    'Ⅶ' =&gt; 'VII',
    'Ⅷ' =&gt; 'VIII',
    'Ⅸ' =&gt; 'IX',
    'Ⅹ' =&gt; 'X',
    '㍉' =&gt; 'ミリ',
    '㌔' =&gt; 'キロ',
    '㌢' =&gt; 'センチ',
    '㍍' =&gt; 'メートル',
    '㌘' =&gt; 'グラム',
    '㌧' =&gt; 'トン',
    '㌃' =&gt; 'アール',
    '㌶' =&gt; 'ヘクタール',
    '㍑' =&gt; 'リットル',
    '㍗' =&gt; 'ワット',
    '㌍' =&gt; 'カロリー',
    '㌦' =&gt; 'ドル',
    '㌣' =&gt; 'セント',
    '㌫' =&gt; 'パーセント',
    '㍊' =&gt; 'ミリバール',
    '㌻' =&gt; 'ページ',
    '㎜' =&gt; 'mm',
    '㎝' =&gt; 'cm',
    '㎞' =&gt; 'km',
    '㎎' =&gt; 'mg',
    '㎏' =&gt; 'kg',
    '㏄' =&gt; 'cc',
    '㎡' =&gt; 'm2',
    '㍻' =&gt; '平成',
    '〝' =&gt; '"',
    '〟' =&gt; '"',
    '№' =&gt; 'No.',
    '㏍' =&gt; 'KK',
    '℡' =&gt; 'TEL',
    '㊤' =&gt; '上',
    '㊥' =&gt; '中',
    '㊦' =&gt; '下',
    '㊧' =&gt; '左',
    '㊨' =&gt; '右',
    '㈱' =&gt; '(株)',
    '㈲' =&gt; '(有)',
    '㈹' =&gt; '(代)',
    '㍾' =&gt; '明治',
    '㍽' =&gt; '大正',
    '㍼' =&gt; '昭和',
    '≒' =&gt; '□',
    '≡' =&gt; '□',
    '∫' =&gt; '□',
    '∮' =&gt; '□',
    '∑' =&gt; '□',
    '√' =&gt; '□',
    '⊥' =&gt; '□',
    '∠' =&gt; '□',
    '∟' =&gt; '□',
    '⊿' =&gt; '□',
    '∵' =&gt; '□',
    '∩' =&gt; '□',
    '∪' =&gt; '□',
   
    //89区
    '纊' =&gt; '□',
    '褜' =&gt; '□',
    '鍈' =&gt; '□',
    '銈' =&gt; '□',
    '蓜' =&gt; '□',
    '俉' =&gt; '□',
    '炻' =&gt; '□',
    '昱' =&gt; '□',
    '棈' =&gt; '□',
    '鋹' =&gt; '□',
    '曻' =&gt; '□',
    '彅' =&gt; '□',
    '丨' =&gt; '□',
    '仡' =&gt; '□',
    '仼' =&gt; '□',
    '伀' =&gt; '□',
    '伃' =&gt; '□',
    '伹' =&gt; '□',
    '佖' =&gt; '□',
    '侒' =&gt; '□',
    '侊' =&gt; '□',
    '侚' =&gt; '□',
    '侔' =&gt; '□',
    '俍' =&gt; '□',
    '偀' =&gt; '□',
    '倢' =&gt; '□',
    '俿' =&gt; '□',
    '倞' =&gt; '□',
    '偆' =&gt; '□',
    '偰' =&gt; '□',
    '偂' =&gt; '□',
    '傔' =&gt; '□',
    '僴' =&gt; '□',
    '僘' =&gt; '□',
    '兊' =&gt; '□',
    '兤' =&gt; '□',
    '冝' =&gt; '□',
    '冾' =&gt; '□',
    '凬' =&gt; '□',
    '刕' =&gt; '□',
    '劜' =&gt; '□',
    '劦' =&gt; '□',
    '勀' =&gt; '□',
    '勛' =&gt; '□',
    '匀' =&gt; '□',
    '匇' =&gt; '□',
    '匤' =&gt; '□',
    '卲' =&gt; '□',
    '厓' =&gt; '□',
    '厲' =&gt; '□',
    '叝' =&gt; '□',
    '﨎' =&gt; '□',
    '咜' =&gt; '□',
    '咊' =&gt; '□',
    '咩' =&gt; '□',
    '哿' =&gt; '□',
    '喆' =&gt; '□',
    '坙' =&gt; '□',
    '坥' =&gt; '□',
    '垬' =&gt; '□',
    '埈' =&gt; '□',
    '埇' =&gt; '□',
    '﨏' =&gt; '□',
    '塚' =&gt; '□',
    '增' =&gt; '□',
    '墲' =&gt; '□',
    '夋' =&gt; '□',
    '奓' =&gt; '□',
    '奛' =&gt; '□',
    '奝' =&gt; '□',
    '奣' =&gt; '□',
    '妤' =&gt; '□',
    '妺' =&gt; '□',
    '孖' =&gt; '□',
    '寀' =&gt; '□',
    '甯' =&gt; '□',
    '寘' =&gt; '□',
    '寬' =&gt; '□',
    '尞' =&gt; '□',
    '岦' =&gt; '□',
    '岺' =&gt; '□',
    '峵' =&gt; '□',
    '崧' =&gt; '□',
    '嵓' =&gt; '□',
    '﨑' =&gt; '崎',
    '嵂' =&gt; '□',
    '嵭' =&gt; '□',
    '嶸' =&gt; '□',
    '嶹' =&gt; '□',
    '巐' =&gt; '□',
    '弡' =&gt; '□',
    '弴' =&gt; '□',
    '彧' =&gt; '□',
    '德' =&gt; '□',
   
    //90区
    '忞' =&gt; '□',
    '恝' =&gt; '□',
    '悅' =&gt; '□',
    '悊' =&gt; '□',
    '惞' =&gt; '□',
    '惕' =&gt; '□',
    '愠' =&gt; '□',
    '惲' =&gt; '□',
    '愑' =&gt; '□',
    '愷' =&gt; '□',
    '愰' =&gt; '□',
    '憘' =&gt; '□',
    '戓' =&gt; '□',
    '抦' =&gt; '□',
    '揵' =&gt; '□',
    '摠' =&gt; '□',
    '撝' =&gt; '□',
    '擎' =&gt; '□',
    '敎' =&gt; '□',
    '昀' =&gt; '□',
    '昕' =&gt; '□',
    '昻' =&gt; '□',
    '昉' =&gt; '□',
    '昮' =&gt; '□',
    '昞' =&gt; '□',
    '昤' =&gt; '□',
    '晥' =&gt; '□',
    '晗' =&gt; '□',
    '晙' =&gt; '□',
    '晴' =&gt; '□',
    '晳' =&gt; '□',
    '暙' =&gt; '□',
    '暠' =&gt; '□',
    '暲' =&gt; '□',
    '暿' =&gt; '□',
    '曺' =&gt; '□',
    '朎' =&gt; '□',
    '朗' =&gt; '□',
    '杦' =&gt; '□',
    '枻' =&gt; '□',
    '桒' =&gt; '□',
    '柀' =&gt; '□',
    '栁' =&gt; '□',
    '桄' =&gt; '□',
    '棏' =&gt; '□',
    '﨓' =&gt; '□',
    '楨' =&gt; '□',
    '﨔' =&gt; '□',
    '榘' =&gt; '□',
    '槢' =&gt; '□',
    '樰' =&gt; '□',
    '橫' =&gt; '□',
    '橆' =&gt; '□',
    '橳' =&gt; '□',
    '橾' =&gt; '□',
    '櫢' =&gt; '□',
    '櫤' =&gt; '□',
    '毖' =&gt; '□',
    '氿' =&gt; '□',
    '汜' =&gt; '□',
    '沆' =&gt; '□',
    '汯' =&gt; '□',
    '泚' =&gt; '□',
    '洄' =&gt; '□',
    '涇' =&gt; '□',
    '浯' =&gt; '□',
    '涖' =&gt; '□',
    '涬' =&gt; '□',
    '淏' =&gt; '□',
    '淸' =&gt; '□',
    '淲' =&gt; '□',
    '淼' =&gt; '□',
    '渹' =&gt; '□',
    '湜' =&gt; '□',
    '渧' =&gt; '□',
    '渼' =&gt; '□',
    '溿' =&gt; '□',
    '澈' =&gt; '□',
    '澵' =&gt; '□',
    '濵' =&gt; '□',
    '瀅' =&gt; '□',
    '瀇' =&gt; '□',
    '瀨' =&gt; '□',
    '炅' =&gt; '□',
    '炫' =&gt; '□',
    '焏' =&gt; '□',
    '焄' =&gt; '□',
    '煜' =&gt; '□',
    '煆' =&gt; '□',
    '煇' =&gt; '□',
    '凞' =&gt; '□',
    '燁' =&gt; '□',
    '燾' =&gt; '□',
    '犱' =&gt; '□',
   
    //91区
    '犾' =&gt; '□',
    '猤' =&gt; '□',
    '猪' =&gt; '□',
    '獷' =&gt; '□',
    '玽' =&gt; '□',
    '珉' =&gt; '□',
    '珖' =&gt; '□',
    '珣' =&gt; '□',
    '珒' =&gt; '□',
    '琇' =&gt; '□',
    '珵' =&gt; '□',
    '琦' =&gt; '□',
    '琪' =&gt; '□',
    '琩' =&gt; '□',
    '琮' =&gt; '□',
    '瑢' =&gt; '□',
    '璉' =&gt; '□',
    '璟' =&gt; '□',
    '甁' =&gt; '□',
    '畯' =&gt; '□',
    '皂' =&gt; '□',
    '皜' =&gt; '□',
    '皞' =&gt; '□',
    '皛' =&gt; '□',
    '皦' =&gt; '□',
    '益' =&gt; '□',
    '睆' =&gt; '□',
    '劯' =&gt; '□',
    '砡' =&gt; '□',
    '硎' =&gt; '□',
    '硤' =&gt; '□',
    '硺' =&gt; '□',
    '礰' =&gt; '□',
    '礼' =&gt; '□',
    '神' =&gt; '□',
    '祥' =&gt; '□',
    '禔' =&gt; '□',
    '福' =&gt; '□',
    '禛' =&gt; '□',
    '竑' =&gt; '□',
    '竧' =&gt; '□',
    '靖' =&gt; '□',
    '竫' =&gt; '□',
    '箞' =&gt; '□',
    '精' =&gt; '□',
    '絈' =&gt; '□',
    '絜' =&gt; '□',
    '綷' =&gt; '□',
    '綠' =&gt; '□',
    '緖' =&gt; '□',
    '繒' =&gt; '□',
    '罇' =&gt; '□',
    '羡' =&gt; '□',
    '羽' =&gt; '□',
    '茁' =&gt; '□',
    '荢' =&gt; '□',
    '荿' =&gt; '□',
    '菇' =&gt; '□',
    '菶' =&gt; '□',
    '葈' =&gt; '□',
    '蒴' =&gt; '□',
    '蕓' =&gt; '□',
    '蕙' =&gt; '□',
    '蕫' =&gt; '□',
    '﨟' =&gt; '□',
    '薰' =&gt; '□',
    '蘒' =&gt; '□',
    '﨡' =&gt; '□',
    '蠇' =&gt; '□',
    '裵' =&gt; '□',
    '訒' =&gt; '□',
    '訷' =&gt; '□',
    '詹' =&gt; '□',
    '誧' =&gt; '□',
    '誾' =&gt; '□',
    '諟' =&gt; '□',
    '諸' =&gt; '□',
    '諶' =&gt; '□',
    '譓' =&gt; '□',
    '譿' =&gt; '□',
    '賰' =&gt; '□',
    '賴' =&gt; '□',
    '贒' =&gt; '□',
    '赶' =&gt; '□',
    '﨣' =&gt; '□',
    '軏' =&gt; '□',
    '﨤' =&gt; '□',
    '逸' =&gt; '□',
    '遧' =&gt; '□',
    '郞' =&gt; '□',
    '都' =&gt; '□',
    '鄕' =&gt; '□',
    '鄧' =&gt; '□',
    '釚' =&gt; '□',
   
    //92区
    '釗' =&gt; '□',
    '釞' =&gt; '□',
    '釭' =&gt; '□',
    '釮' =&gt; '□',
    '釤' =&gt; '□',
    '釥' =&gt; '□',
    '鈆' =&gt; '□',
    '鈐' =&gt; '□',
    '鈊' =&gt; '□',
    '鈺' =&gt; '□',
    '鉀' =&gt; '□',
    '鈼' =&gt; '□',
    '鉎' =&gt; '□',
    '鉙' =&gt; '□',
    '鉑' =&gt; '□',
    '鈹' =&gt; '□',
    '鉧' =&gt; '□',
    '銧' =&gt; '□',
    '鉷' =&gt; '□',
    '鉸' =&gt; '□',
    '鋧' =&gt; '□',
    '鋗' =&gt; '□',
    '鋙' =&gt; '□',
    '鋐' =&gt; '□',
    '﨧' =&gt; '□',
    '鋕' =&gt; '□',
    '鋠' =&gt; '□',
    '鋓' =&gt; '□',
    '錥' =&gt; '□',
    '錡' =&gt; '□',
    '鋻' =&gt; '□',
    '﨨' =&gt; '□',
    '錞' =&gt; '□',
    '鋿' =&gt; '□',
    '錝' =&gt; '□',
    '錂' =&gt; '□',
    '鍰' =&gt; '□',
    '鍗' =&gt; '□',
    '鎤' =&gt; '□',
    '鏆' =&gt; '□',
    '鏞' =&gt; '□',
    '鏸' =&gt; '□',
    '鐱' =&gt; '□',
    '鑅' =&gt; '□',
    '鑈' =&gt; '□',
    '閒' =&gt; '□',
    '隆' =&gt; '□',
    '﨩' =&gt; '□',
    '隝' =&gt; '□',
    '隯' =&gt; '□',
    '霳' =&gt; '□',
    '霻' =&gt; '□',
    '靃' =&gt; '□',
    '靍' =&gt; '□',
    '靏' =&gt; '□',
    '靑' =&gt; '□',
    '靕' =&gt; '□',
    '顗' =&gt; '□',
    '顥' =&gt; '□',
    '飯' =&gt; '□',
    '飼' =&gt; '□',
    '餧' =&gt; '□',
    '館' =&gt; '□',
    '馞' =&gt; '□',
    '驎' =&gt; '□',
    '髙' =&gt; '高',
    '髜' =&gt; '□',
    '魵' =&gt; '□',
    '魲' =&gt; '□',
    '鮏' =&gt; '□',
    '鮱' =&gt; '□',
    '鮻' =&gt; '□',
    '鰀' =&gt; '□',
    '鵰' =&gt; '□',
    '鵫' =&gt; '□',
    '鶴' =&gt; '□',
    '鸙' =&gt; '□',
    '黑' =&gt; '□',
    'ⅰ' =&gt; 'i',
    'ⅱ' =&gt; 'ii',
    'ⅲ' =&gt; 'iii',
    'ⅳ' =&gt; 'iv',
    'ⅴ' =&gt; 'v',
    'ⅵ' =&gt; 'vi',
    'ⅶ' =&gt; 'vii',
    'ⅷ' =&gt; 'viii',
    'ⅸ' =&gt; 'ix',
    'ⅹ' =&gt; 'x',
    '￢' =&gt; '□',
    '￤' =&gt; '□',
    '＇' =&gt; '□',
    '＂' =&gt; '□',
   
    //115区
    'ⅰ' =&gt; 'i',
    'ⅱ' =&gt; 'ii',
    'ⅲ' =&gt; 'iii',
    'ⅳ' =&gt; 'iv',
    'ⅴ' =&gt; 'v',
    'ⅵ' =&gt; 'vi',
    'ⅶ' =&gt; 'vii',
    'ⅷ' =&gt; 'viii',
    'ⅸ' =&gt; 'ix',
    'ⅹ' =&gt; 'x',
    'Ⅰ' =&gt; 'I',
    'Ⅱ' =&gt; 'II',
    'Ⅲ' =&gt; 'III',
    'Ⅳ' =&gt; 'IV',
    'Ⅴ' =&gt; 'V',
    'Ⅵ' =&gt; 'VI',
    'Ⅶ' =&gt; 'VII',
    'Ⅷ' =&gt; 'VIII',
    'Ⅸ' =&gt; 'IX',
    'Ⅹ' =&gt; 'X',
    '￢' =&gt; '□',
    '￤' =&gt; '□',
    '＇' =&gt; '□',
    '＂' =&gt; '□',
    '㈱' =&gt; '(株)',
    '№' =&gt; 'No.',
    '℡' =&gt; 'TEL',
    '∵' =&gt; '□',
    '纊' =&gt; '□',
    '褜' =&gt; '□',
    '鍈' =&gt; '□',
    '銈' =&gt; '□',
    '蓜' =&gt; '□',
    '俉' =&gt; '□',
    '炻' =&gt; '□',
    '昱' =&gt; '□',
    '棈' =&gt; '□',
    '鋹' =&gt; '□',
    '曻' =&gt; '□',
    '彅' =&gt; '□',
    '丨' =&gt; '□',
    '仡' =&gt; '□',
    '仼' =&gt; '□',
    '伀' =&gt; '□',
    '伃' =&gt; '□',
    '伹' =&gt; '□',
    '佖' =&gt; '□',
    '侒' =&gt; '□',
    '侊' =&gt; '□',
    '侚' =&gt; '□',
    '侔' =&gt; '□',
    '俍' =&gt; '□',
    '偀' =&gt; '□',
    '倢' =&gt; '□',
    '俿' =&gt; '□',
    '倞' =&gt; '□',
    '偆' =&gt; '□',
    '偰' =&gt; '□',
    '偂' =&gt; '□',
    '傔' =&gt; '□',
    '僴' =&gt; '□',
    '僘' =&gt; '□',
    '兊' =&gt; '□',
    '兤' =&gt; '□',
    '冝' =&gt; '□',
    '冾' =&gt; '□',
    '凬' =&gt; '□',
    '刕' =&gt; '□',
    '劜' =&gt; '□',
    '劦' =&gt; '□',
    '勀' =&gt; '□',
    '勛' =&gt; '□',
    '匀' =&gt; '□',
    '匇' =&gt; '□',
    '匤' =&gt; '□',
    '卲' =&gt; '□',
    '厓' =&gt; '□',
    '厲' =&gt; '□',
    '叝' =&gt; '□',
    '﨎' =&gt; '□',
    '咜' =&gt; '□',
    '咊' =&gt; '□',
    '咩' =&gt; '□',
    '哿' =&gt; '□',
    '喆' =&gt; '□',
    '坙' =&gt; '□',
    '坥' =&gt; '□',
    '垬' =&gt; '□',
    '埈' =&gt; '□',
    '埇' =&gt; '□',
    '﨏' =&gt; '□',
    '塚' =&gt; '□',
    '增' =&gt; '□',
    '墲' =&gt; '□',
   
    //116区
    '夋' =&gt; '□',
    '奓' =&gt; '□',
    '奛' =&gt; '□',
    '奝' =&gt; '□',
    '奣' =&gt; '□',
    '妤' =&gt; '□',
    '妺' =&gt; '□',
    '孖' =&gt; '□',
    '寀' =&gt; '□',
    '甯' =&gt; '□',
    '寘' =&gt; '□',
    '寬' =&gt; '□',
    '尞' =&gt; '□',
    '岦' =&gt; '□',
    '岺' =&gt; '□',
    '峵' =&gt; '□',
    '崧' =&gt; '□',
    '嵓' =&gt; '□',
    '﨑' =&gt; '崎',
    '嵂' =&gt; '□',
    '嵭' =&gt; '□',
    '嶸' =&gt; '□',
    '嶹' =&gt; '□',
    '巐' =&gt; '□',
    '弡' =&gt; '□',
    '弴' =&gt; '□',
    '彧' =&gt; '□',
    '德' =&gt; '□',
    '忞' =&gt; '□',
    '恝' =&gt; '□',
    '悅' =&gt; '□',
    '悊' =&gt; '□',
    '惞' =&gt; '□',
    '惕' =&gt; '□',
    '愠' =&gt; '□',
    '惲' =&gt; '□',
    '愑' =&gt; '□',
    '愷' =&gt; '□',
    '愰' =&gt; '□',
    '憘' =&gt; '□',
    '戓' =&gt; '□',
    '抦' =&gt; '□',
    '揵' =&gt; '□',
    '摠' =&gt; '□',
    '撝' =&gt; '□',
    '擎' =&gt; '□',
    '敎' =&gt; '□',
    '昀' =&gt; '□',
    '昕' =&gt; '□',
    '昻' =&gt; '□',
    '昉' =&gt; '□',
    '昮' =&gt; '□',
    '昞' =&gt; '□',
    '昤' =&gt; '□',
    '晥' =&gt; '□',
    '晗' =&gt; '□',
    '晙' =&gt; '□',
    '晴' =&gt; '□',
    '晳' =&gt; '□',
    '暙' =&gt; '□',
    '暠' =&gt; '□',
    '暲' =&gt; '□',
    '暿' =&gt; '□',
    '曺' =&gt; '□',
    '朎' =&gt; '□',
    '朗' =&gt; '□',
    '杦' =&gt; '□',
    '枻' =&gt; '□',
    '桒' =&gt; '□',
    '柀' =&gt; '□',
    '栁' =&gt; '□',
    '桄' =&gt; '□',
    '棏' =&gt; '□',
    '﨓' =&gt; '□',
    '楨' =&gt; '□',
    '﨔' =&gt; '□',
    '榘' =&gt; '□',
    '槢' =&gt; '□',
    '樰' =&gt; '□',
    '橫' =&gt; '□',
    '橆' =&gt; '□',
    '橳' =&gt; '□',
    '橾' =&gt; '□',
    '櫢' =&gt; '□',
    '櫤' =&gt; '□',
    '毖' =&gt; '□',
    '氿' =&gt; '□',
    '汜' =&gt; '□',
    '沆' =&gt; '□',
    '汯' =&gt; '□',
    '泚' =&gt; '□',
    '洄' =&gt; '□',
    '涇' =&gt; '□',
    '浯' =&gt; '□',
   
    //117区
    '涖' =&gt; '□',
    '涬' =&gt; '□',
    '淏' =&gt; '□',
    '淸' =&gt; '□',
    '淲' =&gt; '□',
    '淼' =&gt; '□',
    '渹' =&gt; '□',
    '湜' =&gt; '□',
    '渧' =&gt; '□',
    '渼' =&gt; '□',
    '溿' =&gt; '□',
    '澈' =&gt; '□',
    '澵' =&gt; '□',
    '濵' =&gt; '□',
    '瀅' =&gt; '□',
    '瀇' =&gt; '□',
    '瀨' =&gt; '□',
    '炅' =&gt; '□',
    '炫' =&gt; '□',
    '焏' =&gt; '□',
    '焄' =&gt; '□',
    '煜' =&gt; '□',
    '煆' =&gt; '□',
    '煇' =&gt; '□',
    '凞' =&gt; '□',
    '燁' =&gt; '□',
    '燾' =&gt; '□',
    '犱' =&gt; '□',
    '犾' =&gt; '□',
    '猤' =&gt; '□',
    '猪' =&gt; '□',
    '獷' =&gt; '□',
    '玽' =&gt; '□',
    '珉' =&gt; '□',
    '珖' =&gt; '□',
    '珣' =&gt; '□',
    '珒' =&gt; '□',
    '琇' =&gt; '□',
    '珵' =&gt; '□',
    '琦' =&gt; '□',
    '琪' =&gt; '□',
    '琩' =&gt; '□',
    '琮' =&gt; '□',
    '瑢' =&gt; '□',
    '璉' =&gt; '□',
    '璟' =&gt; '□',
    '甁' =&gt; '□',
    '畯' =&gt; '□',
    '皂' =&gt; '□',
    '皜' =&gt; '□',
    '皞' =&gt; '□',
    '皛' =&gt; '□',
    '皦' =&gt; '□',
    '益' =&gt; '□',
    '睆' =&gt; '□',
    '劯' =&gt; '□',
    '砡' =&gt; '□',
    '硎' =&gt; '□',
    '硤' =&gt; '□',
    '硺' =&gt; '□',
    '礰' =&gt; '□',
    '礼' =&gt; '□',
    '神' =&gt; '□',
    '祥' =&gt; '□',
    '禔' =&gt; '□',
    '福' =&gt; '□',
    '禛' =&gt; '□',
    '竑' =&gt; '□',
    '竧' =&gt; '□',
    '靖' =&gt; '□',
    '竫' =&gt; '□',
    '箞' =&gt; '□',
    '精' =&gt; '□',
    '絈' =&gt; '□',
    '絜' =&gt; '□',
    '綷' =&gt; '□',
    '綠' =&gt; '□',
    '緖' =&gt; '□',
    '繒' =&gt; '□',
    '罇' =&gt; '□',
    '羡' =&gt; '□',
    '羽' =&gt; '□',
    '茁' =&gt; '□',
    '荢' =&gt; '□',
    '荿' =&gt; '□',
    '菇' =&gt; '□',
    '菶' =&gt; '□',
    '葈' =&gt; '□',
    '蒴' =&gt; '□',
    '蕓' =&gt; '□',
    '蕙' =&gt; '□',
    '蕫' =&gt; '□',
    '﨟' =&gt; '□',
    '薰' =&gt; '□',
   
    //118区
    '蘒' =&gt; '□',
    '﨡' =&gt; '□',
    '蠇' =&gt; '□',
    '裵' =&gt; '□',
    '訒' =&gt; '□',
    '訷' =&gt; '□',
    '詹' =&gt; '□',
    '誧' =&gt; '□',
    '誾' =&gt; '□',
    '諟' =&gt; '□',
    '諸' =&gt; '□',
    '諶' =&gt; '□',
    '譓' =&gt; '□',
    '譿' =&gt; '□',
    '賰' =&gt; '□',
    '賴' =&gt; '□',
    '贒' =&gt; '□',
    '赶' =&gt; '□',
    '﨣' =&gt; '□',
    '軏' =&gt; '□',
    '﨤' =&gt; '□',
    '逸' =&gt; '□',
    '遧' =&gt; '□',
    '郞' =&gt; '□',
    '都' =&gt; '□',
    '鄕' =&gt; '□',
    '鄧' =&gt; '□',
    '釚' =&gt; '□',
    '釗' =&gt; '□',
    '釞' =&gt; '□',
    '釭' =&gt; '□',
    '釮' =&gt; '□',
    '釤' =&gt; '□',
    '釥' =&gt; '□',
    '鈆' =&gt; '□',
    '鈐' =&gt; '□',
    '鈊' =&gt; '□',
    '鈺' =&gt; '□',
    '鉀' =&gt; '□',
    '鈼' =&gt; '□',
    '鉎' =&gt; '□',
    '鉙' =&gt; '□',
    '鉑' =&gt; '□',
    '鈹' =&gt; '□',
    '鉧' =&gt; '□',
    '銧' =&gt; '□',
    '鉷' =&gt; '□',
    '鉸' =&gt; '□',
    '鋧' =&gt; '□',
    '鋗' =&gt; '□',
    '鋙' =&gt; '□',
    '鋐' =&gt; '□',
    '﨧' =&gt; '□',
    '鋕' =&gt; '□',
    '鋠' =&gt; '□',
    '鋓' =&gt; '□',
    '錥' =&gt; '□',
    '錡' =&gt; '□',
    '鋻' =&gt; '□',
    '﨨' =&gt; '□',
    '錞' =&gt; '□',
    '鋿' =&gt; '□',
    '錝' =&gt; '□',
    '錂' =&gt; '□',
    '鍰' =&gt; '□',
    '鍗' =&gt; '□',
    '鎤' =&gt; '□',
    '鏆' =&gt; '□',
    '鏞' =&gt; '□',
    '鏸' =&gt; '□',
    '鐱' =&gt; '□',
    '鑅' =&gt; '□',
    '鑈' =&gt; '□',
    '閒' =&gt; '□',
    '隆' =&gt; '□',
    '﨩' =&gt; '□',
    '隝' =&gt; '□',
    '隯' =&gt; '□',
    '霳' =&gt; '□',
    '霻' =&gt; '□',
    '靃' =&gt; '□',
    '靍' =&gt; '□',
    '靏' =&gt; '□',
    '靑' =&gt; '□',
    '靕' =&gt; '□',
    '顗' =&gt; '□',
    '顥' =&gt; '□',
    '飯' =&gt; '□',
    '飼' =&gt; '□',
    '餧' =&gt; '□',
    '館' =&gt; '□',
    '馞' =&gt; '□',
    '驎' =&gt; '□',
    '髙' =&gt; '高',
   
    //119区
    '髜' =&gt; '□',
    '魵' =&gt; '□',
    '魲' =&gt; '□',
    '鮏' =&gt; '□',
    '鮱' =&gt; '□',
    '鮻' =&gt; '□',
    '鰀' =&gt; '□',
    '鵰' =&gt; '□',
    '鵫' =&gt; '□',
    '鶴' =&gt; '□',
    '鸙' =&gt; '□',
    '黑' =&gt; '□',
);

header("Content-Type: text/plain; charset=utf-8");

$str = "その①：髙島屋に行った㈱ヤマザキヤマザキの山﨑さん。";
$str = strtr($str, $map);
var_dump($str);
&lt;/pre&gt;

&lt;p&gt;
よさげ。strtr関数はマルチバイトでも問題なく動くみたい。ループで処理しなくて済むのでスマート。
こんなライブラリきっとあるだろうに...
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-3805073718141026254?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/3805073718141026254/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=3805073718141026254' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3805073718141026254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3805073718141026254'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/09/jisjis-x-0208.html' title='はしご高（髙）や立ち崎（﨑）をJIS基本漢字（JIS X 0208）に変換するマップ作成の手順'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-7628076439235652808</id><published>2008-09-05T13:17:00.001+09:00</published><updated>2008-09-05T13:19:06.233+09:00</updated><title type='text'>Internet Explorer 8 Beta 2その後</title><content type='html'>&lt;p&gt;しかもWindowsUpdateができなくなりました。なんじゃそりゃ....&lt;/p&gt;

&lt;p&gt;Google Chrome試そう。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-7628076439235652808?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/7628076439235652808/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=7628076439235652808' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/7628076439235652808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/7628076439235652808'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/09/internet-explorer-8-beta-2.html' title='Internet Explorer 8 Beta 2その後'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-3879311839711591567</id><published>2008-08-29T13:16:00.002+09:00</published><updated>2008-08-29T13:19:54.617+09:00</updated><title type='text'>Internet Explorer 8 Beta 2をインストールしてみて分かったこと</title><content type='html'>&lt;p&gt;
Internet Explorer 8をインストールしたレポートがブログでいくつか出てきたし、ニュースサイトでも紹介されてるし、入れてみたんだけど、みんなもっと大事なことを書いてくれよ。
&lt;strong&gt;「Internet Explorer 7に上書きされます」&lt;/strong&gt;って。
戻すのもめんどくさいから、ウェブアプリの動作確認VMware上のIE7でやるけどね。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-3879311839711591567?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/3879311839711591567/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=3879311839711591567' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3879311839711591567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3879311839711591567'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/08/internet-explorer-8-beta-2.html' title='Internet Explorer 8 Beta 2をインストールしてみて分かったこと'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-2639589092548969186</id><published>2008-08-13T18:37:00.002+09:00</published><updated>2008-08-13T18:42:52.631+09:00</updated><title type='text'>日付にまつわるエトセトラ</title><content type='html'>&lt;p&gt;
PHPとPostgreSQLとJavaScriptで日付をやりとりしていると結構混乱することがある。
最近日付に関係することで覚えておいて損はないなというのが何個か出てきたのでメモ。
&lt;/p&gt;

&lt;h4&gt;PHPで「+1 day」のような日付の計算をする&lt;/h4&gt;

&lt;p&gt;
PostgreSQLだと以下のような計算ができて結構便利だったりする。
月の始めや末日では単純に日の加減演算をしても前日・翌日が取得できないので、
前日と翌日を取得するような場面で重宝する。
&lt;/p&gt;

&lt;pre class="code"&gt;
&gt; SELECT now() + '1 day';
          ?column?           
-------------------------------
2008-08-14 15:38:08.109599+09
(1 row)
&lt;/pre&gt;

&lt;p&gt;
この日付のプラス・マイナスの演算がPHPではできないと思っていたら&lt;a href="http://jp2.php.net/manual/ja/function.strtotime.php"&gt;strtotime&lt;/a&gt;を使えばできたらしい。
&lt;/p&gt;

&lt;pre class="code"&gt;
$time = time();

//かっこ悪い例
$new_time = mktime(date('H', $time), date('i', $time), date('s', $time), date('m', $time), date('d', $time) + 1, date('Y', $time));
var_dump(date('Y-m-d H:i:s', $new_time));

//スマートな例
$new_time = strtotime("+1 day", $time);
var_dump(date('Y-m-d H:i:s', $new_time));
&lt;/pre&gt;

&lt;h4&gt;PostgreSQLでRFC 2822形式の日付を出力する&lt;/h4&gt;

&lt;p&gt;
PHPだとdate('r')で簡単にRFC 2822形式の日付を出力できるけど、PostgreSQLのto_charにはそんな気の利いたものはない。
PostgreSQLで出力する場合は以下のようにちょっと長いパラメータをto_charに指定することになる。
&lt;/p&gt;

&lt;pre class="code"&gt;
&gt; SELECT to_char(now(), 'Dy, DD Mon YYYY HH24:MI:SS TZ');
           to_char           
-------------------------------
Wed, 13 Aug 2008 15:54:35 JST
(1 row)
&lt;/pre&gt;

&lt;p&gt;
ちなみにPHPでdate('r')を出力すると「Wed, 13 Aug 2008 15:55:02 +0900」となり、タイムゾーンの書式のみ異なる。
タイムゾーンが「JST」と書かれていてもPHPのstrtotime関数では正しく処理できるので問題ない。
ただしJavaScriptのDateコンストラクタでは正しく解釈しないようなので、
「JST」のように時間帯名を書くのではなく「+0900」のようにオフセットを記述しなければいけない。
to_char関数ではオフセットを取得できないが、以下のようにextract関数を使えば取得できる。
&lt;/p&gt;

&lt;pre class="code"&gt;
&gt; select to_char(EXTRACT(TIMEZONE_HOUR FROM now()), 'SG00');
to_char
---------
+09
(1 row)

&gt; select to_char(EXTRACT(TIMEZONE_MINUTE FROM now()), '00');
to_char
---------
 00
(1 row)
&lt;/pre&gt;

&lt;p&gt;
結構面倒かも....タイムゾーン固定でいいなら直接「+0900」と書いてもいいかもしれない。
オフセット時間を書かなくても環境によっては+0900として解釈するので、この辺は臨機応変に。
&lt;/p&gt;

&lt;h4&gt;JavaScriptのDateコンストラクタが受け付けるRFC 2822の形式&lt;/h4&gt;

&lt;p&gt;
上記のものとかぶるが、Dateコンストラクタで受け付けるRFC 2822形式の日付は以下の通り。（Firebugで試した）
タイムゾーンを時間帯名で書くのはダメらしい。
&lt;/p&gt;

&lt;pre class="code"&gt;
new Date('Wed, 13 Aug 2008 15:55:02 +0900');//ok
new Date('Wed, 13 Aug 2008 15:55:02 GMT+0900');//ok
new Date('Wed, 13 Aug 2008 15:55:02');//ok
new Date('Wed, 13 Aug 2008 15:55:02 JST');//NG, Invalid Date
&lt;/pre&gt;

&lt;p&gt;
Dateコンストラクタに年月日時分秒を全部渡すときは月が0から11の範囲であることをよく忘れてバグを混ぜてしまうことがある。
上記のようにRFC 2822形式を使用するとそういった間違いは減らせる（かも）
&lt;/p&gt;

&lt;p&gt;
ちなみにFirebugで上記のDateコンストラクタを使用するとコンソールには「Wed Aug 13 2008 15:55:02 GMT+0900」と出力され、
RFC 2822に準拠していない。
toUTCString関数を使うとよさげ。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-2639589092548969186?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/2639589092548969186/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=2639589092548969186' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2639589092548969186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2639589092548969186'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/08/blog-post.html' title='日付にまつわるエトセトラ'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-6795865995930359073</id><published>2008-08-05T13:07:00.001+09:00</published><updated>2008-08-05T13:09:28.279+09:00</updated><title type='text'>YUIのgzip圧縮とキャッシュ</title><content type='html'>&lt;p&gt;
YUIに数多く含まれるjsファイルとcssファイルはあらかじめgzip圧縮しておくと通信量が抑えられて描画速度アップにつながる。
さらにキャッシュもきくようにしておくと効果的。
以下にgzip圧縮とキャッシュを行う手順をメモ。
&lt;/p&gt;

&lt;p&gt;
まずjsファイルとcssファイルをgzip圧縮して別ファイルとして保存する。
「cat gzip_yui_js_css.sh」というファイル名で以下のようなシェルを作成。
&lt;/p&gt;

&lt;pre class="code"&gt;
#!/bin/sh
# YAHOO! UIのjsファイルとcssファイルをgzipしてファイルを作成する

YUI_PATH="/path/to/yui_2.5.2"
cd ${YUI_PATH}

/usr/bin/find . -type f -name \*.js -exec /bin/sh -c "gzip {} -c &amp;gt; {}.gz" \;
echo "*.js.gzファイルを生成しました。"

/usr/bin/find . -type f -name \*.css -exec /bin/sh -c "gzip {} -c &amp;gt; {}.gz" \;
echo "*.css.gzファイルを生成しました。"
&lt;/pre&gt;

&lt;p&gt;
圧縮ファイルができたら、ブラウザがgzipに対応している場合のみgzip圧縮したファイルを返すように.htaccessに以下の設定を追加。
&lt;/p&gt;

&lt;pre class="code"&gt;
# http://httpd.apache.org/docs/2.0/ja/mod/mod_expires.html
ExpiresActive On
ExpiresByType text/css "access plus 7 days"
ExpiresByType text/javascript "access plus 7 days"
ExpiresByType application/x-javascript "access plus 7 days"
ExpiresByType image/gif "access plus 7 days"
ExpiresByType image/jpg "access plus 7 days"
ExpiresByType image/jpeg "access plus 7 days"
ExpiresByType image/pjpeg "access plus 7 days"
ExpiresByType image/png "access plus 7 days"
ExpiresByType image/x-png "access plus 7 days"

FileETag None

# gzip
# http://httpd.apache.org/docs/2.0/ja/mod/core.html#filesmatch
# http://httpd.apache.org/docs/2.0/ja/mod/core.html#forcetype
# http://httpd.apache.org/docs/2.0/ja/mod/mod_headers.html#header
# http://blog.dawgsdk.org/weblog/archives/411011
RewriteEngine on

RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME} \.js$ [OR]
RewriteCond %{REQUEST_FILENAME} \.css$
RewriteRule .+ %{REQUEST_URI}.gz

&amp;lt;FilesMatch "\.js\.gz$"&amp;gt;
    ForceType application/x-javascript
    AddEncoding x-gzip .gz
&amp;lt;/FilesMatch&amp;gt;

&amp;lt;FilesMatch "\.css\.gz$"&amp;gt;
    ForceType text/css
    AddEncoding x-gzip .gz
&amp;lt;/FilesMatch&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
Accept-Encodingにgzipが含まれ、リクエストされたファイルの拡張子がjsまたはcssの場合は、.js.gzまたは.css.gzが読み込まれる。例えばyahoo.jsがリクエストされたらyahoo.js.gzが読み込まれることになる。
これで圧縮されたファイルが読み込まれるようになるが、
それだけだとContent-Typeが本来のjsとcssの値ではないためブラウザが正しく処理できない。
正しく処理できるように、.js.gzにアクセスしたときのContent-Typeを強制的にapplication/x-javascriptに変更する。
（cssも同様）
&lt;/p&gt;

&lt;p&gt;
キャッシュを有効にするにはExpiresActiveをOnにし、ExpiresByTypeでContent-Typeごとに有効期限の長さを設定する。
（この例では最後にアクセスした時間プラス１週間）
ETagは無効にした。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-6795865995930359073?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/6795865995930359073/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=6795865995930359073' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/6795865995930359073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/6795865995930359073'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/08/yuigzip.html' title='YUIのgzip圧縮とキャッシュ'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-164440089845105759</id><published>2008-08-05T12:46:00.000+09:00</published><updated>2008-08-05T12:48:38.003+09:00</updated><title type='text'>YUIのjsファイルをひとつにまとめてHTTP接続数を減らす</title><content type='html'>&lt;p&gt;
HTTP接続数を減らすことはページのロード時間を改善するのにかなり効果がある、というのは結構周知の事実。
前回utilities.jsが主要なjsファイルをまとめたものだと知らなかったエントリを書いたので、
ついでに読み込むjsファイルを全部ひとつにまとめてHTTP接続数を減らした方法をメモ。
&lt;/p&gt;

&lt;p&gt;
本当は画面ごとに最小のjsファイルしか読み込まないのが最適なのだけど、画面数が多くてそんな手間かけるのもめんどくさい。
というわけで、とりあえずどの画面でも使っているファイルを全部まとめてひとつにすることを考える。
全部の画面からロードしているjsファイルを検索して重複を排除して、
&lt;a href="http://developer.yahoo.com/yui/articles/hosting/#configure"&gt;YUI Dependency Configurator&lt;/a&gt;を使ってそれらのファイルを全部選択してみた。
依存関係があるのでYUI Dependency Configuratorを使うのが間違いない。
&lt;/p&gt;

&lt;pre class="code"&gt;
&amp;lt;script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/utilities/utilities.js"&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/autocomplete/autocomplete-min.js"&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/button/button-min.js"&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/calendar/calendar-min.js"&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/container/container-min.js"&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/datasource/datasource-beta-min.js"&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/datatable/datatable-beta-min.js"&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/json/json-min.js"&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/logger/logger-min.js"&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/tabview/tabview-min.js"&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/treeview/treeview-min.js"&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;script type="text/javascript" src="http://yui.yahooapis.com/2.5.2/build/uploader/uploader-experimental.js"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;

&lt;p&gt;
なるほどなるほど。ここからbuild/以下のパスを取り出してローカルにあるjsファイルを固めればよし。
（autocompleteとかuploaderなんて１，２画面でしか使ってない...）
/tmpにyui_js.txtというファイルを作成して上記のscriptタグ12行を保存。
YUIのbuildのあるディレクトリに移動して、以下のワンライナーを実行。
&lt;/p&gt;

&lt;pre class="code"&gt;
$ cat /tmp/yui_js.txt | perl -nle '/build\/([^"]+)"/ &amp;&amp; print $1;' | xargs cat &amp;gt; /tmp/yui_2.5.2_combine.js
$ cd /tmp
$ gzip yui_2.5.2_combine.js -c &amp;gt; yui_2.5.2_combine.js.gz
&lt;/pre&gt;

&lt;p&gt;
12ファイルをひとつにまとめると体感的にも若干早い（気がする）。
画面ごとに最小のロードで済むようにする仕組みもほしい。
&lt;a href="http://yuiblog.com/blog/2008/07/16/combohandler/"&gt;ホストしたjs&lt;/a&gt;ならあるんだけど。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-164440089845105759?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/164440089845105759/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=164440089845105759' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/164440089845105759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/164440089845105759'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/08/yuijshttp.html' title='YUIのjsファイルをひとつにまとめてHTTP接続数を減らす'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-5686623582448517654</id><published>2008-07-28T15:10:00.002+09:00</published><updated>2008-07-28T15:15:30.603+09:00</updated><title type='text'>YUIのutilities.js</title><content type='html'>&lt;p&gt;YUIのサンプルとか作っててたまに出てくる「utilities.js」なるファイル。他のjsファイルと違って-min.jsが用意されているわけでないし、いったいなんに使うんだろう？と疑問のまま作業してきたのだけど、ついさっきREADMEを読んでみた。&lt;/p&gt;

&lt;pre class="code"&gt;utilities.js - Release Notes

*** NOTE ***

This document is not updated with each release.  Changes to
the utilities.js source are noted in the README
file for each component that comprises this aggregate:

yahoo/README
dom/README
event/README
connection/README
animation/README
dragdrop/README
element/README
get/README
yuiloader/README

*************

The utilities.js file rolls up all of the YUI utility components into a single
file; it includes the following components:

* Yahoo Global Object
* Event
* Dom
* Connection Manager
* Animation
* Drag &amp;amp; Drop
* Element
* Get
* YUI Loader

For implementations that use four or more  of these files, it may prove
more efficient to include utilities.js as opposed to including separate files
for each component.

Note: If you require only the Yahoo Global Object, Event Utility and Dom
collection, consider using the special yahoo-dom-event.js aggregate instead.
&lt;/pre&gt;

&lt;p&gt;よく使うものをまとめたものじゃないか！つーことは知らずに重複してロードしてたファイルが...あぁぁぁぁ。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-5686623582448517654?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/5686623582448517654/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=5686623582448517654' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/5686623582448517654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/5686623582448517654'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/07/yuiutilitiesjs.html' title='YUIのutilities.js'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-6900259170744282006</id><published>2008-07-14T23:06:00.002+09:00</published><updated>2008-07-14T23:48:07.761+09:00</updated><title type='text'>みんな動的なノード生成どうやってるんだー</title><content type='html'>&lt;p&gt;Ajaxが登場してからというもの動的にノードを生成することがめっきり多くなった。
が、JavaScriptのDOM処理がめんどくさい。いちいち書く関数名が長いし、変数もたくさん定義しなければいけない。
面倒だ。Google ReaderとかGmailとかいったいどうやって生成してるんだろ？&lt;/p&gt;

&lt;p&gt;ソースを読めばうまいやり方がわかるのかもしれないけど、とりあえず大量に生成する場合に使用しているビルダ関数作ったのでさらしてみる。
きまったJSON形式で要素情報を定義しておき、ビルダ関数に値を渡すと再帰的にノードを生成して返すというもの。&lt;/p&gt;

&lt;a href="http://pgmon.heteml.jp/n/misc/build_nodes_1.html"&gt;動的ノード作成サンプル&lt;/a&gt;

&lt;p&gt;ただし、document.createElementやdocument.createAttributeも万能ではないっぽい。
以下の制限がある。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IEでstyle属性を生成しようとするとエラー&lt;/li&gt;
&lt;li&gt;IEでラジオボタン（&amp;lt;input type=&amp;quot;radio&amp;quot;&amp;gt;）を生成しようとするとエラー&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;まぁでもstyle属性が使えなくても、あらかじめclassを定義しておけばよい。
obj.style.backgroundColor='#ff0000'のようにちゃんとstyleプロパティ以下を指定してやってもよい（サンプルではそこまで対応してないけど）
ラジオボタンについては、そもそもラジオボタンを使わなかったり該当する箇所だけinnerHTMLを使ったりしたので問題なかった。&lt;/p&gt;

&lt;p&gt;はじめっから全部innerHTML使えばいいじゃん、という意見ももちろんありだ。
ある局面では非常に有効なのだけど、以下のようなケースにあったことがある。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;white-space:nowrapを指定してあるブロック要素にプログラムコードを表示しようと思ってinnerHTMLに値を代入したが、nowrapで表示されなかった。スタイルが正しく適用されないらしい&lt;/li&gt;
&lt;li&gt;tbody要素にtr要素を足したときに、table要素の下に表示されていたブロック要素の位置が１行分下に移動するはずが、移動しなかった。ブラウザのどこかをクリックするとちゃんと描画される&lt;/li&gt;
&lt;li&gt;（これは不満な点）a要素やinput要素にイベントを付加する場合、きれいに書くことができず以下のような苦し紛れのことをやることになる
  &lt;ul&gt;
    &lt;li&gt;onclick属性に直接関数を書く&lt;/li&gt;
    &lt;li&gt;innerHTMLに値をセットしたあと、setTimeoutを使ってちょっとタイミングを遅らせて、ducument.getElementByIdを使って要素を取得してイベントを付加する（タイミングを遅らせずにすぐ要素を取得しようとすると失敗することがある）&lt;/li&gt;
  &lt;/ul&gt;
  動的にノードを生成すれば、戻り値に要素自体を得られるため、YAHOO! UIのイベント関連の関数を使って簡単にイベントを付加できる。
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DOM操作とinnerHTMLでは内部的な処理が根本的に違うのだと思う。
どういうケースで正しく描画されなくなるかよくわからないので（しかもブラウザに結構依存するので）
できればDOM操作だけでHTMLを構築していくのがいいのかな、と現時点では思っている。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-6900259170744282006?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/6900259170744282006/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=6900259170744282006' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/6900259170744282006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/6900259170744282006'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/07/blog-post_14.html' title='みんな動的なノード生成どうやってるんだー'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-4550305118810773204</id><published>2008-07-10T23:18:00.002+09:00</published><updated>2008-07-10T23:32:48.269+09:00</updated><title type='text'>考えたくない症候群</title><content type='html'>&lt;p&gt;寝る前でグダグダだけど。&lt;/p&gt;&lt;p&gt;モニタを見ながら、仕事のことを考えているように見えて実はなにも考えていない。がーっと作業をしているときにふと一段落したところで、ふと自分がなにも考えていないことに気づく。意識的だったり無意識にだったりいろいろだけど、人間の行動は楽なほうに転がるものだと信じている自分は「考えない」ということはほかの作業に比べてとっても楽（＝コストが低い）なんだなとなんだか改めて気づいたのでした。&lt;/p&gt;&lt;p&gt;スケジュールを練ったり、打ち合わせをしたり、プログラミングをしたり。一番論理的な思考を求められるプログラミングが一番大変（＝考えるコストがかかる）と一般的に思われるかもしれないが、いくつかプログラミング言語を覚えれば実はこの３つの中では一番楽だったりする（そうでない人もいると思うけど）。だいたいの作業が無意識にルーチン化できるから、実は頭をそんなに使わない「作業」だ。&lt;/p&gt;&lt;p&gt;スケジュールを練ったり打ち合わせをしたりするのが苦痛にならないように、プログラミング以外もある程度ルーチン化してあまり考えないでこなせるようにならないといけないな、と思う23:30ごろでした。&lt;/p&gt;&lt;p&gt;だから酒が飲みたくなるんだなーきっと。前後不覚とまでは行かなくても、考えなくていい状態って蠱惑的。
&lt;/p&gt;&lt;p&gt;明日はまた関東に出張です！
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-4550305118810773204?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/4550305118810773204/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=4550305118810773204' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/4550305118810773204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/4550305118810773204'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/07/blog-post_10.html' title='考えたくない症候群'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-3566375274870500360</id><published>2008-07-01T23:50:00.004+09:00</published><updated>2008-12-10T08:53:53.103+09:00</updated><title type='text'>かりんとう</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-sif9wLT5H0/SGpEdfx_9TI/AAAAAAAAAW0/2VmL4QJk_so/s1600-h/080701_2140%7E01.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_-sif9wLT5H0/SGpEdfx_9TI/AAAAAAAAAW0/2VmL4QJk_so/s200/080701_2140%7E01.jpg" alt="" id="BLOGGER_PHOTO_ID_5218058391800247602" border="0" /&gt;&lt;/a&gt;

&lt;p&gt;東京の取引先のお客様に薦められて買ってみました、かりんとう。食べるの久しぶり。&lt;/p&gt;
&lt;p&gt;かりんとうなのにきんぴらごぼう味？&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-3566375274870500360?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/3566375274870500360/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=3566375274870500360' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3566375274870500360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3566375274870500360'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/07/blog-post.html' title='かりんとう'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-sif9wLT5H0/SGpEdfx_9TI/AAAAAAAAAW0/2VmL4QJk_so/s72-c/080701_2140%7E01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-7136697447157152734</id><published>2008-06-29T21:08:00.003+09:00</published><updated>2008-12-10T08:53:53.306+09:00</updated><title type='text'>かおかおパンダに、出会った～</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_-sif9wLT5H0/SGd_DYTgr4I/AAAAAAAAAWs/vVkQHYvl4z4/s1600-h/SN3A0006.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_-sif9wLT5H0/SGd_DYTgr4I/AAAAAAAAAWs/vVkQHYvl4z4/s200/SN3A0006.jpg" alt="" id="BLOGGER_PHOTO_ID_5217278389372628866" border="0" /&gt;&lt;/a&gt;
&lt;p&gt;&lt;a href="http://www.kaokaopanda.com/"&gt;KAOKAOPANDA&lt;/a&gt;さんのかおかおパンダ展に行ってきました。&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;場所は&lt;a href="http://www.inokoya.co.jp/"&gt;いのこ家&lt;/a&gt;という豚料理専門店。KAOKAOPANDAさんのライブペインティングを見ながら豚料理を食べられるという豚さん尽くしのイベント。目で豚さんを愛で、舌でも豚を愛でる。おいしゅうございました。&lt;/p&gt;&lt;p&gt;何年か前にポストカードで知って、嫁さんがすごく好きになって結婚式のウェルカムボードでも使わせてもらったのでした。（男の人が描いてると思ってましたゴメンナサイ。）絵に描かれた豚さん以上に笑顔がステキな女性で癒されました。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-7136697447157152734?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/7136697447157152734/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=7136697447157152734' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/7136697447157152734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/7136697447157152734'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/06/blog-post_29.html' title='かおかおパンダに、出会った～'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_-sif9wLT5H0/SGd_DYTgr4I/AAAAAAAAAWs/vVkQHYvl4z4/s72-c/SN3A0006.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-3974936664634732881</id><published>2008-06-26T23:21:00.002+09:00</published><updated>2008-06-26T23:24:46.469+09:00</updated><title type='text'>石灰化？</title><content type='html'>左手薬指の付け根が１，２週間前からじわじわ痛いなぁと思ってたらついにキーボード叩けないぐらい痛くなったので病院行ってきました。&lt;a href="http://www.google.co.jp/search?hl=ja&amp;amp;q=%E7%9F%B3%E7%81%B0%E5%8C%96&amp;amp;btnG=Google+%E6%A4%9C%E7%B4%A2&amp;amp;lr="&gt;石灰化&lt;/a&gt;が起こってるそうです。なんじゃそりゃ？特にぶつけたわけでもないので原因わからず。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-3974936664634732881?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/3974936664634732881/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=3974936664634732881' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3974936664634732881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3974936664634732881'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/06/blog-post_26.html' title='石灰化？'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-3710222723767542701</id><published>2008-06-23T22:49:00.003+09:00</published><updated>2008-06-23T22:54:41.137+09:00</updated><title type='text'>JSON整形</title><content type='html'>&lt;p&gt;調子に乗って連続投稿。FirebugでAjax通信をして取得したレスポンスのボディが１行に全部つながってしまって見づらいので整形するページを作成。&lt;/p&gt;

&lt;a href="http://pgmon.heteml.jp/n/misc/json_formatter.html"&gt;JSON整形&lt;/a&gt;

&lt;p&gt;textareaにペーストした内容をevalして再帰的に中身たどるだけだけど便利。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-3710222723767542701?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/3710222723767542701/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=3710222723767542701' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3710222723767542701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3710222723767542701'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/06/json.html' title='JSON整形'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-1777718303612113633</id><published>2008-06-23T21:51:00.006+09:00</published><updated>2008-12-10T08:53:53.631+09:00</updated><title type='text'>那須ハイランドパークと日光江戸村</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-sif9wLT5H0/SF-daqHeHEI/AAAAAAAAAWE/EZRrqpwYv7k/s1600-h/IMGP1424.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_-sif9wLT5H0/SF-daqHeHEI/AAAAAAAAAWE/EZRrqpwYv7k/s200/IMGP1424.JPG" alt="" id="BLOGGER_PHOTO_ID_5215059974826105922" border="0" /&gt;&lt;/a&gt;２週間ほど休みなしで働いてたので代休とって那須行ってきました。&lt;a href="http://www.nasuhai.co.jp/"&gt;那須ハイランドパーク&lt;/a&gt;。平日のせいかガラガラだったので全部最前列で乗ってきました。１時間に３つも４つも絶叫マシンに乗ると吐きそうになるのでやめておいたほうがいいです。写真は那須ハイランドパークの中にある&lt;a href="http://www.nasuhai.co.jp/event/lego.html"&gt;レゴスタジアム&lt;/a&gt;。浅草が再現されてます。小さいころはレゴで遊ばなかったけど、等身大のレゴ見るとちょっと感動。


&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-sif9wLT5H0/SF-fEUFTgWI/AAAAAAAAAWM/cFIgQLSwMuo/s1600-h/IMGP1441.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_-sif9wLT5H0/SF-fEUFTgWI/AAAAAAAAAWM/cFIgQLSwMuo/s200/IMGP1441.JPG" alt="" id="BLOGGER_PHOTO_ID_5215061789977575778" border="0" /&gt;&lt;/a&gt;

次は&lt;a href="http://www.edowonderland.net/nikko/index.html"&gt;日光江戸村&lt;/a&gt;。ニャンまげ見てきました。ゆるゆるです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-1777718303612113633?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/1777718303612113633/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=1777718303612113633' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1777718303612113633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1777718303612113633'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/06/blog-post_23.html' title='那須ハイランドパークと日光江戸村'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-sif9wLT5H0/SF-daqHeHEI/AAAAAAAAAWE/EZRrqpwYv7k/s72-c/IMGP1424.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-1959112976969994321</id><published>2008-06-14T14:38:00.002+09:00</published><updated>2008-06-14T14:42:34.252+09:00</updated><title type='text'>岩手・宮城内陸地震</title><content type='html'>&lt;p&gt;発生8:43から6時間、もう正式な名前が付いたみたい。いやーびっくりした。ちょうど会社に行く直前でジェルで頭を固めてたところにどーんときて、手がベタベタなのにテレビとか本棚とか必死で押さえてた。CDラックとか花瓶とかが倒れたけどそんなに大きな被害なく済んでよかった...&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;いやでも震度6弱の余震があるかもっていうし、連動して触発されて宮城県沖地震が起こらないといいなぁ。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-1959112976969994321?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/1959112976969994321/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=1959112976969994321' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1959112976969994321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1959112976969994321'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/06/blog-post_14.html' title='岩手・宮城内陸地震'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-369970674531867947</id><published>2008-06-12T13:12:00.000+09:00</published><updated>2008-06-12T01:15:06.741+09:00</updated><title type='text'>もう梅雨ですね</title><content type='html'>気づけばまたこんなに間が開いて...

もう文章の体裁とかちゃんとまとめてからとかそういうのを気にしないでとりあえず出すっていうスタンスでやろう（ブログってそういう人のほうが多いよね？）品川庄司の品川にならって「誰の悪口も書かない」「愚痴を書かない」「楽しかった出来事を書く」「人の好きな部分を書く」の４つを守って！あ、でもIEの悪口は書いちゃうかも...

そんなゆるい意気込みでした。明日東京出張だからもう寝よ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-369970674531867947?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/369970674531867947/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=369970674531867947' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/369970674531867947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/369970674531867947'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2008/06/blog-post.html' title='もう梅雨ですね'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-6092290415352865901</id><published>2007-11-17T15:25:00.000+09:00</published><updated>2007-11-17T15:50:24.059+09:00</updated><title type='text'>SQLでツリー（木構造）を実装する　その３</title><content type='html'>&lt;p class="paragraph"&gt;
昨晩は24時からWebサーバ切り替え作業があって、切り替え後動作確認と多少の修正。
今日は9:30から客先リリース。無事完了してキモチが少し楽になりました。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
さて、SQLのツリーですが、ツリーの内容確認ができるようになったので、ツリーの操作方法を見ていきましょう。
&lt;/p&gt;

&lt;h4&gt;ノードの追加&lt;/h4&gt;

&lt;p class="paragraph"&gt;
まず追加です。
参照サイトの&lt;a href="http://www.geocities.jp/mickindex/database/db_tree_ns.html#LocalLink-ins_leaf" target="_blank"&gt;3-3．リーフを追加する&lt;/a&gt;を参考にしました。
まずUPDATEを実行して追加する場所に１ノード分の隙間を用意し、その後ノードをINSERTします。
以下のようなストアドファンクションになりました。
&lt;/p&gt;

&lt;pre class="code"&gt;
CREATE OR REPLACE FUNCTION section_add(integer, text)
  RETURNS void AS
$BODY$
DECLARE
  -- 親部署ID
  parent_section_id ALIAS FOR $1;
  -- 新規登録する部署名
  new_section_name ALIAS FOR $2;
  parent_section_rgt integer;
BEGIN
  -- 親部署のrgtを取得
  SELECT rgt
  INTO parent_section_rgt
  FROM section
  WHERE section_id = parent_section_id;

  -- 親部署が見つからない場合は処理中断
  IF NOT FOUND THEN
    RAISE EXCEPTION 'no such section: %', parent_section_id;
    RETURN;
  END IF;

  -- 新規部署の挿入前に場所を確保
  UPDATE section
  SET
    lft = CASE
      WHEN parent_section_rgt &lt; lft THEN lft + 2
      ELSE lft
    END,
    rgt = CASE
      WHEN parent_section_rgt &lt;= rgt THEN rgt + 2
      ELSE rgt
    END,
    update_time = now()
  WHERE parent_section_rgt &lt;= rgt;

  -- 更新に失敗した場合は処理中断
  IF NOT FOUND THEN
    RAISE EXCEPTION 'update failed';
    RETURN;
  END IF;

  -- 新しい部署を挿入
  INSERT INTO section(section_name, lft, rgt)
  VALUES(new_section_name, parent_section_rgt, parent_section_rgt + 1);

  -- 挿入に失敗した場合は処理中断ｎ
  IF NOT FOUND THEN
    RAISE EXCEPTION 'insert failed';
    RETURN;
  END IF;

  RETURN;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
パラメータは親部署のIDと、新規登録する部署名です。以下のように呼び出します。
&lt;/p&gt;

&lt;pre class="code"&gt;
SELECT section_add(1, '部署名');
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
親部署は必ず必要になるので、一からツリーを作成する場合は最低でもルートノードが必要になります。
ルートノードはlft=1, rgt=2で事前にINSERTしておきましょう。
処理に失敗した場合は例外が発生し、ファンクション内でトランザクションがロールバックされます。
&lt;/p&gt;

&lt;h4&gt;ノードの削除&lt;/h4&gt;

&lt;p class="paragraph"&gt;
追加の次は削除です。
参照サイトの&lt;a href="http://www.geocities.jp/mickindex/database/db_tree_ns.html#LocalLink-del_node" target="_blank"&gt;3-2．単一ノードの削除&lt;/a&gt;を参考にしました。
単純に指定したノードの情報を消すだけなので、例えばulを削除するとその下にあったliはbodyに含まれることになり、
ulの下をまとめて消すような動作はしません。
まとめて消したい場合は&lt;a href="http://www.geocities.jp/mickindex/database/db_tree_ns.html#LocalLink-del_sub" target="_blank"&gt;3-1．部分木の削除&lt;/a&gt;を参照してください。
（ウェブ画面のほうでリーフでないノードは削除が実行できないようにしたので、単一の処理しか実装していません。）
ストアドファンクションは以下のようになりました。
&lt;/p&gt;

&lt;pre class="code"&gt;
CREATE OR REPLACE FUNCTION section_delete(integer)
  RETURNS void AS
$BODY$
DECLARE
BEGIN
  -- 削除
  -- この部署の下層に部署が存在する場合は、下層の部署が２世代上に直接属すようになる
  DELETE FROM section
  WHERE section_id = $1;

  -- 削除されたかチェック
  IF NOT FOUND THEN
    RAISE EXCEPTION 'no such section: %', $1;
    RETURN;
  END IF;

  -- 欠番を埋める
  PERFORM section_pack();

  RETURN;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
以下のように実行します。
&lt;/p&gt;

&lt;pre class="code"&gt;
SELECT section_delete(5);
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
「欠番を埋める」という処理が入っていますが、これはノードの削除によって生じたlftとrgtの値の隙間を埋める処理です。
ルートノードから順にノードをどんどん登録していくと、lftとrgtを並べた値は1から始まる連番になり、あいだが空かないはずなのです。
ノードの表示や追加では欠番を埋めなくても処理に影響はありませんが、
欠番があるとlftとrgtの差が1であるノードはリーフノード（子孫がいればlftとrgtの間に最低2以上の差があるはずですよね？）という簡単なリーフノード確認が行えなくなり、不便なことがあるので埋めておきましょう。
&lt;/p&gt;

&lt;h4&gt;欠番を埋める&lt;/h4&gt;

&lt;p class="paragraph"&gt;

参照サイトの&lt;a href="http://www.geocities.jp/mickindex/database/db_tree_ns.html#LocalLink-close_gap" target="_blank"&gt;3-6．添え字の欠番を埋める&lt;/a&gt;を参考にしました。
欠番を埋めるには２ステップ必要です。
まずビューの作成。
&lt;/p&gt;

&lt;pre class="code"&gt;
CREATE VIEW v_section_lr AS
SELECT section.lft AS seq FROM section
UNION ALL 
SELECT section.rgt AS seq FROM section;
&lt;/pre&gt;

&lt;p class="paragraph"&gt;

lftとrgtの値を取り出して１つの列に入れただけの簡単なビューです。
欠番がなければこのビューのseq列は1から始まる連番になっているはずですが、
欠番がある場合は連番になっていません。
&lt;/p&gt;

&lt;p class="paragraph"&gt;

連番ビューが準備できたらsection_packを定義します。
&lt;/p&gt;

&lt;pre class="code"&gt;
CREATE OR REPLACE FUNCTION section_pack()
  RETURNS void AS
$BODY$DECLARE
BEGIN
  -- 欠番を埋める
  UPDATE section
  SET
    lft = (
      SELECT count(*)
      FROM v_section_lr
      WHERE seq &lt;= lft
    ),
    rgt = (
      SELECT count(*)
      FROM v_section_lr
      WHERE seq &lt;= rgt
    ),
    update_time = now();

  IF FOUND THEN
    RETURN;
  ELSE
    RAISE EXCEPTION 'section_pack failed';
  END IF;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
実行後は掃除をしたような気持ちよさ。
不要なバグを避けるためにも入れておきましょう。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
追加・削除ときたので、次は並べ替えです。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-6092290415352865901?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/6092290415352865901/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=6092290415352865901' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/6092290415352865901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/6092290415352865901'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/11/sql.html' title='SQLでツリー（木構造）を実装する　その３'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-283436602262353710</id><published>2007-10-31T18:16:00.000+09:00</published><updated>2008-12-10T08:53:53.928+09:00</updated><title type='text'>SQLでツリー（木構造）を実装する　その２</title><content type='html'>&lt;p class="paragraph"&gt;
昼休みにいそいそと。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
ではまず部署テーブル（section）を作成します。
前回に引き続いて以下の入れ子集合モデルを説明しているミックさんのサイト（以後参考サイト）を参考にします。
&lt;/p&gt;

&lt;a href="http://www.geocities.jp/mickindex/database/db_tree_ns.html" target="_blank"&gt;SQLで木と階層構造のデータを扱う（１）―― 入れ子集合モデル&lt;/a&gt;

&lt;pre class="code"&gt;
CREATE TABLE section
(
  section_id serial PRIMARY KEY, -- 部署ID
  section_name character varying(256) NOT NULL, -- 部署名
  lft integer NOT NULL, -- 左
  rgt integer NOT NULL, -- 右
  entry_time timestamp without time zone DEFAULT now(), -- 登録時間
  update_time timestamp without time zone DEFAULT now() -- 更新時間
);
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
前エントリのものと比較して、parent_section_idとdisplay_orderがなくなり、lftとrgtが追加されました。
lftはleft、rgtはrightのことですが、PostgreSQLのキーワードになってしまうのでこのような列名になっています。
（参考サイトでも同じように書かれています）
テーブルを作成したら以下のようなINSERT文を実行してデータを登録しましょう。
一応部署ツリーということですが、適当な部署名が思い浮かばなかったのでHTMLのDOMツリーを部署の代わりにしてみました。
ルートノードがhtmlでその直下にはheadとbodyがあり、さらにその下に複数のタグが存在します。
&lt;/p&gt;

&lt;pre class="code"&gt;
INSERT INTO section(section_id, section_name, lft, rgt) VALUES (1, 'html', 1, 26);
INSERT INTO section(section_id, section_name, lft, rgt) VALUES (2, 'head', 2, 9);
INSERT INTO section(section_id, section_name, lft, rgt) VALUES (3, 'body', 10, 25);
INSERT INTO section(section_id, section_name, lft, rgt) VALUES (4, 'title', 3, 4);
INSERT INTO section(section_id, section_name, lft, rgt) VALUES (5, 'link', 5, 6);
INSERT INTO section(section_id, section_name, lft, rgt) VALUES (6, 'script', 7, 8);
INSERT INTO section(section_id, section_name, lft, rgt) VALUES (7, 'h1', 11, 12);
INSERT INTO section(section_id, section_name, lft, rgt) VALUES (8, 'p', 13, 14);
INSERT INTO section(section_id, section_name, lft, rgt) VALUES (9, 'h2', 15, 16);
INSERT INTO section(section_id, section_name, lft, rgt) VALUES (10, 'ul', 17, 24);
INSERT INTO section(section_id, section_name, lft, rgt) VALUES (11, 'li', 18, 19);
INSERT INTO section(section_id, section_name, lft, rgt) VALUES (12, 'li', 20, 21);
INSERT INTO section(section_id, section_name, lft, rgt) VALUES (13, 'li', 22, 23);
&lt;/pre&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-sif9wLT5H0/RzfOhAKP6iI/AAAAAAAAACI/cAbDmChAdmk/s1600-h/html_tree.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_-sif9wLT5H0/RzfOhAKP6iI/AAAAAAAAACI/cAbDmChAdmk/s320/html_tree.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5131797366785960482" /&gt;&lt;/a&gt;

&lt;p class="paragraph"&gt;
このツリーを元にいろいろ操作する処理を考えてみたいと思います。
操作は複数のSQLを実行するため、PostgreSQLのストアドファンクションに処理をまとめて実行します。
（PL/pgSQLが使えない環境の場合は事前にcreatelangコマンドでストアドファンクションが使えるようにする必要があります。）
&lt;/p&gt;

&lt;h4&gt;ツリーの取得&lt;/h4&gt;

&lt;p class="paragraph"&gt;
追加や削除をする前に、操作が正しく反映されたかどうか確認するためにツリーを表示できるようにしておくとよいでしょう。
いつもはウェブアプリ上でYahoo! UI Libraryのツリーで表示を実装してしまうのでそこで確認できるのですが、
ウェブアプリ作らないといけないので手間がかかります。
SQLひとつでツリー構造が分かるような問合せを覚えておきましょう。
&lt;/p&gt;

&lt;pre class="code"&gt;
SELECT section_id, section_name
FROM section
ORDER BY lft;
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
このようにlftの昇順でデータを取り出すと、親子関係は分かりにくいですがノードの一覧は確認できます。
階層が深くなるにつれてインデントされるようにするには以下のようにします。
（参照サイトの&lt;a href="http://www.geocities.jp/mickindex/database/db_tree_ns.html#LocalLink-all" target="_blank"&gt;2-4．木をインデント付きで表示する&lt;/a&gt;を参考にしました。）&lt;/p&gt;

&lt;pre class="code"&gt;
SELECT child.section_id,
  lpad(
    child.section_name,
    length(child.section_name) + cast(count(parent.section_id) - 1 AS integer) * 4,
    ' '
  )
FROM section AS parent, section AS child
WHERE child.lft BETWEEN parent.lft AND parent.rgt
GROUP BY child.section_id, child.section_name, child.lft
ORDER BY child.lft;
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
インデントするには自分がどのぐらいの深さにいるのか知る必要がありますが、
深さは自分を囲む行が何件あるか調べれば得られます。
parentとchildを直積で取得して「WHERE child.lft BETWEEN parent.lft AND parent.rgt」としてparentの内側にあるchildを絞り込んで件数を取得します。
取得した件数をlpad関数のパラメータに渡して深さの分だけ空白を表示するようにしました。
これをビューとして登録しておくと便利です。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
次回は追加・削除です。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-283436602262353710?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/283436602262353710/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=283436602262353710' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/283436602262353710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/283436602262353710'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/10/sql_31.html' title='SQLでツリー（木構造）を実装する　その２'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-sif9wLT5H0/RzfOhAKP6iI/AAAAAAAAACI/cAbDmChAdmk/s72-c/html_tree.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-1989784018923113994</id><published>2007-10-31T11:53:00.000+09:00</published><updated>2007-11-07T18:28:57.855+09:00</updated><title type='text'>SQLでツリー（木構造）を実装する　その１</title><content type='html'>&lt;p class="paragraph"&gt;
また「その１」とかタイトルにつけてみました。続けられるようにがんばります。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
SQLで部署構造のようなツリーを実装するときに、
これまで以下のようなテーブルを作成してツリー構造を実現していました。
&lt;/p&gt;

&lt;pre class="code"&gt;
CREATE TABLE section
(
  section_id serial NOT NULL, -- 部署ID
  parent_section_id integer, -- 親部署ID
  section_name character varying(256) NOT NULL, -- 部署名
  display_order integer NOT NULL, -- 表示順
  entry_time timestamp without time zone DEFAULT now(), -- 登録時間
  update_time timestamp without time zone DEFAULT now(), -- 更新時間
  CONSTRAINT section_pkey PRIMARY KEY (section_id) -- 主キー
);
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
部署（sectionという名称にしました）に親部署のIDを保持するparent_section_idという情報を持たせ、
ルートノードになるものはparent_section_idがnullで、
それ以下のノードは必ず親部署のIDを持つという仕組みです。
単純で理解しやすく、部署の新規登録・削除・順番入れ替えが楽であるという反面、
「○○株式会社 &gt; △△支店 &gt; □□部 &gt; ほげほげグループ」というルートからのパスを取得するには何回もテーブルを結合時なければいけなかったりして、プログラム側で再帰的な処理をする必要があったりします。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
なにかもっとスマートなSQLによるツリー実装がないものかと思って検索したところ購読しているMySQLのメーリングリストにヒントがありました。
&lt;/p&gt;

&lt;a href="http://www.mysql.gr.jp/mysqlml/mysql/msg/13684" target="_blank"&gt;[mysql 13684] 木構造の効率的表現&lt;/a&gt;

&lt;p class="paragraph"&gt;
さらに以下のサイトにたどり着きました。
&lt;/p&gt;

&lt;a href="http://www.geocities.jp/mickindex/database/db_tree_ns.html" target="_blank"&gt;SQLで木と階層構造のデータを扱う（１）―― 入れ子集合モデル&lt;/a&gt;

&lt;p class="paragraph"&gt;
ワンダホー☆まさに求めていたのはこれです。
詳しい説明は上記のサイトが非常に分かりやすいのでここで改めて説明はしませんが、
（というよりこのサイトよりうまく説明できないわけですが...）
PostgreSQL 8.1を使ってストアドファンクションを使いながら実装をしてみました。
その２以降でその実装を紹介できればと思います。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-1989784018923113994?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/1989784018923113994/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=1989784018923113994' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1989784018923113994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1989784018923113994'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/10/sql.html' title='SQLでツリー（木構造）を実装する　その１'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-1424912834073935815</id><published>2007-09-09T14:07:00.000+09:00</published><updated>2007-09-09T14:35:45.564+09:00</updated><title type='text'>"data"URLスキームをimgのsrcだけでなくCSSでも使える</title><content type='html'>&lt;p class="paragraph"&gt;
以下のようなコードを書くことでGreasemonkeyのような画像を配布できない環境でもJavaScriptコードの中に画像を埋め込めることを先日知りました。すごく便利です。画像に限らずCSSなどにも応用できそう。
&lt;/p&gt;

&lt;pre class="code"&gt;document.getElementById('image').src = "data:image/png;base64," +
 "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABGdBTUEAANkD" +
 "QtZPoQAAAAlwSFlzAAALEwAACxMBAJqcGAAAACJ0RVh0U29mdHdhcmUAUXVp" +
 "Y2tUaW1lIDcuMiAoTWFjIE9TIFgpAP77GIsAAAAHdElNRQfXCQkFEBDiSWsS" +
 "AAAMOklEQVR4nO3ae4xcV30H8O99v+a1M+udfe9613FiYiex09CEUFVqHBJE" +
 "ggSEFKIUUf6glSCiRYCAiojwqIRaBBEKRYCEUESEgASCWhlCsBwccFQSv4jt" +
 "jb3r9T68z5md98x9X353vKah/3rFZEe/j3x8x9bdmTn7+51zfufeCzDGGGOM" +
 "McYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOM" +
 "McYYY4wxxhhjjLG/KKHTX+ANT5B1Uc0MaGbfWKpv1012q16rzB/+Xqe/1laR" +
 "O/0F/kLMRMLaMz4+vm90bHyXZSXSlmXF2V+fmjp3aXp6+mypVJryfX8dkFRB" +
 "SecVo3fUzAzvTu/YeUPP4K7r0/3jEz2Dk5OzZ88snuIE2B4sy7z17rvv/Yf3" +
 "/P2H7t170+27TFmVdBUwDAGO5OPyah2Fko+1ooOpi6uNmYViveIIoZzIJUU9" +
 "nfAiOi8AvEBAi9IllHQU63K20/3aSl2ZAJIkjT708MOff8+/fOEhu9GnGc0I" +
 "y8UGUmIdSRPwPRFP/2YeR2YE+IIM1wcFOmV5SFuBQm/gi5AcCYomQ01IyCRU" +
 "6KaM2ZkSFleKUaf7t5W6LgGyPT0Hv/Hsj7+7NnBg7KWpMnLSBoaFBLKhCl8K" +
 "4PshAj/C83MiFgohVFNsB1qxJFiqDFml4CsiVE2Cbsjt15WKg5dPLGNhuQmo" +
 "3VU2dVUC9Pfl3/nDV59/6sVs2mpOt2BkFLgNH+tRC5ptQhLp36JDSUCDmP7k" +
 "RzKQdAqyHCeBBE2PR71IUwhN+W6IpZKDOQr68oaDkH5W6MsgWuuqX1n3JICu" +
 "Gbf86LdPff9kYsESSy1Yvb3wZQP+UoBGw0UhpAA7KhTRh+sFiCgBElkDOiUJ" +
 "RAq4F2KtGaCwQefWQ5QdWh4gARot+UOUFHYLUbmK9g92kW5JAO2L//G5J4rj" +
 "Gxl/2YcmeghUB0ImD09Iwr0MbNQcqDaNdkGBLFxJgMyQhZn1Fs7Nu6j6EsIo" +
 "/nUY7dkBfgDDdzHo1TCZDrFrLMJPVtcaNVVSWp3u7RbqigQYGx1/8H2PvPUt" +
 "R705ZNIy7GYDruvRFt5BlOqHHWXhzUdYqrYg1w1IkdhOgI2yg2NHVqBpGkZS" +
 "MiZ6BOzuk7BvWMWeYQMTA2n053TIVAeE9DmLtdB6aX3e4QR4Y5E+9vF//Gdg" +
 "BZOKghrN6GXa5lWbHurNAhV8tIEzG7AH87Bd6m7VA1z64waoTK/gI3vX8K63" +
 "XYc3XTeMhKFBoVP0zTqPzmxvA1tuXDwGkGmpMA1NJbtd1z3f0V5vEbHTX+Ba" +
 "qZp24/vvu/O2aL2G3oaH4cDHLiXERJqKwlyIlF6G6s9AMC6gOVjDQriKs8W5" +
 "yAu8cOXM6ejgfqPZ2FjxZmdmKSnsdvBpV0hLQoRS00W5VkelWkO9XkPgUVUg" +
 "CsLDH/jgY53u91bZ9gkwMjzy1xlLVdRVGeZchOSsj8xlF/0lG7siB9dnPOzM" +
 "NbDDmIPinUAkXPRvGKgty1LoCUIUJQ1h3VLCZbtRrZx77VKwWm6gGBeNpQpK" +
 "pTJqtRpazRYcx2nPAgIVCI987OPvtixrf6f7vhW2fQKMj4/t9jIW/N48wlSO" +
 "ekRbu5oB47KIzLSPodkW9lRauBl1jNgF3J7CqlBbWwyCMAjDKDr868Ony5Vy" +
 "uVRYmWtWS6Vfv3AsXFpaQZ0qfqfeQNC0EbVoGWnZQBBXAhGylqX+3V0HH+50" +
 "37fCtk+AgcGBfjVQaepOQFHSEI0shGQvxGQfJK0XuptFdt3CwJyICVcM9Fa0" +
 "YaXSarFYKHs05//7Fx974NOf/MQTLdtxm/XySlivNAtnz8JolGHUy9DpqLeq" +
 "0GzaAoZ+ewaQ3TIefOCBg/TxWqf7f622fQIoiipLHlXqngnFMWirZ7Qv+qhO" +
 "EpqfhYo+qMIwrGAEO2oZGFTyS7IkeZ7nbr6FO33h/LdPnTxxyfU82zRQ9ypT" +
 "MMUV6EoBulaGplagqjU6NaTwR5CkCm478KZJwzDGO9j1LbHtdwFr64UN17eo" +
 "gPMRUMUe0l9BENExpBk7uvKatnyeEKEeFSVZUTOF9aW5bE92rFGtxgPAMk3z" +
 "pt7e3qTdtO1IaQVNdQF+qNNWUachYtB2UkVELURP+xqBpzSQSSStXK53dHFx" +
 "4bVO/w6uxbZPgEuzszM2BcoWXAQUTp8C7YsUeJkaBcuPrhwFSYImamjUGj19" +
 "/cO2qvkybee0z37u0WcGBgZTuWxWEUUpOlWfT+VvNLA86iHZCGC4DiRPhmjL" +
 "iMIEJVNIyVaGpKeh6fq2vzPYDQnwvxstOxI1XfDbo54aBZ0KvHaLt/SKKMVL" +
 "Bfr6+uC2HGV2dmFAUWoCBAG3v+WtE47TotlfkI+uLvde0L3kHQM7cVZVMZSM" +
 "FxABCdoSKraPUNh8z3oRkpyJZ5uw0/2/Vts+ARqN+vHDz//qtbvvv+8GRF47" +
 "4CIlgEDBja/gSZJMwddgWTpypoyqoaNYLClhVKdzBVy6WB5YXRWEU+VAnU8m" +
 "5bG7344NJYLu05qvCLBlCTlaCVK6DycSKAkENMdENBtORDPIeqf7f622fQKQ" +
 "5nf+64kf3nP/Oz8v0TQvCBR0aiK9joNPaz6ShoIUBbNkByiWashmM1C1jXaS" +
 "ZDIZyy6L2L2jD7kdGTSp2HdaGpYpAY7/qIA9EyOAqmB6toy5agMuDfpylirF" +
 "VW+jVCrPdrrz12rb7wJix4+//P1XXnppTVF16IYBwzRhGiashIlemsbTFPyK" +
 "G6FUbdJOzofnB/DcuKIXMDDah+t25TGW1TEiqej1LIQrJs78oIGD99yKiBJj" +
 "ydHRMtOoCSoarowLXhpTv18+WSisLXa679eqG2YAOQzDhX/71L9+9dCR330l" +
 "2ZNpV+qqLMCUEN/QxbnlFr71zDQy1+fao3mGRvOCo8L1QnhhACrwkVCpiJRD" +
 "qJQEr5wsUrGo4+hZAZfXQ6xWFFxe9lBBgpIrhVIpg2P//dSP6XODTnf+WnXD" +
 "DBD3ITk1NfXkVx579Dmq0pDWBCQ3g1+0Q3z5yfO48b49fxrNzc3RHN8cciOx" +
 "vdbHzwrqgoce2kHolBi/P1nDsy9U8eJigLOuiMq4CWFnAlafBOtU6cIvDh16" +
 "utMd3wpSp7/AFohnMZOacuLEK38YzA/c+eY3/1UuzgqH2k8PL+K580DdyOLM" +
 "xQhTlwWcvhCg5AFas4y7DvRAjqT2c4AB7SMFTUFvPonT55ZRTNFyMKlDyNM2" +
 "slaH9odZPPLhPJ79xCc/M33x4ovogsfquyEB4sc440uyqSiKhCOHnz+/Iz90" +
 "YM/N+9MOLQWnzhXwnf+p4mLLxEVHwioViE5ehpAQ0F9cxYEbeqArVCxSAsSP" +
 "ikU0oRgJBXv37YC9tg7/3CrMmVUMCTV88KNDqHzrq089+7OffwNXbhpu+yWg" +
 "GxIgngHiftBmDRnf98Nf/fLQdOAHO/ftO5AbzJs4fGwRi1byz0az+fIM3ntH" +
 "BsN9JnT6aTm+YuhvNllEgnYOExNpTN6SwtDeJO762xzcJ5848s2vPf5lPwjK" +
 "lGw2OAHeEOLZ/upUHPfHCILAO/qbF6bOnD6h3rp//8iD90yK4fwynDPLyJxf" +
 "wm3NdXz4YBo3jtFOgQo/RQygxtd0qMWXkMNQQCAJ8JrxAyERbur18Orjjz73" +
 "za8//p+u5y3RZ8Q3BuIE2PYPCG77NQxXgh63eCmIa4H48uyOzWO6p6fn5ve9" +
 "/6G3feBD/7Q3NzAkVFseavUWHNdDfOUQUQiRmtyiiFYjVOsRWr6CKJNEKitj" +
 "bfboyvce/9LTJ06e+hm9Xxz8ArUKrjwwFGGbJ0E3JID4umOcCHE9YFFLb7YE" +
 "tVwqldp3551/c8e977h/795bbs3rtCRAlNo3jKI4ATwBIY3plkPbvWrRffXV" +
 "Y/O/OPTMsePHjz/nef45eo8ytRK1Brok+LFuSICY8Lpj+2ow/q84NHBlZohr" +
 "hDgx+hOJxGQ+nx8fGR0bpWNOVVXF81x3fW2tODd3aW5lZWW6Xm9M07mXcWW6" +
 "r1OjBSF+mvBP6/62D36sWxLg/3t9QlydGeJ2tWC8+n+0+28nRvw6Dqi72fzN" +
 "Fr/2Nl9fvfHTFYFnjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHG" +
 "GGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxljn/BEN1h4oiva4uAAAAABJRU5E" +
 "rkJggg==";&lt;/pre&gt;

&lt;p class="paragraph"&gt;
imgタグのsrc属性に上記のように代入するだけでなく、
CSSの「background-image: url(ファイル名)」のファイル名の部分に直接埋め込んでも動くようなので、
JavaScriptからobj.style.backgroundImage = "url(data:...."のように記述しても意図した通りに動作するようです。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
試しに画像をアップロードするとURLスキームを生成するサンプルを作ってみました。
&lt;/p&gt;

&lt;a href="http://pgmon.heteml.jp/n/dsg/" target="_blank"&gt;dataスキーム生成&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-1424912834073935815?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/1424912834073935815/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=1424912834073935815' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1424912834073935815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1424912834073935815'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/09/dataurlimgsrccss.html' title='&quot;data&quot;URLスキームをimgのsrcだけでなくCSSでも使える'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-9188816683139155401</id><published>2007-09-03T18:24:00.000+09:00</published><updated>2007-09-03T18:25:45.190+09:00</updated><title type='text'>なんちゃって擬人情報リリース</title><content type='html'>&lt;p class="paragraph"&gt;
ダミーの個人情報ジェネレータ&lt;a href="http://pgmon.heteml.jp/n/gi/" target="_blank"&gt;なんちゃって擬人情報&lt;/a&gt;を公開しました。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
ご存知の方もいるかと思いますが、
完全に&lt;a href="http://kazina.com/dummy/" target="_blank"&gt;なんちゃって個人情報&lt;/a&gt;さんの二番煎じです。
パクリです。自分好みの機能を載せたかっただけです。
よろしければご使用ください。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-9188816683139155401?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/9188816683139155401/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=9188816683139155401' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/9188816683139155401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/9188816683139155401'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/09/blog-post.html' title='なんちゃって擬人情報リリース'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-3827818114912129977</id><published>2007-08-29T16:59:00.001+09:00</published><updated>2008-12-10T08:53:54.315+09:00</updated><title type='text'>Gzip components</title><content type='html'>&lt;p class="paragraph"&gt;
パフォーマンス計測で話題になっている&lt;a href="http://developer.yahoo.com/yslow/" target="_blank"&gt;YSlow for Firebug&lt;/a&gt;を試してみたところ、
予想に違わず自分の作成したサイトではF判定を食らってしまいました。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
それもそのはずで、チューニングなるものはPHPのアクセラレータとデータベースの発行クエリぐらいしかやっていません。
そこでYSlowの「4. Gzip components」を試してみました。
今回試すプロジェクトではYahoo! UIをふんだんに使っているので、そこだけでもトータル数十kbのJSソース読み込みがあります。
Firebugで見たチューニング実施前の読み込みは以下のような感じ。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-sif9wLT5H0/RtUnkicf1cI/AAAAAAAAAA8/hiY8nF0jRa0/s1600-h/yslow_before.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_-sif9wLT5H0/RtUnkicf1cI/AAAAAAAAAA8/hiY8nF0jRa0/s320/yslow_before.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5104029261369431490" /&gt;&lt;/a&gt;

&lt;p class="paragraph"&gt;
まずこれらのjsファイルのgzip圧縮ファイルをjsファイルを置いてある同じ場所に作成しました。
以下のような感じ。
&lt;/p&gt;

&lt;pre class="code"&gt;$ gzip -c yahoo-min.js &amp;gt; yahoo-min.js.gz&lt;/pre&gt;

&lt;p class="paragraph"&gt;
gzipコマンドはそのまま実行するとファイル置き換えちゃうので、-cで標準出力に出して.gzを付けたファイル名に保存します。
ファイル増えると面倒なので、一括でgzipするシェルスクリプトでも書くと楽ですね。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
ブラウザからこのできあがったgzファイルにアクセスしても、
ダウンロードダイアログが表示されたりしてJavaScriptファイルとして扱ってくれません。
HTTPヘッダを多少書き換えてやらないといけないようです。
Yahoo! UIの置いてあるフォルダに.htaccessを作って以下のように書きました。
&lt;/p&gt;

&lt;pre class="code"&gt;&amp;lt;FilesMatch &amp;quot;\.js\.gz$&amp;quot;&amp;gt;
    ForceType application/x-javascript
    Header append Content-Encoding gzip
&amp;lt;/FilesMatch&amp;gt;&lt;/pre&gt;

&lt;p class="paragraph"&gt;
拡張子が.js.gzで終わるファイルのMIMEタイプを強制的にapplication/x-javascriptに変更しました。
さらにContent-Encodingヘッダもappendします。
これでFirefoxから直接yahoo-min.js.gzを開いても正しくJavaScriptファイルとしてみることができます。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
圧縮したjsファイルに正しくアクセスできることが分かったら、
scriptタグのsrc属性に指定したJavaScriptファイルのURLを変更します。
今回はまんま.js.gzに変更しましたが、Safariでは正しく動作しないなどのケースがあるようなので、
ちゃんとブラウザを判別して.jsと.js.gzを切り替えたほうがよさそうです。
さて、変更後のFirebugの読み込み結果は以下のような感じ。
&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-sif9wLT5H0/RtUnyycf1dI/AAAAAAAAABE/5ZcpCplpgvw/s1600-h/yslow_after.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_-sif9wLT5H0/RtUnyycf1dI/AAAAAAAAABE/5ZcpCplpgvw/s320/yslow_after.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5104029506182567378" /&gt;&lt;/a&gt;

&lt;p class="paragraph"&gt;
gzipしたことでファイルサイズはトータル100KBから29KBまで減少。結構減りますね。
読み込み時間はこの計測ではトータル312msだったのが188msまで短くなり、60%ぐらいになりました。
ランクはどうなったかというと...「F」
どうやら他にもjsファイルとcssファイルがあるのですが、すべてgzipしないとランクは上がらないようです。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-3827818114912129977?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/3827818114912129977/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=3827818114912129977' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3827818114912129977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3827818114912129977'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/08/gzip-components.html' title='Gzip components'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-sif9wLT5H0/RtUnkicf1cI/AAAAAAAAAA8/hiY8nF0jRa0/s72-c/yslow_before.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-7743264431133190012</id><published>2007-08-17T17:48:00.000+09:00</published><updated>2007-08-17T17:55:46.224+09:00</updated><title type='text'>Greasemonkeyで遊ぶ（その２）</title><content type='html'>&lt;p class="paragraph"&gt;
前回のエントリを書いた後に夏休みを取りました。
妻の実家と自分の実家の行き来だけでしたが、どちらの家も小さい子がいるのでとてもにぎやか。
我が家に親戚が８人も来て楽しい一晩でした。
しかし暑い！
今日はひっそり会社に戻ってきたので前回のエントリの続きをば。
&lt;/p&gt;

&lt;h4&gt;Pitfall #6: scrollIntoView（落とし穴６：scrollIntoView関数）&lt;/h4&gt;

&lt;p class="paragraph"&gt;
このscrollIntoViewという関数も初めて知ったのですが、
特定のオブジェクトのある場所へ画面をスクロールさせる関数のようです。
通常のページでは以下のようにしてfooというオブジェクトのある場所へJavaScriptでスクロールすることができます。
&lt;/p&gt;

&lt;pre class="code"&gt;var elmFoo = document.getElementById('foo');
elmFoo.scrollIntoView();&lt;/pre&gt;

&lt;p class="paragraph"&gt;
これもこれまでのケースに漏れずgetElementByIdで取得しているため、
GreasemonkeyではXPCNativeWrapperオブジェクトが返されてしまい
ラッピングされているオブジェクトのscrollIntoView関数をコールしてくれません。
これを回避するためにはラッパであるXPCNativeWrapperではなく本物の（本物のという表現が正しいかアレですけども）
エレメントを取得し、そのエレメントのscrollIntoView関数を呼び出してやればよいわけです。
XPCNativeWrapperにラッピングされているエレメントを取得するのにwrappedJSObjectというプロパティを使用します。
&lt;/p&gt;

&lt;pre class="code"&gt;var elmFoo = document.getElementById('foo');
var elmUnderlyingFoo = elmFoo.wrappedJSObject || elmFoo;
elmUnderlyingFoo.scrollIntoView();&lt;/pre&gt;

&lt;p class="paragraph"&gt;
ただし、原文に「It is important to note that this is vulnerable to a malicious remote page redefining the scrollIntoView method to do something other than scrolling the viewport. There is no general solution to this problem.」とあるとおり、ビューをスクロールさせる以外の目的でscrollIntoViewを再定義している悪意のあるページに対しては脆弱であることに注意する必要がありそうです。
&lt;/p&gt;

&lt;h4&gt;Pitfall #7: Location（落とし穴７：ロケーション）&lt;/h4&gt;

&lt;p class="paragraph"&gt;
通常のページで別のページに移動するときにはlocation.href = &amp;quot;http://...&amp;quot;のように（もしくはwindow.location.hrefのように）書きますが、
window.location = &amp;quot;http://...&amp;quot;のように書いても別ページに移動できるようです。（知らなかった...）
ただしこれがGreasemonkeyでは使えないとのこと。
（windowオブジェクトもXPCNativeWrapperだから、だそうです）
ちゃんとwindow.location.hrefにURLを代入するようにしましょう。
&lt;/p&gt;

&lt;h4&gt;Pitfall #8: Calling Remote Page Scripts（落とし穴８：別サイトのスクリプト呼び出し）&lt;/h4&gt;

&lt;p class="paragraph"&gt;
GmailのようなサイトをGreasemonkeyでカスタマイズして拡張する場合、
既にそのサイトで定義されている関数などを呼び出すケースがあります。
以下のような感じ。
&lt;/p&gt;

&lt;pre class="code"&gt;var searchForm = getNode(&amp;quot;s&amp;quot;);
searchForm.elements.namedItem(&amp;quot;q&amp;quot;).value = this.getRunnableQuery();
top.js._MH_OnSearch(window, 0);&lt;/pre&gt;

&lt;p class="paragraph"&gt;
しかし、落とし穴７で取り上げたとおりwindowオブジェクトもXPCNativeWrapperなので、
上記の例の３行目のようにそのままwindowを渡しても動く保証がありません。
このような状況を回避するためには、windowの代わりにunsafeWindowを使います。
&lt;/p&gt;

&lt;pre class="code"&gt;var searchForm = getNode(&amp;quot;s&amp;quot;);
searchForm.elements.namedItem(&amp;quot;q&amp;quot;).value = this.getRunnableQuery();
top.js._MH_OnSearch(unsafeWindow, 0);&lt;/pre&gt;

&lt;h4&gt;Pitfall #9: watch（落とし穴９：watch関数）&lt;/h4&gt;

&lt;p class="paragraph"&gt;
watch関数なるものをはじめて知りました。
Firefoxで以下のようなプログラムが動くようです。
（以下の例ではFirebugのconsole.log関数も使っています。）
&lt;/p&gt;

&lt;pre class="code"&gt;var city = {'name':'Sendai'};
city.watch('name', function(prop, oldval, newval){
 console.log('prop = ' + prop + ', oldval = ' + oldval + ', newval = ' + newval);
});
city.name = 'Natori';//watch関数の第２引数に渡した関数が呼び出される&lt;/pre&gt;

&lt;p class="paragraph"&gt;
この関数を使えばプロパティの設定を監視できるわけですね。
Greasemonkeyではwindowのプロパティを監視するのにwindow.watchと書くと動かないのでunsafeWindow.watchと書かなければいけないようです。
&lt;/p&gt;

&lt;h4&gt;Pitfall #10: style（落とし穴１０：style属性）&lt;/h4&gt;

&lt;p class="paragraph"&gt;
いよいよ10個目。
通常のページでは以下のようにJavaScriptから特定のエレメントのstyle属性を変更できます。
&lt;/p&gt;

&lt;pre class="code"&gt;var elmFoo = document.getElementById(&amp;quot;foo&amp;quot;);
elmFoo.setAttribute(&amp;quot;style&amp;quot;, &amp;quot;margin:0; padding:0;&amp;quot;);&lt;/pre&gt;

&lt;p class="paragraph"&gt;
GreasemonkeyではgetElementByIdで取得するエレメントがXPCNativeWrapperであるため、
これも期待通りに動いてくれません。
以下のように個々にスタイルを指定する必要があります。
&lt;/p&gt;

&lt;pre class="code"&gt;var elmFoo = document.getElementById("foo");
elmFoo.style.margin = 0;
elmFoo.style.padding = 0;&lt;/pre&gt;

&lt;p class="paragraph"&gt;
以上前回のエントリと合わせて10個の落とし穴を簡単に書きましたが、
落とし穴以外のセキュリティホールやセキュリティ上気をつけるべきことは省略しました。
公開するスクリプトを作成する方はオリジナルの記事にきちんと目を通してセキュリティに気を配ることを強くお勧めします。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-7743264431133190012?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/7743264431133190012/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=7743264431133190012' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/7743264431133190012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/7743264431133190012'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/08/greasemonkey_17.html' title='Greasemonkeyで遊ぶ（その２）'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-7293906015046802203</id><published>2007-08-13T19:08:00.000+09:00</published><updated>2007-08-13T19:17:46.124+09:00</updated><title type='text'>Greasemonkeyで遊ぶ（その１）</title><content type='html'>&lt;p class="paragraph"&gt;
仕事中になかなかRubyを書くわけにもいかず、やっぱりJavaScript書いてることのほうが多い今日この頃はGreasemonkeyで自分好みにいろんなサイトを変更するのが仕事の合間のマイブームになりました。
Greasemonkey用に書いたソースはちょこっとだけ書き換えればOperaでも動くので、
普通のブラウジングをOperaに頼ってる私としては重宝します。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
GreasemonkeyではCSSはJSから出力するしかないので、
まずGreasemonkeyじゃない普通のページでやりたい処理を実現してからそれをJSで出力するように移行するように作業をしています。
そこで以下のような例外に遭遇。
&lt;/p&gt;

&lt;pre class="code"&gt;uncaught exception: [Exception... "Component is not available" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: file:///C:/Documents%20and%20Settings/[省略]/components/greasemonkey.js :: anonymous :: line 700" data: no]&lt;/pre&gt;

&lt;p class="paragraph"&gt;
Operaでは動くのになんでだーと思いながら調べると、どうもobj.onclick=function(){}は使えないというブログのエントリを発見。
さらに検索を続けたところ以下のオライリーのサイトにたどり着きました。
&lt;/p&gt;

&lt;a href="http://www.oreillynet.com/pub/a/network/2005/11/01/avoid-common-greasemonkey-pitfalls.html?page=3" target="_blank"&gt;O'Reilly Network -- Avoid Common Pitfalls in Greasemonkey&lt;/a&gt;

&lt;p class="paragraph"&gt;
本当だったようです。
この記事が非常に役に立つのでメモっておきます。
（書籍にまとまってたりするのかなぁ）
翻訳チョー適当なので勘弁してください。
&lt;/p&gt;

&lt;h4&gt;Pitfall #1: Auto-eval Strings（落とし穴１：自動評価文字列）&lt;/h4&gt;

&lt;p class="paragraph"&gt;
通常ブラウザで動かすJavaScriptでは、
setTimeout関数のようなコールバック関数を引数に取る関数にsetTimeout("my_func()", 1000);のように関数の文字列を渡すことができます。
内部では実行時に文字列を評価（eval）してくれているようです。
これがGreasemonkeyでは動かないらしい。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
このような場合は、var func = function(){};のようにして関数リテラルにしてしまってfuncを第一引数に渡すか、
setTimeout(function(){}, 1000);のように無名関数を直接埋め込んでしまえば正しく実行されます。
&lt;/p&gt;

&lt;h4&gt;Pitfall #2: Event Handlers（落とし穴２：イベントハンドラ）&lt;/h4&gt;

&lt;p class="paragraph"&gt;
まさにこれが私のハマったやつだったわけですが、
onclickやonchangeやonsubmitのようなイベントハンドラを使用したケースです。
私はよく以下のように書きます。
&lt;/p&gt;

&lt;pre class="code"&gt;document.getElementById('my_obj').onclick = function(){
 alert('my_obj onclick');
};&lt;/pre&gt;

&lt;p class="paragraph"&gt;
これがダメ。getElementByIdはElement自身ではなくXPCNativeWrapperというラッパを返すため、
上記のようなコードではelementにonclickを設定するコードにはならないというもの。
（idやclassNameのようなプロパティはXPCNativeWrapperがちゃんとラッピングしているElementの値を返すようです）
&lt;/p&gt;

&lt;p class="paragraph"&gt;
これを回避するにはaddEventListener関数を使えとのこと。
上記のコードの代わりにこう書きます。
（Operaではonclickに直接無名関数を記述しても動きますが、以下の例でも正しく動きます）
&lt;/p&gt;

&lt;pre class="code"&gt;document.getElementById('my_obj').addEventListener("click", function(){
 alert('my_obj clicked.');
}, false);
//３つめの引数はイベントバブリングの制御のための値
//「addEventListener バブリング」で検索すると分ります&lt;/pre&gt;

&lt;h4&gt;Pitfall #3: Named Forms and Form Elements（落とし穴３：名前を付けたフォームとフォーム要素）&lt;/h4&gt;

&lt;p class="paragraph"&gt;
以下のようになっているフォームがあるとき。
&lt;/p&gt;

&lt;pre class="code"&gt;&amp;lt;form id=&amp;quot;gs&amp;quot;&amp;gt;
&amp;lt;input name=&amp;quot;q&amp;quot; type=&amp;quot;text&amp;quot; value=&amp;quot;foo&amp;quot;&amp;gt;
&amp;lt;/form&amp;gt;&lt;/pre&gt;

&lt;p class="paragraph"&gt;
以下のような書き方でqの値をとることができないようです。
（個人的にはこういう書き方しないのでなんとも...）
&lt;/p&gt;

&lt;pre class="code"&gt;var q = document.gs.q.value;&lt;/pre&gt;

&lt;h4&gt;Pitfall #4: Custom Properties（落とし穴４：カスタムプロパティ）&lt;/h4&gt;

&lt;p class="paragraph"&gt;
JavaScriptでは好きなプロパティを勝手に付けることができますが、
これもXPCNativeWrapperがあるためにできないとのこと。
以下のようなコードはエラーにはなりませんが、意図した通りに動きません。
&lt;/p&gt;

&lt;pre class="code"&gt;var elmFoo = document.getElementById('foo');
elmFoo.myProperty = 'bar';&lt;/pre&gt;

&lt;p class="paragraph"&gt;
idなどのプロパティは普通にアクセスできますが、
自分でオリジナルのプロパティを付けたい場合は以下のようにsetAttributeを使います。
&lt;/p&gt;

&lt;pre class="code"&gt;var elmFoo = document.getElementById('foo');
elmFoo.setAttribute('myProperty', 'bar');&lt;/pre&gt;

&lt;p class="paragraph"&gt;
セットした値を取得するにはgetAttributeを使います。
ここでちょっとハマったので注意。
getAttributeの戻り値は必ずString型になるようです。
（falseをセットしたら戻り値が'false'でtypeofしたところ'string'でしたから）
フラグをセットする場合などはそのままfalseをセットするだけではダメですね。
&lt;/p&gt;

&lt;h4&gt;Pitfall #5: Iterating Collections（落とし穴５：コレクションの数え上げ）&lt;/h4&gt;

&lt;p class="paragraph"&gt;
（ちょっと解釈を間違っているかもしれません）
以下の例を見てください。
&lt;/p&gt;

&lt;pre class="code"&gt;//配列のループ
var list = [1,2,3,4];
for (var i = 0 ; i &lt; list.length ; i++)
{
 alert(list[i]);
}

//オブジェクトのプロパティの取り出し
var obj = {'name': 'narucissus', 'age': 26};
for (var j in obj)
{
 alert(j + ' is ' + obj[j]);
}
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
変数listは（[]を使って）配列として定義しています。
この配列のすべての要素にアクセスするときにはfor(;;)を使います。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
これに対して変数objは（{}を使って）連想配列（またはオブジェクト）として定義しています。
この連想配列の要素にアクセスするときにはfor(in)を使います。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
通常この２つの用法は意識して区別していますが、
ブラウザが意図したとおりに実行してしまうせいか、配列に対してfor(in)を使用するケースが多いです。
引用元では上記のようには書いていませんが、これがダメだよということだと思います。
（違っていたら詳しい方コメントください）
&lt;/p&gt;

&lt;p class="paragraph"&gt;
あと５つもある...続きはウェブで。（ウェブだけど）
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-7293906015046802203?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/7293906015046802203/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=7293906015046802203' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/7293906015046802203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/7293906015046802203'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/08/greasemonkey.html' title='Greasemonkeyで遊ぶ（その１）'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-6926979249420334647</id><published>2007-07-20T18:32:00.000+09:00</published><updated>2007-07-20T18:39:40.590+09:00</updated><title type='text'>Firebugのconsole.logをIEでも使いたいとき</title><content type='html'>&lt;p class="paragraph"&gt;
JavaScriptの開発には欠かせないFirebugではログを書き出すのにconsole.logをよく使用します。
うっかりこれを残したままにしてjsファイルを保存すると、
Internet Explorerで開いたときにエラーが出て悲しい想いをすることになります。
IEでもconsole.logをコメントアウトしたりしないで使えるようにサンプルを書いてみました。
&lt;/p&gt;

&lt;a href="http://pgmon.heteml.jp/n/misc/customlog.html"&gt;JavaScriptカスタムログ&lt;/a&gt;

&lt;p class="paragraph"&gt;
上記のリンクをクリックしてソースを表示するだけで必要なものはすべて書いてあります。
要点だけ説明すると、
&lt;/p&gt;

&lt;pre class="code"&gt;String.prototype.escape = function()
{
 var str = this;
 str = str.replace(/&amp;amp;/g, &amp;quot;&amp;amp;amp;&amp;quot;);
 str = str.replace(/&amp;lt;/g, &amp;quot;&amp;amp;lt;&amp;quot;);
 str = str.replace(/&amp;gt;/g, &amp;quot;&amp;amp;gt;&amp;quot;);
 str = str.replace(/&amp;quot;/g, &amp;quot;&amp;amp;quot;&amp;quot;);
 str = str.replace(/'/g, &amp;quot;&amp;amp;#039;&amp;quot;);
 str = str.replace(/\\/g, &amp;quot;&amp;amp;yen;&amp;quot;);
 return str;
};

Number.prototype.pad = function()
{
 return (this &amp;lt; 10) ? '0' + this : this;
};&lt;/pre&gt;

&lt;p class="paragraph"&gt;
HTMLタグのエスケープをするescape関数と、桁を２桁にそろえるためのpad関数をprototypeに定義。
見易さを考えてprototypeにくくりだしただけなのでここは重要ではないです。
&lt;/p&gt;

&lt;pre class="code"&gt;//consoleが定義されていない場合
if (typeof window.console != 'object')
{
 //画面末尾にログ表示用のdivを作成
 if (window.attachEvent)
 {
  window.attachEvent('onload', function(){
   var div = document.createElement('div');
   var attr1 = document.createAttribute(&amp;quot;id&amp;quot;);
   attr1.value = &amp;quot;console&amp;quot;;
   div.setAttributeNode(attr1);
   
   var ul = document.createElement('ul');
   var attr2 = document.createAttribute(&amp;quot;id&amp;quot;);
   attr2.value = &amp;quot;console-list&amp;quot;;
   ul.setAttributeNode(attr2);
   
   div.appendChild(ul);

   document.body.appendChild(div);
  });
 }

 //console.logを定義
 var console = {};
 console.log = function(obj){
  if (obj != null)
  {
   var list = document.getElementById('console-list');
   var d = new Date();
   var time = d.getHours().pad() + ':' + d.getMinutes().pad() + ':' + d.getSeconds().pad();
   
   list.innerHTML += '&amp;lt;li&amp;gt;&amp;lt;span&amp;gt;' + time + '&amp;lt;/span&amp;gt;' + obj.toString().escape() + '&amp;lt;/li&amp;gt;';
  }
 };
}&lt;/pre&gt;

&lt;p class="paragraph"&gt;
consoleが定義されているか確認してから処理を行っています。
定義されていれば（Firebugがインストールされている環境ですね）
なにも処理を行わないのでそのままFirebugのconsole.logが実行されます。
IEやOperaなどであれば（もちろんグローバルにconsoleという変数を定義していなければ）
window.attachEventが実行されます。
window.attachEvent内ではログを表示するためのdivとulを生成してbodyにappendしています。
その後console.logの定義を定義し、呼び出されるとulのinnerHTMLにliを付け足していく処理を書いています。
&lt;/p&gt;

&lt;pre class="code"&gt;#console {
 width: 90%;
 height: 10em;
}
#console ul {
 border: 1px solid #666666;
 background-color: #F0F0F0;
 font-family: &amp;quot;ＭＳ ゴシック", "Osaka－等幅&amp;quot;;
 font-size: 12px;
 margin: 2px;
 padding: 3px;
 list-style-type: none;
 list-style-position: inside;
 width: 100%;
 height: 10em;
 overflow: auto;
}
#console ul li {
 margin: 0;
 padding: 0;
}
#console ul li span {
 padding: 0 1em 0 0;
 font-weight: bold;
}&lt;/pre&gt;

&lt;p class="paragraph"&gt;
divとulにはidが付いていて、CSSで見栄えを調整しています。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
これでFirebugが実行できる環境ではそのままFirebugにログが出力され、
IEでは画面下部に表示されたエリアにログが表示されます。
本番環境でログを出力したくない場合はconsole.log = function(obj){};のようにして定義を空にしてしまい、
document.body.appendChildを呼び出さないようにすればログの表示エリアが表示されなくなります。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
使いたいと思う人がいるかわかりませんが、ご自由に使っていただいて結構です。責任は負いませんー。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
（WEB+DB PRESSでid:amachangが似たようなこと書いてたけどまぁいいや）
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-6926979249420334647?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/6926979249420334647/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=6926979249420334647' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/6926979249420334647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/6926979249420334647'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/07/firebugconsolelogie.html' title='Firebugのconsole.logをIEでも使いたいとき'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-4385919584469022282</id><published>2007-07-06T18:30:00.000+09:00</published><updated>2007-07-06T18:31:57.026+09:00</updated><title type='text'>mb_convert_kanaの"a"オプションに含まれる範囲</title><content type='html'>&lt;p class="paragraph"&gt;
PHPのmb_convert_kanaを使って全角→半角変換をしたときに、
&amp;quot;r&amp;quot;と&amp;quot;n&amp;quot;を使った場合と&amp;quot;a&amp;quot;を使った場合で変換され方が違っています。
あんまり深いところは調べ切れませんが、
そもそも&amp;quot;a&amp;quot;オプションで変換するときの範囲ってどこまでなのかFirebugでチェック。
（最近ちょっとしたプログラムはすべてFirebugで書くのが癖に....）
&lt;/p&gt;

&lt;a href="http://jp2.php.net/manual/ja/function.mb-convert-kana.php" target="_blank"&gt;mb_convert_kana&lt;/a&gt;

&lt;p class="paragraph"&gt;
上記を見ると、範囲はU+0021からU+007Eまで。
Firebugのコンソールにで以下のように入力します。
&lt;/p&gt;

&lt;pre class="code"&gt;&amp;gt;&amp;gt;&amp;gt; for (i = parseInt('21', 16) ; i &lt;= parseInt('7E', 16) ; i++){ console.log(String.fromCharCode(i)); }&lt;/pre&gt;

&lt;p class="paragraph"&gt;
U+0022, U+0027, U+005C, U+007Eを除く、とあります。
除かれる文字は以下で出力。
&lt;/p&gt;

&lt;pre class="code"&gt;&amp;gt;&amp;gt;&amp;gt; console.log(String.fromCharCode(parseInt('22', 16)));
&amp;gt;&amp;gt;&amp;gt; console.log(String.fromCharCode(parseInt('27', 16)));
&amp;gt;&amp;gt;&amp;gt; console.log(String.fromCharCode(parseInt('5C', 16)));
&amp;gt;&amp;gt;&amp;gt; console.log(String.fromCharCode(parseInt('7E', 16)));&lt;/pre&gt;

&lt;p class="paragraph"&gt;
半角英数だけじゃなくて記号もばっちり入っちゃってます。
とすると&amp;quot;r&amp;quot;と&amp;quot;n&amp;quot;の範囲はどこからどこまで？
PHPのソース読まないと分らないのかも....
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-4385919584469022282?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/4385919584469022282/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=4385919584469022282' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/4385919584469022282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/4385919584469022282'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/07/mbconvertkanaa.html' title='mb_convert_kanaの&quot;a&quot;オプションに含まれる範囲'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-697688946945896208</id><published>2007-07-03T18:06:00.000+09:00</published><updated>2007-07-03T18:07:41.473+09:00</updated><title type='text'>Opera用ユーザJavaScriptファイルの例（続き）</title><content type='html'>&lt;p class="paragraph"&gt;
&lt;a href="http://narucissus.blogspot.com/2006/09/operajavascript.html"&gt;以前&lt;/a&gt;
同じタイトルで投稿したOpera用ユーザJavaScriptファイルで、
フォントを見やすくするために書いたスクリプトが特定のサイトで正しく動かないケースがありましたが、
なんのことはない、JavaScriptのDOMがロード完了するのを待たずに処理してたからでした。
&lt;/p&gt;

&lt;pre class="code"&gt;// ==UserScript==
// @include http://www.atmarkit.co.jp/*
// @include http://gigazine.net/*
// @include http://www.itmedia.co.jp/*
// @include http://jsgt.org/*
// @include http://slashdot.jp/*
// @include http://www.postgresql.jp/*
// @include http://journal.mycom.co.jp/*
// @include http://sunset.freespace.jp/*
// @include http://www.applelinkage.com/*
// @include http://www.ohmynews.co.jp/*
// @include http://allabout.co.jp/*
// @include http://ja.wikipedia.org/*
// @include http://www.st.ryukoku.ac.jp/*
// @include http://itpro.nikkeibp.co.jp/*
// @include http://blog.livedoor.jp/*
// @include http://www.amazon.co.jp/*
// @include http://d.hatena.ne.jp/*
// @include http://allabout.co.jp/*
// @include http://www.asahi.com/*
// @include http://codezine.jp/*
// @include http://ja.wikipedia.org/*
// ==/UserScript==

//画面のロードが終了してからフォントの修正
window.addEventListener(&amp;quot;load&amp;quot;, function(){
    //英文フォントをVerdanaに
    document.body.style.fontFamily = &amp;quot;Verdana, Arial, sans-serif&amp;quot;;
    
    //カスタマイズしてあることがわかるよう、画面右上に「customizing」を表示
    var divTag = document.createElement(&amp;quot;div&amp;quot;);
    var textNode = document.createTextNode(&amp;quot;customizing...&amp;quot;);
    var attr = document.createAttribute(&amp;quot;style&amp;quot;);
    attr.value = [
        &amp;quot;background-color:#FF0000&amp;quot;,
        &amp;quot;font-size:11px&amp;quot;,
        &amp;quot;font-family:Verdana&amp;quot;,
        &amp;quot;color:#FFFFFF&amp;quot;,
        &amp;quot;padding:2px&amp;quot;,
        &amp;quot;position:fixed&amp;quot;,
        &amp;quot;width:15%&amp;quot;,
        &amp;quot;top:0&amp;quot;,
        &amp;quot;left:85%&amp;quot;,
        &amp;quot;z-index:10000&amp;quot;].join(&amp;quot;;&amp;quot;);
    
    divTag.setAttributeNode(attr);
    divTag.appendChild(textNode);
    
    document.body.appendChild(divTag);
    
    //ほか個別設定が必要なサイト用の処理
    if(0 &amp;lt;= location.hostname.indexOf(&amp;quot;blog.livedoor.jp&amp;quot;))
    {
        document.body.style.lineHeight = '2.5em';
        document.body.style.fontSize = '6px';
    }
    
}, false);&lt;/pre&gt;

&lt;p class="paragraph"&gt;
OperaではaddEventListenerが使えるので、
これを使って画面ロード終了時にbodyのフォントファミリを変更するだけ。簡単。
なんで気づかなかったかなーオレ....
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-697688946945896208?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/697688946945896208/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=697688946945896208' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/697688946945896208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/697688946945896208'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/07/operajavascript.html' title='Opera用ユーザJavaScriptファイルの例（続き）'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-6402739718983299113</id><published>2007-07-03T17:59:00.000+09:00</published><updated>2007-07-03T18:00:00.746+09:00</updated><title type='text'>「初めてのJavaScript」にマツガイが多い</title><content type='html'>&lt;p class="paragraph"&gt;
&lt;a href="http://www.amazon.co.jp/%8F%89%82%DF%82%C4%82%CCJavaScript%81%5CAjax-DOM%91%CE%89%9E-Shelley-Powers/dp/4873113229" target="_blank"&gt;初めてのJavaScript&lt;/a&gt;
という本がオライリーから出版されましたが、
イージーな誤字（「新しいウィンドウを&lt;strong&gt;開くするとき&lt;/strong&gt;は」とかDateがDataになってたりとか）
やプログラムの間違いが多いです。
プログラムは一通り実行してみればおかしいことには気づきそうなものが多いのですが、
訳者は実行していないんでしょうか。
誤字を別にすれば役に立つ本なので残念。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
JavaScriptをちゃんと書籍で勉強したのはJavaScript第３版でしたが、
バージョンの古さのため実情にそぐわないところが多かったです。
こちらの最新版には期待したいところ。（夏に出る予定だったはず）
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-6402739718983299113?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/6402739718983299113/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=6402739718983299113' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/6402739718983299113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/6402739718983299113'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/07/javascript.html' title='「初めてのJavaScript」にマツガイが多い'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-6546386440071941467</id><published>2007-06-28T12:59:00.000+09:00</published><updated>2007-06-28T13:00:22.380+09:00</updated><title type='text'>U-30ブートキャンプ</title><content type='html'>&lt;p class="paragraph"&gt;
と銘打った新人歓迎会をやりました。
新人歓迎会といいつつ新人の参加費はロハではありません。（ロハとか言ってしまった...）
&lt;/p&gt;

&lt;p class="paragraph"&gt;
新人5人と旧新人11人でトータル16人。お会計は45000円。
じゃー新人2500円の旧新人3000円ぐらいでいーんじゃね？ってことで会計終了。
でもそれっていくらだったんだろうと今頃気になったのでFirefoxのアドレスバーで計算してみました。
&lt;/p&gt;

&lt;pre class="code"&gt;javascript:new function(){alert(2500*5+3000*11);}&lt;/pre&gt;

&lt;p class="paragraph"&gt;
45500。どうやら500円プラスだったようです。以下のように書いても可。
&lt;/p&gt;

&lt;pre class="code"&gt;javascript:(function(){alert(2500*5+3000*11);})()&lt;/pre&gt;

&lt;p class="paragraph"&gt;
ありがとう&lt;a href="http://d.hatena.ne.jp/amachang/"&gt;amachang&lt;/a&gt;!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-6546386440071941467?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/6546386440071941467/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=6546386440071941467' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/6546386440071941467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/6546386440071941467'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/06/u-30.html' title='U-30ブートキャンプ'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-2832249577957273264</id><published>2007-06-18T18:29:00.000+09:00</published><updated>2007-06-18T18:31:44.160+09:00</updated><title type='text'>FreeBSDのapache+ssl-1.3.37.1.57でSSLを有効にするには</title><content type='html'>&lt;p class="paragraph"&gt;
CentOSとかほぼ設定いらずでSSLが使用可能なディストリビューションに慣れてしまうと、
SSLの設定ひとつできやしないダメダメっぷり。
FreeBSD5.5のapache+ssl-1.3.37.1.57でSSLを有効にするためのメモですー。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
まずapache+ssl-1.3.37.1.57はportsでインストール済みとします。
make certificateはしてません。
今回使用する証明書は開発用なのでオレオレ証明書です。
以下のように作成しました。
&lt;/p&gt;

&lt;pre class="code"&gt;# cd /usr/local/etc/apache/
# openssl req -new -x509 -nodes -out httpsd.pem -keyout httpsd.pem
Generating a 1024 bit RSA private key
....++++++
....................................................++++++
writing new private key to 'httpsd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP&lt;span style="color:red;font-weight:bold;"&gt;（国名）&lt;/span&gt;
State or Province Name (full name) [Some-State]:Miyagi&lt;span style="color:red;font-weight:bold;"&gt;（都道府県名）&lt;/span&gt;
Locality Name (eg, city) []:Sendai&lt;span style="color:red;font-weight:bold;"&gt;（市町村名）&lt;/span&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Hoge&lt;span style="color:red;font-weight:bold;"&gt;（組織名）&lt;/span&gt;
Organizational Unit Name (eg, section) []:Hoge&lt;span style="color:red;font-weight:bold;"&gt;（会社名）&lt;/span&gt;
Common Name (eg, YOUR name) []:Hoge&lt;span style="color:red;font-weight:bold;"&gt;（氏名）&lt;/span&gt;
Email Address []:hoge@hoge.com&lt;span style="color:red;font-weight:bold;"&gt;（メールアドレス）&lt;/span&gt;&lt;/pre&gt;

&lt;p class="paragraph"&gt;
証明書を作成したら、/usr/local/etc/apache/httpsd.confを編集します。
1001行目付近にあるSSLDisableをコメントにして、以下の内容をファイル末尾に書き足しました。
&lt;/p&gt;

&lt;pre class="code"&gt;Listen 443
SSLEnable
SSLCertificateFile /usr/local/etc/apache/httpsd.pem
SSLVerifyClient 0
SSLVerifyDepth 10
SSLFakeBasicAuth
SSLCacheServerPath /usr/local/sbin/gcache
SSLCacheServerPort /var/log/gcache_port
SSLCacheServerRunDir /tmp
SSLSessionCacheTimeout 15&lt;/pre&gt;

&lt;p class="paragraph"&gt;
SSLCertificateFileにはさきほど作成したpemファイルのパスを指定。
SSLCacheServerPathはgcacheバイナリのあるパスを指定。
SSLCacheServerPortは存在するディレクトリなら大丈夫のよう。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-2832249577957273264?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/2832249577957273264/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=2832249577957273264' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2832249577957273264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2832249577957273264'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/06/freebsdapachessl-1337157ssl.html' title='FreeBSDのapache+ssl-1.3.37.1.57でSSLを有効にするには'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-2869175842495925446</id><published>2007-06-18T18:27:00.000+09:00</published><updated>2008-12-10T08:53:54.549+09:00</updated><title type='text'>おいらも恋したドラリオン</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-sif9wLT5H0/RnZQKADoqgI/AAAAAAAAAA0/gqNm4xjFvGA/s1600-h/dralion.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_-sif9wLT5H0/RnZQKADoqgI/AAAAAAAAAA0/gqNm4xjFvGA/s320/dralion.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5077333762650974722" /&gt;&lt;/a&gt;

&lt;p class="paragraph"&gt;
このあいだの土曜日、ドラリオン見てきました。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
最後に見たサーカスは小さいころのことでもう覚えていません。
シルク・ドゥ・ソレイユではないサーカスもグランディに来てたりしたんですけどねー。
今回は妻経由で（ちょっとお安く）チケットが手に入ったので、勇んで行って参りました。
&lt;/p&gt;

&lt;p class="paragraph" style="color:#FF0000;font-weight:bold;font-size:150%;"&gt;
すごいよドラリオン！
&lt;/p&gt;

&lt;p class="paragraph"&gt;
語彙が少なくてうまくこの感動を言葉にできません。
最近涙腺がゆるいので泣きそうでした。
肉体の美しさ、躍動感、静と動、いいですねー。興奮しました。
道化（クラウンっていうんですね）も好きです。
物語には道化がつきものです。道化がないとメリハリがつかないし、なんだか物足りない感じになってしまうと思います。
もう一回行きたいなぁ。7/8までやってるんだよなぁ。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-2869175842495925446?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/2869175842495925446/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=2869175842495925446' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2869175842495925446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2869175842495925446'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/06/blog-post.html' title='おいらも恋したドラリオン'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-sif9wLT5H0/RnZQKADoqgI/AAAAAAAAAA0/gqNm4xjFvGA/s72-c/dralion.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-2784350839836098266</id><published>2007-06-07T19:59:00.000+09:00</published><updated>2007-06-07T20:02:17.116+09:00</updated><title type='text'>magic_quotes_gpcがOnの状態でEthnaを使う</title><content type='html'>&lt;p class="paragraph"&gt;
Ruby on Railsが全然進んでいません(;_;)
進んでいませんが仕事はしないといけないので、仕事中に気づいたEthnaのことをメモ。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
FreeBSD 5.5でApache1.3を使用してEthnaを使用したWebアプリ構築中です。
どうも本番環境では.htaccessが使用不可のようなので、
magic_quotes_gpcがOnになっているのをOffにしたくてもできなそうです。
（mbstring関連だったら変更の可否がPHP_INI_ALLなので、
PHPプログラムの中でini_set関数使ってini_set('mbstring.internal_encoding', 'euc-jp');みたいに設定できるんですが、
magic_quotes_gpcは残念ながらPHP_INI_PERDIRでini_setが使えない）
&lt;/p&gt;

&lt;a href="http://jp2.php.net/manual/ja/ini.php" target="_blank"&gt;PHP: php.ini ディレクティブ - Manual&lt;/a&gt;

&lt;p class="paragraph"&gt;
magic_quotes_gpcはCentOSではデフォルトでOffだったので気にかけてませんでしたが、
Onだと勝手にaddslashesされてしまって、ページ遷移するとフィールドに入力した円マークが増えてたりします。
しょうがないのでEthna側の設定で回避することに。
フィルタでGET,POST,COOKIEをそれぞれstripslashesします。
&lt;/p&gt;

&lt;a href="http://ethna.jp/ethna-document-dev_guide-app-filterchain.html" target="_blank"&gt;Ethna - PHPウェブアプリケーションフレームワーク&lt;/a&gt;

&lt;p class="paragraph"&gt;
Ethnaのバージョンは2.3.1です。
app/plugin/Filterにある{$app_id}_Plugin_Filter_ExecutionTime.phpを複製して{$app_id}_Plugin_Filter_MagicQuotesGpcOff.phpを作成します。
クラス名を正しく書き換えて、preFilter関数を以下のように書き換え、stripslashes_recursive関数を追加。
&lt;/p&gt;

&lt;pre class="code"&gt;    /**
     *  実行前フィルタ
     *
     *  @access public
     */
    function preFilter()
    {
        if (ini_get('magic_quotes_gpc'))
        {
            $_GET = $this-&gt;stripslashes_recursive($_GET);
            $_POST = $this-&gt;stripslashes_recursive($_POST);
            $_COOKIE = $this-&gt;stripslashes_recursive($_COOKIE);
        }
    }

    function stripslashes_recursive($data)
    {
        if (is_array($data))
        {
            return array_map(array(&amp;amp;$this, 'stripslashes_recursive'), $data);
        }
        else
        {
            return stripslashes($data);
        }
    }&lt;/pre&gt;

&lt;p class="paragraph"&gt;
クラスのメンバ関数をarray_mapの第一引数に指定する場合は、
関数名を文字列として渡すのではなくarray(&amp;amp;$this, '関数名')とするようです。
フィルタができたら、app/{$app_id}_Controller.phpの$filterに作成したクラスを定義すれば完了。
&lt;/p&gt;

&lt;pre class="code"&gt;    /**
     *  @var    array       フィルタ設定
     */
    var $filter = array(
        /*
         *  TODO: フィルタを利用する場合はここにそのプラグイン名を
         *  記述してください
         *  (クラス名を指定するとfilterディレクトリからフィルタクラス
         *  を読み込みます)
         *
         *  記述例：
         *
         *  'ExecutionTime',
         */
         'MagicQuotesGpcOff',
    );&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-2784350839836098266?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/2784350839836098266/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=2784350839836098266' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2784350839836098266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2784350839836098266'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/06/magicquotesgpconethna.html' title='magic_quotes_gpcがOnの状態でEthnaを使う'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-7157097593404604122</id><published>2007-05-22T09:36:00.001+09:00</published><updated>2007-05-22T09:36:47.060+09:00</updated><title type='text'>Google Reader早く日本語対応してくれないかな</title><content type='html'>&lt;p class="paragraph"&gt;
livedoor Readerとかも使ってみたんですが、操作感がいいのでGoogle Readerのほうを愛用してます。
いままでフォルダ分けしたりタグつけたりしなかったので不便を感じなかったのだけど、
フォルダ名とタグに日本語つけられない！あーこれ不便だー。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
utf-8でURLエンコードした文字列もダメ....日本語対応版を待つとします。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-7157097593404604122?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/7157097593404604122/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=7157097593404604122' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/7157097593404604122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/7157097593404604122'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/05/google-reader.html' title='Google Reader早く日本語対応してくれないかな'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-7390878054027559760</id><published>2007-05-17T22:10:00.000+09:00</published><updated>2008-12-10T08:53:54.718+09:00</updated><title type='text'>Excelのオートシェイプが表示されなくて困った件</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_-sif9wLT5H0/RkxVE3lwufI/AAAAAAAAAAs/RU3XFvmbzYg/s1600-h/hardware_accelerator.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_-sif9wLT5H0/RkxVE3lwufI/AAAAAAAAAAs/RU3XFvmbzYg/s320/hardware_accelerator.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5065517223015135730" /&gt;&lt;/a&gt;

&lt;p class="paragraph"&gt;
Excelのオートシェイプの塗りつぶしと線が表示されなくて透明になってしまい、
選択はできるけど見えなくて困ってしまったというお話。
再起動繰り返して１時間ぐらい無駄にしてしまった....くそー。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
いろんな人に聞いてもこんな現象見たことないそうですが、検索したら対処法がすぐわかりました。
ディスプレイドライバのハードウェアアクセラレータの設定で正しく表示されないケースがあるとのこと。
&lt;/p&gt;

&lt;a href="http://support.microsoft.com/kb/294916/JA/" target="_blank"&gt;Office XP プログラムで文書のスクロールやウィンドウのサイズ変更を行うと、グラフィックスまたはテキストの表示が乱れる&lt;/a&gt;

&lt;p class="paragraph"&gt;
以下のように回避策が書かれています。
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;[スタート] ボタンをクリックし、[設定] をポイントし、[コントロールパネル] をクリックします (Windows XP の場合は、[スタート] ボタンをクリックし、[コントロールパネル] をクリックします)。次に、[画面] をダブルクリックします。 &lt;/li&gt;
&lt;li&gt;[設定] タブの [詳細] (または [詳細設定]) をクリックします。 &lt;/li&gt;
&lt;li&gt;[トラブルシューティング] タブで、ハードウェア アクセラレータのスライダを [なし] の方向にドラッグし、[OK] を 2 回クリックします。 &lt;/li&gt;
&lt;li&gt;問題が発生しなくなるまで、手順 1. ～ 3. を繰り返します。&lt;/li&gt;
&lt;/ol&gt;

&lt;p class="paragraph"&gt;
自分の設定はハードウェアアクセラレータが最大になっていました。
これを下から３番目のレベルまでに下げたら正しく表示されるように。
でもハードウェアアクセラレータの設定は全然いじっていないのになんで急にこういう風になってしまったんだろう...
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-7390878054027559760?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/7390878054027559760/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=7390878054027559760' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/7390878054027559760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/7390878054027559760'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/05/excel.html' title='Excelのオートシェイプが表示されなくて困った件'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_-sif9wLT5H0/RkxVE3lwufI/AAAAAAAAAAs/RU3XFvmbzYg/s72-c/hardware_accelerator.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-281650942537360657</id><published>2007-05-14T21:10:00.000+09:00</published><updated>2007-05-14T21:11:42.383+09:00</updated><title type='text'>PHP5でSegmentation fault発生</title><content type='html'>&lt;p class="paragraph"&gt;
CentOS5をインストールしたので、Apache2.2.3+PHP5.1.6+PostgreSQL8.1.9な環境でいろいろやってみようかと思いEthnaで構築したプロジェクトをせこせこ移行していると、PHP Warningもなにも返さないでサーバ側の処理が終了したもよう。
httpdのログを見てびっくり。
&lt;/p&gt;

&lt;pre class="code"&gt;[Mon May 14 21:04:05 2007] [notice] child pid 20941 exit signal Segmentation fault (11)&lt;/pre&gt;

&lt;p class="paragraph"&gt;
大学以来かもしれないSegmentation fault!
久しぶりに見たー。
ググるとApache 2.2とPHPの相性が悪いなどあるようで、MPMを調べて見ました。
/etc/sysconfig/httpdはworkerにはなっておらずpreforkのまま。
うーんなぜだろう....
PHPのバージョンが上がれば直るかもしれないと期待をかけてyum updateするも変化なし。
Ethnaをすべてutf-8に変更したからかなぁ。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-281650942537360657?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/281650942537360657/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=281650942537360657' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/281650942537360657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/281650942537360657'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/05/php5segmentation-fault.html' title='PHP5でSegmentation fault発生'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-154259736980871065</id><published>2007-05-03T19:33:00.000+09:00</published><updated>2007-05-03T19:35:16.850+09:00</updated><title type='text'>Mac OS X 10.3(Panther)でRuby on Rails その３</title><content type='html'>&lt;p class="paragraph"&gt;
さて本を参考にRuby on Railsを開始してみると、やっぱりちゃんとしたエディタの必要性を感じるのでした。
やはりEmacsキーバインド愛好者としてはCarbon Emacsを使いたいところ。
というわけでEmacsでRubyを編集するためにカスタマイズした内容をメモ。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
まず&lt;a href="http://www.ruby-lang.org/ja/" target="_blank"&gt;Rubyの本家&lt;/a&gt;からRubyのソース（.tar.gz）をダウンロードします。
ダウンロードした.tar.gzを解凍してできたディレクトリの中にmiscというディレクトリがあり、
その中に.elファイルがあります。
それらの.elファイルを/usr/share/emacs/site-lisp/以下にコピーします。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
次にホームディレクトリに.emacsファイルを作成します。
&lt;/p&gt;

&lt;pre class="code"&gt;(global-set-key "¥C-h" 'delete-backward-char)

(autoload 'ruby-mode "ruby-mode" "Mode for editing ruby source files" t)
(setq auto-mode-alist
      (append '(("¥¥.rb$" . ruby-mode)) auto-mode-alist))
(setq interpreter-mode-alist (append '(("ruby" . ruby-mode))
                                     interpreter-mode-alist))
(autoload 'run-ruby "inf-ruby" "Run an inferior Ruby process")
(autoload 'inf-ruby-keys "inf-ruby" "Set local key defs for inf-ruby in ruby-mode")
(add-hook 'ruby-mode-hook
          '(lambda ()
      (inf-ruby-keys)))
(global-font-lock-mode t)&lt;/pre&gt;

&lt;p class="paragraph"&gt;
.emacsファイルを保存したらemacsを再起動します。
これでruby-modeが使えるようになり、ハイライト表示が行われるようになりました。
ただしデフォルトの文字コードがeuc-jpのままなので、
編集したファイルはM-x set-buffet-file-coding-systemを使ってutf-8に変更します。
（emacsを起動したときにutf-8にする方法があると思うんですが、うまく設定できず…）
&lt;/p&gt;

&lt;p class="paragraph"&gt;
これらの作業は以下のサイトを参考にしました。
&lt;/p&gt;

&lt;a href="http://www.goodpic.com/mt/archives2/2005/09/mac_osxemacsrub.html" target="_blank"&gt;Mac OSXのemacsに、Rubyモードを設定：Goodpic&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-154259736980871065?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/154259736980871065/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=154259736980871065' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/154259736980871065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/154259736980871065'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/05/mac-os-x-103pantherruby-on-rails_1819.html' title='Mac OS X 10.3(Panther)でRuby on Rails その３'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-2075783017646381669</id><published>2007-05-03T15:54:00.000+09:00</published><updated>2007-05-03T16:08:30.233+09:00</updated><title type='text'>Mac OS X 10.3(Panther)でRuby on Rails その２</title><content type='html'>&lt;p class="paragraph"&gt;
今度はRubyとRuby on Railsのインストールに入ります。
まずfinkを使用してRubyのインストール。
以下のサイトからMac OS X用のFink 0.7.2を選択します。
&lt;/p&gt;

&lt;a href="http://www.finkproject.org/" target="_blank"&gt;http://www.finkproject.org/&lt;/a&gt;

&lt;p class="paragraph"&gt;
ダウンロードした「Fink 0.7.2 Installer.pkg」をダブルクリックしてインストールします。
正しくfinkがインストールされたらRubyのインストール。
&lt;/p&gt;

&lt;pre class="code"&gt;$ fink install ruby ruby18 ruby18-dev ruby18-shlibs&lt;/pre&gt;

&lt;p class="paragraph"&gt;
Rubyのインストールが完了したら次はrubygemsのインストール。
以下のサイトからrubygems-0.9.2.tgzをダウンロードします。
&lt;/p&gt;

&lt;a href="http://rubyforge.org/projects/rubygems/" target="_blank"&gt;http://rubyforge.org/projects/rubygems/&lt;/a&gt;

&lt;p class="paragraph"&gt;
たぶんダウンロードすると勝手に解凍されてしまうと思います。
解凍して作成されたディレクトリの中に移動して、以下を実行します。
&lt;/p&gt;

&lt;pre class="code"&gt;$ sudo ruby setup.rb&lt;/pre&gt;

&lt;p class="paragraph"&gt;
完了したら次はgemコマンドでrailsをインストールします。
&lt;/p&gt;

&lt;pre class="code"&gt;$ sudo gem install rails --include-dependencies
 ERROR:  While executing gem ... (Gem::GemNotFoundException)
    Could not find rails (&gt; 0) in the repository&lt;/pre&gt;

&lt;p class="paragraph"&gt;
エラーが発生してしまいました。
finkでインストールしたRubyのバージョンが1.8.1-1だからでしょうか？
公式サイトには1.8.2、1.8.4、1.8.5が使用可能と書いてありますが、1.8.3はダメとあります。
ということは1.8.1もダメそう...
&lt;/p&gt;

&lt;p class="paragraph"&gt;
finkでインストールしたRubyはこのバージョンしか見当たらないので、削除することにしました。
&lt;/p&gt;

&lt;pre class="code"&gt;$ fink remove ruby ruby18 ruby18-dev ruby18-shlibs&lt;/pre&gt;

&lt;p class="paragraph"&gt;
今度は以下のサイトを参考にして「Ruby 1.8.2 バイナリパッケージ for Mac OS X 10.3 (Panther)」をダウンロード、インストールしました。
&lt;/p&gt;

&lt;a href="http://www.ruby-lang.org/ja/install.cgi?cmd=view;name=MacOS+X" target="_blank"&gt;Ruby インストールガイド - MacOS X&lt;/a&gt;

&lt;p class="paragraph"&gt;
ダウンロードしてきたパッケージをインストールして、その後gemのsetup.rbを再実行。
さらにrailsをgemコマンドでインストールしました。（たしかrootで）。
このときgemが見つけられないといけないので、rootの.bashrcに以下を記述しました。
&lt;/p&gt;

&lt;pre class="code"&gt;export PATH=/opt/ruby-1.8.2/bin:/usr/local/mysql/bin:$PATH&lt;/pre&gt;

&lt;p class="paragraph"&gt;
これで正しくインストールできたようです。
rails -vと実行したら「Rails 1.2.3」とバージョンが表示されました。
やっとRailsの勉強ができるぞー。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-2075783017646381669?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/2075783017646381669/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=2075783017646381669' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2075783017646381669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/2075783017646381669'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/05/mac-os-x-103pantherruby-on-rails_03.html' title='Mac OS X 10.3(Panther)でRuby on Rails その２'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-203376038877425031</id><published>2007-05-03T15:11:00.000+09:00</published><updated>2007-05-03T15:16:07.904+09:00</updated><title type='text'>Mac OS X 10.3(Panther)でRuby on Rails その１</title><content type='html'>&lt;p class="paragraph"&gt;
まだMac OS X 10.3(Panther)を使っています。
OSをアップグレードしたりiMacを買い替える予定もないので、
今の環境にRuby on Railsをインストールしようと思います。
とりあえずその１はMySQLの準備から。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
まず以下からMySQL 5.0.7をダウンロードします。
Mac OS X (package format) downloadsのMac OS X 10.3 (PowerPC, 32-bit)を選択しました。
（以前はソースからコンパイルしたんですけどもうめんどくさいので…）
&lt;/p&gt;

&lt;a href="http://dev.mysql.com/downloads/mysql/5.0.html#macosx-dmg" target="_blank"&gt;http://dev.mysql.com/downloads/mysql/5.0.html#macosx-dmg&lt;/a&gt;

&lt;p class="paragraph"&gt;
ダウンロードしたファイルを解凍して、mysql-5.0.37-osx10.3-powerpc.pkgをインストールします。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
インストールが完了すると/usr/local/mysql/bin以下に各種バイナリがインストールされるので、
.bashrcに以下のように記述してパスを通します。
&lt;/p&gt;

&lt;pre class="code"&gt;export PATH=/usr/local/mysql/bin:$PATH&lt;/pre&gt;

&lt;p class="paragraph"&gt;
ここのところ実はよくわかってないんですが、Linuxと違って.bashrcをホームディレクトリ以下に作成しても自動で読み込まれないんですよね。
なんか根本的に勘違いしてるような気がしないでもないですが、.bashrcを変更（もしくは新規作成）したら、
ターミナル上でsource .bashrcとして環境変数を適用します。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
パスを通したら起動しますが、起動前にrootになって、my.cnfの準備をします。
&lt;/p&gt;

&lt;pre class="code"&gt;$ sudo su -
# cd /etc
# cp /usr/local/mysql/support-files/my-medium.cnf ./my.cnf&lt;/pre&gt;

&lt;p class="paragraph"&gt;
/etcにコピーしてきたmy.cnfの[client]セクションと[mysqld]セクションに以下のように記述します。
今回はすべてutf-8で運用するので、サーバ・クライアントのキャラクタセットを統一します。
&lt;/p&gt;

&lt;pre class="code"&gt;default-character-set = utf8&lt;/pre&gt;

&lt;p class="paragraph"&gt;
my.cnfの編集が完了したらmysqldを起動します。
&lt;/p&gt;

&lt;pre class="code"&gt;# mysqld_safe&lt;/pre&gt;

&lt;p class="paragraph"&gt;
正しく起動したらC-zで一時停止してbgコマンドを使ってバックグラウンド動作させてもいいんですが、
ターミナルが簡単に複製できるので別ターミナルを起動してそこでユーザとデータベースの作成を行います。
&lt;/p&gt;

&lt;pre class="code"&gt;# mysql mysql -u root
mysql&gt; CREATE DATABASE ndb CHARACTER SET utf8;
mysql&gt; grant all on ndb.* to narucissus@localhost identified by 'narucissus';
mysql&gt; quit&lt;/pre&gt;

&lt;p class="paragraph"&gt;
これでほぼ完了です。mysqldを終了するにはmysqladmin shutdownで終了します。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-203376038877425031?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/203376038877425031/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=203376038877425031' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/203376038877425031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/203376038877425031'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/05/mac-os-x-103pantherruby-on-rails.html' title='Mac OS X 10.3(Panther)でRuby on Rails その１'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-1285395362186416853</id><published>2007-04-18T18:23:00.000+09:00</published><updated>2007-04-19T09:42:28.296+09:00</updated><title type='text'>euc-jpをutf-8に変換するPHPスクリプト</title><content type='html'>&lt;p class="paragraph"&gt;
Ethnaのファイル一式をeuc-jpからutf-8に変換するPHPスクリプト作ってみました。
ディレクトリを再帰的に辿ります。
これも相当手垢がついたネタでほかでいくらでも見つかりますがメモなのでメモ。
&lt;/p&gt;

&lt;pre class="code"&gt;&amp;lt;?php
define('FROM_CHAR_ENCODING', 'euc-jp');
define('TO_CHAR_ENCODING', 'utf-8');
define('TARGET_DIR', '/home/narucissus/my-project');

//ディレクトリのトレース開始
trace_dir(TARGET_DIR);

/**
 * ディレクトリのトレース
 * @param string $dir ディレクトリ
 */
function trace_dir($dir)
{
    if ($handle = opendir($dir))
    {
        while (FALSE !== ($file = readdir($handle)))
        {
            //「.」と「..」はファイルから除外
            if ($file != &amp;quot;.&amp;quot; &amp;amp;&amp;amp; $file != &amp;quot;..&amp;quot;)
            {
                $filepath = $dir . &amp;quot;/&amp;quot; . $file;
                
                //フォルダ処理
                if (is_dir($filepath))
                {
                    //再帰処理
                    trace_dir($filepath);
                }
                //ファイル処理
                else
                {
                    //ファイルの中身を一度すべて変数に読み込み
                    $contents = file_get_contents($filepath);
                    //変数の文字コードを変更
                    $contents_c = mb_convert_encoding($contents, TO_CHAR_ENCODING, FROM_CHAR_ENCODING);
                    
                    //書き込み可能かチェックしてから変換後の内容をファイルの書き出し
                    if (is_writable($filepath))
                    {
                        $fp = fopen($filepath, &amp;quot;w&amp;quot;);
                        $bytes = fwrite($fp, $contents_c);
                        
                        if (strlen($contents_c) == $bytes)
                        {
                            print(&amp;quot;OK - $filepath&amp;quot; . &amp;quot;\n&amp;quot;);
                        }
                        else
                        {
                            print(&amp;quot;NG - write failed: $filepath&amp;quot; . &amp;quot;\n&amp;quot;);
                        }
                        
                        fclose($fp);
                    }
                    else
                    {
                        print(&amp;quot;NG - unwritable: $filepath&amp;quot; . &amp;quot;\n&amp;quot;);
                    }
                }
            }
            
        }
        
        closedir($handle);
    }
    else
    {
        print(&amp;quot;open failed: $dir&amp;quot; . &amp;quot;\n&amp;quot;);
    }
}
?&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-1285395362186416853?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/1285395362186416853/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=1285395362186416853' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1285395362186416853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1285395362186416853'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/04/euc-jputf-8php.html' title='euc-jpをutf-8に変換するPHPスクリプト'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-6073655541500264237</id><published>2007-04-17T18:17:00.000+09:00</published><updated>2007-04-17T18:35:57.821+09:00</updated><title type='text'>with({e:e})に悩む</title><content type='html'>&lt;p class="paragraph"&gt;
&lt;a href="http://d.hatena.ne.jp/amachang/" target="_blank"&gt;amachang&lt;/a&gt;のエントリ&lt;a href="http://d.hatena.ne.jp/amachang/20070411/1176303073" target="_blank"&gt;IT戦記 - 社内勉強会資料&lt;/a&gt;でよく理解できなかったwith({e:e})という処理について。
複数要素という部分のプログラム中にあります。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
このエントリのコメントにもある以下のサイトが非常に参考になりました。
&lt;/p&gt;

&lt;a href="http://nanto.asablo.jp/blog/2006/07/08/437419" target="_blank"&gt;JavaScript でブロックスコープを実現する: Days on the Moon&lt;/a&gt;

&lt;p class="paragraph"&gt;
このサイトの中に以下のような記述があります。
&lt;/p&gt;

&lt;pre class="code"&gt;var a = 10;
with ({ a: 20 }) {
  print(a); // 20
}
print(a); // 10&lt;/pre&gt;

&lt;p class="paragraph"&gt;
ここを見て初めて理解できました。
通常withを使う場合はこのように使うと思います。（Firebugでログを出力できる環境と仮定して）
&lt;/p&gt;

&lt;pre class="code"&gt;with (document)
{
    console.log(title); //document.titleと同じ
    console.log(contentType); //document.contentTypeと同じ
}&lt;/pre&gt;

&lt;p class="paragraph"&gt;
withを使って上記のように「document.」を省略してdocumentオブジェクトのプロパティtitleとcontentTypeにアクセスできます。
このdocumentの位置にいれるものはもちろん他のオブジェクトでもよいわけで、
それがサンプルでは{a:20}となっていて、withの中でaにアクセスすると実際は{a:20}.aにアクセスしていることになります。
（なんだか{a:20}.aという書き方はすごく違和感がありますが...）
&lt;/p&gt;

&lt;p class="paragraph"&gt;
with({e:e})のあとにsetTimeoutで無名関数が記述してありその中でnew Box(e)というふうにeが使われていますが、
これが{e:e}.eになる（コロンの左側のプロパティeにアクセスして値eを取得、つまりvar e = nl[i]で定義したe）になります。
なぜこんなまどろっこしいことをしているかというと、
setTimeoutで実行される無名関数内でそのままeにアクセスすると、for文だけ先に終了してしまってe = nl[5]になってしまい、ボックスがそれぞれ移動するような意図した動作になりません。
（試しにwith({e:e})をコメントアウトした状態でプログラムを動かすとよくわかります）
withを使ってスコープを定義してやることでeを固定するのが必要なんですね。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
という解釈であってるよなぁ....
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-6073655541500264237?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/6073655541500264237/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=6073655541500264237' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/6073655541500264237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/6073655541500264237'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/04/withee.html' title='with({e:e})に悩む'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-1609938303575812102</id><published>2007-04-17T12:33:00.000+09:00</published><updated>2007-04-17T12:35:10.285+09:00</updated><title type='text'>Oracle 8.1.6のインストールに失敗</title><content type='html'>&lt;p class="paragraph"&gt;
検索すればいくらでもわかるいまさらなネタですが、
一ヵ月後には忘れてる自信があるのでやっぱりメモ。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
インストールしようとしたのはOracle 8i Workgroup Server for Windows NT R8.1.6です。
XP上でVirtual PC内にWindows 2000 Serverを構築し、そこにインストールを試みました。
Windows Updateをすべて完了してautorunから起動するインストーラ内の「インストールの開始」をクリックしても、
なにも起こらない....
一瞬砂時計マークが見えてなにかが起動するのかと見せかけて、いくら待ってもウンともスンとも言わないのでした。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
またGoogle先生のお力を借りてたどり着いたのが以下のサイト。
&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blog.so-net.ne.jp/Silv/2004-12-21-2" target="_blank"&gt;So-net blog:Miscellaneous:Oracle8iのインストールでの問題&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.ohzapper.com/300_system/320_oracle/" target="_blank"&gt;ぼやぼやしてると後ろからバッサリだ！ - Oracle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class="paragraph"&gt;
どうもPentium4プロセッサを積んだマシンではOUIが起動しないようです。
そこで以下のように作業しました。
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;c:\ora816diskというフォルダを作成し、d:\以下の内容をすべてコピー&lt;/li&gt;
&lt;li&gt;コピーしたらc:\ora816diskの中から「symcjit.dll」というファイルを検索
&lt;p class="paragraph"&gt;
以下の２箇所が検索されました。
&lt;/p&gt;

&lt;pre class="code"&gt;C:\ora816disk\oo4o81637\Components\oracle.swd.jre\1.1.7.24\2\DataFiles\Expanded\jre\win32\bin
C:\ora816disk\stage\Components\oracle.swd.jre\1.1.7.24\1\DataFiles\Expanded\jre\win32\bin&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;見つかった２ファイルを削除またはリネーム&lt;/li&gt;
&lt;li&gt;c:\ora816disk\autorun\autorun.exeを実行&lt;/li&gt;
&lt;/ol&gt;

&lt;p class="paragraph"&gt;
これで無事にインストールが開始されました。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-1609938303575812102?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/1609938303575812102/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=1609938303575812102' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1609938303575812102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1609938303575812102'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/04/oracle-816.html' title='Oracle 8.1.6のインストールに失敗'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-8629627911748409669</id><published>2007-03-30T10:47:00.000+09:00</published><updated>2007-03-30T10:48:35.898+09:00</updated><title type='text'>.htaccessで携帯からのアクセスのみ許可する設定</title><content type='html'>&lt;p class="paragraph"&gt;
社外に公開したサーバに携帯からしかアクセスして欲しくなかったので、
各キャリアのIPアドレス帯域による制限を.htaccessに記述しました。
随時変更されるIPだとは思いますが、なんだかせっかく作ったのでメモ。
基本的にこれを.htaccessに書くだけで携帯以外のキャリアはアクセスできないはずです。
&lt;/p&gt;

&lt;pre class="code"&gt;# DoCoMo(2007/03/23時点)
# http://www.nttdocomo.co.jp/service/imode/make/content/ip/
allow from 210.153.84.0/24
allow from 210.136.161.0/24
allow from 210.153.86.0/24

# au(2007/03/23時点)
# http://www.au.kddi.com/ezfactory/tec/spec/ezsava_ip.html
allow from 210.169.40.0/24
allow from 210.196.3.192/26
allow from 210.196.5.192/26
allow from 210.230.128.0/24
allow from 210.230.141.192/26
allow from 210.234.105.32/29
allow from 210.234.108.64/26
allow from 210.251.1.192/26
allow from 210.251.2.0/27
allow from 211.5.1.0/24
allow from 211.5.2.128/25
allow from 211.5.7.0/24
allow from 218.222.1.0/24
allow from 61.117.0.0/24
allow from 61.117.1.0/24
allow from 61.117.2.0/26
allow from 61.202.3.0/24
allow from 219.108.158.0/26
allow from 219.125.148.0/24
allow from 222.5.63.0/24
allow from 222.7.56.0/24
allow from 222.5.62.128/25
allow from 222.7.57.0/24
allow from 59.135.38.128/25
allow from 219.108.157.0/25
allow from 219.125.151.128/25

# SoftBank(2007/03/23時点)
# http://developers.softbankmobile.co.jp/dp/tech_svc/web/ip.php
allow from 202.179.204.0/24
allow from 202.253.96.248/29
allow from 210.146.7.192/26
allow from 210.146.60.192/26
allow from 210.151.9.128/26
allow from 210.169.130.112/29
allow from 210.169.130.120/29
allow from 210.169.176.0/24
allow from 210.175.1.128/25
allow from 210.228.189.0/24
allow from 211.8.159.128/25&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-8629627911748409669?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/8629627911748409669/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=8629627911748409669' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/8629627911748409669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/8629627911748409669'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/03/htaccess.html' title='.htaccessで携帯からのアクセスのみ許可する設定'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-3946273370503642318</id><published>2007-03-30T10:40:00.000+09:00</published><updated>2007-03-30T10:41:49.685+09:00</updated><title type='text'>.bashrcと.vimrcのテンプレート</title><content type='html'>&lt;p class="paragraph"&gt;
vmwareで開発環境を作るたびに.bashrcと.vimrcを変更しないといけないのでメモ。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
ターミナルは&lt;a href="http://ja.poderosa.org/" target="_blank"&gt;Poderosa&lt;/a&gt;を使用しています。
背景を濃いグレー、文字を白にしているので、コードやlsの結果がカラーリングされていると非常に読みづらい。
そんなわけで.bashrcはこんな感じに。
&lt;/p&gt;

&lt;pre class="code"&gt;alias ls='ls -F'
alias ll='ls -lF'
alias lal='ls -alF'&lt;/pre&gt;

&lt;p class="paragraph"&gt;
同様に.vimrcもこんな感じに。
&lt;/p&gt;

&lt;pre class="code"&gt;syntax off
set number
set tabstop=4
set showmode
set ignorecase
set showmatch&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-3946273370503642318?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/3946273370503642318/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=3946273370503642318' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3946273370503642318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/3946273370503642318'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/03/bashrcvimrc.html' title='.bashrcと.vimrcのテンプレート'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-5784632185497305273</id><published>2007-03-27T14:29:00.000+09:00</published><updated>2007-03-27T14:34:25.089+09:00</updated><title type='text'>PostgreSQLのログをsyslogに出力するときのメモ</title><content type='html'>&lt;p class="paragraph"&gt;
PostgreSQLのチューニングを行うのにまずログを出力しようとしたのですが、
ログを有効にするとかなり重くなってしまったのでそれを回避するためのtipsをメモ。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
まず/var/lib/pgsql/data/postgresql.confの134行目付近に以下のように記述。
&lt;/p&gt;

&lt;pre class="code"&gt;#---------------------------------------------------------------------------
# ERROR REPORTING AND LOGGING   
#---------------------------------------------------------------------------

# - Syslog -

#syslog = 0                     # range 0-2; 0=stdout; 1=both; 2=syslog
#syslog_facility = 'LOCAL0'     
#syslog_ident = 'postgres'      
syslog = 2                      # range 0-2; 0=stdout; 1=both; 2=syslog
syslog_facility = 'LOCAL0'&lt;/pre&gt;

&lt;p class="paragraph"&gt;
syslog = 2でsyslogのみにログを出力し、facilityはlocal0に設定。
続いて172行目付近に以下のように記述。
&lt;/p&gt;

&lt;pre class="code"&gt;# - What to Log -

#debug_print_parse = false
#debug_print_rewritten = false
#debug_print_plan = false
#debug_pretty_print = false
#log_connections = false
#log_duration = false
#log_pid = false
#log_statement = false
#log_timestamp = false
#log_hostname = false
#log_source_port = false
log_statement = true
log_duration = true
log_pid = true
log_connections = false
log_timestamp = false
log_error_verbosity = default   # terse, default, or verbose messages&lt;/pre&gt;

&lt;p class="paragraph"&gt;
続いて/etc/syslogd.confの設定。末尾に以下を追加。
&lt;/p&gt;

&lt;pre class="code"&gt;
LOCAL0.* -/var/log/postgres
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
local0のファシリティのすべてのログを/var/log/postgresに出力する。
ファイル名の前にハイフンをつけるとファイルへの書き込みフラッシュ動作を制限できる。
&lt;/p&gt;

&lt;a href="http://www.linux.or.jp/JM/html/sysklogd/man5/syslog.conf.5.html" target="_blank"&gt;http://www.linux.or.jp/JM/html/sysklogd/man5/syslog.conf.5.html&lt;/a&gt;

&lt;pre class="code" style="white-space:normal;"&gt;
マイナス記号 ``-'' を接頭すると、記録の際のファイルシステムバッファのフラッシュ動作を抑制する。
これを用いると、書き込み動作の直後にシステムに障害が発生した場合、
情報を失なう可能性があることに注意すること。
しかしながらこの機能は特に騒々しくロギングするプログラムを動作させる際のいくらかの性能改善には役に立つ。
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
そのままの設定では/var/log/messagesにもPostgreSQLのログが出力されてしまうので、
/var/log/messagesにはPostgreSQLのログが出ないように「local0.none」を追加。
&lt;/p&gt;

&lt;pre class="code"&gt;#*.info;mail.none;authpriv.none;cron.none            /var/log/messages
*.info;mail.none;authpriv.none;cron.none;local0.none            /var/log/messages&lt;/pre&gt;

&lt;p class="paragraph"&gt;
この後PostgreSQLとsyslogdを再起動すればＯＫ。
&lt;/p&gt;

&lt;pre class="code"&gt;# /etc/rc.d/init.d/postgresql restart
# /etc/rc.d/init.d/syslog restart&lt;/pre&gt;

&lt;p class="paragraph"&gt;
これで正しく/var/log/postgresにPostgreSQLのログが吐き出されるはずですが、
syslogは遅い上に取りこぼしがあるなど欠点も多いらしいので考えないといけないですね。
次はログ解析ツールpqaをインストールします。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-5784632185497305273?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/5784632185497305273/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=5784632185497305273' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/5784632185497305273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/5784632185497305273'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/03/postgresqlsyslog.html' title='PostgreSQLのログをsyslogに出力するときのメモ'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-1197144603038364940</id><published>2007-03-20T10:55:00.000+09:00</published><updated>2008-12-10T08:53:54.881+09:00</updated><title type='text'>Blogger正式版に移行完了</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_-sif9wLT5H0/Rf8_lQVW59I/AAAAAAAAAAU/9B9JSUXNK0g/s1600-h/PICT0032.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_-sif9wLT5H0/Rf8_lQVW59I/AAAAAAAAAAU/9B9JSUXNK0g/s200/PICT0032.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5043820016950503378" /&gt;&lt;/a&gt;
&lt;p class="paragraph"&gt;
最近やっとBloggerのBetaから新しいBloggerに移行しました。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
またずいぶんと空いてしまいました。今回は仕事だけでなくて自分の結婚式なんていうイベントもありました。たくさんの人にお祝いの言葉をいただいて、感激至極です。これからもがんばります。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
写真は結婚式を挙げた&lt;a href="http://awf.jp/"&gt;アートグレイス&lt;/a&gt;という結婚式場です。天気も最高、言うことナシです。普通の式場よりお値段は高めですが、すばらしい結婚式を挙げられますよ☆
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-1197144603038364940?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/1197144603038364940/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=1197144603038364940' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1197144603038364940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/1197144603038364940'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2007/03/blogger.html' title='Blogger正式版に移行完了'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_-sif9wLT5H0/Rf8_lQVW59I/AAAAAAAAAAU/9B9JSUXNK0g/s72-c/PICT0032.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-116719282457054539</id><published>2006-12-27T13:12:00.000+09:00</published><updated>2006-12-27T13:13:44.800+09:00</updated><title type='text'>X-Authentication-Warningフィールドの制御</title><content type='html'>&lt;p class="paragraph"&gt;
PHPからmail関数を使用してメールを送る際にX-Authentication-Warningフィールドが自動で付加されてしまい、
場合によっては迷惑メールとして扱われてしまう可能性があるので対処法を探してみました。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
PHPのmail関数のadditional_parametersに
&amp;quot;-f narucissus@sample.com&amp;quot;
のようにメールアドレスを記述すると送信者情報を指定できます。
これをつけないとアカウントによってメールが受信できないのでつけるようにしていますが、
ヘッダにX-Authentication-Warningフィールドが勝手に追加されてしまい、
Hotmailなどでは迷惑メールとして扱ったりすることがあるそうです。
（検索したらそのような記事を見つけたのですが、
自分のアカウントで試した限りGmailでもHotmailでも迷惑メールにはなりませんでした。）
&lt;/p&gt;

&lt;p class="paragraph"&gt;
まず最初に試したのはMTAの変更ですが、
sendmailをPostfixに変えたところヘッダのCRLFが一部勝手に置換されてしまい、
ヘッダの途中から本文と解釈されてしまうように…
回避するためにヘッダの改行コードをLFにするのもRFC違反なので気が進まず。
結局sendmailを使ったまま設定でなんとかすることにしました。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
編集箇所は/etc/mail/submit.cf内の以下の部分です。
Tapacheを追加しました。
&lt;/p&gt;

&lt;pre class="code"&gt;
#####################
#   Trusted users   #
#####################

# this is equivalent to setting class "t"
Ft/etc/mail/trusted-users
Troot
Tdaemon
Tuucp
&lt;strong&gt;Tapache&lt;/strong&gt;
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
submit.cfを保存したらmake submit.cfを実行して、sendmailを再起動。
これでX-Authentication-Warningがヘッダに含まれなくなりました。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-116719282457054539?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/116719282457054539/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=116719282457054539' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/116719282457054539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/116719282457054539'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/12/x-authentication-warning.html' title='X-Authentication-Warningフィールドの制御'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-116712663722144687</id><published>2006-12-26T18:49:00.000+09:00</published><updated>2006-12-26T18:51:28.710+09:00</updated><title type='text'>VMwareへのCentOSインストール失敗</title><content type='html'>&lt;p class="paragraph"&gt;
VMware5にCentOS 4.4 Serverをインストールするときに以下のようなメッセージが出て先に進めなかったのですが、
やっとGoogle先生の力を借りて解決しました。
&lt;/p&gt;

&lt;pre class="code"&gt;
ドライブがみつかりませんでした。

エラー発生 -
新規ファイルシステム作成のため有効なデバ
イスが見つかりません。ハードウェアをチェッ
クして、この原因を調査してください。
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
原因は（別のPCでは問題なくインストールに成功しているので原因はというのもアレですが）
ハードディスクをSCSIにしていたためでした。
新規仮想マシン作成ウィザードで仮想マシン構成を選択する際に「標準」ではなく「カスタム」を選択し、
仮想ディスクタイプを「SCSI（推奨）」でなく「IDE」にします。それだけ。
このへんの知識は疎くて全然ダメです。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-116712663722144687?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/116712663722144687/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=116712663722144687' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/116712663722144687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/116712663722144687'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/12/vmwarecentos.html' title='VMwareへのCentOSインストール失敗'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-116684628538459889</id><published>2006-12-23T12:56:00.000+09:00</published><updated>2006-12-23T12:59:06.910+09:00</updated><title type='text'>Eclipseで使えるJavaScriptエディタプラグイン</title><content type='html'>&lt;p class="paragraph"&gt;
Adobe Labsから提供されているJSEclipseというプラグインがいい感じです。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
これまではAptanaエディタを使用したり、JavaScriptを編集するときだけDreamweaverを使ったりしていました。
基本的にまだPHP,JavaScript,CSS,DBすべてeuc-jpで統一しているのですが（はやくutf-8に全面移行したい...）、
AptanaではJavaScript内のコメントに日本語が含まれると、ハイライト表示が崩れて色がおかしくなります。
（まぁプログラム上の影響はないんですが、気持ちのいいものではないです）
Dreamweaverではそのようなことはないですが、補完機能とかがなくて物足りない感じ。
標準的に使えるJavaScriptエディタがありませんでした。
そこで見つけてきたのがコレ。
&lt;/p&gt;

&lt;a href="http://phpspot.org/blog/archives/2006/12/javascripteclip.html" target="_blank"&gt;JavaScript編集に役立つEclipseプラグイン「JSEclipse」:phpspot開発日誌&lt;/a&gt;

&lt;p class="paragraph"&gt;
euc-jpでソースを書いていても特に問題はないようですし、
「document.」まで打つと関数名などを補完してくれる機能が非常にありがたいのです。
一番驚いたのはアウトラインですね。
JavaScriptで作成したクラス（正確にはfunctionで作成するのでclassキーワードは使いませんが）をちゃんとした階層構造で表示しています。
Dreamweaverだと関数名から一瞬で移動することができるんですが、
var func = function(){};のように定義すると関数名が空になってしまってよくわからなかったりします。
ナイスJSEclipse！
&lt;/p&gt;

&lt;p class="paragraph"&gt;
ざっくりとインストール方法なぞ。
&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href="http://labs.adobe.com/technologies/jseclipse/" target="_blank"&gt;Adobe Labs&lt;/a&gt;にアクセス&lt;/li&gt;
  &lt;li&gt;Downloadをクリック。Adobe Membershipに登録する必要あり。「E-MAIL ADDRESS」を入力し、「No, I will create one now.」を選択して「Continue」をクリック。&lt;/li&gt;
  &lt;li&gt;ダウンロードのリンクがある（はず）ので、クリックしてzipファイルをダウンロード。登録が完了してメールが届く（特にメールの中のリンクをクリックする必要はない）。&lt;/li&gt;
  &lt;li&gt;Eclipseを起動し、「ヘルプ」→「ソフトウェア更新」→「検索とインストール」を選択&lt;/li&gt;
  &lt;li&gt;「インストールする新規フィーチャーを検索」を選択して「次へ」をクリック&lt;/li&gt;
  &lt;li&gt;「新規アーカイブ・サイト」をクリックし、先ほどダウンロードしたファイル（私の環境ではjseclipse_plugin_121406.zip）を開く&lt;/li&gt;
  &lt;li&gt;jseclipse_plugin_121406.zipにだけチェックをつけ、次へ。後はそのまま進んでいけばインストールされるはず。&lt;/li&gt;
&lt;/ol&gt;

&lt;p class="paragraph"&gt;
zipファイルを解凍すると中にインストール方法が英語で書いてあるので、
上記の方法がうまくいかない（もしくは間違っている）場合はそちらを参照してください。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
＃Bloggerが正式版になったみたいですね。移行してみようかな。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-116684628538459889?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/116684628538459889/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=116684628538459889' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/116684628538459889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/116684628538459889'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/12/eclipsejavascript.html' title='Eclipseで使えるJavaScriptエディタプラグイン'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-116675959539073787</id><published>2006-12-22T12:52:00.000+09:00</published><updated>2006-12-22T12:53:15.676+09:00</updated><title type='text'>勤務中に眠らないためのコツ</title><content type='html'>&lt;p class="paragraph"&gt;
昼食後はかなり眠いです。そこで勤務中に眠らないためのコツをふたつ。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
私が効果的だと思うのは、体を弛緩させないこと。
どこにも力が入っていない状態だと、意識で起きよう起きようと思っても睡魔を制御できません。
一番手軽なのはガムですね。
XYLISHの大粒タイプを数個（結構な量です）を噛んでいるといくらかマシです。
もうひとつ実践しているのは椅子に座っているときの姿勢。
猫背にならないように背筋をぴんと伸ばすと背中の筋肉が緊張してあまり眠くなりません。
ダイエット効果もあり、仕事ができるように見える効果もありです。お試しあれ。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-116675959539073787?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/116675959539073787/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=116675959539073787' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/116675959539073787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/116675959539073787'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/12/blog-post.html' title='勤務中に眠らないためのコツ'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-116263481014688674</id><published>2006-11-04T19:03:00.000+09:00</published><updated>2006-11-04T19:06:51.166+09:00</updated><title type='text'>JavaScriptでcookieを楽に扱うための管理クラス</title><content type='html'>&lt;p class="paragraph"&gt;
JavaScriptでcookieを扱う場合はdocument.cookieを使います。
これが値の設定は楽なんですが取得が面倒なので、
setCookie(key, value)やgetCookie(key)のように簡単に使えるクラスを作ってみました。
ドメインとか有効期限とかの処理は含まない簡易版です。
いつもの通りもしこれを転用する場合は自己責任でお願いします。
&lt;/p&gt;

&lt;pre class="code"&gt;
/**
 * クッキー管理
 *
 * @constructor
 */
CookieManager = function()
{
};

CookieManager.prototype = {
    /**
     * 値の設定
     * @param {Object} key キー
     * @param {Object} value 格納する値
     */
    setCookie: function(key, value)
    {
        if ('string' === typeof key &amp;&amp; key.match(/^[0-9a-zA-Z\-_\[\]]+$/))
        {
            document.cookie = key + '=' + escape(value);
        }
    },
    /**
     * 値の削除
     * @param {Object} key 削除する値のキー
     */
    removeCookie: function(key)
    {
        document.cookie = key + '= ; expires=' + (new Date(1999, 0, 1)).toGMTString();
    },
    /**
     * 値の取得
     * @param {Object} key 取得する値のキー
     * @return {String} 値
     */
    getCookie: function(key)
    {
        cookie_list = document.cookie.split('; ');
        for (i = 0 ; i &lt; cookie_list.length ; i++)
        {
            key_and_value_list = cookie_list[i].split('=');
            if (key_and_value_list[0] == key)
            {
                return unescape(key_and_value_list[1]);
            }
        }

        return undefined;
    }
};
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
こんな感じで使います。
&lt;/p&gt;

&lt;pre class="code"&gt;
var cm = new CookieManager();
cm.setCookie('userid', 'narucissus');
str = cm.getCookie('userid');
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
たったこれだけでもcookieの扱いが簡単になるので便利です。
クッキーが正しく設定されたかどうかを確認するにはFirefoxのCookieCullerというエクステンションを使用しました。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-116263481014688674?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/116263481014688674/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=116263481014688674' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/116263481014688674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/116263481014688674'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/11/javascriptcookie.html' title='JavaScriptでcookieを楽に扱うための管理クラス'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-116195454225251737</id><published>2006-10-27T22:05:00.000+09:00</published><updated>2006-10-28T17:02:47.473+09:00</updated><title type='text'>「Internet Explorerでは、○○○○をダウンロードできません。」</title><content type='html'>&lt;p class="paragraph"&gt;
IEで現在開発中のWeb画面を見ていたら、以下のようなエラーが出ました。なんだこれは？
&lt;/p&gt;

&lt;div style="background-color:#FFFFFF;border:1px solid #CCCCCC;padding:4px;"&gt;
Internet Explorerでは、○○○○をダウンロードできません。&lt;br&gt;
ファイルをキャッシュに書き込めませんでした
&lt;/div&gt;

&lt;p class="paragraph"&gt;
このエラーメッセージで検索すると以下のサイトが見つかりました。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
&lt;a href="http://www.bluemooninc.biz/~xoops/modules/newbb/viewtopic.php?topic_id=403&amp;forum=10" target="_blank"&gt;bluemoon.XOOPS(c) フォーラム&lt;/a&gt;
&lt;/p&gt;

&lt;p class="paragraph"&gt;
ふむふむ。『ssl通信を使う環境で、IEへファイルをダウンロードする場合、HTTP ヘッダーに「Cache-Control:no-cache」の指定があると上のエラーとなる。』
なんだか別のところで同じような現象を見た気がします。
と思って探してみたら、やっぱり前に同様の現象の対処をしていたことがありました。
そのときにたどり着いたサイトは以下のMicrosoftのページです。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
&lt;a href="http://support.microsoft.com/?scid=kb;ja;323308&amp;spid=2073&amp;sid=globalp" target="_blank"&gt;Internet Explorer が SSL 経由によるファイルのダウンロードで "No-Cache" ヘッダーを処理できない&lt;/a&gt;
&lt;/p&gt;

&lt;p class="paragraph"&gt;
はっきり言ってこのタイトルじゃまったく今回のエラーとのつながりを感じることができません。
当時よく対処できたものだとちょっと自分に感心してしまいます。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
具体的にどのようなケースがまずいかというと、
&lt;strong&gt;SSL接続でPHPプログラムを使用してファイルのダウンロード（例えば画像の生成など）をするとき、
Content-TypeやContent-Lengthなどの最低限のヘッダの設定しかしていないようなケース&lt;/strong&gt;です。
ieHTTPHeadersを使ってエラーが出る場合と出ない場合のヘッダを見比べて見ましょう。
PHPファイルにIDを渡してやると画像がダウンロードされるサンプルです。
エラーが出る場合は以下のようになります。
&lt;/p&gt;

&lt;pre class="code"&gt;
GET /file_download.php?fid=1234 HTTP/1.1
Accept: */*
Accept-Language: ja
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727)
Host: XXXXXXXXXX
Connection: Keep-Alive
Cookie: PHPSESSID=8ced8c52c961fdbcf0421f4ff8d0ccef

HTTP/1.1 200 OK
Date: Fri, 27 Oct 2006 12:40:46 GMT
Server: Apache/2.0.52 (CentOS)
X-Powered-By: PHP/4.3.9
Expires: Thu, 19 Nov 1981 08:52:00 GMT
&lt;strong&gt;Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0&lt;/strong&gt;
&lt;strong&gt;Pragma: no-cache&lt;/strong&gt;
Accept-Ranges: none
Content-Disposition: attachment; filename=Winter.jpg
Content-Transfer-Encoding: binary
Content-Length: 105542
Connection: close
Content-Type: image/pjpeg
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
JPEG画像なのでContent-Typeがimage/pjpegになっていますが、
Cache-ControlとPragmaがno-cacheになっています。
no-cacheを回避するためにPHPで以下のようなコードを書いてやります。
&lt;/p&gt;

&lt;pre class="code"&gt;
header('Pragma: private');
header('Cache-Control: private');
//header関数は画像の出力の前に行う
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
するとヘッダは以下のように変わります。
&lt;/p&gt;

&lt;pre class="code"&gt;
GET /file_download.php?fid=1234 HTTP/1.1
Accept: */*
Accept-Language: ja
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727)
Host: XXXXXXXXXX
Connection: Keep-Alive
Cookie: PHPSESSID=8ced8c52c961fdbcf0421f4ff8d0ccef

HTTP/1.1 200 OK
Date: Fri, 27 Oct 2006 12:39:11 GMT
Server: Apache/2.0.52 (CentOS)
X-Powered-By: PHP/4.3.9
Expires: Thu, 19 Nov 1981 08:52:00 GMT
&lt;strong&gt;Cache-Control: private&lt;/strong&gt;
&lt;strong&gt;Pragma: private&lt;/strong&gt;
Accept-Ranges: none
Content-Disposition: attachment; filename=Winter.jpg
Content-Transfer-Encoding: binary
Content-Length: 105542
Connection: close
Content-Type: image/pjpeg
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
これでIEでもエラーが出なくなるはずです。
Cache-ControlとPragmaに指定する値はno-cacheでなければいいので、
privateかpublicになります。
privateにした場合は通常ブラウザにファイルがキャッシュされ、経由したプロキシサーバなどには残りません。
publicにした場合には確かプロキシにも残ります。（うろ覚え）
Microsoftのページには書いてありませんでしたが、Pragmaを同時に指定しないとこれも正しく動かなかった記憶があるのですが、ソースがどこか覚えていません。
一緒に使わなければならないことだけはなんとなく覚えてるんですが....
ヘッダについて詳しく知りたい場合は以下が参考になります。（いつも読ませていただいています）
&lt;/p&gt;

&lt;a href="http://www.studyinghttp.net/header#Cache-Control" target="_blank"&gt;[Studying HTTP] HTTP Header Fields&lt;/a&gt;

&lt;p class="paragraph"&gt;
なんだか文章がまとまっていなくてグダグダですね。早く忙しいのが落ち着かないかなぁ。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-116195454225251737?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/116195454225251737/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=116195454225251737' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/116195454225251737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/116195454225251737'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/10/internet-explorer.html' title='「Internet Explorerでは、○○○○をダウンロードできません。」'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-116064396219826110</id><published>2006-10-12T18:02:00.000+09:00</published><updated>2006-10-12T18:06:02.786+09:00</updated><title type='text'>セキュリティで保護されていると警告が出るのをなかなか回避できなかった自分のケース</title><content type='html'>&lt;p class="paragraph"&gt;
毎回だいぶニッチな話題を提供しております。
（と言ってもこのブログを読んでる人はホントにわずかなので、提供というのもおこがましいですが....）
今回はIEで以下のようなメッセージが出てしまったケースの対処についてです。
&lt;/p&gt;

&lt;div style="background-color:#FFFFFF;border:1px solid #CCCCCC;padding:4px;"&gt;
このページにはセキュリティで保護されている項目と保護されていない項目が含まれています。 
保護されていない項目を表示しますか?
&lt;/div&gt;

&lt;p class="paragraph"&gt;
&lt;a href="http://support.microsoft.com/kb/300443/ja" target="_blank"&gt;[IE6] Webコンテンツゾーンのセキュリティ設定に加えられた変更&lt;/a&gt;
&lt;/p&gt;

&lt;p class="paragraph"&gt;
上記のエラーが発生するのは、httpsで通信するページ内でhttpアクセスが発生してしまうのが原因です。
例えばSSLで通信が暗号化された
https://www.sample.com/
が、内部で
&amp;lt;img src=&amp;quot;http://www.yahoo.co.jp/blank.gif&amp;quot;&amp;gt;
のように画像を参照してしまうと上記の警告が出ることになります。
（確認はしていませんが、CSSやJavaScriptでも起こるかもしれません）
&lt;/p&gt;

&lt;p class="paragraph"&gt;
これを回避するには、IEのメニューから「ツール」「インターネットオプション」を選んで、
「セキュリティ」タブの「レベルのカスタマイズ」ボタンをクリックし、
「混在したコンテンツを表示する」の設定を「無効にする」にします。
ただしこれではクライアント側での設定変更を強制することになるので、
根本的な解決になっていません。
できればサーバ側でhttpsとhttpのコンテンツを混在させないように作るべきです。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
もちろん今のプロジェクトでもその点には気をつけて開発をしていたつもりですが、
どうしても発生してしまう画面がいくつかあったのでした。
HTML内で参照している画像などのパスはすべて確認しましたがhttpでパスを指定しているところは見つけられません。
その画面ではYahoo! UI Libraryを使用していたので、
もしかしてYUIで使用しているJavaScriptかCSSの中にhttpでアクセスしているファイルがあるのではないかと予想を立てましたが、
怪しいと思われる箇所をすべて変更してみても現象は同じでした。
となるとあと考えられる可能性は？
&lt;/p&gt;

&lt;p class="paragraph"&gt;
上記のエラーでGoogle検索をしてみると、
画像や&lt;b&gt;iframe&lt;/b&gt;でhttp接続をしている場合警告が出てしまうと書いてあるページがありました。
&lt;b&gt;iframeタグ！&lt;/b&gt;そういえば画面遷移を行わないように画像ファイルをアップロードするのにiframeを使っています。
ただしsrcには特定のファイルを指定する必要がないため、javascript:void(0)と書いていました。
javascript:void(0)を削除して空のHTMLのパスを指定して画面をリロードしてみると....警告なし！
こんなのが原因だなんて普通気づきませんよ....
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-116064396219826110?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/116064396219826110/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=116064396219826110' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/116064396219826110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/116064396219826110'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/10/blog-post_12.html' title='セキュリティで保護されていると警告が出るのをなかなか回避できなかった自分のケース'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-116004334677169937</id><published>2006-10-05T19:15:00.000+09:00</published><updated>2006-10-05T19:18:43.023+09:00</updated><title type='text'>ドメインとクッキーの知られざる関係</title><content type='html'>&lt;p class="paragraph"&gt;
サブドメインの作成の仕方を間違えるとIEで正しくクッキーが設定されなくなりますよ、というお話。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
Webシステムが何回かバージョンアップを行う場合、
バージョンごとに環境を分離しておきたいと考えます。
しかし本番サーバではDocumentRoot直下に各ディレクトリを配置するのに対して、
開発環境で（DocumentRootが/var/www/htmlだとして）/var/www/html/prj_v1のようにひとつめのバージョンのプロジェクトを配置してしまうとURLの相対パスが変わってしまうことになります。
このやり方だとDocumentRoot以下に置くべきではないconfのようなディレクトリを/var/www/confと作った場合、
２個目のconfの名前をどうしようということにもなります。
これを解決するために、
例えばprj_v1というユーザを作成してそのユーザのpublic_html以下にシステムを作ればconfの衝突は避けられますが、
やっぱりURLが
http://myhost.sample.com/~prj_v1/
などということになってURLのパスが本番サーバと異なってしまいます。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
そこで考えたのがサブドメイン。
prj_v1.myhost.sample.comが同じIPを指すようにBINDの設定をし、
/var/www/prj_v1/confと/var/www/prj_v1/htmlを作成してApacheのVirtualHostを記述してやれば
http://prj_v1.myhost.sample.com/
でアクセス可能になるのでいいじゃないか！と考えたわけです。
これがうまく動くようなので、もっと早くBINDの使い方を覚えればよかったなぁと思いつつ開発を進めるうち奇妙な現象に遭遇。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
&lt;b&gt;IEで管理画面にログインできない....&lt;/b&gt;
&lt;/p&gt;

&lt;p class="paragraph"&gt;
処理を追ってみると、ログイン時に設定したはずのセッション情報がログイン後の画面で読み取れず未ログインとみなされ、
再びログイン画面に強制移動になっていました。
セッション情報のセット自体はPHPでは成功していて、ブラウザに対して正しくレスポンスヘッダを設定しているようです。
となると、問題はIEがクッキーを受け入れていないこと。なぜに？
&lt;/p&gt;

&lt;p class="paragraph"&gt;
数日後に先輩にその話をしてみると、「ドメインにアンダーバーは使えないはずだよ」とのこと。
ドメインに使用してはいけない文字を使っていたらIEがクッキーを受け付けないようにするというのはいかにもありそうな感じです。
結果言われたとおりにアンダーバーをハイフンに変えてBINDとApacheを再設定し起動しなおすと、
IEでも管理画面にログインできるようになったのでした。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
Firefoxのように使用してはいけない文字を含んでいても正しく処理するものと、
IEのように正しく処理しないものがあるわけですね。
そういえばCSSのクラス名にもアンダーバーを使ってはいけないというのをどこかで見たことがあります。
（古いブラウザでは正しく処理できないとか）
ドメインやCSSに限らず、使用できる文字は把握しておくに越したことはないなと思いました。
（実際には難しいですが....）
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-116004334677169937?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/116004334677169937/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=116004334677169937' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/116004334677169937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/116004334677169937'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/10/blog-post.html' title='ドメインとクッキーの知られざる関係'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-116004121083249132</id><published>2006-10-05T18:38:00.000+09:00</published><updated>2006-10-05T18:41:20.606+09:00</updated><title type='text'>activeCollabのアップグレードに失敗したＯ氏のケース</title><content type='html'>&lt;p class="paragraph"&gt;
大学からの&lt;a href="http://curlybrace.net/wp/" target="_blank"&gt;友人Ｏ氏&lt;/a&gt;にはWeb制作で行き詰ったときにアイデアをもらったり、
CSSの変な挙動の原因を調べてもらったりしているので、
彼が困っているときには（仕事中にもかかわらず）小生の出番です。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
でその内容は、activeCollabのアップグレードがうまくいかないんだけどなんで？というものでした。
エラー画面のキャプチャには以下のように書いてあります。
アップグレードは0.6から0.7です。
&lt;/p&gt;

&lt;div style="background-color:#FFFFFF;border:1px solid #CCCCCC;padding:4px;"&gt;
&lt;div style="color:#01345F;font-weight:bold;"&gt;Upgrade process log&lt;/div&gt;
&lt;ul style="list-style-type:square"&gt;
  &lt;li style="color:#157313;"&gt;&lt;b&gt;Start:&lt;/b&gt; Config file found and loaded.&lt;/li&gt;
  &lt;li style="color:#157313;"&gt;&lt;b&gt;DB:&lt;/b&gt; Upgrade script has connected to the database.&lt;/li&gt;
  &lt;li style="color:#E70705;"&gt;&lt;b&gt;DB:&lt;/b&gt; Failed to execute DB scheme transformations.
  MySQL said: You have an error in your SQL syntax.
  Check the manual that corresponds to your MySQL server version for the right syntax to use near
  'COLLATE=utf8_unicode_ci' at line 9&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;p class="paragraph"&gt;
赤文字で出ているところがエラーっぽいです。
そのまま読むと、MySQLの構文エラーが発生している模様。
utf8関連でエラーが出ているということは、MySQLがutf8を扱えないバージョンなのでは？
&lt;/p&gt;

&lt;p class="paragraph"&gt;
Ｏ氏に確認してもらうと、
案の定使用しているサーバは&lt;a href="http://www.sakura.ne.jp/" target="_blank"&gt;SAKURA Internet&lt;/a&gt;でMySQLのバージョンが4.0系とのこと。
困ったことにアップグレードが途中まで進んでしまったらしく、ログインできない状態らしいです。
&lt;b&gt;activeCollabをアップグレードする場合はMySQLがバージョン4.1以上であることを確認してから行いましょう！&lt;/b&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-116004121083249132?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/116004121083249132/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=116004121083249132' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/116004121083249132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/116004121083249132'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/10/activecollab.html' title='activeCollabのアップグレードに失敗したＯ氏のケース'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-115988571050708888</id><published>2006-10-03T23:28:00.000+09:00</published><updated>2006-10-03T23:30:03.250+09:00</updated><title type='text'>Windows Script Debuggerインストールに失敗</title><content type='html'>&lt;p class="paragraph"&gt;
&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=ja&amp;FamilyID=e606e71f-ba7f-471e-a57d-f2216d81ec3d" target="_blank"&gt;Windows Script Debugger&lt;/a&gt;のインストールに失敗しました。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
IEのエラーは何行目かだけ出力されて、どのファイルでのエラーなのかが分からないので非常に不便です。
Yahoo!UIにからんだエラーっぽいので、FireBugのようにどのファイルのどこでエラーが起こったのかが知りたいのですがなかなか見つけられない。
というわけでIEに手を入れるのはイヤだなぁと思いつつもWindows Script Debugger入れたのに、
上記のサイトからダウンロードしてきたインストーラでインストールして再起動しても表示メニューになにも追加されないわけです。
動作が変わってしまってないことを祈ろう....
&lt;/p&gt;

&lt;p class="paragraph"&gt;
さいわい一緒に入れた
&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=e59c3964-672d-4511-bb3e-2d5e1db91038&amp;displaylang=en" target="_blank"&gt;IE Developer Toolbar&lt;/a&gt;
は正しく動いている様子。
でもこれじゃやっぱりエラーの場所は追えない....
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-115988571050708888?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/115988571050708888/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=115988571050708888' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115988571050708888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115988571050708888'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/10/windows-script-debugger.html' title='Windows Script Debuggerインストールに失敗'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-115950287067515237</id><published>2006-09-29T13:07:00.000+09:00</published><updated>2006-09-29T13:07:52.096+09:00</updated><title type='text'>Opera用ユーザJavaScriptファイルの例</title><content type='html'>&lt;p class="paragraph"&gt;
Webサイトを作る側として他のサイトを見ていると気になるのは、
フォントの読みにくさだったりします。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
MS Pゴシックで表示されると英数字の表示が気に入らないので個人的にはArialとかVerdana系にしてしまいたいのですが、
ブラウザの表示フォントを変えてしまうとすべての閲覧サイトで変更されてしまって好ましくありません。
特定のサイトだけフォントを変えたい、と。
そんなわけでOperaのユーザJavaScriptファイルを書いてみました。
&lt;/p&gt;

&lt;pre class="code"&gt;
// ==UserScript==
// @include http://www.atmarkit.co.jp/*
// @include http://gigazine.net/*
// @include http://www.itmedia.co.jp/*
// @include http://jsgt.org/*
// @include http://slashdot.jp/*
// @include http://www.postgresql.jp/*
// @include http://journal.mycom.co.jp/*
// @include http://sunset.freespace.jp/*
// @include http://www.applelinkage.com/*
// @include http://www.ohmynews.co.jp/*
// ==/UserScript==

document.body.style.fontFamily = 'Verdana, Arial, "ヒラギノ角ゴ Pro W3", "ＭＳ Ｐゴシック", Osaka, Helvetica, sans-serif';

var divTag = document.createElement("div");
var textNode = document.createTextNode("customizing...");
var attr = document.createAttribute("style");
attr.value = "background-color:#FF0000;font-size:11px;font-family:Verdana;color:#FFFFFF;position:fixed;width:15%;top:0;left:85%;z-index:10000;";

divTag.setAttributeNode(attr);
divTag.appendChild(textNode);

document.body.appendChild(divTag);
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
document.body.style.fontFamilyを設定するだけでなく、
本当にユーザJavaScriptファイルが読み込まれているのか確認するために
「customizing...」という文字列を表示してみました。
&lt;a href="http://gigazine.net/" target="_blank"&gt;GIGAZINE&lt;/a&gt;や&lt;a href="http://slashdot.jp/" target="_blank"&gt;スラッシュドット&lt;/a&gt;では正しく動作しているように見えますが、
なぜか正しく動作してくれないサイトも....なぜだろう。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-115950287067515237?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/115950287067515237/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=115950287067515237' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115950287067515237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115950287067515237'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/09/operajavascript.html' title='Opera用ユーザJavaScriptファイルの例'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-115944932944952868</id><published>2006-09-28T22:14:00.000+09:00</published><updated>2006-09-28T22:15:30.210+09:00</updated><title type='text'>JavaScriptでfunction_existsをするには</title><content type='html'>&lt;p class="paragraph"&gt;
PHPのfunction_exists関数のようなものがJavaScriptで欲しかったので探してみましたが、
英語のサイトでこんな感じのやり方を見つけたのでメモ。
&lt;/p&gt;

&lt;pre class="code"&gt;
//関数が存在するかチェックしてから呼び出し
if ('function' === typeof obj.setName)
{
 obj.setName("foo");
}
else
{
 alert("関数setNameは存在しません。");
}
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
存在のチェックをしたいオブジェクトが存在する場合はobj.[関数名]をtypeofでチェックして'function'かどうか比較すればOK。
jsファイルにそのまま書いた関数はwindow.[関数名]をtypeofすればOKです。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
なぜこんなことをしたかったかというと、
定期的にsetIntervalで呼び出される関数があって、
その関数が何回か繰り返し実行された後に成功したら特定の処理を行いたいというケースがありました。
そのsetIntervalで呼び出される関数にパラメータとして渡すオブジェクトにコールバック関数を定義しておいて、
処理が正しく完了したときに呼び出してもらおうということを考えたわけです。
期待したとおりに動くのですが、渡すオブジェクトによってコールバックして欲しい関数がバラバラなので、
コールバックするときに関数の存在をチェックしてから呼び出すようにしたかったんですね。
こういうのはあんまり使用する機会はないかも、ですが。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-115944932944952868?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/115944932944952868/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=115944932944952868' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115944932944952868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115944932944952868'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/09/javascriptfunctionexists.html' title='JavaScriptでfunction_existsをするには'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-115926887734805596</id><published>2006-09-26T20:04:00.000+09:00</published><updated>2006-09-26T20:08:03.146+09:00</updated><title type='text'>簡易版java.util.SetみたいなものをJavaScriptで作る</title><content type='html'>&lt;p class="paragraph"&gt;
JavaScriptで重複しない値を保持するJavaのSetみたいなものが欲しくて作ってみました。
&lt;/p&gt;

&lt;pre class="code"&gt;
/**
 * 簡易Set
 *
 * @constructor
 */
Set = function()
{
 /**
  * 重複しない値を格納する変数
  */
 this._setObj = new Object();
};

Set.prototype = {
 /**
  * 値の格納
  * @param {Object} value 格納する値
  */
 add: function(value)
 {
  this._setObj[(typeof value) + '_' + value] = true;
 },
 /**
  * 値の削除
  * @param {Object} value 削除する値
  */
 remove: function(value)
 {
  delete (this._setObj[(typeof value) + '_' + value]);
 },
 /**
  * 値の取得
  */
 getValues: function()
 {
  var list = [];
  
  for (i in this._setObj)
  {
   items = i.split('_');
   list.push(items[1]);
  }
  
  return list;
 }
};
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
こんな感じで使います。
&lt;/p&gt;

&lt;pre class="code"&gt;
var setObj = new Set();
setObj.add('foo');
setObj.add('bar');
setObj.add('foo');
setObj.add('fubar');
setObj.remove('bar');
alert(setObj.getValues().join(','));
//foo,fubarが出力される
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
prototype.jsにこんな感じのクラスがあったようが気がしましたけどなかったです。
このままでは特定の値（アンダーバーを含む文字列とか）を正しく扱えないですが、
とりあえずプロジェクトで使用する分には十分なのでそのまま掲載。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-115926887734805596?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/115926887734805596/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=115926887734805596' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115926887734805596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115926887734805596'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/09/javautilsetjavascript.html' title='簡易版java.util.SetみたいなものをJavaScriptで作る'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-115916091018910654</id><published>2006-09-25T14:07:00.000+09:00</published><updated>2006-09-25T14:10:43.056+09:00</updated><title type='text'>MySQLの複数行insertを回避するには</title><content type='html'>&lt;p class="paragraph"&gt;
MySQLには複数行insertという便利が機能があります。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
が、Windows上でPHP+MySQLで作成したデータをLinux上のPostgreSQLに入れようと思ったときに、
複数行insertでmysqldumpされてしまうとPostgreSQLで取り込めないわけです。
なにかいい手はないかと思って調べてみると、
--compatibleというオプションを使用すればPostgreSQLにcompatibleなmysqldumpを出してくれるとのこと。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
出ないよ？...orz
&lt;/p&gt;

&lt;p class="paragraph"&gt;
デフォルトで--extended-insertが有効になっているらしく、
１行ごとのinsertを吐き出したくてもそういうオプションがないらしい。
本を調べてもネットを調べても適当なオプションが見つけられないのでマニュアルを読んでやっと発見。
どうやら--extended-insertにはTRUEとFALSEを指定できるようで。
&lt;/p&gt;

&lt;pre class="code"&gt;
$ mysqldump tracedirdb -h 172.16.*.* -u tracedir -ptracedir --default-character-set=ujis --table foo_tbl --no-create-info --complete-insert &lt;b&gt;--extended-insert=FALSE&lt;/b&gt; --quote-names="" --add-locks=FALSE
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
mysqldump --helpとするとmysqldumpを実行するときの変数が一覧で見れます。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-115916091018910654?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/115916091018910654/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=115916091018910654' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115916091018910654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115916091018910654'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/09/mysqlinsert.html' title='MySQLの複数行insertを回避するには'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-115884995152918957</id><published>2006-09-21T23:41:00.000+09:00</published><updated>2006-09-21T23:48:34.490+09:00</updated><title type='text'>Apacheのコンテキスト</title><content type='html'>&lt;p class="paragraph"&gt;
.htaccessに以下のような記述をしてSSLでしか特定のディレクトリにアクセスできないようにしたかったのですが、うまく行きません。
&lt;/p&gt;

&lt;pre class="code"&gt;
&amp;lt;Directory /foo/bar&amp;gt;
SSLRequireSSL
&amp;lt;/Directory&amp;gt;
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
.htaccessでは&amp;lt;Directory&amp;gt;ディレクティブは使用できない、
というのが意図した通りに動かない原因でした。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
この原因を突き止めるまでいろいろ調べている途中に、
ちゃんと.htaccessで使えるディレクティブなのかそうでないのかがドキュメントに書かれていることを始めて知ったわけです。
今まで何度か同じように.htaccessに&amp;lt;Directory&amp;gt;ディレクティブ書いてうまく動かないことを繰り返したような気が....進歩ないなぁ。
&lt;/p&gt;

&lt;fieldset class="quotation"&gt;
&lt;legend&gt;リンク&lt;/legend&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;a href="http://httpd.apache.org/docs/2.0/ja/mod/directive-dict.html#Context
" target="_blank"&gt;ディレクティブの解説に使われる用語 - Apache HTTP サーバ&lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href="http://httpd.apache.org/docs/2.0/ja/mod/core.html#directory" target="_blank"&gt;core - Apache HTTP サーバ&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;/fieldset&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-115884995152918957?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/115884995152918957/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=115884995152918957' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115884995152918957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115884995152918957'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/09/apache.html' title='Apacheのコンテキスト'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-115838893513673816</id><published>2006-09-16T15:40:00.000+09:00</published><updated>2006-09-16T15:42:15.263+09:00</updated><title type='text'>PostgreSQLで正しく日本語がソートされないケース発見</title><content type='html'>&lt;p class="paragraph"&gt;
CentOS4.3でPostgreSQLを使っていたら、
日本語が入っている列をキーにしたソートが正しく行えていませんでした。
この現象を回避するための日本語の情報がある程度ネットでも検索できますが、
一応備忘録も兼ねているので書いておきます。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
以下root権限で作業します。
&lt;/p&gt;

&lt;pre class="code"&gt;
# pg_controldata /var/lib/pgsql/data/
pg_control version number:            72
Catalog version number:               200310211
Database cluster state:               in production
pg_control last modified:             2006年09月08日 13時23分56秒
Current log file ID:                  0
Next log file segment:                9
Latest checkpoint location:           0/8F9149C
Prior checkpoint location:            0/8F8D380
Latest checkpoint's REDO location:    0/8F9149C
Latest checkpoint's UNDO location:    0/0
Latest checkpoint's StartUpID:        21
Latest checkpoint's NextXID:          306245
Latest checkpoint's NextOID:          472767
Time of latest checkpoint:            2006年09月08日 13時23分54秒
Database block size:                  8192
Blocks per segment of large relation: 131072
Maximum length of identifiers:        64
Maximum number of function arguments: 32
Date/time type storage:               floating-point numbers
Maximum length of locale name:        128
LC_COLLATE:                           ja_JP.UTF-8
LC_CTYPE:                             ja_JP.UTF-8
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
最後のLC_COLLATEとLC_CTYPEがロケールを表していて、
ja_JP.UTF-8やja_JP.eucJPになっていると正しくソートが行われないそうです。
ここを「C」にすると正しくソートが行えるようになります。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
ただし、ロケールを変更するためには設定ファイルを書き直すなどの方法ではダメらしく、
initdbからやり直さなければなりません。
initdbのサンプルは以下の通り。
&lt;/p&gt;

&lt;pre class="code"&gt;
# initdb -D /var/lib/pgsql/data --encoding=EUC_JP --locale=C
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
これで再びpg_controldataコマンドを実行してLC_COLLATEとLC_CTYPEを確認し、
「C」になっていれば正しくソートが行えるようになるはずです。
しかし既にDBにデータが入っているといちいちデータをダンプして
initdbしたあとリストアする必要があるのが難点。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-115838893513673816?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/115838893513673816/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=115838893513673816' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115838893513673816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115838893513673816'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/09/postgresql.html' title='PostgreSQLで正しく日本語がソートされないケース発見'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-115838820632439580</id><published>2006-09-16T14:51:00.000+09:00</published><updated>2006-09-16T15:42:35.986+09:00</updated><title type='text'>JavaScript Lintを使用して正しいJavaScriptソースを書く</title><content type='html'>&lt;p class="paragraph"&gt;
JSLintをご存知でしょうか？JavaScriptの構文チェックを行ってくれる仕組みで、
オンラインでtextareaに直接jsのソースを入力するタイプと、
Windowsのシェルで実行できるものがあります。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
ここではWindows上でjsソースの構文チェックを行うときの方法をメモ。
まず下記のリンクのjslintからソースをダウンロードしてください。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
ダウンロードしたあとは、JSLint and WSHに書いてある通りなんですが、cscriptで実行します。
&lt;/p&gt;

&lt;pre class="code"&gt;
C:\&amp;gt; cscript jslint.js &lt; [js file]
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
しかし、以前やったときには正しく動作していたはずが、
今の新しいPCではうまく動かないのでした。トホホ。
かといってすべてオンラインで流すのもちょっと気が引けます。
そんなわけでしばらくjslintから遠ざかっていましたが、
ふとJavaScript Lintなるjslintの後継者を発見しました。
（下記リンク参照）
&lt;/p&gt;

&lt;p class="paragraph"&gt;
JavaScript Lintでなにができるかというのは本家サイトや日本語訳を出しているブログに任せるとして、
簡単な使い方をメモ。
jslintと同じだろうと思って最初つまずきました。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
まず本家サイトからファイルをダウンロードします。
for Windowsとfor Linuxがありますが、私はfor Linuxをダウンロードしました。
解凍するとjsl-0.2.6-linuxというディレクトリが作成され、
実行権限のついたjslという本体プログラムとjsl.default.confという設定ファイルがあります。
（特にjsl-test.jsは使用しませんでした。）
まずjsl.default.confをコピーします。
&lt;/p&gt;

&lt;pre class="code"&gt;
$ cp jsl.default.conf jsl.sample.conf
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
次にjsl.sample.confを編集します。
オプションの変更等ができますが、とりあえず編集が必要なのは末尾のファイルを指定する部分だけです。
このjsl.sample.confにターゲットになるファイルを記述するのに気づかず、
jslコマンドの引数にJavaScriptファイルを指定して「動かねー動かねー」と悩んではいけません。（恥）
&lt;/p&gt;

&lt;pre class="code"&gt;
### Files
# Specify which files to lint
# Use "+recurse" to enable recursion (disabled by default).
# To add a set of files, use "+process FileName", "+process Folder\Path\*.js",
# or "+process Folder\Path\*.htm".
#
+process /home/httpd/html/common.js
+process /home/httpd/html/default.js
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
設定ファイルのコメントを読むと指定したディレクトリ以下のファイルを再帰的にチェックとかできるみたいですね。
現在のディレクトリからの相対パス指定もできますが、
上にさかのぼる../を使用した相対パス指定ができませんでした。
そのため自分の場合は（プロジェクトの都合上）例のようにすべて絶対パス指定にしました。
編集を終了したらコマンドラインで以下のように実行します。
&lt;/p&gt;

&lt;pre class="code"&gt;
$ ./jsl -conf jsl.sample.conf
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
これでチェックの結果が表示されるはずです。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
きっちりした性格なのでエラーがまったく出ないようにしたいのですが、
全部見直すわけにもいきません。（あー気持ち悪い）
よくやってしまうミスは、クロージャをつかっているところでセミコロンを忘れたり、
変数をvarで再定義してしまうことです。（こんな感じ）
&lt;/p&gt;

&lt;pre class="code"&gt;
function Foo()
{
  var func = function()
  {
    alert('func is called.');
  };//ここにセミコロンが必要
  
  for (var i = 0 ; i &lt; list.length ; i++)
  {
    //処理１
  }

  for (var i = 0 ; i &lt; list.length ; i++) //変数iの再定義になる
  {
    //処理２
  }
}
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
forで使用するiにvarをつけるのは再帰呼び出しされる関数だけにしようと思いました....
数値を比較するときは===を使えとか細かく指摘が入りますが、これは実質無視。
次回以降これらの余計なエラーがでないように注意してJavaScriptを書こうと思います。
&lt;/p&gt;

&lt;fieldset class="quotation"&gt;
&lt;legend&gt;リンク&lt;/legend&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;a href="http://www.jslint.com/" target="_blank"&gt;
      jslint: The JavaScript Verifier
    &lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href="http://www.jslint.com/wsh/index.html" target="_blank"&gt;
      JSLint and WSH
    &lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href="http://www.javascriptlint.com/" target="_blank"&gt;
      JavaScript Lint
    &lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;/fieldset&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-115838820632439580?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/115838820632439580/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=115838820632439580' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115838820632439580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115838820632439580'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/09/javascript-lintjavascript.html' title='JavaScript Lintを使用して正しいJavaScriptソースを書く'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-115838578512865314</id><published>2006-09-16T14:48:00.000+09:00</published><updated>2006-09-16T14:49:45.493+09:00</updated><title type='text'>とりあえず書く - PostgreSQL 7.4でEUC_JPはどう扱われるのか？編</title><content type='html'>&lt;p class="paragraph"&gt;
「とりあえず書く」シリーズ第３弾、今回はPostgreSQLです。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
まず環境。
DBは以下のように作成しました。
&lt;/p&gt;

&lt;pre class="code"&gt;
$ createdb foodb -U foo --encoding=EUC_JP
$ psql -d foodb -U foo
foodb=&amp;gt; \set
VERSION = 'PostgreSQL 7.4.7 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.3.2 20031218 (Vine Linux 3.3.2-0vl8)'
AUTOCOMMIT = 'on'
VERBOSITY = 'default'
DBNAME = 'foodb'
USER = 'foo'
PORT = '5432'
ENCODING = 'EUC_JP'
PROMPT1 = '%/%R%# '
PROMPT2 = '%/%R%# '
PROMPT3 = '&gt;&gt; '
HISTSIZE = '500'
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
以下のようなテーブルを用意します。MySQLのときと同じです。
&lt;/p&gt;

&lt;pre class="code"&gt;
CREATE TABLE sample (
  str varchar(5) default NULL
);
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
テーブルが作成されたら以下のようにinsertを実行して、selectで文字列の長さを確認します。
&lt;/p&gt;

&lt;pre class="code"&gt;
foodb=&amp;gt; insert into sample(str) values('abcd');
INSERT 2158847 1
foodb=&amp;gt; insert into sample(str) values('abcdef');
ERROR:  value too long for type character varying(5)
foodb=&amp;gt; insert into sample(str) values('あいう');
INSERT 2158848 1
foodb=&amp;gt; insert into sample(str) values('あいうえおか');
ERROR:  value too long for type character varying(5)
foodb=&amp;gt; select str, length(str), octet_length(str) from sample;
  str   | length | octet_length 
--------+--------+--------------
 abcd   |      4 |            4
 あいう |      3 |            6
(2 行)
&lt;/pre&gt;

&lt;p class="paragraph"&gt;
ここから推測できるのは以下。
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;insert時はascii、２バイト文字にかかわらず１文字とカウントして挿入が行われる。&lt;/li&gt;
&lt;li&gt;varchar(5)を超えてデータを挿入することはできない。挿入自体が失敗する。&lt;/li&gt;
&lt;li&gt;length関数は２バイト文字も１文字とカウントして文字列の長さを返す。&lt;/li&gt;
&lt;li&gt;octet_length関数はバイト数を返す。&lt;/li&gt;
&lt;/ol&gt;

&lt;p class="paragraph"&gt;
PostgreSQLのバージョンは7.2と7.3と7.4で結構挙動が違うのでよく注意してしますが、
もしかすると同じクエリの実行結果が7.2と7.3では変わるかもしれません。
8.0でも試してみたいところですね。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-115838578512865314?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/115838578512865314/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=115838578512865314' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115838578512865314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115838578512865314'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/09/postgresql-74eucjp.html' title='とりあえず書く - PostgreSQL 7.4でEUC_JPはどう扱われるのか？編'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9176588.post-115813939963076656</id><published>2006-09-13T18:18:00.000+09:00</published><updated>2006-09-15T20:41:19.656+09:00</updated><title type='text'>CentOSにPHP5.1.6インストール</title><content type='html'>&lt;p class="paragraph"&gt;
activeCollabをインストールするのにPHP5が必要ということなので、CentOSに入れてみることにしました。
&lt;/p&gt;

&lt;p class="paragraph"&gt;
ちゃんとした手順書作るつもりがなかったので本当にメモ程度に。
既にインストールしてあるパッケージなどの環境に依存するため、
すべてのCentOSでこのような手順が必要になるとは限りません。
既にapache2とmysql4はインストールされているものとします。
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;一応yum listでphpと名のつくものを片っ端から削除&lt;/li&gt;
&lt;li&gt;PHP5を本家からダウンロード&lt;/li&gt;
&lt;li&gt;rootでphp-5.1.6.tar.gzを展開&lt;/li&gt;
&lt;li&gt;そのままconfigureを始めると各種エラーが発生&lt;ol&gt;
&lt;li&gt;まずlexがないとお叱りをうける。yumでflexをインストール&lt;/li&gt;
&lt;li&gt;次にapxsがないとお叱りをうける。探してみると/usr/sbinにない。yumでhttpd-develをインストール&lt;/li&gt;
&lt;li&gt;次にlibxml2関連でお叱りをうける。yumでlibxml2-develをインストール&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;
configure
&lt;pre class="code"&gt;./configure --prefix=/usr/local/php5 --with-apxs2=/usr/sbin/apxs --with-mysql&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;make&lt;/li&gt;
&lt;li&gt;make install&lt;/li&gt;
&lt;li&gt;
/etc/httpd/conf/httpd.confの末尾に以下を追加
&lt;pre class="code"&gt;AddHandler php5-script .php&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;apache再起動&lt;/li&gt;
&lt;/ol&gt;

&lt;p class="paragraph"&gt;
これでphpinfoを見たら正しくインストールされていたみたいです。
activeColllabのインストールにも成功しました。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9176588-115813939963076656?l=narucissus.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://narucissus.blogspot.com/feeds/115813939963076656/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9176588&amp;postID=115813939963076656' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115813939963076656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9176588/posts/default/115813939963076656'/><link rel='alternate' type='text/html' href='http://narucissus.blogspot.com/2006/09/centosphp516.html' title='CentOSにPHP5.1.6インストール'/><author><name>narucissus</name><uri>http://www.blogger.com/profile/07100151301146669862</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
