■HDD増設 [09:53]

SATA用のL型コネクタが余っていたので、それを使って増設しました。
増設HDDの拡張パーティション(と論理ドライブ)を作成した後にフォーマットして終了。
Cドライブ(SATAII 320GB)と、増設したHDDのDドライブ(SATA 300GB)を合わせて620GBです。
# Windowsの管理ツールから確認すると実際は580GB程度

誕生日から三日経ちました。
快速かきこの掲示板を持ってるんですけど、
少し放置しておくだけですぐにスパムだらけになってしまい、
しかも管理設定からスレッドの一括削除とかできないから、
削除スクリプト書きました(すごい手抜きだけど)。
use strict;
use warnings;
use IO::Socket;
my $uri = ""; # BBSのURL
my $passwd = ""; # BBSパスワード
my @no = qw( 2 5 7 11 ); # 削除したいスレッドのスレッド番号
my( $host, $genre, $str, $user ) = ( split( '/', $uri ) )[2..5];
my $iaddr = inet_aton( $host );
my $saddr = pack_sockaddr_in( 80, $iaddr );
my $post = new IO::Socket;
my @query = ();
my %query = (
op => 'pagego',
id => $user,
pw => $passwd,
sv => $genre
);
while( my( $key, $value ) = each( %query ) ){
push( @query, "$key=$value" );
}
foreach my $no ( @no ){
my $query = join( '&', @query, "wc=$no" );
my $length = length( $query );
unless( $post->socket( 2, 1, 0 ) ){
next;
}
unless( $post->connect( $saddr ) ){
next;
}
$post->send( "POST http://$host/command/i-remove.cgi HTTP/1.0\n" );
$post->send( "Referer: $uri/$no.html\n" );
$post->send( "Content-Length: $length\n\n" . $query );
$post->flush();
$post->recv( my $buffer, 9216 );
$post->close();
if( $buffer =~ /passww/i ){
die( "Error: $passwd\n" );
}else{
printf( "deleted %d\n", $no );
}
}
use strict;
use warnings;
use IO::File;
my $filename = 'hogehoge.txt';
my $io = new IO::File;
$io->open( $filename, 'r+' ) or die( $! );
$io->lock::on( 2 ); # OK
$io->lock_on( 2 ); # NG
...
$io->close();
sub lock::on(){
my $this = shift;
flock( $this, $_[0] );
}
sub lock_on(){
my $this = shift;
flock( $this, $_[0] );
}
上記のコードのlock::on()みたいに::(ダブルコロン?)を付けた関数なら、
第1引数にオブジェクトリファレンスを渡せて無事にメソッドとして呼び出せるのですけど、
lock_on()だとダメなんですね。
ちなみに、関数の呼び出しのときにlock::on()をlock->on()としても通用するみたいです。
意味が分からないけど、OOPに深く関係しているような気がしてきました。
うーん、どうも俺は寝ぼけているようです。
要するにOOPを全く理解できてないって話なんですね。
でも、ぼくがんばる!!
use strict;
use warnings;
use Net::Ping;
my @host = ( "192.168.0.1", "localhost" );
my $this = new Net::Ping( "icmp" );
foreach my $host ( @host ){
if( $this->ping( $host, 2 ) ){
print "$host : OK!\n";
}else{
print "$host : NO!\n";
}
}
$this->close();
thebbs【ザ掲示板】
PC君からだとthebbsにアクセスできないけど、
携帯君からだと普通にアクセスできるんです。
俺だけ?(ちなみに、うちのISPはplalaです)
telnetクライアントからthebbs.jp:80に接続してもダメで、
コンソールを起動してthebbs.jpにpingを送信したらこんな感じ。
C:\>ping thebbs.jp
Pinging thebbs.jp [61.194.74.83] with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Ping statistics for 61.194.74.83:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
見事にタイムアウト連発。
http://bbs.kakuri.jp/server.php を見たらサーバは正常みたいです。
やっぱり俺んとこが異常なんかな。
それと、
Perlのgethostbyaddr()で127.0.0.1をホスト名に変換しようとしたら、
localhostじゃなくてnull-xxxxxxみたいな文字列に変換されちゃうんですけど、
もしかしてうちのネットワーク環境がバグってる?
2週間ぐらい前までは普通にlocalhostに変換できたのに。
ルータ再起動しまくっても直んないし、意味分かんない。(´;д;`)
既存のtelnetによるIPアドレス取得スクリプトを参考にして書いてみました。
# setSock()関数内でソケットの作成〜accept()の実行やらをやってます。
# IO::Socket::INET()すれば、socket()〜listen()は必要ないんだけど。
インラインフレームからsetSock()とtelnetクライアントを同時にコールしてIPアドレス取得。
telnet以外のプロトコルを指定してもOKっぽい。
とにかく簡単に書いてあるので、タイムアウト処理はやってないです。
ローカルサーバでは動きます!!!11
#!perl
use strict;
use warnings;
use IO::Socket;
use IO::File;
our $port = 9000;
# $ENV{QUERY_STRING} =~ /\W/ and exit();
$ENV{QUERY_STRING} eq 'sock' ? setSock() : iframePage();
sub setSock()
{
my $sock = new IO::Socket;
my $client, my $paddr;
$sock->socket( PF_INET, SOCK_STREAM, 0 );
$sock->setsockopt( SOL_SOCKET, SO_REUSEADDR, 1 );
$sock->bind( pack_sockaddr_in( $port, INADDR_ANY ) );
$sock->listen( SOMAXCONN );
$client = $sock->accept();
$paddr = $client->peername();
$client->close();
viewLog( $paddr );
}
sub viewLog()
{
my $paddr = shift @_;
my $iaddr = [unpack_sockaddr_in( $paddr )]->[1];
my $host = gethostbyaddr( $iaddr, 2 );
my $addr = inet_ntoa( $iaddr );
my $out = new IO::File;
$out->open( 'iplog.txt', 'w' );
$out->write( "$host : $addr\n" );
$out->close();
print "Content-Type: text/html\n\n";
print "$addr : $host\n";
}
sub iframePage()
{
print qq{Content-Type: text/html\n\n};
print qq{<iframe src="$ENV{SCRIPT_NAME}?sock"></frameset>\n};
print qq{<iframe src="telnet://$ENV{HTTP_HOST}:$port"></frameset>\n};
}
use strict;
use warnings;
use IO::Socket;
main();
sub main()
{
my $port = 9000;
my $cw = new IO::Socket;
# my $cw = new IO::Socket::INET(
# LocalPort => $port, Listen => 1, Reuse => 1 );
$cw->socket( PF_INET, SOCK_STREAM, 0 );
$cw->setsockopt( SOL_SOCKET, SO_REUSEADDR, 1 );
$cw->bind( pack_sockaddr_in( $port, INADDR_ANY ) );
$cw->listen( SOMAXCONN );
client( $cw );
}
sub client()
{
my $cw = shift @_;
while( 1 ){
my $client = $cw->accept();
# メッセージを受け取って返す
while( my $buffer = $client->getline() ){
$client->send( $buffer );
$client->flush();
}
$client->close();
}
}
試しにechoサーバのサンプルコードをちょっと書きました。
telnetクライアントを利用したIPアドレス取得なんてのも
後でやってみたい。
use strict;
use warnings;
use IO::Socket;
my $uri = 'http://localhost/'; # アクセス先
my $proxy = ''; # Proxy
my $port = ''; # ポート
my $count = 5; # アクセス回数
my $inter = 0; # 間隔
my $sock = new IO::Socket;
my $length = 1024 * 5;
my $buffer;
if( $proxy eq undef() ){
$proxy = ( split( '/', $uri ) )[2];
$port = getservbyname( 'http', 'tcp' );
}
foreach my $loop ( 1 .. $count ){
unless( $sock->socket( PF_INET, SOCK_STREAM, 0 ) ){
next;
}
unless( $sock->connect( pack_sockaddr_in(
$port, inet_aton( $proxy ) ) ) ){
next;
}
$sock->send( "GET $uri HTTP/1.0\n\n" );
$sock->flush();
if( $loop == $count ){
$sock->recv( $buffer, $length );
}
$sock->close();
printf( "%d回目\n", $loop );
sleep( $inter );
}
print $buffer;
似非田代砲だけど、Proxyサーバを介するとすごく遅いです。
ループ中にconnect()でサーバホストに接続しつつ、Proxyが使えなかったら飛ばす!
これをもっとすばやく処理できたら理想的なのかな、よく分かんねーや。/(^o^)\
# inet_aton()でホスト名をバイナリコード(IPアドレスの構造体)に
# 変換するらしいけど、これも関係あるかな。
ChiririDukeは他のモジュール使っててすごく早い><
#!perl -w
use strict;
use warnings;
use IO::Socket;
my $sock = new IO::Socket;
unless( $sock->socket( PF_INET, SOCK_STREAM, 0 ) ){
die( "socket()" );
}
...
$sock->close();
socket()のPF_INETとAF_INETっていう定数は同じなんかな。
ソケット関係よくわかんない。他もわかんないことだらけ。/(^o^)\