Web管理って今では、当たり前にできるようになったけど、色々と苦労したなぁ。
最初は、Solaris, Linux とかUNIXをさわったこと無かったし。まぁとにかく苦労しましたわ。
でも、今ではUNIXのコマンドに助けられて仕事がはかどるようになりました。grep, wc, find なんてコマンドを組み合わせるとログファイルから色々な情報を引き出すことができるんですなぁ。
Search Engine Strategies Conference & Expo 2004 Japanへ行ってきた。
2日めだけの参加だったけど、内容的には濃い情報でとてもよかった。
以下、メモ。
戦術(SEM, SEO)は、その前に戦略(実際のユーザ、現状と課題)をたてることが大事。
顧客である企業が知りたがっている事。
ブロードバンドの普及による行動変容。利用コンテンツ。
(時間帯でいうと昼間は奥様。夜は中年男性)
Yahoo Japanの強大な影響力(マーケットに対して)
Yahoo, 楽天, Google
メディアミックス広告キャンペーンは
4M+I または 4M×I
IはインタラクティブのI。インターネットのI。
Mは、新聞・ラジオ・テレビ・雑誌。
なぜブログが普及したか?
htmlを書かなくてよい。日本は、もともと他の国と違って個人が日記を書いたり、掲示板に書き込んだりしていた。他国では企業のホームページが中心だった。
ネット視聴率は、昔はホスト名。今は、ホスト名と検索キーワード。
http://ホスト名.co.jp/cgi-bin?q=温泉
Yahooプロパティには、
search.yahoo.co.jp
dir.yahoo.co.jp
Googleプロパティには、
google.co.jp
google.com
利用者数、リーチ(実際のアクセス)/月
月ごとのリーチ、ページビュー、一人当たりの平均利用PV(ページビュー)の変化。
ロイヤリティ度は、Google, Yahooが高い。
Googleの利用者特性は、日本、海外とも同じ。
検索エンジンの併用度。ほとんどの人が複数の検索エンジンを利用。
全体、男性、女性、2-12歳、13-15, 20-24, 25-29, 30-34, 60-など区切ってPV、リーチを測定。
個人コンテンツは検索エンジンが重要ということ。
利用キーワードを年齢、性別で分ける。
US:情報を探す(図書館へ行く感覚。企業は、企業名+comですむので検索する必要がない)
日本:本を探す(上記のように遊園地へ行く感覚)
goo
白い巨塔のキーワード検索の数は視聴率と連動している。
検索エンジンの使われ方。
「なんでも検索マシーン」
「出かける前にインターネットで調べる」(旅行など)
検索エンジンに求められているもの
精度がよい。スペル直し。似たキーワード。パーソナル化。
Web Answers 話し言葉で検索。「200X年のオリンピックはどこで開催されるか?」
Yori Dori Web 自分流カスタマイズ。(天気予報、ニュース、検索、時刻表)
Hot Window webの最新。
Info Lead 3DのWebクルージング
専門DB、辞書、音楽を増やして行く。
ゆれに強い。12%のキーワードに問題あり。
ルイビトン、ルイヴィトン
ドラえもん、ドラエモン
竹内まりあ、竹内まりや
国土交通省、国交省
らーめん、ラーメン、拉麺
引っ越し、引越し、引越
吉岡美穂、美帆、美浦
制服で検索しても子供に安全。漢字にふりがなを自動的にふる。
モバイルに対応していく。
日本人が相手なので、
日本語の問題+世界最大のGoogle
SEO
1 リンク 2 テーマ 3 ユーザビリティ 4 スパム排除
受け取っているリンクの量(リンクポピュラリティ)。
そして質(同じテーマのサイトからのリンク)
ALTタグ、タイトルタグ
悪質なもの(リンク?)を防ぐ
なぜSEO?
1アクセスアップ 2注文・問い合わせのアップ 3ブランド力アップ 4費用対効果のアップ(広告)
SEOはブラックボックスや魔法ではない!
やること
1企業とユーザーの思考のギャップを埋めるコンサルティング
2検索エンジンとユーザーの思考ギャップの補助
3PPC広告(アドワーズなど)、ログ解析、ユーザーテスト
4スパム排除
広告効果をキーワードで追って行く
「サイトのリニューアル」といえばSEO
SEOはWEBマーケティングの一部
1キーワード選定 2SEO,PPC広告 3検証(週ごとのランキングチェック) 4リニューアル
を繰り返していく。
ランキングチェックは自動DB化ソフトあり。
Webマーケティング担当者。チームの一元集約化が必要。権限がある、ないが大切。
Webの目的
既存顧客に情報やサービス情報を伝える事
取り引きの拡大に寄与すること
アクセスは、
1URLを直接入力
2検索エンジン
3アフェリエイトやリンクなどから
の3つが基本。だから検索エンジンが重要。
試しにApatanaをPHP開発用に使ってみることにした。
eclipseのプラグインではなく、Apatanaアプリケーションをダウンロードした。
PHP Pluginをダウンロードするところが見つからないと思っていたら、こうやってPHPプラグインをインストールすることを発見。
1. Aptanaを起動する。
2. Apatanaスタートページを表示する。
メニューバー > Help > Aptana Start Page...
3. PHPプラグインをインストールする。
Language欄のPHPのinstallをクリックしてダウンロード&インストールを実行する。
(同様に、Ruby on RailsやAIRプラグイン、iPhone開発用プラグインもダウンロードできる)
3つのシチュエーションで、文字コードにUTF-8、Shift_JIS、EUC-JPを設定できる。
◎ドキュメントを開いている状態で: Edit > Set Encoding... > Other > UTF-8
◎プロジェクト名を右クリックして: Properties > Info > Text file encoding > Other > UTF-8
◎ワークスペースのエンコーディングを変更する場合: Window > Preferences... > General > Workspace > Text file encoding > Other > UTF-8
NetBeans6でPHP開発環境を整える。
NetBeans6の正式リリースは、2007年末なので、最新版をダウロードする。
(ベータ版ではなく、最新版をダウンロードする)
http://www.netbeans.info/downloads/dev.php
1. プラグインウィンドウを開く。
メニューバー > Tools > Plugins
Pluginsウィンドウ > Available Pluginsタブ
で、PHPにチェックを入れてInstallボタンを押す。
最初にPHPプロジェクトを作成する。
File > New Project...
PHPプロジェクトを選択する。
これで、PHPの文法チェックを利用できるようになる。
キーワード調査の強い味方グーグルインサイト登場! http://web-tan.forum.impressrd.jp/e/2008/08/12/3744
グーグルインサイト http://www.google.com/insights/search
とりあえず使ってみた。先月、2008年7月のNHKニュースで取り上げられていた「穿刺器具」を調べたらやはりグラフがその時期に跳ね上がっておりました。
ブレイクアウト(人気急上昇)になった時期を調べたり、関連キーワードを調べるときに役立ちそう。
価格表などのPDFファイルをマーケティングから受け取って、あるページだけを抜き出したり、一部を修正してWebに掲載したいという話しがたまにあります。
Acrobat Readerではなく、Acrobat Professional で目的のPDFを開く。
で、ページの削除は簡単。ページアイコンがたくさん並んでいるサムネールを右クリックして「ページの削除...」を選べばよし。
これは、ちょっとトリッキーなのだ。
「テキスト選択ツール」でいきたいところなのだが、これでは文字を削除できない。
「TouchUp テキストツール」を選んで、文字を選択して削除する。
Adobeさん、もうちょっと考えたユーザインターフェースにしてほしい。
PDFで使っているフォントがインストールされていないとダメ。(Acrobat6での経験)
まず、そのPDFで使っているフォントを
ファイル > 文書のプロパティ... > フォント
で調べて、Macの
ユーザディレクトリ > ライブラリ > Fonts
へ入れてあげるべし。
サイトへのトラフィック量の世界ランキングがわかるのだ。
このツールを使って、自社とライバル会社の比較をしてレポートを書こう!マネージャも喜んでくれるに違いない。
こんな感じで、調べるべし。例えばAppleの場合を例にとってみる。最初にalexaにアクセスする。
.htaccessによるアクセス制限。Apacheだけで実現できるので楽チン。CGIと組み合わせれば、会員管理みたいなことも可能。
前準備として、見せたくないディレクトリに.htaccessというファイルを置く。見せても良いメンバーのリストをmembersという名前で保存しておく。そして、membersのリストに入っている名前とパスワードを知っている人だけがアクセスできるうようになる。
テキストエディタで作成して.htaccessという名前で保存。
AuthUserFile /home/tanaka/members
AuthGroupFile /dev/null
AuthName "MEMBERS_SITE"
AuthType Basic
require valid-user
order deny,allow
deny from all
シェルで作業する。
最初だけ、-cを指定する。(Createのc)
$ cd /home/tanaka
$ htpasswd -c members hanako
New password: hanako
Re-type new password: hanako
次回からは、
$ htpasswd members sawada
$ htpasswd members kato
と追加していく。
以上で、ダメなときは、httpd.confを確認・修正。
# vi /etc/httpd/conf/httpd.conf
・修正前
AllowOverride None
・修正後
AllowOverride AuthConfig Limit
で、Apacheを再起動。
# service httpd restart
テスト用のWebサイトなど、ある特定のIPアドレスの人たちだけにアクセスを制限したい。という場合。
192.168.*.* と *.mydomain.co.jp からのアクセスを許可する。
public_htmlの下に.htaccessファイルを作り、以下のように記述する。
.htaccess
order deny,allow
deny from all
allow from 192.168.
allow from .mydomain.co.jp
基本的に全てのアクセスを拒否して、アクセス可能なサイトを記述する。
既に.htaccessが存在している場合、一番上に記述して、ちゃんとアクセス制限できるかテストする。
あまり、使うことは無いと思うけど、ある特定のスパイダーのアクセスを絶対に拒否したいときくらいかな。
.htaccess
order allow,deny
allow from all
deny from 192.168.
deny from .spy.co.jp
基本的に全てを許可して、ダメなサイトを記述する。
例えば、www.mydomain.com/himitsu/以下を特定ユーザーやメンバーでアクセス制限したいとき。
$ cd public_html/himitsu/
$ vi .htaccess
.htaccessの内容
AuthUserFile /home/mydomain/pswd/himitsu.pwd
AuthGroupFile /dev/null
AuthName "HIMITSU"
AuthType Basic
require valid-user
<Files .htaccess>
order deny,allow
deny from all
</Files>
パスワードファイルを作り、田中さんをユーザとして加える。(-cは、クリエイトなので初回のみ)
$ cd mydomain/pswd/
$ htpasswd -c himitsu.pwd tanaka
Adding user tanaka
New password:
Re-type new password:
続いて、ユーザ鈴木さんを追加するときの作業。
$ htpasswd himitsu.pwd suzuki
同様に、アクセス可能なユーザを追加していく。
以上で、作業完了!
Apacheのhttpd.confの設定を確認する。
ファイル名の確認
AccessFileName .htaccess
バーチャルホスト内でAllowOverrideを指定しているかを確認
<Directory /export/home/*/public_html>
AllowOverride FileInfo AuthConfig Limit Options Indexes
<Limit GET POST OPTIONS PROPFIND>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS PROPFIND>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>
変更した場合、Apacheの再起動を忘れずに...。
ページが見つからなかったときに表示される404 Not Foundの表示が気に入らないときは、missing.htmlを作っておいておく。で、実験してみると表示が崩れるわ、リンクは外れているわ...。なんじゃこりゃと...。
正しいページ:http://www.hoge.co.jp/hoge.html
ユーザが間違えてアクセス:http://www.hoge.co.jp/ho.html
ho.htmlがmissing.htmlに置き換わる。つまりこうなる。
http://www.hoge.co.jp/missing.html
正しいページ:http://www.hoge.co.jp/aaa/hoge.html
ユーザが間違えてアクセス:http://www.hoge.co.jp/aaa/ho.html
という状況だと、ho.html が、missing.html に置き換わる。つまりこうなる。
http://www.hoge.co.jp/aaa/missing.html
上手くいくケースでは、ちゃんと表示されていても aaa というディレクトリだとmissing.htmlがちゃんと表示されない。
missing.htmlのhtmlソースを見たら、../../hoge.gifとか相対パスを使っていたのでした。
missing.htmlの中で画像やURLリンクを表示する場合は、絶対パスを使う。ということでした。
リンク外れを起こしてしまう。また、cssなどスタイルシートやJavaScriptなどを参照している場合は表示が崩れてしまうんですなぁ。
missing.htmlは絶対パスで作ること。
Apacheのhttpd.conf
ErrorDocument 404 /missing.html
を記述して、Apacheを再起動すれば、missing.htmlが有効になる。
普段どおり、自社サイトにアクセスすると
Forbidden
んー。アクセスできません ヽ(´ー`)ノ
[Sun Mar 19 23:50:09 2006] [error] [client 6X.215.32.12] (24)Too many open files: file permissions deny server access: /export/home/www/public_html/xxx.html
[Sun Mar 19 23:50:11 2006] [error] [client 6X.236.103.72] (24)Too many open files: file permissions deny server access: /export/home/www/public_html/xxx.html
[Sun Mar 19 23:50:12 2006] [error] [client 21X.255.229.237] (24)Too many open files: file permissions deny server access: /export/home/www/public_html/aaa.html
Too many open files だそうです。はい。
とりあえず、Apacheを停止して、起動します。再起動はダメです。
# /etc/init.d/apachectl stop
# /etc/init.d/apachectl start
とりあえず、これで生き返りましたよ。
Helixのストリーミングサーバがたくさんファイルを扱っていたようで、デスクリプタを増やす必要あり。
1プロセスが開けるファイルが256と少ない。
# ulimit -a
core file size (blocks) unlimited
data seg size (kbytes) unlimited
file size (blocks) unlimited
open files 256
pipe size (512 bytes) 10
stack size (kbytes) 8192
cpu time (seconds) unlimited
max user processes 15877
virtual memory (kbytes) unlimited
ということで、1プロセスあたりのファイル・ディスクリプタの数を増やすために、/etc/system にあるシステム・パラメーターを変更する。これによりSolarisのスケーラビリティーを上げるのだ。
ファイル・ディスクリプターの数を 1024 にするために、以下の行を /etc/system のお尻に付け加えて、再起動すればOKだ。(電源を落とす時間が必要になるのが残念)
set rlim_fd_max=1024
■Apacheの設定を調べる
再起動後に、Apacheのコンパイル時の設定を調べる。256という制限が付いたようなので、もう一度コンパイルし直すか...。
# /usr/local/apache/bin/httpd -V
Server version: Apache/1.3.31 (Unix)
Server built: Aug 31 2004 17:49:27
Server's Module Magic Number: 19990320:16
Server compiled with....
-D HAVE_MMAP
-D USE_MMAP_SCOREBOARD
-D USE_MMAP_FILES
-D HAVE_FCNTL_SERIALIZED_ACCEPT
-D HAVE_SYSVSEM_SERIALIZED_ACCEPT
-D HAVE_PTHREAD_SERIALIZED_ACCEPT
-D DYNAMIC_MODULE_LIMIT=64
-D HARD_SERVER_LIMIT=256
-D SHARED_CORE
-D HTTPD_ROOT="/usr/local/apache"
-D SUEXEC_BIN="/usr/local/apache/bin/suexec"
-D SHARED_CORE_DIR="/usr/local/apache/libexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/httpd.scoreboard"
-D DEFAULT_LOCKFILE="logs/httpd.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
-D ACCESS_CONFIG_FILE="conf/access.conf"
-D RESOURCE_CONFIG_FILE="conf/srm.conf"
ちなみに入っているモジュールの一覧は、このように確認する。
# /usr/local/apache/bin/httpd -l
Compiled-in modules:
http_core.c
mod_env.c
mod_log_config.c
mod_mime.c
mod_negotiation.c
mod_status.c
mod_include.c
mod_autoindex.c
mod_dir.c
mod_cgi.c
mod_asis.c
mod_imap.c
mod_actions.c
mod_userdir.c
mod_alias.c
mod_access.c
mod_auth.c
mod_so.c
mod_setenvif.c
suexec: disabled; invalid wrapper /usr/local/apache/bin/suexec
ほとんど、ノーマル状態だな...。
ApacheのWebサーバ上のムービーや音声ファイルを素直にダウンロードさせたい。
<IfModule mod_mime.c>
AddType application/octet-stream mp4 m4v mov aac
</IfModule>
<VirtualHost *:80>〜</VirtualHost>内に記述可能なので、バーチャルホストごとに指定した方がよい思う。
存在しないWebページを表示させると、404 Not FoundメッセージとともにApacheのバージョン番号を表示してしまう。これを表示させない設定にしておく。
httpd.conf
ServerSignature Off
これでApacheのバージョン番号を非表示にできる。
loglotate.sh
#! /bin/sh
LOGFILES="access_log error_log script_log ssl_misc_log"
DATE=`date +%Y%m%d`
LOGDIR="/export/home/www/logs"
# ログファイルのバックアップ
for i in $LOGFILES
do
mv $LOGDIR/$i $LOGDIR/$i.$DATE
done
kill -HUP `cat /var/run/httpd.pid`
sync
for i in $LOGFILES
do
gzip $LOGDIR/$i.$DATE
done
for i in $LOGFILES
do
chown apache:apache $LOGDIR/$i
done
# crontab -e
# Crontab fields:
#
# minute (0-59),
# hour (0-23),
# day of the month (1-31),
# month of the year (1-12),
# day of the week (0-6 with 0=Sunday).
#
50 23 * * * /etc/cron.daily/logrotate.sh
中小規模の会社のWebマスターは、Apacheも自分で運用管理しないといけないのである。
しかし、1999年当時、Macがメイン環境だった自分が Webを運用するために Solaris や Linuxをさわることになり、色々と覚えなくてはいけない事があったので、似たような環境にある人のためにお勧めをメモしておくことにした。
○ Apacheに関する本を買ってくる。
○ telnet でログインすることを日常とする。(最初は、cdとexitコマンドが使えればよし)
○ httpd.conf を編集する事で全てをコントロールできる。逆を言えば、httpd.confを編集できないと、何もできない。
○ httpd.conf を編集するには、vi の使い方を覚える必要がある。(カーソルの移動、変更、保存くらいの最低限のものでよし)
○ Linux World を買うか、図書館で借りて眺める。(たぶん最初は何のことやらわからないので、眺める程度でよし)
まぁ、ftpソフトで、httpd.confを手元にダウンロードして編集後にアップすればいいんだけど、telnet と vi で作業するよりも数倍は時間がかかる。その時間で telnet と vi を学習した方が後々楽になりますな。
メールをポストするためのPerlでできたCGIが動かない!
原因は...cgi書類の改行コードがCRLFだった...。
ということで、LFに修正して無事に動作することを確認。
ちなみに、Apacheが吐き出す、error_logやscript_log(httpd.confの設定でログの名前が分かる)をtail -f コマンドで眺めながら、CGIの動作チェックをするとヒントが見つかるかも。
お試しあれ。
あるサイトにperlで書かれたCGIをのせてみると、動かない!
色々と工夫してみるものの、
"Internal Server Error" がブラウザに表示され、Apacheのログには、
"Premature end of script headers"
エラーが記録されている。
知り合いの、さらに知り合いのサイトで、サーバの情報は得られない。大塚商会さんのサーバということしか分からない。
.htaccessを設置して Options +ExecCGI を指定したが、ダメ。
結局、今回設置するCGIのディレクトリのアクセス権を変更する事で、無事に解決した。
utf-mailというディレクトリのアクセス権を以下のように変更した。
(修正前)
drwxrxxr-x utf-mail
(修正後)
drwxr-xr-x utf-mail
755や700だと、大丈夫だった。オーナー以外が書き込み権限を持てる775と777は許可されていないらしい。
このサーバー、どうもsuexecの設定を有効にしているみたい。
参考サイト:
http://httpd.apache.org/docs/2.0/ja/howto/cgi.html
テストに使用した簡単なCGI。
test.cgi
#! /usr/bin/perl
print "Content-type:text/html\n\n";
print "test";
ポイントは、 1行目のパスを/usr/bin/perlか/usr/local/bin/perlなど、環境に合わせる。
次のポイントは、Content-typeを含み、後に空行の続くHTTPヘッダ を吐き出すこと。
755を指定するのを忘れずに。(場合によっては700)
Webサーバ上のファイルのパーミッション(アクセス権)を一括で変更したい。ということがよくある。
$ ls -l
drwxr-sr-x 2 towns3 other 512 Oct 18 18:23 images
$ chmod g-s images
drwxr-sr-xとなっているディレクトリを確認する。
find . -type d -perm -02000
find . -type d -perm -02000 -print | xargs -i ls -ld {}
drwxr-sr-x 2 apache apache 512 Jan 27 2005 ./imeges
drwxr-sr-x 2 apache apache 1024 Nov 13 2002 ./products
一括でsを外す。
find . -type d -perm -02000 -print | xargs -i chmod g-s {}
SiteTrackerなど、Web上のレポート結果をExcelに貼り付けたいときに便利。
とにかくWebページ上のテーブルを簡単にExcelへ持っていけるので、これは知っておくと便利。
1. 書き出したいテーブルの上で、右クリックして、 「Export to Microsoft Excel」 を選択する。
2. Excelが起動して、テーブルが取り込まれる。
3. 目的と違うテーブルがコピーされてしまったら、Excel上に表示されている 「外部データ」 の1番目のアイコン 「Webクエリの編集」 で、目的のテーブルにチェックを入れて 「取り込みボタン」 を押す。
Windows用のIE6で確認。
レポートを書くときに使うことがあるExcel。
いつも思い出せないショートカットをメモ。
Ctrl + Enter セル内での改行。
Ctrl + ↓ 表の一番下まで移動。(データが入力されているところが対象)
Ctrl + Shift + Space 表を選択。
Ctrl + ; 今日の日付
Ctrl + : 今の時間
上司は言う。
「ドメイン、今度変わるからね。」
「この商品名Aを商品名Bに全ページ、置換えてね。」
「イメージチェンジで、全部のヘッダ、フッタを置換えてね。」
など、簡単に言ってくれるのが世の中の常。
で、1,000ページ以上のhtmlページのドメイン名を一括変更する例を紹介。
まず、シェルスクリプトを作る。
change_string.sh
#! /bin/sh
# 2003.12.02
# Y.Sasaki
# 使い方
# ./change_string.sh
# hoge.com を foo.com に一括変更するシェルスクリプト
# ディレクトリの指定を自分の環境に合わせること
for i in `find /export/home/web/htdocs -name '*.html' -print`; do
cp -pf $i $i.new;
sed 's@hoge.com@foo.com@g' $i > $i.new && mv $i.new $i;
done
対象ディレクトリ: /export/home/web/htdocs/*
対象ファイル名: *.html
置換える文字: hoge.com を foo.com に置換える。
$ chmod +x change_string.sh
$ ./change_string.sh
対象ディレクトリを /export/home/web/htdocs2 などとcp -prf でコピっておいてテストするとよかれ。
数千ページにおよぶhtmlファイルから、ある特定の検索ワードを含むページ名を取得する。
現在のディレクトリ以下で、catalog.pdf を含んでいるファイルをリストアップする。
$ grep -l catalog.pdf *.html
-l(ハイフン・エル)オプションで、検索結果をファイル名として表示してくれる。
サブディレクトリ(サブフォルダ)以下は、検索対象にならない。
public_htmlディレクトリ以下、全てにわたって、catalog.pdf を含んでいるHTMLファイルをリストアップする。
$ find public_html -name "*.html" | xargs -i grep -l catalog.pdf {}
公開Webサイト内のhtmlファイルだけを検索して別のディレクトリにコピーしたい。
findを使う方法と、rsyncを使う方法を考えてみた。
$ find htdocs_a -name "*.html"
これで一覧されることを確認。このファイルを別のディレクトリにコピーしたい。
htdocs_bディレクトリを作ってから、実際にコピーする。
$ cp -P `find htdocs_a -name "*.html"` htdocs_b
cp -P は、Solarisで使えないので以下の rsync を使ってコピーする。
htdocs_aは、既に存在しているHTMLドキュメントディレクトリ。
htdocs_bは、コピー先のディレクトリでrsyncが作ってくれる。
まずは、全コピーを確認する。
$ rsync -av htdocs_a/ htdocs_b
htdocs_aの後ろにスラッシュを付けた場合: htdocs_aより下のファイルがコピーされる。
htdocs_aの後ろにスラッシュを付けない場合: htdocs_aというディレクトリが作られる。
うまくいったら、htdocs_bを削除しておいて、本番を実行する。
$ rsync -av --include "*/" --include "*.html" --exclude "*" htdocs_a/ htdocs_b
--include "*/" htdocs_aを基点ディレクトリとして、全てのディレクトリをコピーする。
--include "*.html" HTMLファイルをコピーする。
--exclude "*" include指定以外のファイルを除去する。
perlについてのメモ。
一括変更のときに、コマンドオプションがどんな働きをするかを参照できるようにメモしておく。
$perl -e ' print "Hello!?n" '
-pでループと同じ働きを繰り返しさせる。
$perl -pe 1 index.html
-eと合わせて、コマンドラインで指定されたファイルごとに命令を実行。
上記の1はperlの命令のreturn 1;と同じ命令で、index.htmlの中身を1行ずつ繰り返しプリントする。
このループの働きと同じ。
LINE:
while (<>) {
# ここのコマンド
} continue {
print or die "-p destination: $!?n" ;
}
ファイル名は別名で保存する必要があるので、index_new.htmlとする。
$ perl -pe 's/#FFFFFF/#333333/g' index.html > index_new.html
たくさんファイルがあると、上記方法だとキーボードをたたく指が疲れるので、-iを組み合わせて使う。
$ perl -pi -e 's/#FFFFFF/#333333/g' index.html
ありがたいことに複数ファイルも対応できるので、
$ perl -pi -e 's/#FFFFFF/#333333/g' *.html
心配だからバックアップをとりながら、というときは、
$ perl -pi.BAK -e 's/#FFFFFF/#333333/g' *.html
ちょっと待てよ、#FFFFFFじゃなくて、#ffffffで指定してるのもあったというときは、iでマッチングさせる。
$ perl -pi.BAK -e 's/#FFFFFF/#333333/i' *.html
カレントディレクトリだけじゃなくて、htmlの入った全部のディレクトリを一括で変更したいときはfindで見つけたファイルをperlに送り込む。xagsを使えば橋渡しをしてくれる。 最初に確認。
$ find /home/myname/public_html -name "*.html"
次に本番実行。
$ find /home/myname/public_html -name "*.html" | xargs perl -pi -e 's/#FFFFFF/#333333/g'
数千ページにおよぶhtmlファイルを変更したくなったとき、たった一行のシェルスクリプトやperlが大活躍!!
単語の一括置換えは、非常に便利。
現在のディレクトリ以下で、aaa.jpgを含んでいるファイルをリストアップする。
$ grep -l aaa.jpg *.html
public_htmlディレクトリ以下、全てにわたって、aaa.jpgを含んでいるファイルをリストアップする。
$ find public_html -name "*.html" | xargs -i grep -l aaa.jpg {}Macのターミナルでは、xargsの-iオプションは付けないで実行できた。最後の{}も省略する。
aaa.jpg を bbb.jpg に置換える。
$ find . -name "*.html" | xargs perl -pi -e 's/aaa.jpg/bbb.jpg/g'
たった1行で何千ページでもするっとaaa.jpgをbbb.jpgへ置き換えてくれる!!!
IPアドレス を ホスト名 に置換える。
$ find . -name "*.html" | xargs perl -pi -e 's/192.168.12.34/www.mydomain.co.jp/g'
実行前に必ずバックアップをとっておく。
% cp -prf public_html public_html.BAK
Safari, FireFoxで、きちんとページ内リンク(/index.html#aaa)が動作するのに、WindowsのIE6だと動作しない。ページトップが表示されてしまうのだ。
原因が分かった。
× ダメなリンク先
<h3>タイトル</h3>
<a name="aaa"></a>
○ 動作するリンク先
<h3>タイトル</h3>
<br>
<a name="aaa"></a>
たく、バカIE。
Webコンテンツやログファイル等の定期的なバックアップに。
適当なディレクトリで、FTPを実行してバックアップしたいファイルをダウンロードできることを確認する。
$ /usr/local/bin/ncftpget -u ユーザ名 -p 'パスワード' -R ftp://サーバ名/public_html/
public_html以下に大量にファイルがある場合、ダウンロードが始まるまで時間がかかる。
バックアップ先は、外付けハードディスクの場合 ls -l /Volumes/ でマウント名を確認しておく。
バックアップ先: /Volumes/Backup/www/20080413/ (日付ディレクトリを毎回作る)
スクリプト保存場所: /Users/MyName/Scripts/backup.sh
FTPのログ: /Users/MyName/Scripts/backup.log
バックアップ元: ftp://サーバ名/ログイン時に指定したいディレクトリ/
backup.sh
#!/bin/sh
# バックアップ先、ログファイルを指定する
BACKUP_DIR=/Volumes/Backup/www
FTP_LOG=/Users/MyName/Scripts/get_backup.log
# 今日の日付でディレクトリを作る
DATE=`date +%Y%m%d`
mkdir $BACKUP_DIR/$DATE
cd $BACKUP_DIR/$DATE
# FTP開始時刻をログに記入する
echo "###########################" >> $FTP_LOG
echo BACKUP START: `date` >> $FTP_LOG
# FTPでデータをダウンロードする
/usr/local/bin/ncftpget -u MyName -p 'Password' -R ftp://192.168.1.123/public_html/
# ログに終了時刻をログ記入する
echo BACKUP END: `date` >> $FTP_LOG
echo "" >> $FTP_LOG
echo "" >> $FTP_LOG
FTP先のホームディレクトリのpublic_htmlディレクトリを指定する場合、
ftp://サーバ名/public_html/
FTP先のホームディレクリではなく、上位のディレクトリ(ルートディレクトリや/etcなど)を指定する場合、
ftp://サーバ名/../../etc/
というように../で指定する。
chmod 700 backup.shで実行権を与えておくのを忘れずに。
◎ crontab -e で毎朝7時に実行する。
0 7 * * * nice -n 10 $HOME/Scripts/backup.sh > /dev/null
◎ 毎週日曜日の朝7時に実行する場合。(0〜6で、日〜土を表す)
0 7 * * 0 nice -n 10 $HOME/Scripts/backup.sh > /dev/null
◎ 毎月1日の朝7時に実行する場合。
0 7 1 * * nice -n 10 $HOME/Scripts/backup.sh > /dev/null
どうも最近のWindows用ブラウザ・インターネットエクスプローラでQuickTimeムービーが正常に自動再生されないことが多い。ムービー上に余計なメッセージを表示してくれたりすることもある。
で、Webページに埋め込んだQuickTimeを再生するためにJavaScriptを使う対策をとった。
http://developer.apple.com/internet/ieembedprep.html
ページ中程の Download the JavaScript files. をクリックしてダウンロードする。
ダウンロードしたzipファイルを解凍して、AC_QuickTime.jsを取り出す。
このようなファイルの配置だと仮定する。
http://www.mydomain.co.jp/AC_QuickTime.js
http://www.mydomain.co.jp/index.html
http://www.mydomain.co.jp/sample.mov
index.htmlの中身
<head>
<title>QuickTimeをページ内に表示する</title>
<!-- ▼JavaScriptファイルをロードする▼ -->
<script xsrc="AC_QuickTime.js" language="JavaScript" type="text/javascript"></script>
</head>
<body>
<!-- ▼ムービーを表示する▼ -->
<script language="JavaScript" type="text/javascript">
QT_WriteOBJECT_XHTML('sample.mov','320','256','',
'controller','TRUE','target','myself','type','video/quicktime');
</script>
</body>
</html>
以上で、ムービーがInternet Explorerでも表示、再生されるようになる。
QT_WriteOBJECT_XHTML('sample.mov','320','256','',
'controller','TRUE','target','myself','type','video/quicktime');
1番目: sample.mov(ムービーを指定する。http://から始まるフルパス指定でもOK)
2番目: 320(ムービーの横幅)
3番目: 256(ムービーの高さ240に16を足す。コントローラは高さ16ピクセルなので)
4番目: ActiveXのバージョン。空欄にしておくと、codebaseの指定を勝手にしてくれる。
codebase = http://www.apple.com/qtactivex/qtplugin.cab#version="6,0,2,0"
5番目以降: NAMEとVALUEのペアで指定すること。
5,6番目: 'controller', 'TRUE' なので以下の設定になる。
<PARAM NAME="controller" VALUE="TRUE">
7,8番目: 'target', 'myself' なので以下の設定になる。
<PARAM NAME="target" VALUE="myself">
9,10番目: 'type', 'video/quicktime' なので以下の設定になる。
<PARAM NAME="type" VALUE="video/quicktime">
その他、便利な指定項目
hspace, vspace, border, pluginspage
AC_QuickTime.jsを見れば、JavaScriptを知らなくてもなんとなく分かると思います。
(XHTMLを指定しない、QT_WriteOBJECTも使える)
「このWebページでActiveXコントロールを実行するにはクリックしてください」とういうアラートが出る。
http://faq.stream.co.jp/faq/q007.html
MiracleLinux2.1から、Intel Solaris 10へSiteTracker7を引っ越した。ところが、どっこいプロファイルの更新を行うと、エラー発生。
だとさ。コマンドラインでプロファイルの更新を行うと、
Importing /home2/log_www/ALL/access_20050604 (NCSA Common / Combined)...
79%
Importing 2005N 6
..
79% 79%
Importing /home2/log_www/ALL/access_20050605 (NCSA Common / Combined)...
Importing 2005N 6
..
79% 79%
Importing /home2/log_www/ALL/access_20050606 (NCSA Common / Combined)...
Importing 2005N 6
..
79% 79% 79% 79% 79% 79% セグメント例外 (core dumped)
bash-3.00#
と、コアダンプまでしてくれます。
この問題のある2005年6月6日のログをのぞいてびつくり。
すっごい長い一行を発見! 。。。( ̄▽ ̄;)y-~
< 192.203.134.32 - - [06/Jun/2005:23:57:36 +0900] "GET /http-2.AAAAAAAAAAAAAA 延々と続く AAAAAAAAAAAAAAAAAA" 414 341 "-" "-"
8179文字も「A」が続いてた。_| ̄|○
MiracleLinux2.1で、ちゃんと動いてたのになー。
$ cat access_20050606 | wc -l
30375
$ cat access_20050606 | grep 192.203.134.32 | wc -l
2109
$ cat access_20050606 | grep -v 192.203.134.32 | wc -l
28266
$ cat access_20050606 | grep -v 192.203.134.32 > access_20050606.NEW
# ./nettracker myProfile -abort
# ./nettracker myProfile -clear
# ./nettracker myProfile -reindex
# ./nettracker myProfile -update
6月6日のログファイルは、きれいにしたのに6月6日のファイルでやはりとまってしまう。次の原因は6月7日のログにも発見された。どうも6月7日のログを読み込み始めたところでエラーを起こすのだが、シェル上ではその状態を表示する前に、サイトトラッカーがお亡くなりになってしまうようだ。うーん、てこずったぜい。
SiteTracker(サイトトラッカー)をバージョン7からバージョン8にアップするときに、ログをインポートし直した。
そしたら、2002年から2007年6月までの、5年半のログをインポートするのに3ヶ月かかりました。3日じゃありません。3ヶ月です。
バージョンアップする度に、3ヶ月間、新しいバージョンのソフトが使えないということになる(笑)。
なんとかならんもんかと思って、アスキーのサポートに聞いたところ、
●「1回の更新でインポートするログファイルの合計サイズを200MB程度以下にする」
●「ログファイル数は、100個以下にする」
と良いのだそうです。
Sun V440 (メモリ8GB)のマシンなのに、わざわざ200MB以下にログを小分けにしなければならないのは、悲しい。
ま、仕方ないので、
2002.log
2003.log
3004.log
2005.log
2006.log
と年ごとのファイルにしてあるものを
200201.log 200202.log 200203.log 200204.log 200205.log ...
と小分けにすることにした。
各ファイルが200MBを越えていたら、更に小分けにする必要があるが、
「インポート時にエラーが発生しなければ200MBを越えていてもかまわない」
そうだ。OSやマシンスペックによって異なるとのこと。ターミナルで nettracker [profile] -update して、エラーが発生しなければ良いそうだ。
「一度にインポートする量が200MB程度以下」
なので、一日ごとにログファイルが分かれていて、それぞれが1MBのファイル
20070101.log 1MB
20070102.log 1MB
20070103.log 1MB
...
の場合、
1MB × 200日分 = 200MB
となる。
200日分以上をまとめてインポートできそうだが、ログファイル数が100を越えているので、100日分だけインポートすること。
200301.log 60MB
200302.log 60MB
200303.log 60MB
200304.log 60MB
...
60MB × 3ヶ月分 = 180MB
となる。
3ヶ月分ずつ、インポートすること。
プロファイル編集で、
/path/to/logs/2003/*
のように正規表現を利用して指定する方法が簡単。
インポートする対象のログファイル。
/path/to/logs/2003/200301.log
/path/to/logs/2003/200302.log
/path/to/logs/2003/200303.log
インポートしないファイルは一時的に他のディレクトリに移動しておく。
/path/to/logs/2003/tmp/200304.log
/path/to/logs/2003/tmp/200305.log
/path/to/logs/2003/tmp/200307.log
...
このようにログを置いておけば、1月から3月までがインポートされ、tmp以下は処理されない。
インポート処理が終わったら、tmpディレクトリからまた3ヶ月分を取り出してインポート処理を続ける。
Importing 2003年 10月...
59% 64% 69% [*] 75% 80% [*] 85% 90% [*] 96% (100%)
のように [*] が表示されることがある。
これは、ログファイルのインポートに時間がかかり、進行パーセント表示を行う代わりに、[*] を表示するそうだ。処理は正常に行われているので心配しなくてよい。
もし、表示がこのように長く続く場合は、ログファイル合計サイズを200MB以下にする。ログファイル数を100個以下にした方がよい。[*] を吐き出すという無駄な処理にCPUを使うのはインポート時間を長引かせるだけだから。
[*] [*] [*] [*] [*] [*] [*] [*] [*] [*] [*] [*]
[*] [*] [*] [*] [*] [*] [*] [*] [*] [*] [*] [*]
[*] [*] [*] [*] [*] [*] [*] [*] [*] [*] [*] [*]
ちゃんと計測していないが、 [*]マークが続いたときは、ログファイルを小さくしてインポートし直した方が体感的にだいぶ早かった。
更新処理を行う。
./nettracker プロファイル英語名 -update
プロファイルから解析済みデータを削除する。
./nettracker プロファイル英語名 -clear
処理を止める。root権限で、
./nettracker プロファイル英語名 -abort
解凍したときの生ログのファイルサイズで計算すること。
例えば、gzファイルのサイズが、
200301.log.gz 6MB
200302.log.gz 6MB
200303.log.gz 6MB
の場合、解凍したときに
200301.log 60MB
200302.log 60MB
200303.log 60MB
となれば、18MBではなく、180MBのログファイルと換算して、ログファイルをインポートする。
それにしても、200MB、100ファイルまでなんていう制限は低すぎないか...?
ちなみにアスキーさんに聞いたら、Oracle版SiteTrackerでも200MB、100ファイルの制限で取り込むそうです。
SiteTracker(サイトトラッカー)をApacheのアクセスログ解析に使っている。便利で気に入っているのは、ドリルダウンして詳細に調べていけるところと、自動でログレポートをメールしてくれるところ。サーバにインストールするタイプなので、ブラウザだけあればログの解析結果が見れるので、Mac, Win, Unix, LinuxなどOS環境を選ばない。日本ではアスキーさんが扱っている。
バージョン7.5から、値段が急激に高くなってしまったのが残念。ということで、いまだに7.0を使い続けています。
2007年の1月ころに新バージョンが発売されるという噂があるが、高かったらバージョンアップせずにVisionalistとか他の解析ソフトを新規購入する方が得かも。
ワタシも1999年までは、UNIX、LINUXはサパーリわかりませんでした。
中小企業の何でもやらなければいけないWebマスターはUNIXをさわらざるを得ないシーンがあります。というか、UNIXを知っていれば3日かかっていた作業が1時間ですむのです。
とりあえず、これでも見て興味を持つことから始めましょ。
マーケティング
商売
自サイトを丸ごとバックアップしたり、あるディレクトリ以下をダウンロードして加工したいときがたまにある。
# cd /usr/local/
# tar zxvf wget-1.10.2.tar.gz
# cd wget-1.10.2
# ./configure
# make
# make install
インストールされる場所。
/usr/local/bin/wget
$ wget -r -l 0 http://www.mysite.co.jp/index.html
-r --recursive ということで、再起的に取得する。
-l --level リンクをたどる階層数を指定する。デフォルトは5階層で、0を指定すると全階層。
$ wget -r -np http://www.mysite.co.jp/path/to/index.html
-np --no-parent ということで、親ディレクトリは無視する。
素晴らしくわかりやすいオプションの一覧ページ。
http://members.at.infoseek.co.jp/futora/wget153/option.html
http://members.at.infoseek.co.jp/futora/wget153/
Macにデフォルトで入っているので、wgetの代わりにすぐに使える。
1つのファイルをダウンロードしたいときに便利。
http://www.big.or.jp/~crane/cocoa/0800_internet/curl/
Linuxでの作業なので grep を使っています。Solaris10での作業は、/usr/bin/egrep で。
社内アクセスを emp.log として保存する
社内のIPアドレスが、192.168.* の場合、
$ grep ^192.168 access_log > emp.log
apacheのアクセスログは、行頭にIPアドレスを記述するので、192.168の前に ^ を付ける。
お客様からのアクセスのみを customer.log として保存する
$ grep -v ^192.168 access_log > customer.log
複数のログファイルがあるとき、
例えば、access_log.20061101, access_log.20061102, access_log.20061103...
$ grep -h -v ^192.168 access_log.* > customer.log
access_log.* と指定して複数ログを対象にする。
-hオプションで、ファイル名の出力を抑制する。
社内のIPアドレスが複数あるとき、
例えば、192.168.* と 172.16.* と abc.co.jp だとする。この3つのアクセスを除外したい。
最初にパターンファイルを作っておく。テキストエディタで新規にpattern.txtを作る。中身は、
^192.168.
^172.16.
^abc.co.jp
そして、grepを実行する。
$ grep -v -f pattern.txt access_log > customer.log
-f オプションで、パターンファイルを指定する。これで複数の条件を指定できる。
-v オプションで、パターンにマッチしたものを除外する。
上記3の方法は、ログファイルが一個のときのやりかた。
ログファイルが複数あるときは、このように。(2007年の複数ログファイルの場合)
$ grep -h -v -f pattern.txt access_2007* > customer_2007.log
grepのパターンマッチを利用する。
特定ファイルを対象としたログを取得して、そのファイルだけをSiteTrackerなどで分析する事もたまにある。
トップページへのアクセスを top.log として保存する。
$ grep "GET /index.html" access_log > top.log
複数の特定ページを pattern.txt として新規ファイルを作る。内容は、
GET /index.html
GET /news/index.html
GET /news/20061125.html
Apacheのログの記録の仕方が、GET /xxxx となっているためこのように記述する。
特定ページへのアクセスを tokutei.log として保存する。
$ grep -f pattern.txt access_log > tokutei.log
-f オプションで、複数パターンを指定できる。
2006年の複数ログファイルから、index.htmlへのアクセスログを取得する。
$ grep -h "GET /index.html" access_2006* > top.log
-h オプションで、ログファイル名をtop.logの中に出力しない。
(製作中)
サイトを制作する前に ”必ず” 確認しておいた方が製作者の身のためですわ。これを確認しないがために、後でログ解析しようにも何をもって、うまくいっているのか、うまくいっていないのか、が不明瞭になりログレポートもぼんやりとしたものになってしまうんですなぁー。
Webサイト以外にも宣伝などに利用しているメディアを把握することで、メディアミックス戦略も考慮して、相互に効果をあげたいじゃぁありませんか!
ホームページ持っていない会社が、インターネット広告なんか出すんかい? と思われる方も多いかと...。意外とあるんですわ。 結局、電話でのお問い合わせが無いと商売に結びつかない企業がコレに当たるのよ。 何だと思う? 弁護士、消費者金融、など探せばいろいろあります。
シェルスクリプトを使って、Webマスター作業を楽にするために、ちょこちょこっと学ぶだけでかなり楽になる。バックアップの自動化。Apacheのログを日毎に分ける。ログ解析用にApacheログを毎晩、ftpで拾ってくる。ログ解析ソフトを毎晩自動解析させる。などなど。
で、シェルスクリプトの書き方は忘れてしまうので、どんな書き方すればいいんだっけ?となり、このリンク集が役に立つのであった。
■基本編
サーバに新規サイトを構築した。メールも送受信できるように設定した。
という状況になった。
調べた結果、ホスティングのファイアウォールが原因ということが分かったので、ファイアウォールのルール変更依頼で解決した。
今回原因を探るため
を調査したのでメモとして残しておく。
他マシンでDNSが運用されている場合、named.conf等を調べることが難しい。digやnslookup等で設定が正しいかを確認する。
$ dig -t mx mydomain.co.jp
$ nslookup
> set q=mx
> mydomain.co.jp
mydomain.co.jp mail exchanger = 10 mail.mydomain.co.jp. のように結果が返されればOK。
exitを入力すると、nslookupは終了する。
自マシンでDNSを構築している場合は、
/etc/named.conf
ゾーンファイル
を調べる。
外部から25番ポートが開いているかをtelnetで調べる。
$ telnet 192.168.1.123 25
220 foo.mydomain.co.jp ESMTP Postfix のように結果が返されればOK。
quitを入力すると接続は終了する。
ドリームウェーバーで「サイト全体のリンクチェック...」を実行すると「リンク切れリスト(単独ファイルリスト)」を作ってくれる。
こんな感じのリスト
images/old.jpg
images/very_old.jpg
diary/old.html
diary/very_old.html
...
このリストが 1万6千行もあった(おいおい!)ので、削除する。
さすがに手作業で消すには社会保険庁の年金照合作業のような気がするので、シェルスクリプトか、Perlスクリプトで一気に消したい。
流れは以下の通り。
1. リンク切れリストの改行をLFにして保存する。 (list.txtという名前)
2. リンク切れリストをhtmlドキュメントルートに置く。(FTPでアップしておく)
3. htmlドキュメントルートに移動して、リンク切れリスト内のファイルを削除していく。
(ドキュメントルートは、/home/web/puclic_htmlとする)
$ cd /home/web/public_html/
$ cat list.txt (確認しておく)
$ cat list.txt | xargs rm -f {}
※ 必ず、バックアップしたディレクトリで実験してから本番を行うこと。
※ robots.txtが削除リストに入っているので消しておく。
結局、rubyやperlのお世話になるまでもなかった...。
ストリーミングで使っているサーバーからログをダウンロードすると一日ごとに1ファイルになっているのだ。それがzipで圧縮してあるので、丸一年分を解凍しようとしたらやたら面倒くさいのであった。そこでまとめて解凍する方法をメモしておいた。
ls *.zip | xargs --max-args=1 unzip
ls *.zip | xargs --max-args=1 unzip -d LogFolder
unzipとzipは、インストールしてなかったのでRPMで入れておいた。 findコマンドと組み合わせてもよし。 --max-args=1というのがツボ。
MacOS Xの10.3以降ならファインダの検索を使ってまとめて〜.logというファイルを移動できたりするので楽ちん。
Webコンテンツで、いらないファイル、一時ファイルなどをまとめて削除したいときがある。
まず、ちゃんと確認しておくこと。
$ find /home/web/ -name "*.dat" -exec ls -l {} \;
確認してOKだったら、削除を実行する。
$ find /home/web/ -name "*.dat" -exec rm -rf {} \;
crontabに書いておく。(一行で記述する)
15分ごとに実行させる場合の書き方。(Solaris10で稼動確認済み)
0,15,30,45 * * * * /usr/bin/find /home/web
-name "*.dat" -exec rm -rf {} \; > /dev/null 2>&1
安定稼動を確認するまでは、2>&1 を付けないでおくとエラー発生時にメールを受け取るkとができるのでおすすめ。