MovableTypeの最近のブログ記事

先週、お客さんのサーバの移設作業をおこなった。

新しいサーバが「セキュリティ重視」のために(俺から見たら、完全に「やり過ぎ」だと思うが(^^;)色々制限があって、単純なプログラム動かすにも苦労した、苦労した。

いや、もう、端から仕組みを作り直してしまえば簡単なんだけど、エンドユーザになるべく「サーバが変わった」ことを意識させたくなかったので。(^^;

で、そういうゴタゴタがあったので、割とすんなり動いたものはついついチェックが甘くなってしまった。
例えばメモリの制限のために、MovableType の再構築が、エントリの多いブログは Out of memory! が発生して失敗してしまう。そのため、業者に設定を変えてもらったりしてバタバタし時間を取られ、ついついすんなり表示されたブログなんかはチェックがお座なりになってしまったのだ。
「お、ちゃんと表示されてるな。OK!」って具合に。

実は、一見まともに表示されているように見えて、画像ファイルが歯抜けになってたんだよなあ。MovableType って、画像が無くなっても壊れ画像が表示されず IMG タグの ALT の内容が表示されてるんで分かりづらいんだよねえ・・・

原因は「日本語ファイル名」の画像の FTP に失敗しているためだった。

本当にバタバタしてたので、FTP でエラーが発生していることに気づかなかったようで・・・
お客さんからの指摘で初めて気づく体たらく。反省・・・

ただ、言わせて欲しい。

「インターネット上に、日本語名のファイルなんか上げんなよ!!」

いやあ、以前に比べたら、格段にインターネットのマルチコード対応は進んでて、ほとんどの場合問題になることはないのだが、それでも、未だにマルチコードに対応していないソフトウェア、ファームウェアはごまんとある。
MovableType だって、未だにファイルパスに日本語が含まれているとトラブルの原因になったりする。
つまり、今でも「インターネット上にアップするファイルは基本的にマルチバイトの名前はつけない」が基本だ。「いーや、それは違う」なんていう「知ったかぶりの馬鹿な技術者」はもう一回勉強しなおせ!基本が出来てないんじゃ、お前は!たまたま、日本語が上手く通るソフトしかお前は知らんだけじゃあ!ぼけぇ!!はぁはぁはぁ・・・

失礼しました。(^^;

ま、そういうことで、只でさえバタバタしてたのに、日本語ファイル名の FTP 問題に振り回されたのである。

fireftp_error.jpg結局、いつも使っている FireFTP では、旧サーバから「ファイルが存在しない」というエラーで落とせない日本語ファイル名のファイルが数個存在。(日本語ファイル名の全てが駄目なわけではない)
何度かリトライしてたら、スクリプトエラーが出て固まってしまった。(^^;

FFFTP と WinSCP は、ダウンロード(GET)出来るんだけど、ファイル名が化け化けに・・・(^^;

つーことで、最終的に、丸ごと tar で固めて新しいサーバに持って行き、そこで展開した。

たまたま、今回のサーバは ssh 接続でターミナルが使えたのでそういうことも出来たが、FTP しか出来んサーバだったらお手上げだった。

ほんま、日本語ファイル名はやめてけれ。
つーか、「日本語ファイル名でないといやだ」というヤツは、インターネット界から消えてしまってほしい。どっかへ行っちゃえ!(^^;

MTOS4 を使ってブログを書いているお客さんから「入力欄が狭すぎる。何とかならんかいな」と要望があったので対応。

本文入力欄の高さの設定は、mt/tmpl/cms/include/archetype_editor.tmpl の中に記述されている。

この部分ね↓

                        <mt:setvarblock name="editor_content_height"><mt:if name="disp_prefs_height_body"><$mt:var name="disp_prefs_height_body"$><mt:else>194</mt:if></mt:setvarblock>

なんか、disp_prefs_height_body という変数が存在していればその値を使うようになっているので、入力画面のテンプレート(今回は、カスタムフィールドも使っているので、mt/alt-tmpl/cms/edit_entry.tmpl がテンプレートファイル)に

    <$mt:setvar name="disp_prefs_height_body" value="380"$>

と書いてみたけど高さ変わらず。

なので、include の下のテンプレートファイルを直接編集するのはいやだったのだが、高さ設定のところを、

                        <mt:setvarblock name="editor_content_height">380</mt:setvarblock>

と変更した。

これでばっちり。

ところで、テンプレートファイルで、

<!--
                        <mt:setvarblock name="editor_content_height">380</mt:setvarblock>
-->

なんてしてても、MT タグは有効になってしまうんじゃね。
上のように記述して、これで<mt:setvarblock>タグは無効になってるつもりでテストをしてたんだけど、どうしても思ったような結果にならないんで、他のどこかで editor_content_height なんて変数がセットされてるんじゃないかと探しまくってしまったよ。(^^;

MTOS 4 カスタマイズのメモ。

管理画面に開始日と終了日の入力項目を、藤本壱氏制作のプラグインを使った「カスタムフィールドもどき」で追加している。
で、これをブログの詳細画面に表示するときに、「同じ日時が入っていれば、その日時のみを表示」「開始と終了で違う日時が入っていれば、開始日~終了日と表示」ということがしたいわけだ。

具体的には、
・開始日、終了日にともに「2010-05-21」と入力した時は、「2010年5月21日(金)」と表示。
・開始日に「2010-05-21」と、終了日に「2010-05-23」と入力した時は、「2010年5月21日(金)~2010年5月23日(日)」と表示。
・・・ということだ。

で、

<$mt:SetVar name="entrydatefield2" value="<$mt:EntryDateField2$>"$>
<$mt:SetVar name="entrydatefield3" value="<$mt:EntryDateField3$>"$>
<$mt:EntryDateField2 format="%Y年%b月%e日(%a)"$><mt:if name="entrydatefield2" ne="$entrydatefield3">~<$mt:EntryDateField3 format="%Y年%b月%e日(%a)"$></mt:if>

とやってみたのだが駄目。

開始日に「2010-05-21」を、終了日に「2010-05-23」を入力した場合でも「2010年5月21日(金)」しか表示されない。

どうも、$entrydatefield2、$entrydatefield3には何もセットされないようだ。
どちらも空値なので、if ne の条件にはかからないということだろう。

そこで、次のように定義してみた。

<$mt:EntryDateField2 setvar="datafield2"$>
<$mt:EntryDateField3 setvar="datafield3"$>
<$mt:EntryDateField2 format="%Y年%b月%e日(%a)"$><mt:if name="datafield2" ne="$datafield3">~<$mt:EntryDateField3 format="%Y年%b月%e日(%a)"$></mt:if>

このやり方であればばっちり。

EntryDateField2 及び EntryDateField3 の値が、それぞれ $datafield2、$datafield3 にちゃんとセットされたようだ。

リファレンスマニュアルの if タグの説明は SetVar の value 値に「固定文字列」をセットしているものばかりで、項目の値同士を比較する書き方が見つからない。もう少し実践的な例を載せてくれればいいのに。

う~む、とうとう本体に手をつけてしまった。

MovableType のエントリー項目のひとつである「公開日」。この時間のところに、(通常は現在時刻がセットされるのだが)例えば 09:00:00 のような固定値をセットしておいてほしい・・・という要件があったので、とうとう lib/MT/CMS/Entry.pm に手を付けてしまった。

        $param->{authored_on_time} = $q->param('authored_on_time')
          || POSIX::strftime( "%H:%M:%S", @now );

としているところを、

        $param->{authored_on_time} = $q->param('authored_on_time')
          || '09:00:00' ;

と。

ささやかな変更なんだけど、こういうことをしちゃうと、バージョンアップの度に同じ変更を加えてやらないといかんからなあ・・・

カスタムフィールドで「公開開始日」っての作って、edit_entry.tmplを修正して元の「公開日」を隠しちゃおうかとも思ったが、そしたら静的コンテンツの作成のところの判断条件触らないといけなくなっちゃうし、そっちの方が大ごとになるのでやめた。

こういう、MovableType の元からある項目をカスタマイズする時、Entry.pm とか触らずにプラグインとかでどうにか出来る手があれば、是非ともご教示くださいませ>識者の方

まあ、今回は時間もないし、これでいくけどねぇ。

MovableType って、ImageMagick の Perl モジュールが入ってなきゃ、GD モジュール使うのかと思ってたけど、初期ログイン時に、

Image::Magickがインストールされていないかまたは正しく設定されていないため、Movable Typeのユーザー画像機能を利用できません

って怒られた。

そうですか。仕方ないので入れましょう。ま、CPAN モジュール使ってインストールすりゃ一発じゃけえね・・・と思ったんだけど、いきなり、

...
make: *** [Magick.o] エラー 1
  /usr/bin/make  -- NOT OK
Running make test
  Can't test without successful make
Running make install
  make had returned bad status, install seems impossible

と、エラーで終わっちゃいましたよ、インストール。

入ってる ImageMagick 本体のバージョンが 6.2.8 で、Perl モジュールは 6.5.9 狙いなので、そのせいかねえ・・・
今の ImageMagick は RPM パッケージでインストールされているようなので、

yum info ImageMagick

で、現行バージョン調べてみたら、このサーバ OS 用の最新バージョンは 6.2.8.0 だった。つまり、最新パッケージのバージョンが更新されてないわけだ。

仕方無いので、

yum remove ImageMagick

でパッケージを削除して、ソースから Perl モジュールに合ったバージョンのものをインストールすることにした。

ftp://ftp.kddlabs.co.jp/graphics/ImageMagick/ImageMagick-6.5.9-10.tar.gz

を取ってきて、configure して make & make install。
問題なく本体のインストールは終了。ldconfig 実行してライブラリのパスを通したら、もう一度 CPAN モジュールでインストール実行。

# perl -MCPAN -e shell
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.7602)
ReadLine support available (try 'install Bundle::CPAN')

cpan> install Image::Magick
CPAN: Storable loaded ok
Going to read /root/.cpan/Metadata
  Database was generated on Tue, 20 Apr 2010 17:27:01 GMT
Image::Magick is up to date.

あれれ?何か、ものすごくあっけなく終わっちゃったんですけど?(^^;
ホンマに大丈夫かいな?

心配だったので、簡単なプログラム作って実験。

# cat > image_magic_test.pl
use Image::Magick;

{

        my $new_path    = "new_file.gif";

        my $path        = <STDIN>;
        chomp $path;

        my $image = Image::Magick->new;
        $image->Read("$path");

        my($now_x, $now_y) = $image->Get('width', 'height');

        print "SIZE X=$now_x Y=$now_y\n";

        my $max_x       = 1000;
        my $max_y       = 1000;

        $image->Resize(
                width  => $max_x,
                height => $max_y,
                blur   => 1.2
        );

        $image->Write("$new_path");

}
^D
# perl image_magic_test.pl
/var/www/icons/image2.gif
SIZE X=20 Y=22
# ls -la new_file.gif
-rw-r--r-- 1 root root 321404  4月 22 12:30 new_file.gif
# perl image_magic_test.pl
new_file.gif
SIZE X=1000 Y=1000

うむ。20x22 の大きさのアイコンを指定して、1000x1000 の大きさにサイズ変更して出力するプログラムなんだが、ちゃんと動いたな。

これで大丈夫でありましょう。

昨日から、MTOS4 がインストール出来なくて困っていたのだが、やっと解決した。

mt-wizard.cgi の実行で、mt-static の位置を正しく指定しても、「エラー: 'http://www.exsample.jp/mt-static/'が見つかりませんでした。ファイルをmt-staticディレクトリに移動するか、設定を修正してください。」と出ちゃう。

もちろん、ブラウザで http://www.exsample.jp/mt-static/ にアクセスすれば、「mt-static - OK」もちゃんと表示されるので「指定は合ってる」のに・・・だ。

結局、原因はサーバ側で www.exsample.jp の名前が引けてないからだった。

実は、このサーバのホスト名で使用するドメインがまだ取得できてなくて、開発機(Windows)の hosts ファイルに

202.221.XXX.XXX www.exsample.jp

と指定してアクセスしている状態なのである。

で、どうも、mt-wizard.cgi の中で LWP モジュールを使って、実際に http://www.exsample.jp/mt-static/ にアクセスして存在チェックをしているようなのだ。その結果(ホスト名が引けないので当然アクセス出来ず)、「mt-static - OK」が返ってこなくてエラーになっているようだ。

ということで、手動で mt-config.cgi を書いちゃえば良いんだけど、他のところでも名前が引けない故のエラーが発生すると面倒なので、サーバの /etc/hosts に

127.0.0.1 localhost.localdomain localhost www.exsample.jp

と、www.exsample.jp を追加してやった。

LWP でちゃんと hosts 見ているか心配だったが、これで無事 OK となった。

現在、MTOS にて情報発信サイト作成中。

で、MTOS のカスタマイズは、藤本壱氏の「MTOS活用テクニック」に記載されている「フィールドをカスタムフィールド風に追加する手順」を参考に行っているのだが、MTOS5 では管理画面の JavaScript が jQuery ベースに変更されたので、この手順をそのまま使えない。

今回は工数的にもスケジュール的にも独自のプラグインを作成するのは難しい。そのため、当初は MTOS5 でと考えていたのだが、MTOS4 の最新版である 4.34-ja をベースにすることにした。

ちなみに、うちのブログは 4.26-ja なので、4.3 系の使用は初めてである。

んで、インストールしてみたら、いきなり「???」なところが。

ブログ記事の編集画面に 4.2系ではなかった「アイテム」という項目が増えているのだが、そこに「entry 二関連づけられたアイテムはありません。」と表示されているのである。
「に」と「二」の間違いだ・・・(^^;

これは、mt/lib/MT/L10N/ja.pm 内の記述の間違いである。(grep したら引っかかる)
3029行目が該当箇所なので修正。

んで、今回は「公開終了日」という項目を追加するので、ついでに「公開日」を「公開開始日」に変更。

さて、じゃ、カスタマイズ作業に入るとしよう。

一応、(本気でハックしたことは無いが)MovableType も 3 の頃からの付き合いなので、先日 MTOS5 をインストールした時もついつい今までの習慣で mt-config.cgi を自分で編集して put したが、MT5 からは Web 画面の「環境設定ウィザード」で自動生成するのが推奨されているようである。

つーことで、先日入れた MTOS5 を一旦全部消して入れ直してみた。

なるほど。
全ファイルをサーバ上に put して、cgi に実行権与えて(必要であれば、httpd の実行ユーザで更新が行われるディレクトリやファイルの権限を修正して)、mt.cgi とかにアクセスすれば、セットアップが済んでいないので

http://www.exsample.jp/mt/mt-wizard.cgi

に強制的にリダイレクトされて、環境設定ウィザードの開始である。

なるほど、簡単だな。(もちろん、まったく知識の無い人間では厳しいが(^^;)


20100409_db_test.jpg

この間「MTOS で MySQL の Socket が見つからない時」で書いた MySQL の Socket ファイルのパスも(「高度な設定」リンクをクリックしなければいけないが)、画面に「データベースソケット」という項目があるのでここで入力すれば良い。
Socket のパスが /var/lib/mysql/mysql.sock ではない人は必ず設定しようね!

まあ、ただ、こういう具合に「一見簡単」なインタフェースを用意されると、かえってうちらのような業者は面倒くさいことになるんだよな。

「中途半端に知識があるお客さんのチャレンジ」が始まるからだ。(^^;

絶対、こういうインタフェースがあると「自分でやる」と言い出すお客さんが出てくるのだ。それはかまわない。俺らも、やってない作業に金をくれ」とは言わないので。是非自分で頑張ってコスト削減に励んでほしい。
・・・でも、「質問はタダ」とは思わないでほしい。(^^;

絶対、これ、「DB の接続テストが OK にならんのじゃけど、なんで?」と聞いてくるお客さん、いるよなあ。(^^;
そこから原因調べて「こうすればいいですよ」とアドバイスするところ、そこが正に俺らの仕事なわけで「タダではない」んですよ!俺らに相談したところで「既に自分の力だけでやっているのではない」んですよ!

・・・ってことを、ちゃんと認識してほしいな。社会人として。:-)

と、そんなことを思っているうちに作業は終了した。楽になったものだ。

MovableType をベースにする案件があるので、自社サーバに MTOS5 をセットアップしていたのだが、対話式インストールウィザードの実行で

Connection error: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'

というエラーが出てしまう。

まあ、読んで字の如く「Socket が見つからないので MySQL デーモンと Socket 通信が出来ませんぜ」ということだろう。

そりゃそうだ。
Socket の位置は /var/lib/mysql/mysql.sock ではないもの。

現在テスト機で動かしている MySQL は、

socket = /tmp/mysql.sock

という設定で実行している。
ちなみに、同じサーバで某地域 SNS(OpenPNE ベース)を動かしていて、PHP から MySQL の利用は問題なく行われているし、拡張機能のいくつかを Perl で組んで実装しているので Perl からの接続も問題無い。

ということで、これは MovableType 側の問題だ。

で、ざっと grep かけて Socket のパスをどこで指定しているか探してみたが分からなかったので、何か情報は無いかと思ってググってみたら・・・とんでもねえ。
この件に関して記事を書いてるブログはけっこうあるのだが、ほとんどが、

/etc/my.cnf の socket の値を /var/lib/mysql/mysql.sock に変更して MySQL を再起動しましょう

と説明しているのだ。(驚)

ええ???アプリケーション側の事情にデーモン側が設定変更して合わせるの?(^^;
とんでもねえ!そんな対応、下の下の対応だ。
どこぞの素人が書いた記事が、これまた素人によってどんどん拡散していってるんじゃないのか?こえ~(笑)

正解は、mt-config.cgi に

DBSocket /tmp/mysql.sock

という記述を追加する・・・だ。

まあ、実際のところ、俺のブログ程度のアクセス数でアフェリエイトで稼げるはずもなく、そもそも、そんな目的で設置したブログでもないので、「広告物」は出来るだけ設置しないようにしてきた。

最近、広告ばかりベタベタ貼り付けて、読みづらいブログの多いこと、多いこと。
たいして収入があるわけでもなかろうに。それよりは、他人が読みやすいデザインを心がけたほうが、人として正しい生き方だろう・・・と思う。
だってさあ、ブログも自己表現の一つでしょ?
アフェリエイト目的の広告ばかりベタベタ貼ってある「見づらくて下品」なデザインのサイトの主は、やっぱり「下品」だと思えるし。

でも、でも、「Amazonおまかせリンク」を設置した時、うちのブログだとどんな商品が表示されるんだろう・・・ということが急に気になり始めた。
何せ、書いている話題はバラバラである。
技術系の人のブログだと、言語関係の書籍のリンクが多かったり、料理好きの人のブログなら料理本のリンクが多いんだろう。
じゃ、俺のは?よもや、「電気ウナギ」で「大人のおもちゃ(バイブ系)」のリンクばかりになったり。いや、Amazon でそんなもん扱ってないし。(^^;

ということで、いつもの手順でウィジェットの追加。

<手順>

[デザイン]→[ウィジェット]で「ウィジェットテンプレート」の下の「ウィジェットテンプレートを作成」をクリック。

他にも Amazon 関係のウィジェットを作るかもしれないので、取りあえず「Amazon Widget 1」という名前で、下記のようなソースを保存。

<div class="widget-amazon1 widget">
 <div class="widget-content">

<script type="text/javascript"><!--
amazon_ad_tag = "XXXXX-XXXX"; amazon_ad_width = "160"; amazon_ad_height = "600"; amazon_ad_logo = "hide"; amazon_ad_link_target = "new"; amazon_ad_border = "hide"; amazon_color_border = "2A720B"; amazon_color_text = "524E4E"; amazon_color_link = "06642C"; amazon_color_price = "E90000"; amazon_color_logo = "FBF0E5";//--></script>
<script type="text/javascript" src="http://www.assoc-amazon.jp/s/ads.js"></script>

 </div>
</div>

保存したら、今度はウィジェットセットの編集。

今のデザインは「2カラムのサイドバー」なので、それを選択し、「Amazon Widget 1」を一覧に挿入。

「3-4回程度ページが表示された後に、最適な商品を表示するようになります。」ということなので、何度かリロード。

おお、表示が変わった。

 

noren20091202.jpgはぁ?

「のれん」関係の商品へのリンクばかりじゃん。(^^;
『「紺のれん」のねぎ塩ラーメンはスープがねえ・・・』というエントリーのせいだろうけど、これはあまりにも極端すぎんかい?(^^;
これでは、「のれん職人のブログ」じゃないか!?

・・・まあ、食えれば「のれん職人」に転職してもええんじゃけど。(笑)

もっと、技術系の書籍や、ジョギングとか、オートバイ関係のパーツとかへのリンクで埋めてほしいものよ。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちMovableTypeカテゴリに属しているものが含まれています。

次のカテゴリはOpenPNEです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら