2011年6月30日木曜日

sedコマンドを使う

シェルを使って、sqlファイルのある行を削除することをしました。

具体的に何がしたかったのか、というと
$ cat hogehoge.sql

@@atypes_2.1.0-2.2.0.sql                      
@@atypes_2.2.0-2.3.0.sql
@@atypes_2.3.0-2.4.0.sql
@@atypes_2.4.0-2.5.0.sql
@@atypes_2.5.0-2.6.0.sql
@@atypes_2.6.0-3.0.0.sql
@@atypes_3.0.0-3.0.1.sql
EXIT


上のデータを持つhogehoge.sqlに、2.4.5の引数を与えると、繰り下げをした値より小さい値(ex. 2.3.8)が含まれているデータの行を削除して、下記の出力をするシェルを書く必要がありました。

$ cat hogehoge.sql

@@atypes_2.4.0-2.5.0.sql                    
@@atypes_2.5.0-2.6.0.sql
@@atypes_2.6.0-3.0.0.sql
@@atypes_3.0.0-3.0.1.sql
EXIT

これは、awkとsedを使って実現することができます。
そのときのコードです。( \ はエスケープを表しています。Windows系だと、¥に相当することに注意しください)



sql_edit.sh
P_VER=$1

P_NUM=`echo ${P_VER} | sed -e 's/\(.\)\.\(.\)\.\(.\)/\1\2\3/'`

while :
do
ATYPES=`awk 'NR==1' /Users/Taichi/perl_data/sh_sample/hogehoge.sql`                  
ATYPES_NUM=`echo ${ATYPES} | sed -e 's/@@atypes_.\..\..-\(.\).\(.\)\.\(.\)\.sql/\1\2\3/' `                          
if [ ${P_NUM} -lt ${ATYPES_NUM} ];then
        break
fi
sed -i -e '1d' /Users/Taichi/perl_data/sh_sample/hogehoge.sql
done


実行してみます。
$ ./sql_edit.sh 2.5.1
$ cat hogehoge.sql

@@atypes_2.5.0-2.6.0.sql                          
@@atypes_2.6.0-3.0.0.sql
@@atypes_3.0.0-3.0.1.sql
EXIT


■解説
1.
P_NUM=`echo ${P_VER} | sed -e 's/\(.\)\.\(.\)\.\(.\)/\1\2\3/'`
引数として与えた "2.5.1" からコロンを抜いて "251" を P_NUMに与えています。

sedで、特定の文字列を抜き出すことができます。
echo '置換したい文字' | 'sed -e 's/置換条件/置換文字/'
置換条件で、"\(" と "\)" でくくられた文字列が置き換え文字として、順番に \1, \2, ... に代入されます

参考)http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231161/


2. while の中で if条件を使う
while [ 条件 ]
do
if [ 条件 ];then
        break
fi
done

上記のように、指定します。
実際のコードでwhileの隣にある “:” は常に真になるため、breakを指定しなければ無限ループするので気をつけましょう。

参考)http://shellscript.sunone.me/while.html


3. ATYPES=`awk 'NR==1' /Users/Taichi/perl_data/sh_sample/hogehoge.sql`
hogehoge.sqlの1行目のデータを抽出して、ATYPESに渡しています。

# ファイルのある行のデータを抜き取る
awk ‘NR== (行目) ’ ファイル名

参考)http://uguisu.skr.jp/Windows/awk.html


4. 条件分岐
if [ ${P_NUM} -lt ${ATYPES_NUM} ];then
        break
fi

比較の演算子がなかなか覚えられない・・・
-lt (より小さい)
-le (以下)
-eq (等しい)
-gt (より大きい)
-ge (以上)
-ne (等しくない)

参考)http://akitosblog.seesaa.net/article/186865411.html


5. sed -i -e '1d' /Users/Taichi/perl_data/sh_sample/hogehoge.sql
hogehoge.sqlの1行目を削除して、上書きしています。

# 単一行の削除
sed -i -e '行番号d' ファイル名

参考)http://shellscript.sunone.me/filter_sed.html

2011年6月29日水曜日

CGIを使う

CGI (Common Gateway Interface) とは、ApacheといったWebサーバが特定のプログラムを実行して、出力結果をユーザに返す、ものです。
CGIを利用することで、動的なコンテンツを作成することができます。
Perl・PHP・Rubyなどの言語がよく使われています。


■CGIを利用するための設定(Apache)
Apacheの設定ファイルの編集で、CGIを使えるようになります。

httpd.confに赤字の部分を追加しましょう。

# CGIプログラムを置くディレクトリ
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
# CGIの実行を許可
<Directory "/var/www/cgi-bin">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
# 拡張子 .cgi と .pl をCGIのファイルとする
AddHandler cgi-script .cgi .pl

これでCGIを使えるようになりました。

ホスト名:hoge.com
構成ディレクトリ:/var/www/cgi-bin/test.cgi
クライアント側からtest.cgi には、下記のURLでアクセスできます。
http://hoge.com/cgi-bin/test.cgi

*スクリプトをCGIとして実行するためには、CGIファイルにchmodコマンドで権限を与える必要があります。


■ユーザディレクトリでCGIを使う
/var/www/cgi-bin/ のデフォルトの所有者はrootユーザになります。
FTPやSSHでrootユーザでのログインが推奨されていないことを考えると、ユーザのホームディレクトリにCGIスクリプトを置いて、Webから実行できる仕組みにしておくと便利です。
Apacheの設定ファイルで実現できます。

① httpd.confに赤字を追加しましょう。
ScriptAliasMatch ^/~([a-zA-Z0-9_-]+)/cgi-bin/(.*) /home/$1/cgi-bin/$2
<Directory /home/*/cgi/>
Options +ExecCGI
</Directory>

② ディレクトリを作成します。
例) # mkdir /home/shindo_t/cgi-bin

③ディレクトリにアクセス権の設定をします。
例) # chmod 701 /home/shindo_t/cgi-bin

ホスト名:hoge.com
構成ディレクトリ:/home/shindo_t/cgi-bin/test.cgi
クライアント側からtest.cgiには、下記のURLでアクセスできます。
http://hoge.com/~shindo_t/cgi-bin/test.cgi

ユーザごとの公開ディレクトリを作りたい

前回、DocumentRoot以外のディレクトリを公開したい を紹介しましたが、別の方法で公開用ディレクトリを作成することもできます。
サーバを管理していく上で、ユーザの数が増えてきたとき、公開用ファイルが1つだけ、というのは現実的でありません。
各々ユーザに公開用ファイルを配置するディレクトリを用意します。

具体例
ホスト名:hoge.com
ユーザ:shindo_t

手順
① httpd.confの設定に赤字を追加します。
(ユーザshindo_t にだけ公開用ディレクトリを用意する場合)
UserDir disabled
UserDir enabled shindo_t
UserDir public_html

② ディレクトリを作成
[shindo_t@hoge ~]$ mkdir ~/public_html

③ 権限の設定
[shindo_t@hoge ~]$ chmod 701 ~/public_html

これで完成です。
shindo_t ホームディレクトリにある pubilc_html/test.html にアクセスしたいときは、下記のURLを入力します。
http://hoge.com/~shindo_t/test.html


*あるユーザ(yamada_t)だけ公開ディレクトリを禁止することもできます。
上記の手順①で、下記の設定とすれば良いです。
UserDir enabled
UserDir disabled yamada_t
UserDir public_html

*各々環境
Linuxでは、公開ファイルは、public_htmlがデフォルトであることが多いです。
Windowsでは、My Documents¥My Website がデフォルトであることが多いです。
Windowsだと、②の作業はExploreで新規フォルダ "My Website" を作成すればよいです。③は必要ないです。

2011年6月28日火曜日

『面白くて眠れなくなる数学』桜井進

題名に魅かれて買いました。
著者は、僕の通う大学の卒業生です。OBの著書を読むのは、なぜか緊張します。

PastedGraphic1-2011-06-28-22-31.jpg

内容は、数学の歴史・数学者・名言を引用して数学の面白いトピックを紹介する、といったものです。
文系のかたが抵抗なく読める内容です。
著者は、これをきっかけに数学に興味を持つ人が増えることを期待しているのでしょう。


“無理数”に関して、とても面白かったので紹介します。
今でこそ、πや√2 は割り切れない数(無理数)であることが知られています。
しかし、この無理数を理解することは、非常に困難でした。
円周率πが無理数であることが証明されたのは1761年になってからのことでした。

なぜか?
無理数は、受け入れがたい存在だったからです。

古代ギリシャの数学者ピタゴラスは、「万物の根源は数なり」と言いました。
この数は、自然数のことです。ピタゴラスの時代、自然数こそが計算できる数、「理性の象徴」というべき存在と捉えられていました。
そうでない数は「非理性的」とまで言われ排除されるべき存在だったのです。
(古代ギリシャで、√2 が無理数であることを証明したヒッパソスは、神の手により海で溺れて命を失ったという逸話も残っているほどです)

円周率πは、長い間、22/7 といった分数で表されていました。
(7月22日は、円周率の日と言われる所以です。)
今からおよそ400年前、小数点が発明されたことで、ようやく分数を超えて無理数への挑戦が始まり、円周率が無理数であることを発見するに至ったわけです。

ほとんど全ての実数が無理数であるにも関わらず、無理数が扱われるようになったのはつい最近である、というのは非常に興味深いことです。


最後に著書に書かれている、僕が気に入った名言でくくりたいと思います。
数学を知らない者には、本当の深い自然の美しさをとらえることはむずかしい(ファインマン)”

DocumentRoot以外のディレクトリを公開したい

DocumentRootの下にあるコンテンツを、Webサーバーは公開します。
DocumentRoot以下にHTMLファイルをおく

しかし、DocumentRoot以外のディレクトリを公開したい場合もあります。
そのための機能が、Aliasです。

例えば、linuxの場合、/var/www/html のディレクトリは所有者がrootユーザであることがほとんどです。
FTPやSSHを使ったファイル転送の場合、rootユーザが禁止されていることを考えれば、/home/ 以下のディレクトリを公開しておく方が都合の良いこともあります。

具体的に
DocumentRoot:/var/www/html/
公開したいディレクトリ:/home/shindo_t/html_file/

httpd.confのファイル内に下記の赤字を追加します。
Alias /hogehoge/ “/home/shindo_t/html_file/“

公開されるWebページのURLは下記の通りです。
http:// (ホスト名) /hogehoge/ (/home/shindo_t/html_file/ を省略した、それ以下の相対パス)


上記の設定をした場合
ホスト名:host.com
公開したいファイル:/home/shindo_t/html_file/huga.html

公開されるWebページのURLは、下記の通りです。
http://host.com/hogehoge/huga.html


パーミッションエラーと出たら、chmodコマンドで権限を与えましょう。

DocumentRoot以下にHTMLファイルをおく

Webページに使うHTMLファイルは、Webサーバの特定のディレクトリに置きます。
Webページのファイルを置くルートディレクトリの場所をDocumentRootと呼びます。
DocumentRootに置かれたファイルはWebページとして公開されます。

Apacheの基本設定で、DocumentRootを指定することができます。
例えば linuxで、/var/www/html をDocumentRootに指定する場合、

[root@lovemoe conf]# vi httpd.conf

httpd.confのファイル内に赤字の1行を指定します。
DocumentRoot "/var/www/html"

httpd.confの設定を反映させるため、Apacheを再起動します。
[root@lovemoe conf]# service httpd restart



具体的に例を挙げると、
ホスト名:hoge.com
ディレクトリ構成:
/var/www/html
                 |- index.html
                 |- html_file
                          |- hoge.html

DocumentRootは、/var/www/htmlで指定しているので、公開されるWebページのURLは下記になります。
http://hoge.com/index.html
http://hoge.com/html_file/hoge.html


公開されるWebページのURLは、下記の通りです。
http:// (ホスト名) / (DocumentRootを省略した、それ以下の相対パス)

2011年6月27日月曜日

LAN内で、DNSに登録したサーバにアクセスする

自宅の無線LANで、サーバを構築するとき、誰しもがつまづくところだと思います。

サーバをDNS登録したことだし、手元にあるPCから、そのサーバにホスト名でアクセスしてみるか。
あれ?おかしいな? IPアドレスだとアクセスできるのに、ホスト名でアクセスできない?
ルータの管理画面が開く・・・。

そんなときは、サーバーのIPアドレスとホスト名を対応づければ良いのです。

クライアントのhostsファイルで設定します。(サーバ側ではないです)
環境によってhostsファイルの場所は違いますが、下記を参考にしてみてください。
Linux・Unixでは、/etc/hosts
Windowsでは、c:¥WINDOWS¥System32¥drivers¥etc

アクセスするサーバの情報
サーバーのIPアドレス:192.168.11.4
サーバーのホスト名:hoge.co.jp

hostsファイル (赤字の1行を追加してください)
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.                                                
##
127.0.0.1 localhost
255.255.255.255 broadcasthost

192.168.11.4 hoge.co.jp

これで、手元にあるPC(クライアント)からサーバにホスト名でアクセスできます。

Cookieを利用して訪問数とユーザ名を取得

前回、Cookieを利用して訪問数を表示 で、訪問数のデータをCookieを利用して表示しました。
今回は、訪問数+ユーザ情報をCookieを利用して表示するページを作ってみました。

ここでのユーザ情報は、クライアント側で入力したユーザの名前とします。
Cookieを利用して、訪問数+ユーザ情報を表示

コードです。

<html>
<head>
<meta http-equiv="content-type" content="text/html;                         
                charset=UTF-8"
/>
<title>Cookie Test</title>
<script type="text/javascript">
<!--
function getCookie(key){
        var tmp1 = document.cookie + ";";
        var index1 = tmp1.indexOf(key, 0);
        if(tmp1 != -1){
                tmp1 = tmp1.substring(index1, tmp1.length);
                var index2 = tmp1.indexOf("=", 0) + 1;
                var index3 = tmp1.indexOf(";", index2);
                return unescape(tmp1.substring(index2, index3));
        }
        return ("");
}

function setCookie(key, val){
        var tmp1 = key + "=" + escape(val) + "; ";
        document.cookie = tmp1;
}

var access1 = getCookie("Access");
if(access1 == ""){
        access1 = 0;
}

document.write("<h2>訪問回数</h2>");

var name = getCookie("Name");
if(name == ""){
        inputName();
}

setCookie("Access", ++access1);
setCookie("Name", name);

document.write(name + "さん、" + access1 + " 回目の訪問です");

function inputName(){
        name = prompt("名前を入力してください", "user");
        if(name == null){
                inputName()
        }
}

//-->
</script>
</head>
</html>


前回の Cookieを利用して訪問数を表示 を利用して複数のデータが持てるように書き換えただけです。

2011年6月25日土曜日

『タクシードライバー』マーティン・スコセッシ 監督

1976年公開のアメリカ映画。
主演はロバート・デ・ニーロ。第26回カンヌ国際映画祭パルム・ドール受賞作品。

PastedGraphic-2011-06-25-23-08.jpg


■あらすじ
ベトナム戦争から帰国した元海兵隊員のトラヴィス(ロバート・デ・ニーロ)は、仕事を探し、タクシードライバーに就職。何となく働く彼の心の中で、社会に対する怒りやいらだちが募ってきていた。

そんなある日、次期大統領候補者バランタインの選挙事務所で働く女性ベッツィーに一目惚れ。
しかし、事が上手く運ばず、ベッツィに嫌われることになる。
さらに追い打ちをかけるかのように、幼い売春婦アイリスの不満を耳にすることになる。

そして、トラヴィスは決心する。

まず、次期大統領候補者バランタインの射殺を試みたものの失敗に終わる。
その夜、幼い売春婦アイリスをかこうスポーツを射殺。アイリスの客も立て続けに射殺。

本来ならば、狂気の殺人者として扱われるはずが、アイリスを売春婦から救ったとして英雄扱いされ、この映画は幕を閉じる。


■気になったこと
*ベトナムから帰国した兵士は、英雄扱いされるどころか、社会復帰すらできない?
『タクシードライバー』のシーンの一つに、ベトナム帰還兵トラヴィスが、職業斡旋所で職を探している場面があります。
職業斡旋所で職を探さなければならないほど、アメリカは不景気だったのでしょうか。
背景として、ベトナム戦争帰還兵が祖国で冷たく扱われていた、ということがあります。

ベトナム戦争は、アメリカ社会を大きく変えてしまったことを念頭に置いておかなければなりません。
ベトナム戦争は、戦場の映像がテレビを通して伝えられた戦争でもありました。
報道の自由を重視するアメリカ軍は、報道陣の同行を許可し、あらゆる便宜をはかっています。
その結果、アメリカ軍の残虐な行為、アメリカ軍の若者の死体も全てがテレビに映し出されることになりました。
これが、アメリカ国民にベトナム戦争への懐疑心をかきたてることになったのです。
(後に、アメリカ軍は戦場をメディアに報道されないように規制しています)

帰還兵が冷たく扱われた原因はそこにあります。
アメリカ兵の残虐な行為を、テレビを通じてアメリカ国民に伝えられました。
ベトナム帰りというだけで、「お前もベトナムで残虐行為をしていたんだろ」と疑われ、再就職が困難だった若者が数多くいます。

ベトナム戦争は、アメリカ社会に後遺症をもたらしたのです。



*どうして殺人を犯したトラヴィスが英雄として扱われたの?
ここに、陪審と報道における問題が出てきています。
報道による陪審の影響をいかに防ぐか、という問題です。

イギリスでは、評決が下されるまでの間、事件に関する報道を厳しく制限しています。
陪審員に偏見が与えられと、公正な審理が妨げられるからです。

これに対してアメリカでは、報道の自由の観点から、報道を制限することは限られた場合でしか認められていません。
(報道による偏見を防ぐために、弁護士や検察官のマスメディアに対する発言を制限している)

結局のところ、大多数の意見が、人を犯罪者にも英雄にもするのです。
『タクシードライバー』では、売春婦アイリスが家出をしていること、まだ12歳であること、アイリスの親がトラヴィスに感謝の手紙を送ったこと、をメディアが取り上げ、トラヴィスは売春婦から立ち直らせた英雄として扱われました。
大衆の意見が陪審に影響して、トラヴィスは無罪釈放。

もし、大統領立候補者の射殺が成立したとすると、間違いなく犯罪者として世間から白い目で見られることになります。
もし、アイリスに両親がいなくて、ということであれば、3人を射殺した狂気と化した殺人者として扱われることでしょう。



■感想
一度は離れていったベッツィーが英雄となったトラヴィスに近寄るラストシーンで、ミラー越しのトラヴィスのするどい視線は何を意味しているのか、が僕は気になっています。
『タクシードライバー』が何を表現したかったのか、を探るにはあの視線に答えがあるような気がします。

社会に対して、自分の存在を主張したいがゆえ、殺人に走ったのか。
社会に対する苛立ちを解消すべく、その苛立ちの原因となる人を消したかっただけなのか。

静かに淡々と進められていく映画だからこそ、一つ一つのシーンに意味があるような気がして、それが印象に残った映画でした。

2011年6月23日木曜日

Cookieを利用して訪問数を表示

Cookieは、Cookieとは で説明したとおり、WebページにアクセスしたユーザのPCに、個別データを一定期間書き込む仕組みです。

Cookieの機能を使用して、訪問数を表示してみました。
JavaScript + Cookie で訪問数を表示


<html>
<head>
<meta http-equiv="content-type" content="text/html;                                            
                charset=UTF-8"
/>
<title>Cookie Test</title>

<script type="text/javascript">
<!--
str = "count_now";

function getCookie(){
        var tmp = document.cookie;
        var index1 = tmp.indexOf("=", 0) + 1;
        var count = unescape(tmp.substring(index1));
     
        if(count == ""){
                count = 1;
        }
        return count;     
}

function setCookie(val){
        document.cookie = str + "=" + escape(++val);
}

var access = getCookie();
setCookie(access);

document.write("<h2>訪問回数</h2>");
document.write(access + " 回目の訪問です ");
//-->
</script>
</head>
</body>
</html>



■Cookieの読み込み
function getCookie(){
        var tmp = document.cookie;
        var index1 = tmp.indexOf("=", 0) + 1;
        var count = unescape(tmp.substring(index1));
     
        if(count == ""){
                count = 1;
        }
        return count;     
}

JavaScriptを使ってCookieの値を読み込むには、document.cookie を使います。
上の処理は、書き込まれたCookieに対して、訪問数(count)の値だけ抜きとって返す、ことをやっています。

■Cookieの書き込み
function setCookie(val){
        document.cookie = str + "=" + escape(++val);
}

Cookieを書き込むには、下記の書式で行います。
document.cookie = “name = 値; expire=値; domain=値; path=値; secure”;


■気になった事(時間があるときに調べる)

*ローカルでのテストで、FireFoxとChromeの動きが違っていました。
FireFoxだと、Web上にアップロードしていなくてもCookieの値の書き込みができていました。
Chromeだと、その状態では、Cookieの値が1から増えませんでした。
書き込みがうまくいっていないみたいでした。

htmlファイルをWeb上にアップロードすると、どちらも正しい動きをしています。
設定の問題?


*訪問数(count)の数を抜き出す作業にeval()関数を使ってたのですが、Chromeだとものすごく重かったです。
調べてみると、eval()関数の危険性についてのサイトが結構ありました。
http://www.atmarkit.co.jp/fcoding/articles/webapp/05/webapp05b.html
http://d.hatena.ne.jp/snaka72/20090617/1245247514