OmniAICreator/Qiita-1.07M huggingface dataset:
mysqliを使ってPHPからMySQLに接続する方法

# はじめに
`mysqli_connect`を用いて、MySQLに接続する方法と切断する方法のみを説明します。
本記事では、データの取得や挿入などは触れていません。

# 事前知識
### mysqliとは
`mysqli`（MySQL Improved）とは、PHPでMySQLデータベースとやり取りするための拡張機能のこと。
### MySQLデータベースとは
MySQLデータベースは、データを効率的に保存、管理、検索するためのシステムのこと。
ユーザー情報、商品情報、ブログ投稿など、ウェブサイトの様々なデータを保存するために使われる。
# mysqliを使ってデータベースに接続する
### `mysqli_connect`を使ってデータベースに接続する
`mysqli_connect` 関数を使ってMySQLデータベースに接続する。
```php
mysqli_connect(
$hostname,
$username,
$password,
$dbname
);
```
上のように、ホスト名、ユーザー名、パスワード、データベース名の順で書く。

続いて、接続を確認するために、変数を使って条件分岐を作成する。
```php
$link = mysqli_connect($hostname,$username,$password,$dbname);

if (!$link) {
        echo 'データベースに接続できません。' . PHP_EOL;
        echo 'Debugging error：' . mysqli_connect_error() . PHP_EOL;
        exit;
    };
```
こうすることで、接続がうまくいっていないときは、エラーメッセージを出力することができる。
`$link`には`mysqlオブジェクト`が格納されている。
※₁`mysqli_connect_error()`は、接続できなかった際のエラーログが入っている。
※₂`PHP_EOL`はどのOSでも正しく改行される改行コード。

## 公式ドキュメントの解説
[PHPの公式ドキュメント](https://www.php.net/manual/ja/mysqli.construct.php)を見ると、`mysqli_connect`は以下のように書かれている。
```php
mysqli_connect(
    ?string $hostname = null,
    ?string $username = null,
    ?string $password = null,
    ?string $database = null,
    ?int $port = null,
    ?string $socket = null
): mysqli|false
```

- `?`は、「nullable」型を表すために使用される。`?string` は、その引数が `string 型`または `null` であることを示している
- `= null` は、その引数のデフォルト値が `null` であることを示すため、関数を呼び出す際にその引数が指定されなかった場合、その引数には `null` が自動的に割り当てられる
- `:` の後に続く部分は、関数の戻り値を示し、この関数は `mysqli オブジェクト`か`false`を示す 
## mysqlオブジェクトとは
mysqli オブジェクトは、データベース接続情報やその接続に対する操作（クエリの実行など）を管理するためのデータベース接続情報のこと。以下のような操作に使われる。：

- データベースクエリの実行 
- トランザクションの管理 
- エラーメッセージの取得
- 接続を切る

# mysqliを使ってMySQLから切断する
アプリケーションが終了すると自動で切れるようになっていますが、念のため切断も記入しておく。
```
mysqli_close($link);
        echo 'データベースから切断しました。';
```
このように書くことで、データベースから切断し、切断できたか確認することができる。

# まとめ
- `mysqli` は、PHPでMySQLデータベースとやり取りするための拡張機能である
- `mysqli_connect 関数`を使ってデータベースに接続し、接続が成功すると `mysqli オブジェクト`が返され、失敗すると `false` が返される
- `mysqli オブジェクト`は、データベース接続情報やその接続に対する操作を管理する
- アプリケーションが終了すると自動で接続が切れるが、 `mysqli_close 関数`で明示的に接続を切ることが推奨される
宮古語(シマㇷツ)の下位区分をどう呼ぶべきか

仲原穣『[言語地図にみる宮古語の地域差](http://hdl.handle.net/2308/727)』(沖縄国際大学日本語日本文学研究, 第17巻, 第2号(2013年3月), pp.45-67)によれば、宮古語(シマㇷツ)は以下の6つに区分されるようだ。

> (1) 宮古島北部方言､ 南部方言 (来間方言を含む)
> (2) 宮古島中央部方言
> (3) 池間系諸方言 (池間､ 前里､ 佐良浜､ 西原)
> (4) 伊良部方言 (佐和田､ 長浜､ 国仲､ 仲地､ 伊良部)
> (5) 多良間系方言 (塩川､ 仲筋､ 水納方言)
> (6) 大神方言

私(安岡孝一)個人としては、(3)をイキマ語、(4)をイラヴ語、(5)をタラマ語、(6)をウカㇺ語、と呼んでいるのだが、さて、(1)と(2)をどう呼ぶべきだろう。(3)～(6)が島々の呼称でもある(cf. 本永清『[宮古の島々の方言呼称、および季節を表す方言](https://www.city.miyakojima.lg.jp/soshiki/kyouiku/syougaigakusyu/hakubutsukan/files/kiyou2019motonaga.pdf)』宮古島市総合博物館紀要, 第23号(2019年3月), pp.137-147)ので、「来間方言」を「ㇷフィマ語」と呼びたいのはヤマヤマだが、(1)の全体を「ㇷフィマ語」と呼ぶのはマズイ気がする。

> これらのうち、(1)の宮古島北部方言は狩俣、島尻、大浦方言であり、南部方言は旧城辺の保良や友利、旧上野の新里やその周辺の集落である。ただし、南部地域では語形が一致しない言語地図もいくつかみられるため、等語線をどこに引いてよいのかまだ判断できない。
>
> ![Fig18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/2dc81941-f9e8-1903-7705-bb64ecbcaab4.jpeg)

だとすると、(2)は荷川取・西仲宗根・東仲宗根・西里・下里・久貝・松原の旧平良市域までは確実に入るが、川満(旧下地町)・野原(旧上野村)・長間(旧城辺町)あたりは、(2)なのか(1)なのかハッキリしないということだ。

> また、(1)と(2)と、(3)以下との区分にレベルの差がある可能性もある。よって、これらは宮古語の地域差を示すグルーピングではあるが､下位区分を示すものではないことを断っておく。

さて、どうするか。あくまで私案だが、(1)と(2)は合わせて「ミャーク語」としておいて、さらに旧市町村で区分する方が、楽な気がする。つまり、旧城辺町は「東ミャーク語」、旧上野村は「南ミャーク語」、旧下地町は「西ミャーク語」で来間島を含む。旧平良市は、西原がイキマ語なのでここで区切って、荷川取・西仲宗根・東仲宗根・西里・下里・久貝・松原は「中ミャーク語」、狩俣・島尻・大浦は「北ミャーク語」、池間島はイキマ語、大神島はウカㇺ語。旧伊良部町は、佐良浜(池間添・前里添)がイキマ語で、それ以外はイラヴ語。多良間村は、多良間島・水納島ともにタラマ語。

もちろん、市町村境界が等語線と一致するわけはない。しかし、こういう風にすれば、各下位区分と郵便番号が対応づけられるので、地域がハッキリするのだ。

* ウカㇺ語 906-0001
* 北ミャーク語 906-0002～906-0004
* 中ミャーク語 906-0006～906-0015
* 東ミャーク語 906-0101～906-0109
* 南ミャーク語 906-0201～906-0204
* 西ミャーク語 906-0301～906-0306
* イキマ語 906-0005・906-0421・906-0422・906-0501・906-0502
* イラヴ語 906-0503～906-0507
* タラマ語 906-0601～906-0603

906-xxxxは市町村合併の際にも変更されなかったので、1998年の7ケタ化以降、ずっと同じ郵便番号が同じ地域を指している。イキマ語だけは不連続になるのだが、池間島から西原・佐良浜への集団移住の結果なので、こればかりはどうにもならない。一方、大神島・水納島から高野(東仲宗根添)への集団移住は、郵便番号906-0011なので「中ミャーク語」に飲み込まれてしまう、という問題を孕む。そういうヤヤコシイ問題は残るのだが、さて、この9区分で何とかならないかなぁ。
WebSocketノードのSecure対応について (経緯まとめ)

# はじめに

FacebookでNode-RED MCU EditionのWebSocketノードが動かないというメッセージをもらい、調査開始〜対応完了までの経緯をまとめておきます。

![スクリーンショット 2024-05-22 17.52.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/322db9fd-6ac2-2097-fc94-7af0fdbd0f8a.png)

# 調査

Node-RED MCU Editionの書籍を執筆した時点で、Secure通信(HTTPS/MQTTS)は未対応でした。

https://www.kohgakusha.co.jp/books/detail/978-4-7775-2249-1

その後、HTTPS/MQTTSに対応し、補足書として執筆しました。

https://techbookfest.org/product/wwADMShyx2RuB9zjnrUaz0

@mshioji 氏が対応の経緯をまとめています。

https://qiita.com/mshioji/items/00dd35a14e20df84c0d4

https://qiita.com/mshioji/items/3b98aaaab492ff942961

https://qiita.com/mshioji/items/2d333826570f41009447

当初は同じ手順で動作することを期待しましたが、残念ながらWebSocketはSecure通信に未対応と判明しました。
GitHubのdiscussionsで議論を始めました。

https://github.com/phoddie/node-red-mcu/discussions/127

# Secure対応

discussionsの中でWebSocketのSecure対応が遅れている理由を教えていただきましたが、調査を進めるとSecure対応が可能ということが分かりました。
Moddable SDK側の変更が必要ですが、Node-RED MCU EditionからWebSocketのSecure通信が可能(Node-RED MCU Edition側のmasterブランチは反映済)になりました。

Moddable SDK側の変更箇所はたった1行だけです。

```javascript:$MODDABLE/examples/io/tcp/websocket/WebSocket.js
(60行目)
config = device.network.wss;
↓
config = {...(options?.wss ?? device.network.wss)};
```

### 2024年5月29日追記

2024年5月20日にModdable SDKのmasterブランチに反映されました。

https://github.com/Moddable-OpenSource/moddable/commit/641ca6719e09fa21a6ca6ccba2cbb3915b643fc9

# WebSocketノードでSecure通信を行う手順

HTTPS/MQTTSと同じ手順で、WebSocketノードでSecure通信が可能になりました。

「inject」ノード、「WebSocket out」ノード、「debug」ノードをフローエディタに配置します。

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/f9b685fc-8b6b-a581-f241-77b97b17178e.jpeg)

「WebSocket out」ノードを編集し、URLにWebSocketのURLを入力します。

![1_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/564f1995-4fef-c9f5-ef45-07a8225d2d13.jpeg)

TLS設定を有効にします。

![1_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/2d129d13-05ff-773a-30e3-0a95804f42ff.jpeg)

Node-RED MCUの「Build」を実行し、「xsbug」のエラー画面でCA証明書の種類(CA109の部分)を確認します。

![1_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/20ca701d-36cc-d08c-a14e-106c14824757.jpeg)

「WebSocket out」ノードのTLS設定の編集画面で、CA証明書に
$MODDABLE/modules/crypt/data-pem
ディレクトリのPEMファイルを指定します。

![1_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/b7641f75-ac9d-5fa4-f00f-d6d17b1c38a9.jpeg)

もう一度、Node-RED MCUの「Build」を実行するとWebSocketのSecure通信が成功します。
【GAS】GASでvlookup的なことをする

## やりたいこと
GASでスプシを読み込んで、スプシのデータに対してvlookup的なことをしたい

## サンプル
| ID | 品名 | 単価(円) | 在庫数 |
|:-:|:-:|:-:|:-:|
| 1 | トマト | 80 | 20 |
| 2 | キャベツ | 160 | 10 |
| 3 | レタス | 120 | 13 |
| 4 | きゅうり | 40 | 35 |
| 5 | ピーマン | 50 | 30 |
| 6 | じゃがいも | 35 | 40 |

## 実装
### コード
```JavaScript:lookupTest.gs
function lookupTest() {
  //シートを宣言
  const Sheet = SpreadsheetApp.openById("hoge").getSheetByName("シート1");

  //キー配列を取得
  const keys = Sheet.getRange(2, 1, Sheet.getLastRow() -2+1).getDisplayValues().flat();
  //データ配列を取得
  const data = Sheet.getRange(2, 1, Sheet.getLastRow() -2+1, Sheet.getLastColumn()).getDisplayValues();

  const inner_row = {id:1, name:2, price:3, stock:4};

  //例…IDが4の品の在庫数を取得
  const example1 = data[keys.indexOf("4")][inner_row.stock -1];
  console.log("IDが1の品の在庫数："+ example1);
}
```

### 結果
```
IDが1の品の在庫数：35
```

## メモ
・vlookupでいう検索キーを1次元配列で別に抜いておいて、データ全体の2次元配列からindexOfの返り値で行番号を指定するイメージ
・vlookupと違ってkeysの列がデータ内のどこでもいい、データの範囲外でもいい
・行方向はindexOfそのままでいいけど、列方向はスプシの列番号 -1しないとずれる
【rails】railsにおけるMVCモデルが誰でもわかるように説明

今回はrailsにおけるMVCモデルについて説明したいと思います。
経験のないエンジニアにとっては非常にわかりにくい概念であると思います。図も使いながらなるべく理解できるよう努めます。

# mvcモデルとは
`model`、`view`、`controller`の3つに分けてコードを管理するものです。
それぞれの役割を簡潔に述べたのが以下です。
| 名前 | 役割 |
|:-:|:-:|
| model | データベースとのやり取り |
| view | 画面表示 |
| controller | modelとviewの制御 |

# 処理全体像
今回は動的な場合と静的な場合で分けてみました。
動的・静的とは何だ？となっている方は[こちらのサイト](https://www.takara-sc.co.jp/column/2621/)を見てみてください。
図を見ると動的・静的がわかりやすいと思います。
![スクリーンショット 2024-05-22 17.35.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/72175bc4-5ec9-77f7-976a-6d719846fa4e.png)

![スクリーンショット 2024-05-22 17.39.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/1d623d5e-b0fa-c1cd-fb6e-09ebf326365b.png)

# 処理を順に追う
でははじめから順に処理を追っていきたいと思います。
## コントローラーにたどり着くまで
まずユーザーが見たいページのURLの入力をします。
URLはまず受付係であるroutes.rbのところにいきます。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/a7c853ac-28fa-7034-c541-00e5693bcb50.png">

ここでroutes.rbが行くべきcontrollerとcontroller内のアクションを指定してくれます。

## コントローラー
コントローラーのアクションには処理が書いてあり、それ通りに処理を行います。
ここで運命の分かれ道があります。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/28229e62-c202-88e6-0ca0-665d46b1f8f0.png">
ページが動的か静的かによって次の行き先が違います。
ページ動的な場合すなわちデータベースからの情報取得を必要とする場合次の目的地はmodelとなります。
静的なページの場合の次の目的地はviewになります。

## モデル
モデルはDBとの仲介役です。
DBにほしいデータを伝えてDBからデータを返してもらいます。
![スクリーンショット 2024-05-24 10.17.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/d5a564e4-3778-57bb-81d5-777f2ae111f2.png)

## 再びコントローラー
ほしいDBのデータが取れたので今度は画面表示の内容をもらえるようにviewに依頼します。

## ビュー
ビューではコントローラーの依頼を受けて画面表示の内容を返します。
![スクリーンショット 2024-05-24 10.19.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/a04fea7f-333d-acfd-25d3-53202a2776a7.png)


こうして見たかったページの内容が揃うと表示されます。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/85efc469-1a0e-f512-63cb-e66e7db7eb2f.png">

# 最後に
さまざまなフレームワークにおいてmvcモデルは使われています。
ファイルの構造などは少し違えど、大きな流れとしては同じであると思うのでこれを理解できるとプラスに働くかと思います。
こちらの記事は先輩に当たる方の記事ですが参考になりますのでよろしければどうぞ。

https://qiita.com/shimada_slj/items/45b859c626a4fe9a2fa4

ここまで読んでいただきありがとうございます。
### 参考

https://system-kaihatu.com/archives/3204#:~:text=MVC%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A8%E3%81%AF%E3%80%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0,%E5%9B%B3%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82
排他制御

# 排他制御
あるリソースに同時に１つの処理しかアクセスできなくする排他制御という仕組みがあります。

### 気づき
データベースの共有ロックや専有ロックとかあったな。

### 排他制御の大切さを知る
```
root@**********:***********# cat count 
0
root@**********:***********# ./inc.sh 
root@**********:***********# cat count 
1
root@**********:***********# echo 0 > count
root@**********:***********# for ((i=0;i<1000;i++)) ; do ./inc.sh ; done
root@**********:***********# cat count
1000
root@**********:***********# echo 0 > count
root@**********:***********# cat count
0
root@**********:***********# for ((i=0;i<1000;i++)) ; do ./inc.sh & done ; wait
...
[993]   終了                  ./inc.sh
root@**********:***********# cat count
407
```
### クリティカルセクション
```同時に実行されると困る一連の処理```のこと
### アトミック処理
```システムの外から見て一つの処理に見える一連の処理```のこと
#### 気づき
クリティカルセッションがアトミック処理になっていると排他処理になって同時に一つしか実行できなくなるのか。

### flock()システムコール
flock()やfcntl()といったシステムコールを使って、```あるファイルについてロック/アンロックという状態を変更```します。

#### 気づき
flock()システムコールなどを使ってシステムロックをアトミック処理にすることで排他制御を実現しているのか。
```
root@**********:***********# for ((i=0;i<1000;i++)) ; do ./inc-wrong-lock.sh & done; for((i=0;i<1000;i++)); do wait; done
root@**********:***********# cat count
571

root@**********:***********# for ((i=0;i<1000;i++)) ; do ./inc-lock.sh & done; for((i=0;i<1000;i++)); do wait; done
root@**********:***********# cat count
1000
```
### 気づき
どこをアトミック処理にするかが肝心だな

# 出典
https://gihyo.jp/book/2022/978-4-297-13148-7
# 感想
特に難しく感じなかったところがまだわかっていないと思う。
OpsRamp - Dashboard 2.0 の Honeycomb の複数表示

本記事では、OpsRamp の Dashboard 2.0 の Honeycomb が一つのタイルで複数表示する方法について説明します。

# 概要
OpsRamp の Dashboard 2.0 では、Honeycomb で表示することができます。SaaS バージョン 2024.03-U1 より、一つのタイルで複数表示することに対応しました。

# 設定方法
Dashboard 2.0 のタイルの設定から HONEYCOMB を選択することで設定可能です。QUERY に複数のデータを表示するようなクエリを入力すると複数の HONEYCOMB が表示されます。
![honeycom_config1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/d39e8ef9-3240-c399-f3cc-c9fb70424ca3.png)
VISUALIZATION の LABELS AND THRESHOLDS で HONEYCOMB の色を条件で変更することが可能です。
![honeycom_config2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/94e74e11-0ebe-52f9-061d-df46e91f2299.png)

# 例
- M365 サービス
![honeycom_m365.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/55a1663c-5ea8-fa6d-bb29-04eee4c5a388.png)
- Kubernetes Pods
![honeycom_k8s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/54bd003e-92b2-9b73-d5ae-28ffa7e87de4.png)


---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
【VSCode】おすすめのテーマ拡張機能

# 拡張機能とは？
VSCode拡張機能とは、VSCodeの色を変更したり、コードを記述するうえでより便利に、より効率的になるような機能のことです。
今回は、その拡張の中で見た目に関係する、僕が実際に使っているテーマをご紹介します！

## Noctis (カラーテーマ) 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/99b88938-d5f2-7824-d82a-ff727ba85a23.png)
Noctisは、背景の色をきれいな色に変更してくれます！
見たほうが早いと思うので、下にサンプルを置いておきます。
|テーマ名|サンプル|
|---|---|
|Noctis Azureus|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/9eb2822a-eca9-7a65-d73d-2074a829b0f0.png)|
|Noctis Bordo|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/87e801e8-e05e-0640-d043-c924ab19adfe.png)|
|Noctis Hibernus|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/8b778bdc-af2b-4e99-0557-c25ca14e972f.png)|
|Noctis Lilac|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/fd89b175-5d20-cce0-283b-bdad19b4ce77.png)|
|Noctis Lux|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/a5afa303-978c-9b29-346b-8ba008e1d8de.png)|
|Noctis Minimus|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/6da8b9cb-ae64-d093-013e-d92498df31ca.png)|
|Noctis Obscuro|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/917db328-7a1c-990d-98bd-8534a02d94c6.png)|
|Noctis Sereno|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/16a26f71-0cf1-4d5e-c1ce-8b4a69f1bf8f.png)|
|Noctis Uva|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/0af5edc5-4dd5-c7c1-e0d2-7b56e8ddbf26.png)|
|Noctis Viola|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/2d608dd0-8c10-e650-cd1d-cdd2000f171e.png)|

ちなみに僕は`Noctis Lux`や`Noctis Azureus`を愛用してます！

## indent-rainbow (コードの装飾)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/2d968818-c7e6-9483-658c-135288980b8e.png)
これも見てもらったほうがわかりやすいと思うので、サンプル貼ります。
|ライトテーマ|ダークテーマ|
|---|---|
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/9574450c-843e-da3a-e423-238301df4b3b.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/16239c93-527f-bd68-7fbf-f8734f109714.png)|

こんな感じで、ライトのテーマでもダークのテーマでも、目立ってネストの構造がわかりやすくなります。

それと、この拡張機能は16進数のカラーコードが記述されていると、その色に背景が染まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/caaf55ea-f095-0e76-1637-1c8083f9ad9e.png)
↑こんな感じ

## background-cover
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3794632/b8b86655-1089-ecf7-df8f-fecf2dff2e0e.png)
vscodeの背景に画像をいれることができる拡張です。
使い方の記事はたくさんあったので、調べていただければいくらでも出てくると思います。

背景の透明度を調整することもできるので、自由な画像を好きなテーマの色でぼかすことができます！
割とまじで背景かわるとやる気出ます...w

# 終わりに
今回は3つ紹介しましたが、カラーテーマに関しては他にもたくさんあるので、お好みの拡張を探してみるのもいいと思います！

よければいいねしてくれると嬉しいです！！
【PHP】PHP勢の自分がどうしてもシャットダウンをしたくない理由

## はじめに
こんにちは! 中学3年生のWardHamamatsu67です! 今回は、PHPをよく使う自分がとある事情でシャットダウンをやりたくなくなった話をしようと思います。
## なぜ??
なぜ、自分がシャットダウンをしないようになったのかは、単純に<font color="red">XAMPP</font>が原因です。 XAMPPとは、以前別の投稿で説明した通り、PHPの開発環境となるもので、PHPを始める方には絶対必要となります。

XAMPPの使い方についてはこちら

https://qiita.com/WardHamamatsu67/items/ed4e812132e0297ccd8e

説明がかなり短くて雑ですがご了承ください。(本当にすみません。)

で、このXAMPPくんなんですが、シャットダウンするとそれまで動いていた、<font color="red">**Apacheや、MySQLなどが停止**</font>してしまうんです。そして、この状態でPHPを実行しようとすると、次のように「localhostで接続が拒否されました」と出るんです。
![20210223150348.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3749972/7f5b7300-b4e2-905a-55f7-c785c92f5c74.png)

これではせっかく書いたPHPのコードの実行結果がわかりませんね。だから、ApacheやMySQLなどのモジュールを動かす必要があります。それをやれば実行結果は表示されます。
「なんだそれだけか。」と思うかもしれませんがこの作業が意外と面倒で<font color="red">悪い時には**5分くらい**かかってしまいます。</font>そしてシャットダウンをしたあと再起動したら<font color="blue">**毎回**この作業をしないといけないんです(涙)</font>
こんな作業のために5分も使いたくないですよね。だからシャットダウンをしなくなりました。まあ充電の減りは早くなりますが...
## おわりに
いかがでしたか。この一件で自分はシャットダウンをする回数が減りましたが、PHPをやらない人は<font color="red">**シャットダウンをした方が良いです**</font>
この記事が良いと思った方はいいねとフォローをしてくれると嬉しいです。
Spring Security を使用したプログラムにCSSを適用したい

# はじめに
Spring Security を使用したプログラムを作成しているのですが、CSSが適用されない！という問題に当たったので、解決法を備忘として残します。

# 問題点と原因の確認

### 問題と期待値
CSSが適用されない。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726233/23d9c31f-51a2-ef88-45cc-d118a192c8d7.png)

こんな感じで表示したい！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726233/a21a242a-8dff-e865-1c1d-4e6dc6631af5.png)


### 原因はこれだ！

Devtoolからネットワークを確認すると、CSSが302でリダイレクトされてるっぽい。
今回Spring Security でログイン済みか否かで見れるページを制御しているため、CSSもそれに引っかかっているのでは。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726233/395f31e2-41e4-4e1e-e7d3-8f509434836b.png)


# コードの修正

src/main/java
　- package com.example.securingweb

requestMatchersにCSSのパスを追加。どうやらCSSもセキュリティの管理下に置かれてたっぽい。盲点！

.requestMatchers("/", "/home", "/header-navi" , <font color="red">"/css/**"</font>).permitAll()


### 修正後
``` WebSecurityConfig.java
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

	
	//保護するURLパスと保護しないURLパスを定義する
	@Bean
	public SecurityFilterChain secruSecurityFilterChain(HttpSecurity http) throws Exception {
		http
		.authorizeHttpRequests((requests) -> requests
			.requestMatchers("/", "/home", "/header-navi" , "/css/**").permitAll()
			.anyRequest().authenticated()
		)
		.formLogin((form) -> form
			.loginPage("/login")
			.permitAll()
		)
		.logout((logout) -> logout
			.logoutUrl("/logout")
			.logoutSuccessUrl("/home")
			.permitAll()
		);

	return http.build();
	}

    (略)
```


### 修正前
``` WebSecurityConfig.java
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

	
	//保護するURLパスと保護しないURLパスを定義する
	@Bean
	public SecurityFilterChain secruSecurityFilterChain(HttpSecurity http) throws Exception {
		http
		.authorizeHttpRequests((requests) -> requests
			.requestMatchers("/", "/home", "/header-navi").permitAll()
			.anyRequest().authenticated()
		)
		.formLogin((form) -> form
			.loginPage("/login")
			.permitAll()
		)
		.logout((logout) -> logout
			.logoutUrl("/logout")
			.logoutSuccessUrl("/home")
			.permitAll()
		);

	return http.build();
	}

    (略)
```
BizRobo! DAで要素を読込むまでに時間がかかってしまう際に試すこと

皆さんは、BizRobo!のDAロボットを作成するにあたって
サイトやアプリの画面上に表示されている部分を操作したいのにそれ以外の部分の要素が重く、
DAでの読み込みに時間がかかるなぁと感じたことありませんか？

そんな時は「ツリーモード」を使うと時間短縮ができるかもしれません。
今回はツリーモードを用いた要素読み込みの時間短縮方法についてお話していきます。

※今回はver11.4で説明します


# ツリーモードを用いた要素読み込み時間の短縮方法

**１．ツリーモードを作成**
　①読み込みに時間がかかるアプリのタブを右クリック
 
![2_画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346701/0552ef0a-7223-f63b-4ba6-1f1d830c1dc5.png)

 
　②「ツリーモード」をクリック
　③「WINDOWS」をクリック

![2_画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346701/d56a8f8e-2b01-e9bd-22a5-bd839e7c95c7.png)

**２．ツリーモードの設定を変更**
デフォルトでは「非表示」にチェックが入っている状態のため、チェックを外す

![2_画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346701/975f3bd9-cabd-3aed-2eb1-c9192dd45f3b.png)
※ver11では「非表示」、ver10では「Hidden」と表示されます



設定は以上で完了です！
では実際どのように読み込み方が変わるのか見てみましょう。

# 要素の読み込み方の違い
BizRobo!ナレッジベースのサイトで比較していきます。

**・通常（ツリーモードの設定なしの場合）**
　1ページ目の全てのナレッジが「一覧項目」として読み込まれます。
![2_画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346701/7e97589a-5d14-ff51-7cf4-15e4edba538b.png)



**・ツリーモードの「非表示」のチェックを外した場合**
　画面に表示されている2つのナレッジのみ「一覧項目」として読み込まれます。
![2_画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346701/880dfcb9-35c4-fb48-18de-51f2b502fffc.png)

このように「非表示」のチェックを外すことで、
ツリーの読み込みが、表示部分のみ（非表示部分は読み込まない）という設定になります。

# 活用例と注意点

**活用例**
・ページ上でスクロール箇所が複数個存在しており読み込み不要なデータが多い、
　かつ要素の読み込みに時間がかかっている場合
・項目がずらっと縦に並べてありページが長いが、必要な情報は1項目目にある、
　かつ要素の読み込みに時間がかかっている場合　など

**注意点**
今回紹介した方法は**非表示部分を読み込まないようにし、時間を短縮する**という方法です。
そのため、同じDAロボット内において非表示部分を読み込まない設定となり、
後続の処理で表示画面外の操作を行う場合はDAロボットを分けて作成する必要があります。
その場合、非表示部分の要素を最終的にどこかで読み込む必要が出てくるため、
実際のロボットの稼働にかかる時間を確認しながらツリーモードを設定して時間短縮になるのか、
また、ツリーモード設定後にロボット稼働の安定性は保たれるか
（非表示を読み込まなくなったことで抽出できていた要素が抽出できなくなっていないか等）
という点を考える必要があるかと思います。

# 
なかなかツリーモードを使う機会が無かったため知らなかったのですが、
DAでのサイトの読み込みに時間がかかっている場合は今回の方法を試してみると
解決する場合もあるかと思います。

誰かのお役に立てれば嬉しいです。
最後までお読みいただきありがとうございました。
Databricksの事前学習済みモデル in Unity Catalog(小ネタ)

Databricksのリリースノートを見ていたら、 **「Pre-trained models in Unity Catalog (Public Preview)」** というものが出ていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/6debe9a8-0bcc-75e5-426d-79ec58270e0e.png)

https://docs.databricks.com/ja/release-notes/product/2024/may.html#pre-trained-models-in-unity-catalog-public-preview

なんだろうと思ってみていたら、Unity Catalogの```system.ai```カタログ/スキーマにいくつかの事前学習済みモデルが公開されているとのこと。

実際にカタログエクスプローラで見てみたら、ありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/13d02938-4c69-486d-e9cc-b7e95f953ff4.png)

Databricks Marketplaceで公開されているものが大半含まれているようです。DBRXも！
(Llama2/3はライセンスの関係なのか、含まれてないようです)

<br>

モデルを選択すると、これまたMarketplaceのモデルと同様、概要欄に使用方法などが記載されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/6c058200-0354-93b3-bf00-a79a365dd001.png)

通常のUnity Catalog管理モデルと同様の使い方ができるため、右上のボタンからすぐにモデルサービングすることもできます。

もともとMarketplace経由でUnity Catalogにこれらのモデルを登録することは出来ましたが、より簡単に利用できる環境を準備できるようになったと思います。ますます利便性が高まった感じですね。
炎上するアウトプットをしろ

# はじめに

**Xでポストをするのも立派なアウトプットです**

え、どういうこと？
そう思った人がほとんどだと思います。Xにポストすることをアウトプットと思ってやっている人はものすごく少ないです。
しかし、私は「Qiita」と「X」を同等にアウトプットするためのSNSと考えて利用しています。

<font color="red">**Xも発信する内容を意識するだけで立派なアウトプットにすることができます**</font>

今回は私が行っているQiitaとXの発信の使い分けや、その考え方について紹介していきます。
この記事を読んだあなたは明日から毎日継続して手軽にアウトプットができるようになることでしょう。

# アウトプットするべきこと

私がアウトプットすべきこととして意識していることがあります。

<font color="red">**「読んだ人の心を動かすことができること」**</font>

この点です。アウトプットをするということは、誰かに「気づき」を与えることが大切になってきます。心を動かすようなアウトプットをすることができないとアウトプットしてもスルーされてしまい、自分だけのアウトプットになってしまいます。

**読んだ人が心を動かされることで、そのアウトプットは多くの人に拡散されて、色々な意見が生まれることになります**

これがよいアウトプットの基準です。QiitaのいいねやXのリポストなども心が動かされないと行うものではないので、やはり拡散されているポストは心を動かされるものばかりです。

# 炎上は最高のアウトプット

実は「炎上」は最高のアウトプットです。
炎上しているということは、それに対して「賛成」「反対」の人が現れて議論をしていることになるわけです。

つまり、その内容に対して**意見を出さずにはいられない**と感じているわけです。

このような内容は世論になっていき、よりその内容について考える機会を世の中に与えることになるので**多くの人に影響を与える最高のアウトプット**になるわけです。

しかし、1つ守ってほしいことがあります。
<font color="red">**狙った炎上はしてはいけません。自分なりの意見が正しくあってそれが炎上することは最高なのです**</font>

炎上は狙えばいくらでもできます。しかし、それは悪い炎上なので絶対にやらないようにしてください。

# QiitaとXの使い分け

私はQiitaとXを明確に使い分けています。
どちらも人の心を動かすような、考えや経験について発信していることが多いですが、

**ふと思いついた意見や考えだけど、立派な文章にかけるほどは深堀ができていない**

ということがあります。

例えば以下のようなことです。

>努力をしないでものごとを成し遂げても楽しくないなと思った。例えば、プログラミングの最初にやったHello Worldとコンソールに出すのも先生はすごいでしょと言っていたがなにも感じなかった。やはり楽しむにはある程度の努力と苦労が必要


このような気づきは、Qiitaに書くにはなかなか難しいような浅い内容です。しかし大きな気づきです。

こういうものは「X」にアウトプットしていきます。

**気づきは時間が経つにつれてどんどん深まり言語化されていきます。そのタイミングでQiitaに言語化した内容をアウトプットします**

こうすることで、小さな気付きはどんどん大きくなってより、多くの人に「考える機会」を提供することになるのです

# 言語化の価値

ふと思った気持ちはアウトプットしないとすぐに忘れて、その気持ちを一生思い出すことがないかもしれません

その気持ちをアウトプットすることができれば「私も同じことを思っていた」「私は〜考えている」など多くの意見に触れてより深めるチャンスに変わっていきます。

AI時代になって言語化の価値はものすごく高くなっています。
書店では「言語化」に関する本が相次いでベストセラーになっています。

しかし長い文章を書くという習慣がなくなった現代では自分の気持ちを適切に言語化することができなくなっています。アウトプットは言語化が大切になってきます。まずはSNSに自分の気づきをアウトプットするところから始めてみてほしいです。

アウトプットに関しは他にも発信していますので、見ていただけたらと思います。

https://qiita.com/Sicut_study/items/79838a4b8ec36bc3a961

https://qiita.com/Sicut_study/items/36ebf65c32a80c57d183

https://qiita.com/Sicut_study/items/4e4f49aefb5a1b134582

# おわりに

今回はアウトプットに関する本質的な考え方について紹介しました。ぜひとも参考にハードルの低いアウトプットからしてみてください！

ここまで読んでいただけた方はいいねとストックよろしくお願いします。
@Sicut_study をフォローいただけるととてもうれしく思います。

また明日の記事でお会いしましょう！

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
実践的なカリキュラムで、あなたのエンジニアとしてのキャリアを最短で飛躍させましょう！
興味のある方は、ぜひホームページからお気軽にカウンセリングをお申し込みください！
▼▼▼

https://projisou.jp
プロセス間の通信

複数のプログラムを強調動作させるときには、各プロセスがデータの共有したり、あるいはお互いの処理をタイミングよく合わせる（同期させる）必要があります。このためにosが提供する機能のことを「```プロセス通信```」と呼びます。
...
Linuxは、目的別にたくさんのプロセス間通信の手段が提供されています。

### 気づき
プロセス同士の連携が取れていないことがわかる。
だからプロセス通信を使って同期させるのか。

# 共有メモリ
複数のプロセスに同じメモリ領域をマップすることができます。
### mmap()システムコールを使った共有メモリ
```
root@l************:*************:# ./non-shared-memory.py 
子プロセス生成前のデータの値: 1000
子プロセス終了後のデータの値: 1000
root@l************:*************:# ./shared-memory.py 
子プロセス生成前のデータの値: 1000
子プロセス終了後のデータの値: 2000
```
### 気づき
値の上書きは共有メモリに再び書き戻すことで実行されるのか。
共有メモリがすごいな。

# シグナルを使った通信
POSIXではSIGUSR1とSIGUSR2というプログラマが自由に用途を決めていいシグナルがあります。
これらのシグナルを使って、２つのプロセスがお互いにシグナルを送り合って進捗を確認しながら処理を進める
...
```送り先に「シグナルが届いた」という情報しか送れず、データの受け渡しには別の方法を使わなければいけないどの制約が多い```です。
```
root@l************:*************:# dd if=/dev/zero of=test bs=1 count=1G &
[1] 3916
root@l************:*************:# DDPID=$!
root@l************:*************:# kill -SIGUSR1 $DDPID
root@l************:*************:# 17908520+0 レコード入力
17908520+0 レコード出力
17908520 bytes (18 MB, 17 MiB) copied, 33.8393 s, 529 kB/s
kill -SIGUSR1 $DDPID
root@l************:*************:# 46448354+0 レコード入力
46448354+0 レコード出力
46448354 bytes (46 MB, 44 MiB) copied, 86.7034 s, 536 kB/s
kill $DDPID
```
# パイプを使った通信
複数のプロセスは、パイプと呼ばれるものを介して通信することができます。

### 気づき
これも同期して通信してくれていたのか気づかず使っていた。

# ソケット
UNIXドメインソケットです。このソケットは```一つのマシン上のプロセスのみ```を通信させる方法です。
TCPソケット、UDPソケットです。こちらは```インターネットプロトコルスイートあるいはTCP/IPと呼ばれるプロトコル```に従って、複数のプロトコルを通信させます。... ```別マシン上のプロセスとも```通信できるのが大きな利点です。

### 気づき
普段メモリのことを考えずできてるからありがたい。
# 出典
https://gihyo.jp/book/2022/978-4-297-13148-7

# 感想
プロセスの通信にいつも助けられています。
BEFEコインで財務成功を達成：$200から$200,000への道

BEFEコインは、投資家にとって大きな利益をもたらす可能性のある投資機会として注目されています。本記事では、BEFEコインの背景、市場位置、価格動向について詳しく解説します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319526/3003d300-f8b3-cd40-4b79-1a586fdcdd8f.png)

クイック切り抜き
BEFEコインは、$200の投資が$200,000に成長する可能性があるとして注目されています。ミームコイン市場の変動に伴い、投資家からの関心が高まっています。この記事では、BEFEコインの背景や価格動向、市場分析を行い、その魅力を解説します。

### ミームコインとBEFEの出現

ミームコインは、オンラインコミュニティ、バイラルマーケティング、インターネットジョークによって支えられる代替仮想通貨の分野で常に主導的な役割を果たしてきました。代表的なミームコインには、Dogecoin（DOGE）、Shiba Inu（SHIB）、Pepe Frogに基づくコインがあります。BEFEコインもその一つであり、単なるエンターテイメントにとどまらず、実生活でのユーティリティを提供することを目指しています。

BEFEコインは、ユーモアとコミュニティ体験を融合させることで他のミームコインとは一線を画しています。BEFEの野心的なコミュニティは、プロジェクトへの興奮を急速に拡大させ、過去にDOGEやSHIBの成功を逃した投資家にとって新たな投資機会を提供しています。

### BEFEの価格動向と市場位置の分析

過去3か月間のBEFEの価格パフォーマンスは、若干の変動がありながらも全体的に好調です。3月23日には33.47％増加し$0.00054318（0.085円　※1ドル=156.36円計算）に達し、翌日にはさらに20.29％増加して$0.00065322（0.102円）に達しました。3月24日には取引量が$1,722,236（26億9116万8816円）に達し、投資家の関心が高まっていることを示しました。

その後の価格は概ね$0.00040000（0.062円）前後で推移しており、市場での安定した位置を示しています。これにより、変動の激しい市場環境においても、BEFEの基本的な強さが示されています。過去3か月間、多くの日で取引量が$200,000（3127万2000円）を超えていることがその証拠です。

### 結論

BEFEコインは、価値創造を目指す投資アイデアとして注目されていますが、仮想通貨市場の固有の変動性も理解されています。投資家は、BEFEに関連するプロジェクトに資金を投入する前に十分な調査を行う必要があります。

初心者向け解説:
- **ミームコイン**: インターネットミームやジョークに基づく仮想通貨。DogecoinやShiba Inuが有名。
- **ユーティリティ**: 仮想通貨が実生活で使用される具体的な用途やサービス。
- **オープンインタレスト**: 特定の資産の未決済先物契約の総数。市場の関心度を示す指標です。

リンク一覧:
- [BEFEコイン](https://coinmarketcap.com/ja/currencies/befe/)
- [BEFEコインのTwitter](https://x.com/BefeToken)

キーワード: BEFEコイン, ミームコイン, 仮想通貨, 投資機会, 価格動向, 市場分析, ユーティリティ
kintoneの保存時(submit)にSweetAlert2を使って保存させるか選ばせる方法

# 環境
- kintone
- javascript
- jQuery
- SweetAlert2

# 対象
- kintoneの保存時(submit)にSweetAlert2を使って保存させるか選ばせたい人

# 通常の書き方（ダメなパターン）
通常は以下の様な書き方になると思います。
```javascript
  kintone.events.on(
    ["app.record.create.submit", "app.record.edit.submit"],
    (event) => {
      Swal.fire({
        title: "保存",
        text: "保存処理を続けますか？",
        icon: "warning",
        showCancelButton: true,
        confirmButtonColor: "#3085d6",
        cancelButtonColor: "#d33",
        confirmButtonText: "保存する",
        cancelButtonText: "保存しない",
      }).then((result) => {
        if (result.isConfirmed) {
            console.log('保存する が押されました。');
            return event;
        } else {
            console.log('保存しない が押されました。');
            return false;
        }
    });
```
この場合、保存処理が先に動いてしまい保存か保存させないかを選ぶ前に保存されてしまいます。
そのため以下の様に非同期処理を制御するためにPromiseを使用します。

# Promiseを使用した書き方
以下の様にします。
```javascript
  kintone.events.on(
    ["app.record.create.submit", "app.record.edit.submit"],
    (event) => {

      return new kintone.Promise((resolve, reject) => {
        Swal.fire({
          title: "保存",
          text: "保存処理を続けますか？",
          icon: 'warning',
          showCancelButton: true,
          confirmButtonColor: "#3085d6",
          cancelButtonColor: "#d33",
          confirmButtonText: "保存する",
          cancelButtonText: "保存しない"
        }).then((result) => {
          if (result.isConfirmed) {
            console.log("保存する が押されました。");
            resolve(event);
          } else {
            console.log("保存しない が押されました。");
            reject("cancel");
          }
        });
      }).then((r) => {
        return r;
      }).catch((e) => {
        return false;
      });
      
    });
```

# kintone.Promiseの説明資料
https://cybozu.dev/ja/kintone/tips/development/customize/development-know-how/promise-syntax/

https://cybozu.dev/ja/kintone/tips/development/customize/development-know-how/kintone-promise/
コピーオンライト

# fork()関数の高速化
fork()関数発行時には、親プロセスのメモリを子プロセスにすべてコピーするのではなく、```ページテーブルだけをコピー```します。
....
その後にメモリを読むと、```親子ともに共有された物理ページにアクセスできます```。
一方親子のいずれかがデータを更新使用すると、```ページの共有を解除して、それぞれのプロセスは専用のページを持つ```ことになります。

### データの更新の流れ
* 書き込み権限がないので、CPU上で```ページフォールトが発生```。
* CPUがカーネルモードに遷移して、カーネルのページフォールとハンドラが動き出す。
* ページフォールトハンドラは、アクセスされたページを別の物理メモリ上にコピーする。
* 親子プロセスともに、```子プロセスが更新しようとしたページに対応するページテーブルエントリを書き換える```。親プロセスのエントリは、書き込み権限を有効化する。子プロセスは```先の処理でのコピー先の領域を参照```する

### コピーオンライト(CoW)
fork()関数の発行時にではなく、その後の発生する各ページへの```初回書き込み時にデータをコピーする```ため、この仕組みをコピーオンライトと呼びます。

# 気づき
変更するページだけメモリを使用するので増加分が少なくて済む。
共有メモリはすごい。
共有メモリのおかげで物理メモリ以上のプロセスを動かすことができる。
```プロセスが生成された後も、それぞれのメモリが全メモリにwriteすることは極めて稀なので、システム全体のメモリ使用量も減らせる```。とはプロセスの仮想メモリがメモリ使用中の全プロセスに対して書き込む作業が稀ということなのか？それは分からなかった。

# コピーオンライトを見てみる
```
root@*******:************# ./cow.py 
*** 子プロセス生成前 ***
freeコマンドの実行結果:
              total        used        free      shared  buff/cache   available
Mem:        3907956      971248     1543992        5408     1392716     2686232
Swap:       1190340           0     1190340
親プロセスのメモリ関連情報
  RSS  MAJFL  MINFL
112256     2  27083

*** 子プロセス生成直後 ***
freeコマンドの実行結果:
              total        used        free      shared  buff/cache   available
Mem:        3907956      972552     1542480        5408     1392924     2684852
Swap:       1190340           0     1190340
子プロセスのメモリ関連情報
  RSS  MAJFL  MINFL
110076     1    618
```
### 気づき
usedが1MB増えている。
RSSが２MBぐらい減っている。これは理由はわからない。
```
*** 子プロセスによるメモリアクセス後 ***
freeコマンドの実行結果:
              total        used        free      shared  buff/cache   available
Mem:        3907956     1076628     1438404        5408     1392924     2580828
Swap:       1190340           0     1190340
子プロセスのメモリ関連情報
  RSS  MAJFL  MINFL
110088     1  26648
```
### 気づき
usedがさらに100MB増えている。ここで書き換えられたのか。新たに割り当てられている。

# 出典
https://gihyo.jp/book/2022/978-4-297-13148-7

# 感想
難しかくなってきた。
とりあえず頑張ろう。
メモリの使用量が共有メモリのおかげで節約できている
メンタルをやられてしまった時の経済的負担を減らす方法

SESは現場によって当たりハズレがあり、よくネタで現場ガチャなんて言われることもありますよね？
これはどの業界でも起こり得ることだとは思いますが、精神科や心療内科、メンタルクリニックへ通院することになってしまったという方も少なくないでしょう。
でも、もしも精神的にやられてしまった時はどうしたら良いのでしょうか？

そんな風にお悩みの方へ少しでも助けになるべく、医療費や収入の面といった経済面だけでも負担が軽減できる方法を記載させていただきたいと思います！
私自身も実際に使用したことで少し楽になったので、皆様へ共有させていただきたいと思います！

# 今働きながら治療したい？それとも一旦治療に専念して休みたい？
まずはここから考えてみましょう！
何故、そこから考えるのかというと、それによって取得できるものが変わってくるからです！
通院している方はお医者さんとご相談してみると良いかもしれません💡✨
<br>

**◆働きながら治療したい場合**
『自立支援医療制度』というものを受けることが可能になる可能性があります。
これは通院代や薬代が3割負担から1割負担へなるというものです。
自身にも会社に負担がかかるわけでもないので、受けてみたいと思ったら主治医の先生に『自立支援医療制度を受けたいのですが受けられますか？』と相談してみると良いと思います。
OKの場合、自立支援医療制度用の診断書を書いてくださいます。
私は記載していただくのに4000円かかりましたが、この後頻繁に通う考えるとお得です。
参考：<a href="https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/hukushi_kaigo/shougaishahukushi/jiritsu/gaiyo.html">厚生労働省～自立支援医療制度の概要～</a>

:::note warn
注意
**通院できる病院と薬局は1箇所に限定**されます。
安心して通院、処方薬を受けられる場所で申請を行うと良いでしょう！
万が一、変更する場合は市役所にて手続きが必要になりますので注意してください。
:::
<br>

**◆一旦治療に専念して休みたい場合**
『傷病手当金』を受けられます。
出勤する予定だった日の日給×2/3が全国健康保険協会(協会けんぽ)から毎月受け取ることができます！
※ざっくり表現なので、正しくは全国健康保険協会のサイトをご覧くださいね！
休職というかたちで会社に所属しながら給与を受け取ることができます。
会社からお金が出るわけではないので、そういった意味での会社への負担はありません。
傷病手当金申請書というものを毎月、通院先の病院と会社から記載していただく必要があります。
ちなみに受給している途中でも退職することは可能です。
この場合は会社の申請書を端折ることが可能です。
参考：<a href="https://www.kyoukaikenpo.or.jp/g3/sb3040/r139/">全国健康保険協会～病気やケガで会社を休んだとき（傷病手当金）～</a>

:::note warn
注意
期間は**1年半まで**という期限があります。
この間にしっかり療養し、復帰するも転職するなど考えておくと良いかもしれませんね！
:::
<br>

何事も心身ともに健康が一番！
何かおかしいなと感じたら、即病院へ行ってみたり、精神病について調べてみるのもいいかもしれません。

個人的に参考になったサイトのリンクを貼らせていただきますので、参考になさってみてくださいね🌟

# 参考サイト
**<a href="https://www.mhlw.go.jp/kokoro/youth/stress/index.html">厚生労働省：こころもメンテしよう～若者を支えるメンタルヘルスサイト～</a>**
そもそもメンタルヘルスってなんぞや？
どんなものがあって、その兆候がある場合、どういうことをしたらいいのかが分かりやすくまとめてあります！

**<a href="https://utu-yobo.com/choice/">うつナビ～失敗しない心療内科・
精神科（メンタルクリニック）の選び方～</a>**
メンタルヘルスは精神科や心療内科、メンタルクリニックなどがありますが、違いについてがまとめられています。
大きな違いはなく、ほぼ一緒ではありますが、
内臓系に違和感を感じているようであれば心療内科、
とにかく気分が落ち着かない精神的に辛いの一言っという状態であれば精神科、
っという具合に分けて病院を選んでみてもいいかもしれません！
PowerShellを使用してTeXファイル内のバックスラッシュをスラッシュに置換する

## めんどくさい！！  スラッシュ・バックスラッシュ問題 
あれ？ latexのコンパイルエラーが出た。ああ，画像パスを置換し忘れてた。
もう自動出来ないのか？
調べたところなかった為，自作しました。

### 初めに
この記事では、PowerShellを使用してTeXファイル内のバックスラッシュをスラッシュに置換するスクリプトを作成する方法を紹介します。TeXファイル内のバックスラッシュを置換することは、特にLaTeX文書でグラフィックスパスを変更する必要がある場合に便利です。


### スクリプトの作成

まず、PowerShellスクリプトを作成します。以下は、`convert_backslash_to_slash.ps1`というスクリプトの内容です。

```powershell
param (
    [Parameter(Mandatory=$true)]
    [string]$texFilePath
)

# .tex 拡張子を追加する
$texFilePath += ".tex"

# ファイルの内容を読み込む
$texCode = Get-Content -Path $texFilePath -Raw

# \includegraphics の場合の置換
$includeGraphicsPattern = '\\includegraphics\s*(\[[^\]]*\])?\s*{([^}]+)}'
$texCode = [System.Text.RegularExpressions.Regex]::Replace($texCode, $includeGraphicsPattern, { param($m) "`\includegraphics$($m.Groups[1].Value)`{$($m.Groups[2].Value -replace '\\', '/')}" })

# \includesvg の場合の置換
$includeSvgPattern = '\\includesvg\s*(\[[^\]]*\])?\s*{"([^}]+)"}'
$texCode = [System.Text.RegularExpressions.Regex]::Replace($texCode, $includeSvgPattern, { param($m) "`\includesvg$($m.Groups[1].Value)`{$($m.Groups[2].Value -replace '\\', '/')}" })

# 変換後の内容を書き戻す
Set-Content -Path $texFilePath -Value $texCode -Encoding UTF8
```

このスクリプトは、指定されたTeXファイルのパスを引数として受け取り、バックスラッシュをスラッシュに置換します。


### VSCode設定
setting.jsonに以下を追加します。convert_backslash_to_slash.ps1のパスを設定してください。
```JSON
"latex-workshop.latex.tools": [
    {
        "name": "convert_backslash_to_slash",
        "command": "powershell",
        "args": [
        "-NoProfile",
        "-ExecutionPolicy",
        "Bypass",
        "-File",
        "convert_backslash_to_slash.ps1",
        "%DOCFILE%"
        ]
    }
],
"latex-workshop.latex.recipes": [
    {
        "name": "LuaLaTeX_PS",
        "tools": [
        "convert_backslash_to_slash",
        "Latexmk (LuaLaTeX)" 
        ],
    },
],
"[latex]": {
    "files.encoding": "utf8bom"
}
```

これでコンパイルをLuaLaTeX_PSで行えば，自動的に画像パスだけを置換してくれます。
python初心者です。

tkinterを使ったプログラミング練習でエラーが出てしまいます。何故でしょうか？ご教授願います。

 実行環境　linux mint 21.3
 開発言語　python3.9
 エディタ　VSCODE
 
実行コード

import  tkinter as tk

#メインウィンドウ
root = tk.TK()
#タイトル
root.title("初めてのtkiner")
#ウィンドウサイズ
root.geometry(400*100)
#ラベル
label1 =tk.Label(root,text="Pythonの世界へようこそ",bg="yellow",fg="green")
label1.pack()
label2 =tk.Label(root,text="Pythonはオブジェクト指向", bg="orange")
label2.pack()
label3 = tk.Label(root,text="tkinterでGUIアプリ",bg="pink")
lable3.pack()

#メインループ
root.mainloop()

エラーコード
/bin/python3 /home/os/python/tkinter1.py
Traceback (most recent call last):
  File "/home/os/python/tkinter1.py", line 1, in <module>
    import  tkinter as tk
ModuleNotFoundError: No module named 'tkinter
AWS PinpointでiOSにプッシュ通知を送信する際のAPNS環境の違いとテストフライトの注意事項

こんにちは、開発部の天津炒飯です。

自分はステージング（STG）環境でテストフライトにプッシュ通知を送信できず、苦戦した経験があります。そこで、APNSのそれぞれの環境の違いと、STG環境でのテストフライトの注意事項を紹介したいと思います。

## APNS Product環境とSandbox環境の違い
### 1. Production環境
* **用途:** 本番環境で実際のユーザーに対してプッシュ通知を送信するために使用します。
* **証明書:** Apple Developerアカウントで取得するProduction用のAPNS証明書が必要です。
* **トークン:** 実デバイスで発行されたデバイストークンを使用します。
* **Pinpointチャンネル:** APNS
### 2. Sandbox環境
* **用途:** 開発およびテスト環境でプッシュ通知の動作を確認するために使用します。
* **証明書:** Apple Developerアカウントで取得するSandbox用のAPNS証明書が必要です。
* **トークン:** 実デバイスまたはシミュレーターで発行されたSandbox用のデバイストークンを使用します。
* **Pinpointチャンネル:** APNS_SANDBOX

## ステージング環境（STG）でのテストフライトの注意事項
それでは本題のSTG環境での注意事項

**環境や設定に関わらず、TestFlightで配布するアプリはProduction環境になります！**
**環境や設定に関わらず、TestFlightで配布するアプリはProduction環境になります！**
**環境や設定に関わらず、TestFlightで配布するアプリはProduction環境になります！**
大事なことなので三回言いました

そのため、AWS Pinpointにエンドポイントを登録する際、チャンネルはAPNS（Production環境）に設定しなければなりません。

直感的には、STG環境のAPNSは開発用のSandbox環境に、本番環境はProduction環境になると考えがちですが、実際にはSTG環境のテストアプリをTestFlightで配布するとAPNSはProduction環境になります。
アプリ側が持つトークンはProduction環境のトークンになりますが、もしPinpointの設定をSandbox環境にしていると、プッシュ通知が正しく届かない原因になります。

具体的には、アプリが取得するトークンはProduction環境のものなのに、Pinpointがプッシュ通知をSandbox環境に送信しようとすると、通知が届かなくなります。
![qiita20240522.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3517332/587b450f-16eb-8270-cc20-14963e882b5e.png)


これを避けるためには、アプリのSTGテストフライト環境に別対応が必要です。Pinpointにエンドポイントを登録する際に、チャンネルをAPNS（Production環境）に指定しなければなりません。

## まとめ
AWS Pinpointを使用してiOSデバイスにプッシュ通知を送信する際には、APNSのProduction環境とSandbox環境の違いを理解し、適切な証明書とエンドポイントを使用することが重要です。
また、ステージング環境でテストフライトを使用してテストを行う際には、テストフライト経由でインストールされたアプリがProduction環境として扱われることを理解し、APNSチャンネル登録の設定に注意してください。これにより、開発中のプッシュ通知機能が本番環境でも正しく動作することを確認できます。

## 参考資料
https://qiita.com/komitake/items/8eba72f4eb16997179d7
https://qiita.com/k_teluki/items/b12502702234bd5d04dc
https://kiririmode.hatenablog.jp/entry/20221001/1664600847

## さいごに
はつかぜ株式会社では、IT学習や業務に役立つ情報を定期的にお届けしていきたいと思っています。
システム開発のお問い合わせ・ご相談はこちら

https://www.hatsukaze.co.jp/inquire/
GitHub Actionsを使ってVitestの自動実行とカバレッジをPR上で表示させよう！

## 概要
GitHub Actions内でVitestを使って単体テストを実行し、PRにカバレッジを表示させることができれば便利なのでその方法について解説していきたいと思います

## 前提
- Vite、Vitestをインストール済み
- 以下のactionを使ってカバレッジを表示させる
    - https://github.com/davelosert/vitest-coverage-report-action

## ディレクトリ構成
```
├── .github
│   └── workflows
│       └── test.yml
└── application
    ├── package-lock.json
    ├── package.json
    ├── src
    └── vite.config.ts
```

## vite.config.ts
カバレッジを表示するactionを使用するには以下の設定をvite.config.tsファイルに記載する必要があります

> To use this action, you need to configure vitest to create a coverage report with the following reporters:
json-summary (required): This reporter generates a high-level summary of your overall coverage.
json (optional): If provided, this reporter generates file-specific coverage reports for each file in your project.

```vite.config.ts
import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    coverage: {
      // you can include other reporters, but 'json-summary' is required, json is recommended
      reporter: ['text', 'json-summary', 'json'],
    },
  },
});

```

## ワークフローの作成
Vitestを実行する用のワークフローを作成します
今回はapplication配下にソースコードがあるので`working-directory`を指定します

```test.yml
name: Vitest

on:
  pull_request:
    types: [opened, reopened, synchronize, ready_for_review]

env:
  WORKING_DIRECTORY: application

jobs:
  test:
    name: Run test codes
    if: |
      github.event.pull_request.draft == false
      && !startsWith(github.head_ref, 'release')
      && !startsWith(github.head_ref, 'doc')
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: ${{ env.WORKING_DIRECTORY }}
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version-file: ${{ env.WORKING_DIRECTORY }}/package.json
          cache: 'npm'
          cache-dependency-path: '**/package-lock.json'
      - name: Install dependencies
        run: npm ci
      - name: Run Vitest
        run: npx vitest --coverage.enabled true
      - name: Show coverage
        uses: davelosert/vitest-coverage-report-action@v2
        with:
          working-directory: ${{ env.WORKING_DIRECTORY }}

```

## ワークフローを実行してみよう！
以下のようにテストが正常に実行され、カバレッジがPR上に表示されたら成功です
![スクリーンショット 2024-05-22 15.03.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/d968bed1-2006-1f36-5b8c-e92535b4a64b.png)

![スクリーンショット 2024-05-22 15.10.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/071cbee3-353a-d073-f9d4-4d4b99b3e9b6.png)

## 参考
https://github.com/davelosert/vitest-coverage-report-action

https://stackoverflow.com/questions/72146352/vitest-defineconfig-test-does-not-exist-in-type-userconfigexport
並列Lispで素数判定をする

# 素数判定
ある自然数が素数かどうかを判定するにはシンプルな方法があります。2以外で2で割り切れるならばそれは偶数です。3以上で奇数で割り切れるならばそれは合成数です。素数ではありません。これをその自然数の平方根に達するまで調べます。この結果、割り切れないならばそれは素数です。Lispコードで表すなら下記の通りです。

```
(defun coprimep (n s e)
    (cond ((> s e) t)
          ((= (mod n s) 0) nil)
          (t (coprimep n (+ s 2) e))))

(defun primep (n)
    (cond ((= n 2) t)
          ((= (mod n 2) 0) nil)
          (t (coprimep n 3 (isqrt n)))))
```


# 並列計算
この素朴な方法は大量の計算を要します。並列でこの計算を分担すれば計算時間を短縮できるはずです。Easy-ISLispにおいてこれに挑戦しました。マルチプロセスバージョンのprognであるmp-exec という並列構文が用意されています。しかし、これだと全部の引数について計算をしてしまいます。

```
(mp-exec  (foo1) (foo2) (foo 3) (foo 4) (foo 5))
```

素数判定において分割した計算のいずれかにおいて素数ではないことが判明したのならば残りの計算は必要がありません。それは合成数であることがわかっているのですから、計算を終了させないと時間の無駄です。そこでmp-partという並列構文を用意しました。partial-execution に由来しています。

```
(mp-part (foo1) (foo2) (foo 3) (foo 4) (foo 5))
```

# シグナルを利用する
mp-partの実装にあたってはUnixのシグナルを使いました。親Lispは子Lispに分割した計算を依頼します。子Lispは計算が終わったものから順次計算結果を返すとともにシグナルを親Lispに送信します。親Lispはこのシグナルを受信して子Lispからの計算結果を得ます。

もし、この計算結果がnilであった場合には親Lispはまだ計算途中の子Lispに対してctrl+cシグナルを送信します。計算途中の子Lispはこれにより計算を停止します。


![signal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/f220e178-5498-9ea7-425a-8eb2c5740bd1.png)



# 並列構文による素数判定
このmp-partを利用した素数判定のコードは下記のようになります。

```
(defun primep* (n)
    (cond ((= n 2) t)
          ((= (mod n 2) 0) nil)
          (t (let* ((limit (isqrt n))
                   (span (div limit 5)))
                 (mp-part (coprimep n 3 span)
                          (coprimep n (near-odd span) (* 2 span ))
                          (coprimep n (near-odd (* 2 span)) (* 3 span))
                          (coprimep n (near-odd (* 3 span)) (* 4 span))
                          (coprimep n (near-odd (* 4 span)) limit))))))

(defun near-odd (n)
    (if (= (mod n 2) 0)
        (- n 1)
        n))


(defun coprimep (n s e)
    (cond ((> s e) t)
          ((= (mod n s) 0) nil)
          (t (coprimep n (+ s 2) e))))

```


Easy-ISlispはコンパイラにおいて末尾再帰最適化をしています。コンパイルして計算をさせてみます。AMDのRyzenを積んだ6コアのマシンです。

![bandicam 2024-05-22 08-33-55-570.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/5cff1b4a-ec82-489e-5f06-e9f1c6a63675.jpeg)



大きな素数の判定では並列の効果が表れています。おおよそ5分の1の実行時間に短縮できています。


# 並列の時代
インテル、AMDなどの現在のCPUはマルチコアです。安価なマシンでも6コアを搭載しています。ゲーム用の高価なマシンでは２０コアが使われるようになっています。この高性能なCPUを活かさない手はありません。Lispにおいても並列を積極的に利用した方がよろしいと私は思っています。

Easy-ISLispはオープンソースです。Githubにおいて公開しています。
https://github.com/sasagawa888/eisl
rex0220 アクション表示制御プラグイン ログインユーザーが組織選択の所属か判定

[アクション表示制御プラグイン](https://qiita.com/rex0220/items/75b741747689c79db4cc)で、組織選択の所属ユーザーのみアクションボタン表示を行います。

# 概要

kintone 標準のフィールドアクセス権を利用して、ログインユーザーが組織選択の所属か判定できるようにします。

![2024-05-22_14h42_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/07efe7e4-e25c-167f-441f-cb718d3f38dd.png)

# アプリ設定

初期値1 で数値項目の組織チェックを配置し、フィールドアクセス権で組織選択のみ閲覧可にします。
※既存レコードがある場合は、組織チェック項目を追加後に「1」を設定してください。

![2024-05-22_14h46_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/19880faa-dbe4-386c-8462-bfcc4633aaa1.png)


![2024-05-22_14h46_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/fb96a5aa-96fd-fe72-5f4f-25a570ac0c6c.png)

# アクション表示制御プラグイン設定

アクションの表示条件に「組織チェック」を指定します。
※ログインユーザーが組織選択の所属メンバーであれば、「組織チェック」の値「1」で、アクションボタンが表示されます。

![2024-05-22_14h49_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/cea0d7e3-ce75-5617-1a4c-45d8c4226cc2.png)
[小ネタ] SQLの GROUP BY / ORDER BY には数字 (1, 2...) を指定しよう

:::note warn
この記事で紹介しているSQLの書き方は、その場で使い捨てる用途を想定しています。（プロダクションコードは想定していません。）
:::

## こんなSQL書いてしまっていませんか？

よくこんな集計用のSQLを即興で書くことが多いと思いますが、

```sql
--------------------------------------------------------
-- users テーブルについて、部署・役職・作成日ごとに件数を集計する
-- (MySQL用)
--------------------------------------------------------
SELECT
  u.department_code `部署コード`,
  u.role_code `役職コード`,
  DATE_FORMAT(u.created_at, '%Y-%m-%d') `作成日`,
  COUNT(*) `人数`
FROM users u
GROUP BY
  u.department_code,
  u.role_code,
  DATE_FORMAT(u.created_at, '%Y-%m-%d')
ORDER BY
  u.department_code ASC,
  u.role_code DESC,
  DATE_FORMAT(u.created_at, '%Y-%m-%d') ASC
```

`GROUP BY` / `ORDER BY` で `SELECT` に出現している項目 (`DATE_FORMAT(u.created_at, '%Y-%m-%d')`) を**繰り返し書いているのが非常に煩雑**ですね。

## `GROUP BY セレクトリストのカラム位置` / `ORDER BY セレクトリストのカラム位置` の構文を使ってスッキリとしたSQLを書こう

`GROUP BY` / `ORDER BY` では `SELECT` 上のカラムや式について **数字で参照することができます。**

```sql
--------------------------------------------------------
-- users テーブルについて、部署・役職・作成日ごとに件数を集計する
-- (MySQL用)
--------------------------------------------------------
SELECT
  u.department_code `部署コード`,
  u.role_code `役職コード`,
  DATE_FORMAT(u.created_at, '%Y-%m-%d') `作成日`,
  COUNT(*) `人数`
FROM users u
GROUP BY 1, 2, 3
ORDER BY 1 ASC, 2 DESC, 3 ASC
```

さっき繰り返し現れていた`DATE_FORMAT(u.created_at, '%Y-%m-%d')` が **1箇所で済むようになりました。**

即興で集計する場合は、表の左側に集計キーを置き、それらで集約・ソートしたいことが8割なので、数字を書くだけで集計キーを参照できるのは、非常に理にかなった構文と言えます。

ちなみに、初心者は誤解しやすいのですが、これは**数字による特殊な構文でのカラム参照**であって、数字による式の結果で集計やソートをしているわけではありません。

たとえば、MySQLのマニュアルであれば、以下の `column position` にあたる数字のみが出てきた場合の特別な構文です。

> Columns selected for output can be referred to in ORDER BY and GROUP BY clauses using column names, column aliases, or **column positions. Column positions are integers and begin with 1**
> [MySQLマニュアル](https://dev.mysql.com/doc/refman/8.0/en/select.html)

## PostgreSQLなどMySQL以外の対応状況について

この構文はMySQL以外でもサポートされています。

実際に各DBMSのマニュアルとWeb上の[プレイグラウンド](https://dbfiddle.uk/) で確認してみたところ[^1]、以下のようになっているようです。

[^1]: 2024/05/22 時点で選べる比較的新しいバージョンを用いています。厳密なバージョンは確認していないので参考程度としてください。

| DBMS | GROUP BY *数字* | ORDER BY *数字* |
|---|---|---|
| [MySQL](https://dev.mysql.com/doc/refman/8.0/en/select.html) | OK | OK |
| [PostgreSQL](https://www.postgresql.org/docs/current/sql-select.html) | OK | OK |
| [SQLite](https://www.sqlite.org/lang_select.html) | OK | OK |
| [SQL Server](https://learn.microsoft.com/ja-jp/sql/t-sql/queries/select-transact-sql?view=sql-server-ver16) | ❌ **NG** | OK |
| [Oracle](https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/SELECT.html) | ❌ **NG** | OK |

OracleとSQL Serverについては `GROUP BY 数字` がサポートされていないのが残念です。（マニュアルでも確認できませんでした）
【AtCoder】ラムダ式

## ラムダ関数とは
main関数内でラムダ関数と呼ばれる関数を定義することができる。ラムダ関数を定義することで、それより前に定義された**main関数内の変数や関数も使用することができる**。つまり、ラムダ関数を使うことで、グローバル変数にすることによる手間がなくなるので便利である。ただしその際には、キャプチャを指定しなければいけないので注意するべし。

## 例題
[ABC260B - Better Students Are Needed!](https://atcoder.jp/contests/abc260/tasks/abc260_b)

下記は、ラムダ関数を使わない実装例である

```C++
#include <bits/stdc++.h>
using namespace std;
using P = pair<int, int>;
#define rep(i, n) for (int i = 0; i < n; i++)

// main関数から切り出された変数や関数
int N;
vector<bool> passed;
vector<P> make_unpassed_list(vector<int> &score) {
  vector<P> res;
  rep(i, N) {
    if (!passed[i]) res.emplace_back(-score[i], i);
  }
  return res;
}
void f(vector<P> L, int cap) {
  sort(L.begin(), L.end());
  rep(i, cap) {
    auto [_, j] = L[i];
    passed[j] = true;
  }
}

int main() {
  int X, Y, Z;
  cin >> N >> X >> Y >> Z;
  vector<int> A(N), B(N), C(N);
  rep(i, N) cin >> A[i];
  rep(i, N) cin >> B[i];
  rep(i, N) C[i] = A[i] + B[i];
  passed = vector<bool>(N, false);
  
  f(make_unpassed_list(A), X);
  f(make_unpassed_list(B), Y);
  f(make_unpassed_list(C), Z);
  
  rep(i, N) {
    if (passed[i]) cout << i + 1 << endl;
  }
}
```

<br>

ラムダ関数を使うと下記のようになる。


```C++
#include <bits/stdc++.h>
using namespace std;
using P = pair<int, int>;
#define rep(i, n) for (int i = 0; i < n; i++)

int main() {
  int N, X, Y, Z;
  cin >> N >> X >> Y >> Z;
  vector<int> A(N), B(N), C(N);
  rep(i, N) cin >> A[i];
  rep(i, N) cin >> B[i];
  rep(i, N) C[i] = A[i] + B[i];
  vector<bool> passed(N, false);
  // ラムダ関数
  auto make_unpassed_list = [&](vector<int> &score) {
    vector<P> res;
    rep(i, N) {
      if (!passed[i]) res.emplace_back(-score[i], i);
    }
    return res;
  };
  // ラムダ関数
  auto f = [&](vector<P> L, int cap) {
    sort(L.begin(), L.end());
    rep(i, cap) {
      auto [_, j] = L[i];
      passed[j] = true;
    }
  };
  
  f(make_unpassed_list(A), X);
  f(make_unpassed_list(B), Y);
  f(make_unpassed_list(C), Z);
  
  rep(i, N) {
    if (passed[i]) cout << i + 1 << endl;
  }
}
```

## 参考
https://rinatz.github.io/cpp-book/ch02-09-lambda-expressions/
ExecJSがデフォルトで使用するランタイムを調査

ExecJS gemはjavascriptをrubyから実行するためのgemです。javascriptの実行には、ローカルマシン上にあるjavascript実行環境が使われます。

複数の実行環境が存在したときに、どの実行環境が使われるのか調査したい場合は、以下のコマンドで確認できます。

```ruby
ExecJS::Runtimes.autodetect
```

ExecJSのjavascript実行環境の選択について、詳しくは[ExecJSが自動で選択するランタイムはどのように決まるのか](https://qiita.com/kyntk/items/07a8ea95f32b761c2f3c)が参考になります。
Airstationの設定画面を開きたい!

ブラウザWebUIから、操作できるのは他メーカと同じ

ただ、専用ソフトを入れないと、設定画面を見れない仕様。
詳しくは不明


Airstation一覧にAirstationが表示されない。VPNには接続していない。


デバイスマネージャからVirtualboxのNWアダプタを無効化することで接続できるように