風柳メモ

ソフトウェア・プログラミング関連の覚書が中心

PEARのブラウザによるインストールがうまくいかなかったのでgo-pear.phpを修正

2018/04/12追記

PHP 7 では、うまく動作しなくなってしまったようです。
インストール自体は出来るようですが、その後、Web Frontend(「Start Web Frontend of the PEAR Installer >>」リンク)でエラーが頻発し、正常に動作しません。
これは当方では対処は困難です。あしからずご了承願います。


修正版のgo-pear.phpのダウンロードはこちらから

go-pear.php

GitHub - furyutei/go-pear: Modify the PEAR installation wizard(go-pear.php)

経緯:レンタルサーバ等のコマンドラインが使えない環境でPEARがうまくインストールできない

ホスティング環境での PEARのインストール方法に従って、go-pearをgo-pear.phpという名前でサーバ上にアップロードし、ブラウザから開いてPEARをインストールしようとしたが、途中で止まってしまう現象が発生。


具体的には、

Bootstrapping Installer...................
Bootstrapping PEAR5.php............(remote) ok
Bootstrapping PEAR.php............(remote) ok
Bootstrapping Archive/Tar.php............(remote) ok
Bootstrapping Console/Getopt.php............(remote) ok
Fatal error: Class 'PEAR' not found in /path/to/go-pear/go-pear.php on line 697

までが表示された後、エラー表示もなく停止してしまった。エラー表示を有効にした場合、Fatal errorになっていた。
プログレスバーは21%あたり。

原因と対策

go-pearのソース中、

$bootstrap_files = array(
    'PEAR5.php'            => 'https://raw.github.com/pear/pear-core/master/PEAR5.php',
    'PEAR.php'             => 'https://raw.github.com/pear/pear-core/master/PEAR.php',
    'Archive/Tar.php'      => 'https://raw.github.com/pear/Archive_Tar/master/Archive/Tar.php',
    'Console/Getopt.php'   => 'https://raw.github.com/pear/Console_Getopt/trunk/Console/Getopt.php',
);

のように定義されているファイルを download_url() という関数を使ってダウンロードしているが、実際のファイルは

https://raw.githubusercontent.com/pear/.../master/...

に存在しており(301 Moved Permanently)、download_url()がリダイレクトに未対応だったために、空ファイルとなっていた。
error_log を見ると、

PHP Fatal error:  Class 'PEAR' not found in /path/to/go-pear/go-pear.php on line 697

のようなエラーが発生していた。
そこで、download_url() を改修し、簡易的に自動リダイレクト処理をサポートすることにより対処した。
修正版のgo-pear.phpはこちら

【近傍ツイート検索】削除済(404)ツイートからの近傍検索機能追加・不具合修正等(ver.0.02b)

インストールはこちらから

【近傍ツイート検索(twDisplayVicinity)】特定ツイート前後のタイムラインを表示するユーザースクリプト

furyutei/twDisplayVicinity · GitHub
  • タイムライン表示から、詳細リンク等で個別ツイートに遷移した際、[近傍]リンクが付かない不具合の修正。
  • 個別ツイート表示時に削除済み(404)だった場合も、「このページは存在しません。」の右に[近傍]リンクを表示するように修正。
  • [近傍]検索時のタイムライン表示のとき(URLに#source_id=...が付いているとき)に、上方に(新しい)ツイートが表示されるのを抑制。
    抑制せずに表示したい場合、ソース中のHIDE_NEWER_TWEETSをtrueからfalseに変更のこと。
  • その他、微調整等。

謝辞

削除済みツイートの近傍対応と、個別ツイートで[近傍]リンクが付かない不具合については、トマ村(@)さんのご指摘を元に修正しました。ありがとうございます。


いまさらながらStreaming APIをちょっと試してみた

Tweepyで簡単に試せるみたい

PythonだとTweepyがStreaming APIをサポートしていることに気づき、試してみた。

streamig.py使用例

tweepy · GitHub

習作

とりあえず、サイコロを振ってくれるbot「Diceだよ!」を作ってみた。*1
余談だが、こういうメンションに反応してリプライを返す系のbotの場合、新デザインの「固定されたツイート」として簡単なマニュアルを貼り付けておけばいいかも。


ただ、こういう応答を返すbotだと、どうしても1000ツイート/日までという制限がネックになるよな。まぁ、このbotの場合はそこまで使われるわけもないが。

他に試してみたかったことなど

リマインダー

時刻を指定してメンションとかDMしておけば、その時刻になったときに応答を返してくれるようなbotを作ってみたかった。
ネックは、1000ツイート/日。個人用としてなら十分なのだけれど、公開して使ってもらおうとすると足りなくなるのは目に見えているしな…。

  • 受信はひとつで、応答用に複数のbotを使いまわす→botの乱立は睨まれるし、(特にDMを使うような場合)フォロー関連の処理等がややこしいことになりそう。
  • アプリ連携させてその人のタイムラインにツイート→自分宛のリプライは通知してくれないので気づかなさそう。
特定キーワードを含むツイートの地域分布の調査

例えば、「ゆれ」「揺れ」等をキーワードに地震が発生した地域の調査とか、「インフルエンザ」等をキーワードに流行地域の調査とか。
ただ、これ、ツイートするときに位置情報が付加されていないと意味がないんだよね…位置情報付きのツイートって、どのくらいあるんだろう…?と思って、簡単にだけれど調べてみたところ…。
Streaming APIのstatuses/sampleを使用して、300,000件のツイートを調査。

■結果
※300,000件時(約2時間経過)

全ツイート数 日本語ツイート数 日本語の割合
300,000件 86,738件 28.913%
全ツイート数 位置情報含 割合
300,000件 5,191件 1.730%
日本語ツイート数 位置情報含 割合
86,738件 409件 0.472%

※3,000,000件時(約16時間経過)

全ツイート数 日本語ツイート数 日本語の割合
3,000,000件 532,158件 17.739%
全ツイート数 位置情報含 割合
3,000,000件 58,183件 1.939%
日本語ツイート数 位置情報含 割合
532,158件 2,237件 0.420%

※約24時間経過時

全ツイート数 日本語ツイート数 日本語の割合
4,308,000件 809,078件 18.781%
全ツイート数 位置情報含 割合
4,308,000件 83,992件 1.950%
日本語ツイート数 位置情報含 割合
809,078件 3,648件 0.451%

やはりというか、位置情報を含むツイートは少ないので、地域分布のデータとして有効なものが取れるかというと、微妙なところだろう。

*1:アイコンはフリー素材: サイコロの背景画像 2・透過pngアイコン - Kappaa CG Galleryに置かれていたフリー素材を使用させていただいた。

【近傍ツイート検索】不具合修正(ver.0.02a)

インストールはこちらから

【近傍ツイート検索(twDisplayVicinity)】特定ツイート前後のタイムラインを表示するユーザースクリプト

furyutei/twDisplayVicinity · GitHub
  • ユーザータイムラインを使った検索が、https://twitter.com/?max_id=...だとリプライが含まれないようになっていたため、https://twitter.com//with_replies?max_id=... 側を表示するように修正。
  • その他、微調整。

謝辞

id:taizooo/@さんよりご指摘を受けて、修正しました。ありがとうございます。

GAE-Cron:Python 2.7 runtime版を公開(version 0.0.3)

GAE-Cron(Google App Engine上で動作する簡易 web cron サービス)の Python 2.7 runtime 版を公開しました。
version 0.02aをPython 2.7 runtime対応版に修正したものであり、機能的には変わりません。

Google App Engine Python 2.7 runtime 開発環境が必要

新版の GAE-Cron を使用(デプロイ)するためには、Google App Engine Python 2.7 runtime 環境が必要になります。
既に Python 2.5 runtime 環境を構築済みの方も新規構築が必要です。


Google App Engine の Python 2.5 runtime 環境は、2014年現在非推奨となっています。

Python 2.5 runtimeを使用する新規アプリケーションの作成は出来なくなっているようです。既存アプリケーションは今のところ動作していますが、将来的には動作しなくなる可能性があります。

バージョン2.7への移行を:Google App Engine、Python 2.5ランタイムを非推奨に - @IT
Google App Engine Blog: Python 2.5, thanks for the good times

無料枠(Free Quota)で使うための設定

Google App Engine のアプリケーション管理画面より、(Administration)Application Settings → Performance にて、

  • Max Idle Instances をデフォルトの"Automatic"から"1"に下げる(左(Min)方向にスライド)
  • Min Pending Latency をデフォルトの"Automatic"から"15s"に上げる(右(Max)方向にスライド)

し、[Save Settings]をクリックして保存。


Google App Engineの無料枠(Free Quota)のリソース制限はかなりきつくなっており、油断するとすぐに"Over Quota"などと言われて一時的に使用できなくなるなどしますが、上記設定を行うことにより、かなり緩和できます。
緩和出来るだけであり、無料枠での快適な使用を保証するものではありません。念のため。

旧版からの移行について

基本的には、

  • ファイルは全て上書き。
  • *.yaml.sample となっているファイルは、*.yaml にリネーム。
    設定変更等を行っている場合、予め旧設定をメモしておき、必要な部分を手動で書き換え。
  • app.yaml の "application:" の箇所をご自分で取得されたアプリケーション名(Application Identifier:appid)に変更してアップロード(デプロイ)。
  • デプロイ後に、管理者アカウントでログインし、[全タイマ再設定]

という流れになります。

version 0.02* からの移行であれば、gaecron.yamlおよびcron.yamlはそのまま使用できますが、app.yaml は使用できません。
必ず app.yaml.sample をコピーしたものをご自分の設定に合わせて書き換えるようにしてください。
0.02*からの移行に限り、[全タイマ再設定]を実施しなくてもそのまま動作するはずです。ただし、動作がおかしいと思われる場合は[全タイマ再設定]を実施してみてください。