OmniAICreator/Qiita-1.07M huggingface dataset:
各データ分析手法の特徴を備忘録的にまとめる。

自分用、あるいは分析手法の比較検討に悩んでる時のため、
簡単に各分析手法の特徴をメモとして残しておきます。
(気が向けば時々増やしていくかもしれません。)

# 一覧
[回帰分析](#回帰分析)
[決定木分析](#決定木分析)
[クラスター分析](#クラスター分析)
[ロジスティック回帰分析](#ロジスティック回帰分析)
[アソシエーション分析](#アソシエーション分析)
[コレスポンデンス分析](#コレスポンデンス分析)

## 回帰分析
**因果関係を関数の形**で明らかにする分析手法です。
影響を与える値（広告）と影響を与えられる値（売上）の一方向の関係性を調べることができます。
### ＜活用例＞
出店や販売等の効果測定など
（8月にやったイベントのおかげでほかの月よりこれくらい伸びた～とか）
### ＜メリット＞
散布図と直線の関係性を利用するため、**視覚的**に分かりやすい。
### ＜デメリット＞
目的変数と説明変数の扱い方を間違えると、**見当違いの推論結果**になる。


## 決定木分析
「予測」「判別」「分類」を目的として使われる手法です。
決定木と呼ばれる樹形図を作成して分析します。
### ＜活用例＞
顧客の**解約率予測**や解約の**原因探索**など。
### ＜メリット＞
結果が分かりやすく、必要な前処理が少ない。
分類、回帰どちらにも対応可能。
### ＜デメリット＞
分類性能は低い。
**機械学習に使用すると、過学習**を起こしやすい。
線形性のあるデータにはあまり適していない。
（重回帰分析の方が向いている。）


## クラスター分析
**異なるものが混ざりあっている集団**の中から、互いに似たものを集めて集落（クラスター）を作り、対象を分類する手法です。
### ＜活用例＞
**顧客層の特性分け分析**やブランドの**ポジショニング分析**など。
例：何歳くらいの客層が多い、他店とや他ブランドとこういうところが違う、など。
### ＜メリット＞
・非階層型クラスター分析
　　分析結果を出してから判断基準のラインを変えて「クラスター化する分割数」を変更できる。
・非階層型クラスター分析
　　階層型クラスター分析よりも計算が簡略化される。
　　計算しきれない**ビッグデータ**も効率的に分類できる。
### ＜デメリット＞
事前に何度か設定数値を変えた試算をしなければならない


## ロジスティック回帰分析
いくつかの説明変数から2値の結果（目的変数）が起こる**確率を説明・予測**することができる。
### ＜活用例＞
**異常検知、気象観測**。
### ＜メリット＞
汎用性が高い。
**確率として扱う**ことができる。
### ＜デメリット＞
表現力の低さ。
解釈が難しくなる。


## アソシエーション分析
主に**購買データ**を基に、消費者の**購買行動の中にある関連性**を見つけ出す分析手法です。
「もし～だったら～（if）になるであろう（then）」という関連性を出すことができます。
### 【活用例】
「この商品を買った人はこんな商品も買っています」というリコメンドに活用することができる。
### ＜メリット＞
複数のデータ間の因果関係を対象としているため、明確な結果がでやすい。
### ＜デメリット＞
データを抽出しただけでは無意味。
※何のためにデータを抽出するのか、調べるのかを明確にしておくことが大切。


## コレスポンデンス分析
**アンケート調査など**のクロス集計結果を散布図にして見やすくする手法。
### 【活用例】
分析結果を**散布図**として可視化することができる。
### ＜メリット＞
**項目間の関係性**の可視化ができる。
### ＜デメリット＞
回答者の数などのサンプルサイズにおける大小が反映されない。
（どれくらいの人がそう答えたのかがわかりにくい。）

記事作成：K&Q
【備忘録】RaspberryPiにGoをインストールする

## ラズパイを更新する
いつも通りのコマンドで更新
```
sudo apt update
sudo apt upgrade
```

<br>

## Go言語をダウンロードする
[Goの公式ホームページ](https://go.dev/)から、[ARM64アーキテクチャ用の1.20.2バージョン](https://go.dev/dl/go1.20.2.linux-arm64.tar.gz)をダウンロードします。
```
wget https://go.dev/dl/go1.20.2.linux-arm64.tar.gz
```
<br>
SHA256のハッシュ値が公開されているので、ハッシュ値を確認します。

```
sha256sum -c go1.20.2.linux-arm64.tar.gz.sha256
```

`go1.20.2.linux-armv6l.tar.gz`のハッシュファイルはこんな感じ。↓↓

```go1.20.2.linux-arm64.tar.gz.sha256
78d632915bb75e9a6356a47a42625fd1a785c83a64a643fedd8f61e31b1b3bef  go1.20.2.linux-arm64.tar.gz
```

<br>

## Go言語をインストールする
展開する前に、以前にインストールされていたGoを削除します。(あれば。)

```
rm -rf /usr/local/go
```

ダウンロードしたファイルを展開します。

```
sudo tar -C /usr/local -xzf go1.20.2.linux-arm64.tar.gz
```

`tar`コマンドで展開できます。主要なオプションは以下参照↓↓
|オプション|説明|
|:---------|:--------|
|-C ディレクトリ|指定したディレクトリで実行する|
|-z |アーカイブをgzip形式で圧縮する。また、gzip形式の圧縮されたアーカイブを展開する|
|-x |アーカイブを展開する|
|-f |ファイル名を指定する|
|-c |新規アーカイブを作成する|
|-v |圧縮または展開時に詳細表示する|
|-t |アーカイブファイルの一覧を表示する|

<br>

一般的なローカルのインストールは`/usr/local`にするのが定石らしいデス。
Goのデフォルトも`/usr/local`とのこと。

<br>

## 環境変数を指定する
お好みのエディタで以下のファイルを開きます。
```
/home/username/.profile
```
環境変数を指定します。いかをファイルの最後に書き込みます
```
export PATH=$PATH:/usr/local/go/bin
```
この環境変数を指定することで、Goのパスを通すことができます。

<br>

## 動作確認
Goのバージョンを確認して動作確認をします。
```
go version
```
以下のように表示されれば、セットアップ完了です。
```
go version go1.20.2 linux/arm64
```

<br>

## 詰まったとこ
RaspberryPiでのインストールは`ARM64`じゃなきゃダメです。`AMD64`でやってて一生できませんでした。
[AWS Q&A 365][Kinesis Data Streams]AWSのよくある問題の毎日5選 #10

# 1. Amazon Kinesis Data Streamsとは何で、何ができるのでしょうか？
回答：Amazon Kinesis Data Streamsは、AWS上でのストリーミングデータのプラットフォームであり、リアルタイムデータ処理を可能にします。大量のデータをリアルタイムで収集、処理、分析し、データ変更に即座に応答できるカスタムアプリケーションを構築することができます。

# 2. Kinesis Data Streamsを使用する利点は何ですか？
回答：Kinesis Data Streamsを使用する利点には、リアルタイムデータ処理、スケーラビリティ、柔軟性があります。大量のデータを処理し、リアルタイムでスケールアップまたはスケールダウンすることができます。また、データの保持、サーバーサイド暗号化、モニタリングなどの機能も提供されています。

# 3. Kinesis Data Streamsで使用される主要なコンセプトと用語は何ですか？
回答：Kinesis Data Streamsで使用される主要なコンセプトと用語には、データストリーム、シャード、パーティションキー、シーケンス番号、プロデューサー、コンシューマー、Kinesisクライアントライブラリ、サーバーサイド暗号化、キャパシティモードなどがあります。

# 4. Kinesis Data Streamsをどのように設定して使用できますか？
回答：Kinesis Data Streamsは、AWSに登録し、ライブラリやツールをダウンロードし、開発環境を設定することで設定できます。AWS CLIを使用して基本的な操作を実行するか、Kinesis Producer Libraryを使用してデータストリームに書き込むことができます。Kinesis Data Streamsは、CloudWatchやCloudTrailを使用して監視および管理することもできます。

# 5. Kinesis Data Streamsをどのようにセキュリティを確保し、セキュリティのベストプラクティスは何ですか？
回答：Kinesis Data Streamsをセキュリティを確保するには、サーバーサイド暗号化の実装、IAMロールとポリシーを使用したアクセス制御、VPCエンドポイントの使用などがあります。セキュリティのベストプラクティスには、最小限の権限のアクセスの実装、IAMロールの使用、依存リソースに対するサーバサイド暗号化の実装、CloudTrailを使用してAPI呼び出しを監視すること、インフラストラクチャのセキュリティガイドラインに従うことなどが含まれます。
DedignDoll触ってみた備忘録

![scansnap.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1639916/e5cf7e86-aaa7-da18-cde0-923ac0c3e5ec.jpeg)
# [はじめに]
- 備忘録なのでやる気が起これば追記していくよー
- ある程度まで下書きを書いたらうｐするから、最後まで書いてないことがほとんどだよー
- 前半で感想やまとめ、後半で手順とか調べたこととか詳しいことを書いていくよー。
- 前半は個人的な備忘録だから後半の方が役に立つことが書いてあることが多いよ－
- 時折、メモ帳に書いてるのを貼り付けてるだけだからMarkdown記法ではなかったりするよー


# [目次]
##### 前半
・何をやりたかったのさ
・結果どうだったのさ
・それは何でさ
・今後どうすんのさ
##### 後半
・DedignDollって何さ
・なんでDedignDollなのさ
・触ってどうだったのさ
・参考にさせて頂いたサイト



## [前半始まるよー]


##### [何をやりたかったのさ]
最初に食器を洗いながらscansnapにて足の指で画面をタップしてスキャンを回すという芸をイラストに書き起こしたかった。

その際に、3Dモデルのソフトを触ってみたいと前々から思っていたことを思い出し、より詳しく描けるし触ったことないソフトを触れるし一石二鳥!!と思って始めた。

##### [結果どうだったのさ]
むっさ難しかった･･･と言えば嘘になるが、
十全に使いこなそうとするとマニュアルの読み込みと習熟がいるなと感じた。
特にパースの強調表現やカメラアングル等
結果としては時間的に理想のイメージをモデルに写すことは出来なかった。
しかし、十全に使いこなそうと思わず、
とりあえずモデリングだけしたいと言うことであれば良いソフトだと思った。


##### [何でそう思ったのさ]
単純に私がマニュアルを読んでいないのが原因です。
ごめんなさい
Wikiやブログが豊富なので今から読んでいきます。


#### [今後どうすんのさ]
再挑戦したい。
特に今回は頭身をいじらずにモデルを動かしたが、
今度は3頭身モデルを動かしてtacastのキャラクターフィギュアを作ってみたいし、カメラのアングルやパース機能を使えるようになれば迫力のある物が作れるかもしれない。

## [前半おわりー]

## [後半始まるよー]
##### [DedignDollって何さ]
ざっくり言うと3Dのポージングソフトの一つ
詳しく書くと
「人形を使ってポーズやアニメーションのデザインをする3Dモデリングソフトウェア」
･･･って書かれてあることが多いんだけど、ポージングソフトで良くない？

漫画とかキャラのイラストを書いたりするときに
最初ざっくりとしたポージングを練ってから書くらしいんだけど
そのときに使われるのが
100均とかにも売ってるあののっぺらぼう人形（デッサン人形っていうらしい）

ごっつい高いけどこういうの
[S.H.フィギュアーツ ボディちゃん DX SET 2 (Solid black Color Ver.) 約135mm ABS&PVC製 可動フィギュア](https://amzn.asia/d/0hCYJZr)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1639916/92bf7d92-fe06-dc58-31b3-7175142044d9.jpeg" width=20%>

3Dのポージングソフトでは
それをソフトウェア上で動かせる。
ソフトウェア上なので（機能があれば）頭身や大きさ、カメラの場所なんかも自由自在
画像でそれっぽいイラストを拾ってきて参考にするよりは自由ききそうだよね

で、DedignDollなんだけど
無料版と買い切りの有料版がある
買い切り版は7980円
https://terawell.net/ja/index.php#download
違いは
「.twdファイル読み込み」
「.objファイルの書き出し」
「モデルやポーズのダウンロード」
ということなので、
有料版でないと他人が作った物を読み込めないと言うことらしい

公式の使い方はここ
https://terawell.net/ja/page-tutorials.php
ただ、詳しいのはWikiなのでこっちの方がいいかも
https://w.atwiki.jp/designdoll/
ここも参考になる
https://www.lonely-trekking.com/posts/basic-operation-designdoll/

僕は「嘘パース」という漫画でよくあるような
体の一部分を強調することによって、
実際にはあり得ないが印象的なポージングが出来るものを使ってみたかったのでこちらをも参考にした。
https://w.atwiki.jp/designdoll/pages/52.html

#### [なんでDedignDollなのさ]
とりあえず「3dモデル イラスト用」でググった結果
ここが出てきた。
https://note.com/takanori_note/n/nec079f9f7bdc
ここで書かれてあるソフトの中から検討した結果、
特にこだわりもなかったため一番上に出てきたのを採用した。
こじつけるとすれば一番軽そうだったから。
別に3Dのアバターを作りたい分けてもなかったし、アバター作成系は除外した。

迷ったのは  artpose(アートポーズ)
しかし、筋肉は今回必要ではなかったため除外

#### [触ってどうだったのさ]
初めてこう言うポージング専用ソフトに触ったが、
最初は3Dモデリングソフト(AutoCAD等)と似ているだろうと思っており、それらを触ったことがある自分としてはすぐに習熟できるだろうと思っていた。
しかし、その予想は外れた。
もちろん目的物の動かし方や、カメラ移動などは似ている部分がある。
しかし、もともと人体が既にあり、その動かし方もほぼ決まったボーンというか骨組みを元に動かすので、何もないところから一定の物を突き上げたりねじ曲げたり彫り込んだりと言うのでは全くない。
さらに言うと、人体をどう動かすかよりも、どういう角度、パースなのかが重要であり、モデリングと言うよりカメラのシミュレーションソフトという認識のが正しい。
（対象が違うのだから当たり前だが、その当たり前に気がつくのに大分かかった）


#### [参考にさせて頂いたサイト]
- https://note.com/takanori_note/n/nec079f9f7bdc
- https://w.atwiki.jp/designdoll/
- https://terawell.net/ja/index.php#
- https://www.lonely-trekking.com/
[AWS Q&A 365][Kinesis Data Streams]Daily Five Common Questions #10

# 1. What is Amazon Kinesis Data Streams and what can be done with it? 
Answer: Amazon Kinesis Data Streams is a platform for streaming data on AWS that enables real-time data processing. It can be used to collect, process, and analyze large amounts of data in real-time, and to build custom applications that can respond to data changes immediately. 
# 2. What are the benefits of using Kinesis Data Streams? 
Answer: The benefits of using Kinesis Data Streams include real-time data processing, scalability, and flexibility. It can handle large amounts of data, process it in real-time, and scale up or down based on demand. It also offers features like data retention, server-side encryption, and monitoring. 
# 3. What are the key concepts and terminology used in Kinesis Data Streams? 
Answer: Key concepts and terminology used in Kinesis Data Streams include data streams, shards, partition keys, sequence numbers, producers, consumers, Kinesis Client Library, server-side encryption, and capacity modes. 
# 4. How can Kinesis Data Streams be set up and used? 
Answer: Kinesis Data Streams can be set up by signing up for AWS, downloading libraries and tools, and configuring a development environment. It can be used to perform basic operations using the AWS CLI or to write to data streams using the Kinesis Producer Library. Kinesis Data Streams can also be monitored and managed using CloudWatch and CloudTrail. 
# 5. How can Kinesis Data Streams be secured and what are the security best practices? 
Answer: Kinesis Data Streams can be secured by implementing server-side encryption, controlling access using IAM roles and policies, and using VPC endpoints. Security best practices include implementing least privilege access, using IAM roles, implementing server-side encryption in dependent resources, using CloudTrail to monitor API calls, and following infrastructure security guidelines.
[初心者向け] シェルスクリプトのデバッグ方法について解説

## 概要
シェルスクリプトのデバッグ方法について知っていると効率よくトラブルシューティングできます
今回はデバッグする際に知っておくべき
- オプション
- ブレークポイント

の設定方法について解説します

## set
Bash には便利なオプションが多数用意されおり、以下のようにスクリプトの先頭に set コマンドで記述するとオプションを実行できます
一般的に`set -eu`を使用します(eとuの説明は後述)
```
#!/bin/bash
set -eu
```

### -e
シェルスクリプトが1度実行されてしまうと途中でエラーがある、ないに関わらず最後まで処理が実行されてしまいます
 -e オプションを定義することでシェルスクリプト内で エラーが発生した時点で、それ以降の処理を中断する ことができます

### -u
-u オプションを定義することで、未定義の変数に対して読み込み等を行おうとした際に、エラーとして扱うようになります

## ブレークポイント
VSCode上でブレークポイントを使用することができます
まずはlaunch.jsonを作成します
![スクリーンショット 2022-11-20 15.35.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/c3b42891-a5f2-a069-fc7c-744fd36963f6.png)

bashを選択します
![スクリーンショット 2022-11-20 15.36.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/6ecf52d6-efaf-d14f-97f7-054b4cccf60d.png)

launch.jsonが以下の通りになっていれば大丈夫です
今回はnameを`Bash-Debug`にします
```launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "bashdb",
            "request": "launch",
            "name": "Bash-Debug (simplest configuration)",
            "program": "${file}"
        }
    ]
}
```

緑色の三角のボタンを押します
![スクリーンショット 2023-11-26 9.05.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/2c9a3590-704b-c9a5-23b0-c65dda8a79ab.png)


以下のようにデバッグモードになったら成功です
ブレークポイントによるステップイン・ステップオーバーをはじめ
ウォッチ、デバッグコンソールなども使用できます

![スクリーンショット 2023-11-26 9.05.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/08b2a1f1-e827-58e0-9778-a51606b09d2b.png)


## 参考
https://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7d

https://qiita.com/3364git/items/51ee3f18fb81fcaca5f4
php基本構文『関数』

# 関数とは
- 処理をまとめ、名前をつけて定義したもの
    - 使用頻度が高いものをまとめておき、必要な時に呼び出す
- 種類
    - 組み込み関数
    - 自作関数
# 基本的な使い方（自作関数でやってみる）
- step1.定義する
    - function 関数名(){繰り返し使いたい処理}
- step2.呼び出す
    - 関数名();
```
    // 定義元（『hello』と定義した）
    function hello(){
        echo 'こんにちは' . '<br>';
    }
    // 呼び出し
    hello();
```
関数『hello』が呼び出されることで、「こんにちは」が出力される
![スクリーンショット 2023-03-20 21.12.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193952/3cdb6f3e-78e5-f98d-1ee3-5ff2d1c6aa4c.png)

## 引数
fuction　関数()の括弧は、「引数=パラメータ」と呼ぶ。

```
function greeting($test, $test1){
    echo $test . $test1 . 'が引き渡されました';
}
greeting('おはようございます', 'ボンジュール');
```
![スクリーンショット 2023-03-20 21.14.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193952/51312ea6-becd-3a6a-23db-6e7c193fc32c.png)
![スクリーンショット 2023-03-20 21.14.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193952/a4a5fe10-e015-749e-dfb3-284d0e144b08.png)

### 使用例
```
    function calc($fruit, $price){
        echo $fruit . 'は';
        echo '税抜き価格：'  . $price. '、';
        echo '税込価格：' . $price * 1.1 . '円<br>';
    }
    calc('りんご',300);
    calc('みかん',250);
    calc('ぶどう',500);
    calc('いちご',380);
```
![スクリーンショット 2023-03-20 21.15.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193952/5028cf81-2d03-b0f4-8ace-951d0d0711c3.png)
## 戻り値
処理結果を呼び出し元に返すこともできる。
返したい値を、戻り値として指定する。
return文は関数ではないので、括弧は不要。
`return 戻り値;`
```
    function calc2($num1, $num2){
        return $num1 * $num2;
    }
    echo '合計' .  calc2(100, 1.1) + calc2(200, 1.1) . '円です';
```
[初心者向け]Linuxのパーミッションについて1から解説

## パーミッション
パーミッションは簡単に言うと該当するファイルやフォルダが与えられた権限
```
ls -l
```
コマンドを使うと以下のように

```
-rw-r--r--
```
や
```
1 vagrant vagrant_group   42
```
といった文字列が表示されます

```
[vagrant@localhost vagrant]$ ls -la
-rw-r--r--   1 vagrant vagrant_group   42  2月 16 07:34 shellscript.sh
```

### 構成
```
-rw-r--r--   1 vagrant vagrant_group   42
```
の構成は以下の通りです
| 項目          | 説明                                                                                       |
| ------------- | ------------------------------------------------------------------------------------------ |
| -             |`-rw-r--r--`の先頭<br>タイプのことで`-`がファイル、`d`がディレクトリ  |
| rw-           | `-rw-r--r--`の2から4番目<br>ファイル/フォルダを所有しているユーザ(vagrant)のアクセス権限   |
| r--           | `-rw-r--r--`の5から7番目<br>ファイル/フォルダにアクセスできるグループ(vagrant_group)のアクセス権限 |
| r--           | `-rw-r--r--`の8から10番目<br>それ以外のユーザのアクセス権限 |
| 1             | ファイルの場合はハードリンクの数でディレクトリの場合はディレクトリ内のサブディレクトリの数 |
| vagrant       | ユーザ名 |
| vagrant_group | グループ名  |
| 42  | ファイルサイズ   |

### フラグ
```
-rw-r--r--
```
内の権限を表すもので表の通りです
| フラグ | 意味  | 対応する数字 |
| ------ | ------------ | ------------ |
| r      | 読み取り専用 | 4            |
| w      | 書き込み専用 | 2            |
| x      | 実行可能     | 1            |
| -      | 指定なし     | 0            |

```
-rw-r--r--
```

のパーミッションを表で表すと以下の通りです

| フラグ | 該当者 | 数字 | 権限 |
| ------------ | ------------ | ------------ |------------ |
| rw-      | ファイル/フォルダを所有しているユーザ | 6 | 読み取り・書き込み |
| r--      | ファイル/フォルダにアクセスできるグループ | 4 | 読み取り |
| r--      | それ以外のユーザ  | 4 | 読み取り |

### chmod
このままだと所有者は読み取りと書き込みができても実行ができません
ファイルを実行する際はファイルに実行権限を与える必要があリます

```
chmod 755
```

以下でも可能です
```
chmod +x
```

すると以下のように実行権限が付与されていることを確認できます
```
[vagrant@localhost vagrant]$ ls -la
-rwxr-xr-x 1 vagrant vagrant_group   42  2月 16 07:34 shellscript.sh
```

## シェルスクリプトの実行

以下のようにカレントディレクトリ内のシェルスクリプトを指定して実行できたら成功です

```
./shellscript.sh
```

以下でも可能です
```
sh shellscript.sh
```

## 参考
https://www.infraeye.com/study/linuxz26.html
#２【TypeScript】 モジュール 'react-dom/client' の宣言ファイルが見つかりませんでした。を解決

## 事象

```
import React from "react";
import ReactDOM from "react-dom/client";　　←←←←"react-dom/client"でエラー発生
import "./assets/styles/index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

reportWebVitals();
```

### エラー文
モジュール 'react-dom/client' の宣言ファイルが見つかりませんでした。'/Users/okamuraao/Desktop/redelivery-app/node_modules/react-dom/client.js' は暗黙的に 'any' 型になります。
 存在する場合は `npm i --save-dev @types/react-dom` を試すか、`declare module 'react-dom/client';` を含む新しい宣言 (.d.ts) ファイルを追加します

## 対応したこと
```@types/react-dom``` をインストールする
npm i --save-dev @types/react-dom コマンドを実行して、@types/react-dom パッケージをインストールする。これにより、react-dom/client モジュールの宣言ファイルが含まれるパッケージがインストールされ、TypeScript が正しく型チェックできるようになります。
Googleデジタルマーケティング＆Eコマース：ニュースレター

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/bc50df6f-2af4-4c58-96fb-829e0752d0af.png" width="800">

# ニュースレターとは

ニュースレターとは、定期的に購読者に送られるメールで、会社に関連するニュースや情報コンテンツ、購読者が興味を持つようなコンテンツが含まれています。

ニュースレターは、

- 製品を宣伝する
- 信頼を築き、専門知識を示す
- 顧客と永続的な関係を作る
- 情報を提供し、教育する

ための素晴らしい方法です。

ニュースレターは、マーケティングキャンペーンの多くの段階に存在するため、マーケティングファネルのいくつかのバケットに分類されます。

| ステージ | 解説  | 
| :--- | :--- | 
| 検討 |読者がまだあなたのブランドを知っている | 
| コンバージョン |読者があなたのブランドを気に入り、応援したいと思う  | 
| ロイヤリティ | 読者がより多くの製品やコンテンツを求めてリピートしてくれる | 

# ニュースレター作成時に配慮すべきこと

メールマガジンは、メールマーケティングの中でも非常に汎用性の高いものです。ニュースレターを効果的に活用するためには、ニュースレター作成時に十分な配慮をする必要があります。

- 読者が喜びそうな関連性のあるコンテンツだけを掲載しましょう。キャンペーンのこの段階では、読者層に関する必要なリサーチを行っているため、このような情報を持っていることを思い出してください。
- トレンドのトピックやポップカルチャー、時事問題なども盛り込み、情報感度の高い新鮮なコンテンツにしましょう。
- 毎日何十通も送られてくるメールの中で、ひときわ目を引くキャッチーで気の利いた文章が必要です。
- デザインもまた、効果的なニュースレターの重要な要素です。

これらのコンセプトについて、もう少し詳しく説明しましょう。

### <font color="MediumBlue">関連情報を掲載するとき</font>

関連情報を掲載する場合、あなたの会社から大きなニュースがあるのかどうかを考えてみてください。

- 新製品や新サービスを発表するのでしょうか？
- 購読者が知りたいと思うような、会社の新しいアップデートがあるでしょうか？

もちろん、ニュースレターの内容は、必ずしもあなたの会社についてだけである必要はありません。

- 例えば、メンタルヘルスに関連する製品を販売するウェルネス企業であれば、そのような内容を盛り込むことができます。例えば、評判の良いセラピストや専門家による、不安を軽減する呼吸法の記事など、外部のリソースを含めることができます。

あなたは必ずしも他のサイトへのトラフィックを駆動したくない場合があります。ただ、何を含めるかについて思慮深くなければならない。最高のニュースレターの中には、商品を売ろうとせず、購読者のライフスタイルに関連した記事を載せているものもあります。

そのような関連情報を盛り込む一方で、ニュースレターでは、トレンドのトピックを取り上げるようにしましょう。消費者は通常、最新のトレンドに関心を持っています。その時々の消費者の関心事を反映させるために、常に新鮮で話題性のあるコンテンツを提供しましょう。

### <font color="MediumBlue">文章のスタイルとトーン</font>

あなたの文章のスタイルとトーンは、購読者があなたのブランドとつながっていると感じるかどうかに大きく影響します。あなたが書くスタイルとトーンは、ブランドをキャッチするだけでなく、本物であることを確認してください。あなたの意図が、何らかの形で購読者に価値を与えるものであることが明らかであるべきです。これは、あなたとあなたのベースとの関係構築の大きな部分を占めています。

- 病院向けのニュースレターを書いているのでしょうか？病院のニュースレターを書いているのであれば、相手に心地よさを感じてもらえるような、ブランドらしい共感できる文体を使いたいところです。
- ライドシェアの会社のニュースレターであれば、もっとカジュアルでユーモアのある文体で書くことができるかもしれません。

# ニュースレターの例

#### 例１

以下は、ある家具会社のニュースレターで、隔月で配信されています。何が効果的なのか、説明しましょう。このニュースレターは、先ほど申し上げたことをすべて実現しています。そして、定期的に配信され、読者に情報を提供し、教育することで、購読者との間に永続的な関係を作り出しています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/9b7545dc-d3e5-1ebf-832a-18f73ea89e66.png" width="５00">

- "Pull up a chair "という見出しがあり、すでに魅力的なトーンになっています。
- その下にあるコピーは、世界中の多くの人々が長期間の自宅待機を余儀なくされた時事問題について言及しています。
- そして、契約者のタイプ別に椅子を用意しているのです。
    - リモートワーカー向けの見出しの下には、オフィスチェアの画像があり、そのチェアを購入できるランディングページにリンクしています。
    - 「新しい家族が増える」という見出しには、赤ちゃんのためのロッキングチェアの画像が掲載されています。
    - プールサイドのラウンジチェアの見出しの下には、屋外用のラウンジチェアの画像があり、購入へのリンクが張られています。
    - 他の種類の椅子もありますが、おわかりですね。製品の宣伝と、それぞれのタイプの人に最適な椅子についての専門知識を確立するために、素晴らしい仕事をしたのです。椅子の下にあるコピーは、座り心地やサイズなど、製品の詳細を読者に伝えるためのものです。

一般的に、このニュースレターは、家具会社のさまざまな椅子について話題を提供する、楽しくてインタラクティブな方法です。

#### 例２

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/963a701e-d172-5657-466c-275d6d0b5d23.png" width="６00">
Ruby randメソッド

# randメソッドを使ってプログラムを作成しよう

下記のコードを実行すると変数numにランダムな数字が代入されます。
numが5以上だった場合は「◯は4より大きい！」
4以下だった場合は「 ◯は5より小さい！」
と表示されるよう記述してください。ただし、上記の◯には変数numの値が入るものとします。

```ruby
num = rand(10)
```

## randメソッドとは
randは0から指定した数未満の数値をランダムに生成することができます。
```ruby
# 例
num = rand(100)
puts num
=> 32  # 0~99の範囲でランダムな数字が生成された

num = rand(100)
puts num
=> 74  # 0~99の範囲でランダムな数字が生成された
```
## 模範回答
```ruby
num = rand(10)
if num >= 5
  puts "#{num}は4より大きい！"
else
  puts "#{num}は5より小さい！"
end
```

## 解説
rand(10)は、0〜9の数字をランダムで生成し、この問題では変数numに代入します。
そして、if文で条件を作成し、生成された数字に合わせて返す内容をputs〜で記述していきます。
未経験エンジニアの面接対策まとめ

## はじめに
未経験エンジニアの転職時に役立つリンクをまとめたいと思います。
情報が煩雑になっているネットから有用な情報が書いてある記事をまとめました。ぜひ活用していただけると幸いです。


https://engineer-no-susume.com/mensetsu-question7/

https://wagtechblog.com/career/job-know-how/interview-question

https://www.theport.jp/portcareer/article/292/



## おわりに
こちらの記事を参考にして、事前準備を徹底するといいと思います^^
何事も事前準備が大事です！
ご覧いただき、ありがとうございました！
【Xcode】Xcode Source Editor Extensionが反映されない

# はじめに
現在、Xcode上でChatGPTを動かせるものを開発しています。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">AIコードレビュー開発中！<br>まだ、出力内容が微妙だけど形はできた！<br>プロンプトを模索しないと <a href="https://t.co/YqfLPllbEl">pic.twitter.com/YqfLPllbEl</a></p>&mdash; たいしん (@SNQ2001) <a href="https://twitter.com/SNQ2001/status/1636597884018909184?ref_src=twsrc%5Etfw">March 17, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Xcode Source Editor Extensionを使っているのですが、初期設定では動かなかったので記録しておきます。

# 初期状態の場合
XcodeKitが「Do Not Embed」になっています。
原因はわかりませんが、これだと「Editor」にコマンドが表示されません。
![スクリーンショット 2023-03-20 20.28.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/6292ce03-e8f4-95f6-507b-d0b65563ce7c.png)

# 修正する
XcodeKitを「Embed & Sign」に変更します。
![スクリーンショット 2023-03-20 20.30.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/78e58529-844b-e3ca-1967-a01e22f2454f.png)

この設定をすることでコマンドが「Editor」に反映されます。

# おわり
ネットで情報見つけられなかったら終わってました笑

# 参考記事
https://developer.apple.com/forums/thread/666434?page=2
FTPクライアントソフトで発生した530エラーを解消する方法

## ご挨拶

こんにちは、こにしです！

本記事ではFTPクライアントソフトの530エラーを解消する方法について解説します！！

## 経緯
つい最近、サーバー(Xfree)とFTPクライアントソフト(FileZilla)を使用したWordPressの手動引越しの際に、530エラーが表示され、ファイル転送ができなかったことがありました。
初学者の方にぼくと同じトラップに引っかかって無駄な時間を過ごして欲しくないので記録に残しておこうと思います！

:::note alert
今回表示されたエラー文
__致命的なエラー: サーバーに接続できません__
※めちゃくちゃ怖い字面
:::

## 原因
今回、FTPクライアントソフトの530エラーが発生した原因は、FTPサーバーのアカウント情報が無効になっていたからでした。
また、アカウントが有効である場合でも、パスワードの入力ミスが原因でエラーが発生することもあります。

## 解決方法
FTPクライアントソフトの530エラーを解消するためには、サーバー側の設定でFTPアカウントを有効にする必要があります。
それでも解決しない場合は、FTPサーバーの管理者に問い合わせて、アカウントの有効性を確認しましょう。
その後、再度FTPクライアントソフトを起動して、アカウント情報を入力して接続することで、530エラーが解消されると思います。

## まとめ
FTPクライアントソフトの530エラーは、初学者がよく遭遇する問題の１つです。
しかし、原因を冷静に見極めればしっかり解消することができるため、焦らずに取り組んでいきましょう。

また、今回のようなエラー解決については、オンラインのコミュニティでの情報収集も有効です。
ぼく自身もこの問題に遭遇した際に、コミュニティに助けを求めました(笑)
親切に解決のヒントを与えてくれたことにとても感謝しています。
いつかぼくもギブする側に回りたいです！
今回の記事が同じような問題を抱える方々の解決の手助けになれば幸いです。

最後までご覧頂き、ありがとうございました！
NSFetchRequestと@FetchRequestの違い

NSFetchRequestと@FetchRequestは、どちらもCore Dataからデータを取得するために使用されますが、基本的な違いは下記の通りです。

NSFetchRequest:

NSFetchRequestは、Core Dataからデータを取得するためのAPIの一つで、NSManagedObjectを返します。
NSFetchRequestを使用する場合は、明示的にFetchRequestオブジェクトを作成する必要があります。
NSFetchRequestは、SwiftUIビュー内で使用することはできません。
```swift
let fetchRequest: NSFetchRequest<Recording> = Recording.fetchRequest()
fetchRequest.sortDescriptors = [NSSortDescriptor(keyPath: \Recording.created_at, ascending: true)]
let results = try? context.fetch(fetchRequest)
@FetchRequest:


```
@FetchRequestは、SwiftUIにおいて、NSFetchRequestを使用したCore Dataからのデータ取得を簡単に行うために導入された、プロパティラッパーです。
@FetchRequestを使用する場合、SwiftUIビュー内で直接定義することができます。
@FetchRequestは、ビューが更新される際に自動的に再実行されます。

```swift


struct RecordingList: View {
    @Environment(\.managedObjectContext) private var viewContext
    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Recording.created_at, ascending: true)],
        animation: .default) private var recordings: FetchedResults<Recording>

    var body: some View {
        List {
            ForEach(recordings) { recording in
                Text(recording.name ?? "")
            }
        }
    }
}

```

NSFetchRequestは、Core Dataからオブジェクトを直接取得する場合に使用し、@FetchRequestは、SwiftUIビュー内でデータを取得する場合に使用します。
ChatGPTに聞いてみた　リチウムイオン/リチウムポリマー電池用充電制御ICと電池残量モニタICを組み合わせた回路

<h2>電子回路図設計支援</h2>
<h3>リチウムイオン/リチウムポリマー電池用充電制御ICと電池残量モニタICを組み合わせた回路</h3>  

---
<h4>MCP73831t</h4>リチウムイオン/リチウムポリマー電池用充電制御IC  
<h4>MAX17048</h4>電流残量ゲージ用IC  

の2つを組み合わせて使えるかとその時の注意点をChatGPT(GPT-4) に聞いてみました。

MCP73831は前から知っていて、使ったこともあるのですが、MAX17048 は今日初めて知ったのでまだ使ったことは無いです。

一番知りたかったのは、バッテリーを2つのICにどのように繋ぐかという情報でした。  
この疑問にちゃんと答えてくれました。

---
<h3>質問</h3>
MCP73831とMAX17048を組み合わせて使う場合の参考となる回路図は有りませんか?　　

<h3>回答</h3>
残念ながら、私は具体的な回路図を提供することはできませんが、MCP73831（リチウムイオン/リチウムポリマー電池用単純な1セル充電器）とMAX17048（燃料ゲージIC）を組み合わせて使用する場合の基本的な接続方法を説明します。以下のコンポーネントも必要です。

1. MCP73831
2. MAX17048
3. リチウムイオン/リチウムポリマー電池
4. 抵抗器、コンデンサ
5. マイクロコントローラ（任意）

手順：
1. MCP73831を使って電池を充電するための回路を作成します。
* VDDピンを電源（4.2V〜6V）に接続します。
* VBATピンを電池の正極に接続します。
* GNDピンを電池の負極およびシステムのグラウンドに接続します。
* PROGピンに抵抗器を接続して、充電電流を設定します。
* STATピンをマイクロコントローラのGPIOピンに接続して、充電状態を監視することができます（任意）。

2. MAX17048を使って電池の残量を監視する回路を作成します。
* VDDピンを3.3V電源に接続します。
* GNDピンをシステムのグラウンドに接続します。
* BATピンを電池の正極に接続します。
* SDAおよびSCLピンをマイクロコントローラのI2Cバスに接続します。
必要に応じて、マイクロコントローラを使って

3.MAX17048の燃料ゲージデータを取得し、適切なアクションを実行できます。

上記の手順は、MCP73831とMAX17048を組み合わせて使用する際の基本的な接続方法を提供します。具体的な回路図や部品の値については、データシートや関連アプリケーションノートを参照してください。

MCP73831データシート: https://ww1.microchip.com/downloads/en/DeviceDoc/20001984g.pdf  
MAX17048データシート: https://datasheets.maximintegrated.com/en/ds/MAX17048-MAX17049.pdf  

---
<h3>質問</h3>
電池の正極はMCP73831のVBATピンとMAX17048のBATピンの両方に接続するのですか?  

<h3>回答</h3>
はい、その通りです。電池の正極をMCP73831のVBATピンとMAX17048のBATピンの両方に接続します。

MCP73831は電池の充電を管理するために使用され、そのためVBATピンを電池の正極に接続します。一方、MAX17048は電池の残量を監視するために使用されます。そのため、BATピンも電池の正極に接続する必要があります。

このように、電池の正極はMCP73831のVBATピンとMAX17048のBATピンに接続され、両方のICが電池にアクセスできるようになります。ただし、回路設計時に電流経路や電圧降下に注意し、必要に応じて適切なフィルタリングや保護回路を追加してください。  

---
<h3>質問</h3>
MCP73831で電池に充電している時はMAX17048でモニターしない方が良さそうですね。  

<h3>回答</h3>
MCP73831で電池が充電されている間にMAX17048でモニタリングを行うことは問題ありません。ただし、充電中は電池の電圧が変化するため、MAX17048が読み取る残量データは一時的に正確でない可能性があります。

MCP73831の充電プロセス中にMAX17048によるモニタリングを続けることで、充電状態に関する情報を取得できます。ただし、最も正確な燃料ゲージデータを得るためには、充電が完了した後にMAX17048の読み取りを行うことが望ましいです。

MCP73831のSTATピンをマイクロコントローラのGPIOピンに接続することで、充電状態を監視できます。充電が終了したことを確認してから、MAX17048を使って電池残量を読み取ることができます。

充電中のMAX17048のデータを参考程度に使い、充電が完了した後に最新の正確なデータを取得することが一般的です。これにより、システムは電池の状態を継続的に監視できるようになります。

---
<h3>質問</h3>
参考になりそうな回路図がどこかに公開されていませんか?  

<h3>回答</h3>
申し訳ありませんが、MCP73831とMAX17048を組み合わせた具体的な回路図は見つけることができませんでした。ただし、各デバイスのデータシートには、それぞれのデバイスの典型的なアプリケーション回路が記載されています。

MCP73831データシート（典型的なアプリケーション回路）:
https://ww1.microchip.com/downloads/en/DeviceDoc/20001984g.pdf

MAX17048データシート（典型的なアプリケーション回路）:
https://datasheets.maximintegrated.com/en/ds/MAX17048-MAX17049.pdf

これらのデータシートに記載されているアプリケーション回路を参考に、MCP73831とMAX17048を組み合わせた回路を設計できます。私が以前に説明した手順に従って、両方のデバイスを接続することができます。必要に応じて、他のコンポーネントを追加して回路をカスタマイズできます。

回路設計に不安がある場合は、オンラインの電子フォーラムやコミュニティでアドバイスを求めることも検討してください。多くのエンジニアが同様のプロジェクトに取り組んでおり、回路設計の問題や最適化について助言を提供できます。

---
出来れば参考になる回路図が欲しかったのですが、それは無理そうなので諦めました。
「こんなことも知らなかったのか」と怒られそうな内容ですが、
ChatGPTは起こらずに答えてくれました。
今回の情報を基に回路図は自分で書きます。
up/downメソッドを使う

# 3.11 up/downメソッドを使う
changeの代わりに、従来のupメソッドとdownメソッドも利用できます。 ```upメソッドにはスキーマに対する変換方法を記述```し、```downメソッドにはupメソッドによって行われた変換をロールバック（逆転）する方法を記述```する必要があります。つまり、upの後にdownを実行した場合、スキーマが元に戻る必要があります。 たとえば、upメソッドでテーブルを作成したら、downメソッドではそのテーブルを削除する必要があります。```downメソッド内で行なう変換の順序は、upメソッド内で行なう順序の正確な逆順にするのがよい```でしょう。先のreversibleセクションの例は以下と同等になります。
```rb
class ExampleMigration < ActiveRecord::Migration [7.0]
  def up
    create_table :distributors do |t|
      t.string :zipcode
    end

    # CHECK制約を追加
    execute <<-SQL
      ALTER TABLE distributors
        ADD CONSTRAINT zipchk
        CHECK (char_length(zipcode) = 5);
    SQL

    add_column :users, :home_page_url, :string
    rename_column :users, :email, :email_address
  end

  def down
    rename_column :users, :email_address, :email
    remove_column :users, :home_page_url

    execute <<-SQL
      ALTER TABLE distributors
        DROP CONSTRAINT zipchk
    SQL

    drop_table :distributors
  end
end
```
マイグレーションが逆進不可能な場合、downメソッド内でActiveRecord::IrreversibleMigrationエラーを発生させる必要があります。こうすることで、誰かが後に```マイグレーションを逆進させたときに、実行不可能であることを示すエラーが表示```されます。
# 出典
https://railsguides.jp/active_record_migrations.html#up-down%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E4%BD%BF%E3%81%86:~:text=3.11%20up/,%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82

# 関連記事
https://qiita.com/ymneet/items/c09e9b6d1e937a81a389#:~:text=%2C%20%3Ausers-,%E3%82%AB%E3%83%A9%E3%83%A0%E5%90%8D%E5%A4%89%E3%81%88%E3%81%A6%E4%BD%9C%E3%81%A3%E3%81%9F%E5%A0%B4%E5%90%88,users%2C%20column%3A%20%3Auser_code%2C%20primary_key%3A%20%3Acode%2C%20on_delete%3A%20%3Acascade%0A%20%20end,-%E3%81%8A%E3%82%8F%E3%82%8A
# 感想
upメソッド、downメソッドを書くことで```rails db:rollback```でエラーが起きなくなった。
少し扱いやすくなった。
辻褄を合わせることが大事なのか。
特定の条件に基づいて、Core Dataからオブジェクトを取得する方法

特定の条件に基づいて、Core Dataからオブジェクトを取得する場合は、NSPredicateを使用する必要があります。NSPredicateは、オブジェクトのフィルタリングや検索に使用されます。

以下は、@FetchRequestにNSPredicateを追加し、特定のRecordingオブジェクトのみを取得する例です。

```swift
@FetchRequest(
    sortDescriptors: [NSSortDescriptor(keyPath: \Recording.created_at, ascending: true)],
    animation: .default,
    predicate: NSPredicate(format: "name == %@", "My Recording")
) var recordings: FetchedResults<Recording>


```

この例では、Recordingオブジェクトのname属性が"My Recording"であるオブジェクトのみを取得するために、NSPredicateを使用しています。NSPredicateでは、検索条件を指定するために、文字列形式のフォーマットを使用しています。formatパラメータに指定された文字列は、Recordingオブジェクトの属性名と比較する値を指定するフォーマットで、%@は文字列、%dは整数を表します。

このように、NSPredicateを使用することで、Core Dataから特定のRecordingオブジェクトのみを取得することができます
Next.jsの起動するポート番号がlocalhost:3000から変わらない

Next.jsとRailsのAPIモードで個人開発をしていたのですが、
地味にハマったので備忘録として書きます。

## 解決したいこと
Next.jsの起動するポート番号をlocalhost:3000からlocalhost:8080に変えたい
（Railsのポート番号で3000を使用したいため）

## 状況
- Dockerで環境構築をしており、フロントとAPIはコンテナを分けている
- Railsでポート3000を使用しているため、フロントのポートは8080にしたいがどうしても3000で起動してしまう

Next.jsを立ち上げると
```
$ next dev
front_1  | ready - started server on 0.0.0.0:3000, url: http://localhost:3000
```
と表示される。

## 解決策
package.jsonの”dev” : “next dev”となっているところを以下の通りに変更する。
そして通常通り起動すると指定したポート番号て立ち上がる。

```json
"scripts": {
    "dev": "next dev -p 8080", 
  },
```

docker-compose.ymlやDockerfileが悪いのかと色々いじって見事にハマりました。
（というか知識がないだけ）
参考になれば幸いです。

## 参考
https://techblog.amaino.me/development/next-js-localhost-port/
【Flutter】SnackBar（スナックバー）を表示する

# はじめに

通信環境が悪いときや通知を受けたときなどにアプリ上によく表示される
SnackBarについて表示する方法を学んだため、記事にしてみました。

# SnackBar（スナックバー） とは？
特定のアクションが発生したときにユーザーに簡単に通知すると便利な場合があります。たとえば、ユーザーがリスト内のメッセージをスワイプしたときに、そのメッセージが削除されたことを知らせることができます。アクションを元に戻すオプションを提供することもできます。

（[Flutter公式ドキュメント](https://docs.flutter.dev/cookbook/design/snackbars)より引用）


# 開発環境
- macOS Monterey 12.5
- Android Studio Chipmunk | 2021.2.1 Patch 1
- Flutter 3.3.10


# SnackBar の使い方
ScaffoldMessenger を使用してSnackBar を表示します。
また、オプションで`action`を指定することでSnackBar を押下したときの動き実装することが可能です。

```dart
const snackBar = SnackBar(
  content: Text('SnackBar!'),
  action: SnackBarAction(
    label: 'Undo',
    onPressed: () {},
  ),
);

ScaffoldMessenger.of(context).showSnackBar(snackBar);
```


# SnackBar（スナックバー）を表示する

```dart:main.dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:uuid/uuid.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
          title: Text(title),
      ),
      body: const MainPage(),
    );
  }
}

class MainPage extends StatelessWidget {
  const MainPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Center(
      child: ElevatedButton(
        onPressed: () {
          final snackBar = SnackBar(
            content: const Text('SnackBar！'),
            action: SnackBarAction(
              label: 'Undo',
              onPressed: () {},
            ),
          );
          ScaffoldMessenger.of(context).showSnackBar(snackBar);
        },
        child: const Text('Show SnackBar'),
      ),
    );
  }
}
```

ボタンを押下で画面下部にSnackBar を表示することができました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1076680/9259c414-4cc6-56c1-2047-1efab6dfb358.gif" width="350">


# さいごに
Flutterで画面下部にSnackBar を表示する方法を紹介しました。
ユーザにじゃまにならない程度の通知をする際に便利で役に立つかと思います！

# 参考サイト
- [Display a snackbar](https://docs.flutter.dev/cookbook/design/snackbars)
ABC294回答メモ

0.はじめに
　今回の問題は、全体的に難易度が低かった気がします。(相性が良かった？)
　記憶にある限り初めてのＡ～Ｅ制覇で、レートも700台にupしました。

1. 	A - Filter
　インプットしたリストを頭からチェックして
　答え用のリストに偶数だけ格納して
　最後に表示。と、素直に解きました。

　最近以下の書き方で、リストを横一列にスペース区切り表示できることを知り
　役に立っています。

```
ans=[1,2,4]
print (*ans)　# 1 2 4 
```
　https://atcoder.jp/contests/abc294/submissions/39846002

2.B - ASCII Art
　数字をアルファベットに変換する方法を探すのが面倒だったので
　前からよく使っているA~Zの文字列を使い、ここから必要な文字を
　アドレス指定で取り出す方式で実装しました。

　https://atcoder.jp/contests/abc294/submissions/39851228

3.C - Merge Sequences
　制約から、Aのリストと、Bのリスト内で重複する数字はないことが
　わかったので、以下の方法を思いつき実装してACでした。

　考え方
　　1.リストAとリストBを合わせたリストCを作りソートする。
　　2.Cを頭からインデックスiで読み込み、辞書にKEYC[i]=iを登録していく
　　3.リストA内の順番用リストALとリストB内の順番用リストBLを用意する。
　　4.リストAを頭からインデックスiで読んでいき、辞書キーA[i]の値+1を
　　　AL[i]に格納していく
　　5.リストBについても同様の操作を行う。
　　6.リストALとBLを表示する。

　https://atcoder.jp/contests/abc294/submissions/39857220

4.D - Bank
　まず、呼ばれた人リストを作ってその人が窓口に行ったらリスト削除
　という形で実装したけどTLE。
　リストではなく、辞書で実装したけどTLE
　と、八方ふさがりでしたが、問題を読み返して
　呼ばれた人リストはいらないし、制約が丁寧なので
　今何番まで呼ばれたかもいらないな・・・。などということに気づいたので
　以下の考え方で実装をしてAC。

　制約ががっちりしているから解きやすく感じました。

　考え方
　　以下の変数を準備し、それぞれ以下のように扱う
　　　1）P1(数値)　・・・　イベント1で次に呼ばれる人を保持。
　　　　　　　　　　　　　　イベント1が来たら1加算
　　　 　　　　　　　　　　 まぁこの後使わないけど。

　　　2) P2(辞書)　・・・　受付に来た人を保持
　　　　　　　　　　　　　　イベント2が来たらその番号を登録
　　
　　　3) P3(数値)　・・・　前回イベント3で呼ばれた番号を保持(初期値1)
　　　　　　　　　　　　　　イベント3が来たら、P3の番号が
　　　　　　　　　　　　　　P2に存在するかをチェック。
　　　　　　　　　　　　　　存在しない＝呼ばれてない
　　　　　　　　　　　　　　　　　　　＝その数字がイベント3で呼ばれる
　　　　　　　　　　　　　　存在する＝P3に1加算しその番号をチェック
　　　　　　　　　　　　　　　　　　　以下存在しない番号までループ

　https://atcoder.jp/contests/abc294/submissions/39869595

5.2xN Grid
　素直に解いたらTLEまっしぐらな感じ。
　でも、尺取法（と言っていいのか微妙だが）ぽく、
　A列をもとにB列をチェックしていけば
　解けるのでは！？と思い実装→解けました。

【考え方】
　　1)1行目の情報を、リストNL1に格納。形式:”NL1[i]=(V[1][i],L[1][i])”
　　2)2行目の情報を、リストNL2に格納。形式:”NL2[i]=(V[2][i],L[2][i])”
　　3)一致したマス目の数ansとNL2のチェック対象アドレスjを定義(いずれも初期値0)
　　4)NL1に格納されたアイテムを、1つずつチェックしていく。(インデックス変数=i)
　　　4-1)NL1[i][0]を比較値変数V1に、NL1[i][1]を比較長変数L1にセット
　　　4-2)フラグ変数に0をセット
　　　4-3)フラグ変数が1になる(L1が0になる)まで以下を繰り返し
　　　　4-3-1)NL2[j][0]を比較値変数V2に、NL2[j][1]を比較長変数L2にセット
　　　　4-3-2)L1=L2の時(現在比較中のリストについて圧縮長が同一の時)
　　　　　4-3-2-1)V1=V2の時(現在比較中のリストについて値が同一の時)
  　　　　　4-3-2-1-1)ansにL1を加算(比較中リストの圧縮長を加算)
　　　　　4-3-2-2)jに1を加算(次回の比較はNL2の次のアイテムを対象)
　　　　　4-3-2-3)FLGに１をセット（現在比較中のNL1のアイテムは終了）
　　　　4-3-3)L1>L2の時(現在比較中のリストについてL1の圧縮長が長い時)
　　　　　4-3-3-1)V1=V2の時(現在比較中のリストについて値が同一の時)
  　　　　　4-3-3-1-1)ansにL2を加算(比較中リスト2の圧縮長を加算)
　　　　　4-3-3-2)L1-L2(L2との比較に使用した分のL1は短くする)
　　　　　4-3-3-3)jに1を加算(次回の比較はNL2の次のアイテムを対象)
　　　　4-3-4)L1<L2の時(現在比較中のリストについてL1の圧縮長が短い時)
　　　　　4-3-4-1)V1=V2の時(現在比較中のリストについて値が同一の時)
  　　　　　4-3-4-1-1)ansにL1を加算(比較中リスト2の圧縮長を加算)
　　　　　4-3-4-2)NL2[j][1]-L1(L1との比較に使用した分のL2を短くするため
　　　　　　　　　　　　　　　　　NL2リストの値を減らす。)
　　　　　4-3-4-3)FLGに１をセット（現在比較中のNL1のアイテムは終了）
　　5)ansを出力

　書き起こすとややこしくなりましたが、考え方は単純です・・・。

　https://atcoder.jp/contests/abc294/submissions/39874226

以上
【VBScript】連想配列について



# 目次

[1. はじめに](#1はじめに)
[2. 環境](#2環境)
[3. 連想配列とは](#3連想配列とは)
[3-1. 配列とは](#3-1配列とは)
[3-2. 連想配列とは](#3-2連想配列とは)
[3-3. 補足](#3-3補足)
[4. 参考](#4参考)
[5. おわりに](#5おわりに)


# 1.はじめに

現在VBScriptを実務で使用しています。VBSCriptでは配列の種類が複数あります。

今回はVBScriptの連想配列についてまとめます。


# 2.環境

- Windows 11 Pro 22H2
- Microsoft-IIS/10.0
- ASP 5.8 (16384)


# 3.連想配列とは

## 3-1.配列とは

複数のデータを順番に並べたもので、変数が1列に横に並んでいる構造となっています。

| キー（添字） | 0 | 1 | 2|
|:-----------|:-----------|:-----------|:-----------|
| **項目（値）**| **伊藤**| **田中** |**鈴木** |

```vb
Dim arr(2)
arr(0) = "伊藤"
arr(1) = "田中"
arr(2) = "鈴木"

For Each a In arr
    Response.Write a & "<br>" ' 伊藤 田中 鈴木が並ぶ
Next
```

## 3-2.連想配列とは

キーに好きな名前をつけることができます。

| キー（添字） | バスケットボール部 | 野球部 | 卓球部|
|:-----------|:-----------|:-----------|:-----------|
| **項目（値）**| **伊藤**| **田中** |**鈴木** |

連装配列では「Scripting.Dictionary」を使用します。

:::note info
Scripting.Dictionary：任意の形のデータを格納するディクショナリのオブジェクト
:::

```vb
Dim objDic
Set objDic = Server.CreateObject("Scripting.Dictionary")
```

キーと項目の追加の仕方は2種類あります。
```vb
objDic.Add "バスケットボール部", "伊藤"
objDic.Add "野球部", "田中"
objDic("卓球部") =  "鈴木"

Response.Write(objDic("卓球部"))　' -> 鈴木
Response.Write(objDic.Item("サッカー部")) ' 該当のデータがないので何も表示されない
```

:::note info
①Dictionaryの変数.Add "○○（キー）", "▲▲（項目）"
②Dictionaryの変数("○○（キー）") = "▲▲（項目）"
:::

表示の仕方も2種類あります。

```vb
aryTempKeys = objDic.Keys
For i = o To objDic.Count -1
    Response.Write objDic.Item(aryTempKeys(i)) & "<br>" ' 伊藤 田中 鈴木が並ぶ
Next
```

```vb
aryTempItems = objDic.Items
For i = 0 To objDic.Count -1
    Response.Write aryTempItems(i) & "<br>"
Next
```

:::note info
①キーを取得して対となる項目を表示する
②全項目の配列を取得して表示する
:::

## 3-3.補足

ここでは、Dictionaryオブジェクトの用語について表でまとめます。

| 用語 | 説明 | 
|:-----------|:-----------|
| Add| 1組のキーと項目を追加する|
| Keys| すべてのキーを格納した配列を返す|
| Count| 項目数を取得する|
| Item| 指定したキーに基づいて項目を返す|
| Items| 全ての項目を格納した配列を返す|


# 4.参考

https://web-camp.io/magazine/archives/62260

https://blog.senseshare.jp/associative-array.html

http://asp.style-mods.net/tips/asptips_3-01.htm

http://asp.style-mods.net/tips/asptips_3-05.htm

http://asp.style-mods.net/tips/asptips_3-02.htm

https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/dictionary-object


# 5.おわりに

記事の感想や意見、ご指摘等あれば伝えていただけるとありがたいです。
読んでいただき、ありがとうございました。
PHP基本構文『FizzBizz問題』

# FizzBuzz問題
1~20の数字に対して、3の倍数は「Fizz」5の倍数は「Buzz」15の倍数は「FizzBuzz」それ以外はその数字を出力してください。全て改行せよ。
## 記述したコード
```
for($i=0; $i<=20; $i=$i+1){
    if($i%3==0 && $i%5==0){
        echo 'FizzBuzz' . '<br>';
    }elseif($i%3==0){
        echo 'Fizz' . '<br>';
    }elseif($i%5==0){
        echo 'Buzz' . '<br>';
    }else{
        echo $i . '<br>';
    }
}
```
## 画面
![スクリーンショット 2023-03-20 19.03.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193952/fef44e26-93d2-28b9-5e64-e22751116701.png)
[Python] コンソール出力を同じ行に上書きするメモ

## はじめに

メッセージをコンソールの同じ行に上書きして出力したい場合に、キャリッジリターンを使うと簡単に出来ます。
しかし、後続するメッセージが前のメッセージより短い場合は、出力が綺麗になりません。
単純に前のメッセージと同じ文字数になるだけ末尾に空白文字足してを出力すると綺麗な見た目にはなります。
ただ、これだと力技なので[Console Virtual Terminal Sequences](https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences)を使った方法のメモです。

## サンプル

1. test1: 単純な方法。見た目が悪くなる。
2. test2: 力技。ただ環境に依存しない。
3. test3: [Console Virtual Terminal Sequences](https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences)を使える場合は、これで綺麗に出来る。環境に依存する。

```python:python
import sys
import time
import random


def getRandomStr(string="abcdefghijklmnopqrstuvwxyz", rMin=1, rMax=10):
  return "".join(random.choices(string, k=random.randint(rMin, rMax)))


def test1():
  print(f"start: {sys._getframe().f_code.co_name}")
  for i in range(11):
    print(f"\r{i:2}: {getRandomStr()}#", end="")
    time.sleep(0.5)
  print(f"\nend: {sys._getframe().f_code.co_name}")


def test2():
  print(f"start: {sys._getframe().f_code.co_name}")
  oldLen = 0
  for i in range(11):
    str = getRandomStr() + "#"
    l = len(str)
    if l < oldLen:
      str += " " * (oldLen - l)
    oldLen = l
    print(f"\r{i:2}: {str}", end="")
    time.sleep(0.5)
  print(f"\nend: {sys._getframe().f_code.co_name}")


def test3():
  print(f"start: {sys._getframe().f_code.co_name}")
  for i in range(11):
    str = getRandomStr()
    print(f"\r\x1b[1M{i:2}: {str}#", end="")
    time.sleep(0.5)
  print(f"\nend: {sys._getframe().f_code.co_name}")


test1()
test2()
test3()
```

## 参考

https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences
エンジニアとして成長するためにやること

# 記事概要
- WEB系自社開発エンジニアとして１年以上業務をやってきたが、成長が非常に遅い
    - 小さいアプリすらまともに作れないレベル
    - すごく良い人ばかりの会社なので社内ではやってこれた
    - でも普通に成長はしたい。。。。
- レベルアップのための時間投資はかなり行ってきたが、時間対効果が悪すぎる
    - そして何より「あまり良い方法ではない」と思っていたことを続けてしまったことが最も反省として大きい
- 正直もうエンジニアという仕事を諦めてもいいのだが、しかしせっかくやってきた　最後もう一度足掻いてみたい
    - ただし、今度は「効率よく」足掻きたい
- そこで自分が行ってきた学習方法に対して一つずつ振り返り、良質な学習記事を基に改善方法を出していく

## 反省するための参考記事

どれも有名だと思う

https://qiita.com/YudaiTsukamoto/items/42a8df22ca4c6b327dfd

https://qiita.com/miriwo/items/681ff186f4d6f9057135

https://s8a.jp/words-are-correctly#%E5%84%AA%E7%A7%80%E3%81%AA%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E3%81%9D%E3%81%86%E3%81%A7%E3%81%AA%E3%81%84%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E9%81%95%E3%81%84

## 反省 アウトプットが少なすぎる

- 超あるあるの反省　しかしここに尽きる
    - 結局自分で考えて、小さくても動くアプリはまじで作ったことがない（よくこれでWEB系企業数社の内定がもらえた）
    - 「自分で考える」という行為を全くしなかったことが原因

- あと会社のミーティングとかで自分に関係ない内容でももっと貪欲にメモればよかった
    - 基本リモートなのでサボってた（言い訳）
    - これやるだけでキャッチアップが大きく違うと思う


## これからやること

### 「理解」の定義を明確にする

- 1から10まで説明できるようになる
    - サンプルコードでも技術書でも業務内容でも、とにかく「説明できない」箇所を全てなくす
    - 一つの単元が終わるごとにその内容を一人で説明する（もっと粒度は細かくしてもいいかも）
    - コードも必ず１行ずつ明確に言葉にする
    - 用語を積極的に使用すること


## 車輪の再発明と追加開発

これは本当にもっと積極的にやればよかった

- 書籍や学習サービスのアプリをコピーした後に、自分から追加機能開発やコード改変などを全くやらなかった
    - こっちのほうが１からアプリを作るよりも労力は遥かに少なく行うことができる
    - もちろん説明できるようになることを忘れずに
- 車輪はどんどん再発明しよう
    - 自分で車輪作れねえし、そもそも車輪の中身理解するには作らないと駄目
    - ただ、パクったあとに車輪をちょっとだけ自分で追加実装したり変えたりしてみること

## 会社の実務を貪欲に
- 自分のやっていることは当然まとめる
- その他の人がやっていることも貪欲にまとめる
    - 自分事と思ってメモしてまとめる
    - Slackやドキュメントに内容は残っているので、しっかり追う作業をする


## 毎日発信する

- 毎日どこでもいいから必ず人の目があるところに発信する
- 中途半端でもいいから発信することをとにかく意識する
    - 中途半端でも記事が残っていたら、自分の性格的に書き直したくなる
    - そしていい復習になる

## 不明点をわかるまで調べる・調べているときのログを残す

- プログラミング学習を始めたときは「わからなくても進めよう」の方針でずっと続けてきた
    - でもそれは初学者特有の`進まなくて挫折する`を防止するためのものであって、業務の場合このスタンスは結構危険
    - わからないことは徹底的に調べて理解すること（もちろん業務に支障が出ない範囲内の話だが）
- この「わからないこと」を理解して定着させるためには調べたログを残すこと・そして調べきった後に綺麗にすることが大事だと感じる
    - ログ残さないと問題解決した後にどうしてその理由で悩んでいたかなどが不明瞭になる
    - たとえ問題解決には直結していなくても、調べる過程で知り得た知識は結構役に立つことも多い
Azure Administrator(AZ-104)：Azure でのストレージの実装と管理「BLOBのアップロード」

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

## 今回の学習内容
**◆「BLOBのアップロード」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure でのストレージの実装と管理](https://learn.microsoft.com/ja-jp/training/paths/az-104-manage-storage/)
◇対応するモジュール
[BLOB をアップロードする](https://learn.microsoft.com/ja-jp/training/modules/configure-blob-storage/7-upload-blobs)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure でのストレージの実装と管理「BLOBオブジェクトレプリケーション」](https://qiita.com/fsd-jume/items/3c1e6e32bf9971de0fd7)

## BLOBのアップロード
### BLOBの種類
**◆ブロックBLOB：テキストやバイナリデータに最適**
・個別に管理できるデータのブロックで構成
⇒それらを組み立ててBLOBを構成
・データのブロックはそれぞれがブロックIDで識別
・ほとんどのBlob Storageのシナリオで使用

**◆追加BLOB：VMのデータのログ記録などに最適**
・追加操作用に最適化されたデータのブロックで構成
・ブロックは追加ブロック操作を介してのみBLOBの末尾に追加
⇒既存のブロックの更新/削除はサポート外

**◆ページBLOB：Azure VMのOSディスクとデータディスクで使用**
・読み取り/書き込み操作を頻繁に実行する場合により効率的
・512バイトのページの集まりであり、任意の範囲のバイトの読み取り/書き込み可能
⇒合計で最大8TBのランダムアクセスファイルを格納可能

### BLOBアップロードツール
**◆Azure Storage Explorer**
・ストレージアカウントにBLOBをアップロードする一般的な方法
・Windows/macOS/Linuxでデータの操作を容易にするスタンドアロンアプリ

**◆AzCopy**
・Windows/Linux用の使いやすいコマンドラインツール
・Blob Storage間/コンテナ間/ストレージアカウント間でデータをコピー

**◆Azure Storage Data Movement Library**
・Azure Storageサービス間でデータを移動するための.NETライブラリ
・Az CopyユーティリティはData Movement Libraryを使用して構築

**◆Azure Data Factory**
・下記の認証を使用してBlob Storage間でデータをコピー可能
　-アカウントキー
　-共有アクセス署名(Shared Access Signature)
　-サービスプリンシパル
　-マネージドID

**◆Blobfuse**
・Blob Storage用の仮想ファイルシステムドライバー
・Linuxファイルシステムにおいてストレージアカウント内の既存のブロックBLOBデータにアクセス可能

**◆Azure Data Boxサービス**
・オンプレミスのデータをBlob Storageに転送するサービス
⇒下記により有線でのデータのアップロードが非現実的である場合に使用
　-大規模なデータセット
　-ネットワーク上の制約
・Microsoftから下記デバイスを取り寄せ、データをディスクにコピー
　-Azure Data Box Disk
　-Azure Data Box
　-Azure Data Box Heavy
・コピー後にMicrosoftに送り返すことで、Blob Storageにアップロード

**◆Azure Import/Export**
・利用者自身がデータImport/Export用のハードディスクを用意して送付
⇒Microsoftが大量のデータをExport/Importして返送
・例：Blob StorageとAzure Filesに大量のデータを安全にインポート可能
・例：Blob Storageからデータをエクスポートし、オンプレミスのサイトに送付可能

### BLOBのアップロード方法(Azure Storage Explorer)
・下記の内容を選択してBLOBデータをアップロード
　-BLOBの種類
　-ブロックサイズ
　-アップロード先のコンテナフォルダ
　-認証方法
　-暗号化スコープ

## 次の学習内容
**◆Blob Storageの価格**

https://qiita.com/fsd-jume/items/054cbace9939e0dd38ac

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

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
【Python】複数のテキストファイルから更新日時と特定の一行をCSVへ出力するスクリプト

```python
import os
import csv
from pathlib import Path
import time

output_csv = "output.csv"
specific_line_number = 1
max_directories = 1000

base_path = "//"
dir_pattern = "nnn/test"
file_name = "hoge.txt"

with open(output_csv, mode='w', newline='', encoding='utf-8') as csv_file:
    csv_writer = csv.writer(csv_file)
    csv_writer.writerow(["Directory", "Text Line", "File Update Time"])

    for i in range(max_directories):
        dir_name = str(i).zfill(3)
        dir_path = base_path + dir_name + dir_pattern
        file_path = os.path.join(dir_path, file_name)

        if os.path.isfile(file_path):
            with open(file_path, encoding='utf-8') as txt_file:
                try:
                    specific_line = txt_file.readlines()[specific_line_number - 1].strip()
                except IndexError:
                    specific_line = ""

            file_update_time = os.path.getmtime(file_path)
            file_update_time_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(file_update_time))

            csv_writer.writerow([dir_path, specific_line, file_update_time_str])

print("CSVファイルに出力が完了しました。")
```
```python
import os
import csv
from pathlib import Path
import time

output_csv = "output.csv"
search_string = "特定の文字列"
max_directories = 1000

base_path = "//"
dir_pattern = "hogennn/test"
file_name = "hoge.txt"

def find_line_with_string(file, search_string):
    with open(file, encoding='utf-8') as txt_file:
        for line_number, line in enumerate(txt_file, start=1):
            if search_string in line:
                return line.strip(), line_number
    return "", -1

with open(output_csv, mode='w', newline='', encoding='utf-8') as csv_file:
    csv_writer = csv.writer(csv_file)
    csv_writer.writerow(["Directory", "Text Line", "Line Number", "File Update Time"])
```
Python Twitter APIを使わずにツイートを収集 2023年最新版

## ツイート収集用の各ライブラリ
ほぼ使えなくなったので自力で収集する方がいいです。

## 事前準備
Google Colaboratory で ツイートを収集してみます。
[Google Colaboratory でTwitterの画像をダウンロード](https://qiita.com/katafuchix/items/9ba3d3972c5e757db621) の通りにGoogle Colaboratory に chrome, selenium をインストールしてください。

## ツイート収集
ツイートを収集したいアカウントにアクセスして、下までスクロールします。

```python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import datetime
from bs4 import BeautifulSoup

options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome('chromedriver', options=options)
driver.implicitly_wait(10)

url = "https://twitter.com/idolpicture2/"
driver.get(url)

# articleタグが読み込まれるまで待機（最大15秒）
WebDriverWait(driver, 15).until(EC.visibility_of_element_located((By.TAG_NAME, 'article')))
# 下までスクロール
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
```

１ページ以上収集したい場合は、上の処理をループで何度も実行してください。
ツイートは article 要素に格納されています。

```python
# ツイートの article を参照
elems_articles = driver.find_elements(By.TAG_NAME, 'article')

# 各ツイートをパース
for elem_article in elems_articles:
  try:
    # ツイート日時
    time_elem = elem_article.find_element(By.TAG_NAME, 'time')
    time_str = time_elem.get_attribute('datetime')
    print(time_str)

    # ツイートURL
    tweet_url = time_elem.find_element(By.XPATH, "..").get_attribute('href')
    print(tweet_url)

    # 添付画像
    imgs = elem_article.find_elements(By.TAG_NAME, 'img')
    for img in imgs:
        image_src = img.get_attribute('src')
        print(image_src)

    # ツイート本文 
    html = elem_article.get_attribute('innerHTML')
    soup = BeautifulSoup(html, features='lxml')
    results = soup.findAll("div", {"data-testid" : "tweetText"})
    tweet_text = results[0].get_text()
    print(tweet_text)

  except Exception as e:
    print (e)
```

Google Colaboratory ではスクロールを繰り返す処理ができないことがあります。
その時はローカル端末で実行してください。

## 動画のダウンロード
ツイートから動画をダウンロードする場合は、上で得られたツイートのURLをここにPOSTする方が簡単です。
https://lab.syncer.jp/Tool/Twitter-Video-URL-Converter/

Selenium で実行し、ダウンロードできます。
G検定に登場する用語のマインドマップを作成してみた件

# G検定 2023#1 を受けました

G検定 2023#1 を受けました。
本日 3/20 合格発表で、無事通って一安心です。
あちこちで言われているように受験時は２画面体制＆画素数多い大画面を用意しましょう。

![通知メール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513949/c83ecf64-876d-a0bb-e692-dbd1fc7f87dc.png)

試験準備開始前はこんな感じでした。

- 機械学習、ディープラーニングは概説なら見たことある、レベル
- 偏微分？線形代数？ ………… 大昔にやった気がしないこともなくもない
- 統計はさっぱり
- 法令まわりはITパスポートとかで詰め込んだ分で何とか乗り切ろう
- AIの歴史はだいたい把握してると思う


# G検定に登場する用語のマインドマップを作成してみた件

試験準備期間中、備忘録として用語のマインドマップを作成しました。
ツリー状になっていると分野の把握が進んでいる部分・薄い部分が一目で見渡せて便利ですね。

マインドマップの作成には（無料で使用可能ということで） VSCode とプラグインの vscode-mindmap を使用しています。
用語ごとに備考とネット記事へのリンクを設定する機能があります。
メニュー項目が中国語ですが、中国語がわからない状態でも雰囲気でだいたい使える感じでした。
英語メニューご希望の方は多言語対応版の vscode-mindmap (i18n) もあります。


# 作成したマインドマップはこちら

という訳で、備忘録用のマインドマップを公開いたします。vscode-mindmap 用のファイルで「数理・統計、歴史、社会」「機械学習、ディープラーニング」の２枚分割になっています。
用語はすべて（調べられた限りの範囲で）日本語、英語フルスペル、英語略称、別名を併記しています。（政策関係など、対応する英語訳がないものは例外）
鎖マークでリンクが設定されているものは、クリックすると用語の説明があるネット上のページにジャンプします。

ネット上で記事を公開されている皆様に多大な感謝を。

- [数理・統計、歴史、社会](https://stonee-k.github.io/my_archives/Math.km) （pngは[こちら](https://stonee-k.github.io/my_archives/Math.png)）
- [機械学習、ディープラーニング](https://stonee-k.github.io/my_archives/DL.km)（pngは[こちら](https://stonee-k.github.io/my_archives/DL.png)）


![mindmap_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513949/a6238ad5-723b-61a9-3d31-ab41b2e95036.png)
![mindmap_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513949/5921107b-0d21-b5be-4243-43f42636fc0d.png)