ホリデープログラミング入門

ホリデーにプログラミングを楽しむための入門 by 船木信宏

Linux

[ リスト | 詳細 ]

記事検索
検索

全2ページ

[1] [2]

[ 次のページ ]


zuzara.org のサーバを停止してから無料のホスティングサーバを探していました。サービスを提供する場合は月数百円でも払って安心できる企業が提供しているサーバを使うべきでしょう。今回はソースコードを置いたりサンプルアプリを動かす程度なので無料のものにしてみました。

で、こちらがよさげ。
表示は英語ですが特に難しいことはないです。
Free Web Hosting with PHP, MySQL and cPanel

PHP5.2.6が使え、その他の機能も申し分ないです。.htaccessも使えます。
ちょっと変わったところとして、デフォルトではPHPのエラーメッセージを出すと http://www.000webhost.com/ へのリンクが出ます。あと suhosin も入っています。

FTPの接続は若干不安定な感じがします。

しかし本当に無料なのか、疑ってしまいました。FAQになぜ無料なの?という質問が載っていますが、、どうでしょう。

サーバが変わると、ファイルへのパスであったり様々な環境の違いがあるので動作確認をいちいちしていかないとなりません。

そういった変化に対応しやすいコーディングをしておく、というのも腕の見せ所ではあります。

例えばパスはすべて変数にしてハードコーディングしない、とか。基本ですが
$fp = fopen('../../logs/hoge.txt', 'r');
$buf = file_get_contents('/home/funaki/logs/fuga.txt');
と相対パスや絶対パスを不必要に混ぜて使っていたりするとパスが変わったとき面倒なことになりします。

define('LOG_DIR', '/home/funaki/logs');
define('LOG_HOGE_TXT, LOG_DIR . '/hoge.txt');
define('LOG_FUGA_TXT, LOG_DIR . '/fuga.txt');
といった具合にソースの先頭にまとめておけば修正もしやすいものです。

さて地道に移行を進めていきたいと思います。

開く コメント(0)


前々から自分は、会社の名前を全然知らないなぁ、と思っていました。上場企業にどんな会社があるのかもよくわかっていません。というわけで上場企業のデータを集めて、多少なりとも勉強してみることにしました。

まずはデータ収集。「上場企業」で検索しただけでも一覧を掲載しているらしきページが複数見つかりました。その辺をスクレイピングしてしまうのも手ですが、ごく一般に流布されたデータとはいえ無断で拝借するのは気が引けます。比較的二次利用しやすいWikipediaには


というテンプレートが用意されており、会社情報はこれで詳細に取れそうです。

さて、Wikipediaは全データをXML形式でダウンロードすることができます。
Wikipedia:データベースダウンロード - Wikipedia

不要なデータも多いし、解凍すると数GBになりそうで扱いづらいのですがそこは我慢。

ダウンロード


以下作業はLinux上のコマンドライン。
のんびり待ちます。意外とTorrentでの配布やミラーはないんですね。
クライアントマシンにダウンロードしてそこで作業でもよいですが、僕はサーバとして常時動いているLinuxマシンで。(クライアントマシンはモニタやらマウスをつないで使うPC、サーバはモニタを接続しないで使うPC、という程度の意味です)

こういった巨大ファイルをがりがり処理するのにロリポップをはじめとした共有サーバでは無理です。一度処理した後は静的なHTMLにして公開すればよいので、開発マシンと公開サーバを分けることで対処します。

開発マシンとしては、2万円切っているDellマシンがいいです。24時間稼動させるなら寝室に置くのはやめた方がいいですが、割と静か。僕もSC430や440を使っています。
PowerEdge SC440

OSはCentOSが適当かと思います。

解凍


% nohup bunzip2 jawiki-latest-pages-articles.xml.bz2&
nohup+&をつければバックグラウンドで実行かつ接続を切っても実行し続けてくれます。数時間かかる処理のときなどに便利。この解凍は数十分で終わりました。解凍後は約3GB。

基礎情報 会社


巨大ファイルをWindowsのアプリで開くときとたいていフリーズ状態に陥りますが、Linuxならlessでぱっと見れます。

% less jawiki-latest-pages-articles.xml
UTF-8でないと文字化けるかも。
lessで開いた後、
/基礎情報 会社
と打って探すと「関西国際空港株式会社」が最初にヒットしました。

3GBの中にいくつあるのかわかりませんが、この基礎情報会社、のテンプレート部分をすべて抽出すればよさそうです。

巨大ファイルから必要な箇所を抽出する


ファイルが巨大なので速度が欲しいところです。
というわけで、まずはC言語で書いてみます。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
FILE *fp;
fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("cannot open.\n");
exit(EXIT_FAILURE);
}
char buf[1024+1];
int flag = 0;
while (fgets(buf, 1024, fp) != NULL) {
if (strstr(buf, "{{基礎情報 会社") == buf) {
flag = 1;
}
if (flag == 1) {
printf("%s", buf);
}
if (flag == 1 && strstr(buf, "}}") == buf) {
flag = 0;
}
}
fclose(fp);
return 0;
}

コンパイルオプションは
% gcc -O3 -Wall -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 wikipedia_kisojohokaisha.c
こんな感じで。
実行は以下のように。
% ./a.out jawiki-latest-pages-articles.xml >results.txt

PHPでも書いてみました。

<?php
$fp = fopen($argv[1], 'r');
if (!$fp) {
die("cannot open.\n");
}
$flag = 0;
while (($buf = fgets($fp)) != '') {
if (strpos($buf, '{{基礎情報 会社') === 0) {
$flag = 1;
}
if ($flag == 1) {
echo $buf;
}
if ($flag == 1 && strpos($buf, '}}') === 0) {
$flag = 0;
}
}
fclose($fp);
Cで書いたときとそう変わらないのが見てとれます。PHPはstrstrよりstrposの方が速そうなので変えているだけです。

ここで注意する必要があるのがOSが32ビットか64ビットか、です。

% uname -a
Linux localhost.localdomain 2.6.18-53.1.14.el5 #1 SMP Wed Mar 5 11:37:38 EST 2008 x86_64 x86_64 x86_64 GNU/Linux
とx86_64のように出てくればOKですが、
% uname -a
Linux localhost.localdomain 2.6.20-1.2320.fc5smp #1 SMP Tue Jun 12 19:40:16 EDT 2007 i686 i686 i386 GNU/Linux
とi386のようだと
Warning: fopen(jawiki-latest-pages-articles.xml): failed to open stream: File too large
とエラーが出てファイルを開けません。2GB以上のファイルは扱えないのです。先ほどのgccのコンパイルオプションを指定してPHPをコンパイルし直せば動くようですが少々ややこしそう。
参考:
PHPで大容量のファイルを操作する方法 - PHPプロ!ニュース

実行結果


{{基礎情報 会社 }}で囲まれた1299の企業情報が取得できました。

先ほどの64ビット環境でないとPHPが動かない関係で実行したのがDell SC430ではありませんがC言語版だと15秒、PHP版だと60秒程度で処理できました。

抽出結果のファイルサイズは1.7MB程度。これだけ小さくなれば正規表現を使うことも、file_get_contentsで一気に読み込むことも容易です。


次回


抜き出した文字列をMySQLのデータとしてINSERTしようと思います。
今のところ上場企業以外も抽出してしまっていますがこのままやってしまいます。

開く コメント(0)

apache の設定テンプレート



apacheはWebサーバ、HTTPサーバと呼ばれるソフトウェアの1つ。PHPを使うときも密接に関係してきますがロリポップなどのレンタルサーバではapacheを意識することはありません。関係してくるのはその設定ファイルです。多くは.htaccessなるファイルです。.htaccessについて説明したページも検索するとたくさんあるのですが簡単によく使っている設定のテンプレートを紹介してみたいと思います。

余談:「サーバ」という呼び方


上でWebサーバとHTTPサーバ、レンタルサーバ、という単語が出てきました。3つともサーバと呼んでいますがレンタルサーバのサーバは意味が違うように思います。レンタルサーバの場合はハードウェアからOS、その中で動くソフトウェアすべて含めたマシンを指しています。ただ、Webサーバと呼ぶときはレンタルサーバと同じ意味のときもあります。Web担当のサーバマシン、という意味です。他にDBサーバとか。HTTPサーバと呼ぶときは単にソフトウェアのことを指すでしょう。

用語の使い方も厄介ですね。

.htaccess とは


ディレクトリごとにapacheの設定をするためのファイルです。PHPはapacheの上で動いています。ですので、PHPでは制御できないより低レベルの、コアな設定ができます。ドットから始まるファイル名は特殊ですが、Linuxの世界では設定ファイルはドットから始めるのが普通です。(厳密にはユーザレベルの設定ファイルは、です)

apacheのデフォルトの設定では.htから始まるファイルはブラウザでアクセスできないように制限されているので中身を見られる心配がなく安心。中身を見られたとしてもいきなり攻撃を食らうことはないと思いますがリスクを増大させる可能性はあります。

よく使うBasic認証


以下の記述をした.htaccessを置いたディレクトリ以下を、パスワード認証が必要なページにするための設定。よく使うBasic認証です。

AuthUserFile /home/funaki/.htpasswd
AuthGroupFile /dev/null
AuthName "パスワードで保護された領域"
AuthType Basic
require valid-user
htpasswdというコマンドで.htpasswdファイルは生成します。コマンドを打ってユーザ名とパスワードを入力するとできあがります。[coderepos.orgに登録させてもらうとき]にも使いました。

% htpasswd -c /home/funaki/.htpasswd funaki
パスワード

例えば/test/.htaccess で上記の設定をして、/test/pub/ 以下は認証が不要、という場合には /test/pub/.htaccessに
Satisfy any
order allow,deny
allow from all
を設定するとパスワードが不要になります。

Basic認証はPHPでも実現できますが少々面倒です。
PHP: PHP による HTTP 認証 - Manual

PHPの設定


php_valueでPHPに関する設定が可能です。このブログでも何度か登場しました。
php_value include_path '.:/home/funaki/memovie.org/lib/'

他にはこんな設定とか。
php_flag register_globals Off
php_value error_reporting 2047
php_flag display_errors Off
php_flag log_errors On
php_value error_log ログへのパス

mod_rewrite


RewriteEngine On
RewriteCond %{REQUEST_URI} \..+$
RewriteCond %{REQUEST_URI} !\.html$
RewriteCond %{REQUEST_URI} !\.xml$
RewriteRule .* - [L]

RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]

何やらややこしいですがPHPのフレームワークであるsymfonyから拝借した設定。これから作るmemovie.orgのPHPはこの設定の元、動くように作っていきます。

端的に言うと、すべてのアクセスをindex.phpに任せる、という設定です。/book も /movie も /music も/index.phpにアクセスしたものとみなすわけです。index.phpの中で/book のときはこの処理、とif文で振り分けるイメージです。これのいいところは、/book.php のようにファイルを別々に作らなくていい点で、一元処理することでサイトの仕組みをすっきりさせられます。

RewriteEngineはmod_rewriteというapacheのモジュール(プラグインのようなもの)で検索するとたくさん解説が載っています。^や$といった怪しげな記号は正規表現。僕も慣れないので自分で設定を書くことは稀です。

次回


やはり間延びしていてよろしくありませんね。。
次回こそはPHPのコーディングを!

開く コメント(0)

coderepos.org を使う

coderepos.org を使う



coderepos.org のアカウントをいただいた


自分のサーバにもレポジトリを作ってしまいましたが、、アカウントをいただけたのでそちらに移行。ちなみに取得方法は、htpasswdで生成した暗号とアカウント名をメールで送ります。うーん、これだけで初心者には敷居が高いですね。coderepos的にはわかる人にわかればよいのかもしれません。

しかし、こういうスゴい人たちが使っている感のあるサービスを共有するときは、間違えて操作しないかな、と一抹の不安がよぎるものです。。

さてめげずにmemovie.orgのコードをインポートします。
% cd /path/to/my/src/
% svn import memovie.org http://svn.coderepos.org/share/websites/memovie.org/ -m "websites/memovie.org/: initial import."
コードを入手するには
です。これは誰でも可能です。
それほど難しくはないので、以下のページを参考にしてやってみてください。
Subversionの基礎練習

coderepos.org の設定


特に必須ではないですが、せっかくコミッター(リポジトリにコミット、つまりコードを追加編集できる人)になったのでcoderepos.orgに自分のアイコンを表示してみました。

(for committers: set your icon by editting websites/coderepos.org/trac/share/js/TracUtils.js and edit your own wiki page.)

と[トップページ]にやり方が小さく書いてあります。

まずは該当のTracUtils.jsをチェックアウト。
で、編集。111行目に
, 'funaki' : 'id:nob_funaki'
と付け加えました。URLでJPEGも指定できるようです。id:***は、はてなっぽいな、と思って確認。すでに表示されているコミッターのアイコンを右クリックしてView Image(Firefoxの英語版の場合)すると、アイコンのURLが表示されます。


とやはりはてなでした。というわけで、僕ははてなのアカウントを持っていてアイコンも設定済みなのでid:nob_funakiを指定しました。

編集し終わったら他の人のコメントを真似してコミット。これでcoderepos.orgに反映されます。-mで指定しているコメントにはルールがあるので要注意です。
% svn ci -m "websites/coderepos.org/trac/share/js/TracUtils.js: add id:nob_funaki (coderepos-id is funaki)"

続いて、自分のwikiページを生成。
http://coderepos.org/share/wiki/Committers/funaki

最初はどうやって編集するんだ?と迷いましたが左上に「ログイン」とあったのでこちらでログインします。するとEdit this pageといったボタンがページ内に表示されるので、編集。これで無事体裁が整いました。

memovie.org のコーディング開始、まずはフォームの表示


Webサーバにapacheを使う場合、DocumentRootという設定項目があります。ロリポップのようなレンタルサーバの場合、FTPでアップロード可能な場所が自分にとってのドキュメントルートです。チェックアウトしたコード群の、publicというディレクトリをドキュメントルートにすると動きます。

ドキュメントルートを変更できない場合は、、ちょっと待ってください。

僕の場合、ローカルのapacheで
<VirtualHost *:80>
DocumentRoot "/home/funaki/work/memovie.org/trunk/public"
ServerName memovie
ErrorLog "logs/memovie-error_log"
CustomLog "logs/memovie-access_log" common
<Directory />
Order allow,deny
Allow from all
php_value include_path '.:/home/funaki/work/memovie.org/trunk/'
</Directory>
</VirtualHost>
と設定しています。
/etc/hostsに
127.0.0.1 memovie
と設定することで、ブラウザで / にアクセスできるようになります。

はたと困る


ここでいきなり雑談というか愚痴になるのですが、public/index.phpの説明から入ろうと少し書き始めたところで手が止まりました。説明すべきことが一気に増えているのです。いやはや。

今までこのブログではパーツパーツに分けて説明していたので、大した文章量にならなかったのですが1つのサイトを今風のスタイルで作るとなると、必要な知識が膨大になるようです。特にPHP、プログラミング以外の部分で。

というわけで、次回は再び脱線してapacheについて簡単に書いてみようと思います。
CakePHPを参考にしてドキュメントルートが設定できない場合も設置可能なようにしたい。
うーん、なかなかPHPのコーディングに入れない。。

開く コメント(0)

閑話休題

年末はなんとなくばたばたします。
土日、プログラミングできなかったので今回は雑談でお茶を濁します。

普段、開発はLinux上で行っているのですが先日まで知らなかったのが「bashにも標準でhistoryからのインクリメンタルサーチがある」こと。知人が某所でコンソールに向かって作業しているのを見ていて、知りました。

Ctrl-Rを押すとzshだけでなくbashでもインクリメンタルサーチ開始。なおOSは
$ cat /etc/redhat-release
CentOS release 5 (Final)

検索結果の次に行くにはCtrl-Rをもう一度押す。
戻りたいときはCtrl-Sがデフォルトのようです。Ctrl-Sはそのままだと画面を固める機能が割り当てられているので変更。
% cat ~/.zshrc|grep history-incremental-search-forward
bindkey '^B' history-incremental-search-forward
これでCtrl-Bに割り当てられる。
こちらも参照。
戯術者の日記 / 2006-09-28

もう何年も使っている道具にも関わらずまだまだ未知の機能がたくさんあって楽しいものです。

開く コメント(0)

全2ページ

[1] [2]

[ 次のページ ]


.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事