Tomorrow's Chance

社会人なりたてのエンジニア奮闘記

MysqlでトランザクションをサポートしてるエンジンでのUnsigned制約

仕事初めですがこんなことではまるとは・・・正月ボケでした。

 

参考サイト

http://d.hatena.ne.jp/do_aki/20131204/1386127677

 

とあるバグfixの関係でPHPで再計算してるところをひとまず一回一括でデータの不整合を修正しようということになったのですが、それ用にUpdate文を用意しようとしてunsigned制約のかかっているカラムに対する計算で「カラムAとカラムBの差が0以上の場合は〜」というようなアホなIF文を書いてですね。

 

ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in

 

当然のように怒られたわけです。で、試しにSELECTに置き換えてみても怒られる。上記の参考サイトではUPDATE文で検証されていますが、SELECT文でSETする値を取得させてみても同じエラーがでます。わざわざUnsigned制約をつけてるところに負数をいれようとするのがそもそもアレなんですが、どうやらInnoDB等のトランザクションをサポートするエンジンでは厳密に評価するようになったようです。

ドットインストール「ActiveRecord入門」

ドットインストールのActiveRecord入門をやってみた。

migrationを使わずcreate文やinsert文を別途用意する等レガシーではあるが、O/RマッパーとしてのActiveRecordの基本的な使い方はわかりやすかった。特に多様なSELECT文を発行する 「Find系メソッド」はfind_eachや他にも色々あるので積極的に掘っていきたいところ。

 

後はInsert文発行する前に、独自のValidateをお約束として挟めるのは便利だと思った。

参考サイト

http://dotinstall.com/lessons/basic_activerecord

一年前の記憶

エンジニアとして入社してから半年後にあるコンテンツの管理機能を作った事があるのですが、PHPで作っていたためちまちまメソッドを記述する必要があり今思うと効率が悪かったなあと感じる次第です。データの操作についてやりたい事等ほぼ決まっているのでDon't repeat yourselfの精神で設計の段階からよく考えて作っていれば相当工数削減できたのではないかとRakeのドキュメントを読みながら感じてました。

 

参考サイト

http://railsdoc.com/rake

http://www.rubylife.jp/rails/model/index10.html

「Railsドキュメント」を見ながら読み解く

ただ闇雲にRailsのコードを開いて読むよりも、ドキュメントを読みながら該当のソースコードを読み解いていった方が関数の使い方も含めて勉強になるという当たり前の事に気付きました。

 

http://railsdoc.com

Proc、yield、ブロック等

Rubyのコードを読む上でよく混乱しそうなもの。

公式のリファレンスといくつかまとめてる記事をメモ。

 

参考リンク

http://docs.ruby-lang.org/ja/1.9.3/class/Proc.html

http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2fcall.html

http://qiita.com/kidachi_/items/15cfee9ec66804c3afd2

http://jutememo.blogspot.jp/2008/07/ruby-proc.html

http://simanman.hatenablog.com/entry/2013/02/06/004309

 

特にPHPに置ける「&(参照渡し)」はRubyでは全く違うので注意しよう。。Rubyでは変数の置き換えを伴ったメソッドの呼び出し方は自己破壊メソッドの呼び出しですね。(末尾に「!」をつける)

謹賀新年

皆様、新年あけましておめでとうございます。

 

新年1発目のエントリですが、簡潔にやりたい事を記します。

 

他言語を学ぶ事で技術的な視野を広げる基礎を築く。

 今まではPHP+MySQLとサーバーを扱う関係で多少Bashを扱う程度でした。エンジニアとして直属の上長や周りの先輩を見て、技術に対する理解の浅さ、視野の狭さを実感しました。これらの知識不足によって、エンジニアでない方からの要望にうまくお答えできないことも多くなんとか打開したい思いを抱えています。まずは引き出しを増やすためにも、このブログを書き続ける事等も通じて何とか視野を広げたいと思います。

技術を用いてより広い要望を実現できるよう発想力を鍛える。

 これは主に仕事面での目標とも言えるのですが、今ある仕組みをなるべく活かしてバリエーションをどう増やすか?という思考法が求められる場合があります。企画側の人からすると別のシステムのように思えるものも、既存の仕組みを一部改修することで実現可能だったりします。そういった発想や代替案の提示は、上長にはできて自分にはできないので、技術と「やりたい事」を結びつける発想力を鍛えていければと思います。

 

本年もよろしくお願いいたします。

ActiveRecordsで発行されるSQLをトレースする。

年内最終更新です。といってもそもそもブログ開設してまだ2週間ですので締めくくりの記事ではなくいつも通りの更新です。

 

RoRにおけるDBの扱い

RoRの肝であるmigrationとActiveRecordsの機能についてソースを見たり技術ブログを漁ったりしています。わざわざ言う事でもないですが、全体としてSQLをご丁寧に記述しなくても各種メソッドの呼び出しを通じて扱う事で少ない記述量で様々な操作を可能であることは便利です。

 

パフォーマンス面の考慮

今年最も実感できたことですが、ソシャゲのように大量のリクエストを捌く必要のあるシステムは、一部でも「パフォーマンスの悪い作り」を残しただけでピークタイム時に悪影響が顕著にでてきます。夏に立ち上げたサービスでいくつか自分の担当した箇所においてパフォーマンスの配慮がしきれていなかった箇所が秋以降いくつか火を噴きまして、下半期はSQLチューニングに明け暮れていました。

 

SQLの監視は大事

チューニングをしていく上で初心に返る意味でも改めてアクション単位で発行されるSQLをつぶさに観察することにしました。これが結果的に負荷軽減にも貢献することができたので、RoRにも何かないのかなと探してみたところ下記のブログ記事が該当しました。

 

http://blog.mirakui.com/entry/20120429/1335702664

 

来年、最初に新たに手がけることになる案件でも自分の開発環境だけでもこのライブラリを導入してウォッチしていきたいと思います。

 

本年最後に

「はてなエンジニアブロガー祭り」に参加し、触発されたことで始めたこのブログですが、まだまだ技術ブログと言えるかも微妙な状況だと思います。職場以外での鍛錬を始めるきっかけにもなっていますので来年は公私ともに定着できるよう頑張っていきます。今後ともよろしくお願いします。

 

それでは、良いお年をお迎えください。