この記事は個人開発 Advent Calendar 2020 14日目の記事です。
初めてのQiita投稿&初めてのAdvent Calendarという事で、作法等よくわかってなかったら教えて下さいませ。
簡単に自己紹介です。
福岡在住、41歳、WEB開発歴23年、普段はLinuxやらネットワーク、使える魔法はPerl/PHP、好きな食べ物はスクレイピング。
この記事の概要
では本題に行ってみましょう。
今日書くのは、インターネットの明瞭黎明期だった20年前から私が作ってきた個人開発のプログラムと、それがその後どうなったのか、というお話です。
最初に書いておくと、現時点で私が運営しているものはありません。過去の遺物ばかりです。
30~40代の方には懐かしいものもあるかもしれません。
モラル的にグレーなものもたくさん作ったのですが、書ける範囲で黒歴史を振り返ってみようと思います。
時系列はバラバラです。
Miximizer(ミクシマイザー):mixi代理閲覧システム
[mixi]とは
日本のSNSの雄、Mixi。
今ではモンストのイメージしかないMixiですが、かつては日本一のユーザー数を持つSNSでした。
そんなMixiの一番の売りであり、最大の弱点だった「日記」「ミク友」「あしあと」。
基本的にMixiのコミュニケーションはクローズドなもので、そもそも友人じゃないと日記が見れないという設定がデフォルト。
しかも、見たことがわかる「あしあと」の機能があるため、友達であっても日記を見るのをためらわれるということがよくありました。
(踏み逃げ禁止という謎の文化すらあった)
自分が見たことを知られたくないならプロキシにしたら良いんじゃね?
これを解決するソリューションとして考えたのが、ミクシマイザーでした。
私は「他人プロキシ」と勝手に読んでいたんですが、最初に私が10アカウントくらいを作ってサービスを開始。
Perl+Mechanizeで、指定された人の日記をスクレイピングして表示する、というものでした。
ただ、ここで見れるのはあくまで公開日記だけ。あくまでプライベートな日記は見れないわけです。
どうしたかというと「プライベートな日記を見たい人は、あなたのアカウントを他人プロキシとして使わせてくれたら他の人のアカウントを使って、その人のミク友の日記が読めるよ」としたわけです。
当然ですが当時はセキュアなログインAPIなんか無いわけで(というかあってもこんな用途には使えない)使いたいと、登録してくれた人のユーザーデータはDBに蓄積されていました。(もちろん悪気はありませんでした。同時に知識もなかったですけど。)
サービス公開後に、2ちゃんねるに見つかって、公開から2日でサーバーがずっと500エラーになる程のアクセスがあり、お祭り状態に。
そして終焉へ
当然ですが、Mixiの中の人も見るわけですね。
そして、これまた当然のように、ボットアカウントはすべてBANされ、更にMixi法務部から直々にメールでお叱りいただきまして、公開から4日くらいでクローズになりました。
かつ、セキュリティ業界の大御所の先生方にも大変叱られました。
今考えても本当に酷いシステムだったなと思います。
ごめんなさい。
AutoRuby.js(オートルビ.js): ふりがな自動入力ライブラリ
Javascriptが嫌われ者の時代の話。
やっと郵便番号の自動入力がJSで行われ始めた頃です。
「POS端末とかではふりがなの自動入力ってよくあるのになんでパソコンではできないんだ?」と思って調べたところ、JSでキーコードを取得できることを知って、調べてみたら入力値自体は取得できてるサンプルがあったので、それを改造して作りました。
現在では比較的よく見るUIの、ふりがな自動入力のシステムとしては、多分最初の実装だったんじゃないかと思います。
jQueryが出る前、prototype.jsしかなかったときに、JSのライブラリとして実装して、導入をしやすくしたのも流行った理由の一つだと思います。
forkされて知らないところで洗練されていく
AutoRuby.jsとして公開をしたところ、とても多くの反響を頂きました。
と、同時に「コードが糞」というありがたいご指摘とともに、たくさんフォークしていただきましてどんどん改善していただきました。
多分現在の主流はjquery.autoKana.jsになってるんだと思います。
名前も、ちょうどrubyが流行りだした頃くらいだったので「名前も糞」とありがたいご意見も頂きました。
現在は同様の仕組みが大手のサイトでも実装されてることが多く、自分のライブラリでもないのにちょっとうれしくなってしまいます。
もし孫ができたら「これはおじいちゃんがつくったんじゃよ」と多少の嘘も交えて自慢したいです。
ただ、作った本人がいうのもなんですが、私の名前が一発変換で出ないので個人的には嫌いなUIです。
ごめんなさい。
ちょっと公開できないレベルで酷いシステム
スクレイピングを覚えた頃、サルのようにスクレイピングばっかりやってた時期がありました。
Mechanize.pmが本当によくできてて、感動したんですね。
今でも思いますがプログラムを覚えるのに最初にやるべきなのはスクレイピングだと思っています。
全能感というか。
感動と同時にいろんな想いがこみ上げてきまして。
「あれ?これできるんだったら、あのサイトのデータ持ってきてこねくり回したら面白いことできるんじゃね?」と。
手当り次第にいろんなデータ系サイトやら、某オークションサイトやら、某成人男性系サイトやらをスクレイピングしまくって自分のPC内のDBの肥やしにしていました。
(一応、サービスサイトの負荷は考えてSleep時間やら、最大取得数は設定はしてましたが)
その辺の規制も、防衛システムも、倫理的な一般論もあまりない時代でしたが、それでも今考えると迷惑な話です。
ごめんなさい。
で、取得したデータをプログラムで正規化して、更にいじると外部からは見えなかった運営側の意図だったり、コンテンツ作成の時の意図だったりが見えるようになってきます。
「商品説明文を形態素解析のサイトにPOSTして、レスポンスの単語を集計してみると、特定の言葉が多い」とかです。
怒られない程度に色々実験してみたんですが、具体内容は酷すぎるので公開はできず。。。
今は仕組みよりデータの時代で、「スクレイピングはデータ泥棒」と言われても仕方ないと思っています。
実際に、スクレイピングで他人のコンテンツを取得し、それでアフィリエイトをやっている輩も存在する為、スクレイピング自体はやはり善にも悪にもなりえる技術です。
攻撃手段を知ることが防衛手段になる。
取得系よりも迷惑なのがPOST系です。
いわゆるスパムボットですが、これも仕組みとしてはスクレイピングです。
現在のGoogleは、ボットの検知能力が素晴らしく、そもそも一般ISP以外のレンジのIPアドレスを検知するとCAPTCHAでぐちゃぐちゃの文字を入れさせるか、reCAPTCHAでパーキングメーターを選択させられます。
reCAPTCHAの判定精度は恐ろしく正確で、スパムボットに悩んでいるサイト開発者はとりあえずこれを入れておけばスパムからはほぼ100%開放されます。
実際、とある有名企業から相談があり「一般投票系サイトで1位を取得したいから自動で票を入れるボットが作れないか」という話が来ました。
そしてそのサイトの最終的な投票の前にreCAPTCHAが設置してありました。
断ったのですが、興味はあったので自分のサーバーにreCAPTCHAを設置して色々やってみたのですが、最終的にプログラムでは突破できませんでした。
(ちょっと前に2Captchaという人力APIができたというのを聞きました。v2はこれで突破できるそうです。)
実際には世の中はまだまだスパムだらけです。
運営者は攻撃者の手段を知ることで、やっと防衛できるようになります。
WEBテクノロジー自体は堅牢なシステムが作れるようになっていますが、結局は実装する人次第です。
情報漏えいの殆どが、上層レイヤーの実装の問題です。
そういう意味では、WEBはまだまだ脆弱ですし、今後も脆弱であり続けると考えています。
仕事での開発の時も最終的には実装者本人のスキルに依存する為、個人開発者はその点も学んでいく必要があります。
偉そうに書きましたが、個人開発ってしばられずに好きなことできて楽しいよ!ということですね。
ありがとうございました。