スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
【--/--/-- --:--】 | スポンサー広告
undefined function mb_convert_encodingだってさ
久しぶりにxamppで作ったシステムの改良をしようと
xamppを起動して、ページを開くと
undefined function mb_convert_encoding
というエラーが発生。

あー、そういえばHDDの調子が悪くなって総入れ替えしたり
フォルダ構成変えたりしたからなぁ・・などと思ったけど
そんなことを懐かしんでいる場合じゃない。

c:\xamppをd:\xamppにして、confとか書き換えたような、
ということでconfを直してc:\xamppにお引越し。

・・だめでしたorz

ならばっ!
Google先生、お願いっ!
ピピーガガガッ!オコタエシマス・・

1.php.ini extension=php_mbstring.dll ガコメントニナッテイマセンカ?
2.ツカワレテイナイ php.ini ヲナオシテマセンカ?
3.extension_dirハアッテマスカ?

なるほど、確認してみるか。

1.を確認。大丈夫です。行頭に;はついてませんでした。
2.を確認。これも大丈夫です。phpinfo()で見ましたが合ってました。
3.を確認。extension_dir = "\xampp\php\ext\;c:\xampp\php\ext\"だそうで、これもOKです。

あれれ~、Google先生もたいしたことないなぁ
> イイエ、タイシタコトナイノハ、アナタデス

そうですねorz

ふと、思いついてapacheのerror.logを見てみると

PHP Warning: PHP Startup: Unable to load dynamic library '\\xampp\\php\\ext\\;c:\\xampp\\php\\ext\\php_mbstring.dll' - \x8ew\x92\xe8\x82\xb3\x82\xea\x82\xbd\x83\x82\x83W\x83\x85\x81[\x83\x8b\x82\xaa\x8c\xa9\x82\xc2\x82\xa9\x82\xe8\x82\xdc\x82\xb9\x82\xf1\x81B\r\n in Unknown on line 0

おっ、あった。
なんかよくわからない文字列が並んでるけど、どうもdllが読み込めないらしい。

xamppの元からdllを展開しなおして上書きしてapache再起動っ!
・・・同じエラーがでてらー

ふと、思いついて 意味不明な文字列を print "\x8ew\x92...."としてみると
「モジュールがみつかりません」
だそうで。
ということはGoogle先生が言ってた3のextension_dirの設定が怪しい!!

そういえば、xamppの引っ越しにあわせてパスを2つ書いてたけど
それがまずかったのかな?と思い、
"c:\xampp\php\ext\"
にしてapache再起動っっ!

apacheのerror.logにエラーが出なくなり、
undefined function mb_convert_encodingというエラーもなくなりました。
めでたしめでたし(こんなエラーを出すのは私だけでしょうっ!)

教訓:どこでも複数のパスを書けると思ったら大間違い!
スポンサーサイト
【2011/02/05 16:43】 | PHP | トラックバック(0) | コメント(0)
PHPでWebサービス(SOAP)クライアントの作成
仕事でWebサービスのクライアントを作りました。
こちらのシステムはPHPで作ってあったので、
PEAR::SOAPを使って簡単にできちゃいました。

・・と言いたいところなんですが、
自分のパソコンからサーバーに接続したときはうまく行ってたのに
実際のサーバーにプログラムを載せて試したら、応答ページが真っ白に。

あれれ?と思い、phpinfoを見てみたら開発サーバーに
PEAR::SOAPが入ってないじゃないですか!

まぁ、でも、pure PHPなのがPEARのいいところ。

pear install soap-beta

ほらね!

・・・あれ?

書き込み権限がないのか。残念。

アプリ用のフォルダに置くとするか。

まずは自分のパソコンでPEAR::SOAPの最新版をダウンロード

pear download soap-beta
→いまだとsoap-0.12.0.tgzが落ちてきます。

ファイルを解凍して、サーバーにアップロードして、
はい出来上がり!

・・ではない。
まだ動かない。
サーバーのログを見たら、まだいろいろ足りないらしい。
というわけで、さらにいろいろダウンロード!

pear download http_request
pear download net_socket
pear download net_url

で、これらを解凍してサーバーにアップロードして。

ようやく動きました。
いやー、めでたい。


ちなみに、PEAR::SOAPでのSOAPクライアントの作り方は
下のサイトあたりに載ってます。
PEAR::SOAPでWebサービス

公開されているWSDLのURLを指定してSOAPクライアントのインスタンスを作り
callメソッドでWebサービスのメソッドを呼び出すだけ。
PEAR::SOAP様様です。


ちなみにこのお仕事、SOAPクライアント以外のところの方がやっかいだったんですけどね。


そして、今日の鳥海山です。
鳥海山20091201
【2009/12/01 16:44】 | PHP | トラックバック(0) | コメント(0)
PHPでHL7CDA.XMLを出力サンプル
読み込んだHL7CDAドキュメントを編集したら、
今度は出力するためのPHPのソースコードのメモ。

もしシステムとしてSmartyなんかを使ってるなら
XMLの出力もSmartyでやってしまうという手もあり。
というか、IDとかは決まっていて、患者情報とか検査結果だけを埋め込めばいいような場合は断然楽。

たとえば以下のような感じのテンプレートを用意。

--------- template.tpl -------------
<ClinicalDocument>
<typeId root="11111" extension="22222"/>
<id extension="12345" root="1.2.3.4.5"/>
<code code="{$user_code}" codeSystem="1.2.3.4.5.6.7" codeSystemName="SYS1" displayName="SYS1-PKG"/>
<title>サンプルパッケージ</title>
<effectiveTime value="{$effective_time}"/>
<confidentialityCode code="N" codeSystem="1.2.3.4.5"/>
<recordTarget>
<patientRole>
<addr><postalCode>{$user_postal}</postalCode>{$user_addr}</addr>
--------- template.tpl -------------

プログラムの方はこんな感じ。

//埋め込みたい値を変数に入れておく
$params['effective_time'] = '20090801';
$params['user_postal'] = '997-0000';
$params['user_addr'] = '鶴岡市xx町1-2-3';
//Smartyに割り当て
$smarty =& new Smarty( );
$smarty->assign($params);

おしまい。簡単でしょ?


ちなみにXMLツリー内で別階層にある同名の項目を
編集しなきゃいけないような場合はまじめにsimplexmlを使ったほうがよさげです。

//項目値の設定
$xml->name = 'package1';
$xml->programs[0]->name = 'program0';
$xml->programs[0]->functions[0]->name = 'function1';
$xml->programs[0]->function[0]->parameters[0]->name = 'parameter1';
$xml->programs[1]->name = 'program0';
$xml->programs[1]->function[0]->name = 'function1';
$xml->programs[1]->function[0]->parameters[0]->name = 'parameter1';

//ファイルに保存
$xml->save('HL7CDA.xml');

てな感じ。

XPath使って、パラメトリックにやりたい気もしますが。
【2009/08/10 14:44】 | PHP | トラックバック(0) | コメント(0)
PHPでHL7CDA.XMLを読み込んで処理するサンプル
PHPでHL7CDA.XMLを読み込んで処理するサンプル

そんなにファイルサイズ大きくならないかなぁなんて甘い考えのもと、
XMLReaderではなくDOMDocumentで解析してsimplexmlに入れ替えて使うことに。

//DOMDocumentの生成
$dom = new DOMDocument;

//HL7CDA.xmlファイルの読み込み・解析
$dom->load( '/HL7CDA/HL7CDA.xml' );

//スキーマチェック
if ( ! $dom->schemaValidate('CDA.xsd') ) return false;

//simplexmlを初期化
$xml = simplexml_import_dom($dom); //$xmlがClinicalDocumentノードになる

//たとえば患者の郵便番号の取得
$user_postal = $xml->recordTarget->patientRole->addr->postalCode;

こんな感じです。
簡単でしょ?
【2009/08/10 14:12】 | PHP | トラックバック(0) | コメント(0)
EthnaアプリをPeggyとXdebugでリモートデバッグ
では、長年PHPのデバッグに頭を痛めていた家族の、
Linux上に構築したEthnaアプリを、
Peggyを使ってリモートデバッグできるようになるまでの
一部始終をご覧頂きましょう。

ようするにちょっと悩んだのでメモしておくというだけのことですが。

まずはxdebugのインストール。
xdebugをダウンロードしてきたら
% tar zxvf xdebug-*.tgz
で解凍。
% cd xdebug-*
% phpize
% ./configure --enable-xdebug
% make
あとはお好きなところへsoファイルをコピーでもリンクでもしてください。
% cd ~php/modules
% ln -s ~/xdebug-*/modules/xdebug.so .

次にphp.iniを設定(なければ追加)
[Zend]
zend_extension = "/usr/local/php/modules/xdebug.so"
xdebug.remote_enable = On
xdebug.remote_host = Peggyを実行するクライアントのIPか名前
xdebug.remote_port = 9000

あとはwebサーバーを再起動してください。
例)
% /etc/rc.d/init.d/httpd restart

phpinfo()で見るとページトップの基本的な情報の下に以下のように
Xdebugの文字がでていればOKです。
This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
with Xdebug v2.0.2, Copyright (c) 2002-2007, by Derick Rethans

あれ?でてない!という方は、php.iniがちゃんと使われているか
これまたphpinfoの基本情報の中に書いてあるので確認してください。

ここからが本題というか悩んだところです。

以下のようにしてある場合で説明します。
---------------------------------------------
server1
---------------------------------------------
/home/user1/
 project1/
  app/
   project1_Controller.php
  www/
   index.php
 public_html/
  project1/
   index.php --> /home/user1/project1/www/index.php

/usr/local/apache/htdocs
 project1 --> /home/user1/public_html/project1

---------------------------------------------
URL
---------------------------------------------
http://servername/project1/index.php

---------------------------------------------
クライアント(ソースファイルの配置はサーバー上と同じ)
---------------------------------------------
c:\project1\
 app\
  project1_Controller.php
:

以上のような構成にしてある場合、peggyのオプションの
デバッグのURL・パス変換というところは以下のように設定します。

URLルート:http://servername/project1/
これはEthnaのプロジェクトの先頭ページのURLにします。

サーバールート:/home/user1/project1/app
ローカルルート:c:\project1\app
最初、ソースファイルのルートはindex.phpのあるproject1/www
にしたんですがうまくいかず、project1/appフォルダにしました。

これで、appフォルダ下にあるファイルにブレイクポイントを設定して
ブラウザで該当ページを開けばデバッグできます。
変数表示もスタックトレース表示もできます。
これで開発効率も256P倍です。

最後にPeggyって何?という方は
こちらをどうぞ。
軽量・高機能なテキストエディタです。
sakuraとかemeditorとかeclipseとかemacsとかvimとかhidemaruとかの人もPeggyをお勧めします。
eclipseはいろいろできていいんだけど重い!という方、
emacsはlispでカスタマイズできて楽しいけどそんな時間はない!という方、
その他のエディタで実はちょっと不満があるという方にはお勧めです。

ちなみに私のPeggyの気に入っているところは、
・軽量、色分け、文字コード自動判別
・フォルダ比較、ファイル比較、キーボードマクロ
・プロジェクトとして階層構造でファイルを管理
・PHPのデバッグ
・Oracleに接続してPL/SQLを実行しDEBUG_OUTPUTの表示
・HTMLの編集(HTML構造解析、タグ補完、対応タグ検索やタグ内選択)
です。
シェアウエアですが期限も機能制限もないのでぜひお試しください。
Peggyのヘルプに書いてありますが、デバッグの開始の際は
ソースファイルを開いてブレイクポイントを設定しておき、
WebブラウザではURLを入力する際に、
?XDEBUG_SESSION_START=session_identifier
というパラメータを追加してページを開きます。
(session_identifierはセッションを識別するためのもので任意です)

本文の例で言うと、
http://server1/project1/index.php?XDEBUG_SESSION_START=session_identifier
という感じです。

こうすると、ブラウザはステータスバーに「server1を待っています」
というようなメッセージが表示された状態で待ち状態になり、
Peggyの方はステータスバーにブレイクしたソースファイル名と行番号が
表示され、そのソースファイルの行にカーソルが飛びます。

あとはステップ実行するなり、変数の値を調べるなり好きにしてください。

テーマ:ソフトウェア開発 - ジャンル:コンピュータ

【2008/03/04 05:56】 | PHP | トラックバック(0) | コメント(0)
リアルシステムズ      情報工学技術士事務所


情報工学部門の独立技術士が思うこと

ブログ内検索

カテゴリー

プロフィール

佐藤 誉範

Author:佐藤 誉範
リアルシステムズ

平成3年からソフトハウスでシステム構築を行ってきました。
平成15年に技術士(情報工学部門)の資格を取得し、独立してリアルシステムズを創業。

情報システム構築に関することなら
どんなご相談にも親身に対応させていただきます。
一緒により良いシステムを考えましょう!

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

天気予報

リンク

このブログをリンクに追加する

RSSフィード

ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。