2013年8月4日

dotNET アプリケーションをビルドするbatファイル

 昔々、やってたプロジェクトでdotNETで作成したWebアプリケーションをコンパイルするのに毎回VisualStudioを起動してコンパイルしてリリースやテスト環境を作るのが嫌になったのと、たかがこれだけの作業すら自分でやりたくない偉ぶってる人を批判するためにビルドするバッチファイルを作りました。
 ちなみに、VSSにも対応していました。
一応中を読めばわかると思うんですが解説が欲しい人はコメント下さい。

 当時は、VisualStudio2005を使っていたので、このバージョンですが、新しいのにも適用できるのでは無いでしょうか?


やってることは

  1. 1.Subversionのリポジトリからソースを一式取ってくる
  2. 2.ソリューションをビルドする
  3. 3.リリースファイルをフォルダにまとめる。
  4. 4.ビルド結果をログファイルとして作成する。

です。

 ホントは、これを元に改良していろいろなプロジェクトに適用してほしかったんですが、だれも何も指定内容です。
 殆どの人が自分で作業したくないんですよね。
システム開発者が消費者(出来合いのものを使うだけ)になっている現状がありました。


ダウンロードはこちら
dotNTAppBuilder.zip

2013年7月28日

平均寿命が200歳になった時の弊害

 以前、ソフトバンクの孫社長が「人の平均寿命は200歳」になると言っていたが、もしそうなるとしたら、和暦のために2桁しか取っていない項目は、桁溢れする可能性があるな。

 平成101年とか…。

2000年問題ならぬ、和暦100年問題が発生する。

和暦なんて使うのやめてしまえばいいのに、のに。

2013年7月27日

運用中のサーバーを止めずにセットアップさせられる

 あるWebシステム(外向けに公開している)をセットアップに行った時に、一切サーバを止めるための通達もしていないことが判明。

 前日にそのあたりは大丈夫かと中間業者の営業に口が酸っぱくなるほど言っていたにもかかわらずなんのユーザ側になんの通達もしていなとは…。
 一応、社内の技術の人間にもどうすればよいか相談していたらしいけど、その技術の人間も面倒臭いだったんだろうけど、「大丈夫、大丈夫。なんかあったら連絡するから」程度のことで話を終わられていたらしい。

 もし、サーバーの再起動が必要になった場合に相談をするんでしょうけど、再起動はダメとなったら、きっと、「じゃぁ、セットアップ終わりませんよ」とかの脅し的な文句をいうつもりだったんだろう。

「脅してきな文句をいうつもりだったんだろう」というとこは、想像なんだけど、セットアップ作業の前のユーザへのシステムの説明会の時のユーザーへの対応を見ているとそういう言い方をしそうだなということで。


 まぁ、結局再起動をする必要はなかったんですが。
最後に、その営業は「再起動は必要なかったですね」といったのを聞いて、「はぁー、なにもわかってないね」と思いましたよ。
(システムのセットアップのリハーサルをしている間に「再起動が起きない」ということはわかっていたんだけど)

 何かが起きた時にどうするんだよという話を全然わかっていない。


この営業の人いつか大問題を起こすね。かわいそうに…。

2013年7月24日

いろいろなブラウザでのテスト面倒

 今作ってるWEBのシステムをいろんなブラウザでテストした。
イントラネットのシステムだったら、これでやってねで終わるんだけど、外への公開用なのでそうも行かず。

こんなに沢山。ホントは分担作業にしたいんだけど、分担する人いないし。
  • Internet Explorer 8, 9, 10
  • Firefox
  • Safari
  • Google Chrome

 ほとんどの機能を動かしたので朝からすごく疲れた。

なんとなく、Chrome→ Safari→IE10→Firefox→IE9→IE8の順番でやってみたんだけど、IE9とIE8でJavaScriptが動かないのが判明。
原因は、IE8がIE7互換になって動作してて、連想配列の最後の項目の後ろにカンマが付いてるのが問題だったらしい。

 metaタグでIEは、IE8とIE9をエミューレートしなさいという設定を入れることで動くようになったけど、今度は、IE10で動かなくなってしまうという・・・。

 なぜ?余計なmetaタグなんてあるからというのがわかったので、結局、IE10か、IE以外のブラウザだったらそのタグを付けないということでことで解決。

HTMLにつけたmetaタグがこれ。IE10の時につけると事件が起こるから気をつけてね。


<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8;EmulateIE9" />


IPアドレスが同じネットワークの範囲内にいるかチェックする


 リクエストしたクライアントが管理しているネットワーク内かどうか判定する為の関数。




  1. /**
  2.     同じネットワーク内にいるか判定する
  3.     @param $ip チェックするIPアドレス
  4.     @return true..いる false..いない
  5. */
  6. private function inCIDR($ip) {

  7.    $CIDR_LIST = array('127.0.0.1/24', '192.168.0.0/24');  // この範囲いないにいるかチェックする。普通外に持つか、もらう。

  8.     for($i=0; $i<count($CIDR_LIST); $i++) {
  9.         $cidr = $CIDR_LIST[$i];

  10.         list($network, $mask_bit_len) = explode('/', $cidr);
  11.         $host = 32 - $mask_bit_len;
  12.         $net = ip2long($network) >> $host << $host;
  13.         $ip_net = ip2long($ip) >> $host << $host;

  14.         if($net==$ip_net) {
  15.             // 一致したので同じ中にいる。
  16.             return true;
  17.         }
  18.     }
  19.     return false;
  20. }


2013年7月23日

CakePHPでDBサーバーが止まっていた(環境問題で動作できない)時のエラー

 CakePHPで作っているシステムの最終的なテストをしていた時に、MySQLのサービスを止めてからリクエストしてみたら、エラーの内容がブラウザに表示されてしまいまいた。
 当然、core.phpの'debug'は、「0」にしています。
 
 エラー時のStatck Traceと一緒にMysql.php内のDBへの接続情報(DB名、パスワードホスト名)つまり、database.phpの重要情報が表示されてしまいます。

 いろいろ調べて見た結果、core.phpの「Configure::write('Error', …」のlevelキーのE_ALLにチルダを付けてやることでtraceは出ないということがわかりました。

「この設定をしてもちゃんとerror.logには書かれるし、debug=2にした場合、ブラウザにも表示されるようなのでとりあえずは良しとします。」
(でもドキュメントを見ると、debug=0にしたときは、internal error になると書いてあるんだけど。てことは、errorのviewが表示されると思うんだけど…。違うのか?)


これは、levelキーに設定したエラーレベルの時にトレースに出力するという意味になるんでしょうか?

誰かお分かりの人がいましたら、アドバイスをお願いします。


変更前
  1. Configure::write('Error', array(
  2. 'handler' => 'ErrorHandler::handleError',
  3. 'level' => E_ALL & ~E_DEPRECATED,
  4. 'trace' => true
  5. ));

変更後
  1. Configure::write('Error', array(
  2. 'handler' => 'ErrorHandler::handleError',
  3. 'level' => ~E_ALL & ~E_DEPRECATED,
  4. 'trace' => true
  5. ));


2013年7月21日

CakePHPでファイルダウンロードの仕方のメモ



下のコードでCSVファイルのダウンロードができる

環境
CakePHPのバージョンは、2.3.6。
Web(AP)サーバー:IIS7.5


  1. $download_data = ここにCSVファイルのイメージを設定しておく。

  2. $this->viewClass = "Media";
  3. $this->autoRender = false;


  4. $filename = sprintf("CSVファイル_%s.csv", date("Ymd_His"));
  5. header("Pragma: public");
  6. header("Expires: 0");
  7. header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  8. header("Content-Type: application/force-download");
  9. header("Content-Type: application/octet-stream");
  10. header("Content-Type: application/download");
  11. header("Content-Disposition: attachment;filename=" . "\"".urlencode($filename)."\"" );
  12. header("Content-Transfer-Encoding: binary");

  13. $download_data = mb_convert_encoding($download_data, "SJIS-win", "UTF-8");
  14. echo $download_data;


3~4行目:おまじない。ページは返さないので。
7行目:ファイル名を決めています。
8~15行目:ダウンロードする為のヘッダ情報
14行目:ブラウザがIE(HTTP_USER_AGENT)の場合、ファイル名に日本語が含まれていると指定したファイル名にならないので、urlencodeする。
17行目:EXCELで開きたいCSVファイルなので、Shift-JISに変換する※1。
18行目:ブラウザに送る。

※1 別に、EXCELで外部データの取り込みでCSVファイルを読むんだったら、Shift-JISに変換する必要は無いんだが、普通の人は、ファイルをダブルクリックして開くので。そもそも一般人の中には、CSVファイルのことをエクセルファイルという人もいるし…。