このエントリーをはてなブックマークに追加

2016年12月2日金曜日

「実行の4つの規律」について考えてみた

こんにちは、Taroです。
私の中で、昨年のブックオブイヤーは「7つの習慣」でした。
(あの当時で今更感はありましたが。。。)
その「7つの習慣」を組織で実行するテーマの「4つの規律」という本が出たようなので、今回題材にしました。

そもそも4つの規律って?

  1. 最重要目標にフォーカスする
  2. 先行指標に基づいて行動する
  3. 行動を促すスコアボードをつける
  4. アカウンタビリティのリズムを生み出す
分かるような分からないような。。。
本に記載されている内容を一部引用しながら、例としてあげると、
  • あるプランニング会社が、今年度の売上を1億円から2億円にあげることを決めた。(最重要目標)
  • これを受けて、その目標を達成するためには、高いプランを選択してれる顧客を20 %増やす必要があった。(遅行指標)
  • 20 %増やすために、1人1人の目標として「高いプランを勧める営業を毎日2件行うこと」とに決めた。(先行指標)
  • 各人が見える場所に、目標と実績を分かりやすい図で掲示した。(スコアボード)
  • 毎週必ず1回、この件に関するMTGを行い、進捗と先行指標の修正を行った。(アカウンタビリティ)
遅行指標とは、先行指標を行った上での結果と書かれています。
例えば、車が故障する頻度を下げる、という目標は私たちでは関与できません。ただ、車を整備に出すことは私たちの意思で決めることができます。

じゃあ4つの規律でどんな組織を作りたいの?


本にはいろいろ記載がありましたが、私が考えるに、ボトムアップ型の組織だと思っています。
ある程度目標が明確になれば、主体的に考え、意見なども言うことができるようになるかと思います。
本の中で印象的であったのは、レガッタとラフティングの話です。
高度経済成長期のような変化が(今に比べて)乏しいときは、リーダーに合わせて漕ぐことが重要です。
ただ、現代のような、何が起こるかよく分からないような時代では、リーダーはいるにしろ、個々人で判断する機会が増えます。
組織的な動きは当然として、各々でも考えることができる組織を作りたいのかな、と思っています。

技術屋にとっての4つの規律

一概に技術屋といっても様々な職種が存在します。
今回は「製品、サービスを完成させ、納品すること」が業務上の目標である場合を想定します。

  • 最重要目標:自部署、自チームの売り上げアップ(期間と増加幅は省略)
  • 遅行指標:ある製品を納品すること
  • 先行指標:製品の工程を週単位で分割できるところまで落とし込み、その工程が終了したかどうかを指標とする
製品を納品することは、間違いなく売上に貢献できることだと思います。
とはいえ、これは結果なので、コミットできる先行指標が必要です。
これはあくまで私の考えですが、製品の工程を分割して、指標とすれば良いのかな、と思います。
1週間で2つの工程を完了させることを各々のコミットメントとし、スコアボードを作ります。
幸い、そのようなタスク管理系のアプリケーションはたくさんありますし、エクセルで簡単な図を作っても良いかもしれません。
そして、週1回のMTGで進捗報告、および案外手間がかかりそうな工程に関して共有、軌道修正を実施していきます。
あくまで私が考えた一例ですが、漫然といついつまでに完成させる。。。と考えるよりもメリハリがつくのではないかな、と思います。

4つの規律よりも7つの習慣?

4つの規律はどちらかというと管理職、マネジメント職の方向けの本という印象です。
組織の中にいかにルールを作るか、という感じですが、個人向けというと7つの習慣の方がしっくりくるかもしれません。

本の中でも、ビジネスパーソンは木である。根っこに人格(7つの習慣)があって、その上に組織の規律(4つの規律)という幹があり、スキルという葉っぱを茂らせているようです。
良い機会なので、7つの習慣も再読し、歯をみがくかのごとく、良い習慣を根付かせていきたいと思います。

2016年11月28日月曜日

RailsでERBからJavaScriptに変数の値を渡す方法

このエントリーはWeb開発初級者向けです。

JavaScriptでViewを動的に更新したい場合、Controllerで定義したインスタンス変数の値などをJavaScript側に渡したい場合があると思います。

数値や文字列の場合はhiddenフィールドなどに出力していますが、Hashの場合はそのまま出力してもJavaScript側で取得すると文字列になり、そのままでは使えません。

Hashを受け渡したい場合は、事前にHashを.to_jsonでJSON化し、JavaScript側でparseJSONしても良いのですが、
下記のようにカスタムデータ属性を使うと、そのままHashとしてアクセスできます。

変数
@test = { 'hoge' => 'huga', 'hogehoge' => 'hugahuga' }

ERB
<div id="hoge" data-hoge-id="<%= @test.to_json %>"></div>

JavaScript
var test = $('#hoge').data('hoge-id');

実行結果
test
Object {hoge: "huga", hogehoge: "hugahuga"}

「嫌われる勇気」=「他人はどうでもいい」ではない


今回の書籍は、2013年頃にかなり話題になっていたらしい(私は全く知りませんでした…)、「嫌われる勇気」です。
通して読んでみて感じたのは「とても有益な内容だけど、拾い読みやつまみ食いは危ない」でした。
少しでも本書に興味をお持ちの方は、途中を読み飛ばさず最後まで通読することをおすすめします。

というのも、文中にアドラー心理学のキーワードがいくつか出てきますが、分かりやすいスローガンや指針ではありません。
その言葉の意味するところを理解しないまま行動に移すと、むしろ痛い目を見るのでは…と思います。

例えば、本のタイトルである「嫌われる勇気」ですが、「他人なんてどうでもいいから嫌われても構わない」という論旨では全くありません。
対人関係を築く上で大切なのは「他者貢献」と「他者信頼」、そして「自己受容」だと説いています。
他にも「承認欲求は不要」と強くバッサリ切り捨てていたり、他者を評価してはいけないと言いつつ、
上で述べたように「他者貢献」が重要というのがアドラー心理学の肝です。

本書の文章は「青年」と「哲人」の会話形式で進み、青年が哲人にアドラー心理学の教えを請う形になっていて
青年は文中で何度も、哲人の言葉に矛盾があると噛み付いています。
この本をネタにした当日のドトール会でも、あれこれと肯定・否定の意見が出てきて、議論の題材としては良い本でした。
アドラー自身、「それまで生きてきた年数の半分」が、アドラー心理学の理解に必要だと言っていますし、
今後も折に触れて開けば、その都度発見がありそうな本です。

2016年11月27日日曜日

PHPer (PHPプログラマー)から Rubyist (Rubyプログラマー)へ

初めて投稿させていただきます。
よろしくお願いします。

今回とあることをきっかけに初めてRubyを勉強することになり、
その上本格的にRuby on Railsを触れる機会を頂くことができました。

これまで実戦で使っていた言語は基本的にPHPが中心だった私からすれば、
驚きだらけだったので下記のブログを参考にPHPとRubyとで比較をしてみました。

Rubyで使える配列関連のメソッドを学習した

まず先ほどのブログと同様に前提として以下のようなテーブルがあるとし、
[books]という連想配列にデータを取得したとして比較をしていきます。

id name price description
1 Rubyの本 1000 Rubyの本です。
2 JavaScriptの本 1000 JavaScriptの本です。
3 PHPの本 1000 PHPの本です。
4 HTMLの本 2000 HTMLの本です。
5 CSSの本 2000 CSSの本です。

1. IDのみを取得して配列にしたい


where句でin演算子を使用したいときなどによく使うと思います。


PHP

$ids = array();
foreach ($books as $book) {
 $ids[] = $book['id'];
}
# => [1, 2, 3, 4, 5]


Ruby

ids = books.map { | book | book.id }
# [1, 2, 3, 4, 5]
私は普段PHPではこのように書いていましたが、
 Rubyで書くとすごく単純にかけてしまうものだなと思いました。 

調べてみたところPHPでもこのような書き方があるそうです。

$ids = array_column($books, 'id');

このarray_columnですが、
第一引数に値を取り出したい多次元配列を、
第二引数に取り出したいカラムのkeyや名前を設定していますが、
第三引数値を設定すると、その値をkeyとして連想配列を生成してくれます。

例
$id_to_names = array_column($books, 'name', 'id');
# => [1 => "Rubyの本", 2 => "JavaScriptの本", 3 => "PHPの本"...]

こんな便利なものがあったなんて。。。
知らなかった。
  



2.特定の値でのグループ分け


参考にした記事ですごいと思ったのでPHPとの比較をしてみました。

PHP


  function group_by_price(array $books, $keyName) {
    $keys = array_column($books, $keyName);
    $books_group_by_price = array();
    foreach ($books as $book) {
      $books_group_by_price[$book[$keyName]][] = $book;
    }
      return $books_group_by_price;
  }
  $books_group_by_price = group_by_price($books, 'price');

Ruby

books_group_by_price = Books.all.group_by{ |book| book.p }
どちらも同様に下記のような出力結果になります。

  # [1000] =>
  #  [0] => ["id" => "1", "name" => "Rubyの本", "price" => "1000", "description" => "Rubyの本です。"],
  #  [1] => ["id" => "2", "name" => "JavaScriptの本", "price" => "1000", "description" => "JavaScriptの本です。"],
  #  [2] => ["id" => "3", "name" => "PHPの本", "price" => "1000", "description" => "PHPの本です。"]
  # [2000]=>
  #  [0] => ["id" => "4", "name" => "HTMLの本", "price" => "2000", "description" => "HTMLの本です。"],
  #  [1] => ["id" => "5", "name" => "CSSの本",  "price" => "2000", "description" => "CSSの本です。"]


こちらはもう全然変わってきますね。 PHPで書く場合ほかの書き方もあるのかもしれませんが、 Rubyではこのように1行で端的に書けてしまうんです。

3. その他個人的にここが良いと思ったことをいくつか


・変数名 先ほどまでも例として挙げているソースを見ていただいてもわかる通り、
PHPでは変数名の前に「 $ 」を付けますが、Rubyでは何も記載する必要はありません。
その他にも、PHPでは1行の最後には必ず「 ; (セミコロン)」を付けなければエラーとなりますが Rubyでは省略可能です

 このようにRubyでは省略可能なものが多く存在するという印象を強く受けました。
「省略可能 = 文字数が少なくなる = すっきりする = コードが見やすくなる」
といったメリットがあります。

連想配列やハッシュの書き方でもかなり変わってくると思います。



  ・文字列結合
どんなアプリやサイトを作っていてもかなりの確率で文字列結合をする場面はあると思います。
PHPにもRubyにもsprintfはありますがその他での記述方法を用いた場合かなり差が出るなと驚きました。
"「Rubyの本」の価格は1000円です。"と表示する例を挙げてみます。

PHP

echo('「'.$book['name'].'」の価格は'.$book['price'].'円です。');

Ruby

puts "「#{books.name}」の価格は#{books.price}円です。"

この例だけではあまりわからないかもしれませんが、
もう少し入り乱れてくるとPHPよりもRubyの方が見やすいのではないかと思いました。

全体的に見てもRubyで書くと比較的シンプルに書けるといった印象を受けました。
私自身PHPに関してもRubyに関しても未熟で知らないことばかりなので、
こんな書き方もあるぞ!とかこういった面ではPHPのほうが優れている!とかがあれば
コメントしていただければと思います。

 では、最後まで見て頂きありがとうございました。
 メントしていただければと思います。

2016年11月25日金曜日

Amazon RDS 一般クエリログとスロークエリログの削除

 こんにちは、Hiroです。Amazon RDSでのテーブルに保存されている「一般クエリログ」と「スロークエリログ」の削除方法について、簡単にまとめたいと思います。

 まず、RDSのデフォルトのDBパラメータでは、一般クエリログ、スロークエリログともにファイルにもテーブルにも保存されないようになっています。
 そこで、詳しくはAmazonのガイドページを見ていただければと思いますが、クエリログ関連の設定内容を転記させていただきます。
  • slow_query_log: スロークエリログを作成するには、1 に設定します。デフォルトは 0 です。
  • general_log: 一般ログを作成するには、1 に設定します。デフォルトは 0 です。
  • long_query_time: ファストクエリがスロークエリログに記録されないようにするために、ログに記録されるクエリの最短実行時間の値を秒単位で指定します。デフォルトは 10 秒で、最小値は 0 です。log_output = FILE の場合は、マイクロ秒の精度になるように、浮動小数点値を指定できます。log_output = TABLE の場合は、秒の精度になるように、整数値を指定する必要があります。実行時間が long_query_time の値を超えたクエリのみがログに記録されます。たとえば、long_query_time を 0.1 に設定すると、実行時間が 100 ミリ秒未満のすべてのクエリはログに記録されなくなります。
  • log_queries_not_using_indexes: インデックスを使用しないすべてのクエリをスロークエリログに記録するには、1 に設定します。デフォルトは 0 です。インデックスを使用しないクエリは、その実行時間が long_query_time パラメータの値未満であってもログに記録されます。
  • log_output option: log_output パラメータに指定できるオプションは、次のとおりです。
    • TABLE(デフォルト)– 一般クエリを mysql.general_log テーブルに、スロークエリを mysql.slow_log テーブルに書き込みます。
    • FILE – 一般クエリログとスロークエリログの両方をファイルシステムに書き込みます。ログファイルは 1 時間ごとにローテーションされます。
    • NONE – ログ記録を無効にします。
今回は、下記の設定した場合のケースでお話します。
  • slow_query_log: 1
  • general_log: 1
  • long_query_time: 1
  • log_queries_not_using_indexes: 0
  • log_output: TABLE
上記の設定をすると設定内容に記載の通り一般クエリログは「mysql.general_log」に、スロークエリログは「mysql.slow_log」に保存され、ある一定サイズや空き容量をもとにローテーションされます。
 このテーブルなのですが、RDSのユーザ権限ではDELETEすることができないため、Amazonから2つのストアドプロシージャが提供されています。
CALL mysql.rds_rotate_slow_log;
CALL mysql.rds_rotate_general_log;  

 1回の実行ではバックアップにログがローテーションされ、2 回目の実行で完全に削除されることになります。

Amazonの公式ガイドページ