2014年6月27日

プログラミングをするときに気をつけていること

 皆さんは、プログラミンをするときに、常に心がけていることはありますか?

コーディング規約に従う?
スケジュールに間に合うように作る?
同じロジックは、共通化するようにする?
ちょっと長いロジックには、コメントをつける?

まだまだ、いろいろ沢山あると思います。
確かに大切です。


あわせて、これをやると、全体の品質が上がっていくと思います。

それは、

 ある機能のコーディングをしている最中にバグやわかりにくいコーディングに気づいたりします。
 そしたら、当然今やっているコーディングもやるんですが、その気づいたプログラムも一緒に直していくんです。
 今作っている機能のスケジュールが遅れたりする可能性はありますが、全体としてのスケジュールは、良くなっていきます。
 品質も上がっていくと思います。

です。

 人のプログラムや、今コーディングしてるとこ以外触りたくないとか言わずにちょっと注意して、全体最適を考えながらやってみるといかがでしょうか?

 個別最適をやりすぎると、人の時間を奪うばかりか、全体として遅れがでる場合があります。

 気をつけてください。

もうひとつありあました。
プログラミングは、テスト環境を目指すと思いますが、実はそこを目指すと不十分です。
メンテナンスのことまで考えてプログラミングしてください。

動けばOKではないです。動くようにするのは当たり前です。完了基準ではありません。


Goto文は悪ではない!という話

 プログラミングをしていて急に思い出した話です。


Goto文とは、処理の流れを強制的に変更する為の命令
最近の言語にあるかどうかは調査してません。


Goto文は悪ではないと思っています。

 ただ、処理の流れを変える為に前に戻ったり、先に進んだりをやり過ぎると読めないプログラムになってしまうということです。
 簡単にいうと使わないですむんだったら、使わないほうがよい。悪用はするなということだと思います。

 自分が使うときはどういう時かというと、「深いループとかを一気に抜けたい時だけ」です。

 確かに、「プログラムやデータ構造が良くないから、そんなに深いループになるんだ」という議論はありますが、どうしても必要なときはあります。
 そういった時は、それぞれのループに抜ける為に何らかの条件(フラグ等)を付けて見通しがわるくなるんだったら、Gotoで一気に抜けます。
 そのほうが、良いと思います。


でも、新しくプログラムを作るときは、Goto文に頼らないプログラミングが良いですよね。

例えば、
 try~catchの例外捕捉の仕組みもGotoと同じ動きですよね。
 COBOL/Sという、ACOSという汎用機のCOBOLにも、LEAVEという構造を抜けるための命令がありました。これも同じです(何階層抜けるか数字で指定していたような気がします。)。


なので、できるだけGoto文を使用しなくても良いプログラミングを心がけましょう。

2014年6月22日

【備忘録】Cake PHPのセッションタイムアウトの設定

 Webアプリケーションは、リクエストすればセッションタイムアウトまでの時間が延長されると思っていたのに、今、開発中のやつは、何回かリクエストするとセッションが切れるという現象にあっていたので調べてみた。
 (いや、なにもしないで思った通りになるとは思っていないのですが、ちょっと後回しにしてただけです…。)


やりたいことは、下の2つですが、PHPだとガベージコレクションとの関係で、生きているセッションファイルも消されるようなので注意が必要なようです。


  1. ブラウザを開き直したら、再度ログイン要求があること
  2. ブラウザで送信したらセッションタイムアウトが延長されること


設定変更ファイル

  1. core.php

変更内容

  1. Configure::write('Session', array(
  2.   'defaults' => 'cake',
  3.   "timeout"=>60,                                 // 60分 (muinitues)
  4.   "cookie"=>"MY_COOKIE",
  5.   "autoRegenerate"=>true,
  6.   "ini"=>array(
  7.     "session.cookie_lifetime"=>0,             // ブラウザを閉じたらセッションを破棄
  8.     "session.gc_maxlifetime"=>86400,       // 1日 (seconds) 1days=86400
  9.   ),
  10. ));
重要ポイント


  • 5.クッキーを再作成する為の指定
  • 7.クッキーのライフタイム
    0にすると、ブラウザを閉じるとクッキーが削除されるのでセッションとの関連がなくなる。
  • 8.ガベージコレクションの時間指定。
    php.iniの設定をCakePHPで書き換えます。

ポイント

ライフタイムの関係を↓ようにするようにということでした。
クッキーのライフタイム<セッションタイムアウト時間<ガベージコレクション



コントローラのbeforeFilter関数でも以下のことをしたほうが良いようです。
ただ、時間の関係上、動作確認はしてないので、この記事を読んだ方は試してみてください。

  1. public function beforeFilter() {
  2.   parent::beforeFilter();
  3.   CakeSession::$requestCountdown = 1; // Cookie再作成 タイミング
  4. }

参考にした記事

CakePHPのセッションタイムアウトのしては、Session.timeoutだけではダメだった


これで、セッション時間のコントロールもお手のもの?

2014年6月17日

バージョン管理システムのコミットのときにみなさんは。

 プログラミングをしている時に大抵の方は、バージョン管理システム(Subversion, Git等)を使って開発をしていると思います。
 そもそも、使わないと怖くて、怖くてソースを触れないと思います(自分だけ?)
だっていつでも自分がコミットしたところに戻ったり、参照できたりするんですよ。

 で、ですよ。使い方というか、運用のちょっとしたことなんですけどね。
私は、こんなことに注意してコミットしてます。


  • 1つの塊(機能だったり、不具合だったりいろいろ)単位でコミットする。
    コミットは、関連ファイルを纏めてコミットする。
  • コミット前に変更したソースの差分を目で確認する。(ちょっとした自己レビュー)
  • 動作確認をする。
  • コンパイルして、コンパイルエラーが出ないことを確認する。
  • 誤って修正したファイルは、元に戻す(元の形に修正してコミットはしない)
  • コミットログを真面目に書く
    コミットログは、いろいろと議論はありますが、何を直したか(具体的なソースではない)の概要を書くのが良いと思います。
    新しく書いたロジックには、「◯◯を実装。」などで良いと思います。
どうですか?
ちょっと手間のように感じますが、これを習慣化するとプログラムの精度が上がったり、理解が深まったりします。
この一手間で、変なコミットをしてしまって周りに迷惑をかけるのを防げることまちがいなしです。


 かと言って、これは、基本ルールなので操作ミスなどで誤ってコミットしてしまうこともあるでしょう。こういうのは大目に見るようにしましょう。


 バージョン管理システムの理解が浅い人や意味が分かっていない人は、一種のバックアップシステム程度にしか思っていないようです。
 なので、「日次コミット」とか言いながら、コミットしている人もいます。

 新しく書くソース時点からも機能の一部のひとまとまりを書いたら少しずつコミットする習慣を付けてもよいと思います。
 コミットを何回もするのは悪ではないです(ですが、動作確認もせずにバックアップ先のつもりでのコミットは最悪です)。



 さぁ、みなさんもLet's Try!!

2014年6月14日

テーブル設計するときのツールはなに?

 皆さんは、テーブル設計する時にどんなツールを使っていますか?
EXCEL?Visio?

 テーブル設計するときは、テーブルレイアウトだけ作れれば良いわけではなく、少なくともER図も一緒に作っていかなければいろいろなことが整理できません。
 ER図とテーブルレイアウトは、ちゃんと一致していないと整合性をとるための無駄な作業も発生してしまいます。

テーブル設計をするためのツールは有料のもの、無料のものなどいろいろあります。


  • SI Object Browser ER
    いいんだけど、個人としては高いです。あと、他の人とデータを共有しようとすると、同じツールを買ってもららないとなので
  • ERMaster
    Eclipseのアドイン。無料でいいのですが、最近アップデートされていない感じが。
    ドメイン管理のところにくせがあるので、理解して使わないと大変なことが発生します。
    実際に使ってました。
  • A5:SQL Mk2
    無料のSQL開発ツール
  • Visio
    Microsoftの図書くツール


幾つか試したところで今使っているものを紹介(だけ)します。

A5:SQL Mk:2(高機能かつ軽量な汎用SQL開発ツール / ER図ツール / フリーソフト)


  • ER図
  • テーブル設計書作成
  • ACCESSのようなGUIを使ったSQLの作成
  • いろいろなデータベースへの接続
    MySQLの場合、SSHを使って接続ができるのでVPSとかにデータベースを作った場合、セキュリティを確保して接続ができる。
    phpMyAdminとかのインストールをしなくても良くなる。

まだ、他にも沢山の機能があります。


 新しく覚えるのがめんどくさいから使わないとか言わないで使ってみたらいいさ。


2014年6月11日

WindowsベースのNASの威力

 昔、昔買ったLinuxベースのNASの容量が少なくなってきたのでNASを「Windows Strage Server 2012 R2」で動いているものを買って運用してます。

 合わせて、クライアントOSもWindows8.1に移行して(今、その最中)まして、そのNASへのアクセススピードを確認してみました。

 やっぱり、Windows Server 2012 R2とWIndows8..1は、最高の組み合わせなので(そもそも、ファイル転送プロトコルがバージョンアップしているので)超、超高速です。
 ベンチマークをとれば数値的にわかりやすいんでしょうが、そんなことしなくても十分体感できます。
 ネットワークスピードは、1Gbpsです。

ほんとにローカルディスクにアクセスしてる感覚のスピードでした。
 プライベートではともかく、仕事でNASを使う人は、一考の余地はありますね。ファイルが共有できればOKなんって言ってる場合じゃないです。
 これだけスピードが速くなるんだったら、仕事の効率もはるかに上がるでしょう。

あとは、iSCSIを使ってみたいとも思います。


あっ、ちなみに、「I/Oデータ」のNAS(HDL-Z4WM8C2)にしました。