ざっくりん雑記

プログラミングで忘れそうなことをひたすらメモる

Unix上にいつものGit, GitHub環境をつくる

Vagrantなどで新しい仮想環境(Unix)を作るたびにGitの初期設定、GitHubとのSSH設定をぐぐってるような気がするので、記事としてまとめます。

環境について

  • OS X El Capitan ver.10.11.6
  • ターミナル(bash)

Gitをインストールする

$ sudo yum install git
...
インストール:
  git.x86_64 0:1.8.3.1-6.el7_2.1

依存性関連をインストールしました:
  libgnome-keyring.x86_64 0:3.8.0-3.el7             perl-Error.noarch 1:0.17020-2.el7
  perl-Git.noarch 0:1.8.3.1-6.el7_2.1               perl-TermReadKey.x86_64 0:2.30-20.el7
  rsync.x86_64 0:3.0.9-17.el7

完了しました!

git config 関連を設定する

これを設定しなくても致命的な問題はないですが、GitHub上でアカウントに紐付くEmailをローカルのGitに設定しておくことで、誰がコミットしたものなのかが判別できるようになります。(Git - アカウントの準備と設定

# 名前を設定する
$ git config --global user.name konnobu

# メールアドレスを設定する
$ git config --global user.email konnobu@email.com

# いい感じに出力をカラフルにする
$ git config --global color.ui true

GitHubと通信するためにSSH設定をする

鍵を作る

$ ssh-keygen -t rsa -C "your_mail_address@email.com"

Generating public/private rsa key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/vagrant/.ssh/id_rsa.
Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub.
The key fingerprint is:
a2:ee:0c:0c:f8:98:11:a1: your_mail_address@email.com
The key's randomart image is:
+--[ RSA 2048]----+
|.                |
|..               |
|.o..             |
|+.+dw            |
|.O..=...         |
|adsaw.. o        |
|   +. o .        |
+-----------------+

途中で、3回ほど任意のキーワードを入力する必要がありますが、基本的に何も入力せずにエンターのみで進んで大丈夫です。(ただ、パスフレーズを登録したほうがより安全とGitHubは言っています。)

鍵(公開鍵)を確認してコピーする

次に、鍵ができたので公開鍵を確認します。 場所は先程の鍵を作ったときにYour public key has been saved in /home/vagrant/.ssh/id_rsa.pub.というようになっているので、これをcatで出力します。

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCrBHfcckGtnkj3N/8mzADcjMsPmh71BuUdwlokkvf7tzpn+R5jHzkKZnEcdbtrwYzrCxMOnrUXXM69gdxFBUCGl+zsDs0XEVMA3tRYEf3OISZAUw2UnVWlu7e8n28YqIZHuVAu5E/92l2zzpKDKuXNjY/dgcZ0jOzaKV2hQxYx84d7NgobQT1IsKyywaNlvdXkv09Y1zC8hF7f4br6iauXtFGC8RWlXcK26FsF6WqJDzX/4ucv6XrdpW2HcA/Nz/mr46/k4M/iA75L52w5JuFjftr81NoCbV2vzg8aDiYj26WInYxAyh4ZGKlEDVbHPhZ6Dq4/en7Wc7uio3NRf7yt "your_mail_address@email.com"

公開鍵の中身がバーっと表示されるので、これをまるっとコピーします。(ssh-rsa ... @email.com"の部分)

GitHub上に鍵を登録する

次に、GitHubにアクセスし、設定画面のSSH keysを表示します。

すると、以下のようなフォームがあるので、Keyには先ほどコピーした内容をペースト。Titleにはその鍵の環境名などを入力すると複数環境がある場合だと区別しやすくなります。

f:id:azuuun:20160730001654p:plain

Add SSH keyで登録します。

SSH接続ができるか確認する

以下を入力するとGitHubとのSSH通信を試行します。

$ ssh -T git@github.com

すると以下のように聞かれるので、yesでエンター。

The authenticity of host 'github.com (192.30.253.112)' can't be established.
RSA key fingerprint is 16:27:ac:a5:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes

Hi!と返ってきたら成功です。

Hi Konnobu! You've successfully authenticated, but GitHub does not provide shell access.

お疲れ様でした!

参考

GithubのSSH通信設定 - Qiita

Macでrmagickのbundle installに失敗したときの対処

エラー内容

Installing rmagick 2.15.4 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/azunobu/.rbenv/***/rmagick-2.15.4/ext/RMagick
/Users/azunobu/.rbenv/versions/2.3.0/bin/ruby -r ./siteconf20160704-56813-17nbb4t.rb extconf.rb
checking for clang... yes
checking for Magick-config... no
checking for pkg-config... yes
Package MagickCore was not found in the pkg-config search path.
Perhaps you should add the directory containing `MagickCore.pc'
to the PKG_CONFIG_PATH environment variable
No package 'MagickCore' found
checking for outdated ImageMagick version (<= 6.4.9)... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
    --with-opt-dir
    --without-opt-dir
    --with-opt-include
    --without-opt-include=${opt-dir}/include
    --with-opt-lib
    --without-opt-lib=${opt-dir}/lib
    --with-make-prog
    --without-make-prog
    --srcdir=.
    --curdir
    --ruby=/Users/azunobu/.rbenv/versions/2.3.0/bin/$(RUBY_BASE_NAME)

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Users/azunobu/.rbenv/***/rmagick-2.15.4/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /Users/azunobu/.rbenv/***/gems/rmagick-2.15.4 for inspection.
Results logged to /Users/azunobu/.rbenv/***/rmagick-2.15.4/gem_make.out

解決方法

  1. $ brew install imagemagick
  2. $ bundle install
  3. Bundle complete!

参考

stackoverflow.com

Rails - Viewでデバッグするならdebug

Viewをいじる時のデバッグ

Rails歴1ヶ月弱、きょうViewをいじっているときに便利だ!となって嬉しくなったメソッドdebugを備忘録で残しておきます。

使い方はすごくかんたんで、インスタンス変数であれば

<%= debug @item %>

これだけで、変数値やパラメータ値が見やすく表示することができます。

また、開発中のみデバッグの値を表示したいといった場合は

<%= debug @item if Rails.env.development? %>

と 後置ifを使います。

参考

Debugging Rails Applications — Ruby on Rails Guides

ruby-rails.hatenadiary.com

Rails - link_toでブロックを囲む

リストの要素全体をaタグで囲みたいパターン

リスト一つ一つのブロックをaタグで囲んでクリッカブルにしたい場合はよくある。下のような感じ。

<a href="url">
  <div class="content">
    <div class="inner-left">
      ...
    </div>
    <div class="inner-right">
      ...
    </div>
  </div>
</a>

link_toメソッド

結論から言うと、カッコつき link_to の後ろに do をつけて、 閉じ end で、ブロックを囲める。

<%= link_to(item_path(item), class: 'list-content') do %>
  <div class="content">
    <div class="inner-left">
      ...
    </div>
    <div class="inner-right">
      ...
    </div>
  </div>
<% end %>

参考

link_to - リファレンス - - Railsドキュメント

Ruby - メソッドの種類

Rubyメソッドの種類

主に大きく分けて、レシーバによって、3種類に分けることができる。

レシーバとは

ちなみに、レシーバ(receiver)というのは、以下のメソッドを呼び出す構文のオブジェクトを指す。

オブジェクト.メソッド名(引数1, 引数2, …, 引数n)

なぜかというと、オブジェクト指向の考え方として、メソッドを実行することをオブジェクトにメッセージを送る、その処理結果として、オブジェクトはメッセージを受け取る(receiveする)と考えるから。

インスタンスメソッド

メソッドの種類として最もメジャーなもの、インスタンスメソッド。オブジェクト(インスタンス)自身がレシーバとなる。クラスの中にメソッドを定義した場合、基本的にインスタンスメソッドとなる。

p "maguro,100,2016-4-14".split(",")    #=> ["maguro", "100", "2016-4-14"]
p ['sushiro', 'kappazushi', 'hamazushi'].index('sushiro')    #=> 0
p 100.to_s    #=> "100"

上の文字列、配列、数値がそれぞれレシーバになっている。そのオブジェクトが持っているインスタンスメソッドは各オブジェクトクラスによって処理が書かれている。

クラスメソッド

レシーバがインスタンスではなく、クラスそのものであった場合、それはクラスメソッドという。主にインスタンスを生成する際によく使われる。

Array.new    # 新しい配列を生成
Array["maguro", "salmon", "ikura"]    # 要素を持った配列を生成

クラスメソッドの呼び出し方には二通りがあって、.(ドット)::(ダブルコロン)で、どちらも意味。

クラス名.メソッド名
クラス名::メソッド名

同じ意味ではあるが、定数アクセスにも::を使用するため、メソッド名が大文字から始まっている場合、それは定数としてみなされかねない。 そのため、メソッド名には全て小文字で命名することを留意した上で、明示的にメソッドであることを示す場合はクラス名::メソッド名()というようにメソッド名の後ろに()を付加する。

関数的メソッド

最後に、レシーバがない関数的メソッドがある。ない、というと語弊があって、正確には省略されているだけ。 これらの関数的メソッドは全てのクラスからアクセス可能な、Kernelモジュールに備わっている。

例として

puts "sushi"    # sushiを出力する
sleep(5)    # 指定された秒数分, 処理を中断する

上に示したような関数メソッドは、レシーバの情報を必要としない。

参考

たのしいRuby 第5版

たのしいRuby 第5版

特異クラス・特異メソッド・メソッドの種類 Ruby - Qiita

www.task-notes.com

Ruby - 繰り返しいろいろ

おもな繰り返し構文・メソッド

times

繰り返したい処理の回数が既に決まっている場合に使用すべきメソッド

基本構文

繰り返し回数.times do
    処理
end

また、doを省略して{}で囲ってあげる書き方も可能。これは、eachも同じですね。

繰り返し回数.times {
    処理
}

timesの処理の中で、何度目の処理かを知るためには、以下のように書けば、指定した変数に繰り返し回数が数値で参照できるようになる。

繰り返し回数.times do |変数| 
    処理
end

具体的に書くと、以下の様なかたち。

5.times do |i|
    puts "#{i}:進捗どうですか"
end
0:進捗どうですか
1:進捗どうですか
2:進捗どうですか
3:進捗どうですか
4:進捗どうですか

for文

特徴的な点としては、範囲オブジェクトを使用する(in 開始時数値..終了時数値がそれ)と開始時の数値と終了時の数値を直感的に指定できる。でもRubyでfor文ってあまりメジャーではないっぽい。

基本構文

オーソドックスなfor文
for 変数 in オブジェクト do
    処理
end

doは省略できる。 オブジェクトには配列やハッシュを指定できる。

sushi = %w(まぐろ いくら たまご サーモン しめさば)
for neta in sushi
    puts "時速120kmで#{neta}が流れてきた!"
end
時速120kmでまぐろが流れてきた!
時速120kmでいくらが流れてきた!
時速120kmでたまごが流れてきた!
時速120kmでサーモンが流れてきた!
時速120kmでしめさばが流れてきた!
範囲オブジェクトを使ったfor文
for 変数 in 開始時数値..終了時数値
    処理
end

例として50から100までの数値を加算するfor文を書くと以下の様なかたち。

sum = 0
for i in 50..100
    sum += i
end

p sum    #=> 3825

while文

作り方によってどのようなタイプの繰り返しでも対応できるwhile文。

基本構文

while 条件 do
    処理
end

doは省略可能。 whileは他言語と同様に条件が成り立っている間はループし続ける

i = 0
while i < 5
    puts "寿司をたべた。(#{i}個目)"
    i += 1
end
寿司をたべた。(0個目)
寿司をたべた。(1個目)
寿司をたべた。(2個目)
寿司をたべた。(3個目)
寿司をたべた。(4個目)

iを1ずつ加算しないと大変なことになる(わりと忘れやすい)、for文で範囲オブジェクトを使ったほうが直感的でわかりやすいので、こういった場合はfor文を書いたほうが良さそうです。

until文

if文に対してunless文があるように、while文に対してuntil文がある。 until文は条件が成立するまで繰り返す

基本構文

until 条件 do
    処理
end

doは省略可能。 さきほど書いたwhile文の例をuntil文に書き直してみる。

i = 0
until i >= 5
    puts "寿司をたべた。(#{i}個目)"
    i += 1
end
寿司をたべた。(0個目)
寿司をたべた。(1個目)
寿司をたべた。(2個目)
寿司をたべた。(3個目)
寿司をたべた。(4個目)

カウンタの処理が寿司を食べた後にあるため、iが5になったときは既に寿司を5つ食べていることに注意する。いっつも何回かデバッグして確認してフィーリングで合わせていくことが多いけど(ちゃんと考えよう)。

eachメソッド

azuuun-memorandum.hatenablog.com

既に記事としているため、省略。

loopメソッド

終了条件のないループ、究極までに無駄が削ぎ落とされたシンプルな繰り返しメソッド。ただそれゆえに、終了しないのでbreakしないと死ぬ。もし、繰り返しが止まらなくて涙目状態になった場合、[Ctrl] + Z[Ctrl] + Cで終了させることができる。

基本構文

loop do
    処理
end

主に繰り返しを制御するための命令としてbreaknextがある(正確にはredoもあるが、使われない)。

  • break
    • 繰り返しを中断して, 繰り返しの中から抜ける
  • next
    • 次の回の繰り返し処理に飛ぶ

まとめ

ここで取り上げた繰り返し文やメソッドをその時々でベストなものを選択し、使うことが重要になる。

  • 回数が決まっている! => times
  • オブジェクトから要素を取り出して使いたい! => for, each
  • 条件を自由に指定したい! => while
  • こうなったら抜けろ!という条件のときに => until
  • 回数制限がない! => loop

参考

たのしいRuby 第5版

たのしいRuby 第5版

www.task-notes.com

Ruby - 多重代入

一般に代入を行うときはa = 1というように一つの変数に代入することがほとんどであるが、変数への代入を複数まとめて行うことも可能で、これを多重代入と呼ぶ。

基本的な多重代入

a = 1
b = 2
c = 3

以上の代入を多重代入に書き直すと、

a, b, c = 1, 2, 3

というようになる。ただ、闇雲に一行で書けて楽だ〜といって多重代入を使うよりは、変数の使いドコロが似ている(関連性のある)ものをまとめて、多重代入をすることが必要だと思われる。

いろいろな多重代入

多重代入で配列を代入したい

配列で格納したい変数名の前に*(アスタリスク)を付けると、その変数より後ろの値が配列形式で代入される(該当する値がない場合はnilが代入される)。

a, b, *c = 1, 2, 3.0, 3.2, 3.4, 3.6, 3.8
#=> [1, 2, [3.0, 3.2, 3.4, 3.6, 3.8]]

変数の値を入れ替える

変数の入れ替えでよく使われるスニペット

a, b = 1, 0
tmp = a
a = b
b = tmp

という一時退避のtmpを使ったものがあるが、Rubyではすっきりと書ける。

a, b = 1, 0
a, b = b, a
p a, b    #=> [0, 1]

配列の要素を変数に落としこむ

以下のように書くと、

array = [1, 2, 3]
a, b, c = array

配列の各要素を左辺の変数に落とし込んでくれる。

p a    #=> 1
p b    #=> 2
p c    #=> 3

先頭だけ取り出したいときは、先頭を格納したい変数の後ろに,(カンマ)を付けると、先頭要素を代入してくれる。

array = [1, 2, 3, 4, 5]
a, = array
p a    #=> 1

複数の戻り値を返し, 受け取りたい

多重代入の使いどころの一つとして、戻り値に多重代入を利用することがある。

def calc(num1, num2)
    values = Array.new
    values.push(num1 + num2)
    values.push(num1 - num2)
    values.push(num1 * num2)
    values.push(num1 / num2)

    return values
end

add, sub, multi, div = calc(10, 2)

puts "加算:#{add}, 減算:#{sub}, 掛算:#{multi}, 割算:#{div}"
加算:12, 減算:8, 掛算:20, 割算:5

加算, 減算, 掛算, 割算を一気に行うメソッド(これが適当かはどうか別として)があったとして、4つの計算結果を一気に戻り値として戻したい場合に配列として渡す。

受け取り側は、戻り値に対応する任意の変数で受け取ることで、複数の戻り値を受け取れている。

参考

www.rubylife.jp

たのしいRuby 第5版

たのしいRuby 第5版

Rubyの多重代入について -- ぺけみさお