読者です 読者をやめる 読者になる 読者になる

clock-up-blog

go-mi-tech

「リンク作成シェル拡張」を GitHub でメンテナンスしていきます

Windows C++ ツール オープンソース

// この投稿は Windows & Microsoft技術 基礎 Advent Calendar 2015 の 13 日目の記事です。Advent Calendar っぽくないネタですみません。

端的にいうと T.Kawasaki 氏の「リンク作成シェル拡張」を、僭越ながら GitHub 上の僕のアカウント上でメンテナンス運用していくことにしました。(T.Kawasaki 氏からの許可はいただいております)

kobake/lnhdr · GitHub

Windowsにおけるシンボリックリンクを作成するツール

T.Kawasaki 氏の「リンク作成シェル拡張」というツール、昔から Windows を触っている開発者寄りの方々は割とお世話になっている方が多いのではないでしょうか。


いわゆる「シンボリックリンク」の作成を Explorer のコンテキストメニューから行えるようにするツールです。

f:id:kobake:20151213172249p:plain

Windows で開発寄りの作業をよくする方だと分かると思うのですが、単なるショートカットでは事足りなくて、シンボリックリンクが必要になることってよくあります。(この時点でピンと来ない方には具体例の説明が必要になりますが、ちょっと実務的な話になってしまうのでそれはまた別の機会にでも)

一応 Windows Vista 以降には標準で mklink というコマンドがあり、これでシンボリックリンクを作成することもできるのですが、やはり GUI 上から操作できたほうがいろいろ捗ることは多いです。(ちなみにこの「リンク作成シェル拡張」がサポートしていた Windows 2000/XP 等ではそもそも mklink コマンド自体がまだなかった記憶。そんな事情もあり、このツールは当時とても貴重でした)

メンテナンス内容について

メンテナンスといっても、既存バージョン (1.52) の完成度が高く、これといって大きな何かをすることもないのですが、現在の (2000/XP 時代から比べると) 新しいOSでの機能に対応する、とかそういった所です。

たとえば Windows Vista より前の Windows OS では、正確には「シンボリックリンク」というものは存在していなくて、あるのは「ジャンクション」と「ハードリンク」でした。リンク作成シェル拡張1.52が実現していた機能は、実際には「ジャンクション」と「ハードリンク」を作成する機能だったのです。

今回 1.53 における機能追加では、「ジャンクション」「ハードリンク」「シンボリックリンク」を明確に区別した形で利用できるようにしました。

f:id:kobake:20151213173208p:plain

1.52 でのリンク作成機能の挙動としては、対象がディレクトリであれば「ジャンクション」を作成し、対象がファイルであれば「ハードリンク」を作成する、という具合に自動でリンク種別を切り替えるものでした。そのような挙動はとても親切でして、それと比べると 1.53 での明確に区別した挙動は、もしかしたらやや不親切に感じる方もいるかもしれません。そのあたりはユーザさんからの意見も聞きながら何か良い感じの実装を模索していければと思っています。

設定ダイアログによって好きな挙動を設定できる、ということも考えましたが、さすがにそこまでやるのはコストと効果が見合わないな、と思っていて、そのような実装は見送っています。

対応 OS について

現 1.53 の時点では Vista に依存するコードを書いてしまっているため、たぶん Vista より前の Windows OS では動かないと思います。そのあたり、Vista より前では 1.52 を使ってもらうようにするか、もしくは新バージョンでも Vista より前で動くようにビルド調整するか、メンテナンスしながら調整判断していこうと考えています。

また、現時点では手元の動作環境が Windows 7 64bit しか無いため、他の環境での動作確認をしておりません。Issues やその他コメント等にて「この環境で動いたよ」「動かなかったよ」等のご報告いただけるとありがたいです。動作状況について README に追記していきます。

参考:リンク種別の解説

「ジャンクション」「ハードリンク」「シンボリックリンク」の違いについては以下の記事がとても分かりやすく書かれており、実装時にも参考にさせていただきました。

時の流れへの雑感および謝辞

1.52 が公開されたのは 2006年1月15日、今回 1.53 を公開するのは 2015年12月13日。
実に9年と11ヶ月を経てのアップデートとなりました。

200X年代というと自分の中ではまだまだ「最近」という印象なのですが、指を折って数えてみるともう10年以上前の時代だったということに驚きます。そんな時を経てもソフトウェアのアップデート作業を行えたのは、オープンソースという形でソフトウェアを公開いただいていた T.Kawasaki 氏のおかげです。ソースコード自体よく整頓された形になっており、とてもメンテナンスしやすかったです。

リンク作成シェル拡張のソースコードを公開いただいていた T.Kawasaki 氏、パッケージを代理配布いただいていた id:deraw 氏、junction.c 作成者の Mark Russinovich 氏、また、T.Kawasaki 氏に情報提供を行っていただいていたユーザの方々に、この場を借りてお礼申し上げます。

今回 GitHub をメンテナンス場所に選んだのは、今最も人が参入しやすい場所であり、将来に渡って他の方から情報やパッチの協力を得られやすそうであり、さらに言うと、将来自分以外の誰かにメンテナンスを引き継いでもらう時期が来たときにも、Fork という形でスムーズに移行ができそうだから、という理由があります。

存在が存在として残り続けるために必要なことは、それを残し続けようとする人々の「意志」だ、と誰かが言っていました。今回自分は「リンク作成シェル拡張」を現在もまだ「残し続ける価値のあるもの」とみなしました。またXX年後に、このソフトがまだ価値のあるものであれば、誰かの意志でその存在を紡いでいって欲しいなと思っています。

});