Strawberry Perl 5.22.1.3 (32bit)でText::Mecabをインストールできない

ポータブル版でWin-Rからportableshell.batを開き、cpanm --notest --interactive Text::MeCab((cpanmでビルドする場合mecab-configのないWindowsでは--interactiveが必要。)) するとエラーになる。ビルドログには以下のメッセージ。

g++.exe -o blib\arch\auto\Text\MeCab\MeCab.xs.dll ... dll.exp
path\to\MeCab\sdk\libmecab.lib: error adding symbols: File format not recognized
collect2.exe: error: ld returned 1 exit status
dmake.exe:  Error code 129, while making 'blib\arch\auto\Text\MeCab\MeCab.xs.dll'

libファイルが認識されていないようだが、filegcc-ar tしてみると壊れてはいない雰囲気。
ためしに前にビルドが成功したStrawberry Perl 5.20.2.1に付いているcディレクトリと一時的に入れ替えてみたところ、正常にビルドできた。

5.22付属のMinGW環境が何かおかしいのかもしれない。ただWin32::Registryなど、特に外部ライブラリを必要としなさそうな他のモジュールのビルドは付属のもので正常にできた。


プログラムのバージョンを調べてみたら5.20.2の方が新しかった。いっそ入れ替えたまま使ってもいいかもしれない。

Perl GNU ld gcc
5.20.2 2.25 4.9.2
5.22.1 2.24 4.8.3

結局前のバージョンに戻した

LWP::UserAgentにおいてcallbackを使ったリクエスト発行でレスポンスポディが取れない問題が発生した。普通のファイルへの格納はできる雰囲気なので、そこまで複雑な問題ではないはずなのだが、ちょっとしたパッチで解決できる見通しが立たない。
Perlのバージョンアップに際しての一連の問題だったので前のバージョンに戻すことにした。qr//nはしばらくお預けになってしまった。

PCRE は possessive を使うと速いのか → 変わらない

簡単な例として /.*<\/tag>/ のようなパターンがあったときに "......" にマッチさせる必要がないならば /.*?<\/tag>/ (non-greedy) とすれば無駄なバックトラックが発生しない分相当速くなる。
これは当たり前だが、ここでさらに "...0 < 1..." にマッチさせたくないならば /[^<]*?<\/tag>/ というパターンにできる。
疑問なのは、これをさらに /[^<]*+<\/tag>/ (possessive) としてバックトラックを禁止すると速くなるのかどうか。

感覚的にはマッチしなかった場合にバックトラックしない分、速くなりそうなのだが、以前Perlでpossessiveにしたところパフォーマンスが落ちたことがあったのでとりあえずドキュメントに当たってみた。
それによるとPCRE2では自動的にそのような最適化が行われるらしい。PCRE2_NO_AUTOPOSSESS/(*NO_AUTO_POSSESS)/ を指定しない限りは勝手にpossessiveになるそうだ。

ただPCREかPerlかBoostか忘れたが何かの正規表現エンジンで /^(?:A|B)//^A|^B/ と書いたら目に見えて遅くなったことがあるので、明らかに等価でもいつも最適化されるとは限らないだろうとは思う。

Genieo/1.0 のDoSアタック

ブラウザプラグインらしい。

  • robots.txtを無視してアクセスする。
  • Connection: close で間隔をおかずに連続アクセスする。
  • URLの #以降を無視しないので同じURLを何度も読み込む。

robots.txtの件は Disallow: /nobot と書いても /nobot.html にアクセスする。仕様にあるような先頭一致ではなく / 区切りで完全一致させているのだろうか。
ユーザ環境でクロールを行ってリコメンデーションをするらしいが、これだけトラフィックが発生するとユーザ側も重くなるのではと思う。使ってないので実際は不明なもののマルウェアとして分類しているところもある。
2012年頃はUser-Agentの偽装もやっていたらしいのでそれに比べれば今はUser-Agentでブロックできるだけマシなのだろう。

以下ログ

続きを読む

LINE Corporation の harvester

203.104.145.* から変なbotのアクセスがある。

GET /<HTML_PATH> HTTP/1.1
Connection: close
From: obs-jp
Host: <SERVER_HOSTNAME>
Accept-Charset: utf-8
Accept-Language: en-US,en;q=0.8,*;q=0.6
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36
X-Obs-Proxy-Ip: <SERVER_IP_ADDRESS>
Content-Length: 0
# <...>には適当な文字が入る
  • robots.txtを無視する
  • Chromeに偽装している
  • そのくせロボット以外に通常付けないFromヘッダがある
  • Fromヘッダがメールアドレス(を連想させるもの)ではない
  • GETなのにContent-Lengthヘッダがある

なかなか素敵な実装だ。
HTMLしか読まないが、何をしているのだろう。

[Linux] Cent OS 6 で sudo 無しの Let's Encrypt

注意

2016年6月現在 Let's Encrypt はベータ期間が終了し、公式のクライアントは certbot というものに置き換わっている。
自分では Perl で実装したモジュールである Protocol::ACME を使っているので公式クライアントの状態は不明だが、以下の情報はまったく役に立たない可能性がある。

前書き

Let's Encrypt を使ってみようとしたが、インストールに sudo 必須なのが微妙。CentOS 6なので正式にはサポートもしていないらしい。
そこをなんとか sudo 無しでがんばってみた。

ただ、後で知ったが実際には純正クライアントを使わなければいけないということではないようだ。クライアント実装一覧にライブラリも含めたくさん存在する。クライアントでは ACME Tiny が手軽そうだ。

続きを読む