エンジニア4年目のブログ

Javaエンジニア4年目のブログです。

Macにlemを入れてみる

どうもShZgZです!

 

まぁ暑い、水分と塩分はしっかり補給するようにします!

 

最近lemという言葉をtwitterのフォローしてる人の中でちょいちょい耳にしたので、

調べてみました。

 

結果、

Emacsライクなエディタ
拡張がCommon Lispで書ける
起動が早い
ひとまずこんなのらしいです。

 

とりあえず入れてみようということで、Githubはこれ

環境:
OS:macOS 10.13.4
 

手順に従って、まずroswell*1のインストール

$ brew install roswell

次に、roswellを使ってlemをインストール

$ ros install cxxxr/lem

しようとしたけど、

Installing sbcl-bin...
No SBCL version specified. Downloading platform-table.html to see the available versions...
[##########################################################################]100%
Installing sbcl-bin/1.4.10...
Downloading https://github.com/roswell/sbcl_bin/releases/download/1.4.10/sbcl-1.4.10-x86-64-darwin-binary.tar.bz2
Download Failed with status 2. See download_simple in src/download.c
Segmentation fault: 11

こんな感じでエラー。。。(2018/08/15 11時時点)

roswellが上手く動かない。無念。*2

ということで、roswellソース引っ張ってきてインストールしました。

# brewのroswellをアンインストール
$ brew uninstall roswell
# clone
$ git clone https://github.com/roswell/roswell
# ビルド
$ cd roswell
$ ./bootstrap
$ ./configure
$ make
# インストール
$ sudo make install

無事roswellのインストールに成功。

では気を取り直して

$ ros install cxxxr/lem

無事成功!

$ lem

でlemを開くことができました!

因みにアップデートは

ros update lem

設定ファイルは

~/.lemrc

使い勝手はまた。
でわ。

*1:roswell:Common Lisp環境のセットアップユーティリティ

*2:Homebrewで入れると上手くいかないそうです。Githubのissueにもなってました。

ReactNativeのmodule削除の手順でちょっと詰まったのでメモ

暑いですね。

最近ReactNativeを使っていて、

$ npm i {パッケージ名}
$ react-native link {パッケージ名}

こんな感じでmodule追加したんだけどこのリンクを切るのに

$ npm uninstall {パッケージ名}

をやっちゃうとダメだよっていう話

 

正しくは、先にlinkを切ってあげなきゃいけないから

$ react-native unlink {パッケージ名}
$ npm uninstall {パッケージ名}

間違ってnpm uninstallしちゃった場合は、

もう一度npm installしてあげてから正しい手順で消してあげればOK!!

(iOSの方は試してないけど、Androidの方はMainApplication.javaの中でNewされてたりして落ちた。Newしてるところを削除すればOK!)

Rust:Floatについてもうちょっと

どうもShZgZです。

 

寒いです。みなさん体調にはくれぐれもお気をつけて。

 

PartialEqについて調べていた時に

・i32:Eq

・f32:PartialEq

となっていて、なんぞ?と思ったらサンプルのところで

NaNがあるからって書いてある。

 

・・・ほう。わからん。

 

NaNって恥ずかしながらあんまり意識してこなかったため

Nilとかnullみたいなもんやろと思っていました。

大学のときに先生が説明してくれていたらごめんなさい。

 

で、とりあえずNaNについてWikiさん曰く

NaN - Wikipedia

NaNNot a Number、非数、ナン)は、コンピュータにおいて、主に浮動小数点演算の結果として、不正なオペランドを与えられたために生じた結果を表す値またはシンボルである。NaNの体系的仕様は、無限大の表現などと共に1985年の IEEE 754 浮動小数点規格で標準が与えられている。 

 なんかエラーがあったときの値ってことみたいな感じ。

浮動小数点数は値を丸めちゃうから0で割るような状況が起き得るからかな?

なんとなくわかったんだけど、ここでさらに不穏な"無限大の表現などと共に"って言葉。

 

・・・無限大ってあるの?

 

もしかしたらとても基本的なことなのかもしれないけどとりあえずこれまで気にした事なかった。証明支援系で使う時に実装してたのは知ってたけど、一般的に実装されてるものだと思ってなかった。

 

で、とりあえずRustでどう実装されてるか見てみた。

/// Not a Number (NaN).
#[stable(feature = "rust1", since = "1.0.0")]
pub const NAN: f32 = 0.0_f32 / 0.0_f32;
/// Infinity (∞).
#[stable(feature = "rust1", since = "1.0.0")]
pub const INFINITY: f32 = 1.0_f32 / 0.0_f32;
/// Negative infinity (-∞).
#[stable(feature = "rust1", since = "1.0.0")]
pub const NEG_INFINITY: f32 = -1.0_f32 / 0.0_f32;

要するに、

0/0・・・NaN

1/0・・・無限大

-1/0・・・マイナス無限大

ってことらしい。

 

とりあえずいくつか試してみる。

use std::f32::{NAN, INFINITY, NEG_INFINITY};
fn main() {
println!("INFINITY:{}", INFINITY);
println!("INFINITY + 1000:{}", INFINITY + 1000_f32);
println!("INFINITY - 1000:{}", INFINITY - 1000_f32);
println!("INFINITY * 1000:{}", INFINITY * 1000_f32);
println!("INFINITY / 1000:{}", INFINITY / 1000_f32);
println!("INFINITY % 1000:{}", INFINITY % 1000_f32);
println!("NEG_INFINITY:{}", NEG_INFINITY);
println!("NEG_INFINITY + 1000:{}", NEG_INFINITY + 1000_f32);
println!("NEG_INFINITY - 1000:{}", NEG_INFINITY - 1000_f32);
println!("NEG_INFINITY * 1000:{}", NEG_INFINITY * 1000_f32);
println!("NEG_INFINITY / 1000:{}", NEG_INFINITY / 1000_f32);
println!("NEG_INFINITY % 1000:{}", NEG_INFINITY % 1000_f32);
println!("NAN:{}", NAN);
println!("NAN + 1000:{}", NAN + 1000_f32);
println!("NAN - 1000:{}", NAN - 1000_f32);
println!("NAN * 1000:{}", NAN * 1000_f32);
println!("NAN / 1000:{}", NAN / 1000_f32);
println!("NAN % 1000:{}", NAN % 1000_f32);
println!("INFINITY - INFINITY:{}", INFINITY - INFINITY);
}

INFINITY:inf

INFINITY + 1000:inf

INFINITY - 1000:inf

INFINITY * 1000:inf

INFINITY / 1000:inf

INFINITY % 1000:NaN

NEG_INFINITY:-inf

NEG_INFINITY + 1000:-inf

NEG_INFINITY - 1000:-inf

NEG_INFINITY * 1000:-inf

NEG_INFINITY / 1000:-inf

NEG_INFINITY % 1000:NaN

NAN:NaN

NAN + 1000:NaN

NAN - 1000:NaN

NAN * 1000:NaN

NAN / 1000:NaN

NAN % 1000:NaN

INFINITY - INFINITY:NaN

 大体直感通りな感じ。

 

因みに、traitのEq, PartialEqは実装する関数が全く一緒です。というか、EqはPartialEqを実装してればOKってやつです。

ただ、ここには意味上の違いがあり数学的には半同値関係と同値関係を表すものとなっています。(Eq・・・同値, PartialEq・・・半同値)

↑の意味は、興味あったら調べてみて下さい。

 

簡単にいうと、それぞれの要素aに関して

 a == a

が成り立つならEq, そうじゃない要素があるならPartialEqですよってことです。

 

具体的にいきます。

u32で考えてみると、u32の要素(1, 2, 3, 4)はそれぞれ

1 == 1 // true
2 == 2 // true
3 == 3 // true
4 == 4 // true

となり、

まぁそれ以外でも成り立ちますから、u32はEqを実装していると言えます。ただ、ここでも実際に実装する関数はPartialEqと同じですから、自分が新しく構造体を作りPartialEqを実装した場合に、PartialEqの対象となる要素a全てに対して

 a == a

としておくと 、後で自分や他人が見た時に意味が判り易くて助かるよってことです。

 

f32はどうかというと、f32の要素(1.1_f32, 2.52_f32, INFINITY, NaN)などの数値)はそれぞれ

1.1_f32 == 1.1_f32 // true
2.52_f32 == 2.52_f32 // true
INFINITY == INFINITY // true
NAN == NAN // false

となり、NANに関して等号が成り立ちません。

そのため、f32, f64は要素a全てに対して

 a == a

が成り立たないため、PartialEqとなっています。要するに、PartialEq実装したけど、同じ要素を比較した時に等号が成り立たない奴いるよってことを表してくれているわけです。

 

・まとめ

floatには小数要素の他に、数じゃない要素と無限大を表す要素あるよ。

(しかもIEEE 754で定まってるから結構色んな言語であるのかも。知ってたら教えて下さい。)

EqとPartialEqの違いは実装上は無い。ただ、意味として全要素について同じ要素 同士の等号が成り立つ(数学だと反射律って言います。)かどうかっていう違いがあるよ。

floatのお話

どうもShZgZです。

 

本日は雪の影響(おかげ)で少し早く帰れました。諸々お気をつけ下さい。

 

今回はタイトル通り「floatのお話」です。

 

まず、下のコードをご覧下さい。

>>> 27.0 / 10.0 - 17.0 / 10.0 > 1
True

※Python3の計算結果です。

これを見て、「?、当たり前じゃん」となっちゃう方は恐らくこの読んでも面白い事はあまり無いと思いますが、できれば読んで頂いてコメント貰えるととても嬉しい。

 

Paiza解いてる時に詰まった部分なんですが、なんか浮動小数点の計算しててなんか挙動おかしいなと思って確かめてる時にこれを見つけました。

普通に計算したら、

 

27.0 / 10.0 - 17.0 / 10.0  =  2.7 - 1.7 = 1.0

 

1.0 > 1 = False

1.0 < 1 = False

 

こうなってくれるんじゃ無いかと思ってたわけです。

 

でもならない。

 

因みに、

>>> 27.0 / 10.0 - 17.0 / 10.0
1.0000000000000002

こうなりました。

 

簡単にすると、 

>>> 2.6 - 1.6
1.0
>>> 2.7 - 1.7
1.0000000000000002

※因みに、Rustでも同様であることは確認しました。他の言語は試してません。興味ある方は是非試してみて下さい。

 

この原因ですが、そもそも浮動小数点をどう扱っているかというところです。

浮動小数点数の計算はIEEE 754で定められています。←これどういうことかというとプログラミング言語における標準仕様(IEEE 754)に書かれてることだから、それに沿ってる色んな言語で上記のような状況がありえるよってことです。

 

浮動小数点の基本形式に関しては情報処理技術者の試験とかでもあった気がするので説明は割愛します(気になったらWikiとか他のサイトとかを参考にしてみて下さい。今回の話ではわかってなくても大丈夫です。)が、

浮動小数点数である"2.7"はデータとしては"2.7±誤差"となってもっている可能性があるということです。

ここでは先の例があるので2.7としましたが、モチロン他の値でもありえます。

 

要するに、浮動小数点数がデータとしてどのように保持されているかを理解していれば別ですが、よくわかんないという場合には

 

浮動小数点数(1.1, 2.9882, 10.301 ...etc)は、表示されたままではなく誤差があるものとして考えておこう。

 

・まとめ

プログラミングにおいて浮動小数点数を扱う際には、

1.1も中では1.1000000000001とかかもしれないし、2.9882も中では2.9881999999998とかかもしれないから、もしかしたらその浮動小数点数には誤差があるかもしれないと思っておきましょうということ。

機械学習について思ったことを書いとく

どうもShZgZです。

 

継続的にブログを書くことが出来る人たちは本当に凄いと思います。

が、それでも私はなんとなく書きたいなと思ってときだけ書きます。

 

今回はタイトルの通り、機械学習についてちょっと思ったことをメモっておきます。

 

昨今、やれ人工知能だとか機械学習だとかディープラーニングだとか騒がれてますが、全くもって便利なもんだと思います。

 

ディープラーニングの仕組みとかも面白くて、久しぶりに数学に触れた感じがしました。証明しようとしたら大変だろうけど、なんとなく概要を理解して計算を実装することは結構簡単なので是非やってみて下さい。

ちゃんと読んだのこれしかないんですが、概要掴むのには丁度良かった。

 

で、さっきちょろっと考えたことです。

※ただ、一つ注意して下さい。ちょっとネガティブっぽいこととかポジティブっぽいこととか言いますが、機械学習の構造は理解してるけど、別段機械学習を仕事とか趣味で使ってる訳でも無い人間が言っていることです。

 

機械学習人工知能の性能はガンガン上がってると感じる一方で結局責任の所在はどうなるんだろう?と。

 

名目上とか、法律上はまぁそれらの人工知能を運営してる会社なり団体なりの責任になるんだろうとは思うんですが、そういうのではなくて自分が本当に人工知能だけを完全に信頼できるようになるのかということを考えました。

 

今も翻訳とか記事を書くこととか、作曲だとかを計算機に任せるってことは既に実現しているし、結構な精度だと思います。この辺の行為に関しては、特にリスクが高い訳でもないし、とりあえずやってみて良かったらまた使うってことでいいとは思います。

 

ただ、自動運転とか手術とかはどうなのか?

考え易いのは自分の手術かな。(ただ、私には物心ついてからの手術経験無いので想像ですが。)

 

命が掛かっていたり、失敗したら障害が残ってしまうような手術で人工知能に全てを任せることができるようになるのかどうか。

今後、人工知能の性能が上がっていって(症例が増えればテストデータも増えるし、学習精度も上がっていくことでしょう。)お医者さんよりも手術の成功確率が上がる時代は来るでしょう。ただ、そのときにじゃあ人工知能さんに手術をお願いしますっていう風に簡単に言うのは中々踏ん切りがつきません。

 

人工知能の精度は上がっていったとしても精度は100%にはならない訳で、それに対して状況は千差万別。他の人たちでは大丈夫だったとしても、自分の場合はおかしな挙動をしてしまうってことはありうるのではないかと。

人間だってミスはします。そりゃ無いに越したことは無いけど、するもんはします。人工知能もその性質上ミスでは無いのですが、明らかにおかしい挙動をすることがあります。そのような明らかな異常行動さえなければ手術でも任せられるんだと思います。

そういう意味で、今は人工知能と人間が協力しあっていく方向になっていっている。道具として使うのではなく、その人工知能の人格?人間性?ちょっと違う気もするけど(そもそも人間じゃないしね)、その人工知能の性格みたいなものを理解し、協力しあっていくということになっていくのだろうと思っています。

 

それはいい方向性だと思います。ただ、それでもヒューマンエラーは起こりうる訳で、人が介在せず、計算機が全てを行う方がミスは減らせるだろうとエンジニアながらに考えてしまうわけです。

 

ただ人と機械が協力しあって生きていくって小さい頃に見ていたアニメのようでとても良いと、高ぶる気持ちはあります。それがいつまでも続くことなのか、どこかでやはり機械だけになっていってしまうのか。どうなんでしょうか。

 

思ったままに書きましたが、結論から言いますとアニメ大好きです。

StepByStep和訳:1.Printing on Terminal

どうもShZgZです。

 

台風本当に凄いですね。皆さんも気を付けて下さい。

引き続きRust Programming Step-by-Step · GitBookの和訳らしきものを進めていきます。

今回はコンパイラのインストールとハロワとかの画面表示系です。

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Terminal上にプリント

始め方

 もっとも短いRustプログラムは

fn main(){}

 これはよく下のように書かれます。

fn main() {
}

見てわかるようにこれは何も行われません。ただ"main"という名前のついた空の関数を定義しただけです。関数によって何かを行う指示の集合に名前を与える。

 

 "fn"というのは"function"の略で、"main"とは関数の名前を表します。丸括弧("()"←これのこと)には関数の引数を含むことが、波括弧("{}"←これのこと)にはステートメントを含むことができます。上の例では、引数もステートメントもありません。

 

Rustで書かれたプログラムが実行されるときは"main"関数が実行されます。"main"関数が無い場合は完全なプログラムではありません。そのときはライブラリとなります。

 

 このプログラムを実行するためには以下の操作を完了して下さい。

・Rustコンパイラとユーティリティのインストールを行う。

 コンパイラhttps://www.rust-lang.org/ja-JP/よりダウンロードすることができます。Linux, Windows, Mac OS Xx86 (32-bit) or x86-64 (64-bit)で利用可能です。それぞれのプラットフォームで"stable", "beta", "nightly"という3つのバージョンが存在します。インストールするものは"stable"バージョンをお薦めします。"stable"バージョンは最も古いですが、最もテストされ、これから変更される可能性も低いものとなっています。これらのバージョンは全てコンソールのコマンドラインより利用されます。インストール後は、インストールされたバージョンを確認するために以下のコマンドを実行して下さい。

rustc -V

(因みに私の環境では"rustc 1.20.0"が表示されます。)

・Rust練習用のファイルを保存するためのフォルダを作成(もしくは指定)し、上部の最も短いRustプログラムの内容を持ったmain.rsファイルをお好みのテキストエディタで作成して下さい。

コマンドライン上でRust練習用フォルダに移動し、以下のコマンドを実行して下さい。

rustc main.rs

実行するとすぐにプロンプト(コマンドラインでinputバーの前にある文字のことで、Windowsなら">"、それ以外なら多分"$")が表示されます。この時、"main"という名前のついたファイルが作成されています。(Windowsでは"main.exe"になっています。)実際に、"rustc"コマンドは正しく指定されたファイルのコンパイルを行いました。つまり、ソースコードを読み、対応するマシンコードを生成し、そのマシンコードを同じフォルダに保存したわけです。

コマンドライン上で、Windowsならば以下を実行して下さい。

main

その他のOSでは以下を実行して下さい。

./main

これで作成されたプログラムを実行することが出来ました。しかし、今回は何も行わないプログラムなので、またすぐにプロンプトが表示されてしまうはずです。

 

Hello, World!

それではコマンドライン上にテキストを表示する方法を見ていきましょう。前節のプログラムを以下のように変更してみましょう。

fn main() {
    print!("Hello, world!");
}

前のようにコンパイルし、実行すると、以下のように表示されます。

Hello, world!

新しく追加された行が"トークン"として知られる8つの構文アイテムを持つことに注目して下さい。それらを調べていきましょう。

  • print: これはRustのスタンダードライブラリに定義されたマクロ名です。
  • !: これはその前にある名前がマクロであることを示しています。このシンボルが無いと、"print"は関数を表します。しかし、Rustのスタンダードライブラリにそのような関数は無いので、コンパイルエラーとなります。マクロは関数に似た物です。(それはRustの名前に関連付いたステートメントの集合を表す。この名前を利用することで、それらのステートメントを実行することができる。)
  • (: マクロの引数リストの開始
  • ": 文字列リテラルの開始
  • Hello, world!: 文字列リテラルの内容
  • ": I文字列リテラルの終了
  • ): マクロの引数リストの終了
  • ;: ステートメントの終了

文字列リテラルの意味を調べてみましょう。

"文字列"とは「スペースや句読点を含む長さの決まった文字列」

"リテラル"とは「ソースコードに直接指定される値」

つまり、"文字列リテラル"とは「ソースコードに直接指定される長さの決まった文字列」(上の例だと"Hello, world!"←これが文字列リテラル)

 

 "println"マクロは単に受け取った引数をコマンドライン上に表示します。

 

 Rustは大文字と小文字を区別します。(大文字と小文字を区別することを英語で"case sensitive"って言うらしい)

文字列リテラルやコメント部分(Rustでコメントアウトは"// ここ行末までコメント"か"/* 囲まれてる部分コメントで、コメントを改行したかったら行頭にアスタリスク */")以外の1文字の大文字小文字を入れ替えたりすると、コンパイルエラーになったり、挙動が変わってしまう。代わりに、文字列リテラル内で同様のことを行うとコンパイルは成功するが、挙動は変わってしまうかもしれない。

例えば、

fn Main() {
}

このプログラムをコンパイルしようとすると、プログラム中に"main"関数が定義されていないとしてコンパイルエラーとなる。("main"と"Main"を区別するし、前に説明したようにプログラムには"main"関数が必ず必要だから。)

今後、指定した場合を除き、例示するコードは"main"関数内に書かれていることを想定するため、"main"関数の定義ステートメントは省略します。

 

文字列の連結を表示

下のような方法で、1つの文字列リテラルを使用する代わりに、1つのステートメントで複数の文字列リテラルを表示できる。

print!("{}, {}!", "Hello", "world");

このステートメントを"main"関数の内部に書くと、再び以下の文字列が表示される。

Hello, world!

この場合、"println"マクロは","(カンマ)で区切られた3つの引数を受け取っている。引数は全て文字列リテラルで、最初の文字列は二つの波括弧のペア("{}")を含んでいる。それらはプレースホルダーで、他2つの文字列を挿入する場所を示している。

だから、このマクロは最初の引数の後に全ての引数を調べる。そして、最初の引数の中の波括弧のペアそれぞれを他の引数と置き換える。

これは以下のC言語ステートメントと似ている。

printf("%s, %s!", "Hello", "world");

But there is an important difference. If you try to compile

しかし、ここには重大な違いがある。もし、以下のコードをコンパイルしようとすると

print!("{}, !", "Hello", "world");

you get a compilation error, as the arguments of the macro after the first one are more numerous than the placeholders inside the first argument; that is, there is some argument that doesn't have any corresponding placeholder.

最初の引数を除いた残りの引数の数が、最初の引数内部にあるプレースホルダーの数より多い(上の例だと"{}, !"の中にはプレースホルダー1つなのに、"Hello"と"world"って2つあって1つ多いよねってこと)ためコンパイルエラーとなる。つまり、対応するプレースホルダーの存在しない引数がある。

そして、もし、以下のコードをコンパイルしようとすると

print!("{}, {}!", "Hello");

上の逆で、引数より多いプレースホルダーがあるとしてコンパイルエラーとなる。つまり、対応する引数の存在しないプレースホルダーがある。

一方でC言語の方ではコンパイルエラーは起こらないが、代わりに実行時にクラッシュするかおかしな挙動を引き起こす。

 

複数行を表示

今まではただ1行を表示するプログラムを書いてきたが、ここでは以下のようにして1つのステートメントで複数行を表示する。

print!("First line\nSecond line\nThird line");

これは以下のように表示される。

First line
Second line
Third line

The sequence of characters \n, where n stands for "new line", is transformed by the compiler into the character sequence that represents the line terminator for the currently used operating system.

この文字列"\n"はコンパイラによって、以下のように変換される。

"\n" → "そのOS上で使用される行末を表す文字列"

これが与えられたら、全てのプリントステートメントに関して、ステートメントの最後で一度改行することはとても普通のことであり、Rustのスタンダードライブラリにはそのようなマクロが用意されている。

println!("text of the line");

Calling this println macro (whose name is to be read "print line"), is equivalent to calling print with the same arguments, and then outputting a line terminator. That is, that statement is equivalent to:

"println"(これは"print line"と読まれる)マクロを呼ぶことは、いくつかの引数と共に"print"を呼び、行末を表す文字列を表示することと同義である。つまり、このステートメントは以下と同様

print!("text of the line\n");

 

整数を表示

もし、整数を表示したかったら

print!("My number: 140");

もしくは

print!("My number: {}", "140");

もしくは、第2引数のクォートを除いて

print!("My number: {}", 140);

これらのステートメントは以下のように表示される。

My number: 140

最後のステートメントにおいて、第2引数は文字列リテラルではなく、整数リテラルである。

整数は文字列以外のデータ型で、"print"マクロで第1引数に含まれる対応するプレースホルダーを置き換えることができる。

事実、コンパイラソースコードに含まれる文字列"140"を10進表記の数として解釈し、それはバイナリフォーマットにおいて数との等価性を生成し、実行プログラムに保存する。

実行時には、そのプログラムはバイナリフォーマットのその数を受け取り、文字列"140"に変換し、プレースホルダーを文字列と置き換え、表示用文字列を生成し、その文字列をコマンドラインへ送る。

この手続きは例えば、以下のようなプログラムだとどうなるかを説明している。

print!("My number: {}", 000140);

the compiler generates exactly the same executable program generated before. Actually, when the source string 000140 is converted to the binary format, the leading zeros are ignored.

コンパイラは前と同様の実行プログラムを生成する。実際に、ソース文字列"000140"はバイナリフォーマットに変換され、先頭の"0"は無視される。

引数の型が異なったとしても、このステートメント

print!("{}: {}", "My number", 140);

前と同様の行を表示するだろう。ここでは1つ目のプレースホルダーは文字列リテラルに対応し、2つ目は整数リテラルに対応する。

 

コマンドラインスクリプト

上で使ったrustcコマンドは大きい欠点を持っている。その欠点とは、コード中に見つかったエラーを全て見つかった順番で表示してしますことである。もし、あなたのコードが多くの構文エラーを含み、それらを最初から最後まで修正しなければならないような時があったとします。しかし、コンパイラがそれらのエラーを出力し終えると、プロンプトのすぐ上の部分には最後に見つかったエラーが表示されており、最初のエラーへ戻るためにはスクロールしていかなければならない。

一時的な解決法として、以下のコマンドを、Unix-like terminalもしくはLinux上で実行する。

clear; rustc $* --color=always 2>&1 | more

You can put it in a script file, named, say, rs, so that to compile a file named main.rs you can type:

あなたはこれを"rs"と名付けられたスクリプトファイルに書くことにより、"main.rs"と名付けられたファイルを以下のように実行できる。

rs main.rs

This script first clears the screen, then runs the rustc compiler with all the arguments you give to it. If the compilation is successful, or if it generates less than a screenful of error messages, it behaves like a normal run of rustc.

このスクリプトはスクリーンをクリアし、全ての引数とともにrustcコンパイラを実行する。もし、コンパイルが成功したり、エラーメッセージがスクリーンに全て表示される程度の量だった場合は通常のrustcように振舞う。

一方、エラーメッセージがスクリーンを覆ってしまった場合は表示が止まり、"--More--"というメッセージがターミナルスクリーンの下部に表示される。この時、いくつかのキーを押すことができる。

  • Enterキーは1行進む。
  • スペースキーは1スクリーン分進む。
  • Qキー("quit"を表す)は、途中でエラーメッセージの表示を止め、コマンドラインに戻る。

StepByStep和訳:0.Introduction

どうもShZgZです。

 

Rustの記事を書こう書こうと思ってたんですが、書けてませんでした。

勉強する方で頑張っちゃってどうもOutputが疎かになってしまうので、復習も兼ねてRust Programming Step-by-Step · GitBookの和訳らしきことをやっていこうかと思います。

 

Rustに関するドキュメントはどれもある程度のプログラミング知識を前提としているものが多いですが、このドキュメントはその名の通りStep By Stepで徐々に進んでいく印象があります。なので、ペースゆっくり目がいいという人向けかと思います。

 

ちょいちょい勝手に自分で文章とかコードとか追加しちゃうこともあるかもしれませんが、悪しからず。

 

では。導入から。

-----------------------------------------------------------------------------------------------

導入

 この本はRust初心者にRustの書き方を簡単なものから一歩ずつ解説していきます。

 

 読み進めていく上で、基本的なプログラミング知識を必要とします。(出来れば、CかC++)

 このテキストを理解するためにはプログラミング言語でよくあるintegerやfloatが何であるか知っていて、識別子と文字列リテラルを区別できれば十分です。

 

 ここではコマンドライン環境を想定しています。(LinuxUnixのshell, MacのTerminal, Windowsコマンドプロンプトです。)