お仕事: 2010年12月アーカイブ

いやぁ、ちょっとハマって無駄な時間を過ごした。(^^;

例えば、db_user と db_shop というディレクトリ名で、XOOPS 汎用データベースモジュールを元にした外部モジュールをアップしてインストールをしようとすると、どちらの外部モジュールも一覧に同じ名前で表示されてしまうのだ。

modinfo.php の中で、db_user は「ユーザ検索」、db_shop は「お店検索」と名前を付けているのに、どちらも「ユーザ検索」と表示されてしまう・・・という具合だ。

結局、問題なのは db_user と db_shop というディレクトリ名であった。

XOOPS 汎用データベースモジュールは、ディレクトリ名を変えれば複数設置出来るようになっているのだが、そのため、モジュール名に添字(affix)を付けてモジュールを区別出来るようにしているみたい。

その添字の作り方が

$affix = strtoupper(strlen($dirname) >= 3 ? substr($dirname, 0, 3) : $dirname);

という具合にディレクトリ名の頭 3文字だけを取っているのが問題のようである。

ということで、db1_user、db2_shop のように先頭 3文字を抜いても問題の無いディレクトリ名にしてやれば問題ないのであった。

なんか、もう、いちいちこういう細かい仕様で引っかかって、全然本来の開発のところにたどり付けんな。

複数のプログラマ仲間が「今更 XOOPS?PHP のバージョンアップにもまともに対応出来てないのに?XOOPS に手を出すなんて 3~4年遅いよ。」と言うてたのは本当だな。今更 XOOPS なのである(^^;

20101208_as1.jpg

ActionScriptの標準ライブラリではZIPファイルの解凍機能は提供されていないので、自分で作るか、他人様が作成されて公開されているものを使うしかない。

勉強がてら作ってみるのは面白いのだが、今回の仕事はそういうライブラリが存在していることを前提に作業工数を見積もっているので、

FZip - http://codeazur.com.br/lab/fzip/

という、フリーのライブラリを使ってみた。(商用利用も問題なさげ)

日本語のドキュメントがほとんど存在していないため、英語のサンプルソースを見てどうにかするしかなかったので少し時間がかかったが、例えば任意のZIPファイルを解凍するだけなら以下のようなソースになる。


<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
    initialize="initProc()"
    layout="absolute" width="480" height="208">
    <mx:Label x="183" y="18" text="ZIP解凍 テスト" fontSize="18" id="Title"/>
    <mx:TextArea x="23" y="54" width="428" height="122" id="Message"/>

    <mx:Script>
    <![CDATA[

    import deng.fzip.FZip;    // ZIP操作ライブラリ
    import flash.events.*; 
    import flash.net.URLRequest;

    public var Fzip:FZip;
    public var ZipFileName:String    = "data/cont/ds.zip";
    public var ZipDirName:String    = "data/cont/ds/";

    private function initProc():void {

        Fzip = new FZip();

        var request:URLRequest = new URLRequest();
        var file:File = File.applicationStorageDirectory.resolvePath(ZipFileName);
        request.url = file.nativePath;

        Message.text    += "FN=" + file.nativePath + "\n";

        Fzip.addEventListener(Event.COMPLETE, loadComplete);
        Fzip.addEventListener(IOErrorEvent.IO_ERROR, onIOError);

        Fzip.load(request);
 
    }
 
    public function loadComplete(evt:Event):void {

        var file:File;
        var stream:FileStream;

        for(var i:int=0; i < Fzip.getFileCount(); i++){

            Message.text    += Fzip.getFileAt(i).filename + "\n";

            file = File.applicationStorageDirectory.resolvePath(ZipDirName + Fzip.getFileAt(i).filename);       
            stream    = new FileStream();
            try {
                stream.open(file,FileMode.WRITE);
                stream.writeBytes(Fzip.getFileAt(i).content);
                Message.text    += "File Output Success. " + file.nativePath + "\n";
            }
            catch(error:IOError) {
                Message.text    += "File Output Error.\n";
            }
            finally {
                stream.close();
            }

        }

    }

    private function onIOError(evt:IOErrorEvent):void {

        Message.text    += "There was an IO Error.\n";

    }

    ]]>
    </mx:Script>

</mx:WindowedApplication>


これで、ばっりち applicationStorageDirectory 以下の data/cont/ds/ ディレクトリ以下にファイルが展開される。
FileStream は、子ディレクトリが存在していなければ勝手に掘ってくれるので楽だ。

20101208_download_test.jpg

「FileReference.download メソッドだとダイアログが開いちゃうな」に書いたように、インターネット上から自動でデータ取ってきて、ファイルの保存まで自動で行おうとすると、URLLoader でデータ取ってきて、FileStream で書き出すしかないみたい。

こんな感じ。

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
    initialize="initProc()"
    layout="absolute" width="348" height="202">
    <mx:Label x="79" y="24" text="ダウンロードテスト" width="191" fontSize="18" textAlign="center" id="Title"/>
    <mx:TextArea x="39" y="60" width="266" height="113" id="Message" text=""/>

    <mx:Script>
    <![CDATA[

    import flash.events.*; 
    import flash.net.URLRequest;
    import flash.net.URLLoader;

    public static const FILE_GET_URI:String    = "http://www.exsample.jp/data/ds.zip";

    public var FileGet:URLLoader;
    public var ZipFileName:String    = "data/cont/ds.zip";

    private function initProc():void {

        FileGet = new URLLoader();
        FileGet.dataFormat    = URLLoaderDataFormat.BINARY; // バイナリ宣言

        FileGet.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
        FileGet.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
        FileGet.addEventListener(Event.COMPLETE, onComplete);

        Message.text    += FILE_GET_URI + " Download Start.\n";

        var request:URLRequest    = new URLRequest();
        request.url    = FILE_GET_URI;
        FileGet.load(request);

    }

    private function onIOError(evt:IOErrorEvent):void {
        Message.text    += "There was an IO Error.\n";
    }

    private function onSecurityError(evt:Event):void {
        Message.text    += "There was a security error.\n";
    }

    private function onComplete(evt:Event):void {
        Message.text    += "File was successfully downloaded.\n";
        Message.text    += "SIZE=" + FileGet.bytesTotal + "\n";

        var file:File = File.applicationStorageDirectory.resolvePath(ZipFileName);
        var stream:FileStream    = new FileStream();
        try {
            stream.open(file,FileMode.WRITE);
            stream.writeBytes(FileGet.data);
            Message.text    += "File Output Success. " + file.nativePath + "\n";
        }
        catch(error:IOError) {
            Message.text    += "File Output Error.\n";
        }
        finally {
            stream.close();
        }
    }

    ]]>
    </mx:Script>

</mx:WindowedApplication>


ちなみに、
FileGet.dataFormat = URLLoaderDataFormat.BINARY;
でバイナリデータ通信だと設定するのを忘れていて、writeBytes する時に

TypeError: Error #1034: Type Coercion failed: cannot convert "PKCDT to flash.utils.ByteArray.

というエラーが出ちゃってハマった。(^^;

FileGet.data を  ByteArray にわざわざ型キャストしてみたり色々やってみたが駄目で、結局、通信モードをバイナリ型にするのを忘れていただけだった。とほほ。

ActionScript も日頃頻繁に使ってるわけではないので、こういうのがまだ身に染み付いてないんだよなあ。

20101206_XOOPS_2.jpg

おっ。General Settings(全般設定)で Default language(使用言語)を japanese に、Debug mode(デバッグモードを有効にする)を Off(オフ)に設定したら、ちゃんと画面が日本語表示になって、画面下部に大量に出ていた

Unknown Condition [8192]: Assigning the return value of new by reference is deprecated in file modules/legacy/preload/InstallerChecker.class.php line 32

といったメッセージも出なくなった。

インストール中に日本語画面から英語画面に切り替わってしまったのは、ワーニングがぼろぼろ出ていた状態で、実は正しく設定が保存されていなかっただけってことなのか。(どうやら設定の問題だけだったようでよかった)

最初に、php.ini の display_errors を Off にしてからインストールを開始するようにしたほうがよさげじゃね。

ちなみに、よく見たら、

Powered by XOOPS Cube Legacy 2.1.8© 2001-2006 XOOPS Cube Project

って表示されてるな・・・
XOOPS Cube Legacy って 2006年から更新されてないの?
お客さんがコレ使うって言うからインストールしてみたんだけど・・・
このご時世に、4年も更新されてないものを使うのは怖いんですけど???

 

<追記>

2.1.8 が出たのが 2010年3月27日のようだ。よかった。:-)

20101206_XOOPS_1.jpg

取りあえず、XOOPS Cube Legacy のインストールは終了したのだが、ログイン画面でも、画面の下の方に、

Unknown Condition [8192]: Assigning the return value of new by reference is deprecated in file modules/legacy/preload/InstallerChecker.class.php line 32
Unknown Condition [8192]: Assigning the return value of new by reference is deprecated in file modules/legacy/preload/ThemeSelect.class.php line 32
Unknown Condition [8192]: Assigning the return value of new by reference is deprecated in file modules/legacyRender/preload/Cacheclear.class.php line 26
Unknown Condition [8192]: Assigning the return value of new by reference is deprecated in file modules/legacyRender/preload/Cacheclear.class.php line 29
Unknown Condition [8192]: Assigning the return value of new by reference is deprecated in file modules/pm/preload/Preload.class.php line 10

みたいなメッセージが延々表示されていやな感じ。
こりゃ、何なのかね?エラーでもワーニングでもないようだが。

で、どうも、悪いのは XOOPS Cube Legacy のようだ。
ググってみると、「PHP 5.3 対応ができてないやんけ!」という情報がぽろぽろヒットした。う~む・・・もうバージョンは 5.3.3 になってるのに?
もしかして、あまり最近は活性がよくないのかね?Cube のプロジェクトって。

取りあえず当方の環境は以下のとおり。

XOOPS: XOOPS Cube Legacy 2.1.8a
OS: FreeBSD 8.1-RELEASE
HTTPD: Apache 2.2.17
MySQL: 5.1.48
PHP: PHP 5.3.3

まあ、取りあえず、テスト用のサイトなので、上記メッセージが出てても「まともに動けば問題ない」んだけどね。

取りあえず、管理者メニューの設定画面とかがまともに動くか見てみて、どうするか見極めよう。

このアーカイブについて

このページには、2010年12月以降に書かれたブログ記事のうちお仕事カテゴリに属しているものが含まれています。

前のアーカイブはお仕事: 2010年11月です。

次のアーカイブはお仕事: 2011年1月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら