案の定というか、更新停止していた。
Gitでコンフリクトを起こしたくなくて
Gitは分散型バージョン管理システムなので、
ソースコードの同じような箇所を複数の人が修正したら当然コンフリクトが発生する。
コンフリクトを回避するにはマージツールなどを使えばいいんだけど、正直やりたくないのが本音だ。
他人のソースを理解し、そのように採用するか、その作業は思ったより負担になることが多い。
俺の技術不足?それはその通りだ。
でも、それを嘆いてもソースが読めるようになるわけではない。
そこで、コンフリクトを極力起こさないように、ある方法を用いている。
それは非常に単純で、「新規追加機能やクラスは極力別ファイルにする」というものだ。
ファイルが違えば、コンフリクトなど起き得ない。
それに、クラスを別ファイルにすることで、ソース全体への視認性も向上する。
勿論、ソースを見て、ファイルを分けるべきでないなら、分けてはならない。
あくまでTipsなので、それで全体が振り回されるのはいけない。
あ、言うまでもないけど、こんなことしなくてもコンフリクトの原因をすぐに理解し、その修正をすぐに行える人はこんなことすべきでないと思います。
初戦は自分の未熟さをカバーするための回避策です。
なんだこの内容の無さ。
GitHubとBitbucket
世の中ソーシャルコーディングの時代なのか、Gitレポジトリのホスティングサービスが主流になっている。
全角半角を区別せずに文字列を比較する。
Dictionary<string,object>のキーについて、ある文字列と全角半角を無視して比較を行おうとしていた。
最初は
Dictionary<string,object> dic=new Dictionary<string,object>(StringComparer.CurrentCultureIgnoreCase);
と設定すればいけるだろうと考えていたが、これでは全角半角は区別してしまうみたいだ。
他のCultureでも同様だ。
仕方ないので、以下のようにやった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//比較対象の文字列 string target="AAA"; //比較されるDictionary Dictionary<string, objectt> dic = new Dictionary<string, objectt>() { { "AAA", "BBB" }, {"CCC","DDD"} }; foreach (var key in dic.Keys) { if(string.Compare(key,target, System.Globalization.CultureInfo.CurrentCulture, System.Globalization.CompareOptions.IgnoreWidth)==0) { //比較対象と一致したときの動作 } } |
もっと良いやり方があるような気がするのだけど。
結婚式を祝うために
中学時代の友人Tが結婚することになった。
あと動画編集もやったことないし。
DataTableの特定の行を別のDataTableに格納する。
「DataTableのある特定の行を抽出し、その結果を格納したDataTableを作る」という操作が必要になった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
//ここからDataTableを作成してるだけ DataTable dt = new DataTable(); dt.Columns.Add("col1"); dt.Columns.Add("col2"); dt.PrimaryKey = new DataColumn[] { dt.Columns[0] }; for (int i = 0; i < 10; i++) { DataRow dr = dt.NewRow(); dr["col1"] = i.ToString(); dr["col2"] = i.ToString()+"回目に追加された行です。"; dt.Rows.Add(dr); } //ここまでDataTableを作成しているだけ //Selectで抽出した結果を新しいDataTableとして格納したい。 DataRow[] drs = dt.Select("col1='3' or col1='5'"); DataTable newdt = dt.Clone(); foreach (var dr in drs) { //newdt.Rows.Add(dr)ではダメ。 //drはdtに所属している行なので、別のDataTableであるnewdtにはAddできない。 //よって、newdtの新しい行を作成し、その各列の値をdrと全く同じにし、それをnewdtに追加すれば良い。 DataRow newrow = newdt.NewRow(); newrow.ItemArray = dr.ItemArray; newdt.Rows.Add(newrow); } |
つまり、DataRowはDataTableに所属するオブジェクトなので、
違うDataTableに追加するには全く新しい行を作成して追加しなくてはいけないということ。
もっとスマートにできないのかな。
わざわざSelectしたものをさらにDataTableにするというのがそもそもスマートじゃないのかもしれない。
git rebaseでコミット履歴を修正する
前回メモしたIssueからPullRequestを作成するをワークフローに入れるとある問題が生じる。
正直言って、僕は「それでもいいじゃん、変更が追いにくくなるわけでもないし」という考えをしてしまうのだが、会社では可能な限りコミットは綺麗にする方針なので、コミットを修正する方針をとっている。
この変更なのだが、vimが使えないと辛い。
ネットで調べても「vim?使えて当然だろ」と言わんばかりの資料ばかり。
知らないのが悪い、自分で解決しろ、というプログラマのこういうところが嫌だ。
(自分の向上心のなさを棚に上げる)
とりあえず、仕事で使っている最低限のコミット修正、rebaseの使い方を書いていく。
1)commitを行い、pushできる状態にしておく
2)ログを確認し、どのコミットを修正したいか確認する
![]() |
ex)今回は3番目のfixというコミットを、2番目のwriteというコミットに統合させることを目的とします |
3)rebaseコマンドを打ち込む
- git rebase -i HEAD~(戻る分のコミット数)
- ex)git rebase -i HEAD~2
4)採用する修正(=最新の修正)のpickをfixupに書き換える
![]() |
rebaseコマンドを行った途端こんな画面に。 入力する前にキーボードでiを押して入力モードにする。 |
![]() |
今回はfixというコミットを採用するので、fixの行をpickからfixupに変更する。 入力したらescキーを押し、コマンドモードに戻る。 |
5)編集を完了させる
- コマンドモードで”:wq“と打ち、Enterを押す
6)成功したかgit logで確認
![]() |
成功。コミットが2つになっている。 “create”コミットの内容は編集前の”create”と”fix”を合わせたものになっている。 リネームが必要な場合は後述参照。 |
7)成功してれば、pushする。ただし、コミットの書き換えで競合が起こるので、強制pushする
- git push origin +”ブランチ名”
僕のワークフローでは6)の後、もう一回rebaseでコミット名の修正をしています。
コミット名の修正は”pick”を”reword”として編集完了すればリネーム画面が開かれます。
vim触ったことなかったんだけどメリットが分からない。
どうも、PC初心者です。
第二回電王戦第四局
プログラミングの備忘録ばかり書いていて他のこと書いてなかった。
IssueからPullRequestを作成する
hubコマンドで僕が一番使うのがIssueをPullRequestに変更するコマンド。
git checkout -b "ブランチ名"
git commit --allow-empty -m "コミットのメッセージ"
git push origin "ブランチ名"
hub pull-request -i "Issue番号" -b "ベースにするブランチ名"
2)のコマンドが間違っていたので修正。
追記20140517
言うまでもありませんが、既に変更が加わっている場合はわざわざ2)をする必要はありません。
普通にコミットしてください。
自分のワークフローでは「作業前にプルリクエストを作成する」というルールがあるので、
作業前に空コミットを作成してプルリクエスト作成可能状態にしているのです。
DataTableのFindメソッド
仕事上、.NetのDataTableをよく触る。
主キーが設定されている場合はFindメソッドさんを使えば目的の行を取り出せる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
DataTable dt = new DataTable(); dt.Columns.Add("col1"); dt.Columns.Add("col2"); dt.PrimaryKey = DataColumn[] { dt.Columns[0] }; for (int i = 0; i < 10; i++) { DataRow dr = dt.NewRow(); dr["col1"] = i.ToString(); dr["col2"] = i.ToString()+"回目に追加された行です。"; dt.Rows.Add(dr); } //ここまでDataTableを作成しているだけ DataRow findDr = dt.Rows.Find("5"); Console.WriteLine(findDr["col2"].ToString()); |
上記は主キーが”5″である行を取得している。
で、このFindメソッドだけど、どうやら引数の末尾のスペースは考慮しないらしい。
つまり、
dt.Rows.Find(“5”)と
dt.Rows.Find(“5 “)は同じ結果になってしまう。
回避方法は今のところ不明。
DatatableのSelectメソッドも同様でした。
DataTableの情報には末尾空白のものを持たさないように工夫すべきなのかな。
今日の仕事でここで一瞬詰まった。
コード眺めると何の問題もなさそうだし。
デバッグしたらすぐにおかしいことに気がついたけど、
これは実装中は気付かないなぁ。
調べてみたけどあんまり文献がなかった。常識なのかな。
そういえばSQLのwhere句でも似たようなことがあった気がする。
あんまり覚えていないけど。