Swift とは JVM 上で動くスクリプト言語だという事は知っています。
非常に有名なプログラミング言語であるにも関わらず、しかし事前知識はそれだけで他のことは全く知りませんでした。
こんな有名なプログラミング言語を知らないなんて、それは少し恥ずかしいな、と思い立って。プログラミング言語 Swift を調べてみたいと思います。
■ まずはネット検索
ネット検索すると、公式のサイトなどよりも先に Wikipedia の記事が見つかります。
en.wikipedia.org
これを読んでみようと思いますが、どうも日本語記事はない様子。
この画像の左下。Languages に日本語がありません。確かに日本で使われている話も聞いたことありませんし、あまり日本では使われていないのかもしれません。
■ ちなみに C# では
ちなみに我らが C# ではこんな感じです。
en.wikipedia.org
非常に多くの言語で記事が作成されています。
■ Swift の概要
というわけで Wikipedia の記事を読んでみます。読んでみるとどうも Swift というプログラミング言語は次のような言語とのことです。
- シカゴ大学とアルゴンヌ国立研究所が 2007 年に作った
- Java VM 上で動作する
- スクリプト言語
- OSS ライセンスは Apache License 2.0
- コマンドラインプログラムやファイルを扱うのが得意
- プログラマが意識しなくても自動的に並行処理が行われる
■ チュートリアルの URL、と思ったけどまずは クイックスタート
というわけで、調査を進めていきます。
今回見つけた公式チュートリアルの URL です。
http://swift-lang.org/swift-tutorial/doc/tutorial.html
というところまで探したところでクイックスタートを見つけました。まずはこちらで環境を整えるチャレンジをしてみたいと思います。
http://swift-lang.org/guides/release-0.96/quickstart/quickstart.html
[ まずは ] まずは成功しなかったパターンです
今回の記事は後で成功しますが、まずは試してみて成功しなかったパターンも記載していこうと思います。。うまくいかない方法を一つ見つけた、というやつです。実際高価値記事!
■ Java の準備
ドキュメントによると JDK 1.7 以上が必要という事です。私の環境には Microsoft OpenJDK 11 がインストール済みでした。
この Java でやっていきます。
■ Swift コマンド
次の URL から Java で作られた Swift コマンドをダウンロードします。
http://swift-lang.org/packages/swift-0.96.2.tar.gz
ダウンロードしたら tar コマンドで展開します。今の Windows には tar コマンドがあるので PowerShell のターミナルを開いて次のように。ここで意識したいのが Swift の動作環境です。公式サイトによるとマルチプラットフォームで Windows も動作環境とされています。
( GUI を持たず Java で実行されますし )
tar xfz swift-0.96.2.tar.gz
展開してみると bin フォルダの中に swift.bat ファイルがありました。もしや Windows でも動くのか!? と思ったらダメでした。というのがまずこれからの流れです。
■ swift.bat
実行してみると......動きません。
PS > \swift-0.96.2\bin\swift.bat -Djava.endorsed.dirs=C:\Users\XXXXXXXXXXXX\Downloads\swift-0.96.2\lib\endorsed is not supported. Endorsed standards and standalone APIs in modular form will be supported via the concept of upgradeable modules. Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.
どうもこの -Djava.endorsed.dirs
という Java の起動オプション、Java 9 以降には存在せずエラーになるようです。ということはこの bat、Java 8 以前、2017 年以前のものということですね。公式サイト等を見ていると Swift は 2016 年にほとんど止まっているようなのでそういうことなのでしょう。
とりあえず起動オプションを外してみます。場所は \swift-0.96.2\bin\swift.bat ファイルの 52 行目です。
set OPTS=-DCOG_INSTALL_PATH="%SWIFT_HOME%" -Dswift.home="%SWIFT_HOME%"%COG_OPTS% -Djava.endorsed.dirs="%SWIFT_HOME%\lib\endorsed"
↓
set OPTS=-DCOG_INSTALL_PATH="%SWIFT_HOME%" -Dswift.home="%SWIFT_HOME%"%COG_OPTS%
実行すると
PS > \swift-0.96.2\bin\swift.bat Swift 0.96.2 git-rev: b9611649002eecd640fc6c58bbb88cb35ce03539 heads/release-0.96-swift 6287 No Swift script specified
動作はしました。ただ今はまだ Swift で実行するコードを指定していないのでエラーになっています。
■ Swift のコード
環境はできたようなので、クイックスタートのコードファイルを次の URL からダウンロードします。
http://swift-lang.org/guides/release-0.96/quickstart/hello.swift
ダウンロードしたファイルの中のコードはこんな感じでした。これが Swift のコードなんですね!
// Define file as a type type file; // A simple app that echo's a string to a file app (file output) echo (string s) { echo s stdout=@output ; } // Map a filename to a variable of type file file output <"hello.out">; // Call the app output = echo("hi");
Swift のコードは読めませんがなんとなく、何をするコードかは分かりますね。簡単で学習しやすい言語なのかもしれません。
hello.out というファイルに hi と出力するようですね。分かります。
■ もういちど Swift 実行
実行してみます。
PS > \swift-0.96.2\bin\swift.bat hello.swift 2023-01-22 XX:XX:XX,XXX+0900 DEBUG Loader Detailed exception: com.typesafe.config.ConfigException$BadPath: path parameter: Invalid path 'env.=::': Token not allowed in path expression: '=' (you can double-quote this token if you really want it here) at com.typesafe.config.impl.Parser.parsePathExpression(Parser.java:1095) at com.typesafe.config.impl.Parser.parsePath(Parser.java:1135) at com.typesafe.config.impl.Path.newPath(Path.java:224) at com.typesafe.config.impl.PropertiesParser.fromPathMap(PropertiesParser.java:79) at com.typesafe.config.impl.ConfigImpl.fromAnyRef(ConfigImpl.java:260) at com.typesafe.config.impl.ConfigImpl.fromPathMap(ConfigImpl.java:200) at com.typesafe.config.ConfigFactory.parseMap(ConfigFactory.java:855) at com.typesafe.config.ConfigFactory.parseMap(ConfigFactory.java:866) at org.griphyn.vdl.util.SwiftConfig.getSubstitutions(SwiftConfig.java:336) at org.griphyn.vdl.util.SwiftConfig.load(SwiftConfig.java:253) at org.griphyn.vdl.karajan.Loader.loadConfig(Loader.java:598) at org.griphyn.vdl.karajan.Loader.main(Loader.java:148) Could not start execution: path parameter: Invalid path 'env.=::': Token not allowed in path expression: '=' (you can double-quote this token if you really want it here)
動きません!
ちょっと Java のことは全然わからないので。org.griphyn.vdl.karajan is 何ぞ......。
■ Swift はどうもかつては Windows でも動いていた形跡
Swift はどうもかつては Windows でも動いていた形跡があります。しかし動かなかったので、おとなしく今回は WSL で試してみようと思います。
ここからは動作するパターンです
ここからは動作するパターンです。Ubuntu です。
■ WSL の準備
まずは Windows の WSL (Windows Subsystem for Linux) の準備です。ターミナルでコマンドを実行します。
wsl --install Ubuntu
今回は Ubuntu 22.04.01 がインストールされました。
■ swift コマンド実行
ひとまず WSL で swift コマンドを実行してみます。
http://swift-lang.org/packages/swift-0.96.2.tar.gz
http://swift-lang.org/guides/release-0.96/quickstart/hello.swift
xxxxxxxxxx@XXXXXXXXXX:/mnt/x/xxxxxxxxxxxx$ /mnt/x/xxxxxxxxxxxx/swift-0.96.2/bin/swift hello.swift /mnt/x/xxxxxxxxxxxx/swift-0.96.2/bin/swift: line 178: java: command not found
java
コマンドが見つからない、と怒られました。それはそうですね。まだインストールしただけで何も環境を整えてませんからね。Java をインストールします。
■ Java のインストール
Java のインストール方法はこちら。
learn.microsoft.com
# Valid values are only '18.04' and '20.04' # For other versions of Ubuntu, please use the tar.gz package ubuntu_release=`lsb_release -rs` wget https://packages.microsoft.com/config/ubuntu/${ubuntu_release}/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get install apt-transport-https sudo apt-get update sudo apt-get install msopenjdk-17
$ java --version openjdk 17.0.6 2023-01-17 LTS OpenJDK Runtime Environment Microsoft-7209853 (build 17.0.6+10-LTS) OpenJDK 64-Bit Server VM Microsoft-7209853 (build 17.0.6+10-LTS, mixed mode, sharing)
openjdk 17.0.6 がインストールされました。
■ 実行
満を持して実行!
$ /mnt/x/xxxxxxxxxxx/swift-0.96.2/bin/swift hello.swift -Djava.endorsed.dirs=/mnt/c/Users/owner/Downloads/swift-0.96.2/lib/endorsed is not supported. Endorsed standards and standalone APIs in modular form will be supported via the concept of upgradeable modules. Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.
エラーになりました。これは先ほど Windows で試みたときにも見たやつですね。
■ swift ファイルを編集
\swift-0.96.2\bin\swift ファイルも編集してみましょう。\swift-0.96.2\bin\swift ファイルの 44 行目です。
OPTIONS="$OPTIONS -Djava.endorsed.dirs=$SWIFT_HOME/lib/endorsed"
↓
OPTIONS="$OPTIONS "
■ もういちど実行
$ /mnt/x/xxxxxxxxxxxx/swift-0.96.2/bin/swift hello.swift Swift 0.96.2 git-rev: b9611649002eecd640fc6c58bbb88cb35ce03539 heads/release-0.96-swift 6287 RunID: run008 Progress: Xxx, xx Jan 2023 xx:xx:31+0900 Progress: Xxx, xx Jan 2023 xx:xx:32+0900 Active:1 Final status: Xxx, xx Jan 2023 xx:xx:32+0900 Finished successfully:1
うごいたっぽいです。
ここで実行した Swift のコードを見てみましょう。
// Define file as a type type file; // A simple app that echo's a string to a file app (file output) echo (string s) { echo s stdout=@output ; } // Map a filename to a variable of type file file output <"hello.out">; // Call the app output = echo("hi");
先ほども見ましたが、どうやら hello.out というファイルに hi と書き込むコードですね?
■ 実行結果確認
実際 hello.out というファイルが作られているので中身を見てみましょう。
hi
計画通り! 動作しました。
Swift の歴史
ここで少し立ち止まって、プログラミング言語 Swift の歴史を調べてみましょう。
■ 歴史
情報がほとんどなく、そろってもいなく、見つけた情報を表にしてみました。
プログラミング言語 Swift | Apple Swift | |
---|---|---|
2007/03/02 | 登場 SWIFT 0.1 |
- |
2007/07/19 | SWIFT 0.2 | - |
2007/10/04 | SWIFT 0.3 | - |
2008/03/18 | SWIFT 0.4 | - |
2008/04/16 | SWIFT 0.5 | - |
2008/08/25 | SWIFT 0.6 | - |
2008/11/11 | SWIFT 0.7 | - |
2009/01/30 | SWIFT 0.8 | - |
2009/04/27 | SWIFT 0.9 | - |
2010/12/23 | SWIFT 0.91 | - |
2011/04/13 | SWIFT 0.92.1 | - |
2011/11 | SWIFT 0.93 | - |
不明 (2012?) | SWIFT 0.94 | - |
不明 (2013?) | SWIFT 0.94.1 | - |
不明 (2014?) | SWIFT 0.96 | - |
2014/06/02 | - Wikipedia ページ作成 |
登場 Wikipedia ページ作成 |
2015/08/05 | 最新リリース(0.96.2) | - |
2016/12/21 | 公式サイトの最終更新? | - |
情報ソースはこの辺りです。
Swift - Downloads
Index of /guides
en.wikipedia.org
? の年は私が想像で、不明期間を等間隔にした年です。
Apple 社が同名のプログラミング言語を発表したタイミングでようやく Wikipedia に記事が作成されたようですね。
公式サイトの更新は止まっているようですが Swift の開発は今でも GitHub で続けられているようです。
github.com
チュートリアル
というわけでチュートリアルを開始します。
■ Swift のチュートリアル
色々寄り道をしましたがようやくチュートリアルです。チュートリアルを修めて Swift を完全に理解しましょう。
公式サイトのページはこちらです。
swift-lang.org
■ Swift のインストールフォルダ
チュートリアルでの (というか標準のインストール手順でも) 準備として Swift コマンドのあるフォルダを PATH に追加するように書かれています。
けれども、どうも追加しなくても良さそうなのでそのまま進めていきましょう。今回は Swift コマンドは
/mnt/c/Swift/cmd/bin/swift
に置きました。
■ まずはバージョンの確認
まずはチュートリアルの動作のバージョンが設定されているとのことで、バージョンの確認方法が書かれています。
$ swift -version
チュートリアルの動作バージョンは java 1.7 以上と swift-0.96 とのことです。チュートリアルには書いていませんが、せっかくなので Java と Swift 両方のバージョンを見てみましょう。
$ java --version openjdk 17.0.6 2023-01-17 LTS OpenJDK Runtime Environment Microsoft-7209853 (build 17.0.6+10-LTS) OpenJDK 64-Bit Server VM Microsoft-7209853 (build 17.0.6+10-LTS, mixed mode, sharing)
$ /mnt/c/Swift/cmd/bin/swift --version Swift 0.96.2 git-rev: b9611649002eecd640fc6c58bbb88cb35ce03539 heads/release-0.96-swift 6287
問題なさそうですね。
■ チュートリアルのリソースをダウンロード
チュートリアル用のリソースをダウンロードします。git から clone するか zip をダウンロードするか、どちらも良いとのこと。今回は作ったばかりの環境で git も整えていなので zip をダウンロードしてみます。
git の場合の取得元
https://github.com/swift-lang/swift-tutorial.git
zip の場合の取得元
https://github.com/swift-lang/swift-tutorial/archive/master.zip
zip 取得のコマンド
zip 取得は次のコマンドが案内されています。
wget https://github.com/swift-lang/swift-tutorial/archive/master.zip unzip master.zip mv swift-tutorial-master swift-tutorial cd swift-tutorial
このコマンド、最初の 1 行目がダウンロードで、2 行目が zip の展開です。この 1 行目は成功しますが、2 行目は失敗してしまいました。
Command 'unzip' not found, but can be installed with: sudo apt install unzip
*unzip** コマンドをインストールせよと。今回は面倒なので Windows で展開しました。( WSL でやっているので。ファイルをそれなりに色々と整った Windows から操作できる環境でやっています )
展開した後の 3 行目でフォルダのリネームをしているのですが、Windows 標準の展開ではチュートリアルの想定をフォルダ構成を変わってしまいました。この辺りも Windows 上で良い感じに整えて続けていきます。
4 行目でディレクトリを移動して次のステップへ進みます。
mv swift-tutorial-master swift-tutorial cd swift-tutorial
■ チュートリアルのセットアップ
ここで Swift の環境構築とは別にチュートリアルのセットアップが必要とのこと。次のコマンドです。
source setup.sh
ちょっと setup.sh の中を見てみましょう。
######################### CONFIGS ########################### export BEAGLE_USERNAME="" export BEAGLE_PROJECT="" export MIDWAY_USERNAME="" export AWS_CREDENTIALS_FILE="" export URL_OF_AD_HOC_MACHINE_1="" export AD_HOC_1_USERNAME="" export AD_HOC_N_USERNAME="" export OSG_USERNAME="" export OSG_PROJECT="" export BLUES_USERNAME="" export CLOUD_HEADNODE="http://HEADNODE_ADDRESS:50010" ############################################################# # ensure that this script is being sourced if [ ${BASH_VERSINFO[0]} -gt 2 -a "${BASH_SOURCE[0]}" = "${0}" ] ; then echo ERROR: script ${BASH_SOURCE[0]} must be executed as: source ${BASH_SOURCE[0]} exit 1 fi # Setting scripts folder to the PATH env var. TUTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" if [ _$(which cleanup 2>/dev/null) != _$TUTDIR/bin/cleanup ]; then echo Adding $TUTDIR/bin:$TUTDIR/app: to front of PATH PATH=$TUTDIR/bin:$TUTDIR/app:$PATH else echo Assuming $TUTDIR/bin:$TUTDIR/app: is already at front of PATH fi # Set PATH for specific hosts if hostname | grep bridges; then module load java # Get Oracle Java 1.8.x SWIFT=/home/wilde/swift/rev/swift-0.96.2 PATH=$SWIFT/bin:$JAVA:$PATH module unload mpi/intel_mpi module load mpi/gcc_mvapich export CC="mpicc" echo "modules adjusted: unloaded mpi/intel_mpi; loaded mpi/gcc_mvapich" echo "This list should should show mpi/gcc_mvapich as only MPI:" module list elif hostname -f | grep "edison" ; then echo "Configuring for Edison" module swap PrgEnv-intel PrgEnv-gnu export PATH=$PWD/part07:$PATH export CC="cc" pushd . cd part07/ ; make clean ; make popd pushd . cd part08/ ; rm hipi make clean ; make popd elif hostname -f | grep "ncsa.illinois.edu" ; then # BW does not have a clearly identifiable hostname on the login nodes module load java # Oracle java java/jdk1.8.0_51 module unload PrgEnv-cray/5.2.82 module load PrgEnv-gnu/5.2.82 SWIFT=~wilde/scratch/swift/rev/swift-0.96.2 PATH=$SWIFT/bin:$PATH export CC="cc" elif hostname | grep comet; then JAVA=/oasis/scratch/comet/xdtr1/temp_project/jdk1.8.0_91/bin SWIFT=/oasis/scratch/comet/xdtr1/temp_project/swift/swift-0.96.2/bin PATH=$SWIFT:$JAVA:$PATH elif hostname | grep workflow.iu; then SWIFT=/opt/swift/swift-0.96.2/bin JAVA=$(echo /opt/swift/jdk1.*/bin) PATH=$SWIFT:$JAVA:$PATH export X509_USER_PROXY=/tmp/x509.$USER.$RANDOM elif [ -d /usr/local/bin/swift-trunk ] && [ -d /usr/local/bin/jdk1.7.0_51 ]; then JAVA=/usr/local/bin/jdk1.7.0_51/bin SWIFT=/usr/local/bin/swift-trunk/bin PATH=$JAVA:$SWIFT:$PATH elif [ -d /opt/swift/swift-0.96.1 ] && [ -d /opt/swift/jdk1.7.0_51 ] then export SWIFT=/opt/swift/swift-0.96.1/bin export JAVA=/opt/swift/jdk1.7.0_51/bin export PATH=$SWIFT:$JAVA:$PATH export X509_USER_PROXY=/tmp/x509.$USER.$RANDOM fi echo "Swift version is $(swift -version)" return
重い。あと .sh ファイルなので当然ですが、Windows では動きませんね? チュートリアルの動作条件に書いてないようですけれども。Swift 自体はマルチプラットドームで Windows でも動作すると公式サイトでは言っているだけに少し残念です。いいんですけど。WSL あるし。大丈夫です。問題ない。
■ チュートリアルの概要
チュートリアルは何かを書いて動かしていくスタイルではなく、用意されたプログラムを解説を読みながら実行していくスタイルです。先ほど取得したリソースにもチュートリアルのステップごとにフォルダが用意されています。このように。
$ ls -l /mnt/c/Swift/swift-tutorial/ total 56 -rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 10 Dec 14 2016 README.asc drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 4096 Feb 12 17:07 app drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 4096 Feb 12 17:07 bin drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 4096 Feb 12 17:07 doc -rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 23795 Dec 14 2016 ec2.asc -rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 441 Dec 14 2016 local.conf drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 4096 Feb 12 17:07 mandelbrot drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 4096 Feb 12 17:07 mpi -rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 6079 Dec 14 2016 nersc.conf drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 4096 Feb 12 17:07 part01 drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 4096 Feb 12 17:07 part02 drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 4096 Feb 12 17:07 part03 drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 4096 Feb 12 17:07 part04 drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 4096 Feb 12 17:07 part05 drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 4096 Feb 12 17:07 part06 drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 4096 Feb 12 17:07 part07 drwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 4096 Feb 12 17:07 part08 -rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 2979 Dec 14 2016 setup.sh -rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 14509 Dec 14 2016 swift.conf -rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 1842 Dec 14 2016 test_all.sh -rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 8052 Dec 14 2016 xsede.conf
part01 ~ part10 のディレクトリですね。参考に一つ目 part01 の中を見てみましょう。
l$ ls -l /mnt/c/Swift/swift-tutorial/part01/ total 0 -rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 113 Dec 14 2016 p1.swift -rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 13 Dec 14 2016 swift.conf
Swift のプログラムと .conf ファイルが入っています。それぞれ見てみましょう。
p1.swift
type file; app (file o) simulation () { simulate stdout=filename(o); } file f <"sim.out">; f = simulation();
swift.conf
../local.conf
p1.swift は simulate コマンドを実行して sim.out ファイルに書き込むプログラムですね。
swift.conf は別の .conf ファイルを読んでいます。こちらも見てみましょう。
../local.conf
sites: [localhost] site.localhost { execution { type: "local" URL : "localhost" } staging : direct workDirectory : "/tmp/"${env.USER}"/swiftwork" maxParallelTasks : 20 initialParallelTasks: 20 app.ALL { executable: "*" } } TCPPortRange: "50000,51000" lazyErrors: false executionRetries: 0 keepSiteDir: true providerStagingPinSwiftFiles: false alwaysTransferWrapperLog: true
どうも .conf はリモート実行の設定をするようですね。part01 のこれはローカル実行みたいですね。
■ simulate コマンド
ここで simulate コマンドとは? というところですが、 .sh ファイルのようです。チュートリアルのリソースの app フォルダの中にいます。このフォルダは先の setup.sh でパスに追加される手筈のようですね。
環境のコマンドをそのまま実行できてしまう。Swift 、なかなか便利そうですね。
$ ls -l /mnt/c/Swift/swift-tutorial/app/simulate.sh -rwxrwxrwx 1 XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX 3076 Dec 14 2016 /mnt/c/Swift/swift-tutorial/app/simulate.sh
simulate.sh
#! /bin/bash sleep 1 printparams() { printf "\nSimulation parameters:\n\n" echo bias=$bias echo biasfile=$biasfile echo initseed=$initseed echo log=$log echo paramfile=$paramfile echo range=$range echo scale=$scale echo seedfile=$seedfile echo timesteps=$timesteps echo output width=$width } log() { printf "\nCalled as: $0: $cmdargs\n\n" printf "Start time: "; /bin/date printf "Running as user: "; /usr/bin/id printf "Running on node: "; /bin/hostname printf "Node IP address: "; /bin/hostname -I printparams printf "\nEnvironment:\n\n" printenv | sort } addsims() { while read f1 ; do read -u 3 f2 if [ _$f1 = _ ]; then f1=$lastf1; fi if [ _$f2 = _ ]; then f2=$lastf2; fi printf "%${width}d\n" $(($f1+$f2)) lastf1=$f1 lastf2=$f2 done <$1 3<$2 } # set defaults bias=0 biasfile=none initseed=none log=yes paramfile=none range=100 scale=1 seedfile=none timesteps=0 nvalues=1 width=8 cmdargs="$*" usage() { echo $0: usage: cat <<END -b|--bias offset bias: add this integer to all results -B|--biasfile file of integer biases to add to results -l|--log generate a log in stderr if not null -n|--nvalues print this many values per simulation -r|--range range (limit) of generated results -s|--seed use this integer [0..32767] as a seed -S|--seedfile use this file (containing integer seeds [0..32767]) one per line -t|--timesteps number of simulated "timesteps" in seconds (determines runtime) -x|--scale scale the results by this integer -h|-?|?|--help print this help END } # FIXME: NOT YET IMPLEMENTED: # -p|--paramfile take these parameters (in form param=value) from this file # -p|--paramfile) paramfile=$2 ;; while [ $# -gt 0 ]; do case $1 in -b|--bias) bias=$2 ;; -B|--biasfile) biasfile=$2 ;; -l|--log) log=$2 ;; -n|--nvalues) nvalues=$2 ;; -s|--seed) initseed=$2 ;; -S|--seedfile) seedfile=$2 ;; -t|--timesteps) timesteps=$2 ;; -r|--range) range=$2 ;; -w|--width) width=$2 ;; -x|--scale) scale=$2 ;; -h|-?|--help|*) usage; exit ;; esac shift 2 done # process initial seed if [ $initseed != none ]; then RANDOM=$initseed fi # process file of seeds if [ $seedfile != none ]; then seed=0 while read $seedfile s; do seed=$(($seed+$s)) done <$seedfile RANDOM=$seed fi # run for some number of "timesteps" sleep $timesteps # emit N (nvalues) "simulation results" scaled and biased by argument values simout=$(mktemp simout.XXXX) for ((i=0;i<$nvalues;i++)); do # value=$(( (($RANDOM)*(2**16))+$RANDOM )) value=$(( (($RANDOM)*(2**48)) + (($RANDOM)*(2**32)) + (($RANDOM)*(2**16)) + $RANDOM )) printf "%${width}d\n" $(( ($value%range)*scale+bias)) done >$simout # process file of biases if [ $biasfile != none ]; then addsims $simout $biasfile else cat $simout fi rm $simout # log environmental data if [ $log != off ]; then log 1>&2 fi
■ 前半と後半
という事で、用意された Swift コードファイルを順次実行することでチュートリアルが進んでいきます。チュートリアルの説明にもありますが、part 1 ~ 3 ではローカルの並列実行をためして、part 4 ~ 6 ではリモート実行を試す内容になっています。ちょっとチュートリアルとしては言っていることが重い気もしなくもないですね。
リモート実行では、大学や研究機関、パブリッククラウドなどのサイトでの実行が試せる内容になっているようです。実際のところ動かしても目には見えないので体感として分かりませんが。でもコンピュータリソースをデフォルトで分散共有できるのは素晴らしいと思います。
■ 完全に理解した!
というわけで Swift 完全に理解したつもりになりました!
(実際にはまだチュートリアル動かしていませんが、手順は動かすだけなので今のところはこれで良いでしょう)