#技術書典3 で「Clean Code for Rails」という本を頒布します

10月22日(日) の秋葉原UDXで開催される技術書典3にて、Railsの同人誌を頒布します。

サークル名は「う07 Tech翠屋」で、頒布価格は1,000円です。

表紙

f:id:sinsoku:20171021174403p:plain:w300

目次

f:id:sinsoku:20171021174415p:plain:w300

f:id:sinsoku:20171021174423p:plain:w300

内容について

Rails でアプリケーション開発する上で基本的なこと、中規模以上になると起きがちな事例、などを書いた本になっています。

Rails の初〜中級者の方は「こんな事例もあるのか...」と勉強になる事が多いと思いますし、上級者の方でも Rails 5 で増えた機能や Devise + OmniAuth の話は参考になるかなと思います。

Rails エンジニアで少しでも面白そうだなと思ったら、是非10月22日(日)は「う07」まで遊びにきて下さいー。 よろしくお願いします。

2013〜2017年の RubyKaigi スポンサーの一覧を調べるスクリプトを書いてみた #rubykaigi

#rubykaigi のツイートを眺めていたら、会社から補助が出てそうな方々のツイートを見かけて、タイトルの件を思いついたので、雑にスクリプトを書いてみた。

RubyKaigi のスポンサー企業であれば、おそらく参加費補助や3日間休むことに理解あるところが多いんじゃないかなぁと。

参加費補助がありそうな方々のツイート

スポンサーの一覧を取得する雑スクリプト

RubyKaigi のスポンサーを取得するスクリプト

出力結果

http://rubykaigi.org//2017/sponsors: Now scraping...
http://rubykaigi.org//2016/sponsors: Now scraping...
http://rubykaigi.org//2015/sponsors: Now scraping...
http://rubykaigi.org//2014/sponsors: Now scraping...
http://rubykaigi.org//2013/sponsors: Now scraping...
Generate ranking
------------------------------
6: Cookpad Inc. - http://cookpad.com/ (2013, 2014, 2015, 2016, 2017, 2017)
5: GMO Pepabo, Inc. - https://pepabo.com/ (2014, 2015, 2016, 2017, 2017)
5: Tabelog - https://tabelog.com/ (2013, 2014, 2015, 2016, 2017)
5: Agileware Inc. - http://agileware.jp/ (2013, 2014, 2015, 2016, 2017)
5: Eiwa System Management, Inc. - http://www.esm.co.jp/ (2013, 2014, 2015, 2016, 2017)
5: Everyleaf Corporation - http://everyleaf.com/ (2013, 2014, 2015, 2016, 2017)
5: ClearCode Inc. - http://www.clear-code.com/ (2013, 2014, 2015, 2016, 2017)
5: Akatsuki Inc. - http://aktsk.jp/ (2013, 2014, 2015, 2016, 2017)
4: GitHub - https://github.com/ (2013, 2015, 2016, 2017)
4: Drecom Co., Ltd. - http://www.drecom.co.jp (2013, 2014, 2016, 2017)
3: DWANGO Co., Ltd. - http://dwango.co.jp/ (2015, 2017, 2017)
3: esa LLC - https://esa.io/ (2015, 2016, 2017)
3: Speee, Inc. - http://www.speee.jp/ (2015, 2016, 2017)
3: Recruit Marketing Partners Co.,Ltd. - http://www.recruit-mp.co.jp/ (2015, 2016, 2017)
3: Misoca Inc. - https://www.misoca.jp (2015, 2016, 2017)
3: Money Forward, Inc. - https://moneyforward.com/ (2015, 2016, 2017)
3: Bit Journey, Inc. - http://bitjourney.com/ (2015, 2016, 2017)
3: Degica - https://www.degica.com/ (2014, 2015, 2017)
3: MediWeb, Inc. - http://www.mediweb.jp/ (2014, 2015, 2016)
3: spice life Inc. - http://spicelife.jp/ (2014, 2015, 2016)
3: Heroku - http://www.heroku.com (2013, 2014, 2017)
3: DeNA Co., Ltd. - http://dena.com/ (2013, 2014, 2015)
3: Engine Yard - http://www.engineyard.co.jp (2013, 2014, 2015)
3: pixiv - http://www.pixiv.net/ (2013, 2014, 2015)
2: Livesense Inc. - http://www.livesense.co.jp (2016, 2017)
2: Toreta, Inc. - https://toreta.in/jp/ (2016, 2017)
2: Elastic - https://www.elastic.co/ (2016, 2017)
2: RakSul Inc. - https://corp.raksul.com/ (2016, 2017)
2: M3, Inc. - https://jobs.m3.com/engineer/?utm_source=techevents&utm_campaign=rubykaigi2017&utm_medium=recruit_banner (2016, 2017)
2: Opt, Inc. - http://www.opt.ne.jp/ (2016, 2017)
2: SMS CO., LTD. - http://www.bm-sms.co.jp/ (2016, 2017)
2: Aiming Inc. - https://aiming-inc.com (2016, 2017)
2: SideCI - https://sideci.com (2016, 2017)
2: Minnano Wedding - http://www.mwed.co.jp/ (2015, 2017)
2: Fastly - https://www.fastly.com/ (2015, 2017)
2: Goodpatch, Inc. - http://goodpatch.com/ (2015, 2016)
2: Nekojarashi Inc. - https://www.nekojarashi.com/ (2014, 2017)
2: PIXTA Inc. - http://www.pixtastock.com/ (2014, 2017)
2: Wantedly - https://www.wantedly.com/ (2014, 2015)
2: Rakuten, Inc. - http://www.rakuten.co.jp/ (2014, 2015)
2: Forkwell Jobs - https://jobs.forkwell.com/ (2014, 2015)
2: GREE, Inc. - http://corp.gree.net/jp/ja/ (2014, 2015)
2: Network Applied Communication Laboratory Ltd. - http://www.netlab.jp/ (2013, 2014)
2: Doorkeeper - http://www.doorkeeperhq.com/ (2013, 2014)
2: Enishi Tech Inc. - http://www.enishi-tech.com/ (2013, 2014)
2: R-learning - http://www.r-learning.co.jp/ (2013, 2014)
2: Misoca - http://www.misoca.jp/ (2013, 2014)
2: EY-Office - http://www.ey-office.com/ (2013, 2014)
2: CodeIQ - https://codeiq.jp/ (2013, 2014)
2: Yamaha Corporation. - http://jp.yamaha.com/products/network/ (2013, 2014)
2: Internet Initiative Japan Inc. - http://www.iij.ad.jp/ (2013, 2014)
1: Shopify - https://www.shopify.jp/ (2017)
1: Increments Inc. - https://increments.co.jp (2017)
1: Classi Corp. - https://classi.jp (2017)
1: I'LL inc. - http://www.ill.co.jp (2017)
1: CloudGarage.jp - https://nhn-techorus.com/ (2017)
1: Nintendo Co., Ltd. - https://www.nintendo.co.jp (2017)
1: Supership.Inc - https://supership.jp/ (2017)
1: UridokiNet Inc. - https://corporate.uridoki.net/ (2017)
1: Space Pirates, LLC. - https://space-pirates.co.jp/ (2017)
1: freee K.K. - https://www.freee.co.jp/ (2017)
1: Minimal Technologies Inc. - http://minimaltech.co/ (2017)
1: JetBrains - https://www.jetbrains.com/ (2017)
1: pixiv Inc. - https://www.pixiv.co.jp/ (2017)
1: Atlassian Japan - https://ja.atlassian.com/ (2017)
1: Medley, Inc. - http://www.medley.jp/ (2017)
1: QUEUE, Inc. - http://www.brilliance.co.jp/ (2017)
1: Bizcast Inc. - http://corp.bizcast.bz/ (2017)
1: Takeyu Web Inc. - https://takeyuweb.co.jp (2017)
1: Supporterz, Inc. - https://supporterz.jp (2017)
1: SmartHR - https://smarthr.co.jp/ (2017)
1: Circulation Co., Ltd./flexy - https://www.circu.co.jp/ (2017)
1: Linkers Corporation - http://linkers-net.co.jp/ (2017)
1: PayPal - https://www.paypal.com/jp/webapps/mpp/merchant (2017)
1: DMM.com Labo Co.,Ltd. - https://dmm-corp.com/ (2017)
1: Sansan, Inc. - https://jp.corp-sansan.com/ (2017)
1: Google - https://cloud.google.com/ruby (2016)
1: Nintendo Co., Ltd - https://www.nintendo.co.jp/index.html (2016)
1: Vareal Co., Ltd. - https://www.vareal.co.jp/ (2016)
1: Kaizen Platform, Inc. - https://kaizenplatform.com (2016)
1: BENIC SOLUTION CORP. - http://www.benic.co.jp/ (2016)
1: Wantedly inc. - http://site.wantedly.com/ (2016)
1: Happy Elements K.K - http://www.happyelements.co.jp/ (2016)
1: Eight - https://8card.net/ (2016)
1: PIXTA, Inc. - https://pixta.jp/ (2016)
1: Ruby Development Inc. - https://www.ruby-dev.jp/ (2016)
1: PORT INC, - https://www.theport.jp/ (2016)
1: Gaiax Co.Ltd. - http://www.gaiax.co.jp/ (2016)
1: PR TIMES, Inc. - http://prtimes.co.jp/ (2016)
1: Splout Ltd. - https://splout.co.jp/ (2016)
1: EL Passion - http://www.elpassion.com (2016)
1: Clinical Platform - https://clinical-platform.com (2016)
1: Synergy Marketing, Inc. - http://www.techscore.com/ (2016)
1: Kyoto University Micro Computer Club - http://kmc.jp/ (2016)
1: e-Agency Co.,Ltd. - http://www.e-agency.co.jp/ (2016)
1: ookami, Inc. - http://www.playerapp.tokyo/ookamiinc (2016)
1: Salesforce.com Co.,Ltd. - https://www.salesforce.com (2015)
1: Travis CI GmbH - https://travis-ci.com/ (2015)
1: Pivotal Labs - http://pivotal.io/ (2015)
1: Enigmo Inc. - http://www.enigmo.co.jp/ (2015)
1: X-Flag Studio - http://xflag.com/ (2015)
1: Crevo Inc. - http://crevo.tokyo/ (2015)
1: BEENOS, Inc. - http://beenos.com/ (2015)
1: Doorkeeper Inc - https://www.doorkeeper.jp (2015)
1: Aiming - https://aiming-inc.com/ (2015)
1: Ai-LAND Co.,Ltd. - https://www.ai-land.co.jp/ (2015)
1: WebPay, Inc. - https://webpay.jp/ (2015)
1: Space Market, Inc. - https://spacemarket.jp (2014)
1: Recruit - http://www.recruit.jp/ (2014)
1: iQON - http://www.iqon.jp/ (2014)
1: Miew inc. - http://www.miew.co.jp (2014)
1: KAYAC Inc. - http://www.kayac.com/ (2014)
1: Groovenauts, Inc. - http://www.groovenauts.jp/ (2014)
1: Ubiregi Inc. - https://ubiregi.com (2014)
1: CrowdWorks - https://crowdworks.jp (2014)
1: PayPal + Braintree Developer - https://developer.paypal.com/ (2014)
1: WebPay - https://webpay.jp (2014)
1: YassLab - http://yasslab.jp/ (2014)
1: cloud accounting software freee - http://www.freee.co.jp/ (2014)
1: Qiita/Kobito - http://qiita.com/ (2013)
1: Ricoh Company, Ltd. - http://www.ricoh.com (2013)
1: Microsoft Japan Co., Ltd. - http://windowsazure.com/ja-jp/ (2013)
1: tmix - http://tmix.jp/ (2013)
1: KY TRADE CO.,LTD. - http://www.kytrade.co.jp/english/index.php (2013)
1: Allied Telesis K.K. - http://www.allied-telesis.co.jp/ (2013)
1: Rakuten, Inc - http://global.rakuten.com/corp (2013)
1: Cuon.Inc - http://www.cuon.co.jp/ (2013)
1: Tatsu-zine Publishing Inc. - http://tatsu-zine.com/ (2013)
1: HeartRails - http://heartrails.com/ (2013)
1: PIXTA - http://pixta.jp (2013)
1: Treasure Data - http://www.treasure-data.com/ (2013)
1: Basho Japan KK - http://www.basho.co.jp (2013)
1: paperboy&co., Inc. - http://www.paperboy.co.jp (2013)

最初の数字はスポンサーページに出現した回数です。ただ、出現回数を 社名もしくはURLの完全一致 で計算しているため、一部の企業の出現回数はちゃんとマージできていないです。

本当はちゃんと出現回数をマージしたり、スポンサー枠も出したかったけど、面倒そうだったのでやっていない…。

まとめ

RubyKaigi への参加に理解ある会社を知りたい人にとっては参考になるのではないかと思う。

ただ、スポンサー枠によっても Ruby に対する力の入れ具合とか違うと思うので、詳しく知りたい人は RubyKaigi 公式サイトを見るのが一番良いです。

Ruby で簡単に既存メソッドの前後に処理を挟み込む方法

自分用の備忘録。このコード、ブログに書いておかないと忘れそうなので…

やりたかったこと

RubyKaigi の型の話を聞いて、「メソッドの実行を上書きして、引数の型を読み取る」ってことができないかなと思いついて実装したコード。

コード

既存の出力を { ... } と丸括弧で囲むようにするコード。

class User
  def self.a
    print 'singleton method'
  end

  def a
    print 'a'
  end

  def b(a1)
    print a1
  end

  def c(a1, a2)
    print [a1, a2]
  end

  def d(a, b, c = {})
    print [a, b, c]
  end

  def e(&_)
    yield
  end

  def f
    yield
  end
end

module M
  class << self
    def call_original(obj, name, *args, &block)
      m = obj.method(name)
      params = m.parameters
      has_yield = block && params.all? { |type, _name| type != :block }

      if params.empty?
        if has_yield
          m.call { block.call }
        else
          m.call
        end
      elsif has_yield
        m.call(*args) { block.call }
      else
        m.call(*args, &block)
      end
    end

    def method_names_on(obj)
      obj.public_instance_methods - obj.superclass.public_instance_methods
    end

    def wrap_method(obj, name)
      obj.send(:define_method, name) do |*args, &block|
        print '{ '
        M.call_original(self, name, *args, &block)
        puts ' }'
      end
    end

    def spy(klass)
      Module.new do
        refine klass do
          M.method_names_on(klass).each do |name|
            M.wrap_method(self, name)
          end
        end

        refine klass.singleton_class do
          M.method_names_on(klass.singleton_class).each do |name|
            M.wrap_method(self, name)
          end
        end
      end
    end
  end
end

using M.spy(User)
User.a
#=> { singleton method }
user = User.new
user.a
#=> { a }
user.b(1)
#=> { 1 }
user.c(1, 2)
#=> { [1, 2] }
user.d(1, 2, a: 3)
#=> { [1, 2, {:a=>3}] }
user.e { print 'e' }
#=> { e }
user.f { print 'f' }
#=> { f }

Git のブランチには説明をつけることができる

このツイートの通りです。

使い方

下記のコマンドを実行するとエディタが起動し、説明を書けます。 <branchname> を省略すると、現在のブランチに対してメモが書けます。

$ git branch --edit-description [<branchname>]

メモを表示するコマンドは下記の通りです。 <branchname> はメモを表示したいブランチ名です。

$ git config branch.<branchname>.description

使いづらいけど、仕方ありません。Git のコマンドはそんなものです。

git alias

ブランチの説明を簡単に表示するエイリアスを作ってみました。

[alias]
  # git show-description [<branch_name>]
  show-branch-description = "!f(){ git config branch.$(git rev-parse --abbrev-ref ${1:-@}).description;};f"

これで少し使いやすくなると思います。

注意

ブランチの説明はローカルリポジトリのブランチに対するもので push はできません

本来の用途

ヘルプを読むと、ブランチの説明は format-patchrequest-pullmerge のコマンドで使うようです。

引用元: git help branch

–edit-description Open an editor and edit the text to explain what the branch is for, to be used by various other commands (e.g. format-patch, request-pull, and merge (if enabled)). Multi-line explanations may be used.

引用元: git help merge

merge.branchdesc In addition to branch names, populate the log message with the branch description text associated with them. Defaults to false.

format-patchrequest-pull はあまり使わずよく分からないので、ためしに merge で使ってみました。

merge で使う

まず、マージで使えるようにするために下記の設定をします。

$ git config merge.branchdesc true
$ git config merge.log true

この状態で説明の付いているブランチをマージすると、自動でブランチの説明がコミットメッセージに挿入されます。

Merge branch 'feature' into dev

* feature:
  : ブランチの説明
  2nd commit message
  1st commit message

# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.

なるほど、便利そうな雰囲気あるけど、やっぱり使い所は思い浮かばない。

ブランチをたくさん使う人には便利かもしれません。

2017年 OmniAuth で Qiita 連携を作る際の現状まとめ

Rails で OAuth 連携の機能を作う場合、一般的に OmniAuth を使うことになります。

そして、 OmniAuth の Qiita Strategy が3つあったので、それぞれ状況をまとめました。

各 gem の概要

GitHub rubygems version work?
tmiyamon/omniauth_qiita omniauth_qiita 0.1.0 Yes
kazu69/omniauth-qiita omniauth-qiita 0.0.3 No
increments/omniauth-qiita Not found 0.0.1 No

omniauth-qiita

increments/omniauth-qiita

/auth/qiita のページに遷移後

{"message":"Not found","type":"not_found"}

と画面に表示されてしまい、全く動かない。

公式 wiki の紹介

Provider Notes Author Status Official?
Qiita Qiita OAuth2 Strategy for OmniAuth. tmiyamon Released No

引用元: https://github.com/omniauth/omniauth/wiki/List-of-Strategies

まとめ

omniauth_qiita を使っておくのが良さそう

Ruby/Rails の勉強方法について #omotesandorb

6/1(木) の表参道.rb でLTしてきました。

omotesandorb.connpass.com

資料

「他人がどうやって Ruby/Rails を学んできたのか?」って意外と聞く機会は無いと思うので、自分のふりかえりも兼ねて発表してみました。資料は Qiita で公開してます。

qiita.com

経歴について

  • RESTful を知らずにコード書いてた時代
    • ソシャゲ案件で QuestsController#execute とか書いてた
  • 実は Rails チュートリアル未経験
  • SQLActiveRecord 無しでちゃんと触ったのは最近(3年前くらい)
    • それまで都度、ググっていた

と、恥ずかしい話もありますが、今 Ruby/Rails 勉強している人に何か役立てば…と思って、自分が触ってきた技術的なネタを時系列で紹介してみました。

初心者向けの Ruby/Rails の勉強方法について

帰りの電車内で「Ruby/Rails の勉強方法」について色々と話していたので、自分なりに こうすれば Ruby/Rails の技術力が上がるだろうなー という方法を整理して、ブログで紹介してみます。

下記の順番でやってみるのはどうでしょう?

1. Ruby の基本文法を知っていますか?

「いいえ」という方、何か書籍を1冊買いましょう。他の方の発表だと 初めてのRuby が良書だと紹介されていました。

初めてのRuby

初めてのRuby

書籍を買う理由は下記の2つ。

  • 体系立てて Ruby を勉強、理解できる
  • ググりにくい内容を知ることができる
    • 特殊記号の動き( <=>%w(a b c) などの記法)

2. Rails アプリを 1人で作ったことがありますか?

「いいえ」という方は自分で rails new を実行し、何かアプリを作ってみましょう。私も昔、「Rails によるアジャイルWebアプリケーション開発」の写経をしたことがあります。

RailsによるアジャイルWebアプリケーション開発 第4版

RailsによるアジャイルWebアプリケーション開発 第4版

あと、何人もの方が Rails チュートリアル をオススメしているので、やってみると良いかも*1

3. 仕事で使っている gem の README を全部読んでますか?

「いいえ」という方、まず自分が仕事で使っている gem の README を 全て読むところ から始めましょう。

  • 何をするための gem なのか?
    • 概要は知っておいた方が良い
    • Rails の標準機能なのか、 gem の拡張機能なのかを正しく理解しておいた方が良い
  • 英語の README を日常的に読む癖をつける
    • 日本語のブログを見ないで、公式の英語ドキュメントを最初に読むのが良い
    • インストール方法、初期設定、オプションなどは一度目を通すと理解が早い

余裕があれば、同種の gem の README を比較して読むと面白いです。ファイルアップロードで carrierwaveshrine の gem があるけど、何が違うの?みたいな感じ。

4. 仕事で使っている gem のコードを読んでいますか?

「いいえ」という方は仕事で使っている gem のソースコードから読んでみましょう。最初はなかなか読み進められないと思いますが、だんだんと読めるようになりますし、かなり勉強になります。

  • 汎用的な設計になっていることが多い
  • メタプロを実践的に使っているケースが多い
  • 複数 Ruby/Rails のバージョンに対応していて、学びが多い

コードを読むようになると「機能は少ないけど、コードがシンプル」「多機能でコードも複雑」「メタプロが多くて、読めない」みたいな違いが分かるようになってきます。 deviserails_admin のコードを読むと、便利さとメタプロの辛さを同時に勉強できてオススメです。

5. gem にコントリビュートしたことあります?

「いいえ」という方、まずは使っている gem の Issue やプルリクを読んでみましょう。

  • どんなコードがプルリクで出されているのか?
  • OSS ではどんなコミュニケーションがされているのか?
    • 英語のやりとり、コミットメッセージの定型句を覚えられる
    • リポジトリごとの文化の違いが分かる
  • 最新の Ruby/Rails に対応する方法を知ることができる
    • Ruby 2.5(Rails 5.1)対応のプルリクの diff は非常に勉強になります

6. 最新の Ruby/Rails 情報を自分で追ってみよう

今、私はこのあたりを実践している感じです。

  • id:y_yagi_2 さんの rails commit log流し読み を読む
    • 気になるコミットは diff まで読む
    • 良さそうなものは即仕事のコードに反映する(最近だと rails/rails@0b8441b とか)
  • Ruby, Rails, RuboCop のコミットログを RSS で個人 Slack に流す
    • よくコミットしている人の名前、アイコンを覚える*2
    • 気になるコミットには目を通す(最近だと RuboCop の parallel は楽しみに待ってた)
  • 勉強会で Rails アプリを書いている人と 実践的な設計 について議論する
    • 複雑な要件を、どうやって RESTful にするか?
    • どうすればメンテ性の高いコードを書けるか?
    • ツラいコードの経験の共有

7. そして、Ruby/Rails コントリビューターに

まだ実践できていないけど、Ruby/Rails を使うだけじゃなくて、何か貢献したい。

さいごに

技術力を上げるためには「コードを読んだ量」と「コードを書いた量」が一番大事だと思うので、OSS のコードをたくさん読んで、Ruby/Rails のコードを書き続けるのが上達するための一番の近道だと思います。

この記事が何かしら Ruby/Rails 初心者の参考になれば幸いです。

*1:私は未経験なので詳細は知らないのですが…

*2:その人の gem は信頼できる

Tor: Hidden Service Protocol に対応した Mastodon インスタンスを立てた

巷で話題のマストドンインスタンスを立ててみました。

f:id:sinsoku:20170428015230p:plain

インスタンス概要

タイトルにもあるように、Tor の Hidden Service に対応してます。*1

http://xmstdn2w5vvvd747.onion

普通のドメインもあるので、 Tor を使わない人はこちらをどうぞ。

https://xmstdn.com

どんな人向けか

  • 投稿元IPを隠してトゥートしたい人
  • そんな人が投稿する内容を見たい人
  • トゥートのリンクを安易に踏んだりしない人

など。

今後やりたいこと

Tor ユーザーだけに表示されるトゥートとか作りたい。

*1:というか、これに時間がかかっていたわけですが