OmniAICreator/Qiita-1.07M huggingface dataset:
Module#concerningとは

## はじめに
[Ateam Group U-30 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ateam-group-u30)の18日目は、 @mayobimu が担当します！

https://qiita.com/advent-calendar/2022/ateam-group-u30


## Module#concerningとは
Rails 4.1.0で追加された機能
Rails 4.0で追加されたActiveSupport::Concernをより使い方の幅を広めることができる

## 何が変わったの？
### ActiveSupport::Concernの場合

- `app/models/concerns/`or`app/controllers/concerns/`からincludeする必要がある

https://qiita.com/mayobimu/items/e05a8f9d496200a0c3ec


### Module#concerningの場合


- 同じmodelsファイルからincludeできる、１つのファイルで完結できる
- 複数の場所で使用するならActiveSupport::Concern、分離したいだけならModule#concerningを使用するのが良さそう？

```ruby

# app/models/host.rb
class Host
  include M
end

class Host
  concerning :M do
      included do
        scope :disabled, -> { where(disabled: true) }
      end
  end
end

```
 

## 参考
https://www.techscore.com/tech/Ruby/rails-4.0/rails-4.0-whats-new/#4

https://www.techscore.com/blog/2014/03/17/rails-4-1-0-%E3%81%A7%E8%BF%BD%E5%8A%A0%E3%81%95%E3%82%8C%E3%81%9F-moduleconcerning-%E3%81%A8%E9%96%A2%E5%BF%83%E4%BA%8B%E3%81%AE%E5%88%86%E9%9B%A2/

## さいごに
[Ateam Group U-30 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ateam-group-u30)はまだまだ続きます！ぜひ購読登録して、明日以降の記事もチェックしてみてください！

[^1]: 本来の役割を超えたコードで肥大化したコントローラのこと
AWS Cognito をまとめる

Amazon Cognito offers
- user pools
- identity pools



## Cognito User Pool

> User pools are user directories that provide sign-up and sign-in options for your app users. Identity pools provide AWS credentials to grant your users access to other AWS services.


要は認証。

ログイン方法は２種類ある。両方を組み合わせることも可能。

- `Cognito user pool`
    - Users can sign in using their email address, phone number, or user name. User attributes, group memberships, and security settings will be stored and configured in your user pool.
- `Federated identity providers`
    - Users can sign in using credentials from social identity providers like Facebook, Google, Amazon, and Apple; or using credentials from external directories through SAML or Open ID Connect. You can manage user attribute mappings and security for federated users in your user pool.



## Cognito Identity Pool

> With Cognito Identity Pools, your app can get temporary credentials to access AWS services for anonymous guest users or for users who have signed in.

要は認可。認可されたユーザーにはIAM roleが与えられる。
【React】useCallbackとは

# useCallbackとは
useCallback()はメモ化したコールバック関数を返します。
依存配列（=[deps] コールバック関数が依存している要素が格納されている配列）の要素の何かが変化した場合のみ、メモ化した値を再計算します。

# メモ化とは...?
Reactのメモ化とは、計算結果を保持し、それを再利用する手法のことです。キャッシュの考え方と同じイメージで良いかと思います。
そのため、以下の言葉の意味は大体同じになります。

「メモ化された値」=「計算結果が保持された値」
「メモ化する」=「計算結果を再利用できるように保持する」

メモ化によって都度計算する必要がなくなるため、パフォーマンスの向上が期待できる。

# 基本構文

```react
useCallback(callbackFunction, [deps]);
```

例えば、`name`という変数をconsole.logで出力する関数をメモ化したい場合は以下のようになる。

```react
const callback = useCallback(() => console.log(name), [name]);
```

依存している要素が更新されれば、関数が再生成される。
依存している要素がなければ、依存配列は空で OK。

```react
const callback = useCallback(() => console.log("何かをする"), []);
```
JavaScriptの配列操作のまとめ（map/filter/find/every/some/reduce）

## はじめに
JavaScriptで配列を操作する時に使用する便利な各メソッドのまとめです。

### map
すべての要素に対して1つずつ処理をして全ての要素を返す
↓mapを使用して数字を１０倍した例
```Javascript
const numbers = [1,2,3];

const tenTimes = numbers.map((number) => {
  return number * 10
});

console.log(tenTimes);　// [10, 20, 30]
```
### filter
条件を満たした要素をすべて返す
↓filterを使用して２の倍数のみ抽出した例
```Javascript
const numbers = [1,2,3,4];

const result = numbers.filter((num) => {
  return num % 2 == 0
});

console.log(result);　// [2, 4]
```

### find
最初に条件を満たした要素1つだけ返す
↓findを使用して３以上の要素1つを抽出した例
```Javascript
const numbers = [1,2,3,4];

const result = numbers.find((num) => {
  return num >= 3 
});

console.log(result);　// [3]
```

### every
すべての要素が条件を満たしたらtrueを返す
↓everyを使用して要素が全て３以上かをチェックした例
```Javascript
const numbers = [1,2,3,4];

const result = numbers.every((num) => {
  return num >= 3 
});

console.log(result);　// [false]
```

### some
すべての要素のうち1つでも条件を満たしたらtrueを返す
↓someを使用して要素が全て３以上かをチェックした例
```Javascript
const numbers = [1,2,3,4];

const result = numbers.some((num) => {
  return num >= 3 
});

console.log(result);　// [true]
```

### reduce
すべての要素に対して処理をして、1つの要素を返す
↓reduceを使用して各要素の合計値を返す例
```Javascript
const numbers = [1,2,3,4,5];

const result = numbers.reduce((accumulation, element) => {
  return accumulation + element;
});

console.log(result);　// [15]
```
pytoshopのPSDファイルの新規作成でレイヤーを再構成してみた

## はじめに
広告バナー作成において、社内アプリに登録する際にレイヤーの分割作業が発生しています。
この作業が地味に時間がかかるとクリエイターさんから意見を頂いていました。
この作業を`pytoshop`というpythonライブラリを使用してPSDの新規作成ができるか試してみました。

## やりたいこと
例として、以下のようなロゴ、背景色と連番構成の画像レイヤーを　`ロゴ`-`連番`-`背景色`の構成でPSDを新規作成したい

```（レイヤー構成）
├── ロゴ
├── 1
├── 2
├── 3
├── 4
└── 背景色
```

```
├── ロゴ
├── 1
└── 背景色
```

PSDファイルを操作するライブラリで有名どころは `psd-tools`がありますが、`pytoshop`はPSDの新規作成が行えるため、
既存のPSDファイルからレイヤーを取得して新規ファイルとして再構成する方法で試してみました。

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

```
pip install pytoshop
```

## やってみた

```python:layer_separate.py
import os
import sys
import pytoshop
from pytoshop import layers
from pytoshop.user import nested_layers


def main():
    read_file_path = 'sample_1.psd'

    with open(read_file_path, 'rb') as fd:
        # ヘッダ情報を読み込む
        psd_header = pytoshop.core.Header.header_read(fd)
        print(vars(psd_header))
        fd.seek(0)
        psd = pytoshop.read(fd)
        current_layer_list = nested_layers.psd_to_nested_layers(psd)
        new_layer = nested_layers.nested_layers_to_psd(
            [current_layer_list[0], current_layer_list[1], current_layer_list[2]],
            color_mode=psd_header.color_mode,
            version=psd_header.version,
            compression=1, 
            depth=8, 
            size=(psd_header.height, psd_header.width), 
            vector_mask=False
        )
        with open('newfile.psd', 'wb') as new_fd:
            new_layer.write(new_fd)

if __name__=="__main__":
    main()
```

## 結果

![スクリーンショット 2022-12-26 13.21.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68003/1e7757a3-c897-beb6-8dd3-36d3dde1413a.png)

- [pytoshop — pytoshop 1.2.1 documentation](https://pytoshop.readthedocs.io/en/latest/index.html)

上記リファレンスを参照しながら作成してみました。
既存のPSDからレイヤーを取得して、新規ファイルに書き出しまでは行えましたが、
フィルターやフォントの色などが元レイヤーと違っていました。

今回レイヤー取得から新規作成までは行えたので、第１段階はクリアしたかなーと思っています。
のこライブラリの理解度が足りてないところやリファレンスに載っていないようなメソッドもありそうだったので、
もうちょっと試行錯誤してみます。

## 参考

- [pythonでPhotoshop形式のファイル（.psd）を作る - Qiita](https://qiita.com/mm_sys/items/ba139c9f4dcc0ac38156)
使ってないセキュリティグループを削除したいときに役立つTips

# はじめに
AWSで開発をしていると、いつの間にか大量のセキュリティグループが出来てしまっていることってありませんか？
新規でリソースを作る際に「一旦検証だからいいや」とかの理由で既存のセキュリティグループを選択せず、同じような設定のものが増殖していくアレです。

開発が落ち着いたタイミングでいざリソース整理をする際にどれを使っていて、どれを使っていないのかがコンソールからはパッと見てわからないのでawsコマンドとシェルスクリプトを使った抽出方法を紹介します。

# 環境
* macOS Monterey
* MacBook Pro
* チップ Apple M1 Pro
* メモリ 32GB

# 前提
* aws コマンドインストールされていること

# 抽出方法についての考え方
冒頭にも書きましたがセキュリティグループはどのリソースにアタッチしているのかがコンソールからはわかりません。
しかし、***使用しているセキュリティグループ***は基本的に1つ以上のENI（ネットワークインターフェース）と関連付きます。
つまり、セキュリティグループの一覧とENIの一覧を照らし合わせることで、削除しても良いセキュリティグループを洗い出すということです。

# やってみよう
スクリプトの中身は以下の通りです。
セキュリティグループに関連付いているENIがあればTRUE、そうでなければFALSEを書きます。
```shell
#!/bin/bash
echo "sg_id,sg_name,result"
for sg in `aws ec2 describe-security-groups --query 'SecurityGroups[].[join(\`,\`,[GroupId,GroupName])]' --output text --region ap-northeast-1 --profile default`; do
  sg_id=$(echo ${sg} | cut -d ',' -f1)

  # セキュリティグループIDを使ってENIがあるかを確認します
  eni=$(aws ec2 describe-network-interfaces --filters Name=group-id,Values=${sg_id} --query 'NetworkInterfaces[]' --output text --region ap-northeast-1 --profile default)

  if [ -n "${eni}" ]; then
    echo "${sg},true"
  else
    echo "${sg},false"
  fi
done
```
実行時に```sh [ファイル名].sh > [ファイル名].csv```などすればCSVとして出力されます。

# 注意点
このスクリプトからセキュリティグループの使用有無を判断できるのは***起動中のリソースに関連付いているもの***となります。
よって、AutoScalingGroupの起動設定に含まれるものや、ECSのタスク定義で瞬発的に稼働するものについては検知できません。

# まとめ
AWSを使っていると、いつの間にか使わなくなったリソースが増えてしまい整理に追われることはあると思います。
請求書やコストエクスプローラーを見れば使っていないリソースを確認し削除することはできますが、細々としたものはなかなか判断ができなかったりします。セキュリティグループの整理に困っている人がいれば是非試してみてください。
ComcertoのUSB完結編

FreeBSD/armがクソなのでNetBSDを使うことにしたのですが、依然USBが使えません。

普通のUSB 2.0サポートは2.0のEHCIと1.0のOHCIなどを組み合わせて使います。この場合OHCIなどはコンパニオンと呼ばれます。

しかしComcertoはEHCIしかありません。まさか2.0のサポートだけで1.0はサポートしてないのでしょうか。

USBバスにはTransaction Translator(TT)というUSB 1.0の通信を2.0に変換してくれる機能があります。この機能をhostやhubがサポートしていることがあり、Comcertoもこの機能がありました。TTがあれば通信は2.0だけにできて、EHCIだけで1.0と2.0をサポートできます。

attachでこの機能の設定を行います。

```c:m83xxx_ehci.c
       sc->sc_flags = EHCIF_ETTF;
```

またこのデバイスではusbの共有コードehci_init()以外にデバイス側のコードで初期化が必要でした。

```c:m83xxx_ehci.c
#define USBMODE         0xa8
#define USBMODE_CM_HC   3
#define USBMODE_SDIS    0x10

static void
m83ehci_init(struct ehci_softc *sc)
{
        uint32_t reg;

        reg = EOREAD4(sc, EHCI_PORTSC(1));
        reg &= ~(EHCI_PS_CSC | EHCI_PS_PEC | EHCI_PS_OCC);
        reg |= EHCI_PS_PP | EHCI_PS_PE;
        EOWRITE4(sc, EHCI_PORTSC(1), reg);

        reg = bus_space_read_4(sc->iot, sc->ioh, USBMODE);
        reg |= USBMODE_CM_HC;
        /* Set "Streaming disable mode"  to avoid Tx under run */
        reg |= USBMODE_SDIS;
        bus_space_write_4(sc->iot, sc->ioh, USBMODE, reg);
}
```

この設定に気付くまでかなり手間取りました。comcertoのSDKでLinuxのusb関係で標準のコードに修正が加わっていたのは、ehci-hcd.cとehci-sched.cでした。このうちehci-hcd.cの修正はUSBMODEに関する修正で、NetBSDのdev/usbのコードでUSBMODEの処理をみたのですが、ありません。いろいろ調べてみたところSOCの個別のコードにUSBMODEの処理があり、それをコピーしました。

このコードはimxからコピーしたのですが突っ込みどころ満載です。まず最初のアクセスはマクロなのに後のアクセスはKPIを直書きしています。またUSBMODEは初期値0でREADする必要はないと思います。またいきなりUSBMODE_CM_HCをORをとってますが、デフォルト0で値が3だからいいようなもので、マスクしてORをとるのが正しいのですが、そもそも必要ありません。

armの下に三つくらい似たようなコードがあり、最初に書いた人が上のような汚い書き方したので、そのままコピーされて汚染が広がっています。^ ^;

デバイスドライバではピットフィールドを変更するために読んで、書いてをすることがありますが、ときとして思わぬ動作になることがあるので、注意が必要です。
これをattachの時にscに登録します。

```c:m83xxx_ehci.c
        sc->sc_vendor_init = m83ehci_init;
```

comcertoのSDKでもこの部分をいじっていたので、ここをvendor毎にいじれるようなKPIにした点は評価できます。

これでUSBが見えるようになりました。

https://dmesgd.nycbug.org/index.cgi?do=view&id=6863
Integer.decode を検証

```java
    public static void main(String[] args) {
        Integer i = Integer.decode("1");  //Decimal
        System.out.println(i);
        i = Integer.decode("0xA");  //Hex
        System.out.println(i);
        i = Integer.decode("#A");  //Hex
        System.out.println(i);
        i = Integer.decode("011");  //Octal
        System.out.println(i);
    }
```
```
1
10
10
9
```
Pythonでドメイン（eTLD、eTLD+1）を抽出する方法

# はじめに
一般的にURL内に含まれるドメインには`eTLD`や`eTLD+1`などの種類があり、これらはロジックなどで判定することが難しく、ライブラリなどを用いて抽出することが多い。今回はPythonで`eTLD`や`eTLD+1`を抽出するためのライブラリ`publicsuffix2`の簡単な使い方を紹介する。

# 参考文献

https://pypi.org/project/publicsuffix2/

https://github.com/nexB/python-publicsuffix2/blob/develop/src/publicsuffix2/__init__.py


# eTLD、eTLD+1とは

https://shinkufencer.hateblo.jp/entry/2020/01/10/000000


# Publicsuffix2

## public suffixとは

`public suffix`は、`eTLD`の別名で用いられる用語で、`com`や`co.jp`など実質的に`TLD`のように機能するドメインを指す。

`TLD`内のサブドメイン構造は`TLD`ごとに異なるので、機械的に`eTLD`を決めることが難しく、`Public Suffix List (PSL)` として`eTLD`の一覧表が管理されている。

https://wiki.suikawiki.org/n/Public%20Suffix%20List#gsc.tab=0

このPSLを用いて`eTLD`や`eTLD+1`を抽出するためのライブラリが`Publicsuffix2`である。

## インストール方法

`pip install`でインストールできる。

```
pip install publicsuffix2
```

## 基本的な使い方

```Python

from publicsuffix2 import fetch, get_sld, get_tld

domain_a = 'sample.example.co.jp'
domain_b = 'test.example.com'

psl_file = fetch()

print(get_tld(domain_a, psl_file=psl_file))  # co.jp
print(get_tld(domain_b, psl_file=psl_file))  # com

print(get_sld(domain_a, psl_file=psl_file))  # example.co.jp
print(get_sld(domain_b, psl_file=psl_file))  # example.com

```

抑えておくべきは以下の3点


- `fetch`関数で最新のPSLリストを取得する
- `get_tld`関数で`eTLD`が取得可能
- `get_sld`関数で`eTLD+1`が取得可能

たったこれだけで`eTLD`、`eTLD+1`が簡単に取得できる。

※ライブラリ内には`get_public_suffix`という関数も存在するが、これは`get_sld`関数と全く一緒なので、どちらを使用しても良い。

# まとめ

一概にドメインといっても`eTLD`や`eTLD+1`などの種類があり、これらを機械的に判断するのは難しいが、`Publicsuffix2`を使用することで簡単に抽出できた。
【UiPath】対応OS WindowsでのStrConv

対応OSがWindowsレガシからWindowsに移行されて色々なものが変更されていきます。
マルチバイト文字…日本語などの取り扱い方法もその1つです。

全角➡半角や半角➡全角などをStrConv関数を使用して行っていた時にエラーが出たので備忘として回避策を残します。

StrConv関数
https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/strconv-function
変換の種類で指定した通りに変換したString型の値を返す関数です。

```vb:StrConv
StrConv("カキクケコ", VbStrConv.Narrow)
' 結果：ｶｷｸｹｺ
```


StrConvで良く調べられるエラーの種類としては大きく分けて2つあると思います。

:::note alert
VbStrConv.Wide and VbStrConv.Narrow are not applicable to the locale specified.
:::

こちらは、変換しようとしたけれど使用している言語が合ってないよというエラーです（かなりザックリですが…）。
こちらのエラーの回避方法は2つあります。
1つ目はStrConv関数にロケールIDを設定してあげる方法です。
```vb:StrConv
StrConv("カキクケコ", VbStrConv.Narrow, 1041)
```

2つ目は「System.Threading.Thread.CurrentThread.CurrentCulture」というプロパティに日本を設定する方法です。
```vb:代入（左辺値 = 右辺値）
System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo("ja-JP")
```

:::note alert
No data is available for encoding 932. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.
:::

こちらのエラーはEncode 932（Shift-JIS）に対応してないよというエラーです。
このエラーの回避方法は、「System.Text.Encoding.RegisterProvider」というメソッドに「System.Text.CodePagesEncodingProvider.Instance」を渡してあげることでエラーの回避ができます。

「System.Text.Encoding.RegisterProvider」は使えるように設定するメソッド
「System.Text.CodePagesEncodingProvider.Instance」は今の状態だと使えないものよというものを取り出すプロパティ
上記の2つを組み合わせることで、使えない状態のものを使えるようにしてあげるよという感じです。

UiPathでは[メソッドを呼び出し]アクティビティを使用することで設定できます。
![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520055/fee494da-6ffb-70ee-36f2-6c6eae416017.png)
開発用のiOS端末の追加、証明書の更新方法

## はじめに

以前、開発用のiOS端末を登録する際、
主に証明書の更新周りでつまずくことがあったため備忘録的なものとしてそのときの対応のまとめ。

## 環境
* Xcode14
* 追加対象のProfilesは作成済みの状態

## 端末の追加方法

Appleのデベロッパーサイト内、[Certificates, Identifiers & Profilesのページ](https://developer.apple.com/account/resources/certificates/list)へ移動。
左側のメニューより「Devices」を選択し、開いた画面の上部にある「Devices」の横の「＋」から端末を追加する。
![ss01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2938978/1e15e02a-a492-c3e6-4609-b327d3bd9936.png)
「Register a Device」の各項目を埋める。
* Platform
  * プルダウンで選択式なので追加するデバイスに応じたものを選択
* DeviceName
  * 任意のデバイス名を指定する。端末の名前に合わせる必要はなく、この管理画面上で識別しやすい名前にすると良い。
* Device ID (UDID)
  * 端末のUDID。端末単体では確認出来ないはずなので、PCに接続してiTunesなどから確認する。

### Profilesに端末を追加

左側のメニューより「Profiles」を選択し、端末を追加したいProfilesを開いて「Edit」を行う。

「Edit」から「Devices」の「SelectAll」をチェックするか、追加したい端末に個別にチェックをつけて「Save」する。
![ss02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2938978/52f7d503-43c5-7ab2-7cfa-01a231cda7c0.png)

以上で端末の追加自体は完了。

## 証明書の更新

このままビルドを行えばXcodeのビルド設定を見た限りでは自動で証明書が更新されるものと思っていたのですが
何もしないと旧証明書をそのまま使ってしまうようで、追加した端末でアプリを実行できませんでした。

### 参照する証明書(provisioning profiles)を更新する

一度、事前にビルドを行いxcworkspaceを作成しておく。
参照している証明書を更新するために旧証明書を削除する。
xcodeが参照している証明書は以下

`/Users/ユーザー名/Library/MobileDevice/Provisioning Profiles`

一度この中のファイルを全て削除する。
<span style="color: #ff0000; ">※念のため中身のバックアップを取っておくのをおススメします。</span>
ファイル削除後、xcworkspaceを開いて「Signing&Capabilities」を開く。
![ss03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2938978/7d125663-4ca4-3751-a2a7-5b10b2095166.png)
「Automatically manage signing」のチェックボックスを一度外し、再度チェックを入れる。
こうすることで最新の証明書が先ほどのフォルダにダウンロードされる。

※念のため`/Users/ユーザー名/Library/MobileDevice/Provisioning Profiles`内のファイルが増えているか要確認

これで後は普通にビルドを実行すれば新証明書が反映されたアプリのビルドが行えます。
「動かして学ぶ！Python Django開発入門 第2版」の開発環境をDocker, VS Code Remote Developmentでつくる

タイトルの通り、[動かして学ぶ！Python Django開発入門 第2版](https://www.amazon.co.jp/dp/B09RB1NXHY/)の開発環境をDokcer, VS Code Remote Developmentで作ったのでそのメモです。

https://www.amazon.co.jp/dp/B09RB1NXHY/

# ディレクトリ構成

```
django_book
└── .devcontainer
    ├── Dockerfile
    ├── devcontainer.json
    ├── docker-compose.yml
    └── requirements.txt
```

* django_bookは今回のプロジェクトのルートディレクトリ

# Dockerfile

```Dockerfile
FROM python:3.8
ENV PYTHONUNBUFFERED 1
RUN mkdir /app
WORKDIR /app
COPY requirements.txt /app/
RUN pip install -r requirements.txt
COPY ../ /app/
EXPOSE 8000
```

# devcontainer.json

```json
{
	"name": "Private Diary",
	"dockerComposeFile": "docker-compose.yml",
	"workspaceFolder": "/app",
	"service": "web",
	"extensions": [
		"ms-python.python"
	],
	"shutdownAction": "stopCompose"
}
```

# docker-compose.yml

```yaml
services:
  web:
    build: .
    tty: true
    volumes:
      - ../:/app
    depends_on:
      - db

  db:
    image: postgres:13.4
    volumes:
        - postgres_data:/var/lib/postgresql/data
    environment:
        POSTGRES_USER: postgres
        POSTGRES_PASSWORD: postgres
        POSTGRES_DB: private_diary

  pgadmin4:
    image: dpage/pgadmin4
    ports:
        - 8888:80
    volumes:
        - pgadmin4_data:/var/lib/pgadmin
    environment:
        PGADMIN_DEFAULT_EMAIL: pgadmin@example.com
        PGADMIN_DEFAULT_PASSWORD: pgadmin
    depends_on:
      - db

volumes:
    postgres_data:
    pgadmin4_data:
```

# requirements.txt

```python
Django==3.2.7
djangorestframework==3.12.4
django-bootstrap5==2.1.2
django-allauth==0.45.0
django-cors-headers==3.10.0
psycopg2-binary==2.9.1
Pillow==8.3.2
selenium==3.141.0

black==22.12.0
```

# 参考

https://chigusa-web.com/blog/django-docker-postgres/
React Native + Expoでできることできないこと

#React Native + Expoでできることできないこと

## メリット
* Reactでコードがかけること
* 一応、ハイブリッドでiOS、Androidが作成できる。（最終的にはそれぞれに動作検証や最適化する必要はある）
* 手軽にアプリを作成できる。
* OTAを使ってアプリ更新せずにアップデートができる

### Expo SDK(47)現在でできること
https://docs.expo.dev/versions/latest/

* 加速度計
* Apple認証
* アプリバージョン情報
* 画像などのアセット情報へのアクセス
* 非同期ストレージアクセス
* 音声
* 認証
* 動画
* バックグラウンド実行
* バーコードスキャナ
* バッテリー情報
* ぼかしビュー
* 輝度
* カレンダー
* カメラ
* スクリーンショット
* チェックボックスコンポーネント
* クリップボード
* 連絡先
* 暗号化
* 日時ピッカー
* デバイス情報
* モーションセンサー
* ドキュメントピッカー
* エラー回復（クラッシュレポート）
* 顔認識
* ファイルシステム
* Firebase
* フラッシュリスト（スクロール高速化）
* フォント
* ジェスチャ
* GLビュー(OpenGL)
* ジャイロスコープ
* Haptics(タッチフィードバック）
* 画像操作（回転など）
* イメージピッカー
* アプリ内購入
* Androidインテント
* キープアウェイク（スリープ防止）
* 光センサー
* グラデーション
* ローカル認証（顔認証、指紋認証など）
* ローカリゼーション
* 位置情報
* Lottie(アニメーションレンダリング）
* 磁力計
* メール作成
* マップビュー
* マスク（ビュー）
* メディアライブラリ
* ナビゲーションバー
* ネットワーク接続情報
* IPアドレス、MACアドレス、機内モードなど
* 通知
* 歩数計
* ピッカー
* 印刷
* 乱数ジェネレーター
* アニメーション生成
* Rootコンポーネントへの登録
* デバイスのセーフエリア情報
* 画面の向き
* スクリーンリロード
* 秘密鍵管理
* セグメントコントロール（ラジオボタン的なUI）
* センサー（モーション、向き、圧力、磁場、歩数など）
* ファイル共有
* Skia Graphics Library 
* スライダー
* SMS
* テキストスピーチ
* スプラッシュスクリーン
* SQLite
* ステータスバー
* ストアレビュー
* ストライプ（決済）
* SVG
* システムUI（ルートビューの背景色など）
* タスクマネージャー
* アップデート
* トラッキング（追跡用ライブラリ、広告ID、デバイスIDなどアプリによる追跡のリクエスト）
* ビデオサムネイル
* ビデオ
* ビューページャー
* ブラウザ
* WebView


## デメリット
* Expoでできないネイティブ機能が使えない。（カメラによるAR/VRやエッジコンピューティングなど・・・)
* ハイパフォーマンスな画面表示が求められる場合
* UIなど細かいところまでこだわる場合
* ネイティブコードを使うパッケージの場合、ハマることがある。


### 終わりに
ExpoなしでのReact Nativeは結構、面倒な気がするので、ExpoありだったらReact Nativeでもカジュアル的なアプリならいけるきがします。
やりたいこととのトレードオフになると思うので、自社アプリなど、要件が自己決定できる環境のように、できないことはできないと割り切って使う分にはいいと思います。
【断念】UniJuliusを使って音声認識を試す（with Oculus）

実装までたどりつかず、Azureですんなり構築できたのは
本当によかった、という状態です...

ということで、今回はこちらを試します。

https://github.com/Zeni-Y/UniJulius

## UniJuliusの設定
Windowsのタブに項目が追加されています。
「Open Spell Container Graph」を開きます。

![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/7720f141-76b9-4e11-d10d-684784fae4a1.png)

開いたウィンドウにて、反応させたい文言を入れます。

![dd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/084e8cf1-bb98-c3c3-8c7a-3629a2328e7f.png)

登録が完了したら、File＞Save　で内容を保存します。
![cc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/eb738bc4-fc5b-6a06-5dca-fd59ece69aad.png)

Gitに記載されているcsを作り、空のオブジェクトに貼り付けた後
先ほどSaveしていた「Spell」を入れ込みます

![ee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/45fbd126-f989-9e08-709e-67ed55107031.png)

## 実機確認
Oculusから起動すると、Windowが開かれるだけで
上手く動作できませんでした...
恐らくですが、UniJuliusの設定にあるAndroidで警告がでていたので
別途設定が必要と思われます（ｸﾞﾇﾇ

https://twitter.com/hidaka_2022/status/1607223104136437760?s=20&t=mXyqplzPgpXQNUR7czupHw
Unityクライアントゲームエンジニアの技術書紹介

本記事は Craft Egg Advent Calendar 2022 25日目の記事です
https://qiita.com/advent-calendar/2022/craftegg

【12/24】[AIでイラスト生成してみた](https://qiita.com/tsune_ce/items/b00292b5c90b010e9cf1)
【12/25】Unityクライアントゲームエンジニアの技術書紹介(本記事)

# はじめに

株式会社Craft Eggでクライアントエンジニアをしている鎌田です。

この記事では、筆者が実際に読み、社内施策でエンジニア向けに共有したゲーム・プログラミング関連書籍をいくつかピックアップして紹介します。

前半2冊はプログラミング全般で役立つもの、後半3冊はそれぞれのエンジンや分野に特化した本となっています。筆者がUnityクライアントエンジニアの為、内容はクライアント向けのものになっていますが、ご了承ください。


# リーダブルコード
https://www.oreilly.co.jp/books/9784873115658/

10年前の書籍で様々な場所でも見かけることも多いですが、良書なので紹介します。

見た瞬間に用途が理解できる名前の付け方、コメントの書き方などが、良い例と悪い例とセットで載っているためわかりやすいです。空き時間に時々見返して、自分のコーディングを見直すのも良いと思います。


# Game Programing Patterns ソフトウェア開発の問題解決メニュー
https://book.impress.co.jp/books/1114101121

キウイの表紙が印象的でかなり有名な本なため既に読まれている方が多そうですが、せっかくの技術書紹介ということでピックアップ。

GoFのデザインパターンを元に、それをゲームにどう落とし込むかまで丁寧に書かれています。また、各パターンの特徴だけでなく扱う上での注意点も書かれているので、実際の現場で使用するか否かの指針の一つとしても役立つと思います。

サンプルコードはC++で書かれていますが、C++を知らなくても他のプログラミング言語を触ったことがある人ならそこまで読むのに苦労することはないと思います。


# Unity ゲームプログラミング・バイブル 2nd Generation
https://www.borndigital.co.jp/book/22432.html

去年発売されたUnityのゲーム開発現場で役立つことを37個のトピックでまとめた本です。

内容はUnityの基本機能からFirebase, Zenject, 動画広告など、Unityやそれに関連する様々な機能を広く取り扱っています。

とにかくジャンルが多いので、基本的には自分が気になる部分だけピックアップして読む、仕事中に思い当たる節があった時に見返すなどして、少しずつ読んでいくことを推奨します。

鈍器と呼んでも差し支えないほどにはページ数が多いので、出来るなら電子書籍で購入する事をオススメします。


# FFXVの人工知能 -ゲームAIから見える未来-
https://www.borndigital.co.jp/book/14172.html

3年前くらいに発売された本で、FFXVの各所で使われているAIをどのように考案しツール作成を行なったかが書かれてします。

PQS, ステートベース, ビヘイビアツリーなど、実際に使用されている基本的なAIアルゴリズムの説明も図で説明されているので、FFXVプレイ済み or ゲームAIに少し興味がある人にかなりお勧めできます。
(ゲーム画面やゲーム制作ツールの画像が多めなので、AIにあまり興味なくても単純に見応えあり)

個人的にお勧めの章は10章:写真AIです。


# 実践ゲームUIデザイン コンセプト策定から実装のコツまで
https://www.shoeisha.co.jp/book/detail/9784798171821

内容としてはUIデザイン〜ゲーム内への実装までの流れが書かれています。
デザインだけでなくファイル命名規則の重要性・デザイナーとエンジニアがそれぞれどの作業まで担保するかなど、実際のゲーム制作現場あるある話が多いためかなり読みやすいです。

チャプターの最初にどのセクションが関わるかが書いてあるので、最初はエンジニアの部分だけ読むのも良さそうです。


# おわりに
一口にクライアントエンジニアと言っても、グラフィック・サウンド・ゲームロジックなど分野は多岐に渡るので、書籍から技術を学ぶ場合は、自分の興味のある分野の本から読んでみる方が、モチベーションも保ちやすいので良いと思います。

今回は社内施策で共有した技術書籍の一部を紹介しましたが、一つでも興味がある本が見つかれば幸いです。
DBに格納されているjson形式のオブジェクトデータをtwigのループで回す

忘れるんでメモ

## エンコード結果がオブジェクト形式だとtwigで回せない。

配列にキャストする。
```php
class HogeEntity{

private value $json_data;

public function getJsonData()
{
    return (array)json_decode($this->json_data);
}
```
LPI PDUについて

こんにちは

Linuxが好きで、勉強しようと思い、まず資格LPICを取得しました。その後、メンバーシップに参加しました。

が、そのメンバーシップでいまいち何をしたら良いかわからず、迷いました。
少し考えてみると、何か行動を起こしてPDUを貯めればよさそうです。

PDUについての記事がネット検索しても、いい感じのものが見当たらなかったので、自分の経験を残していこうと思います。

１　オープンソースカンファレンス

２　LPIC勉強　

３　他の資格を取得

当初、20ポイントを獲得することを目指していきたいと思います。

2022/12/26 開始

この記事を書いたことでもPDUの対象となりました。

2023/01/11 追記

Udemyで講習を受けたことでとうとう２０突破しました！しかし特にメンバーページには変化なさそう

2023/01/16 追記
Goで何を実装してるか

## 概要
現在自分が開発しているプロダクトでは、メインの言語にGoを採用している
なぜGoを選定して、Goで何を開発しているかを書く

## API
他の言語でも問題ない部分ではあるが、GoでAPIを書く上で特に困っている点はない
フレームワークにGinを採用したが、標準パッケージだけでも問題なく実装できる

https://gin-gonic.com/

Swaggerドキュメントが生成できて、Swagger UIも使えるのでswagは便利

https://github.com/swaggo/swag

## CLI
Cobraがめちゃくちゃ便利
クロスコンパイルもできるので、今のところGoがCLIを作るのに一番快適

https://cobra.dev/

## Kubernetesのカスタムコントローラー
これがGoを選定した最も大きい要素
Kubernetesのカスタムコントローラーを実装するなら基本的にはGoを選定することになると思う
フレームワークとしてkubebuilderを使用している

https://book.kubebuilder.io/
お客様のデータを先祖返りさせた話

この記事は「[本番環境でやらかしちゃった人 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/yarakashi-production)」の23日目の記事です。

私が新卒入社１年目にやらかしたことで、未熟さが大いに表れたミスであり、なんでこんな当たり前のことをやってないの？と思われるかもしれませんが、これから新卒として働き始めるエンジニアたちへの反面教師になればいいなと思い、投稿させていただきます。

## どんな惨劇が起こったのか
当時私はいわゆるSIer企業に勤める1年目プログラマーでした。
業務内容は主にお客様が業務中に使用するデータ分析アプリの開発でした。
このツールには週次、月次、年次で行う必要のあるデータ更新作業があり、今回の惨劇はその週次作業で発生したものとなります。
データ更新作業はそれ専用のGUIツールが存在し、基本的にはそれのUI上から今回更新する必要のある週を選択し、実行するだけのツールとなっています。週選択は「yyyy/ww」形式のプルダウンから選択するものとなっており、今回も毎週のように対象の週を選択したことを確認し、実行ボタンを押しました。
バッチが流れ始めたことを確認し、私は先輩と共にランチへと向かいました。
楽しいランチの後、仕事場へ戻ると、電話対応をしている社員がおり、何やら深刻そうな話をしていました。
なんだか嫌な予感がしつつも、パソコンのスリープを解除し、ツールを確認した私は驚きました。
「ぜんぜん違う週のデータ更新してるやん」
このツールのデータ更新作業は簡単に言えば一度全てのデータを削除し、最新週までのデータを作り直すというものなのですが、ツール上で誤って数週間前の週が選択されており、結果、分析ツールで表示できる情報が数週間前に先祖返りしていたのでした。
電話はお客様からのクレームだったのです。

## 惨劇はなぜおこってしまったのか
実はこの日、月次の更新作業も午後に行う必要があったのですが、何を勘違いしたのか私は週次の更新ツール上で月次の更新作業で選ぶべき年月を年週として選択して実行していたのでした。
UI上は年月も年週もスラッシュ区切りの数字6桁であり、また週次、月次のツールの見た目が酷似していたため、自分がやっていることのおかしさに気づけなかったのです。
また、この更新バッチがおよそ30~40分ほどかかるため、毎回流した後にランチに出ていたのですが、この日はお客様がこちらの完了後検証が終わる前にアプリを触ってしまい、クレームにつながりました。

## どのように復旧したのか
お客様に現在の状況を説明の上、ツール上で本来選ぶべきだった年週を選択し、再度更新処理を走らせ、アプリ上の表示が問題ないことを確認しました。
先祖返りしていた状態でアプリを触ったのはクレームを入れたお客様一人だけだったので、そこまで大事にならなかったのが幸いでした。

## 惨劇を起こさないためにできること
### 実行前にダブルチェックを徹底する
まずはこれに尽きると思います。実行ボタンを押す前に他のメンバーと一緒に問題ないことを確認するべきでした。特にお客様の分析業務に大きな影響を与える作業であったため、これを怠ったのは非常にマズイです。

### バッチの完了・更新後検証を行わずに長時間離席しない
更新バッチを流した後、すぐにランチのため離席していましたが、これもあまりよろしくないです。データ更新に異常があった場合に発見が遅れ、影響範囲が拡大する恐れがあります。

### プルダウン選択値が想定外のものになっていないかツール側でチェックする
今回のケースですと、現在のデータの最新日付を確認し、それ以前の年週が選択された場合はそもそも実行させないというような実装をツール側にしておけば、防げた問題ではありました。人の手が介在する作業にはどうしてもヒューマンエラーが付き物なので、プログラムで防げる部分はできるだけ機械に任せたいところです。
そもそもプルダウンで週選択をさせる必要もなかったのではないかと今では思います。

### 週次のツールなのか月次のツールなのか見た目ですぐにわかるようにする
週次のツールと月次のツールの見た目が酷似していたことも一因なので、見た目ですぐに判別できるようにしたいです。実際このやらかし後、ツール上に「これは週次のツールです」のようなクソデカ赤文字が表示されるように改修されました。

### お客様へのメンテナンス時間の周知を徹底する＆メンテナンス中にアプリを触られても問題ないようにする
今回検証作業前にお客様がアプリを触り、クレームに繋がったわけですが、明示的にこの時間に更新作業を行いますよという合意が取れていませんでした（もしくは御偉方の間では取っていたのかもしれませんが、お客様側に十分に周知されていませんでした）。
またお客様がメンテナンス時間内に触ってもいいように、メンテナンス中である旨をアプリ上に表示する、もしくは可能なら更新検証が終わったのちにデータを本番反映できるような仕組みを導入するようなことができればベターだなと思います。

## おわりに
正直、見直した方がいいことがまだまだたくさんあると思いますが、キリがないのでここまでとします。
新人の頃にはとんでもないミスを犯してしまうこともあるかもしれませんが、人は何かしら必ずミスをする生き物です。
結局はそこからどう学んで今後に活かすかが大事だと思います。
いつの日かそんなミスも笑い話の一つとして語れるようになったら、ある意味成長できた証なのかな？と思います。
ローカルリポジトリの削除方法

## Gitコマンド操作
この記事は学んだことのアウトプットを目的として書いています。

### .gitディレクトリと.gitリポジトリの違い
ディレクトリとは「ファイルを格納する入れ物」を指す一方、リポジトリとは「ファイル等のバージョン管理を行う場所」を指します。
この記事では言葉の意味を鑑みたうえで、.gitディレクトリを.gitリポジトリと呼んでいます。

### .gitリポジトリを削除
ローカルリポジトリを削除することと、.gitリポジトリを削除することは同義です。

今回参照したのは[【Git公式】git-rm Documentation](https://git-scm.com/docs/git-rm/2.34.0)
リンク先はバージョン2.39.0対応のページなので、Gitのバージョン確認は忘れずしてください…

.gitリポジトリの親ディレクトリに移動し、Gitでコマンド`$ rm .git`を打ってみると
```
$ rm .git
rm: cannot remove '.git': Is a directory
```

.gitリポジトリを削除できません。
`'.git': Is a directory`とあるので、オプションなしでディレクトリは消えないのかな…？（誰か教えて）

### 削除されたことを確認
ということで、オプションを追加します（[参照元](https://stackoverflow.com/questions/1514054/how-do-i-delete-a-local-repository-in-git)）。

```
$ rm -fr .git
```
これで.gitリポジトリが消えました。

念のため確認します。

```
$ ls -lah
```
.gitリポジトリが表示されなければOKです。

>各オプションの説明
>**-f** 最新状態のチェックを無効化
>**-r** 先頭のディレクトリ名が指定された場合、再帰的な削除を許可。今回はリポジトリ名が`.git`と一致するディレクトリを全て削除、という意味



以上となります。

間違いなどあればコメントいただけると嬉しいです。
DynamoDBのデータ一括変更が難しい件

# はじめに
今回の見出しに至った経緯として、業務内でDynamoDBに存在するテーブルに対して、
ある値を持ったデータのみにカラムを追加する必要があった。
# 本題
大量実行する際、BatchWriteItemという処理を用いることで多少早くなる模様。
しかし、最大25個まで、サイズ制限は全体で1MB。
処理としては削除と登録のみになる。

調べた限りDynamoDBには大量実行する方法として、BatchWriteItemしか存在しなかった。
更新処理がないとすると、<br>地道に対象のデータ件数分、主キーで条件指定し、更新していくしかないと思われる。
Shellでクリスマスツリーを表示～tput・chmod～shellの勉強～

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2377776/1ba699ee-ad1f-79c8-4097-122566c4bf6b.png)

**バリバリこの記事を参考にさせていただきました**
ありがとうございます。

https://qiita.com/SpiceOfLife/items/77ffd4165122b386c746

# 1. Dockerを立ち上げる

# 2. Dockerfileのあるディレクトリ内で、tree.shを作成する

```shell:tree.sh
#!/bin/bash
trap "tput reset; tput cnorm; exit" 2
# ↑ Ctrl+C が押されたときに、前の画面に戻れてカーソルも表示されるようにする
clear # 画面をきれいにする
tput civis # カーソル非表示
lin=2
col=$(($(tput cols) / 2))
c=$((col-1))
est=$((c-2))
color=0 # 文字色を変えるための変数
tput setaf 2; tput bold
# 文字を緑色     ↑ 太字

# 緑の木を作成
for ((i=1; i<20; i+=2))
{
    tput cup $lin $col # 上から$col行目左から$lin文字目にカーソル移動
    for ((j=1; j<=i; j++))
    {
        echo -n \# # -nは改行をしない
    }
    let lin++
    let col--
}

tput sgr0; tput setaf 3
# ↑ 装飾解除 ↑ 文字を黄色

# 木の幹の部分
for ((i=1; i<=2; i++))
{
    tput cup $((lin++)) $c # 上から$c行目左から$((lin++))文字目にカーソル移動
    echo 'MWM'
}
tput setaf 1; tput bold
# 文字を赤色     ↑ 太字
tput cup $lin $((c - 6)); echo MERRY CRISTMAS
# ↑ 上から$((c - 6))行目左から$lin文字目にカーソル移動
let c++
k=1

# ツリーを光らす
while true; do # ずっと繰り返す
    for ((i=1; i<=35; i++)) {
        [ $k -gt 1 ] && {
            tput setaf 2; tput bold
            # 文字を緑色     ↑ 太字
            tput cup ${line[$[k-1]$i]} ${column[$[k-1]$i]}; echo \#
            unset line[$[k-1]$i]; unset column[$[k-1]$i]
        }

        li=$((RANDOM % 9 + 3))
        start=$((c-li+2))
        co=$((RANDOM % (li-2) * 2 + 1 + start))
        tput setaf $color; tput bold # $colorのの中身は毎回変わっていく
        tput cup $li $co
        echo \* # ランダムに光るときのo
        line[$k$i]=$li
        column[$k$i]=$co
        color=$(((color+1)%8))
    }
    k=$((k % 2 + 1))
done
```

`tput`コマンドについては、こんな記事がわかりやすかったです。

https://qiita.com/onokatio/items/5d282b72ac5565ae4569

# 3. `chmod a+x tree.sh`
`chmod`コマンドは、ファイルの権限の設定コマンドです。
意味は、
`a`: すべてのユーザー(allのこと)
`+`: 権限を追加
`x`: 実行権限

つまり、すべてのユーザーが`tree.sh`を実行できるようにしています。

`chmod`コマンドについてまとめました。

| どのユーザーに | 権限をどうする | ○○の権限を |
|:-:|:-:|:-:|
| `u`（オーナー） <br> `g`（所属グループのユーザー） <br> `o`（その他のユーザー） <br> `a`（全てのユーザー）| `+`（権限を追加 <br> `-`（権限を削除） <br> `=`（指定した権限のみ） | `r`（読み込み権限） <br> `w`（書き込み権限） <br> `x`（実行権限） |

また、現在のファイルの権限は、
`ls -l tree.sh`
で、出力された、最初の10桁の文字列で確かめられます。
試してみると、`-rwxrwxrwx`と出てきたと思います。
これらは、`-` `rwx` `rwx` `rwx`という、4つの部分に分けて考えます。
最初の`-`は、ファイルタイプが、「ファイル」であることを示します。
次の3桁は、オーナーの権限を示します。
`r`, `w`, `x`の全てが表示されたので、すべての権限を持っています。
その次の3桁は、グループの権限で、
最後の3桁は、その他のユーザーの権限です。

そして、ユーザーの権限を持っていない所は`-`で示されます。

例えば、
`-rw-r--r--`と表示された場合は、
`-` `rw-` `r--` `r--`と考えるのですが、
オーナーの権限は、「読み込み」と「書き込み」はできますが、`x`があるはずの部分が、`-`となっているので、「実行権限」は無いのです。

グループの権限、その他ののユーザーの権限は、`r`とあるので、「読み込み」はできますが、`wx`があるはずの部分が、`--`となっているので、「書き込み権限」と「実行権限」は無いというわけです。です。

# 4. `./tree.sh`でプログラムを実行

きれいなツリーが描かれました！

# 最後に

ツリーの表現に用いる文字列や、
[先ほど紹介したtputについての記事](https://qiita.com/onokatio/items/5d282b72ac5565ae4569)を参考にして、ツリーの色などを、カスタマイズしてみてください！
良いツリーが出来たら、コメント欄でも画像貼れそうなので、コメントしてみてください！

ありがとうございました！
【悪用厳禁】超お手軽にzipファイルのパスワードをクラッキングする方法

# 実行環境
M1 Macbook (Ventura 13.0.1)

# John the Ripperとは
https://github.com/openwall/john

## インストール
今回は手軽にhomebrewを使用します。
`john` もインストール可能ですが、 `john-jumbo` じゃないと `zip2john` が使用できないため注意。
```bash
$ brew install john-jumbo
```

基本は下記の場所に `zip2john`などの実行ファイルが存在しますが、バージョンなどの問題で変わる可能性があるので適宜変更してパスを通してください。
```bash
export PATH=$PATH:/opt/homebrew/Cellar/john-jumbo/1.9.0_1/share/john/
```


## 使用
```bash
$ zip2john xxx.zip > xxx.zip.hash

$ john xxx.zip.hash --incremental=ASCII
```

## 実行結果
ここではパスワード `abcd1234` が出力されました。
`--show`オプションをつけるともっと見やすいみたいです。

```
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
abcd1234           (credentials.zip/credentials/token.txt)
1g 0:00:00:49 DONE (2022-12-26 11:20) 0.02008g/s 11589Kp/s 11589Kc/s 11589KC/s 3b88og..3b8dh5
Use the "--show" option to display all of the cracked passwords reliably
Session completed
```
AWS SSM RunCommandを利用してlambdaからEC2インスタンスを操作する

# 目標
オートスケールで動かしているEC2インスタンス全てに対してLambda関数を実行することで、SSM RunCommand経由でコマンドを実行する

# ドキュメント
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ssm.html

# lambda関数の作成
ランタイム: Python3.9
アーキテクチャ: x86_64

# コード
```
import boto3
def lambda_handler(event, context):
    boto3.client('ssm').send_command(
        Targets=[{'Key':'tag:Name', 'Values': ['ssm-test']}],
        Parameters={
            'commands':[
                'touch test.txt'
            ],
        },
        DocumentName='AWS-RunShellScript',
        TimeoutSeconds=600,
        ServiceRoleArn='arn:aws:iam::123456789:role/service-role/ssm-test-role',
        NotificationConfig={
            'NotificationArn':'arn:aws:sns:ap-northeast-1:123456789:ssm-topic',
            'NotificationEvents': [
                'All',
            ],
            'NotificationType': 'Command'
        }
    )
        

    return {
        'statusCode': 200,
        'body': 'Success'
    }
```

# アクセス権限の調整
作成した関数につけている実行ロールを以下の内容で更新
・ロールの許可ポリシーにインラインポリシーを追加
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ssm:SendCommand",
                "iam:PassRole",
                "sns:Publish"
            ],
            "Resource": "*"
        }
    ]
}
```

・SSMへの譲渡権限を追加
``` 信頼されたエンティティ
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "lambda.amazonaws.com",
                    "ssm.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

# メモ
・対象のEC2のインスタンスロールに「AmazonEC2RoleforSSM」が必要
・SSM実行時のカレントディレクトリのデフォルトは /usr/bin 
・実行したコマンドは AWS Systems Manager -> Run Command のコマンド履歴から参照可能
・対象をオートスケールインスタンスにしたい場合はこれでok
```
Targets=[{'Key':'tag:aws:autoscaling:groupName', 'Values': ['ssm-test']}],
```
・Targetsの指定が合っているのに認識されない場合は「/var/log/amazon/ssm/amazon-ssm-agent.log」にエラーメッセージが出力されているかも
・一度エラーになると原因を解消しても、再起動しないと認識されないままなので「systemctl restart amazon-ssm-agent」で再起動を行う
Webスクレイピングで情報収集をした際に、<!-- -->が表示されて情報収集できなかった時の対応方法 (スナガクのポートフォリオ作成日記)

# 自己紹介
こんにちは！
記事をご覧いただきありがとうございます。
スナガクと申します。

転職などのためにポートフォリオを制作しています。
言語はPythonで、基本的な文法は、本などで学習した者です。
分からないことだらけで、悪戦苦闘中ですが、頑張ります！
同じ初心者の方の助けになれば、幸いです！

# 今回のゴール
Webスクレイピングを用いて情報収集を行った際、欲しい要素の情報が「＜!-- --＞」と表示され、上手く情報収集が出来ない。

# 生じていた問題
下記ブログ記事を参考にさせて頂きました。
https://tkstock.site/2022/08/20/python-selenium-pagesource-beautifulsoup/

結論から言うと、requests.getだと、非同期情報の習得が出来てないから、になります。

少し非同期情報と非同期処理の説明をします。
まず、Webスクレイピングの考え方についてです。
パソコンからWebサーバーに、「HTMLの情報を取得したい」とリクエストを投げます(コードでは、requests.getに相当する)。そして、その情報を受け取る、という流れです。
その際、取得にかかる時間は、情報ごとに異なります。
(文字だけか、画像も表示するかで、処理する速度が変わるのと同じ)
ここで、Webサイトの多くは、「とりあえず読み込めた情報から表示していけ」という指示を出します。これが、【非同期処理(順番に情報を読み込まず、手当たり次第に表示させる)】になります。（なぜ非同期処理を行うかは、記事の最後に記載しています）

そうです、requests.getだと、この「すぐに読み込めた情報」しか習得できない、という事になります。だから、＜!-- --＞と表示されて、上手く取得できないのです！
（と、予想しています）

# 具体的な行動
結論：Seleniumを使ったスクレイピングに切り替える or Seleniumのブラウザが表示しているサイトのHTMLを取得して、それをBeautifulSoupで解析する（requests.get()の代わり）

コード(後者の場合)
```python
import time

from selenium import webdriver 

~~~
(ライブラリの読み込みとか基本設定は環境で代わるので省略)
~~~

# SELENIUMでサイトにアクセス
driver.get("http://~~~")

# 非同期処理の情報が表示されるまで待機
time.sleep(5)

# Seleniumのブラウザが表示しているサイトのHTMLを取得
html = driver.page_source


# 取得したHTMLをBeautifulSoupで解析できろようにする
from bs4 import BeautifulSoup
soup = BeautifulSoup(html)
```
＊上記ブログから引用させて頂きました

# おわりに
「＜!-- --＞」の対処するために記事が無かったため、投稿させて頂きました。
また、SeleniumとBeautifulSoupの組み合わせも知っておいて損はない、のかもしれません。

余談
非同期処理を行う理由
順番に情報を読み込む場合だと、一つ時間がかかる処理があれば、その段階で処理が止まったように見える。すると、Webサイトを訪れた人は、画面がフリーズした！と思って、サイトから離れてしまう、だから非同期処理を行っています。 

#作成する予定のポートフォリオ詳細
制作するポートフォリオの内容は、
Djangoを使ったWebアプリケーションです！
Webアプリケーションの中身は、
It技術の最新情報・トレンドを確認できる、そんなサイトです。
時間がない、ご多忙なエンジニアの方でも、
意欲があれば、このサイトを見て勉強できる。
また、トレンドの情報を自ら投稿し、周りとも共有できる。
そんなサイトを作れば、周りの方に貢献できるかな？
と思っています！

具体的な方法は、
Webスクレイピング等を用いて、
最新技術や、気になるトピックを一目見て確認できる。
そんなサイトです！
また、機能は順次追加していければ、と思っています！

更新頻度は、1週間に1～2回になると思います！
（2022/11/12　現在）

見守って頂けると幸いです！
ご指導、ご鞭撻のほど、よろしくお願いいたします。
rails db:migrateのエラーについて（StandardError: An error has occurred, all later migrations canceled:）

## はじめに
エラーの対処法メモ。

```
== 20221226020652 DeviseCreateUsers: migrating ================================
-- create_table(:users)
rails aborted!
StandardError: An error has occurred, all later migrations canceled:
以下、続く
```
この記述はエラーが出たのでマイグレーションをキャンセルしたという記述。
この後の記述でエラーの詳細を見ます。
## 原因
```
                略
Mysql2::Error: Invalid default value for 'hoge'
                略
ActiveRecord::StatementInvalid: Mysql2::Error: Invalid default value for 'hoge'
                略
Mysql2::Error: Invalid default value for 'hoge'
```
デフォルトの値が無効だとのこと。

```
t.date :hoge,      null: false, default: ""
```
公式によるとdate型は`MySQL は、DATE 値を'YYYY-MM-DD'形式で取得して表示します。`とあるので`default:""`が原因でした。
以下、公式
[11.2.2 DATE、DATETIME、および TIMESTAMP 型](https://dev.mysql.com/doc/refman/8.0/ja/datetime.html)
## 解決策
```
t.date :hoge,      null: false
```
`default:""`を消してから　`rails db:migrate`

```
== 20221226020652 DeviseCreateUsers: migrating ================================
-- create_table(:users)
   -> 0.0527s
        略
== 20221226020652 DeviseCreateUsers: migrated (0.0799s) =======================
```

```
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20221224075426  Create hoges
   up     20221226020652  Devise create users
```
無事にマイグレーションファイルが設定されました。


## 終わりに
カラム型：dateは初めて使うのでうっかりしてました。
db:resetなど余計なことをしましたが、しっかりエラー文を読んでいこうと思います。

参考サイト
https://qiita.com/yuya_maru2/items/b839af0b60d8096ecf49
クリスマスイブにAWS SAPを受けたんですよね。

# 初めに
クリスマスイブに`AWS Certified Solutions Architect - Professionalonal` を受験してきました。
2年半前にSAAを取得、その後はAWSにかかわる業務は全くなく、転職を機にAWSに触れることが多くなったので、自己研鑽のためにSAP受験を決めました。

会社でSAP取ります宣言をしたのに、準備が遅くなりすぎてこんな日に試験を受けることになったのです。

この記事は、受けると決めてから試験までの記録です。

## 2022年内に受験することを決意
今年の8月末ごろでしたか、SAPの受験を決めました。
背景としてはこんな感じ
- SAAの期限が2023年の春先で切れるやん
- AWSを業務で使うようになったし、がっつりキャッチアップしないとやばい
- ずっとprofessional資格は欲しいと思っていた

こんな感じで受験を決めたわけですが、
**AWSの進化＋SAA取ってからAWSにあまり触れていなかった期間＋危機感のなさ**
により、かなりしんどい道のりを歩むことになりました。。。

## 8月～11月前半
このころはまだ状況のやばさに気づいていません。
会社で開催されているSAP勉強会に出席し、気が向いたときにBlackbeltを読む、ゆるふわな勉強しかしませんでした。
心のどこかに1か月ガチればいけるでしょっていう謎の余裕もありました。
スイッチで[カービィのゲーム](https://www.nintendo.co.jp/switch/arzga/index.html)を買ったこともあり、そっちに情熱を注いでいました。
カービィかわいい。

## 11月後半
ここでやっとUdemyの模擬試験を受けてみました。
結果は・・・***正答率65%***
模擬試験を受けながら、わからない問題が多すぎてちょっと泣きそうでした。
でも意外と正答率高くて、「あ、いけるやん」となりました。
このころカービィを全クリしました。
カービィかわいい。カービィありがとう。

## 12月頭
謎の余裕を携えたまま、2回目の模擬試験を受けました。
結果は・・・***正答率47%***
模擬試験を受けながら、わからない問題が多すぎてちょっと泣きそうでした。このときは少し泣きました。
泣くとスッキリするという説もありましたが、なんにもスッキリしません。

そして、その数日後体調を崩し、熱は出るわ咳は止まらんわ な状態。
正直勉強どころではなかったので1週間滞りました。

そんななか、早く試験予約しないと年内に受験できないという話を聞き、薄れゆく意識の中で試験の予約をしました。
全然空いてなくてクリスマスイブになりました。

## 12月半ば
明確な期限が決まってやっと、そろそろ本腰入れて勉強しなきゃやばいと思い始めます。
使ったのは以下の教材。
- Udemyの模擬試験集（全5回）
- AWS公式の模擬試験
- Techstock
- Blackbelt

Techstockさんに課金してひたすら問題を解きました。
仕事がある日はまとまって3時間は確保しづらいので、一問一答形式のTechstockはとても助かりました。
間違えたらBlackbeltを読む。これの繰り返し。
ある程度問題を解いたらUdemyの模擬試験を受ける。撃沈する。これの繰り返し。
全5回のうち模擬試験の結果は以下の通り。
| 受けた模擬試験 | スコア |
|:-:|:-:|
| 模擬試験① | 65% |
| 模擬試験② | 47% |
| 模擬試験③ | 49% |
| 模擬試験④ | 46% |
| 模擬試験⑤ | 47% |

毎回心を折られました。
5回目の模擬試験を終えた時点で、試験まで残り3日。
来年がんばろ、とはなぜか思ってなかったです。あと3日でどう合格ラインまでもっていくか、これを考えてました。

ここからは問題を解くのをやめました。
過去の模擬試験から苦手なサービスや問題の傾向が分かっていたので、それに関連するサービスをBlackbeltなどでしっかり読み直す。
情報が古いものもあるので、新しめの記事もいくつか読む。これをずっとやってました。
自分はAWSとオンプレのハイブリッドアーキテクチャやオンプレ⇒AWSへの移行とかが苦手でした。

## 本番前日の夜
AWS公式の模擬試験を解きました。
結果は正答率55％
さすがにメンタルに来ました。
でもやっと50％を超えました。集中して勉強したサービスの問題があまり出てきませんでした。。

## 本番
試験は午後。早起きして今までの模擬試験や練習問題の復習をしました。
街はクリスマス一色です。
試験会場には、ムズカシイ顔をしながらマウスをカチカチする妙齢の男性が数名。
闘う人は皆かっこいいのだと思いました。

試験開始。
自信がない問題には後で見直すフラグを立てておいて、どんどん解いていきます。
1時間弱を残して、最後まで解き切りました。
フラグを立てた問題は75問中52問。
見直せない量です。正直詰んだと思いました。
折れそうな心をなんとか繋ぎ止め、頭から問題を見直していきます。
2回目見ると、1回目よりも冷静に問題文が読めて、選択肢が絞れる問題もそこそこありました。
1周目は冷静になり切れない部分もあると思うので、見直しは必須だと思います。


試験終了。やり切りました。
自信はちっともなかったです。
そこはかとない疲労と不安感、そして少しの達成感を抱えて試験会場を後にしました。

## 本番後
クリスマスだし、そこそこ頑張ったよなと思い、Parabootで欲しかった靴を買いました。

買い物を終えて帰りの電車の中、iPhoneの通知にAWSからメールが一通。

合格でした。

電車の中でしたが、小躍りしてしまいそうになりました。



ちょっとしました。


## 試験を終えて
合格はしたものの、力がついたとはあまり思っていません。
これから実務で使って力をつけていきたいです。

とはいえ、資格取得を目指して勉強することは非常に良いキャッチアップになります。
AWSのほかの資格も受けていけたらと思います。

おわり。
tkinterを使って、エクセルファイルを選択⇒読み込む

<h1>概要</h1>
簡単なファイル選択&データ読み込みをTkinterとpandasを用いて実行する。
複数のファイルを選択することも可能だが、今回は１つずつ選択すること想定する。


<h1>python コード</h1>
import tkinter as tk
import tkinter.filedialog
import pandas as pd

def dialog_test():
    # ルートウィンドウ作成
    root = tk.Tk()
    # ルートウィンドウの非表示
    root.withdraw()
    # ファイル選択
    filetypes = [("データファイル", "*.xlsx *.xlsm *.csv"), ("Excel ブック", "*.xlsx"), ("Excel マクロ有効ブック", "*.xlsm"), ("CSV (コンマ区切り)", "*.csv")]
    target_file = tkinter.filedialog.askopenfilename(filetypes=filetypes, title="ファイルをひらく")
    read_xlsm(target_file)
    
def main():
    dialog_test()
    
def read_xlsm(filename):
    print("読み込みを開始します")
    print(filename+"を読み込みます")
    df = pd.read_excel(filename,index_col=0)
    print(df)
    print("読み込みを完了しました")

<h1>実行画面</h1>
今回はファイル選択ダイアログが表示されるだけなので、割愛させていただきます。

<h1>参考HP</h1>
ほぼこちらでは、複数選択する方法も載ってます。
https://ito-room.com/python-filedialog/
GoogleのRust勉強用ページ

# Rust Comprehensive
Rust comprehensive というGoogleが作った
Rustの勉強用サイトなるものが存在するみたいですね。

https://google.github.io/comprehensive-rust/

day1から順を追って見ていっていますが、なんというか
Rust特有の部分をうまくまとめておられて非常に勉強になりますね。

exerciseが結構難しく苦戦しています。
Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「Azure ADのエディション」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「Azure ADのエディション」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure での ID とガバナンスの管理](https://learn.microsoft.com/ja-jp/training/paths/az-104-manage-identities-governance/)
◇対応するモジュール
[Azure Active Directory のエディションを選択する](https://learn.microsoft.com/ja-jp/training/modules/configure-azure-active-directory/5-select-editions)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「AD DSとAzure ADの比較」](https://qiita.com/fsd-jume/items/e017f120a61e93b3f5e1)

## Azure ADのエディション
### Azure ADのエディション比較
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/94ad6314-4b3d-7143-4e2f-76a4e871e1c4.png)
**※1. ハイブリッドID**
オンプレミスやクラウドに関係なく、すべてのリソースに対する認証と承認のための共通ユーザID
**※2. Identity Protection**
IDベースのリスク検出や修復の自動化、リスクの調査、結果を他ツールへエクスポートが可能

### Azure ADの各エディション
**◆Azure AD Free**
**AzureやDynamics365、Power Platformなどクラウドサービスのサブスクリプションに含まれている無料のライセンス**
・提供機能(一部)
　-ユーザ/グループの管理
　-オンプレミスのADと同期
　-基本的なレポート
　-クラウドユーザのセルフパスワード変更
　-SSOアクセス(Azure、Microsoft365、一般的なSaaSアプリでサポート)

**◆Azure AD Microsoft 365 Apps**
**Microsoft365に含まれている無料のライセンス**
・Freeからの追加機能(一部)
　-Microsoft365アプリ用のID/アクセス管理
　-クラウドユーザのMFA
　-クラウドユーザのグループアクセス管理
　-クラウドユーザのセルフパスワードリセット

**◆Azure AD Premium P1**
**有料のライセンス(Microsoft365 E3にも含まれている)**
・Freeからの追加機能(一部)
　-オンプレミスとクラウドの両方にアクセス可能なハイブリッドID
　-動的グループ(ルールに基づくユーザアカウントの自動追加や削除機能)
　-セルフサービスグループ管理
　　(グループ自体の委任やグループに対するアクセス権のセルフサービス化など)
　-Microsoft Identity Manager(ID/アクセス管理の強化機能)
　　⇒オンプレミスユーザによるセルフサービスパスワードリセット(=ライトバック)が可能

**◆Azure AD Premium P2**
**有料のライセンス(Microsoft365 E5にも含まれている)**
・Free/P1からの追加機能(一部)
　-Identity Protection
　　(アプリや重要な企業データへのリスクベースの条件付きアクセスを提供可能)
　-Privileged Identity Management(PIM)
　　⇒必要に応じてJust-In-Timeアクセスを提供可能

## 次の学習内容
**◆Azure ADへの参加**

https://qiita.com/fsd-jume/items/1036ba45568d4beaf323

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
"Vimってなに？" から始めるVim

## はじめに
初めてのVimしたので調べたその内容をお届けします。
半年経ってCLIには慣れたつもりだったんですが、何も知らず、コマンドを流すだけでは動いてくれないVim君に苦慮したので記事に起こします。


### 目次
#### 1. Vimってなに？
#### 2. モードについて
#### 3. コマンド一覧

## Vimってなに？
- Vimは1992年生まれのテキストエディタ
- 基本的にCUI上で動作し、UNIX系OSでは標準搭載されている
- 4つのモードを切り替えて、ファイルの閲覧や編集を行う

この様にVimの歴史は古く、GUIを必要とせず、またキーボードのみで操作を行うことができるという特徴がある。
この特徴により、VSCode等の高機能なエディタに慣らされた筆者は大変苦しめられる事となった。


## モードについて
Vimには複数のモードがあり、そのモードを適宜切り替えて操作を行います。
このモードの概念を理解すると急にVimが怖くなくなります。

→ 他にもモードがありますが使用するものだけ。

|モード名|できること|
|---|---|
|insert（挿入）|テキストの編集・追加・削除|
|visual（ビジュアル）|テキストの表示・選択|
|command（コマンド）|各種コマンド（ファイルの保存やVimの終了）等が行える|

### ファイルの開き方
```vim 
vim ファイルディレクトリ/ファイル名
```
でファイルを開くことができます。

### insert（挿入）モード
初期のファイルを開いた状態から`i`キーや`a`キーを押すことでこのモードに遷移します。
このモードでは通常のテキストエディタの様にテキストファイルの編集が行えます。


このモードに遷移するとウィンドウ下部に下記のような表示がされます。
insertモードを抜けるためには`ESC`キーを押します。

```
-- INSERT --
```

### visual（ビジュアル）モード
初期のファイルを開いた状態から`v`キーを押すことでこのモードに遷移します。
このモードでは開いたテキストファイルの文を閲覧したり、選択してコピーすることが可能です。


このモードに遷移するとウィンドウ下部に下記のような表示がされ、visualモードであることを教えてくれます。
```
-- VISUAL --
```

### command（コマンド）モード
INSERTモードやVISUALモードから`ESC`キーで抜けた状態で、`:`キーを押すことによりこのモードに遷移し、コマンドの入力が受け付けられます。
コマンドについては後述しますが、ファイルの保存・保存せずに閉じるなど各種操作が行えます。

## 使うコマンド
コマンドモードに`:`キーを押して遷移した状態で続けて下記のキーを押すことで各種操作が行えます。
|キー|操作|
|---|---|
|`:`+`q`|変更を***保存せず***に閉じる`quite`|
|`:`+`q!`|変更を***保存せず***強制的に閉じる|
|`:`+`wq`|変更を***保存して***閉じる`write and quite`|
|`:`+`wq!`|変更を***保存して***強制的に閉じる|

## 最後に
実用最低限の記事でしたが、Vimについてでした。
本当は文字列の検索・置換や豊富なプラグイン等が存在するので興味がある方は是非そちらの方を進めていって頂けると良いのかなと思います。

私自身も未だ初学者であるため、記事中に誤りや間違った記述等が存在する恐れがあります。
そういった点に関するご指摘を頂けますと大変助かります。
また、皆さんのご意見・ご感想をお待ちしております。
主キー、ユニークキー、indexの違いについて調べてみた

# 背景
DBチューニングをする中で、　既存のテーブルを調べてみたら
キーとして主キー（primary key)とインデックス(MUL)の両方がセットされていた。

でもこの違い、聞かれてみるとよくわからない。
そこで調べてみることにした。

ここ違う！等あればコメントで教えていただけるとありがたいですm(_ _)m

※mysqlを利用


# 主キー(primary key)　とは？

・mysqlだと「PRI」として表示される
・行の識別に使われる
・別名　primary key
・nullを許容しない
・一意である
・単一カラムOR複数カラムで設定可能
複数カラムで設定の場合は「複合主キー」と呼ばれる。
複合主キーの場合そのカラムをセットとして考えて、nullは許容しないし、一意でないとだめということ。


つまり、以下のemployeesテーブルで主キーをcompany_id、emp_id
の両方で複合主キーにした場合以下のような設定になる

OKな例
![スクリーンショット 2022-12-26 10.16.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462069/4009b6cc-c723-79bf-a725-81c628c9f45e.png)



NGな例

id=1 と id=2の　company_id とemp_idが重複するので
このようなデータは登録できない。
![スクリーンショット 2022-12-26 10.17.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462069/609271e2-d48d-cee4-c031-3189d84d2c51.png)

# ユニークキーとは？

・mysqlだと「UNI」として表示される
・一意である
・nullを許容
→値の重複は無しだけどnull許容したい時に使われる

例えば
usersテーブルでtel(電話番号）のカラムがあるとする。
電話番号は他人と重複することがないが、未設定でも登録できるようにしたい。
そんな時にtelをユニークキーとして設定できる。


# インデックスとは？

・mysqlだと「MUL」として表示される
・検索速度向上のために使われる
・nullを許容する
・一意でなくて良い、同じ値を複数回登録可能



# まとめ

|  | 用途| null許容 | 一意であるか|
|:-:|:-:|:-:|:-:|
| 主キー  | 行の識別 |  × |  ○ |
| ユニークキー  |  一意であるが必須登録にしたくない場合に使う |  ○  |   ○ |
| インデックス  |  検索スピードアップ |  ○ | × |


# 参考文献
https://ts0818.hatenablog.com/entry/2017/02/04/162513
https://www.delftstack.com/ja/howto/mysql/mul-vs-pri-vs-uni-in-mysql/
Box内のファイルに素早く辿り着く3つのコツ

Boxにさまざまなファイルを置いてお仕事をするようになると、自分の探しているファイルにいかに素早く辿り着けるかがとても重要になってくると思います。みなさんはどのような工夫をされていますか？
今回そんなアクセス方法にまつわる3つのTipsをご紹介します。


# コレクション機能を活用
![スクリーンショット 2022-12-26 10.48.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975763/859eafb5-8ea6-4616-ae40-1f7aeb340760.png)
Box内に格納されているコンテンツを自分の好きなようにグループ化し整理することができる機能です。（[コレクションの活用 - Box Support](https://support.box.com/hc/ja/articles/360048730094)）
自分の業務にあわせてグループを作って、それに準ずると判断するコンテンツをバシバシ入れていきます。
![スクリーンショット 2022-12-26 11.03.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975763/6050984e-1239-6ede-e88a-f17e43a2d1bc.png)

コレクションを使う上での豆知識:point_up:
- コレクションは他人と共有できないので、安心してお使いください
- コレクションを削除しても元ファイルは削除されません
- コレクションは最大100個まで作成可能
- コレクションにはファイルとフォルダあわせて最大100項目を追加可能
- 現時点でコレクション内に直接ファイルやフォルダはアップロードできません。既にアップロードされたものをコレクションに登録してください

詳しくはこちら： [コレクションのFAQ](https://support.box.com/hc/ja/articles/360049489913)

ちなみにこのコレクションのページをBoxのトップページと設定することも可能です。（私も設定していて、とても便利です！）
また定期的にコレクションの内容を整理することもオススメです。私も1年ぶりに整理してみたら、コレクションしたっきり一度も見ていないコンテンツとの出会いが意外とよくありました:sweat:

# 履歴機能を活用
直近アクセスしたファイルに簡単にアクセスできる履歴機能も使えます！（[履歴の使用 - Box Support](https://support.box.com/hc/ja/articles/360044194593)）

![スクリーンショット 2022-12-26 9.56.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975763/cb554564-7f0d-63a2-8e37-f2b2c333bb18.png)

履歴は左のメニューバー、上から2つ目のボタンからアクセスできます。
履歴ページでは主に以下のファイルが表示されます。
- プレビューしたファイル
- 変更したファイル（新しいバージョンのアップロード含む）
- コメントしたファイル
- 共有リンクから開いたファイル

また直接アクセスしたファイル or 送られてきた共有リンク経由でアクセスしたファイル のどちらかで絞り込むことができます。（これが結構便利！）
![スクリーンショット 2022-12-26 9.58.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975763/570ed962-9df9-3f90-e9c8-8f06de6cffa9.png)
「さっき見たあのファイル、どこだっけ...」という場合は履歴を見てみてください！

# Box Notesで自分専用のリンク集ノートを作る
Box Notesで自分だけのリンク集を作るのもおすすめです。
Box Notesは機能アップデートが続き、ますます使いやすくなっていますよね。そこで目次機能に目をつけた使い方を紹介します。（[Box Notesへの目次の挿入 - Box Support](https://support.box.com/hc/ja/articles/8737432485779)）
![スクリーンショット 2022-12-26 10.39.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975763/2439e384-c443-216c-db70-d73de8a3d8e6.png)

例えば営業担当として複数の担当顧客を持っている場合、お客様名を見出しに設定し、そのお客様に関するコンテンツを整理します。右側の目次でお目当てのお客様の情報に1クリックで飛ぶことができますし、特定の文字を調べるときはF5で検索をかければOK。
このように提案資料や議事録を表にしてまとめておくと、資料を探す手間を大幅に削減できます。

目次機能、表機能、F5検索をフル活用し、あなただけのリンク集をぜひ作成してみてください！
カスタム住所項目の作成

+ [Winter '23 カスタム住所項目を使用した顧客への配送 (正式リリース)](https://help.salesforce.com/s/articleView?id=release-notes.rn_forcecom_custom_fields_address.htm&type=5&release=240)

カスタム住所項目を使用して、住所データの精度およびユーザの環境を改善します。たとえば、標準またはカスタムオブジェクトに [Warehouse Address (倉庫住所)] 項目を追加します。ユーザはカスタム住所を入力するか、Google 検索を使用して住所を検索できます。その後、構造化された複合データ型または個別の住所コンポーネントとしてカスタム住所項目に保存された各住所にアクセスできるようになります。この機能は、前回のリリースからの変更点を含んでおり、今回正式リリースとなります。

+ [カスタム住所項目の作成](https://help.salesforce.com/s/articleView?id=sf.fields_caf_create.htm&type=5)

住所データ型を使用して、標準の住所項目の動作を模倣するカスタム住所項目を作成します。たとえば、標準またはカスタムオブジェクトに [Warehouse Address (倉庫住所)] 項目を追加します。ユーザは手動でカスタム住所項目に入力することも、Google 検索を使用して住所を検索することもできます。その後、構造化された複合データ型または個別の住所コンポーネントとしてカスタム住所項目に保存された各住所にアクセスできるようになります。

+ [元の質問](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jfhn9SAB)

# 関連資料

+ [Prepare your address data for the Custom Address Field Type in Salesforce](https://provenworks.com/prepare-your-address-data-for-the-custom-address-field-type-in-salesforce/)
+ [リード コンバージョンは、カスタム住所フィールドでサポートされている機能ではありません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000KgaOPSAZ)
Macでダウンロードしたファイルのチェックサムを確認

# ダウンロードしたファイルのチェックサム

最近はあまりLinuxのISOファイル自体をダウンロードすることは減りましたが、ISOイメージのダウンロードサイトに行くとチェックサムが書かれています。
![スクリーンショット 2022-12-26 10.54.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145608/5f525fb0-d0cb-1e01-c456-259b1c7a6bed.png)

ダウンロードしたファイルが、本当のファイルか確認するためのものですが、これをMacでどうやって確認するのかという話です。

# コマンド
Macで確認する場合は、下記のコマンドを実行します。

```
openssl sha256 ダウンロードしたファイル
```