これで、SageMaker Studio Labの設定は完了です。次に、Juliaをインストールします。
AWS公式のJuliaインストールスクリプトにアクセスし、真ん中の「Open | Studio Lab」と書いていある紫色のボタンを押す。
すると、以下のようにこのスクリプトを「SageMaker Studio Lab上で実行していいですか?」と聞かれる画面になります。
ここで、「Copy to project」を押します。
すると、「Copy from GitHub?」と聞かれますので、「Copy Notebook Only」とします。そうすると、先程のスクリプトがSageMaker Studio Lab上にコピーされます。
そのうえで、%system curl -OL https://julialang-s3.julialang.org/bin/linux/x64/1.10/julia-1.10.2-linux-x86_64.tar.gz
などと書かれているブロック(セルと呼ばれます)をクリックし選択したうえで、上部 の「▶」ボタンを押します。これにより、このセルが実行され、Juliaがインストールされます。
次に、その直下のセルを選択し、同様に「▶」ボタンを押します。これは必要なものをインストールしていますが、今は気にしないでください。これにはちょっと時間がかかるかもしれません。
最後に、その下の2つのセルも同様に実行しておきます。これにてJuliaのインストールが完了です。一度ブラウザをリロードしてみください。
左上の「+」を押したときに、下記のようにJuliaが出てくれば成功です。うまく行かない場合、何度もリロードしてみてください。
今後は、ここの「Notebook」「default:Julia (4 threads) 1.10.2」を使い、新しくNotebookを作ってプログラミングを行います。
これにて設定完了です。今後SageMaker Studio Labを実行するにはランディングページをクリックしてください。このリンクはブックマークしておくといいです。
さて、それではこれからプログラミングを行う仕組みを解説します。普通、プログラミングとはmain.jl
のようなテキストファイル(メモ帳で作った単なる文字データ)を書き、それをコマンドで実行(julia main.jl
)することが基本です。しかし、今回皆さんには、最近流行している「Notebook」という仕組みを使ってもらいます。これは、上記の「ファイルを書く」「実行する」という二段階の処理を合体し、かつそれをブラウザ上で実行可能にすることで、プログラミング作業をよりインタラクティブに実行できるものです。皆さんは2年生や3年生になるとc言語やpython言語を習い通常のプログラミングを勉強することになります。ここでは、その前段階として、Notebookを使ったプログラミングを体験しましょう。
さて、あらためてSagaMaker Studio Labの画面に注目しましょう。ここで左上の「+」を押し、「Notebook」の「default:Julia (4 threads) 1.10.2」を押してみましょう。次のような画面になります。
ここで、左側はWindowsでいうエクスプローラー、マックでいうFinderのようなものです。たった今新しくNotebookを作ったので、左側にUntitled.ipynb
というファイルが見えます。Notebookの拡張子は.ipynb
です。出来たばかりのNotebookなのでUntitledという名前になっています。これは自由に変えられます。
このUntitled.ipynb
の中身が右側の表示されています。ここでは何も書いていないので、まっさらな状態です。
さて、それでは早速何かを書いてみましょう。右側に四角い領域があると思います。これが「セル」です。ためしにセルの中に
a = 3
と書いてみましょう。ここでは半角英数字を使ってください。このように記載された文章をコードと呼びます。コンピュータは、このようにして記載された文章を実行します。セルの中には自由にコードを書けます。そしてこのセルを実行してみましょう。先ほど上側の「▶」を押すということがありました。これがセルの実行という操作です。「▶」を押してもいいですし、Ctrl
キーを押しながらEnter
キーを押してもいいです。あるいは、Shift
キーを押しながらEnter
でも大丈夫です。すると次のようになります。
ここでは、セルの直後に、そのセルの実行結果が表示されます。これが、セルの実行です。ここでは、実行したセルの左側に青色で[1]
と書かれています。これは、最初に実行されたセルであるという意味の通し番号です。オレンジ色の[1]
となっているのは、青い[1]
のセルの実行結果という意味です。
さて、セルを追加してみましょう。右側の画面の上部にある「+」を押すと、セルが追加されます。今度はそこに
3 + 5
と書き、実行してみましょう。次のようになります。
無事足し算が実行できました。このように、セルは自由に追加できます。2度目に実行したので、セルの左側の通し番号は[2]
となっていることがわかります。
また、セルをクリックして選択した状態で、上部のハサミアイコンをクリックすると、セルを削除することができます。
セルの実行は、何度でも可能です。セルをクリックし、Ctrl
(またはShift
)+Enter
でいけます。左側の通し番号の[x]
がどんどん増えていきます。
また、Notebookはしばしば挙動がおかしくなったり、結果が出ずに固まったりします。その場合、上部の「■」を押して停止させたあと、その右側の 丸い矢印のボタンを押してください。するとNotebookが再起動され、再び実行することが可能になります。ここで、通し番号がリセットされて[1]
に戻ることがわかります。 通し番号が振られているうちは、変数などの状態が記憶されているのですが、リセットされるとそれらが消えます。
また、Notebookは実際はファイルなので、Ctrl+s
を押すことで保存が可能です。
以上をまとめますと、
セルを追加したり、セルの中身を編集したりする
好きなセルを実行する
結果もその場に表示される
というようにして、インタラクティブにプログラミング作業を進めるのが、Notebookです。
さて、それでは基本的な文法を勉強しましょう。来週のWeek4は少し多めにやりますが、その後は毎週少しずつJulia言語について勉強していきます。 今週はとても基本的なことを学びましょう。
先程、以下のような処理を実行しました。
a = 3
ここで、a
のようにアルファベットで書かれたものを変数と呼びます。これは、数学の変数に似ている概念です。しばしば「箱」に例えられます。この変数(箱)の中に、値を代入することが出来ます。 変数としてはacb
でもhoge
でもfuga123
でも、なんでも大丈夫です。123abc
のように数字から始まるものは許されません。 さて、ここで= 3
の部分を見てみましょう。Juliaを始め多くのプログラミング言語では、=
は「右辺の値を左辺に代入する」という意味になります。イメージとしては
という感じです。これは、数学の=
とは違う意味になります。数学の=
はお互いが常に等しいということですが、プログラミングの=
は右辺の値を左辺に入れているだけです。試しに、次のように書いてみましょう。
a = 3
a = 5
ちなみに、セルの内部では上記のように改行できます。このセルを実行すると、a
の中身が3
から5
に変わります。これは、最初にa
に3
を代入した後、a
に5
を代入したためです。このように、変数は値を上書きすることができます。
ちなみに、ここではNotebookが気を利かせて、セルを実行した際に最後の行を表示してくれるので、画面に「5」と表示されると思います。自分で明示的に表示することもできます。例えば以下のようにしてみましょう。
a = 3
b = 10
println(a)
ここで、println(a)
は、「a
の中身を表示しろ」という関数です。こうすると、「3」が表示されることがわかります。 上記のように、変数はいくつでも作ることができます。また、あるセルで作り、実行した変数は、他のセルからもアクセスできます。
さて、Juliaは言語レベルでベクトル・行列をサポートしています。例えば次のようにしてみましょう。
x = [1 2 3]
この結果は以下のようになります。
1×3 Matrix{Int64}:
1 2 3
すなわち、この書き方で1x3の横ベクトルを作ることができました。
同様に、以下のようにして縦ベクトルも作れます。
y = [4;
5;
6]
縦ベクトルを作るには、セミコロンを使います。この結果は以下になります。
3-element Vector{Int64}:
4
5
6
無事、縦ベクトルが出来ました。また、セミコロンのあとの空白は無くてもいいため、上記は単純に次のように書いてもいいです。
y = [4; 5; 6]
さて、次に行列です。上記2つの記載方式を組み合わせて、行列を作れます。
A = [7 8 9;
10 11 12]
この結果は以下になります。
2×3 Matrix{Int64}:
7 8 9
10 11 12
また、ここからわかるように、変数名には大文字を使ってもいいです。
要素は小数でも大丈夫です。
B = [1.0 2.0 3.0;
4.0 5.0 6.0]
この結果は以下になります。
2×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
ここでは、Int64
となっていたものがFloat64
になっていることがわかります。これは、数字を表す表現形式が、「64ビットを用いた整数表現」か、「64ビットを用いた小数表現」かを表しています。これらは変数の型と呼ばれます。多くの言語では変数の型を意識することは極めて重要ですが、Juliaはとりあえず気にしなくてもよしなにやってくれるという特徴があります。
さて、行列の足し算・引き算をやってみましょう。あるセルで以下を実行し、2x2の行列を作ってください。
A = [1 2; 3 4] # セミコロン後の改行を省略。これは2x2の行列
上記のように、「#」以降にはコメントといって、コードを実行する際には無視される、説明文章を付けることが出来ます。
さて、次に別のセルで以下を実行してください。
B = [5 6; 7 8]
ここで、さらに別のセルで以下を実行してみてください。
A + B
以下のような結果になるはずです。
2×2 Matrix{Int64}:
6 8
10 12
無事、行列の足し算が行われていることがわかります。
また、a = 3
で見たように、結果を別の変数に代入することもできます。例えばベクトルの足し算を以下のようにしてみましょう。
x = [1; 2; 3]
y = x + [6; 7; 8]
ここでは、
3-element Vector{Int64}:
7
9
11
となります。
やってみよう:
小数の色々なサイズの行列を作り、足したり引いたりしてみましょう。手計算結果と比較してみてください。
行列のサイズが合わないときは、どうなりますか?
行列の掛け算もやってみましょう。
A * B
の表記でOKです。これは行列積になります。