この日記にはツッコミを入れられます。 ツッコミを入れたい日付をクリックすると、フォームが現れます。
xreaでtDiaryを使う方法はxrea.com で tDiary を使う方法やインストールメモやXREA + tDiary + Namazuをどうぞ。
なんか変だと思ったらカナロックが。ttssh経由のviだとかなり気づきにくい。
Xが終了した後にコンソールに戻ったりコンソールにメッセージが残るのがセキュリティ上好ましくなさそうで嫌だったのでmkdir /tmp/$USER &&clear&&exec startx >|/tmp/$USER/Xstdout 2>|/tmp/$USER/Xstderrのように起動することにした。
-A fillを指定すると複数ファイルを同じ紙に印刷出来るらしい。
今実行しているrubyのパスはrequire 'rbconfig';puts File.join(Config::CONFIG['bindir'], Config::CONFIG['RUBY_INSTALL_NAME'])で取得できそう。
とりあえず動作確認リストがほしいのですが。手元でちゃんと確認できたのはWindows 95のNetscape 6.1のみ。IE5.5SP2はよくわからず。
もう一つ外にdivがあればanchor.parentElement.parentElementとanchor.parentNode.parentNodeのようにして全体の背景色を変更できるんですが。
1.7では発生しない謎のIOError。以前にopen3.rbをいじったときも発生していた気がする。あの時に気が付いておくべきだったのかも…。open3.rbをいじっていろいろ試しているといつの間にか重くなってて気が付くとrubyがtopの上位に並んでいた。これもruby自体のバグだとしたら原因を突き止めておきたいけど再現条件がわからず。
tDiary Official Siteのアンテナが2001/09/24でとまっているみたい。
タイトルがどれも色付きになるということはfragmentがないということだと思うので、if ( ! fragment ) return;を追加。それから見つかった後もループを続けるのは無駄なので、if ( elem )にもreturnを追加。
returnがエラーになっていたので関数に変更。名前が…。
名前募集。つか広めたもん勝ち
らしい。急速に広まったようですが、どのバージョンが広まったんだろう?
対応ブラウザが増えたりもっと改良されたりして戻ってきたら面白いのに、と思っているんですが…。
IEの範囲選択の都合で「。」がついただけなんですが(^^;。「モーニング娘。」と今は亡き(違)「何か(仮)。」だったか「何か。(仮)」だったか忘れましたが、そういうのとかを思い出して残してしまったのは事実ですが。
鱠に懲りてじゃなくてnamazuでもつかってみようかと思って@text_output = trueにしてみたけど、当たり前のように過去のものはテキストに出力されないまま。最初の設定は結構重要…。最初の設定と後からCGIで設定変更したものが食い違ってたところがあったので、バックアップの意味も込めて念のため設定ファイルの方も新しい設定に直しておいた。
とりあえず1日分だけで試してみようと思って試してみたがxreaのmknmzの使い方の説明が見つけられず適当にやってみたが失敗。
データには、「,」を含めてはならない。通常、「,」を使わなければならない、という事例はあまり無いと思われるが、「,」を含める場合は「\,」としてエスケープすること。また、それに伴って「\」も「\\」としてエスケープしなければならない。
とあるが、「\」の直後の文字が「\」でも「,」でもなかった場合の事については何も書いていない。
Netscape 6.1でみると文字化けしていた。ひらがなだけだと文字コードの自動判別が難しい?
requireで読み込まれるファイルを追跡。
あるスクリプトを他の環境に持っていくときに一緒に必要なファイルを探すために作ってみた。
requireの引数や$LOAD_PATHが動的に設定される場合は追跡できないけど。
#!/usr/bin/env ruby
class WhatRequires
require 'rbconfig'
def initialize
@requires = {}
@dlext = [Config::CONFIG['DLEXT']]
unless Config::CONFIG['DLEXT2'].empty?
@dlext.push Config::CONFIG['DLEXT2']
end
end
def what_requires(filename)
if @requires.key? filename
return @requires[filename]
end
requires = []
File.foreach(filename) do |line|
if /\brequire\s+(['"])(.+?)\1/ === line
file = required_file = $2
extensions = []
if /\.(rb|so)$/ === required_file
if $1 == 'so'
file = required_file.sub(/so$/, '')
extensions.concat @dlext
else
extensions.push ''
end
else
extensions.push '.rb'
extensions.concat @dlext.collect{|ext| '.'+ext }
end
found_libpath, = catch(:libpath) do
$LOAD_PATH.each do |dir|
extensions.each do |ext|
libpath = File.join(dir,file+ext)
if File.exist? libpath
throw :libpath, libpath
end
end
end
nil
end
if found_libpath
requires.push found_libpath
else
STDERR.puts "'#{required_file}' not found"
end
end
end
@requires[filename] = requires
end
def tree(filename, out=$defout, indent='', printed=[])
return if printed.include? filename
out.puts indent+filename
printed.push filename
if indent.empty? or not @dlext.find{|ext| /\.#{ext}$/ === filename }
requires = what_requires(filename)
requires.each do |filename|
tree(filename, out, indent+' ', printed)
end
end
printed.pop if $VERBOSE
end
end
if __FILE__ == $0
if ARGV.empty?
STDERR.puts "usage: #$0 filename"
end
whatreq = WhatRequires.new
ARGV.each do |filename|
whatreq.tree(filename)
end
end
実行例:
% whatrequire.rb `which rd2`
/usr/bin/rd2
/usr/lib/ruby/1.6/kconv.rb
/usr/lib/ruby/1.6/i386-linux/nkf.so
/usr/lib/ruby/1.6/optparse.rb
/usr/lib/ruby/1.6/rd/rdfmt.rb
/usr/lib/ruby/1.6/rd/tree.rb
/usr/lib/ruby/1.6/rd/rdblockparser.tab.rb
/usr/lib/ruby/1.6/racc/parser.rb
/usr/lib/ruby/1.6/i386-linux/racc/cparse.so
/usr/lib/ruby/1.6/rd/rdinlineparser.tab.rb
/usr/lib/ruby/1.6/rd/parser-util.rb
/usr/lib/ruby/1.6/forwardable.rb
/usr/lib/ruby/1.6/strscan.rb
/usr/lib/ruby/1.6/rscan.rb
/usr/lib/ruby/1.6/i386-linux/cscan.so
/usr/lib/ruby/1.6/rd/filter.rb
/usr/lib/ruby/1.6/rd/document-struct.rb
/usr/lib/ruby/1.6/rd/version.rb
/usr/lib/ruby/1.6/rd/rd-struct.rb
/usr/lib/ruby/1.6/rd/element.rb
/usr/lib/ruby/1.6/rd/block-element.rb
/usr/lib/ruby/1.6/rd/labeled-element.rb
/usr/lib/ruby/1.6/rd/list.rb
/usr/lib/ruby/1.6/rd/desclist.rb
/usr/lib/ruby/1.6/rd/complex-list-item.rb
/usr/lib/ruby/1.6/rd/methodlist.rb
/usr/lib/ruby/1.6/rd/inline-element.rb
/usr/lib/ruby/1.6/rd/visitor.rb
/usr/lib/ruby/1.6/rd/rd2rmi-lib.rb
/usr/lib/ruby/1.6/rd/rdvisitor.rb
/usr/lib/ruby/1.6/rd/output-format-visitor.rb
/usr/lib/ruby/1.6/rd/search-file.rb
/usr/lib/ruby/1.6/rd/reference-resolver.rb
/usr/lib/ruby/1.6/rd/rbl-suite.rb
/usr/lib/ruby/1.6/rd/rbl-file.rb
divをつけるのならDiary - Ancient libraryのようにtitleもつけるようにするといいのかもしれない。
parentElementとかparentNodeってJavaScript 1.3 リファレンスに載ってないけど何だろう?と思って調べてみるとDHTMLだったらしい。そこが古いNetscapeとかで対応されてない原因でしたか。スタイルの変更自体もDHTMLなのでどうしても古いブラウザは切り捨てになってしまうみたい。
調べ終わったのでRuBBS用謎JavaScript。完成。元記事のリンクをクリックした後リロードをしないと色が変わらないのがちょっとだめっぽい。
試してないけどonclick="javascript:nazo(self.hash.slice(1))")みたいにすればいいのかも。
<script language="JavaScript"><!--
function nazo(num) {
if ( ! msgnum )
return;
for (i=0; i<document.anchors.length; ++i) {
var anchor = document.anchors[i];
if ( anchor.name == msgnum ) {
var elem;
if ( anchor.parentElement ) {
elem = anchor.parentElement.parentElement;
} else if ( anchor.parentNode ) {
elem = anchor.parentNode.parentNode;
}
if ( elem ) {
elem.style.background = "red";
return;
}
}
}
}
var query_str = location.search;
var num_start_pos = query_str.search(/[1-9]/); // 一番上の桁は0にならない。
var msgnum = query_str.substring(num_start_pos, query_str.length);
nazo(msgnum);
msgnum = location.hash.substring(1,location.hash.length);
nazo(msgnum);
// --></script>
unlessなどの制御構造は新しいスコープを作らない。foo=true if foo; p foo #=> nil。
http://wpad.ドメイン名/wpad.datがあれば自動設定できるらしい。
ホスト名のみ(isPlainHostName)をアクセスできないようにしているのは間違いの場合が多いから。.netscape.comをアクセスできないようにしているのはただの例。
var reject = "PROXY localhost:9"; // discard
var localproxy = "PROXY proxy.local:3128";
if (isInNet(myIpAddress(), "192.168.1.0", "255.255.255.0")) {
localproxy = "PROXY 192.168.1.2:3128";
}
var local_or_direct = localproxy+"; DIRECT";
var direct = "DIRECT";
function FindProxyForURL(url, host)
{
if (isPlainHostName(host) ||
dnsDomainIs(host, ".netscape.com"))
return reject;
else
return localproxy;
return reject; // fail safe
}
document.links[i].onclick = handleLinkClickで後からでも設定できましたか。ではそういうことでこの日記のも更新してみました。変更すると対応ブラウザが変わってきそうな気がしますが大丈夫なのでしょうか?とりあえずIE5.5SP2ではちゃんと動きましたが、Netscape 6.1では元の背景色に戻りませんでした。
onclickでリロードなしで色の付いているところを変化させるのはCGIでは無理そう。
rubyで書くのならNet::HTTPも対応していたはず。
rpm系だと元にしたRawhideが1.9-1なら1.9-1vl0のようにしているので、1.9-1.1のように小数をつければよさそうな気が。
Vineの場合だとVinePlusのパッケージはどんどん新しくできるけど、Vine本体にあったものは同じ名前で新しいのに差し替えはまずそう。
/.Jがわかりやすいのですが、記事毎のURLが普通は&mode=thread&threshold=でリンクされていることが多いです。コメントのカスタマイズで他の表示モードにしていると残念な思いをします。というかしています。
複数行まとめて"abc\n// def\nghi // jkl\n // mn\n opq // rst\n".gsub(%r{//(.*$)((?:\s*//.*)*)},'/*\1\2 */')というのを思いついたけどわかりにくい。
backgroundでなくてbackgroundColorにしてみたらNetscape 6.1でもIE5.5SP2でもうまくいきいました。
stoneを使ってみた。-zをつけなくてもsslでつながったけど、鍵があった方がいいんだろうか?
sshでport fowardingは圧縮があるのとつないでいないときはfowardingされないlocalhost以外は転送されないなどの特徴があるので、今のところはsshで十分だと思った。
[ruby-ext:01940] VisualuRuby SEGV (Windows Message Loop?)でVisualuRubyの話がでているけどみられてないような気がした。
ブラウザ毎の違いって難しい。DHTMLを使うのなら使うと言うことで古いブラウザは切り捨てて(エラーはでないようにするなどして)もっといろいろやってもいいのかもしれない。
compiled binary for Win32/DOSはobsoleteらしいのでリンク変更してみた。DOSは違う気がしたのでリンク先のtitle要素の中身をそのまま使ってみた。
sourceforgeへのリンクのあたりのマークアップが変?
カスタマイズ部分が一番上にまとめられてカスタマイズしやすくなってます。
それからfor (var key in style)というrubyでいうとstyle.each_key{|var|...}、perlでいうとfor my $var (keys %style)相当のループでカスタマイズしたスタイルだけ自動で復帰するようになったようです。
ここはbackgroundColorしか変えてないからこのままにしておく予定なので、新しいのはりゅうさんの日記から直接どうぞ。
RDってインデントが意味を持つというのがPythonぽい気がする。
#!ruby -Ks
# clipedit.rb - clipboard filter
require 'phi'
form = Phi::Form.new
form.caption = File.basename File.expand_path $0
form.font.name = 'MS ゴシック'
# 基本メニュー。
Phi::new_menu(form, :main_menu, [
menu_file = Phi::new_item('ファイル(&F)', '', :menu_file1).add(
Phi::new_item('&GC.start', '', :menu_gc_start, false),
Phi::new_line,
Phi::new_item("閉じる(&X)", '', :menu_close1)
),
menu_edit = Phi::new_item('編集(&E)', '', :menu_edit).add(
Phi::new_item('&Eval', '', :menu_edit_eval, false),
Phi::new_line
)
])
form.menu_gc_start.on_click = proc do |sender|
GC.start
end
form.menu_close1.on_click = proc do |sender|
form.close
exit
end
# clipeditから見えるようにグローバル変数。
$memo_code = Phi::Memo.new(form)
$memo_code.align = Phi::AL_CLIENT
$memo_code.scroll_bars = Phi::SS_VERTICAL
# 実行したコードと実行結果を$memo_codeで表示。
def clipedit(code)
$_ = Phi::CLIPBOARD.text
eval code
Phi::CLIPBOARD.text = $_
$memo_code.text += %Q[\n__END__\n#{$_}].gsub(/\n/,"\r\n")
rescue NameError,StandardError
$memo_code.text += (%Q[\n__END__\n#{$!}\n] +
$!.backtrace.join("\n")).gsub(/\n/,"\r\n")
end
#
## 普通のeval
form.menu_edit_eval.on_click = proc do |sender|
clipedit($memo_code.text)
end
#
## この配列に追加
[
['URLdecode', :me_urldecode,
%q{require 'cgi';$_=CGI.unescape($_)}],
['URLencode', :me_urlencode,
%q{require 'cgi';$_=CGI.escape($_)}],
['unescapeHTML', :me_urldecode,
%q{require 'cgi';$_=CGI.unescapeHTML($_)}],
['escapeHTML', :me_urlencode,
%q{require 'cgi';$_=CGI.escapeHTML($_)}],
['escapeHTML without &&"', :me_urlencode_without_quot,
%q{gsub!(/&/,'&');gsub!(/,'<');gsub!(/>/,'>')}],
].each do |menu_str,key,code|
menu_edit.add Phi::new_item(menu_str, '', key, false)
eval %[
form.#{key}.on_click = proc do |sender|
$memo_code.text = #{code.dump}
clipedit(#{code.dump})
end
]
end
# メインループ
form.show
Phi.mainloop
「まともな企業やセキュリティに気をかけるユーザは当然インターネットゾーンはガチガチに設定してあるだろうが、イントラネットゾーンはデフォルトのままという場合も多いだろう。
」
MUAのセキュリティホールを初めてみたときにイントラネットゾーンって普通は使ってなくて、セキュリティホールとしてしか使われそうになかったのでインターネットゾーンよりもきつくした覚えが。
\<!--...-->\<!--...-->って誰が最初に始めたんだろう?
トラフィックを減らすために使っているキャッシュ(プロキシ)がキャッシュすべきでないものまでキャッシュしてしまって、リロードしまくることによって逆にトラフィックが増えてしまうという罠。ちゃんとしたHTTPヘッダを出してくれればこういうことは起こらないはずなんですが、理想と現実の差が。
CGI#outを使っていないスクリプトだったので、自前でSet-Cookieを出力しておいた。
cookie = CGI::Cookie.new('name'=>'bbs','value'=>bbs,
'expires'=>Time.now+60*60*24*30).to_s
puts "Set-Cookie: #{cookie}"
入れてみたけどメモリが少ないので重すぎた。
sudo cp /dev/null /var/log/hoge (owner, permission を保存してファイルサイズを 0 にする)をみて、: > /var/log/hogeでもできそうと思った。
完全に元に戻すにはvisitedStyleをnullにしてsaveStyleが使われるようにすればいいと思うのですが。
ほとんどの日記システムのつけるフラグメントは日付とその中で何番目かを表す数字がほとんどで内容を表していない。だからたとえばここの場合は#p01-URLのように内容を表すものをつけたいと思うんだけどそういう機能がついた日記システムは見覚えがない。
Netscape 6.1ってHTMLを読み込めてもimgで指定された画像が応答無しで読み込めないと全く表示してくれないのが困る。HTML自体が読み込めないときはエラーになるのに。
Mozilla のカスタマイズってNetscape 6.1でも使えるのかどうかが気になるところ。
詳細は公式サイトから発表があってからということで伏せておきますが、みつけた時は超びっくり。報告しつつ自分のところは仮対策してから、本格的な修正をIRCで話し合ってました。
記事: 「ワームのコードを公開するな」これって正論?という話もあるので公開の仕方は難しいところ。
#!/usr/bin/python
# rpmLabelCompare.py - rpm label compare script.
#
# Copyright (C) 2001 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
# All rights reserved.
# This is free software with ABSOLUTELY NO WARRANTY.
#
import rpm, sys
if __name__ == '__main__':
if len(sys.argv) == 7:
h1 = sys.argv[1:4]
h2 = sys.argv[4:7]
elif len(sys.argv) == 3:
h1 = ("dummy", sys.argv[1], "0")
h2 = ("dummy", sys.argv[2], "0")
else:
sys.stderr.write("usage: " + sys.argv[0] + " name1 ver1 rel1 name2 ver2 rel2\n")
sys.stderr.write(" or " + sys.argv[0] + " ver1 ver2\n")
sys.stderr.write("example: " + sys.argv[0] + " man 1.5i 10vl1.2 man 1.5i 10vl1\n")
sys.stderr.write(" " + sys.argv[0] + " 40.1vl1 40vl2\n")
sys.exit(-1)
ret1 = rpm.labelCompare(h1, h2)
ret2 = rpm.labelCompare(h2, h1)
if 0 == ret1: # a and b are the same version
sys.stdout.write(" == ")
elif 0 < ret1 and ret2 < 0: # a is newer than b
sys.stdout.write(" >> ")
elif ret1 < 0 and 0 < ret2: # b is newer than a
sys.stdout.write(" << ")
elif 0 < ret1 and 0 < ret2: # a is less older than b
sys.stdout.write(" >< ")
elif ret1 < 0 and ret2 < 0: # b is less older than a
sys.stdout.write(" <> ")
else: # bug?
sys.stdout.write(" !! ")
sys.stdout.write("\n")
クロスサイト・スクリプティングはtext/plainにすれば…と思ったけどIEってContent-typeを無視してしまうことがあるから関係ないかも。
クライアントからの入力はすべてサーバ側でチェックしなければ危険。maxlengthも仮定できないし、選択肢にないものが選ばれたものとして送られてきているかもしれない。ここまでは常識と思ってほしいところ。
さらにcookieだってサーバから送ったものだけが送り返されるわけじゃないし、UAの文字列にだってタグが入っているかもしれない。
UAの文字列にタグが入っていると脆弱なアクセスログCGIでログをみたときにおもしろいことになる。
昨日の話の続き。[ruby-list:31979]参照。
たんなるメモ。
ハードディスクがSCSIのみのマシンにDebian系のディストリビューションを入れてみた。再起動するとルートが見えなくてkernel panic。SCSIがみえないらしい。CDから起動し直して、適当にカーネル再構築して再挑戦。パッケージ足りなくて止まったので追加してまた止まったので追加してとどんどん入れていって再構築完了。再起動。SCSI認識。SMPじゃないのにSMPになってしまってた。とりあえずaptと思ったらネットワークにつながらない。ネットワークカードのチェックが入ってなかったらしい。再度再構築。今度は/boot/config-2.2.19をコピーして残しておいたのを使ってみたら、またSCSIを認識しなくてkernel panic。rm .configしてから必要なところだけチェックしていって再構築。起動。ちゃんとSCSIもネットワークカードも認識。設定に入る。他のマシンからsshでログインできる環境を整える。nmapで確認すると必要のないポートがあいていたので、inetd.confの設定を変更して閉じたところでとりあえず終わり。インストール途中でもNimdaのアクセスがあった。インストールするときは直接インターネットにつながっている環境ではなくproxy経由でaptを使う方がよかったかもしれない。
という題名になったらしい。
headingを付ける形式の日記ならそのheadingの中身をローマ字でもいいのでURLにしてしまえばいいと思うのですが。つけた方がいい理由はURLだけでも内容がわかりやすくなるから。メールだとURLだけになることもあるだろうし、リンク先が移転したり無くなったりした時でも残ったURLで少しは内容を想像できるし。
sudo /etc/init.d/apache restartだとコマンドラインの環境変数が残っていたのでsudo su -c '/etc/init.d/apache restart'で再起動し直したらまだ残っていたのでsudo /usr/bin/env - /bin/su -c '/etc/init.d/apache restart'で再起動。
「日記以外であれば検索のURLを示すというのも一つの手かも。
」というのは「btnG=Google+%8C%9F%8D%F5」がついてたらGoogleツールバーを使った(だっけ?)という情報がついてるとかそういうことが気にならないかちゃんと削除してからURLを示せるのならよさそう。
ruby-bugs-ja:PR#119を試そうと思ってDOS窓でruby -ve "t=Time.now;p t.strftime('%A');require 'gtk';p t.strftime('%A')"とやってみたら環境変数展開で%〜%が消えてしまって"A"と表示されて悩んでしまった。
削除された[ruby-dev:15005]が添付ファイルで2MBもあって、キューから削除されてruby-* MLに128KB制限がついた。
@nifty:セカンドメールは「メールの保存容量:通数に関係なく20MB
」なので容量的には余裕だったみたいだけど配送されたのは[ruby-dev:15006]の15:47より後で16:15頃だったということでruby-lang.orgのメールサーバは大変だったみたい。
セカンドメールの「1通の最大容量:5MB
」っていうのが送信だけか受信も含めてなのかは不明。
VNCの中でVMwareを起動していたらControl+Alt+Escapeを押してもスタートメニューが開いてVMwareからフォーカスをはずせなくて困った。仕方がないのでhaltした後killしたけど。
本当はどういう名前なのか知らないのですが、APOPのようにchallengeとユーザが入力したパスワードからJavaScriptなどを使って計算した文字列をネットワークに流すようにすればパスワードをそのままネットワーク上に流すよりも少しだけましな認証が出来そうな気がした。最初の認証だけということでTCPでずっとつながったままのAPOPに比べると2度目以降の接続でもまたJavaScriptなどで計算させるかCookieで別の確認手段を何とかするかしないといけないと言う問題があるけど。
~/binってCVS管理してるけど。
なんか変だと思ったところ。変わり目とすべて<span class="update"> <span class="lastupdate">10/12</span></span>になっているところ。10/12より後にも更新されてるみたいなのに。
とりあえずホスト名をそのまま使うのなら.無しかどうか(localhostやFQDNでないものをはじく)とか、IPアドレスを使うのならプライベートアドレスかどうかぐらいはチェックしてほしいと思った。
/win|mingw/ === RUBY_PLATFORMmingw版にはwinって入ってないからWindowsかどうかを判定するのは/win/だけじゃダメ。たとえばext/tcltklib/extconf.rbでは/mswin32|mingw|cygwin/で判断している。
Meadow-1.14を入れてMakefile.pkgとcygwinのmakeなどを使ってmake updateした後make pkg-installしてもうまくいかなかったのでMakefileをみてみるとMEADOW_VERSION=1.15とあったので1.14になおしてEMACS=の行もMeadowNT.exeの方をコメントアウトしてMeadow95.exeの方を有効にしてもう一度make pkg-installしてみた。
X-Faceを表示させようといろいろがんばってみるがWanderlustの起動時の画像とともに半角豆腐(謎)に化けてしまう。設定によっては「There's no room for a new private charset bitmap」とでてメッセージが開けなくなるし。というわけでX-Faceの表示はとりあえずあきらめた。
bitmap-muleのbdfフォントが入っていなかったのが原因だったので、bitmap-muleを参考にしてmake bdfでbdfファイルを作成してintlfonts-1.2/Miscにコピーした。それからフォントの設定の(c) 設定例
を元にして赤字のディレクトリの設定のところを変えて、他にMisc/etl8x16-bitmap.bdfをMisc/bitmap16.bdfに、European/etl16-latin1.bdfをEuropean/lt1-16-etl.bdf(16bと16iと16biも同様)に、Japanese-XをJapanese.Xに変更して使ったらwlのロゴやX-Faceがちゃんと表示された。
うまくいかないなと思ったら/が必要だったらしい。
mathnやjcodeのようなよく使われるクラスを変更する標準ライブラリの影響はライブラリを作るときに是非チェックしておきたいところ。
require 'amstd/must'?
Before...
✑ aldara [aldara http://pomm.a]
✑ miss [internet advertising]
✑ temporabla [oxycontin http://oxy]