2012年12月27日木曜日

Flex:DataGrid Columnの幅をパーセント指定

Flex DataGridでDataGridColumnの列幅を固定値ではなくパーセントで指定したい場合がある。
しかしながらDataGridColumn width="10%"など指定しても
「widthのイニシャライザ:ここではパーセンテージは使用できません」
というエラーに。

creationCompleteを使って動的に指定するやり方も紹介されていたが、うまく動かなかった・・・。
http://www.adobe.com/jp/support/flex/ts/documents/224468bb.htm

でも、なんと以下のように小数点以下を指定すればパーセント指定が出来た。

<mx:DataGridColumn width=".20" headerText="No."  />
<mx:DataGridColumn width=".40" headerText="contents1" />
<mx:DataGridColumn width=".40" headerText="contents2" />

これでウィンドウを手動でリサイズしても同じ比率でグリッドの幅が保てる。
ただし幅のパーセント指定と固定値指定の併用ができず、固定で表示したかった列も小数点でパーセント指定せざるをえなかった。どうやるのでしょう。

2012年12月19日水曜日

Basic認証で認証後に500 Internal Server Error.

Basic認証で、パスワード認証後にInternal Server Error 500が出た場合。

自分の場合は.htaccessに書いたパスワードファイルのパスが間違っていました。
認証ダイアログまで表示され、一見認証通ったかのように見えるため、何が悪いのか少しだけ考えてしまいました。

2012年12月12日水曜日

CakePHP 動的に生成したフォームのバリデーション

CakePHPで動的に生成したフォームに対し、どうやってバリデーションしたらいいのか小一時間悩む。小一日くらい悩みました。
やりたかったことは以下のとおり。

ある入力フォームのページで、ロード時にデータベースの値を取得し、その値によってページのフォームの数が変わるというページを作成。

DBから取得した値が2なら、0~1($i)までループを回して
echo $form->input('Model.name'.$i, array('name' => 'distribution', 'label' => false)
をctpで表示。

普通、Modelと関連付けてのバリデーションは、ひとつひとつのフォームのnameに対してあらかじめ設定します。
このような動的に生成したフォームに対してModelからバリデーションを設定できるのかとトライ・アンド・エラーでいろいろと試行錯誤するものの、動くというだけでエラー表示もはちゃめちゃな代物に。

で、思い余ってCakePHPフォーラム様におそるおそる聞いてみたところ、優しい方に配列でフォーム値を取得できるやり方をご回答いただいたので、そこからさらに色々と調査してみてどうにか出来ました。

動的に生成したフォームのバリデーション
http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=2723&forum=7

2012年12月11日火曜日

OpenSSL httpsだとFlexのデバッグがamfphpに接続できない

本番サイトがSSLのため、とりあえず開発環境にOpenSSLを設定し、プログラム内の接続先をすべてhttpsに変更。
自己証明書(いわゆるオレオレ証明書)でもサーバ上にアクセスする分には警告が表示されるのを除けば問題なかった。
が、Flex Builderでデバッグを行った際、以下のような接続エラーが表示され、amfphpに接続出来なくなった。

--------------
(Object)#0
  code = "NetConnection.Call.Failed"
  description = "HTTP: Failed"
  details =
  level = "error"
--------------

 これを回避するには、ちゃんとブラウザで自己証明書を「信頼されたルート証明機関」としてインポートする必要があった。
証明書インポートの手順
  1. IE(Flexのデバッグするブラウザ)でサイトにアクセス
  2. アドレスバーの「証明書のエラー」をクリック
  3. 「証明書の表示」をクリックし、証明書ウィンドウを開く
  4. 「証明書のインストール」をクリックし、証明書のインポートウィザードを開く
  5. 「次へ」→「証明書をすべて次のストアに配置する」を選択→「参照」→「信頼されたルート証明機関」を選択→「OK」
  6. 「次へ」→「完了」を押下し、警告等にもOKを押下し、設定完了
これで再びデバッグモードで起動した際、正常に接続できる。
どうして接続出来ないのか全くわからなくて小一時間悩みました。

2012年12月7日金曜日

PrimoPDFで作成したPDFでテキストをコピーできない

PrimoPDFで作成したPDFでテキストをコピーできない。
PDF文書の日本語での検索ができない。

テキストコピーの件は、Adobe のポストスクリプト・プリンタ・ドライバ をインストールすることで、文字化けせずに貼り付けることができた。
ただし日本語検索が出来ないのは未解決。

参考サイト
http://d.hatena.ne.jp/kaz99969/20071105/1194276529

postgresql WITH RECURSIVEを応用した深さ優先探索

Postgresql8.4から使える再帰SQL、WITH RECURSIVEを応用した深さ優先探索。
指定した親から子、孫・・・と、深く取得してから次の親に移動して探索。
親子孫、親子孫・・・と上から並べてゆく場合に便利。
ツリー構造をすべて一括で出すなら深さ優先探索の方が見やすい。

WITH RECURSIVE tmp AS(
SELECT uid,pid,
Row_Number() over(order by uid asc) AS rn FROM Tree
),
rec(uid,pid,path,sortArray) AS(
SELECT uid,pid,array_append(null,uid),array[rn]
FROM tmp WHERE pid = '0'
union all
SELECT b.uid,b.pid,a.path || b.uid,
a.sortArray || b.rn
FROM rec a,tmp b WHERE a.uid = b.pid)
SELECT uid,pid,
array_length(path,1) AS LV,
array_to_string(path, ',') AS path
FROM rec ORDER BY sortArray;


uid, pidはいずれもvarchar。
Row_Number()関数でuidの降順の連番を別フィールド「rn」として取得。
根からの経路上のrnを配列型で保存していって、最後にorder byでソートキーとして使用。
array[uid]ではなくarray_append(null,uid)としているのは、
ERROR: recursive query "rec" column 4 has type character varying(12)[]...
というunion allにおける上下の型の不一致エラーが発生したため。
postgresは8.3あたりから型チェックが厳密になったよう。

すっごく勉強させていただきました
http://www.geocities.jp/oraclesqlpuzzle/postgresql-rec-with.html

postgresql ツリー構造のテーブルを再帰的に取得

postgresqlで、ツリー構造を持つテーブルにて、指定したIDを親として、親含めた子IDを再帰的に取得するSQL。
uidがユニークID、pidが親ID。

WITH RECURSIVE r AS
(SELECT * FROM Tree WHERE uid = '123'
UNION ALL
SELECT Tree.* FROM Tree, r WHERE Tree.pid = r.uid)
SELECT * FROM r ORDER BY uid;


※WITH RECURSIVEはpostgres8.4から。

Linuxでxalanのエラー Exception in thread "main" java.lang.NoClassDefFoundError

Linuxサーバでxmlをhtml変換するのにxalanを使ってみたのですが、コマンドの実行時でこのエラーが表示されて苦労しました。

[root@localhost ~]# java org.apache.xalan.xslt.Process -in sample.xml -xsl sample.xsl -out output.html
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xalan/xslt/Process
Caused by: java.lang.ClassNotFoundException: org.apache.xalan.xslt.Process
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: org.apache.xalan.xslt.Process.  Program will exit.

PATHが通ってないので怒られているらしい。
だけれどもxalanの実行ディレクトリにはPATHは通っている。
色々調べた結果、結局実行ファイルのxalan.jarそのものに「クラスパス」を通さないとならないということを知りました。
説明に「クラスパス」に通す、とあったのですが、私はjavaは全く明るくないため、実行フォルダだけでいいのかなと思っていたのが敗因。

以下の用にクラスパスをセットして再度実行したところ、無事に成功。

[root@localhost ~]# CLASSPATH=/usr/local/apache2/htdocs/todoxweb/xalan/xalan.jar
[root@localhost ~]# export CLASSPATH=$CLASSPATH:.
[root@localhost ~]# echo $CLASSPATH
/usr/local/apache2/htdocs/todoxweb/xalan/xalan.jar:.

あるいはコマンド実行時にクラスパスまで指定する。

[root@localhost ~]# java -classpath  /usr/share/xalan/xalan.jar org.apache.xalan.xslt.Process -in sample.xml -xsl sample.xsl -out output.html 



2012年10月15日月曜日

brタグがIE9で反映されない

<br>の前に全角スペースがあるとブラウザで見た時改行が反映されません。

IE9で確認しましたが、もっと前のバージョンでもあるかもしれません。
OperaやChromeでは問題無し。IEのバグなのか、これが仕様として正しいのかは判りません。

2012年8月3日金曜日

Flex Builder では、必要な Flash Player のデバッガバージョンを見つけることができません。


Flex 突然のデバッガバージョンエラー

FlexBuilderにて、つい30分まで何の問題もなくF11でデバッグを開始できていたのに、何の前触れもなく

『Flex Builder では、必要な Flash Player のデバッガバージョンを見つけることができません。Flash Player 9 のデバッガバージョンをインストールするか、Flex Builder を再インストールする必要があります。現在のバージョンでデバッグを試みますか?』

とエラー表示され、デバッグが起動出来なくなった。

で、何かの弾みでFlashが調子崩したのかと思って(何の弾みだ)Flashの再インストールを試みるも、

『インストールしようとしているバージョンの Adobe Flash Player は、最新バージョンではありません。http://www.adobe.com/go/getflashplayer にアクセスして、安全性が高い最新バージョンを入手してください』

と怒られてインストールできない。

とりあえずFlashをクリーンインストールしようとadobeのサイトからuninstall_flash_player_32bit.exeをDLし、一旦flashをアンインストール。
【参考】
http://akabana.info/2010/03/15/flashplayer-clean-uninstall/

その後デバッグバージョンのflashをインストールしようとするも、やっぱり最新バージョンではないというエラーが出る。

で、色々試しているうちに、IEでは表示されなくなったFlashがChromeでは表示されることに気付く。
IEのプラグインは消えたくせになぜかChromeのFlashプラグインは頑固に居座り続けていた・・・。(コンパネにもないのに!どんだけ!)

そしてデバッガが起動しない原因は、プラグイン
(C:\Windows\System32\Macromed\Flash\Flash11f.ocx)
がいつのまにかインストールしていたデバッグバージョンでない最新のものに置き換わっている所為だと気付く。
インストールしたデバッガバージョンのocxはFlash11f.ocxなのに、いつの間にかFlash32_11_3_300_268.ocxになっていた。おいおい。

どうやらChromeの強制自動アップデートでFlashのプラグインが勝手にすり替わっていたらしい。

ちょ・・・
そいつぁあんまりじゃないですかいChromeさんよ!

とにかくChromeのFlashプラグインを消さないとどうにもならないと察したので、ざっくり削除。
C:\Users\[ユーザー名]\AppData\Local\Google\Chrome\Application\[Chromeのバージョン]\gcswf32.dll(場所はWindows7の場合)を削除。
※Flashをアンインストールしたあとで行う
【参考】
http://frmmpgit.blog.fc2.com/blog-entry-41.html

これでChromeでもflashが見られないことを確認したら、再度デバッグバージョンのFlashをインストール。
で、強制自動アップデートがもうめんどくさいのでChromeをアンインストール。
レジストリいじってまで自動アップデートを止めるのも面倒だった。

2012.9.5 追記

どうやらchromeの設定から行けるようです。


設定>詳細設定を表示...>プライバシー>コンテンツの設定...>プラグイン
>プラグインを個別に無効にする...>デバッグバージョン以外のFlashPlayerを無効に設定。




2012年3月10日土曜日

CakePHP:SQL Error: 1271: Illegal mix of collations for operation

検索フォームを作成し、日付のフィールドにひらがな等を入力してsubmitすると
SQL Error: 1271: Illegal mix of collations for operation '>=' [CORE\cake\libs\model\datasources\dbo_source.php, line 684]
というエラーになる。
これがどうしても解決しない・・・
文字コードに関して色々調査してもまったく解決しない。
下記サイトの文字コード指定のダンプで上手くいくかもと思いましたが何の関係もなかった。
http://d.hatena.ne.jp/ho4kawa/20110301/1299638094

日付型フィールドの値をひらがなと比較しているのが悪いのでしょうが、ここまで露骨にエラーじゃなくても。
というわけで、後回し。誰か解決方法ご存じないでしょうか・・・

CakePHP:1064: You have an error in your SQL syntax;

SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'findAll' at line 1 [CORE\cake\libs\model\datasources\dbo_source.php, line 684]
Query: findAll

というエラー。
1.3.14で「findAll」は非推奨になっています。(使えない?)
find関数のオプションで「all」を指定してあげましょう。

バージョンごとの違いが結構気になる。
ネットのサンプル通りにやったのにーと歯ぎしりしたものの、勉強不足でした。

CakePHP:外部からURLで指定出来ないメソッド

コントローラの外部アクセス不可メソッドについて

URLからアクセスできないメソッドを作成したいときは,メソッド名の先頭に「_(アンダースコア)」を付けます。
アンダースコアをつけないメソッドはURLからアクセス可能なので、よろしからぬ自体が起こる可能性がありますね。
アクションとして使用しないメソッドには必ずアンダースコアを付けておきましょう。

CakePHP:定数を別ファイルにする

そういえばCakePHPで定数を別ファイルにしてインクルードしたいときってどうするんだろう・・・とふと手が止まる。
こんなことで迷ってしまうのがフレームワークに慣れてない感じ。

app/config/constants.phpを作成し、app/config/bootstrap.phpでconfig('constants');と指定して読み込ませます。

CakePHP:authComponentとバリデーション

なんかバリデーションがauthComponentだとうまくいかないと思っていましたら・・・

こんな情報が。
http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1565&forum=3
まだ実装はためしてないですが。。。

あとログインのアクションをusersから変えたい場合はこんな感じで指定。
$this->Auth->loginAction = array(
'admin' => false, 'controller' =>
'account', 'action' => 'login'
);

参考
http://c-brains.jp/blog/wsg/10/01/29-143311.php

CakePHP:トップページのコントローラの指定

いわゆるindexにコントローラを作りたい場合。
私もindex_controllerとかとか作って試してみたんですが、尽く失敗したので調べてみました。
pagesコントローラーでdisplayアクションをコールしているようです。
というわけでpages_controller.phpとdisplay.ctpを作成すればOK。

CakePHP そういえば、トップページのコントローラーは?
http://yasigani-ni.com/?p=447

ありがとうございますm(_ _)m

CakePHP:開発環境

CakePHPはじめました。

CakePHP version
1.3.14

開発環境
Vertrigo Serv2.26
 Apache/2.2.21 (Win32)
 PHP/5.3.9
 MySQL 5.0.8

IDE
netbeans7.1

さすがに規模がアレなのでIDEはnetbeans使います。
これに慣れちゃうとエディタでの開発が辛くなりますね。
これからちょこちょこと躓いたことのメモでもまとめていきたいと思います。

2012年3月3日土曜日

PHP:HTMLソースからイメージタグを抽出

function get_image_tag($content,$i){
    $pattern = "/<img.*?\>/";
    preg_match_all($pattern, $content, $images);
    echo $images[0][$i];
}
関数は適当ですがこんな感じで一行ずつ読み込んだものに対してかまします。

PHP:htmlspecialchars

PHP5のhtmlspecialcharsにはENT_QUOTESを付けます。
htmlspecialchars でXSS対策をしていたと思ったら、デフォルトでは シングルクオートをエスケープしてくれないのです。(マニュアル参照)

htmlspecialchars($str, ENT_QUOTES);

ENT_QUOTES を指定することで、シングルクオートも ' にエスケープ出来ます。

2012年1月3日火曜日

Flex:Error #2044: ハンドルされていない IOErrorEvent : text=Error #2038: ファイル I/O エラー。

Error #2044: ハンドルされていない IOErrorEvent : text=Error #2038: ファイル I/O エラー。

ファイルをサーバから取得してローカルに保存させようとした際にこのエラーが出る。
原因はサーバ上のファイルが空(0byte)だったからのよう。

ちゃんと内容を書き出してから取得するようにしたら消えた。
あとファイルを開きっぱなしにしててもなります。

Flex:データグリッドのカラムのクリア

データグリッドのカラムのクリアに超苦労しました。

public function clearDate(data:Object): void {
    hogeList_DataGrid.selectedItem.hoge_item = "";
    hogeList_DataGrid.selectedItem = new ArrayCollection();
}

Flex:強制型変換に失敗しました。global@7d7c131 を flash.display.Sprite に変換できません。

強制型変換に失敗しました。global@7d7c131 を flash.display.Sprite に変換できません。
のエラー。

親(main.mxml)アプリケーションで、以下のコードで生じたエラー。
Alert.show("不正なアクセスです。", "アクセス確認", Alert.YES | Alert.NO, this, eventHogeHogeHandler, null, Alert.YES);
を置いてたらなった。第四引数のthisをnullにしたら解決。

ImageMagick:変換と解像度

95×61の画像に対して

-geometory 300%
-density 500(dpi)

というオプションをつけて変換すると、

1980×1272

という、ちょっとびっくりするくらいのサイズに変換される。
冷静に考えてみると、density500の指定がまずもとの解像度72dpiの約7倍なので
ピクセル数が95*7, さらにgeometryで3倍かかってくるので約1980となる。
これでも実寸は変わらない。
うーん、解像度とかややこしい。