js lover's

女子小学生が好きなわけじゃないよ…

オーストラリアの首都について

この記事はぐらぽむ Advent Calendar 2016の5日目の記事です。

続きを読む

期末の数学の最後の問題の解法と答(誰か添削してやってください

こういう問題を見たのはじめてだったから本当に解けてるのか自信がない。(でも破綻してる部分がないから多分あってると思う)

誰か数学の得意な方、添削してやってください。

続きを読む

解答編

昨日に投稿した記事の読み方です。

-1. 環境

Xubuntu 14.04。色んなものAPTで入れてるからかなりカオスになってる。

GCC,GFortranは4.8.2で、Rubyは2.1.2、Pythonは2.7.6と3.4.0。Node.jsは0.11.13だったと思います。

0. zipファイルを落としてくる

ここにも書いておきましたが、これは普通に落としてくるだけです。

# git clone https://gist.github.com/b35c5a5aa6f54b7faebb.git seccamp2014 && cd seccamp2014
Cloning into 'seccamp2014'...
remote: Counting objects: 28, done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 28 (delta 0), reused 20 (delta 0)
Unpacking objects: 100% (28/28), done.
Checking connectivity... done.
# unzip seccamp2014.zip
Archive:  seccamp2014.zip
  inflating: seccamp2014.py          

するとseccamp2014.pyというファイルができると思います。

ちなみにこのファイルを素直にPython(2.x、3.xどちらでも実行できます)として実行すると……、

# python seccamp2014.py > seccamp2014.2.py
# diff seccamp2014.py seccamp2014.2.py

Quineになっています。

1. Rubyとして実行する→7zファイルの取得

さて、seccamp2014.pyを素直にPythonとして実行してもQuineなので、あまり意味がありません。なので、少しコードを眺めてみます。

seccamp2014.py(冒頭部分)

__END__=0;s=1//2or'''/.to_s[1..0].gsub(/^$/){require'base64';Base64.decode64 (([*DATA][3..-2]*'').tr("lkjhgfdsamnbvcxzpoiuytrewq","qwertyuiopasdfghjklzxcvbnm"))}.display.to_i.succ
__END__
=1;'use strict';$=+[];____=$++;___$=$++;__$_=$++;__$$=$++;_$__=$++;_$_$=$++;_$$_=$++;_$$$=$++;$___=$++;$__$=$++;$_=({}+$)[_$_$]+({}+$)[___$]+([][$]+[])[___$]+(!$+[])[__$$]+({}+[])[_$$_]+(!!$+[])[___$]+(!!$+[])[__$_]+({}+$)[_$_$]+({}+[])[_$$_]+({}+[])[___$]+(!!$+[])[___$];$$=$[$_][$_];$$($$((!!$+[])[___$]+(!!$+[])[__$$]+(!!$+[])[____]+(!!$+[])[__$_]+(!!$+[])[___$]+$_[__$_]+'"'+([][$]+[])[_$_$]+(!$+[])[____]+'\\'+____+_$_$+____+(!!$+[])[____]+'\\'+___$+_$$$+___$+'\\'+___$+_$$_+____+(!!$+[])[__$$]+$_[___$]+(!$+[])[____]+'\\'+____+_$__+____+(!!$+[])[__$$]+$_[__$_]+$_[____]+(!!$+[])[___$]+'\\'+___$+_$$$+___$+'\\'+___$+_$$_+____+(!!$+[])[____]+(!!$+[])[__$$]+([][$]+[])[__$_]+(まだまだ続く)

何となくですが、1行目のto_sとかrequireからしてRubyのように見えませんか?

というわけでRubyとして実行してみます。すると、

# ruby seccamp2014.py

何だかバイナリのようなものが一気に出力されたと思います。さすがに全体を吐かれてもわけが分からないので適当に先頭の100byteくらい見てみると、

# ruby seccamp2014.py | head -c100

とかすると7zという文字が見えるので多分7zip形式のアーカイブなんじゃないかと当たりを付けて保存します。

で、7zコマンドで解凍を試みるのですが……。

# ruby seccamp2014.py > seccamp2014.7z
# 7z x seccamp2014.7z
Processing archive: seccamp2014.7z

Enter password (will not be echoed) :

パスワードの入力を求められました。次はこのパスワード探しです。

2. Node.jsで実行→ブラウザで実行→パスワードのヒントを取得

もう一度ソースコードをよく観察してみます。すると'use strict';functionからJavaScriptとしても実行できるのではないかと推測できます。

というわけでとりあえずNode.jsで実行してみると、

# node seccamp2014.py
$ cp seccamp2014.py seccamp2014.html && open seccamp2014.html

何やらコマンドラインらしき文字列が出力されました。これを、少し変えて(HTMLをブラウザで開く的な意味でopenコマンドが使えるのはOS Xとかなので)実行してみます。

# cp seccamp2014.py seccamp2014.html && xdg-open seccamp2014.html

すると次のようなページが開きます。

screen shot

「Hint: Pa-tto! Pa-tto! Hareyakani!」と表示されていますね。

「ぱーっとぱーっと晴れやかに」と言ったらハナヤマタしかないので、先程の7zのパスワードに「hanayamata」と入力してみます。

# 7z x seccamp2014.7z
Processing archive: seccamp2014.7z

Enter password (will not be echoed) :hanayamata

Extracting  seccamp2014.gz,v

Everything is Ok

Size:       32148
Compressed: 32025

というわけでseccamp2014.7zが解凍されて、seccamp2014.gz,vというファイルが現れました。

3.gz,vって何の拡張子だよ→RCSで取り出す

gz,vというか末尾に,vが付いているものはRCSといういにしえのバージョン管理システムのファイルになります。

バージョン管理システムというと、最近で言えばGitとかMercurialみたいなものですね。

とりあえずログを見てみます。

# rlog seccamp2014.gz

RCS file: seccamp2014.gz,v
Working file: seccamp2014.gz
head: 1.3
branch:
locks: strict
access list:
symbolic names:
keyword substitution: o
total revisions: 3; selected revisions: 3
description:
Compressed file
----------------------------
revision 1.3
date: 2014/08/20 01:44:46;  author: alucky0707;  state: Exp;  lines: +1 -115
Third version
----------------------------
revision 1.2
date: 2014/08/20 01:44:46;  author: alucky0707;  state: Exp;  lines: +115 -1
Second version
----------------------------
revision 1.1
date: 2014/08/20 01:44:46;  author: alucky0707;  state: Exp;
Initial revision
=============================================================================

何だか色々出てきましたが、ぱっと見て1.11.21.3という3つのリビジョンがあり、1.1から1.2になるときに+115行されていることなんかが分かります。

まあ行が増えてる方が正解かなーと(実際は試行錯誤するかもしれない)考えて、リビジョン1.2のファイルを取り出して、解凍します。

# co -l1.2 seccamp2014.gz
# gzip -cd seccamp2014.gz
program seccamp2014
  implicit none
(まだまだ続く)

出てきたファイルはどうもFortran 95っぽいです。implicit noneって言ったらFortranですよね?

4. Fortranとしてコンパイルして実行→C言語コンパイルして実行

というわけでFortranとしてコンパイルして実行します。

# gzip -cd seccamp2014.gz > seccamp2014.f90
# gfortran -o seccamp2014f seccamp2014.f90
# ./seccamp2014f
const char main[] =
(まだまだ続く)

するとC言語っぽいソースコードが出てくるので、今度はC言語としてコンパイルして実行します。

# ./seccamp2014f > seccamp2014.c
# .gcc -o seccamp2014c seccamp2014.c
# ./seccamp2014c

これでMarkdownっぽいファイル——つまり私のセキュリティ・キャンプの参加記が取り出せるはずです。

一つ注意するべき点は、seccamp2014.f90は少なくともリトルエンディアンで32bit以上な環境じゃないと上手く動かないと思うのと(私はx86_64なLinuxでしか試してません)、seccamp2014.c機械語をハードコーディングしているので間違いなくx86_64なLinuxじゃないと動かないと思います。

感想

考えたネタはなるべく実装しようと思ったので公開までに結構時間がかかってしまいました。

本当はもっと色々やってみたいことがあったのですが……(最初のpolyglotコードの言語数を増やしたり)。

ちなみに、私が知る範囲で解読してくださったのは@tyage氏だけでした。誰も解読してくれなかったらどうしようと思っていたので、読んでくださる方がいてよかったです、ありがとうございます。

以下、解読されたtext.mdです。また、生成スクリプトなどを含めたリポジトリalucky0707/seccamp2014 - Githubに置いてあります。

セキュキャンに行ってきた

セキュリティ・キャンプ全国大会2014(以下、セキュキャン)に参加してきたので、その感想とか色々をだらだらと綴っていきたいと思います。

応募のきっかけ

それは6月中旬のこと。

先輩「セキュリティ・キャンプって知ってる?」

あらっきぃ「一応知ってますけど」

先輩「応募してみれば? あらっきぃの実力なら受かるんじゃない?」

あらっきぃ「……(自分より実力ある先輩にそんなこと言われると謙遜するにもしにくい)」

先輩「あ、サイボウズスポンサーだしRed Bull飲み放題かもよ」

あらっきぃ「しゃあっ! 行くしかない!」

多少の語弊はありますが大体こんな感じだったような気がします。ぶっちゃけセキュリティに興味があったのかと言うとそんなことはあまり無かったかもしれない……。むしろ脆弱性を突かれる側だった……。

ちなみにRed Bull飲み放題じゃなかったです。先輩許しません。

また、なぜWebクラスに参加したのかというと、実はセキュアなシステムを作ろうクラスにするかでかなり悩んだのですが、Webクラスの講師にはせがわようすけさんがいたのが決定打でした。はせがわさんは主に「JavaScript関連」「Eject関連」で私がとても尊敬している人です。

セキュキャンの流れ

1日目

埼玉の僻地から幕張までやって来ました。

会場に着くと早速名刺交換です。実は私は名刺を持っていなかったので、セキュキャンのためにわざわざ作ってきました。当然名刺交換も初めてだったので、他人に名刺を渡す手がぎこちなかった気がします。最初の何人かは名刺を渡す向きが反対だったりして失礼しました。ごめんなさい。

そのあとは昼食を取って、全体でセキュリティについて考えさせられる講義を受けて、ゲストのソフトイーサ株式会社登大遊さんの話を聞きました。 この登さんのことは——筑波大学のシステムをハッキングしたことなど——はいくつか知っていたのですが、他にも面白そうなことをいくつもやっているんだな、と思いました。また、そう言った面白いことは、最大限の計算の上で成り立つものなのだとも思いました。

夕食後はゲストの警察庁(警視庁ではない)の萬谷さんの話を聞きました。自分の無知を晒すようであれなんですが、私はこのとき初めてフォレンジックという言葉を聞きました。自分の知らない方面の技術もまだまだたくさんあるんだな、と再確認させられました。

そのあとの専門講義では、初めてFirefox OSの実機(検定シールの不備で回収されたことで有名なFlame)に触れました。

2日目

この日の朝は確か、早起きしてErlangでQuineを書いていた記憶があります。完全に趣味の話なのであまり気にしないで下さい。

専門講義ではMozilla Japanの方の話を聞いたりして、Firefox OSについて何となく詳しくなったような気がします。

専門講義が終わるとチュータさんの成果発表を聞いたり、BoFというものをやったりしました。

BoFというのは「ブレスオブファイア」の略……じゃなくて、Bird of Featherの略だそうです。Bird of Featherというのは英語の慣用句で日本語にすると「同じ穴のむじな」という意味です。要するに興味がある人同士が集まってする座談会みたいなものです。 私はBoFでアニメ好きな人と集まって話したのですが、その際に@ntddk氏から東方などゲームのハッキングの話を少し聞きました。とても興味深かったです。

3日目

この日の朝は確か二度寝して7時に起きました。ごめんなさい。

3日目の午前中は企業訪問ということでウイルスバスターで有名なトレンドマイクロさんにお邪魔させていただきました。

トレンドマイクロさんがお盆中だというのにわざわざ説明等していただきありがとうございます。

感想としては、トレンドマイクロが日本に本社を持つ企業だということと、トレンドマイクロと言えばウイルスバスターがメインのイメージがあったのですが、そうではなくて企業のセキュリティサポートなどをやっていることが多いことに驚きました。

午後からは、講師の用意したFirefox OSアプリの脆弱性探し(バグ探しではない)という実習を行いました。「Cross」「Site」「Scripting」という三つのチームに別れて探したのですが、私は「Scripting」チームでした。

アプリの中にはXSS等の脆弱性も含まれていて、探すのはとても楽しかったです。

4日目

もう半分以上経過してしまったんだなぁ、と思いながら起床しました。

4日目の午前中は昨日探した脆弱性の発表をチームでしました。

その後は世界のKinugawaさん(このページの会社名がバグハンターの人です)の話を聞いたり、講師陣のセキュリティに対する姿勢などを伺ったりしました。人によって色々な考え方があり興味深かったです。

午後は楽しみにしていたCTFです。CTFというのはCapture the Flagの略で、(本来の趣旨とは違うらしいですが)出されたコンピュータに関わる問題をチームで解いて、その点数で競うといった内容のものです。 私は「レイジェン74」というチームで参加しました。このチーム名は確か、会場のテーブルに置いてあったルーターの名前から取ったはずです。

CTFは自分はWeb系の100点200点の問題しかほとんど解くことができず、チームに迷惑をかけたと思います。自分の実力を何度も呪いました。

ただ、一問だけ全体の中で自分しか解いた人がいなかった問題もありました。「GIFのみがアップロードできるサービスの脆弱性を探す」というもので、バイナリエディタを使ってがんばって脆弱性を突くようなGIFファイルを作ることで問題を解くことができました。 この一問を解いたおかげで何人かの講師やチューターの方の印象に残ることができたみたいだったのでとてもよかったです。がんばった甲斐がありました。

ちなみにCTFの結果は9位でした。まあどうにか一桁の順位に収まることができたのでよかったかなと思います。でももっと上にいきたかった気持ちもなくもないです。

5日目

気が付いたら最終日になってました。

まずグループワークの発表をしました。グループワークはCTFと同じチームで行っていました。

「セキュアな育毛」や「家具インジェクション」など面白そうなテーマの発表が行われる中、自分達は「POLTER GEIST」というテーマで家電製品のハッキングの危険性とその対策について発表しました。準備期間がとても短かったので、内容をまとめるのがとても大変でした。

その後は全体の成果発表があったりして、閉会式でした。

最後に本を二冊貰えるとのことだったので、私はやさしいインタープリタの作り方入門とBareMetalで遊ぶRaspberryPiの薄い本を貰ってきました。 実のところを言うと[リンカ・ローダ実践開発テクニック]が欲しかったのですが、目の前で最後の一冊を取られたんですよね…。くやしい。どなたか送ってください。

帰り道に駅のホームを間違えて帰るのが30分くらい遅くなるハプニングはありましたが、無事帰宅。本当にあっという間の5日間でした。

総括して

今までネットワーク上でしか交流のなかった[@mpyw]氏などや、何度か名前の聞いたことのある方々と実際に会って話すことができてとても大きな刺激になりました。

また、Firefox OSの実機にも触れることができてよかったです。

セキュリティについてはそこまで興味があったわけではないのですが、実際に行って講義を受けて、色々と考えることがあるんだな、と実感させられました。

セキュリティについて考えたこと

私がセキュリティについて思うことは色々とあるのですが、例えば上にさりげなく書いた「脆弱性探し(バグ探しではない)」という部分が大事なんじゃないなぁ。

脆弱性探し(バグ探しではない)」というのは、言葉の通りなんですが、脆弱性=セキュリティ上の欠陥というのは、単なる実装上のバグではないということです。

これはつまりどういうことなのかというと、セキュリティというとぱっと出てくるのはXSSSQLインジェクションなどですが、そのような技術的側面だけでなくセキュリティ・ポリシーのような考え方もあります。 セキュリティ・ポリシーはユーザーに対して企業/サービスがセキュリティに対してどのような姿勢を持っているかを示すというものです。このように、セキュリティとは技術面のみの問題ではないのです。

技術力を磨くことも当然大事ですが、セキュリティについて考えるのであれば、それ以上に技術以外の知識を学ぶ必要もあるのかな、と感じました。

応募用紙に書いたこと

来年以降の応募者のために書いておきます。

って言っても何書いたっけなぁ……。

確か「継続Webフレームワーク作りたいんだけど、実際に作るときにはセキュリティ面での配慮も必要だから勉強しておきたい」とか大言壮語を吐いたような気がします。他にもSOPについて自分の言葉で語れってところでは「Chromeはfileスキームのときファイル単位でオリジンが管理されるからハマってウザい」とかそんなことを書いたような……。

冷静に考えるとあんなものでよく通ったなぁ……。

とりあえず、こういうものに書く内容は基本的に過去の経験に裏付けられるので、色んなことを経験してそれを言葉に纏めておくことが大切だと思います。まったく、ブログの更新サボってる奴が言うセリフじゃねぇんですが。

事前にやっておくといいこと

事前課題をしっかりやるとか……。 それ以外にも自分で勉強しておくとか……。

そんな有り体なことを書いても面白くないし見飽きているでしょうし、そんなこと別にセキュキャンに行っていない人でも想像して書けるでしょう。なので、私が実際に行った経験から書いていきたいと思います。

1. 淫夢ネタに慣れておく

セキュキャンでは無駄に淫夢ネタが飛び交います。「こ↑こ↓」とか「ファ!?」とか。

これが参加者だけならいいのですが、困ったことに一部の講師まで淫夢ネタを常用します。

なので、淫夢ネタを把握していないと、周りにノリに置いていかれる恐れがあります。これは結構つらいです。

対策としては、語録をググって「あのさぁ」「いいよ!来いよ!」など汎用性の高いものから使っていくようにするなどするといいでしょう。

淫夢ネタを把握していると、日常的な会話の中で「うわっ、アイツホモビのネタを平然と使ってやがるよ…」と残念な奴を見抜くことができるようにもなりますし、一石二鳥です。

2. Twitterをやる

最近はバカッターなどと言われ世間でのTwitterの批判が大きく、やらない方がよいような気もしますが、セキュキャンに応募するような意識の高いあなたなら問題なくTwitterを使えるはずです。

今回のセキュキャンでは運営側がTwitterでの呟きをまとめてTogetterにまとめたりしていました。

名刺に書くネタも増えますし、セキュキャンが終わったあとも連絡を取りやすくなるかもしれません。かもしれないだけですが。

また、今回の場合で言えばとしぁさんを中心としたておくれている人達を把握していると幸せになれたと思います。

3. 買ってきた漫画は消化しておく

完全に私事なんですが、セキュキャンの前日にハナヤマタを全巻まとめ買いしたのですが、全巻読み切らずにセキュキャンに来てしまいました。

そのせいで1日目2日目は続きが気になって夜も眠れない状態でした。

買ってきた漫画は消化しといた方がいいです、はい。

4. コミケと被るから欲しいものは友人に頼んでおく

これも私事ですが、今回のセキュキャンはコミケと日程が大被りしました。なので、セキュキャンに参加しようと思うと必然的にコミケの1、2日目は行くことができなくなります。

私はこのことを完全に見逃していて、おかげで1日目に好きなサークルが新刊を出していたのですが、買い逃してしまうという失態をおかしました。

このようなことがないように、予めセキュキャンの日程を確認して、緻密に計画を練っておくことが大切かと思われます。

最後に

こんなグダグダでダラダラな文章に最後まで目を通して頂きありがとうございます。

また、セキュキャンの講師の方々、運営の方々、参加者の皆様、自分が未熟なために迷惑をかけた部分もあったと思います。そういった際に優しくしてくださり、本当に助かりました。

それではっ!

セキュリティ・キャンプ全国大会2014に行ってきましたー

こっそりとセキュリティ・キャンプ全国大会2014に行ってきました。

感想はコチラ

セキュキャンに参加するということは、これくらい余裕で読めるということです。

もう九月になってしまったがかずフェスについて少し書いておこう

※この記事はあらっきぃの独断と偏見とその他もろもろで書かれており、事実とは一部異なるような気がします。

導入

気がつけばもう九月だ。しかも夏休みも本日付けで明けてしまって、明日からは平常通り授業を受ける日々を過ごさなくてはいけない。何ていうか、憂鬱だ。
ここでポジティブな人なら「あと四ヶ月で冬休みだ!!」となるのだけど、どうにもそんな気持ちは起こらなかった。多分、IVRCなど問題が山積みにされすぎているからだろう。

かずフェスとは

さて、このまま鬱々としたことを書き連ねても誰も得しないので、そろそろかずフェスについて話そうと思う。

まず、かずフェスとは何なのかということだが、これは簡単に説明してしまえば@kazoo04が開いたオフ会のことで、ぶっちゃけてしまえばかずー氏クラスタの集まりだ。という割には某テキストブラウザ氏も来ていなかったけれど。

ここで参加を募集していた。
kazfes 13夏

で、何やったの?

バーベキューしたりカレー食べたりしてた。
いや、もちろん作ってる人もいたんだけど……。すみません、僕は消費専門でした。次回までに女子力高めてきます。

他にも、リアルふぁぼしたりふにゃ帽子氏とハグしたり、なんか色んなことをしたような気がします。

こっからは会った人の感想など

開催から日が経ってしまったせいか、思った以上覚えていないことが多く書くネタが無いためここからはセクション名の通りのことをします。

@K_MHAL

いわゆるミハル氏。

かずフェスにリアルふぁぼという概念を持ち込んだ張本人。

※説明しよう、リアルふぁぼとは星形のシールを相手の衣服に貼り付ける行為である。

このリアルふぁぼによってかずー氏のリアルふぁぼを求めて群がる同世代の姿は印象的だった(自分もいた)。

PCはLinux Mintが入ったThinkPadだった。カッコイイ。

あとふにゃ帽子氏が持ってきた猫耳を付けてた人二号。

@regen_1182

いわゆるぺけ氏。

まさか本当に 女子高生 だとは……。

とまあ、そんな衝撃の強かった人。普通に女子高生でした。完全無欠に女子高生でした。(何言ってるか分かりません)

なんだかものすごく失礼なこと言ってる気がします。ぺけ氏すみません。

ちなみにふにゃ帽子の持ってきた猫耳を付けてた人一号。

@soft_HAT

言うまでもなくふにゃ帽子氏。

帽子 でした(どーん)!

あとハグしてくれます。ふにゃ帽子氏とハグすると何となく幸せになれそうな気がするので、みなさんもふにゃ帽子氏とあったらハグしておきましょう。

かずフェスに猫耳(脳波で動く奴)を持ってきた張本人。
そのせいで一時期のかずフェスはねっこねこになってたような気がしなくもない。……ないか。

@mikenov22

いわゆるみけ君。

かずー氏クラスタでわからないことがあったら大体教えてくれる人。
かずフェスでは バーベキュー奉行 でした。

いや、バーベキュー奉行ってなんだよ、って感じですが、そこは字面で察して下さい。言うじゃないですか、鍋奉行とか。その類です。
そう言えば、去年の暮れにあったかずー氏忘年会は鍋でしたが、そこでもみけ君氏はあんな感じだったのでしょうか。気になります。

ともかく、この人がいなかったらかずフェスはバーベキュー上に来てTwitterしてる変な集団になるところだったので、いてくれてよかったと思います。ありがとうございます。

@beepcap

いわゆるbeepcap氏。読み方がよくわからない。

今回のかずフェスの参加者の中ではTwitterで一番見知った人だったかもしれない。しかしほとんど話さなかった。

印象に残ったこととしては、買い出しにいったまましばらく帰ってこなかったことだろうか。いつの間にか現れていつの間にか消えていた(買い出しに行っていた)ので少し焦った。

@kazoo04

我らがかずー氏。どうやたかず↑氏とアクセント置くのが良いらしい。

印象としては、まず見た目は写真とかフジテレビとかで見たことがあったのでそんなに衝撃はなかった。ただ、実際見てみるとかっこいい人だな、と思う。スーツじゃなかったのが少し残念。
他には、カリスマ性というか、そういうものはすごいと思った。Twitter上で自然と人を引き付けるような人ってやっぱ違うな……。自分も見習いたいけど見習える気がしない。

あと、かずー氏主催のはずなんだけどかずー氏自身があまり食べてなかった気がする。もう少し気を使えばよかったな。

すみません。

他にも、Mac Book Airを開いてた人とかカレー煮込んでた人とかふぁぼられてた人とか蒲焼さん太郎持ってきた人とか蒲焼さん太郎焼いてた人とか、色んな人がいたようなきがするんですけど、すみません、スクリーンネーム忘れました。
俺も書けっ! って人は僕にリプ下さい。一生懸命思い出します。

最後に

なんかグダグダした記事だなー(ヒトゴト)。

バルスと呟いた人を自動的に(リムーブ|ブロック|スパム報告)するツールを作った話

某国民的アニメ映画の放送から随分と時間がたってしまいましたが、一応記事を書いておきます。

何があったの?

それは八月二日のことでした。 きっかけはTLで見た「バルスって呟く奴全員リムるわww」みたいなツイートと、このツイートです。

で、これ

それから二時間ぐらいでAntiBALS v0.1.0を作り、

ラピュタの放送が始まってからステマしたら2000RTもされました。ありがとうございます。

これはGoogle Driveのホスティング用のURLを貼ってあるのですが、Google DriveのホスティングはWebページ用らしくzipファイルは本来公開できないらしくて(多分)、ラピュタの放送が終わるちょっと前にGoogle Driveからバルス(403 That's an error)されていました。
そのためにDL出来なかった方には深くお詫び申し上げます。すみませんでした。
お詫びに新しくDropBoxに作ったリンクとGitHubのリポジトリを貼っておきます。

あと、あのツイートは2000RT以上されましたが実際のところDLして使っていた人はどれくらいいるのでしょうか。分かりかねますが、たいしていないような気がします。ネタでリムーブすると呟く人はいても本気でリムーブした人だって僅かでしょうし。

それで、考えたこと

過去に@eval_ofなど、いくつかにサービスやツールを作ったことはありますが、こんなにもたくさんの人に少なくとも知られるようなものを作ったのは初めてのことでした。
そこで考えたことがあったので書いておきます。

ちょまどさんに愚痴ってしまって非常に見苦しい感じだったのですが、こんなことを思いました。

大体、これが考えたことです。

何か物を作る人として、これはとても悩ましいことなんじゃないかと思います。

自分が作った物が誰かを傷つけてしまったら…、

そうやって考え始めると、本当に辛くなります。
確かにライセンスで「このソフトウェアの使用について、作者は一切の責任を負わない」とでも書いておけば、作者に対して責任は無くなります。もうそれがどんな利用をされてどんな影響を及ぼそうとも、作者には何の被害もありません。

でも、だからと言って、作者は何の考えもなし――需要があるからと言ってにソフトウェアを公開してもいいものなのでしょうか?

そう考えると、自分がAntiBALSを公開したことも正解だったのか間違いだったのか甚だ分からなくなります。
リムーブやブロックされて嬉しい人なんて滅多にいないでしょうし…(所詮はTwitterだとも言われます)。

まあ、だったら初めから作るなよ、って話になるんですけど…。
……いや、でも、面白そうだったし(汗

ともかく、自分は今高校生で、これからプログラミングで喰っていきたいと思うなら、技術力以外にももっと学ばなきゃいけないことがあるのかな、とそんなことを思ったわけでした。

おまけ

最新版のAntiBALS-0.2.0のREADME.md.txtと、スクリーンショットを貼っておきます。普通にTLである言葉がどれくらい呟かれているか確認できるので便利かもしれません(だからそれmikutterプラグインでできる よね)。

README.md.txt

AntiBALS v0.2.0 (仮称:ロボットのようなもの)

初めに Beginning...

DLありがとうございます。

これって何? What is it?

Twitterで「バルス」から始まるツイートを呟いたフォロワーを自動的にリムーブ、ブロック、スパム報告するツールです。 宮崎アニメの季節になって、金曜ロードショウで《禁則事項です》が放送されることになった時に使ってください。

v0.2.0より「バルス」以外の言葉も検出できるようになりました。詳しくはより高度な使い方を参照ください。

使い方 How to use?

  1. 同じフォルダ上にある「antibals-バージョン番号.jar」というものをクリックすると、実行可能JARなので起動します。
  2. 起動したら、左上の「認証」というボタンを押して、ブラウザを使って認証してください。
  3. 「何もしない」「リムーブ」「ブロック」「スパム報告」のうちのどれかを選択してください。
  4. あとは勝手にバルスを殺してくれます。

うまく動かなかったら@alucky0707に連絡してください。運が良ければ対処できるかもしれません。

より高度な使い方

解凍したフォルダにある「keyword.dat」の各行に書かれている正規表現のうちのどれかにマッチすると、「何もしない」「リムーブ」「ブロック」「スパム報告」の動作をします。 (正規表現java.util.regex のもので、UNICODE_CASEフラグとCOMMENTフラグとCASE_INSENSITIVEフラグが有効になっています) 技術力がある人はいじってみてください。

その他 Others

  • このツール作者は@alucky0707です。
  • 設定等保存していないので、終了すると再度認証が必要になります。
  • 複数起動すれば複数ユーザーでバルス殺しが楽しめます。
  • このツールがユーザーに与える損害・影響に対して作者(@alucky0707)はいかなる責任も負いません。
  • ↑100人ぐらいまとめてフォロワーが減っても知らないよってことです。
  • また、作者の許可無く改造・配布しても構いませんが、その場合は必ず作者(@alucky0707)の名前を明記してください。
  • このツールはtwitter4jguavaを利用しています。
  • バグ・問題等ありましたら作者(@alucky0707)に連絡してください。
  • なお、オーストラリアの首都はメルボルンです(最重要事項)。

更新履歴

  • 2013/08/02 - v0.1.0 alpha 公開
  • 2013/08/02 - v0.1.0 にバージョンアップ
    • リムーブログの表示を修正。
    • バルスだけでなく、balsもリムーブの対象にした。
    • RTも対象に。
  • 2013/08/02 - v0.1.1 alpha にバージョンアップ
    • ブロック、スパム報告に対応。
    • 一部のエラーメッセージを「何かがおかしいよ」に変更。
  • 2013/08/02 - v0.1.1 にバージョンアップ
    • 自分自身が「バルス」と呟いた時にリムーブ(ブロック、スパム報告)する不具合を修正。
  • 2013/08/05 - v0.2.0にバージョンアップ
    • 「バルス」以外の言葉を検出に対応。
    • 検出した人数の表示に対応。

(c) 2013 @alucky0707

スクリーンショット

f:id:alucky0707:20130805111133p:plain

JavaScriptは演算子オーバーロードの夢を見るか

JavaScriptでは演算子を定義したりオーバーロードしたりすることはできない。これはだれでも知っているようなことだろう。
だが、過去には演算子オーバーロードのようなことを可能にしたライブラリも存在した。

def.js

このコードを見て欲しい。

//https://github.com/tobeytailor/def.jsより
def ("Person") ({
    init: function(name){
        this.name = name;
    },

    speak: function(text){
        alert(text || "Hi, my name is " + this.name);
    }
});

def ("Ninja") << Person ({
    init: function(name){
        this._super();
    },

    kick: function(){
        this.speak("I kick u!");
    }
});

var ninjy = new Ninja("JDD");

ninjy.speak();
ninjy.kick();

これはdef.jsという小さなライブラリの例で、まずPersonというクラスを定義し、次にNinjaというクラスにそれを継承させている。Rubyを知っている人なら、何となく理解できるのではないだろうか。
そしてdef ("Ninja") << Person ( {という部分はまるで演算子をオーバーロードしているようだ。
これはどういうことなのだろう?

その鍵はvalueOfが握っている。

valueOf

valueOfというメソッドは、JavaScriptにおいて特別なメソッドの一つだ。Pythonで言うならば__で囲まれた特殊メソッドのようなものだと考えてもらえればいい。
ということは、このvalueOfはあるタイミングで暗黙的に呼ばれることになる。そして、あるタイミングとはオブジェクトをプリミティブな値(数値、文字列、真偽値)に変換するときだ。

これを確かめてみる。

var
obj = {
  valueOf: function () {
    console.log('call valueOf');
    return 10;
  },
};

console.log(obj + 20);

実行すると'call valueOf'が表示されたあと30が表示されるだろう。つまり、obj + 20というコードの中でvalueOfが呼ばれ、さらにその返り値の10objの値となっている。

このvalueOfを定義しておくとJavaScriptのほとんどの演算子の呼び出し時に任意の関数を実行することができる。そのため、演算子オーバーロードのように見せるかけることができる、というわけだ。

やってみる

では、実際にこのvalueOfを利用(悪用とも言う)して何か作ってみようと思う。

今回作るのは、関数の合成演算子だ。関数の合成というのは数学と同じで、fgという二つの関数があるときf(g(x))のように実行する関数を作ることだ。また、数学ではf・gのように点を関数合成の記号として使うので、f * gのようにして演算子オーバーロードするイメージでいく。

まず初めに、演算子のオーバーロードではない普通の関数として定義してみる。

function  compose(f, g) {
  return function(x) {
    return f(g(x));
  };
}

function f(x) {
  return x + 1;
}
function g(x) {
  return x * 2;
}

console.log(compose(f, g)(20)); //=> 41

当然これはただの関数で演算子には成り得ない。

これをvalueOfを使って演算子オーバーロードしたように関数を合成できるようにするにはどうしたら良いだろうか?

方法としては、FunctionオブジェクトのvalueOfメソッドを弄ればよいことになる。そうすれば、fが関数でf * gのようなコードがあるときにvalueOfメソッドが呼ばれることになる。
ここで一つ注意しなければいけないのが、valueOfメソッドがプリミティブな値を返さなければいけないということだ。つまり、f * gはオブジェクトである関数を直接返すことはできない。
となると積んでしまったように思えるが、これには単に関数で包み込むなどすればそこまで問題ではない。

それでは、実際に演算子オーバーロードのように見せかけるコードを書いてみる。

function id(x) {
  return x;
}

Object.defineProperty(global || window ||this, 'compose', {
  enumerable: false,
  get: function initCompose() {
    var
    fs = [],
    valueOf_ = Function.prototype.valueOf;
    Function.prototype.valueOf = function () {
      fs.push(this);
      return 1;
    };
    return function () {
      Function.prototype.valueOf = valueOf_;
      return fs.reduceRight(function(g, f) {
        return function (x) {
          return f(g(x));
        };
      }, id);
    };
  },
});

function f(x) {
  return x + 1;
}

function g(x) {
  return x * 2;
}

console.log(compose.call(f * g)(20)); //=> 41

少しコードを解説すると、まずグローバルオブジェクトにcomposeというプロパティを定義している。このcomposeはゲッターを持っていて、そこで演算子オーバーロードのための準備をしている。
その準備とは主に、Function.prototype.valueOfメソッドを書き換えることだ。関数が数値に変換されようとしたら、その関数を保存して適当な値を返している。
次に、composeは実際に関数を合成するための関数を値として返している。保存した関数を右畳込みして合成する。また、予めFunction.prototype.valueOfをバックアップしておいて、ここで戻すことで全体への影響を最小限にしている。
そして、compose.call(f *g)というのがこのcomposeの用例だ。f * gという式で関数が合成されているだろう。このとき、compose.callとしてcomposeを呼びださなければいけないのはJavaScriptが引数の方を先に評価するからだ。

この演算子オーバーロードのようなcomposeの便利なところはさっきの関数のと違って二つ以上も簡単に合成できるところだ。
例えばcompose.call(g * f * g)と書き換えれば返ってくる値は82になるだろう。

結びに

この演算子オーバーロードのように見せかける方法は、主に言語内DSLを構築するときに役に立つと思う。演算子の直感的な表記方法は魅力的だ。

また、いくつかの説明(valueOfについてなど)を簡略化のために省略したので、一部正確でないところもある。それについてはここなどを参照してほしい。

JavaScript 第6版

JavaScript 第6版

パーフェクトJavaScript (PERFECT SERIES 4)

パーフェクトJavaScript (PERFECT SERIES 4)