2015年5月12日

電話料金を安くしたいということで。

 電話料金を安くしたいということでSkype電話を導入しました。
自分が使えるキャリアは今のところソフトバンクだけ(2台持ちなのに)なのでそこ宛だったら無料でかけることができるのですが、仕事してると相手は、固定電話だったり、ドコモだったりします。

 余り電話をかけることは無いのですが掛けるときは長電話になったりするのでできるだけ安い回線にしたかったのです。

 Skypeだと固定電話相手だと2.26円/分なので超安いのです(接続料は別途かかりますが)
PCの前だったらヘッドセットつけていれば耳も痛くならないし、キーボード打ちながらの作業もできます。便利!
 試しにSkypeクレジットを使ってやってみてます。

一応Skype番号も取ったのですが、相手の電話に番号を伝えることはできないようです。
日本と他の数か国がその対象になっています、残念。番号がでないと怪しまれる感じがしますが。

Sykpeでも携帯電話相手だと10円/分くらいかかります。
ドコモやauに掛けるときは、楽天電話経由で半額で掛けるようにしています。

で、まとめると

ソフトバンク宛の場合は、自分の携帯(ソフトバンク)で。→0円/分
ドコモ、au宛の場合は、楽天電話経由で自分の携帯で。→10円/分くらい。
固定電話宛は、Skype電話で。→2.26円/分くらい。

多分これで今年の電話料金は安くなるはず。

それと、Skypeの品質はとっても良いと思います。
ビデオ会議でGoogle Hangoutを使っているのですがもしかするとそれより良いかもしれません。

2015年4月27日

【備忘録】年齢を計算する素敵な計算式

 年齢を計算する超簡単なロジックです。  

echo (int) ((date('Ymd') - 19710608) / 10000);
// 43

参考サイト(というかそのまま)
生年月日から年齢を簡単に求める方法

2015年4月26日

【備忘録】CakePHPトランザクション処理の仕方

 CakePHPでトランザクション処理のトランザクション処理の書き方をわかりやすくするためのコンポーネントとかを書いたのに別のプロジェクトをやった時に中途半端にロジックを書いてちゃんと動かなかったので忘れないようにするために記録しておきます。

 共通部品化できているの使いまわせると思います。

 まず、アプリケーションを作る時どこでトランザクションを管理すべきかですが、やっぱりコントローラで管理するのが正しいと思っています。
 CakePHPの場合、DataSourceに対してトランザクションをかけるのですが、DataSourceはモデルが持っているので、イマイチなコーディングになっていまします。
 テーブルが1つの場合は、良いですが、複数のテーブルになった途端見た目がおかしなことになってしまいます。

テーブル1つの場合
トランザクションをかけたいテーブルが1つに明確なのでbeginの意味はわかりやすいです。
    $this->Table1->begin();

    $this->Table1->save($data);

    $this->Table1->commit();

テーブル2つの場合
Table1のbegin()を実行した時点でデータソースに対してトランザクションがかかるので、Table2もトランザクション対象になります。
でも、見た目、Table2はトランザクション対象にならない感じがします。
    $this->Table1->begin();

    $this->Table1->save($data1);
    $this->Table2->save($data2);  // ←トランザクション対象外に見える

    $this->Table1->commit();


じゃぁ、どうするか!

複数のテーブルにトランザクションをかける場合、明示的に使用するモデルを指定する方式をとります。
トランザクション用のコンポーネントとモデルにトランザクション用のメソッドの追加をします。

TransactionComponent.php
class TransactionComponent extends Component {
  /**
   * トランザクション開始
   *
   * @param array $models トランザクション処理するモデルを全て指定する
   */
  public function begin($models) {
    $this->models = $models;
    foreach ($models as $model) {
      $model->begin();
    }
  }

  /**
   * ロールバック
   */
  public function rollback() {

    foreach ($this->models as $model) {
      $model->rollback();
    }
  }

  /**
   * コミット
   */
  public function commit() {

    foreach ($this->models as $model) {
      $model->commit();
    }

  }
}
AppModel.php
モデルに対して、トランザクションの開始、commit、rollbackのメソッドを追加する。
class AppModel extends Component {
App::uses('Model', 'Model');
class AppModel extends Model {

  /**
  * トランザクション開始
  */
  public function begin() {
   $db = $this->getDataSource($this->useDbConfig);
    $db->begin();
  }

  /*
  * トランザクションコミット
  */
  public function commit() {
    $db = $this->getDataSource($this->useDbConfig);
    $db->commit();
  }

  /*
  * トランザクションロールバック
  */
  public function rollback() {
    $db = $this->getDataSource($this->useDbConfig);
    $db->rollback();
  }

}
HogeController.php
使うモデルを明示的に指定するので、わかりやすくなる
App::uses('Model', 'Model');
class HogeController extends AppController {

  public $uses = array("Table1", "Table2");
  public $components = array("Transaction");

  private function register($data) {

    try {
      $this->Transaction->begin(array("Table1", "Table2"));

      if(!$this->Table1->save($data)) {
        $this->rollback();
        return false;
      )

      if(!$this->Table2->save($data)) {
        $this->rollback();
        return false;
      )

      $this->commit();

      return true;

    }catch(Exception $e) {
      $this->rollback();
      return false;
    }

  }

}
これは、CakePHPを使い始めてDBのトランザクションはどうやって扱ったら良いかというのを調査していたらあるサイト(今もあると思いますが忘れました)で一つの解として紹介されていたもものです。  実際の所、ルールなので、複数テーブルにトランザクション処理をするときは、代表のテーブルに対してbegin、commit、rollbackをするということにすればいちいちこんなめんどくさいことをしなくても良いのですけどね。

2015年4月23日

新システムがリリースされました

 1年以上前から手がけていたシステムが本日プレリリースを迎えました。
と言っても社内システムなので世の中の人には関係ないのですけどね。

 本当は、去年の10月にリリースする目標でやっていたのですが、いろんな問題が紛失して今になってしまっています。

 で、何かとういうと、システム移行の過渡期なので旧システムと新システムが同時に運用されます。
 新しい伝票データは新システムで登録して、既に作成されているデータは旧システムで運用していきます。
 システムを使う現場の人はとても大変だと思いますが頑張って新しい方を使って頂きたいです。


 実は、システムを作った側も大変になります。

  • 課題が沢山残っているので随時対応
  • ステージング環境、プロダクション環境と開発環境の3環境を面倒見る必要がある。
  • ステージング、本番環境のリリースを間違わないようする。
    プログラムだけだったらいいんですが、データベースもあるのでいろいろと難儀

 開発環境以外は、AWSなのでこれを機械に開発環境もAWSに作ってしまおうかとちょっと考えてもいます。
 でも、お金が掛かるのがちょっと気になるんですが…。


 これをしながら別のシステム開発もしていくので頭の切り替えが大変です。
新システムのリリース後は何かと問い合わせがあると思いますが頑張っていこうかと。


 でも、これを期にリリースのためのツールや手順のパターン化などが整理できていくはずと思って、勉強期間としても捉えています。
 動けばOKではないのです。いろんなことがスムーズになって属人性の排除ができればよりグッドです。

2015年4月22日

Google+のイベントのタイムゾーン

 Google+のイベントをよく使うのですが、そのデフォルトのタイムゾーンが「日本の東京」ではなく、「東ティモール」になっているのがとても気になる。

 時間的には「+9:00」なので何の問題もないのですが気持ち悪いので毎回変更しています。

きっとどこかの設定が「東ティモール」になっているんでしょうね。

赤丸をしたところが問題のところ

AWSのコンソールが日本語化された

 AWS(Amazon Web Services)のコンソールが日本語化されました。
これで、これってなんだろう?ってのが短時間で解消されそうです。

でも、英語版を見慣れていたせいかなんかスッキリしない感じがします。


【AWS発表】AWS マネージメントコンソールの日本語対応

2015年4月18日

Gitを使う前にgit svnで練習がよいのかな?

 近い将来プログラムソースのバージョン管理をGitに切り替えていこうかと思っています。
 現在は、Subversionでやってます。
 いきなりGitってのも良いのですが、Gitを使ってSubversionのリポジトリを使うためのgit svnというのがあるというのを知りました。
 Subversionを捨てて、Gitに移行してもよいのですが慣れていないツールを使って振り回されて本来やりたいことができなくなると困るのでね。
 新しいプロジェクトが始まったら、Gitを本格的に使っていくことにしました。

で、git svnは。
やっていることは、以下の以下のとおりです。
準備

  1. Subversionのtrunkをコミット毎にローカルのgitリポジトリに取り込む。
    完了すると、ローカルのgitでバージョン管理ができるようになる。
運用
  1. プログラムソースを修正する。
  2. 修正したソースをステージングへ追加する。
  3. gitのリポジトリにコミットする。
    ↑ここまでが通常のGitの操作
  4. git svnでsubversion用のコミットをする
    git svn dcommitコマンドでSubversionのリポジトリにコミットする。
かるく動かしてみたらできたので行けそうです。

 これの何がいいかというと、Subversionの場合、リポジトリが見えてないとコミットできないので直したものがどんどんたまって、ポイント毎に戻りにくくなってしまいます。
 ですが、Gitであれば、ローカルのGitリポジトリに対してコミットをできるのでポイント毎に戻ることができるようになります。
 Subversionのリポジトリが見える環境では、Subversionを使って、つながってない時はgit svnを使ってローカルにコミットをためる。で、Subversionが見えるタイミングになったら、dcommitをしてSubversionにコミットです。

 これで、どこでもソース管理ができるという寸法です。いかがですか?

本当はGitを直接使うのが良いので早くGitに移りたいです。
OSも関係なく、コマンドラインでもさくさくと作業ができればプロっぽいですよね(笑)

Git svnの使い方サイトとか