OmniAICreator/Qiita-1.07M huggingface dataset:
待望のCOW　基礎編

## **1.watnowアドベントカレンダー5日目**

どうも記事を書くのは昨年ぶり経済系2回生、watnow所属の学生です。

昨年はハッカソンについて語りましたが、今年はガラッと変わってしっかり「プログラミング言語」についてお話ししていきたいと思います。

## **2．背景**
前回ハッカソンのことを語りました。

実はハッカソンの間に偶然ある記事を見つけたのです。

短い簡単な文を書くだけなのに凄く手間をかけていました。

今回のテーマは「COW」。さあ見ていきましょうか。


## **3.COWとは**

実用言語ではなく、難解プログラミング言語のひとつである。
牛の鳴き声"MOO"をMとm、Oとoに分け、3文字の組み合わせをトークンと解釈する。それ以外の文字はコメントとして扱う。

次に基本の仕様について見ていきます。

## **4.仕様**

| COW        | 内容 | 
|:-----------|:------------|
| moO        | ポインタをインクリメント        | 
| mOo        | ポインタをデクリメント      | 
| MoO        | ポインタの指す値をインクリメント        |
| MOo        | ポインタの指す値をデクリメント          | 
| oom        | 入力から1バイトをポインタの指す値に代入       | 
| OOM        | ポインタの指す値をASCII文字として出力     |
| MOO        | ポインタの指す値が0なら、対応する「moo」にジャンプ | 
| moo        | ポインタの指す値が非0なら、対応する「Moo」にジャンプ        | 
| mOO        | ポインタの指す値を特定の命令として実行（3は無効）      | 
| OOO        | ポインタの指す値に0代入        | 
| MMM        | レジスタに現在の値がない場合には現在のポインタの指す値をコピー。レジスタに値がある場合は、その値を現在のポインタの指す値に代入し、レジスタをクリアする          | 
| Moo        | ポインタの指す値が0なら「oom」、非0ならば「OOM」を実行       | 

上記だけではわかりにくいかと思うので補足説明していきます。
まず、上記のM,m,O,oの組み合わせでASCII文字を使用して出力したい文字、記号、数字を指定します。
[ASCIIコード表](URL "https://www.curict.com/reference/ascii/")


```:サンプルコード
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo
MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo 
MOo Moo
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo
MOo MOo MOo MOo MOo MOo Moo
MoO Moo
MoO MoO MoO MoO MoO MoO MoO MoO Moo
MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo
MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo
MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo 
MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo
MOo MOo Moo
```
今回のコードでは「watnow!」を出力できます。

## **5．解読の仕方**
「watnow!」のコードを使って説明していきます。まず「ｗ」を出力するために「MoO」を119個用いて119番を指定します。（[ASCIIコード表](URL "https://www.curict.com/reference/ascii/")）そして「Moo」を使い「ｗ」を出力します。次に出力したい「a」は97番なので「MOo」を22個用いて指定します。このような作業を繰り返す事で、「watnow!」を出す事が出来ました！


## **6．？？？？**
今回は基礎編ということで「MoO」「MOo」「Moo」の3つのみを用いて説明してきました。次回以降、もしくはwatnowの誰かが近日中に応用編を出してくれるような気がします、、、。
WRFをUbuntuでコンパイルする

領域気象モデルWRFは気象の現象理解の研究等に用いられる。アメリカのNCARが作ったものであるが、商用・非商用を問わす自由に使うことが出来る。しかし、オープンソースのツールのみでこれのコンパイルを行う説明が日本語で見当たらなかったので備忘録として残す。

## OS
タイトルのとおりUbuntuを使う。今回は22.04.3LTSを用いたが他のバージョンでも問題ないと思う。
Ubuntuのインストールはいくらでも情報があるので、今回は割愛する。
私は古いintel mac(i5)にインストールを行った。

## パッケージマネージャーを用いたツールの取得
まず、最初にアップデート
```
sudo apt update
sudo apt upgrade 
```
既存のパッケージが最新になったら、必要なものをaptで取得
```
sudo apt install -y libpng-dev libcairo2-dev libhdf5-dev hdf5-tools hdf5-helpers libhdf5-dev libhdf5-doc libhdf5-serial-dev libnetcdf-dev gfortran jasper libtext-csv-perl m4 csh netcdf-bin openmpi-bin libopenmpi-dev tar make libnetcdff-dev
```
## netcdf-fortranのインストール
aptでできないので、ソースビルドする。バージョンは適宜、読み替えること。
あらかじめ、`~/.bashrc`に以下を追記する
```
#NetCDF
export PATH="/usr/local/netcdf-fortran/4.6.1/bin:$PATH"
export NETCDF=/usr/local/netcdf-fortran/4.6.1
export NETCDFHOME=$NETCDF
export NETCDF_LIB=$NETCDF/lib
export NETCDF_INC=$NETCDF/include
export LD_LIBRARY_PATH="$NETCDF/lib:$LD_LIBRARY_PATH"
export NETCDF_classic=1
```
ソースのダウンロードとmakeを行う
- シェルの再起動(再読み込み)が必要になる
- `make install`の実行前に`LD_LIBRARY_PATH`のディレクトリの作成が必要
- `make check`は無くても通る 
```
wget https://downloads.unidata.ucar.edu/netcdf-fortran/4.6.1/netcdf-fortran-4.6.1.tar.gz
tar -xvf netcdf-fortran-4.6.1.tar.gz
cd netcdf-fortran-4.6.1
./configure --prefix=/usr/local/netcdf-fortran/4.6.1
make check
sudo make install
```

```
nf-config --all
```
で説明が出てきたら成功。

## WRFのコンパイル
gitが無ければwgetでも可
```
git clone https://github.com/wrf-model/WRF
cd WRF
./configure
./compile em_real
```
HTMLにおけるinputタグのtype="color"でdefaultValue(Value)が反映されないバグの原因と対処法

# 起きたバグ
`input`を用いて色の入力フォームを作成していたとき、初期値で指定している色が反映されないというバグが発生しました。
バグが起きたコードを下記に示します。
```
<input type="color" value="#fff" />
```
ですが、この初期値は黒色(#000=HTMLのデフォルト値)になってしまっていました。

# 原因
`input`タグの`type="color"`では、色の値を"#+`16進数6桁`"の7文字で管理しています。Figmaなどでは#000000を#000と省略することができますが、`input`タグでは認識できないのです。

MDN([MDN Web Docs](https://developer.mozilla.org/ja/docs/Web/HTML/Element/input/color#%E5%80%A4))では以下のように説明されています。
> `<input>`要素で型が `color` のものの `value` は、常に 16 進表記で RGB カラーを特定する 7 文字の文字列になります。入力欄には色を大文字でも小文字でも入力することができ、大文字を指定した場合、小文字に変換して格納されます。これ以外の値や、空の値になることはありません。

前述の実装では、白色が認識できずデフォルト値である黒色が反映されたと言えるでしょう。
また、アルファチャネルのある色(透明な色)もサポートされていないため、#000000に設定されるでしょう。

# 対処法
`input`タグで値を指定したい場合は、"#+`16進数6桁`"の7文字で設定するようにしましょう。前述のコードは下記のように修正することで、初期値が#fffの入力フォームが得られます。
```
<input type="color" value="#ffffff" />
```

# 追記
HTMLのタグやその他の何かを用いていてバグが起こった際には、公式ページや今回引用したMDNなどで仕様技術の詳細を確認すると、バグの発見や深い知識への出会いにつながるのでとてもおすすめです。
MDN ページ「CSS カウンターの使用」をリライトしてみた話

# はじめに

この記事は [2023 年の MDN 翻訳 Advent Calendar](https://qiita.com/advent-calendar/2023/mdn-translation-community-japan) 向けに作成したものです。

こんにちは。debiru です。2010年頃に [Sugamo.css](http://sugamocss.com/) という勉強会に参加して人生が変わりました。

さて、今日は `counter-reset` プロパティの謎に迫っていきたいと思います。

# クイズです：次の HTML, CSS の表示結果は？

```html
<ul>
  <li>Alice</li>
  <li>Bob</li>
  <li>Carol</li>
  <li>Dave</li>
</ul>
```

```css
ul { counter-reset: num; }
li { counter-increment: num; }
li::before { content: counters(num, ".") ". "; }

li:nth-child(2) { counter-reset: num; }
```

`li:nth-child(2)` に対する `counter-reset` がなければ、次のような表示結果になります。

```
1. Alice
2. Bob
3. Carol
4. Dave
```

`li:nth-child(2) { counter-reset: num; }` を追加した場合、次の選択肢 (1), (2) のどちらの表示結果になるでしょうか。

## 選択肢 (1)

```
1. Alice
1.1. Bob
1.2. Carol
1.3. Dave
```

## 選択肢 (2)

```
1. Alice
1.1. Bob
2. Carol
3. Dave
```

## 答え

早速ですが、答えです。

Chrome, Safari, Edge, Opera, Vivaldi, そして Firefox 81 以下では、選択肢 (1) の表示結果になります。

一方、Firefox 82 以上では、選択肢 (2) の表示結果になります。

https://developer.mozilla.org/ja/docs/Web/CSS/counter-reset

の冒頭にある「試してみましょう」で実際に表示結果を確認することができます。

なぜ、表示結果に違いがあるのでしょうか。Firefox 82 では一体何が起きたのでしょうか。

その謎を解明すべく、我々はアマゾンの奥地へと向かった。

# Firefox 82 のバグではなかった

（上記とは少し違うテストケースですが）Firefox 82 は `counter-reset` に関してバグっていませんか？ってレポートを書いたら「いやいや、仕様通りだよ」とリジェクトされました。

https://bugzilla.mozilla.org/show_bug.cgi?id=1754521

そこから、この挙動の差異を探る旅が始まりました。

# Firefox 82 で取り込まれた修正の正体

……については、過去に書いた記事を参照ください。

https://debiru.hatenablog.com/entry/20220225/counter-reset#fixes-for-invalid-html

# 「CSS カウンターの使用」のページで解説した方がいいのでは

https://developer.mozilla.org/ja/docs/Web/CSS/CSS_counter_styles/Using_CSS_counters

MDN には「CSS カウンターの使用」という CSS カウンター周りの説明をまとめている記事があります。そこで前述の実装差異について解説した方がよいのではないかと思い、英語版記事のリライトを試みました。

なお、MDN の翻訳記事（日本語版など）というのは、英語版に忠実である（内容が一致する）必要があります。そのため、内容自体を書き換えたいと思った場合は、英語版の記事を修正する必要があるのです。

https://github.com/mdn/content/pull/13513

いろいろあって、2回目リライトを行ったものがこちらです。

https://css-counters-v2.lavoscore.org/notes/

ちょっと長くて、まあ読む気にならないと思いますが、CSS カウンター、特に `counter-reset` プロパティの挙動と Firefox の実装について知りたい方はぜひお読みください。

そんなわけで、これを MDN ページの英語記事としてリライトしてプルリクを送ったのですが、構成に問題がある（本文中にブラウザー互換性の具体的な話を記述すべきでない、等）とリジェクトされ、結果的にうまい具合に着地しなかったのでリライト版は不採用となりました。

ただ、Firefox 82 の挙動については確かに言及しておくべきだ、と認識してもらえたようで、「ブラウザーの互換性」テーブルの方に Firefox 82 に関する行を追加してもらえました。

https://developer.mozilla.org/ja/docs/Web/CSS/counter-reset#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%BC%E3%81%AE%E4%BA%92%E6%8F%9B%E6%80%A7

`Resets counter on current element (not sibling elements).` という行です。

# さいごに

MDN の英語版の内容を抜本的に書き換えるのは、英語力の問題、英語版メンテナとの思想の違い（というか私が MDN 英語版のしきたりを知らないだけ）などがありとても難しいと実感したのでした。

こんな記事を最後まで読んでくれてありがとう！

[2023 年の MDN 翻訳 Advent Calendar](https://qiita.com/advent-calendar/2023/mdn-translation-community-japan) の参加者が絶望的にいないので、こんな記事を書いてしまいました。たぶん明日も書きます。

おわり。
駆け出しエンジニアが既存のコードを読んで追加実装をするときに気をつけたいこと

# はじめに
実務でコードを書いていると、こういうもの！と型のように覚えてしまっているものが結構あります。
今回は、意識せずになんとなくで覚えて書いてしまっていたよくある実装で、意図しない動きになってしまったことで「そういうことなんだ！」と納得することができたので、共有したいと思います。

## この記事で伝えたいこと・結論
既存のコードを真似して書くと実装スピードは上がるが、その分考える機会が減り、理解が深まらない。
理由を考えながら実装することが大切！

# 具体例で説明

## 背景
プロダクトの海外対応に向けて、住んでいる国を選択できるようにする。
国を選択するselectボックスを実装することになった。

## この実装の目的
国名を選択したら、言語表示が切り替わるようにしたい。

## 設計
- 国名は`COUNTRY_LIST: {code: string; countryName: string; }[]`という型の配列が実装済みなので、それを使う
- 国名の選択はselect要素を使う
- 国名を選択するときに、formValueというstateを更新する
- 更新するstateはformValueのcountryCodeとlanuguage
- 日本が選択されたら、言語は日本語にする。それ以外の国が選択されたら言語を英語にする

## 実装
最初に私が書いたソースコードです。
国を選択するselect要素のonChangeイベントで、formValueというstateを更新できるように書きました。
```react
<select
  value={formValue.countryCode}
  onChange={(event) => {
    setFormValue({
      ...formValue,
      countryCode : event.target.value,
      language : formValue.countryCode === 'JP' ? Launguage.jp : Language.eng,
    });
  }}
>
  {COUNTRY_LIST.map((opt) => (
    <option value={opt.code} key={opt.code}>
      {opt.countryName}
    </option>
  ))}
</select>
```

## 問題発生
これで実装できた！と思ったのですが、想定外の動きになってしまいました。

要件通り、日本を選択したら日本語表示、日本以外を選択したら英語表示にしたかったのですが…
- 日本以外を選択しても英語表示にならない
- 次に日本を選択すると英語表示になる
- その次に日本以外を選択すると日本語表示になる

つまり、1つ前で選択した国によって言語が切り替わるようになってしまいました。

何が原因なのでしょうか。
Reactを触ったことがある方なら、すぐにお分かりになるかもしれません。

残念ながら私は自力では気づくことができず…😞
メンターさんに質問しました。

## 原因
結論からいうと、**表示したい言語を判定するロジックに更新する前のstateを使っていること**が原因でした。
わかりやすくするために、問題の箇所だけ確認します。

```react
onChange={(event) => {
    setFormValue({
      ...formValue,
      countryCode : event.target.value,
      language : formValue.countryCode === 'JP' ? Launguage.jp : Language.eng,
    });
  }}
```

languageのバリューを見てください。
三項演算子の条件が`formValue.countryCode === 'JP'`となっています。

一見良さそうなのですが、これでは比較する時に、更新する前(1つ前)のstateを参照してしまうことになります。
そのため、1つ前に選択した国にあてはまる言語に変わってしまうという、予想外の動きになってしまっていたのでした。

イメージしにくかったのですが、setFormValueする時に最初にformValueオブジェクトをスプレッド構文で展開している理由を考えるとわかりやすいと思いました。
formValueをスプレッド構文で展開するのは、更新するstateで上書きするためです。
つまり、展開されたformValueは、まだ更新していないstate、1つ前のstateということです。

ではどうすれば良いのか。
選択された国によってlanguageを切り替えたいので、**ユーザーがそのとき選択した国によって**判定すれば良いことになります。それはつまり、`event.target.value`です。

## 解決
以下が修正したコードです。
ついでにDRY原則に則って、共通する`countryCode`を変数に切り出しました。
```react
onChange={(event) => {
    const countryCode = event.target.value;
    setFormValue({
      ...formValue,
      countryCode,
      language:
        countryCode === 'JP' ? Language.jp : Language.eng,
    });
```
これによって、日本を選択した場合は言語が日本語、日本以外を選択した場合は言語が英語という要件を満たすことができました。

## 学んだこと
- onChangeなどのイベントでは、実行されて初めてstateが更新される
- イベントの中でstateを参照するときは、いつの時点のstateなのかを意識する！


## 終わりに
実務でコードを書くとき、すでにプロダクトは動いているものなので、大体はどこかで同じような実装がすでにされていて、それを参考にして書いています。
言い方を悪くすると、**コピペ**です。
わざわざ自分でロジック考えるよりも、先輩エンジニアが書いたコードの方が良いコードのはずですし、速いですから…

しかし、コピペしまくるのはよくないですね。
なんとなくでコードを書いてしまって、考える機会を減らしてしまいます。

今回の実装もこういうもの！と型のように覚えてしまっていて特に意識していなかったところですが、自分でコードを書いて間違えることで、**なぜそう書いてあるのか**を気づくことができました。

理由がわかって意識して書くのと、なんとなく書いてしまうのとでは、理解度に大きな差が出ると思うので、今後も**考えながら実装する**ことを忘れないようにします。
WSLにROS2を構築する

この記事ではWindows11のWSL（仮想Linux環境）を用いてDockerによるROS2(iron)の構築する方法と最低限の設定内容を記載する。

## Dockerを使って仮想空間にROS2を構築する
からあげさんが記事を書かれているので参考にROS2を構築した。

https://qiita.com/karaage0703/items/957bdc7b4dabfc6639da

#### まずはWSLを有効にする
1. コントロールパネルを立ち上げる。
1. プログラムを選択
1. プログラムと機能を選択
1. Windowsの機能の有効化または無効化を選択
1. Linux用Windowsサブシステムにチェックを入れて有効化する
1. 仮想マシンプラットフォームにチェックを入れて有効化する（私の場合最初からチェックが入っていた）

#### Ubuntuをインストールする 
1. スタートボタンをクリックし検索バーに「Pow」と入力しPower Shellを選択。「管理者として実行する」から起動する。
1. 以下のコマンドから選択できるディストリビューションを確認する。
```wsl --list --online ```
1. Ubuntuを選択してインストールする
```wsl --install -d ubuntu```
#### Ubuntuを起動する
1. 初回起動時をすると以下の項目が表示される
　- Enter new UNIX username: 任意のユーザ名を入力する
　- New password: 新しいパスワードを入力する
　- Retype new password: パスワードを再入力する
1. パスワードが正しく入力され認識されれば起動する
#### パッケージの更新とアップグレード
起動時は必ず更新とアップグレードを実施するのがお決まり。
``` sudo apt update ```
``` sudo apt upgrade -y ```
必要によりパスワードを聞かれるので入力する。

#### 2回目以降のUbuntuの起動
2回目以降はPower Shellを管理者として実行し、コマンドラインに```Ubuntu```と入力すればUbuntuが起動する。

## Dockerをインストールする
Dockerとは何か？についてはここでは省略します。
DockerとしてLinux環境＋ROS2構築済み環境を呼び出すことによりROS2を簡単に構築する。
これは参考記事にからあげさんが公開されているスクリプトを使ったため2コマンドで終了。
1. ```sudo apt install -y curl```を入力する。
1. 次に
```
curl -s https://raw.githubusercontent.com/karaage0703/ubuntu-setup/master/install-docker.sh | /bin/bash
```

 ## ROS2を実行する
 以下のコマンドを実行してROS2構築済みの環境を呼び出す。（初回起動時のみ呼び出しに時間がかかる）
 ```
docker run　-v /home/hoge/ros2_ws:/home/ubuntu/ros2_ws -p 6080:80 --security-opt seccomp=unconfined --shm-size=512m tiryoh/ros2-desktop-vnc:iron -m 1024m
 ```
ちなみに、-vオプションはdockerのデータを保存するためのオプション（ボリュームオプション）。Host側の/home/hoge/ros2_wsがバーチャル環境の/home/ubuntu/ros2_wsと同期され保存される。この設定がないとバーチャル環境で作成したデータは残らないので注意。-mオプションでメモリ容量を1024Mに設定。この設定もないとコンパイル時などにメモリ不足が多発したため必須。
 (ちなみにスワップ設定を変更して少ないメモリで動かそうとしたがDockerではうまく有効化できなかった。)
 
 これで構築完了。あとは任意のブラウザから以下のURLへアクセスすると仮想環境が立ち上がる。
 ```
 http://127.0.0.1:6080
 ```
 ## ROS2の設定
 ROS2のチュートリアルにしたがってサンプルコードをコンパイルする。
 ```
 cd ros2_ws/
 git clone https://github.com/ros2/examples src/examples -b iron
 colcon build --symlink-install
```
これで無事コンパイル実行することを確認できた。
【体験記】だらだらatcoderやってたら入茶に1年かかった話。

# はじめに
2022年の8月からAtCoderを初めて、だらだら１年間継続してようやく茶色になれたので今までの振り返りを兼ねて書きます。
完全にポエム的な内容なので、お時間のある方だけ読んでいただけると幸いです😀

# 振り返り
## 1年間の振り返り
AtCoderを始めてから茶色に至るまでの振り返りをしてみます。
惰性で進めていたら入茶までに1年もかかってしまいました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2230776/8532d80c-47e2-823f-d47a-6dba37fe4fc9.png)

## AtCoderを始めたきっかけ
自分はもともとpaizaのスキルチェックで競技プログラミングというものを知りました。2021年の年末から2023年の中頃まではずっとpaizaをやっていて、たまにAtCoderにも参加する程度でした。

paizaは難易度感が解きやすいB~A問題を主に解いていましたが、スキルチェックの模範解答や他の人の回答が見れない点から勉強しにくさを感じていました。

そこで2023年から毎週ABCに参加するようにしました。

## やったこと/ やっていること
自分が茶色になるまでには主に以下のことをやっていました。

- 毎週のABCへの参加
- 友人とAtcoderの過去問を解く
- 鉄壁本を買う

### 1年もかかってしまった理由
自分のやっていた取り組みは、割と灰色→茶色のフェーズでは妥当な内容だったとは思います。そこで、なぜ入茶に1年近くかかったのかを考えてみました。
主な理由としては以下の点があるかなと思います。


- 参加したコンテストの復習ができていなかった
- モチベーションに左右されていた

## 今後やること
今後はここまでの反省を踏まえて、↓のことをやっていきたいと思います。

- 鉄壁本が進められていないので計画立てて進める
- ABCになるべく参加できるように日程調整する
- ABCの過去問やAtCoder Problemsの過去問を解く
- 競プロやってる人のコミュニティに入る

大学4年生に上がるまで、つまり, 2024年の3月までに茶色卒業できるように精進していきたいと思います！
【GitHub】organization内のチームの可視性について検証してみた

# 背景
organizationの運用管理におけるチームの設定について調べていた。
チームを作成する際に可視性を「secret」か「visible」で選択できるが、
visibleの場合、onganization内のメンバー、organization外の方はそのチームがどう見えるのかわからないため、実際に検証してみた。

- GitHUb Changing team visibility

https://docs.github.com/en/organizations/organizing-members-into-teams/changing-team-visibility

# 検証項目
1. organization内のメンバー権限の人は、可視性がvisible、secretのチームはそれぞれどう見えるのか？
（organizationのBase permissionsはnoperissionを想定）
2. organization外の人はチームは見れるのか？
3. 補足：メンションについて

# 検証結果
### 1. organization内のnoperissionの人はどう見えるのか？
メンバー権限の方はチームの可視性がvisibleのチーム、並びに自分が所属しているチームは可視性がsecretでも見えてました。
また、自分が所属していないチームでsecretのものは見えませんでした。
表にすると以下のようになります。

|  |メンバー権限|オーナー権限
|---|---|---|
|可視性visibleのチーム|見えた | 見えた |
|可視性secretで自分が所属しているチーム  |見えた  |見えた  |
|可視性secretで自分が所属していないチーム  |見えない  |見えた  |


### 2. organization外の人がチームは見れるのか？
organizationに未所属の状態で、organizationのoverviewを以下画像のように開きました。
[チームの可視性についてのドキュメント](https://docs.github.com/en/organizations/organizing-members-into-teams/changing-team-visibility)に「People who are not members of the organization cannot view any teams.」とあった通り、そもそもチームのタブ項目すら見れませんでした。
よってorganization外のチームに関しては、外部から見れないと思われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/5b2ca37c-9761-9532-3b3e-b608b693aa19.png)


### 3. 補足：メンションについて
GitHubの[Mentioning people and teams](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#mentioning-people-and-teams)のドキュメントに以下の記載（Google翻訳）があったため、チームの可視性が関係するのかこちらも試しました。
```
チームの場合、@organization/team-name を入力すると、そのチームのすべてのメンバーが会話に登録されます。
```

- GitHub Mentioning people and teams

https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#mentioning-people-and-teams

organizationの中にあるリポジトリのIssuesにおいて、
以下のようにチーム名に自分が所属してるチームを記載し、
organization内の自分以外のメンバーの方にコメント頂きました。
```
@organization名/チーム名 通知とどいていますか？
```
こちらの内容はメールとして、自分がGitHubに登録しているメアドに送付されていました。

以下画像のようにメンションする際の予測変換に出てきたのは、
チームの可視性が**visible**のチームと、自分が所属している可視性が**secret**のチームでした。
GitHubのドキュメントにある通り、可視性がvisibleのチームはメンションできるが、
secretのチームはメンションできないものと思われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/76da0b39-b34a-ad19-577c-77da3a03c221.png)

何かの参考になれば幸いです。
confluenceの古い記事をQiitaっぽく、〜年以上経過しています、とヘッダに表示する方法

# はじめに
Confluenceはドキュメント管理ツールとしては結構書きやすいのですが、問題点がいくつかあります。

- 検索がし辛い（検索機能がひどすぎる・記事が全然HITせん）
- 古い記事がわかりにくい

ので、これらをQiitaの記事みたいに、〜年以上経過しています、みたいに表示した方法について書きます。

ちなみに、表示したいのはこんなやつです。
Qiitaでよく見るやつですね。

![スクリーンショット 2023-12-05 0.47.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1026740/8a40823b-44c3-e3ec-19cf-b7f9ecc73646.png)

# 方法
色々検索したらこちらに情報が載っていました。

https://bitbucket.org/snippets/akiko_pusu/rLMy7

ただ、前もって権限が必要だったので、うちの会社の情シス系の人に手伝ってもらいました。

以下のことをやる必要がありますが、これらはすべて
`Confluenceのグローバル管理者`である必要があります。

:::note info
- CSSをカスタマイズする
- ルックアンドフィールのコンテンツレイアウトを変更する
:::

記事の内容は少し古かったので、適用してみたところ正常に出てきませんでした。
ので、パーソナルスペースで色々試した結果が、こちらです。

## コンテンツレイアウトの修正
```js
<script type="text/javascript">

    AJS.toInit(function(){
        diff = getDiff();
		console.log("diff = " + diff);
        if (diff >= 1095) {
            AJS.$('div.page-metadata').append('<div class="alert alert-warning"><i class="aui-icon aui-icon-small aui-iconfont-time"></i>最終更新日から3年以上経過しています /  This page has not been updated in over 3 year.</div>');
        } 
     });    

function getDiff() {
		 last_modified = AJS.$('a.last-modified:first');
	    updated_at = last_modified[0].innerHTML;
      today = new Date();
        msDiff = today.getTime() - new Date(updated_at).getTime();
		console.log("msDiff = " + msDiff);
        daysDiff = Math.floor(msDiff / (1000 * 60 * 60 * 24));
		console.log("daysDiff = " + daysDiff);
        return ++daysDiff;
    }
</script>
```
数値はわりかし適当です。調整してください。
どっかの記事を参考にしたような気もします・・。記憶がおぼろげです。

とにかく、これによって判定ができるようになりました。

## CSSの修正
CSSの修正を入れないと、パネルの色が表示されないので、適用します。

```css
/* --- 更新状況Message -- */
#content > div.page-metadata > div.alert {
    padding: 10px;
    padding-left: 12px;
    margin-top: 10px;
    border: 1px solid transparent;
    border-radius: 4px;
}
 
#content > div.page-metadata > div.alert-warning {
    background-color: #fcf8e3;
    border-color: #faebcc;
    color: #8a6d3b;
}
 
#content > div.page-metadata > div.alert-warning > i { 
   right: 5px; 
   color: #8a6d3b; 
} 
 
div.alert-warning > div.message-content { 
   color: #8a6d3b; 
} 
 
#content > div.page-metadata > div.alert-success {
    background: #f3f9f4;
    border-color: #91c89c;
    color: #333;
}
#content > div.page-metadata > div.alert-success > i { 
   right: 5px; 
   color: #2D7273; 
}
```

で、これらを適用すると以下のような見た目になります。

![スクリーンショット 2023-12-05 1.00.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1026740/94edb635-4426-57d0-8271-fc18259e0185.png)

うん、良し！

気になる方は、是非、やってみてください。

ところで、英語、3 yearsな気がする。今見て思ったけど。権限ないから、スルーしておくか・・。
僕が思う「実務経験のないエンジニアが最初の職場で心掛けるべきこと」

## はじめに

僕がDMM WEBCAMPさんでプログラミング学習を始めたのは2020年12月なので今月でちょうど３年が経ちました。
時の流れが早くてとても驚いてます。DMMさんにはとてもお世話になりました。ということで、現在の受講生さん含め今後未経験からエンジニアとして働こうとしている人に向けて、「実務経験のないエンジニアが最初の職場で心掛けるべきこと」を考えて記事にしてみました。

## 自走力を履き違えない

特に未経験のエンジニアは自走力が大事なんて言われることもありますが、自走力とは具体的にどういう状態を意味しているかをイメージできますでしょうか？

自走力とは何か。いろんな答えがあると思いますがとにかく、**自走力とは何でもかんでも1人でやり抜くことって思い込んでると詰みます**。

困ったときは、必ず適宜質問をしたり助けを求めましょう。
「質問の仕方」に関するいい記事がたくさんあるので、是非色々調べて目を通しておくといいです。（下手な質問をすると先輩の時間を奪ってしまうことがあるので、ちゃんと質問の仕方を知っておきましょう）

https://qiita.com/seki_uk/items/4001423b3cd3db0dada7

僕は最初の頃自走力を履き違えていて極力自分でなんとかしていくことを心がけてました。しかしあるタスクで曖昧なところを自己解釈して進めてしまったせいで、仕様の認識のずれが判明し、大きな手戻りを発生させ納期に大幅な遅れを生じさせてしまったことがあります。
まずは何かしらのタスクをもらったらどのように進めていくのかをざっと考えてみて、曖昧なところは積極的に質問していきましょう。
また、タスクを振られた時にやるべきことはこちらの記事に書いてある手順や考え方がとても参考になるのでおすすめです。

https://qiita.com/jnchito/items/017487cd882091494298
## チームやプロダクトの課題は何かを考えてその解決策を提案してみる

未経験で最初の現場に入るとどうしても「教えてもらう側」といいますか、とにかく受け身になりがちではないでしょうか。
それは仕方ないと思いつつ、まだ何もわからない状態でも是非問題意識を持ちながら、主体的にプロダクトと向き合ってみましょう。
どんな小さいことでも構いません。例えば、「ここめんどいからこーいうライブラリ入れてみませんか」などと提案してみるといいです。

なぜかというと、チーム・プロダクトがより良いものになるのは当然のこととして、問題意識を持って能動的にプロダクトをよくしていこうとするとそれに伴って自分がとても成長できます。
「プロダクトやチームにはこーいった問題がある」
↓
「それを解決するためには何ができるかというのを勉強する」
という流れが生まれます。
提案して、否定されることもあるでしょう。しかし提案というアプトプットのおかげで、自分の考えのどこが未熟だったのかを知ることができます。どんどん恥をかいていきましょう。
（あと、再度転職するときにチーム、プロダクトのここを改善しましたーというネタにできるという副産物もあります）

## エラーログをしっかり確認する

エラーが起きたらちゃんとログを確認して、なぜエラーが起きたのかをチェックしましょう。
当たり前だろwwwと思われた方が結構いらっしゃるかもしれませんが、どうやらそんなこともないようで、ちゃんとログを見てただけで先輩に褒められたことがあります。
逆に、エラーログを見ればわかるようなことを先輩に質問すると、「ちゃんとエラーログを読みましょう」と注意されます。
英文がたくさん出てくると圧倒されて読むのが億劫になりますが、頑張って読んでいきましょう。

## 自分が書くコードに対して根拠を持つこと

これはAIでコードを簡単に生成されるこの時代において、より重要性を増したように思えます。
AIで生成されたコードだったりネット上に落ちてるコードをまるっとコピーし、よくわかんないけど動いてるからプルリクあげよーくらいの感覚でいると後で想定しないエラーが出て面倒なことになります。
また、書いた本人がよくわかってないコードは、他のメンバーも信頼することができません。最悪の場合、「適当なやつだ」といったイメージを与えてしまう可能性もあるので絶対に避けましょう。
自分が書いたコードはちゃんと他のメンバーにも説明できるくらい理解してた方がいいです。
具体的には
- なぜそのコードは動いているのか
- なぜそのコードを書くことを選択したのか（他の選択肢ではなく、なぜその書き方をしたのか）
を理解して、プルリクのDiscriptionにかけるくらいにしときましょう。

「なんかよくわからんけど動いてるからとりあえずリリースしちゃおう」みたいな考え方もあり、ごくたまにそーいった事態に陥るかもしれませんが、たとえそうなったとしてもしっかりテストを書いて期待する動作をするかを担保してあげましょう。


## (できるだけ)テストを書く

これもまた当たり前だろと思われるかもしれませんが、どうやらそこまで当たり前の話ではなく、結構テストを書かないという会社もあるようです。
転職先がテストを書かないとプルリクが通らないといった会社であればいいのですが、そうでない場合でも率先的にできるだけテストを書いていくといいと思います。
私の担当したプロジェクトではテストが書かれているのの、必須ではありませんでした。そのような環境でもできるだけテストを書くように心がけていたところ、先輩に「テスト書いてて偉いですね〜」と言われたことがありますw

テストを全く書いてない会社であれば、なぜそのような方針なのか聞いてみるといいですね。何かしらの事情がありテストを書いてないということもあるかと思いますので「できるだけ」という文言を使いました。
テストもコードなのでもちろん実装・管理コストがあります。がむしゃらにたくさんテストコードを書くのではなく、最初は力の入れ方に濃淡をつけて書くといいです。（例えばRailsならまずはmodelのテストはちゃんと書こうみたいな）

スクール等でRuby on Railsを学習してるなら、機能として動かせるだけで満足せず、ちゃんとRSpecの書き方にも慣れておきましょう。

## 【最後に】「なにがわかってないのか」を明確にしていき、少しずつ解消していく

未経験からの最初の現場では間違いなくわからないことだらけだと思います。ミーティングで先輩たちが何を喋っているのかも理解できないことがあるかもしれません。
勉強でも同じことが言えますが、自分はなにがわかってないのかを明確にしていき、少しずつでいいので解消していきましょう。一気に全部理解していこうとすると無理すぎて萎えます。ステップバイステップで成長していきましょう。
ほとんどの未経験エンジニアが通る道だと思います。
最初は辛くて大変かもしれませんが、少しずつできることが増えていくことを楽しみながら勉強できるといいですね。（僕も頑張ります！）
openSUSEのamarokがデータベースエラーの時の対処

openSUSEをアップデートした後、amarokがデータベースと繋げなくなったエラーが出ました。
>"The Amarok database reported the following errors:
>MySQLe something failed! on library initialization failed, return code 1"

というエラーメッセージが出てきます。使用には支障がありませんが、別のKDEアドオンもdbエラーが出てるので、これを解決したいです。
ほかのところに、./local/share/amarokを削除しなさいと言った人があります。でも削除しても改善していなさそうです。やはり言ってる人はわがままなガチ勢でしょう。
あとpacmanとcodecをdisableして、"zypper dup"で解決できそうな場合もあった。
念のため、YASTでpacmanとlibdvdをdisableし、SLEのrepoを有効化してzypperを実行しました。
```bash
sudo zypper dup --allow-vendor-change
```
そこで、pacmanのpackageがsleのpackageにダウングレードした。
amarokを再起動しても、GUIにエラーが出ないが、CLIに
>"Can't open and lock privilege tables: Table 'mysql.servers' doesn't exist"

というログが出た。
調べると、amarokのconfig->databaseにamarokdbの作成を関する説明があります。
```
sudo mariadb
```
```SQL
create datebase amarokdb;
grant all privileges on amarokdb.* to 'amarokuser'@'localhost'
identified by '****';flush privileges;
exit
```
でamarokdbを作成し、amarokuser@localhostを追加した。（****のどこはamarokuserのパスワードを設定）
このamarokuserとパスワードを入力して'test database connection'が成功した。
amarokを再起動したら、データベースに関するエラーメッセージがなくなった。
D言語で競プロをする際に注意すること


# はじめに

D言語で競プロをしていて、標準ライブラリ [Phobos](https://github.com/dlang/phobos) を使用する中で個人的にハマったポイントを紹介します。

# powmod は自作しよう

$x ^ n \pmod{m}$を計算するとき、繰り返し二乗法を使用すると $O(\log{n})$ で求めることができます。[^1]

```d
long powMod(long x, long n, long m) {
    long ret = 1;
    while (n > 0) {
        if (n % 2 == 1) {
            ret *= x;
            if (ret > m) ret %= m;
        }
        x *= x;
        if (x > m) x %= m;
        n /= 2;
    }
    return ret;
}
```

標準ライブラリには [powmod](https://dlang.org/library/std/math/exponential/powmod.html) が用意されていますが、引数の型によって処理速度が変わるので注意が必要です。

`powmod` の引数には符号なし整数型である `ushort`、 `uint` および `ulong` を使用できますが、$x$ と $m$ のどちらかの型が `ulong` の場合は処理速度が低下します。`ulong` 型を使用するとオーバーフローを防ぐために繰り返し二乗法の要領で乗算するので $O(\log{n}\log{m})$かかります。[^2]

`ulong` を使用した場合

https://atcoder.jp/contests/abc034/submissions/48164179

`uint` を使用した場合

https://atcoder.jp/contests/abc034/submissions/48164285

制約で $m$ の値が32bitに収まる場合は `uint` にキャストするか自作の関数を使用しましょう。

# `import std;` は慎重に
`import std;` と書くと標準ライブラリのすべてのモジュールをインポートできますが、関数のコンフリクトの恐れがあるので注意が必要です。

例えば `string` 型に `stride` 関数を使用するとコンフリクトします。実際に自分は弊社が10月に主催した [ABC323](https://atcoder.jp/contests/abc323) のA問題を解く際にハマってしまいました。

https://atcoder.jp/contests/abc323/tasks/abc323_a

問題は、与えられた文字列が`0`と`1`から構成されており、偶数番目の文字がすべて`0`であるかを判定するものです。
これに対して[stride関数](https://dlang.org/library/std/range/stride.html) を使って以下のようコードを書きました。

```d
import std;

void main() {
    string S;
    readf("%s\n", S);

    string res = stride(S[1..$], 2).all!"a == '0'" ? "Yes" : "No";
    res.writeln;
}
```

しかし、実行すると以下のエラーが発生します。

```sh
abc323a.d(7): Error: `stride` matches conflicting symbols:
/dlang/dmd-2.104.0/linux/bin64/../../src/phobos/std/utf.d(383):        function `std.utf.stride!string.stride`
/dlang/dmd-2.104.0/linux/bin64/../../src/phobos/std/range/package.d(513):        function `std.range.stride!string.stride`
abc323a.d(7): Error: none of the overloads of template `std.algorithm.searching.all!"a == '0'".all` are callable using argument types `!()(uint)`
/dlang/dmd-2.104.0/linux/bin64/../../src/phobos/std/algorithm/searching.d(121):        Candidate is: `all(Range)(Range range)`
  with `Range = uint`
  whose parameters have the following constraints:
  `~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
`  > isInputRange!Range
      - __traits(isTemplate, pred)
        or:
      - is(typeof(unaryFun!pred(range.front)))
`  `~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`
  Tip: not satisfied constraints are marked with `>`
Failed: ["/dlang/dmd-2.104.0/linux/bin64/dmd", "-v", "-o-", "abc323a.d", "-I."]
```

[std.range.stride](https://dlang.org/library/std/range/stride.html) と [std.utf.stride](https://dlang.org/phobos/std_utf.html#stride) がコンフリクトしていると言われます。

回避するには `import std;` を使わず必要なモジュールだけインポートするか、どの関数を使用するか指定しましょう。

```d
string res = std.range.stride(S[1..$], 2).all!"a == '0'" ? "Yes" : "No";
```

# おわりに

D言語で競プロしましょう。

[^1]: [「1000000007 で割ったあまり」の求め方を総特集！ 〜 逆元から離散対数まで 〜](https://qiita.com/drken/items/3b4fdf0a78e7a138cd9a)
[^2]: [Fix Issue 6244 - Add powmod / modpow function to std.math #5761](https://github.com/dlang/phobos/pull/5761)
MATLAB のグラフをクリックでデータ表示 ～ マウスクリックキャプチャーとデータヒント機能を使う

[<B>MATLAB/Simulink Advent Calendar 2023</B>](https://qiita.com/advent-calendar/2023/matlab)に参加しました。

カレンダー1の12/5分として追加しました。

・使用ツール
<dt>　MATLAB</dt>
<br>

<H4><a href="https://note.com/leftbank/n/n2904b20df273"</a> [<B>note</B>]にUpしました。</H4>
自宅サーバーを約1年運用した感想と中古PCは自宅サーバーに向かないっていう話

# はじめに
こんにちは！えか太郎です。
JK（情報大好き高校生）です。自宅サーバーを運用して一年がたったのでその感想を話していきたいと思います。
# 自宅サーバの機能と構成
おもにメルカリで買った中古のHPのElitedeskを使っていました。
### 自宅サーバーでやっていること
* TrueNAS（旧FreeNAS）
* windowsファイル共有（TrueNASから変更）
* マイクラ鯖（ただし私が飽きたのでほぼ使わず）
* Wi-Fiの中継器（詳細後述）
などなど。
### 自宅サーバーの構成
（draw.io使って今度画像作ります多分）
私はただのJKなのでルーターやプロバイダーなどは家族のものを使っているので特に私から語れることはないです。プロバイダーはBBIQらしいです。一応ネットワークの勉強をするためにYAMAHAのRTX810は持っています。Luaってなんなんだよﾜｹﾜｶﾝﾅｲﾖｰ
サーバー機本体はHP社製Elitedesk
今はWindowsServerが動いていますがちょっと前まではUbuntuServerが動いてました。
#### 性能
* CPU: i5 6500
* RAM: 16GB
* OS: Windows Server 2019(無料試用版）
* ROM
    * SSD: 32GB(怪しい中華製）
    * HDD: 4TB（しかしこのうち500GBくらいしかつかってない...)


これが今2台動いています。使い分けとしては１台は本番環境、もう１台はいろいろいじって壊すようですね。WIndowsの再インストールばかり上達してぜんぜん技術力は向上しませんでした。あとWindowsServerは半年は無料で使用できるのと使用期間の延長もできるので凄くすごいですね（語彙力Ｇ）

# 感想
この1年の感想として普段からＰＣを触る習慣がついたことで自作ＰＣから動作不安定時の対処法、pingコマンドによるネットワークのエラー解決など広く薄い知識が身についたように感じます。わりと万人向けにに自宅サーバーはお勧めできますね。またメリットについてはネットにいっぱいあるのでこれからよく言われるデメリットへの反論を述べます。
### よく言われるデメリット
* 火災
* 電気代がかかる
* VPSのほうが安い
* 騒音が発生する
などといった問題点を挙げられています。
### それに対する反論
* 火災
国内でパソコンから発火した事例はほとんどない
あったとしてもそれはノパソのバッテリーからの発火かコンセントの短絡（コンセントのプラグ周りのホコリは掃除しないと火災の原因になります）

* 電気代がかかる
電気代を払ってくれる家族か生活費を貢いでくれる人を準備してください。
* VPSのほうが安い
しかしVPSは構成を高性能にするとすごく高くなる
あとこのデメリットについて話しているブログの大半がVPSのアフィリエイトを提供してるのはなんでなんですかね（ジト目）
* 騒音が発生する
ファンコンの導入や防振ゴムの使用で生活音よりも静かにできます。まあブレードサーバーを買うんでしたらさすがに無理ですが。
## 結論
みんなで逸般の誤家庭をめざしましょう。技術者同士の技術トークの時に話のネタになるかも？くらいの期待があるかもしれないです。

# 副題：中古PCより新品miniPCのほうがいいぞ
### 中古PCの電源ユニットが逝く話
自宅サーバーを始めたいと思った私は、メルカリで中古PCを4台買いました。しかし、半年のうちに2台は電源ユニットが故障して起動しなくなりました。かなり大損こきましたね。
さらに、メーカーPCには独自規格の電源ユニットが使われているので交換するのも大変です。PCで故障率が最も高いのは電源ユニット（次はGPUかな？）ですし第六世代といえどATX電源が入らないものはやめといたほうが無難だと思います。
### 新品miniPCが無難では？
最近流行りのN100とか搭載しているminiPCがお勧めです。ただしPCIeで拡張カードさせないというデメリットが存在します。sataも増設できないという問題をどう解決するかは考えといたほうがいいかもしれないですね。（一応SATA-USBの変換するケーブルを使えば解決できる）中古PCと新品PC。予算をとるかリスクを避けるか。各自にあった最適なものを選んだほうがよいでしょう。
自衛官からエンジニアへ Elixirから始める Web開発 Part 5

この記事は「Elixir Advent Calendar 2023」5日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

普段は 合同会社TheWaggle で教材開発・システム開発・研修講師などマルチに活動してます。

このシリーズでは、文系ですらない、体育会系でも始められるプログラミング学習　というテーマで元自衛官だった僕が
自衛官からエンジニアになってもらいたいという気持ちを込めて、普段は大人しいですが、このコラムシリーズでは、あえて、体育会系のノリで、貴様ら理屈で覚えるなら体で覚えろ！というノリで書いてみたいと思います。

なので、初学者向けですが、理論は後回し、まずは動かして体感しろってノリの第5回目です。

それでは、いくぞ！

## 前回覚えたアトム、タプル、数値を使って武器情報を整理せよ！

いいか、貴様ら！
今日は前回までに覚えた、アトム、タプル、数値を使って、64式、89式、20式、重機関銃の武器情報と、それぞれの武器に利用する銃弾の関係を整理しろ！わかったな！

まず、それぞれ銃の名前をアトムで作成しろ。こんな感じだ！

```elixir
:"64式"
:"89式"
:"20式"
:"重機関銃"
```

何？　前回教わった事と何か違うだと？ 馬鹿者！ 前に : コロンがついてるだろう！何が違うんだ！
" " これは何だと？　よし！　良いところに気がついた。今回は貴様らを試していたのだ、この違いに気がつくか？どうか？を！

合格だ！貴様には特別に良い事を教えてやろう！ プログラミングの世界では、文字は "文字" ダブルクオテーションで囲むルールがある。

今回はタプルの名前を文字にしただけだ！

何？ 文字とタプルの違いは何か？だと！ 貴様の知識でそれを理解するにはまだ早い！　
今は、こういうものがあると分かれば充分、理屈は後回しだ！

よし、続いて それぞれに利用する 銃弾を準備しよう。7.62mmと5.56mmの２種類だ

```elixir
7.62
5.56
```

よし、これで `:"64式"`、:`"89式"`、`:"20式"`、`:"重機関銃"`, `7.62`、`5.56` 必要な情報が揃ったな。だが、このままでは新人には、どの銃とどの銃弾が対応しているかわからない。

そこで、今回はタプルを使って、対応をわかりやすくしていく、わかったな！まずは、手本を見て学べ！

![スクリーンショット 2023-12-05 0.14.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/0b8f7a4c-1cef-9bdb-90a7-75bf5ff961ab.png)

よし、これでどの銃がどの銃弾を扱えるかわかりやすくなった。

```elixir
{:"64式", 7.62}
{:"重機関銃", 7.62}
{:"89式", 5.56}
{:"20式", 5.56}
```

このようにタプルを使って情報をわかりやすくまとめる事ができるようになった。

* 教官、銃の重さも追加しました！

何、貴様やるなぁ、銃の重さも管理したいというのだな。

```elixir
{:"64式", 7.62, 4.2}
```

なるほど、しかしこのままだと `7.62`と`4.2`が何を表してるか分かりづらい！

* それではこれでどうでしょう？
```elixir
{:"64式", {:bullet, 7.62}, {:weight, 4.2} }
```

うむ、いいだろう。タプルの中にタプルで整理したようだな。
しかし、この方法だと管理する情報が増えるほど複雑で分かりづらくなる。

次回はもっと良い方法を教えよう。今日はここまで、それでは次回 Part6でまた会おう！
正規表現を簡単に書きたいっ

## はじめに
- 正規表現ってむずかしいですよね。
- そんなあなたにおすすめなライブラリがあるのでご紹介します。

## 今回やること
- phpで正規表現をわかりやすく書けるライブラリ `VerbalExpressions/PHPVerbalExpressions` の紹介
  - GitHub: https://github.com/VerbalExpressions/PHPVerbalExpressions
- 適当にpostした値をライブラリを利用して構築した正規表現でチェックしてみる

## 使い方
- `VerbalExpressions/PHPVerbalExpressions`のインストール
```
composer require verbalexpressions/php-verbal-expressions
```
- コントローラだったりモデル、サービスなど使いたいところで使うだけ

### 使用例
- URLの形式のに沿っておるか正規表現でチェックしたい時
普通に書くとこんな感じ ↓↓↓↓↓↓ むずかしい...
```
$regex = 'https?://[\w!?/+\-_~;.,*&@#$%()'[\]]+';

if (preg_match($regex, $str)) {
    echo '正しい!!!!!';
} else {
    echo '間違ってる!!!!!';
}
```
ライブラリを利用すると ↓↓↓↓↓↓↓↓↓ ビミョーにわかるかも？
```
$regex = new PHPVerbalExpressions();

// 正規表現を構築
$regex->startOfLine() // スタート
      ->then('http') 「http」が続く、
      ->maybe('s') // 「s」があってもなくてもいい
      ->then('://') // 「://」が続く、
      ->maybe('www.') // 「www.」があってもなくてもいい
      ->anythingBut(' ') // 空白以外の文字
      ->endOfLine(); // おしまい

// 構築した正規表現を取得
$pattern = $regex->getRegex();

if (preg_match($pattern, $request->test)) {
    echo '正しい!!!!!';
} else {
    echo '間違ってる!!!!!';
}
```
このように少しだけ読みやすくなります!!!!!!
then()やmaybe()などのメソッドの他にも色々メソッドあるので使いこなせれば色々できると思います!

### いくつかクイズです!
下記それぞれ2つの実装を見て、何の正規表現か当ててみてください!

#### No.1
  - ヒント
    - anything()は何でもありです
```
$regex = new PHPVerbalExpressions();
$regex->startOfLine()
    ->anything()
    ->then('@')
    ->anything()
    ->then('.')
    ->anything()
    ->endOfLine();
```
<details><summary>答えは ↓↓↓↓↓↓↓↓</summary>

`Eメールアドレスでした!!!`
</details>


#### No.2
  - ヒント
    - add()は正規表現パターンを追加するメソッドです
    - 「\d」は数字と一致という意味があります
```
$regex = new PHPVerbalExpressions();
$regex->startOfLine()
    ->add('\d{3}')
    ->then('-')
    ->add('\d{4}')
    ->endOfLine();
```
<details><summary>答えは ↓↓↓↓↓↓↓↓</summary>

`郵便番号(ハイフンあり)でした!!!`
</details>

## まとめ(思ったこと)
- このライブラリは簡単に正規表現か構築できていいですが、正直メールアドレスや、IPアドレスとかのバリデーションなどはlaravelのフォームリクエストに任せるのがいいかな。
- 使う場合、入力データのバリデーションや認可が主要な目的であれば、FormRequestを使って、文字列パターンの生成や検証が主要な目的であれば、PHPVerbalExpressionsと、使い分けるといいかもしれない。
- ただ、正規表現わからんマンがプロジェクトにたくさんいたり、特殊な検証で特殊な正規表現を構築する時だとコードが読みやすいなどの理由で導入してもいいのかなとか思ったり。

------------------------
実はphpだけでなく色々な言語verもあるので興味ある方は見てみてください
  - https://github.com/VerbalExpressions

ご視聴ありがとうございました!
継続的に開発しやすい状態にしていくために

## はじめに
こんにちわ。[求人検索エンジンスタンバイ](https://jp.stanby.com/)を提供している[株式会社スタンバイ](https://stanby.co.jp/)でエンジニアリングマネージャーをしている辻です。
[スタンバイ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/stanby) の記事として、私がソフトウェア開発において大事にしていきたいなと思っていることの１つ「継続的に開発がしやすい状態にする」についてポエムっぽく書きたいと思います。


## TL;DR
継続的に製品やサービスを開発していくために、コード本体以外の部分にも力を入れて整備しておくことが大事だと思います。


## 継続的に開発しやすいことが大事だと思う理由
ソフトウェア開発において大事な観点はたくさんあります。
UX、コードの品質、リリースタイミング、性能、コスト効率、セキュリティ、etc...　どれも大事ですがどの観点を重視するか、そしてこれらの優先順位というものはケースバイケースで流動的に変わってくるものです。
しかし、ほとんどの製品やサービスは最初にリリースして終わりということはなく、継続的に改善し続けながらユーザーに安定提供し続けていく状態になるので、
「継続的に開発がしやすい状態にする」という観点は、いつも共通して大事になってくるものだと考えています。


## どういう観点で考えるのが大事だと思っているか
「自分(自チーム)以外の人でもスムーズに開発に参加できるか」という観点で考えることが大事だと思っています。

ずーっと現状の自分(自チーム)が構成員が変わらずに、その製品やサービスを継続的に開発していくとは限らないです。

新しくチームにジョインする人たち、あるいは将来引き継ぐ人たちがスムーズに製品やサービスの開発に入れる状態にしておくことが、製品やサービスを品質高く継続的に開発していくために重要だと思います。


## どのような状態にしておくのが良いと思っているか
コード本体の品質（設計や可読性など）や技術選定ももちろん重要ですが、それだけでなく以下のようなことが重要になってくると思います。

書いてみるとどれも当たり前なことではありますが、当たり前をちゃんとやり続けることは何事においても実はとても難しいことだと思うので、常に意識しておくべきだと思います。


### README に開発に必要な情報をまとめておく
該当製品の Git リポジトリは開発する際に最も頻繁に見るところだと思います。
そのため、 README に以下の項目に記載しているの情報や資料へのリンクを置いておき、開発に必要な各種情報にスムーズに辿れるようにしておくことが重要です。


### 製品やサービスの概要を端的に記述しておく
製品やサービスの目的と提供しているものを端的に記述しておくことが、新規に開発に参加したばかりの人が製品やサービス、責務の理解をしやすいと思います。
例えば「求人の検索結果を返却する API 」など、概要がぱっとわかる一言があるくらいが良いと思っています。


### 容易に開発環境を構築できるようにしておく
開発環境の構築は、手順を明記したり自動化したりしてすぐに迷いなく実施できるようにしておくことが大事です。
この手順が複雑だったり情報が不足していると、開発に参加したばかりの人はかなりモチベーション下がりますし、普段の開発中も「自分の環境は正しいのだろうか？」という不安が常に付きまとうのも生産性を下げますし、開発環境の再構築が必要になったときのコストも高くなります。
コンテナやセットアップスクリプト等を用意して、ぱっと正しく開発環境を構築できるようにしておくと良いと思います。


### CI/CD の整備をしておく
コードを変更してデプロイする。この工程を手作業で全て確実に行うことは非常に困難です。
製品やサービスによってそのプロセスは様々かつミスれないところなので、特に開発に参加したばかりの人はここが一番不安なところだと思います。
「知らなかった」や「うっかり」で本番環境を壊してしまうことが起きないように、テストとデプロイは可能な限りの自動化と主導の場合はその手順を明記し、開発に参加したばかりの人でも安心してコードの変更ができるようにしておくことが大事です。
ちなみに慣れている人でも油断や疲れといった要因でミスすることがあったり手間がかかる部分なので、開発の初期段階から充実させておくべき部分だと思います。


### 開発ルールを明記しておく
コーディングガイドライン、プルリクエストのテンプレート、ライブラリの更新や追加の方針等々、開発に関する共通ルールは明示しておくと、特に開発に参加間もない人たちはチーム開発に関する不安が軽減されて良いと思います。
ルールに縛られるのも窮屈ですが逆にルールが無い不安というのもあります。「どんな観点でコードレビューされるのだろう、レビューしたらいいのだろう」など、開発のお作法は明記されているほうが良いのかなと思います。
また、コードのフォーマットになど自動的に制御可能な部分は自動化しておくことが良いと思います。


### ログ、アラートを適切に設定しておく
運用中の製品やサービスで異常が発生した際に迅速かつ正確に対応できるように、ログ出力とシステムメトリクスのモニタリングを整備し、異常があった場合にアラートが発火するように設定しておくことは継続的に製品やサービスを提供していくうえで重要になります。
ログは「Error」の一言や例外だけでなくちゃんとエラー原因をすぐに追えるような情報を付加して落とす。アラートに関しては SLA や SLO といった基準を決めてそれに準じた設定にしておく。など、いざというときに慌てずに対応できるように備えておくことは大事です。


### 変更履歴を確認しやすくしておく
Git のコミットログ、プルリクエストのタイトルや中身などは後から見返してちゃんと内容がわかるように、変更の概要や目的を記載しておくと良いと思っています。
運用中に問題が発生したり開発をしている中で、コードの変更履歴を確認することは度々あると思います。そんな時に「fix」の一言だけのコミットログだけしか情報が無かったりすると、混乱するし時間もかかるしストレスが溜まります。
後から変更履歴を追う人、あるいは将来の自分のためにもコミットログやプルリクエストの内容は雑にし過ぎないようにすることは大事です。


## おわりに
内容が非常にざっくりした記載かつ他にも大事なことは多々あるかと思いますが、まずは思っていることを記事にしてみました。

これからも安定してサービス提供を続けられるように、これらの当たり前のことを丁寧に継続していけるようにしていきたいと思います。

スタンバイでは一緒に求人エンジンスタンバイの開発をしてく仲間を募集中です！
[カジュアル面談](https://hrmos.co/pages/stanby-inc/jobs/100100463)で弊社の事業や技術等について説明させていただければと思うので、興味を持たれた方はぜひご連絡ください！
【JAWS-UG横浜】【#63】検出/モニタリング系LTまとめと用語確認

# はじめに
2023/12/04開催のJAWS-UG横浜イベントにて、
自分の業務に関わりの深いLTを備忘のため簡潔にまとめました。
※LTの内容と自分のコメントが混ざっているのでLTだけの要約ではないです。

正直re:Inventでアップデートされたサービスを全て追う時間がないので、
こういった機会で知れた/興味を持てた内容をピックアップしてまとめようと思います。

https://jawsug-yokohama.connpass.com/event/296737/

## また増えた！？CloudWacthの新機能紹介
Cloudwatchの新機能
Cloudwatch Service(ダッシュボード)：
　→サービスの健全性・可用性・パフォーマンスをダッシュボードで確認
Cloudwatch Map：
　→サービスの状況、依存関係をマップで表示
Cloudwatch SLO：
　→サービスを俯瞰してSLI/SLOで異常を検出

### Observability Shines a light on costs
オブザーバビリティがコストに光を当てる
→オブザーバビリティはワークロードを可視化するだけでなく、
　不要なコストがかかっている所も明確にしていけるみたいな感じ？

### CloudWatch Application Signals
AWS上のアプリケーションを自動的に計測し、運用・改善を容易にする
コーディング不要でAPの総合分析が可能なダッシュボードを提供

- 利用対象
    - EKS or EC2/オンプレミスでホストされるJavaアプリに限定
    - EKS以外はCloudwatchAgentとOpenTelemetoryのインストールが必要
- 主な機能
    - Service(ダッシュボード)
        - リクエスト成功失敗などの情報
    - サービスマップ
        - サービスのリクエスト、レイテンシ、障害、依存関係
    - ★SLO
        - 全てのサービスメトリクスを俯瞰で見れる
            - 一定周期でリクエストの成功率が99%以上になっているかなど確認
    - SLI
        - システムが正常である目標値を設定できる
    - SIOとSLIのメリット
        - システムにおける重要なふるまいを定義することができる。
        - W-Aの信頼性観点にもあるようなアプリケーションが正常である計測評価することが重要

## Amazon Detectiveの最新アップデートを5分でキャッチアップしよう
### Amazon Detectiveとは？
Amazon Detectiveはフルマネージド(運用不要)サービスであり、
インシデント発生時に調査を楽にしてくれる頼れるサービス

### re:InventにおけるDetectiveのアップデート
全部で4件
1. DetectiveがIAMエンティティ侵害の痕跡調査に対応
2. DetectiveがGuardDutyのECSランタイム脅威検知の調査に対応
3. Detectiveが生成系AIを活用した検出グループの概要を提供
4. DetectiveがSecurity Lakeからのログ取得をサポート

#### 1. DetectiveがIAMエンティティ侵害の痕跡調査に対応
- IAMユーザ/ロールを指定して怪しい動きをしていないか調査可能
    - 攻撃者が不正利用したIAMロール特定後に、どのようなアクションをしているか調査に使用できそう
    - ただ、具体的なAPIが表示されるのではなくアクションサマリ/TTPマッピングなどが検出される模様
    ※TTP：攻撃者がよく使用する手法やパターン
    - 要は不正利用の疑惑があるIAMがやったやばそうなアクションレポートが出る
    

#### 2. DetectiveがGuardDutyのECSランタイム脅威検知の調査に対応
- GuardDutyのアップデートをDetectiveでもサポート(GuardDutyの調査をDetectiveでも調査可能に)
    - GuardDutyのアップデートによりECSのランタイムの潜在的なセキュリティ問題を検出
    - そもそもランタイムって？
        - ファイルアクセス、プロセス実行、ネットワーク接続など、コンテナに関するデータ(コンテナアクティビティ)



#### 3. Detectiveが生成系AIを活用した検出グループの概要を提供
- Detectiveによる調査結果グループの内容を生成系AIでわかりやすく表示
    - AIと会話しなくてもサマリを連携してくれる
    - そもそも調査結果グループって？
        - GuardDuty の検出結果が項目として表示され、同じ種類の以上アクティビティをまとめて表示してくれるグループ

#### 4. DetectiveがSecurity Lakeからのログ取得をサポート
- DetectiveとSecurityLakeを統合することで、Detective側の操作でAthanaクエリによる調査を可能に
    - 問題個所の特定～ログ調査まで一括でDetective側でシームレスに行える


## AWS re:Invent 2023に参加してきた ~Amazon Inspectorのアップデートを添えて~

### re:InventにおけるInspectorのアップデート
全部で3件
1. Inspectorが開発者ツールと統合し、コンテナイメージのセキュリティを強化
2. InspectorのLambdaコードスキャンに生成系AIを使用した修復機能が追加
3. InspectorのEC2へのエージェントレスな脆弱性評価がリリース

#### 1. Inspectorが開発者ツールと統合し、コンテナイメージのセキュリティを強化
- CI/CDツール内でコンテナイメージのスキャンが可能に
    - 本稼働前にCICDの一連の流れでスキャンが行える〇

#### 2. InspectorのLambdaコードスキャンに生成系AIを使用した修復機能が追加
- InspectorによるLambdaコードスキャンが、生成系AIを使用してコード修復機能をサポート
- 具体的なコード案と適用のためのパッチファイルもダウンロード可能

#### 3. InspectorのEC2へのエージェントレスな脆弱性評価がリリース
- SSMエージェントがインストールされなくてもEC2脆弱性スキャンの実施が可能
    - 仕組みとしてはEBSのスナップショットを取得しスナップショットに対してスキャン

# おわりに
初めてのオフラインイベントだったけど、参加してみてよかった。
いつかは自分も登壇してみたいと。

# 参考
https://jawsug-yokohama.connpass.com/event/296737/
Amazon CloudWatchまとめ

# はじめに

「**Amazon CloudWatch**」についてまとめてみました。  
自分用なのでだいぶ雑ですが、参考になればうれしいです。

# 目次

- [はじめに](#はじめに)
- [目次](#目次)
- [Amazon CloudWatch](#amazon-cloudwatch)
  - [メトリクス](#メトリクス)
    - [標準メトリクス](#標準メトリクス)
    - [カスタムメトリクス](#カスタムメトリクス)
    - [CloudWatch アラーム](#cloudwatch-アラーム)
  - [ログ](#ログ)
  - [イベント](#イベント)
- [おわりに](#おわりに)

# Amazon CloudWatch

[Amazon CloudWatch](https://aws.amazon.com/jp/cloudwatch/) とは、AWSのリソースの使用状況を監視できるサービスです。CloudWatchはメトリクス、ログ、イベントの3つのデータを扱うことができます。  
それぞれについてまとめます。

## メトリクス

メトリクスとは、リソースの使用状況を収集し、数値化された時系列のデータセットのことです。コンソール、CLI、APIから参照することが可能です。メトリクスには**標準メトリクス**と**カスタムメトリクス**があります。  

### 標準メトリクス

CPU使用率やディスクI/Oなどの、AWS側で提供できる範囲のあらかじめ用意されているメトリクスです。何も設定をしなくてもEC2インスタンスを起動しただけで収集されます。  

### カスタムメトリクス

標準メトリクスでは収集することのできないメトリクスを収集できます。ユーザが独自に設定することができ、**CloudWatchエージェント**を導入することで、EC2のOS内部のメトリクスを取得することも可能です。

### CloudWatch アラーム

また、**CloudWatch アラーム**を設定することで、取得したメトリクスを分析して、アラーム通知をすることが可能です。  
アラームには3つの状態があります。
- **OK** ・・・ 閾値の範囲内
- **ALARM** ・・・ 閾値を超えている
- **INSUFFICIENT_DATA** ・・・アラーム開始直後であるが、メトリクスが利用できないかデータが不足しているため、状態を判定できない

## ログ

**CloudWatch Logs**を使用することでEC2、CloudTrail、Route53などからログファイルをモニタリング、保存、アクセスることが可能です。**メトリクスフィルター**を使用することで、ログのパターン街を行い、メトリクスの値を増加することができます。EC2のログを外部で保持することによって、よりステートレスにすることが可能です。

## イベント

**CloudWatch Events** をつかうことで、AWSリソースの変更を伴うシステムイベントをトリガーとして、対応したAWSサービスによるアクションを自動化できます。トリガーには時間ベース、AWSリソースのシステムイベントの2種類を設定することが可能です。**Amazon EventBridge** はCloudWatch Eventsをベースに拡張されたサービスらしいです。

# おわりに

Amazon CloudWatchについてまとめてみました。  
まだ十分に理解できていないですが、少し整理された気がします。  
SysOpsの勉強頑張ります。
自分以外の人がPRを作成した際に、Slack通知するようにした

:::note
社内の他のメンバーが作成したPRも全て目を通すために、PRが作成されたらSlackで通知されるように設定しました。
とても簡単な方法ですが、メモしておきます。
:::

## PRがオープンされたら、Slack通知されるように設定
1. Slackを開く
1. プロフィールアイコンをクリック
1. 環境設定をクリック
1. マイキーワードを設定
    1. 通知を受け取りたいキーワードを入力する
    1. 他の人がPRを作成した際に気づくように、「`Pull request opened by`」と入力
1. キーワードを保存する
DAXのJOIN関連操作③ ～NATURALLEFTOUTERJOIN～

# DAXによるJOIN

DAXを利用したJOIN関連の関数をしらべていきます。

:::note
本記事は「Microsoft Power BI Advent Calendar 2023」、5日目の記事です。
https://qiita.com/advent-calendar/2023/powerbi
いいね！ 👍 よろしくお願いします！
:::

# JOIN系関数シリーズ

https://qiita.com/akihiro_suto/items/658cacb15cb4ffbf549d

https://qiita.com/akihiro_suto/items/cae5f45ad1089de7aa62

https://qiita.com/akihiro_suto/items/4bd6b0800da3a2501e89

## OUTER JOIN(外部結合)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/d1804a83-4170-d29a-d03a-83b0a15c82f6.png)

OUTER JOINは左側テーブルに存在する行にたいして結合処理が行われます。
DAXで外部結合を行うときは、**NATURALLEFTOUTERJOIN**関数を使用します。

NATURAL**LEFT**OUTERJOIN関数だけ存在しているため、右側外部結合を行いたいときは、DAXを書くときの順番を変える必要があります。

https://learn.microsoft.com/ja-jp/dax/naturalleftouterjoin-function-dax

```構文.dax
NATURALLEFTOUTERJOIN(<LeftTable>, <RightTable>)
```

結合に関するルールは、NATURALINNERJOIN関数同様、データリネージュが同一（リレーションシップでつながっている）である必要があります。

### 実践

国IDがキーとなり、左側テーブルの行はすべてのこり、右側テーブルは左側テーブルの国IDに対応している行が結合されてのこっています。右側テーブルに対応する行がない場合、空欄になっているのがわかるかと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/86eb3c5d-dacd-33ff-b5ea-1b0416b89419.png)

# まとめ

以上、DAXのJOIN系関数を調べてみました。
タグ付きテンプレートを使ったJest eachの書き方

Jestのテストを書いていて、便利だと思ったので、紹介です。

# テンプレートリテラルとは
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Template_literals

> テンプレートリテラルとは、バッククォート区切られたリテラルです。

これは、なんとなくわかります。

```javascript
console.log(`hoge hoge`);
// => hoge hoge
console.log(`hoge 
hoge`);
// => 
// hoge 
// hoge
hoge = 'hoge'
console.log(`hoge ${hoge} hoge`);
// => hoge hoge hoge
```

# タグ付きテンプレートとは
> タグつきテンプレートリテラルは、リテラルから任意のテキストセグメントの配列と、任意の置換の値を引数として関数（タグ関数）を呼び出します。

いまいちわからなかったので、例を書きます。

```javascript
const val1 = "TaggedTemplateLiteral"
const val2 = "amazing"

function WhatTaggedTemplateLiteral(strings, ...values) {
    console.log(strings);
    console.log(values);
}

WhatTaggedTemplateLiteral`I think ${val1} are ${val2}.`
// => ['I think ', ' are ', '.', raw: Array(3)]
// => ['TaggedTemplateLiteral', 'amazing']
```

すごく例が微妙ですが、なにがわかるというと
`strings`の中には、`${}`で区切られたものが配列になっていて、
`values`の中には、`${}`の中身が配列になっています。

# タグ付きテンプレートを利用したJest each
上記で説明したタグ付きテンプレートを使って、Jest eachを書くと👇
```javascript
test.each`
amount              | taxRate              | taxIncludeAmount    | explanation
${new Decimal(100)} | ${new Decimal(0.1)}  | ${new Decimal(110)} | ${`消費税10%`}
${new Decimal(100)} | ${new Decimal(0.08)} | ${new Decimal(108)} | ${`消費税8%`}
${new Decimal(100)} | ${new Decimal(0.05)} | ${new Decimal(105)} | ${`消費税5%`}
`(`$explanation の計算`, ({ amount, taxRate, taxIncludeAmount, explanation }) => {
        expect(amount * (1 + taxRate)).equals(taxIncludeAmount)).toBeTruthy();
});
```

このように同じような値の計算を繰り返しテストや閾値付近のテストでは、タグ付きテンプレートを使って書くと可読性が上がるので良いと思いました。

https://jestjs.io/ja/docs/api#testeachtablename-fn-timeout
ノーコードで保育園のお迎え行ってくるよ連絡を楽にした #IFTTT

## 「お迎え行ってきます」連絡を楽にできんかね


在宅ワークが主流になったものの、もちろん出社の日もある。

ここで発生する、**保育園のお迎えあるんで急いで帰るワーク**

我が家は保育園が自宅と近いものの、会社からは遠いので出社時はお迎えに時間がかかる。そのため、業務終了後は急いで会社を出てる。

そして退勤し会社を出るときには毎回、夫に連絡をしている。


連絡していないと、夫は、仕事がたてこんでる？自分が迎え行くべきか？と不安になるので連絡は必須。

**ただ、電車に間に合うように急いで駅に向かってるんで、LINEするのめんどい！**
**会社出たらLINE自動で送ってほしい！簡単に！！**

ということで学びたてノーコードツールで作ることにします。

## できたものがこちら

会社を出ると、自動でLINEを送ってくれます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569867/a2c6221e-d4e2-8ed6-536d-60c705d63cf5.jpeg"width=70%>


### 使ったもの

* IFTTT
* LINE Notify

設定など参考：[制作時間10分！プログラミング経験関係なし！おむかえ時間自動連絡システムが便利すぎた #IFTTT](https://qiita.com/chiiirotty/items/0cac9262ddcb382b1fca)


### 内容説明

今回はIFTTTだけを使って作りました。レッツノーコード！
* If は　location の「You exit an area」
* ThenはLINEの「Send message」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569867/eb032f1e-3729-67b8-79c7-8d835b6e4c3b.png)

### locationの設定
「You exit an area」は「指定したエリアから離れると」がトリガーになる。
なのでマップで自分の会社を指定する。

::: note warn
位置情報は常に使用できる状態にしておく必要あり！
:::

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569867/2c135c59-8718-6f68-dcba-e74f178d981b.png" width=80%>

※場所はイメージです。


### LINEの設定
IFTTTと連携させたLINE Notifyを使用。
「保育園のお迎え」というグループLINEを作り、夫とLINE Notifyを招待しておく。そして送るメッセージを設定。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569867/903cc3fc-c436-d6cc-5bb5-0f7a06fc18d7.png" width=80%>


これで、会社を出ると、最初の画像のようなLINEを自動で送ることができちゃう！

## 使ってみた感想
え、、**めっちゃ楽。** これは便利。
移動するだけでLINEしてくれるなんてありがたい！こっちはとにかく急いでるからね！
夫にも感想を伺ったところ、 
**「うん、いいんじゃない」** 
とのこと。軽い。~~（まぁ君はLINE見るだけだもんね。。）~~
でも普段何にでも辛口な夫から「良い」が出たので、良いものが出来たとしよう。
何度も使っていくと、「あってよかった！」ってなるんだから！

## さいごに
IFTTTを今まで知らなかった自分、こんな便利サービスにびっくりだよ。。
ノーコードですよ。コード書くの嫌いなんだから私。トテモ嬉シイ。
今回IFTTTを使ったQiita記事色々見てみましたが、使い方たくさんあってこれもいい！あれもいい！と感動しました。
**でも無料で作れる数が少ない・・・！**

**ちなみに**
そろそろお迎えの時間だよってことを知らせるモノも作ってみました↓
あわせて使うともっと便利なワークライフに！

https://qiita.com/sotan115/items/d364dedaae6b875dc7c6
Z検定の定義と棄却域の求め方の例(統計学的仮説検定)

# はじめに
初の「学生対抗アドベントカレンダー」として投稿する。
統計学の初学者が最初に理解に苦しむであろう統計学的仮説検定の初歩的な説明の記事である。

"学生対抗"ということだが、今回の記事はいくらかQiita利用者の学生諸君に有用な記事になるかと思う。
なぜなら、学生が統計学を勉強することは役に立つことが多いからである。
大学院生ならば研究活動においては役に立つ場面も多いだろうし、そうでなくとも、流行りのデータサイエンスで就職したい人には、統計学はまずもって必須な知識となる。

仮説検定を一度でも勉強した経験のある人(あるいは初学者でもお手元のテキストの仮説検定の章を参照しながら)であれば10分もかからずに読める記事になっているので、是非ご覧になっていってください。

# 概要
この記事は、Z検定と棄却域の作り方にフォーカスした、統計学的仮説検定の初歩的な説明の記事である。

統計学の理論から仮説検定の実践の間の溝を少なく自然な理解が得られることを目指して、わざと独特な論法を取ることにした。しかし、力及ばず、多少物議を醸す議論になっている可能性がある。そう感じた場合は、ぜひ、コメント欄にて忌憚なき意見を伺いたい。

# 理論
z検定とは、仮説検定方式の一種。
(仮説検定方式とは、標本空間 $\mathcal{X}$を棄却域$R = \lbrace x | H_0を棄却 \rbrace $と受容域$A = \lbrace x | H_0を受容 \rbrace $に分割するルールのことをいう。)

Z検定は、上側Z検定、下側Z検定、両側Z検定の三種類に分けられる。

上側Z検定は、以下のルール要件からなる仮説検定方式である:
- 「第一の誤信の確率(有意水準)」と「標準正規分布(Z分布)の上側確率」を同一視する

下側Z検定は、
- 「第一の誤信の確率(有意水準)」と「標準正規分布(Z分布)の下側確率」を同一視する

両側Z検定は、
- 「第一の誤信の確率(有意水準)」と「標準正規分布(Z分布)の上側確率」$\times 2$を同一視する


標準正規分布の上側パーセント点の値はよく知られているので、その値と上記の分割ルール要件を使って棄却域の境界を逆算すればよい.

# 例題
品種Aの芋虫のサナギ化直前の体長$X_i$ ($i=1,2,\dots$)が、正規分布$N(\mu, 0.64)$(母分散が既知)に従うとして、その母平均$\mu$について、$\mu = 6$(cm)かそれより小さいかの検定は、以下の構図となる:

帰無仮説$H_0: \mu = 6$ vs 対立仮説$H_1: \mu < 6$

また、ランダムサンプリングの標本サイズは$n=10$であるとする。

(1)この時、有意水準(第一の誤信の確率)を0.05としたときの棄却域を求めよ.
(2)得られた棄却域からいえることは何か？
(3)標本サイズ10でランダムサンプリングしたところ、以下の観測値が得られた:
1.2, 3.5, 6.3, 5.5, 3.6, 6.8, 4.2, 2.5, 7.0 3.2 (cm)
このとき、帰無仮説は棄却されるか？


### (1)の解答

有意水準を$0.05$に設定する。

$
\begin{align}
P(X \in R|H_0が正しい) =0.05\\
\end{align}
$
これは下側の片側検定であるから、下側Z検定のルールより、「第一の誤信の確率(有意水準)」と「標準正規分布(Z分布)の下側確率」を同一視する:

$
\begin{align}
0.05 = P(X \in R|H_0が正しい) = P(Z < c) \\
\end{align}
$

ただし、下側確率が$0.05$の時の下側パーセント点の値を$c$と置いた。

ここで、標準正規分布において下側確率が$0.05$の時の下側パーセント点の値は$-1.645$であることが知られている(持っている統計学の教科書の巻末の標準正規分布表を見よ)ことから、$c = -1.645$と定まる。

よって、
$
\begin{align}
P(X \in R|H_0が正しい) = P(Z < -1.645) 
\end{align}
$

ここで、$X_i \sim N(\mu,0.64)$を思い出すと、$ T_{\mu} = T(\vec{X};\mu) =\sqrt{10}(\bar{X}-\mu)/0.8 \sim N(0,1)$である。(ただし$\bar{X} = \frac{X_{1} +  \dots + X_{10} }{10}$)
また、領域$R_{T_{\mu}}$を以下の同値関係を満たすように新たに定める:

$
\begin{align}
X \in R \Leftrightarrow T_{\mu} =\sqrt{10}(\bar{X}-\mu)/0.8 \in R_{T_{\mu}}
\end{align}
$

(単に領域に四則演算の連続を施して平行移動、伸び縮みさせているだけなので、一意に定まるとしてよい)

すると、
$
\begin{align}
P(Z < -1.645) &= P(X \in R|H_0が正しい) \\\\
&=P((T_{\mu} \in R_{T_{\mu}} |\mu = 6 ) \\\\
&= P(T_{\mu = 6} \in R_{T_{\mu =6}})
\end{align}
$

$T_{\mu = 6} \sim Z \sim N(0,1)$なので、上の等式から、$R_{T_{\mu=6}} = (-\infty,-1.645]$としてよい。
よって、

$
\begin{align}
X \in R &\Leftrightarrow T_{\mu=6} =\sqrt{10}(\bar{X}-6)/0.8 \in R_{T_{\mu=6}}\\\\
& \Leftrightarrow \sqrt{10}(\bar{X}-6)/0.8 \leq -1.645 \\\\
& \Leftrightarrow \bar{X} \leq -1.645 \times 0.8/ \sqrt{10} + 6 = 5.584 \\\\
& \Leftrightarrow X \in  \lbrace x \in \mathcal{X} | \bar{x} \leq 5.584 \rbrace 
\end{align}
$
よって、棄却域は、
$
\begin{align}
R = \lbrace x \in \mathcal{X} | \bar{x} \leq 5.584 \rbrace
\end{align}
$
である。ちなみに、受容域は、その定義から
$A=\lbrace x \in \mathcal{X} | \bar{x} > 5.584 \rbrace$
である。
### (2)の解答
(1)で得られた棄却域より、
サイズ10でランダムサンプリングしたデータの標本平均を取ったときに、
その値が5.584cm より大きい場合は棄却しない。
つまり、6cmより多少小さくても、それが0.4cm程度小さいくらいなら、ほぼ6cmに一致している、と判定する。
### (3)の解答
得られたデータから標本平均(実現値)を計算すると、$\bar{x} = 4.38$であり、これは棄却の条件$\bar{X} \leq 5.584$をみたすので、帰無仮説$H_0 :\mu = 6$は棄却される。