どうも、最近のソフトウェア開発は、「外部ライブラリを拾ってきて使い方を調べて組み合わせて使う」という方向に行き過ぎているように思います。
自作できないほど巨大なライブラリならいざ知らず、ちょっとした機能なら自作するなり、もうちょっとややこしい機能なら必要な部分だけコピペするなりして、外部への依存を減らす方が結局のところ楽ではないかと私は思います。ライブラリを拾ってきたって、まず使い方を調べる必要がありますし、ライセンスも確認しなければいけませんし、思った通りの機能が実現できるかどうかもわかりません。ちょっと機能の違うライブラリを無理やり使うために変なことをしたりとか、何ならバグを踏んでしまってひどい目にあうとか、皆さん経験あるでしょう。
このページで公開するプログラムは、作者である私は一切著作権を主張しませんので、御自由にコピペしてお使いください。
「いやいや、自作するならともかく、コピペじゃあ、結局これをコピペするに人には外部のライブラリであることに変わりはないし、本家のバグ修正とか改良とかに追従できなくて困るだけなのでは?」と思う人がいるかもしれません。
もっともだとは思いますが、ここにはそんなに巨大なライブラリは載せません。普通のプログラマで十分読み通せるプログラムだと思うので、コピペして使う人は、ソースをひととおり理解してから使ってください。
「いやいやいや、そんなこと書いたって、世間にはネットで拾ったコードを理解もしないでコピペで使うプログラマがいっぱいいるよ。知らないのか」と言われそうですが、それに対する答えは「知っているけど、知ったことか」です。自己責任でご利用ください(そしてそれは、商用でない限り、たいていどんなライブラリでも同じです)。
単なるがらくた置き場になりそうな気はしますが、ここに置いてあるがらくたは、私自身が何かしら必要になって作ったものですので、私以外にも役に立つ人はそれなりにいるのでは、と、手前味噌かもしれませんが私自身は思っております。
以下、上に書いたことと重複する部分もありますが、ご利用上の注意です。
――このページを作るきっかけとなったのは、CSVパーサを自作したことです。このWebサイトkmaebashi.comの移行に伴い、掲示板のデータも移行の必要があったのですが、その際、元の(PHPの)掲示板からデータを抜いて、新しいDBに取り込む必要がありました。その際、データの受け渡しにCSVを使ったわけです。
PHPの掲示板からデータを抜く方についてはこちらに書きましたが、そのCSVをパース(解析)して新しいDBに取り込む必要があります。そのために必要なのがCSVパーサです。
プログラムのソースなども貼ってある掲示板のデータなので、Stringクラスのsplit()メソッドを使ってカンマで分割、というわけにはさすがに行きません。対象のデータには改行もカンマもダブルクォートも含まれるので、最低でも以下のような機能が必要です。
こういう用途に使えるようなCSVパーサは、Javaにはいくつもあります。しかし、たかがCSVのパースのために外部ライブラリを使うことには、私には抵抗がありました。
たとえば、Apache CommonsのCSVパーサだとソースはGitHubに上がっていますが、行数を数えてみると空行コメント込々で5799行ありました。今回私が自作したCSVパーサは147行です。もちろんApache CommonsのCSVパーサにはそれなりの機能やカスタマイズ性があるのでしょうが(コメントもかなりありますが)、私に不要な機能がいくらあっても無意味です。ちょうどその頃、仕事(C#)でやはりCSVを読まなければいけないことがあり、C#なら.NET FrameworkのTextFieldParserが使えるだろうと思ったら「ダブルクォートの中であっても、空行が無視される」というとんでもないバグ※1を踏んでしまったこともあり、これは外部ライブラリなど使うもんじゃないな、ということで自作しました。私がCSVパーサを作るのは初めてでもなく、実際難しいものでもありませんが、検索しても上記のようなライブラリかStringのsplit()で分割するようなサンプルしかないので、この程度のプログラムでも、公開しておけば誰かの役には立つかと思っています。また、私にとっても、たとえば他言語でまた作る機会があったときとかに役立ちそうです。
以前、JavaScriptのパッケージマネージャーであるnpmで、left-padという、「文字列の左を指定した文字(デフォルトは空白)で埋めて、右詰めにする」というライブラリが消されて大騒ぎになった、という事件がありました。leftpadぐらい小さな関数なんて、外部ライブラリに依存しないで自分で作れ、というのがリンク先記事を書いた江添さんの主張ですし、私もそう思います。
プログラマのお仕事が、コードを読んだり書いたりではなく、「ググってライブラリを見つけ、ググって使い方を調べ、エラーが出たらググって解決策を探す」になっているのって悲しくないですか。
このページを見ている方も、ググって辿り着いたのかもしれませんが、ここから先は、自分で作ったプログラムと同じように使えます。お好きなようにいじり倒してください。
長ったらしい能書きの割にたいしたもの置いてない、と思うかもしれませんが。
ここで公開しているプログラムの不具合、あるいは不具合に至らずとも「その書き方は古いぞ」とか、または説明にウソ、間違い、誤解を招く表現等ありましたら、ぜひ掲示板の方にご連絡願います。
また、このページに関していただいたご意見・ご質問・ご感想等は、公開することがありますのであらかじめご承知おきください。
反論があるようでしたら、オープンな場で議論すべきだと思いますし、同じ疑問を持っている人が他にもいるかもしれないからです。