perl 参照 覚え書き (perlreftut編)

全部箇条書きです。man perlreftutの要点を書いています。(前回

参照を得る。

参照を得るには\をつければいい
$aref = \@array;
$href = \%hash;
$sref = \$scalar;

[ ITEMS ] は配列への参照を返す。{ ITEMS }はハッシュへの参照を返す。
$aref = [ 1, "foo", undef, 13 ];
$href = { APR => 4, AUG => 8 };


参照を使う。(その1)
$arefを配列の参照とした場合、以下のように使う。@aは普通の配列として比べて書いている。右と左は同じ意味。

@a @{$aref}
reverse @a reverse @{$aref}
$a[3] ${$aref}[3]

そしてこれらはさらに省略して書ける。右と左は同じ。

@{$aref} @$aref
${$aref}[1] $$aref[2]

ハッシュの場合も同じなので省略。要は{$ref}と書けば、参照先を意味する。


参照を使う(その2)
その1のやり方で全部できるが、他の書き方もある。それが以下、右と左は同じ意味。

${$aref}[3] $aref->[3]
${$href}{red} $href->{red}

応用編
1、配列の配列を作る。
@a = ( [1, 2, 3],
[4, 5, 6],
[7, 8, 9]
);

$a[1]->[2]の値は6になる。

さらに実は省略できて、$a[1]->[2]$a[1][2]と書ける。
まとめると以下の3つはすべて同じ。

${$a[1]}[2] $a[1]->[2] $a[1][2]

C言語を知っていれば、参照はポインタみたいに考えればいい。よって以下のように参照をコピーしても参照の中身のコピーしない。

$aref2 = $aref1

コピーが欲しい場合は以下のように書く。

aref2 = [@{$aref1}];

ref関数を使えば、$arefが参照かどうかがわかる。参照の場合はtrueを返す。しかし実際に返す値はハッシュへの参照なら”HASH”、配列への参照なら”ARRAY”という文字列を返す。

参照を文字列として読むと以下のような値になる。

ARRAY(0x80f5dec) または HASH(0x826afc0)

ということは参照の比較は==でやってもeqでやっても成功する。もちろん普通は==を使う。

perl 覚え書き (perlintro編)

全部箇条書きです。man perlintroの要点を書いています。

$_ → デフォルトの値。なんか省略されてたらこれが指定されたことになる。

$#array : 配列の最後のインデクス。しかし@arrayがスカラーとして評価されるときは、配列の要素数になるので配列のよう素数を知りたいときにこれを使う必要はない。

@_ → サブルーチンに渡された引数

配列やハッシュはスカラーしか格納できない。配列の中に配列やハッシュを入れるには、それの参照を入れることになる。参照はスカラー値。 配列やハッシュをスカラー値として読むと、参照になる。

perlの比較演算子は数値用と文字列用で別々のものを使っている。==は数値用、eqは文字列用等。

<FILEHANDLE> → スカラー値として読むと、ファイルから一行よむ、配列として読むと、全部読む。FILEHANDLEを省略するとSTDINになる。

if ( /foo/ ) $_fooが含まれていれば真

if ($a =~ /foo/) $afooが含まれていれば真

s/foo/bar/;$_の中のfoobarに変える。

$a =~ s/foo/bar/;$aの中のfoobarに変える。

$a =~ s/foo/bar/g;$aの中の全てのfoobarに変える。

サブルーチンの書き方

sub log {
my $logmessage = shift;
print LOGFILE $logmessage;
}

サブルーチンへの引数は、@_で受け取る。 shiftで@_を左からもってくる。

my ($logmessage, $priority) = @_;

こういう風に受け取るのが一般的。

returnを使って値を返せる。

autofsを使ってsambaを自動マウント

オートマウントとはアクセスされたときに自動的にマウントするための仕組み。またアクセスがなかったときアンマウントする仕組み。ここではubuntuを使って行った。

まずautofsとsmbclientとが入っていなかったらインストールする。

$ sudo apt-get install autofs smbclient

/etc/auto.masterを編集して、以下の一行を加える

/sambaauto /etc/auto.smb

/sambaautoを作成し、あとあと面倒になったら嫌なのでなのでchmodしておく

$ sudo mkdir /sambaauto
$ sudo chmod 777 /sambaauto

autofsをインストールしたときに/etc/auto.smbが入っているはずなので確認し、chmod 755する。

$ sudo chmod 755 /etc/auto.smb

autofsを起動する。

$ sudo /etc/init.d/autofs start

あとは/sambaauto以下、コンピュータ名/フォルダ名でアクセスすれば、自動でマウントしてアクセスできる。コンピュータ名が駄目な場合はIPアドレスで試してみる。

$ cd /sambaauto/192.168.0.100/Share

用語整理:
automount : 実際にマウントするプログラム
autofs : 2つの意味がある。automountをコントロールするためのフロントエンド、そして設定ファイルの記述方法。

ubtuntu上のeclipseでperlをデバッグしてみる

$ sudo apt-get install eclipse
$ eclipse

eclipse-error.png

いきなりエラーで起動できない。

sunから jdk-1_5_0_15-linux-i586.binをダウンロードしてきて実行

$ sudo chmod 777 jdk-1_5_0_15-linux-i586.bin
$ sudo ./jdk-1_5_0_15-linux-i586.bin

これは解凍するだけのようだ。

https://help.ubuntu.com/community/JavaをみるとIcedTeaを薦めているが、ここでは謹製のsunのjavaを使った。eclipseを起動するときの表示からjavaを探しているパスをみて/usr/lib/j2sdk1.5-sunに移動。

$ sudo mv jdk1.5.0_15/ /usr/lib/j2sdk1.5-sun
$ eclipse

eclipse.png

無事起動できた。

まだperlの開発環境は入っていない。ここではEPICを入れる。メニューのHELP->Software Updates->Find and Installを選択。

screenshot-install-update.png

Search for new Features to installを選択して、nextをクリック。

New Remote Siteをクリックして以下のように入力

screenshot-new-update-site.png

でてきたEPICを選択して、Finishをクリックした後、以下のようにチェックを付ける。

screenshot-updates.png

next

screenshot-update-manager.png

screenshot-verification.png

リスタート

screenshot-new-project.png

New ProjectでPerlが表れる。ここではプロジェクト名をmyfirstperlとして作成。

screenshot-java-eclipse-sdk.png

myfirstperlを右クリックしてnew->fileを選択。ファイル名をstart.plをして作成。

screenshot-java-startpl-eclipse-sdk.png

適当なスクリプトを作成後セーブし、デバッグボタン(虫のボタン)をクリック。以下のように設定し、Debugボタンをクリックするとデバッグできる。

screenshot-debug.png

screenshot-debug-startpl-eclipse-sdk.png

しかし、PadWalkerがないため、ローカル変数を表示できないと表示されているのでインストールする。

$ sudo apt-get install libpadwalker-perl

eclipseを再起動後、ローカル変数が表示できるようになった。

screenshot-debug-startpl-eclipse-sdk-1.png

debianでカーネル構築

フォルダ作成

$ mkdir ~/MYK
$ cd ~/MYK


http://kernel.org/pub/linux/kernel/v2.6/から最新カーネルGET

$ ls
linux-2.6.24.tar.bz2

デフォルトの.configを/bootから持ってくる。

$ tar xjf linux-2.6.24.tar.bz2
$ cd linux-2.6.24/
$ cp /boot/config-2.6.18-6-486 ./.config

menuconfigを起動

$ make menuconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/basic/docproc
HOSTCC scripts/kconfig/conf.o
HOSTCC scripts/kconfig/kxgettext.o
HOSTCC scripts/kconfig/lxdialog/checklist.o
In file included from scripts/kconfig/lxdialog/checklist.c:24:
scripts/kconfig/lxdialog/dialog.h:32:20: error: curses.h: No such file or directory
...............

menuconfigがエラー。ncursesがないのでインストール

$ apt-cache search ncurses|grep dev
btscanner - ncurses-based scanner for Bluetooth devices
lib64ncurses5-dev - Developer's libraries for ncurses (64-bit)
libncurses5-dev - Developer's libraries and docs for ncurses
libncursesw5-dev - Developer's libraries for ncursesw
librote-dev - a simple C library for VT102 terminal emulation - development
libtexttools-dev - Ada and C++ library for writing console applications

$ sudo apt-get install libncurses5-dev

もう一度menuconfig

$ make menuconfig

こんどは成功。ここでいろいろなコンパイルオプションを選択できる。

menuconfig.png

コンパイル開始

$ sudo make-kpkg --initrd --revision=mykernel.1.0 kernel_image

あとは以下のコマンドでインストールできるようだ。(実際はやってない)

# dpkg --install ../linux-image-2.6.24_mykernel.1.0_i386.deb

(参考)
http://www.debian.org/doc/FAQ/ch-kernel.en.html
http://www.togaware.com/linux/survivor/Why_make_kpkg.html

LD_LIBRARY_PATH 覚書

LD_LIBRARY_PATHはLinuxのダイナミックリンカーであるld-linux.soが共有ライブラリを探すためのパスを設定した環境変数。

プログラムが起動したとき、まずld-linux.soが読み込まれ、これが必要な共有ライブラリを探してリンクする。その後プログラムが実行される。

ld-linux.soはまず環境変数LD_LIBRARY_PATHから探す。ただし、 setuid/setgidされているプログラムは除外される。

次に、/etc/ld.so.cacheから探す。これはバイナリファイル。速い。

最後に、/usr/lib, /libから探す。

/etc/ld.so.cache/sbin/ldconfigによってつくられる。ldconfigはライブラリのシンボリックリンクも作成する。ldconfigは/etc/ld.so.confファイルに記述してあるディレクトリに対して操作を行う。

LD_PRELOADに共有ライブラリのパスが書かれていると、ld-linux.soはまずこれらのライブラリを優先させる。これによりプログラム中のある関数だけをフックすることができる。

あるプログラムがどの共有ライブラリを使うかは、lddコマンドで確認できる。
プログラムが本当にld-linux.soを使っているかは readelf -l /bin/date で確認できる。

LD_DEBUG環境変数を使用すると、プログラムがダイナミックリンクするときのさまざまな情報を表示できる。

/etc/ld.so.nohwcapが存在すれば、ld-linux.soは最適化されていないライブラリを使う。

ある実行ファイルがどのダイナミックリンカーを使っているかは以下のように調べる。

ライブラリや実行ファイルのファイル形式はa.outとELFがあるが、上記の説明はすべてELFに関するもの。

smbclientの使い方

smbclientはコマンドラインで利用するマイクロソフトネットワークの共有フォルダにアクセスするツール。ftpコマンドのように扱える。

まず、目的のマシンとフォルダを指定して起動する。

$ smbclient //machine/folder
passwd :
Domain=[machine] OS=[Windows] Server=[]
smb: \>

あとは、cdやlsでフォルダを移動し、getやput、またはmgetやmputでファイルのやり取りをする。

smb: \> get data.zip

コンピュータ名の変わりにIPアドレスを指定しても、接続できる。

$ smbclient //192.168.0.100/folder

ユーザー名を指定したいときは、-Uを用いる。

$ smbclient //machine/folder -Uusername

終了はq

smb: \>q

Fedoraにハードディスクを増設

Fedoraにハードディスクを増設したときの書き置きです。

使っていたハードディスクが少なくなってきたので、一台増設して、/home以下を増設したハードディスクにマウント予定。

現在の/etc/fstab

/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2

tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0

ハードディスクを増設しgpartedを起動して、ext3でフォーマット。

gparted.png

なかなか終わらないと思っていたら、mkfs.ext3のナイス値(プロセス優先度)が19あたりに設定されていた。-10にreniceしたら一瞬で終わった。

次にランレベル1で起動。

# init 1

e2labelでラベルの設定

e2label.png

今ある/homeを/home_bに移動。

# mv /home /home_b

/etc/fstabを編集して、/homeの行を追加

addtofstab.png

/home_bのデータを/homeにコピー。以下の画像で、cp -prを使っているが、cp -aの方がいい。

copy.png

後は再起動して問題なければ、/home_bを削除。