2007年12月30日日曜日

CentOSにphpPgAdminをインストール

CentOS 5にインストールしたメモ。
Apache、PHPとPostgreSQLは事前にインストール済み。


phpPgAdminをダウンロード

wget http://downloads.sourceforge.net/phppgadmin/phpPgAdmin-4.1.3.tar.gz?download

解凍
tar -zxf phpPgAdmin-4.1.3.tar.gz

ディレクトリ名をアクセスしやすいものに変える
mv phpPgAdmin-4.1.3 pg

Webブラウザでアクセスしてみる (pgが/var/www/htmlにある場合)
http://ドメイン/pg/
ログイン画面が表示される。何もしなくても日本語で表示された。


ログインしようとするとエラーになった。
原因は、デフォルトではサーバ側でログインに使われるのがUnix Socketになること。
(今回はpostgresの設定をTCP接続のみパスワード指定でログインできる設定にしていた。)

phpPgAdminの設定ファイル(conf/config.inc.php)の該当行を変更。
// Hostname or IP address for server.  Use '' for UNIX domain socket.
// use 'localhost' for TCP/IP connection on this computer

$conf['servers'][0]['host'] = ''; //-> '127.0.0.1'に変更
これでログインできるようになった。
他にもいろいろ設定ができるので、必要に応じて変える。


ログインするとpgAdminIIIと同じように左側にツリーが表示される。
ツリーをクリックするとWebページの遷移なしで、ツリーが展開していく。phpMyAdminに比べて洗練されたUIだ。


データをCSVにエクスポートしたりインポートしたりもできて意外に便利そう。


参考:
 phpPgAdmin :: Download (本家ダウンロードページ)
 phpPgAdminの導入


(2010/04/07 追記)
SELinuxが有効だと、403 Forbiddenになることがある。
その場合は、「 /usr/sbin/setsebool -P httpd_can_network_connect_db on 」する。
参考:CentOS5.4でSELinux有効時にPHPでPostgresに接続できなかった - おきらく日記
それでも駄目なら、/var/www/htmlでgzを解凍する。(ユーザーのhomeディレクトリで解凍するとSELinux的にApacheが触っちゃダメなモノになる?)

また、デフォルトではpostgresやrootではphpPgAdminにログインできない。
参考:phpPgAdminにログインできないときの解決法 | tool | 『Weblogy』

CentOSに phpMyAdminをインストール

ダウンロード (直URLにした方がよい?)

wget http://prdownloads.sourceforge.net/phpmyadmin/phpMyAdmin-2.11.3-all-languages.tar.gz?download

解凍
tar -xzvf phpMyAdmin-2.11.3-all-languages.tar.gz

移動して使いやすいディレクトリ名に変更
mv phpMyAdmin-2.11.3-all-languages /var/www/html/my
cd $_

サンプルを元に設定ファイルを編集
cp config.sample.inc.php config.inc.php
vi $_
$cfg['blowfish_secret']に値をセットすればとりあえず使える。

ログインページ

テーブル情報のページ


参考:
 phpMyAdmin 2.7.0-pl2 - ドキュメント (本家)
 phpMyAdmin > Downloads | MySQL Database Administration Tool | www.phpmyadmin.net

Linuxでの PostgreSQLの初期操作

PostgreSQLインストール済みの状態から。


デーモンのステータスを確認。動いてなければstartさせる。

/etc/init.d/postgresql status
/etc/init.d/postgresql start

OSのユーザーをpostgresに切り替える。これにより、DBへのログインユーザーとしてOSのユーザーと同じpostgresが使われて、パスワードを入力しなくてもpsql等が使える。
OSのユーザーをpostgresに切り替えるためには、いったんrootになってからpostgresになる。(OSのユーザーpostgresのパスワードがわからないので。)
su -
su - postgres

既存のDB(postgres)以外のDBを使うなら、DBを作る。
createdb DB名

必要ならDBのユーザーも作る。
createuser ユーザー名

psqlでDBに接続する。
psql DB名

あとはpsqlで進めていく。


設定を変えるには、/var/lib/pgsql/dataにある、postgresql.confとpg_hba.confを書き換えてpostgresを再起動する。


参考:
 postgreSQL基本操作 : マロンくん.NET
 psql (本家マニュアル)
 PostgreSQLデータベースのコマンド
 phpPgAdminの導入
 pg_hba.confファイル (本家マニュアル)

AviSynthの基本的なスクリプト例

スクリプト例で使っている用語の説明

  • clip・・・DireceShowSource()等により取得した動画(または映像や音声)。
  • path・・・動画等のファイルパス。絶対パスでも相対パスでも可。ダブルクォートで囲う。バックスラッシュの変わりにスラッシュは使えない。
    (例:"C:videovideo1.mpg")


スクリプトの基本事項
  • その時点で最後に取得したclipはlastという変数に入っている。
  • returnを省略すると、最後に取得したclipが再生される。FFmpegに渡す場合等は下記のようにreturnが必要?
    return last
  • 関数の引数は必須のもの以外は省略が可能。省略した場合はデフォルト値が使われる。clipを省略するとたいていの場合はlastが使われる。引数を渡す時には下記のように引数名を指定できる。これにより、途中の引数を省略しつつ後ろの引数を渡すことが出来る。
    # 引数名がwidthの場合の例
    fnc(width = 320)


動画や音声をファイルから取得する DirectShowSource()
DirectShowSource(path)
Windows Media Playerが再生できる動画や音声なら、これで取得できる。
AviSource()は手持ちの動画では使えなかった。


動画を結合する + or ++ or Dissolve()
clip + clip
または
clip ++ clip
または
Dissolve(clip, clip, 30)
+でも++でも結合できるが、+は元々同じ動画(長い動画をいくつかに分割した場合等)を結合する場合、++はそれ以外の動画を結合する場合に使うらしい。
+と++はそれぞれAlignedSpliceとUnalignedSpliceと同じ役割を果たす。
Dissolve()の場合、1つ目の動画の最後と2つ目の動画の最初がオーバーラップする。オーバーラップする時間は第3引数で指定するフレーム数によって決まる。


動画を時間軸で部分的に抜き出す Trim()
Trim(clip, 0, 300)
数字は開始フレームと終了フレーム。30fps(1秒間に30コマ)の場合、上記だと0秒目から10秒目までとなる。


動画を表示部位で部分的に抜き出す Crop()
Crop(clip, 170, 10, -170, -10)
または
Crop(clip, 170, 10, 300, 300)
上記の1つ目の例では左、上、右、下のトリミングするピクセル数を指定している。
2つ目の例では、左、上のトリミングするピクセル数と、出力の幅、高さを指定している。


動画に音声を合成する AudioDub()
AudioDub(clip_video, clip_audio)
動画の元々の音声は無くなる。
動画より音声の方が長い場合も動画の長さは変わらない。


2つの音声を混ぜる MixAudio()
bgm = ResampleAudio(clip_bgm, 48000) # サンプリングレートを合わせる
audio = MixAudio(clip_video, bgm, 0.7)
AudioDub(video, audio)
上記のスクリプトでは、混ぜ合わせた音声をさらに動画に合成している → 動画の元々の音声に、BGMが加わっている。
動画の音声のサンプリングレートが48KHzだったので、BGMもそれに合わせたサンプリングレートに変換している。
MixAudio()の第3引数は第1引数のclipの音声の割合。上記の場合は第1引数のclipが70%、第2引数のclipが30%になり、BGMは小さめな音になる。
割合を指定しないと同じ割合(0.5ずつ)になる。


動画にテロップを入れる Subtitle()
Subtitle(clip, "テキスト", font = "MS Pゴシック", size = 30, text_color = $FFFFFF, align = 1)
日本語のテキストの場合はfont指定が必要。
表示場所を決めるalignの数字はテンキーの配置と同じ。


フェイドアウト Fadeout2()
Fadeout2(clip, 30)
数字はフェイドアウト時間のフレーム数。Fadeout2()の他にFadeout()とFadeout0()があるが、Fadeout2を使っておけば問題無い?


動画を90度回転する TurnLeft() or TurnRight()
TurnLeft(clip)
または
TurnRight(clip)
携帯電話で向きを間違えて録画してしまった場合などに役立ちそう。
回転すると縦横比がおかしくなる(横長になる)気がする。


動画を逆から再生する Reverse()
Reverse(clip)
動画の逆回転。
試してみたが見られるレベルでは無かった。無圧縮のAVIなら上手く逆回転させられるのかもしれない。

Safariの正規表現リテラルでユニコードエスケープが使えないバグ

Safari 2.0.4で発生したバグ。Safari 3ではこのバグは修正済みと思われる。(WindowsのSafari 3.0.4 (beta)では正常に動作した。)


問題点:
下記のように、正規表現リテラル内にユニコードエスケープで書いた場合に、マッチするはずの正規表現に正常にマッチしないという。

"カタカナ".match(/^[u30a1-u30f6u30fc]*$/)

ユニコードエスケープ自体が使えないわけではなくて、正規表現リテラル内でのみユニコードエスケープが使えないという現象。


回避策:
正規表現リテラルではなく、正規表現オブジェクトを渡す。
"カタカナ".match(new RegExp("^[u30a1-u30f6u30fc]*$"))

内部的には同じ動きになるのかと思ったが、どうやら違うらしい。



参考:
 Safari 2.0.4 Fails on Unicode Escape Sequences in Regular Expressions
 赤福プラス + Safari patch > パッチの内容

2007年12月27日木曜日

Railsよりお薦め!Rubyのフレームワーク Merb (Mongrel + Erb) をインストール

Merbに出会った。使ってみた。

Merb (Mongrel + Erb) は MVC ベースな Ruby の Web フレームワークである。簡単に言うと、軽量な ActionPack クローンである。

Merbのインストール
ヽ( ・∀・)ノくまくまー(2007-09-17) (優しいMerbの育て方)の手順に従ってインストール。
現在のMerbのバージョンは0.5.0。
gemでのインストール時にいくつか質問されたが適当にRubyの最新を選択。
するとrake installのところでエラー。
エラーメッセージに従って、ruby2rubyとjson_pureをgemでインストールすると、rake installできた。
Merb Docs - File: READMEを見ると依存するモジュールがいくつか変わったようだ。)

Merbを起動してブラウザからアクセスするがサーバが見つからない。
config/merb.ymlの:hostをブラウザのURL欄に入力するIPアドレスに変えてからMerb再起動。無事アクセスできた。(Hello Merb!)


Viewテンプレートを使う
ヽ( ・∀・)ノくまくまー(2007-09-19) (優しいMerbの育て方)に従ってViewテンプレートを使ってみる。
index.rhtmlを作ってアクセスしようとするとテンプレートが見つからないというエラー。
エラーメッセージによるとテンプレートのファイル名は"[アクション名].html.*"でないと駄目?(Rails2に合わせた?)
ファイル名をindex.html.erbにしたら表示できた。日本語も普通に表示できた。

Viewテンプレートに書くべきなのはbodyタグの内側だけで、それ以外(html要素の開始・終了タグ、head要素、body要素の開始タグ・終了タグ)はapp/views/layout/application.html.erbに書かれている。
application.html.erbはデフォルトのレイアウトで、controllerごとにレイアウトを分けるならapp/views/layout/<controller>.html.erbを作る。
ちなみに、Viewテンプレートを使わない場合は、自分で書いたもの以外は出力されない。(レイアウトは適用されない。)


ActiveRecordを使う
config/dependencies.rbのuse_ormのうち、activerecordのコメントアウトを外す。
merb_activerecordをインストール。
gem install merb_activerecord
config内のdatabase.sample.ymlを元にdatabase.ymlを作り、DB接続設定を書く。
:development: &defaults
:adapter: mysql
:database: database_name
:username: user_name
:password: password
:host: localhost
:socket: /var/lib/mysql/mysql.sock
:encoding: utf8
文字コード指定はRailsと同様に。これで日本語もDBから取得できた。


POSTしたデータを受け取る
Railsと同様に<input name="foo[bar]" />を、params[:foo][:bar]で受け取ることができる。


デーモンとして起動する
Merbをデーモンとして起動できる。
merb -d
しかし"merb -k all"や"merb -K all"では停止できなかった。
デーモンとして起動しているとactionの変更が反映されないので、開発中は逐次起動する使い方のようだ。


使ってみた印象
Railsよりシンプルで良さそう。ファイル名とかもシンプルだし。
RailsがActiveRecordからJavaScriptまで風呂敷に包んではいどうぞお手軽ですよーなブラックボックスなのに対して、Merbはそれらを電子ブロックのように外付けモジュールにして本体は身軽にしているイメージ?結局やることはそれほど変わらないが、シンプルな方が上に薄いカスタマイズレイヤーを被せるときに楽だ。
ruby2rubyを使っているところをみると、controllerとviewを実行時に実行用のrubyスクリプトとして再編成している?

ところで、Merb | Looking for a better framework? を見ると、"gem install merb --include-dependencies" だけでインストールできるみたいに書いてある(?)


参考: Merb Docs - File: README (本家マニュアル)

Rails 2.0.2 でMySQLを使う

Railsは2.0.1まではデフォルトのDBがMySQLだったが、2.0.2からデフォルトのDBがSQLiteになった。
2.0.2でプロジェクトを作成すると、デフォルトのdatabase.ymlの内容がSQLite用のものになる。

これまで通りMySQLを使いたい場合はプロジェクト作成時にDBを指定する。

rails -d mysql プロジェクト名

database.ymlには文字コードやsocketもデフォルトで記述されるようになった。
些細なことだがちょっと便利だ。
development:
adapter: mysql
encoding: utf8
database: プロジェクト名_development
username: root
password:
socket: /var/lib/mysql/mysql.sock


参考: WEB2MEMO =PHP、Ajax、JAVA、Flex2、Ruby、Rails等のメモ= RailsでDBを指定する(Ruby on Rails)

CentOSで Rails 2.0.2 / SQLiteを使ってみる

Rails2.0になって少し仕様が変わったらしいのでメモを残しておく。
Rails 2.0のscaffoldを使ってみた - idesaku blogを参考に。(できるだけそのまま実行。)

2.0.2ではデフォルトのDBがSQLiteなので、SQLiteを使う場合のプロジェクト作成はDB指定無しでOK。

rails trial

SQLiteならdatabase.ymlの編集が要らない。これは試しに使うには楽だ。
cd trial
ruby script/generate scaffold person name:string age:integer

ここまでは順調。
rake db:migrate
エラー発生。
(in /tmp/rails_app/trial)
rake aborted!
no such file to load -- sqlite3
gemでsqlite3-rubyをインストール。(参考:【実践】RoR とAIRでデスクトップアプリを作る 4 - kajilog
gem install sqlite3-ruby
sqlite-ruby 1.2.1を選択すると「make: *** `sqlite3_api_wrap.o' に必要なターゲット `ruby.h' を make するルールがありません.」というエラーになる。
sqlite-ruby 1.2.0ならインストールできるが、これはmigrateができない。

調べた結果、sqlite-develをインストールするらしい。(参考: gem install sqlite3-ruby でエラー発生 (技術メモ)
("sqlite3-devel"でなくてよいのか?)
yum install sqlite-devel

これでsqlite-ruby 1.2.1がインストールできるようになった。migrateも無事にできた。


補足: SQliteにコマンドラインからアクセス
sqlite3のパラメータとして、アクセスしたいSQLiteのデータファイルのパスを渡す。
sqlite3 db/development.sqlite3
SQLiteから抜けるには[Ctrl + D]、または".exit"。

でもきちんと使うならSQLiteはきつい。Query BrowserのあるMySQLを使うだろう。


参考: sqlite: SQLite データベースと会話するプログラム

2007年12月26日水曜日

YUI 2.4.1 リリース

CSS関連(base, fonts, grids & reset)については、2.4.0から変更無し。

2007年12月16日日曜日

RSS/AtomフィードのXMLの作り方メモ

とりあえず、必要最小限の要素だけを作る方法のメモ。


RSS1.0
シンプルなRSSの全体に、Dublin Coreモジュールのdateを加える。
各itemのdescriptionにはエスケープしたhtmlを入れられる。

<?xml version="1.0" encoding="utf-8" ?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/"
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xml:lang="ja">

 <channel rdf:about="http://example.com/rss1.rdf">
  <title>RSS1.0 Test</title>
  <link>http://example.com</link>
  <description>RSS1.0のテスト</description>
  <items>
   <rdf:Seq>
    <rdf:li rdf:resource="http://example.com/page1"/>
    <rdf:li rdf:resource="http://example.com/page2"/>
   </rdf:Seq>
  </items>
 </channel>

 <item rdf:about="http://example.com/page1">
  <title>ページ1</title>
  <link>http://example.com/page1</link>
  <description>1つ目のページ</description>
  <dc:date>2007-01-01T00:00:00+09:00</dc:date>
 </item>

 <item rdf:about="http://example.com/page2">
  <title>ページ2</title>
  <link>http://example.com/page2</link>
  <description>2つ目のページ</description>
  <dc:date>2007-01-02T03:04:05+09:00</dc:date>
 </item>
</rdf:RDF>


RSS2.0
▽PHP4でRSS配信プログラム xmlファイルの作成からlastBuildDateを削除し、各itemにdescriptionを追加する。
(lastBuildDateはあったほうがよい?)
docs要素はなくてもいいが、せっかくなので付けておく?
他のフィードと違い、日付はRFC2822形式(例:Sun, 05 Nov 2006 16:53:33 +0900)。
フィード自体のURLを示す箇所が無い。
各itemのdescriptionにはエスケープしたhtmlを入れられる。
<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
 <channel>

  <title>RSS2.0 Test</title>
  <link>http://example.com</link>
  <description>RSS2.0のテスト</description>
  <language>ja</language>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>

  <item>
   <title>ページ1</title>
   <link>http://example.com/page1</link>
   <description>1つ目のページ</description>
   <pubDate>Mon, 01 Jan 2007 00:00:00 +0900</pubDate>
  </item>

  <item>
   <title>ページ2</title>
   <link>http://example.com/page2</link>
   <description>2つ目のページ</description>
   <pubDate>Tue, 02 Jan 2007 03:04:05 +0900</pubDate>
  </item>

 </channel>
</rss>


Atom0.3
2章 Atomフォーマット - The Atom Syndication Formatの"Atomフォーマットの構成"からフィード全体の日時(modefied)を削除し、各entryにsummaryを追加する。
xml:lang属性もfeed要素あたりに付けておく。
Atom1.0とは違い、フィード全体のidは必須ではない。
フィード自体のURLを示す箇所が無い。
各entryの2つの日時(issued、modefied)は必須。
各entryのidについてはAtom1.0と同様。
ベタなテキストでなくhtmlを入れたいなら、summaryの代わりにcontent要素を使う。
<?xml version="1.0" encoding="utf-8" ?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xml:lang="ja">

 <title>Atom feed 0.3 Test</title>
 <link rel="alternate" type="text/html" href="http://example.com"/>
 <author>
  <name>ぼく</name>
 </author>

 <entry>
  <title>ページ1</title>
  <link rel="alternate" type="text/html" href="http://example.com/page1"/>
  <id>http://example.com/page1</id>
  <modified>2007-01-02T00:00:00+09:00</modified>
  <issued>2007-01-01T00:00:00+09:00</issued>
  <summary>1つ目のページ</summary>
 </entry>

 <entry>
  <title>ページ2</title>
  <link rel="alternate" type="text/html" href="http://example.com/page2"/>
  <id>http://example.com/page2</id>
  <modified>2007-01-02T03:04:05+09:00</modified>
  <issued>2007-01-02T03:04:05+09:00</issued>
  <summary>2つ目のページ</summary>
 </entry>

</feed>



Atom1.0
簡単なAtomフィード文書を元にする。
xml:lang属性もfeed要素あたりに付けておく。
feedおよび各entryのid要素は"永久的で完全に一意的な識別子"なので、手軽に済ますならfeedやentryを一意に示すURLでよいと思う。
パーマリンクは一意と言えないという意見もある。それが理由かは分からないがAtomの基本的なフィードの例ではurlのtagスキームを、簡単なAtomフィード文書のサンプルではurnを使っている。)
feed全体のupdated日時が必須。
linkでrel属性を指定しないとrel="alternate"とみなされる。
summaryとcontentについてはAtom0.3と同様。
フィードリーダーによってはAtom1.0は対応していないので注意が必要。(他のフィードと併用するなど。)
<?xml version="1.0" encoding="utf-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">

 <title>Atom feed 1.0 Test</title>
 <link href="http://example.com"/>
 <link rel="self" href="http://example.com/atom1.xml"/>
 <author>
  <name>ぼく</name>
 </author>
 <updated>2007-12-12T14:20:37+09:00</updated>
 <id>http://example.com/atom1.xml</id>

 <entry>
  <title>ページ1</title>
  <link href="http://example.com/page1"/>
  <summary>1つ目のページ</summary>
  <updated>2007-01-01T00:00:00+09:00</updated>
  <id>http://example.com/page1</id>
 </entry>

 <entry>
  <title>ページ2</title>
  <link href="http://example.com/page2"/>
  <summary>2つ目のページ</summary>
  <updated>2007-01-02T03:04:05+09:00</updated>
  <id>http://example.com/page2</id>
 </entry>

</feed>



補足:日付のタイムゾーンについて
フィードリーダーによっては、タイムゾーンが正しく読めない? UTC (例:2005-11-16T02:27Z)で配信する?


関連記事: RSS/Atomフィードを生成したりSitemapを作成するPHPライブラリ


参考:
RSS1.0
 RSS(RDF Site Summary)によるサイト情報の要約と公開 (RSS1.0についての解説)
 RDF Site Summary (RSS) 1.0 (RSS1.0仕様書の和訳)
RSS2.0
 RSS 2.0 Notes (RSS2.0仕様書を元にした解説)
 RSS 2.0 Specification 日本語訳 - futomi's CGI Cafe (RSS2.0仕様書の和訳)
 ホームページ作成 / Yaskey Diary (RSS2.0のシンプルな例)
Atom0.3
 2章 Atomフォーマット - The Atom Syndication Format (Atom0.3仕様書の和訳)
Atom1.0
 Atom - RSS改訂の試み (Atom1.0についての解説)
 RFC 4287 The Atom Syndication Format 日本語訳 - futomi's CGI Cafe (Atom1.0仕様書の和訳)
 An overview of the Atom 1.0 Syndication Format (Atom1.0の解説)
その他
 Web標準の日時の形式 | Web::Blogoscope (日付形式について)
 RSS1.0とRSS2.0 - fox.tech - by fox_b (RSS仕様の分裂について)

RSS/Atomフィードの Content-Type

下記のそれぞれのContent-Type(MIME Type)でフィードリーダーが動作するか実験。

  • application/xml
  • application/rdf+xml
  • application/rss+xml
  • application/atom+xml


実験に使ったフィードリーダーは下記の4つ。
  • Firefox2
  • IE7
  • Google Reader
  • goo RSSリーダー(V3.6)


結果: 全て動作した。

2007年12月15日土曜日

文字コード指定の大文字小文字

XML宣言(<?xml version="1.0" encoding="Shift_JIS" ?>)のencodingや、HTMLのmetaタグ(<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">)のcharset等で使われる文字コード名は、大文字・小文字のどちらを使っても問題ない、と決められている。

However, no distinction is made between use of upper and lower case letters.

ただし、それを利用するアプリケーションが大文字・小文字のどちらでも正しく動くかどうかは、そのアプリケーション次第なので、IANAで決められている表記に合わせた方が無難だと思われる。

Rubyの Dateと Timeと DateTimeの比較

RubyのTimeクラスとDateクラス、DateTimeクラスの比較。
Timeクラスはtime.rbを読み込まなかった場合で比較。


Time

  • 日付と時間を扱う
  • 組み込みクラス(requireしなくても使える)
  • 現在日時で生成するには、Time.now
  • 日時を指定して生成するには、Time.gm(...) or Time.utc(...) or Time.local(...) or Time.mktime(...)
  • 文字列に変換すると、C言語のctime()に準じた形式になる (例:Tue Dec 11 15:25:35 +0900 2007 )

Date
  • 日付を扱う
  • 使うには require "date" する必要がある
  • 現在日付で生成するには、Date.today
  • 日付を指定して生成するには、Date.new(...)
  • 文字列に変換すると、ISO8601形式になる (例:2007-12-11 )

DateTime
  • 日付と時間を扱う
  • Dateクラスのサブクラス。使うには require "date" する必要がある
  • 現在日時で生成するには、DateTime.now
  • 日時を指定して生成するには、DateTime.new(...)
  • 文字列に変換すると、ISO8601形式になる (例:2007-12-11T15:31:30+0900 )


補足
  • 日時を表す文字列から日時情報を取り出すには、ParseDate::parsedate()が使える。(日付だけならDate.strptime()でもできる。)
    require "parsedate"
    p ParseDate::parsedate("Tue 18, Dec 2007 15:52:30 +0900")
    #=> [2007, 12, 18, 15, 52, 30, "+0900", 2]
  • DateTimeクラスでタイムゾーンを指定するには、Rationalクラスを使う。Ratinalの第1引数にタイムゾーンの時間差、第2引数には24を指定する。
    require "date"

    # 生成時に指定する場合

    d = DateTime.new(2007, 12, 18, 15, 57, 30, Rational(9, 24))
    print d #=> 2007-12-18T15:57:30+0900

    # 後から指定する場合
    d2 = d.new_offset(Rational(-5, 24))
    print d2 #=> 2007-12-18T15:57:30-0500
  • 標準添付のtime.rbを読み込む(require "time")と、いろいろ便利なメソッドが使える。
    require "time"

    # 日時の文字列をパース
    t = Time.parse("2007-12-11T18:21+09:00")

    # RFC2822形式で出力
    print t.rfc2822 #=> Tue, 11 Dec 2007 18:21:00 +0900

    # ISO8601形式で出力
    print t.iso8601 #=> 2007-12-11T18:21:00+09:00



参考
 逆引きRuby - 日付と時刻
 日付の表記に関するノート
 DateTimeにタイムゾーンを設定する。 - こせきの技術日記
 Rubyで日付・時間を操作 - I sort my thought...

AdSenseクリック時のリダイレクト

AdSenseをクリックしたらどんな遷移を辿るか?
試しにをクリックしてFirefoxアドオンのLiveHTTPHeadersで観察してみた。
(最近よく参考にした某ソフトのまとめWikiのAdSenseで。)


クリック

http://pagead2.googlesyndication.com/pagead/iclk?...(略)
↓ "HTTP/1.x 302 Found"
http://pagead2.googlesyndication.com/pagead/adclick?...(略)
↓ "HTTP/1.x 302 Found"
http://ad.jp.doubleclick.net/clk...(略)
↓ "HTTP/1.x 302 Moved Temporarily"
広告主のページ


間にDoublecilckを経由していた。
(全てのAdSenseがこれと同じ遷移をたどるかどうかは分からない。)

2007年12月11日火曜日

YUI CSS 2.4.0の変更箇所

YUI Library CSS Tools 2.4.0の、2.3.1から変更があった箇所の洗い出し。
影響がありそうなのは、テキストボックスのwidthくらいか。


reset.css

  • 全体の背景色とフォントカラーを指定する要素が、bodyからhtmlに変わった
    #2.3.1
    body{
     color:#000;
     background:#FFF;
    }
    #2.4.0
    html{
     color:#000;
     background:#FFF;
    }
  • sup、sub要素のline-height指定が無くなった
    #2.3.1
    sup,sub{
     line-height:-1px;
     vertical-align:text-top;
    }
    sub{
     vertical-align:text-bottom;
    }
    #2.4.0
    sup{
     vertical-align:text-top;
    }
    sub{
     vertical-align:text-bottom;
    }
  • legend要素の文字色を追加 (IEのみデフォルトが青色であることへの対処)
    legend{
     color:#000;
    }

base.css
  • pre要素のmargin-bottomの追加
    #2.3.1
    p,fieldset,table{
     margin-bottom:1em;
    }
    #2.4.0
    p,fieldset,table,pre{
     margin-bottom:1em;
    }
  • テキスト入力系要素の幅指定の追加
    input[type=text],input[type=password],textarea{
     width:12.25em;
     *width:11.9em;
    }

fonts.css
  • bodyのline-heightの拡大
    #2.3.1
    body {
     font:13px/1.22 arial,helvetica,clean,sans-serif;
     *font-size:small;
     *font:x-small;
    }
    #2.4.0
    body {
     font:13px/1.231 arial,helvetica,clean,sans-serif;
     *font-size:small;
     *font:x-small;
    }
  • monospace系要素のline-heightの微調整
    #2.3.1
    pre,code,kbd,samp,tt{
     font-family:monospace;
     *font-size:108%;
     line-height:99%;
    }
    #2.4.0
    pre,code,kbd,samp,tt{
     font-family:monospace;
     *font-size:108%;
     line-height:100%;
    }

grids.css
  • 変更無し

ちょっと変わった URI スキーム

URIスキーム一覧を見ていたら意外なスキームがいろいろあった。


aaa: Diameter Protocol
 Authentication, Authorization and Accounting の略らしい。
 "aaa:bbb.cc"なんて楽しげ。

shttp: Secure Hypertext Transfer Protocol
 見間違いかと思ったが、httpsの普及により使われなくなったプロトコルらしい。

fax: fax
tel:と同じ感覚なんだろうけど、送信できるのか?

tv: TV Broadcasts
 これは今なら使われても不思議じゃない。

2007年12月7日金曜日

Firefoxでの上の画像と下の画像のすき間を無くす方法

Webページで画像を縦に並べて表示した場合、IEでは問題ないがFirefoxでは間にすき間が空いてしまうことがある。

<div>
<img src="fx.png" alt="test" /><br />
<img src="fx.png" alt="test" />
</div>


このすき間を無くすには、スタイルシートで"line-height:0"を指定すればよい。
<div style="line-height:0;">
<img src="fx.png" alt="test" /><br />
<img src="fx.png" alt="test" />
</div>




テキストも表示している場合はline-heightの指定場所など工夫が必要かも。

XMailのSpam対策強化

XMailCFGの最新版2.29がリリースされ、アンチスパム機能が強化された。
特に、「メッセージボディに日本語(2バイト文字)が含まれないメッセージをスパムとみなすオプション」が手軽で有効と思われる。
ただし、スパム対策が強化されたことにより、これまで正常に送受信できていたメールがスパム扱いになる可能性もあるので設定の調整が必要。

また、2.29には「スパムアドレスの管理」「スパムホストの管理」を更新できないというバグがある。
更新しようとするとページが見つからないエラーになる。(2.29ではスパム関連のCGIのファイル名が変わったが、formのPOST先のファイル名が2.28の頃のままになっている。)
XMailCFGの更新は割りと頻繁なので、年内にも修正版がリリースされるのではないだろうか。(推測)

2007年12月6日木曜日

コマンドプロンプトで繰り返し処理

Windowsのコマンドプロンプトでのループ処理の書き方。

コマンドプロンプトのfor文はファイル・ディレクトリのセットに対しての繰り返し処理がメインだが、オプション(/l)を指定すれば単純なループにも使える。

for /l %変数 in (開始,ステップ,終了) do コマンド [コマンドパラメータ]

例:1~10までの数字についての処理 (またはある処理を10回繰り返す)
for /l %%A in (1, 1, 10) do (
 rem 繰り返す処理
 echo %%A
)


また、for文を活用すればコマンドプロンプトで文字列を置換することもできる。


ただし、繰り返し処理の中で変数をsetしたい場合はsetコマンドの遅延展開が問題になる。
この場合はgotoとif文を使ってループを組み立てたほうが無難。スマートではないが。
set num=1
:loop1
 rem 繰り返す処理
 echo %num%
 set /a num=%num%+1
if not %num% == 11 goto loop1

コマンドプロンプトでは数値の計算はsetを使うので、ループの中で計算を使う場合は後者の方法を選択することになる。

例:0.1~1.0を表示する
set num=1
:loop1
set /a sho=%num% / 10
set /a amari=%num% %% 10
echo %sho%.%amari%
set /a num=%num% + 1
if not %num% == 11 goto loop1

Windows版 Safari 3 beta (3.0.4) の日本語設定

デフォルトでは日本語が文字化けしていた。
日本語を読み書きするには下記の設定をする。

  1. メニューから、「Edit」→「Preferences」→「Apperance」を選択
  2. 「Default Encoding」を「Unicode (UTF-8)」等の日本語対応の文字コードにする
  3. 「Standard font」は日本語対応のフォントにする

※3は不要かも。

2007年12月1日土曜日

GFE (Google Front End) とは

BloggerやGoogle DocsのHTTP Responseは、Webサーバとして"GFE"が使われていることを示している。この"GFE"とは"Google Front End"の略で、GoogleがカスタマイズしたApacheらしい。

Apacheのシェアが落ち込んだのは、Googleが自社サーバを独自に手を加えたGoogle風Apache「Google Front End」サーバに切り替えたためだ。AJAXとサーバ側Javaをフル活用するGoogle Front Endは、ページの読み込みが高速化されている。

上記の記事によると、他にもGoogleはUbuntuをカスタマイズした"Goobuntu"を使っているらしい。本家版gOS

YUI Base CSS 2.3.1 リリース

Yahoo! UI LibraryのBase CSSが2.3.1になった。
内容は2.3.0と同じ。YUI Library CSS Toolsの他のCSS(Reset、Fonts、Girds)とバージョンを合わせただけみたい。

メールアドレスのドメイン部分の最大文字数

PostPetメールアカウントでは21文字以上になるので注意。30文字くらいまで許したほうが無難。

2007年11月27日火曜日

DoCoMoのFlash Lite3用動画を作るための覚え書き

DoCoMoはFlash Lite 3対応の905iシリーズを2007年11月末から販売開始する。

Flash Lite 3ではFLVを見られるが、905iではYouTubeは見られない。

なお、Flash Lite 3は動画(FLV)対応が特徴の1つとされているが、ドコモ広報によれば「(905iで)YouTubeは利用できない」とのこと。

(少なくとも今回のDoCoMoでは)FLVは再生できない可能性が高い
昨日『Flash Lite 3.0 対応 NTT DoCoMo 携帯電話用 Adobe Flash CDK』がアドビのサイトから提供開始され、結局、NetConnection、NetStreamといった外部ビデオに関するクラスと、XMLSocketといった通信系のクラスがサポートされないことが判明。

(2007/11/30 追記)
Flash Lite 2.xにはNetStreamは無く、その代わりにVideoオブジェクトにメソッドが追加されていてそれを使って動画を再生する。(参考:Flash Lite 2.x ActionScript リファレンスガイド -Video ) これにより再生できるのはモバイルデバイス固有のビデオ形式(3GPP、3GPP2)なので、FLVの再生はできない。
Flash Lite3では、追加されたNetStreamオブジェクトなどを使うことによりFLVの再生が可能になったが、このオブジェクトは「i モード端末のみでサポートされていません」とリファレンスの最後の方に書いてある。
(追記終わり)

参考:au・SoftBankのFlash Lite 2でも動画の再生はできない(詳細は下記リンク先を参照。)
Flash Lite 2.0 からの新機能である動画再生にトライしていますが、 Flashのエミュレーターでは再生できても、端末では表示も再生もできないという状態です。 既に2.0対応端末で動画再生に成功した方いらっしゃれば是非ご教授いただきたいと思いますが、いかがでしょうか。

(2007/11/30 追記)
手元のauで確認したが、やはり再生できなった。現象としては上記リンク先と同じで、開発環境(Flash Pro8)では再生できるが実機では再生できない。
System.capabilities.videoMIMETypesは開発環境では"video/3gp,video/3g2,video/mp4,video/cmx"だが、実機では値無し。
(追記終わり)



以下は将来的にFLVをサポートした時のための覚え書き。


Flash Lite 3のビデオコーデックはFlash7/8の新旧両方に対応。
Flash Lite 3には、On2 VP6とSorensonビデオコーデックのサポートも含まれています。


DoCoMo用HTMLにFlashを埋め込む場合は通常のFlash埋め込みobjectタグと違うので注意。
記述フォーマット
<object data="[URL]" type="application/x-shockwave-flash" width="[横サイズ]" height="[縦サイズ]">
<param name="bgcolor" value="[ColorName/ColorCode]">
<param name="loop" value="on/off">
<param name="quality" value="high/medium/low">
</object>

(2007/11/30 追記)
参考までに、auの場合はこう。
<object data="#{swfのURL}" type="application/x-shockwave-flash" copyright="no" standby="#{リンクとして表示する文字列}">
<param name="disposition" value="devfl7z" valuetype="data" />
<param name="size" value="#{swfのファイルサイズ(単位はバイト)}" valuetype="data" />
<param name="title" value="#{保存する時のファイル名}" valuetype="data" />
</object>

ファイルサイズは指定しなくても可。
参考:
 KDDI au: マルチメディア・コンテンツ > Flashコンテンツ
(追記終わり)


Flash Lite 3がある程度普及するのは2008年末~2009年くらいか。
DoCoMoはもうこのままFLVをサポートしない?
auやSoftBankがFlash Lite 3をいつ採用するかは未発表。


参考:
 ドコモ、905iシリーズ主要機種の発売日を決定 - 11月中に7機種連続投入 | 携帯 | マイコミジャーナル
 ×○式 観察記録 : 期待のFlash Lite 3 期待できないFlash 10

Windows版Apache2.2.xでrotatelogs.exeのプロセスが残る

Windows版のApacheで、Apacheを停止してもrotatelogsのプロセスが残ってしまう問題。Apache2.2.3~2.2.5で発生した。(2.2.3より前は試してないので分からない。)

参考になる記事が少ないが、海外の掲示板で見つけた。

In short - rotatelogs (and piped logging in general) has been improved for Apache 2.2.6 at the cost of disabling FastCGI programs and mod_perl.

There are still four processes created for rotatelogs (two for the Apache parent process and two for the Apache child process). This is because piped logs run a command-interpreter (CMD.EXE) in order to run the specified executable (rotatelogs.exe). This is apparently intentional. The log processes now all shut down correctly when Apache shuts down.


Apache2.2.6で問題が解消されたが、2.2.6では代わりにFastCGIとmod_perlに問題が発生しているということか。

PHPでログイン・ログアウト時にsession関連でやること

セキュリティを高めるなら、これにいろいろ追加する?


ログイン

session_regenerate_id(true)

ログアウト
$_SESSION = array();
session_destroy();


参考:
 PHP: session_regenerate_id - Manual
 PHP: session_destroy - Manual
 【PHP TIPS】 3. session_destroy関数はファイルを消すだけで、スクリプト内ではセッション変数が使えてしまう:ITpro

2007年11月21日水曜日

コマンドプロンプトで文字列を置換する

(2009/06/13 追記: コメント欄に、とても簡単に置換する方法を教えてもらったので、まずそちらを参考にすることをお薦めします。)


Widnowsのコマンドプロンプトで文字列の置換をする方法。
コマンドとしては提供されていないので、for文を利用する。

例えばシステム日付(例:2007/11/21)のスラッシュをハイフンにする場合。

@echo off
rem 変換したい文字列をセット

set before=%date%
rem 置換する文字をセット
set search=/
rem 置換後の文字をセット
set replace=-

rem 変数初期化
set after=
set replace_wk=

:loop
if "%before%" == "" goto :end
for /f "tokens=1* delims=%search%" %%A in ("%before%") do (
  set after=%after%%replace_wk%%%A
  set before=%%B
  set replace_wk=%replace%
)
goto :loop

:end
rem 変換結果の確認
echo %after%


対象文字列が日付だけなら、もっとシンプルにできる。
for /f "tokens=1-3 delims=/" %%A in ("%date%") do set today=%%A-%%B-%%C
echo %today%


()の中で変数を使う場合、遅延展開が絡んでくるので注意。(参考:setコマンドの遅延展開について (DOSプロンプト活用相談室LOG)


参考: コマンドプロンプトを使ってみよう! -バッチファイル-

psqlで対話型の簡易アプリ

備忘録として。
Windowsで簡易的に、いくつかの条件を入力後にSQLを実行するアプリ(batファイル)のサンプル。

前提条件

  • psqlがインストールされていること (PostgreSQLがインストールされていればbinフォルダにpsql.exeがある)
  • pgpass.confがあり、必要なログイン情報が書かれている (PgAdminⅢを使っていれば自動で作られる?)
    • pgpass.confは通常は C:Documents and Settingsユーザー名Application Datapostgresql にある。(Application Dataフォルダは、フォルダオプションで「すべてのフォルダとファイルを表示する」にしていないと表示されない)
      参考:パスワードファイル
    • このファイルが無いと、psql実行時にパスワード指定無しでの実行ができない

サンプルコマンド
@echo off
rem 必要な入力項目を入力してもらい、コマンドプロンプトの環境変数にセットする。
set /p foo_no= 番号を入力してください:
rem psqlのオプションとして-cを指定してパラメータのSQLを実行する
rem SQLにはコマンドプロンプトの環境変数を埋め込んでおく
C:(略)psql DB名 -U ユーザー名 -c "SELECT bar FROM baz WHERE foo_no = %foo_no%"
rem pause(「続行するには何かキーを押してください . . .」)より分かりやすいメッセージを表示したい
set /p foo_no= 終了するにはEnterキーを押してください

2007年11月18日日曜日

TracのWikiをWYSIWYGにするプラグイン

インストール方法
 
easy_install が入っていることが前提

easy_installで"TracWiki WYSIWYG Editor Plugin"をインストール

easy_install http://trac-hacks.org/svn/tracwysiwygplugin/0.11
Tracが0.10の場合は最後の数字を0.10にする。



設定方法
 ※Tracのバージョンが0.11(以降)の場合
  1. Trac上部メニューの右端の"Admin”をクリック → Administrationページが表示される
  2. Administrationページの左側のメニューの"Plugins"をクリック → インストールされているプラグインの一覧が表示される
  3. tracwysiwygの設定を開き、"Enabled"の両方をチェックして"Apply changes"ボタンをクリック


使用方法
Wikiの編集ページで、テキストエリアの右上にある"wysiwyg"を選択状態にする



参考: TracWysiwygPlugin - Trac Hacks - Plugins Macros etc. - Trac

mod_ruby on CentOS 5 インストールメモ

インストール手順

  1. apxs(APache eXtenSion)が必要なのでhttpd-develをインストール
    yum -y install httpd-devel
    ・けっこう時間がかかる
    ・apxsは /usr/sbin/apxs にできた
  2. modruby.netから最新版のmod_rubyをダウンロード&解凍
    wget http://www.modruby.net/archive/mod_ruby-1.2.6.tar.gz
    tar zxvf mod_ruby-1.2.6.tar.gz
  3. makeの準備
    cd mod_ruby-1.2.6
    ./configure.rb --with-apxs=/usr/sbin/apxs --with-apr-includes=/usr/include/apr-1
    make
    make install
    ・--with-apr-includesを付けないとmakeできなかった
    ・参考:mod_rubyのインストール :: colorchips blog
  4. Apacheの設定ファイルを新規作成
    cd /etc/httpd/conf.d
    vi ruby.conf
    ・ruby.conf
     (2007/11/20 追記:ExecCGIの前に"+"を追加。そうしないとmod_rewriteとかが使えなくなる)
    LoadModule ruby_module modules/mod_ruby.so

    <IfModule mod_ruby.c>
    RubyRequire apache/ruby-run

    # /ruby以下のファイルをRubyスクリプトとして実行する
    #<Location /ruby>
    # SetHandler ruby-object
    # RubyHandler Apache::RubyRun.instance
    #</Location>

    # *.rbをRubyスクリプトとして実行する
    <Files *.rb>
    SetHandler ruby-object
    RubyHandler Apache::RubyRun.instance
    </Files>

    #Rubyを実行するディレクトリでCGIを実行可能にする
    <Location /r>
    Options +ExecCGI
    </Location>
    </IfModule>


補足
  • mod_rubyはページ内容出力前にHTTPヘッダ情報を出力する必要がある
    • cgi.rbを使うとスマート
      require "cgi"
      cgi = CGI.new
      print cgi.header("type" => "text/html")
    • 参考:mod_ruby Wiki (ja) - FAQ
  • rbファイルのディレクトリの権限を777にすると、mod_rubyは loading from unsafe file で SecurityError になる
  • requireするファイルを変更した場合、Apacheを再起動するまで反映されない
    • 参考:mod_ruby Wiki (ja) - FAQ
      mod_rubyでは複数のスクリプトで一つのRubyインタプリタを共有します。 require 'foo'を実行した場合、ライブラリがロードされるのは 最初の一回だけなので、その後require 'foo'を実行しても ライブラリが再びロードされることはありません。
      (略)
      Apacheを再起動するか、デバッグ中はrequireの代りに loadを使ってください。


参考:
mod_ruby インストールガイド

PHPでブラウザキャッシュを有効にする

IE6ではCache-Controlが優先される。Cache-Controlがある場合、Pragma、Expiresは無視される。
FirefoxではExpiresとPragmaが優先され、両方無ければCache-Controlが適用される。
→ ExpiresとPragma無しでCache-Controlの設定をすればほとんどのブラウザに対応できる。(IE7は?)

PHPでCache-Controlを設定する方法。
※header()より先に他の出力をしてはいけない。

$strDate = 'tomorrow'; //翌日の0時までキャッシュさせる場合
$dt = new DateTime($strDate);
header('Cache-Control: max-age=' . ($dt->format('U') - time()));

PHPではSESSIONを使うと過去日付のExpiresと"Pragma: no-cache"が設定され、クライアントキャッシュが無効になる。
Firefoxの場合ExpiresとPragmaが優先されてしまうので、PHPでSESSIONを使い、かつクライアントキャッシュを有効にするには、未来日付のExpiresと適当なPragmaでhttpヘッダーを上書きする。(Pragmaには"no-cache"以外の設定値は無い)
$strDate = '+2 days'; //現在日時から2日後までキャッシュさせる場合
$dt = new DateTime($strDate);
header('Cache-Control: max-age=' . ($dt->format('U') - time()));
if (session_id()) { //session_startしている場合
 header('Expires: ' . $dt->format(DATE_RFC1123));
 header('Pragma: cache'); //no-cache以外の文字列をセット(横暴?)
}


参考:
 OZACC.blog: HTTPヘッダでのキャッシュ制御 2
 [Studying HTTP] HTTP Header Fields
 PHP: header - Manual
 PHP: 日付・時刻関数 - Manual
 PHP: セッション処理関数(session) - Manual

2007年11月13日火曜日

Google AdSenseの新機能「広告の管理」

広告ごとの設定をIDで管理できるようになった。IDごとに名前を付けられる。
設定を変更したい場合はAdSenseの管理画面で設定を変更して保存するだけなので便利。ただしサイズについては変えられない。
サイトに貼り付けるコードは、色情報などが無くなりすっきりしたコードになった。しかし幅・高さについては残っている。

管理の対象は「コンテンツ向けAdSense」のみ。携帯向けAdSenseなどは対象外。

Trac 0.11 on Windows 構築メモ

作業前の環境

  • Apache 2.2
    • メインのWebサーバ
    • これではSubversion 1.40へのアクセスはできない
  • Apache 2.0
    • Subversionへのアクセス専用
    • Apache 2.2からリバースプロキシでアクセスする
  • Trac 0.10
  • Python 2.4
  • Subversion 1.40 for Apache 2.0
    • Tracが足枷となりバージョンアップできないでいた



作りたい環境 (全て現時点の最新版にする)
  • Apache 2.2 (変更無し)
  • Trac 0.11dev
    • Trac 0.10のデータや設定を引き継ぐ
    • Subverion 1.45のリポジトリを見られるようにする
  • Python 2.5
  • Subversion 1.45 for Apache 2.2
    • Subversion 1.40のデータを引き継ぐ
    • Apache 2.2経由でアクセス可能にする


Apache 2.5 & Subversion 1.45 にするには、Tracを0.11にしなくてはいけないらしい。(ClearSilverが足枷?) Trac 0.11はまだdev版しかない。
また、今回はTracのインストールにSetuptools(easy_install?)を使う。


Trac 0.11 on Windows 構築の足跡
※インストールの手順としては「11.問題発生」は読む必要は無いが、参考資料として残しておく。
※「Unsupported version control system "svn"」の解決方法を知りたいだけなら「12.libapr-1.dllのバージョン差異を解消」を読んでね。

  1. 古いバージョンをそれぞれアンインストール
  2. Subversion 1.45をインストール
    ・Apache 2.2用をsubversion: ドキュメント & ファイル: Windows Apache 2.2.xからダウンロード
    ・インストーラが付いてない
    ・コマンドプロンプトの文字化けは、コマンドプロンプト上で下記コマンドを入力することにより解消 (参考:UTF-8とコマンドプロンプトとMySQLモニタ | Sarabande
    chcp 65001
    ・サービスとしての実行方法はsvnserve ベースのサーバ参照。以前登録したサービスが残っていてPathが同じならそのサービスを起動するだけでOK。
  3. httpd.confにSubversion用設定追加
    ・たぶんこれだけ (リポジトリの方もバックスラッシュじゃなくていいかも)
    LoadModule dav_module modules/mod_dav.so
    LoadModule dav_fs_module modules/mod_dav_fs.so
    LoadModule dav_svn_module "C:/<Subversionのディレクトリ>/bin/mod_dav_svn.so"
    LoadModule authz_svn_module "C:/<Subversionのディレクトリ>/bin/mod_authz_svn.so"
    <Location /svn>
    DAV svn
    SVNParentPath c:<Subversionリポジトリのディレクトリ>
    </Location>
    ・必要に応じて Digest認証 or Basic認証も設定
  4. Python 2.5をインストール
    Download Python Softwareからダウンロード
    ・インストール後にサーバ再起動が必要
  5. Setuptools(easy_install?)をインストール
    ・Python版のPEARやGemsやCPANシェルみたいなものらしい
    Python Package Index : setuptools 0.6c7からダウンロード
    ・インストールすると、PythonのScriptsディレクトリに、easy_install.exeなどが作られる
  6. Tracをインストール
    ・現時点ではTrac 0.11をインストールするにはTracのSubversionリポジトリから取得する必要がある
    ・PythonのScriptsディレクトリでコマンドプロンプトを開き、下記を実行 (参考:0.11/TracInstall - The Trac Project - Trac
    easy_install http://svn.edgewall.com/repos/trac/trunk/
    ・Genshiも一緒にインストールしてくれる
    ・SubversionのbinディレクトリにWindowsのPathを通してないとエラーになると思う。(svnを使うため。)
  7. TracプロジェクトをUpgrade
    ・Trac 0.11用にプロジェクトとWikiをそれぞれUpgradeする
    ・参考:0.11/TracUpgrade - The Trac Project - Trac
    ・TracプロジェクトのDowngradeはできないとどこかに書いてあった気がするので気を付ける
  8. Mod_Pythonをインストール
    ・ApacheからTracへの橋渡しをするためのモジュール
    Index of /dist/httpd/modpython/winからダウンロードしてインストールする
  9. httpd.confのTrac用設定
    ・以前とほぼ同じ
    TracModPython - The Trac Project - Tracで勧められているPythonInterpreterを追加した。(なくても動きそう。)
    LoadModule python_module modules/mod_python.so
    <Location "/trac">
    SetHandler mod_python
    PythonInterpreter main_interpreter
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnvParentDir <Tracのデータのディレクトリ>
    PythonOption TracUriRoot /<TracのURL(ドメインの下の部分)>
    </Location>
  10. svn-pythonをインストール
    ・TracからSubversionへの橋渡しをするためのモジュール
    subversion: ドキュメント & ファイル: Windows Apache 2.2.xからダウンロード
    ・TracでSubversionリポジトリを表示しないなら不要。その場合はtrac.iniの"repository_dir"は空欄にしておく (コメントアウトでもいいかも)
    ・下記のようにURLを指定すればeasy_installからのインストールもできる (参考:Fusioncube » Blog Archive » Installing Trac 0.11
    easy_install -Z http://subversion.tigris.org/downloads/1.4.5-win32/apache-2.2/svn-python-1.4.5.win32-py2.5.exe
  11. 問題発生!Apache経由のTracからSubversionに連携できない
    ・Tracの全ページに下記エラーメッセージが表示される
    Warning: Can't synchronize with the repository (Unsupported version control system "svn". Check that the Python support libraries for "svn" are correctly installed.)
    ・Browse Sourceしようとすると下記エラーメッセージも表示される
    Unsupported version control system "svn". Check that the Python support libraries for "svn" are correctly installed.
    ・下記を処方したけど解決しなかった
     ・trac-adminでSubversionリポジトリをresync
     ・easy_installでpysqliteをインストール (Python2.5からpysqliteは標準で組み込まれているので、別途インストールしなくていいはずだけど試しに)
     ・Windows環境変数のPYTHONPATHにsite-packagesを設定 (参考:「Subversion」の検索結果 - 夏 DOKI Lisp スティック
     ・httpd.confでPythonPathをセット (参考:TracModPython - The Trac Project - TracSubversion/ViewVC - てんぷらメモ
     ・subversion: ドキュメント & ファイル: Windows Apache 2.2.xからsvn-win32-1.4.5_py25.zipをダウンロードして上書き
     ・libsvnにWindows環境変数のPATHを通す
     ・SWIGをインストール?
      ・SourceForge.net: Filesからswigwinをダウンロード
      ・インストールの仕方が分からなかった
    ・TracdでならSubversionと連携できた
     ・TracdでTracプロジェクトを全て起動しておき、Apacheからリバースプロキシする
     ・応急対応としては使える
     ・問題点:リバースプロキシ&Tracdだと、TracのWikiを更新した時にResponseが帰ってこない。(更新はされる)
    ・TracとSubversionの連携をやめる(trac.iniの"repository_dir"を空欄にする)ならこの問題は回避できる
    ・trac.iniでログ出力を有効(log_type = file)にしてログを確認してみる (参考:TracIni - akiyan.com - TracTracLogging - Snippets - Trac
     ・"libsvncore.py"のline 5 (import _core)で、「ImportError: DLL load failed: 指定されたプロシージャが見つかりません。」というエラーが出ている
     ・上記のエラーによりSubversion bindingsのloadが完了せず、その結果"svn"が見つからないエラーになるらしい
    ・同じ症状を訴えるメーリングリストを発見!
     ・[Trac] Re: Can't use svn on 0.11 trunk
    mod_python's python can't seem to find init_core() in _core.pyd (it CAN find the module though, it just can't find the procedure, so path issues here are probably out of the question).
    I rolled back to the 1.4.3 bindings and they work well to even in mod_python.

    ・この回答から下記の解決方法が分かった
  12. libapr-1.dllのバージョン差異を解消
    ・Subversionのbinにあるlibapr-1.dllをApacheのbin内に上書きコピーする
    ・そのままだとApacheの方のlibapr-1.dllの方がバージョンが新しいために動かないらしい
     参考:[Trac] Re: Can't use svn on 0.11 trunk
    3. This one was the real pain... The version of libapr-1.dll in the Apache install was newer than the version in the subversion install. I replaced the copy in the Apache install with the copy from subversion (1.2.8.0) and everything works perfectly.
    ・libapr-1.dllを変えてしまってApacheが正常に動くかは不明なので、しばらく様子を見る



所感等
  • Trac 0.11はTracWebAdminが標準になって使いやすい。
  • ClearSilverとpysqliteのインストールが不要になって少しすっきりした。
  • trac-adminがexeになって少し使いやすくなった。
  • easy_installを使うとsite-packagesの中が少しごちゃごちゃになるのが気になる。

関連記事:
 TracのWikiをWYSIWYGにするプラグイン
 TracのWikiで外部サイトへのリンクを別Windowで開くGreasemonkey
 SubversionでExcel等のファイルを比較

2007年11月1日木曜日

PHPに後からmb_stringを追加する方法

CentOS 5 に最初からインストールされているPHPにはmb_stringが入っていない。

phpをrpmでインストールすると(略)後からenable mbstringやwith-mysqlを有効.. - 人力検索はてな

yumを使えば簡単にmb_stringをインストールできた。

yum install php-mbstring

PHP.iniの編集も不要。以下のような/etc/php.d/mbstring.ini というファイルを勝手に作ってくれた。このiniファイルがインクルードされるので、Apacheを再起動すればmbstringが有効になる。
; Enable mbstring extension module
extension=mbstring.so

Linuxコマンド備忘録

CentOS 5のbashでよく使うコマンドと、そのオプションのメモ。
初歩的なものもすぐ忘れてしまう。


サービス

  • /etc/init.d/サービス (start | stop | restart | reload | status)
    • サービスを 起動 or 停止 or 再起動 or リロード or 状態確認 する
  • chkconfig --list
    • サービスのrunレベルごとの状況を表示する
    • chkconfig
  • chkconfig サービス on
    • 再起動時にサービスを開始する設定をする
    • offなら起動しない設定になる
    • chkconfig

ネットワーク
  • ifconfig eth0 IPアドレス
  • iptables -L
    • ファイアウォールの設定を確認する
  • iptables -I チェイン名 番号 -p tcp --dport ポート番号 -j ACCEPT
    • ファイアウォール通過を許可するポートを追加する
    • CentOS 5でデフォルトで使われているチェイン名はRH-Firewall-1-INPUT
    • 番号はチェイン内での設定を上から数えたときの番号(一番上が1)
    • 追加後に設定の保存とiptablesの再起動が必要
      • /etc/init.d/iptables save
      • service iptables restart
    • 詳細やその他の設定については、iptables・設定・ファイアウォール・セキュリティ を参照

ディレクトリ・ファイル

  • rm -fr ディレクトリのパス
    • 問答無用でディレクトリを削除する
  • cp -a コピー元のパス コピー先パス
  • ln -s (ディレクトリ名 | ファイル名) リンク名
    • シンボリックリンクを作成する
    • 削除は普通にrmでできる
  • tar -zxf アーカイブファイル.tar.gz
    • tarボールを解凍する
  • chomod モード ファイル名
  • chown ユーザー名.グループ名 パス
    • 所有者のユーザーとグループを変える
  • umask アクセス権
  • less ファイルパス
    • ファイルの中身を1ページ(画面サイズ)ずつ表示する
    • パスがディレクトリの場合は"ls -l"と同じ結果を表示する
  • grep -n 検索する文字列 ファイルパス
    • ファイルから文字列をgrepし、その左側に行番号を付ける
  • pwd
    • 今いるディレクトリを表示する
  • which コマンド名
    • コマンドの本体のパスを表示する

パッケージ管理
  • yum -y install パッケージ名
    • パッケージをインストールする
    • 対話して進めたい場合は-yオプションを付けない
  • rpm -qa パッケージ名
    • インストール済みパッケージを確認する
    • パッケージ名は*で曖昧検索できる
  • rpm -ivh rpmファイルのパス
    • パッケージをインストールする
  • rpm -Uvh rpmファイルのパス
    • パッケージを更新する

ユーザー管理
  • useradd ユーザー名
    • ユーザー追加
  • passwd ユーザー名
    • rootでユーザーのパスワードを変更する
    • 管理者権限の無いユーザーの場合、自分のパスワードのみ変更できる
    • Manpage of PASSWD

日付・時刻

その他


変更履歴:
2007/11/08 passwd 追加
2007/11/14 [Ctrl + R]、redhat-release 追加
2007/11/16 crontab、date、hwclock 追加
2007/12/21 useradd、yum 追加
2007/12/26 テキストファイル関連、which、iptalbes -I、history、kill 追加
2007/12/27 umask、その他のいくつか 追加
2008/02/08 chmod、ディレクトリのcp追加
2008/04/25 cp オプション変更、ln追加

ApacheでURIに応じてアクセスログを分ける方法

mod_setenvifを使ってアクセスログをURIに応じて振り分ける方法。

mod_setenvifをロードしておく。

LoadModule setenvif_module modules/mod_setenvif.so

SetEnvIfディレクティブでURIに応じて環境変数をセットする。正規表現はPerl互換。
SetEnvIf Request_URI "^/foo.php$" foo

環境変数によってログファイルのパスを振り分ける。
CustomLog logs/access.log common env=!foo
CustomLog logs/access.foo.log common env=foo

ログを年月別のファイルにする方法と組み合わせて、さらにLAN内からのアクセスはログ無しにしてみる。
#※2007/11/02 誤ってRequest_URIとしていた箇所をRemote_Addrに訂正!
#サーバ自身からのアクセスは環境変数nologをセット

SetEnvIf Remote_Addr 127.0.0.1 nolog
#LAN内からのアクセスも環境変数nologをセット(プライベートIPアドレスがクラスCの場合)
SetEnvIf Remote_Addr 192.168. nolog
#foo.phpへのアクセスは環境変数fooとnologをセット
SetEnvIf Request_URI "^/foo.php$" foo nolog
#※2007/11/05 rotatelogsのパラメータを修正
#通常のアクセスは詳細(combined)にログを採る
CustomLog "|bin/rotatelogs -l logs/access.%Y%m.log 86400" combined env=!nolog
#fooへのアクセスは簡易ログで
CustomLog "|bin/rotatelogs -l logs/access.%Y%m.foo.log 86400" common env=foo


参考:
 mod_setenvif - Apache HTTP サーバ
 Apacheのログを分類して記録する方法
 自宅サーバを使ったウエブページの公開

2007年10月27日土曜日

Services_Delicious#getAllPosts()でタグを指定する

Services_Delicious#getAllPosts()でタグを指定できない問題 を回避するclassをサブクラスとして作ってみた。

require_once('Services/Delicious.php');

/**
* Services_DeliciousPatched
*
* This is a class to resolve the bug #10062 of Services_Delicious.
*/
class Services_DeliciousPatched extends Services_Delicious {
/**
* @see Services_Delicious#getPosts
*/
public function getAllPosts($tags = array(), $date = null) {
$params = array();
if (!empty($tags)) {
$params['tag'] = $tags;
}
if (!empty($date)) {
$params['dt'] = $date;
}

$result = $this->_sendRequest('posts', 'all', $params);
if (PEAR::isError($result)) {
return $result;
}

$posts = array();
foreach ($result['post'] as $post) {
$post['tag'] = explode(' ', $post['tag']);
array_push($posts, $post);
}

return $posts;
}
}

それにしてもdel.icio.usのAPIってログインを要求するんだね。

Apacheでログを年月別のファイルにする方法

(2007/11/05:変更
 ローテーションのトリガーをファイルサイズから時間に変更。こうしないと年月単位のログにならない
 ここで指定する時間は、1970/1/1 0:00:00からの経過時間を元に計算される。Apacheを起動/再起動してからの時間ではない。
 また、GMT以外の日付を使う場合は"-l"オプションを付ける。
 参考:[Apache-Users 6474] Re: rotatelogs の時刻設定

Apache付属のrotatelogsを使えば簡単にできる。
httpd.confで、CutomLogの設定を下記のようにする。

CustomLog "|bin/rotatelogs logs/access.%Y%m.log 5M" common
CustomLog "|bin/rotatelogs -l logs/access.%Y%m.log 86400" common

ファイルサイズ(この例では5MB)は環境に合わせて変える。
最後のcommonのとこは忘れがちなので注意。(これも状況に合わせて変える。)
envとか付けたいなら付けられるのは普通のCustomLogと一緒。

マニュアルを見るとErrorLogについてもできるようだが、Apache2.2.5/Windowsの環境ではできなかった。(Apacheが起動しなかった。)
でもよく考えたらエラーログはそんなに肥大化しないから、ローテーションする必要ない。


(2007/11/01 追記)
rotatelogsを使うと、Windowsのプロセスがどんどん増えていった。Apache2.2.4~2.2.5のバグ?(Apache 2.2.4でrotatelogs - 負けないように頑張る日記
Apacheを2.2.6に上げたら解消された。

PHPのstaticな変数の値の保持期間

PHPのclassでstaticな変数を使う場合、その値が保持されるのはそのセッションのみ。
つまり、インスタンス変数(classのstaticでない変数)と同じ期間だけ。

セッションが変わると、同一クラスに"再アクセス"しても値は初期化されている。
もちろん他のクライアントからのアクセスでも値は初期化されている。

Java等のstaticな変数とは違うので注意。

2007年10月19日金曜日

PHPで(できるだけ)正しいメールアドレスをチェックする正規表現

2008/02/07 修正 (

  • Blogger投稿時に、バックスラッシュ2つが1つに変換されていた(全角で掲載することにより回避。全角の¥は半角に読み替えてください!)
  • domainの先頭は数字でもOKにした(ドメイン制限の緩和に合わせた)
  • domainのlabelの最後に?を追加(漏れていた)



何回か挫折したけどもう一度チャレンジしてみた。
RFC 2822を読み解くのは辛いので、基準として「正しい方法」でメールアドレスを確認するには - J0hn D0e の日誌に書いてある『「正しいメールアドレスの条件」10か条』をなるべく満たすことを目指した。

できたのはこれ。
preg_match('/^([-!#-¥¥'*+¥¥/-9=?^-~]+(¥¥.[-!#-¥¥'*+¥¥/-9=?^-~]+)*|"([]-~!#-[]|¥¥¥¥[ -~])*")@[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?(¥¥.[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?)*¥¥.([a-z]{2,4}|museum)$/i', $value)


10か条のうち、1~4と6~8を満たしている(と思う)。
以下は未対応
  • 10は正規表現では無理
  • 5と9も正規表現では無理だよね?
  • 3(quoted-string)については、RFC 2822を見た感じではlocal-part全体がquoted-stringの場合のみ使えるように見えるけど、symfonyではlocal-partの一部としてもquoted-stringを許しているのは何故?
  • 4(quoted-pair)については、RFC 2822を見た感じではquoted-string内でのみ使えるように見えるけど、「正しい方法」でメールアドレスを確認するにはを読んだ感じだとlocal-part内ならどこでも使えるみたいに書いてあるからそうなのかな???

現実問題としては、DoCoMo(Softbankも?)はRFC2822違反のメールアドレスでも登録できてしまうので、下記のような"DoCoMo版メールアドレス"は上記の正規表現ではエラーになってしまう。
  • ドットで始まる
  • ドットが連続する
  • @の前がドット


ついでに、上記の正規表現を生成したPHPのソースコードはこちら。
(コメントの番号は10か条の番号に対応)
<?php
if (!$m = $_REQUEST['m']) $m = 'test@example.com';

//local part
$atext = "[-!#-'*+/-9=?^-~]";
$atom = $atext . '+';
$dot_atom = $atom . '(¥¥.' . $atom . ')*'; //2

$qtext = '[]-~!#-[]';
$text = '[ -~]';
$quoted_pair = '¥¥¥¥' . $text; //4
$quoted_string = '"(' . $qtext . '|' . $quoted_pair . ')*"'; //3

$local_part = '(' . $dot_atom . '|' . $quoted_string . ')';

//domain
$label = '[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?'; //7, 8
$domain = $label . '(¥¥.' . $label . ')*¥¥.([a-z]{2,4}|museum)'; //6

//全体
$addr_spec = $local_part . '@' . $domain; //1

$regexp = '/^' . str_replace('/', '¥¥/', $addr_spec) . '$/i';
?>

正規表現<br />
<?php echo $regexp; ?>
<hr />

preg_match('<strong><?php echo str_replace(array("'", '¥¥'), array("¥¥'", '¥¥¥¥'), $regexp); ?></strong>', $value)
<hr />

<form action="regex.php">
<input name="m" value="<?php echo htmlSpecialChars($m, ENT_QUOTES); ?>" />
は、正し<?php echo (preg_match($regexp, $m) ? 'い' : 'くない') ?>メールアドレスです。
</form>


一般的には、これくらいやれば十分でしょう。
preg_match('/^[-+¥¥w]+(¥¥.[-+¥¥w]+)*@[-a-z0-9]+(¥¥.[-a-z0-9]+)*¥¥.[a-z]{2,6}$/i', $value)


DoCoMoも救済するならもう少しシンプルになる。実際に使うならこれで。
local-partに入れる記号は"-_."くらいが一般的で、Gmailerは"+"も使うからそれぐらい対応すれば99%くらいはカバーすると思う。これでダメなメールアドレスは弾いちゃった方が何かと安心な気がする...。
preg_match('/^[-+.¥¥w]+@[-a-z0-9]+(¥¥.[-a-z0-9]+)*¥¥.[a-z]{2,6}$/i', $value)


参考:
 「正しい方法」でメールアドレスを確認するには - J0hn D0e の日誌
 http://www.puni.net/~mimori/rfc/rfc2822.txt (Internet Message Format)
 ASCII文字コード : IT用語辞典
 正規表現
 perlre - Perlの正規表現
 re: PHPでメールアドレスかどうか調べる方法 (ハズレ日記)

2007年10月18日木曜日

redirectとrewriteが競合した場合

Apacheの設定で、redirectとrewriteが競合した場合はrewriteが適用される。
redirectの方を先に書いていても、rewriteが適用される。
この場合にredirectさせたかったら、rewriteの[R=301,L]を使ってredirectさせればOK。

TracのWikiで外部サイトへのリンクを別Windowで開くGreasemonkey

TracのWikiで外部サイトへのリンクをいちいち別Windowで開くのが面倒で、でも対策を探したけど見つからなかったのでGreasemonkey作ってみた。
Bloggerで添付ファイルのやり方がわからない(できない?)のでソースコードをそのまま書いておく。


このGreasemonkeyの仕様

  • Trac内へのリンクは同一Windowで開く
  • Trac外へのリンクは新しいWindowで開く
  • Trac内か外かは、ドメインとドメイン直下のディレクトリが同じかどうかで判断する
    • 例:現在地(Trac内のWikiページ)が http://example.com/trac/sample の場合
      • http://example.com/trac/sample/wiki/page → Trac内
      • http://example.com/foo/sample/wiki/page → ドメイン直下のディレクトリが違うのでTrac外
      • http://www.google.com/trac/sample/wiki/page → ドメインが違うのでTrac外
      • https://example.com/trac/sample/wiki/page → スキームが変わってもドメインとディレクトリが同じなのでTrac内
  • 対象ページは http(|s)://*/trac/* にしているので、ここは必要に応じて適宜変更する


ソースコード
// ==UserScript==
// @name Trac_newWindowOpener
// @namespace http://fdays.blogspot.com/
// @description A script to open a page in the new window on "Trac".
// @include http://*/trac/*
// @include https://*/trac/*
// ==/UserScript==
(function(){
var current = location.href.split("/");
var domain = current[2];
var dir = current[3];
var links = document.getElementsByTagName("a");
for (var i = 0; i < links.length; i++) {
var link = links[i];
var href = link.href.split("/");
if (href[2] != domain || dir != href[3]) {
link.target = "_blank";
}
}
})();

2007年10月11日木曜日

LinuxへのCPANモジュールのインストール方法

 Perlのライブラリ(モジュール)群であるCPANをLinuxへインストールする方法。

まずはCPANシェルを起動する
 Techknow Movable Type: CPANモジュールのインストール方法

そのままだとCPANシェルのモジュールのダウンロード先の設定が空だったので、その設定をする
 K's Lablog - URLリスト

ダウンロード先はここから選ぶ
  CPAN/SITES

 ちなみにシーパン派です。

2007年10月6日土曜日

PDOでDSNのエイリアスを使う方法

PDOを生成する時はDSNのエイリアスを使うのが一番スマートだと思う。

一般的なPDOの生成方法

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$dbh = new PDO($dsn, $user, $password);

エイリアスを使うPDOの生成方法
php.iniに下記の記述をしておく。"pdo.dsn."の後ろがDSNのエイリアスになる。
[PDO]
pdo.dsn.mydb="mysql:dbname=testdb;host=localhost"
そうすると$dsnとして下記のようにエイリアスを指定できる。
$dsn = 'pdo_dsn';
$dbh = new PDO($dsn);

エイリアスを使うメリット
  • 複数の環境(開発環境と本番環境とか)で別のDB接続情報を使う場合に、PHPソースを変更せずに済む。
  • DB接続情報の定義場所が分かりやすい。
  • ディレクトリセキュリティの掛け方によっては、DB接続情報を隠蔽できる。
(2007/10/11 追記
 MySQLの場合、ユーザー・パスワードはDSNに含められないようです。
 参考:[ThinkIT] 第1回:PDOの概要 (3/3)びーこん:PDO MySQL (PHP PECL) - livedoor Blog(ブログ)

エイリアスを使うデメリット
  • DB接続情報を変更するたびにWebサーバの再起動が必要。
  • DB接続情報の種類が多い場合に柔軟に対応できない。(dbnameだけ変えるとか。)命名規則を決めれば対応できるけど。


参考:PHP: PDO->__construct() - Manual

XMailでRFC違反のDoCoMoのメールアドレスに送受信

 XMailで下記のようなメールアドレスに送受信できないという問題が発生。

  • ドットが連続する (例:foo..bar@docomo.ne.jp)
  • アットマークの前にドットがある (baz.@dodomo.ne.jp)
 これらはRFC2822というメールアドレス(の一部?)の規約に反してるらしい。

 同じ問題で困っている人はいるらしく、探してみたらxmailserver.jpの掲示板で見つけた。
  RFC2822違反のメールアドレス

 要約すると、

 Postfixでも同様の問題が発生するけど設定で回避可能、sendmailやqmailではこの問題は発生しないらしい。
 XMailは海外のソフトだから東洋の島国の1キャリアの勝手に付き合って仕様を変えてくれないだろうな。今後はXMailがバージョンアップするたびに誰かがパッチを作り続けるのかな...

CPANシェルによるCPANモジュールのインストール方法

CPANモジュールはCPANシェルでインストールするのが楽。

Techknow Movable Type: CPANモジュールのインストール方法

でもCPANシェルをセットアップして、そのままCPANモジュールをインストールしようとすると下記のエラーが出まくる...

anonymous としてログインしています...
サーバの応答にエラーがあるので、接続を終了します。
デフォルトではダウンロード元のURLリストが空になってるみたい。
K’s Lablog - URLリストを参考にURLリストを設定する。
URLリストに設定するURLはCPAN/SITESから選ぶ。

URLリストのことは、よく見ると最初の参考サイトにきちんと書いてあった...

Podcastを配信するためのフィードの作り方メモ

簡単な書き方
 簡単、ポッドキャステング用のRSS 2.0の書き方 - webdog

詳細なデータまで入れる書き方
 iTunes Muisc Store上にPodcastをパブリッシュする方法(http://phobos.apple.com/static/iTunesRSS.htmlの私訳)
 上記と合わせてこれも読んでおく → 蝸牛の歩み - iTunesへのpodcast

Webページのリンクから1クリックでiTunesに登録できるようにする方法
 Going My Way: iTunesをインストールしたPCなら、itpc://とすればPodcastをダイレクトに登録可能


関連記事: RSS/Atomフィードを生成したりSitemapを作成するPHPライブラリ

2007年10月2日火曜日

iPod touchでワンセグを視聴

それができればiPod touchはさらに売れるのでは。

2007年9月27日木曜日

CentOS on VMware 構築メモ

 VMware上にCentOSをインストールした時のメモ。VMX BuilderでVMDKファイルができることを書いてあるサイトが無いのはなぜだろう。

  1. CentOSのISOのダウンロード
    (時間がかかるので先にダウンロードを開始しておく)
    1. 理研のFTPサイトCentOSの一覧から、最新版のi386-bin-DVD.torrentをダウンロードする
      (CD版は枚数が多いので面倒。DVD版よりネットワークインストールの方が楽かも?)
    2. BitTorrentでISOファイルをダウンロードする
      (BitTorrentクライアントはOperaとかで)
  2. VMware Playerのダウンロード・インストール
    1. VMware Playerのダウンロードページからだとフォームへの記入が必要なので、Player Version Historyのページからダウンロードするとちょっと手間が省ける
    2. インストールする
  3. VMX Builderのダウンロード・インストール
    1. VMware Utilities HomepageからVMX Builderをダウンロードする
    2. 上記ページの一番上にある「Core Components」もダウンロードし、インストールする
    3. VMX Builderをインストールする
  4. VMX Builderを使ってVMXを作る
    • メモリはデフォルト(128MB)より増やした方がいいと思う
    • Hardwareの追加でHard Diskを追加する。Disk fileを作ると、vmdkファイルが作成される
    • Hardwareの追加でDVD/CD-ROM Driveを追加する。Use ISO ImageでインストールするISOファイルを指定する
  5. VMXファイルを実行すると、VMware Playerが立ち上がる


SSHクライアントはSSH2プロトコルとUTF-8に対応しているUTF-8 TeraTerm Proが便利。
ISOイメージをDVDに焼きたい場合はかんべで。

参考:
 meatsauce VMware Player How to use
 革命の日々! CentOS on VMWare Player をインストールする

JavaScriptライブラリ/フレームワーク調査メモ

 JavaScriptのライブラリは何がいいかなと考えてたらたまってきた情報の整理整頓。

フレームワーク or 基本ライブラリ
(Mochikitとmootolsは思い切って外してみた。結局使わなさそうだから。)


サブフレームワーク

ページ内POPUP系ライブラリ

まとめ記事

2007年9月23日日曜日

GoogleドキュメントからBloggerに投稿

試しにやってみる。できるかな?

できたけど、タイトルとラベルが連携しないね。

(追記:タイトルとラベルとこの追記は後から編集したものです。ちなみに、Google Docsの方で内容を変更すると、変更内容をBloggerの方にも反映させることができる。また、Google Docsの方でドキュメントを削除しても、Bloggerの方の投稿はそのまま残る。)

2007年9月19日水曜日

Google Readerが日本語化

 突然Google Readerが日本語化してGoogle リーダーになった。合わせてLabsも取れた。Betaを経ずに一足飛びの正式リリース。分かりやすくなったけど画面上からアルファベットが極端に減ってなんだか落ち着かない...

よく使うHTTPのステータスコード

 PHPみたいな動的ページでも、本当はきちんとしたステータスコードを返すべきなんだろうね。PHPの場合、header("HTTP/1...")で。

  • 200 OK
    正常に完了。普通はこれ。
  • 301 Moved Permanently
    恒久的なリダイレクトの場合。URLが変わった場合など。
  • 302 Moved Temporarily
    一時的なリダイレクト。
  • 304 Not Modified
    クライアントがキャッシュしてる最終アクセスのコンテンツから変更無し。サーバの負荷を軽減できる。
  • 400 Bad Request
    URLがおかしい場合など。
  • 401 Unauthorized
    認証を要求するページで認証に失敗。ログインエラーの場合はこれにしてもいいんじゃない?
  • 403 Forbidden
    アクセス権が無い。ログインしないで来たアクセスにはこれでいいんじゃない?
  • 500 Internal Server Error
    サーバでのスクリプト等の実行エラー。PHPは6からこれに対応するみたい。
  • 503 Service Unavailable
    サーバ停止中。


参考: HTTPステータス・コード

ブログ アーカイブ

tags