困ったときはログファイル

Cubieboard2 (Arm7 Cortex Dual core 1GHz, 1GByte Ram, 4GByte Flash, OS=armhf debian 7) という、約60ドルで中国から購入したデベロッパーボードを使って運営しているホームサーバーの管理にISPConfig3という管理ソフトを導入して使用している。 Mailサーバー、Webサーバー、DNSそしてnginxプロキシなどをWEBブラウザから一括管理できるので重宝している。
このツール、HowtoForgeというサイトでサポートされていて、”Perfect Server” というシリーズで多様な組み合わせのサーバー設定のチュートリアルが掲載されている。 たとえばこの記事はOSはDebian,サーバープロキシにnginx, mailにはDoveCot、DNSにはBindを使ったサーバー構築の手順が述べられており、実は自分のサーバーはこれを参考にして立ち上げた。(DNSとNGINX、PHP、MySQLの部分はともかく、メールサーバーとメールフィルターの設定は自分ひとりの能力では手も足も出なかった。きちんと設定できたのは上の記事のおかげである)
 最近バージョンのアップデートをしようと思い立ち、コントロールパネルに指示されているiSPsonfig-update.shというコマンドを実行してみた。  アップデート自体はまったく問題なく行えたのだが、 コントロールパネルにログインしようとしてみたところいつもログイン画面が出るはずのurlが空っぽのページになっている。 
他のサービス(メール、Webサイト、DNS、SSHなど)は普通に動いているので、IPSConfigのダッシュボードへのログインが表示できないという限定された不具合だ。 幸いなことにISPConfigのUpdateツールがまず実行するのは旧バージョンのバックアップなので最悪の場合はリストアを行えばよいが、ページのヘッダー情報を見てみると、エラー番号が500、Internal Server Errorとなっているので、これはPHPの実行時、ページレンダリングの途中でおかしくなっている、とあたりをつけた。 NginxのErrorLogを眺めてみると大当たり、Fatal Errorが記録されていた。

11:54:25 [error] 3452#0: *528 FastCGI sent in stderr: "PHP message: PHP Warning:  require_once(/usr/local/ispconfig/interface/lib/config.inc.php): failed to open stream: Permission denied in /usr/local/ispconfig/interface/web/index.php on line 31
PHP message: PHP Fatal error:  require_once(): Failed opening required '../lib/config.inc.php' (include_path='.:/usr/share/php:/usr/share/pear') in /usr/local/ispconfig/interface/web/index.php on line 31" while reading response header from upstream,云々

上のエラーメッセージはindex.phpの31行目config.inc.phpを読み込もうとしたところ、拒否されました。と言っている。 ../libr/config.inc.phpのアクセスレベルがきつすぎるようだ、。
そこでこのファイルを調べてみるとOwner,GroupともISPCONFIGとなっているのは良いとして、Ownerのみに読み書き権限があたえられており、Groupレベルで読み書き禁止となっている。  それではと、Groupレベルでの読み出しも許可に書き換えてみたところ、あっさりと復活した。

#  chmod g+r config.inc.php

これが普通とは思わない。何らかの理由でサーバーのワーカープロセスとファイルのオーナー情報が背反しているためにファイルアクセスできなくなっていると考える。 少し思い当たることがあって、同じサーバー内部でModxを使ったサイトを運営しているのだが、アップデートするたびにSetupフォルダーをマニュアルで削除しなくてはならない、という作業が発生している。 Setupフォルダーの削除はインストール画面でチェックをいれてやれば自動的に行ってくれるはずなのだが、このサーバーではそれができてない。

というわけで、本日わかったこと。
1. Linuxのアクセスレベル管理がいまいち理解できてないなあ。
2. Linux 不具合解析はまずError Logを読む事。

NGINX ん、じんくす? 違わい、エンジンXだい!

nginxと書いてエンジンエックスと読むそうである。webサーバーとして動くことは勿論だが、その他, リバースプロキシとしてはWEBのみならず、mailも扱えるということなので、 今回raspberry piにインストールしてみた。 徐々に使い方を覚えていき、他のサーバーからの移行を画策していこうと思う(狙いは省電力化)が、とりあえずはPHPおよびmysql を一緒に実装し Lamp ではなく、LNMPとして動かすことをやってみる。 Wikipediaの解説によれば非同期のイベント駆動モデルを使っており、プロセス・スレッド駆動のapacheなどのサーバーに比べると高負荷になっても動きが鈍くならない、という利点があるらしい。なんとなくraspberry pi にぴったりのサーバーのような気がしてきたが、実際は如何に。

実装後のテスト画面は以下。ごらんのとおり、PHPが実装でき、phpmyadminが動いている、という証拠スナップ。

phpinfo()をRPi上で実行。

phpinfo()をRPi上で実行。クリックすると拡大画面になり、raspberry piのバージョン情報などが見える。

以下のconfig file を参照。

以下のconfig file を参照。

いくつかネット上の記事を参照したが、メインはこちらの記述に従った。 上記サイトのコピー記述になるのでどうかとも思うが、とりあえず実行したコマンドだけ羅列すると以下になる。
なお、ヘッドレスでアクセスをしているので、入力はすべてsshによるリモートターミナル経由だ。

mysql-server をまずインストール

sudo apg-get install mysql-server [Enter]

mysql のルートパスワードを要求されるので入力したパスワードは忘れないようにしよう。

次にnginx本体をインストール。 ところで、サイトによっては、「ディストロについてくるnginxは0.6とえらく古いのでソースを落としてきてコンパイルしよう、」とその方法を詳しく説明してるところがあったが、apt-get update; apt-get upgrade 後にインストールしたバージョンは1.2.1であった。 ソースをみるとすでに1.51がリリースされているが、ものすごく古い、というわけでもなかったので、パッケージ品をそのまま使うことにする。 自分も齢60歳。いちいち凝っている時間はもうないので次に次にと進むのである。

sudo apt-get install nginx [Enter]
sudo service nginx start [Enter]
sudo apt-get install php5-fpm [Enter]
sudo apt-get install php5-imagick [Enter]
sudo apt-get install php5-curl [Enter]
sudo nano /etc/php5/fpm/php.ini [Enter]

最後のコマンドではnano editor が起動するので、Ctl-W で、以下の部分を探し、修正。
“upload_max_filesize=2M” => “upload_max_filesize=10M”
Dynamic Extentions のセクションに 以下を追加

extension = imagick.so

あとはCtrl-O でセーブし、Ctrl-x で終了。

phpmyadminをインストール

sudo apt-get install phpmyadmin [Enter]

Web-server selection の画面でApache か lighttpdかどちらのサーバーかと、と聞いてくるが、どちらでもないので、チェックを外しておく。 次の画面でパスワードを設定。

sudo service php5-fpm restart

以上すべてsudo で暫定ルート権限で実行しているが、面倒であれば、sudo su でルートになれば、sudoは省ける。

ここまでで必要なサービス(nginx,mysql,PHP5)はすべて導入された。 ちなみにこの状態でRPiのIPアドレスをブラウザで見ると”Welcome to NGinx”という簡単なメッセージが出て、nginxが無事動いているということがわかる。

ただし、この状態では静的なファイルしか表示しない。 PHPファイルを認識させるにはconfig file をいじる必要があるが、その前にサイト用のダイレクトリを設定しておく。
ルートフォルダにある/srvにフォルダーツリーを作っていく.

sudo mkdir /srv/www [Enter]
sudo chown -R USER1:www-data /srv/www [Enter]
sudo chmod -R 755 /srv/www [Enter]
mkdir /srv/www/site1 [Enter]
cd /srv/www/site1 [Enter]
mkdir logs [Enter]
nano logs/access.log (ファイルを作るだけなので、カラのファイルをセーブして即クローズ)
nano logs/error.log (ファイルを作るだけなので、カラのファイルをセーブして即クローズ)

上でやっているのは、nano で空のファイルを二つ作るということだが、空のファイルを作る技としてはほかに

touch filename

さらには

> filename

なんてのもある。最後のコマンドは無入力をfilenameにリダイレクトする、という技で、20年前に感心して覚えたのをすっかり忘れてた(爆)


mkdir public [Enter]

上の例では自分はUSER1というユーザー名でログインしてると仮定し, /srv/www/というフォルダーにsite1というフォルダーを作成する。 srv/www/site1/pulicを、作ろうとしているサイトのルートとしてここにWeb 構造を展開して使う魂胆である。ホストできるサイトは一つだけではないので、その場合はsite2, site3など、任意名のフォルダーを作って割り当てていけばよい。
次にCONFIG FILE で上の情報をつなぎ合わせるわけだ.
デフォルトのCONFIG FILE は /etc/nginx/nginx.conf というファイルで、これはすでに存在している。 ネット上の多くの説明では、このファイルを直接いじるような印象だが、 今回インストールされたnginx.conf を見てみると、ほとんどコメントアウトされていてコメントを抜くと、フレームワークがあるだけで、ほとんど何も実際のコマンドになっていない。 ただ、webサーバーを指定しているhttpブロックをよく見てみると 以下の記述があることに気付く。

include /etc/nginx/sites-enabled/

で、このsites-enabled のフォルダーを眺めてみると、default というファイルを見つけたわけだが、このファイルは実体のないソフトリンクされているポインタであり、実際のファイルは/etc/nginx/sites-available/default というファイルだったりする。

このsites-available, sites-enabled というフォルダーはapache2 でもおなじみで、サイトの構成ファイルをsites-available のほうに、one site= one file 単位でセーブしておき、 有効にしたいサイトのみ、ソフトリンクでsites-enabledにソフトリンクする、という仕組みになっているようだ。 ”welcome to nginx”というメッセージはこのdefault の中に以下の記述がある。

root /usr/share/nginx/www;
index index.html index.htm;

これは「このサイトのルートページはローカルマシンの/usr/share/nginx/www フォルダーですよ、html とhtmのエクステンションを探して表示しましょうね、」と言っている。 ちなみに、このフォルダーをみてみると、index.htmlというファイルがおいてあるので、その中身をみると、やはり”welcom to nginx”とhtml で書いてあるわけだ。
今回は/srv/www/site1/public/をルートにしようとおもっているので、別のconfig ファイルをつくり、そのファイルをsites-availableにセーブし、ソフトリンクでsites-enableに登録するという作業を行う。 ファイルの名前をsite1として話を進める。

sudo nano /etc/nginx/sites-available/site1 [Enter]

実際のファイルの中身は以下のようになる。

server {
access_log /srv/www/site1/logs/access.log;
error_log /srv/www/site1/logs/error.log;
root /srv/www/site1/public/;
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/www/site1/public$fastcgi_script_name;
}
location /phpmyadmin {
root /usr/share/;
index index.php index.html index.htm;
location ~ ^/phpmyadmin/(.+\.php)$ {
try_files $uri =404;
root /usr/share/;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
root /usr/share/;
}
}
location /phpMyAdmin {
rewrite ^/* /phpmyadmin last;
}
}

このファイルをソフトリンクするついでにdefaultをsites-enabled から削除(リンクを解除) さらにサービスを再スタート

sudo ln -s /etc/nginx/sites-available/site1 /etc/nginx/sites-enabled/site1
sudo rm /etc/nginx/sites-enabled/default
sudo nginx restart

まだルートフォルダにはページをつくっていないので、このままでは何も表示しない。 phpinfo() というphp関数を実行するだけのファイルを作成してルートフォルダーにセーブする。

nano /srv/www/site1/public/index.php

以下の一行を記述

<php? phpinfo(); ?>

ctl-o で書き込み、ctl-x でクローズ

キーボード、モニター付きのRPiなら、あとは”localhost”とブラウザに打ち込むわけだが、外部のマシンからのブラウザアクセスをする場合にはIPアドレスを入力してやる必要がある。自分の環境ではローカルマシンでbind9というDNSをうごかしている。ここに192.168.1.97というローカル固定IPをraspberrypi.home.lanというドメインネームとして登録した。早速これを使って http://raspberrypi.home.lanと入力すると一番上の画面が出てきた。 さらに http://raspberrypi.homel.lan/phpmyadmin と入力してphpMyadminのログイン画面が出た。 このアプリはPHPで動くので、PHPの作動確認OK. さらに ログインしてmysql のデータベースもちゃんと使えることを確認して本日のところは終了。 config の部分についてはnginx.org/document/ のビギナーズガイドが非常に参考になった。
外部からのアクセスができるようにするにはserver_name などのパラメータを追加していく必要があるはずなので、今後ぼちぼち試行錯誤していこうと思う。理屈としてはこれでWordPress などのCMSも導入可能になったはずだ。

MyBook LiveというNASでWEBサイトをホストしてみた。実践編その3

一昔前と違い、WordPressやJoomla!あるいはDrupalとかModXなど Webサイトを作るのに
Content Management System (CMS)を使うのが当たり前のようになっている昨今、 Apacheサーバーにはデータベースサービス(例えばmysql)とこのデータベースとウェッブページをつなぐツール(例えばPHP)が必要だ。 最初から何も実装されていなければ、lamp(linux Apache mysql php)などという便利なパッケージもあるが、すくなくともapacheサーバーは実装されているのでlamplをインストールするわけにもいかない。

Mybook Liveで動いているApache2サーバーはすでにPHPも実装されている。 UIの画面自体、PHPベースのCakeというフレームワークで作成されているようだ。

<?php phpinfo(); ?>
という一行を phpinfo.php というファイル名でWEB folder上に保存し、(前回の例では/stores/Public/WWW) ブラウザでアドレスを mblwebsite/phpinfo.phpと打ち込むと、PHP情報が表示されるはずだ。
これを見るとMysql用のインターフェースも実装されている。 PHP側からmysqlをアクセスする準備は整っているわけだが、 残念ながらMBLはmysqlのサーバーは実装していない。
そこでMysqlサーバーを個人のリスクでインストールすることになる。
Debian上でのインストールはいたって簡単で、
#aptitude update
でパッケージリストを更新したのち、
#aptitude install mysql-server
または
#apt-get install mysql-server
インストールの準備が整うと、本当に実行しますか?と聞いてくるのでYesと応えるときちんと実行される(はず)
途中でパスワードを作るように催促されるのでMysqlのroot 用のパスワードを適当に考えて入れてやる。(覚えておきましょう)
インストールの終わりにはMysqlサーバーを起動してくれるので、 これをアパッチ側にも認識させるために アパッチサーバーを再起動
/etc/init.d/apache2 restart
これでApache +Mysql + PHP の環境が整った。
また、Mysqlの管理用にphpMyAdmin あるいは sqlbuddyなどの管理ツールを用意しておくと楽である。 これらはいずれもパッケージをダウンロードし、Web用のフォルダーにサブフォルダーを作り、解凍しておくだけで、すぐにブラウザーから使えるようになる。 詳細はそれぞれのパッケージのReadme を見てください。

MyBook LiveというNASでWEBサイトをホストしてみた。実践編その1

Mybooklive、サーバー化の第一歩

というわけで、Western Ditigalの廉価版のNAS Mybook LiveをWebサーバー化する方法を
書いておく。
まずはSSHによるターミナルアクセスを アクティブにする。
MybookLiveではGUIの隠れコマンドになっている。
まず、MybookLiveにログインした状態で、WEBブラウザーの”192.168.1.25/UI”などとなっているアドレスバー上のアドレスを”192.168.1.25/UI/ssh” というように”ssh”を追加することで、sshのコントロールパネルが開く。 ここでsshにチェックマークを入れるだけで完了。
他のMybook製品に比べるとかなり手順が簡単になっているらしい。
これでセキュアシェルのログインができるようになったわけで、UbuntuなどのLinux機からのアクセスはターミナルからsudo ssh root@192.168.1.25 などとやるだけでよいのだが、 Windowsからの接続はPuttyというユーティリティプログラムが必要。
上のリンクからPutty.exe.をダウンロードして実行する ホストネームまたはIPアドレスを入力してSSHを指定してOpenするとリモートログインのコマンド画面になる。root ログインでデフォルトのパスワードはwelc0meになっている(英語のオーではなくゼロであることに注目)
ちなみにこれはMybook liveのデフォルト値なので、外部アクセスを許すつもりなら、パスワードは変更しておいたほうがよい。”Unixコマンド:passwd”
ハックサイトではナノというエディターを使うことを推奨している。このエディタはnano filename で起動できるが、同じユーザーネームとパスワード、そしてport 22指定で、sftp接続もできるので、 Filezillaからsftpで接続し、ファイルのエディットはFilezillaのView/Edit機能を使ってWindows環境で行うこともできる。
オプショナル:
いつもrootで接続するのも気持ちわるいので他のユーザー名を追加しておく
useradd user1 -p user1password
しかしこのままではuser1はsshからアクセスすることはできない。/etc/ssh/sshd_config の中にあるAllowUsers directive にuser1を追加する
AllowUsers= root
これを
AllowUsers= root user1
と変更し、ファイルを読み込ませるために以下を実行
/etc/init.d/ssh reload
ところで
sshのデフォルト設定ではパスワード無しのログインはできないようになっているので(sshd.conf中で設定されている)パスワードを空白に指定するとアクセス不能になる。 まさかと思ったがネットの記事を見るとRoot権限のパスワードの設定を空白にしてしまう人もいるらしいので ご注意を。 しっかし root で侵入されて cd / ; rm * とでもやられることをかんがえないのだろうか?
次にはPHPを実装したWEBサーバーは簡単に構築できる、というか、すでに実装されている。 その証拠にIPアドレスを入力してあげるとhttp://mybookliveaddress/UI というアドレスに自動的に飛んでログイン画面になるわけでしょう? これってWebサービスですよ。
FileZilla で、中身をのぞいてみると /var/wwwというところにWEB用のページがおかれていることがわかるので、ここにソフトリンクをはってしまえばよいことになる。
ln -s shares/Public/WWW /var/www/myweb
上の例ではPublic Share にWWWというフォルダーをつくり、これをホームページとしてサーブしてもらう感じ。
他の手段としては フランスのどなたかが、FeaturePackというユーティリティを作ってくれている。
これだとmybooklive:8080 が通常のWEBサイトに、 さらにhttps://mybooklive がメディアサーバーとしてセットアップされるようになっている。
そのうちに説明をポストするけど、いつになるかわからないので、英語に自信のある方は自分でやってみてください。

また、どちらもMySQLデータベースは実装されていないので、WordPress などMySqlサーバーが必要なCMS等を運用する場合には aptitude、あるいはapt-getを使って追加してあげる必要がある。  これもそのうち説明します。(まだ2日しか動かしていないのではっきり作動しているという保障がないので)

Why study PHP? 何故PHPなのか その2

まずは前回の復習 (Internet上のページがどのようにつくられているか、門外漢向けの説明、と同時に自分が理解したと思った内容の復習です)

  1. Internet のWeb home  Page上の情報 は HTMLという言語で記述されている。
  2. 表示の加飾方法(内容ではなく)についてはCSSというファイルに記述され、これがHTMLを記述したファイルから参照されている。
  3. これをブラウザが読み込んで人間たちが読めるように表示する。
  4. HTMLとCSSで構成されたweb Pageは静的なページで閲覧者のアクションに対して動的なページにするにはスクリプト言語を追加する必要がある。
  5. スクリプトにはブラウザー側で動くスクリプトとサーバー側で動くスクリプトがある。

 

と言うところまで説明しました。 今日はここから

ここで言っているサーバーの意味を簡単に言うと世界のどこかにある、Internetでホームページを発信しているコンピューターのこと。 スクリプトがサーバーで実行される場合は、閲覧者のコンピューターに届くときにはごく普通のHTMLファイルになっています。 ブラウザーからはサーバー側でどのような作業がされたのかを見ることはできません。 これの代表的な言語がPHPです。(マイクロソフトのExpress WebやVisual StudioでWebアプリケーションを作っている場合はNET.ASPという言語がサーバー側で動き、アプリケーション(aspxファイル)を処理してhtmlとCSS、VBscriptなどに吐き出してブラウザー側に送っています。)

Client 側とは 閲覧者が使っているブラウザーです。 ブラウザー側で動くスクリプトはHTMLに”このスクリプトを使ってね“という記述があって、 それをブラウザーが実行します。代表的なスクリプト言語にはJavaScriptがあります。VBScriptなどもそうです。 JavaScriptを使うと、dropdownやflyoutのメニューなどや、単語にカーソルを当てると、それに対応したイメージを表示させるような仕組み、フェードイン、フェードアウトのようなアニメーションをページに組み込むことができます。すなわちスクリプトの内容もブラウザー側に送られてきます。 ちなみにこのスクリプトの内容はIE8のような新しいブラウザーでは開発モードにすると(F12を押す)見ることができます。

Server side Scripting, Client side Scripting, それぞれ得手不得手があるので同じページに両方使うことも普通に行われます。

Server side scripting はサーバーがPHPやASP.netなどの環境をサポートしている必要があります。 有料のプロバイダーはほとんどの場合PHPをサポートしていますが、 無料サービスのホストの中にはサポートしていないこともあり、 そのようなHostを使っているときには、プロバイダーが用意したページ作成ソフトで画面を作るか、 HTML,CSS, JavaScriptの三種の神器のみでページ作成に取り組むことになります。

ここで自分がどうしてこのような事に興味を持ったのか、その理由を書いておきます。

インターネットサービスのプロバイダーと契約をしたときに、メールアカウントの他に、HomePageのスペースも頂きました。 15年も前の話です。 当時はwindows 95にFrontpage Expressというhome page 作成用のツールがついてきましたが、 今にして思うと、これは簡単なHTML生成のソフトでした。  このツールだけでも当時としてはそれなりのページが作れましたのでなんとなく満足していましたが、そのうちプロバイダーがWebPageBuilderというブラウザ上で簡単にhomepageを作れるツールを提供するようになりました。 これはテーマを選ぶと、それなりのページが作れ、メニューも自動生成される、というものでした。 それからというもの、内容の編集はすべてWEB上のツールで行いました。 しかし、それだとどうしても出来るページ、構成は定型なものになってしまいます。

私の場合、最初はHTMLだけで簡単なhomepageを作っていました。 そのうち、他の方たちのページを見て、見出し部分がしっかりトップにあり、メニューが左側に配置され、 その右側に本文が並べられているような作りはどうやって実現するのだろうと興味を覚えCSSを覚えることになりました。

さらに簡単なアニメーションとかも入れたくてJavaScriptも少し勉強しました。 JavaScriptの場合、Internetに色々なコードが開示されていたり、さらにJQuery というswiss army knifeのようなツールがあって、 かなり高度なこともそれほど深い知識が無くてもホームページ上で使えるようになります。

これだけでわりと「らしい」ページを作れるようになったのですが その次に困ったのが「すべてのページ共通な部分をいちいち コピーペーストで複製していかなくてはいけない」 ということでした。

特にメニュー関係の項目は メニューを増やすごとにすべてのページを編集しなければなりません。 これはもっと良い方法があるはずだ、と思ったのです。

調べてみると、サーバーサイドインクルード(SSI)という仕組みがあって、HTMLの記述に 「このファイルを含むのよ」 と書き込んで 別ファイルにメニューの記述を書いておけばこの別ファイルを変更するだけで このファイルを参照しているすべてのHTMLページに反映される、ということができるらしい、という事がわかりました。 ただし、この機能はサーバーがサポートしている必要があります。 

SSIと同じことは PHPでもできます。同じ事はJavaScriptでも出来るのですが、 PHPでは 一行のコード  ですむところをJavaScriptではそれなりのコーディングが必要になります。 なぜかというと、 PHPの場合はサーバー側で処理を行い、 ブラウザーが受け取るHTMLは既にインクルードされるべき内容が反映されたものになっていますが、JavaScriptで行う場合はまずはJavaScriptを含んだHTMLをブラウザ側で読み込み、次にJavaScriptの指示に従って、インクルードするべき内容をサーバーに取りに行き、これをHTML内部に埋め込むという作業を行った後で、整形されたHTMLをブラウザーが再度表示する、というような作業を行うからです。 JavaScriptでやるのはスマートではないなあ、と思い、PHPに興味が沸きました。 

一昔前のWebの教科書を見ると、Server Side Scripting はPerlという言語を使っています。 PHPというのはここ10年ほどで急速に認められてきた言語体系のようです。

さらに調べてみると、 WordPress ,Drupal, Joomla!など今話題のWebコンテントのマネージメントツールや、facebook,WikipediaなどのWeb serviceは皆PHPを使って作成されているようです。  これはかじってみるしかありますまい。 と思うに至り PHPの勉強をすることにした次第。

Warning: Cannot modify header information – headers already sent by

新しいサイトに Feedback Formを実装して試験をしたらこのエラーに出くわした。 ググってみると結構ヒットする。 

基本的には <?php タグの前に文字列などがあるとこのエラーが出る、という話なのだが、 最初テクストパッドで見ても文字列どころかスペースもなにもない。 他の原因かと思い、推奨されていた バファリングをONにしたりなどしてみたが拉致開かず。 

ところがPSPADエディターをHexモードにして眺めてみると なぜか先頭にFFFEのバイトがくっついている。  

これは一体なんじゃい?  テクストモードだとまったくわからない。 

Watcom Cのエディターを起動し読み込んでみたら、 こちらでは 

<?php

 と出た。 PSPADでも設定を変えると表示できるような気がするが、とにかく、Watcom editor を使ってこのわけのわからんゴミを削除し、サイトにアップロードしなおしてトライしたところ解決! (さきほどNetBeansのIDEでも表示が出る事を確認) 無為に使った時間の総計約3時間

 
そこで FFFE at the beginning of Text file でググってみたら、  Wikipedia 上の Byte Order markという記述にたどりついた。NotepadなどのWindowsのエディターはデフォルトでこれがくっつくんだそうな。 説明はそちらにゆずるとして、  PHPで不具合が出ますよ、と、どんぴしゃのことがしっかり書いてある。 これで半日つぶしたぞ! 
 
PS: フラッシュを埋め込んだページのいくつかに、このが表示される理由がわからなかったのだが、 これでなんとなく察しがついた。 埋め込みに使ったテンプレートファイルを眺めてみることにしよう。
 
 
 in my case, it was the Byte order Mark that was appended to the beggining of the PHP file.  For detail discussion, see Wikipdia entry “byte order Mark”  It even talks about this particular  PHP error.

Why study PHP? 何故PHPなのか その1

まず、自分でウェブページを作ろう、という気が全然無い人はPHPを勉強する必要は100パーセントありません。(爆)

まずはWebページのなりたちから 15年ほど前にウエブページを作ろうと思えば、覚えるべき事はただひとつ、HTMLというマークアップ言語を勉強すればよかったのです。 これで

<html>
<header>
<title>my first web page</title>
</header>
<body>
<p>Hello World</p>
<p>This is my first web page!</p>
</body>
</html>

とnotepadなどのテクストエディターで書いて、hello.htmというファイルにセーブし、ブラウザーでこのファイルを読めば画面上に

Hello World
 This is my first web page!

 と出たのでした。(今でも出ますが)(ちなみに上の <p> は段落タグ(paragraph tag)です。 </p>タグまでが一段落 

基本的にhtmlはタグを使って表示内容を記述します。 ほとんどのタグは<tag>中身</tag>のペアで記述されます)

 HTMLとはHyper Text Markup Language の略です。発足当時の一番の特徴はハイパーリンクにより、複数のページを簡単にリンクすることができる、というものでした。 Wiki ページのようなものが簡単にできるわけです。

たとえば、

<html>
<header>
<title>link demo </title>
</header>
<body>
<a href=”mypage.net/nextpage.html”>Go to next page</a>
</body>
</html>

上のように書いたページに現れる”go to next  page” というリンクをクリックすると他のページに飛んでいく、という、印字された文書しかなかった当時としては画期的なアイデアでした。(今まで読み方のパラダイムがシーケンシャルからランダムへとシフトしたのです)

(<a>はアンカータグと呼ばれ、テキスト、イメージなどをリンクするために使われます)

 基本的にブラウザに表示したい表示内容はすべてhtmlで書くことができます。 ただ、websiteの表現方法が発達するにつれ、 表現の仕方=スタイル(たとえば、この文章は枠で囲もう、とかこの部分は大文字で背景は赤くしたいとか) については書き込む内容とは別にすべきだ、という思想からCSSというスタイルシートに纏めて書き込み、これをhtmlファイルから参照するというのが正しいマナーになっていきました。

CSSはカスケードスタイルシートと呼ばれるものでこれに内容をどのように表示するか、という指示が記述されます。たとえば

 p {font-size: large; }

 という記述がCSSファイルにあると、上のhello world はブラウザーに普通より大きな文字で表示されるわけ。

CSSについてはCSS Zen garden ページを見てください。ここでは同じHTMLを使いながらCSSを置き換えることによって、ページの表現がこんなにかわります、という実例の閲覧ができます。 メニューアイテムのリンクはすべて同じhtmlの内容。 参照されるCSSが異なるだけです。

このhtmlとCSSを使えば熟練したWebページデザイナならかなり立派なウェブページを作ることができるのです。 ただ、このようにして作られたWebページは静的なページです。 CSSにはカーソルがテキストやイメージの上に来たときに、その表現方法を変えられる機能があって、選ばれたメニューアイテムの色を変えたり、文字を大きくしたり程度のことはできますが、インターアクティブなページを作ることができません。(たとえば、メニューアイテムにカーソルを合わせると、そこからさらに別のメニューが開いていく、[flyout menu]と言われるようなもの) 

インターアクティブなページを作るにはページにスクリプトを実装する必要があります。スクリプトというのはブラウザに何からの現象が起こったときにhtmlの中身自体を変更してブラウザの表示内容を変えてしまう仕組みを記述したものです。

ここで言う現象とは「新しいページを開いた」「現在のページを閉じた」「ユーザーが画面上のどこかをクリックした」「ユーザーがボタンをクリックした」「ページが開いて一定時間が過ぎた」などなど

スクリプトの種類には二つあります。 ひとつはブラウザー側で実行されるスクリプト。 もうひとつはサーバー側で実行されるスクリプトです。 それぞれ Client side script, server side scriptと言います。

 ブラウザー側で実行されるスクリプトはJavaScriptが代表的なものです。 (ところで、巷にいうJava というプログラミング言語と、このJavaScriptはまったくの無関係です)

そしてサーバー側のスクリプトの代表的なもののひとつにPHPがあります。

というわけでやっと、PHPの入り口までたどりついた。 ハアー

以下次号

PHP で Hello World

<?php

echo “Hello World\n” ;

?>

お粗末でした。

<php? : PHP コードは<php? ではじまり、?> で終わる

echo : 以下の文字列を出力する print もほぼ同じように使える

文字列の中に\で始まるエスケープキャラクターを入れることができる。 \nで改行

ステートメントは ;  で区切る

57歳の手習いでPHPを勉強しているわけだが、誰かに教えることで習得度が上がる、という先人の知恵を拝借。周りには誰も教えて欲しいという人がいないので、ここに書いておこう。