OmniAICreator/Qiita-1.07M huggingface dataset:
Intel Mac 用 Debian をインストールしたUSBメディア作成

プチ成功体験が楽しくなって，Debianの起動ディスクも作ってみた。

# 目的

- debianをインストールしたUSBメディアを作る。
- 内蔵macOSのboot部分に手を入れずに起動できるようにする。

# 作業した環境

MacBook Pro 15 Mid 2014 w/ Big Sur 11.6.1
VMware Fusion Player 12.2.1
debian-live-11.1.0-amd64-gnome.iso
128G SDカードとカードリーダー

# 作業用のVMware環境を作成

- debian iso で起動するようにする。
- HDDは作成しない。
- **UEFI起動にする。**

# USBメディアにdebianをインストール

- 用意したVMware環境を起動する。
- USBメディアをゲストに認識させる。
- VMware上でUSBメディアにdebianをインストール。その時，パーティションおよびマウントポイントは以下のとおりとする。

```
sda      116.5G   
├─sda1   200M    fat32 # /boot/efi
└─sda2   116.3G  ext4  # /
```

（補足）debianインストーラーでは，普通にgrubがインストールされる。

# boot領域の修正

このまま終了し，rEFIndをインストールしてもいいが... 今回は以下の手順でやってみた。

インストーラーを終了し，ライブ環境に戻って，そのまま以下の作業を続ける。

ESP領域をマウント

```bash
mkdir efi
sudo mount /dev/sda1 efi
sudo mkdir -p efi/EFI/BOOT
```

EFI用のgrubを**ライブ環境に**取り入れて起動ファイルを作成しコピー

```bash
sudo apt install grub-efi-amd64-bin
grub-mkimage -d /usr/lib/grub/x86_64-efi/ -o BOOTx64.EFI -O x86_64-efi -p "" part_gpt part_msdos ntfs ntfscomp hfsplus fat ext2 normal chain boot configfile linux multiboot
sudo cp BOOTx64.EFI efi/EFI/BOOT/
sudo cp -r /usr/lib/grub/x86_64-efi efi/EFI/BOOT/
```

debianインストーラーが作成した起動ファイルもコピー

```bash
mkdir usb-debian
sudo mount /dev/sda2 usb-debian
sudo cp -R usb-debian/boot/grub/* efi/EFI/BOOT/
```

メディアをアンマウント

```bash
sudo umount efi
sudo umount usb-debian
```

カードリーダーのままUSBで起動成功。
SDカードでも起動できた。うれしい。

# おまけ

起動後に，私のmacでWifiドライバーを導入

```
sudo apt-get update -y
sudo apt-get install linux-headers-$(uname -r|sed 's,[^-]*-[^-]*-,,') broadcom-sta-dkms -y
sudo modprobe -r b44 b43 b43legacy ssb brcmsmac
sudo modprobe wl
```

USBテザリングでスマホのネットワーク使用

thanks to:
https://cpoint-lab.co.jp/article/202001/13627/
環境変数の設定方法【Rails】

# dotenv-railsをbundle install

```:Gemfile
gem 'dotenv-rails'
```


# .envファイルを作成し、環境変数を定義する

ルートディレクトリに自分で`.env`ファイルを作成し、環境変数を定義する。
以下の例ではPostgreSQLのパスワードとユーザー名を定義しています。

```:.env
POSTGRES_PASSWORD = [任意の文字列]
POSTGRES_USER = [任意の文字列]
```

# .gitgnoreに.envを追加

.gitgnoreに.envファイルを追加してすることによってGitHubに.envファイルをあげないように設定できます。

```:.gitgnore
...（コード省略）
/.env
```

# 環境変数が正しく定義されているか確認

`rails c`でコンソールを起動させて環境変数を確認することができます。


```:コンソール
[1] pry(main)> ENV['POSTGRES_PASSWORD']
=> "任意の文字列"
```

# 参考
[【Rails】 dotenv-railsを使って環境変数を管理しよう](https://pikawaka.com/rails/dotenv-rails)
WSL2 UbuntuでPlantUMLの環境構築

windows storeが使えない環境でUbuntu開発環境を立ててPrantUMLの環境を整えた時のメモ

# WSL2 Ubuntuの構築
自分で書いた記事を参考にして構築([記事リンク](https://qiita.com/shinka401/items/6599516f2c2803acb831))
ディストリビューションはUbuntu20.04を採用([ここからダウンロードした](http://cloud-images.ubuntu.com/focal/current/))

# ubuntuへのdockerのインストール
この記事の後半の通りにやっただけ、内容は理解してない([記事リンク](https://zenn.dev/sprout2000/articles/95b125e3359694))
dockerの自動起動はこの記事を参考([記事リンク](https://qiita.com/ko-zi/items/949d358163bbbad5a91e))

# Plant UMLサーバーの構築
この記事を参考([記事リンク](https://zenn.dev/k_o/articles/e2722b5942c7db))
軌道の時だけ

```bash:bash
docker run -d --restart always -p 8888:8080 plantuml/plantuml-server:jetty 
```

<br>
<br>
時間があるときに手順と理解した内容を全部まとめる
素数の螺旋を描いてみる

素数の螺旋といえば、ウラムの螺旋というのがありますが、素数の螺旋を3次元グラフで描いてみました。

![div-100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217329/0ad6f822-6be8-740a-d720-dc6e64311355.png)

#0. 螺旋を描いてみる

ひとまず、素数は赤、素数でなければ青で描いています。目印として、1と2は大きめのマークにしています。

最初のグラフは次のプログラムで1周を100等分で描いています。

```
# prime number spiral

import math
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sympy import isprime

fig = plt.figure(figsize = (8, 8))
ax = fig.add_subplot(1,1,1, projection='3d')

ax.set_xlabel("x", size = 14, color = "r")
ax.set_ylabel("y", size = 14, color = "r")
ax.set_zlabel("z", size = 14, color = "r")

ax.set_xticks([-1.0, -0.5, 0.0, 0.5, 1])
ax.set_yticks([-1.0, -0.5, 0.0, 0.5, 1])

pi2 = math.pi * 2

x = []
y = []
z = []
colors = []
sizes = []

div = 100

high = 0
for n in range(1,300):
  high += 10

  if n <= 2:
    size = 50
  else:
    size = 5

  if isprime(n):
    color = "red"
  else:
    color = "blue"

  x += [math.sin(pi2 * (n / div))]
  y += [math.cos(pi2 * (n / div))]
  z += [high]

  colors += [color]
  sizes += [size]

# plot
ax.scatter(x, y, z, s = sizes, c = colors)
plt.show()
```

#1. 10等分で描いてみる

分割数(div)を10にして描いてみました。

![div-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217329/e46ef69b-ad53-dd3f-dce6-80d9fc31d237.png)

1の縦軸は、素数だったり素数ぢゃなかったり。
2の縦軸は、2だけですね。まあ、偶数は2の倍数だからしょーがない。
3の縦軸は、素数だったり素数ぢゃななったり。
4の縦軸は、素数がないですね。4は2の倍数なのでしょーがないか。
5の縦軸は、5だけですね。
6の縦軸は、4と同じで素数がないですね。まあ、2や3の倍数ですからね。
7の縦軸は、そこそこ素数があったり、なかったり。
8の縦軸は、ない！
9も縦軸も、そこそこ素数があったり、なかったり。
10の縦軸も、ない！みなまで言うな。分かってるって。

#2. 6等分で描いてみる

分割数(div)を6にして描いてみました。
マークがギュウギュウなので、100までにしました。

![div-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217329/1f116133-6e17-1b81-59c8-533f08f932bc.png)

なんで6なのって？ 2 x 3 は 6だからです。テキトー。

なんか素数が仲良く集まってきた感じ。

1の縦軸と5の縦軸にほとんどの素数が集まってきています。
2の縦軸と3の縦軸なんて、2と3だけぢゃん。

あえて、式風にしてみると、だいたい 6n+1 と 6n+5 に集まりやすい？

#3. 3等分で描いてみる

分割数(div)を3にして描いてみました。

![div-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217329/321493f3-de1b-158e-75b6-21fa16f7bd57.png)

6等分でそれっぽく集まってきたので半分の3等分にしてみました。

1の縦軸と2の縦軸には素数が集まってきていますが、3の縦軸なんて3しかない。

もいちど、式風にしてみると、だいたい 3n + 1 と 3n + 2 に集まりやすい。

#4. 考察？

素数を螺旋で描いてみましたが、素数と円周率って相性が良かったりする？

ひょっとして、何か見つけちゃったかも？

え！みんな知ってった！！


#参考

https://ja.wikipedia.org/wiki/%E3%82%A6%E3%83%A9%E3%83%A0%E3%81%AE%E8%9E%BA%E6%97%8B
rapiにpyenv入れるときに詰まったはなし

# 目的
raspiにpyenv入れるの時間かかったので記録に残しておく

# 目次
1.必要なパッケージのインストール
2.gitからpyenvをクローン
3.Pyenv用にシェルの環境を構成
4.実際にpythonのバージョンを変える

# 手順
## 1.必要なパッケージのインストール
この手順の前にaptやosの更新したので省略

```:コピー用
sudo apt install -y git openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
```

## 2.gitからpyenvをクローン
正直readmeを読めば難なくインストールできます。
英語読めるひとはそっちが早いです。

```:コピー用
 git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

## 3.Pyenv用にシェルの環境を構成
`~/.profile`と`~/.bashrc`を編集します。

### `~/.profile`編集

この2行は`~/.profile`の前にあった方がいいっぽい

```:コピー用
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
```

![pyenv設定2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2412987/d55c17c3-650b-aeda-813b-0f06f450fd2f.jpeg)

これは最後の行に

```:コピー用
eval "$(pyenv init --path)"
```

![pyenv設定3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2412987/8dcfdbdc-bec8-0594-0491-d13adedfcb87.jpeg)

### `~/.bashrc`編集

`~/.bashrc`の最後の行に

```:コピー用
eval "$(pyenv init -)
```

![pyenv設定1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2412987/0862b6af-4dc5-d7b2-76a8-a6985cfac378.jpeg)

# 参考資料

https://qiita.com/hoshi621/items/c8b82ab42564256df884
macOSをMontereyに上げたらcargo buildで「linking with `cc` failed」となった

Mac初心者なので備忘録。

# 実行環境
macOS Monterey 12.1

# エラー概要
先日 macOS を[Monterey](https://www.apple.com/jp/macos/monterey)にアップデートしたのですが、それから `cargo build` 時に以下のようなエラーが出てビルドできなくなってしまいました。

```bash
error: linking with `cc` failed: exit status: 1
```

# 解決方法
どうもMontereyに上げたことでXcode Command Line Toolsが使えなくなったみたい。
以下のコマンドで入れ直します。

```bash
xcode-select --install
```

無事ビルドできるようになりました。
よかった。

macOSのメジャーバージョンを上げるときは毎回やったほうが良さそうですね。
勉強になりました。

## 参考
https://stackoverflow.com/questions/28124221/error-linking-with-cc-failed-exit-code-1
【react, validation】react-hook-formでvalidationを実装する

#概要
こんにちは！今日はreact-hook-formでvalidationを実装する方法について説明します。
これまでにreact-hook-formの基本的な使い方は説明したのですが、validationについて触れていなかったので説明したいと思います！

#具体的な実装
react-hook-formの基本的な実装については[この記事](https://qiita.com/ykkamm/items/58454d5687f887fe67d6)にまとめてあるので参考にしてみてください！

1. errorsの宣言
1. 実際にvalidationを記述
1. errorsメッセージを出力


##1.errorの宣言
（例）

```typescript
const {
    register,
    handleSubmit,
    watch,
    formState: { errors },
  } = useForm<ValuesType>({
    mode: 'onSubmit',
    reValidateMode: 'onChange',
  })
```

このようにしてregister, handleSubmit, watchと一緒に```formstate: {errors}```として```errors```を宣言してください。formstateの中で宣言しないとエラーになってしまうので注意してください。（古いバージョンの人はエラーにならないかも、、）

##2.実際にvalidaionを記述
（例）

```react
<input
              placeholder="姓"
              type="text"
              defaultValue="あ"
              {...register('user.last_name', {
                required: '必須項目です',
                maxLength: {
                  value: 19,
                  message: '19文字以内で入力してください',
                },
              })}
            />
```

重要なのはregisterの第２引数に当たる```{required :"必須項目です",....}```の部分です。
ここで実行したいvalidaionの種類とそのvalidationが満たされなかったときに表示するエラーメッセージを記述します。```required: '必須項目です'```とすると、そのinputに対応する値は必須項目になり、入力されていない状態でsubmitするとエラーが表示されるようになります。```maxLength: {value: 19, message: "19文字以内で入力してください"}```とすると19文字を超える文字の長さで値を入力するとエラーとなり,19文字以内で入力してくださいという文字がエラーメッセージとして表示されます。他にもvalidationの種類はたくさんあるので公式documentなどを参照して確認してみてください。

##3.errorメッセージを出力

```react
{errors.user?.last_name?.message}
```

このようにerrorsにエラーがある場合はメッセージが格納されているので表示できます。
ただエラーがない場合errors.user.last_nameの値がnilになってしまっているので?をつけて、nilの可能性もあることを伝えてあげる必要があるので注意してください。後は```<span className="error_message">{errors.user?.last_name?.message}</span>```などとしてCSSを適用させることもできます。

#余談
今回はreact-hook-formが用意したvalidationを利用する方法をお伝えしました！
次回は2つのフォームの値を両方使用したvalidation(苗字と名前合わせて30文字以内など)の実装方法について説明しようと思います！
NAS(synology DS420+)を買ったので出来る事を探ってみる


#購入した機器のSPEC

| 項目 | 内容 |
|:--------|:----------|
|機種| DiskStation DS420+     |
|CPU|Intel Celeron J4025 デュアルコア 2.0 GHz|
|mem|DDR4 2 GB|
|lan|2 x Gigabit|
|HDD/SSD|  4ドライブ (別売り) |
|対応RAID| Synology Hybrid RAID (SHR)、Basic、JBOD、<br>RAID 0、RAID 1、RAID 5、RAID 6、RAID 10|
|容量|搭載するドライブとRAID構成による(自分は4TB×4台をSHRで構成 約10TB)|
※LANが２個ある・・・GATEWAY作れるのかな？

#管理ツールのセットアップ
・ブラウザでアクセスしてDiskStationMangerをネット経由でインストール
  (インストール時は7.0だった)
・ファイルサーバ(SMB利用)
・アクセス権(標準ユーザは無効にして、管理ユーザと一般ユーザを追加)
・家の外からアクセスする系は全部なしで
これでファイル共有はできました。
まぁ、仕事のデータをバックアップ用なのでこれで十分ですが。

#パッケージセンター(ピックアップ)
【サーバ系】
・DHCPサーバ (IPアドレスの貸し出しとか、まぁ使わないかな )
・DNSサーバ ( 使う・・・？？ )
・exFAT (usbドライブとかで使われてるやつですね。読めるようになるのかな？)
・カレンダー (グループウェア替わり・・？)
・チャットサーバ ( チャットできるの？ )
・仮想サーバ
・音楽/動画サーバ

【開発系】
・ウェブサーバ(apache2.2と2.4)
・Gitサーバ
・DBサーバ(MariaDB)
・PHP (7系)
・cms(wordpress,Joomla)
・docker(

**・・・え？まじDocker？**
ならたいていのもの動きそうｗ

中小企業ならいくつかセットアップするだけで社内の情報管理できるくらいのツール入ってるみたいだし、
足りなかったら自分で作ればよい環境もあると・・・。
便利だねー。当面バックアップしかしないけど。
[Android]Applicationクラスとは何か？

##この記事は
質問箱でも、聞かれたことのある

「Applicationクラスってなんですか？」

に対する回答を記事にまとめてみます。
##Applicationクラスとは？
まず、Applicationクラスを「全体」のことと捉えてください。
そうすると、イメージがつくかなと思います。

実際の動きとしては、Androidアプリが起動した時に最初にインスタンス化されるクラスです。

このクラスでは、アプリ全体で用いる設定をこのクラスで行います。
例えば、RoomなどのローカルDBの呼び出しやHiltのトリガーなどなど。

ちなみに、不要であればApplicationを継承したクラスをわざわざ作らなくても大丈夫です。



##まとめ
Applicationクラス is 全体.
##参考
https://guides.codepath.com/android/Understanding-the-Android-Application-Class
MongoDB を docker-compose を使って構築してみる。さらに MongoDB Compass を使って、GUI化する。

## 環境

MacOS 12.0.1
Docker Engine v20.10.11

## 前提

安心してください。特に用意するものありません。

## Composeファイル

dockerhubにあるmongoのイメージを使ってやっていきたいと思います。

```yml:docker-compose.yml
version: '3'

services:

  mongodb:
    container_name: "mongodb"
    hostname: mongodb
    image: mongo
    restart: always
    ports:
      - 27017:27017
    volumes:
      - ./db:/data/db
      - ./configdb:/data/configdb
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: password
```

今回は、mongoのデフォルトポートの27017ポートを使用する。なので、コンテナ側の27017ポートをホスト側の27017に割り当てた。
また、データベースのデータはコンテナの*/data/*以下に格納されるので、ボリュームして、データが残るようにした。

## いざ実行

先ほどのcomposeファイルのあるディレクトリで以下のコマンドを実行する。

```bash:コマンド
  # ↓起動のコマンド
$ docker-compose up -d
  # ↓コンテナのbashを立ち上げるコマンド
$ docker-compose exec mongodb bash
  # ↓コンテナを停止させるコマンド
$ docker-compose down
```

`docker-compose ps`コマンドでコンテナが起動していることを確認できる。

```bash:確認
$ docker-compose ps
NAME                COMMAND                  SERVICE             STATUS              PORTS
mongodb             "docker-entrypoint.s…"   mongodb             running             0.0.0.0:27017->27017/tcp
```

mongoは立ち上がった瞬間mongodが実行されるので、何かする必要はありません。
気になる人は[dockerイメージ](https://github.com/docker-library/mongo)をぜひ実際に覗いてみてください。わかると思います。

## MongoDBをGUI化して

MongoDB Compassを使ってデータベースをGUI化して、データの表示や操作をできるようにします。
mongo-expressでweb上で同じようなことができるらしいのですが、なんかうまくいかなかった。ってことでMongoDB Compass、やっていきます。
ちなみに超簡単です。
まず、Compass入ってない人は[このリンク](https://www.mongodb.com/try/download/compass)からダウンロードしてください。
立ち上げると次の画面が出てくると思います。

![mongodbcompass.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1868844/7b26fbc0-b757-b488-93db-ced4ac83c313.png)


Paste your connection string (SRV or Standard )と書いてある場所に以下のconnection stringを入力すると、もうGUIでデータの表示や操作が可能となります。

```
mongodb://root:password@localhost:27017
```

ちなみにフォーマットは`mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]`というようになっています。（[公式ドキュメントの説明](https://docs.mongodb.com/manual/reference/connection-string/)）

## さいごに

今後のことも考えて、docker-composeでMongoDBを構築しようと考えました。この先は好きなようにしてください。
ちなみにデータベースいじるのは、`docker-compose exec`コマンドでコンテナに入り、`mongo`コマンドでシェルを起動して、イジイジできます。
RubyMineを使い続けている理由

## はじめに

[この記事はiCARE Dev Advent Calendar 2021(レーン2)の20日目の記事です。](https://qiita.com/advent-calendar/2021/icaredev)

弊社のサービス(Carely)ではサーバサイドの開発言語でRuby On Railsを使っています。
そこで私自身がRubyMineというIDEを使用しているのでRubyMineを使っている理由を記載したいと思います。

## 使い始めた理由
そもそも使い始めた理由ですが前前職で周りのエンジニアが使っておりオススメされたからです。
その時は会社でライセンスを購入してくれたというのも使うきっかけになりました。

## 使い続けている理由
前前職で使い始めて現在も使い続けている理由は以下の点で優秀だからです。

### 1. コードジャンプが強力
これは社内でRubyMineを使っている方に聞いた結果、まず最初に返ってきた理由です。自分もそうです、むしろこれだけにお金出しても良いレベルです。

コードジャンプが強力な点は**gemのソースまで追っていける(rubyのコードも追える)**ところです。

ショートカットキー(Mac)は
 `⌘ + B` でコードジャンプ
 `⌘ + option + ←` で戻る、です。

[RubyMine コードジャンプ動画]
<iframe width="560" height="315" src="https://www.youtube.com/embed/6hx9qdmVISs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## 2.break pointを設定してのdebugが便利
RubyMineでできるdebugでは以下のメリットがあります。

- debug用コードなど埋め込まなくても大丈夫
- パラメータなどが簡単に確認できる
- gemのコードをdebugできる

ショートカットキー(Mac)は

- `F8` でStep Over
- `F7` でStep In
- `option + Shift + F7` で強制Step In
- `⌘ + option + R` で次のbreak pointまで実行

などがあります。

以下は実際に操作している動画なのですが**「デバッグツールウィンドウ」**でparameterの確認はできるのですが、sample1の動画のようにコンソール画面で実際に値を見たい変数を入力すると表示することができます。

[デバッグツールウィンドウのsample]
![デバッグツールウィンドウ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67654/3f6df33a-f177-52d9-6a27-50324b6b4ef0.png)

[RubyMine Debug 動画 sample1]
<iframe width="560" height="315" src="https://www.youtube.com/embed/g3IpqEcl84I" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



またsample2の動画のようにgemのmethodへコードジャンプしてbreak pointを設置しgem内をdebugすることもできます。

[RubyMine Debug 動画 sample2]
<iframe width="560" height="315" src="https://www.youtube.com/embed/kVcuxYsbsoU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

そのほかにも色々便利機能はあるのですが個人的に地味に便利なのはI18nの部分で翻訳 ⇆ コードの切り替えができることです。

ショートカットキー(Mac)は

- `⌘ + マイナス` で翻訳表示
- `⌘ + プラス` でコード表示

[RubyMine I18n 翻訳、コード切替　動画]
<iframe width="560" height="315" src="https://www.youtube.com/embed/JDCdqlcmQBc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



## 最後に

ほかにもDB Client機能、GitHubとの連携機能、便利なPluginなどあるので機会があれば紹介したいと思います！

明日は[いっせいさん]([https://qiita.com/issei126](https://qiita.com/issei126))の「マネージャーとして意識した、たったひとつのこと」です！
【GAS】デバックが正常に表示されない時に設定すること

## はじめに
GAS（Google Apps Script）を利用して何かを実装している時、`console.log()`や`Logger.log()`を用いてデバックする時がありますが、稀に、GASの　ログに何も表示されない時があります（スクリプト自体の実行はしているのに）
そんな時はGCPにプロジェクトを作成し、そちらと連携することで、GCPの方でログを見ると表示される解決策があります。

## ログを表示したいGASプロジェクトの設定タブを開く
![スクリーンショット 2021-12-20 21.54.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/3c42f450-6609-625d-9a19-f1d9a0f0c18e.png)

### ①[GCP](https://console.cloud.google.com/home/)プロジェクトを作成する

### ②新しいプロジェクトを作成する
![スクリーンショット 2021-12-20 21.56.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/e8c3efcc-61aa-b185-e60f-055077586dc2.png)

### ③プロジェクト番号をメモする
![スクリーンショット 2021-12-20 21.57.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/ad52ad01-08c7-1a3a-626f-99ce0e49abeb.png)

### ④OAuth管理画面タブに移動し、こちらを登録する
![スクリーンショット 2021-12-20 21.58.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/7b327193-9fd1-802e-35ba-ea61fe2e8ba7.png)

### ⑤GASにプロジェクト番号を登録する

![スクリーンショット 2021-12-20 22.00.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/4043e379-cb42-6e23-8302-7c5710476425.png)

### ⑥GASでスクリプトを走らせる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/0cbeee5d-a439-fd3b-6b3b-2479e976ae47.png)

### ⑦GCPのページでログを確認する

![スクリーンショット 2021-12-20 22.02.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488939/31cdbb0f-033d-8304-d69f-e460a5544119.png)

無事ログが確認できました〜
ログの項目を「Apps Script関数」にすると良いようです。

※説明ないに表示されているサンプルプロジェクトはすでに削除済みです。

### 良いGASライフを〜

### 【追記】参考になりそうな別記事
https://qiita.com/menasuba/items/b4ba692586213fbcb6e3
PySpark: LightGBM on Sparkを使ってみる

## SynapseMLとは
Spark上で大規模データセットを用いた機械学習を効率よく行うために設計されたライブラリ。
Microsoftによって公開されており、最近MMLSparkからSynapseMLに名前が変わった。

https://github.com/microsoft/SynapseML

SynapseMLを使うことでSpark上でLightGBMの使用が可能になり、
HiggsデータセットにおいてはSparkMLより10-30%高速で、AUCは15%向上することが検証されている。

## SynapseMLをDatabricksにインストールする方法
1. Library Sourceとして「Maven」を選択
1. Coordinatesに「com.microsoft.azure:synapseml_2.12:0.9.4」を入力
1. Repositoryに「https://mmlspark.azureedge.net/maven」 を入力
1. 「Install」ボタンを押下

![gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475806/b2d5977d-53d6-1a36-ad97-6cbf7f5d6ead.gif)

##Sample Code
```python:
# 学習・検証データに分割
train, test = df.randomSplit([0.85, 0.15], seed=1)

# モデルの構築
from synapse.ml.lightgbm import LightGBMClassifier

params = {
  'numIterations': 200,
  'learningRate': .2,
  'maxDepth': 7,
  'lambdaL2': 1.,
  'numLeaves': 31
}
model = LightGBMClassifier(featuresCol="features", labelCol="target", **params)

# モデルの学習
model = model.fit(train)

# 予測
predictions = model.transform(test)
```
困ったときの心得、質問する前に

# 背景

社内での質問に答えていた時に良く感じることをまとめておくことで
後輩や、新人教育時に、脳内Index構築用に見せられるといいな、と

Qiita の Q&A でもたまに感じることもあったり・・。
Q&A テンプレートは、[ソラ、アメ、カサ](https://qiita.com/baku2san/items/19e7392e77e225d7f655#%E4%BA%8B%E5%AE%9F%E3%81%AF%E4%B8%80%E3%81%A4%E8%A7%A3%E9%87%88%E3%81%AF%E7%84%A1%E9%99%90%E3%82%BD%E3%83%A9%E3%82%A2%E3%83%A1%E3%82%AB%E3%82%B5%E4%BA%8B%E5%AE%9F%E8%A7%A3%E9%87%88%E5%88%A4%E6%96%AD%E6%89%93%E3%81%A1%E6%89%8B%E3%82%92%E3%82%BB%E3%83%83%E3%83%88%E3%81%A7) を意識する良いツールだと思うんですけどね。

# 困ったときは

自身の勘に従って、対処法の引き出しから色々試す。

「勘」は、経験に基づいた瞬間的な脳からの解法の提示、だと考えています。
あとからその分析をし論理補完・構築をしていくことで、精度を上げられるんじゃないかな、と

故に、**回答を得られたら**、それが教えてもらったことでも、**自身でまとめておく**ことがとても重要だと思います。
Input をすることよりも、Output が大切、と。


で、そのための引き出し

## 公式 Documents を見直す
当たり前ですが、一番正しい可能性が高い資料です。

ただ、当然これらにも間違いが潜んでいることはあるかも？という視点は必要。
だって人間なんですもの

Code Firstだったり、Java Doc だったり、が進んで冗長性の排除が進んでも人が介在すると厳しいんでしょうねぇ

## ソースがあるなら、コード確認
使い方だったり、機能認識の勘違いがあったりします。

コードの勉強になったりもするので、何も関係がない時でも他人のソースを眺めて見るのもいいですよね。
たまに、他人のコードを見ていて、自身のコードのバグに気付いたり :laughing: 

## 問題を簡素化する
複雑な状態のまま「何故か動作がおかしいんです」って言われても、よくある間違いか、天才じゃないと分かりません。

慣れてくると、ああ、これでしょ？とかよくある話ではあるんですが・・

とはいえ、やっぱり原因の切り分けを頑張ってしましょう。

仮説検証をする為にも、仮説を単純化することはとても大切

## 検索する
誰かが考えたアイディアはすでに世の中にあるのと同じように
誰かが躓いた出来事は、既に他の人が経験している。
運が良ければ、公開してくれてる記事やＱ＆Ａがどっかにある。

検索キーワードがこういう場合は大切になってくるので、検索技術を上げられるといいですね。
とはいえ、Google の MUM で検索など、今は単語、というより文章検索が主力になってきてるので、検索方法のパラダイムシフトについていくのもまた大変かも :laughing: 

そうそう、検索の際、日本語で検索して諦めず、必ず英語でも検索してみましょう。
英語圏の情報量の方が圧倒的ですので、最初から英語でって道も。
その為には、各種ツールも英語環境で使うようにすると、検索キーワードも英語で探せて便利だったりします。
日々検索していると、英語単語の語彙力も増えるし、英語圏での検索能力もあがるので、一石二鳥！

# 他ごとをする
解決の為には

1. 集中して取り組む
1. 時間をおいて、脳が勝手に働くのを待つ　→　閃き

という Cycle も意外に重要だったりします。

個人的には、以下がお勧め

- 家ならシャワー
- トイレ休憩に行って、お茶を飲む。すると、一時間後ぐらいにはまたトイレに行きたくなるので無限ループで閃きタイミングがやってきます。しかも、喉を常に潤す事によって、風邪予防にもなるそうです（お医者さん談） :laughing: 

## デバッグが可能なら、当然デバッグで該当箇所の原因を調査
再現性が高いなら、これで簡単に終わる筈。

時間あるときに IDE のデバッグ機能を一通り試しておくのはお勧め

Visual Studio で感動した機能は、

- ウォッチウィンドウで、LINQ がかける
- 条件付きブレイクポイント

# 再現性を上げる。条件を明確にする

再現性が低い場合、デバッグも難しくなりますよね。
だからこそ、問題を簡素化するなり、特定の条件を見つけて再現性をあげていくことで、デバッグをしやすくして解決に導こうということ

こういう場合に Log はとても大切なので、Information Level から Verbose に引き上げて様子を見る、などの手も必要ですね。


よくある問題であれば、対処フローを用意してチャットボットで提供できれば、ユーザー自身に解決までしてもらえて便利なんで、学習時間確保の為にも、自動化はしたいところ・・。Q&A サイトから FAQ とチャットボット自動生成サービスを会社に入れたい・・。

# 有識者に相談する

日頃の人間関係がものを言います。
人脈なり、Twitter なり、[Stack Overflow](https://stackoverflow.com/) のような Q&A サイトなりで聞いてみる

但し、以下は必要かな、と。状況次第だと思いますが、以下をすることで、自身の力だけで解決すること意外にあります。その結果、自分で解決できた！という経験が、次からの自信に繋がって解決速度も上がってく感覚。

1. 最低限の調査
    - FAQ や 過去ログ、Documents など事前試行を記述しようとすると、抜けていることが見えてきてその再調査の過程で解決することはざらにあります。そうなったら、Q&A から 対処法として公開すれば記事の出来上がり、ですね :punch: 
1. 分かりやすい説明
    - 半年後の自分が読んでわかるか？を意識。
    - 箇条書きで、事実と、解釈、試行（判断）を分離する。「ソラ、アメ、カサ」ですね。[^ソラ、アメ、カサ]
    - キャプチャー画像を入れると、意外に勘違いに気付くことも。画像は事実であり、自身の解釈とのズレが明確化される。

[^ソラ、アメ、カサ]:「ソラ、アメ、カサ」：事実、解釈、判断を明確にし認識齟齬を無くす

https://mag.executive.itmedia.co.jp/executive/articles/1811/01/news012_2.html
技術者の穴を埋める、非技術者視点の業務についての話

この記事は [トラストバンク Advent Calendar 2021](https://qiita.com/advent-calendar/2021/trustbank) の23日目の記事です。

トラストバンク ふるさとチョイス事業部の新米QA担当のkotsutaです。
今日の記事は運用チームから異動してきた非技術者視点で内部のおはなしができればと思います。

##はじめに
私はQAとしては1年目なのですが、トラストバンクでは今年で6年目になります。
コンテンツ制作や運用ディレクターとして2年ほど、その後、運用側のユーザー窓口・問い合わせ担当として3年別部署に所属しておりました。

入社当時は会社の規模も小さく、組織という枠組みがなかったのでいろいろやってきた結果、

- 提供しているサービスの仕様把握
- 年々複雑になっていったいくつものサービスの運用方法
- 実際にサービスを利用しているユーザーが求めていることを理解していること

などが身についていたので、「動く仕様ホルダー」として買っていただき4月よりQAチームに参画いたしました。

##このポジションで日々なにをしているか
以下のようなことをやっています。

- リリース物の確認
1ヶ月周期で定期的に行われる大規模案件や、週次で行われる小規模な改修まで
QAのメイン業務として、各種案件の最終工程での確認を行います。


- 社内間の問い合わせの回答や中継
運用担当からの技術的なお問い合わせがあった際の二次対応として、開発宛に社内Slackに回ってきます。
仕様の問い合わせであったり、検証すればわかるものであれば自身で回答。
調査するにあたり先方側の情報が不完全なものであったり、開発側になにを求められているのかがわからないようなものは、内容を咀嚼して伝えたり、真ん中でお互いがボールを取りやすいように中継して投げかえすような仕事をしています。

- 仕様ホルダーとして開発前の各案件確認・進言
これは<b>QA業務を理想的な立ち位置に変える</b>ため、新しい仕組みとして作られました。


####そもそも、理想的なQAとは？
現在の[開発部の上司](https://qiita.com/yamaken66)にスカウトされてQAチームに入ったときに<b>「これからあるべき理想のQA」</b>の話を聞いたのですが、

:::note alert
<b>これまでのQA</b>
・多くの企業ではQAは立場上弱い存在
・決まってる仕様で開発がされて、最終段階での品質チェックだけをQAが行っている
・手元の仕様書が正義。運用側が本来望まない仕様であったとしてもそのまま通さざるを得ない
・海外の安い人件費でまわされてることもある

　　　　↓↓↓↓↓
結果、
・本来望まれてない状態のものが出来上がる
・あとから手直しが必要となるため見積もり工数が増える
・スキルが身につかないので日本人のQAの立場があやうい

誰も良い気持ちになれない…
:::
:::note
<b>これからのQA</b>
・QAはもっと上流工程から案件に携わる位置付けに
・要件定義段階で仕様に詳しいQAの目を入れる

　　　　↓↓↓↓↓
結果、
・下流の工程で発生する考慮漏れをなくすことができる
・無駄な開発をしなくて済む
・QAは仕様のスペシャリストなので会社で重宝される

みんなハッピー！
:::

実際に、海外の企業のQAはもうこのようなポジションに変わっているらしく、QA担当者の了承が降りないと案件が進められないとか。
同じように、日本のQAの人材価値を高めていきたい。それを今後はトラストバンクも行っていく！

といった内容のお話でした。

これを行うことにより

- 要件定義の段階で運用側としての意見をQAの立場から言えるため仕様を固めやすい
- 開発が始まってからの手戻りをなくすことでの開発工数削減
- 考慮漏れしたままリリースしてしまうことがないので、ユーザーへ迷惑をかけない
- 「考慮漏れしてた部分はフェーズ2で追って対応します」みたいな残念リリースとならない
- （あと、ついでに地位向上）

あー、これなら仕様知ってる自分にならできそう。自分だからやれそう。と、部署異動したことに対してすごく腑に落ちた。

とはいえ、QAメンバー全員が仕様を理解しているかというとそうでもないので、
これまで他部署で培ってきたいろいろな知識を他のメンバーにも仕様を落とし込むための勉強会も開催しています。

また、ほかにも今季のQAチームの取り組みとして、同じQA仲間の<b>[ryry_qa](https://qiita.com/ryry_qa)さんがテストの自動化を進められてる</b>のでこれと合わせてあたらしい編成として4月から進めてきました。

自動化して削れる工数は削減し、上流工程から仕様の漏れがないか人の目でしか見られないところに時間を割く。
この新しい運用は始まったばかりなので、より良い開発組織、より良いQAチームになるよう今後も努力していきます。


####今後やらないといけないこと

<b>QAとしての技量を上げよう！！</b>
「非技術者がなんたら」ってタイトルつけてますが、Qiitaに記事を上げてる時点で自分も<b>エンジニア</b>のくくりなんですよね。
仕様知ってるからと言ってもQAとしては1年目。テスト観点出しもチーム内で出してもらってから新しい気付きがあります。

幸いなことに当社のQAチームはいろんなことを学べる環境で、定期的にSQLの勉強会なども開いていただけているので、自身に足りないスキルをもっと吸収して精進していきたいと思います。
新時代を生きる子どもたちのために

### 自己紹介

半年ほど前、老後の楽しみにアプリ開発を始め、
「デバイスは文具」を目指して、子ども向けアプリを作っている。
人生初リリースは
<a href="https://kboyflutteruniv.com/" rel="nofollow noopener" target="_blank">Flutter大学</a>共同開発第五期の「はじめてのえにっき」。

https://play.google.com/store/apps/details?id=com.laporte.very_first_diary


https://apps.apple.com/app/id1592216614

つまり私はエンジニアママではない。
でも、このカレンダーはぜひとも投稿したいお題だったので
参加させてください。


### プログラミング教育が来るぞ

そもそも私がプログラミングを意識したのは、
必修化への政策論議がきっかけだった。
小中学校支援をしていた私は、この流れに反対だった。
そんなことが可能な現場じゃなかったからだ。
反対だけれど、必ず来る波だとも思った。
なら準備しなきゃならない。
得意な子どもには伸び伸び活躍できる環境を、
苦手な子どもにはしっかりした支援を、目ざさなきゃならない。

### さまざまなアプリをためして

私が最初に子どもたちと遊んだのは、SwiftのPlaygrounsシリーズだ。

https://apps.apple.com/jp/app/swift-playgrounds/id908519492

一見楽しげなゲームに見えて、実は本格的。
大人の教材としても十分に通用する。最初からがっつりコードも書く。
小学校高学年で興味のある子なら食いつく。
一番頑張ったのは不登校の中学生だった。

小学校低学年に人気だったのはBox IslandとDigital Puppet

https://apps.apple.com/jp/app/box-island-%E6%95%B0%E3%80%85%E3%81%AE%E5%8F%97%E8%B3%9E%E6%AD%B4%E3%81%AE%E3%81%82%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E4%BD%93%E9%A8%93%E3%82%B2%E3%83%BC%E3%83%A0/id979579439

https://apps.apple.com/jp/app/digital-puppet-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%91%E3%82%BA%E3%83%AB/id1083876164

コードは書かないけど、後半の演算はなかなか手応えがある。

Cozmoというロボットを走らせるプログラムを書くイベントも人気だった。

https://apps.apple.com/jp/app/cozmo/id1154282030

ただしロボットも買わなきゃならない。
でも、ディアゴスティーニのロビ2よりはぜんぜん安い。
今ではロボットを使ったプログラミング教室がいっぱいあるけれど、
当時はまだまだ珍しかった。

さまざまな言語に触れたければMimoがおすすめ。残念ながら英語のみ。

https://apps.apple.com/jp/app/mimo-learn-coding-programming/id1133960732

二進数や十六進数で遊ぶトライビットはともかく
演算子君たちが活躍するトライビットロジックは、
ちょっと抽象的すぎて敬遠されたかな。
シリーズいろいろあります。

https://apps.apple.com/jp/app/%E3%83%88%E3%83%A9%E3%82%A4%E3%83%93%E3%83%83%E3%83%88/id1151029355

### そして始まってみれば

実際に小学校でどんなプログラミングが行われているのか。
それはもう、ほんとうに千差万別だ。
あなたのお子さんがどこの小学校に行くか、
どんな方針の校長先生か、どの程度の知識を持った先生がいるか、
で、何もかも変わってしまう。
だからここでは、一般論は書かないことにする。

### 小学校に押し寄せるのは、プログラミングだけではない

実は、プログラミングそのものは、べつに大きな問題ではない。
好きな子には物足らないし、
苦手な子もガマンできる程度の時数でしかないからだ。
問題は「プログラミング教育」とか
ICT「Information and Communication Technology」教育とか
GIGA「global and innovation gateway for all」スクール構想とか
人をケムに巻くような錦の御旗とともに学校になだれてくる
「ともかくデバイスを使いましょうね」という日常だ。
アプリケーション不足、教員の経験不足というソフトな問題を度外視したまま、
コロナ禍に後押しされたハードの配布だけが先行した。
子どもたちのためにどんな未来を描くか、より前に、
一人一台が、否応なく実現してしまったのだ。

### 結局、一番、大切な、こと

この「ともかくデバイスを使いましょうね」な学校生活に
デバイスを自由に使いこなせる子どもと、そうでない子の格差ができる。
そこに熾烈ないじめが生まれ、ある悲劇が起きた。
いじめた側は、デバイスに対する知識は豊富だったが、
モラルを守るというリテラシーがなかった。
被害にあった子どもには、そもそもなぜ自分のデバイスに
自分が書いたわけでもない悪辣な言葉が並んでいるのか、
理解することもできないまま、混乱し、傷つき、
だれも彼女を支えることができなかった。
つまり、一人一台の雪崩に埋まった学校には、
正しく、有効にデバイスを使うという、
一番、大切な、基本的な教育が欠けていたのだ。

### デバイスは文具

携帯脳とか、子どもにタブレットを与えるな、とか、
現状に対する否定的な論調はまだまだ多い。
だがこれからの子どもたちは、否応なく
「ともかくデバイスを使いましょうね」な学校生活に晒される。
だったら、反対している暇はない。
新時代をどう生きていくか、子どもたちに知ってもらわなければならない。
デバイスはもはや特別なものではない。
ノートや鉛筆と同じ、文具になるのだ。
それをどう使いこなして、新しい学びの道具とするか、
それに相応しいアプリケーションはどんなものか、
今こそ大人たちは、真剣に考えなければいけない。

### おわりに

子ども向けアプリの企画開発について
flutter大学のアドベントカレンダーに記事を書いています。

https://qiita.com/dongri727/private/ff63be3911d767a998e3

よかったらそちらもご覧ください。
昔のボクに

## *〜それは未来への贈り物〜*

### 個人開発する若者たちに聞いてもらいたいお話

半年ほど前、老後の楽しみにアプリ開発を始め、
「タブレットは文具」を目指して、子ども向けアプリを作っている。
人生初リリースは
<a href="https://kboyflutteruniv.com/" rel="nofollow noopener" target="_blank">Flutter大学</a>共同開発第五期の「はじめてのえにっき」。

https://play.google.com/store/apps/details?id=com.laporte.very_first_diary


https://apps.apple.com/app/id1592216614

そして今日は記事デビュー。
アドベントカレンダーの、しかもイブなので、贈り物の話を書きます。

### 二部構成です。
前半は11月24日<a href="https://kboyflutteruniv.com/" rel="nofollow noopener" target="_blank">Flutter大学</a>共同勉強会での発表をまとめています。
大学の有料会員であれば
大学アプリからvimeoで見ていただくことができます。
一言で言えば「子どもアプリをどう企画するか」という話です。
後半は「作ったアプリをどう届けるか」について書きました。
リリースはしたけどDLされない、
という悲しい現実に対する一つの提案です。

### 〜だれもがみんな、子どもだった〜

人生の大半を子どもたちに関わってきて思うのは、
子どもたちはみんな違うということ。
だからアプリを考えるときも、
「子ども一般」ではなく、「あの子」を具体的に考える。
一人一人思い浮かべながら、さまざまな企画を考えるのは楽しい。

アプリ市場は飽和状態、というけれども、
教育系アプリに限って言えば、圧倒的に足りていない。
公教育を支援する大掛かりなアプリはもちろん
現場の教員を支えるアプリも
子ども一人一人の個性を想定したアプリも
どれを取ってもまるっきり飽和などしていない。
いくら少子化でも、子どもは次々生まれ、育ってくるし、
我が子のタブレットに何をダウンロードしたらいいか迷っている
若い保護者も次々と現れるのだから、
需要が滞るということはない。
供給は足らないだけでなく、偏ってもいる。

教育系アプリは果てしないブルーオーシャン。
だからといって、入れ食いで一攫千金、と煽っているわけではない。
というのも、この分野にはいくつかの参入障壁があるからだ。
教育業界の構造的な問題だけでなく、
開発者側が先入観として持っている心理的障壁もある。
「自分は教育の専門家じゃないし」という躊躇だ。

でも、だれだって昔は子どもだったのだ。
だから「教育一般」としてじゃなく、
「あの頃の自分だったら、どんなアプリがほしいかな」
という発想で十分だ。
いや、むしろ、そのほうが大切だ。
大人が与えたいモノじゃなく、
子ども本人がほしいのはどんなアプリだろう。
子どもたちは声なき発注者。
その心に刺さる小さな体験を作りたい。

というわけで、私はこう思うのだ。
個人開発を志す全ての人が、
たった一本ずつでいい、
昔のアナタ自身に贈るアプリを作ったら、
子どもアプリ市場は今よりずっと豊かになり、
昔のアナタに似た今のダレカへの
素晴らしい贈り物になるだろうと。

### 〜人は物語を買う〜

アプリが製品であり商品（たとえ無料でも）である以上
そこには流通とか小売りとかいう側面があって然るべきだと思うけれども
リアルな物質ではなくデータである、という姿に囚われすぎて
とても変な事態になっている、と私は思う。

アプリを売る場所は全くの寡占状態だ。
「何か作ったんですか、素晴らしい、もちろん置いてあげますよ」
と表向きは優しい。
が、表示序列という先行者利益の障壁は、手の施しようもなく高い。
個人開発のアプリは砂浜に投げられた小石だ。
よっぽど大きいとか、キラキラ光るとか、
そうでもなければ、誰の目にもつかないまま終わることになる。

そんなもんだよ、仕方ないよ、と諦めていないだろうか。
勉強のために作ってみただけさ、とか、嘯いていないだろうか。

試しに、ごく普通の商品のことを考えてみよう。
「妻せつこ」という熊本県産のトマトがある。
農産物が農協に納品され、トマトはただトマトとして流通していた時代から
産直野菜が生まれ、さらに
生産者の写真がパッケージに印刷された「顔の見える」系が流行り、
今は「物語マーケティングの時代」と言われている。
人は商品そのものより、その背後の「物語」を買うのだ。
「妻せつこ」にまつわるどんな物語を人は思い描いて
そのトマトを選ぶのだろう。

そう思って見返せば、AppStoreにもストーリーというコーナーがあるではないか。
そこで取り上げられたら効果絶大だ。
だけど、取り上げてもらうのをただ待っていたって始まらない。

だから、自分たちで取り上げよう。
自分たちでストーリーを作ろう。
それは「こういう技術を使って、こんな工夫をしました」という
エンジニア仲間に向けた情報提供ではない。
こんな人に、こんなシーンで、こんなふうに使ってもらいたい
こんな笑顔の未来を思い描きながら作りました、と
ユーザーに語りかける物語だ。

### 個人開発者よ、連帯しよう

個々の開発者がてんでばらばらにやっても、効果は薄い。
だから、みんなで物語を持ち寄って、
セレクトショップ（展示だけ）作ったらいいんじゃないか。
見本市、でも、道の駅、でもいい。
そうか、LPカタログ、とかね。


へえ、アプリって、
こんな人たちが、こんなふうに思いながら作っているんだ、と
ユーザーに知ってもらおう。
もしかして、こんなアプリはありますか、みたいな
双方向のコミュニケーションもできたら素敵だ。

とりあえず私は、次のアプリを出したら
たった二冊の「こどもノート」を並べた文具店を
ネット上に開きたいと思っている。
でも、一緒にやるよ、といってくれる人がいたら
別に、文具専門店でなくていい。
おしゃれなセレクトショップを作ろうじゃない。

さあ、個人開発者よ、連帯しよう。
そしてせっかく作ったアプリを、ユーザーの手に届ける工夫をしよう。
Web Apps (java) への java コマンドラインオプションの指定方法

# はじめに
Azure の Web Apps には Apache Tomcat や JBoss EAP、 Spring Boot といった Java のランタイムスタックが用意されております。

Java でシステムを運用する場合、ヒープサイズのチューニングやシステムプロパティの指定といった用途で java のコマンドラインオプションを設定したいと思います。
そこで、本記事では App Service (Java) における java のコマンドラインオプションの設定方法と、一般に広まっていると思われるアンチパターンを解説します。


# アプリケーション設定で java コマンドラインオプションを指定
Java のランタイムスタックでは「構成」ブレードの「アプリケーション設定」タブで java コマンドラインオプションを指定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691192/ab4214db-d2c6-65fa-d67c-47cb6b70047d.png)

アプリケーション設定で、名前に「JAVA_OPTS」もしくは「CATALINA_OPTS」、値に java コマンドラインオプションを記述することで、java プロセスに値で記載したコマンドラインオプションを渡すことができます。
なお、Java SE スタック (Spring Boot に使います) では「JAVA_OPTS」、Tomcat スタックでは「CATALINA_OPTS」を名前に使うというすみ分けがあります。

実際に java コマンドラインオプションをアプリケーション設定から指定してみましょう。
例えば、Tomcat で最大ヒープサイズを 1 GB に指定し、Java Flight Recorder (JFR) を有効にしてみましょう。

下図では、ランタイムスタックは Tomcat なので名前は「CATALINA_OPTS」を使い、最大ヒープサイズ (-Xmx) を 1GB 、 Java Flight Recorder を -XX:StartFlightRecording にて有効にしております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691192/5698e3e7-5187-893b-5232-c5bd8321527a.png)

JFR データを採取し、JDK Mission Control の GC Configuration で GC 設定を見ると、最大ヒープサイズが 1 GB に無事設定されていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691192/aa28d9fa-7b99-881b-33a8-05469476decc.png)

また、「高度なツール」のコンソールから jcmd にて JFR の状況を取得すると、JFR データを採取できているので当然ですが、JFR のレコーディングがされていることも分かります。

```
PS C:\home> jcmd 1552 JFR.check
jcmd 1552 JFR.check
1552:
Recording 1: name=1 maxsize=250.0MB (running)
```

このようにアプリケーション設定から java コマンドラインオプションを指定することで、java のチューニングや便利機能の有効化を Web Apps で実施することができます。

# アンチパターン - web.config での java コマンドラインオプション指定
アプリケーション設定の他に、Windows の Web Apps (Java) では web.config を使って java コマンドラインオプションを指定できる、といった情報を見かけたことがあります。
web.config を使った java コマンドラインオプションの指定方法は、HTTP リクエストを java プロセスにフォワードする基盤側が用意したハンドラー (httpPlatformHandler) を、自分で定義した tomcat の起動スクリプトで上書きする方法です。

ただ、高度なツールのプロセスエクスプローラのスクリーンショットから分かる通り、Web Apps (Java) の java プロセスは JavaBootstrapper と呼ばれる基盤側が用意したプロセスから起動されています。
Tomcat 等の java プロセスの起動は Web Apps のプラットフォーム側が担当する箇所です。
プラットフォーム側が用意した起動処理を無視してまで web.config で java コマンドラインオプションを指定するのは、予期せぬトラブルを招く恐れもありますので、アプリケーション設定を使った方法に切り替えましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691192/bc634d05-5a35-c554-a37a-3d2af208d5d5.png)


# おわりに
本記事では App Service (Java) における java コマンドラインオプションの設定方法と、巷に広がっている web.config を使った方法の問題点を指摘しました。

本記事が皆さまのお役に立てれば幸いです。
リスペクトメッセージ施策でフルリモート環境でも心理的安全性を高めよう

こんにちは、エンジニア2号です。

こちらの記事は金属加工プラットフォームを開発・運用する[CatallaxyのCatallaxy Advent Calendar 2021](https://qiita.com/advent-calendar/2021/catallaxy)の第23日目の記事となります！

エンジニア界隈ではもっぱら心理的安全性を高める取り組みが注目を浴びています。
心理的安全性が高い職場だと生産性が上がりますし、何より仕事をしていて楽しいです。

![kids_koushin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345141/55d993b4-1bf1-19d2-50c8-b1b68485e01c.png)


そもそも心理的安全性とはなんでしょうか？

> 「心理的安全性」とは、他者からの反応に怯えたり、羞恥心を感じたりすることなく、自然体の自分をさらけ出すことができる状態を意味する。
https://www.hrpro.co.jp/series_detail.php?t_no=2122

時はコロナの時代。リモートワークも特別ではなくなりました。
業務中の会話はあれど、意識して取り組まないとたわいない雑談などもなくなってしまい他の社員との距離もどんどん離れてしまいます。
エンジニアの場合、ヘタをすると全く一切誰とも会話せずに一日が終わってしまうということもあるかもしれません。
そんな日が長く続くと自分が孤立しているような気持ちがしてきて、だんだんと自然体でいられなくなってきます。
こうなると組織全体の心理的安全性も下がっていってしまいます。

コロナの中、今までの飲み会や集まりといった多人数が参加するレクリエーションも難しい状況です。

オフィスに出勤することもなく、レクリエーションもできない今、組織のみなが自然体の自分をさらけ出せるような心理的安全性の高い環境にするはどうすればいいでしょうか？

![kinrou_flower_woman.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345141/7629124d-65b4-fd8d-c649-5fde5fb4c602.png)


私は、**誰かが見ていてくれる**という実感が一つの鍵なのではないかと考えています。

私は以前某テーマパークで働いていました。

そこではリスペクトカードという文化がありました。

それは約1ヶ月ほど特定の期間中に、日々の業務の中で素敵だなと思った誰かの行動に対してリスペクトメッセージを書いて送るという文化です。

テーマパークでは様々なことが起こります。

次にやらなければいけないことがあって時間が押している状態で、小さい子が迷子になって不安そうに佇んでいるのを見つけたり、またある時は、中国語、英語、日本語で同時に3人に質問されたり。

1日の業務が終わると事務所で疲れてぐったりとしている人もいます。

そんな時に「いつもどんなときでも笑顔をたやさずに対応していて素敵です」という言葉がもらえたらどうでしょうか？

自分が心がけている小さな頑張りをちゃんと見ている人がいる。ちゃんと褒めてくれる人がいる。

「パンクしそうだったときに、サッと手伝ってくれて本当に助かりました。ありがとうございます」。

感謝の言葉をもらうと、とても忙しかった日でもそれだけで心がウキウキしてくる気がします。

リスペクトカードが送られると、もらった人の始業のタイミングでメッセージが読み上げられて、リーダーからカードが手渡しされます。多い時には1日に何枚もカードをもらうこともあります。

実際に私もリスペクトカードをもらって本当に元気になりました。自分がやってきたことは間違っていなかったんだと報われた気持ちになりました。今でもそれらは大切に保管しています。

![itsumoarigatou_title2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345141/f0d03f51-0bc5-dc02-176f-f7312060939c.png)


やはり心を開いて自然体の自分をさらけ出せるようになるには、誰かがちゃんと自分のことを見ていてくれている、自分が認められているという感覚が重要なのではないでしょうか。

弊社Catallaxyにも**リスペクトメッセージ**という文化があります。

これは3ヶ月のクオーターごとに全社員がお互いに日頃の感謝の気持ちをリスペクトメッセージに込めて送り合うという文化です。

つい先日もリスペクトメッセージの交換が行われました。

そこにはエンジニアだけでなく他の部署の人たちもメッセージを書いてくれています。

会社という組織の中で、ただの歯車としてではなく一人の人間として認められているという実感は、何にも変えがたいものです。

そうやって認められているからこそ、自分の思ったことを素直に言える自然体になれるのだと思います。

心理的安全性を向上させるための取り組みはたくさんありますが、その中でもこういったリスペクトや感謝を伝え合うという施策はとても有効だと、この会社に入ってさらに確信を強めました。

会社だけでなく個人としてもこれは変わらないでしょう。

私は時に感謝を忘れてしまい当たり前だと思ってしまう悪い癖があります。

だから個人的にも「ありがとうカード」という単語帳を作っています。暗記するときに使う単語帳カードに日々ありがとうと思ったことを書いて、誕生日に毎年パートナーに渡すようにしています。

ありがとうを伝えることも、ありがとうと伝えられることも、同じくらい嬉しいものですね。

皆さんも何か心理的安全性を高める施策をやろうと思った時は、弊社のようなリスペクトメッセージの取り組みをやってみるのもいいかもしれません。

誰かから感謝されている実感というのが、この社会に生きる理由の一つかもしれませんね。
社内最優秀チームのメンバーが語る分散処理型のチームワークとは？ 

この記事は、[シアトルコンサルティング株式会社](https://qiita.com/advent-calendar/2021/seattleconsulting) Advent Calendar 2021の25日目の記事です。

こんにちは、シアトルコンサルティングの五百澤です。
この度、弊社 シアトルコンサルティング株式会社 でAdvent Calendarに参加することになりました。

TeamTech Move the WorldをMissionに掲げ、日々全力で業務に取り組んでおります！
少しでも興味を持って頂けたら下記のサイトを覗いてみてください！

コーポレートサイト
https://www.seattleconsulting.co.jp/
Wantedly
https://www.wantedly.com/companies/seattleconsulting
よろしくお願い致します！

##目次
[はじめに](#はじめに)
[チームを一言で表すならどんなチームですか？ ](##チームを一言で表すならどんなチームですか？ )
[チームではどのような目標を掲げていましたか？ ](##チームではどのような目標を掲げていましたか？ )
[役割設計はどのように行われましたか？ ](##役割設計はどのように行われましたか？ )
[タスク管理において工夫されていた点はありますか？ ](##タスク管理において工夫されていた点はありますか？ )
[さいごに ](#さいごに )

#はじめに 

今回は上期に社内最優秀チーム賞を受賞したチームの活動内容を「__分散処理型のチーム__」を
キーワードにご紹介します。この記事はチームで成果を出したい方、チームワークを高めたい方に
ぜひ読んで頂きたい内容です。 

 
##チームを一言で表すならどんなチームですか？ 

私たちのチームを一言で表すと「__分散処理型のチーム__」だと思います。
リーダーとは定期的に1on1を行っていましたが、チーム全員で集まるのは月に一度だけでした。
しかし、最適な役割設計(＝__分散__)を行い、各自がやるべきことを全うする(＝__処理__)ことでチームの目標を達成できました。 
 
トップダウン型のチームやアメーバ型のチームなど、チームの形には様々な考えや理想があると思いますが、私たちのチームのような「分散処理型のチーム」というのも成果を出すチームの一つの形だと思います。 

 
##チームではどのような目標を掲げていましたか？ 

私たちのチームはインフラエンジニアで構成されたチームであること、社内にインフラエンジニア向けの
学習資料が不足していることから「インフラエンジニア向けのWeb問題集作成」を通年の目標としました。 

 

上期は問題集の元となるインフラの基礎を解説した資料を1人2つ作成することを目標に活動していました。チームとして動き出してからも、定期的に目標の再確認を行ったり、途中で加入したメンバーには目標設定の背景を丁寧に説明していきました。
その結果、メンバー全員が目標を理解、共感しており、チーム内に目標が浸透していました。さらに目標達成に向けてメンバーが徹底して役割を全うしていたと思います。 

 

このようにチーム全員が同じ方向を向くことができたのは、目標への__理解・共感・浸透・徹底__の4つの要素を重要視したためだと思います。 

 

##役割設計はどのように行われましたか？ 

まずはじめにアウトプットとなる資料のコンテンツを検討するため、みんなでインフラに関するテーマを
出し合い、その中から各自がやりたいテーマ・挑戦したいテーマを挙手する形で決めていきました。 

こういった決め方をしたおかげで、自然と__主体性__が生まれたと思います。リーダーが各メンバーに役割を振る形もあったかと思いますが、この場合「やらされている」という感覚の中でタスクを進めてしまうことになりかねません。 そうではなく、主体的に取り組んでほしいというリーダーの想いからこういった形で決めたことで、結果的に全員が毎月期限内に担当タスクを終わらせてくれました。 

 

私たちのチームが分散処理型のチームとして機能できた要因として「__主体性を生む役割設計__」ができたことは非常に大きかったと思います。 

 

##タスク管理において工夫されていた点はありますか？ 

FBの機会を月に一度設けるようにしていました。資料の作成は各自で行なっていましたが、月に一度、
全員が集まるチーム会でお互いの資料についてのレビューを行いました。具体的には他のメンバーの資料を読んで、改善点をExcelに挙げていくという形です。 

このようなFBの仕組みがあったことで、チーム活動の最大の強みである「__みんなの頭で考える__」ということが可能になったと思います。自分では気づかないような問題点を他のメンバーに指摘してもらったり、
スキルのあるメンバーが技術的な部分をサポートすることで作成した資料の質を上げることが出来ました。 

 

分散処理型のチームといえど、各自が資料を作って終わりではチームでやっている意味がありません。
役割設計(＝分散)をして、各自が担当タスクを全うする(＝処理)。そしてFBのような仕組みで、
相互補完・相乗効果を生む。この流れを作れるかが「分散処理型のチーム」として機能するかのポイントになってくると思います。 

 

#さいごに 

この記事のキーワードである「分散処理型のチーム」はエンジニアらしいチームの捉え方で、
面白い考え方だなと思います。理想とするチームの形は人それぞれあると思いますが、この記事を読んで
自チームの参考にしようと思ってくれる方がいたら嬉しいです。 

 

最後までご覧頂きありがとうございました！
Blenderチャレンジ：星マークのボール

3DCGソフトウェアのBlenderを使って、お題のモデルを作成してみましょう。
やり方は一通りではないと思います。あなたは、どんな方法を考えますか？

## 問題

以下のようなオブジェクトを作ってください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/228ab794-7b0a-b732-8665-4f9144242f3b.jpeg" width="480">

[完成物をSketchfabで見る](https://skfb.ly/orXxP)

…
…
…

OK？

---

## 解答例

作成する手順です。macOSのキーを書いています。Windowsの場合は、`Option`を`Alt`に読み替えてください。

- `Shift + A`（追加メニュー）の「メッシュ」の「ICO球」を選びます。
  - 画面左下の詳細設定で、「細分化」を`3`にします。
- スムーズシェードをかけます。
- `[Tab]`で編集モードに入ります。
- 面選択モードにします。
- テンキーの`3`を押し（テンキーがない場合は、ビューメニューの「視点」の「右」を選び）、下図のように中心のすぐ下の三角を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/aaaf06be-ca29-cc85-c078-22e921d7dc70.png" width="300">

- `Shift + G`（類似選択メニュー）の「エリア」を選びます。
  - 画面左下の詳細設定で、「しきい値」を`0.001`にします。
- `M`（マージ）の「束ねる」を選びます。
- 下図のように2つの三角を選びます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/ab72d713-6d7f-8a0e-0ea0-8b14170a63a9.png" width="300">

- `Shift + G`（類似選択メニュー）の「エリア」を選びます。
- マテリアルを2つ作り、2つ目を黒にし、「割り当て」をします。
- サブディビジョンサーフェスモディファイアーを追加し、「シンプル」にし、「ビューポートのレベル数」を`2`にします。
- キャストモディファイアーを追加し、「係数」を`1`にします。
- 完成です。`[Tab]`でオブジェクトモードに戻り確認しましょう。

以上
WebWorker上でS3にファイルをアップロードするときに困ったグローバルオブジェクト

本稿は[Wano Group Advent Calendar 2021](https://qiita.com/advent-calendar/2021/wano-group) 用の記事となります。


# 経緯/書くこと
大きいサイズのファイルをWebブラウザからS3に上げるには、[マルチパートアップロード](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/mpuoverview.html)する
必要があります。
この時、ブラウザによってはUIスレッドをブロックするケースがあり、対策としてWeb Worker上でのファイル部分読み出しとマルチパートアップロードを試すケースがありました。  
事象自体はけっこう前なので状況が変わっている可能性もありますが、備忘録がてらそのときやったことをメモします。  
   

# web workerとは
[ウェブ ワーカーの基本](https://www.html5rocks.com/ja/tutorials/workers/basics/)
シングルスレッドなjavascriptの世界において、独立したスレッドを実現するものです。
  
aws sdk console 上で直接ファイルをuploadするときも、WebWorkerが使われているのが確認できます.  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85375/202c0a28-4aa1-3ca1-cc87-04236a1da13f.png)


# uploadするためのモジュールの構成

ブラウザから s3 multi part upload する方法自体の手順は、STSやaws-sdk-jsを使った場合だと

- 1. サーバーサイドで ``` aws sts ``` 系のモジュールで Upload用一時ロールを発行
- 2. フロントエンドで ``` aws-sdk/clients/s3 ``` などで
  - createMultipartUpload
  - localのfile object を ``` file.slice(rangeStart, end); ``` などで部分読み出ししつつ``` uploadPart ```
  - 全て終わったら ``` completeMultipartUpload ``` 

のようになります。
このへんは最近はsdkでも　``` S3.ManagedUpload ```とかでうまくやってくれるのかも?
本題は、これをどうweb worker版に落とし込むか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85375/9d5b1d02-d3e5-492c-530e-f0a33b72be25.png)

こうなりました。

  
ポイントとしては、

- postMessageをうまく使って Main Thread側のモジュールとWeb Worker側でイベント登録<->コールバックの関係性を作る
- file object自体はMain Thread側で読んだものが直接web worker側に渡せるのでそれを使う
です。  

綺麗にうまくいった!と思ったものの...
  
  

# Web Worker上にないグローバルオブジェクトがある  

ブラウザ版 aws-sdk-js はwindowオブジェクトへのアクセスやdocumentオブジェクトへのアクセスを行うようで、
実際に使うといろいろエラーが出てしまいました。

エラーメッセージに従って当時愚直に潰したものが下記です...


```typescript
import { DOMParser } from '@xmldom/xmldom';

// @ts-ignore
global["window"] = {};
global["window"].DOMParser = DOMParser;
global["DOMParser"] = DOMParser;

// @ts-ignore
global["document"] = {
  cookie: "",
  createElement: function() {
    // @ts-ignore
    let href = string || undefined;

    const elm: any = {
      set href(url: string) {
        const obj = new URL(url);
        elm.protocol = obj.protocol;
        elm.hostname = obj.hostname;
        elm.pathname = obj.pathname;
        elm.port = obj.port;
        elm.search = obj.search;
        elm.hash = obj.hash;
        elm.host = obj.host;
        href = url;
      },
      get href() {
        // @ts-ignore
        return href;
      },
      protocol: undefined,
      hostname: undefined,
      pathname: undefined,
      port: undefined,
      search: undefined,
      hash: undefined,
      host: undefined
    };

    return elm;
  }
};

```

(ignoreやらanyばかりでtsの意味がない点は本題じゃないので今回ご容赦)
Web Worker には windowオブジェクトやらdocumentオブジェクトやらがないそうなので、**aws-sdk-jsが使う最低限の仕様をグローバルに定義しています。**

唯一、``` DOMParser ``` というモジュールは下記のものが使えました。  

```bash
npm install --save @xmldom/xmldom @types/xmldom
```
［mpm_winnt:notice］502エラー Apache2.4 + Laravel6 + Windows サーバー

#はじめに
Windowsサーバーで、Apache + laravelの502エラーのときの対処方法についてまとめます

#環境
- Apache2.4
- Windows10
- laravel6
- PHP8.1

#502のエラーログ
以下のエラーログが`C:\Apache24\logs\error.log`ファイルで確認されていました。
windows環境では、「子プロセスの最大数は１」、この子プロセスでは、デフォルトで６４のスレッドを生成可能とのことだが、これだと足りないため、再起動している？という意味かと推測しました。
windowsとApacheの組み合わせ特有のもののようです。

```C:\Apache24\logs\error.log
#Webサーバは再起動処理を開始します。
[mpm_winnt:notice] [pid 1964:tid 760] AH00428: Parent: child process 2560 exited with status 3221225725 -- Restarting.

[mpm_winnt:notice] [pid 1964:tid 760] AH00455: Apache/2.4.51 (Win64) PHP/8.1.0 configured -- resuming normal operations

[mpm_winnt:notice] [pid 1964:tid 760] AH00456: Apache Lounge VS16 Server built: Oct  7 2021 16:27:02

[core:notice] [pid 1964:tid 760] AH00094: Command line: 'C:\\Apache24\\bin\\httpd.exe -d C:/Apache24'

Webサーバは再起動処理を開始します。
[mpm_winnt:notice] [pid 1964:tid 760] AH00418: Parent: Created child process 3460

Webサーバは起動処理を続行します。
[mpm_winnt:notice] [pid 3460:tid 712] AH00354: Child: Starting 64 worker threads.
```

http://itdoc.hitachi.co.jp/manuals/link/cosmi_v0870/APM1/EU412182.HTM

https://httpd.apache.org/docs/2.4/ja/mod/mpm_winnt.html

#対処法

まず、httpd.confを修正します。
`#Include conf/extra/httpd-mpm.conf`のシャープを外します

```conf:\Apache24\conf\httpd.conf
#Include conf/extra/httpd-mpm.conf
↓
Include conf/extra/httpd-mpm.conf
```

httpd-mpm.confが有効になったため、

```conf:conf/extra/httpd-mpm.conf
# WinNT MPM
# ThreadsPerChild: constant number of worker threads in the server process
# MaxConnectionsPerChild: maximum number of connections a server process serves
<IfModule mpm_winnt_module>
    ThreadsPerChild        150
    MaxConnectionsPerChild   0
</IfModule>

↓

< IfModule mpm_winnt_module >
ThreadsPerChild 150 #子プロセスのスレッド割り当数
MaxConnectionsPerChild 0 #0は無制限
AcceptFilter http none
AcceptFilter https none
EnableSendfile off
EnableMMAP off  
ThreadStackSize 8388608　　#子プロセスそれぞれに生成されるスレッド数=PHPのメモリー確保らしい

< /IfModule >
```
###EnableSendfile
EnableSendfileはクライアントにファイルの内容を送るとき、カーネルの sendfile サポートを使うかどうか。とあり、「運用上の問題を避けるためにこの機能を使用不可にした方が良い場合があります」と説明にはあります
###EnableMMAP
EnableMMAPは「配送中にファイルの内容を読み込む必要があるときに httpd がメモリマッピングを使うかどうか」とあり、「運用上の問題を避けるためにこの機能を使用不可にした方が良い場合があります」と説明にはあります。

https://httpd.apache.org/docs/2.4/ja/mod/mpm_common.html#threadsperchild

https://httpd.apache.org/docs/2.4/ja/mod/mpm_common.html#maxconnectionsperchild

https://httpd.apache.org/docs/2.4/ja/mod/core.html#acceptfilter

https://runebook.dev/ja/docs/apache_http_server/mod/core

https://runebook.dev/ja/docs/apache_http_server/mod/core#enablesendfile


ちなみに、Apache2.2の場合は「Win32DisableAcceptEx」を記載するとよいです。

```conf:conf/extra/httpd-mpm.conf
<IfModule mpm_winnt_module>
### 以下辺りをコメントアウト
#ThreadsPerChild XXX
#MaxRequestsPerChild XXX

###以下を追加
Win32DisableAcceptEx
</IfModule>
```
フロントエンドエンジニア1年目としてやったこと

## はじめに
初めまして、都内でフロントエンドエンジニアとして働くマンゴクです。
[UdonTech Advent Calendar 2021](https://qiita.com/advent-calendar/2021/udontech) の21日目になります。

本記事では1年目のフロントエンドエンジニアが技術的なキャッチアップをどのように行なってきたか書いて行きます。
2021年4月からエンジニアに転職し、最近ではチームメンバーからReactの実装力は一定水準に達したと評価をもらえる様になったので、少しでも参考になる情報を共有できたらと思います。

## 業務内容
まずは簡単に業務内容を紹介します。採用関連のプラットフォームを構築しており、ReactとTypescriptとでフロントエンド開発を行なっております。　　
具体的には、入社初期のバグ改修タスクから始まり、現在では新規プロジェクトのライブラリ選定から実装まで幅広く開発に携わっています。



## キャッチアップ方法
フロントエンドエンジニアとしての技術力を高めるために、下記の3つを上から順に取り組みました。
それぞれの項目を深ぼって見て行きます。

- エンジニアとして基本を固める
- Reactの構成概念を理解する
- Reactのベストプラクティスを理解する

### 1. エンジニアとしての基本を固める
まずはフロント・バック関係なく必要な普遍的なスキル向上に努めました。具体的にはコードの命名規則や読み易さなどです。現職では丁寧にレビューする文化
があり、入社初期は命名規則・可読性にかなり厳しく指摘を頂きました。(レビューコメントが80件を超える時もありました笑)

上記の背景からまずはエンジニアとしての基本を徹底的に固めようと考え、下記に取り組みました。

- レビューコメントを全てメモし次回以降必ず実践
- 書籍で知識を収集
    - リーダブルコード、リファクタリング等

どれもエンジニアとして当たり前のことですが、当たり前のことを徹底して行うという事は重要だなと感じています。

### 2. Reactの構成概念を理解する
次にReactを正しく使えるようにReactを構成する概念の理解を進めました。具体的には宣言型プログラミングや仮想DOM、差分検出処理などについてです。Reactはどんなコードでも実装はできてしまいますが、構成概念を理解することで読みやすくパフォーマンスの高いアウトプットを得られると思っています。

構成概念を学ぶ上で下記の文献や動画が役立ちました。

 - りあクト！ TypeScriptで始めるつらくないReact開発
    - Reactの思想を全体的に学べる
 - [差分検出処理(React公式)](https://ja.reactjs.org/docs/reconciliation.html)
    - React公式の差分検出処理解説
 - [Build your own React](https://pomb.us/build-your-own-react/)
    - Reactを自作して仮想DOM、差分検出処理、Fiberの理解を深められる
 - [A Cartoon Intro to Fiber - React Conf 2017](https://www.youtube.com/watch?v=ZCuYPiUIONs)
    - Fiberの仕組みに関して

これらの概念を知ることで次項目のベストプラクティスを理解するという点でも理解が進みやすくなったので結構重要なステップかと思います。

### 3. Reactのベストプラクティスを理解する
最後に質の高いコードを書くためにReactベストプラクティスの理解に努めました。具体的にはstate管理、コンポーネント分割、そしてパフォーマンス対策です。これらを理解する上で一番意識していることは、公式に近い情報に触れるという事です。
なのでFacebookでReactを開発するDanさんや,Danさんお墨付きのKCDという方の記事などを積極的にcheckする様にしています。

- [Danさんの個人ブログ](https://overreacted.io/)
    - Reactを作っている方のブログ
- [KCDの個人ブログ](https://kentcdodds.com/blog)
    - Reactの基本からベストプラクティスまで学べる一押しのブログ

これら以外にもReactのライブラリのGitHubを見るなども行なっています。


## 終わりに
フロントエンドエンジニアとして技術をキャッチアップする方法は様々だと思いますが、少しでも参考になれば幸いです。
Swift CoreMLによる機械学習モデルの作成

#Xcode標準機能で機械学習モデルの作成ができる！
XcodeにはCoreMLという機械学習モデルの利用や作成ができるフレームワークがあります。

#CoreMLとは
Appleが2017年に発表した機械学習モデルの利用の無料のフレームワーク。
モデルの作成にはCreateMLを使用する。
最新版のXcodeでは標準機能でついており、無料で使用することができる。
ただし公式の使用方法が記載されているドキュメントは英語のみ。
![スクリーンショット 2021-11-29 17.56.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261100/9e272ebf-879e-f904-0765-7594ac52d0a5.png)

#【目標】航空機(主にヘリコプター)を画像から自動的に機種を判別するAIモデルを作成
![スクリーンショット 2021-11-29 17.10.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261100/534d8f08-384b-3570-67bd-6265fd2187b5.png)


#モデル作成フロー
![スクリーンショット 2021-12-20 20.38.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261100/cf0cc0a2-a375-3b8e-3af6-3864959bdaa2.png)

#練習データとテストデータを用意する
![スクリーンショット 2021-12-20 20.40.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261100/7760760a-c863-b848-dbf4-8ca05586dd48.png)

・機種ごとにファイルを用意
・練習フォルダの中身とテストデータの中身はファイル名を必ず同一にする
・train用の画像は機種ごとに10枚ずつ、test用の画像は3枚ずつインプット

#CoreMLに実際に学習させる
![スクリーンショット 2021-12-20 20.41.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261100/6fb784e4-256b-7680-974d-7c2a73111173.png)

trainしてなんと数秒でモデルが出力された。（写真は計117枚入力）
![スクリーンショット 2021-12-20 20.45.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261100/2a78b39d-f498-b92d-fe72-9e3c1719c701.png)

#では実際に画像を与えて判別できるのか？

![スクリーンショット 2021-12-20 20.43.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261100/eac85b5a-5ab8-bdf3-7640-f18fa108fc0a.png)

###結果①
学習に使用していない新たなAS332の画像を与えたところ、見事に機種を的中させた。ただし、信頼率は61%とやや低い。
![スクリーンショット 2021-11-29 17.10.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261100/dfc92b30-891a-6919-60ce-fd6bedfdcfcd.png)


###結果②
次に、学習に使用していない新たなS76の画像を与えたところ、見事に機種を的中させた。さらに信頼率は99%とかなり高い。
![スクリーンショット 2021-11-29 17.42.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261100/e87d0125-c364-98a9-8d1f-aa14e2706cb6.png)



###結果③
次に固定翼であるC680の画像を与えたところ、なんと信頼率100%で的中させた。このモデルは飛行機とヘリコプターの判別は得意なようです。
![スクリーンショット 2021-12-20 20.50.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261100/167a3526-e80f-03b7-2cba-918e0bcd100c.png)

#検証
###モデルの正確性①
モデルのValidation Accuracy(検証正確性)がかなり低くなってしまったが、これはテストデータが少なかったためと考えられる。
![スクリーンショット 2021-12-20 20.51.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261100/41c1b60a-8c97-09ca-755d-09265d5b8f40.png)

###モデルの正確性②
分類ごとで見るとこのモデルはまだまだ未熟であることがわかった。
実用には全ての分類で80〜90%の正確性は欲しいところである。
![スクリーンショット 2021-11-29 19.26.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261100/e2ec16ab-36c2-ef90-f2bd-18c0aeac9773.png)

#モデルの応用
本モデルはiphoneアプリに組み込むことができます。アプリからカメラにアクセスして実際の実機や写真を撮影することで機種判別ができます。
![スクリーンショット 2021-12-20 20.54.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1261100/c4fd5b7f-4f3c-0869-0cc0-be56aad3826b.png)



#課題
###CoreML中身はブラックボックス
画像を与えれば勝手に学習して規則性を見出してくれますが、この規則性の見つけ方・計算方法がブラックボックスです。（公開したら真似されてしまうので当然ですが）アプリを開発するにあたってこのブラックボックスに依存していることが、未知のリスクを含んでいると感じました。