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

2010年 08月 31日 Zend_Validateの日本語化(1.10.x)

Zend FrameworkのZend_Validateについては、以前書いた記事
http://blog3.logosware.com/archives/600
のようにiniファイルを利用し、メッセージを日本語化していました。

しかし、Zend Frameworkが1.10にバージョンアップしてから、
英語のメッセージが一部変わり、以前のiniファイルでは一部のメッセージが日本語化されません。

また、Zend Framework 1.10のfullパッケージには、リソースファイルが追加されました。
(resources/languages/ja/Zend_Validate.php)

ただ、記述が古いのか、うまく変換されなかったので、
1.10.8のZend_Validate.phpを元に、MessageKeyをベースにして翻訳用ファイルを作成しました。

Zend_Validate.php (ダウンロード)

以下のようにすることで、メッセージが日本語化されました。

        $translator = new Zend_Translate(
            'array',
            'resources/languages/ja/Zend_Validate.php',	// ファイルのパス
            'ja',
            array('scan' => Zend_Translate::LOCALE_FILENAME)
        );
        // デフォルトのトランスレータを設定
        Zend_Validate_Abstract::setDefaultTranslator($translator);

Tags: ,

2010年 05月 23日 TwitterクライアントのOAuth認証(Zend_Oauth) - シンプルなTwitterクライアントの作成 -

Twitterは6月にBasic認証が廃止されます。代替えとしてOAuth認証が採用されました。今や何処も彼処もOAuthについての記事を見かけますが、Zend_Oauthを用いての実装例があまり無いようで…..。Zend Framework をシステムに採用しているLogoswareとしては***と言う事でここに簡単な実装例を書いておきます。

基本的にこちらのサイトを模倣し実装しました。http://bit.ly/a32VvB

Writing A Simple Twitter Client - シンプルなTwitterクライアントの作成 -

使用ライブラリ
Zend FrameworkのOAuthライブラリ
Zend Frameworkをダウンロードして下さい。古いVersionにはZend_Oauthが入っていないのでなるべく新しいVersionにして下さい。(ここではZendFramework-1.10.1-minimalを使用)

使用ファイル
callback.php, clear.php, common.php, index.php, tweet.php , twitter.css

DocumentRoot
css
-twitter.css
-callback.php
-clear.php
-common.php
-index.php
-tweet.php

大まかな手順
1.Twitterにアプリケーション登録の申請。consumerKey, consumerSecretを発行する。
2.OAuthパラメータ値をZend_Oauth_Consumerに設定
3.requestTokenを取得しOAuth認証
4.accessTokenを取得する
5.tweetをPOSTする
6.timelineGETで取得する

Twitterにアプリケーション登録の申請
割愛させて頂きます。こちらのサイトが参考になるかと思います。http://bit.ly/a00E2Q

OAuthパラメータ値をZend_Oauth_Consumerに設定
早速Zend_Oauthの設定ファイルを作成しましょう。
まずはcommon.phpを作成してください。

<?php
set_include_path(realpath(dirname(__FILE__))
                .'/ZendFramework-1.10.1-minimal/library'
                . PATH_SEPARATOR . get_include_path());

require_once 'Zend/Loader/Autoloader.php';
Zend_Loader_Autoloader::getInstance();

$host = $_SERVER['HTTP_HOST'];
define('URL_ROOT', "http://{$host}/twitter");
$configuration = array(
//	'version' => '1.0', // there is no other version...
  'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER,
  'signatureMethod' => 'HMAC-SHA1',
  'callbackUrl' => "http://{$host}/twitter/callback.php",
  'requestTokenUrl' => 'http://twitter.com/oauth/request_token',
  'authorizeUrl' => 'http://twitter.com/oauth/authorize',
  'accessTokenUrl' => 'http://twitter.com/oauth/access_token',
  'consumerKey' => 'Twitterアプリ登録時に発行されるランダムな文字列',
  'consumerSecret' => 'Twitterアプリ登録時に発行されるランダムな文字列'
);
session_start();
$consumer = new Zend_Oauth_Consumer($configuration);

今回はphp以外のデータストレージを使用しないのでsessionをフル活用します。
ここでsession_start()関数を叩いておきます。

それぞれ

パラメータ 説明
version OAuthのversionを指定。指定しないことも可能
requestScheme Authorizationヘッダ以外にもPOSTではRequest Body,GETではquery_stringを指定可
signatureMethod 署名方式:PLAINTEXTまたはHMAC-SHA1 を指定
callbackUrl 認証後に遷移する戻り先URLを指定。Twitterにアプリ登録時に設定したURL(80/443番ポート)を設定。戻り先URLがない場合は’oob’を指定可能
requestTokenUrl requestToken取得時に利用するURL
authorizeUrl 認証画面URL
accessTokenUrl accessToken取得時に利用するURL
consumerKey Twitterアプリ登録時に発行されるランダムな文字列
consumerSecret Twitterアプリ登録時に発行されるランダムな文字列



requetTokenを取得しOAuth認証
index.php

<?php
require_once './common.php';

if (!isset($_SESSION['TWITTER_ACCESS_TOKEN'])) {
  $token = $consumer->getRequestToken();
  $_SESSION['TWITTER_REQUEST_TOKEN'] = serialize($token);

  $consumer->redirect();
}
/*
以下 html部分
......
*/

認証していない場合はクライアントからTwitterにOAuthでAPIをたたきrequestTokenを取得。
Twitterに認証をお願いしています。



accessTokenを取得する
callback.php

<?php
include_once './common.php';

if (!empty($_GET) && isset($_SESSION['TWITTER_REQUEST_TOKEN'])) {
  try{
    $token = $consumer->getAccessToken($_GET,
                                       unserialize($_SESSION['TWITTER_REQUEST_TOKEN']));
  }catch (Exception $ex){
    $ex->getMessage();
  }
  $_SESSION['TWITTER_ACCESS_TOKEN'] = serialize($token);
  $_SESSION['TWITTER_REQUEST_TOKEN'] = null;

  header('Location: ' . URL_ROOT . '/index.php');
}
else {
  exit('無効なコールバック要求されました。おっと。申し訳ありません。');
}

認証を終えるとTwitterが上記common.phpで指定したcallbackUrlを呼び出してくれます。
ここではaccessTokenをsessionに入れておきます。



TweetをPOSTする
tweet.php

<?php
include_once './common.php';

if (!empty($_POST) && isset($_POST['status'])
    && isset($_SESSION['TWITTER_ACCESS_TOKEN'])) {
  $token = unserialize($_SESSION['TWITTER_ACCESS_TOKEN']);
  $client = $token->getHttpClient($configuration);
  $client->setUri('http://twitter.com/statuses/update.json');
  $client->setMethod(Zend_Http_Client::POST);
  $client->setParameterPost('status', $_POST['status']);
  $response = $client->request();

  $data = json_decode($response->getBody());
  $result = $response->getBody();
  if (isset($data->text)) {
    $result = 'true';
  }

  header('Location: ' . URL_ROOT . '?result=' . $result);
}
else {
  exit('無効なTweetが要求されました。');
}

認証で取得したaccessTokenを用いtweetをTwetterにpostします。
responseの形式をjsonに指定していますが他にxmlを指定することができます。ここではresponseは使用しません。
詳しくはTwitter API Wikiを参照
Twitter REST API Method: statuses/update


以上でOAuthを用い認証そしてPOSTまでの手順になります。ホントにシンプルです。
以下はtwieetをPOST後timelineを表示させます。


timelineGETで取得する
Twitterからのレスポンスはjson or xmlの形で返されます。
以下はjson形式のresponseをphp用にdecodeした形です。

stdClass Object
(
  [in_reply_to_user_id] =>
  [contributors] =>
  [source] => client
  [created_at] => Sat May 22 21:33:34 +0000 2010
  [in_reply_to_screen_name] =>
  [place] =>
  [favorited] =>
  [truncated] =>
  [in_reply_to_status_id] =>
  [coordinates] =>
  [user] => stdClass Object
  (
    [favourites_count] => number
    [description] =>
    [lang] => ja
    [profile_background_color] => EDECE9
    [profile_image_url] => http://a1.twimg.com/profile_images/912973500/TwitterID_normal.jpg
    [time_zone] => Tokyo
    [profile_sidebar_fill_color] => a7d6ac
    [statuses_count] => number
    [screen_name] => logosware
    [following] =>
    [created_at] => Sat May 30 03:36:56 +0000 2009
    [followers_count] => number
    [contributors_enabled] =>
    [profile_background_image_url] => http://s.twimg.com/a/TwitterID/images/themes/theme1/bg.png
    [profile_text_color] => 052115
    [friends_count] => number
    [profile_background_tile] =>
    [protected] =>
    [url] =>
    [geo_enabled] =>
    [name] => logosware
    [profile_sidebar_border_color] => D3D2CF
    [profile_link_color] => 088253
    [location] => つくば
    [id] => 43473241
    [verified] =>
    [notifications] =>
    [utc_offset] => 32400
  )
  [geo] =>
  [id] => 145175******
  [text] => つくばってイノベーションだよね?
)

response中身は極々単純で分かりやすいです。
それではタイムライン表示させてみます。
index.phpの続き

<?php
...........
/*
以下 html部分
......
*/
if (isset($_SESSION['TWITTER_ACCESS_TOKEN'])) {
  $token = unserialize($_SESSION['TWITTER_ACCESS_TOKEN']);
  $client = $token->getHttpClient($configuration);
  $client->setUri('http://twitter.com/statuses/home_timeline.json');
  $client->setMethod(Zend_Http_Client::GET);
  $response = $client->request();

  $_data = json_decode($response->getBody());
  if (count($_data)>0) {
    $_SESSION['TWITTER_RESULT'] = $_data;
  }
}

echo '<?xml version="1.0" encoding="UTF-8"?>';
?>

aceessTokenを用いhome timelineをGETで取得します。
responseの形式をjsonに指定していますが他にxml, atomを指定することができます。
詳しくはTwitter API Wikiを参照
Twitter REST API Method: statuses home_timeline

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" >
<head>
  <title>Logosware twitter lite client</title>
  <script type="text/javascript">
    function imposemax(Object)
    {
      return (Object.value.length <= 140);
    }
  </script>
  <link rel="stylesheet" type="text/css" href="css/twitter.css"></link>

</head>
<body>
<?php
if (isset($_GET['result']) && $_GET['result'] == 'true'){
?>
    <p style="background-color: lightgreen;">正常にtweetしました!
      <br />- You successfully sent your tweet!<br /></p>
    <p>&nbsp;<br /></p>
<?php
}
else
if (isset($_GET['result']) && !empty($_GET['result'])){
?>
    <p style="background-color: red;">
      おっと! あなたのtweetはTwitterが受け付けてくれなかったようです。考えられる原因:
    </p>
    <div style="background-color: red;"><?php echo $_GET['result']; ?><br /></div>
    <p>&nbsp;<br /></p>
<?php
}
?>
  <p>簡易Twitterクライアント <br />
    - All that work on Zend_Oauth, and all you do is send Tweets with it?
    <img src="/admin/images/loading.gif" alt="load"
      style="display: inline; vertical-align: bottom;" class="emoticon" /><br/><br/>
  </p>
  <form action="tweet.php" method="post" id="statusform">
    <p>TweetをPOSTします。140文字でなにを言いたいですか? <br /></p>
    <p>
      <textarea name="status" id="status" rows="4" cols="70%"
        onkeypress="return imposemax(this);"></textarea>
      <br/><input type="submit" id="submit" value="Tweet"/>
    </p>
  </form>

ここまでが投稿フォームになります。ゴニョゴニョやっていますが好きに実装したらいいと思います。


  <div class="wrapper">
  <div class="section">
  <div id="timeline_heading">

    <h1 id="heading">result</h1>

<?php
if(isSet($_SESSION['TWITTER_RESULT'])){
?>

    <ol class="statuses" id="timeline">

  <?php
  foreach($_SESSION['TWITTER_RESULT'] AS $key=>$data){
  ?>
      <li style="background-color: <?php echo $color?>;" id="status_14505086646"
        class="hentry u-<?php echo $data->user->screen_name?> status">
        <span class="thumb vcard author">
          <a class="tweet-url profile-pic url"
            href="http://twitter.com/<?php echo $data->user->screen_name?>">
            <img height="48" width="48" class="photo fn" alt="<?php echo $data->user->name ?>"
              src="<?php echo $data->user->profile_image_url ?>"/>
          </a>
        </span>
        <span class="status-body">
          <span class="status-content">
            <strong>
              <a href="http://twitter.com/<?php echo $data->user->screen_name?>"
                class="tweet-url screen-name" >
                <?php echo $data->user->screen_name?>
              </a>
            </strong>
            <span class="entry-content">
              <?php echo $data->text?>
            </span>
          </span>
          <span class="meta entry-meta">
            <a rel="bookmark" class="entry-date"
              href="http://twitter.com/<?php echo $data->user->screen_name?>/status/<?php echo $data->id?>">
              <span class="published timestamp">
                  <?php echo $data->created_at?>
              </span>
            </a>
            <span>
              <?php echo $data->source?>から
            </span>
          </span>
        </span>
      </li>
<?php
  }
?>
    </ol>
<?php
}
?>

  </div>
  </div>
  </div>

  <p><br/><br/>セッションをクリアし再度OAuth認証します。<br/>
  <a href="clear.php">Clear session&Access Token</a></p>
</body>
</html>

htmlも混ざって色合い的にちょっと見にくいかと思いますがaceessTokenを用いGETで取得したresponseの中身を表示させています。
以上でシンプルなTwitterクライアントの完成です。
今回はOAuthがメインのため実装した機能はtimeline表示とtweet更新だけですが他にもTwitter APIは様々な機能が実装できます。
Twitter API Wiki / FrontPage

作成したTwitterクライアントのファイルを置いておきます(css同梱)。MVC, オブジェクト指向なにそれな内容ですが何かの足しになれば私としても嬉しいです。

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年 08月 03日 MacPorts

以前、システム開発部ブログでMacOS Xについて投稿されていたので、

私も、MacOS Xで開発を行う上で欠かせないパッケージ管理システム(MaxPorts)を紹介します。

MacOS Xでは、MacPortsと呼ばれるサードパーティのプロジェクトが存在し、オープンソースソフトウェアのレポジトリ、管理ツールを提供してくれます。
これを使うことによりMacOS X上でより良いUNIX生活を送ることができるようになります。

この管理システムはLinuxでお馴染みのapt、yumとは違い
ソースからのコンパイルによるパッケージ導入、variants と呼ばれるオプション選択機能があり、
このvariantsの機能によって、
従来のコンパイルによるインストールと同じように、ユーザーが自由にオプションを選択をすることでができます。

導入するにはXCodeというgcc等のコンパイラが入った開発環境が必要でXCodeをインストールすることで初めてMacPortsが動くようになります。

実際に使用してみました。

//パッケージインストール
sudo port install パッケージ名

でインストール。

//パッケージ検索
sudo port search 文字列

とすれば、その文字列を含むパッケージ名の検索が行えます。

オプション指定は、

//オプション指定
sudo port パッケージ名 +オプション +オプション

オプションは何個でも指定できます。

調べたいオプションがある場合は

//オプション検索
sudo variants パッケージ名

でオプションを検索できます。

実際にapache2, php5, mysql5をインストールしてみると

//mysql, apache, php の順にインストール
sudo port install mysql5 +server
sudo port install apache2
sudo port install php5 +apache2 +imap +macosx +mysql5

上のようなコマンドになります。

使用感はやはりというかインストール時の遅さが目立ちます。
Apache2,Mysql5,PHP5をインストールするのに大体1時間以上は、かかったかと記憶しています。
apt,yumなら5分も掛からないですね。

もし、速さを重視するなら
もうひとつのMacOS Xパッケージ管理システムのsyncがお勧めです。
syncであればコンパイル済みのパッケージを提供してくれるので、コンパイル分の時間が掛かりません。apt、yumと同じですね。

私はオプションを指定を重視したのでMacPortsを選びましたが、MacOS Xには様々なパッケージ管理システムがあり、
それぞれ一長一短ありますのでよく調べた上で自分に合う管理システムを選べば良いのではないでしょうか。

以上MacOS Xでの開発を手助けしてくれる、MacPortsの紹介でした。

Tags:

2009年 05月 30日 Away 3Dを使ってみる(8)

あまり遊んでいる時間がないので、新しい展開はお預けで申し訳ない。

実は、最初から気付いていたのだが、Debugger VersionのFlash Playerだと
「TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。」
というエラーが表示され、「すべて却下」をクリックすると正しく動く。
(続きを読む…)

Tags: ,

2009年 05月 25日 Away 3Dを使ってみる(7)

太陽があまりにも大きいことは分かったが、どうしても“太陽-地球-月”系でグルグル回っているものを作りたくなった。
もしかしたら全国の小学校で見てもらえるかもしれない・・・なんていう大それた野望すら出てきた。

【今回の目的】
・“太陽-地球-月”系でグルグル回す。

【今回のサンプル】
・サンプル1 回っている・・・一見素晴らしいが、よく見ると間違っているw。
http://system.logosware.com/blogimag/0525/sample1/)。
・サンプル2 間違い探し・・・軸を表示してみた。
http://system.logosware.com/blogimag/0525/sample2/)。
・サンプル3 間違い探し・・・地球の公転面の真横から表示してみた。
http://system.logosware.com/blogimag/0525/sample3/)。

(続きを読む…)

Tags: ,

2009年 05月 22日 Away 3Dを使ってみる(6)

やはり「太陽」がなきゃ、落ち着きが悪い。

【今回の目的】
・太陽を置いてみる

【今回のサンプル】
・サンプル1 太陽は大きい
http://system.logosware.com/blogimag/0523/sample1/)。
・サンプル2 地球の公転
http://system.logosware.com/blogimag/0523/sample2/)。

(続きを読む…)

Tags: ,

2009年 05月 21日 Away 3Dを使ってみる(5)

宇宙空間・・・やはり暗くなきゃ雰囲気が出ない。
闇に浮かぶ青い星・・・地球!・・・的なものにしてみた。

【今回の目的】
・宇宙っぽくする

【今回のサンプル】
・サンプル1 PointLight3D+WhiteShadingBitmapMaterial
http://system.logosware.com/blogimag/0522/sample1/)。
・サンプル2 DirectionalLight3D+PhongBitmapMaterial
http://system.logosware.com/blogimag/0522/sample2/)。

(続きを読む…)

Tags: ,

2009年 05月 21日 Away 3Dを使ってみる(4)

やはり月は必要でしょう。
早速、付けてみました。
長さ(地球、月の直径、地球と月の距離)の比をそれなりに正しい値にしました。
また、地球の自転と月の公転の回転の比もおおよそ正しい関係です。

【今回の目的】

・地球の周りに月を置く

【今回のサンプル】
ここ(http://system.logosware.com/blogimag/0521/sample/)。

(続きを読む…)

Tags: ,

2009年 05月 20日 Away 3Dを使ってみる(3)

「そろそろ、目に見えて楽しいものにしていきたい」と考えて、「地球」にしてみた。

そこで、

【今回の目的】

・地球を回す

【今回のサンプル】
ここ(http://system.logosware.com/blogimag/0520/sample/)。

(続きを読む…)

Tags: ,