OmniAICreator/Qiita-1.07M huggingface dataset:
オブジェクト指向プログラミング(抽象データ型)は、やっぱりカプセル化がうまくいかない

https://qiita.com/saitofjp/items/7ab7b7fec9da0ca363fa

の振り返りの振り返りの見てて思い付きのメモです。

お題は、タイトル通り
> 適切な場所で情報開示することが難しい

と、`抽象データ型`の相性ってやっぱ悪いよねー？という話


## カプセル化の問題点(再載)

悪い側面

* ~~状態管理を隠匿するアイディアの失敗~~ 今回は削り
* 適切な場所で情報開示することが難しい

また、カプセル化は、あくまでも情報隠匿であり、良い悪いがあるはずなのに、"良い"のイメージが強く乱用されている。
"悪い"の分かりやすい例として、ValueObject(同時に盛り上がってた)の文脈で出てくる、局所化しすぎて不適切な場所からの情報開示がある。

例えば、
```
年齢によるサイトの利用制限がある際に、利用制限の判定メソッドを年齢オブジェクトに生やしてしまう。
```
たぶん、どっかにもっと良い記事あるはず。

さらに、本来開示されるべき情報さえも、不要に情報隠匿してしまうことがある。処理の流れを理解のに大きな妨げになる。Inputに対してのOutputとしてシンプルに表現した方が分かりやすいことも多い。

-- ここまで

今回は、"不要に情報隠匿してしまう"を取り上げたいと思います。

## やっぱりカプセル化の情報開示がうまくいかない


### お題

これをお題として、コード上の抽象表現を考えてみます。
```
🐶 解決対象
「GoogleまたはFacebookで認証属性を取得したい」
🐶 モデル 
* 認証属性を取得する
* GoogleまたはFacebookを取得に利用する
```

### 安易にinterfaceで抽象化

```java
interface AuthAttributeProvider
  getAttribute()
```
よくある抽象化に見えますが、このオブジェクトを利用する「ユーザー」からは、`Google`と`Facebook`が利用されることが、完全に分からなくなります。"`getAttribute`を正しく履行することが出来ます。その中身は教えません"というinterfaceとしては正しいのですが、`Google`と`Facebook`は本来開示されるべき情報で、それさえも不要に隠匿されてしまいます。(だよね？)

### あえて抽象型を導入しない

```java
class GoogleAuthAttributeProvider
  getAttribute()
class FacebookAuthAttributeProvider
  getAttribute()
```
だったら愚直に定義してしまえとなり、こうすると`Google`と`Facebook`を利用するという情報が伝えられるようになります。が、これはこれで普通に問題があります。(前回、推してたやつですが、前回は開発手法ありきの文脈なわけで、今回は抜き去って考えます)

"認証属性を取得する"という共通性の情報が隠れるどころか"消えて"しまいます。そして、これは"ユーザー"の利用上の負担を増大させます。"関連するデータの集合とその振舞いを閉じ込める"という、そもそものカプセル化という目的がうまくいっていません。

### 組み合わせる

```java
interface AuthAttributeProvider
//の実装で
class GoogleAuthAttributeProvider
class FacebookAuthAttributeProvider
//↑を利用する
```

だったら全部盛り
`AuthAttributeProvider`の実装で、`Google`と`Facebook`に移譲するなりして分割すればよい。こちらはオブジェクトとモデルが対応するため、↑二つに比べると良い分割が出来たように感じます。

ですが、"ユーザー"視点に立ち返るとどうでしょうか。`Google`と`Facebook`が見えないことは同じで、不要な情報隠匿してることは変わりません。

### すると、代数的データ型？

言語とか抜きで、"ユーザー"の視点に対して、全ての情報を開示したまま分割を考えるとどうでしょうか。代数的データ型とかぱっと思いつきます。
```TypeScript
type AuthAttributeProvider = GoogleAuthAttributeProvider | FacebookAuthAttributeProvider
```
これなら、定義情報にも`Google`と`Facebook`が残り、両者の共通性をもって適切に抽象化されてるので、良い感じに感じます(語彙なし)？

## まとめ抽象データ型あまりいらなくない？

まとめると、単一の抽象データ型と振る舞い(ポリモーフィズム)だけでは、現実世界のそれをうまく分割できないため、やはり歪みを感じます。複数のデータ型と、それにまたがるインターフェースが必要です。それが無ければ自然な表現が出来ません。これは代数的データ型や型クラス的なアレがないと無理なんじゃないかなと感じます。

あとは暴論で、個人の開発能力の成長の過程で、抽象データ型によるカプセル化が難しいと感覚的に気付くタイミングがある気がします。気づいてしまうと、抽象データ型がめんどくて窮屈なものでしなく、interface(抽象型)を使って疎結合に保つ機構としてしか使わなくなります。これが今のオブジェクト指向プログラミングの正体ではないでしょうか。それって、抽象データ型としてのオブジェクト指向プログラミングは、終わった。よね！

抽象データ型に、`直和`を足してあげれば良いだけとか言われそうだけど、まあまあ。


## あとがき

カプセル化の情報隠蔽ってそういう意味じゃないよーとか、分かる方は教えて頂けると助かります。なんか不安。
キーセレモニー とは

## 勉強前イメージ

パーティ的な・・・ってことしか思い浮かばない

## 調査

### キーセレモニー とは

Key ceremony と書いて、公開鍵暗号を使う仕組みで鍵のペアを使う手続きを鍵の式典としてキーセレモニーといいます。
特にDNSの.jpソーンのDNSSEC署名の鍵のペアの手続きを `.jp DNSSECキーセレモニー` と言われています。

[DNSSEC](https://qiita.com/miyuki_samitani/items/0f26423cf54d7bd20c07) とはDNSの情報に電子署名を付けてデータの発行元が正しいという検証ができる拡張仕様です。
DNSSECは公開鍵暗号のデジタル署名の技術が使われています。
その鍵の一連の手続きがあり、第三者の立ち会いのもとで行われています。

キーセレモニーは.jpの管理をしているJPRS(株式会社日本レジストリサービス)が行います。
キーセレモニーのチェックシートなど見ることができます。
もちろんルートゾーンのキーセレモニーもあり、それはyoutubeでオンライン中継したアーカイブを見ることができます。

## 勉強後イメージ

ルートゾーンのキーセレモニーのアーカイブ、ちらっと見たけど6時間くらいあった。。
それだけ正しく公正にしないといけないのね。

## 参考

- [キーセレモニーとは](https://www.nic.ad.jp/ja/basics/terms/key-ceremony.html)
- [キーセレモニー](https://jprs.jp/glossary/index.php?ID=0201)
【Linux】複数ファイルの作成等を行う

## 複数ファイルを扱う方法
以下のように`{}`で括り、`,`で区切ることで複数ファイルを扱うことができます。
```
{file1,file2}
```

### `touch`コマンド
```
$ touch {index.html,style.css}
```

### `mkdir`コマンド
```
$ mkdir {dir1,dir2}
$ touch {dir1/index.html,dir2/style.css}
```
STM32F767を使た、Mbed2でHALのLチカ


目的
最軽量化

PB0(LED1)をLチカする。

x Mbed2のリビジョンは、143



```c++


#include "mbed.h"

//DigitalOut myled(PB_0);

int main() {

  __HAL_RCC_GPIOB_CLK_ENABLE();

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


    while(1) {
        //myled = 1;
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
        wait(0.2);
        //myled = 0;
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
        wait(0.2);
    }
}





```
M1 Maxでnumpyが遅い問題の対処法

## 2024/08/11 追記

上記の日時でまたnumpyをインストールしてみましたが、やはり通常のインストールだと遅いままでいした。

---

公式に説明や警告が無いので意外と認知されていないが、普通にnumpyをインストールすると*動作が遅いバージョンがインストールされちゃいます*。
どれくらい遅いかというと下記の300*300の行列の特異値分解を100回行う処理の平均実行時間を計測すると...

```python
import time
import numpy as np

np.random.seed(42)
a = np.random.uniform(size=(300, 300))
runtimes = 10

timecosts = []
for _ in range(runtimes):
    s_time = time.time()
    for i in range(100):
        a += 1
        np.linalg.svd(a)
    timecosts.append(time.time() - s_time)

print(f"mean of {runtimes} runs: {np.mean(timecosts):.5f}s")
```

### 普通のnumpy

```shell
mean of 10 runs: 5.69588s
```

### 早いnumpy

```shell
mean of 10 runs: 1.08510s
```

なんと五倍の差がある。

## インストール方法

numpyインストール時にblasのビルドを指定するだけ。

```shell
conda install numpy 'blas=*=*accelerate*'
```

M1ユーザーは是非お試しあれ。
YouTubeの動画をレスポンシブ対応して背景として埋め込んでみた

## はじめに
ブラウザにてYouTubeの動画を背景として表示する方法を、簡単に解説していこうと思います。
動画の表示については、iframeを用いたやり方となります。

背景として扱いたいので、

・動画は自動再生する
・動画が終了したら同じ動画をループ再生する
・ユーザの操作を禁止する
・動画の枠は丸める

このような要件で実装していきます。

## ソースコード

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="jOzzbez" data-user="ryota-shimajiri" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ryota-shimajiri/pen/jOzzbez">
  Untitled</a> by 島尻 亮汰 (<a href="https://codepen.io/ryota-shimajiri">@ryota-shimajiri</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## レスポンシブ対応

まずはこちら、

```:CSS
aspect-ratio: 16/9;
```

親要素からアスペクト比を直接指定して、レスポンシブ対応を行っています。

```:CSS
padding-top: 56.25%;
```

こちらでも同じことができますが、個人的にはaspect-ratioの方が直観的に分かりやすいかなーと思います。

ちなみにIEのサポートが2022年6月で終了したので、今後はaspect-ratioが本格的に使われるようになるかもしれません。

## 自動再生

再生動画のURLのクエリパラメータに、
autoplay=1 と mute=1を指定することで自動再生が行えます。

```
?autoplay=1&mute=1
```

## ループ再生
再生動画のURLのクエリパラメータに、
loop=1 と playlist={video_id}を指定することでループ再生が行えます。

video_idはこのURLの場合、一番最後にある「JjLUn3JAqOU」となります。
```
https://www.youtube.com/embed/JjLUn3JAqOU
```

## ユーザ操作を禁止
controls=0を設定するとシークバー（コントロールバー）を非表示にできます。
さらにdisablekb=1でキーボード操作を無効化します。

```
controls=0&disablekb=1
```

全て指定するとこのようになります。

```:HTML
src="https://www.youtube.com/embed/JjLUn3JAqOU?autoplay=1&mute=1&playsinline=1&loop=1&playlist=JjLUn3JAqOU&controls=0&disablekb=1"
```
さらにCSSでポインターイベントも無効にします。

```:CSS
pointer-events: none;
```

## 動画の枠を丸める

要素の境界の外側の角を丸めていきます。
こちらもCSSで一行で実装できます。
```:CSS
border-radius: 8px;
```


以上で完成です。

## 参考
https://developer.mozilla.org/ja/docs/Web/CSS/aspect-ratio

https://developer.mozilla.org/ja/docs/Web/CSS/pointer-events

https://coosy.co.jp/blog/cls-aspect-ratio/

https://webty.jp/staffblog/production/post-3046/
ローカルコンポーネントとグローバルコンポーネント

# 定義
## ローカルコンポーネントとは
特定のVueインスタンス内でしか使えないようなコンポーネント

## グローバルコンポーネントとは
どのインスタンスでも使うことができるコンポーネント

# コンポーネントの使い方
ローカルコンポーネント、グローバルコンポーネント共にhtmlは共通で以下のように設定する。
```html:html
<div id="app">
  <p>インスタンス１：</p>
  <my-component></my-component>
</div>
```
## ローカルコンポーネント

```javascript:javascript
var MyComponent = {
  template: `
    <form>
      <input type="text">
      <button type="submit">送信</button>
    </form>
  `　
}
var vm = new Vue({
  el: "#app",
  components: {
    'my-component': MyComponent
  }
})
```
「var vm」でインスタンスを生成し、それに対して「My Component」のローカルコンポーネントを割り当てている。

## グローバルコンポーネント
```javascript:javascript
Vue.component("my-component", {
  template: `
    <form>
      <input type="text">
      <button type="submit">送信</button>
    </form>
  `
})
const mv = new Vue({
  el: '#app'
})
```
「Vue.component」でコンポーネントを生成しており、「const mv」とは直接関連していない。

# ローカルとグローバルの違い例
ローカルとグローバルで具体的な使い方を参考にどのような部分に違いが出てくるのかを検証してみる。

## ローカルコンポーネント
```html:html
<div id="app">
  <p>インスタンス１：</p>
  <my-component></my-component>
</div>
<div id="app2">
  <p>インスタンス２：</p>
  <my-component></my-component>
</div>
```

```javascript:javascript
var MyComponent = {
  template: `
    <form>
      <input type="text">
      <button type="submit">送信</button>
    </form>
  `　
}
var vm = new Vue({
  el: "#app",
  components: {
    'my-component': MyComponent
  }
})
var vm2 = new Vue({
  el: "#app2"
})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727168/70bb7c2c-c878-831e-8b90-d03643ce137c.png)

「app」の方ではコンポーネントを設定しているが、「app2」の方ではコンポーネントを設定していないため、インスタンス1のみに送信フォームが表示されている。

## グローバルコンポーネント
```html:html
<div id="app">
  <p>インスタンス１：</p>
  <my-component></my-component>
</div>
<div id="app2">
  <p>インスタンス２：</p>
  <my-component></my-component>
</div>
```

```javascript:javascript
Vue.component("my-component", {
  template: `
    <form>
      <input type="text">
      <button type="submit">送信</button>
    </form>
  `
})
const mv = new Vue({
  el: '#app'
})
const mv2 = new Vue({
  el: '#app2'
})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727168/baceacf8-7c40-c717-6684-65f01727fce5.png)


この場合はどちらのインスタンスでも生成することができる。

# リンク
[第20回 Vue.js入門　グローバルコンポーネントとローカルコンポーネント](https://konsuki.com/411/#:~:text=%E3%81%BE%E3%81%A8%E3%82%81-,%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%8D%E3%83%B3%E3%83%88%E3%81%A8%E3%81%AF,%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82)
Google Spreadsheetで西暦を和暦にカンタンに変換する関数 (DateTimeFormatを利用)

この投稿では、Google Spreadsheetで、西暦の日付を和暦の年に変換する関数を紹介します。

## Google Spreadsheetには和暦を表示する書式がない

Google Spreadsheetは「2022/08/04」のような日付を入力すると、日付フォーマットとしてあつかうことができます。しかし、対応しているフォーマットは西暦だけです。令和のような和暦を表示するフォーマットがありません。

Google Spreadsheetビルトインの日付関係の関数でも、和暦に変換するような関数がありません。

## 意外とめんどくさい和暦

Google Spreadsheetで、西暦の日付から和暦に変換するには、式を編む方法もあります。

しかし、西暦の年数と和暦の年数は必ずしも一致しないので、式でやってしまうと複雑化するのが問題になります。たとえば、令和元年は2019年5月1日からです。2019年は平成31年と令和元年、どちらの可能性もあるわけです。また、平成元年や令和元年のような1年目を元年とする場合も、分岐が必要になります。こうした分岐処理を式で表現するのは、結構面倒です。

## 和暦に変換するカスタム関数をGoogle Apps Scriptで自作する

そこで、細かい規則を一切気にしないでやる方法に、JavaScriptのビルトインライブラリDateTimeFormatを使う方法があります。

これを用いると、「令和元年」や「平成31年」といった年数を簡単に求めることができます。

DateTimeFormatを使ったカスタム関数の実装は次のようになります。

```js:コード.gs
const warekiFormat = new Intl.DateTimeFormat("ja-JP-u-ca-japanese", {
  era: "long",
  year: "numeric",
});

/**
 * 日付から和暦の年を返す
 * @param {number|Date} date - 日付
 * @return {string} 和暦の年の文字列
 * @customfunction
 */
function WAREKI(date) {
  let dateObject;
  if (typeof date === "number") {
    dateObject = new Date(date, 0, 1);
  } else if (date instanceof Date) {
    dateObject = date;
  } else {
    throw new Error("Invalid date " + typeof date);
  }
  return warekiFormat.format(dateObject);
}
```

このコードを見てのとおり、日付による細かい分岐を自分で書く必要はありません。

## WAREKI関数の使い方

上で宣言した`WAREKI`関数がGoogle Spreadsheetで利用できます。

日付の値に対して`WAREKI`関数を使うと、

![20220804_092115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/b0395a2d-4925-7316-9e69-b8c861b93dab.png)

次のように和暦の年が求められます。

![20220804_092122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/c08df516-b1e6-7537-706e-8e184353fbfb.png)

また、西暦の数値に対して、`WAREKI`関数を使った場合、

![20220804_092254.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/e28ac390-ee2f-b255-0bad-f440551085b9.png)

次のように与えられた西暦の1月1日の時点の和暦の年が求められます。

![20220804_092258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/7ef02790-2b81-ff13-fafa-06aa04273ea3.png)
iRICソフトウェア　利用環境について

# iRIC version3.Xの利用環境

## 必須
- OS　Windows　7/8/10/11（いずれも64bitOS）
- マウス

※上記OS以外では、iRICは動作しません。

## 推奨
- 高速インターネット環境
- CPU　intel i5以上のスペック
- メモリ　4GB以上
- HDD　5GB以上の空き容量

※当然ではありますが、ハイスペックな環境のほうが快適にご利用いただきます。
※また大規模な計算を行ためには、ハイスペックな環境が必要になります。
※プロキシを利用している方は、場合によってうまく動作しない場合があります。システム管理者にプロキシ設定に係る事項を確認してください。
「レムニスケート（英: lemniscate)」について調べてみた。

オリジナル

https://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%A0%E3%83%8B%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%88

https://en.wikipedia.org/wiki/Lemniscate

# DeepL翻訳で

別の訳語一覧：
れんじゅけい
連珠形
レムニル

# Mathematicaで

(以下絵省略)
ContourPlotは陰関数曲線をプロットすることができる：

```python
ContourPlot[(x^2 + y^2)^2 == x^2 - y^2, {x, -1, 1}, {y, -1, 1}]
```


参考
https://mathworld.wolfram.com/Lemniscate.html


# Sageで
勉強中

https://doc.sagemath.org/html/en/reference/plot3d/sage/plot/plot3d/implicit_plot3d.html

# 入試問題

https://qiita.com/mrrclb48z/items/5921eafb95557007b6ff

# 参考

https://www.sora-w.com/gallery/marriage/lemniscate/#:~:text=%E3%80%8C%E3%83%AC%E3%83%A0%E3%83%8B%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%88%E3%80%8D%E3%81%AF%E3%80%81%E6%A5%B5%E5%BA%A7%E6%A8%99%E3%81%AE,%E7%84%A1%E9%99%90%E8%BB%8C%E9%81%93%E3%82%92%E6%8F%8F%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82


https://mathworld.wolfram.com/Lemniscate.html


https://en.wikipedia.org/wiki/Lemniscate_elliptic_functions



https://math.stackexchange.com/questions/723801/parametrization-of-the-lemniscate


https://www.google.com/search?q=%E3%83%A1%E3%83%8D%E3%82%AF%E3%83%A0%E3%82%B9%E3%81%AE3%E6%9B%B2%E7%B7%9A&oq=%E3%83%A1%E3%83%8D%E3%82%AF%E3%83%A0%E3%82%B9%E3%81%AE3%E6%9B%B2%E7%B7%9A&aqs=chrome..69i57.54550j0j7&client=ms-android-huawei&sourceid=chrome-mobile&ie=UTF-8


mathematica で

https://www.google.com/search?q=%E3%83%AC%E3%83%A0%E3%83%8B%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%88%E3%80%80mathematica+&rlz=1C1GCEB_enJP1054JP1054&ei=T-GCZJrYJs_pwQPWjbGYDQ&ved=0ahUKEwjau-WT4bX_AhXPdHAKHdZGDNMQ4dUDCA8&uact=5&oq=%E3%83%AC%E3%83%A0%E3%83%8B%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%88%E3%80%80mathematica+&gs_lcp=Cgxnd3Mtd2l6LXNlcnAQAzoKCAAQRxDWBBCwAzoHCAAQigUQQzoFCAAQgAQ6BwgAEAQQgAQ6BQghEKABOggIIRCgARCLA0oECEEYAFCiBljVXmCWZGgGcAF4AIABe4gBjhCSAQQyMi4zmAEAoAEBuAECwAEByAEK&sclient=gws-wiz-serp


https://mathworld.wolfram.com/EightCurve.html

＞トーラスを切る

http://ob.aitai.ne.jp/~horibe/TORUS/index.htm

#### 文献

https://www.amazon.co.jp/Mathematica-%E6%9B%B2%E7%B7%9A%E3%81%A8%E6%9B%B2%E9%9D%A2%E3%81%AE%E5%BE%AE%E5%88%86%E5%B9%BE%E4%BD%95-%E3%82%B0%E3%83%AC%E3%82%A4/dp/4810189198
【夏休み企画】#IT用語一問一答【毎朝投稿1日目】CDN

# この記事を読むと、、
- 「関連用語」を使って「CDN」を説明できるようになる
- 「CDN」がもっと好きになる(多分)

# 関連用語
Origin Server / Cache Server / Edge Server / TTL / Cache Hit Ratio

[**復習用**] 記事の内容を見る前に上記の言葉でCDNを説明してみよう！

# 企画説明
- クラウドって何？って人に聞かれて説明してるけど俺もよく知らないや、、
- ドキュメント読んでみてるけど半分くらい何言ってるか分かんない、、
- 今日の夕飯はナスの炒めものにしよっかな〜、あれ、NASってなんだっけ？

みたいなことが結構あったので、知ったかしていたIT用語を毎日一個ずつちゃんと学んでいこうっていう企画です！

#### 注意事項

- 選ばれるIT用語の順番には脈絡がないよ
- 間違いがあったら教えてほしいよ
- 記事の内容は結構ざっくりだよ

# CDNとは
CDN = Content Delivery Network とは **html, css, js, 画像や動画などの提供したいコンテンツをキャッシュしてくれるサーバー群のこと**

- 提供したいコンテンツを元々持ってるサーバー = **Origin Server**
- キャッシュしてくれるサーバー = **Cache Server** = **Edge Server**
- Cache ServerがOrigin Serverからのコンテンツをキャッシュする期間 = **TTL** = Time-To-Live
    - これが短いとOrigin Serverが提供するコンテンツの変更が素早く反映される
    - TTLという用語は別の文脈でも使われるから注意
- Cache Serverへのリクエストのうち、キャッシュを返せた割合 = **Cache Hit Ratio**

CDNのおかげで
- RTTが短くなる
- Origin Serverの負荷、帯域の負荷を抑えられる
- 回線の混雑などのネットワークトラブルにも強い

# 調べている時にでてきたなにこれ用語(おまけ)
- RTT = Round-Trip Time = アクセス元からアクセス先までの往復の通信にかかる時間
- CNAME record = Canonical Nameの意味で、あるホスト名を別のホスト名のAレコードで解決させるDNSレコード
    - サブドメインやCDNの設定に用いられる
- IXP = Internet Exchange Point = ISPの管理するネットワークの境界部
    - 多くのCDN Cache Serverが置かれている
- Anycast routing = 渡されたリクエストを適切な(近かったり負荷に余裕があったりな)サーバーにルーティングする方法
    - DDoS = Distributed Denial of Serviceに有効
- Minification = コメントを削除するなどして、ブラウザにおける処理を変えずにコードを短くすること
- GZip = ファイルの圧縮・解凍に用いられるファイル形式
    - .gz拡張子はこれのこと

# 参考資料
- https://www.cloudflare.com/learning/cdn/what-is-a-cdn/
- https://www.cloudflare.com/learning/cdn/glossary/round-trip-time-rtt/
- https://www.cloudflare.com/learning/cdn/glossary/time-to-live-ttl/
- https://en.wikipedia.org/wiki/Internet_exchange_point
- https://en.wikipedia.org/wiki/Gzip
Salesforce での VLOOKUP 入力規制での使用


元の質問 : [Vlookup validation rule specific to Accounts](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HEcd9SAD)

よく分からんけどVLOOKUPは返値がbooleanだと思うのでNameとは比較できないんじゃないかな？

```
(ISNEW() || ISCHANGED(Name)) && VLOOKUP( $ObjectType.myobject__c.Fields.Name, $ObjectType.myobject__c.Fields.Name , Name) = Name
```

しかし、このブログの説明を読んでもこの関数の使い方は理解できません。何だろうこの出来損ないみたいな関数は。
ExcelのVLOOKUPとは全然挙動が違うな。

相変わらず名前を一緒にするなと言いたい。ややこしい。

[Using VLOOKUP Validation Rules in Salesforce](https://adminhero.com/2017/03/13/using-vlookup-validation-rules-salesforce/)
Nextjsでchakra-uiのCSSが効かなくなった


ひょんなことから急に（？）chakra-uiのCSSが適用されなくなってかなりハマったので残しておきます。

結論から言うと、**chakra-ui自体を再インストールしたら治った**んですけど悔しいので経緯から話させてください。
再インストールのコマンドは下の方に書いてあります。

## ディレクトリ構成を変えたらcssが効かなくなった

ことの経緯なのですが、まずNextjsをデフォルトで開始すると、 `pages`　ディレクトリはプロジェクト直下にあると思います。
なのですが、色々調べていると`src` 配下にまとめたほうがいいみたいな記事をちらほら見かけます。
以前reactのプロジェクト作っていたときも`src`配下に色々とまとめていたのでこのnextjsのプロジェクトもそうしようと思ったのです。



・・・が、CSSが動かなくなりました。

ただなにかしらの設定ファイルをいじればいけるようになるだろうと思って色々とググってはみたものの全然解決はせず。

developertoolsで実際にどうなってるのか確認してみると、
colorの部分に、
`gray.800`
という形でchakyra-uiの書き方そのままが充てられていることに気づきました。

・・・まあだからといってなにかひらめいたわけでもないんですけど。

そしてさらに、

```
<Heading as="h1" fontSize={{ base: "md", md: "2xl" }}>
```

というふうに書いている部分があったんですけどここの、h1をh3に変えたりするとそこはきちんと変更されるんですよね。

まあだからといってなにかひらめいたわけでもないんですけど。


## 結論

chakra-uiを再インストールしたら直しました。

```
npm uninstall @chakra-ui/react @emotion/react@^11 @emotion/styled@^11 framer-motion@^6 --save
```

してから、

```
npm i @chakra-ui/react @emotion/react@^11 @emotion/styled@^11 framer-motion@^6
```


することで事なきを得ました。

めでたしめでたし。

この問題でせっかく早起きして作業したのに1時間以上費やしてしまったorz
100日後くらいに個人開発するぞ！day065

## 今日はRuby on Railsの基礎を学んでみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/91d54fa3-a858-5378-699a-45ea83e14227.png)


## 今日の学び
### Railsアプリケーションの準備
* Railsで開発を始めるには`rails new アプリケーション名`というコマンドをターミナルで実行する
    * 入力したアプリケーション名と同名のフォルダが作成され、その中に開発に必要なフォルダやファイルが用意される


### サーバーの立ち上げ
* 開発中のアプリケーションをブラウザで表示するにはサーバーの起動が必要
* サーバーの起動は`rails server`というコマンドの実行で完了する
* サーバー起動後にブラウザで`locaolhost:3000`というURLにアクセスすると色画面が表示されるようになる

### トップページを自動生成してみる
* トップページを作成するには`rails generate controller home top`というコマンドをターミナルで実行する
    * このコマンドを実行すると新しいWebページが自動作成されて「localhost:3000/home/top」というURLにアクセス
Databricksノートブックの処理状態をタブから確認できるようになりました

こちらの機能改善です。

https://docs.databricks.com/release-notes/product/2022/july.html#notification-upon-notebook-completion

ノートブックが実行中の状態になるとタブに実行中であることを示すアイコン![Screen Shot 2022-08-04 at 7.24.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c0ce7b73-bff3-9100-d510-f4e471744cf7.png)が表示されます。処理が完了すると![Screen Shot 2022-08-04 at 7.25.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/40417836-c2c2-ff5a-f896-230095d0741c.png)
に戻ります。これで「あれ、実行中のノートブックのタブどれだったっけ？」ということがなくなります。

1. ノートブックを開いた状態では、通常のアイコンがタブに表示されています。
![Screen Shot 2022-08-04 at 7.21.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f1f89d73-9d8e-8abb-e8d1-7bc73676bea8.png)
1. 処理が実行されている間はアイコンが変化します。
![Screen Shot 2022-08-04 at 7.21.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/715ed9a1-358c-ae58-d0a7-e182109c5761.png)
![Screen Shot 2022-08-04 at 7.21.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/874d39a0-57cd-47db-4ab1-e5c989d1a65d.png)

個人的にはこういった改善好きです。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
APL1117で可変電圧回路

壊れたルーターから追いはぎした、APL1117というレギュレータで可変電圧回路を作ってみました。

APL1117は3.3Vなどの固定電圧タイプもあるのですが、1.8Vと3.3Vで共通の部品が使えるようにするためか、可変のものが使われていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/3f808ffd-cd8d-ad96-2619-ab457953c47e.png)

1kΩの手持ちが無かったので、R2が5KΩでR1が680Ωで作りました。微調整できるように多回転トリマタイプの半固定を使うのが良いようです。

![写真（2022-08-04 7.01） #2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/3415c2fa-71ba-3a16-d31d-51bb1e7da14c.jpeg)

![写真（2022-08-04 7.02）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/51e2fefe-8b85-6570-2484-b53781a1cd95.jpeg)

12Vのアダプターだと1.3Vから10Vくらいまででますが、5Vのアダプタだと1.3Vから4.5Vくらいまでです。

ワイヤーはホールに入れてハンダ付けすると、曲がってしまってストレスになるので、水平に出すほうが良い気がしています。

電池の代わりに3Vや6Vで使うのが良いかなと思って作りました。3Vにして出来損ないの[DSPラジオ](https://qiita.com/yamori813/items/95bee3cfbf945745d6d4)の電源にしてみましたが、問題なく使えました。
ローカルでシェル芸botと同じ実行環境を用意する方法

Twitterにて[\#シェル芸](https://twitter.com/hashtag/%E3%82%B7%E3%82%A7%E3%83%AB%E8%8A%B8?src=hashtag_click)で投稿すると実行結果を表示してくれる[シェル芸bot](https://twitter.com/minyoruminyon)というものがあります。
が、シェル芸botと同じ(近い)bash実行環境を用意する方法がわからず困りました。
# 結論
```bash
docker run --rm -it theoldmoon0602/shellgeibot
```
[リポジトリにDockerイメージが載っていました](https://github.com/theoremoon/ShellgeiBot/#official-docker-image)
街コン負けたから定期実行してみた

## はじめに
どうもこんにちは。

先日会社の人と街コンと言われる恋活パーティーに参加してきました。
初めてのコンパ + 最近在宅ワークで人と関わる機会がなかったので、ワクワクドキドキ。
いい出会いがあるのではと、微かな希望を持って臨みました。

結果は、、、

負け....
連絡先は交換できたものの、次に繋がる出会いは得られず・・・

くぅぅぅ。。。
パーティー自体は楽しかったのでよかったのですが、悔しさが残る初戦でした（また行くのかよ）

誰かにお疲れさまですと言って欲しいだけなのに。その道のりは長そうです。
いつ彼女は作れるのやら、、、
・
・
・
ん、彼女を作る・・・？
そこで私は閃きました。

（彼女が）作れないなら、（プログラムを）作ればいいんだ！

まさに逆転の発想。灯台下暗し。
このためにエンジニアになったのだと思わせるほどの衝撃でした。

ということで今回は、

**1時間おきに彼女（仮想）に「お疲れさまです」と言われる定期実行**

を作っていきたいと思います。

## 実現方法
定期実行はcronを使用することで実現できます。

## cronとは
簡単にいうと
「**指示した時間に指定したプログラムを動かしてくれるやつ**」
です。

UNIX系のOS（Linuxとか）に入っているプログラムのひとつであり

定期的に設定した処理を自動で実行してくれます。
* メルマガ配信
* 月間の売上の集計
* バックアップ
* たまったゴミファイルを削除する

などを実行したい際に使われます。

## cronの設定方法
cronに対して「いついつに、このプログラムを動かせ」と指示をするときは
`crontab` というコマンドを使います。

crontabコマンドは以下です。

```bash
# cron設定の編集・登録
crontab -e

# cron設定の表示
crontab -l 
```

オプションは他にもありますが、最低限ここを押さえておけばいいでしょう。

`crontab -e` でcronを開いたあとは、`vim`を使って記述します。
`vim`の使い方がわからない方は下記を参考ください！

https://qiita.com/marrontan619/items/dc99db67cf4c0a25a327

## cronの書き方
実行時間は、**分、時、日、月、曜日**を指定します。

```bash
#初期状態
* * * * * （コマンド）

# 指定の順番は以下
分 時 日 月 曜日 （コマンド）
```

初期状態「* * * * *」では毎分ごとにコマンドが実行されます。
「 * 」と「 * 」の間は半角スペース分空けてください。

### 設定例

```bash
# 毎月1日の午前9時30日分にコマンドを実行する場合
30 09 1 * * （コマンド）

# 毎週月曜日の午前9時30分にコマンドを実行する場合
30 09 * * 1 （コマンド）

# 毎時0分に1時間おきにコマンドを実行する場合	
* */1 * * * (コマンド)
```

### 補足
* `曜日`：0〜7で設定。0=日曜,1=月曜,2=火曜,3=水曜,4=木曜,5=金曜,6=土曜,7=日曜
* `/`：分,時,日を間隔で指定

## 1時間おきに彼女（仮想）にお疲れさまですと言われるには
皆さんお待たせしました。
ここから
「1時間おきに彼女（仮想）にお疲れさまですと言われる」処理を
cronを使って定期実行設定していきます。

### ファイル構造

```bash
 -  /Users/username/Documents/batch_cron
 	-  otukareVoice.sh
 	-  audio
		-  otukaresamadesu.mp3
```

## 実行処理（シェルスクリプト）

```bash
#!/bin/sh
afplay /Users/username/Documents/batch_cron/audio/otukaresamadesu.mp3
osascript -e 'display notification "あと6時間はいける♫" with title "今日もお疲れ様です。" sound name "Submarine"'
```

今回はotukareVoice.shというシェルスクリプトファイルを作成し処理を記述。
**優しいお姉さんが「お疲れさまです」といってくれる音声**(otukaresamadesu.mp3)をダウンロードしました笑
興味のある方は下記のリンクから聞いてみてください笑

https://hinanogimaya.com/943/

### 補足
`afplay`：音楽再生コマンド
`osascript -e`：macで横から通知をしてくれるスクリプト
`/dev/null 2>&1`：下記の記事を参照ください。

https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea

## cronの設定

```ba
# 1時間おきにotukareVoice.shを実行する
0 /1 * * * sh /Users/toyodakengo/Documents/batch_cron/otukareVoice.sh > /dev/null 2>&1
```

## 動作確認
![otukaresama.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710265/18e19baf-445b-be96-8c7e-63d36edbcf3a.png)
1時間おきに彼女（仮想）が「お疲れさまです」という声と共に
「あと6時間はいける」と煽ってくる定期実行が完成しました♫

これで仕事が捗ること間違いなしですね！


## 最後に
今回は1時間おきに彼女（仮想）が「お疲れさまです」と言ってくれる定期実行を作りました。
これで在宅ワークでも寂しいことはありません。

世のエンジニアさんは、彼女を作る前にまず定期実行を作ってみてはいかがでしょうか。
虚しさが募り本気で彼女を作る気になりますよ！

ではまた〜！
相関行列と散布図行列を作成する(SPSS Modeler データ加工逆引き3-9)

## 相関行列と散布図行列を作成（相関行列）

![スクリーンショット 2022-08-03 11.43.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/25d3a96a-5972-245f-9435-fb0fde0b47ba.png)

## 1.想定される利用目的

・データの理解
・予測モデル構築のための入力フィールドの精査

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/correlation_matrix.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-08-03 11.47.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a29df47c-9e21-1a86-66fb-eb3f5a3f35da.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-08-03 11.48.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b863a6bb-5573-72b9-780f-17decb839ff2.png)

b.[記述統計]ノードを編集します。[検証]と[相関係数]に全てのフィールド（列）を選択します。
![スクリーンショット 2022-08-03 11.49.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f84f2ddd-909a-4044-6823-97728d5c4cc2.png)

[実行]します。
![スクリーンショット 2022-08-03 11.50.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6ab4d64d-9c0e-73df-63b4-72d1bfdeed1d.png)

c.[グラフボード]ノードを編集します。フィールド（列）をすべて選ぶと選択可能なグラフが選ばれるので[散布図の行列]を選択します。
![スクリーンショット 2022-08-03 11.50.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bad51990-0454-7d1b-9038-8fd72a8bd435.png)

[実行]します。
![スクリーンショット 2022-08-03 11.38.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5ba00ef8-4197-b0b7-2c6f-3e5f644c194c.png)

#### [データの表示]機能を利用する

d.aで右クリックをして[データの表示]を選択します。
![スクリーンショット 2022-08-03 11.52.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/aa4aa402-6503-f08e-49e9-8789372747f7.png)

初期画面が起動します。
![スクリーンショット 2022-08-03 11.53.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/cb63d861-24f9-91da-f84d-71927db3550b.png)

相関行列は左のサンドバー[データ検査]からピアソンの相関係数タブを選択すると表示されます。
![スクリーンショット 2022-08-03 11.53.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/45c422cc-a8d1-78f4-34c0-61f5c55f2472.png)

[散布図行列]をグラフタイプから選択します。
![スクリーンショット 2022-08-03 11.55.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ef4227b0-58c0-5f10-eea4-db88e1c1f77e.png)

左の列選択を利用して全てのフィールドを選択すると完成します。
![スクリーンショット 2022-08-03 11.56.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0bee0006-333c-35b2-7bc3-e6a8cdeb30c1.png)

#### 注意点

入力はシミュレーションノードで1000行のデータを発生させています。各フィールドは正規分布させフィールド間の相関を設定していますが、最も設定に近づけた場合であっても複数フィールドが設定通りに相関を維持するには限界があります。設定と結果の相関行列に差があるのはそのためです。

## 4.参考情報

#### 相関行列と散布図行列を扱った記事

https://qiita.com/kawada2017/items/a77f14bd0c4351d055a6

#### データ表示（新グラフ）を扱った記事

https://www.ibm.com/blogs/solutions/jp-ja/learn-modeler-04/

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
DatabricksレイクハウスプラットフォームにおけるPhotonエンジンのGA(正式提供)の発表

[Announcing Photon Engine General Availability on the Databricks Lakehouse Platform \- The Databricks Blog](https://databricks.com/blog/2022/08/03/announcing-photon-engine-general-availability-on-the-databricks-lakehouse-platform.html)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

# すべてにデータユースケースで安価かつ尋常じゃないスピードを手に入れましょう

主要クラウドプラットフォームのDatabricksにおいて、レイクハウスシステムの高速次世代クエリーエンジンである[Photon](https://databricks.com/jp/product/photon)が[正式提供(GA)](https://docs.databricks.com/runtime/photon.html)になったことを発表できて嬉しく思っています。Apache Spark™のオリジナルクリエーターによって最初から開発され、モダンなSparkワークロードと完全な互換性があるPhotonは、すべてのデータユースケースにおけるクラウドハードウェアのTCOを削減し、高速なパフォーマンスを提供します。

2年前のローンチ以来、Photonはエクサバイト規模のデータを処理し、数十億のクエリーを実行し、従来のクラウドデータウェアハウスと比較して12倍の[コストパフォーマンスを示すベンチマーク](https://qiita.com/taka_yayoi/items/b9b25d2050685706a20b)を叩き出し、権威のある賞を[受賞](https://qiita.com/taka_yayoi/items/bb71fd0651861f090a59)しました。

Photonは当初、皆様の既存のデータレイクにおいてデータウェアハウスの作業を行えるようにSQLにフォーカスしていましたが、モダンなデータフレームとSparkSQLのワークロードをサポートできるように、言語(Python、Scala、Java、R)とワークロード(データエンジニアリング、分析、データサイエンス)のカバレッジを拡大しました。

この結果、[AT&T](https://databricks.com/dataaisummit/session/how-att-data-science-team-solved-insurmountable-big-data-challenge-databricks)のようなお客さまは、Databricks SQLウェアハウス以外の場所、従来のDatabricksワークスペースでのデータ取り込み、ETL、ストリーミング、インタラクティブなクエリーにおいても、Photonを用いることによって劇的なコスト節約と性能改善を体験されています。

- 従来のDatabricksランタイムでPhotonを用いることで最大80%(平均30%)のTCOコストの削減、VMの計算時間で最大85%(平均50%)の削減。
- [Delta Live Tables](https://databricks.com/jp/product/delta-live-tables)でPhotonを用いることで、⅕の計算資源でレーテンシーを最大5倍削減。
- インタラクティブなSQLワークロードで3-8倍高速なクエリーを実現。

さらに、プレビューをされている400のお客様に調査をしたところ、90%がワークスペースでクエリーが速くなった、87%がパフォーマンス改善によってより多くの作業を行えるようになり、迅速にビジネス価値を生み出すためにイテレーションが行えるようになったと報告しています。
![](https://databricks.com/wp-content/uploads/2022/08/db-282-blog-img-1.png)
*DatabricksレイクハウスでPhotonを用いることで尋常じゃないスピードを*

# PhotonのGAで提供される新機能

PhotonのGAでは数多くの素晴らしい機能が提供されますが、以下の機能を強調したいと思います。

- **高速かつ頑健なソート**: Photonの**vectorized sort**を用いることで、お客さまはプレビュー期間中にApache Spark™よりもはるかに高速な3-20倍の性能改善を目撃しています。
- **高速化されたウィンドウ関数**: 集計、移動平均、データの複製のようなユースケースでテーブル行セットに処理を行う関数は、プレビュー期間中に2-3倍高速になったという報告がありました。
- **高速化された構造化ストリーミング**: 今ではPhotonは構造化ストリーミングのワークロードもサポートしています。プレビュー期間中、ストリーミングジョブを行なっているお客様からは、コストを5倍削減できたとの報告がありました。

# 使ってみる

Photonを使い始めるには[ドキュメント](https://qiita.com/taka_yayoi/items/6fdbcac84f88bdd14fee)の指示に従ってください。また、詳細に関しては[Data \+ AI Summitのセッション](https://databricks.com/dataaisummit/session/radical-speed-lakehouses-photon-under-hood)を視聴してみてください！

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
Xcodeファイル削除時の[Move to Trash],[Remove Reference]について

# はじめに
今までXcode上でファイルを削除する時、あまり意識せずにファイルを削除していました🥲

ファイル削除時、毎回出てくるPopの意味をちゃんと理解する為の記事です。

### どういう意味か
![スクリーンショット 2022-08-04 5.33.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/dcddf301-63e1-390a-d82d-52d75a582e07.png)

Do you want to move SLFloatingNode.swift to the Trash, or only remove the reference to it?
(**SLFloatingNode.swift を Trash に移動するのか、それとも参照だけを削除するのか？**)
This operation cannot be undone
(**この操作は元に戻せません**)

Move to Trash(**ゴミ箱へ移動**)
Remove Reference(**参照を削除**)

英語を翻訳すると、ちゃんとそのまま書いてますね😤
アルファベットを見てみないフリ病が発病してました😱

英訳通りで、Remove Referenceを選択すると、Xcodeから参照されなくなるだけで、ファイル自体はしっかりFinder上に残っています。

個人開発では特に問題無く思えますが、チームでの開発となると、ただただ不要なファイルが増えていく事になるので、基本的にファイル削除時には**Move to Trash**を選択する事になると思います。(ゴミ箱に移動するだけなので、すぐに元に戻せますし)

以上です!!
CRuby マジックナンバー チートシート

[ソースコード](https://github.com/ruby/ruby/blob/e1f42844a0b2a4dcf4c7338c41ef92f1b45393d8/include/ruby/internal/special_consts.h#L97-L106)

## Special Const

| CRuby  | 16進数| 10進数|
|:-------|:-----|:-----|
| Qfalse | 0x0  | 0 |
| Qnil   | 0x4  | 4 |
| Qtrue  | 0x14 | 20 |
| Qundef | 0x24 | 36 |

## Fixnum
RUBY_FIXNUM_FLAG は 0x1。奇数は全てFixnum。

* INT2FIX: (int << 1) + 1
* FIX2INT: (int - 1) >> 1

| Fixnum | int  |
|:-------|:-----|
| 1 | 0 |
| 3 | 1 |
| 5 | 2 |
| 7 | 3 |
[Unity] Unity内でYoutube動画を再生する【標準機能を使って】

:::note warn
Youtubeの規約、そして動画の著作権に注意し、自己責任で実装するようにお願いいたします。
:::
# はじめに
何らかのパッケージをインポートせずに、Unityの標準機能だけでYoutubeの動画を再生することができることを発見しました。
その方法とは[こちらのReadme（英文）](https://github.com/iBicha/UnityYoutubePlayer)に記載されていたのですね。
これを和訳しながら解説していきます。

#実装方法（3Dの場合）
新規オブジェクトとしてPlane（平面）を用意しましょう。
そのPlaneにVideo Playerコンポーネント（標準機能、「Add Component(コンポーネントを追加）」から検索すると出てきます）をアタッチ。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/2aa1b076-6b4c-571d-d05a-f8bdcdb709eb.png)
一番上のSourceを「URL」に変更。
するとURL入力欄が出てきますので、下記のように入力してください。

>https://unity-youtube-dl-server.herokuapp.com/watch?v=動画ID

動画IDは再生したい動画のページのURLから取得できます。
例えば、もともとの動画ページのURLが

>https://www.youtube.com/watch?v=2x33fVB3iNs

ならば、動画IDは末尾の ` 2x33fVB3iNs ` になります。
これで完成です。
Play On Awakeを有効にしていれば実行してすぐに動画が再生されますので、そちらでご確認ください。

# おわりに
URLを入力する段階で ` unity-youtube-dl-server.herokuapp.com ` が何者か気になった方がいるかもしれません。
これは[こちら（英文）](https://github.com/iBicha/youtube-dl-server)で、Youtube動画の再生URLを配信することを目的のサーバーを利用しています。
すなわち、ある日突然このサーバー主がシャットダウン（あるいはherokuが倒産）すれば、上記URLでは無効となってしまいます。
もし安全性・信頼性を担保したい場合は、ご自身で[こちら（英文）](https://github.com/iBicha/youtube-dl-server)のサーバーを立てる必要があります。
Ubuntu OSのアップデート

# 下準備
```termianl
sudo apt update
```
```termianl
sudo apt upgrade
```
※ お好みで
```termianl
sudo apt autoremove
```
# updaterのインストール
```terminal
sudo apt install ubuntu-release-upgrader-core
```
# アップデートの設定
```terminal
cat /etc/update-manager/release-upgrades
```
実行すると下記が表示されると思います．
僕の場合は`Prompt=nerver`と設定されていたので一番下の行を`Prompt=normal`または`Prompt=lts`に変えてあげます．
```release-upgrades
# Default behavior for the release upgrader.

[DEFAULT]
# Default prompting behavior, valid options:
#
#  never  - Never check for, or allow upgrading to, a new release.
#  normal - Check to see if a new release is available.  If more than one new
#           release is found, the release upgrader will attempt to upgrade to
#           the supported release that immediately succeeds the
#           currently-running release.
#  lts    - Check to see if a new LTS release is available.  The upgrader
#           will attempt to upgrade to the first LTS release available after
#           the currently-running one.  Note that if this option is used and
#           the currently-running release is not itself an LTS release the
#           upgrader will assume prompt was meant to be normal.
Prompt=never
```
# アップデートの実行
```terminal
do-release-upgrade
```
※ 心配なら下で確認することができます．
```terminal
do-release-upgrade -c
```
Win10にDockerDesktopをインストールしようとしてWLS2を有効にしてVMwareが起動しなくなった場合

Docker Desktop と VMware Workstation（Player）は共存できない。
VMware を使っている環境にDocker Desktopを後からインストールしようとしてWLS2を有効にすると、Docker Desktop は起動しない。
そして Intel vt-x/ept がサポートされていないというエラーでVMwareも起動しないという状況になってしまう。

PowerShellを管理者で起動して設定を修正してVMwareを救う。

```
bcdedit /set hypervisorlaunchtype off
```
Nuxt.jsでSal.jsを使う方法(裏道)

最近Nuxt.jsを使い、SPAを作り始めた者です。
そもそも、Webページ制作自体あまりしたことがなかったため、何かするたびに壁に当たり大変だったので、ここに書いて忘れないようにしたいと思います。
（他の初心者の方も参考になったら嬉しいです。）

今回は、制作しているWebページをもっとリッチな感じにしたいと思い、スクロールに連動してオブジェクトにアニメーションを付与してくれる、「Sal.js」を導入してみようとしました。
https://mciastek.github.io/sal/
（友達に教えてもらいました）

## 導入編(失敗)

まず、
```
npm install --save sal.js
```
をして、プラグインをインストールしてみました。
そして、
```
npm run dev
```
をすると
```
Module build failed (from ./node_modules/babel-loader/lib/index.js):
TypeError: D:\[省略]\.nuxt\client.js: Cannot read property 'node' of undefined
```
というエラーが出て、ビルドに失敗しました...。

## 別の方法で導入(失敗)

色々調べたりいじったりしたのですが、すぐに解決は出来なかったので、一旦諦め、別の方法でcssとjsを導入してみることにしました。

以下のサイト
``Nuxtのサードパーティ製Javascriptの読み込む方法を色々試してみた``
https://zenn.dev/sengosha/articles/54ec4c57194626
によると、直接headに入れる方法と、pluginで読み込む方法があるとのことでしたので、とりあえず簡単なheadに入れる方法を試してみました。

```nuxt.config.js
  head: {
    link: [
      { rel: 'stylesheet', type: 'text/css', href: 'sal.css' },
    ],
    script:[
      { src: 'sal.js', defer: true ,
      },
    ]
  },
```
Sal.jsを導入しようとしたnuxtのコンポーネントは以下になります。
```header.vue
<template>
  <div>
    <b-container fluid class ="parent">
      <!-- <b-row  cols="1" cols-sm="2" cols-md="4" cols-lg="6"> -->
      <b-row class="vh-100 text-center" align-v="center">
        <b-col cols="12" data-sal="slide-up"
          data-sal-duration="1000"
          data-sal-delay="300"
          data-sal-easing="ease-out-bounce"
        >
          <img src="~static/images/logo_a.png" class="logo" alt="a">
          <img src="~static/images/logo_b.png" class="logo" alt="b">
          <img src="~static/images/logo_c.png" class="logo" alt="c">
        </b-col>
      </b-row>
    </b-container>
  </div>
</template>
```

これで、動かしてみたところ、なぜかアニメーション効果を適用したオブジェクトがフェードアウトされて消えてしまい、その後リロードしてもそのオブジェクトは表示されませんでした。

## salの初期化

以下のSal.jsのgithub内のリファレンスを確認したところ、
https://github.com/mciastek/sal#repeating-animation
salの初期化が必要なこと、初期化時のオプションでonceをfalseにしないといけないことが分かりました。
(onceをfalseにしないと、アニメーションが1度しか再生されないようです。)

上記を踏まえ、nuxt.config.jsを以下のように修正しました。
```nuxt.config.js
  head: {
    link: [
      { rel: 'stylesheet', type: 'text/css', href: 'sal.css' },
    ],
    script:[
      { src: 'sal.js', defer: true ,
        callback: () =>{
          sal({
            once: false
          });
        },
      },
    ]
  },
```

以上、Nuxt.jsにSal.jsを導入する方法(裏道)でした。
いい方法があったり、そもそも最初の導入時になぜ失敗したかわかる方が居ましたらご教授いただけると嬉しいです。
【Ruby on Rails】gsubで特定の文字列を挟んでhtmlタグを表示させる方法

## 僕がやろうとしていたこと
実務である特定の文字列が存在した場合に、その文字の色を赤くして表示ということをしたくなった。

その時に使用したので gsubというインスタンスメソッドで実現可能ということを知った。
このgsubを使用して、特定の文字が存在した場合にその文字を``<span>タグを使って囲みstyleを適用する``ことによって実現することができた。


## どうやったか(コード例)

``` ruby
gorira = "僕は大人になったらゴリラになりたい"
gorira.gsub(/ゴリラ/, '<span style=color:red; font-weight:bold>\&</span>')   
# => "僕は大人になったら<sapn style=color:red; font-weight:bold>ゴリラ</span>になりたい"
```
こんな感じでやりたいことは一応実現することができた。
1チャンネルのnumpy配列を3チャンネルに変換する

### チャンネルの次元がない場合
例えば
```python:
>>> image.shape
(64, 64)
```
のような場合
```python
img = np.stack((img,)*3, axis=-1)
```

### チャンネルの次元がある場合
例えば
```python:
>>> image.shape
(64, 64, 1)
```
のような場合
```python:
img = np.repeat(img, 3).reshape(img.shape[0],img.shape[1],3)
```
numpy初心者すぎてこれしか思いつかないが、もっといい方法がありそうな気もする。
デプロイ時の不具合に便利な「起動ログ」のすすめ

## 背景
アプリケーションのログはとても大事…ですよね。

開発中は影が薄いですが、運用中にはきちんと考えて出力できているログは頼りになります。
ただ、ログレベルの設定方法やログの監視方法などは様々なノウハウが共有されていますが、何を出力すべきか論じられているのは少ない印象です。
ワークロードの違いで出力すべきログが全然違ったりはしますが、多くのアプリケーションで共通となる部分もあると思っています。

この記事ではその共通部分の一つ、起動ログについて有用と思うことをまとめて書いています。

## 起動ログとは
ここでいう起動ログとは、バックエンドのデーモンやバッチなどでアプリケーションが正常起動したときに出力する情報です。
※ もしかしたら他に一般的な名称があるかも

私が書いているアプリケーションでは、起動すると以下のようなログを出力しています。

```json
{
  "level":"info",
  "ts":"2022-07-21T05:21:15Z",
  "msg": "startup",
  "appName":"my_module",
  "appVersion": "v1.0.0",
  "option": "{\n \"Env\": \"production\",\n  \"Port\": 80\n}"
}
```

起動ログに含める内容はだいたいどのアプリケーションでも同じになっています。

## 起動ログに含める情報

#### 起動ログであることがわかる識別子
雰囲気でもわかるのですが、目印となる文字列を入れておくと後から検索しやすくなります。
(例では`"msg": "startup"`)

#### 読み込んでいる全ての設定
これが最も重要な情報と考えています。

検証済みのアプリケーションが意図したとおりに動作しない場合、
経験上多くは単純な設定のミス(項目名のタイプミスなど)であると思っています。

このようなミスは設定ファイルを眺めてもなかなか気づきにくいですが、起動ログに設定が出力されていれると、設定されているはずの項目が空文字列だったり、デフォルト値のままだったりして、かなり気づきやすくなります。
(例では`"options"`の中にJSON文字列として保存)

#### アプリケーション名とバージョン
含めておくことで、起動するアプリケーションの取り違えがあったとき気づきやすくなります。
(例では`"appName"`と`"appVersion"`)

#### 出力時刻
普通にログ出力すればでてくるので当然ですが、念のため。
古い起動ログを最新と誤認することを避けるため、確認できる必要があります。
(例では`"ts"`)

## 起動ログの監視について

#### ログの出力先
各アプリケーションでの起動ログの出力先は、標準出力にしています。
他のログと同様に扱い、適当な手段で集約して検索可能にします。

#### 通知はあった方がいいかも
自分のプロジェクトでは起動ログで通知が出るようにしています。
以下の目的をもっています。
- 意図しないエラーで、エラー自体の通知がなくアプリケーションが落ちた場合、再起動のログで何か起きた可能性を察知できる
- その他にも、とにかく把握していないところでのアプリケーションの起動に気付ける

わざわざアプリケーション起動で通知しなくても安心して運用できれば理想的だとは思うのですが、未知の不具合やセキュリティの考慮漏れなどの対策の一環として、通知するようにしています。
# まとめ
起動ログが出力されていると、設定ファイルと実設定の齟齬を把握しやすくなり、便利です。
どのアプリケーションでもほぼ共通の考えで設定でき、特に設置時の不具合調査が非常に楽になるのでコストパフォーマンスがよいログだと思います。
VSCode + Jupyter Notebookの環境にフォーマッターBlackを導入する。

# 保存時フォーマットはできない
まず初めに断っておきますが、現時点で保存した際にフォーマットはできませんでした。

https://github.com/microsoft/vscode-jupyter/issues/7058

こちらのissueの最後の方でも現時点で対応する予定はないとの発言があります。
もしできるようなら情報をください。

# 方法1：Black拡張機能をインストールする
https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter

.pyファイルだけではなく、.ipynbでも問題なく使用できます。

こちらの記事で導入方法が記載されています。

https://qiita.com/nujust/items/e0985240fd461e5c4c0a

# 方法2：pipからインストールする
普通にインストールする方法です。
しかし、```pip install black```とするだけで使用できませんでした。

エラーメッセージでは```pip install black[jupyter]```を実行しろという文が書かれています。
しかし```zsh: no matches found: black[jupyter]```と出てしまいます。
```pip install 'black[jupyter]'```とシングルクォーテーションで囲ってやることで実行できました。

どちらも```option```+```shift```+```F```をすることが一番楽かなという感じで、使用感も変わらないためどちらでも良いと思いました。

他に何かいい方法があれば教えてください。
日大文系卒が学ぶ時系列解析③　~モデル~

## 初めに
今回はサラッと時系列データで使用されるモデルについて説明致します。
正直メインパートだけあってここは難しいです。私もそれなりに色々なサイトから説明を参考にさせて頂きましたが、正直まだピンと来てない事も多い。
サラッと確認して次の実装に行って勝手を試してみるのも良いかもしれません。
(正直この回は次回への助走パートです)

### バックナンバー
- [日大文系卒が学ぶ時系列解析①　~概念と用語紹介~](https://qiita.com/The_Boys/items/40233521bf8d7fe82093)
- [日大文系卒が学ぶ時系列解析②　~自己相関関数/定常性/波形分解~](https://qiita.com/The_Boys/items/0224076f1cd722d8bca3)
- [日大文系卒が学ぶ時系列解析③　~モデルの紹介~](https://qiita.com/The_Boys/private/deabab92dfb89f05e697)
- [日大文系卒が学ぶ時系列解析④　~SARIMAの実践~](https://qiita.com/The_Boys/private/284b250869fb380bc125)

## 学習
今から紹介するのは`ARMA`(アーマ)､`ARIMA`(アリマ)､`SARIMA`(サリマ),`SARIMAX`(サリマックス)､という聞きなれない呪文の学習を始めます。

- 実例を提示致します。下記グラフは月ごとの`平均気温の時系列データ`で青が実値で<font color="red">赤が予測値</font>です。様々な手段を試して予測値を算出した中で、一番良いものを提示致しました。　この手段が上記の`ARMA`､`ARIMA`､`SARIMA`etc,です。

:::note aaa
考えは機械学習と同じです。
①値を予測したい。
②どうやって予測しようかな線形回帰、ランダムフォレスト、LightGB等…
③予測して予測した値を確認...と。

:::

### 最初に見てほしい画像

![2022-08-07_20h15_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/79757b07-d5a9-51e3-bd71-8f524eb8c888.png)
基本的に最小単位はARMAです。AR/MAモデル単発でも勿論可能ですが、とにかく実装を見てほしいので今回はスキップ致します。　　参照

https://www.youtube.com/watch?v=Fq73BS32a-8&t=977s




### ARモデル(自己回帰モデル)
- 現在の値は、過去の値から決まります。つまり`現在や過去の値から未来を予測`しましょうと。
- 短期の自己相関があるデータに有効(相関性のあるデータ)で、
なんでも使えるけどあまりにもシンプルすぎる。


:::note info
将来のYの値は、過去のYの値によって説明できる
⇒将来の予測値は、過去の予測値により決まる
具体例：今月の売上量が多かったら、来月は売上量が増えるだろうと。
:::



### MAモデル(移動平均モデル)
- 予測する際の材料として､学習データの一つ一つを見るのではなく、tの点、tの一つ前、tの一つ後の`合計3つの点の平均`から、予一つの予測点(<font color="red">赤</font>)を導きましょう。という事です。
![IMG_20220807_194512260 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/c8e3843b-3838-5d56-fbf7-2d9564a74478.jpeg)

他の解釈として
- 現在の値は、過去の「実績と予測のズレ」から決まる。
「過去の値から現在を予測」というのはいくら努力しても`ズレ(誤差)`は生じますよね。そのズレも考慮してモデルを組み立てましょうと。

:::note info
この方法によりノイズがあるデータに有効です。(基本どのデータにもノイズはありますけど。)
:::








### ARMA(アーマ)モデル

- `AR` + `MA` = ARMA　互いに競合する性質ではないので合成しても平気です。
- このARMAモデルが基本で実装する際もこれを最小単位としてどんどんパワーアップする。というやり方を行います。

### ARIMA(アリマ)モデル
ARMAモデルに`差分過程（階差）`という概念を付け加えました。
- 原系列を階差数列に変換した後、ARMAモデルへ適応したもの。
- つまり仕組みを理解するにはlogの知識が必要。
今回は実装をしてその事も確認できればと。
- おそらくトレンドを分解除去する事が出来るので、長期トレンドがあるデータに有効。


### SARIMA(サリマ)モデル
ARIMAモデルを更に季節周期を持つデータに対応できるように拡張しました。(パワーアップ)。
- 季節周期
1年間での周期変動：例：季節関係のデータや賃金の支払い額(ボーナス)毎年6月と12月に増える　みたいな。

### SARIMAX(サリマックス)モデル
SARIMAモデルを更にパワーアップ。Xは変数の事です。
SARIMAモデルに外的要因を考慮して予測する手法です。

:::note info
毎月の平均気温の予測
- SARIMAX以外：現在や過去の気温データから未来の気温を予測する。
- SARIMAX：現在や過去の気温データに加え<font color="red">降水量や気圧,その他変数等</font>から未来の気温を予測する。
:::

## 終わりに
こうしてみるといかがですかね。実務やkaggle/signateで予測する際はこの中だとSARIMXのみで行っとけば良いんじゃない？とも思っちゃいますよね。
その点に関しては次回の[<font color="red">実装</font>](https://qiita.com/The_Boys/private/284b250869fb380bc125)を確認して頂ければ。

正直ピンとこないし分からない。なのでとりあえず実装してみましょう。
それで何か論理の補足や発見があれば逐次アップデートを行います。


### 参照
https://www.youtube.com/watch?v=Fq73BS32a-8



## 終わりに

### 参考文献

https://www.youtube.com/watch?v=nHxnKJYCQCo

https://www.youtube.com/watch?v=bLd9s9DtDbE

https://www.youtube.com/watch?v=Fq73BS32a-8
【yocto】レシピ一覧を確認する方法

# 方法
~~~
bitbake-layers show-recipes
~~~

# 例
- 環境変数設定
~~~
takeshi@X250:~/yocto/poky$ source oe-init-build-env 

### Shell environment set up for builds. ###

You can now run 'bitbake <target>'

Common targets are:
    core-image-minimal
    core-image-sato
    meta-toolchain
    meta-ide-support

You can also run generated qemu images with a command like 'runqemu qemux86'

Other commonly useful commands are:
 - 'devtool' and 'recipetool' handle common recipe tasks
 - 'bitbake-layers' handles common layer tasks
 - 'oe-pkgdata-util' handles common target package tasks
~~~
- レシピ一覧を確認
~~~
takeshi@X250:~/yocto/poky/build$ bitbake-layers show-recipes
NOTE: Starting bitbake server...
WARNING: Host distribution "zorin-15" has not been validated with this version of the build system; you may possibly experience unexpected failures. It is recommended that you use a tested distribution.
Loading cache: 100% |####################################################################################################################################| Time: 0:00:00
Loaded 1298 entries from dependency cache.

Summary: There was 1 WARNING message shown.
=== Available recipes: ===
acl:
  meta                 2.2.52
acpica:
  meta                 20190816
acpid:
  meta                 2.0.32
(略)
~~~
Next.JS の学習でお世話になったYouTube動画集

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/da7dffbe-ef0c-3bdb-270c-654260faa800.png)

# Next.JSの学習でお世話になった動画をご紹介します.


# Tutorial編

https://youtu.be/mTz0GXj8NN0

https://youtu.be/tsmaQdgidKg

https://youtube.com/playlist?list=PL4cUxeGkcC9g9gP2onazU5-2M-AzA8eBw


# Next.js ＋ Firebase編
https://youtube.com/playlist?list=PLC5vixW_4xSKqwpgaPEcLj7O3SvUNqC9L


https://youtu.be/gGshLDSconM

# Next.js ＋ Sanity.io編
https://youtu.be/1WmNXEVia8I

https://youtu.be/32RP-sG1njE


# Airbnb clone (Next.js ＋ Sanity.io ＋ Google maps API)編

https://youtu.be/mx1dbMzd3tU

# Chat app (Next.js ＋ ChakraUI ＋ Firebase v9)編

https://youtu.be/i8YFPPx_BYw

# Real Estate Web App (Rapid API)編

https://youtu.be/y47gYvXchXM

# Next.js (TypeScript)編
https://youtu.be/cwqNAkwhKqw

# さいごに
### この他に、おススメのNEXT.JS学習動画がありまいたらアップしていきます:rocket:
### これから、GraphQLの勉強を進めたいと思っていますのでオススメの動画があれば教えてください:blush:

React編もまとめているので、ご参考にしてください。

https://qiita.com/iwasaki-hub/items/becde0c9993c4ef3975a
Google Driveから.ipynbファイルをGoogle Colaboratoryで開けない問題

題名の通り、Google Colaboratory (Colab)で開けなかったお話。
（題名の日本語が怪しい。）

珍しく公開記事にします。

# あらすじ
メーカー就職一年目。偉い人との面談で

「集めたデータをこねこねして、〜（中略）〜って感じのことしたら業務効率化、付加価値創造に繋がりませんか？？？」

みたいな話をしたら、偉い人が上機嫌で応援してくれた。
<br><br>


…DXとかビッグデータとか言っとけば、未来志向のやる気のある若者と捉えてもらえるからちょろい世の中ですね（失礼）

<br><br>

あほなことを言ってみたものの、実際やってみたいという気持ちに偽りはございません。
pythonもちょっとしか触ったことないし、完全専門外だし、…って感じですが、
ちょっとずつ構想を練ろうと思って、勉強を始めることにしました。

# 問題発生

で、勉強のために買った本というのが、秀和システムの『python実験データ分析100本ノック』でした。
（レベルが合ってるか、目的が合ってるかとかはいちいち突っ込んだら負け。）

本書では、Colabでコードを書くようです。
サンプルコードはDriveに置いておくと参照できて便利なのです。
さすがはGoogleさん。

本の中の指示通り
サンプルコードをDriveに置いて、サンプルコードを開こうとします。

手順通り、
右クリック＜『アプリで開く』＜『Google Colaboratory』
とすれば、Driveから開けるはずなのですが、…ない。。。Colabがない。

![うまくいっているときのスクショ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581127/4cb08191-34ad-7154-e2f1-92192b0577bb.png)
↑正しく表示されているときのスクショ。

なるほど、Colabのアプリが入ってないから表示されないのかと思い、
『Google Colaboratory』の代わりに『アプリを追加』を選択します。

![Google Workspace Marketplace](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581127/b989dfcb-4817-4fea-4f2b-2aa51e1a4369.png)


Google Workspace Marketplaceの画面が現れるので、
app内を検索の欄にcolabか何か打つとColaboratoryのアプリが検索に引っかかります。

![スクリーンショット 2022-08-03 23.00.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581127/5adaf986-b756-938c-a6e3-5223ff032ebd.png)

すると、インストール済みとなってました。いや、なんでやねん。

# 解決策

（Colabから直接Drive内のファイルを開いても良さそうですが、）せっかくなので。

先ほどのMarketplaceの画面でColaboratoryを開き、一度アンインストールします。
ありきたりですが、再度インストールすることで無事にDriveからColabを開けるようになりました。

調べたら他の人も初期状態からそうなっているっぽいです。
なんでやGoogleさん。
初心者殺しなのでやめてほしいです。

使用しているGoogleアカウントの作成時期がかなり古い（確か2016年くらい）のがもしかすると原因なのかなあ。
何か分かれば追記します。
<br><br>
ただの所信表明みたいな記事になってしまいましたが、とりあえず一年間ゆっくり勉強してみるとします。（日々の業務で忙殺されると思うのでほんとに三日坊主になりそう。）

がんばります。
ts-patternにインスパイアされて劣化車輪の再発明をした

# 序文

Qiitaの記事トレンドを眺めていたら[ts-pattern](https://www.npmjs.com/package/ts-pattern)を見つけました。
見ているうちになんか作れそうな気がしたのでコードを書いてみましたが、やはり私程度では太刀打ちできず劣化車輪の再発明となってしまいました。
しかし書いたアルゴリズムはif-elseを式として扱えない他の言語に置き換わったときに使えそうな気がします。
要はせっかく書いたし公開したいってことです。

# コード

```ts
class MatchExpression<T, U> {
    private target: T;
    private result: U;
    private defaultValue: U;
    private isSet: boolean = false;

    constructor(target: T, defaultValue: U) {
        this.target = target;
        this.result = defaultValue;
        this.defaultValue = defaultValue;
    }

    when(res: U, f: (it: T) => boolean): this {
        if (this.isSet) {
            return this;
        }

        if (f(this.target)) {
            this.result = res;
            this.isSet = true;
        }

        return this;
    }

    run(): U {
        if (!this.isSet) {
            this.result = this.defaultValue;
        }

        return this.result;
    }
}
```

## 使い方

```ts
const res = (new MatchExpression('aaa', 'YYY'))
    .when('bbb', (it) => it === 'zzz')
    .when('ccc', (it) => it > 'zzz')
    .when('ddd', (it) => it === 'aaa')
    .when('eee', (it) => it === 'www')
    .run();

console.log(res);  // ddd
```

- `when(条件がtrueだった時の値, 判定するための無名関数) => this(メソッドチェーンするため)`
- `run() => 判定結果`

# 解説

これにより

```ts
const res = (() => {
  switch (prop) {
    case CASE1:
      return a;
    case CASE2:
      return b;
  }
  return default;
})();
```

みたいに無名関数を定義してif式っぽくする必要がなくなります。[参考](https://qiita.com/ryuseiyarou/items/3d8b6a12c078027d47c2)

```ts
private target: T;
private result: U;
private defaultValue: U;
```

型は統一したかったため、switch-case文でいう `switch(/** ここ */)` に当たるものを `target`としてT型、返却値をU型としています。
複数型を返したい場合に応えられるようジェネリクスにも対応させました。

```ts
when(res: U, f: (it: T) => boolean): this {
  if (this.isSet) {
    return this;
  }

  if (f(this.target)) {
    this.result = res;
    this.isSet = true;
  }

  return this;
}
```

nullやundefinedを返したい場合もあると考えたので、 `isSet` というすでに条件に一致する値が出ているかどうかを持たせています。ここでメソッドチェーンをしたかったために返していた `this` が活きています。

```ts
run(): U {
  if (!this.isSet) {
    this.result = this.defaultValue;
  }

  return this.result;
}
```

最終的にはU型が代入されてほしいので、これで終わりを示す `run()` を定義しました。
switch-case文でいうdefaultをrunに与えなかった理由は、`this.result`が最後まで空のままな可能性があるためです。
最終的には値が入るので、strictモードで開発するならNon-null assertion operatorをつければいいのですが、気にくわなかったのでconstructorに持たせています。

# 〆

再度繰り返しますが、劣化車輪の再発明なので素直に [ts-pattern](https://github.com/gvergnaud/ts-pattern) 使った方がいいです。私は逆張りなので自分でやってみましたが。
このコードでの今見えている課題はif-elseがネストしている場合です。結局whenの中に条件分岐を書かなければいけないうえ、 $A & B$ と $A & C$ があったとき、if-elseなら `if(A)` の中に `if(B)` と `else if(C)` を書けばいいところを、 $A & B$ と $A & C$ それぞれ別に書かなければいけません。
逆にメソッドチェーンにした利点(?)としては、以下のような使い方ができる点です。

```ts
let stmt = (new MatchExpression('aaa', 'YYY'))
    .when('bbb', (it) => it === 'zzz')
    .when('ccc', (it) => it > 'zzz')

if (isTrue) {
  stmt = stmt.when('ddd', (it) => it === 'aaa')
    .when('eee', (it) => it === 'www')
}

stmt.run();
```

書いていて思いましたが、結局ミュータブル定義をやめたくてこのような実装をしたのに結局ミュータブル定義しているので利点ではないですね。
でもPythonでSQLAlchemyをかいているとこんな感じで条件分岐させてSQLを作成することがあるので、もしかしたら別言語で作ったときに役立つかもしれないですね(?)

書けたコードを見せびらかして満足したので終わります。