はじめてのGit①-Gitbucket- 初歩的なGitコマンド

Gitとは

ファイルを何度も書き換えてその都度コピーを保存しておくと管理が煩雑になってしまう。Gitはファイルの更新履歴を都度保存し行ったり来たりできるバージョン管理システムのこと。原則GitHubはオープンでBitbucketはクローズで利用される。

Gitの仕組み概観

ローカルリポジトリとリモートリポジトリが存在する。リポジトリとは変更履歴が保存される場所のこと。ローカルは個人のPCにありリモートは複数人で共有するサーバーにある。リモートリポジトリを変更すると全員に影響があるがローカルをいじっても他人に影響はない。ローカルリポジトリに変更分をコミットしてそれをリモートリポジトリにプッシュすることで変更点を共有する。コミットとは変更分をリポジトリに保存することで、プッシュとはローカルにコミットされたものをリモートリポジトリに共有する事を言う。逆にリモートからローカルに変更分を受け取ることをプルという。

Gitの基本的なコマンド

すでにリモートリポジトリがある場合はまずローカルに現状のファイルを複製できる。

git clone <対象URL>

これで対象リポジトリの情報をローカルリポジトリにコピーできる。

作業ディレクトリでファイルを変更してコミットするのだが、もう1ステップある。

git add <対象ファイル>

このコマンドでコミットしたいファイルをインデックスという場所に登録する。その後コミットすることができる。

git commit -m "任意のコメント"

ここまでがローカルリポジトリ内での作業。最後にプッシュしてコミットを共有する。

git push <対象リポジトリ> <branch>

ActiveRecordでMySQLをRuby単体で扱う

RubyプログラムからMySQLにアクセス

まずMySQLにアクセスする

require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter:  "mysql2",
  host:     "host_name",#ホスト名
  username: "user_name",#ユーザー名
  database: "database_name",#データベース名
)

すでにあるテーブルにレコードを追加する

既存のusersというテーブルに新しくレコードを追加する。

class User < ActiveRecord::Base
end

User.create(id: 1, name: "John", age: 30, gender: "male")

ActiveRecord::Base(Rails 5ではApplicationRecord)からクラス継承するだけで扱える。 クラスの複数形がテーブル名になる(今回はUser→users)。 createメソッドは直接レコードを記述できる。

テーブルのレコードを読み込む

people = User.all #テーブルのすべてのレコードを読み込む

person = User.where(gender: "male")#特定の属性をもつレコードだけ読み込む

他にも順序を指定する.order(:age)など色々メソッドが用意されている。

RubyでのJSONの書き込み

JSONファイルにRubyで書き込む

まずFile.openで書き込んでみる 標準入力からタブ切りテキストファイルを読み込んでJSONファイルに書き込む

require 'json'

people = Array.new
STDIN.each_line {|line|
  people << line.chomp.split("\t")
}

key = ["name","gender","age"]
ary = {}
people2 = []
people.each{|person|
  ary = [key,person].transpose.to_h
  people2 << ary
}

File.open("meibo.json","w") {|file| 
  file.puts people2
}
{"name"=>"john", "gender"=>"m", "age"=>"18"}
{"name"=>"paul", "gender"=>"m", "age"=>"20"}
{"name"=>"alice", "gender"=>"f", "age"=>"15"}
{"name"=>"dabid", "gender"=>"m", "age"=>"17"}
{"name"=>"jasmin", "gender"=>"f", "age"=>"17"}

meibo.jsonにそれっぽいものが書き込まれたがJSON形式かどうか以下のサイトで確認してみる jsonlint.com

結果

Error: Parse error on line 2:
{   "name" => "john", "gender" 
---------^
Expecting 'EOF', '}', ':', ',', ']', got 'undefined'

JSONとは認識されなかった

JSONライブラリを使って書き込んでみる

require 'json'

people = Array.new
STDIN.each_line {|line|
  people << line.chomp.split("\t")
}

key = ["name","gender","age"]
ary = {}
people2 = []
people.each{|person|
  ary = [key,person].transpose.to_h
  people2 << ary
}

File.open("meibo.json","w") {|file| 
  file.puts(JSON.generate(people2))
}
[{"name":"john","gender":"m","age":"18"},{"name":"paul","gender":"m","age":"20"},{"name":"alice","gender":"f","age":"15"},{"name":"dabid","gender":"m","age":"17"},{"name":"jasmin","gender":"f","age":"17"}]

再び確かめると

Valid JSON

JSONと認識された 自分で何とかするよりライブラリを使ったほうが無難

RubyでのJSONの読み込み

JSONファイルをrubyで読み込む

まずFile.openだけで読み込んでみる

File.open("meibo.json"){|file|
p file.read
}
"[{\"name\":\"john\",\"gender\":\"m\",\"age\":\"18\"},\n {\"name\":\"paul\",\"gender\":\"m\",\"age\":\"20\"},\n {\"name\":\"alice\",\"gender\":\"f\",\"age\":\"15\"},\n {\"name\":\"dabid\",\"gender\":\"m\",\"age\":\"17\"},\n {\"name\":\"jasmin\",\"gender\":\"f\",\"age\":\"17\"}]"

文字列オブジェクトとして扱われる

JSONライブラリを使って読み込む

require 'json'
File.open("meibo.json"){|file|
f = JSON.load(file)
p f
}
[{"name"=>"john", "gender"=>"m", "age"=>"18"}, {"name"=>"paul", "gender"=>"m", "age"=>"20"}, {"name"=>"alice", "gender"=>"f", "age"=>"15"}, {"name"=>"dabid", "gender"=>"m", "age"=>"17"}, {"name"=>"jasmin", "gender"=>"f", "age"=>"17"}]

配列オブジェクトとして扱われる

Ruby 配列のソート

配列のソート

配列を何かの条件でソートするにはsort_byメソッドを使う。sort_byメソッドはブロックを使って要素をソートした配列を返す。

list = ["David", "Alice", "Bob",  "Carols"]
p list.sort_by { |name| name.size }
["Bob", "David", "Alice", "Carols"]

今回は名前の文字数が少ない順にソートした。

配列の中の配列のソート

名前、性別、年齢の情報が入った配列を年齢の順にソートしたい。

list = [["alice", "f", "15"], ["david", "m", "17"], ["jasmin", "f", "17"], ["john", "m", "18"], ["paul", "m", "20"]]

list.sort_by! { |person| person[2].to_i }
list.each { |person| puts person.join("\t") }

今回もsort_byメソッドを使う。ブロック内変数のpersonにはlistの要素、つまり各個人の情報が入った配列が代入される。 joinメソッドは配列の各要素を、引数を区切り文字として結合した文字列を返す。eachメソッドのブロック内のpersonもlistの要素が入るが、年齢順にソートされているので下のようになる。ブロック内の変数は内部で完結していて外から参照できないことに注意。

alice    f   15
david   m   17
jasmin  f   17
john    m   18
paul    m   20

Rubyのブロックについて

繰り返しメソッドのブロック

ブロックは{ }もしくはdo...endで囲まれた引数のこと。 よく使ってきたのはtimesとかeachとかforメソッドのブロック。

["red","blue","green"].each { |color| puts color }
red
blue
green

eachメソッドはオブジェクトのすべての要素に対してブロックを実行する。ブロックには各要素が順番に入り、結果を返す。

繰り返しメソッド以外のブロック

ブロックはすべてのメソッドに与えることができるらしい。確認してみる。

def hello
  p block_given?
  puts "hello"
end

hello
puts"-------------------------------------"
hello{return "here"}
false
hello
-------------------------------------
true
hello

block_given?はブロックが渡されているかをtrueかfalseで返す。 ブロックを渡した2つ目のhelloメソッドにはブロックが渡されていることがわかる。

実際にブロックを呼び出すにはyieldを使う。yieldは入れ替わるみたいな意味。

def hello
  p block_given?
  yield
  puts "hello"
end

hello{puts "here"}
true
here
hello

ブロックが呼び出されているのがわかる。

標準入力と標準出力

標準入力と標準出力

echo

プログラムに対して情報をやり取りする原則的な入力と出力のこと。 例えばLinuxコマンドのechoは文字列を入力してそのまま出力する。

echo "hello"
hello

echo2

出力先を他のプログラムにして処理させることもできる。 例えばRubyで書かれたプログラムで試してみる。

str = gets.chomp
puts str.upcase

入力された文字列を大文字にして出力するrubyプログラムupcase.rbにechoで文字列を渡す。

echo hello | ruby upcase.rb

hello の後の | は出力を別のものに引き渡す役割がある。 結果は下のようになる。

HELLO