OmniAICreator/Qiita-1.07M huggingface dataset:
【勉強・仕事がはかどらない奴いる？】息を止めると頭がよくなる？一回息止めてみようか【簡単集中力アップ】

頭がよくなる方法や、集中できる方法、脳が活性化する方法などの眉唾な話が好きな人いません？
私です。笑
色々調べてみて、息止めをすると脳が活性化するという情報をもとにやってみたら、頭がスッキリするし、やる気が出てきた！？ので、皆さんも試してみてほしい。
しかも、脳の血流がよくなる、酸素量が増えるなどの情報がたくさんありました。

:::note info
この記事で伝えたいこと
・勉強ばかりで疲れた時の切り替え術、息止め
・効率よく勉強するためにまず脳を活性化しよう
・集中力をアップするために息を止めてみよう
・息を止めると血流がアップする？！
・息を止めてみた感想
:::


WEBやプログラミングを始めると勉強することが多くどうにかして効率的に学びたいという気持ちが出てきます。
それで色々調べてみると息を止めると、脳が活性化するという情報がありました。それを信じて息止めトレーニングアプリ作っちゃいました！
無料で利用できます。なかなか寝れないという人のために478呼吸練習機能付いてます！※トレーニングデータ保存のために、twitterログインが必要になります。

https://shisoku.quality-of-life1.com

WEBの勉強がなかなか進まない方や、集中できない、やる気が起きない方など是非試してみてください。

# 息を止めトレーニングをしてみた結果
私自身やってみた結果、頭がスッキリし集中力が増したような気がします。（頭がよくなったかどうかはまだわかりませんが。。）
他にもやる気が出たり、活力がみなぎる気がしました。無料だし簡単なので実際試してみて下さい。（無理は禁物です、血圧が高い方や持病がある方などは注意してください。）

ちなみに私は最高100秒息止めできました。1分40秒ですね。

# 効率よく勉強するために
WEBやプログラミングの勉強効率よくできてますか？集中できてますか？
なかなか勉強がはかどらなかったり、集中力が続かなかったりしませんか？私もなかなか集中力が続かなかったりします。

そこで、まず脳を活性化したらいいんじゃないか？と思っていろいろしらべてみたら、息止めが実はいいらしいという情報を見つけました。

## ウィンウェンガーの潜水
ウィンウェンガーという方はアメリカの教育学博士です。

- メンサ（入会条件を上位2%のIQを有する者に限定した国際的な団体）の会員。
- 知能を上げるために潜水やマスキング（養生という意味ではない）やイメージストリーミングを推奨している。
- 2009年8月に来日、「イメージストリーミング・ワークショップ」を開催した。
- 娘は三歳でメンサに入り、しばらくの間メンサのメンバーとして最年少の記録を持っていた。

という驚きの経歴の持ち主ですが、ウィンウェンガーの頭がよくなる方法に、潜水法というのがあります。
これは、プールなどで、でできるだけ長く潜水するというものです。

https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%BB%E3%82%A6%E3%82%A7%E3%83%B3%E3%82%AC%E3%83%BC

## ドクター中松の潜水
発明家ドクターのドクター中松さんも潜水法を実践している方です。

## 東大生の65％がスイミングを習っていた。
東大に入る人の半分以上がスイミングを習ってるとするとかなり信憑性が高いんじゃない？

# 息を止めると脳に何が起こる？
## 酸素をより多く取得できるようになる
息を止めることによって、体内に二酸化炭素が増えるので頸動脈が大きく開いて多くの血液を脳へ運ぶようです。また、ボーア効果（二酸化炭素濃度を濃くすることで酸素を隅々までいきわたらせること）が発動し、酸素の取得率を上げることができます。

脳は、酸素を多く消費するので必要な分の酸素を送るために、息を止めて二酸化炭素を取り込み、酸素をより送ろうということなのです。

## 血行が良くなる
また、息を止めると血行が良くなります。
これも息を止めることで酸素が減少していると錯覚し、多くの血液を脳へ運ぶため、血行が良くなるようです。

# 息止めアプリ作っちゃいました。
あなたは何秒息を止められますか？無料だし簡単なのでまず試してみてください。(トレーニングを記録するため、twitterログインが必要です。※お試しはログインなしでできます。)

https://shisoku.quality-of-life1.com/

また、一時期、すぐ寝れる呼吸法として話題になったリラックス呼吸の478呼吸もできます。

# まとめ

私自身は、息止めトレーニングをして、頭のスッキリ感や、集中力アップ、やる気アップができました。
無料だし簡単なので、是非試してみてください。
return、 break、nextの違い

「フォームから入力された値が不正だった場合にエラーメッセージを表示しよう」というメソッドの中で、「もし、このケースであればすぐに次の処理に移りたい」というときその行で「return」させてみたのですがそれだとメソッド自体から離脱してしまい次の行の処理ができなくなってしまったので別の方法を探してみました。

## return

その時のコードはこのような形

```ruby
def hoge
  error_messages = []
  CSV.parse(tsv_text, headers: true, col_sep: "\t") do |row|
    error_messages << "shop_id:#{row["shop_id"]}は存在しないIDです" if Shop.find_by(id: row["shop_id"]).blank?
    error_messages << "user_id:#{row["user_id"]}は存在しないIDです" if User.find_by(id: row["user_id"]).blank?
    error_messages << "comment_id:#{row["comment_id"]}は存在しないIDです" if Comment.find_by(id: row["comment_id"]).blank?
  end
  errors.add(:tsv_text, error_messages.join("<br/>").html_safe) if error_messages.present?
end
```

この時、「shop_idがなければその後の検証はしなくてもいい」という処理をしたかったので

```ruby
def hoge
  error_messages = []
  CSV.parse(self.tsv_text, headers: true, col_sep: "\t") do |row|
    return error_messages << "shop_id:#{row["shop_id"]}は存在しないIDです" if Shop.find_by(id: row["shop_id"]).blank?
           error_messages << "user_id:#{row["user_id"]}は存在しないIDです" if User.find_by(id: row["user_id"]).blank?
           error_messages << "comment_id:#{row["comment_id"]}は存在しないIDです" if Comment.find_by(id: row["comment_id"]).blank?
  end
  errors.add(:tsv_text, error_messages.join("<br/>").html_safe) if error_messages.present?
end
```

としていました。しかしこれだとreturnした時にメソッド自体を離脱してしまい次の行の処理に移れなくなってしまうので何か違う方法で処理をしなければなりませんでした。

## break

調べてみたところ途中で処理を止める方法はbreakとnextの二つあるようでした。結果的に後述するnextを使うことになるのですが、breakを使った場合どうなるのかも載せておきます。

```ruby
def hoge
  error_messages = []
  CSV.parse(tsv_text, headers: true, col_sep: "\t") do |row|
    break error_messages << "shop_id:#{row["shop_id"]}は存在しないIDです" if Shop.find_by(id: row["shop_id"]).blank?
           error_messages << "user_id:#{row["user_id"]}は存在しないIDです" if User.find_by(id: row["user_id"]).blank?
           error_messages << "comment_id:#{row["comment_id"]}は存在しないIDです" if Comment.find_by(id: row["comment_id"]).blank?
  end
  # breakした場合直後にこの行が実行される
  errors.add(:tsv_text, error_messages.join("<br/>").html_safe) if error_messages.present?
end
```

breakの場合メソット自体は抜け出さないが「その繰り返し処理を全て終了する」という挙動になるようで、もし最初の行でbreakしてしまった場合、それ以降の行に対する検証をしてくれなくなってしまいます。

## next

条件を満たす挙動をしてくれたのがこのnext。

```ruby
def hoge
  error_messages = []
  CSV.parse(tsv_text, headers: true, col_sep: "\t") do |row|
    next error_messages << "shop_id:#{row["shop_id"]}は存在しないIDです" if Shop.find_by(id: row["shop_id"]).blank?
         error_messages << "user_id:#{row["user_id"]}は存在しないIDです" if User.find_by(id: row["user_id"]).blank?
         error_messages << "comment_id:#{row["comment_id"]}は存在しないIDです" if Comment.find_by(id: row["comment_id"]).blank?
  end
  errors.add(:tsv_text, error_messages.join("<br/>").html_safe) if error_messages.present?
end
```

nextの場合「次の繰り返しを終了する」という挙動になり、複数行の検証をできるようになりました。
初期値鋭敏性(エノン写像)

非線形数理モデルであるHenon写像を紹介します。
以前に紹介したロジスティック写像と同じ低次元離散力学系です。
非線形の数理モデルであるエノン写像を対象として、初期値鋭敏性を確認します。

ロジスティック写像でも同様の記事をがあるのでぜひ！
関連記事1： [ロジスティック写像の紹介](https://qiita.com/reser_ml_memo/items/878927bf473bd025b16a)
関連記事2： [初期値鋭敏性について(ロジスティック写像)](https://qiita.com/reser_ml_memo/items/9ff1af90c3abaf038a11)

エノン写像は以下のような連立方程式, 漸化式で表されます。

$x_{n+1} = 1- ax_{n}^2 + y_{n}$
$y_{n+1} = bx_{n}$

$a,b$はエノン写像のパラメータになります。

本題の初期値鋭敏性の話に入っていきます。
初期値鋭敏性とは、カオスの定義あるいは特性の一つになります[1]。
初期値鋭敏性を実際に確認するために、$10^{-5}$や$10^{-10}$くらいの微小の誤差を与えます。
![初期値鋭敏性_x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2594605/b4b1d603-98b2-e421-0ec4-d95ee82f2028.png)
![初期値鋭敏性_y.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2594605/1382eec3-2f24-398e-471e-88802b7fde13.png)
$10^{-5}$や$10^{-10}$程度の誤差ではありますが、途中から大きく軌道が外れるのが確認できると思います。
別の見方で軌道が大きく外れるのを確認してみます。
x軸が時間, y軸が誤差を表しています。
![error_henon_初期値鋭敏性.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2594605/035dbec7-82a5-74b2-5488-945e14f79187.png)
$n=40$くらいまでは軌道はほとんど一緒に見えますが、$n=45$くらいから大きく軌道が外れることがわかります。
Microsoft のオフィシャル素材で技術資料をわかりやすくつくろう（DLリンク集）

本情報の内容（添付文書、リンク先などを含む）は、作成日時点でのものであり、予告なく変更される場合があります。

# はじめに
先日、仕事の関係で最新のオフィシャルドキュメントに利用可能な PowerPoint アイコンをいろいろなところで探し求めたので備忘録がてらまとめておきます。利用にあたっては、各ダウンロードサイトに可能なこと、不可能なことが書いてありますのでご利用の際にご一読ください。

# Azure アーキテクチャ アイコン
Azure のアイコンはアーキテクチャセンターからダウンロード可能です。
[Azure アーキテクチャ アイコン](https://docs.microsoft.com/ja-jp/azure/architecture/icons/)

アイコンセットとしてまとまっているものに含まれていないアイコンはこちらからダウンロードできます。
[Icons](https://azure.microsoft.com/ja-jp/patterns/styles/glyphs-icons/)

MVP の片倉さんがより使いやすくなるように、png変換かけるためのshellスクリプトを出してくださっています。詳細はリンク先をご覧ください。インターネットのつながるBash環境（WSLなどでもOK）で実行する感じです。
https://github.com/katakura/azure-icons

# Microsoft Power Platform アイコン
PowerBI をはじめとした Power Platform のアイコンはドキュメントからダウンロード可能です。
[Microsoft Power Platform アイコン](https://docs.microsoft.com/ja-JP/power-platform/guidance/icons)

# Microsoft 365 アーキテクチャのテンプレートとアイコン
アーキテクチャ図によく出てくる人やサーバー、虫眼鏡などのアイコン集です。
[Microsoft 365 アーキテクチャのテンプレートとアイコン](https://docs.microsoft.com/ja-jp/microsoft-365/solutions/architecture-icons-templates?view=o365-worldwide)

# Excel/Word などのアプリケーションのアイコン
Microsoft 365 の FastTrack のポータルからダウンロード可能です。（要登録、サインイン）ちなみに、こちらにも Power BI のアイコンあります。Office Lensとか懐かしい製品のアイコンもあるので見てるだけで時間が…
[FastTrack で不安なくクラウドに移行](https://fasttrack.microsoft.com/)
Resources -> Resource Type に Downloads チェック入れる -> Branding toolkit からダウンロード。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135357/017abced-ebe8-d802-3df8-beac44e45c5b.png)


# そのほか
Microsoft のロゴや Microsoft Azure のロゴに関しては外部でダウンロード可能なサイトはありません。利用に際しても厳しくガイドラインが決められていますので、ビジネス上の理由で必要という場合はマイクロソフトのマーケティング部門や広報部門にご相談いただくのをお勧めします。
IPアドレスのクラス

## IPアドレスのクラス
<b>IPv4では、32ビットの中をネットワーク部とホスト部に分け、「どのネットワークに存在する」「どのホストか」で管理している。<font color = blue>ホスト</font>は、ネットワーク上のサーバや端末などのこと。
### クラスA
<b>ネットワーク部8ビット、ホスト部24ビットで構成する。ネットワーク部の先頭ビットは「0」から始まる。10進数では「1~127」で始まる。一つのネットワーク内で識別できるホストの最大数は2²⁴ ➖ 2台になる。
2台分引くのは、ホスト部が「全て0」のアドレスは、そのホストが属している<font color = blue>ネットワークアドレス</font>、ホスト部が「全て1」のアドレスは、同じネットワークに属する全てのホストに同一の情報を送信するために使用する<font color = blue>ブロードキャストアドレス</font>として、使わなければいけないから。
### クラスB
<b>ネットワーク部16ビット、ホスト部16ビットで構成する。ネットワーク部の先頭ビットは「10」から始まる。10進数では「128~191」で始まる。一つのネットワーク内で識別できるホストの最大数は2¹⁶ ➖ 2台になる。2台引く理由は同じ。
### クラスC
<b>ネットワーク部24ビット、ホスト部8ビットで構成する。ネットワーク部の先頭ビットは「110」から始まる。10進数では「192~223」で始まる。一つのネットワーク内で識別できるホストの最大数は2⁸ ➖ 2台になる。2台引く理由は同じ。
#### クラスD
ネットワーク部の先頭ビットは「1110」から始まる。特殊な通信に使われる。
#### クラスE
ネットワーク部の先頭ビットは「1111」から始まる。特殊な通信に使われる。

![zu01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/43745b8b-46f6-1bde-9f4f-ee2ab10fb6f9.jpeg)

#### プライベートIPアドレスの範囲
クラスA - 10.0.0.0 ~ 10.255.255.255
クラスB - 172.16.0.0 ~ 172.31.255.255
クラスC - 192.168.0.0 ~ 192.168.255.255

## サブネッティング
<b>ホスト部の情報を分割し、複数のより小さいネットワーク(<font color = blue>サブネット</font>)を形成すること。<font color = blue>サブネッティング</font>と言われている。
ネットワーク部を拡張することで、「どのネットワークに属する」「どのサブネットワークの」「どのホストか」で管理する。
## サブネットマスク
<b>IPアドレスをネットワーク部とホスト部に区切るために使用するビット列。
ネットワーク部（サブネットを含む）には「1」を、ホスト部には「0」を指定する。
### CIDR
<b>最上位ビットから1ビット単位でネットワーク部とホスト部の境界を設定する。
## IPv6
<b>IPアドレスを128ビットに拡張した<font color = blue>IPv6</font>への移行が進んでいる。
一つの機器に両方のプロトコルスタックを持たせるデュアルスタックや、通信の仲立ちをするトランスレータ、IPv4パケットの中にIPv6アドレスを入れ込むカプセル化（<font color = blue>トンネリング</font>）などを使用することで相互に通信することができる。
### IPsec
<b>TCP/IPネットワークで暗号通信を行うための通信プロトコル。ネットワーク層で動作する。
IPパケットを暗号化する機能がある。Ipv6には標準で組み込まれている。
[対処法] Google日本語入力 プロパティが開かない Windows１１

## はじめに

今までMicrosoft IMEの翻訳機能を使っていましただ、Google日本語入力が便利ということでインストールし実際に使ってみました。

しかしいざ使ってみようとしたところ、**英数字しか使うことができず・プロパティや辞書といった設定が開けない**といった不具合がありました。

今回は私がPCで実際に改善した方法について紹介していきます。
（自己責任でお願いします）

こういった指南書の執筆慣れてないので多少の不手際はご了承下さい...

## Google日本語入力　ダウンロード（一応）
まあ必要ないでしょうが念のためリンクだけ貼っときます。
https://www.google.co.jp/ime/

## キーボードの設定、起動オプションの追加
ここからが本題ですね
現在の状態は「インストールを完了 -> 英数字のみ使用可・設定が開けない」です。

まずはGoogle日本語入力を追加するためにキーボード設定を開きます。
手順
その他のキーボード設定（下記画像参照） -> 言語カテゴリにある日本語の「・・・」から言語オプションを選択 -> 「インストールされているキーボード」からGoogle日本語入力を選択追加
これで追加設定はOKです。

![2022-05-16 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667226/e64ce965-8c4e-bf5b-c061-ecac6b86cdc4.png)



次は設定画面のショートカットを作ります。
Google日本語入力設定画面は、```"C:\Program Files (x86)\Google\Google Japanese Input\GoogleIMEJaTool.exe"```ここにあるので右クリックからショートカットをデスクトップに作ってください。

ショートカットができたら**起動オプション**を追加していきます。
追加方法はショートカットのリンク先に**半角スペースをはさみ**
```--mode=config_dialog```を加えるだけです。
そしてショートカットキーも追加します。キーは何でもいいです。

詳細については[こちら](https://support.google.com/gboard/forum/AAAAWMow2iwW0gWApdVxUc?msgid=koY1MW8IUKoJ)
![2022-05-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667226/d75c4189-2ad5-2e59-ffb5-2aa8e0328bd8.png)

## ショートカット起動、再起動

準備ができましたので実際にショートカットを起動してみましょう。
設定したショートカットキーで起動してください。
まあ、開かないんですけど...

私も最初は愕然としましたがその後PC再起動してみると
なんと英数字だけでなく日本語も使えるようになってました...
(世の中不思議なこともありますねぇ)

もちろんプロパティや辞書も正常通り使えます。
少なくともソースがGoogle 日本語入力チームの方なので
安全性が高い改善策だと思います。

> 作成したショートカットは削除していただいて構いません。

## 最後に
どうでしょうか？不具合は直りましたでしょうか？？
Microsoft IMEは誤変換も多くストレスも溜まりやすいですからなるべく早くGoogle日本語入力を使いたいものです。
もしこの記事を読みGoogle日本語入力を使うユーザーが増えてくれれば幸いです。
Git コマンド 

# Git コマンド

- 自分が使用するGitコマンドを備忘録として記載する

## git clone
- オプションなし
  - Gitリポジトリをクローンしてくる

```powershell
git clone https://github.com/XXXXXX/hogehoge.git
```

- <b>--depth n </b> オプション (Shallow clone)
  - Gitリポジトリから履歴数を指定してクローンしてくる<br>(nは数。n=1にすると最新コミットのみ取得する)

```powershell
git clone --depth n https://github.com/XXXXXX/hogehoge.git
```

- <b>--recursive</b> オプション
  - Gitリポジトリから submodule も同時にクローンしてくる

```powershell
git clone --recursive https://github.com/XXXXXX/hogehoge.git
```

## git fetch
- オプションなし
  - リモートリポジトリのコミット履歴を取得する。但しマージは行わない

```powershell
git fetch
```

- <b>--prune</b> オプション
  - リモートで削除されているリモートブランチを削除して反映

```powershell
git fetch --prune
```
または
```powershell
git fetch -p
```

- <b> --unshallow </b> オプション
  - shallow clone (git clone --depth n)でクローンしてきたリポジトリの全ての履歴をコミットをフェッチすることができる
```powershell
git fetch --unshallow 
```

## git diff
- オプションなし
  - ファイル変更差分を表示

```powershell
git diff
```

- <b>--name-only</b>
  - 変更差分のあるファイル名のみを表示

```powershell
git diff --name-only
```

## git log
- オプションなし
  - コミット履歴を参照する(コミットコメント、および変更内容含む)
  ```powershell
  git log
  ```
- <b>--oneline</b>
  - コミット履歴を参照する(コミットコメントのみ表示)
  ```powershell
  git log --oneline
  ```

  - コミット履歴を参照する(コミットコメントのみ + 直近N個のログを参照)
  ```powershell
  git log --oneline -n N (Nは数字)
  ```

## git submodule
- 以下のコマンドでsubmodule を更新する
  ```powershell
  git submodule update
  ```

- 以下のコマンドでsubmodule をクローンしてくる
  ```powershell
  git submodule update --init --recursive
  ```
Postgresql 週次で集計する

週次で集計するときの関数メモ

ログイン履歴などを管理する下記のようなスキーマのテーブルがあったとして

| id    | created_at                 |
|-------|----------------------------|
|  6710 | 2021-02-19 00:27:54.748366 |
| 10626 | 2021-06-25 01:00:56.936368 |
| 10843 | 2021-07-01 07:20:16.189046 |
| 10846 | 2021-07-01 07:41:09.651137 |
| 11429 | 2021-07-20 10:59:55.524838 |
| 11242 | 2021-07-13 03:06:57.809488 |
| 11239 | 2021-07-13 02:48:30.681351 |
| 11802 | 2021-08-05 12:43:27.207129 |
| 12504 | 2021-08-28 09:16:16.231289 |
| 12703 | 2021-09-04 00:23:35.515418 |

`date_trunc`関数を利用しれば週の初めの日付(月曜日）が一発で取得できる

```sql
SELECT id
      ,created_at
      ,date_trunc('week', created_at) as week_start_day
FROM users
```

| id    | created_at                 | week_start_day      |
|-------|----------------------------|---------------------|
|  6710 | 2021-02-19 00:27:54.748366 | 2021-02-15 00:00:00 |
| 10626 | 2021-06-25 01:00:56.936368 | 2021-06-21 00:00:00 |
| 10843 | 2021-07-01 07:20:16.189046 | 2021-06-28 00:00:00 |
| 10846 | 2021-07-01 07:41:09.651137 | 2021-06-28 00:00:00 |
| 11429 | 2021-07-20 10:59:55.524838 | 2021-07-19 00:00:00 |
| 11242 | 2021-07-13 03:06:57.809488 | 2021-07-12 00:00:00 |
| 11239 | 2021-07-13 02:48:30.681351 | 2021-07-12 00:00:00 |
| 11802 | 2021-08-05 12:43:27.207129 | 2021-08-02 00:00:00 |
| 12504 | 2021-08-28 09:16:16.231289 | 2021-08-23 00:00:00 |
| 12703 | 2021-09-04 00:23:35.515418 | 2021-08-30 00:00:00 |

あとは `week_start_day` で集計すれば週次集計ができる。
SQLAlchemyでcreated_at, updated_atを共通化する

# SQLAlchemyでcreated_at, updated_atを共通化する

[https://docs.sqlalchemy.org/en/13/orm/extensions/declarative/mixins.html](https://docs.sqlalchemy.org/en/13/orm/extensions/declarative/mixins.html)

Mixinを使えば可能？

`base.py`

```python
from sqlalchemy import Column, DateTime
from datetime import datetime


class TimestampMixin(object):
    created_at = Column(DateTime, default=datetime.now(), nullable=False)
    updated_at = Column(
        DateTime, default=datetime.now(), onupdate=datetime.now(), nullable=False
    )
```

`articles.py`

```python
from sqlalchemy import Column, Integer, String

from .base import TimestampMixin

from ..db.engine import Base


class Article(Base, TimestampMixin):
    __tablename__ = "articles"

    id = Column(Integer, primary_key=True, index=True)
    title = Column(String)
    slug = Column(String, unique=True, index=True)
    description = Column(String)
    body = Column(String)
```

この方法だと実現できるが、DDLを見てみるとカラムが最初に作られてしまっていた。

```sql
CREATE TABLE articles (
	created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,
	updated_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,
	id SERIAL NOT NULL,
	title VARCHAR,
	slug VARCHAR,
	description VARCHAR,
	body VARCHAR,
	PRIMARY KEY (id)
)
```

[SQLAlchemyを簡単にまとめてみた（TIPSもあるよ） - Qiita](https://qiita.com/penpenta/items/bd2940946324dedbd543#%E5%85%B1%E9%80%9A%E3%81%AE%E5%88%97%E3%82%92%E6%8C%81%E3%81%9F%E3%81%9B%E3%81%9F%E3%81%84%E3%81%AE%E3%81%A7%E3%81%99%E3%81%8C)

そんなときは`@declared_attr` を使うといいらしい

```python
from sqlalchemy import Column, DateTime
from sqlalchemy.ext.declarative import declared_attr
from datetime import datetime


class TimestampMixin(object):
    @declared_attr
    def created_at(cls):
        return Column(DateTime, default=datetime.now(), nullable=False)

    @declared_attr
    def updated_at(cls):
        return Column(
            DateTime, default=datetime.now(), onupdate=datetime.now(), nullable=False
        )
```

生成したDDLを見て見ると意図したとおりに最後に来ている

```sql
CREATE TABLE articles (
	id SERIAL NOT NULL,
	title VARCHAR,
	slug VARCHAR,
	description VARCHAR,
	body VARCHAR,
	created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,
	updated_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,
	PRIMARY KEY (id)
)
```
Stimulus 別コントローラーのアクションを呼びたい

```slim
div[data-controller="hoge fuga"]
  button data-action="fuga#fugaAction"
```

```js:app/javascript/controllers/hoge.js
import { Controller } from "@hotwired/stimulus"

// Connects to data-controller="hoge"
export default class extends Controller {
  initialize() {
    this.element[this.identifier] = this 👈これが重要
  }

  hogeAction() {}
}
```

```js:app/javascript/controllers/fuga.js
import { Controller } from "@hotwired/stimulus"

// Connects to data-controller="fuga"
export default class extends Controller {
  fugaAction() {
    this.element['hoge'].hogeAction() 👈これでhogeのアクションを呼べる
  }
}
```
個人的に専任開発者にも知っておいて欲しいこと - システム運用アンチパターンから

# はじめに

https://www.oreilly.co.jp/books/9784873119847/

こちらの本を読んだが、基本全編「ああ、あるある…」と思いながら読んでいた。
DevOps を実施したいと考えている人だけではなく、開発のみを行う専任開発者にもぜひ読んで欲しいと個人的に思う。

今回、本書から個人的に開発者にぜひ理解して欲しい話題を個人的な見解を交えながら紹介したいと思う。

想定読者は「動くものは作れる」という開発者である。 

最初に断っておくが、以下で紹介されている事項を知っても、直接的な利得（機能・速度）を得ることはできない。 しかし、これらの運用側面を知ることで、システム開発全体で実施可能なことが増えるため、運用担当者側から是非知って欲しいと思う点を紹介している。


# デプロイを意識したコーディングとアーキテクチャ

主に第8章、業務時間外のデプロイから。

ここでは細かい Ops 業務というよりは、より具体的に健全なデプロイを行うための手法がまとめられているため、アーキテクチャレベルの設計業務を行う人であればぜひ読んで欲しい。

具体的には「ブルーグリーンデプロイメント」のための方法や、「データストアレベル」のロールバックを実現するための手法について書かれている。

ブルーグリーンデプロイメントを行う前提条件として、以下の３つが記載されている。

- **新旧のコード両方がDBのバージョンに対応していること**
    - バージョン 1 から 2 へアップグレードする場合、DBにも同様のバージョン 1 と 2 が存在し、それぞれのバージョンからエラーなく利用できること
- バックグラウンド処理の重複が起こらないような設計を行う、あるいは仕組みを作る
- **ローカルディスクに状態を保存しないようにする**
    - アップロードされたものは共有でマウントされている領域であったり、AWS の S3 のような領域に保持する
    - セッションなどは外部の独立したデータストアに保持する

また、データストア（データベース）で複数のバージョンに対応できるようにするためのカラムの変更方式やルールの策定、データにバージョンを付与する方法など、より具体的な方法も説明されている。

「よし、ブルーグリーンデプロイをやろう！」と思ったり、偉い人から「最近はこういう方法で無停止更新できるんでしょ？」とか言われても、それがアプリケーションの作りによって不可能なことがあることが知識としてまとめられているため、より良いデプロイ作業を行うようにするために、是非専任開発者にも読んで欲しい内容であるため紹介した。


# 自動化のメンテナンスと企業文化

主に第2章、パターナリスト症候群、第7章、空の道具箱、および、第11章、命じられた文化から。

かつて働いていたところで、「もう自動化のための仕組みづくりは終わったから、運用メンバーだけ残して開発者は別の仕事してね」のようなことを言われたことがある。

> -- 2.7. 継続的な改善に向けて、より引用
> ただしこれが１回限りのものだとは決して思わないでください。 作成されたコードは新しいユースケースが発生するたびにメンテナンスやアップデートが必要になります。

当時の私はこう考えていたし、重要だということを信じていた。 しかし、結局別のところで仕事をすることになった。 こういった判断を行った結果、元居たチームは自動化のための開発戦力をほとんど失い、ほぼ全てを手動作業でしか解決しないチームになってしまった。

運用メンバーがちゃんと自動化のための動きを学びながらできる状態であれば、別段良かったかもしれない。 しかし、元のプロジェクトに対してそういった状況を軽視した判断が取られたことは事実である。

第11章の「文化」でも説明されている通り、私が感じていた「DevOps として継続して業務改善すべき」という自分の意見と、「あとは全部ただの運用者で回せるだろう」と判断した人では、そもそも想定しているレイヤー（事業的優先度と、プロジェクトに対する思い入れ）が違ったり、企業の文化価値観が違ったのだろうと納得することはできる。

運用プロセスは作って終わり、というほと単純なものではない。 運用に使うツールであっても、実体の変化に伴って **継続的に改善していく必要がある。** 開発者であれば「自動化した」とはよく言っているとは思うが、それで終わりではなく、その **自動化したものにも続きがあり、継続的に付き合っていく必要がある**、ということを知ってほしく、この内容を取り上げた。


# オンコール (通常業務時間外当番)と運用可用性

6章のアラート疲れ、より。

開発者が作ったものを別の人が運用する、となると、当事者意識が低くなり、自身の作ったものが問題を引き起こしたとしても「じゃあ直せばいいや」と考えてしまい、実際に起こった問題のためにどれだけの労力が使われ、苦労を掛けたかが他人事になってしまいやすい。
もし自分が運用をするのであれば、そんな問題（特に夜間にアラートでたたき起こされたり、休日にいきなり呼び出しを喰らったり）から逃げるために、極力問題を排除する（つまり、運用を改善する）方向に力が働きやすい。

また、開発者としてデータに問題があった場合、「データがおかしい？ じゃあ、DB を書きかえればよいだろ」と解決策は簡単だと考えるかもしれない。 しかし、

- 例えば、ユーザーのパスワードをリセットする SQL を発行する場合、そのパスワードはハッシュ化されて保持されているはずであり、これをどのように得るのか？
- 例えば、あるデータを SQL で書き換えた時、その変更オペレーションが正常なものであることはどのように保証するか？ (監査観点)

といったユーザー観点での問題が発生していることに注意して欲しい。 この問題は 7章の 7.7.2. 安全のための設計、で説明されており、汎用的な問題である。

これらを自動化することは、一般的なユーザーに対する「機能」としては何も生み出していない。 しかし、システム運用者というユーザーの観点では、誤りがなくなる、作業がシステムを経由するため、変更したことがシステムに保持される（監査的に問題のない状態）で業務を行える、と言った付加価値を創出している。

専任開発者の場合、例えばデータベースもローカルに構築しており、そのデータの変更・削除も手軽に行えることから、これらの業務は極めて簡単な業務と思っているかもしれない。 

**しかし、そうではない。**

開発者なら知っているデータ構造や関連も知らない状態で処理をする、というのは、それを本当にして良いか、という裏を取る必要があるし、万一失敗した場合にどこまで影響があるのか、ロールバックとして失敗前の状況に戻せるのか、といった非常に広い範囲の問題になってしまう。 これらを知るためにも、実際のオンコールへの開発者の参加によって当事者意識を高くしたり、一般ユーザー以外の管理ユーザーのユースケースを理解したりすることは、プロジェクト全体の改善となることを知ってほしく、取り上げた。

# おわりに

本記事で紹介した内容は、書籍から適時内容を取り上げつつ、自身の経験・私見を踏まえて、運用者の立場から開発者に知って欲しいことを箇条書きとした。 

これらの内容を見て興味が沸いた人は、是非書籍を読んで、より自身の開発哲学を深めて言って欲しいと思う。
M5Stack Core2のタッチパネルを実装する

せっかくなので、機能を一通り実装してみたい

## タッチパネル機能を実装してみる
座標数値を返すTouchが存在する～

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2660324/f2001fa6-107f-ee2e-81cf-4531c48a2d50.png)
押したパネルごとの色を表示させる
とりあえず、
+ 赤と青の2種類
+ 左上座標はそれぞれ（20,50）（120,50)
+ 幅、高さ100

タッチ座標が
X 20～120、Y 50～150の間ならREDと表示する
X 120～220、Y 50～150の間ならBLUEと表示する
それ以外ならNOと表示する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2660324/5d0acec2-d4d8-49ff-30fe-f47ed8d2b743.png)

すごい無駄ばかりな気がします。。。
判定を関数にまとめたり、パネルを８つに増やして色とりどりにしてみています

---
#### 【追記】2から8個にパネルの数を増やしたら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2660324/1fbd815f-6ac9-74c8-b175-cb6f6befc6ec.png)
大変見難いブロックになってしまいましたのでアルゴリズムを変えたほうが良いですよね。

+ Yの値が50～150なら1を返す、150～200なら5を返す判
+ Xの値で0～3の分岐を作成
+ 合計値でラベル表示を判定して変更

でどうでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2660324/723cf771-0f58-d9b7-3ab7-9149ff521d95.png)
ちょっとは見やすくなったきがします・・？
【Julia】引数名をkey, 値をvalueとした辞書を関数呼び出しで使う方法

Pythonでは関数を呼び出す時，引数名をキー，実引数を値とする辞書を使うことができます．
Juliaで同様のことをやろうとして躓いたのでメモしておきます．


Pythonでは，
```python
def f(a, b):
    return a + b

params = {"a": 1, "b": 2}
print(f(**params))
>>> 3
```
で辞書を使えます．

Juliaで同様のことをやろうと思った時，直感的に翻訳するとこうなると思います．

```julia
f(a, b) = a + b

params = Dict("a" => 1, "b" => 2)
println(f(params...))
```

しかし，これではいくつか構文エラーが発生します．
想定の動作をさせるには以下のように記述します．

```julia
f(;a, b) = a + b

params = Dict(:a => 1, :b => 2)
println(f(;params...))
```

1. Juliaではキーワード付き引数にする場合，関数を定義する側でセミコロンの後ろに作る宣言する
1. 引数名を文字列ではなくSymbol型にする
1. 呼び出す側もセミコロンの後ろに辞書を書く

これで想定の動作になるはずです．

2022-05-17 追記
@antimon2 さんより，名前付きタプルでも同様のことができると教えていただきました！
> 辞書じゃなくて名前付きタプル（NamedTuple）にしても良いですよ。（むしろ名前付きタプルの方が辞書より軽いのでオススメ）

```julia
f(;a, b) = a + b

params = (a=1, b=2)
println(f(;params...))
# => 3
```
IPアドレス

## IPアドレス
<b>TCP/IPネットワーク上にある端末やネットワーク機器を識別するための番号。
IPv4では、IPアドレスは2進数32ビットで表現している。これを8ビット単位に10進数に変換しドットで区切って表現している。
## ドメイン名
<b>IPアドレスを、人が理解しやすいように英字や数字、一部の記号を使って文字列に置き換えた別名。
狭義と広義の意味がある。狭義では<font color=blue>ドメイン名</font>は、ネットワーク内のコンピュータを識別する文字列。<font color = blue>ホスト名</font>は、ネットワーク内のコンピュータを識別する文字列。「ホスト名」+「ドメイン名」のような
形式は、<font color = blue>FQDN</font>という。
広義では、ドメイン名やホスト名を、インターネット上でコンピュータを特定するFQDNの意味で使うこともある。
## DNS
<b>ドメイン名やホスト名などとIPアドレスとを対応付けるシステム。DNSサーバが担当する。
<font color = blue>名前解決</font>とは、DNSサーバへ問合せをして、ドメイン名からIPアドレスを取得する。逆も可能。

![dns-server.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/3c6c03e4-0643-9040-0c1f-c575c47cd804.jpeg)
## グローバルIPアドレスとプライベートIPアドレス
### グローバルIPアドレス
<b>インターネットで使用するIPアドレス。世界で一意になる。
### プライベートIPアドレス
<b>LANなど独立したネットワークで使用するIPアドレス。独立したネットワーク内で一意になるように。
## DHCP
<b>LANに接続された端末に対して、そのIPアドレスをPCの起動時などに自動設定するために用いるプロトコル。DHCPサーバが担当する。
## ポート番号
<b>TCPやUDPのプロトコル処理において、通信相手のアプリケーションを識別するために使用される番号。
0~65535までの番号が付けられる。0~1023までは特定のアプリケーションのために予約されている。これを<font color = blue>ウェルノウンポート</font>という。
FTPデータ転送 - 20
FTPデータ制御 - 21
SMTP - 25
DNS - 53
HTTP - 80
POP3 - 110
## NATとNAPT
### NAT
<b>一つのグローバルIPアドレスと、一つのプライベートIPアドレスを相互変換する技術。
### NAPT
<b>一つのグローバルIPアドレスと、複数のプライベートIPアドレスを相互変換する技術。
<font color = blue>IPマスカレード</font>とも言われている。NATにポート番号を組み合わせたもの。
Oracle Analytics Cloud：ユーザーを登録し、アクセス権を与えてみる

はじめに
---
Oracle Analytics Cloud（OAC）を他のユーザーが利用するためには、アイデンティティクラウドサービス(IDCS)にユーザーを登録し、OACを利用する権限を与える必要があります
本記事を記載した時点(2022/5/16)では、トライアルアカウントを作成するとドメインでのユーザー管理となっています。ドメインでのユーザー登録権限付与の方法を記載します。

OCI管理コンソールからドメインへのアクセス
---
OCI管理コンソールにログインします。
メニューからアイデンティティとセキュリティをクリックします。
ドメインをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/d4f449d8-09fc-5283-e141-e321c696b842.png)
コンパートメントを選択します。<テナント名>(ルート)を選択します。
ドメインDefaultがリストされます。Defaultをクリックします。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/2497daa7-8e40-3d43-30e1-fd3dfffa6568.png)

アイデンティティ・ドメインへのユーザー追加
---
ユーザーをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/c5d0cefe-34e9-aef5-1a4a-0948231cb952.png)
ユーザーの作成をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/c7e2132b-00ab-fb4f-c6fb-2f77715e5bac.png)

ユーザー名として電子メール・アドレスを使用のチェックを外します。
名、姓、ユーザー名、電子メールを入力します。作成をクリックします。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/110a3b75-ea00-6134-9688-a23d74d9f6f5.png)

作成後、ユーザー情報が表示されます。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/7ebf45b6-55dd-d5e4-867f-da6e618daadf.png)

入力した電子メール・アドレスにメールが送付されます
Activate Your Accountをクリックします
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/537cb772-7fba-a844-9fd9-6dcd90620871.png)

パスワードをセットします。パスワードのリセットをクリックします。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/7db394f6-eff9-b565-1aa7-1fe25c731042.png)


OACでアクセス権を与える
---
アクセス権は、OACのメニューでコンソールから実施します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/fa2a712d-6b69-4c4b-135d-11b39d1a065c.png)

ユーザーとロールをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/3267a57d-65de-22d7-37ce-4dde292e363c.png)

アプリケーション・ロールをクリックします。
付与する権限（図では開発者BIContentAuthor）をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/52acf654-9bd9-1b73-f2e0-35290eb6912a.png)

ユーザーをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/9e9f4a45-5354-b4bf-e488-d75584e6df3f.png)

ユーザー検索します。ユーザーを選択し、追加をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/6f020854-e9cb-98e9-adfa-b60cd5c633ad.png)

ユーザーに権限が付与されました。
以上で、ユーザー登録、アクセス権の付与が完了です。
Python リストをなるべく均等にN分割する

# はじめに
マルチスレッド（スレッドプール等）で並行処理するときに使えるテクニックです

# 方法

```python
import random

def split_array(ar, n_group):
    for i_chunk in range(n_group):
        yield ar[i_chunk * len(ar) // n_group:(i_chunk + 1) * len(ar) // n_group]

for _ in range(3):
    # 要素数をランダムに決定
    elem_count = random.randint(100,1000)
    ar = [i for i in range(elem_count)]
    # 分割数をランダムに決定
    n = random.randint(10,20)

    splited = split_array(ar, n)

    print(f'要素数{elem_count}のリストを{n}分割')
    for elem in splited:
        print(len(elem))
```
```:結果
要素数416のリストを12分割
34
35
35
34
35
35
34
35
35
34
35
35
要素数921のリストを13分割
70
71
71
71
71
71
70
71
71
71
71
71
71
要素数702のリストを10分割
70
70
70
70
71
70
70
70
70
71
```
アプリ開発に使えるUIフレームワーク(Onsen UI/Framework7/Ionic)

# はじめに
この記事の対象になる方はアプリ開発未経験～初学者より少し強い人です。
以下当てはまらない方には易しい内容となる可能性が高いです。

- モバイルアプリ開発を始めようとしている
- Web言語が書けるので、なにか活かしてみたい
- 最近アプリ開発を始めたが、新しく何か使えるようになりたい
- 非ゲームアプリを開発する時に使える便利グッズを探している

今回は特に、”開発時に使えるフレームワーク”に焦点を当ててみようかなとおもいます。
ご興味ある方は是非お読みいただければと思います～。

# フレームワークを使う理由
「フレームワークなんか使わずに、自分で好きなようにデザインすればええやんか！」と思う方向けではありません。
フレームワークを使う理由は大体以下のようになります。
- 強いこだわりはないが、綺麗に作りたい
- UIを考える/作る時間を他の工数に充てたい
- デザイン力がない。誰か代わりに考えて欲しい
- アプリ化する際に、アイデアをすぐ世に放出したい
- ネイティブアプリ風のUIを簡単に実装する事ができる

まぁざっくりとこんなところでしょうか。
特に小規模開発の場合はフレームワークを活用する恩恵を大いに感じると思います。

また、UIフレームワークを使うと全てのアプリが同じ見た目になってしまうのではないかと懸念されるかもしれませんが、アプリの一部だけに組み込むことも可能であり、こだわりたい部分は自前で構築すればよいのです。

# モバイルアプリ開発におすすめのフレームワーク
クロスプラットフォーム用に使えるものは他のQiitaやブログなどでも多く取り扱われていますので、
今回はFlutterやReact Nativeなどのフレームワークではなく、UIフレームワークというものを紹介していきます。

## Onsen UI 
Webアプリ上で iOS や Android のネイティブUIと同等の UX を実現するためのオープンソースのUIフレームワークです。ボタンやリストなど、様々なUIコンポーネントが揃っており、Web言語の基礎知識があれば利用は難しくありません。
また、ハイブリッドアプリ開発に使えるため、iOS/Androidアプリ開発のコードを共通化する事が出来ます。

**Onsen UIの特徴**
- 日本語のリファレンスが豊富に揃っており、とても学びやすい
- Monaca上に用意されているため、試しに使ってみるくらいの気持ちで動かすことが出来る
- デザイン知識が少なくても綺麗なUIを作ることが出来る
- １ソースで開発出来るため、ネイティブ開発に比べて工数が劇的に下がる
- 開発言語が比較的易しいため、リリース後の保守なども安心できる

海外で人気のUIフレームワークを勉強してみるのも良いですが、
個人的に最初は日本語でしっかりと学んでからでも良いと思います。
ちなみに、monacaを使って実際にOnsenUIの扱いを解説している動画もあります。
<iframe width="300" height="auto" src="https://www.youtube.com/embed/dHfvNMUxgYE" title="Onsen UI 入門" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

https://ja.onsen.io/v2/guide/

## Framework7 
Framework7も日本語のサイトが用意されているオープンソースのUIフレームワークです。ハイブリッドアプリ開発に使えて、1つのコードでiOS/Androidアプリを開発する際に役立ちます。アコーディオンやスワイプ、ポップアップなども用意されており、アプリに組み込める機能はかなり充実している印象です。アップデートも頻繁に行われているため、最近ではVue.jsなども使う事が出来ます。

**Framework7の特徴**
- Monacaにテンプレートが追加されたため、Onsen UI同様に簡単に導入できる
- リファレンスがかなり豊富なため、学習に困らない
- 自由度が高いため柔軟に開発が出来るが、その分エラーの解消等は少し大変
- １ソースで開発出来るため、ネイティブ開発に比べて工数が劇的に下がる

https://framework7.jp/

## Ionic
Ionic FrameworkはオープンソースのUIフレームワークで、こちらも同様にWeb技術を使っての開発が可能です。上記に比べても最初に登場したこともあり、コミュニティが広いため情報が見つけやすいです。OnsenUIに比べるとやや日本語のドキュメントは少なく感じるかもしれませんが、情報量という面でとても優れています。

**Ionicの特徴**
- 情報量が多く、エラーの解消がしやすい
- コミュニティが広く、検索しやすい
- 書籍も出版されていたり、学習の敷居が低い
- １ソースで開発出来るため、ネイティブ開発に比べて工数が劇的に下がる

https://ionicframework.com/docs/ja

# おわりに
簡単になりましたが、今回は3つのフレームワークを紹介しました。
本記事で取り上げたフレームワークであれば、いずれもアプリ開発の役に立つ事は間違いありませんので、ご自身の肌にあったものを学習してみることをお勧めいたします。

ちなみに、アプリを作る際にはニフクラ mobile backend というサービスを使うと更に開発コストが下がるのですが、、後日改めてご紹介できればと思います。

https://mbaas.nifcloud.com/

記事の内容で間違っている部分などのご指摘も大歓迎ですので、一緒にアプリ開発について学んでいけたらと思っています。

ではまた！
HTTPメソッド　Webサーバーへの要求の種類

# HTTPメソッド
Webサーバに具体的な要求内容を伝えている。
８つの種類がある。
その中で主に使われているは、```GET```と```POST```だ。
また```PUT```や```DELETE```はサーバーのデータを書き換えたり改ざんできたりするのでサーバー側で使用できなくている。
## GET
HTMLファイルなどコンテンツを```取得```したい時に使う。
## POST
データをWebサーバに対して```送信```するときに使う。
## GETとPOSTの違い
GETでもデータの送信ができる。
その場合は送信方法が違う。
それはURLの後に送りたいデータを書かなくてはならない。
またURLにデータが組み込まれるため、送ったデータがWebブラウザの閲覧履歴に```残ってしまします```。
しかし
```POST```メソッドはメッセージボディ内にデータが組み込まれるため、閲覧履歴に```残りません```。

HTTPメソッドの種類は他にも```CONNECT```,```OPTHION```,```TRACE```がある。

# 応答結果の種類を表す(ステータスコード）
HTTPレスポンスのメッセージヘッダーに書き込まれていた。
100番台〜500番台まである。
それぞれ処理内容が５つにわかれて分類されている。
## 100番台
HTTPリクエストを処理中であることを通知している。

## 200番台
HTTPリクエストに対して、正常に処理した場合に通知しています。
（ほとんどのステータスコートがこれを返している。）
## 300番台
HTTPリクエストに対して、転送処理などのWebブラウザ側で追加処理が必要であることを通知しています。
リクエスト先のコンテンツが何かあり。
## 400番台
クライアント（Webブラウザ）のエラーであることを通知している。
クライアント（僕ら）に問題
## 500番台
Webサーバーのエラーであることを通知しています。
サーバに問題
# 思ったこと
実際に体験してみないとわからないかな。


出典 Web技術の基本（SBcreative)
Vagrantで立ち上げた仮想環境でRemote-SSHを行う際に「Could not establish connection to "xxx"」と表示されたときの対処法

ローカル開発環境にvagrantを使い、開発を行っている人も多いと思うが、その中でRemote-SSHを使用して開発を行った際にハマってしまったことを共有する。

なお、この記事ではRemote-SSHの設定については扱わないため、設定をしたい方は以下のリンクを参考にしてほしい。

https://qiita.com/nlog2n2/items/1d1358f6913249f3e186

本題に入るが、複数の環境をRemote-SSHで設定した場合、単にvagrant ssh-configの内容を　\Users\(user名)\ .ssh\configに貼り付けて、複数の環境を立ち上げた場合、しばしばRemote-SSHでの設定で以下のようなエラーが発生することがある。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531265/c7ed8544-0a36-e59a-f4e5-ad328edfbc04.png)

これは、接続が行えないという意味であるが、原因は主にConfigファイルに書かれた設定に問題があるために起こりうる。

```env:Config
Host aaa
  HostName 127.0.0.1
  User vagrant
  Port 2222
  (略)

Host bbb
  HostName 127.0.0.1
  User vagrant
  Port 2200
  (略)
  
Host ccc
  HostName 127.0.0.1
  User vagrant
  Port 2222
  (略)
```

仮に、このようにファイルが設定されていたとする。

このとき、Remote-SSHで接続を行った場合、以下2ケースで接続を確立できない可能性がある。

+ Host aaaとHost cccを両方起動した場合。
+ Host bbbのみを立ち上げた場合。

Host aaaとHost cccを両方起動した場合、vagrantではホスト側のポートをデフォルトで2222番に設定するが、もしその番号が使われていた場合、別ポートでフォワーディング設定してくれる。
そのため、このケースの場合、Host aaaもしくはHost cccのどちらかの接続をRemote-SSHで行えない場合がある。

また、Host bbbのみを立ち上げた場合、デフォルトのポート番号2222が割り当てられるため、この設定の場合は接続することができない。

## 対処法

適宜Configファイルに割り当てられたポート番号を変更する方法もあるが、毎回面倒なためここでは割愛する。


### HostNameを "forwarded_port"のhostを任意の値に変更し、ConfigのPortに反映する。

以下のようにVagrantfileのhostを任意の値に変更し、guestを22,idをsshとする。

```env:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = (任意のbox)
　#以下を追加
　config.vm.network "forwarded_port", guest: 22, host: 2260, id: "ssh"
  config.vm.network "private_network", ip: "192.168.33.xx"
end
```

vagrant reloadを行う。

その後、Portにその値を反映する。
```env:Config
Host aaa
  HostName 192.168.33.xx
  User vagrant
  Port 2260
  (略)
```

これで、接続できるようになったはずです。
Linux ローカルユーザーパスワード覚え書き

```
/etc/shadow
```
第2フィールドに格納
例：
```
aho:$y$j9T$o8MJgcu/zxjLLjo3pBk4A.$SPwoNr7I95/JHVKBeTnsu1mSC//M76vfmKc6mE6lSe2:19128:0:99999:7:::
```
```
$id$cpu_time_cost$salt$hash

$y$j9T$o8MJgcu/zxjLLjo3pBk4A.$SPwoNr7I95/JHVKBeTnsu1mSC//M76vfmKc6mE6lSe2
```
id
y - Yescrypt
1 - MD5
2a,2b,2x,2y - Blowfish （bcrypt)
5 - SHA256
6 - SHA512
Ubuntu 22.04 LTS での確認によると、デフォでYescrypt を使用 (もうSHA256/SHA512などでなく)。
参考 : FedoraにおけるYescryptの能書き
https://fedoraproject.org/wiki/Changes/yescrypt_as_default_hashing_method_for_shadow

PAM(Pluggable Authentication Modules)
-> 認証をシステムワイドで(OS+各アプリケーションにまたがって)つかさどる

PAMの設定ファイル:
Ubuntu は /etc/pam.d/common-password
CentOS は /etc/pam.d/system-auth

```
/etc/pam.d/common-password

# Explanation of pam_unix options:
# The "yescrypt" option enables
#hashed passwords using the yescrypt algorithm, introduced in Debian
#11.  Without this option, the default is Unix crypt.  Prior releases
#used the option "sha512"; if a shadow password hash will be shared
#between Debian 11 and older releases replace "yescrypt" with "sha512"
#for compatibility .  The "obscure" option replaces the old
#`OBSCURE_CHECKS_ENAB' option in login.defs.  See the pam_unix manpage
#for other options.
```
SwiftUI を利用したアプリを１日で開発 〜 審査 〜 App Store で公開した話

## この記事の内容（要約）
![FS2xf81aIAI6SnF.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199441/9eaf363c-8a03-5065-ea28-cca4b790a4c6.jpeg)

- SwiftUI を利用して １日でアプリを開発し、審査に提出し、App Store で公開した
- 開発〜審査への提出〜公開を一気通貫にやったことで、自信につながった
- ポートフォリオとしてアプリを開発する場合は、凝ったアプリよりも機能が少なくても他の人も役立つアプリを短期間で開発した方が良いと感じた

## この記事を書いた人の特徴
- 2011年 大阪教育大学卒（文系・全くプログラミングの知識なし）
- 2018年 エンジニアとして働き始める
- 2020年 〜 20221年 iOS アプリ開発業務に従事

## アプリの概要
### 郵便番号から住所を検索するアプリ
https://apps.apple.com/jp/app/searchzipcode/id1624355640

- 郵便番号（数字７桁）を入力して検索実行ボタンをタップすると、その郵便番号に対応する住所を表示する
- 該当する住所がない場合は、アラートを表示する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199441/55b91116-f2fe-d270-02b7-332f67da1fa1.png" width="200">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199441/4c8d19fb-d96c-4112-b8e8-8ff1346364e1.png" width="200">

### GitHub リポジトリ
https://github.com/tanakadaichi1989/SearchZipcode

### 開発日数
- １日 （Ver 1.0）

## 開発環境

|項目|内容|
|---|---|
|PC| MacBook Air(M1,2020） メモリ：16GB ストレージ：1TB |
|言語|Swift|
|IDE|Xcode|


## 技術的な特徴
- MVVM を採用
- コールバックを Swift のクロージャだけで実装

## 感想
開発〜審査への提出〜公開を一気通貫にやったことで、自信につながった。

### App Store での公開について
-  [凝ったアプリを１ヶ月かけて開発](https://qiita.com/tanakadaichi_1989/items/cd6ad6aa4fc6a62bbb53)  し審査に提出しても却下される場合がある
- １機能しかないアプリを１日で開発し審査に提出したら配信可能になる場合がある

ポートフォリオとしてアプリを開発する場合は、機能が少なくても他の人も役立つアプリを短期間で開発した方が良いと感じた。

個人的には、2022年12月までにアプリの規模を問わず App Store に１つ以上のアプリを公開することを目標にしていた。

その目標を大幅に前倒して達成できたのはよかった。

### コードについて
- クロージャや非同期処理の使い所が腹落ちした

### 今後について
#### 今回開発したアプリ
- 画面内の文言や UI は改善したい
- 機能を増やしたい
- テストコードを書きたい
- CI/CD ツールを導入して、 App Store Connect へのビルド UP を自動化したい

#### 《2022/05/18 追記》 Ver 1.2.0 の対応
- UI を改善
- 検索結果をコピーする機能を実装
- UI テストの自動化を行なった

####  《2022/05/21 追記》 Ver 1.3.0 の対応
- 検索結果の住所に応じた地図を表示 （地図の表示については下記記事にまとめている）

https://qiita.com/tanakadaichi_1989/items/afc3b9fbd2547884aef1

#### その他のアプリ開発
- HealthKit と Widget を利用して、歩数計アプリを開発したい
- SONY の MESH と連携できるアプリを開発したい

https://meshprj.com/jp/

## 参考
### SwiftUI Tutorial
https://developer.apple.com/tutorials/swiftui

### Youtube
https://www.youtube.com/watch?v=3pIXMwvJLZs

SwiftUI + MVVM + Firebase を利用して、Twitter に似たアプリを開発する動画

この動画を見ると、SwiftUI Tutorial では紹介されていないユーザの登録・ログイン機能の実装・ツイートの投稿・いいね機能の実装方法を学べる

SwiftUI Tutorial での学習が終わった人には、最適な教材だと思う

#### メリット
- クロージャや SwiftUI での Firebase の利用方法が腹落ちする
- 無料

#### デメリット
- 英語
- 再生時間が長い(約 6 時間)
HTTPでやり取りする仕組み　HTTPメッセージ

# HTTPメッセージ（データ形式）
```HTTP(HyperText Transfer Protocol)```は
HTML（HyperText)などのテキストファイルや画像などのコンテンツをやり取りするときのプロトコル
一番身近なプロトコル。
コンピュータネットワーク（HTTPのプロトコル）において```クライアント```と```サーバー```が要求と応答をしていることで成り立っている。その要求と応答を専門用語で
### HTTPリクエスト（要求）
ブラウザからの要求
### HTTPレスポンス（応答）
サーバーからの応答

これらに用いられているものは```HTTPメッセージ```だ。

## HTTPメッセージの構成
HTTPリクエストやHTTPレスポンスが```どのような内容```なのかを伝えなくてはならない。
そこで
1行　　```開始行（リクエスト行、ステータス行）```
複数行可　　　```メッセージヘッダー```
1行     　　　　　　　　```空行```
複数行可　　　```メッセージボディ```
```
 GET /test/request_test.html HTTP/1.1
> Host: programmer-life.work
> User-Agent: curl/7.79.1
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx
< Date: Sat, 30 Apr 2022 02:18:09 GMT
< Content-Type: text/html
< Content-Length: 453
< Connection: keep-alive
< Last-Modified: Sat, 28 Dec 2019 12:06:25 GMT
< Cache-Control: max-age=1
< Expires: Sat, 30 Apr 2022 02:18:10 GMT
< Vary: Accept-Encoding
< Access-Control-Allow-Origin: https://programmer-life.work/*
< Accept-Ranges: bytes
< 
<!DOCTYPE html>
<html class="js" lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes">
<meta name=”robots” content=”noindex,nofollow“>
<title>HTTPリクエストテスト</title>
<body>
<header>
<h1>test</h1>
</header>
<main id="main">
<article>
<p>HTTPリクエストテスト</p>
</article>
</main>
</body>
* Connection #0 to host programmer-life.work left intact
</html>%                    
```
出典　https://programmer-life.work/html_css/html-request
# HTTPリクエスト
## リクエスト行
Webサーバに対してどのような処理を依頼するかを伝える情報が含まれている。
```GET /test/request_test.html HTTP/1.1```
## メッセージヘッダー(HTTPヘッダー）
Webブラウザの種類や対応しているデータのタイプ、データの圧縮方法、言語などの情報
```
> Host: programmer-life.work
> User-Agent: curl/7.79.1
> Accept: */*
```

## 空白行
メッセージヘッダーの終了を伝える

## メッセージボディ
Webサーバにデータを送るために使われる。空の場合がある。

今回は無い。
# HTTPレスポンス
## ステータス行
WebブラウザにWebサーバー内での処理の結果を伝える。
```HTTP/1.1 200 OK```
## メッセージヘッダー（HTTPヘッダー）
Webサーバーのソフトウェア情報や返信するデータのタイプ、データの圧縮方法などの情報を伝える。
```
< Server: nginx
< Date: Sat, 30 Apr 2022 02:18:09 GMT
< Content-Type: text/html
< Content-Length: 453
< Connection: keep-alive
< Last-Modified: Sat, 28 Dec 2019 12:06:25 GMT
< Cache-Control: max-age=1
< Expires: Sat, 30 Apr 2022 02:18:10 GMT
< Vary: Accept-Encoding
< Access-Control-Allow-Origin: https://programmer-life.work/*
< Accept-Ranges: bytes
```

## 空白行
1行空けることでメッセージヘッダーの終わりを伝える。

## メッセージボディ
HTMLや画像などのデータを格納する場所
```
<!DOCTYPE html>
<html class="js" lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes">
<meta name=”robots” content=”noindex,nofollow“>
<title>HTTPリクエストテスト</title>
<body>
<header>
<h1>test</h1>
</header>
<main id="main">
<article>
<p>HTTPリクエストテスト</p>
</article>
</main>
</body>
* Connection #0 to host programmer-life.work left intact
</html>%                    
```
linux change disk size

```
lsblk
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399596/a5b5b5e6-20d8-9957-c744-e9eaf6406d16.png)

```
sudo growpart nvme0n1 1
sudo resize2fs /dev/root
```
非エンジニアに向けてフレームワークについて簡単に説明してみた


## はじめに
社内にて営業や人事といった技術以外の部署の人間を巻き込んで、
リテラシー向上のためのIT講習会を行いました。

その際の事前質問で、フレームワークについて教えて欲しいと言われたので、その時の内容です。
眠らせておくのも勿体無かったのでQiitaにも載せておきたいと思います。

※この記事には、私の独断と偏見が結構含まれています。

## 資料


<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vTyW1djU1OwGrp6jDefpKl55JCfzL5dP2hL76EkvhKhfQdDS8TU-XpNG_WGPwCmnUXcbd7CRtpjYvbi/embed?start=false&loop=false&delayms=3000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>


 
30分という枠の中で、Zoomの画面共有で資料のスライドを進めながら質問や解説を入れていたので、
少し説明が足りない＆分かりづらいところもあるかもしれません。


# フレームワークってなに？

## そもそもフレームワークとは？

フレームワーク(framework)とは、日本語で「骨組み」「枠組み」と訳され、特定の規則・構造・アイディア・信念・思想の集合のことである。

参考文献：

https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF

つまりフレームワークとは、土台となる「テンプレート」のことである。

ちなみにシステム開発において、ソフトウェアフレームワークやアプリケーションフレームワークとも呼ばれる。

## フレームワークを使うとどうなるの？

システムをフルスクラッチで(ゼロから)作ると、
当然ながらとても大変で時間も掛かる。

フレームワークを使えば、あらかじめシステム開発に必要な汎用的な機能が用意されているので、それらを利用するだけで、システムの枠組みを簡単に組み上げることができる。

似たようなものにライブラリやモジュールが挙げられるが、ライブラリは開発者が記述したコードから定義された機能を呼び出すのに対して、フレームワークはフレームワーク側のコードから開発者が記述した機能を呼び出すという違いがある。
これを「制御の反転」と呼ぶ。

## フレームワークのメリット・デメリット

### メリット
・よく使う機能が用意されており、それを呼び出すだけで使えるので開発スピードが早い。
・フレームワークのルールにしたがって開発するので、チーム開発においても中身の統一化ができる。(重要)
・ルール化されているので、比較的メンテナンスしやすくなる。

### デメリット
・使い方を覚えなければならないので、学習コストが掛かる
・フレームワークで出来ない処理があった場合に、フレームワークのルールが弊害になり、普通に実装するよりも面倒になることがある。
・未経験でいきなりフレームワークから入ると、中身がどう動いているか分からないままになりかねない。※SQL等。

![カレーの例え.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392337/1c27e955-bf9a-69d2-046e-b8807b959df4.png)

:::note warn 
Q.フレームワークだけしか知らないと、どうなりますか？
:::

:::note 
A.カレー屋さん(プロ)を目指す場合、カレーのルーでしか作り方を知らないのだと話にならないと思います。
必要に応じてスパイスを組み合わせて、カレーを作れるようになることが大事だと思います。
:::

## 言語別のフレームワークを一部紹介

・Ruby
Ruby on Rails

・JavaScript
Vue.js, React

・TypeScript
Angular

・PHP
Laravel, CakePHP, Symfony

・Python
Flask, Django

・Java
Spring Framework, Play Framework

などなど…

:::note warn
Q.フレームワークと言語って、全部同じ人が作っているの？
:::

:::note
A.そんなことはありません。A社が出した言語にB社がフレームワークを出すこともあります。
例えばRubyは、日本のまつもとゆきひろ氏により生み出されましたが、RubyのフレームワークであるRuby on RailsはデンマークのDavid Heinemeier Hansson氏により作られました。
:::

## まとめ

フレームワークは、あくまでテンプレートなので上手く扱えれば、非常に便利なものです。

しかしちょっとした小規模のシステム開発や独特な処理を多く実装する開発の場合は、フレームワークが逆に煩わしいものになることもあります。

導入するしないは、そこを上手く見極めて行う事が大切でしょう。


### おわり

## 第一回目

https://qiita.com/shimajiri/items/74aa1487499321910d8f

## 第二回目

https://qiita.com/shimajiri/items/7ea687b62255a82a2eca

## 第三回目

https://qiita.com/shimajiri/items/a49eddc4230ee9d73e35
freee for salesforceで作られるオブジェクト


freee との連携のために少々情報を整理します。

パッケージをインストールしたら作成されるもの
|オジェクト名|API名|
|:----------|:---------|
|freeeシステムログ|freee__SystemLog__c|
|freeeセグメントタグ|freee__SegmentTag__c|
|freeeメモタグ|freee__Tag__c|
|freee事業所|freee__Company__c|
|freee勘定科目|freee__AccountItem__c|
|freee取引|freee__Deal__c|
|freee取引オブジェクトリンク|freee__DealObjectLink__c|
|freee取引先|freee__Partner__c|
|freee取引先リンク|freee__AccountPartnerLink__c|
|freee取引送信キュー|freee__PostDealQueue__c|
|freee取引連携設定|freee__DealPostSetting__c|
|freee品目|freee__Item__c|
|freee帳票出力設定|freee__FormPrintSetting__c|
|freee文書連携設定|freee__DocPostSetting__c|
|freee税区分|freee__Tax__c|
|freee試算表（損益計算書）|freee__TrialBalancePL__c|
|freee請求|freee__Invoice__c|
|freee請求オブジェクト 検索条件|freee__InvoiceObjectFilterCondition__c|
|freee請求オブジェクトリンク|freee__InvoiceObjectLink__c|
|freee請求オブジェクト設定|freee__InvoiceObjectSetting__c|
|freee請求書合算ルール|freee__InvoiceCombinedRule__c|
|freee請求書送信キュー|freee__PostInvoiceQueue__c|
|freee部門|freee__Section__c|


独自に追加したもの
|オジェクト名|API名|
|:----------|:---------|
|freee取引の支払行|freee_Payment__c|
|freee口座|freee_walletable__c|
【Python】Instagramに自動ログインする

# コード
先にコードの全貌を知りたい方のために、すべてのコードを記載しました。
上から順に解説していきます。
```python:instagram.py
from lib2to3.pgen2 import driver
from time import sleep
from drivers import Driver

#IDとpasswordを定義
INSTAGRAM_ID = ''
INSTAGRAM_PASSWORD =''#main.pyの方で設定する

class Instagram(Driver):
    def __init__(self):
        super(Instagram, self).__init__()
        self.page = None

    #インスタグラムにログインを行う
    def login(self):
        try:
            #インスタグラムにアクセス
            self.get('https://www.instagram.com/accounts/login/')
            sleep(3)

            #ログインフォームを探し、入力する。
            sign_box = self.find_element_by_tag_name('form')
            sign_box.find_element_by_name('username').send_keys(INSTAGRAM_ID)
            sign_box.find_element_by_name('password').send_keys(INSTAGRAM_PASSWORD)

            #ログインボタン押下
            login_btn = sign_box.find_element_by_xpath('//button[@type="submit"]')
            login_btn.click()
            logger.info('login succeeded')
            sleep(3)

            #ダイアログを閉じる
            dialog_box = self.find_element_by_xpath('//div[@role="dialog"]')
            btn = dialog_box.find_element_by_tag_name('button')
            btn.click()
        except Exception:
            pass
```

# コード解説
## フィールド
```python:instagram.py
INSTAGRAM_ID = ''
INSTAGRAM_PASSWORD =''
```
こちらは何も入力しなくて大丈夫です。
呼び出す側のmain.pyをコマンド実行する際の引数で設定を行います。
こうすることにより、引数を変えるだけで、別のアカウントで実行することができます。
```python:main.py
from instagram import INSTAGRAM_ID,INSTAGRAM_PASSWORD
*********
    #IDとpasswordをコマンドライン引数から取得する
    parser = argparse.ArgumentParser()
    parser.add_argument('id')
    parser.add_argument('password')
    #コマンドライン引数を解析する
    account = parser.parse_args()

    #IDとpasswordを設定する
    INSTAGRAM_ID = account.id
    INSTAGRAM_PASSWORD = account.password
```
main.pyに関してはまた、別の記事で解説したいと思います。
## ログイン画面に移動
```python:instagram.py
self.get('https://www.instagram.com/accounts/login/')
sleep(3)
```
[こちら](http://qiita.com)が、instagramのログイン画面のURLです。
sleep(3)にしましたが、こちらは入力フォームが読み込まれるまで、Webドライバーで待機を設定してもいいかもしれません。
完成形では修正する可能性があります。
## ログインフォームにIDとPasswordを入力
```python:instagram.py
    sign_box = self.find_element_by_tag_name('form')
    sign_box.find_element_by_name('username').send_keys(INSTAGRAM_ID)
    sign_box.find_element_by_name('password').send_keys(INSTAGRAM_PASSWORD)
```
初めの一行で、入力フォームのブロックを指定しています。
instagramではIDの入力フォームのnameはusernameとなっているため、usernameをfind、send_keysで引数で設定したINSTAGRAM_IDを貼り付けます。
パスワードも同じです。
## ログインボタン押下
```python:instagram.py
#ログインボタン押下
    login_btn = sign_box.find_element_by_xpath('//button[@type="submit"]')
    login_btn.click()
```
formブロックの中をxパスでボタンを探します。
.click()でボタンを押下します。

# 最後に
　pythonはseleniumなど、画面操作に関するライブラリが多くあり、非常に簡単に行うことができます。

　私自身、pythonを触ったのがこれが初めてだったのですが、非常に便利だなという印象です。(.click()なんてjavascriptみたい)

　次の記事ではinstaloaderについて記述したいと思います。
instaloaderはinstagramからGUIを使用せずに情報を取得できる非常に強力なライブラリです。

　私が作成したことすたぐらむのクライアント側のコードは、seleniumとinstaloaderの2段構えで作成しております。公式サイトにすべての関数が載っており、instagramで行いたいことすべてが行えます。日本語でinstaloaderについて書かれてある記事は少ないですが、別の記事で紹介するサイトを参考にするとすべての関数は容易に使用できます。
是非ご覧ください。

また、ご指摘やご質問などございましたら、コメントよろしくお願いいたします。

# 参照サイト

https://tech.fragment.co.jp/python/twitter-instagram-follow-like/
【Rails】Rails６でのjQueryを使うときのwebpackerの設定

# 初めに

`Rails6`での`webpacker` の設定が分からなくなっていたのでここで書き残しておきます。

## 環境

- Rails 6.1.4
- Ruby 2.7.4
- webpacker 5.4.3

# webpacker

Rails6 の javascript の設定は config/webpacke の下にあるファイルで行います。
今回は jquery が使えるようにします。

## enviroment.js

```javascript:config/webpack/environment.js
const { environment } = require("@rails/webpacker");

const webpack = require("webpack");

environment.plugins.prepend(
  "Provide",
  new webpack.ProvidePlugin({
    $: "jquery",
    jQuery: "jquery",
    jquery: "jquery",
    Popper: ["popper.js", "default"],
  })
);
module.exports = environment;

```

## application.js

```javascript:javasccript/packs/application.js

require("@rails/ujs").start();
require("turbolinks").start();
require("@rails/activestorage").start();
require("channels");

import $ from "jquery/dist/jquery.js

globalThis.jQuery = $;
globalThis.$ = $;

```

これで jquery がエラーなく動きます。

# 参考

[Issue loading jQuery in Webpacker 5- stackoverflow](https://stackoverflow.com/questions/69831828/issue-loading-jquery-in-webpacker-5)
コマンドで文字列をmd5sum

ターミナル上で文字列のmd5sumをサクッと取る方法(備忘)。
```
// コマンド存在確認
which md5sum

// Macには入ってなかったので入れる
brew install coreutils

// 実行
echo -n "test" | md5sum

// 結果
// 098f6bcd4621d373cade4e832627b4f6 
```

:::note warn
`echo -n`にしないと末尾の改行も含めてmd5ハッシュ化されてしまいます。注意
:::
Create React AppのプロジェクトをReact17にダウングレードする

現状のCreate React AppはReact18でプロジェクトを作る。ただ、まだReact18に対応していないライブラリも多い。そのためReact17にダウングレードする方法を調べたのでメモする。

## 確認環境
MacBook Pro (16-inch 2019)
macOS Monterey 12.0.1
Node.js v14.17.1

## 手順

```sh
# プロジェクトを作る。今回はTypeScriptのプロジェクトで試した
npx create-react-app my-app --template typescript    
cd my-app

# 依存関係をReact 17系対応にする
npm install --save react@17.0.2 react-dom@17.0.2 @testing-library/react@12.1.5   
```

index.tsxを以下に書き換える。

```ts
import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";

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

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

```

これで、`npm start`することで実行できるようになった。

以上

## 参考
How to set React version to react@17 when i use npx create-react-app ? #12269

https://github.com/facebook/create-react-app/issues/12269

CreateReactAppでReact 18のプロジェクトを作るとエラーがでる

https://zenn.dev/kohski/articles/create-react-app-error-v18
Nuxt.jsのmiddlewareについて

フロントエンド弱者がNuxt.jsのmiddlewareをキャッチアップしたので記しておく。

## middlewareディレクトリを作成

Nuxt.jsプロジェクトの配下にmiddlewareディレクトリを作成します。そして適用させたいjsファイルを作成します。

```
 middleware/
 　├ auth.js
 　└ routerOption.js
```

## 特定のページにmiddlewareを設置したいとき

```js:pages/home.vue
export default {
      middleware: 'auth'
}
```

## 全てのページにmiddlewareを設置するとき

```js:nuxt.config.js
export default {
  router: {
    middleware: 'routerOption'
  },
}
```

### 注意

jsの処理が非同期の場合なためmiddlewareを設置してログインしているユーザーでないと閲覧できないページが一瞬レンダリングされることがありました。(middlewareの処理よりも先にレンダリングが行われてしまうため)

### 解決方法

Promiseやasync、awaitなどを使って同期処理を行うようにしましょう。middlewareの処理がきちんと行われてからレンダリングされるようになります。

```js:
import firebase from 'firebase/app'
import 'firebase/auth'

export default async function ({ redirect }) {
      return new Promise((resolve) => {
            firebase.auth().onAuthStateChanged((user) => {
                  if (!user) {
                        return redirect("/")
                  } else {
                        resolve()
                  }
            });
      });
};
```

## 参考文献

https://qiita.com/ono-ta/items/22ae1fc6c75ba75f4029

https://blog.cloud-acct.com/posts/u-nuxt-redirect-middleware/