Thursday, December 29, 2011

ツイッターボット 電力使用量編

何度何度も言います。Perlなんて書けませんからw
イロイロパクってなんとか動いただけです。
キット余計なモンとか入ってますよw

で。
YahooのAPIでxmlデータとってくるようになってます。
チェックした時刻の10分ぐらい前のデータが最新っぽいので、
最終更新時間は引き算してだしてます。

電力使用率84%以上で投稿を始めます。
95%以上で 電気消そう 的コメントに変更。

そんな感じです。

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
binmode STDIN,  ":utf8";
binmode STDOUT, ":utf8";
use Net::Twitter;
use XML::Simple;
use Jcode;
use LWP::Simple;
use POSIX qw(ceil);
use Time::Local;

# Twitter OAuth key and token
my $consumer_key = 'my key';
my $consumer_key_secret = 'my key secret';
my $access_token = 'my token';
my $access_token_secret = 'my token secret';

# Twitter OAuth
my $nt = Net::Twitter->new(
  traits          => ['API::REST', 'OAuth'],
  consumer_key    => $consumer_key,
  consumer_secret => $consumer_key_secret,
);
$nt->access_token($access_token);
$nt->access_token_secret($access_token_secret);

# Obtain current power usage from Yahoo!
# renew =1 shortest renew (about 5 min). renew = 0 renew in about an hour.
my $appid = "app_id";
my $renew = "1";
my $url = "http://setsuden.yahooapis.jp/v1/Setsuden/latestPowerUsage?appid=$appid&latest=$renew";
my $data = get($url) or die("error $!");

# extract content from xml data
my ($usage) = $data =~ m{<Usage.*?>(d+)</Usage>};
my ($capacity) = $data =~ m{<Capacity.*?>(d+)</Capacity>};

# calcurate some values
# my $rate = sprintf("%.2g", ($usage / $capacity * 100));
my $rate = ($usage / $capacity * 100);
my $rate2 = sprintf("%2.2f",$rate);
my $usage2 = ceil($usage / 10000);
my $capacity2 = ceil($capacity / 10000);

# get applox. renewed time(about 10 mits before current time)
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
$mon += 1;
$min -= 11;
my $renew_date = sprintf("%04d/%02d/%02d",$year,$mon,$mday);
my $renew_time = sprintf("%02d:%02d",$hour,$min);

# tweet close to Max if the rate is greater than 95% else standard tweet
if ($rate2 >= "84.00" and $rate2 <= "95.00")
{

my $post='【東電 電力使用状況】 実績値なぁーう:'  . $usage2 . '万kW' . ' 最大:' . $capacity2 . '万kW' . ' 使用率:' . $rate2 . '%' . ' 最終更新:' . $renew_date . ' ' . $renew_time . 'ごろ';
my $res = $nt->update($post);

} elsif ($rate2 >= "95.01") {

my $post='【東電 電力使用状況】 ヤバイ ギリギリ!! ちょっと電気消そうよなう:'  . $usage2 . '万kW' . ' 最大:' . $capacity2 . '万kW' . ' 使用率:' . $rate2 . '%' . ' 最終更新:' . $renew_date . ' ' . $renew_time  . 'ごろ';
my $res = $nt->update($post);

} else {

exit;

}

exit;

Monday, December 5, 2011

ツイッターボット お天気編

何度も言います。Perlとか書けませんからw
イロイロパクってなんとか動いただけです。
余計なモンとか入ってる可能性ありですw

で。。。
今日であれば最低気温は表示せず、最高気温表示のみ。
明日 or 明後日であれば最低気温と最高気温を表示。
みたいな感じになってます。

ユーザのcrontabで起動する際に エリアコード と ひにち(today/tomorrow/dayaftertomorrow) を指定します。

例) 横浜の明日の天気

tweet-weather.pl 70 tomorrow >/dev/null 2>&1

例) 東京の今日の天気

tweet-weather.pl 63 today >/dev/null 2>&1

詳細はこちらで:
お天気Webサービス仕様

ごーく マレに文字化けするときがあるのですが、
そもそものデータが地域や時間によって無い場合があるみたいで、
そういうときはウマク動きません。。。データがカラの場合の処理を入れないとダメなんでしょうね。キットw
メンドイのでとりあえずコレで。。。

2011/12/28 追記
といいつつ
カラの場合はついーとしないようにしました。

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
binmode STDIN,  ":utf8";
binmode STDOUT, ":utf8";
use Net::Twitter;
use LWP::UserAgent;
use XML::Simple;
use XML::TreePP;
use Jcode;

# Twitter OAuth key and token
my $consumer_key = 'my key';
my $consumer_key_secret = 'my key secret';
my $access_token = 'my token';
my $access_token_secret = 'my token secret';

# Twitter OAuth
my $nt = Net::Twitter->new(
  traits          => ['API::REST', 'OAuth'],
  consumer_key    => $consumer_key,
  consumer_secret => $consumer_key_secret,
);
$nt->access_token($access_token);
$nt->access_token_secret($access_token_secret);

# URL parameters
my $area = $ARGV[0];
my $day = $ARGV[1];

# Obtain weather from livedoor weather
my $url = "http://weather.livedoor.com/forecast/webservice/rest/v1?city=$area&day=$day";
my $ua = LWP::UserAgent->new();
$ua->agent('Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
$ua->timeout(10);
$ua->env_proxy();
my $res2 = $ua->get($url);
$res2->is_success or die 'Can't connect to weather.livedoor.com.';
my $xml = $res2->content;
my $data = XMLin($xml);

# get area name, weather, and temparatures
my $telop=$data->{telop};
my $title=$data->{title};
my $temp_min = $data->{temperature}->{min}->{celsius};
my $temp_max = $data->{temperature}->{max}->{celsius};

# post to twitter. change parameters depending on day
if ($day eq "today" and $temp_max ne "") {
    my $post='【天気予報】' . $title . ' ' . $telop . ' 最高 ' . $temp_max . '度';
    my $res = $nt->update($post);

} elsif ($day ne "today" and $temp_min ne "" and $temp_max ne "") {
    my $post='【天気予報】' . $title . ' ' . $telop . ' ' . $temp_min . '度/' . $temp_max . '度';
    my $res = $nt->update($post);
} else {
    exit;
}

exit;

ツイッターボット 切り取り線編

もちろんperlなんて書けないので、イロイロなところからパクってきただけですが、
なんとか動きましたww

これは切り取り線のボットですね。
個人的には意外と便利に思います。

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use Net::Twitter;
use Time::Piece ();
use Jcode;

# Twitter OAuth key and token
my $consumer_key = 'my key';
my $consumer_key_secret = 'my key secret';
my $access_token = 'my token';
my $access_token_secret = 'my token secret';

# Twitter OAuth
my $nt = Net::Twitter->new(
  traits          => ['API::REST', 'OAuth'],
  consumer_key    => $consumer_key,
  consumer_secret => $consumer_key_secret,
);
$nt->access_token($access_token);
$nt->access_token_secret($access_token_secret);

my $now = Time::Piece::localtime->strftime('%H:%M');
printf $now;
my $tweet = '<--------------- ' . $now . ' --------------->';
Jcode::convert($tweet, 'utf8');
my $res = $nt->update($tweet);

exit;

Thursday, December 1, 2011

cpan upgrade

cpan コンソールに入ります。

$ sudo perl -MCPAN -e shell

なんかコマンドたたいてたら新バージョンがあるでっていわれました。

  There's a new CPAN.pm version (v1.9800) available!
  [Current version is v1.7602]
  You might want to try
    install Bundle::CPAN
    reload cpan
  without quitting the current session. It should be a seamless upgrade
  while we are running...

なので、言われたコマンドたたいてみましたよ。
upgradeが終わったらリロード。

 cpan> install Bundle::CPAN
 cpan> reload cpan

しばらーーく 時間がかかりましたが特に問題なくupgradeできましたよ。

終了するならquitね。

 cpan> quit

Wednesday, November 30, 2011

ServersManアップデート方法

気がついたらDtiのVPSについてくる Serversman機能が動かなくなってたw
以前はhttpdと絡んで動いてたので、conf類を確認するも動作がオカシイ。

そもそも利用していなかったからドーでもよかったのだがw
でもちょっと調べたらどうやらVer Upがあったらしい。
手動でUpgradeしないとアカンらしいので手順を。。。

まずServersmanの現Ver確認:

# rpm -qi serversman

ウチのは 1.0-004 とかでした。古いのでupgradeします。

最新は1.0 006なのでダウンロードします:
(MD5 : 6f5bbe6f8efcb772e7fac428c5d9a59f)

# wget http://vpsrepo.ub-freebit.net/serversman/serversman-1.0-006.i386.rpm

# md5sum serversman-1.0-006.i386.rpm

普通にUpgradeコマンドたたきます。

# rpm -Uvh serversman-1.0-006.i386.rpm

続いて Serversman Admin Toolのverを確認します。

# rpm -qi smadmin

ウチのは1.0のナンチャラってのが入ってました。
古いのでUpgradeします。

pkgをダウンロードします:
(MD5 : 7adafb272b77902d4b3f73fc4162cdf2)

# wget http://vpsrepo.ub-freebit.net/smadmin/smadmin-2.0-001.i386.rpm

# md5sum smadmin-2.0-001.i386.rpm

で、まずpkgを消してからインスコします。
インスコしたら起動します。
起動したら起動してるか確認します。
※ ver2.0 にはUpgradeできないよ(エラる)

# rpm -e smadmin

# rpm -ivh smadmin-2.0-001.i386.rpm

# /etc/init.d/smadmd start

# ps ax | grep smadmin

バージョンアップ後は、
ServersMan Admin Toolの利用ポート番号が “9510” になるので、
iptablesに追記します。

まずiptablesのdefault起動を止める。 (間違ったとき対策)

# chkconfig iptables off

で、下記を iptables.txt として編集保存:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-N MYCHAIN
-A MYCHAIN -m state --state ESTABLISHED,RELATED -j ACCEPT
-A MYCHAIN -p icmp -j ACCEPT
-A MYCHAIN -s 127.0.0.0/8 -d 127.0.0.0/8 -j ACCEPT
-A MYCHAIN -m state --state NEW -m tcp -p tcp --dport 22  -j ACCEPT
-A MYCHAIN -m state --state NEW -m tcp -p tcp --dport 25  -j ACCEPT
-A MYCHAIN -m state --state NEW -m tcp -p tcp --dport 80  -j ACCEPT
-A MYCHAIN -m state --state NEW -m tcp -p tcp --dport 110  -j ACCEPT
-A MYCHAIN -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A MYCHAIN -m state --state NEW -m tcp -p tcp --dport 3843  -j ACCEPT
-A MYCHAIN -m state --state NEW -m tcp -p tcp --dport 9510  -j ACCEPT
-A MYCHAIN -m tcp -p tcp --dport 113 -j REJECT --reject-with tcp-reset
-A MYCHAIN -j DROP
-A INPUT -j MYCHAIN
COMMIT

次にリアル設定ファイルに上書きしてiptables再起動。
Webから動作チェックして問題無ければ default起動もonに変更。

# cp iptables.txt /etc/sysconfig/iptables

# /etc/init.d/iptables stop

# /etc/init.d/iptables start

# chkconfig iptables on

以上

ちなみにココにマヌアルがありました:
ServersManアップデート方法(CentOS 32bit、64bit版)