Hatena::ブログ(Diary)

Eukleides project

データ構造とアルゴリズム学習帳
きっかけは某助教授の一言
「これ(岩波ソフトウエア科学3)、Cで全部書いたら熱いよね」
あつすぎ(゜∀゜)ッ!!

July 26(Wed), 2017 Rustを勉強中4

実践的なアプリケーションを書いてみよう! Rustの構造化プログラミング【第二言語としてのRust】

写経物

    • cargo

  いわゆるビルドツール

  rustcがgccなら、cargoはmake

  パッケージ管理も行うのでAnt,Maven,Gradle,cocoa podといった類?

$ cargo new PROJECTNAME --bin

$ cd PROJECTNAME

    • rsgrep

  Unixコマンドのgrepを書いてみようとのこと。以下にざっと実装方針をまとめる

解説

      • ライブラリ機能を盛り込むには以下のように書けば良い

use クレート名::型、トレイト;

use クレート名::

e.g. use regex::Regex;

extern crate クレート名;

e.g. extern crate regex;

[dependencies]

regex = "0.2.1"

let pattern = match env::args().nth(1)

let filename = match env::args().nth(2)

      • 基本はmatch式とSome,None,Ok,Errで判定し、処理をするブロックが立て続け

let reg = match Regex::new(&pattern)

let file =match File::open(&filename)

let line = match line

      • BufReader::new(file)でファイル入力

参照型ではなく実体を入れる

      • for line in input.lines()でファイル内容を1行ごとに読み込む
      • reg.is_match(&line)でパターンマッチング

と言ったような流れ。だいぶリーダブルなコードである。

July 21(Fri), 2017 Rustを勉強中3

プログラムをよりオブジェクト指向チックに扱うために以下の構造を示す機能を勉強した。

実践的なアプリケーションを書いてみよう! Rustの構造化プログラミング【第二言語としてのRust】

写経物

関数において、型による再定義をしなくて良くなる。

golangにはない機能で、関数抽象化機能としてはすごい使いやすい。


    • 構造体

構造体単体で利用するというよりも、トレイトと一緒に利用すると強力なポリモーフィズムを実現できる。

    • 列挙型

match式と一緒に利用すると、直感的な書き方で処理を記述できる。

    • トレイト

ポリモーフィズムを実現する手段の1つ

Rust自体は継承といった機能は、トレイトと呼ばれる多重継承を許可してコンストラクタを持たない抽象クラス

のようなものを使う

javascalaに見られる抽象クラスとトレイトの違いは以下の述べられている。

https://gist.github.com/gakuzzzz/10081860:title = trait と abstract class の使い分け]

あるトレイトを実装した型を、ジェネリクスで受け取る

duck_goはDuckLikeを実装した、Duckは受け取れるが、例えばコメントアウトしているfloatなどはDuckLikeを実装していないためコンパイルエラーになる。

July 20(Thu), 2017 Rustを勉強中2

前回の続き

    • 所有権と参照とライフタイム
      • 所有権

Rustでは値を使うとなくなるが、実際はソースの所有権が、別の所有者に移る。

右式の変数が以降で使えなくなる。

左式の変数がソース"this is a resource"の所有権をもつ

fn main() {

let s = "this is a resource".to_string();

// 以下の行で、`s`が束縛されている文字列の所有権が`t`に移る。以後`s`は使えない。

let t = s;

// 以下の行で、文字列の所有権が`t`から`print_string`に移る。以後`t`は使えない。

print_string(t);

// もう一度`t`を使おうとしてもエラー。

// print_string(t); // error[E0382]: use of moved value: `t`

// 同じくsを使おうとしてもエラー。

// print_string(s); // error[E0382]: use of moved value: `s`

}

      • 借用

一度使ってしまうと値がなくなっては不便なので、所有権を自分に残したまま、値を他人に貸す。

借用には参照型を使う

参照には、ミュータブルなものとイミュータブルなものがある

イミュータブルな参照

fn ref_string(s: &String) {

println!("{}", s);

}

fn main() {

let s = "this is a resource".to_string();

// 参照1つめ。

let t = &s;

// 参照2つめ。同時に2つ存在できる。

ref_string(&s);

}

ミュータブルな参照

fn refmut_string(s: &mut String) {

// ここでsに対して変更を加えるなどの操作も可能。

println!("{}", s);

}

fn main() {

let mut s = "this is a resource".to_string();

// ミュータブルな参照1つめ。

let t = &mut s;

// ミュータブルな参照2つめはエラー。

// refmut_string(&s); // error[E0499]: cannot borrow `s` as mutable more than once at a time

}

ミュータブルな参照は、2回以上使えない。

ミュータブルな参照とイミュータブルな参照は共存もできない

      • ライフタイム

参照先が存在しないと貸し出せない

ライフタイムとは、{ }で囲んだブロックや、関数のスコープで安全でない参照を作れなくする仕組み

fn main() {

// 本来は`s`のライフタイムはこの関数の最後まで。

let s = "owned data".to_string();

// `{ }`で囲んだブロックはライフタイムを区切る。

{

// `s`はここでムーブしてしまうのでここでライフタイムが終わる。

// `t`のライフタイムはこのブロックの終わりまで。

let t = s;

}

// ここでは`t`にも`s`にもアクセスできない。

// ライフタイムと参照の関係

{

let s = "owned data".to_string();

// ここで`s`への参照`ref_s`を作る。`ref_s`はこのブロックの最後で死ぬが、`s`のほうが長生きしないといけない。

let ref_s = &s;

// `s`を`t`へムーブして`ref_s`より先にライフタイムを終わらせようとするとエラーになる。

// let t = s; // cannot move out of `s` because it is borrowed

}

続く

July 10(Mon), 2017 Rustを勉強中

いい資料が見つかったので、Rustを勉強中。

Rublidfmでかつて元カヤックのtypester氏が紹介していて興味があった。

179:Rustacean

brew install rust

    • rustcが使用可能になる

fn 関数名(引数) -> 返り値の型 {

関数本体

}

fn 関数名(引数) -> 返り値の型 {

関数本体

}

fn 関数名 (変数名: 型名, …)

    • forループ

for (変数; 終了条件; ステップ) {…}

    • if文ではなく、if式
  • 変数束縛
    • let 変数名 = 値;でイミュータブルな変数束縛=再代入不可
    • 型は推論で自動判別
    • let mut 変数名 = 値;でミュータブル=再代入可能,
    • 型注釈 let 変数名: 型名 = 値 で型を明示することも可能
    • 再代入はできないが、再束縛は可能

fn main() {

// 1つ目の`x`を束縛する。

let x: i32 = 1;

println!("{}", x); // => 1

// 2つ目の`x`を束縛する。これは先のxとは別物。

let x: &str = "abc";

// 以後、`x`は`"abc"`を指すようになる。

println!("{}", x); // => abc

}

  • 参照型
    • ポインタ型に似た概念
    • T型の値のありか
    • &値 ... 参照型を作成
    • &mut 値 ... 参照先を書き換えられる参照型の値を作成
    • *値 ... 参照を外し、参照先の値を取得する

残りはTBD

July 06(Thu), 2017 10年ぶりの更新?

ご機嫌いかがですか?

10年間色々ありましたが、生きてました。

C言語の勉強にハマり、Cで音声ストリーミングアプリをひたすら書くだけの研究を大学で3年間やり

震災があり、電機メーカーに就職して、プラスチックを削ったり、結局そこでもVBAマクロをたくさん書いたり、

その間趣味でAndroidアプリを書いたり、Rubyを勉強してRailsやスクリプトを書いて不労所得をちょっとだけ得たり

受託開発を受けたり、決済アプリを開発してベンチャーに売りに行ったり、(CTO的な人は楽しそうに聞いてくれたけど)

色々やってきたせいで「そろそろプロのプログラマとして活躍したら?」と人類には早すぎたファジー検索エンジン

(今でいうナレッジベース?)の開発者からお声がけをいただいて、今に至ると言ったところです。

ドラマ化お待ちしてます()

現在何をやっているかは詳しくは言えませんが、プログラムを書いてます。

CIツールを自作したり、UIを作ったり、JSいじったり、リファクタしたり…。みんなそんなもんでしょう。

個人プロジェクトとしては以下


  • hls_external_streaming

lfswiftと呼ばれる映像配信ツールをハックして、カメラ映像をiOSから外部サーバにTSファイルにして送信するSwiftフレームワークを作成中


twitterのスパムアプリを踏んだ人に、アプリ連携の解除方法を教えるスクリプト


  • OSS Contribute

javascriptやgolangで実施中。勉強のためにjavascriptグラフツールnvd3をwatch中

とまぁ、10年経っても色々やってます。

地道に地味に徹底的にやりたいものです。

読みたい本もたくさんあって詰んでますが、ちょこちょここちらも更新していこうかと思います。