はじめに

これは 【その2】ドリコム Advent Calendar 2015 2日目の記事です

1日目の記事はarihhさんの「カンバンの管理に改善を加えたら加速した話 - arihhのブログ」です

【その1】ドリコム Advent Calendar 2015 - Adventar もあります!

めっちゃブログ書くのが久しぶりで、このブログの更新の仕方を忘れてたりしました。

あと、モンハンやりたい。モンハンやりたい、モンハンやりたい

※エンジニア向けの記事です

本題 - 「Rubyで可逆暗号-その情報を知りたくない僕らは」

生データとして扱いたくない情報を難読化する話をします!

※エンジニア向けの記事です

(エンジニアの自分が)生データとして扱いたくない情報

  • 何かのアカウント(ID/PW)
  • 自分のものじゃない秘密鍵
  • ユニークなギフトコード
  • etc…

などなど。思い当たるものはないでしょうか?


最近、ドリコムではAWSの活用事例が増えてきました。

AWSを便利に活用させていただいているのですが、必然的にアクセスキーやシークレットキーを取り扱う必要がでてきます。

アクセスキーとシークレットキーが漏れたりすると何が起こるかわかりません。

情報漏えいはシステムよりも人間が原因になることのほうが多いと教わってきたので

個人的には知らなくてよければ知らないまま過ごしたい情報です。

なので、少しでも心を穏やかにするために、生のデータを扱うの避けて、一工夫して運用しています。

Rubyで可逆暗号

ActiveSupport::MessageEncryptor

みんなだいすきActiveSupport

それ、ActiveSupport::MessageEncryptorでできるよ!!

Railsで簡単可逆暗号(ActiveSupport::MessageEncryptor)

1
2
3
4
5
6
7
secret = SecureRandom::hex(128)
#=> "13f3bab71cc735eea473e8fd225bb04232d23eadf194bd066179e09871fdf9244b454c38ebd6715e03b903d595b8ac5d75488dff2d9d48f3d2eb5e9a026ebbb4ef799e9596376f63a49640e9336f9b011fa8972a763a6d1fe13b5d4d096a34cdeba91636c86b70e9a88fab56f2a4f6b19eee801ac0d1e3415bb17b8f92f0133b"
encryptor = ::ActiveSupport::MessageEncryptor.new(secret, cipher: 'aes-256-cbc')
encrypt_message = encryptor.encrypt_and_sign("target_message")
#=> "QjlkVndyeERrV3BUcW1paVVkTDJQTWhzV3R5OEV3N3JsR2FnV0VxRjdCTT0tLUJFSmdLTUNFbHdmZHhWcjZUQllUR0E9PQ==--6f6d897b52cfad56d9a31f8a19d44481e5343f18"
encryptor.decrypt_and_verify(encrypt_message) == "target_message"
#=> true

便利ですね。 これだけだと芸がないので、ドリコムでの事例を紹介します!

ReversibleCryptography

reversible_cryptography

という自作gemを使ってます。

READMEより

1
2
3
4
5
secret = "password"
encrypted_message = ReversibleCryptography::Message.encrypt("target_message", secret)
#=> "md5:388eeae24576572f946e9043a2118b2d:salt:161-225-182-109-143-90-1-28:aes-256-cfb:DHY6DF3+iFzH36FMbeI="
ReversibleCryptography::Message.decrypt(encrypted_message, secret) == "target_message"
#=> true

簡単ですね。

  • ※上記例とは暗号化方式等,諸々違うため堅牢度合いは違います
  • ※暗号化するものが簡単な英単語だったりする場合,MD5から逆引きされる可能性があります
  • ※パスワードの強度は高いものを利用しています

もう一工夫

Railsに限った話ではないですがアプリでの利用方法も記載します

各種設定はyamlファイルに記載することが多く、 このようにYAMLのプライベートタイプを追加し環境変数を利用するようにしています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class ReversibleEncryptedString < BasicObject
  def initialize(str)
    @str = str
  end

  def decrypted_string
    @raw ||= ::ReversibleCryptography::Message.decrypt(@str, ::ENV["REVERSIBLE_CRYPTOGRAPY_SECRET"])
  end

  alias_method :to_s, :decrypted_string

  def method_missing(method, *args)
    decrypted_string.__send__(method, *args)
  end
end

YAML.add_private_type("Encrypted") do |_type, val|
  ReversibleEncryptedString.new(val)
end
1
2
3
4
aws:
  endpoint: "ec2.ap-northeast-1.amazonaws.com"
  access_key_id: !x-private:Encrypted "md5:109a42207275ce753e4923575ace3e12:salt:255-105-253-88-5-107-47-24:aes-256-cfb:4n++p1w8WZrjzmjna8W1mqh6PSA="
  secret_access_key: !x-private:Encrypted "md5:7844e3da7a807eb915207f7a36d4087b:salt:54-109-31-32-93-207-203-85:aes-256-cfb:l1OeNofj0C+vlsWfPfrTwQ=="

環境変数の設定にはDotenvを利用しているところもあります。

ReversibleCryptographyの活用プロダクト

弊社sue445さんのgemでも利用されています!

おわりに

  • 情報漏えいは人が原因のほうが多い!
  • 意識をしつつ、健全な開発をしましょう!
  • 知りたくない情報は暗号化してからもらいましょう!
  • 可逆暗号ができるReversibleCryptography gemの紹介をしました
  • 気が向いたら使ってみてもらえれば幸いです!

ということで次はnakajiさんです!

RubyKaigi 2014めっちゃいいKaigiだった。

初めての発表

今回初めてSpeakerとしてRubyKaigiに参加した。

発表者情報

感想

めっちゃ緊張した。

でも会議っぽい(?)写真取りたかったので、こんなことをしてみたり

photo

セミインターナショナルなKaigiということで発表自体は日本語だったけれどもスライドは英語にしようと思ってせっせと準備をしました。

結構なスライドの枚数になってしまい通訳の方が大変だったんじゃないかとすごく思う。 また、RubyKaigiのスタッフの方々がスライドチェックなどをしてくれて少しはまともな資料になりました!

通訳の方、スタッフのみなさんありがとうございました!

スライド

“Gem of this Week” - building culture and making gem

というタイトルで発表をした。

内容は僕が転職をして1年かけてカジュアルにgemを作るチームを作ってきた話。

今週のgemというコーナーで毎週のようにgemが更新されたり作成されていく環境を見せることができるようになったのでgemを作ることが特別じゃなくしました。

その結果チームメンバーがカジュアルにgemを作るようになった。

想い

今週のgemを初めた時の想いとしては

  • もっと楽したい。
  • 楽しいことをしていたい。
  • 同じことを繰り返したくない。

だった。

発表することになった時に 同じように共通化して社内gemみたいなの作って楽になる人たちはいっぱいいるんじゃないかと思った。 僕のとったアプローチの紹介をすることによっていろんな人の生活が良くなればいいなぁなんて想いながら発表準備をしてました。

アプローチのまとめ

privateなgemserverを用意する

  • 弊社はgeminaboxを使ってる
  • privateなのでどんなgemをアップしても大丈夫
  • メンテされていないgemへの辛いモンキーパッチはforkしてgem化できる

※deployの観点からgemにしているほうが気楽だった

※Gemfileでgitのsourceを指定するという手段もある

自由にgitリポジトリを作れるようにする

  • 弊社はGitLabを使っている。
  • メンバーは自由に他のプロジェクトを見ることができる
  • メンバーは自由にプロジェクトを作ることができる

コミュニケーションできる場を作る

  • 作ったgemのアナウンスをしたり、理想の開発とか語ったり
  • 弊社は週に1回各チームのメインエンジニアが集まるミーティングがあり、そこでアナウンスをしたりしていた。(今週のgem)

+αとしてgemを作る障壁を下げていく

  • gemとはカジュアルに作るものであるというイメージ化 今週のgem
  • gemを簡単に作り、簡単にデプロイできるgemを作る drecom_gem
  • 新卒の子にも作ってもらった
  • 多くのgemを作っていくことによって、参考例をたくさん作った

雑記

読み原稿的なのも一緒にアップすればよかったな…

別の記事で書きたいと思います!

speaker sponsor

転職記事書いてから全く書いてなかった三浦です。

あけましておめでとうございます。

もう2014年になっちゃったけど、2013年の振り返り

買ってよかったもの

iPad mini Retina

  • もっぱらKindleしか使ってないからKindleで良かった説は否めないが、Webページ見たり映画みたりで活躍してるので買ってよかった
  • 容量はいつも悩むけど正直そんないらんのだよな…

PS3

  • ASBをやるために買ったけど…ASB…….

torne と HDMIケーブル

  • HDMI綺麗、torne便利。nasneも買ってもいいかもなぁと思った

SONY ステレオヘッドホン MDR-7506

  • お薦めされたので買っちゃった。職場で集中する時用

ジョジョの奇妙な冒険1部〜7部(電子書籍)

  • 大人買い

ダーツ

  • 練習中

ソルティライチ1.5L * 8本セット * 14

  • 2013/12/22: 2
  • 2013/11/22: 2
  • 2013/10/28: 2
  • 2013/09/23: 2
  • 2013/08/22: 2
  • 2013/07/01: 1
  • 2013/04/01: 1
  • 2013/02/13: 1
  • 2013/01/20: 1 買いすぎですね

転職

  • 2013年の7月に転職しました。 photo

この辺の話はまた別の記事にしよう。Zzz…

全然振り返ってないや…

三浦、会社やめるってよ

私事ですが2013/07/14に株式会社オプティムを退職しました。

新卒として入社して4年と少しの間、とても濃密な時間を過ごし、多くの人と一緒に色々なことができました。

苦しい時間もいっぱいありましたが、とても楽しい時間を素敵な仲間と過ごせたと思います。

自分自身が叩いたrails newコマンドで作られたプロダクトが何個も世に出ました。 これらは自分の子供らのようなものだと思うので、とても思い入れが深いです。 それ故に、政治的な事情で技術的負債を抱え続けなければならなくなったりすると思いをぶつけたり、不貞腐れたりしました(笑)

次第にコードを書く時間が減ってきて、一日中メールを書いていたり、レビューしたり、割り込みに対する対応を1日中やっていて本質的な問題の技術的解決もできなくなってき、やりたいことが公私共にできなくなってきて自分らしくないなと思い始めていました。 1年とモヤモヤしたまま時が過ぎて、多くの先輩と話をしてきて、短い人生なのだから今やりたいことをやらなければいけないなと思い、転職に至りました。

いつやるの?今でしょ。


何をやっていたか

  • 主にRailsでのWeb開発
  • 火消し
  • 広報
  • 社内勉強会
  • リーダー
  • 社内ツール作成
  • Bot作成
  • etc…

品質保証であったり、研究開発だったり幅広く経験させてもらえました。 基本的にはRuby、Rubyしていたと思います。

Railsのバージョンを上げる仕事をしたり、image_pathとかこのへんのメソッドを上書きする暗黒プロジェクトを経験したり 新規でプロダクトを開発したり、残念なブランチが切られないようにRails Engine化したり、色々と試行錯誤して、成長してきたんじゃないかな


戦友たちへ

どうもありがとう。

何個か経験した炎上案件、正直肉体的に苦しかったことが多かった気がする。

でも精神的に苦しかったかというと、うん、苦しかったな。

その中でも一緒に苦しい時間を共にした戦友が何人かいる。

ボロボロになりながら、製品を作って、それを納品した日の達成感を今でも覚えています。

本当にありがとう。そして、お互い身体に気をつけよう。

今後

オプティムで学んだ事を活かして、BtoBから少し離れたところで挑戦します。

photo

今まで以上にコミュニティでの活動はしていきたいと思っているのでこの狭い業界のどこかであったらよろしくお願いします。

wishlistも晒しておきますね。

オプティムのみなさん、社外のみなさん、ありがとうございました。

ではでは、次回作にご期待ください。

Life is short!

Rails4アプリでファイルの変更を検知し、RSpecを実行するようにする。 テストの結果はGrowlにて通知するようにする

環境

  • Ruby 2.0.0
  • Rails 4.0.0
  • Mac OS X 10.8

利用するもの

  • Rspec
  • BDDフレームワーク
  • Guard
  • 監視・実行の管理
  • Growl
  • 通知
  • Spring
  • 事前にアプリを立て、コマンドの実行を高速化する

準備

Gemfileの更新

1
2
3
4
5
6
7
group :development, :test do
  gem 'rspec-rails'
  gem 'spring'
  gem 'guard'
  gem 'guard-rspec'
  gem 'growl'
end

bundle install

rspec:install

1
spring g rspec:install

spec/spec_helper.rbなどが作成される

guard init

1
gurad init

GuardfileというGuardの設定を記述するファイルが生成される

guard rspecでspringを使うようにする

guard :rspec doという記述をguard :rspec, spring: true doに変更する これによってguardでrspecが動く場合にspringで立てたテスト用のプロセスで実行されるようになる

基本的に作業はこれだけ。 あとはファイルを更新してテストが走ったり、通知がいくことを確認できれば問題なし。

かなり簡単に自動でテストが回る環境が作れた。 無意識にテストが実行されフィードバックが返ってくるのはとてもよい。

Rails4が出たということでdatabase_cleanerを始め開発環境を再度整えて行きたい

個人的にとても見やすいフォントのRictyをHomebrewで手軽にインストールできるみたいですね。

こちらのとおりに

1
2
brew tap sanemat/font
brew install ricty

しばらくするとインストールが終わるので、表示されるメッセージに従ってコマンドを実行

1
2
3
4
5
6
7
8
9
10
11
***************************************************
Generated files:
  /usr/local/Cellar/ricty/3.2.1/share/fonts/Ricty-Bold.ttf
  /usr/local/Cellar/ricty/3.2.1/share/fonts/Ricty-Regular.ttf
  /usr/local/Cellar/ricty/3.2.1/share/fonts/RictyDiscord-Bold.ttf
  /usr/local/Cellar/ricty/3.2.1/share/fonts/RictyDiscord-Regular.ttf
***************************************************
To install Ricty:
  $ cp -f /usr/local/Cellar/ricty/3.2.1/share/fonts/Ricty*.ttf ~/Library/Fonts/
  $ fc-cache -vf
***************************************************

こんなメッセージが出ていました。

1
brew info ricty

で再度見れます。

便利便利

6/25 Rails4.0.0がリリースされました。

ということで早速Rails4でプロジェクトを作成。

  • Ruby 2.0.0-p247
  • Rails 4.0.0
  • Mac OS X 10.8.7
1
gem install rails

プロジェクトの作成

1
rails new your_project_name -B -T -d mysql
  • rails new後のbundle installがとても嫌いなのでskip-bundleをしたいので-Bオプションを付与
  • test-unitではなくRspecを使いたいので-TでTest::Unitのファイルが作成されるのを回避
  • 今回はDBをMySQLにしたかったので-d mysql
  • デフォルトはsqlite3

tree

作られたファイルの確認

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
.
├── Gemfile
├── README.rdoc
├── Rakefile
├── app
│   ├── assets
│   │   ├── images
│   │   ├── javascripts
│   │   │   └── application.js
│   │   └── stylesheets
│   │       └── application.css
│   ├── controllers
│   │   ├── application_controller.rb
│   │   └── concerns
│   ├── helpers
│   │   └── application_helper.rb
│   ├── mailers
│   ├── models
│   │   └── concerns
│   └── views
│       └── layouts
│           └── application.html.erb
├── bin
│   ├── bundle
│   ├── rails
│   └── rake
├── config
│   ├── application.rb
│   ├── boot.rb
│   ├── database.yml
│   ├── environment.rb
│   ├── environments
│   │   ├── development.rb
│   │   ├── production.rb
│   │   └── test.rb
│   ├── initializers
│   │   ├── backtrace_silencers.rb
│   │   ├── filter_parameter_logging.rb
│   │   ├── inflections.rb
│   │   ├── mime_types.rb
│   │   ├── secret_token.rb
│   │   ├── session_store.rb
│   │   └── wrap_parameters.rb
│   ├── locales
│   │   └── en.yml
│   └── routes.rb
├── config.ru
├── db
│   └── seeds.rb
├── lib
│   ├── assets
│   └── tasks
├── log
├── public
│   ├── 404.html
│   ├── 422.html
│   ├── 500.html
│   ├── favicon.ico
│   └── robots.txt
├── tmp
│   └── cache
│       └── assets
└── vendor
    └── assets
        ├── javascripts
        └── stylesheets

31 directories, 34 files

binやapp/models/concernsなどが増えていますね!

rspec-railsの導入

rspec/rspec-railsに従って

1
2
3
4
# Gemfileに追加
group :development, :test do
  gem 'rspec-rails', '~> 2.0'
end
1
bundle
1
rails g rspec:install

db:create

1
rake db:crate

server start

1
rails s

そんな訳でとりあえず起動した。

rspecのくだりは別にいらなかったね。

mac, vim

MacのVimは初期状態でclipboardが有効になっていなくて辛いのでvimからclipboardが使えるようにする

1
vim --version |grep clipboard

結果

1
2
-clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments
 -xterm_clipboard -xterm_save

現時点ではHomebrewのVimのFormulaはclipboardに対するオプションがないみたいなのでMercurialからソースを持ってきて対応する

1. hgコマンドを使えるようにする

1
brew install hg

2. vimをinstall

1
2
3
4
5
6
hg clone https://vim.googlecode.com/hg/ /tmp/vim
cd /tmp/vim
make clean
./configure --prefix=/usr/local --enable-multibyte --enable-xim --enable-fontset --enable-rubyinterp --enable-perlinterp --with-features=huge --disable-selinux
make
make install

3. 確認

1
/usr/local/vim --version |grep clipboard

+clipboardが含まれていればOK

configureに与えるものは各自必要なものを指定すること

6/15に行われた高専カンファレンス5周年記念パーティーに参加してきた。

高専カンファレンスで人生を(良い意味で)狂わされた自分自身としては、5周年というのはとても感慨深いものがあるなぁと老害オーラを出していた。

なんだかんだでいつも発表したり運営側にいるので、今回は1パーティーの参加者としておとなしくしていようと思ったのだが、なんというか会場の空気にやられて飛び入りLTをさせていただいた。(運営のみなさん、ありがとうございました)

心地良い空気

全然準備できなかったので、ネタもなにもないし、〆方も失敗した。

伝えたかったのは「空気」の話

高専カンファレンスに限った話じゃないが、いろんなイベントやいろんなコミュニティがあって、そこには様々な雰囲気があって、多くの楽しさや、問題があると思う。

僕はあの空気が好きだし、バカみたいなことをしているのを見ていてもそれなりに楽しい。

あの場には多くのエンターテイナーがいてコンテンツが充実していて楽しい。

ネットワーク職人だったり、配信職人もいるためUstreamで配信を見ていれば十分楽しいというのもわかる。

でも、Ustreamじゃ空気が伝わらない。

参加してみないと分からないものがあるから、試しに1度参加してみてもらいたい。

「高専カンファレンスに参加しにくい。」というのもわかる。

誰も知らない、何も知らない状態で参加しようとするのは勇気がいるなぁと思う。

それだけ、高専カンファレンスは浸透してきているし、複数回参加したことがある人が増えたり、TwitterやFacebookを始めとして参加者間でコミュニケーションが取られているのが事実としてあるので、内輪感が出てしまう。

(内輪感がないメジャーな勉強会をそんなに知らないので高専カンファレンス特有かはわからないが)

でも、あのコミュニティは暖かいから、ぜひ参加してみてほしい。

その上で、あの空気が好きだったら、ぜひ作る側になってほしい。

内輪感を作るなというのも難しい話だから、そこはできてしまうものとして考えた上で、初めて参加してくれる人への配慮を運営を含めた参加者ができるととても素敵だなぁと思う。

さいごに

運営のみなさん、会場を提供していただいたVOYAGE GROUPさん、参加者のみなさん

素敵な空気と時間をありがとうございました。とても楽しかったです。

Happy anniversary!

2013/03/23にRails寺子屋というイベントを開催し、講師という立場で参加した。

午前10時という時間から開始ということで、寝坊だったり、遠方からの参加者は朝から東京に投げ出され大変そうだった印象。

あと、鉄道のICカード統一で駅が大変なことになっていた。速い人は5時くらいから並んでいるとか…

さて、寺子屋ですが

@RooandQoo ちゃんと一緒に1グループ担当しました。この日のために服装を揃えました(嘘です)

P3233335

午前

午前中は環境構築をする時間として設けていて環境構築をしつつ、終わったメンバーと対談したりRubyで簡単なプログラムを書いてみたりしてました。

  • RubyでFizzBuzzしてみたり
1
puts 100.times.map { |i| (s = ((i % 3).zero? ? 'Fizz' : '') + ((i % 5).zero? ? 'Buzz' : '')).empty? ? i : s }
  • 与えた文字をランダムで利用して140文字の文字列を作る遊びなど (下の例ではsを与える文字にしてます)
1
2
s = "みうらたくみ"
puts 140.times.map { s.chars.sample }.join

午後

ワークショップのメインということでRailsを使って簡単なアプリケーションを作ってみようというコーナーでした ここではRails Girlsというイベントの教材を使って、Herokuにアプリケーションをデプロイするところまでやりました。

まずは、この教材の出来がとてもよい。

反日でRailsアプリを1つ作り、Herokuにデプロイし1サービスの提供者になれる。

基本的に教材にそってやっていき、都度必要な説明を講師陣で加えていくという形で行なって行きました。

無事全員がHerokuにデプロイするところまで行きました。素敵

懇親会

みんなでピザを頬張り、ワイワイしてました。

感想

Rails Girlsの教材はとてもよい。

Railsの手軽さは体験してもらうことはできたと思う。

ただし、学習コストが高いRailsなのでアフターサポート的なものがあるとよいのかなぁと思いました。

気軽に@mitakuまでどうぞ!

参加者のみなさん、講師の皆さん、たくさんの関係者のみなさんありがとうございました!

楽しいRailsライフを!!