2011年6月20日月曜日

FreeBSDでインストールしてるアプリ一覧



pkg_infoでもいいのだが、依存関係ではいってるものも出るのでちょっとうざい。


以下の様にしてどこからも参照されていないpackageを探せば比較的楽にインストールしたアプリを思い出せる。



#!/usr/local/bin/ruby
res=`pkg_info -Ra`.split(/\n/)
c=0
while(c<res.size)
if(/^Information /=~res[c])then
c+=1
c+=1
puts res[c-2 ].split[2].sub(/-[^-]*:$/,"") if(!(/^Required/=~res[c]))
end
c+=1
end






2011年6月13日月曜日

重複ファイルを探す on Ruby



重複ファイルを探すツールがほしいけど、なんか探すがめんどくなって作ってみた。


目的は、ディスク容量節約のために、アホなファイルの重複を探す事。


なので、比較的速度重視小さいファイルは無視するようにしてます。(というか小さいファイルを探し出すと.svnファイルがたくさんひっかかる)


この程度の処理ぐらいシェルスクリプトで書けるようになりたいなぁ。






#!/usr/local/bin/ruby
# -*- coding: undecided -*-
require 'digest/md5'
require 'pathname'
$minFileSize=30*1024*1024 #これより小さいふぁいるは検索対象外

$fileHash=Hash.new
def getHash(dir)
$stderr.puts dir
dir.each_entry do |file|
next if(file.to_s=="." || file.to_s=="..")
path=dir+file
if(path.file?)then
next if(path.size<$minFileSize)
begin
digest=Digest::MD5.new.update(path.read(512))
key="#{path.size}#{digest}"
$fileHash[key]=Array.new if($fileHash[key]==nil)
$fileHash[key].push(path)
rescue
end
elsif(path.directory?)then
begin
getHash(path)
rescue
end
end
end
end

def checkDiff(files)
differ=Array.new
same=Array.new
base=files.shift
same.push(base)

files.each do |target|
if(system("diff","-q",base.to_s,target.to_s))then
same.push(target)
else
$stderr.puts "=============================="
differ.push(target)
end
end
return [same,differ]
end

getHash(Pathname.new(ARGV[0]))
$fileHash.each do |k,v|
while(1<v.size) do
t=checkDiff(v)
v=t[1]
if(1<t[0].size)then
puts t[0]
puts "================================"
end
end
end





2011年6月5日日曜日

続:FreeBSDのSMB(CIFS)マウント対応状況 mount_smbfsに関する訂正



まず、SMBで扱える文字コードはサーバからみると、


「ネイティブ(サーバ依存)」と「Unicode」の2種類、しかしFreeBSDの


mount_smbfsはUnicodeに対応してないので、ネイティブを選択せざるをえない。


一般には普通のwindowsならCP932(SJIS)だが、よくあるsambaの設定は


UTF-8がネイティブコードとして設定されている。


CP932もUTF-8もヌル文字を含まないので、正常に処理されるが、


mount_smbfsのバグのため、ヌル文字を使う文字コードをネイティブコードに使っている


time capsuleはマウントできない・・・といった所みたい。


(マルチバイト文字だけUTF-16BE?なんや不思議なエンコードに見えた)


なのでFreeBSD標準のmount_smbfsではtimecapsuleは正常にマウントできない 。


まとめると・・・・




  • windowsは-E UTF-8:CP932であらかた読める(3byte文字問題あり)

  • sambaは-E UTF-8:UTF-8で正常に読める。

  • timecapsuleは日本語含まなければ読める。


ちなみにこの調査の過程でkernelのlibiconvを拡張して遊んだりしてみた。


元のコードを数行書き換える必要はあったが、


iconv_xlat.c等の既存の変換エンジンをまねして変換エンジンを書いて


追加するだけで、モジュールがガンガン追加できるので実験しやすく面白い。


じゃ、どうすればいいか。


fuse-smbnetfsをつかう・・・というのが楽だけど、当然処理が遅い。


mount_smbfsをとりあえずの改造するならファイル名の扱いをヌル文字OKにするのがいいかな。


libiconv.koのほうには必要に応じて文字コード変換を追加して・・・


しかしながら、長期的にはUnicode対応のほうが絶対有利。今時Unicode吐けないSMBサーバは少数になりつつあるので。





fuse-smbnetfsのマウントが遅い時



~/.smb以下にsmb.confの雛形を適当にコピーして以下の用に名前解決の手段を見直してみる。


無難なのはbcastだがfirewallをはさんだりルータ越しの場合はwinsサーバを設定したりと色々ありえるのでsambaの解説サイトでもみてくださいな。



[global]


name resolve order = bcast <==これを見直す



あと、先日の記事にも書いたけど、fuse-smbnetfsは最新に更新しよう。portsは古いかもよ。





2011年6月3日金曜日

salt無しでパスワードのハッシュ作るのが最近の流行???



http://bakera.jp/ebi/topic/4421


↑をみてふとgoogle code searchしてみたんだけど、パスワードをそのままhash取る実装あるのね。。。


でも有名なパスワードに関してはhash databaseとかがあるので、最悪ハッシュ値をググルだけでパスワードが推測できてしまう。


昔Webプログラマのバイトをしてた時はググって見つけるサンプル実装のほとんどは、パスワードとともにシステム固有のソルト(インストール時に設定)を足した文字列のhashをとってたような気がするんだけど、、、気のせいかもしれない。


ちなみに同じ理屈でhashを数回取るというだけの実装ならhash DBもすぐ拡張できちゃうよね。一般にパスワードのハッシュはファイルかDB上にあるので、それ以外のところにシステム固有のソルトを持ってやるといいのかもしれない。うーん、カーネル空間?TPM?まぁどっかだよどっか。


システムの売り込みとしてうまいのはドングルにシステム固有文字列+ハッシュ関数を持たせる事かな?


追記


ソルトをランダムに生成してソルトも記録するってのもあるね、そういや。DB検索は免れるけど辞書アタックは免れないはず、、、いあ、上のを含めて大差はない状況だけどね。