2013年3月28日木曜日

phpDocumentor:private クラス変数が出力されない

phpDocumentorでprivate クラス変数が出力されない。
または
How to document private variable in phpdoc.

class Sample {
/**
  * りんご(APPLE)
  * @var string
  */
   private $apple = null;
  ...
}
というふうにコメントを記述しているのにprivateのクラス変数が出力されません。
しかも、これがprivateではなくpublicやvarならば出力されます。

そもそもデフォルトでphpDocumentorはprivate変数を出力しないようになっているようなのです。
@accessタグにまつわるバグじゃないんかいと思わないでもないんですが・・・

privateのクラス変数を出力するにはコンパイルに-ppオプションを指定してやる必要があります。

phpdoc –pp -t ./doc -d ./website -o HTML:Smarty: HandS

※-pp:--parseprivate

このオプションでphpdocを実行することで。private変数も出力してくれます。
すっかりはまりました。

phpDocumentor:インストール

phpDocumentorを使ってみました。
pearの自動インストールで、バージョンは1.4.4です。
備忘録がてらまとめました。

phpDocumentor インストール

PEARから自動インストール
# pear install --alldeps phpdocumentor
No releases available for package "pear.php.net/phpdocumentor"
install failed
いきなりエラー。

原因は、インストールしようとしていたウェブサーバ(Linux)が社内ネットワーク上にあり、インターネットの外部接続にプロキシの認証が必要だったからです。
ブラウザを立ち上げて認証し、再び実行。

# pear install --alldeps phpdocumentor
WARNING: "pear/PhpDocumentor" is deprecated in favor of "channel://pear.phpdoc.org/phpdocumentor"
WARNING: channel "pear.php.net" has updated its protocols, use "pear channel-update pear.php.net" to update
WARNING: "pear/XML_Parser" is deprecated in favor of "pear/XML_Parser2"
downloading PhpDocumentor-1.4.4.tgz ...
Starting to download PhpDocumentor-1.4.4.tgz (1,534,088 bytes)
.....done: 1,534,088 bytes
downloading XML_Beautifier-1.2.2.tgz ...
Starting to download XML_Beautifier-1.2.2.tgz (14,587 bytes)
...done: 14,587 bytes
downloading XML_Parser-1.3.4.tgz ...
Starting to download XML_Parser-1.3.4.tgz (16,040 bytes)
...done: 16,040 bytes
install ok: channel://pear.php.net/PhpDocumentor-1.4.4
install ok: channel://pear.php.net/XML_Parser-1.3.4
install ok: channel://pear.php.net/XML_Beautifier-1.2.2

XMLパーサが重複しているWarningが出たものの、とりあえずOK.

# pear list
Installed packages, channel pear.php.net:
=========================================
PEAR             1.9.4   stable
PhpDocumentor    1.4.4   stable
XML_Beautifier   1.2.2   stable
XML_Parser       1.3.4   stable

ちゃんと入ってました。
これでphpDocumentorのインストールは終了です。

PHPのメモリエラー

インストール中に
Fatal error: Allowed memory size of  XXXXX bytes exhausted ...
のPHpメモリエラーが出た場合は、
php.iniのmemory_limitの設定を8Mないし未設定から16Mなど上に引き上げましょう。
私は最初から256Mあったので出ませんでした。(こんなになくとも良いです)

日本語文字化け対応

このまま出力するとコメントに含まれている日本語が文字化けします。
PhpDocumentorで使われているSmartyのテンプレート(header.tpl)にmetaタグでのエンコード指定がないか、デフォルトでiso-8859-1が指定されているからです。
そのため、header.tplテンプレートのエンコードをUTF-8(スクリプトのエンコード)指定を追記するか、iso-8859-1を書き換えます。
metaタグを追記する

<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>


metaタグをUTF-8に書き換える
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
→'text/html; charset=UTF-8'

修正対象テンプレート

[PEAR]:開発環境では[/usr/local/share/pear]
[TMP]:開発環境では[/data/PhpDocumentor/phpDocumentor/Converters/HTML]
・[PEAR][TMP]/frames/templates/phpedit/templates/header.tpl
・[PEAR][TMP]/frames/templates/phphtmllib/templates/header.tpl
・[PEAR][TMP]/frames/templates/DOM/phphtmllib/templates/header.tpl
・[PEAR][TMP]/frames/templates/DOM/earthli/templates/header.tpl
・[PEAR][TMP]/frames/templates/DOM/default/templates/header.tpl
・[PEAR][TMP]/frames/templates/DOM/l0l33t/templates/header.tpl
・[PEAR][TMP]/frames/templates/DOM/phpdoc.de/templates/header.tpl
・[PEAR][TMP]/frames/templates/earthli/templates/header.tpl
・[PEAR][TMP]/frames/templates/default/templates/header.tpl
・[PEAR][TMP]/frames/templates/l0l33t/templates/header.tpl
・[PEAR][TMP]/frames/templates/phpdoc.de/templates/header.tpl
・[PEAR][TMP]/Smarty/templates/HandS/templates/header.tpl
・[PEAR][TMP]/Smarty/templates/PHP/templates/header.tpl
・[PEAR][TMP]/Smarty/templates/PEAR/templates/header.tpl
・[PEAR][TMP]/Smarty/templates/default/templates/header.tpl

全て修正しても良いですし、自分の使うテンプレートだけでも良いと思います。
これで実行準備が整いました。

phpDocumentorを実行

ディレクトリ出力
phpdoc –pp -t ./doc -d ./website -o HTML:Smarty: HandS
ファイル出力
phpdoc -pp -t ./doc  -f ./website/SampleOutput.php -o HTML:Smarty:HandS

実行オプション:
-t: DOCの出力先
-d:DOCにする対象フォルダ
-o:出力形式の指定
-pp:—parseprivate。
※特にこのオプションは重要です。
このオプションがないとprivateのクラス変数を出力してくれないためです。

実行

Parsing time: 18 seconds
Conversion time: 41 seconds
Total Documentation Time: 59 seconds
done


出力完了。

指定したフォルダ(この場合はhttps://localhost/website/doc/) にドキュメント一式が生成されます。

2013年3月27日水曜日

xalan バージョン確認

xalanのバージョンを確認するには下記のコマンドを実行。

java -classpath /usr/share/xalan/xalan.jar org.apache.xalan.processor.XSLProcessorVersion

Xalan Java 2.7.1


※/usr/share/xalan/xalan.jar は適宜xalanへのpathにしてください。

2013年3月26日火曜日

ASP.NET Chart:軸の線の種類を変える

ASP.NET 4.0
Chartコントロールでx軸やy軸の線の種類を変える

<ChartAreas>をこんな風に設定します。
・・・キャメルケースが消えてしまいました。
全部小文字になってしまいましたが、実際はASP.NETの流儀に乗っ取って下さい。
                    
                        
                            
                            
                                
                            
                        
                    
axisyのタグ内にプロパティとして含めたLineDashStyleが、グラフの左端の線になります。
(x軸に設定した場合は下)
ここを設定しただけでは中の線は代わってくれないのです。
中の線の種類を変えたい場合は、axisyタグの子としてmajorgridを設定します。
これを設定することで中の線種が変化します。

2013年3月22日金曜日

ASP.NET customErrors defaultRedirectに設定したエラーページに遷移しない

これもまたハマりました。
ASP.NETの簡易エラーページを表示させようと、Web.configに以下を設定しました。

<configuration>
  <system.web>
    <customErrors mode="On" defaultRedirect="Error.html" />
  <system.web>
<configuration>

この状態でログインページを表示し、DBの接続文字列を不正なものにして接続エラーを出してみたんですが、指定したリダイレクトページが出ませんでした。あと挙動がとてもおかしいいです。

1. ログインする
2. セッションエラーが出てまたログインを迫られる
3. またログインする
4. ASP.NETデフォルトのエラーページが表示される

???
Error.htmlはどこいった?

ずっと原因が判らずハマってたのですが、原因がForm認証にありました。
現在Web.configではこんなようなForm認証を設定しています。

 <authentication mode="Forms">
  <forms loginUrl="~/Login.aspx" name=".ASPXFORMSAUTH" timeout="2880" defaultUrl="~/Top.aspx"/>
 </authentication>

(略)

Form認証は、認証前はどのページにアクセスしてもデフォルトページに戻す仕様です。
defaultRedirectで設定したエラーページも例外ではありません。
ということでログインのときに接続エラー→エラーページにリダイレクト→Form認証エラでログインページに戻される→またログイン→エラーページにリダイレクト・・・と
そこでループが発生していたのでした。
回避するためにcommonフォルダを除外するなどのエントリも以前書きました。
すぐ思い出せなかったのが悔しい・・・。
そういうわけですので、エラーページをフォーム認証の例外ページにするようWeb.configで設定することでリダイレクトページが正常に機能するようになりました。
こんな感じです。

 <location path="Error.html">
  <system.web>
   <authorization>
    <allow users="*"/>
   </authorization>
  </system.web>
 </location>


※<system.web>の前に入れて下さい。

2013年3月19日火曜日

Visual Studio 2010 IE10 iexplore.exeにスクリプトデバッガーをアタッチできませんでした。デバッガーは既にアタッチされています。というエラー

ASP.NET 4.0
Visual Studio 2010

開発途中で、IE9からIE10に更新したら、デバッグを起動すると

「コンピュータ 'コンピュータ名' 上のプロセス [プロセスID] iexplore.exeにスクリプトデバッガーをアタッチできませんでした。デバッガーは既にアタッチされています。」

というエラーがポップアップするようになりました。
デバッガ自体は普通に起動し、ブレークポイントでも止まってくれますが、デバッグを起動するたびにポップアップが出て正直邪魔です。
どうもデバッガを二重起動しているみたいな雰囲気です。(全然違うかもしれませんが)

エラーメッセージで検索してみるも、どれも違うような・・・
仕方がないので範囲を英語に広げて検索してみて見つけました。

Visual Studio 2010 debugger already attached classic ASP
http://social.msdn.microsoft.com/Forums/en-US/vsdebug/thread/7cdb53cd-0f26-47ae-aaf5-9113b6dfc96a/

Unable to javascript debug IE 10 with Visual Studio 2010
http://social.msdn.microsoft.com/Forums/en-US/vsdebug/thread/84b22d20-6e03-4095-a51d-821eba7a14ed?prof=required

結論から言うと2番めのURLにあった方法でエラーが出なくなりました。

1. IEを閉じる
2. コマンドプロンプトで以下のコマンドを叩く。
regsvr32.exe "%ProgramFiles(x86)%\Common Files\Microsoft Shared\VS7Debug\msdbg2.dll"

私はC:\Program Files\Common Files\microsoft shared\VS7Debugまで移動してから
regsvr32.exe msdbg2.dllとやりました。

デバッガのモジュールを(COMコンポーネント)をもう一回登録しなおす感じです。
IE10に上げるとこのあたりの関連がどうにかなってしまうんでしょうかね。
 

ASP.NET 4.0 IE10 で '__doPostBack' は定義されていません。

ASP.NET 4.0 、IE9、IIS 7で開発途中、IE10がWindows Update更新対象になったので、バージョンを上げてみました。
そしたら作成していたウェブアプリケーションがポストバックのたびにエラーで止まるようになりました。

ユーザー エージェント: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)タイムスタンプ: Fri, 15 Mar 2013 07:41:06 UTC
__doPostBack' は定義されていません。

そんな!!

ASP.NET 4.0だとIE10の検出がデフォルトでサポートされておらず、パッチをあててIE10用のユーザーエージェント文字列を出力する必要がありました。

ASP.NET が Internet Explorer 10 の検出に失敗する
http://msdn.microsoft.com/ja-jp/library/ie/hh869299(v=vs.85).aspx

Internet Explorer 10 のユーザー エージェント文字列
http://msdn.microsoft.com/ja-jp/library/ie/hh869301(v=vs.85).aspx

Microsoft.NET Framework 4.0 で ASP.NET ブラウザー定義ファイルの修正プログラムが利用可能です。
http://support.microsoft.com/kb/2600088/ja

一番下のリンクから修正パッチを請求してローカルの開発環境とサーバの両方にインストールすれば正常に動くようになります。
IE9以下ではエラーにならないので発覚しづらいのですが、これはかなり致命的です。

ついでにVisual Studio 2010でのデバッグでも、IE10にあげたら、「コンピュータ 'コンピュータ名' 上のプロセス [プロセスID] iexplore.exeにスクリプトデバッガーをアタッチできませんでした。デバッガーは既にアタッチされています。」というエラーを吐くようになりました。
デバッグ自体は動いているのですが、いちいち警告がポップアップされるのでちょっと邪魔。
これの対応も手間取りました。別項で。

2013年3月5日火曜日

IIS + ASP.NET 本番サーバ移行のトラブル備忘録

お約束だとわかっていてもつらい本番トラブル。

IIS 7.5 ASP.NET 4.0
ASP.NETウェブアプリケーションを開発サーバから本番サーバに
移行した際のトラブルと対処を備忘録代わりにメモ。

1.  500.19  エラー
HTTP エラー 500.19 - Internal Server Error
ページに関連する構成データが無効であるため、要求されたページにアクセスできません。
エラー コード 0x80070021

構成エラー この構成セクションをこのパスで使用できません。この問題は、親レベルでセクションがロックされているときに発生します。ロック状態は既定で設定されているか (overrideModeDefault="Deny")、または overrideMode="Deny" もしくは従来の allowOverride="false" を含んだ場所タグによって明示的に設定されます。

→IISにASP.NETがインストールされていなかった。
 サーバーマネージャー起動
 役割サービス→ASP.NET, ISAPI拡張などをインストール。

2. 5 00.21 エラー
HTTP エラー 500.21
ハンドラー "***" のモジュール リストにあるモジュール "ManagedPipelineHandler" が正しくありません。


→ASP.NETが<正しく>インストールされていなかった?
 %windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
 を実行し、ASP.NETとIISを関連付けてインストールすることで動くようになりました。
【参考サイト】
 http://ytakai.info/2011/05/18.php

3. さらに 401.2 エラー 許可されていないエラー
401.2 権限がありません: サーバーの設定のためログオンに失敗しました。

このエラーは、サーバーに渡されたアカウント情報がこのサーバーにログオンできるアカウント情報と一致していないことを示します。このエラーは通常、適切な WWW 認証ヘッダ フィールドが送信されない場合に起こります。

→IISのウェブサイトの設定の「認証」設定から
 匿名認証とフォーム認証を有効にすることで解決。
 これは他にも
 http://support.microsoft.com/kb/261689/ja
 あたりが役に立ちそうです。

Oracleの接続にもおもいっきりつまづきました。
それは後ほど。