2022/09,江端さんの忘備録

私の未来予想は、これまで、ダイナミックに外れてきました。

My future predictions has been out of mark dynamically.

ですので、皆さんは、私の言うことは、あまり信じない方がいい、と、かなり本心から思っています。

So I am sorry that you don't have to believe what Ebata says no much from the bottom of my heart,

と逃げをうった上で申し上げますが、

And I'm going to say this with an evasive answer.

―― ロボットによる介護は、(少なくとも、私のフェーズでは)ダメなんじゃないかな

"I think robotic caregiving is a no-go (at least in my phase)"

と、思うのです。

もっとも、これは「完全人型ロボット」という意味で、パワードスーツの方向は希望はあると思っていますが。

However it is the case of "full humanoid robot", on the other hand, I think that "powered suite" has a little hopes.

-----

最近、私がショックを受けたパラダイムは、『マッチョ介護』です。

The paradigm that has shocked me recently is 'macho caregiving'.

『ITや制御やロボットがナンボのもんだ。これが正解だ』

"IT, control, and robot are meaningless. The 'macho caregiving' is right answer".

と、頭をぶん殴られるほどの衝撃を受けました。

I was so shocked that I was hit over the head.

父と母が亡くなり、今後の介護フェーズは、私たち夫婦の問題に移行します。

Through the death of my father and mother, the caregiving phase is going to move to my wife and me.

その準備としては、お金や設備などもありますが、介護をする側になることを考えれば「マッチョ」は分かりやすく、おそらくはかなりコストパフォーマンスなアプローチです。

For the preparation, we will need money and devices, however, for the side of the caring , "macho" is easy to understand and a cheaper strategy.

被介護者になるリスクを減らすという観点でも、良いアプローチと思います。

From the viewpoint of risk management to avoid being a care receiver, this is a good approach.

-----

こういう考え方が出て来たのは、これを作ってからです。

This paradigm has come to me, since I made the following device.

部屋に鉄棒を作ってみた

今の私は、(ずるい方法の)懸垂20回、ぶらさがり時間は60秒を軽く越えることができます。

Now I can do 20 sneaky pull-ups and keep my body hanging over 60 seconds.

さらに、最近は、他のメニューも加えて、全身運動に工夫をするようにしています。

These days, I have added new menus for full body exercise.

―― まだ間に合うかもしれない

"It might be not too late"

と思い、現在は、筋トレ専用のスポーツジムなどの巡回ツアーを開催しています。

So, I am organizing a tour of gyms and other facilities for muscle training.

-----

ただ、月額費用、2万円/月は、ちょっと高いんですよね。

However, \20K yen/month is too expensive for me.

普通のフィットネスセンターは、人数が多いし、市民運動センターは遠い。

Ordinal fitness club has many members, and the civic exercise center is far from my house.

モチベーションも「介護」一択です。

My motivation of muscle training is just for "caregiving".

マッチョな体になって、女性にモテたい、という心理は、私の人生で、1ナノ秒も登場したことがありません。

I have never wanted to have a macho body and be popular with the woman at all in my life.

(そもそも、私は、"マッチョ = バカ"という、酷い偏見を持っていた人間でした。今は、"尊敬"、"有用"にパラダイムシフトしています)

(To begin with, I thought "Macho is stupid" that is terrible prejudice. Now I change my mind to "respect" or "useful")

加えて、私は「"引きこもり"大好き人間」です。

In addition, I am a "recluse lover".

-----

先ずは、人間を運搬できるだけの筋力と、ぎっくり腰対策ができる程度のトレーニングを、『自宅』でできないものか模索しています。

So, I am searching how to get muscle to move a person, and avoid "strained back" just in my house.

上記の鉄棒のように、自宅を加工するのはことはO.K.で、工作は大好きなので、その方向から、皆さんのアドバイスを頂けると、大変助かります。

Like the the above "iron bar", I love DIY making or modifying my house, so I appreciate if you give me some advices.

よろしくお願い致します。

Thank you for your help in advance.

2022/09,江端さんの技術メモ

最近、スペルチェックをvscodeにやらせていて、emacsでのリロードを何度もやっているのだけど、これが中々に面倒で、これを一発でできないものか、色々調べた結果です。

方針: 面倒なので、".emacs" だけの記載で終了したい
操作:<F5>押すだけ
判ったこと: ".emacs"の最後に追記すると動かない(私の環境だけかもしれないが) → ".emacs"の真ん中あたりに突っ込んだ。

;;;; バッファを一発でリロードする (.emacsの最後に記載したら動かなかったので、真ん中くらいに移動)

(defun revert-buffer-no-confirm (&optional force-reverting)
  (interactive "P")
  ;;(message "force-reverting value is %s" force-reverting)
  (if (or force-reverting (not (buffer-modified-p)))
      (revert-buffer :ignore-auto :noconfirm)
    (error "The buffer has been modified")))

;; reload buffer
(global-set-key (kbd "<f5>") 'revert-buffer-no-confirm)
;;(global-set-key "\C-c\C-r" 'revert-buffer-no-confirm)
;;(global-set-key "\M-r" 'revert-buffer-no-confirm)
;(global-set-key "\C-c\C-m" 'revert-buffer-no-confirm)

2022/09,江端さんの技術メモ

こっちはPythonで書いたファジィ(Fuzzy)推論コードです。

# -*- coding: utf-8 -*-
# 上記の一行がないと、コメント分の和文も全部エラーになる 

# シンプルファジィ推論プログラム ver0.0 2015年12月15日

# メンバーシップ関数は、前件部、後件部ともに3つに固定した単純なもの
# 推論方式は、単純なmin-max重心法のみ



class condition_MF:
    
    center = 0
    width =  100
    PV ="LESS"

    def __init__(self, center, width, PV):
        self.center = center
        self.width = width
        self.PV = PV

    # x,yは、メンバーシップ関数上の座標を示す
    def func(self, x):
        if (self.PV == "LESS"):
            if (x <= self.center - self.width):
                y = 1.0
            elif (x <= self.center):
                y = - 1.0 / self.width * (x - self.center)
            else:
                y = 0.0        
        elif (self.PV == "ZERO"):
            if (x <= self.center - self.width):
                y = 0.0
            elif (x <= self.center):
                y = 1.0 / self.width * (x - self.center) + 1.0
            elif (x <= self.center + self.width):
                y = -1.0 / self.width * (x - self.center) + 1.0
            else:
                y = 0.0       
        elif (self.PV == "MORE"):
            if (x <= self.center):
                y = 0.0
            elif (x <= self.center + self.width):
                y = 1.0 / self.width * (x - self.center)
            else:
                y = 1.0
        
        return y

class action_MF:
    center = 0 # 値はダミー
    width =  100 # 値はダミー
    PV ="ZERO" # 値はダミー
    y = 0.0 # 最大値で更新されていく
    x = 0.0 # 値はダミー

    def __init__(self, center, width, PV):
        self.center = center
        self.width = width
        self.PV = PV

        if (self.PV == "LESS"):
            self.x = self.center - self.width
        elif (self.PV == "ZERO"):
            self.x = self.center
        elif (self.PV == "MORE"):
            self.x = self.center + self.width
        else:
            print "error"

    # yを最大値で更新していく
    def func_Max(self,b):
        self.y = max(b, self.y)

    # X座標を返す
    def func_X(self):
        return self.x

    # (最大値で更新された、最後の)Y座標を返す
    def func_Y(self):
        return self.y

temp_High = condition_MF(20.0, 10.0, "MORE") # 温度が高い
temp_Middle = condition_MF(20.0, 10.0, "ZERO") #温度が普通
temp_Low = condition_MF(20.0, 10.0, "LESS")# 温度が低い

humi_High = condition_MF(50.0, 20.0, "MORE") # 湿度が高い
humi_Middle = condition_MF(50.0, 20.0, "ZERO") #湿度が普通
humi_Low = condition_MF(50.0, 20.0, "LESS")# 湿度が低い

switch_High = action_MF(0.0, 1.0, "MORE") # エアコンの温度設定を上げる("+1"にする)
switch_Middle = action_MF(0.0, 1.0, "ZERO")# エアコンの温度設定に何もしない("0"にする)
switch_Low = action_MF(0.0, 1.0, "LESS") # エアコンの温度設定を下げる("-1"にする)


# 入力値(温度27度、湿度57%)
t = 35.0
h = 80.0

# (1)「もし、温度が高くて、湿度が高ければ、エアコンの温度設定を下げる」
a1 = min(temp_High.func(t),humi_High.func(h))
print a1
switch_Low.func_Max(a1) 

print "Low" 
print switch_Low.func_Y() 

# (2)「もし、温度が普通で、湿度が高ければ、何もしない」
a2 = min(temp_Middle.func(t),humi_High.func(h))
switch_Middle.func_Max(a2) 

print "Middle" 
print switch_Middle.func_Y() 

# (3)「もし、温度が高くて、湿度が普通なら、エアコンの温度設定を下げる」

a3 = min(temp_High.func(t),humi_Middle.func(h))
switch_Low.func_Max(a3) 
print "Low" 
print switch_Low.func_Y() 

# (4)「もし、温度が低くて、湿度が低ければ、エアコンの温度設定を上げる」
a4 = min(temp_Middle.func(t),humi_Low.func(h))
switch_High.func_Max(a4) 
print "High" 
print switch_High.func_Y() 

# (5)(追加)もし温度が普通で、湿度が普通なら、何もしない
a5 = min(temp_Middle.func(t),humi_Middle.func(h))
switch_Middle.func_Max(a5) 
print "Middle" 
print switch_Middle.func_Y() 

# 重心値を求める
# (ルールが推論空間を網羅していないと、ゼロ割が発生することがあるので注意)

reasoning =  (switch_High.func_X() * switch_High.func_Y()  + switch_Middle.func_X() * 
switch_Middle.func_Y()  + switch_Low.func_X() * switch_Low.func_Y()) 
/ (switch_High.func_Y()  + switch_Middle.func_Y()  + switch_Low.func_Y())

print "\n reasoning"
print reasoning

元ネタはこちら(クリックするとページに飛びます)。

ファジィ推論

2022/09,江端さんの技術メモ

Go言語を使った自作のファジィ(Fuzzy)推論コードを探していたのですが、見つけることができずにちょっとショックを受けております。

というか、Go言語どころか、C言語でも見つけられなかった(いや、あるはずだ)ので、今、PCの中探して見つかったものをアップしておきます。

毎回スクラッチから作るのも迂遠なので。

↓のコードですが、こちらのコラムで使ったものだと思います。

/*
  このプログラムをfuzzy.cpp"という名前で保存して、
  gcc -g fuzzy.cpp -o fuzzy
  でコンパイルして下さい。
*/



#include <stdio.h>
#include <stdlib.h>


// 共通関数
double max(double a){
    return a;
}

double max(double a, double b){
    if (a > b) 
        return a;
    else 
        return b;
};

double max(double a, double b, double c ){
    return max(max(a,b), max(b,c)); 
};

double max(double a, double b, double c, double d ){
    return max(max(a,b,c), d); 
};

double min(double a){
    return a;
}

double min(double a, double b){
    if (b > a) 
        return a;
    else 
        return b;
};

double min(double a, double b, double c ){
    return min(min(a,b), min(b,c)); 
};

double min(double a, double b, double c, double d ){
    return min(min(a,b,c), d); 
};


// ファジィ表現
typedef enum scale {LESSLESS, LESS, ZERO, MORE, MOREMORE} SCALE;

// 前件部メンバーシップ関数(山3つ)クラス
class condition_MF3
{
private:
    double center;
    double width;
    SCALE express;
   
public:
    condition_MF3(double _center, double _witdth, SCALE _express){
        center = _center;
        width = _witdth;
        express = _express;

        // 使用できないファジィ表現を使った場合は止める        
        if ((express == LESSLESS) || (express == MOREMORE)){
            printf("wrong expression used \n");
            exit(0);
        }

    };
    double func(double _x);
};

double condition_MF3::func(double _x)
{
// x,yは、メンバーシップ関数上の座標を示す
    double x = _x;
    double y = 0.0; // yの値は、必ず0以上1以下になる

    if (express == LESS){
        if (x <= center - width){
            y = 1.0;
        }
        else if (x <= center){
            y = - 1.0 / width * (x - center);
        }
        else{
            y = 0.0;
        }
    }
    else if (express == ZERO){
        if (x <= center - width){
            y = 0.0;
        }
        else if (x <= center){
            y = 1.0 / width * (x - center) + 1.0;
        }
        else if (x <= center + width){
            y = -1.0 / width * (x - center) + 1.0;
        }
        else{
            y = 0.0;
        }
    }
    else if (express == MORE){
        if (x <= center){
            y = 0.0;
        }
        else if (x <= center + width){
            y = 1.0 / width * (x - center);
        }
        else{
            y = 1.0;
        }
    }
    else {
        printf("wrong expression\n");
        exit(1);
    }

    return y;
};

// 前件部メンバーシップ関数(山5つ)クラス
class condition_MF5
{
private:
    double center;
    double width;
    SCALE express;
   
public:
    condition_MF5(double _center, double _witdth, SCALE _express){
        center = _center;
        width = _witdth;
        express = _express;
    };
    double func(double _x);
};


double condition_MF5::func(double _x)
{
// x,yは、メンバーシップ関数上の座標を示す
    double x = _x;
    double y = 0.0; // yの値は、必ず0以上1以下になる

    if (express == LESSLESS){
        if (x <= center - 2.0 * width){
            y = 1.0;
        }
        else if (x <= center - width){
            y = - 1.0 / width * (x - (center - 2.0 * width)) + 1.0;
        }
        else{
            y = 0.0;
        }
    }
    else if (express == LESS){
        if (x <= center - 2.0 * width){
            y = 0.0;
        }
        else if (x <= center - width){
            y = 1.0 / width * (x - (center - width)) + 1.0;
        }
        else if (x <= center){
            y = -1.0 / width * (x - (center - width)) + 1.0; 
        }
        else{
            y = 0.0;
        }
    }
    else if (express == ZERO){
        if (x <= center - width){
            y = 0.0;
        }
        else if (x <= center){
            y = 1.0 / width * (x - center) + 1.0;
        }
        else if (x <= center + width){
            y = -1.0 / width * (x - center) + 1.0;
        }
        else{
            y = 0.0;
        }
    }
    else if (express == MORE){
        if (x <= center){
            y = 0.0;
        }
        else if (x <= center + width){
            y = 1.0 / width * (x - (center + width)) + 1.0;
        }
        else if (x <= center + 2.0 * width){
            y = -1.0 / width * (x - (center + width)) + 1.0; 
        }
        else{
            y = 0.0;
        }
    }
    else if (express == MOREMORE){
        if (x <= center + width){
            y = 0.0;
        }
        else if (x <= center + 2.0 * width){
            y = 1.0 / width * (x - (center + 2.0 * width)) + 1.0;
        }
        else{
            y = 1.0;
        }
    }

    return y;
};

// 後件部メンバーシップ関数(山3つ)クラス  
class action_MF3
{
private:
    double center;
    double width;
    SCALE express;

    double x;
    double y;

public:
    action_MF3(double _center, double _witdth, SCALE _express){

        y = 0.0; // yの値は、必ず0以上1以下になる
       
        center = _center;
        width = _witdth;
        express = _express;
        
        if (express == LESS){
            x = center - width;
        }
        else if (express == ZERO){
            x = center;
        }
        else if (express == MORE){
            x = center + width;
        }
        else{
            printf("wrong scale expression\n");
            exit(0);
        }
    };
    
    void func_Max(double b){
        y = max(b, y);
    };
    
// X座標を返す
    double func_X(void){
        return x;
    };
    
    // (最大値で更新された、最後の)Y座標を返す
    double func_Y(){
        return y;
    };

};

// 後件部メンバーシップ関数(山5つ)クラス  
class action_MF5
{
private:
    double center;
    double width;
    SCALE express;

    double x;
    double y;

public:
    action_MF5(double _center, double _witdth, SCALE _express){
        y = 0.0; // yの値は、必ず0以上1以下になる
       
        center = _center;
        width = _witdth;
        express = _express;
        
        if (express == LESSLESS){
            x = center - 2.0 * width;
        }
        else if (express == LESS){
            x = center - width;
        }
        else if (express == ZERO){
            x = center;
        }
        else if (express == MORE){
            x = center + width;
        }
        else if (express == MOREMORE){
            x = center + 2.0 * width;
        }
        else{
            printf("wrong scale expression\n");
        }
    };
    
    void func_Max(double b){
        y = max(b, y);
    };
    
// X座標を返す
    double func_X(void){
        return x;
    };
    
    // (最大値で更新された、最後の)Y座標を返す
    double func_Y(){
        return y;
    };

};

int main()
{
    // ダイエット経過期間
    condition_MF3 Period_Short(14, 14, LESS); // 0日
    condition_MF3 Period_Middle(14, 14, ZERO); // 14日
    condition_MF3 Period_Long(14, 14, MORE); // 28日

    // いわゆる「停滞期」(14日間あたりの平均減重変化量)
    condition_MF3 WeighChange_Small(1.0, 1.0, LESS); // 0kg
    condition_MF3 WeighChange_Middle(1.0, 1.0, ZERO); // 1kg
    condition_MF3 WeighChange_High(1.0, 1.0, MORE); // 2kg

    // 苦痛度
    condition_MF3 Suffer_Zerol(400.0, 400.0, LESS); // 0
    condition_MF3 Suffer_Middle(400.0, 400.0, ZERO); // 400
    condition_MF3 Suffer_Hight(400.0, 400.0, MORE); // 800

    // BMI
    condition_MF5 BMI_lowlow(22.0, 3.0, LESSLESS); // 痩せすぎ(15.0)
    condition_MF5 BMI_low(22.0, 3.0, LESS);// 痩せぎみ(19.0)
    condition_MF5 BMI_Normal(22.0, 3.0, ZERO);// 普通(22.0)
    condition_MF5 BMI_High(22.0, 3.0, MORE); // 太りぎみ(25.0)
    condition_MF5 BMI_HighHigh(22.0, 3.0, MOREMORE);// 太りすぎ(28.0)

    // 一日の摂取カロリー
    action_MF5 Eat_LittleLittle(2500, 1000, LESSLESS); // 500 Kcal
    action_MF5 Eat_Little(2500, 1000, LESS);// 1500 Kcal
    action_MF5 Eat_Normal(2500, 1000, ZERO);// 2500 Kcal
    action_MF5 Eat_Lot(2500, 1000, MORE);// 3500 Kcal
    action_MF5 Eat_LotLot(2500, 1000, MOREMORE);// 4500 Kcal



    
    
    // 超シンプルシミュレータ投入
    // 体重変動シミュレーションプログラム
    //基礎代謝量と求め方	?ハリス・ベネディクト方程式(日本人版) 計算式
    //http://www.kintore.info/kisotaisya_mass/index.cgi
    //【計算式】
    // 男性 66.5+(体重kg×13.8)+(身長cm×5.0)-(年齢×6.8)
    // 女性 665.1+(体重kg×9.6)+(身長cm×1.9)-(年齢×7.0)							
    // 江端智一 2014日2月4日現在のデータを使って計算
    double weight = 78.0;  // 開始時の体重 78.0kg
    double lengthw = 172.0;  // 身長 172cm
    double age = 49.0 + 94/365;  // 開始時の年齢 49歳と94日 (2014年2月4日現在)

    // 最初の基礎代謝カロリー 男性  66.5+(体重kg×13.8)+(身長cm×5.0)-(年齢×6.8)
    double consumption_calorie =  
        66.5 + weight * 13.8 + 172.0 * 5.0 - age * 6.8;
    // このカロリーに運動消費カロリーを加えて、
    // トータルの一日の消費カロリーを算出する

    // (現在の体重 66.5kgにおいて)一日運動消費カロリー 708kcalと推定し、
    // このカロリーは、体重に比例するものと仮定する。
    consumption_calorie += weight/66.5 * 708.0;
    printf("consumption_calorie = %f\n",  consumption_calorie);

    double last_weight[14]; // 過去14日分の体重
    
    // 最初は全部同じ体重とする 14日経過までは同じ体重とする
    for (int i = 0; i++; i < 14){
        last_weight[i] = weight;
    }

    // ここからループ開始
    for (int day=0; day < 1460; day++){ // 1460日は、ちょうど4年分の日数
        // 7kcal = 1g = 0.001kg とする    

        // 体重データを一日分ずらす
        for (int i = 0; i++; i < 14-1 ){
            last_weight[i+1] = last_weight[i];
        }
        last_weight[0] = weight;
        
        // 線形補完の傾きだけを求める(14日分)
        // http://d.hatena.ne.jp/rainlib/20090112/1231735459
        double k1=0,k2=0,k3=0,k4=0;
        for (int i = 0; i++; i < 14 ){
            k1 += (double)i * (double)i;
            k2 += (double)i * last_weight[i];
            k3 += (double)i;
            k4 += last_weight[i] *last_weight[i];
        }
        double dW = (14.0 * k2 - k3 * k4) / (14.0 * k4 - k3*k3); // 14

        // BMIの計算式 体重(Kg)÷身長(m)÷身長(m) 江端の身長172cm
        double bmi = weight / 1.72 / 1.72;
        
        // [ルール1] ダイエット開始直後は、「無条件にがんばれる」
        double r1 = min(Period_Short.func(day));
        Eat_Little.func_Max(r1);
        //printf("r1: %f\n",r1);
        
        //printf("Eat_Little.func_X() = %f\n",Eat_Little.func_X());
        //printf("Eat_Little.func_Y() = %f\n",Eat_Little.func_Y());
        
        // [ルール2] ダイエット一ヶ月を過ぎても、停滞し続けると「切れる」
        double r2 = min(Period_Long.func(day),WeighChange_Small.func(dW));
        Eat_LotLot.func_Max(r2);
        //printf("r2: %f\n",r2);
        
        // [ルール3] ダイエット2週間を過ぎて、停滞し続けると「緩んでくる」
        double r3 = min(Period_Middle.func(day),WeighChange_Small.func(dW));
        Eat_Normal.func_Max(r3);
        //printf("r3: %f\n",r3);
        
        // [ルール4] 停滞期がなく順調に体重が落ちている場合は「がんばれる」
        double r4 = min(WeighChange_High.func(dW));
        Eat_Little.func_Max(r4);
		//        printf("r4: %f\n",r4);
        
        // [ルール5] ダイエット一ヶ月を過ぎて、再び太り出してくると、またダイエットを再開してしまう
        double r5 = min(Period_Long.func(day),BMI_High.func(bmi));
        Eat_Little.func_Max(r5);
        //printf("r5: %f\n",r5);
        
        // [ルール6] ダイエット一ヶ月を過ぎて、太り過ぎると、滅茶苦茶なダイエットを始めてしまう
        double r6 = min(Period_Long.func(day),BMI_HighHigh.func(bmi));
        Eat_LittleLittle.func_Max(r6);

        //printf("r6: %f\n",r6);
		/*        
        printf("Eat_LittleLittle.func_X() = %f\n",Eat_LittleLittle.func_X());
        printf("Eat_LittleLittle.func_Y() = %f\n",Eat_LittleLittle.func_Y());
        printf("Eat_Little.func_X() = %f\n",Eat_Little.func_X());
        printf("Eat_Little.func_Y() = %f\n",Eat_Little.func_Y());
        printf("Eat_Normal.func_X() = %f\n",Eat_Normal.func_X());
        printf("Eat_Normal.func_Y() = %f\n",Eat_Normal.func_Y());
        printf("Eat_Lot.func_X() = %f\n",Eat_Lot.func_X());
        printf("Eat_Lot.func_Y() = %f\n",Eat_Lot.func_Y());
        printf("Eat_LotLot.func_X() = %f\n",Eat_LotLot.func_X());
        printf("Eat_LotLot.func_Y() = %f\n",Eat_LotLot.func_Y());
        */
        
        double source_calorie =  
            (Eat_LittleLittle.func_X() * Eat_LittleLittle.func_Y() + 
             Eat_Little.func_X() * Eat_Little.func_Y() +
             Eat_Normal.func_X() * Eat_Normal.func_Y() +
             Eat_Lot.func_X() * Eat_Lot.func_Y() +
             Eat_LotLot.func_X() * Eat_LotLot.func_Y() )  
            /
            (Eat_LittleLittle.func_Y() + 
             Eat_Little.func_Y() +
             Eat_Normal.func_Y() +
             Eat_Lot.func_Y() +
             Eat_LotLot.func_Y() ) ;
        
        printf("\n source_calorie = %f\n",source_calorie);

        double diff_weight = (source_calorie - consumption_calorie)/7.0 / 1000.0;
        weight += diff_weight;
        age += 1.0/365.0;
        consumption_calorie =  66.5 + weight * 13.8 + 172.0 * 5.0 - age * 6.8;
        consumption_calorie += weight/66.5 * 708.0;
        //       printf("day:%d\tweight = %f\tconsumption_calorie =%f\n", day,weight, consumption_calorie);
    }



}

ファジィ推論

 

2022/09,江端さんの忘備録

私のウイークエンドは、ウイークデーよりも、忙しいことがあります。

My weekends are sometimes busier than weekdays.

コラムの締切などもありますが、会議が入らない気安さからプログラミングが捗ってしまう、などの理由もあります。

The reasons are for a deadline for column, and for programming, with the ease of not interruptions.

という訳で、私にとって疲労のピークは、月曜日の朝です ―― クタクタになっています。

So, the peak of my fatigue comes to Monday morning --- it is an "exhaustion".

で、最近は、月曜日の午前中に、スーパー銭湯に行って、サウナに入って、肩凝りを直してきています。

So recently, on Monday morning, I go to a super public bath, taking a sauna and fixing my stiff shoulders.

テレワークばんざいです。

Remote work, hurrah!

そのスーパー銭湯は、食事処の料理が美味しくて、私は、そこで「蕎麦」を食べるのをとても楽しみにしています。

In the restaurant of the super public bath, the dishes are delicious. I enjoy eating "Soba" at the restaurant.

-----

―― 風呂に入って、蕎麦をたぐる

"Taking a bath, and eating soba"

って、お前、江戸っ子を気取っているのか、と思われるかもしれませんが、そういう訳ではないのです。

However, I don't want to pretend "Edokko".

関東は蕎麦が旨いです。

Soba is delicious in Kanto area.

これは、私が地方出身者だからかもしれません。

This may be because I am from a rural area.

----

私の実家である名古屋周辺は、うどんが美味しいです。

Udon is delicios around Nagoya city where my country house is.

しかし、私は実家周辺での『おいしい蕎麦屋』というものを、私は知りません ―― というか、実家の周辺に、蕎麦屋を思い浮べることができません。

However, I don't know of any 'good soba restaurants' around my parents' house -- or rather, I can't think of any soba restaurants around my parents' house.

では、学生時代の京都はどうか?

Then, how about Kyoto when I was a student?

うん、学生時代は、ラーメンと牛丼と生姜焼き定食しか食べていなかったので、うどんも蕎麦も1mmも浮んで来ません。

Yeah, when I was a student, I only ate ramen, beef bowls and ginger-yaki set meals, so neither udon nor soba noodles come to mind.

比して、関東は、立ち食い蕎麦のレベルでも、十分に美味しいです。

In contrast, in the Kanto region, even the standing-only soba restaurants are delicious enough.

------

食べ物と言えば ―― 米国の、しかも内陸部のコロラド州で「納豆」を手に入れるには、本当に大変な思いをしたものです。

Speaking of food -- I had a really hard time getting "natto" in the U.S., and in the landlocked state of Colorado.

私は、生れて始めて、外国で、『日本人コミュニティ』というもの力に頼らざるを得ませんでした。

For the first time in my life, I had to rely on the power of the "Japanese community" in a foreign country.

『"納豆"の為なら、"孤高"を諦める』という覚悟も必要だったのです。

I had to be prepared to "give up my isolation" for the sake of "natto".

"外国で生きるとは"、ある意味こういうことです。

This is "living in a foreign country" in a sense.

閑話休題。

Now let's return to the main subject.

-----

当たり前なのですが『旨い蕎麦は高い』です。

As a matter of course, good soba is expensive.

私は旨い蕎麦を、たらふく食べたいですが、法外な料金を払う気にはなれません。

I want to eat delicious soba, but I am not willing to pay exorbitant prices for it.

しかし、蕎麦の自作はやらないつもりです。なぜなら、蕎麦打ちにはまった奴は、(私が知る限り、例外なく)嫌な奴になるからです。

However, I will not be making my own soba. Because anyone who gets into soba making (as far as I know, without exception) becomes a jerk.

"水が"、"温度が"、"打ち方が"、とか語り始めたら、『0秒で、そいつと絶交してやる』くらいの気持ちがあります。

If they start talking about "the water," "the temperature," or "the way to make", I'm going to cut them off in zero seconds.

ともあれ、私は、蕎麦が好きです。

Anyway, I like soba.

2022/09,江端さんの技術メモ

長女が125CCのバイクに乗り替えてから、放置し続けてきたバイクが動かなくなった、というので、廃棄処分にするか相談を受けていたのですが ―― 私には、どうにも故障に見えない。

 

バイク屋で見て貰った時間は、3秒くらい。

簡単に言えば、「スピードメータに、オイル交換やらバッテリーやらの電飾表示が出ないので、充電してもダメ」ということらしい。ただし「スターターが壊れている可能性もあるが、まずはバッテリーを交換してみないと分からん」と言われました。

で、早速Amazonで購入。もっとも安いもので2000円、リチウムは16000円もするのでスコープ外として、今回はこれにしました。

購入の判断は、評価者数の多さと(1040個の評価)と、

評価の分布でした。私は、こういう正規分布に近い評価を見ると、安心できます。

さて、これが届くまでの間、バイクの空気圧の補充をしに、ガススタンドにいっていました。150~200PKは必要なのに、90くらいしか入っていませんでした。


本日の昼前にバッテリーが届いたので、さきほど5分くらいで、バッテリー交換しました(一度やっているので、コツは掴んでいる)。

ちゃんと充電されて配送されてきた。感心、感心。

バッテリーボックスの回りにガムテープを貼っているのは・・・以前、きちんとバッテリー収納ボックスを開けてみたはいいが、閉めれなかったんだろうな~、と推測。 → 保険証を貼りつけていたことを思い出した。

古いバッテリーを取り出す。

新しいバッテリーに交換。

無事、インジケータの表示とセル起動を確認して、バイク復活を確認しました。

バッテリー不良ごときで、バイクが廃棄されたかもしれないかも、と考えると、さすがの私も「もったいない」と思います。

敢えていうのであれば、「面倒くさい」あたりがしっくりきます。

3000円程度であれば、今後もバッテリー交換を繰替えせば良いと思うけど、もしかしたら、バッテリー液交換(で遊ぶ)かもしれないので、自分の為に、マニュアルを添付しておきます。

しかし、我が家には、当然のように、テスターや、電圧可変ができる安定化電源(ジャンク屋で拾ってきた)があるのだけど、一般家庭にはないかもしれません。

こういうDIYをサクっとできるのは、そういうことが好きな人間だけの特権かもしれません。

以上

2022/09,江端さんの忘備録

先日、こちらの内容を公開しました。

A few days ago, I publishded the following diary.

―― 『とある宗教団体』を直撃する内容

予想を越える人数の方からの「購読希望」のメールが来ていまして、驚いています。

I was surprised to receive "subscription request" e-mails from more people than I expected.

(応募者が0人が、連続2日を経過した段階で、配布を予定しております)

(After zero applicant after two consecutive days, I will publish it. )

-----

今回のコラムの反応の少なさを見て、

Watching the reactions of this columns,

『外したかなぁ』とガッカリしていたのですが、今は、自分でもどう評価したらいいのか分からなくなっています。

I was disappointed, saying "I missed the mark", however, now I don't know the how to evaluate this column.

仮説ですが、

Just a hypothesis,

―― 宗教団体のネタにコメントすると、面倒くさいことになる

"I will be in trouble if I comment about a cult religion group"

という実情を反映しているかもしれないなぁ、と思っています。

I wonder if some readers might know the reality well.

-----

実際に、面倒くさいです ―― 私は、よく知っています。

In fact, they are the worst. I know well that.

江端さんの技術メモ

Golangは「一つのディレクトリの中に、一つの実行形式を作る」というスタイルようです。

で、そのディレクトリから、"go run ." とやるだけで、動き出すので、直感的に取扱いが良いです(まあ、好みの問題とは思います)。

├── RASSimulator
│   ├── bike.go
│   ├── cert.pem
│   ├── channel.go
│   ├── key.pem
│   ├── person.go
│   ├── real_person.go
│   ├── routing
│   │   └── librouting.go
│   ├── simulator.go
│   ├── util.go
│   └── virtual_person.go
├── REALSimulator
│   ├── bike.go
│   ├── cert.pem
│   ├── channel.go
│   ├── key.pem
│   ├── person.go
│   ├── real_person.go
│   ├── routing
│   │   └── librouting.go
│   ├── simulator.go
│   ├── util.go
│   └── virtual_person.go

で、現在、RASSimulator REALSimulator  の中身は、simulator.go 以外は、全く同じ となっていまして、simulator.go以外のファイルを変更する時は、その変更が同時に反映する必要があります(ライブラリ化するのが面倒くさい、という理由もある)。

一方のディレクトリのファイルを変更すれば、他方のディレクトリに直ちに反映されれば、良いのです。

これは、Unix系では"ln"コマンドを使えば、一発で解決する内容なのですが、これがWindows10でもできるかどうかかが分かりませんでしたが、どうやら、その方法はあるようです。

https://www.wannko.net/windows10/etc/sinlink.html

に記載がありました。

(というか、Microsoftも意地はらんと、Command.comのコマンド、全部UNIX系に全部合わせていけばいいのに、と思うんだが・・権利関係かなぁ? しかし、コマンドなんぞに権利が発生するのかなぁ?)

管理者モードでコマンドプロンプトを開いて、以下のようにフルパスで記載すると作成できるようです(私の場合フルパスで書かなかった場合失敗しました)

c:\Users\ebata\20220830rev196kai>mklink /D c:\users\ebata\20220830rev196kai\REALSimulator c:\users\ebata\20220830rev196kai\RASSimulator
c:\users\ebata\20220830rev196kai\REALSimulator <<===>> c:\users\ebata\20220830rev196kai\RASSimulator のシンボリック リンクが作成されました
ただ、このようにディレクトリを丸ごとリンクしてしまうと、ディレクトリにファイルを追加しても、他方のディレクトリにも反映されてしまって、困ったことになりました。
という訳で、面倒ですが、simulator.go以外のファイルは全て手動でリンクするようにします。
まずリンクを解除するために、REALSimulatorを削除します。
現在、こんな感じです。
c:\Users\ebata\20220830rev196kai>ls -la REALSimulator
lrwxrwxrwx 1 ebata ebata 45 Sep 5 15:53 REALSimulator -> /c/users/ebata/20220830rev196kai/RASSimulator
で、
c:\Users\ebata\20220830rev196kai>rm REALSimulator
c:\Users\ebata\20220830rev196kai>ls -la REALSimulator
ls: cannot access 'REALSimulator': No such file or directory
c:\Users\ebata\20220830rev196kai>ls -la RASSimulator
total 112
drwxr-xr-x 1 ebata ebata     0 Sep  5 15:59 .
drwxr-xr-x 1 ebata ebata     0 Sep  5 16:05 ..
-rw-r--r-- 1 ebata ebata 11551 Sep  3 20:41 bike.go
-rw-r--r-- 1 ebata ebata  1643 Jul 19 19:45 cert.pem
-rw-r--r-- 1 ebata ebata  5952 Aug 17 18:31 channel.go
drwxr-xr-x 1 ebata ebata     0 Sep  2 01:32 data
-rw-r--r-- 1 ebata ebata  1704 Jul 19 19:45 key.pem
-rw-r--r-- 1 ebata ebata 13029 Aug 28 19:50 person.go
-rw-r--r-- 1 ebata ebata  4259 Sep  3 16:33 real_person.go
drwxr-xr-x 1 ebata ebata     0 Sep  2 01:32 routing
-rw-r--r-- 1 ebata ebata 13164 Sep  5 15:58 simulator.go
-rw-r--r-- 1 ebata ebata 13163 Sep  5 15:57 simulator.go~
-rw-r--r-- 1 ebata ebata  8633 Sep  2 14:43 util.go
-rw-r--r-- 1 ebata ebata  3164 Sep  3 20:39 virtual_person.go
c:\Users\ebata\20220830rev196kai>
OK。これで、元の状態に戻っています。
では、迂遠ではありますが、simulator.go を除いたリンクを一斉に貼ります。
mklink c:\users\ebata\20220830rev196kai\REALSimulator\bike.go c:\users\ebata\20220830rev196kai\RASSimulator\bike.go
mklink c:\users\ebata\20220830rev196kai\REALSimulator\cert.pem c:\users\ebata\20220830rev196kai\RASSimulator\cert.pem
mklink c:\users\ebata\20220830rev196kai\REALSimulator\channel.go c:\users\ebata\20220830rev196kai\RASSimulator\channel.go
mklink c:\users\ebata\20220830rev196kai\REALSimulator\key.pem c:\users\ebata\20220830rev196kai\RASSimulator\key.pem
mklink c:\users\ebata\20220830rev196kai\REALSimulator\person.go c:\users\ebata\20220830rev196kai\RASSimulator\person.go
mklink c:\users\ebata\20220830rev196kai\REALSimulator\real_person.go c:\users\ebata\20220830rev196kai\RASSimulator\real_person.go
mklink c:\users\ebata\20220830rev196kai\REALSimulator\util.go c:\users\ebata\20220830rev196kai\RASSimulator\util.go
mklink c:\users\ebata\20220830rev196kai\REALSimulator\virtual_person.go c:\users\ebata\20220830rev196kai\RASSimulator\virtual_person.go
mklink /D c:\users\ebata\20220830rev196kai\REALSimulator\data c:\users\ebata\20220830rev196kai\RASSimulator\data
mklink /D c:\users\ebata\20220830rev196kai\REALSimulator\routing c:\users\ebata\20220830rev196kai\RASSimulator\routing

で、simulator.goだけは本体をコピペして、こんな感じになりました。

以上

 

 

2022/09,江端さんの忘備録

アルコールを摂取しなくなってから、異様なほど「甘味」を欲するようになりました。

After stopping drinking, I come to prefer to get "sweets".

以前は、ケーキやシュークリームなどの洋菓子が好きだったのですが、現在は、もっぱら和菓子を食べています。

I used to like western sweets such as cakes and cream puffs, but now I prefer to eat Japanese sweets.

まず、洋菓子は和菓子よりカロリーが格段に多いことに加えて、和菓子は腹持ちがいいという感じがします(主観ですが)。

First of all,the calories of westren sweet is several times higer than those of Japanese sweets, and Japanese sweets seem to feel full subjectively.

夜中に、漫画「であいもん」などを読んでいると、和菓子が食したくなって、軽いパニックになります。

When I read the comic "Deaimon" in midnight, I come to panic to want to eat Japanese sweets.

和菓子専門店でなくても、スーパーで売っている、4つ入りで188円くらいの大福餅も、十分に美味しいです。

Daifukumochi, sold in supermarkets, even if that is not in Japanese sweets specialist, for about 188 yen for a pack of four, is good enough.

昔、安い和菓子はこんなに美味しくなかったような気がします ―― メーカー各社の営業努力に感謝です。

I don't think cheap Japanese sweets used to taste good. We appreciate the sales efforts of the manufacturers.

-----

総じて、最近、味覚のパラダイムシフトが激しいような気がします。

In general, I feel that there has been a severe paradigm shift in my taste recently.

この夏に一人で実家に帰省した際には、ずっと外食していました ―― 父も母もいない家で、食事を作って、キッチンを汚すのも面倒だな、と思いまして。

When going back to the country house, I was eating out all the time. Though I like cooking, I didn't like to dirty the kitchen in the house without my father and mother.

あんなに美味しいと思っていた「餃子の王将」定食や「吉野家」の牛丼が、昔のように感じられないことにショックを受けています。

I am shocked that the "Gyoza no Ousho" set meals and "Yoshinoya" beef bowls, which I thought were so delicious, do not feel like I used to.

『中華料理専門店の中華料理は、とても美味しい』ということを、今ごろ再発見しています。

I am rediscovering nowadays that 'Chinese food at Chinese specialty restaurants is very delicious'.

2022/09,江端さんの忘備録

先日、こちらのコラムをリリースして頂きました。

Recently I released a column of mine.

先週金曜日に、EE Times Japan編集部から前半全面削除の提案を受けたのち、週末に江端が頭を抱えながら捻り出した、100%江端オリジナルの新しいカルト宗教が「江端教」です。

こちらにも書いてある通り、今回の原稿は、編集部からの「前半の全面削除」の提案を受け受けて、私から「前半の全面書き直し」を逆提案させて、書き直したものになっています。

As noted here, this column was rewritten in response to the editorial board's proposal to "delete the first half in its entirety" and my counter-proposal to "rewrite the first half in its entirety.

今回のコラムを読んで頂いた方は、すでにピーンと来ているとは思いますが、今回の私の「書き直し前のオリジナルの原稿」は、

If you've read this column, I'm sure you've already noticed. The "original column before the rewrite" is a

―― 『とある宗教団体』を直撃する内容

"Direct attack on 'a certain religious group'"

となっています。

-----

『せっかく書いたのだから、誰かに読んで貰いたいなぁ』と思っています。

I hope that, "I want someone to read it, since I completed it".

そこで、オリジナル原稿を、こっそり配布させて頂こうかと考えています。

Therefore, we would like to distribute the original manuscript in secret.

もし、購読ご希望の方がいらっしゃったら、このメールアドレスのサブジェクトに『オリジナル原稿購読希望』とだけ記載して、私に送付して下さい。

If you want to read it, please mail me with the mail-address adding the subject "Original manuscript subscription request".

あいさつ、自己紹介等、一切不要です。

No greetings, self-introductions, etc. are required.

希望者がまとまった時点で、一斉にURL(https://kobore.net/....)を、Bccで送付させて頂きます。

After some applicants come, I will send the URL(https://kobore.net/....) at the same time with Bcc style.

もちろん、送付して頂いたメールアドレスは、配送後に完全廃棄した上で、「江端ファイアウォール」を発動しますので、ご安心下さい。

「江端ファイアウォール」とは

Of course, please be assured that the email address you send us will be completely destroyed after delivery and the "Ebata Firewall" will be activated.

どれくらいの方が「オリジナル原稿」に興味を持たれるか、『私、気になります』("氷菓"風)。

I'm curious to see how many people will be interested in the "original manuscript" ("Hyouka" style).