2012年12月10日

PHPでメール送信エラーを取得する

SMTPサーバーと直接対話してメール送信する PHP コード誰か書いていないかな?と探してみたら、ありました。
『KLab若手エンジニアの これなぁに?』というブログの「SMTPクライアントを書いてみた
ありがたや。

HELO コマンドは自ホスト名を投げるのが正しいと思うのと、EHLOを使うのがよいようなのでその部分を改変し、メールヘッダーのところをちょっといじって、エンコーディングの扱いを工夫すれば使えそう。
posted by K/I at 16:19 | 東京 ☀ | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2012年10月04日

Flash Media Serverでの動画ライブ配信

先日の記事で Flash Media Server をインストールしたが、それだけでは動画のライブ配信はできない。
今回は、Flash Media Live Encoder を使ってライブ配信を試してみたい。
【関連記事】

※動画ストリーミング配信には Flash Player 10.1 以上が必要なので、もしインストールしていなければインストールしておく。

1. Flash Media Live Encoderのインストール

まず、AdobeのホームページからFlash Media Live Encoderを探し、ダウンロード&インストールする。

Flash Media Live Encoder #01

必要であれば、認証アドオンもダウンロード&インストールする (今回は行わなかった)。
Flash Media Live Encoder #02

Flash Media Live Encoder #03

Flash Media Live Encoder #04

Flash Media Live Encoder #05

Flash Media Live Encoder #06
※キャプチャー画像は Mac OS X のものだが、Windows でも手順は同じ。

2. Flash Media Encoderの設定

以下の設定手順は HTTP 経由でシングルストリームのライブ配信する場合のもの。
Flash Media Server のホスト名は test.jp とする。
  1. Flash Media Live Encoder は閉じておく。
  2. Flash Media Live Encoder の設定ファイル
    (インストール先)\conf\config.xml
    をテキストエディタで開き、タグ
    //flashmedialiveencoder_config/mbrconfig/streamsynchronization/enable
    true にして保存する。
  3. Flash Media Live Encoder を起動する。
  4. "Encoding Options" パネルの [Preset] プルダウンから "High Bandwidth (800 Kbps) - H.264" を選ぶ。
  5. [Audio]-[Format] は "AAC" を選ぶ。
    ※と、Adobe のサイトには書かれているが、"Mp3" でもうまくいくみたい。
    Windows 版で "AAC" 使うには別途エンコーダー (有料) が必要。
  6. [Video]-[Format] の右にあるレンチアイコンをクリックして "Advanced Encoder Settings" ダイアログを開き、[Keyframe Frequency] を "4 seconds" とする (この値は、applications/livepkgr/events/_definst_/liveevent/Event.xml の <FragmentDuration> の値 (デフォルト値 4000 ミリ秒) の整数倍にする)。
  7. [Stream to Flash Media Server]-[FMS URL] に "rtmp://test.jp/livepkgr" と入力する。
  8. [Stream to Flash Media Server]-[Stream] に "livestream?adbe-record-mode=record&adbe-live-event=liveevent" と入力する。
  9. [Stream to Flash Media Server]-[Save to File] のチェックをはずす。
  10. [Start] ボタンをクリックする。
Flash Media Server の Administartion Console の View Applications の Streams にストリームが表示されれば準備完了。
Flash Media Live Encoder #07

3. 埋め込み用コードの作成

Flash Media Server のインストール先にある samples/videoPlayer ディレクトリを Web 経由で見られるところにコピーする (ここでは http://test.jp/fms/samples/videoPlayer とする)。
そして、Web ブラウザーで
http://test.jp/fms/samples/videoPlayer/videoplayer.html
にアクセスする。
Flash Media Live Encoder #08
動画エリアの下の "STREAM YOUR OWN VIDEO" の [STREAM URL] に
http://test.jp:8134/hds-live/livepkgr/_definst_/liveevent/livestream.f4m
と入力し、[LIVE] にチェックを入れて [PLAY STREAM] ボタンをクリックする。
正常に設定できていれば動画エリアにライブ映像が表示される。

表示されない場合は、[STREAM URL] に入力した URL を直接 Web ブラウザーで表示させてみる。
正しければ、XML 形式のマニフェストファイルが表示されるはずである。

ページ下部に埋め込み用コードが表示されるので、それをコピーして任意のページにペーストすれば、ライブ配信ページが作れる。
Flash Media Live Encoder #09

コードを見ればわかるとおり、
swfs/StrobeMediaPlayback.swf
が必要なので、このファイルを適当な場所に設置して使う。

なお、サーバーが Development Server の場合は映像は30分で切断される (10分という記述を見かけたが、試したら30分だった)。

4. トラブルシューティング

4.1. Flash Media Playback Setup でエラーとなる
上記の例では Flash Media Server 同梱のサンプルコードを使って埋め込みコードを生成したが、Flash Media Playback Setup ( http://www.osmf.org/configurator/fmp/ ) も利用できる。
Flash Media Playback Setup で "We are having problems with..." というエラーが出る場合は、クロスドメインポリシーを疑ってみる必要がある。
【参考】
さわいじり
クロスドメインポリシーファイル(crossdomain.xml)設定について
クロスドメインポリシーは、Flash Media Server の (インストール先)/webroot/crossdomain.xml というファイルで設定される (デフォルト設定の場合)。
このファイルで、www.osmf.org からのアクセスが許可されているか確認する。
もしファイル自体が存在しなければ自前で作成する。
内容は以下のようなもの。
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM
"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
上記の例では、あらゆるドメインからのアクセスを許可している。
4.2. Buffering... と表示されたまま映像が表示されない
原因はいろいろあるらしいが、一度ハマると解決しにくいのが以下の例。

Flash Media Live Encoder の [Stream] の 値を livestream?adbe-live-event=liveevent (これが Adobe の解説に書かれている設定値) としている場合、配信時間が 30 分を超えると Flash Media Server のログ (logs/core.00.log) に:
Failed to record livestream (disk quota exceeded).
というエラーが出て動画配信ができなくなる。

こうなった場合は、
applications/livepkgr/streams/_definst_/livestream
内のファイルをすべて削除してサーバーを再起動すれば、また配信できるようになる。

[Stream] の値を "livestream?adbe-record-mode=record&adbe-live-event=liveevent" に変更して配信しなおしても解消する。
posted by K/I at 23:34 | 東京 ☁ | Comment(12) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2012年10月03日

Adobe Flash Media Server をレンタルサーバー (Linux) にインストールする

先日は Windows 7 で Flash Media Server を試したが、使った Windows 7 マシンが遅すぎてたまらないのでレンタルサーバーにインストールすることにした。
【関連記事】
Adobe Flash Media Server のインストール (Windows 7)
今回使用したサーバーはさくらインターネットの VPS で、OS は CentOS 5.7。
インストールした Flash Media Server のバージョンは 4.5.0。
インストーラーの入手方法は Windows 7 のときと同じなので割愛する。

インストール

インストーラーの ZIP ファイルを解凍すると linux というディレクトリがあり、その中に FlashMediaServer4.5_x64.tar.gz があるのでそれを解凍する。
# unzip -d FlashMediaDevServer_4_5_all FlashMediaDevServer_4_5_all.zip
# cd FlashMediaDevServer_4_5_all/linux
# tar zxvf FlashMediaServer4.5_x64.tar.gz
# cd FMS_4_5_0_r297
FMS_4_5_0_r297 ディレクトリ内の installFMS を実行して インストールする。
インストールの際、以下の2点に注意:
  • 試用版としてインストールする場合は、シリアル番号は入力不要
  • レンタルサーバーの場合すでに Web サーバーが 80 番を使用している場合が多いと思うので、Apache は別のポートを指定する (ここでは 8080 とした)。
# ./installFMS

Copyright(C) 1993-2011 Adobe Systems Incorporated. All rights reserved.

Adobe Flash Media Server 4.5 for Linux

Adobe Flash Media Server 4.5 will be installed on this machine.

You will be asked a series of questions during the install
process and will be presented with the defaults for these questions.

Support is available at http://www.adobe.com/go/flashmediaserver_en

To install Adobe Flash Media Server now, press ENTER.

To cancel the installation at any time, press Control-C.

(<ENTER> キー)
ADOBE FLASH MEDIA SERVER

End User License Agreement

NOTICE TO USER: THIS END USER LICENSE AGREEMENT (?AGREEMENT?) GOVERNS INSTALLATION AND USE BY LICENSEES OF THE ADOBE SOFTWARE DESCRIBED HEREIN...

Do you agree with the license agreement? (y/n): y

Please enter your Adobe Flash Media Server 4.5 serial number.

(<ENTER> キー)
You have not entered a serial number. Falling back to
the Adobe Flash Media Development Server!

Would you like to try again? y/n: Default [n]: (<ENTER> キー)

Adobe Flash Media Server 4.5 requires approximately 200MB of
disk space.

The installer will install Adobe Flash Media Server 4.5 in the
following directory
Default [/opt/adobe/fms]: (<ENTER> キー)


The Adobe Flash Media Server communicates on the IANA-assigned
port of 1935, which is the port most Flash applications expect,
and can also communicate on port 80
over RTMPT, HTTP webserver proxy, and for HTTP Dynamic Streaming origin services.

Please enter the Adobe Flash Media Server port(s), comma-separated
Default [1935,80]: 1935,8080

Please enter the port to use for the Admin service. You can only specify one
admin port.
Default [1111]: (<ENTER> キー)


The administrative user name and password you provide here is required to use
the Adobe Flash Media Server Management Console for
administration, monitoring, and debugging.

Please enter the administrative username: admin

For increased security, enter a password of at least 8 characters.
Please enter the administrative password: (パスワード入力)
Confirm password: (再入力)


When the Adobe Flash Media Server service is started, the service
can be run as a user other than "root". The server would change to this user
when the server is started and has acquired its ports.

Please enter the user that the Adobe Flash Media Server service will run as
Default user [fms]: (<ENTER> キー)

Please enter a valid user group for the "fms" user: Default group [fms]: (<ENTER> キー)


Do you want to install apache? (y/n)
Default [y]: (<ENTER> キー)



Apache is started as root but once it has acquired its port it starts the worker
processes as a non-priviledged user.

Please enter the user that Apache will eventually run as.
Default user [fms]: (<ENTER> キー)


Do you want the Adobe Flash Media Server service to run as a
daemon? (y/n)
Default [y]: (<ENTER> キー)


Do you want to start the Adobe Flash Media Server
after the installation is done? (y/n)
Default [y]: (<ENTER> キー)
  :
うまくインストールされていれば、http://(サーバー名):8134/ で Start Screen を表示できる。
(なぜ 8080 ではなく 8134 なのかは不明)
インストール #25

動画が再生されれば正常インストールされている。
posted by K/I at 19:52 | 東京 ☁ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2012年09月11日

Adobe Flash Media Server のインストール (Windows 7)

Adobe Flash Media Server をインストールしてみた。
これを使用すれば、保存してある動画をオンデマンド配信したりライブ映像を配信したりすることができる。

今回インストールしたバージョンは Flash Media Development Server 4.5。
このバージョンは機能に制約がある無料バージョン (トライアルという位置づけ) である。

必要なスペックは、
Windows
  • 3.2GHz Intel® Pentium® 4 processor (dual Intel Xeon® or faster recommended)
  • Microsoft® Windows Server® 2008 R2 (64 bit) or Windows® 7 (32 bit; for Adobe® Flash® Media Development Server only)
  • 64-bit operating systems: 4GB of RAM (8GB recommended)
  • 1Gb Ethernet card recommended (multiple network cards and 10Gb also supported)
Linux
  • 3.2GHz Intel Pentium 4 processor (dual Intel Xeon or faster recommended)
  • Red Hat® Enterprise Linux® Server 5.5 (64 bit) or Linux CentOS 5.5 (64 bit)
  • 64-bit operating systems: 4GB of RAM (8GB recommended)
  • 1Gb Ethernet card recommended (multiple network cards and 10Gb also supported)
64bit OS が手元に無かったので、今回は必然的に Windows 7 に Development Servrer をインストールする選択肢となった。

1. インストーラーのダウンロード

まず、Adobeサイトから、インストーラーをダウンロードする。
インストール #1

インストール #2

インストール #3

インストール #4

インストール #5

2. インストールの実行

ダウンロードしたZIPファイルを開くと以下のように展開される。
インストール #6

Windowsフォルダー内の FlashMediaServer4.5.exe が32bit版のインストーラーらしい。
インストール #7

インストール #8

インストール #9

シリアル番号の入力を求められるが、何も入力しなければ Adobe Flash Media Develpment Server がインストールされる。
インストール #10

インストール #11

インストール #12

RTMP 経由ではなく、HTTP 経由でストリーミング配信したい場合は Apache 2.2 もインストールする (モジュール f4fhttp_module, jithttp_module, hlshttp_module がインストールされる)。
インストール #13

インストール #14

管理者のユーザー名とパスワードを入力。
Administration Console でログインするときに使うもの。
インストール #15

インストール #16

すでにポート 80 が使われている場合は、使われていないポート番号を指定する。
これが RTMPT と HTTP で使うポートになるらしい。
ポート 1935 のほうは変更するとたいへんだと書かれているので、たとえば 80 → 8080 に変更するなら 1935,8080。
インストール #17

インストール #18

インストール #19

ファイアウォールの設定ダイアログが表示された。
インストール #20

インストール #21

インストール完了するとブラウザーが開き、Server Start Screen と Administration Console が表示される。
インストール #22

インストール #23

Administration Console で、[Server Address] に "localhost"、[Username] と [Password] にインストール時に設定したユーザー名とパスワードを入力して [Login] するとコンソールに入れる。
インストール #24

3. インストールの確認

次のいずれかの方法で Start Screen を起動して正常にインストールできたかどうか確認できる。
  • Windows スタートメニューから「Adobe Flash Media Server Start Screen」起動
  • Webブラウザーで (インストール先ディレクトリ)/webroot/index.html を開く (実質、前項と同じ)
  • Apache をインストールした場合は Web ブラウザーで http://localhost にアクセス
Flash Media Server の画面が表示され、動画の再生がはじまる。
動画がはじまらない場合は、右側の "STREAMING" パネルの三角矢印ボタンのどれかをクリックしてみる。
インストール #25

今回はここまで。
posted by K/I at 19:54 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2012年09月06日

Redmineのインストール (Ver.2.x)

以前、Redmine 1.1.2 のインストールメモを書いたけれど、2.x のインストールはあちこち様子が違うのであらためて書いておく。

インストールした環境は、CentOS release 5.7 (Final)
インストールした Redmine のバージョンは 2.0.3

Redmine.JP に掲載されているインストール手順を参考に作業した。
http://redmine.jp/guide/RedmineInstall/

(1) 必要なツール類のインストール

今回は、Ruby をソースからコンパイルすることにした。
Rubyの前に libyaml をインストールしておかないと、Ruby 実行時に YAML ファイルが出力できないという警告がたびたび出てうるさい。
YAML
http://www.yaml.org/
から libyaml を選んでソースをダウンロードし、解凍&インストール。
# wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz
# tar zxvf yaml-0.1.4.tar.gz
# cd yaml-0.1.4
# ./configure
# make
# make test
# make install
# cd ..
次に Ruby。
Rubyのサイト:
http://www.ruby-lang.org/ja/
からソースをダウンロードし、解凍&インストール。
# wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p194.tar.bz2
# tar jxvf ruby-1.9.3-p194.tar.bz2
# cd ruby-1.9.3-p194
# ./configure
# make
# make test
# make install
# cd ..
そして Ruby on Rails と Bundler をインストールする。
# gem install rails
# gem install bundler
※あとで必要パッケージ一を括インストールするので、ここで rails インストールしなくても OK だったかも。

(2) Redmine 用アカウント作成

Redmine 用アカウント redmine を作成。
# useradd redmine

(3) データベースの準備

データベースは今回は MySQL を使用した。
これはめんどうなので yum でインストール。
# yum install mysql-server mysql mysql-devel
Redmine 用のデータベースとユーザーを作成。
# mysql -u root -p
Enter password: XXXXX
mysql> create database redmine character set utf8;
mysql> create user 'redmine'@'localhost' identified by 'XXXXX';
mysql> grant all privileges on redmine.* to 'redmine'@'localhost';

(4) Redmine のインストール

ソースファイルのダウンロードまたはSVNレポジトリからチェックアウトし、インストール先に設置する。
今回は /usr/local/redmine にした。
# svn checkout http://redmine.rubyforge.org/svn/branches/2.0-stable /user/local/redmine
/usr/local/redmine ディレクトリに移り、Bundler で必要な gem を一括インストール。
# cd /usr/local/redmine
# bundle install --without development test postgresql sqlite
必要なバージョンの ImageMagick がインストールされていないと rmagick に関するエラーが表示される。
その場合は、
# bundle install --without development test postgresql sqlite rmagick
とする。

(5) セッションストア秘密鍵の生成

redmine アカウントでログインし、セッションストア秘密鍵を生成する。
# rake generate_secret_token
これにより、config/initializers/secret_token.rb が作られる。

(6) テーブル作成

config/database.yml.example を config/database.yml にコピーし、production: のところの内容を変更する。
production:
adapter: mysql2
database: redmine
host: localhost
username: redmine
password: redmine のパスワード
encoding: utf8
そして、以下のコマンドを実行:
# cd /usr/local/redmine
# RAILS_ENV=production rake db:migrate
redmine データベース内にテーブル等が作られる。

もし、openssl が load できない、というエラーが出たら、Ruby ソース内の openssl 拡張をインストールする。
# cd ruby-1.9.3-p194/ext/openssl
# ruby extconf.rb
# make
# make install
(参考サイト: CentOS 5.2 に rails 環境を構築する)

(7) 動作確認

以下のディレクトリは redmine アカウントが読み書き可能にしておく。
# cd /usr/local/redmine
# mkdir tmp public/plugin_assets
# sudo chown -R redmine:redmine files log tmp public/plugin_assets
# sudo chmod -R 755 files log tmp public/plugin_assets

以下のコマンドを実行してWebサーバーを起動:
# ruby script/rails server webrick -e production
http://localhost:3000/ にアクセスして Welcome 画面が表示されるか確認する。

(8) Passenger (mod_rails) を導入

Redmin.JP サイトに webrick は「開発用」なので「動作確認以外には使用するな」という脅し文句が書かれているので、Passenger をインストールしてみる。
まずは、必要なパッケージをインストール。
# gem install fastthread daemons passenger
場合によってはほかのパッケージが必要かもしれない。
Passenger Apache 2モジュールのインストーラーを実行。
# passenger-install-apache2-module
もし足りないライブラリーやツールがあると、インストール方法を丁寧に教えてくれるのがありがたい。
提示されたコマンドを実行した後に再度実行。
いろいろ表示されるが、最後に Apache の設定ファイルに追加する設定を示してくれる。
ほんと、ありがたい。
たとえばこんな感じ:
LoadModule passenger_module /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.17/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.17
PassengerRuby /usr/local/bin/ruby
これで、Apache に Passenger モジュールがインストールされ、Rails アプリが実行できるようになる。
Redmine を実行させるには、たとえば、
RailsBaseURI /redmine
RailsEnv production
という設定を追加し、DocumentRoot に Redmine の public ディレクトリをシンボリックリンクしてあげる。
たとえば:
# ln -s /usr/local/redmine/public /var/www/html/redmine
そして、Redmine ディレクトリのオーナーを apache:apache に変更。
# chown -R apache: /usr/local/redmine
これで http://(ホスト名)/redmine で Redmine にアクセスできるようになる。
posted by K/I at 23:16 | 東京 ☁ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2012年02月12日

Movable Typeでのログイン機能実装

MovableTypeでログイン機能を実装する方法を考える。
ブログ記事管理を通常の MT 管理画面上でいつもどおりに行えるようにしたい。
つまり、MT 管理画面上での:
  • ブログ記事の投稿や変更
  • テンプレートの改変
が公開される記事に反映されるようにしたい。

いろいろな方法があると思うが、以下のような仕組みを考えた:
  • ログインが必要なコンテンツは、別ブログに分ける。
  • ブログ記事、ウェブページはウェブ上に公開されない場所に保存させる。
  • ブログ記事は PHP スクリプトから読み出して表示させる。
     (PHP スクリプト上でユーザー認証を行うことで、ログイン機能を実現)
  • PHP 用のテンプレートはウェブページで作成する。
     (ウェブページのデザインテンプレートでデザインを変更できる)

以下、具体的な方法を説明する。

使用した MT バージョンは 5.12-ja。

ブログの作成

ログインを必要とするコンテンツ用のブログを作成する。
その際、[ブログパス] は [絶対パス] にチェックを入れ、ウェブ上に公開されないパスを指定する。

ブログの設定で、
「全般設定」
  • 「アーカイブ設定」-> [ファイルの拡張子] を "tpl" に変更 (これは好みに応じて)
「投稿設定」
  • 「作成の既定値」-> [テキストフォーマット] を "なし" に変更
とする。

デザインテンプレート整備

デザインの「ブログテンプレートの管理」画面で、以下のような設定を行う。
ウェブページテンプレート改変
アーカイブテンプレートの「ウェブページ」テンプレートを改変する。

ウェブページは PHP のデザインテンプレートとして使用するため、ところどころ PHP コードに置き換える必要がある。
ページタイトル
<title><$mt:PageTitle encode_html="1"$> - <$mt:BlogName encode_html="1"$></title>
の部分は記事ごとに変える必要があるので、たとえば
<title><?php echo htmlspecialchars($page_title); ?> - <$mt:BlogName encode_html="1"$></title>
のようにする。

PHP のデザインテンプレートは「ブログ記事」「カテゴリページ」など複数用意することになるので、「ウェブページ」テンプレートはそれらに共通して使えるようにする。
ブログ記事テンプレート改変
アーカイブテンプレートの「ブログ記事」テンプレートを改変する。

ブログ記事は PHP スクリプトから読み出される記事データベース的役割をする。
そのため、読み出しに適した単純な書式で各記事詳細を書き込むようにする。
たとえば:
<$mt:CategoryLabel$>
<$mt:EntryTitle$>
<$mt:EntryDate$>
<$mt:EntryBody$>
など。
今回は議論しないがコメントとタグもブログ記事に書き出すようにする。

また、ブログ記事の URL から記事 ID がわかるように、アーカイブマッピングで [パス] のファイル名部分を %-f から <$MTEntryID$>.html に変更する。
ブログ記事リストテンプレート改変
カテゴリ別や月別のブログ記事リストのテンプレートを改変する。

ブログ記事リストも PHP から読み出されるので、読み出しに適した書式にする。
たとえば:
<mt:Entries limit="$limit">
<$MTEntryDate format="%Y/%m"$>/<$MTEntryID$>:<$MTEntryTitle$>
</mt:Entries>
などとする。

また、アーカイブマッピングの [パス] で、
  • %iindex.html に、
  • %-c%c に、
  • 拡張子を .tpl から .html に、
変更する。
カテゴリリストテンプレート追加
アーカイブテンプレートに、カテゴリリストを出力する「ブログ記事リスト」を追加する。

たとえば、
<MTCategories>
<$MTCategoryBasename$>:<$MTCategoryLabel$>
</MTCategories>
など。

これは、メインインデックスを出力する際に使用する。
インデックステンプレート変更
メインインデックスは直接アクセスしないので削除する。
JavaScript、CSS は [パス] に絶対パスを指定する。
ほか、不要な物は削除。

ウェブページで PHP テンプレート作成

たとえば、以下のようなテンプレートをウェブページとして作成する。
ログイン画面用テンプレート
ファイル名: login.tpl
<h2>ログイン</h2>
<form name="form1" action="/members/index.html" method="post">
<table>
<tr>
<td>メールアドレス</td>
<td><input type="text" name="li_mail" value="<?php echo htmlspecialchars($mail); ?>"/></td>
</tr>
<tr>
<td>パスワード</td>
<td><input type="password" name="li_passwd" value=""/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="ログイン" /></td>
</tr>
</table>
</form>
メインインデックス用テンプレート
ファイル名: index.tpl
<h2>会員用ページ</h2>
<div class="members">
<?php
foreach ($categories as $category) {
?>
<div><a href="<?php echo htmlspecialchars($category['basename']); ?>/"><?php echo htmlspecialchars($category['label']); ?></a></div>
<?php
}
?>
</div>
カテゴリ別ブログ記事リスト用テンプレート
ファイル名: category.tpl
<h2><?php echo htmlspecialchars($category_label); ?></h2>
<div class="members">
<?php
foreach ($entries as $entry) {
?>
<div><a href="<?php echo htmlspecialchars($entry['path']); ?>.html"><?php echo htmlspecialchars($entry['title']); ?></a></div>
<?php
}
?>
</div>

PHPスクリプトの作成

ページを表示するための PHP スクリプトを用意する。
PHP スクリプトは、記事IDまたはカテゴリIDからブログ記事ファイルのパスを決定し、ファイルの内容を読み出し、デザインテンプレートを選んで表示する処理を行う。

以下の PHP コードはその一例で、view.php というファイル名で対象パス (DocumentRoot/members など) に置く。
<?php
/**
* ページ表示
*
* 入力パラメータ
* c -- 'index' / カテゴリのベースネーム
* y -- 記事年
* m -- 記事月
* e -- 記事番号
* 組み合わせは以下のいずれか
* view.php?c=index
* view.php?c=cat
* view.php?y=2012&m=01&e=00123
*/
// ブログの [ブログパス] で設定したパスを指定
define('MEMBERS_BASEDIR', '/var/www/members');
if (!auth()) {
require MEMBERS_BASEDIR . '/login.tpl';
exit;
}
// 表示ページの決定
if (isset($_REQUEST['c']) && $_REQUEST['c'] != '') {
$category_basename = $_REQUEST['c'];
}
if (isset($_REQUEST['e']) && $_REQUEST['e'] != ''
&& isset($_REQUEST['m']) && $_REQUEST['m'] != ''
&& isset($_REQUEST['y']) && $_REQUEST['y'] != '') {
$entry_year = $_REQUEST['y'];
$entry_month = $_REQUEST['m'];
$entry_id = $_REQUEST['e'];
if (!preg_match('/^\d{4}$/', $entry_year)) {
echo "ERR(1)";
exit;
}
if (!preg_match('/^\d{2}$/', $entry_month)) {
echo "ERR(1)";
exit;
}
} else {
$entry_year = '';
$entry_month = '';
$entry_id = '';
}
} else {
echo "ERR(2)";
exit;
}
// 記事の内容
if ($entry_id != '') {
// 個別の記事
$entry_fname
= MEMBERS_BASEDIR . "/$entry_year/$entry_month/$entry_id.html";
if (!file_exists($entry_fname)) {
echo "ERR(3)";
exit;
}
if (($fh = fopen($entry_fname, 'r')) === FALSE) {
echo "ERR(4)";
exit;
}
flock($fh, LOCK_SH);
$category_label = trim(fgets($fh));
$entry_title = trim(fgets($fh));
$entry_date = trim(fgets($fh));
$entry_contents = '';
while ($row = fgets($fh)) {
$entry_contents .= $row;
}
fclose($fh);
$page_title = $entry_title;
} else if ($category_basename == 'index') {
// インデックス
$categireis = array();
if (($fh = fopen(MEMBERS_BASEDIR . '/categories', 'r')) === FALSE) {
echo "ERR(5)";
exit;
}
flock($fh, LOCK_SH);
while ($row = fgets($fh)) {
$row = trim($row);
if ($row != '') {
list($cbn, $cl) = explode(':', $row, 2);
$categories[] = array('basename' => $cbn,
'label' => $cl);
}
}
fclose($fh);
$page_title = '会員用ページ';
} else {
// カテゴリ
$categirey_label = '';
if (($fh = fopen(MEMBERS_BASEDIR . '/categories', 'r')) === FALSE) {
echo "ERR(5)";
exit;
}
flock($fh, LOCK_SH);
while ($row = fgets($fh)) {
if (preg_match("/^$category_basename:(.+)$/", $row, $matches)) {
$category_label = $matches[1];
break;
}
}
fclose($fh);
if ($category_label == '') {
echo "ERR(6)";
exit;
}
$entries = array();
if (($fh = fopen(MEMBERS_BASEDIR . "/$category_basename/entries", 'r'))
=== FALSE) {
echo "ERR(7)";
exit;
}
flock($fh, LOCK_SH);
while ($row = fgets($fh)) {
$row = trim($row);
if ($row != '') {
list($p, $t) = explode(':', $row, 2);
$entries[] = array('path' => $p,
'title' => $t);
}
}
fclose($fh);
$page_title = $category_label;
}
if ($entry_id != '') {
require MEMBERS_BASEDIR . '/entry.tpl';
} else if ($category_basename == 'index') {
require MEMBERS_BASEDIR . '/index.tpl';
} else {
require MEMBERS_BASEDIR . '/category.tpl';
}
function auth()
{
// ここで認証処理行う
return TRUE;
}
?>

Rewrite設定

Apache の Rewrite エンジンを利用して、ブログ記事や記事リストへのアクセスを view.php にパラメータをつけて転送する。

設定例:
RewriteEngine On
RewriteRule ^index\.html view.php?c=index [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)\.html view.php?y=$1&m=$2&e=$3 [L]
RewriteRule ^([^/]+)/index\.html view.php?c=$1 [L]

以上で設定は完了。
タグ:MovableType PHP
posted by K/I at 08:55 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2011年12月03日

ApacheのログをMySQLにはき出す

Apacheのログファイルからアクセス解析するツールを作っていたのだが、アクセス数が多いサイトなのでログファイルのファイルサイズが大きく、読み出してデータベースに書き出すだけで一苦労。
何かよい工夫は無いものか。。。
と思っていたら、こんなものがあった。

mod_log_sql
http://www.outoforder.cc/projects/apache/mod_log_sql/

Apache ログを直接 MySQL に書き出してくれるらしいので、導入してみた。
環境は以下のとおり:

OS: CentOS 5.6
Apache: 2.2.3
MySQL: Ver 14.12 Distrib 5.0.77
mod_log_sql: 1.101

1. インストール


ファイルをダウンロード&解凍して configure
で、いきなりつまずいた。

$ ./configure --with-apxs=/usr/sbin/apxs
configure: creating config.nice
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
checking for Apache 2.0 version >= 2.0.40... yes
checking for floor in -lm... yes
checking for gzclose in -lz... yes
checking for mysql_init in -lmysqlclient... no
configure: error: libmysqlclient is needed for MySQL support


libmysqlclient が見つからないなら、パスを指定して:
$ ./configure --with-apxs=/usr/sbin/apxs --with-mysql=/usr/lib64/mysql
とすればいい、と思ったが状況改善しない。

調べてみたらこんな記事が:
configure: error: libmysqlclient is needed for MySQL support
http://www.webhostingtalk.com/showthread.php?t=519406

言われるままに:
$ ln -s /usr/lib64/mysql /usr/lib/mysql
$ ./configure --with-apxs=/usr/sbin/apxs

としたらうまくいった。

あとはお決まりの:
$ make
# make install

でインストール完了。

2. MySQLデータベースの準備


ログの格納先データベースを準備する。

$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6781031
Server version: 5.0.77-log Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database apachelogs;
Query OK, 1 row affected (0.09 sec)

mysql> \u apachelogs
Database changed
mysql> \. mod_log_sql-1.101/contrib/create_tables.sql
Query OK, 0 rows affected (0.12 sec)

Query OK, 0 rows affected (0.05 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.10 sec)

Query OK, 0 rows affected (0.01 sec)

mysql> SHOW TABLES;
+----------------------+
| Tables_in_apachelogs |
+----------------------+
| access_log |
| cookies |
| headers_in |
| headers_out |
| notes |
+----------------------+
5 rows in set (0.00 sec)

mysql> CREATE USER apachelogs_user IDENTIFIED BY 'XXXXXXXXXX';
Query OK, 0 rows affected (0.60 sec)

mysql> GRANT INSERT ON apachelogs.* TO 'apachelogs_user'@'localhost'
Query OK, 0 rows affected (0.45 sec)


3. Apache の設定


データベースの準備ができたら、次は Apache の設定。

LoadModule log_sql_module modules/mod_log_sql.so
LoadModule log_sql_mysql_module modules/mod_log_sql_mysql.so
LogSQLLoginInfo mysql://apachelogs_user:XXXXXXXXXX@localhost/apachelogs

<VirtualHost aaa.bbb.ccc.ddd:80>
ServerName www.xxx.yyy
LogSQLTransferLogTable access_log
CustomLog logs/access_log combined
ErrorLog logs/error_log
</VirtualHost>


バーチャルホストごとに書出し先テーブルを指定できるようになっている。

Apache を再起動。

# service httpd graceful

設定が反映される。
ログは、ログファイルとデータベースの両方にはき出される。
posted by K/I at 20:31 | 東京 ☁ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2011年04月07日

Redmineのインストール

これまで trac を使っていたが、Redmine を使ってみることにした。
以下、インストールメモ。
Ver.2.x のインストールメモは「Redmineのインストール (Ver.2.x)」を参照

インストールした環境は、Fedora 14。
インストールした Redmine のバージョンは 1.1.2。

Redmine.JP に掲載されているインストール手順を参考に作業した。
http://redmine.jp/guide/RedmineInstall/

(1) 必要なツール類のインストール
Ruby, Rails, Rack のバージョンは、記載されているバージョンと完全に一致していないといけないようだ。

Fedora 14 のパッケージは、Rails と Rack のバージョンが一致しなかった。
今回、Redmine の公式リリース版をダウンロードしたが、Rails は Redmine のファイル一式に含まれていたが、Rack は含まれていなかったので必要なバージョンを gem でインストールした。
gem install rack -v=1.0.1

(2) Redmine 用アカウント作成

Redmine 用アカウント redmine を作成。

# useradd redmine

(3) データベースの準備

データベースは、今回は PostgreSQL を使用した (使い慣れているので)。

Redmine 用のロールとデータベースを作成する。

CREATE ROLE redmine LOGIN ENCRYPTED PASSWORD 'パスワード' NOINHERIT VALID UNTIL 'infinity';
CREATE DATABASE redmine WITH ENCODING='UTF8' OWNER=redmine;


そして、redmine をインストールするサーバーからのアクセスを許可させる。
同一ホストであっても、ローカルからのアクセスが ident メソッドのみになっている場合は、自IPアドレスから password メソッドでの host アクセスを許可させておく (/var/lib/pgsql/data/pg_hba.conf および /var/lib/pgsql/data/postgresql.conf を設定)。

(4) ダウンロード

以下のサイトから、Redmine のファイルをダウンロード。
http://www.redmine.jp/download/

レポジトリからチェックアウトもできるが、上述のとおり Rails の必要バージョンが含まれているという理由から、tar ファイルをダウンロードした。

tar ファイルを適当なところ (たとえば /usr/local の下とか) に解凍し、オーナーを redmine にする (←オーナー変更は必要なかったかも)。

# chown -R redmine: redmine-1.1.2

(5) セッションストア秘密鍵の生成

redmine アカウントでログインし、解凍したディレクトリ (たとえば、/usr/local/redmine-1.1.2。以下、Redmine ディレクトリと呼ぶ) に移動し、以下のコマンドを実行する。

# rake config/initializers/session_store.rb

(6) テーブル作成

解凍ファイルの中にある config/database.yml.exampleconfig/database.yml にコピーし、production: のところの内容を変更する。
production:
  adapter: postgresql
  database: redmine
  host: IPアドレスかホスト名
  username: redmine
  password: "redmine ロールのパスワード"


そして、Redmine ディレクトリで、以下のコマンドを実行:

rake db:migrate RAILS_ENV="production"
rake redmine:load_default_data RAILS_ENV="production"

redmine データベース内にテーブル等が作られる。

(7) 動作確認

以下のコマンドを実行してWebサーバーを起動:

# ruby script/server webrick -e production

http://localhost:3000/ にアクセスして Welcome 画面が表示されるか確認する。

(8) Passenger (mod_rails) を導入

Redmin.JP サイトに webrick は「開発用」なので「動作確認以外には使用するな」という脅し文句が書かれているので、Passenger をインストールしてみる。
まずは、必要なパッケージをインストール。
# yum install rubygem-fastthread
# yum install rubygem-daemons

場合によってはほかのパッケージが必要かもしれない。
Passenger 自体は rpm が用意されていなかったので、gem でインストール。
# gem install passenger
Passenger Apache 2モジュールのインストーラーを実行。
# passenger-install-apache2-module
ところが、なぜか
/usr/lib/ruby/gems/1.8/gems/passenger-3.0.6/lib/phusion_passenger/platform_info/apache.rb:277:in `_unmemoized_apr_config_needed_for_building_apache_modules?': undefined local variable or method `test_exe_outdir' for PhusionPassenger::PlatformInfo:Module (NameError)
        from /usr/lib/ruby/gems/1.8/gems/passenger-3.0.6/lib/phusion_passenger/platform_info.rb:92:in `apr_config_needed_for_building_apache_modules?'
        from /usr/lib/ruby/gems/1.8/gems/passenger-3.0.6/bin/passenger-install-apache2-module:69:in `dependencies'
        from /usr/lib/ruby/gems/1.8/gems/passenger-3.0.6/lib/phusion_passenger/abstract_installer.rb:166:in `check_dependencies'
        from /usr/lib/ruby/gems/1.8/gems/passenger-3.0.6/bin/passenger-install-apache2-module:90:in `install!'
        from /usr/lib/ruby/gems/1.8/gems/passenger-3.0.6/lib/phusion_passenger/abstract_installer.rb:63:in `start'
        from /usr/lib/ruby/gems/1.8/gems/passenger-3.0.6/bin/passenger-install-apache2-module:236
        from /usr/bin/passenger-install-apache2-module:19:in `load'
        from /usr/bin/passenger-install-apache2-module:19

とかいうエラーが出てうまくいかない。
これはどうやら、typoらしい。
/usr/lib/ruby/gems/1.8/gems/passenger-3.0.6/lib/phusion_passenger/platform_info/apache.rb を開き、"test_exe_outdir" を "tmpexedir" に変更してリトライ。
不足しているソフトウェアを提示してくれる (しかも、実行すべき yum コマンドまで教えてくれる!) ので、インストール後再実行。
起動できた。

(9) Apache 設定

Apache に Passenger の設定を追加。
たとえば、/etc/httpd/conf.d/passenger.conf を作成して、passenger-install-apache2-module 実行時に表示された設定を記載する。
今回の環境では以下のとおり:
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.6/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.6
PassengerRuby /usr/bin/ruby


次に、Redmine の設定を行う。
ポート 20080 にアクセスするとRedmineが表示されるようにVirtualHost設定することにした。
たとえば /etc/httpd/conf.d/redmine.conf に記載する。
今回の環境では以下のようにする:
Listen 20080
NameVirtualHost *:20080
<VirtualHost *:20080>
    ServerAdmin webmaster@aaa.bbb.ccc
    DocumentRoot /usr/local/redmine-1.1.2/public
    CustomLog /var/www/vhosts/logs/redmine_ssl_access-log combined
    LogLevel warn
    ErrorLog /var/www/vhosts/logs/redmine_ssl_error-log
</VirtualHost>

そして、Redmine ディレクトリのオーナーを apache:apache に変更する。
今回の環境では:
# chown -R apache: /usr/local/redmine-1.1.2

Apacheを再起動すると、http://localhost:20080/ でアクセスできる。

(10) メール送信設定

プロジェクトで発生したイベントをメールで送信するようにするには、Redmine ディレクトリの config/email.yml.exampleconfig/email.yml にコピーし、設定変更する。
たとえば localhost を SMTP サーバーにするには、production: のところを
production:
  delivery_method: :smtp
  smtp_settings:
    address: localhost
    port: 25
    domain: メールドメイン名

のように設定する。
タグ:redmine
posted by K/I at 21:20 | 東京 ☀ | Comment(0) | TrackBack(0) | 技術メモ | このブログの読者になる | 更新情報をチェックする

2011年03月14日

節電ポスター ブログパーツ

今回の東北地方の震災での節電をよびかけるポスターが、「節電ポスター」( http://setsuden.tumblr.com/ ) というサイトで提供されています。
これは、節電を呼びかけるポスターを印刷してあちこちに貼りましょう、というものです。

これをブログパーツ化したものを作成しましたのでお知らせします。

「節電ポスター」ブログパーツ
http://tan9.net/psvc/setsuden.js

ブログに貼る場合は、以下のようにします。
<script type="text/javascript" src="http://tan9.net/psvc/setsuden.js?wd=253&ht=358&bgcol=&brdrcol=&updt=1&intvl=8&rndm=0"></script>
wd画像横幅の最大値 (0なら無制限)
ht画像高さの最大値 (0なら無制限)
bgcol表示エリアの背景色 (ccccccなど、#は付けない)
brdrcol表示エリアの枠の色 (ccccccなど、#は付けない)
updt画像自動更新フラグ (0: 自動更新しない、1: 自動更新する)
intvl画像の更新周期 (単位: 秒)
rndmランダム再生フラグ (0: シーケンス再生、1: ランダム再生)

wdht の両方に 0 以上の値を指定した場合、表示エリアは横幅wdピクセル、高さ htピクセルの大きさに固定され、画像はエリア内最大の大きさ (縦横比は保持) に縮小/拡大されます。

なお、画像URLなどはハードコーディングしているので、サイトの画像投稿は自動反映されません。

【2011年3月20日更新】
・ht, wd, bgcol, brdrcol パラメータを追加
posted by K/I at 09:38 | 東京 ☀ | Comment(0) | TrackBack(2) | 日記 | このブログの読者になる | 更新情報をチェックする

2011年02月26日

もくもく日記: IS03で実機デバッグ環境整備

第六回日本Androidの会埼玉支部ワークショップ

開催日: 2011-02-26

今回の自分のもくもくテーマ: IS03で実機デバッグ環境整備

(1) IS03 のドライバーをインストール

ドライバーをダウンロードしてインストール。
『IS03 用USB ドライバ - SHARP』
http://k-tai.sharp.co.jp/support/a/is03/download/usb/

(2) IS03 を接続

USB接続モードを「高速転送モード」にすると、ドライバーのインストールがはじまる。
ところが、Android ADB Interface のドライバーインストールに失敗。

そこで。。。

(3) SDK ManagerでGoogle Usb Driver packageをインストール

これでもドライバーインストール失敗。
(これは必要だったのか?)

調べたら、IS03 専用のドライバーが必要だった。

(4) IS03 用のADB USBドライバをダウンロード

https://sh-dev.sharp.co.jp/android/modules/driver/index.php?/is03_adb/download

ドライバー更新して、ダウンロードしたドライバを指定したらうまくいった。

(5) SDK Manager でいろいろ更新したら、Eclipse の ADT のバージョンと合わなくなったので、そちらも更新。

EclipseからRunしたら、めでたくIS03上に表示された。

今回はここまで。
タグ:android
posted by K/I at 17:01 | 東京 ☀ | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする