メイン

UNIX/Linux アーカイブ

2007年12月23日

UNIXの哲学

UNIX創始者の一人でパイプ発案者でもある
Doug McIlroyによるUNIX哲学

1.1つのプログラムが、1つの役割に専念する。

2.複数のプログラムは協調して働く。

3.プログラムは汎用的インターフェイスである標準入出力を扱う。

X Window System設計チームの一員だったMike GancarzによるUNIX哲学

1. Small is beautiful.
(小さいものは美しい)

処理単位が小さいことは、理解しやすいだけでなく、バグを出しにくくする。
あれもこれも詰め込んだ関数などは便利に再利用できることが少ない。
小さいものの集まりであれば、融通も利くが、
大きいものは特定の場合にだけ便利で、それ以外に利用価値がない。

2. Make each program do one thing well.
(1つのプログラムは単純な1つの機能を行う)

関数やプログラムが何をするのか、簡潔に説明できるようにすること。
ビギナーほど、あれやこれや詰め込みたくなるが、本当にそこでやるべきなのか考えてみよう。

3. Build a prototype as soon as possible.
(なるべく早くプロトタイプを作成せよ)

とにかく動くレベルで検証しておくこと。口よりも先に手を動かせ。

4. Choose portability over efficiency.
(効率よりも移植性を重視せよ)

特定の環境でしか動かなくするようなことを避ける。
UNIX, Linux, Windowsそれぞれで同一のソースが動くことが望ましい。

5. Store data in flat text files.
(データは単純なテキストファイルに格納せよ)

アプリ依存のデータは作らないほうがよい。
プレーンなテキストであれば、多くのツールをつかって自由自在に加工が可能である。

6. Use software leverage to your advantage.
(ソフトウエアを自らを助く手段として利用せよ)

自分を助けるためのソフトウエアをどんどん利用すべきである。
プログラムが書ける人の中には、便利なプログラムをうまく利用していない人が多い。
特定な環境に依存する技術者になるな。
WindowsだろうがLinuxだろうがUNIXだろうが、どこの環境でも便利なものはどんどんつかえ。

7. Use shell scripts to increase leverage and portability.
(シェルスクリプトを利用し自らを助け、移植性を高めよ)

シェルsh,bash,sed,awk,perlなど適材適所で利用せよ。
組み合わせて、とにかく書いて動かしてみよう。

8. Avoid captive user interfaces.
(ユーザ・インターフェースを1つに強制するな)

固定観念を捨てよ。

9. Make every program a filter.
(全てのプログラムはフィルタとして振る舞え)

入力がファイルである必要はない。標準入力でよい。
出力がファイルである必要はない。標準出力でよい。
こうしておけば、入出力を切り替えることができる。
パイプとリダイレクトで、つなげていこう。

2007年12月24日

UNIXタイム

UNIXタイムとは、1970年1月1日0時0分0秒からの秒数で保持する日時の形式です。
この値を、年月日時分秒に戻すには、date関数を使います。

2007年12月26日

Zorgフォト一覧からMTエントリの登録(総集編)

Zorgのzorg.photos.getPhotosは、指定した番号のフォトから50枚の情報を返す。
したがって、4000枚だから80回GETする必要がある。
これをWEBアプリとして動かすのは、危険なので、以下のような仕組みにした。


■get_zorg.php
引数で開始番号を与え、zorg.photos.getPhotosでその開始番号から50件のみ取得し、
1件1行で出力。
フォーマットは、フォトID,タイトル,ViewサイズのURL,投稿日時,撮影日時
カンマ区切りで出力

■ex.sh
get_zorg.phpを起動して、結果をファイルmy_photo.txtへリダイレクト
ループで、4000になるまで、+50づつ。

データ行以外に、HTMLタグが出力してしまっているので
それを取り除く。幸い先頭がフォトIDで、iから始まっているので、iではじまらない行は除外。

% grep ^i my_photo.txt > my_photo_result.txt

これでフォト一覧ファイルができあがり。
このファイルをよみながら、XML_RPCでMovable Typeへ書き込みを行うプログラムを作成した。

ファイルから読み込んだ内容をMovable TypeへXML_RPCで書き登録するPHP

今回、行った問題点を整理しておく。


最初のミステイクは、
$client = new XML_RPC_client( $path, $host, 80 );

$client = new XML_RPC_client( $host, $path, 80 );
としちまった。ホスト、パスという順番だろうという思い込み。
メソッド定義をよみましょう。

XML_RPC_Messagenのメソッドで、記事を投稿するメソッドには、
blogger.newPost
metaWeblog.newPost
の2つがあり、最初blogger.newPostを試した。
こちらはすんなりと成功した。
それもそのはず、引数すくない。
まず、タイトルがない。というか本文の先頭10文字が勝手にタイトルになる。
なんじゃ、この仕様は?記事本文しか登録できない。

で、次にmetaWeblog.newPost
こちらは、ほぼすべての項目の登録が可能。
しかし、嵌った。

投稿日時がまずかった。
//"dateCreated" => new XML_RPC_Value('2007-12-25', "ISO.8601")
これでいけると疑わず、最後までほかをチェックしていたら
'dateCreated'=> new XML_RPC_Value(date("Ymd\TH:i:s",time()), 'dateTime.iso8601')
正しくは、こちらであった。

2007年12月30日

C言語でMySQLを操作する

MySQLを利用する場合、WEBのシステム構築となると
フロントエンドがPHPやrubyといったスクリプトで記述することが多いと思います。

今日は、C言語からMySQLを操作するAPIを利用してみたいと思います。
私の環境はFedora7で、すでにmysqlのC APIがインストール済みなので
ヘッダファイルとライブラリファイルが以下のようにそろっています。

[root@fedora7 c]# ls /usr/include/mysql/
chardefs.h   my_config_i386.h  my_semaphore.h   mysqld_error.h  sslopt-case.h
errmsg.h     my_dbug.h         my_sys.h         raid.h          sslopt-longopts.h
history.h    my_dir.h          my_xml.h         readline.h      sslopt-vars.h
keycache.h   my_getopt.h       mysql.h          rlmbutil.h      tilde.h
keymaps.h    my_global.h       mysql_com.h      rlprivate.h     typelib.h
m_ctype.h    my_list.h         mysql_embed.h    rlshell.h       xmalloc.h
m_string.h   my_net.h          mysql_time.h     rltypedefs.h
my_alloc.h   my_no_pthread.h   mysql_version.h  sql_common.h
my_config.h  my_pthread.h      mysqld_ername.h  sql_state.h
[root@fedora7 c]# ls /usr/lib/mysql/
libdbug.a         libmysqlclient.so         libmysqlclient_r.so.15      mysql_config
libheap.a         libmysqlclient.so.15      libmysqlclient_r.so.15.0.0  mysqlbug
libmyisam.a       libmysqlclient.so.15.0.0  libmystrings.a
libmyisammrg.a    libmysqlclient_r.a        libmysys.a
libmysqlclient.a  libmysqlclient_r.so       libvio.a

試しに、次の駅テーブルの中身を表示させてみます。

mysql> describe M_STATION;
+-------------------+--------------+------+-----+---------+-------+
| Field             | Type         | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+-------+
| CODE              | char(7)      | NO   |     |         |       |
| RAIL_NAME         | varchar(255) | NO   |     |         |       |
| STATION_NUMBER    | int(11)      | NO   |     |         |       |
| STATION_NAME      | varchar(255) | NO   |     |         |       |
| TODOFUKEN         | varchar(20)  | NO   |     |         |       |
| STATION_NAME_KANA | varchar(255) | NO   |     |         |       |
| LAT               | double       | YES  |     | 0       |       |
| LNG               | double       | YES  |     | 0       |       |
| LAT_DMS           | varchar(30)  | YES  |     |         |       |
| LNG_DMS           | varchar(30)  | YES  |     |         |       |
+-------------------+--------------+------+-----+---------+-------+
10 rows in set (0.00 sec)

[root@fedora7 c]# gcc mysql_test.c -lmysqlclient  -lnsl -lm -lz -L/usr/lib/mysql
[root@fedora7 c]# ./a.out
[JR]函館本線(函館~長万部) 函館                         41.773746 140.726399
[JR]函館本線(函館~長万部) 五稜郭                      41.803418 140.733884
[JR]函館本線(函館~長万部) 桔梗                         41.846735 140.723046
[JR]函館本線(函館~長万部) 大中山                      41.864738 140.713482
[JR]函館本線(函館~長万部) 七飯                         41.887012 140.68855
[JR]函館本線(函館~長万部) 渡島大野                   41.905045 140.647628
[JR]函館本線(函館~長万部) 仁山                         41.930014 140.63522
[JR]函館本線(函館~長万部) 大沼                         41.971954 140.669347
[JR]函館本線(函館~長万部) 大沼公園                   41.98103 140.669888
[JR]函館本線(函館~長万部) 赤井川                      42.003267 140.642678
[JR]函館本線(函館~長万部) 駒ヶ岳                      42.038781 140.610537
[JR]函館本線(函館~長万部) 東山                         42.061728 140.605261
[JR]函館本線(函館~長万部) 姫川                         42.081301 140.591677
[JR]函館本線(函館~長万部) 池田園                      41.990661 140.700333
[JR]函館本線(函館~長万部) 流山温泉                   42.003474 140.716494
[JR]函館本線(函館~長万部) 銚子口                      42.015518 140.720673
[JR]函館本線(函館~長万部) 鹿部                         42.06439 140.771393
[JR]函館本線(函館~長万部) 渡島沼尻                   42.107041 140.747609
[JR]函館本線(函館~長万部) 渡島砂原                   42.121645 140.68954
[JR]函館本線(函館~長万部) 掛澗                         42.119211 140.646094
[JR]函館本線(函館~長万部) 尾白内                      42.111221 140.613465
[JR]函館本線(函館~長万部) 東森                         42.106845 140.593564
[JR]函館本線(函館~長万部) 森                            42.108897 140.573985
[JR]函館本線(函館~長万部) 桂川                         42.11559 140.542794
[JR]函館本線(函館~長万部) 石谷                         42.13553 140.506553
[JR]函館本線(函館~長万部) 本石倉                      42.159668 140.471957
[JR]函館本線(函館~長万部) 石倉                         42.172839 140.458461
[JR]函館本線(函館~長万部) 落部                         42.187544 140.420886
[JR]函館本線(函館~長万部) 野田生                      42.217104 140.37586
[JR]函館本線(函館~長万部) 山越                         42.231172 140.326593
[root@fedora7 c]#

続きを読む "C言語でMySQLを操作する" »

2008年01月13日

vi V.S. emacs

UNIX上でのエディタといえばviとemacsがあり
設定ファイルやデータなどの編集にはvi
プログラムの作成にはemacsを利用している。

昔から、vi派、emacs派がいて、両者の不毛な討論は耐えなかったのだが
わたしから言わせれば、適材適所で両方使えるようにしておけ。だ。

viを使い倒そう

GNU Emacs Manual

2008年02月12日

UNIXを学んでいれば大抵次の項目について学ぶであろう。
そして、そられを通してC言語との関わりを知ることになる。

ログイン、シェル、ファイルとディレクトリ、標準入出力、
プログラムとプロセス、C言語、システムコールとライブラリ関数


Cで書いたプログラムはmain関数から処理がはじまる。
main関数は誰が起動しているのか?
それはスタートアップルーチンという
リンク時に結合される処理がmain関数をコールする。
その際に、プログラム起動時のパラメータと環境変数を引数で
渡すのである。

About UNIX/Linux

ブログ「iPLUSONE Blog」のカテゴリ「UNIX/Linux」に投稿されたすべてのエントリーのアーカイブのページです。過去のものから新しいものへ順番に並んでいます。

前のカテゴリはThe Rolling Stonesです。

次のカテゴリはWEBです。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.34