2013/07/30

iotaの由来(素数夜曲)

素数夜曲: 女王陛下のLISPに書いてあった。

P.474 脚注1)

なおこの名称は, 「その内容である index の頭文字を採用するに当たり, より印象的にする為に対応するギリシア文字イオタιを用いたことに因る」とされている.

この素数夜曲: 女王陛下のLISPは前半(というか本編?)の数学がP.332まで、後半のP.333からP.834までschemeによる付録(付録!?)で、その他付録含めトータル871ページで3,600円というお得な本。

SICPを読む前に読む本」とか「SICPに挫折した人のための本」とかそういうススメられかたをされる。Scheme手習いScheme修行も似たようなススメられかたをするけど、難易度で言えば素数夜曲の方が難しく手習いと修行の方が易しい。

説明が丁寧でわかりやすく、とくに後半のScheme部分がすごくいい。継続の説明が平易でわかりやすい。

2013/07/29

postfixでリレー潰したり

なかなか大変なのね。

現在ではSPAMがビジネスとして確立している反面、SPAMを受け取るヒトの大部分は多大なる迷惑をこうむっている。そのため、SPAMの温床となるオープンリレーのメールホストは基本的には設定しないことがスタンダードとなっている。

logwatchが死んでると思ったらpostfixが死んでた

気づいたらlogwatchのメールが来なくなってた。サーバーでlogwatchすると何事もなく完了するけどメールこない。--output=stdoutオプションつければ当然terminalに表示される。初めはどこかの段階でスパム扱いされて詰まってるのかと思ったがそうでもない。メールのログを見たら、ある時からログがでてない。sudo service postfix statusしたらpostfixが死んでた。なんでかわがらね。

ところで、logwatchみたいなノリでgitwatchみたいなのないのかね。

perl: warning: Setting locale failed ・・・なんたらかんたらの警告

検索するといろんな解決方法が出てくる。.bashrc|.zshrc|.profileなどに環境変数設定してexportしろとか、/etc/default/localesに書けとか、localのsshd_configdからSendEnv LANG LC_*をコメントアウトしろとか、/etc/environmentに書けとか。

「localのsshd_configdからSendEnv LANG LC_*をコメントアウト」で解決したかに見えたけど、sudoする時に同じ警告。結局、下記の方法で解決。

% sudo locale-gen en_US
% sudo update-locale LANG=en_US.UTF-8

SSHでログインパスワード入力時にUbuntuのバージョンが表示されてた

目障りだったので消した。/etc/ssh/sshd_configのBannerのとこをコメントアウトしたら消えた。

ほんであとは、telnetでSSHポートにつないだ時にでるOpenSSHのバージョンを消したいんだが、まだ調べてない。

追記

表示が必要なようで。

2013/07/27

VPSのOSをCentOSからUbuntuに変更

やっと手をつけた。以前からやろうやろうと思っていたけど後回しにしていた。本当はFreeBSDにしたいんだけど、Serversman@VPSだと一番上のプランでしか選択できないので、やっぱUbuntu。変更自体は簡単なんだけど、ubuntuが10.10なので12.04までupgradeしたらコケた。のでやり直し。11.04まで上げた。ほんでユーザーを追加、SSHの設定、zsh,git,rlwrap,gauche,logwatch,build-essential入れて完了。焼肉食べたい。これまではdyndnsとddclientを使っていたんだけどdyndnsが有料になっちゃったみいなので、ついでにドメイン取得。

追記

せっかくなのでGauche-makikiを試してみた。ほめぱげ作って全世界に情報を発信するお!(違

2013/07/26

CygwinでGaucheのHEADを./DIST genするとコケるのでubuntuで./DIST tgzしてる

タイトルが全てだ。autotools周りとm4のバージョンの関係でコケてるっぽい。調べたけど解決できなくて諦めてる。

2013/07/25

マンガ本のオススメ的なやつ

マンガを読みたくなる時って、たまたまレンタル屋さんに居るときがほとんどなので準備不足も甚だしく、結局何も借りなかったり。
こういうまとめのまとめみたいなのを書いといても結局見ないんだろうけどな。

gitのコミットログの集計

普通はどうやって集計してるのかな。コミットログを月間集計などして投げつけたりしてるんですか?誰がどのプロジェクトにどのくらいコミットしてるか毎日投げつけたりしてるんですか?そういう便利なツールがあるんですか?それともshellscript+cronとかですか?

追記

crontabの恐怖

今度からgitで管理するわ・・・。

追記

コメント欄で教えてもらったステキツール。

gitのalias削除

git config --global --unset alias.myAlias

以下すべて余談だけど、gitに限らずshellでもあまりaliasは設定しない。人によってはかなりいろいろ設定するらしいですが、他の環境で困りません?.zshrc確認したらこんだけだった。

alias screen='screen -S main -UxRL'
alias ls='ls --color=always'
alias rm='rm -i'
alias mv='mv -i'
alias hd='hexdump'
alias diff='colordiff -u'
alias rlwrap='rlwrap -pCYAN'
alias less='less -R'
alias grep='grep --color=always'

VirtualBoxで動いてるUbuntuのSSHに外部から接続できなくなった

原因を突き止めるまでに2時間もかかってしまったツライ。対策はまだない。

原因はVMのネットワーク設定だった。VMのNICを有線LANアダプタのみから、有線LANアダプタ+無線LANアダプタに変更したことが原因だったようだ。VMのネットワーク設定で無線LANアダプタを無効にしたら外部から のSSH接続ができるようになった。

社内ローカルネットワークからのSSHには全く問題がなかったので発見が遅れた。外からの接続はWiMAX、EasyTether、ConnectBotからsshとSSHポートへのtelnetで試した。hosts.denyとhosts.allowも全消し、iptables全消し、selinuxも停止(というか入れてない)、ufw停止の状態でも外からの接続が記録されてないなかった。VirtualBoxでVMのNICを2つ以上にした時にルーターのIPマスカレードがうまくいっていないのか?

その後

原因がわかったところで力尽きたので同僚にバトンタッチ。tcpdumpしたりなんやかんやで原因の詳細と解決までしてくれました。いつもありがとうございます&いつもすいません。

で、原因はdefault gatewayが2つ登録されていたことみたい。

ネットワーク周りは楽しいけど、ほんと難しいなあ・・・。

そういえば、/etc/ssh/sshd_configにListenAddressを書いてなかったので一応下記加えたみたい。

2013/07/19

Asteriskから光電話ルータ(AD-200NE)への接続が成功

Asteriskを光電話にregisterする作業を同僚にバトンタッチ!register成功!(爆)

うまくいかなかった根本的な原因は、AsteriskがAD-200NEにぶら下がっていないためでした(汗)sip.confいじっても、パッチあててもうまくいかない、うーん。となっていたところ、「そういえばAsteriskに限らず、WindowsのsipクライアントソフトやAndroidのsipホンアプリなりで登録できるか試していないよね。」ということで、試してみたらregisterできず。AD-200NE実機を目視確認。うちのAD-200NEは、メインのルータにWANポートで繋がっていたのでした。なので、AsteriskをAD-200NEにぶら下げてregisterすると登録できたという流れ。なんてこったい。Asterisk以外の子機がregisterできるか、もっと早くに試しておくべきことでしたね。

ちなみに、apt-getで入る1.8.10系は繋がらない、wikiにあるパッチはどうやら必要、sip.confのregister=>内線番号:パスワード:ユーザID@AD-200NEの@以降はIPでないと繋がらなかったみたい。

2013/07/16

Google Listenの代替

Google ReaderとGoogleListenの終了に伴って、Podcastを聞くためのアプリを探していた。

いくつか試したけど、Beyondpodってのがよかったので使っている。

せっかくだから他にもPodcastのRSS登録しようと物色していたら「新刊ラジオ」というのがあった。これがなかなか面白い。聴いてると読みたくなる。

胃腸炎でダウンして寝込みつつ、いくつか聴いてた。モルフェウスの領域って本、読みたくなった。

そんなにしょっちゅうPodcast聴いてるわけじゃないけどな。ちなみにお気に入りは、Hiroshima University's English Podcastの「やさしい英会話」シリーズ。

エンジニア向けっぽいのだと、Software Engineering Radioってのがある。Clojureのりっちひっきーとか巨人がいすてぃーるのインタビューなんかがある。

感染性胃腸炎

だろうと思う。会社の同僚も同じようにやられている。

日曜日の昼からとにかく腹を下しまくり、夕方から熱が出始め、19時から夜中までずっと39度前半。数時間もすれば熱も下がり始めるだろうと思っていたら甘かった。そのままじゃ寝れないので、観念して市販の解熱剤を飲んだ。それでも下痢と頭痛と発熱でほとんど寝れなかったわけだが。

今日は火曜日。熱は平熱より少し高い微熱まで落ち着いたけど、まだ下痢が続いている。すごいなこの胃腸炎。早めに病院に行っていればよかった。明日は会社に行けそうだ。

腹へった

2013/07/10

Re: 僕と契約してLisperになってよ!-Gaucheの開発環境を整えよう-

Vim派であれば、またはEmacsもVimも嫌いなら。

Vim派なら

EmacsもVimも嫌い

EmacsもVimもSublime Text 2も嫌いなら

Gauche本体とrlwrapを入れるだけでも十分書ける。

  1. 好きなエディタでGaucheのコードを書く。
  2. shellでgoshに書いたコードのファイルを渡す。

hoge.scm

#!/usr/local/bin/gosh
(print "Hello, world !!")
% gosh hoge.scm

または

  1. 好きなエディタでGaucheのコードを書く。
  2. 先頭行に #!/usr/local/bin/gosh などとgoshのパスを書く。
  3. 実行できるようにpermissionを設定する。
% sudo chmod 755 ./hoge.scm
% ./hoge.scm

といった感じ。

rlwrapについては、サンプルを動かしたり、コード片の実行結果を確かめたりするのに便利。rlwrapを使うとgoshのreplでC-pとかC-nとかC-aとかC-eとかShellのやEmacsで慣れ親しんだキーが使えます。プロンプトに色をつけたり。

% rlwrap gosh

-pオプションでプロンプトに色がつくのでaliasにしとくといいかも

% rlwrap -pCYAN

ubuntuであれば

% sudo apt-get install rlwrap

でインストールできます。

Emacs

一応Emacsのことも。

余談

自分は、SchemeやLispつまりS式を書くときはEmacsを使います。その理由はEmacs標準のC-p、C-n、C-a、C-e、C-kなどのキーバインド以外に、C-M-tとかC-M-f、C-M-b、C-M-u、C-M-d、M-(、C-x r、C-xC-eなどのS式用のコマンドが便利過ぎるからです。これがVimにあったらVimに完全に移行するのになあ。今はS式以外ではVim、S式を書くのとorg書式の文章を書くときにEmacs。両方とも使ってる。でもVisual StudioもChromeもVimキーバインド。

完全に引きこもる覚悟があればEmacsはすごくいいけど、Shellを拠点にしているのであればEmacsは大げさで邪魔なことが多い。起動遅いし(serverあるけどさ)。CTRLキー押しっぱなしでの移動はtypoが多くなるし。Vimだとそういう心配がなくて、なんというかストレスが少ない。Emacsでも閲覧専用のViewモードでVimキーバインドを設定しているけど、やっぱり本家Vimには負ける。

マンガとアニメのちょっとしたアレ

こういうまとめ助かるわー。「今季熊本で見れるアニメまとめ」とか誰かやってくれない?ってかそういうのない?誰かうまいことやってくれませんか。

そういやうちの奥さんが会社でもらってきたITパスポート試験のパンフがみっくみくしててびっくりしたわ。

CSVをSQL文に変換する

以前、必要だったのでザックリ書いたスクリプトだけど、便利だったんで結構使用頻度が高い。使うたびに修正したり機能追加されてる。あんまりちゃんとしたスクリプトでもないけど重宝してる。こういうのって普通はExcelとかで生成したりするもんなんだろうか?昔いた会社ではExcelで生成してたなあ。あれはあれで慣れれば便利なのかもしれん。慣れたくないけどな。

SQLつながりだけど、プログラマのためのSQL第4版が出てるんですね。ちょっと読んでみたい。第2版だったかなー、本屋で数時間立ち読m(ゲフンゲフン

nkfで全角カナを半角カナに変換

全角を半角に変換するのは「-Z4」オプション。そんなオプションまであんのかい。大好きだわnkf。

zshのテーマ

zshを使っているけどカスタマイズはほとんどしていない。最初にzshを起動した時に出てくる「取りあえずオススメ設定の.zshrc使っちゃう?」的なのものに、いくつか設定やaliasを追加して使っている。

家もVPSも会社も会社のサーバーも同じ.zshrcなんだけど、会社のローカルと会社のサーバーで区別がつかないのは流石に紛らわしいと感じていた。ぐーぐる先生に尋ねてみたら、zshって予めプロンプトのテーマが用意されているんですね。なので、サーバーだけプロンプトのテーマを替えました。

2013/07/07

スーツ用のシャツを新調した

しばらく前にスーツを2着ほど新調した。最近のスーツは細身で、特にパンツがすごく細い。いいと思う。でも着てみるとなぜかシャツに違和感がある。どうもダブついて見える。サイズはMで合っている。だけどウエスト周りがどこか不恰好だ。妻のススメでスリムタイプのシャツを買ってみた。Oh、シャレオツ。スーツと合わせてみるといい感じじゃないか。これは非常に気分がいい。気分が良くて人生が豊かになった。出張に行きたくなった。しかし、珍しくもしばらく出張の予定がないのであった。

追記

そういえば、もうひとつ些細なことだけど気分の良いことがあったんだった。ひげ剃り用のシェーバーを買い換えた。ラムダッシュってやつ。安いんだけど、剃り心地が良くてご機嫌である。ずっとカミソリ派だったけど、1年ほど前からシェーバーを使うようになった。取りあえずはとんでもなく安いシェーバーを使ってたんだけど、もう少しだけまともなものを試しに買ってみたわけ。

2013/07/06

このページなんでこんなにアクセスが多いのかわからない

この二つの記事、なぜかすごくアクセス数が多い。はてブされてるわけでもないし。わからん。

そういえば来週の金曜日、7/12はJ.P.ホーガンの命日ですね。もう3年も経つのか。幼年期の終わりはホーガンじゃないけどな。

Gaucheで各種ソートアルゴリズム

ソートアルゴリズムって、ふざけたもの含めて結構あるんだなー。ふざけてる系がすごく面白い。ボゴソートとかボゾソートとかパーミューテーションソートとか(笑)あとは基数ソート、ビーズズートなんかのバケツっぽいのが好きだなあ。スパゲティソートもいいなあ(w

Wikipediaにあったソート。ソートじゃないのも入ってるかも。


Gauche

Gaucheで書いてみたのが、今んとこ以下のもの。

気が向いたらsortカテゴリで追加していこうかな。

ところでGaucheのsortはイントロソートの親戚なのかな?

Gaucheの組み込みの(Cで実装された)ソートはデフォルトではQuick Sortで始めて、 再帰の深さが ceiling(2*log(N)) を越えた時にHeap Sortにスイッチするように してる。

参考

「リストをn個ずつのサブリストに分割 (Python)」をGaucheで

Gaucheにはそのものズバリなslicesという手続きがある。

(slices '(a b c d e f g) 3)
  ⇒ ((a b c) (d e f) (g))
(slices '(a b c d e f g) 3 #t 'z)
  ⇒ ((a b c) (d e f) (g z z))

で、それは置いといて、Pythonのzip(*[iter(s)]*n)ってのは、n個のiteraterを作ってzipしてるってことだと思う(python知らね)。

Gaucheだとgeneratorを使って実現できるんじゃないかな。Gaucheにもzip手続きはあるけど、gzipはない。gzipなしで書くとこんな感じのことかな。

(use gauche.generator)
(generator->list (apply gmap list (make-list 3 (giota 15))))
;; => ((0 1 2) (3 4 5) (6 7 8) (9 10 11) (12 13 14))

gzipを定義するとしたらこんなんでいいのかな。

(use gauche.generator)

(define (gzip . list-of-list)
  (apply gmap list list-of-list))

(generator->list (apply gzip (make-list 3 (giota 15))))
;; => ((0 1 2) (3 4 5) (6 7 8) (9 10 11) (12 13 14))

Gaucheでstrand sort

その他のソート

ソース

(define (strand-sort ls)
  (define (merge ls1 ls2)
    (let rec ((ls1 ls1)(ls2 ls2)(acc '()))
      (cond ((null? ls1)
             (reverse (append (reverse ls2) acc)))
            ((null? ls2)
             (reverse (append (reverse ls1) acc)))
            ((< (car ls1)(car ls2))
             (rec (cdr ls1) ls2 (cons (car ls1) acc)))
            (else (rec ls1 (cdr ls2)(cons (car ls2) acc))))))
  (define (filter-sorted-elements ls)
    (if (null? ls)
        '()
        (let rec ((ls (cdr ls))(sorted (list (car ls)))(acc '()))
          (if (null? ls)
              (values (reverse sorted)
                      (reverse acc))
              (let1 sorted? (< (car sorted)(car ls))
                (rec (cdr ls)
                     (if sorted?
                         (cons (car ls)
                               sorted)
                         sorted)
                     (if sorted?
                         acc
                         (cons (car ls) acc))))))))
  ;; body
  (let rec ((ls ls)(acc '()))
    (if (null? ls)
        acc
        (receive (sorted rest)
            (filter-sorted-elements ls)
          (rec rest (merge sorted acc))))))


(use gauche.sequence)
(define (test sorter n)
  (for-each (^i (let1 ls (shuffle (iota (expt 10 i)))
                  (print "; length = " (expt 10 i))
                  (time (sorter ls))
                  (print)))
            (iota n 2)))

(test strand-sort 5)
; length = 100
;(time (sorter ls))
; real   0.000
; user   0.000
; sys    0.000

; length = 1000
;(time (sorter ls))
; real   0.005
; user   0.000
; sys    0.000

; length = 10000
;(time (sorter ls))
; real   0.215
; user   0.210
; sys    0.010

; length = 100000
;(time (sorter ls))
; real   6.727
; user   6.710
; sys    0.000

; length = 1000000
;(time (sorter ls))
; real 205.260
; user 204.550
; sys    0.100

Gaucheでbogo sort

これはsleep sortを見て以来の衝撃だな・・・。

その他のソート

ソース

(use gauche.sequence)

(define (bogo-sort ls)
  (if (apply < ls)
      ls
      (bogo-sort (shuffle ls))))


(define data-5 (shuffle (iota 5)))
(define data-10 (shuffle (iota 10)))
(define data-15 (shuffle (iota 15)))

(time (bogo-sort data-5))
;(time (bogo-sort data-5))
; real   0.001
; user   0.000
; sys    0.000

(time (bogo-sort data-10))
;(time (bogo-sort data-10))
; real  12.053
; user  12.010
; sys    0.000


Gaucheでmerge sort

その他のソート

ソース

(use srfi-1)
(define (merge-sort ls)
  (define (merge ls1 ls2)
    (let rec ((ls1 ls1)(ls2 ls2)(acc '()))
      (cond ((null? ls1)
             (reverse (append (reverse ls2) acc)))
            ((null? ls2)
             (reverse (append (reverse ls1) acc)))
            ((< (car ls1)(car ls2))
             (rec (cdr ls1) ls2 (cons (car ls1) acc)))
            (else (rec ls1 (cdr ls2)(cons (car ls2) acc))))))
  (if (or (null? ls)
          (null? (cdr ls)))
      ls
      (let1 split-index (quotient (length ls) 2)
        (receive (head tail)
            (split-at ls split-index)
          (merge (merge-sort head)
                 (merge-sort tail))))))



(use gauche.sequence)
(define (test sorter n)
  (for-each (^i (let1 ls (shuffle (iota (expt 10 i)))
                  (print "; length = " (expt 10 i))
                  (time (sorter ls))
                  (print)))
            (iota n 2)))

(test merge-sort 6)


; length = 100
;(time (sorter ls))
; real   0.000
; user   0.000
; sys    0.000

; length = 1000
;(time (sorter ls))
; real   0.002
; user   0.010
; sys    0.000

; length = 10000
;(time (sorter ls))
; real   0.025
; user   0.030
; sys    0.000

; length = 100000
;(time (sorter ls))
; real   0.288
; user   0.280
; sys    0.000

; length = 1000000
;(time (sorter ls))
; real   3.422
; user   3.370
; sys    0.030

; length = 10000000
;(time (sorter ls))
; real  40.993
; user  40.620
; sys    0.240

Gaucheでselection sort

その他のソート

ソース

(use srfi-43)
(define (selection-sort ls)
  (define (vector-min-index vect start-index)
    (do ((i start-index (+ i 1))
         (min-value +inf.0)
         (min-index 0))
        ((= i (vector-length vect))(values min-index min-value))
      (when (< (vector-ref vect i) min-value)
        (set! min-value (vector-ref vect i))
        (set! min-index i))))
  ;; body
  (do ((i 0 (+ i 1))
       (vect (list->vector ls)))
      ((= i (length ls))(vector->list vect))
    (vector-swap! vect i (vector-min-index vect i))))


(use gauche.sequence)
(define (test sorter n)
  (for-each (^i (let1 ls (shuffle (iota (expt 10 i)))
                  (print "; length = " (expt 10 i))
                  (time (sorter ls))
                  (print)))
            (iota n 2)))

(test selection-sort 4)
; length = 100
;(time (sorter ls))
; real   0.001
; user   0.000
; sys    0.000

; length = 1000
;(time (sorter ls))
; real   0.030
; user   0.030
; sys    0.000

; length = 10000
;(time (sorter ls))
; real   2.614
; user   2.610
; sys    0.000

; length = 100000
;(time (sorter ls))
; real 255.403
; user 254.710
; sys    0.020

Gaucheでbozo sort

これもボゴソートと同じ類か(笑)

その他のソート

ソース

(use srfi-43)
(use srfi-27)

(define (bozo-sort ls)
  (random-source-randomize! default-random-source)
  (let ((vect (list->vector ls))
        (len (length ls)))
    (until (apply < (vector->list vect))
      (vector-swap! vect
                    (random-integer len)
                    (random-integer len)))
    (vector->list vect)))


(use gauche.sequence)

(dotimes (10)
  (let1 data (shuffle (iota 10))
    (time (bozo-sort data))
    (print)))

;(time (bozo-sort data))
; real  30.852
; user  30.740
; sys    0.000

;(time (bozo-sort data))
; real   0.862
; user   0.860
; sys    0.000

;(time (bozo-sort data))
; real   5.286
; user   5.280
; sys    0.000

;(time (bozo-sort data))
; real   0.598
; user   0.600
; sys    0.000

;(time (bozo-sort data))
; real   2.561
; user   2.560
; sys    0.000

;(time (bozo-sort data))
; real   4.554
; user   4.540
; sys    0.000

;(time (bozo-sort data))
; real   4.434
; user   4.420
; sys    0.000

;(time (bozo-sort data))
; real  12.168
; user  12.130
; sys    0.000

;(time (bozo-sort data))
; real  11.710
; user  11.670
; sys    0.000

;(time (bozo-sort data))
; real  20.846
; user  20.790
; sys    0.000

Gaucheでstooge sort

その他のソート

ソース

(use srfi-43)

(define (stooge-sort ls)
  (let1 vect (list->vector ls)
    (let rec ((head 0)(tail (- (vector-length vect) 1)))
      (when (< (vector-ref vect tail)
               (vector-ref vect head))
        (vector-swap! vect head tail))
      (when (<= 3 (+ (- tail head) 1))
        (let1 index-of-1/3 (quotient (+ (- tail head) 1) 3)
          (rec head (- tail index-of-1/3))
          (rec (+ head index-of-1/3) tail)
          (rec head (- tail index-of-1/3))))
      vect)))

(use gauche.sequence)
(define (test sorter n)
  (for-each (^i (let1 ls (shuffle (iota (expt 10 i)))
                  (print "; length = " (expt 10 i))
                  (time (sorter ls))
                  (print)))
            (iota n 2)))

(test stooge-sort 2)

; length = 100
;(time (sorter ls))
; real   0.031
; user   0.030
; sys    0.000

; length = 1000
;(time (sorter ls))
; real   7.330
; user   7.310
; sys    0.000

Gaucheでbead sort(ビーズソート)

これすごく面白かった。rosetta codeのracketのソースを参考にしたんだけど、そのコードに出てくるcolumnって手続きが目からウロコだった。これはビーズを通したヒモを立てることそのものだ。かっこいい。自分で書く時には末尾再帰にして名前もbead-downにした。

ここの図解がわかりやすい。

その他のソート

ソース

(define (bead-sort ls)
  (define (bead-down ls)
    (let rec ((ls (remove null? ls))(acc '()))
      (if (null? ls)
          (reverse acc)
          (rec (remove null? (map cdr ls))
               (cons (map car ls) acc)))))
  ;; body
  (map length (bead-down (bead-down (map (cut make-list <> 1) ls)))))



(use gauche.sequence)
(define (test sorter n)
  (for-each (^i (let1 ls (shuffle (iota (expt 10 i)))
                  (print "; length = " (expt 10 i))
                  (time (sorter ls))
                  (print)))
            (iota n 2)))

(test bead-sort 3)

; length = 100
;(time (sorter ls))
; real   0.004
; user   0.000
; sys    0.000

; length = 1000
;(time (sorter ls))
; real   0.406
; user   0.410
; sys    0.000

; length = 10000
;(time (sorter ls))
; real  49.590
; user  47.500
; sys    1.380

Gaucheでpermutation sort

その他のソート

ソース

(use util.combinations)

(define (permutation-sort ls)
  (if (or (null? ls)
          (null? (cdr ls)))
      ls
      (let rec ((candidates (permutations* ls)))
        (if (apply <= (car candidates))
            (car candidates)
            (rec (cdr candidates))))))


(use gauche.sequence)
(dotimes (i 11)
  (let1 data (shuffle (iota i))
    (time (permutation-sort data))
    (print)))


;(time (permutation-sort data))
; real   0.000
; user   0.000
; sys    0.000

;(time (permutation-sort data))
; real   0.000
; user   0.000
; sys    0.000

;(time (permutation-sort data))
; real   0.000
; user   0.000
; sys    0.000

;(time (permutation-sort data))
; real   0.000
; user   0.000
; sys    0.000

;(time (permutation-sort data))
; real   0.000
; user   0.000
; sys    0.000

;(time (permutation-sort data))
; real   0.000
; user   0.000
; sys    0.000

;(time (permutation-sort data))
; real   0.002
; user   0.000
; sys    0.000

;(time (permutation-sort data))
; real   0.011
; user   0.010
; sys    0.000

;(time (permutation-sort data))
; real   0.084
; user   0.080
; sys    0.000

;(time (permutation-sort data))
; real   0.760
; user   0.750
; sys    0.010

;(time (permutation-sort data))
; real  10.210
; user  10.180
; sys    0.000

2013/07/05

Gaucheでquick sort

自分も書いてみた。

書いたといっても、検索して出てきたshiroさんが書いたクイックソートのコードを参考にした。match使ってないだけ。

その他のソート

ソース

(use srfi-1)

(define (quick-sort ls)
  (if (null? ls)
      '()
      (receive (ws ys)
          (partition (pa$ > (car ls))(cdr ls))
        (append (quick-sort ws)
                (list (car ls))
                (quick-sort ys)))))


(use gauche.sequence)
(define (test sorter n)
  (for-each (^i (let1 ls (shuffle (iota (expt 10 i)))
                  (print "; length = " (expt 10 i))
                  (time (sorter ls))
                  (print)))
            (iota n 2)))

(test quick-sort 6)
; length = 100
;(time (sorter ls))
; real   0.001
; user   0.000
; sys    0.000

; length = 1000
;(time (sorter ls))
; real   0.004
; user   0.000
; sys    0.010

; length = 10000
;(time (sorter ls))
; real   0.060
; user   0.060
; sys    0.000

; length = 100000
;(time (sorter ls))
; real   0.737
; user   0.730
; sys    0.000

; length = 1000000
;(time (sorter ls))
; real   9.191
; user   9.110
; sys    0.050

; length = 10000000
;(time (sorter ls))
; real 124.532
; user 123.700
; sys    0.450

2013/07/04

Google Reader終了とGoogle Listen

Google Readerはもう使ってなくて、feedlyに移行済みなんだけど、Google Listenはどうしよう。Listen SubscriptionsはGoogle Readerとだけ連携するんだよな、きっと。困ったなー。Androidで使いやすいpodcastアプリって他に何があるのかさっぱり知らん。どうせ聴いてるのは一個のfeedだけなんで、なんでもいいのかもしれんが。

Asterisk(PBX)をAD-200NEに登録する

ってのがなかなかうまくいかなくてまいってる。AD-200NEに登録するためにはパッチが必要らしいが、RT-200NEと同じようにやればいいらしい。

が、パッチを当ててAsteriskをインストールしても、そもそもsipのチャネルが使えない。なぜだあああああああ。CLIでsipコマンドなんてねーよって言われるし、modulesにchan_sip.soがNEEEEEEEEEEEEEEEEEEEE。

調べてたら「パッチ当てなくても登録できたぜ!」的な記事を目にしたので、apt-getからインストールしてみたけど、登録できない。でもsipコマンドは使える。sip show registryしたら一覧に行はあるけど登録できなかったって。

Asteriskは機能は多いし、設定も複雑だし、インストールも難しいし、用語も多いし、ハードル高ぇなAsterisk。情報も古いの多いし、Wikiはそこそこ親切に手順書いてあるけど、万全じゃないし、その手順がなんのためなのか、どういう時はいらないのか書いてなくて、ぐぬぬ。対応プラットフォームが多い+機能がめちゃめちゃ豊富+設定も多く設定方法も様々のコンボで、やりたいことズバリなチュートリアルもないし。ツライよ、ゆとりにはツライよ。

幸い、身近にAsterisk導入予定のスーパーハカーがいらっしゃるので、そちらが設定完了後に教えてもらおうかな(チラッチラッ

でも悔しいので引き続きがんがる。肝心の用途は、Asteriskを光電話の子機として登録して着信をhookしたいだけんだ。それだけなんだ。それだけなら他にいい方法あるぜ!って方法あったら誰か教えて下さい。

追記

2013/07/03

.gaucherc

みなさんの.gauchercの内容が気になります。

ejectこまんど、ってか「取り出し」

これがまじで便利で、一昨日も助かった。お客さんとこのラックでどれが自分とこのサーバーかわかんなくって(記録取ってなかった)、マイコンピュータを見たらDVDドライブがあったんで「取り出し」。かちゃっと音がするので、DVDドライブが開いてわかった。素晴らしい。

22番ポートへのアクセスうざい

ログが溜まってうざいですね。お隣の国からのアタックうざいです。ポート変えた方がいいのかなー。

hosts.allow 更新するスクリプトをcron.daily してるけど、それでも来るもんは来ますね。dailyである必要は全然なくって週一とか月一とかで良さそうですが。

あとは、一応Logwatch設定してる。

ログ見るのも大変すね。Rainbowってのがなかなかいい感じです。

Colorize commands output or STDIN using patterns.

他にも似たようなのはいろいろあるみたい。

これとか