IT技術に関する情報掲載サイト

プログラミングに関することを掲載します。

Rustのデータ型

 

まず、基本のデータ型と関数について勉強した。

データ型

Rustの特徴としては、変数に対するデータを型をきっちり決めないといけない静的型付き言語だからです。

どんな型があるかというと大きく分けて

スカラー

スカラー型は、単独の値を表します。Rustには、4つのスカラー型があります。整数、浮動小数点数、論理値、文字です。注意することとしては、文字で、なダブルクォーテーションマークを使用する文字列に対して、シングルクォートで指定されることに注意してください

fn main() {
 let c = 'z';
 let z = 'ℤ';
 let heart_eyed_cat = '😻'; //ハート目の猫
}

 複合型

複合型は、複数の値を一つの形にまとめることができます。種類は、2つあって、ダブル型と配列型があります。

ダブル型

複数の型の何らかの値を一つの複合型にまとめ上げる一般的な手段です。それぞれ型がちがう変数を格納できます。

fn main() {
let tup: (i32, f64, u8) = (500, 6.4, 1);
}

※型注釈は、指定しなくてもいいです。

取り出し方は、各変数ごとにわけて取り出す場合は、

fn main() {
let tup = (500, 6.4, 1);

let (x, y, z) = tup;

println!("The value of y is: {}", y);
}

 

となり、一つずつ指定する場合は、

fn main() {
let x: (i32, f64, u8) = (500, 6.4, 1);

let five_hundred = x.0;

let six_point_four = x.1;

let one = x.2;
}

 となります。

配列

複数の値のコレクションを得ることができます。タプルと違うところは、配列の全要素は、 同じ型でなければなりません。Rustの配列は、固定長なので、一度宣言してしまったら、サイズを変更することができません。ダブルとの使い分けは月などの追加したり削除したりすることがない場合に配列を使用するのがいいかもしれません。

要素の取り出し方としては、

fn main() {
 let a = [1, 2, 3, 4, 5];

 let first = a[0];
 let second = a[1];
}

 となります。ただし、PHPとは違くて、キーに変数を置くことはできないようです。

だめな例:

fn main() {
let a = [1, 2, 3, 4, 5];
let index = 10;

let element = a[index];

println!("The value of element is: {}", element); // 要素の値は{}です
}

 ちょっと不便ですが、添え字が配列長よりも大きいので、エラーとなるよう

 

Rustの変数と可変性について

Rustの特徴として、変数は、標準で不変になっており、以下のようコードの場合は、エラーとなります。

 

fn main() {
 let x = 5;
 println!("The value of x is: {}", x); // xの値は{}です
 x = 6;
 println!("The value of x is: {}", x);
}

変数が不変であるということは、値が名前に束縛され、その値を変えることができません。

ただ、だからといって絶対不変でなければいけないというわけでもなく、mutってというものを使うと、可変にできます。

let mut x = 5;

 

でも、変数と定数の違いはなんだろうとプログラミングをやっている人だったら、疑問に思うかもしれません。一番の違いは、定数は、プログラムが走る期間、定義されたスコープ内でずっと有効です。従いまして、プログラミングでいろいろと使用される可能性がある値は、変数より、定数に定義したほうが、あとあと、メンテンスする際に楽になるかと思います。

 

もう一つ、Rustの変数の扱いで面白い機能が「シャドーイング」という機能があります。これは、簡単にいうと前に定義した変数と同じ名前の変数を新しく宣言でき、新しい変数は、前の変数を覆い隠すことができます。例えば、こんなコードになります。

 

fn main() {
 let x = 5;

 let x = x + 1;

 let x = x * 2;

 println!("The value of x is: {}", x);
}

このコードをみるとわかりますように変数の前に、letをつけてあげれば、覆い隠すことができます。mutと同じ機能のように感じてしまうかもしれませんが、違いは、まず、一時的に変数を可変にしたいときは、letを使うといいです。もう一つの違いは、再度letキーワードを使用したら、実効的には新しい変数を生成していることになるので、 値の型を変えつつ、同じ変数名を使いまわせることです。mutを使うとデータ型がstrかnumかなど気にする必要があるケースがあります。

 

 変数と可変性については、Rustの基本のところなので、しっかり理解するといいかもしれません。

 

doc.rust-jp.rs

 

Rustのプロジェクト管理ツール Cargo

はじめに

Rustには、プロジェクト管理ツールとして、Cargoが最初から備わってます。Cargoは、Rustのビルドシステムの機能もあります。

つかい方としては、まず、Cargoがインストールされているか確認するのは、以下です。

$cargo -version

で、Cargoのバージョンが表示されます。なにも表示されなかったり、エラーが出たら、Cargoがなにかしらの理由でインストールされていないようです。

 

Cargoでプロジェクトの作成

まず、プロジェクトをつくってみましょう。プロジェクトをつくるフォルダに移動して、

$ cargo new hello_cargo

と実行するおプロジェクトフォルダができるので
$ cd hello_cargo

に移動しましょう

Cargoプロジェクトをビルドし、実行する

まずは、ビルドをしてみます。

$ cargo build
Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs

実行するのは、簡単で、

$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
Running `target/debug/hello_cargo`
Hello, world!

とすればできます。

もし、ビルドはせず、チェックだけ実行させたいのでしたら、

$ cargo check
Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs

このcargo checkは、長いプログラミングをする際に途中で問題なくビルドできるか確認するためにも使っているようです。

また、本番用にファイルをつくるのには、

$ cargo build --release

と実行するとtarget/buildに実行可能ファイルが作成されます。

 

Cargoに関する詳細は、

doc.rust-lang.org

にのってます。

 

 

Rustをはじめてみました

AWSがRustを使える人を採用し始めましたというニュースをみて、とりあえず、Rustをはじめてみました。

Rustは、日本語の公式サイトがあり、とりあえずは、そこをみてみることにしてみた。

<Rust公式サイト>

www.rust-lang.org

色々便利だということを書いているけど、プログラマだったら、まずは、インストールをしてみることにした。

インストールの仕方は、

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

で完了。インストール中に、質問を聞かれるけど、デフォルトにすればOKです。

 

次に、公式ドキュメントがあるようなので、そこで、やり方は学ぼうかとみてみると、ここは英語だった。

doc.rust-lang.org

 

 日本語版も見つけました

doc.rust-jp.rs

でもとりあえず、言語を最初に学ぶときに必ず、やる”Hello,world”をやってみた。

 

ファイルをつくる

1は、ファイル名をmain.rsとして、

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

と記述

コンパイル

以下のコマンドを実行して、コンパイル

$ rustc main.rs

 実行

あとは、同じところにmainというファイルができているので、それを実行するだけ。

$ ./main
Hello, world!

 Hello,world!って出力されたら、完了です。

 

とってもかんたんです。

メール送受信する際に、認証エラーになる

あるタイミングで、メール送受信ができなくなって調べてみた。

postfixやCourier POP3の再起動をしてみたが、なかなかうまくいかない。

 

maillogログをみてみると

courier-pop3d: authdaemon: s_connect() failed: Connection refused
courier-pop3d: [Hint: perhaps authdaemond is not running?]

とでている

調べてみると、authdaemondが動いていないからみたいだ。

どうやって、authdaemondを起動させればいいのか、わからないので、しらべたところ、/etc/init.d/courier-authdaemonを再起動させたら、うまくいった

 

どうもサーバに負荷があったときがあり、その時に、異常終了したかもしれません。

 

シェルの正規表現を使って複数行を削除する方法

シェルのsed関数を使って、複数行を削除する方法は、以下です。

 

sed -r "/削除したい行のはじめ/,/削除したい行の最後/d"

 

例えば、

 

はじめまして

こんにちはよろしくお願いいたします

今日もいい天気ですね

 

という文章があって、こんにちはからいたしますまでを削除したい場合は、

sed -r "/こんにちは/,/いたします/d"

となります。

-r は拡張正規表現をつかうということになります。

 

最近ネットが遅くなったなと感じたときの対処方法

 

fn main() { let x = 5; let x = x + 1; let x = x * 2; println!("The value of x is: {}", x);}

https://www.it-educationblog.com/entry/2020/12/30/132031

 

最近、PCなどのWifiからホームページをみるのが遅くなったと感じることはありませんか。

 

その場合の対処方法としては、まずは、ネット回線が混雑しているのを疑う。ただ、一日中、ネット回線が遅いと感じるようだったら、一度、ルータのネームサーバの設定をみてみるといい。デフォルトは、プロバイダ提供の取得する自動設定になっていることがおおいと思うけど、それをGoogleなどが提供しているパブリックDNSにかえてみてください。

 

結構これで早くなることは多いです。

ちなみにGoogleのPublicDNSは、

プライマリーネームサーバ 8.8.8.8

セカンダリーネームサーバ 8.8.4.4

です。

 

あとは、LANケーブルを変えるのもいい場合が、あります。家で使っている場合は、LANケーブルが劣化することはすくなくて、ついつい昔のものを使い回してしまう場合があります。せっかく光に変えたのに、ネットのスピードが変わらない場合、使っているLANケーブルが光に対応しているか見る必要があります。

 

LANケーブル
種類
CAT5
カテゴリー5
CAT5e
カテゴリー5e
CAT6
カテゴリー6
CAT6A/6e
カテゴリー6A/6e
CAT7
カテゴリー7
CAT7A
カテゴリー7A
CAT8
カテゴリー8
最大通信速度 100Mbps 1Gbps 1Gbps 10Gbps 10Gbps 10Gbps 40Gbps
適合する
イーサネット
10BASAE-T
100BASE-TX
10BASE-T
100BASE-TX
1000BASE-T
10BASE-T
100BASE-TX
1000BASE-T
1000BASE-TX
10BASE-T
100BASE-TX
1000BASE-T
1000BASE-TX
10GBASE-T
10BASE-T
100BASE-TX
1000BASE-T
1000BASE-TX
10GBASE-T
10BASE-T
100BASE-TX
1000BASE-T
1000BASE-TX
10GBASE-T
100BASE-TX
1000BASE-T
1000BASE-TX
10GBASE-T
40GBASE-T
伝送帯域 100MHz 100MHz 250MHz 500MHz 600MHz 1000MHz 2000MHz
ギガタイプの
光回線利用
通信速度低下 適合 適合 適合

適合

適合 適合

 

カテゴリが5とか5eをつかっていた場合、すぐにLANケーブルを変えてもらうと結構劇的に早くなる場合がありますので、お試しください。