OmniAICreator/Qiita-1.07M huggingface dataset:
データ分析に役立つ情報リンクを雑にまとめていく（随時更新）


# この記事はなに？
データ分析に関して、特に価値が高いなと勝手に思ったnote・書籍・記事のリンクをまとめていきます。
「ビジネス」「データサイエンス」「データエンジニアリング」「その他」という軸でまとめています（小項目の粒度はまちまち、ご容赦ください）

全て読むのは大変なので、興味があったり実務で直面している分野から目を通していくのが吉。

# ビジネス面

### データ分析全般
データ解析の実務プロセス入門
https://www.amazon.co.jp/dp/4627817711/

Simple Data Analyticsで成果を出す
https://speakerdeck.com/hik0107/simple-data-analytics-leads-impact

分析とはひとことでいうと◯◯◯である
https://note.com/hik0107/n/ne240d47572c9?magazine_key=m7b075d16be21

Good Data Analysis（Google）
https://developers.google.com/machine-learning/guides/good-data-analysis

### 仮説の立て方
イシューから始めよ
https://www.amazon.co.jp/dp/B00MTL340G

解像度を高める
https://speakerdeck.com/tumada/jie-xiang-du-wogao-meru



### KGI・KPI設計
Lean Analytics
https://www.amazon.co.jp/dp/4873117119

良いKPIとは何か
https://note.com/hik0107/n/n54c536cc8321

KPIは「シンプルに作る・王道なモデルを使う・みんなで作る」のが良い
https://note.com/usagidon/n/nc08129f4af17?magazine_key=m7b075d16be21

KPI自動通知Botで始める 数字に執着するプロダクトマネジメント
https://note.com/okutaku/n/n997052a6cdc9?magazine_key=m7b075d16be21


### データに基づく意思決定

意思決定のROI
https://note.com/hik0107/n/n9be0e1647e31


### サービスグロース
継続率向上施策で踏み抜いてきたアンチパターン3選
https://note.com/aomegane/n/ndad9be010951?magazine_key=m7b075d16be21

アナリストがプロダクトディスカバリーに触れ、デリバリー至上主義から改心した話
https://note.com/hiroism/n/na625e0f0dda7

### 可視化・ダッシュボード
Google流 資料作成術
https://www.amazon.co.jp/dp/B0B46281D1

明日から真似できる！ ケース別データ可視化のノウハウ
https://speakerdeck.com/haseryo/dataengineeringstudy-number-12-ming-ri-karazhen-si-dekiru-kesubie-detake-shi-hua-falsefalseuhau

文春オンラインの記事分析を支える爆速ダッシュボードを作るまで
https://note.com/shota_tjm/n/n6094dd076607?magazine_key=m7b075d16be21


### データ分析組織
Rettyのデータ分析組織設計事例
https://speakerdeck.com/masadooon/improve-analysis-team-structure-to-business-phase

Retty データ分析チーム2021年振り返り（Data-Informed/自立自走/分析の民主化）
https://tinyurl.com/273z5gdw

# データサイエンス面

### ABテスト
メルカリにおけるA/Bテスト標準化への取り組み
https://note.com/mercari_data/n/nb1044a53c1ab

A/Bテスト実践ガイド
https://www.amazon.co.jp/dp/B08Z3TPVZG




### 統計的仮説検定
統計的仮説検定における効果量の概念と必要サンプルサイズの算出
https://note.com/dd_techblog/n/n73eca35106c7?magazine_key=m7b075d16be21


### 因果推論
効果検証入門
https://www.amazon.co.jp/dp/B0834JN23Y

岩波データサイエンス Vol．3
https://www.amazon.co.jp/dp/4000298534


### レコメンデーション


### 自然言語処理
東京大学深層学習（Deep Learning基礎講座2022）深層学習と自然言語処理
https://speakerdeck.com/verypluming/dong-jing-da-xue-shen-ceng-xue-xi-deep-learningji-chu-jiang-zuo-2022-shen-ceng-xue-xi-tozi-ran-yan-yu-chu-li



# データエンジニアリング面

### データマネジメント
データマネジメントが30分でわかる本
https://www.amazon.co.jp/dp/B085W4YSZJ

実践的データ基盤への処方箋
https://www.amazon.co.jp/dp/B09MSX9MQV

スケールし続ける組織におけるデータマネジメント
https://note.com/eassk/n/ndf12d0804621?magazine_key=m7b075d16be21


### SQL

SQL記述者全員が理解すべきSELECT文の論理的な処理順序のお話
https://qiita.com/k_0120/items/a27ea1fc3b9bddc77fa1


### Looker



# その他

### データアナリストのキャリア

CSO型データアナリストというキャリア
https://note.com/aomegane/n/n3131c7a0acbe?magazine_key=m7b075d16be21
【Xcode】アップデート時にエラー発生

# エラー文
![スクリーンショット 2022-06-25 1.56.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/68d1a3a3-8804-f3c2-fd31-200c3fac788a.png)
```
Unable to process request - PLA Update available
You currently don't have access to this membership resource. To resolve this issue, agree to the latest Program License Agreement in your developer account.
```

```
No signing certificate "iOS Distribution" found
No "iOS Distribution" signing certificate matching team ID "XXXXXXXXX" with a private key was found.
```

# 原因
更新されたApple Developer Programの使用許諾契約に同意していないから。

# 解決方法
[App Store Connect](https://appstoreconnect.apple.com/)を開きます。
1番上に「Apple Developer Programの使用許諾契約が更新されました」という警告が表示されます。
文章内の「アカウント」を選択します。
![スクリーンショット 2022-06-25 1.57.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/58278adf-a272-4bb7-a5c3-b4cb27c44820.png)

遷移先の画面の1番上に赤いラベルが表示されます。
ラベル内の「Review Agreement」を選択します。
![スクリーンショット 2022-06-25 1.57.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/5a954765-fd43-548a-9aaf-b455b5de2f8f.png)

使用許諾契約が表示されます。
確認をして、チェックボックスにチェックを入れて「I Agree」を選択します。
![スクリーンショット 2022-06-25 1.57.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a50abd8b-825e-649f-a342-395b5e0669b7.png)

# おわり
突然表示されたので、焦りましたが簡単に対処することができました
gcov 詳細メモ (コマンドのみ列挙。詳細な説明なし)


## 概要

下図のような gcov 計測結果を得るための手順メモ. 
数年ごとに gcov を使用することになるのだが、そのたびにコマンドを調べ直すのが手間なので書き出しておく.

今回は「*.c ファイルを対象」にして、「C1 カバレッジまで取得」する場合とする.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/09ba1189-44ed-eace-0f60-6da7613b6709.png)

なお、余談になるが、
c++ の場合は string型などを定義しただけで分岐が発生し、正確な計測ができない問題があった.
(この場合は gcov -b のログから C1 計測するしかなかった)
　

## 環境

```
- Ubuntu 18.04
- gcc 7.5.0
- gcov 7.5.0
- lcov 1.13
```

　

## 手順


### 全ファイルを計測する場合

```bash
#! gcov ありオプションでビルド (コンパイル&リンク) する
$ gcc (略) -fprofile-arcs -ftest-coverage (略)

#! 作成したプログラムを実行する
$ ./mini_expect ls -1

#! カバレッジ率を算出する (*.gcda)
$ find . -type f -name "*.gcda" | xargs -I@ gcov -b @

#! lcov を使って *.info を生成する
$ lcov --rc lcov_branch_coverage=1 -c -d . -o tmp.info

#! genhtml を使って *.info から HTML を生成する
$ genhtml --branch-coverage -o OUTPUT -p . -f tmp.info 
```

　

### 特定ファイルのみ除外したい場合

lcov に「-r tmp.info  '/usr/include/*'」といったように除外したいファイルを指定すること

```bash
#! gcov ありオプションでビルド (コンパイル&リンク) する
$ gcc (略) -fprofile-arcs -ftest-coverage (略)

#! 作成したプログラムを実行する
$ ./mini_expect ls -1

#! カバレッジ率を算出する (*.gcda)
$ find . -type f -name "*.gcda" | xargs -I@ gcov -b @ | tee -a log

#! lcov を使って *.info を生成する
$ lcov --rc lcov_branch_coverage=1 -c -d . -o tmp.info

#! /usr/include/ を計測対象外にする (tmp.info から output.info を作る)
$ lcov --rc lcov_branch_coverage=1 -b -c -d . -r tmp.info  '/usr/include/*' -o output.info

#! genhtml を使って *.info から HTML を生成する
$ genhtml --branch-coverage -o OUTPUT -p . -f output.info 
```

　

以上.
python で カウンティングなセマフォを使ったマルチスレッド(サンプルプログラム)

# はじめに
同時に並行する処理数を制限するマルチスレッドのサンプルプログラミング

# コード
```python
import threading
import logging

# デバッグログ出力設定（どのスレッドの実行かがわかるので便利）
logging.basicConfig(level=logging.DEBUG, format="%(threadName)s: %(message)s")


# 1からmaxまで、かつmultipleの倍率のみ、値を出力する
def counter(smp=threading.Semaphore(1), result=[], index=-1, multiple=1, max=1):
    with smp:
        for i in range(1, max + 1):
            if i % multiple == 0:
                logging.debug(i)

        result.append(index)


if __name__ == "__main__":

    # 値のループ用
    params = [
        {"multiple": 1, "max": 25},
        {"multiple": 2, "max": 8},
        {"multiple": 3, "max": 9},
        {"multiple": 4, "max": 20},
        {"multiple": 5, "max": 20},
    ]

    # セマフォ定義
    smp = threading.Semaphore(3)
    # 各スレッドの共有の変数で使用
    result = []

    # パラメータベースでのループ
    for index, param in enumerate(params):
        # 処理完了順がわかるようにindexを追加
        param["index"] = index
        # スレッドの定義(targetは仕様する関数を指定、argsは引数を順番に指定、diectを渡す場合はkwargsに指定)
        trd_execute = threading.Thread(
            target=counter,
            args=(
                smp,
                result,
            ),
            kwargs=param,
        )
        # 処理開始
        trd_execute.start()

    # スレッド全体が終了するまでブロック
    for trd in threading.enumerate():
        if trd is threading.currentThread():
            continue
        trd.join()

    # 処理が終わった順番が分かる
    print(result)

    # 終了時の処理
    print("complete")
```

# 解説
初めに配列の１～３番目の値を引数としたcounterが実行され、どれかが終わったら４番目の値を引数としたcounterが実行、その後１～４番目のどれかの処理が終わったら５番目の…という形になる
また、resultの結果を見ると、処理が終わった順番が分かる

# 終わりに
for で thread使わなかったり、Semaphore使わなかったりすると、違いが理解できてよいかと
ELBの用語要点まとめ１

・Elastic Load Balancing（ELB）
AWSが提供する負荷分散サービス。マネージドサービスであり、ユーザーは必要なアプリケーションのインストールやバージョンアップなどを考慮することなく、負荷分散機能を利用できる。

負荷分散（ロードバランシング）とは
サービスの利用者が増えてくると、単一のリソースでは全てのリクエストを処理しきれなくなり、結果としてレスポンスの遅延が起こります。このような場合、リクエストを処理するリソースを複数配置し、それらのリソースにリクエストの処理を分散することでレスポンスの遅延が発生しないようにできます。
このような仕組みを負荷分散（ロードバランシング）という。

ELB配下の負荷分散先リソースのことを「ターゲット」といい、一つのELB配下で管理されるターゲットの集合を「ターゲットグループ」といいます。ターゲットにはEC2などのインスタンスや、IPアドレス、Lambda関数が指定でき、それらをまとめたターゲットグループ単位に負荷分散を行う。
なお、AZ障害時の影響を少なくするためにも、ターゲットはマルチAZ（複数のAZに配置する構成）にするのが一般的。

ELBはAWS Auto Scalingに対応しています。負荷の増減によって自動的にEC2などのインスタンスを追加（スケールアウト）したり、削除（スケールイン）したりできます。


【ELBの種類】
ELBにはロードバランシングの方式によって複数の種類がある。

■Application Load Balancer（ALB）
レイヤー7（アプリケーション層）で負荷分散を行う。
ALBではHTTP、HTTPSをサポート。また、WebSocketや、同一インスタンス内の複数ポートへの負荷分散、ホストベースやパスベース、URLクエリ文字列でのルーティングに対応しています。

WebSocketとは、ひとつのコネクション内で永続的にサーバー/クライアント双方からデータ送信できる技術。通常のWebアプリケーションの場合、クライアントからのリクエストにサーバーがレスポンスを返して接続終了となるが、WebSocketを使うと、一度接続したコネクションではクライアントからのリクエストがなくてもサーバー側からデータを送信できる。
チャットや株価情報のような、リアルタイムな情報提供を必要とするアプリケーションでよく使われる。

○ALBが対応している主なルーティング

・ホストベース
ホストベースのルーティングとは、クライアントがリクエストした接続先URLのFQDNに従ってルーティングできる機能のこと。例えば、クライアントの接続先URLが「http://www1.example.com」の場合はWebサーバー1にアクセスさせて、「http://www2.example.com」の場合はWebサーバー2にアクセスさせることができます。

・パスベース
パスベースのルーティングとは、クライアントがリクエストした接続先URLのパスに従ってルーティングできる機能のこと。例えば、クライアントの接続先URLが「http://www.example.com/web1/」の場合はWebサーバー1にアクセスさせて、「http://www.example.com/web2/」の場合はWebサーバー2にアクセスさせることができます。

・URLクエリ文字列
URLクエリ文字列でのルーティングとは、クライアントがリクエストした接続先URLのクエリ文字列に従ってルーティングできる機能のこと。URLクエリ文字列とは、ブラウザがWebサーバーに送信するデータをURLに表記したものです。URLが「http://www.example.com/web?lang=jp」であれば「?lang=jp」がURLクエリ文字列に該当。


■Network Load Balancer（NLB）
NLBはレイヤー4（トランスポート層）で負荷分散を行う。
NLBではTCP、UDP、TLSをサポート。また、WebSocketや、同一インスタンス内の複数ポートへの負荷分散に対応。

NLBはElasitc IPアドレス（固定のパブリックIPアドレス）と関連付けることができます。これによりクライアントからNLB配下のサーバーに、NLBに関連付けられたElastic IPアドレスでアクセスできるようになります。サーバーへのアクセスをドメイン名ではなくIPアドレスで行いたい場合や、クライアントのアクセス先をIPアドレスで管理・制限している環境などで有用。
Elasitc IPアドレスと関連付けられるのはNLBのみですが、NLBのターゲットにALBを指定すると、クライアントからALB配下のサーバーにNLBのElastic IPアドレスでアクセスできるようになります。

■Classic Load Balancer（CLB）
CLBはレイヤー7（アプリケーション層）およびレイヤー4（トランスポート層）で負荷分散を行う。
CLBではHTTP、HTTPS、TCP、SSL/TLSをサポート。CLBはALBやNLBより古いサービスでパフォーマンスが劣るため、基本的にはALBやNLBの利用が推奨。
Gitで使用するSSHキーを指定する方法あれこれ

gitでSSH接続する際、デフォルトでは `~/.ssh/id_rsa` が使用されますが、これとは別のSSH鍵を使う方法を紹介します。

# ~/.ssh/configを使う方法

`~/.ssh/config` に以下の様な設定を書きます。

```
Host github.com
 HostName github.com
 IdentityFile ~/.ssh/id_rsa_github

Host bitbucket.org
 HostName bitbucket.org
 IdentityFile ~/.ssh/id_rsa_bitbucket
```

この様に書くとリモートリポジトリがGitHubの場合には `~/.ssh/id_rsa_github` を、bitbucketの場合は `~/.ssh/id_rsa_bitbucket` が使われます。

Gitだけ普段とは別のSSHキーを使いたい場合や、リモートサーバごとに鍵を使い分けたい場合にはこの方法が便利です。

# `core.sshCommand` 設定を使う方法
Gitリポジトリごとに異なるSSHキーを使う場合には以下の方法が便利です。
以下のワンライナーコマンドで、指定したSSH鍵を使ってクローンし、さらにそれ以降もその鍵を使うように `.git/config` に設定を保存してくれます。

```
git clone -c "core.sshCommand=ssh -i ~/.ssh/id_rsa_example -F /dev/null" git@github.com:example/example.git
```

既に存在しているリポジトリで、使用するSSH鍵を指定するには以下のようにします。

```
git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
```


# `GIT_SSH_COMMAND` 環境変数を使う方法
以下のように `GIT_SSH_COMMAND` という環境変数を使ってSSH鍵を指定することも可能です。

```
export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git clone git@github.com:example/example.git
```

これは上で紹介した `core.sshCommand` が使えないケース（ `.git/config` を汚したくない場合など）で、その場かぎりの鍵を使うケースなどで使えそうです。
WebArena Indigo環境設定9) コマンドのインストール

WebArena Indigo 環境設定8) httpdの設定
https://qiita.com/naga_kt/items/47e9dd08272c1ff552a1
の続き。

　httpd以外のよく使うコマンドについてインストールの仕方を記載した。

## screen

CentOS7

~~~linux
$ sudo yum install screen

~~~

RockyLinux8

~~~linux
$ sudo dnf install epel-release

$ sudo dnf --enablerepo=epel install screen

~~~


## lockfile

CentOS7/RockyLinux8

~~~linux
$ sudo yum install procmail

~~~

## sqlite

CentOS7
　デフォルトで搭載されている。

RockyLinux8
~~~linux
$ sudo yum install sqlite

~~~

## jq

CentOS7
　デフォルトで搭載されている。

RockyLinux8

~~~linux
$ sudo yum install epel-release

$ sudo yum install jq --enablerepo=epel

~~~

## make

CentOS7
　makeはデフォルトで搭載されている。次のようにgccをインストールする。

~~~linux
$ sudo yum install gcc

~~~

RockyLinux8

~~~linux
$ sudo yum install make

$ sudo dnf group install 'Development Tools'

~~~

## mail

CentOS7/RockyLinux8

~~~linux
$ sudo yum install mailx

~~~

---

WebArena Indigo環境設定10)サーバ再起動時の設定
https://qiita.com/naga_kt/items/1ca459a172b114e562d4
に続く。

---

## 参考記事

(screen)
CentOS7.1にscreenをインストールする方法
https://konoyodehitori.hatenablog.com/entry/centos7-install-screen/

CentOS8で困ったこと　
https://qiita.com/scheveningen/items/f163093281d71bef6436

(jq)
CentOS7に15秒でjqコマンドをインストールする
https://www.setouchino.cloud/blogs/73

(make)
CentOS 8の"Development Tools"パッケージグループの中身を確認する
https://qiita.com/charon/items/f2b368cccbac95fc6489
[JavaScript]sort()で連想配列をソートする

# はじめに
今回は、JavaScriptのsort()について学んだことをまとめておきたいと思います。

sort()の基本構文の説明後、タイトルのサンプルコードを紹介します。

# 目次
[1.sortメソッドとは](#1-sortメソッドとは)
[2.本題](#2-本題)
[3.参考記事](#3-参考記事)

# 1. sortメソッドとは

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

sort()は、配列の要素を並び替えるメソッドです。
引数を指定しない場合、配列内の各要素を文字列に変換して昇順で並び替えます。
また、並び替えた新しい配列を返すのではなく対象の配列そのものを変更します。

## 基本構文
```js
配列データ.sort();
```
## サンプルコード（引数なし）
```js
const names = ['Koki', 'Aya', 'Eita'];

console.log(names.sort());
//["Aya", "Eita", "Koki"]
```

配列内の各要素が文字列の場合は、上記のようなコードで並び替えることができます。
しかし、sort()は、配列内の各要素が数値の場合にも
**数値を文字列に変換したあとで文字列として並び替えてしまいます**。

そのため、数値として並び替えるためには引数にコールバック関数を指定して、
比較の方法を自分で定義する必要があります。

コールバック関数は`function(a,b){}`の形式をとり、aとbには配列の要素が渡されます。

ソートの条件は
- コールバック関数の返り値が0未満のとき、**a→b**の順番に入れ替える
- コールバック関数の返り値が0のとき、入れ替えなし
- コールバック関数の返り値が0より大きいとき、**b→a**の順番に入れ替え

となっています。

## サンプルコード（引数にコールバック関数指定）
```js
const nums = [1, 30, 12, 17];

nums.sort(function(a, b){
  if (a > b){
    return 1;
  }else if (a < b){
    return -1;
  }else{
    return 0;
  }
});

console.log(nums);
// [1, 12, 17, 30]
```
上記のサンプルでは、**数値を文字列に変換することなく数値のまま比較している**ので、
数値の大きさに従って並び替えることができています。

また、コールバック関数はアロー関数式を使って次のように簡略化することもできます。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions

## サンプルコード（アロー関数式でコールバック関数指定）
```js
const nums = [1, 30, 12, 17];

nums.sort((a, b) => a - b);

console.log(nums);
// [1, 12, 17, 30]
```

# 2. 本題
`score`をキーとして並び替えをおこないます。

## 連想配列をソートする
```js
const objArr = [
   {name: 'A', score: 70},
   {name: 'B', score: 30},
   {name: 'C', score: 65},
   {name: 'D', score: 90}
];

objArr.sort((a, b) =>
  a.score > b.score ? 1 : -1;  
);

console.log(nums);
/*
[
   {name: 'B', score: 30},
   {name: 'C', score: 65},
   {name: 'A', score: 70},
   {name: 'D', score: 90}
]
*/
```

以上で実装完了です。
連想配列をソートすることができました。

# 3. 参考記事

https://www.javadrive.jp/javascript/array/index16.html

https://codelikes.com/javascript-sort/
【React】Material-UIがインストールできない

# １．実現したいこと

React（バージョン18）にて、Material-UIをインストールしたい。
ターミナルにて下記コマンドを実行した。

```bash
npm install --save @material-ui/core @material-ui/icons @material-ui/system
```


# ２．エラー内容

コマンド実行後、下記エラーが出る。

```zsh
npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR! 
npm ERR! While resolving: react-chat@0.1.0
npm ERR! Found: react@17.0.2
npm ERR! node_modules/react
npm ERR!   react@"^17.0.2" from the root project
npm ERR! 
npm ERR! Could not resolve dependency:
npm ERR! peer react@"^18.0.0" from @testing-library/react@13.3.0
npm ERR! node_modules/@testing-library/react
npm ERR!   @testing-library/react@"^13.3.0" from the root project
npm ERR! 
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
npm ERR! 
npm ERR! See /Users/shiho/.npm/eresolve-report.txt for a full report.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/shiho/.npm/_logs/2022-06-25T03_43_26_604Z-debug-0.log
```

# **３．調査**


以下のワードでググる

- react18 material-ui

# ４．原因

material-uiがReactバージョンの18に対応していない模様。

> [MUI installation doesn't work with React 18 - Stack Overflow](https://stackoverflow.com/questions/71713111/mui-installation-doesnt-work-with-react-18)

# **５．解決策**

Reactのバージョンを18→17に変更し、Material-UIを再インストール。

>[How to create a new project based on react@17](https://stackoverflow.com/questions/72220065/how-to-create-a-new-project-based-on-react17)

- `package.json`のバージョンを修正

```json:package.json
{
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
}
```

- `@testing-library/`を削除

```json:package.json
{
    "@testing-library/jest-dom": "^5.16.4",
    "@testing-library/react": "^13.2.0",
    "@testing-library/user-event": "^13.5.0",
}
```

- `package-lock.json`と`node_modules`を削除
![スクリーンショット 2022-06-25 13.24.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638572/8146598f-49d8-b1b5-4050-c3bb637aac11.png)

- 下記コマンドを実行

```bash
npm install
```

# ６．参考資料

- [MUI installation doesn't work with React 18 - Stack Overflow](https://stackoverflow.com/questions/71713111/mui-installation-doesnt-work-with-react-18)
- [How to create a new project based on react@17](https://stackoverflow.com/questions/72220065/how-to-create-a-new-project-based-on-react17)
パイ村 Part.1　Pythonで何をやるか考える


# ◆目的

1. Pythonとデータ分析関連資格を調べ、取得目標を立てる
1. Pythonを使用しデータ分析するための環境構築方法を学ぶ
1. データ分析に必要なPythonライブラリ等を学ぶ
1. データ分析をするために何を学ぶ必要があるか理解する（統計学とか）

第一回目は、Pythonやデータサイエンティストについて何もしらないので、
方向性を決めるための調査を行うこととし、調査をしながら方向性を修正しながら進めることにします。

# ◆Python、データ分析関連の資格

### Python関連資格
一般社団法人Pythonエンジニア育成推進協会が実施する 

- Python 3 エンジニア認定基礎試験
- Python 3 エンジニア認定データ分析試験
- Python 3 エンジニア認定実践試験

があります。
いずれも<font color="red">税込11,000円</font>です。

### 統計検定

公式サイト：http://www.toukei-kentei.jp/

| 試験の種別 | 受験料 | 偏差値 |
| ---- | ---- | ---- |
| 統計検定　1級「統計数理」 | 税込6,000円 | 72 |
| 統計検定　1級「統計応用」 | 税込6,000円 | 72 |
| 統計検定　準1級 | 税込8,000円 | 70 |
| 統計検定　2級 | 税込5,000円 | 65 |
| 統計検定　3級 | 税込4,000円 | 50 |
| 統計検定　4級 | 税込3,000円 | 35 |
| 統計調査士 | 税込5,000円 | - |
| 専門統計調査士 | 税込10,000円 | - |
| データサイエンス基礎（DS基礎） | 税込7,000円(一般価格)、税込5,000円(学割価格) | - |
| データサイエンス発展（DS発展） | 税込6,000円(一般価格)、税込4,000円(学割価格) | - |

### その他

データベーススペシャリスト、オラクルマスター、OSS-DBの資格などありますが、
今回は調査対象外とします。

### 結論

**<h2><font color="red">今回は、<br/>「Python 3 エンジニア認定データ分析試験」<br/>取得を目指すこととします。</font></h2>**
比較的難易度は高くないという点、統計検定はPythonの基礎は学べそうにないという理由で。

# ◆データ分析に必要なライブラリなど

### 1. Annaconda

データ分析用のパッケージを纏めているのが、Anacondaというディストリビューションです。
個別にインストールするより簡単に楽なのかもです。

https://www.anaconda.com/download

# ◆データアナリストとデータサイエンティスト

### 共通の必要スキル

1. データベースやSQLを扱うスキル
1. 分析用プログラミング言語を扱うスキル
1. 統計学の基礎知識

### データアナリストのスキル

共通のスキルに加えて、データの可視化やレポーティングに関するスキルが高いレベルで求められます。

#### Excelスキル

- 数千~数万程度のデータ量だとExcelを使うことも多い。
- IF、VLOOKUPなどの基礎関数の理解
- ピボットテーブルを使いこなせるスキル

<font color="red">Excelの関数は何となくで使用していることが多いので、ピポッドテーブルやVLOOKUPなど学びなおす機会を作りたいと思います。</font>


#### BIツールを扱うスキル

ビジュアルに訴えるダッシュボードやレポート作成のためのBIツールを駆使するスキルが求められます。
<font color="red">BIツールは使用したことがないです。フリーで実用的なツールなど後ほど調べてみたいと思います。</font>

#### 資料作成、プレゼンスキル

以下のスキルが求められます。

- 分析結果を纏める
- 分析結果をプレゼン（コミュニケーション）する
- 簡潔にパワーポイントに纏める

### データサイエンティストのスキル

アルゴリズム実装、分析モデル構築に高い専門性を持つ職種。
つまり、データアナリストよりも実装よりの職種かなと思います。
統計学、機械学習の理論などに知見が求められる。


### 結論

**<h2><font color="red">私は、<br/>「データサイエンティスト」<br/>を目指すこととします。</font></h2>**
プレゼン能力、コミュニケーション能力は元々低いし、そこを向上しようとはあまり思わないので。。

# ◆ Pythonを気軽に試せる環境（colab）

https://colab.research.google.com/

# ◆ データ分析などで使われるライブラリなど

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/bed957d3-c5db-0840-0d88-e85013411aba.png)
React: SVG の使い方

こちらのサンプルに SVG を加えました。
[React で jsx を使うサンプル](https://qiita.com/ekzemplaro/items/a58fe2dade6cac248d21)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/f9cd077d-6ca0-5580-65d2-64cdb13d8e80.png)

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>React Tutorial</title>
</head>
<body>
    <!-- Reactの描画対象を準備しておく -->
<div id="root"></div>
<script src="https://unpkg.com/react@18/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/babel-standalone/babel.min.js"></script>
<script type="text/babel" src="main.jsx" defer></script>
</body>
</html>
```

```js:main.jsx
function App() {
 const str_out = <div>皆さん、こんにちは<br />
 今日は、良いお天気です。<br />
 晴れています。<br />
<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
  <circle cx="30" cy="20" r="10" stroke="cyan" fill="none"/>
  <circle cx="50" cy="20" r="10" stroke="black" fill="none"/>
  <circle cx="70" cy="20" r="10" stroke="red" fill="none"/>
  <circle cx="40" cy="37.32" r="10" stroke="yellow" fill="none"/>
  <circle cx="60" cy="37.32" r="10" stroke="green" fill="none"/>
</svg>
</div>
  return str_out
}

const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(<App/>)
```

サーバーの起動 

```bash
http-server
```

ブラウザーで、http://127.0.0.1:8080　にアクセス
冒頭の画面が出てきます。

## 参考 ##
[Solid.js: SVG の使い方 (TypeScript)](https://qiita.com/ekzemplaro/items/13e872f7aac2484b73be)
Jupyter notebookでのmatplotlib animationの表示

# 概要
Jupyter notebookで、`%matplotlib inline`としたときに、アニメーションが表示できなかったので、簡単にまとめる。

↓このページがとても美しくまとめてくださっている。
https://jckantor.github.io/CBE30338/A.03-Animation-in-Jupyter-Notebooks.html

# 環境
Python 3.10.0
matplotlib==3.5.2
<details><summary>詳細</summary><div>

```
$ python --version
Python 3.10.0
$ jupyter --version
Selected Jupyter core packages...
IPython          : 8.4.0
ipykernel        : 6.13.0
ipywidgets       : not installed
jupyter_client   : 7.3.2
jupyter_core     : 4.10.0
jupyter_server   : not installed
jupyterlab       : not installed
nbclient         : 0.6.4
nbconvert        : 6.5.0
nbformat         : 5.4.0
notebook         : 6.4.11
qtconsole        : not installed
traitlets        : 5.2.2
$ pip freeze | grep matplotlib
japanize-matplotlib==1.1.3
matplotlib==3.5.2
matplotlib-inline==0.1.3
```
</div></details>

# 内容
## `HTML`を使う（参考文献の方法その1)
```Python
from IPython.display import HTML
HTML(anim.to_html5_video())
```

## `rc`を使う（参考文献の方法その2)
```Python
from matplotlib import rc

# equivalent to rcParams['animation.html'] = 'html5'
rc('animation', html='html5')
```
私としては、
```Python
import matplotlib as mpl
mpl.rcParams['animation.html'] = 'html5'
```
だが、与えられた書き方の方が簡潔かもしれない。

## `%matplotlib notebook`を使ってしまう（我流）
```Python
%matplotlib notebook
```
一時的にinlineを諦めるやり方だが、`HTML`を使うと何故か私の環境ではかなり重いので、こちらもあり。
ただし、図右上の電源ボタンを押さないと、後のplotが混ざる。

## 感想
使いこなしてスタイリッシュにビジュアライゼーションしたい。。

# 参考文献
https://jckantor.github.io/CBE30338/A.03-Animation-in-Jupyter-Notebooks.html
ArrayListで遊んでみる



```java
package sample;

import java.util.ArrayList;

//Parsonクラス
class Parson {
	private String name;

//コンストラクタ
public Parson(String name) {
		super();
		this.name = name;
	}

//gettar
public String getName() {
	return name;
}

//setter
public void setName(String name) {
	this.name = name;
  }
}


public class Array{
	public static void main(String[] args) {

		Parson p1 = new Parson("加藤");
		Parson p2 = new Parson("佐藤");
		Parson p3 = new Parson("伊藤");
		Parson p4 = new Parson("松原");
		
		ArrayList<Parson> array = new ArrayList();
		array.add(p1);
		array.add(p2);
		array.add(p3);
		
		System.out.println(array.size() + "人がListに追加されました");
		
        //リストに追加された人を表示
		for(int i = 0; i < array.size(); i++) {
			System.out.println(array.get(i).getName() + "さん");
		}
		
        //佐藤はリストの何番目か
		for(int i = 0; i < array.size(); i++) {
			if(array.get(i).getName() == "佐藤") {
				System.out.println("佐藤さんは" + (i +1) + "番目に追加されました");
			}
		}
		
		System.out.println("リストから佐藤を削除する");
        //リストから佐藤を削除する
		array.remove(p2);
		System.out.println("リストの中には");
		for(int i = 0; i < array.size(); i++) {
			System.out.println(array.get(i).getName() + "さん");
		}
		
		//伊藤を松原に変更する
		for(int i = 0; i < array.size(); i++) {
		 if(array.get(i).getName().equals("伊藤") {
			array.set(i,p4);
		 }
	  }
        //再度リストに追加された人を表示
		System.out.println("リストの中には");
		for(int i = 0; i < array.size(); i++) {
			System.out.println(array.get(i).getName() + "さん");
			
		}
	}

}

```
```java　
コンソール表示

3人がListに追加されました
加藤さん
佐藤さん
伊藤さん
佐藤さんは2番目に追加されました
リストから佐藤を削除する
リストの中には
加藤さん
伊藤さん
リストの中には
加藤さん
松原さん
```
【Pythonエラー】ModuleNotFoundError: No module named 'cv2'　をこうやって解決したよ


同じエラーに悩むかたへ
私のケースでのエラー解決法を残します。

## 環境

- Windows 10
- Python 3.8.3


## 症状

Python のプログラムを実行すると、以下のエラーが出る。

```
ModuleNotFoundError: No module named 'cv2'
```


## 解決方法

OpenCV をインストールする。

```
pip install opencv-python
```

普通はこれで解決されるらしいが、
こんなエラーが出てインストールできない。

```
ERROR: Could not build wheels for opencv-python which use PEP 517 and cannot be installed directly
```

pipのバージョンが古いことが原因らしいので、pipをアップグレードする

```
pip install --upgrade pip
```


今度はこんなエラーが出る。
```
ERROR: Could not install packages due to an EnvironmentError: [WinError 5] アクセスが拒否されました。: 'C:\\Users\\XXXX\\AppData\\Local\\Temp\\pip-uninstall-9luh6r4m\\pip.exe'
Consider using the `--user` option or check the permissions.
```

エラー文に書いてある通り、
--user のオプションを付けて実行する。

```
pip install --upgrade pip --user
```

こんなメッセージが出て終わる。（なんかうまくいったっぽい）

```
Requirement already satisfied: pip in c:\python38\lib\site-packages (22.1.2)
```

一応pip がアップグレードしたかチェックする。

```
pip -V
```

ちゃんとアップグレードされてるのを確認したら、
再度、OpenCV をインストールする。

```
pip install opencv-python
```

うまくいった
```
Successfully installed opencv-python-4.6.0.66
```

これで、Python のプログラムを実行すると、
さきほどのエラーは出なくなります。

以上
np.linspace, np.logspace, plt.plotの単引数での使用

# 概要
基本的すぎるかもしれないが、numpyの`linspace()`,`logspace()`の使い方を簡潔にまとめたかったのと、`plt.plot()`が単引数でも使えることに気づいたのでそれもメモする。

```Python:前提
import numpy as np
import matplotlib.pyplot as plt
```

# 環境
```
$ python --version
Python 3.10.0
$ pip freeze | grep numpy
numpy==1.22.4
$ pip freeze | grep matplotlib
japanize-matplotlib==1.1.3
matplotlib==3.5.2
matplotlib-inline==0.1.3
```

# 内容
## 等間隔データの作成
```Python
a = np.linspace(-3, 3)
```
なお、`a`は、${-3}$〜${3}$。
## 対数的に等間隔なデータの作成
```Python
b = np.logspace(-3, 3)
```
なお、`b`は、$10^{-3}$〜$10^{3}$。(`base=`で基底は変更できる)
## Defaultの数は50
```Python
print(a.shape)  # (50,)
print(b.shape)  # (50,)
```
## `num=`で総数を変更できる
```Python
a1000 = np.linspace(-3, 3, num=1000)
print(a1000.shape)  # (1000,)
```
## plt.plot()は単引数でも可
```Python
plt.plot(b)
plt.show()
```
![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166238/1f7d2cb5-d601-6ea6-091f-34c0a8e8b3a9.png)

# 感想
`linspace`が、linear space　で、
`logspace`が、logarithmic space であろうことは分かるのだけれど、
この場合のspace の訳語はなんなのだろう。

# 参考文献
* https://numpy.org/doc/stable/reference/generated/numpy.linspace.html
* https://numpy.org/doc/stable/reference/generated/numpy.logspace.html#numpy.logspace
JavaにABNFのせてJSON変換器つくる

一気にいろいろ作ったので整理するのが大変なのですが、ABNF ParserとJSON Parser、JSONとJava Collectionなどの相互変換、程度まで組み上がっているのでメモしておくよ。

SoftLibABNF
https://github.com/okomeki/SoftLibABNF
https://github.com/okomeki/SoftLibRFC
https://siisise.net/abnf.html

ABNFが名前空間を含めて扱えるのと ParserというのかBuilderというのか、そういうのが作れますよというもので、ABNFでざっくり構文解析して、少しのJavaで組み立てればとても便利というもの。
RFCで使われているABNFはBNFの中でも簡単なので、覚えるのも使うのもすぐにできるかもしれません。
SoftLibRFCはサンプルかもしれません。

SoftLibJSON
https://github.com/okomeki/SoftLibJSON
https://siisise.net/java/json.html
RESTを使いたいなという過程でできた、SoftLibABNFで作ったJSON Parserに、JSON Patch, JSON Pointer, オブジェクトマッピングなどいろいろ足しているもの。オブジェクトマッピングから作り始めた気がするのでそっちが強いのかな。
Javaの型をそのまま生かしたいのでList,Mapの拡張っぽくはじめてみた。
とりあえずJava標準のJSON-PやJSON-B的な形式も実装してみたが、そっちはおまけ程度。
JSONはお気楽データ型なので、いろいろなものを変換できると楽、ということでListやMap、Classや配列とJSONをマッピングしたらいろいろ捗った。

net.siisise.json.JSON と net.siisise.json.bind.OMAP ぐらいに色々詰め込んであるかも。

JSONValue json = JSON.valueOf(Object なんでも); でJSONになる。

JSONArray は List としてJSONObject は Map として実装しているので、変換可能な型を入れてもやんわり変換しているつもり。

JSONValue json = JSON.parseWrap(String JSON構文); でオブジェクト化。WrapがないとJava型、List,Map寄りになるかもしれない。

String string = json.toJSON(); でJSON文字型に。改行、タブなし。

String string = json.toJSON(JSON.TAB); 改行タブありも指定できる。

Object val = OMAP.valueOf(json, 変換対象ClassかType); 型変換も楽?
  Class, List<>, Map<>, 配列, String, プリミティブ型(int,long, ...) いろいろ

JsonValue jsonp = json.toJson(); 標準JSONPへの変換とか。Jakarta EE対応どうしよう。

おまけ程度にIoT向けのMessagePack (msgpack)というものからの変換もできるようにしてみたかも文字列にするかArrayにするかなど変換方法がいろいろありそうなので一方通行。

Jakarta EEと旧式と両方対応しようと思ったが、Java SE 9以降の形式になるのでJava SE 1.8とバイナリ的な互換性がなくなるのでバージョンわけないといけないかと悩み。
記事投稿の「タイトル」を作りたいよ〜投稿内容に加えて

# はじめに
SNS風のWEBアプリを元に、記事投稿サイトにしていきたい。
SNSだとタイトルは必要ないため、内容のみの実装していた。
そこで、投稿にタイトルを追加し、投稿内容と一緒にタイトルをつけてタイムラインに表示させるようにする。
| No |    項目     |   内容    |
|---:|-------------|------------|
| 1  |      OS       |   Mac     |
| 2  |       Ruby      |   2.6.3   |
| 3  |       rails      |      6.0.4 |
# カラムの追加
contentカラムのみ実装されていたので、titleカラムを追加する。
rails generate migration "Add「カラム名」To「モデル名」 カラム名:データ型
の順で投げるとchangeメソッドの中に自動でadd_columnを生成してくれる。

```言語名:ターミナル
$ rails generate migration AddTitleToMicroposts title:string
```

```言語名:db/migrate/20220624154740_add_title_to_microposts.rb
class AddTitleToMicroposts < ActiveRecord::Migration[6.0]
  def change
    add_column :microposts, :title, :string
  end
end
```
# 新規投稿ページにtitle入力フォームの追加
form_withの中にtitleを入力するフォームを追加する。
タイトルを入力し、Postリクエストが発行されると、params[micropost][title]に格納され、createコントローラに渡される。
```new.html.erb
<%= form_with(model: @micropost, local: true) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">
# ここに追加
    <%= f.label :title, '投稿タイトル' %>
    <%= f.text_field :title, class: 'form-control' %>
    
　　　　　　　　<%= f.label :content, '投稿文' %>
    <%= f.text_area :content %>
  </div>
  <%= f.submit "Post", class: "btn btn-primary" %>
<% end %>
```
# Controllerのストロングパラメータに:titleを追加
前述した通り、params[micropost][title]をcreateアクションで受け取る。
その際に、ストロングパラメータによって書き換えるパラメータを限定することによって、admin情報の書き換え等の対策をする。修正前は:contentに対してのみpermitしていたため、:titleを追加する。
```micropost_controller.html.rb
　　　　# アクションは特に変えない(micropost_paramsの内容に修正を加える)
  def create 
    @micropost = current_user.microposts.build(micropost_params)
    if @micropost.save
      flash[:success] = "Micropost created!"
      redirect_to root_url
    else
      @feed_items = current_user.feed.paginate(page: params[:page])
      render 'microposts/new'
      # redirect_to root_url
    end
  end
.
.
.
   # strong parameter
    def micropost_params
    # permitに:titleキーを渡す
      self.params.require(:micropost).permit(:content, :title)
      # params[:micropost][:content/:title] 
    end
```
# 一覧に表示する
今回はタイトルをクリックすると、その投稿のshowテンプレートのリンクに飛ぶようにする。
```index.html.erb
    <span class="post-title">
      <%= link_to micropost.title, micropost_url(micropost.id) %>
    </span>
```

# CSSを整える
```custom.scss
.post-title {
    font-weight: bold;
    display: block;
    margin-left: 60px;
    color: inherit;
    text-decoration: none;
  }
```
# Modelsでvalidationをかける
```micropost.rb
  validates :title, presence: true, length: { maximum: 50 }
```
# 終わりに
鯖缶はうまい。
<img width="200" alt="IMG20220625122953.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/9583cb73-b7e0-070f-ef91-07c000ccd4a1.jpeg">
Xcode14で利用できるSwiftUIの新機能

# SwiftUIとは？

SwiftUIは圧倒的に少ないSwiftコードで、すべてのAppleプラットフォーム向けに見栄えの良いアプリを構築できるフレームワークです。共通のツールとAPIを使用して、あらゆるAppleデバイスで優れた体験をユーザーに提供します。

## 宣言的な構文

SwiftUIの宣言型構文では、コードは「ユーザーインターフェイスが何をすべきか」を述べるだけです。これまでよりもシンプルで読みやすく、効率的なコーディングが可能です。
以下の例は、テキストと画像で構成されるアルバムリストを作成し、各項目を配置し、フォント形式を指定します。

```swift
import SwiftUI

struct AlbumDetail: View {
	var album: Album

	var body: some View {
		List(album.songs) { song in 
			HStack {
				Image(album.cover)
				VStack(alignment: .leading) {
					Text(song.title)
					Text(song.artist.name)
						.foregroundStyle(.secondary)
				}
			}
		}
	}
}
```

この宣言型スタイルは、アニメーションのような複雑な概念にも適用されます。わずか数行のコードで、ほぼすべてのコントロールUIにアニメーションを簡単に追加し、すぐに使用できる数々のエフェクトを選択できます。
実行時において、アニメーションの途中でユーザー操作や状態の変化に対処する場合でも、スムーズな動きを作成するために必要なすべてのステップをシステムが処理します。アニメーションが簡単にできるので、アプリを生き生きとさせる新しい方法を見つけることができます。

## デザインツール

Xcodeに搭載されているデザインツールを使えば、SwiftUIでインターフェイスを構築するのはドラッグアンドドロップするのと同じくらい直感的で簡単です。デザインキャンバスで編集したすべての作業は、隣接するエディタのコードと完全に同期します。プレビューには入力したコードが即座に表示され、ダークモードなど複数のUI構成を表示することもできます。Xcodeは変更内容を即座に再コンパイルし、実行中のバージョンのアプリに反映します。しかも、表示中に編集可能です。

### ドラッグ&ドロップ

ユーザーインターフェイスのコンポーネントは、キャンバス上にコントロールをドラッグするだけで配置できます。インスペクタをクリックすることによって、フォント、色、配置、その他のデザインオプションを選択できます。また、カーソルでコントロールを簡単に並べ替えることができます。これらのビジュアルエディタの多くはコードエディタ内でも利用できるので、インターフェイスの一部をコーディングしたい場合でも、インスペクタを使用して各コントロールの新しい修飾子を見つけることができます。ライブラリからコントロールをドラッグして、デザインキャンバスやコードにドロップすることもできます。

### 動的変換

SwiftコンパイラとランタイムはXcode全体に完全に埋め込まれているため、アプリは常にビルドされ、実行されます。デザインキャンバスはユーザーインターフェイスの擬似的な表示ではなく、実際のアプリです。また、Xcodeは動的置換を使用して、編集したコードをアプリに置き換えます。

### プレビュー

SwiftUIビューのプレビューは取得したサンプルデータ、大きなフォント、ローカリゼーション、ダークモードなど、ユーザーが見る可能性のあるものはほとんどすべてを設定できるようになりました。プレビューは、どのデバイスや向きでもUIを表示できます。

# SwiftUIの新機能

## Navigation API

アプリのナビゲーション動作をプログラムで制御して、起動状態を設定したり、サイズクラス間のトランジションを管理したり、ディープリンクに応答したりします。

## Swift Charts

すべてのAppleプラットフォームで見栄えの良く、高度にカスタマイズできるチャートでデータを視覚化します。Swift ChartsはSwiftUI構文を使用して、折れ線グラフや棒グラフおよびストリームグラフなどの高度なタイプまで、さまざまな可能性を秘めたビューを作成します。VoiceOverもサポートしています。

## 先進的なレイアウト制御

高度で再利用可能なレイアウトを構築して、アプリのデザインを強化します。`VStack`と`HStack`に加えて、SwiftUIはビューを水平方向と垂直方向の両方に同時に整列させるための新しい`Grid API`を提供します。また、新しい低レベルのカスタムレイアウトAPIは、アプリが必要とするレイアウトを正確に構築するためのあらゆる制御を提供します。また、SwiftUIには`ViewThatFits`が含まれるようになりました。これにより、特定のビューの複数のバリエーションを指定し、SwiftUIは利用可能なスペースに最も適したものを自動的に選択できます。

## 追加的なコンポーネントのサポート

画面により多くの情報を表示したいときにメインビュー上にスライドするハーフシートや、デバイスにインストールされているすべての共有拡張機能を利用できる共有シートなど、さらに多くの既存のUIコンポーネントをサポートします。また、Mac向けだった複数列テーブルAPIがiPadでも利用可能になりました。

## ロック画面におけるウィジェット
美しいアイコン、ゲージ、その他の要素を使って、ユーザーが情報を一目で確認するためのロック画面ウィジェットを作成できます。

（参考元: [SwiftUI Overview -Apple Developer-](https://developer.apple.com/xcode/swiftui/)）
GitHubの上流ブランチ設定

## 背景
マージすべきブランチがわからないと言われる、
`git pull`や`git push`するときに毎回gitのurlを指定しないと行けなくて、面倒だったから

## 現状
下記のようなエラーが出る、毎回urlを指定するのは面倒、
```
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=<remote>/<branch> master
```

## 解決方法
カレントブランチに upstream を指定する
```
$ git remote add origin <gitのURL>
$ git push -u origin master   
```

これで解決。

※master == main
オブジェクト指向を上達させる？SOLID原則でカレー作り

### こんにちは、Javaおじさんのシキムです。


40才目前で、プログラム工学に興味を持ったので本や記事で読んだ難しい話を
咀嚼して簡単な言葉で語りたいと思います。

-----

今回は、**SOLID原則でカレー作りシリーズ**が一応完成したのでまとめ記事となります。

本編で一切語っていなかったので、ここでちょろっとお話させていただきます。

カレー作りとして紹介したSOLID原則と呼ばれるものですが、これはオブジェクト指向のプログラムを作る中で重要となるプログラミングの書き方の約束事のようなものです。クラスや継承やインターフェースやメソッドなどを書くときに少しだけどもお役に立てればと思っています。



**カレー作りシリーズ**

https://qiita.com/sikimuOji/items/668190ee35a64da899fc

https://qiita.com/sikimuOji/items/f35ce75917cae8cda337

https://qiita.com/sikimuOji/items/1564f434f0e3ec11a0a1

https://qiita.com/sikimuOji/items/9a7a16b4b8874f8bff5b

https://qiita.com/sikimuOji/items/c5945062e9cae717e6ca

もし、カレー作りしてほしい原則やデザインパターンなどありましたらコメントを頂ければと思います。(勉強しながら書いてみます。)
matplotlibのggplotとは

# 概要
```Python
import matplotlib.pyplot as plt
plt.style.use('ggplot')
```
の見た目が綺麗で、初めてstyleを指定したので、`'ggplot'`について簡単にまとめる。

# 環境
Python 3.10.0
matplotlib==3.5.2
<details><summary>詳細</summary><div>

```
$ python --version
Python 3.10.0
$ jupyter --version
Selected Jupyter core packages...
IPython          : 8.4.0
ipykernel        : 6.13.0
ipywidgets       : not installed
jupyter_client   : 7.3.2
jupyter_core     : 4.10.0
jupyter_server   : not installed
jupyterlab       : not installed
nbclient         : 0.6.4
nbconvert        : 6.5.0
nbformat         : 5.4.0
notebook         : 6.4.11
qtconsole        : not installed
traitlets        : 5.2.2
$ pip freeze | grep matplotlib
japanize-matplotlib==1.1.3
matplotlib==3.5.2
matplotlib-inline==0.1.3
```
</div></details>

# 内容
## defaultとの比較
[出典](https://matplotlib.org/stable/gallery/style_sheets/style_sheets_reference.html)より
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166238/1b785539-f134-20a8-756c-c5e683a64f16.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166238/be7f0c73-4770-2136-1725-441d28c492c0.png)
(元ページには他の例もあり)
少し落ち着いて見える気がする。

## 選択の仕方
```Python:styleの指定
import matplotlib.pyplot as plt
plt.style.use('ggplot')
```

## ggplotとは
元々は、統計プログラミング言語Rのデータ資格かパッケージであった？ <sup>[[see.](https://ja.wikipedia.org/wiki/Ggplot2)]</sup>名前はggplot2のようである。

>ggplot2 is a system for declaratively creating graphics, based on The Grammar of Graphics. (https://github.com/tidyverse/ggplot2)

https://www.amazon.com/Grammar-Graphics-Statistics-Computing/dp/0387245448/

## 設定の覗き込み
```Python:設定を覗き込む
>>> plt.style.library['ggplot']
RcParams({'axes.axisbelow': True,
          'axes.edgecolor': 'white',
          'axes.facecolor': '#E5E5E5',
          'axes.grid': True,
          'axes.labelcolor': '#555555',
          'axes.labelsize': 'large',
          'axes.linewidth': 1.0,
          'axes.prop_cycle': cycler('color', ['#E24A33', '#348ABD', '#988ED5', '#777777', '#FBC15E', '#8EBA42', '#FFB5B8']),
          'axes.titlesize': 'x-large',
          'figure.edgecolor': '0.50',
          'figure.facecolor': 'white',
          'font.size': 10.0,
          'grid.color': 'white',
          'grid.linestyle': '-',
          'patch.antialiased': True,
          'patch.edgecolor': '#EEEEEE',
          'patch.facecolor': '#348ABD',
          'patch.linewidth': 0.5,
          'xtick.color': '#555555',
          'xtick.direction': 'out',
          'ytick.color': '#555555',
          'ytick.direction': 'out'})
```
rcParamsを上書きしている模様
## 一瞬はまったこと
ドキュメント([matplotlib.style -matplotlib](https://matplotlib.org/stable/api/style_api.html))では、
この書かれ方をしているが、いざ`print(matplotlib.style)`とするとエラーになる。

アクセスには、`plt.style.`つまり、`matplotlib.pyplot.style.`でアクセスするのが自然。
（`__init__.py`の設定でこのような動作になることは知っているし、別に構わないと思う）

## まだ分からないこと
現在のスタイルの取得方法

# 感想
落ち着いた色合いなので、使っていきたい。

# 参考文献
* https://matplotlib.org/stable/gallery/style_sheets/style_sheets_reference.html
* https://ja.wikipedia.org/wiki/Ggplot2
* https://github.com/tidyverse/ggplot2
* https://matplotlib.org/stable/api/style_api.html
Laravelでログイン機能を自作したいんですけどっ！？？

# イントロ

こちらはLaravelドキュメントの[認証](https://readouble.com/laravel/8.x/ja/authentication.html#authenticating-users)のページを分かりやすくかみ砕いたものになります！

タイトルにある通り、今回はパッケージを使わずにLaravelでのユーザーを手動で認証する（＝ログインさせる）機能を解説したいと思います！

:::note
今回解説するLaravelドキュメントはバージョン8.xです
:::

# 認証と同じ意味やで

Web業界ではログインのことを「認証」や、英語で「authentication」などと言ったりします。

なのでこの先に、ログインと言わずに認証と言ったりすることがあるかも知れませんが、概ねログインのことを指していると思ってもらってOKです。

# `attempt`メソッドを使う

Laravelで認証周りのサービスは`Auth`ファサードを介することで実装できます。

`Auth`ファサードの`attempt`メソッドを用いることで、ユーザーのログイン処理をすることができます。

まずはLoginControllerを例に実装例を見てみましょう。

```PHP:LoginController
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; // Authファサードを読み込んでねっ！

class LoginController extends Controller
{
    /**
     * 認証の試行を処理
     */
    public function login(Request $request)
    {
        $user_info = $request->validate([
            'email' => ['required', 'email'],
            'password' => ['required'],
        ]);

        // ログインに成功したとき
        if (Auth::attempt($user_info)) {
            $request->session()->regenerate();
            return redirect()->route('dashboard');
        }

        // 上記のif文でログインに成功した人以外(=ログインに失敗した人)がここに来る
        return redirect()->back();
    }
}
```


# メールアドレスとパスワードを与えてあげる

Laravelの`attempt`メソッドにはメールアドレスとパスワードの連想配列を引数に与えてあげると、データベースにある該当ユーザーを探します。

```PHP
// attemptメソッドのメールアドレスとパスワードを与える
attempt([
    'email' => '〇〇@email.com',
    'password' => '×××××××××'
]);
```

もう少し正確には、`attempt`メソッドは引数で与えられたメールアドレスを元にデータベースに該当するユーザーがいないかを確認します。

もしユーザーいた場合、今度は与えられたパスワードを`attempt`メソッドが自動的にハッシュ化して、それをデータベースに格納されているハッシュ化されたパスワードを比較します。

これらのパスワードも一致した場合は、ユーザーの認証セッションが開始されます（＝ログインが成功します）。

なので`attempt`メソッドに与えるパスワードは生のままでよく、ハッシュ化させなくて大丈夫です👍

# `Auth::attempt`で条件分岐

`attempt`メソッドは認証が成功したか否かで`true`か`false`を返します。

なので、これを元にフォームから送信されたデータでログインできるときとできないときで処理を分けることができます。

```PHP
// 存在するユーザーのとき
$good_result = Auth::attepmt($existing_user);
echo $good_result; // trueが表示される

// 存在しないユーザーのとき
$bad_result = Auth::attepmt($unexisting_user);
echo $bad_result; // falseが表示される

// Auth::attemptの結果によって処理を分岐させることができる
if (Auth::attempt($user_info)) {
    // ログインが成功したとき
} else {
    // ログインが失敗したとき
}
```

# セッションの再生成

ログインの操作自体はこれで完了なのですが、ログインの際に「セッション固定攻撃」を防ぐためにセッションを再生成しておきましょう。

```PHP
// これでセッションを再生成(=regenerate)できる
$request->session()->regenerate();
```

これをログインが成功したときに挟んであげます。

```PHP:LoginControllerを一部抜粋
// ログインに成功したとき
if (Auth::attempt($user_info)) {
    $request->session()->regenerate(); // 再生成を挟んであげる

    return redirect()->route('dashboard');
}
```
Axes3D(fig)のMatplotlibDeprecationWarning

mpl_toolkitsのmplot3d.Axes3Dの警告を消す方法についてまとめてみた。
まずは`import`
```python
%matplotlib inline
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
import numpy as np
```
バージョンは
```python
import matplotlib as mpl
mpl.__version__
# '3.5.2'
```

# やりたいこと
Axes3Dは三次元座標を生成する為のクラスである。
ただよく見るのは、
```python
fig = plt.figure()
ax = plt.axes(projection="3d")
```
![sample1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712306/fdb7cf37-6096-4b06-6cc7-2397cf7520eb.png)
こんな感じだと思う。
ところが、少し古い書籍だと
```python
fig = plt.figure()
mplot3d.Axes3D(fig)
```
となっていたりする。これでもちゃんと上の画像のような結果は出るのだが、`DeprecationWarning`も出るので、これを消したい。

# やってみたこと
それで、警告の内容は

>MatplotlibDeprecationWarning: 
 Axes3D(fig) adding itself to the figure is deprecated since 3.4. Pass the keyword argument auto_add_to_figure=False and use fig.add_axes(ax) to suppress this warning. The default value of auto_add_to_figure will change to False in mpl3.5 and True values will no longer work in 3.6.  This is consistent with other Axes classes.

このままではまるで意味がわからないので訳すと、

>Axes3D(fig) が自分自身を図に加えることは、3.4 から非推奨になりました。キーワード引数 auto_add_to_figure=False を渡して fig.add_axes(ax) を使用すると、この警告を抑制することができます。auto_add_to_figure のデフォルト値は mpl3.5 で False に変わり、3.6 では True 値は動作しなくなります。 これは、他のAxesクラスと一貫しています。

とのことなので言われた通りにやってみる。
```python
fig = plt.figure()
ax = mplot3d.Axes3D(fig, auto_add_to_figure=False)
fig.add_axes(ax)
```
![sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712306/9d703a38-eaa4-d765-188d-3b329cbddbe1.png)
これで警告は無事消えました。

# Axes3Dの引数を使ってみる
このままではコードが一行無駄に増えただけなので、Axes3Dの引数を使って元を取りたい。
`mplot3d.Axes3D`の引数にはazim（方位角）とelev（仰角）があって視点の変更ができるようなので、やってみる。
デフォルトでは`azim=-60, elev=30`
```python
x = y = np.linspace(-3, 3, 1000)
X, Y = np.meshgrid(x, y)
Z = (X ** 2 - Y ** 2) / 2

fig = plt.figure(figsize=(8, 6))
ax = mplot3d.Axes3D(fig, auto_add_to_figure=False)
fig.add_axes(ax)

ax.plot_surface(X, Y, Z)
ax.set_title("azim=-60, elev=30", fontsize="xx-large");
```
![sample3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712306/5fd58388-22ba-b251-2c96-a1a37c045376.png)
正面から見ると
```python
fig = plt.figure(figsize=(8, 6))
ax = mplot3d.Axes3D(fig, azim=-90, elev=0, auto_add_to_figure=False)
fig.add_axes(ax)

ax.plot_surface(X, Y, Z)
ax.set_title("azim=-90, elev=0", fontsize="xx-large");
```
![sample4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712306/6a5fa685-d73b-09bb-1015-b1d397cd1eae.png)
azimの値によってはz軸のメモリの位置が変わったりする。
```python
fig = plt.figure(figsize=(8, 6))
ax = mplot3d.Axes3D(fig, azim=-120, elev=0, auto_add_to_figure=False)
fig.add_axes(ax)

ax.plot_surface(X, Y, Z)
ax.set_title("azim=-120, elev=0", fontsize="xx-large");
```
![sample5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712306/a9ed806f-af11-0114-24e8-dc6eb8dbf897.png)

# まとめ
Axes3Dで方位角と仰角を指定したりしなくても、コマンドライン上で実行したり、
`%matplotlib notebook`を指定すれば、画像をグリグリ動かせる。
React useContextを使いたい

# createContextを生成

### valueに共有したい変数を記述。

```javascript:App.js
import { createContext, useState } from 'react'
import './App.css'
import Login from './components/Login';
import User from './components/User';

export const AuthContext = createContext();

function App() {

  const [userName, setUserName] = useState("")

  return (
    <AuthContext.Provider value={{ userName, setUserName }}>
      <div className="App">

        <Login />
        <br />
        <User />

      </div>
    </AuthContext.Provider>
  )
}

export default App
```

# Login.js、User.jsにuseContextを記述

```javascript:Login.js
import React, { useContext } from 'react'
import { AuthContext } from '../App'


const Login = () => {

  const { setUserName } = useContext(AuthContext)
  return (
    <div>
      <h1>Login</h1>

      <input
        type="text"
        placeholder='Input New Name...'
        onChange={(e) => setUserName(e.target.value)}
      />


    </div>
  )
}

export default Login
```

```javascript:User.js
import React, { useContext } from 'react'
import { AuthContext } from '../App'


const User = () => {

  const { userName } = useContext(AuthContext)


  return (
    <div>
      <h1>User</h1>
      <p>{userName}</p>
    </div>
  )
}

export default User
```

# 結果

### propsを使わなくても変数を共有できています。

![2022-06-25_11h33_14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/caa96c26-28ff-4067-c28e-e59081ceb363.gif)

# 参考動画

https://youtu.be/LlvBzyy-558
dmpファイルインポート中に「警告: 文字セット変換でデータが失われた可能性があります」と表示された時の対応

# 事象
オンプレミスの本番環境Oracle DBからRDS for OralceにData Pumpを用いたデータ移行リハーサルを実施していました。
dmpファイルをRDSにダウンロードし、スキーマをインポートしている時、インポートログに下記のようなメッセージが表示されました。 

```
JA16SJISTILDE文字セットおよびAL16UTF16 NCHAR文字セットでインポートを実行します
JA16SJISTILDE文字セットおよびUTF8 NCHAR文字セットでエクスポートを実行します
警告: 文字セット変換でデータが失われた可能性があります
```
どうやら文字コードの変換に関して問題が生じたようです。

# 原因
オンプレミスDBとRDSで各国語キャラクタセットの文字コード指定が異なっていました。
下記のSQLを実行して確認しました。
```sql
select * from NLS_DATABASE_PARAMETERS
where parameter = 'NLS_NCHAR_CHARACTERSET'
```
その結果、オンプレミスDBにはUTF8が、RDSにはAL16UTF16が設定されており、上記メッセージの原因になっていることが分かりました。
[Oracle公式](https://docs.oracle.com/cd/E16338_01/server.112/b56307/ch6unicode.htm#i1007327)に記載されている各国語キャラクタセットが影響するデータ型はNCHARとNVARCHAR2であるという事実から、テーブルにそれらのデータ型がなければ特に影響はないようです。

# 感想
警告がデータ不整合を連想させるものだったので大変びっくりし、全件テーブル比較して差異を探す必要があるのかと不安になっておりましたが、NCHARとNVARCHAR2は使用していなかったので安心しました。データベースキャラクタセットだけでなく、各国語キャラクタセットも影響するのだなと勉強になりました。
mocap to maya

```
import maya.cmds as cmds

# Select the source object (object with keyframes), followed by the destination object (object to be keyed)
sourceObject, destinationObject = cmds.ls(sl=True)[0], cmds.ls(sl=True)[1]
# Get all keyframes for all animatable attributes
keyframes = cmds.keyframe(sourceObject, query=True)
# Remove duplicates
keyframes = list(set(keyframes))

# Loop through keyframe list
for i in range(len(keyframes)):
	# Set the current time
	cmds.currentTime(keyframes[i])
	# Set a keyframe on the current time
	cmds.setKeyframe(destinationObject)
```
論理削除、物理削除、削除フラグについて

業務で論理削除、物理削除、削除フラグという言葉を初めて聞き疑問に思ったのでまとめました。

・論理削除＝データは記憶媒体に残ったままで削除されたことをデータとして表現する。

(メリット)
・残しておくので謝って削除した場合や、過去のデータを確認したいときにすぐに復元できる。

(デメリット)
・where句で削除フラグを付け忘れなどでバグが発生する原因になる
・データ量が増えるのでサーバーに負担がかかる。

・物理削除＝ハードティスクからデータ自体を削除する。

(メリット)
・データ自体を削除するのでサーバに負担がかからない。。

(デメリット)
・１度削除してしまったら復元できない。




・論理削除の例

product テーブル
|商品ID  |商品名  |価格  |論理削除フラグ  |
|---|---|---|---|
|1  |みかん  |60  |false |
|2  |りんご  |150 |false |
|3  |バナナ  |140 |true |

select product_name,price 
from products
where is_deleted = false;
(説明)
検索条件に論理削除フラグをfalseにすることで、論理削除されたデータ(is_deleted=true)は
表示されなくなる。

*削除フラグは
 trueやfalse。
 0か1 で表現される場合がある。
依存性逆転の原則でカレー作り

カレー作り、最短で終わってしまう第5弾

### こんにちは、Javaおじさんのシキムです。


40才目前で、プログラム工学に興味を持ったので本や記事で読んだ難しい話を
咀嚼して簡単な言葉で語りたいと思います。

-----

今回は、**依存性逆転の原則（Dependency inversion principle**というものについてです。

ざっくりと、、、

オブジェクトが、別のオブジェクトを利用するときはインターフェースで
お互いが干渉する。

詳しくは偉い人の話を読んでください。

ここでは、この原則をカレー作成装置に見立てて解説したいと思います。

では、さっそくカレー作成装置を作りましょう。

今回は真カレー装置(夏)をベースに進めていきます。
----
(真カレー装置(夏)の詳細は第２弾をご確認ください。)

**野菜BOX作成キット**
　　容器
　　剥き方ノート(白紙)
　　切り方ノート(白紙)

**人参BOX**
　　容器：人参
　　剥き方ノート：ピーラーで皮を剥く
　　切り方ノート：輪切りに切る

**ジャガイモBOX**
　　～省略～

**玉ねぎBOX**
　　～省略～

**野菜BOXコンテナ**
　　人参BOX
　　ジャガイモBOX
　　玉ねぎBOX

**野菜下ごしらえ装置**
　入れるもの：
　　　野菜BOX

　作業：
　　　①容器の野菜を剥き方ノートと同じように剥く
　　　②皮を剥いた野菜を切り方ノートと同じように切る

　出てくるもの：
　　　下ごしらえ野菜

**肉下ごしらえ装置**
　入れるもの：
　　　肉

　作業：
　　　①肉を切る

　出てくるもの：
　　　下ごしらえ肉

**カレー作成装置**
　入れるもの：
　　　野菜BOXコンテナ、肉

　作業：
　　　①野菜下ごしらえ装置に野菜BOXコンテナのBOXを１つづつ入れて下ごしらえする
　　　②肉下ごしらえ装置に、肉を入れて下ごしらえする。
　　　③具材を鍋に入れて煮込む
　　　④カレールーを入れる
　　　⑤ご飯にかける
　　　⑧カレーにとんかつをトッピングする

　出てくるもの：
　　　カレー

真カレー装置(夏)の完成です。
----
本来はここから、依存性逆転の原則の機能を追加する流れですが
今回はそういう訳にはいきませんでした。実はすでに依存性逆転の原則が使われていたのです。

**カレー作成装置**
**野菜下ごしらえ装置**

この２つの装置はお互いに下ごしらえした具材のやり取りを行っています。
ただし、お互いに直接やりとりをするのではなく野菜BOXを返してやり取りしていることがわかります。
今回の件は、**開放-閉鎖の原則**の野菜BOX側の観点ではなく装置側の観点の話なのですでに使われているのでした。

以上が、おじさんなりの依存性逆転の原則の理解です。


　
　
　
　







**カレー作りシリーズ**

https://qiita.com/sikimuOji/items/a99fdc2de406a0f42fac
FreeBSD ports における、autoconf の更新問題

最近(2022/05末〜本記事投稿時点）、FreeBSD ports の autoconf 関連

	autoconf: 2.69_3
	autoconf-wrapper: 20131203

は、portmaster を用いても自動的に更新されません。
これらは、 それぞれ
    
    autoconf: 2.71
    autoconf-switch: 20220527
   
に置き換えられるものですが、ports-mgmt/portmaster を用いても失敗してしまいます。

# 対処法

手動で以下のコマンドを打つ他ないと思われます。

     pkg remove auto\* 


# 本文書期限 
そのうち改善されると思うので、来月には改善されているか待ちます。