「 1月31日に ひばりが丘駅南口のコンビニが潰れるから コピー機使えなくなるわよ!」
「 これは WCSC28版じゃないか☆ 去年のはお蔵入りか☆?」
「 WCSC28版は どうぶつしょうぎ、 WCSC29版は 大橋流バージョンか……☆ はあ~☆
最近の流行りに書き直そうぜ☆? チェス風にするのが ふつうなんだろ☆?」
「 はあ~☆
Rust の 2018エディション以前に書いたから、新しい Rust ではコンパイルが通らないぜ☆」
cargo check 2> ./error.log
「 ↑ とりあえず、エラー出力を ファイルにリダイレクトしよう……☆」
/// こういうコメント
「 ↑ なんか ドキュメント・コメントは 書ける位置が決まってるみたいだな……☆」
//! こういうコメント
「 ↑ ファイルの先頭のコメントにも 書き方があるのかだぜ☆?」
error[E0433]: failed to resolve: use of undeclared type or module `teigi`
--> src\consoles\asserts.rs:4:5
|
4 | use teigi::shogi_syugo::*;
| ^^^^^ use of undeclared type or module `teigi`
「 ↑ モジュール・システムも だいぶ変わってしまったのか☆?」
main.rs:
Before:
mod teigi;
After:
pub mod teigi;
use super::a::*;
use self::b::*;
「 ↑ 絶対パスでエラーがでるから、相対パスにしてみるか……☆」
use super::super::a::*;
use super::super::super::b::*;
「 ↑ super
が どこ指してるか分からん……☆ ../
とかにしてくれればいいのに……☆」
muzudho/rust-kifuwarabe-wcsc30
「 ↑ モジュール・システムを書き直して ギットハブにあげるぜ☆」
rustup update
error: could not remove 'rustup-bin' file: 'C:\Users\むずでょ\.cargo\bin\rustup.exe'
error: caused by: アクセスが拒否されました。 (os error 5)
error: backtrace:
error: stack backtrace:
0PS C:\Users\むずでょ\source\repos\rust-kifuwarabe-wcsc30> : <unknown>
1: <unknown>
2: <unknown>
3: <unknown>
4: <unknown>
5: <unknown>
6: <unknown>
7: <unknown>
8: <unknown>
9: BaseThreadInitThunk
10: RtlUserThreadStart
```
![KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif](https://crieit.now.sh/upload_images/3da2d4690cf2c3f101c5cbc0e48729f55e32c8a5d4ee9.gif)
「 なぜなのか……☆?」
`[Windows] + [R], cmd`
rustup component add rls rust-analysis rust-src
info: component 'rls' for target 'x86_64-pc-windows-msvc' is up to date
info: component 'rust-analysis' for target 'x86_64-pc-windows-msvc' is up to date
info: component 'rust-src' is up to date
rustup install nightly-2018-12-06
# 2020-02-01(Sat) 12:00 -
![20200201wcsc1a1.png](https://crieit.now.sh/upload_images/4cbcd56b787524a7d0644ac73ed1d7eb5e34f66c3203a.png)
![KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif](https://crieit.now.sh/upload_images/3da2d4690cf2c3f101c5cbc0e48729f55e32c8a5d4ee9.gif)
「 駒の名称を チェスに合わせよう☆ 世界を視野に入れると それが普通だからな☆」
Bad: PB
Good: PromotedBishop
![KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif](https://crieit.now.sh/upload_images/3da2d4690cf2c3f101c5cbc0e48729f55e32c8a5d4ee9.gif)
「 ↑ 2010年の後半あたりからだろうか、2020年現在は 頭文字を使った略称ではなく、名称にするのが 流行りだぜ☆」
![OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif](https://crieit.now.sh/upload_images/058791c2dd4c1604ce1bd9ec26d490ae5e32c8d0e40ed.gif)
「 英語で発声できる名前の方が 今の映像配信時代には 口頭で コミュニケーションしやすいのよね」
![KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif](https://crieit.now.sh/upload_images/3da2d4690cf2c3f101c5cbc0e48729f55e32c8a5d4ee9.gif)
「 可視性より 伝達性の方が重要なんだろうな☆ また10年後には どうなるか知らんが☆」
![20200201wcsc2.png](https://crieit.now.sh/upload_images/2a9cf69016b04dff31c1a108f8cc44955e34fc035cb0a.png)
![KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif](https://crieit.now.sh/upload_images/3da2d4690cf2c3f101c5cbc0e48729f55e32c8a5d4ee9.gif)
「 駒を裏返すと 何の駒になる、というのは switch 構文や、 match 構文を使うのが高速だが、しかし待ってほしい☆
リンク・リスト形式も ワンチャンあるのではないか☆?」
![KIFUWARABE_80x100x8_01_Futu.gif](https://crieit.now.sh/upload_images/5ac9fa3b390b658160717a7c1ef5008a5e32c8bf0a395.gif)
「 駒の種類を オブジェクト型定数 にするのかだぜ☆? それも どうだか☆」
```rust
use super::piece::Piece;
pub struct PieceStruct {
piece: Piece,
/// 駒→成駒 (成れない駒は、そのまま)
promoted: Piece,
}
impl PieceStruct {
pub fn from_piece(p: &Piece) -> Self {
use super::piece::Piece::*;
match *p {
King1 => PieceStruct {
piece: King1,
promoted: King1,
},
Rook1 => PieceStruct {
piece: Rook1,
promoted: PromotedRook1,
},
Bishop1 => PieceStruct {
piece: Bishop1,
promoted: PromotedBishop1,
},
Gold1 => PieceStruct {
piece: Gold1,
promoted: Gold1,
},
Silver1 => PieceStruct {
piece: Silver1,
promoted: PromotedSilver1,
},
Knight1 => PieceStruct {
piece: Knight1,
promoted: PromotedKnight1,
},
Lance1 => PieceStruct {
piece: Lance1,
promoted: PromotedLance1,
},
Pawn1 => PieceStruct {
piece: Pawn1,
promoted: PromotedPawn1,
},
PromotedRook1 => PieceStruct {
piece: PromotedRook1,
promoted: PromotedRook1,
},
PromotedBishop1 => PieceStruct {
piece: PromotedBishop1,
promoted: PromotedBishop1,
},
PromotedSilver1 => PieceStruct {
piece: PromotedSilver1,
promoted: PromotedSilver1,
},
PromotedKnight1 => PieceStruct {
piece: PromotedKnight1,
promoted: PromotedKnight1,
},
PromotedLance1 => PieceStruct {
piece: PromotedLance1,
promoted: PromotedLance1,
},
PromotedPawn1 => PieceStruct {
piece: PromotedPawn1,
promoted: PromotedPawn1,
},
King2 => PieceStruct {
piece: King2,
promoted: King2,
},
Rook2 => PieceStruct {
piece: Rook2,
promoted: PromotedRook2,
},
Bishop2 => PieceStruct {
piece: Bishop2,
promoted: PromotedBishop2,
},
Gold2 => PieceStruct {
piece: Gold2,
promoted: Gold2,
},
Silver2 => PieceStruct {
piece: Silver2,
promoted: PromotedSilver2,
},
Knight2 => PieceStruct {
piece: Knight2,
promoted: PromotedKnight2,
},
Lance2 => PieceStruct {
piece: Lance2,
promoted: PromotedLance2,
},
Pawn2 => PieceStruct {
piece: Pawn2,
promoted: PromotedPawn2,
},
PromotedRook2 => PieceStruct {
piece: PromotedRook2,
promoted: PromotedRook2,
},
PromotedBishop2 => PieceStruct {
piece: PromotedBishop2,
promoted: PromotedBishop2,
},
PromotedSilver2 => PieceStruct {
piece: PromotedSilver2,
promoted: PromotedSilver2,
},
PromotedKnight2 => PieceStruct {
piece: PromotedKnight2,
promoted: PromotedKnight2,
},
PromotedLance2 => PieceStruct {
piece: PromotedLance2,
promoted: PromotedLance2,
},
PromotedPawn2 => PieceStruct {
piece: PromotedPawn2,
promoted: PromotedPawn2,
},
Kara => PieceStruct {
piece: Kara,
promoted: Kara,
},
Owari => PieceStruct {
piece: Owari,
promoted: Owari,
},
}
}
pub fn piece(self) -> Piece {
self.piece
}
pub fn promote(self) -> Piece {
self.promoted
}
}
「 人間がボトルネックなのだから、コーディングは 人が目視確認できることが重要なのよ。
コンピューターが最高の成功を発揮できないことより、人類のポカが足を引っ張ることの方がデカいのだから、
人力で管理しやすいように作りなさい」
「 升も 番号で持ってるんだが、この番号はよく変換処理入るんで、オブジェクトにしてメソッドを持たせられないか……☆」
「 わたしは しつこい☆ バグが出ない版まで遡り、ソースコードと睨めっこだぜ☆
ここの 順番を入れ替えたところが BAD だったぜ☆」
「 そろそろ お父んは 頂点になった頃だろうか……☆(^~^)?」
「 グローバル変数に universe
と名前を付けているが、その下に game
を作りたいぜ☆
対局という意味だぜ☆」
「 次の話題☆ Rust のメモリの思想からすると、
アプリケーション起動時に 駒を全種類作っておいて、
盤の上には その駒の名前のようなもの、C言語で言うならポインターを置いておくのが いいのだろうか☆?」
「 何を言っているか分からないが、最適化の話しなら 後にしろだぜ☆」
「 それは やりたいところだな……☆ PieceHash
とかいう列挙型を作るといいのかもしれないが……☆」
「 アプリケーション起動時に作った駒の 実体 を application
変数に入れておいて、それとは別に 盤面の上に 実体を指す名前 を置いておけば いい気もするが……☆」
「 じゃあ position
(局面)は駒を持ってない ただの目録かだぜ☆」
&universe
.get_application_part()
.get_piece_struct_master()
.get_piece_struct(
universe
.get_search_part()
.get_current_position()
.get_piece_by_square(&square),
)
.phase(),
「 階層が深いのは クソコード だよな☆
駒の実体は search_part
に持たせた方がいいのか……☆?」
universe
.get_search_part()
.get_piece_struct_by_square(&square)
.phase();
「 ↑ ひとまず、 search_part
から見て 見た目上 1階層で呼び出しているように見えるようにしておくぜ☆」
for pc in KM_ARRAY.iter() {
g_writeln(&format!("利き数:{}", pc));
let s = universe.kaku_number_board(&Phase::Owari, *pc); // Error
g_writeln(&s);
}
「 ↑ イテレーターで取ってこれるの参照だから、*
を付けて実体にするが、これを関数の引数に渡すと ボローと取られるのかだぜ☆
.clone()
で逃げれるかな……☆?」
「 ↑ 繰り返し作業のとき こういうタイピングミスをしやすいぜ☆」
「 お父んの Rust-RLS、 オート・コレクトなんで働かないんだろうな☆?」
「 微分の連鎖律とか、さっぱり見当たらん☆
シグモイド関数と その導関数が見つかるだけだぜ☆」
https://github.com/yaneurao/YaneuraOu/blob/master/source/learn/learner.cpp:
// 995行目
// 普通のシグモイド関数
double sigmoid(double x)
{
return 1.0 / (1.0 + std::exp(-x));
}
// 1009行目
// 普通のシグモイド関数の導関数。
double dsigmoid(double x)
{
// シグモイド関数
// f(x) = 1/(1+exp(-x))
// に対して1階微分は、
// f'(x) = df/dx = f(x)・{ 1 - f(x) }
// となる。
return sigmoid(x) * (1.0 - sigmoid(x));
}
「 この式は 何年か前に見たやつじゃない。象さんなんでしょ」
「 ↑ 数学には いろいろな話しと出会うと思うが、 飯を食べれば うんこをするように、
疑問を抱かずに受け入れて欲しいのが 空っぽのことをゼロ、満タンのことをイチ と呼ぶことだぜ☆」
「 空っぽ だの、 満タン だの、中途半端 だの そんなに最初に もったいぶって 説明するほどのことかだぜ☆?」
「 0.9 というのは 0と1 があって、そこから遠回りして やっと出てくる数だし、
2 というのは 1 と 1 があるから出てくる数だし、 ゼロ と イチ は 種とか 卵とか そういう全ての原因だぜ☆」
「 じゃあ ゼロ と イチ だけ極めれば どんな数も作れるんじゃないの?」
「 まだ 飯を食べて うんこをするところしか 始まってないのでは☆?」
「 それは 中途半端を許せば そうなるな☆ そうではなく、中途半端を許さない場合は
『空か または 何かがある』、
また そうでない場合は
『足りないか または 足りた』
の ケースだぜ☆」
「 わたしは このポンプを見ているだけで 面白くて 満足感がある……☆」
「 中途半端なものを数えないのなら、 0 と 1 だけあれば いいんじゃないの?」
「 これは 数学の特徴というより、人類の特徴なのかも知れない☆
切り捨ての不思議 だぜ☆ 例えば……☆」
「 ↑ これぐらい いっぱい入った ドリンクが 4本あったとしよう☆」
「 ↑ 満タンではなかったのだから、内容量 ゼロ のドリンク4本 飲んだのと同じだよな☆」
「 ↑ 総量で数えていいのなら 3本と さらに1本弱 飲んだと言っていいはずだぜ☆
しかし その或る世界 は総量では できてないんだぜ☆」
「 このとき、1とは 何なのか、に 説明というか、言葉を与えるとするなら
スレッシュホールド(Threshold; 閾値)だぜ☆」
「 スレッシュホールドは 2 とか、 1000兆 とかじゃダメなの?」
「 ↑ 閾値を1000兆にするより、 コイン1枚の額面を 1000兆分の1 にしろだぜ☆
大丈夫、イチゴ味の世界のコイン1枚と スイカ味の世界のコイン1枚は 比較しないんで、桁が違ってても気にするなだぜ☆」
「 上の図は シグモイド関数を使っていない例だぜ☆
じゃあ、シグモイド関数が何をしているものなのかは、もう説明できるぜ☆」
「 ↑ 傾きの違い を調べたいときには、こんな線形のグラフは 役に立たん☆」
「 ↑ シグモイド関数に通して見た数は 真ん中の近くのときの傾きは敏感で、端っこの時は 鈍感だぜ☆」
「 言ってしまえば 限りなく大きなこと、限りなく小さなこと について 鈍感 にしてるんだぜ☆
逆に ある範囲内でだけ 敏感 にしてるんだぜ☆」
「 多変数と言っても 絵に描けるのは3次元までなんで、
ここでは 2変数としよう☆」
「 ↑ 2変数 だと 平面で描けるな☆ 絵がヘタクソで上手く見せれていないが……☆」
「 2変数関数 と、 2つの2変数関数 の違いは よくイメージしてくれだぜ☆」
「 2つの2変数関数の合成関数 も イメージ できるだろ☆」
「 2つの2変数関数の合成関数の微分 が どこを微分してるのかは よくわからないよな☆」
「 あらゆる方向って、どうやって計算するんだぜ☆(^~^)!」
「 多変数関数の合成関数の微分 には 連鎖律 があるそうよ」
「 お父んの考え方では 連鎖できないのではないか☆? なんで 合流 してるんだぜ☆?」
「 他の人の連鎖律を見てみると、タンデムになってない? あんたのは 合流してんのよ」
「 分からんところは 後回しだぜ☆ シグモイド関数を説明しよう☆」
「 ↑ eはネイピア数で 2.718281828… みたいな3より小さい数で、マイナスの指数は
ガンガン割って小さくしていく ぐらいの意味なんで、xが大きくなると、分数は小さくなるんで、数としては 大きくなっていて、
永遠に1にはならないが、限りなく1に近づくぜ☆(^~^)」
「 他の人の 多変数関数の合成関数の微分 を見ると なんか わたしのやり方と違うな……☆」
「 2つの2変数関数の合成関数 は合ってると思うんだが、微分の仕方が違う……☆」
「 しかし ∂w がy軸を動いているのは 変な気がする……☆」
「 じゃあ xの他の軸を固定したら 合成関数から見れば 遡って ∂u も動いてはいけないぜ☆(^~^) 固定だぜ☆(^~^)」
「 どのx軸だけ動けんの? ∂z だけ動けんの? それ以外の軸は 過去にさかのぼって固定されんの?」
「 お父んの図は 独立変数 と 従属変数 がはっきりしてないらしいぜ☆」
「 この図では x も u も z も x軸みたいに見えるが、 x軸と u軸と z軸は まったく別物だぜ☆ 同じものだと思うなだぜ☆」
「 ↑ ∂(デル)は xと zと t に付くが、定数u、v、y、wは 式に出てこないんじゃないか☆?」
y = f(x)
「 ↑ 答え合わせをする必要があるので、他人が残したメモをパクるぜ☆
関数f は xの1変数しかないが、まあ いいだろう……☆」
y = (3x^2 +4x +3)^4
「 ↑ 関数f の定義は上の通りとする☆
これを いったん、2ステップに分けるみたいだぜ☆」
y = u^4
u = 3x^2 +4x +3
「 合成関数 の話しをしたいんだから、関数は合成して作るんだぜ☆
合成の話しをするために、今、もともと1つだったものを、わざと 2つに分けたんだぜ☆」
dy/du = 4*u^3
du/dx = 2*3x^1 +1*4 + 0*3(x^-1)
= 6x + 4
「 ここで、 dy/du
と du/dx
を掛け合わせると、 y になるらしいぜ☆」
「 微分したものと、微分したものの掛け算って どうやんの?」
「 微分したことを忘れて 目の前にある2つの式を掛け算しろだぜ☆」
y = dy/du * du/dx
= (4*u^3) * (6x + 4)
y = (4*u^3 * 6x) + (4*u^3 * 4)
y = (4u^3 * 6x) + (16u^3)
「 u に 3x^2 +4x +3
を代入して u を消すんじゃないの?」
y = ((4 (3x^2 +4x +3)) ^3 * 6x) + ((16 (3x^2 +4x +3)) ^3)
y = ((12x^2 +16x +12)^3 * 6x) + (48x^2 +64x +48)^3
y = dy/du * du/dx
= (4*u^3) * (6x + 4)
「 分配するのと、uに代入するの、どっちが先がいいんだぜ☆?」
u = 3x^2 +4x +3
dy/du = 4*u^3
du/dx = 6x + 4
y = dy/du * du/dx
= (4*u^3) * (6x + 4)
= (4*(3x^2 +4x +3)^3) * (6x + 4)
= (4*(3x^(2+3) +4x^3 +3^3)) * (6x + 4)
= (4*(3x^(5) +4x^3 +9)) * (6x + 4)
= (12^5 +16x^3 +36) * (6x + 4)
= ((12^5 +16x^3 +36) * 6x) + ((12^5 +16x^3 +36) * 4)
= (12^5 * 6x +16x^3 * 6x +36 * 6x) + (12^5 * 4 +16x^3 * 4 +36 * 4)
= ((12*6x)^5 +(16x * 6x)^3 +216x) + (48^5 +64x^3 +144)
= ((72x)^5 +(96x)^3 +216x) + (48^5 +64x^3 +144)
= (72x^5 + 96x^3 + 216x) + (48^5 + 64x^3 +144)
= 72x^5 + 96x^3 + 216x + 48^5 + 64x^3 +144
= 72x^5 + 48^5 + 96x^3 + 64x^3 + 216x +144
u = 3x^2 +4x +3
dy/du = 4*u^3
du/dx = 6x + 4
y = dy/du * du/dx
= (4*u^3) * (6x + 4)
= (4u^3) * (6x + 4)
= 4u^3 (6x + 4)
= u^3 (24x + 16)
「 ↑ ここを分配するのがいいのか、しない方がいいのか 分からんな……☆」
y = 4u^3 (6x + 4)
u = 3x^2 +4x +3
y = 4u^3 (6x + 4)
= 4(3x^2 +4x +3)^3 (6x + 4)
y = (3x^2 +4x +3)^4
y = 4(3x^2 +4x +3)^3 (6x + 4)
y = (3x^2 +4x +3)^4
y = 4(3x^2 +4x +3)^3 (6x + 4)
~~~~~~~~
「 上のyは 微分する前で、
下のyは、 上のyを微分したものに すこし端数が付いている☆」
「 xの2乗 の次元に比べれば、 x倍、 1倍の世界は 無視していいほど小さいということだぜ☆」
f(x) = y = (3x^2 +4x +3)^4
f'(x) = y' = 4(3x^2 +4x +3)^3 (6x + 4)
「 上の y は 元の形、
下の y' は y の 導関数 と呼ぶ☆」
「 大きな次元では合っていて、小さな次元では 合ってないのでは☆?」
「 合ってる、合ってないではなく、定義式じゃないか それ☆?」
「 手計算で 合ってるか 検算する趣旨なのに、定義式じゃ 検算も何も ないじゃないのよ!」
「 ↑ で、 多変数関数の合成関数の微分 の例をパクってくると こういう感じだぜ☆」
「 u と v は 総量として1つのもので、どこかで 2つに分けたんだろ☆ 等分割に限らないだけで☆」
「 x が相手にする u と、 y が相手にする u は、同じ u なの?」
「 u1 でも u2 でもなく、 u と書いてるから 同じなんじゃないか☆?」
「 すると 前に描いた 2つの二変数関数の合成関数の微分 には足し算が無かったから、間違いがあるのでは☆?」
「 二変数関数 x,y の出力は u ではないのよ。 (u,v) なのよ」
<次の記事へ>
Crieitは個人で開発中です。
興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!