to be continued ~とあるプログラマーの実験的開発日誌~ -4ページ目

to be continued ~とあるプログラマーの実験的開発日誌~

WEBデザイナー兼プログラマーである管理人が日々のトラブル解決に向けて奮闘する開発日誌。

先日、FC2で幾つかのブログの開設準備を進めていたら、
突然、以前に開設していたものを含め、
全てのブログがアカウントを凍結されてしまった。


FC2ブログは以前に複数のブログを開設しても問題なかったので、
比較的寛容なのだろうと油断していたら、
後になって調べたところ、
どうやら最近は締めつけが厳しくなっているみたいで、
かなりの方が同様の目に遭っているようだ。


凍結されたのはブログのみで、
FC2そのもののアカウントは使えるので、
アカウントを複数持つこと自体は禁止ではないらしい。


FC2では同じIPアドレスでブログを開設できるのは
1日1件という制約があって、
私の場合、何日もかけて開設するのが面倒だったため、
プロクシを通して一気に開設してしまったことが理由のようだ。
何しろ開設準備中でまだ記事は投稿していなかったので、
内容に問題があったとは考えにくい。
FC2で複数のブログを開こうとされている方は、
IPを変えてまとめて開設するのは絶対に止めた方がいい
(ちなみにIPアドレスを変えて開設したにも関わらず、
芋づる式に凍結されているのでIPアドレスだけで
同一のユーザーと判断しているわけではなさそうだ)。


ただ、この辺りの事情も理由などは教えてもらえないので
単なる推測に過ぎない。
もちろん、規約が必要なのは当然だし、
違反行為を野放しにしろと言っているわけではない。
しかし、その規約のどこまでが許容範囲で、どこからが違反なのか、
非常にわかりにくいのも事実だ。
今回の場合で言えば1日1件の制約を守っていれば、
凍結されずに済んだのかも不明である。
言ってしまえば運営側の解釈次第で幾らでも
停止や削除ができるということになる。
何年もコツコツと書き溜めてきた記事がある日突然、
理由も知らされないまま、
消されてしまうということだって有り得るわけだ。


このことから改めて思うのは、
このアメブロを含めて特に無料のブログサービスに
投稿された記事というのは投稿した側のものではなく、
あくまでも運営する側のものなのだなという点。
この点をしっかりと自覚していないと、
後で泣きを見ることになるかも知れない。
投稿者にとって幾ら思い入れがある大切なブログであっても、
運営側にとっては単にサーバー上のデータに過ぎないのだから・・・。


↓ランキングにご協力ください↓

ブログランキング・にほんブログ村へ    ブログランキングならblogram

さて、前回AvtivePerlにCPANやPPMでモジュールを導入するにはバージョンを最新のものにする必要があるという話をしたが、実はこれには続きがある。
結果から言えばもともと導入する予定だった「WWW-Mechanize」に関しては、バージョンを最新にすることで無事に解決した。Image::SizeなどもPPMで簡単に導入することができた。ところがデータベースライブラリであるGDBM(GNU Database Manager)が手持ちのWindows用パッケージではバージョンが違うということで弾かれてしまい、散々探し回ったがどうしてもLinuxへの導入法しかわからない。まあ、今後制作するものについてはmySQLなどに変更しても良いのだが、これまでのGDBMを使用しているプログラムのテストができないのは困る。
ということで、「WWW-Mechanize」は一旦諦め、元の古いバージョンに戻すことにしてインストールし直す。GDBMは問題なく戻せたのだが、Image::Sizeなどのモジュールがライセンス期限切れを喰らってしまった。どうやら以前にインストールした時はライセンス期間内だったらしい。恐らくPPMかCPAN経由で導入しているので、当然、古いバージョンなど残っていない。


色々調べまわったおかげで今回の顛末の唯一の収穫、古いバージョンのCPANモジュールを手動で導入する方法がわかったので紹介する。


まずコンパイルにVisual C/C++が使用できるものとして、Microsoft社のVisual Studioなどがインストールされていることを前提とする。事前準備としてVisual C/C++の環境変数を設定してコマンド・プロンプトから実行できるようにしなければならない。これをしないとNMAKEをした時に「'nmake' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」とエラーメッセージが表示されることがある。いわゆる「パスを通す」作業だ。
手っ取り早いのはVisual StudioがインストールされているフォルダからVC→binと辿っていき、VCVARS32.BATというバッチファイルを探す。見つかればコマンドプロンプトから実行してやれば良い。ただし、この場合は新たにコマンドプロンプトを開くたびに行わなければならないので、ここでは解説しないがユーザ環境変数の書き換えがわかる人はそちらでも構わない。


次にこちらのCPANのページから導入したいモジュールを検索する。検索結果から表示されるのは最新のバージョンだが、ナビゲーションから一つ前の階層に戻れば古いバージョンも見つかるはずだ。目的のモジュールが見つかればパッケージ(拡張子がtar.gzとなっているもの)をダウンロードする。


ダウンロードしたパッケージは任意の場所に解凍する(パスに日本語が入らなかったりコマンドを入力しやすい場所にするのはお約束)。この時、解凍したフォルダに「Makefile.PL」が含まれていることを確認する。残念ながら「Makefile.PL」が含まれていない場合のActivePerlへの導入方法はわからなかった。


コマンドプロンプトで「Makefile.PL」に移動し、以下のコマンドを順次入力していく。

>perl Makefile.PL
>nmake
>nmake test
>nmake install

途中で何かモジュールが足りないというようなことを言われたら、CPANから同様に探し出して先にインストールしてやる。


とりあえず、こんな感じで元には戻せたのだが、とにかく長い一日だった・・・。


↓ランキングにご協力ください↓
ブログランキング・にほんブログ村へ  ブログランキングならblogram

PerlをWindowsのローカル環境下で利用するのに便利なActivePerlにはPPMという独自のモジュールを追加する機能があり、Perl自体にもCPANという巨大なアーカイブがあって、通常であればモジュールの導入にそれほど苦労することはないのだが、半面これらにないものをインストールしようとすると、ググッてもLinuxと解説が混在していたりしてなかなか調べるのにも苦労する。先日もWWW::MechanizeというWebサイトとのやりとりを自動化するPerlモジュールのテストをしようとインストールを試みたのだが、結果的にとんでもなく面倒なことになってしまった。


・CPAN(Comprehensive Perl Archive Network)とは?
Perlのライブラリやモジュールなどを集めた巨大なアーカイブ。簡単に言えばPerl開発者がモジュールを容易に入手できるようにしてくれるもの。


・PPM(Perl Package Manager)とは?
ActivePerlに付属するパッケージマネージャー。GUIで使いやすさを意図されているが、英語だったり必要なモジュールが見つからなかったりインストールに選択⇒実行の二段階の手順が必要でわかりにくかったりと、使い勝手は微妙だったりする。GUIを使わずコマンドラインからも実行できるので、こちらの方がわかりやすいかも。


早速導入したいところだが、まずは念のため、WWW::Mechanizeがインストール済みでないか確認する(モジュール関係は以前に導入したことを忘れがちなので)。コマンドプロンプトから以下を入力(「←」以降は解説なので入力の必要なし)。


C:\>ppm list -matching (モジュール名、今回はWWW-Mechanize)

結果は「no packages installed matching 'WWW-Mechanize'」ということで、やはりインストールされていないようだ。


というわけで、まずはCPANから導入を試みる。

C:\>perl -MCPAN -e shell ←プロンプトがCPANに変わる
cpan>install WWW::Mechanize

つらつらと一連の作業が実行され、キューを先頭に追加するかみたいなことを訊かれて、すべて「yes」と答えるものの、結局最後はエラー。ちなみにCPANからは「quit」で抜けられる。


続いてPMMで実行してみると、

C:\>ppm install WWW-Mechanize

結果は「ppm install failed: 401 Authorization Required」とのこと。


試しに「-Shell」をつけてみると、結果は「ppm install failed: Can't find any package that provide WWW-Mechanize-Shell」に変化した。


どちらもエラーだがメッセージが異なっているので調べてみると、「Can't find any package that provide...」の方は、どうやらActivePerlをインストールした時点でレポジトリ(モジュール群が置かれているインターネット上の場所)がActiveState社に設定されるらしく、このサーバ上に対象モジュールが置かれていないのが原因のようだ。
ならばレポジトリを追加してやれば良いと言うことで、winnipeg大学のURL(CPANのある場所)を追加してみる。

C:\>ppm rep add "winnipeg" "http://cpan.uwinnipeg.ca/PPMPackages/10xx/"
C:\>ppm rep ←レポジトリ一覧を確認
C:\>ppm search WWW-Mechanize ←WWW-Mechanizeがレポジトリにあるかチェック

「1: WWW-Mechanize」に続きバージョン情報などが表示されて存在するらしいことがわかったので再度のインストールを試みたところで、「ppm install failed: 401 Authorization Required」のエラーに戻る。


と、ここまで一連の作業でどうやらモジュールは存在するのだが、何らかの理由でインストールできないことがようやく判明する。どうやら「401 Authorization Required」のメッセージにヒントがありそうということで調べてみると、対象のモジュールは要するに現在のActivePerlのバージョンではライセンス期限切れということのようだ。
最新版のActivePerlにインストールし直せば解決するとのことで、現在のActivePerlのバージョンを調べてみると(方法はコマンドプロンプトから「perl -v」と入力)インストールされているものは5.8で、最新版は5.18。ただ。色々と追加したモジュールを忘れているので元の環境に戻せるのか不安。GDBMやらImage::SizeやらXMLRPCやら・・・。


↓ランキングにご協力ください↓
ブログランキング・にほんブログ村へ  ブログランキングならblogram
IEでよく問題になるCSSプロバティ。

・display: inline-block;

「display: inline-block;」は、指定先にブロック要素のインライン要素を両方与える便利なプロパティだ。主に幅や高さ、マージンなどを指定したエリアを横並びにしたい時によく使われる。ところがIEでは効かないことがある。
そんな場合は次のように記述してやると良い。

.test li {
display: inline-block;

*display: inline;

*zoom: 1;
}


先頭に「*」(アスタリスク)をつけた2行が追加部分。先頭に「*」をつけるのはスターハックと呼ばれるIE用のCSSハックのひとつで、「zoom: 1;」を記述しているのはIE独自の要素hasLayoutをtrueにするためだが、そんな理屈よりこの2行を追加すればIEでもinline-blockが使えると覚えておけば良いだろう。

・opacity: 0;

「opacity」は要素の透明度を指定するプロパティで、例えば通常は0に設定して見えなくしておき、オンマウスにすると透明を解除してポップアップを浮かび上がらせるなどCSSだけで簡単に動的な表現ができるため重宝するプロパティだ。ところがFirefoxやOpera、Safariなどのモダンブラウザでは普通に使えるのに、例のごとくIEでは上手くいかない。
ということで、IEで「opacity」を有効にする記述は以下の通り。


.test {
opacity: 0.5;filter: alpha(opacity=50); /*ie6*/

-ms-filter: "alpha(opacity=50)"; /*ie8*/

-moz-opacity: 0.5;-khtml-opacity: 0.5;

}


ちなみにすべて50%の透明度で表示するようにしている。
1行目の「opacity: 0.5;」が通常のプロパティ。2行目、3行目がIE用の設定だ。4行目と5行目はNetscapeや古いバージョンのSafariに対応するもので、必要なければ記述しなくとも良い。
なお、私自身はそのような要素に使用したことはないが幅や高さのない要素ではIEの場合、効かないそうだ。そんな時は先ほどのinline-blockで触れた「*zoom: 1;」を追加してhasLayoutをtrueにしてやると上手くいくかも知れない。

他にもmarginのautoが効かなかったり、角を丸くするborder-radiusが使えなかったり、兎角問題の多いIEではあるが、特に古いバージョンなどでは割り切ることも大切かも知れない。例えば私の場合、前述の例で言えばborder-radiusをIEで表現する方法もあるにはあるのだが、JavaScriptやjQueryプラグインを使ったりしなければならないため、見た目の問題と割り切ってIEでは使えないもの、あるいは使わなくても済むように心がけてデザインしている。
とはいえ、WEB制作をするものにとっては今後もブラウザの互換性には頭を悩ませることになるだろう。

↓ランキングにご協力ください↓
ブログランキング・にほんブログ村へ    ブログランキングならblogram
WEBデザインをするものにとって、一種の鬼門と呼べるのがクロスブラウザ(主要ブラウザの互換性)の問題、とりわけIEの仕様の差異によるレイアウト崩れやCSSの挙動の違いには頭を悩ませるところだろう。私自身も他のブラウザで作業をしていて、完成後にIEで確認した途端、思いつく限りの呪いの言葉をマイクロソフトに浴びせたことは一度や二度ではない。
正直、こんなブラウザが存在している意義がさっぱり理解しかねるし、とっとと無くなるのが世の中(と主にWEB開発者)のためだと思うのだが、現在標準OSであるWindowsにバンドルされているのをいいことに初心者を中心に有無を言わさず幅を利かせている現状では無視するわけにもいかない。
そこで私自身がよく使う、主にモダンブラウザとIEの互換性で特に問題になりそうなスタイルシート(CSS)のプロパティと、その対処法についてこれから2回に分けて紹介していこうと思う。

まずは基本として、IEだけにCSSを適用させる方法を紹介する。
IE6以前にはcssのプロパティの先頭に「_」(アンダーバー)をつける。

.test {
color: #fff;
_color: #000;
}


上記の例ならクラス名「test」内の文字色はIE6以前のブラウザなら黒(#000)、それ以外は白(#FFF)が表示されることになる。
同様にIE7以降ならプロパティの先頭に「>」(半角の山括弧閉じ)をつけることで指定できる。
従って、

.test {
_color: #000;
>color: #000;
}


のようにすれば、IEだけに適用される指定ということになる。
これは非常に重要なテクニックなので是非とも覚えておいてほしい。どのような場合に使用するかというと、例えば高さが可変で他のブラウザでは指定の必要がないため自動的に調整されるがIEだけはどうしても高さを指定しないと上手くいかないといったことがよくある。こうした時、IEだけ次善の策として高さを指定しておくことで、IEのためだけに他のブラウザの仕様を犠牲にせずに済むというわけだ。
また、HTMLのヘッダー内に以下のようなスタイルシートの記述をすることで、適用するスタイルシートを振り分けることも可能だ。

・IEだけに適用させる

<!--[if IE]>
<link rel="stylesheet" type="text/css" href="style.css" />
<![endif]-->


・IEだけに適用しない

<!--[if !IE]>
<link rel="stylesheet" type="text/css" href="style.css" />
<![endif]-->


ここでは省略するが指定の仕方によってはIEのバージョン毎に振り分けることもできる。

次回はいよいよ具体的なプロパティについて解説していこう。