2012年6月2日土曜日

プログラミング系で押さえておきたい出版社が電子版をかなり扱うようになってきた

出版用にレイアウトされたプログラム系の本が、2割引ぐらいでうっているらしい。


O'Reilly Japan Ebook Store

出版したオライリー本がの一部を扱っている

オーム社eStore(β)
オーム社の出版物のなかでもアジャイル系や各言語の有名な入門書がありおすすめ。

達人出版会
独自の本以外にも、インプレスジャパンやアスキー・メディアワークスの書籍も扱っている。

2011年12月9日金曜日

ClojureCLRを知ろう

この記事は、Clojure Advent Calendar 2011の記事(9日目)です。

ClojureCLRとはなにか?

ClojureCLRは、David Miller(@dmiller2718)さんがMicrosoft .NET Framework向けにポートしたClojure環境です。

あまり広報活動をしておらず、その動向があまり知られていないClojure環境でもあります。
2007年のClojure登場から遅れること1年、2008年秋から開発をはじめ、現在一段落ついたこともあり、今年10月のClojureの祭典Clojure/Conj 直前に公式ブログを開設してアンケートをおこなった結果をもとに、知名度向上やを開発コミュニティーの結成を目指しています。

一緒に個人のブログ(Rational Approximation)も始めていて、初回の記事はClojureCLRの創世記となっています。

この記事では、概観のみ説明でお茶を濁したいと思います。(時間がなかった。。。)

入門記事については、C#/.NET開発者のRob Rowe(@rippinrob)さんによるClojureCLRの連載がタイミングよく My Clojure Adventureで始まっていますのでこちらをよろしくお願いします。

リソース


現在の状況

githubのコミットヒストリータグを眺めると、Clojureの開発リポジトリを追う形で修正を行なっており、一ヶ月以内には反映するようなペースでJVM版の差分を取り込む形で開発が進んでいます。

現在のJVM本家と同じくリリース版は1.3.0、開発版は1.4.0のalpha2版が最新となっております。

ソースからは.net Framework 3.5と4.0向けのDebug/Releseビルドが可能です。
バイナリは現在リリース版の1.3.0までで、Debugビルドのみ用意されてますが、自前でビルドして試してみたところReleaseビルドとパフォーマンスの差はあまり無いようです。

Monoとの互換性

開発者が少ないこともあり、Monoの互換性まで手が回らない状況で実装を行なっているため、REPLのコンソール操作とコンパイラがまともに動作しない状況ですが、cljファイルやコンパイルして出来たexeとdllの実行などは行うことができます。

また、利用者アンケートの結果では開発者にも(マインド)ユーザーにも優先度が低いと判断されていますので、Monoで使いたいユーザーはパッチを作るのを前提としたほうが(誰かが)幸せになれます。
※アンケートの回答した中では実質ユーザは2人でした。。。

ちなみに、Boo、IronPython、F#、Phalanger(PHPコンパイラ)などは、Monoとの互換性も考慮して開発されています。

REPLの起動速度

REPLの起動は同じCPUでJVMを使った場合の2倍程度かかります。
但し、.NET Framework環境ではAOT(ngen)でネイティブバイナリ化が可能ですので、その場合にはJVM環境の1/2程度の時間で起動します。Mono環境でも同じ程度の時間で実行できました。

Windows 64bitではngenコマンドが、

%SystemRoot%\Microsoft.NET\Framework\<バージョン (v3.5, v4.0.30319)>\ngen.exe
%SystemRoot%\Microsoft.NET\Framework64\<バージョン (v3.5, v4.0.30319)>\ngen.exe

と用意されており、「Framework64」のngen.exeを実行する必要性があるので注意しましょう。 

REPLの起動については、「Clojure.dll」と「clojure.core.clj.dll」のみネイティブバイナリにしても起動が高速になります。
Mono環境では、「mono-sgen --aot」など、GCに世代別GCを使いAOTを行った場合に高速に起動出来ました。

バックエンドにLLVMを使うための「--llvm」オプションを使った場合は、REPLの起動が遅くなっていましたので、いまのところ相性は良くないようです。


ちなみに、AOT実行で起動やスクリプトの読み込みまで早くなりますが、JITより記述したプログラム部分の実行が早くなる訳ではありません。

まとめ

JVMに比べて、JITの実行速度最適化が進んだ実装がない共通言語基盤(CLI)ではありますが、 無償のAOT環境が用意されている点などREPL向けの環境でもありますので、 C#やVSの環境が苦手としている分野(知らないけど)でClojureCLRにも陽の目を浴びるチャンスがあるかもしれません。

leinningenなどのビルドツールなどが用意されていないなど、まだ実用的な環境を用意するには不備も多いですが、 頭の片隅にでもClojureCLRというものがあるということ、覚えていただければ幸いです。

以上、駄文にお付き合い下さいありがとうございました。

2011年9月25日日曜日

メモ:(MEAPを確認して)購入予定の書籍

"Monadic Design Patterns for the Web", Artima Press
by Greg Meredith (Lucius Gregory Meredith)
http://www.biosimilarity.com/main.html http://www.biosimilarity.com/publications.html

"Functional Programming in Scala", Manning Publications
by Paul Chiusano, Runar Bjarnason and Tony Morris
http://www.scala-lang.org/node/10448

?Big Data?
?Principels and best practice of scalable realtime data systems?
Manning Publications
by Nathan Marz
http://www.slideshare.net/nathanmarz/the-secrets-of-building-realtime-big-data-systems
https://thestrangeloop.com/sessions/cascalog

2010年11月13日土曜日

Quercas on Google App Engine

Quercus on Google App Engine利用時に、Slim3のServletで使われているように「load-on-startup」を「1」にしてやると、Spin-up時のcpu_msが3000前後でほぼ変わらないのに対し、Servletのレスポンスタイム(ms)が14000前後から3000前後と大幅に縮小されるのが確認できた。(まあ偏っただけかもしれないが・・)


「com.caucho.quercus.servlet.GoogleQuercusServlet」だけでは、効果が確認できなかった。そこで、GAEでは使わない「com.caucho.quercus.servlet.QuercusServlet」の設定を追加して、「load-on-startup」を「1」にしてやると、レスポンスタイムが短縮する変化が起きた。

WEB-INF/web.xml:

  <servlet>
    <servlet-name>quercus</servlet-name>
    <servlet-class>com.caucho.quercus.servlet.GoogleQuercusServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet>
      <servlet-name>QuercusHot</servlet-name>
    <servlet-class>com.caucho.quercus.servlet.QuercusServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>


spin-up時間

残りの、quercusを動かすための設定は、
WEB-INF/appengine-web.xml:
    <static-files>
      <exclude path="/**.php" />
    </static-files>
    <resource-files>
      <include path="/**.php" />
    </resource-files>

WEB-INF/lib:
に、resin.jarを追加。

resin.jarが、大きいいので分割するのに、appengineのdeployには「--enable_jar_splitting」が必要でした。 # appengine-java-sdk-1.3.8/bin/appcfg.sh --enable_jar_splitting update WEB-INF/..

設定については、下記のページを参照してください。
・http://blog.caucho.com/?p=187
・http://www.atmarkit.co.jp/fcoding/articles/gaephp/02/gaephp02b.html (日本語環境の設定あり)

2010年6月28日月曜日

旧compojure.orgのサイトミラー

旧compojure.org? (compojure-0.2.0程度)の ミラーサイト を試験的に用意しました。
(ソース)

gh-pagesについても(6/28現在)エラーが出ているので、用意してみました。
(ソース)(7月上旬には復帰)