OmniAICreator/Qiita-1.07M huggingface dataset:
[自分メモ]docker-composeのVolumesを勘違いしていた

#概要
docker-compose.ymlからvolumesを削除したら、ローカルで書き換えた内容がファイルの変更がされなくなってしまいました。

```(変更前)docker-compose.yml
version: "3.8"
services:
  app:
    build: ./infra/php
    volumes:
      - ./backend:/work
  web:
    build: ./infra/nginx
    ports:
      - 80:80
    volumes:
      - ./backend:/work
      - ./infra/nginx/default.conf:/etc/nginx/conf.d/default.conf
    working_dir: /work
  db:
    build: ./infra/mysql
    volumes:
      - db-store:/var/lib/mysql

volumes:
  db-store:
```

↓

```(変更後)docker-compose.yml

version: "3.8"
services:
  app:
    build: 
      context: .
      dockerfile: ./infra/php/Dockerfile
  web:
    build: 
      context: .
      dockerfile: ./infra/nginx/Dockerfile
    ports:
      - 80:80
    working_dir: /work
  db:
    build: ./infra/mysql
    volumes:
      - db-store:/var/lib/mysql
volumes:
  db-store:

```

個々のDockerfileで

```
COPY /backend /work
```
をしているので、volumesは書かなくて良いと勘違いしていました。

volumesを書かないとホスト側の変更がマウントされずに変更されないことを理解できていなかったです。
【入門】ファイルを形態素解析して単語の数を数えてみよう！

# 概要
メモ帳日記を書いていて検索が面倒だったので、簡単な検索コマンドを作ってみた。
[こちら](https://gist.github.com/tashua314/61c5a29d73f2507a49d0658b8f2461a1)
（確定申告とか法人化や社会保険について調べていたはずなのに気付いたらこんな事していたのは内緒）

# 仕様
        >>> python count_morphologically_analyzed_words.py <dir_name> -d
           ディレクトリ内の全ファイルの出力単語をまとめて出力
        >>> python count_morphologically_analyzed_words.py <file_name>
           対象ファイルの出力単語をまとめて出力
## 例
### 対象文

    千葉県浦安市は7日、
    東京ディズニーシーで成人式を開催した。
    新型コロナウイルス対応の緊急事態宣言下で多くの自治体が式典開催をあきらめるなか、
    市は感染対策を徹底することで可能と判断。
    ミッキーやミニーの登場は舞台上だけだったが、
    ディズニーならではの音楽と一体となった式典で盛り上げた。

### 結果
    式典: 2
    ディズニーシー: 1
    新型: 1
    コロナ: 1
    ウイルス: 1
    事態: 1
    自治体: 1
    市: 1
    ミニー: 1
    舞台: 1
    音楽: 1
    一体: 1

# 加えて
これで検索して、「このキーワードが入ってた文なんだったけな」という時に、
下記スクリプトで追加検索する。

```search.sh
# bin/bash

<< DOC
入力文字が現れる文を検索

Examples:
  >>> ./search.sh ナッツ
    「ナッツ」が含まれる文の一覧
DOC

find ./ -type f -print | xargs grep $1
```

# 所感
単語追加とかで調整してないから精度いまいち。
気が向いたら精度上げよう。

Mecabなどの環境構築はがんばってください。
もしわからない場合はお気軽にメッセージください。


---
---

インスタもフォローお願いします🙏
https://instagram.com/tashua314

---
---
grep コマンドのバイナリ・マッチ・メッセージ（テキストとして不正なバイトデータが含まれている）

こんにちは。
```grep``` コマンドへ、不正なバイナリーバイトが含まれているテキストデータを渡した場合を調べました。

マッチ自体は成立したが不正なバイトデータを検出した場合には、デフォルトでは標準エラー出力へメッセージを出力し（```binary file matches```）、通常のマッチ結果は出力せず処理終了するようです[^1] [^2]（終了ステータスはマッチ成立を意味する ```0```）。

このような場合に、```-a``` (```--text```) オプションを指定すると最後まで通常処理を続けます（下記例）。ただし、出力には不正なバイナリーバイトが含まれている可能性があります。

また巨大なデータの末尾に不正なバイトデータが含まれているような場合は、処理冒頭では未検出のためか、検出までは通常処理を続けるようです。メッセージを見ると気がつくことになります。

[^1]: 参考：「[grep の「バイナリファイル (標準入力) に一致しました」が出る条件を調べていたらそれは長い旅路の始まりだった。](https://zenn.dev/mattn/articles/2dd838a72de1c3c56c31)」
[^2]: GNU grep 3.4 以前では、標準エラー出力ではなく、標準出力へメッセージが出力されます（ ```Binary file (standard input) matches```）。

```console
$ printf 'oooooooooooooooooooo\nA\0' | ggrep -a 'A'
A
$ printf 'oooooooooooooooooooo\nA\0' | tr -d '\0' | ggrep 'A'
A
$ printf 'oooooooooooooooooooo\nA\0' | strings | ggrep 'A'
$ printf 'oooooooooooooooooooo\nA\0' | ggrep 'A'
ggrep: (standard input): binary file matches
$ ggrep -V | head -n1
ggrep (GNU grep) 3.6
```

#### テキストデータに不正なバイトが含まれているかどうかを判定する方法

テキストデータに不正なバイトが含まれていることを検出する方法を調べました。しかし、どれも必ずしも率直に信じると危ないようです。

1. ```grep``` コマンド利用。マッチ成立条件で動かし、メッセージ ```binary file matches``` の有無を調べる。
2. ```nkf --guess``` コマンド利用。```BINARY``` と判定。
3. ```file``` コマンド利用。```data``` と判定。ただし ```UTF-8 Unicode text, with very long lines``` と判定される事例もある。
[はじめてのLinux」LinuxOSとは

先日参加したLinuxOSについての勉強会で学んだ物のうち、LinuxOSとは何かという内容についてこちらの投稿に書いていきたいと思います。

#LinuxOSとは
WindowsOSやMacOSと同じくOSの一つ

#OSとは
Operating System(オペレーティングシステム)の略
「基本ソフトウェア」とも言う。

コンピュータやスマートフォンは、大きく分けるとハードウェア(コンピュータやスマートフォン本体)とソフトウェア(コンピュータやスマートフォン上で動くアプリケーション)の二つに分けられる。
さらに、ソフトウェアも基本ソフトウェア(OSの事)と応用ソフトウェア(OS上で動くアプリケーション)に分けられる。

![h-xT3XwG.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933264/3d3a3631-2f16-ae31-2e5f-8570e044ca7a.jpeg)

#OSって何をするの？
アプリケーションが動作する為に必要な部品(機能の事)を提供したり、マウスやキーボード、タッチパッドから入力された情報(例えばキーボードで入力した文字や、マウスを使ってファイルをクリックしたよと言ったもの)をアプリケーションに伝えると言ったハードウェアと応用ソフトウェアとの橋渡しの役目も担っている。

#LinuxOSの種類
一つだけではなく色んな種類の物がある

* 種類
    * RedHat系(CentOSはRedhat系)
    * Debian系(UbuntuはDebian系)
    * Slackware系
    
##なんで同じLinuxOSなのにいろんな種類があるのか
LinuxOSには核となるLinuxカーネルという物があって、Linuxカーネル以外の部分は色んな組織が提供しているオープンソースソフトウェア(ソースコードが公開されていて再利用・再配布する事が許可されているソフトウェア）を使用している為。

#参考にしたサイト
OSとは何か: http://www.toha-search.com/it/os.htm
LinuxOSの種類について: https://eng-entrance.com/linux-distribution-compare
Windows 10 の 日本語ロケールを CP932 から UTF-8 にする


:::note
2024/8/1追記
以下の記事はシステム全体を UTF-8 にするやりかたですが、
局所的に変更するには chcp コマンドを使うやり方があるそうです。

```
 chcp 65001
```

:::

# 環境

- エディション	Windows 10 Pro
- バージョン	20H2
- インストール日	‎2021/‎01/‎13
- OS ビルド	19042.804
- エクスペリエンス	Windows Feature Experience Pack 120.2212.551.0

# UTF-8 に変更

コントロールパネルから、「時計と地域」の「日付、時刻、数値形式の変更」→「地域」の「管理」タブの「システムロケールの変更」→「地域の設定」で「ベータ ワールドワイド言語サポートで Unicode UTF-8 」を使用」
![systelmlocale.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/862ca75a-a11e-142a-352f-1135b9a9a7c7.png)

# 悪影響

一見問題ないように見えましたが、・・・Tera Term が文字化けしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/61638f72-0947-a01a-31a6-bf7525ac5c8f.png)

2022/11/16 追加
「Windows上の Python-3.11 で動く Gtk4 や GStreamer をビルドする」
https://qiita.com/ousttrue/items/ac591be1654615e1b178#_reference-b8f7b6a5e0c461e9917b

によると、Pythonでpygobjectをビルドするときにエラーが起きるようです。
`UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8e in position 115: invalid start byte`


# 英語環境の Windows10 を CP932にする 

英語圏の人たちに、CP932 の検証を上げてもらう場合は、これでいいかな？

Control Panel > Clock and Region > Region / Change date,time,or number formats > Region / Administrative > Change system locale... > Region Settings
で
 Japanese （Japan）を選択する。

![systelmlocale2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/592fb97c-f466-9d8b-fc76-90a38486983d.png)
Swiftの基礎の基礎②

### 関数
funcと書くことで宣言。関数名は自由に決定可能。

関数は関数の宣言を行い処理内容を決定し、関数の呼び出しを行い処理を実行する。

*引数を使う前
例）

```
//関数の宣言
func kuku2dan () {
    for n in 1...9{
        print(2 * n)
    }
}
//関数の呼び出し
kuku2dan()

```
結果）

```
2
4
6
8
10
12
14
16
18
```

###  引数
関数の実行時に関数に渡す値。関数は引数を使用して処理を実行。
引数を使うことで、九九の計算の場合だと、プログラム内で任意の段を計算することができるようになる。

→一つのコードで、全部の段の計算に使用することができる。（引数を使わないと段ごとにコードを書かなくてがならない。）

＜引数のある関数の呼び出し方法＞
関数名（引数名：引数）

⚠️引数をつけるけつけないかで全く別の関数になる

＜複数の引数を指定する場合＞
関数名（引数名１：型１,引数名２：型２）

例）

```
//関数の宣言
func kuku(dan:Int) {
    for n in 1...9{
        print(dan * n)
    }
}
//関数の呼び出し
kuku(dan:4)
kuku(dan: 7)
```

結果）

```
4
8
12
16
20
24
28
32
36
7
14
21
28
35
42
49
56
63
```

### ラベル
関数の呼び出し時に使用する名前

＜ラベルを使った関数の宣言＞

```
func 関数名（ラベル１　引数名１：型１, ラベル２　引数名２：型２）{
　　文
}
```
ラベルとしてwithBaseを使用、引数名としてbaseを使用。
関数を呼び出す時はラベルを使用し実際に関数の中で処理する際は引数名を使用。

```
func areaOFTriangle(withBase base:Int, height:Int){
    print(base * height / 2)
}

areaOFTriangle(withBase: 3, height: 4)

```
[はじめてのLinux]Linux勉強会に参加して覚えた事

先日、LinuxOSやLinuxコマンドについてを学ぶ勉強会に参加しましたのでそこで学んだ事を忘れないようにこちらに書いていきたいと思います。

内容が充実していたのでいくつかの記事に分けて投稿していこうと思います

LinuxOSとは
https://qiita.com/nemuissleeper/items/e64fc0198b9a2a9b53e5

Linuxに接続する
https://qiita.com/nemuissleeper/items/c7356597bd3a3d99bab2

Linuxコマンドの種類とターミナルについて
https://qiita.com/nemuissleeper/items/27efd99780cba636248e
Unity初心者がゲームを作ってみる①

右も左も分からないUnity初心者が四苦八苦しながらゲームを制作していく記録となります。
アドバイスや指摘等がありましたらコメントください。

##釣りゲームを作ってみる
おおざっぱなゲーム内容は以下のような感じ。

1.水面に映るネコ影に向かってウキを投げる
2.ネコが食いついたらウキを引き上げる
3.食いつきと引き上げのタイミングが合ったら釣り成功

##フリー画像を収集してUnityにセット
フリー素材を適当に探してきてUnityにセットしていきました。
透過処理ができていないものはGimpを使ってからセットしました。
（Gimpでの透過処理方法の参考サイト　https://wakaba.addisteria.com/archives/755）

AssetsにPictureフォルダを追加して中に画像をセット。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342106/bbb32662-a95f-d2a6-e290-052c53781a6b.png)
Sceneにドラッグ&ドロップしていい感じの位置と大きさに調整します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342106/b8976766-1917-7789-16d8-b7f44685ae47.png)
**詰まりポイント**
Sceneに配置した画像が映らないことがあります。
これは画像ごとのレイヤー番号を決めていないことが原因で、それぞれの画像にレイヤー番号をしてすることで画像が映るようになります。
レイヤー番号はInspectorのOrder in Layerで設定できます。
今回は背景(sunahama)を0、ウキ(uki)を1、ネコ影(neko_1)を2として設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342106/9ff10a30-7d19-d6b5-f6d5-9260c0dba231.png)

##ウキを左クリックしたマウスカーソル位置に移動させる
ウキ画像を左クリックしたマウスカーソル位置に移動させる処理を書きました。

```c#:UkiController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/*
 * ウキの動きを制御するクラス
 */
public class UkiController : MonoBehaviour
{
    void Start()
    {

    }

    void Update()
    {
        // 左クリックされた場合
        if (Input.GetMouseButton(0))
        {
            // ウキ→カーソル方向のベクトル取得
            Vector3 vector = Camera.main.ScreenToWorldPoint(Input.mousePosition) - this.transform.position;
            // 正規化(ベクトルの大きさが1になる)
            Vector3 vectorUki = vector.normalized;
            vectorUki = new Vector3(vectorUki.x, vectorUki.y, 0);
            // ベクトルの向きにウキを移動
            this.transform.position += vectorUki;
        }
    }
}
```

これでゲーム画面のどこかを左クリックするとその位置にウキが移動するようになりました。

##ゲーム起動時にランダムな位置にネコ影を配置する（調査中…）
ゲーム起動時にランダムな位置にネコ影を配置する処理を書いているのですが、これがなかなかうまくいかない…
以下のコードだとランダムな位置にネコ影は配置されるけれど、処理が永遠に動き続けてしまってネコ影で埋め尽くされちゃいます。
1回だけランダムな位置に配置したいのですが方法がわからず調査中です。
解決次第、その２の記事を上げようと思います。（いい方法あったら是非コメントください！）

```c#:ShadowGenerator.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ShadowGenerator : MonoBehaviour
{
    public GameObject shadow;

    void Start()
    {
        //ネコ影の座標
        float x = Random.Range(-10.0f, 10.0f);
        float y = Random.Range(-10.0f, 10.0f);
        float z = Random.Range(0.0f, 0.0f);

        //ネコ影を生成
        Instantiate(shadow, new Vector3(x, y, z), Quaternion.identity);
    }

    void Update()
    {

    }
}
```
Kaggle Coursesの解説（Computer Vision - Convolution and ReLU）

#はじめに
KaggleのCoursesを使って勉強している筆者が、Courseで提供されるコードを解説をしながら学んだことをメモしました。

本記事では以下のコースを解説します。
[Computer Vision - Convolution and ReLU](https://www.kaggle.com/learn/computer-vision)

#本質的な理解
以下の説明がわかりやすく、ConvolutionとReLUのエッセンスがまとまっている。


```python
# Sympy is a python library for symbolic mathematics. It has a nice
# pretty printer for matrices, which is all we'll use it for.
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

import sympy
sympy.init_printing()
from IPython.display import display

image = np.array([
    [0, 1, 0, 0, 0, 0],
    [0, 1, 0, 0, 0, 0],
    [0, 1, 0, 0, 0, 0],
    [0, 1, 0, 0, 0, 0],
    [0, 1, 0, 1, 1, 1],
    [0, 1, 0, 0, 0, 0],
])

kernel = np.array([
    [1, -1],
    [1, -1],
])

display(sympy.Matrix(image))
plt.imshow(image,cmap="jet")
display(sympy.Matrix(kernel))
# Reformat for Tensorflow
image = tf.cast(image, dtype=tf.float32)
image = tf.reshape(image, [1, *image.shape, 1])
kernel = tf.reshape(kernel, [*kernel.shape, 1, 1])
kernel = tf.cast(kernel, dtype=tf.float32)
```

まずはサンプル画像とカーネルを用意する。サンプル画像には縦と横の線が入っている。


サンプル画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253582/4510a84c-14c8-290f-0e79-358138c1c989.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253582/8f6e413d-1f44-2929-e587-eeaa33ce7c17.png)
サンプルカーネル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253582/d8a11f67-f87a-a6d8-a2ac-523c81b80aa8.png)

画像に対してカーネルを移動しながら掛けていく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253582/3a8f5006-e9c4-5c07-67a0-f7fbe85971a9.png)

各ピクセルに対して活性化関数(ReLU)を掛ける。ネガティブなセルはすべて０となり、ポジティブなセルはy=xの関係で計算される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253582/56db38f2-91db-832f-a392-efa6ef6ae736.png)


```python
image_filter = tf.nn.conv2d(
    input=image,
    filters=kernel,
    strides=1,
    padding='VALID',
)
image_detect = tf.nn.relu(image_filter)

# The first matrix is the image after convolution, and the second is
# the image after ReLU.
display(sympy.Matrix(tf.squeeze(image_filter).numpy()))
display(sympy.Matrix(tf.squeeze(image_detect).numpy()))
```
カーネルを掛けたあと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253582/edf85fca-7713-507a-7708-2e1812e300f3.png)

ReLU関数を掛けたあと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253582/460481b3-56e8-ca22-cccd-281ff5fe6da9.png)

以上のように、カーネルとReLU関数の処理によって縦の線だけが抽出された。カーネルを変えることで、画像内のいろいろな特徴を抽出できる。

#
[参考Tensorの変形](https://qiita.com/cfiken/items/04925d4da39e1a24114e)
[D言語] UDPを用いた文字列のやり取り

## UDP ( User Datagram Protocol )

UDP は通信プロトコルの一つですが, どういったものなのかというお話は詳しく説明されている記事は多くありますので省略します.

UDP は相手の応答を待たずデータを送信するため, パケットが喪失する場合があり信頼性は低下しますが, その分TCPよりも高速にデータを送信できます. 

D言語で簡単なプログラムを実装する機会があったのでメモしておきます.

## D言語での実装

受信側 ( recv.d )

- 送信側からバイト列を受け取る
- 受け取ったバイト列を文字列に変換
- 受け取った文字列を出力

送信側 ( send.d )

- ユーザは文字列を入力
- 入力された文字列をバイト列に変換
- 受信側へ変換した文字列を送信

実装には, 標準ランタイムに含まれる std.socket.UdpSocket クラスを利用します.
送信側で, 送信する文字列は, バイト単位の配列で送る必要があるため OutBuffer を用いて入力された文字列を変換しています.


```d:recv.d
// 受信側
import std.socket;
import std.stdio;

int main() {
  auto socket = new UdpSocket();
  auto addr = new InternetAddress( "localhost", 8080 ); // アドレスlocalhostのポート8080を指定

  socket.bind( addr ); // ソケットへの名前付け
  while ( true ) {
    ubyte[2048] recv_buf;
    socket.receive( recv_buf );
    writeln( "Received: ", cast(string) recv_buf ); // バイト列を文字列にキャストして出力
  }

  return 0;
}
```

```d:send.d
// 送信側
import std.socket;
import std.stdio;
import std.outbuffer;
import std.string;

int main() {
  auto socket = new UdpSocket();
  auto addr = new InternetAddress( "localhost", 8080 ); // アドレスlocalhostのポート8080を指定
  socket.connect( addr ); // 接続

  // 100回までサーバに文字列を送信する
  foreach(i; 0..100) {
    // バイト単位に変換して文字列を送信
    auto send_buf = new OutBuffer();
    string str = readln().chomp(); // 送信したい文字列の入力
    send_buf.write( str );

    socket.send( send_buf.toBytes() );
  }

  return 0;
```

## まとめ

送信側・受信側双方を別々のターミナルを用い実行し, 送信側で入力した内容が受信側で受け取れていることが確認できると思います.

UDP はC言語でしか実装したことがなかったため, よい勉強になりました. 

UDP の特性をきちんと理解すれば利用できる機会は多そうです.

## 参考
[dlang.org - udp_socket](https://dlang.org/library/std/socket/udp_socket.html)
[DIGITAL MARS - std.outbuffer](http://www.kmonos.net/alang/d/phobos/std_outbuffer.html)
独学でもGitとGitHubを使って開発する流れ

# 前提
- Gitインストール済み
- GitHubインストール済み
- 新規アプリケーション作成直後を想定

# ローカルリポジトリを作成する

まずは作ったアプリのディレクトリに移動し、ローカルリポジトリを作成します。

```
#ターミナルで下記コマンドを実行
% git init
```

このコマンドで、リポジトリや設定ファイルなどが作られます。

# 作ったファイルをステージに追加する

作成されたファイルをステージに追加します。(自分はrailsを使っているので、rails newなどで作成されたファイルを指します。）

```
#ターミナルで下記コマンドを実行
% git add .
```
変更がステージに追加されているかどうかはgit statusコマンドを実行するとわかります。

# ファイルをコミットする

ステージに変更を追加した後に、コミットしていきます。
今回は初めてのコミットなので、コミット名を"first commit"にしています。

```
#ターミナルで下記コマンドを実行
% git commit -m "first commit"
```

# GitHubにリポジトリを作成

次にリモートリポジトリを作成します。
GitHubにアクセスして、マイページの Repositoriesからnewボタンを押してリポジトリを作っていきます。
new　ボタンを押すとしたの写真のページに飛ぶので、Repository nameに適当なアプリの名前を入力して、Create repositoryを押します。

![スクリーンショット 2021-03-07 19.21.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035658/01e6c784-058c-4708-a94c-1cd953375cf5.png)


作成後は下の写真の```git remote add origin https://github.com/ユーザー名/アプリ名```の箇所をコピーしてターミナルに貼り付けます。

![スクリーンショット 2021-03-07 19.27.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035658/99589264-d116-f5f1-0457-1f310694216e.png)

```
#ターミナルにコピーしてきたものを貼り付けて実行
% git remote add origin https://github.com/ユーザー名/アプリ名
```

# リモートリポジトリにプッシュする

```
#ターミナルで下記コマンドを実行
% git push origin master
```
これで、ローカルリポジトリの内容をリモートリポジトリに反映させることができます。


# ブランチを切って作業する

最初のアプリ雛形をリモートリポジトリのmasterブランチにpushできた状態なので、ここからは機能ごとにブランチを切って作業していきます。

```
#ターミナルで下記コマンドを実行
% git checkout -b ブランチ名
```
このコマンドを実行すると、ブランチを作成し、切り替えてくれます。
ちなみにブランチを作成せずに切り替えたい場合は```git checkout ブランチ名```で切り替えられます。

ブランチを切り替えた後は、実装したい機能を機能を実装していくと思いますが、ファイルの変更はこまめに```ステージに追加→コミット```していきましょう。

```
# ステージ追加のコマンド
% git add . 
% git add ファイル名
% git add ディレクトリ名
```

```
# コミットするコマンド
% git commit -m "適当なコミットメッセージ"

# 下記のコマンドでもコミットできるが、エディターかターミナルでコミットメッセージ入力を求められる
% git commit
```

# リモートリポジトリにプッシュする

実装が完了したら、リモートリポジトリにプッシュしていきます。

```
% git push origin 作業中のブランチ名
```

# プルリクエストを作成する

リモートリポジトリにプッシュしたら今度はプルリクエストを作成していきます。
GitHubのマイページにアクセスしてください。

作成中のアプリのリポジトリのページから、```Pull requests```を選択、```New pull request```ボタンを押してください。

すると下記写真のページに飛ぶので、```base:```をmaster、```compare:```を作業したブランチ名へ変更して```Create pull request```ボタンを押しましょう。

![スクリーンショット 2021-03-07 19.57.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035658/dc4770e0-3f25-0d5c-0895-6a53238a2048.png)

# マージする
ここまでで、プルリクエストが作成されました。


本来であればここで、コードレビューが入ると思われますが、当然独学ではレビュワーはいないので、確認後は好きなタイミングでマージして、リモートのmasterブランチに変更を反映させましょう。

コンフリクトが起きていなければ、したの写真の```Merge pull request```ボタンが押せるはずなので、押してマージしていきましょう。

![スクリーンショット 2021-03-07 20.07.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035658/820fc20f-6e43-a16f-1ae8-a1a1b0db2cb6.png)


# ローカルリポジトリのmasterブランチに変更を反映させる

ここまでで、リモートリポジトリのmasterブランチには最新の変更が反映されています。

最後にローカルリポジトリのmasterブランチにリモートリポジトリのmasterブランチの内容を反映させていきます。
ローカルでmasterブランチに移動して、順番に下記コマンドを実行しましょう。

```
#masterブランチへ移動
% git checkout master
```

```
#リモートの情報をとってくる
% git fetch origin master
```

```
#fetchで取得した情報をマージする
% git merge origin/master
```

これで、一通りの流れは終了です。
基本的に各機能ごとにブランチを切ってこの作業を繰り返していくことになると思います。


以上です。
お読みいただきありがとうございました。
Windows Sandboxでwingetをインストールする

# 結論
powershellを開き下記を実行

```
@(
  "https://aka.ms/Microsoft.VCLibs.x64.14.00.Desktop.appx",
  "https://github.com/microsoft/winget-cli/releases/latest/download/Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.msixbundle"
)|foreach-object{
  [System.IO.Path]::GetTempFileName() | Tee  -Variable TempFile
  iwr -useb $_ -OutFile $TempFile
  Add-AppxPackage $TempFile
  del $TempFile
}
```

# 説明
windows sandboxはstoreが使えないのでAdd-AppxPackageコマンドレットを用いて自分でインストールをする。その時にVCLibsが依存しているがstoreが使えないと自動でインストールしてくれないのでそれも手動でインストールする必要がある。

# 参考
https://docs.microsoft.com/en-us/troubleshoot/cpp/c-runtime-packages-desktop-bridge#how-to-install-and-update-desktop-framework-packages
docker build

#【docker build】

かめさん いつもありがとうございます。
[米国AI開発者がゼロから教えるDocker講座](https://www.udemy.com/course/aidocker/)

##docker buildコマンドは何をしているのか。

docker buildをする時に、指定されたフォルダをDocker deamonに渡す。
Docker deamonがそれを基に、Docker imageを作る。

##build context

docker buildの時に、dockerfileが置いてあるフォルダを指定している。
　→　その指定したフォルダのことをbuild contextという。

　※context : 状況や環境の意味。

buildに使わないファイルは、build context入れない。

COPYやADDでbuild contextの中にあるファイルをDocker imageに組み込む。

###COPY

HostからContainerにファイルやフォルダを渡すことができる。

$ cd ~/Documents/docker
$ touch something
$ docker build .
$ docker run -it < image > bash
$ ls /new_dir

※ <strong>ADD</strong>は、大きなサイズのフォルダやファイルをtarで小さくして送る。
　→　tarの圧縮ファイルをコピーして、解凍させたい時に使う。

###ENTRYPOINT

docker run の時に上書きしてもらいたくないコマンドを指定する時に使う。

　※DockerfileにENTRYPOINTがある時はCMDの役割が変わる。
　→　ENTRYPOINTのオプションをCMDに記入することになる。

###ENV

環境変数を設定する。
（OSの上で動くあらゆるプロセスが情報を共有するために使う変数）

例） ENV < key > < value >

###WORKDIR

Docker instructionの実行ディレクトリを変更する。

例） WORKDIR < 絶対path >

##"Dockerfile"という名のファイルがbuild contextに入っていない場合

$ docker build -f < dockerfilename > < build context >
[Ruby]rbenvでバージョンが切り替わらない時にやるべきこと

##起きていること
rbenvでruby2.6.6をインストールして`rbenv global 2.6.6`
でglobal設定

```
$ rbenv versions 
  system
 * 2.6.6
```
お！いけた！
しかし`ruby -v`で確認すると

```
$ ruby -v
ruby 2.6.3p...
```
なぜだ！うまくいかない！

##解決法
問題はPATHの設定ができないことにありました。
今現在どこのRubyが呼ばれているか確認してみましょう。

```
$ which ruby
/usr/bin/ruby
```
ここは本来`/Users/ユーザー名/.rbenv/shims/ruby`
と表示されなければなりません

また現在のシェルを確認すると

```
echo $SHELL
```

出力されたものの中に`/Users/ユーザ名/.rbenv/shims`は存在しませんでした。

これを解消するには以下コマンドを入力します。(zshを使っています)

```
# rbenvへのPATHを通す
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc

# rbenvを使うために必要な「rbenv init -」コマンドを設定
$ echo 'eval "$(rbenv init -)"' >> ~/.zshrc

#  設定の反映する
$ source ~/.zshrc
```
これによりwhich rubyの結果が思い通りの結果になります。
`ruby -v`を実行すると、、

```
$ ruby -v
ruby 2.6.6p146
```
よし！できた！

しかしこれを毎回設定するのはめんどくさいですよね！
そんな時は以下のコマンドを入力してみてください！

```
$ chsh -s /bin/zsh ユーザー名
```
これを入力するとたとえターミナルを閉じても

```
$ ruby -v
ruby 2.6.6p146
```
ちゃんと設定されてる！

この記事が学習者の参考になれば幸いです！
見ていただきありがとうございました

##参考した記事

https://qiita.com/akatsuki174/items/c0384b9903b4b5cbbdaf

https://teratail.com/questions/59821
GitHubにファイルをアップロードする方法をスクショ付きで教えます

こんにちは。

まゆみです。

[前回の記事](https://qiita.com/Mayumi_Pythonista/items/5fff7ffcf9d561259811)ではGitの便利な点や、使い方について説明しました。

今回はその続きとして[GitHub](https://github.co.jp/)について書いていこうと思います。

(あなたがGitHubにアップロードしたいファイルをLocal RepositoryにアップロードしていないとGitHubにはアップロードできませんので、分からない人はまず[こちらの記事](https://qiita.com/Mayumi_Pythonista/items/5fff7ffcf9d561259811)を読んでからこのページに戻ってきてください)

GitとGitHubは似て非なるものですが、あなたが苦労して書いた大事なコードを守るためや、他の人とコラボするために必須のアイテムです。

<font color="Red">Gitがあなたのパソコン内に、コードの特別な保管場所を作ることだと例えれば</font>

<font color="Red">GitHubはサーバー内にあなたのコードを大切に預かってくれるところだと言えます。</font>


GitとGitHubは下のイラストのような関係になります。

![見出しを追加 (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/da558dba-0a1f-b5dd-cf1c-e3310de4c7fd.png)




#GitHubにアカウントを作る

[GitHub](https://github.co.jp/)のサイトにアクセスして

<ul>

<li>ユーザーネーム</li>

<li>メールアドレス</li>

<li>パスワード</li>
</ul>
など必要事項を記入してください。

クレジットカードは要りません。

##Repositoryを作る

Gitではあなたのパソコン内に『Local』Repository を作りました。

GitHubでは『Remote』Repository を作ります。


Repositoryとは保管場所という意味で、Repositoryを作っただけではまだあなたのファイルはGitHubにアップロードされていません。

![スクリーンショット 2021-03-07 184438.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/447b1e4a-1f6d-4146-47af-7b16ad097baf.jpeg)

①右上にある十字マークをクリックして

②Repository name に好きな名前を書き

③Publicにチェックする。(Public にすることで世界中の人があなたのコードを見ることができます。)

※Initialize this respository with の欄にある3つのチェックボックスにはまだチェックしなくて大丈夫です。

##Repository をセットアップする

Local RepositoryにあるファイルをGitHubないのRemote Repository にアップロードします。

そのことを<font color="Red">『Push する』</font>と言います

![スクリーンショット 2021-03-07 193137.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/425bd5f6-b238-b79c-7134-e090b0f6a444.jpeg)


①GitHubにRepository を作ると上記のスクショのような画面に行くので

②赤で囲まれた部分をクリックして、Repositoryのアドレスのコピーをしてください。

③コマンドラインに『git remote add origin 』と打った後に先ほどコピーしたRepository のアドレスを貼ってください。下記のようになります

![スクリーンショット 2021-03-07 190001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/5c8f610f-4dc8-35c8-ef0a-c64a1c0cfea7.jpeg)

④コマンドラインに『git push -u origin master』と打ってpush する

※『git push -u origin master』で上手くpush できない場合もあります。
その場合は『git push origin FIELD:master』で試してみてください。<(_ _)>

⑤コマンドラインに『...remote branch 'master' from 'origin'』と表示されれば、push 成功になります

![スクリーンショット 2021-03-07 190149.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/d6a34236-b2ae-4b7c-f1a5-9299dc72350b.jpeg)

##GitHubのページに戻り確かめる

先ほどの文言がコマンドラインに表示されれば成功したので、GitHubに戻り確かめてみましょう

新しいRepositoryができあなたのファイルがアップロードされているはずです。

#まとめ

今回の記事では、GitHubにあなたのコードをアップロードする方法をお伝えしました。

GitHubは、就活でポートフォリオの提出が求められる会社を受ける時も必須のツールになりますよね。

次回はGitHubのさらに詳しい使い方にまで踏み込んで記事を書いていきますね。

どうぞよろしくお願いします！
A - ゾロ目数, A - We Love Golf, D - パターンマッチ

##[A - ゾロ目数](https://atcoder.jp/contests/arc046/tasks/arc046_a)

O(N)

```python:python
import math
import heapq
import itertools
from functools import reduce
 
# main
def main():
    N = int(input())

    x = (N + 9 - 1) // 9
    y = N % 9
    if y == 0:
        y = 9
    
    res = ""
    for _ in range(0, x):
        res += str(y)
    
    print(res)

# エントリポイント
if __name__ == '__main__':
    main()
```

##[A - We Love Golf](https://atcoder.jp/contests/abc165/tasks/abc165_a)

O(1)

```python:python
import math
import heapq
import itertools
from functools import reduce
 
# main
def main():
    K = int(input())
    A, B = list(map(int, input().split()))

    x = A // K
    y = B // K

    ok = False
    if x < y:
        ok = True

    if A % K == 0:
        ok = True

    if ok:
        print("OK")
    else:
        print("NG")

# エントリポイント
if __name__ == '__main__':
    main()
```

##[D - パターンマッチ](https://atcoder.jp/contests/past202004-open/tasks/past202004_d)

O(N)
使用可能文字を全探索します。

```python:python
import math
import heapq
import itertools
from functools import reduce

def is_match(T, S):
    for i in range(0, len(S) - len(T) + 1):
        ok = True
        for j in range(0, len(T)):
            if S[i + j] != T[j] and T[j] != '.':
                ok = False
        if ok:
            return True
    return False

 
# main
def main():
    C = "abcdefghijklmnopqrstuvwxyz."
    S = str(input())

    M = []

    for T in C:
        if is_match(T, S):
            M.append(T)

    for c1 in C:
        for c2 in C:
            T = c1 + c2
            if is_match(T, S):
                M.append(T)

    for c1 in C:
        for c2 in C:
            for c3 in C:
                T = c1 + c2 + c3
                if is_match(T, S):
                    M.append(T)

    print(len(M))

# エントリポイント
if __name__ == '__main__':
    main()
```

O(N*2^3)
パターンマッチする文字列を入力の最初の要素から作成していきます。
データ構造のsetを利用することで重複する要素をカウントせずに追加できます。
'.'を設定する所は、bit_searchメソッド内でbit全探索にて要素を作成します。

```python:python
import math
import heapq
import itertools
from functools import reduce

st = set()

def bit_search(T):
    N = len(T) ** 2
    for i in range(0, N+1):
        t = T
        for j in range(0, len(T)):
            if (i & (1 << j)):
                t = t[:j] + '.' + t[j+1:]

        st.add(t)

 
# main
def main():
    S = str(input())

    for i in range(0, len(S)):
        bit_search(S[i:i+1])
        bit_search(S[i:i+2])
        bit_search(S[i:i+3])

    print(len(st))

# エントリポイント
if __name__ == '__main__':
    main()
```
Wio Terminal > Factory Testの開始の仕方 (ハードウェアチェック)

```txt:動作環境
Windows 10 v20H2
Wio Terminal
```

### Factory Test > 開始方法

入手したWio Terminalをいじっているうちに「Factory Test」の画面が出た。
その方法を見つけたのでここに記載する。

1. 右ボタンを押した状態で電源を入れる
    - => "Factory Test, Press Left Button to continue"と表示される

Left Buttonの押下と、JoyStickの操作でハードウェアチェックをできる。


### Factory Test > 内容

以下のテストをする。

- 画面: 白色表示
- 画面: 赤色表示
- 画面: 緑色表示
- 画面: 青色表示
- HW: JoyStickの上下左右入力チェック
- HW: JoyStickの押下チェック
- HW: Left, Middle, Right Buttonの押下チェック


![IMG_2209.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/c4539df6-8b4b-7280-8cd3-f924ca9c177b.jpeg)

![IMG_2210.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/8751d8e3-ef85-16af-ec9c-4cda1274a092.jpeg)

![IMG_2211.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/aa3f7a49-c5e3-c844-f1cc-310dabd8f291.jpeg)


### 使いどころ

何らかの状況でプログラムがうまく動かないときに、ハードウェアチェックとして使えそう。

このFactory Testの開始方法はどこかに記載されているかもしれない（未確認）。
ロードセルについてのまとめ

ロードセルを使ったシステムを作ることがあったので、勉強がてらまとめる。

#ロードセルとは
力をを検出するセンサー。
力の大きさを電気信号に変えるため、マイコン等と組み合わせて加わった力がわかる。
はかり、体重計、天秤などに主に使われる。

#種類
ビーム型、コラム型、S字型、ダイヤフラム型など
参考：https://www.aandd.co.jp/pdf_storage/tech_doc/loadcell/t_cell_faq_ver1.pdf

#接続

|信号  |内容  |
|---|---|
|EXC+  |ロードセル印加電圧(+)|
|EXC-|ロードセル印加電圧(-)|
|SIG+|ロードセル出力電圧(+)|
|SIG-|ロードセル出力電圧(-)|
|シールド|絶縁。導線間相互の干渉を低減するためにGNDに接続|

#使い方	
マイコンを使ってロードセルの値を読む場合、主にアナログ入力を使う。

秋月電子のＳＣ１３３というロードセルで考える。
https://akizukidenshi.com/catalog/g/gP-12034/

仕様書の以下の項目に着目する。

定格容量：20kg(フルスケール)
→測ることのできる最大の力は20kg

定格出力：1.0±0.1mV/V
→ 1Vの入力に対して、出力電圧が1.0mV(誤差-0.1mV~0.1mV)

印加電圧範囲：5~10V
→ 入力電圧は5~10V

この仕様の場合、例えば印加電圧が10Vとすると、定格出力は10mV。
Arduinoの場合、4.9mV単位でしか計算できないため、このままでは約10kg単位でしか計測できないため、
実際に使う場合は、定格出力をアンプを使って増幅する。

# プログラム
①初期値を読み出してゼロ補正を行う（ノイズで初期値が意図通りでない可能性があるため較正する）
②アナログ値を読み出す
③アナログ値を力に変換する。
【TypeScript】Utility TypesのOmitを深く理解する

# この記事は何？
この記事は、Utility Typesの一つである**Omit**について深く理解する記事です。
Utility Typesってそもそも何？という型（方）は以下の記事を御覧ください🙇🏻
👉 [TypeScriptのUtility Typesを理解して活用する](https://qiita.com/NOMURA_keibyou38/items/84caee0657f57650577d)

そもそも、TypeScriptって何？って型は以下を御覧ください
👉 [JavaScriptを知っている方がTypeScriptをなんとなく理解するための記事① ~はじめに~](https://qiita.com/NOMURA_keibyou38/items/06a3218de3ff480ce9de)

# Omit＜Type, Keys＞とは
TypeScript公式には以下のように書かれています。
> Constructs a type by picking all properties from Type and then removing Keys.
> Typeからすべてのプロパティを選択し、Keysを削除して、型を作成します。
> https://www.typescriptlang.org/docs/handbook/utility-types.html#omittype-keys

これは、予め作成した`ある型`中から、一部の`プロパティ`を削除（無視）、して新たに型を作ることのようです。
具体的に言うと、例えば`KokyuFeatures`型があるとします。

```typescript
interface KokyuFeatures {
  baseKokyu: string;
  type: number;
  techniqueName: string;
  user: string;
}
```

ここで、`Technique`型を作るとします。
`Technique`型は以下のように作りたいです。

```typescript
interface Technique {
  baseKokyu: string;
  type: number;
  techniqueName: string;
}

const MinamoGiri: Technique = {
  baseKokyu: "水の呼吸",
  type: 1,
  techniqueName: "水面斬り",
}
```

`Technique`型は、`KokyuFeatures`型から`user`だけを取り除いただけです。
なので、わざわざ`Technique`型を最初から書くのは面倒くさい気もします。

そこで、`Omit＜Type, Keys＞`を利用します。
`Omit＜Type, Keys＞`は次のように利用します。

```typescript
type Technique = Omit<KokyuFeatures, "user">
```

`Omit＜Type, Keys＞`は、`Type`の中から`Keys`を除外して、新しい型を作成します。
今回は、`KokyuFeatures`型から`user`を除外して、新しい型を生成しました。

これにより、最終的には以下のように`Omit`を活用できます。

```typescript
type Technique = Omit<KokyuFeatures, "user">

const MinamoGiri: Technique = {
  baseKokyu: "水の呼吸",
  type: 1,
  techniqueName: "水面斬り",
}
```

React&TypeScriptなどで使いたい場合は、以下のように書けば良さそうです。

```jsx
import { KokyuFeatures } from '~~'

type Technique = Omit<KokyuFeatures, "user">

const TechniqueList: React.FC<Technique> = (props) => {
 ...
}
```

このように、鬼滅の刃の技に関するオブジェクトを簡単に記述することが出来ました。

# おわりに
今回は、Omitについて書いてみました。
是非、ご活用ください！

# 参考
- https://www.typescriptlang.org/docs/handbook/utility-types.html#omittype-keys
PowerShell CSVの特定の列でフィルターして抽出/分割する

読み込むCSVファイルの例として以下の `input.csv` を想定します。

category|name
-|-
a|sato
a|suzuki
b|takahashi

# フィルターして一致する行のみ取り出す

`category` が `a` の行だけ抽出してCSVファイルを作ります。

```powershell
Import-Csv input.csv | Where-Object { $_.category -eq 'a' } | Export-Csv output.csv -NoTypeInformation
```

出力は以下のようになります。

category|name
-|-
a|sato
a|suzuki

なお、`Export-Csv` ではすべての値が**ダブルクォートで囲われて出力**されるようです。

ダブルクォートを外すオプションは今の所ないようなので、外したい場合は下記のコマンドなどでダブルクォートを取りましょう……

```powershell
Get-Content output.csv | ForEach-Object { $_.Replace('"','') >> output2.csv }
```

あるいは、文字列として読み込んでコンマでsplitする方法もあります。これなら**ダブルクォートは付きません**。

```powershell
Get-Content input.csv | Select-Object -First 1 > output.csv
Get-Content input.csv | Where-Object { $_.Split(',')[0] -eq 'a' } >> output.csv
```

# フィルターしてファイルを分割する

`category` ごとに分割してCSVファイルを作ります。各行を `<category>.csv` というファイルに追記することで実現します。

```powershell
Import-Csv input.csv | ForEach-Object { Export-Csv ($_.category + '.csv') -InputObject $_ -NoTypeInformation -Append }
```

なお、この方法も値にダブルクォートが付くので、外したい場合は別途消すか、下記のようなコマンドを使いましょう。

```powershell
Get-Content input.csv | Select-Object -Skip 1 | ForEach-Object { $_ >> ($_.Split(',')[0] + '.csv') }
```

ちなみに `($_.category + '.csv')` は `"$($_.category).csv"` でもよいです。

# あとがき

あまり詳しくないまま調べて書いたので、ベターな方法でなかったらすみません。
Azure Monitor ログについてのメモ

# この記事について

* Azure Monitor を使う際に確認しておきたい点をメモしておく。


# Azure AD のログを Azure Monitor ログ (Log Analytics) で参照する

## 設定での確認ポイント

Azure AD のログを Log Analytics に統合する場合、基本的には以下に従って設定すればよい。
先にLog Analytics ワークスペースを作成しておき、その後、Azure AD で診断設定を設定する。

[Azure Portal で Log Analytics ワークスペースを作成する](https://docs.microsoft.com/ja-jp/azure/azure-monitor/logs/quick-create-workspace)
[Azure AD ログを Azure Monitor ログと統合する](https://docs.microsoft.com/ja-jp/azure/active-directory/reports-monitoring/howto-integrate-activity-logs-with-log-analytics)

設定時に忘れがちな点としてはライセンスがあるが、必要なライセンス持っており、設定したはずなのに、設定した Log Analytics ワークスペースに必要なログが出てこない、ということがあるかもしれない。
そんな場合は落ち着いて以下を再確認しよう。


### Azure AD の診断設定の追加 (Add diagnostic setting)

* 診断設定の「カテゴリの詳細」において、AuditLogs , SignInLogs 以外に Log Analytcs で見たいログを含めてあるか。
* NonInteractiveUserSignInLogs , ServicePrincipalSignInLogs , ManagedIdentitySignInLogs , ProvisioningLogs , ADFSSignInLogs が必要ならば、忘れずに該当箇所にチェックを入れる。
* 診断設定の「宛先の詳細」において、Log Analytics ワークスペースへの送信 が正しく設定されているか。サブスクリプションと Log Analytics ワークスペースの指定が正しいか。

・診断設定の画面
![diag1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318326/6add087e-d615-bca7-d203-17c5df0462bf.png)


### 必要なライセンス

* サインインログ (SignInLogs) をエクスポートするためには Azure AD Premium P1 または P2 が必要。監査ログ (AuditLogs) についてはライセンス不要なので、つい忘れがちである。
* ライセンスを有効にしたつもりでユーザーへの割当てを忘れている or 間違えているケースもある。必要なユーザーに Azure AD Premium P1 または P2 のライセンスが割り当てされているかも念のため確認する。
* Azure AD の「ログ」でテーブルの [LogManagement] に auditLogs が出ており SigninLogs が出ていない場合は、グローバル管理者ふくめ誰にも Azure AD Premium ライセンスを割当していないかもしれない。

・ライセンスが Azure AD Premium P1 または P2 であること
![lic1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318326/19600474-6623-a03c-c10f-4e2ad872f6fc.png)

・ユーザーにライセンスを割り当て済であること
![lic2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318326/e2877b9f-48ee-7d17-c5af-e5008e2d8eb8.png)


### ログが出力されるまでの時間

* 監査ログ、サインインログともに、Azure AD で何か作業してから即出るわけではなく、多少のタイムラグがある。すぐに見に行っても出ていないことは多い。

・監査ログ画面
![aud1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318326/693a1d12-a54c-b356-2947-adecea53e9f2.png)

・サインインログ画面
![sin1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318326/e9d550e5-24d6-27b4-05d0-415ced67c6d6.png)


* 自分の例では、診断設定を仕込んでから監査ログが出るまでに40分以上かかったこともある。そのため、設定仕込んでから30分後、1時間後くらいに見るようにしている。設定が正しくてもログはすぐには出ない。

・以下では、AuditLogs , SigninLogs が両方出ている
![log1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318326/84317be3-6a5a-157e-3277-1dad3e65e05d.png)



以上
[Rails6]ActiveRecord::NoDatabaseErrorの解決法

環境はMacBook Airを用いています

##エラーの内容

``` 
$ rails server
```

これを実行しサーバーを立ち上げ、 `localhost:3000`にアクセスすると、
以下のエラーが発生します。

![スクリーンショット 2021-03-07 19.17.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991598/8a5b6032-24ba-c98e-8c90-3b07c5ecd2c1.png)


##解決した方法
結論から言うと**データベースを作る**です。
最初に`rails new`で生成したディレクトリに移動します。

```
$ cd 移動したいディレクトリ
```
そして

```
$ rails db:create
```
を実行してデータベースを作成してください。
`config/database.yml`の内容に合わせてデータベースが自動生成されます

これでまた`rails server`を実行すると、、、

```
$ rails server
```


![スクリーンショット 2021-03-07 19.00.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991598/079cb2a9-b145-583e-08ae-45b648458fbe.png)

##無事解決！
お！！やったー！！できたー！！
これが皆さんの役に立てれば幸いです！
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3939313539382f61643565633933632d323663652d663734392d393965332d3163656436306464326330312e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991598/f040c032-824c-3382-06eb-57101272c7df.png)
【合格体験記】AWS認定デベロッパー–アソシエイト(DVA-C01)

# 本記事の概要

AWS認定デベロッパー–アソシエイト(DVA-C01) を取得したので勉強方法を備忘録として投稿します。
AWS-DVAを受けようと思っている方や、現在勉強している方が
この記事を参考の一つにしていただけたら幸いです。

# 使用した教材

Udemy
・[Ultimate AWS Certified Developer Associate 2021 - NEW!] (<https://www.udemy.com/course/aws-certified-developer-associate-dva-c01/>)

WHIZLABS
・[AWS Certified Developer Associate] (<https://www.whizlabs.com/aws-developer-associate/>)

# 勉強の流れ

AWSについては、AWS-SAA、AWS-SOAを取得済み程度の知識が前提になります。
[AWS-SAA合格体験記] (<https://qiita.com/msengnsoni/items/191dc5c77fbaf238ce28>)
[AWS-SOA合格体験記] (<https://qiita.com/msengnsoni/items/da6faebbf934e11bc643>)

これまでの試験対策である程度のAWSサービスについて概要は把握していましたが、
デベロッパーアソシエイトでは、LambdaやDYnamoDB、APIgatewayといった
サーバレスサービスについて深く問われるということで、
Udemyの**Ultimate AWS Certified Developer Associate 2021 - NEW!**を実施。

SOAの際と同様に、全部やるのではなく、理解不足のセクションに絞って実施しました。
(すべて通してやろうとするとかなりの量です)

Udemyの講座終了後は、毎回お世話になっている**WHIZLABS**を実施。
今回はセクション毎問題だけではなく、他の模擬試験問題もすべて実施しました。

個人的には、Udemyの講座が一番勉強になったかなと思います。
やはりハンズオンを通してインプットすると、頭に残りやすいですね。

# 試験結果

受験日：2021年2月27日
スコア：883
合格ライン：720
結果：pass

[証明バッヂ](https://www.credly.com/badges/44823518-5c82-4627-99db-ed3e8a4a5320/public_url)

試験中はあまり手応えがなかったのですが、
意外にも得点できていて驚きました。

私の予想では、サーバレスサービス(Lambda、DynamoDB、APIGateway)に関して
多く出題されると踏んでいたのですが、そこまで偏っていなく
万遍なく出題されたなあという印象です。

# 受験後の感想

これでついにアソシエイト3冠達成！
今回も勉強期間は1ヶ月ほどでした。

アソシエイトレベルの3資格の受験難易度はこんな感じ。（私個人の感想です）
ソリューションアーキテクト　＞　デベロッパー　＞　SysOpsアドミニストレータ

今後はLPICをLevel3まで取得すべく邁進する所存。

この記事を開いていただき、また、
ここまで読んでいただきありがとうございました。
「うっせぇわ」で分かるyield【Python】

# あらすじ

`yield` とは？`Generator`とは？それが何か見せつけてやる！！！
一切合切凡庸なあなたじゃ分からないかもね！

# うっせぇわ

## listを使った「うっせぇわ」

不文律最低限の`list`です。

```py
UssehwaList = ['うっせぇ', 'うっせぇ', 'うっせぇ', 'わ']

if __name__ == '__main__':
    for lyric in UssehwaList:
        print(lyric, end='')
    print()
```
ああつまらねぇ、
何回書かせるんだ、クォーテーション！って感じですね。

何か足りない、困っちまう、これは誰かのせい！
それこそ俗にいう`yield`です！

## yieldを使った「うっせぇわ」

あーもう本当になんて素晴らしき世界。

```py
def Ussehwa(times: int):
    for time in range(times):
        yield 'うっせぇ'
    yield 'わ'


if __name__ == '__main__':
    Ado = Ussehwa(3)
    for lyric in Ado:
        print(lyric,end='')
    print()
```

おそらく、`Ado = Ussehwa(3)`のところで代入作業しているのは[**Syudou**](https://twitter.com/tikandame)さんですね。
うっせぇわ`generator`を`Ado`に仕込んでいます。

`Ado`から、`lyric`が`generate`されていますね。

# ラブカ？

こちらは、「うっせぇわ」の代わりに「ラブカ？」で試してみています。

## listを使った「ラブカ」

```py
UssehwaList = ['ラ', 'ラ', 'ラ', 'ラ', 'ラ', 'ラブか？']

if __name__ == '__main__':
    for lyric in UssehwaList:
        print(lyric, end='')
    print()
```

## yieldを使った「ラブカ」

```py
def Rabuka(times:int):
    for time in range(times):
        yield 'ラ'
    yield 'ラブ'

def Loveyouka(times:int):
    for time in range(times):
        yield 'ラビュー'
    yield 'か？'


if __name__ == '__main__':
    Ado = Rabuka(5)
    for lyric in Ado:
        print(lyric, end='')
    print('か？')
    Ado = Loveyouka(3)
    print('甘き', end='')
    for lyric in Ado:
        print(lyric, end='')
    print()
```

# 小っちゃな頃から優等生

つっても私、模範人間なので、ちゃんと説明も入れます。

`yeild`を使うと、組み込み機器のプログラミングや、OS制御でよく出てくる「割り込み」を実現できたりします。
英語で言うと「interrupt」ですね。

他にも、ファイルの読み込みを行うクラスで、１行ずつ読み込むメソッドを作るときに使ったりします。
また、pytestでも頻繁に出てきます。

https://qiita.com/_akiyama_/items/9ead227227d669b0564e#yield%E3%82%92%E4%BD%BF%E3%81%86%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

https://qiita.com/mwakizaka/items/e51c604155633ccd33dd#yield%E3%82%92%E4%BD%BF%E3%81%86%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

#yield%E3%82%92%E4%BD%BF%E3%81%86%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

本家はこちらです。

https://www.youtube.com/watch?v=Qp3b-RXtz4w

https://www.youtube.com/watch?v=1Esz9ONM9X8

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


# まとめ

前半で息巻いたわりに、yieldの10%も語れていないですね。
「もう見飽きたわ」と思われるかもしれません。
二番煎じ言い換えのパロディです。

サボリーマンによく似合う、この可もなく不可もない記事。
`yield`の良さが分からないかもね！
だけど、どうだっていいぜ問題はナシ！

当記事を読んで、少しでもYieldとAdoにご興味を持っていただき、
下記のような、詳しい説明をしていただいている記事をご覧いただけたら最高です。

https://qiita.com/conf8o/items/83efd91524ec7cca73c3

https://qiita.com/Tadahiro_Yamamura/items/26a925d9a670f01bf497

https://qiita.com/tomotaka_ito/items/35f3eb108f587022fa09

# うっせぇわ関連記事

https://qiita.com/gorilla_gorilla/items/3203a86123ecc9381f39

https://qiita.com/narita1980/items/e9fc44c880c248b609bc

https://qiita.com/conf8o/items/83efd91524ec7cca73c3


**Excelsior!**
Docker for WindowsでPostgres+pgAdminのコンテナをたてる

# はじめに
RustのdieselでPostgresに接続しようと思い、DockerでPostgresとpgAdmin4をたてました。
情報を探しても部分的にしかなかったので、備忘録的に残しておきます。

# 環境
Docker for WindowsでDocker Composeを使います。
Postgresは13.2、pgAdminは4.4.2を使います。

# Volumeの作成
Windowsの場合、Postgresのコンテナを作る際 Volumeを作らずにマウントするとPermission Errorやらエラーが出るようです。
[Docker for Windowsでpostgresのデータマウントができない人へ](https://qiita.com/ko-da-k/items/47b96883144a5bf1cb1e)
[Docker for Windows で postgres コンテナの Volume マウントを安全にする](https://qiita.com/megmogmog1965/items/e7cd4500006c3b6b1894)

ので、Volumeを作ります。

```bash
Postgres用
$ docker volume create postgres_volume

pgAdmin4用
$ docker volume create pgadmin4_volume
```

# Containerの作成
以下のようにdocker-compose.yamlを用意します。

```yaml:docker-compose.yaml
version: '3.7'
services:
    postgres:
        image: postgres:13.2-alpine
        container_name: postgres
        ports:
            - 5432:5432
        volumes:
            - postgres_volume:/var/lib/postgresql/data
        environment:
            POSTGRES_USER: root
            POSTGRES_PASSWORD: root
            POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
        hostname: postgres
        restart: always
        user: root

    pgadmin4:
        image: dpage/pgadmin4:5.0
        container_name: pgadmin4
        ports:
            - 8000:80
        volumes:
            - pgadmin4_volume:/var/lib/pgadmin
        environment:
            PGADMIN_DEFAULT_EMAIL: root
            PGADMIN_DEFAULT_PASSWORD: root
        hostname: pgadmin4
        depends_on:
          - postgres
        restart: always

volumes:
  postgres_volume:
    external: true
  pgadmin4_volume:
    external: true
```

立ち上げます。

```bash
$ docker-compose up
```

# pgAdminへのアクセスと設定
localhost:8000にアクセスできればOKです（root/root）。
![pgAdmin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149028/d0dfb5d6-d181-7063-4865-caa0b8db5de2.png)

サーバー追加で、docker-compose.yamlに記載した内容を設定すればOKです。
参考画像
![add_server.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149028/200a0deb-e60c-91ae-e44e-ca9d294c0290.png)

# まとめ
Docker for WindowsでPostgres＋pgAdminのコンテナを立ち上げる方法を紹介しました。
次回はこのPostgresにRustのdieselから接続するところを書きたいと思います。
形から入りたい君へ送るTerminalの見た目をかっこよくする方法

#### Iceberg for Macをダウンロードします。
- Icebergページ：http://cocopon.github.io/iceberg.vim/

ほんで、Terminalを起動

`Command⌘ + ,`でプロファイル（設定）を起動

#### 画像のように設定しよう

![スクリーンショット 2021-03-07 18.41.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241630/80869892-574b-ab1f-4ca3-fc83a753307f.png)

- 「読み込む...」から、先ほどダウンロードした「Iceberg.terminal」ファイルを読み込む。
    -するとサイドバーにIcebergが出てくる
- Icebergを選択して「デフォルト」をクリック。
- フォントをご自由に変更する
    - ぼくはサイズだけ「11→18」に変更しました。
- 「背景」の`"不透明度"`を75%程度 + ブラー(ぼかし)を80%に設定
    - お好みでどうぞ
- 「カーソル」のセクションで「カーソル」を選択
    - 好きな色に変更できます。
    - ぼくは青っぽいなんとも言えない青にしました
    - ちょっとだけ良さげです。

### 「.zshrc」ファイルに記述する
- Finderを開く。
- メニューバーの「移動」からホームを選択
    - `Command⌘ + Shift + H`でもOK
    - ログインユーザフォルダ直下に移動します
- 隠しファイルを`Command⌘ + Shift + .`で表示させる
- 「.zshrc」をダブルクリック等で開く
- 画像中みたいに[日付] + [時間] + [ユーザ名]にしたい場合は下記をコピペして保存
- Terminalを再起動すれば色が変わって、画像みたいになるはず。。

```
PROMPT='[%F{cyan}%# %{No.%h %D %T %$ %C%F{reset_color}]'
```

以上！

### 参考
- [ターミナルプロンプトの表示・色の変更](https://qiita.com/hmmrjn/items/60d2a64c9e5bf7c0fe60)
- [【Bash】ターミナルのプロンプトを自在にカスタマイズする](https://ty-engineer.com/other/prompt-custom/)
    - 引数いろいろです。
- [Macのターミナルをおしゃれにする！【icebergテーマ】](https://qiita.com/samuraibrass/items/1bf4ff34e8682f762682)
GitLabデータの各種ディレクトリ権限

現場のGitLabの作業にて、GitLab関連のディレクトリ権限周りの取り扱いで苦戦してしまったので、改めてGitLab関連のユーザーやディレクトリ構成をメモしておこうと思います。
なお、今回使用しているGitLabのバージョンは```13.8.4```です。

# GitLabのユーザー
GitLabをインストールすると自動で作成されるユーザーの情報です。
各種ユーザーの役割についてもメモ書き程度に記載してみました。
なお、UIDとGIDはバージョンや環境により異なりますので省略します。
```id <ユーザー名>```コマンドでUIDとGIDを調べられますので、確認してみてください。

```
ユーザー名　       役割
gitlab-www        GitLab専用のnginxサーバーで使用されるユーザー
git               GitLabのメインで使用されるユーザー
gitlab-redis      GitLabのキャッシュやセッション情報をやり取りするユーザー
gitlab-psql       postgresqlと呼ばれるデータベースへアクセスするためのユーザー？
gitlab-prometheus prometheusと呼ばれるサーバー監視ツール用のユーザー？GitLabサーバーの監視に使われるらしい
```

# GitLabの各ディレクトリと権限情報
GitLabに関する各ディレクトリと、その権限情報を記載します。
なお、複数のGitLabサーバーからNFS等でデータを共有している場合、UID・GIDが異なっているとユーザー名かグループ名が数字で表示されますが、サーバー側に合わせようとしてディレクトリの権限を変更してしまうと他のサーバーからアクセス出来なくなりGitLabのプロジェクト等が見えなくなってしまう等の悪影響が出る恐れがあります。
その場合はディレクトリのユーザーやグループを変更するのではなく、ユーザーのUIDかGIDを変更すると良いでしょう。
また、複数のサーバーで共有する際にセキュリティの観点からrootを無効化している場合、現在```root```となっているグループを```wheel```に変更すれば良さそうです。

```ruby:GitLabディレクトリ構成
ディレクトリ名　　　　ユーザー　　　　　　グループ
alertmanager        gitlab-prometheus  root 
backups             git                root
git-data            git                root
gitaly              git                root
gitlab-ci           git                root
gitlab-exporter     git                root
gitlab-rails        git                root
gitlab-shell        git                root
gitlab-workhorse    git                gitlab-www
grafana             gitlab-prometheus  root
logrotate           root               root
nginx               root               gitlab-www
node-exporter       root               root
postgres-exporter   gitlab-psql        root
postgresql          gitlab-psql        root
prometheus          gitlab-prometheus  root
redis               gitlab-redis       git
```

今回は以上となりますが、気が向いたら各ディレクトリごとの概要を調べてみようと思います。
【jQuery】rss(xmlデータ)取得

rss 取得の仕方メモ

```
var BlogXmlUrl = "https://media.sample.jp//rss.xml?_=1234567"

function(){

  $.ajax({
    url: BlogXmlUrl 
  }).done(function(data, textStatus, jqXHR){　//成功 textStatusにはsuccess or error、jqXHRはXMLHttpRequestオブジェクト（200→成功、404→エラー)
    var $items = $(data).find("item");
      console.log($items);

    $items.each(function(i, e) { //iはindex eはelement(要素)
      console.log(i, e);
      if(i<3) {
        var target = $('.rss-blog'); //rssで取得した要素の吐き出し先

        var date = $(this).find("date").text()
        var title = $(this).find("title").text()
        var description = $(this).find("description").text()

        var html = ''; // += で 要素追加してく
        html +=  '<date class="blog-content-date">'+ date + '</date>';
        html +=  '<h2 class="blog-content-title">'+ title + '</h2>';
        html +=  '<p class="blog-content-description ">'+ description + '</p>';

        target.append(html)
      }
    });
  }).fail(function(jqXHR, textStatus, errorThrown){　//失敗 jqXHRはXMLHttpRequestオブジェクト（200→成功、404→エラー)
    console.log(jqXHR)
  })

};

```
paramikoでSFTP通信をするときの、ディレクトリとファイルの見分け方

# 目的

paramikoでSFTP通信を行う時、あるディレクトリの中にあるオブジェクトの一覧は見えるが、それがファイルかフォルダかの判別はできない。
体系的なディレクトリの中に統計データがある場合、再帰的にファイルの一覧を取得したいが、listdirだけではディレクトリの情報は取得できないことがあった。

これに対応するためにはparamikoだけではなく、pythonの標準のstatパッケージを使って対応する必要があるようだ。

# 手順

目的で示された問題を解決するためには、あるディレクトリの中に格納されているオブジェクトの一覧に対して、それぞれがファイルかフォルダかそれ以外かを判別する必要があった。
APIの説明では「SFTPClient.listdirはos.listdirと同じようなもの」であり、実際に中身のファイルの一覧を文字列のリストで返してくるが、問題は直接「os.path.isdir」の代わりになる関数が無いことと、関数を実行するたびにsftpで通信を行うことによって通信コストが増大することにある。

※APIの説明はこっち。

http://docs.paramiko.org/en/stable/api/sftp.html


この問題を回避するには、listdir_attrを使って中身を調査するのが良さそうだ。

# コード

ざっくりとコードを書くと、ある特定のフォルダからディレクトリだけ抜き出す場合はこのような感じになる。

```python
import stat
import paramiko


def get_dir_list(sftp_client, path):
    item_attr_list = sftp_client.listdir_attr(path)

    dir_list = []

    for item in item_attr_list:
        if item.st_mode & stat.S_IFREG:
            dir_list.append(item.filename)

    return dir_list

```

重要なのなstatパッケージのインポート、それとitem.st_modeの値の確認だ。
st_modeの値のビットの中にstat.S_IFDIRが含まれていたならディレクトリ、S_IFREGが含まれていたならファイルらしい。
他にも考えられる値があるようだが、自分のlinuxの知識ではぱっと例を出すことは出来なかった。
EBSのボリュームサイズを縮小する(Ubuntu18.04の場合)

AWSのEBSはサイズを増やす分には手軽ですが、減らすのにはなかなか手間がかかります。
とはいえ、 [EBSのボリュームサイズを縮小する](https://qiita.com/miyasakura_/items/22d3601e06b583551301) などの方法で縮小は可能なのですが、Ubuntu18.04 LTSの場合に嵌ったので対策を書いておきます。

問題点
-------------------
`/etc/fstab`はラベルを指定しているので`e2label`コマンドで対応できるが、GRUBがファイルシステムを探す際はUUIDを用いるので、新デバイスが見つけられずOS起動に失敗する。

```sh:/boot/grub/grub.cfg
～省略～
search --no-floppy --fs-uuid --set=root  c03b791b-60ef-4ae1-82b5-5c9ab6b4d08f
～省略～
```

対応方法
------------------
元記事の8番(rsync)と9番(umount)の間にGRUBの設定ファイル更新を行います。

### 8.1. blkidで旧、新のファイルシステムUUIDを確認する
```sh
$ blkid
/dev/xvdf1: LABEL="cloudimg-rootfs" UUID="e1a87e36-cc00-4287-8845-ab3cd7dbb4dc" TYPE="ext4" PARTUUID="d5b2b459-01"
/dev/xvdg1: LABEL="cloudimg-rootfs" UUID="c03b791b-60ef-4ae1-82b5-5c9ab6b4d08f" TYPE="ext4" PARTUUID="b32e823c-01"
```

### 8.2. GRUBのUUIDを書き換える
```sh
# 修正箇所、件数を確認
grep c03b791b-60ef-4ae1-82b5-5c9ab6b4d08f /mnt/small/boot/grub/grub.cfg
grep c03b791b-60ef-4ae1-82b5-5c9ab6b4d08f /mnt/small/boot/grub/grub.cfg | wc -l

# 置換
sed -i -e 's/c03b791b-60ef-4ae1-82b5-5c9ab6b4d08f/e1a87e36-cc00-4287-8845-ab3cd7dbb4dc/g' /mnt/small/boot/grub/grub.cfg

# 念のため件数を確認
grep c03b791b-60ef-4ae1-82b5-5c9ab6b4d08f /mnt/small/boot/grub/grub.cfg | wc -l
grep e1a87e36-cc00-4287-8845-ab3cd7dbb4dc /mnt/small/boot/grub/grub.cfg | wc -l
【TypeScript】Utility TypesのPickを深く理解する

# この記事は何？
この記事は、Utility Typesの一つである**Pick**について深く理解する記事です。
Utility Typesってそもそも何？という型（方）は以下の記事を御覧ください🙇🏻
👉 [TypeScriptのUtility Typesを理解して活用する](https://qiita.com/NOMURA_keibyou38/items/84caee0657f57650577d)

そもそも、TypeScriptって何？って型は以下を御覧ください
👉 [JavaScriptを知っている方がTypeScriptをなんとなく理解するための記事① ~はじめに~](https://qiita.com/NOMURA_keibyou38/items/06a3218de3ff480ce9de)

# Pick＜Type, Keys＞とは
TypeScript公式には以下のように書かれています。
> Constructs a type by picking the set of properties Keys from Type.
> タイプからプロパティキーのセットを選択することにより、タイプを構築します。
> https://www.typescriptlang.org/docs/handbook/utility-types.html#picktype-keys

これはつまり、`ある型`からその中にある`プロパティ`を指定して、新たに型を作ることを示しています。
具体的に言うと、例えば`Pokemon`型があるとします。

```typescript
interface Pokemon {
  height: number;
  weight: number;
  name: string;
  description: string;
  type: string;
}
```

ここで、`Picachu`型を作るとします。
**ピカチューを表現するためには、名前と可愛いという情報だけで十分です。**
そのため、`Picachu`型は以下のように作りたいです。

```typescript
interface Picachu {
  name: string;
  description: string;
}

const favoritePockemon: Picachu = {
  name: "ピカチュー",
  description: "可愛い";
}
```

ここで、`Picachu`型にあるプロパティは`Pokemon`型のプロパティと重複していることがわかります。
プロパティとは`name`および`description`のことです。
これらのプロパティをもう一度書くのは冗長そうです🤔

そこで、`Pick＜Type, Keys＞`を利用します。
`Pick＜Type, Keys＞`は次のように利用します。

```typescript
type Picachu = Pick<Pokemon, "name" | "description">
```

そうです、`Pokemon`型の中からプロパティを取り除いて（Pick）あげれば良いです。
今回は、`Pokemon`型から`name`と`description`を取り除いて、新しい型を生成しました。

これにより、最終的には以下のように`Pick`を活用できます。

```typescript
type Picachu = Pick<Pokemon, "name" | "description">

const favoritePockemon: Picachu = {
  name: "ピカチュー",
  description: "可愛い";
}
```

React&TypeScriptなどで使いたい場合は、以下のように書けば良さそうです。

```jsx
import { Pokemon } from '~~'

type Picachu = Pick<Pokemon, "name" | "description">

const PicachuComponent: React.FC<Picachu> = (props) => {
 ...
}
```

このようにピカチューは可愛いというオブジェクトを簡単に記述することが出来ました。

# おわりに
今回は、Pickについて書いてみました。
是非、ご活用ください！

# 参考
- https://www.typescriptlang.org/docs/handbook/utility-types.html#picktype-keys