golombset を使ってみる

かなり自分用備忘録な記事です。

ソート済の整数列を圧縮する件
https://github.com/kazuho/golombset

↑ こちらをmacで使ってみたというだけです。Linux系でも同様に動くと思います。

$ git clone https://github.com/kazuho/golombset
$ cd golombset/
$ make

makeするだけでバイナリができます。さっそく使ってみます。

$ (echo 100; echo 155; echo 931) | ./golombset --encode | od -t x1
0000000    41  90  6d  c0  ff                                            
0000005

$ seq 1000 > 1000.txt
$ seq 1000 | ./golombset --encode > 1000.compressed.txt
$ ls -lh 1000*
-rw-r--r--  1 mk  staff   126B 12  9 12:12 1000.compressed.txt
-rw-r--r--  1 mk  staff   3.8K 12  9 12:12 1000.txt

いいですね〜。コマンド版は4096個の整数までのようなので、それ以上の数をコマンド版で扱いたいときは cmd.c の

>unsigned keys[4096];
>unsigned char buf[65536];

を書き換えればいいのかなと思います。自分のコードに取り込みたいときは golombset.h をincludeすれば簡単に使えるのでありがたいですね。

いつか整数列圧縮オプションをRedisのListに入れたい私にとってたいへん参考になるコードです。ありがとうございました。

LAN内でSambaで認証なしファイル共有するための秘伝のsmb.conf

Ubuntu 12.04で動作を確認しました。

要求事項としては、

– LAN内でのみ使う
– セキュリティはゆるゆるでOK (自宅内を想定)
– Windows 7、Macからマウントできて、読み書き可能

あたりです。Sambaはたいていどこかで躓くと思います、私も何十時間も費やしてきました。以下の設定で今のところは安定しているので、備忘録として残しておきます。内容は、

– Linuxの設定 (Sambaを動かすマシン)
– Windows 7からのアクセス方法
– Macからのアクセス方法

です。

ただ、頑張ってLinuxのSambaと格闘するよりは、素直にQNAPとかのNAS買ったほうが良いと思います、私が最近購入したのはTS-131というものです。あっさり繋がりました。ただ機能が豊富すぎて全容が把握できていませんが。。。

– Linuxの設定

以下はUbuntuで動いた例ですが、他のディストリでも同じだと思います。

$ sudo apt-get install samba
# ↓smb.confを編集。具体的な中身は下に書いてあります
$ sudo vi /etc/samba/smb.conf

/etc/samba/smb.conf
[global]
	dos charset = CP932
	unix charset = UTF8
	display charset = UTF8
	server string = %h server
	map to guest = Bad User
	obey pam restrictions = Yes
	pam password change = Yes
	passwd program = /usr/bin/passwd %u
	passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
	unix password sync = Yes
	syslog = 0
	log file = /var/log/samba/log.%m
	max log size = 1000
	load printers = No
	disable spoolss = Yes
	dns proxy = No
	panic action = /usr/share/samba/panic-action %d
	idmap config * : backend = tdb
	printing = bsd
	print command = lpr -r -P'%p' %s
	lpq command = lpq -P'%p'
	lprm command = lprm -P'%p' %j

[share]
	comment = this is a samba storage.
        # ↓ path はディレクトリを作ってから chmod -R 666 しておくこと!
        # ↓の例であれば、cd /; mkdir storage; chmod -R 666 /storage
	path = /storage
	force user = root
	read only = No
	guest only = Yes
	guest ok = Yes
	vfs objects = recycle
	recycle:maxsize = 0
	recycle:touch = no
	recycle:versions = yes
	recycle:keeptree = yes
	recycle:repository = .recycle

nmbdとsmbdを再起動
$ sudo /etc/init.d/nmbd restart
$ sudo /etc/init.d/smbd restart

↑これでLinuxの設定は終わりです。

– Windows 7からのアクセス方法

左下のウィンドウズボタンを押す

「コンピュータ」をクリック

上の方にある「ネットワークドライブの割り当て」をクリック

「ドライブ」はなんでも良い、フォルダを「\\192.168.1.144\share」(\は円文字)を選択(↓画像の参照。もちろんIPアドレスはそのsambaのIPアドレスを指定すること。このときの「\share」は、smb.confの[share]を参照している意味のようで、たとえばsmb.confで[hoge]などとして設定を書いたら、\hoge を参照する必要がある)。「ログオン時に再接続する」にチェックを入れる、「別の資格情報を使用して接続する」には*チェックを入れない*。そして「完了」ボタンを押す
2015年11月09日月曜日、認証なしのsambaにwindows7から接続する場合の設定

するとマウントされて、sambaのディレクトリが見えるはず。通常のディレクトリやファイルと同じように扱える。

– Macからのアクセス方法

finderを開いて、メニューの「移動」→「サーバーへ接続」、「smb://192.168.1.144/share」と打ち込む

マウントされる

以上です。時が経過してクライアントやSambaのバージョン等変わるとまた異なってくるかもですが、少なくとも2015年11月9日の時点では動いています。

grepでファイルからシャープ(#)とセミコロン(;)と空白行を除いたものを取り出す

コメント(#や;)と空白を除いて出力したい場合があります。

$ grep -v -e '^;' -e '^#' -e '^\s*$' /etc/samba/smb.conf 
[global]
   workgroup = WORKGROUP
	server string = %h server (Samba, Ubuntu)
   dns proxy = no
   log file = /var/log/samba/log.%m
   max log size = 1000
   syslog = 0
   panic action = /usr/share/samba/panic-action %d
   server role = standalone server
   passdb backend = tdbsam
   obey pam restrictions = yes
   unix password sync = yes
   passwd program = /usr/bin/passwd %u
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
   pam password change = yes
   map to guest = bad user
   usershare allow guests = yes
[printers]
   comment = All Printers
   browseable = no
   path = /var/spool/samba
   printable = yes
   guest ok = no
   read only = yes
   create mask = 0700
[print$]
   comment = Printer Drivers
   path = /var/lib/samba/printers
   browseable = yes
   read only = yes
   guest ok = no

こんな感じで↑いけます。

– 「’^;’」はセミコロンの行にマッチ
– 「’^#’」はシャープの行にマッチ
– 「’^\s*$’」は空白行にマッチ

です。

WebDavサーバーを立ててWindows7とMacで使う

追記@2015-11-12

Windows7では、NetDriveというものを使えば簡単にマウントできるのですが、

– 容量の表示がおかしい(2TB程度のはずなのに10TBと表示されている)
– わたしの環境だとドライブ一覧のUIが乱れて、マウントしているディスクが見られない
– 一ヶ月の試用期間を過ぎると帯域制限されて使い物にならない
– $5ぐらいなら買っていたかもだが$40ぐらいする

というわけで、WebDavをやめてSambaにしました。Sambaは設定が面倒ですが、秘伝のタレ的なものを作ったのでこちらをどうぞ→ http://mitsuakikawamorita.com/blog/?p=3111


共有ドライブが欲しいなと思いました。自宅に省電力サーバーがあるので、NASを購入するよりそれを使うと安上がりです。

当初、Sambaを試してみたのですが、Macでは特に問題なかったのですがWindows7でどうしてもマウントできず、それではということでFTPにしようと思ったんですが、Macではファイルのアップロードができないとのことで、WebDavを試してみました。結果的には簡単にできたので良かったと思います。帯域については50MB/sほどで悪くはないです。もちろんGbでて欲しいのですが、帯域は何で決まるか把握できていません、iperfでGbでるLANなのですが、WebDavサーバーの性能が良くないのか(CPUがAtom N2800なので)、それともApacheのWebDavモジュールなのか、それともWebDavプロトコルそのもののオーバーヘッドなのか。。。

ともかくとしてあっさりWebDavサーバーを立ててMacとWindows7でマウントできたので、WebDavはおすすめではあります。

前提:
– サーバーのOSはUbuntu 12.04 (おそらくこれ以降のバージョンでも同様です)
– 認証なし (LAN内で使うことを前提、ユーザーによる権限等一切なし)
– UbuntuサーバーにWebDavを入れる (実質ApacheのWebDavモジュールですが)
– MacとWindows7でマウントできるようにする

手順:
1. サーバーでWebDavを使用可能にする
2. Macでマウントする
3. Windows7でマウントする

まず「1. サーバーでWebDavを使用可能にする」です。Ubuntuを前提とします。

# まずはWebDavモジュールを導入します。Apacheが入っていないとこのコマンドは有効でないかもしれないので、なければApacheを入れておきます。
$ sudo a2enmod dav
$ sudo a2enmod dav_fs

# WebDav用のディレクトリを作ります
$ sudo mkdir -p /var/www/webdav
$ sudo chown www-data /var/www/webdav

# Apacheの設定ファイルにWebDavを追加します (少し長いので後述してます)
$ sudo vi /etc/apache2/sites-available/default

# Apache2をリスタートします (serviceコマンドを使うべきかもです)
$ sudo /etc/init.d/apache2 restart

/etc/apache2/sites-available/default には以下のように追加します。
<VirtualHost *:80>
# ~中略~
Alias /webdav /var/www/webdav
    <Location /webdav>
    Options Indexes FollowSymLinks MultiViews
    Dav on
    </Location>
# ~中略~
</VirtualHost>

これでWebDavが有効になったはずです。ブラウザで、http://<サーバーのIPアドレス>/webdav にアクセスしてみると、以下のような感じでブラウジング可能になっていると思います。

webdav

では次に、「2. Macでマウントする」です。

Finderの上のメニューの「移動」→「サーバーへ接続」から、「サーバーアドレス:」に「http://<サーバーのIPアドレス>/webdav」と打ち込んで、「接続」ボタンを押します(↓の画像)。

スクリーンショット 2015-10-07 11.20.22

すると、ゲストかユーザーを選べます。今回WebDavサーバーは認証なしですのでゲストを選択して「選択」ボタンを押します(↓の画像)。

スクリーンショット 2015-10-07 11.21.00

これでFinderにマウントできました。

次に、「3. Windows7でマウントする」です。

Windows7ではWebDavはSSLでないと標準ではだめだそうです。回避方法はあるようなのですが(参考のQNAPの記事を参照)、今回はそれを試さず、QNAPの推奨の NetDrive というソフトウェアを使います。

このソフトウェアは、2015-10-07現在では30日の試用期間がありますが、試用期間を過ぎても、ドライブ一個は可能、自動接続ができなくなる、とのことです。

NetDriveをインストールして立ちあげて、↓のように設定をして、「セーブ」として「接続」を押すとマウントできます。「名前」を「WebDav」とすると、名前の重複があると怒られるので別の名前にしましょう。

2015年10月07日水曜日、webdav、netdriveの設定

注意点としては、
– 日本語ファイルはだめかもです (Apache側のコンフィグがおそらく必要です)

以上です。

参考:
http://moonstruckdrops.github.io/blog/2013/04/02/httpd-webdav/
https://www.qnap.com/i/jp/tutorial/con_show.php?op=showone&cid=80

JavascriptでsetIntervalでループさせて指定秒数後に停止する例

setIntervalで関数を回して、指定秒数後に止める例です。setInterval, clearInterval, setTimeoutの合わせ技です。いつも忘れるので備忘録的に残しておきます。

jsfiddle (developer toolを開いて実行してください) → https://jsfiddle.net/r94sowe4/

コード

<!DOCTYPE html>
<html>
    <head>
	<title>ボタンを押すと関数がsetIntervalで回され、指定秒数後に停止する例</title>
	<meta charset="UTF-8">
    </head>
    <body>
	<div>
	    <h2>ボタンを押すと関数がsetIntervalで回され、指定秒数後に停止する例</h2>
	    <p>Developer Toolを開いて、ボタンを押してください。</p>
	    <input type="number" name="time" id="time" value="3" min="1" max="100" required> (秒)
	    <br />
	    <input type="button" value="開始" onClick="start();">
	</div>

	<script>
	    var time;
	    var intervalID;

	    function start() {
		time = parseInt(document.getElementById('time').value, 10);

		intervalID = setInterval(loop, 0);
		setTimeout(function () {
		    clearInterval(intervalID);
		    console.log('loop has stopped after ' + (time) + ' sec!');
		}, time * 1000);
	    }

	    function loop() {
		console.log('I am the loop!');
	    }
	</script>
    </body>
</html>

コツとしては、clearIntervalを使いたい場合は、setIntervalを宣言的に使うって感じですかね。