Rails環境でのドキュメントの自動化

仕事しているとドキュメント大事ですよね。
いつ人の移動があるか分からないし、新しく追加されても忙しいと説明する時間もなかったり。
そういう管理しているのが問題なのですがそれはそれとして、やぱっぱりドキュメントはあるに越したことはないです。

ということで、仕様書とかは別にしても現状の成果物に対してのドキュメントの自動化を行っています。
ドキュメントを作りたいけど忙しい方たちはこれを行うだけでも大分楽になるかと。

YARD/RDoc

昔からよくあるソースコードから作るドキュメント。
DoxygenJavaDocなどのRubyバージョンですね。
適切なコメントを書くと、クラスとそのメソッドのドキュメントを作成してくれます。

Rdocは便利なのですが、YARDの方が一貫性があるなどより良い感じですので、こちらを採用しています。
最悪コメントを書かなくてもとりあえずのドキュメント化はしてくるようですし、

rails-erd


voormedia/rails-erd · GitHub
DataBaseからER図を自動生成してくれます。
これがあると無いとでは大違いですね。

schemadoc


rubylibs/schemadoc · GitHub
こちらはDatabaseからテーブルとカラムの一覧をjsonで出力してくれます。
Railsのダメなところはtable宣言を見たい場合は、Databaseを直接見るぐらいしか方法がないことです。
migrationは運営していくにつれて増加しますしカラムの変更を行うと複数のmigrationファイルが増えていって理解不可能、modelを見てもテーブルの状態は書いていないです。
gemでmodelに出してくれるものもあるようですが、マネージャー等からするとドキュメントはやっぱり別途必要。
ということで、schemadocだと自動生成してくれるのでおすすめです。

autodoc


r7kamura/autodoc · GitHub
Web API用ドキュメント自動生成ツール
APIRSpecに少しの修正を行えば、RSpecを実行するだけでドキュメントが生成されます。
素晴らしい!


これだけでプロジェクトのドキュメント管理が大分楽になります。
面倒な作業は自動化をしてプログラムに集中するようにしています。
自動化バンザイ!

最近Railsでよく使うgem

個人的に定番をまとめておきたいので。
細かくは説明しません。

devise

まあ基本です。こればっかりは代替ってなかなか無いですね。

slim-rails

erbの代わりにシンプルにViewを書けるようになります。
今更erbは辛いですよね。個人でRailsを使うならば現在はほぼ確実にこれを採用します。

rails_config/settingslogic

どっちでも良いですが、定数管理はしておいたほうが良いでしょうね。

kaminari

定番

paranoia

状況次第ですけど便利といえば便利。
ただ、問題もあるようで、Kakurenboの方が良いかもしれません。

activerecord-import

BULK INSERTしたいならこれ。

rack-mini-profiler

発行されるSQLの調査などに

yard

ドキュメントの自動生成に。

rails-erd

ER図を自動で書いてくれます。

rubocop

仕事だとコーディングルールの統一、チェックに。

rspec,factory_girl_rails,capybara,poltergeist

テスト系色々。
ここは時代によっても移り変わりが激しいですね。

YosemiteでAirDropが反応しない場合の対応方法

会社などの組織でMac複数使っているとAirDrop便利ですよね。
HipChat、Slackなどのチャットツールでもファイル共有できるので使用頻度はそこまで高くないのですが。

さて、今年に入ってから会社MacYosemiteにしたのですが、この記事でも書かれているようにAirDropがまともにつながりません。

[L] AirDropが反応しないなら、Instashareを使えばいいじゃない | Lifehacking.jp

対策方法ですが、自分の場合はAirDrop画面の下にある"お探しの相手が表示されませんか?" -> "古い機種のMacを検索"で検出できました。
f:id:khondalit:20150116104211p:plain

調べてはいませんがおそらく、Yosemiteから通信プロトコルが変更をあったけどプロトコルか実装に問題があって、過去のプロトコルを利用すると通信が出来るのではないでしょうか。

Mac用フリーなアンチウイルス sophos を使用してみた

Macを使用していますが、近年はMacWindowsと同じくウィルス対策はもはや必須となっています。
ただ、基本的に有料ですし動作も重くなるのが大きな欠点。
ウィルス等から見を守るために入れているのに、作業に悪影響を与えるなら意味はないですし、かと言って個人であまりお金を使う程裕福でもありません。


Mac用アンチウイルスソフト18種類のウイルス検出率をテスト、最も検出率が高かったのは? - GIGAZINE

ということで、検索していたらこのような記事を発見しました。
意外と数があるものですね。

さて、この中から色々検索するとsophosが軽くてなかなか機能も豊富そうでこれを選択しました。

インストール

インストールは簡単でここからダウンロード出来ます。
ダウンロードにはメールでの登録が必要です。
http://www.sophos.com/ja-jp/products/free-tools/sophos-antivirus-for-mac-home-edition.aspx

無事ダウンロードを行えば解凍してインストールは問題なく終了。
f:id:khondalit:20150115205125p:plain

最初にやること。

今すぐアップデートを行った後、全検索を行います。
やっぱり怖いですしね。

設定

基本的にはデフォルトで構わないかと思います。
自動アップデートやライブスキャン、Webスキャンなどが全てデフォルトでONになっています。

所感

動作は非常に軽く、常駐、全検索でも特に支障を感じることはありませんでした。
UIも違和感のない日本語で操作が可能で英語が苦手な人でもこれは嬉しい所です。
自動アップデートが1時間に1回なのがちょっとどうかなぁと思ったりもしてますが、軽いので問題は無いと判断してデフォルトのまま使用しています。
個人的には、会社などの組織でお金を出すならこれで全然問題無い気がします。

Railsでenum+i18n

state_machineという便利なgemがあります。
カラムの状態、状態の別名とかを管理が出来て結構便利に使わせてもらっていたのですが、
もう2年程更新がされておらすRails4.2系だとエラーになる場合もあるようです(確実にエラーになるかまでは分かりません)。

そこでenum

色々調べるとRails4.1から入ったenumを使えばいいかも的な情報を見かけたので使ってみたところちょっと使いづらい。

Rails4 - ActiveRecord::Enum の使いドコロ - Qiita

enumの追加の順番が大事なのはCでも同じなので、ある程度熟練したプログラマなら問題にはしません。
今どきC時代と同じ対応が必要なのは微妙な気はしますけど。

問題はi18n
この対応が出来ない。あくまでも値の別名を付けやすくするだけの機能なのでしょうがないとは思いますがちょっと不親切です。
enum_helpという選択肢も示されていますし、検索すると他のgemも提案されているようではあります。
しかし、gemの問題はstate_machineのように更新されなくなったら終わりなのです。
gemに限らずcpanやらeasy_installのような類似の場合も同じ。
そこで個人的には、deviseのようなほぼ必須であったり、安定して信頼できるのでも無い限りは自作するべきと思っています。
仕事だとそうも行かない場合もありますが...

enum + i18n

ということで、今回はenumi18n対応は自作しました。
はじめに考えたのはARを拡張するかどうか。
ARを拡張してlibあたりに置いておいてauto loadしておけば楽といえば楽なんですが、使わないmodelでもロードされるのは少し気持ち悪い。
そこで、model/concernsを採用しました。明示的にincludeしておけば分かりやすいですし。

Userモデルをサンプルにします。

# app/models/user.rb
# 削除フラグdeletedがあると仮定する
class User < ActiveRecord::Base
  enum deleted:[deleted_off, deleted_on]
end

i18n辞書にはこのように書いておきます

ja:
  states:
    users:
      deleted:
        deleted_off: '未削除'
        deleted_on: '削除済'

model/concerns以下に好きなファイルをおいておきます。

# このメソッドをconcernsに置いておく
# model側でのincludeも忘れずに
def state_machine_human(column)   
  state = self.try(column)
  return "#{column}" if state.blank?
  I18n.t('states.' + self.class.table_name + '.' + column + '.' + state)
end

# 使い方
user = User.all.first
user.state_machine_human('deleted')

これで使えるはずです。concernsって便利!
missing_method使えばもっと良いメソッド名とかにも出来るとは思います。

まとめ

gemは便利ですが、この程度であればわざわざgemを使うよりも作ったほうがよいでしょうね。
仕事だと特に作成者とメンテナが違うという事だって珍しくありません。
技術は適切に使いましょう。動けば良いのと、管理しやすいのは別問題ですよね。

今年の振り返り

さて、今年ももうすぐ終わりですね。
今年は仕事が忙しくほぼ何も出来なかったとはいえ、年末にlinux.infoを少し更新出来たのは良かったです。
とは言え今年のはじめの数ヶ月はRailsを触っていたので来年中にはなんとかリリースをしたいですね。
このblogも含めてあまり更新は出来ていませんが頑張りますので、来年は良い年になりますように。

漫画喫茶でノマドっぽく作業してみた

やっと時間がとれたので、http://linuxc.info を更新しました。

LinuxC | プロセスとIPC
追加したのは2記事。当分プロセス周りを追加していければと思います。

ちなみに、amazonのアソシエイトのクリックを見ると何故かGC本がそこそこ上位にいてビックリ。
商売は考えていないですし、そもそもアクセス数も少ないサイトですが、どういう興味があるかが気になるので時々見ているのですがそんなにGCの中身って気になるのですかね?
個人的にはかなり不思議です。
必要ならそのうちGCの話も追加したほうが良いのでしょうか? Boehm GCとか。簡易GCの実装とか。
時間があればですけどw

さて本題

漫画喫茶でノマドっぽい事をしてみた

さて、最近は家での作業は何かと誘惑が多く作業がなかなか進まないのが悩みです。
家だとやる気も出ないのですが、会社に行くとなんだかんだ言いつつも仕事は出来るのです。
昔は睡眠時間を削ってでもプログラミングの勉強をしたのですが、体力はともかく作業自体に身が入らない。

ということで家環境がダメなのではないのかと思い、時々行く近所の漫画喫茶を使おうと試しに行ってきました。
ですので今日は漫画は一切読んでいません。

作業自体はそれなりに進みました。文章自体は書くのが苦手なので上でも書きましたが2記事(昨日の家作業を含む)ほど。
集中出来ない問題に関しては解決するようです。

次に作業周りの環境とか。
PCはMBPで会社と変わらない環境ですので問題は無いです。ただ誤算だったのは電源が余っておらずバッテリの範囲内での作業だったこと。
持ち運びのバッテリは持っているのでこれを持っていけば問題は解決しそうです。

ちなみにこんな感じで作業をしていました。漫画喫茶のPCでyoutubeとかで適当に音楽を聞きつつ自前Macで作業的な。
WiFiは自前PcketWiFiがあるので問題なし。一応漫画喫茶にもあるようですが受付でお願いが必要っぽくて面倒で自前のを使いました。

後はお値段ですが、休日の6時間パックで作業をしましたので1800円ほど。
本格的なノマドをされる方であれば平日ですのでもう少し安くはなりますし、オープンな席だとさらに安い値段でした。
適当に検索したらノマド専用のところだと1日の値段もさほど変わらなそうです。環境は良さそうだけど電車代とかまで考えると微妙...

他にも幾つか困った事があったのですが自分の準備不足なので問題なし。
今日中に作業してから明日また行こうかな。やりたい作業が多々ありますし、年末年始も営業しているとの事なので結構ありですね。


ところで、数日で作れるWebサービスのアイディアないかなぁ。
今の作業は地味でちょっとつらいです。