はじめての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