gitを使った開発の流れ

gitを使った開発の流れは

  1. マスターのデータから編集用のデータに枝分かれさせる(ブランチを作る)
  2. ブランチを編集し適宜セーブポイントを作る(コミット)
  3. ブランチでの編集をマスターに統合させる(マージ)

の繰り返しです。



まず一番最初に

$ git init [ディレクトリ]

とします。
指定されたフォルダ内に.gitファイルが作られ、gitでの管理対象になります。



編集の際には

$ git branch <ブランチ名>

でブランチを作り、

$ git checkout <ブランチ名>

で指定のブランチの中に入ります。現在自分がいるブランチは

$ git branch
#   master
# * branch_a

とすることで確認できます。



作業がある程度進んだら

$ git add <セーブしたいファイルのパス>
# または
$ git add . 
# 全てのファイルをセーブしたい場合

としてから

$ git commit -m "メッセージ(変更内容などを書く)"

でブランチ内にセーブポイントが作られます。


ブランチを統合する場合は

$ git checkout <吸収する側のブランチ名(masterなど)>

で移動してから

$ git merge <吸収される側のブランチ名>

です。


最後に自分の作業をリモートリポジトリに反映させて終わりです。

$ git push origin <ブランチ名>

誰かがリモートにプッシュした更新を自分のローカルに反映させたいときは

$ git pull origin <リモートのブランチ名>

とすることで、自分の現在のブランチに対して、リモートのブランチがマージされます。

また、誰かがリモート新しいブランチを作った場合、

$ git branch <ブランチ名> origin/<リモートのブランチ名>

でリモートのブランチを元にした新しいブランチをローカルに作ります。

ActiveRecord単体のタイムゾーン

ActiveRecordタイムゾーンを変える方法、Railsの話はよく検索に引っかかりますが、単体で扱う記事はあまり無いようですね。
ソースコードに以下のように記述しましょう。

ActiveRecord::Base.default_timezone = :local

これがないとレコードを保存する時、勝手にUTCで保存されます。
以下サンプルコード

require "active_record"
require "csv"

ActiveRecord::Base.default_timezone = :local
ActiveRecord::Base.establish_connection(
  adapter:  "mysql2",
  host:     "127.0.0.1",
  username: "root",
  database: "test",
)

class User < ActiveRecord::Base
end

CSV.foreach('input.tsv', :col_sep => "\t") do |row|
  User.create(name: row[0], gender: row[1], age: row[2])
end

TSVファイルを読み取って、カラムに分割してデータベースに保存、という流れです。
制作日時や更新日時をしっかり日本時間で保存してくれます。

【mysql】idや更新日時を自動記入させよう

ALTER TABLE table名 ADD 変数名 変数型;

でテーブルに新しいカラムを追加できますが、コマンドの最後にキーワードを挿入すると、特殊な属性を持たせることができます。

"NOT NULL => 空欄にできない”
"PRIMARY KEY => 重複する値を入れられない"
"AUTO_INCREMENT => 自動で数値を挿入" など。

ユーザーIDの様に空欄や重複があると困るカラムを作る時に重宝します。

ALTER TABLE <table_name> ADD user_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;

空欄のままのレコードが挿入されてもAUTO_INCREMENTが自動で数値を記入してくれます。



レコードの制作日時や更新日時はそれぞれ、

ALTER TABLE <table_name> ADD created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE <table_name> ADD updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 

"DEFAULT CURRENT_TIMESTAMP"により現在時刻(作られた時の時刻)をデフォルト値に持ちます。
"ON UPDATE CURRENT_TIMESTAMP"によって更新時に時刻が書き換えられます。

Rubyで時間表示(好きな形式で)

time = Time.now
puts time
# => 2018-06-18 18:24:08 +0900
puts time.strftime("%F %R")
# => 2018-06-18 18:24


.strftime("")の中に適当なものを入れると、好きな形式で出力できるので便利。
以下よく使いそうなものを抜粋(これの倍くらいある)
rubyには「この書き方ダサいなー」とか「この作業めんどくさいなー」と思ったとき、大体便利なメソッドが用意されてるので感動します。

%a: 曜日の省略名(Sun, Mon ... )
%b: 月の省略名(Jan, Feb ... )
%D: 日付 (%m/%d/%y)
%d: 日(01-31)
%F: %Y-%m-%d と同等 (ISO 8601の日付フォーマット)
%H: 24時間制の時(00-23)
%I: 12時間制の時(01-12)
%M: 分(00-59)
%m: 月を表す数字(01-12)
%p: 午前または午後(AM,PM)
%R: 24時間制の時刻。%H:%M と同等。
%r: 12時間制の時刻。%I:%M:%S %p と同等。
%T: 24時間制の時刻。%H:%M:%S と同等。
%U: 週を表す数。最初の日曜日が第1週の始まり(00-53)
%W: 週を表す数。最初の月曜日が第1週の始まり(00-53)
%Y: 西暦を表す数%y: 西暦の下2桁(00-99)
%Z: タイムゾーン
%z: タイムゾーンUTCからのオフセット (例 +0900)

STDINでコマンドライン上でファイルを扱う

読み込むファイルや書き出すファイルはコマンドライン上で指定できます。

$ ruby test.rb < input.txt > output.txt

入力用のファイルは"<"で指定し、 出力先は">"で指定します。
これができると、ソースコード中にファイル名を書かなくていいので、わざわざ名前を書き換えたりしなくていいんですね〜。


では入力ファイルの各行を二倍にして書き換えるプログラムを考えてみましょう。

1
2
3
4
5

input.txt

row = STDIN.read.split("\n").map(&:to_i)

row.each do |i|
  puts i * 2
end

test.rb

STDIN.readによってinput.txtが読み込まれます(つまり"1\n2\n3\n4\n5\n"というstring)
この出力結果がoutput.txtに書き込まれます。

2
4
6
8
10

output.txt

rubyでJSONからTSVへ

以下のようなJSONファイルをTSV形式に変換します。

[{"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"}]

input.json

require 'JSON'

name_list = File.open('input.json') do |json_file|
  JSON.load(json_file)
end

File.open('output.tsv', 'w') do |tsv_file|
  name_list.each do |person|
    tsv_file << person["name"] + "\t" + person["gender"] + "\t" + person["age"] + "\n"
  end
end

JSON.load()によってjsonファイルが配列として読み込まれます。
ブロック変数|person|はハッシュなので

tsv_file << person.values.join("\t") + "\n"

などとしても良さそうですが、jsonファイルは要素の順番がバラバラの場合があるため、キー指定で順番を整えてから書き込んでいます。

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

output.tsv

TSVからCSVへ

tsvファイルとは、以下のような要素がtab区切りのファイルです。
これをrubyCSVモジュールを使ってcsv形式(カンマ区切り)に書き換えましょう。

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

input.tsv

ソースコードは以下
各行をtabでsplitした配列がcsv形式で書き込まれます。

require 'csv'

CSV.open('output.csv', 'w') do |file|
  File.foreach('input.tsv') do |row|
    file << row.chomp.split("\t")
  end
end
john,m,18
paul,m,20
alice,f,15
dabid,m,17
jasmin,f,17

output.csv



各要素をダブルクォーテーションで囲む必要があるときはカッコ内に force_quotes: trueと付け加えましょう。

CSV.open('output.csv', 'w', force_quotes: true) do |file|
"john","m","18"
"paul","m","20"
"alice","f","15"
"dabid","m","17"
"jasmin","f","17"

output.csv(force_quotes: true)