Hatena::ブログ(Diary)

風柳メモ このページをアンテナに追加 RSSフィード Twitter

2014-12-13

ダウンロードしつつ逐次処理できるcURL wrapperを試作

PHPしか使えないような*1レンタルサーバ上で、HTTP GET/POST/HEAD 等の応答をダウンロードしつつ、逐次処理(典型的にはプログレスバー表示)できたら、それなりに使い道があるかも? と思って、試作してみた。

AsyncCurl: ダウンロードしつつ逐次処理を行うための cURL(PHP) wrapper

※ 説明はこちら

Asyncだの非同期だのといいつつ、どこが? って感じだけれど……他の名前も特に思いつかなかったのでそのまま。


仕組み

単に、proc_open()で子プロセスを起動し、親→子にPIPE経由で指示を送り、子プロセスで cURL によりコンテンツをダウンロード&子→親にPIPE経由で結果を送信、という処理を行っているだけ。

ユーザーは、子→親用のPIPEのファイルポインタリソースを取得し(init()の第3引数、もしくはget_contents_pointer())、fread() 等を使って一定サイズずつ読み込むようにすれば、逐次処理を実行できる。


落ち

と、せっかく作ってみたものの……お名前.comのレンタルサーバ上では使えなかった(哀)。どこがいけないのかなぁ?

さくらインターネットとかXREA.COM、ファーストサーバなんかのレンタルサーバ上ではとりあえず動いたのだが……。

追記(2014/12/13)

お名前.comのレンタルサーバでも動作するようになった。

ポイントは、

  • PHPのCLI版の位置(/usr/local/bin/php.cliなので、async_curl_options.phpの$PHP_CLIを書き換える必要あり)
  • CLI版バージョンがPHP 5.2.12 (cli) (built: Feb 23 2010 12:46:49)*2であるため、array_replace() が使えない。
  • php://fd/* 形式のストリームもオープンできない模様。

2014/12/13時点での情報

追記(2014/12/15)

さくらインターネットのレンタルサーバにおいても、php://fd/* 形式のストリームをオープンできないことがある模様。

  • CLI版の実行時には親/子共にphp://fd/*をオープン可能。
  • CGI版(Webからのアクセス)の場合、子プロセスは php://fd/* がオープン可能だが、親プロセスでは不可。

結局、転送結果の取得用にはphp://fd/3 は使用せず、STDERRで代用するよう修正。

*1:え、Perlなら大抵のところで使える?そんなものもあったかなぁ……(トオイメ)

*2:CGI版/usr/local/bin/phpを5.4.XXとか5.5.XXにしてあっても、CLI版は古いまま

2014-12-12

お名前.com上に置いたページをブラウザで見ると点滅(短時間でリフレッシュ)してしまうことがある件

現象

お名前.comのレンタルサーバを使っていて気が付いたのだが、設置したページをブラウザで見ると、たまに点滅して表示される(ごく短時間でRefreshされたようになる)ことがある。

発生条件の詳細は不明だが、しばらく見ていないページを開いた時に起きやすい傾向があるように思う。


こちらの設定の問題なのか、お名前.com上の問題なのか、切り分けするために調査していたところ、上記現象が発生する際には、

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/strict.dtd">
<!-- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd"> -->
<HTML>
<HEAD>
<META HTTP-EQUIV="Refresh" CONTENT="0.1">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">
<TITLE></TITLE>
</HEAD>
<BODY><P></BODY>
</HTML>

のようなHTMLが送られてきていることがわかった(当然ながら、自分ではこんな表示をするような設定は行っていない)。


お名前.comからの回答

サービス側の問題だろうということで、お名前.comに問い合わせをしてみたところ、以下のような回答が得られた(要約)。

・サーバー側でDDos(アタック)対策を行っていることに伴う現象。

・発生頻度は、コンテンツのトラフィックが非常に多い場合に高くなる傾向あり。

・セキュリティ対策であり、無効化・回避策を設けることは困難。

どうやら、サーバー前段にセキュリティ装置が設置されており、これがトラフィックを監視し、攻撃と思われるものがあったら上記のようなHTMLを返す(サーバーには負荷がかからない)ということだろうと推測される。

しばらく見ていなかったページを見たときによく発生するように思われるのは、キャッシュ期限が切れて一度に様々なコンテンツを取得するから、だろうか?

攻撃だったらそもそも応答を返さなければよいのでは、とも思うが、HTTP-EQUIV="Refresh"のMETA要素を含むHTMLやHTTPレスポンスヘッダ内にも「Refresh:0.1」が設定されていることから推測すると、一般ユーザーに対する便宜を図っている、のかな?

クライアントがブラウザの場合には再読み込みが行われて、そのうち正規のコンテンツが取得されるから不便はない、ということなのかも知れないけれど……これ、クライアント側に対する攻撃じゃないのか……? それにリフレッシュされることでトラフィックは(サーバには届かなくても)増えていて、通信帯域を圧迫しそうな気が……?

サービス側のセキュリティには詳しくないが、これはDDoSに対して一般的に実施される対策なのだろうか? 教えて、えらいひと。


関連

ネットで検索してみると、いくつか関連すると思われる話題がヒットした。

お名前.comのVPSでの案件

お名前COMのVPSが妖しい…。

お名前COMのVPSサービスで、自分が上げてもいないポートが外部から見たら勝手にopenして何者かが応答を返すという乗っ取り案件が発生しているようなので経緯をメモ。

お名前VPSで乗っ取り発生!? - Togetterまとめ

自分で開けてもいないポートから応答が返ってきたら、警戒するよなぁ、それは…。

これはVPSの事例だけれど、レンタルサーバでも同様の攻撃対策が実施されているということか。


かつて三井住友銀行のサイトでも発生?

問題のサイトなのですが、三井住友銀行のトップページで起こりました。

URL指定のないHTTP-EQUIV="Refresh" 【OKWave】

2008年のQ&A。発生している現象は今回のお名前.comの事例と同様かな。



謎のHTMLを返しているのは、Cisco製のAGM(Anomaly Guard Module)?

This problem seems to be caused by Cisco's Anomaly Guard Module (AGM), which sits on the network between clients and servers and attempts to authenticate clients by challenging them with an HTML meta refresh. There isn't much you can do about it, short of asking your server network provider to disable basic protection for HTTP on their AGM.

WordPress › Support » [Plugin: WP Super Cache] Is this refresh problem related to supercache

2014-11-13

【twRotateImage】Twitterの画像を回転表示するユーザースクリプト試作

Twitterで、たまに90度傾いた画像をみかけるので、その場で回転できるようなユーザースクリプトを試作してみた。


ダウンロード(GitHubにて公開

【twRotateImage】Twitterの画像を回転表示するユーザースクリプト

furyutei/twRotateImage ? GitHub

インストール

Firefox + Greasemonkey
  1. 上記のダウンロードリンクをクリックし、指示に従ってインストール。
Google Chrome + Tampermonkey
  1. 上記のダウンロードリンクをクリックし、指示に従ってインストール。
その他ブラウザ

(未確認)


使い方

画像にマウスカーソルを合わせた状態で[R]キーを押すと、押すごとに90度ずつ回転表示する。

デフォルトでは時計回り、[Shift]+[R]キーだと反時計回り。


ひとりごと

回転はCSS3のtransformプロパティで実施しているのだが、回転させたときに枠内に収める(他の要素に重ならず、かつ(できればセンタリングしつつ)全体を表示する)うまい方法がよくわからない……。

90度回転させても、width や height のプロパティ値は変わらないんだよな…。

2014-10-18

Amazon.co.jpの正規化URLの構造を調べてみた

承前

【amzRememberOptions】Amazon.co.jpで検索のカテゴリー&並び替えオプションを保存するユーザースクリプト試作 - 風柳メモ

Amazon.co.jpで著者検索 - Hatena::Let

これらを作る前後にて、Amazon.co.jp の正規化URL(link[rel="canonical"] の href 値)等について調べてみたことの覚書。

きちんと検証しているわけではないので注意。誤り等あった場合はご指摘願う。


個別商品ページ

正規化URLの構造
http://www.amazon.co.jp/[商品名]/dp/[ASIN]
  • [商品名] はエンコードされている。また、"[商品名]/"の部分は省略可。
通常の個別商品ページURL例http://www.amazon.co.jp/お前は俺を殺す気か-1-シギサワ-カヤ/dp/4592710533/ref=sr_1_2?s=books&ie=UTF8&qid=1413583689&sr=1-2&keywords=お前は俺を殺す気か
正規化URLhttp://www.amazon.co.jp/お前は俺を殺す気か-1-シギサワ-カヤ/dp/4592710533

検索ページ(カテゴリー指定)

正規化URLの構造
http://www.amazon.co.jp/[キーワード]-[カテゴリー名]/s?ie=UTF8&page=[ページ番号]&rh=[第1要素],k:[キーワード]
  • [キーワード]および[カテゴリー名] はエンコードされている。また、"[キーワード]-[カテゴリー名]/" の部分は省略可。
  • “すべてのカテゴリー”で検索する場合、"-[カテゴリー名]"の部分は入らない。
  • [第1要素]は、カテゴリー名が“すべてのカテゴリー”の場合には、"i:aps"固定、それ以外は"n:[BrowseNode]"が入る。
  • 絞り込みを行うと、rhパラメータに「,[第3要素],[第4要素]…」というふうに追加されていく。
    各要素は“p_*:*”といった形式のようだが、詳細は不明。
通常の検索ページURL例http://www.amazon.co.jp/s/ref=nb_sb_noss_1?__mk_ja_JP=カタカナ&url=search-alias=stripbooks&field-keywords=お前は俺を殺す気か
正規化URLhttp://www.amazon.co.jp/お前は俺を殺す気か-本/s?ie=UTF8&page=1&rh=n:465392,k:お前は俺を殺す気か
BrowseNode一覧
カテゴリー名search-aliasBrowseNode
Kindleストア digital-text2250738051
Amazon インスタント・ビデオinstant-video2351649051
デジタルミュージックdigital-music2128134051
Androidアプリmobile-apps2381130051
stripbooks465392
洋書english-books52033011
ミュージックpopular561956
クラシックclassical701040
DVDdvd561958
TVゲームvideogames637394
PCソフトsoftware637392
パソコン・周辺機器computers2127209051
家電&カメラelectronics3210981
文房具・オフィス用品office-products86731051
ホーム&キッチンkitchen3828871
ペット用品pets2127212051
ヘルス&ビューティーhpc160384011
コスメbeauty52374051
食品&飲料food-beverage57239051
ベビー&マタニティbaby344845011
服&ファッション小物apparel352484011
シューズ&バッグshoes2016926051
腕時計watch324025011
ジュエリーjewelry85895051
おもちゃtoys13299531
ホビーhobby2277721051
楽器mi2123629051
スポーツ&アウトドアsporting14304371
カー・バイク用品automotive2017304051
DIY・工具diy2016929051
大型家電appliances2277724051
クレジットカードfinancial2320455051
ギフト券gift-cards2351652051

SearchIndexとBrowseNode一覧 - 前人未踏の領域へ等を参照するに、BrowseNodeはProduct Advertising APIで使用されているものと共通だと思われる。


検索ページ(著者名等指定)

正規化URLの構造
http://www.amazon.co.jp/[カテゴリー名]-[著者名等*]/s?ie=UTF8&page=[ページ番号]&rh=n:[BrowseNode],[第2要素名]:[著者名等]

  • [カテゴリー名]および[著者名等]はエンコードされている(PATHに含まれる[著者名等*]の方は、スペースが'-'に変換される模様)。また、"[カテゴリー名]-[著者名等*]/" の部分は省略可。
  • [BrowseNode]および[第2要素名]の組み合わせの例は次表参照。
    search-aliasフィールド名BrowseNode第2要素名備考
    (任意)field-keywords(任意)kキーワード
    books-jpfield-author465392p_27著者(和書)
    books_usfield-author52033011p_27著者(洋書)
    music-artistfield-artist561956p_32アーティスト
  • 絞り込みを行うと、rhパラメータに「,[第3要素],[第4要素]…」というふうに追加されていく。
    各要素は“p_*:*”といった形式のようだが、詳細は不明。

例1: 著者(和書)
通常の検索ページURL例http://www.amazon.co.jp/s/ref=dp_byline_sr_book_1?ie=UTF8&field-author=シギサワ+カヤ&search-alias=books-jp&text=シギサワ+カヤ
正規化URLhttp://www.amazon.co.jp/本-シギサワ-カヤ/s?ie=UTF8&page=1&rh=n:465392,p_27:シギサワ カヤ
例2: 著者(洋書)
通常の検索ページURL例http://www.amazon.co.jp/s/ref=dp_byline_sr_book_1?ie=UTF8&field-author=Travis+Swicegood&search-alias=books-us&text=Travis+Swicegood
正規化URLhttp://www.amazon.co.jp/洋書-Travis-Swicegood/s?ie=UTF8&page=1&rh=n:52033011,p_27:Travis Swicegood
例3: アーティスト
通常の検索ページURL例http://www.amazon.co.jp/s/ref=dp_byline_sr_music_3?ie=UTF8&field-artist=山本正之&search-alias=music-artist
正規化URLhttp://www.amazon.co.jp/-アーティスト名-山本正之/s?ie=UTF8&page=1&rh=n:561956,p_32:山本正之

著者ページ(アーティスト等も含む)

正規化URLの構造
http://www.amazon.co.jp/[著者名]/e/[ASIN(?)]
  • [著者名] はエンコードされている。また、"-"一文字に置換可能。
  • [ASIN(?)] は著者毎に割り振られた一意の記号番号だと思われる。
通常の著者ページURL例http://www.amazon.co.jp/秋★枝/e/B00J1Z7E5E/ref=ntt_athr_dp_pel_pop_1
正規化URLhttp://www.amazon.co.jp/秋★枝/e/B00J1Z7E5E

Google ChromeのコンテキストメニューにAmazon著者検索を追加する(Context Menu Search使用)

承前


Context Menu Search に登録してみる

Google Chromeの拡張機能である

Context Menu Search - Chrome Web Store

をインストールし、オプション設定の「Add search engines」メニューで、

f:id:furyu-tei:20141018205818p:image

Display nameLink
Amazon著者検索http://www.amazon.co.jp/s?ie=UTF8&page=1&rh=n:465392,p_27:TESTSEARCH&sort=date-desc-rank&unfiltered=1

のように入力して、[Add new option]ボタンを押す。


あとは、任意のページで、作者名をドラッグして選択→右クリックでコンテキストメニューを出すと、

f:id:furyu-tei:20141018205816p:image

こんな感じで、「Context Menu Search」→「Amazon著者検索」から検索できる。


他にも、この記事を参考にして、例えば、

Display nameLink
Amazon和書検索http://www.amazon.co.jp/s?ie=UTF8&page=1&rh=n:465392,k:TESTSEARCH&sort=date-desc-rank&unfiltered=1

のようなこともできる。

2014-10-17

【amzRememberOptions】Amazon.co.jpで検索のカテゴリー&並び替えオプションを保存するユーザースクリプト試作

Amazon.co.jpのキーワード検索で新規に検索しようとすると、オプションがデフォルトに戻ってしまう(カテゴリーが「すべてのカテゴリー」・並び替えが「キーワードに関連する商品」)。

自分の場合、検索対象は9割方は本なのに、いちいち指定しなおすのが煩わしかったので、これらを保存して次回検索時に反映するようなユーザースクリプトを試作してみた。

ちょっと動作があやしいところもあるけれども。。。


あと、個人的に、著作ページがまだ今一つ使えない(作品が網羅されていない等)ので、著作ページの場合は強制的に著者検索ページに移動するようにしてみた。

スクリプト中のREPLACE_AUTHOR_URLをfalseにすれば、この機能は無効化される。


ダウンロード(GitHubにて公開

【amzRememberOptions】Amazon.co.jpの検索オプションを保存するユーザースクリプト

furyutei/amzRememberOptions ? GitHub

インストール

Firefox + Greasemonkey
  1. 上記のダウンロードリンクをクリックし、指示に従ってインストール。
Google Chrome + Tampermonkey
  1. 上記のダウンロードリンクをクリックし、指示に従ってインストール。
その他ブラウザ

(未確認)


ひとりごと

いつものように勢いで作ってしまったのだけれど、実は標準でこれらのオプションが保存される方法があるとか、あったりする……?