2015年5月18日

MySQLのダンプとリストアコマンド

 MySQLのダンプとリストアコマンドを覚えられないのでメモっておく。

構造部とデータ部を分けてエクスポートします。
理由は後で追記しておきます。ちょっと検証が必要だったので。

データベースのエクスポート


>mysqldump -u hoge_user1 -p --no-data --skip-triggers hoge_db1 > hoge_db1_20150518_1000.dump

>mysqldump -u hoge_user1 -p --no-create-info --skip-triggers hoge_db1 > hoge_db1_data_20150518_1000.dump

データベースのインポート

>mysql -u hoge_user2 -p hoge_db2 < hoge_db1_20150518_1000.dump

>mysql -u hoge_user2 -p hoge_db2 < hoge_db1_data_20150518_1000.dump

トリガーを作成

トリガーがある場合は、全てのインポートが完了した後に、ソースから投入します。
ソートが無い場合は、もらってください。

2015年5月16日

Japan IT Week 春 2015行ってきた

 毎年の春の楽しみにしている「Japan IT Week 春」に行ってきました。
これに行かないと自分の春が始まりません(笑)

今、取引しているクライアントの課題を解決することを念頭に見てきました。
当然、次の仕事のネタになりそうなものも気にしているんですけどね。

帳票ソリューション

Webのシステムを作成している時に帳票をどうするかをよく検討するのですが、どんな開発ツールでも同じ方式で帳票(PDF等)を出力したいのですが、なかなかそういったものがありません。
デザインもGUIでわかりやすく設計したいですし。
帳票デザイナと印刷エンジンが開発ツールに依存しないものを探していました。
今だったら、Webサービスを使ったものを探していました。

SVF Cloud


 言わずと知れた帳票ソリューションを提供している会社(ウイングアーク)の展示です。
Webサービスを使った印刷は現在作成中らしいです(リリースは未定)
CybozuのKintoneやSalesforce用の印刷サービスはリリースしているそうです。
 汎用のWebサービスがまだないのだったら、SVFを使って自分でWebサービスを作るというのを考えました。
 一応、説明員をしていた人にライセンス的にはどうか聞いてみたら、そのあたりは、今は検討していないけどありだとは言っていました。
 SVF自体結構高額ですがちょっと汎用の印刷Webサービスを考えて見たいと思いました。

OPRO ARTS


 初めて聞いた会社(日本オプロ株式会社)でしたが、こちらもウイングアークのように老舗のようです。
ですが、クラウドでの帳票ソリューションは、こちらのほうが先行しているようです。
出力した帳票の管理、出力先のコントロール(PDFやFAX等)等のWebアプリケーション込のものや、最低限必要なエンジン部分のみなどいくつかありました。
自分がほしい物は、デザイナと印刷エンジンなのでOPRO Arts LiveとOPRO Arts Coreです。
Liveは帳票デザイン、Coreは印刷エンジンです。
年間12,000枚まで帳票作成が可能なようです。プレビューしても1枚と言っていました。

全文検索をしたいの

Kintone


 いろいろな部品を組み合わせることで簡単にWebアプリケーションを作成することができます。
 テンプレートもあるのですぐに必要なアプリケーションを短時間で作成でき、改造も簡単なようです。
 実は、現在のクライアントから開発中のシステムのデータ(RDMSで作ったデータベース)を全文検索したいんだけどどうなの?という依頼があってどうやってやればいいか考えていたところ内部のデータを全文検索できる機能があるというのがわかったのでそれが使えるのではないかと検討しています。
 開発中のデータをすべてKintoneに取り込むことで全文検索させ、そのデータのキーを含んだURLで開発中のシステムへリンクすることで全文検索が実現できるのではないかと考えたわけです。
 Kintoneには、RESTのAPIがあるのでもしかしたら実現できるかも知れません。
あとはパフォーマンスとクライアントが利用料金に対してOKを出すかどうかです。

請求書後払いをなんとかしたい

 掛売の金額を踏み倒されないようにするために、掛け売りはできるだけしないように指導しているようです。
 それでも必要な場合は、帝国データバンクで調べて掛け売りしてもOKかNGかを社長が判断しているそうです。

NP後払い(BtoB)


 NP後払いのBtoCがあるのは前から知っていたいのですが、BtoBのサービスもやったいるようです。
 1社に対しての補償金額が30万円というのはちょっと低いような気がするのですが(100万円までは相談に応じるとありましが)試しいやってみるのはいいかもです。
 手数料も3〜5%ということでしたのでそれほど高額なわけではないようです。
プランによって手数料は変動するようです。
 相手の与信チェックも30分程度ででき、98%くらいでOKなそうなので試さないては内容です。
 回収保証をしている会社はいくつかありますが、この会社をクライアントに紹介してみようかと思います。



 他にも棚卸しの工数を削減するためのソリューションもありましたが結構高額だったりするんですよね。
 RFIDを使ったものなのですが、棚卸しのデータを管理するためのツールと合わせて、RFID読み取りのハードウェアもセットで40万円とかありました。
 話を聞くと、RDIDリーダーとWebアプリケーションの間のミドルウェア(Windows CEらしい)も含んでいるそうです。そのミドルの部分だけだったらおいくら万円?と聞いてみたのですが答えはもらえませんでした。まぁ、そうでしょうねとは思いましたが(笑)


 今回は、二日間最初から最後まで個別の展示を見ていましたがネタとしてよいものが結構ありました。
 クライアント様向けのソリューションや自分が作って売るためのソリューションネタ(帳票とか)もありました。
次回は、秋に幕張メッセであるはずなので楽しみにしておきたいと思います。

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」なので何の問題もないのですが気持ち悪いので毎回変更しています。

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

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