2009/1/6 火曜日

PHPでSQL Serverをつつくとntextでエラーが出る

カテゴリー: PHP, symfony — jaco @ 11:07:26

Zend FrameworkのZend Dbを使っていた時の話。
SQL Serverで動いているDBをつつくと、次のようなエラーが。

「Unicode のみの照合順序の Unicode データまたは ntext データを、DB-Library (例 ISQL) または ODBC バージョン 3.7 以前を使用しているクライアントに送信できません」

むむ、なんと。
どうもntextを使うと怒られるらしい。
ではnvarchar(MAX)はどうか?と思って試してみるも、こちらも同じ。
nvarchar(255)とかだと問題なし。

うーん、不便。
不便だけどそういうものだと割り切って使うしかないようだ。

あるいは、SELECTで読んだときにCASTしてやればうまくいくようだ。

2008/12/23 火曜日

TwitterとLive Messengerのステータス完全連携を実現する

カテゴリー: twitter — jaco @ 19:53:21

u-ichiが書け書けと言ってきたので書いておく。
もともとは今年の頭にmixiの日記に書いていたものです。
なので、今はもっと良いやり方があるかもしれませんし、スクリプト変更方法も変わっちゃってるかもしれません。今でも通じるかどうかは未確認ですが、2008年3月の段階ではうまくいっていたやり方です。

以下そのまま転記。
//////////////////////////////////////////////////////
twitterからWindows Live Messengerのステータスをいじる方法
http://d.hatena.ne.jp/myrmecoleon/20070522/1179845918

上のリンク先で解説されているrss2psm Nutzを使ってTwitterのRSSからタイトルを拾ってきてメッセンジャーのステータス欄に表示させたんだけど、それとは逆にTwitPSMという、ステータス欄を変更すると同じ内容をTwitterにポストするスクリプトがある。

じゃあそれを組み合わせたら相互連携が実現できるんじゃね?とかうーいちが言うので試してみたら、カオスなことに。

rss2psm NutsがRSSを拾ってきてステータス欄を更新

更新した瞬間にTwitPSMが変更を検知してTwitterにポスト

rss2psmがポストを拾ってきてステータス欄に反映

その瞬間またTwitPSMが変更検知してTwitterにポスト

・・・という恐ろしい無限ループに入ることが判明。

実験中に何回か無限ループにいれてしまってTwitterのポストがカオスになってしまったw

そこで、MPScriptのドキュメントとにらめっこしてスクリプト改造に着手。
http://mpscripts.net/docs/

まず最初に、相互連携とはちょっと関係ないけれどrss2psmの欠点解消に着手。
rss2psmのせいじゃないけども、rssのtitleをそのまま反映してるので
「jacopen: 発言」
のように、自分のTwitterネームが入ってしまう。でも自分の発言しか拾わせてないのに、わざわざネームを表示する必要はないのでこれを除去したい。

解決するには2つの方法しかない。
1.Titleから名前を除去したRSSを新たに生成
2.RSSを読ませてからスクリプト側で名前部分を除去

1はいろいろ応用が利くんだけど、どうもエレガントじゃない。あとめんどい
2のほうがシンプルなので2のほうを実装。

スクリプトの中からtitleを扱っている変数を見つけ出して、それにjavascriptのsubstr()メソッドを使って文字列から指定文字数を除去。jacopen: を除去するなら、substr(8)になる。たったこれだけ。ね、簡単でしょう?

if ( readTitle.length > 0 ) postTitle = readTitle[0].firstChild.nodeValue.substr(8);

こんな感じ。

次に無限ループの解消に着手。
TwitPSMはMPScriptのOnEvent_MyPsmChangeイベントを使って動いている様子。
なので、やり方としては

1.rss2psmがステータス変更するときに、一時的にイベントハンドラを削除する
2.特定の条件のときだけポストを見送る

の2つが思いつく。
1はremoveEventListenerで消せばいいけど、その後addEventListenerをして本当に動くのかちょっと不安だった。ので、もっとシンプルに2のほうを実装。

rss2psmはTitleを読んだ時に、最後に “by twitter”の文字を挿入する(変更可能だけど。)ので、変更された文字列にby twitterがマッチしたときはtwitterにpostしないという処理を追加。

具体的には

function OnEvent_MyPsmChange(new_psm){
Debug.Trace(new_psm);
Twitter.send(new_psm);
}

function OnEvent_MyPsmChange(new_psm){
if (!new_psm.match(/by\stwitter/)){
Debug.Trace(new_psm);
Twitter.send(new_psm);
}
}

にしただけ。ね、簡単でしょう?

まあそんなこんなで相互連携が実現しましたとさ。

2008/11/26 水曜日

MindTouch Dekiのインストールは簡単だが罠があった

カテゴリー: Wiki, 技術 — jaco @ 9:53:02

文句なしとまで大絶賛されている、MindTouchのDeki。
MOONGIFT: >> 文句なしのWiki「MindTouch Deki Wiki」

以前VMWare版を触ったことがあるんだけど、確かにこれはスゴイ。
1つのパッケージとしてほとんど完成されている感じで、不足をまったく感じない。
が、内部にmonoなどを利用していることもあって、インストールが若干煩雑な印象を持っていたため、自分のサーバーに入れるのは避けていた。

しかし、ちょっと都合でdekiを使おうかなと思うところがあったので、今回ESXi上で動くUbuntu8.0.4にインストールしてみた。

Ubuntuへのインストール方法は、MindTouchのサイトに紹介されているので、それに沿ってやれば問題なく動く。実際にやってみると、apt-getだけでOKで、思った以上に簡単にセットアップできたので驚き。以前はもっと面倒だった記憶があるんだけどなあ。

ただ一つだけ罠があった。

Dekiの日本語解説ページを読むと、上にInstall Guideへのリンクがあることに気づくと思う。が、このリンク先、実は有償のEnterprise版のインストール方法なのだ。
それに気づかずインストールしてしまうと、インストール後の画面で「30日Free版」のような表示がでて、「あれ?」と思うことになる。

無償でインストールできる、Community版のInstall Guideはこっちなので要注意。
Official MindTouch Deki Community Edition Installation Guides

Ubuntuの場合、Enterprise版とCommunity版のインストール方法の違いは、

#apt-get install dekiwiki

#apt-get install deki-enterprise

に変わるくらいなんですけどね。
ただ、間違えてしまうとremoveした後に再度installになるので、2度手間になってしまう。
インストールする際には要注意。

まあ、私はばっちり間違えたからこうやってエントリーにしてるんですけどね!

2008/11/13 木曜日

Zend_DbでSQL Server 2005が使えない

カテゴリー: PHP — jaco @ 15:58:07

ZendFrameworkのZend_Dbを使おうとしたところ、まともに動かないトラブルが発生。

以前のエントリーにも書いたとおり、SQL Server 2005へ接続する際には小細工が必要だったんですが、今回はそれとは違う様子。というのも、前回はコネクトが出来ないというトラブルだけども、今回はコネクションはうまくいく。

が、query()メソッドでSQL文を書くと、エラーが出る。
しかも、エラーが出ない場合もある。

SELECT * FROM テーブル名

これだとエラーが出るが

SELECT カラム名 FROM テーブル名

これだとエラーが出ない。

なんだそりゃ。

どうやら、unicode周りでトラブルが発生している様子・・・。
結局調べるのも時間かかるので、Zend_DbはあきらめてPDOのODBCドライバを利用することに。

PHPでSQL Serverは鬼門なのかな・・・。

2008/10/10 金曜日

ホスト名にアンダースコアが含まれるとIEでCookieが使えない

カテゴリー: Webアプリケーション — jaco @ 12:21:33

今制作していたもので、なぜかIEだけクッキーに一切情報が保存されないという状況が発生。
おかげで、ログイン周りがまともに動かない。IE以外のブラウザだと何の問題も無し。

何かと思って調べてみたら、ホスト名にアンダースコアが含まれるとIEではCookieに書き込めないという現象が発生するらしい。

検索したらいっぱいでてきた・・・。

知らなかった・・・。おかげで、1時間くらい無駄にする羽目に。

2008/10/6 月曜日

[symfony]sfUserなどをAction以外から取ってくる方法

カテゴリー: PHP, symfony — jaco @ 13:19:05

Action内ならば、ユーザーセッションの情報は$this->getUser()を利用することで取得できる。
が、Action以外ではその方法ではとれない。
FormやModelからユーザーセッションを取ってくるには、他の方法を使う必要がある。

そこで、sfContext::getInstance()を利用する。

Action内で、$this->getUser()->getAttribute()で取れるものは、
sfContext::getInstance()->getUser()->getAttribute()で取れる。

コンテキストシングルトン

フロントコントローラ内部で、sfContext::getInstance()へのコールを既に見ました。アクションにおいて、getContext()メソッドは同じシングルトン(singleton)を返します。これは任意のリクエストに関連したすべてのsymfonyのコアオブジェクトへの参照を保存し、各オブジェクトに対してアクセサを提供する非常に便利なオブジェクトです:

sfController: コントローラオブジェクト(->getController())

sfRequest: リクエストオブジェクト(->getRequest())

sfResponse: レスポンスオブジェクト(->getResponse())

sfUser: ユーザーセッションオブジェクト(->getUser())

sfDatabaseConnection: データベース接続(->getDatabaseConnection())

sfLogger: loggerオブジェクト(->getLogger())

sfI18N: 国際化オブジェクト(->getI18N())

sfContext::getInstance()シングルトンをコードの任意の部分から呼び出すことができます。

引用元:
The Definitive Guide to symfony 1.1
第6章 - コントローラレイヤの内側
http://symfony.xrea.jp/1.1/book/06-Inside-the-Controller-Layer.html

2008/10/1 水曜日

symfonyでbuild-schemaした後にbuild-allするとエラーが出る

カテゴリー: PHP, symfony — jaco @ 10:56:03

symfony1.1をいじり中。
既に存在するDBがあるので、それを元にschemaを生成してやろうかと思ったんですが、
propel:build-schemaした後にpropel:build-allするとエラーが・・・。

CREATE TABLE `indications`
(
`id` INTEGER NOT NULL,
`creed_id` INTEGER default NOT NULL,
`indication` TEXT NOT NULL,
PRIMARY KEY (`id`)
)Type=InnoDB
[propel-sql-exec] Could not execute update [Native Error: You have an error in y
our SQL syntax; check the manual that corresponds to your MySQL server version f
or the right syntax to use near 'NOT NULL,
`indication` TEXT NOT NULL,
PRIMARY KEY (`id`)
)Type=InnoDB' at line 4] [User Info:

こんな感じ。どうやら、defaultが悪さをしているらしい。
`creed_id` INTEGER default NOT NULL というクエリを発行しているけども、default not nullで中身を空白にしたいのならば、`creed_id` INTEGER default ” NOT NULLという形にしないといけないんじゃないだろうか。
つまり、propelで作られるクエリがmysqlにとってあまり正しくないのが原因なのかなと。

仕方ないので、ひとまず生成されたschema.ymlをいじる。

indications:
id: { type: INTEGER, required: true, primaryKey: true }
creed_id: { type: INTEGER, required: true, default: ” }
indication: { type: LONGVARCHAR, required: true, default: ” }

こんな形でymlが生成されているので、その中のdefault:の部分を、”ではなく何か文字列を入れてあげるとか、default自体を消してやることで問題は解決します。

PHPでPDO+mysqlを使ったら文字化けした

カテゴリー: PHP — jaco @ 10:14:39

ちょっとしたものをPHPでPDOを利用して作っていたところ、文字化けに遭遇。
PHP自体の文字コードはUTF-8だし、mysql側の照合順序もunicodeになっている。
なのに文字化け。

しばらく調べていたところ、以下の文を事前に実行することで解決。

$pdo = createPDO();
$stmt = $pdo -> query(”SET NAMES utf8;”);

createPDOした直後に実行しておくといいみたい。

2008/9/30 火曜日

VMWare Converterでエラー

カテゴリー: Linux, ネットワーク — jaco @ 18:02:42

VMware Server 1.0系で動いていたUbuntuを、ESXiに移行しようと思いVMWare Converterを使ってみた。
順調に進んでいると思ったら、97%の時点でUnknown Error・・・。

3回ほど試してみたところ、全て同じ結果に。
ESXi側をVIで見てみると、仮想マシンリストには登録されていないけれども、Datastore Browserで中身を覗くと、VMDKファイルだけはアップロードされているという状況。
そこで、ESXi側で新しい仮想マシンを追加し、ディスクの指定で既存のディスクイメージを指定しようとするも、アップロードされているはずのVMDKファイルは表示されず。謎い。

仕方ないので、ひとまず別マシンで動いているVMWare Server2.0にイメージをコピー。
Add Virtual Machine to Inventoryでマシンを登録し、Virtual Hardware Versionのところで最新バージョンにアップデート。

この状態で、再びVMWare Converterを利用したところ今度は問題なくコンバート完了。
うーん、結局詳しい原因は分らずじまいだったけれど、一応こういう方法で直るみたいだよ、ということで・・・。

2008/9/24 水曜日

iPhoneにwordpressアプリを入れてみた

カテゴリー: wordpress, このblogについて — jaco @ 9:58:57

iPhoneにwordpressアプリがあることは知っていたけど、なんだかんだで入れてなかった。というか、入力がおそいから入れる気にならなかった。
だけど、2.1になってかなり入力速度が向上したので、ブログ書くのも実用的かなと思い入れてみた。

なので投稿テスト。

次ページへ »

HTML convert time: 1.853 sec. Powered by WordPress ME