git | マージのタイミングで毎回gcが発生する際の対処例

gitリポジトリを使った開発中に、何故かマージ動作が起きるタイミングで毎回git gcが実行されてしまう状態になりました。環境は次の通り。


$ git --version
git version 2.6.2.windows.1

マージが発生するコマンド全部(merge、rebase、その他)なので非常にウザいです。で調べてみてもよくわかりません。

そこで試したのが以下の手順

  1. git gc –aggressive
    ガッツリGCやってゴミを減らす
  2. git prune
    自動gcの後に「warning: There are too many unreachable loose objects; run ‘git prune’ to remove them.」と表示されたので実行

これで毎回gcが発生しなくなりました!やったね!

同じ状況になった人は試してみてはいかがでしょうか?

2015年ふりかえり by @masaru_b_cl

今年も残すところあとわずか!ということで、昨年に引き続き1年の活動を振り返ってみようと思います。


1月

ASP.NET Identity連載の第8回掲載

昨年からCodeZineで連載中の「ASP.NET Identity入門」の第8回として、Two factor authentication、いわゆる二要素認証について書いた記事が公開されました。

 

Windows向けの開発環境自動構築スクリプト作成

Git for WindowsやVimなどをWindows環境で自動インストールするスクリプトを作成しました。

masaru-b-cl/create-win-dev-env

ただ、その後Windows向けwgetの公開ページにアクセスできなくなったり、Git for Windows 2.x系が公開されたりと、見直ししないといけないなぁと思っています。


2月

「Visual Studioのコード分析機能を利用してコードの品質を上げよう」掲載

CodeZineで「Visual Studioのコード分析機能を利用してコードの品質を上げよう」が公開されました

CodeZineのPR記事「さらに使いやすく便利になった「Visual Studio」を始めよう!」の一つとして、「Visual Studioのコード分析機能を利用してコードの品質を上げよう」が掲載されました。


3月

ASP.NET Identity連載の第9回、第10回公開

ASP.NET Identity入門 第9回が公開されました

外部アカウント認証についての第9回、ユーザー管理機能についての第10回の記事が公開されました。

 

長岡IT開発者勉強会 第40回「初心者Day!」に参加および発表

長岡IT開発者勉強会 第40回「初心者Day!」で発表してきました #nds40 by @masaru_b_cl

WindowsやOfficeなどの基本的なショートカットキーの紹介などで1セッションしてきました。まさかこのときは、これで今年のNDS参加が最後になるとは思っていませんでした…(すいませんすいませんすいm(ry


4月

ASP.NET Identity連載の第11回公開

ロール(権限)管理およびロールによる機能制限方法についての第11回が公開されました。

 

長岡IT開発者勉強会 第41回「入学おめでとう会」のLTと懇親会だけ参加

第41回 長岡IT開発者勉強会に顔出してきた #nds41

この日のNDSは、ずっとお世話になっていて5月に新潟を去った@neko_gata_sのお見送りも兼ねて、本編には参加できませんでしたが最後に顔出しと無茶振りのLTをやってきました。

なお、LTで話した新人研修の話は、その後実践して概ね良い結果でした。改善点などはまた追々アウトプットしていければと。

 

semver.orgの日本語版のtypoへの修正Pull Request作成

Node.js等で採用されている体系的なプログラムバージョニング規約である、「セマンティック バージョニング」の日本語版を読んでいたところ、軽微な誤りを見つけたので修正Pull Requestを作成しました。

このPRは11月に無事マージされ、現在のWebページは正しい内容で読むことができます。


5月

本業が忙しかったこともあり、特に目立ったアウトプットはありませんでした。


6月

実例に学ぶチーム開発におけるNuGet導入のすすめ 第1回公開

VS PR記事の時に案として出たけれど没になったNuGetに関する記事を、ASP.NET Identity連載の合間に、2回に分けて「実例に学ぶチーム開発におけるNuGet導入のすすめ」として執筆しました。その第1回目「チーム開発でもパッケージ管理を容易に! NuGetを活用してライブラリを効果的に配布しよう」が公開されました。

 

EntityClassGeneratorForOracle公開

テーブル定義に対応したEntityクラスを自動生成するコマンドライン実行ファイルである「EntityClassGenerator for Oracle」を公開しました。

masaru-b-cl/EntityClassGeneratorForOracle

このプログラムの元ネタは、@neueccさんの「Micro-ORMとテーブルのクラス定義自動生成について」です。この記事を最初に読んだ時からいつか作ろうとは思っていたのですが、ちょっとまとまった時間ができたので、さくっと作りました。


7月

実例に学ぶチーム開発におけるNuGet導入のすすめ 第2回公開

先月に引き続き、第2回目「NuGetを活用してライブラリの変更に柔軟に対応しよう」が公開されました。


8月

ASP.NET Identity連載の第12回公開

独自の認証処理を行う方法についての第12回が公開されました。


9月

ASP.NET Identity連載の第13回公開

任意のデータストアを使う方法についての第13回が公開されました。

 

OnBuildにMSBuild 14.0向けパッチのPull Request作成

VSでビルドした時にNuGetパッケージを作成、公開できる@kazukさん作のNuGetパッケージ「OnBuild」に対して、VS2015のみの環境で動作しないという問題があることがわかり、その対処の一部としてのパッチを作成しました

ただ、VS2015自体のNuGetの動作がいまいちまだ不安定なので、本当の意味でのVS2015対応はもう少し先になりそう、とのことでした。


10月

ASP.NET Identity連載の最終回公開

本連載の締めくくりとして、ASP.NET 5 BetaにおけるASP.NET Identityについての第14回が公開されました。1年を超える長い連載も、ようやく終了しました。

 

Niigata.NET開催

Niigata.NETを開催してきました #ngtnet

かねてから新潟でも.NETの勉強会を開きたいと熱望してきましたが、@AILightさん、@84taka0310さんのご協力もあり、ようやく開催することができました。

第2回もそれほど間をあけずに開催したいとは思っているのですが、最近多忙で準備する時間が確保できないでいます。春頃を目途にまた準備していこうと思います。


11月

年末に向けで徐々に忙しくなったこともあり、目立ったアウトプットはありませんでした。


12月

Advent Calendar参加

このところ毎年恒例のAdvent Calendarに今年も参加しました。

参加したのは以下の3エントリ。


 

今年はASP.NET Identity記事が終わった後、少し燃え尽き症候群のような状態もあり、アウトプットが比較的少なめでした。それでも、Niigata.NETが開催できたことは、本当に良かった。

来年はプログラマの定年である35歳の今色々と考えるところがあり、すこしじっくりと考えて様々なことに取り組んでいこうと思います。その過程でまたアウトプットすることもあるでしょう。

それでは、みなさん良いお年を!

 

書評 | プログラマのためのDocker教科書

プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化

WINGSプロジェクトにてレビューアを募集していたので応募し、献本していただきました。

本書はこの1,2年ですっかりメジャーになったDockerおよびその周辺ツールについて、実際のコマンド、設定ファイルの例、動作イメージなどをふんだんに盛り込んで紹介しています。

Dockerは進化スピードも速く、またいわゆるWeb系のコミュニティで人気があることもあり、これまで日本ででは体系的にまとまった情報を得る手段があまりありませんでした。本書ではDockerのインストール方法から基本コマンドの説明、ローカルリポジトリの利用方法、さらにはDocker Machine、Docker Swarmといった周辺ツールの説明も順を追って説明されているため、最初の一冊にふさわしい内容と言えます。また、コマンド等のオプションについても、主要なものは個別に取り上げ、説明されていますし、索引も非常に充実しており、リファレンスとしても活用できるでしょう。

その他、一番最初にネットワークなどの「インフラ」用語について解説されているのも好印象でした。「プログラマのための」と銘打っているように、インフラに精通していないプログラマ(程度問題ではありますが)でも、一通りの知識をつけることができ、例えば新入社員~2,3年目の経験の浅いプログラマにはうってつけです。

ただ、気になる所がないわけではありません。

まず、dockerコマンドのオプションの例を実際に打ち込みながら学習を進めていると、たまにそのコマンドを実行する前に何をすればよいのかわからないことがありました。例えばあるコンテナが動作している前提で実行するコマンドがあり、そのコンテナをどうやって作ればよいのかわからない、といったケースです。少し考えればなんとなくは分かりますが、全くの初心者にはちょっとつらいかもしれません。

他には、ボリュームやリンクといったコンテナ間の連携機能の動作イメージが少しわかりにくく感じました。これらはそもそもが少し難解な概念だということもあるとは思いますが、ボリュームオプションで指定したボリュームに他のコンテナからどのような順でアクセスしているのかを、順を追って説明した図などがあればよかったです。

とはいえ、これらの問題は本書の本質的な価値にはほとんど影響ないでしょう。総じて良くまとまっており、Dockerを触ろうと思った人に、自信を持ってオススメできる一冊だと思います。

oo4oを倒した話 by @masaru_b_cl #vbadvent2015

この記事はVisual Basic Advent Calendar 2015の22日分です。昨日は@hilaponさんの「Visual Basic 2015 の新機能(その3) – (憂国のプログラマ Hatena版 改め) 周回遅れのブルース」でした。

問題

未だにまれによくあるVB6→VB(.NET)への移行の際、問題となるのがサードパーティ製品の扱いです。その中でもRDBMSへのアクセスを行うプロバイダーの変更は特に厄介です。

もちろん、データアクセス処理を適度に抽象化して、一箇所にまとめているようであれば、影響は小規模で済むのですが、VB6といえば良くも悪くも「誰でも」システムが作れたので、まぁお察しということで。

そんな状況の中、Oracle Database 11gまでサポートしていたoo4o(Oracle Objects for OLE)が、Oracle Database 12cではとうとうサポートが打ち切られてしまい、ODP.NETへの乗り換えを余儀なくされてしまいました。とはいえ、システム内のあちこちにoo4oを直に叩くコードが散乱していて、すべて書き換えるのは無理があります。

解決法

というわけでこんな感じのものを作って、oo4oを倒すことに成功しました。

https://github.com/masaru-b-cl/Oo4oBuster

oo4o Buster

oo4oを操作するコードをなるべく変更せずに、ODP.NETへ置き換えるためのサポートを行います。

必須要件

  • ODP.NET 11g or higher

使い方

Using db = BusterDb.OpenDatabase(dbName, userId, password)
  Dim dynaset = db.CreateDynaset(sql)

  Console.WriteLine("count = {0}", dynaset.RecordCount)

  While Not dynaset.EOF
    Console.WriteLine("name = {0}", dynaset("name").Value)
    Console.WriteLine("age = {0}", dynaset("age").Value)

    dynaset.MoveNext()
  Next

  dynaset.Close()
  db.Close()
End Using

ライセンス

zlib/libpng

oo4oを利用したコードとの比較は、次のテストコードを参照してください。

https://github.com/masaru-b-cl/Oo4oBuster/blob/master/Oo4oBuster.Test%2FOo4oBusterTest.vb

解説

ざっくりいえば、次のようなものがポイントです。

  • 動的アクセスを主体とする
    • VB6のころもVariant型でやってたし
    • ダイナセットの実装はプライベートで外に見せない
  • oo4oの基本的なAPIをエミュレートする
    • OpenDatabaseプロシージャ
    • CreateDynasetプロシージャ
    • Move*系プロシージャ
    • etc…
  • Disposableパターンで後処理する

実際業務で使ったのは、トランザクション管理などもう少しいろいろと実装していますが、基本はこんな感じです。

まとめ

動的アクセス万歳!

明日は…

@yajuさんにバトンタッチです。

 

少しの勇気 #childadvent by @masaru_b_cl

というわけで1番乗りさせてもらいます、高野です。以前の「子育てエンジニア advent calendar 2012 : ATND」にも参加していたことをすっかり忘れていましたが、今回の発案者の伊藤さんにバトンタッチしてましたねw

当時から変わったことといえば、次男が生まれて二次の父となったこと、長男が小学生になったこと、といった感じでしょうか。記事を読み返して、当時を懐かしんでもみたりしました。

さて本題。

今回のテーマは「少しの勇気」です。

私は地方のよくある中小SIerでプログラマーとして働いています。都市部の顧客を相手に、2次~3次請けの割合が多く、直案件もちょろちょろとあるような規模だと考えてください。

こういった企業でよくあるのが、「出張」、「時間外勤務」です。月~金は客先に出張で週末は自宅で過ごす、納期に間に合わないので遅くまで作業して補填する、といったことは、残念ながら未だによくあるのが現状です。その理由は様々ですが、どうか「お察しください」ということで…

子供が生まれる少し前くらいまでは、私も多分に漏れずそんな労働に組み込まれていました。しかし、子供が生まれるとわかってからは、そんなことをやっている暇はありませんので、きっぱりと決別しました。

どうしてそんなことができたのか?

それは「声を上げた」からでした。上司を通じ、会社に対し「子供の世話があるので、出張、時間外勤務をしなくて済むよう、配慮をお願いします」と言ってみたのです。

その結果、これまではそういった要望を上げる社員が少なかったのか、案外考慮したプロジェクト、仕事に配属してもらえるようになりました。ここ数年は出張は年に数回日帰りもしくは1泊程度、時間外勤務は突発的なものでまれに数時間発生しますが普段は0という状況です。

おかげで、毎日定時に上がり、家に帰って妻と一緒に夕食を作り、子供達とお風呂に入って寝かし付け、洗濯や食器洗いなどの家事を片付けて、寝る前に少し自分の時間でこういった記事を書いたり、といった生活を送れています。また、今は休止していますが、ここ数年書籍やWeb記事などの執筆を行っていた時間も、こういったこともありそれほど無理せずに確保できました。

もちろん、ある意味「わがまま」を聞いてもらっている状態ではあります。ですので、普段の仕事の生産性を上げたり、自分を社内にとどめていた方が良いと思わせるスキルセットをそろえるといったことはやっているつもりです。例えば、業務システムの基盤の設計、運用を行えるよう知識、スキルを磨いたり、社内のインフラの面倒を見たり、といったことです。

しかし、そういったことを抜きにしても、まずは「声を上げる」という「小さな勇気」が何よりも大事だったように思います。

読者の皆さんの中には、今も大変な勤務状況の方もおられるかもしれません。そんな時は、まずは上司に掛け合ってみてはどうでしょうか?それで待遇が改善されればよし、されずとも「そういう組織」であることがわかるので、環境を変えるという行動への後押しになることでしょう。

現状に不満があるのなら、「小さな勇気」を持って、一歩踏み出してみましょう。動けば必ず「何か」が変わります。

 

明日は@karamem0さんにバトンタッチの予定です。

Niigata.NETを開催してきました #ngtnet

Niigata.NET 2015-10 – Niigata.NET | Doorkeeper

先週土曜日の10/10に、新潟県初(?)の.NETな勉強会を開催してきました。

イベント運営について

会場について

今回の会場は「まちなかキャンパス長岡」を利用させていただきました。この施設は、長岡市民が非営利目的でこういったイベントのために利用する場合、なんと無料で利用できます。

なんと、無料で利用できるのですよ!!!(大事なことなので二度言いました。)

ただ、この好条件のため非常に競争が厳しく、予約開始となる3ヶ月前の月初には、朝一で電話してもなかなか繋がらずに大変でした。なんとか繋がったらすでに最初に狙っていた部屋は予約で埋まっていましたし。今後もこの会場を使うのであれば、こういった事情も考慮して何はともあれ会場を抑えるのが重要となっていきます。

会場の広さについては、少し手狭だったと反省しております。Max30人の会議室に22名の参加があったため、3人掛けテーブルにきっちきちに座っていただかないといけませんでした。やはり狭くパーソナルスペースを守れないため、少し不快な思いをさせてしまったのではと思います。申し訳ありませんでした。次回はもう少し広い部屋を検討します。

参加者募集について

最初は全然人が集まらなくて、スピーカーと関東の重鎮の方々しかいないという状況がしばらく続きました。そのため、自分の職場に声をかけてみたり、石野さんのパワーによりいろいろ調整していただいたりした結果、最終的には22名もの方にご参加いただけました。

私もtwitterやfacebookを中心にアナウンスはしてみましたが、普段リーチしない層にいかにイベントがあることを届けるかが今後の課題となります。

また、今回Doorkeeperを使ってイベントおよびその後の懇親会の参加者登録を行っていただきましたが、Doorkeeperの操作ミスなのか、事前に登録されていなかった方が1名いらっしゃいました。これは正直しょうがないことなので、運営側はこういった事態もあるということを想定しておく必要があると認識する良い機会となりました。

また、懇親会については当日になってかなりの人数増加があり、懇親会会場と幹事をお願いした方にご迷惑が掛かってしまいました。同じくDoorkeeperから事前のリマインダーを送るなどはしていましたが、返答必須としていたわけはないので、今後は変更がなくとも確認を行っていく必要性を感じました。

当日の進行について

最初は良かったのですが、セッションの中で参加者の方とのやり取りが結構発生したこともあり、それぞれ少しずつ時間が伸びてしまったため、LTを予定していた山Pさんの分を削ることとなってしまいました。セッション中に参加者との意見交換が起きることは、個人的には良いことだと思っていますので、やはりもう少し余裕を持ったスケジューリングと、セッション時間を事前にもう少し取り決めるなどして、今後は回避していきたいと思います。

ちなみに、このスピーカーと参加者の意見交換については、「内輪でなんかやってる」感が出てしまうという面もあります。特に今回は関東からいらっしゃったマスターの方々は勉強会慣れしており、こういったことに抵抗がないのですが、初めて参加したような方には異質に見えたかもしれません。こういった事態については、コミュニティとしてどういう方針で行くのか、改めて議論して今後の運営に反映させていこうと思います。

MSノベルティについて

今回MVPである石野さんを通じて、マイクロソフト様よりノベルティをいただきました!本当にありがとうございました!

この他、MSマークの入った金太郎飴も大量にいただきました(写真なし)。見た目がかわいいだけでなく、美味しいと家族にも好評でした。

ビッグなノベルティである「プログラミング Windows 第6版 上」2冊は、石野さんと私相手の壮絶なじゃんけん大会の結果、上記の片桐さんと@ma_2_iさんが獲得されました。おめでとうございます!

セッションについて

業務アプリケーション開発を支える.NET技術(@masaru_b_cl)

私のセッションです。

前半のNuGet、MSBuildについては、その利点を伝えられたかなと思います。後半の実装面については、急に難しくなって参加者を置いてきぼりにした感がありましたので、もう少し必要性や実装方法のわかりやすさを伝えられる説明の仕方を検討する必要があります。

なお、MEF、WCFのサンプルはこちらから参照ください。

masaru-b-cl/ngtnet-2015-10 – GitHub

このイベント最初のセッションということもあり、参加者の皆さんとやり取りしながら進めることを意識していました。関東勢の皆様には本当にやいのやいのとご協力いただき、感謝しております。覚えている範囲で、どんなやり取りがあったか書いておきます。

  • NuGetは便利そうだけど、ローカル環境でも使えるのか?
    • ファイルサーバー上の共有フォルダーをリポジトリーとすることができる
  • MSBuildをコマンドラインオプションでターゲット指定して実行しないのか?
    • あくまで実行はbatファイルで行い、その中でターゲット指定などオプションを切り替えるのはありだと思う
      • なるべく誰でもできるようにするため
  • WCFの非同期処理のTaskの対応状況は?

Windows10体験記 ― これ、どうやって動いてるの?(@84taka0310)

山Pさんのセッション。

途中懐かしのWindowsとの対比が出てきたり、Spy++で最新のWebブラウザーであるMicrosoft Edgeに潜ってみたりとなかなか面白かったです。

個人的なツボはこちら。

アプリしか作れないけどAzureに触ってみた(@nemuzuka)

片桐さんのセッション。

VPSで動いているApache->Tomcat->Scala->PostgreSQLなサービスを、BizSparkを利用したAzure Web Apps -> Azure VMな環境に乗せ換える話で、個人的には今回一番面白かったです。

特に仮想ネットワークの辺りは、以前私もちょっとだけ触ってみてよくわからなくて挫折したこともあったので、こうやって設定すればよいのかと非常に勉強になりました。

今回は特殊な事情によりAzure VMを使わざるを得ないため、BizSparkのAzure利用無料枠をオーバーしてしまったそうですが、ぜひ無料枠で収まる構成でリベンジしていただき、その成果を公開していただけたらうれしいです。

大人の基礎C#(@AILight)

もう一人の主催であるMicrosoft MVP for Visual Studio and Development Technologies(長い)の石野さんのセッション。

C#という言語の歴史と、最近のモダンで便利な機能の紹介&デモでした。我々のようなC#erには良いおさらいに、未経験or初心者には新鮮に映ったのではないでしょうか。

また、C#の話だけでなく、どのようにプログラミングを上達させていくかということにも触れていて、初心者の方には良いとっかかりとなったと思います。「エアコン」クラスを設計してみるなどは、さらに進めてインターフェースの理解などにもつながるので、ぜひ私もお勧めしたいです。

ただ、イベント時間自体が押していたこともあり、資料の半分くらいしかできなかったことは残念でした。ぜひ次回に続きを行っていただけることを心待ちにしております。

LTについて

石坂さん

つい先日リリースされたVS2015 Update 1 CTPおよびC# Interactive(CSI)の話でした。なんとデモしようとしたらCSIが動かないというトラブルが発生!これは実際に自分で動かしてみないといけませんね。

CSI自体は「ようやく」といった感じで心待ちにしていた人も多そうです。LINQPadと併せて活用していきたいですね。

石坂さんにはこの他、うなぎパイとお菓子のお土産までいただき、本当にありがとうございました。

間島さん

Windows女子部の方によるAzure VMにマインクラフトサーバーを立てて遊ぶ話でした。

そんなWindows女子部のイベントが開かれるようですので要チェック!

Windows女子部IT秋祭り ~電子工作のワークショップお申込み枠~|EventRegist(イベントレジスト) 

柏崎ワロタロさん

JavaScript+WebGLを使った「動く壁紙」を、TypeScript+WebGLに変換後、TypeScript->C++とコンバートしてAndroidアプリなどにした話でした。

あ…ありのまま 今 起こった事を話すぜ!(ry

実際のコンバートに際しては、TypeScript内にコメントでメタ情報を埋め込み、DSLを構築していた感じでした。なんというか、突き抜けていますね(褒めてます)。

近江さん

Azure StorageのData Movement Libraryの内部動作について、どうやって高速化しているか紹介してくださいました。残念ながら、これから本題というところで時間切れとなってしまいましたが、一般的な高速化戦略について簡単に知ることができてよかったです。

[※追記]
ご自身のblogに解説エントリが掲載されました。

Niigata.NET Page Blob Download 最適化 — Kyrt Blog

懇親会について

懇親会は「十字路」で執り行いました(幹事のいしばしさん、ありがとうございました)。このお店は8種の越後の地酒が飲み放題に含まれるという太っ腹ぶりが素晴らしく、関東勢へ大いに振る舞わせていただきました。

懇親会では各自様々な話題に花咲き、楽しいひと時を過ごせていただけたものと思います。私としても、マスター各位と深い話ができて非常に良かった。

二次会は「煉瓦亭」に移動し、「コードレビューを含んだコーディングイベントはどうか?」、「git bisect便利だよ」、「業務アプリなら各プロジェクト単位でリポジトリ化してNuGetでつなぐのが良い。デバッグシンボルはNuPeekで配る」など、さらに濃いい話で最高でした。そんな話をしていたら、こんなトラブルもありましたが…

ともかくも、こういったガチ話、特に.NETでは普段なかなかできないので、とっても楽しい時間を過ごすことができました。皆さんありがとうございました。

今後の活動について

まだ白紙状態ですが、定期開催することを目指して石野さんをはじめとした県内.NETerと相談しつつ、できる範囲でゆるゆると行きたいと思います。今後ともご協力をいただければ幸いです。