basyura's blog

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

Git for Windows SDK べんり

で、Git for Windows に乗り換えた。cygwin だと preloadindex や fscache が効かないんだろうか。どうせなら Ruby を動かせて他にも色々コマンドが叩けるようにできないかなぁでドンピシャのエントリ。

ダウンロードしてからのインストール。途中でプロキシを聞かれるので、入力して後は待つだけ。

pacman というパッケージマネージャが入っているので tig を入れたい場合はコマンドを叩くだけで OK。

pacman -S tig

便利すぎワロタ、で cygwin を捨てる時が来たようだ。

Redmine - wiki 記法を増やす

wiki 記法を増やしてみる。plugin 化したいけど ApplicationHelper にベタ書きされているので難しそう。メソッドをごっそり書き換えるなら可能に思えるが本体側の修正に取り残されるので微妙。

とりあえずやってみる。個別ブランチは feature を頭に付けるルールになっているので、feature:hoge と書いたら自分でホストしている gitlab 上の feature/hoge ブランチへのリンクを貼るようにしてみる。

  • app/helpers/application_helper.rb

ApplicationHelper#parse_redmine_links

def parse_redmine_links(text, default_project, obj, attr, only_path, options)
  text.gsub!(%r{<a( [^>]+?)?>(.*?)</a>|([\s\(,\-\[\>]|^)(!)?(([a-z0-9\-_]+):)?(feature|attachment|document|version|forum|news|message|project|commit|source|export)?(((#)|((([a-z0-9\-_]+)\|)?(r)))((\d+)((#note)?-(\d+))?)|(:)([^"\s<>][^\s<>]*?|"[^"]+?"))(?=(?=[[:punct:]][^A-Za-z0-9_/])|,|\s|\]|<|$)}) do |m|
          elsif sep == ':'
            # removes the double quotes if any
            name = identifier.gsub(%r{^"(.*)"$}, "\\1")
            name = CGI.unescapeHTML(name)
            puts "name : " + name.to_s
            case prefix
            when 'feature'
              # host, group, project はそれぞれの環境による
              link = link_to("feature:#{name}", "http://#{host}/gitlab/#{group}/{project}/tree/feature/#{name}", target: 'blank')

どうせ外部リンクなんだし、URL を直接貼り付ければいいじゃんという感じに。

VRビジネスの衝撃

気になるけどまだ体験できてない。すごいんだろうなとは思うが、目の疲労に関しては過敏になっているので乗りきれない気がしている。そもそもメガネの場合はちゃんと体験できるんだろうか。某 Podcast では中にメガネをはめてウンタラと言っていたけれど。

日本で多くの人がなんとなく感じている「(実態のない仮想としての)バーチャル」と、ヨーロッパやアメリカで考えている「(見た目が違うがほとんど実物としての)バーチャル」とは、話しているときはなんとなく折り合っているようでも、実は全く異なっていて、お互いに似ても似つかぬ概念を想起しているのである

そうだったのか。根本的に違うのか。

ことわざの「百聞は一見にしかず」をもじって、「百聞は一体験にしかず」

なにはともあれ体験しておきたい。ソードアート・オンラインみたいなゲームで引きこもりたい。

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 で何かに困ったことは特に無く不満も特に無かった。

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