2008/12/11 (Thu)

ケータイで撮った写真を取り込むのが面倒。

メールで送ったり、ケーブル繋いだり、ActiveSyncも面倒。 SDだったらEye-Fiとかがいいんだろうけど、MicroSDなのでそれは無理。 というわけでLive Mesh。要はMS版Dropbox。

Dropboxとの違いは差分が取られない事、どのディレクトリをどのPCとシンクするかを細かく指定できること。 決まったディレクトリではなく全てのディレクトリが対象と出来ること、等々。サーバ上は5Gまでシンク可能。 あと、自分は許可してないけどWeb上から対象のPCをリモートコントロールできるみたい。

ストックコンテンツはLive Mesh、フローコンテンツはDropboxみたいにするといいかもしれない。

http://www.mesh.com/

MSNメッセンジャー等のIDでSign in。 Add Deviceしてソフトをダウンロード&インストール。 Mac版もある。

WindowsMobile版も出てきたので早速インストール。

http://blogs.msdn.com/livemesh/archive/2008/12/09/expanded-live-mesh-for-mobile-ctp.aspx

これでMicroSDのDCIMディレクトリをシンク対象に追加。

そうすると自動でPCの方にもディレクトリが出来るので、シンク対象にする。

これで、WindowsMobileの方でシンクすれば、どんどんネットワーク経由でPCに転送される。

これでバシバシ撮っていけるな。

例えば、FFでSSを撮って保存されるディレクトリをシンク対象にしたらとか テキストログとかを共通管理したらとか。夢が広がるね。

UIはDropboxと比べるとそうとう煩雑。わかりにくい。けれど、 Eye-Fi, Dropbox, Live Meshの流れは、コンピューティングを変えるという意味では、ここ数年で一番のソリューションだと思う。まさにユビキタス。

2008/12/04 (Thu)

アプリケーションのインストール

各種ソフトウエアのインストール

Emacs22のインストール

$ wget ftp://ftp.gnu.org/pub/gnu/emacs/emacs-22.2.tar.gz
$ ./configure --prefix=/usr/local \
              --build=i386-pc-linux-gnu \
              --mandir=/usr/local/share/man \
              --with-x

$ make
# make install

Anthyのインストール

http://sourceforge.jp/projects/anthy/

展開する。

$ ./configure
$ make
# make install

Apache

実行ユーザ/グループの作成

# /usr/sbin/groupadd -g 80 www
# /usr/sbin/useradd -d /dev/null -u 80 -g 80  -s /sbin/nologin www

ダウンロード

$ wget http://ftp.riken.jp/net/apache/httpd/httpd-2.2.10.tar.gz
$ tar xzvf httpd-2.2.10.tar.gz

# yum install openssl-devel

config とコンパイル

$ ./configure --prefix=/usr/local/apache2 \
              --build=i386-pc-linux \
              --localstatedir=/var \
              --enable-so \
              --enable-ssl \
              --enable-usertrack \
              --enable-rewrite \
              --enable-proxy \
              --enable-proxy_ajp \
              --enable-proxy_balancer

インストール前にスーパユーザで以下の作業を行なう。

# cd /usr/local/
# mkdir apache2.2.10
# ln -s ./apache2.2.10 ./apache2

pid ファイルは /var/run/httpd.pid に配置するようにhttpd.confを変更しました。

PHPのインストール

依存関係のあるもの

下記パッケージを予めインストールしておく。

# yum install libxml2-devel.i386
# yum install libmcrypt-devel.i386
# yum install libjpeg-devel.i386
# yum install gd-devel.i386
# yum install mysql-devel

ダウンロード

$ wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.12.tar.gz

config のオプション

$ ./configure --prefix=/usr/local \
              --build=i386-pc-linux \
              --mandir=/usr/local/share/man \
              --disable-nls \
              --with-libiconv-prefix=/usr/local \
              --enable-shared --enable-static --with-pic


$ make
# make install

/usr/local/lib をライブラリの検索対象に追加

# echo "/usr/local/lib" > /etc/ld.so.conf.d/local.conf
# /sbin/ldconfig -v

PHP本体のインストール

ダウンロード

$ wget http://jp.php.net/get/php-5.2.9.tar.gz/from/this/mirror
$ tar xzvf php-5.2.9.tar.gz

config のオプション

※ --with-gd より --with-jpeg を先に指定すること。そうしないと jpeg 未サポートになるとのこと。

$ ./configure --prefix=/usr/local \
              --sysconfdir=/etc \
              --with-mysql \
              --with-jpeg-dir=/usr \
              --enable-mbstring \
              --with-gd \
              --with-zlib-dir=/usr \
              --with-freetype-dir=/usr \
              --with-mcrypt \
              --with-apxs2=/usr/local/apache2/bin/apxs \
              --enable-zend-multibyte \
              --with-iconv=/usr/local \
              --enable-shared --enable-static --with-pic

$ make
$ make test
# make install

# cp php.ini-dist /usr/local/lib/php.ini

パッケージでインストールしたソフトウエア

$ /bin/rpm -qa
で一覧が表示されます。

Install of CentOS5

インストール時設定

  • linux text
  • Choose a Language --> English
  • Keyboard Type --> us
  • Installation Method --> HTTP
  • Configure TCP/IP --> Enable IPv4 support Dynamic IP configuration (DHCP)
  • HTTP Setup --> ftp.riken.jp / Linux/centos/5/os/i386
  • Welcome to CentOS
  • Warning --> Yes
  • Partitioning Type --> Remove all partitions on selected drives and create default layout.
  • Warning --> Yes
  • Review Partition Layout --> Yes
  • Partitioning --> OK
  • Low Memory --> Yes
  • Boot Loader Configuration --> Use GRUB Boot Loader
  • Boot Loader Configuration --> OK
  • Boot Loader Configuration --> OK
  • Boot Loader Configuration --> OK
  • Boot Loader Configuration --> OK
  • Configure Network Interface --> No
  • Hostname Configuration --> automatically via DHCP / manually
  • Time Zone Selection --> Asia/Tokyo
  • Root Password --> **
  • Package selection --> [*] Customize software selection
  • Package Group selection --> [*] Editors
  • Installation to begin --> OK
  • Complete --> Reboot (デバイス->CD/DVD-ROMのマウント解除後)
  • shutdown -h now
  • ネットワーク -> アダプタ1 -> ホストインターフェース

Setting of CentOS5

インストール後設定

以下のパッケージをインストール。

# yum install yum-fastestmirror

yum updateする。

# yum check-update
# yum update

さらに以下のパッケージをインストール。

# yum install which
# yum install yum-utils
# yum install ntp
# yum install man
# yum install gcc
# yum install make
# yum install cvs
# yum install lynx
# yum install wget
# yum install unzip
# yum install ftp

日付設定

# ntpdate ntp.nict.jp

cronで定期実行

# vi /etc/cron.daily/ntpdate.cron

以下のファイルを作る

#!/bin/sh
/usr/sbin/ntpdate ntp.nict.jp

実行権限の付与

# chmod 755 /etc/cron.daily/ntpdate.cron

一般ユーザを追加。

# useradd -m <username>
# passwd <username>
New UNIX password: ********
Retype new UNIX password: ********
passwd: all authentication tokens updated successfully

2008/12/02 (Tue)

OpenPNE インストールまでの設定

Emacs22のインストール

UTF-8用

$ wget ftp://ftp.gnu.org/pub/gnu/emacs/emacs-22.2.tar.gz
$ ./configure --prefix=/usr/local/emacs-22.2
$ make
$ su
# make install

OpenPNEアカウントの作成

# useradd -m -s /bin/bash openpne
# chmod 755 /home/openpne

PHPのインストール

依存関係のあるもの # yum install libxml2-devel.i386 # yum install libmcrypt-devel.i386 # yum install gd-devel

$ wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.12.tar.gz
$ ./configure
$ make
# make install
# ln -s /usr/local/lib/libiconv.so.2.4.0 /usr/lib/libiconv.so.2

/usr/local/lib をライブラリの検索対象に追加 $ cat /etc/ld.so.conf include ld.so.conf.d/*.conf /usr/local/lib # /sbin/ldconfig

PHP本体のインストール $ wget http://www.php.net/get/php-5.2.6.tar.gz/from/a/mirror $ tar xzvf php-5.2.6.tar.gz

$./configure \
    --with-mysql \
    --enable-mbstring \
    --with-jpeg-dir=/usr/local/lib \
    --with-gd \
    --with-jpeg-dir=/usr \
    --with-zlib-dir=/usr \
    --with-freetype-dir=/usr \
    --with-mcrypt \
    --with-apxs2=/usr/local/apache2/bin/apxs \
    --enable-zend-multibyte \
    --with-iconv=/usr/local

iconvはディレクトリを指定するとこでエラーが出なくなった。 画像(jpg)関連がOpenPNEでUploadできなかった。 GDのjpeg関連の設定がおかしかったぽいのでオプションを追加した。

$ make
$ make test
# make install

# cp php.ini-dist /usr/local/lib/php.ini

Apache

ハンドラの追加 # vi /usr/local/apache2/conf/httpd.conf AddHandler application/x-httpd-php .php

VirtualHostの設定

# vi /usr/local/apache2/conf/extra/httpd-vhosts.conf

<VirtualHost 10.1.0.22:80>
    ServerName        xxxx.localnet
    DocumentRoot      "/home/openpne/work/OpenPNE/public_html"
    DirectoryIndex    index.html index.php
    <Directory "/">
      Options Indexes FollowSymLinks
      AllowOverride None
      Order deny,allow
      Allow from all
    </Directory>
</VirtualHost>

Apache2.2のデフォルトはDeny allなので権限ついて変更する

OpenPNE

$ wget http://downloads.sourceforge.net/openpne/OpenPNE-2.12.0.tar.gz
$ work/OpenPNE-2.12.0
$ ln -s OpenPNE-2.12.0 OpenPNE
$ cp config.php.sample config.php
$ chmod -R 0777 var

[openpne@ OpenPNE]$ diff config.php.sample config.php
7c7
< define('OPENPNE_URL', 'http://sns.example.com/');
---
> define('OPENPNE_URL', 'http://xxxx.localnet/');
13c13
<     'username' => '',
---
>     'username' => 'openpne',
16c16
<     'database' => '',
---
>     'database' => 'openpne',
22c22
< define('ENCRYPT_KEY', '');
---
> define('ENCRYPT_KEY', 'xxxxxxxx');
26c26
< define('MAIL_SERVER_DOMAIN', 'mail.example.com');
---
> define('MAIL_SERVER_DOMAIN', 'mail.localnet');

MySQLにテーブル作成

$ mysql -u root -p
mysql> GRANT ALL PRIVILEGES ON *.* TO 'openpne'@'localhost';

$ mysql -u openpne
mysql> create database `openpne` default character set utf8;

$ mysql -u openpne --default-character-set=utf8 openpne < setup/sql/mysql41/install/install-2.12-create_tables.sql 

$ mysql -u openpne --default-character-set=utf8 openpne < setup/sql/mysql41/install/install-2.12-insert_data.sql


mysql> GRANT ALL PRIVILEGES ON *.* TO openpne@"%"
    -> IDENTIFIED BY 'パスワード' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO openpne@localhost
    -> IDENTIFIED BY 'パスワード' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

2008/11/25 (Tue)

Install of CentOS5

インストール時設定

  • text install
  • Server

インストール後設定

  • SELinux と Firewall は無効化する。

以下のサービスは停止。

  • apmd
  • auditd
  • autofs
  • bluetooth
  • cups
  • firstboot
  • gpm
  • haldaemon
  • hidd
  • ip6tables
  • kudzu
  • mcstrans
  • netfs
  • nfslock
  • pcscd
  • portmap
  • restorecond
  • rpcgssd
  • rpcidmapd
  • xfs
  • yum-updatesd

以下のパッケージをインストール。

# yum install yum-fastestmirror

yum updateする。

# yum check-update
# yum update

さらに以下のパッケージをインストール。

# yum install yum-utils
# yum install ntp

日付設定

# ntpdate ntp.nict.jp

cronで定期実行

# vi /etc/cron.daily/ntpdate.cron

以下のファイルを作る

#!/bin/sh
/usr/sbin/ntpdate ntp.nict.jp

実行権限の付与

# chmod 755 /etc/cron.daily/ntpdate.cron

一般ユーザを追加。

# useradd -m -p xxxxxxxx <username>

Software Install

# yum install gcc
# yum install cvs
# yum install lynx

NcFTPはCentOS5は入っていないので、ソースから。(lftpは入ってる)

# wget ftp://ftp.ncftp.com/ncftp/ncftp-3.2.2-src.tar.gz

CentOSのデフォルトのyum repositoryは少ないので dag 追加

# vi /etc/yum.repos.d/dag.repo

以下のファイルを作成

[dag]
name=Dag RPM Repository for RHEL5/CentOS5
baseurl=http://ftp.riken.jp/Linux/dag/redhat/el5/en/$basearch/dag/
enabled=0
gpgcheck=1

鍵の登録

# rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt

確認

# yum --enablerepo=dag list | grep git

2008/11/19 (Wed)

PGPについて

関連RFC

2008/11/11 (Tue)

Macbook Setup

Installed Software

  • LimeChat
  • Firefox
  • QuickSilver
  • bathyscaphe
  • CarbonEmacs
  • KeyRemap4MacBook
  • VLC
  • Skype
  • Eclipse
  • Senebier
  • Dropbox
  • SIMBL
  • InputSwitcher
  • StartupSound.prefPane
  • InsomniaX
  • Books
  • MacPorts
  • VirutalBox

Setting config

  • Swapping Caps Lock and Control
  • sudo -H cpan
  • install Bundle::CPAN

2008/11/06 (Thu)

Emacsのインストール

Emacs22のインストール

aptから

aptダウンロード先の編集

# vi /etc/apt/source.list
deb http://hype.sourceforge.jp/ ./
deb-src http://hype.sourceforge.jp/ ./

鍵の追加

# wget http://hype.sourceforge.jp/A7F20B7E.gpg
# sudo apt-key add A7F20B7E.gpg

インストール

# aptitude install emacs22 emacs22-el

ソースから

$ wget ftp://ftp.gnu.org/pub/gnu/emacs/emacs-22.3.tar.gz
$ tar xzvf emacs-22.3.tar.gz
$ cd emacs-22.3
$ ./configure --prefix=/usr/local/emacs-22.3
$ make
$ su
# make install
# ln -s /usr/local/emacs-22.3/bin/emacs /usr/local/bin/emacs

2008/08/21 (Thu)

SIPChange

実行するとSIPをtouchkeysipに変更するものを作ってみた。

Windowsプログラミングは初めてに等しいので、こんな簡単なのでも少々手間取った。

gesture10keyは便利なんだけど、SIPはデフォルトが変更できなかったので、ショートカットをスタートアップに入れとくとよいかも。

http://www5.big.or.jp/~tex/mobile/sipchange.zip

gesture10key:http://www.geocities.co.jp/lauhangwoo/zero3/gesture10key.html

2008/07/30 (Wed)

MixiAPIのテスト

atom/MixiTest.java

package atom;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimeZone;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;

/**
 * @author tex
 * 
 */
public class MixiTest {

    private HttpClient client;

    public MixiTest() {
        this.client = new HttpClient();
    }

    public void post(String url, String username, String password)
            throws HttpException, IOException {
        PostMethod method = new PostMethod(url);
        method.addRequestHeader("X-WSSE",
                getWsseHeaderValue(username, password));
        String body = ""
                        + "<?xml version='1.0' encoding='utf-8'?>"
                        + "<entry xmlns='http://purl.org/atom/ns#'>"
                        + "  <title>Test</title>"
                        + "  <summary>Post diary from Mixi API</summary>"
                        + "</entry>";

        StringRequestEntity re =
                new StringRequestEntity(body, "application/atom+xml", "UTF-8");
        method.setRequestEntity(re);
        this.client.executeMethod(method);
        System.out.println(method.getStatusLine().toString());
        Header[] headers = method.getResponseHeaders();
        int len = headers.length;
        for (int i = 0; i < len; i++) {
            System.out.print(headers[i].toString());
        }
        System.out.println(method.getResponseBodyAsString());
    }

    protected final String getWsseHeaderValue(String username, String password) {
        try {
            byte[] nonceB = new byte[8];
            SecureRandom.getInstance("SHA1PRNG").nextBytes(nonceB);

            SimpleDateFormat zulu =
                    new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
            zulu.setTimeZone(TimeZone.getTimeZone("GMT"));
            Calendar now = Calendar.getInstance();
            now.setTimeInMillis(System.currentTimeMillis());
            String created = zulu.format(now.getTime());
            byte[] createdB = created.getBytes("utf-8");
            byte[] passwordB = password.getBytes("utf-8");

            byte[] v = new byte[nonceB.length
                    + createdB.length + passwordB.length];
            System.arraycopy(nonceB, 0, v, 0, nonceB.length);
            System.arraycopy(createdB, 0, v, nonceB.length, createdB.length);
            System.arraycopy(passwordB, 0, v, nonceB.length
                    + createdB.length, passwordB.length);

            MessageDigest md = MessageDigest.getInstance("SHA1");
            md.update(v);
            byte[] digest = md.digest();

            StringBuffer buf = new StringBuffer();
            buf.append("UsernameToken Username=\"");
            buf.append(username);
            buf.append("\", PasswordDigest=\"");
            buf.append(new String(Base64.encodeBase64(digest)));
            buf.append("\", Nonce=\"");
            buf.append(new String(Base64.encodeBase64(nonceB)));
            buf.append("\", Created=\"");
            buf.append(created);
            buf.append('"');
            return buf.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) throws Exception {
        MixiTest test = new MixiTest();
        test.post("http://mixi.jp/atom/diary/member_id=xxxx", "xxx@xxxxxxx",
                "xxxxxxxxxxxx");
    }
}

2008/07/08 (Tue)

CABviaActiveSync

PC上に保存されたCABファイルを右クリックからインストールするためのソフト。 1.2ぐらいの時はXPまでだったが、既に1.5にまであがっていて、Vistaにも対応していた。

これを使用するとWindowsMobile端末へのソフトのインストールが格段に楽になる。

.NET Framework 3.0とActiveSyncもしくはWMDC (Windows Mobile Device Center)が必要。

CABviaActiveSync

Download --> modaco

2008/07/07 (Mon)

OpenPNE

OpenPNE構成ディレクトリ

.
|-- config.php              設定ファイル
|-- bin/                    Cron、メール処理等コンソールで行うスクリプト
|-- lib/                    OpenPNE外ライブラリの格納場所
|   |-- include/            PEAR等ライブラリの格納場所
|   `-- smarty_plugins/     Smarty用プラグインの格納場所
|-- public_html             Apacheで公開されるドキュメントルート
|   |-- cmd/                小窓用JS格納ディレクトリ
|   |-- flash/              Flash格納用ディレクトリ。フレンドリスト用SWFのみ
|   |-- img/                公開画像ディレクトリ
|   |-- js/                 公開JavaScriptディレクトリ
|   |-- modules/            モジュール別公開ファイル
|   |-- openid/             OpenID用コントローラ
|   |-- skin/               スキン格納ファイル
|   |-- cap.php             キャプチャ作成PHP
|   |-- config.inc.php      初期設定用PHP
|   |-- img.php             画像用フィルタ
|   |-- img_skin.php        スキン用フィルタ
|   |-- index.php           フロントコントローラ
|   `-- xhtml_style.php     カスタムCSS用PHP
|-- setup                   セットアップ用
|   |-- script
|   `-- sql                 セットアップ用SQLファイル
|       |-- mysql40         MySQL4.0用SQL
|       |-- mysql41         MySQL4.1用SQL(大幅に変更があったため)
|       |   |-- install     インストール用SQL、テーブル、初期データ
|       |   |-- option      オプション等(Biz等)SQL
|       |   |-- update      マイナーバージョンアップ用
|       |   `-- upgrade     メジャーバージョンアップ用
|       `-- postgres74      PostgreSQL用
|-- var                     一時ファイル置き場(適時削除してもよい)
|   |-- function_cache      関数キャッシュ用(ランキング等逐次実行の必要のないもの)
|   |-- img_cache           画像キャッシュ用
|   |-- log                 ログ用
|   |-- rss_cache           RSSキャッシュ用(cronから生成)
|   |-- templates_c         Smartyテンプレートコンパイル済みPHP用
|   `-- tmp                 一時ファイル用(ファイルアップロード用)
|-- webapp                  OpenPNEアプリケーション
|   |-- lib/                アプリケーション用ライブラリ(OpenPNE用カスタム等)
|   |-- modules/            モジュールディレクトリ
|   |   |-- admin/          管理画面モジュール
|   |   |   |-- init.inc    初期設定ファイル
|   |   |   |-- do/         処理実行系PHP格納ディレクトリ
|   |   |   |-- lib/        管理画面モジュール用ライブラリ格納ディレクトリ
|   |   |   |-- page/       ページ系PHP格納ディレクトリ
|   |   |   |-- templates/  Smartyテンプレート格納ディレクトリ
|   |   |   `-- validate/   妥当性検証用INIファイルの格納ディレクトリ
|   |   |-- api             API用
|   |   |-- ktai            携帯用
|   |   |-- openid          OpenID用
|   |   |-- pc              PC用
|   |   |-- portal          SNSポータル用
|   |   `-- setup           セットアップ用
|   |-- templates           テンプレート
|   |-- validate            妥当性検証
|   |-- init.inc            初期設定用
|   `-- version.php         バージョン情報
|-- webapp_biz              BIZ機能(予定表、グループウェア、施設管理、ToDo)
`-- webapp_ext              拡張モジュールの格納ディレクトリ

OpenPNEの基本構成

  • public_html/index.php を使用したフロントコントローラパターン
  • テンプレート名とアクション名の規約 /{module}/{type}/{action}.php

    • module モジュール名 例: admin, pc, ktai, api, openid, portal, setup 等 パラメータ: m
    • type アクションタイプ名 例: page, do パラメータ a prefix
    • action アクション名 例: csv_member, delete_c_admin_user 等 パラメータ a suffix
  • webapp_ext による拡張モジュール対応 webapp_ext に置いたファイルは同名のwebappのファイルの代替ファイルとなり 優先的に実行される。

  • Smartyによるテンプレートエンジンの使用 テンプレートファイルにSmartyを仕様。JavaScriptの括弧と競合するため デリミタを変更している {} -> ({})

  • ライブラリの内包 PEARやSmartyのライブラリを内包し環境依存をなくしているため、 OpenPNE外に依存するライブラリがほぼ存在しない。

  • 小窓機能による他サイトAPIとのMashup 小窓機能と呼ばれるURL自動変換スクリプトにより 外部サイトのプレイヤー等をOpenPNE内にマッシュアップ可能となる

アクション

  • OpenPNE_Actionを継承し、execute関数をオーバーライドする。
  • 認証外のアクションを作りたい場合はisSecureがfalseを返すようにする。デフォルトtrue
  • page系 ページ遷移系のアクションの処理を定義する。画面遷移先はファイル名等同名の Smartyテンプレートによって処理される。 Smartyテンプレートで処理するパラメータはexecute($request)関数で作り、 処理に問題がなければ関数は"success"を返すようにする。

  • do系 処理実行系のアクションを定義する。画面遷移先が決まっていないので、 execute関数の最後で、openpne_forwardで遷移先を指定し、 ブラウザにLocationヘッダを返し、クライアントリダイレクトを指示する。

参考URL

2008/06/24 (Tue)

WILLCOME 03 に向けて

Today

メール・電話

ネットワーク

日本語

画像カメラ

システム

通信設定

ファイル

ドキュメント

2008/06/09 (Mon)

PostgreSQLの初期設定

$PGDATA/postgresql.conf を書き換える。

オートバキュームの設定

# AUTO VACUUM SETTING
autovacuum = on
stats_row_level = on

ログファイルの設定

# LOG FILE SETTING
redirect_stderr = on
log_line_prefix = '<%t %u %d %p>'
log_min_duration_statement = 3s

2008/03/14 (Fri)

VMWare でテスト環境構築

ダウンロード

http://register.vmware.com/content/download.html からダウンロードします。

インストール

カスタムインストールして vmware server のみチェック。

イメージのダウンロード

http://www.thoughtpolice.co.uk/vmware/ からDebian Etch minimal をダウンロード

torrent downloads の設定してない場合は、Opera で落とす。 イメージのzip を展開し、ディレクトリごと、C:\Virtual Machines\ にコピーする。

VMWareの起動

レジストレーションコードを取得して、入力する必要あり。 http://register.vmware.com/content/registration.html

Linuxの設定

root, notroot アカウントがあり、パスワードは thoughtpolice

  • passwd root #パスワードの変更
  • useradd -D -s /bin/bash #デフォルトのシェルをbashに
  • dpkg-reconfigure console-data # キーボード設定。
  • dpkg-reconfigure locales #ロケールのインストール ja_JP.EUC-JP, ja_JP.UTF-8 を追加、デフォルトをja_JP.EUC-JP
  • aptitude update # aptitude リスト更新
  • aptitude upgrade # システムの安全なアップグレード
  • aptitude install openssh-server # OpenSSH のインストール
  • /etc/init.d/ssh start # OpenSSHd の起動
  • useradd -m -p xxxxxxxx <username> # <username> をパスワードxxxxxxxx で追加。

これでSSHクライアントからゲストサーバにログインできる。

  • aptitude install gcc
  • aptitude install make
  • aptitude install libreadline5-dev
  • aptitude install zlib1g-dev
  • aptitude install emacs
  • aptitude install patch
  • aptitude install cvs
  • aptitude install unzip
  • aptitude install lynx
  • aptitude install ncftp
  • aptitude install ftp

CPANの設定

適当にEnterですすめる。ftp.perl.orgに繋がらなかったらCtrl-Cで止めると 他のサイトを聞かれるのでkddilabsとかミラーを入力する。

Please enter your CPAN site: [] ftp://ftp.kddilabs.jp/CPAN/

$ perl -MCPAN -e shell

> install Bundle::CPAN

2008/02/16 (Sat)

簡単なHashの作り方。

RubyのHashを作るのは早くて簡単。

name = {"title", "mr", "first", "craig", "last", "davidson"}

Javaでは通常以下のようになる。

public void testBuildAHashNormally(){

     Map slow = new HashMap();
     slow.put("title", "mr");
     slow.put("first", "craig");
     slow.put("last", "davidson");

     assertEquals("mr", slow.get("title"));
     assertEquals("craig", slow.get("first"));
     assertEquals("davidson", slow.get("last"));
}

それを以下のようにしてみたい。

public void testBuildAHashQuickly(){

     Map quick = new Hash("title", "mr",
                "first", "craig", "last", "davidson");

     assertEquals("mr", slow.get("title"));
     assertEquals("craig", slow.get("first"));
     assertEquals("davidson", slow.get("last"));
}

それは以下のようにHashを拡張すればいい。

public class Hash extends HashMap {
   public Hash(Object ... keyValuePairs) {
     for (int i=0; i<keyValuePairs.length; i++)
       put(keyValuePairs[i], keyValuePairs[++i]);
   }
}

2008/02/13 (Wed)

Case Insensitive

PostgreSQLでの検索を大文字小文字区別なしで行いたいとの事なので、 対応する演算子を捜したところ、以下の文章が見つかったのでテスト。

http://www.postgresql.jp/document/current/html/functions-matching.html

SELECT * FROM entry WHERE title ILIKE '%TEST%';
SELECT * FROM entry WHERE title ~~* '%TEST%';

LIKE と ~~ は等価、ILIKE と ~~* が等価のようだ。

~を一つにするとPOSIX正規表現を使ったマッチングになるようだ。 今回は部分一致の検索のみでいいので、TESTの値はプログラム側で キーワード(_や%)をエスケープ処理してSQLInjectionを防ぎ、 ILIKEを使い前後へのマッチングのみに対応した。

2008/01/30 (Wed)

setlockを用いてバッチ処理の排他制御を行う。

daemontools

ダウンロード

/package ディレクトリが必要なので作成しStickyビットを立てる

# mkdir -p /package
# chmod 1755 /package

http://cr.yp.to/daemontools/install.html から daemontools-0.76.tar.gz をダウンロード

# cd /package
# wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz

展開する

# tar xzvfp ./daemontools-0.76.tar.gz
# cd admin/daemontools-0.76

パッチを当てる

http://qmail.org/moni.csi.hu/pub/glibc-2.3.1/ からパッチ(daemontools-0.76.errno.patch)をダウンロード

# cd admin/daemontools-0.76
# wget http://qmail.org/moni.csi.hu/pub/glibc-2.3.1/daemontools-0.76.errno.patch

パッチを当てる。

# patch -p1 < ./daemontools-0.76.errno.patch

インストールする

# ./package/install

setlock の実行

setlock を用いて、排他制御を行う。http://cr.yp.to/daemontools/setlock.html

$ /usr/local/bin/setlock -nx /tmp/hoge.lock hogecommand

2008/01/29 (Tue)

Java Pretty Date

John Resig の記事のJavaScriptを移植した、ISO8601:2004の日付をParseするけれども、 commons-langを使うのが素直。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

//import org.apache.commons.lang.time.DateFormatUtils

public class PrettyDate {
    public static String prettyDate(String dateString) throws ParseException {
        if (dateString == null)
            return null;

        // Date date = DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(date);
        Date date = parse(dateString);
        return prettyDate(date);

    }

    public static String prettyDate(Date date) throws ParseException {
        if (date == null) return null;
        Calendar cal = Calendar.getInstance();
        long diff = (cal.getTime().getTime() - date.getTime()) / 1000;
        double dayDiff = Math.floor(diff / 86400);

        if (dayDiff < 0 || dayDiff >= 31)
            return null;

        if (dayDiff == 0) {
            if (diff < 60   ) return "just now";
            if (diff < 120  ) return "1 minute ago";
            if (diff < 3600 ) return (int) Math.floor(diff / 60) + " minutes ago";
            if (diff < 7200 ) return "1 hour ago";
            if (diff < 86400) return (int) Math.floor(diff / 3600) + " hours ago";
        } else if (dayDiff == 1) {
            return "Yesterday";
        } else if (dayDiff < 7) {
            return (int) dayDiff + " days ago";
        } else if (dayDiff < 31) {
            return (int) Math.ceil(dayDiff / 7) + " weeks ago";
        }
        return null;

    }

    private static final SimpleDateFormat DATE_FORMAT_MILLIS_ISO8601 
            = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
    private static final String        REGEX_DATE_FORMAT_MILLIS_ISO8601 
    = "\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}[-+]\\d{2}:\\d{2}";

    public static Date parse(String dateString) throws ParseException {
        Date date = null;
        if (dateString.matches(REGEX_DATE_FORMAT_MILLIS_ISO8601)) {
            int index = dateString.lastIndexOf(":");
            StringBuffer sb = new StringBuffer(dateString).deleteCharAt(index);
            date = DATE_FORMAT_MILLIS_ISO8601.parse(sb.toString());
        }
        return date;
    }

    public static void main(String[] args) {
        String[] dateStrings = { "2008-01-29T20:38:17.123+09:00",
                "2008-01-29T20:28:17.123+09:00",
                "2008-01-29T10:28:17.123+09:00",
                "2008-01-28T10:28:17.123+09:00",
                "2008-01-25T10:28:17.123+09:00",
                "2008-01-20T10:28:17.123+09:00", };
        try {
            for (String dateString : dateStrings) {
                System.out.println(PrettyDate.prettyDate(dateString));
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

以下実行結果

prettyDate("2008-01-29T20:38:17.123+09:00")// =>21 minutes ago
prettyDate("2008-01-29T20:28:17.123+09:00")// =>31 minutes ago
prettyDate("2008-01-29T10:28:17.123+09:00")// =>10 hours ago
prettyDate("2008-01-28T10:28:17.123+09:00")// =>Yesterday
prettyDate("2008-01-25T10:28:17.123+09:00")// =>4 days ago
prettyDate("2008-01-20T10:28:17.123+09:00")// =>2 weeks ago

Mark Up 2 Down

構造化テキスト記法

仕事で、インストールマニュアルを作ることが多々あるのだが、 バージョン管理に入れるものはなるべくテキストフォーマットでありたい。 しかし、Wiki記法などでは他人(プログラマ外の人間)にわかりづらいので 出来るだけシンプルなものがいい。そしてなるべく簡単に他のフォーマットへ 変換できるものが欲しい。
Markdown というのがいいらしいので、その記法を採用することにした。

コンバータの導入

早速、インストールマニュアル等を書き直して、HTML に変換することに。 まずは、Windows用に簡単に変換できるコンバータを探したところ、 Pandoc なるものを発見。早速導入する。LinuxなりMacOSなりはもっと簡単に導入できそう。 文字コードが UTF-8 しか通らないようなので KaoriYa.net で配布している Windows 版の iconv を使用させてもらうことに。

上記の二つを展開し、pandoc.exe, iconv.exe, iconv.dll をPATHの通ったディレクトリに。
(自分の場合は、c:\opt\bin に配置)

バッチファイルの作成

1つのファイルに全てを書いてしまうと、後々管理が面倒なので 表示順に番号を振り、バッチ処理で一気に変換することに。 かなり適当ですが、以下を mark2html.bat として c:\opt\bin に配置。

@ECHO OFF
IF (%1)==() GOTO NoParams
IF (%2)==() GOTO ConvertAll
:ConvertOne

iconv -t UTF-8 %2 | pandoc.exe -s -S --toc -A footer.html -c pandoc.css -o %1

GOTO Bottom

:ConvertAll
CD . > tmptmp
FOR %%B IN (*.txt) DO copy /A tmptmp + %%B tmptmp

iconv -t UTF-8 tmptmp | pandoc.exe -s -S --toc -A footer.html -c pandoc.css -o %1

DEL tmptmp

GOTO Bottom
:NoParams
ECHO 使用方法  mark2html [作成するファイル名] [入力するファイル名]
ECHO.
ECHO  例 - mark2html output.html
ECHO    カレントディレクトリにある全ての .txt ファイルを
ECHO    指定されたファイルに変換します。
ECHO  例 - mark2html output.html input.txt
ECHO    input.txt を 指定されたファイルに変換します。
ECHO.
:Bottom

Blosxomを導入

一通り回ってやっぱりBlosxomに返って来た。テキストで管理したいというのがやはり最大の理由。というわけで再度設定することに。

  1. hail2u.net - Archives - blosxom starter kit から blosxom starter kit 1.1.3 をダウンロードし、展開。config.cgiを変更する。
  2. blosxom :: the zen of blogging :: plugins/general/flavourdir.txt から flavourdirプラグインをダウンロード pluginsディレクトリに入れる。
  3. entries以下にflavoursというディレクトリを作り、フレーバーファイルを全てその中に移す。
  4. blosxom.cgiの名前をblogに変更する。
  5. .htaccess に以下の記述をする。

    <Files blog>
        SetHandler cgi-script
    </Files>
    
  6. Markdown からmarkdown.plダウンロードする。最新版はおそらく以下
    http://daringfireball.net/projects/downloads/Markdown_1.0.2b4.tar.gz

  7. markdown.pl を markdown に変更し、plugins フォルダに入れる。
  8. 投稿テキストはUTF-8、一行目がタイトル、あとはMarkdown記法で記述してアップロード
  9. 以上で http://www5.big.or.jp/~tex/blog にアクセスできるようになる。

追記

SPAM防止のために、story.rssから

(mailto:$rss10::email)

<trackback:ping rdf:resource="$url$path/$fn.trackback"/>

を削除した。

また、story.html, story.htm から Auto Trackback Discovery 用の記述も削除

<!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <rdf:Description
    rdf:about="$url$path/$fn.htm"
    dc:identifier="$url$path/$fn.htm"
    dc:title="$title"
    trackback:ping="$url$path/$fn.trackback"/>
</rdf:RDF>
-->