msgbartop
LAMP+Zend Frameworkをメインに日夜励んでおります。システム開発に対する熱い想いを掲載します。
msgbarbottom

2010年 02月 08日 MS Wordの目次の英字が全て大文字になってしまう

MS Wordで本文の見出しには小文字を入力したのに、
目次の英字が全て大文字になってしまう場合の書式の設定方法。
(以下はWord 2007の画面です。)

(1)目次部分のプロパティで、「フィールドの編集」を選択。

word

(2)フィールドで「TOC」→「目次」をクリック。

word (1)

(3)目次で「変更」をクリック。

word (2)

(4)文字/段落スタイルの設定で「変更」をクリック。

word (3)

(5)スタイルの変更で、「書式」→「フォント」を選択。

word (4)

(6)フォントで文字飾り「すべて大文字」のチェックをはずす。

word(5)

「OK」で保存して、以上で変更が完了です。

自力じゃ到達不可能な気がします。。。

Tags:

2010年 01月 25日 WordPress プラグイン作成(2):フック

前回は「Hello world」をフッターに表示する簡単なプラグインを作成しました。
私もここまでは簡単にできました。いろいろなサイトに簡単なプラグインが紹介されているので、同じようにファイルを設置し、動作させることはできました。

問題はここからでした。自分が実現しようとしているプラグインを作成するためには、どのようなフックポイントに対してプラグインを作成すればいいのか、さっぱりわからないのです。

今回は、そのフックについて説明します。

フック

WordPressのプラグイン機能はフックが鍵となります。前回の「Hello world」で言うと「add_action(’wp_footer’, ‘helloworld’);」の中の「wp_footer」の部分ですね。フックといわれてもピンと来ないのでWikiPediaで調べてみると

フック(Hook)は、プログラム中の特定の箇所に、利用者が独自の処理を追加できるようにする仕組みである。また、フックを利用して独自の処理を追加することを「フックする」という。

と書かれています。
また、WordPressのCodexで調べてみると

WordPress はプラグインを WordPress 本体に “引っ張り込む (hook into)” ためのフックを提供しています。これはつまり、特定のタイミングでプラグインの関数を呼び出したり、それによってプラグインを作動させたりするためのものです。

と書かれていました。

WordPressでは、起動から初期化、コンテンツの読み出し、ヘッダー出力、フッター出力と様々な処理を行って表示を行います。それらの処理のところどころにフックポイントが用意されていて、プラグイン作成時はそのフックポイントに対して処理を記述していく。ということになります。
2010-01-25_0853

WordPressのCodexでは、フックポイントの一覧が掲載されています。

様々なフックが載っていますが、
・どのタイミングで呼ばれるのか?
・どような変数が渡され、返すことができるのか?
さっぱりわかりませんでした。

また、アクションフックとフィルターフックの違いについても、私はしばらく理解することができませんでした。次回は、そのあたりを詳しく説明したいと思います。

Tags: , ,

2010年 01月 16日 WordPress プラグイン作成(1):Hello world

はじめに

ブログソフトウェアというと、「Movable Type」か「WordPress」が思いつきますが、弊社のDCG(デザインコンテンツグループ)ではWebサイト構築時にWordPressをよく利用しています。
その際にWebサイトの表示はWordPressで行い、データ管理を別システムで管理し、連携させることもあります。
そのような中で学ぶことができたプラグインの開発方法を紹介していきたいと思います。

対象者

PHPについては理解しているが、WordPressのプラグインを作成したことの無い方を対象としています。

環境

  • PHP5.2
  • MySQL5
  • Apache2.2
  • WordPress 2.9.1

Hello worldの表示

WordPressのインストールについては多くのサイトで紹介されていますので省略いたします。
さっそくHello worldを表示してみます。

【1】helloworld.phpファイルの作成

以下の内容でphpファイルを作成します。

/*
Plugin Name: Hello world
Plugin URI: http://logosware.com/
Description: Hello worldプラグイン
Version: 1
Author: Yasuhisa Ishikawa
Author URI: http://logosware.com/
*/

add_action('wp_footer', 'helloworld');

function helloworld(){

	echo "--- Hello world ---";
}

WordPressのプラグインを設置する場合、主となるファイルの先頭には以下のヘッダを入れなければなりません。

/*
Plugin Name: (プラグインの名前)
Plugin URI: (プラグインの説明と更新を示すページの URI)
Description: (プラグインの短い説明)
Version: (プラグインのバージョン番号。例: 1.0)
Author: (プラグイン作者の名前)
Author URI: (プラグイン作者の URI)
*/

10行目の
add_action(’フック名’, ‘関数名’);
今回はフッターに表示させたいため、’wp_footer’にフックさせます。
フック時に実行される関数を指定します。

12行目の
function helloworld()
フック時に実行される関数です。

【2】helloworld.phpファイルの設置

以下のディレクトリにファイルを設置します。
e38394e382afe38381e383a3-1

【3】プラグインの有効化

WordPressの管理画面から、プラグインを開きます。
その中にあるHello worldプラグインの「使用する」をクリックし、有効にします。
2010-01-22_2149
ブログを表示すると、フッター部分にHello worldが表示されます。

Tags:

2010年 01月 10日 vmware-cmd

vmware-cmdとは
VMware server 1.x系をインストール後に
GUI(VMware server console)環境で扱える実行プロセスを、CUI環境で扱う時に使用するコマンド群のことです。
他にも別途インストールが必要ですがVIX API 、Perl API等があります。

今回はそのvmware-cmdを用い仮想マシンの複製から登録までを、
勉学の意味も込めて私が業務で使用することがないshell scriptで書いてみました。

◆vmware-cmdを使って仮想マシンを複製登録する

#!/bin/bash

# define
BASE_PARH=/var/lib/vmware/Virtual\ Machines
BASE_SYSNAME=Ubuntu
VMXFILE=`ls "${BASE_PARH}/${BASE_SYSNAME}" | grep .vmx`

a() {
    echo -n $2
    for cnt in `seq 1 $1`
    do
        echo -n "。"
        sleep 1
    done
    echo
}

b(){
    echo -n $2
    while [ `ps -A |grep $1|wc -l` -ne 0 ];
    do
        echo -n "。"
        sleep 1
    done
    echo
}

c(){
    if [ ! -n "$1" ];
    then
        echo "入力してください。"
        exit 1
    fi
}

# 始
if [ -z $1 ]
then
    echo "名称を入力してください。"
    read NEW_SYSNAME
    c ${NEW_SYSNAME}
else
    NEW_SYSNAME=$1
fi

if [ `vmware-cmd -l | grep ${NEW_SYSNAME} | wc -l` -gt 0 ]
then
    echo "${NEW_SYSNAME} はすでに存在します。"
    echo "別の名前を入力してください。"
    exit 1
fi

if [ `ls "${BASE_PARH}" | grep ${NEW_SYSNAME} | wc -l` -gt 0 ]
then
    echo "${NEW_SYSNAME} はすでに存在します。"
    echo "別の名前を入力してください。"
    exit 1
fi

cp -pfR "${BASE_PARH}/${BASE_SYSNAME}" "${BASE_PARH}/${NEW_SYSNAME}" &
b $! "Virtual Machineをコピーしています。"

# rename
sed -e s/displayName\ \=\ \".*\"/displayName\ \=\ \"${NEW_SYSNAME}\"/ -i "${BASE_PARH}/${NEW_SYSNAME}/${VMXFILE}"

# vmware-cmd regist
vmware-cmd -s register "${BASE_PARH}/${NEW_SYSNAME}/${VMXFILE}" >/dev/null
a 10 "Virtual Machineを登録しています。"

# vmware-cmd start
vmware-cmd "${BASE_PARH}/${NEW_SYSNAME}/${VMXFILE}" start 2>/dev/null
a 10 "Virtual Machineを開始しています。"

# vmware-cmd answer
vmware-cmd "${BASE_PARH}/${NEW_SYSNAME}/${VMXFILE}" answer

# vmware-cmd rename on VMware Server Tools
#vmware-cmd "${BASE_PARH}/${NEW_SYSNAME}/${VMXFILE}" setconfig displayName ${NEW_SYSNAME} >/dev/null
#a 3 "Virtual Machineをリネームしています。"
#vmware-cmd "${BASE_PARH}/${NEW_SYSNAME}/${VMXFILE}" suspend
#a 5 "Virtual Machineを停止しています。"
#vmware-cmd "${BASE_PARH}/${NEW_SYSNAME}/${VMXFILE}" start
#a 5 "Virtual Machineを起動しています。"

# vmware-cmd list
echo
echo "Virtual Machine一覧"
vmware-cmd -l

# 終
echo
echo "おしまい。"

VMware server consoleで確認して頂ければ登録した仮想マシンが、追加されているのが分かると思います。

Tags: ,

2009年 12月 28日 WebデザイナーとWebプログラマー

ロゴスウェアでは、
Webシステムを作成するとき、
WebプログラマとWebデザイナーが連携して作業を行います。

UIのデザインはデザインの専門家に。
プログラムの開発はプログラムの専門家に。
これが我々のシステム開発の1つのルールになります。

しかし、実際この「連携作業」は中々難しいものです。
密にコミュニケーションを取り、お互いが仕様を理解しないと、
色々な問題が発生します。

以下にその一例を紹介させていただきます。
【例】
・プログラマは、商品ランキングを表示する画面デザインをデザイナに依頼する為、
 下記のようなラフなデザイン指示書を、デザイナに渡した。
・デザイナは、指示書とおりにHTMLのソースをプログラマに提供した。
blog_image2
一見すると問題ないようですが、コミュニケーションが不足すると、以下のような問題が発生しがちです。
【問題】
・デザイナは3×2行の1~6位のランキング表示と理解し、デザインを行った。
・プログラマは表示するランキングには、上限・下限がないものと考えていた
 結果、1~8位まで表示しようとプログラムを書いたところ、デザインが崩れてしまった。

この場合、原因はプログラマにあります。
・このランキング表示は横3マスで構成されているが、何行になるか解らない。
 上限なく表示できるようにして欲しい。
この一言を指示書に記載すれば、このような問題は発生しなかったはずです。

デザインとプログムを分業することで、システムのクオリティは良いものになります。
但し、分業をするのであれば、
「それぞれが自分の常識で動かないこと」
これが重要であると私は思います。

「ランキング表示なんて何位まで表示するかは可変だろう!?」
というのは、プログラマの勝手な常識、言い分です。
何の言い訳にもなりません。

Tags:

2009年 12月 28日 TinyMCEイメージブラウザ

開発で、よくTinyMCEのversion2を使用していおります。
(ブログ等に設置されている、便利なテキストエディタです)

しかし、このツールイメージブラウザが、
標準では設置されていないようです。

blog_image1

そこで非常に単純なイメージブラウザの設置の仕方を紹介します。

1.tinymce/themes/advanced/image.html
 のファイルで、開くイメージブラウザのパスを変更します。

	

2.次にイメージブラウザ(imageBrowser.php)を作成します。
  イメージブラウザ自体の作成は、ここで全部公開するのはよろしくないと思いますので、
  簡単に説明します。
  【作り方】
  ・特定の公開ディレクトリを画像保管庫とし、そこに画像をFTP等でアップしておきます。
  ・そのディレクトリのファイル一覧を取得し、同時に該当画像の立て幅、横幅を取得します。
  ・画像をクリックすることで、以下のJavascriptを実行します。

	function imageInsert(PATH,WIDTH,HEIGHT){
		window.opener.document.getElementById('src').value=PATH;
		window.opener.document.getElementById('width').value=WIDTH;
		window.opener.document.getElementById('height').value=HEIGHT;
		close();
	}

ご参考頂ければ幸いです。

Tags: , ,

2009年 12月 21日 PHP : 再帰的にディレクトリを削除する

PHPで意外に使いそうなのに用意されていない関数があります。

その1つに、ディレクトリの削除があります。

ディレクトリを削除するには、rmdir関数を使いますが、
知っている限り(PHP5.3.0時点)、ディレクトリの中にファイル等がある場合には削除できません。

Linuxの場合には、
system(”rm -rf $path”);
でも削除できますが、Windowsでは当然動かなく、delコマンドに変える必要があります。

そこで、PHPの関数で実装してみると、以下のようになりました。

<?php

    /**
     * 再帰的にディレクトリを削除する。
     * @param string $dir ディレクトリ名(フルパス)
     */
    function removeDir( $dir ) {

        $cnt = 0;

        $handle = opendir($dir);
        if (!$handle) {
            return ;
        }

        while (false !== ($item = readdir($handle))) {
            if ($item === "." || $item === "..") {
                continue;
            }

            $path = $dir . DIRECTORY_SEPARATOR . $item;

            if (is_dir($path)) {
                // 再帰的に削除
                $cnt = $cnt + removeDir($path);
            }
            else {
                // ファイルを削除
                unlink($path);
            }
        }
        closedir($handle);

        // ディレクトリを削除
        if (!rmdir($dir)) {
            return ;
        }
    }
?>

Tags:

2009年 12月 15日 Zend_Validateの日本語化

以前からZend_Validateを使っていたのですが、本格的な翻訳は行わず、手元で強引に日本語メッセージを作成していました。
しかし、開発規模が大きくなってくると対応が難しくなってきます。

ZendFrameworkにはZend_Translateという多言語に対応したアプリケーションを作るためのパッケージが用意されています。

このZend_Translateを使うとZend_Validateのメッセージを多言語に対応させることが可能です。
※ZendFrameworkのバージョンは1.9.6を使っています。
 
 
 
■Zend_Translateの使い方

Zend_Translateでは設定ファイルを、配列、CSV、ini、Gettextなど各種入力ファイルをサポートしていますが、ZendFrameworkのドキュメントに記載されている例を使って、簡単な配列で説明いたします。

$english = array(
	'message1' => 'message1',
	'message2' => 'message2',
	'message3' => 'message3');

$japanese = array(
	'message1' => 'メッセージ1',
	'message2' => 'メッセージ2',
	'message3' => 'メッセージ3');

$translate = new Zend_Translate('array', $english, 'en');
$translate->addTranslation($japanese, 'jp');

print $translate->_("message1");

// 結果:メッセージ1

このようにとても簡単に翻訳ができます。
 
 
 
■Zend_Validateの翻訳

Zend_Validateの翻訳は量が多いため、配列ではなく、ini形式で翻訳ファイルを用意しました。以下は、翻訳ファイルの記載例です。

; Alnum
Invalid type given, value should be float, string, or integer = "不正な値です。小数、文字列、又はは数字を入力して下さい。"
'%value%' has not only alphabetic and digit characters = "'%value%'にアルファベットと数字以外の文字が含まれています。"
'%value%' is an empty string = "'%value%'が入力されていません。"

どのメッセージを日本語化すべきかは、Zend_Validateのドキュメントに記載されています。

http://framework.zend.com/manual/ja/zend.validate.messages.html
 
 
次に作成した翻訳ファイルをZend_Validateにあてます。

$translate = new Zend_Translate('ini', '/filepath/validate.jp.ini', 'jp');
Zend_Validate_Abstract::setDefaultTranslator($translate);

これでValidateを行うとメッセージは用意した翻訳ファイルにしたがって日本語化されます。

Tags: , ,

2009年 12月 07日 ブラウザにパスワードを補完されたくない時

通常、ブラウザでパスワードを入力して送信すると、
ブラウザが「パスワードを保存しますか?」と聞いてきて、
「OK」すると、パスワードが保存されます。

ドメイン単位で管理されているらしく、ブラウザのオートコンプリート機能によって
パスワードの入力欄があると勝手に補完されてしまいます。

<form>
    <input name="loginid" type="text" value="" />
    <input name="password" type="password" value="" />

    <input type="submit" value="送信" />
</form>

どうやら、passwordと直前のtextとの組み合わせで、
両方の値が空(value=”")の場合に、勝手に補完されるようです。

<input name=”password” type=”password” value=”" autocomplete=”off” />
とすれば補完されないようですが、今回はそれとは別の方法で防ぎます。

password直前のinputに適当に値を入れてみます。

<form>
    <input name="loginid" type="text" value="" />
    <span style="display:none">
        <input name="datetime" type="text" value="<?= date("Y-m-d H:i:s") ?>" />
    </span>
    <input name="password" type="password" value="" />

    <input type="submit" value="送信" />
</form>

こうすることで、ほとんどのブラウザで補完されなくなります。

Tags:

2009年 12月 03日 MySQLのsubstring関数

先日MySQLのsubstring関数を使う機会があったのですが、PHPのsubstrとは少し動きが違うみたいです。

PHPでは以下のような結果になるものが、

// PHP
substr('logosware', 3, 2)

出力結果
os

MySQLでは、違う結果がでます。

// MySQL
substring('logosware', 3, 2)

出力結果
go

また、

今度は開始位置にマイナスを入れてみると・・・

// PHP
substr('logosware', -3, 2)

出力結果
ar

MySQLでは、同じ結果が返ってきます。

// MySQL
substring('logosware', -3, 2)

出力結果
ar

些細なことですが、正しく理解していないと当然バグにつながります。

Tags: ,