basyura's blog

あしたになったらほんきだす。

Git がこわい

ようやく Git を導入することができたのだけど、どう運用するべきか四苦八苦。Github に登録したのが 2008 年 12 月。そこからGit を使い続けてはいるのだけど、個人で使ってただけなのでチームで使う場合の知識不足が否めない。とはいえ「この場合どうしたら?」と聞かれるので調べては答えるを繰り返す。知識を得るためには教えるのが一番っていうのは確かだなと実感する日々。ブランチをどう切るべきか、マージはどうするべきか、リリースはどうするべきか、沢山考えた。現状がベストとは言えないけど、svn でやってた時よりはひとまずいい感じに進めそうである。あとは SSD にしたい・・・。

Git を使っているうえで言葉の定義とか動作が色々もにょっていたのだけど、この本でいろいろスッキリした。いろいろ本を呼んだり調べたりした経緯があるからかもしれないけど。

リモート追跡ブランチ (Remote-tracking branch) とは、リモートリポジトリのブランチの分身のようなものです。リモート追跡ブランチは、リモートリポジトリと同期するたびに、リモートのブランチを追いかけるように移動します。

 

origin/master という名前のリモート追跡ブランチがあるので、「リモートリポジトリ origin に、master という名前のブランチが存在する」ということが分かります。   HEAD は現在作業中のローカルブランチを指すポインタです。   HEAD がリモート追跡ブランチを指すことはありません。

 

プッシュの反対はプル (Pull) と考えるのが自然ですが、Git の場合はフェッチです

 

アップストリームブランチ (Upstream branch) は、ローカルブランチとリモートリポジトリのブランチとペアリングするための概念です。

 

転送元や転送先を省略できます。

 

ツリーオブジェクトや blob オブジェクトをそのまま再利用しています。

 

ステージという中間準備地帯のおかげで、例えば、デバッグ用や実験用のコードを作業ディレクトリに残したまま、本来のコードのみをコミットする、といったことが可能です。

 

リベースは歴史を改ざんするに等しい好意なのです。このことから、他のメンバーと共有しているブランチをリベースするのは避けるべきでしょう。

 

color.branch.upstream cyan

 

リポジトリに特化した無視リストだけどメンバーで共有したくない、ということもあるでしょう。その場合は、作業ディレクトリの .git/info/exclude に無視リストを記述するることもできます。

Redmine - サブプロジェクトから親プロジェクトのリポジトリに識別子無しでリンクを貼る

うちのプロジェクトの構成はこんな感じ。

親プロジェクト
  │  ├ メインリポジトリ (svn)
  │  └ サブリポジトリ (git)
  ├ サブプロジェクト1
  ├ サブプロジェクト2
  └ サブプロジェクト3

ようやく git での開発が始まったので、メインリポジトリ(だった) の svn に加えて git のリポジトリを追加。親プロジェクトにだけリポジトリを登録してサブプロジェクトからもコミットのリンクを貼りたい。記法があるので紐付けられるんだけど、かなり冗長になる。

プロジェクトにリポジトリがある場合

commit:abcdefg

プロジェクトにリポジトリ (git) があるけど、メインリポジトリじゃない場合

commit:git|abdefg

別プロジェクト (parent) にリポジトリ (git) がある場合

parent:commit:git|abcdefg

特に 3 つ目。書けるんだけど、記述が冗長すぎて辛い。

  • 親プロジェクトにリポジトリがあるけどサブプロジェクトにはない
  • commit だけを指定してサブプロジェクトからリンクを貼りたい

どうするか。とりあえずパーサーをいじる。親プロジェクトの ID が 1 でリポジトリが git の場合。

diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 6893174..55b2352 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -834,13 +834,8 @@ module ApplicationHelper
               end
             when 'commit', 'source', 'export'
               if project
-                repository = nil
-                if name =~ %r{^(([a-z0-9\-_]+)\|)(.+)$}
-                  repo_prefix, repo_identifier, name = $1, $2, $3
-                  repository = project.repositories.detect {|repo| repo.identifier == repo_identifier}
-                else
-                  repository = project.repository
-                end
+                project = Project.find(1)
+                repository = project.repositories.detect {|repo| repo.identifier == 'git'}
                 if prefix == 'commit'

これでサブプロジェクトでも

commit:abcdefg

と書けばリンクが貼られるようになる。逆に、プロジェクト名やリポジトリ名を指定すると逆にリンクが貼られなくなる。うちのプロジェクトでは問題なくなるけど、redmine のアップデートの度に修正を当て直すのはめんどくさい。サブプロジェクトの設定に親プロジェクトのリポジトリを引き継ぐ設定があると良いなぁ。

C# - ループカウンタ

LINQ でループカウンタがあるメソッドがあるのを知らなかった。使いどころがよく分からんけど。

var list = new List<string> { "a", "b", "c", "d", "e" };
list.Where((v, i) => {
    Console.WriteLine(v + " " + i);
    return true;
}).ToList();

for を使わずに foreach を使えれば添字を間違えなくて済むしすっきり書けるとかなんとかあるけど、やっぱり必要な時がある。一つ目だけ任意の処理をしたいとか、ある条件を満たした以降は処理を切り替えるとか。すっきり書きたいのだけど書けない。

C#でforeachを使用してループを行うと、シンプルな表記で集合内のデータを処理する事ができるので便利ですが、何番目の値を処理しているかのループカウンタが無いのが不便です。

このような場合は、以下のようにSelect()メソッドを使用すると処理中データのindexを取得できます。

string nameArray = new string[] { "alice", "bob", "charlie", "dave" };

foreach ( var nameObj in nameArray.Select((value, index) => new { value, index }))
{
    Console.WriteLine( "{0}人目: 名前{0}", nameObj.index, nameObj.value );
}
foreach文でループカウンタを取得する方法

書けるのだけど、ごちゃっと感と無駄なインスタンス生成は否めない。

foreach (var v in list) : i
{

}

とか

foreach (var v, var i in list)
{

}

ぐらいで書けると嬉しいのだけどなぁ。

for (int i = 0; i < list.Count; i++)
{
    var hoge = list[i];
}

ぐらいが妥当だろうなぁ。for を使うけど、先頭で変数に入れてしまって以降はその変数を使うことで紛らわしさを減らす感じ。

そもそも for じゃなくて foreach を使えの根拠はなんだっけ?

Biglobe を退会

f:id:basyura:20160524220417p:plain

プロバイダを IIJ に変更したので Biglobe を解約。契約時の書類を見ると 2004 年とあったので 12 年も使ってた。SIM とセットで割引がきくので乗り換えただけで、Biglobe で何かに困ったことは特に無く不満も特に無かった。

会員サポートのページに入ると分かりやすいところに退会へのリンクがあったのが好印象だった。

iPhone SE にしてついでに au から BIC SIM に移った


17年と一ヶ月。cdmaOne から始まってずっと au にいたけど脱出。結果、何の問題もなかった。

MNP の番号を発行してもらうのに電話でも良かったのだけど、長期に使ってるから多少の引き止めぐらいしてくれるんではないかと思って (とどまるつもりは無かったけど) au ショップに行ってみたのだけど何もなかった。それどころかショップにきたのに混んでるからと電話を渡されて問い合わせをと言われた。結局カウンターでの対応になったのだけど「番号発番ですか?」「はい」ぐらいの対応で終わり。違約金を確認したら 5000 円程度 (記憶が曖昧)。以上。30 分程度。

その足でビックカメラに行って移転手続き。その間にプロバイダ変更したほうが安くなるという説明を受け (ここが一番長かった。待ち時間も)、プロバイダも変えることに。その後に SIM をもらって差し込んで終了。2時間程度。

困ったのは SIM を挿すだけで終わりだと思っていたらプロファイルの更新が必要だったぐらい。ページを開いてインストール。

au 回線から docomo 回線に切り替わったのだけど、au の方が電波の入りも速度も良かった印象。困るわけではないのだけど。LINE が届くまでにタイムラグが出るようになった気がするのだけどよく分からない。

僕は au だったから iPhone SE を買ったけど奥さんはもともと docomo だったので SIM を変えてプロファイルをインストールするだけで終了。ファミリーシェアプランなので、SIM を +700/月 で追加。データ通信量は 10G を分けあう。10G のうち未使用分は翌月に繰り越し可能。ただし、MNP で 自分のファミリーシェアプランに入れるためには予め docomo で名義を自分に変更しておく必要がある。

キャリアメールが使えなくなるけどほとんど送られてこないので問題なし。困ったら SMS で送ってくるだろうし。なんだかんだで LINE が便利だしな・・・。

au で月に 8000 円程度払っていたのだけど、二人で月に 4000 円程度になるので (たぶん) お得感が半端ない。

bash で git のブランチ名補完

cygwin な環境を新たに作ったのでメモ。

ファイルをダウンロードして .bashrc に記述

source ~/.git-completion.bash
source ~/.git-prompt.sh

export  PS1='\[\e[32m\]\n\w$(__git_ps1 " ( \[\e[33m\]%s\[\e[32m\] )")\n\[\e[33m\]$ \[\e[0m\]

alias g='git' と定義していて常に g と打っているのだけど補完が効かなかったので git-completion.bash をいじったら動いた (正しいのかは知らない)。

  __git_complete git __git_main
+ __git_complete g __git_main
  __git_complete gitk __gitk_main

サブマリン - 伊坂幸太郎

夢を諦めるな、努力を忘れるな、人の嫌がることをするな、といった「教え」よりもとにかく、「相手の大事なものを、蔑ろにするな、ってことだ

面白かった。一人亡くなっているようなのだが・・・復習も兼ねてチルドレンを読み直してみたものの、そのような記述はなかった。チルドレンからサブマリンの間に何が合ったのか気になる。続編で明らかになるのかな。