Author Archives: admin

消せないファイルの消し方

Windowsの話です。

ファイルが削除できない理由はいろいろあり、単純な解決策はありません。ここではさまざまな方法を使ってファイルの削除を試みます。簡単にできる方法から書いています。

1、コマンドプロンプトから削除してみる。

コマンドプロンプトを開きdelコマンド使って削除。 このときファイル名はフルパスで指定し、一番最初に\\?\をつける。

(例)
C:\>del \\?\C:\folder\file

2、ファイルの属性を変えてみる。

C:\>attrib -h -s -r \\?\C:\folder\file

3、フォルダを共有して、ネットワークフォルダから削除してみる。

4、ファイルを開いているプロセスを見つけて、それを終了させる。

対象ファイルがDLLの場合、ここからlistdllsをダウンロードしてコマンドプロンプトから実行する。出力の中から対象ファイルが見つかったら、それを開いているプロセスを見つけてそのプロセスを終了させてから削除してみる。

対象ファイルがDLLでない場合、ここからhandleをダウンロードしてコマンドプロンプトで実行する。出力の中から対象ファイルが見つかったら、それを開いているプロセスを見つけてそのプロセスを終了させてから削除してみる。

[追記]
OpenedFileViewを使えば、どのファイルがどのプロセスによって開かれているか確認できるので、そのプロセスを終了させればいい。

openedfileview

5、knoppixなどのLiveCDを使って削除する。

最終手段。

ListViewのアイテムを選択状態にする

.NETの話です。

.NETのListViewのアイテムの選択は、ListViewにメソッドがあるわけではなくて、ListViewItemにSelectedプロパティがありますのでそれを使います。

listView1.Items[1].Selected = true;
listView1.Items[1].Focused = true;

さらに選択したアイテムが画面内で見えるようにするには、ListViewのEnsureVisibleメソッドを使います。

listView1.EnsureVisible(1);

freebsd 日本語キーボードの設定

/etc/rc.confに以下の行を加える。

keymap="jp.106"

これでCUIで106キーボードになる。X環境も使う場合は/etc/X11/xorg.confのキーボード設定のところを以下の用にする。

freebsd ps/2ホイールマウスの設定

/etc/rc.confのmousedで始まる行を以下の様に設定する。

moused_port="/dev/psm0"
moused_enable="YES"
moused_type="auto"

/etc/X11/xorg.confのマウスの設定を以下の様にする。

Section "InputDevice"
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/sysmouse"
Option "Emulate3Buttons" "no"
Option "Buttons" "5"
Option "ZAxisMapping" "4 5"
EndSection

eclipse PDTとXdebugを使ってphpをリモートデバッグ

ここではサーバもクライアントも同一のマシンでOSはwindows2000を使いました。またeclipseを動かすためにはjavaが必要ですがここではすでにインストールされているものとします。

まずここからeclipseとPDTが一緒になっているAll-In-Oneをダウンロードします。ここではpdt-all-in-one-S20071213_M1-win32.zipをダウンロードしました。

all.jpg

解凍してできたファイルをC:\eclipseに移動します。

c:\eclipse\eclipse.exeを起動し、ワークスペースの場所をC:\eclipse\workspaceにします。

workspace.jpg

メニューからWindow->Open Perspective->PHPを開きます。

eclipse.jpg

PHPをリモートデバッグするためにはサーバとサーバで動くPHPが必要です。まずここへいってapacheをダウンロードしインストールします。ここではapache_2.2.8-win32-x86-no_ssl.msiをダウンロードしました。

つぎにPHPをここへいってダウンロードしてインストールします。ここではphp-5.2.5-win32-installer.msiを使いました。インストールの途中で、以下のような画面になりますがここではインストールしたapacheのバージョンを選択してください。

phpinstall.jpg

eclipseに戻ってPHPプロジェクトを作ります。メニューからFile->New->PHP Projectを選択します。プロジェクト名はmyfirstphpにし Finishをクリックします。

myfirstphp.jpg

PHP Explorer上のmyfirstphpを右クリックして、New->PHP Fileをクリックします。ファイル名にinfo.phpと入力します。

info.jpg

info.phpを編集し、以下のように入力します。

<?php
phpinfo();
?>

セーブして、C:\eclipse\workspace\myfirstphp\info.phpができているか確認します。

つぎにapacheの設定ファイルを編集して、ドキュメントルートをC:\eclipse\workspace\myfirstphpにします。まず、スタートメニューからPrograms->Apache HTTP server x.x->Configure Apache Server->Edit the Apache httpd.conf Configuration Fileをクリックし、エディタで設定ファイルを開きます。

DocumentRootで始まる行を以下のように書き換えます。

DocumentRoot "C:/eclipse/workspace/myfirstphp"

またDirectoryタグの以前のDocumentRootと同じフォルダの部分を以下のように書き換えます。

<Directory "C:/eclipse/workspace/myfirstphp">

セーブして、apacheを再起動します。Programs->Apache HTTP Server x.x->Control Apache Server->Restart

ブラウザで http://localhost/info.phpを開きエラーにならないことを確認します。

localhost.jpg

次にXdebugをPHPにインストールします。ここのページからインストールしたPHPにあわせたWindows moduleをインストールします。ここではインストールしたPHPは5.2.5なのでPHP 5.2.1-5.2.7をクリックして、php_xdebug-2.0.2-5.2.5.dllをダウンロードしました。

ダウンロードしたファイルをPHPインストールフォルダのmodulesフォルダの下へ移動します。modulesフォルダがなければ作成します。

PHPをインストールしたフォルダのphp.iniをテキストエディタで開き、最後に以下の2行を追加します。(実際のフォルダはPHPをインストールしたフォルダに変えてください)

zend_extension_ts="C:/Program Files/PHP/modules/php_xdebug-2.0.2-5.2.5.dll"
xdebug.remote_enable=1

apacheをリスタートし、ブラウザで http://localhost/info.phpを開き、以下のようなXdebugの記述があるか確認します。

xdebugconfirm.jpg

eclipseに戻り、新しくphpファイルmytest.phpを作成し以下のように入力し、保存します。

<?php
print ("AAA\n");
print ("BBB\n");
print ("CCC\n");
?>

メニューからRun->Open Debug Dialogを開き、以下のように入力します。

debugdialog.jpg

Apply->Debugをクリックし、デバッグできることを確認します。

eclipsedebug.jpg

【関連記事】
eclipse 3.4にPDT 2.0をインストールする

JPackageを使ってFedora8でsunのjavaを使ってeclipseを動かす

Fedora8でeclipseをインストールしようとすると、依存関係がgcjとくっついているため、gcjを綺麗に削除できない。しかしgcjでeclipseを動かすと固まることが多い気がする。

そこでjpackageを利用してgcjとsunのjavaを両方入れて、alternativeで切り替えるようにする。

まずsunから jdk-6u5-linux-i586-rpm.binをダウンロードしてインストール。

つぎに、ここから java-1.6.0-sun-compat-1.6.0.05-1jpp.i586.rpmをインストール。

最後にalternativeを使って、/usr/bin/javaのリンク先を切り替える。

# alternatives --config java

There are 2 programs which provide 'java'.

Selection Command
-----------------------------------------------
1 /usr/lib/jvm/jre-1.5.0-gcj/bin/java
*+ 2 /usr/lib/jvm/jre-1.6.0-sun/bin/java

Enter to keep the current selection[+], or type selection number:

これでsunのjavaを使ってeclipseが起動するはず。

Linuxでアンマウントできないとき

umountやautofsを終了しようとすると、リソースがビジー状態などでアンマウントできないときがある。umount -fで強制的に行うと書いてあるがこれはNFSだけのようだ。

リソースがビジー状態とはほとんどの場合ファイルが使われているということなのでファイルを使っているプロセスを終了すればよい。

lsofを使った方法

どのプロセスがファイルを使っているかを調べるにはlsofコマンドをつかう。このコマンドを引数無しで実行するとすべての開かれているファイルが表示される。よってここからマウントポイントを探して、そのプロセスを終了させるかkillすればいい。

# lsof|grep '/sambaauto'
lsof: WARNING: can't stat() smbfs file system /sambaauto/192.168.0.12/Share Output information may be incomplete.
automount 13797 root 4r DIR 0,16 0 127019 /sambaauto
bash 15569 grape cwd DIR 0,26 0 10 /sambaauto/192.168.0.2/Share/Ts.tar
bash 17960 root cwd DIR 0,16 0 127019 /sambaauto
automount 18959 root 4r DIR 0,16 0 127019 /sambaauto

上の例だと、automountはマウントプロセスなので無視して、それ以外の2つのbashを終了させればよい。面倒な場合はkill -9で強制的に終了できる。

# kill -9 15569 17960

これでアンマウントできる。

fuserを使った方法

$ fuser -va /mnt
このコマンドは/mnt以下にアクセスしているすべてのプロセスを表示する。

$ fuser -k -TERM -m /mnt
このコマンドはマウントポイント/mnt以下にアクセスしているプロセスをすべてTERMシグナルでkillする。

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をコントロールするためのフロントエンド、そして設定ファイルの記述方法。