2011-11-13

土屋鞄製造所 SESSIONシリーズ

左:キャリーオールボストン
右:ビッグトート

以前から新しい鞄が欲しくてリストアップしていた鞄が最終販売になった。
どうしても欲しいという欲求と、将来的に手に入らないという危機感みたいな感情に数週間悩まされたが、結局購入しました。

2011-08-08

Tokyo Tyrant ulog肥大化回避

Tokyo Tyrantのulogを放置していたら肥大化したので、最新10ファイルを残してそれ以外は削除するスクリプトを作成。
#!/bin/bash
#
# @(#) TokyoTyrantDeleteUlog.sh ver.1.0.0 2011.08.08
#
# Usage:
#   TokyoTyrantDeleteUlog.sh
#
# Description:
#   Tokyo Tyrantのulog削除スクリプト
#   最新10ファイルのみを保存
#
###########################################################################

# ulog保存先設定
logdir='/home/ttserver/data/ulog/'

# ulog保存先内ファイル一覧取得
mydir=`ls -t $logdir`

# ファイル分ループ
i=1
for file in $mydir
  do
    # 10ファイル目までは処理をスキップ
    if [ $i -gt 10 ]
    then
      # 削除処理
      rm -rf $logdir$file
    fi
    i=$((i+1))
  done
あとは定期的に実行するためにcronに登録。
# 午前00時処理
# ・Tokyo Tyrantのulog削除
0 0 * * * TokyoTyrantDeleteUlog.sh

2011-07-03

オープンソースの定義

何気なくサイトを見ていると、「オープンソース」を定義しているサイトに出会った。
記載されている内容はともかく、業界にいるので「オープンソース」という言葉を聞かない日がないほど有名な言葉であるが、改めて読んでみると、現在、私がこの業界で仕事が出来ているのも、ひとえに「オープンソース」という概念の恩恵があってこそであると改めて認識させられた。
小さい頃から結構憧れの業界であり、「入り込めればなんとかなるさ!」という何の根拠もない信念のもと携わってきたが、今一度、これまでの感謝とこれからの恩返しを心に誓うべく、「オープンソースの定義」を以下に記載します。


はじめに
「オープンソース」とは、単にソースコードが入手できるということだけを意味するのではありません。「オープンソース」であるプログラムの頒布条件は、以下の基準を満たしていなければなりません。

1.再頒布の自由
「オープンソース」であるライセンス(以下「ライセンス」と略)は、出自の様々なプログラムを集めたソフトウェア頒布物(ディストリビューション)の一部として、ソフトウェアを販売あるいは無料で頒布することを制限してはなりません。ライセンスは、このような販売に関して印税その他の報酬を要求してはなりません。
理由:ライセンスが自由な再頒布を要求するよう強制することにより、数多くの長期的利益をちょっとした短期的な販売収益を得るために投げ捨ててしまうというような誘惑を除くことができます。このような縛りをかけないと、協力者たちは変節せよという強い圧力にさらされてしまうでしょう。

2.ソースコード
「オープンソース」であるプログラムはソースコードを含んでいなければならず、コンパイル済形式と同様にソースコードでの頒布も許可されていなければなりません。何らかの事情でソースコードと共に頒布しない場合には、ソースコードを複製に要するコストとして妥当な額程度の費用で入手できる方法を用意し、それをはっきりと公表しなければなりません。方法として好ましいのはインターネットを通じての無料ダウンロードです。ソースコードは、プログラマがプログラムを変更しやすい形態でなければなりません。意図的にソースコードを分かりにくくすることは許されませんし、プリプロセッサや変換プログラムの出力のような中間形式は認められません。
理由:私たちは、意図的に分かりにくくされていないソースコードが入手できることを要求します。プログラムを改変することなしにはプログラムを発展させることはできないからです。私たちの目的はソフトウェアの発展をより容易なものにすることですから、変更が簡単に行えることを必要条件に加えています。

3.派生ソフトウェア
ライセンスは、ソフトウェアの変更と派生ソフトウェアの作成、並びに派生ソフトウェアを元のソフトウェアと同じライセンスの下で頒布することを許可しなければなりません。
理由:単にソースを読むことができるだけでは、独立したピアレビューや急速な発展的淘汰を維持するのに十分ではありません。急速な進化を実際に起こすためには、人々がそのソフトウェアでさまざまに実験し、変更点を再頒布することができる必要があります。

4.作者のソースコードの完全性(integrity)
バイナリ構築の際にプログラムを変更するため、ソースコードと一緒に「パッチファイル」を頒布することを認める場合に限り、ライセンスによって変更されたソースコードの頒布を制限することができます。ライセンスは、変更されたソースコードから構築されたソフトウェアの頒布を明確に許可していなければなりませんが、派生ソフトウェアに元のソフトウェアとは異なる名前やバージョン番号をつけるよう義務付けるのは構いません。
理由:盛んに改良することを奨励するのは良いことですが、ユーザには彼らが使っているソフトウェアについて誰が責任を持っているのか知る権利があります。反対に、ソフトウェアの作者と管理者にも彼らの名声を保護し、何をサポートすることが要求されているのか知る権利があります。

それゆえ、オープンソースなライセンスはそのソースが容易に入手可能であることを保証しなければならないのですが、一方でそれがいっさい変更されていない本来の基本ソースとパッチという形で頒布することを義務付けても構わないということにします。こうすれば、「非公式」な変更点は利用可能でありつつも、元のソースとは簡単に見分けがつくわけです。

5.個人やグループに対する差別の禁止
ライセンスは特定の個人やグループを差別してはなりません。
理由:進化の過程から最大の恩恵を引き出すためには、可能な限り多種多様な人々やグループに、平等にオープンソースに貢献する資格が与えられている必要があります。そこで、オープンソースなライセンスによって誰かを進化の過程から締め出すことは禁止されています。

アメリカ合衆国を含むいくつかの国では、ある種のソフトウェアに輸出制限を課しています。OSD準拠のライセンスは、適用される可能性がある制限についてライセンス受諾者に警告し、また彼らには法に従う義務があることを示唆しても構いません。しかし、ライセンス自身にそのような制限を取り込んではなりません。

6.利用する分野(fields of endeavor)に対する差別の禁止
ライセンスはある特定の分野でプログラムを使うことを制限してはなりません。例えば、プログラムの企業での使用や、遺伝子研究の分野での使用を制限してはなりません。
理由:この条項の主な意図は、ライセンスによってオープンソースが商業的に使われることを妨げるような策略を禁止することです。私たちは、営利的なユーザも私たちのコミュニティに加入してくれることを望んでおり、彼らがそこから排除されているような気分になっては欲しくないのです。

7.ライセンスの分配(distribution)
プログラムに付随する権利はそのプログラムが再頒布された者全てに等しく認め られなければならず、彼らが何らかの追加的ライセンスに同意することを必要としてはなりません。
理由:この条項は、ソフトウェアを機密保持契約への同意を要求するなどの間接的な手段によって囲い込むことの禁止を目的としています。

8.特定製品でのみ有効なライセンスの禁止
プログラムに付与された権利は、それがある特定のソフトウェア頒布物の一部であるということに依存するものであってはなりません。プログラムをその頒布物から取り出したとしても、そのプログラム自身のライセンスの範囲内で使用あるいは頒布される限り、プログラムが再頒布される全ての人々が、元のソフトウェア頒布物において与えられていた権利と同等の権利を有することを保証しなければなりません。
理由:この条項は、ライセンスによるこれまたよくあるタイプの策略を禁止します。

9.他のソフトウェアを制限するライセンスの禁止
ライセンスはそのソフトウェアと共に頒布される他のソフトウェアに制限を設けてはなりません。例えば、ライセンスは同じ媒体で頒布される他のプログラムが全てオープンソースソフトウェアであることを要求してはなりません。
理由:オープンソースなソフトウェアの頒布者には、彼ら自身のソフトウェアについては彼ら自身で選択する権利があります。

もちろんGPLはこの要件を満たしています。GPLが適用されたライブラリとリンクされたソフトウェアは、それが単一の著作物を形成する場合のみGPLを継承するのであって、単に一緒に頒布されるというだけならば他のソフトウェアには影響しません。

10.ライセンスは技術中立的でなければならない
ライセンス中に、特定の技術やインターフェースの様式に強く依存するような規定があってはなりません。
理由:この規定で特に念頭に置いているのは、ライセンサーとライセンシーの間で契約を成立させるために明示的な同意の意思表示を必要とするようなライセンスです。いわゆる「クリックラップ(click-wrap)」を要求する規定は、ソフトウェア頒布において重要な手法であるFTPダウンロードやCD-ROMアンソロジー、ウェブのミラーリングなどと衝突する可能性がありますので、このような規定もコードの再利用を妨げてしまいます。よって、本定義に準拠するライセンスは、(a)ソフトウェアの再頒布が、ダウンロード時のクリックラップをサポートしないようなウェブ以外の経路で起こりうるという可能性 (b)ライセンスで保護されるコード(あるいは保護されるコードの再利用された部分)はポップアップダイアログをサポートできない非GUIの環境でも実行されれうるという可能性、を認めなければなりません。

2011-07-01

Ext JS 4

クロスブラウザー対応、RIA開発用フレームワークであるExt JS。
Senchaの製品には複数のライセンスオプションが用意されているのだが、提供されるソースコードにどのような違いがあるのか検証してみた。

ソースコードの違いは以下の通り。
9、10行目のライセンスに関する記載のみ違いがありましたが、それ以外は同じソースコードでした。
注:時間がなかったので一階層目のソースコードのみ検証しました。のこりは時間のある時にでも・・・

商用ライセンス(ext-4.0.2a-commercial.zip)
/*

This file is part of Ext JS 4

Copyright (c) 2011 Sencha Inc

Contact:  http://www.sencha.com/contact

Commercial Usage
Licensees holding valid commercial licenses may use this file in accordance with the Commercial Software License Agreement provided with the Software or, alternatively, in accordance with the terms contained in a written agreement between you and Sencha.

If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact.

*/

オープンソースライセンス(ext-4.0.2a-gpl.zip)
/*

This file is part of Ext JS 4

Copyright (c) 2011 Sencha Inc

Contact:  http://www.sencha.com/contact

GNU General Public License Usage
This file may be used under the terms of the GNU General Public License version 3.0 as published by the Free Software Foundation and appearing in the file LICENSE included in the packaging of this file.  Please review the following information to ensure the GNU General Public License version 3.0 requirements will be met: http://www.gnu.org/copyleft/gpl.html.

If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact.

*/

ちなにみ、複数のライセンスオプションは以下のとおり。

商用ライセンス(ext-4.0.2a-commercial.zip)
GPLが採用できないようなアプリケーション(ソースコードを公開したり配布したりできない場合等)を開発する場合に選択。
オープンソースライセンス(ext-4.0.2a-gpl.zip)
オープンソースライセンスは、GNU GPL license v3に準拠したオープンソースアプリケーションを作成する場合に選択。
OEMライセンス、リセラーライセンス
ソフトウェア開発ライブラリ、ツールキット、フレームワークを作成する場合に該当する場合に選択。Ext Japan, LLC (合同会社イーエクスティー)との契約が必要かと思います。

2011-06-30

MySQL Got error 139 from storage engine.

現在、運用・保守しているシステムの本番環境にて以下のエラーが発生した。
環境:MySQL 5.1.47、innodb plugin 1.0.8
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. You have to change some columns to TEXT or BLOBs

開発環境で同様の操作を行うと以下のエラーが発生。
環境:MySQL 5.1.45、Built-In innodb
ERROR 1030 (HY000): Got error 139 from storage engine

いろいろ検索してみると以下のような原因でエラーが発生している模様。
  • InnoDBの行サイズの上限はページサイズの約半分で、デフォルトでは約8KB。
  • 可変長カラム(VARBINARY、VARCHAR、BLOB、TEXT)のデータは行の外部に保存されるが、先頭の768Bだけは行の内部に保存される。
  • 一つのテーブルに11個のTEXT型フィールドを作り、それぞれに768B以上のデータを入れようとすると、768 * 11 = 8448 > 8000 なので保存できない。

MySQLのリファレンスマニュアルにも「InnoDBテーブルにおける制限」として以下のように記載されていました。
MySQL 5.1 Reference Manual :: 13.6.14. Restrictions on InnoDB Tables
The maximum row length, except for variable-length columns (VARBINARY, VARCHAR, BLOB and TEXT), is slightly less than half of a database page. That is, the maximum row length is about 8000 bytes. LONGBLOB and LONGTEXT columns must be less than 4GB, and the total row length, including BLOB and TEXT columns, must be less than 4GB.

まとめ:行サイズについて
MySQL自体の上限は、64KB。しかし、BLOBのデータは他の領域に格納されるので含みません。さらに、ストレージエンジンごとに制限が存在する場合があります。
InnoDBは、テーブルスペースのページサイズの約半分でが上限となり、ページサイズのデフォルトは16KBなのでデフォルトの行サイズは約8KBとなります。ページサイズを変更することも出来ますが、MySQLをソースからコンパイルして、さらにテーブルスペースとログファイルを再作成する必要があります。ページサイズの変更を行うと、ページサイズの上限は64KBとなるので、その場合の1行の最大サイズは32KBとなります。ちなみに、MySQL Clusterは1行あたり最大8KBです。

設計を見直すか・・・

※また、本ページを作成するのに以下のサイトを参考にしました。
InnoDBの意外な制約: Got error 139 from storage engine | へびにっき
Nix::WebLab : Got error 139 from storage engine
MySQL :: MySQL 5.1 Reference Manual :: 13.6.14 Restrictions on InnoDB Tables

2011-06-29

MySQL Innodb pluginバージョン確認

MySQLのInnodb pluginのバージョン確認方法。
mysql> SELECT @@innodb_version;
+------------------+
| @@innodb_version |
+------------------+
| 1.0.8            |
+------------------+
1 row in set (0.00 sec)

2011-05-25

Lua インストール

phpのセッション管理をTokyo Tyrantで行いたい場合、有効期限切れのセッションを削除する必要がある。
その削除処理がLuaにて稼動するので、Luaをインストールする。

Luaインストール。
# cd /usr/local/src
# wget http://www.lua.org/ftp/lua-5.1.4.tar.gz
# tar zxf lua-5.1.4.tar.gz
# cd lua-5.1.4
# make linux
# make install INSTALL_TOP=/usr/local/lua
「/usr/local/lua」にluaがインストールされているので動作確認のため以下のコマンドを実施。
# /usr/local/lua/bin/lua
以下のように表示されればOK。
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
>

2011-05-04

白夜行 (集英社文庫)

白夜行 (集英社文庫) 引用:Amazon

前作「秘密」で、温かくて切ない物語を紡いだ東野圭吾が、今回は読む者の心を冷え冷えと切なくさせる。 1973年に起こった質屋殺しがプロローグ。最後に被害者と会った女がガス中毒死して、事件は迷宮入りする。物語の主人公は、質屋の息子と女の娘だ。当時小学生だった二人が成長し、社会で“活躍”するようになるまでを、世相とともに描ききる。2人の人生は順風満帆ではなく、次々忌まわしい事件が降りかかる……。当然ミステリーだから謎が隠されているわけだが、真相は途中で暗示されてしまう。しかし謎の存在などどうでもよくなるほどのスケールの大きさが読後に残る。(石飛徳樹)

2011-05-03

容疑者Xの献身 (文春文庫)

容疑者Xの献身 (文春文庫) 引用:Amazon

天才数学者でありながら不遇な日日を送っていた高校教師の石神は、一人娘と暮らす隣人の靖子に秘かな想いを寄せていた。彼女たちが前夫を殺害したことを知った彼は、二人を救うため完全犯罪を企てる。だが皮肉にも、石神のかつての親友である物理学者の湯川学が、その謎に挑むことになる。ガリレオシリーズ初の長篇、直木賞受賞作。

2011-05-02

予知夢 (文春文庫)

予知夢 (文春文庫) 引用:Amazon

東野圭吾ほど、多彩な作品をおくりだす作家は珍しいだろう。デビュー作は、学園を舞台にした本格推理小説『放課後』(第31回江戸川乱歩賞)。第52回日本推理作家協会賞受賞の『秘密』では、ミステリーの形式を踏みながら家族の美しい情愛をせつなくつづった。クローン技術を題材にした『分身』や大型原子炉が危機に陥る『天空の蜂』などの社会派小説も生みだしている。作品ごとに、まったく違った味わいを読者に与えてくれるのだ。
本書は「探偵ガリレオ」シリーズ2作目。帝都大学理工学部物理学科助教授、探偵ガリレオこと湯川学が、摩訶不思議な事件を論理的に解決していく、本格推理短編集である。

素封家の屋敷に侵入者があった。犯人は27歳の青年。2階で眠っていた娘を襲おうとしたらしい。逮捕された犯人は、17年前、その少女と結婚する夢を見たという。夢に現れた少女が現実に存在するとは? 予知夢はあるのか?

ロマンチックにも感じられる第1章「夢想る(ゆめみる)」をはじめ、「霊視る(みえる)」「騒霊ぐ(さわぐ)」「絞殺る(しめる)」「予知る(しる)」の、全5作が収録されている。軽快な文章の中に凝縮された、オカルチックな題材と巧妙なトリック、明晰な推理と確固たる論理。本書はたぐい稀なるストーリーテラーである著者の技を堪能できる作品といえよう。(冷水修子)

2011-05-01

探偵ガリレオ(文春文庫)

探偵ガリレオ (文春文庫) 引用:Amazon

突然、燃え上がった若者の頭、心臓だけ腐った男の死体、池に浮んだデスマスク、幽体離脱した少年…警視庁捜査一課の草薙俊平が、説明のつかない難事件にぶつかったとき、必ず訪ねる友人がいる。帝都大学理工学部物理学科助教授・湯川学。常識を超えた謎に天才科学者が挑む、連作ミステリーのシリーズ第一作。

2011-04-15

流星の絆 (講談社文庫)

流星の絆 (講談社文庫) 引用:Amazon

何者かに両親を惨殺された三兄妹は、流れ星に仇討ちを誓う。14年後、互いのことだけを信じ、世間を敵視しながら生きる彼らの前に、犯人を突き止める最初で最後の機会が訪れる。三人で完璧に仕掛けはずの復讐計画。その最大の誤算は、妹の恋心だった。涙があふれる衝撃の真相。著者会心の新たな代表作。

2011-04-04

MySQL Proxy mysql-proxy.cnf

[mysql-proxy]
keepalive = true
proxy-address = 127.0.0.1:3306
proxy-backend-addresses = masterdb1:3306
proxy-read-only-backend-addresses = slavedb1:3306,slavedb2:3306
proxy-lua-script = /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
daemon = true
log-use-syslog = true
log-level = message
user = mysql-proxy

MySQL Proxy 起動スクリプト

#!/bin/sh
#
# mysql-proxy This script starts and stops the mysql-proxy daemon
#
# chkconfig: - 78 30
# processname: mysql-proxy
# description: mysql-proxy is a proxy daemon to mysql

# Source function library.
. /etc/rc.d/init.d/functions

PROXY_PATH=/opt/mysql-proxy/sbin

prog="mysql-proxy"

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

# Set default mysql-proxy configuration.
PROXY_OPTIONS="--daemon"
PROXY_PID=/var/run/mysql-proxy.pid

# Source mysql-proxy configuration.
if [ -f /etc/sysconfig/mysql-proxy ] ; then
        . /etc/sysconfig/mysql-proxy
fi

PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH

# By default it's all good
RETVAL=0

# See how we were called.
case "$1" in
  start)
        # Start daemon.
        echo -n $"Starting $prog: "
        daemon $NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS --pid-file $PROXY_PID
        RETVAL=$?
        echo
        if [ $RETVAL = 0 ]; then
                touch /var/lock/subsys/mysql-proxy
        fi
        ;;
  stop)
        # Stop daemons.
        echo -n $"Stopping $prog: "
        killproc $prog
        RETVAL=$?
        echo
        if [ $RETVAL = 0 ]; then
                rm -f /var/lock/subsys/mysql-proxy
                rm -f $PROXY_PID
        fi
        ;;
  restart)
        $0 stop
        sleep 3
        $0 start
        ;;
  condrestart)
       [ -e /var/lock/subsys/mysql-proxy ] && $0 restart
       ;;
  status)
        status mysql-proxy
        RETVAL=$?
        ;;
  *)
        echo "Usage: $0 {start|stop|restart|status|condrestart}"
        RETVAL=1
        ;;
esac

exit $RETVAL

2011-03-08

エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド

エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド 引用:Amazon

高額なデータベースシステムでなくとも十分との認識が広まったことから、MySQLがクローズアップされて久しい。すでに書籍も少なからず出版されていますが、多くの場合はシステムの「構築」という点にフォーカスされており、解説も使用開始前で終わっていることが多いようです。その点、本書は「運用」の、しかもトラブルシューティングに焦点を当てており、完全に独自の路線(サポートを受けているかのような実用的な内容)を採用。著者はMySQLユーザーのトラブルに日々対応している専門家ですので、その点でも万全です。

2011-03-07

ANSI C対応 はじめてのC (Software Technology)

ANSI C対応 はじめてのC (Software Technology)引用:Amazon

1985年から多くのユーザーに支持されてきたC言語解説本の決定版が、2001年のパソコン環境に合わせて改訂された。従来どおりのわかりやすい解説で、C言語のエッセンスを効率的に学べるようになっている。
まず第1章では、簡単な文章の出力方法を学んだ後でコーディングの規則を説明。その後C言語特有のデータ型の宣言と演算方式、プリプロセッサの機能(ファイルの取り込みやマクロ展開、条件付きコンパイルを行う)について触れている。ここでCの基礎知識が大まかに得られるようになっており、第2章からは各トピックについて深く掘り下げて学べるようになっている。

第2章では、「データ型」について学ぶ。基本となる「int型」「float型」「double型」「char型」の4つのデータ型について学んだ後で、変数、配列に値を代入する方法、新しいデータ型の作り方について知ることができる。

第3章では、Cで加減乗除を行う方法について学ぶ。通常の計算(+,-,*,/,%)に加え、比較・論理演算をする方法(<,>,&&,||,!など)、ビットを直接操作する方法、変数に値を代入するための代入演算子などについて知ることができる。

4章では、if-else文による条件分岐、while文、for文を使った繰り返し処理、第5章では関数について学ぶことができる。そして第6章からは、C言語を学ぶうえで重要な配列とポインタについて学ぶ。ポインタはアセンブラでいうアドレスにあたるもので、これで配列や構造体データを直接取り出したり、格納したりすることができる。ここではポインタの基本だけが述べられているので、さらに詳しく知りたい場合は『C言語ポインタ完全制覇』(技術評論社)が参考になる。第7章では構造体と共用体、第8章では標準関数、第9章では入出力関数について述べられている。

全体的に記述内容に無駄のない、すっきりとした構成になっている。C言語を学ぶための最初のテキストとして、ぜひおすすめしたい良書である。(土井英司)

2011-03-06

[Web開発者のための]大規模サービス技術入門 ―データ構造、メモリ、OS、DB、サーバ/インフラ (WEB+DB PRESS plusシリーズ)

[Web開発者のための]大規模サービス技術入門 ―データ構造、メモリ、OS、DB、サーバ/インフラ (WEB+DB PRESS plusシリーズ) 引用:Amazon

サーバを単に増やすだけでは解決しない(?!)。
大規模サービスの難所は、サービスの成長に伴い巨大化するデータの処理です。
データ量の変化は緩やかには推移せず、突然目の前に現れる大規模化の壁。
そこで求められるのは、いかにして「データを小さく持つか」「複数サーバに分散させるか」「最小限の回数で読み取るか」といった地道な取り組みの積み上げです。

本書では Web開発における大規模サービスの一つの関門、数十~数百ギガバイトのテキストデータを想定し、データ構造、メモリ、OS、DB、サーバ/インフラと広範なレイヤに及ぶ攻略ポイントをまとめて解説します。
はてなインターンシップの初書籍化。

2011-03-05

プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識

プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識 引用:Amazon

『プログラムはなぜ動くのか』6年ぶり、待望の改訂第2版!

プログラムがコンピュータの中でどのように動作するのかを、誰にでもわかるように説明しました。プログラムは、メモリーにロードされ、CPUによって解釈・実行されます。その仕組みを、多数の図を使って、順序だてて解説していきます。

第2版では、第1版で特に関心の高かったプログラムがメモリーをどう利用しているかについて、より丁寧な説明を加えたほか、多くの注釈を入れました。また、サンプル・プログラムを、第1版のVisual Basicからプログラムの動きが見えやすいC言語に統一し、巻末にC言語の構文を説明した補章を追加しました。初級者、中級者の人、どちらにもお勧めです。

特徴1:CPU、メモリー、プログラムの動作環境など・・基礎からきちんと解説!
CPU(プロセサ)はどうやってプログラムを動かしているの?  CPUとメモリーの関係は? どうやってディスプレイに表示されるの? など基礎的な部分からきちんと説明しています。

特徴2:メモリーについて充実した説明!
第1版でなんといっても多かったのが「プログラムがメモリーをどう使っているのかがわかって、自分のプログラムの動きがわかった!」という声でした。第2版では、メモリーの使い方についての説明を強化しました。関数や変数、ポインタや配列は、どうメモリー領域を使っているのかをぜひ知ってください。

特徴3:Windowsの仕組みわかる!
プログラムの動く仕組みを知るとは、Windowsの仕組みを知ることにもつながります。フリーソフトをインストールしたときに出会うDLLファイルや、EXEファイルは、その実体は何だろう、と感じるパソコンユーザーも多いはずです。本書は、プログラミング本ではありません。豊富な図表を使って、その仕組みや流れが感覚的にとらえられるようにしています。

2011-03-04

オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識―

オブジェクト指向でなぜつくるのか―知っておきたいプログラミング、UML、設計の基礎知識― 引用:Amazon

オブジェクト指向によるソフトウエア開発の入門書。モデリングや開発プロセスにも言及し、オブジェクト指向開発に関する一通りの知識を得られる。前半は、プログラミング言語の歴史をひも解きながら、オブジェクト指向に関心が集まる理由やメリットを解説。後半は、プログラムの再利用やUMLなどの周辺技術を解説する。ソフトウエアの動作原理にも触れる。専門用語が少ないため初心者でも読みやすい。

2011-03-03

プロフェッショナルの原点

プロフェッショナルの原点 引用:Amazon

組織に働く人たちが、時間管理・集中の方法・強みの鍛え方・意思決定の仕方など、みずからを磨き、限られた時間の中で最大の成果をあげるための必須のノウハウを、ドラッカーの言葉をもとにまとめた仕事論の王道。
本書を読めば、一流の仕事ができるようになるための姿勢と具体的な行動がわかる。ドラッカー自身がほぼ一世紀にわたる知的人生の中で育み、実践してきた方法であり、長い時の流れにも耐えてきた不変の原理原則である。

2011-03-02

京都老舗―暖簾のこころ

京都老舗―暖簾のこころ 引用:Amazon

「伝統とは変わり続けること」百年あるいは数百年、京都という土地に根付き、愛され続けている老舗三十六店。お店の歴史は人の歴史、時代の投手たちは何を考え、何を伝えてきたのか。前作『京都職人 匠のてのひら』では技術継承の難しさ同じ仕事を継続していくことの大変さを、シリーズ最新刊の本書では暖簾を守る事の難しさ、伝統を伝えていくことの大変さを書き記しました。三十六店、三十六様の「言葉」を読み終えたとき「京都」と「老舗」に対するイメージに新しいものが加わるはずです。
雨森敬太郎薬房/市原平兵衛商店/一文字屋和助/いづ萬老舗/いもぼう平野屋本店/芸艸堂/帯屋捨松/本家尾張屋/かづら清老舗/かま八老舗/紙司柿本 /御ちまき司川端道喜/菊一文字/鳩居堂/彩雲堂/佐々木竹苞書楼/渋新老舗/清課堂/大市/高橋堤燈/高室畳工業所/玉乃光酒造/たる源/通圓/なり田/原了郭 /柊屋/堀金箔粉/本田味噌/松野醤油/三嶋亭/みなとや幽霊子育飴本舗/村山造酢/香樹園八百林/山中油店/湯波吉

2011-03-01

京都職人―匠のてのひら

京都職人―匠のてのひら 引用:Amazon

京都の類い希なる「ものづくり」の世界。
消えゆく技術、新たな挑戦──。「能面」「花かんざし」「手摺りカルタ」など京都の伝統工芸をいまに伝える職人50人の「技」と「半生」。
美麗な写真とともに綴る「職人の世界」。
浅田晶久「京瓦」/綾部之「京の木工芸」/石田章一「竹工芸」/磯田達也「蒔絵」/今井義延「京刃物」/岩井彩「能面」/植田勝也「京足袋」/大塚華仙「截金」/大林芳雄「京組紐」/岡崎昭「表装」/鍵谷恭三「房・よりひも」/片岡喜三郎「邦楽器絃」/金谷雅明「京扇子」/河添功「京無地染」/川橋吉春「旗印染」/川本和代「京鹿の子絞り」/木野高利「京丸うちわ」/小泉景「京印章」/小糸敏夫「型友禅」/小嶋豊一「京提灯」/小松二三三「京繍」/佐竹利治「西陣織」/定永光夫「花かんざし」/澤田義春「色紙・短冊」/柴田勘十郎「京弓」/鈴木セツ子「水引細工」/高橋和男「京象嵌」/竹内伸一「黄楊櫛」/田中實「京すだれ」/谷川清三「キセル」/谷野修子「京唐紙」/丹治潔「和ろうそく」/辻賢一「金網細工」/中川利春「京銘竹」/西堀耕太郎「京和傘」/西村金造・大造「京石工芸品」/長谷川淳一「杼」/林利孝「京黒紋付染」/前澤さとえ「京念珠」/松井重夫「手刷りカルタ」/村田定平「数寄屋金具」/八木聖二「茶筒」/矢澤幹子「七宝」/安井文彦「和本」/山崎貞一「京仏具」山下雄治「調べ緒」/山本八郎・晃久「神鏡」/和田伊三男「京真田紐」/松栄堂「薫香」
対談「世界一のものづくりの街、京都」叶松谷×大野木啓人

2011-02-02

Tokyo Tyrant ttexpire.lua

function expire()
   local args = {}
   local cdate = string.format("%d", _time())
   table.insert(args, "addcond\0x\0NUMLE\0" .. cdate)
   table.insert(args, "out")
   local res = _misc("search", args)
   if not res then
      _log("expiration was failed", 2)
   end
   print("rnum=" .. _rnum() .. "  size=" .. _size())
end

Tokyo Tyrant 起動スクリプト スレーブ

#! /bin/sh
# chkconfig: 345 65 55
# description: Startup script for the server of Tokyo Tyrant For Session
# processname: tokyotyrant

#----------------------------------------------------------------
# Startup script for the server of Tokyo Tyrant
#----------------------------------------------------------------


# configuration variables
prog="ttservctl"
cmd="ttserver"
basedir="/home/ttserver/data"
port="1978"
pidfile="$basedir/ttserver.pid"
logfile="$basedir/ttserver.log"
ulogdir="$basedir/ulog"
ulimsiz="256m"
sid=2
mhost="remotehost1"
mport="1978"
rtsfile="$basedir/ttserver.rts"
dbname="$basedir/session.tct#bnum=1000000#idx=x:dec#dfunit=8"
ext="/home/ttserver/ext/ttexpire.lua"
extpc="expire 1"
maxcon="65535"
retval=0


# setting environment variables
LANG=C
LC_ALL=C
PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/tokyotyrant/bin"
export LANG LC_ALL PATH


# start the server
start(){
  printf 'Starting the server of Tokyo Tyrant\n'
  mkdir -p "$basedir"
  if [ -z "$basedir" ] || [ -z "$port" ] || [ -z "$pidfile" ] || [ -z "$dbname" ] ; then
    printf 'Invalid configuration\n'
    retval=1
  elif ! [ -d "$basedir" ] ; then
    printf 'No such directory: %s\n' "$basedir"
    retval=1
  elif [ -f "$pidfile" ] ; then
    pid=`cat "$pidfile"`
    printf 'Existing process: %d\n' "$pid"
    retval=1
  else
    if [ -n "$maxcon" ] ; then
      ulimit -n "$maxcon" >/dev/null 2>&1
    fi
    cmd="$cmd -port $port -dmn -pid $pidfile"
    if [ -n "$logfile" ] ; then
      cmd="$cmd -log $logfile"
    fi
    if [ -n "$ulogdir" ] ; then
      mkdir -p "$ulogdir"
      cmd="$cmd -ulog $ulogdir"
    fi
    if [ -n "$ulimsiz" ] ; then
      cmd="$cmd -ulim $ulimsiz"
    fi
    if [ -n "$sid" ] ; then
      cmd="$cmd -sid $sid"
    fi
    if [ -n "$mhost" ] ; then
      cmd="$cmd -mhost $mhost"
    fi
    if [ -n "$mport" ] ; then
      cmd="$cmd -mport $mport"
    fi
    if [ -n "$rtsfile" ] ; then
      cmd="$cmd -rts $rtsfile"
    fi
    if [ -n "$ext" ] ; then
      cmd="$cmd -ext $ext"
    fi
    if [ -n "$extpc" ] ; then
      cmd="$cmd -extpc $extpc"
    fi
    printf "Executing: %s\n" "$cmd"
    cmd="$cmd $dbname"
    $cmd
    if [ "$?" -eq 0 ] ; then
      printf 'Done\n'
    else
      printf 'The server could not started\n'
      retval=1
    fi
  fi
}


# stop the server
stop(){
  printf 'Stopping the server of Tokyo Tyrant\n'
  if [ -f "$pidfile" ] ; then
    pid=`cat "$pidfile"`
    printf "Sending the terminal signal to the process: %s\n" "$pid"
    kill -TERM "$pid"
    c=0
    while true ; do
      sleep 0.1
      if [ -f "$pidfile" ] ; then
        c=`expr $c + 1`
        if [ "$c" -ge 100 ] ; then
          printf 'Hanging process: %d\n' "$pid"
          retval=1
          break
        fi
      else
        printf 'Done\n'
        break
      fi
    done
  else
    printf 'No process found\n'
    retval=1
  fi
}


# send HUP to the server for log rotation
hup(){
  printf 'Sending HUP signal to the server of Tokyo Tyrant\n'
  if [ -f "$pidfile" ] ; then
    pid=`cat "$pidfile"`
    printf "Sending the hangup signal to the process: %s\n" "$pid"
    kill -HUP "$pid"
    printf 'Done\n'
  else
    printf 'No process found\n'
    retval=1
  fi
}


# check permission
if [ -d "$basedir" ] && ! touch "$basedir/$$" >/dev/null 2>&1
then
  printf 'Permission denied\n'
  exit 1
fi
rm -f "$basedir/$$"


# dispatch the command
case "$1" in
start)
  start
  ;;
stop)
  stop
  ;;
restart)
  stop
  start
  ;;
hup)
  hup
  ;;
*)
  printf 'Usage: %s {start|stop|restart|hup}\n' "$prog"
  exit 1
  ;;
esac


# exit
exit "$retval"



# END OF FILE

Tokyo Tyrant 起動スクリプト マスタ

#! /bin/sh
# chkconfig: 345 65 55
# description: Startup script for the server of Tokyo Tyrant For Session
# processname: tokyotyrant

#----------------------------------------------------------------
# Startup script for the server of Tokyo Tyrant
#----------------------------------------------------------------


# configuration variables
prog="ttservctl"
cmd="ttserver"
basedir="/home/ttserver/data"
port="1978"
pidfile="$basedir/ttserver.pid"
logfile="$basedir/ttserver.log"
ulogdir="$basedir/ulog"
ulimsiz="256m"
sid=1
mhost="remotehost2"
mport="1978"
rtsfile="$basedir/ttserver.rts"
dbname="$basedir/session.tct#bnum=1000000#idx=x:dec#dfunit=8"
ext="/home/ttserver/ext/ttexpire.lua"
extpc="expire 1"
maxcon="65535"
retval=0


# setting environment variables
LANG=C
LC_ALL=C
PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/tokyotyrant/bin"
export LANG LC_ALL PATH


# start the server
start(){
  printf 'Starting the server of Tokyo Tyrant\n'
  mkdir -p "$basedir"
  if [ -z "$basedir" ] || [ -z "$port" ] || [ -z "$pidfile" ] || [ -z "$dbname" ] ; then
    printf 'Invalid configuration\n'
    retval=1
  elif ! [ -d "$basedir" ] ; then
    printf 'No such directory: %s\n' "$basedir"
    retval=1
  elif [ -f "$pidfile" ] ; then
    pid=`cat "$pidfile"`
    printf 'Existing process: %d\n' "$pid"
    retval=1
  else
    if [ -n "$maxcon" ] ; then
      ulimit -n "$maxcon" >/dev/null 2>&1
    fi
    cmd="$cmd -port $port -dmn -pid $pidfile"
    if [ -n "$logfile" ] ; then
      cmd="$cmd -log $logfile"
    fi
    if [ -n "$ulogdir" ] ; then
      mkdir -p "$ulogdir"
      cmd="$cmd -ulog $ulogdir"
    fi
    if [ -n "$ulimsiz" ] ; then
      cmd="$cmd -ulim $ulimsiz"
    fi
    if [ -n "$sid" ] ; then
      cmd="$cmd -sid $sid"
    fi
    if [ -n "$mhost" ] ; then
      cmd="$cmd -mhost $mhost"
    fi
    if [ -n "$mport" ] ; then
      cmd="$cmd -mport $mport"
    fi
    if [ -n "$rtsfile" ] ; then
      cmd="$cmd -rts $rtsfile"
    fi
    if [ -n "$ext" ] ; then
      cmd="$cmd -ext $ext"
    fi
    if [ -n "$extpc" ] ; then
      cmd="$cmd -extpc $extpc"
    fi
    printf "Executing: %s\n" "$cmd"
    cmd="$cmd $dbname"
    $cmd
    if [ "$?" -eq 0 ] ; then
      printf 'Done\n'
    else
      printf 'The server could not started\n'
      retval=1
    fi
  fi
}


# stop the server
stop(){
  printf 'Stopping the server of Tokyo Tyrant\n'
  if [ -f "$pidfile" ] ; then
    pid=`cat "$pidfile"`
    printf "Sending the terminal signal to the process: %s\n" "$pid"
    kill -TERM "$pid"
    c=0
    while true ; do
      sleep 0.1
      if [ -f "$pidfile" ] ; then
        c=`expr $c + 1`
        if [ "$c" -ge 100 ] ; then
          printf 'Hanging process: %d\n' "$pid"
          retval=1
          break
        fi
      else
        printf 'Done\n'
        break
      fi
    done
  else
    printf 'No process found\n'
    retval=1
  fi
}


# send HUP to the server for log rotation
hup(){
  printf 'Sending HUP signal to the server of Tokyo Tyrant\n'
  if [ -f "$pidfile" ] ; then
    pid=`cat "$pidfile"`
    printf "Sending the hangup signal to the process: %s\n" "$pid"
    kill -HUP "$pid"
    printf 'Done\n'
  else
    printf 'No process found\n'
    retval=1
  fi
}


# check permission
if [ -d "$basedir" ] && ! touch "$basedir/$$" >/dev/null 2>&1
then
  printf 'Permission denied\n'
  exit 1
fi
rm -f "$basedir/$$"


# dispatch the command
case "$1" in
start)
  start
  ;;
stop)
  stop
  ;;
restart)
  stop
  start
  ;;
hup)
  hup
  ;;
*)
  printf 'Usage: %s {start|stop|restart|hup}\n' "$prog"
  exit 1
  ;;
esac


# exit
exit "$retval"



# END OF FILE

Tokyo Tyrant インストール

ソースコード取得。
# cd /usr/local/src
# wget http://1978th.net/tokyocabinet/tokyocabinet-1.4.9.tar.gz
# wget http://1978th.net/tokyotyrant/tokyotyrant-1.1.40.tar.gz
TokyoCabinetインストール。
# tar zxvf ./tokyocabinet-1.4.9.tar.gz
# cd tokyocabinet-1.4.9
# ./configure
# make
# make install
TokyoTyrantインストール。
# tar zxvf tokyotyrant-1.1.40.tar.gz
# cd tokyotyrant-1.1.40
# ./configure
# make
# make install
Tokyo Tyrantの起動スクリプトに以下を追加。
# vi /usr/local/tokyotyrant/sbin/ttservctl

# chkconfig: 345 65 55
# description: Startup script for the server of Tokyo Tyrant
# processname: tokyotyrant
/etc/init.dにリンクを作ってchkconfigに登録&確認。
# ln -s /usr/local/tokyotyrant/sbin/ttservctl /etc/init.d/
# chkconfig --add ttservctl
# chkconfig --list ttservctl
ttservctl       0:off   1:off   2:off   3:on    4:on    5:on    6:off

logrotateに登録。
/home/ttserver/data/ttserver.logにTokyo Tyrantのログが書き出されますが、放置しておくと肥大化します。
そのため、ログをローテーションする仕組みに任せてます。
Tokyo Tyrantの起動停止スクリプトがHUPをフォローしてくれているので、これだけでOK。
ここまでやっておけば、永続化機能のついた、OSごと再起動が掛かっても勝手に復活するようになります。
# vi /etc/logrotate.d/tokyotyrant
  
/home/ttserver/data/ttserver.log {
    monthly
    missingok
    rotate 12
    compress
    ifempty
    create
    sharedscripts
    postrotate
        /sbin/service ttservctl hup > /dev/null 2>/dev/null || true
    endscript
}
参考サイト

2011-01-11

経営はロマンだ! 私の履歴書・小倉昌男 (日経ビジネス人文庫)

経営はロマンだ! 私の履歴書・小倉昌男 (日経ビジネス人文庫) 引用:Amazon

「クロネコヤマトの宅急便」を生み出して日本人の生活スタイルを変え、ヤマト運輸をトップ企業に育て上げた小倉昌男。経営から退いた現在は、私財を投じて障害者福祉に情熱を燃やす。「官僚と闘う男」の異名をとった硬骨の経営者が、その生きざまと哲学を語る。

2011-01-10

小倉昌男 経営学

小倉昌男 経営学 引用:Amazon

「儲からない」といわれた個人宅配の市場を切り開き、「宅急便」によって人々の生活の常識を変えた男、小倉昌男。本書は、ヤマト運輸の元社長である小倉が書き下ろした、経営のケーススタディーである。

全体を通して読み取れるのは、「学習する経営者」小倉の謙虚さと、そこからは想像もできないほど強い決断力である。成功した人物にありがちな自慢話ではない。何から発想のヒントを得たか、誰からもらったアイデアか、などがこと細かに記されている。講演会やセミナー、書籍、マンハッタンで見た光景、海外の業者に聞いた話、クロネコマークの由来…。豊富なエピソードから伝わってくるのは、まさに学習し続ける男の偉大さである。

一方で、並々ならぬ決断力を持っていたのだと思わせる記述がいくつかある。宅急便に注力するため、大口の取引先であった松下電器との長期にわたる取引関係を終結させたこと、三越岡田社長のやり方に反発し、「とてもパートナーとして一緒に仕事をしていくことはできなかった」として取引関係を解消したこと、運輸省を相手に訴訟を起こしたこと…。いずれも確固たる論理がその根底にあった。それにしても見事な決断力と言わざるを得ない。

終わりの部分で紹介されている宅急便の各種サービス内容や、有名なNEKOシステムなどの話は、流通・物流の関係者以外には興味がわかないかもしれないが、全体的に読みやすく、興味深いエピソードが満載なので、読んでいて飽きることがない。経営者としての小倉の人となりが伝わる、好感の持てる1冊である。(土井英司)

2011-01-09

福祉を変える経営~障害者の月給1万円からの脱出

福祉を変える経営~障害者の月給1万円からの脱出 引用:Amazon

ヤマト運輸の経営者として、かつて宅急便で物流業界に革命を起こした人物が、福祉の世界を変えようとしている。著者は、障害者が健常者と同じ立場で暮らせるというノーマライゼーションを実現するためには、障害者がきちんと働いて稼ぐことが基本だと考える。しかし、障害者の就労施設である民間の共同作業所で働く人々の月給は1万円にも満たず、障害者が自立することはほとんど不可能である。そしてこの現実を変えるには、共同作業所の経営改革を行う必要があると指摘する。

本書の大部分は、ヤマト福祉財団が共同作業所の運営者を対象に行っている「経営セミナー」の講義内容に沿ったもので、「経済とは何か」「経営とは何か」と題し、市場経済の仕組みの中で、どのように利益を得ていくかという具体的な経営ノウハウが盛り込まれている。さらに、実際に障害者に対し月給10万円以上を支払い、フランチャイズを拡大しているスワンベーカリーなどの事例も紹介されている。

本書を読み進めると、著者の福祉に対する考え方や取り組み姿勢には、宅急便に対するそれとの共通点が多いことに気づく。たとえば、働く人のやる気を引き出すことが健常者や障害者を問わず何よりも重要なことと考えているし、国や地方公共団体を頼りにしすぎることもない。もしヤマト運輸と同様にさまざまな企業が経営の知恵を出し合えば、社会全体のノーマライゼーションの実現に一歩近づくことができるのではないだろうか。福祉にとどまらず、企業のあり方についても考えさせられる 1冊である。(戸田圭司)