読者です 読者をやめる 読者になる 読者になる

コモディティ化するエンジニア

組み込み系のSI屋から、Railsを扱うWeb系のベンチャーに転職した筆者が、日々ミジンコなりに情報を綴るブログ。

エンジニアの妻と結婚して良かったことと、気をつけていること

その他

本記事は、「妻・夫を愛してるITエンジニア Advent Calendar 2016」の16日目です。

www.adventar.org

惚気話をしていいAdvent Calendarなので、本記事ではエンジニアの妻と結婚して良かったことと、気をつけていることを書いていきたいと思います。

夫婦略歴

  • 夫婦ともに転職を経てのサーバーサイドエンジニア。新卒5年目
  • 出会いはソフトウェア工学の勉強会
  • 結婚して3年目に突入
  • 都内在住だが、お互い実家が遠い(妻:岐阜、夫:北海道)

良かったこと

生活や仕事に理解がある

これが一番大きいかなと思っています。
エンジニアとしての生活は、忙しい時期に波があったり、急な障害対応で遅くまで残らないといけなかったり、そもそも業務外で勉強しないとついていけない世界だったりと、傍目から見るとよくわからない世界です。
そんな生活を、深い説明なしに理解してくれ、時に支えてくれるのは、精神面で大変助けられるものです。
また、業界が一緒ですから、仕事についての相談を互いにすることができます。
今、どんな技術トレンドがあるのか、妻から情報を得られることも少なくありません。

自分の時間と、妻と一緒に過ごす時間を両立できる

休日に異性と出かけるとなると、「楽しいところに連れていかないと....」という脅迫観念が少なからずあると思うのですが、
少なくとも私の妻の場合、「今日は気分転換にコワーキングスペースでもくもく作業やろう!」というのが通じます。
これは「自分の時間を持ちたい」「なるべく妻と一緒の時間を作りたい」という相反する要求が同時に満たせるのですから、何ていうかオススメです。
でも、妻が本当に気分転換したい、と思っている時は、空気を読んで楽しいところに出かけましょう。

やる気スイッチがONされる機会が増える

やる気スイッチとは人それぞれなものですが、私の場合、誰かが近くで頑張っていると「自分も頑張ろう」とスイッチが入ります。
一方、私は本来、さぼることに対して自制の効かない人間なものですから、休日は一日中ごろごろして過ごす、というのが一人暮らし時代はしょっちゅうでした。
それが結婚して二人になると、妻が勉強しようとすると私が触発され、私が勉強しようとすると妻が触発されるという、やる気スイッチの押し合いがなされるようになりました。
もちろん、二人揃ってごろごろ過ごしていることもありますが、そこは逆らわずに休んだ方が良いのかなと思っています。

気をつけていること

できたことを褒める

これは私の妻限定の話かもしれませんが、褒めると喜び、何事に対しても良い結果を出してくれます。(技術的なことに限らず、家事なんかもそうです)
褒めることで妻が成長し、自分にまた良い刺激を与えてくれる。
そんな良い循環が築けているのではないかと思っています。

異性との接触(食事など)に寛容になる

この業界は男性社会ですので、誰かと情報交換しようとすると、その人が男性である、ということがほとんどです。
ですから、男性との接触は、情報交換をする場として必要なものと考えています。
それが彼女にとって必要なものであると信じていますので、異性と食事や飲み会に行くことを私が咎めることはありません。
こう書くと重たい感じに受け取られるかもしれませんが、実際はもっと軽い感じで「いってらっしゃい」としています。

親族との関係を大切にする

親元離れて周囲から理解されにくい生活をしているので、何も意識せずに過ごしていると「大丈夫だろうか?」と心配されることがあります。
(そもそも、もくもく作業デートとか言っている時点で、頭がおかしい)
なので、定期的に実家に帰る、電話をかけるなど、無用なところで心配をかけないような行動が大切だと思っています。
そうしておかないと、せっかくの里帰りの時、私生活について小言をたくさん言われて水を差されるかもしれません。

おわりに

惚気話になったような、なっていないような、よくわからない記事になってしまいましたが、私が言いたいのは「エンジニア夫婦はいいぞ」ということに尽きます。

f:id:muramurasan:20150922114204j:plain

私の妻に限らず、エンジニアは素直な性格の人が多いので、男女問わず、パートナーとしてオススメします。

妻・夫を愛してるITエンジニア Advent Calendar 2016。明日は、masanori_msl さんです。

RailsERDをラップして、yamlファイルに従ってER図を出力するgemを作ってみた

Ruby Rails gem

松村 Advent Calendar 2016 の15日目です。 @muramurasan です。

RailsERD

RailsERDという、出力したいModelをオプションで指定して、コマンドラインでER図を出力できるgemがあります。

github.com

Perfect Ruby On Rails という本でも紹介されているgemで、ささっとER図を出力するには非常に強力なgemです。

そんな RailsERD ですが、利用する上で欲しくなってきた機能がありました。
それが、「yamlファイルに記述したModelに従ってER図を出力する」という機能です。

RailsERD単体だと何が困るか

というのも、このRailsERD、毎回コマンドラインでModelを指定して出力するのですが、繰り返し出力することを考えると、手間を感じるのです。
書き捨てのER図ならば、コマンドラインでも良いんですが、実運用を考えると任意のモデル群の図を、複数枚出力したい、モデルが更新されるたびに......ということが想定できます。
例えば、「決済」「カート」「検索」など、ドメイン毎に図を出力したい、かつ、変更があればER図を出力し直したい......といった感じです。

そこで、RailsERDをラップして「yamlファイルに記述したModelに従ってER図を出力する」というgemを作成しました。

FreshERD

前段の説明通り、yamlファイルに記述したModelに従ってER図を出力する、というgemです。
コアの機能は本家RailsERDに依存しており、例えば、最新の rails-erd 1.5 を利用すれば、Railsプロジェクト以外にも適用できたりします。

github.com

前置きはこの辺で、使い方と、実際に使ってみた例を紹介します。

インストール

Gemfileに下記の記述を追加して、bundle install してください。

gem 'fresh_erd'

yamlの記述

Rails Tutorialのプロジェクトを例にyamlを記述してみます。

diagrams:
  tweet:
    - User
    - Micropost
  all:
    - User
    - Micropost
    - Relationship

tweetall の単位でER図が出力されることになります。
このファイルを適当な名前、例えば、fresh_erd.yml という名称で保存しておきます。

実際に使ってみた

以下のように、--inputオプションでyamlのパスを指定し、--outputオプションでER図を出力するフォルダを指定し、コマンドを叩きます。

$ bundle exec fresh_erd --input="fresh_erd.yml" --output="./"

以下が実行結果です。

--- Generate ERD : tweet
Loading application in 'sample_app_rails_4'...
Generating entity-relationship diagram for 4 models...
Diagram saved to './tweet.png'.
--- Generate ERD : all
Loading application in 'sample_app_rails_4'...
Generating entity-relationship diagram for 4 models...
Diagram saved to './all.png'.

以下のようなER図が取得できます。

f:id:muramurasan:20161126192547p:plain

f:id:muramurasan:20161126192553p:plain

以上です!

ちなみにgitのフックと連携して、最新のER図が常にpushされるように......とか妄想しましたが、
やりすぎ感あるのでこの辺に留めておきました。(FreshERDという名前は、この妄想が由来です)

緯度経度を入力値に、2地点間の距離を算出するgemを作ってみた(国土地理院提供APIを使用)

Ruby gem

松村 Advent Calendar 2016 の14日目です。 @muramurasan です。
タイトルの通り、gem作りの練習として「緯度経度を入力値に、2地点間の距離を算出するgem」を作ってみたので、その使い方を紹介させていただきたいと思います。
gemの名前は conncect_gsi_api という、一体何のgemなのかさっぱりわからないものになっています。(後悔)

github.com

インストール

Gemfile を使う場合は、下記の記述を追加して、bundle install してください。

gem 'connect_gsi_api'

手動でインストールして使う場合は、gem install connect_gsi_api を叩きましょう。

実際に使ってみた

インストールから、利用するところまで実際に紹介していきます。
まずはインストールをします。

$ gem install connect_gsi_api
Fetching: connect_gsi_api-0.1.0.gem (100%)
Successfully installed connect_gsi_api-0.1.0
Parsing documentation for connect_gsi_api-0.1.0
Installing ri documentation for connect_gsi_api-0.1.0
Done installing documentation for connect_gsi_api after 0 seconds
1 gem installed

次に、手っ取り早く使用感を確かめるために、irb を起動して使ってみます。

$ irb
irb(main):001:0> require "connect_gsi_api"
=> true
irb(main):002:0> ConnectGsiApi.distance2p 35.6581, 139.701742, 36.123456, 138.705749
=> 103682.866

こんな感じで、引数 出発地緯度出発地経度到着地緯度到着地経度 を渡して distance2pを呼び出すと、距離がメートルで返ってきます。
不正なパラメータを渡してしまったなど、エラーが起きている場合はnilが返ってくる仕様になっています。

なお、デバッグのため、コマンドにも対応しています。

$ bundle exec calcdist 35.6581 139.701742 36.123456 138.705749
103682.866

注意事項

あくまで、このgemは国土地理院提供のAPIを使用しているものですので、
APIの使用回数制限や、API側のインタフェース変更で、gemが使えなくなることが想定されます。
残念な仕様ではありますが、うまく値を取得できなかった場合は、nilを返すような仕様になっておりますので、
うまく利用者側でよしなにハンドリングしていただければと思います。

今年読んだ本の振り返り

Ruby 書籍

dodosoft Advent Calendar 2016 9日目です。 @muramurasan です。

www.adventar.org

dodosoftって何? という方は、内輪の勉強会ではあるんですが、こちらのエントリーをどうぞ。

okoysm.hatenablog.jp

タイトルの通り、本エントリーでは今年読んだ本の感想をつらつらと書きたいと思います。
どれも個人的にはオススメの本ばかりです。

リファクタリング:Rubyエディション

名著・リファクタリングRuby版です。
コード・設計の見通しを良くするためのテクニックの数々が紹介されています。
原著のリファクタリングが、オブジェクト指向でいかにして問題を解決するか、
といった、いわば設計面での改善テクニックが多く書かれているのに対し、
Ruby版では、コードベースでいかにして見通しをよくするか、ということが多く書かれている印象です。
Rubyならではのテクニックが数多く紹介されているので、原著読んだ人は更に本書も読むことをオススメします。
(別の本と言っても過言ではないかと)

リファクタリング:Rubyエディション

リファクタリング:Rubyエディション

エッセンシャル思考 最少の時間で成果を最大にする

昨年、嫌われる勇気という本を読むことで、精神衛生面の防護壁を培いました。
嫌われる勇気が、「自分のペースで良いさ」という心構えを説いた本なのに対し、
このエッセンシャル思考は、実際どうすれば仕事は早く終わるのか、面倒事に関わらなくて済むのか、
といった実践面のことを書かれている本です。
作中、「エッセンシャル思考じゃない人の例」がたくさん出てくるので、グサグサ心に刺さります(笑)
文量はそこそこあるんですが、読みやすいのでサクサク進められると思います。

エッセンシャル思考 最少の時間で成果を最大にする

エッセンシャル思考 最少の時間で成果を最大にする

メタプログラミングRuby

いわゆる、黒魔術メタプログラミングの本です。
......と思っていたのですが、単なる黒魔術の説明書じゃないんです。
Rubyという言語がいったいどういう風に動いているのか、
その内部深くまで踏み込んで説明してくれている、いわばRubyの理解を深める本なのです。
「黒魔術なんか扱うことはないから、読まなくていいや」と思っていた方は、
その考えを改めて、ぜひ、本書を手にとってみることをオススメします。一皮剥けます。まじで。
今年読んだ本の中で一番タメになった本でした。オススメ。

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版

ちなみにメタプログラミングRubyに影響を受けて作った、
「任意のメソッド呼び出しを監視する」というgem、okuribitoがこちら。

github.com

Effective Ruby

効果的なRubyプログラムを書くためのテクニックを紹介している本です。
が、まだこの本を読んで実践するだけの力がついていないなと、己の無力さを知ることとなりました。
正直、紹介されているテクニックの大部分については、使いどころがわからないんですよね。
それは、まだまだ書いているコードが幼稚であること、設計の選択肢が少ないことに他ならないと思います。
Rubyistとしてステップアップしたい方はぜひ、本書を手にとってみてください。

Effective Ruby

Effective Ruby

HTML5/CSS3 モダンコーディング

タイトル通り、HTML5、CSS3を用いた「今風」のコーディングスタイルを、
サンプルのウェブサイトを構築しながら学べる本です。
手を動かしながら学べるので、理解した気になって終わらないのが良いところかと。
また、作中に「昔はこんな辛みがあった、今はこうすれば大丈夫」という説明がまじえてあるので、
本当にこの本一冊で、今はどうすればいいのかを学べる印象です。

達人に学ぶDB設計 徹底指南書 - 初級者で終わりたくないあなたへ

DB周りの知識初級者から、中級者・上級者に引き上げてくれる本です。
確かに、Webアプリケーションを開発 / 保守 する上で、
最低限の知識だけで今まで戦ってきたんだな、というのを突きつけてくれました。
DB周りの知識を幅広く説明しており、論理設計のノウハウから、アンチパターン
物理設計の勘所、パフォーマンスチューニングのやり方まで......
嗚呼、これを知りたかった! ということがぎゅっ、と詰まって書かれている本です。
今年読んだ本のオススメ2番目ですかね......

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

大規模サービス技術入門

「1000台のシステムは、何が変わるのか?」という表題の通り、
サービスが大きくなっていった時に何を気にしなければならないのか?
データ構造、メモリ、OS、DB、サーバ/インフラ あらゆる要素について、
その勘所、テクニックを全編にわたって説明している本です。
が、残念ながら、書評を書いている現段階で、内容をあまり思い出せないことに気がつきました。
これは時間を置かずに、もう一度読まないといけないな、と思いました......

おわりに

この記事に取り組む前は「今年読んだ本全然無い......つらぽよ......」となっていたのですが、
いざ記事を書いてみると、意外と今年読んでいることに気がつきました。
こうして、これまでにやったことの棚卸をするのって大切ですね。

数学パズルでIQゴリラ並と判定を受けたミジンコがお世話になっているRubyの便利メソッドたち

Ruby プログラマ脳を鍛える数学パズル

dodosoft Advent Calendar 2016 6日目です。

www.adventar.org

dodosoftって何? という方は、こちらのエントリーをどうぞ。

okoysm.hatenablog.jp

目次

本日のお品書きはこちら。

自己紹介

Twitterではミジンコのアイコンで活動しています、@muramurasan です。
週末は dodosoft の輪読会に参加したり、デザイン思考の大学講義に出席したり、もくもくしたりしています。
普段はRuby On Railsを扱い、ECサイトのバックエンド部分を開発・保守しています。

本題

さて、本題です。 本記事では、ミジンコな私が、通称:数学パズル という本をRubyで解くのに、よくお世話になっている便利メソッドたちを紹介したいと思います。

プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問

プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問

ちなみにゴリラのIQは 70〜90 らしいです。意外と高いですね。

each_with_index

配列の中身をぐるぐる回しながら、インデックス(番号)を数え上げてくれます。
変数 i を定義して、インクリメントして......なんてコードを書かなくて済むので重宝します。

コード

array = ["Ruby", "On", "Rails"]
array.each_with_index { |item, i| puts "#{i}:#{item}" }

実行結果

0:Ruby
1:On
2:Rails

include?

配列の中に、指定の値が存在するかチェックしてくれるメソッドです。
配列ぐるぐる回して探索する......なんてコードを自分で書かなくてもいいわけですね。

コード

array = ["Ruby", "On", "Rails"]
puts array.include?("Rails")

実行結果

true

combination

配列から引数n個の要素を選んだときの組み合わせを数え上げてくれます。
地味に使いどころ少ないですが、組み合わせを数え上げる問題は瞬殺で解くことができます。

コード

# encoding: utf-8
array = ["生ハム", "メロン", "アイス", "キャンディー"]
array.combination(2) { |a, b| puts "#{a}#{b}" }

実行結果

生ハムメロン
生ハムアイス
生ハムキャンディー
メロンアイス
メロンキャンディー
アイスキャンディー

repeated_combination

配列から引数n個を選んだときの重複組み合わせを数え上げてくれます。
例えば、以下のような3食のメニューの組み合わせを吐かせたりすることができます。

コード

# encoding: utf-8
menu = ["和食", "洋食", "中華", "なし"]
menu.repeated_combination(3) {|a, b, c| puts "朝:#{a} 昼:#{b} 夕:#{c}" }

実行結果

朝:和食 昼:和食 夕:和食
朝:和食 昼:和食 夕:洋食
朝:和食 昼:和食 夕:中華
朝:和食 昼:和食 夕:なし
朝:和食 昼:洋食 夕:洋食
朝:和食 昼:洋食 夕:中華
朝:和食 昼:洋食 夕:なし
朝:和食 昼:中華 夕:中華
朝:和食 昼:中華 夕:なし
朝:和食 昼:なし 夕:なし
朝:洋食 昼:洋食 夕:洋食
朝:洋食 昼:洋食 夕:中華
朝:洋食 昼:洋食 夕:なし
朝:洋食 昼:中華 夕:中華
朝:洋食 昼:中華 夕:なし
朝:洋食 昼:なし 夕:なし
朝:中華 昼:中華 夕:中華
朝:中華 昼:中華 夕:なし
朝:中華 昼:なし 夕:なし
朝:なし 昼:なし 夕:なし

permutation

combinationと違い、こちらは配列から引数n個の要素を選んだときの順列を数え上げてくれます。

コード

# encoding: utf-8
array = ["", "", ""]
array.permutation(2) { |a, b| puts "#{a}#{b}" }

実行結果

あか
あお
かあ
かお
おあ
おか

発展

せっかく便利なメソッドなので、発展も紹介しておきます。
例えば、(都合の良い問題ですが)
「とある文字列から5文字選択した場合、回文はいくつ出来上がるか」 といった問題を瞬殺で解くことができます。

コード

STR = "APPLEPEN"
p STR.split("").permutation(5).map(&:join).select { |a| a == a.reverse }.uniq

実行結果

["PEAEP", "PEPEP", "PELEP", "PENEP", "EPAPE", "EPPPE", "EPLPE", "EPNPE"]

repeated_permutation なんてのもありますが、使ったことがないミジンコなので、割愛します。

product

これめちゃめちゃ使えます。
複数の配列を組み合わせて、その組み合わせを配列にして返してくれるというものです。
セットメニューを作り上げる例を見てみましょう。

コード

main  = ["ビーフ", "チキン"]
sub   = ["サラダ", "スープ"]
drink = ["コーヒー", "紅茶"]
main.product(sub, drink).each { |set| puts set.join(", ") }

実行結果

ビーフ, サラダ, コーヒー
ビーフ, サラダ, 紅茶
ビーフ, スープ, コーヒー
ビーフ, スープ, 紅茶
チキン, サラダ, コーヒー
チキン, サラダ, 紅茶
チキン, スープ, コーヒー
チキン, スープ, 紅茶

おわりに

書いてみると、半分以上がリファレンスのコピペになってしまいました。
ピックアップして紹介するのが目的の記事なので許してください......。

数学パズルは、dodosoftのメンバーと一緒に解くことがあるんですが、(みんな言語バラバラ)
Rubyは便利メソッドが多すぎるので、「卑怯だ!」と言われることがよくあります。いいんです。いーんです。
Rubyはいいぞ。」