ラベル 初心者向け の投稿を表示しています。 すべての投稿を表示
ラベル 初心者向け の投稿を表示しています。 すべての投稿を表示

2017年4月28日

IE11はPromiseに対応していないだって?

JavaScriptで非同期処理の要のPromiseを使うアプリケーションをいろいろなブラウザに対応させるためちょっと調べました。
というか、Internet ExplorerやAndroidの標準ブラウザ(4.4以下?)は、Promiseに対応していないようです。

headタグ内に以下を記載しておくことで、Promiseに標準対応していないブラウザでも使うことができるようになります。

<script>window.Promise || document.write('<script src="//www.promisejs.org/polyfills/promise-7.0.4.min.js"><\/script>');</script>
<script>window.Promise || document.write('<script src="/js/promise-7.0.4.min.js"><\/script>');</script>
 
1行目は、CDNを使ってPromiseが使えるようにするスクリプトを読み込みます。
2行目は、CDNのサーバがダウンしている場合を考慮してPromiseが使えるようにするスクリプトを読み込みます。

どちらにも、「window.Promise ||」とありますが、グローバルオブジェクトにPromiseが定義されていない場合のみ、スクリプトを読み込むようにしています。
なので、Chromeなどモダンなブラウザの場合は、スクリプトを読み込むことなくNaitiveのPromiseを使用します。

よかった、よかった。これでどのブラウザでもPromiseが使用できます。

2017年4月8日

hostsの設定をミスる

 Webアプリケーションを作っているときに、IPアドレスでアクセスするのが嫌でhostsにドメイン名を定義して開発してます。

今回も設定してやってたんですが、Google Chrome57でアクセスするとなぜかレスポンスがとても悪くなってしまいました。
全然大きくもないアプリケーションなのに…。


デベロッパーツールのNetworkタブので見てみるとInitial Connectionが21.0sとかになっていました。
接続に時間がかかっていると…。

Apacheの何かの設定をミスったのでは無いかと、数時間調査したけど特段それらしいものも発見できず。

じゃ、Firefoxだったらどうか?
一瞬でレスポンスが返ってきました。

おかしい、ブラウザの問題か?
IE10でやってみてもそれほど遅くなくレスポンスが返ってくる。


もしかしてとpingを打ってみたら、思ったのと違うIPアドレスを返してきたのですよ。
「当然、要求がタイムアウトしました。」と宣ってます。

「がっくし…。」
はい、同じドメイン名に違うIPアドレスをふっていました。

アホな設定
192.168.33.13 app.example.com
192.168.33.12 app.example.com

でも、ブラウザによって使用する設定が違うってどういうことですかね?
ドメイン名の名前解決って通常DNSがやってくれるからブラウザ依存にはならないような気がするのですが…。

hostsファイルに書くときは、重複しないように書いてください。
こんなのに何時間も費やすのはアホ以外の何物でもありません。
(と自分に言い聞かせる)

2016年11月7日

仕事でLaravelを使ってますよ。

 LaravelはPHPのフレームワークで、最近人気が出てきているようです。

一番使っていたのは、CakePHP 2系なのですが、Laravelも手に馴染みそうです。
(CakePHP3も練習したいのですが…。)

何が一番いいかというと、教えてくれる人が居ることです。
新しい道具を使うときはやっぱり基準になる人がいると聞けるし楽ちんです。
後はプロジェクト内で足りないものを付け足していくたでだし。

 CakePHPや、JavaScriptで磨いた腕が発揮できそうです。

2016年10月20日

コミットログに。

 今、手伝っているプロジェクトでは、ソース管理にSubversionを使っています。
それはそれで全然問題ないないです。

問題点はそのSubversionにコミットしたときのコメントがすごい。


  • 「障害修正(10/18)」
  • 何も書いていない


まぁ、その組織の問題なのでなんか言ったところで変わらないと思うし、もう少しで終了なのでなにかをいうつもりもないんですけど。
とても、残念です。
でも、昔から知ってる人で昔々にそのあたりの話しはしたことがあるので言わなくてもいいかなとも思っています。

なぜかっ!
特に困っている様子もないので。

でも、自分のプロジェクトのときは厳しく対応はしてもらいますけどね。

2016年7月18日

当たり前なんだと思うが、ちょっと感動。Gitの話。

 ソース管理をGitに切り替えてから1年くらい経ちます。

メインブランチとそこから派生させたフィーチャーブランチで同時開発をしてました。

メインブランチにコミットしたら、フィーチャーブランチへのマージを真面目にやってました。

とうとうフィーチャーブランチをマージする時がやってきて、マージしてみるとコンフリクト無しでマージができました。
当たり前と、言えば当たり前ですが、感動モノです。
なぜなら、フィーチャブランチのコミット回数が534回(マージも含めてですが)もあるもんで。

メインブランチにマージした時に何かおきると思ってたのでちょっと感動してしまいました。

2016年7月16日

多分終わらないと思うよ、その作業。

 ある会社の若手の話です。

 ある作業は、直ぐに何か問題になるほど急いでいるわけではないけど、既に手を付けているがいつになっても終わりましたという報告が無い。

 急いでいないという(先輩の言葉)ことから、「自分の作業が空いた時にやっています。」という。
まだちょっと調べないとダメなところもあるらしいことも言っている。

 きっとですが、そのスタンスだとその作業は当分終わらないと思います。
空いた時っていつ?会社にいる間は全ての時間を自由使えるの?他人からの依頼作業とかないの?

 仕事や作業への向き方ですが、終わらせるという意識がない限り終わることは無いです。
やらない理由、終わらない理由は無限にあるのでね。

ちょっとくらい残業してでも、終わらせるという気概がほしいと思いました。

他の会社の人のことなのであーだ、こーだとあまり言いたくないですが、言いたくてうずうずしてます。
そんな教育じみた事は自分の仕事外のことなので言わないほうが良いのですが、自分の価値を上げるためには言ったほうがいいんだろうなーとちょっとは思ったりします。


まぁ、頑張ってね。

2016年7月13日

若手だからしょうがないでは片付けたくないこと

 作っているシステムである機能を実現するために、ライブラリを探してきました。
それをシステムのライブラリとして使おうとしたときに、なんか使えなかったようです。

まぁ、そこまでは全然問題ないんですけどね。
聞き方が気に入らないということですよ。


ライブラリを使って見たんですけど動きません。
◯◯で、ライブラリを読み出す記述をしたけど問題ないですか?

心の声
しらねーって。
何が問題かを調べれば?
調べるとこなんて山程あると思うけどね。


これだから若手はっ(怒)とは言いませんが、あまりにも答えを聞きたがるのが気に入りません。
多分自分のやったことに対しての自信があるけど、なんだか上手くいかない。というのが本音では無いでしょうか?


で、わたくし、(知ってても)簡単に答えは教えません。
というか、自分も調べないとならないだけなので代わりに調べてあげるほと暇ではないのでね。
なんでも、答えを持っていると思ったら大間違い。
確かに、あなたさまよりも引き出しはあると思うけどね。
それも、答えの引き出しではなく考える為の引き出し。


もう一つ。
これは賛否両論あると思うけど。

Slackでやり取りしながら作業を進めてるんですが、
「今、こういう状況で〇〇で困っています。エラーはこんなのが出ていますが調査中です。」
という文面に合わせてエラー内容を投稿したり、どこかのサイトのURLを投稿するのはいいのですが、ただ、エラーの内容を投稿したり、サイトのURLを投稿しているのをみると何をしてほしいのかさっぱりわかりません。
現状を報告をしているのか、調査してほしいのか?

自分のコミュニケーション能力が高いとかは全然思わないけど、なんなのかわからない投稿は山手ほしいととっても思います。

まぁ、こういうときは見て見ぬふりですけどね。

2016年7月7日

公開されている場所のファイル名の付け方とかに思うこと

 ファイル名に「最新」と「日付」とかのサフィックスをつけて管理するのはどれが本当の最新がわからなくなってしまうから、やめようよというのはだいぶ昔から言われてるけど、いっつもそんなのを見かける。

 そんなサフィックスは書いた本人はその時わかっているだけで他の人はおろか何日後かの自分もどれがカレントなのかすらわからなくなる。

なので、提案です(というかそうしなさいよ)。

カレントの文書は、「何も付けない」!!

というルールでどうでしょう。

シンプルだし、例えばそのファイルにのショートカットを作っておけば、自分が見たいだけのファイルのソートカットを作って「自分が関連するフォルダ」なるものに貯めておけば「探す無駄」が省けて仕事も効率化しますよね。


そういえば、何年か前あるソフト会社(大手)に出向していた時に、この問題があって、この提案をしたら、日付のサフィックスを付けたファイルに対してショートカットを付けてる人を見かけたな。
まぁ、何のためにそれをしたのかをご理解いただけなかったのが問題ですが今となってはいい思い出です。


ホント、最新とか、日付とかのサフィックスが付いているファイルを公の場に置いてあるのを見るとイラつく。

ファイルのバージョン管理ツールを使ってやる方法はちょっと置いといて。
別の問題もあるので。

2016年4月21日

Oracleでエラーが出たから教えてほしいといわれ

 もうちょっと(いや、もっと!)、調べることを覚えたらどう?

 VB.NETのアプリケーションでストアドプロシージャを呼び出したらあるエラーが出ているようです。
なんかすごく奥が深い話でヒントがほしいのかと思ったら、返却されているエラーコードは何を意味するものかすら調べないで答えだけほしかったようです。

 「まずは、エラーコードが何を意味するのから調べてください」と言ったら、Google検索でOracleのエラーコード検索しました。
 まぁ、エラーコードの意味を知るためには、これが一番手っ取り早い探し方だと思うので良いと思います。

 で、検索結果をさーっとみて、適当なリンクをクリックして中をチラ見してました。
「なんかよくわからない」と発しましたよ。

「はぁ…、まずは、エラーコードが何を意味するかを調べてから、解決方法を探ればいいんじゃないですか?」と答えたあげましたよ。

何なんだろ?自分が何を探しているのかわからない状態で答えだけを求めようとする姿勢にちょっと腹がたちました(自分の中で)。

 エラーコード見たら、「更新できないビューを更新しようとしている」というものででしたので、ストアドプロシージャを見てみたらどうですか?とこれで終わりです。
 ストアドプロシージャを見てみたら、サマっているビューを更新していたそうです(Oracleの環境を作るのをミスっていただけ)


 もう、超ベテランなんだから答えだけ聞きたがるんじゃなくてもうちょっと、何が問題かを考える力を付けてほしいものですよっ。
 超若手だったらどういう手順で調べていくのかはちゃんと教えますけどね。


まずは、エラーコードの意味を把握してから調べましょうね。

2016年3月5日

仕事用の道具を晒してみる(2016年3月)

開発ツールを晒してみます。
現時点では、Webを使ったシステムが主になっています。
オープンソースのツールだったり、無料のものだったりが主です。
いつでもMSの世界にもどっても良いようにMSDNサブスクリプションも契約し続けてるんですけどね。
いざっ。

クライアントOS

  • Windows10 Enterprise
  • Linux Mint(たまに練習の為に。Windowsだと開発環境を作るのが面倒な時があるので)

テキストエディタ

  • Atom(プログラムソースはここで書くことにしています。ほとんどLL言語なんで)
  • Notepad++

開発言語

  • PHP(CakePHP)
  • JavaScript
  • Less(CSS)

データベース関連

  • MySQL(特に希望がなければこれ一本)
  • A5:SQL Mk-2(SQL発行したり、ER図をかいたりしてます。)

サーバーOS

  • CentOS

仮想マシン

  • XenServer(ずっと動かしているものはここで動作しています。MySQLとか)
  • Vagrant(開発中のアプリケーションはここ上でCentOSを起動させて動作確認。これ使ってないと効率は激下がり)

クラウドサービス(開発)

  • Amazone Web Service
  • Google Cloud Platform(まだ練習状態)
  • Google Apps for Work(メール(Gmail)どかストレージ(GoogleDrive)とか便利。これに寄せてます)
  • Evernote(無料版。いろんな手順書とかをここに記録しています)
  • bitbucket(ソース管理にGitの無料リポジトリを使ってます。さよならSubversion)
  • Cacoo(画面イメージを書いたりお絵かきをするときに便利)
  • prott(スマートフォンやタブレットの画面イメージや遷移をデザインするのに使う予定です)

クラウドサービス(事務系)

  • freee(会計はこれでっ。今年は、Freeeで確定申告できました。口座を自動的に同期してくれるので物ぐさ便利)
  • misoca(お客さんへの請求書はこれでやってます。楽ちん。freeeとも連携)

コミュニケーション
  • Skype(携帯以外に電話をかけるときには、安い安い電話を使ってます。)
  • Google Hungout(お客さんと打ち合わせをするときはこれを使ってます。ドキュメントの共有がしたくてこれです。最近Skypeでもできるようです。)




つらつらと書いてみましたが、大して使って無いですね。
開発言語は他にも使えるんですが今やっているプロジェクトがたまたまPHPってだけです。
最近は、Go言語や、Google App Engine(GAE)にも興味が出てきています。
GAEだったら、アプリケーション・サーバーを安上がりにできそうです。


これからは、Macを使う比率も上がりそうなのでそっちの練習もしようと思っています。Mac miniを持っているんですがあまり使ってないんです(iOSのアプリを開発がしたくて買ったんですがあまり電源入ってないです)

2016年2月20日

やっとソース管理がまともになりそう

 Bitbucketを使ってソース管理をしていますが、そのリポジトリの管理がやっとチーム配下に移すことがきまりました。
 今まで、個人のアカウント下のリポジトリを使って開発をしてましたが、プロパーの人がなかなか何もしてくれなくてそのままになっていました。
 言っても問題視をしない(または、忘れている)のでほっておいて困ったら「ほら、こうなりますよね」と言おうと思っていたのですが、やっとプロパーの中で今までの開発のやり方、管理の仕方には問題があるのではないかと言う人が出てきたのでちょっと変化が起きました。

何が問題かというと以下のことが考えられます。

  • 当事者意識がない
  • 現時点では困っていない
  • 自分の気にしないとならない作業が増えむのが困る
  • 自分に責任が来るかもしれないので判断したくない。
個人としてはわります。
日々こなさないとならないタスクが多くあるのに自分が直接やらない作業まで面倒を見たくない。ということです。



しかしですね。
 会社内では、絶対にチームでの作業になるので管理をするという人は、全体最適の意識で行動しないといつまでたっても変わりません。

 どこでも言われてますが、発案者=担当者(責任者)になるということをやめないかぎり変化は起きないと思いますよ。
 新しいアイディアがでたら、担当者を決める(同じ人になる場合もあると思いますが)にしないと言ったもん負けみたいな現象が起きてしまいます。



今、楽かどうかよりも先が楽になるようにしていけばどんどん楽になっていくはずです。

2016年2月10日

Subversionと違って、Gitの何が気持ちいいかというと

 なんといっても、コミットを一つにまとめることができる機能は最高です。

一つの大きなテーマ(課題)の対応をしている時に、その中でのまとまり毎に小さくコミットして行きます。
で、最後に一つのテーマのコミットに纏めることができるのでコミットが多くなりすぎてカッコ悪いことにならない。

本来は、それぞれのコミットを独立させておいたほうが判りやすいのだと思いますが、修正箇所が思いの外、広範囲に渡っていた場合など、少しずつコミットして最後にまとめたほうが見栄えが良いのです。
失敗しても少しずつコミットしてれば戻れるし。


Gitバンザイッ。

2015年11月19日

セミナーってそういう認識なんですよね

 先日、東京の某所でITのサービスのセミナーを受けてきました。
無料なんですが、中の人も出てきて話していたのでとても有意義でした。

 その時に、前の会社の元上司から電話が来て「今、東京なんですよー」って言ったら「遊びか?」って言われたんで「いや、セミナーに参加しにきてます」って言ったら、「なんだ、やっぱり遊びか」と言われました。

 うーん、セミナーと言うのはそういう認識なんですね。
内容も聞かずにそういう判断をするということは、自分が所属している会社でも何かのセミナーに出席するときは、仕事の息抜き程度にしか考えていないんでしょうね。
あと、自分の会社で何かのセミナーを開催するときもその程度で考えているのでしょうかね?
大丈夫か?って思ってしまいます。他人事ながら。

思い出すといろんなことをいう上司が居ました。

  • 楽しく仕事をしていると遊んでいると思う人
    仕事はつまらなくて辛いものという考えなんでしょう。
  • 趣味的なものだったら稟議は通さない(必要だから稟議書いてるんですが…)
    なんの稟議だったかはもう既に忘れてしまいましたが。
  • 給料もらいながら勉強できていいなー。
    いやいや、それをただの作業にしてしまうか、覚えて次に活かそうとするとはその人次第なんだけど。
  • 周りの人が技術的なことはあいつに聞けになっている人に対して答えられないとこを捕まえて勝ち誇る人
    技術的なことはなんでも分かると自分で言っているんだったらそうだけど周りがそう言ってるだけなんですけどね。
  • セミナーの感想を聞かれて良くなかったというと、「まぁ、息抜きさせようと思って行かせた」とかいう人
    結局、セミナーを開くんだけど出席者居ませんかというのを会社の付き合いで行かされただけみたいでした。それもセミナーの体をなしてなかった。参加者は自分ひとりだけだったし…。

自分の面子とか、主観で組織を動かすとよくないよ。
話はズレズレでした…。


2015年11月17日

その資料後に役に立ちますか?

 ある取引先でのことですが。

プロジェクトがトラブっている原因としてレビューがされていないとかという問題が上がったのだと思うのですが、レビュー記録表のフォーマットが社内で公開されているようです。

 レビュー記録票は大切だと思います。
作成したものの問題点を記録してその問題が解消されたかを管理し、後工程に課題を残さないようにする。
ある程度の規模のプロジェクトでは必須でしょう。(レビュー記録票というより、レビューがですが)

 で、今回問題かもしれないと思ったのが、レビュー記録表を何で作成して管理して将来どう役に立てるかです。

 この会社は今までのやり方を変えてもっと先進的に作業をしたいという社長の意向があるのですがなかなかうまくいっていないようです。
 「学習時間がない」とか「学習コストが高い」という言葉をよく耳にします。

新しい何かを始めようとしたら学習時間がかかるのは当たり前であり、0にすることはできません。
(生まれつき持っている技能だったら別ですが…。)
それを理由に昔ながらの手法でやってしまいます。

 よく悪の手法と思われるエクセル方眼紙の管理表です。
フォーマットを見ると昔々使われていた紙ベースのものをそのままエクセルに媒体変換したものです。
例えば、再レビューの要、不要を選択するところは、

 【再レビュー 要 ・ 不要】

という風になっていていずれかに「○」の記号を付けたりするのしょう。

この時点で、レビュー記録からのデータ集約ができなくなってしまいます。

 たぶん、担当の方たちは、レビュー記録が大切だ、記録するためのフォーマットはどこかにないか、新しく作成する時間が無い、無いよりあったほうが良いの頭になっているのでしょう。

 思うのは、レビュー記録はあるのが前提(作るのか、探し出すのかはどちらでもよい)であり、そのレビュー記録をどう使って、未来にどう生かしたいのかという考えが欠落しているしているのでないかということです。

 例えば、必要な情報を簡単に検索ができる、どんな指摘が多いのかの分類ができるとか後に役に立つ記録も同時にできるというのが大切だと思っています。


 エクセルでも良いのですが、後に役に立つような仕掛けを入れつつ使えるものを準備してほしいものです。
 きっと上司なる人たちは、その集約結果がほしいとか言い出すのは目に見えているので。
自分の組織はどこが弱いのかをあぶりだして改善するために使うと思います。
レビュー結果を記録して修正するだけのものにしたらもったいないです。組織を改善するチャンスを失っているかもしれません。


極論をいうとツールなんてなんでもいいのです。以下のことが解消できていれば。

  • 実際に使っている人が面倒でないこと
  • 集約したデータを将来役立てるために使えること
  • それほど高額でないこと
  • 学習コストがそれほど高くないこと



2015年7月3日

JavaScriptで全角カタカナの配列をソートしたい(サクではない)


 JavaScriptのsortメソッドは、アルファベット順で並び替えるのに全角カタカナの場合はちゃんと並び替えてくれません。
そこで、sortメソッドに並び替えのルールを指定します。


例題)
ア~オのランダムにならんだ配列のカタカナを昇順に並び替えます。
カタカナをそのまま比較するとちゃんと並ばないので、encodeURIまたは、encodeURIComponentでエンコードして大小を比較します。
今回は、カタカナだけなのでどちらでも良いです。
var sorting = function(f, t) {

  var f1 = encodeURIComponent(f);
  var t1 = encodeURIComponent(t);

  if(f1 > t1) {
    return 1;
  }else if(f1 < t1) {
    return -1;
  }else {
    return 0;
  }

}


var ar = ["オ", "イ", "ア", "ウ", "エ"];

console.log(ar);   // ソート前

ar.sort(sorting);

console.log(ar);   // ソート後


// 結果(nodejsを使って実行したのですが、文字化けしています)
[ '・スI', '・スC', '・スA', '・スE', '・スG' ]
[ '・スA', '・スC', '・スE', '・スG', '・スI' ]
↓変換された文字を見てカタカナに置き換えるとちゃんとソートされています。
["オ", "イ", "ア", "ウ", "エ"]
["ア", "イ", "ウ", "エ", "オ"]

2015年6月9日

atom(テキストエディタ)が使える様になってきた

 以前、使うと宣言して画面分割してそのペインがマウスでサイズ変更できないということで使っていませんでいした。

 最近、そういえば、atomはどうなったかな?と思い、使ってみたら、画面分割したペインはちゃんとマウスでサイズ変更できるようになっていました。

 合わせて、以下のことができるか改めて確認したところ思った通りに動作するようになっていたのでとりあえずVisualStudioから開放されそうです。


  • LESS→CSS(minify化も)
  • JavaScript→minify化

実は、たったこれだけです。
他にも有用なプラグインもありますが、これから本当に必要な物と設定をまとめていつでも同じ環境が作れるようにしようと思っています。

仕事がらproject-managerが無いと仕事の効率が上がりません。
これは、ディレクトリをまとめて管理してくれる為のプラグインです。
プロジェクトとして登録しておくことで、簡単に自分が使うディレクトリの構成をTreeに出してくれます。


あとは、以下の機能を変更できればいいかなと思っています(ホントはほかに沢山ありますけどね。)。
  • Ctrl+H
    バックスペースキー
  • Ctrl+M
    エンターキー
  • Ctril+I
    タブキー


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年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ではないのです。いろんなことがスムーズになって属人性の排除ができればよりグッドです。