OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry pi 4にUbuntu Desktopをインストールできない

## Ubuntu Desktopがインストールできない！
Raspberry pi 4にUbuntu Desktop 22.04をPraspberry pi imagerからインストールしようとしたがうまくいかなかった。しかし、一度Ubuntu ServerをインストールしてからGUIをインストールするとうまくいったお話。
## Raspberry pi imagerのインストール
まずここからRaspberry pi imagerをダウンロードしました。

https://www.raspberrypi.com/software/
## Desktopのインストールはうまくいかなかった
はじめにインストールしようとしてのはこちらのUbuntu。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493771/044ffaf8-3885-3022-5f89-a76ac22c4d62.png)
microSDカードに書き込んでraspberry piに差し込んでも一瞬画面がつくがあとは暗くなってそのまま何も起こらなくなった。。。同じ症状に悩んでいる人はこの記事が役に立つと多います。
## まずUbuntu serverをインストールする
この方法でうまくUbuntu desktopをインストールできました。まず`Ubuntu Server 22.04 LTS`をmicro SDに書き込みます。64-bitか32-bitに対応しているかはRaspberry piによって異なります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493771/a6115efc-3e1c-acff-04c0-000a90c5f778.png)
その際に右下の歯車マークからsshの公開鍵やwifiの設定をしておくと便利です。ユーザー名とパスワードをここで設定した人は後で聞かれるのでメモしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493771/f910afa2-7eac-e6a1-6000-2e236c498b39.png)
microSDカードをraspberry piに差し込みます。この時に、microSDとHDMIケーブルを接続してからRaspberry piの電源を入れるようにしてください。HDMIを電源を入れた後に差し込んでも画面表示されません。（これはバグではなくラズパイの仕様らしいです。）電源を入れてしばらくするとコマンドラインのようなものが流れてさらに待つとログインできるようになります。ユーザー名を入力できる画面になってもしばらく待たないとログインがちゃんと機能しないので2分くらいってからログインにトライすることをおすすめします。ユーザー名とパスワードを先ほど設定した人はそれでログインできるはずです。していない人はデフォルトではユーザー名もパスワードも`ubuntu`です。
## GUIをインストール
以下のコマンドでUbuntu serverにGUIをインストールしていきます。
```
$ sudo apt update 
$ sudo apt install -y ubuntu-desktop
```
あまり詳しくは分かってないけど`sudo apt update`は`apt`というパッケージ管理ソフトのそれぞれのパッケージ情報をサーバーに問い合わせて最新版にしている。これをしないとaptで最新版のパッケージをインストールできない。
`sudo apt install -y ubuntu-desktop`でデフォルトのubuntuデスクトップをインストールする。Ubuntuのデスクトップには他にも種類があるから不要なアプリを入れたくないなどこだわりがある人は別のデスクトップを入れることも考えてみてください。よくわからないという人はデフォルトデスクトップでいいと思います。
かなり待ったあとデスクトップが立ち上がります。インストール中はインストールしてるっぽい画面が出るのでインストールが進んでいるか不安になることはないと思います。
## インストール完了
インストール完了してログインするとこのような画面が出現します。これでUbuntuのGUIを使用できるようになりました。お疲れ様でした。画面中央にいるクラゲはUbuntu22.04の名前が`Jammy Jellyfish`にちなんでクラゲがいるみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493771/e0474204-7c49-1882-3efe-8381c9523bf5.png)

### 参考にさせていただいた記事
からあげさんの記事

https://zenn.dev/karaage0703/articles/d99d874ff750d8
Django(4.1~)でbulk create or updateを実現する

# 概要(忙しい人はここだけ読んで公式docを参照してください)
- 目的
  - update_or_create()（DBに存在しなければ新規作成、存在すれば更新）の処理をより高速に行うため、bulk_update_or_create()的なことを実現したい。
- 課題
  - Djangoではbulk_update_or_create()というメソッドは提供されていない。
  - ネットで検索しても、自前で関数を用意する方法しか出てこない。
- 結論
  - Django4.1以降であれば、bulk_create()のパラメータでupdate_conflicts=Trueを指定することで実現可能。
    - unique_fieldsでunique constraintをかけるフィールドを指定（リスト）
    - update_fieldsで更新する場合の対象フィールドを指定（リスト）
  - https://docs.djangoproject.com/en/4.2/ref/models/querysets/#bulk-create

# やりたかったこと

（執筆中…）

# 実現方法

（執筆中…）
Google Cloud のストレージクラスのコストメモ

# はじめに
Google Cloud の Cloud Storage でよくストレージクラスの料金体系を忘れるので、その備忘録です。
基本的には、2023年7月9日時点のロケーションタイプが `Region`、リージョンが `asia-northeast1` の価格体系を前提にしてます。

# ストレージクラス
Cloud Storage のバケットを作る際に指定出来き、ファイル個別に設定も可能なオブジェクトの管理方法の種類のこと。
4種類と自動で切り替える「Autoclass」があり、安いほど操作に制限が入る。

* Standard
    * 短期間のストレージや頻繁にアクセスされるデータに最適 (公式の解説)
* Nearline
    * アクセスが 1 か月に 1 回未満のバックアップとデータに最適 (公式の解説)
* Coldline
    * 災害復旧とデータへのアクセスが四半期に 1 回未満の場合に最適 (公式の解説)
* Archive
    * アクセス頻度が年 1 回に満たないデータの長期デジタル保存に適しています (公式の解説)

# Autoclass
自動でストレージクラスを切り替えてくれる機能で、バケット作成時のみ設定可能。
Autoclass から固定のデフォルトに変えることは出来るが、1度 Autoclass を解除すると元には戻せない。
後から Autoclass にするのはできない。

| 単価 | 費用 |
|------|-----|
| 10,000 オブジェクト | $0.025/月 [^autoclassprice] |
[^autoclassprice]: https://cloud.google.com/storage/pricing?hl=ja#autoclass-pricing

# 比較
2023年7月9日時点の価格表に基づく。
デュアルリージョンまたはマルチリージョンの料金は異なることがある。

| 機能 | Standard | Nearline | Coldline | Archive |
| ----- |:--------:|:--------:|:--------:|:-------:|
| 無料枠対象 | YES | NO | NO | NO |
| 料金(データストレージ) | $0.023/GB/月 | $0.016/GB/月 | $0.006/GB/月 | $0.0025/GB/月 |
| 料金(クラスA: 主にデータ操作) | $0.005/1kops | $0.01～/1kops | $0.02/1kops | $0.05/1kops |
| 料金(クラスB: 取得・通知・IAM) | $0.0004/1kops | $0.001/1kops | $0.01～/1kops | $0.05/1kops |
| 料金(取得料金[^get_price]) | $0/GB | $0.01/GB | $0.02/GB | $0.05/GB |
| 料金(リージョン間レプリケーション) | $0.08/GB | $0.08/GB | $0.08/GB | $0.08/GB |
| 料金(外向き:中国・豪州以外) | \\$0.12/GB(~1TB),<br>\\$0.11/GB(~10TB),<br>\\$0.08/GB(10TB~) | \\$0.12/GB(~1TB),<br>\\$0.11/GB(~10TB),<br>\\$0.08/GB(10TB~) | \\$0.12/GB(~1TB),<br>\\$0.11/GB(~10TB),<br>\\$0.08/GB(10TB~) | \\$0.12/GB(~1TB),<br>\\$0.11/GB(~10TB),<br>\\$0.08/GB(10TB~) |
| 料金([早期削除](https://cloud.google.com/skus/?filter=early+delete&hl=ja&currency=USD))[^min_date] | - | \\$0.00008333/GB/日<br>(最大: \\$0.0025/GB) | $0.00008333/GB/日<br>(最大: \\$0.0075/GB) | $0.00008333/GB/日<br>(最大: \\$0.0305/GB) |
| 最小保存期間[^min_date] | - | 30日 | 90日 | 365日 |

[^min_date]: Autoclass によるストレージクラス変更では適用されません
[^get_price]: データまたはメタデータの読み取り、コピー、移動、書き換えが対象

# 所感
* ストレージ料金に対して、取得料金が無視出来ないほど高い
* 早期削除料金はそれほど高くない
* 人間が取得する場合はミスでやり直す可能性があるので、公式の推奨頻度だとStandardより高い可能性がある
* イレギュラーケースを踏まえると以下が目安になりそう
    * 1～3ヶ月に1回以上のアクセスするなら Standard
    * 3～6ヶ月に1回なら Nearline
    * 6～24ヶ月に1回なら Coldline
    * 2年以上に1回または、取り出さない可能性が高いなら Archive

# 参考
https://cloud.google.com/storage/pricing?hl=ja
プログラミング入門コース　５週目

## ４０代オッサンいよいよポートフォリオ作成
どうも４０代オッサンです( ´∀｀ )
何とか学習に食いついています💦
さて、いよいよ卒業作品(ポートフォリオ)の作成にとりかかます。

## AWS
私よりも詳しい方が多いと思いますが。
アマゾンさんが出している
WEBサービスですね♪
今回初めて使ったので、正直あまり書ける事がありません💦

なのでココに企画案も書こうと思います。

# ポートフォリオに必要な機能（暫定）

## DB側
・ユーザーの「ユーザー名」と「パスワード」
を記録するDB
・登録したユーザー毎のコメントを記録するDB
・あらかじめ用意した音声を保存しておくDB
## バックエンド側
・入力されたデータとDBにあるデータを見比べて判断する機能
・新規で入力されたデータをDB側に送る機能（記憶も）
・可能であれば入力されたデータの暗号化
・編集、消去機能（ログインデータも）
・コメントが記入されたらランダムで音声ファイルを返す機能
・DB側からコメントを持ってきて送る機能（登録者毎の）
## フロント側
#### HTML
・ログイン画面
・新規登録画面
・登録者用のコメント記入画面
・登録者が書いたコメントを見返す画面（本人以外基本的に見れない）
・編集画面
・削除（退会）画面
#### JS
・入力されたデータをバックエンド側に送る機能
・コメントをバックエンド側に送る機能
・記入されたコメントを見返す機能（バックエンド側から）
ABC309

# ABC309
今日も反省します。
今回はABC309(https://atcoder.jp/contests/abc309).

# A
1から9までの数字が書かれた3×3の盤面で与えられた2つの数字が左右で隣り合うかの判定問題。商とあまりを計算して、処理した。左右なので、上下の隣り合いは含まれないので注意。
```diff_python
A, B = map(int,input().split())

a_r = (A-1) // 3
a_c = (A-1) % 3
b_r = (B-1) // 3
b_c = (B-1) % 3

if a_r == b_r:
  if A+1 == B:
    print("Yes")
  else:
    print("No")
else:
  print("No")
```

# B
与えられたN×Nの行列に対し、外側の部分(1行目、N行目、1列目、N列目)を時計回りに一つずつ動かす。Nも大きくて100め、単純に答え用配列にずらしたものを愚直にループを使って格納して最後に表示した。
```diff_python
N = int(input())
l = [input() for _ in range(N)]
ans = []
for i in range(N):
  a = ""
  if i == 0:
    a += l[1][0]
    for j in range(N-1):
      a += l[0][j]
  elif i == N-1:
    for j in range(N-1):
      a += l[-1][j+1]
    a += l[-2][-1]
  else:
    a += l[i+1][0]
    for j in range(N-2):
      a += l[i][j+1]
    a += l[i-1][-1]
  ans.append(a)
for a in ans:
  print(a)
```

# C
渡された薬の服用日数と1日あたりの服用個数をもとに、条件として与えられた服用個数以下になるのは何日目かを答える。辞書式配列と普通の配列を作り、辞書式配列には服用日数とその個数を紐付け、普通の配列には服用日数のみを格納した。辞書式配列でわざわざ紐付けた理由としては、同じ服用日数のものをまとめて処理するため。その後、服用日数を格納した配列で昇順にソートし、合計数から引いていくことで、条件を満たすのが何日目かを判定した。
```diff_python
N, K = map(int, input().split())
M = 0 #初期最大個数
l = {}
key = []
for i in range(N):
  a, b = map(int, input().split())
  M += b
  if a in l:
    l[a] += b
  else:
    key.append(a)
    l[a] = b
key.sort()
if M <= K: #初日から条件を満たしていた時
  print(1)
else:
  for i in key:
    M -= l[i]
    if M <= K:
      print(i+1)
      break
```

# D
二つの無向グラフが与えられ、それぞれのグラフで指定された頂点の最短経路が最大となるように二つのグラフを連結させる辺を加えたとき、その最大値はいくつかを調べる問題。各グラフで最短経路が最長となる頂点を結べばよいため、方針としてはそれを調べていくことになる。コンテスト中は、幅優先で求めていこうとしたが、最短経路に必要な辺の数をどのようにカウントするかわからず、それっぽいものを作ったが実行時間エラーによって不正解となった。
解説をもとに以下のコードで実行時間エラーを解消できた。辺の数を求める方法として、頂点の数の長さを持つ配列(今回はa_p)を作り、初期値として各要素に-1を与え、開始地点に0を与える。その後、辞書型配列lとして作った到達可能なリストをもとに幅優先探索を行う。この時に、未到達の頂点に到達した場合にa_pを更新を行うことで、各頂点への最短経路を求める。例えば、頂点xから頂点yに移動した場合、頂点yが未到達(つまりa_p[y]=-1)だった時、頂点xまでの最短経路(a_p[x])に1を加えたものが最短経路となる。それぞれのグラフについて求めたのち、それらと、グラフをつなげる辺1つの和が答えとなる。
```diff_python
X, Y, M = map(int, input().split())
l = {1:[], X+Y:[]}
#経路リスト生成
for i in range(M):
  a,b = map(int, input().split())
  if a in l:
    l[a].append(b)
  else:
    l[a] = [b]
  if b in l:
    l[b].append(a)
  else:
    l[b] = [a]

#最長最短経路導出
p_list = [1]
a_p = [-1 for _ in range(X+Y+1)]
a_p[1] = 0
for p in p_list:
  for np in l[p]:
    if a_p[np] == -1:
      a_p[np] = a_p[p] + 1
      p_list.append(np)
cnt_s = max(a_p)

p_list = [X+Y]
a_p = [-1 for _ in range(X+Y+1)]
a_p[X+Y] = 0
for p in p_list:
  for np in l[p]:
    if a_p[np] == -1:
      a_p[np] = a_p[p] + 1
      p_list.append(np)
cnt_e = max(a_p)

print(cnt_s+cnt_e+1)
```

解説をもとに作成したが、最初は実行エラーがいくつか出てしまった。理由としては、経路リストの辞書型配列に1とX+Yの初期値を与えていなかったため、1やX+Yにつながる経路が存在しなかった場合に最短経路導出の段階で参照元に到達できずエラーになっていたと考えられる。そのため、2行目のように直すことで動作することを確認できた。

# 反省・感想
Aで勝手に上下の条件を付けて3回WAだしたせっかちさに自分でもさすがに引きました。そのほかは、Dが悔しかったなと。到達判定と、辺の数を同時に行っていくあたり賢いなと感心していました。コンテスト中は、到達済みリストを作って検索して判定したり、辺の数ごとに配列でまとめてpop用のリストに入れて何とか辺の数を求めていましたので、それは時間かかりますよね。。。
柔軟に対応できるように頭を柔らかくして、次回も頑張ります。

現在レート:735 → ???? (まぁさがります。はい。)
RHEL8.8にfocalboardをインストールしたときのメモ

# 目的
focalboardを試用してみるため、インストールを行ってみます。

# 環境
|名称|バージョン|
|---|--:|
|RedHat Enterprize Linux|8.8|
|MariaDB|10.3.35|

# インストール
## MariaDB
dnfでMariaDBをインストールし、サービスの起動(start)、動作確認(status)、サーバ再起動時の自動起動(enable)を設定します。
```
# dnf -y install mariadb-server
# systemctl start mariadb
# systemctl status mariadb
# systemctl enable mariadb
```
パスワード変更。current passwordは未設定なのでenter
パスワード変更後、変更したパスワードでログインできることを確認し、focalboard用DBの設定を行う。
```
# mysql_secure_installation
# mysql -u root -p
MariaDB> CREATE DATABASE DB名;
MariaDB> GRANT ALL ON DB名.* TO 'DBユーザ'@'localhost' identified by 'DBパスワード';
```

## focalboard
最新バージョンをダウンロード
```
# cd /www
# VERSION=$(curl -s https://api.github.com/repos/mattermost/focalboard/releases/latest|grep tag_name | cut -d '"' -f 4)
# wget https://github.com/mattermost/focalboard/releases/download/${VERSION}/focalboard-server-linux-amd64.tar.gz
# tar zxvf focalboard-server-linux-amd64.tar.gz
# cd /www/focalbord
# chown -R www:www .
# cp -p config.json config.json.YYYYMMDD
# vi config.json
```
```diff:config.json
-    "dbtype": "sqlite3",
-    "dbconfig": "./focalboard.db",
+    "dbtype": "mysql",
+    "dbconfig": "dbconfig": "DBユーザ:DBパスワード@tcp(127.0.0.1:3306)/DB名",
```
:::note info
ポートを変更する場合は、serverRoot, portも変更します。
:::

### サービス登録
```
# vi /usr/lib/systemd/system/focalboard.service
```
```/usr/lib/systemd/system/focalboard.service
[Unit]
Description=Focalboard server

[Service]
Type=simple
Restart=always
RestartSec=5s
ExecStart=/www/focalboard/bin/focalboard-server
WorkingDirectory=/www/focalboard

[Install]
WantedBy=multi-user.target
```

### SELinux
:::note warn
先行事例を見ると、SELinuxは無効にする手順になっている。(Mattermostの手順も含めて)
SELinuxを有効にしたままサービス起動できないか試してみたが、うまくいかなかったので、今回はSELinuxを無効にする。
今後、うまくいったら手順を修正する。
:::
```
# getenforce
Enforcing
# setenforce 0
# getenforce
Permissive
```

### サービス起動
```
# systemctl daemon-reload
# systemctl start focalboard
# systemctl status focalboard
# systemctl enable focalboard
```

### 動作確認
ブラウザでconfig.jsonのserverRootのURLを表示する

# 参考

https://webnation.co.jp/mattermost%E3%81%A8%E9%80%A3%E6%90%BA%E3%81%A7%E3%81%8D%E3%81%A6%E4%BE%BF%E5%88%A9%EF%BC%9F%E3%81%AAfocalboard%E5%85%A5%E3%82%8C%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F%EF%BC%81/

https://zenn.dev/kaakaa/articles/mattermost-focalboard-first

https://docs.mattermost.com/boards/focalboard/installing-boards.html

https://www.atlantic.net/dedicated-server-hosting/how-to-install-focalboard-on-rocky-linux-8/

https://aslead.nri.co.jp/products/mattermost/column/how-to-use-mattermost.html
🔰5分だけ努力するGit (3)

## 今回取り扱うGitコマンド
・git clone
・git switch

今回は既存のリポジトリをローカル環境にクローンしていきます。
このコマンドは主にプロジェクト参画時やオープンソースを試したいときなどに使用します。
クローンするリポジトリは何でも良いのですが、前回までのgit-studyをクローンしてみましょう。
まず、GitHubを開いて緑色のCodeボタンを押下し、リポジトリのパスをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475740/cb86d9c6-a548-babe-428c-5791b0e0c33b.png)

次にVSCodeを起動し新規ターミナルから以下のコマンドを実行します。
(現在の作業ディレクトリが前回までのgit-studyになっている場合は`cd ../`コマンドで1つ上の階層に移動しましょう)
```
$ git clone "コピーしたパス" "クローンされたリポジトリ名"
```
今回はクローンされたリポジトリ名にgit-study-cloneを設定します。
設定しない場合はコピーしたパスのリポジトリと同じ名前になります。

実行できたらクローンされたか確認してみましょう。
VSCode上部のメニューのFile → Open Folder → git-study-cloneを開きstudy.txtを開くと…
```txt:study.txt
Hello New Branch!
```
無事クローンできていますね！

では次に最近知った`git switch`コマンドを試してみます。
このコマンドはずばり`git checkout`と同じです。

…？

というのが素直な感想ですね笑
`git checkout`コマンドは切り替えの他に変更の取り消しなど様々な機能があってこんがらがるのと、checkoutという名前が直感的にブランチ切り替えと結びにくいため、シンプルな切り替え機能として`git switch`コマンドが実装されたといった経緯らしいです。

以下のコマンドで実行できます。
```
$ git switch "ブランチ名"
→ シンプルなブランチ切り替えコマンド

$ git switch -c "作成するブランチ名"
→ ブランチを作成し切り替えるコマンド(git checkout -b "作成するブランチ名"と同じ)
```

VSCode下部の青いメニューのブランチ名が切り替わっていることが確認できました。

今回は短いですが以上となります。
まだまだ知らないgitコマンドがあるので、実際に使いながらこうしてアウトプットする癖をつけたいなと思います。
git以外にも現在参画しているReact.jsの記事や趣味で使用しているGame Maker Studio2の記事も書きたいですね。

ここまで読んでくださりありがとうございました。
【Swift】配列の要素をスペース区切りの文字列に変換して出力する方法

## やり方

配列の要素をスペース区切りで出力するには次のような方法があります。

```diff_swift
let numberArray = [1, 2, 3]
let stringArray = ["b", "as", "ket", "ball"]

let n = numberArray[0 ..< numberArray.count].map{String($0)}.joined(separator: " ")
print(n) // 1 2 3

let s = stringArray[0 ..< stringArray.count].joined(separator: " ")
print(s) // b as ket ball
```

`numberArray`のようにString型でない配列については、`map`を用いて**String型**に変換する必要があります。

## ちょっと応用してみる

出力する範囲を調整することやスペース以外で区切ることもできます！

```diff_swift
let stringArray = ["b", "as", "ket", "ball"]

// 配列の一部をスペース区切りで出力
print(stringArray[1 ..< 3].joined(separator: " ")) // as ket
// コンマ(,)区切りで出力
print(stringArray[0 ..< stringArray.count].joined(separator: ",")) // b,as,ket,ball
// 区切らない
print(stringArray[0 ..< stringArray.count].joined(separator: "")) // basketball
```
## おわりに

今回とは逆に文字列を分解して配列に変換する方法についても記事にしています！

https://qiita.com/y_ma3/items/9ff36d08433a8d900fd8
GoogleCloudFunctionsでのtimeoutについて (Pub/Subトリガ)

# はじめに
今年の目標にoutputをすると決意して早半年、何もなかったのでさすがにまずいと思い、簡単なことでも公開しようとまとめてみました。
# 目的
CloudFunctionsで開発をするときGoogleCloudのリソースへのアクセス等に対して、timeout値を設定することがあると思います。
そのやり方としてsocketのtimeout値をいじることで全般的なtimeout値を変更できます。
一方でCloudFunctionsではPub/Subをtriggerに設定することが多く、socketのtimeout値をいじった際にPub/Subとの通信に悪影響を与えて上限までリトライされないか少し気になったので調査してみました。

# 前提条件
CloudFunctionsの設定は次の通りです。基本デフォルトで設定しています。
| 項目 | 値 |
|:-:|:-:|
| Region  |us-central1   |
| Mem  | 256MB  |
|  Timeout |  60s |
| MinInstance  | 0  |
|  MaxInstance | 3000  |
| tigger | pub/sub|
|Retry on failure| disable|

Pub/Sub(subscription)の設定値も記載します。
|項目 | 値 |
|:-:|:-:|
|  Delivery type  |  Push |
| Acknowledgement deadline  |  600 s |
|  Exactly once delivery |  Disabled |
| Message ordering   |  Disabled |
| Dead lettering   |  Disabled |
|  Retry policy   | Retry after exponential backoff delay  |
|  Minimum backoff duration   | 10 s  |
|  Maximum backoff duration    | 600s  |

検証に使ったコードは以下のものです。
BackendServiceの一覧を取得するコードにtimeoutの設定を追加しています。
timeoutにより例外が発生し、処理が終了するコードです。

```python
import base64
import socket
import google.auth
from googleapiclient import discovery

def hello_pubsub(event, context):
    try:
      print("Start")
      pubsub_message = base64.b64decode(event['data']).decode('utf-8')
      socket.setdefaulttimeout(0.0000001)
      credentials, project = google.auth.default()
      api_svc = discovery.build("compute", "v1", credentials=credentials)
      req = api_svc.backendServices().list(project=project)
      print("start: get backend services.")
      # ここでtimeoutが発生する想定
      res = req.execute(num_retries=4)
    except Exception as e:
      print("Exception")
      print(e)
      return
    print("Finish")
```
試しにCoudFunctionsのtest機能でtimeoutが発生するか確認してみました。
timeout自体は発生したもののCloudFunctionsのStatusはOKになっていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594255/fba7779f-6f01-0d6a-69c1-ec79ded776f2.png)


# 検証手順
実際にPub/Subと連携してみてPub/Subに悪影響が発生しないことを確認してみます。
手順はシンプルにPub/SubのTest機能でメッセージを送信します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594255/696fac8b-d63f-209b-e81f-4e2c8a90120a.png)


# 検証結果
Pub/SubとCloudFunctions側のMetricsを確認してみます。
添付画像のとおり、Pub/Subのメッセージ送信とCloudFunctionsの実行数が１件であることを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594255/175d0e57-0c95-d591-15a4-353a3b3226c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594255/5ff6c8c8-bdb3-29c0-091b-f2cb7becb530.png)


# まとめ
今回の検証結果では想定通りtimeout値を設定した場合でもPub/Sub側での再送は発生しませんでした。そのため、結果的にsocketでのtimeout値設定による影響はなさそうです。（結果返却時に影響する可能性はあるかもしれません）
推測としては以下が考えられるでしょうか（詳しい人教えてくださいmm）
- Pub/Subとの通信がエントリポイントの処理を走らせる前に終わっていて影響を及ぼさなかった

上の場合、Pub/Sub側での結果受信が気になる（Pub/Subが側のリトライが機能しない？）ので違う気もしますが、このページでの検証は以上でした。
最後までありがとうございました！
commit時にcommit-lintを実行する方法【Lefthook】

## パッケージのインストール
以下のコマンドを実行して`Lefthook`をインストールします。
```:ターミナル
$ yarn add -D lefthook
```

## Lefthookの設定
Lefthookの設定をします。
`lefthook.yml`を作成し、以下のように記述します。
```lefthook.yml
commit-msg:
  skip: merge
  commands:
    commitlint:
      run: yarn commitlint --edit {1}
```

## 動作確認
以下のコマンドを実行し、正常に動作するか確認します。
```:ターミナル
＄ npx lefthook install && npx lefthook run commit-msg
```
せんせー、人間拡張ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、人間拡張ってなに？

# 人間拡張とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/cecad887-4dc9-7b41-b675-a4f4f9607777.png)

人間拡張は、まるでスーパーヒーローのような魔法の力を手に入れることができる技術なんです。

普通の人間は、自分の手足や目や耳でできることが決まっているけれど、人間拡張を使うと、それがもっとすごくなります。

例えば、
特別な装置を手につけたら、もっと速く走ることができたり、
特別なめがねをかけたら、もっと遠くのものがよく見えたりするんです。

それに、特別な耳をつけたら、もっと遠くの音が聞こえたりすることができます。

人間拡張は、ちょっと魔法のような技術で、自分の力をアップさせることができるんです。

でも、大切なことは、いつも自分の力を信じて、自分の身体を大切に使うことなんです。

これからも人間拡張を使って、みんなが楽しく元気に過ごせるようになるといいですね。
でも、いつも自分自身を大切に思って、思いやりのある心を持つことも大切です。
みんなで一緒に素敵な未来を作っていきましょう。

# まとめ

人間拡張は、まるでスーパーヒーローのような魔法の力を手に入れることができる技術
Mac のキーボードで 英数キーを押した時に Google 日本語入力 ( Google IME ) の英数を使うようにする

# 方法

## STEP1

キーボード設定に Google IME の英数がなければ追加しておく

![image](https://github.com/YumaInaura/YumaInaura/assets/13635059/1deec792-d49b-4d2c-8a51-a46d32911ed9)

![image](https://github.com/YumaInaura/YumaInaura/assets/13635059/40cbae59-69a5-4feb-a17b-aeaf095c5fb7)

![image](https://github.com/YumaInaura/YumaInaura/assets/13635059/1875c483-5e97-4787-abe5-5010dc1e5591)

## STEP 2

いちど IME の選択で Google IME の 英数を選ぶ

<img width="323" alt="image" src="https://github.com/YumaInaura/YumaInaura/assets/13635059/1920a382-f8ba-4655-8f10-bb5848bdd7c6">


## 結果

かなキー / 英数キーを切替えても Mac 標準の英数ではなく Google IME の英数が使われるようになる


![image](https://github.com/YumaInaura/YumaInaura/assets/13635059/364874f0-bd66-4160-83ef-b68176d4777a)

![image](https://github.com/YumaInaura/YumaInaura/assets/13635059/4e58d264-6fd5-4ef6-b965-2107a5de2188)


# 悩み

なぜかMac標準の英数キー入力モードになっている時だけGoogleChromeで画面が10秒以上も固まることがある
だがMac標準の英数をキーボードの入力ソースから削除することは出来ないので困っていた

今回の対策で回避できれば良いが

以前に試した時はGoogleIMEに切り替わってくれないと思っていたが
どうやら全角英数の方だけしか入力ソースになかったっぽい

# チャットメンバー募集


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

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ
【Go】デコード、エンコードの実装例（marshal、unmarshal）

# はじめに
GoでAPIを作成する際などに、marshal、unmarshalがよく登場するので、使用例を簡単にまとめておきます。

# 使用例
```go:main.go
package main

import (
	"encoding/json"
	"fmt"
)

// structの定義
type Person struct {
	Name  string `json:"name"`
	Age   int    `json:"age"`
	Email string `json:"email"`
}

func main() {
	// エンコードするデータ（Person型の変数）
	person := Person{
		Name:  "John",
		Age:   25,
		Email: "john@example.com",
	}

	// データをJSON形式にエンコード（marshal）
	jsonData, err := json.Marshal(person)
	if err != nil {
		fmt.Println("Error encoding JSON:", err)
		return
	}

	// エンコードされたJSONデータを表示
	fmt.Println("Encoded JSON Data:", string(jsonData))

	// エンコードされたJSONデータをデコード（unmarshal）
	var decodedPerson Person
	err = json.Unmarshal(jsonData, &decodedPerson)
	if err != nil {
		fmt.Println("Error decoding JSON:", err)
		return
	}

	// デコードされたデータを表示
	fmt.Println("Decoded Person:")
	fmt.Println("Name:", decodedPerson.Name)
	fmt.Println("Age:", decodedPerson.Age)
	fmt.Println("Email:", decodedPerson.Email)
}

```
せんせー、 寿命延長技術ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、寿命延長技術ってなに？

# 寿命延長技術とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/cecad887-4dc9-7b41-b675-a4f4f9607777.png)

寿命延長技術は、おばあちゃんやおじいちゃんたちが元気に長生きできる魔法みたいな技術なんです。

普通のおばあちゃんやおじいちゃんたちは、歳をとると体が少しずつゆっくりになってしまうことがありますよね。

でも寿命延長技術を使うと、そのおばあちゃんやおじいちゃんたちの体が元気になって、
長い間一緒に楽しい時間を過ごすことができるんです。

寿命延長技術では、お医者さんたちが特別な魔法を使って、おばあちゃんやおじいちゃんたちの体を元気にするんです。
たくさんの健康な食べ物を食べたり、運動をしたりすることも大切なんです。

寿命延長技術は、おばあちゃんやおじいちゃんたちの笑顔を守るための大切な魔法なんです。
でも、いつも健康に気をつけることが大切なんです。
みんなが元気に過ごせるように、お医者さんたちがたくさんの研究をしているんです。
みんなで一緒に楽しい時間を過ごしましょう。

# まとめ

寿命延長技術は、おばあちゃんやおじいちゃんたちが元気に長生きできる魔法みたいな技術
ローカル環境にSafariでログインしてもトークンが保持されない

## 事象

開発中のWebサービスのローカル環境にSafariでログインしても、アクセストークンとリフレッシュトークンが保持されませんでした！

## 対処法

どうやら以下のsecure属性に原因があったようです！

secure: true
http間のクッキーの送信を許容しない！

secure: false
http間のクッキーの送信も許容する！

**SafariもChromeもhttp接続でしたが、Chromeならトークンが保持されるのは、
開発者の利便性を考慮し、localhostではsecure属性を無視してくれるからのようです！**

```auth.ts
case "POST":
  const token = JSON.parse(req.body) as Tokens;
  const options: CookieSerializeOptions = {
    path: "/",
    maxAge: 30 * 24 * 60 * 60,
    httpOnly: true,
    secure: true
    sameSite: true,
  };
  res.setHeader(
    "Set-Cookie",
    serialize(Object.keys(token)[0], Object.values(token)[0], options),
  );
  res.status(200).json({});
  break;
```

自らの備忘録のために投稿してますが、なにかお役に立てましたら幸いです！:clap:
また、なにか間違ってましたらご指摘いただけますと幸いです！:pray:
Power Automate: Feed + Update Card でデジタルサイネージ

# 背景
Update Card で、投稿した Adaptive Card を更新するとデジタルサイネージみたいなことが出来る。

ただ、Teams 上での課題として以下があった

- 更新した Adaptive Card へのアクセス方法が面倒

この解決方法として、Feed 投稿アクションが便利ってお話

## デジタルサイネージのスレッドへ飛ぶ方法が
- ピン留めしておいた場合
    1. チャネルを開く
    1. ℹ️アイコンでチャネル詳細を表示<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/9ea8ffdd-a27a-117b-652c-1b620f048d70.png)<br>常時開いておけば一応ここは省略可能

    1. ピン留めしたスレッドを開く
- ピン留めしてない場合
    1. チャネルを開く
    1. ひたすらスクロールして、該当スレッドへ

# 利用結果例

1. 変化検知で Feed を飛ばす
1. Feed を踏むことで、該当メッセージへ飛ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/2d032ebd-1dfb-0eb1-8859-276ce63f435e.png)

Card 内容を見るべきタイミングで通知をさせることで、
1. フィードをクリック
1. 詳細情報を見る

とデジタルサイネージの目的が達成できます。

# 実装例

以下の、SMS通知のタイミング（通知内容が変化した際）で、スレッドで定期更新している内容へと飛ばしただけ。

https://qiita.com/baku2san/items/bb3adccb27f7156f06a2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/71e7a41d-39ec-d87e-dd49-0dc8a34f6632.png)


https://qiita.com/baku2san/items/78264b8e3d5abf1f67f8

# 関連アクション
 
- [チャットやチャネルのアダプティブ カードを更新する](https://learn.microsoft.com/ja-jp/connectors/teams/#%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%82%84%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%AE%E3%82%A2%E3%83%80%E3%83%97%E3%83%86%E3%82%A3%E3%83%96-%E3%82%AB%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B)
- [フィード通知を投稿する](https://learn.microsoft.com/ja-jp/connectors/teams/#%E3%83%95%E3%82%A3%E3%83%BC%E3%83%89%E9%80%9A%E7%9F%A5%E3%82%92%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B)

# あとがき
Feed Notification の使い道に悩んでたけど、Update Card と非常に相性が良いですね。


# keyword
Make a digital signage using Feed Notification & Update Card
20230728_自主学習MVVM_データレイヤを勉強せねば

## やったこと
* 情報収集(ネットサーフィン）

## わかったこと
* 自分が終了した研修は、UIレイヤだけだったこと
* まだデータレイヤにおいては、ノータッチであること
* データレイヤは、MVVMのModelのことであり、RepositoryとDataSourceで成り立っていること
* Android開発で推奨されるアーキテクチャは、厳密にはMVVMではないという意見があること（公式は近いとしてる。）
* 変数の監視には、オブザーブとxmlからバインドする奴はどっちでもいいということ
(UIレイヤの話ですが)

## わからないこと
* データレイヤの世界

## これからやること
公式のデータレイヤの研修をやろうかな
https://developer.android.com/courses/pathways/android-basics-compose-unit-5-pathway-2?hl=ja

## 偉大なる参考様
いつもありがとうございます。

https://zenn.dev/nemototea/articles/d7fe9b095e3487

https://qiita.com/sdkei/items/a48ae24536562ed000b3
Linuxで原神やるぞ！

# 前提
先日『LinuxでWindowsアプリケーションを動かす』という記事を書きました

https://qiita.com/m-m-n/items/34525768f6dd7b2379ec

こちらの記事はLinuxで原神をプレイしたいというところから発展したものでした
原神のインストールは上記の記事にある流れで同様にインストールができます

# 原神を起動するのに都度Steamを立ち上げたくない
こちら本題となります

## シェルスクリプトにまとめたい
シェルスクリプト叩いて実行できれば楽じゃないですか？
やりましょう

### 実行ファイルを調べる
まず動かしてみるのは当然Steamに登録してあるパスです
こいつを叩いてみます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426191/889846de-6ca0-52ae-1894-a677050fb8d2.png)
動きませんね……

一旦立ち上げてからプロセスを確認してみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426191/80409b28-75d3-c741-ac78-b74c55257ccd.png)

これを叩いてみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426191/abeafdd9-76c7-dcaa-9ac6-6c1b3ab62ddf.png)

動かないですね……

ただこの長いコマンドによって起動することはわかりました

### 環境変数が必要

結論としては環境変数をセットしてやる必要があります

一度Steamから起動して動いてるプロセスが持っている環境変数を調べられればそいつをexportしてから実行することで動作することが期待されます

https://qiita.com/m-m-n/items/1a6282d0d5cd167dfa21

丁度こちらに特定のプロセスが持つ環境変数を取得する方法が記載されてますね👀

#### プロセスIDを特定する

```bash
ps auxf | grep "Genshin Impact"
```
これで一番親になってるプロセスIDを確認しましょう

今回 `2645969` となってました
また、そのプロセスのコマンドラインも今一度確認しておきましょう

さて、上記記事にあるスクリプトを利用して環境変数を確認してみます

```bash
process-env 2645969
```

何やら色々出てきます
原神を起動する際に不要なものもありますが、とりあえず全部使いましょう

## シェルスクリプトにまとめる
ここまでで実行ファイルのパスと環境変数がわかりました
これを愚直にシェルスクリプトにまとめましょう

```bash:こんな感じ.sh
#!/bin/bash

export 環境変数
export 環境変数
.
.
.
export 環境変数

/path/to/bootcmd
```

実行権限を付与してターミナルから実行してみると原神が起動するようになったかと思います

# いろいろとめんどい

わかります
面倒ですよね

なのでゲームを起動するシェルスクリプトを吐き出すシェルスクリプトを用意いたしました
コマンドライン引数にはプロセスを特定するための文字列を指定します
"プロセスIDを特定する" でgrepした文字列で良いでしょう

```bash:steam-app
#!/bin/bash

echo "#!/bin/bash"
echo

ROOTPROCESS=$(ps auxf | grep "$(pgrep -f "$1")" | head -n1 | awk '{ print $2 }')
process-env $ROOTPROCESS | while read line; do
  echo "export ${line}"
done

CMDLINE="$(ps aux | grep ${ROOTPROCESS} | grep -v grep | awk '{ for (i=13; i<=NF; i++) printf("%s ", $i) }')"

echo "$(cat <<SHELLSCRIPT

function signal() {
  kill -KILL \$(ps aux | grep "$1" | grep -v grep | awk '{ print \$2 }')
}

trap "signal" SIGINT SIGHUP SIGKILL SIGTERM

${CMDLINE} > /dev/null 2>&1

SHELLSCRIPT
)"

```

まずシェバンを出力します
次にprocess-envを用いて取得した環境変数を反映させるためにexportする形で出力します

起動するためのコマンドラインを取得します

次にヒアドキュメントを使ってなにやらやっています
これはちょっと込み入った記述をするのに都度echoするのが面倒だったのでこうしてます

まずシグナルを受けとった際に実行する関数を定義します
これはプログラムを終了させるのに利用します
次にtrapを用いてシグナルを受け取った際に関数が呼び出されるようにします
ゲームのウィンドウを閉じるだけだとプロセスが完全には終了しませんでした

こうしておくとターミナルから起動していればCtrl+CでKILLできますし、そうでなければ適宜起動したシェルスクリプトのプロセスに対してKILLしてやればいい感じにゲームのプロセスも死ぬようになります

最後に先程抽出したコマンドラインを出力します

一度Steamでゲームを起動した状態でこのスクリプトを実行して結果をリダイレクトし、そのファイルに実行権限を付与して実行します

# ｷﾀ―――(ﾟ∀ﾟ)―――― !!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426191/d14d100c-2748-391a-00b3-f5172e1c1ef3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426191/c69012dd-c089-2535-42d8-b332af643e24.png)

ちなみにゲームパッドも認識してコントローラー握りしめて遊んでます

---

それでは良いゲームライフを
使ってないDockerリソースはこまめに削除しないとエラーが発生する

## 事象

Amazon ECRにイメージをプッシュするために、Dockerコンテナをビルドしようとしたところ、以下のエラーが発生しました！
**ENOSPC: no space left on device**

```
docker build --build-arg AWS_ENV_PATH=<パラメータストアのパス> -t <タグ名> -f <Dockerfile名> <Dockerfileのパス>
```

## 対処法

この問題の原因はディスクスペースの不足でした！使っていないDockerリソースを削除することで、問題を解決しました！具体的には、以下のコマンドを使用しました！

```
docker system prune -a
```

これにより、未使用のDockerイメージ、コンテナ、ボリューム、ネットワークが削除され、ディスクスペースが解放されました!今後は、使っていないDockerリソースをこまめに削除するようにします!

自らの備忘録のために投稿してますが、なにかお役に立てましたら幸いです！:clap:
また、なにか間違ってましたらご指摘いただけますと幸いです！:pray:
せんせー、自動運転ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、自動運転ってなに？

# 自動運転とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/cecad887-4dc9-7b41-b675-a4f4f9607777.png)

自動運転は、クルマが魔法のように自分で進んでいく仕組みなんです。

普通のクルマは、お父さんやお母さんがハンドルを回して運転するけれど、
自動運転のクルマは特別な魔法で、道路を自分で見ながら進んでいきます。

自動運転のクルマには、目のようなカメラやセンサーがついていて、道路や障害物を見つけることができます。
それで、安全に進むことができます。

自動運転のクルマは、お友達と一緒に旅行に行ったり、お買い物に行ったりする時に使われることがあります。
お父さんやお母さんは、自動運転のクルマを乗せて、みんなで楽しいドライブをすることができます。

でもね、大切なことは、いつも安全に運転することだよ。

自動運転のクルマも素敵な魔法だけど、まだまだみんなが安心して使えるように、
たくさんの人たちが頑張って研究しています。
みんなで協力して、楽しい未来を作っていきましょう。

# まとめ

自動運転は、クルマが魔法のように自分で進んでいく仕組み
ファイル管理

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/65b3edd1-927c-bf9f-9877-afdbf1e85bfd.png)
　ディスク装置中でのファイルの配置を管理したり、プログラムがファイルにアクセスするための手段を提供したりすることもOSの重要な役割です。ファイル管理で重要なテーマには、ファイル編集法、ファイルシステム、パスがあります。ファイル編集法は、ファイルへのデータの格納方法です。ファイルシステムは、ディスク装置でファイルを管理する仕組みです。パスは、ファイルの位置を表すためのものです。
Studio Webを使ってAsanaでプロジェクトを作ってみた

## はじめに
①本記事は、2023年7月開催の「UiPathブログ 発信チャレンジサマー」の28日目のブログです。
ブログの詳細、参加方法については以下のブログを参照ください。

https://note.com/shumpei_w/n/nd082bdf28853

②このブログ情報は、2023/7時点の情報です。
③UiPathはStudio Webを使用しています。
④Asanaはベーシックプランを利用しています。
　登録はAsanaの公式サイトより行えます。

https://asana.com/ja?noredirect=

## Asanaとは？
Asanaはプロジェクトタスクツールのことで、大手企業でも導入している実績があります。
チーム内の課題やTo-Doを管理できるツールで、利用したことのある人もいらっしゃるかと思います。

https://asana.com/ja?noredirect=

## Studio Webでも...
実はStudio WebでもAsana関連のアクティビティが用意されています！
(アクティビティ名に英語が混ざっていますね...まいいか)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/e617b82f-329e-df9f-2a6d-d356cd5ff7f8.png)

## プロジェクトを作ってみよう
早速、プロジェクトを1つ作ってみましょう。
今回は「Create Project」アクティビティを利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/3e57e4d7-5f2e-5aa0-9498-6e4c78682f67.png)
ここで「Asanaに接続」を押すと...でた、認証画面。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/0272b1c3-5e32-3ef7-08ff-441a22441a7b.png)
「接続」を押すと...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/d9b7ea4e-0d6d-f85d-1117-4c0ca6736944.png)
許可を求められるので、「Allow」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/fb2a55b6-8e3f-1624-61f2-847362f7e4be.png)
ワークスペースのID？らしきものが出てきたので「接続」を押します。
これで、アクティビティを使う準備ができました。

## 設定してみよう
まずは必要そうな項目を埋めていきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/6739874d-3a8f-2f90-1bab-efe7bcde91c9.png)

・Asana：Asanaで登録しているメールアドレスが入ります。
・Team：Asanaのワークスペースにある「チーム」を指します。
今回は「My workspace」で設定します。
※上記設定時にマスキングした場所にID？か数字が書いてあるので、念のため隠しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/0c49baaa-f421-6b90-e582-dcfb1a9bd732.png)

・Name：設定したいプロジェクト名を記載します。
　　　　今回は「Javaを理解」にしてみました。
・Owner：今回は未設定です。
・Due Date：プロジェクトの期限を設定します。
　　　　　　今回は2023/7/31で設定しています(間に合う？)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/c1f529d2-369a-21ac-c80a-4b4c37c7193e.png)
 (カレンダーはZoomアクティビティの時と同じ画面ですね)

【オプション】
・Status：今回は未設定です。
【出力】
・Project ID：設定したプロジェクトに対しIDが発行されるようです。
　　　　　　　このIDはString型変数に格納できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/b906d629-2b69-eefb-3081-63ebf1125d3a.png)
※試しにString型変数<b>strProjectId</b>の中身をログで出してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/4137c9b6-b5a2-4554-7c8b-b46b424ecb2d.png)


## 実行結果は...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/aebb077e-b2ee-3dad-fd05-84674338cbe5.png)
無事、プロジェクトを作成することができました！

プロジェクトIDはログに出ましたかね...？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/e719b9db-2aee-89f7-00b5-a0a365b76c80.png)
あ、出てますね！
※個人情報につながりそうなので、IDは一部隠しています。ご了承ください。


## まとめ
今回このアクティビティを使ってみたくてAsanaのベーシックプランを登録してみました！
個人で作業管理する際ならBasicプランで制限はあるものの、無料で利用できます。

https://asana.com/ja/pricing

この機会にちょうどAsanaに興味があったので、個人的に使ってみようと思います。
合わせて、Studio Webのアクティビティを使ってみましょう！
最後までお読みいただきありがとうございました。
せんせー、合成生物学ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、合成生物学ってなに？

# 合成生物学とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/cecad887-4dc9-7b41-b675-a4f4f9607777.png)

合成生物学は、魔法みたいな科学のお話なんです。

合成生物学では、色々な小さな生き物を作ることができます。

例えば、
お花やお野菜を作ったり、くじらや恐竜のお友達を作ったりすることができます。

お花を作る時には、特別な魔法の種を使って土に植えます。
すると、時間がたつと、きれいなお花が咲いてきます。
お野菜も同じように、種を植えると成長して、美味しいお野菜ができます。

くじらや恐竜のお友達を作る時には、特別な材料を使って、おもちゃを作るように組み立てます。
すると、本物みたいなくじらや恐竜のお友達ができるです。

合成生物学は、魔法みたいな科学で、想像をたくさん広げて楽しい生き物を作ることができます。
みんなで一緒に楽しく生き物を作って遊びましょう。
でも、大切なことは、生き物を作る時には優しい心で大切に育てることなんです。

# まとめ

合成生物学では、色々な小さな生き物を作ることができます
せんせー、 ブロックチェーンってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、ブロックチェーンってなに？

# ブロックチェーンとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/cecad887-4dc9-7b41-b675-a4f4f9607777.png)

ブロックチェーンは、みんなが仲良くノートを共有して、一緒にお絵かきをする魔法のようなシステムなんです。

ブロックチェーンでは、みんなが特別なノートを持っていて、そのノートに大切な情報を書いていくんです。
それが、お絵かきを一緒に作るルールみたいなものなんです。

一つのノートにお絵かきを書いたら、みんなでそのお絵かきが本当にいいかどうかを確認して、
「はい！」とみんなが言ったら、そのお絵かきを新しいページに追加するんです。

そして、
次のお絵かきを書いたら、またみんなで確認して、新しいページに追加するんです。

このノートは、みんなの手元に一冊ずつあるから、誰かがノートをいじったり間違ったことを書いたりしても、
他のノートがあるから安心なんです。

ブロックチェーンは、情報を安全に共有する仕組みで、たくさんの人が協力して大切な情報を守ることができます。
だから、みんなで一緒に楽しくお絵かきを作ることができるんです。

# まとめ

ブロックチェーンは、みんなが仲良くノートを共有して、一緒にお絵かきをする魔法のようなシステム
API Gatewayのリクエスト検証エラーがCORSエラーになる問題の対処方法

# 課題
API Gatewayのリクエスト検証機能を使ってリクエスト本文の検証を行なっているAPIに対してブラウザからAPIにアクセスする時に検証NGになるリクエスト本文を送信すると、CORSエラーになる事象が発生しました。

# 再現手順
API Gatewayでモデルをリクエスト本文に紐付けてリクエスト検証を有効化している状態でわざとリクエスト検証でNGになるリクエスト本文を送信してみます。

postmanで送信すると、下記のように正しく400が返り、エラーメッセージも検証でNGだったことがわかります。
![スクリーンショット 2023-07-28 21.20.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476743/9bf73d58-dba2-6dc0-4c8a-b3eb1f104a75.png)

しかし、同じ内容でブラウザ（ここではChrome）から送信すると、下記のようにCORSに違反しているというメッセージがコンソールに出力されて、正しくエラーを受け取れていないことがわかります。
```
Access to XMLHttpRequest at 'https://（APIのURL）' from origin 'https://（呼び出し元のWebサイトのURL）' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
```

# 原因
リクエスト検証NGの時に返される400エラーのレスポンスにCORS関連のヘッダーを付与していないことが原因でした。
postmanからのリクエストでは問題ありませんが、ブラウザからのリクエストの場合はこれがチェックされるため、CORSエラーになっていました。

# 対処
対象のAPIの設定で「ゲートウェイのレスポンス」>「DEFAULF 4XX」と進んで、必要なヘッダを設定してください。
値の部分にはシングルクオーテーションが前後に必要です。
設定後はデプロイが必要です。
![スクリーンショット 2023-07-28 21.32.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476743/4832ec8c-12f6-d1c5-c6a6-a1f368d904d3.png)

SAMテンプレートの場合は該当のAPIのPropertiesの中のGatewayResponsesを設定してください。
```yaml
EventsApi:
  Type: AWS::Serverless::Api
  Properties:
    GatewayResponses:
      DEFAULT_4XX:
        ResponseParameters:
          Headers:
            Access-Control-Allow-Origin: '''*'''
            Access-Control-Allow-Headers: '''Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-CSRF-TOKEN'''
            Access-Control-Allow-Methods: '''OPTIONS,POST'''
        ResponseTemplates:
          application/json: >
            {
              "message":$context.error.messageString
            }       
```

# 設定後の確認
再度ブラウザからわざとリクエスト検証でNGになるリクエスト本文を送信してみるとCORSエラーではなく、意図した400エラーを受信できているはずです。
JavaScriptのclassListについて

<h1>classListとは</h1>
<h2>要素のクラスを追加、削除、参照、操作するプロパティ</h2>
<p>getAttribute使うより断然簡単</p>

<table>
 <tr>
    <th>メゾット</th>
    <th>内容</th>
    <th>使い方</th>
 </tr>
 <tr>
   <td>.add()</td>
   <td>classを追加</td>
   <td>h1.classList.add('red');</td>
 </tr>
 <tr>
   <td>.remove()</td>
   <td>classをはずす</td>
   <td>h1.classList.remove('red');</td>
 </tr>

 <tr>
   <td>.toggle()</td>
   <td>クラスが含まれてたら削除、クラスが含まれてなかったら追加</td>
   <td>h1.classList.toggle('red');</td>

 </tr>
 <tr>
   <td>.contains()</td>
   <td>特定のclassが設定しているか確認</td>
   <td>h1.classList.contains('red');→true</td>

 </tr>
</table>
ITエンジニアだけじゃない!? 戦国武将もヘッドハンティング！

ヘッドハンティングされるエンジニアも多いかと思いますが、
戦国時代でも盛んにヘッドハンティングがされていました！

■豊臣秀吉と竹中半兵衛

私は司馬遼太郎の本が大好きなのですが、一度読んだ物も定期的に何回か読み直してます。
読み直しても毎回新しい発見があって良いですね！

今読み返しているのは、『新史・太閤記』。
※もう5～10回くらい読んでます！

豊臣秀吉の転職＆出世＆独立記が司馬遼太郎の視点で描かれていて面白いです。

最近読み返して、印象に残ったシーンが、当時、美濃の齋藤家の家臣だった竹中半兵衛を木下藤吉郎（豊臣秀吉の当時の名前）が織田家への帰属を促すシーン。

言わば、戦国時代のヘッドハンティング。

当時、織田家は美濃侵攻を繰り返しており、半兵衛が立てた作戦で、織田軍は手痛い敗北を期していました。

しかし、半兵衛は美濃斎藤家の中ではあまり評価されておらず、酒色に溺れる当主の斎藤龍興に対する主従としての信頼関係もかなり揺らいでいる状況でした。

そこで、藤吉郎は敵地であるにも関わらず、足しげく、半兵衛の下に通い、織田家への帰属を説きます。

当時の常套手段の口説き文句は「恩賞」。

しかし半兵衛には利ではなびかないと感じた藤吉郎は「仕事のやりがい」で攻めます。

藤吉郎は言います。

「自分を見てください。私は農民の出であるのに抜粋され、美濃の調略も任されております。織田家では実力次第でどんどん大きな仕事も任せてもらえます。あなたも織田家でどんどん能力を発揮すべきです。」

しかし、既に冷酷な領主という印象が付いてしまっている信長にあまり良い感情を半兵衛は持っていません。

半兵衛はこう返します。

「信長は家臣を道具の様に扱い、使っているに過ぎない。信長は武士を愛する事は無いのだ。」

それに対して、藤吉郎は

「これは半兵衛殿とも思えないお言葉。士として愛されるとは使われる事ではありませんか。」

これを聞いた半兵衛は妙に納得してしまいます。確かに武士として愛されるのは、おべっかを言い気に入られる事では無く、その能力を買われ、活躍の場を与えられる事では無いのか？と。。。

敵地に命がけで乗り込み、本音でぶつかってくる藤吉郎に対して、徐々に半兵衛の心は動いていきますが、どうしても美濃を裏切る事や信長の配下に着く事を決心できませんでした。

藤吉郎も諦めず、何度も何度も繰り返し口説くのですが、ついに。

「天下のためでござる。」

と藤吉郎自身、思わぬことを口にしました。
当時の織田家の実力はようやく尾張一国を平定したばかりで、とても天下を狙えるような実力は無く、こんなことを言えば世間の笑いものになってしまうところですが、半兵衛は笑いませんでした。

むしろ、これが決定的な一言になり、半兵衛は本当に織田家が天下統一を考えているのか何度も念を押しました。
半兵衛にとっては、大きな舞台で自分の能力を活かせる場こそが、最大の決め手になったのです。

その後半兵衛は、織田家に帰属し、秀吉の前半生の無くてはならない参謀として活躍していきます。

藤吉郎が繰り返し、半兵衛に言っていたことは、言い換えれば、
「あなたは何のために働くのですか？」
という問いを繰り返していたのだと思います。

半兵衛の価値観やキャリアの軸を的確にとらえて、熱量を持って諦めずに口説き続け、最後に「天下統一」という大きな大義名分を打ち出し、心を
掴んだ秀吉は超一流のヘッドハンターでもあったと言えると思います。

ITエンジニアのヘッドハンティングもただ単に、身に付けられるスキルやキャリアにとってのメリットを語るだけでなく、大きな会社のビジョンを語れるかが、大事になってくるかもしれませんね！

『新史・太閤記』だけでなく、司馬遼太郎の小説はビジネス的な観点で読んでみると非常に面白いので、まだ読んだことが無い方は、是非読んでみてください！
フリーターのお勉勉日記

う゛っ頭が痛い。前頭葉が腐っていくのを感じる...！
アウトプットの必要性をようやく知り始めた今日この頃。
好奇心に駆られあちこち閲覧・視聴を繰り返し、知ったはいいものの理解はしていないという無駄な時間の積み重ね。。。
流石に具合も悪くなる。組み立てないとまずい。成長がないと自己愛と自己嫌悪の往復を繰り返すのみ。
いい加減学習してくれよ俺！

てなわけでこちらのQiitaさんを使ってアウトプットをして前進できたらなーという思いでお日記を書いていきます。
お勉強日記です。
インターネットに自分の考えを書き込むのは暇してた学生時代以来なので謎の緊張がある。
ただの記録とは言え人に見られる可能性のある場に自分の頭の中のものを吐き出すというのはやはり重要そうだ。
これがインターネットの良さであり悪さなのだろう。

現状はとにかくWebアプリを作りたく、先ずは見た目だけでもイメージ通りのものを自分で組み立てたいという思いからBootstrapについて学習中。
幸い現在は作りたいものがあります。
階層構造で管理するメモアプリです。
MacのFinderやWindowsのエクスプローラと引き出し日記（iOSアプリ）を組み合わせたものです。
ドキュメント単位で情報を整理するサービスはゴロゴロありますが、呟き程度の文章単位で情報を整理するツールってありそうで何故かない...探せばあるのだろうか。
あろうがなかろうが作りたいものがあることで勉強の動機づけになるのでこの機会を逃す道理もなかろう！

「こんな道具・用役が欲しいのに何故か類似したものが無い」となってからがようやく開発者の旅路の始まり感がありますね。
以前にもIT系の勉強をしていましたが理由は「普段パソコンを使っていて便利であることを知っているからパソコンを用いた仕事をしたい」というありきたりなものや「飯を食うには働かねばならぬから必要最低限の努力はしないといけない」というゾンビ状態だったため何せ続かない。
HTMLやCSSというただの骨組みと塗装の基礎的な学習をやっては飽き、挫折し、忘れ、また基礎勉強をし、挫折し...
人の成長は主体性が全てであることを痛感する。
そういえば塾ってなんのためにあるんだろうか。脳死の人間はお金という価値を支払うことで同等の価値を得られると信じているはずなのでその思考癖？を狙ったビジネスなのだろうか。
学生時代、暇な時に本屋によっては良さそうな教材を買っていた時期もあったが枕にすらなりませんでした。
お金は経験（反省材料）という価値と交換する道具だったのか。

なんだか疲れたので初回はここまで。
早いとこまともな仕事について親を安心させてぇ。
退屈しない日々を送りてぇ。
Capybaraで要素のattributeを取得する

`find('#hoge')`などで取得できる`Capybara::Node::Element`のインスタンスは`Capybara::Node::Element['attribute']`でattributeを取得できるらしい。

ex) idがhogeというdiv要素にスクロールを持たせており、1番下までスクロールしているか確認するテストの実装が必要な場合、下記のようになる。

```rb
# スクロールの最大値は(scrollHeight - clientHeight)で取得できる
expect(find('#hoge')['scrollTop']).to eq find('#hoge')['scrollHeight'] - find('#hoge')['clientHeight']
```

Capybaraでテストしているとattributeを取得したいケースが稀にあるので、`Capybara::Node::Element['attribute']`でattributeを取得できるのはかなり使い勝手が良いと思う。
せんせー、ブレインテックってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、ブレインテックってなに？

# ブレインテックとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/cecad887-4dc9-7b41-b675-a4f4f9607777.png)

ブレインテックは、頭の中の魔法のような技術なんです。

ブレインテックでは、頭の中にある脳を使って、いろんなすごいことができます。

例えば、
お話しを聞いたり、お歌を歌ったり、問題を解いたりする時に、
ブレインテックを使ってみんなの力をアップさせることができます。

ブレインテックを使うと、みんなの頭の中に特別な装置をつけたり、特別なゲームをすることができます。
それで、お話しの内容をよく覚えたり、お歌を上手に歌ったり、
お友達と一緒に問題を楽しく解いたりすることができます。

ブレインテックは、魔法のように頭の中の力をアップさせるけれど、みんなが自分の頭を大切に使うことも大切です。
自分で考えたり、アイディアを出したりすることもとってもすごいことなんです。

これからもブレインテックを使って、楽しく学んでいろんなことを成し遂げてくださいね。
みんなの頭の中には素敵な魔法がたくさん詰まっています。

# まとめ

ブレインテックは、頭の中の魔法のような技術
無料のクラウド環境のセキュリティ診断サービス「Cloud Security」をリリース【個人開発】


先日、「**Cloud Security**」という無料で使えるクラウド環境のセキュリティ診断サービスを公開しました。

Cloud Security
https://app.cloudsecurity.jp/

本記事はそのサービスの使い方の説明です。

https://twitter.com/motikan2010/status/1684523307994066947

## 使い方

### アカウント作成

　最初はアカウントの登録を行います。

１. サイト( https://app.cloudsecurity.jp/ )にアクセスします。
　ログイン画面が表示されますので、「新規登録」画面へアクセスします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16012/0a815876-2a02-e707-4e17-5e3bbcd97d96.png" width="90%">

２. アカウント情報を入力し「新規登録」ボタンを押下します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16012/17c4398b-3e82-882e-2526-aad33532945e.png" width="90%">

３. 登録時に設定したメールアドレス宛に確認メールが送信されます。
　メール内の「メールアドレスの確認」リンクを押下します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16012/0a1f5c0c-a831-f98a-948d-e724d9c592eb.png" width="90%">
　これでアカウント登録は完了です。

### セキュリティ診断の実行

　診断を実施し、結果を表示してみます。

１.  「スキャン対象の登録」ボタンを押下します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16012/27fbd24b-d489-7ac9-9246-584e6b027a57.png" width="90%">

２. 「スキャン対象名」に適当な名前を入力します。

 **「AWS アクセスキー」と「AWS シークレットキー」には診断を行いたいリソースのRead権限を持ったIAMアカウントの情報を入力します。** 

　入力後、「登録」ボタンを押下します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16012/53ec5dc2-32fb-6ecc-3ec0-666b27eede86.png" width="90%">

３. 「スキャン」ボタンを押下します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16012/55721e25-9e28-d913-fa60-90916dc5418d.png" width="90%">

４. しばらく待ちます・・・。（3分ほど）

　診断を中断したい場合は「中断」ボタンを押してください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16012/16cb4fd2-5380-5728-3631-d9ebf9f8147c.png" width="90%">

５. 診断終了後、「結果」ボタンを押下することで診断結果を確認することができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16012/76496617-b345-e30c-bad3-903fbd5b7401.png" width="90%">

６. 診断結果を確認します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16012/2025427e-a12c-51e7-5943-5e0cd3ab580e.png" width="90%">

### アカウントの削除

１. 上部ヘッダ部分からアカウント画面へ遷移できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16012/d9fef445-8d0d-0360-a65d-c1b478d61099.png" width="90%">

２. 「アカウントを削除」ボタンを押下します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16012/2d07615b-c339-81c9-c944-51ab769aa403.png" width="90%">

３. 確認画面が表示されます。
　アカウントのパスワード入力し「アカウントを削除」ボタンを押下します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16012/e12be8c4-c2c7-f2a2-dcf4-a77dea3b8c75.png" width="90%">

４. アカウントの削除が完了します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16012/dcc67cca-f2fb-eb01-c50b-f682af1829df.png" width="90%">

**アカウントを削除すると当アカウントのデータが全て削除されます。**
**復旧はできませんのでご注意ください。**
せんせー、ヒューマン・オーグメンテーションってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、ヒューマン・オーグメンテーションってなに？

# ヒューマン・オーグメンテーションとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/cecad887-4dc9-7b41-b675-a4f4f9607777.png)

ヒューマン・オーグメンテーションは、人間の力をちょっとだけアップさせる魔法のような技術なんです。

普通の人間は、歩くのが速くても、ボールを投げるのが遠くても、一つのことに集中できる時間が決まっています。
でもヒューマン・オーグメンテーションを使うと、それがもっとすごくなります。

例えば、特別な靴を履いたら、もっと速く走ることができるようになるし、特別なグローブをはめたら、
もっと遠くにボールを投げることができるかもしれないんです。
それに、特別なメガネをかけたら、もっとよく見えることができるかもしれないです。

ヒューマン・オーグメンテーションは、人間の力をちょっとだけアップさせることができるんだけど、
魔法のようにすべてのことを解決するわけではないんです。それでも、すごいことがたくさんできます。

みんながヒューマン・オーグメンテーションを使って、もっと楽しく元気に活動できるようになるといいですね。
でも、いつも自分の力を信じて頑張ることも大切です。

# まとめ

ヒューマン・オーグメンテーションは、人間の力をちょっとだけアップさせる魔法のような技術
メモ＠公開用

## 学習しようとしていること
* Haskell
    * https://well-typed.com/training/
* PHP
* Word Press
    * https://www.xserver.ne.jp/blog/contact-form/
* C
* Java
* JS
* SQL
* JSON

## 参考のソース
* https://www.nic.ad.jp/ja/basics/terms/index.html

## これからのこと
読んだ技術書を自分なりに整理することを目的に、その分野のロードマップと解説をサイトで公開する。
せんせー、ニューラルネットワークってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、ニューラルネットワークってなに？

# ニューラルネットワーク

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/0d44c02e-be81-cd19-bb42-d5ea2d693897.png)

ニューラルネットワークは、
ころんとした頭の中にたくさんのお友達（ニューロン）がつながって、一緒に考えたり遊んだりする仕組みなんです。

頭の中のお友達（ニューロン）は、電気の信号でおしゃべりをしたり、情報を伝えたりすることが得意です。

ニューラルネットワークは、このお友達同士のつながり方を工夫して、
難しい問題を解いたり、絵を描いたり、遊びを考えたりするんです。

例えば、
お絵かきをする時に、頭の中のお友達たちが一緒に協力して、色を決めたり、絵のかたちを考えたりします。
それぞれのお友達が得意なことが違うから、一緒に力を合わせると、とっても素敵な絵が描けます。

ニューラルネットワークは、たくさんのことを学んで成長していくんだ。
新しい問題が出てきたら、お友達同士で一緒に試行錯誤して解決策を見つけます。
みんな仲良く協力して、一緒に成長するのがニューラルネットワークの魅力なんです。

これからもたくさんのお友達（ニューロン）と一緒に楽しく学んで、素敵なアイディアを生み出していきましょう。

# まとめ

ニューラルネットワークは、ころんとした頭の中にたくさんのお友達（ニューロン）がつながって、一緒に考えたり遊んだりする仕組み
Javaでディレクトリを中身ごと消す方法

Javaの標準APIにはディレクトリを中身ごとごっそり消すというのが無い。
Files.walk()で中身まで再帰的に取得できるけど、中身のほうが後に来るからそのままでは消せない。

中身が後に来ることもあるというのではなく、中身が後と仕様で決められているので、逆順にすれば消せる。
```java
Files.walk(Path.of("tmp"))
	.map(x -> Stream.of(x))
	.reduce(Stream.empty(), (x, y) -> Stream.concat(y, x))
	.forEach(x -> x.toFile().delete());
```
ソートするとコストはnlognなので、これより重くなるはず。
せんせー、ナノ・テクノロジーってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、ナノ・テクノロジーってなに？

# ナノ・テクノロジーとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/4f780e0e-4785-762f-17df-eb94199bb04e.png)

ナノ・テクノロジーは、とてもちっちゃな技術のことなんです。

普通のおもちゃや家具は大きいけれど、
ナノ・テクノロジーはそれよりもずっと小さいものを作る技術なんです。

例えば、
たくさんのおままごとのキッチンセットがあるけれど、
ナノ・テクノロジーではそのキッチンセットをもっともっと小さく作ることができます。

ナノ・テクノロジーの世界では、超微粒子や原子といったとっても小さなものを使って、
新しいおもちゃや電気製品を作ったり、薬を作ったりすることができます。
これはとってもすごいことで、普通の目に見えるものよりももっと小さなものを作ることができます。

ナノ・テクノロジーは科学の世界で大変重要な技術なんです。
将来では、ナノ・テクノロジーを使って病気を治したり、環境を守ったりすることができるかもしれません。

ナノ・テクノロジーはちょっと難しい言葉だけど、
ちっちゃなものを使ってたくさんのすごいことができます。
これからもっとたくさんのことが発展して、楽しい未来が待っていますね。

# まとめ

ナノ・テクノロジーは、とてもちっちゃな技術のこと
せんせー、量子コンピュータってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/7f59d21b-0564-377b-a326-47169950dc66.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/319ddbbb-e9dd-5833-688d-5808a705af9b.png)

せんせー、量子コンピュータってなに？

# 量子コンピュータ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/8e8fa491-3101-aa61-73b3-a7f803098cf7.png)

量子コンピュータは、普通のコンピュータとはちょっと違う特別なコンピュータです。

普通のコンピュータは、0と1という数字を使って計算をするけれど、
量子コンピュータは、量子という不思議な物理現象を使って計算します。

例えば、
普通のコンピュータは1つの箱に1つのボールしか入れられないけど、
量子コンピュータは1つの箱にいっぱいのボールを入れることができるんです。
これはとってもすごいことで、たくさんの情報を同時に処理することができます。

そして、量子コンピュータは、難しい問題を解くのが得意なんです。
普通のコンピュータでは時間がかかる問題でも、量子コンピュータはとっても速く解けることがあります。

でも、量子コンピュータはまだまだ発展途中で
、今は大きな部屋にたくさんの機械が必要だけど、
未来ではもっと小さくて便利なコンピュータになるかもしれません。

量子コンピュータはとっても不思議で面白い技術なんです。
将来はもっとたくさんのことに使われて、世界がもっと便利になるかもしれません。

# まとめ

量子コンピュータは、量子という不思議な物理現象を使って計算する特別なコンピュータ
マルチプラットフォームで開発環境を揃える

会社ではMac、プライベートではWindowsとChromeBookを使っており。
以前はそれぞれ標準のTerminalにtmux入れて使っていたが、細かい操作が違うといちいちストレスなので開発環境はできるだけ揃えたかった。

とりあえず Terminal さえ同じであればどうとでもなるのでマルチプラットフォームな Terminal を、
という事で使っているものを適当に書いておく。

# [tabby](https://tabby.sh/)
![スクリーンショット 2023-07-28 19.34.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590344/79dbba45-d648-f520-ef42-2d52f906f719.png)
https://tabby.sh/

最初に使っていたのがコレ。
とりあえずインストールすればだいたい使えるので楽で良い。
ただ若干挙動が重い気がせんでもない（使用に差し支えはない）。
これに tmux を組み合わせて使っていた。

# [WezTerm](https://wezfurlong.org/wezterm/index.html)
![スクリーンショット 2023-07-28 19.34.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590344/995fb390-ba2b-2d17-7101-2f9df56f4e84.png)
https://wezfurlong.org/wezterm/index.html

tabby がちょっと重いのと tmux の設定するのがアレだったので、最近こちらに乗り換えた。
最初に設定ファイルを自分で用意する必要がある（プラットフォーム毎に別の設定がいる）んで少々面倒だが、そこさえ超えれば良い感じ。
WezTerm自体にマルチプレクサ機能があるので tmux は不要に。
tabby は TypeScript製だが、WezTermは Rust製。
それもあってか挙動はかなり軽快に。


# ついでに

Terminal さえあれば、あとは自分の vimrc を持っていればどうとでもなる。
ただ急に自分の環境以外での作業とか、生のvimを使わざるを得ない場合など
vimをちょっとでも快適にしたい、そんな時。

## [Vim Bootstrap](https://vim-bootstrap.com/)

![スクリーンショット 2023-07-28 19.35.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590344/e88b2fff-e977-9fa1-083c-3df79b8ffe09.png)

とりあえず　[Vim Bootstrap](https://vim-bootstrap.com/) で vimrc生成すると若干幸せになれます。