Linuxで自宅サーバ構築・管理: KSKNET http://www.ksknet.net/ ja 2010-04-25T21:40:56+09:00 splice - 配列要素の置換・削除 http://www.ksknet.net/cat34/splice_-.html
配列要素arrayのoffset番目の要素からlength分削除する。lengthが省略された場合、offset以降の要素全てを削除。

[サンプル]
my @array = (1,2,3,4,5);
my $deleted_num = splice(@array, 2, 1);
print $deleted_num . "\n";
print @array;

[実行結果]
3
1245
]]>
配列 keisuke 2010-04-25T21:40:56+09:00
配列をランダムに並べ替え http://www.ksknet.net/cat34/post_80.html List::Utilのshuffle関数を使用すればよい。


use List::Util qw(shuffle);
@array = shuffle(@array);

]]>
配列 keisuke 2010-04-24T22:49:00+09:00
配列の個数を参照するには http://www.ksknet.net/cat34/post_12.html 配列の個数を参照するには$#変数名を参照すればよい。(添字の数のため実際の個数は+1した値)

$#array;


もしくはscalar変数に代入を行うことでもわかる。(こちらは実際の個数)

1. $sample_num1 = @array;
2. $sample_num2 = scalar(@$array); #リファレンスの場合

]]>
配列 keisuke 2004-02-08T02:49:46+09:00
screenコマンド http://www.ksknet.net/linux/screen.html [ウィンドウ操作]
c - ウィンドウの作成
A - タイトルの変更
S - ウィンドウの分割
Q - 現在のウィンドウ以外をクローズ


[ copy & paste ]
[ - copyモードへ
] - paste


[その他]
: screenコマンドの入力へ

[.screenrc]
# statuslineの表示
hardstatus alwayslastline "%{= wk} %-w%{=bu dr}%n %t%{-}%+w %= %{=b wb}%y/%m/%d %{=b wb}%c"

参考サイト: screenコマンド一覧

]]>
Linux keisuke 2010-04-24T21:31:23+09:00
stat - ファイル情報の取得 http://www.ksknet.net/cat41/stat_1.html stat関数はファイルの様々な情報を得るための関数です。この関数を使うことでファイルサイズや、ファイル所有者、最終更新時間などを調べることができます。


[対応表]
0 ファイルシステムのデバイス情報
1 Iノード番号
2 ファイルのパーミッション情報
3 ファイルへのハードリンク数
4 ファイル所有者のユーザID
5 ファイル所有者のグループID
6 デバイス識別子
7 ファイルサイズ(バイト)
8 最終アクセス時間
9 最終変更時間
10 最終iノード変更時間
11 最適ブロックサイズ
12 ファイルに割当てられているブロック数


[使用例]
#ファイルサイズを調べる
$file_size = (stat'./power.pl')[7];
print "$file_size\n";


]]>
ファイル操作 keisuke 2005-01-14T11:12:24+09:00
select - ファイルハンドルの設定 http://www.ksknet.net/cat41/select.html select関数は現在設定されているファイルハンドルを調べたり、設定するために使用されます。またsleepのようにプログラムを一時停止する際にも使用される。sleepは1秒単位の指定しかできないが、selectでは整数値以外も指定できるため、より細かいコントロールが可能。


[使用例]
#ファイルハンドルにWRITERを設定する

select WRITER;


#0.1秒プログラムを停止

select(undef, undef, undef, 0.1);


[関連記事]
sleep - プログラムの一時停止

]]>
ファイル操作 keisuke 2006-04-17T17:16:15+09:00
DBIx::Class::Schema::Loader http://www.ksknet.net/dbi/dbixclassschema.html #!/usr/bin/perl package My::Schema; use base qw/DBIx::Class::Schema::Loader/; # constraintで正規表現にマッチするテーブルのみロード # excludeは正規表現にマッチするテーブルを除外 # debugオプションを指定することで自動解析したスキーマをダンプ # その他loader_optionsに指定できるオプションはDBIx::Class::Schema::Loader::Baseを確認のこと __PACKAGE__->loader_options( constraint => qr/point/, debug => 1 ); package Main; use warnings; use strict; my $dsn = 'DBI:Pg:dbname=dbname;host=localhost'; my $user = 'username'; my $password = 'password'; my $attrs = { AutoCommit => 1 }; my $schema = My::Schema->connect($dsn, $user, $password, $attrs); # primary_keyでの検索にはfind()を使用 my $result_set = $schema->resultset('Point')->search( { timestamp => { '<=' => '2008-01-01' } }, { order_by => 'timestamp' } ); while (my $record = $result_set->next ) { print $record->id . "\t" . $record->timestamp . "\n"; } # 検索してそのまま削除 $schema->resultset('Point')->search( { id => { '<=' => '514' } })->delete; __END__ ]]> DBI keisuke 2008-06-02T23:33:47+09:00 ファイルを読み書きモードで開くには http://www.ksknet.net/cat41/post_59.html +> もしくは +< を使えばファイルを読み書きモードで開くことができます。
+> はオープン時にファイルを空にしてくれます。一方 +< ではファイルの内容は保持されたままになります。
例: ファイルの中身はそのままで、読み書きモードにてファイルを開きます。
open(FILE, "+< file.txt");
処理



close(FILE)

]]>
ファイル操作 keisuke 2004-07-08T11:45:27+09:00
ファイルをロックするには - flock http://www.ksknet.net/cat41/_flock.html flockは開いたファイルをロック(保護)するために使用されます。Windowsサーバなど、flockが使用できない環境下では使えません。

[例]
-------------------------------------------------------------------
open(SERIAL, "+< ./serial.txt"); #ファイルを読み書きモードで開く
flock(SERIAL, 2); #書き込み宣言
my ($serial) = <SERIAL>; #値を読み込む
chomp $serial; #改行を取り除く
$serial = $serial+1; #値に1追加する
truncate(SERIAL, 0); #ファイルを空にする
seek(SERIAL, 0, 0); #ファイルの先頭に移動
print SERIAL "$serial"; #新しい値を書き込み
close(SERIAL); #ファイルを閉じる。ロックは自動的に解除されます
-------------------------------------------------------------------

[例: 追記の場合]
-------------------------------------------------------------------
open(LOG, "+< ./log.txt"); #ファイルを読み書きモードで開く
flock(LOG, 2); #ロック
seek(LOG, 0, 2); #ファイルの末尾に移動
print LOG "$log\n"; #ファイルに追記
close(LOG); #ファイルを閉じる
-------------------------------------------------------------------

※補足
以下のように書くのは間違い。ファイルを開いた時点でファイルサイズは0になっているため、ロックする意味はない。

open(SERIAL, "> ./serial.txt");
flock(SEIRAL, 2);

]]>
ファイル操作 keisuke 2004-07-08T12:24:05+09:00
seek関数 - ファイルの途中から読み込み(書き込み)をする http://www.ksknet.net/cat41/seek.html seek関数はファイルポインタをセットするための関数です。主にファイルの途中から読み込みや書き込みを行う際に使用されます。

[書式]
seek(FILEHANDLE, オフセット, 起点);

オフセットは起点からのバイト数です。
起点は以下のように 0, 1, 2 の数字で指定します。
0 ・・・ ファイルの先頭
1 ・・・ 現在のファイルポインタ
2 ・・・ ファイルの末尾

[使用例]
seek(FILEHANDLE, 0, 0); #ファイルの先頭に移動します
seek(FILEHANDLE, 0, 2); #ファイルの末尾に移動します

]]>
ファイル操作 keisuke 2004-07-08T16:06:26+09:00
DirHandle - ディレクトリのファイル一覧を取得 http://www.ksknet.net/cat41/dirhandle.html
[例 dirhandle.pl]
#!/usr/bin/perl

use DirHandle;

#カレントディレクトリ内のファイルを表示
my $dir = new DirHandle '.';
print "$name\n" while ($name = $dir->read);
$dir->close;


[出力例]
[root@server temp]# ./dirhandle.pl
.
..
package.pl
dirhandle.pl
]]>
ファイル操作 keisuke 2004-08-18T18:08:46+09:00
ファイルをコピーするには - File::Copy http://www.ksknet.net/cat41/_filecopy.html ファイルのコピーや移動にはFile::Copy モジュールを使用します。

use File::Copy;
copy("コピー元のファイル名", "コピー先のファイル名");
move("移動元", "移動先");

]]>
ファイル操作 keisuke 2004-07-09T11:58:28+09:00
XML::RSS::Parser http://www.ksknet.net/perl/xmlrssparser.html
#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use Encode;
binmode STDOUT, ':utf8';

use XML::RSS::Parser;
use LWP::UserAgent;
use HTTP::Request::Common;
use Date::Manip;
use Data::Dumper;

my $uri = 'http://b.hatena.ne.jp/hotentry/it.rss';
my $ua = new LWP::UserAgent;
my $request = GET($uri);
my $response = $ua->request($request);

my $parser = XML::RSS::Parser->new;
my $feed = $parser->parse_string($response->content);

foreach ( $feed->query('item') ) {
    my $title = $_->query('title')->text_content;
    my $description = $_->query('description')->text_content;
    my $timestamp = $_->query('dc:date')->text_content;
    my $link = $_->query('link')->text_content;
    print "$title ($link)\n\n $description \n\n ($timestamp)\n\n";
}
]]>
Perl keisuke 2009-10-10T13:59:54+09:00
perlの特殊変数一覧 http://www.ksknet.net/perl/perl_10.html perlにて使用される特殊変数の一覧。

$0 スクリプトのコマンド名
$! エラー番号、もしくはエラー文字列
$? 外部コマンドなどを実行した際の最後のステータス値
$@ 直前のevalで発声した例外メッセージ
$n パターンマッチ時にn番目の()にマッチした文字列
$| 出力のバッファリング、0以外でバッファリングが無効になる
$. ファイルハンドルの現在ある位置の行数
$/ 入力時の区切り文字。デフォルトは改行文字。
$, print使用時のセパレーター
$" print "@list_context"とした際の区切り文字
$$ プロセスのpid
@ARGV スクリプトに渡された引数
$^D デバッグフラグの値
$^E OS特有のエラーメッセージ
$^T スクリプト実行時刻(epoch time)
%ENV 環境変数
%INC インクルードされたライブラリなどを記録
%SIG シグナルハンドラを設定するためのハッシュ
@INC ライブラリの検索対象ディレクトリ


$0の使用例

[例: test.pl]
#!/usr/bin/perl

print "$0\n";

[実行結果]
[testuser@server testuser]$ ./test.pl
./test.pl
[testuser@server testuser]$ /home/testuser/test.pl
/home/testuser/test.pl

[例 argv.pl]
#!/usr/bin/perl

print @ARGV";

[実行結果]
[testuser@server testuser]$ ./argv.pl a b c d e
a b c d e

]]>
Perl keisuke 2009-09-27T18:23:45+09:00
vim - 文字列置換 http://www.ksknet.net/vi/post_42.html viでの置換は:sコマンドを使用します。


:%s/置換前の文字列/置換後の文字列/g で開いているファイル全てにおいて置換をします。置換をするかどうかを確認したい場合は以下のようにcをつけます。


:%s/置換前文字列/置換後文字列/gc


パス名などを変更する際には/を区切り文字に使うのではなく、;などを区切り文字に使うと便利


%s;/var/home;/home;gc


文章全体でなく、特定範囲のみ置換したい場合は置換したい行の範囲を指定すればよい。


[例] - 63行目から79行目まででbeautyをhairnailに一括置換

:63,79s /beauty/hairnail/g


マッチングを利用した置換は正規表現を使います。


[例]

:s /$\(.*\)/$form->{'\1'}/g


マッチした部分\(.*\)は\1に入るので、例えば$certCompanyEngは$form->{'CertCompanyEng'}に置換されます。


改行コードを挿入するにはCtrl+vと押した後にEnterを押せばよい。以下の例ではスペースを改行に置換。


%s/ /^M/g;


複数ファイルを一括で置換する場合はargsコマンドで対象となるファイルを選び、argsdoコマンドで置換する。以下カレントディレクトリ以下にあるcファイルを対象にmy_fooをMy_Fooに置換。(置換対象ファイルはargaddした後にbuffers!で確認可能)


argadd **/*.c
:argdo %s/\/My_Foo/ge | update

]]>
vim keisuke 2004-05-31T12:13:16+09:00
vimのFile Explorer http://www.ksknet.net/vi/vimfile_explore.html vim内でディレクトリ間を移動したり、ファイルを開くには:Expと打ち込みます。(vimの標準プラグインであるnetrwの機能の一つ)
ディレクトリ上にカーソルを置きEnterを押すとディレクトリに移動し、ファイル上でEnterを押すとファイルを開きます。
以下主なオプション。


o ファイル及びディレクトリを別画面で開く
i ファイルサイズやタイムスタンプなどの詳細を表示
d ディレクトリを作成
x 指定したアプリケーションでファイルを開く
]]>
vim keisuke 2009-09-27T13:29:55+09:00
vim - マクロ http://www.ksknet.net/vi/vim_-.html マクロとは一連の操作をを記録し、再度その操作を行う機能です。以下使い方。


1. qaにて記録を開始
2. 任意の操作
3. qにて記録を終了
4. @aにて記録したマクロを実行。10回繰り返す場合には10@a


※ aの文字は任意。a-zまで記録可能。(レジスタ)
※ aではなくAとした場合、既存のマクロに処理を追加する。

]]>
vim keisuke 2009-09-27T13:13:05+09:00
viエディターでの画面分割 http://www.ksknet.net/vi/vi_2.html viでは画面を分割して表示することができます。vi起動中に:splitもしくは:spとすることで画面を上下に分割できます。またすでに開いているファイルの画面を分割するだけでなく、複数ファイルを分割して開くことも可能です。その場合には:spのあとにファイル名を続けて入力します。また画面を上下に分割するのではなく、左右に分割することもできます。画面を縦に分割するには:vsplitコマンドを使用します。


[書式]
:sp 画面を上下に分割
:sp ファイル名 指定したファイルを分割した画面に表示
Ctrl-w p 画面間の移動
Ctrl-w k 上の画面に移動
Ctrl-w j 下の画面に移動
Ctrl-w l 右の画面に移動
Ctrl-w h 左の画面に移動

Ctrl-w K 現在の画面を上に移動
Ctrl-w J 現在の画面を下に移動
Ctrl-w L 現在の画面を右に移動
Ctrl-w H 現在の画面を左に移動

Ctrl-w 10+ カーソルのある画面を10行分大きくする
Ctrl-w 10- カーソルのある画面を10行分小さくする
Ctrl-w = 画面のサイズを同じにする

]]>
vim keisuke 2005-07-19T15:40:35+09:00
map http://www.ksknet.net/cat34/map.html
[書式]
map EXPR, LIST
map BLOCK LIST


[例]
#192.168.1.1から192.168.1.16
@host = map("192\.168\.1\.$_", 1..16);


#1から10の三乗
@third_power_of_each = map $_ * $_ * $_, 1..10;


# BLOCK使用例
#!/usr/bin/perl

use Data::Dumper;

@columns = qw/firstname lastname/;
@tokens = qw/Ichirou Jirou Saburou/;
my @result ;

foreach my $column (@columns) {
    push(@result, map { { $column => { '-like' => "%$_%"  } }; } @tokens);
}


print Dumper(@result);

#BLOCK出力結果
$VAR1 = {
          'firstname' => {
                           '-like' => '%Ichirou%'
                         }
        };
$VAR2 = {
          'firstname' => {
                           '-like' => '%Jirou%'
                         }
        };
$VAR3 = {
          'firstname' => {
                           '-like' => '%Saburou%'
                         }
        };
$VAR4 = {
          'lastname' => {
                          '-like' => '%Ichirou%'
                        }
        };
$VAR5 = {
          'lastname' => {
                          '-like' => '%Jirou%'
                        }
        };
$VAR6 = {
          'lastname' => {
                          '-like' => '%Saburou%'
                        }
        };
]]>
配列 keisuke 2005-07-19T10:57:15+09:00
smbmount - ファイル共有 http://www.ksknet.net/linuxrz/smbmount_window.html smbmountはサーバとのファイル共有に使用されます。主にLinuxとWindows間のファイル共有に使用されますが、Linux同士での使用も可能です。


[書式例]
smbmount //リモートサーバ名/ディレクトリ マウント先 -o username=ユーザ名, password=パスワード, codepage=cp932, iocharset=ホスト側文字コード


[その他主なオプション]
fmask - マウント時のファイルのパーミッション
dmask - マウント時のディレクトリのパーミッション
uid - マウント時のユーザID
gid - マウント時のグループID
password - 接続先のパスワード


[使用例]

smbmount //example.com/backup /mnt/smb -o username=testuser,codepage=cp932,iocharset=utf8,uid=localuser,gid=localuser


#毎回マウントするのが面倒な場合、以下のようにfstabに記述しておけばよい。


//example.com/backup /mnt/smb smbfs username=testuser,codepage=cp932, iocharset=utf8,uid=localuser,gid=localuser 0 0


どうしても文字化けが発生する場合にはfs tyeにsmbfsではなくcifsを指定してみてください。smbfsの文字コード変換はカーネルが行います。一方smbclientでは文字コード変換を行うのはsambaになります。(2006/05/12 追記) 


CentOS 5よりsmbmountはなくなったため、cifsにてマウントすればよい。

mount -t cifs -o user=******,password=****** //example.com/backup /mnt/backup
]]>
Linuxコマンド(R〜Z) keisuke 2005-09-21T10:48:38+09:00