OmniAICreator/Qiita-1.07M huggingface dataset:
【C】初めてのC言語（5. 関数）

# はじめに

* これまでの学習に続いて、今回は関数について学んだ結果をまとめてみました。
  * [【C】初めてのC言語（1. Hello world）](https://qiita.com/nkojima/items/518c1a4ec06861d74b3c)
  * [【C】初めてのC言語（2. 四則演算とフォーマット指定子）](https://qiita.com/nkojima/items/36ea93b7296ce9e8a55b)
  * [【C】初めてのC言語（3. ポインタ）](https://qiita.com/nkojima/items/825bb9f931016faccd68)
  * [【C】初めてのC言語（4. 構造体）](https://qiita.com/nkojima/items/40a1101f2f6f5800bc2d)

# 学習環境

* 今回は[paiza.io](https://paiza.io/ja/projects/new)のC言語のエディタを使いました。

# 関数とは

* プログラムを戻り値つきのサブルーチンに分離したもの。
  * 戻り値がない場合は`void`を指定します。
  * 関数の戻り値の型指定がない場合は、（暗黙的に）int型とみなされます。

# サンプルコード

* **「関数の戻り値の型指定がない場合は、（暗黙的に）int型とみなされる」という仕様は、1999年の仕様改定で削除されており、現行の仕様では戻り値の省略はできないそうです。**
  * @SaitoAtsushi さん、ご指摘ありがとうございました。

## 引数のない関数の例

* `Main`関数から、引数なし・戻り値がint型の関数`test`を呼び出しています。
  * 関数宣言において()のように引数を省略すると、引数が未知と判断されるそうなので、明示的に`void`を入れています。

```c:Main.c
#include <stdio.h>
int test(void) {
    printf("This is test.");
    return 0;
}

int main(void){
    test();
    return 0;
}
```

```text:実行結果
This is test.
```

## 引数のある関数の例

* 関数`calcArea`は、引数が四角形の幅（int型）と高さ（int型）、戻り値が四角形の面積（int型）となっています。
* ここまでの関数はJavaやC#のメソッドとほぼ同じなので、特に引っかかる点はありませんでした。

```c:Main.c
#include <stdio.h>
int calcArea(int width, int height) {
    return width * height;
}

int main(void){
    int width = 3;
    int height = 4;
    int area = calcArea(width, height);
    printf("幅%d、高さ%dの四角形の面積は%dです。", width, height, area);
    return 0;
}
```

```text:実行結果
幅3、高さ4の四角形の面積は12です。
```

## 引数がポインタの関数の例

* [こちらのページ](https://monozukuri-c.com/langc-pointer-necessity/)にはポインタのメリットとして以下の2点が挙げられていました。
  * ポインタを引数にすると別関数のローカル変数にアクセスできて便利。
  * 「ポインタ」を利用するケースで最も多いのが、関数からの出力情報を増やしたい時。
* そこで上記の関数`calcArea`を修正して、引数をポインタにしました。
  * 引数：構造体`Rectangle`のポインタ
  * 戻り値：引数`RectAngle`のポインタの中身が正常であれば0、異常であれば-1を返す
* ポインタを引数にすると、構造体のような大きなデータを使って入力値や結果をやり取りするのが便利になります。
* @fujitanozomu さんのご指摘に沿って、関数`calcArea`のコードでアロー演算子を使って修正したところ、かなりスッキリしました。
  * @fujitanozomu さん、ありがとうございます m(_ _)m

```c:Main.c
#include <stdio.h>
typedef struct rectangle {   /* rectangle（長方形）はタグ名 */
    int width;               /* 幅 */
    int height;              /* 高さ */
    int area;                /* 面積 */
} Rectangle;

int calcArea(Rectangle* r) {
    if (r->width > 0 && r->height > 0) {
        r->area = r->width * r->height;
        return 0;
    } else {
        return -1;
    }
}

int main(void){
    Rectangle rect;
    rect.width = 3;
    rect.height = 4;
    int errCode = calcArea(&rect);
 
    if (errCode == 0) {
        printf("幅%d、高さ%dの四角形の面積は%dです。", rect.width, rect.height, rect.area);
    } else {
        printf("入力値が異常です。幅：%d、高さ：%d", rect.width, rect.height);
    }
    return 0;
}
```

```text:実行結果
幅3、高さ4の四角形の面積は12です。
```

# 参考URL

* [C言語 - Wikipedia](https://ja.wikipedia.org/wiki/C%E8%A8%80%E8%AA%9E)
* [C言語 ポインタのメリットと必要性【なぜなぜから真相に迫る】](https://monozukuri-c.com/langc-pointer-necessity/)
* [1. 値渡しとポインタ渡し](https://tmytokai.github.io/open-ed/activity/c-pointer/text06/page01.html)
Androidアプリ(NDK)開発で時々logcat出力されない


### 問題
AndroidのNDKを使った開発で、C++コードでベタにlogcat出力すると、全く出力されなかったり、少しだけ出力されたりする。

### 対策
一旦適当な長さでキャッシュしてから書き出すように変更して、usleepでちょっと待つようにしたら少し遅くなるけどlogcat出力されるようになった。リリースビルドが必要。いつもこれでうまくいくのかは不明。

```C++: C++(NDK)のlogcat実装例

#include <android/log.h>
#include <unistd.h>

#define dprintf(...) { \
    __android_log_print(ANDROID_LOG_DEBUG, "MyNDK:", __VA_ARGS__);\
    usleep(5000);\
}
....
void printTbl(std::vector<int> &tbl){
     float numPrintUnit = 20.0f; // キャッシュするサイズ（usleepとのバランス）
     int numTbl = tbl.size();
     int splits = ceil(numTbl/numPrintUnit);
     for(int j=0; j<splits; j++){
         std::ostringstream log;
         int st=j*numPrintUnit, ed=((st+numPrintUnit)<numTbl)?(st+numPrintUnit):numTbl;
         for (int i = st; i < ed; i++) {
            log << "tbl[" << i << "]=" << tbl.at(i) << "\n";
         }
         dprintf(log.str().c_str());
     }
}
```

### 関連してよく使うコマンド
* logcatのバッファーをクリア
 `adb logcat -c`
* logcatのバッファーサイズを確認
`adb logcat -G `

### 参考
* https://stackoverflow.com/questions/53962726/why-does-android-studios-logcat-not-fully-output-logs
* https://stackoverflow.com/questions/12397780/how-to-change-size-of-logcat-buffer-in-android
5.2 (難) t分布

**方針は5章後半~7章の内容を含みます．**


## 方針

t分布について．

```math
Z\sim \mathcal{N}(0,1),\ \ Y\sim\chi_m^2
```

の時，

```math
\frac{Z}{\sqrt{Y/m}}\sim t_m
```

これが分かっていると，t検定で使う

```math
\frac{\sqrt{n}(\bar{X}-\mu)}{V}\sim t_{n-1}
```

が分かる．ただし，

```math
X_1,…,X_n:iid\sim\mathcal{N}(\mu,\sigma^2)
```

として

```math
\bar{X}=\frac{1}{n}\sum_{i=1}^nX_i,\ \ \ V^2=\frac{1}{n-1}(X_i-\bar{X})^2
```

と置いた．中心極限定理 (CLT) により，

```math
Z=\frac{\sqrt{n}(\bar{X}-\mu)}{\sigma}\rightarrow_d\mathcal{N}(0,1)
```

一方，

```math
Y=\sum_{i=1}^m\left(\frac{X_i-\bar{X}}{\sigma}\right)^2=\frac{(n-1)V^2}{\sigma^2}\sim\chi_{n-1}^2
```

ゆえ，

```math
\frac{Z}{\sqrt{Y/(n-1)}}\sim t_{n-1}
```

である．今，

```math
\frac{Z}{\sqrt{Y/(n-1)}}=\frac{\frac{\sqrt{n}(\bar{X}-\mu)}{\sigma}}{\sqrt{\frac{V^2}{\sigma^2}}}=\frac{\sqrt{n}(\bar{X}-\mu)}{V}
```

より，

```math
\frac{\sqrt{n}(\bar{X}-\mu)}{V}\sim t_{n-1}
```

が得られた．

## 答案

![5.-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/ce0e843d-d309-57bd-023a-f36acc476e14.jpeg)
![5.-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/49ccd944-ddd8-0d25-a838-047965a97c47.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.69.dylib でビルドが失敗する

```bash
❯ ls -al /usr/local/opt/icu4c/lib/
drwxr-xr-x    - junichimurata 2021-10-29 01:05 icu
.r--r--r--  29M junichimurata 2022-05-14 17:32 libicudata.70.1.dylib
lrwxr-xr-x   21 junichimurata 2021-10-29 01:05 libicudata.70.dylib -> libicudata.70.1.dylib
.r--r--r--  29M junichimurata 2021-10-29 01:05 libicudata.a
lrwxr-xr-x   21 junichimurata 2021-10-29 01:05 libicudata.dylib -> libicudata.70.1.dylib
.rw-r--r-- 2.7M junichimurata 2022-05-14 17:32 libicui18n.70.1.dylib
lrwxr-xr-x   21 junichimurata 2021-10-29 01:05 libicui18n.70.dylib -> libicui18n.70.1.dylib
.r--r--r-- 5.0M junichimurata 2021-10-29 01:05 libicui18n.a
lrwxr-xr-x   21 junichimurata 2021-10-29 01:05 libicui18n.dylib -> libicui18n.70.1.dylib
.rw-r--r--  81k junichimurata 2022-05-14 17:32 libicuio.70.1.dylib
lrwxr-xr-x   19 junichimurata 2021-10-29 01:05 libicuio.70.dylib -> libicuio.70.1.dylib
.r--r--r--  68k junichimurata 2021-10-29 01:05 libicuio.a
lrwxr-xr-x   19 junichimurata 2021-10-29 01:05 libicuio.dylib -> libicuio.70.1.dylib
.r--r--r-- 103k junichimurata 2022-05-14 17:32 libicutest.70.1.dylib
lrwxr-xr-x   21 junichimurata 2021-10-29 01:05 libicutest.70.dylib -> libicutest.70.1.dylib
.r--r--r--  79k junichimurata 2021-10-29 01:05 libicutest.a
lrwxr-xr-x   21 junichimurata 2021-10-29 01:05 libicutest.dylib -> libicutest.70.1.dylib
.rw-r--r-- 222k junichimurata 2022-05-14 17:32 libicutu.70.1.dylib
lrwxr-xr-x   19 junichimurata 2021-10-29 01:05 libicutu.70.dylib -> libicutu.70.1.dylib
.r--r--r-- 266k junichimurata 2021-10-29 01:05 libicutu.a
lrwxr-xr-x   19 junichimurata 2021-10-29 01:05 libicutu.dylib -> libicutu.70.1.dylib
.r--r--r-- 1.7M junichimurata 2022-05-14 17:32 libicuuc.70.1.dylib
lrwxr-xr-x   19 junichimurata 2021-10-29 01:05 libicuuc.70.dylib -> libicuuc.70.1.dylib
.r--r--r-- 2.7M junichimurata 2021-10-29 01:05 libicuuc.a
lrwxr-xr-x   19 junichimurata 2021-10-29 01:05 libicuuc.dylib -> libicuuc.70.1.dylib
drwxr-xr-x    - junichimurata 2022-05-14 17:32 pkgconfig
```

確かに無い。
homebrew でバージョンをあげてしまったっぽい。

```bash
❯ brew info icu4c
icu4c: stable 70.1 (bottled) [keg-only]
C/C++ and Java libraries for Unicode and globalization
https://icu.unicode.org/home
/usr/local/Cellar/icu4c/67.1 (258 files, 71.8MB)
  Poured from bottle on 2021-01-08 at 15:16:03
/usr/local/Cellar/icu4c/68.2 (259 files, 72.5MB)
  Poured from bottle on 2021-03-26 at 22:59:08
/usr/local/Cellar/icu4c/69.1 (259 files, 72.8MB)
  Poured from bottle on 2021-05-30 at 14:44:39
/usr/local/Cellar/icu4c/70.1 (261 files, 74.4MB)
  Poured from bottle on 2022-05-14 at 17:32:27
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/icu4c.rb
License: ICU
```

シンボリックリンクを手動で貼る。

```bash
cd /usr/local/opt
unlink icu4c
ln -s /usr/local/Cellar/icu4c/69.1 icu4c
```

ビルドできた。
ハイパーバイザーの変わりにsystemd-nspawnを使う

## あらすじ
ハイパーバイザーの代替を探しているとSystemd-nspawnというものに出会った。オーバーヘッドがほぼないハイパーバイザー的な感じで使えるchrootの強化版らしい。

ちなみに[ブログ](https://nexryai.sda1.net/)にも同じ記事を投稿しています。

<br>

## Dockerとの比較

・Dockerは基本的に一つのアプリを動かす目的で使われるのでハイパーバイザー的な使い方はできない（コンテナ内からsystemctlがそもそも使えない）

・systemd nspawnは仮想マシンのような感覚で使える。

・ただしsystemd nspawnの方がディスクを多く使う上コンテナは配布されていないので自力で構築する必要がある

<br>

## ハイパーバイザーとの比較

・systemd nspawnの方がオーバーヘッドがかなり少ない（仮想化技術を使っているのではなくchrootなので）

・ただしsystemd nspawnはゲストとして使えるOSが限られている（ubuntuなどメジャーなLinuxディストリビューションなら動くがWindows serverやTrueNASなどは動かない）

<br>

# 実際に使ってみる

## systemd nspawnのインストール

標準で入っているらしいがopenSUSEだと入っていなかった。ディストリビューションによってパッケージ名が違うのでそこは各自調べてください（cnfやcommnad-not-foundコマンドを使うと便利）  
続いて以下を実行 <br>

```
sudo systemctl enable machinectl.target
sudo systemctl start machinectl.target
```

<br>
 
## ゲストOSを構築

今回はゲストとしてubuntuかdebianを採用。まずdebootstrapをインストールする。

続いて

`sudo mkdir -p /var/lib/machines/server1`

 

#### ubuntuの場合
`sudo debootstrap --arch=amd64 focal /var/lib/machines/server1 http://archive.ubuntu.com/ubuntu/`

#### debianの場合
`sudo debootstrap --arch=amd64 bullseye /var/lib/machines/smb https://ftp.riken.jp/Linux/debian/debian/`

<br>
 
## 初期設定

`sudo systemd-nspawn -D /var/lib/machines/server1` でコンテナに入りpasswdでパスワードを設定する。ここまでくればもう完成したも同然。

<br>

### 設定ファイル記述

`sudo machinectl enable server1`

続いて `/etc/systemd/nspawn/server1.nspawn` を作成し以下の内容を書き込む

```
[Network]
MACVLAN=em1
```

ホストのディレクトリをコンテナにマウントしたい場合は以下も追記

```
[Files]
Bind=[マウントしたいディレクトリのパス]:[コンテナ内でのマウント先のパス]

[Exec]
PrivateUsers=no
```

<br>

### コンテナ起動
`sudo machinectl start server1`  
`sudo machinectl login server1`

<br>

### ネットワークを開通させる
`ip a` でネットワークインターフェースの名前を調べ `ip l set [インターフェース名] up` で起こす。ipが何故か降ってこないので `dhclient -v` でipを取得

<br>

※抜けるにはctrlキーを押しながら" ] "キーを3回押す

※macvlanオプションを付けているのはホストと同じip空間に接続したいから

<br>

## 各種セットアップ

### 不足しているaptのリポジトリを追加

##### ubuntu
```
apt install software-properties-common
apt-add-repository universe
```

##### debian
`apt install sudo`

 
<br>

### ユーザー追加

```
adduser user
gpasswd -a user sudo
```
 
<br>

### ネットワークの設定の永続化とip固定

1. `/etc/systemd/network/[インターフェース名].network` を作成し以下を追記 (アドレス等は適当に読み替えて)
```
[Match]
Name=[インターフェース名]

[Network]
Address=192.168.0.100/24
Gateway=192.168.0.1
DNS=192.168.0.1
```
 

2. systemd-networkdの有効化
```
ip l set [インターフェース名] down
systemctl enable systemd-networkd
systemctl start systemd-networkd
```

<br>

### ファイアウォールの有効化 （重要）
ファイアウォールの有効化は絶対に必須。ファイアウォールなしでサーバーを公開するのは何も持たずに普段着で戦場に飛び出すのと同じ。

```
sudo apt install ufw
sudo ufw default deny
```

このままだとsshが使えないのでsshを使いたい場合
```
sudo ufw allow from [192.168.0.0/24 などの許可するIPの範囲] to any port 22
```

最後に有効化
```
sudo ufw enable
```

<br>

### sshの有効化

`sudo apt install openssh-server`

 
## おまけ（備忘録）
### smbサーバーの構築
```
sudo apt install samba
sudo chown <ユーザー名>:<グループ名> /var/storage
sudo chmod 770 /var/storage
```

`/etc/samba/smb.conf` に追記

```
[storage] # 共有で表示される共有名
path = /var/storage
writeable = yes
guest ok = no
create mode = 0775
directory mode = 0775
valid users = @<グループ名>
```

後は `sudo systemctl restart smbd`でsamba起動


<br>

## まとめ

普通の仮想マシンのような使い勝手なので個人的にはDockerより使いやすい。ディレクトリをコピーすればそのままバックアップできるので移行も簡単。リソース消費量が少なくラズパイのような非力な環境でも動く。 systemd最高！
Pythonで一つのディレクトリに一気に複数フォルダを作成する方法

どうもエンジニアのirohasです。

今回はちょっとしたPythonの情報共有ができればと思い記事を投稿します。

内容としては、タイトルの通り、複数のフォルダを一気に作成しよう！というやつです。


ソースコードは以下になります。

```python:make.py
import os

path_list = ["作成したいフォルダ名たちを格納"]

for dir in path_list:
    if not os.path.exists(dir):
        os.mkdir(dir)
```

まずは作成したいフォルダ名たちを格納したリストを作り、それをfor文で回し、
標準ライブラリであるosモジュールを使って要素ずつフォルダを作成していく形になります。
いくらでも作成可能なので是非みなさんも機会があれば使ってみてください！！！
Vue.js teleport要素を使う

表示する要素自体は一つのコンポーネントの中で管理したいが、表示自体はコンポーネントとは別の場所に表示したい。そんなときに使えるのが「teleport」要素。

## teleport要素を使うシチュエーション

アプリの中にボタンがあり、そのボタンを押したときに別の要素を表示したい。なのでそれらをひとまとめにしたコンポーネントを作成したいが、表示する要素自体はボタンとは別の場所にしたい。このようなとき、「teleport」要素を利用すれば実現できる。

## teleport要素の書き方

表示側

```html
<body>
  <div id="app">
    <my-teleport /> <!-- teleport要素を記述するコンポーネント-->  
  </div>

  <!-- ここから --> 
  <div>
    テレポートとコンポーネントとの間の要素1
  </div>
  <div>
    テレポートとコンポーネントとの間の要素2
  </div>
  <!-- ここまではコンポーネントとteleport要素の間に表示される要素 -->

  <div id="teleport"></div> <!-- teleport要素を表示する場所 -->
</body>
```

コンポーネント側

```jsx
Vue.createApp({})
  .component('my-teleport', {
    data: function() {
      return {
        show: false
      }
    },
    template: `
      <form>
        <input type="button" v-on:click="onclick(true)" value="　テレポート要素を表示する" />
      </form>

      <teleport to="#teleport">
        <div v-if="show">
          <p>テレポート！</p>
          <input type="button" v-on:click="onclick(false)" value="テレポート要素を非表示にする"/>
        </div>
      </teleport>
    `,
    methods: {
      onclick: function(event) {
        this.show = event
      }
    }
  })
  .mount('#app')
```

このように書くことでコンポーネントの中にあるteleport要素が二つのdivタグを跨いだ位置に表示できるようになる。さらに　「id=”app”」の外にも記述できる点もteleport要素の使いやすいところ。
【MySQL】MySQLのパスワードハッシュ作成時(SELECT PASSWORD)のエラー対処(ERROR 1064 (42000): You have an error in your SQL syntax)

# はじめに
Dockerの上に作成したMySQLのコンテナの中で`select password`を実行したところ、Syntaxエラーが表示されて処理ができませんでした。
今回は、こちらの対処方法について書きます。

:::note warn
今回は、パスワードハッシュを取得するためだけにMySQLのコンテナを作成していることが前提になります。
(パスワードハッシュが取得できたらMySQLのコンテナは削除)
:::

# 環境

- **MacBook Pro 2020年モデルを使用します。(macOS Monterey バージョン12.3.1)**
![スクリーンショット 2022-04-12 16.47.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/f6632197-79bd-a797-ddaa-b4f041755ba0.png)

- **Dockerのバージョン(20.10.0)**
```zsh
% docker -v
Docker version 20.10.0, build 7287ab3
%
```

- **MySQLのバージョン(8.0.29)**

```sql
mysql> SELECT PASSWORD('mypass');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('mypass')' at line 1
mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 8.0.29    |
+-----------+
1 row in set (0.00 sec)

mysql>
```

# エラー内容
パスワードハッシュを作成しようとした際に以下エラーが発生。

```sql
mysql> select password('98mfa9af;iafj');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('98mfa9af;iafj')' at line 1
mysql>
```

# 対処
MySQLのコンテナを古いバージョンで作成し直してコマンドを再実行。

- バージョン(5.7.38)

```zsh
mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 5.7.38    |
+-----------+
1 row in set (0.00 sec)

mysql>
```

- コマンド再実行

```zsh
mysql> select password('mypass')
    -> ;
+-------------------------------------------+
| password('mypass')                        |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql>
```

## 補足:Dockerコンテナの再作成について

以下の記事をご覧下さい。

https://qiita.com/masato930/items/d5aae56ac594bd29287c

# 原因
password関数がMySQLのver5.6.7時点で廃止されたため。

# 参考記事
https://qiita.com/k3ntar0/items/22486f0666dc1759e0c1

https://www-creators.com/archives/5574

https://stackoverflow.com/questions/36099028/error-1064-42000-you-have-an-error-in-your-sql-syntax-want-to-configure-a-pa
Next.js: i18n/Internationalization

こちらのページを参考にしました。
[NextJS i18n/Internationalization](https://codegino.com/blog/nextjs-i18n)
次のコードを改造しました。
[codegino/next-i18n-example](https://github.com/codegino/next-i18n-example)

次のような日本語のページが表示されるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/85fce630-ff7c-3175-c47b-cf8920bd990a.png)

## 準備 ##

コードのクローン

```bash
git clone https://github.com/codegino/next-i18n-example.git
```

ライブラリーのインストール

```bash
cd next-i18n-example
npm install next-i18next
```

サーバーの起動

```bash
npm run dev
```

http://localhost:3000/
にアクセス

## コードの改造

```js:next-i18next.config.js
module.exports = {
  i18n: {
    defaultLocale: "en",
    locales: ["en", "sv", "zh-CN", "ja"],
    localePath: "./locales",
  },
};
```

```jsx:components/Header.jsx
import React from "react";
import Link from "next/link";
import { useRouter } from "next/router";
import { useTranslation } from "next-i18next";

const Header = () => {
  const router = useRouter();

  const handleLocaleChange = (event) => {
    const value = event.target.value;

    router.push(router.route, router.asPath, {
      locale: value,
    });
  };

  // Will default to `common` if not argument is specified
  const { t } = useTranslation();

  return (
    <header>
      <nav>
        <Link href="/">
          <a className={router.asPath === "/" ? "active" : ""}>{t("home")}</a>
        </Link>
        <Link href="/about">
          <a className={router.asPath === "/about" ? "active" : ""}>
            {t("about")}
          </a>
        </Link>
      </nav>

      <select onChange={handleLocaleChange} value={router.locale}>
        <option value="en">🇺🇸 English</option>
        <option value="zh-CN">🇨🇳 中文</option>
        <option value="sv">🇸🇪 Swedish</option>
        <option value="ja">JP 日本語</option>
      </select>

      <style jsx>{`
        a {
          margin-right: 0.5rem;
        }

        a.active {
          color: blue;
        }

        nav {
          margin-bottom: 0.5rem;
        }
      `}</style>
    </header>
  );
};

export default Header;
```

```json:locales/ja/built-in-demo.json
{
  "number": "Number: {{val, number}}",
  "currency": "Currency: {{val, currency}}",
  "dateTime": "Date/Time: {{val, datetime}}",
  "relativeTime": "Relative Time: {{val, relativetime}}",
  "list": "List: {{val, list}}",
  "weekdays": ["月曜日", "火曜日", "水曜日", "木曜日", "金曜日"]
}
```

```json:locales/ja/common.json
{
  "home": "ホーム",
  "about": "紹介"
}
```

```json:locales/ja/home.json
{
  "greeting": "皆さん　こんにちは"
}
```

```json:locales/ja/newsletter.json
{
  "title": "Stay up to date",
  "subtitle": "Subscribe to my newsletter",
  "form": {
    "firstName": "First name",
    "email": "E-mail",
    "action": {
      "signUp": "Sign Up",
      "cancel": "Cancel"
    }
  }
}
```

サーバーの起動

```bash
npm run dev
```

http://localhost:3000/
にアクセス
Stylelintの導入

# はじめに
個人的なStylelintの使い方をメモしておく。

https://stylelint.io/

> A mighty, modern linter that helps you avoid errors and enforce conventions in your styles.

Stylelintはスタイルにおけるエラーを回避し規約を強制するためのリンター。

# Stylelintと便利なプラグインのインストール
Stylelint本体とプラグインをインストールする。

```shell
% npm i -D stylelint \
           stylelint-config-standard \
           stylelint-config-recess-order \
           stylelint-config-prettier \
           stylelint-order
```

- [stylelint-config-standard](https://www.npmjs.com/package/stylelint-config-standard)：`stylelint-config-recommended`を拡張したもの。GoogleやAirbnbのCSSスタイルガイドで使われているルールを有効にする。
- [stylelint-config-recess-order](https://www.npmjs.com/package/stylelint-config-recess-order)：Twitter社製ツールの`Recess`や、`Bootstrap`と同じようにCSSプロパティをソートする。
- [stylelint-config-prettier](https://www.npmjs.com/package/stylelint-config-prettier)：`Prettier`と衝突する可能性のあるルールを全てオフにする。
- [stylelint-order](https://www.npmjs.com/package/stylelint-order)：Stylelintにおけるソート用のプラグイン。自分でソートのrulesを書くこともできるし、`stylelint-config-recess-order`などの、ソートのルールが定義されたコンフィグに沿ってソートすることもできる。

Stylelintの設定ファイルをjson形式で書く。

```json:.stylelintrc.json
{
  "extends": [
    "stylelint-config-standard",
    "stylelint-config-recess-order",
    "stylelint-config-prettier"
  ],
  "plugins": [
    "stylelint-order"
  ]
}
```

# VSCode での Stylelint

```shell
% npx stylelint --fix src/**/*.css
```

というようにcssファイルを編集するたびに`npx`でStylelintを実行するのは大変なので、
VSCodeの拡張機能を使って、リアルタイムでエラーを表示し、cssファイルを保存するたびにStylelintを実行して、一部のエラーを自動で修正できるようにする。

https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint

この拡張機能をインストールすればリアルタイムでスタイルのエラーを表示してくれるようになり、`settings.json`に以下を記述すれば、ファイルの保存時に一部のエラーを自動で修正してくれるようになる。

```json:.vscode/settings.json
{
  "editor.codeActionsOnSave": {
    "source.fixAll.stylelint": true,
  },
}
```

チームメンバーに拡張機能を推奨するには、以下をgitで管理しておけばok。

```json:.vscode/extensions.json
{
  "recommendations": [
    "stylelint.vscode-stylelint"
  ]
}
```

# lint-staged・husky と Stylelint
コミット時にStylelintを実行するために、以下のコマンドで`lint-staged`と`husky`をインストールする。

```shell
% npx mrm@2 lint-staged
```

このコマンドを実行すると、パッケージのインストールだけではなく、`package.json`への初期設定を行い、`husky`の各種ファイルを生成してくれる。
これだけで、コミット時にStylelintが実行されるようになる。
【AtCoder】ABC250 E問題 解説

# 問題
問題のリンクは以下にあります。ちなみに私はコンテストの時間内で解くことができませんでした。実力不足を痛感。

https://atcoder.jp/contests/abc250/tasks/abc250_e

# 計算量
まずは計算量から考える。
クエリの数である $Q$ が $2 \times 10^5$ なので、クエリ1つにかけられる計算量はそこまで多くないと考えた。
今回の問題は $log$ の計算量になる気配がなかったので、おそらく$O(1)$で処理するのだとうと思い、その方法を考えた。

方針はカンタンで、
- $A$ と $B$ それぞれに対して、あらかじめ各iにつき、($a_1,a_2...,a_i$)、($b_1,b_2...,b_i$)の集合に関するデータを準備しておく
- 各クエリに対して適切なデータを読み出し、等しいかどうか判定する

とすればよい。

# 発見した性質

この問題のキーポイントとなっていた性質は以下の通りだ。

- 集合の要素数は単調増加
- **要素数に対して、集合が一意に定まる**

前者の性質は比較的気づきやすい。前者の性質から、後者の性質に気づけたかどうかがACのカギになっていたと思う。  
<br>

後者の性質は、以下の事実から証明ができる

- ある集合に新しい数値を追加することを考えるとき、要素数が増えるのは、その集合に含まれていなかった要素を追加する時だけ
- 逆に既存の要素を追加しても、要素数は変化しない。
<br>

そういうわけなので、以下の手順で問題を解くことができる。
- あらかじめそれぞれの要素数に対して、『数列 {$a_i$} における要素数 $i$ の集合と、{$b_i$}におけるそれが等しいかどうか』というのを調べておく。
- $x_i, y_i$ に対して、要素数が等しくなければ `False`を返し、等しければその要素数に対して前の手順で調べたデータと照合する。集合が等しければ `True`、そうでなければ `False`

# 実装
以下が私のソリューションコードとなっている。
結局の計算量は$O(N+Q)$となって間に合う。
なんかもう少し変数を削減できるような気もするので、ぜひコメントください。
ちなみに強い人は *Zobrist Hash* で解いたそうだ。こちらの説明は割愛する。

```cpp:ABC250_E.cpp
const int max_n = 200005;
int a[max_n], b[max_n];
int elenum_a[max_n], elenum_b[max_n]; //i番目までに含まれる要素数
vi a_nodup, b_nodup; //1番目から見ていって、重複した要素を除いた数列(最初に出てくるものだけをpushbackする)
map<int, int> mp_a, mp_b; //要素firstが初めて登場したのは何番目かをsecondに格納

int issame[max_n]; //ともに要素数がiであるとき、集合は等しいのかどうか
map<int, int> mp_iscontained_a, mp_iscontained_b;
int n, q;

int main() {
	//int a = in<int>(); string b = in<string>(); char c = in<char>();
	//double d = in<double>();
	//(void)scanf("%d",& );
	//(void)scanf("%d%d",& ,& );
	cin >> n;
	repa(i, n) { (void)scanf("%d", &a[i]); }
	repa(i, n) { (void)scanf("%d", &b[i]); }

	int elenum = 0;
	repa(i, n) {
		if (mp_a[a[i]] == 0) {
			elenum++;
			a_nodup.push_back(a[i]);
			elenum_a[i] = elenum;
			mp_a[a[i]] = i;
		}
		else {
			elenum_a[i] = elenum;
		}
	}
	elenum = 0;
	repa(i, n) {
		if (mp_b[b[i]] == 0) {
			elenum++;
			b_nodup.push_back(b[i]);
			elenum_b[i] = elenum;
			mp_b[b[i]] = i;
		}
		else {
			elenum_b[i] = elenum;
		}
	}

	//最初に等しくなる要素数はいくつか
	repa(i, n) issame[i] = false;
	int com_elenum = min(1, min(elenum_a[n], elenum_b[n]));

	int dif_a = 0, dif_b = 0; //片方の集合にあって、もう片方の集合に含まれない要素の数
	for (int i = com_elenum; i <= (int)min(elenum_a[n], elenum_b[n]); i++) {
		if (a_nodup[i - 1] == b_nodup[i - 1]) {
			if (dif_a == 0 && dif_b == 0) {
				issame[i] = true;
			}
		}
		else {
			int p = a_nodup[i - 1], q = b_nodup[i - 1];
			if (mp_iscontained_b[p]) {
				dif_b--;
			}
			else {
				dif_a++; mp_iscontained_a[p] = 1;
			}
			if (mp_iscontained_a[q]) {
				dif_a--;
			}
			else {
				dif_b++; mp_iscontained_b[q] = 1;
			}
			if (dif_a == 0 && dif_b == 0) {
				issame[i] = true;
			}
		}
	}

	cin >> q;
	rep(i, q) {
		int x, y;
		(void)scanf("%d%d", &x, &y);
		int fx = elenum_a[x], fy = elenum_b[y];
		if (fx == fy && issame[fx]) {
			cout << "Yes" << endl;
		}
		else cout << "No" << endl;
	}

	return 0;
}

```
fish で n を使って node をインストールしたときにハマったこと

nodeのインストール時に少し詰まったので備忘録として書いておこうと思います。

# 結論:

> fish での環境変数指定では `-x` オプションを忘れない！

```shell:config.fish
set -x N_PREFIX $HOME/.n.      # -x オプションが必要だった
set PATH $N_PREFIX/bin $PATH
```

# n をインストールし、 n lts でインストールに失敗する

n のインストールは Homebrew でインストールしました。

```shell
brew install n
```

n ではインストール先が /usr/local/bin になっていますが、これだと権限でエラーになります。なのでインストール先を以下のように指定し、パスも通しました。

```shell:config.fish
set N_PREFIX $HOME/.n
set PATH $N_PREFIX/bin $PATH
```

これでインストールはできるようになったはずなので安定版をインストールしてみます。

```shell
n lts
```

でもエラーになります。

```shell
  installing : node-v16.15.0
       mkdir : /usr/local/n/versions/node/16.15.0
mkdir: /usr/local/n: Permission denied

  Error: sudo required (or change ownership, or define N_PREFIX)
```

なんで・・・？

`$N_PREFIX` が設定できていないのかなと思いましたが、ちゃんとセットできているようです。

```shell
exec fish
echo $N_PREFIX
/Users/branch10480/.n
```

# 正解はこれ！

環境変数のセット時に **`-x` オプションを付ける** ということが重要でした。

これで `n lts` の実行時に `$N_PREFIX` が適用されるようになります。

```shell:config.fish
set -x N_PREFIX $HOME/.n.      # -x オプションが必要だった
set PATH $N_PREFIX/bin $PATH
```

# -x オプションとは？

`-x`、 `-export` オプションを指定することで子プロセスにも伝播されるようになるとのことです。これでやっと環境変数として使えるようになります。

今回これを指定するのを忘れていました。

---

同じようなところで詰まっている方の参考になれば幸いです！
Node-RED＋HueAPI照明の調光調色制御


使用機材
---------
Raspberry Pi 3 Model B
Philips Hue
MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports)　mac　os　11.6


概要
----
下記投稿記事のように、Node-REDのwebアプリでHueAPIのシーンを再生していたのですが、
調光率や色温度を部屋ごとに変えたいのと、状態を表示させたいので、新たに状態表示と調光率、調色率を指定する機能を実装しました。

https://qiita.com/taisuke0430/items/58a401d55b64335a51f7

https://qiita.com/taisuke0430/items/a1191ec1dad2f1dbfc6b



UI
----
各部屋ごとに調光、調色、ON/OFFがわかるようになっており、操作も可能にしています。
ON/OFFはAPIにany　onのコマンドがあり、どれか一つでも点灯していたらONとなるようにしています。
![app02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/ceee42c2-b52e-1d9f-1707-2fbb8f7236ec.png)

動作
-----------
連続調光にしたかったのですが、動作がもたついたので、ボタンをリリースしたら変更するような形にしています。

![IMG_7309_MOV_AdobeCreativeCloudExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/f3a97e8a-7008-221d-c3b7-91e2dea3f05a.gif)

Node-RED構成
----------
Hue　のAPIは色温度がctになっているのでKに変換するようにしています。
![Instagram post - 30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204852/df49b689-9be0-84c0-c278-1868217b5281.png)

Hueのアプリでやったらええやんといわれそうですが、1画面で調光と調色はできないので、意外と便利です。
【備忘録】Vue+MQTT.jsで躓いた話

# TL; DR

1. `'mqtt/dist/mqtt.min'`をインポートする
1. WebSocketプロトコルを使う

# はじめに

IoTまわりでMQTT通信を使う雰囲気があったので調査のために簡単なデモ環境を作ろうとしたら躓いたのでその備忘録を残す。

# 実装

## 前提

### MQTT環境

brokerおよびpublisherにはNode-REDを使用。brokerにはaedesを利用

https://flows.nodered.org/node/node-red-contrib-aedes

![Animation1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266076/d6b4297b-9278-ff10-185d-ea629a373478.gif)

### Vueプロジェクト

viteでvue-tsをテンプレートとしてプロジェクトを作成。

## MQTT.js導入

https://github.com/mqttjs/MQTT.js#install

READMEに従って`npm install`する

```
npm install mqtt
```

READMEの雰囲気でsubscriberを書いてみる

```vue:Subscriber.vue
<script setup lang="ts">
import { ref } from 'vue'
import * as mqtt from 'mqtt'

const client = mqtt.connect({host: 'localhsot', port: 1883})

const topic = 'kurukuruz/demo'
client.on('connect', () => {
    client.subscribe(topic)
})

const msgs = ref([] as string[])
client.on('message', (_, msgBuf) => {
    msgs.value.push(msgBuf.toString())
})
</script>

<template>
<h3>{{ topic }}</h3>
<ul v-for="msg in msgs">
    <li>{{ msg }}</li>
</ul>
</template>
```

App.vueにコンポーネントを追加して実行してみると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266076/63a42a3d-651e-2f8d-1b01-7c0a82b48ee9.png)
"global is not defined"なるエラーが発生し、画面が表示されない。

## 修正①

https://github.com/mqttjs/MQTT.js/issues/1269

ブラウザで使用するにはそれ用にコンパイルされたものを使う必要がある模様。上記Issueに従ってimportを書き換える。

```diff_vue:Subscriber.vue
- import * as mqtt from 'mqtt'
+ import * as mqtt from 'mqtt/dist/mqtt.min';
```

そのままでは型定義が存在しないので上記Issueに従ってmqttの型定義を拝借する形で定義する。

```ts:src/types/shims-mqtt.d.ts（新規作成）
declare module 'mqtt/dist/mqtt.min' {
    import MQTT from 'mqtt'
    export = MQTT
}
```

上記変更を適用して実行してみると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266076/2d0ed102-7668-2360-2f98-04040a5493db.png)
先ほどより進んだ気がするが"n.createConnection is not a function"という別のエラーが発生している。

## 修正②

https://stackoverflow.com/questions/68118661/mqtt-net-createconnection-is-not-a-function

ブラウザで使用する場合はnodeの`net`APIを使えないのでWebSocketを使うか`net`APIの代わりになるようなライブラリを使うようにとのこと。

aedesの場合はWebSocketバインド機能があるので有効化してWebSocket通信に切り替える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266076/ea6605f0-6055-eeb6-4626-20430deb42f2.png)

```diff_vue:Subscriber.vue
- const client = mqtt.connect({host: 'localhsot', port: 1883})
+ const client = mqtt.connect({protocol: 'ws', host: 'localhsot', port: 18830})
```

上記変更を適用して実行してみると…
![Animation2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266076/a26523e5-750f-d7d9-b147-c24622def643.gif)
Subscribeできた！

 # 課題

aedesはWebSocketバインド機能があったからよかったけど、その機能がない環境がすでに構築されていた場合どうするのか？
【React】 Uncaught Error: App(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null. エラーの解決方法 【Create React App】


## エラーが発生

- Reactアプリ開発中、コンパイルエラーは発生していないが、画面が何も表示されなくなった
- Chromeのコンソールには以下のエラーが表示

```
react-dom.development.js14169
Uncaught Error: App(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.
```

## エラーの原因
return 部分を誤って削除してしまっていた
```App.js
import React from 'react';
import './App.css';
import './service/firebase';
import Header from './components/Header';

function App() {
    // 原因： 以下をreturnしていない
    <div className="App">
      <Header />
    </div>
}

export default App;
```

## エラーの解決方法
return してあげたらエラーが無くなり画面が表示される
```App.js
import React from 'react';
import './App.css';
import './service/firebase';
import Header from './components/Header';

function App() {
  return (
    <div className="App">
      <Header />
    </div>
  );
}

export default App;
```
C言語のポインタの勉強

# 目的
入社したばかりのシステムエンジニアがC言語のポインタをマスターできることおよび、
日々の学習成果を見える化することの2点を目的とする。

# 内容
3章ポインタと関数において、スタックとヒープを学習。
スタック、ヒープどちらもメモリの一部である。
* スタック：関数のメモリの割り当て
* ヒープ：動的メモリの割り当て

スタックフレーム、駆動レコード、駆動フレームと呼ばれるデータがスタックに格納される。
スタックフレームは、関数への引数やローカル変数などが置かれる。
スタックフレームが作成されるとき、スタックの後ろから順に、関数の引数、リターンアドレス、ローカル変数がプッシュされる。

# 所感
関数を作成するときに、スタックフレームをスタックにプッシュしていくと、
そのうちメモリを使い果たすスタックオーバーフローに気をつける。

## 参照
詳説Cポインタ
新規Railsプロジェクトの作成〜localhostに接続するまで

毎回手順を調べては忘れるので、備忘録。
# 1.Railsをインストールする
```
$ mkdir rails-tutorial
$ cd rails-tutorial
$ bundle init
Writing new Gemfile to /Users/hogehoge/rails-tutorial/Gemfile
```

作成されたGemfileを編集。railsのコメントアウトを外す。
```diff_ruby:Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

- # gem "rails"
+ gem "rails"
```

```
$ bundle install --path vendor/bundle
```
# 2.Railsプロジェクトを作成する
今回はDBをMySQLにして作成。
```
$ bundle exec rails new . -B -d mysql --skip-turbolinks --skip-test
```
# 3.DBを作成する
```
$ rails db:create
```
#### ※ Mysql2::Error::ConnectionError: Access denied for user 'root'@'localhost' (using password: NO)のエラーが出た場合
MySQLのパスワードを設定し直す必要がある。
パスワードは、**長さが8文字以上, 小文字/大文字両方が含まれており, 特殊文字が含まれている**ものにすること。
```
$ mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root: （現在のパスワードを入力）

The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 50 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : (Yと入力)

New password: （新しいパスワードを入力）

Re-enter new password: （再度新しいパスワードを入力）
```
また、database.ymlのパスワードも変更する。
```yaml:database.yml
...

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: (新しいパスワードを入力)
  socket: /tmp/mysql.sock

...

production:
  <<: *default
  database: rails_tutorial_twitter_production
  username: rails_tutorial_twitter
  password: （新しいパスワードを入力）
```

# 4. yarnとwebpackerのインストール
```
$ yarn install
$ rails webpacker:install
```

# 5.　サーバーを起動！
```
$ rails s

...

=> Booting Puma
=> Rails 6.1.6 application starting in development 
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 5.6.4 (ruby 2.6.6-p146) ("Birdie's Version")
*  Min threads: 5
*  Max threads: 5
*  Environment: development
*          PID: 43735
* Listening on http://127.0.0.1:3000
* Listening on http://[::1]:3000
Use Ctrl-C to stop
```
[http://localhost:3000/](http://localhost:3000/)にアクセス。
↓の画面が表示されればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1233166/b62b50ae-d58d-b003-fa65-480967691f81.png)

# 6. GitHubにpushする
GitHubで新規リポジトリを作成しておく。
```
$ git init
$ git add .
$ git commit -m "initial commit"
$ git remote add origin https://github.com/username/rails-tutorial.git
$ git push -u origin master
```
おしまい！
SourceMapとは

# SourceMap

-  前提知識
    - ブラウザが実行するjavascritpソースなどは、元の開発者のソースと違い、コンパイルにより変換されていることがある
    
    - 開発者が効率よくサーバーからクライアントにファイルを送信するために、minify(ファイルを小さくすること)を行う


## SourceMapファイルとは
- コンパイル前とコンパイル後の対応関係を示したファイル

- json形式で記述されている

### なぜSourceMapが必要なのか
- コンパイル後のファイルは見づらく、デバッグがしずらい
- SourceMapを使用することで、ブラウザがコンパイル前のファイルをデバッガーに提供する
Githubでデータ共有　その１　Githubユーザー登録編

# はじめに
今まで開発経験のない人たちと、もともとGithub(privateリポジトリ)にあるデータを共有したいという事案が発生し、その人達に向けてセットアップのガイドとして作った手順書です。

* その１ Giｔhubユーザー登録編
* その２ Accept編
* その３ Github Desktop編からなります。

から構成されています。

# 登録手順

次のリンクからブラウザを立ち上げます。

https://github.co.jp/

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/86172ba2-c706-3337-43d2-74b61ada50d1.png' width=600>

上の画面から「Githubに登録する」をクリック

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/b205e515-0d9c-43d3-c750-5583b7c1a611.png' width=600>

Username, Email address, Passwordを順に入力し、また、Emailのお知らせを受け取るかも答えます。
すると、下の画面になるので、「検証する」をクリックします。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/eefb2695-5d78-003a-fdbb-bfb099715689.png' width=600>

下のような画面で「渦巻き銀河」を二度選んで下さい。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/2c80370b-497f-3e7d-5381-7aea937cf0a5.png' width=600>

次の画面になるので、「Create account」をクリック

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/06876dd7-8ceb-0cdd-3556-8e06876c22ee.png' width=600>

下のような画面になります。メールが送られてくるはずなので、メールをチェックして下さい。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/bbe1c8f2-2742-f9e1-1803-d96fe6404970.png' width=600>

送られてくるメールはこんなやつです。一つ上の画面で、数字を一つ一つ入力します。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/f181d5fe-fea0-155f-cd56-5bb865056849.png' width=600>

次の画面になれば、無事ユーザー登録完了です。上で指定した「Username」をGithub管理者に伝えて、インビテーションメールが送られてくるのを待ちましょう。

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/2547c7d9-8d7c-c167-896a-5c56e4670116.png' width=600>

次のステップは、[Githubでデータ共有　その２　インビテーション編](https://qiita.com/makaishi2/items/301630c1ef968cf0cd56)です。
APIのAPI(サイト付き)を作った。PythonのBottleで。 


# 自己紹介
我の名はふわふわ羊。
ふわふわ～。
C#でゲームを作ったり、Pythonでサイトを作ったりしている野生の羊。

# さくっと本題。

http://apis.uvs.jp/
↑GUIサイト
http://apis.uvs.jp/index.py/API
↑APIエンドポイント

掲題の通り、APIのAPIを作った。
~~しかし、rapidapiがあるから、いらないんじゃないか？~~
とりあえず、世の中にはAPIがたくさんあるので、びびっと来たものだけをチョイスして登録してある。

これを登録すべき！というものがあれば、コメントもしくはメールを頂きたく。にんにん。

# 【これから】
GUIサイトについてだが、やはり視認性を良くすべきだ。
CSSやデザインを改善したい。
それと、もっと楽しく出来ないか！？
例えば「いいね」機能が出来たらみんなハッピーなんじゃないか！？
でも「いいね」を連投されたらどうするんだ！？
あああああ！！！！
ふわふわ～！！！！！

*サイトに皆さん書き込んでみてくださいね。

# 【所要時間】
全部込みこみで6時間くらいかかった。
やはりPythonのBottleは神だ。簡単。

# 【コスト】
ドメイン代とサーバー代、合計で年間4,000円行くかどうかといったところ。

# 【終わり】
皆様のご照覧に感謝
GASでGoogle Analyticsに別れを告げたかった

# Google Analyticsが重い
自サイトのPageSpeedInsightスコアの足を引っ張っているGoogleAnalyticsをなんとかして撲滅したかった
GoogleAnalyticsのgtag.js analytics.jsだけで50kbは余裕で越える+設定をいじるとgtag.jsが2つダウンロードされる状況も発生
こちらがどんなに頑張ってファイルサイズを小さくしても全部Googleに破壊される
さらにはいらない情報集めてきたりあまりにも!winwin
GA4に切り替えましょうで愛想が尽きた

# GAS
他のサービスも検討したがGASをデータベースとして扱うことを前々から考えていたのでそれをベースに作ることにした
私が気になっている情報は閲覧したページと言語とどこから飛んできたかの3つであとはエラー収集があれば事足りる

webアプリとして公開
クライアント側からsendBeaconのPOSTで欲しいデータを送る
受信したデータはスプレッドシートに流す
適当なパスワードをつけてスプレッドシートを外から引っ張り出せるようにすると便利

やることは至って普通なので特に問題はない

## 制限?
GASを叩ける回数制限の話
さっと調べたところdoPost,doGet等は90分/日
1PV==1sendBeacon当たり1秒処理するとしてざっくり月間10万PVまで耐えられる

## 実際
chromeとかだとcorsに引っかかってダメだった
Analyticsと比べると15%くらいしか拾えていなかった
ヘッダーの問題みたいなので諦めてAnalyticsに戻ります…
Google I/O 2022の動画まとめリスト作ったよ

# 初めに
Google I/O 2022が現地にて行われたわけなのですが、すごい量の動画はYoutube上に上がっておりまして、全部見れん＆どれを見ていいかパッとわからんので、まとめリスト作りました。

# リスト
https://docs.google.com/spreadsheets/d/1rqiiUR_q0u2jBnUFFFZ-ZJ1eqGRvUXDukJKrAoRRNNo/edit#gid=0

summaryと書いている動画は短くまとまっているものです。

# 使い方
社内で手分けして見て全部インプットする等、ご利用ください。
Pythonで競プロをするときに良く使うコードやtips

※ 日々更新中


# 標準入力を別のファイルにする。
vscodeでデバッグは通るし、そのまま提出もいける。
```python
#python hoge.py abc.txt

import sys
if (len(sys.argv) == 2):
    sys.stdin = open(sys.argv[1])
```

# 標準入力を受け取る
```python
# 文字列を受け取る
S = input()

# 数字を受け取る
N = int(input())

# 列をリストで受け取る
A = input().split()

# 列をリストの数字で受け取る
A = list(map(int, input().split()))

# N行をリストで受け取る
A = [input() for i in range(N)]

```

# 便利な数学系組み込み関数
```python
max(1, 3) # 3
min(1, 3) # 1
abs(-10)  # 10
```

# mathライブラリ
```python
import math

math.sqrt(9) # 3.0
```

# itertools
※ 順列(重複あり)の適当な名前が
```python
from itertools import product
from itertools import permutations
from itertools import combinations

product(list, repeat=2) # 順列(重複あり)
permutations(list, 2)   # 順列
combinations(list, 2)   # 組み合わせ
```

# collections
```python
# 初期値ありの辞書
from collections import defaultdict
d = defaultdict(lambda: 0)
print(d[1)) # 0
```

# 書式フォーマット

```python
# 詰める
print('left   : {:<10}'.format(100))   # "100       "
print('right  : {:0>10}'.format(100))  # "0000000100"

# X進数に変換
print(format(14, 'b')) # 1110
print(format(30, 'x')) # 1e

# 少数の5桁まで表示
"{:.5f}".format(5.234567) # 5.23456
```

# bit全探索

N個の要素を自由に選べるときに使用する。各アイテムは「選ぶ」か「選ばない」の二通なのでbitの0(選ばない)と1(選ぶ)で表現する。ループ数が2^Nで増加するため、要素数が25~30くらいまでが実行速度の観点から限界。

```python
N = 4
l = [1, 2, 3, 4]
for bit in range(2 ** N):
    items = []
    for i in range(0, N):
        if bit >> i & 1:
            items.append(l[i])
    print(items)
```

# 繰り返し二乗法、結果の余りなど

```python
# aのb乗
def pow(a, b):
    ans = 1
    while n:
        if b % 2:
            ans *= a
        a *= a
        b >>= 1
    return ans

# aのb乗をmで割った余り
def modpow(a, b, m):
    p, ans = a, 1
    for i in range(30):
        if b & (1 << i):
            ans *= p
            ans %= m
        p *= p
        p %= m
    return ans
```

# デバッグする

python3.7からは`breakpoint()`がビルトインとして追加され、これをコード上に置くだけで通過時点での対話を起動できる。主な操作は以下。

```python
# コードの中に以下を追加するとその時点での対話モードに進める。
breakpoint()

# breakpoint()を無効にする。

```


# tips
- 処理は関数で書いておく。
  - 競プロは変数名が適当なことが多いので同じ処理を書くときに変数名ミスが発生することを防止するため。
  - エッジケースが通らなかった場合などで、テストケースを乱数で作成し、非一致のケースを出力できたりする。

- indexは0から管理する
  - 配列などで添え字が1から始まる場合もあるが、統一しておくと楽。
PYTHON問題

１. Pythonの特徴に合うもの 
- Pythonの特徴は、可読性、生産性、汎用性が挙げられる
2.0（ゼロ）で割った時のエラー 
- ZeroDivisionError
3. 足し算、引き算、掛け算、割り算すること
- 四則演算
4. 変数名のルールで適切なもの
- 予約語は使えない
- 変数名の先頭には「_」（アンダースコア）、またはアルファベットが使える
- 変数名の２番目以降は、数字、アルファベット、アンダースコアが使える
5. 以下のように、一度代入した変数に別の値を代入することをなんと言います
price = 100
price = 200
- 再代入
6. 次の変数の型は何になりますか？
- name = "Taro"　- STR - 文字列
- age = 30　 - INT　－整数
- tax = 1.5 - FLOAT　－浮動小数点
7. 以下のリストを「_」（アンダースコア）で結合して
(実行結果⇨おはようございます_こんにちは_こんばんは)
```python
my_list = ["おはようございます", "こんにちは", "こんばんは"]
"_".join(my_list)

```
13. 値を変更してもmy_dictの値は変わらないように、以下の辞書をコピーしてyour_dictに代入して
```python
my_dict = {"デザート": "アイスクリーム", "朝ご飯": "おにぎり"}
your_dict=my_dict.copy()
print(your_dict)
{'デザート': 'アイスクリーム', '朝ご飯': 'おにぎり'}
```
formatメソッドを、Python3.6から使えるようになったf文字列（f-strings）を使って
```python
name = "Taro"
introduction = "こんにちは、私の名前は{}です".format(name)
###1
print(introduction)
こんにちは、私の名前はTaroです
###2
name = "Taro"
f_introduction = f"こんにちは、私の名前は{name}です"
f_introduction
こんにちは、私の名前はTaroです
```
【ABAP】汎用モジュール「CONVERSION_EXIT_COUNT_OUTPUT」の使い方

<h2>目次</h2>
１. CONVERSION_EXIT_COUNT_OUTPUT概要

２. 使い方
３.どういう時に書式変換が必要か



<h4>１. CONVERSION_EXIT_COUNT_OUTPUT概要</h4>

内部測定単位に対応する商用測定単位(3文字の外部測定単位)を取得する。

簡単にいうと、帳票を出力する際、テーブルに入っているままの単位（内部測定単位）では
分かりにくいため、私たちに馴染みのある商用測定単位に変換して出力するために用いる。
例：基本数量単位「PC」を「個」に変換



<h4>２. 使い方</h4>

サンプルコード

```

*-------------------------------------------------------------------
DATA: WK_SHORT_TXT TYPE C LENGTH 3.      "外部書式変換用変数定義

 CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
  EXPORTING
   INPUT                = <FS_sample>-MEINS  "変換したい項目
  LANGUAGE             = SY-LANGU
 IMPORTING
＊  LONG_TEXT            =
＊　OUTPUT               =
   SHORT_TEXT           = WK_SHORT_TXT　　”定義した変数
 EXCEPTIONS
   UNIT_NOT_FOUND       = 1
   OTHERS               = 2
                               .
IF SY-SUBRC <> 0.
＊　Implement suitable error handling here
ENDIF.
*-------------------------------------------------------------------

```

＜補足＞
・SHORT_TEXTの変数の型について
TYPE C LENGTH 3 の場合、日本語３文字までの商用測定単位に変換できる。


<h4>3. どういう時に書式変換が必要か</h4>
ドメインの中にルーチンがあった場合、書式変換を行う。
railsチュートリアルをなるべく嚙み砕く　1章

今まで何回かチュートリアルに挑みましたが全て挫折しました。
挫折した原因は

###### なんとなくの理解で進めてしまった。

これが原因でモチベーションの低下が始まり、挫折というルートを何回も辿っています
今回こそは全部やりきるために、自分なりに噛み砕いて理解し、
###### 人に説明できるようになったら進む
ことを意識してやりたいと思います

他の方のための記事にもなったらいいな、、
##### 解釈が間違っているところがあれば教えていただきたいです！！

# 第一章

環境構築ですね
私は　ubuntu on Windowsを使ってrailsの環境構築をしました

https://qiita.com/ksh-fthr/items/64a4e86c8bad08322c94

こちらの記事が私が環境構築したやり方と同じです

1.3まで飛ばします

### 1.3
ここで
cd やmkdirが出てきます。
主要なUnixのコマンドたちですね
cd は change directory　の頭文字をとったもので　ディレクトリを移る
mkdir は make directory の略であり　ディレクトリを新しく作る
といったものです

cd ~/environment

で　現在いるディレクトリの下の改装にある environment ディレクトリに移動するというコマンドになります。


### 1.3.3
#### MVC
MVCはrails のアーキテクチャパターンですね
models views controllers の3つに分かれています。

大雑把に説明します

## Model
モデルはデータベースとデータのやり取りを行います。つまりはデータベースにデータを渡したり、データベースからデータを持ってきたりですね。さらにはそのデータをコントローラー（C）に渡します
 
## View
ビューはWebブラウザに表示するHTMLを生成します。
コントローラーがモデルから受け取ったデータをビューに渡すことでHTMLが生成され足りますね

## Controller
クライアントから来たリクエストに応じて処理を行います。

後々出てくると思うのでとりあえずこんなもんにしておきましょう

### Git
GitはUdemyで良い講座があるのでそれを貼っておきます
結局はチームでのバージョン管理システムですね

https://www.udemy.com/course/intro_git/

ぜひやってみてください！

### Github
githubはソースコードを上げる場所ですね。先ほどの講座でも説明がされていると思います

あとはチュートリアルに沿って行けば大丈夫だと思います。第一章はそんなに説明することは無いですね。(gemやbundleなどは割愛しました)
【AWS CLI】S3基本操作

# まえがき
CLI経由でのS3操作を本稿にまとめていく。
高レベルコマンド(`aws s3`)とAPIレベルコマンド(`aws s3api`)の2種類あるので、それぞれで出来ることをまとめていく。

# 高レベルコマンド(`aws s3`)
できること
・バケット一覧表示
・バケット作成
・バケット削除
・オブジェクトのコピー
・オブジェクトの移動
・オブジェクトの削除

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-s3-commands.html

## バケット作成/削除
コマンド
```
aws s3 mb s3://bucket_name
aws s3 rb s3://bucket_name 　　　　　　　　　　　　　　　　　※オブジェクトが空の場合
aws s3 rb s3://bucket_name --force 　※オブジェクトが空でない場合
```
実行例
```
% aws s3 mb s3://20220514hogebucket
make_bucket: 20220514hogebucket

% aws s3 rb s3://20220514bucket
remove_bucket: 20220514bucket
```

## バケット一覧表示
コマンド
```
aws s3 ls
```
実行例
```
% aws s3 ls             
2022-05-14 14:51:03 20220514bucket
2022-05-14 15:01:55 20220514hogebucket
```

## オブジェクト一覧表示
コマンド
```
// バケット直下を表示
aws s3 ls <bucket_name>
// バケット内の特定フォルダ内を表示
aws s3 ls <bucket_name>/<folder_name>/
```
実行例
```
% aws s3 ls s3://20220514bucket
2021-06-15 21:01:44    1035581 java_001.jpg
2021-06-15 21:01:43     669753 java_002.jpg
2021-06-15 21:01:43     391073 java_003.jpg
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　PRE sampleDirectory/

% aws s3 ls s3://20220514bucket/sampleDirectory/
2021-06-15 21:01:43     360990 java_004.jpg
2021-06-15 21:01:44     521081 java_005.jpg
2021-06-15 21:01:44     363473 java_006.jpg
```

## オブジェクトのコピー
コマンド
```
aws s3 cp <source> <target> <options>
```
### 1. ローカルファイル → sample_bucket 
```
aws s3 cp ./hello.txt s3://sample_bucket
```
### 2. ローカルディレクトリ内の全てファイル → s3://sample_bucket
```
aws s3 cp ./sampleDirectory s3://sample_bucket
```
### 3. バケットA内の全オブジェクト → バケットBへコピー
```
aws s3 cp s3://bucket-A s3://bucket-B/
```
### 4. ストリーム → バケット
```
echo "hello world" | aws s3 cp - s3://bucket-name/filename.txt
```
### 5. ファイル → 標準出力
```
aws s3 cp s3://bucket-name/filename.txt -
```

## オブジェクトの移動
`aws s3 cp`の移動バージョンなので割愛。

## オブジェクトの削除
コマンド
```
aws s3 rm <target> <options>
```
### 1. オブジェクト削除
```
aws s3 rm s3://bucket-name/example/filename.txt
```
### 2. ディレクトリとディレクトリ内の全オブジェクト削除
```
aws s3 rm s3://bucket-name/sampleDirectory --recursive
```

## オブジェクトの同期
コマンド
```
aws s3 aync <source> <target>
```
### 1. バケットarticle-picture内にある全オブジェクトを、ローカルディレクトリにコピーする
```
aws s3 sync s3://picture ./sampleDirectory
```
実行例
```
% aws s3 sync s3://article-picture ./sampleDirectory 
download: s3://article-picture/bbb.txt to sampleDirectory/bbb.txt
download: s3://article-picture/xxx.txt to sampleDirectory/xxx.txt
download: s3://article-picture/aaa.txt to sampleDirectory/aaa.txt
download: s3://article-picture/hhh.txt to sampleDirectory/hhh.txt
```

## その他便利なオプション
### acl
・`s3 sync` と `s3 cp`で利用できるオプション
・コピーする時にファイルのアクセス権限を設定できる
・3つの権限を設定可能(private/public-read/public-read-write)
```
aws s3 sync . s3://my-bucket/path --acl public-read
```
### include/exclude
・`s3 cp`、`s3 mv`、`s3 sync`、`s3 rm`で利用できるオプション
・対象オブジェクトのフィルタリングをする。
```
// 拡張子「jpeg」「jpg」のみをコピーする。
$ aws s3 cp . s3://my-bucket/path --include "*.jpg" --include *.jpeg*
``` 

# APIレベルコマンド(`aws s3api`)

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-services-s3-apicommands.html
P2Pブラウザ「Beaker」のドキュメント(中級編)を和訳してみた


Beakerは、https://beakerbrowser.com/ にて公開されているHypercoreと呼ばれるピアツーピアのプロトコルを用いたブラウザです。このHypercoreと同様のものとしてIPFS(Interplanetary File System) https://ipfs.io/ があります。


![beaker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520265/e9822ead-8714-d664-9212-45691ba51819.png)


IPFSは、Brave Browserに組み込まれていてHypercoreと比較し知名度が高いと思われます。著者もIPFSの方を先に知っていました。会社勤めを辞めたおり、Hacker NewsにてこのBeakerを知り、IPFSと比較して日本語の記事がまるで検索されなかったので、暇つぶしも兼ねて https://beakerbrowser.com/ にて公開されている記事を和訳してみた次第です。

なお、
- 和訳は、[DeepL](https://www.deepl.com/) にて英語から日本語に訳し、日本語文章としておかしな部分が無いように調整した程度のものです。単語の統一性まで確認するほどの厳密な和訳作業はしていません。

- 以降の用いられる画像ファイルは、https://beakerbrowser.com/  にて公開されている画像ファイルと同一物です。

- 「[P2Pブラウザ「Beaker」のドキュメント(ようこそ、初級編)を和訳してみた](https://qiita.com/bitlonginthetooth/items/808fb830dcbe35a638c2)」の続きです。


# 中級編
## システムドライブ

Beakerは、あなたのプライベートな情報を保存するために、自動的に「システムドライブ」を作成します。その中には、保存したハイパードライブやブックマークなどが入っています。

ブラウザのメニューを開き、「My Private Drive」を選択すると、そのドライブを見つけることができます。

![browser-menu-system-drive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520265/674f5535-7a95-eac2-f156-bcc8c2ac58e5.png)


---
## フォルダーとの同期

Beakerの外部にあるファイルを使ってHyperdriveで作業したいことがあります。これはGitのような独自のソースコントロールを使っているときや、単にBeakerの外のエディターを使いたいときによくあることです。

この場合、「folder sync」が使えます。

### セットアップ：新しいドライブの設定
新しいハイパードライブを作成する際に、「From Folder」ボタンを押すと、同期するフォルダーを選択できます。これにより、そのフォルダーの内容でドライブが作成されます。


![folder-sync-create-drive.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520265/3b5c18f9-ec63-bc6c-e741-66b0c4290923.png)



### 設定：既存ドライブ
既存のドライブにフォルダー同期を追加するには、site-infoボタンをクリックし、ツールの下にある「Sync with local folder」を選択します。

![folder-sync-from-tools.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520265/669224fb-e6db-dc35-4730-311ff16d14bc.png)



### フォルダーとの同期

![folder-sync-button.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520265/18af2e57-cc4f-f1d9-1bfb-cf62bd48c15e.png)


フォルダシンクが設定されると、URLバーの右上にアイコンが表示されます。そのアイコンをクリックすると、フォルダーシンクのコントロールが表示されます。

![folder-sync-controls.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520265/e1fcc788-29e2-596e-2d4a-3e56e2c49438.png)


フォルダー同期のデフォルトの動作は、手動でフォルダーを同期することです。
![folder-sync-restore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520265/6b68821e-3747-7289-d4c3-d4355cf3c699.png)


削除マークがついたファイルの右側に、「restore」ボタンがあります。これをクリックすると、ハイパードライブからローカルフォルダーにファイルがコピーされます。

Skip items matching these rules" コントロールを展開することで、ファイルをスキップできます。このコントロールは ".gitignore" ファイルに似ており、グロブスター ("*") の使用をサポートしています。ファイルのスキップは、偶発的なインポート（.gitやnode_modulesフォルダーなど）を回避したり、beakerで作成したデータ（index.jsonマニフェストなど）を保持するのに有効です。

フォルダーを同期する準備ができたら、大きな青い「Sync」ボタンをクリックします。

### 自動同期

変更があったときに自動的にフォルダーを同期させたい場合は、「Autosync」のチェックボックスを切り替えてください。これにより、非選択のファイルを尊重しながら、フォルダーが同期されます。

自動同期はBeakerが動いている間だけ有効なので、Beakerを再起動したらまたオンにする必要があります。

自動同期に注意! git initやnpm installのようなはじめてフォルダーを生成するコマンドを実行する場合は、自動同期をオフにして、生成されるフォルダーの同期を無効にする必要があります。