2013年2月8日金曜日

[Other]itermとか



# 通知すること
通知って大事だよね。
誰かがTwitterでメンションくれた、DMくれた、Facebookでメッセージ届いたとか。
開発者としてはサーバでこけたときも通知してほしい。
そんな通知の話。

## レシピ
用意するアプリとか。通知センターあるよね。

- Growl
- Boxcar
- iterm 2

## iterm 2 で任意文字列検索して Growl 通知、Boxcar 転送
ビルド終わったよ、tail -f しててエラーでたよ、とかを通知するやり方。これ、残念なところはリモートサーバのログをSSH接続した上で make してたり tail してるところ。make はまあいいけど、tail はちょっとね…。完全に切り離す方法あるのかな?教えてほしいです。

[参考URL](http://ascii.jp/elem/000/000/562/562062/)

1. iterm 2 の 設定

    Preferences -> Profiles -> Advanced -> Triggers -> Edit で検索文字列設定して Action を Send Growl Alert

1. Growl プラグインBoxcar.growlView導入

    [こちら](http://boxcar.io/growl)からダウンロードして実行、インストール

1. iOS 側の設定(iPad mini)

    - Boxcar アプリインストール
    - サインイン(アカウント作ってなかったらサインアップ)
    - Growl のサービスを追加

1. Growl の設定

    - 環境設定 -> 表示 -> Action で Boxcar のアカウントを入力、プレビューで連携確認
    - アプリケーション -> iTerm -> アプリケーションの表示スタイル -> Actions -> Boxcar 選択






2012年12月11日火曜日

[nodejs]nodejs インストール

概要
nodejs をソースからインストールする。
インストール

[other]nginx インストールと設定

概要
nginx をリバースプロキシとして使ってみる。
インストール
パッケージからとソースからビルドの2通りある。
  • パッケージからインストール
    注意は任意のモジュールをインストールできない。必要なモジュールがあるならソースから。 基本的にhttp://wiki.nginx.org/InstallJa 参照で。 設定での注意としては、/etc/nginx/nginx.conf が設定ファイルだけど中で include /etc/nginx/conf.d/*.conf; みたいに 設定ファイルが読み込まれてる。/etc/nginx/nginx.conf を必死に設定しても設定かわらないときはこのあたりを疑ってみても。 設定、後勝ち??
  • ソースからインストール
    1. tar -zxvf nginx-1.2.2.tar.gz
    2. cd nginx-1.2.2
    3. yum -y install openssl-devel pcre-devel libxml2-devel libxslt-devel patch
      環境によるけど
    4. git clone https://github.com/yaoweibin/nginx_tcp_proxy_module.git
      websocket をリバースプロキシする nginx_tcp_proxy_module をモジュール追加するので http://d.hatena.ne.jp/shim0mura/20120118/1326916953
    5. patch -p1< nginx_tcp_proxy_module/tcp.patch
    6. ./configure
      ./configure --prefix='/usr/local/nginx' \
      --with-http_ssl_module \
      --with-http_stub_status_module \
      --with-http_xslt_module \
      --with-http_realip_module \
      --with-http_gzip_static_module \
      --add-module=nginx_tcp_proxy_module/
    7. make
    8. sudo make install
    9. vi /etc/init.d/nginx
      #!/bin/sh
      #
      # nginx - this script starts and stops the nginx daemon
      #
      # chkconfig:   - 85 15
      # description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
      #               proxy and IMAP/POP3 proxy server
      # processname: nginx
      # config:      /etc/nginx/nginx.conf
      # config:      /etc/sysconfig/nginx
      # pidfile:     /var/run/nginx.pid
      
      # Source function library.
      . /etc/rc.d/init.d/functions
      
      # Source networking configuration.
      . /etc/sysconfig/network
      
      # Check that networking is up.
      [ "$NETWORKING" = "no" ] && exit 0
      
      #nginx="/usr/sbin/nginx"
      nginx="/usr/local/nginx/sbin/nginx"
      prog=$(basename $nginx)
      
      #NGINX_CONF_FILE="/etc/nginx/nginx.conf"
      NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
      
      [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
      
      lockfile=/var/lock/subsys/nginx
      
      make_dirs() {
         # make required directories
         user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
         options=`$nginx -V 2>&1 | grep 'configure arguments:'`
         for opt in $options; do
             if [ `echo $opt | grep '.*-temp-path'` ]; then
                 value=`echo $opt | cut -d "=" -f 2`
                 if [ ! -d "$value" ]; then
                     # echo "creating" $value
                     mkdir -p $value && chown -R $user $value
                 fi
             fi
         done
      }
      
      start() {
          [ -x $nginx ] || exit 5
          [ -f $NGINX_CONF_FILE ] || exit 6
          make_dirs
          echo -n $"Starting $prog: "
          daemon $nginx -c $NGINX_CONF_FILE
          retval=$?
          echo
          [ $retval -eq 0 ] && touch $lockfile
          return $retval
      }
      
      stop() {
          echo -n $"Stopping $prog: "
          killproc $prog -QUIT
          retval=$?
          echo
          [ $retval -eq 0 ] && rm -f $lockfile
          return $retval
      }
      
      restart() {
          configtest || return $?
          stop
          sleep 1
          start
      }
      
      reload() {
          configtest || return $?
          echo -n $"Reloading $prog: "
          killproc $nginx -HUP
          RETVAL=$?
          echo
      }
      
      force_reload() {
          restart
      }
      
      configtest() {
        $nginx -t -c $NGINX_CONF_FILE
      }
      
      rh_status() {
          status $prog
      }
      
      rh_status_q() {
          rh_status >/dev/null 2>&1
      }
      
      case "$1" in
          start)
              rh_status_q && exit 0
              $1
              ;;
          stop)
              rh_status_q || exit 0
              $1
              ;;
          restart|configtest)
              $1
              ;;
          reload)
              rh_status_q || exit 7
              $1
              ;;
          force-reload)
              force_reload
              ;;
          status)
              rh_status
              ;;
          condrestart|try-restart)
              rh_status_q || exit 0
                  ;;
          *)
              echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
              exit 2
      esac
      
    • 設定ファイルは /usr/local/nginx/conf/nginx.conf にある
HTTP リバースプロキシ
HTTP リバースプロキシとして使うための設定。/ のアクセスを upstream backend のいずれかに転送する。 proxy_pass の http://backend は upstream の backend と対応しいている。
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    upstream backend {
      server xxxx.xxxx.xxxx.xxx:port;
      server xxxx.xxxx.xxxx.xxx:port;
      server xxxx.xxxx.xxxx.xxx:port;
    }

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            #root   /usr/share/nginx/html;
            #index  index.html index.htm;
            proxy_pass http://backend;
            proxy_set_header  X-Real-IP  $remote_addr;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443;
    #    server_name  localhost;

    #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_timeout  5m;

    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers   on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}
WebSocket リバースプロキシ
WebSocket 通信(というかTCP/IP??)をリバースプロキシする。 socket.io なアプリレベルで気をつけとくのは、例えば以下の設定でHTTP通信で 60001 に割り振られた時、 javascript で io.connect(‘http://host:port/‘) するときに、ポートは 60001 にしておくこと。 リバースプロキシだからといって ポート 80 で再度割り振らせると正常に動作しなくなる。
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}

tcp {
  upstream websockets {
    server 127.0.0.1:60001;
    server 127.0.0.1:60002;
    server 127.0.0.1:60003;

    check interval=3000 rise=2 fall=5 timeout=1000;
  }


  server {
    listen  0.0.0.0:80;
    server_name _;

    tcp_nodelay on;
    proxy_pass websockets;


  }
}



http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       8888;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #location / {
        #    root   html;
        #    index  index.html index.htm;
        #}

        location /websocket_status {
            check_status;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        #error_page   500 502 503 504  /50x.html;
        #location = /50x.html {
        #    root   html;
        #}

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443;
    #    server_name  localhost;

    #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_timeout  5m;

    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers   on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

2012年11月29日木曜日

[other]phantomjs インストール

インストール
  • PhantomJS 入れる
    1. sudo yum install gcc gcc-c++ make git openssl-devel freetype-devel fontconfig-devel
    2. git clone git://github.com/ariya/phantomjs.git
    3. cd phantomjs
    4. git checkout 1.7
    5. ./build.sh –jobs 1
      build.sh たたくと次のエラーになった
      gstreamer-app-0.10 not found
      make[1]: *** [WebCore/Makefile.WebKit] Error 2
      make[1]: Leaving directory `/home/dev/work/tmp/phantomjs-rpms/BUILD/phantomjs-1.5.0/src/qt/src/3rdparty/webkit/Source
      yum -y install gstreamer* で gstreamer のパッケージ全部つっこんどくhttp://tmcosmos.org/linux/centos/co5.html
      もう一度 build.sh たたく
      ビルドが成功した
    6. /path/to/phantomjs/bin/phantomjs が本体なのでこれを PATH の通ったところにおいとく
    7. sudo mv phantomjs/ /usr/local/src/
    8. ln -s /usr/local/src/phantomjs/bin/phantomjs /usr/local/bin/phantomjs
    ※ sudo yum groupinstall ‘Development tools’ ‘Additional Development’ あれやこれやとこれもたたきました
  • 参考URL
文字化け問題
CentOS6.2 の環境で文字化けエラー

[linux]munin のインストールと設定

概要
munin は、munin と munin-node にわかれる。munin は munin-node を束ねるサーバで、ノードと通信しノードの情報をグラフ化しWEBページとしてそれを参照できるようにする。 muni-node はターゲットサーバのリソースを監視する。
munin-master インストール
基本的にパッケージインストールでOK
[root@dlp ~]# wget http://ftp.riken.jp/Linux/fedora/epel/RPM-GPG-KEY-EPEL-6
[root@dlp ~]# rpm --import RPM-GPG-KEY-EPEL-6
[root@dlp ~]# rm -f RPM-GPG-KEY-EPEL-6
[root@dlp ~]# vi /etc/yum.repos.d/epel.repo

# 以下の内容で新規作成
[epel]
name=EPEL RPM Repository for Red Hat Enterprise Linux
baseurl=http://ftp.riken.jp/Linux/fedora/epel/6/$basearch/
gpgcheck=1
enabled=0

# 上記リポジトリを使用してインストールする場合は、以下のようにコマンド入力
[root@dlp ~]# yum --enablerepo=epel install [パッケージ名]
ただ、EPEL リポジトリからパッケージをインストールする場合、CentOS のバージョンに注意する。下記の参考URLにあるような RPM-GPG-KEY-EPEL-5 は RPM-GPG-KEY-EPEL-6 と読み替えるといい。
[root@master ~]# yum --enablerepo=epel -y install munin munin-node   # EPELからインストール
[root@master ~]# vi /etc/munin/munin.conf

# 60行目:ホスト名に変更
[master.server.world]
  address 127.0.0.1
  use_node_name yes

[root@master ~]# vi /etc/munin/munin-node.conf

# 29行目:自ホスト名に変更
host_name master.server.world

[root@master ~]# rm /var/www/html/munin/.htaccess
[root@master ~]# vi /etc/httpd/conf.d/munin.conf

<Directory /var/www/html/munin/>
  Order Deny,Allow
  Deny from all
  Allow from 127.0.0.1 10.0.0.0/24
</Directory>

[root@master ~]# /etc/rc.d/init.d/httpd restart
Stopping httpd:[ OK ]
Starting httpd:[ OK ]

[root@master ~]# /etc/rc.d/init.d/munin-node start
Starting Munin Node:[ OK ]

[root@master ~]# chkconfig munin-node on
これで munin-master サーバと同じ munin-node のリソース情報は吸い上げられるようになった
munin-node インストール
munin-master とほぼ同じ。パッケージからいれる。
[root@dlp ~]# wget http://ftp.riken.jp/Linux/fedora/epel/RPM-GPG-KEY-EPEL-6
[root@dlp ~]# rpm --import RPM-GPG-KEY-EPEL-6
[root@dlp ~]# rm -f RPM-GPG-KEY-EPEL-6
[root@dlp ~]# vi /etc/yum.repos.d/epel.repo

# 以下の内容で新規作成
[epel]
name=EPEL RPM Repository for Red Hat Enterprise Linux
baseurl=http://ftp.riken.jp/Linux/fedora/epel/6/$basearch/
gpgcheck=1
enabled=0

[root@master ~]# yum --enablerepo=epel -y install munin-node   # EPELからインストール
[root@master ~]# vi /etc/munin/munin-node.conf

allow ^XXX\.XXX\.XXX\.XXX$(サーバのIP)
を
allow ^127\.0\.0\.1$
の下辺りに追記しておきます。

[root@master ~]# /etc/rc.d/init.d/munin-node start

Starting Munin Node:[ OK ]

[root@master ~]# chkconfig munin-node on
ここで 自分のWAN側IPアドレスはわかる http://www.cman.jp/network/support/go_access.cgi
munin-master サーバ側で次になればOK:
# telnet [ノードのIPアドレス] 4949

Connected to 略
Escape character is '^]'.
# munin node at backup
munin-master サーバの /etc/munin/munin.conf で上記のノードを追記 :
[GroupName;XXX.XXX.XXX]
address XXX.XXX.XXX
use_node_name yes
[] の中を適当にしてると動かなかくて、FQDN にしろって記述があったので IPアドレスにしたら動いた GroupName は 2.0.6 では上記の通りでちゃんと設定できた
CGI設定
munin の CGI は munin-cgi-graph と munin-cgi-html があるみたいで、 グラフの画像生成とHTMLそれぞれを動的に生成するかどうか設定できる。
以下はグラフ。グラフは詳細な時間を見ようとすると CGI の設定が必須みたい。cron だとグラフをクリックして遷移した先のHTMLで画像がリンク切れになってる。
あと、EPEL リポジトリからパッケージインストールするとなのかは不明だが、munin-cgi-graph と munin-cgi-html がどこにもなかった…。 なのでパッケージはインストールされているがソースをビルドした。
[root@master ~]# yum --enablerepo=epel -y install \
                   rrdtool perl-rrdtool perl-Module-Buildrrdtool\
                   perl-Module-Build \
                   perl-Time-HiRes \
                   perl-Digest-MD5 \
                   perl-HTML-Template \
                   perl-File-Copy-Recursive \
                   fcgi fcgi-devel perl-FCGI perl-CGI \
                   perl-IO-Socket-INET6 \
                   perl-Net-SNMP \
                   perl-Log-Log4perl \
                   perl-Net-Server

wget http://sourceforge.net/projects/munin/files/stable/2.0.6/munin-2.0.6.tar.gz
tar xfz munin-2.0.6.tar.gz
cd munin-2.0.6
vi Makefile
CONFIG = dists/redhat/Makefile.config
make
したらば /path/to/munin-2.0.6/build/master/_bin/munin-cgi-graph にできてる
vi /etc/munin/munin.conf

# 下記を変更か追記
graph_strategy cgi
cgiurl_graph /munin-cgi/munin-cgi-graph

cp /path/to/munin-2.0.6/build/master/_bin/munin-cgi-graph /var/www/cgi-bin/

vi /etc/httpd/conf.d/munin.conf

# ScriptAlias 追記
ScriptAlias /munin-cgi/ /var/www/cgi-bin/

<Directory /var/www/cgi-bin>
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
</Directory>
これで graph が CGI で動作するようになった

2012年11月22日木曜日

[other]mac に ssh で接続、ssh を使って git clone する

■mac に ssh 接続する
http://d.hatena.ne.jp/dice-t/20071115/1195187150 システム環境設定 → 共有 → リモートログイン
(チャレンジレスポンスになってる。パスワード、鍵認証も sshd_config 触るとできるみたいだけどやってないのでわからん)

次で接続できることを一応確認しとく。

Windows の teraterm でホストに mac のIPアドレス、TCPポート 22、SSH2 、
ユーザ名に設定して接続許可したユーザ、「チャレンジレスポンス認証を使う」、パスワードにmacのパスワードを入力。

■git で公開用リポジトリを作る

http://d.hatena.ne.jp/takihiro/20090325/1237990865

■クライアント で git clone する

git clone ssh://user@host:port/Users/xxxxx/xxxxx/project.git

IntelliJ IDEA なら

Git Repository URL : [ssh://user@host:port/Users/xxxxx/xxxxx/project.git]
Parent Directory : [git clone 保存先ディレクトリ]

を設定すると Directory Name はたぶん勝手にはいる。
私は下みたいになった。

Directory Name : [project]

2012年11月2日金曜日

[sphinx]はじめにやることメモ

http://isann.blog2.fc2.com/blog-entry-290.html

http://isann.blog2.fc2.com/blog-entry-293.html

■sphinxって何?


ここ見たらだいたいわかります。
http://sphinx-users.jp/

わかってるからそう言うのでしょうか。
はじめはまったくわかりませんでした。

要は、テキストファイルにwiki記法みたいな簡易マークアックアップの「reStructredText」で
記述し、これをプログラムを使って綺麗なHTMLなどにする、ということです。

で、「reStructredText」はディレクティブというのがあって、
これを使ってブロック図を書いたりシーケンス図を書いたり、
「reStructredText」標準の機能に機能追加していく感じです。

Sphinxというとpython、
という感じですがpythonを知らないとsphinxを使えないことはまったくありません。

知らないといけないのは、「reStructredText」の記述方法とSphinxの使い方です。

■sphinxインストール


ではさっそくインストールします。
pythonのインストールはexeキックするだけです。
easy_installはこのへんを参考にして下さい。

http://sphinx-users.jp/gettingstarted/install_windows.html
easy-install sphinx

これだけです。

■プロジェクトを作る


sphinx-quickstart

質問には全部デフォルトで答えました。

以下だけ入力します。


  • プロジェクト名

  • バージョン番号

  • 著者の名前


■diagインストール


http://blockdiag.com/ja/blockdiag/introduction.html#id2
easy_install pillow
easy_install blockdiag


■sphinxにdiagを埋め込む


上記だけでsphinxでblockdiagを使えるわけじゃなく、
上記はテキストファイル「diag」などからpng形式の画像データを作成するものです。
埋め込むには「sphinxcontrib-blockdiag」が必要です。
easy_install sphinxcontrib-blockdiag


■confの設定


./sphinx-project/conf.py
# Enabled extensions
extensions = ['sphinxcontrib.blockdiag']

# Fontpath for blockdiag (truetype font)
blockdiag_fontpath = 'C:\Windows\Fonts\msgothic.ttc'

ちょっとpythonファイルに設定を追記します。
pythonファイルもただのテキストファイルです。

■ディレクティブ


.. blockdiag:: [diag-filename]

例えばこんな感じで使えるようになります。

■トライアンドエラー的な…



  • blockdiagのpngファイルで日本語が文字化け

    これは文字化け、なんだけれど要はデフォルトでは日本語フォント使ってなくて、
    変なUTF-8の文字見つかったけどなににしたらわからーん!って状態。
    rem set /P font=フォントのパスを指定して下さい。(日本語フォントがよい):
    set font="C:\Windows\Fonts\msgothic.ttc"
    set /P diag=diagファイルのパスを指定して下さい。:
    blockdiag -f %font% %diag%
    pause
    

    こうやって日本語フォント指定してやればいける。
    でもちょっとノード内のフォントが上きれるんだよな…。これ原因不明です。

  • Sphinxのドキュメントで日本語が文字化け

    これも上と同じような問題。
    結局CSSのfont-familyの記述によって読み込まれているフォントが日本語非対応のフォントということらしい。

    http://blog1.erp2py.com/2012/01/sphinx.html
    <転載>
    [Pythonフォルダ] → [Lib] → [site-packages] → [Sphinx-1.1.2-py2.7.egg] → [sphinx]
    sphinxdoc.css_t ファイルをコピー&ペーストする
    
    [sphinx] → [themes] → [sphinxdoc] → [static] フォルダーに sphinxdoc.css_t ファイルがあるのでコピーして、ドキュメントの [_static] フォルダに貼り付ける。
    
    ペーストした sphinxdoc.css_t ファイルをテキストエディタで開き、font-family を変更する。
    
    sphinxdoc.css_t には font-family の指定が4カ所あるので変更する。私は次のように変更した。
    
    bodyタグ指定、viewcode-backクラス指定
    
    変更前
    font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva',
                 'Verdana', sans-serif;
    変更後
    font-family: 'Arial', 'Helvetica', sans-serif;
    
    cite, code, ttタグ指定、preタグ指定
    
    変更前
    font-family: 'Consolas', 'Deja Vu Sans Mono',
                 'Bitstream Vera Sans Mono', monospace;
    変更後
    font-family: 'Consolas', 'Courier New', monospace;
    make html コマンドで、htmlファイルを再作成する。
    
    Lucida Grandeとか悪さをしているみたいです。>

■shpinxインストールの補足的な


Sphinxの導入は下記あたりで記事にしました。
http://isann.blog2.fc2.com/blog-entry-290.html
http://isann.blog2.fc2.com/blog-entry-292.html

これにわかったことなどを追加しながら少し整理してみます。

sphinxのインストールに関してはhttp://isann.blog2.fc2.com/blog-entry-290.htmlそのままです。
pypiに登録されていますので、easy_installから簡単にインストールして、
そのままプロジェクトを作ります。
sphinx-quickstart コマンドはデフォルトで実行したディレクトリ配下にファイルを作成しますので、
自分で /usr/hoge/shpinx_doc/hogedoc みたいなディレクトリを作成してそこで実行するとよいと思います。

diagシリーズはブロック図は汎用性もあるのであるとかなりいいと思います。

easy_install sphinxcontrib-blockdiag

これに追加でシーケンス図を僕はよく使うので入れています。
easy_install sphinxcontrib-seqdiag

http://blockdiag.com/ja/seqdiag/sphinxcontrib.html

他にもアクティビティ図やネットワーク図などがあります。
必要に応じて追加するといいかもです。
はじめに全部入れておいても不都合はないと思います。
http://d.hatena.ne.jp/torutk/20110522/p1
http://d.hatena.ne.jp/hekyou/20110717/p1

shpinxドキュメントにこれらの図を埋め込むにはconf.pyを設定する必要があります。
この時点で下記リンク先のようなconf.pyになっていました。
https://gist.github.com/1978985
extensions = []
extensions.append('sphinxcontrib.blockdiag')
extensions.append('sphinxcontrib.seqdiag')
extensions.append('japanesesupport')
blockdiag_fontpath = r'C:\Windows\Fonts\msgothic.ttc'
seqdiag_fontpath = r'C:\Windows\Fonts\msgothic.ttc'

extensions.append('XXXXX')
こんな感じでどんどん拡張を追加していくとやりやすいかもです。

あと、日付フォーマットは
today_fmt = '%Y-%m-%d %H:%M:%S'

にしました。

sphinxドキュメントをHTML出力する際に日本語が含まれると思いますので、
下記のようなパスにあるsphinxdoc.css_tを
C:\TracLight\python\Lib\site-packages\Sphinx-1.1.2-py2.6.egg\sphinx\themes\sphinxdoc\static\sphinxdoc.css_t

F:\sphinxdoc\hoge\_static\sphinxdoc.css_t
みたいな感じでコピーしておきます。
https://gist.github.com/1978951
    font-family: 'Arial', 'Helvetica', sans-serif;
    ・
    font-family: 'Consolas', 'Courier New', monospace;
    ・
    font-family: 'Consolas', 'Courier New', monospace;
    ・
    font-family: 'Arial', 'Helvetica', sans-serif;

こんな順番で参考にさせて頂いたサイトと同様にfont-familyを変更しました。

シーケンス図の埋め込みはこんな感じです。
.. seqdiag::

    seqdiag admin {

      browser  -> webserver [label = "GET /index.html"];
      browser <-- webserver;
      browser  -> webserver [label = "POST /blog/comment"];
                  webserver  -> database [label = "INSERT comment"];
                  webserver <-- database;
      browser <-- webserver;
    
    }


ブロック図の埋め込みはこんな感じです。
.. blockdiag::

    blockdiag admin {
      
      // Set labels to nodes.
      A [label = "foo"];
      B [label = "bar"];
      // And set text-color
      C [label = "baz"];
   
      // Set labels to edges. (short text only)
      A -> B [label = "click bar", textcolor="red"];
      B -> C [label = "click baz"];
      C -> A;
   
    }


ブロック図に関してよく使うスタイルとか。
      node_width = 160;
      node_height = 60;
      default_fontsize = 12;
      default_node_color = "#4F81BD";
      default_textcolor = "#FFFFFF";
      class data [ shape = flowchart.input ];
      class ext_syori [color = "#9BBB59"];
      class ext_data [color = "#9BBB59", shape = flowchart.input];


あと、sphinxでテーブルの出力はまあまあ面倒くさくて、
list-tableやcsv-tableをよく使うことになる。
なんか癪だったのでpythonでtsvをうまくテーブルにするもの作ってみた。
https://gist.github.com/1977836
まだ、未完成でして、同一セル内の改行に対応できていません。

こんなところです。