Vagrant上のRailsアプリをRubyMineで開発・デバッグする
やりたいこと
- Ruby on Railsの学習(開発)環境を作りたい
- 普段はIntellijを利用しているので、RubyMine(Intellij)を使いたい
- Macの環境はあまり汚さず、Vagrant上に環境を作りたい
上記の事を実現するために、色々調べて実際に環境を構築してみました。
躓いた部分がいくつかあったので、自分用にメモ
こちらの記事をかなり参考にさせていただきました。
必要なもの
- RubyMine(有償)
- Vagrant
- Virtual Box
それぞれのインストール方法は省略。(rbenvとかも)
Macであればbrew caskとかで入れればOK
Windowsの場合はよくわからないので公式ドキュメントを参考に・・・
1.まずはVagrantのBoxを用意
今回は、rails-dev-boxを利用しました。
VagrantのBox作成@host
mkdir ~/Vagrant cd ~/Vagrant git clone https://github.com/rails/rails-dev-box.git cd rails-dev-box vim Vagrantfile
Vagrantfileにprivate_networkの設定を追加
# private_networkの設定 config.vm.network "private_network", ip: "192.168.33.11"
Vagrantのプロビジョニングと起動@host
vagrant up
2.Vagrant上で新たにRailsアプリを作成
VagrantにSSH接続@host
vagrant ssh
新規railsアプリ作成@vagrant
vagrant@rails-dev-box:~$ ruby -v ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-linux-gnu] vagrant@mkdir workspace vagrant@cd workspace/ vagrant@sudo gem install rails vagrant@rails _5.0.0.1_ new sample_app
Gemfileにリモートデバッグ用のGemを追加@vagrant
vagrant@cd sample_app/
vagrant@sudo vim Gemfile
Gemfile@vagrant
#以下の設定を追加 group :development, :test do gem 'ruby-debug-ide' gem 'debase' end
Bundleをインストール@vagrant
vagrant@bundle install #失敗したのでエラーメッセージ通りに以下のgemをインストール vagrant@sudo gem install ruby-debug-ide -v '0.6.0' vagrant@bundle install
3.VagrantのRailsサーバーを起動
rdebug-ideでRailsサーバーを起動する
指定するIPアドレスはVagrantfile
に指定したprivate_network
のIPアドレスを指定する。
今回の場合、192.168.33.11
railsサーバー起動@vagrant
vagrant@rails-dev-box:~/workspace/sample_app$ rdebug-ide --host 192.168.33.11 --port 1234 --dispatcher-port 26162 -- bin/rails s -b 192.168.33.11 -p 3000
4.RubyMineで新規プロジェクト作成
まずはCreate New Project
を選択
ここではRailsのNew Applicationではなく、RubyのNew Applicationを選択
Location:プロジェクトのディレクトリ・プロジェクト名
Ruby SDK: RubyのSDK
を入力し、Create
↑のように新規にプロジェクトが作成される。
続いてVagrantへの接続情報を定義する。
Prefereces
-> Build, Execution, Deployment
-> Deployment
を選択
+
ボタンでAdd Server
メニューを開く。
Name:好きな名前
Type:SFTP
を選択してOK
Connection
タブで以下の情報を入力
SFTP host: 192.168.33.11
(Vagrantfileに定義したIPアドレス)
Port: 22
User name: vagrant
Password: vagrant
Test SFTP connection...
して接続できることを確認しておく。
続いてMappings
タブで以下の情報を入力
Local path: Macのプロジェクトのrootパス
Deployment path on server "Vagrant": vagrant上のRailsアプリのパス
入力が終わったらOK
続いて、ローカルとvagrant上のプロジェクトを同期する
Tools
-> Deployment
-> Sync with Deployed to Vagrant...
と選択する。
↑のように差分が表示されるので、Synchronize All
で同期する。
(▶▶みたいなボタン)
同期完了
続いてbundle install
Tools
-> Bundler
-> Install
を選択
※自分はsudoじゃないとパーミッションエラーとなってしまったので、Run with sudo
にチェックを付けて実行
bundle install 完了
続いてリモートデバッグ設定
Run
-> Edit Configration
を選択
+
ボタンを選択し、更にRuby remote debug
を選択
以下のようにリモートデバッグ情報を入力していく。
Remote host: 192.168.33.11
(Vagrantfileに設定したIPアドレス)
Remote port: 1234
(デフォルト値)
Remote root folder: vagrantのアプリケーションルート
Local port: 26162
(デフォルト値)
Local root folder: ローカルのアプリケーションルート
入力したらOK
適当にブレークポイントを置く
↑で設定したリモートデバッグ設定を選択して、虫のアイコンを選択
コンソールがConnectedになっていればリモートと接続OK
あとはhttp://192.168.33.11:3000/
のブレークポイントを設定した箇所にアクセスするとブレークポイントで停止してデバッグができる。
余談
rubyのSDKについて
Preferences
-> Languages & Frameworks
-> Ruby SDK and Gems
からRubyのバージョンを指定できる。
rbenvなどでVagrantとバージョンを合わせておくか、Vagrantの設定を読み込む。
Vagrantの設定を読み込むには、+
ボタン -> New Remote
でVagrantfileを選択すれば自動的に探して設定してくれる。
今回は以上。
英語学習途中経過
以前、以下の記事を描いた。
それからどうなったのかというと
なんとか続いてます。
基本的にiKnow!をひたすらやり続けています。
学習時間はそろそろ100時間に届きそうという所。
大体、週に10時間前後くらい学習できているかなという感じです。
メインはTOEIC対応コースを進めていて、470点、600点のコースは全コース実施しました。
いくつかクリアアイテムにはなっていますが、マスターは未だに0。。
やり方が悪いんでしょうか。。
しかし、学習を始める前と比べて語彙はかなり増えていると感じます。
この本を難なく読み終える事ができました。
もちろん知らない単語は沢山出てくるのですが、後ろに単語帳が付いているのでぱぱっと調べられて便利でした。
学習前だったら絶対に挫折していたと思います。。
また、学習を始めてすぐくらいの頃にTOEICも受けてみました。
学習の成果というよりは現在の英語力がどんなものかを測りたかったので。
結果はまあ、、「察し」。
Listeningがうまくいかなかった気がしていなかったけど、何故かRedingの方が低かった。
最後の15問くらいは塗り絵だったし、仕方ない。
という事で、ガチで英語ができない人という事が分かって頂けたかと思います・・
大学入試は推薦だったのでセンター試験の勉強は全くしなかったのですが、それが今になって効いてきている・・
次は10月のTOEICに申し込みました。
以下のページによると
TOEIC(R)試験の点数を上げるために必要な勉強時間 | フィリピン語学学校|フィリピン留学ならサウスピーク
TOEIC 500点から600点 ⇒ 250~300時間 と言われているので
厳しいのは承知で、600点を目標に学習を続けたいと思います。
学習コンテツは引き続き iKnowと、TOEICの公式問題集を買って解いてみようと思います。
英語学習を始めてから、エンジニアリングの学習ができていないので時々不安を覚えるものの、
やはり英語を使えることによってエンジニアのスキルアップの効率も大幅に上がると思うので
引き続き英語学習メインで頑張りたいと思います。
ようやくデバイス環境がしっくりくるようになった(気がする)
今まで色々とデバイスを手に入れたり、手放したりしてきましたがようやくしっくりくる環境になった気がするので紹介していきます。
主に使うデバイス
- Nexus 5X
- iPad Air2
http://www.apple.com/jp/ipad-air-2/
・・・はい、普通ですね。
上のデバイス達とは別に、月に1度だけ Kindle Fireでオーナーライブラリから適当に1冊読んだりします。
(オーナーライブラリはKindleデバイスからじゃないと読めないので・・)
シチュエーション毎のユースケース
外出時
基本的にはNexus5Xとモバイルバッテリーしか持ち歩きません。
(勉強会に出るなど明確な目的があるときはMacを持って行ったりしますが)
そもそも、ごちゃごちゃとデバイスを持ち歩きたくないというのが根底にあります。
昔は2台持ちとかもしていたのですが、、どうしても自分には合いませんでした。
なのでiPad Air2はWiFi版で家でしか使いません。
昔は家用のデバイスも別に・・という感じだったのでNexus6の一台にまとめようとしていたのですが、電車などで片手で扱う場合、どうしても使いにくい場合がありました。
特にパターンロック解除は辛い・・
それがNexus5Xでは、画面サイズは多少小さくなるものの、指紋認証でロック解除できるので片手でも扱いやすくなりました。
指紋認証が背面にあり、人差し指をかざすだけでロック解除できるのもグッドです。
家にいるとき
何をするかによりますが、基本はiPad Air2とMac Book Proを使っています。
主な用途はそれぞれ以下のとおりです。
大体、インプットはiPad Air2を使い、アウトプットはMac Book Proを使うという感じになっています。
iPadは布団やソファーでゴロゴロしながらインプットできるので気に入ってます。
また、iPad Air2はかなりサクサク動作するのでストレスも無いです。
Surfece Bookとかなら1台にまとめられるのかもしれないですが、今のとろこの開発環境としてはWindowsよりMacの方が快適なので暫くはこのまま様子見という感じ。
どうせまた買い換えるんじゃないの?
かもしれません。
が、今の所はこの環境が一番自分には合っているなという感じです。
Nexus5Xのスペックはミドルレンジじゃん と思うかもしれませんが、自分の用途では充分なスペックです。
(ゲームをする人は、iPhone6sや5SE、Galaxy S7Edgeなんかがいいのかもですが、、)
毎月Googleからセキュリティパッチを受けられるというのも自分には欠かせない要素です。
なので、今後買い換える可能性があるのは、
- Nexusシリーズ後継機
くらいかなと思っています。
(あくまで個人の見解です)
また、iPhone7で本当に「後から振り返った時に『これなしでどう生きていたんだ?』と思うようなもの」が実装されるのであれば考えるかも。
iPhoneは非常に高価なのでよっぽどの事がないと買い換えないですが、、
また、iPad Air2はもう完成度が高いのでこちらもしばらくは使えそうです。
iPad Pro 9.7インチも自分にとってめぼしい物は無かったので。
あまりまとまりがない内容になりましたが、ようやく長く使えるデバイス環境が揃ったので、しっかり愛用していきたいと思います。
そういえばPlayStation VRは9時前からAmazonに張り付いていたのですが、以下の手口にやられました。
おかげで少しVR熱が冷めたので、発売後のレビューなんかを見てじっくり考える事にします。。。
重い腰を上げて英語の勉強を始めた
英語の勉強、始めました。
これまでも何度か英語の勉強をしようと思って参考書を買ったりしたこともありましたが、結局は3日坊主になってしまい、全く継続できませんでした。
とはいえ、転職する前に比べると英語を目の前にしても逃げたくなる気持ちが減ってきたように思います。
以前は技術的な課題に直面したとき、Google検索で1番上に表示されるStackOverflowあたりは華麗にスルーして、日本語の記事を探して読んでいました。
今思うと、無駄な時間を過ごしていたのでは・・と考えてしまいます。
今のレベルは?
今はどの程度のレベルなのか・・と言われると、StackOverflowなんかはなんとなく意味が理解できるかな・・という程度です。
コード例も乗っていたりするので、「あーそういう事か」とはなるのですが、本質が理解できていない事も・・・。
TOEIC受けたら悲惨な事になりそう。。
そもそも英語学ぶ理由って?
英語のドキュメントを読みたい
新しい技術はドキュメントが英語のみという事が殆どです。
キャッチアップしていくためにも、英語のドキュメントが読めるだけのスキルは必須。
(遅れて日本語翻訳されたりもしますが、大体最新の内容じゃなかったり、既に乗り遅れてしまっていたり。。)
英語でコミットコメントやissueを書きたい
GitHubが登場してから、以前にも増して世界中でOSS開発が活発に行われるようになりました。
気軽にブランチをforkしてpull requestを投げたり、issueを上げたりできるようになったものの、やり取りする為の言語は基本的に英語です。
読めばある程度理解できるけど、、日本語から英語に翻訳して書くときにしょっちゅう手が止まってしまい、自分の伝えたい事が表現できていないなーという歯がゆさがありました。
エンジニアは英語できて当然だよねという風潮
最近益々、「エンジニアは英語できないとね」という風潮が高まっていると感じるようになりました。
SIerにいたときから騒がれていたと思いますが、その頃は殆どが国内の仕事でオフショア先は中国でした。更にオフショア先の方々は日本語が喋れる人が多かったので、それに甘んじており、自分には関係ないことだ・・と逃げていたような気がします。
今は受託開発からサービスを提供する側になったことで、以前よりもエンジニアとしてのスキルを求められるようになりました。
また、SOFT SKLLSを読んで、自己ブランディングをする上でも英語は必要だな・・と感じるようになりました。
日経BP書店|商品詳細 - SOFT SKILLS ソフトウェア開発者の人生マニュアル
三日坊主だったのに続くの?
ちゃんと続けられそうと思うまでにいくつか続かなかったのも事実です。
まずは単語暗記系の参考書やアプリを少し試してみました。
しかし、「ちゃんと覚えた」という実感を持てないなど、モチベーションの維持にはつながりませんでした。
続いて、Grammar in Use
こちらは文法の説明なども全て英語ですが、難しい単語はあまり出てこないので意味もなんとなく理解できます。
しかし、自分にはまだ少し早かった印象です。
レベルを上げて再度チャレンジしたい所・・・
もう少し基礎をやろうと思い、続いてはこちらをやりました。
Amazon.co.jp: 中学・高校6年間の英語をこの1冊でざっと復習する: 稲田 一: 本
ざっと流し読みし、終了。
復習するには良かったと思います。
続いて瞬間英作文
こちらはまだ途中なのですが、寝る前に少しづつ進めています。
始めたばかりなので、効果はこれから・・
で、最終的にiknowに行き着きました。
実はこれ、有料です。
- 1ヶ月プラン 1,480円/月
- 6ヶ月プラン 980円/月
- 12ヶ月プラン 780円/月 (6/13までに申し込むと25%OFFで585円/月)
せっかくなので、ちゃんと続ける!と願いながら12ヶ月プランにしました。
(後で知ったのですがDMM英会話のユーザは無料で使えるようです・・)
何が自分に合っていると思ったかというと、以下の点です。
- 複数の端末で学習できるため、場所や時間に応じて利用しやすいという点。
- 本とか持ち歩かなくていいし。
- 目的やシーンに合わせてコースを選択できる。
- 自分はTOEIC600コースにしました。
- 単語・センテンス全てに音声がある
- 単語ごとに複数のセンテンスが用意されている
- 自分の学習状況が表示されるようになっており、続けようと思える
↓こんな感じでコース内の進捗が確認できます。
とりあえず、iknowで暫く学習して効果を見ていきたいなと思います。
もっと学生時代にちゃんと学んでおけば良かったと後悔・・・
たった数日でFire TV Stickを箱に戻した
先日、AmazonのセールでFire TV Stickを購入しました。
購入した主な理由はプライムビデオを大画面のTVで見たい
見るものがなくなったらいずれはNetflixあたりも。。
という感じです。
が、「本日、ネットでPS4でプライムビデオを見ることができる」ということを知りました。。。
また、最近のテレビでは最初から対応しているようです。
というわけで、早速帰宅してからPS4で試してみました。
アプリをダウンロードしてAmazonアカウントでログインすると何事もなくプライムビデオを視聴することができました。
PS4はスペックもFire TV Stickよりはるかに良いので、サクサクです。
さらにコントローラーも持ち慣れている上にスタンバイモードからの起動も一瞬です。
というわけで、今後はPS4でプライムビデオを見ることにしました。
Fire TV Stickは、、帰省したときにでも実家に置いてこようと思います。
Fire TV Stick購入!
Fire TV Stickを購入しました。
http://www.amazon.co.jp/Amazon-W87CUN-Fire-TV-Stick/dp/B00ZVNYLS8
以前はChrome Castを使用していました。
Chrome CastからFire TV Stickに切り替えた理由としては以下の通りです。
- Fire TV Stickがセールで安くなっていた
- Chrome CastはAmazon Prime Video非対応
- Fire TV Stickはリモコン付き
- YouTubeはあまり見ない
Prime会員なので、オーダーした翌日には到着しました。
パッケージはこんな感じです。
外のパッケージを外すと意外に地味なパッケージ
蓋を開けると、リモコンとFire TV Stick本体。
音声入力機能は特に必要なかったので通常のリモコン版です。
さらにその下には、
- 説明書
- 電源アダプタ
- USBケーブル
- 電池
- HDMI延長ケーブル(USBケーブルの下に入っています)
が入っていました。
電池が入っているのは親切です。
安っぽさが無いのは好印象でした。
実際にテレビに接続してWi-Fiのセットアップまですると、自分のAmazonアカウントと紐付けされていました。
Fireタブレットもそうですが、一体どうやっているんだろう・・
オーダー時にシリアルIDか何かと紐付けているんでしょうか・・
ともあれ特に難しい設定もなく、40インチのテレビでPrime Videoを見ることができるようになりました。
画面が大きいと画像が荒くなるかなと懸念していましたが、通信回線が安定していればそんなこともなくキレイな映像が楽しめます。
Prime Videoは作品が少ないと言われていますが、見たい作品は沢山あるので自分としては満足です。
そのうち、見たいものがなくなってきたらNetflixあたりを検討するかもしれません。
それもFire TV Stickがあれば楽しめるので気兼ねなく利用できそうです。
とりあえず、弱虫ペダルを全部観ようと思います。
Android学習(DI・DB編)
前回↓に引き続き、mixiのAndroidTrainingで時間を見つけてはAndroid開発について学んでいます。
今回は、2.基礎編 10.データベースの項です。
RDBは仕事でも使うので、取っ付きやすい章でした。
せっかくなので、SQLiteOpenHelperではなくORMを利用してみることにしました。
Android用のORMは色々なライブラリが公開されていましたが、今回はAndroid Ormaを利用してみました!
GitHub - gfx/Android-Orma: A lightning-fast ORM for Android as a wrapper of SQLiteDatabase
また、作者の方が公開しているチュートリアルを参考にさせていただきました。
その中で、OrmaDatabase
クラスのインスタンスをDIで@Singleton
をおすすめとの記述があったので、合わせてDagger2にも挑戦してみることにしました。
Dagger2については、こちらの記事を参考にさせていただきました。
Dagger2 導入Step By Step - Qiita
依存ライブラリ等の定義
プロジェクト直下のbuild.gradle
に
- repositoryにmavenCentralを追加
- dependenciesにaptの定義を設定
repositories { jcenter() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:2.1.0' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' }
続いてプロジェクト/app下のbuild.gradle
の依存関係に
- Dagger2の定義を追加
- Ormaの定義を追加
以下のような順に追記しました。
dependencies { ・・・ compile 'com.google.dagger:dagger:2.0.2' apt 'com.google.dagger:dagger-compiler:2.0.2' provided 'javax.annotation:jsr250-api:1.0' apt 'com.github.gfx.android.orma:orma-processor:2.4.7' compile 'com.github.gfx.android.orma:orma:2.4.7' }
Moduleクラスの作成
import部分等は省略していますが、こんな感じで作ってみました。
OrmaDatabaseもここで@Singleton
で定義しています。
@Module public class ApplicationModule { private final Application application; public ApplicationModule(Application application) { this.application = application; } @Provides @Singleton Context provideApplicationContext() { return application.getApplicationContext(); } @Singleton @Provides public OrmaDatabase provideOrmaDataBase(Context context) { return OrmaDatabase.builder(context).build(); } }
ComponentInterfaceの作成
@Singleton @Component(modules = ApplicationModule.class) public interface ApplicationComponent { void inject(MainActivity mainActivity); }
Applicationクラスの作成
public class MainApplication extends Application { private ApplicationComponent applicationComponent; @Override public void onCreate() { super.onCreate(); initializeInjector(); } private void initializeInjector() { applicationComponent = DaggerApplicationComponent.builder() .applicationModule(new ApplicationModule(this)) .build(); } public ApplicationComponent getApplicationComponent() { return applicationComponent; } }
AndroidManifest.xml
にも忘れずに定義します。
<application android:name=".MainApplication" ・・・> ・・・ </application>
実際にDIしてみる
以下の様な感じでApplicationComponent
を取得してinjectメソッドを実行することで、@Inject
と定義しているormaにDIすることができました。
public class MainActivity extends AppCompatActivity { @Inject OrmaDatabase orma; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getApplicationComponent().inject(this); } private ApplicationComponent getApplicationComponent() { return ((MainApplication) getApplication()).getApplicationComponent(); } }
Ormaを利用してDBを扱う
テーブルは課題に合わせて以下の様な感じで作りました。
アノテーションで属性等を定義できるので分かりやすいです。
@Table public class AndroidCodeName { @PrimaryKey(autoincrement = true) public long id; @Column(indexed = true) public String name; @Column @Nullable public String version; public static AndroidCodeName_Relation relation(OrmaDatabase orma) { return orma.relationOfAndroidCodeName().orderByIdDesc(); } }
今回はinsertとselectだけ載せておきます。
insertはこんな感じ。
private void insert() { AndroidCodeName androidCodeName = new AndroidCodeName(); androidCodeName.name = appNameEditText.getText().toString(); androidCodeName.version = appVersionEditText.getText().toString(); orma.insertIntoAndroidCodeName(androidCodeName); Toast.makeText(MainActivity.this, "insert success", Toast.LENGTH_SHORT).show(); }
さらにselect
private void select() { AndroidCodeName_Relation relation = AndroidCodeName.relation(orma); // Relationを利用してデータを取得 Log.d(TAG, "from Relation"); for (AndroidCodeName androidCodeName :relation) { Log.d(TAG, androidCodeName.name + ":" + androidCodeName.version); } // Helper経由でデータを取得 Log.d(TAG, "from Helper"); AndroidCodeName_Selector selector = orma.selectFromAndroidCodeName() .orderByIdAsc(); for (AndroidCodeName androidCodeName : selector) { Log.d(TAG, androidCodeName.name + ":" + androidCodeName.version); } }
今回はDaggerでOrmaDatabaseをDIする所を中心に挑戦してみましたが、OrmaがRxJava用のインターフェースを備えているようなので、RxJavaを絡めて学んでみたいなと思います。
※RxJavaも触ったことがありません。。
Android開発者は今から始めると学ぶことが多いですね。。