このエントリーをはてなブックマークに追加
スポンサーリンク

2016年1月22日 ruby-postgres-0.7.1のインストール

cd 作業ディレクトリ
mkdir Ruby-modules
cd Ruby-modules

wget http://ftp.stu.edu.tw/pub/BSD/NetBSD/pkgsrc/distfiles/ruby/ruby-postgres-0.7.1.tar.gz
tar xzvf ruby-postgres-0.7.1.tar.gz
cd ruby-postgres-0.7.1
ruby extconf.rb --with-pgsql-dir=/usr/local/pgsql

と、ここでエラー。
extconf.rb:1:in `<main>': uninitialized constant VERSION (NameError)

1行目を見ると・・・
if VERSION < "1.3"
print "This library is for ruby-1.3 or higher.\n"
exit 1
end

だよね。VERSIONなんてどこにも定義してないのに、なぜ1行目にいきなり出てくるんだ??それともRubyの昔のバージョンならVERSIONっていう予約語が使えたのかなぁ・・・。

検索したところ、DBIのサポートはRuby1.8まで。2.3はサポートされてない。
ここを参考にしました。
http://qiita.com/weal/items/2c28f12a23c501db37f2

じゃあgemでインストールしてみるが、

gem install pg
/usr/bin/ruby: symbol lookup error: /usr/lib/ruby/2.3.0/x86_64-linux/openssl.so: undefined symbol: SSL_CTX_clear_options

どうも、このサーバーに入ってるopensslのバージョンが合わないようだな。要するに、PHPにしろapacheにしろPostgreSQLにしろ、そのOSができた頃に作られたバージョンを入れないと、ライブラリとバージョンの依存性の関係でエラーになってしまうわけで・・・。

たとえばRedHat7を使ってた頃はもっぱらPostgres6シリーズを使ってたし、RedHat9からはPostgres7に、PHP4、apache1.xxシリーズを使っていた。これが、RedHat9にPostgres8やPHP5シリーズを入れようとしても依存性の関係でうまくいかなかったりした。でも、Linuxではよくある話さ。

今使ってるサーバーはCentOS4だけど、さすがにもう古いよなぁ。なにせこのサーバー立てたの8年前だし。Rubyのバージョンを最新にするためだけにOSごと入れ替えるわけにもいかんし・・・。

仕方がないのでrubyのバージョンを下げる。CentOSのバージョンが上がれば最新版も使えたんでしょうけど、残念。

wget --no-check-certificate https://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7.tar.gz
tar xvzf ruby-1.8.7.tar.gz
cd ruby-1.8.7
./configure --prefix=/usr
make
make install

cd 作業ディレクトリ
mkdir Ruby-modules
cd Ruby-modules

wget http://ftp.stu.edu.tw/pub/BSD/NetBSD/pkgsrc/distfiles/ruby/ruby-postgres-0.7.1.tar.gz
tar xzvf ruby-postgres-0.7.1.tar.gz
cd ruby-postgres-0.7.1
ruby extconf.rb --with-pgsql-dir=/usr/local/pgsql
make
make install
cd ..

wget http://ftp.stu.edu.tw/pub/BSD/NetBSD/pkgsrc/distfiles/ruby/ruby-dbi-all-0.0.21.tar.gz
tar xzvf ruby-dbi-all-0.0.21.tar.gz
mv ruby-dbi-all ruby-dbi-all-0.0.21
cd ruby-dbi-all-0.0.21
ruby setup.rb config --with=dbi,dbd_pg
ruby setup.rb setup
ruby setup.rb install

今度はすんなり入った。やっぱ、今使ってるサーバーのバージョンと、Rubyのバージョン2は合わないようだ。Rubyのバージョン2を入れるためには、もっとCentOSのバージョンを上げねばなるまい。

というわけで、今回はここまで。

ここを参考にしました。
http://www.nslabs.jp/dbi-install.rhtml
http://bitarts.jp/tech/linux/ruby182_dbi.html


 △先頭へ  コメント(0)  トラックバック(0)  拍手(0)

2016年1月21日 Rubyのインストール

このホームページの入ってるサーバーにRubyをインストールしてみる。
-------------------------------------
cd 作業ディレクトリ
wget --no-check-certificate https://ftp.ruby-lang.org/pub/ruby/ruby-2.3.0.tar.gz
tar xvzf ruby-2.3.0.tar.gz
cd ruby-2.3.0
./configure --prefix=/usr
make
make install
-------------------------------------
ここで、本当に「cd 作業ディレクトリ」とやってしまい、「エラーが出るじゃねーか」という苦情は受け付けません。

ためしにhelloという文字列を表示させてみる。
-------------------------------------
#!/usr/bin/ruby

print "hello\n"
-------------------------------------
-bash: ./test.rb: /usr/bin/ruby^M: bad interpreter: そのようなファイルやディレクトリはありません

えーなんでなんで??そういや、Perlでも散々出たな、そのエラー。

というわけで、改行コードを\nのみにしてもう一度。今度はhelloと表示された。じゃあ今度は日本語の表示を。
-------------------------------------
#!/usr/bin/ruby

print "テスト\n
-------------------------------------
./test.rb:3: invalid multibyte char (UTF-8)

えー、なんでなんで??と、ここで「たのしいRuby第4版」を確認。Rubyは文字コードを指定しないといけないのか。面倒だな。PHPやPerlはそんなのいらないのに・・・。(もっとも、PHPでは内部エンコードっていう設定はあるけど)

-------------------------------------
#!/usr/bin/ruby
# encoding: euc-jp

print "テスト\n"
-------------------------------------
./test.rb
テスト

今度はうまくいった。こんだけできれば、あとはPHPやPerlと対して変わらんだろうから、違う部分だけを随時調べればいいや。

ここを参考にしました。
https://www.ruby-lang.org/ja/documentation/installation/


 △先頭へ  コメント(0)  トラックバック(0)  拍手(0)

2016年1月8日 ツイッターAPIからトレンドワードを取得

「あなたもウィスパー」というスクリプトを作ろうと思ったのだが、妖怪の名前をどうやって作れば良いか。

乱数ひらがなかカタカナを組み合わせてみたが、どうもイマイチ意味のある名前にならない。もっと、意味のある単語を組み合わせないと。

「あなたもケロちゃん」は英単語を全部登録すればいいのだが、日本語の単語を全部登録するのでは、いくらなんでも面倒すぎる。そもそもデーターベースがパンクしてしまう。

じゃあ、ツイッターのトレンドワードをcrontabで取得して、それを乱数で表示させて妖怪の名前にしちゃえばいいや、と思った。

しかし、crontabで動かすためにはPHPじゃなくてPerlで作らねばならん。Perlでどうやってツイッターから読みこめばいいのか。

ああ、そういや、自分のサーバーにNet::Twitter::Liteというモジュールを入れたっけな。これでトレンドワードを取得する関数を呼び出せばいいや。

ところが、やってみたら、410 Goneと表示されてレスポンスが帰ってこない。えーなんでなんで??

色々調べた結果、Net::Twitter::LiteはAPI1.0を呼び出すのと、API1.0はもう使えないという事らしい。さらに調べたら、API1.1対応版があるというので、さっそくCPANからダウンロードした。

http://search.cpan.org/~mmims/Net-Twitter-Lite-0.12000/

ここからNet-Twitter-Lite-0.12006をダウンロードしてみた。・・・が、同じだ。まったく同じ410 Goneだ。えー、なんでなんで??

色々調べたところ、
http://qiita.com/nmkwnryk/items/e20ffb299ac55d7bd3d2
の情報によると、

use Net::Twitter::Lite::WithAPIv1_1;

と宣言しないとAPI1.1を使う事にならないようだ。じゃあ、それでやってみよう。

・・・ところが、trends_place(id)というメゾットを呼びだそうとしても、そんなメゾットはないとPerlに怒られてしまう。

/usr/lib/perl5/5.8.8/Net/Twitter/Lite/API/V1_1.pm
を調べたところ、確かにそんなメゾット定義されてない。マニュアルにあるのに・・・。っていうか、多分CPANのマニュアルは、1.0のをそのままコピペして使いまわしてるだけだろう。

しかし、おかしいな。V1.1でもtrand_placeというAPIはあるはず。
http://dx.24-7.co.jp/twitterapi1-1-rest-api/
の情報によると、GET trends/place っていうAPIがあるはずなんだけど、なんでないんだろう??まあ、おそらく Net-Twitter-Lite-0.12006のバグで、しかも今の今まで誰もその機能を使ってないから、誰も指摘してないんでしょうけど・・・・。

じゃあ、しょうがない。ないものは自分で作るしかなかろう。というわけで、
/usr/lib/perl5/5.8.8/Net/Twitter/Lite/API/V1_1.pm
の、1071行目あたりに追加しましたよ。

https://dev.twitter.com/rest/reference/get/trends/place
を参考に、

[ 'trends_location', {
aliases => [ qw// ],
path => 'trends/place',
method => 'GET',
params => [ qw/id/ ],
required => [ qw/id/ ],
add_source => 0,
deprecated => 0,
authenticate => 1,
booleans => [ qw// ],
base_url_method => 'apiurl',
} ],

authenticateを1に設定しているのは、このAPIがRequires authentication?
Yesになっているためです。pathとかは他の行を参考にしました。

あと、地域コードは従来はwoeidとなっていた部分が、API1.1からはidとなっているので、ここもそれに合わせてidに変更してあります。

でもって、それがわかるまで何度も何度も試行錯誤を繰り返してようやくPerlでトレンドを取得する部分ができました。

わかってしまえばどうって事はない。Perl側で

$woeid=23424856;
$res=$twitter->trends_location({id => $woeid});
$trend_list = $res->[0]->{'trends'};

として、$trend_listをforeachでループさせて{'query'}というハッシュを取得すればOK。Googleで検索して誰かが作ったのをコピペしようと思ったんだけど、いまのところPerlでそれをやってる人がいないようなので、仕方なく自分で書いた。

誰かが最初に自分で作ってソースを公開すると、それがコピペされてうわーっと広まってしまうので、適当に10分ぐらいで作ったのを公開すると、あんまりよろしくないものまで広まってしまうから注意が必要だ。

たとえばURLエンコードする場合に、
http://mikeneko.creator.club.ne.jp/~lab/perl/numerical_transform/
> pack("H2") を使えば一撃で変換できるのに、
> 見るからに遅そうな hex() + pack() がよく使われているのはなぜでしょう?

とあるが、そういう自分もずっとhex() + pack()でやってたからな。その理由がCGI入門書に載ってるのをそのままコピペして使いまわしてたから、という。

で、しかも、Perlの勉強の時に作ったやつをそのままコピペして使いまわしていたんで、仕事上で作るプログラムでPerlでURLエンコードする際もずっとそれを使ってたという。結局、それで動いちゃうともうそれ以上詮索しないからね。それなんで、あまりよろしくないロジックでも、最初に誰かが作ったやつが広まってしまうという。

そういや、最初にこのサイトでソケットのプログラムのサンプルを公開した時も、10分ぐらいで適当に作ったやつが検索するとかなり広まってしまって非常に恥ずかしい思いをした。

そんなわけで、トレンドワードを取得する部分はもうちょっと練ってから公開する事にしよう。


 △先頭へ  コメント(0)  トラックバック(0)  拍手(0)

2016年1月5日 PHPからツイッターに送信

ツイッターを見ていると、診断メーカーとかアプリメーカーとかで、サーバーから自動的にツイッターに送信するサイトがあるようで、じゃあ自分もそういうのを作ろうと思った。

検索すると、ツイッターは API1.1ってのがあって、このAPIを通す事で、スクリプトからツイートを取得したり、送信したりできるみたいだ。

で、API1.1の使い方を調べたが、

https://dev.twitter.com/rest/public

ううむ・・・マニュアルが英語だ。全然読めん・・・。困ったな。いや、全く読めないというわけではないが、英語はあまり得意ではないのでな。

Linuxのサーバー管理の仕事やってると、apacheにしろPostgreSQLにしろ説明書が英語だから困ったのだが、検索すると大抵は日本人が説明してくれるサイトがあるので助かる。というより、そういう人がいなければ、コンピューター関係の学校も何も出てない自分が独学でサーバー管理の仕事なんかやれなかっただろう。

英語を読むのはあきらめて、日本人が説明してくれているサイトはないものかと調べたら、ありましたよ。

http://qiita.com/sofpyon/items/982fe3a9ccebd8702867

いや、これは助かります。英語のサイトだけだったらあきらめてる所でした。

これによると、

https://twitteroauth.com/

というところで、PHP向けのライブラリが公開されているので、さっそく使ってみる。

そしたら、なんと、Parse error: syntax error連発。なんだよ、これ、使えねーな((C)乾巧)・・・と思ったけど、何がエラーなのかと思って調べたら、 [] と書いてある所が全部エラーだ。

しかし、世の中便利なもので、「TwitterOAuth Parse error: syntax error」で検索したら、原因判明。配列を初期化するのに、従来なら array() と書いたのが、今のPHPのバージョンだと [] と書けるそうで。

じゃあPHPのバージョンを上げればいいんじゃね?というかもしれんが、自分の作ったPHPプログラムは、

register_global = on
magic_quotes_sybase = on

を前提として作ってあって、バージョンをあげるとそこら辺を全部直さないといけないわけですよ。いや、全部直せばいいんだけど、けっこうな量だからなぁ。

だいたい、PHPにしろPostgreSQLにしろ、互換性のない変更が多すぎるんだよね。PostgreSQLだと、大きい変更といえば、INT型に空文字列(')を入れるとNULLとみなされるのを廃止、¥マークをエスケープ文字として使えるようにするのを廃止、オブジェクトIDの廃止、PHPだと、register_global 、magic_quotes_sybase の廃止、short_open_tagは常にオン、などなど。

せめてオプションで互換性を保てるようにしてくれればいいのに。自分のサーバーだからまだいいけど、これが仕事だと会社のいままでの資産全部直すなんてわけにもいかんからな。今実際に稼働してるサーバーで、PHPのバージョンを上げるので今使ってるプログラム全部使えませんってわけにもいかんし。

いずれも今の仕様の方が正しい仕様なんだけど、だったら最初からそうしろと。

って事で、[]と書いてある部分を都度、array()に書き直す。これがけっこうな量で大変。かといって、自分でAPI 1.1の英語のマニュアル読んで自分でAPIとやりとりする部分を作るのも面倒だしなぁ。

エラーになる部分を全部古い書き方に直して、とりあえず検索でヒットしたサイトにサンプルをコピペして動かしてみる。

・・・動いた。動いてしまった。え?動いちゃいけないのかって??だって、どうせ仕事してないんだから、1年がかりだろうが2年がかりだろうが、長い時間をかけてじっくりやるつもりだったのに、ほんの数時間で動いちゃうとは思わなかったじゃない。

そりゃ、自分でAPI 1.1の英語のマニュアル読んで自分でツイッターに書き込む関数まで作れば1年がかりになるんでしょうけど、せっかくネットでもうツイッターに書き込む関数が公開されてるのに使わない手はないでしょう。


 △先頭へ  コメント(0)  トラックバック(0)  拍手(0)

<<前のページ 1 2
スポンサーリンク