やったもん勝ち

主にプログラミングのこと。生産性向上の某とかも。

一つのPCから複数のgithubアカウントを使い分けてpushする

一つのPCから複数のgithubアカウントを使い分けてpushする ということをやってみたいと思いました。

背景

というのも、仕事とプライベートみたいな使い分け方じゃなく、開発用のアカウントと、英語学習用のアカウントを使い分けたいなと思ったからです。
日々の学んだことや、日記的なことを英語でアウトプットしていきたいなと思いまして、何かないかなーと。
メモやテキストに書いてるだけなのもなんかなーと思いまして。あと、オンラインで管理したい。
じゃあブログでいいじゃないかと思ったわけですが、ブログだと、検索ができない。(と思ったのですが、普通に検索できますね、ブログでも良かったかもしれない。しかしせっかくエンジニアになったので、エンジニアっぽいことをやってみようじゃないかと)
一つのディレクトリにまとめとけば、エディタ開いて検索とかできるなと。ブログより素早くアクセスできるなと。(しかしgithub嬢では検索できないかぁ〜) ということで、一つのリポジトリで管理しようと思いました。
これの何がいいって、githubで草を生やせること! これだけのためにgithubを使うと言っても過言でもない ちゃんと習慣としてできているかが一目瞭然になること!これがいい。
というわけで、githubを使っていく運びになりました。

やりたいこと

特定のリポジトリからpushするときだけは勝手に別のgithubアカウントのリポジトリにしてくれる。

やったこと

githubアカウントを作る

もう一つのgithubアカウントを作ります。普通に。

sshキーを登録する

新しく作ったアカウントのために新しくsshキーを作成します。

$ ls ~/.ssh
id_rsa  id_rsa.pub #普段使いのやつ

$ ssh-keygen -t rsa -C hoge@hoge.com -f fugafuga_rsa
#パスフレーズなどは適当に。ファイル名は既存の鍵と被って上書きしないように。

githubから鍵を登録します。 fugafuga_rsa.pubgithubに登録。

githubリポジトリを作成

作る。

configの設定

$ vi ~/.ssh/config

Host github.com-for-English
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/fugafuga_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes

を追加。(ここら編怪しいです。)

git clone

$ git clone git@github.com:English/practice/listening.gitとするところを $ git clone git@github.com-for-English:English/practice/listening.gitとする。

user情報を変更

このままだと、普段のアカウントのままなので、

$ git config --local user.name "アカウント名"
$ git config --local user.email "メールアドレス"

とする。

commit $ push

これで晴れてremoteにpushできました〜

苦労したぜ…

will_paginateの1ページあたりの表示数とラベルを変更する

ページネーションをうまいことやりたいとき、railsだとどうやらkaminariってのが有名らしい。

しかしrailsチュートリアルで、will_paginateを使っていたので、それを活用していきます。

参考までにkaminari github.com

そして今回のwill_paginate github.com

余談ですけど、kaminariとかnokogiriとか4文字の日本語をローマ字にしましたみたいなgemってなんか良いですよね。
僕も将来onigiriってgem作りたいなと構想しています。

1ページに表示するitemの数を指定する

Post.paginate(:page => params[:page], :per_page => 30)

と、:per_page => 30のようにオプションを付ければできます。

まとめてdefaultの設定もできるようですが、部分ごとに表示させたい数が違ったので、今回は使いませんでした。

# for the Post model
class Post
  self.per_page = 10
end

# set per_page globally
WillPaginate.per_page = 10

labelを変更する

個別にも設定できるみたいなんですが、1ページあたりの表示数と違って、これはサイト全体で統一するパターンが多いと思うので、一括で設定をしたいところです。

config/application.rbにて

config.i18n.default_locale = :ja

で、日本語に設定して、config/locals/ja.yml

ja:
  will_paginate:
    previous_label: "前"
    next_label: "次"
    page_gap: "…"

を設定。

rubyの配列、ハッシュ、シンボルあたりを整理する備忘録

ハッシュ、シンボル、配列あたりがごちゃごちゃしているので、まとめる。
備忘録です。

配列

シンプルな配列

array = [1,2,3,4,5]
[1, 2, 3, 4, 5]

要素を追加したり、色々なメソッドを使えます。

array.push(10)
[1, 2, 3, 4, 5, 10]

色んなものが配列の要素になれます。
違う種類のものが入っていてもOKです。

array = [1, "a", [1,2], [3, "b"], {name:"bob", age:18}]
[1, "a", [1, 2], [3, "b"], {:name=>"bob", :age=>18}]

要素を取り出してみます

array[2]
[1, 2]

さらに取り出してみます

array[2][1]
2

ハッシュもこの調子でできそうです。

array[4][:name]
"bob"

ハッシュ

hash = { orange: 100, apple: 200, banana:500 }
{:orange=>100, :apple=>200, :banana=>500}
hash = { a1: 100, b: 200, f:500 }
{:a1=>100, :b=>200, :f=>500}

ハッシュの値にハッシュも配列も入れられる

hash = { a: {aa: 110, ab:120, ac:[130, 140, 150, 160] }, b: 200, f:500 }
{:a=>{:aa=>110, :ab=>120, :ac=>[130, 140, 150, 160]}, :b=>200, :f=>500}

取り出すときは配列と同様に順番に指定していく

hash[:a][:ac][2]
150

ちなみにキーにハッシュや配列も入れることができるっぽい。
使う場面は想像できないが

hash = { {a: 120} => 20, [1,2,3] => 30 }
{{:a=>120}=>20, [1, 2, 3]=>30}
hash[[1,2,3]]
30
hash[{:a=>120}]
20

ハッシュのシンボルについて

keyとして使えるものに、シンボルというものがある。

シンボルは:keyのように使う

Fighter = { :Hanma => "Baki", :Hanayama => "Kaoru", :Orochi => "Doppo" }
# 次のように宣言しても全く同じ
# Fighter = { Hanma:"Baki", Hanayana: "Kaoru", Orochi: "Doppo" }
{:Hanma=>"Baki", :Hanayama=>"Kaoru", :Orochi=>"Doppo"}

取り出すときは、次のようにして使う

Fighter[:Hanma]
"Baki"

keyは文字列も指定できる。
文字列とシンボルが混在していても、問題なく処理される。
文字列とシンボルは別のものとして扱われるので、注意が必要。

# 同じkeyだと上書きされてしまう
Underground_Fighter = { :Hanma => "Baki", :Hanayama => "Kaoru", :Orochi => "Doppo" , Hanma: "Jack" }
<main>:1: warning: key :Hanma is duplicated and overwritten on line 1





{:Hanma=>"Jack", :Hanayama=>"Kaoru", :Orochi=>"Doppo"}
Underground_Fighter[:Hanma]
"Jack"
# keyを:Hanmaと"Hanma"でハッシュに入れる
Chika_Fighter = { :Hanma => "Baki", :Hanayama => "Kaoru", :Orochi => "Doppo" , "Hanma" => "Yujiro" }
{:Hanma=>"Baki", :Hanayama=>"Kaoru", :Orochi=>"Doppo", "Hanma"=>"Yujiro"}
Chika_Fighter["Hanma"]
"Yujiro"
Chika_Fighter[:Hanma]
"Baki"



    
  

rubyで配列、ハッシュに対する処理をするreduceについてのまとめ備忘録

reduceとは

reduceはinjectの別名。

配列やハッシュを次々に処理していくときに使えるやつ。

早速例示して使ってみる。

まず配列について

# 初期値なしで、配列の中身を順に足していく。
[1,2,3,4,5].reduce() {|sum, i| sum + i }
15
# 初期値を設定できる
[1,2,3,4,5].reduce(100) {|sum, i| sum + i }
115
# 偶数なら足す
# 初期値なし
[1,2,3,4,5].reduce() {|sum, i|
  puts sum
  if i % 2 == 0
    sum + i
    else
    sum
  end}
1
3
3
7

7

パッと書いてみたが、期待する結果じゃない。 これの挙動を確かめる。

①初期値がないので、[sum, i] = [1, 2]になる。
i=2なので、ifはtrueになり、sum+iが実行される。
よって返り値は3

②Z1周目のループが終わって次のループ。
[sum, i] = [3, 3]になる。
i=3なので、ifはfalseになり、sum(=3)が返される。

③3週目のループ
[sum, i] = [3, 4]になる。
i=4なので、ifはtrueになり、sum+i(=3+4=7)が返される。

④4週目のループ
[sum, i] = [7, 5]になる。
i=5なので、ifはfalseになり、sum(=7)が返される。

初期値がないと、こういった期待しない結果が返ってくる罠に遭遇しそう。
なので、初期値はなるべく都度適切なものを入れたほうがよい気がしている。

# 偶数なら足す
# 初期値を0とする
[1,2,3,4,5].reduce(0) {|sum, i|
  if i % 2 == 0
    sum + i 
    else
    sum
  end}
6
# 1行で書く熟練っぽいコードはまだ慣れない…
[1,2,3,4,5].reduce(0) {|sum, i|if i % 2 == 0 then sum + i else sum end}
6
# 偶数なら足す
# 初期値は0とする
# elseの処理も書かないと、前回の戻り値がないことになってしまう。
[1,2,3,4,5].reduce(0) {|sum, i|
  if i % 2 == 0
    sum + i
  end}
NoMethodError: undefined method `+' for nil:NilClass

ハッシュについて

# ハッシュのvalueだけを利用する
fruit = { apple: 100, banana: 200, orange: 300, lemon: 400 }
fruit.reduce(0) {|sum, (key, value)| sum += value}
1000
# ハッシュのvalueを条件にする
# 初期値には空の配列[]を使用する
fruit.reduce([]) {|array, (key, value)| array.push(key)}
[:apple, :banana, :orange, :lemon]
# reduceは毎回返り値を持たせないとエラーになる罠がある。
fruit.reduce([]) {|array, (key, value)| array.push(key)if value > 250 }
SyntaxError: <main>:1: syntax error, unexpected tIDENTIFIER, expecting '}'
ray.push(key)if value > 250 }
                              ^
# 返り値がないときは、とりあえず何か強引に返しとく
# 最後の値が返り値になる
#ちゃんと書くならこう
fruit.reduce([]) {|array, (key, value)| 
  if value > 250
    array.push(key)
  else
    array
  end}
[:orange, :lemon]
# 短く書くならこう
fruit.reduce([]) {|array, (key, value)| array.push(key)if value > 250; array}
[:orange, :lemon]

mapよりは若干複雑かな

rubyで配列、ハッシュに対する処理をするmapについてのまとめ備忘録

rubyのmapなどについて使い方をまとめてみます。

map

配列やハッシュの各値に対して同じ操作をしていく。

配列について

# 各値を2倍にする
[1,2,3,4,5].map {|i| i*2}
[2, 4, 6, 8, 10]
# 何もしない
[1,2,3,4,5].map{|i| i}
[1, 2, 3, 4, 5]
# 全部1にする
[1,2,3,4,5].map{|i| 1}
[1, 1, 1, 1, 1]
# 偶数のときだけ2乗にしてみる(失敗)
[1,2,3,4,5].map{|i| i**2 if i%2==0}
[nil, 4, nil, 8, nil]

返り値がないとnilが渡される。

# 偶数のときだけ2乗にする
[1,2,3,4,5].map{|i|
  if i % 2 == 0
    i ** 2
    else
    i
  end}
[1, 4, 3, 16, 5]
# 偶数のときだけ2乗にする
#1行にまとめる
# ※この場合thenを省略するとエラーになる
[1,2,3,4,5].map{|i| if i % 2 == 0 then  i ** 2 else i end }
[1, 4, 3, 16, 5]

ハッシュについて

ハッシュに対してmapを使っても、返り値がハッシュになるわけではなく、あくまで配列を返す。

これは地味に罠。

# keyを配列にして返す
{ :name => "hoge", :age => "24"}.map { |key, value| key }
[:name, :age]
# valueを配列にして返す
{ :name => "hoge", :age => "24"}.map { |key, value| value}
["hoge", "24"]
# keyとvalueを結合した文字列を返す。
{ :name => "hoge", :age => "24"}.map { |key, value| "#{key} is #{value}" }
["name is hoge", "age is 24"]
# ちなみにハッシュの書き方はこれでもいい。(というかこれが今は主流…?)
{ apple: 100, orange: 120, banana: 200, lemon: 250 }
{:apple=>100, :orange=>120, :banana=>200, :lemon=>250}
# valueの条件によってkeyを変更して返してみる。
{ apple: 100, orange: 120, banana: 200, lemon: 250 }.map { |key, value|
  if value > 150 
    "高い"
    else
    "安い"
  end}
["安い", "安い", "高い", "高い"]

でもこれって、結局ハッシュに対して処理してるならハッシュで返してほしくな〜い?

というのはよくある。気がする。

to_hというのを使うらしい。なるほど〜

# 条件によってvalueを変更してハッシュで返す
{ apple: 100, orange: 120, banana: 200, lemon: 250 }.map {|key,value|
  if value > 150
    [key, "高い"]
    else
    [key, "安い"]
  end}.to_h
{:apple=>"安い", :orange=>"安い", :banana=>"高い", :lemon=>"高い"}

macのrubyで文字コードcp932でファイルに保存されているか確認する際の落とし穴

まずは元々の挙動を確認

まずは何も指定もせずにファイルに保存するとどうなるのか確認してみます。

say_nice.rb

File.open("nice.txt", "w") do |f|
    f.puts "nice"
end

ファイルの文字コードを確認する方法は

$ nkf --guess filenameまたは$ file --mime filename なので、

$ nkf --guess nice.txt

で確認すると、

ASCII (LF)

どうやらASCII (LF)という文字コードで保存されているらしい。

$ file --mime nice.txt

こちらでも確認してみます。

good.txt: text/plain; charset=us-ascii

ふむ。やはりASCIIみたいですね。

それでは、文字コードをcp932に変更します。 ちなみにcp932というのはShift-JISみたいなやつです。若干違うけどほぼ一緒みたいな認識を勝手にしてます。

say_nice.rb

File.open("nice.txt", "w:cp932") do |f|
    f.puts "nice"
end

これで文字コードはcp932になっているはずですね、確認してみましょう。

$ nkf --guess nice.txt

ASCII (LF)

ファッ!? 変わってないやんけ!

念のためこちらでも確認。

$ file --mime nice.txt

good.txt: text/plain; charset=us-ascii

おっかしいなー。

思い通りの文字コードで保存されない理由

思い通りの文字コードで保存されない理由は、アルファベットしかないから。です。

上記のコードたちだとアルファベットしか出力してないから、文字コードを判断するに足る情報が少なかったからです。

文字コードというのはhtmlファイルのhead情報みたいにファイルのどこかに保存されているのかなと、勝手に思ってましたが、ファイルの中身を見て判断しているみたいですね。

テキストファイルの文字コードは中身で決まる。らしい。 - Qiita

こちら参考にさせていただきました。

つまり、niceだけだと、asciiもutf-8もcp932も同じ文字コードで表現できてしまう。ってこと!か

というわけで、再度確認してみる

再度元々の挙動を確認

日本語文字に変更して、

say_nice.rb

File.open("nice.txt", "w") do |f|
    f.puts "いいね"
end

$ nkf --guess nice.txt

UTF-8 (LF)

$ file --mime nice.txt

good.txt: text/plain; charset=utf-8

日本語文字を含めると、UTF-8で保存されているみたいですね。

いよいよ本題、cp932で保存したい。

File.open("nice.txt", "w:cp932") do |f|
    f.puts "いいね"
end

確認してみる。

$ nkf --guess nice.txt

Shift_JIS (LF)

えぇ〜・・・

こちらも

$ file --mime nice.txt

good.txt: text/plain; charset=unknown-8bit

こっちに至ってはunknown言われてるやん。。。

cp932じゃなく、Shift_JISと解釈される問題

$ file --mime nice.txtの方はさておき、Shift_JIS (LF)と判別されるのは、同じく、cp932Shift_JIS (LF)を判別する文字がなかったためでした。

cp932にあって、Shift_JISにないものを文字に入れて検証。 を追加。

File.open("nice.txt", "w:cp932") do |f|
    f.puts "いいね①"
end

これで

$ nkf --guess nice.txt

CP932 (LF)

よっしゃ!

こちらは?

$ file --mime nice.txt

good.txt: text/plain; charset=unknown-8bit

unknownのまま。 もうfile --mimeのことなんか知らないっ あとで調べてみるか・・・

cp932で保存はできてるんだもんな。

NotebookアプリQuiverのスタイルをCSSでいい感じに変更する。

エンジニア御用達のメモアプリ、Quiver。

オンラインで同期できないことを除けば、今の自分にとって最高のツールです。

メモを見る上で、見やすさはとても重要ですね〜

ということで、QuiverのCSSを変更して、使いやすくしたい。

というか、自分で考えたこのStyleよくない〜?ってのを言いたいだけ (どっかのサイトをベースにしたけど忘れてしまった)

StyleのCSSを設定

f:id:benzenetarou:20170629064158p:plain

Preferance > Styles > Preview

で、CSSを書いていくだけ。

f:id:benzenetarou:20170629064243p:plain

こんな感じでCSSを書き込んでいく。

僕の設定したCSSだとこんな感じになります。f:id:benzenetarou:20170629065559p:plain

割りと気に入ってます。 CSSのコードは以下です。

body,
.editor {
  font-family: 'Hiragino Kaku Gothic Pro', arial, helvetica, sans-serif;
}
 
h1 {
  border: solid 1px #F89174;
  border-top: solid 5px #F89174;
  border-radius: 2px;
  padding: 5px 5px;
  color: #000;
  background-color: #f4f5fb;
  line-height: 1.3em;
  font-size: 30px;
}
 
h2 {
  border-left: solid 5px #F89174;
  border-bottom: solid 3px #DADADA;
  padding: 10px 10px;
  color: #333333;
  background-color: #f4f5fb;
  line-height: 1.3em;
  font-size: 22px;
}
 
h3 {
  border-bottom: solid 2px #F89174;
  
  padding: 10px 10px;
}

h4 {
  border-left: solid 3px #F89174;
  padding: 3px 8px;
}

ちなみに最初の方しばらくはずっとこれを拝借していた。

Quiverのスタイルを変える – IT Nerd Diary

ありがとうございました