さとうようぞうのblog

先日書いた Codeeval で Clojure が遅い&メモリを大量に消費する件、 サポート掲示板に記事がありました。

https://getsatisfaction.com/codeeval/topics/clojuretimememorystatsseem_wrong

Official Representative の人が

It's true that Clojure takes too much resources. At least on our environment. We'll be investigating this soon.

と言っているので、そのうち対応されるのではないか、と。
4ヶ月前のものなので、時間かかり過ぎな気がしなくもないですが・・・。

Clojure をもう少し書けるようになりたいな、と思って Ruby で書いていた CodeEval の課題の幾つかを Clojure で書きなおしてみたんだけど、実行速度が Ruby と比較するととても遅い。。。

例えば Open ChallengesLowercase だと、

  • Ruby : 187 ms
  • Clojure : 5052 ms

27倍くらい時間が掛かっているし、メモリ量も

  • Ruby 3.4MB
  • Clojure 58.1MB

と17倍くらいの開きが。。。
別にランキング入りを狙っているわけではないので、アホみたいに高速で動くコードを書きたいというわけではないですが、初学者として「俺の書いているコード、これじゃ全然ダメなんじゃないか?」と、かなり不安に思っています。

スクリーンショットも貼っておきます。

Screen Shot 2013-11-22 at 10.24.44 AM.png

Ruby 版のコードはこんな感じ。

file = open(ARGV[0])
file.each {|line| print line.downcase! }
file.close

Clojure 版はこんな感じ。

(println (.toLowerCase (slurp (first *command-line-args*))))

「CodeEval で実行するの場合、こう書いた方が早いよ!」というのをご存知の方がいらっしゃいましたら、是非教えて下さい。よろしくお願いします。

おいしいClojure入門 (Software Design plus)
ニコラ・モドリック 安部 重成
技術評論社
売り上げランキング: 57,899

プログラミングClojure 第2版
Stuart Halloway and Aaron Bedra
オーム社
売り上げランキング: 134,200

プログラミング言語 Ruby
まつもと ゆきひろ David Flanagan
オライリージャパン
売り上げランキング: 197,492

Rails サーバーを起動しようとすると、こんなエラーが。。

bundle exec rails s
/Users/yz/Documents/work/repo/hoge/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.11/lib/active_support/dependencies.rb:251:in `require': This installation of RMagick was configured with ImageMagick 6.8.6 but ImageMagick 6.8.7-3 is in use. (RuntimeError) 

原因はおそらく、先日別案件で必要に迫られて sudo port upgrade outdated した際に ImageMagick が更新されてしまったせいでしょう。
前にも同じ現象が起こっていて、その時はググって解決策を探したので、忘れないようにメモ。

さっきのエントリ の続き。

チュートリアルのページにある templates/header.html をプロジェクトの src 以下に配置しました。コミットはこれ

分からなくてハマった(ハマってる)のが

  • templates ディレクトリの作成場所
    • 最初、 src と同じ階層においてしまった
    • src の中に置く、で良いのだろうか
  • チュートリアルでは次にコードが続いているけど、それは src/core.clj に書いていいんだろうか?

lein repl で作成したテンプレートを読み込みしてみると、ここまでは上手く行っているように見える。

enlive-templating ➤ lein repl
nREPL server started on port 49735
REPL-y 0.1.10
Clojure 1.5.1
    Exit: Control+D or (exit) or (quit)
Commands: (user/help)
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
          (user/sourcery function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
Examples from clojuredocs.org: [clojuredocs or cdoc]
          (user/clojuredocs name-here)
          (user/clojuredocs "ns-here" "name-here")
user=> (ns enlive-templating
  #_=>   (:require [net.cgrand.enlive-html :as html]))
nil
enlive-templating=> (use 'clojure.pprint)
nil
enlive-templating=> (pprint (html/html-resource "templates/header.html"))
({:type :dtd, :data ["html" nil nil]}
 {:tag :html,
  :attrs {:lang "ja"},
  :content
  ("\n  "
   {:tag :body,
    :attrs nil,
    :content
    ("\n\t"
     {:tag :header, 
      :attrs nil,   
      :content
      ("\n\t  "
       {:tag :h1, :attrs nil, :content ("Header placeholder")}
       "\n\t  "
       {:tag :ul,   
        :attrs {:id "navigation"},
        :content
        ("\n\t\t"   
         {:tag :li, 
          :attrs nil,
          :content  
          ({:tag :a,
            :attrs {:href "#"},
            :content ("Placeholder for navigation")})}
         "\n\t  ")} 
       "\n\t")}
     "\n  ")}
   "\n\n")})
nil

Github にある clojure-cookbook にあるチュートリアルから着手することにしました。

https://github.com/clojure-cookbook/clojure-cookbook/blob/master/webapps/templating-with-enlive/templating-with-enlive.asciidoc

enlive を :dependencies に追加して lein deps を実行。 lein repl が動くようになった。

enlive-templating ➤ lein deps
Retrieving enlive/enlive/1.1.1/enlive-1.1.1.jar from clojars
enlive-templating ➤ lein repl
Retrieving cheshire/cheshire/4.0.3/cheshire-4.0.3.jar from clojars
Retrieving clojure-complete/clojure-complete/0.2.2/clojure-complete-0.2.2.jar from clojars
Retrieving slingshot/slingshot/0.10.3/slingshot-0.10.3.jar from clojars
Retrieving clj-http-lite/clj-http-lite/0.2.0/clj-http-lite-0.2.0.jar from clojars
Retrieving org/thnetos/cd-client/0.3.6/cd-client-0.3.6.jar from clojars
nREPL server started on port 65351
REPL-y 0.1.10
Clojure 1.5.1
    Exit: Control+D or (exit) or (quit)
Commands: (user/help)
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
          (user/sourcery function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
Examples from clojuredocs.org: [clojuredocs or cdoc]
          (user/clojuredocs name-here)
          (user/clojuredocs "ns-here" "name-here")
user=> exit
Bye for now!

コミットはこれ

Leiningen のインストール

Github の leiningen プロジェクトにある README の通りに作業。~/bin にインストールが推奨っぽいので、それに従う。

bin ➤ vi ./lein
bin ➤ chmod 755 ./lein
bin ➤ ./lein self-install                                                                                              
Manual self-install is deprecated; it will run automatically when necessary.
Downloading Leiningen to /Users/yz/.lein/self-installs/leiningen-2.3.3-standalone.jar now...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 13.0M  100 13.0M    0     0   137k      0  0:01:37  0:01:37 --:--:-- 1267k

つい最近 Rails を使った多言語対応のソーシャルゲームアプリを作ったので、自分のメモがてら、気をつけた方が良さそうなポイントを残しておきます。 (今現在も開発進行中ですが) 割と最近見つけたんだけど、このエントリがコンパクトにまとまっていて、 i18n のエントリポイントとしては最適な気がしました。

Railsの多言語化対応 i18nのやり方を整理してみた!【国際化/英語化】 - 酒と泪とRubyとRailsと

このエントリが非常に良いので、流れに沿った形で僕の反省点などを書いていこうと思います。

システム設定の Mission Control で、「Automatically rearrange spaces.. 」のチェックを外す。

20130425.jpg

Cmd + Ctrl + arrow で左右行ったり来たりできるようにしているので、順番が勝手に変わるのは厄介なので。

History は利用頻度めちゃくちゃ高いので C-c ; C で時計と行ったり来たりするよりは常時表示しておきたい。ので Imenu の下の方を使いたくて、こんな感じに設定したらいけた。

e2wm_with_clock

Mac で作業する時はこれでいいとして、1024*768な10インチノートで作業する時用に e2wm:c-code-recipe をもう一個設定しておきたいのだけど、 Emacs でPCの解像度を取得して cond で振り分け、とかできるのかな?

mew-summary-rename-folder って関数があった。

mew-summary-rename-folder is an interactive compiled Lisp function in `mew-summary4.el'.

It is bound to R r.

(mew-summary-rename-folder)

Rename this folder.

sammary 上で 'R r' するとリネーム後の名前を聞かれるので、入力してエンター。

IMAPのリモートのフォルダ名もちゃんと変えてくれたけど、勝手に覚えている振り分けルールの方は自動では更新されないようだった。

最近のコメント

アイテム

  • Screen Shot 2013-11-22 at 10.24.44 AM.png
  • Screen Shot 2013-11-16 at 10.12.14 AM.png
  • 20130425.jpg
  • e2wm_with_clock
  • 20120205_01.png
  • IMG_2624.jpg
  • IMG_2554.jpg
  • IMG_2565.jpg
  • IMG_2626.jpg
  • IMG_2627.jpg

月別 アーカイブ

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.04