これも 103:シリーズです。
12個の数列について、ルール2がすでに満たされている場合、条件を満たすためには、ルール1について何セットの組み合わせをチェクしなければならないかという問題。
ルール1は、どのサブセットを取っても合計が違うということですが、ルール2から要素数が多い方が要素の合計が大きいことは確定なので、要素数が同じである場合だけ確認すればよいということになります。。
要素数が同じ2つの数列の和が等しいかどうか確認する必要があるのはどんなときか考えればよいということ。
「こういう選択をしたら同じになる可能性がある」か、「こういう選択をしたら片方が大きくなる」のどちらかの選択方法をみつければよい。
たとえば、1,2.3 と 10,11,12のぺあであれば、まあ、確実に後の方が大きいよね。
READ MORE
12個の数列について、ルール2がすでに満たされている場合、条件を満たすためには、ルール1について何セットの組み合わせをチェクしなければならないかという問題。
ルール1は、どのサブセットを取っても合計が違うということですが、ルール2から要素数が多い方が要素の合計が大きいことは確定なので、要素数が同じである場合だけ確認すればよいということになります。。
要素数が同じ2つの数列の和が等しいかどうか確認する必要があるのはどんなときか考えればよいということ。
「こういう選択をしたら同じになる可能性がある」か、「こういう選択をしたら片方が大きくなる」のどちらかの選択方法をみつければよい。
たとえば、1,2.3 と 10,11,12のぺあであれば、まあ、確実に後の方が大きいよね。
ってなことを考えて、いくつか例を書いてみたんですが、思いついたのがこの方式。
103のシリーズです。
これも去年の末に解いてますね。
沢山ある数列の中から、条件に合うやつを探す問題
(ルール1) 部分集合を全部作って、合計した値が同じものが無いかどうかチェック
(ルール2) 小さい方からと大きい方からできるだけ取るが、大きい方を1つ少なくした時に条件に合うかどうかチェック
ルール2の方はこれでいいかどうかちょっと不安だったけど、合ってたからよしとする。
READ MORE
これも去年の末に解いてますね。
沢山ある数列の中から、条件に合うやつを探す問題
(ルール1) 部分集合を全部作って、合計した値が同じものが無いかどうかチェック
(ルール2) 小さい方からと大きい方からできるだけ取るが、大きい方を1つ少なくした時に条件に合うかどうかチェック
ルール2の方はこれでいいかどうかちょっと不安だったけど、合ってたからよしとする。
これも去年の年末にやったやつです。
Fibonacci数列で、最初の9桁がPandigit(1-9を全て含む)で、最後の9桁もPandigitのものを探す問題。
Fibonacci数列を順に作って条件に合うかどうかチェックするだけですが、ちょっと工夫したと言えば、数字を文字列にするのってコストがかかるので、数字のまま取りだせる下9桁を先にチェックするようにしたところくらいでしょうか。
たいしたことやってないのに時間かかってます。
READ MORE
Fibonacci数列で、最初の9桁がPandigit(1-9を全て含む)で、最後の9桁もPandigitのものを探す問題。
Fibonacci数列を順に作って条件に合うかどうかチェックするだけですが、ちょっと工夫したと言えば、数字を文字列にするのってコストがかかるので、数字のまま取りだせる下9桁を先にチェックするようにしたところくらいでしょうか。
たいしたことやってないのに時間かかってます。
去年の末に解いたやつです。
条件に合う数列を新しく作る問題
これ、かなり悩んだ。 102を解いたあと、すぐに手を付けたんだけど、解きかたわからず/思いつかずで、放置している間に数年経ってしまった。
まあ<結局、初期の頃に思いついた、「全部やってみる」方式で解いてみることにして、実際やってみたら、時間はたいしてかからなかったという。
- 真ん中の数字を先頭にして新しい数列を作る
- 含まれる数を前後にいくつかずらした数列を全て生成
- 昇順になっていないものを除外
これで、候補を作って、条件に合うかどうかチェックというやりかた。
READ MORE
条件に合う数列を新しく作る問題
これ、かなり悩んだ。 102を解いたあと、すぐに手を付けたんだけど、解きかたわからず/思いつかずで、放置している間に数年経ってしまった。
まあ<結局、初期の頃に思いついた、「全部やってみる」方式で解いてみることにして、実際やってみたら、時間はたいしてかからなかったという。
- 真ん中の数字を先頭にして新しい数列を作る
- 含まれる数を前後にいくつかずらした数列を全て生成
- 昇順になっていないものを除外
これで、候補を作って、条件に合うかどうかチェックというやりかた。
これも5年前に解いたやつだ。 思い出しながら書く。
内部に原点を含む三角形を判定する問題です。
外積を計算して同じ向きかどうかを判定しています。
READ MORE
内部に原点を含む三角形を判定する問題です。
外積を計算して同じ向きかどうかを判定しています。
普段は仕事でPCを使うことが多いし、趣味がらみでもツール類の関係で基本的にはWindowsが必要になったりするので、家でも結局はWindowsを使っています。
とは言え、やっぱりClojureを始めとしたプログラミング関連の作業はコマンドラインでやりたいし、使い慣れたUNIX系のツールを使った作業からは離れられないのでMsys2を導入して環境を作っていたわけですが、そこはそれ、後づけの環境なので、いくつか気に入らないところもあったりするわけです。
そんな中、話題の Windows10 Fall Creators Update で正式版となったWSL、要するにWindows上のLinux に乗り換えてみたら、Msys2の問題を解決してくれてなかなかよかったので、そのあたりの事を書いてみます。
Msys2環境の問題
このMsys2というのはそもそも「UNIX系のツールをWindowsで動くようにコンパイルするため」の環境なので、コンパイルしたものはWindowsのソフトになっちゃうわけで、そのツールはMsys2環境で動くことはあまり考えていないのです。たとえば(僕にとっては)開発環境の中核を成しているEmacssも、Windows用のバイナリはMsys2でコンパイルされているので、Windows環境でうまく動作するのであって、実はWindows環境ではないMsys2との親和性は高くないのです。
どういうことかと言うと、たとえばEmacsからMsys2のコマンドであるgitを使おうとするとちょっと工夫が必要だったり、動かなかったりするということです。
たとえば EmacsはWindowsのパスは「 C:\users 」を理解できますがgitコマンドには理解できないということになるのです。
僕が今一番困っているのが、「magitが遅い」ことです。magit-statusなど、gitとのやりとりをするコマンドを打つと、30秒から1分ほどかかります。慣れてしまいましたが、こういう作業の部分に時間を取られるのはあまり納得が行きません。
また、clojureの開発環境であるciderが不安定だったりもします。たまに、といっても2日に1回くらい、固まります。これもLinuxだったらまず発生しない現象です。
「windowsでemacsが動いているだけで幸せなんだから、外部連携などはできたらラッキーぐらいに考えておけ」というような意見もあるようですが、MacがOSXで裏でUnixが動くようになってから、開発環境としてのMacを指をくわえて見ているだけの状態はちょっと辛いものがありました。
ということで、WSLを使うことでこれらの問題が解決しているんじゃないかという期待とともに、進めていくことにしましょう。
WSL環境構築
さて、これから出てくるほとんどの手順は話題の作業内容なのでここで細かいことは書かずに何をやってどうなったかを中心に書いていくことにします。細かいところを知りたい場合はいろいろなところで解説されているので、検索してみてください。
Windows10 をFall Creators Updateにする
まずはこれですね。WSLが正式版になっているので。WSLを有効にして、Ubuntuを入れます。
Windows Subsystem for Linuxを有効にして、ストアからUbuntuを入れます。SUSEという選択肢もありますが、まずは、使ったことのあるUbuntuにしました。変なところではまりたくないですからね。
Ubuntuを最新にします。
入った Ubuntu の使い方はほんとに普通のUbuntuと同じで、アップデートするにはapt-getを使います。sudo apt-get update && sudo apt-get upgrade入れたばかりなので、アップデートされるパッケージはあまり無いだろうと思っ
たのは甘くて、かなり時間がかかりました。
javaを入れる
Clojureを使うには必須ですね。Windows側にはjavaは入れてありますが、別途WSL用にも入れてやる必要があります。
以下のコマンドでjava8を入れました。
sudo add-repository ppa:webupd8team/javasudo apt updatesudo apt install -y oracle-java8-installer
ターミナルエミュレータ cmder を入れる
Windowsのターミナルのcmd.exeはWindwos10 Fall Creators Updateでよくなったと言われていますが、そもそも貧弱なのでちょっとくらい良くなってもたいして使いやすくはありません。Msys2では付いているminttyを使っていたのですが、「cmder」というのが評判がよさそうなので、使ってみることにしました。
http://cmder.net/
起動がちょっともたもたしている以外の使いごこちはよさそうです。
Emacs25を入れます
標準のパッケージを入れると24になります。Msys2環境では25を自分でコンパイルして使っているので、同じようにして入れようかと思ったのですが、パッケージを公開してくれているところがあるようなので、それを使わせていただくことにしました。
https://www.yokoweb.net/2017/03/19/emacs-25-apt-install/
25.3が入りました。
いずれは自分でコンパイルしたやつに差し替えようかと。
EmacsをGUIモードで使うには、Xサーバーが必要です。
よいターミナルエミュレータが入っていればそこでEmacsを動かす手もありますが、やっぱり複数フレーム作ったりしたいので、GUI での動作は必要です。ところが、WSLのUbuntuではXのサポートは含まれておらず、そのままではGUIベースのツールを動かすことはできません。
できないんですが、まてよと。
そもそもLinux/UNIXではOSとGUIの機能は別の機能として実装されていて、XサーバーもOS上で動くアプリケーションの1つに過ぎません。そして、Xサーバーって言うくらいなので、クライアントサーバーモデルを取っているので、リモートで動くXサーバーに画面を表示することだって難なくできるはずなのです。
ということは、WSLでなくWindows側にXサーバーを立ててやれば、GUIのアプリケーショ
ンを動かすことができるはずです。 いえ。できます。
VcXsrvをインストールした
Windowsで動作するXサーバとしてはXmingが有名で、仕事PCには入っています。今回環境構築にあたって、調べてみると、Xmingは最近更新が止っているらしく、代りにVcXsrvっていうのが流行っているようです。
https://sourceforge.net/projects/vcxsrv/
流行りものには弱いので、さっそくこれをインストールします。
あちこちで言及されていますが、プログラム起動後のタスクバーのアイコンがXのものでなくそのアプリケーションのものになるっていうことだけでも乗り換える価値がありますね。
フォントも、Windowsの物が使えるようにしておきます。
これでやっと、作業の準備ができました!
そうです。 つらつら書きましたが、まだやっとClojure開発の基盤ができただけなのです。
ここから先は普通にUbunutuでClojureの開発環境を作るのと変わりありません。と言ってもLeiningenを入れるだけですがね。
Leiningenをインストール
Windows版ではありませんよ。Linux版を入れてくださいね。注意
2017/12/11の時点での最新は2.8.0ですが、javaのエラーが出ます。
バグらしい
https://github.com/technomancy/leiningen/pull/2324
1つ前の 2.7.1を使っています。次版には修正されているとのこと。
そのときのエラーメッセージ
yosi@mowegi:~/workspace/clojure/weasel/weasel-example$ lein cljsbuild once
Compiling ClojureScript.
Java HotSpot(TM) 64-Bit Server VM warning: Unable to open cgroup memory limit file /sys/fs/cgroup/memory/memory.limit_in_bytes (No such file or directory)
emacsのclojure開発環境を整えます
clojure開発用で入れているのは以下のパッケージです。- cider
- clojure-mode
- smartparens
- company
さて、これで、Clojureの開発環境は整いました。
プロジェクト作っていろいろやってみる
さて、いろいろ動かしてみましょう。
REPLを使うのが目的のプロジェクト
Project Eulerを解くとか、ちょっと込み入った計算をさせるとかする時には、REPLだけで済ませてしまうことがよくあります。
相変わらず起動には時間がかかりますが、REPLは普通に起動しまして、使っていて特に困るようなこと発生していません。
Webアプリケーション
Webアプリケーションはどうでしょう。サンプルとして、ここにあるやつを動かしてみます。
http://clojure-doc.org/articles/tutorials/basic_web_development.html
結論から言えば、これも特に問題無く動きます。
右がEmacsで下半分がciderの画面です。左の下のWindowsで動いているChromeで起動したプロセスにアクセスしています。
また、タスクバーにあるEmacsのアイコンがEmacsのものになっているのがVcXsrvのよいところです。
このページの記述ですが、最後の方でちょっとはまりました。
REPLを使って作って行ったのですが、最後になって、webサーバのjettyの設定
を追加することになっていて、また、REPLベースで起動する方法が書いてない。
こんな感じです。
(def srv (atom ""))(reset! srv (jetty/run-jetty app {:port 8080 :join? false})
これで、localhost:8080 にアクセスするとページが表示されます。
止めるときは
(.stop @srv)(reset! srv "")
といった感じです。
まとめ
と、いうことで、wslを使ってWindows10でより快適な clojure 開発環境を作
ることができることがわかりました。
不満だったmagitの反応についても、Linux環境と変わらない使用感で快適です。
ただ、まったく何も不満が無いかというとそうではなく、wsl上のLinuxは、
CygwinやMsys2とは違ってWindowsのファイルシステムとは基本的に別になって
いて、間には壁があります。 この壁のおかげで、快適な環境を手に入れるこ
とができるのですが、より2つのシステムで作業していることを意識してつか
わなかればならないというところがあります。
これで、また、ちょっと、Macで開発している人達への羨ましい度が減りまし
た。
これって、 2016 clojure advent calender の記事です。
もともと紙とペン・定規・コンパスなどの道具で点や線を書くので、手書きのころは立体物でも2次元の図面だけ作っていました。僕も実は機械工学科だったので、「図学」とか言ってちゃんとした製図の方法を習ったりしたものです。
コンピュータを使うようになると、自由度が広がってこれまでできなかったようなことができるようになりました。
- 3DCGで立体を描画できるので物をイメージしやすくなった
- 曲線を直接扱えるようになって、自由な形が作れるようになった。
などです。 最近の3Dモデラーなども目的は同じではありますが、数値から離れて直感的に物を扱えるようになっています。
自由度を広げるという方向にはまた別のアプローチとして、例えば二次関数や表されるグラフのように数式で表される線や、特定のアルゴリズムによって定義される点や線の集まりで図を作るという方向性に行ったものもあります。
パラメータを含んだ式を使って図面を表すことで、複雑な形でも簡潔に表すことができる可能性があったり、また、そのパラメータを変更するだけで、大きさや比率の違うものが簡単に作れたりするわけです。
ようするに、部品があって、それに対する操作があって、列挙したり、繰り返しや条件分岐などで制御したりなどして、目的のものを作っていくわけです。 そして、変数が使えることによって、各属性をパラメータにする(パラメタライズ)ことができるので、カスタマイズが楽にできるということになります。
SCADの言語というか表現方法は、ちょっと独特で、そこそこ長いプログラミング経験がある僕としても始めて見る感じの書き方で、かといって使いやすかったり、読みやすかったりするわけでもなさそうです。
そんなわけで、しばらく前に目にしてはいたものの、手は出していませんでした。
最近、久し振りに図面を引くことになり、フリーのCADの状況を調べていたときに再発見しました。 記述方法そのものも以前のより進化しているようですが、なんと、ClojureでDSLを作った人がいるようなのです。
ということで、ちょっと調べてみることにしました。
http://adereth.github.io/blog/2014/04/09/3d-printing-with-clojure/
筆者がこんなこと書いてます。うん、そのとおりですね。
そして、そんな場合にこそDSLを作ることに意義があるのでしょう。
奇妙な関数の書式
関数名の後のカッコ内のパラメータに付いている記述やブロックの書式
ソースコード上に変数の経路を複数作ることができ、また、変数の値の変更が予期せず変更以前の場所にも波及したりする。
うんうん。 よさそうですよ。
scad-cljを使ってとりあえず何か作ってみましょう。
https://github.com/farrellm/scad-clj
なんともシンプルですね。docディレクトリがあって、中に「intro.md」なるファイルがあるので期待して空けてみると。
ともあれ、leiningenでプロジェクトを作成してscad-cljを関連づけます。
:dependencies の ベクターに [scad-clj "0.5.2"] を追加して、lein deps を実施します。
関連パッケージを含めていくつかのパッケージがローカルに転送され、準備OKです。
さて、どこかにあるはずのサンプルを探します。ネットを探しまわるのもありですが、まずは、ソースからです。
testディレクトリがあるのでまずはそこ。テストが書いてあれば、それぞれの関数がどのような入力に対してどのような出力をするのかよくわかるはずです。
が、これも空でした。残念。
となればソースを見るしかなさそうです。
geometry.clj には、 line と lines という関数があります。その通り、線を引く関数のようです。
text.clj には、文字列を生成する text-partsという関数が定義されています。
model.clj には、$f や $fa など、scadで特殊な意味のある変数や、import や use などの指示子、あとは、square や sphere などの基本的な2Dと3Dのパーツが定義されています。
そして、scad.cljには、write-expr というメソッドが定義されていて、たぶん、これが、レンダラーですね。
と、ここまで見てきても、全くイメージが掴めません。
まあ、結局最初のサイトですね。scad-clj を知るきっかけになったサイト
とりあえず、書いてあることをやってみましょう。
立方体(cube)と球(sphere)と円柱(cylinder)を合成(union)したものがprimitiveとしてできあがるはずなんですが、これ、どうしたらいいんでしょう?
write-scad という関数でこのprimitiveを出力できる形にできるようなので、REPLを起動して実行してみます。 ファイル名はとりあえず、 test01.scad とでもしておきます。 できたファイルをscadで開いてみます。
表示されましたねー。
さらにこのscad、開いているファイルが変更されると自動的に読み込むようになっているので、primitiveを変えて関数を呼ぶだけで、scadの中の図形が自動で変更されます。
ということで、scadの画面を開きながら、REPLでいろいろ試行錯誤しながらあれこれ形を作ることができるということのようです。
なかなか面白そうですよ。
こんな風に、Clojureの制御構文も使うことができます。
ということで、これでちょっと変った物をと思ったのですが、面白そうなものを思いつかず、時間も無くなってしまったので、将来の自分への宿題ということで・・・
READ MORE
CAD
Computer Aided Design ということは、コンピューターを使ってデザインをするためのツールですが、基本的には「製図」をするためのツールです。学生時代に製図をしたことが無いとなんのことかわからないかもしれませんが、機械や建造物などの設計図を書くことを製図といいます。もともと紙とペン・定規・コンパスなどの道具で点や線を書くので、手書きのころは立体物でも2次元の図面だけ作っていました。僕も実は機械工学科だったので、「図学」とか言ってちゃんとした製図の方法を習ったりしたものです。
コンピュータを使うようになると、自由度が広がってこれまでできなかったようなことができるようになりました。
- 3DCGで立体を描画できるので物をイメージしやすくなった
- 曲線を直接扱えるようになって、自由な形が作れるようになった。
などです。 最近の3Dモデラーなども目的は同じではありますが、数値から離れて直感的に物を扱えるようになっています。
自由度を広げるという方向にはまた別のアプローチとして、例えば二次関数や表されるグラフのように数式で表される線や、特定のアルゴリズムによって定義される点や線の集まりで図を作るという方向性に行ったものもあります。
パラメータを含んだ式を使って図面を表すことで、複雑な形でも簡潔に表すことができる可能性があったり、また、そのパラメータを変更するだけで、大きさや比率の違うものが簡単に作れたりするわけです。
OpenSCAD
OpenSCADは、ものの形状を式で表しやすい形状の集まりとして扱うことに特化したCADの一つです。ようするに、部品があって、それに対する操作があって、列挙したり、繰り返しや条件分岐などで制御したりなどして、目的のものを作っていくわけです。 そして、変数が使えることによって、各属性をパラメータにする(パラメタライズ)ことができるので、カスタマイズが楽にできるということになります。
ClojureでSCAD
LispでCADといえばAutoCADですね。使ったこと無いのですが、製図の図面に現れるオブジェクトとそれに対する操作を簡潔に表現する方法として、Lispが優れているということの証なのだろうと思ってるのですが、SCADの記述は残念ながらLispではありません。SCADの言語というか表現方法は、ちょっと独特で、そこそこ長いプログラミング経験がある僕としても始めて見る感じの書き方で、かといって使いやすかったり、読みやすかったりするわけでもなさそうです。
そんなわけで、しばらく前に目にしてはいたものの、手は出していませんでした。
最近、久し振りに図面を引くことになり、フリーのCADの状況を調べていたときに再発見しました。 記述方法そのものも以前のより進化しているようですが、なんと、ClojureでDSLを作った人がいるようなのです。
ということで、ちょっと調べてみることにしました。
scad-clj
scad-cljに出会ったのがこのサイトです。http://adereth.github.io/blog/2014/04/09/3d-printing-with-clojure/
筆者がこんなこと書いてます。うん、そのとおりですね。
そして、そんな場合にこそDSLを作ることに意義があるのでしょう。
- Strange function application syntax (parameters in parens after the function name with an expression or block following the closing paren)
奇妙な関数の書式
関数名の後のカッコ内のパラメータに付いている記述やブロックの書式
- Unclear variable binding rules (multiple passes are made over the code and the results of changing a variable may affect things earlier in the code unexpectedly)不明確な変数の束縛ルール
ソースコード上に変数の経路を複数作ることができ、また、変数の値の変更が予期せず変更以前の場所にも波及したりする。
- No package/namespace managementネームスペースが無い
- Multiple looping constructs that depend on what you are going to do with the results, not on how you want to loopいくつかあるループ構文は、どのようにループさせたいかではなく、結果をどのように使うかによって選ばなくてはならない
うんうん。 よさそうですよ。
scad-cljを使ってとりあえず何か作ってみましょう。
scadのセットアップ
本家のGithubはここです。https://github.com/farrellm/scad-clj
なんともシンプルですね。docディレクトリがあって、中に「intro.md」なるファイルがあるので期待して空けてみると。
TODO: write great documentationうーん残念。ドキュメントが無いようですから、使うには自力でソースなどを見てみるしかなさそうです。
ともあれ、leiningenでプロジェクトを作成してscad-cljを関連づけます。
:dependencies の ベクターに [scad-clj "0.5.2"] を追加して、lein deps を実施します。
関連パッケージを含めていくつかのパッケージがローカルに転送され、準備OKです。
さて、どこかにあるはずのサンプルを探します。ネットを探しまわるのもありですが、まずは、ソースからです。
testディレクトリがあるのでまずはそこ。テストが書いてあれば、それぞれの関数がどのような入力に対してどのような出力をするのかよくわかるはずです。
が、これも空でした。残念。
となればソースを見るしかなさそうです。
geometry.clj には、 line と lines という関数があります。その通り、線を引く関数のようです。
text.clj には、文字列を生成する text-partsという関数が定義されています。
model.clj には、$f や $fa など、scadで特殊な意味のある変数や、import や use などの指示子、あとは、square や sphere などの基本的な2Dと3Dのパーツが定義されています。
そして、scad.cljには、write-expr というメソッドが定義されていて、たぶん、これが、レンダラーですね。
と、ここまで見てきても、全くイメージが掴めません。
まあ、結局最初のサイトですね。scad-clj を知るきっかけになったサイト
やってみよう
とりあえず、書いてあることをやってみましょう。
立方体(cube)と球(sphere)と円柱(cylinder)を合成(union)したものがprimitiveとしてできあがるはずなんですが、これ、どうしたらいいんでしょう?
write-scad という関数でこのprimitiveを出力できる形にできるようなので、REPLを起動して実行してみます。 ファイル名はとりあえず、 test01.scad とでもしておきます。 できたファイルをscadで開いてみます。
表示されましたねー。
さらにこのscad、開いているファイルが変更されると自動的に読み込むようになっているので、primitiveを変えて関数を呼ぶだけで、scadの中の図形が自動で変更されます。
ということで、scadの画面を開きながら、REPLでいろいろ試行錯誤しながらあれこれ形を作ることができるということのようです。
なかなか面白そうですよ。
こんな風に、Clojureの制御構文も使うことができます。
ということで、これでちょっと変った物をと思ったのですが、面白そうなものを思いつかず、時間も無くなってしまったので、将来の自分への宿題ということで・・・
久し振りにProject Eulerを解きました。
(※ なんと4年前に書いた下書きがそのままになっていた)
数列がはじめからN個与えられたときに得られる母関数では、N+1まで行くと間違った値(BOP)が出ます。 与える数列を増やしていったときに得られるすべてのBOPの和を求める問題です。
そういえば、こういうのって、補間法かなんか使えば出るんじゃなかったっけ…と思って解いたら解けました。
ウィキペディアで調べたら、ラグランジェ補間法ってやつだったので、まあ、そのまま、式にした感じです。
コメントにも書きましたけど、もうちょっとclojureらしく書いたほうがよかったのかもしれないんですが、そうすると、たぶん、元の式の形がなくなってしまいそう。
READ MORE
(※ なんと4年前に書いた下書きがそのままになっていた)
数列がはじめからN個与えられたときに得られる母関数では、N+1まで行くと間違った値(BOP)が出ます。 与える数列を増やしていったときに得られるすべてのBOPの和を求める問題です。
そういえば、こういうのって、補間法かなんか使えば出るんじゃなかったっけ…と思って解いたら解けました。
ウィキペディアで調べたら、ラグランジェ補間法ってやつだったので、まあ、そのまま、式にした感じです。
コメントにも書きましたけど、もうちょっとclojureらしく書いたほうがよかったのかもしれないんですが、そうすると、たぶん、元の式の形がなくなってしまいそう。
twitterでciderの 0.9.0 が出たという情報が流れてきました。
->> もう、 0.9.1 になってます。 (6/27 追記)
マイナーバージョンが1上ったということで、いくつか新しい機能が追加されています。
メンテナのBastovさんがブログで、いくつかの重要な変更について書いています。
READ MORE
->> もう、 0.9.1 になってます。 (6/27 追記)
マイナーバージョンが1上ったということで、いくつか新しい機能が追加されています。
メンテナのBastovさんがブログで、いくつかの重要な変更について書いています。
アップデート
ciderを入れ替えるお決まりの作業は以下の2つ。
- emacs lisp のパッケージをアップデートする。
僕は、melpa_stableのを入れてます。 - $HOME/.lein/profiles.clj の cider/cider-nrepl のバージョンを変更する。
WARNING: CIDER requires nREPL 0.2.7 (or newer) to work properlyと怒られてしまいます。 これは、 leiningen 2.5.0 (2.5.1でも)の依存している、cider-nrepl が 0.2.6だからのようです。
- $HOME/.lein/profiles.clj の :dependencies の tools.nrepl のバージョンを0.2.7以上にしてやる必要がある。
{:user
{:java-cmd "D:\\Java\\jdk1.7.0_79\\bin\\java.exe"
:dependencies [[org.clojure/tools.nrepl "0.2.10"]]
:plugins [[lein-localrepo "0.5.3"]
[cider/cider-nrepl "0.9.0"]]
:jvm-opts ["-Dline.separator=\"\n\""]}}
デバッガ
デバッガは最も要望の多い機能だったそうです。作者のMarabarbaさんのブログに簡単な説明があったのでちょっと使ってみた。 emacsのelispデバッガのedebugに触発されて作ったとのことですが、初版なので、ステップ実行と、値の注入(injection)ができるだけのようです。
動作については、Marabarbaさんのブログのgifアニメを見て、自分でやってみるのがいいでしょう。
僕も、使ってみるのに何か書こうと思って、久し振りにProject Eulerを解いてみた。
途中で、2,3回使ってみたけれど、なかなかよい。
動作については、Marabarbaさんのブログのgifアニメを見て、自分でやってみるのがいいでしょう。
僕も、使ってみるのに何か書こうと思って、久し振りにProject Eulerを解いてみた。
途中で、2,3回使ってみたけれど、なかなかよい。
依存の独立
ciderが依存しているライブラリが、プロジェクトから切り離されたとのこと。
これは僕にはよくわからなかった。なんのことでしょう?
コード補間の表示がリッチに
company-modeでのコード補間に、アノテーションが付きました。
たしかに付いてるんですが、windowsであるためか、全部左に寄ってしまって、ちと見にくい。
ほかにもまだまだ機能が追加されているようですが、いずれそのうち。
nrepl.el
以前、clojureのnREPLのemacsクライアントの名前が nrepl.el なのが紛らわしいということになって、新しい名前を考えているっていうツイートを見て、ciderになったよってところまで知ってはいたのですが、しばらく様子を見てからにしようと思って忘れてました。
作業環境ってのはある程度使えていると、なかなか更新しないものですよね。
ciderに移行した
ここのところ変則勤務だったりして空いた時間にふと思いだして、調べてみると、もう、完全に流れはciderになってましたので、メインの環境をciderに移行することにしました。
ciderって言葉自体は、リンゴの発泡酒やジュースのことを指すみたいですね。英語読みだとサイダーですけど、他の言語だと、シードルとも。 って、アサヒのシードルのネーミングってこれそのものですね。ロゴの右端は、マグに入ったサイダーを表わしてます。
パッケージ入れ替え
先ずはパッケージを入れ替えます。
削除するもの
- nrepl.el
- ritz
- cider
- cider-tracing
- ac-cider-compliment
関連するものはアップデートしておきます。
- ac-nrepl
- paredit
- auto-complete
設定変更
ciderのサイトとか、他の方の記事とかを参考にしながら、init.elを編集します。
まだ全部は設定しきれていないけど、さらっと使ってみたところこれまで通りの感じになってます。
感想
nreplとの接続も問題なく、キーバインディングなどもこれまで通りで違和感なしです。
こころ無しか、動作が軽快になった気がします。
LightTableがかなりいい感じになってきたので、そちらに注目が集ってるし、すでにemacs使いでないのであれば、とっつきやすいのはたしかでしょうけれど、やっぱり僕はemacsの方が好きかなぁ。
最近、Clojureのとっかかりの部分についての説明が書かれたものをWeb上でよく見かけるようになりましたが、Lispを語る上で欠かせない「評価」という事柄についての記述が無いものがほとんどのようです。
Lispの力の源はevalであって、evalとは「評価」そのものであるので、Lispを知る(=使う)には、「評価」を理解することは必須だと思うのです。
あまりえらそうな事を言えるほどのスキルがあるわけではありませんが、ちまちま書いていたものが形になったので、公開します。
READ MORE
Lispの力の源はevalであって、evalとは「評価」そのものであるので、Lispを知る(=使う)には、「評価」を理解することは必須だと思うのです。
あまりえらそうな事を言えるほどのスキルがあるわけではありませんが、ちまちま書いていたものが形になったので、公開します。
clojure contrib library advent calender に記事を投稿しました。
numeric-tower と memoize です。
numeric-tower は、PEをやっているときに、何度か使っていたのだけれど、中身を見ていなかったので、今回題材にして中身を見てみた。 記事では中身のことは話題にしませんでしたけど、やっぱり参考になりますね。 普段、面倒くさがりなので、あまり他人のコードを読むことは無いのですが、いけないなーと思います。
もう一つはmemoizeです。
こちらは、このブログでも何回か取りあげた、clojureのコアに入っているmemoizeの強化版です。 作者は Joy of Clojureの著者のFogusさんです。 コアのmemoizeに苦戦しているころ、メーリングリストに新しいmemoizeの話題が出ていて作られたものです。
こっちのソースも今回初めて見てみたのですが、僕の理解の範囲を超えていて、まいったなーっていう感じです。
今回の担当分はこれで終りです。なんとか間に合いました。
READ MORE
numeric-tower と memoize です。
numeric-tower は、PEをやっているときに、何度か使っていたのだけれど、中身を見ていなかったので、今回題材にして中身を見てみた。 記事では中身のことは話題にしませんでしたけど、やっぱり参考になりますね。 普段、面倒くさがりなので、あまり他人のコードを読むことは無いのですが、いけないなーと思います。
もう一つはmemoizeです。
こちらは、このブログでも何回か取りあげた、clojureのコアに入っているmemoizeの強化版です。 作者は Joy of Clojureの著者のFogusさんです。 コアのmemoizeに苦戦しているころ、メーリングリストに新しいmemoizeの話題が出ていて作られたものです。
こっちのソースも今回初めて見てみたのですが、僕の理解の範囲を超えていて、まいったなーっていう感じです。
今回の担当分はこれで終りです。なんとか間に合いました。
最近、あまり趣味プログラミンングをしていなくて、めっきり投稿していなかったわけですが、年末になったので、Advent Calenderイベントに参加してみています。
READ MORE
今年、参加しているのは、2つ。
clojure contribライブラリを説明しまくってやろうというものです。athosさん主宰です。
もうひとつはclojure一般ものです。 って、あれ? こっちも担当今日じゃん!
やばいやばい。 書いてあったからいいようなものの、冷や汗ものだった。
こちらは、以前から作ろうと思っていた、zlogデータ操作ツール関連ですが、マクロの話題を取り上げました。
100個解くのを目標にしていたので、ひとまず目標は達成です。
これにあまり時間を取るのもなんなので、Project Eulerはしばらくお休みにします。
もうちょっと実用的ななにかをしないとということで、作りかけていたツールでも作ろうかと思っております。Herokuでwebアプリです。
あとは、core.logicもちょっとやってみたいと思っとります。
READ MORE
これにあまり時間を取るのもなんなので、Project Eulerはしばらくお休みにします。
もうちょっと実用的ななにかをしないとということで、作りかけていたツールでも作ろうかと思っております。Herokuでwebアプリです。
あとは、core.logicもちょっとやってみたいと思っとります。
100番です。
袋から連続で2個のボールを取り出したときに、同じ色のボールが出る確率をちょうど2分の1にするには、何個のポールを入れたらいいでしょうか。という問題です。
初めに思いついた方法は時間がかかりすぎてだめでした。
式を立てていろいろいじっていたら解けました。
READ MORE
袋から連続で2個のボールを取り出したときに、同じ色のボールが出る確率をちょうど2分の1にするには、何個のポールを入れたらいいでしょうか。という問題です。
初めに思いついた方法は時間がかかりすぎてだめでした。
式を立てていろいろいじっていたら解けました。
99番目の問題です。
ここに来て、問題ごとの難易度の差が激しいですね。
この問題はとても簡単。
思いつきでだーーっと書いたコードなので、あまりきれいではないのですが、直すまでも無いので、このままにしときます。
今回も内容についてのコメントは無し。
READ MORE
ここに来て、問題ごとの難易度の差が激しいですね。
この問題はとても簡単。
思いつきでだーーっと書いたコードなので、あまりきれいではないのですが、直すまでも無いので、このままにしときます。
今回も内容についてのコメントは無し。
99番です。
アナグラムにあてはまる平方数についての問題です。
回答者数を見ると難しそうな問題だったのと、数独を解いた余波と、100達成に向けた勢いで、解説付きにチャレンジしました。
ほぼ、解いた手筋をなぞってます。
gistにソースつきで載せました。
解法としては、10分もかかってしまったので今一つですが、難しい問題ということで、よしとしときます。
READ MORE
アナグラムにあてはまる平方数についての問題です。
回答者数を見ると難しそうな問題だったのと、数独を解いた余波と、100達成に向けた勢いで、解説付きにチャレンジしました。
ほぼ、解いた手筋をなぞってます。
gistにソースつきで載せました。
解法としては、10分もかかってしまったので今一つですが、難しい問題ということで、よしとしときます。
数独を解く問題です。
95を2月に解いて、それから取り組んでいたのですが、昼休みとか暇なときにしかやってないとは言え、なかなかタフで時間がかかりました。
結果的には、ネットからのデータの取得も含めて3.4秒ほどで解けたので上々でしょう。
READ MORE
95を2月に解いて、それから取り組んでいたのですが、昼休みとか暇なときにしかやってないとは言え、なかなかタフで時間がかかりました。
結果的には、ネットからのデータの取得も含めて3.4秒ほどで解けたので上々でしょう。