パスワードを忘れた? アカウント作成

beroさんのトモダチの日記みんなの日記も見てね。 スラッシュドットのRSSを取り込んでみよう。

873125 journal
日記

beroの日記: SQLインジェクション対策:偽プリペアドステートメントに注意 4

日記 by bero

「SQLインジェクション対策」でGoogle検索して上位15記事を検証した

まとめに

SQLインジェクションについて書くときに以下のメッセージを必ず含めて欲しいです。
-単にプリペアドステートメントを使え
-絶対に文字列結合でSQLを構築しようとしてはいけない
-IPAの「安全なSQLの呼び出し方」を読むこと

とあるが、
- 本物のプリペアドステートメントであることを確かめる
を付け加えたい。(まあ『IPAの「安全なSQLの呼び出し方」を読むこと』を守れば、そこに書いていることではあるが)

IPA本では本物のプリペアドステートメントを「静的プレースホルダ」偽物(エミュレーション)を「動的プレースホルダ」と呼んでいるが、
後者はプリペアドステートメントぽい記述をライブラリ内で文字列結合してSQLを構築している。

偽プリペアドステートメントも無意味ではない。
少なくとも自前で文字列連結するのに比べ、単純なバグやエスケープ忘れは無くなる(ことが期待できる)。
しかし文字コードの違いや不正文字によるエスケープ抜けは起こりうるので、脆弱性が残りうる。

IPA本では、Perl + MySQL (DBD::MySQL)、Java + MySQL(MySQL Connector/J)において、デフォルトでは動的プレースホルダなので、静的プレースホルダを使うようにパラメータを指定する必要がある旨書いている。

同様にPHP + MySQL (pdo_mysql) もデフォルトでは動的プレースホルダなので(バージョンによるかも)、パラメータを指定する必要がある
  $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,FALSE)

PDO::prepare

PDO は元々この機能をサポートしていないドライバに対して プリペアドステートメントとバインドパラメータをエミュレートします。 このため、ある形式をサポートしているがその他の形式をサポートしていない ドライバの場合、名前もしくは疑問符形式のパラメータを他の適当な値に 書き換えることも可能です。

PDO::setAttribute

PDO::ATTR_EMULATE_PREPARES プリペアドステートメントのエミュレーションを有効または無効にする。 ドライバによってはネイティブのプリペアドステートメントをサポートしていなかったり 完全には対応していなかったりするものがある。この設定を使うと、常に プリペアドステートメントをエミュレートする (TRUE の場合) か、 ネイティブのプリペアドステートメントを使おうとする (FALSE の場合) かを設定できる。現在のクエリを正しく準備できなかった場合は、常にエミュレート方式を使う。

と書いてて気づいたが、恐ろしいことが書いてある。
現在のクエリを正しく準備できなかった場合は、常にエミュレート方式を使う。
いらんことすんなや

pdo_mysql:

        if (mysql_stmt_prepare(S->stmt, sql, sql_len)) {
                /* TODO: might need to pull statement specific info here? */
                /* if the query isn't supported by the protocol, fallback to emulation */
                if (mysql_errno(H->server) == 1295) {
                        if (nsql) {
                                efree(nsql);
                        }
                        goto fallback;
                }

fallbackすんなや

pdo_sqlite:

        i = sqlite3_prepare(H->db, sql, sql_len, &S->stmt, &tail);
        if (i == SQLITE_OK) {
                return 1;
        }

        pdo_sqlite_error(dbh);

        return 0;

pdo_pgsql:
        PDO_ATTR_CURSORがPDO_CURSOR_SCROLLだったらエミュレーション。
        あとコンパイルオプションとかプロトコルが2以下(PostgreSQL 7.4未満)でも。
        ネイティブprepareに失敗したらエラー。

sqliteとpsgqlはドライバレイヤではエラーを返しているが、上位で(マニュアル通り)fallbackしてるかどうかは知らね。

815589 journal
日記

beroの日記: What is Dart?

日記 by bero

ひとことで言うと「ぼくのかんがえたさいきょうのJava」に見える。
JavaScript代替というよりJavaに近い。

factoryというキーワードがあるがいまいちわからん

354555 journal

beroの日記: いいかげんcopyrightの虚偽表示はやめないか 4

日記 by bero

著作権年号表示を自動更新、という話題が定期的に出てくるのだが
google検索

万国著作権条約

第三条 〔保護の条件〕
著作権者の名及び最初の発行の年とともに©の記号を表示している限り、その要求が満たされたものと認める。©の記号、著作権者の名及び最初の発行の年は、著作権の保護が要求されていることが明らかになるような適当な方法でかつ適当な場所に掲げなければならない。

米国著作権法

第401条 著作権表示:可視的コピー

(a) 総則 (ry)本条に規定する著作権表示を付加することができる。
(b) 表示の形式-コピーに表示がなされる場合、以下の三つの要素を含まなければならない。

  (1) C記号(丸の中にCの文字)、または「Copyright」の語、または「Copr.」の略語。

  (2) 著作物が最初に発行された年。既発行の素材を含む編集著作物または二次的著作物の場合、当該編集著作物または二次的著作物が最初に発行された年で足りる。絵画、図形または彫刻の著作物(付属する文章を伴う場合を含む)がグリーティング・カード、はがき、文房具、宝飾品、人形、玩具その他の実用品に複製される場合、発行年を省略することができる。

  (3) 著作物に対する著作権者の名称、または名称を認識できる略称、または当該著作権者を示す広く知られた他の表示。

最初に発行した年であって、自動で更新する類のものではない。
(改変時に改変した年を併記するのは構わない)

更新してないと思われるのが嫌だという話もあるが、
米国が1989年にベルヌ条約に加盟したことで著作権表示がなくても著作権が保護されるようになったので、
(上記引用が「著作権表示を付加しなければならない」ではなく「付加することができる」となっているのに注意)
虚偽表示するくらいなら表示しなければいいんでは?

309849 journal

beroの日記: 放射線は怖くない、タバコやコーヒーに比べれば(追記) 18

日記 by bero

Monreal資料(福島原発の放射能を理解する)を見たところ、たとえ1SV(1000ミリシーベルト)でもタバコの発癌リスクよりずっと低い。
喫煙家の俺にとっては少々増えたところでたいして変わらない。
現在公表されている0.24ミリシーベルトのホウレンソウを食べたとしても、食後の一服に比べれば無視できるレベル。

タバコのリスクの適当な数字がなかったが、
この研究によると、

喫煙経験のある40~69歳の男女約4万人で、平均約14年間の追跡期間中に、4386人に何らかのがんの発生、681人に肺がんの発生

なので、
肺がんになる率は1万人中12人/年
これは発生率であって非喫煙者との比較ではないが、喫煙者は5倍のリスクと言われてるので増加は10人/年くらいか。

一方1SVの肺がんリスクは4人/年増加

またこちらには
一日一杯のコーヒー・カフェインで膀胱がんのリスクが2.2倍、という研究がある。

1SVの被爆より一日一杯のコーヒーのほうが体に悪いかも。

--
ところで資料には

1 Sv = 1000 mSv is a risk you would go out of your way to avoid, like texting while driving
1 Sv = 1000 mSv を被曝することは運転中に携帯メールを打つ危険と同じ程度のリスクで、避けた方がよいのは確か

とあるが
ここここのコメントによると

"texting while driving"とくれば「危ないことのたとえ、かつ手垢のついたジョークで笑うところ」というものになっているので、まあその上の文(原文)でいっているとおり、「(当然)自発的に避けるべき危険」、かつここで笑ってね。という発表だったのではないかと思います。

統計的に同程度のリスクという正確なものではなく、避けた方がよいが恐れるほどのことはない、という例えかと。

追記:
俺にとってタバコがイメージしやすいからそれと比較したまでで、中高年の自殺率(1万人に5人)でも交通事故率(1億3千万に76万件=1万人に58件)でも宝くじ20枚で3等100万以上がでる確率(1万人に4人)でも好きなものと比べればよろしい

個人的には、いちいち気にしてられないものの一つ、という認識。食品添加物も環境ホルモンも狂牛病も中国野菜も気にせず食ってた。

追記2:
厚生労働省が放射線医療の説明のために公開しているそのものズバリの解説があった
一日1-9本が3.4Sv,10-19本が6.1Svに相当。

305125 journal

beroの日記: 貧乏人のRedHat: CentOSとScientific Linuxの違い 4

日記 by bero

まとめ:CentOS 6が待てない/将来性に不安があったらScientific Linuxに乗り換えろ

RHEL6が出てからなかなかCentOS 6 が出てこないが、他のクローンであるOracle Linux 6とScientific Linux 6はリリースされている。

Oracle Linuxはリリースイメージは無料だが更新は有料っぽいので却下。
Scientific LinuxはNASAやFermi、CERNが研究所内で使うためにRHELに研究関連のソフトを追加してパッケージングしたもの。

CentOS6は出てないのでCentOS5.5とSL5.5で比較してみる

ftp://ftp.riken.jp/Linux/centos/5/os/i386/CentOS/
ftp://ftp.riken.jp/Linux/scientific/5x/i386/SL/

*パッケージ
centにあってSLに無い物はない。(centos-releaseがsl-releaseという名前になってるくらい)

*パッケージバージョン
いくつかのパッケージでSLのほうが新しい。おそらくCentではオリジナルのまま、SLではSLリリース時点の更新を取り込んているのではないか
どのみち更新すれば同じになると思われる。初回更新が少し短くなるくらいか

*ネーミングルール
RHELから変更したとおぼしきもの(apacheのデフォルト画面のRedHatロゴなど)はCentではel5.centos が付くが slまたはsl5が付く

*kernel
aufs,ndiswrapper,openafs,xfs等のモジュールが付いてる
centではcentosplusに入ってる

*入手(update)のしやすさ
どちらもriken等に高速ミラーがあるのでOK

*将来性
SLはNASAやFermi、CERNが研究所内で使うために作ってるので、開発停止するとロケットが落ちたりLHCが爆発したり・・はしないだろうけどデータ解析とか研究に支障をきたすだろうからたぶん保守されるんじゃね

*注意点
centは(どのバージョンからか忘れたが)デフォでyum-fastestmirrorが入るが、SL6では入らないしrepoがミラーを参照するようになってないからrepo設定書き換えるべし。

*おまけ
R,numpy,scipyとかはわかるがlameとかlibmadとかお前は何を研究してるんだ?(たぶんkdeの依存性とかだろうけど)

---
Cent6が遅れてるのはパッケージからRedhat商標を消す必要があるのを探すのがめんどいから、と聞いたことがあるが、Oracleとか先行クローンとRHELを比較すればいんじゃね?

-centos-release-5-5.el5.centos.i386.rpm
-centos-release-notes-5.5-0.i386.rpm
+sl-release-5.5-1.i386.rpm
+sl-release-notes-5.5-1.noarch.rpm

SLのみ
+915resolution-0.5.3-6.el5.i386.rpm
+R-2.11.0-1.sl5.i386.rpm
+R-devel-2.11.0-1.sl5.i386.rpm
+alpine-2.00-2.el5.i386.rpm
+aufs-0.20090202.cvs-6.sl5.i686.rpm
+cfitsio-3.100-1.el5.i386.rpm
+cfitsio-devel-3.100-1.el5.i386.rpm
+dkms-2.1.1.2-1.el5.noarch.rpm
+dmapi-2.2.8-1.sl5.i386.rpm
+dmapi-devel-2.2.8-1.sl5.i386.rpm
+dropit-1.2-1.i386.rpm
+fftw3-3.1.2-5.el5.1.i386.rpm
+fftw3-devel-3.1.2-5.el5.1.i386.rpm
+fuse-smb-0.8.7-1.SL.i386.rpm
+fuse-sshfs-2.2-1.SL.i386.rpm
+gnuplot42-4.2.6-5.el5.i386.rpm
+gnuplot42-doc-4.2.6-5.el5.i386.rpm
+gnuplot42-latex-4.2.6-5.el5.i386.rpm
+graphviz-2.24.0-1.el5.sl.i386.rpm
+graphviz-devel-2.24.0-1.el5.sl.i386.rpm
+graphviz-doc-2.24.0-1.el5.sl.i386.rpm
+graphviz-gd-2.24.0-1.el5.sl.i386.rpm
+graphviz-graphs-2.24.0-1.el5.sl.i386.rpm
+graphviz-guile-2.24.0-1.el5.sl.i386.rpm
+graphviz-java-2.24.0-1.el5.sl.i386.rpm
+graphviz-lua-2.24.0-1.el5.sl.i386.rpm
+graphviz-perl-2.24.0-1.el5.sl.i386.rpm
+graphviz-php-2.24.0-1.el5.sl.i386.rpm
+graphviz-python-2.24.0-1.el5.sl.i386.rpm
+graphviz-ruby-2.24.0-1.el5.sl.i386.rpm
+graphviz-tcl-2.24.0-1.el5.sl.i386.rpm
+gstreamer-plugins-extras-0.10.9-2.sl.i386.rpm
+gstreamer-plugins-fluendo-0.10-14.el5.i386.rpm
+gv-3.6.2-2.sl5.i386.rpm
+icewm-1.2.37-1.2.i386.rpm
+icewm-l10n-1.2.37-1.2.i386.rpm
+imlib-1.9.15-11.el5.i386.rpm
+imlib-devel-1.9.15-11.el5.i386.rpm
+ipw2100-firmware-1.3-5.noarch.rpm
+ipw2200-firmware-3.1-1.noarch.rpm
+iwlwifi-1000-ucode-128.50.3.1-1.el5.noarch.rpm
+iwlwifi-3945-ucode-15.32.2.9-1.el5.noarch.rpm
+iwlwifi-4965-ucode-228.61.2.24-8.el5.noarch.rpm
+iwlwifi-5000-ucode-8.24.2.12-1.el5.noarch.rpm
+iwlwifi-5150-ucode-8.24.2.2-1.el5.noarch.rpm
+iwlwifi-6000-ucode-9.193.4.1-1.el5.noarch.rpm
+jdk-1.6.0_20-fcs.i586.rpm
+k3b-extras-0.12.17-3.sl.i386.rpm
+kdeedu-3.5.4-1.el5.i386.rpm
+kdeedu-devel-3.5.4-1.el5.i386.rpm
+kernel-module-aufs-2.6.18-194.3.1.el5-0.20090202.cvs-6.sl5.i686.rpm
+kernel-module-aufs-2.6.18-194.3.1.el5PAE-0.20090202.cvs-6.sl5.i686.rpm
+kernel-module-aufs-2.6.18-194.3.1.el5xen-0.20090202.cvs-6.sl5.i686.rpm
+kernel-module-ndiswrapper-2.6.18-194.3.1.el5-1.55-1.SL.i686.rpm
+kernel-module-ndiswrapper-2.6.18-194.3.1.el5PAE-1.55-1.SL.i686.rpm
+kernel-module-ndiswrapper-2.6.18-194.3.1.el5xen-1.55-1.SL.i686.rpm
+kernel-module-openafs-2.6.18-194.3.1.el5-1.4.12-79.sl5.i686.rpm
+kernel-module-openafs-2.6.18-194.3.1.el5PAE-1.4.12-79.sl5.i686.rpm
+kernel-module-openafs-2.6.18-194.3.1.el5xen-1.4.12-79.sl5.i686.rpm
+kernel-module-xfs-2.6.18-194.3.1.el5-0.4-2.sl5.i686.rpm
+kernel-module-xfs-2.6.18-194.3.1.el5PAE-0.4-2.sl5.i686.rpm
+kernel-module-xfs-2.6.18-194.3.1.el5xen-0.4-2.sl5.i686.rpm
+kmod-xenpv-0.1-9.el5.i686.rpm
+kmod-xenpv-PAE-0.1-9.el5.i686.rpm
+kpartx-0.4.7-34.el5_5.1.i386.rpm
+lame-3.97-1.sl.i386.rpm
+lame-devel-3.97-1.sl.i386.rpm
+libRmath-2.11.0-1.sl5.i386.rpm
+libRmath-devel-2.11.0-1.sl5.i386.rpm
+libid3tag-0.15.1b-3.sl.i386.rpm
+libid3tag-devel-0.15.1b-3.sl.i386.rpm
+libmad-0.15.1b-4.sl.i386.rpm
+libmad-devel-0.15.1b-4.sl.i386.rpm
+libtidy-0.99.0-12.20070228.sl5.i386.rpm
+libtidy-devel-0.99.0-12.20070228.sl5.i386.rpm
+lua-5.1.2-1.el5.i386.rpm
+lua-devel-5.1.2-1.el5.i386.rpm
+ndiswrapper-1.55-1.SL.i686.rpm
+numpy-1.2.1-1.i386.rpm
+openafs-1.4.12-79.sl5.i686.rpm
+openafs-authlibs-1.4.12-79.sl5.i686.rpm
+openafs-authlibs-devel-1.4.12-79.sl5.i686.rpm
+openafs-client-1.4.12-79.sl5.i686.rpm
+openafs-compat-1.4.12-79.sl5.i686.rpm
+openafs-debug-1.4.12-79.sl5.i686.rpm
+openafs-devel-1.4.12-79.sl5.i686.rpm
+openafs-firstboot-1.4-1.SL.noarch.rpm
+openafs-kernel-source-1.4.12-79.sl5.i686.rpm
+openafs-kpasswd-1.4.12-79.sl5.i686.rpm
+openafs-krb5-1.4.12-79.sl5.i686.rpm
+openafs-server-1.4.12-79.sl5.i686.rpm
+perl-DBD-XBase-0.241-6.el5.noarch.rpm
+perl-MailTools-1.77-2.el5.noarch.rpm
+perl-Parse-RecDescent-1.94-1.noarch.rpm
+perl-SQL-Statement-1.15-5.el5.noarch.rpm
+perl-TermReadKey-2.30-5.el5.i386.rpm
+perl-Text-CSV_XS-0.23-1.i386.rpm
+perl-Text-Template-1.44-5.el5.noarch.rpm
+perl-Tk-804.028-3.el5.i386.rpm
+rhn-check-0.4.20-33.el5.noarch.rpm
+rhn-client-tools-0.4.20-33.el5.noarch.rpm
+rhn-setup-0.4.20-33.el5.noarch.rpm
+rhn-setup-gnome-0.4.20-33.el5.noarch.rpm
+rhnlib-2.5.22-3.el5.noarch.rpm
+rhnsd-4.7.0-5.el5.i386.rpm
+rt61pci-firmware-1.2-1.el5.noarch.rpm
+rt73usb-firmware-1.8-1.el5.noarch.rpm
+scipy-0.6.0-6.el5.i386.rpm
+suitesparse-3.1.0-1.el5.i386.rpm
+suitesparse-devel-3.1.0-1.el5.i386.rpm
+suitesparse-static-3.1.0-1.el5.i386.rpm
+taglib-1.4-1.2.sl.i386.rpm
+taglib-devel-1.4-1.2.sl.i386.rpm
+tidy-0.99.0-12.20070228.sl5.i386.rpm
+tzdata-java-2010i-1.el5.i386.rpm
+xfs-filesystem-0.4-2.sl5.i686.rpm
+xfsdump-2.2.46-1.sl5.i386.rpm
+xfsprogs-2.9.4-1.sl5.i386.rpm
+xfsprogs-devel-2.9.4-1.sl5.i386.rpm
+yumex-2.0.3-1.0.el5.noarch.rpm

独自ツール
+SL_afs_no_dynroot-2.0-3.noarch.rpm
+SL_desktop_tweaks-5-7.noarch.rpm
+SL_enable_serialconsole-3.1-6.noarch.rpm
+SL_no_colorls-1.0-3.noarch.rpm
+SL_password_for_singleuser-1.0-1.noarch.rpm
+SL_rpm_show_arch-1.1-1.noarch.rpm
+SL_sendmail_accept-1.1-4.noarch.rpm

304519 journal

beroの日記: Javaプログラマであるかを見分ける10の質問 に非Javaプログラマが答えてみる 2

日記 by bero

Javaプログラマであるかを見分ける10の質問

俺はJavaをまともに使ったことはないんだが、80%位は答えられたかな?

- ==演算子とequalsメソッドの違いは何か?

オブジェクトの場合、==は同一性、equalsは同値性を比較する

- 文字列の+演算子による連結とStringBuilderを使った連結の違いを説明せよ。

新しいバージョンでは最適化されて同じになるので違いはない。
ただしループ中でたくさん連結するような場合は(最適化の度合いによっては)明示的にStringBuilderを使ったほうが良い。

#という噂ではあるが逆汗して確認したことはない。
s = s + s1 + s2
s = (new StringBuilder(s)).append(s1).append(s2).toString()
#1文なら同じだが、ループ中だと最初のnew StringBuilderと最後のtoString()はループ外に出したほうが良いだろう。
#このくらいコンパイラ(javacまたはJITのどちらかは問わず)でやってそうなもんだが、実際は知らない。

- Listのようにジェネリクス型を使う主たる目的は何か?

Interger以外のオブジェクトが入るのを防ぎ、キャストが不要になり、それに伴うミスの混入を防ぐ

# Integerだとintとのboxing/unboxingも利点かもしれんがJavaで出来るかどうかうろ覚え(C#はできたはず)。
# まあ「のように」とあるからジェネリクス全般の質問だろうから書かない。

- オブジェクトがガベージコレクション(GC)される主たる条件は何か?

ヒープがいっぱいになったとき
どこからも参照されなくなったとき

#循環参照の扱いは知らんがGCはJavaで最も研究が進んだ分野の一つだから対処してないはずがない

- チェック例外と非チェック例外の違いを型と例外処理の観点で説明せよ。

しらね(後述)

-フィールドのアクセス修飾子をprivateにしgetter/setterメソッドを提供する事でフィールドを参照する設計方針を取る主な理由を説明せよ

実装を隠蔽して変更可能にするため。例えば内部に対応するフィールドをもつのではなく、getterで計算で出したり別オブジェクトを参照したりできる。

#のであるが隠蔽出来さえすれば逆に普通のフィールドアクセスのように記述すると内部でgetter/setterメソッドを呼ぶというJavaScriptやRubyのような言語仕様もありなので、こっちのが好みかな

- NullPointerExceptionが発生するのは主にどういう状況か?

Nullを返す可能性のあるAPIを使い、チェックせずそのまま(オブジェクト操作などに)使ったとき

- オーバーロードとオーバーライドの違いは何か?

オーバーロード -> 同じ名前の(引数の数や型が)違うメソッド。
オーバーライド -> 子クラスで親クラスと挙動を変えるための親クラスと同じシグネチャ(引数の数や型)のメソッド

- コンストラクタとは何か?

newしたときに初期化するためのメソッド

- インターフェイスを利用する目的を1つ説明せよ

ある機能をもった(実装やふるまいの異なる)メソッドを呼びたい時、子クラスのオーバーライドではなくインターフェイスを使うとクラス階層を限定せずに利用出来る

----
Javaプログラマでなくても答えられるから悪い設問、というわけではなくて、
「Javaプログラマであるかを見分ける10の質問」というか正確には「Javaプロジェクトに追加投入する人材のスキルチェック」らしいので、COBOLライクなJavaプログラムよりOOを理解した他言語プログラマのほうが望ましい、という意図なんでしょう。

チェック例外ちょっと調べてみたら、
- 例外処理を書くのが必須(コンパイルが通らない)なのがチェック例外、書かなくてもいいのが非チェック例外 =いいかげんな視点
- 非チェック例外型(RuntimeException等)の子クラスが非チェック例外、それ以外がチェック例外
チェック例外のへんは議論百出というか喧々諤々というか
フレームワークでチェック例外を握りつぶして非チェック例外にしてる(から上位レイヤでは知らなくてよし)のもあるみたいだな

301084 journal

beroの日記: Linuxでumountできないとき

日記 by bero

Linuxでumountしようとすると「デバイスを使用中です」とか「device is busy」と出てumountできないときがある

ぐぐるとfuserで使ってるプロセスを調べろ、と出てくるが、調べても使ってるプロセスが無いときがある。
こういう場合、ユーザープロセスではなくカーネルが使ってる可能性がある。

俺の場合はnfsだった。
Linuxのnfsは一見init.dで起動するデーモンぽいが、実際にはカーネルに「動け」と指令するだけで処理はカーネル内で行われるので(たぶん)、カーネルが使ってることになる。
他にも、in-kernel http(tux)とかiscsiターゲットとか仮想化ホストとかが使う可能性があるんじゃなかろうか

300779 journal

beroの日記: 児童ポルノのドメイン停止キター

日記 by bero

前回、日本のサイトで米国の児童ポルノ禁止法にかかるものはドメインがある日突然使えなくなる可能性がある、と書いたが、間をおかずしてドメイン停止が始まった模様。
日本のサイトで影響を受けたところはあるのだろうか?

米政府、84,000のサイトを児童ポルノサイトとして『誤って』シャットダウン

上記は、児童ポルノサイトがレンタルドメインを利用していたため、同じサービスを利用していた合法なサイトが巻き添えですべて利用できなくなった話。

typodupeerror

吾輩はリファレンスである。名前はまだ無い -- perlの中の人

読み込み中...