2014年9月27日開催
プログラミング言語「Julia」の集いです。まだまだ利用者の少ないJuliaについて、様々な知見を共有することを目的としています。
JuliaTokyo #2 では、参加者の方々へ利用言語についてのアンケートを行いました。以下が結果です;
総回答者数 81名 (複数回答可)
50 Python
36 R
25 Java
20 Ruby
20 C++
19 その他
18 Excel
15 C
14 Julia
6 Visual Basic
6 Perl
6 Matlab / Octave
5 Scala
2 Fortran
2 Clojure
1 F#
この導入セッションでは、IJuliaのnotebookを使って説明を行います。IJuliaは、iPythonをJuliaで利用するためのパッケージです。
IJulia(iPython)の他にも
といった環境で利用できます。
Vim、Emacs、Sublime Text、Textmate、Notepad++、Kateといったエディタには、Juliaの編集モードが用意されています。
公式サイトで、安定版および開発版(Nightly builds)のバイナリが、Windows、Mac OS X、Ubuntu向けに用意されています。
Max OS XのhomebrewやDebianのaptといったパッケージ管理システムに登録されている場合もありますが、バージョンが最新安定版より古い可能性もあるので注意が必要です。
このチュートリアル実施時の最新安定版は、2014年8月に公開された v0.3 です。以前のバージョンと一部互換性のない部分もありますので、ご注意ください。
バイナリを実行すると、標準REPLが起動します。
$ julia # Juliaを起動
_
_ _ _(_)_ | A fresh approach to technical computing
(_) | (_) (_) | Documentation: http://docs.julialang.org
_ _ _| |_ __ _ | Type "help()" for help.
| | | | | | |/ _` | |
| | |_| | | | (_| | | Version 0.3.0 (2014-08-20 20:43 UTC)
_/ |\__'_|_|_|\__'_| | Official http://julialang.org/ release
|__/ | x86_64-apple-darwin13.3.0
julia>
まず、iPythonをインストールする必要があります。色々なPythonのライブラリをまとめてインストールしてくれるAnacondaを使うと便利です。
次に、JuliaのREPLから
Pkg.add("IJulia")
とすると、IJuliaをインストールできます。
エラーの場合は
Pkg.update("IJulia")
や
Pkg.build("IJulia")
を試してみてください。
IJuliaがインストールされると、シェルから
$ ipython notebook --profile julia
と実行するか、JuliaのREPLから
julia> using IJulia
julia> notebook()
とすることでIJulia notebookを起動できます。
ちなみにこれからは、iPythonからPython部分を除いたものがJupyterというプロジェクトになるので、Juliaもこちらを使うことになります。
1 + 1
2
+(1, 1)
2
methods(+)
1 + 2 * 3
7
typeof(1) # 型を調べる
Int64
typeof(1.0)
Float64
1 / 3 # 除算の結果は必ず浮動小数点数
0.3333333333333333
3 \ 1 # 右辺を左辺が割る除算
0.3333333333333333
1 // 3 # 有理数
1//3
typeof(1 // 3)
Rational{Int64} (constructor with 1 method)
names(1 // 3) # 型の構造を調べる
2-element Array{Symbol,1}: :num :den
(1 + 2im) * (2 - 3im) # 複素数
8 + 1im
typeof(1 + 2im)
Complex{Int64} (constructor with 1 method)
names(1 + 2im)
2-element Array{Symbol,1}: :re :im
sqrt(-1 + 0im)
0.0 + 1.0im
2 ^ 8 # べき乗
256
0.314e1 # 科学技術表記
3.14
1_000_000 # アンダースコアによる数値の区切りが可能
1000000
e # あらかじめ定義されている数値
e = 2.7182818284590...
π
π = 3.1415926535897...
golden
φ = 1.6180339887498...
typeof(golden)
MathConst{:φ} (constructor with 1 method)
pi
π = 3.1415926535897...
ちなみにタブキーで補完が行えるが、これはLaTex記法の変換にも使える。
> \pi TAB
\pi
x = 10
10
あ = 10
10
pi = 3
3
Warning: imported binding for pi overwritten in module Main
pi
3
2pi # *を省略できる
6
2x^2 + 4x + 1 # シンプルに多項式を記述できる
241
スタイル規則
c.f.
str1 = "This is a string."
"This is a string."
typeof(str1)
ASCIIString (constructor with 2 methods)
str2 = "これは文字列です。"
"これは文字列です。"
str2[1]
'こ'
typeof(str2)
UTF8String (constructor with 2 methods)
str3 = "\u2200 x \u2203 y s.t. f(y) > x"
"∀ x ∃ y s.t. f(y) > x"
str4 = "1 + 1 = $(1 + 1)" # インターポレーション
"1 + 1 = 2"
print("Hello World!")
Hello World!
println("Hello Julia!")
Hello Julia!
dict = ["one"=> 1, "two"=> 2, "three"=> 3]
Dict{ASCIIString,Int64} with 3 entries: "two" => 2 "one" => 1 "three" => 3
dict = ["one"=> 1, "two"=> 2, "three"=> 3.0]
Dict{ASCIIString,Any} with 3 entries: "two" => 2 "one" => 1 "three" => 3.0
dict["one"]
1
x = [1, 2, 3] # Int64
3-element Array{Int64,1}: 1 2 3
x[1] # Indexは1から始まる
1
x[0]
BoundsError() while loading In[45], in expression starting on line 1 in getindex at /opt/homebrew-cask/Caskroom/julia/0.3.0/Julia-0.3.0.app/Contents/Resources/julia/lib/julia/sys.dylib (repeats 2 times)
x[2:3]
2-element Array{Int64,1}: 2 3
x[end]
3
[1, 2, "Hello"] # Any
3-element Array{Any,1}: 1 2 "Hello"
[1 2 3] # 1x3
1x3 Array{Int64,2}: 1 2 3
matrix = [1 4 7; 2 5 8; 3 6 9]
3x3 Array{Int64,2}: 1 4 7 2 5 8 3 6 9
matrix[1,3]
7
[1 2 3] * [1,2,3]
1-element Array{Int64,1}: 14
# if /else
x = 1
if x == 1
println("One!")
elseif x == 2
println("Two!")
else
println("Not One or Two!")
end
One!
# for
for i = 1:5
println(i)
end
1 2 3 4 5
for str in ["foo","bar","baz"]
println(str)
end
foo bar baz
for i = 1:2, j = 3:4
println((i, j))
end
(1,3) (1,4) (2,3) (2,4)
square(x) = x * x
square (generic function with 1 method)
square(3)
9
f = (x) -> 2x^2 + 4x + 1
(anonymous function)
f(2)
17
# FizzBuzz
function fizzbuzz(x::Int64) # 引数の型を指定している
println("This is Int64 fizzbuzz")
for i = 1:x
if (i % 3 == 0) && (i % 5 == 0)
println("FizzBuzz")
elseif i % 3 == 0
println("Fizz")
elseif i % 5 == 0
println("Buzz")
else
println(i)
end
end
end
fizzbuzz (generic function with 1 method)
# 同じ名前で違う引数型の関数
function fizzbuzz(x::Float64)
println("This is Float64 fizzbuzz")
for i = 1:x
if (i % 3 == 0) && (i % 5 == 0)
println("FizzBuzz")
elseif i % 3 == 0
println("Fizz")
elseif i % 5 == 0
println("Buzz")
else
println(i)
end
end
end
fizzbuzz (generic function with 2 methods)
function fizzbuzz(x)
println("$(x) is neither Int or Float.")
end
fizzbuzz (generic function with 3 methods)
fizzbuzz(10)
This is Int64 fizzbuzz 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz
fizzbuzz(10.0)
This is Float64 fizzbuzz 1.0 2.0 Fizz 4.0 Buzz Fizz 7.0 8.0 Fizz Buzz
fizzbuzz(10 + 10im)
10 + 10im is neither Int or Float.
fizzbuzz("String")
String is neither Int or Float.