OmniAICreator/Qiita-1.07M huggingface dataset:
Nextjs + web3のスターターキットをOSSにします


## 概要

このソースコードはNFTマーケットやDeFiなどのWeb3関連のサービスを作るときにに汎用的に使えます。
日本や世界のweb3の発展に寄与したいのでNextjs + web3のスターターキットを作りました。

Nextjs + web3のプロジェクトを始める時に必要なツールを詰め込みました。

https://github.com/Foxlottery/nextjs-web3-starterkit


### demo site url

https://nextjs-web3-starterkit.vercel.app

## 設定済みのツール
- Sentry
- Web3
- Jest test
- Tailwind.css
- Vscode initialization
- PR and Issue template
- Seo module
- Husky
- Lingui
- Google Tag Manager
- Redux
- ESlint
- Prettier
- Github workflow


## スクリーンショット

### PC

![pc-size.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264684/31b7a275-03f6-acaf-ab35-926adef39aed.png)

### スマホ
![s-size.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264684/2f47c6cf-6331-0b6b-60fd-49200235130b.png)



# Sentry
https://sentry.io/
アプリケーションの監視とエラー追跡のソフトウェア

# Web3
### wallet connect
supported wallet
metamask: https://metamask.io/
coinbase: https://www.coinbase.com/en/wallet
portis: https:/portis.io
fortmatic: https://fortmatic.com/

### network connect
supported network
Ethereum
Avalanche
Polygon
Ropsten

# Jest test
https://jestjs.io/ja/
javascriptのユニットテストツール

# Tailwind.css
https://tailwindcss.com/
css フレームワーク

# Vscode initialization
https://code.visualstudio.com/
vscode 対応のための初期設定

# PR and Issue template
github pr と issue テンプレート

# Seo module
NextjsでSEO対策するための初期設定

# Husky
https://www.npmjs.com/package/husky
コミット時に自動でコマンドを実行

# Lingui
https://lingui.js.org/
Javascriptのシームレスな国際化

# Google Tag Manager
https://tagmanager.google.com/
Google Analyticsは、広告のROIを測定するだけでなく、Flash、ビデオ、ソーシャルネットワークのサイトやアプリケーションを追跡することができます。


# Redux
https://redux.js.org/
JSアプリのための予測可能なステートコンテナ

# Eslint
https://eslint.org/
コードチェックツール

# Prettier
https://prettier.io/
コードフォーマッター


# Github workflow
https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions
CI/CD ツール
Github のワークフローは、コミットやマージが行われたときにデプロイやテストを実行する
VSCodeでChromeのデバッガができないとき

WindowsでVSCodeでChromeのデバッガを使おうとしたときうまくつながらなかったので、その解決策を備忘録として書いておきます。

事象：
「このサイトにアクセスできませんlocalhost で接続が拒否されました。 次をお試しください 接続を確認する プロキシとファイアウォールを確認する」というメッセージがでる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1260103/275ca3ca-ec65-bbfe-09b0-a5c7bcab4e07.png" width=80%>

解決策：
サーバーを立ち上げ、ポート番号をサーバーが立ち上がっている番号に合わせる。

１）VSCodeのライブサーバー機能をオンにする。
ライブサーバを立ち上げるとポート番号が画面下のタスクバーに表示されます。

２）launch.jsonにあるURLをサーバが立ち上がっている番号に手動で合わせる。
まず、デフォルトで作られるlaunch.jsonがこちら。portは8080になっている。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1260103/7a2d920a-f504-25c8-0021-9c1d2f62b35b.png" alt="url pointing to port 8080" width=50%>

これを手動でサーバの立がっている番号に書き換える。このときは5501でした。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1260103/bddb16bf-5ec4-f60b-e9e4-a7f83c3a8a24.png" alt="url pointing to port 5501" width=50%>

こうしておいてデバッガのlaunchボタン▷をクリックすると繋げました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1260103/a303fc24-39c4-1c48-1435-228b454d68e4.png" alt="debugger icon on the left" width=50%>

以上です。
最急降下法を用いた最適値導出

# 1. 初めに
最急降下法を使うためには，
最適化したい関数が**微分可能である**ことが前提にある．
関数$f(x)$があるとすると，以下の更新式で最適値が求められる．
$$
x=x_{old}-af'(x)
$$
# 2. 1次元の関数に対する最急降下法
4次関数
$$
y=3x^4+4x^3+1
$$
がある．この関数を図にしたものを以下に示す。
```python
a = np.array(range(-17,10))*0.1
b = 3*a**4 + 4*a**3 + 1
plt.plot(a,b)
plt.grid()
```
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521553/1c1a3cb1-8f2f-760b-4942-35b36f251249.png)
微分すると
$$
y'=12x^3+12x^2=12x^2(x+1)
$$
つまり，この関数の微分が0になる値はx=0,-1の時である．
これを最急降下法で求める．

初期値：10，
ステップ幅：0.001
試行回数：500とすると，
1回目の更新では
$x=10-0.001×12×10^2(10+1)=3.2$
2回目の更新では，
$x=3.2-0.001×12×3.2^2(3.2+1)=-2.9296...$
これを繰り返すことで最適値が求められる．
そのプログラムを以下に示す．
```python
# 試行回数
try_num = 500
result = np.zeros(try_num)
# 初期値
x = 10
# ステップ幅
alpha = 0.001
for i in range(try_num):
    y_ = 12*x**3 + 12*x**2
    x = x - alpha*y_
    result[i] = x
plt.plot(result)
plt.ylabel("x")
plt.xlabel("try")
plt.grid()
```
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521553/dfa5be06-cddd-a20c-5f96-e81ffd9c1a0e.png)
これで$x=-1$となり，最適解が求められた．
***
次に
初期値：-10，
ステップ幅：0.0015
試行回数：1000にすると
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521553/a9d58b0d-5255-d9a9-14c2-737614b3e019.png)
これだと$x=0$になり局所解につかっまってしまった．
# 3. 最後に
今回は１次元の問題を扱い，最急降下法を用いて最適値を導出した．
最急降下法は最適値を導出できる場合もあるが，局所解に陥る可能性がある．
好きなYoutubeチャンネルの動画が投稿されたらslackに通知させる処理を「Power Automate」で作ってみたら思いのほか楽に設定できた件について

# １．はじめに
好きなYoutubeチャンネルの動画が上がってくるたびに、スマホやタブレットの通知で来るのは非常にありがたいのだが、通知欄が埋まるのが嫌なのと、好きなyoutubeチャンネルごとにSlackに通知を出すような設定したらいいんじゃないかと思ってやってみたところ、思いの外コードとか書かずにできたので記載する。

## 必要なもの
* 「microsoft」アカウント
    * 無料で作成可能（今回使用するのはすべて無料でできる範囲です。）
* Slackのワークスペース
    * 送信先で必要
* Youtubeアカウント
    * 設定時に必要
* 通知したいyoutubeのチャンネルIDもしくはチャンネル名
    * 設定時に必要（今回は[パリーグTV](https://www.youtube.com/channel/UC0v-pxTo1XamIDE-f__Ad0Q)のチャンネルの動画を使用します。）

# 実施方法
## １．Power Automateに登録する
「microsoft」アカウントがあればサインインでOK
なければ「microsoft」アカウントを登録するか、下記より「無料で試す」からメールを送って登録すればOK
https://powerautomate.microsoft.com/ja-jp/

## ２．登録後フローを作成する
「Power Automate」を登録後、「作成」から「自動化したクラウド フロー」を選択し、作成していく。
※「Power Automate」ではコードを書くというよりも、UI上で指定の処理やトリガを並べて処理のフローを作っていく感じ。
そうすると以下のような画面が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640942/e828108e-f2fa-614c-93d8-851a73df9372.png)
「フロー名」は単純にフローのタイトル、「フローのトリガーを選択してください」には「youtube」と入力すると、「チャンネルによって動画がアップロードされたとき」というトリガーが出てくるのでそれを選択し「作成」ボタンを押下する。

## ３．編集画面でフローを設定していく
そのまま後続の処理を作成していく。
### ３-１．youtubeの設定
youtubeを設定すると、事前に連動する必要があるので、自分のyoutubeアカウントを使ってサインインをする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640942/db0fe65a-b180-1b42-68a6-a16b96390350.png)
そうするとこんな感じで出てくるので、プルダウンでチャンネル名を選択するかプルダウン最下部にある「カスタムIDの入力」からyoutubeのチャンネルIDを入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640942/60a25d88-ae6d-e561-9cdc-d84be9dfb61a.png)

### ３-２．Slackへの送信
「新しいステップ」を押下し「Slack」と検索すると「アクション」に「メッセージの投稿」と出てくるので選択する。
※ここでSlackと3-1の時と同様にSlackと連動させる必要があるので、設定したいSlackのワークスペースにログインし同期させる。
そうすると投稿先のチャンネル名と投稿するときの文言を設定することができる。
なおこの時、youtubeから取得した情報を文言で設定できる。
下記のイメージでは「test」チャンネルに文言に加え「動画名」と「動画のURL」が表示されるように設定したもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640942/b8896b7f-26ab-8528-18da-443690632149.png)

## ４．保存して実際に動くことを確かめる。
「保存」ボタンを押下し、右上に存在する「テスト」ボタンを押下して実際にSlackに飛ぶことを確かめる。
とりあえず「自動」を設定し、そのまま実行してSlackにメッセージが送信されることを確かめる。
下記のイメージは成功した場合。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640942/8c487914-d31c-c83a-f073-2ce6a78d6b79.png)

## ５．youtubeの動画上がったタイミングで通知が来ることを確かめる。
実際にフローが機能していることがわかったので、今度はチャンネルの動画が更新されたタイミングで通知が来るかどうか確かめる。
それでメッセージが送信された場合は成功。
（ただし、動画投稿後10～20分ぐらいトリガーが発動するのに時間がかかるので、そこは気長に待った方が良いかも。）

# おわりに
単純に動画のアップロード通知ぐらいならyoutubeのAPIから取得してやるより、Power Automateで実行させた方が環境構築もいらないので、適当にググりながら小一時間ぐらいで設定ができた。
他にも3-2の時点で、Slackに投稿するbotの名前やアイコンもPower Automateで設定できるのでやっていることはシンプルだけど改良のやりがいはありそう。
Postam　ログイン情報保持(cookies)、PUT＆DELETEの送り方

# ログイン情報保持(cookies)
ログインしたらcookieに値が入る。
そこでvalueの情報を取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700700/dee00c09-45a7-7f3a-ce48-cb10b68f5e7f.png)

valueの情報を貼り付け
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700700/61eddf6e-6675-33c9-53c5-505b60560b6d.png)

# PUT＆DELETEの送り方
KEYに[_method]を追加、VALUEに[PUT&DELETE]を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700700/16540dea-a1e0-8115-cf0f-1dea23bf3e25.png)
今週の学び　第4回

# 今週の学び

JavaScriptなど

- for文
    - for文の中にfor文を入れると、中のfor文の処理が終わってから外のfor文が動作する
    - for文の中には処理なら基本的に何でも入る
- switch文
    - switch文はあまり使わないのでfor文で書いた方が良い
- アルゴリズム
    - 処理を書く順番はとても重要
- else if
    - 処理に分岐がある時とても便利
- Array オブジェクトの sort メソッド
    - Array オブジェクトの sort メソッドを使うと、配列の要素を文字列の並び順または指定した並び順で並び替える
- スコープ
    - 定数や変数の使用できる範囲のこと
- JavaScriptのクラス
    - 「設計図」のことをJavaScriptでは「クラス」と呼ぶ
- filterメソッド
    - 記述した条件に合う要素のみを取り出して新しい配列を作成するメソッド
- var、let、const
    - constだけは再代入をしようとするとエラーになる
    var、let、constの中で再宣言が可能なのはvarのみであり、let、constで同じことをしようとするとエラーが出るため、再宣言を予防することができる
- \n
    - JS等で改行が必要な時に使う
- フローチャートの書き方
    - 開始/終了記号、判断記号、データ/入出力記号など図形の形によってプログラムの動作が違うので書く時に注意する
- JSの入力方法
    - let sample_input = require('fs').readFileSync('/dev/stdin', 'utf8');
      let numbers = (sample_input.trim()).split("\n").map(Number);
    1行目が入力
    2行目が配列に入れる動作
    配列がないなら1行目だけで終わり
- sortメソッド
    - JavaScriptで昇順、降順に並べる時に使う

ITパスポート関連

- ルータ
    - 通過するデータのIPアドレスを見て転送先を選択する装置
- 耐タンパ性
    - ハードやソフトのセキュリティレベルを表す指標
- ポートリプリケータ
    - シリアルポートやパラレルポート、HDMI端子、LAN端子などの接続端子を持つ
- DNSサーバー
    - TCP/IPにおいて、ドメイン名/ホスト名とIPアドレスを紐付け、名前解決を行うサーバー
- NAT
    - Network Address Translationの略
    LANに接続された端末からインターネットに接続する際に、「プライベートIPアドレス」を自動的に外部ネットワークで使用できる「グローバルIPアドレス」に変換する機能
- DNS
    - インターネットなどのIPネットワーク上でドメイン名（ホスト名）とIPアドレスの対応関係を管理するシステム
- 営業利益を求める計算式
    - (売上総利益)-(販売費及び一般管理費)
- キュー(Queue)とスタック(Stack)
    - Queue(キュー)とは、先に入れたデータを先に取り出す仕組みのFIFO(First In First Out)を使うためのもの
    追加したデータを古いものから順番に取り出して使用したい場合に使う
    逆に後から入れたものを先に取り出す仕組みはスタックと呼ばれる
- DFD
    - 「DFD（データフロー図）」
    システムにおけるデータの流れを表した図のことで、データの流れを書くことでシステムの機能を洗い出す
- E-R図
    - Eはエンティティ（Entity）の略で、Rはリレーションシップ（Relationship）の略
    「エンティティ＝モノ」と「リレーションシップ＝関係」の組み合わせでシステムのデータやデータ間の処理構造を設計する

GitHub関連

- Github
    - レポジトリにはpublicとprivateがあり、privateでは外部から見た時にその日pushされたか分からない
AzureServiceBus(キュー)の説明

## 概要
AzureServiceBusはキュー機能を持っているリソースです。
※トピックについての説明は、本記事から除外しています。
PDF作成など、時間がかかる処理を非同期で行う場合に使用されます。
1. PDF作成処理受付を登録（AzureServiceBusキューにメッセージを入れる）
ユーザーは、画面上でPDF作成受付を行う。完了時は作成処理を受け付けましたと表示。
1. AzureFunctions（キュートリガー：　キューを監視している）でメッセージを取得
1. 取得したメッセージをもとに、PDFを作成する
ユーザーは、PDF作成処理結果画面にて、作成状態確認&作成されたPDFをダウンロードする

## 処理の流れ
成功時
1. キューにメッセージを入れる
1. AzureFunctionsがメッセージを取得する（メッセージに入った瞬間に起動）
取得開始と同時にメッセージがロックされる(他のスレッドインスタンスからロックされたメッセージは取得できなくなる)
1. AzureFunctions上でメッセージの中身を確認し、処理を実行する
1. AzureFunctionsの処理が正常終了した時に、メッセージが削除される

失敗時処理
1. キューにメッセージを入れる
1. AzureFunctionsがメッセージを取得する（メッセージに入った瞬間に起動）
取得開始と同時にメッセージがロックされる(他のスレッドインスタンスからロックされたメッセージは取得できなくなる)
1. AzureFunctions上でメッセージの中身を確認し、処理を実行する
1. AzureFunctionsの処理異常終了した時に、メッセージのロックが解除される
1. ロックが解除された瞬間に処理2から再スタートする
1. 最大配信数を超えるとメッセージが配信不能になる

## 設定値の説明
名前: キューの名前
最大キューサイズ: キューにメッセージ積めることのできる最大容量
最大配信数: 失敗時にキューからメッセージを取得できる回数
メッセージのTime to Live: キューに存在するメッセージの有効時間
ロック期間: キューからメッセージを取得する時、取得したメッセージを他スレッドか他インスタンスが取得できないようロックされている時間
アイドルキューの自動削除を有効にする: ONにした場合、設定した期間キューにメッセージが入らないとキューが自動で削除される
重複データ検出を有効にする: [MessageId]が重複した場合、一方が削除される
メッセージの期限切れに夜配信不能を有効にする: 期限切れのメッセージを配信不能サブキューに移動します
パーティション分割を有効にする: パーティションが16コ作成され、最大サイズ×16＝GB分保存が可能
セッションを有効にする: [SessionId]を同じにした場合、同一セッションIDで入れられたメッセージは取り出される時に順序が保証される
キューまたはトピックにメッセージを転送する: 一方のキューまたはサブスクリプション (転送元) にあるメッセージを自動的に削除し、もう一方のキュートピック (転送先) に追加　※詳しくは[こちら](https://docs.microsoft.com/ja-jp/azure/service-bus-messaging/enable-auto-forward)

## セッション有効時の注意点
**処理順序が厳密に保証される必要がない場合は使用しないこと。**
セッション有効時、同一セッションIDで複数メッセージが存在する場合、積まれた順にメッセージ取得する。
メッセージ取得時に取得メッセージは、ロックされるため他スレッドか他インスタンスから取得ができない。
そして、同一セッションIDの他メッセージも取得されないため、同一セッション内のメッセージはマルチに実行されません。
並行処理がされないため、処理に時間がかかります。
検証したところ、メッセージ取得の順番は積まれた順になっていたため、30分前と1時間前に積まれたメッセージが逆の順番で処理されるということはなさそうです。
Sigfox・重量計を使って、アルコール消毒液がなくなったことを通知する製品（前半）

## 背景
とあるショッピングモールで働いている友人から
「毎回アルコール消毒液の残量確認するの面倒くさいんだよな〜・・・」
と相談を受けた。

そこで思いついたのが電池式の重量計をアルコール消毒の下に設置して、
重量がある一定の値以下になればメールを送信すればよくね？！

と思ったので早速製品化してみた！


## デザイン
![001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/b1426d46-57bd-8031-617d-72d05d581499.png)
↑このアクリルの上に物を置くと重量を計測することができる。

## 機能
電源SWをONにした時にゼロ点を調整する。

その後にアラームの重量としたい状態を作り、
製品背面にあるスイッチを押す。

すると製品がスイッチを押した際の重量を
アラーム値と記憶するのでその値以下になれば
指定のアドレスにメールを送るようになる。

例の使用方法は以下だ。

1、電源SWをONにする。

2、アルコールケースを製品の上に設置して、消毒液を少々入れる。

3、製品背面にあるスイッチを押す。

4、指定時間内に消毒液を満杯に入れる。
　　（そうしないと数分後にアラームが発生するためメールを送ってしまう）

準備はこれだけでOK！！
電池式なので、電源ケーブルを這わせる心配もない！！

あとは「2」の状態（消毒液が少々入っている状態）になればメールが来る。

これによって毎回消毒液を入れて回っている人は、必要な時だけ入れに行けばいい。

またこの方式を使えば消毒液じゃなくても他の補充にも使える。

まだ試作機の段階だが詳細を知りたい方やテスターになってくれる方は
お気軽にご連絡下さい。
Terraform Get Started - AWS チュートリアルのHands-on 詰まった場所

# 目的

TerraformのチュートリアルをHands-onしたときに、詰まった個所があったのでメモ的に。トラブルシューティングの内容と同じです。

https://learn.hashicorp.com/tutorials/terraform/aws-build


# 必要環境

- AWSアカウント
- AWS Credentials
- Terraform CLI

# 詰まった場所

### `terraform apply`実行時にAMIが見つからない

[Write configuration](https://learn.hashicorp.com/tutorials/terraform/aws-build#write-configuration)のmain.tfファイルのproviderでregionをap-northeast-1に設定
`terraform apply`実行時にAMIが見つからない

**原因**

us-west-2にあるAMIを設定していたため

**解決**

[EC2 AMI Locator](https://cloud-images.ubuntu.com/locator/ec2/)からap-northeast-1のAMIを設定する

### VPCが設定されていなく`terraform apply`が失敗する

[Create infrastructre](https://learn.hashicorp.com/tutorials/terraform/aws-build#write-configuration)で`terraform apply`を実行したとき、失敗する

**原因**

aws_instace.app_serverにサブネットの設定していないため

**解決**

VPCとサブネットを作成して、resourceのsubnet_idに設定する


### `terraform output`実行後にinstance_public_idが表示されない

[Inspect output values](https://learn.hashicorp.com/tutorials/terraform/aws-outputs?in=terraform/aws-get-started#inspect-output-values)で`terraform output`を実行してもinstance_public_idが空文字で表示される。

**原因**

EC2インスタンスにアタッチしていたサブネットのパブリックIPv4アドレスの自動割り当てを有効化していなかったため

**解決**

AWS Consoleからアタッチしているサブネットの設定を編集画面を開き、パブリックIPv4アドレスの自動割り当ての有効化をチェックして更新する
【Mac】MacOSでSourcetreeにssh認証で接続する方法

- gitや認証の知識がないため、死ぬほどハマったので、自分の備忘録も兼ねて投稿。
- 投稿者はセキュリティとか詳しくないので、やばいやり方をしているなら指摘して欲しい。
- そのうち画像を追加してわかりやすくしたいと思います。

## 前提
- Sourcetreeはインストール済み
- Sourcetreeのシステム言語は英語
- githubにアカウントを作成済み

## 大雑把にまとめると
（1）githubでtokenを発行
（2）Sourcetreeでアカウントを追加＆鍵の生成
（3）生成した公開鍵をgithubに追加
（4）ローカルのconfigファイルを編集

### （1）githubでtokenを発行
下記の記事を参考に、STEP.9まで進めトークン発行し、コピーしておく。

https://ios-docs.dev/20210813support-for-password/

### （2）Sourcetreeでアカウントを追加＆鍵の生成
（2-1）Sourcetreeの設定からアカウントの画面にいくと、アカウントを追加がある。
（2-2）それをクリックすると下記のような画面が出る。しばらく画像の設定、解説通りに作業を進める。
![スクリーンショット 2022-05-01 23.01.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/9b0bec7e-39fb-d936-74b2-7e1e5a0f1c7b.png)
![スクリーンショット 2022-05-01 23.02.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/722e5f7d-7ebe-aa15-8d29-eedd2d91b0b4.png)
![スクリーンショット 2022-05-01 23.02.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/e281aaf0-adf2-3a9d-e1e3-7bc7bb5965fa.png)
(2-3）keyを生成できたら、こんな感じの画面になるので、公開鍵の中身を下記の画像のボタンでコピーする。
![スクリーンショット 2022-05-01 23.03.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/758214ba-f129-8ae2-3173-9a0e88b6ca8a.png)
（2-4）「Save」をクリックして情報を保存する。

### （3）生成した公開鍵をgithubに追加
（3-1）次に先ほどコピーした公開鍵をgithubに登録する作業をする。
（3-2）githubへ移動。
（3-3）右上の自分のアイコンから、「Settings」をクリック。
（3-4）左のメニューから「SSH and GPG　keys」をクリック。
（3-5）「SSH keys」の「New SSH key」をクリック。
（3-6）「Title」と「Key」という項目があるので、「Key」に先ほどコピーしておいた情報を貼り付ける。（「Title」は何でもいい）
（3-7）「Add SSH　key」をクリック
（3-8）githubの設定終わり。

### （4）ローカルのconfigファイルを編集
（4-1）ローカルのconfigファイルを編集する。
（4-2）通常のmacだとおそらくユーザー名の下に、「.ssh」という隠れフォルダがあり、その中にconfigファイルがあるはず。
※隠れファイルとは、「.」から始まるシステム様が使用しているファイルのはず。
（4-3）macで隠れファイルを表示するには、「shift + cmd + .」の3つのキーの同時押しで表示される。
（4-4）「.ssh」のconfigファイルを見つけたら、configファイルを開く。（テキストエディットとかがいいのかな？）
（4-5）configファイルの中に、次の呪文を入力して保存しておく。
```bash:
Host github.com
  HostName github.com
  IdentityFile ~/.ssh/#さっきSourcetreeで作った鍵のファイル名を入れる
  User git
```

おそらくこれで、Sourcetreeとgithubを繋げられるはず。

## 参考資料
https://qiita.com/shizuma/items/2b2f873a0034839e47ce

## 個人ブログ

https://takuma-tech.com/2023/01/03/320/
Railsのバージョンを変える方法

# 現状
```terminal:ターミナル
gem install rails
```
このコードを実行すると、デフォルトで最新版のRailsがダウンロードされますが、、、
```terminal:ターミナル
gem install -v 6.1.5 rails
```
このように、**バージョン指定して実行**しても、なぜか最新版のRails（7.0以上）がダウンロードされることがしばしば起こっています。。。(多くは、初心者のバージョン指定忘れですが、稀に起こっています🤔)
今回は、その解決策を書いておきます！！🙌

# 解決策
## 手順
1. railsをアンインストールする
1. railtiesをアンインストールする
1. 再度railsのバージョンを指定してインストールする

## 実際の手順
### 1. railsのアンインストール
以下のコマンドを実行し、アンインストールします。
```terminal:ターミナル
gem uninstall rails
```
### 2. railtiesのアンインストール
次に、以下のコマンドを実行します。
```terminal:ターミナル
gem uninstall railties
```
これで、railsのアンインストールが完了しました。

### 3. railsの再インストール
```zsh:ターミナル
# 今回はバージョン6.1.5を指定しています。
gem install -v 6.1.5 rails

# 一般的な表現
gem install -v バージョン名 rails 
```

これで、railsの再インストールが完了しました🎉

試しに、railsのバージョンを確認してみましょう。
```zsh:ターミナル
# バージョンを確認するコマンド
rails -v

# 実行結果
Rails 6.1.5
```
これで、Railsのバージョンを切り替えられました！！🌸
🎉🎉🎉おめでとうございます🎉🎉🎉

# 補足
## railtiesについて
　Ruby on Railsのコアライブラリのひとつで、Rails のブートプロセスから railsコマンドによるアプリケーションひな形作成、.rakeファイルまで Railsに必要な周辺ライブラリ関係が詰め込まれているGemです。
　コアライブラリ（＝Railsの中で一番大事な部分）を消せば、Railsの情報は消えたも同然なので、今回はその仕組みを利用した訳です。
[参考](https://ruffnote.com/initial_commit/745/7965)

## 実は、消さなくてもいいんです。
Railsを消す必要はありません笑
何種類かのバージョンのRailsをインストールしておけば
アプリを作る際のバージョンを指定するだけで問題は起きないので、ご注意ください。
（Macの場合、Rubyはバージョン管理できるrbenvを使っているので、
Rubyも常時バージョン切り替え可能）
Railsアプリのバージョン指定の方法
```zsh:ターミナル
# Rails6.1.5を指定する場合
rails _6.1.5_ new sample-app

# 一般的な表現
rails _バージョン_ new アプリ名
```
ファイルのアイコンを変更する道のり

# 最初に
環境：ubuntu 20.04
やりたいこと：jsxにわかりやすいアイコンを付けたい（jsxにかかわらずアイコンが設定されてない拡張子にアイコンを付けたい）
参考サイト：https://blog.robertelder.org/custom-mime-type-ubuntu/

注意：MIMEをいじります。どこかに副作用がでても自己責任でお願いします(__)。

# ファイルのアイコンが汎用的なやつになるのが嫌だった

![Screenshot from 2022-05-01 19-06-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1161923/ceaced4d-7b6d-6d00-ef3e-e0294b3be51a.png)


jsxファイルはubuntuの標準アイコンには搭載されていないため、JSファイルと違って汎用的なアイコンで表示される。ただこれでは正直見にくい。。

ちなみにVScodeで開くときにはわかりやすいアイコンがついている。こんな感じでわかりやすいアイコンを付けたい

![Screenshot from 2022-05-01 22-21-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1161923/f47cf85a-98d1-9a40-528f-aa4aac8abcfb.png)

※ちなみにreactのロゴは「react　ロゴ　svg」と検索すれば出てくる。アイコンで使うにはsvgである必要があるので注意。

## 初手：一ファイルづつアイコンを変える方法
ファイルを右クリック　→　プロパティ　を選択すると、下のような画面が表示される。そこでアイコンをクリックすると、好きな画像を選択することができる。


![Screenshot from 2022-05-01 22-27-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1161923/98ccfb40-efda-57e1-13ab-198456f61c86.png)

画像のセット後

![Screenshot from 2022-05-01 19-05-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1161923/cb9bb7e7-387a-8cae-5980-8474f3ea78a0.png)

おお！ちゃんと変わっている！。

でも、これを全部のファイルにやるのはありえないよね...

どこかに、拡張子に応じてアイコンを割り振っている設定ファイルがあるはずだ。次はそれを探す旅に出た


## ２の策：設定ファイルに追記する
### 設定ファイルを見つけた
サイトを点々と巡ったところ、ファイルタイプの設定が書かれているものは
/usr/share/mime/packages
にあることがわかった

某サイトを参考にcustom-mine-javascriptXML.xml
というファイルを作成した

```shell
sudo vim custom-mine-javascriptXML.xml
```

↓custom-mine-javascriptXML.xmlの中身
```xml
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns='http://www.freedesktop.org/standards/shared-mime-info'>
        <mime-type type="application/javascriptXML">
    <comment>jsx File</comment>
    <glob pattern="*.jsx"/>
  </mime-type>
</mime-info>
```

次にこの編集を読み込んでもらうために次のコマンドを叩く
```shell
sudo update-mime-database /usr/share/mime
```

これで新しいファイル形式を登録することに成功する。
ただ、アイコンをセットするにはもう一つ設定しなければならない

### ファイルアイコンを管理している場所（全てではない）

次にお邪魔するのは
/usr/share/icons/hicolor/scalable/mimetypes
だ。

ここに、アイコンで使うsvgファイルがいくつか保管されている。全てではないので他にもっと適切な設置場所があるのかもしれないが、一応上手く言ったのでそのまま書く。

sudo cp ~/React-icon.svg application-javascriptXML.svg

注意するべきは、画像の名前を、先のxmlで書いた「type="application/javascriptXML"」と似せて、
「application-javascriptXML.svg」というファイル名にしていることだ。

とりあえずxml側の「/」は、画像名では「-」に変換する必要がある。
それ以外は同じ名前を与えて、末尾に「.svg」を付けた画像名にすれば、システムが両者の関連付けを把握するようだ。

更新するために以下のコマンドを叩く
```shell
sudo update-icon-caches /usr/share/icons/*
```

次にjsxのあるフォルダを見に行くと...

![Screenshot from 2022-05-01 22-12-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1161923/3ec2f391-3950-6792-170c-2bf19ba6d13d.png)


来ました。すべてのjsxにreactのロゴが写りました！

## 最後に注意

これ、プロパティを見ると、ファイルタイプがxmlで適当に名付けた　application/javascriptXML　になってるんですよね。

ファイルタイプって結構大事らしいので、どこかで副作用が起きないか心配ではあります。詳しい方がいたら警告していただきたいです。

![Screenshot from 2022-05-01 22-57-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1161923/148e9e18-6a0b-e009-5234-e25fdc116a9b.png)

また、これに伴い最初にファイルを開こうとすると、
「これを開けるアプリケーションがないです」と返される。右クリックでVScodeなどを選択すれば普通に開けるが。。。


問題が起これば追記していきます。
AngularでNG8001: Unknown HTML element or componentが出たら

# どんなエラーか
テンプレート上で他のコンポーネントを呼び出してもエラーが表示され、うまくサーブされない状態です。

# まず試してみてほしいこと

>These are the 5 steps I perform when I get such an error.
>
>* Are you sure the name is correct? (Also check the selector defined in the component)
>* Declare the component in a module?
>* If it is in another module, export the component?
>* If it is in another module, import that module?
>* Restart the cli?

## 1.HTMLから呼び出されている名前は正しいか？
コンポーネントファイルに定義されているセレクタ名を確認してみてください。
## 2.モジュール内でコンポーネントを定義していますか？
`app.module`などでそのコンポーネントが定義されているかどうかを確認してみてください
## 3.他のモジュールにある場合、そのコンポーネントをエクスポートしているか？
`app.module`と違うモジュールにある際は、しっかりそのコンポーネントがエクスポートされているかを確認してみましょう
## 4.別モジュールにある場合は、そのモジュールをインポートしていますか？
別のモジュールにある際は、そのモジュールをエクスポートしてみましょう。
## 5.それでもダメな時は、CLIを再起動しましょう
これは、たまにあります。`CLIを再起動`してみたり、`すべてのファイルが保存された状態になっているかを確認`してみましょう


# 自分はそれでもダメでした。
自分はそれでもだめでした。原因は、親コンポーネントのモジュールと子コンポーネントのモジュールがリファクタリングによって違うモジュールになってました。(あえて言うと、2や3の状態）

# わかっていても
基本的なことですが、わかっていても、意外と単純なことで、詰んでしまうこともあります。
(僕はこれで、30分くらい時間を無駄にしてしまいました。)
このエラーに遭遇したら、この記事を見て頂ければと思います。

# 参考
https://stackoverflow.com/questions/44429996/angular-2-component-is-not-a-known-element
laravelマイグレーションできない解決方法

マイグレーションする際、だいたい調べたらすぐ直るが今回なかなか治らんかったのメモに残しておきます。

■エラー内容
Class 'Barryvdh\Debugbar\ServiceProvider' not found

# 1,composerのオートロードし、キャッシュ削除

```
composer dump-autoload

php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
composer dump-autoload

php artisan migrate:refresh --seed

[参考]
https://qiita.com/kuma15/items/1687696bdd6be094c780
```
# 2,bootstrap/cache以下削除し、composer dump-autoload
```
composer dump-autoload

php artisan migrate:refresh --seed

[参考]
https://qiita.com/engineerYodaka/items/09319ab686b6aca1b2eb
```

# 3,docker再起動し、上記を実行


# 4,composer アップデートし、composer dump-autoloadすると治った
```
composer update --no-scripts

composer dump-autoload

php artisan migrate:refresh --seed

[参考]
https://qiita.com/hshimo/items/c5a666a8d370ea6782e3
```
スコープ関数の読み方について

# はじめに
スコープ関数を使うときは以下の記事を参考にさせてもらっていますが、
[Kotlin スコープ関数 用途まとめ](https://qiita.com/ngsw_taro/items/d29e3080d9fc8a38691e)

逆に読む時になると、「どう読んだらいいんだ？」と
悩んでしまうことがあるので簡単にまとめておきます


***
それぞれオブジェクトのことをレシーバーと呼びます

# let
```
結果 = レシーバー.let {}
```
となった時に{}内の処理の結果を返す


# run 
```
結果 = レシーバー.run {}
```
{}内の処理を行い、最後の処理を返す
```
結果 = レシーバー?.run {}
```
レシーバーがnullじゃなければ{}内の処理を行う
```
結果 = レシーバー?:run {}
```
レシーバーがnullなら{}内の処理を行う


# apply
```
結果 = レシーバー.apply {}
```
となった時にレシーバーに対して{}内の処理を行い、その後レシーバーを返す


# also
```
結果 = レシーバー.also {}
```
となった時に{}内の処理の後、レシーバー自身を返す
レシーバーに{}内の処理をまとめて行うことができる

***
それぞれ
```
結果 = レシーバー?.スコープ関数 {}
```

とすることで、レシーバーがnullでないことを確認できる

# 最後に
スコープ関数の使い所や、読み方など　十分に理解が及んでいないと混乱することになるので、
この記事を見て落ち着いてコードを読めるようにと思って書きましたが、
記事にすることで自分の中の理解も深まったと思うのでよかったと思うと共に
kotlin初心者の方などの参考にしていただければ嬉しいです
はじめてのデザインパターン~Adapterパターン~

# 参考
https://shimooka.hateblo.jp/entry/20141212/1418364494

参考になります。ありがとうございます。

# どんなもの？

異なるクラス同士のメソッドの違いを吸収して、うまく適合させるパターン

# メリットは？

使用側（クライアント側）からどんなメソッドを読んでいるか意識しなくていいので、バージョンアップや突然の仕様変更時に改修のコストが減る

# どんな時に使う？

既に使用実績があり、十分テストがされたクラスを再利用したい時

但し、この時にこのクラス自体に対して少しでも手を加えてしまうと、せっかくの使用実績が損なわれ、全動作テストをしなければいけなくなるのでこれは避けたい

そんな時に使う。

# 使い方

## イメージ

- 使いたいメソッドを持つクラスAを新しく作るクラスB（Adapter, インターフェース）でラップする
- 新しく作ったクラスBでクラスAをextendsし、そこから`parent::~`で親のメソッドを呼び出す
    - これによりメソッド名の差分をクラスBで吸収
- 呼び出し側はクラスBのメソッドを呼び出すだけなので、中でどんなメソッドを読んだイルカは何も意識しない

※上記は継承を使ったパターンだが、委譲を使ったパターンもある

## Github

記事内のサンプルコードそのまんまですが、Githubに掲載。

[https://github.com/Kuma-inataku/design_pattern/tree/develop/adapter](https://github.com/Kuma-inataku/design_pattern/tree/develop/adapter)

※サンプルコードそのままとはいえ、記事のままでは実際にテキストエディタに書いてみて値変更したりできないのでその点は実際に書いてみるのが大事かと。

# 所見

- 個人的にはextendsでクラス単位での依存関係をなるべく作りたくないと思うので、委譲がシンプルでいいと思った
タッチタイピングを身につけるためにキーボードを見てはいけない話

## 言いたいこと
- 覚えてなくても、キーボードを見せるな
- ミスしても、キーボードを見せるな
- 早くタイプしたくても、キーボードを見せるな
以上

## この文章の目的
私は何人かの子供の親です。24歳位の時にタッチタイピングを身に着けました。子供が小学校で習ってくるタイピングの方法がいまいちだったので、タッチタイピングに関して、いくつか注意書きをしました。

メッセージは、「キーボードを見るとタッチタイピングは身につかない」ということ1点です。

基本的には新しい内容は無いです。ですが、教育の現場で子供たちに伝わっていない内容を”なぜ大事なのか”という点を大事に書こうと思います。

## タッチタイピングの目的
タッチタイピングができないと次のような問題があります。
- キーボードを見て文字を探す
- 頭の中の文章が飛ぶ
- 視点の移動によって目が疲れる

まとめると、タッチタイピングを身につけると次のメリットがあります。

- ストレスなくタイピングできるようになる

この一点に尽きます。目的は早くタイプできることでは無いのかと思う方は後述の「補足: どうして早打ちをしてはいけないのか？」を参照ください。

## タッチタイピングを身につけるのに大事なこと
どのタッチタイピングの教則でも、何度も繰り返しでてくる言葉が”キーボードを見ない”ことです。なぜなら、必要な作業ができなくなるからです。具体的に、どのような作業をするかを説明具体的に説明します。

1. ホームポジション(FとJのキー、突起がついています)に人差し指を置く
2. 他の指をホームポジションからならべて置く
3. 指をホームポジションから上下にずらし押したいキーを押す
4. 文字を打つ都度、ホームポジションに指を戻す

これらの作業において、常に指はキーボードの上にあります。キーボードを見ると、指はホームポジションから離れてしまいます。そのため、キーボードを見ながらタイプした場合その位置をホームポジションからの位置で覚えることができません。　

練習の初期段階では、お子様の横についてキーボードを見ないように注意してあげてください。押し間違えた場合は、画面上に写したキーボードでどの指かを確認しながら押すように指導してください。

もちろん、ホームポジションを使わない独自の方法で問題なくタッチタイプする人もいます。問題ありませんが、おすすめはしません。(参照: 「補足: ホームポジションを使わないタッチタイピング」)

## タッチタイピングの練習に関して
フリーでよいサービスがたくさんあります。どのようなサービスがおすすめかについて列挙します。

- 画面にキーボードが表示されている
- 最初、fキーとjキーの練習、次はdキーとkキーのように少しずつキーが増えていく
- せかす要素が少なく、正確に打つことを要求する
- ただし子供が飽きないように、ポップで楽しいもの
- ストーリー仕立てのアニメや長い説明も避けるべき

特に上の3つは必須だと思っています。キーボードを見ないで済むためには必須の要件です。
(個人的な好みは[TypingClub](https://www.typingclub.com/)です。日本語対応してませんが、うちの子供は何語であれ話は聞かないので関係が無いですw。合わなければ似た感じでさがしてみてください。)

## 最後に
まあ、タッチタイピングできなくてもそれほど問題になるわけでは無いので、どうしても見てしまうお子様がいたらタイピングを嫌いになる前にタッチタイピングを諦めても良いのでは無いかと思います。

キーボードを見ながらだと、なかなか身につかないってことだけご理解いただけたら幸いです。

## 補足: どうして早打ちをしてはいけないのか？
ダダダッと入力するのに憧れる気持ちはわかります。けれど、タッチタイピングをある程度できるようになるまで待ちましょう。(タイピングゲームをしてはならないというわけでは無いですが、キーボードを見てしまうため練習にはならないと考えてよいと思います。)

タイピングで早く打つことを意識すると、違うキーをでもお構いなしに打つ癖がついてしまいます。そうすると、間違ったキーを押すことが強化されてしまい。間違いやすいキーはいつまでも一回でうてないことになります。

正確にタイピングができるようになることと、入力速度を求めることは別の段階としてやることがかえって近道です。

そもそも、手書きで文字を書く場合には速度は求めていないと思います。タッチタイピングができれば、手書きの数倍早いので、それ以上の早さは不要です。

## 補足: ホームポジションを使わないタッチタイピング
目的がストレスなくタイピングすることなので、タッチタイプできれば何でも問題ないです。いわゆる二本指タイピングでストレスがない人も多くいます。

ただ、新しくタイピング覚えようとする場合は、ホームポジションを使うことをおすすめします。理由は習得がすごく早いからです。

ホームポジションを使うと、使用頻度が高いキーを打ちやすい位置で覚えることができます。そのため効率的にタイピングを身につけることができます。
Make(元Integromat)×Google Driveで「皆、締め切りまでにファイルを共有にアップして！」の確認ストレスをゼロに

# ”提出を急かす”ってけっこうストレス。でも[Make（旧Integromat）](https://www.make.com/en)が自動でやってくれる！
iPaas「[Make](https://www.make.com/en)」を使って、今日は日々の「地味なストレスと小さな面倒を無くす自動化」にトライ！
## Google Driveの共有フォルダに「誰がいつファイルをアップor修正したか」自動でLINEに知らせてくれる
仕事でも大学院でもチームで動くことがほとんどなので、一つのフォルダをチームで共有して動かすことが多い。こういう時、別途LINE等で「今ファイルあげましたー」など連絡をしあう、というのが常だった。
コレ、「誰がいつファイルをアップor修正したか」を自動でLINEに知らせてくれたら関わる皆が楽！しかも今回は私にだけ送られてくるようにしたけど、グループチャットに送ることもできる！！

### モジュールでカンタン紐付け
左がGoogle Drive、右がLINE Notify。
![スクリーンショット 2022-05-01 200433.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2573810/be113a86-465d-e59c-b01f-3b72d1b3dd22.png)
Google Driveからフォルダを指定
![スクリーンショット 2022-05-01 200456.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2573810/1473b1cc-2998-1aa3-2d3d-8b90112dc587.png)
LINE Notifyと紐付け。誰がいつファイルを修正orアップしたか教えてくれるように。
![スクリーンショット 2022-05-01 200520.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2573810/3a27504f-1c2f-c1ca-7ea5-edb8c6e75fc8.png)
## コレあったらどう？～「特に心理面においてとても助かる」というフィードバック
共有フォルダを取りまとめる立場の二人にフィードバックもらったら、両者共に「作業がラクチンなのはもちろんだけど、**特に心理面においてホントに助かる。こういうのは地味に積み重なるストレスで、かつ見えにくいストレスだから**」という感想が印象的だった。
### 一人目：大手メーカーの管理職で200人の部下をまとめる美女
プロフ：バツイチ。「なぜあの時結婚したのか未だに謎。多分気がふれてたんだと思う」という名言を残す。

・**普段は全員提出したか前の日に必ずフォルダにチェックしに行っている。そして「明日までだよ！」と未提出の人にリマインドをかけている。**
さらに当日もまたフォルダに確認しにいって、場合によっては再リマインドもしないといけない。でもこれは「やらざるといけないからやってるだけ」なので、この**手間が省けるのは本当にいい！**
・**遅れる奴は決まっているので、毎回言うのが地味にストレス。**
グループLINEやその他SNSグループにいつ誰が資料作成終わったかが送られると、**同時に未提出者へのリマインドにもなってとてもいい。欲しい！**
・**経理部門にも紹介したい。**
彼等が一番こういう「大勢に期日までにファイルを提出させる」の管理に苦労している。

### 二人目：とあるお役所に勤める、とある部門のトップの義理の兄
プロフ：娘と息子を心から愛する良きパパ。彼（と姉）の子供たちは私にとっては姪っ子と甥っ子にあたるが、本当に舐めまわしたいくらいカワイイ。でも甥っ子ちゃんに将来すね毛とか生えてくると思うと今からホント憂鬱。お願い、つるすべお肌のままでいて。

・あれば本当に便利だなと思う。そういうことが**できるって知らないからやってないけど、できるならやりたい。**
・リマインドかけるのが面倒くさい人、または仕事はできるが性格的に部下にそういうことを言うことをストレスに感じる人もいるので、これらを**システムに肩代わりさせられる**のはとてもいい。
・自動運転のような感じがした。運転適正のない人でもテクノロジーが「安全運転が誰でもできる」状態を作ってくれる。**補完してくれる。**「取りまとめる」「他人をせかす」「強く言う」などができない人（性格的に向いていない人）を**すごく助けてくれる。**
## プレゼンしてみた感想
日常的に**共有フォルダを取りまとめる立場**にある二人にこの仕組みを伝えている最中、「待って、コレめちゃくちゃ便利なんじゃ・・・」と話しながら改めて気が付いた。
一般企業と役所という毛色の異なる仕事環境の二人だが、**どちらも「こういうことできるって知らないから、アナログでやるのが当たり前だと思ってた」「目立たないけど、こういうのは逃げられない類のストレス」と、同じ感想。**

こういう、「叫ぶほどストレスじゃないけど地味にホントいや」っていう表に出にくいストレスって他にもたくさんありそう。
でも私ですらすぐに作れたから、企業だろうが役所だろうが、やろうと思えばすぐにでもできる。こういう**内製ですぐにできることなのに知らないからやっていないことは山ほどあるだろうな**、と思った。
## プレゼンしてみて気が付いた改善点
今回の二人の勤め先が役所と大企業ということで、既存の社内共有システムがある。
仕組みはいいが、セキュリティが厳しい社内システムとiPaasをスムーズにカンタンにどう紐付けるか、そしてとはいえ社内情報をSNSに飛ばすことの是非が課題になりそうだなと思った。
過去ツイ（黒歴史）をPythonで消し去る

こんにちは、趣味Androidエンジニアのmomoritoです。
今回はPythonを利用して、自身の過去のツイート（黒歴史）を削除します。

# 事前に必要なもの
- Pythonの動作環境(筆者はPython3.8.1)
- Pythonを書くエディタのようなもの（筆者はVSCode）
- API_KEY,API_SECRET,TOKEN_KEY,TOKEN_SECRETの４つ
※本記事ではAPIキー類の取得方法は割愛します。「twitter api 取得」あたりでググると先人の記事がいっぱい出てきます。
- 自身の全Twitter履歴
※ツイートIDを手に入れるために必要です。「twitter 出力」あたりでググるとこれまた大量に記事が出てきます。
※ツイートIDを既に把握しているのであれば、全Twitter履歴は必要ありません。
※ツイートIDのみを抽出してCSV化[tweetList.csv]　しています。（後述）

https://developer.twitter.com/en

https://help.twitter.com/ja/managing-your-account/how-to-download-your-twitter-archive


# とりあえずコード
削除自体はapi.DestroyStatus(tweet)部で行っています。
削除に必要なツイートIDはCSVから読み込んでいます。
```removeTweet.py
#適宜pip installしてね!
import twitter 
import csv

# あんまりコードに大切なキーを直書きするのは宜しくないんですが、個人利用の範囲なので放っておきます。
CONSUMER_API_KEY ="あなたのAPI_KEY"
CONSUMER_API_SECRET ="あなたのAPI_SECRET"
ACCESS_TOKEN_KEY="あなたのTOKEN_EKY"
ACCESS_TOKEN_SECRET = "あなたのTOKEN_SECRET"


api = twitter.Api(
    consumer_key=CONSUMER_API_KEY,
    consumer_secret=CONSUMER_API_SECRET,
    access_token_key=ACCESS_TOKEN_KEY,
    access_token_secret=ACCESS_TOKEN_SECRET
)

# 以下のコードで削除。
with open('tweetList.csv',encoding='utf-8', mode='r') as f:
    reader = csv.reader(f)
    for tweet in reader:
        # エラー時の処理停止回避用の　try-except
        try:
            api.DestroyStatus(tweet[0])
            print("削除 " + tweet[0])    
        except:
            print("失敗 " + tweet[0])    

# 終了の宣言
print("done")
```

## （補足）DestroyStatus部分について
DestroyStatus()で任意のツイートIDを削除できます。
```removeTweet.py
api.DestroyStatus(任意のツイートID)
```

ちなみにブラウザ上で個別にツイートIDを調べる方法は下記のとおり。
![tweetid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505452/2f350536-230d-a7ee-0e3a-e249b181b87e.png)

今回はツイートIDをCSVにまとめて突っ込んでいます。（これを作成するときに、削除しないツイートを取り除くことも可能）
１列目にただツイートIDを列挙するのみのシンプルなCSVです。
![スクリーンショット 2022-05-01 19.12.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505452/1cebf6de-9cd0-c9b2-cf9a-aa5c2ca4c103.png)

全Twitter履歴を取得したときにjson形式で出力されるので、上手くparseできればそのまま使えるのですが、私は何故か上手く行かなかったので、力技で処理しました。
ただ、CSV作成の際にツイートIDの桁数が膨大で手間取ったり…jsonのままで扱えるのであればそれが一番だと思います。
CSVへの力技の詳細はいつかまとめるかも？

# 最後に
今回はいわゆる黒歴史諸々を消し去るため＋Pythonをイジるために書いてみました。
ただツイートを消すだけなら、黒歴史クリーナーなんかが有名ですし、ラクですね。

今回は概ね26,000ツイートを削除したため、プログラム自体も１時間半ぐらい動き続けて削除することができました。
これで炎上した際に過去をほじくり返されても安心ですね！
Lodashのおともにオススメなeslint-config-lodashの紹介

現代のJavaScriptにおいて、[Lodash](https://lodash.com/)が必要な場面はそう多くありません。

https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore

https://qiita.com/mizchi/items/af17f45d5653b76f6751

それでもLodashを使いたいのであれば、[eslint-config-lodash](https://www.npmjs.com/package/eslint-config-lodash)を導入してみてはいかがでしょうか。

## コンセプト

- [eslint-plugin-lodash](https://www.npmjs.com/package/eslint-plugin-lodash)の推奨設定がベースになっている
- LodashよりもネイティブAPIの使用を優先

上記のコンセプトにもとづいた設定になっているため、Lodashの使用箇所を最小限に留めつつ、使う場合はベストプラクティスが適用されます。

## 導入手順

### パッケージをインストール

eslint-config-lodashと、その依存パッケージをインストールします。

```sh
npm i -D \
  eslint \
  eslint-plugin-lodash \
  eslint-plugin-you-dont-need-lodash-underscore \
  eslint-config-lodash
```

### ESLintの設定を更新

ESLintの設定ファイルの`extends`に、`lodash`を追加します。

```js
module.exports = {
  extends: [
    'lodash'
  ]
}
```

### コードを修正

ESLintによってエラーが検出された場合、エラーメッセージをもとにコードを修正しましょう。
プロジェクトに合わないルールがあれば、以下のように個別に変更するのもアリです。

```js
module.exports = {
  extends: [
    'lodash'
  ],
  rules: {
    // プロパティのショートハンドを使用禁止にする
    'lodash/prop-shorthand': ['error', 'never'],
    // LodashのunionBy相当の処理をネイティブでやるには関数を自作する必要があるため無効化 cf. https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_unionBy
    'you-dont-need-lodash-underscore/unionBy': 'off',
    // Lodashのuniq相当の処理をネイティブでやるにはややトリッキーなコードを書く必要があるため無効化 cf. https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore#_uniq
    'you-dont-need-lodash-underscore/uniq': 'off',
  }
}
```

eslint-config-lodashで、よいLodashライフを！
40代おっさんJavaScriptのlet,const,varを学ぶ

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## let,const,varとは

変数を行うキーワード

let
・ES6から使用できるようになった

const
・ES6から使用できるようになった

var
・ES6以前に使用していた、今では非推奨

|タイプ|再宣言|再代入|スコープ|初期化|
|-----|------|------|------|------|
|let|×|〇|ブロック|×|
|const|×|×|ブロック|×|
|var|〇|〇|関数|undefined|

再宣言とは
一度宣言した変数をもう一度宣言が可能かどうか

再代入とは
一度宣言した値を変更可能かどうか

初期化とは
ホイスティング(Hoisting)のこと
コンテキスト内で宣言した変数や関数の定義をコード実行前にメモリに配置することです。 ホイスティングのことを「宣言の巻き上げ」といったりもします

＊varを使用すると再宣言、初期化によるバグを起こしやすくなるため、今は非推奨となっていますので使わないほうが良いみたいです

## 参考資料

<https://www.udemy.com/course/javascript-essence/>
File not found - /var/cuda-repo-9-0-local/Packages

Ubuntuでapt-get update実行時に、次のようなエラーが出ることがある。

<pre>
Reading package lists... Done
W: The repository 'file:/var/cuda-repo-8-0-local-ga2  Release' does not have a Release file.
N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use.
N: See apt-secure(8) manpage for repository creation and user configuration details.
W: The repository 'file:/var/cuda-repo-9-0-local  Release' does not have a Release file.
N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use.
N: See apt-secure(8) manpage for repository creation and user configuration details.
E: Failed to fetch file:/var/cuda-repo-8-0-local-ga2/Packages  File not found - /var/cuda-repo-8-0-local-ga2/Packages (2: No such file or directory)
E: Failed to fetch file:/var/cuda-repo-9-0-local/Packages  File not found - /var/cuda-repo-9-0-local/Packages (2: No such file or directory)
E: Some index files failed to download. They have been ignored, or old ones used instead.
</pre>

下記のコマンドを実行したら直った。

<pre>
# rm /etc/apt/sources.list.d/cuda*
</pre>
OneDriveだけでできた。Make（旧Integromat）でエクセルをPDFに変換する方法


定期的にエクセルをPDFに変換してみます。

[Make](https://www.make.com/en)で実現してみましたが、結果として全部OneDriveのモジュールでできました。

> うまく動いたシナリオ
> ![スクリーンショット 2022-05-01 22.34.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/2b10a6d5-3cf9-a66f-c350-6cb38213c7b1.png "スクリーンショット 2022-05-01 22.34.59.png")

## エクセル準備

OneDriveの適当なフォルダ（make_testフォルダとしました）にエクセルファイルを入れておきます。

> ![スクリーンショット 2022-05-01 22.39.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/56117828-b43b-03b1-1163-5ea2afc77ce2.png "スクリーンショット 2022-05-01 22.39.11.png")

準備は以上です。

## シナリオ解説

### 左: Serch Files/Foldersでエクセルを検索

make_testフォルダ内の`*.xlsx`を検索します。

> ![スクリーンショット 2022-05-01 22.38.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/678bfab2-e831-20ea-2744-3485a9609df1.png "スクリーンショット 2022-05-01 22.38.07.png")

### 中央: Download a FileモジュールでエクセルをPDF変換してダウンロード

ダウンロードするだけかと思いきやここで`Convert to PDF`の選択肢が！

> ![スクリーンショット 2022-05-01 22.41.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/0e6d260d-02e7-5285-2a16-c45b39301987.png "スクリーンショット 2022-05-01 22.41.05.png")

### 右: Upload a FileモジュールでOneDriveにアップロード

最後はアップロードして完了です。

> ![スクリーンショット 2022-05-01 22.43.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/1ad38206-4af4-d5e0-f950-f1385c981e0d.png "スクリーンショット 2022-05-01 22.43.20.png")

## 結果: エクセルに変換されてOneDriveに保存されます。

> ![スクリーンショット 2022-05-01 22.39.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/e8e4fa69-857d-3fa1-e38c-3bc7a2e0ea5a.png "スクリーンショット 2022-05-01 22.39.02.png")

特に加工してないのでエクセルシートに記載の内容がPDF出力されてました。

> ![スクリーンショット 2022-05-01 22.45.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/e37afaa7-139e-f672-2fb2-0ee4b892991a.png "スクリーンショット 2022-05-01 22.45.50.png")

## おまけ: PDFのスプリットがうまくいかない

PDF4meというAPIモジュールを使ってみましたが、PDFの情報取得などはすごくやりやすかったです。このあとスプリットして保存する部分でMake（Integromat）力が足りず一旦断念。

> ![スクリーンショット 2022-05-01 22.47.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/6c0be0e2-6bfa-8472-3b33-6e1db48e1cd9.png "スクリーンショット 2022-05-01 22.47.07.png")

> 分割後の保存で配列処理周りでうまくデータがこない雰囲気を感じた。
EPSON Photo+で「指定した画像ファイルが見つかりません。削除または移動された可能性があります。」というエラーが出た場合の対処法

## 事の起こり

先日CDレーベルを EPSON Photo+ で印刷したのですが、レーベルの保存データ(.etdxファイル)にはどうやら画像ファイルが格納されていないようなので、別のPCにデータを引っ越した際にデータを復活できるようにというメモです。画像データが見つからない場合、「指定した画像ファイルが見つかりません。削除または移動された可能性があります。」というエラーが出てしまうようなので、その対処法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78152/8bd4ea12-2032-c556-a51d-ebc334c5a715.png)

## 対処方法

.etdx ファイルを stirling というバイナリエディタで確認してみると、ヘッダーが `'PK' (0x50 0x4B)` となっていて、中身がzipファイルであることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78152/c451e152-8205-a87b-e129-a6e7659eddb9.png)

ということで、拡張子の .etdx を .zip に書き換えて解凍してみると、 page.json というファイルと _info.json というファイルが格納されていることが分かります。zip圧縮されたjsonデータとはなんとも現代的な仕様ですね！ 素晴らしいです。

```
 /
┗┳ page.json
　┗ Data_20220327164810_4e378919-0cd9-4780-9454-386ea2dbe643/
　　┗━ _info.json
```

ということで _info.json の中を見てみると、png ファイルへのパスが保存されているようですね。VSCodeを使っている方は、JSON用の拡張機能が導入されていれば、右クリックから「ドキュメントのフォーマット」でJSONをフォーマット出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78152/34316aba-47b5-d83d-5fe3-34bc43cfae39.png)

自分は JSON Tools というプラグインを使用しましたが、恐らくどの拡張機能でも大丈夫だと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78152/03db77e2-c0ec-5fe3-aa86-f20de4e6317a.png)

JSONをフォーマットするとこんな感じになります。（見やすいように VSCode で JSON をフォーマットしましたが、VSCode をインストールしていない方はメモ帳でも大丈夫だと思います。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78152/fc208240-9c0a-b0ab-6916-252aeb0b9e6b.png)

必要な png ファイルへのパスが列挙されているので、これらのファイルを見つけてパスを書き換えてしまいましょう。メモ帳を使用している方は普通に上書き保存すれば大丈夫だとは思いますが、拡張子が .txt ではなく .json で、文字コードが UTF-8 になるように注意してください。もちろん、_info.json に書かれているファイルパスの通りに画像ファイルを配置出来そうであれば、jsonの書き換えは必須ではありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78152/d202205a-fce2-2e83-0b74-76870bab3a45.png)

jsonを保存したら、再度zip圧縮して、拡張子を .etdx に戻します。EPSON Photo+ で正常に開けたら無事解決です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78152/4c7bed73-b5df-616e-e225-bd4b66fe0720.png)
Atcoderの問題「2 倍チェック」をrubyで解く



```rb
line = gets.chomp

if line =~ /\A[0-9]+\z/
  puts line.to_i * 2
else
  puts "error"
end
```

# 問題

https://atcoder.jp/contests/past201912-open/tasks/past201912_a


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/0722595f-f01a-c3a7-5242-2e9811515046.png)











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
アドブロック環境でシェアする、をちゃんと表示させる


## シェアする、はすべての方にきちんと表示されません

昔のインターネット環境であれば確実に表示されるものの、
今、インターネット用のアプリケーションが多く増えた環境においては、きちんと表示することができません。

愛用のAdlockでも表示されないことを確認しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149448/07cdaec7-45d9-1cf7-6b0c-11ea38a86b08.png)

## どのようにすれば、シェアボタンを正しく表示させることができますか？

### 公式が提示するシェアボタンを使用しない

シェアボタンはオリジナルで作成しましょう。

### シェアボタンの名称を変えましょう

シェアボタンの名称やそのclass、ID等そのファイル名にシェア先の名称を記載することが原因でした。

NGワードは、例えば以下の通りです

- Twitter
- Facebook
- Insta、Instagram
- Pocket
- LINE
- Share

他にもNGワードは見つかりそうです。

#### 名前の代替案は？

- Twitter なら t
- Facebook なら f
- インスタなら i
- LINEなら l
- Pocket なら p
- Share なら tfilp

等と、あまりよくわからない意味に変更します。

:::note info
tfilp は Twitter、Facebook、インスタ、LINE、Pocketの頭文字の1文字ずつを使用した意味不明なワードになります
:::

こうすることで、過剰にブロックされた環境でもシェアボタンを表示することができるようになります。
「CPUの創りかた」のTD4を少しアレンジして作ってみた(その後)

# 概要

　前回の記事[「CPUの創りかた」のTD4を少しアレンジして作ってみた](https://qiita.com/Coelacanthus/items/5d37d9fb5ce6ad5746b6)で解説したTD4altをユニバーサル基板に実装してみました。ちなみに一番の成果はブレッドボードを心置きなく解放出来たことです。

　手元に大きな基板がなかったので、レジスタ・プログラムカウンタ・ALU(加算器)などを実装した**メイン基板**と、UIやメモリを実装した**サブ基板**に分けて実装しました。

# 見た目

![表面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185799/d17b52b6-632e-077e-ef00-d6b48c60f442.png "表面")

![裏面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185799/541501e4-f76a-53cf-ad17-ced65cdbee2e.png "裏面")

![組み立て](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185799/fed6bfea-3a61-1325-5300-e6c6b46a1d89.png "組み立て")


# メイン基板

　メイン基板では、信号線を表面にワイヤラッピングで配線してみました。巻き付け用にピンを増設したため、配線を這わせるスペースが狭くスパゲッティになってしまいました。また、裏面で巻き付けピンとICのピンを繋げるブリッジはんだ付けで、大量にはんだを使用した上、熱の影響でか基板が反ってしまいました。

　右上の74HC283がALUとして、その左下の74HC283がプログラムカウンタ用です。

# サブ基板

　サブ基板では、信号線を裏面に0.29mmのポリウレタン銅線で配線してみました。はんだごてで被膜が剥けますし、細くて取り回しが容易で、雑に信号線を配線したい時に便利そうですね。

# 組み立て

　他の方の自作CPUが立体になっていてカッコ良かった(大事)のでメイン基板とサブ基板を二階建てにしました。

# さいごに

　記事を書くほどの内容ではないと思いましたが、配線にワイヤラッピングとポリウレタン銅線を導入してみたので書いちゃいました。何か参考になれば幸いです。
【Blazor Hosted】SQLiteからAPIでデータ取得時につまづいた【.NET 5】

# はじめに

以前、Blazor(Hosted)とSQL ServerをつかってTodoチュートリアルをやった

https://qiita.com/t13801206/items/61cfae2901dea19dac9b

**SQLite版**（かつ.NET5にダウングレード）した際に、**APIをつかってデータを取得するところでつまづいたので**、メモとして残す

# 何が起きたのか

以前と同様に`api/TodoItems`へ`GET`でアクセスして、アイテムを取得しようとしたら接続できず

直接そのURLにアクセスしたときのスクリーンショットは以下のとおり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/3c3b1951-95a1-f28d-61cc-7611373e0200.png)

# GitHubのISSUEを検索

エラーメッセージがタイトルのISSUEを発見

https://github.com/dotnet/efcore/issues/24493

[SQLitePCLRaw.bundle_e_sqlite3](https://www.nuget.org/packages/SQLitePCLRaw.bundle_e_sqlite3/)をインストールしたら直ったという投稿あり

# NuGetで`SQLitePCLRaw.bundle_e_sqlite3`をインストールする

インストール後のパッケージ一覧は以下のとおり

```Powershell
PM> dotnet list package
   [net5.0]: 
   最上位レベル パッケージ                                              要求済み     解決済み  
   > Microsoft.AspNetCore.Components.WebAssembly.Server      5.0.16   5.0.16
   > Microsoft.EntityFrameworkCore                           5.0.16   5.0.16
   > Microsoft.EntityFrameworkCore.Sqlite.Core               5.0.16   5.0.16
   > Microsoft.EntityFrameworkCore.SqlServer                 5.0.16   5.0.16
   > Microsoft.EntityFrameworkCore.Tools                     5.0.16   5.0.16
   > Microsoft.VisualStudio.Web.CodeGeneration.Design        5.0.2    5.0.2 
   > SQLitePCLRaw.bundle_e_sqlite3                           2.0.7    2.0.7 
```

1番下にパッケージが追加された

（コントローラーのスキャフォールディングをする際に`SqlServer`が勝手にインストールされた模様）

# 動作確認

うごいた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/6e15b8bb-6fbc-5952-bc1b-f94a7f2f3e12.png)

（右はDB Browser for SQLiteの画面）

# おまけ

せっかくなので、[.NET6＋SQLServer](https://qiita.com/t13801206/items/61cfae2901dea19dac9b)からSQLite版にした際の変更箇所をメモしておく

## `Startup.cs`と`appsettings.json`の変更点

DBコンテキストのサービス登録を、`UseSqlite`に変更する

ただし、.NET6から[トップレベルステートメント](https://ufcpp.net/blog/2021/11/top-level-csharp10/)とやらで記述の仕方が結構違うので注意する

```cs:Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<Context.TodoDbContext>(
        options => options.UseSqlite(Configuration.GetConnectionString("DefaultConnection")));
}
```

`appsettings.json`はSQLServerに比べてとても短い

```json:appsettings.json
 "ConnectionStrings": {
    "DefaultConnection": "Data Source=TodoDb.db"
  },
```

## EF Core データベースの扱い

EFCoreのコマンドを打つだけで、`.db`ファイルが生成される

```Powershell
PM> Add-Migration Init
PM> Update-Database
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/92c3336e-14b8-fdf3-805d-b370744e9fd9.png)
統計検定準1級の対策について

## はじめに
このたび統計検定準1級に受かることができましたので記事を書いています。
![IMG_8335.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666603/6185dfe2-279c-6d9e-aed3-1c6130075e1d.jpeg)
## この記事の目的
これから統計検定準1級を受験する方が試験対策を行いやすくすることを目的としています。


## 背景
その人の現状によって必要な対策/所要時間は変わると思います、それなので私のスペックを記載したいと思います。

【バックグラウンド】
 - 理系大学院卒
    - 化学専攻
    - 学生時代に統計について学んだ経験はない
 - 20代社会人
    - データサイエンティストして勤務
 
【統計に関する知識】
- 統計検定2級を取得済
    - 準1級取得の約1年前に取得
- 試験対策以前から機械学習に関して統計検定準1級程度の知識は取得済
    - 機械学習を用いた開発を約3年経験のため


## 統計検定準一級対策の難しさ
### 出題範囲が広い
準1級は２級と比較して出題範囲がかなり広いです、そのためすべての試験範囲を網羅的に対策しようとすると相当の時間が必要になると思います。



## 対策
### 1.頻出箇所を重点的に対策する
https://mimikousi.com/statistical-certificate-pre1/
このブログではPBT方式の統計検定準1級における各単元の出題頻度がまとめられています。
こちらより出題頻度の観点から各単元は3種類に分けられると思います。
 - 「重回帰」「時系列回帰」のようにほぼ毎試験に出題される「頻出単元」
 - 「主成分分析」「ベイズ法」のように隔年程度で出題される「そこそこ出題単元」
 - 「極限定理、漸近定理」「ノンパラメリック法」のようにほぼ出題されない「稀に出題単元」

この出題頻度はPBT方式のものですがCBT方式においても「稀に出題単元」はほぼ出題されないように感じました。一方で「そこそこ出題単元」に関してはPBT方式よりも出題される傾向にあると感じました。
ですので、
 - 「頻出単元」「そこそこ出題単元」について重点的に対策を行う。
 - 「稀に出題単元」については最低限の対策で行う。
 という方針をお勧めします。

### 2.過去問/ワークブックの理解を目標に対策する。
各単元の目指すべき理解度について述べます。結論はCBT方式であっても目指すべき理解度は「過去問/ワークブックの理解」で問題ないと感じました。「過去問/ワークブックの理解」とは「問題を見たら解法が浮かぶレベル」程度を指しています。
自分の場合は2周(一部3周)をしましたがこの回数はその人次第かと思います。

#### 【補足】
CBT方式では、PBT方式と出題傾向が異なるのではと思われている方もいるかもしれません。私が試験を受け、感じた点としては
 - 「離散型分布」「連続型分布と標本分布」のような「基礎的な単元」は過去問/ワークブックどおりでなく、一捻りされた出題が目立つ
 - 「マルコフ連鎖」「主成分分析」のような「応用的な単元」は過去問/ワークブックどおりの出題が目立つ

これは私の感覚なので定かではありませんが「応用的な単元」の方が出題パターンが限られるため、過去問/ワークブックと似た出題が目立ったのではと思いました。もし時間に余裕があるのならば「基礎的な単元」についてはより深い理解を目指しても良いかもしれません。


## 結論
 - 過去の出題傾向を参考に、各単元の対策時間に強弱をつける。
 - 各単元の目指すべき理解度は「過去問/ワークブックの理解」、余裕があれば基礎的な単元についてはより深い理解を目指した方が良いかもしれない。

## 参考
ワークブック/過去問以外に使用した書籍を紹介します。(試験対策以前に読んだ書籍を含みます)
参考書籍を探している人がいれば参考にしてください！
【参考になった】
 - 入門統計解析
 - 統計学入門 (基礎統計学1)
 - はじめてのパターン認識
 - データ解析のための統計モデリング入門――一般化線形モデル・階層ベイズモデル・MCMC (確率と情報の科学)

【いまいちだった】
 - 多変量解析法入門 (ライブラリ新数学大系)
 - 図解入門 よくわかる最新実験計画法の基本と仕組み[第2版]
リスト内包表記に入門する【Python】

# やりたいこと
リスト内包表記に入門する。


# リスト内包表記（list comprehension）とは

[公式ドキュメント](https://docs.python.org/ja/3.8/tutorial/datastructures.html#list-comprehensions)より抜粋
```
リスト内包表記はリストを生成する簡潔な手段を提供しています。
主な利用場面は、
あるシーケンスや iterable (イテレート可能オブジェクト) のそれぞれの要素に対してある操作を行った結果を要素にしたリストを作ったり、
ある条件を満たす要素だけからなる部分シーケンスを作成することです。
```

リストから別のリストを作成する際の便利な記法、といったもののようです。

## 基本の書き方

```
[式 for 任意の変数 in イテラブルオブジェクト]
```

※　イテラブルオブジェクト[^1]
[^1]: イテラブルオブジェクトとしては、リスト、タプル、辞書、文字列などがあります。forで繰り返し処理を行うことができます。


# リスト内包表記の使い方

## 例1: 要素に処理を加え、新リスト作成

たとえば、整数からなるリスト

```py
numbers = [1, 2, 3]
```
から、その要素に2をかけたリスト
```py
double_numbers = [2, 4, 6]
```
を新しく作りたい場合。

#### 従来の書き方（例）
```py
double_numbers = []
for number in numbers:
    double_numbers.append(number*2)
```

#### リスト内包表記
```py
double_numbers = [number*2 for number in numbers]
```

## 例2: 条件を満たす要素だけ取り出し、処理を加え、新リスト作成
if文を組み合わせて、条件を満たしたもののみを取り出すこともできます。

生徒の名前と性別が格納された辞書からなるリストに対し、
男子のみの名前を取得し、新たなリストを作成するケースを考えてみます。
```py
students = [
    {'name': '太郎', 'sex': 'male'},
    {'name': '花子', 'sex': 'female'},
    {'name': '次郎', 'sex': 'male'}
]
```
から、
```py
print(male_student_names) # ['太郎', '次郎']
```
となる新しいリスト「male_student_names」を作成します。

#### 従来の書き方（例）
```py
male_student_names = []
for student in students:
    if student['sex'] == 'male':
        male_student_names.append(student['name'])
```

#### リスト内包表記

```py
male_student_names = [student['name'] for student in students if student['sex'] == 'male']
```

## 例3: ネストしたリストの平滑化

リスト内包表記では、複数のforを使用することもできます。
このしくみを、リストの平滑化に使用します。

以下のようなリストしたネスト
```py
numbers = [[1, 2, 3], [4, 5, 6]]
```
を平滑化し
```py
flat = [1, 2, 3, 4, 5, 6]
```
するケースを考えます。

#### 従来の書き方（例）

```py
flat = []
for n in numbers:
    for m in n:
        flat.append(m)
```

#### リスト内包表記

```py
flat = [number for item in numbers for number in item]
```


# 参考URL
- [公式ドキュメント　リスト内包表記](https://docs.python.org/ja/3.8/tutorial/datastructures.html#list-comprehensions)
- [Pythonリスト内包表記の使い方](https://note.nkmk.me/python-list-comprehension/)
【備忘録・Rails】deviseを用いた管理者機能の実装

## 初めに
こんばんは、だいごです。
今回は、自身が作成中のオリジナルアプリに用いたdeviseの管理者機能についてまとめます。
よかったらご覧ください。

## 実装の手順
初めに、deviseを導入していきます。
この手順に関しては、省略しますが、気になる方はこちらの記事を参考にしてください。

[devise導入手順](https://qiita.com/pro_daigo/items/683cf5e0f34184609b7e)

ここからは、管理者機能を実装していきます。
まずは既存のusersテーブルにデータ型がboolaen型のadminカラムを追加するためにmigrationファイルを作成します。

```zsh:ターミナル
% rails g migration add_admin_to_users admin:boolean
```

※**boolean型**：真理値の「真 = true」と「偽 = false」という2値をとるデータ型

続いて作成したマイグレーションファイルを編集していきます。
以下のように記述します。

```rb:2022XXXXXXXXXX_add_admin_to_users.rb
class AddAdminToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :admin, :boolean, default: false
  end
end
```

この記述でのポイントは、`default: false`の部分です。
この記述があることで、ユーザーを追加する際、初期値としてadminカラムにはfalseを追加することができます。

マイグレーションファイルの変更後は、以下のコマンドで変更を反映させます。

```zsh:ターミナル
% rails db:migrate
```

続いて、管理者の登録を行います。
この登録に関しては、`seed.rb`ファイルを編集する方法とターミナル操作の方法がありますが、今回はターミナルで操作していきます。

事前に登録したユーザーを管理者に変更していきます。

```zsh:ターミナル
% rails c

[1] pry(main)> user = User.find(1)　　
[2] pry(main)> user.admin = true
[3] pry(main)> user.save
```

これで、管理者の登録が完了しました。
あとは、ビューにおいて管理者とそうでない場合で条件分岐をしてあげれば実装完了です。

今回は、こんな条件分岐を作成しました。

```erb:show.html.erb
<%# 省略　%>

<% if user_signed_in? %>
  <% if current_user == @user || current_user.admin? %>
    <div class='edit-btn'>
      <%= link_to 'Edit', edit_user_path(@user), class: "edit" %>
    </div>
  <% end %>
<% end %>
```

現在のユーザーがマイページのユーザーである時と管理者の場合のみEditボタンが出るようにしました。

## 終わりに
今回は初心者の自分でもできる方法で管理者機能を実装しました。
他にもコントローラーを分ける方法やGemもあるようなので、機会があればやってみようと思います。
ご指摘・コメントお待ちしております。
ありがとうございしました。