世の中ソーシャルコーディングの時代なのか、Gitレポジトリのホスティングサービスが主流になっている。
「Programming」カテゴリーアーカイブ
全角半角を区別せずに文字列を比較する。
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) { //比較対象と一致したときの動作 } } |
もっと良いやり方があるような気がするのだけど。
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句でも似たようなことがあった気がする。
あんまり覚えていないけど。
Rubyとか知らないけどHubコマンドを導入する方法
GitHubのプルリクエストの作成とか、そういうものをGitBashやコマンドラインからできる凄いやつ、
それがhubコマンドです。
GitHub社製です。
で、こやつはRubyで作られてるらしいんだけど、僕Ruby触ったことないヘボだからよくわからなかった。
試行錯誤して何とか導入したので、とりあえず何をやったかメモ。
絶対に最適方法じゃないけど、「Rubyとか何やねん。Hubコマンド入れたらもうそれでいいねん」という僕と同じ境遇の人の何かの助けになれば。
・前提
- Windows8.1,Rubyを導入していない
- GitやGitHubの基本的な作業はできる
1)Rubyのダウンロードページ(https://www.ruby-lang.org/ja/downloads/)に行き、画面最下部の”RubyInstaller”をクリックする。
2)Downloadをクリック
3)RubyInstallersで最新のものをクリックしてダウンロード
- 2014/05/12時点ではRuby 2.0.0-p481でした。64ビットのやつでも別になんでもいいと思う。
4)インストーラに促されるがままRubyをインストール
- 途中で3つチェックボックスがある。どっちでもいいと思うけど僕は全部にチェック入れた。
- git clone git@github.com:github/hub.git
- cd hub
- gem install hub
Githubのissueは削除できない
タイトルの通り、GitHubのissueって削除できないのね。
変なissue作ると永遠に残るという鬼畜仕様。
仕事用アカウントで個人プロジェクトにissue登録しちゃって、それが「Repositories contributed to」にでてきてしまい、仕事用アカウントから個人アカウントがバレるという状態。
github作業の一連プロセス
仕事でgithubを使うことになったので使い方のメモ
・前提
github上に目的のレポジトリが既に存在している。
gitやSSH等の設定済
1)レポジトリをローカルにクローンする
- git clone <リモートレポジトリ>
- git branch -b <ブランチ名>
- git add –all
- (–allとすることで現在のディレクトリ全てをaddできる)
- (“git add .“でも良いが、これは削除ファイルに対応していないので、”git rm <ファイル名>“が必要になる場合がある。細かいことを設定しないなら–allの方が楽)
- git commit -m <コメント>
- git push
- (ローカルでブランチを作成した場合は以下のようにする)
- git push origin <ブランチ名>