Tag Archives: Perl - Page 3

Twitter フォロワー同期(リム専用)Bot Perl 解析編

自動でフォローされたらフォローし返すプログラムを書きたいけどNet::Twitterの使い方がわからなかったのでとりあえずフォロワー同期(リム専用)Botのソースをマニュアルを読みながら適当に解析してコメント打ちました。

マニュアル:Net::Twitter(英語)
参考にさせて頂いたソース:■[メモ]Twitterで自動フォロー削除

#!/usr/bin/perl
use utf8;
use strict;
use warnings;

# モジュール使用宣言
use Array::Diff;
use Data::Dumper;
use Net::Twitter;
use YAML::Tiny;
use Encode;
use FindBin;

# 現在のパスから見て設定ファイルを読み込み
my $config = (YAML::Tiny->read($FindBin::Bin . '/config.yml'))->[0];
# OAuth認証
my $twitter = Net::Twitter->new(
     traits => ['API::REST', 'OAuth'],
     consumer_key => $config->{'consumer_key'},
     consumer_secret => $config->{'consumer_secret'}
);
$twitter->access_token($config->{'access_token'});
$twitter->access_token_secret($config->{'access_token_secret'});
# 認証失敗時の処理
die('Auth failed:'.$config->{'username'}) unless ( $twitter->authorized ) ;

# ユーザー名を含むユーザー情報を取得
my $cr = $twitter->verify_credentials;
my $own_id = $cr->{id};

my $nextc = -1; # paging default.
my @following_id_list; # outgo

# APIの仕様?から一度に100人までしか取得できないから0が返ってくるまでdoブロックをループ
do{
	# cursorは前回取得したフォローイングまでの番号が入っている
	my $following_list = $twitter->friends_ids({ id=>$own_id, cursor => $nextc });
	$nextc = $following_list->{next_cursor};
	# 配列からフォローイングのidを取得
	foreach my $id (@{ $following_list->{ids} }){
		push(@following_id_list, $id); # 後で比較するためにフォローイングを配列に保管
	}
}while($nextc!=0);
# 文字昇順でソート
@following_id_list = sort @following_id_list; 

$nextc = -1;
my @followers_id_list; # income
do{
	# cursorは前回取得したフォロワーまでの番号が入っている
	my $followers_list = $twitter->followers_ids({ id=>$own_id, cursor => $nextc });	
	$nextc = $followers_list->{next_cursor};
	# 配列からフォロワーのidを取得
	foreach my $id (@{ $followers_list->{ids} }){
		push(@followers_id_list, $id); # 後で比較するためにフォロワーを配列に保管
	}
}while($nextc!=0);
# 文字昇順でソート
@followers_id_list = sort @followers_id_list; 

# 差分を取得
my $diff = Array::Diff->diff(@following_id_list, @followers_id_list);

# リムった人をリム返し
foreach my $delid (@{ $diff->{deleted} }){
	$twitter->destroy_friend($delid);
}

だいたい構造がわかったのでちゃちゃっと書き足しましょうか^^

Mac OSX 10.6 Perl/Tk インストール

普通にcpanよりtkをインストールしたところmake testに失敗して下記のように止まってしまい困っていたところ解決方法を見つけたのでメモしておく。
SREZIC/Tk-804.029.tar.gz : make_test NO

ソースを書き換える為cpanのディレクトリへ移動する
$ cd /Users/orbit/.cpan/build/Tk-804.029-VTDuvi/
$ vi myConfig
my $ftinc = Ift(“/usr/include”,”/usr/local/include”,“/sw/include”,$X11INC||());

$ vi PNG/Makefile.PL
if (1)
{
Tk::MMutil::TkExtMakefile(
NAME => ‘Tk::PNG’,
VERSION_FROM => ‘PNG.pm’,
XS_VERSION => $Tk::Config::VERSION,
dist => { COMPRESS => ‘gzip -f9’, SUFFIX => ‘.gz’ },
OBJECT => ‘$(O_FILES)’,
INC => ‘-I/sw/include‘,
LIBS => [‘-L/sw/lib -lpng -lz -lm’],
);
}

$ perl Makefile.PL XFT=1
$ make
$ sudo make install

参考元:Mac OS X 10.6でのPerl(5.10)モジュールのインストール

Mac OSX 10.6 Perl 正規表現が動かない バックスラッシュの書き方

MacでPerlを使っていて非常に疑問だったのが何故か正規表現が正しく動作しない問題だったのですがWindowsと違ってMacでは¥マークが実はバックスラッシュと扱いが同じではなく¥を記述しても正常に動作しません。

バックスラッシュを実際に記述したい場合は下記のような入力を行う必要があります。
optionキー(alt) +

まだ試していませんがCやJavaなどの他の言語にも影響があるかもしれません。

超簡易版 フィボナッチ数列 Perl言語

C,Javaときたら普段から慣れ親しんでるPerlを出さない訳にはいかない為書いてみた。
書いて思う事は、やはり素晴らしい言語であるということ。
最も必要最低限で意志を伝えやすい。

#!/usr/bin/perl
# 初期値を設定
$x = "0";
$y = "1";
# 値の入力を求める
$input = <STDIN>;
for($i = $input;$i > 0;$i--){
    $z = $x + $y; # 今の値を出す
    $y = $x;      # 前の値を代入→次のループで2回前の値になる
    $x = $z;      # 今の値を代入→次のループで1回前の値になる
}
print $z;  # 最後の値を表示

百度(ボット)を遮断 スパム?の疑惑

ただページを読みに来たのならいいのですが何を考えてるのかユーザの設置したサイト内検索のCGIで大量に”調べ物”をしていた百度のボットがたくさんおりまして頭に来たので全て遮断しました。

#!/usr/bin/perl
#####################################
# 百度ボット遮断
#####################################
# IPを指定(119.63.198.0/24)
$ip = '119.63.198.';
for ($x=1;$x<=254;$x++){
  $baidu_ip = "$ip"."$x";
  # iptablesでパケットを破棄
  $iptables = `iptables -I INPUT -s $baidu_ip -j DROP`;
}

Perlで進行状況(プログレスバー)をモジュールを使わず作る 4

#!/user/bin/perl
$max = '30';
$len = '50';
@arey = ('|', '/', '-', '\', '');
for ($num = 0;$num<=$max;$num++) {
local $| = 1;
$percent = int(($num/$max)*100);
$print = "["."%-"."$len"."s"."] "."%d%%"."r";
$bar = '*' x int(($percent/100)*$len);
if (int(($percent/100)*$len) < $len) {$bar .= @arey[$percent % 4];}
printf ($print,"$bar","$percent");
sleep(1);
}
print "nSuccess!n";

友人より教えていただいたソースを参考に*がクルクルするプログレスバーを作成しました。
※Time::HiResを使うと良いかもしれません。

Perlで進行状況(プログレスバー)をモジュールを使わず作る 3

#!/user/bin/perl
$max = '30';
$len = '50';
for ($num = 0;$num<=$max;$num++) {
local $| = 1;
$percent = int(($num/$max)*100);
$print = "["."%-"."$len"."s"."] "."%d%%"."r";
$bar = '=' x int(($percent/100)*$len);
if (int(($percent/100)*$len) < $len) {$bar .= '>';}
printf ($print,"$bar","$percent");
sleep (1);
}
print "nSuccess!n";

実際に実行すると下記の様になります。
[root@orbit ~]# perl ber.pl
[=================>                                         ] 26%

Perlで進行状況(プログレスバー)をモジュールを使わず作る 2

#!/user/bin/perl
$max = '30';
$len = '50';
for ($num = 0;$num<=$max;$num++) {
local $| = 1;
$percent = int(($num/$max)*100);
$print = "["."%-"."$len"."s"."] "."%d%%"."r";
$bar = '#' x int(($percent/100)*$len);
printf ($print,"$bar","$percent");
sleep (1);
}
print "nSuccess!n";

実際に動かすと下記のようになります。
[root@orbit ~]# perl ber.pl
[####################                                      ] 30%

Perlで進行状況(プログレスバー)をモジュールを使わず作る

yumやcpanのプログレスバーに何故かすごく憧れをいだいていたのでモジュールが無くても使えるものを準備しました^^

#!/user/bin/perl
$max = '30';
$len = '50';
for ($num = 0;$num<=$max;$num++) {
local $| = 1;
$percent = int(($num/$max)*100);
$print = "%-"."$len"."s"."["."%d%%"."]r";
$bar = '#' x int(($percent/100)*$len);
printf ($print,"$bar","$percent");
sleep (1);
}
print "nSuccess!n";

実際に動かすと下記のような感じになります。(多分イメージ的にyumとかと同じ感じになります)
[root@orbit ~]# perl bar.pl
##################################################################[100%]
Success!
[root@orbit ~]#

mod_ruid suExec suPHP CentOS Apache2

ApacheのCGIやPHPをユーザ権限で動かすにはmod_ruid suExec suPHP等色々ありますが今回mod_ruidを使って行ないたいと思います。
※ディフォルトのsuExecは停止させておく必要があります。

下記のパッケージをインストールする
# yum install httpd-devel
# yum install libcap-devel
ソースをダウンロードしてきてコンパイルする
# wget http://www.sourcefiles.org/Internet/WebServers/Modules/Access_Control/mod_ruid-0.6.tar.gz
# tar xvzf mod_ruid-0.6.tar.gz
# cd mod_ruid-0.6
# apxs -a -i -l cap -c mod_ruid.c

再起動するとmod_ruidが有効になる
# service httpd restart

WordPressでのエラーやphpMyAdminでのエラーの対処
※現在他の方法を模索中…
# chmod 777 /tmp/fs_sessions/ (デフォルトは700)
# chmod 777 /var/lib/php/session (デフォルトは770)

このままではapacheユーザによって作られたcgiやphpが削除できなくなったり色々と問題が発生するため現在のユーザディレクトリ内のファイル所有者を変更しpublic_htmlのパーミッションを700にするスクリプトを書いて自動で書き換える。
(色々面倒で適当に書いてるところはありますが当方が急いで書いた為なのでお気になさらずに…)

#!/usr/bin/perl
$homedir = '/home/';

opendir(DIR,$homedir);
  @list = readdir(DIR);
closedir(DIR);

foreach $udir (@list) {
$userdir = "$homedir$udir";
if(-d $userdir && $udir !~ /.|+/){
print "$userdir : $udirn";
$chown = `chown -R $udir:$udir $userdir/public_html`;
$chmod = `chmod 700 $userdir/public_html`;
  }
}

今後作成されるユーザディレクトリのパーミッションを変える
# chmod 700 /etc/skel/public_html

最後に不正に他のユーザのディレクトリやファイルが閲覧出来ない事を確認する。