OmniAICreator/Qiita-1.07M huggingface dataset:
LEDパネルキットAKBONE2022で楽しもう！ Beta2版

AVTOKYO Beta1 版を頒布した AKBONE2022 キット。その後勉強会などで展開するために一般販売を開始しました。ちょっと構成を見直しして Beta 2 になっています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/9dd084f7-979c-22da-bb56-5062a0b52769.png)


Beta2 は数量限定で、メルカリで販売しています!
https://jp.mercari.com/user/profile/919125624
数セットを出してますが、売れた分は残り10数セット分あるので補充します(部材がなくなり次第終了)。

# ラインナップ

今回、ラインナップは3つになりました。

## 基本キット 安い方

 ￥4800(税・送料込み)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ea15c73a-7a25-ad98-db8d-c879c54e21d6.png)

## 基本キット 高い方

 ￥7600(税・送料込み)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/bed83ebe-34ce-7be3-85e7-2b7642b9a5e3.png)

## ブースターパック

 ￥2600(税・送料込み)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/b82c242f-3bed-0d67-6e15-30fc03fa96ff.png)

# Beta2 の注意!

今回の Beta 2 を楽しむにあたって、注意点があります。

## 基本キット 高い方を使う場合の注意

高い方の基本キットに用いる P2 (ドットピッチ2mm) の LEDパネルはとても繊細です。
ちょっとしたことでピクセルが取れてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/bbcaa1ee-e787-05f9-2dfd-f164b3bb4263.png)


破損を防ぐために、ご使用に当たり3つの対策を取ることとしました。恐れ入りますが3つの対策手順を実行してください。

### 対策1

購入された方は、到着次第まずパネルがこわれていないかどうか確認してください(商品ページに確認方法を記載しています)。

### 対策2

添付のビニールテープを使い、破損防止のためとしてLEDパネルに巻き付けてください。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/110ca770-b399-879e-aa83-2c6fc709fdb0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/548a07fc-d666-343e-f6de-4b98d40a3653.png)

### 対策3

パネルのLED面にぶつけたりしないよう、慎重にパネルを扱いください。



## Beta1 と違う点に注意!

基本的には Beta1 版と同じですが5点内容品に変化があります。

### その1  ビニールテープ追加(基本キット 高い方の場合のみ)

先に説明した、LEDパネル保護用のビニールテープです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a0f428cf-9a0b-bea5-ae73-551d7bd20dc0.png)

### その2 電源補助ケーブル追加

電源補助ケーブルをBeta2キットにつけることにしました。
プログラム書き込み時の不安定を改善します。
また、ESP32 ボードの USB コネクタの使用頻度を下げて破損を防ぎます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/602dc7b2-6aa7-388b-c13f-7b50b5c710f9.png)



### その3 電源補助ケーブルコネクタ追加

ここにはんだづけしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/0f7c260b-a881-0b1f-64a8-81867c765e09.png)

補助電源ケーブルを刺して使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/76e58a04-d43b-a2a8-adf4-0b86aedaf2df.png)


### その4 タクトスイッチ追加

「ブースターパック」の内容物にタクトスイッチを追加しました。
ここにはんだづけしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/7ca18414-678c-ad06-9320-88b6e03775e1.png)

### その5 ブースターパックピンソケット変更

ブースターパックに同梱したピンソケットを、低いものに変更しました。
ジャイロモジュールの取り付け位置が高くてESP32ボードのケーブルに干渉するのを軽減します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/234d3fe8-4da5-bdfc-3992-50132786a363.png)


# 楽しもう!

上記の注意点以外は、Beta1 版と同じです。
「LEDパネルキットAKBONE2022で楽しもう！ Beta1版 」
https://qiita.com/nanbuwks/items/4317031bdf3bdcfafbf8
を読んで、楽しみましょう!

# AKBONE2022キットの今後

今回は勉強会などで利用しやすいように、入手のしやすさを工夫してみました。

12/17 に勉強会を開催しますが、
https://lowleveltokyo.connpass.com/event/269268/

これ以降もプログラミングや電子工作の教材として使えるように入手性を改善する予定です。
来年以降は別チャンネルで販売するつもりで、Beta2 では見送った、Linux ボードオプションなども扱いやすく改善して提供したいと考えています。乞ご期待!
開かない開発者ツールを開く方法

この記事はWindows 11(22H2)、Google Chrome(108.0.5359.99)の環境で解説しています。

開発者ツールは「F12」か「Ctrl+Shift+I(i)」の同時押しで開けますが
もし開かなくなった際の応急処置として

# 開発者ツールが開かない原因

+ ブラウザ側の問題
すべてのURLで開かないときに考えられます。

+ サーバー側が開発者ツールを開かないようにしている
一部のURLで開かない時に考えられます。
サーバー側がJavaScriptで開かないようにしている可能性があります。

+ 周辺機器の問題
すべてのURLどころか、そもそもF12キーや右クリック、I(i)キーが反応しない場合に
考えられます。

それ以外が原因で開かなくなった有識者の皆様コメント求む

## 対処法(ブラウザ側の問題)

+ 再インストール
ブラウザが正常に動いていない場合は再インストールしてみてください。

+ 追加した拡張機能を無効にする。
追加した拡張機能により開発者ツールが無効になっている可能性があります。
Edgeの場合は[こちら](https://win10labo.info/edge-devtool/ "Edgeの設定で無効にしていませんか？")も考えられるので参考までに。

+ その他
[こちらの記事](https://qumeru.com/magazine/63 "マルチディスプレイが原因になることもあります")なども参考にしてみてください。


## 対処法(サーバー側がそもそも開かないようにしている)

1\. 右上の「︙」をクリックします。

2\. その中で「その他のツール」を選択します。

3\. 「デベロッパーツール」を選択しクリックします。

写真を使って説明すると・・・
![デベロッパーツール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982234/9fee00a1-351f-6488-b50f-69217a61675f.png)

## 対処法(周辺機器の問題)

1\. [こちらの](https://anysweb.co.jp/mousecheck/ "マウス動作確認")[サイト](https://anysweb.co.jp/keycheck/ "キーボード動作確認")で動作確認します。

2\. そのうち、F12キーが動かない、I(i)キーかCtrlキーかShiftキーどれかが動かない、マウスの右クリックが動かない、を**全て**満たす場合は周辺機器が原因の可能性が高いです。

3\. もし他のマウスやキーボードに変更しても変わらない場合は、[デバイスマネージャー](https://support.microsoft.com/ja-jp/windows/windows%E3%81%A7%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E3%82%92%E6%89%8B%E5%8B%95%E3%81%A7%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B-ec62f46c-ff14-c91d-eead-d7126dc1f7b6 "デバイスマネージャーの開き方はこちら")を使ってドライバーを更新してみてください。
# 最後に
周辺機器に問題がなく、どうしても解決しない場合は、違うブラウザで開発者ツールを開くのも手です。
開発者ツールを使うと作業効率が高くなるのでもし無効になっていたら有効にさせておくことを推奨します。

# アドベントカレンダー

[IPFactoryアドベントカレンダー](https://qiita.com/advent-calendar/2022/ipfactory)

[13日目担当者　Piza-610さん](https://qiita.com/Piza-610/items/96ea5c6d55d91a902744 "『たすき』をたぬき")

[15日目担当者　im_yappiさん](https://www.yappi.jp/blogs/01gkdctbgtdrkrgh38wtqs5bp1 "Echartsを布教したい！")
[GitHub] 自動で偽の草を生やして努力するのをやめようや

# はじめに

みなさん、GitHubの草を生やすことに囚われていませんか？そんな努力今日でやめましょう。今回はプログラミングを毎日頑張っているかのように錯覚させる、全自動草生やしBotを作成していきたいと思います。

## 草を生やすためのリポジトリ作成

[リポジトリの作成から始めましょう](https://github.com/new)
また、リポジトリをPublicにするのはやめましょう。毎日同じリポジトリにコミットしているのがバレるからです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/4a110ea9-1a32-514c-e931-d130f64e721a.png" width="90%">

## workflowを作成するyamlファイルを作成

`set up a workflow yourself`をクリックします。

![スクリーンショット 2022-12-13 23.51.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/0d622643-e883-ae7f-de47-21b40c2a4c5a.png)

## yamlファイルの記述

以下のコードを貼り付けてください。毎日、朝10時にREADMEにwが1つ生えます。また、`workflow_dispatch`をつけているので手動で草を生やすこともできます。のちに解説します。

```yaml
name: Grow grass

on:
  schedule:
    - cron:  "0 0 * * *"
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Grow grass
        run: |
          git config --global user.email ${{ secrets.USER_EMAIL }}
          git config --global user.name ${{ secrets.USER_NAME }}
          echo "w" >> README.md
          git add README.md
          git commit -m "[add] w"
          git push origin main
```

## シークレットの追加

workflow内で参照するシークレットを作成します。`USER_EMAIL`と`USER_NAME`を作成してください。

![スクリーンショット 2022-12-13 23.58.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/13590af3-a2a7-e76e-691e-11cc0dd80a4c.png)

## 動作確認

作成したworkflowを手動で実行してみましょう。

![スクリーンショット 2022-12-13 23.54.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/8469f1a9-0e68-8ebb-6916-c22b44dfe9e0.png)

workflowが正常に終了すれば、緑色になり

![スクリーンショット 2022-12-14 0.02.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/cf6bb872-68a8-39d2-de00-6720b4d183b0.png)

あとは、READMEの草が増えていることを確認すればOKです。

![スクリーンショット 2022-12-14 0.04.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/f85d0a55-70f4-fad4-22dc-404b05123567.png)

## その他設定

GitHubはデフォルトでPrivateリポジトリへのコミット履歴(草)を他人に表示されないようになっているので以下の設定を有効にしておきましょう。

![スクリーンショット 2022-12-14 0.08.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/6096eff7-fa3d-2747-29a9-0577f4d4d011.png)

## 未ログイン端末で自分のGitHubを確認

さあ、他人からはどう表示されるか確認します。草が生えているかつPrivateリポジトリ履歴がしっかり残っていればOKです。

![スクリーンショット 2022-12-14 0.23.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/b8d3791a-b587-05be-939e-1de721648579.png)

# おわりに

いかがでしたか？これで、毎日自動でGitHubの草を生やしてくれるBotを作ることができました。また、Privateリポジトリなので毎日プログラミングを頑張っているように騙すことができますね。
ROS2導入::Raspberry Pi4 + Ubuntu22.04 + ROS2 Humble でロボット作り（その４）

# ROS2 Humble導入

## やっとROS2導入です
環境作りって手間ですよね。。。

## ROS2 Humbleの導入

### SSH接続して導入
Visual Studio Codeを起動して、ターミナルからSSH接続してみます。
```bash
$ ssh username@host.local
```
接続したら公式の導入手順どおり実行します。
https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html

:::note warn
Set locale は設定済みなら不要（多分初期設定で済ませていると思う）
:::

以下順にコマンド入力
```bash
$ sudo apt update && sudo apt install curl
$ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
```

更新してHumbleインストール
```bash
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install ros-humble-desktop
```

.bashrcにsourceを登録（登録しないと毎回入力する手間がかかるため）
```bash
$ nano ~/.bashrc
```
上記コマンドを入力して一番下の行に以下の行を追加
```bash
source /opt/ros/humble/setup.bash
```
Ctrl+Xで保存終了。

### ROS2の動作確認
一度SSH接続を切って、リモートデスクトップで繋いでみましょう。

接続したら、ターミナルを開いて以下のコマンドを入力します。
```bash
$ ros2 run demo_nodes_cpp talker
```
次に、もう一つターミナルを開いて以下のコマンドを入力します。
```bash
$ ros2 run demo_nodes_py listener
```
上記２つのデモが動いていれば導入完了です。

## Terminatorの導入
ROS2では、複数のターミナルを開いて実行することが多いので、Terminatorを導入すると便利です。

```bash
$ sudo apt install terminator
```
これでインストール自体は完了です。

### terminatorの使い方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51900/b671253a-eaf3-22b0-7fb5-18033ebad2f4.png)

メニューから Terminatorを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51900/4ce16331-1a3c-4457-e747-5fc0785b3117.png)

Terminator の画面内で右クリックをするとメニューがでるので「水平で分割」や「垂直で分割」を選ぶと１画面を分割してそれぞれでコマンドを入れることが出来るため便利です。

また、設定次第で見た目や操作性の変更も可能なので、色々触ってみてください（ネットで検索すれば色々情報があります）

次は[ROS2とWeb（rosbridge_suite）で接続する方法](https://qiita.com/shoichi4411/items/fcbe4b0fc2d98c72b55e)です。

## 目次

* [[←前回]開発環境づくり２::Raspberry Pi4 + Ubuntu22.04 + ROS2 Humble でロボット作り（その３）](https://qiita.com/shoichi4411/items/c775d3c3c040742e9925)
* [[次回→]ROS2とWebの連携::Raspberry Pi4 + Ubuntu22.04 + ROS2 Humble でロボット作り（その５）](https://qiita.com/shoichi4411/items/fcbe4b0fc2d98c72b55e)
BTCのホワイトペーパーを改めて読み直してみた

# はじめに

こんにちは。<a href="https://www.ambl.co.jp/" rel="nofollow noopener" target="_blank">AMBL株式会社</a>の諏原です。<a href="https://qiita.com/advent-calendar/2022/ambl-rd">AMBLアドベントカレンダー2022</a>の記事です。

今回は、BTCのホワイトペーパーを改めて読み直そうと思います。

# BTCの要点はこれ！
<b>ブロックチェーンによりデータを分散管理し中央管理者不在でも動く仕組み<b>


# BTCと既存システムの比較

|  | ビットコイン | 既存のシステム |
|:-:|:-:|:-:|
| 管理方式  | 分散型台帳（ブロックチェーン）  | 中央銀行などの第三者機関 |
| 発行権限  | 取引のあったユーザー | 中央銀行 |
| 手数料  | なし or 安価  | あり  |
| 少額の取引  | できる | できない(銀行など)  |

既存のシステムは、第三者機関に対する信用が必要ですが、ビットコインではブロックチェーンにより、第三者機関なしで取引することができます。
また、少額のやり取りもブロックチェーンで行うことができます。

# 二重支払い防止
タイムスタンプサーバーを用います。タイムスタンプサーバーは、タイムスタンプを行う各アイテムを構成するブロックのハッシュを取得し、そのハッシュを広く公開することで機能します。
タイムスタンプは、ハッシュ化されるデータがタイムスタンプを行った時点で間違いなく存在していた事を証明するものとなります。。

# ブロックチェーン

![ブロックチェーンのデータ構造 2022-12-13 23.54.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1159060/a9d432f0-a40e-b4ef-4861-7b818031b537.png)
(画像元：https://blog.triedge-lab.com/2017/10/03/post-1143/)

ブロックチェーンの１番のポイントは、<b>同じデータを複数の場所に分散して管理していることでデータの改竄を困難にしている</b>ところです。

たとえ、悪意を持った人が一部のデータを書き換えることができたとしても、他のコンピューターで管理されているデータも書き換えなければならないため、とても金銭的にも心理的にもコストがかかります。

また、複数のコンピューターで管理しているため、一部のコンピューターでシステムダウンが起きても、全体のコンピューターで補完することができます。
		
# コンセンサスアルゴリズムーPOW(Proof Of Work)
POWは２つのことを可能にします。

1. どれを正しいチェーンとするか選ぶ
2. 取引やデータをブロックチェーンにつなぐための仕組み

## 1.どれを正しいチェーンとするか選ぶ
原則として、<b>1CPU＝1票</b>となります。
計算量が最も使用されてたチェーンが最長チェーンとなり、これが集団の意思決定における代表のチェーンとなります。
51%以上のCPUが善良なコンピューターにより制御された場合であれば、そのチェーンは最も早く成長し、競合のチェーンたちを退けます。

## 2.取引やデータをブロックチェーンにつなぐための仕組み
<b>中央の管理者がいない代わりに、計算を成功させた人が、そのデータを承認してブロックチェーンにつなぎます。この時、計算を成功させた人は、報酬としてBTCをもらえます。</b>

計算およびデータ承認の作業のことをマイニング（mining）、作業を行う人や組織をマイナー（miner）と呼びます。

より具体的には、幾つかの取引やデータがブロックとしてまとめられます。このブロックをチェーンに組み込むためには、Nonceと計算結果とのハッシュ値が一緒である必要があります。

Nonceは、Number used once（一度だけ使用される使い捨ての数字）の略で、ブロックを生成するときに採掘者（マイナー）によって生成される 32 ビットの数値です。

計算は、Nonceの最初のnビットが全て0で始まる値を発見することを目的とします。
ハッシュ関数によって計算しハッシュ値を求め、その計算値が、非常に小さい値（＝計算された値の先頭に0がいくつも並ぶようでな値）を見つけ出したノードがブロック生成権を手に入れることができるというものです。

何度計算してもハッシュ値は同じなのでNonceをどんどん変更させてハッシュ値を変えていき、うまくいくNonceを探すことになります。

そして見つけ出したNonceの値が承認されれば、報酬がもらえます。


以下に、ネットワークの作動手順を記します。

1) 新しいトランザクションは全ノードに送信される。
2) 各ノードが新しいトランザクションをあるブロックに取り入れる。
3) 各ノードがそのブロックに対する Proof-of-Work を算出する。
4) Proof-of-Work を見つけ次第、ノードはそのブロックを全ノードにブロードキャストする。
5) 各ノードは、そのブロック内の全トランザクションが有効かつ未使用の場合のみ、承認を行う。
6) 各ノードは、承認したブロックのハッシュを直前のハッシュとして使用し、次のブロックの作成を開始することで、ブロックの承認を表明する。



# 課題点
ビットコインの課題として、以下のようなことが挙げられます。
・ブロックの生成が遅い
・Miningするために膨大な電力量が必要になり、環境へ悪影響を及ぼす。
・規模が重要なマイニングビジネスにおいて、優位に立つために各minerが協力し、組織的なサーバーを用いてマイニングを行う。→結果的に中央集権化してしまう。

# 感想
思ったよりも自分の記憶が曖昧でした。びっくりです。勉強したことをまとめるって大切だなと思いました。

# 参考文献
https://bitcoin.org/files/bitcoin-paper/bitcoin_jp.pdf

https://www.intra-mart.jp/im-press/useful/blockchain

https://coinpost.jp/?post_type=glossary&p=199401

https://bitflyer.com/ja-jp/s/glossary/nonce

https://blog.triedge-lab.com/2017/10/03/post-1143/
Azure Kubernetes Service

●Azure Kubernetes Service(AKS)
コンテナーオーケストラレーションが可能なDockerコンテナー実行環境を提供するサービス。負荷分散、障害対策などの機能を含むコンテナークラスターを構築し、複数のコンテナーを一元的に管理できる。

●AKSで使用される主な用語
・ノード
コンテナー化されたアプリケーションを実行する仮想マシン。

・ノードプール
同じ構成のノード(仮想マシン)のグループ。Kubernetesクラスターでは少なくとも１つ以上のノードが実行される。

・ポッド
ノードないで実行されるアプリケーションの１つのインスタンスを指す。１つのポッドに１つのコンテナーだけを入れて実行することも、1つのポッドに関連する複数のコンテナーを含むこともできる

・デプロイメントおよびマニフェストファイル
デプロイメントとは、ポッドやレプリカセット単位でのデプロイのあり方を定義したもの。
レプリカセットは、同じ機能を持つ複数のポッドをまとめて起動し、維持するための使用されるもの。
また、ポッドをデプロイするには、マニフェストファイルが必要。マニフェストファイルとは、使用するコンテナーイメージや実行するポッドの数などを指定したテキストファイルであり、YAML形式で記述必要がある。
コメントを美しく書いてみよう！

# はじめに
>美しいコードを見ると感動する。優れたコードは見た瞬間に何をしているのかが伝わってくる。

でお馴染みのリーダブルコードという本の内容から、コメントに焦点を当てて記載しました。
**参考文献：リーダブルコード**

これまでの経験と本の内容を合わせて、それっぽいコードをサンプルに記載してまとめています。

## コメントを美しく書く理由
リーダブルコードによると
>コードは理解し易くなければならない。他の人が最短時間で理解できるように書く必要がある

と記載されています。
つまり、読みやすいコードを書くのが大事です。
そして、一番簡単に誰でも実践できるのがコメントだと思います！

## ただし不要なコメントはすべきでない
コメントを多く書けばいいわけではなく、不要なコメントは書くべきではありません。
コメントを読むことで、コードを読む時間が減りますが、その分画面を占領してしまうからです。
そのため、コメントには**価値**をもたせる必要があり、**価値**のないコメントはする必要はないとのことです。

例えば

```
// URLをエスケープする
$url = htmlspecialchars($hoge, ENT_QUOTES);
```

特に新しい情報はないため、個人的に不要にみえます。
普段こういったコメントは読み飛ばしてる方も多いと思います。


```
// A123456 のデータから頭文字「A」を除去して6桁の数字にする
$str = substr($hoge, 1);
```

こちらのコメントも、最初の文字消してるだけで、関数の意味を知ってたら新しい情報はないやん！
って思う方もいると思いますが、コメントを読んだ方が、やってることの理解が早くできるため、書いたほうが良いとされる例です。


```
// 文字列を分割して登録
$str = explode('-', $data);

// 日付-曜日-時間 を分割して登録
$str = explode('-', $data);
```
こちらは日時のデータを分割して取得する例ですが
一個目より二個目のほうがどんなデータが入ってくるのかコメントを見れば理解でき結果的にコードの意味が早く理解できます。


## コメントに自分の考えを記録しておく
**コメントにはコードに対する思いを書いても良い**
```
// 似たような処理があるので、共通関数に移した方が良い

// サブクラスを使って整理したほうが速度が速くなるかもしれない

// 今のデータ内容なら問題ないけど、；がはいったデータが来た場合やばいかも
```
こういったコメントがあれば、作成者はコードに改善余地があることを認めており
いずれ修正対象になるかもしれません。
コメントがないと誰も修正しなさそうだし、なんか意図があってこういうコードにしたのかなって思う可能性もあります。
大切なことは、自由にコメントを記載して、コードの品質の状態や改善の余地を示したりしておくことです！


## 読み手の立場になって考える
**質問されそうなことを想像して書く**
「これってどういう意味だろう？」と思うところにコメントを書くと良いとされています。
```
// メモリオーバーになる場合があるため、メモリを解放する
unset($data);
```

コメントがないとunsetしてるのは、単純に変数を消してるだけって思われるかもしれません。
コメントを書いておくことで、メモリ対策であることが分かります。


**全体像のコメントを書く**
新しく入った人は何やってるか基本的にわからない場合が多いです。
処理の要約を書くことで詳細を調べなくても、だいたいやってることが理解できます。

```
// 郵便番号から住所を取得する関数
$getAddressData = function(zipcode){
```
処理の中身を確認しなくても、コメントによってgetAddressDataが何の処理なのかだいたいわかるため
改修箇所と関係があるかないかを、コメントだけで判断できそうです。


## コメントは正確かつ簡潔にかく
**無駄な行数は使わないで簡潔にかく**
```
// 郵便番号で検索をする
// 戻り値として住所を返却する
```
この例ですと、内容や文言の量から考えても、まとめて一行に書いたほうが良いように思われます。


**あいまいな代名詞は避ける**
```
// 郵便番号から住所を所得するので、そのデータを検証する
```
そのデータを検証するの「その」が指してるのが
「郵便番号」なのか「住所」なのかそれとも両方なのかが、はっきりとは分かりません。
「その」や「これ」とか曖昧な代名詞は避ける方がわかりやすくなります。

## まとめ
・コメントには価値をもたせよう。価値なきコメントは削除しよう
・コメントにコードに対する思いを書こう
・読み手の立場になってコメントをどう書くか考えよう
・コメントは正確かつ簡潔にかこう
DoctrineとEloquent比較大全12: 集計関数の利用

day12(?)の今日は集計関数を使う方法を見ていきます。

## Doctrine

```php
<?php

declare(strict_types=1);

use App\Entity\Author;
use App\Entity\Book;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Query\ResultSetMapping;

require __DIR__.'/../vendor/autoload.php';

/** @var EntityManagerInterface $entityManager */
$entityManager = require __DIR__.'/bootstrap.php';

$qb = $entityManager->getRepository(Book::class)->createQueryBuilder('b');
/** @var array<array{id: int, price_sum: int}> $rows */
$rows = $qb->leftJoin('b.author', 'a') // 第一引数はエンティティのフィールド名. エンティティ上でリレーションを定義してあればjoin条件は記述不要
    ->select('a.id, sum(b.price) as price_sum')
    ->groupBy('a.id')
    ->getQuery()
    ->getResult()
;
```
<https://github.com/77web/doctrine-vs-eloquent/blob/686815966e6ac5471558229c4e77d23bbcd48b13/Doctrine/Usecase/filter_with_dql_function.php>

- Doctrineのクエリビルダで使用できるのはSQL関数ではなくDQL関数となり、代表的なSQL関数はほぼ利用できますが、DBMS独自の文法の関数など使えないものもあります。使える関数の一覧は→ <https://www.doctrine-project.org/projects/doctrine-orm/en/2.13/reference/dql-doctrine-query-language.html#dql-functions>
- DQL関数は自作することもできます。


## Eloquent

```php
<?php

declare(strict_types=1);

use App\Models\Author;
use Illuminate\Database\Eloquent\Collection;

require __DIR__.'/../vendor/autoload.php';

/** @var Collection<Author> $authors1 */
$authors = Author::query()->leftJoin('books', 'books.author_id', 'authors.id')
    ->select('authors.id')
    ->selectRaw('sum(books.price) as price_sum')
    ->get()
;
// $authorsはattributeとしてidとprice_sumのみを持つAuthorモデルのインスタンス
```
<https://github.com/77web/doctrine-vs-eloquent/blob/686815966e6ac5471558229c4e77d23bbcd48b13/Eloquent/Usecase/filter_with_sql_function.php>

- 各DBMSのSQL関数が `selectRaw()` や `whereRaw()` などの `xxxRaw()` シリーズの中ではそのまま使えます。しかし、それゆえにDBMS間のポータビリティはいまいちです。
- 取得できるのはAuthorモデルのインスタンスですが、idとprice_sumのみを持ち、他の値は持っていません。
【ルール説明・basic】var-naming

こちらの記事は[Ansible lint Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ansible-lint) 14日目の記事になります。

今回はルール[var-naming](https://ansible-lint.readthedocs.io/rules/var-naming/)について説明します。

### var-naming

[var-naming](https://ansible-lint.readthedocs.io/rules/var-naming/)はAnsible の変数が規約通りに命名されているか検証します。


Ansible lintの変数名は`数字`・`アルファベットの小文字`・`アンダーバー`が利用でき、最初の文字は`アルファベットの小文字`および`アンダーバー`となっています。

#### 問題のあるコード

```yaml
---
- name: Example playbook
  hosts: localhost
  vars:
    CamelCase: true # <- 大文字が含まれている
    ALL_CAPS: bar # <- 小文字ではない
    v@r!able: baz # <- 無効な文字列が含まれている
```


#### 修正されたコード

```yaml
---
- name: Example playbook
  hosts: localhost
  vars:
    lowercase: true
    no_caps: bar
    variable: baz
```

### 変数の命名規則を変更する

変数の命名規則は[Ansible lintの設定ファイルで変更する事が可能](https://qiita.com/mamono210/items/fae1e4fbf2c6fcbf2eb7#var_naming_pattern)です。しかし命名規則を独自に設けるのは混乱の元にしかならないのでやめた方が良いでしょう。

### 参考サイト

* [var-naming — Ansible Lint Documentation](https://ansible-lint.readthedocs.io/rules/var-naming/)
mac にtypescript をインストールするメモ

## node のインストール

brewで入れる、パッケージで入れる、curlで直接入れる、など、方法がありすぎてどうしたらいいのかわからない。とりあえず、古いバージョンがパッケージで入れたっぽかったので、パッケージでインストールして上書きする。

[公式ページ](https://nodejs.org/)からパッケージをダウンロードしてインストール。`/usr/local/bin/node`に入ってくれる。パッケージはlatestとLST があるが、チキンなので、LSTにする。npmも同時に入ってくれる。

```
% node -v                   
v18.12.1
% npm -v
8.19.2
```

## typescriptのインストール

typescriptはnpmでインストールする。
[こちらの記事](https://qiita.com/kijitoraneko/items/175ef29d45d155b3f405)によると
- npmによるインストールにはグローバルインストールとローカルインストールが有り
- グローバルインストールの場合は、npmをインストールした場所にインストールし、
- ローカルインストールの場合、上にディレクトリをたどっていって、どこかに`node_modules` があるとそこにインストール、なければカレントディレクトリに`node_modules`を作ってそこにインストール、

という動作になるようだ。

typescriptのプロジェクトごとにtypescriptをインストールするのもちょっとどうかと思うのだが、どうもそれが推奨されているっぽい。本当かなあ。

あとは、[こちらの記事](https://qiita.com/tkek321/items/6147c8b8b410ea9fdfae)にしたがって、インストールする。

とりあえず`tstest`というディレクトリを作ってそこにインストールする。
```
% mkdir tstest
% cd tstest
% npm init
```
これで、`node_modules` と`package.json`ができる。
```
% npm install --save-dev typescript
```
でtypescriptをインストールする。`--save-dev`はtypescriptを通常の`dependency`ではなく開発時のdependencyに入れるためのフラグらしい。たしかに、package.jsonをみると
```
...
  "devDependencies": {
    "typescript": "^4.9.4"
  }
...
```
となっている。また、node_modulesの下にtypescriptというディレクトリが作られいることが確認できる。

ここで
```
% node_modules/.bin/tsc --init
```
とすると `tsconfig.json`が作られる。設定はこのファイルでいじるようだ。

このtscがコンパイラだ。これを実行すると、tsconfig.jsonに指定されたとおりに、コンパイルし結果のjsファイルができる。できたファイルはnodeで実行する。
ログ出力をビルドに含めないようにする [Unity]

# はじめに
Unityを使っている人なら、一度は`Debug.Log`などのログ出力がリリースビルドに与えるオーバーヘッドを気にしたことがあると思います。
今回はログ出力のコードをビルド時には含まないようにするスクリプトを実装します。

# 実装
ログ出力を行うメソッドに`Conditional`属性をつけます。
引数にはこのメソッドを含める条件(この場合は`UNITY_EDITOR`)を指定します。
`Conditional`属性を付加すると、指定した条件を満たさない場合は呼び出し側のコードがコンパイルされなくなります。
下記の実装は既存のメソッドを置き換えているわけではなく、コンソールでの検索用に接頭辞などを追加したものになっているので不要な場合は適宜修正する必要があります。

```CS:DebugUtil.cs
using System.Diagnostics;
#if UNITY_EDITOR
using Debug = UnityEngine.Debug;
#endif

public static class DebugUtil
{
    private const string Condition = "UNITY_EDITOR";

    [Conditional(Condition)]
    public static void Report(object o)
    {
#if UNITY_EDITOR
        Debug.Log($"Report: {o}");
#endif
    }

    [Conditional(Condition)]
    public static void Warn(object o)
    {
#if UNITY_EDITOR
        Debug.LogWarning($"Warn: {o}");
#endif
    }
}

```

# 使い方
通常の`Debug.Log`のように呼び出します。
```CS
DebugUtil.Report($"clicked {name}");
DebugUtil.Warn($"cannot find enemies");
```

# 注意点
`Conditional`属性を付加したメソッド自体はコンパイルされます(そのため#ifディレクティブで中身を囲っています)。
また、実機でデバッグを行いたい場合もログ出力が行われなくなってしまうので、その場合は指定する条件を変更するなどして調整する必要があります。
モザイクをポケモン18タイプに分類する

これはSymbolブロックチェーン上のモザイクをポケモン18タイプに分類してみましょう、という記事です。

モザイクはモザイクIDによって一意に区別することができます。
ではモザイクIDとはなんでしょうか？

たとえば xembook.tomato というモザイクは
モザイクID:310378C18A140D1BというIDが割り振られています。

![スクリーンショット 2022-12-13 23.20.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29187/6f32a90a-9866-a09c-a048-3c9f8622fb2d.png)

https://symbol.fyi/mosaics/310378C18A140D1B


実はこれ、とても大きな数字が割り振られています。
途中に出てくるA,B,C,Dは？と思われるかもしれません。

これは16進数という数え方で定義されていて、
普通数字は 1,2,3,4,5,6,7,8,9 の次は 10と桁上がりするのですが（これを10進数といいます）、
16進数の場合は 1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,10 となり、16進数の"10"は"16"を意味します。

では、モザイクID:`310378C18A140D1B`は10進数で表すといくつになるでしょうか？
ブラウザでF12キーを推してモザイクIDの頭に `0x` をつけて入力してみましょう。

![スクリーンショット 2022-12-13 23.22.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29187/f958ed21-934f-d7d2-a58c-1e6256c1fee8.png)


`3531799305429192000`という数字が出てきました。
これがxembook.tomatoというモザイクIDが持つ数字です。

さてここから本題です。

まずはポケモンの属性一覧を見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29187/913fa524-7d24-e2b4-6810-b7dd1a92260b.png)

子供たちをワクワクさせた仕掛けがこの中に詰まっています。
複雑すぎると指摘する人もいますが、簡単すぎるのは飽きてしまってある程度複雑な方がワクワクするのかもしれませんね。
もはや、世界に愛されているポケモンですから、ここは世界的にも人の心をくすぐった実績のある仕組みを有効活用しましょう。

では先述の`3531799305429192000`という大きな数字をどうやって18タイプに分類すればいいでしょうか？

プログラム言語には `%`という便利な演算子があります。
これは、続く数字で割った余りが答えになります。

5 % 2 = 1 (5を2で割ったら余りが1) という感じです。

つまり % 18 という計算をすれば　答えは 0から17のうちのいずれかになります。
わかりましたね。0から17で18種類に分類することができます。

実際に計算してみると

![スクリーンショット 2022-12-13 23.33.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29187/69674af7-f45b-06de-73d6-937a31f8be78.png)

12という数字が出てきました。
ここでの注意点は 1から18に分類したい場合は出てきた結果にプラス1しておく必要があります。

つまり、xembook.tomatoに13番目の属性値を割り当てることができました。

次にPokéAPIを使って属性の特徴を調べてみましょう。

https://pokeapi.co/

こんなサービスがあるのですね。素晴らしいエコシステムです。
13番目の属性情報を取るには以下のように指定します。

https://pokeapi.co/api/v2/type/13

なんとxembook.tomato が持つ属性は ピカチュウと同じelectric(電気)のようです。

![スクリーンショット 2022-12-13 23.42.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29187/03326a4f-d54f-112d-b92e-41e3d65b7169.png)

どういった属性に強かったり弱かったりするかは damage_relationsを調べてみてください。

![スクリーンショット 2022-12-13 23.46.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29187/fd36d4fb-cd0b-aca3-c6b3-bde97282cc1f.png)

以下のように、効果がばつぐんなのかいまひとつなのかが定義されています。

- double_damege_from
- double_damege_to
- half_damage_from
- half_damege_to
- no_damege_from
- no_damege_to

一覧表と同じ結果ですね。
みなさんもお気に入りのモザイクIDで調べてみて、バトルの参考にしてみてくださいね！
【クレジットカードセキュリティ】2022年12月 気になるポイント

クレジットカード決済システム、みなさん導入されておりますでしょうか？

クリスマス、年末年始、忘年会、、、何かとお金を使う時期、みなさんのクレジットカードも大忙し。

そんな便利なクレジットカード、便利であるということはシステムが脆ければ他人も簡単に決済ができてしまう代物です。
少し前ですが、クレジットカードセキュリティの導入以後、動向をなんとなく追いかけているつもりなので、ECにおけるクレジットカードセキュリティのトレンドを集めてまいりました。

## クレカ不正利用の被害額
まずはここから。
### 2021年は...**330億円！！**
と、記録されております。（衛星の開発費レベル）

## 開発者が把握しておきたいトレンド
そんな、莫大な被害額を抑えるための取り組みを、2025年（大阪万博の年）へ向けて打ち出された経済産業省のロードマップからピックアップします。
- **ECサイトの脆弱性対応・不正利用防止対策（ECサイト構築ガイドライン策定・脆弱性診断（IPA））**
- **EC決済における不正利用対策・本人認証の強化：国内における3Dセキュア2.0の利用率の大幅な向上**


## ECサイト構築ガイドライン策定・脆弱性診断（IPA）
経済産業省の補助のもと、IPAが中小企業のECサイトの脆弱性診断を無償で行いますよーという取り組みでした。
しかし、<font color="Crimson">募集は2022年4月20日に終了</font>しておりました。。。無念

ぜひ機会があれば受けてみたかったですが、筆者は残念ながらこの取り組みに触れる機会はありませんでした。

中小企業向けですが、もし受けた方がいらっしゃいましたらぜひ感想をお聞かせください！！

## 3Dセキュア1.0 と 3Dセキュア2.0
もう一つ、こちらはEC開発者の方ならぜひ把握いただきたい内容です。

### 3Dセキュア1.0
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376852/7bdf808e-ffa3-dc2b-6f4f-b6d86533d064.png">

（※2022年10月にサポートが終了しております。）
既に3Dセキュア1.0を導入していたシステムでは急ぎ対応を行ったのではないでしょうか。

パスワード認証を必ず挟むため、それなりに強度はあります。
しかし、普及率は10%程度だったようです。

#### なぜか
- パスワードそのものが盗まれてしまった場合に効果がなくなること
- ユーザーがパスワードを忘れてしまうと利用できなくなるため、ECサイトの売上が落ちる（カゴ落ち）

結論、<font color="Crimson">**コスパが悪かった**</font> ということです。

サポートが切れたということは、十分なセキュリティ対策として認められなくなりました。
今後、3Dセキュア1.0を利用したままで、クレジットカードの不正利用がある場合は、状況により運営会社から被害額の補填が行われるので要注意です。

開発者サイドからもアップデートを推進したいですね。

### 3Dセキュア2.0
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376852/b5610a8a-c188-3dd0-7050-e88a051687e0.png">

こちらが、導入が推奨されている3Dセキュア2.0

#### どう変わった 
- 多角的な本人認証により、利便性とセキュリティの両面が一新された
- カゴ落ちのリスクが軽減された

まだまだ導入されているところは少ない印象もありますが、ECでは速やかな導入が求められております。

ECから本人認証に必要な情報を付与し、イシュアがそのリスクを判断します。（ブラックボックス）
その際に、従来のパスワード入力を求められず、SMSを利用したワンタイム認証や生体認証を利用するため利便性も向上、結果的にユーザーフレンドリーで安全なサービス提供が実現できます。

### 導入コスト
元々3Dセキュア1.0を導入していた場合は比較的容易に移行ができる印象です。

ECを扱っている方はぜひ、クレジットカード決済システムで3Dセキュア2.0に対応しているのか、していなければいつ頃導入させるべきなのかこの機会にご検討ください。

### 最後に
クレカの不正利用にはくれぐれもお気をつけて、年明けの請求が楽しみですね^^

明日は @ymmt1089 さんの記事です！
お楽しみに！！

## 参考
[クレジットカードシステムのセキュリティ対策の更なる強化に向けた方向性（クレジット・セキュリティ対策ビジョン2025）第1.1版](https://www.meti.go.jp/policy/economy/consumer/credit/2022062019001.pdf)
[IPA HP 中小企業が運営するECサイト向け無償脆弱性診断の募集](https://www.ipa.go.jp/security/vuln/ec-site/vuln-ec-site2022.html)
[DGFT　HP 3Dセキュア 2.0（EMV3Dセキュア）への切替え進む！加盟店がすべき対応](https://www.veritrans.co.jp/tips/column/emv3dsecure.html)
簡単Elixirシリーズ   ~ パイプで繋ぐ関数の第2引数へ引き継ぐ方法 ~

# 簡単Elixirシリーズ 
## ~ パイプで繋ぐ関数の第2引数へ引き継ぐ方法 ~

この記事は「[Elixir Advent Calendar 2022 カレンダー14](https://qiita.com/advent-calendar/2022/elixir)」22日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

簡単 Elixirシリーズでは小ネタをサクッと書いていこう。というコンセプトで作っていきます。

今回は、Elixirの関数は```|>```を利用して第一引数に値を繋いでいく事ができるのですが、たまに第２引数に繋ぎたい時の小技紹介。という小ネタ（そう、この記事はサクッとがコンセプトW）

例えば、```Enum.member?```関数があり、第１引数に要素を入れて、第二引数に要素の中と同じ値があるか確認したい要素を入れると true か falseを返す関数があります。

```elixir
Enum.member?([1,2,3], 1)
true
```

```|>```を活用した記載方法で第２引数に引き継ぎたい場合はどうすればいいか？という小技です。

```1 |> Enum.member?([1,2,3])``` もちろんこのように記載したらエラーとなります。
```[1,2,3] |> Enum.member?(1)``` としたら正常に動きます。でも、1をパイプで引き継ぎたいんだーという場合です。

まずは、```Enum.member?```関数を member? 変数に束縛します。その時、キャプチャ演算子を利用して、第１引数と第２引数を反対にして束縛してあげます。

```elixir
iex()> member? = &Enum.member?(&2,&1)
#Function<43.65746770/2 in :erl_eval.expr/5>
iex()> 1 |> member?.([1,2,3])
true
```

すると、こんな感じでやりたいことが実現できました。
Gitコマンド 削除編

## ブランチ確認
```
$ git branch -a
```
`-a` オプションで、リモートブランチを含んだブランチの一覧も表示してくれるので
個人的には基本つけてます！

## ローカルブラン削除
```
$ git branch -d 【削除したいブランチ名】
```

マージしてないとかなんたらで、なんかうまく消えない時
消しても問題ない場合は小文字ではなく`-D`　オプションをつける

```
$ git branch -D 【削除したいブランチ名】
```

消すのしばらく忘れてて、一気に消したいとき

```
$ git branch | grep 【検索条件】 | xargs git branch -d
```

一回`grep`までを実行して確認したほうが良いです！
`xargs（エックスアーグズ）`で`grep`結果を引数にして削除！
spanを使いこなしたい

# spanを使いこなしたい
spanを全然使ってこなかった私。
じゃあ何を使ってたかというと、、**div**です^^
こりゃまた使い勝手が良かったんです。
コードを調べるとき常にdivが出てたんですね。
spanなんてなんだろうとだけ思って放置してました^^

# いつ使うの？
じゃあいつ使うのってなるんですけど。
私がめっちゃええやん！！って思って使ったやつ。

# 改行したくないけどcssは違う時
私が使ってみた例を紹介します。（誰得）

レビュー機能を作ろうと思ったんです。
★★★★★←これね

大体レビューのやつって例えば★５のうち★４だと、**星４つは黄色**で**星１つは灰色**で色がついてませんよみたいな表示の仕方ですよね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2941039/979ab046-2812-1693-1f61-336734d5040f.png)

こんな感じ。

これを作ろうと思ってまず星の個数はレビューをしてもらった時にもらう数値で４つ表示させるんですよね。そして残りの数を灰色で表示したいんです。

黄色の星と灰色の星で色が違うのでコードを分けなきゃいけないですよね。多分。
idとかでcssに繋いでcolorをそれぞれの色で指定するんですけど、
いつも通りdivでやろうとしたけどだけどだけど、、

**あれ、、、divで区切ったら改行されるよね、、、って。**

divとspanの違いはブロック要素かインライン要素かの違いらしいです。
私まだ理解してないから説明はまた今度。

そのとき調べたらなんとspanという救世主がいたんですね。
spanはインライン要素なのでspanの前後に改行が入らないんですって！！！！
はあ～まいりましたね。新しい発見をしました。

divと同じようにidやclassを付けてcssとつなげることができます！

# divのように何でもできるわけじゃない
なんか制限があるらしいです。
そこはまだ調べてないのでのちのち更新します。てへ。
MacOS 用のコンテナランタイム Colima をインストール（Docker Desktop の代替）


## この記事の前提

OS： MacOS
パッケージマネージャ： Homebrew
対象者： Docker Desktop から乗り換えを検討している方。

## Docker Desktop をアンインストールする

### Docker Desktop のアンインストール

Mac マシンから Docker Desktop をアンインストールするには、。

1. Docker メニューから **Troubleshoot** （トラブルシュート）を選択し、 **Uninstall** （アンインストール）を選択
1. 確認画面で、**Uninstall** をクリック

:::note warn
Docker Desktop のアンインストールは、ローカルのマシンにある Docker コンテナのイメージを破棄し、アプリケーションによって作成された全てのファイルも破棄します。
:::

https://docs.docker.jp/docker-for-mac/install.html#docker-desktop

## 下準備

### Docker をインストールする

```bash
brew install docker docker-compose

==> docker
zsh completions have been installed to:
  /usr/local/share/zsh/site-functions
==> docker-compose
Compose is now a Docker plugin. For Docker to find this plugin, symlink it:
  mkdir -p ~/.docker/cli-plugins
  ln -sfn /usr/local/opt/docker-compose/bin/docker-compose ~/.docker/cli-plugins/docker-compose
```

## colima をインストールする

### colima をインストール

```bash
brew install colima
```

### 使い方

```sh
# 起動
colima start
# オプションを付けて起動
# CPU=1、メモリ=2GB、ディスク=10GB
colima start --cpu 1 --memory 2 --disk 10
# 停止
colima stop
```

https://github.com/abiosoft/colima

## トラブルシューティング

### 一部のアプリケーションでソケット（docker.sock）が見つからないエラーの対応

Colima は Docker コンテキストを使用して他の Docker サーバーとの共存を可能にし、起動時に自身をデフォルトの Docker コンテキストとして設定します。
ただし、一部のアプリケーションは Docker コンテキストを認識しないため、エラー発生する可能性があります。

これは、次のいずれかの方法で修正できます。ソケットの場所を確認して、Docker ソケットのパスを確認します。

```sh
# ソケットの場所を確認
colima status
docker context list
```

1. アプリケーションでサポートされている場合は、アプリケーション固有の Docker ソケット パスを設定する。たとえば、JetBrains IDE。

2. DOCKER_HOSTColima ソケットを指すように環境変数を設定する。

```sh
export DOCKER_HOST="unix://${HOME}/.colima/default/docker.sock"
```

3. Colima ソケットをデフォルトのソケット パスにリンクする。これにより、他のDockerサーバーが破損するリスクに注意。

```sh
sudo ln -sf $HOME/.colima/default/docker.sock /var/run/docker.sock
```

https://github.com/abiosoft/colima/blob/main/docs/FAQ.md#cannot-connect-to-the-docker-daemon-at-unixvarrundockersock-is-the-docker-daemon-running

## 参考

https://kumojin.com/en/colima-alternative-docker-desktop/
リモートのブランチをローカルから削除する

- リモートブランチ削除コマンド
```
git push <remote> --delete <branch>

// 例
git push origin --delete exampleBranch
```

- 下記エラーが発生した場合は、既にそのブランチが削除されている可能性があります。
```
error: unable to push to unqualified destination: remoteBranchName The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'git@repository_name'
```
DoctrineとEloquent比較大全11: 更に複雑な条件絞り込み（nativeQuery vs DB::raw()）

day11(?)の今日はエンティティの絞り込みにより複雑な条件が必要な場合のやり方を見ていきます。

## Doctrine


```php
<?php

declare(strict_types=1);

use App\Entity\Author;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Query\ResultSetMapping;

require __DIR__.'/../vendor/autoload.php';

/** @var EntityManagerInterface $entityManager */
$entityManager = require __DIR__.'/bootstrap.php';

$sql = <<<EOQ
SELECT a.id, a.name FROM authors AS a LEFT JOIN books AS b ON b.author_id = a.id GROUP BY a.name HAVING count(b.id) > 1
EOQ;


$rsm = new ResultSetMapping();
$rsm->addEntityResult(Author::class, 'a');
$rsm->addFieldResult('a', 'name', 'name');
$rsm->addFieldResult('a', 'id', 'id');

// 1冊以上本を書いている著者
$query = $entityManager->createNativeQuery($sql, $rsm);

/** @var array<Author> $authors */
$authors = $query->getResult();

// 別解としてDBALを使う方法
$rows = $entityManager->getConnection()->fetchAllAssociative($sql);
$ids = array_column($rows, 'id');
$qb = $entityManager->getRepository(Author::class)->createQueryBuilder('a');
$authors = $qb->where($qb->expr()->in('a.id', ':filtered_ids'))
    ->setParameter('filtered_ids', $ids)
    ->getQuery()
    ->getResult()
;
```
<https://github.com/77web/doctrine-vs-eloquent/blob/281eefd31e684ecbe15af262e737fdc9ffc96ec9/Doctrine/Usecase/filter_with_native_query.php>

- あくまでエンティティを取得する手段なので、エンティティの形にならないものを取得する場合はDBALを使ってarrayの結果を得るほうが良いです。
- エンティティを取得する場合であっても、NativeQueryを使うよりも、DBALを使って条件を満たすエンティティのidのみを特定し、idで取得するほうが良いです。

## Eloquent

```php
<?php

declare(strict_types=1);

use App\Models\Author;
use Illuminate\Database\Eloquent\Collection;

require __DIR__.'/../vendor/autoload.php';

/** @var Collection<Author> $authors1 */
$authors = Author::query()->leftJoin('books', 'books.author_id', 'authors.id')->havingRaw('count(books.id) > 0')->get();
```
<https://github.com/77web/doctrine-vs-eloquent/blob/281eefd31e684ecbe15af262e737fdc9ffc96ec9/Eloquent/Usecase/filter_with_raw.php>

- `havingRaw()` のサンプルを出しましたが、 `selectRaw()`, `whereRaw()` などクエリの様々なパーツに対してrawを適用することができます。
webview_flutterのWebViewをデバッグする

# はじめに
WebViewを組み込んだアプリを開発していると、WebViewのCookieや通信内容を見ながらデバッグをしたくなることがあります。
今回は、[webview_flutter](https://pub.dev/packages/webview_flutter)を使用しているwebviewのデバッグ方法を共有します。
※あまりフロントを触ってこなかったので、一部用語等が異なる可能性があります。ご了承ください。

## 対象
Flutterのアプリ内WebViewを[webview_flutter](https://pub.dev/packages/webview_flutter)で実装している人

## 用語
デベロッパーツール(Chrome)、Webインスペクタ(Safari)、などと呼ばれているアレを使用します。
どうやらChromeとSafariで呼び方が異なるようです。

## 環境
- Mac
- Android Studio
```
Flutter 3.3.9
Dart 2.18.5
webview_flutter: 3.0.4
```

# Flutter
Dartのコードは以下一行を書くだけで準備完了です。
※実際の実装では開発環境のみで有効にするフラグを使用した方が安全です。
```dart
WebView(
    initialUrl: 'https://flutter.dev',
    debuggingEnabled: true, //これを有効にする
),
```


## iOS
### 手順
1. MacのSafariの開発者モードを有効にしておきます
環境設定(`⌘+,`)>詳細>「メニューバーに"開発"メニューを表示」にチェック
2. 対象のアプリをRunすると、アプリ内WebViewのWebPageがメニューの選択肢に出てきます
![スクリーンショット 2022-12-11 16.07.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611496/0f0c9ebc-f11b-7664-b8e6-f19ce4ad85fb.png)

3. 対象のurlを選択することで、見慣れたWebインスペクタが出てきます
![スクリーンショット 2022-12-11 16.14.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611496/1eb58740-e5d6-238a-4fef-bd1725fdaf0f.png)

## Android
### 手順
1. MacのChromeで [chrome://inspect/#devices](chrome://inspect/#devices) を開きます
2. 対象のアプリをRunすると、ページ内にデバッグデバイスが以下のような形で出てきます
![スクリーンショット 2022-12-13 22.57.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611496/ed33182b-fc1e-29d1-5848-fdb4fd74ac41.png)
3. `inspect`を開くことで、見慣れたデベロッパーツールが出てきます
![スクリーンショット 2022-12-13 23.02.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611496/dbe5a69a-6fdb-ac00-2718-b4104070f767.png)


## おわりに
たまに出てくる根深い問題は、WebViewを直接ツールで見て解決しましょう。
参考になれば幸いです。
1桁の数字をゼロを埋めて”01”や”02”など2桁にしてソートしやすくする方法

# 1桁の数字をゼロを埋めて”01”や”02”など2桁にしてソートしやすくする方法


# f'と{i}を使ってfor文で回してファイル名を動的に変更する

1桁

:::note info
f'target{i+1}.png') #1桁：target5.png
:::

3桁

:::note info
f'target{str(i+1).zfill(3)}.png') #　3桁：target005.png
:::

zfill(2)の２は桁数を表しています。この場合1-9が01-09になります。

:::note info
str(index+1).zfill(2)
:::
ローカルのブランチを削除する

# ローカルブランチ削除コマンド
【注意】
削除対象のブランチにいると、ブランチ削除コマンドを実行できないので、一旦他のブランチへ移動してから実行して下さい。
- 削除対象のブランチがリモートにプッシュ及び、マージ済みである場合
```
git branch -d localBranchName
```

- 削除対象のブランチがリモートにプッシュ及び、マージ済みでは無く、強制的に削除したい場合
```
git branch -D localBranchName
```
開発環境づくり２::Raspberry Pi4 + Ubuntu22.04 + ROS2 Humble でロボット作り（その３）

# 開発環境を作ろう２！

## PC側とラズパイ側の環境
基本的なコーディングはPCでやりたい（軽いから）。
でも、ちょっとした処理はラズパイでもしたい。

というわけで、まずは総合開発環境（IDE）入れましょう。楽なので！

## Visual Studio Code
Microsoftが無料で公開している総合開発環境です。
いろいろな言語に対応しており、プラグインも充実しています。
今回はコレをPC側、ラズパイ側の両方に入れます。

https://code.visualstudio.com/
上記サイトで、プログラムをダウンロードしてインストールするだけ
※インストール手順は端折ります。色々なサイトで説明されていますので、わからなければググってみてください。

WindowsもUbuntuもMacもこれでOK。

PC側にインストールしたVisual Studio Codeですが、これだけだとラズパイ側とデータの同期ができません。
なので、FTP接続も出来るようにします。

## FTP

[開発環境づくり１](https://qiita.com/shoichi4411/items/40af18ce4e11254aef61)で設定したリモートデスクトップ、またはSSHを使ってラズパイ側のターミナルを開き、以下のコマンドでFTPサーバをインストールします。

```bash
$ sudo apt update
$ sudo apt install -y vsftpd
```
VSFTPDというFTPサーバをインストールします。
インストールしただけだと、色々使えない状態なので設定を変更します。

```bash
$ sudo nano /etc/vsftpd.conf
```
上記コマンドで、設定ファイルを開いて以下の部分を修正・追加します。

```
write_enable=YES
ascii_upload_enable=YES
ascii_download_enable=YES
ftpd_banner=Welcome to blah FTP service.
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
pasv_enable=YES
pasv_min_port=60000
pasv_max_port=60500
force_dot_files=YES
```

次に、以下のコマンドで vsftpd.chroot_listのファイルを作成します。
（中身は空でOK）
```bash
$ sudo touch /etc/vsftpd.chroot_list
```

設定が終わったら、FTPサービスの起動と有効化をします。（SSHのときにやった設定と同じ感じです）
```bash
$ sudo systemctl enable vsftpd
```
で有効化して
```bash
$ sudo systemctl start vsftpd
```
で起動。
```bash
$ sudo systemctl status vsftpd
```
で確認。

これで、FTPサーバの準備はできましたので、PC側の設定に戻ります。

## Visual Studio Code Plugin
Visual Studio Code には多数のプラグインがあります。
もちろんFTPクライアントのプラグインもありますので早速入れてみましょう。

PC側のVisual Studio Codeを起動して、左メニューの下にある「拡張機能」ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51900/1b42c776-4a62-ac87-6f6a-1fe4ca9cd70f.png)

検索窓に SFTP と入力して、検索された結果から、インストールボタンを押してインストールを実行します。

インストールが完了したら、FTPの設定をします。
Cmd(Ctrl)+Shift+Pでコマンドパレットを開き
```
SFTP:config
```
と入力して、設定ファイルを開きます。
開いたファイルのname, host, username, password, remotePathを設定します。

:::note info
nameはわかり易い名前をつければOK
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51900/e56f652a-698b-33a0-f384-c8cff94d6b3a.png)

設定が終わったら、左メニューに追加されているSFTPボタンを押してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51900/d7028be1-7f11-40e0-58b6-d73bf9421ca7.png)
設定が問題なければ、/home/username/以下のディレクトリが表示されるはずです。

## Visual Studio Code でターミナル
Visual Studio Codeにはターミナルが内蔵されていますので、メインメニューのターミナルから、新しいターミナルと選択することで、こんな感じでターミナルが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51900/e39add39-9f26-3799-ee6a-0e3d30dbff5f.png)

ここから、ラズパイにSSH接続すれば、コードはVisual Studio Codeで書いてFTPでアップロード。コードの実行はSSHで行うという事ができてかなり楽になります。
ラズパイのGUIを使う場合はリモート接続を使う必要がありますが・・・

次は [ROSの導入](https://qiita.com/shoichi4411/items/694a45314cbfe704d20d)についてです。

## 目次

* [[←前回]開発環境づくり１::Raspberry Pi4 + Ubuntu22.04 + ROS2 Humble でロボット作り（その２）](https://qiita.com/shoichi4411/items/40af18ce4e11254aef61)
* [[次回→]ROS2導入::Raspberry Pi4 + Ubuntu22.04 + ROS2 Humble でロボット作り（その４）](https://qiita.com/shoichi4411/items/694a45314cbfe704d20d)
【RUBY】クラスとインスタンスの概念

# はじめに
プログラミング初学者の者です。オンラインでプログラミングを学習させて頂いてるのですが、さらに理解を深めていきたいと思い、学習したことを備忘録として、残して理解を深めていきたいと思います。
また、間違った点など、ありましたら、ご指摘いただけると幸いです。よろしくお願いします。



## クラス
クラスは、値の元となるものです。値の共通のルールを定義します。
ここで決めるルールは、共通の属性と処理（メソッド）です。
クラスを使えば、文字列が「こんにちは」や「どうも」という別々のデータを持つことができることと同じように、共通のルールを守った上で個別のデータを作ることもできます。
共通の情報をまとめ、個別の情報は各データごとに分けることで、開発・管理・保守がし易くなるという利点があります。
クラスは設計図に例えることができます。例えば、テレビの設計図があるとし、その設計図から実体のあるテレビが作り出されます。
クラスとは簡単に言ってしまえばひな形と言え、テレビで言えばテレビの設計図となるものです。
クラスは、共通の属性と処理を決めるだけで、実体がありません。
そのため、クラス単体ではデータを扱うことはできません。
クラスの定義の仕方はいかになります。
```ruby
class クラス名
  # 変数やメソッドの定義
end
```
クラス名は半角英大文字から始めます。
例: User, Account, Image, Group, など

## インスタンス
クラスから生成される、データを持ったインスタンスといい、クラスを元にして作られるデータのことです。
インスタンスは、クラスと異なり実体を持ちます。
テレビの設計図の例で言えば、設計図から作られて実際に販売されているテレビを指します。
インスタンスは、クラスが使用できるnewメソッドを実行して生成します。

クラスは、定義しなくてもnewという特別なメソッドをはじめから持っています。
newメソッドは、使用したクラスのインスタンスを生成して返します。
```ruby
# インスタンスを生成し変数で扱う
変数名 = クラス名.new
```
多くの場合、インスタンスを生成したら、再利用するために変数へ代入します。
これは、インスタンスを生成したあとからデータを追加したり、メソッドを実行できるようにするためです。
```ruby
class Television

end

flat_screen = Television.new  # Carクラスのインスタンスを生成
puts flat_screen  # インスタンスを出力
```
テスト自動化？カバレッジ100%？それいいじゃん　→　全然よくない　の巻

# 0. はじめに

アドベントカレンダーに「テスト自動化の失敗談」に関するものがありましたので、ちょっと昔話ですが **「あれは失敗だろう」というプロジェクトを思い出した**ので投稿させていただくことにしました。

お役に立つかわかりませんが、思い出しながら書いてみたいと思います。

# 1. 通達：地獄への入り口

ある日、あるプロジェクトで、このような通達がありました。

えらい人「テスト自動化ツールを導入したので、**すべてのプロジェクトで使用**するように」

えらい人「そうそう、 **カバレッジは１００％** でね、そいじゃよろしく」

おいら「御意。」

# 2. 現実：100%の無間地獄

当時のＡ氏はこのように述べています。

「ツールで自動化できるんでしょ？
　楽になっていいじゃない。
　100%？当たり前だよね。
　序盤、中盤、終盤、隙がない方針だと思うよ。」

しかし間もなく気づくのです、彼は既に地獄へと足を踏み入れていることに。
100%の無意味さと、100%の無間地獄と、100%の愛しさと切なさと心強さに。

# 3. 何がしんどかったのか

前置きはこれくらいにしまして・・・。

テストにおける**カバレッジ**というのは、**テストケースの網羅性**を指します。100%であればすべてのケースを網羅できていることになりますし、100%に満たない場合はケースを漏らしている（不通のケースがある）ことになります。

テストなので100%を目指すのが自然に感じるかもしれませんが、意外なことに**必ずしも100%に到達するわけではない**のです。例えば、あからさまにデッドロジック（例外処理でありがち、それ何を想定して入れたの？というやつ）が入っていたりします。また逆のケースとして、条件分岐のOR条件で一部のケースしか網羅できていないのにカバレッジ100%と判定されてしまったりすることもあります。

当時使用したツールは入力値を自動かつランダムに作り出す機能が組み込まれていましたが、すべてのケースを網羅するには、行き当たりばったりのランダム入力で済むわけがありません。結局のところ、そんな機能はほとんど役に立たず、**入力情報を厳密かつ緻密に設計してやらなければなりません**。

さらに、分岐に次ぐ分岐で、処理がふか～くなったモジュールにブチあたると地獄です。
こうなると、**はっきり言って手動でテストした方が10倍早いレベル**だと感じたこともありました。

※ 質の悪いプロジェクトだったので、とんでもないコードがテストに回ってくることが多々ありました。ネットに転がっているソースコードをコピペしただけ（コメントなどもそのまま）のやつが回ってきたときはさすがにシビれましたね。もちろんすぐに責任者に報告し、然るべき対応をいただきましたよ。

もっとしんどいのが、 **「手動テストは原則認めない」という謎の基本方針**。現場の人間は全く信用されていないことが良くわかります。下請け末端で社会の歯車を担っていた私は **「へい！」と返事をすることしかできませんでした**。そして、 **「どうしたものか」と途方に暮れた**ものです。

# 4. カバレッジ100%は正解？不正解？

ここまでくればお分かりかと思いますが、**おもいっきり不正解**です。

かの有名なソフトウェア技術者である[マーティン・ファウラー氏](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%83%BB%E3%83%95%E3%82%A1%E3%82%A6%E3%83%A9%E3%83%BC)は次のように述べています。

> 思慮深くテストを実施すれば、テストカバレッジはおそらく**80%台後半か90%台になる**だろう。**100%は信用ならない**。カバレッジの数字ばっかり気にして、**自分が何をやっているかわかっていない人間のいる臭いがする**。

引用：<https://bliki-ja.github.io/TestCoverage/>

100%は信用ならない。
はい、その通りです。

自分が何をやっているかわかっていない人間のいる臭いがする。
私のことです、ごめんなさい。

当時の自分に、というより、当時の通達を出した某社上層部にタイムスリップして説教したいものです。某SIerでしたが、本当に何もわからずに方針決めて指示を出していたのでしょう。天下り系の企業でしたから、効率云々ではなく、ツールを導入することが先立つ目的だったんでしょう。

こんなことは、金輪際起こりませんように・・・。

# 5. おわりに

思い出話ついでに書いてしまったような記事ですが、改めてひどい現場だったなと思います。

当時は成す術がありませんでしたが、今となっては反省しかありません。

開発現場を離れて久しいですが、感覚を忘れておかしな方針を打ち出さないように、過去のこうした教訓を忘れず、注意をしていきたいと思います。
【JavaScript】JavaScript、はじめました。④配列とオブジェクト

※この記事は、プログラミング学習サイト「Progate」の学習内容に関するものです。

お疲れ様です！🍵
寒さ、極まってきてますね🍃
明日あたり、雪が降るとか降らないとか‥‥⛄️
頼むから積もらないでくれ、
タイヤが<b><font color="lightgray">まだノーマル</font></b>なんだ。。。

さて、今日は第4回！ということで、
<b>【配列】と【オブジェクト】</b>についてまとめました。
本日復習したところ、だいぶ理解できた（と思う）ので、
忘れないうちにしっかり残しておきたいと思います。


<b>【配列】</b>
　<b>・<font color="red">複数の項目をひとまとめにして、1つの変数に代入できる</font></b>
```:例① JavaScript:
let name = ['aogiri', 'kanade', 'kokoro'];

// 複数の名前を、1セットにして1つの変数・定数に代入できる。
// この「1セット」が配列。


console.log(name);

// 配列 name を1セットまとめて出力する。
```
```:例① console:
['aogiri', 'kanade', 'kokoro']

// 配列 name を1セットまとめて出力した結果。
// 枠ごとまとめて出力される。
```

　<b>・<font color="red">複数の項目から、項目を個別に出力できる</font></b>
```:例② JavaScript:
let name = ['aogiri', 'kanade', 'kokoro'];

// 配列のすべての項目には、代入した時点で
// 0番目、1番目、2番目、…… という番号がつけられる。
// 今回の配列では、aogiri は0番目、kanade は1番目、
// そして kokoro は2番目である。


console.log(name[0]);

// ( )内を 変数[番号] と記述することで、
// 配列の指定した番号の項目を出力することができる。
// 今回は( )内が name[0] という記述なので、
// 配列 name の0番目の項目 aogiri のみを出力する 
```
```:例② console:
aogiri
```

<b>【オブジェクト】</b>
　<b>・<font color="red">1つ1つの項目にプロパティ（変数のようなもの）を設定しながら、
　　配列のように複数の項目をひとまとめにして、1つの変数に代入できる</font></b>
```:例① JavaScript:
let data = {name:'aogiri', age: 20, height: 174};

// nameプロパティ、ageプロパティ、heightプロパティ の3種類を
// ひとまとめにしたオブジェクトを、変数 data に代入している。


console.log(data);

// 変数 data に代入したオブジェクトを、まとめて出力する。
```
```:例① console:
{name: 'aogiri', age: 20, height: 174}
```

　<b>・<font color="red">複数の項目から、項目を個別に出力できる</font></b>
```:例② JavaScript:
let data = {name:'aogiri', age: 20, height: 174};
console.log(data.name);

// ( )内を 変数.プロパティ と記述することで、
// 配列の指定したプロパティの項目を出力することができる。
// 今回は( )内が data.name という記述なので、
// 変数 data のプロパティのうち、nameプロパティに格納されている
// aogiri のみを出力する 
```
```:例② console:
aogiri
```

　<b>・<font color="red">プロパティごとに配列を代入したり、個別に出力したりすることも可能</font></b>
```:例② JavaScript:
let data = {name:['aogiri', 'kanade', 'kokoro'], age:[20, 17, 19], height:[174, 158, 149]};
console.log(data.age[1]);

// ( )内を 変数.プロパティ[番号] とすることで、
// オブジェクトに格納されている指定されたプロパティがもつ配列の、
// 指定された番号がつけられた値を出力することができる。
// 今回は( )内が data.age[1] という記述なので、
// 変数 data に代入されているオブジェクトに格納されたプロパティのうち、
// ageプロパティに格納されている配列の1番目の値である 17 のみを出力する 
```
```:例② console:
17
```

学校で例えれば、
<b><font color="red">配列は1つの班、オブジェクトは1つの学級</font></b>
といった感覚でしょうか？

配列・オブジェクトのどちらも、
<b>複数の項目をひとまとめにできること</b>、<b>複数の項目から個別に出力できること</b>
が共通していました。

また、オブジェクトは <b>項目に配列を格納することが可能であること</b> から、
さらにワンランク上のグループ、すなわち学級というイメージになりました。

この認識で合っているのかどうかは、
さらに学習を進めるうえで明らかになると思います。

合ってるといいなぁ…(笑)

ということで、第4回はここまで！
次回は<b>【繰り返し処理】</b>について書いていきます！
これも、現時点での自分では難易度がなかなかに高いものと認識しているので、
しっかりアウトプットしていきたいと思います。
ご覧いただき、ありがとうございました！
C言語で直感的で使いやすい動的配列を作った話

## はじめに
この記事は[長野高専 Advent Calender 2022](https://qiita.com/advent-calendar/2022/nnct) 14日目の記事です．

そんなわけでc++のvectorを参考に使いやすく汎用性の高い動的配列を作りました．
## ソースコード
そこそこ長いのでgithubにあげました．
[https://github.com/Bet-Amoto/Vector-of-C](https://github.com/Bet-Amoto/Vector-of-C)
vector.h,vector.cが本文です．ソースコードの説明はめんどくさいので割愛します．暇だったり需要があったりするなら書くかもしれません．

### 注意書き
この動的配列には一部保証されない動作が含まれています．基本的には問題なく動作すると思いますが，もしかするとおかしな挙動をする可能性があります．使用は自己責任でお願いします．(コメントでの指摘により追記 2022/12/14)

## 使い方
### 宣言
この動的配列は次のように宣言します．charやintはもちろん，2次元配列や自作構造体の型にも対応しています．vector_initの引数は，動的配列にする型と，最初のサイズです．この時点では，値の初期化はされないことに注意してください．
```c
vector(char) ch_vec = vector_init(char,5);
vector(int) int_vec = vector_init(int,10);
vector(vector(char)) str_vec = vector_init(vector(char),2);
vector(Vec2) vec2_vec = vector_init(Vec2,100);
```

### 要素へのアクセス
配列の要素には通常の配列と同じようにアクセスできます．また，vector_atを使ってアクセスすることもできます．
vector_sizeは，配列の大きさをsize_t型で返します．
```c
vector(int) vec = vector_init(int,5);

for(int i = 0; i < vector_size(vec); i++){
  vec[i] = i;
}
// vec -> [ 0, 1, 2, 3, 4]
```

### 要素の追加・消去
要素の追加・消去には次の関数が用意されています．
```c
//配列(vac)の後ろに値(val)を追加
vector_push_back(vec,val);

//配列のn番目に値を挿入
 vector_insert(vec,n,val);

//配列の一番後ろの値を消去
vector_popback(vec);

//配列のn番目の値を消去
vector_erace(x,n);
```

### メモリの開放
動的配列を実装するにあたって，mallocを使用しています．なので，プログラムが終了する前に自分でメモリを開放する必要があります．
```c
//動的配列のメモリの開放
vector_free(vec);
```

### ソート，反転
ソート，要素の順番の反転をする関数があります．便利．
```c
// int型の値を昇順にソートするときに使用する関数
int compareInt(const void* a,const void* b){
    return *(int*)a - *(int*)b;
}

int main(){
    vector(int) vec = vector_init(int,5);
    vec[0] = 1;
    vec[1] = 3;
    vec[2] = 5;
    vec[3] = 4;
    vec[4] = 2;
    //vec -> [ 1, 3, 5, 4, 2]

    vector_sort(vec,compareInt);
    //vec -> [ 1, 2, 3, 4, 5]

    vector_revears(vec);
    //vec -> [ 5, 4, 3, 2, 1]

    vector_free(vec);

    return 0;
}
```

## 終わりに
個人的にはかなり満足のいくできの動的配列が作れました．もし，ばぐあるぞーとかもっといい実装方法あるぞーとかある方は教えていただけると嬉しいです．
それでは，<font color="Gray">~~地獄の~~</font>楽しいc言語ライフをお過ごしください．
社会人2年目の業務

## Java(Struts)アプリ開発
- 引くほどダサいエクセルみたいな業務アプリ
- 500件ぐらいコードレビューで指摘された
- 記憶が曖昧だけど手元に実行環境がなかったような
- なんの義務感からか初めて休日出勤した

## テスト
- 上のアプリ開発プロジェクトの終盤にテストをやらされた
- クリック、スクショ、神エクセルに貼り付け、みたいな作業を会議室のヘボい椅子に座らされてやってた

## 辞めればよかった
- 5月ごろ転職先の選考がある程度進んだ段階で上司に会社を辞めると伝えるも、止められた
- 新卒離職率とか、そういうのを気にしてのことだったと思う
- 全く同じ日に一緒に配属された同期も会社やめると上司に言ったらしく運命を感じた
- 会社を辞めた人に会ったことがあるが、みんな楽しそう
- 出戻りOKだけど出戻りがいない時点でお察し
TPC-DS tools for Apache Impala

参考資料：
https://github.com/cloudera/impala-tpcds-kit

# 1. テストデータを事前に準備

```bash
sudo yum -y install java-1.8.0-openjdk-devel maven
sudo yum -y install git gcc make flex bison byacc curl unzip patch


git clone https://github.com/cloudera/impala-tpcds-kit.git
cd impala-tpcds-kit/
cd tpcds-gen/
make


sudo -u hdfs hdfs dfs -mkdir /user/root
sudo -u hdfs hdfs dfs -chown root:root /user/root


hadoop jar target/tpcds-gen-1.0-SNAPSHOT.jar -d /tmp/tpc-ds/sf10000/ -p 10 -s 10


aws s3 cp store_sales s3://秘密のBucket/store_sales/ --recursive --exclude "*" --include "data*"
aws s3 cp catalog_sales s3://秘密のBucket/catalog_sales/ --recursive --exclude "*" --include "data*"
```


# 準備したTextデータをImpala Schemaに入れる
```sql

create schema if not exists zzeng_tpcds_60_text;
use zzeng_tpcds_60_text;


create external table catalog_sales (
  cs_sold_date_sk int,
  cs_sold_time_sk int,
  cs_ship_date_sk int,
  cs_bill_customer_sk int,
  cs_bill_cdemo_sk int,
  cs_bill_hdemo_sk int,
  cs_bill_addr_sk int,
  cs_ship_customer_sk int,
  cs_ship_cdemo_sk int,
  cs_ship_hdemo_sk int,
  cs_ship_addr_sk int,
  cs_call_center_sk int,
  cs_catalog_page_sk int,
  cs_ship_mode_sk int,
  cs_warehouse_sk int,
  cs_item_sk int,
  cs_promo_sk int,
  cs_order_number bigint,
  cs_quantity int,
  cs_wholesale_cost decimal(7,2),
  cs_list_price decimal(7,2),
  cs_sales_price decimal(7,2),
  cs_ext_discount_amt decimal(7,2),
  cs_ext_sales_price decimal(7,2),
  cs_ext_wholesale_cost decimal(7,2),
  cs_ext_list_price decimal(7,2),
  cs_ext_tax decimal(7,2),
  cs_coupon_amt decimal(7,2),
  cs_ext_ship_cost decimal(7,2),
  cs_net_paid decimal(7,2),
  cs_net_paid_inc_tax decimal(7,2),
  cs_net_paid_inc_ship decimal(7,2),
  cs_net_paid_inc_ship_tax decimal(7,2),
  cs_net_profit decimal(7,2)
)
row format delimited fields terminated by '|'
stored as textfile
location '/tmp/tpc-ds/sf10000/catalog_sales'
tblproperties ('serialization.null.format'='')
;

create external table store_sales (
  ss_sold_date_sk int,
  ss_sold_time_sk int,
  ss_item_sk int,
  ss_customer_sk int,
  ss_cdemo_sk int,
  ss_hdemo_sk int,
  ss_addr_sk int,
  ss_store_sk int,
  ss_promo_sk int,
  ss_ticket_number bigint,
  ss_quantity int,
  ss_wholesale_cost decimal(7,2),
  ss_list_price decimal(7,2),
  ss_sales_price decimal(7,2),
  ss_ext_discount_amt decimal(7,2),
  ss_ext_sales_price decimal(7,2),
  ss_ext_wholesale_cost decimal(7,2),
  ss_ext_list_price decimal(7,2),
  ss_ext_tax decimal(7,2),
  ss_coupon_amt decimal(7,2),
  ss_net_paid decimal(7,2),
  ss_net_paid_inc_tax decimal(7,2),
  ss_net_profit decimal(7,2)
)
row format delimited fields terminated by '|'
stored as textfile
location '/tmp/tpc-ds/sf10000/store_sales'
tblproperties ('serialization.null.format'='')
;
```