読者です 読者をやめる 読者になる 読者になる

紺屋高尾

ぬしの女房はんに、わちき、なりたいんざます。来年三月十五日、年季(ねん)が明けるんざます。そのときは眉毛落として歯に鉄漿(かね)染めて、ぬしの傍に参りんすよって、お内儀(かみ)さんにしてくんなますか?

花粉症が治った話し

花粉症治っちゃった

プログラマ(のみならず日本国民)の敵である、花粉症が治った。

今までは花粉症の時期は、薬を飲まないとティッシュ一箱使うくらい鼻水が止まらなかった。 目がかゆい、喉がいがいがする。。。 ぶっちゃけまともにプログラミングに集中なんて出来なかった。

薬を飲めば収まるけど、一日一錠の薬も数時間後には切れる。 薬を飲むと眠くなる。

そんな人は沢山いる。 花粉症、日本のGDPを著しく貶めている気がする。 花粉症を克服する事が日本の経済を立て直す、最も重要で効果的な方法なのだ!(てきとう)

だが、そんな花粉症が治った。 今シーズンは一回も薬を飲まなかったし、たまに目がかゆいかな?くらいで鼻水をかまなかった。

僕の年間進捗率は爆速である。

なんでさ

早くなんでか教えろとな。

屋久島 春ウコン 粉末」でAmazonへGO!だ。

飲み方

粉末タイプを水に溶かして一度に一日の適量を飲むのではなく、喉が渇いた時にウコン水を飲む感じにしよう。 僕はもう数年春ウコン飲んでるけど、一日一回適量だと花粉症は改善しなかった。 飲み方重要。 僕はプロテイン溶かす、なんか振るシェイカーみたいなので振って冷蔵庫に入れておいて喉乾いたら飲んでます。

心優しい方は

屋久島春ウコン粉末300g

↑から買ってくれるととっても嬉しいよ。

さらにくわしく

ウコンには春ウコンと秋ウコンがある。 秋ウコンはアルコール分解に役立つ成分が多いが、漢方薬とかには春ウコンが使われているらしい。

免疫力を高めて、重病の方が治った例もあるらしい。 詳しくは http://www.haru-ukon.com/ こちらを見ると良いと思う。

ProMotionのScreenについて

RubyMotionのお勉強の一環で、ProMotionをお勉強しようとしたら数時間悩んだ話。 結論からいうと、 Gemfileにgithub指定して最新版を入れましょう ね。

ProMotionのScreenでnav_varを使おうとするとndefined methodnav_bar' for RootScreen:Class (NoMethodError)`と怒られる。 ソースはこんな感じ。

class RootScreen < PM::Screen
  title "Root Screen"
  nav_bar true

  def on_load
    set_nav_bar_button :right, title: "Help", action: :open_help_screen
  end

  def open_help_screen
    open HelpScreen
  end
end

三行目の部分ですね。 結論からいうと、この書き方はversion 2.5.0beta1からっぽい。 Gemfilieにgithub: 'infinitered/ProMotion'を指定せず、普通に書いてBundle Installしてインストールされるバージョンではこの記法は使えない :(

なので

gem 'ProMotion', github: 'infinitered/ProMotion'

としてあげませう。

Angularjsのng-repeatの描画終了後に何らかの処理をする

Angularjsのng-repeat終了後にfunctionを実行したい場合が多分あると思います。

https://docs.angularjs.org/api/ng/directive/ngRepeat

上記Documentを読むと$lastがあるのですが、これをdirectiveでそのまま使うとまだ描画が終わっていないので、上手く動きません。

# slim

ul ng-controller="HogesController as hoges"
  li ng-repeat="hoge in hoges.list" hoge-on-last-repeat=''
    .hoge id="hoge-{{hoge.id}}"
# coffee script

 angular.module('module-name').directive("hogeOnLastRepeat", [ () ->
    return ($scope, $element, $attrs) ->
      if $scope.last
        # ここで処理を書く
])

$scope.lastconsole.log('#hoge-123').attr('id')とかしても'hoge-{{hoge.id}}が返ってきます。まだ描画されていないです。

なのでdirectiveをこのようにしてあげます。

# coffee script

 angular.module('module-name').directive("hogeOnLastRepeat", ['$timeout' ($timeout) ->
    return ($scope, $element, $attrs) ->
      if $scope.last
        $timeout( () ->
          # ここで処理を書く
        )
])

これでちゃんと描画された後に処理が走りますヽ(´ー`)ノ

MacでMozart Programming Systemを実行するために

Mozart Programming System MacOSX OZ CTMCP コンピュータプログラミングの概念・技法・モデル

コンピュータプログラミングの概念・技法・モデル(CTMCP / ガウディ本)がまだ途中までしかやっていなかったなぁと思い、1ページからやろうとMacMozartを入れたら

Aquamacs Not Found

が出た。 あぁ、そういえば最初にこれ買った当時もこれあったわー。。。と思い、まぁ動かすようにしましたよっと。

出版された年が2007年なのでversion1.4.0を選択。 version2なら問題ないのかも?(未検証)

必要なものをDL

http://mozart.github.io/ から remain available to downloadをクリックして1.4.0のdmgをDLする。 クリックしたらaquamacsがないよ〜って言われるのでaquamacsをDLする。 でもまだ起こられる。

scriptを編集する

/Applications/Mozart.app/Contents/Resources/script

これでaquamacsを探したりしているみたいだが、aquamacsのPATHが間違っている(Aquamacsが多分変わって、それに対応していないと思われる). 上記ファイルの10行目と61行目を以下のように修正

...
if [ ! -e "/Applications/Aquamacs.app" ]; then
...
exec /Applications/Aquamacs.app/Contents/MacOS/Aquamacs --eval '(setq load-path (cons "'$OZHOME'/share/elisp" load-path))' -l oz.elc -f run-oz $2 &

これでMozartを実行出来ます:)

LISPのS式による前置記法について

前置記法は気持ち悪い?

よくLISP族における前置記法が気持ち悪い、読み難いという話を聞きます。 Lisperの多くは「そんなことない」「むしろ読みやすい」といいます。 なぜ同じプログラマーなのにこのような真反対な意見が生まれるのでしょうか?

; S式による前置記法の基本的な例

(+ 1 1) ; 1 + 1 = 2 となる

正直、僕も初めてCLを触った時に前置記法が気持ち悪いと感じました。 ですが今は気持ち悪いとも読みにくいとも書きにくいとも感じません。

なぜ?単なる慣れ?

単なる慣れではないと考えています。 ではなぜか?実は他の言語と少しだけ表記方法が違う、思想が違うだけで根本は変わらないからだと考えます。

例えばRubyでメソッドに引数を渡す場合は

hoge(1)

のように書きます。 メソッドに引数を渡す、Rubyだけではなく一般的なプログラミングのスタイルです。 恐らくS式に慣れていない方はこのスタイルだとほっとするのではないでしょうか?

でもちょっと待って! これ、カッコの位置をちょっとだけずらすとどうなるでしょうか?

(hoge 1)

なんとS式になりますね。 そう、実はカッコの位置が違うだけで他の言語のとそうは変わらないのです。

Lispでは+や-といった演算子も他の演算子と区別せず、同一に書いているだけなのです。 つまり「前置記法」なんて言われても身構える必要はなく、単純に関数を最初に書いて次に引数を書いていけばいいだけなのです。

ちょっと多言語と比較

; Common Lisp

(defun fib (n) ; 関数fibを定義, (n)はfibへの引数
  (if (< n 2) ; ifと条件
    n ; then
    (+ (fib (- n 2)) (fib (- n 1))) ; else
  ) ; if終わり
) ; 関数fibの定義終わり

; lispでは最後のコッカは以下のようにまとめることが多い

(defun fib (n)
  (if (< n 2)
    n
    (+ (fib (- n 2)) (fib (- n 1)))))
# Ruby

def fib(n)
  if(n < 2)
    n
  else
    fib(n - 2) + fib(n - 1)
  end
end

こうやってみると、確かに括弧の数は多いかもしれないけれど、そこまで他の言語と変わらないと思いませんか? +や-や<などの演算子も他の関数と同じように扱っているだけなんです。

だけって言われても、、、と思うかもしれませんが、ちょっと勇気を出して挑戦してみませんか? 意外とすぐに違和感なく自然に書けると思いますよ :D

Common LispのTestingFrameworkを2つほど触ってみる

昨日に引き続きCLネタです。

引っ越しの準備で大江戸Ruby会議に行けなくて寂しいので、家で一人でLISP妖精さんとお話して*1戯れて寂しさを紛らわせています。

で、CLでも当たり前の如くテスト書きたいよねーってことで http://quickdocs.org/ でライブラリを調べて、取り敢えず2つ試して見ました。

当然のごとくVimで書いていますemacsLISPとか今どきないわー(煽 *2

CL-TEST-MORE

perlのtest-moreに影響を受けているとのこと。 perlわからんので似てる〜とか言えない。 僕的にはあまり馴染みのない感じでしたけどとてもわかり易かったです。

;;; CL-TEST-MORE
(ql:quickload :cl-test-more)
(in-package :cl-test-more)

(print "ok Function")
(ok (eq 1 1) "description") ; ok
(ok (eq 1 2) "description") ; not ok

(print "is Function")
(is 1 1 "description") ; ok
(is 1 2 "description") ; not ok

(print "isnt Function")
(isnt 1 2 "description") ; ok
(isnt 1 1 "description") ; not ok

(defun fib (n) (if (< n 2) n (+ (fib (- n 2)) (fib (- n 1)))))
(print "TEST Fibonacci Function")
(is (fib 0) 0)
(is (fib 1) 1)
(is (fib 2) 1)
(is (fib 3) 2)
(is (fib 4) 3)
(is (fib 5) 5)
(is (fib 6) 8)

詳しくはこちら

lisp-unit

こっちのほうが僕の好みでした。 個人的に何か開発するときはこっちを使うかな。

;;; LISP-UNIT
(ql:quickload :lisp-unit)
(in-package :lisp-unit)

(define-test fib
   (assert-equal 0 (fib 0))
   (assert-equal 1 (fib 1))
   (assert-equal 1 (fib 2))
   (assert-equal 2 (fib 3))
   (assert-equal 3 (fib 4))
   (assert-equal 5 (fib 5))
   (assert-equal 8 (fib 6)))

(defun fib (n) (if (< n 2) n (+ (fib (- n 2)) (fib (- n 1)))))
(run-tests '(fib))

(define-test my-sqrt
   (dotimes (i 5)
      (assert-equal i (my-sqrt (* i i)))))

(defun my-sqrt (n) (/ n 2)) ; これはテストコケます
(run-tests '(my-sqrt))

(run-tests :all)

詳しくはこちら

*1:ダグラス・ホフスタッターによるとREPL(対話型評価環境)の>や?はLISPの妖精で、REPLを使うことはLISPの妖精との対話である(ダグラス・ホフスタッター頭良すぎてぶっ飛んでる) メタマジック・ゲーム―科学と芸術のジグソーパズル

*2:冗談なのでマサカリ禁止

Common LispライブラリShellyを試してみた

MakeやRakeみたいなことが出来るLispライブラリShellyを試してみました。 おもしろいので貴方も試してみましょう(今回は一回もエディタを開いていないので、Emacsじゃないと、、、みたいなことは一切ないよ!!!)。

Shellyのサイトはこちら.

昔シェリーというイタリア人と付き合っていた事があって、Shellyという単語をみて懐かしいなーと思ったのが切っ掛けです(実話).

Common Lispは素晴らしい言語ですが縁が無い方が結構おられると思いますので、処理系のインストールから始めてみましょう。 以下、環境はMacOSX 10.9.2です。

Common Lispのインストール

Common Lispに限らず、Lisp族は沢山の処理系が存在するのでまず,どの処理系を使うのか選ばなくてはいけません。 今回はModernCommonLisp 第1回 Common Lisp処理系のインストールを参考に、Clozure CLを選択します。

~ iori:λ brew search clozure
clozure-cl
~ iori:λ brew install clozure-cl

こんだけ.

ライブラリを利用するためにQuciklispをインストールする

Rubyでいうgemとかそういうの。 これもインストールは簡単で

~ iori:λ wget http://beta.quicklisp.org/quicklisp.lisp
~ iori:λ ccl
Welcome to Clozure Common Lisp Version 1.9-r15758  (DarwinX8632)!
? (load "quicklisp.lisp")
? (quicklisp-quickstart:install :path ".quicklisp/")
? (ql:add-to-init-file)

こんだけ.

Shellyをインストールする

http://shlyfile.org/ に書いてある

$ curl -L http://shlyfile.org/shly | perl - install
$ PATH=$HOME/.shelly/bin:$PATH

を実行するだけ

なんか試してみる

~/work iori:λ mkdir shelly
~/work iori:λ cd shelly
~/work/shelly iori:λ echo '(defun fib (n) (if (< n 2) n (+ (fib (- n 2)) (fib (- n 1)))))' > shlyfile
~/work/shelly iori:λ shly fib 10

55

わーい、RakeとかMakeみたいなことがCLで出来たぞ!