プログラミング言語Juliaをインストールしてサンプル作成
歩いていたらJuliaという言語を見つけました。
調べてみるとこの言語、Pythonよりも圧倒的にの速いらしいです。
データサイエンスをJuliaでやろうという参考書をちらほら見かけます。
インストール
早速インストールします。
Juliaのホームページからzipファイルをダウンロードしてきます。
それを解凍してパスを追加します。
1 2 3 4 5 6 7 |
wget https://julialang-s3.julialang.org/bin/linux/x64/1.1/julia-1.1.1-linux-x86_64.tar.gz tar -zxf julia-1.1.1-linux-x86_64.tar.gz cp -r julia-1.1.1 /usr/local/julia/bin export PATH="$PATH:/usr/local/julia/bin" |
そしてjuliaと入力して実行するとREPLが起動します。
だいたいこんな感じです。
1 2 3 4 5 6 7 8 9 10 11 |
$ julia _ _ _ _(_)_ | Documentation: https://docs.julialang.org (_) | (_) (_) | _ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help. | | | | | | |/ _` | | | | |_| | | | (_| | | Version 1.1.1 (2019-05-16) _/ |\__'_|_|_|\__'_| | Official https://julialang.org/ release |__/ | |
構文
Juliaの構文を簡単にまとめたいと思います。
変数、関数の定義と条件分岐と繰り返しあたりがわかればいいかなと思います。
変数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
x = 10 y = 10 z = x + y println(z) # 20 x = 0.5 y = 0.5 z = x+y println(z) #配列 array = [1,2,3,4,5] push!(arr,5) #配列への追加 println(array[1]) # 1 添字の始まりは0ではなく1のようだ #タプル t = (1,2,3,4,5) t[1] = 100 #タプルなので変更できない #ディクショナリ d = Dict("one" => 1, "two" => 2, "three" => 3) println(d["one"]) # 1 d["four"] = 4 for k in keys(d) #キーだけを取得する println(k) end for v in values(d) #値を取得する println(v) end for (k,v) in d #キーと値を取得する println("$k => $v") end |
Juliaでは文字型と文字列型が区別されるようです。
シングルクォートで囲めば文字型で、
ダブルクォートで囲めば文字列型になります。
1 2 3 |
char = 'c' code = Int(char) # 99 string = "s" |
関数
特に変わったところはないですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
function func2(arg) if typeof(arg) == Int #typeofで型を調べられる return arg * 10 end 1 end println(func(30)) println(func("30")) function func2(arg1,arg2,arg3...) #...でタプルで受け取るようだ println(arg1) println(arg2) println(arg3) end func1("arg1","arg2",1,2,3,4,5,6,7,8) #1~8がタプルとなって渡される |
条件分岐や繰り返し
割と普通の書き方だと思います
1 2 3 4 5 6 7 8 9 10 11 |
x = 10 if x > 5 println("> 5") elseif x > 10 println("> 10") else println("else") end res = if x > 5 "> 5" else "else" end println(res) # > 5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
arr = [1,2,3,4,5] for a in arr println(a) end arr = [5,4,3,2,1] for (i, a) in enumerate(arr) println("$i => $a") end for num = 1:10 println(num*2) end cnt = 10 while cnt > 0 println(cnt) global cnt -= 1 end |
try catch
try~catch文も他の言語と特に変わったところはないかと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
function func(arr) if length(arr) == 0 || typeof(arr) != Array{Int64,1} throw("arg is invalid") end push!(arr,10) return arr end arr = [] try res = func(arr) catch e println("Exception $e") end arr = 1 try res = func(arr) catch e println("Exception $e") end arr = [1,2,3] try res = func(arr) println(res) catch e println("Exception $e") end |
標準入出力
1 2 |
res = readline(stdin) println(res) |
簡単なサンプル
Socketをつかってサンプルを作りたいと思います。
まずはサーバープログラムです。
ソケット作ってループの中でコネクションを待ち続けます。
@async beginでコネクション成立後は別スレッドで送受信処理を開始します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using Sockets soc = Sockets.listen(9999) println("waiting for connect") while true acc = accept(soc) println("connect from client") @async begin try while true data = readline(acc) println("$data from client") write(acc, "Server reply : $data\n") end catch e println("$e") end end end |
次はクライアントです。
普通にアドレスとポートを指定して普通にループの中で送受信を繰り返します。
特別なことはしてませんね。
1 2 3 4 5 6 7 8 9 10 11 |
using Sockets soc = Sockets.connect("127.0.0.1",9999) println("connect to server") while true data = readline(stdin) write(soc,"$data\n") res = readline(soc) println(res) end |