OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel Restful(リソース) コントローラー　について

# Restful Controllerとは

あるデータの追加、読み取り、更新、削除についての決まり切った処理を簡潔にできる機能です。

CRUD(新規作成、表示、更新、削除)
C(create, store) R(index, show, edit) U(update) D(destroy)

下の表ではブログ写真投稿システムにおける記事(photos)モデルです
表示・・GET、DBに保存・・POST


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2911371/0418e7db-cb87-1df3-0824-40be63d5cde0.png)


生成コマンド
```
php artisan make:controller FillauthController ̶--resource
```

app/Http/Controllers/に作成されます.
また階層を指定したい場合は
```
php artisan make:controller photos/
FillauthController --resource
```
app/Http/Controllers/photos/の中に作成されます。

ルート側記述
```
Route::resource(‘fillauth', OwnersController::class)
->middleware(‘auth:admin’)
```

view 記述
```
 <x-nav-link :href="route('mymy.fillauth.index')" :active="request()->routeIs('mymy.mymy.index')"> 全一覧</x-nav-link>
```
route('mymy,resource('この部分',class),resourceの指定メゾット)で記述してください

<button onclick="location.href='{{route('mymy.fillauth.edit',['fillauth'=>$my->id])}}'">編集</button>

またidや変数を渡す際はresourceに記述したものを書いて下さい
Route::resource(‘fillauth'<-この部分
便利なので是非使ってみてください!
GolandのWSL環境利用によるデバッグ

**やりたいこと**
WindowsにインストールされているGoland(jetbrains製IDE)でWSL環境を利用してデバッグします。
⇒Linux環境でないと動かない場合に便利

**Windows環境でテスト**
都合によりWindows環境では失敗…
![222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114591/c761f24c-5e81-8293-cd1d-61b6bde9eae4.png)

**WSL2(ubuntu20.04)環境でテスト**
「実行構成の編集」選択
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114591/70cf4950-28ca-b65a-8d75-e20e305deb1d.png)

実行場所：「WSL」選択
![syu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114591/3c8592e2-8dc9-60c4-dcb1-66234ffc1a50.png)


「次へ」選択
![333.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114591/051af184-9486-ee9e-e6ab-b6bca7697797.png)

「完了」選択
![444.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114591/0696643c-28b6-5fdf-1e39-97cf135f8fb1.png)

作成した実行場所が選択されていることを確認
![555.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114591/deb73a46-7ea8-0bdf-8680-65fa0e1421bd.png)

「リモートターゲット上にビルドする」を選択
![666.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114591/cdfd9aac-dba0-55e2-1478-f7c9631938d2.png)

テストが通る🙌
![777.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3114591/c7cd45b9-3914-db52-1dd1-be3eaeca78e9.png)
HTMLをやめてPugに乗り換えよう

## HTMLをPugで書くメリット

- 閉じタグを書かなくて良い
- header、footerなど共通部分を別ファイルで管理できる
- 変数や条件分岐ができる
- jsが書ける

## HTMLをPugで書くデメリット

- HTML => Pugに変換する環境が必要（Gulpを使えば簡単。もしくはGUI変換ならPreprosで出来るらしい）

## 実際にどのくらい記述差があるのか？

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Pug</title>
    <script type="text/javascript">
        foo = true;
        bar = function() {};
        if (foo) {
            bar(1 + 5);
        }
    </script>
</head>
<body>
    <h1>Pug - node template engine</h1>
    <div class="col" id="container">
        <p>You are amazing</p>
        <p>Pug is a terse and simple templating language with a strong focus on
            performance and powerful features.</p>
        <ul>
            <li>item 0</li>
            <li>item 1</li>
            <li>item 2</li>
        </ul>
    </div>
</body>
</html>
```

```pug
doctype html
html(lang="en")
  head
    title Pug
    script(type="text/javascript").
      foo = true;
      bar = function () {};
      if (foo) {
      bar(1 + 5);
      }
  body
    h1 Pug - node template engine
    #container.col
      p You are amazing
      p
        | Pug is a terse and simple templating language with a strong focus on
        | performance and powerful features.
      ul
        - for (var x = 0; x < 3; x++)
          li item #{x}
```
ハンズオン　Linuxのしくみ

Linuxから目を背け続けていたのですが、お仕事で必要になったってしまったので、
うさぎのアイコンの方が著者の　"Linuxのしくみ"　を試して理解しようと思います。

https://twitter.com/satoru_takeuchi/status/1624193443693211648?s=20&t=v7o_tJA7ljKYxCSjD-cjnQ


https://twitter.com/nekokane/status/1625229686757539842

# 環境
作業用のメインPCのTeratermから、ミニPCのUbuntuにアクセスします。
・ミニPC： 8GB DDR, 128G SSD, Intel N5095
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/b74b80f4-2ae8-74cb-7f56-d8006a347444.png)

詳細手順は下記。
https://qiita.com/nekokane/items/610294ce18e9ae802582

# 参考文献
[1]「Linuxのしくみ 増補改訂版」の実験コード 
https://github.com/satoru-takeuchi/linux-in-practice-2nd

# 事前準備
## 0.1. Teratermでログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/2d18b2e2-5b81-903f-7a53-be4cc37f4363.png)

## 0.1 実験プログラム実行環境の作成 [1] p xi 
パッケージのインストールと、ユーザーの追加。
https://github.com/satoru-takeuchi/linux-in-practice-2nd
```
sudo apt update &&　・・・
```
# 1. Linuxの概要
・ユーザーモード＝ユーザーランド＝ユーザー空間
　カーネルさんが、ストレージアクセスとか制御してくれるので、安心。
・システムコール
　ユーザモードのプロセスから、カーネルに処理を依頼。
・システムコールを見る
　https://github.com/satoru-takeuchi/linux-in-practice-2nd/blob/main/01-operating-system-overview/hello.go

/*---------------------
 hello.goをgithubからローカルにコピーする方法が分からない。
・GitHubからプログラムをダウンロード・インストール
　https://rnakato.hatenablog.jp/entry/2018/08/04/151041
　・Code ->　Local Clone -> コピー　で良さそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/51681bed-2331-4070-42b8-126ae249ba2c.png)
```
git clone https://github.com/satoru-takeuchi/linux-in-practice-2nd.git
```
---------------------*/

## 01-02 hello.py
・hello.goがあるフォルダに移動"cd"する。
```
$ cd linux-in-practice-2nd/
$ cd 01-operating-system-overview/
```
・ hello.goをビルドして、実行。
```
$ go build hello.go
$ ./hello
```
・straceで実行して、logを表示
```
$ strace -o hello.log ./hello
$ cat hello.log
```

・hello world 改行が表示されるようにシステムコールしているっぽい。
```
write(1, "hello world\n", 12)           = 12
```

// 2023年2月14日 P6 今日はここまで・・・

## 01-02 hello.py
hello .pyは、~/linux-in-practice-2nd/01-operating-system-overview　配下にある。
```
kaneb1a@beelink01a:~/linux-in-practice-2nd/01-operating-system-overview$ ls
hello  hello.go  hello.log  hello.py  inf-loop.py  pause.c  syscall-inf-loop.py
```

helo.pyの実行をトレース。hello waorldを表示するのは、goでもpyでも、
write(1　っぽい。
```
strace -o hello.py.log ./hello.py
cat ./hello.py
～
write(1, "hello world\n", 12)           = 12
～
```
### sarコマンド　CPUを使ってる時間
sar -P 0 1 1

## 01-03 inf-loop.py
CPU 0でループ刺せて、sarコマンドで、CPU使用状態を見る。

```
taskset -c 0 ./inf-loop.py &
sar -P 0 1 1
08:17:18 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
08:17:19 PM       0    100.00      0.00      0.00      0.00      0.00      0.00
```
無事に、userによるCPU使用が100になった！
//　2/19 P9 まで
未経験からエンジニアになる  データベースの機能・２相コミット（２フェーズコミット）

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回はデータベースの機能　２相コミット（２フェーズコミット）について更に詳しく調べてみましょう！

![インスタスライド_202302013.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/6aab07e7-d7c7-477b-69b5-52b1d396619a.gif)


# ２相コミットとは
複数の独立したシステムが参加する分散トランザクションにおいて、処理の整合性が保たれるよう2段階に分けてコミットを行う手法。

２フェーズコミットとも呼ばれます

# 処理概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/8d7999af-a562-1653-8511-6ff46709eabf.png)

# も少し簡単に
処理概要みてもややこしそう。。。

要は、二人（DB）に対して、二人ともOKと言ってくれた段階で改めてコミットする仕組み。

途中で片一方（A)がエラーと言えば、Bもエラーにしてロールバックする

これを２フェーズコミットといいます。

# まとめ
ー２相コミット、２フェーズコミットがある
ー分散DBに対して使われる
ー使う側は、分散DBとして、２フェーズコミットを意識する必要はない
ーでも論理的に知っとこう

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
linux から　windows11への　teamviewer



1）　windows 11 にて

|画面割れのelite X2 g2 を買ったのでこのX2　のwindowsの操作をLINUXからするようにします
|:---


![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/e1b3de93-9090-dc3e-6ad4-9a0466444c8f.jpeg)


## ２）以下はずっと　linuxでの操作です
garuda linux （arch一派です）の場合は

```
pacman -Sy teamviewer
```
で導入です


```
# teamviewer --daemon start
# systemctl start teamviewerd.service

```

そして


![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/9486413a-d5fa-b1c2-6ced-87a5dc3d955d.png)

をクリックすると

![22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/7f9d4d2a-c9b0-ac86-94f4-723f1c01b8b6.jpeg)

この上に表示されているパスワードに　**１)**  のをいれると



![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/4cb25421-f37d-0619-0205-b95594e0dc0e.jpeg)

です

linux上で　windows11の操作ができます
2023/2/14主にITとかセキュリティの記事

PostgreSQL 15.2、14.7、13.10、12.14、11.19リリース、1件の脆弱性を修正(2/12)
https://news.mynavi.jp/techplus/article/20230212-2587675/

Linuxの新しいsandbox機構「Landlock」(2/12)
https://qiita.com/nekoaddict/items/39125b8cd01da08b6a91

対話式のAI サイバー犯罪に悪用のおそれ ウイルスも作成可能(2/12)
https://www3.nhk.or.jp/news/html/20230212/k10013978491000.html

Apple、iOSマップのバグがプライバシー情報流出させたとの報道を完全否定(2/11)
https://iphone-mania.jp/news-523576/

ブラックハットSEOキャンペーンとは何か、被害を避けるために(2/12)
https://news.mynavi.jp/techplus/article/20230212-2586544/

2021年のTesla Model S衝突事故、Autopilotは使われていなかったとの最終報告書(2/12)
https://www.zaikei.co.jp/article/20230212/709354.html

Telegram（テレグラム）の使い方を解説 | 仮想通貨の情報収集に使えるツール(2/12)
https://crypto-times.jp/how-to-use-telegram/

U字工事・益子、フィッシング詐欺の被害　カード会社に電話する表情には疲れ「ご注意ください」(2/12)
https://news.yahoo.co.jp/articles/7f6e3b5ce5d6ab7f06248d64677648d11f252957?source=rss

“ルフィ”がついに日本へ強制送還…あなたも狙われている！「個人情報流出」と「闇バイト」の巧妙手口(2/12)
https://news.yahoo.co.jp/articles/19f1a511c9676f0a171bf32c0b33dac30441c067?source=rss

【特別企画】増加する「手土産転職」の脅威 - 内部漏洩どう防ぐ？
https://www.security-next.com/143407

能動的サイバー防御（Active Cyber Defense）(2/13)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/020800134/

SBI生命がETLを「AWS Lambda」で実装、専用サービスGlueから置き換えた理由(2/13)
https://xtech.nikkei.com/atcl/nxt/column/18/02355/020900002/

野村総研系が半導体製造のサイバーセキュリティー対策支援、SEMI新規格に対応(2/13)
https://xtech.nikkei.com/atcl/nxt/news/18/14616/

アマゾンやプリファード系が実用的な家庭用ロボット、AIで進化(2/13)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/07664/

Windows Updateの勝手な動作が迷惑、不要な通知や更新ファイルの共有を止める(2/13)
https://xtech.nikkei.com/atcl/nxt/column/18/02329/011600009/

県全体でハウス栽培をIoT化　AWSデータ基盤使い収量高める(2/13)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600004/020600124/

米国ではIT企業が11万人を解雇　終身雇用の日本が陥った大問題(2/13)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/020600131/

迷える利用者を導くデジタルアダプション(2/13)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/020800136/
Reinstall Graphic Board Driver in Ubuntu

# Reinstall Graphics Board Driver in Ubuntu

Delete the existing driver. For example...
```bash
sudo apt purge nvidia-*
sudo apt purge cuda-*
```
Reinstall new driver in Ubuntu.
```bash
sudo ubuntu-drivers autoinstall
```

---
<font color="yellowgreen">**QiitaLink**</font>
<font color="black">**Designed by RENOX**</font>
BLE Micro ProでKeyball44を無線化したい

# 結論
BLE Micro Proでkeyball44が動作するまでは確認できましたが、光学センサー(PMW3360)へ電源を供給する術がないぞ..というところで断念しました。少なくともUSB経由で電源を供給してあげれば無線で使用できるのでBMPのファームウェアだけでも供養しておきます。あとはハードウェアに詳しい方が...（「keyball44を無線化したい」というツイートは散見されたので需要はありそう）

https://github.com/sndmtk/ble-micro-pro-for-keyball44

# Keyball
[白銀ラボ](https://shirogane-lab.com/)さんが販売している分割型トラックボール付きキーボード

# BLE Micro Pro
使用するキーボードに合わせてCONFIG.JSNを設定するだけで簡単に自作キーボードを無線化できる優れもの。キーボードによっては対応していない場合もあるようですが、Keyballのドキュメントを見ながら順番に設定すると無事に無線でキー入力ができました。

## CONFIG.JSN
自分のkeyballは右側（ボールあり）、左側（ボールなし）なので右側をマスター、左側をスレーブにしています（ちなみにLEDやOLEDは使用していません）。両方とも無線で使うこともできますし、TRRSケーブルを繋いだ状態だと左側（スレーブ側）は電源がなくても動作するようでした。

``` keyball44_master_right_config.json
{"config":{"version":2,
"device_info":{"vid":"0x0000","pid":"0x0000","name":"ble_micro_pro","manufacture":"sekigon-gonnoc","description":"A development board for wireless split keyboards"},
"matrix":{"rows":8,"cols":6,"device_rows":4,"device_cols":6,"debounce":1,"is_left_hand":0,"diode_direction":0,"row_pins":[20,19,18,17],"col_pins":[7,8,9,10,11,12],
"layout":[
  1,  2,  3,  4,  5,  6, 30, 29, 28, 27, 26, 25,  0,
  7,  8,  9, 10, 11, 12, 36, 35, 34, 33, 32, 31,  0,
 13, 14, 15, 16, 17, 18, 42, 41, 40, 39, 38, 37,  0,
 20, 21, 22, 23, 24, 48, 47, 44]},
"mode":"SPLIT_MASTER","startup":1,
"peripheral":{"max_interval":20,"min_interval":10,"slave_latency":7},
"central":{"max_interval":60,"min_interval":30,"slave_latency":7},
"led":{"pin":1,"num":60},
"keymap":{"locale":"US","use_ascii":0},
"reserved":[0,0,0,0,0,0,0,0]}}
```

``` keyball44_slave_left_config.json
{"config":{"version":2,
"device_info":{"vid":"0x0000","pid":"0x0000","name":"ble_micro_pro","manufacture":"sekigon-gonnoc","description":"A development board for wireless split keyboards"},
"matrix":{"rows":8,"cols":6,"device_rows":4,"device_cols":6,"debounce":1,"is_left_hand":1,"diode_direction":0,"row_pins":[20,19,18,17],"col_pins":[7,8,9,10,11,12],
"layout":[
  1,  2,  3,  4,  5,  6, 30, 29, 28, 27, 26, 25,  0,
  7,  8,  9, 10, 11, 12, 36, 35, 34, 33, 32, 31,  0,
 13, 14, 15, 16, 17, 18, 42, 41, 40, 39, 38, 37,  0,
 20, 21, 22, 23, 24, 48, 47, 44]},
"mode":"SPLIT_SLAVE","startup":1,
"peripheral":{"max_interval":60,"min_interval":30,"slave_latency":7},
"central":{"max_interval":60,"min_interval":30,"slave_latency":7},
"led":{"pin":1,"num":60},
"keymap":{"locale":"US","use_ascii":0},
"reserved":[0,0,0,0,0,0,0,0]}}
```

## ファームウェア
[BMPのサンプル](https://github.com/sekigon-gonnoc/qmk_firmware/tree/dev/ble_micro_pro/keyboards/ble_micro_pro/keymaps/bto_tb)と[Keyballのドライバーの実装](https://github.com/Yowkees/keyball/tree/main/qmk_firmware/keyboards/keyball/drivers/pmw3360)を参考にSPIでPMW3360を制御するコードを追加したところ無線でマウス入力もできました。とりあえず動作検証して終わった程度なのでcpiの調整機能などは実装してません。ハードウェアの課題が解決できれば残りの実装やトラックボールを操作した際の自動レイヤー切り替えなども対応したいですね..

https://github.com/sndmtk/ble-micro-pro-for-keyball44/tree/main/keyball44
Airtable代替比較



# はじめに

Airtableいじっててうっかり1200レコード超えそうになってあわてたので、乗り換えを検討してみた。

# やりたいこと

C#でデータを引っ張ってきて加工して、アプリのマスターデータとして使用。基本的に開発マシンでしか触らない。リアルタイム読み込みや書き込みはしない。

# 比較

| サービス名 | セルフホスト | クラウド | 無料クラウド制限 | セルフホストDB | .NET APIClient | ソース | ライセンス |
| --- | --- | --- | --- | --- | --- | --- | --- |
| [Airtable](https://airtable.com/) | × | 〇 | 1200レコード | 非対応 | 〇[作った](https://qiita.com/VBmouiya/items/bc6ded7f7d8494e0debc) | 非公開 |  |
| [Baserow](https://baserow.io/) | 〇 | 〇 | 3000レコード | PostgreSQL | × | https://gitlab.com/bramw/baserow | [MIT](https://gitlab.com/bramw/baserow/-/blob/develop/LICENSE) |
| [NocoDB](https://www.nocodb.com/) | 〇 | ×準備中 |  | MySQL,<br>PostgreSQL,<br>Microsoft SQL Server,<br>SQLite,<br>Amazon,<br>Aurora,<br>MariaDB | × | https://github.com/nocodb/nocodb | [AGPL](https://github.com/nocodb/nocodb/blob/develop/LICENSE) |
| [Grist](https://www.getgrist.com/) | 〇 | 〇 | 5000レコード | Sqlite,PostgreSQL | × | https://github.com/gristlabs/grist-core/ | [Apache License, Version 2.0](https://github.com/gristlabs/grist-core/blob/main/LICENSE.txt) |

# 感想

Gristいいかもしれん。無料クラウドあるし、Sqliteでセルフホストできるし、そのうち触ってみよ。

# 参考文献

[Airtable Alternatives](https://alternativeto.net/software/airtable/)

[Airtableみたいな機能クラウド型データベースツールが他にないか調査してみたメモ](https://qiita.com/manji6/items/cdc641c070637da4a0d6)
高卒未経験からフロントエンドエンジニアを目指す奮闘記・初投稿

#自己紹介
初めまして、chibanoyatsuと申します。
タイトルにもあるように私は現在22歳で高卒です。

知人の紹介で軽いホームページ制作のバイトはさせて頂いていますが、エンジニアとしては未経験で、エンジニア転職をしてバリバリ働くのを目標にしています。
目標にむけてスクールに入会をしましたので、学んだことのメモ、知識定着の確認として記事を投稿していきます。

つたない文章ですが、ぜひアドバイス等頂ければ幸いです。
GitHub Blocks と p5.js の組み合わせをさっそく試した時のメモ（記事執筆時点では Technical Preview）

GitHub から、「Welcome to GitHub Blocks!」というメールが来ていて、記事執筆時点では Technical Preview となっている [GitHub Blocks](https://blocks.githubnext.com/) が自分のアカウントで使える状態になったようだったので、早速試してみたという話です。

## 試した内容
サンプルを見ながら GitHub Blocks でできることを確認していると、その中に JavaScript の描画ライブラリ p5.js に関する内容のものがありました。

具体的には、p5.js で作った内容を描画するキャンバスを、GitHub上で表示できるというものでした。それに関して、「キャンバスを単独で出すもの」と、「キャンバス ＋ ソースコードを並べて表示するもの」があるようでした。

https://twitter.com/youtoy/status/1623880005729288192

今回の記事では、このサンプルとして用意されたものをベースに試していきます。

### サンプルを自分のリポジトリで試してみる
上記のツイートは、GitHub Blocks のサンプルをそのまま表示していたものですが、それと同じことを[自分のリポジトリ（GitHub Blocks のお試し用に作成したもの）](https://github.com/yo-to/p5GitHubBlocks/blob/main/README.md) でもやってみました。そして、問題なく成功。

https://twitter.com/youtoy/status/1623887489101631488

### サンプルとは別の描画で試してみる
次に、p5.js公式サンプルの「WEBGLもモードを使った 3D での表示」と「Webカメラの映像表示」を試してみました。その結果は、以下の通りです。

https://twitter.com/youtoy/status/1625164430240784386

表示は 2つの方法（「キャンバスを単独で表示」、「キャンバス ＋ ソースコードを並べて表示」）で試したました。

「Webカメラの映像表示」と「キャンバス ＋ ソースコードを並べて表示」の組み合わせだけ、キャンバス上の描画が行われていなかったようでした。

### 作成したリポジトリ
お試し用に作成したリポジトリは、こちら。

●yo-to/p5GitHubBlocks
　https://github.com/yo-to/p5GitHubBlocks
![yo-to/p5GitHubBlocks](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/36f1eeb8-b78c-bc5e-e86c-a835d66c2cb5.png)

「リンクのメモ」という項目の下には、GitHub Blocks を試すためのリンクを並べています。

●p5GitHubBlocks/README.md at main · yo-to/p5GitHubBlocks · GitHub
　https://github.com/yo-to/p5GitHubBlocks/blob/main/README.md

### GitHub Blocks を利用する際の URL
GitHub Blocks を利用する際の URL について少し補足します（※ 記事執筆時点での内容）。

具体的には、今回の p5.js関連の表示用サンプルで、自分が用意したリポジトリ内のファイルを使う場合の話です。例えば、3D表示を行う JavaScript のプログラムの URL は `https://github.com/yo-to/p5GitHubBlocks/blob/main/p5-orbitControl.js` なのですが、そのファイルに対して「キャンバスを単独で表示」と「キャンバス ＋ ソースコードを並べて表示」を行うための URL は以下となるようでした。

- キャンバスを単独で表示
   - `https://blocks.githubnext.com/yo-to/p5GitHubBlocks/blob/main/p5-orbitControl.js?blockKey=Wattenberger__blocks__p5-sandbox`
- キャンバス ＋ ソースコードを並べて表示
   - `https://blocks.githubnext.com/yo-to/p5GitHubBlocks/blob/main/p5-orbitControl.js?blockKey=githubnext__blocks-examples__processing`

構成としては、以下となるようでした。
`https://blocks.githubnext.com/【GitHub のユーザー名】/【リポジトリ名とそれ以下のファイルのパス】?【GitHub Blocks の表示に関するパラメータ】`

#### ブロックの自作やその他
公式のドキュメントの中に、以下の「Developing blocks」という内容があるので、今回のようにサンプルとして用意された表示方法を利用する以外に、表示部分を自作をすることもできそうです。これについては、まだあまり把握できてないので、追って情報を見ていこうと思います。

●blocks/docs/Developing blocks at main · githubnext/blocks
　https://github.com/githubnext/blocks/tree/main/docs/Developing%20blocks

また、p5.js の描画用キャンバスを表示させる以外にも、数値データを可視化したり、Markdown のプレビューのサンプルがあったりするようなので、それらも見ていければと思います（※ 以下は、そのようなサンプルが置かれた場所の URL）。

●blocks/examples at main · githubnext/blocks · GitHub
　https://github.com/githubnext/blocks/tree/main/examples
M/M/1モデル

# M/M/1モデル
オンラインリアルタイム処理の応答時間の予測をするためには、待ち時間行列モデルが使われる。
代表的な```M/M/1```モデルは```不定期に到達する待ち時間で/処理時間がまちまちで/処理するCPUは一つのみ（待ち行列は溢れない)```という条件で、平均到達時間を計算する。

M:```単位時間あたりの到着数```（ポアソン分布）
M:```一件当たりのサービス時間```（指数分布に従う）
M:```サービスを受ける窓口の数```（1個）
(∞):```システム内の滞留可能数```（無限大）

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8

```待ち行列モデルでは条件をa/b/cという形式```で表し、```aは客の到着間隔```、```bはサービス提供時間```、```cはサービスを提供する窓口数```を示しています。"M"はマルコフ過程のMでランダムという意味なので、M/M/1は、客の到着間隔がランダム、サービス提供時間がランダム、サービスを提供する窓口が1つという条件下における待ち行列モデルとなります。

待ち行列モデルでは、```空いた窓口には直ぐに次の顧客を割り当ててサービスを開始することを条件```としているので、```窓口の状況に応じて客がサービス提供を待つことが条件となっている場合には正しく分析を行うことができません```。

# 出典
https://www.fe-siken.com/kakomon/03_menjo/q5.html#:~:text=%E5%BE%85%E3%81%A1%E8%A1%8C%E5%88%97%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A7%E3%81%AF%E6%9D%A1%E4%BB%B6%E3%82%92a/b/c%E3%81%A8%E3%81%84%E3%81%86%E5%BD%A2%E5%BC%8F%E3%81%A7%E8%A1%A8%E3%81%97%E3%80%81a%E3%81%AF%E5%AE%A2%E3%81%AE%E5%88%B0%E7%9D%80%E9%96%93%E9%9A%94%E3%80%81b%E3%81%AF%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E6%8F%90%E4%BE%9B%E6%99%82%E9%96%93%E3%80%81c%E3%81%AF%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E6%8F%90%E4%BE%9B%E3%81%99%E3%82%8B%E7%AA%93%E5%8F%A3%E6%95%B0%E3%82%92%E7%A4%BA%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%22M%22%E3%81%AF%E3%83%9E%E3%83%AB%E3%82%B3%E3%83%95%E9%81%8E%E7%A8%8B%E3%81%AEM%E3%81%A7%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%81%A8%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81M/M/1%E3%81%AF%E3%80%81%E5%AE%A2%E3%81%AE%E5%88%B0%E7%9D%80%E9%96%93%E9%9A%94%E3%81%8C%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%80%81%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E6%8F%90%E4%BE%9B%E6%99%82%E9%96%93%E3%81%8C%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%80%81%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E6%8F%90%E4%BE%9B%E3%81%99%E3%82%8B%E7%AA%93%E5%8F%A3%E3%81%8C1%E3%81%A4%E3%81%A8%E3%81%84%E3%81%86%E6%9D%A1%E4%BB%B6%E4%B8%8B%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E5%BE%85%E3%81%A1%E8%A1%8C%E5%88%97%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A8%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%0A%E5%BE%85%E3%81%A1%E8%A1%8C%E5%88%97%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A7%E3%81%AF%E3%80%81%E7%A9%BA%E3%81%84%E3%81%9F%E7%AA%93%E5%8F%A3%E3%81%AB%E3%81%AF%E7%9B%B4%E3%81%90%E3%81%AB%E6%AC%A1%E3%81%AE%E9%A1%A7%E5%AE%A2%E3%82%92%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E3%81%A6%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E9%96%8B%E5%A7%8B%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E6%9D%A1%E4%BB%B6%E3%81%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%E7%AA%93%E5%8F%A3%E3%81%AE%E7%8A%B6%E6%B3%81%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%A6%E5%AE%A2%E3%81%8C%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E6%8F%90%E4%BE%9B%E3%82%92%E5%BE%85%E3%81%A4%E3%81%93%E3%81%A8%E3%81%8C%E6%9D%A1%E4%BB%B6%E3%81%A8%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AB%E3%81%AF%E6%AD%A3%E3%81%97%E3%81%8F%E5%88%86%E6%9E%90%E3%82%92%E8%A1%8C%E3%81%86%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82

### 気づき
待ち行列に対するモデルなのか。
窓口の状況に応じた時に対する待ち時間じゃないんだな。
一つ一つ行なって待ち時間を計算するのか。
FR24feedで使うコマンド集

・起動
```
$ sudo systemctl start fr24feed
```

・起動状況の確認
```
# どれでもOK
$ fr24feed-status(web版とほぼ同じ表記)
$ systemctl status fr24feed
$ sudo service fr24feed status
```
Active: active (running)になっていればOK

#http://IPアドレス:8574
スマホ、PCで起動状況が分かる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3152119/40731c35-26e4-6168-ace2-0d9a3dc656db.png)

・停止
```
$ sudo service fr24feed stop
```

・再起動
```
$ sudo service fr24feed restart
```
<font color="red">**補足**</font>
```
$fr24feed-status
FR24 Feeder/Decoder Process: running.
FR24 Stats Timestamp: 2025-XX-XX XX:XX:XX.
FR24 Link: connected [UDP].
FR24 Radar: T-RJXXXX.
FR24 Tracked AC: 0.
Receiver: connected ( MSGS/ SYNC).
FR24 MLAT: not running ... failed!
```
定期的にエラーになるので、再起すると大体治る。
```
$ sudo systemctl start fr24feed
```
SwiftPMでR.swiftを導入する

Swift Package Manager（SPM,SwiftPM）でR.swiftを導入する方法を紹介します。

[R.swift README](https://github.com/mac-cain13/R.swift#xcode-project---spm)

### 1. R.swiftをインストールする
Xcodeで直接設定する方法もありますが、Package.swiftで管理することをおすすめします。

- `Package.swift`の`dependencies`に依存関係を追加します
```Package.swift
  dependencies: [
    .package(url: "https://github.com/mac-cain13/R.swift.git", from: "7.2.4")
  ],
```
- ターゲットにつ依存関係とプラグインを追加します
```Package.swift
  dependencies: [
    .package(url: "https://github.com/mac-cain13/R.swift.git", from: "7.2.4")
  ],
  .target(
    name: "Example",
    dependencies: [.product(name: "RswiftLibrary", package: "R.swift")],
    plugins: [.plugin(name: "RswiftGeneratePublicResources", package: "R.swift")]
  )
```

この設定だけで今まで必要だったR.generated.swiftの生成が必要なくなりました！

⬇️ 以下過去の遺物

---

### 2. rswiftコマンドを使えるようにする
MintまたはHomebrewを使ってrswiftを入れます。Homebrewはバージョン指定ができないためMintがおすすめです。
```
# Mint
$ mint install mac-cain13/R.swift@7.2.4

# Homebrew
$ brew install rswift
```

### 3. Run scriptに追加する
必要に応じて`R.generated.swift`を生成するディレクトリを変更してください。
```
if which rswift >/dev/null; then
  rswift generate "${SRCROOT}/${TARGET_NAME}/R.generated.swift"
else
  echo "rswift not installed"
fi
```

- Input Files
```
$TEMP_DIR/rswift-lastrun
```

- Output Files
```
$SRCROOT/$TARGET_NAME/R.generated.swift
```

これでビルドすると指定したディレクトリに`R.generated.swift`が生成されます。
おうちクラウド的vSphere/vSAN等構築時のメモ帳

個人的おうちクラウド2023
自分が設定とか入れるとときに気をつけないといけないメモをだらだら書いてます。

> 2023/2/26追記
UserConでしゃべった内容も含めてコメントを追記しました。

#### 永続的スクラッチ場所変更

https://kb.vmware.com/s/article/1033696?lang=ja

vSANをNUCに構築する際、基本的にUSBメモリにESXiをインストールしないとストレージが足りなくなる。
が、公式のドキュメントには以下がかかれている。

> レガシー SD デバイスおよび USB デバイスは、次の制限付きでサポートされます。
SD および USB デバイスは、ブート バンク パーティションではサポートされます。最高のパフォーマンスを得るには、ESX-OSData ボリュームの /scratch および VMware Tools パーティションを格納する 32 GB 以上の別個のパーシステント ローカル デバイスも用意します。パーシステント ローカル デバイスに最適な容量は 128 GB です。ESX-OSData パーティションを格納するために SD および USB デバイスを使用することは推奨されません。
ESXi 7.0 Update 3 以降では、起動デバイスが、HDD、SSD、NVMe デバイスなど、ローカル パーシステント ストレージを持たない USB または SD カードの場合、VMware Tools パーティションが RAM ディスクに自動的に作成されます。詳細については、ナレッジベースの記事KB83376を参照してください。
/scratch パーティションをローカル パーシステント ストレージがない USB または SD カードに割り当てると、警告が表示され、フラッシュ メディア デバイス上のブート バンク パーティション以外のパーティションを作成または構成できません。最適なパフォーマンスを得るには、/scratch パーティションを RAM ディスクに設定します。また、/scratch パーティションを構成した後に、SAN または NFS に移動することもできます。詳細については、ナレッジベースの記事 KB1033696 を参照してください。
SD フラッシュ ストレージ デバイスに ESXi をインストールする特定のサーバ モデルでは、サーバ ベンダー承認の SD フラッシュ デバイスを使用する必要があります。検証済みデバイスのリストについては、partnerweb.vmware.comを参照してください。
SD カードまたは USB を使用する環境の最新のガイダンスについては、ナレッジベースの記事 KB85685 を参照してください。
適切な SD または USB 起動デバイスを選択する手順については、ナレッジベースの記事KB82515を参照してください。

基本的にちゃんとログを保存できるストレージを別に用意しないとサポートしないっていう意味かと（確か書き込み回数が多すぎてすぐ壊れてしまうというのが理由だったかと。
ｖSAN環境を自宅とかに作る場合には必須の設定なので、忘れずに設定するべし。


#### どうせPSODがでてもどうしようもないので再起動させる

https://kb.vmware.com/s/article/2042500

あるあるなのだが、自宅の環境を再起動かけたときにPSODが発生してしまう可能性もゼロではない。
（筆者はメンテナンスで落としたときによく見かけるので手動でNUCの電源を落とさないといけなくていつも面倒と思っている）
自分のおうち環境なので問い合わせをするわけではないのでとりあえず再起動してくれと願うためのKB。
```
esxcfg-advcfg -s seconds /Misc/BlueScreenTimeout
```
`seconds`の項目のところに秒数を入れる。自分の設定だと

```
esxcfg-advcfg -s 60 /Misc/BlueScreenTimeout
```
60秒で再起動してもらうようにしている。


#### 面倒でもDNSを設定してvCenter構築しろよって話

https://communities.vmware.com/t5/VMware-vCenter-Discussions/VCSA-Setup-stuck-at-quot-Starting-VMware-Appliance-Configuration/td-p/2923390

ちゃんとやらないとアプデ時に引っかかってアップデートがうまくいかないことがある。
面倒でもDNSサーバーは立てて、構築時に合わせて名前解決をしないといけない。
意外と後回しにしていると引っかかりのポイントになりうる。


#### 現代でもvSphere clientの設定をちゃんと見る話

https://qiita.com/ksota/items/474df98b247aaffe8b3d
Salesforce のカスタム表示ラベルの使用場所を一覧化する

Salesforce のカスタム表示ラベルには、項目のように [使用場所] ボタンがありませんが、Tooling API の [ExternalString](https://developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/api_tooling/tooling_api_objects_externalstring.htm) オブジェクトと [MetadataComponentDependency](https://developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/api_tooling/tooling_api_objects_metadatacomponentdependency.htm) オブジェクトをクエリすることで、組織内でカスタム表示ラベルが使用されている場所を列挙することができます。ただし、MetadataComponentDependency は、参照元のメタデータの Id を直接指定する必要があります。つまり、「カスタム表示ラベル」のメタデータ型やカスタム表示ラベルの名前では、直接使用場所を辿ることができません。そこで、愚直な方法ですが、カスタム表示ラベルの設定オブジェクトをクエリし、その Salesforce Id 1 件毎に、MetadataComponentDependency をクエリし、結果をまとめる方法を取ります。

## ソースコード
Salesforce CLI Plugin に…とも思いましたが、用途が限定的で軽量だったので Python で書きました。やっていることは単にクエリして CSV を出力するだけなので言語は何でも良いです。
https://gist.github.com/shunkosa/2cb44fed3c751bee1e92972c60c4303b

## 使い方
1. 上記のソースコードを適当な場所にダウンロードします。
2. 17行目の 
```sf = Salesforce(username='YOUR_USERNAME', password='YOUR_PASSWORD', security_token='')``` 
をご自身の環境の値に変更します。Sandbox の場合は、
```(username='YOUR_USERNAME', password='YOUR_PASSWORD', security_token='', domain='test')``` 
としてください。
3. Python ファイルを実行すると同じフォルダに `customlabels_YYYYMMDD_HHMM.csv` が出力されます。

## 例
Apex だけであまり良い感じの例ではないのですが、[fflib-apex-common](https://github.com/apex-enterprise-patterns/fflib-apex-common) のカスタム表示ラベルの使用場所はこんな感じになります。
![fflib.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184624/9ff12d3b-4654-a3f6-8f94-6fbf73d6bb26.png)
＊作成中＊　継承の多様性について

```Parent.java
    String val = "A";


    void print() {
        System.out.println(val);
    }

    void difference() {
        System.out.println("super1");
    }

```


```Child.java
    String val = "B";

    void print() {
        System.out.println(val);
    }
    void print2() {
        System.out.println("sub1");
    }


```



```Main.java

package Sample;

public class Main {
    public static void main(String[] args) {
        Parent a = new Parent();
        Parent b = new Child();
        Child c = new Child();

        a.print(); /*親子共通のメソッド*/
        b.print(); /*親子共通のメソッド*/
        c.print2(); /*print2は子クラスで追加したメソッド。子クラスの型で生成しないと動かない*/
        b.difference(); /**/

       }
    }


```

実行結果
ransackのselectボックスでenumのi18nを使用する

# はじめに
ransackのselectボックスでenumのi18nを使用する時に記載方法に迷ったのでメモを残します

### 理解していないとハマること
・enumを使用すると、実際にDBに保存されているのは対応づけられたinteger(数値)であること
・ransackはその数値に基づいて検索をかけていること
・selectボックスを検索条件に設定した時のHTML構造を理解すること
(valueの値がenumで設定した名前(文字列)になっていること)
```
<option value="0">男向け</option>
<option value="1">女向け</option>
<option value="2">その他</option>
```
### ポイント
```
Admin.statuses_i18n.invert.map { |key, value| [key, Admin.statuses[value]] }
```
key・・・enumで設定した名前(文字列)
value・・・enumで対応づけられたinteger(数値)

### 間違えていたこと
ransackはenumを使用すると、実際にDBに保存されているのは対応づけられたinteger(数値)に基づいて検索をかけていることが抜けていました
```
Admin.statuses_i18n.invert
```
key・・・enumで設定した名前(日本語)
value・・・enumで設定した名前(英語)

上記だと数値で検索をかけられないので正常に機能しませんでした

### 実際に書いたコード
```
= search_form_for @search, url: xxx_path do |f| 
 = f.select :status_eq, Admin.statuses_i18n.invert.map { |key, value| [key, Admin.statuses[value]] }
```
```admin.rb
enum status:{for_men: 0, for_women: 1, for_others: 2}
```
```ja.yml

ja:
  activerecord:
    省略
  enums:
    admin:
      status:
        for_men: 男向け
        for_women: 女向け
        for_others: その他
```

# 参考資料
[【Rails】enumを使用したselectボックスの作成（ransackで使用する際の注意点も）](https://blog.to-ko-s.com/enum-select-box/#i-7)
【Thunder Client】devcontainer内でThunder Clientを使用する

## Dev Containersの設定

devcontainer内にThunder　Clientがインストールされるように`.devcontainer/devcontainer.json`の`customizations.vscode.extensions`に`rangav.vscode-thunder-client`を追加します。

```json:devcontainer.json
{

...

  "customizations": {
    "vscode": {
      "extensions": [
        ...
        "rangav.vscode-thunder-client"
      ]
    }
  }
}
```

## データの永続化

Thunder Clientのデータを永続化するために`.devcontainer/compose.devcontainer.yml`を作成して既存の`compose.yml`をオーバーライドします。

Thunder Clientのデータは`~/.vscode-server/data/User/globalStorage/rangav.vscode-thunder-client`に保存されます。
上記の情報は`~/.th-client/thunder-cache.json`に記述されています。

```json:thunder-cache.json
{"globalPath":"/home/user/.vscode-server/data/User/globalStorage/rangav.vscode-thunder-client"}
```

`~/.vscode-server/data/User/globalStorage/rangav.vscode-thunder-client`にボリュームマウントを設定するため`compose.devcontainer.yml`を次のように記述します。

```yaml:compose.devcontainer.yml
services:
  api:
    volumes:
      - th-client-storage:/home/user/.vscode-server/data/User/globalStorage/rangav.vscode-thunder-client
    command: bash -c "while sleep 1000; do :; done"
volumes:
  th-client-storage:

```

devcontainer起動時に`compose.devcontainer.yml`が読み込まれるように`.devcontainer/devcontainer.json`の`dockerComposeFile`に`./compose.devcontainer.yml`を追加します。

```json:devcontainer.json
{
  ...

  "dockerComposeFile": ["../compose.yml", "./compose.devcontainer.yml"],

  ...

}

```

devcontainerをrootで実行している場合には上記で問題ないと思いますがDockerfile内で一般ユーザーに変更している場合にはdevcontainer起動時に次のようなエラーとなります。

```
mkdir: cannot create directory ‘/home/user/.vscode-server/bin’: Permission denied
```

`~/.vscode-server/data/User/globalStorage/rangav.vscode-thunder-client`にボリュームマウントを設定したためコンテナ起動時にrootで`.vscode-server`ディレクトリが作成されることが原因です。

`.vscode-server`の所有者を変更するため次の内容で`.devcontainer/devcontainer-entrypoint.sh`を作成します。

```devcontainer-entrypoint.sh
#!/usr/bin/env bash

set -eu

user="$(whoami)"
sudo chown -R "${user}" "/home/${user}/.vscode-server"

exec "$@"

```

コンテナ内で`sudo`を使用できるようにするため`devcontainer.json`の`features`に次の記述を追加します。

```json:devcontainer.json
{
  "features": {
    "ghcr.io/devcontainers/features/common-utils:2": {},
  }
}
```

コンテナ起動時に上記のファイルを実行するため`compose.devcontainer.yml`を編集します。


```compose.devcontainer.yml
services:
  api:
    volumes:
      - th-client-storage:/home/user/.vscode-server/data/User/globalStorage/rangav.vscode-thunder-client
    entrypoint:
      - bash
      - ./.devcontainer/devcontainer-entrypoint.sh
    command: bash -c "while sleep 1000; do :; done"
volumes:
  th-client-storage:

```

これでdevcontainerが起動できるようになります。

## `localhost`の代わりに`host.docker.internal`を使用する

devcontainer内でThunder
【Java基礎】if構文-2.否定の条件分岐

［問題］　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksBasic.html)
整数値を入力させ、値が0ならばzero、0でない場合はnot zeroと表示するプログラムを作成しなさい。


# コード
```Java
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        if(t == 0){
            System.out.println("zero");
        }else{
            System.out.println("not zero"); 
        }
    }
}
```

↓「２」と入力

# 結果
```
not zero
```
VSCode + RemoteSSH + Poetry + JupyterNotebook

# はじめに
この記事は、これまでサーバーにSSH接続でログインした後、poetryで構築していた仮想のPython環境でJupyterNotebookを使用していた自分が、

「VSCode内でJupyter使えるんだってよ！」

と聞いて、それなら解析環境の改善につながるかと試してみた際の備忘録です。

# 準備するぞ！
この辺は、1度設定を済ませておけば、2回目以降はスキップできるやつですね。

## 環境
2020のM1 macを使用していますが、サーバー内はUbuntuなのと、VSCodeがWinでも使えるはずなのでローカルの環境にはほぼ影響は受けないと思います。

## Poetry環境の準備
- `pip install poetry` でpoetryが使えるようにしておきます
  - 最低限のpython3の設定は省きます
- サーバー内のプロジェクトフォルダで `poetry init` とかしてお `pyproject.toml` を用意します
- `poetry config virtualenvs.in-project true` して、poetryで `.venv` が作られる状態にします
- `poetry config --list` で表示される `virtualenvs.path` の中は空にしておく
  ```sh
  $ poetry config --list
  ...
  virtualenvs.create = true
  virtualenvs.in-project = true
  ...
  ```
- `poetry install` で仮想環境を作成
- `pyproject.toml` と同じ階層に `.venv` が作成されていることを確認する
  ```sh
  $ ls .venv
  LICENSE  NOTICE  bin  etc  include  lib  pyodbc.pyi  pyvenv.cfg  share
  ```

## VSCodeの準備
- VSCodeのextensionをインストールする
  - [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python)
  - [Jupyter](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter)
  - [Remote - SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh)
- リモート接続用のconfigファイルしておく
  - `~/.ssh/config` に必要な設定が書いてある状態


# 接続するぞ！
さて、準備が整ったら、あとはVSCodeから接続していきましょう。
左バーにRemote Explorerが表示されてると思います。

SSHの下に入りたいサーバーが表示されていないなら、configファイルの設定が違っているので、歯車から適切なファイルを選択しましょう
<img width="480px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412483/17477e94-4e1a-694a-5763-1f369823f580.png">

そして、入りたいサーバーが表示されると思うので、Current WindowでもNew Windowでもお好きな方で開いてください。
<img width="480px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412483/014d36c4-07ee-55a3-e725-f8ed72817a85.png">

それがうまくいけば、Openからサーバー内のディレクトリが開けると思いますが、この時、 `pyproject.toml` がある場所（= `.venv` がある場所）を開くようにしてください。
<img width="640px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412483/5369a6ec-84e9-c4ef-6b91-4981e7285b83.png">

そのあとは、普段VSCodeを使うのと同じようにファイルを選択して編集ができます。

そして、 `.ipynb` のファイルを開くと、既にJupyter Notebookが使えるようになっているかと思います。
ただし、importがうまくいかないケースがあるかも知れません。
<img width="640px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412483/59df7576-5009-f45e-de02-38f6266573f1.png">

そんな時は一旦落ち着いて、画面右上に見えているカーネル選択のボタンをクリックしてください。
どれを使うか選択できるので、Global Envでもなく、PyEnv Envでもなく、 `.venv` を使用した環境を選択してください。
<img width="640px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412483/c898d239-26ee-224d-22ad-eae228c8b62d.png">

そうすると右上にも `.venv` が見えると思いますし、準備段階で `poetry install` してできた環境が使えるようになったかと思います。
:point_down: のように、無事、importできていますね。
<img width="640px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412483/369a2af0-2059-dd10-290c-f3b2371b1b37.png">

# おわりに
ということで、サーバー内にPoetryで作成した仮想環境に、RemoteSSH接続することでVSCodeからJupyterNotebookが使えるようにするためのメモを書いてきました。

自分的には普段使い慣れていたJupyter環境とはテーマ（見た目）がガラッと変わってしまったのでまだ慣れていませんが、デザイン面・UI面なども整えていきたいと思います。

これで解析環境は改善されるかな？
【Swift】reverse()とreversed()の違い

## 1. reverse()

#### 1-1. 定義
```Swift
mutating func reverse()
```

#### 1-2. コード例
```Swift
var characters: [Character] = ["a", "b", "c", "d", "e"]
characters.reverse()
print(characters) //["e", "d", "c", "b", "a"]
```

#### 1-3. 計算量
* reverse(n)は **O(n)**　を満たします。（nは任意の数）。
* データ量であるnが増えれば増えるほど計算量も比例して増加します。例えば、O(5)であれば、5回分比例して計算量が増えます。

## 2. reversed()
#### 2-1. 定義
```Swift
func reversed() -> ReversedCollection<Self>
```

#### 2-2. コード例
reversed()メソッドを用いることで、要素ごとに新しい空間を割り当てることなく、コレクションを逆順にすることができます。ReversedCollectionインスタンスを使うことによって、コレクションをwrapし、要素を逆順に変換したコレクションへ素早くアクセスすることができます。

```Swift
let word = "Backwards"
for char in word.reversed() {
    print(char, terminator: "") //"sdrawkcaB"
}
```

また、reversedを用いれば、コレクションをイニシャライザとして使うことができます。
```Swift
let reversedWord = String(word.reversed())
print(reversedWord) //"sdrawkcaB"
```

#### 2-3. 計算量
* reversed()は、文字列の長さに関わらず **O(1)**　です。


## 参考ページ
* https://developer.apple.com/documentation/swift/array/reverse()
* https://developer.apple.com/documentation/swift/array/reversed()
リモート環境でブランチを作成してローカル環境で新しくブランチを切る方法

## 前提条件
- 今回の新しいブランチをリモート上(github)で作成し、その後ローカルでも同じブランチ名でブランチを切っていく

## 方法
### fetch してあげる
```terminal
$ git fetch origin
```
`fetch`コマンドを使って、リモートリポジトリの最新の履歴の取得をしてあげる
その際、`origin`をつけてあげる

### リモート上にあるブランチをローカル上にも作成する
```terminal
$ git checkout -b 27-be-webtest-adminapi origin/27-be-webtest-adminapi
```
上記コードを打つことで、リモート上にあるブランチをローカル上にも作成することができる。
その際ブランチ名は同じにしてあげるのがベター。

確認してみるとローカル上のブランチに追加されている。
```
CA8775: OOOOOOOO$ git branch
* 27-be-webtest-adminapi
  be-webtest
  main
```

先にローカルにブランチを作って、プッシュをしてというやり方でこれまでやってきたが、
逆のやり方も覚えておきたい。
以上。
Python DataFrame TypeError: __init__() got multiple values for argument 'schema' 対策メモ

### DataFrame から DBを扱う際のエラー

```
TypeError: __init__() got multiple values 
for argument 'schema'
```

```
Execution failed on sql 'SELECT name FROM sqlite_master 
WHERE type='table' AND name=?;': Not all parameters were 
used in the SQL statement
```

こういうのをはじめエラーが多い

sqlalchemyの 2.x 系と Pandas の相性がよくないらしい

### 解決法
sqlalchemyのバージョンを下げる

```
# pip install sqlalchemy==1.4.46
```
Developers Summit 2023聴講メモ

# はじめに
Developers Summit 2023の2日目の講演をいくつか聴講しましたので、備忘録として聴講メモを作成しました。Developers Summit 2023の詳細については、[こちらのページ](https://event.shoeisha.jp/devsumi/20230209/)を参照してください。

## 10-A-1：学び続けている方からバトンを受け取るための「学びのススメ」
講演者は、豆蔵/IPA 羽生田栄一さん、アギレルゴコンサルティング 川口恭伸さん、豆蔵 中佐藤麻記子さん、能楽師（下掛宝生流） 安田登さん。講演の紹介ページは[こちら](https://event.shoeisha.jp/devsumi/20230209/session/4173/)です。
### 講演内容
IPAの「[学びのインタビュー](https://www.ipa.go.jp/ikc/our_activities/sx/henkaku.html)」から生まれた30個の「[大人の学びパターン・ランゲージ](https://www.ipa.go.jp/ikc/reports/20220601.html)」のうち、「A4：もやもやをコトバに」、「A5 キワを攻める」、「B7：継続は気楽にあり」、「B8：苦手解消ハック」、「C1：基本の型をまねぶ」、「D4：学びのコミュニティ」、「D6：わたしの学びは人類のバトン」についての解説が中心でした。

### 所感
この講演を聴くきっかけは、能楽師 安田登さんが参加されていた事でしたが、自己紹介を聞くと1990年代に既に3DCGの本やゲームの攻略本を出版されており、インターネットに出会ったのも1991年とのことで、元々ITの素養がある方でした。

IPAの「学びのインタビュー」や「大人の学びパターン・ランゲージ」については、全く知らなかったので、後からIPAのページを読みました。良質なコンテンツだと思うので、もう少しアクセスしやすい工夫をした方が良いと思いました。

## 10-D-3：SIerで「新規事業」を作るということ、SEが「価値」を作るということ
講演者は、TIS 木利友一さんと木利友一さんです。講演の紹介ページは[こちら](https://event.shoeisha.jp/devsumi/20230209/session/4202/)です。

### 講演内容
TISにおいて、ゼロから新規事業を立ち上げようとして、最終的にリリース出来なかった失敗事例を開発側の立場から紹介していました。

### 所感
発表の内容そのものは、新規事業に限らず、受託開発等にも参考になる内容でもあったと思います。失敗しても再チャレンジできるのは素晴らしいと思いました。ただ、それは体力がある会社だから出来る面もあり、どこの会社でも出来るわけではないとも感じました。

一番興味があったのは、ビジネスとして新規事業開拓にGoサインを出すプロセスの失敗部分の検証だったのですが、社外秘の内容が含まれているためだと思いますが、その部分にほとんど触れていなかったのが残念でした。

## 10-A-4：フロントエンド開発のためのセキュリティ入門
講演者は、サイボウズ 平野昌士さんです。講演の紹介ページは[こちら](https://event.shoeisha.jp/devsumi/20230209/session/4176/)です。

### 講演内容
講演者の自著「[フロントエンド開発のためのセキュリティ入門](https://www.amazon.co.jp/dp/4798169471)」から、「暗号化の失敗」、「アクセス制御の不備」、「インジェクション」、「脆弱で古くなったコンポーネント」におけるセキュリティリスクの解説でした。

### 所感
フロントエンド開発者ではないので、広く浅くは知識として理解していても、深いところは曖昧な理解をしている事を認識できたので、勉強になりました。

## 10-A-6：有志によって日本最大級の選挙情報サイトが生まれた物語
講演者は、ユーザベース 河野文弥さんです。講演の紹介ページは[こちら](https://event.shoeisha.jp/devsumi/20230209/session/4178/)です。

### 講演内容
講演者が「[JAPAN CHOICE](https://japanchoice.jp/)」という選挙情報サイトを立ち上げる時のエピソードの紹介と、シビックテックという考え方の考察でした。

### 所感
この講演は素直に面白かったです。本業とは別の時間に半年かけてサイトを立ち上げるはずが、突然の衆議院の解散を受けて、2週間でサイトを立ち上げたとのことでした。淡々と話す口調からもにじみ出る熱意以上のものを感じて、選挙（というより政治参加）に対する原体験を聞いてみたいと思いました。2週間でサイトを立ち上げるために、入れてしまえばこっちのものというノリで知人をプロジェクトに参加してもらったとの事でしたが、誰でも良かったわけでなく、「まき込まれ力がある」人を選んでいると発言されていて、冷静な判断をしていると思いました。

# おわりに
時間が取れなくて、上記の4講演しか聴講できませんでしたが、楽しかったです。自分の業務や技術に近い講演は少ないですが、聴講しながら自問自答をする事が結果的に自分に良い影響を与えてくれるので、次回も時間があれば参加したいと思います。
SpringBoot @GetMappingについて

@GetMappingアノテーション付きメソッドは、与えられたURI表現式と一致するHTTP GETリクエストを処理します。

```java:PersonController.java
package com.informanaging.project.demo.controller;

import com.informanaging.project.demo.domain.Person;
import com.informanaging.project.demo.service.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RequestMapping(value = "/api/person")
@RestController 
public class PersonController {
    @Autowired
    private PersonService personService;

    @GetMapping
    @RequestMapping(value = "/{id}") // /api/person/{id}의 특정 위치에 있는 값을 PathVariable 로 받겠다는 의미이다. id 와  {id} 가 mapping된
   public Person getPerson(@PathVariable Long id) {
        return personService.getPerson(id);
    }
}
```
@RequestMapping(value = "/api/person")
：@RequestMappingアノテーションはSpringウェブアプリケーションで最も頻繁に使用されているアノテーションです。クラスに定義したアノテーションは
localhost:8080/api/personとマッピングされます。クラスに定義したので、scopeはクラス全体です。

@RestController 
：RESTAPI Controllerを使用することをフレームワークに知らせます。

@GetMapping
：定義した該当メソッドはHttpMethodの中GET Requestを受けます。

@RequestMapping(value = "/{id}")
：localhost:8080/api/person/idとマッピングされます。scopeはgetPerson()です。
/api/person/{id}の特定位置（{id}）にある値をPathVaraiable Long idにて受け取るとの意味になります。value = "{id}"のidとLong idのidがマッピングされます。

@GetMapping
@RequestMappin(value = "{id}")
上の２行は、以下のように１行にすることも可能です。
@GetMapping("{id}")

```java:PersonControllerTest.java:PersonControllerテストコード
package com.informanaging.project.demo.controller;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MockMvcBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@SpringBootTest
public class PersonControllerTest {

    @Autowired
    private PersonController personController;

    private MockMvc mockMvc;

    @Test
    void getPerson() throws Exception {
        mockMvc = MockMvcBuilders.standaloneSetup(personController).build();

        mockMvc.perform(
                MockMvcRequestBuilders.get("/api/person/1"))
                .andDo(MockMvcResultHandlers.print())
                .andExpect(MockMvcResultMatchers.status().isOk());
    }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3097775/92d9ddf7-aea6-0acc-2aea-dd73df53aae2.png)
JavaScriptのArray.prototype.join()のデフォルト引数

すぐに読めます。

# 導入
先日、JavaScriptのbuilt-in objectの`Array.prototype.join()`の仕様を理解していなかったことでかなり初歩的なバグを産み出しかけました。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/join

# 本文
具体的には、**デフォルト引数**の存在です。
以前は「引数で受け取った値でArrayインスタンスの全要素を結合してできた文字列を返す非破壊的なメソッド」だよね〜くらいの理解だったのですが、このメソッドはデフォルト引数に`,`を持ちます。上記のMDNのサンプルコードをそのまま借用します。

``` typescript
const elements = ['Fire', 'Air', 'Water'];

// case1
console.log(elements.join());
// Expected output: "Fire,Air,Water"

// case2
console.log(elements.join(''));
// Expected output: "FireAirWater"

// case3
console.log(elements.join('-'));
// Expected output: "Fire-Air-Water"
```

case1では実引数を与えずにjoin()メソッドを実行していますが、戻り値として要素間が`,`で連結された文字列が得られています。これをカンマ区切りではなく「純粋に各要素が連結された文字列」として取得したい場合、join()メソッドの引数に（デフォルト引数が使われないように）`''（空文字）`を与える必要があります。

上記のデフォルト引数の存在を忘れると、**case2の結果を得るつもりでにcase1と書いてしまいそう**なので、自戒をこめてここに残しておきます。

# おまけ
ふと、[ECMAの仕様書：Array.prototype.join(separator)](https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.join)を確認したところ、
> If no separator is provided, a single comma is used as the separator.

とありました。~~（ECMAさん、`実引数なし`でスペースなし連結、`実引数=','`でカンマ区切り連結の方が、実は使いやすくないです？）~~
Leetcode 1523. Count Odd Numbers in an Interval Range

https://leetcode.com/problems/count-odd-numbers-in-an-interval-range/description/

## アプローチ
### Brute force

```java
class Solution {
    public int countOdds(int low, int high) {
        int total = high - low + 1;
        if (total % 2 == 0) {
            return total / 2;
        }
        if (low % 2 == 1) {
            return total / 2 + 1;
        }
        return total / 2;
    }
/* TLE
    public int countOdds1(int low, int high) {
        int count = 0;
        for (int i = low; i <= high; i++) {
            if (i % 2 != 0) count++;
        }
        return count;

    }
*/
}
```

- [こちら](https://www.youtube.com/watch?v=OLc3uR-Zj50&t=7s)を参考しました
ウェルノウンポート

ウェルノウンポート番号(Well-known port numbers)とは、ポート番号のうち、よく利用される特定のアプリケーション用に予約されている 0～1023 までの番号のこと。
以下が頻出。

HTTP → 80/TCP
HTTPS → 443/TCP
FTP → 20/TCP、21/TCP
SMTP → 25/TCP
POP3 → 110/TCP
DNS → 53/TCP、53/UDP
NTP → 123/UDP
【PowerApps】UpdateContextの効率的でクリーンな記法を考える

PowerAppsでちょっと凝ったアプリを作ろうと思うと、UpdateContextを多用することになると思いますが、意外ときれいな書き方をしている例が少ないのでまとめてみます。

## 複数のコンテキスト変数は1回でまとめて宣言する
UpdateContextはJSON形式で複数の変数を同時に指定可能なので、わざわざ変数ごとに都度UpdateContextを書く必要はありません。UpdateContextの内部は並列で処理されるため、変数が多い環境だと処理速度の向上も期待できそう。

冗長な例

    UpdateContext({_message1: "Hoge"});
    UpdateContext({_message2: "HogeHoge"});
    UpdateContext({_message3: "HogeHogeHoge"});

クリーンな例(インデントはお好みで)

    UpdateContext({
        _message1: "Hoge",
        _message2: "HogeHoge",
        _message3: "HogeHogeHoge"
    });

ただ、上述の通りUpdateContextは並列処理のため、宣言した変数を内部で直後に使用する事はできません。

    UpdateContext({
        i: 1,
        j: 1+i // ← iの宣言前のため0とみなされ、1+0=1が代入されてしまう
    });

上記のコードは、処理的には以下のコードとほぼ同義となります。

    Concurrent(
        UpdateContext({i:1}),
        UpdateContext({j:i+1})
    )

そのため、この場合はUpdateContext自体を分ける必要があります。

    UpdateContext({i: 1});
    UpdateContext({j: i+1}); // ← 正しく2が代入される

## If文はUpdateContext内部で指定する

Ifによって変数に代入する値を変えたい場合は、UpdateContext内部で分岐させましょう。

冗長な例

    If(flag,
        UpdateContext({_message: "Hoge"}),
        UpdateContext({_message: "HogeHoge"})
    );

クリーンな例

    UpdateContext({_message: 
        If(flag, "Hoge","HogeHoge")
    });

## 初回表示時のみ変数を設定する場合は、Isblankで場合分けするのではなくCoalesce関数を使用する

最初にアクセスした際にのみ規定の値を変数に代入し、その後は現在の変数を保持したいという場合、Isblankで判定して代入する方法が一般的だと思います。

    If(IsBlank(_message1), UpdateContext({_message1: "Hoge"}));
    If(IsBlank(_message2), UpdateContext({_message2: "HogeHoge"}));

これも前述のようにUpdateContextでまとめたいところですが、キーと値の組み合わせはIf文で分岐できません。

    //このコードはエラーが出て動作しません
    UpdateContext({
        If(IsBlank(_message1), _message1: "Hoge"),
        If(IsBlank(_message2), _message2: "HogeHoge")
    }); 

このような場合、IsBlankではなくCoalese関数を使うことで、クリーンに書くことができます。Coalese関数は、引数を順番に評価し、空白ではない最初の引数を返しますので、既に代入済みの場合はそのまま、代入されていない場合は第2引数に指定した値を代入します。

    UpdateContext({
        _message1: Coalesce(_message1, "Hoge"),
        _message2: Coalesce(_message2, "HogeHoge")
    });

## おわりに

PowerAppsの記法については、まだまだベストプラクティスと言えるようなものはないので、今後も気が付き次第Qiitaにまとめていきたいと思います。
Laravelでシンボリックリンク作成


Docker環境のLaravelでシンボリックリンクを作成。

```
php artisan storage:link
```

これで public内に storageディレクトリのリンクが貼られる。

　　　
　　　
と、思ったらstorage内のファイルが表示されなかった・・・

Docker内に入ってファイルを確認
```
docker-compose exec app bash
ls -la laravel/public
```
　　　　　

リンクがおかしい
Dockerのルートディレクトリになってない。
```
lrwxr-xr-x  1 root root   60 Feb 11 16:00 storage -> /Users/(略)/laravel/storage/app/public
```
　　　　　

シンボリックリンクを相対パスに変更
```
cd laravel/public
unlink storage
ln -s ../storage/app/public storage
```

なんとか治った。


　　
　

------------
参考

https://dkssksk.com/php-storage-image/


https://you84815.blogspot.com/2018/08/dockerapache.html