Archive for 2月, 2011
以前、Softbankの931SHを使ってワンセグで録画して、電車の中でみていたので、
スマートフォンになっても、やっぱりワンセグは必要。
番組表をチェックしてまで見るべき番組もない。
まして、家に帰って大きなテレビで見るべき番組なんてほとんどない。
周りや家族の話についていける程度でテレビの世界に参加しておきたい。
そして、暇をもてあましている時にテレビを見てしまいたい。
なので、もっぱら、録画した番組の視聴しか私には需要がないのです。
それでも、IS03というか、スマートフォンの大きな画面はもってこいです。
むしろ、画面を最大にすると大きすぎるくらいなので、ワンセグでは画面が荒く感じてしまうほどで、
横にしてみるより縦でみています。
それでも、一昔前の携帯での全画面サイズくらいはあるとおもうので十分だと思います。
イヤホンもあの携帯専用の差し込みずらい形から普通イヤホンでいいのでいい。
mp3プレイヤーと2つあるとイヤホンも2つでは面倒ですし。
そして、何よりよくなったのが931SHで頻繁に発生していた
「録画に失敗しました」
という事態がなくなりました。
931SHのせいではないのかもしれませんが、なにやらほかのアプリが立ち上がっていたみたいで、
よく、この事態に。
ビデオテープ時代でテープの巻き戻し忘れで録画失敗みたいに・・・
Androidでは普通に複数アプリが動いていますから、
このあたりで、VHSからHDDへの変化みたいな違いを感じます。
でもでも、今まで当たりませにできていたことができないのです!
それが、「番組表予約」がない!
10日のPM9:00からPM9:54の5チャンネル
みたいに指定をするのです。
そして、何がもっとも面倒かといえば、番組名をひろうことができないので「手入力」しかないこと。
このあたりは、Androidなんだから、得意のIntentで外部の番組表アプリから予約を受け付けられるようにするぐらいの粋な試みを入れてほしいですね。
あともう一つは、CMスキップもしくはその代替の機能がない。
30秒スキップとか、15秒スキップとか・・・・
このあたりの番組の操作としては、良くも悪くもグローバルです。
まあ、そのくらいでおおむね良好です。
しかし、ワンセグではアンテナ状況がよくないと、カクカクと、そして音声も・・・
これはどうにかならないのかなとおもっていたら・・・
やはりこんな製品があるのですね。
自宅のアンテナと連結するのが・・・
ActionScriptでのプロパティの扱いはめんどくさい。
以前、as3:for … in ( オブジェクトのプロパティ名の一覧を取得する)
というのを書いたが、動的オブジェクト以外に、リフレクションを使ってプログラミングをしようとすると、
とにかく、このクラスやオブジェクトにはどういうプロパティがあるんだ?
と悩むことが多い。
for in(var name:String in FooObject)
で、プロパティがとれないと思ったら、自分で定義したクラスだったり。
そこで、そんなことは関係なしに、mx.utils.ObjectUtil.getClassInfo()を使い、プロパティをとる方法がある。
詳しくは、リファレンスに説明をゆずることにして、
クラスで定義されているプロパティも取得が取得できる。
(どうもJavaで慣れているせいか、Classオブジェクトからとれそうな気もしてしまうのだが・・・それはできない)
import mx.utils.ObjectUtil;
var foo:Class = FooClass;
var properties:Array = ObjectUtil.getClassInfo(foo, null, {includeReadOnly:false}).properties;
これで配列にプロパティが取得できる。
{includeReadOnly:false}
としているのは、readOnlyのプロパティをとらない指定で、
上の例は書き込みの為に、プロパティを取得しているのでこのような指定にしている。
また、true(デフォルト)にしていると、必要がないと思われるプロパティ(prototype)もとれてしまった。
readの為にプロパティを汎用的にとるというのはかなり用途が限られるような気もする。
自分的には、{includeReadOnly:false}がデフォルトの使い方しかない気がする。
JavaのサービスをApache commons daemonを使って起動する。
ようはOSの起動時にJavaのサービスを起動、そしてOSの停止時にJavaのサービスを停止したいということ。
ただし、OSはLinuxです。Windowsに関してはまだ調べていません・・・・
昔は、sudo で対応していましたが、sudoで起動スクリプトを立ち上げるとsudoがなんかエラーを出力して、
設定を変えればいいらしいが、それも面倒なので何とかアプリの方で吸収できる方法をとるために、
Apache commons daemonにトライした。
(ちなみに、sudo のどんなエラーかは忘れてしまいました・・・)
必要なライブラリ
Apache commons daemon download
から、Javaのライブラリと
Browse native binaries download area…
というリンクから、該当のバイナリをダウンロードします。(jsvcというプログラムです。)
JAVA側のプログラム
package com.coltware.java.samples.daemon;
public class JsvcService {
public static DaemonSample service;
public static void init(String args[]){
service = new DaemonSample();
}
public static void start(){
try{
service.start();
}
catch(Exception ex){
}
}
public static void stop(){
try{
service.stop();
}
catch(Exception ex){
}
}
public static void destroy(){
try{
service.destroy();
}
catch(Exception ex){
}
}
}
このcommons daemonがstatic メソッドを必要としているために、そのメソッドを定義して、
その中で、実際のサービスのinit/start/stop/destoryをするようにしてください。
ちなみに、DaemonSample の実装は省略します。
さて、次にlinux用の起動スクリプト
#!/bin/sh
#
# Source function library.
. /etc/rc.d/init.d/functions
# default parameters
APP_HOME=`dirname $0`
JVM=server
JAVA_USER=apache
JAVA_MAIN_CLASS=com.coltware.java.samples.daemon.Service
JAVA_STDOUT=/var/log/java_server.log
JAVA_STDERR=/var/log/java_server.err
OS=linux
JAVA_HOME=${JAVA_HOME-/usr/java/default}
prog=java_server
pidfile=${PIDFILE-/var/run/java_server.pid}
lockfile=${LOCKFILE-/var/lock/subsys/java_server}
JSVC=$APP_HOME/bin/$OS/jsvc
RETVAL=0
JSVC_DEBUG="-debug"
### set classpathes ###
APP_CP=$APP_HOME/classes:$APP_HOME/res
for f in `ls $APP_HOME/libs`
do
APP_CP=$APP_CP:$APP_HOME/libs/$f
done
JSVC_ARGS="-jvm $JVM -cp $APP_CP -home $JAVA_HOME -user $JAVA_USER "
JSVC_ARGS="$JSVC_ARGS -pidfile ${pidfile} -outfile $JAVA_STDOUT -errfile $JAVA_STDERR"
JSVC_ARGS="$JSVC_ARGS $JSVC_DEBUG"
start() {
echo -n $"Starting $prog: "
$JSVC $JSVC_ARGS $JAVA_MAIN_CLASS
echo
[ $RETVAL = 0 ] && touch ${lockfile}
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
$JSVC $JSVC_ARGS -stop $JAVA_MAIN_CLASS
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
echo
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status -p ${pidfile} $prog
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|status}"
RETVAL=3
esac
exit $RETVAL
9行目でプログラムがある場所を指定しますが、ここではこのスクリプトがあるディレクトリをアプリケーションのルートとしてしまっています。
また、jsvcはlinux/jsvcにあることになっています。(25行目で指定)
18行目でOS=linuxとしているところで、linuxというディレクトリであることを決めています。
本来はここで適したjsvcのディレクトリを決めればいいのかと思います。
28行目でこのjsvcの起動/停止時の情報がいろいろと出てきます。(必要なければコメントアウトします。)
それ以外にもいろいろありますが、読んでいけばわかる範囲だと思います。
ちょうど、一年ほど前に、
開発工数と期間(納期)と人数の関係について
ということを書いた。
あれから、「COCOMOモデル」という考え方があることは、その後知った。
ただ知っておくことは別に悪い事とは思わない。
自分なりに必要か必要でないかを判断できると思えるくらいの理解はしておいてよいと思う。
で、その結果、
この考え方に私は非常にあきらめと違和感を感じた。
それは、なぜか?
「機能なんて定まっていない」
からだ。
そもそも、なぜ機能が定められないうちから工数を見積もりたいのか?
提供する価値とコストと納期(締め切り)のよいバランスをとりたいからだ。
そのために必要な、作為的変数としての工数なのだ。
すべてが変動だと言うから、「工数」という固定がほしくなる。
数学的にすべてが変動の式に答えはないし、軸がないものでは議論が進まない。
でも、現実はどうだろうか?
コストと締め切りは、多少の変動はあるものの、
全体から見れば「固定」といえる範囲のものではなかろうか?
(少なくとも私の場合はそうだった。)
だったら、「価値」しか変動になりえない。
お客が「工数」が知りたいということを言ってくることがあるが、
別に工数なんて知りたくないと思う。露骨に「コスト」を求めても答えないし、こちらからも明確に提示したくないから、
「工数」という曖昧な言葉でまずはお互いをよく知る話題をつくりませんか?という意味で使われるに過ぎないと思っている。
実際、たいていの企業や利用部門にとってコストと締め切りの変動よりも、「価値」の変動のほうが受け入れやすい。
それに、機能を定めたからといって、必ずそれが実現できるとも限らないではないか?
そして、ある機能を作るときに、エンジニアは「3日案」、「1週間案」、「3週間案」のように複数の案を持っている場合がある。
これらの表面的な機能はどれも同じだ。
違うのは、カバーできる規模だったり、拡張性だったりする。
工数は、3日から15日案がありますが、どれにします?と聞いても誰も、よい答えはもっていない。
また、多くのリスク要素の中の1つ、2つが失敗しただけですべてのバッファを食いつぶすほど、
現在、定められているコストと納期は厳しい。
だったら、現実問題としてその時点で「価値」の変動を受け入れてもらわなければならない。
そして、すべてが八方ふさがりになったときに最終手段として3日案の適用があったりする。
さらに、「期間」と「コスト」が固定なプロジェクトを連続的に繰り返すで、「永久ベータ版」というのだとおもう。
いったいどこまで続ければいいのだろうか?
「期間」と「コスト」が許す限りだ。
そして、これは、連続的に繰り返された結果、世に言う「変更に強いシステム」ということにもなる。
なんのことはない、「期間」と「コスト」は技術的な裏付けなどなにもいらず、
期間 =会計管理上の制約
コスト=お財布の中身
で決めてしまえばよい。
できることしかできないと割り切ってしまい、
それを連続的にすることで、最後には「最初はできない」はずであったことが、
できるようになっているということがよいプロジェクトマネジメントなのではないだろうか?
初めから、予算は1000万、締め切り10ヶ月と決まっていても、
予算200万、期間2ヶ月の開発を5回にわけることと何がちがうのだろうか?
むしろ、妥当な機能が4回目の繰り返しでできることがわかれば、
5回目をやらなくていいので200万円の値引きと、2ヶ月の期間短縮で「うはうは」ではないか?
と私なりには思うのである。
ただし、工数管理はいらないかと言えば、それはない。
予定としての工数管理をしないだけで、結果としての工数管理はする。
そして
「機能なんて定まっていない」
状態から抜け出せたときに、初めて「予定工数」をこれまでの経験から使うだけである。
ただ、管理という視点ではなく、開発者という視点に立てば、
予定工数が導けて、その工数通りにできるときは、そのエンジニアにとっては「開発」ではなく「作業」になっていますが・・・
mod_chxjでは端末ごとの画面サイズに合わせた画像のリサイズだけでなく、
実は、表示する画像ファイル自体を切り替えることが可能である。
(というか、そういう改善をおこない、オリジナルに返したということです。)
ただし、前回とどうようにまだ、v0.13というgitリポジトリからソースをとってこなければいけないです。
また、実際には機能のあるなしでいえば、画像のリサイズは重要と思えるが、
実際の運用では画像のリサイズよりも画像の切り替えのほうが重要である場合もあり、それだけで解決することもある。
ちょっと前までは、画面サイズがだいたい似通っており、そして小さかったが、今ではサイズがばらばらになってしまった。
そして、凝ったサイトを見るような利用者が持っている端末の場合にはほとんどが、画像のリサイズなどしなくても、
端末がもっている自動リサイズである程度対応できるようになってしまったし、
よほどのことがないと、端末が持っているキャッシュサイズやらファイルフォーマットなどもそれほど気にしなくてよくなった。(と思う)
一方、それでもまあ、見えればいいよ見えれば・・・という古い端末もサポートしなければいけない場合には、
画面サイズの関係上、リサイズというレベルではすまない。
デザインの簡略化だって必要だ。
また、画面のサイズによっては、デザインの配置を換えたほうがよい場合がある。
横がある程度ある端末ならば、横に2つの絵を並べても問題ないが、
狭いにも関わらず、2つの絵を同様に見せたければ、縦に組み替えることだって必要になる。
このあたりは、ロゴのポリシーを持っている方(会社)たちと話をしたことがあれば、わかると思う。
表示されるサイズごとに、使えるロゴが制限されていることだってある。
となれば、当然、一括画像リサイズが逆に都合がわるいということもわかるだろう。
そこで、ファイルの切り替えであり、本題である。
しかしながら、厳密にはこれから紹介する機能だけでは画像ファイルは切り替えられなく、
切り替えるプログラムを作って、それを利用することができるのである。
要は、指定した画像の読み込みを別のプログラムに委譲させ、その結果を表示するということである。
これをHTMLソースの書き換えなしに行うことができる。
ぶっちゃけ、mod_rewriteでもできるといえばできるけど・・・・、設定をより簡単にしたというところです。
だって、mod_rewriteのソースを参考にさせてもらったのですから・・・・
さて、設定ですが、
ChxjImageRerwite On ChxjImageRewriteUrl /chxj/img.php ChxjImageRewriteMode [all|tag|user]
のようにします。
もちろん、これらの設定はほかのmod_chxjを行うところと一緒です。
1行目は、単にこの機能を使いますよーという宣言です。
2行目は、画像のリクエストがきたときには、どのパスのリクエストですよという指定です。mod_rewriteでいえば、最終的に飛ばされるURLです。
3行目は、モードです。
モードとは、 all,user,tagがあり、
all とはあらゆるimage/* のリクエストが影響を受けます。
tagとは、タグのことです。このタグで書いた部分だけ影響を受けます。
この2つで何が違うかといえば、tagではbackgroundのような飾りのような画像は影響は受けないということです。
なので具体的には
ChxjImageRewriteMode user
のように記述します。(間違っても”["や、"|"を書かないでください。これは3つの選択ができるという意味です。)
次に、userですが、こちらはHTMLのソースを書き換えて部分的に指定をするということです。
その指定方法は
<img src="/img.gif?_x-chxj_imgrewrite=on" />
みたいに、 _x-chxj_imgrewrite=on をつけてやる必要があります。
これで、この指定がない部分は影響を受けません。
ChxjImageRewriteUrlで指定したプログラムのサンプル
画像のリクエストは、ChxjImageRewriteUrlで指定したパスでリクエストを処理することになるのですが、
具体的にどのようなふうにしてファイルを切り替えるかといえば、
< ?php
// 固定で画像を返す。
header("Content-Type: image/jpeg");
$org_filename = $_SERVER["HTTP_X_CHXJ_IMAGE_FILENAME"]; // これがオリジナルのファイルのパスである。
// /var/www/img/size/logo.jpeg で、画像サイズごとに /size/ の部分を切り替えるとしたら・・・
if($_SERVER['HTTP_X_CHXJ_WIDTH'] > 200){
$filename = str_replace(“size”,”L”,$org_filename);
}
else{
$filename = str_replace(“size”,”M”,$org_filename);
}
$fp = fopen($filename,”r”);
fpassthru($fp);
?>
とこんな感じです。
肝は、
$_SERVER["HTTP_X_CHXJ_IMAGE_FILENAME"];
にファイル名が入ってくるから、それを利用して本当に表示したい画像を表示すればいい。
というところです。
PHPでアプリを作っているといつも、もっといい方があるはずなのだが・・・と思うことがある。
それは、WEBアプリの設定だ。(まあ、要はPHPで作られたアプリの設定だ。)
アプリの設定で、いつも悩む点が以下の点。
もちろん、それぞれを別のことと考えれば、ある程度妥当に解決する方法はあるのだが、
すべてを満たしたいなーと思うとこれが結構難しい。
1)複数のサーバで同じ設定を共有したい。
2)設定にはデータベースなどのパスワードが素で入っているがどうにかならないものか?
3)あるルールに従って、設定を微妙に変えたい。
1)複数のサーバで同じ設定を共有したい。
これは単純な話。同じサービスを複数のサーバで運用しなければならない。
従って、複数のサーバに設定ファイルを配置させ、それらを同期する必要がある。
これはrsyncで解決できる。
2)設定にはデータベースなどのパスワードが素で入っているがどうにかならないものか?
要はセキュリティ情報の取り扱い方法だ。
たとえば、アプリケーションの開発会社にはDBのパスワードは見せたくない。
しかしながら、SSHでログインしてきている。
こんな運用をしているにもかかわらず、セキュリティは大丈夫だといえるのだろうか?
開発会社が、設定ファイルもコピーして持って行ってしまい、
それがファイル共有でばれて・・・個人情報がもっていかれたなんてことを聞いたこともある気がする。
しかし、社内で開発しているわけでもなければ、残念ながらこのような状況は事故にならないまでもよくあり、
そして、それを自分たちでどうにもできそうにないあたりが厳しいところである。
ログをきちんと設計していれば、開発会社がSSHでログインしてくるなんてこともないはずだが、
ログ設計なんてフェーズはたいていのSIerが提案してきたなんて聞いたこともなし、
要求すれば当然、お金になって跳ね返ってくるし、
(実は手離れを考えれば能動的にやってしまっても双方の利益になると思うのだが、
なかなかそうはならないのが、残念なところである。)
そもそも、(意味のある)運用設計が開発設計の前に持ってこれる会社は相当熟練している。
こんな会社ならば、ここでの心配はまずないが、それでも、そういうことがしっかりできるSIerを見つけることすら困難である。
だから、せめてセキュリティの必要性がある情報へのパスワードを素の状態で載せておくことはさけたい。
と考えると、私がよくやるのが、
設定ファイルをプログラム化して、それをバイナリ化(暗号化・難読化)する。
Zend Guardみたいなソリューションだ。
PHP全体をバイナリ化するという用途もあったので、採用したが・・・それ以外ではちょっと気が引ける。
それだけのための出費はちょっと・・・・という理由が1つ。
設定した情報を書き換えるだけでも再度コンパイル(暗号化?)が必要という理由がもう一つ。
設定が書き換えずらいので書き換えないということになればそれはそれでセキュリティの脆弱性の1つですから・・・
3)あるルールに従って、設定を微妙に変えたい。
これも結構あると思う。
たとえば、/foo1/sample と /foo2/sample でfoo1用とfoo2用の設定で異なる部分を作りたい。
しかし、たいていは一緒だし、一緒であることを保証したい。
または、アクセスしてきた端末(PC ? 携帯 ? スマートフォン ? で分けたいとか・・要はUser-Agent)ごとに、多少設定を分けたい。
たとえば、imageリソースのパスとか。それで使う画像を切り替える。
部分的にはhtaccessを使ってディレクトリごとにやることも可能なのだが・・・
mod_rewriteなどを使っても結構柔軟に対応しようと思えばできるのだが、
たいていはプログラミングになる。
しかも、設定ではなく、完全にプログラムの責任範囲にあるとおもわれる部分にプログラミングされてしまう。
そして、このような積み重ねがいつしか、そのサーバでしか動かないというレベルに成長していく・・・・
これをプログラマにさせない方法はないものだろうか・・・・
で結局・・・
このような問題を少しでも改善する方法によりものはないものだろうか・・・・
やはり、プログラマからも隠蔽したいことを考えると、PHPで解決してはいけないわけだし、
DBで管理となれば、DBのパスワードがDBに入っているというのも・・・・
100歩譲って、それでありだとしても、開発段階でその制限があるのもどうなの?めんどくせーって思う。
じゃ、Apacheのレベルで解決できないものだろうか・・・・
とそんなことを考え始めました。
でも、よくありそうな問題でもあるので、何かいいアイデアを持っている方がいたら教えてください。
HTML5かという話と、Flashかという話はAdobeや、Appleのような企業にとっては大きな違いであることは間違いないが、
こと、そのためのコンテンツやサービスを作るときのプログラミングということに限って言えば、
JavaScriptとActionScriptにそれほど違いはないように感じる。
というのも、ActionScriptをやってみてJavaScriptが理解できたように思う。
今まで、JavaScriptだけをやっているときには、HTMLのちょっとした補完や、CSSの操作などで済ませていた。
むりやり、Ajaxを使う必要もないし、Ajaxなどを使うともちろん使わない場合よりは、稼働保証としてのシステムとして見たときの品質は落ちてくる可能性が高まる。
しかし、今や利用者も昔のようにHTMLアプリと通常のアプリを厳密に使い分けられるほどの利用者のみがつかっていた時代から、
その違いも気にしてはくれない利用者も対象になってきた。
また、1つの画面に複数の情報と作業ができることも求められている。
そして、その部分画面はステートフルが求められる。
こうなってくると、確かにAjaxのような画面の部分更新がないと非常につくりづらい。
で、いざAjax(jQuery)をやってみると、ActionScriptによくにている。
むしろ、ActionScriptでの型が厳密な環境でプログラミングになれておくと、
JavaScriptのようにある意味ルーズな利用の際にも、びっくりがなくなってくると思う。
なるほど、Javaの利用者はActionScriptをやるべきという話があるのもうなずける。
そして、やはりJavaScriptであれ、ActionScriptであれその特徴が大きく、
Javaや、PHP、Cのようなサーバ系プログラミングとことなるのが、非同期関数(非同期処理)の存在だとおもう。
この存在の意味が「あーそういうことか!」と言えたら、かなりわかってきたと思える。
私は初め、単なるC言語のような関数ポインタにみえてしまっていた。
しかし、ある程度時間がたてば、匿名関数(クロージャー)が非常に見やすいコーディングをする上で必要になってくることがわかる。
ちょっと、このあたりはActionScriptでイベントリスナーに頼ってきたが、多少、改めた方がいいかもと思っている。
まあ、当たり前であるが、利用用途と利用対象、そしてそのクリエーターがにているのであれば、
プログラミングも当然にている必要があるという当たり前のことに気づかされる。
このあたりは、JavaScriptとActionScriptをある程度どちらかわかるようになったら、
もう片方をやるとより理解が進むと思うし、
ビジネス要件で環境がどのように変わってもいいように、どちらもやっておく方がいいと思う。
そして、それらの技術背景は今後のサービスニーズの予測も助けるとおもう。
コーディングのスタイルが理解できるということは、その周辺にある外部要因の理解をするということであると思う。
mod_chxjのちょっと便利な使い方を紹介します。
それは、HTMLの出力文字コードをキャリア(正確には端末設定ファイルでの指定)ごとに変更が可能です。
ただし、制限があります。
制限1) まだ、v0.13というgitリポジトリからソースをとってこなければいけないこと。
http://git.sourceforge.jp/view?p=modchxj/mod_chxj.git;a=commit;h=760a1c7dcd982f684c7d3fd0551ad8c3d5bf0e37
対応したのを、上記にて取り込んでもらいました。
制限2)HTMLフォーマットはXHTMLに限られること。
XHTMLフォーマットでない通常のchtml等に文字コードを指定するとおかしくなります。
また、これ以外に、device.xmlに指定が必要になります。
設定は以下のような感じになります。
<user_agent pattern="^SoftBank/[^/ ]+/([^/ _]+?)[/ _].+?$">
<device>
<device_id>SoftBank-COMMON-DEVICE</device_id>
<device_name>SoftBank Common Device</device_name>
<html_spec_type>JXHTML</html_spec_type>
<width>240</width>
<heigh>375</heigh>
<gif>true</gif>
<jpeg>true</jpeg>
<png>true</png>
<bmp2>false</bmp2>
<bmp4>false</bmp4>
<color>262144</color>
<emoji_type></emoji_type>
<wp_width>240</wp_width>
<wp_heigh>427</wp_heigh>
<cache>307200</cache>
<dpi_width>96</dpi_width>
<dpi_heigh>96</dpi_heigh>
<output_encoding>UTF-8</output_encoding>
</device>
</user_agent>
20行目の
<output_encoding>UTF-8</output_encoding>
が指定しているところです。
この指定で、当然、HTML(というかXHTML)内のmetaタグなんかも変わります。
HTTPヘッダももちろん変わります。
指定がなければ今まで通り、SJISです。
ここで記述する文字コードは内部で使用しているiconvで識別できる文字列ですが、
事実上はSoftBankでのUTF-8しか使わないと思いますし、UTF-8しか確認しておりません。
どうやら、これはモバゲーがSoftBankではUTF-8しかだめらしいので必要とのことでした。(たぶん・・・)
WordPressのテンプレートを作り替えてみました。
今まで、中身をみてみようかなと思ってみたものの、なんか面倒でほったらかしにしていたのですが、
自分で書いた文章も自分でみたいわけですが、一覧形式の表示がなく、管理画面からみていたのですが、
少々面倒でもあったので、テンプレートもみてみることにしてみました。
しかし、最初にぶつかったのが、あのPHPのコードとHTMLが入り交じったもので、
非常に自分的にはみにくかったので、部分的にHTML_Template_Sigmaを使って、
HTMLとコードを分けてみました。
まだまだ途中ですが、TOP(HOME)ページと、カテゴリーページだけを対応してみました。
HTMLの方は、以下のような感じにして、できるだけ素のHTMLに近い形をとっています。
<!-- BEGIN WP_IF_HAVE_POST -->
<h1 class="homeTitle"><span>最近の投稿</span></h1>
<!-- BEGIN WP_WHILE_POSTS -->
<div class="Post-inner article">
<div class="PostMetadataHeader">
<h2 class="PostHeaderIcon-wrapper">
<a href="{the_permalink}" rel="bookmark"><span class="PostHeader">
{the_title}
</span></a>
</h2>
</div>
</div>
<div class="articleInfo">
<img src="func_bloginfo('template_url')/images/PostDateIcon.png" width="18" height="18" alt="PostDateIcon" align="left" />
<span>{the_time}</span>
</div>
<!-- END WP_WHILE_POSTS -->
<!-- END WP_IF_HAVE_POST -->
ここで、PHPのプログラムの方は以下のように、
HTMLテンプレートのBEGIN\ENDコメントの名称のWP_WHILE_POSTS で自動的にblock_wp_while_postsのメソッドが実行されるようにしています。
function block_wp_while_posts($block_name){
while(have_posts()){
the_post();
$vars = $this->getPlaceholderList($block_name);
foreach($vars as $varname){
$value = $this->get_wp_var($varname);
$this->setVariable($varname,$value);
}
$this->parse($block_name);
}
}
function get_wp_var($varname){
switch($varname){
case 'the_title':
$val = the_title('','',false);
return $val;
case 'the_permalink':
return get_permalink();
case 'the_time':
return get_the_time(__('Y/n/j', 'kubrick'));
}
}
まだまだ強引な実装のレベルですが、少しずつWordPressのテンプレートが作りやすくなっていくかなと、対応しています。
ただ、いざ触ってみると、いろいろとWordPressに関して「あれ?」というというところも出てきました。


