プログラミング言語Juliaをインストールしてサンプル作成
歩いていたらJuliaという言語を見つけました。
調べてみるとこの言語、Pythonよりも圧倒的にの速いらしいです。
データサイエンスをJuliaでやろうという参考書をちらほら見かけます。
インストール
早速インストールします。
Juliaのホームページからzipファイルをダウンロードしてきます。
それを解凍してパスを追加します。
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が起動します。
だいたいこんな感じです。
$ 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の構文を簡単にまとめたいと思います。
変数、関数の定義と条件分岐と繰り返しあたりがわかればいいかなと思います。
変数
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では文字型と文字列型が区別されるようです。
シングルクォートで囲めば文字型で、
ダブルクォートで囲めば文字列型になります。
char = 'c'
code = Int(char) # 99
string = "s"
関数
特に変わったところはないですね。
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がタプルとなって渡される
条件分岐や繰り返し
割と普通の書き方だと思います
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
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文も他の言語と特に変わったところはないかと思います。
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
標準入出力
res = readline(stdin)
println(res)
簡単なサンプル
Socketをつかってサンプルを作りたいと思います。
まずはサーバープログラムです。
ソケット作ってループの中でコネクションを待ち続けます。
@async beginでコネクション成立後は別スレッドで送受信処理を開始します。
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
次はクライアントです。
普通にアドレスとポートを指定して普通にループの中で送受信を繰り返します。
特別なことはしてませんね。
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