IMAKADO::BLOG RSSフィード

January 15, 2010

あけましておめでとうございます

しばらくご無沙汰でしたので、近況でも。


最近、自由に使える時間が少しばかり増えたので勉強をするようにしています。

今日なんかは数学をやっていたのですが、思ったより全然できないんですね。

あらあら、これはどうしたことか。忘れてしまったのかな。どのみちこのままではあかんべえと思い、記憶をたぐり寄せてみたのですが、どうにも思い出せません。

ちょっとの間考えてみたのですが、思い出せないものは仕様がないという結論に辿り着き、開き直りをしてお風呂に入る事にしました。

今、絶賛マイブーム中の半身浴ってやつです。主にダイエット目的なのですが、上がったあとに呑む焼酎の水割りが美味しくて仕様がなく、ついつい欲求に抗えず一杯、二杯と呑んでしまうため結局のところダイエットに関しては効果が現れる気配無しです。まあ、これはこれで美味しくお酒が呑めるので幸せではないかと、ここ最近ポジティブ指向思考プログラミングの自分は思うのですが。お、「しこう」って二回連続で続きましたね! 同音異義語、万歳!!ちなみにこの水割りを、生命の水、と自分は呼んでいます。

おっと、話しが平松政次のカミソリシュート並の切れ味で逸れてしまいました。む、例えが古すぎるか。伊藤智仁の高速スライダーばりの切れ味で・・・いや、星野のスローカーブのような・・・いや、佐々木のフォーク・・・今中の・・・いや、ダルビッシュの・・・。

結局、生命の水を三杯くらい呑んで、酔いも回り始め、ほろ酔いからいよいよ、ほろもとれかかりそうな時に思い出したんですよ、高校時代の数学が全然思い出せない理由を。

いやあ、そもそも高校にいってなかったんですねえ。高卒認定試験が受かる程度にしか高校数学をやってなかったんですわ。すっかり忘れていました。けすからんものです。テヘヘ。これにはさすがに、ここ最近の記憶力低下に危機感を持ち始めました。

最近は昨日の晩ご飯が思い出せないことがあったりします。かろうじて覚えているのは、いつくかの perl モジュールの使い方と、lisp の文法と関数名くらいなものです。それでも、まあ楽しく暮らしています。作りたい物も作れてますしね。


しかし、22にもなると一般教養の大切さが身にしみてわかって来るもので、時間を見つけては、ちょこちょこと勉強してみている次第です。

若い頃、若くはない人から「若い頃にしっかり勉強しとかないと、大人になった時に苦労するよ」なんて定型句を言われたもんですが、いやはや真理をついていました。

互いに面識のない大多数の人が同じ事を言った場合、少しばかりの例外を抜かして、それは大体正しい事ですな。うんうん。


昔は、勉強は必要になった時にすれば良いのだと思っていました。

わっかりにくい例えをすると、プログラムで言うところの lazy evaluation みたいなものだと考えていました。

delay で「あとで勉強するよ」って約束しといて、必要になったら、「やっべ、アルゴリズムが理解できねーよ!!」とあわてて force する感じ。

でもプログラムと違うのは、評価時に環境をうまく復元する事ができないので、若い時に勉強するのと年を重ねてから勉強をするのは全然別ものだって事ですかね。

いざ勉強しようと思ったところで、時間を割いて教えてくれる先生・教授もいなければ時間もないので、若い時にやったほうがずっと楽。

だから若い時にもっと勉強しとけばよかったな。後悔先に立たず、です。ほんと、人生の call/cc を渇望します。SFによくでてくる冷凍人間とか近いんですかね?

あ、でも、中学生の頃に年を誤摩化してバイトした事とか、ナイトバーでボーイさんの仕事した事も、その後の人生で結構役に立っているので、一概に後悔のみというわけでもないのですけれど。頑張れば、両立させることもできたかなあと。

バックアップとってなかったDBに、間違ったsql流したことを悔やむような、そんな感じです。


そんな事を考えていたら段々と脳がカオスになってきて。

レキシカルに amb評価機 をもちいて、人生設計を立てる事はできるけれど、自分の処理能力が低いのと、人生は有限ですぐ老いていっちゃう事から、やっぱり実行時間がたりなくて、富豪的には実行できないなあ。本当に頭のいい人は、うまい人生設計とか例外構造とかできているのかな。例えば、女性Aに絶縁状をつきつけられた例外をキャッチして、女性Bと付き合い始める。とか。もしくはそれ以前にマルチスレッドで実行が進んでいたり・・・。自分はそういうの、凄く苦手だな。Java並行処理プログラミングがまだ手元に届いていなくて、 synchronized とかよくわからないし。

とか。

んーじゃあ、無限ストリームだ! けれど、無限ストリームだって、結局のところ「自分の認識で無限に見えるだけ」だから、自分が死ねばそれ以上認識できなくなるので、やっぱり有限な気もするし。へ、屁理屈すぎる・・・もうなんでもありだな。風呂敷広げすぎて収集つかなくなった小説の、とってつけたような最終章みたいだ。なんてわけのわからない事が頭のなかで、くるぐる回り始めました。いや違う、あれは大槻ケンヂの小説や。グルグル回り始めました。こういうの嫌いではなく、結構楽しいのですが、端から見てただの酔っぱらいなので始末がつかないなあと思います。酔っぱらいって、友達がなるぶんには微笑ましくて好感がもてるのですが、自分がなると恥ずかしくて悶絶しますよね。興味深いものです。

酔った頭でいろいろと考えだすと、停止条件が抜けている再帰関数をうっかり実行したときのような状態になり、結構大変です。

しかも自分の脳は、バグなのか仕様なのか SIGINT 完全無視するので、ま、いっか! 寝よう寝ようと思い、C-c 押しても走り出したプロセスはスタックをつかいきるまで止まらないのも厄介です。

やっぱり、色々な事をしっかりと理解できていないのが原因だと思います。毎晩勉強。がんばらナイト。なんちゃって。どうみても酔っぱらい親父です。本当にありがとうございました。


兎にも角にも、22年間の中で一番頑張って生きてます。

皆様、今年もよろしく御願い致します。

近いうちに、いろいろと報告できればなと思います。


勉強に関しては、手遅れでなければいいんだけどなあ。

December 09, 2009

選択している文字列を camelcase<->snakecase に変換するコマンド

;; copied from rails-lib.el
(defun ik:decamelize (string)
  "Convert from CamelCaseString to camel_case_string."
  (let ((case-fold-search nil))
    (downcase
     (replace-regexp-in-string
      "\\([A-Z]+\\)\\([A-Z][a-z]\\)" "\\1_\\2"
      (replace-regexp-in-string
       "\\([a-z\\d]\\)\\([A-Z]\\)" "\\1_\\2"
       string)))))
(defun ik:camerize<->decamelize-on-region (s e)
  (interactive "r")
  (let ((buf-str (buffer-substring-no-properties s e))
        (case-fold-search nil))
    (cond
     ((string-match "_" buf-str)
      (let* ((los (mapcar 'capitalize (split-string buf-str "_" t)))
             (str (mapconcat 'identity los "")))
        ;; snake case to camel case
        (delete-region s e)
        (insert str)))
     (t
      (let* ((str (ik:decamelize buf-str)))
        ;; snake case to camel case
        (delete-region s e)
        (insert str))))))

November 27, 2009

smartchr.elがやばい!

連続で押すと指定した文字列を順番に入力するコマンドを、簡単に定義するための拡張 smartchr.el をリリースしました。

自分で作っておいてアレですが、しばらく使ってみて、手放せない拡張になったので宣伝しておきます。

smartchr.el from imakado on Vimeo.

詳しい使い方等は、はKAYACのエンジニアblogに書いた記事 smartchr.el を使って生産性を上げる : tech.kayac.com - KAYAC engineers’ blog をご覧下さい!!

November 24, 2009

インストールされているモジュールのパスを取得する

モジュール名から .py ファイルのパスを得たくて探してみたのですが、正しい方法がわかりませんでした。

結局、以下のコードでお茶を濁すことにしました。

import sys
import inspect

def main(argv):
  m = eval('__import__("' + argv[1] + '")')
  print inspect.getsourcefile(m)

if __name__ == '__main__':
  main(sys.argv)


perlだと

perldoc -ml 'Ark'

で、簡単にとってこれるんだけどなあ。

November 16, 2009

auto-complete.el 1.0aでlambdaで定義したコマンドが使えない

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

2009-11-20 追記

以下の変更は、 322dcb5a で本家にmergeされました。

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


auto-complete.elのversionを 1.0a(http://github.com/m2ym/auto-complete)に上げたのですが、

(global-set-key (kbd "=") (lambda () (interactive) (insert "=")))

上のようにlambdaで定義されているコマンドを実行すると、エラーが出るようになってしまいました。

軽く追ってみたところ、ac-trigger-command-pのなかのsymbol-nameにlistが渡るのが原因みたいです。

具体的には、以下のテストが通りません。

(dont-compile
  (when (fboundp 'expectations)
    (expectations
      (desc "ac-trigger-command-p retums nil if command is lambda")
      (expect t
        (let ((command-fn (lambda () (interactive) "hi!")))
          (when (commandp command-fn)
            t)))
      (expect nil
        (let ((command-fn (lambda () (interactive) "hi!")))
          (ac-trigger-command-p command-fn))))))

コマンドを返す関数( (lambda () (interactive) ...) を返す関数)をつかってコマンドを定義するとこのような問題がでるかも、と思いました。

稚拙、http://github.com/imakado/emacs-smartchr でもこの方法でコマンドを定義しています。

とりあえずの回避策として、ac-trigger-command-pにlistで定義されたコマンドが渡って来た場合に、nilを返すようにしてみました。

http://github.com/imakado/auto-complete

githubにコードがあったので、forkしてpushしました。

実は久しぶりにauto-complete.elのバージョン上げたのですが、凄く便利になっていて感激しました。(incf m2ym )

k1LoWさんの "動かないと業務に支障がでる" 発言にも納得です。

IMAKADOIMAKADO 2009/11/17 11:11 > m2ym
pull requestしました!