2011/12/31

2011/12/31

2011/12/30

2011/12/30

ubuntu 11.10 デフォルトの画像ビューア

eogってのか。
$ eog ~/your/image/filepath

2011年のふりかえり(予定地)

少しふりかえっておきたい。



社会復帰した

2009/10いっぱいで仕事を辞めて2010/12までたっぷりブラブラした。
で、いい加減働こうとしていたところに声を掛けて頂き、2011/01からスーパーハカーが二人もいるところで働くことになった。 こういうことを言っていたので願ったり。

27歳になった

誕生日は01/10です。binary dayです。27歳になりました。もうすぐ28歳です。

仕事でlisp

仕事でGaucheを使わせてもらいました。(ほぼ通年)
なのでOutputzの集計がscheme-modeだらけ。

ぎっくり腰になった(11年ぶり2回目)

やばい。ぎっくり腰やばい。すぐ整体にいってかなりよくなったけど、3日くらいは日常生活もまともに送れなかった。

J.P.ホーガンを読みあさった

今は造物主(ライフメーカー)の掟を読んでる。

unix/linuxが好きになった



shellコマンドにハマった



プログラムを書いたらとりあえずコマンドにした



客先泊まり込みデスマ

6,7月やばかった

ウィスキーが好きになる



久し振りにKPFを開催



隔週開催していた9LISPが不定期開催(不本意)



ThinkPad買ってubuntu入れた



筋トレ始めた



facebookに地元の友人/知人がたくさん

最近はスマートフォンの影響かリア充(この単語はもう死んでしまったかも)が大量に流れ込んでるようですね。
気まずい人が「この人友達じゃね?」って出てきて怖いですね。

ガラケーからスマートフォンにした

ようやく5年くらい使ったガラケーからスマートフォンに。galaxy s2にしました。Xiじゃないやつ。とりあえずこれを装着した。
SGP ギャラクシー S2 ケース ネオ・ハイブリッド【 ソウル・ブラック 】Neo Hybrid 液晶保護フィルム付  docomo Galaxy S2 ケース sc 02c
画面保護シートはゴリラガラスらしいしいいかなーって。

2011年の目標

果たして達成されたのか。

2011/12/28

sedでマッチした部分を置換にも使う

何を言ってるかわからねーかもしれねーが、&で
$ for i in {1..10} ; do ; echo "$RANDOM" ; done | sed 's/0/[[&]]/g'
31171
21328
499
1717[[0]]
12253
28374
124[[0]]8
9972
6892
1525
最近shellでsed/awkとかワンライナーが楽しくて仕方ない。

sed & awkプログラミング 改訂版

dropbox start

ubuntuでdropbox使ってるけど、stumpwmの時は
$ dropbox start
しないと同期してくれない。

2011/12/24

2011/12/24

emacs lispのplist

これを見て初めて知りました。 elispにもcl同様にplistがあったんですね。しかも変数/関数とは別にバインドできるアレが。(あ、でもこれはcl packageのお陰なのかな?そこまで調べる気は起きなかったり)
*** Welcome to IELM ***  Type (describe-mode) for help.
ELISP> (get 'hoge :foo)
nil
ELISP> (get 'hoge :bar)
nil
ELISP> (setf (get 'hoge :foo) 100)
100
ELISP> (setf (get 'hoge :bar) 200)
200
ELISP> (get 'hoge :foo)
100
ELISP> (get 'hoge :bar)
200
ELISP> hoge
*** Eval error ***  Symbol's value as variable is void: hoge
ELISP> (setq hoge 'aaaaaaaaaaa)
aaaaaaaaaaa
ELISP> hoge
aaaaaaaaaaa
ELISP> (defun hoge (x) x)
hoge
ELISP> (hoge "hoge")
"hoge"
ELISP> (hoge "hello, world !!")
"hello, world !!"
ELISP> (symbol-value 'hoge)
aaaaaaaaaaa
ELISP> (symbol-function 'hoge)
(lambda
  (x)
  x)

ELISP> (symbol-plist 'hoge)
(:foo 100 :bar 200)

ELISP> (symbol-name 'hoge)
"hoge"
ELISP> (symbol-package 'hoge)
*** Eval error ***  Symbol's function definition is void: symbol-package
ELISP> 
twitterで教えてもらったけど、Common Lispのsymbolって5つもスロットあったのか(笑)変数/関数にplistの3つかと思ってた。その点schemeは良し悪しは別としてすごくシンプル。
Emacs Lispテクニックバイブル

2011/12/22

2011/12/22

Re: lispのマクロ定義について

最初の例は動かないんじゃないかなー。取りあえずmacroexpandしたらいいかと。この辺はLOLの評価の梯子(だっけ?)の話がわかりやすかった。
[1]> (defmacro inc! (var)`(setq var (1+ var)))
INC!
[2]> (let ((x 1))(macroexpand '(inc! x)))
(SETQ VAR (1+ VAR)) ;
T
[3]> (defmacro inc! (var)`(setq ,var (1+ ,var)))
INC!
[4]> (let ((x 1))(macroexpand '(inc! x)))
(SETQ X (1+ X)) ;
T
[5]> 
On LispLOLもせっかくWebで読めるので参考にしてはどうでしょう。 こんなとこでドヤ顔しながら回答しても無意味だけど。
On Lisp

2011/12/21

2011/12/21

ubuntuにGauche-gd入れてなかった

というかgdも入ってなかった。
$ sudo apt-get install libgd2-xpm-dev
$ ./configure
$ make
$ sudo make install
しばらく前に仕事でGauche-gd使って画像レンダラコマンドとDSL(振り返るとこれはひどかった・・・)を書いたんだけど、それを自分用に書き直したいなーって思っていたり。あと、当時それらを作るのにGDのことを何もしらなかったのでいろいろサンプルを書いた残骸があるのでブログに書こうと思っていたんだった(忘れてた)。いつか書く(かも)。

プログラミングGauche

2011/12/20

2011/12/20

favrand自動更新


以前、指定したTwitterユーザーのふぁぼりをランダムに一つ選択して表示するfavrandというコマンドを作った。 コマンドにしたお陰で、コマンドとしてもbotとしても動いてたりする。
それは置いといてインターバルを設定して自動で更新するようにしてみた。つまり、いままでは一回の実行で一個のふぁぼを表示していたけど、自動で更新してくれるようにしただけ。自分のふぁぼでも他人のふぁぼでも眺めてるだけでたっぷり時間を消費できる・・・
タンブラー版のコマンドも。

プログラミングGauche

2011/12/17

bloggerバグってる?

このブログに下記の記事がある。2011年12月の記事。右側のarchiveの2011/12/14と2011/12/13の間に並んでいるので、個別にアクセスすることができる。だけど、ブログ最下部の「前の投稿」から辿ると表示されない。 しかし「前の投稿」から「vallog: blogの更新をtwitterに通知する」まで辿ってから「新しい」で逆に辿ると表示される。

追記

と、思ったら・・・
全ての記事がトップから「前の投稿」まで流れたら表示されるようになった。つまりこの記事を投稿した時点で上記の症状がなくなった。

2011/12/15

2011/12/15

日記

feedburnerでtwitterに通知するようにしたわけです。 ただ全ての投稿が通知されるのはどうかと・・・。 ということで、feedburnerラベルがついた投稿だけ通知するようにしました。 何が言いたいかというとテスト。


日記本題。awk/sedが便利だし楽しいだしマイブームです。というかshell scriptすげー。便利ー。なんでもうちっと早く触ってみなかったのか。。m4とかももうちっと触ってみたい。

す、す好きなコマンドはなんですか?

sed & awkプログラミング 改訂版

2011/12/14

2011/12/14

shellで連番の欠番を探す(awk)

欠番に耳あてしてみる。
$ i=10 && while [ $i -ne 0 ] ; do ; od -vAn -N1 -tu4 < /dev/random ; i=`expr $i - 1` ; done | tr -d ' ' | sort -n | uniq > ~/temp/randnums.txt
$ cat ~/temp/randnums.txt
1
13
62
64
114
137
210
240
253
$ cat ~/temp/randnums.txt | awk BEGIN{'FS=","}{print $1}' | awk 'BEGIN{pre=0;}{if(pre+1<$1){for(i=pre+1;i<$1;i++){print "*"i"*"}}{print $1}pre=$1;}'  | head
1
*2*
*3*
*4*
*5*
*6*
*7*
*8*
*9*
*10*
*11*
*12*
13
*14*
*15*
*16*
*17*
*18*
*19*
*20*
取りあえずコマンドにしてみる。
$ cat ~/temp/randnums.txt | toothless | head -n 15
2
3
4
5
6
7
8
9
10
11
12
14
15
16
17
ソースはこちら
そういえば以前同じようなことした。

おまけ

基本的にこのページは全て awk で記述していく。
awk/sedいいですよねー面白いですよねー。もっとちゃんとやってみたい。

shellで適当な数値セットを作る(while, od, /dev/random, expr)

$ i=10 && while [ $i -ne 0 ] ; do ; od -vAn -N1 -tu4 < /dev/random ; i=`expr $i - 1` ; done | tr -d ' ' | sort -n | uniq
33
84
93
100
133
148
170
241
247


入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界

shellで適当にCSVを作る(while, od, /dev/random, shasum, cut, expr)

こないだも同じようなの書きましたけども
$ i=30;while [ $i -ne 0 ] ; do ; echo `od -vAn -N1 -tu4 < /dev/random`','`head /dev/urandom | shasum | cut -f 1 -d " "` ; i=`expr $i - 1` ;done
143,7ed6cdfacce9c8180f084f11ff40a487fb9b76cc
172,e8868853fbf06a59d54a80af5d326ee923f5c2a5
20,aa6964527830642d0487d8c91ee729acd596d2c6
16,39653698b5f44272b9323175142c6f697b0b56e5
147,58d0a5b4f8ba2b6b232b3d880b012dbc5c8f7003
124,4b29452a6ceed3bc5cbc5646f89b8d059f35142c
77,79d318be8be409b772f5bc084119816e1d8a7b3d
5,830c44e27e2541f5b3cb93dfad07a35121f19d4a
29,e822b1cd62a150c6f33f5db764e2ea4a684e79d2
90,d32f9c0a7b84f2cdd9621ed8a9265cd95a56c263
65,fd244f7b6c689510e4b5ddf12871497c74fdc499
189,1731b1bf3a5376880b36dc95ec1e7f7195648e20
137,79b3c453d5157bd39d27cd5ce543f652f9b3bcaf
28,9ed7b27b2f119e9d5b90807c8eb95871d2b41f9b
45,52e2a699499889ea4f8c6840ab968f8c56fd3811
148,ff29ed9a549e9252e230321d2aa620850aa1f88f
162,baecf2ff043644044b8ed901e70283a645990d4f
169,9b1d410a6a7e1b3babfe4ccbbef0aa769bad9bf7
117,16d548cb175ccf8e992ed69ec1d43940a15bda85
127,ca7533638cd1cb09d774d3515d4298842c912a93
203,80431c1c5296af45c7974d07ae2aea803167a395
5,0488e6326128587a7a0f8fa071120b78752dacbf
102,c3882ba4b20a38f34cb08b96bd7cec22a0cf47a7
161,9efe9a3c9a9f46fc928ef077123dc3ae188f6973
9,cd5c6555c08ddf3a81b8a682b65a7de3adb25cd4
132,7abe72b0e1341a5b4b24b06dcc75fbc2615fa3c7
229,5ee1c7255d38acbe446e8a30bcf6ddcefd8615bb
193,228f6cdab6ae3d276a1b4b543ca39cf93f499a5f
188,f6b215b5202d7342f7c310402dffedaf349fcbce
54,6e2490ea175f1e4ea009e441fccabe08d2d8c0c7


入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界

shellで乱数(od, /dev/random, tr)

$RANDOMってのもありますね。
$ od -vAn -N1 -tu4 < /dev/random | tr -d ' '
$ od -vAn -N4 -tu4 < /dev/random | tr -d ' '


入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界

日付を2進数とか16進数に変換してみるshell script(date, bc)

最近「入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界」って本を読んでて、シェルスクリプト書いてみてます。

普段は何かやりたいことがあればGaucheで書いています。ですがシェルスクリプトで書いた方が手軽な場合も多々あります。やりたいことがあったときにシェルスクリプトで書くか、お気に入りの言語で書くか、この辺の判断はまだできません。シェルスクリプト書くのが結構楽しいので、もうちっと書きながら勉強してみます。

当初考えていたやりたいことを実現するにはシェルスクリプトで十分でした。が、機能を付け加えていくうちに「Gaucheでやればよかった・・・」という状況になりました。。なぜかというとコードが手続き的でわかりにくくて面倒になったからです。まだシェルスクリプトの作法がわからないこともありますが、文法的に手続き的なコードになりやすい印象を受けます(そりゃそうだろうと思いますが)。手続き的なコードが苦手なのであーあーあーあーあー状態。

で、本題。
date2binという名前を見ればわかるように、日付を2進数に変換してみようと思ったのがきっかけでした。そのうち16進数も、8進数も、CSVにも、といろいろやってるうちに面倒なことに。
$ date2bin -n3
--------------------
count          : 0
+%Y-%m-%d      : 2011-12-14
+%s            : 1323788400
+%Y%m%d -> bin : 1001100101101111101101110
+%m%d -> bin   : 10010111110
+%s -> bin     : 1001110111001110110100001110000
+%Y%m%d -> oct : 114557556
+%m%d -> oct   : 2276
+%s -> oct     : 11671664160
+%Y%m%d -> hex : 132DF6E
+%m%d -> hex   : 4BE
+%s -> hex     : 4EE76870
--------------------
count          : 1
+%Y-%m-%d      : 2011-12-15
+%s            : 1323874800
+%Y%m%d -> bin : 1001100101101111101101111
+%m%d -> bin   : 10010111111
+%s -> bin     : 1001110111010001011100111110000
+%Y%m%d -> oct : 114557557
+%m%d -> oct   : 2277
+%s -> oct     : 11672134760
+%Y%m%d -> hex : 132DF6F
+%m%d -> hex   : 4BF
+%s -> hex     : 4EE8B9F0
--------------------
count          : 2
+%Y-%m-%d      : 2011-12-16
+%s            : 1323961200
+%Y%m%d -> bin : 1001100101101111101110000
+%m%d -> bin   : 10011000000
+%s -> bin     : 1001110111010100000101101110000
+%Y%m%d -> oct : 114557560
+%m%d -> oct   : 2300
+%s -> oct     : 11672405560
+%Y%m%d -> hex : 132DF70
+%m%d -> hex   : 4C0
+%s -> hex     : 4EEA0B70
--------------------
$ date2bin -fn3
count,ymd,epoch,ymd_bin,md_bin,epoch_bin,ymd_oct,md_oct,epoch_oct,ymd_hex,md_hex,epoch_hex
0,2011-12-14,1323788400,1001100101101111101101110,10010111110,1001110111001110110100001110000,114557556,2276,11671664160,132DF6E,4BE,4EE76870
1,2011-12-15,1323874800,1001100101101111101101111,10010111111,1001110111010001011100111110000,114557557,2277,11672134760,132DF6F,4BF,4EE8B9F0
2,2011-12-16,1323961200,1001100101101111101110000,10011000000,1001110111010100000101101110000,114557560,2300,11672405560,132DF70,4C0,4EEA0B70
コードはこちら
今回気づいた面白い日付は3/14とか5/12とかでしょうか(今回のコマンド関係ない)。あとはbinary dayくらいですかね。epochで言えば2012/04/02の11時くらいが1333333333でちょっと面白いですね。他にはもう過ぎ去りましたが
$date -d @1234567890 +%Y-%m-%d
$date -d @1111111111 +%Y-%m-%d
とかですか。

ダサいコードで恥ずかしいですが、どんどん晒していきます。


blogの更新をtwitterに通知する

以前はfriendfeed経由でやってました。いつからかfriendfeedからの通知ができなくなったのでtwitterfeedから通知するようにしました。twitterfeedの通知は微妙でした。ので、Twitterへの通知はしばらく止めてました。今度はfeedburnerの通知機能を使うことにしました。 ということでテスト。

2011/12/11

2011/12/11

1000

このブログ1000記事目だー
昔書いた下書き記事を含めてだけど。



下書きの記事はpure言語を触ってみた結構長めの話だった。


ちょっと振り返ってみる。

このブログは2009/01/01から書いてる。それ以前の記事は前のブログから移行したもの。
(ということは1000記事目じゃないな)

sicpを読むために「もうひとつの Scheme 入門」を読み始めたのが2008/11くらいからだった。(lispを始めたきっかけは同時期にハッカーと画家を読んだからだけど)
だからこのブログもこのありさまなんだ・・・。

そういえばKPFを始めたのも同じ頃。 初めて参加した勉強会というかイベント?(2008/12に福岡であった九州Ruby会議)とTwitterがきっかけ。2008年末にいろいろやったから今があるんだなー(白目

2008年末頃のバイタルは異常。
意識高ぇー(笑) 当時RTなんてなかったんだぜ・・・信じられるか・・・。

計算機プログラムの構造と解釈

2011/12/08

2011/12/08

extractコマンド

そんなコマンドはないですが、下記リンクのものをコマンドにしています。 ソースはこちら。こんな感じ。 link先ではaunpackがあるじゃんって話ですね。aunpackも使いますが、上記コマンドはリファレンスにもなるのでこれはこれで便利。

UNIXという考え方―その設計思想と哲学

ssh先のディレクトリをtarしてローカルにコピーして展開(ssh, cd, tarしてtar)

$ ssh valvallow@server '(cd /foo/bar/baz ; tar cf - .)' | tar xf -
だいたいいつもこれ見る。 UNIXという考え方―その設計思想と哲学

dateコマンドで日付の加減算

$ date
Thu Dec  8 19:35:07 JST 2011
$ date --date '-100month'
Fri Aug  8 19:35:19 JST 2003
$ date --date '-100month' +%Y-%m-%d
2003-08-08
$ 
へぇーへぇー。 UNIXという考え方―その設計思想と哲学

2011/12/07

2011/12/07

日記

今日はぬこ様と遊べて楽しかった。
先生んちの98lowかわいかった。

あと10記事くらいで1000記事目だこのブログ。
自動更新のvalloggerに1000を取られないようにしたい。

ベツニトラレテモイイケド、「1000ならxxx!!」ッテカキタイ

そういえば最近、また岐路っぽい。
方向が決まったら日記でも書く。

2011/12/02

2011/12/02

クリスマスツリーを飾りました。Lispで。

もうすぐクリスマスなのでterminalにクリスマスツリーを飾りました。
Lisp(というかScheme(というかGauche 0.9.1以降))で書きました。
和田先生の去年の記事を参考に・・・。

$ christmas-tree -size 6 -color


ソースはこちら。毎度よろしくコマンドにしました。色付けが若干間違ってるのはご愛嬌ということで。


lispギャグ

リリカル☆LispとかマンガでわかるLispの中の人が。


LispやSchemeはいつもAdvent Calendarないですねー。

クリスマスネタとか新年ネタ探そ。
クリスマスツリーは去年見かけて、真似して書きかけたのがある。
書き初めは、仕事で書いたgauche製の画像レンダラがあるのでできそう。ってか普通にGauche-gdだけでいいか。


渾身のlispネタ


初めての人のためのLISP[増補改訂版]

bloggerの新UIで投稿できなくなった

ので、旧UIに戻した。
2011/12/02 20:08

2011/12/01

2011/12/01

2011年11月の筋トレ

10年以上体重に目立った変化がなかったのに今年になって6kg太った。腹がぷにぷにしてきた。思い切って11月から筋トレを始めた。「痩せるには筋肉つけて代謝を上げればいいはず(キリッ」と考えて筋トレ。 取りあえず少ない回数から始めて、「続ける」ことを目標にした。これからも焦らず無理せず続けたい。
目標は半年後に腹筋を割ること。誰かアドバイスたのむ。
目指せガチムチェ・・・

日時体重腕立て腹筋スクワット
2011-11-0259.7202020
2011-11-0360.4202020
2011-11-0459.4303030
2011-11-0559.4303030
2011-11-0659.8303030
2011-11-0759.640050
2011-11-0859.4401040
2011-11-1058.930530
2011-11-1258.2505030
2011-11-1458.4502030
2011-11-1559.050200
2011-11-1657.050300
2011-11-1758.870300
2011-11-1858.8100500
2011-11-1959.8100500
2011-11-2058.8100500
2011-11-2258.8115500
2011-11-2359.2100500
2011-11-2559.0140500
2011-11-2659.0100500
2011-11-2958.880300
2011-11-3058.6100500
22/30日平均59kg1445725310

スクワットは途中でやめた。腕立ては楽しく続けている。腹筋はツライ・・・。懸垂したい。
夕食後就寝前に筋トレしてるのでまずいと思う。夕食前にシフトしたい。 身長は171cm。
ちなみに記録は、筋トレ用にCSV記録用のshellスクリプト書いて、集計と表組はawkでやった。

2011/11/30

2011/11/28

2011/11/28

プロシュート兄貴

「書いてみたい」…そんな言葉は使う必要がねーんだ。                                                                                                                        
なぜなら、プログラマや、プログラマの仲間は、
その言葉を頭の中に思い浮かべた時には!
実際にプログラムを書いちまって、もうすでに終わってるからだッ!
だから使った事がねェーッ。

オマエもそうなるよなァ~~~、プログラマなら…
わかるか?オレの言ってる事…え?

『書いてみた』なら、使ってもいいッ!


これを読んでプロシュート兄貴を思い出したので。
「興味がある」「勉強したい」「作ろうと思ってる」。ぐずぐず言う前(もしくは言った後)に、ハローワールドからでいいから、コードをひとつ書いて公開すればいい。
プロシュート兄貴の言う通りにやるのはハードルたけぇーなー。

ジョジョの奇妙な冒険 52 (ジャンプ・コミックス)

terminalから輝度を調節

ubuntu 11.10, thinkpad x1
% brightness 10
ソースはこちら



詳解 シェルスクリプト

2011/11/22

2011/11/20

2011/11/20

シェルスクリプトで適当なcsvを作る

いつもはgoshで作るけど、シェルスクリプトで簡単に作れた話。
for i in {1..12}
do
  echo '' > hoge$i.csv
  for j in {1..30}
  do
    echo $i$j','`uuidgen`','$RANDOM'\n' | sed 's/ //g' | sed '/^$/d' >> hoge$i.csv
  done
done


UNIXという考え方―その設計思想と哲学

cygwinでwindowsのアプリケーションを実行する

昔きくちゃん先生に書いてもらったヤツ。
$ start doc/hoge.pdf
# adobe reader でPDFが開く
とか
$ start .
# explorerが開く
$ start pic/fuga.png
# 画像ビューワで画像が開く
といった感じ。
で、そのstartってのはこれ。
 #!/bin/sh
`cygpath -S -u`/cmd /c start `echo "$*" | xargs -n 1 cygpath -w`
「それcygstartでできるよ」って言われそうだけど、なぜか会社のPCでcygstartが動かない、

関連



UNIXという考え方―その設計思想と哲学

vimで選択範囲の文字数

:'<,'>s/./&/gn
メモ

Vimテクニックバイブル ~作業効率をカイゼンする150の技

git

仕事でもプライベートでも使ってきたけどなかなかちゃんと使いこなせない。
それでもすごく便利。
これ知らんかったなー。
--no-ff フラグは、たとえマージがfast-forwardで実行できるとしても、新しいコミットオブジェクトを作成する。これは、履歴にフィーチャーブランチが存在したという情報を失うの\ を避けるのと、機能の追加に使った全てのコミットをひとまとめにしておける。


追記



Gitによるバージョン管理

.stumpwmrcさらし

StumpWMは入れただけでほとんど使っていなかった。
しばらく使ってみたら快適だったので気になるところだけ.stumpwmrcを書いてみた。
今後活躍の機会が増えるかも。ソースはこちら



実践Common Lisp

バッテリーの状態を表示するシェルスクリプト(状態、パーセント、残り時間)

[charged|charging|discharging] [parcent] [time]
gnu screenのステータスラインとStumpWMのmode-lineに表示しようかと。
$  battery
discharging 19% 0:44
ソースはこちら

参考



詳解 シェルスクリプト

2011/11/17

2011/11/17

vimの行番号

行番号を非表示にするにはどうすんのかなーって。
:set number
:set nonumber
これ読んでみてーなー。 あとこっちも欲しい。必要ないかなーなんて思ってたけど、目次見たらすごかった。 ちなみにこれは持ってる。だいぶお世話になった。

Emacs Lispテクニックバイブル

gauche-library-directory探訪001:gauche/macroutil.scm

gaucheのライブラリをのぞいて、目についたものを書いていくシリーズ(謎

前回



gauche/macroutil.scm

前回の方法で移動したディレクトリのgaucheディレクトリから。macroutil.scmという目を引くファイルがあったのでのぞいてみた。xmac, xmac1というマクロが定義されていた。
$ rlwrap gosh
gosh> (gauche-version)
"0.9.2"
gosh> (use gauche.macroutil)
gosh> (xmac (let1 a 1 (print a)))
(let ((a 1)) (print a))
gosh> (xmac (xmac (let1 a 1 (print a))))
(unwrap-syntax (%macroexpand (let1 a 1 (print a))))
見ての通り%macroexpandマクロの結果がunwrap-syntaxに渡されている。こんなマクロがあったなんて知らなかった。ドキュメントを調べてみたらundocumentedだった。

プログラミングGauche

gauche-library-directory探訪000:はじめに

gaucheのライブラリをのぞいて、目についたものを書いていくシリーズ(謎
ライブラリならドキュメントを見れば済むんだけど、今回はライブラリのソースものぞいてみるということで。

準備

gaucheにgauche-library-directoryという手続きがある。 こんな感じ。
$ rlwrap gosh
gosh> (print (gauche-library-directory))
/usr/local/share/gauche-0.9/0.9.2/lib
今後しばらくのぞいていくのは上記のディレクトリ。ということでshellで以下のように移動する。
$ cd `echo '(print (gauche-library-directory))' | gosh`
まずはどこからのぞくか。次回に続く(?)

プログラミングGauche

2011/11/16

2011/11/16

最近の雑多なコマンド(gauche)

某所で見たTwitterのfollow関係を表示するスクリプトのコマンド版。
$ ./twitter-friendship valvallow hoge
プログレス付きのタイマーコマンド。結果はnotify-sendか何かに渡すということで。←変更が必要そう。←プログレスをエラーポートに出力するようにした。
$ ./progress-timer -t hoge -s 10s timer
$ notify-send `progress-timer -s 3s -t hoge fuga`


プログラミングGauche

2011/11/13

2011/11/13

shellからterminalの幅と高さを取得(tput)

$ tput cols
191
$ tput lines
44

tcpdump

$ sudo tcpdump -n -i wlan0

chromium proxy

preferenceからやるよりこっちが簡単
chromium-browser --proxy-server=proxy:port

gaucheでgoogleの非公開apiを使って天気を取得するコマンド

某所で掲題のようなgaucheのコードを見かけたのでコマンドにしてみた。
$ ./weather kumamoto
kumamoto:2011-11-12
condition:Cloudy
temp_f:60
temp_c:15
humidity:Humidity: 77%
icon:/ig/images/weather/cloudy.gif
wind_condition:Wind: E at 0 mph

day_of_week:Sat
low:52
high:73
icon:/ig/images/weather/mostly_sunny.gif
condition:Partly Sunny

day_of_week:Sun
low:46
high:70
icon:/ig/images/weather/mostly_sunny.gif
condition:Mostly Sunny

day_of_week:Mon
low:37
high:63
icon:/ig/images/weather/sunny.gif
condition:Clear

day_of_week:Tue
low:41
high:64
icon:/ig/images/weather/sunny.gif
condition:Clear
$ ./weather -j kumamoto
{"date":"2011-11-12","current":{"condition":"Cloudy","temp_f":"60","temp_c":"15","humidity":"Humidity: 77%","icon":"/ig/images/weather/cloudy.gif","wind_condition":"Wind: E at 0 mph"},"in_the_future":[{"day_of_week":"Sat","low":"52","high":"73","icon":"/ig/images/weather/mostly_sunny.gif","condition":"Partly Sunny"},{"day_of_week":"Sun","low":"46","high":"70","icon":"/ig/images/weather/mostly_sunny.gif","condition":"Mostly Sunny"},{"day_of_week":"Mon","low":"37","high":"63","icon":"/ig/images/weather/sunny.gif","condition":"Clear"},{"day_of_week":"Tue","low":"41","high":"64","icon":"/ig/images/weather/sunny.gif","condition":"Clear"}]}#% 
ソースはこちら

関連

プログラミングGauche

2011/11/12

2011/11/12

冠婚葬祭のひみつ

先日、未来の二つの顔 (創元SF文庫)を読み終わったので、母親から借りている本10冊くらいの中から適当に見繕って読んでいた。ここ数日風邪でダウンしていたので本を消化していたわけです。

で、その中に掲題の本があった。 これ面白い(笑)母親からも「これ面白いから読んでみ」ってことだった。まだ読み終わったわけではないけど頭っから掴みはOK。「へぇーへぇー」状態。

冒頭は結婚式についての話から入るんだけど、神前式のルーツは意外に新しくて明治33年に行われた、後の大正天皇の結婚式からというお話。当時は日清戦争と日露戦争の間の年で、国としては「神の国」のイメージを固め、富国強兵を推し進めたいという背景からだそう。
かといって、神前式の前は仏前式だったかというとそうでもなく、そもそも仏教的には開祖が妻帯者(親鸞)だった浄土真宗以外は出家者の結婚なんてもっての外だったらしい。なるほど。僧侶の妻帯が認められたのは明治以降だという。なんと仏前式の歴史もそうとう短いぞ。
じゃあ、寺は葬式だけやってたのか?というとそうではなく、江戸時代以前の寺は「葬式?んなもん在家にやらしときゃいんだよ」というスタンスだったらしく、葬式にも大して関わっていなかったんだって。(じゃあ何してたの?)

江戸時代以前は僧侶もフリーランスが多かったらしい。江戸時代に入ってからキリシタンの取締が強化され、寺が周辺住民の管理を行う役所みたいな役割を担うようになる。どこそこの誰々は○○寺の門徒(つまりキリシタンではないことの証明)、というような住民台帳ようなもの(宗門人別帳)の管理をするようになった。
で、これ以降、寺が葬式に関わるようになる。地域の寺にはそれぞれ本寺(本家的なもの)があり、定期的に上納金を払わないといけないわけ。で、地域の寺はどこからそのお金を集めるかというと、自分たちの下のヒエラルキーに位置する門徒。建前として仏壇や位牌や戒名という制度ができて、葬式と定期的な先祖供養を寺が行うんだから手数料と謝礼払うのは当然だよね?仏壇も買うよね?戒名ないとあの世でどんな目に合うかわかってる?という搾取システムができあがったんだと。面白ぇー。

これが冒頭。

以前から結婚式や葬式に対してモヤモヤした感覚があった。
新郎新婦ですらよく知らない、政治的な理由で出席しているどこの誰かわからない社会的地位だけは高い小汚いおっさんの超絶つまらん話をえんえん聞かされ、出席者の中に友人が少ないなーと思って聞いてみるとこれまた新郎新婦本人たちとは直接関係のないところの事情でわけのわからん老人たちがたくさん出席するため友人の招待を減らしたとかいう誰のためかわからない結婚式。
葬式は葬式で、「故人とはそんなに交流なかったけど、こないといけない気がした」みたいなアホ面下げた参列者がたくさんいる通夜。談笑ばかりしてたいして悲しそうでもない葬儀参列者。なんだんだ?と思っていたので、結婚式はともかく、葬式は本心から「故人に最後のお別れをしたい」と思える人の葬儀にだけ出席するようにしていた。それも最近は少し考えが変わって、行けば遺族が喜んでくれそうな場合は行くようにしようかなーと思うようになった。

話がそれた気がした。この本は、そういった感覚に何か裏付けを与えてくれそうな気がしたという話。

目次

  • 第1章 冠婚葬祭の百年
    • 明治の家と冠婚葬祭
    • 昭和の結婚と優生思想
    • 「冠婚葬祭入門」とその時代
    • 少婚多死の時代を迎えて
  • 第2章 いまどきの結婚
    • 今日的ウェディング狂想曲
    • 結婚式に招待されたら
    • 多様化する結婚の形
    • 変容する通過儀礼
  • 第3章 葬送のこれから
    • 現代葬儀の基礎知識
    • 死の準備はどこまで必要か
    • 身近な人の死に際して
    • 遺骨のゆくえ
  • もっと知りたい人のためのブックガイド


関連

そういえば読み終わってから感想書いてなかった。すごくおもしろかったので書こう。

冠婚葬祭のひみつ (岩波新書)

2011/11/09

2011/11/09

パインアメ1kgパック

わさおに教えてもらった。光速でポチった。
ちょっとしたクッションくらいの大きさ。


実用 Common Lisp よりデカくて分厚い。


こっちの方がお得みたいだけど。

追記

もっとわかりやすい比較にしてみた。


実用 Common Lisp (IT Architects’Archive CLASSIC MODER)

gaucheのtext.progressとtputコマンド(コマンド?)

gaucheにtext.progressなるモジュールがあることを知ったので、早速サンプルを動かしてみました。
ふと疑問に思ったのが、こういうことやる時ってcursesってヤツがいるんじゃないの?ってこと。ソース見てみたら、CRで行頭復帰してるだけだった。ウロコー!

こんな感じ。
#!/usr/local/bin/gosh

(use srfi-1)
(for-each (^i (format (current-output-port) "~a\r" i)
              (flush)
              (sys-select #f #f #f 50000))
          (iota 256))


Gauche-cursesとかGauche-ncursesはないかとググったら、メンテされてなさそうなのがひっかかった。ついでにChicken Schemeのeggを調べたらncursesがあった。あとで試してみよう。
で、curses拡張がないならどうしたらいいのか?調べてみたらtputなんてものがあるんですね。
試しにやってみたらこんな感じ。topコマンドを実行したときみたいな。
!/usr/local/bin/gosh

(use gauche.process)

(dynamic-wind
  (^ _ (run-process '(tput "civis"))
     (run-process '(tput "clear")))
  (^ _(do ((i 0 (+ i 1)))
          ((= i 256))
        (format (current-output-port) "~a\r" (make-list 100 i))
        (sys-nanosleep 10000000)
        (run-process '(tput "cup" 0 0))
        (flush)
        (sys-select #f #f #f 50000)))
  (^ _ (run-process '(tput "cnorm"))))

こりゃ便利だなーということで、以前作ったライフゲームをコマンドにしてみた。
$ ./lifegame2.scm -s 100 -w 30


プログラミングGauche

2011/11/05

2011/11/05

Linuxでterminalからguiを自動操作(automation)

こういうものがあった。 先日C#で作ってKPFで紹介した「windowを制御するdsl」と同じだ・・・。というかもっとちゃんとしてる。。 試しに無限にクリックし続けるshell script書いて、Love Languages?で試してみたり。
#!/bin/sh

while :
do
        xte 'mouseclick 1'
        sleep 0.3
done


詳解 シェルスクリプト

ておくlet

defmacro
(define-macro (teoku-let binds . body)
  `(let ,(map (lambda (ls)
               (cons (car ls)'("ておくれ"))) binds)
     ,@body))

(teoku-let ((wasao 68)
            (gentoo 'linux)
            (kumamoto "熊本"))
       (print wasao)
       (print gentoo)
       (print kumamoto))
;; ておくれ
;; ておくれ
;; ておくれ


syntax-rules
                                                                                                                     
(define-syntax teoku-let
  (syntax-rules ()
    ((_ () body ...)
     (let ()
       body ...))
    ((_ ((var val) x ...) body ...)
     (let ((var "ておくれ"))
       (teoku-let (x ...)
                  body ...)))))

(teoku-let ((wasao 68)
            (gentoo 'linux)
            (kumamoto "熊本"))
       (print wasao)
       (print gentoo)
       (print kumamoto))
;; ておくれ
;; ておくれ
;; ておくれ


プログラミングGauche

JavaベースのScheme

ググった結果をざっくり

JVM上のlisp

参考



プログラミングClojure

2011/11/01

最近の雑多なコマンド(gauche)

現実逃避駆動スクリプティング。使い捨てでいいんだけど、あえてコマンドにしました的な。

jsonとalistを相互に変換。
$ echo '(("a" . 1)("b" . 2)("c" . (("d" . #(1 2 3)))))' | json2alist -a 
{"a":1,"b":2,"c":{"d":[1,2,3]}}
$ echo '(("a" . 1)("b" . 2)("c" . (("d" . #(1 2 3)))))' | json2alist -a | json2alist
(("a" . 1) ("b" . 2) ("c" ("d" . #(1 2 3))))  


csvをjsonに。csvをtemplate engineに渡すときにかましたり。
$ echo '1,2,3\n4,5,6\n7,8,9'| csv2json
"{\"title\":\"\",\"lines\":3,\"body\":[[\"1\",\"2\",\"3\"],[\"4\",\"5\",\"6\"],[\"7\",\"8\",\"9\"]]}"    


jsonからkeyを取得したり、指定したkeyの値を取得したり。
$ echo '{"a":1,"b":2,"c":{"d":[1,2,3]}}' | pryon -k                                           
a                                                                                                  
b                                                                                                  
c                                                                                                  
$ echo '{"a":1,"b":2,"c":{"d":[1,2,3]}}' | pryon -t                                            
object                                                                                             
$ echo '{"a":1,"b":2,"c":{"d":[1,2,3]}}' | pryon -l                                                
3                                                                                                  
$ echo '{"a":1,"b":2,"c":{"d":[1,2,3]}}' | pryon -e c                                              
{"d":[1,2,3]}                                                                                   
$ echo '{"a":1,"b":2,"c":{"d":[1,2,3]}}' | pryon -e c | pryon -e d                                   
[1,2,3]                                                                                         
$ echo '{"a":1,"b":2,"c":{"d":[1,2,3]}}' | pryon -e c | pryon -e d | pryon -i 2                      
3

最後のやつは、jshonってののライト版的ノリで。ちょっと便利。というかjshonがうまいこと動いてくれなかったので仕方なく。

プログラミングGauche

terminal で json pretty print

terminalからweb apiを呼んで返ってきたjsonを見るときに。pythonはだいたいどこでも入ってるし。
python -m json.tool
wget -O - http://foo:piyo@hogehoge.com/api/fuga | python -m json.tool

例えばこんな感じ。
% wget -O - "https://api.twitter.com/1/statuses/user_timeline.json?id=valvallow&count=1" 2> /dev/null | python -mjson.tool
[
    {
        "contributors": null,
        "coordinates": null,
        "created_at": "Tue Nov 01 15:04:22 +0000 2011",
        "favorited": false,
        "geo": null,  
        "id": 131386101536526337,
        "id_str": "131386101536526337",
        "in_reply_to_screen_name": "sasagawa888",
        "in_reply_to_status_id": 131385453638201344,
        "in_reply_to_status_id_str": "131385453638201344",
        "in_reply_to_user_id": 236352281,
        "in_reply_to_user_id_str": "236352281",
        "place": null,
        "retweet_count": 0, 
        "retweeted": false, 
        "source": "twicli", 
        "text": "@sasagawa888 \u305d\u3046\u3067\u3059\uff3e\uff3e\uff1b", 
        "truncated": false, 
        "user": {
            "contributors_enabled": false, 
            "created_at": "Mon May 14 04:57:45 +0000 2007", 
            "default_profile": false, 
            "default_profile_image": false, 
            "description": "S\u5f0f\u304c\u597d\u304d\u3002\u660e\u65e5\u304b\u3089\u672c\u6c17\u51fa\u3059\u3002\u306e\u3093\u3073\u308a\u751f\u6d3b\u3057\u305f\u3044\u3002", 
            "favourites_count": 2686, 
            "follow_request_sent": false, 
            "followers_count": 1648, 
            "following": true, 
            "friends_count": 1395, 
            "geo_enabled": false, 
            "id": 6023392,
            "id_str": "6023392",
            "is_translator": false,
            "lang": "ja",
            "listed_count": 163,
            "location": "kumamoto",
            "name": "\u3057\u3083\u308c\u3053\u3046\u3079\u4e59",
            "notifications": false,
            "profile_background_color": "FFFFFF",
            "profile_background_image_url": "http://a0.twimg.com/profile_background_images/655452/Half_docro.jpg",
            "profile_background_image_url_https": "https://si0.twimg.com/profile_background_images/655452/Half_docro.jpg",
            "profile_background_tile": false,
            "profile_image_url": "http://a0.twimg.com/profile_images/557761803/dokuro33whitebig_normal.JPG",
            "profile_image_url_https": "https://si0.twimg.com/profile_images/557761803/dokuro33whitebig_normal.JPG",
            "profile_link_color": "000000",
            "profile_sidebar_border_color": "000000",
            "profile_sidebar_fill_color": "D3D3D3",
            "profile_text_color": "000000",
            "profile_use_background_image": true,
            "protected": false,
            "screen_name": "valvallow",
            "show_all_inline_media": false,
            "statuses_count": 30993,
            "time_zone": "Tokyo",
            "url": "http://valvallow.blogspot.com/",
            "utc_offset": 32400,
            "verified": false
        }
    }
]
webならここがいい。

矩形スクリーンショット

$ gnome-screenshot --area

notify-sendでラーメンタイマーというかリマインダ(ubuntuおまけでcygwin+growl for windows)


ちょくちょくあるんですよ、n分後にアラートして欲しいとか、何かしらの処理が終了したら通知して欲しいとか。 そこでnotify-sendとmplayerでいい感じに通知してもらえたのでメモ。

例えば下記の場合、3分経ったら上の画像のようなアラートを表示して音楽を流してくれます。
$ sleep 3m && notify-send -i /your/icon/path/terminal.png 'noodle !!'  && mplayer /your/music/path/notify.ogg > /dev/null 2> /dev/null

長いコンパイル、デカいファイルのコピーなんかの時に仕込んでおくと便利そう。いい感じのaliasを設定しときたいですね。

cygwin

cygwinの場合は、growl for windowsがインストールされてい(てかつgrowlが常駐して)れば下記のようにできる。
$ sleep 3m ; /cygdrive/c/Program\ Files/Growl\ for\ Windows/growlnotify.exe /i: "c:\your\icon\path\notify.png" /t:"hoge" 'Ha!!' 


参考



追記

alertって名前でshellスクリプト書いてみた。sh -x ./alert でtrace情報っぽいのが出るんですね。
!/bin/sh
                                                                                                  
ICON="/your/icon/path/icon.png"
MUSIC="/your/music/path/music.png"
                                                                                                   
while getopts s:m: OPT
do
        case $OPT in
                "s" ) FLG_SLEEP="TRUE" ; VALUE_SLEEP="$OPTARG" ;;
                "m" ) FLG_MESSAGE="TRUE" ; VALUE_MESSAGE="$OPTARG" ;;
        esac
done 
                                                                                                   
if [ "$FLG_SLEEP" = "TRUE" ]; then
        sleep $VALUE_SLEEP
fi
if [ "$FLG_MESSAGE" = "TRUE" ]; then
        notify-send -i $ICON "$VALUE_MESSAGE"
fi
mplayer $MUSIC > /dev/null 2> /dev/null

以下のように実行すると、3秒後に音楽とともにgrowlっぽいものが表示される。
$ alert -s 3 -m 'Hello, world !!'


詳解 シェルスクリプト