MathJaxテスト

翼の周りの気流によって生成される揚力(軌道に対して垂直)を $L$ ,軌道に水平な抗力を $D$ とする. それぞれの力は揚力係数 $C_L$ と抗力係数 $C_D$ によって表現され,どちらの係数も翼の設計と迎角に依存している.

揚力と抗力は機体の表面積 $S$ と,動圧 $1/2 \rho v^{2}$ に比例する.ここで $\rho$ は空気の密度,そして $v$ は飛行機の前進速度である.揚力と抗力の方程式は以下のようになる:

$$ \begin{eqnarray} L &=& C_L S \times \frac{1}{2} \rho v^{2} \\ D &=& C_D S \times \frac{1}{2} \rho v^{2} \end{eqnarray} $$

グライダーが平衡状態にあるとき,それぞれの力も釣り合っている.以下のように,軌道の垂線方向および軌道と平行に力を等しいとすることができる: $$ \begin{eqnarray} L = W \cos \theta \\ D = W \sin \theta \end{eqnarray} $$

ここで $W$ はグライダーの重さである.

角度 $\theta$ は滑空角と呼ばれ,運動方向と水平線のなす角である.

Content under Creative Commons Attribution license CC-BY 4.0, code under MIT license (c)2014 L.A. Barba, C. Cooper, G.F. Forsyth, A. Krishnan.

記号のみを使った Julia プログラミングをしたかった

punctuations のみを使ってプログラミングすることを記号プログラミングと呼ぶ人がいるらしいです。*1

記号プログラミング Advent Calendar がアツい! - 葉っぱ日記

これを真似て Julia で記号のみのプログラミングをやってみようと思いました。上のリンク先の内容(特にPerlの記事)をなぞっただけなので新規性はないです。

記号のみでプログラミングをするための方策は次の2ステップに分解できます。

  1. 任意のAscii文字列を記号のみで表現する
  2. 作った文字列を eval する

この記事では 1. についてはやりましたが 2. は妥協しました。eval を記号で済ます方法は Julia にはないように思われたからです。

さて、まずは 1.を実現するために、任意の文字 [a-zA-Z] が2つの文字記号の論理演算から作れるということを利用します。

julia> bin('`')
"1100000"

julia> bin('!')
"100001"

julia> bin('A')
"1000001"

julia> '`' $ '!'
'A'

この組み合わせは手作業で探してもいいですが、面倒なのでプログラムで全探索して辞書を作りました。

punctuations = "!\"#\$%&'()*+,-./:;<=>?@[\\]^_`{|}~"

println("{")
for i in ['A':'Z', 'a':'z']
  lists = (Char, Char)[]
  for p in punctuations
    x = i $ p
    if (p, x) in lists
      continue
    end
    if x in punctuations
      push!(lists, (x, p))
    end
  end
  println("  '$i' => $lists,")
end
println("}")

この辞書を元に好きな文字列を作ります。Julia では Char と String の扱いが異なり、+記号を使ってカジュアルに Char を結合したりすることはできません。なので文字列挿入記法を使います。

julia> "$('`'$'(')$('['$'>')$('@'$',')$('@'$',')$('@'$'/'),$('^'$')')$('@'$'/')$('^'$',')$('@'$',')$('_'$';')!"
Hello,world!

以上で任意の文字列を作ることに成功しましたが、ではこれを実行するにはどうしたらいいでしょう。Julia で文字列をプログラムとして評価するには parse してから eval する必要がありますが、これを記号だけで行う方法は見つけられませんでした。なので次のように単にアンダースコアで置き換えて妥協しました。これはひどい

_   = parse
__  = eval

こうすれば他の関数は記号のみで参照を得ることができます。例えば次のようにすれば記号のみで println を使えるようになります。

julia> "$('^'$'.')$('^'$',')$('@'$')')$('@'$'.')$('\\'$'(')$('@'$',')$('@'$'.')"
"println"
julia> ___ = __(_("$('^'$'.')$('^'$',')$('@'$')')$('@'$'.')$('\\'$'(')$('@'$',')$('@'$'.')"))
println (generic function with 2 methods)

これにより、(ほぼ)記号のみの Hello world プログラムを得ることができました。わーパチパチパチパチ!

_   = parse
__  = eval
___ = __(_("$('^'$'.')$('^'$',')$('@'$')')$('@'$'.')$('\\'$'(')$('@'$',')$('@'$'.')"))
___("$('`'$'(')$('@'$'%')$('@'$',')$('@'$',')$('@'$'/'), $('\\'$'+')$('@'$'/')$('^'$',')$('@'$',')$('^'$':')!")))
# => Hello, world!

やってみたかっただけなので妥協部分をどうにかしようというモチベーションはありません。

*1:記号プログラミングという言葉を記号のみを使うプログラミングという意味で使うことは少し憚られます。Symbolic programming と混同する恐れがあるからです。なのでタイトルは記号のみプログラミングとしました。

Daily Julia #12

Julia 0.3 の rc 版が公開

0.3-rc1 tagged - Google グループ

Release 0.3 Release Candidate 1 · JuliaLang/julia

Rust の開発者 Graydon Hoare が語る対話的な科学技術計算環境

Part1 で Python, Part2 で Julia について語っている。

graydon2 | technicalities: interactive scientific computing #1 of 2, pythonic parts

graydon2 | technicalities: interactive scientific computing #2 of 2, goldilocks languages

Daily Julia #11

Scipy 2014 meeting で Julia が紹介された

New Julia tutorial from SciPy now online - Google グループ

Introduction to Julia - Part 1 | SciPy 2014 | David Sanders - YouTube

dpsanders/scipy_2014_julia

Julia Graphics が発足した

JuliaGraphics group - Google グループ

まずは OpenGLSDL, Processing 等の Julia ライブラリの参加を見込んでいる?

Jupyter というプロジェクトが発足した

Julia に直接は関係ないが Jupyter という IPython の姉妹プロジェクトのようなものが始まった。これは IPython から Python に依存しない部分を切り分けるためのものらしい。Python に依存しない部分を以下のスライドから挙げておくと次のものである。

Project Jupyter // Speaker Deck

  • 対話的コンピューティングのためのネットワークプロトコル
  • クライアント
    • コンソール
    • Qt コンソール
    • Notebook
  • Notebook のフォーマットとツール (nbconvert)
  • Nbviewer

雑記

Daily Julia の更新が芳しくないですが体調不良のため今後も更新速度が上がりません。このしょっぱい企画名は微妙に検索よけを狙ってわざわざ考えたものだけど、Weeklyに切り替えたほうがいいかもしらん。

Daily Julia #10

世界で 2 番目の Julia Conference となる Julia Tokyo が開かれているようだ。

JuliaTokyo #1 - connpass

軽くまとめようと思ったが、日本語圏の話だし参加していない私があれこれ書くのも変であるのでやめた。そのうちどこかでまとめ記事が上がってくるんじゃないだろうか。

`sort` にジェネリックな比較関数を渡すと遅い

しかもメモリ割当が 2 倍に増える。

Sorting surprises - Google グループ

既知の問題である。名前解決がイテレーション毎に起こるから遅いらしい。メモリ使用量が 2 倍に増える理由について Karpinski は I'm not sure と応えており「えっ」となる。NumericExtensions.jl が既にこの手の問題に対して 回避策 を講じているが、こんなところで Functor が登場しているのか。もっとも、Functor を渡してもインライン化が働くのは単純な関数の場合に限られるため、本当に最適化しようと思ったら @inbound 使って境界チェック切ろうということらしい。

長期的には、何も考えなくても効率的に実行されるようになるのが好ましいと Karpinski は述べている。

それにしても @elapsed@allocated のようなマクロを挟むだけで実行速度やメモリ割当量を気軽に計測できるのは鬼のように便利だな…

Julia の文字列結合演算が積 (*) である理由(他言語との比較)

Why is string concatenation done with * not + - Google グループ

+ という記号は経験的に交換則が成り立つことを期待するものであるのに対して、文字列結合は交換則が成り立たたないからというのがその理由である。

"Hello, " * "World." != "World." * "Hello, "

ただしIssue #1771の議論を見れば分かるように、* を良い演算子と思っている人はあまりいないようだ。本質的に文字列結合演算は IO Buffer を介さない非効率的なものであって、パフォーマンスに敏感な場面では適さない(煎じ詰めると「これって要らない子なのでは?」)というのが論点のようだ。

以下文字列の性質に関して Issue #1771 を読みながらノート。

class Monoid a where
  zero :: a
  (+) :: a -> a -> a

instance Monoid [a] where
  zero = []
  (+) = (++)

これは分かりやすさの便宜上(この記事では半環を扱っているのでモノイド演算との差を際立たせている)こうしているのであって、なんでもかんでも + をオーバロードするのはやっぱおかしいと言われればその通りですが。

var to = 'Dart developer';
var msg = 'Hello $to!';
assert(msg == 'Hello Dart developer!')
  • 演算そのものを廃止するというのはなかなか過激な選択に思えるが、Dart はその理由を 3 つ挙げている
    • puzzler を生む原因となる
    • 文字列挿入のほうを推奨すべきなのに存在感が過大
    • 本質的に非効率 (O(n2))なコードを書いてしまう
  • Jeff Bezanson 「Lisper なら string(a, b, c, ...) が一番読みやすいかな!」