2013/12/31

@golden_lucky「PostScriptは年賀状を書くための言語です」

@golden_luckyさんのPostScript年賀状を勝手にまとめた。2012, 2008が好きです。

2013買ってよかったものベスト5

電気ケトル

うちは夫婦ともに白湯が好きなので、電気ケトル大活躍過ぎる。ガスコンロ+ヤカンだと目が離せないんだよね。すぐ沸くし良い。電気代は、知らん。




フィリップスの電動歯ブラシ

これ歯がツルツルになってまじで良い。すごい気分がイイ。いままでは電動歯ブラシに懐疑的だったんだけど、口腔ケアマニアの上司に教えてもらって、試しに買ってみた。これを買ったお陰で人生がひとつ豊かになったわ。ってレベルで気に入っている。

フィリップスの公式HPを見ると、他にも上位モデルが多数ある。上位モデルは、多機能かつオプション満載。実際に上位モデルを使っている上司の「結局、通常モードしか使ってない」との一言で、このモデルに決定。




オムロンのエレピック(口腔洗浄機)

これも口腔ケアマニアの上司からのオススメ。やばい、これまじで気持いい。特に自分のように顎が狭い人や、歯並びが悪い人にオススメ。口の中スッキリ。

口腔洗浄機って、結構いろんなメーカーから出てるようだけど、故障が多いらしい。このオムロンのエレピックは、故障しないって評判が良い。

データのない主観なんだけど、これ使い始めてから口内細菌の量が確実に減ってる。と思う。口の中が気持ち悪くなることが減ったし、なりにくい。お口スッキリ。寝る前の歯磨き前に毎晩使ってる。出かける前の歯磨き前にも使ってる。

もちろん、これを使ってるからってフロスをさぼるわけにはいかないけどね。口の中がスッキリしてると気分もスッキリして人生はかどる。




モバイルバッテリー

出張が多いので必携です。こいつをフル充電しておけば、Galaxy S2aを2回フル充電できる。小さくて良い。大活躍でした。




amazonのマイクロUSBケーブル 2.0m

安い。枕元用に使ってる。こいつのお陰でベッドでのネットサーフィンが快適になったわ。地味だけど、生活が一つ快適になった。

ベスト5ここまでー




次点

Software Design 総集編(2001〜2012)。お買い得。PDFありがたや。取りあえず興味のあるところだけ目を通してしまった後は、放置してしまってるけども。



G-SHOCK。出張マンとしては、腕時計は必携。携帯で時間を確認するのって、片手塞がるから大変なんだよね。

で、本当に欲しいのはメタルなビジネスっぽい腕時計。でも、近頃の腕時計って文字盤が馬鹿デカイのばかりで、まじでクソクラエなんだよな。あれ全然カッコよくないと思うんだが。むしろクッソダサいと思うんだ。付けづらいしな。やだやだ。

ってな感じで、腕時計が壊れてここ数年、欲しい時計が見つからなかった。失礼な話だけど、その場しのぎ的に無難なG-SHOCKを購入。ソーラー、電波時計なので、手のかからない可愛いヤツ。意外と気に入ってしまった。

本当に欲しいのはこういうの。



ミシュラン プロ3レース 700×23C。ロードバイクのタイヤですね。本当はこれを1位にしたいくらい。これすげー転がる。やばい気持ちいいいいいい。これまでノーマルタイヤ履いてたんで、違い過ぎて魂消た。ノーマルタイヤって、とんでもないハンディキャップだったんだな。

でもチャリのタイヤで一本5,000円って高ぇーよな(笑)でも、転がりっぷりがすごいので、周りの人たちが一本1万円のタイヤ履く気持ちがわかったわ。



読んでよかった本2013

月に2〜3冊程度しか読まないマンなので、そもそも母数が少ないけれど、書いておく。こうやって選んでみると、今年読んだ本は当たりが多かった。全部書くわけにもいかないので、「これは書かないわけにはいかないだろ!」というのを選んでみる。

順不同。

20歳の自分に受けさせたい文章講義

これはプロの仕業。実際プロの仕業。小手先のテクニックやtipsみたいな枝葉ではなく、レトリックの話でもなく、文章を書くためのズッシリとした幹についての講義。

あとがきに

本書の執筆中、何名かの友人にこんなことを聞かれた。「その本であんまり手の内をさらしてしまったら、みんなに真似されるんじゃない?」

とある。自分も読んでみて「ここまで丁寧に惜しげもなく披露しちゃうのか」と思った。と言っても、プロとしては押さえておいて当然の基礎なんだろう。基礎こそが大事なんだと思う。

高校2〜3年生の頃、大学入試のために小論文の指導を受けていた。四苦八苦だった。ホントその時の自分に読ませたい。というか、中高生にこういう授業必要だろ常考。今後も読み直す系の本。




「影響力の武器」と「プロパガンダ」

この2冊は特に外せない。説得、交渉の本。身を守るために読むと良いと思う。

影響力の武器 訳者あとがきより

社会心理学の研究は、どちらかといえば影響を与える側の立場から問題を扱うことが多い。しかし、本書では影響を受ける側の人々の心理やそうした影響力に対する対処法についても言及しており、この点でも貴重である。

プロパガンダ P.302 ペイソの子孫たち(ペイソ=古代ローマの説得の女神)

好むと好まざるとにかかわらず、われわれはペイソの子孫なのである。友人に「あそこのレストランは美味しい」とか「あのメーカーのステレオセットはいい」と言って勧めるときに、無意識のうちにその役割を果たす(ときには少し意識して行うこともあるが)。販売や法律や政治だけでなく、医学や科学や教育など多くの職業でも高度の説得術を必要とする。同様に、選挙の候補者や社会団体や慈善団体のために働く人は、自らの説得能力によって票を獲得し、請願のための署名を集め、寄付金を集め、情報を広める。実際にわれわれは、事物を誉めたり批評したりするとき、ある意見を弁護したり攻撃したりするとき、ある立場に賛同したり反対したりするとき、常に説得を試みているのである。

この2冊はペアで読んだ方が良いと思う。読む順は、影響力の武器を読んでからプロパガンダを読んだ方が良い。「影響力の武器」はそれぞれの影響力に名前を与えて、その名前ごとに章を分けてあるので解りやすい。章末にまとめがあるのも良い。

プロパガンダは「影響力の武器」の影響を受けているし、影響力の武器からの引用も多いので、「あ!これ影響力の武器で読んだ話題だ!」といったノリで読める。影響力の武器の補強として読むといいし、豊富な具体例が良い。




自衛隊メンタル教官が教える 心の疲れをとる技術

「自衛隊メンタル教官が教える」ってところに興味を惹かれた。自衛隊にそんな人がいんの?どんなことしてんの?って。

購読しているブログで「部下や後輩を持つリーダー向け」として紹介されていて、読んでみた。実際「疲れている当事者向け」というより、その上司や先輩向けの印象。ちなみに僕の心は疲れていないし部下もいない。

二十代前半の若いIT戦士にススメたい。この本を読んでいるとTwitterのTLで見かける人たちの顔が浮かぶ。反抗期のエンジニアを持つ諸先輩方も是非どうぞ。




貧困大国アメリカ

恐い。日本もこんな風にならなきゃいいけど。今回読んだのはシリーズ3作目の「(株)貧困大国アメリカ」。ⅠもⅡも読んだけど、やっぱりこのシリーズ面白いわ。今度は同じノリで日本のルポ書いてくれよ。




SF(幼年期の終わり、未来からのホットライン、断絶への航海)

SF、今年も何冊か読んだけど、この3冊がぶっちぎりに良かった。やっぱり、本の中の世界にどっぷり引きこまれて、帰って来れない感じがたまんないっすね。この3冊の中で、さらに一番を選ぶなら・・・未来からのホットライン。

「幼年期の終わり」は、いろんな有名作品の元ネタと言われてるんで、その意味では読んでおいて損はないかと。




プログラミング(入門UNIXシェルプログラミング、Land of Lisp)

今年はあんまり技術書を読んでないけど、この2冊はオススメできる。「入門UNIXシェルプログラミング」は、その名の通り入門書。Shell Scriptを書けるようになりたい人にとてもオススメ。基本から応用まで例題も多く、要所が押さえてあってわかりやすい。

Land of Lispはやばい。ゲームを作りながらCommon Lispを書けるようになる。説明が丁寧だし、このフザケた感じがとてもナイス。やばい。Lispエイリアン超かわいい。入門書としてもかなりいい感じなので、今後「Lisp始めたい」って人がいたら、この本をススメます。




まとめ

今年の読書は満足度が高い。この中で一番オススメしたいのは、影響力の武器とプロパガンダ。仕事でも日常生活でも重要なことなので、来年も交渉と説得の本を読みあさりたい。



2013/11/27

git diff を単語レベルで

これ探し求めとったやつや・・・。TortoiseGitのdiffは単語レベルで表示できてたから、git diffのオプションかな?と思って調べたけど、できなくて諦めてた。

さっそく設定したが、満足である。

2013/11/21

シェルスクリプト総合 その22

((--i)) でiが0になる時、返り値1なんだ。 
iが負の値になる時でも返り値0なのに、0になる時だけ特別なんですね。

へぇー!こうか。

% i=10; while ; echo $i; ((--i)) && sleep 1s ; do; done;
10
9
8
7
6
5
4
3
2
1
27 :名無しさん@お腹いっぱい。:2013/11/20(水) 19:52:35.18
一定時間、何度か繰り返しコマンドを実行したくて、

for i in `seq 1 10`
do
 何かのコマンド
 sleep 1h
done
echo "finished" | write username

といったスクリプトを書いているのですが、このやり方だと
最後にコマンドを実行してから一時間、無駄に sleep してしまいます。
最後の sleep だけ実行しない方法はないでしょうか。

28 :名無しさん@お腹いっぱい。:2013/11/20(水) 19:58:50.00
再編集の時が恐いけど
変数 i<=9 のときにsleep 1h

i/=10の時に sleep 1h

29 :名無しさん@お腹いっぱい。:2013/11/20(水) 20:00:40.20
>>27

i=10
while
 何かのコマンド
 ((--i)) &amp;&amp; sleep 1h
do :; done
echo "finished" | write username

30 :27:2013/11/20(水) 20:07:56.43
おお! 素早い回答、ありがとうございます。
ですが、たびたびすいません。

実際に使っているスクリプトだと、ループの実行回数が不定な場合があるのです。
(行数が特定できないファイルからの読み込みとか)
最後のループでは sleep しない、という手段はあるでしょうか。

31 :27:2013/11/20(水) 20:19:58.58
よく考えたらファイルからの読み込みも終了判定できますね。
何とか工夫すれば、判定できないループってないかも……。
どうもお騒がせしました。

32 :名無しさん@お腹いっぱい。:2013/11/20(水) 23:30:36.92
>>29
((--i)) でiが0になる時、返り値1なんだ。
iが負の値になる時でも返り値0なのに、0になる時だけ特別なんですね。

2013/11/17

「巨人たちの星」を読んだ時のメモ

を読んだ時のメモが面白かったので載っけとく。2011年5月のメモから一部抜粋。

P.252
技術革新が人類の富を増大し、一人当たりの収入をどれだけ伸ばしても、結局、何かが剰余分を吸い取って、一般大衆は終生あくせく働くしかない。生産性がどんなに向上しても、労働の質が変わるだけで、人が労働そのものから解放されることはない。一般大衆が自分たちの労働の成果である富と自由を与えられないとしたら、いったいその収穫は誰が持ち去っているのだろうか?
P.278
形態の如何を問わずすべて圧制者にとって、知識は敵なのだよ。知識は歴史を通じて、いかなるイデオロギーや信仰にもまして多くの人間を貧困と抑圧から解放した。
P.246
「ひたすら働かせろ。目的に殉じる気持にさせろ。ただし、考える閑は与えるな、か。え?」

ふはは。太字のところ、IT業界の話みたいだな(笑)ITって楽をするための手段なはずなのに、当のIT業界の人々は死ぬほど働いてるってホントどうしてこうなった。

はたらけど はたらけど猶 わが生活(くらし) 楽にならざり ぢつと手を見る --石川啄木:一握の砂

貧困大国アメリカシリーズ

3冊目が出てるんですね!1と2がすごく面白かったので、これも超期待で買ったった。1,2を読んだのが3年前っぽいので復習しとくか。

文章を書く

もっと文章を書こう。書かずにうまくなるってことはないだろう。なんでも構わない。書くことを恐れずに、思ったことを素直に書いていきたい。

2010年夏、上記のようなことを書いている。文章が上手くなるに越したことはないよな。だけど、できるだけ上手く書こうと意識すればするほど、どんどん書けなくなってしまうんだよなー。書くこと自体が億劫になっていく。だから、書きたいことを書いて、ついでに上手くなったら儲け、みたいなスタンスがいいのかな。(こんなスタンスだからうまくならないんだろうなw)

2013/11/14

「影響力の武器」と「プロパガンダ」と交渉の話

経緯

例えば、他者とのスケジュール調整や、納期の話し合い、入居/退去時の不動産屋とのやり取り、ご近所トラブル、勧誘、買い物、転職、打ち合わせ、プレゼン、どれも実は交渉や説得なんだな。日常の中で交渉力がものを言う場面は多い。交渉力があれば味合わずに済んだ苦い経験、結構あるわ。

交渉力があると人生もっと捗りそうなイメージ。例えば、弊社社長、交渉力が高いから一緒に仕事すると案件が終始めっちゃスムーズ。社長や上司の交渉力が高いお陰でデスマにならないし、残業も発生しない。毎日定時退社。ソフトウェアベンダーとしては珍しいと思う。普段から社長や上司を観察してるけど、なかなか真似できない。経験の差ってのはわかってるんだが。

一応書いておくと、交渉によって目指す結果はwinwin。言いくるめたり、無闇にゴネたり、強引に押し切るって話じゃない。それは交渉ではないと思う。理想はこちらの要求を叶えつつ、相手が「得をした」「良い結果を勝ち取った」というような感想を持って自らYesと言うこと。難しければ、最低限、双方にとって不本意な結果を避けるようにしたい。

自分は営業ではない。プログラマであり、SEなんだけど、営業的なことをやる機会もあるし、お客さんや他社と調整するし、サポートで現地に行って人とやり取りするしで、結局は「楽するために交渉力が欲しい」のだった。

本題

で、掲題の本の話。両方ともとても有名な本。影響力の武器は、これまでに何度か読んでいるんだけど、先日もう一度読み直した。その後、プロパガンダを買って読んでいる。両方とも「業務で営業やマーケティングをやっているなかでも意識高い系の人」が読んでそう。でも内容は別に意識高い系ではなく、とてもまとも。無用な煽りなどはない。

プロパガンダは、評判通り影響力の武器と内容かぶりまくり。かぶりまくりなのにすごく面白い。お互いがお互いを補っていて、これはペアで読んだ方が良いと思う。「あ!これ、影響力の武器で言ってた一貫性の話だ!」みたいな。交渉や説得に興味なくても、防御のために読む価値がある。

どんな本なのかは、この辺をみるとわかると思う。

とにかく僕らは簡単に影響を受けてしまうわけだ。簡単に説得されちゃう。

われわれは「正しい持ち物」を購入することによって、お気に入りの著名人のように「なる」。そうすることで、自分自身の自我を強化し、自分の不完全さを合理化するのである。 --プロパガンダ P.107

さて、本の構成としては、影響力の武器の方が各章末にまとめがあって嬉しい。プロパガンダは、影響力の武器より読みやすい。両方とも事例(実験とか統計とか)がたくさん乗っていて、そこが特に面白い。ただ両方ともなかなか分厚い。

余談

実は、評判が良かったので、この本も読んでみた。

結構参考になったんだけど、上の2冊に比べるとすごくライトな本。よく見るとアマゾンのレビューも評価は高いけど、なんかアレな感じ。前半は基本的なことの説明で少しクドい。なかなか退屈。ただし、例題は面白い。退去費用の交渉の話とか、近所の工事現場に対する苦情の話とか。

前半読んでると、もう読むのやめようかなーと思えてくる。我慢して読むと、前半の内容を踏まえての後半が面白い。とくに三章「こんなとき、どうするか」がすごく面白い。目次を抜粋。

  • 相手の方が強かったらどうするか
  • 相手が話しに乗って来なかったらどうするか
  • 相手が強硬に主張したとき
  • 相手が汚い手口を使ってきたらどうするか

これはこれで読んでよかったかなと思う。

余談2

先日読んだ、言葉と思考って本も少し関連があると言えばある。

ほんで、プロパガンダの次はこれを読もう、と思って買っといたのがこれ。

プロパガンダと一緒に買ったんだけど、プロパガンダ読んでたら引用されてて笑った。

結論

こういう本を読んだからといって、すぐに交渉力は上がらない。間違いない(体験)。ただ、実際の交渉の現場に居るときに、今何が起こっているのかがわかるようになる。なぜ相手がみるみる説得されているのかがわかるようになる。それに、過去に自分が行った交渉の問題点に気づくことができる。これ多分すごい重要。

なぜうまくいかなかったのか、どうすればよかったのか。なぜ自分は不本意な説得に応じてしまったのか。もっと交渉の余地があったんだ、って。

以上、けっこう真面目に書いたけど、読んで面白いから暇つぶしにオススメ。

transpose コマンド(tsv/csvの行列転置)

行列転置したいことは結構あるのに、shellでやろうと思うとちょっと面倒くさい。普段はExcelで「形式を指定して貼り付け」しているけど悔しい。

ので、簡単なコマンドにした。以前作ったcsv2sqlをコピってちょっと書き換えただけ。

ソースはこちら。

2013/11/07

トイレ本の候補

今は、上の日記で書いたようにへんないきもの (新潮文庫)を読んでいるけど、もうすぐ読み終わりそう。すごく面白かったので、次は同じ著者のカッコいいほとけを買ってみようかな。期待。

2013/11/06

体力、気力、能力のピラミッド

Tumblrでこんな画像を見かけた。

睡眠不足の話もそうだけど、30歳ともなると身に染みる話である。体力、睡眠、食事、どれもコンディションに影響ダイレクトなんだぜ。

睡眠不足オレオレ指標

  1. かなり睡眠不足
    • 仕事ができない
    • 前フリなしで一瞬気絶する
    • 運転中に一瞬気絶する
    • 信号待ちで一瞬気絶する
    • 朝起きれない
    =====超えられない壁=====
  2. 睡眠不足
    • 仕事中にまぶたが落ちてくる
    • プログラミング中に眠くなる
    • 湯船で眠くなる
    • 車を運転している時に眠気を感じる
    • 飛行機に乗ってる間中寝てる
    • 朝起きるのがとてもつらい
  3. 少し睡眠不足
    • 仕事中にあくびが出る
    • プログラミング中にあくびが出る
    • 読書中にあくびが出る
    • 高速道路運転中に眠くなる
    • 飛行機に乗ると眠くなる
    • 朝起きるのが少しつらい
  4. 睡眠不足ではない理想の状態
    • 仕事中にあくびすらでない
    • 高速道路を運転しても眠くならない
    • 飛行機に乗っても眠くならない
    • 目覚ましが鳴る前に目が覚める

新卒で入った会社でデスマって、残業しまくり45連勤とかそういう悲しい理由で、一度だけ超えられない壁を超えたことがある。当時は、1〜2週間で回復したように思っていたけど、今振り返ってみると数ヶ月くらいダメージを引きずっていたように思う。

最近は少し睡眠不足気味になることもあるけれど、目覚まし前に目が覚めるような日も増えていていい感じである。やっぱたくさん寝た方がいいと思うの。

2013/11/05

面接法って本

先日「面接法」っていう全然オレ得じゃない本読んだんだけど面白かった。薄いし簡潔な文章なのに密度すごかった。面接法ってかカウンセリング法って内容。初心者が書いたケース記録をベテランのアドバイスを基に何度も書きなおすところは、文章を書くことについてとても参考になった。

カウンセラー向けの本なんだろうな。面白かったよー。

2013/11/04

議事録

会議や打ち合わせの後に議事録をまとめる機会がある。ノートにとったメモや、PCでテキストに記録したものをベースにする。難易度の高い込み入った打ち合わせの場合は、録音した音声を聴きながらテキストに起こし、それをベースにすることもある。

通常、聞きとった内容を聞きとった順に羅列しただけのテキストはとても散らかっている。この状態では読んで内容を理解することは難しい。整理する必要がある。

同じ意味で表記の違う単語を統一する。意味のない部分を削除、冗長な内容を簡潔に書きなおす。あちこちに散在する関連した話題をひとまとめにする。読みなおして重複する部分を削り、主語を明示的に付け足し、隠れた文脈を書き起こす。手順を示す部分には番号を振り、列挙しているところは箇条書きにし、話のまとまりごとに見出しを付けて構造化する。(発言をそのまま会話形式で記録する議事録もあるが)

議事録を作成する目的は、お互いの認識をすり合わせることにある。現状の把握、誰がいつ何をするか、今後の見通しと課題、懸案事項などを明らかにする。「言った、言わない論争」を避けるためでもある。自分たちの備忘のためでもある。完成した議事録を相手に渡し、お互いの訂正を経て完成する。新たな問題点が明らかになり、次回の打ち合わせへと続く。この作業を通して自分の脳内も整理される。

本題

実はここからが本題だったんだけど、疲れたのでまた後日書くことにする。

余談

議事録の作成にはgitを使っているんだけど、相手との訂正のやり取りはMicrosoft Wordの「変更の記録」が便利だと最近知った。これは捗る。

2013/10/21

「ことばと思考」って本の話

さっきから暇つぶしに読んでる「ことばと思考 (岩波新書)」って本が思った以上に面白いので書いておく。

amazonの商品の説明より

私たちは、ことばを通して世界を見たり、ものごとを考えたりする。では、異なる言語を話す日本人と外国人では、認識や思考のあり方は異なるのだろうか。「前・後・左・右」のない言語の位置表現、ことばの獲得が子どもの思考に与える影響など、興味深い調査・実験の成果をふんだんに紹介しながら、認知心理学の立場から語る。

なんかプログラミング界隈で聞いたことある話じゃない?僕にはこう見えた。

私たちプログラマは、プログラミング言語を通して世界を見たり、アルゴリズムを考えたりする。では、異なるプログラミング言語を話すCOBOLerとLisperでは、認識や思考のあり方は異なるのだろうか。「静的スコープ・再帰・継続・マクロ」のない言語のコード表現、プログラミング言語の習得がプログラマの思考に与える影響など、興味深い調査・実験の成果をふんだんに紹介しながら、認知心理学の立場から語る。

目次

序 章  ことばから見る世界―言語と思考
第一章  言語は世界を切り分ける―その多様性
第二章  言語が異なれば、認識も異なるか
第三章  言語の普遍性を探る
第四章  子どもの思考はどう発達するか―ことばを学ぶなかで
第五章  ことばは認識にどう影響するか
終 章  言語と思考―その関わり方の解明へ

プログラマな人たちは好きなんじゃないかなと思う。プログラミング言語が好きな人たちは特に好きそうな話だ。というのも「言葉は世界を切り分ける」「言語が異なれば、認識も異なるか」など、Rubyのまつもとさんがよく話題に出す「サピア・ウォーフ仮説」の類のお話だから。ちなみに二章に「ウォーフ仮説は正しいか」というセクションがある。

最近話題になったRubyコア用語集にもサピア・ウォーフ仮説のことが載っているな。

普段使ってるプログラミング言語に新しく追加された機能がどうしてもわからない。解説記事を読んでも、本を読んで勉強してもどうもピンとこない。そんな時、別のプログラミング言語を触ってみたらあっけなく理解できた!なんてことはプログラマであれば経験があるんじゃなかろうか。

自分にも経験がある。プログラミングを始めたばかりのころ、C#のdelegateの意味がよくわからなかった。C#の本を読んでもdelegateのところだけワケワカメ状態だった。ちょうどその頃仕事で、それまで未経験だったJavaScriptを書くことになった。入門記事片手にJavaScriptを書いていたら、delegateのことがあっさりわかってしまった。なぜわからなかったのかがわからないくらいあっさりわかった。ついでにクロージャのなんたるかまでわかってしまった。僕は「JavaScriptはなんて素晴らしい言語なんだ!!」と思った。今は「Lispはなんて素晴らしい言語なんだ!!神様ありがとう!」と思っている。Lisp・・・ふははっ!Lisp!

追記

第一章 言語は世界を切り分ける、第四章 子どもの思考はどう発達するか、第五章 ことばは認識にどう影響するか、が特に面白かった。

印象に残っているのは、記憶が言語に引っ張られるって話。例えば、車がぶつかる映像を見せて「車が[衝突]したときのスピードはどのくらいでしたか?」と聞く。この[衝突]の部分の動詞をsmashed, collided, bumped, contacted, hitを言い換えて聞いた時、被験者が答えるスピードが異なるって話。

もうひとつ。子どもが何歳くらいでどういった言葉と概念を獲得するかという話も面白かった。大学の頃に似たような話が講義であったことを思い出した。獲得した言葉によって認識できることや区別できることが広がることを示した実験の話が興味深かった。知らないことを考えることはできないって点で、大人も同じだと思う。ヴィトゲンシュタインってエラい人が「私の言語の限界は、私の世界の限界」だとおっしゃってるそうで。

2013/10/13

風呂の本

風呂に置いてるわけじゃないけど風呂で読む本。読むのに少し気合いが要る本は風呂で読むことが多い。半身浴しながら。今は「影響力の武器[第二版]―なぜ、人は動かされるのか」を読んでいる。第一版の方。これは好きな本で、読むのは3〜4回目くらい。特段難しいわけではなく読んでいて面白いんだけど、読んでいるとなぜか眠くなるのため風呂で読んでいる。プログラミング系の本もわりと風呂で読むことが多い。The Little Schemerは風呂で読んだけど紙質が悪くてふやけ方が半端無かった。素数夜曲みたいな分厚い本も風呂で読むことがある。手がつかれて大変だけど。PCやノートが使えないところがツライ。

8月はProject Euler、9月はアニメ強化月間だったので、10月は読書強化月間にしようかなって。秋だし。

しかし、まー、正直マンガ読んでる方が楽しい(笑)

トイレの本

我が家のトイレにはいつも数冊の本が置いてある。便所本ってやつ。どれも1〜3ページ単位で読める本。例えば星新一のショートショートが置いてある。今アツイのはへんないきものという本。以前は会社の先輩の真似してSQLのリファレンスを置いていた。

そういえば実家のトイレにはママレード・ボーイとちびまるこちゃんが置いてあったなー。

2013/10/11

にっき

ブログ全然更新してないな。ブログといい筋トレといい習慣が消えていく。最近、いろいろなことに満足してるからかな。職場は素晴らしいし、仕事もわりと楽しいし、私生活は円満だし。勉強会の開催や参加にも意欲がわかないなー。満足はいいことなんだけど、やばいことでもあると思う。

2013/09/01

shell script と cmd bat の参考

めっちゃ参考になるわー。

先日batを作った時にtempファイルとして「ファイル名が日時のファイルを作る」ところで0埋めフォーマットできてなくて午前中だけ動かないbatを作ってしまった。

cygwinでcron入れてもcron.hourlyがなくてそもそもrun-partsがない

会社でcygwin使ってるんだけど、cron入れても/etcの下にcron.hourlyとかcron.weeklyがない。困った。調べてみるとそもそもrun-partsがない。run-partsは指定したディレクトリに入っているコマンドを順次実行してくれるコマンド。これがない。

探したところ、run-partsスクリプトを書いてる人がいたので拝借。

取りあえずgistに貼っつけとく。

関連

Re: gitのコミットログの集計

改めて探したらいろいろあった。いろいろあるけどほとんどのものはWebUIしかないようだ。個人的にはその仕様は残念だ。その中でgitinspectorというのがコマンドとしても実行できて感触がいい。統計の項目がちょっと物足りないけれど。

Re: タイムボカンディレクトリ

以前タイムボカンという名のディレクトリについて触れた。

スクリプトを書きなおしたので書いておく。

% timebomb -d 7 ~/timebomb.weekly

これを.shに書いてcron.hourlyに入れてる。

参考

おっさんのための口腔ケア


歯や歯茎のケア、大事ですね。虫歯はないと思って15年近く歯医者に行ってなかった。先日行ってみたら歯と歯の間の虫歯がたくさんあった。さいわい神経を抜くような虫歯はなかった。フロスはやっていたけど、足りなかったみたいだ。それに親知らず付近の歯周ポケットが深かった。

歯周病で口がくさくなったり歯がなくなるのは嫌だ!!特に口がくさいのは嫌だ!!

歯医者に通い、虫歯の治療をし、フロスも毎日やっている。親知らずも4本のウチ3本抜いた。上の親知らずは抜いても全然痛くなかったのだけど、下の親知らずを抜くのはすんげー痛かった。歯茎がごっそりくっついて抜けた(ガクブル。あとは右下の親知らずが残っている。上の画像のように真横向きに生えているらしく抜くのが怖い。親知らずを一旦途中でぶった切ってから抜くらしい。怖い。

と、まあ、歯や歯茎に対する意識が高まったので口腔ケアに余念がない上司に相談してみた。するとフィリップスの電動歯ブラシとオムロンのエレピックというものをススメられたので買ってみた。上司曰く「人生捗る」「人生がひとつ豊かになる」との絶賛ぶりだった。

今週末その二つが届いたので早速使ってみたら、これはすごい。もっと早く欲しかった。特にエレピック。エレピックは強い水流を噴射して歯と歯の間や歯と歯茎の間を掃除することができるマシーン。気持ち良すぎる。エレピックをやった後の口の中の爽快感。これはいい買い物。同じような機械は他のメーカーからもいろいろ出ているようだけど、けっこう故障するらしい。オムロンのエレピックは故障が少ないことで評判がいいとのこと。

上司曰く、電動歯ブラシはフィリップスというメーカーのものがオススメということだった。値段が高いモデルはいろいろなモードがあり、付属品が多いらしい。けど、結局ノーマルモードしか使わないらしいので、単機能で安いものを買った。この電動歯ブラシ、歯がツルツルになってとても気持ちいい。口の中が清々しいのは気分がいい。

近くに居るだけでキッツい口臭が漂ってくるおっさんおばさん、多いよね。ああはなりたくないので口腔ケアに勤しむ。

追記

amazonでエレピックの取り扱いがなくなってますね。リンク貼っときます。


2013/08/03

複数のTwitterアカウントに連投するアレ

Gaucheスクリプト。ネタ元はこちら。

Gauche-net-twitterがTwitterのapi v1.1に対応してないっぽくて間に合わんなーと思ったら

対応してるのがあった。

で、スクリプトの使い方は、consumer-keyなんかを書いたファイルを用意してコマンドを実行。それぞれのtweetは別スレッドで投稿されます。

% ./tweet-bals-batch-balk.scm ばるす > bals.log

結果はこんな感じでわかる。

% cat bals.log | grep done | awk '{print $1}'| sort | uniq -c

合計はこれで。

% cat bals.log | grep done | awk '{print $1}'| sort | uniq -c | awk '{ total+= $1}END{print total}'

コマンド名が長いのでシンボリックリンクを作成した。

% ln -s `realpath ./tweet-bals-batch-balk.scm` ~/bin/bals
% bals ばるす > bals.log

詳しくはでたらめ英語なhelpをご覧ください。

% bals -h
Usage: bals [option ...] message
  h|help     : Show this help
  n|number   : Number of continuous tweets (default:endress)
  k|key-file : The path of the file for which have listed the Consumer-key and Access-token
                 ex) twitter-id1 consumer-key1 consumer-secret1 access-token1 access-token-secret1
                     twitter-id2 consumer-key2 consumer-secret2 access-token2 access-token-secret2
                     ...
                     twitter-idn consumer-keyn consumer-secretn access-tokenn access-token-secretn
                 (default: ~/.tbbbrc)
  i|interval :Interval (default: 0.1)
  s|suffix   :Message suffix (default: !)
  d|debug    :Debug mode. Print message to console, Twitter not update

ソースはこちら。

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