"Devise" は自分にはまだ早かった話

Railsチュートリアルから少し離れた話です。




Railsを利用して、1本学習系のサービスを開発中です。

そこに付与する認証機能として、
やはり独自でemailなどの情報を保持しておきたくないので、
Omniauthを利用して

を利用しようかと考えています。

Google先生に教えていただきながら進めていくと、
どうしても出てくるのが Devise という名前。

認証に関わるような「あるある処理」を一括実装できるようで、
いろいろ説明を読んでいると、たしかにすごい。

でも、触っていると(私が初心者だからもあると思いますが)疑問が湧いてきます。


なんでも出来過ぎじゃないのかな?という疑問

いろいろな機能が一気に突っ込まれることは理解できましたが、
私自身使いこなせる気がしていません。

たしかに各所に存在する情報を利用すると、
簡単に認証系が実装できましたが、
一部はなんとなく動作を把握できましたが、細かいところは個人的にブラックボックスです。

「使いこなせないお前が悪い」、と言われたらそれまでなのですが、
まずはRuby on Railsでの認証のなんたるかを把握してから
こういうものに手を出したほうがいいのでは?という気持ちになってきました。

果たして何か起きた時に対応できるのか?

普段の業務では Java/javascript を利用しており、
OSSのライブラリやフレームワークを利用することも多々あります。

ただし、トラブルが起きた際にはソースを読んで動きを追うことも多々あります。
javascript系のライブラリであれば、実際に手を加えて直すこともあります。

ただ、これをJava/javascript初心者だったころにやれと言われたら無理だった気がします。


というわけで...

今のところ一人で進めている開発なので、
何か起きた時に自分で対応できるよう、認証系でDeviseは利用しないことにしました。

でも。。。

正直、DeviseというGemはすばらしいと思いました。

あれだけのものを、瞬く間に作れてしまう。これはやはり驚異的です。

こういったものを有効活用して効率的に作成するのもRailsの魅力だと考えているので、
いずれ自作した認証部を置き換えてみたいと思います。




でも実際のところ業務とかでは使うのだろうか?

認証と言っても、やはりサービスモデルによって色々差異はあると思いますし、
すべてが共通だとは思えないです。

Deviseを入れてカスタマイズするのと、スクラッチで作るのを天秤にかけて
より効率的なほうを選んでいく感じなのかな?



うーん、やはりまだまだ未熟でございます。。

新人エンジニアさんに最初に意識してほしいこと

最近、自分の仕事もしながら、新人さん一人の教育担当もやっています


その中で、
「ああ、こういうことを意識してもらえればな〜」
ということが多々あります。

新人さんに意識してほしいことを、
ちょっと自分なりにまとめてみました。


※ただ、私自身もまだまだ未熟者です。
以下は自分自身に言い聞かせる意味も込めてです


コンピュータは「正しく間違っている」ということ

よく聞くのが

「合ってるはずなんですけど・・・」
「書いてある通りにやったんですが・・・」

みたいなワードです

気持ちはわかります
私も言いたくなること多いですから

でも、よほどのことがないかぎり、
コンピュータは我々人間とくらべて遥かに正確です。
我々の間違った指示通り、正確に間違ってくれるのです

まずはそこを冷静に受け止めましょう。


問題調査時は1つずつ潰していくこと

たとえば、なんらかの環境を構築する際など、
ちゃんと動かないケースがあると思います。

こういうときは、まあググって調べるのももちろん良いですが、
1つずつ潰すことで、怪しいと思われる箇所を狭めていきましょう

まずは

そもそも自分の作業工程が正確か、あらためて確認しましょう

 - 本当に1字1句正しいのか?
 - 無意識に飛ばした工程などはないか?

 意外と多いのが、調べるだけ調べてから
 「この工程が抜けない?」
 「このライブラリ入ってなくない?」
 「これファイル名違わない?」
 みたいなケースです

 私もやらかすことはあるので決して怒ったりはしませんが、
 お互いになんとも言えない悲壮感が漂います。

正しく動く環境がすでに存在する場合

環境の差異を確認しましょう。

  • 32bit/64bit機の違い : Javaなどで良くある。
  • 環境変数 : パスは通っているか?
  • ディレクトリパス : ディレクトリパスに空白などがあったりしないか?

などです

案外些細なことがキーだったりすることも多いものです

ログを見ましょう

ミドルウェアの構築などの場合、ログが超重要です。

慣れてくると当然のようにログを見るのですが、
新人の子の場合「ログを見ればいいんだ」ということを
最初は解らないようです。

「どこかにログがないか?」
ということを意識しましょう。

早めに聞きましょう

早めに質問をするのも技術です

新人である間のほうが、質問に対し快く回答してもらえます
個人的には、手が止まってしまったら質問したほうがいいと思っています。

「手が止まる」というのは、
打つ手がなくなったことを指します。

もちろん自分でやれるだけのことはやる努力はしましょう。

気軽にコピペしない

Googleなどで検索した情報を参考にするのは構いませんが、
それをすべて鵜呑みにしてしまわないようにしてください。

自分の中で「信用できる!」という理由を見つけてから使うようにしましょう

  • StackOverFlowでvoteが多く、解決済みになっている
  • 利用実績がある
  • 同一記述が複数ヒットする

などでしょうか。
これについては明確な回答はなく、感覚的な部分も多いかと思います。

内容が心配であれば有識者に聞きましょう


質問時は「できていること・いないこと」「わかっていること・いないこと」を整理しよう

うまく質問をできたほうが、解決も速くなります

以下を先に整理すると良いと思います

  1. 最終的なゴールはなんなのか?
  2. どこまではできたのか?
  3. なにができないのか?
  4. なにを試したのか?
  5. 試したことのうち効果があったもの、効果のなかったものは何か?
  6. 自分はどこまで理解しているのか・理解していないのか?

地味に6が重要だと思います

質問される側からすると、
頭の中でどこまでの引き出しを開けるべきなのか考える必要があるため、
「この子はどこまで理解済みなのだろう?」
という情報を先に知りたいものです

この頭の引き出しを探す作業は結構疲れるので、
先に理解度を伝えること自体が相手への配慮になります






ざっと思いついたのはこんな感じです。

果たして私がちゃんと出来てるのか?みたいな点もあるのですが、
とりあえず上記を意識してもらえれば、
時間を無駄にせず、先輩も優しく接してくれる(重要)のではないでしょうか

Railsチュートリアル 8章完了まで

Railsチュートリアル、8章まで完了しました

bootstrap先生のパワーもあるとは思いますが、
見た目的にもそれっぽくなってきたような気がします。

ここまでで気付いたところなど。

scaffoldって使わない?

まだ先の章を見ていないのでなんともいえませんが、
scaffoldが登場しないなとふと気づきました。

初心者向けの書籍やサイトを見ていると必ずといっていいほど

  1. rails new
  2. rails g scaffold
  3. Railsの凄さの片鱗を味わえるでしょうどうのこうの

といったパターンが多いと思います。

そういうもんなのだな、と勝手に思っていましたが、
今のところRailsチュートリアルでは出番なしです。

ふと、scaffoldって実務だと使わないのか?という考えにいたり、
調べていると、参考になりそうなエントリがいろいろと。。

RailsのScaffoldは単なるマーケティングツールで実際の開発では使わない? - QA@IT

Rails Q&A「Scaffoldで作成されるテストはそのまま使うべきか?」 - give IT a try



いまのところ
「使わないことはないけど、フル活用するわけではない」
と勝手に解釈しています。

たしかに初めてscaffoldを使ってみたときには、「すげー!』と思いましたが、
勝手にあれだけの量のソースを生成されるのは若干不気味な感じもしました。

個人的には1つずつアクションを作っていくほうが好みかも?

remember_token を追加する箇所が通らない

Userモデルに remember_tokenというカラムを増やすところで、
なんだかうまく追加できない事象に陥って少しハマりました。

結果、以下手順で解決

  1. rails sでサーバを起動している場合、一旦止める
  2. rake db:migrate:reset
  3. rake db:migrate:reset RAILS_ENV=test

ポイントは

  • いちどサーバを止める
  • test環境向けにもmigrateを流す

の2点でした。

普通にやっていれば問題なくいけるのだと思いますが、
私の場合、一度空のmigrationファイルを実行してしまってからおかしくなりました。

上記 remember_token のテストでコケる

8.18、以下テスト実行です

rspec spec/models/user_spec.rb

エラー内容

`method_missing': undefined method `its' for RSpec::ExampleGroups
::User::RememberToken:Class (NoMethodError)

原因

stackoverflow.com

itsメソッドがRspec3.0以降で消滅しているらしい。
expectを利用した形式に書き換えればokだった。

(チュートリアル内にも、"itsはこれと同義だよ!"みたいな記述はある)

ただ、ワンライナーを意識する場合には以下のように置き換えるといいっぽい

it { is_expected.not_to be_blank }

database_cleanerがインストールできない

GemfileにGithubへのURLも記載しているが、いらないっぽい

gem 'database_cleaner', github: 'bmabey/database_cleaner'

gem 'database_cleaner'

8章まで終えて

アプリ固有のモジュールってどこにおけばいいんだ?
というのがいまひとつ解ってなかったのですが、
普通にHelperに書いても良い感じなのですね・・・

viewからの参照用のメソッドのみを定義するものかと思ってたのですが、
普通にcontrollerでincludeして使っていい感じのようです。

(お仕事で利用されている方からしたらどうなのでしょう?)

とはいえ、大きいモジュールになってくると
なんでもかんでもHelperにいれてたら大変なことになりそう。

concernを使う?lib配下に置くのか?

課題として覚えておこう・・・

cmderをWindows7(64bit)に入れてみたメモ

Windows環境でRailsチュートリアルを進める中で、
Macとどうしても比較してしまうのが、ターミナルの使い勝手

基本的にgit bashを利用して全て作業していたのですが、
これを機に調べてみたところ、cmderというのがいい感じっぽい

cmder | Console Emulator

というわけで導入してみたのでメモ

インストール

zip落としてきて解凍して終了

api-ms-win-appmodel-runtime-l1-1-0.dllでエラー

Visual C++ runtime をインストール http://www.microsoft.com/ja-jp/download/confirmation.aspx?id=48145

GitBashにしたい

  1. settings
  2. Startup/Tasks > "Add default tasks..." > yes
  3. なんか色々読み込まれる
  4. settingsを閉じて、new console
  5. create new console から git bash 的なやつを選択
  6. 開ければok

その他設定

  • Main > fontはConsolasのSize15に設定
  • Main > Monospaceのチェック解除(外さないと日本語入力時にズレる)
  • Main/Size & Pos > Auto save window size and position on exit にチェック → 終了時のウィンドウサイズなどを保存
  • Startup > Autosave/restore opened tabs にチェック → 終了時状態を保存
  • Features/Colors > SchemesをMonokaiに設定 (cool)
  • Features/Transparency > Alpha transparency でいい感じに背景透過

日本語化ける

完璧にする方法は無さげ。とりあえずlsで化けなくする

  • lsの出力結果を改善

~/.bash_profileを編集

alias ls='ls --show-control-chars'

~/.vimrcを編集

以下を追加

set encoding=cp932
set termencoding=cp932
set fileencoding=utf-8
set fileencodings=utf-8,cp932

残課題

なんかvimでバックスペースが効かなくなった! (Shift押しながらだと効く)

SublimeText使うから別にいいし、と自分に言い訳して現実逃避中


というわけで、上記設定したらこんな感じに

f:id:mugi1:20150822002017p:plain

ちょっと半透明なのがcool そして普通に使いやすい。

これで引き続きRailsチュートリアルがんばろう

(しれっと6章までおわりました)

Railsチュートリアル 3章完了まで

railstutorial.jp

珍しくあまり仕事が忙しくないため、会社でこっそりRailsチュートリアルを進めています。

なんでRailsなの?というところもありますが、
おもに以下のような理由です。

  • 社内ではJava(Spring/JavaEE/Play)を主に使うので、ちょっとまったく違うものを学びたくなった
  • 個人的にはjavascriptが好きなので、スクリプト言語で攻めたかった
  • なんかcoolな気がしたから(妄想と偏見)

本を買ったりして独学で適当にやってはいたのですが、
実際に「何かつくろう!!』となると、どうしても手が止まってしまいます。

これは基礎ができていないからだな、という考えに至ったので、
とりあえずはチュートリアルを全部やってみることにしました。

現状の進捗としては3章完了まで。 ここまではわりとすぐ終わりましたが。。。

Windows環境だといろいろめんどい

以下環境で行いました。

チュートリアル内に「バージョンあわせたほうがいいよ」とあるのに
完全に無視して進める私もどうかと思いますが、
バージョン差異よりも、Windowsにはめられることが多いです。

特に以下

  • sqlite3でエラー
  • tzinfo-data でエラー

調べると色々でてきますが、
解決策としては以下

springが動かない

もはやチュートリアルの内容ではないのですが、
3章の中でSporkに関する説明が出てきます。

私は頭がおかしいので

とかいって世の中では違うのがメジャーなんじゃないの?

という発想にいたり、調べたところどうやら主流は spring だそうです。
どうしてもjavaフレームワークが頭をよぎりますが、
チュートリアルから脱線して、このspringを入れてみることにしました。

  • Gemfile
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem "spring-commands-rspec"
gem install spring
spring binstub --all

いざ!

spring status
rails g
spring status

・・・・動かない!

色々がんばってみましたがまったくダメでした。

えー、設定が悪いのか?gemが何か足りないのか?
とか色々考えたのですが、
そもそもwindowsでは動かない ということでした。

帰ってからmacで試したら一瞬で動きました。

Windowsの場合は仮想を使ったほうが色々困らないのかもしれませんね。 設定がめんどいですが。。

つづけて4章以降も進めていこうかと思います。

今使えるスキルをふりかえる

新卒から入って、プログラマとして気づけば7年目。。。

スキルの棚卸をしてみる

language

  • Java
    主にwebシステム構築。メインで利用してます。
    たまにバッチ処理などを組むこともありました

  • Javascript
    とあるプロジェクトで、丸1年間jsでのコーディングをし続けていました。 典型的なデスマーチでしたが、おかげで「え、js?コピペして使うやつでしょ?」からは脱却しました。

  • HTML

  • CSS
    上記jsと同時期にゴリゴリに組んでいました。
    CSSについては、デザインを組むというより、
    jQueryアニメーションで重い部分を置き換えるために利用したり。。

  • PL/SQL
    ORACLE手続き型言語です。
    ORACLEのwebtoolkitというものがこの世には存在しており、
    それをフルに利用したwebシステム開発時に利用していました。
    かなり変態的なことを多用しないと作れないのでとても大変。。。

  • Ruby
    趣味。たのしい

framework/library

  • Spring Framework すごい使いやすかった。なんというか、フレームワークがやりすぎてない感じが。

  • Play! Railsを趣味でやっていてその概念的な部分は理解しているつもりだったので、
    私は比較的すんなり受け入れることができました。

    が、やはりちょっと初心者にはハードルが高いような気がしました。

  • jQuery

  • jQuery-mobile 1年間一緒に戦いました。jQueryでメジャーなメソッドは大体いけるようになりました。

  • Angularjs 単体で利用していたわけではなく、ApacheCordovaを利用したハイブリッドアプリ開発時に利用しました。

  • Ruby on Rails
    趣味。たのしい(重要)

ミドルウェア

その他

こうやってみてみると、いろいろできるようになったような気もしますが、まだまだですね。

現在はRuby on Railsを利用して個人でのwebサービス提供を目指して日々開発中です。

自分の知識整理も含めて更新していく予定ですので、よろしくお願いします。