M1の感想
2024 のM1は非常に面白かった。
今回のM1は注目すべきポイントが3つあった。
一つが今回が20回目のアニバーサリーであるという点だ。それに伴い参加者も一万人を超える記念すべき回である。M1を作っているABCも、気合がはいっていた。オープニングは30分を超え、またM1の創始者?である島田紳助からのコメントもあった。
二つ目が審査員の変更だ。権威の象徴である松本人志がいなくなり、審査員がだれになるのか?など世間の関心が寄せられた。新しい審査員は、ノンスタ石田、笑い飯哲夫、オードリー若林となっており、納得のラインナップ。自分はリトルトゥースであるため、若様の起用には心が沸いた。当日の若様のビジュもよく、テンションが上がった。
最後が令和ロマンが2連覇できるのかという点だった。過去M1にもチャンピョンがM1に出場したことがあるが、いずれもストレートで決勝には進めなかった(敗者復活で言った。)一方去年の令和ロマンはストレートで決勝に進むという快挙をなしていた。
結果は、令和ロマン、文句なしの優勝。
前人未踏の偉業達成の瞬間はとてもドキドキした。
というか、今回は、あまりに御神籤の順番が神がかっていた。
去年のチャンプ+去年の一番目+優勝候補最有力の令和ロマンが一番になるという、ドラマチックな展開に、自分は一人声出し、拍手してしまった。劇的すぎる。
2番目も去年の2位ヤーレンズ。わくわくが止まらない。
本当に真空ジェシカの3番目までがあまりに面白すぎた。
おもしろすぎて、もたない。
特に好きだった漫才は、ばってりぃずの一本目、エバース、真空ジェシカの一本目。
全員面白かった。個人的にはトムブラウンを応援していたのだけど、会場にはまらず悔しい。扇風機の首振り機能とか馬鹿みたいに面白かったのに。でも確かに去年の敗者復活のような衝撃はなかった。ラストイヤーお疲れ様です。これからもびっくりするような漫才を続けてほしいと思った。ラストイヤーといえばダイタクもよかった。最初の伝家の宝刀は完璧に決まった。というか、自分には効果抜群で、会場の受けはあまり見れていないので、完璧だったということにしている。
来年も楽しみ。
築地市場に行ってみた。
いけてる男の一日はかっこいい朝から始まる。 実現すべく、朝ごはんの質を変える必要があった。 東京の朝ごはんといえば、築地市場である。
築地市場はもともと、中と外があった。 10年ほど前の移転は、中に対してであり、外はそのままということであった。 中はプロ向けというか本当に市場の機能を持っている部分である。 外は、築地場外市場とよばれ、中で購入した鮮魚などを一般人に売る機能を持っている。 そのため、朝ごはんという意味では築地市場に行けばよい。 (移転後も流通経路を担保されるようになっており、場外市場は今も盛況である。)
朝ごはんを食べるため、8時ごろにつくように向かった。 少し早いと思ったが、そうでもない。 目当ての店の前にはすでに行列ができていた。 目当ての店の名前はきつねや。牛丼やホルモン丼が有名である。 たくさん朝ごはんを食べたかったため、単品で頼みたかったが、 単品では購入不可であった。 そこで、ホルモン煮+お酒を購入することにした。 御酒orビールと頼めば、単品購入にはならない。 1月の朝はとても寒い。 御酒は少し温かく助かった。 そして肝心のホルモン煮はとてもおいしかった。 大満足である。
本当は他にも食べたかったが、海鮮系はほとんどインバウンド価格で手も足も出なかった。
その代わりといっては何だが、近くに銀だこの本店があったので、 そこでプレーンのたこ焼きを食べた。
近くの築地本願寺のカフェで朝ごはんが食べられるらしい。 たくさんの小鉢があって、かわいい朝ごはんだ。 機会があればここも訪れたいと思う。
ダイエットするよ (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を冷やす) → 加圧... (繰り返す)
ようにすることで冷やすらしい.