OmniAICreator/Qiita-1.07M huggingface dataset:
EmbulkでkintoneのデータをBigQueryに移す

タイトル通りです。

# Embulk とは

https://www.embulk.org/

あるデータベースにあるデータを、別のデータベースにコピーできるツール（雑　プラグインを導入することで入出力先のデータベースとしていろいろなものを取れる。今回は入力先に kintone を、出力先に BigQuery を使いました。

# kintone とは

https://kintone.cybozu.co.jp/

GUI データベースです（雑　GUIを備えているので非プログラマでもデータ管理ができます。

# BigQuery とは

https://cloud.google.com/bigquery?hl=ja

データベースです（雑　名前に「クエリー」とあるように、大量のデータに対してSQLを使った抽出を高速に処理できます。

# EmbulkでkintoneのデータをBigQueryに移す

BigQuery には大量のデータから高速に抽出処理ができるので、社内のいろいろなデータをとりあえず BigQuery に置いておく、あると思います。同じように kintone のデータも BigQuery 上にあれば、抽出処理が BigQuery で完結します。抽出結果は redash とか tablue とかを使ってグラフィカルに表示できる先が既にあるので、社内のデータの「見える化」が捗る、ってやつです。

## Embulkでkintoneのデータを取り出す

まずは kintone のデータを Embulk を使って持ってきてみましょう。それには [embulk-input-plugin](https://github.com/trocco-io/embulk-input-kintone) を使います。

https://qiita.com/giwa/items/f571ed00b98c3d357b29

まずは対象の kintone のアプリケーションの [APIトークン](https://jp.cybozu.help/k/ja/user/app_settings/api_token.html) と [フィールドコード](https://jp.cybozu.help/k/ja/user/app_settings/form/autocalc/fieldcode.html) を設定します。ここで、**フィールドコードはそのまま BigQuery でのカラム名になるため、英数字で設定**しておきましょう。特に日本語はだめです。BigQuery に移さないフィールドに関しては無視されるので、全てのフィールドのフィールドコードを見直す必要はありません。

[設定したら「アプリの更新」を行うのを忘れずに](https://kintoneapp.zendesk.com/hc/ja/articles/4411455820441)。

とりあえずサクッと取り出した結果を見たい場合は上記の Qiita 記事にもあるような `config.yml` を用意して `embulk` を叩いてみましょう。

```config.yml
in:
  type: kintone
  domain: <<ここにdomainをいれる>>
  token: <<ここにAPIトークンを入れる>>
  app_id: <<ここにアプリIDを入れる>>
  fields:
    - {name: $id, type: long}
    - {name: <<ここにフィールドコードをいれる>>, type: string}
    ...(以降たくさん）
filters:
  - type: rename
    columns:
      $id: id
out: 
  type: stdout
```

```console
$ embulk preview config.yml
```

`$id` は、全てのアプリに共通してある属性の1つで、row indexを表します。ここで注意として、BigQueryでは `$` の文字がカラム名に使えないので、filters で置換する必要があります。そのため、既にこれ以外で連携していて、フィールドコードを変えられない場合は、この filters で処理してしまうのも1手です（個人的にはそういう読み替えがいろんな連携先で行われると共通言語として利用しづらくなるので推奨はしません）。

`type` に関しては `string` で取っておくのが無難です。特に日付データは [embulk-input-plugin によって UTC に変換される](https://github.com/trocco-io/embulk-input-kintone/blob/master/src/main/java/org/embulk/input/kintone/KintoneInputColumnVisitor.java#L91)ため、文字列として取ってきた日付データをBigQueryの関数で読み替えた方が良さそうです。

## EmbulkでBigQueryにデータを移す

上記の out を bigquery に変更します。

```config.yml
in:
  ...上と同じ...
out:
  type: bigquery
  table: <<テーブル名>>
  auth_method: json_key
  auto_create_table: true
  compression: GZIP
  dataset: <<データセット名>>
  file_ext: .jsonl.gz
  formatter:
    type: jsonl
  json_keyfile: <<認証のキーファイル名>>
  mode: replace
  project: <<プロジェクト名>>
  schema_file: schema.json
  source_format: NEWLINE_DELIMITED_JSON
```

```schema.json
[
  {
    "description": "id",
    "type": "INT64",
    "name": "id",
    "mode": "REQUIRED"
  },
  {
    "description": "<<フィールドの説明>>",
    "type": "STRING",
    "name": "<<フィールドコード>>",
    "mode": "NULLABLE"
  }
]
```

スキーマの `name` が、filter 後のフィールドコードと一致している必要があります。`$id` は filters で `id` になったので、`name: "id"` となります。`mode` は、基本的には `NULLABLE` が無難でしょう。kintone は必須フィールドが空のデータも存在できるので、kintone 上の「必須」はあまり役に立ちません...

# まとめ

そこかしこにちょっとした落とし穴があったので、Qiita にまとめてみました。実際、私はそれらにハマりまくって識者の時間をまぁまぁ溶かしたので、同じことしたい人がまた引っかからないように、この駄文を残しておきます。
Docker 基本のコマンド

## Dockerを学習して覚えたコマンドを残しておく


## Docker

Dockerの基本
現在ではdocker-composeを使うのが主流

```shell:images
# Imageを作成 Dockerfileから作る 
# -t [名前]:タグ [dockerfile-path]で名前をつける
docker image build -t hoge:latest [Deckerfile-path]

# Docker Imageを全て表示
docker images

# Docker Imageを削除
docker rmi [id or name]
```

```shell:container run
# Dockerコンテナを作成して起動
docker run --name <任意の名前> <Image名>

# option
--name [コンテナ名] # コンテナ名を指定
-p ホストのポート番号:コンテナのポート番号 # ポートを設定
-it # コンテナ内部に入る
--rm # コマンドの実行が完了した時、コンテナを破棄
-d # バックグラウンドでコンテナを実行
-v ホストのパス:コンテナのパス # volumeを指定する
-e TEST_ENV=Tee # ENV 環境変数 

# コマンド例
docker run -it --name hoge -v  Ubuntu:20.04

# nginxは/usr/share/nginx/html/にrootのhtmlがある
# Imageでwebserverをinstallしている場合ポートを開ける必要がある
docker run -v /Users/tee/Desktop/test/:/usr/share/nginx/html --name mynginx -p 8080:80 nginx:1.16

docker run -d -p 8080:80 --name hoge hoge
```

```shell:container
# 起動中のコンテナの中でコマンドを実行する
docker exec [id or name] [実行したいコマンド]

# コンテナを確認
docker ps -a

# コンテナを再開
docker start [id or name]

# コンテナを止める
docker down [id or name]

# コンテナを再起動
docker restart [id or name]

# 停止中のコンテナを削除
docker rm [id or name]
```

```shell:一括
# Imageを全て削除
docker image prune

# コンテナを全て削除
docker container prune
```

```shell
# コンテナにホストからファイルをコピー # 逆も可　
docker cp [host-path] [id]:[dorcerのpath]

# ログ表示 # -fでリアルタイム
docker logs

# 起動中のコンテナの中に入る
docker exec [name or id] /bin/bash
```

```shell
# 詳細情報を表示
# ENVを確認したりするのに使う
docker inspect [コンテナ名]
```

# Docker compose
複数のコンテナをまとめて操作する
基本はこちらを使う

## コマンド

`docker-compose.yml`で管理しているコンテナに対して作用する
現在の階層の`docker-compose.yml`に対して行われる
無い場合は親の階層を探す
```shell
# imageを作成する
# DokerfileやGemfileを修正した際なども叩く
docker compose build

# コンテナの立ち上げ
# ymlで指定されたImageかDockerfileを利用して構築
docker compose up -d

# コンテナを停止・削除
docker compose down

# ymlで管理されたコンテナを全て再起動
docker compose restart
```

```shell
# 対象のymlで管理されたコンテナのみ一覧表示
docker compose ps

# ログを表示
docker compose logs
```

```shell
# ymlで管理されたサービスを１つ指定してコマンドを実行
# Imageの構築/コンテナ作成/コマンドの実行を１度で行う
docker compose run <サービス> <コマンド>

# 起動中のコンテナでコマンド実行 shellなどを使える
docker compose exec <サービス> <コマンド>
```

```shell
# dangling（宙ぶらりん)状態のImageを全て削除
docker image prune
```


## Dockerfile
Imageをコード化したもの

```shell:RUNとCMDは実行タイミングが違う
# ベースのImage
FROM ubuntu:20.04

# Imageをbuildする時に実行
RUN apt-get update -y && \
    apt-get install -y nginx

# COPY HOSTのファイルをコンテナにコピーする
COPY index.html /var/www/html

# Imageをbuildする段階で環境変数を設定できる
ENV TESTENV="Tee"

# 各種コマンドを実行する際のカレントディレクトリを指定する
# Docker exec で実行する場所を決められる
WORKDIR /path/to/workdir

# Container起動直後に実行
CMD ["nginx", "-g", "daemon off;"]
```

*`CMD`以外のコマンドはImageをbuildする際に行われる*
*`CMD`はContainerが起動した直後に実行される*

## Image
```shell
# rootは/var/www/html
ubuntu:20.04
```


## docker -compose.yml

ymlファイルはスペースで親子関係を表現するファイル形式
設定ファイルでよく使われる
```yml
# versionとserviceを登録する
version: "3"
services:
  web:
    build: ./php # dockerfileの相対path
    container_name: "php8"
    ports:
      - "8080:80" 
  db:
    image: mariadb:10.4
    container_name: "db2"
    volume:
      - ./data:/var/lib/mysql # ホスト:Container ホストは相対pathがおすすめ
```
SCP(SOA対策)



＜課題＞
複数のAWSアカウントがある。
特定のサービス、リソースおよびAPIアクション対するアクセス制御を行いたい。

＜解決＞
AWS Organizationsの<B><font color="red">SCP</font></B>（サービスコントロールポリシー）を利用する。


＜補足＞
SCPを利用すると、組織内のメンバーアカウントに対する<b>アクセス許可の上限</b>が指定できる。
【SwiftUI】TabViewに色を付ける

# はじめに
iOS15からTabが透明になりました。

- iOS14と同じ見た目にする方法
- Tabに色を付ける方法

この二つを紹介します

# iOS14と同じ見た目にする方法
```diff_swift
struct ContentView: View {
+   init() {
+       let appearance: UITabBarAppearance = UITabBarAppearance()
+       appearance.configureWithDefaultBackground()
+       UITabBar.appearance().scrollEdgeAppearance = appearance
+       UITabBar.appearance().standardAppearance = appearance
+   }
    var body: some View {
        TabView {
            HomeView()
                .tabItem {
                    Image(systemName: "house")
                    Text("ホーム")
                }
            SearchView()
                .tabItem {
                    Image(systemName: "magnifyingglass")
                    Text("検索")
                }
            SettingView()
                .tabItem {
                    Image(systemName: "gearshape")
                    Text("設定")
                }
        }
    }
}
```
![simulator_screenshot_39938D38-6C94-489D-AB3D-C7B375108F2A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/c60f709e-e46c-06a9-e250-8b315693bb52.png)

# Tabに色を付ける方法
```diff_swift
import SwiftUI

struct ContentView: View {
+   init() {
+       let appearance: UITabBarAppearance = UITabBarAppearance()
+       appearance.backgroundColor = .yellow
+       UITabBar.appearance().scrollEdgeAppearance = appearance
+       UITabBar.appearance().standardAppearance = appearance
+   }
    var body: some View {
        TabView {
            HomeView()
                .tabItem {
                    Image(systemName: "house")
                    Text("ホーム")
                }
            SearchView()
                .tabItem {
                    Image(systemName: "magnifyingglass")
                    Text("検索")
                }
            SettingView()
                .tabItem {
                    Image(systemName: "gearshape")
                    Text("設定")
                }
        }
    }
}
```
![simulator_screenshot_A3059413-5963-4455-87D7-07ABEE14C07D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/745dc9c4-b451-323f-a1e8-17d19e72ffa8.png)

# おわり
|iOS15の標準|iOS14の標準|色付き|
|:-:|:-:|:-:|
|![simulator_screenshot_DDBB0361-13AF-4BA7-AB3B-5364499A4BB6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/5cd89895-e164-c7d0-f33b-f1821ad29840.png)|![simulator_screenshot_39938D38-6C94-489D-AB3D-C7B375108F2A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/c60f709e-e46c-06a9-e250-8b315693bb52.png)|![simulator_screenshot_A3059413-5963-4455-87D7-07ABEE14C07D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/745dc9c4-b451-323f-a1e8-17d19e72ffa8.png)|
モジュールバンドラーとトランスパイラ

# モジュールバンドラー
**JavaScriptは細かく分けて開発を進めた方が効率的で生産性も上がる。**
ただ、本番環境で実行するときはファイルを細分化する必要はない。
むしろ、読み込み回数が増えてパフォーマンスが悪くなる。
そこで、 **開発はファイルを分けて行い、本番用にビルドするときに１つのファイルにまとめる**という思想を実現するため、
jsファイルやcssファイル等をまとめてくれる**モジュールバンドラー**が作られた。

パッケージ管理システムはパッケージの依存関係を解決してくれるものだが、
モジュールバンドラーも同様に、**モジュールの依存関係をファイルを一つにまとめるときに依存関係を解決する。**

現在主流のモジュールバンドラーは**Webpack**。

# トランスパイラ(コンパイラ)
モジュールバンドラーが複数のファイルを一つにまとめてくれるものならば、
**トランスパイラ**は**JavaScriptの記法をブラウザで実行できる形に変化してくれるもの**。
ECMAScriptは毎年仕様が変わり、バージョンが変わりますが、それに**全てのブラウザが対応しているわけではない。**
ex)ES6はIE(InternetExplore)でエラーが出て全然動かない。。。
そこで、トランスパイラを使用すると、新しい記法で書かれたJavaScriptを古い記法（多くのブラウザで実行できる形）に変換してくれます。
ReactのJSX記法と呼ばれる特殊なルールの書き方も、ブラウザで認識してくれるようになる。

現在主流のトランスパイラは**Babel**（旧 6to5）。

# ビルド
**トランスパイラやモジュールバンドラーを使って、コードを異なる本番環境（localでなくWebのChrome,IE）でも動くようにする。**
ex)reactで作ったプロジェクトのpackage.json内のスクリプト buildで
```
npm run build
```
と叩く

# 余談
## これから主流になるであろうビルドツール Vite
これからフロントエンドで主流となると言われているビルドツールに**Vite**というものがある
Vue.jsの開発者であるEvan You氏が中心となって開発
Webpackよりも圧倒的に高速である
[Unity]アセットの中から必要なものだけを取り出す手順

# 概要
エフェクトや効果音、３Dキャラクター等がたくさん入ったアセットは便利ですがデータサイズも大きくなりがちです。必要なアセットだけを選んで自分のプロジェクトで使う方法を共有します。
# アセットを取り分ける
まずは本番とは別にアセットを取り出すためのプロジェクトを作り、アセット本体をそこにインポートします。
![スクリーンショット 2022-08-05 20.45.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/54c58f7b-6aab-77da-dc00-6db092ed6cb5.png)
アセットの中から欲しいものを選んで右クリック。ポップアップしたメニューから「Export Package」を選びます。
![スクリーンショット 2022-08-05 21.04.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/8722e0e7-934d-417f-7e35-dbc6bb084dce.png)
ポップアップが表示されるので、「include dependencies」にチェックが入ってることを確認したらExportを押します。
このチェックを入れておくと、アセットを使う為に必要なものも一緒に取り出してくれます。
![スクリーンショット 2022-08-05 20.53.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/1fb84d20-003c-6a57-b445-7769dc90d3f2.png)


# 取り分けたアセットを使用する
次に、アセットを使いたいプロジェクトをUnityで開き、先ほど保存したファイルをダブルクリックします（上手くいかない時はUnityの画面にドラックアンドドロップしてみてください）
![スクリーンショット 2022-08-05 21.18.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/573d73eb-77fe-9927-9536-2b9f90ce8fe2.png)
ポップアップが表示されるので、Importを押したら
![スクリーンショット 2022-08-05 20.56.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/bda4a035-e152-234f-80e7-0f3701667c8b.png)
無事、欲しいアセットだけを取り分けることができました。
![スクリーンショット 2022-08-05 21.21.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/7fdd8feb-0a42-6cc7-d973-fe5aa8f915e7.png)


# リンク
この記事は以下の動画を参考に書いたものです
[Unity - Keep your project fast & reduce clutter!](https://www.youtube.com/watch?v=8RUhPQ_rbnw)
Fujitsu FUTRO MP702 + ChromeOS Flex 動くようになりました

前回の記事で動かなかった問題が解消しました。

https://qiita.com/stomi80/items/471b07a224dbdee5f5dc

# やったこと
以下のことをやりました
- Chrome OS Flexをdev版にした
`バージョン: 105.0.5195.4（Official Build）dev （64 ビット）`
- WiFiの接続設定を削除して、再設定した
ArgoCDにaws-loadbalancer-controllerのHelmチャートを登録するサンプル


- ArgoCDをクラスタに展開完了すると、`kind: Application` のカスタムリソースが作成される
 - そのため、マニフェストファイルをkubectl applyすれば、自動的にArgoCDにリソースが登録されるようになる
- ArgoCDでは、Helm、kustomize,jsonnetなども扱うことができる

> How it works¶
Argo CD follows the GitOps pattern of using Git repositories as the source of truth for defining the desired application state. Kubernetes manifests can be specified in several ways:
kustomize applications
helm charts
jsonnet files
Plain directory of YAML/json manifests
Any custom config management tool configured as a config management plugin
https://argo-cd.readthedocs.io/en/stable/

## マニフェストファイルを用意する
- AWSの公式手順に習って対応するように、マニフェストファイルを作る
  - https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/aws-load-balancer-controller.html
- helm install時に指定しているリポジトリやパラメータを以下のように指定する

helm installコマンド

``` 
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
  -n kube-system \
  --set clusterName=cluster-name \
  --set serviceAccount.create=false \
  --set serviceAccount.name=aws-load-balancer-controller 
```

マニフェストファイル

```argocd-aws-loadbalancer-controller.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: aws-loadbalancer-controller
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/aws/eks-charts ← リポジトリURL
    path: stable/aws-load-balancer-controller ← リポジトリURLのルートから対象リソースがあるまでのパス
    helm:
      parameters:
      - name: "clusterName" ← --setで指定しているパラメータ
        value: "vamdemic-stg-eks-cluster" ← --setで指定しているパラメータ
      - name: "serviceAccount.create"
        value: "false"
      - name: "serviceAccount.name"
        value: "aws-load-balancer-controller"
      releaseName: aws-load-balancer-controller
  destination:
    server: https://kubernetes.default.svc
    namespace: kube-system
  syncPolicy:
    automated:
      prune: true
  ignoreDifferences:
  - group: ""
    kind: Service
    jsonPointers:
    - /spec/clusterIP
```

### デプロイ
```
kubectl apply -f manifests/argocd-aws-loadbalancer-controller.yaml
```

### 確認

```bash
kubectl -n argocd get application
```

```
NAME                          SYNC STATUS   HEALTH STATUS
aws-loadbalancer-controller   Synced        Healthy
guestbook                     Synced        Healthy
```

きれいにデプロイがかかると、GUIからはこのように見える

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/5d701ebe-26be-daff-ec5c-f3ccfbe8bac3.png)


## 参考
- https://qiita.com/kyohmizu/items/118bf654d0288da2294e
【AWS】Auroraエンドポイント

# エンドポイントって？？



>クラスターエンドポイント: ロールがWriterのインスタンスへアクセスするエンドポイント
読み込みエンドポイント: ロールがReaderのインスタンスへアクセスするエンドポイント
インスタンスエンドポイント: 特定のインスタンスへアクセスするエンドポイント


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/8561b641-5def-521c-5549-15cae0e5f253.png)
画像引用：[Amazon Auroraで組み合わせ自由なエンドポイントが設定可能になりました](https://dev.classmethod.jp/articles/amazon-aurora-custom-endpoints/)
【AWS】S3のアクセス設定（ACL、パブリックアクセス）

# S3のアクセス管理
S3のバケットを公開したい。。と言う際にはACLとバケットポリシーの設定を行えば可能。
ただGUI上でちょちょっと設定が終わってしまうため、誤ってS3バケットが公開されてしまう状態となることが散見されていた。[こちらの記事](https://dev.classmethod.jp/articles/s3-block-public-access/)に詳細が記載されている。とても参考になりました。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/e9c8b4c0-f521-206e-cc5b-bad67a291ba9.png)
画像引用：[【アップデート】S3でACLを無効化できるようになりました #reinvent](https://dev.classmethod.jp/articles/s3-bucket-owner-enforced/)

ACLに関してはバケットとオブジェクト単位どちらでも設定可能。**ただしオブジェクト単位の設定が優先されてしまう**仕様となっていた。（何が大変かって言うと、バケットのACLをパブリックアクセスNG設定にしおけばOKではないって言うこと。新しくアップロードされたオブジェクト1つ1つに対してちゃんとパブリックアクセスがNGになっているかどうか確認してあげないと、うっかりオブジェクトが世間に公開されている状態になり得る。）

じゃあバケットポリシーでやるか！という流れになるのだが、[過去の記事](https://qiita.com/morinskyy/items/5395448d72fa95066a16)にも書いたようにJSON形式のコードでの記述が必要になりまあまあ面倒臭いのだ。

そこで登場したのが **「S3パブリックアクセス機能」** と言うわけだ。

# S3パブリックアクセス機能
アカウント全体、もしくはバケット単位、アクセスポイント単位で自由自在にバブリックアクセスの **ブロック（何をブロックしていくかの設定）** を設定できる。以下の図がとてもわかりやすいです。（逆にこう言う課題を解決する機能が当初はなかったのか。。。。）


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/f71f7bde-0178-ce89-1234-0c6a8ecb7481.png)
画像引用：[【アップデート】S3でACLを無効化できるようになりました #reinvent](https://dev.classmethod.jp/articles/s3-bucket-owner-enforced/)



　　

# ACLとは？
サブネット単位で設定するファイアウォールのこと。IPアドレスとポート番号で許可（拒否）設定をする。
デフォルトではインバウンド/アウトバウンドどちらとも「全て許可」状態になっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/b021526f-199c-3889-4154-4b2666decae3.png)
画像引用：[AWSでIPアドレスを制限する３つの方法](https://bsblog.casareal.co.jp/archives/3370)







# 参考
http://www.code-magagine.com/?p=12521

https://dev.classmethod.jp/articles/s3-block-public-access/
【BigQuery】集計関数でパーセンタイルを算出する

# TL;DR

パーセンタイルを出すには
```sql
APPROX_QUANTILES(x, 100)[OFFSET(percentile)]
```
を使う

---
BigQueryに用意されている `PERCENTILE_CONT`, `PERCENTILE_DISC` 関数はウィンドウ関数のため、

```sql
SELECT
  PERCENTILE_DISC(x, 0.5) OVER() median
FROM
  UNNEST([1,2,3,4,5,6,7,8,9]) x
```

```
5
5
5
...
```

となり、 `LIMIT 1`, `DISTINCT` 等をつける必要があるため扱いづらい。

以下のように書くと集計関数であるため結果はスカラ値になる。

```sql
SELECT
  APPROX_QUANTILES(x, 100)[OFFSET(50)] median
FROM
  UNNEST([1,2,3,4,5,6,7,8,9]) x
```

```
5
```
【JSF】メソッドが存在するはずなのに、メソッドが見つからないとエラーが出てしまう

## エラーが出る原因

このようにソースがある。

●faceletsを用いた描いたボタン

```xhtml:index.xhtml
<h:commandButton action="#{hoge.hogeMethod()}" value="送信" />
```
●java側

```java:Hoge.java
	public String hogeMethod(String num) {
		// なんか処理
		// 遷移しない処理
		return null;
	}
```

ビュー側ではhogeMethod()メソッドを呼ぼうとしているが、java側のメソッドでは、引数がある。これが原因だった。

でも、このようなメソッドの間違った呼び方、javaだけなら分かりやすいエラーメッセージが出るものだが、今回xhtmlファイルからjavaのメソッドを呼ぼうとすると、とても分かりづらいエラーメッセージとなるので、解決までに時間がかかった。

おそらく、ビュー側で引数無しの呼び方をしているので、引数がないhogeMethod()しか探そうとせず、見つからない的なエラーが出てしまう。

## 改善方法
メソッドも同じように引数無しにそろえて正しいメソッド呼び方に修正する

```java:Hoge.java
	public String hogeMethod() {
		// なんか処理
		// 遷移しない処理
		return null;
	}
```


## 感想
JSFは実装が比較的ラクだがエラー解決が他のFWに比べて倍難しい
Salesforceでユーザ自身で自分のユーザデータの編集を防ぐ方法

Salesforceではユーザオブジェクトのようにページレイアウトの編集ができない設定がございます。

![ユーザ01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c8cb0772-e7eb-2ccb-a663-9d167c48815f.png)


この場合、ログインしたユーザに特定のユーザレコード情報の編集をさせないようにするにはどうすればいいでしょうか

こちらは入力規則を作成すれば対応可能です

例えば会社名（CompanyName）の変更をさせたくない場合、入力規則の数式は以下となります

AND( $User.Id = Id,
ISCHANGED( CompanyName ) )
![入力規則１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/338bf69c-77d8-6ba4-3bf5-7e7b3f4cd070.png)


この入力規則を作成すれば、ログインしたユーザは自分自身のユーザの会社名の変更を防ぐことが可能です
【git】リモート追跡ブランチと上流ブランチを理解したい


## 目的
`リモート追跡ブランチ`と`上流ブランチ`をそろそろ理解したい。

## 基本のおさらい

gitの基本的な構成
![image_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/1d8a583a-b42d-8ec6-1f72-2fc8d9a6fec0.png)

・**`git fetch`**: リモートブランチの内容をローカルリポジトリのリモート追跡ブランチへ反映する

・**`git merge`**: ローカルリポジトリ内でリモート追跡ブランチの内容をローカルブランチへ反映する

・**`git pull`**: `git fetch`と`git merge`をまとめて行う。

・**`git push`**: ローカルブランチの内容をリモートブランチとリモート追跡ブランチへ反映する。

↓過去にまとめた記事があるので、よろしければ見てください..!!
>第1回目 git基礎コマンド (https://qiita.com/tatsuya_1995/items/b0747759630b6c230684)
>第2回目 ブランチ・マージ・リベース・コンフリクト（https://qiita.com/tatsuya_1995/items/04148896a7f23a1f2090)
>第3回目 プルリクエスト (https://qiita.com/tatsuya_1995/items/6d48b7ba8487fe38bbf8)


## リモート追跡ブランチ

<ポイント>
1. ローカルリポジトリにあって、他のリポジトリの内容を追跡しているブランチである
2. `origin/master`はリモートリポジトリ`origin`の`master`ブランチを追っているリモート追跡ブランチである

## 上流ブランチ
<ポイント>
1. 引数なしで`git pull`したときに対象になるブランチである
2. ローカルリポジトリの`maste`rブランチからgit pullするとorigin/masterの変更を反映する。
3. `origin/master`はローカルリポジトリの`master`の上流ブランチである。


...ここで上流ブランチを普段意識していない人は少し引っかかりませんか？
git pullしたときは、単純にリモートブランチからローカルブランチへ変更を反映しているんじゃないの？って。
**正確にはリモートブランチからリモート追跡ブランチ(origin/master)へ反映された後に、そのリモート追跡ブランチからローカルブランチへ反映されている。** という流れです..!!

なので、より正確な解釈を促すのであればgit pulllの動きを表す図はこちらなのではないかなと思っています。赤バツと青丸で表しています。

![image_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/bd74f3a0-cd64-7e1f-550d-7802f56a819f.png)


## おまけ

- リモート追跡ブランチの一覧は **`git branch -r`** コマンドで確認可能
【Flutter】Widget TestでKeyで探したWidgetのテキストを抽出する。

こんにちは。

個人でアプリ開発をしているYuKiOです。
アプリを13本リリースしています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">HackerMemoを大幅にアップデートしたので、<br><br>海外向けのPVを作ってみました😆<br><br>夜なべして頑張って作ったので、拡散頂けたら泣いて喜びます😭🙏<br><br>音有りがオススメです！<br><br>元ネタわかる人いるかな〜🤔<br><br>アプリはこちら🔽<br>■iPhoneの方<a href="https://t.co/6T10L94Ld1">https://t.co/6T10L94Ld1</a><br><br>■Androidの方<a href="https://t.co/uBevCXrNw2">https://t.co/uBevCXrNw2</a> <a href="https://t.co/wiGLv46kaG">pic.twitter.com/wiGLv46kaG</a></p>&mdash; YuKiO｜アプリ個人開発｜Flutter × Firebase (@oo_forward) <a href="https://twitter.com/oo_forward/status/1348103082769453056?ref_src=twsrc%5Etfw">January 10, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

さて、Flutterの自動テストには「**Unit Test**」、「**Widget Test**」、「**Integration Test**」と３つありますが、

その中で「Widget Test」は、主にアプリのUIを確認するために用いられると思います。

今回は、KeyからWidgetを探して、その中にあるTextを取得します。

例えば、Widget Testで、特定のテキストが表示されているかチェックする場合、このような形で書くと思います。

```button_widget_test.dart
   testWidgets('EditButtonに編集と表示されている', (WidgetTester tester) async {
      await tester.pumpWidget(testWidget);
      expect(find.text("編集"), findsOneWidget);
    });
```

この場合、表示されている数を知りたいなどザックリをチェックしたいのであれば問題がありませんが、例えばリストの特定のボタンが、指定された文字列になっているかはチェックができません。

できれば厳密に指定したいのでKeyを使って文字列をテストする場合、このようにできます。※これはText Widgetを使っている場合です。適宜必要なWidgetを指定してください。

```button_widget_test.dart
   testWidgets('EditButtonに編集と表示されている', (WidgetTester tester) async {
      await tester.pumpWidget(testWidget);
     //まずKeyで特定する
    final finder = find.byKey(ValueKey("buttonText1");
     //Widgetを抽出 
    final text = finder.evaluate().single.widget as Text;
    //text.dataに文字列が格納されている。
     expect(text.data, "編集");
    });
```

たとえば、TextFiledの状態もチェックできます。

```button_widget_test.dart
   testWidgets('nameFieldにテストと表示されている', (WidgetTester tester) async {
      await tester.pumpWidget(testWidget);
      final finder = find.byKey("nameField");
      final textField = finder.evaluate().single.widget as TextField;
      final text = textField.controller?.text;
      expect(text, "テスト");
    });
```

文字の色なんかも、同じような要領で確認できます。

```button_widget_test.dart
   testWidgets('EditButtonに編集と表示されている', (WidgetTester tester) async {
      await tester.pumpWidget(testWidget);
    final finder = find.byKey(ValueKey("buttonText1"));
    final text = finder.evaluate().single.widget as Text;
    //text.style?.colorで抽出
    final color = text.style?.color;
    expect(color, Colors.white);
    });
```
【AWS】スロットリング対策

# スロットリングとは？
一定期間で受けられるリクエストの数を設定して、それを超えてきたら受信拒否してエラーを返却すること。
S3にはスロットリング機能があるため、アクセスが集中すると一部の人は拒否されてしまう状態となる。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/759d6422-ecce-c477-afd0-8bf4d741cf55.png)

>これは大人気の遊園地が入場制限することで、入場済みの来場者に快適に過ごしてもらうことに似ています。入場前の来場者にとっては好ましくありませんが。。。

画像引用：[スロットリングとの付き合い方 ](https://future-architect.github.io/articles/20200121/)


# S3ではどうやって対策をする？
S3のWebホスティング機能を使ってWebページを公開している場合、アクセス集中してスロットリングが発動してしまう状態は避けたいところ。AWSの場合は「構成力」で回避策を打つことができる。

真っ先に挙げられるのが[CloudFront](https://qiita.com/morinskyy/items/e4a2f39e063529fb49e6)をS3の前面に「影武者」として配置してあげる方法。これによって、より多くのアクセス数を捌けるようになる。

あとは[ElastiCache](https://qiita.com/morinskyy/items/a72c836ced58b2c9b387)を活用する方法もあるが、これはDBを参照するような動的サイトでの出番がある方法。CloudFrontと同じこともできるっちゃできるが、ちょい大袈裟だな。

[DynamoDB Accelerator(DAX)](https://qiita.com/morinskyy/items/76445a11415aa2e2447b)もDB参照に対する負荷軽減対策だな。
moqhaoのC2をパースするpython


2018年８月ころに作ったpython

```python
ext = "傘偘傰傠储偈傘傘傀偠傠储储僸储僐僨傠傀"
dec = ""
j = 0
for i in range(len(ext)):
    dec = dec + chr((ord(ext[i]) - 0x4e00) >> 3 ^ ord("beg"[j]))
    j = (j+1) %3
print(dec)
```


2020年11月ころに作ったpython
今も現役

```python
from Crypto.Cipher import DES
import base64
enc = base64.urlsafe_b64decode("FLd6x1SyIHYywzjnHkCPiia3FtWLPFQa")
key = b"Ab5d1Q32"
des = DES.new(key,2,key)
dec = des.decrypt(enc)
print(dec)
```

CyberChefだとこんな感じ

```javascript
From_Base64('A-Za-z0-9-_',true,false)
DES_Decrypt({'option':'Latin1','string':'Ab5d1Q32'},{'option':'Latin1','string':'Ab5d1Q32'},'CBC','Raw','Raw')
```
【AWS】S3のオブジェクトロック機能

# S3のオブジェクトロックとは？
要は「保存したものが絶対に消去されないようにする」ための機能。
ガバナンスモードとコンプライアンスモードの２種類がある。

ガバナンスモードとは、特別なアクセス権限を持たない限り、オブジェクトの上書きや削除、ロック設定の変更ができない。
コンプライアンスモードは更に厳しい。指定された期間中は誰も上書き、削除ができないようになる。。。（すげぇ）


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/7c04fc19-e914-f577-5dde-010aabe4a968.png)
画像引用：[【S3】S3オブジェクトロックを設定してみた](https://blog.serverworks.co.jp/s3-object-lock)

# バージョニング機能（復習）
要はgitみたいに過去のバージョンを保存できるもの。誤操作などでオブジェクトを消去しちゃっても、数世代分のデータは保存されている。まぁこれも一種の保護機能だね。
基本情報（主キーと外部キー）

データベースを扱う場合には、行を特定するキーが必要となります。
```
1 田中　開発
2 吉田　営業
3 田代　経理
```
特定するキーとなる情報を**主キー**と呼びます。
身近な主キーだと学生番号や社員番号ですね。

表と表と関連付けする際にも主キーが活躍します。その場合は他の表の主キーを参照しているという意味で**外部キー**という呼び名が出てきます。

## 主キーは行を特定する鍵
主キーはID番号が入った列のことと考えれば、ほとんど正解です。
主キーの条件としては「表の中で内容が重複しないこと」「内容が空でないこと」の２点です。中身が空だと指定できません。

一つの列では一意にならないが、複数の列を組み合わせれば一意になるという場合があります。
このような複数列を組み合わせて主キーとしたものを**複合キー**と呼びます。

## 外部キーは表と表をつなぐ鍵
関係データベースは、表と表を関係付けできるところに特徴があります。表と表を関連づけるために他の表の主キーを参照する列のことを**外部キー**と呼びます。

社員表
| 社員番号（主キー）  |名前  |部署ID（外部キー）  |
|---|---|---|
|20001  |田中  |1|
|20002  |田代|2|
|20003  |田村|3|

部署表
|部署ID（主キー）  |名前  |
|---|---|
|1  |営業  |
|2  |開発|
|3  |帰宅|

関係づけされました。

## まとめ
外部キーつけるべきか、つけないべきか問題はもっと調べたいです。
JCOMのARP

インターネット接続にケーブルテレビのJCOMを使っているのですが、おかしなARPがたくさん飛んできます。

```
inet 61.24.128.x netmask 0xfffffc00 broadcast 61.24.131.255
```

なアドレスがDHCPで配られていて、ネットマスクが22ビットなので61.24.128.0-61.24.131.255なネットワークにいます。

そのインターフェースをtcpdumpで見ると、

```
19:35:03.259073 ARP, Request who-has 110-133-211-87.rev.home.ne.jp tell 110-133-208-1.rev.home.ne.jp, length 46
19:35:03.261008 ARP, Request who-has 110-133-198-48.rev.home.ne.jp tell 110-133-196-1.rev.home.ne.jp, length 46
19:35:03.267008 ARP, Request who-has 203-165-240-10.rev.home.ne.jp tell 203-165-240-1.rev.home.ne.jp, length 46
19:35:03.267565 ARP, Request who-has 110-132-10-139.rev.home.ne.jp tell 110-132-8-1.rev.home.ne.jp, length 46
19:35:03.272006 ARP, Request who-has 110-133-208-230.rev.home.ne.jp tell 110-133-208-1.rev.home.ne.jp, length 46
```

などが、ざっと秒間数十パケット飛んできます。

そもそもARPって同一ネットワークの機器のMACアドレスを確認するためのプロトコルと思うのですが、なぜ違うネットワークに飛んできてしまうのでしょうか。。。
JavaScript超基本語句・・モジュール

# モジュールとは
コードを一つの機能レベルに分割して影響範囲を狭めたもの
モジュールがなければ一つのJSファイル機能をまとめるため、
数千行のコードを書くことになる。
→ 人的ミスで同じ名前を使ってしまうことがあるかもしれない。どこでエラーが起きているのか探しずらい。などの問題が起きる。
モジュールの例・・・
* transit.js(トランジション機能) 
* showMessage.js （メッセージを表示する機能）
* addSarary.js(給料の和を計算する機能)

※**モジュール、プロパティ(データ)/メソッド（機能）、クラス、パッケージの関係性**
（イメージ）
プロパティ/メソッドの集合がクラス（クラスにメソッドが一つの時もある）
クラスの集合がモジュール（モジュールにクラスが一つの時もある）
モジュールの集合がパッケージ（稀にモジュールにパッケージが一つの時もある）
# Common JS形式 と ES Modules形式(一般的)
## 背景
サーバーサイドでモジュール化したJSはRequireを使って読み込む（**CommonJS形式**）
かつては、サーバーサイドのみモジュールを使用できていたが、フロントエンドではモジュールが使えなかった。
そこで誕生したのが、**AMD**(Asynchronous Module Definition)や**Bower**。しかし、これらには欠点が多かった。
そうして、コードを事前時ブラウザ向けに変換する**Bandle**（モジュールバンドラー）が誕生。そうして、モジュールがフロントエンドでも使えるようになった。現在はbandleの上位互換の**Webpack**が使われている。
### モジュールバンドラーとは
複数のJavascriptファイルの依存関係を解析して、事前に一つのファイルとしてまとめてくれる（バンドル）機能。開発はファイルを分けて行い、本番用にビルドするときに１つのファイルにする。
### Webpackの説明
モジュールバンドラー
たくさんのファイルを少数のファイルに変換する。
ブラウザでは動かない拡張子を変換する。
CommonJS形式（一般的に使用しているのはESModule形式）や、
scssをcssに変換するsass など開発に便利なファイルをWebpackがバンドルするためブラウザで閲覧できる。
OO.js,△△.sass,...→（webpackでバンドル）→bandle.js
（余談）
変更するたびに npx webpack とコマンドを叩くのは面倒。そこで
変換すると自動的にBandle.jsを更新してくれるのが、Webpack-dev-server
これを使うと開発体験が向上する

# ESModules 形式の概要
ES2015仕様にて策定された
JSファイルから別のJSファイルを読み込む仕組み
Node.jsでは、他のJSファイルの読み込みはCommonJS形式の仕様に沿った方法で、実現していたが、ES Modules形式はブラウザでもサーバーでも対応したモジュールシステム。
＜目的＞
名前空間（スコープ）を解決するため
(イメージ）プログラミングの世界における「名前の影響範囲はここまで」ということを決める仕様

＜今までの課題＞
JSは名前空間が１つなので、大規模開発などでコードが何千、何万行にもなったときに関数名や変数名が被ってしまうという問題

＜解決方法＞
ES moduleを使用することによって、名前空間（スコープ）を分割することができるようになり、命名が被ってしまってエラーが出るということを考えることなく、コードを書けるようになった

### named importとnamed export
``` JavaScript
//変数名をexport側で宣言する
export const answer = 18;
//１つのモジュールから複数の値をいくつもexportできる
export { answer, obj };
//import するときに { } を使用する
import { answer, obj, greet, bye } from './sub.js';
```

### エイリアス（別名）
```JavaScript
//named exportsで公開される変数名は as を使ってimport側で変更することができる。
import { ans as myAnswer, obj } from "./sub.js";
//export側でもエイリアスは使える。
export { answer as ans, obj };
```
### default import ,default export
```JavaScript
//変数名をimport側で宣言する
import greet from './greet.js';
//default exportsで公開できる値は１つのモジュール（ファイル）につき１つだけである。
//export側で変数名を宣言していないので、区別がつかないため

//default exports で公開した値は、{ } を使用せず、剥き出しで記述する
export default 'greet';
```

### 基本的にはnamed import ,named export を使用する
* 自動インポート（エディタの補完機能）が働く
* 変数名の固定化ができる
* リファクタリングがしやすい
以上の理由からnamed import named exportを使用する
AppiumをWebdriverIO(TypeScript)+Cucumber+PageObjectPatternで構築する

題名の組み合わせでAppiumの自動テスト環境を構築する記事が少なかったため、備忘録も兼ねてこちらに書き記しておきます。


:::note info
下記の内容は、私の所属する企業のnoteに書かせて頂いた「Appiumを使った自動E2Eテスト導入の取り組み」の中で行なった環境構築です。
弊社ではモバイルエンジニア(iOS,Android,Flutter)の採用も行っているので、是非ご覧になってみてください！
:::
https://note.jpn.pioneer/n/nd02903a935e3


## Appiumのインストールと起動
https://qiita.com/ys-sgn/items/7390364e3d1e30483a92

## Appiumクライアント(WebdriverIO)の構築
https://qiita.com/ys-sgn/items/a512ac5d99db35bbde0d

## Appiumデスクトップを使ってテストコードを書いてみる
https://qiita.com/ys-sgn/items/75d3337e965f9aa9cb53
Visual Studio Code の設定同期方法

# やりたいこと
複数の PC で VSCode を使っていて、それぞれで設定やアドオンなどは共通にしたい。
いちいち同じ設定をし直すのは面倒なので、同期させたい！ので、その方法を書く。

# 必要なもの
Microsoft or Github のアカウント。どちらかあれば OK です。
※ ここでは、Github アカウントでの手順を記載しています。

# 設定方法
1. VSCode の左下の歯車マークをクリック
1. 「設定の同期をオンにする」をクリック
1. コマンドパレットに「サインインしてオンにする」と表示されるので、同期したくない項目のチェックを外す (デフォルトは全部チェック入ってます)
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743460/c120493f-a8a9-2e8a-8353-eb5259942bb1.png)
1. 「サインインしてオンにする」をクリック
1. Github でサインインをクリック
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743460/92cf27c0-9377-c89a-9526-4a2bb71607b5.png)
1. ブラウザが起動するので、「Continue」をクリック
1. サインインが求められるので、サインインする
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743460/80f32ac0-5627-372d-fdf9-ce381f793a34.png)
1. 認証が成功したら、VSCode に戻る
1. 「拡張機能がこの URI を開くことを許可しますか？」とウィンドウが表示されるので、許可する

これで同期元の設定が (たぶん) Github のどこかに保存された。他の PC の VSCode でも同様の手順で同期の設定を行えば同期される。
ローカルの設定と異なる場合は、こんなウィンドウが表示されるのでどうするか選択する。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743460/57d6ec11-8de8-cdce-a000-90fd4d19601c.png)

以上です。

# 参考
* https://code.visualstudio.com/docs/editor/settings-sync
* https://zenn.dev/longbridge/articles/0811abc01d10cc
Spring Bootのデータベースに出てくる用語（JDBC,JPAとか）時系列的まとめ

# 概要
SpringBootのドキュメントのデータベースの項目に出てくる用語の初リリース日、最終更新日などをまとめました。
まとめたきっかけとしては、ドキュメントを読んだときデータベースの接続方法が多くて私が困惑したからです。
各技術の大まかな歴史推移がわかれば、理解の手助けになると思ったためです。（世界史は流れで覚えたほうがいい的なノリ）
指標としては初リリース年、最終更新年、googleトレンドを使っています。

# リリース日　最終更新日

画像の赤文字がわからなかったです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/151c207c-3e48-8016-5b5c-9e489fb8efd9.png)


2022時点の情報です
略語|正式名称|初リリース年|最終更新年
--- | ---| --- | ----
JDBC|Java Database Connectivity|1994|2017(安定版)
JPA※|Java Persistence API|不明（少なくとも2006年には存在）|2022
H2|H2 Database|2004|2022
jOOQ|Java Object Oriented Querying|2010|2022
R2DBC|Reactive Relational Database Connectivity|2018|2022


JPAは遍歴が多いです。JPAからJakarta Persistenceに代わってますね。
JPA1.0（初リリース不明、最終リリースは2006年）
JPA2.X（初リリース2007年、最終リリースは2017年）
Jakarta Persistence（初リリース2019年、最終リリースは2022年）

# googleトレンド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/a816d526-d792-60f7-a46c-c81f251cff26.png)

2022年7月時点
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/c7a74d3b-2430-7a44-a3fc-7a9a1928d5e0.png)

2022年だとJDBCとJPAのトレンドが同じ位になってますね。

# 参考資料
Spring document data
https://spring.pleiades.io/spring-boot/docs/current/reference/html/data.html#data

JDBC 英語版wikipedia 
https://en.wikipedia.org/wiki/Java_Database_Connectivity

JPA 英語版wikipedia 
https://en.wikipedia.org/wiki/Jakarta_Persistence

H2英語版wikipedia 
https://en.wikipedia.org/wiki/H2_(DBMS)
JOOQ ノートログ
https://www.jooq.org/notes/?version=3.17

RD2DBC githubのログ見て一番古い年から割り出しました。
https://github.com/r2dbc/r2dbc-spi
SourceTreeでコミットしたときにhuskyが動かないときの対処法

今まではSourceTreeをターミナルから起動することで対応していました。
でも毎回は面倒くさい…。
調べていたら、１コマンドで簡単にhusky用の設定ファイルを作成できる方法を見つけました。

環境：macOS Catalina 10.15.7
gitクライアントツール：SourceTree

# SourceTreeでコミットしてエラーが出たときの、今までの対処法
```
.husky/pre-commit: line 4: npm: command not found
husky - pre-commit hook exited with code 127 (error)
```
上記のようにエラーが発生してコミットできなくなることがあります。
その度にターミナルで
```
$ open /Applications/Sourcetree.app
```
を実行し、SourceTreeをターミナル経由で起動することで解決していました。
こちらの方法も有用ですので、これから記述する対処法でもし解決しなければ試してみてください。

# 設定ファイル.huskyrcを作成する
[husky](https://github.com/typicode/husky)のIssueに[解決策](https://github.com/typicode/husky/issues/390#issuecomment-762213421)が提案されていました。
結論から言うと
```
$ echo "export PATH=\"$(dirname $(which node)):\$PATH\"" > ~/.huskyrc
```
を実行すれば解決します。
上記コマンドを実行すると設定ファイル`.huskyrc`が生成され
ファイルの中身にnodeディレクトリのパスを通す記述をしてくれます。
ざっくり説明すると、コミット時にhuskyが発火するとこの設定ファイルを見に行くので
nodeのパスを毎回通すことに成功する、という仕組みのようです。
`.huskeyrc`の詳しい仕組みとコマンドの解説はIssueのコメントで丁寧に解説されているのでご一読ください。
ubuntu20.04でSimpleScreenRecorderが真っ黒だった件



## 真っ黒表示だったのでプラグイン追加

```bash
sudo apt install ubuntu-restricted-extras

sudo apt install libav-tools ffmpeg
```


## なぜか発生したエラー
```bash
Waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 5998 (省略)

↓

kill -9 5998
```
1行目のエラーが発生しaptが実行できなかったです。
よくわからないプロセスが動いていたのでkillしたら解決しました。


## 参考
http://dotnsf.blog.jp/archives/1067895289.html
https://mebee.info/2021/05/26/post-34983/
ECMAScript

# ECMAScript
JavaScriptはGoogleChromeやMicrosoftEdge等の**ブラウザ上で動作する言語**。
世界中の人がJavaScriptを使用していて、好き勝手に機能を追加するわけにはいかないので、ECMAScriptと呼ばれる**JavaScriptの標準仕様**が定められた。
(ECMAとはEuropean Computer manufactureres Associatation:欧州電子計算機工業会の略)
# JavaScriptの歴史
JavaScriptはNetscape社（現 Oracle社）によって開発。当時は**LiveScript**と呼ばれていた。
Netscape社と提携を結んでいた Sun Microsystem社（現 Oracle社）が開発していたJavaが非常に人気だったため、LiveScriptはJavaScriptに名称変更。
その後、Microsoft社がJScriptという言語を開発し、IE(InternetExploer)に搭載しており、Netscape社のJavaScriptとは仕様が異なっていたことから、非常にややこしくなっていた。
そこで国際団体ECMAインターナショナルにJavaScriptの中核的な仕事の標準化を依頼し、誕生したのがECMAScriptという標準仕様。
**ECMAScriptをベースとすることで互換性が向上した**
**現在は年に一回ECMAScriptが更新されるようになっている**
# ECMAScriptの通称
かつては、改訂するたびにEC2,EC3,...と読んでいましたが、
2015年に標準仕様は年に一回更新すると決まってから、
**EC2015**（EC6）,**EC2016**(EC7)と西暦をつけた呼び方が一般化
# モダンJavaScriptへの転換機
**近代JavaScriptの転換期**となるのが、
**EC2015**（EC6）です。
React等のモダンJavaScript開発でも必須な文法や機能が追加された
* let,constを用いた変数宣言
* アローファンクション
* Class構文
* 分割代入
* テンプレート文字列
* スプレッド構文
* Promise
など...
Macで特定のフォルダに画像を保存したら、画像のマークダウンがクリップボードに自動でコピーされるようにする方法

![Screen Shot 2022-08-05 at 18.01.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527661/68303c44-24fb-90b5-401d-08e759e5669f.png)


![Screen Shot 2022-08-05 at 18.00.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527661/18784e93-d35a-d3f3-acbc-f070b6f51438.png)

![Screen Shot 2022-08-05 at 18.04.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527661/d7b18e3e-d18a-1ffd-d120-95b2e544b0ff.png)

Run Shell Scriptの中身
```shell
latest_screenshot=$(ls -Art 画像/を/保存/する/パス/ | tail -n 1)
echo \!\[Screen Shot\]\( 画像/を/保存/する/パス/$latest_screenshot\)| pbcopy
```

latest_screenshotが.DS_Storeになってしまう場合は以下に変更する
```shell
latest_screenshot=$(ls -Art 画像/を/保存/する/パス/ | tail -n 2 | head -n 1)
echo \!\[Screen Shot\]\( 画像/を/保存/する/パス/$latest_screenshot\)| pbcopy
```
blenderでglTF2.0でエクスポートした時に、透過が反映されない場合の解決方法

blender3.2.2を使って、モデリングしています。
glTF2.0でエクスポートしたときに、ダイヤモンドのマテリアルが反映されない問題が生じました。

ネットで調べた方法では、解決できませんでした。

こちらに、解決に至った経緯を書きました。

https://teratail.com/questions/cn0k9u9atobcpn

## 解決方法
blenderでエクスポートしたGLB形式のファイルを、VSCODEのglTF TOOLという拡張機能を使いインポートしました。

読込したいGLBファイルを右クリックして、出てくるメニューの下から2つ目のimportの項目を選択すると、編集できるgltfのテキストファイルとバイナリーファイルが作られます。

ファイルを保存する時に、保存先を選ぶ画面が表示されます。

この設定をする前は、今回修正したアルファの値が無かったのです。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20977/841c5368-ddeb-fe8a-f8ca-7cd7c07bd435.png)

一応blenderで、このようにマテリアルの設定をすると良いです。
![マテリアル-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20977/64388ac6-34e8-7269-6a0f-aa21f6ec69ca.png)
ベースカラーで、Aがアルファの値のようです。
とりあえず関連があるか分かりませんが、修正してみました。
他の色も、アルファの値を修正しています。

![マテリアル-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20977/bd56aa12-b3dc-635f-5c49-82e70b959cb1.png)

こちらが、編集できた画面です。
ビューアーで無事に、透過が反映されています。

![Screenshot from 2022-08-05 15-55-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20977/a7a06329-112f-e686-028f-0a66ad76c05b.png)

マテリアルのこの場所の値を、手入力で修正しました。
![マテリアル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20977/e47036fa-74dd-0ba9-23c1-91fe2d3a3d89.png)
### この画像のbaseColorFactorの値が、RGBとアルファの値と分かりました。
そのため、アルファの部分の値を0.5に変更してみました。
無事に、透過になりました。

metallicFactorは、輝きを出したかったので、値を高めにしました。

baseColorFactorの値が見つからない時は、記事の冒頭で書きましたノードの設定を行ってみて下さい。

ビューアーで透過の確認が出来まいたので、gltfの拡張子のファイルを右クリックして、エクスポートを選び、エクスポートしました。

webのglTFビューアーでも、透過が反映されていました。

https://gltf-viewer.donmccurdy.com/

![gltf001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20977/386f67b9-9aa7-54ca-6352-ff66ba82cb01.png)
QuickSightスピードラーニング

# Qが紛らわしかった
QuickSightに入門することになったので、理解をまとめることにしました。

# QuickSightでできること
SPICEいう名前のデータ領域に投入されたビッグデータをダッシュボードの形で可視化する。


```mermaid
flowchart TB
  input1[Amazon S3] & input2[RDS等リレーショナルデータ] & input3[JiraやGitHub等SaaS]
  input1 & input2 & input3 & 他公式ガイド参照 --> DB[(SPICE)]
  閲覧者 --> QS
  subgraph QuickSight
  QS[QuickSightダッシュボード]
  DB --> QS
  end
```


:::note warn
※"ビッグ"データ、"可視化"など個人の主観に基づく表現が以降も含まれます。
:::
:::note warn
今日公式ガイドを読み始めて理解したことをまとめているので、ここの内容が全てでないことをお断りしておきます。
:::

# 閲覧者とは
https://aws.amazon.com/jp/quicksight/pricing/

名前の通りだがQuickSightで構築したダッシュボードを閲覧する利用者。
QuickSightはEnterprise版なら(?)、AWS管理コンソールではない専用のログイン画面を用意してくれる。
メールレポートも可能。

### コスト

閲覧者1人あたりMAX5ドルのコストで追加が可能。（従量課金だが5ドルの天井があり、それ以降は使えなくなるのではなく使い放題(!!!)になる）
メールレポートは従量課金の前払いのイメージ。レポートを送った時点で1セッション(30分)分課金されてしまうが、
そのレポートからQuickSightを閲覧したり別導線からアクセスしても１セッション分は課金されない。(上記ページを読んだ理解）

# Qとは
閲覧者が、自然言語による検索クエリを発行できると理解。お値段が高い。
使わないと思うので一旦パス。

# 用意するデータに関して
https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/supported-data-sources.html

QuickSightに食わせたいデータは、おおよそファイル(S3)もしくはRDBMSとして用意すれば良いと理解。
特段の事情がない限り、構築の簡単のためAWSアカウント内に用意するものとする。

### ファイル
* 配置方法：S3
* ファイル形式：CSV,TSV,JSON,他公式ガイド参照
* 制約：後述のSPICEのクォータに準ずる

### RDBMS
* Amazon Athena
* Amazon Aurora
* Amazon Redshift
* 他(Oracle, PostgreSQL, MySQLなど多数）

# SPICEに関して
https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/data-source-limits.html
### クォータ
* １ファイル2000列
* 列名127文字
* フィールド2047文字

### 容量計画（コスト）
https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/spice.html

* 数値型・日付型：8byte固定
* 文字列型：UTF-8エンコードされた文字長＋8byte
* 地理空間データ型：メタデータをもとにデータ型を解釈する。緯度経度は数値、他は文字列になる。

# 最後に
定時なので今日はここまで。
DOMと仮想DOM

# DOMとは
**DOM**とは・・・HTMLを解釈し木構造で表現したもの
本来、JavaScriptで画面の要素を変更するときは、
DOMを直接指定して書き換えるような処理をしていた。

```javascript
//id=Messageを持つ要素の配下にHello World！!と設定したpタグを差し込む
var textElement = document.createElement("p");
textElement.textContent = "Hello World!!";
document.getElementById("Message").appendChild(textElement);
```
このようなコードは手続的でわかりやすい反面、レンダリングコストやコードの肥大化が問題だった。
このような問題を解決するために作られたのが**仮想DOM**

# 仮想DOMとは
**仮想DOM**とは・・・JavaScriptのオブジェクトで作られた仮想的なDOMのこと
実際のDOMとの差分を比較して**変更箇所のみを実際のDOMに反映**
ReactやVue等のモダンJavaScriptのフレームワークやライブラリでは仮想DOMが使われている。
ページ遷移をJavaScriptによる画面の書き換えで表現し、レンダリングコストを最小限に抑え、快適なWebシステムを提供している。
SwiftUI開発サンプル(Preview,View加工,ViewAnimation)


## PreviewのResumeボタン押すのをショートカットキーでやるには？
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678249/d165c979-2074-8003-5375-7afd171a6b15.png" width=320>

この操作自体は
メニューバーのEditor -> Canvas -> Refresh Canvas
これでできます。

ショートカットキー（Key Bindings)には
`command + option + p`
デフォルトでこちらが割り当てられています。

## PreviewのViewのサイズを小さくして要素の大きさに合わせる
```swift
.previewLayout(.sizeThatFits)
```
# Viewの加工

##### Viewを丸でくり抜くには？
```swift
.clipShape(Circle())
```
##### Viewに影をつけるには？
```swift
.shadow(radius: )
```
##### Viewに丸い線を上に重ねる
```swift
.overlay {
    Circle().stroke(色, lineWidth: )
}
``` 

##### 組み合わせる
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678249/3160a1aa-e1bb-cf46-6425-34df952a84d8.png" width=200>

```swift
Text("Circle\nShadow\nOverlay")
    .frame(width: 100, height: 100)
    .foregroundColor(.white)
    .background(.blue)
    .clipShape(Circle())
    .shadow(radius: 7)
    .overlay {
        Circle().stroke(.white, lineWidth: 4)
    }
```

#  Viewのアニメーション



##### 回転
```swift
.rotationEffect(.degrees(isOn ? 90 : 0))
```
##### 拡大縮小
```swift
.scaleEffect(isOn ? 1.5: 1)
```
##### 透明度
```swift
.opacity(isOn ? 1.0 : 0)
```

##### 値の変更を`withAnimation`ブロックで囲うことでアニメーションする

```swift
@State private var isOn = false
...
wthAnimation {
    isOn.toggle()
}
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678249/63e35976-2654-d6cf-7948-326d9293c9e2.gif" width=100>

```swift
Button {
    withAnimation {
        isOn.toggle()
    }
} label: {
    Text(">")
        .opacity(isOn ? 1.0 : 0.5)
        .rotationEffect(.degrees(isOn ? 90 : 0))
        .scaleEffect(isOn ? 0.8: 2.0)
        .padding()
}
```
laravel updated_at を更新させない save,upsert

updated_atを更新したくない場合は、以下のように書く。


# save

```hoge.php
$model = new User;
$model->data = "hoge";
$model->timestamps = false;//updated_atを更新しない
$model->save();
```

# upsert時

```hoge.php
$model = new User;
$model->timestamps = false;
$model->upsert($res,['id']);
```
[Python] jupyter notebookでplt.imshow()時にkernel deadとなる場合

jupyter notebook上でplt.imshow()を実行したときに以下の画面のようになった。
```
Kernel Restarting
The kernel appears to have died. It will restart automatically.
```
![スクリーンショット 2022-08-05 172627.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594896/91f27f82-96a8-3144-fc35-31262484db95.png)


以下を入れると解決した。
```python
import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'
```
Microsoft365エクセルで新規ファイル保存時のフォルダー初期値を設定

# 概要

新規ファイルはローカル or ファイルサーバーに保存することが多い。
OneDriveが初期値になっているといちいち変更するのが面倒。

そんな時。

# やり方

左上。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2a015d39-3f5f-46ab-2800-b76dcc3e6997.png)

左下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/add0b375-f450-7aba-a02e-8b2d9912c321.png)

保存⇒規定のローカルファイルの保存場所。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/79bd8d53-c7b0-fb2b-d459-ec9eea0688ed.png)

OKで確定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ad820d9e-a135-322a-0ff2-edafdf8bf62b.png)

存在しないフォルダーは設定不可。
（現在時刻を元にしたフォルダーを新規作成してそこを保存先に…みたいなことはできなさそう）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/cff44d3f-9b72-66cd-feec-fd3a63991ec6.png)

設定終了したら保存時こうなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b634cca9-7119-5a98-7b50-1d32f47a9752.png)


# 参考サイトさん

https://faq.nec-lavie.jp/qasearch/1007/app/servlet/relatedqa?QID=020451

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1889
Microsoft Excel for Microsoft 365 MSO (バージョン 2207 ビルド 16.0.15427.20166) 32 ビット
AWS利用の仕組み 

# サービスを利用しやすい仕組み
専門的な技術者が不要であるというのも、AWSの大きな特徴です。
専門家でなくても操作をしやすい仕組みが備わっていて、
その代表例が
**マネジメントコンソール**と**マネージドサービス**です。

## マネジメントコンソール
マネジメントコンソールは、Webブラウザ上のGUIでAWSを操作できる画面です。
* ユーザーやグループの作成
* 権限やセキュリティの設定
* 各種サービスの構成を変更
* サーバーやデータベースなどの起動や終了
* バックアップ

## マネージドサービス
マネージドサービスは、AWS側で管理されるサービスの総称
バックアップやアップデートが自動で行われる。
→管理者が手動で行わないため、管理の手間が省ける。

仮想サーバー（EC2）にはないが、ストレージ（AmazonS3）やDBサーバー（AmazonRDS）などにはマネージドサービスがある。
ストレージの容量が自動的に増えたり、自動的にアップデートしてくれる
※勝手に料金がかさむことがある。
* 自動バックアップ
* 自動アップデート
* モニタリング
* バッチ管理
* セキュリティ
* 故障に備えた冗長化（同じシステムを用意して、障害時にシステムの停止を防ぐ）

## セキュリティ的に安心できる仕組み
サーバーを安定して運用するためには、サーバーをファイアウォール（不正な通信を遮断する仕組み）で守ったり、OSやソフトウェアのアップデートで脆弱性を塞いだりするなど、日々のセキュリティ管理が必要。
AWSのマネージドサービスでは、ソフトのアップデートなど運用作業は自動的に行われるため、常にセキュアな状態で運用でき、常に一定の水準を期待できる。

>参考文献
AWSのしくみと技術がこれ一冊でしっかりわかる教科書
React(TypeScript + ReduxToolkit + AWSAmplify)の構成でアプリを作成をしました【課題その④】【Blog app】

## 学習したスキル

- React+Redux+AWSAmplifyを用いたサーバレスアプリケーションの開発スキル
- AmplifyAuthを用いたユーザ認証機能の実装スキル
- AmplifyDataStoreを用いたCRUD機能実装スキル
- Amplify＋Githubを連携させたデプロイスキル

## 作成したアプリについて

[React(TypeScript + ReduxToolkit + Chakra UI + amplify)の構成 でアプリを作成しました【回覧板アプリ】](https://qiita.com/kanfutrooper/items/d1ce2785b59b9a871015)

https://develop.d359ve49zsh6ze.amplifyapp.com/
## AWSの概要

AWSとは、Amazonが提供するクラウドコンピューティングで、クラウドコンピューティングとは、インターネット経由でデータベース、ストレージ、アプリケーションなど様々なITサービスをオンデマンドで利用できるサービスのこと。

## AWSAmplifyの概要

AWS Amplifyとは、モバイルアプリケーションやウェブアプリケーションを構築するための開発プラットフォームのことで、AWSの様々なサービスを使用し、クラウドサービス上で安全かつ簡単にアプリケーションを開発することが可能。

## 自身が今回の課題をこなす上で苦労した点

課題の作成方法がいろんなパターンがあり、
どのやり方で作成するのが良いか迷い、何度も作り直しをした。


## 苦労した点をどのように克服したか

学習するのが目的の為、今まで触ったことのない技術を選定し、
練習の為、練習用のアプリを何個も作成した。

## アプリ作成にあたり思うこと

今回のアプリを作成するにあたり、作る前にあれこれ機能を追加したいと思い、最終的にまとまらず、無駄な時間を要した。色々作成したので、その点は勉強にはなったが、今後はある程度、練習も必要だが時間も考えて実装するようにしたい。

## 参考サイト
[AWSとは何かわかりやすく解説！できることや導入のメリットも紹介](https://www.yume-tec.co.jp/column/awsengineer/4497)
[AWS Amplifyとは何か？利点や特徴についてもあわせて解説](https://www.yume-tec.co.jp/column/awsengineer/4597)
jqueryで一番下にスクロールするもっとも簡単な方法

# jqueryで一番下にスクロールするもっとも簡単な方法

## まえがき
ブロックを下に追加していく形のUIを作成していた際に、
下に追加されたブロックが表示上限を超えるとどんどん見えなくなってしまうことを避けるために実装したかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704180/05dbddb0-bd70-6667-f716-508ac32117a4.png)


それっぽい記事がstackoverflowにしかなかったので令和版、日本語版で保存・共有しておく
> https://stackoverflow.com/questions/10503606/scroll-to-bottom-of-div-on-page-load-jquery

## 環境
- jquery 3.6.0
## たった1行
~~~javascript
	// 一番下にスクロールする
	$('hoge').scrollTop($('hoge')[0].scrollHeight);
~~~

> hogeが通じない世界が来たと聞いて
>> https://wa3.i-3-i.info/word11871.html
FreeBSDとNetBSDのmipsサポート

DSPのサポートがあるNetBSDを参考にするため調べてみました。

FreeBSDのmipsサポートはNetBSDやOpenBSDのmipsサポートを元にしているところがあります。OpenBSDはmipsの32Bitのサポートは削除されています。

システムコールはソフトウエアインターラプトでエクセプションになるのでそのときにPCB(Process Control Block)構造体にレジスタを退避させます。

FreeBSDはsys/mips/mips/exception.Sの

NESTED_NOPROFILE(MipsUserGenException, CALLFRAME_SIZ, ra)

の中になり、

NetBSDではsys/arch/mips/mips/mipsX_subr.Sの

NESTED_NOPROFILE(MIPSX(user_gen_exception), CALLFRAME_SIZ, ra)

の中になります。

後はエクセプションを抜けるときに、続けるプロセスのPCBからレジスタを復元します。

戻るプロセスは元のプロセスになるとは限りません。

FreeBSDなどのUNIXではシステムコールでプロセスのスイッチをしています。

DSPサポートではac0,ac1,ac2,ac3のステータスのレジスタが追加されていて、ac0は0のようなので、ac1,ac2,ac3とステータスを退避させる必要があります。NetBSDではmips_dsp.cというファイルにコードがあります。

この退避のコードはuser_gen_exceptionからは直接は呼ばれずシステム全体の仕組みの中で呼ばれるようです。

ステータスを設定せず、DSP命令を使うとエクセプションになるのですが、なんでそんな仕様なのかと思っていたのですが、DSP命令を使うプロセスだけDSPを有効にして、レジスタの退避と復元を行うためなのかもしれません。

サポートにはCPUのステータスレジスタにフラグを立てるというのと、DSPレジスタとステータスの退避復帰が必要です。

レジスタの退避はFPのレジスタも同じようなこことをするので、参考にするのがいいです。

FreeBSDでFPの退避と復旧はmips/switch.Sの中のMipsSwitchFPStateとMipsSaveCurFPStateで行われます。前者は退避と復旧を行い、後者は退避だけを行います。

CPUのフラグだけ立てて、退避復帰をしないと、ときどき間違えが発生しますが、致命的なエラーにはなりません。
Vue.js 2 基底コンポーネントを一括登録する

### コード

```typescript
// main.jsにて
// 基底コンポーネントフォルダパス： src/components/base
const files = require.context('./components/base, true', /\.vue$/)
const components = {}
files.keys().forEach(key => {
  components[key.replace(/(\.\/|\.vue)/g, '')] = files(key).default
})

Object.keys(components).forEach(key => {
  Vue.component(key, components[key])
})

```



### 使用

```vue
// コンポーネント内でそのまま使えば大丈夫です！
<base-title />
```