M1の感想

2024 のM1は非常に面白かった。

 

今回のM1は注目すべきポイントが3つあった。

 

一つが今回が20回目のアニバーサリーであるという点だ。それに伴い参加者も一万人を超える記念すべき回である。M1を作っているABCも、気合がはいっていた。オープニングは30分を超え、またM1の創始者?である島田紳助からのコメントもあった。

 

二つ目が審査員の変更だ。権威の象徴である松本人志がいなくなり、審査員がだれになるのか?など世間の関心が寄せられた。新しい審査員は、ノンスタ石田笑い飯哲夫、オードリー若林となっており、納得のラインナップ。自分はリトルトゥースであるため、若様の起用には心が沸いた。当日の若様のビジュもよく、テンションが上がった。

 

最後が令和ロマンが2連覇できるのかという点だった。過去M1にもチャンピョンがM1に出場したことがあるが、いずれもストレートで決勝には進めなかった(敗者復活で言った。)一方去年の令和ロマンはストレートで決勝に進むという快挙をなしていた。

 

結果は、令和ロマン、文句なしの優勝。

前人未踏の偉業達成の瞬間はとてもドキドキした。

というか、今回は、あまりに御神籤の順番が神がかっていた。

去年のチャンプ+去年の一番目+優勝候補最有力の令和ロマンが一番になるという、ドラマチックな展開に、自分は一人声出し、拍手してしまった。劇的すぎる。

2番目も去年の2位ヤーレンズ。わくわくが止まらない。

本当に真空ジェシカの3番目までがあまりに面白すぎた。

おもしろすぎて、もたない。

 

特に好きだった漫才は、ばってりぃずの一本目、エバース、真空ジェシカの一本目。

全員面白かった。個人的にはトムブラウンを応援していたのだけど、会場にはまらず悔しい。扇風機の首振り機能とか馬鹿みたいに面白かったのに。でも確かに去年の敗者復活のような衝撃はなかった。ラストイヤーお疲れ様です。これからもびっくりするような漫才を続けてほしいと思った。ラストイヤーといえばダイタクもよかった。最初の伝家の宝刀は完璧に決まった。というか、自分には効果抜群で、会場の受けはあまり見れていないので、完璧だったということにしている。

来年も楽しみ。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

築地市場に行ってみた。

いけてる男の一日はかっこいい朝から始まる。 実現すべく、朝ごはんの質を変える必要があった。 東京の朝ごはんといえば、築地市場である。

築地市場はもともと、中と外があった。 10年ほど前の移転は、中に対してであり、外はそのままということであった。 中はプロ向けというか本当に市場の機能を持っている部分である。 外は、築地場外市場とよばれ、中で購入した鮮魚などを一般人に売る機能を持っている。 そのため、朝ごはんという意味では築地市場に行けばよい。 (移転後も流通経路を担保されるようになっており、場外市場は今も盛況である。)

朝ごはんを食べるため、8時ごろにつくように向かった。 少し早いと思ったが、そうでもない。 目当ての店の前にはすでに行列ができていた。 目当ての店の名前はきつねや。牛丼やホルモン丼が有名である。 たくさん朝ごはんを食べたかったため、単品で頼みたかったが、 単品では購入不可であった。 そこで、ホルモン煮+お酒を購入することにした。 御酒orビールと頼めば、単品購入にはならない。 1月の朝はとても寒い。 御酒は少し温かく助かった。 そして肝心のホルモン煮はとてもおいしかった。 大満足である。

本当は他にも食べたかったが、海鮮系はほとんどインバウンド価格で手も足も出なかった。

その代わりといっては何だが、近くに銀だこの本店があったので、 そこでプレーンのたこ焼きを食べた。

近くの築地本願寺のカフェで朝ごはんが食べられるらしい。 たくさんの小鉢があって、かわいい朝ごはんだ。 機会があればここも訪れたいと思う。

筋トレ 1日目 ( 70kg)

# ゴールドジム行ってみた。

 

事前にweb入会を行い、実際に ゴールドジムに行った。

最初は初心者講習を6回受講可能であり、それには予約が必要である。

 

内容は簡単で、

・腹筋

・チェストプレス

・ラットプルダウン

・レッグプレス

について教えていただいた。

正しいフォームで、身体の動かし方を学ぶというのが、この講習の目標のようだ。

 

 

ダイエットするよ (0日目 / 168cm / 69 kg)

ダイエット始めます (0日目 / 168cm / 69 kg)

背景

年末に親戚で集まった。 いとこには子供がすでにおり、 その子たちは18歳や20歳などもう大人の年齢になっていた。 困った、その子たちのビジュがよい。全然かっこいい、全然かわいい。 夢があり、成長している。 一方、私は加齢により皺も増え、肌は汚く、体重も単純増加している。 また、おじさんおばさんからは結婚せぇ、パートナーを作らんかいと、 彼らの価値観も全くアップデートしていない。 自分は、成長をしていない側になっている。 恥ずかしい。 情けない。 そのような状況から脱却すべく、見た目をよくすることを決意した。

まずしたこと。

ジムの入会を決めた。 - 流行りのチョコザップ、 - 知人が通っていたエニタイム、 - 春日が通うゴールドジム、 そのほか複数のジムが選択肢にあったが、 複数の情報ではゴールドジムをおすすめしていたため、 ここにした。 具体的な理由は - 自分の家から近いため - 他のジムに比べ 3000円ほど高価だが、その分の治安が良いこと、周りから良い影響を得られると思ったため - 筋トレの知識がないため、初心者講習が受講可能なのがよいと思ったため - 高価なものには理由があるという価値観があるため である。

現在ゴールドジムでは入会費無料キャンペーンをやっているためタイミングもよい。 初期費用が 2か月分. 20000円を払い入会手続きを進めた。

# 年末年始にすること

年末年始

結構長い時間取れた。 最近全く勉強ができていないため、ここでインプットをできるようにしたい。 積読の消化が必要だ。 今読みたいとおもっているのは 「オブジェクト指向でなぜ作るのか」という本だ。 C#を書き始めたのだが、フォームを使ったアプリを作るときの構造がめちゃくちゃになった。 結局どのように書くのがよかったのか? これの回答がオブジェクト指向を学ぶ中にあると感じた。 従っていまさらながらオブジェクト指向を学ぶことにした。 この本は有名らしく、多くのサイトで紹介されている。 この本のレビュー、まとめ、行うことを最低限の目標にして年末年始を過ごすことにする。

あと、たくさん disney を見ることが目標だ。

再帰下降構文解析

再帰下降構文解析

背景

IF分岐の条件文の評価をする必要が出た。 また、ライブラリを使うことができないため、自分で実装する必要があった。 調べてみると再帰下降構文解析を使うのがよいらしい。 初め、演算子と項をわけて、優先順位をつけて計算する方式を考えたが、面倒だし、分かりにくい。 再帰的に構文解析をしていく方がずっと分かりやすいし、効率的だと思ったので、この方法を採用した。

内容.

優先順位が高い計算を先にする方式.

和しかない.

まず簡単な例として、和しかない数式を計算する例を見る.

#include <string>
#include <vector>

/// 数式
const char* eq = "1+2+7";
/// 数式をパースするための iterator
int itr = 0;
/// スタックとして利用
std::vector<int> stack;

int Calc() {
    Term1(); // A+B の結果をスタックにつめる
    return stack.pop();
}

/// A + B + C + ... をパースして、スタックに詰める
void Term1() {
    Term2();                        // A+B の A をスタックにつめる
    while (eq[itr] != 0) {
        if (eq[itr] == '+') {
            itr++;
            Term2();                // A+B の B をスタックに詰める
            int r = stack.pop();    // A+B の B
            int l = stack.pop();    // A+B の A
            stack.push_back(l + r); // A+B を スタックにつめる
        }
    }
    return;
}

/// 数字をパースして、スタックに詰める.
/// itr は数字の最後の次まで進める.
void Term2() {
    int val = 0;
    while ('0' <= eq[itr] && eq[itr] <= '9') {
        val = val * 10 + atoi(eq[itr]);
        itr++;
    }
    stack.push_back(val);
}

この場合、再帰的な処理は不要. イメージとしては、 項 → 演算子 → 項 → 演算子 → 項 → ... と文字列を解析していく. 途中途中で計算をしていくが、その計算に必要な情報はスタックにおいておく。 そして計算に必要になったらスタックから値を取り出し、計算をした後に、またスタックに詰める. という流れで解析していく。 この単純な例ではスタックである必要はない. 次の例でスタックである必要がわかると思う。

上の 1+2+7 を計算する例では, - Term() で 1 をまずパースして、スタックに 1 を詰める (この時 itr は '+' に移動)

  • '+' がみつかったので itr++ して、Term() を実行できるようにする

  • Term() で 2 をパースして スタックに 2 をつめる. (この時 itr は 次の '+' に移動)

  • スタックにある 1 と 2 をポップし、計算結果 1+2=3 をスタックに詰める.

  • '+' がみつかったので itr++ して Term() を実行できるようにする

  • Term() で 7 をパースして スタックに 7 をつめる. (この時 itr は 最後 '\0' に移動)

  • スタックにある 3 と 7 をポップし、計算結果 3+7=10 をスタックに詰める.

  • itr は 文字列の最後になるため、whileからぬける。

  • 計算結果はスタックに詰まっているため、これを返す.

和と積しかない数式

次に、和と積のみしか存在しない数式を考える。 先ほどの Calc() の関数はそのままに Term() の中身を変える.

考え方としては以下のような考え方 : 23 + 123 という計算を A + B ととらえて A を (23) という項, B を (123) という項 という考え方をする.

この 23 や 12*3 は先ほどの和のみの計算式の場合と同様に 足し算の部分を掛け算にして、スタックに計算結果を積んでいくようにする.

int Calc() {
    Term0();
    return stack.pop();
}
/// A + B + C + ... をパースして、スタックに詰める
void Term0() {
    Term1();                        // A+B の A をスタックにつめる
    while (eq[itr] != 0) {
        if (eq[itr] == '+') {
            itr++;
            Term1();                // A+B の B をスタックに詰める
            int r = stack.pop();    // A+B の B
            int l = stack.pop();    // A+B の A
            stack.push_back(l + r); // A+B を スタックにつめる
        }
    }
    return;
}

/// A*B*..*Z をパースして、スタックに詰める.
void Term1() {
    Term2();                        // 
    while (eq[itr] != 0) {
        if (eq[itr] == '*') {
            itr++;
            Term2();                // A*B の B をスタックに詰める
            int r = stack.pop();    // A*B の B
            int l = stack.pop();    // A*B の A
            stack.push_back(l * r); // A*B を スタックにつめる
        } else {                    // + や \0 にぶつかったら retrun;
            return;
        }
    }
}

/// 数字をパースして、スタックに詰める.
/// itr は数字の最後の次まで進める.
void Term2() {
    int val = 0;
    while ('0' <= eq[itr] && eq[itr] <= '9') {
        val = val * 10 + atoi(eq[itr]);
        itr++;
    }
    stack.push_back(val);
}

優先順位が高いものが深い階層関数になる. ここで計算結果をスタックにつめる必要性があることがわかる.

和と積、そして単項演算子 - がある数式.

次に単項演算子を追加する.

int Calc() {
    Term0();
    return stack.pop();
}

/// A + B + C + ... をパースして、スタックに詰める
void Term0() {
    Term1();                        // A+B の A をスタックにつめる
    while (eq[itr] != 0) {
        if (eq[itr] == '+') {
            itr++;
            Term1();                // A+B の B をスタックに詰める
            int r = stack.pop();    // A+B の B
            int l = stack.pop();    // A+B の A
            stack.push_back(l + r); // A+B を スタックにつめる
        }
    }
    return;
}

/// A*B*..*Z をパースして、スタックに詰める.
void Term1() {
    Term2();                        // 
    while (eq[itr] != 0) {
        if (eq[itr] == '*') {
            itr++;
            Term2();                // A*B の B をスタックに詰める
            int r = stack.pop();    // A*B の B
            int l = stack.pop();    // A*B の A
            stack.push_back(l * r); // A*B を スタックにつめる
        } else {                    // + や \0 にぶつかったら retrun;
            return;
        }
    }
}

/// 単項演算子 - を含む数字をパースしてスタックに詰める.
void Term2() {
    if (eq[itr] == '-') {
        itr++;
        Term2();                // -A の A を スタックに詰める.
        int v = stack.pop();    // -A の A
        stack.push_back(-v);    // -A としてスタックに詰める
    } else {
        Term3();
    }
}

/// 数字をパースして、スタックに詰める.
/// itr は数字の最後の次まで進める.
void Term3() {
    int val = 0;
    while ('0' <= eq[itr] && eq[itr] <= '9') {
        val = val * 10 + atoi(eq[itr]);
        itr++;
    }
    stack.push_back(val);
}

単項演算子をパースする際は再帰関数を利用する。 linkにあるように単項演算子は右から評価されるが、再帰はこの性質を満たす。

さらに () を加えた場合.

() の優先順位は 数字をパースする次に高い. () が始まると、和から開始しないといけないため、ここでも再帰を利用する.

int Calc() {
    Term0();
    return stack.pop();
}

/// A + B + C + ... をパースして、スタックに詰める
void Term0() {
    Term1();                        // A+B の A をスタックにつめる
    while (eq[itr] != 0) {
        if (eq[itr] == '+') {
            itr++;
            Term1();                // A+B の B をスタックに詰める
            int r = stack.pop();    // A+B の B
            int l = stack.pop();    // A+B の A
            stack.push_back(l + r); // A+B を スタックにつめる
        } else {
            return;
        }
    }
}

/// A*B*..*Z をパースして、スタックに詰める.
void Term1() {
    Term2();                        // 
    while (eq[itr] != 0) {
        if (eq[itr] == '*') {
            itr++;
            Term2();                // A*B の B をスタックに詰める
            int r = stack.pop();    // A*B の B
            int l = stack.pop();    // A*B の A
            stack.push_back(l * r); // A*B を スタックにつめる
        } else {                    // + や \0 にぶつかったら retrun;
            return;
        }
    }
}

/// 単項演算子 - を含む数字をパースしてスタックに詰める.
void Term2() {
    if (eq[itr] == '-') {
        itr++;
        Term2();                // -A の A を スタックに詰める.
        int v = stack.pop();    // -A の A
        stack.push_back(-v);    // -A としてスタックに詰める
    } else {
        Term3();
    }
}

/// () を計算し、スタックに詰める
/// 
void Term3() {
    if (eq[itr] == '(') {
        itr++;
        Term0();            // 和から計算しなおしてスタックに詰める
        if (eq[itr] == ')') itr++
    } else {
        Term4();
    }
}

/// 数字をパースして、スタックに詰める.
/// itr は数字の最後の次まで進める.
void Term4() {
    int val = 0;
    while ('0' <= eq[itr] && eq[itr] <= '9') {
        val = val * 10 + atoi(eq[itr]);
        itr++;
    }
    stack.push_back(val);
}

チラーの原理

チラーの原理

冷却器のことをチラーと呼んでいる。 原理をざっくりいうと、冷媒をとおして AからBに熱を移動させることで、Aを冷やす。

チラーの簡単なシステムを考える 冷媒は環状に A→B→A のように移動する。

熱は温度が高いところから低いところへ移動するため、 - Aを通るとき冷媒は低い温度にすれば、Aから熱を吸収させる - Bを通るとき冷媒は高い温度にすれば、Bに熱を放出させる ことが可能.

また、状態方程式 PV = nRT より - 減圧すれば、冷媒を低い温度に - 加圧すれば、冷媒を高い温度に することが可能。

この二つの現象を用いて A→ 加圧 → 冷媒の高温化 → 冷媒より低い温度のBに熱を放出 → 冷媒が低温化 → 減圧 → 冷媒をさらに低温化 → Aを通すことで熱を吸収(Aを冷やす) → 加圧... (繰り返す)

ようにすることで冷やすらしい.