2020-12-26に更新

きふわらべコードを決めようぜ☆(^~^)

Code(ソースコード) と Code(法) を掛けているんだぜ☆(^~^) 公開下書き

2020-12-05 sat

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 お前ら……☆ コーディング・ルールが ばらばらで メンテナンスしにくい☆」

連番 名前 備考
1 Kifuwarane 2014-11 SDT2
2 Kifuwarazusa 2015-05 WCSC25
3 Kifuwarakaku 2015-11 SDT3
4 Kifuwarube 2016-05 WCSC26
5 Kifuwaragyoku 2016-10 SDT4
6 Kifuwarakei 2017-05 WCSC27
7 Kifuwarabi 2017-10 SDT5
8 Kifuwarust 2018-05 WCSC28
- Kifuwarahashi 2019-05 WCSC29 故障
- Kifuwarachevy 2020-05 WCSOC
9 Kifuwarabe Kifuwarachevy or stable build version

KIFUWARABE_80x100x8_01_Futu.gif
「 それが 多様性 なのに……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 C# だったり C++ だったり、 Rust だったり、言語も違う……☆
ここは ばさっと 管理しないと わたしが きつい……☆」

作者名、プログラム名

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 TOML に統一しようぜ☆」

Profile/Engine.toml:

[Engine]

# 将棋ソフトの表示名です。
Name = "Kifuwarabe"

# 将棋ソフトの制作者名です。
Author = "Chiyuri"

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ こんなもんで良くね☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 やりゃあ いいんじゃないの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 別々のディレクトリーに 複数の .exe ファイルを作るやつもいるから、設定ファイル置き場は .exe のある場所とは別に用意しとこ……☆」

/
|
+-- Profile
    |
    +-- Engine.toml

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ こんな感じで……☆ ディレクトリー名を パスカルケースにするか スネークケースにするかは プログラム言語によって
文化が違うから、変えていいことにするぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↓ 例えば きふわらね は、ファイルのアセンブリ情報からエンジン名や作者名を取ってたぜ☆」

                // 製品名とバージョン番号は、次のファイルに書かれているものを使っています。
                // 場所:  [ソリューション エクスプローラー]-[ソリューション名]-[プロジェクト名]-[Properties]-[AssemblyInfo.cs] の中の、
                // [AssemblyProduct]と[AssemblyVersion] を参照。
                string seihinName;
                string versionStr;
                {
                    // 製品名
                    seihinName = ((System.Reflection.AssemblyProductAttribute)Attribute.GetCustomAttribute(System.Reflection.Assembly.GetExecutingAssembly(), typeof(System.Reflection.AssemblyProductAttribute))).Product;

                    // バージョン番号
                    Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
                    versionStr = String.Format("{0}.{1}.{2}", version.Major, version.Minor.ToString("00"), version.Build);

                    //seihinName += " " + versionStr;
                }
                LarabeLogger.GetInstance().WriteLineMemo(logTag, "v(^▽^)v イェーイ☆ ... " + seihinName + " " + versionStr);

KIFUWARABE_80x100x8_01_Futu.gif
「 それが正しい気がするが……☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 アセンブリ情報の書き換え方を 説明するのが めんどくさいのよ」

20201205shogi12a1.png

App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
    </startup>

    <!-- (^o^) Add -->
    <appSettings>
        <add key="Profile" value="../../../../Profile" />
    </appSettings>
</configuration>

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ .exe ファイルと同じディレクトリーには .exe.config みたいなファイルができるから、そこに Profileディレクトリーへのパスが乗るようにしておこうぜ☆」

20201205shogi13a1.png

20201205shogi14a1.png

// 参照 からアセンブリを追加しろだぜ☆(^~^)
using System.Configuration;

// 使う時
var profilePath = System.Configuration.ConfigurationManager.AppSettings["Profile"];

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ ここらへんの Visual Studio の基本操作は、どっかで覚えてきてくれだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 次は Toml だな☆」

20201205shogi15a1.png

20201205shogi16a1.png

using System.IO;
using Nett;

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ NuGet で Nett を取ってきておいてくれだぜ☆」

                    var profilePath = System.Configuration.ConfigurationManager.AppSettings["Profile"];
                    var toml = Toml.ReadFile(Path.Combine(profilePath,"Engine.toml"));
                    var engineName = toml.Get<TomlTable>("Engine").Get<string>("Name");
                    var engineAuthor = toml.Get<TomlTable>("Engine").Get<string>("Author");

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 例えば こんな感じだぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 逆に .exe.config を設定する方法を ReadMe に書く必要がでてきたわよ」

2020年11月の 電竜戦から きふわらずさ(Kifuwarazusa)にリネームして開発再開だぜ☆(^~^)  

|                         | ファイル                                                                                   |
| ----------------------- | ------------------------------------------------------------------------------------------ |
| ソース                  | `Kifuwarabe_WCSC25/Sources/By_Circle_Grayscale/P400_KifuNarabeVs/KifuwarazusaGuiVs.sln`    |
| 将棋エンジン ソース     | P050_KifuWarabe                                                                            |
| 将棋GUI ソース          | P400_KifuNaraVs                                                                            |
| 将棋エンジン ランタイム | `Kifuwarabe_WCSC25/Builds/Engine/Bin/P050_KifuWarabe/Grayscale.P050_KifuWarabe.exe`        |
| 設定ファイル1           | `Kifuwarabe_WCSC25/Builds/Engine/Bin/P050_KifuWarabe/Grayscale.P050_KifuWarabe.exe.config` |
| 設定ファイル2           | `Kifuwarabe_DenouT2/Profile/Engine.toml`                                                   |

設定ファイル1 の `Grayscale.P050_KifuWarabe.exe.config` の中にある `Profile` のパスを、 設定ファイル2 の親ディレクトリー `Profile` に合わせてください。  

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ きふわらずさ のディレクトリ構成 むずかしいぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 きふわるべ は いじらなくても強いからいいや……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 きふわらすと から Rust言語になるんだが☆」

config.rs:

//! 設定

/// USI対応コンピューター将棋ソフトの名前☆(^~^)
pub const ENGINE_NAME: &'static str = "Kifuwarabe WCSC28";
/// 作者の名前。姓・名の順にしたいぜ☆(^~^)異文化に通じる表記方法はないものか☆(^~^)
pub const ENGINE_AUTHOR: &'static str = "TAKAHASHI, Satoshi";

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 確かに これで十分なんだが、どのプログラム言語でも同じ設定方法にしたいので わざわざ TOML にするぜ☆」

20201206shogi17a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ ファイル1個置くだけに profile ディレクトリー作るの 無駄くさかったな……☆」

profile/Engine.toml:

[engine]

# 将棋ソフトの表示名です。
name = "Kifuwarust Bld1"

# 将棋ソフトの制作者名です。
author = "Chiyuri"

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ Rustに合わせないと めんどくさいんで テーブルの名前や、キーバリュのキーは スネークケースにするとするぜ☆」

Cargo.toml:

[dependencies]
serde = { version = "1.0", features = ["derive"] }
toml = "0.5.7"

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ toml クレートを追加だぜ☆」

main.rs:

extern crate serde;
extern crate toml;

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ main.rs の冒頭で使用クレートを宣言☆」

config.rs:

//! 設定
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
pub struct EngineFile {
    pub engine: Engine,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct Engine {
    pub name: String,
    pub author: String,
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 入れ物を作って……☆」

main.rs:

use std::fs::{self};

// 略

            match fs::read_to_string("profile/Engine.toml") {
                Ok(text) => {
                    let engine_file: Result<EngineFile, toml::de::Error> = toml::from_str(&text);
                    match engine_file {
                        Ok(engine_file) => {
                            g_writeln(&format!("id name {}", engine_file.engine.name));
                            g_writeln(&format!("id author {}", engine_file.engine.author));
                            g_writeln("usiok");
                        }
                        Err(why) => {
                            panic!("{}", why);
                        }
                    }
                }
                Err(why) => {
                    panic!("{}", why);
                }
            }

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ まあ、こんな感じだぜ☆」

|                         | ファイル                                                    |
| ----------------------- | ----------------------------------------------------------- |
| ソース                  | `Kifuwarabe_WCSC28/Cargo.toml`                              |
| 将棋エンジン ソース     | `Kifuwarabe_WCSC28/src/main.rs`                             |
| GUI                     | なし                                                        |
| 将棋エンジン ランタイム | `Kifuwarabe_WCSC28/target/release/kifuwarabe_shogi2018.exe` |
| 設定ファイル            | `kifuwarabe_shogi2018.exe` から見て `profile/Engine.toml`   |

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 説明も変わってくるな☆」

2020-12-06 sun

KIFUWARABE_80x100x8_01_Futu.gif
「 Rust版のわたしの profile/Engine.toml のディレクトリーは変えられないのかだぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 .NET Framework の *.exe.config の文化に合わせるの 嫌なんだが……☆
*.exe ファイルと同じディレクトリに 別のファイルパスへの案内があるのは合理的か……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ *.exe.config.toml というのを置いたろ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 コマンドラインの 第1引数 が ファイル名と考えていいの?」

gets execution file name on rust

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 現代の 自然言語翻訳テクノロジー のレベルから考えて 日本語は未成熟だから 英語でググると 検索性能が段違い……☆
すぐ出てくる☆」

Idiom #105 Current executable name

KIFUWARABE_80x100x8_01_Futu.gif
「 そんなハック ころころ使って……☆」

let exe_name = std::env::current_exe()
    .expect("Can't get the exec path")
    .file_name()
    .expect("Can't get the exec name")
    .to_string_lossy()
    .into_owned();
println!("(^q^) {}.config.toml", exe_name);

Output:

(^q^) kifuwarabe_shogi2018.exe.config.toml

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ よし、設定ファイル名は作れるぜ☆」

kifuwarabe_shogi2018.exe.config.toml:

[app]

profile = "./profile"

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ こんなもんでいいだろ☆」

config.rs:

//! 設定
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize)]
pub struct ExeConfigFile {
    pub app: App,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct App {
    pub profile: String,
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ ファイルの構造を設定して……☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 Rust言語で ファイルパスのコンバインって どうやるんだぜ☆?」

combine path on rust

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 英語でググれだぜ☆」

use std::path::Path;

// Example
Path::new("/etc").join("passwd").to_string_lossy()

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ こんな感じにすればいいのか……☆」

main.rs:

            // 実行ファイル名
            let exe_name = std::env::current_exe()
                .expect("Can't get the exec path")
                .file_name()
                .expect("Can't get the exec name")
                .to_string_lossy()
                .into_owned();
            // Example: "kifuwarabe_shogi2018.exe.config.toml"
            let engine_path = match fs::read_to_string(format!("{}.config.toml", exe_name)) {
                Ok(text) => {
                    let config: Result<ExeConfigFile, toml::de::Error> = toml::from_str(&text);
                    match config {
                        Ok(config) => Path::new(&config.app.profile).join("Engine.toml"),
                        Err(why) => {
                            panic!("{}", why);
                        }
                    }
                }
                Err(why) => {
                    panic!("{}", why);
                }
            };
            // Example: "./profile\Engine.toml"
            match fs::read_to_string(format!("{}", engine_path.to_string_lossy())) {
                Ok(text) => {
                    let config: Result<EngineFile, toml::de::Error> = toml::from_str(&text);
                    match config {
                        Ok(config) => {
                            g_writeln(&format!("id name {}", config.engine.name));
                            g_writeln(&format!("id author {}", config.engine.author));
                            g_writeln("usiok");
                        }
                        Err(why) => {
                            panic!("{}", why);
                        }
                    }
                }
                Err(why) => {
                    panic!("{}", why);
                }
            }

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 設定ファイルから 2項目取るだけで こんなに長くなって どうなのかと思うが、まあ 動けばいいだろ……☆」

sfen

KIFUWARABE_80x100x8_01_Futu.gif
「 どの きふわらべ にもあるコードは SFEN だろ☆
SFEN を クリーン・アーキテクチャー しようぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 クリーン・アーキテクチャーって もっさり してるんだがな……☆ 競技用に向いてない……☆」

Entities
    Sfen
        class SfenGame
            constructor( builder ) -> Self
            Str { get }
            Board[ 11~99 ] -> char {K, R, B, G ...}
            IsStartpos -> bool
            Phase -> &str {b, w}
            Hands[ phase * 7] -> uint
            Ply -> const 1
            Moves[ 0~512 ] -> &str "7g7f" ...

        class SfenGameBuilder
            From( string "SFEN" ) -> SfenGame
            Put( 11~99, {K, R, B, G ...} )
            SetStartpos( )
            SetPhase( {b, w} )
            Have( {K, R, B, G...}, 0~18)
            AppendMove( &str "7g7f" ... )
            Build( )

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 設計は ビルダー・パターンでいいだろ……☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 文字列を返すの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 オブジェクトを 疎結合するには 文字列がいいんで……☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 2進数で返してほしい人もいるのでは?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ソフトによって 変わってくるのはアリで☆ 作りを気持ち寄せる、ということだぜ☆」

旧きふわらね:

namespace Grayscale.KifuwaraneLib.L04_Common
{
    public abstract class KomaSyurui14Array
    {
        /// <summary>
        /// ------------------------------------------------------------------------------------------------------------------------
        /// 駒のSFEN(打)符号用の単語。
        /// ------------------------------------------------------------------------------------------------------------------------
        /// </summary>
        public static string[] SfenDa { get { return KomaSyurui14Array.sfenDa; } }
        protected static string[] sfenDa;

        static KomaSyurui14Array()
        {
            KomaSyurui14Array.sfenDa = new string[]{
                "×",//[0]ヌル
                "P",//[1]
                "L",
                "N",
                "S",
                "G",
                "K",
                "R",
                "B",
                "R",
                "B",
                "P",
                "L",
                "N",
                "S",
                "<打×U>",//[15]
            };
        }
    }
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 例えば 上記のようなコードは……☆」

新きふわらね:

namespace Grayscale.KifuwaraneLib.Entities.Sfen
{
    public static class SfenReferences
    {
        /// <summary>
        /// 駒のSFEN(打)符号用の単語。
        /// </summary>
        public static string[] SfenDa { get; private set; } = new string[]
        {
            "×",//[0]ヌル
            "P",//[1]
            "L",
            "N",
            "S",
            "G",
            "K",
            "R",
            "B",
            "R",
            "B",
            "P",
            "L",
            "N",
            "S",
            "<打×U>",//[15]
        };
    }
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 別に何も変わってないが Common ではなく Entities.Sfen に配置転換したぜ☆
本人は変わってないが 乗っている電車の路線が変わった……、みたいな改造を これからしていくわけだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 リストラクチャリングだな☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 リストラクチャリングって 結局 上の都合なのよ。
管理能力、管理コスト体力 には限界があるから 全体の構造が いじくり回されるだけで 全体の エコ をしてるだけで何も進まないのよ」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 その 管理能力の 危険水域 に来たわけだな……☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 SFEN と わたしの間には、符号の変換が必要だぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 おかしな将棋エンジンだな……☆
Entity.SfenTranslation という区分けを 暫定的に作るかだぜ☆」

旧きふわらね:

namespace Grayscale.KifuwaraneLib.L04_Common
{

    /// <summary>
    /// あるデータを、別のデータに変換します。
    /// </summary>
    public abstract class Converter04
    {
        /// <summary>
        /// アラビア数字。
        /// </summary>
        public static string[] ARABIA_SUJI = new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9" };

        /// <summary>
        /// 漢数字。
        /// </summary>
        public static string[] KAN_SUJI = new string[] { "一", "二", "三", "四", "五", "六", "七", "八", "九" };
    }
}

新きふわらね:

namespace Grayscale.KifuwaraneLib.Entities.SfenTranslation
{
    public static class TranslatedSfenReferences
    {
        /// <summary>
        /// アラビア数字。
        /// </summary>
        public static string[] ARABIA_SUJI { get; private set; } = new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9" };

        /// <summary>
        /// 漢数字。
        /// </summary>
        public static string[] KAN_SUJI { get; private set; } = new string[] { "一", "二", "三", "四", "五", "六", "七", "八", "九" };
    }
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ これも電車を乗り換えるだけ……☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 しかし そんな変換、 SFEN と何の関係も無くないか☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ Entities.PositionTranslation にする☆」

新きふわらね:

using Grayscale.KifuwaraneLib.L04_Common;

namespace Grayscale.KifuwaraneLib.Entities.SfenTranslation
{
    public static class SfenTranslator
    {
        /// <summary>
        /// 打った駒の種類。
        /// </summary>
        /// <param name="syurui"></param>
        /// <returns></returns>
        public static void SfenUttaSyurui(string sfen, out Ks14 syurui)
        {
            switch (sfen)
            {
                case "P":
                    syurui = Ks14.H01_Fu;
                    break;

                case "L":
                    syurui = Ks14.H02_Kyo;
                    break;

                case "N":
                    syurui = Ks14.H03_Kei;
                    break;

                case "S":
                    syurui = Ks14.H04_Gin;
                    break;

                case "G":
                    syurui = Ks14.H05_Kin;
                    break;

                case "R":
                    syurui = Ks14.H07_Hisya;
                    break;

                case "B":
                    syurui = Ks14.H08_Kaku;
                    break;

                case "K":
                    syurui = Ks14.H06_Oh;
                    break;

                case "+P":
                    syurui = Ks14.H11_Tokin;
                    break;

                case "+L":
                    syurui = Ks14.H12_NariKyo;
                    break;

                case "+N":
                    syurui = Ks14.H13_NariKei;
                    break;

                case "+S":
                    syurui = Ks14.H14_NariGin;
                    break;

                case "+R":
                    syurui = Ks14.H07_Hisya;
                    break;

                case "+B":
                    syurui = Ks14.H08_Kaku;
                    break;

                default:
                    System.Console.WriteLine("▲バグ【駒種類】Sfen=[" + sfen + "]");
                    syurui = Ks14.H00_Null;
                    break;
            }
        }
    }
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ こういうのを Sfen変換部 という☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 翻訳コード 多すぎだな……☆
もっと 1 オブジェクトは { "一", "a", "A", 1, "1"} である、というデータベースのID的なものを作った方がいいんじゃないのか☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 つまり テーブル引き だよな☆
テーブル引きと Switch 文の どっちの実行速度が 高速かは どっちとも言えないんだぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 実行ファイルのバージョンを見分けたいのに、あんたが プログラム名を外部ファイルに出したせいで
どのバージョンのプログラムでも プログラム名がおんなじよ!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 プログラム名のうしろに ビルド番号 が付加されるようにするかだぜ☆ Bld1 みたいな☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 そのビルド番号はどこに書くんだぜ☆? アセンブリ情報か☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Program.cs の冒頭とかでいいんじゃないかな……☆」

新きふわらね:

namespace Grayscale.KifuwaraneLib
{
    public class Program
    {
        /// <summary>
        /// ビルド番号。ソースをちょっといじったら ここを増やしておけば Exeファイルを差し替えたことが分かりやすい。
        /// </summary>
        public static int BuildVersion { get; private set; } = 5;
    }
}

// 略

                    engineName = $"{toml.Get<TomlTable>("Engine").Get<string>("Name")} Bld{Grayscale.KifuwaraneLib.Program.BuildVersion}";

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ こんな感じでいけるぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 きふわらね、 SFEN の読取から 外部プロセス起動 まで 1メソッドでやってんのか☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 SFEN の解析と、 外部プロセスの起動は 分けましょう」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 うん……☆? この Process って、 Stockfish型プログラムでいう所の Move だぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 用語は メジャーなソフトに合わせましょう!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Sfen の中でも 指し手の解析 はまた骨が折れるんだぜ☆」

Entities
    SfenTranslation
        class SfenMove
            constructor( builder ) -> Self
            Str { get }
            SrcFile -> int 1~9
            SrcRank -> int 1~9
            IsDrop -> bool
            SrcPiece -> char {K, R, B, k, r, b, +P ...}
            DstFile -> int 1~9
            DstRank -> int 1~9
            DstPiece -> char {K, R, B, k, r, b, +P ...}
            IsPromote -> bool

        class SfenMoveBuilder
            From( string "SFEN move" ) -> SfenMove
            SetSrcFile( 1~9 )
            SetSrcRank( 1~9 )
            SetDrop( bool )
            SetSrcPiece( {K, R, B, k, r, b, +P ...} )
            SetDstFile( 1~9 )
            SetDstRank( 1~9 )
            SetDstDrop( bool )
            SetPromote( bool )
            Build( )

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 設計は こんなもんかだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 きふわらね は、 指し手を1つずつパースするのではなく、指し手のリスト をパースするように作ってあるんだが☆」

Entities
    SfenTranslation
        class SfenMoveBuilder
            Set1st( 123456789 か、 PLNSGKRB )
            Set2nd( abcdefghi か、 * )
            Set3rd( 123456789 )
            Set4th( abcdefghi )
            Set5th( + )
            Build( )

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ まあ、やり方は 無尽蔵にあるのがプログラミングだからな……☆」

旧きふわらべ:

                // Sfenの指し手解析
                Regex regex = new Regex(
                    @"^\s*([123456789PLNSGKRB])([abcdefghi\*])([123456789])([abcdefghi])(\+)?",
                    RegexOptions.Singleline
                );

                MatchCollection mc = regex.Matches(text);
                foreach (Match m in mc)
                {
                    try
                    {
                        if (0 < m.Groups.Count)
                        {
                            successful = true;

                            // 残りのテキスト
                            restText = text.Substring(0, m.Index) + text.Substring(m.Index + m.Length, text.Length - (m.Index + m.Length));

                            SfenMoveReferences.GetData_FromTextSub(
                                m.Groups[1].Value,  // 123456789 か、 PLNSGKRB
                                m.Groups[2].Value,  // abcdefghi か、 *
                                m.Groups[3].Value,  // 123456789
                                m.Groups[4].Value,  // abcdefghi
                                m.Groups[5].Value,  // +
                                out move,
                                kifuD,
                                logTag
                                );
                        }

                        // 最初の1件だけ処理して終わります。
                        break;
                    }
                    catch (Exception ex)
                    {
                        // エラーが起こりました。
                        //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

                        // どうにもできないので  ログだけ取って無視します。
                        string message = "TuginoItte_Sfen.GetData_FromText(A):" + ex.GetType().Name + ":" + ex.Message + ":text=「" + text + "」 m.Groups.Count=「" + m.Groups.Count + "」";
                        LarabeLogger.GetInstance().WriteLineError(LarabeLoggerTag_Impl.ERROR, message);
                    }
                }

                restText = restText.Trim();

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ break 文で抜けてるんで先頭の1つしか見てない……☆」

旧きふわらべ:

        /// <summary>
        /// 符号1「7g7f」を元に、指し手 を作ります。
        /// 
        /// <再生、コマ送りで呼び出されます>
        /// </summary>
        /// <returns></returns>
        public static void GetData_FromTextSub(
            string str1, //123456789 か、 PLNSGKRB
            string str2, //abcdefghi か、 *
            string str3, //123456789
            string str4, //abcdefghi
            string strNari, //+
            out IMove move,
            Kifu_Document kifuD,
            ILoggerFileConf logTag
            )
        {
            // 略。
        }

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 引数で5つ受け取っているとこを リストラクチャリングするぜ☆」

新きふわらね SfenMoveBuilder.cs:

namespace Grayscale.KifuwaraneLib.Entities.Sfen
{
    /// <summary>
    /// メソッド・チェーンできないけど……☆(^~^)
    /// </summary>
    public class SfenMoveBuilder
    {
        public SfenMove Build()
        {
            return new SfenMove(this);
        }

        /*
        public int SrcFile { get; set; }
        public int SrcRank { get; set; }
        public bool IsDrop { get; set; }
        public string SrcPiece { get; set; }
        public int DstFile { get; set; }
        public int DstRank { get; set; }
        public string DstPiece { get; set; }
        public bool IsPromote { get; set; }
         */
        // 忘れず初期化☆(^~^)!
        public char[] Chars { get; private set; } = new char[5] { ' ', ' ', ' ', ' ', ' ', };

        /// <summary>
        /// 123456789 か、 PLNSGKRB
        /// </summary>
        /// <param name="ch"></param>
        public char Str1st { set { this.Chars[0] = value; } }

        /// <summary>
        /// abcdefghi か、 *
        /// </summary>
        /// <param name="ch"></param>
        public char Str2nd { set { this.Chars[1] = value; } }

        /// <summary>
        /// 123456789
        /// </summary>
        /// <param name="ch"></param>
        public char Str3rd { set { this.Chars[2] = value; } }

        /// <summary>
        /// abcdefghi
        /// </summary>
        /// <param name="ch"></param>
        public char Str4th { set { this.Chars[3] = value; } }

        /// <summary>
        /// + か、無し。
        /// </summary>
        /// <param name="ch"></param>
        public char Str5th { set { this.Chars[4] = value; } }
    }
}

新きふわらね SfenMove.cs:

using System;

namespace Grayscale.KifuwaraneLib.Entities.Sfen
{
    public class SfenMove
    {
        /*
        public int SrcFile { get; private set; }
        public int SrcRank { get; private set; }
        public bool IsDrop { get; private set; }
        public int DstFile { get; private set; }
        public int DstRank { get; private set; }
        public bool IsPromote { get; private set; }
        */
        // 忘れず初期化☆(^~^)!
        public char[] Chars { get; private set; } = new char[5] { ' ', ' ', ' ', ' ', ' ', };

        public SfenMove(SfenMoveBuilder builder)
        {
            /*
            this.SrcFile = builder.SrcFile;
            this.SrcRank = builder.SrcRank;
            this.IsDrop = builder.IsDrop;
            this.DstFile = builder.DstFile;
            this.DstRank = builder.DstRank;
            this.IsPromote = builder.IsPromote;
            */
            Array.Copy(builder.Chars, this.Chars, builder.Chars.Length);
        }
    }
}

新きふわらね:

// 呼出し口
                            var moveB = new SfenMoveBuilder()
                            {
                                Str1st = m.Groups[1].Value.ToCharArray()[0], // 123456789 か、 PLNSGKRB
                                Str2nd = m.Groups[2].Value.ToCharArray()[0], // abcdefghi か、 *
                                Str3rd = m.Groups[3].Value.ToCharArray()[0], // 123456789
                                Str4th = m.Groups[4].Value.ToCharArray()[0], // abcdefghi
                            };
                            if ("+" == m.Groups[5].Value) // + か、無し。
                            {
                                moveB.Str5th = m.Groups[5].Value.ToCharArray()[0];
                            }

                            SfenMoveReferences.GetData_FromTextSub(
                                moveB.Build(),
                                out move,
                                kifuD,
                                logTag
                                );

// 呼び出される方
        public static void GetData_FromTextSub(
            SfenMove sfen,
            out IMove move,
            Kifu_Document kifuD,
            ILoggerFileConf logTag
            )
        {
        }

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ これだけだと、入れ物が1つ 余分に増えただけで 嬉しくないが……☆」

20201206shogi19a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ ところで こういう書き方は 悪いらしいぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 直せ☆!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Array.Copy(...) を使っていると 初期化してない配列に コピーしようとしてしまう、という不具合があっても
コンパイル時に 見えないんだな……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ次☆」

                if ('*' == sfen.Chars[1])
                {
                    //>>>>> 「打」でした。
                }

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 2文字目が * だったら 打 だと分かるんだが、こういうのは ルール と呼ぶんだぜ☆
ルールは……☆」

SfenMove.rs:

using System;

namespace Grayscale.KifuwaraneLib.Entities.Sfen
{
    public class SfenMove
    {
        /// <summary>
        /// 打です。
        /// </summary>
        public bool IsDrop 
        {
            get {
                return '*' == this.Chars[1];
            }
        }
    }
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ メソッドにしよう、というのが オブジェクト指向 のやり方だぜ☆」

                if (sfen.IsDrop)
                {
                    //>>>>> 「打」でした。
                }

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ すると コードから 式を減らせるぜ☆」

if (sfen.IsDrop) { } // ?
if (sfen.IsDrop()) { }

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 ↑ IsDrop のうしろに丸かっこが付いてないと おかしくない?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Visual Basic みたいだよな☆ C# の ゲッターは プロパティ方式と メソッド方式があるんで 変な感じになる……☆
.IsDrop にするか .Dropped にするか揺れるの嫌なんで☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 メソッド名を動詞から始めるなんて Javaのような前時代の産物だろ☆ .Dropped にしようぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ Dropped で☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 お前、独自表現のコード多いな……☆
SFENじゃないコードは 何と呼べばいいのか……☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 アプリケーションと呼ぶのよ」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ Dropped で☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 クリーン・アーキテクチャーの Entity層を 1つ増やすか……☆ 内側が Sfen、外側が ApplicatedGame という名前で☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 そんなことを言っても、ロガーは 依存しまくりなんじゃないのかだぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ロガーは インターフェース として使うことになるんだろうけどな☆
しかし ロガー は色んな種類を使いたいぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 C#言語は 列挙型 を継承できないから、何かいい 構造を考えなさい。
あとから変更しても 下部構造に影響がなく、
下部構造で追加しても 上位構造の変更の妨げにならないような」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 そんな都合のいい予約語 ないんで……☆」

20201207shogi20.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ ログ・ファイルを修正したんで 画像が出るようになった……☆
これは 利きがどこにある を表しているんで 駒の画像ではなく マスを塗りつぶした方が良かった……☆」

20201207shogi20a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 魔法陣みたいだ……☆」

2020-12-08 tue

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 風邪の症状が 収まってきたぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 寝ろ☆」

2020-12-11 fri

/
|
+-- Builds
|    |
|    +-- Debug
|    |
|    +-- Release
|        |
|        +-- *Engine.exe    # 将棋エンジン
|
+-- Logs    # 消されてもいいファイルが溜まっていくのはここ。
|
+-- Profile
|    |
|    +-- Engine.toml    # 代表的な設定ファイル
|
+-- Resources
|
+-- References
|
+-- Sources
|
+-- *.sln

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ある程度、ディレクトリ構成を決めようぜ☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 Docker は見据えなくていいの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 バリバリの Windows プログラミングで作っているので Docker に向いてない……☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 きふわらずさ のソースコードは 大きく4つに分かれるが☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 わたしが開発しているわけではないソースは References ディレクトリーに移そうぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 練習のソースとか、同人ゲームにしようとしたソースが混ざってるんだぜ☆」

|
+-- Sources
|
+-- SourcesOfPowerShell
|
+-- SourcesOfAims
|
+-- SourcesOfLua

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 階層を深くしたくないんで、トップ・ディレクトリーでフォルダーを分けようぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 将棋ソフトの .exe ファイルはどれなんだぜ☆?
Builds ディレクトリーの下に Release は無いし、 ディレクトリーがいっぱいあるぜ☆?」

|
+-- Builds
|
+-- BuildsOfAnothers

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ Builds の下の階層は固定したいんで、 BuildsOfAnothers を別途用意しようぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 おや、ログ・ファイルのパスがずれたぜ☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 ファイル・パスをハード・コーディングしている箇所を すべて設定ファイルに 出しましょう!」

2020-12-12 sat

例外がスローされました: 'System.Threading.ThreadAbortException' (mscorlib.dll の中)
スレッド 0xb84 はコード 0 (0x0) で終了しました。
例外がスローされました: 'System.Threading.ThreadAbortException' (mscorlib.dll の中)
スレッド 0x78 はコード 0 (0x0) で終了しました。
例外がスローされました: 'System.Threading.ThreadAbortException' (mscorlib.dll の中)
スレッド 0x12c0 はコード 0 (0x0) で終了しました。

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 きふわらかく と、 きふわらぎょく は 同じ不具合を抱えているんだが、 スレッドがアボートしていてはダメだよな☆
これは 将棋エンジンが起動して usi コマンドを入力するまでの数秒の間、またはその前後のどこかに起こるぜ☆
起こった時は usi に対して返事がない☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 英語でググろうぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ソースコードを Log というディレクトリに分けたら .gitignore で無視された……☆」

2020-12-13 sun

20201213shogi48a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 きふわらかく、 きふわらぎょく の両方にあって、 きふわらずさ、きふわらけい にないのが このコード☆
知り合いの同人サークルに頼んで作ってもらった関数なんで これを差し替えるのは 骨が折れるぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ノン・ブロッキングIO(アイ・オー)が やりたかったんだぜ☆
1回うまく動けば、あとは ずっと動いていたと思うんだが、最初の1回に失敗すると動かない☆
泣く泣く ブロッキングIO に変えるぜ……☆」

コンピューター将棋ソフトきふわらべの関数名や変数名を流行りに合わせようぜ☆(^~^)?

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 変数名は 揃えて行こうぜ☆」

2020-12-14 mon

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 C#言語の #region#endregion は使わないようにしようぜ☆?
開けるために クリック する手間が膨大……☆」

20201214shogi53a1.png

セマンティック バージョニング 2.0.0

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ このビルド番号、かっこ悪いんで、バージョン番号は セマンティック・バージョニング を使いたいぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 じゃあ使えだぜ☆」

20201214shogi54a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ バージョンはアセンブリ・インフォに書け、という C# の文化があるんだが、 Rust言語は そんな文化ないんで統一性がめんどくさ……☆」

                            Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
                            Program.Send($"id name {engineName} {version.Major}.{version.Minor}.{version.Build}");

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ で、先祖返りして こんな感じで書くぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 コンピューター・プログラミングの 大統一インターフェースって 無い物ねぇ」

20201214shogi55a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ きふわらべーず は、こんな感じの プログラム名で表示するのを……、推奨にしようぜ☆? マストにするのは 不便だぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 メジャー・バージョン番号が5桁ぐらいになれば また嫌になって ローカル・ルール(きふわらべコード) を変えたくなるだろう☆」

20201214shogi56a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ こうすれば 表示名もすっきり……、あっ☆! れさかい もセマンティック・バージョニング使ってやがるぜ☆!」

KIFUWARABE_80x100x8_01_Futu.gif
「 じゃあ 9匹とも揃えてくれだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 次は何から手をつけるか……☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 Clean Architecture に少しは寄せて、 プロジェクトを Entities, UseCase, Engine, Gui の4つに分けましょう」

KIFUWARABE_80x100x8_01_Futu.gif
「 GUI が 2つも 3つも あるやつがいるぜ☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 Gui1, Gui2, Gui3 に分けましょう」

20201214shogi60a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ つまり こう☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 そう!」

20201214shogi61.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ わたしには この方が よく分解できているんだが とりあえず Clean Architecture を身に付けるために変えていくかだぜ……☆」

2020-12-16 wed

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 よし、ある程度 まとめ直したぜ☆ 次は何しよ☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 USI のループって Clean Architecture のどのレイヤーにあるべきなのかしら?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Controller じゃないか☆? きふわらべーず では Engine と名前を変えているが……☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 USI のループを Engine に置きましょう!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Main 関数の近くに USI Loop を置いたぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 将棋エンジンって コマンドラインにならないのかだぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 相手の手番に読んだりしてるからな☆ ならないな☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 UseCases に USI のインターフェースを置いて、 Engine に USI インターフェースの実装を置いた方がよくない?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 USI プロトコルが Clean Architecture かどうか知らないが……☆
指し将棋をします、とか 検討します、とかが UseCase だろ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 じゃあ USIループは Entities だろ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 なるほど……☆
それで 一記事書けそうだよな☆」

Clean Architecture で将棋エンジンを作ろうぜ☆(^~^)?

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ Engine にパーサー、コマンドに対応する処理は UseCases に置けばいいか……☆」

2020-12-18 fri

Engine に USIパーサー、 UseCase に処理。

連番 名前 進捗
1 Kifuwarane done
2 Kifuwarazusa done
3 Kifuwarakaku
4 Kifuwarube
5 Kifuwaragyoku
6 Kifuwarakei
7 Kifuwarabi
8 Kifuwarust
9 Kifuwarachevy

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 進めてはいるが、進捗なし☆」

2020-12-19 sat

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 きふわらべの弱さの原因の1つが分かったぜ☆
エラーの発生個所でログを取っていることだぜ☆ これは例外処理で投げ上げてしまった方がいい☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 直せだぜ☆」

Log, Exception の見直し

連番 名前 進捗
1 Kifuwarane doing
2 Kifuwarazusa doing
3 Kifuwarakaku doing
4 Kifuwarube
5 Kifuwaragyoku
6 Kifuwarakei
7 Kifuwarabi
8 Kifuwarust
9 Kifuwarachevy

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ リリースモードの中でトレース・ログを取るのを止めたいが、改造が進むのは 少しずつだぜ☆」

20201219shogi64.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 このレベルで エンバグしてしまうのは リファクタリングの失敗にしても 何を踏んだか分からん……☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 上に デバッグ・アサート2行書いてるのに 突き抜けてくんの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 デバッグ・モードまで リファクタリングしてないしな……☆」

20201219shogi65.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ どうぶつしょうぎ は遊べる……☆ 表示は狂ってるけど☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 フォルダーをずらしたとき、設定ファイルへのパスが 変わってて 本将棋の設定が外れていた……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 コールバック関数を使えばいいところで 使ってないケースがあることに気づいたぜ☆」

2020-12-20 sun

20201220shogi66.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 18時間ぐらい キーパンチャーして思ったんだが、スタックトレースの出し方があるんじゃないかだぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 探せ☆」

20201220shogi68.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ C#でもスタックトレースが出るぜ☆ 行番号まで分かる☆」

20201220shogi70.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ きふわらけい は Unity の古い C# に対応していたが、もう Unity 使わないだろ☆
削ろかな……☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 削りましょう!」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 削った……☆ Unity に関わった時間は 何にもつながらないこととなったぜ☆」

/
|
+-- Builds
    |
    +-- AnyCpu
    |   |
    |   +-- Debug
    |   |
    |   +-- Release
    |
    +-- x64
        |
        +-- Debug
        |
        +-- Release

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ ビルドしたファイルを置くところを、 CPUアーキテクチャ のディレクトリ1個分 深めようと思うぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 あとから あとから どんどん変更が入ってしまうな……☆ CPU アーキテクチャなんか 何年ごとに増えるんだぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 生きてる間に 増えるかどうかも分からんよな……☆」

/
|
+-- Builds_x64
|   |
|   +-- Debug
|   |
|   +-- Release
|
+--Biulds_AnyCpu
    |
    +-- Debug
    |
    +-- Release

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ トップ・ディレクトリーが多くなるかもしらないが Biulds_CPUアーキテクチャ でどうだぜ☆?
パスカルケースじゃなくなるけど☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 それほど 意味が通じないほどのものでもないんじゃないの」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ これに変更で☆」

Console.WriteLine("(^q^)");

// ↓

Logger.Trace("(^q^)");

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ WriteLine は、デバッグモードだけに有効になる自作の Trace に置き換えると 実行速度がアップするぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 そりゃそうねぇ」

KIFUWARABE_80x100x8_01_Futu.gif
「 どんどんやってくれだぜ☆」

2020-12-21 mon

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 x64 アーキテクチャ対応を 先に進めていこうと思うぜ☆」

連番 名前 進捗
1 Kifuwarane done
2 Kifuwarazusa done
3 Kifuwarakaku
4 Kifuwarube
5 Kifuwaragyoku
6 Kifuwarakei
7 Kifuwarabi
8 Kifuwarust
9 Kifuwarachevy

Visual Studio.NETプラットフォームのターゲットの説明

KIFUWARABE_80x100x8_01_Futu.gif
「 ↑ 説明を読むと、 開発者は どの CPUアーキテクチャ の上で動いて欲しいか、を表すフラグに過ぎないらしいぜ☆
x64 を選んだからといって x64 対応になるのではなく、 x64 以外の CPU で実行されることを拒否するだけらしいぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 CPU依存の命令なんか使う気無いのに……☆」

Visual Studio C# の CPU構成を設定するテクニックを説明しようぜ☆(^~^)?

2020-12-22 tue

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ついさっき Visual Studio 2019 の 面白い機能を見つけたぜ☆!」

20201222shogi101.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 文字列を選択し……、なんで 豆電球が点いてるんだろな☆?」

20201222shogi102.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 豆電球をクリックすると、いろいろ コーディングをやってくれるんだぜ☆」

20201222shogi103.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 例えば 補間された文字列に変換する を選ぶと、 Java Script の 補間文字列 みたいな書き方ができるぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 それは どんどん やらなくていいぜ☆」

20201222shogi104.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ そして メソッドを抽出する を選ぶと、 メソッドに切り出してくれるから、見にくい書式から おさらば だぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 関数呼び出し 遅そう」

2020-12-26 sat

20201226shogi106a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ きふわらべの謎☆
LogFilePath( ) という関数があり、あー、ここにログが保存されてるのか、と一見思うが この関数はどこからも使われていない☆
じゃあお前、どうやって どこにログを保存してるんだぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 知らね☆」

<書きかけ>

何度でもクリック!→

むずでょ

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

むずでょ の最近の記事