OmniAICreator/Qiita-1.07M huggingface dataset:
【AWS】 Direct Connect

AWS Direct Connectはネットワーク回線を利用するAWS Site-to-Site VPNに比較すると、専用線接続による低レイテンシーで安全な接続が可能です。

AWS Direct Connect は50 Mbps から 100 Gbps までの速度で高性能な専用線接続を構成するサービスです。専用線をDirect Connectロケーションという中継地点に配置することで、直接にAWS側と物理的に接続することで高速なネットワーク接続を可能にします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412108/8ce8a74d-9f98-07e2-e4e5-b7ef51f5b3e0.png">


#### Direct Connect冗長化
<img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3412108/b4ad985d-6af4-cfef-9fcd-093046a2e78a.png">

#### セカンダリ設定に Site to Site VPN
AWS Direct Connect に対してセカンダリの接続設定としてIPsec (IP セキュリティ) を使用したVPC接続を追加することができます。VPN接続はDirect Connectに比較してトラフィック転送速度が遅いため、パフォーマンスが低下しますが、コストは割安。

通常は Direct Connect を使い、スタンバイに Site-to-Site VPN を採用することが多い。
Direct Connect 自体に障害が発生した際に有効な手段となる。
また、Site-to-Site VPN は Direct Connect 安価な場合が多いのでスタンバイのコストを抑えたい場合にも有用。
ただ、Direct Connect ほどのパフォーマンスが出ないので注意が必要。
ABC315回答メモ

0.はじめに
　キーエンスの名を冠しているので難しいと勝手に思い込み
　B,CでAC取れなかったのを何か見落としている条件があるんだ！と
　探してしまいました。

　結局ただのバグだったため、本来であればもう少し早くAC到達していたんだろうな
　と思える、惨憺たる結果でした。

　D問題も、時間があったら解けそうと思いましたが、翌日取り組んでみたら
　がっつり数時間かけ、解説を読み込んでやっととけたので、どちらにせよ
　C止まりではあったと思われます・・・。

　そんなこんなでレートも-30。緑どうこう言える次元ではなくなってまいりました。


1.A - tcdr
　先週学んだ文字列をリストに格納する方法で格納し
　順に呼び出しつつ、aiueoでない場合は回答文字列に転記
　最後に回答文字列を出力してACでした。

　https://atcoder.jp/contests/abc315/submissions/44711250

2.B - The Middle Day
　そこまで難しい問題ではなかったのに、はまってしまいました・・・。
　【考え方】
　　1)月ごとの日数リストを集計して1足したものを2で割って中間日Mを求める。
　　2)回答用変数ans1(何か月目かを保存初期値１)、ans2(何日目かを保存初期値0)
　　　を準備
　　3)月ごとの日数リストを順に読んでいきMと比較
　　　-Mより小さかったらans1に1を加算し、Mからその月の日数を減算
　　　-M以上だったらans2にMの値をセット
　　4)ans1とans2を出力
　　
　　考え方は間違っていませんでしたが、3のループで、M以上だった時に
　　ブレイクを入れ忘れ、WAが出てしまってました。
　　
　　何回かの試行錯誤ののち、間違いに気づき修正してACとなりました。

　https://atcoder.jp/contests/abc315/submissions/44748988

3.C - Flavors
　こちらも、解法はすぐ浮かんだのですが、記述ミスに気付かず時間を
　取ってしまいました。

　【考え方】
　　・満足度最高となるパターンは、以下の２つ
　　　パターン1)フレーバーが同じであるハンデをものともせずその圧倒的な美味しさで
　　　　満足度最高となる。
　　　パターン2)異なるフレーバーのハーモニーで順当に満足度最高となる。
　　・そこで美味しさが大きい順にアイス情報を並び替えて
　　　パターン1)同じフレーバで美味しさの合算値が最大となるパターン
　　　パターン2)異なるフレーバで美味しさの合算値が最大となるパターン
　　　の満足度をそれぞれ求め、大きい方を表示するという考えでロジック構築
　【実装】
　　1）Nを読みこむ
　　2)FとSをN回読み込み、リストLに、[S,F]の2次元リストとして登録
　　3)リストLを降順ソート
　　4)パターン1の組み合わせ用変数[美味しさ,フレーバのリストですべて初期値0,0]
　　　ans11・ans12とパターン2の組み合わせ用変数ans21・ans22を用意
　　5)リストLを頭から変数x（内部は[S,F]のリスト）読み込む
　　　5-1)ans11が[0,0]の時
　　　　-ans11とans21にxを転記
　　　5-2)5-1に該当しない、かつans12が[0,0]かつx[1]がans11[1]と同じ時
　　　　　(パターン１の2つ目のアイス)
　　　　-ans12にxを転記
　　　5-3)5-1・2に該当しない、かつ、ans22が[0,0]かつx[1]がans11[1]と異なる時
　　　　　(パターン２の2つ目のアイス)
　　　　-ans22にxを転記
　　　5-4)5-1・2・3に該当しない、かつ、ans12・ans22がともに[0,0]以外の時
　　　　　(パターン１・２の2つ目のアイスが定まっている)
　　　　-ループ終了
　　6)ans1=ans11[0]+(ans12[0]//2)、ans2=ans21[0]+ans22[0]をそれぞれ算出
　　7)ans1とans2の大きい方を出力して終了

　　ごちゃごちゃしているせいで自分で変数名を記述ミスしていて
　　最初の提出時にWAを食らってしまいました。
　　その後見直してACとなりました。

　https://atcoder.jp/contests/abc315/submissions/44755887

4.D - Magical Cookies
　最初は単純に縦横それぞれの行列毎に省いたフラグを持つリストを作り
　省いたフラグが立っていない行・列のみチェックするようにしたのですが
　LTEとなりました。

　次に、省いていない行列をそれぞれリストに持ち、チェックするようにして
　高速化を図りましたが、大して変わりませんでした。

　結局、解説を参考に、行列毎のアルファベット種類毎の出現個数を
　保持し、行・列ごとにすべて同じアルファベット種類の場合に列を消しつつ
　行側の消した行のアルファベット種の数量をマイナスする実装で
　ギリギリACとなりました。(pypyだとACでCpythonだとTLEでした。)


　https://atcoder.jp/contests/abc315/submissions/44783132


以上
SwiftUIでLazyVGridを使用して横幅に対して高さが１.２倍セルを表示する実装

現在SwiftUIを勉強中なので、さまざまなUIを実装しています。
画面サイズを取得して設定する練習として
SwiftUIでLazyVGridを使用して横幅に対して高さが１.２倍セルを表示する実装をしてみました。

Xcode Version 14.2

```LazyVGridSumple.swift
struct LazyVGridSumple: View {
    var body: some View {
        let deviceWidth = UIScreen.main.bounds.width
        let grids = Array(repeating: GridItem(.fixed((deviceWidth - 32)/3),spacing: 8.0), count: 3
        )
        ScrollView() {
            LazyVGrid(columns: grids) {
                ForEach((1...50), id: \.self) { num in
                    Text("\((deviceWidth - 32)/3)")
                        .frame(width:(deviceWidth - 32) / 3,height: ((deviceWidth - 32)/3) * 1.2)
                        .background(Color.green)
                }
            }
        }
    }
}
```

![スクリーンショット 2023-08-20 15.33.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/cca2fcd9-51dd-fa43-9ec0-1b7103632874.png)

内容としては
`let deviceWidth = UIScreen.main.bounds.width`
で横幅を取得します

３２という数字は左右のスペースとして８開けたいので８×4で３２です
※数字系は定数で定義したほうが良いです。。

あとはリスト内のテキストの大きさを横幅からスペースを引いた数を表示するセルの数、今回は３で割っています。
Power Automateとは何かを調べた

現在、非エンジニアとして勤務しているのですが、事務員をしていると、単純作業が多く、自分をロボットだと思い込んで作業しなくては気が狂いそうな単調作業は今まで自分でVBAを組んで対応しておりました。

しかし、このたび、タスクを自動化するためのフローを作成するツール？Power Automateが使える様になったと、社からお知らせがありました。
Microsoftのソフトは全く知らないのでWindows11を持っていれば無料で入れられるPower Automate Desktop（PAD）なるものを早速家のMacにも入れて触ってみました。
※ Macにparallels Desktopを入れてWindows11を動かしています。Retina環境でWindowsができて快適です。
どうやらMacに何十年も前からついているコイツと同じっぽいということはわかりました。![スクリーンショット 2023-08-20 15.18.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14960/c48194f0-cad6-088d-4b22-87024c928ec3.png)
とはいえ、コイツも使ってないので、ちょっと色々調べてみました。

# Power Automate(クラウドまたは365のやつ)とPower Automate Desktopは全く別物
実は社内で使えるのはPower Automate(365の方でクラウドで使用するもの)であり、PADとは全然別物ということがわかりました。
※ 以下、クラウド版はPower Automate、Power Automate DesktopはPADと記載します。
## Power Automateでできないこと
* Power Automateでは、PCにインストールされたOutlookやメールソフト、Excel、Word、PowerPointなどのアプリを操作することは出来ない。
あくまでSharePointやOneDrive内の保存しているファイルの操作、Teamsの操作などWebサービス同士の連携をするためのものなのです。他者のアプリなどは、契約のプランによってコネクトできるアプリが異なります。
* また、Windows自体の操作…例えばエクスプローラーでファイルを自動的にフォルダ分けしたり、削除したり、ということも出来ません。
* ただ、Excelなどの場合はOneDriveなどのクラウドストレージに保存することで、Excel Onlineなどからシートの編集を操作することも出来ますので、ソフトによっては可能…という感じ

## PADでできないこと
* PADは、Webサービスを含めた自動化が出来ません。
あくまでPC内のソフトウェアやWindows自体を自動化するものですので、Webサービスは対象外ということになります。PCにあらかじめインストールされているソフトの操作ができる。
* ただ、Windows上からの操作でWebサービスを動かすようなもの…例えば「特定フォルダにファイルを置いて、Dropboxの同期を動かす」というようなことは、可能といえば可能です。
* ただし、Webサービスの画面上で設定変更したり、なにかを動かしたり、という操作はPADでは難しいとのことです。
上記、参考サイト　→ 

少し触ってみたけどGUIがだるすぎるので、VBAでいいかなって思いはじめています。。。が、もう少し調べてみます。
ショートカットappが「ヘルパーアプリケーション~~」と言い出して使えないので、applescriptでどうにかする。

⚠️mac限定だと思います。iphoneでも「ヘルパーアプリケーション~~」というerrorはあるらしいですが、幸い自分はmacでなったので、解決はできずとも、問題の回避ができました。  

#### 内容
macでショートカットを実行すると、「ヘルパーアプリケーションと通信できませんでした。」と出て強制終了され、ショートカットアプリが使い物にならなくなりました。   
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1278266/196467ac-a3d8-62e8-a871-45ab8a215e55.png">

原因は何か考えた時、おそらくですが、macをクリーンインストールする際にicloud連携を切り忘れたことだと思います。   
icloudに入り直したり、セーフブートなど色々やりましたが解決できず。   
問題の解決は諦めることに。   
で、少し使っていると、エラーを吐くまでに一瞬の間時間があり、すごく短い処理ならエラーの前に終わって、普通に実行できることがわかりました。   
そのため、苦肉の策として、applescriptでappを作って、それを実行することにしました。   


1. appを作る。
- スクリプトエディタを開き、新規作成
- applescriptでやりたいことを書いて「ファイル」→「書き出す」
- 名前,保存場所を適当に変え、「ファイルフォーマット」を「アプリケーション」にして保存
2. ショートカットから起動
- 新規にショートカットを作成
- 「appを開く」を追加
- appの部分で、さっき作ったものを選択   

以上で実行できるようになります。   
問題点は   
- ショートカットのGUIが使用できない。
- ショートカットからの変数受け渡しができない。   

ショートカットのGUIに関してはapplescriptで似たようなことを簡単にできるので、あまり問題にはならないかと思います。   
変数の受け渡しができない、これは自分はもうしょうがないので、クリップボードを挟んでどうにかしました。   

ここまで見て、「shellで実行」したり「applescriptで実行」でいいのではと思われるかもですが、これだと実行はショートカットの判定になり、途中で切断されてしまいます。   


#### applescriptでの色々   
実際のコードで使ったapplescriptのいろいろです。   
- 実行画面なしでshellscriptを実行
  `do shell script "cd ~~"`
- 結果を変数に代入
  `set value1 to do shell script ""`
- ターミナルでwindow開いて実行
  ```
  tell application "Terminal"
  	activate
  	do script with command "conda activate " & mySelect
  end tell
  ```

- 文字列を区切り文字(repStrに入れたもの)で区切ってリストに
  http://www.adg7.com/takenote_b/2009/03/06applescripts-text-item-delimiters.html
  ```
  set repStr to " "
  set OriginalDelimiters to AppleScript's text item delimiters
  --元々の区切り文字を保存しておく。決まり事として必ず使う
  set AppleScript's text item delimiters to {repStr} --区切り文字を" "にする
  set value1 to text items of env_list --","区切りでリストにする

  set AppleScript's text item delimiters to OriginalDelimiters
  --もともとの区切り文字に戻しておく。これも決まり事。
  ```
- リストから選択
  `set mySelect to choose from list value2`
  <img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1278266/dd195506-8cfe-3255-cdf6-fe75b72dc368.png">
- ダイアログ表示   
  `display dialog "Done"`
- リストの1つ目を変数に入れる(indexは0でなく1始まり)
  `set mySelect to item 1 of mylist`
- 変数にリストを入れる
  `set list_ to {"value1", "value2"}`
- 入力を要求
  http://tonbi.jp/AppleScript/Introduction/07/
  `set value1 to paragraph 1 of text returned of (display dialog "入力してね!" default answer value2)`

- 文字列の中で変数を使用(変数はxとします)
  ```
  set x to "world"
  display dialog "Hello, " & x & "!!!"
  ```

- クリップボードの内容を変数に
  `set url__ to the clipboard`

- リストから選択してアイテム番号を返す
  http://piyocast.com/as/archives/1000
```
set aList to {"red", "blue", "green", "white"}
set aMes to "項目を選択してください"
set aRes to retItemFromListByItemNo(aList, aMes) of me
–> 3 (選択したアイテムの番号（１はじまり）が返る
–リストから選択してアイテム番号を返す
on retItemFromListByItemNo(aList, aMes)
　　set aRes to choose from list aList with prompt aMes
　　if aRes = false then return 0
　　
　　set aRes to contents of item 1 of aRes
　　set hitNum to 1
　　repeat with i in aList
　　　　set j to contents of i
　　　　if j is equal to aRes then
　　　　　　exit repeat
　　　　end if
　　　　set hitNum to hitNum + 1
　　end repeat
　　return hitNum
end retItemFromListByItemNo
```
VirtualBox に Windows98をインストール

### VirtaulBoxにWindows98をインストールすると・・・
１．MS-DOSの互換性環境（MS-DOSモード）が使えるようになる
２．英語モードでquick basicが使える
３．IIS4.0（PWS）が使える　注意：CodeRedに感染するバージョンです。
４．Windows3.1で使用していたProgramマネージャ等が使用可能
   Win3.1用のプログラムを使うことが出来る。

## インストール直後は800×600の16色モードが最大画面
下記サイトから仮想ディスプレイマネージャをインストールしないと実質フルカラーで使えるのは640×480しか使えない。

https://bearwindows.zcm.com.au/vbe9x.htm
WSL2 の Ubuntu 22.04.2 で Docker インストール時 "repository (略) does not have a Release file." のエラーが出る

# 事象
Docker をインストールしようとした時に以下のようなエラーが発生する

> The repository 'https://download.docker.com/linux/ubuntu $(lsb_release Release' does not have a Release file.

ぱっと見 `$(lsb_release Releas` のあたりが怪しい。リポジトリ先の設定が上手くいっていないよう

# 解決策
エラー文で検索すると似たような事案を発見。
https://stackoverflow.com/questions/68712058/docker-installation-problem-ubuntu-20-04-lts-e-the-repository-https-down

> /etc/apt/sources.list.d/docker.list? 

> anyway, mine says deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu   focal stable – 
jabbson
 Aug 9, 2021 at 12:40

このあたりを見て、 `/etc/apt/sources.list.d/docker.list` を以下のように編集

```
# deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable
deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu  focal stable
```

(念のためコメントアウトにしていたが1行目は不要)
以上の修正により無事リポジトリ更新と docker インストールに成功。

# 参考
- https://qiita.com/tsuzuqiita/items/bd4707ae3d2974b9e8ec
- https://stackoverflow.com/questions/68712058/docker-installation-problem-ubuntu-20-04-lts-e-the-repository-https-down


## 備考
実行手順を見直していて思ったがリポジトリ設定時にバックスラッシュが不要な可能性...?

```sh
☁  ~  echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```
Next.jsってそもそもなんで必要なんだっけ

## 1. まずは基本から！React.jsとは？
React.jsはFacebookが開発したフロントエンドのライブラリ。コンポーネントという小さな部品を組み合わせて、動的なユーザーインターフェースを構築するのが得意。SPA (Single Page Application) での開発が主流で、ボタンやフォームなどのUI部品を効率よく作れるんだ。


<font color="Red">あれ....?</font> じゃあReactでもう良くない...?


**結論**
<font color="Blue">ページ数が少ない小規模</font>な開発なら`React`!大規模なら`Next.js`か他のやつ！

<font color="MediumVioletRed">ページ数が多い大規模</font>の開発なら`React`だと読み込み遅くなっちゃう！


## 2. じゃあ、Next.jsって何？
Next.jsはReactの上に乗っかってるフレームワーク。このNext.jsの一番の魅力は、**サーバーサイドレンダリング(SSR)** と **スタティックサイト生成(SSG)**。これにより、クライアントサイドのスペックに依存せず、サーバーサイドでの前処理を強化できる。特にスペックが低いデバイスでもサクサク表示されるのが特徴だ。

### 2.1 サーバーサイドレンダリング(SSR) とは？
SSRは、ユーザーがページをリクエストするたびに、その都度サーバーでHTMLを生成する方法。これにより、クライアントが受け取るHTMLは最初から内容が詰まっているため、表示が高速。また、SEOにも有利なんだ。

### 2.2 スタティックサイト生成(SSG) とは？
SSGは、ビルド時にあらかじめページのHTMLを生成する方法。要は、ユーザーがアクセスする前にすでにページが準備されている状態。これにより、アクセス時のサーバーの処理が極めて軽減され、超高速にページを配信できる。


## 2.3 SSGとSSR、どっちを使うべき？

**サーバーサイドレンダリング(SSR)のメリット:**
- ダイナミックなコンテンツが必要なときに強い: データベースからの最新のデータをリアルタイムで取得して表示できる。
- SEOに強い: 検索エンジンがクロールする際、すでに完成されたページの内容を確認できる。
- 初回表示が早い: クライアント側でのJSの実行を待たずとも、ページの内容が表示される。

**スタティックサイト生成(SSG)のメリット:**
- 高速: 一度生成されたページは静的ファイルなので、配信がとても速い。
- セキュリティ: ダイナミックな処理が少ないため、セキュリティリスクが低減する。
- ホスティングが簡単: 静的ファイルをサーブするだけなので、シンプルなホスティングで良い。

**じゃあ、どっちを使えばいいの？**
- 頻繁に更新されるデータやリアルタイム性が求められる場合: **SSR**。
- コンテンツの更新頻度が低い、またはページを高速に表示したい場合: **SSG**。

Next.jsの魅力は、SSGとSSRを<font color="Red">ページごとに使い分けすることができる点</font>。やばいよね。
ページや状況によって、最適な方法を選べるのがすごく便利。

## 3. どっちを選べばいいの？
ReactはUIライブラリとしての役割がメイン。でも、大規模なプロジェクトやSEO対策、高速表示が必要な場合はNext.jsの力が必要。Next.jsを取り入れることで、Reactのコンポーネントの強みはそのままに、読み込み速度やSEO面での強みも手に入るんだ！

## 4. まとめ: Next.jsはReactのパワーアップ版？
そうとも言えるね。Reactはすごいけど、Next.jsと組み合わせることでさらにその力を引き出せる。特に、読み込み速度やSEO対策が必要なプロジェクトではNext.jsの出番。だから、それぞれの特徴を理解して、プロジェクトに合わせて選んでください！
バックエンドエンジニアの将来性

## はじめに
将来性の有無を決める項目は以下の通り
１）年収
２）将来性があると考える人／無いと考える人の意見調査


## バックエンドエンジニアの前提知識
▼**仕事内容**
WebサービスやWebアプリケーションなどにおいて、ユーザー側の目に触れないシステムの開発・設計を中心に担当する

**具体的に**
１）**サーバ構築**
Webサービスにおける会員登録や金額計算など
２）**プログラム開発**
３）**保守・運用**

▼**サーバサイドエンジニアの違い**
**サーバサイド**：サーバ側
**バックエンド**：サービス利用者に見えない方
※担当領域が解釈によって違うという意見もあるが、<font color="red">**ほぼ同義**</font>と考えていい

## 調査
▼項目
１）[年収](#年収)
２）[将来性があると考える人／無いと考える人の意見調査](#将来性があると考える人／無いと考える人の意見調査)

### 年収

<hr />

▼**調査する前の前提(平均値・中央値)**
・国税庁「[令和3年分民間給与実態統計調査](https://www.nta.go.jp/publication/statistics/kokuzeicho/minkan2021/pdf/002.pdf)」によると、年間の給与所得者の**平均年収**は<font color="red">**433万円**</font>であることが示されている。
　・男性：**570万円**
　・女性：**302万円**

・厚生労働省の「[厚生労働省2020年家計調査](https://www.mhlw.go.jp/toukei/saikin/hw/k-tyosa/k-tyosa19/dl/03.pdf)」によると、日本の全年齢の**中央値**は<font color="red">**437万円**</font>

<hr />

▼**本題**
・[バックエンドエンジニアの全体的な平均年収は？向上させるための4つの方法も解説](https://miraie-group.jp/sees/article/detail/backendengineer_income_average)

・バックエンドエンジニアの年収は<font color="red">**400万円～800万円ほど**</font>
　・20代：**380万円**ほど
　・30代：**530万円**ほど
　・40代：**640万円**ほど
　👆『バックエンドエンジニア』の年収調査を大々的に行ってる所は無く、企業のデータによりけりなので、あくまで目安としてのデータ

<hr />

### 将来性があると考える人／無いと考える人の意見調査
▼**将来性があると考える人**

**引用元**
・[バックエンドエンジニアの将来性が高いといわれる3つの理由](https://freelance-mikata.com/columns/3588/#3)
・[アプリケーションエンジニアはオワコン？将来性や現在の需要を解説](https://unison-career.com/engineer-media/5003/#1-2)

１）<font color="red">**Webアプリケーションの需要は高まり続けているため**</font>
　・「[DX白書2021](https://www.ipa.go.jp/publish/wp-dx/qv6pgp0000000txx-att/000093699.pdf)」によると、日本ではサービス業を除く他の業界が半数以上、米国では全業界が半数以上、DXへの取り組みが行われている
　<img src="https://i.ibb.co/mTcHbdC/2023-08-20-130228.png" width="70%">
　・また「[IT人材供給に関する調査](https://www.meti.go.jp/policy/it_policy/jinzai/gaiyou.pdf)」によると、需要は伸びていくにも関わらず、人材の不足が示唆されていることが分かる。さらに2030年までには30万人～79万人が不足になると予想されている。
　<img src="https://i.ibb.co/QbpqmbN/2023-08-20-130956.png" />
　・このことから、今後の人口減少の観点からWebアプリケーションの開発によって人手不足を補う必要があり、様々な業界でIT化がさらに加速する可能性が高い

２）<font color="red">**バックエンドエンジニアの仕事内容は幅広いため**</font>
３）<font color="red">**大規模な開発にバックエンドエンジニアは欠かせないため**</font>
　・**サーバー**・**セキュリティ**・**データベース**の領域はバックエンドエンジニアの仕事であり、Webアプリケーションに限らず多くの領域で必要な業務になる以上、**潰しがきかない**

▼**無いと考える人の意見調査**
前提として、「需要が縮小する可能性」について調査する

**引用元**
・ [バックエンドエンジニア不要論とFirebaseに関する僕の見解](https://youtu.be/N_pSLxOp310)

１）<font color="red">**担当領域が部分的にMBaaS系サービスによって代替されるのは確実**</font>
※**MBaaS**：「Mobile Backend as a Service」の略。モバイルアプリのバックエンドサーバー機能を肩代わりしてくれるクラウドサービス　ex) Firebase・AWS
　・Firebase等のmBaaS系のサービスが旧来のバックエンドエンジニアの担当領域を一部置換していくのはほぼ確実だが、それは**一部のユースケースにとどまる可能性が高い**(そのサービスだけでは要求を満たせない項目が出てくる為)。
　・『バックエンドエンジニアは安泰だ』と言いたいわけではなく、どの分野においても技術の進歩によって従来の技術が陳腐化する事は十分にあり得る。これは世の原理である。

<hr/>

**個人的に思ったこと**

###### 「○○という技術によって一部代替されていく」という記事はたくさんあったが、それ以外で需要が縮小する可能性について見解を述べている人は現状見当たらなかった。
👆専門職である以上、技術発展に伴って便利化が進むのは当たり前。だからと言って全ての技術を代替してくれるサービスはそうそう現れない為、基本的に「**この手の論法で需要が縮小する**」というのは意識しなくていい気がした。


## まとめ
バックエンドエンジニアの年収は、日本全体の年収や中央値と比較しても30代を超えると高い傾向にあることが分かった。また技術面で見ても需要が縮小する可能性はあまり無いように見えたし、それ以上にDXへの取り組み状況が高い点やIT人材不足の現状がある点から需要は拡大するようにも考えられるので、バックエンドエンジニアの将来性はまだまだ高いと結論付ける。
S3のウェブサイトホスティングとRoute53の連携方法


:::note info
S3からウェブサイトホスティングを行う場合、Route53と連携するかS3のアクセス許可を設定するか二つ方法があります。
今回は忘れないように、重要なポイントだけをメモしておきます。
:::

# 構成図
```mermaid
graph TD;
    Web-->Route53;
    Route53-->S3;
```

# S3のアクセス許可を設定する方法
アクセス許可を設定する場合、S3のバケットポリシーを設定する必要があります。
```
{
    "Version": "2012-10-17",
    "Id": "HTTP referer policy example",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::{S3 bucket name}/*"
        }
    ]
}
```

# S3のバケット作成
S3のバケットを作成する際、バケット名はレコード名と同じにする必要があります。
そうじゃないと、Route53と連携できません。

# S3のウェブサイトホスティングを有効にする
S3のバケットを作成した後、ウェブサイトホスティングを有効にする必要があります。
![S3のウェブサイトホスティングを有効にする](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518634/13ebc5b5-e318-e7a5-6804-afebf26f157a.png)
【C++】vectorで要素を削除するときに使う関数

C++のvectorを中心とするコンテナクラスで、要素を削除する際によく使う関数です。

## pop_back関数
末尾の要素を削除する。

```C++
vector<int> vec = {1, 2, 3, 4};
vec.pop_back(); // {1, 2, 3}
```

## erase関数
指定した要素を削除する。削除したい要素を指すイテレータを引数に指定する。

```C++
vector<int> vec = {1, 2, 3, 4};
vec.erase(vec.begin + 2); // {1, 2, 4}
```

イテレータで範囲を指定すると、連続した複数の要素も削除できる。
```C++
vector<int> vec = {1, 2, 3, 4, 5, 6};
vec.erase(vec.begin(), vec.begin() + 2); // {4, 5, 6}
```
erase関数で要素を削除すると、削除された要素より後ろにある要素は前に詰められる。
つまり、末尾のイテレータは更新されて**コンテナサイズも小さくなる**。


## remove関数
指定した要素を取り除く。
第一引数、第二引数でイテレータで範囲を指定して、第三引数に削除したい要素を指定する。
remove関数は取り除いた後の有効領域の末尾の次を指すイテレータを返すので、それを用いて続きの処理を行う。

```C++
vector<int> vec = {1, 0, 2, 0, 3, 0, 4, 0};
auto newEnd = remove(vec.begin(), vec.end(), 0);
for(auto it=vec.begin(); it != newEnd; ++it){
    cout << *it << " "; // 1 2 3 4
} 
```
注意点として、erase関数と異なり、要素を取り除いた後の無効領域は残ったままになる。
つまり、コンテナサイズ自体は変わらないので、戻り値を使用せずにend関数や範囲for文を使用する際は注意が必要になる。



## unique関数
連続した重複する要素を削除する。
unique関数も、remove関数と同様に削除した後の有効領域の末尾の次を指すイテレータを返すので、それを用いて続きの処理を行う。
```C++
vector<int> vec = {1, 2, 2, 2, 3, 4};
auto newEnd = unique(vec.begin(), vec.end());
for(auto it=vec.begin(); it != newEnd; ++it){
    cout << *it << " "; // 1 2 3 4
} 

```
注意点として、remove関数と同様に、要素を取り除いた後の無効領域は残ったままでコンテナサイズ自体は変わらない。
戻り値を用いずに、end関数や範囲for文を使用する際は注意が必要になる。

## clear関数
全要素を削除する。
```C++
vector<int> vec = {1, 2, 3, 4};
vec.clear(); // {}
```
JavaScriptにおけるthisの周辺知識と、this

# thisを一言でいうと
JavaScriptにおけるthisは、どこで実行するかで値が変わってしまう、
特殊なキーワードである。

## thisを説明しようすると出てくる単語について
thisを理解しようとする時大抵の場合はGoogleしてmozillaの解説を見たりするのだが、
結局以下のような単語も出てきてしまう。するとそれに対する理解も不足していると気づく。

- グローバルオブジェクト
- グローバルコンテキスト
- strictモード
- ブラウザのwindowオブジェクト

...などなど。

## 周辺知識

この問題を解決するために以下のことを調べた。
実際this自体は「使い所によって意味が変わる」と思っておけばいいのだが、
その意味がどのようになるかを調べる段階で以下のことを知っておく必要がありそうだ。
この記事ではthis自体の意味というよりその周辺知識を見ることに専念する。

- そもそもキーワードって何?
- strictモードって何?
- グローバルオブジェクトって何?
- ブラウザのwindowって何?
- Node.jsとの違いは?
- モジュールシステムって何?

## キーワードとは？
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Lexical_grammar

大抵のキーワードは、予約されている(= 変数の宣言、関数の宣言の時に使えない)
twitterでidとろうとしたら他のユーザが使っている的なイメージ。

## strictモードとは? 

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

別名厳格モード。一部の機能を制限する。
これをオフにするメリット: 
未熟な開発者にも優しい言語となり、
エラーとすべき一部の動作が許される。
これをオンにするメリット:
エラーを厳格に出すことでその場で対処することを開発者に強いる。
後々大きな問題になることを未然に防げる。

## グローバルオブジェクトとは?

一言で言うとプログラムのどこでも呼び出せるように定義されたオブジェクトのことで、
JavaScriptには必ず設定されている。

## ブラウザにおけるWindowオブジェクトとは

「ブラウザのウィンドウ」をJavaScriptで表すためのもの。
(自分たちが見ているブラウザのウィンドウ = Windowオブジェクトでは、必ずしもない。)
その中にDOMが入っている。さらに、DOMの中に入っているdocumentというプロパティが、
ウィンドウの読み込んだDOMの、documentオブジェクトを表している。

## DocumentとDOMツリー

DOMツリーとはざっくりいうとHTMLの階層構造をブラウザが解釈するために、
使用するツリー状のデータ構造のことである。

DOMツリーの一番上にあるのがDocumentである。

EventTarget <- Node <- Document
このような関係になっており、DocumentはEventTarget, Nodeのプロパティもうけつぐ。

## Node.jsとブラウザの違い

ブラウザではトップレベルのスコープが伝統的にグローバルスコープとなっている。
なのでブラウザのコンソールで`var something`と、コードを実行するとグローバルに変数が作成される。
つまり、window.somethingができる。

一方各Node.jsのファイルは独自のスコープを持つ。
Node.jsのモジュールで、var somethingとすると、
それがCommonJSモジュールにしろ、
ECMAScriptモジュールにしろ、そのモジュールのローカル変数になる。

## ECMAScript vs CommonJS

ECMAScriptモジュール(ESM)はES６で導入された、JavaScriptの標準モジュールシステム。
CommonJSはNode.jsで広く使われるモジュールシステム。
ただし、Node.js 12以降であれば、package.jsonに`"type": "module"`と設定することでファイルをESMとして扱える。

## ESM独自の機能

ESMは非同期でコードを読み込んで、動的にモジュールをインポートすることができる。
未使用のコードをビルドツールが取り除いてくれたりもする。


## やっとthisの話をする

非strictモードでの通常の関数の中でthisは、グローバルオブジェクトを指す。

```javascript

function test() {
    console.log(this);
}
test();
```
ブラウザのコンソールでこれを実行してみるとこうなる。

![スクリーンショット 2023-08-20 14.20.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3305333/6690fc49-4cf9-bbb8-7bf2-c63ea7178b2a.png)

確かにwindowが返ってきている。

ちなみに厳格モードを使うと同じ関数の結果がundefinedになる。

厳格モードでは、自動的にthisをグローバルオブジェクトに設定するような挙動は、
バグの原因と考えて排除しているわけである。

![スクリーンショット 2023-08-20 15.10.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3305333/394b0af9-3cfe-ec48-3ae9-3a6443691227.png)

この記事は非厳格モードで記述されている。

## 2.オブジェクトのメソッド

として呼ばれると、thisはそのオブジェクト自体を指す。

```javascript
const obj = {
    name: 'Bob',
    sayHello: function() {
        console.log(`Hello, ${this.name}`);
    }
};
obj.sayHello(); //　'Hello, Bob'とコンソールに出る
```

## 3.コンストラクタ関数

として呼ばれると、thisはその生成された、インスタンスをさす。

```javascript
function Person(name) {
    this.name = name
}

const alice = new Person('Alice');
console.log(alice.name);　//　"Alice"
```
Lenovo ideapad330-15IKBにSSD換装とメモリ増設を行った

# なぜしたか
Ubuntuを入れたノートPCが思ったより動作が鈍いことを相談したところ、SSDとメモリをもらったので、自分で換装と増設を行うことにした

# 換装・増設前のスペック
スペックは以下の通り
| CPU | メモリ | ストレージ |
|:-:|:-:|:-:|
| Core i3-7020U  | 4GB  |  HDD1TB |

参考までに起動までのタイムを計測したところ2:06でした
まぁ遅い
![IMG_0010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445203/64a1357d-8679-b0db-6587-0f9bc6fb2769.jpeg)

# 換装するSSDと増設するメモリ
今回いただいたSSDとメモリは以下の通り

| SSD | メモリ |
|:-:|:-:|
| 512GB  | 8GB  |

![PXL_20230819_013857709.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445203/a9c17159-a561-70d4-ba23-4f3a944d7f9c.jpeg)

※SSDは厚さ7mmでなければ換装できません

# 作業手順
換装・増設の作業は思った以上に簡単でした。初めての人でも1時間もかからないと思われます

## 裏蓋を外す
ノートPCの中身にアクセスするために、裏蓋をまず外します。

![PXL_20230819_015625821.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445203/ac72fcfd-10bc-71e9-dad1-a5935b8a0ecf.jpeg)

裏側のくぼみにあるネジをすべて外し、ノートPCを開閉する箇所の隙間にギターのピックや薄いへらを差し込みながら、ノートPCの外周を沿うように外すと綺麗に裏蓋を取ることができます。

![IMG_0014.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445203/2f2cff3e-7b16-230c-1772-3b7cfafcffdc.jpeg)

取れた様子がこちらです。すでにメモリの増設スロットとHDDが見えます

※ロットによって増設スロットがない場合がある
※ネジは特殊なものではないので、一般的なプラスドライバーで取れます


## SSD換装
まず、既存のHDDの撤去から始めます。下図の赤線付近をつまんで上に持ち上げると容易に外すことができます

![IMG_1014.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445203/9feca706-18c2-36d1-4f81-3fa69bcc8382.jpeg)

外すとアルミとHDD本体が分かれます

![PXL_20230819_014435912.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445203/931d2a57-0b61-a140-b1da-cf64cf21ce32.jpeg)

アルミにSSDを装着し、元の通りに戻すと作業完了です

![PXL_20230819_015236491.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445203/98454724-0704-ea73-6e25-8d768cf69817.jpeg)




## メモリ増設
メモリは切り欠きがあるので、それに合わせてスロットに斜めに差し込み、横爪がカチッと鳴るまで押してあげると上手く行きます

![PXL_20230819_014055620.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445203/a10858b2-ad03-e071-243d-b4dcb5e7cb5c.jpeg)

:::note warn
今回はバッテリーを外さずに作業をしていますが、本来、ノートPC内部にアクセスするときはバッテリーを外してから作業するほうが望ましいです。外さずに作業をするのは、故障の原因になりかねません
:::

## 裏蓋を閉じる・動作確認
ここまでの作業が終わったら、裏蓋を閉じて電源をつけてください

BIOSやシステムのプロパティで反映されているかを確認してください

![PXL_20230819_0241c54881.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445203/c636dc84-9675-ac88-71cb-f646fbabaa05.jpeg)

確認できたら作業終了です

# SSD換装・メモリ増設後のスペック

| CPU | メモリ | ストレージ |
|:-:|:-:|:-:|
| Core i3-7020U  | 12GB  |  SSD512GB |

Linuxを動かすには充分な性能になりました
立ち上げのタイムも18秒とめちゃくちゃ早い
![IMG_015.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/445203/5d14084b-be0d-23b6-ceb0-a26575ab159b.jpeg)

# 使用感・感想
作業後、開発環境構築などで触っていましたが、フリーズも遅延も発生せず、とても快適な操作感でした。素晴らしいものです。今後は、開発PCとして運用していきたいと思います

# 今後の展望
次はJavaとかで記事書くかもしれん
TypeScriptでコールバック関数を知る

# 目的

ブルーベリー本でTypeScriptを学習していたが、コールバック関数がいまいちピンときていないのでもう少し詳しく知る

# コールバックとは

コールバックは、コールバック関数とは、他の関数に引数として渡される関数のことを指します。

特定の操作が終了した後や、ある条件が満たされたときに実行されるように設定され、ネットワークへのリクエストやファイルからの読み込みといった非同期処理を行う際によく利用されます。

## なんとなく分かったけど、もう少し具体的に言えない？

ChatGPTに中学1年生でも分かるように説明してもらいました。

---

コールバック関数を考える時、友達に「宿題が終わったら、すぐに電話してね！」と頼む場面を想像してみてください。

この場面で、あなたは友達に2つのことを頼んでいます。

1. 宿題を終わらせること。
2. 宿題が終わったら、電話をかけること。

この**「宿題が終わったら電話をかける」**部分がコールバック関数の考え方に似ています。
つまり、一つのタスク（宿題を終わらせること）が完了した後に、次のタスク（電話をかけること）を実行するという流れです。

プログラムの中では、**何かの処理が終わった後に、次にやるべき処理を「関数」として渡すことができます。その渡された関数（次にやるべき処理）が「コールバック関数」**　です。

例えば、コンピュータの中のタイマーを使って「5秒後にアラームを鳴らす」プログラムを作る場合、5秒後に実行する「アラームを鳴らす」部分がコールバック関数になります。

---

実際にソースコードにしてもらいました。

```tsx
// コールバック関数の型定義
type Callback = () => void;

// 宿題をする関数
function doHomework(callback: Callback) {
    console.log('宿題をしています...');
    // 擬似的に宿題にかかる時間を表現するためにsetTimeoutを使用します
    setTimeout(() => {
        console.log('宿題が終わりました！');
        callback(); // 宿題が終わった後、コールバック関数を実行
    }, 5000); // 5000ミリ秒後（5秒後）に宿題が終わったとします
}

// 宿題が終わったら電話をする関数（コールバック関数）
function callFriend() {
    console.log('友達に電話をかけています...');
}

// 宿題を開始し、終わったら友達に電話をする
doHomework(callFriend);
```

この例で、**`doHomework`** 関数が「宿題をする」部分を、**`callFriend`** 関数が「宿題が終わったら電話をする」部分を表しています。

そして、**`doHomework`**の中でコールバック関数として**`callFriend`** が呼び出されています。

# まとめ

コールバック関数とは「私の仕事が終わったら、あなたがこれをやってね」という指示をする関数のこと
DatabricksのワークフローでIf/Elseの条件分岐が使えるようになってたので試してみた件


[Databricksのワークフロー](https://docs.databricks.com/ja/workflows/index.html)はデータエンジニアリング、AI、データアナリティクスの処理からなるパイプラインを作成できる機能です。一部ワークスペースでif/elseの条件分岐のタスク機能がパブリックプレビューとなっているので早速試してみました。

:::note warn
注意
本機能はパブリックプレビュー中のものです
:::

## If/Else条件分岐タスクとは

If/Else条件分岐タスクは、以下のワークフローの中で赤四角で囲んだタスクです。タスクの条件式の判定結果により、それぞれ別のタスクが次に実行されることになります。
![スクリーンショット 2023-08-20 8.32.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663175/4e56dce0-2d0f-843b-14f7-eb0ece851ade.png)

## 作り方

If/Else条件分岐タスクの作り方を見ていきましょう。

手順１： ワークフローの編集画面で[+Add task]ボタンをクリックすると一番下に[If/else condition]が出てくるのでこれを選択します。

![スクリーンショット 2023-08-20 8.10.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663175/d181099d-25b7-8cff-f8c0-15f4815014f9.png)

手順２：　タスクの情報を設定する画面で、Expressionのところに判定条件を設定します。[Browse dynamic values]をクリックすると、判定条件で使える各種の動的なパラメーターを確認することができます。各種情報を入力して[Create task]をクリックして作成完了です。
![スクリーンショット 2023-08-20 8.11.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663175/3fbd9639-efdc-ee74-d7a7-2a55620dd7d0.png)

判定条件で使える動的な値のリスト
![スクリーンショット 2023-08-20 8.17.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663175/71d20a82-0958-5c33-ef26-d441e145facb.png)

手順３： 下流のタスクを作成する際、依存するタスクとして、条件判定タスクの判定結果がTrueの場合と、Falseの場合を選択できるようになっているので、選択します。
![スクリーンショット 2023-08-20 8.19.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663175/2741b55a-c6fb-a29d-a82b-63f3e69ca085.png)


## 実行結果の例

~~他に良い例が思いつかなかったので~~ランダムに生成した整数が偶数か奇数かで処理を分岐させるワークフローを試しに作ってみました。

最初のタスクで以下のように整数を生成し、その整数が偶数かどうかをis_oddというタスク値に設定します。
```python
import random
random_int = random.randint( 1, 100 )
dbutils.jobs.taskValues.set( key = 'my_int', value = random_int )
dbutils.jobs.taskValues.set( key = 'is_odd', value = ( random_int % 2 == 1 ) )
```

If/Else条件分岐タスクのExpressionで、{{tasks.<タスク名>.values.<タスク値名>}}の形式で、上流タスクで設定されたタスク値を参照できます。以下のようにis_oddがtrueかどうかで処理を分岐するように設定します。
![スクリーンショット 2023-08-20 14.04.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663175/c643e956-a218-2f26-878c-d3d4331927c7.png)

このワークフローを実行すると、整数が奇数の場合はtrueの方のタスクが、偶数の場合はfalseの方のタスクが実行されることを確認できました。
![スクリーンショット 2023-08-20 14.12.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663175/decbe060-a820-14bd-8abc-94600b36db07.png)
![スクリーンショット 2023-08-20 8.29.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2663175/62bd2121-191c-06ac-9af9-b6c0278bc479.png)

## 活用例

If/Elseの条件分岐はパイプラインにとっては重要な機能になります。例えば以下のような場面で活用できそうです。ワークフロー機能がだんだんと充実していっていますね。
- AIモデルのメトリクスが基準値以下の場合に再トレーニングさせたい
- 日次のジョブに対して、月の最初の営業日だけ特別な処理をさせたい
AWS Certified SysOps Administrator - Associate - ２週間で合格しました

SOAを受験し無事合格しました！
ラボ試験がなかったので、65問の130分でした。

![スクリーンショット 2023-08-19 18.39.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225450/625d6a60-e630-7e78-5329-b94b9a54968a.png)

DVAの合格直後に試験申し込み、２週間の勉強期間とタイトでしたが、何とか合格できてよかったです。。
（半分勢いもありました。。。）

DVAの合格に至るまでの備忘録は下記記事を投稿しているので、これから受験される方はぜひご覧ください。

https://qiita.com/kiton/items/2148748066a8b7f16986


## 勉強時間
### 時間
**合計：約40時間**

平日：２〜３時間
土日：４〜５時間
※お盆で実家に帰省していたのもあり、毎日は勉強してませんでしたが、その分業務を早めに切り上げて勉強時間に費やしてました。

## 勉強プロセス

### １. TechStock -AWS認定本試験モードを実施-

https://techstock.jp/

#### 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1225450/9d62faf8-ade6-e71d-4736-2dfa31bf6c63.png)

675点、初見にしてはまずまずな感触でした。

#### ２. SysOpsのセクションをひたすら解く！！
間違った問題はお気に入り登録しておく。（後で復習するため）

**問題を解いていくと、苦手なサービスや分野が把握できてくるので、すきま時間でBlackBeltを眺めてました。**

私は認証関連（AD、SAML、IAM）、AWS Configあたりがイメージつかなかったので、BlackBeltで理解を深めました。

https://aws.amazon.com/jp/events/aws-event-resource/archive/?cards.sort-by=item.additionalFields.SortDate&cards.sort-order=desc&awsf.tech-category=*all

あとはセクションの問題に対する回答の説明に、関連するAWSドキュメントやブログのリンクが貼っているので、それも確認してました。

#### ３. １周したらお気に入り問題を解く。
これを間違えなくなるまで実施。
間違った選択肢がなぜ間違ってるのかはもちろんですが、この選択肢で他の問題が出るとしたらどんなこと聞かれるかなーってイメージしながら解くことで理解を深めることができました。

#### ４. １で実施した本試験モードを実施。
試験当日の挑戦で、時間が無かったこともあり、全部解けませんでしたが、半分解いて全部合ってたので一安心・・・
（本当は全部解いて挑みたかった。。。）

## 受験時の感想

**問題文を落ち着いてよーーく最後まで読む**
がとても重要だと感じました。

要件説明なのか、トラブルシューティングなのか、既存アーキテクチャを改善したいのかを明確にした方が良いです。

個人的な所感としては、
- 試験名通り運用・保守に関する問題が多頻度で出題されていた。
- トラブルシューティングが結構多かったので、サービスの深い部分を聞かれた印象。
- どんなサービスか理解するのと、どんな課題を解決してどう良くなるのかまで理解する必要があった。
- CloudWatch、SystemsManager、AWS Configは細かいところついてくるなーという印象。
- TechStockをやっててよかったなーと思った問題が３〜４割くらい出題された。
- １周解いて７０分くらい余ってたので、落ち着いて見直しすることができた。
- SAA → SOAの順番で学習していった方が効率的かも。

## 最後に
次回はSAA受験予定です。
３年前受験した時の苦手意識がありますが、SOAの知識が無駄にはならないのと、知識は着実についていると思うので、アソシエイト制覇に向けて頑張ります！！
絶対パスと相対パス

# 絶対パスと相対パス

分からなくなるので、書いて残しておくことにしました。（未完成）
パスとは、「ファイルへのアクセス経路」のこと



## ①絶対パスとは

ファイルの名前を`最初から最後まで記述してある`形式のことです。

 <h3><font color="Orange">https</font>://<font color="YellowGreen">ドメイン名</font>/<font color="RoyalBlue">フォルダ名</font>/ファイル名</h3>
それぞれの階層を「/」で区切っています。

|サイト|絶対パス|
|:---|:---:|
|cookpad内検索ページ|https://cookpad.com/search/そうめん|
|Amazon内ランキングページ|https://www.amazon.co.jp/ranking|
|docomoお客様サポートページ|https://www.docomo.ne.jp/support|



## ②相対パスとは

現在作業しているファイルから見た、目的とするファイルの相対的な位置を記述する。


https://www.shoshinsha.com/hp/1hour/know/pass.html

相対パスで参考にしたのはこれです。
文字で書くには図があった方が分かりやすいと思うので、他のサイトを見た方がいいと思います:relaxed:
Axiosのエラーハンドリング等の共通処理はInterceptersに集約しよう

## Interceptersとは？
axiosでリクエストを送信する前に毎回行いたい処理、レスポンスを受け取った後に毎回行いたい処理を定義することができます。上手く活用すれば、「レスポンスのステータスコードが200系以外の場合にトースト表示する」のような処理をaxiosの呼び出し毎に定義することなく、Interceptersに集約することができます。

参考：公式ドキュメント

https://axios-http.com/docs/interceptors


## 実装例
```javascript:axiosClient.js
import axios from 'axios';

export const axiosClient = axios.create({
    // 必要に応じてconfigを設定
});

// リクエスト送信前に行いたい処理の定義
axiosClient.interceptors.request.use(req => {
    // リクエスト送信前に行いたい処理
    return req;
  }, err => {
    // リクエスト失敗時(ネットワークエラー等)に行いたい処理
    return Promise.reject(err);
});

// レスポンス受信後に行いたい処理の定義
axiosClient.interceptors.response.use(res => {
    // ステータスコードが200系以外の場合に実行する処理
    return res;
  }, err => {
    // ステータスコードが200系以外の場合に実行する処理
    return Promise.reject(err);
});
```

### 補足
**interceptors.request.use** : リクエスト送信前に行いたい処理の定義
第一関数に渡される引数(実装例のreq)には、リクエストの詳細(URL、HTTP メソッド、ヘッダー、パラメータ等)が含まれ、この関数の戻り値となるオブジェクトが最終的に実行されるリクエストとなります。
第二関数に渡される引数(実装例のerr)には、リクエスト失敗の原因に関する情報が含まれます。

**interceptors.response.use** : レスポンスの受信後に行いたい処理の定義
第一関数に渡される引数(実装例のres)には、レスポンスの詳細(ステータスコード、ヘッダー、データ等)が含まれ、この関数の戻り値がそのまま呼び出し元に返却されます。
第二関数に渡される引数(実装例のerr)には、レスポンスエラーの原因に関する情報が含まれます。


## 活用例
Interceptersがどのようなケースで活用されているかを調べてみました。

#### リクエスト送信前(interceptors.request.use)
 - リクエストヘッダーにアクセストークンを設定
 - ローディングの表示(interceptors.response.useと連動)

#### レスポンス受信後(interceptors.response.use)
 - 401エラーによるログインページへのリダイレクト
 - 404エラーによるNot Foundページへのリダイレクト
 - エラーメッセージやトーストの表示
 - 監視ツール等への通知
Pythonが嫌いなのでC++版のPytorchで画像認識をやってみる 14日目 YOLOに乗り換える

# YOLOに乗り換える
知人が作ったAIネットワークモデルがあってので、それを移植すべくコツコツとネットワーク作りからやっていたのだが、どうも終わりが見えない。昭和のおじさん(というかジジイだが。磯野浪平の歳を越えてしまった。)はこれでも大企業の管理職で忙しいのだ。資格試験の勉強もあるし一気に方向転換することにする。
# YOLOとは
解説サイトかたくさんあるので正確に知りたい人はググってもらうとして、メモ代わりに昭和のおじさんの認識を書き残す。
* 四角で囲うやつ。特手の物体の種類と大きさを認識してする奴だ。認識したデータを四角の図形にして画像に重ねるのはよく見る。↓こんなやつだね。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/6ce75434-65a2-41e4-0520-792a58118bc3.png)
*デファクトスタンダード? かどうか分からないが、ライブラリは公式から簡単に入手出来るようだし、学習済みモデルもたくさんあるようだ。解説サイトも多い

## サンプルを入手する
YOLOぐらいになると解説サイトや参考になるソースもたくさんある。基本的な動作を知るには、とにかくビルド一発で動きそうなやつがいい。
で色々調べて下記のサイトにたどり着いた。下の方にexampleコードへのリンクがある。コードの説明も詳しく素晴らしい。C++とpythonが並列で解説してある。YOLOv5というものを使うらしい。

https://learnopencv.com/object-detection-using-yolov5-and-opencv-dnn-in-c-and-python/

ここに適当なユーザー名とメールアドレスを入れると、コードヘのリンクがあるメールが送られてくる。udemayのような通信教育のサイトらしいが、コードは公開しているようだ。解説ページとサンプルコードへのリストがずらりと出てくるが、下記の項目が目指すものらしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/2169e2e6-41ec-e15e-b0be-25837a0de5a0.png)
ここからコードをダウンロードする。

つづく
Macで個人的にやっておきたい設定集

# Google Chrome
- メモリセーバーをONにする
- 電源につないでいない時は省エネモードにする
- ハードウェアアクセラレーションが使用可能な場合は使用するをOFFにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852882/a703f5dd-f3fc-ea87-68e8-33bb0c51b969.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852882/e56535c0-4ec8-5c9e-3db1-9235ebb2ce8a.png)


# マウス
軌道の速さ：最大
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852882/99dfc97b-209d-6e65-d741-814fc00a31c0.png)

# ユーザー辞書
下記のものは登録しておく
| ひらがな | 解説 | 例 |
|:-|:-|:-|
| あどれす  | メールアドレスは全部<br>この文字で変換できるようにする  | ・ryosakon1234xx＠gmail.com<br>・ryosakon1234xx＠icloud.com  |
| でんわ  | 略  | ・080xxxxxxxx  |
| じゅうしょ  | 引越し前も含めて全部  | ・東京都XX市XX町1-23-456<br>・北海道XX市XX町1-2345  |
| ゆうびん  | 略  | ・000xxxx  |
| くれじっと  | カード紛失よりは低リスク。<br>気にならない人は入れておくと便利  | ・1234567812345678  |
| よやく  | よく利用する施設のログインID全部  | ・10105050-123456  |
| まーく  | Markdownで忘れやすいもの  | ・[text](url)  |

# Magnet（App Storeで購入）
下記のように設定し、画面の左右二分割ショートカットができるようにしておく
![magnet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852882/2d087257-db71-bece-8242-07eccec6b85a.png)
RedshiftのDataSharingのLake Formation連携で発生したInternal error

# 起きたこと
RedshiftのDatasharing + Lake Formationを試していた際に、共有したテーブルにselectクエリ発行したら以下のエラーが発生した。
```
error: Data Sharing Internal error. code: 34519 context: query: 0 location: burst_refresh_controller.cpp:481 process: padbmaster
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/de547850-bc31-988d-d3f1-611cd12f2c2c.png)

# 解決策
Redshiftクラスターの暗号化がされていないことが原因だった。
DataSharingのプロデューサー側のクラスターは暗号化していたが、コンシューマー側のクラスターで暗号化していなかった。
クラスターの暗号化を有効に変更した後にクエリ発行したら、成功した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/f909a7d5-ebc4-dfcf-62b5-616bd835220b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/ecb34326-0deb-fab4-665b-96a337be0b67.png)
【TidalCycles】OSCでSuperColliderを直接再生させる

通常はTidalCyclesからSuperDirt経由で音を生成・再生すると思います。
ただCycleとは無関係にシンセの音を出したいときなど、純粋にSuperColliderの音を出したいこともあるかと思います。

ということで、Tidalのコードを書いているエディタからhoscを用いてSuperColliderを再生してみます。

hoscがインストール済でない場合はインストールしておきましょう

```
cabal install --lib hosc
```

#実装

BootTidal.hsに下記を追加しておきます。(もしくは.tidalを開いて一つずつ実行する)

```haskell:BootTidal.hs
import Sound.OSC.FD as O

s_new nodeId synthname param=
  do
    r <- openUDP "127.0.0.1" 57110
    sendMessage r $ Message "/s_new" ([string synthname, Int32 nodeId, Int32 1, Int32 0]++param)

n_set nodeId param=
  do
    r <- openUDP "127.0.0.1" 57110
    sendMessage r $ Message "/n_set" ([Int32 nodeId]++param)

n_free nodeId =
  do
    r <- openUDP "127.0.0.1" 57110
    sendMessage r $ Message "/n_free" [Int32 nodeId]

```

SuperColliderを開いて、今回テストとして鳴らすノイズを定義しておきます。

```supercollider
SynthDef("backgroundNoise", {
	arg amp=1;
	var out=0;
	p=PinkNoise.ar(1!2);
	p=HPF.ar(p, 230);
	p=LPF.ar(p, 1500);
	Out.ar(out, p*0.2*amp);
}, [1]).add;
```

定義できたら、test.tidal作って以下のコマンドを順に実行してみてください

```haskell:test.tidal
-- 再生
s_new 1000 "backgroundNoise" [string "amp", Float 1.8]

-- ボリュームなど、パラメータの変更
n_set 1000 [string "amp", Float 5.0]

-- 停止
n_free 1000
```

これでtidalからsupercolliderにOSC送信+再生できます
qiita_cliで記事公開してみた


# qiita cli登場！

先日qiita様からこのようなメールが届きました。
![Screen Shot 2023-08-20 at 11.41.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473706/91f848ff-aa31-37c5-dcfd-d2023ea0c30f.png)

あったらいいなと思っていた機能なので、使ってみることにしました。

## qiita cliは何ができるのか？

[公式github](https://github.com/increments/qiita-cli)によると
> Qiita CLI とは、手元の環境で記事の執筆・プレビュー・投稿ができるツールです。
>
記事の作成から公開まで<https://qiita.com>をcliで行えると行ったもの。

## 環境構築

githubに従って進めます。

```bash
## 記事を管理するディレクトリ作成
mkdir qiita; cd qiita

## qiita cli インストール
npm install @qiita/qiita-cli --save-dev

## インストール確認
npx qiita version

## 初期設定色々やってくれる
npx qiita init

# qiita.comでtokenを生成したものを記入する
npx qiita login

## localhost:8080でGUI起動、同時にこれまで作成したqiitaの記事がmd形式でpublic/にダウンロードされる
npx qiita preview

# public/内に新規記事作成
npx qiita new qiita_cliで記事公開してみた

# 再びpreview起動
npx qiita preview
```

プレビュー画面はこんな感じ
![Screen Shot 2023-08-20 at 12.00.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473706/0ab85578-a90f-9bbc-d79c-7fc191dee9d1.png)

### 備考1: アクセストークンを発行する必要あり

`npx qiita login`を実行するとtokenの入力を求められます。
<https://qiita.com/settings/tokens/new>から生成してください。

![Screen Shot 2023-08-20 at 11.36.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473706/b2ae6778-8c9d-d705-e4ac-ce8f363d20e3.png)

## 備考2: 画像のアップロードについて

記事内に画像を挿入したい場合、
<https://qiita.com/settings/uploading_images>
画像をアップロードして、画像URLを取得する必要があるようです。

![Screen Shot 2023-08-20 at 12.00.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473706/e730edeb-34f7-70de-5bce-c689daed8a57.png)

githubを見てみましたが今のところはqiita cliから画像をアップロードする機能はなさそうです。
OSSなので自分で機能を作ってもいいかも？

## 記事を公開する

いよいよ記事を公開してみます。

```bash
$ npx qiita publish qiita_cliで記事公開してみた
qiita_cliで記事公開してみた: タグを入力してください
```

タグを入力してくださいと怒られてしまいました。

プレビュー画面はちゃんとタグを入れえるように教えてくれていました。
![Screen Shot 2023-08-20 at 12.11.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473706/791affa0-f4c6-e7cd-c58f-dbbca7ee6da8.png)

`npx qiita new qiita_cliで記事公開してみた`を実行した際、記事上部に`title`や`tag`が自動で挿入されているのでここの`tag`を編集します。

```yml
---
title: qiita_cliで記事公開してみた
tags:
  - ''
private: false
updated_at: ''
id: null
organization_url_name: null
slide: false
---
```

タグは以下の2つを指定してみました。
```yml
tags:
  - 'qiita'
  - 'qiita cli'
```

## 記事を公開する前にまとめ

今まではvsコードで書いたマークダウンをqiitaの編集画面にコピペしていたのですが、これでだいぶ楽になったので記事投稿のハードルがガクンと下がったような気がします。

それでは最後に

```bash
npx qiita publish qiita_cliで記事公開してみた
```
【Flutter】GoldenTestでA Timer is still pending even after the widget tree was disposed.というエラーが出た

# はじめに
GoldenTestでVRTを行おうとテストを書いたのですが、Riverpodを使って状態管理している画面のテストで`A Timer is still pending even after the widget tree was disposed.`というエラーが出てしまいました。
今回はその対処法を調べたので共有します。

# 解決方法
下記の記事に解決方法が載っていました。

https://stackoverflow.com/questions/76881566/flutter-riverpod-and-golden-tests-a-timer-is-still-pending-even-after-the-widg

下記のように、`screenMatchesGolden`でテストをした後に、`await tester.pumpWidget(Container());`でWidgetツリーを書き換えるとエラーが解消されました。

```dart
    await tester.pumpDeviceBuilder(builder);
    await screenMatchesGolden(tester, 'test_page');

    await tester.pumpWidget(Container());
    await tester.pumpAndSettle();
```

サンプルとしては下記のコードになります。

```dart
void main() {
  testGoldens('golden test', (tester) async {
    final builder = DeviceBuilder()
      ..addScenario(
        widget: ProviderScope(
          child: const TestPage(),
        ),
        name: 'test_page',
      );

    await tester.pumpDeviceBuilder(builder);
    await screenMatchesGolden(tester, 'test_page');

    await tester.pumpWidget(Container());
    await tester.pumpAndSettle();
  });
}
```

以下、筆者もわかっていないポイントがあります。
もし有識者の方いればコメントいただけると助かります。。。
・エラーがなぜ解消されたかですが、Widgetツリーを書き換えたので、参照が切れてエラーが解消されたと思っています。
・解決方法が、この方法しかないのか気になるところです。
位置情報取得するやり方のメモ

ユーザ位置情報を取得する方法のメモです。
ブラウザで位置情報を取得すには`Geolocation API`を使用します。
下記のコードはボタンを押したら位置情報を取得します。
``` js
document.getElementById('btn').onclick = function () {
  navigator.geolocation.getCurrentPosition(success, error);
};
function success(position) {
  // 緯度を取得
  var latitude = position.coords.latitude;
  // 経度を取得
  var longitude = position.coords.longitude;
  // 高度を取得
  var altitude = position.coords.altitude;
  console.log(latitude);
  console.log(longitude);
  console.log(altitude);
}
// ブラウザの許可が降りなかった場合
function error(error) {
  console.log('位置情報取得に失敗しました。アクセスを許可してください。');
}
```
位置情報取得するには、ユーザー側のブラウザやOSの設定でも位置情報取得の許可を出してもらう必要があります。
#### 参考

https://zenn.dev/sweflo/articles/8c34c081cb764c
革命的なレポート：OpenAIとPower BIが融合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225269/f542214f-a76a-3c84-c846-1d0a5812052c.png)
## 初めに

ビジネスインテリジェンスの領域において、Power BIはデータの可視化と分析の分野で一石を投じています。構造化データ（データベーステーブル）と非構造化データ（テキスト、画像など）の両方を処理できる能力を持ち、データの愛好家にとっては強力なツールです。ただし、革新には常に改良の余地があります。ここで登場するのが、人工知能分野での先駆者であるOpenAIです。Power BIとOpenAIの機能を結合することで、データの認識と相互作用方法を根本的に変える画期的なレポートが生まれるのです。

テキストの構造化や構造化された対話の制約は、Power BIとOpenAIの融合によって解消されます。このレポートは、これら2つの強力なテクノロジーの相乗効果を解き放ち、シェマンティック検索の正確性とより深いレベルでのデータへの会話的なアクセスを提供します。

## テックスタック

基盤は、多様な能力をシナジー効果的に結合する巧妙なテックスタックにあります：

- **Power BI**: 基盤となるPower BIは、優れたレポート作成能力を活用して、生データを分析的かつ視覚的なストーリーに変えます。

- **OpenAI**: OpenAIの統合により、先例のない次元が導入されます。会話レイヤーは、データの微妙なニュアンスを探求し、人間のような方法でクエリに答える能力を提供します。

- **Databricks**: 洞察の基盤となるのはデータの準備で、それはDatabricksによって完璧に行われます。データの正確性と一貫性を確保し、全体のレポートの信頼性を高めます。

- **Langchain**: テキストデータの複雑な性質は、Langchainで解決されます。この要素は、言語とコンテキストを構造化して理解を向上させるための鍵です。

- **ChromaDB**: 複雑なデータ構造は、効率的なストレージと取得をサポートするベクターデータベースのChromaDBによって優雅に処理されます。

- **Gardio**: チャットボットAPIサーバーであるGardioの役割は、リアルタイムの対話を可能にするだけでなく、ユーザーエクスペリエンスを個人化し、従来のデータのエンゲージメントを超えます。

## 作成方法：

- **Gardioアプリの作成**: 
-まず、Hugging Face space内でGardioアプリを作成します。データプライバシーを確保しつつ、コンパクトなVMセットアップを利用できます。
作成方法は下記時の記事から修正ができます。

https://qiita.com/jingwora/items/bf3b4e2d153000639a2e

- **HTML Contentのカスタムビジュアルの追加**: 
Power BI内でHTMLContentのカスタムビジュアルを利用することです。このシームレスな統合により、Gardioインターフェースが自然に融合し、レポートとの対話をシームレスに組み合わせます。

## まとめ
OpenAIとPower BIのコラボレーションによって、達成可能な境界が押し広げられるなかで、データエンゲージメントの新たな時代が幕を開けました。この画期的なレポートは、構造化と非構造化データの壁を打ち破り、洞察を見識深く、直感的で影響力のあるものに変える可能性を提供します。対話型の会話と総合的なデータ理解を可能にすることで、この融合は伝統的なデータ分析を超える可能性を開放します。OpenAIとPower BIの融合は、単なるレポートだけでなく、未来の設計図です。データの未開の可能性が探求され、問いかけられ、最終的に行動可能な知恵に変わる未来の世界が展開されています。
Javaで「テキストファイルを読む」の動作を確認してみた

# 概要
Javaで「テキストファイルを読む」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/stream/index1.html

# 実装
以下のファイルを作成しました。
```StreamTest1.java
import java.io.File;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;

class StreamTest1{
  public static void main(String args[]){
    try{
      File file = new File("test.txt");
      FileReader filereader = new FileReader(file);

      int ch;
      while((ch = filereader.read()) != -1){
        System.out.print((char)ch);
      }

      filereader.close();
    }catch(FileNotFoundException e){
      System.out.println(e);
    }catch(IOException e){
      System.out.println(e);
    }
  }
}
```
以下のコマンドを実行しました。
```
$ javac StreamTest1.java 
$ java StreamTest1 
This is a test file.
```

# まとめ
何かの役に立てばと。
🔰機械学習について

# 機械学習について
###  機械学習の基本概念
機械学習は人工知能(AI)の一分野であり、データを用いてコンピュータが自己学習を行うことができる技術です。
例えば人は犬と猫の写真を見てそれぞれ見分けることができます。
これは小さい頃などに犬と猫の実物や写真を見て学習することにより、犬と猫を見分ける能力を脳内に作成することで実現できると考えられています。
同じようにコンピュータに犬と猫の写真を学習させることで、人の脳と同じように見分けるようにできるのが機械学習です。
![n1302010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/20fc011d-2d7b-1fd9-dcea-87b572f41651.png)
 総務省 令和元年版 情報通信白書より引用

### 機械学習が向いている用途
機械学習モデルは膨大なデータから特定のパターンを認識し、正確な予測を行うことに向いています。他にもユーザーの行動データや嗜好情報をもとに、個別のユーザーに最適な商品やコンテンツを提案したり、不正検知などのセキュリティなど様々な分野で向いています。

### 身近にある機械学習のシステム
・Amazon Echo（スマートスピーカー）
・オンライン広告
・自動運転
・DeepL(翻訳アプリ）
など

## 機械学習が注目されている理由
### AIブームの歴史
機械学習は第一次AIブームが1950年〜1960年にかけて起こりました。人間の知能や思考を模倣することを目指し、コンピュータによる推論や探索が可能となりました。
その後、1980年に第二次AIブームが起こり、エキスパートシステム（専門分野の知識を取り込んだ上で推論することで、その分野の専門家のように振る舞うプログラム）が生み出されました。しかし、当時のAIは必要な情報を自動的に収集できず、限定的な領域の情報に限定されていました。
2000年代から現在の第三次AIブームが起こりました。このブームの背景には、大量のデータを活用し、AI自体が知識を獲得する機械学習の実用化があります。さらに、AIが自ら特徴量を学習するディープラーニング（深層学習）が登場しました。これにより、AIの能力向上と多様な応用領域への展開が可能となりました。

### 機械学習が注目されるようになった背景
・データ収集が容易になった
インターネットの普及で、機械学習に必要な大量のデータを集めやすくなりました。WebサイトやAPI、スクレイピングでデータを収集できます。

・計算処理が速くなった
コンピュータのスペックが上がったことも要因に挙げれます。高速なCPUや大量のメモリの半導体の普及により個人のPCでも機械学習の計算ができるようになりました。またAWSやGCPなどのクラウド環境の登場で、大規模な計算処理環境を短時間で作成できるようになりました。

・ライブラリが充実してきた
Pythonなどで機械学習に必要なライブラリが多数提供されるようになりました。多くはオープンソースで開発されており、簡単にインストールでき、機械学習のアルゴリズムを個人でプログラミングなしで利用できるようになりました。



![48e6c13dcba07aa63eea2c630efed7ec.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/a44a1514-8d4e-1ada-4f23-d870935fa2ed.jpeg)
https://tech-camp.in/note/technology/32652/ より引用
Djangoでdjango.core.exceptions.ImproperlyConfiguredエラーの解消法

# はじめに
Python(Django)のFWのOscarの環境構築をしていて
下記のエラーにハマったので解消法をまとめた
```
django.core.exceptions.ImproperlyConfigured: The HAYSTACK_CONNECTIONS setting is required.
```

# 前提
下記が追加されていること
```setting.py
INSTALLED_APPS = [
　　　　　　　　...
    'django.contrib.sites',
　　　　　　　　...
]
```

# 解消法
setting.pyに下記を追加
```
HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.simple_backend.SimpleEngine',
    },
}
```

単純な設定漏れ（というか設定途中）だったので凡ミスでした
runserverでローカルサーバを起動しながらsetting.pyを編集していたので
不慣れた時は、まとめて設定した後にサーバ起動した方がいいです
Ubuntu 22.04 への rtl8814au driver のインストール

　Ubuntu 22.04 には、rtl8814au (TP-Link T9UH など) を使用した Wi-Fi driver は apt でインストールできないようで、みなさんが色々な方法を公開していますが、私もこの driver で困ったので、インストール方法を記録しておこうと思います。

# 1.git から driver を clone してくる

　下記 github から、rtl8814au の ubuntu 22.04 に対応した driver source を clone してきます。

https://github.com/morrownr/8814au

clone したディレクトリに移り、**sudo ./install_driver.sh** を実行するだけですが、パッケージ "iw" を先にインストールしてくださいと警告が出る場合は、sudo apt install iw を実行しておきます。

:::note info
他の driver も試しましたが、Ubuntu 22.04 では、"net/ipx.h" がなくなっているらしく、make 時にエラーになってしまいます。上記の morrownr さんの driver は、readme にも書かれてある通り、2023年8月現在 Ubuntu 22.04 対応です。
:::

# 2.USB 3 で接続できていない場合

　上記 github の readme にもありますが、USB 3 で接続できていない場合は、まず、USB3.1 のケーブルを使用しているか確認しましょう。私の場合もそうでしたが、USB3.1 用のケーブルを使用しているのに、480Mbps で接続されている場合は、"/etc/modprobe.d/8814au.conf" から "rtw_switch_usb_mode=1" オプションを指定すると、USB 3 で接続されるようです。

```/etc/modprobe.d/8814au.conf
# Edit the following line to change, add or delete options:
options 8814au rtw_drv_log_level=1 rtw_led_ctrl=1 rtw_vht_enable=1 rtw_switch_usb_mode=1
```

"/etc/modprobe.d/8814au.conf" のオプションを変更後、再起動、或いは、"rmmod"、"modprobe" などで driver を読み込み直すと、オプションが反映されます。

```shell-session
$ lsusb -t
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M
    |__ Port 1: Dev 6, If 0, Class=Vendor Specific Class, Driver=rtl8814au, 5000M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M
    |__ Port 4: Dev 15, If 0, Class=Hub, Driver=hub/4p, 480M
```

**以上**

<BR>
<BR>
<BR>
<BR>
<BR>
<BR>
<BR>
【SwiftUI】Task構造体のドキュメントを読む

# この記事は何？

Swiftの非同期プログラミングで利用できるTaskについて、[開発者向けドキュメント](https://developer.apple.com/documentation/swift/task#canceling-tasks)を独自に解説する。

> Swiftを基礎から学ぶには
自著、工学社より発売中の「[まるごと分かるSwiftプログラミング](https://amzn.asia/d/7YPWJwl)」をお勧めします。変数、関数、フロー制御構文、データ構造はもちろん、構造体からクロージャ、エクステンション、プロトコル、クロージャまでを基礎からわかりやすく解説しています。

# Task

```swift:宣言
@frozen
struct Task<Success, Failure> where Success : Sendable, Failure : Error
```

**型パラメータ**

- *Success*
`Sendable`プロトコルに適合する型。
`Sendable`に適合した型は、コピーすることで並行性ドメインに値を渡すことができる。

- *Failure*
`Error`プロトコルに適合する型。

# 概要

`Task`型インスタンスを作成するには、そのタスクが実行する作業のクロージャを渡す。
タスクは、作成直後に実行を開始できる。
開始を明示したり、スケジュールを組んだりはしない。
タスクを作成した後は、そのインスタンスを介してタスクを操作する。
例えば、タスクの完了を待機したり、キャンセルしたりできる。
それらを行わずにタスクへの参照を破棄しても、エラーにはならない。
参照を保持するかどうかに関係なく、タスクは実行される。
ただし、タスクへの参照を破棄すると、そのタスクの結果を待ったりキャンセルすることはできなくなる。

切り離されたタスクまたは子タスクのいずれかである、現在のタスクを操作するために、`Task`型は `yield()` などの型メソッドを提供している。
これらのメソッドは非同期でなので、常に既存のタスクの一部として呼び出される必要がある。

タスクの一部として実行されているコードのみが、そのタスクと対話できる。
現在のタスクと対話するには、`Task`型の型メソッドを呼び出す。

タスクの実行は、一区切りの期間と見なすことができる。
実行した各タスクの期間は、そのタスクが完了した時点か、サスペンドされた時点で終わりを迎える。
これらの実行期間は、`PartialAsyncTask`型インスタンスとして表現される。
独自の実行主体を実装しない限り、タスクと部分的に直接やり取りすることはできない。
  
`Task`型を含めた言語レベルの並行性モデルについて、詳細は[Swiftプログラミング言語ガイドの「並行性」](https://docs.swift.org/swift-book/LanguageGuide/Concurrency.html)を参照。

# タスクの取り消し

タスクには、キャンセルを示すための共有メカニズムがある。
ただし、キャンセルの処理方法に関する共有実装はない。
タスクで行われている作業によって、それを正しく停止する方法は異なる。
その上で、停止することが適切なら、キャンセルを確認するのは、タスクとして実行されているコードの責任になる。
複数の部分がある長いタスクでは、いくつかの時点でキャンセルを確認し、各点で異なるキャンセルを処理する必要があるかもしれない。
作業を停止するためにエラーをスローする場合は、キャンセルを確認するために`Task.checkCancellation()`関数を呼び出す。
キャンセルに対するその他のレスポンスには「これまでに完了した作業」や「空の結果」、あるいは「`nil`」を返すことが含まれる。


キャンセルは純粋な真偽値なので、キャンセルの理由などの追加情報を含める方法はない。
これによって、理由を問わず、タスクをキャンセルできる。
また、キャンセルのプロセス中にも「追加の理由が発生する可能性がある」という事実を反映している。
wslでelixir その40


# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題、やってみた。
構想編。

# 練習問題
ectoで、小遣い帳アプリを作れ。

# 方針
- インタープリター方式
- コマンドは、4つ
in 日付 メモ + 100
del id
up id 日付 メモ + 100
disp
- Repoは、kozuを作る。

```
defmodule Friends.Repo.Migrations.CreateKozu do
	use Ecto.Migration
	def change do
		create table(:kozu) do
			add :adate, :date
			add :memo, :string, null: false
			add :inp, :integer, default: 0
			add :oup, :integer, default: 0
		end
	end
end
```
- スキーマを書く。
```
defmodule Friends.Kozu do
	use Ecto.Schema
	schema "kozu" do
		field :adate, :date
		field :memo, :string
		field :inp, :integer, default: 0
		field :oup, :integer, default: 0
	end
end

```

- 表示
id  date  内訳　貰ったお金　使ったお金　残金

- 表示は、日付の昇順。


以上。