はのちゃ爆発

はのちゃが技術ネタとか日常のこととかを書いてます。

HerokuでRailsアプリのlibフォルダが読み込まれない時の対処法

に関するメモ。

背景

タイトル通りですが、Heroku上にデプロイしたRailsアプリにて、 libフォルダ以下に配置したファイルが読み込まれないという自体に遭遇しました。

いろいろと試した結果、とりあえず動くようになる方法を見つけたのでメモ。

続きを読む

Knife-Zeroの挙動がイマイチ謎な件

2016/07/19 タイトルが間違っていたので修正しました

前回の記事で

本来はfqdnもknife.rbに含めたいのですが、Vagrant仮想マシンだと上手く行かなくなる原因になります。(少なくとも初期状態の仮想マシンでは。) Knife-ZeroはVagrantとの相性があまりよくないとのことで、ノード設定ファイルに修正が必要です。

と書いたのですが、そうでもないみたいなのでちょっとメモ。

続きを読む

Knife-ZeroでVagrant仮想マシンのプロビジョニングをしてみた話

はじめに

以前からChefを使いたい欲は高かったのですが、 Chefってなかなか最初の導入までのハードルが高いと思うのは私だけでしょうか。

本来はChef ServerとChef Clientを用意してあげなきゃいけない、とか、
Chef-soloとかもあるけど今後は使わないでねって公式ブログ で言われてたりとか、
chef-clientが流行ってるみたいだけど、リモートノードの管理ができなかったりとか。

そこで便利なものがあります。Knife-Zeroです。

続きを読む

Vagrantの共有フォルダ機能が死ぬ条件を調べてみたメモ

0. はじめに

まだ原因は突き止められていません。 一つ一つやったことを書き留め、何がきっかけで共有フォルダ機能が死ぬのかを確かめたいと思います。

死ななかったら…その時はその時です。

0.1 そもそもどんなエラーか

Vagrant立ち上げ時、以下のようなエラーが出ます。

Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` workspace /workspace
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` workspace /workspace

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: Protocol error

解決策は色々ネットに転がってたりするのですが、 そのどれもが通用しなったので泣いております。

仕方がないので新たなVMを作って、環境再構築がてらトリガーを探そう、という魂胆です。

1. 手順

1.0 vagrantfileの編集

Vagrantfileを編集して、

などを行った。 前回共有フォルダが死んだ直前にした、覚えている操作はメモリの増強でした。

しかし、特にこのあたりの設定をいじっても変わりませんでした。

1.1 yum update

カーネルから何から、up直後の状態にyum updateをかけました。 これによってCentOSのバージョンが7.1から7.2に上がります。

最初はこれが原因だ!!!と思ってやったのですが、 不幸にも(?)これは原因ではなく、共有フォルダ機能はそのまま使えてしまいました。

1.2 yum install vim, yum install zsh

(この時点で既にいくつかの手順をメモし損ねていろいろすっ飛ばした感があってアレですが) お次はvimzshを入れてみました。多分関係ないけど。

これも問題なく通りました。

1.3 zshへのシェル切り替え

$ chsh -l
$ chsh /bin/zsh

切り替えたら再起動。 これまた特に問題なく共有できてしまった。もうなんなんだこれ。

1.4 oh-my-zshのインストール

1.5 rbenvのインストール

1.6 ruby-buildのインストール(ダウンロード?)

1.7 ruby(2.3.1)のインストール

1.7までやっても特に問題は発現しませんでした。 問題がないことはいいことなはずなのに納得いきません。

gitの取り消し系コマンドを調べてみた

Gitのようなバージョン管理の最大のメリットは、「何かやらかしたときにやり直せる」ことだと思います。

が、実際Gitを使うと、よく叩くコマンドはgit addgit commitgit pushgit pullぐらいなもので、 なかなか元に戻したり、取り消したりといったコマンドを使うことがないです。

使わないにこしたことはないんでしょうけど。

ですが、開発をしていると、「ちょっと今までの変更をなかったことにしたい…」なんてことは割とあります。

そこで、普段めっちゃ使うわけでもないけどたまに欲しくなる取り消し系コマンドを調べてみました。

間違ってaddしちゃったものを取り消したい

よくある取り消したい事例その1。 これの対処法はgit statusしたときに出てきてたりします。

以下のようなコマンドで戻せます。

$ git reset HEAD <FILE>

<FILE>にはaddを取り消したいファイル名が入ります。

間違えてgit add -Aとかgit add .とかやっちゃって、とりあえず全部取り消したい!って時は

$ git reset HEAD .

で全て取り消せます。安心してaddをやり直しましょう。

割と使うのに忘れやすいコマンドなので再確認。

Railsでpryを割り込ませてデバッグするメモ

Railsアプリを開発中に、ブレークポイントを仕掛けておいて処理を中断させ、 その時までの変数の状態なんかを調べたりしたいことが割とある。

それを実現する方法の1つとして、pryを使った方法がある。

使い方は簡単、ブレークポイントにしたい位置に、

binding.pry

と書くだけ。これで該当箇所まで実行されたらpryが立ち上がる。 書ける場所は結構柔軟で、RailsだとViewにも埋め込めたりする。

また、

binding.pry if hogehoge

のように書けば実行条件も指定できるので、より便利である。

更に、pry-byebugなるものを使うとステップ実行までできるようになるらしい。 だいぶ興味深いが、byebugとかMRIとか謎ワードが出てきたので後日調べる。

Ruby学習記 その1 Ruby入門

Rubyは前から何度か触ったことがあるのですが、
勉強してもあまり使わず身についていないので、今一度勉強しなおし。
気になったところ、多言語と大きく違うところなどを中心にまとめます。

画面への出力

どんなプログラミング言語でも最初に行うのは画面への出力。
Rubyでは基本的な出力用メソッドが3つあるようです。

  • print
  • puts
  • p

printは名前の通り、画面に出力対象のオブジェクトを出力する。
ただし改行などはせず、入力したものがそのまま出力される。

putsはprintと違い、改行を行うタイプの出力。

pは上記2つとは少し異なり、主にデバッグ用に使われる出力。
表示対象のオブジェクトによって出力形式が変わるとのこと。


メソッドの使い方

Ruby以外の言語(例えばC#)だと、

Console.WriteLine("Hello, World!");

みたいに、メソッド名のあとには()が必要なのが一般的な気がします。

が、Rubyでは

print("Hello, Ruby!")

も、

print "Hello, Ruby!"

でもいいらしい。慣れるまで戸惑いそうな文法である。

というか今気づいたけど、行末の";"もないのね。なんか違和感がすごい。


文字列の扱い

Rubyにおける文字列の扱いですが、基本的には""、もしくは''で囲むと文字列として扱われるのは他の言語と同じ。

""で囲んだ場合はエスケープシーケンスが処理される(\nとか\tとか)。

''で囲んだ場合は、囲まれた中の文字列がそのまま出力される。
ただしバックスラッシュそのものとシングルクォーテーションは\\,\'のようにしないといけない。


いろいろな文字列の出力のしかた

print "output test."

のような書き方が基本ですが、

print "output ", "test."

のような書き方もできる。

変数を出力する際の方法は大きく分けて二通り。

print "str1 is ", str1, "."

のように","で繋げる方法。わかりやすい。

もう一つの方法として、

print "str1 is #{str1}."

のような書き方もある。なれたらこっちの方が直感的かもしれない。

条件分岐

if ~ then, else

基本形は以下。

if int1 == 1 then
    任意の処理
else
    任意の処理2
end

thenは省略可能らしく、

if int1 == 1
    任意の処理
else
    任意の処理2
end

とも書ける。then無しのほうが多言語のif文に近い…?

while

基本形は以下。

while i < 10 do
    任意の反復処理
end

doは省略可能。このdoは無い方がわかりやすい気もするが好みか。

times

あまり馴染みのない反復処理の書き方だが、簡易forみたいなものだろうか。
基本系は以下。

10.times do
    任意の反復処理
end

繰り返し回数が決まっている場合はこれ。
もちろん繰り返し回数の指定部分は変数にもできる。
なお、doは省略不可。

コメント

コメントの書き方は重要なので絶対に押さえておく。

# test comment

i = 10

=begin
area
comment
test.
=end

puts i

#を使うと、その行の#以降がコメントとして扱われる。
また、範囲コメントは=beginと=endで囲む。
なお、範囲コメントの=beginと=endは両方とも行頭になくてはならず、
行中の一部だけをコメントアウトするようなことはできないらしい。