OmniAICreator/Qiita-1.07M huggingface dataset:
【Part1】Pythonで簡単Discord Bot開発入門 - Discord Botを作成し，サーバーに招待する方法！！

こんにちは！この記事ではあくまで簡単に，Discordのボットの作成からサーバーへ招待する方法を説明します．最終的にはユーザーが送信したメッセージをそのままオウム返しさせるボットを目指します．

## 目次
- [1. Discord Botアカウントの作成](#1-discord-botアカウントの作成)
- [2. サーバーへの招待](#2-サーバーへの招待)

## 1. Discord Botアカウントの作成

https://discord.com/developers/applications

まずは，Discordのデベロッパーページにログインします．
ログインが成功したら，次にDEVELOPER PORTALのApplicationsのページを開きます．

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629527/e3673c29-b6db-50af-7862-fb1161689264.png)

そうしたら，このような画面が表示されます．次に，右上の「New Application」をクリックし，適当な名前を付けて各利用規約に同意をして，Createを実行します．今回私は「Hello」という名前のボットを作成します．

![Untitled 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629527/ab4ef597-f1c3-e66d-5341-94fdb445edbe.png)


左にメニューバーから「Bot」を選択し，「Privileged Gateway Intents」欄が画像の様になっていればOKです．

### ※重要

シークレットトークンを扱うため，この情報は外部に漏らさないようにしてください．このトークンが流出してしまうと，簡単にボットが乗っ取られてしまいます！

### トークン取得方法

1. Applicationページから，左のメニューバーからBotに移動します．
    
    ![%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2024-05-02_202930.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629527/345276bc-cb9d-9c98-7ed8-500417386d8e.png)


    
2. 「Reset Token」ボタンをクリックします．
    ![Untitled 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629527/59b5ad5c-0b72-5fff-7f1c-df6413f38c32.png)
    
3. パスワード等を入力し，認証を成功させます．
4. 「Copy」ボタンをクリックし，メモ帳等に忘れないように保存してください．

## 2. サーバーへの招待

1. まずは，自分だけのDiscordテストサーバーを立てておいてください．サーバーの建て方がわからない方は[こちら](https://sokohako.com/4595)を参考にしてください．
2. 左のメニューバーから，「OAuth2」に移動します．
3. 次に，「OAuth2 URL Generator」から「bot」のチェックボックスにチェックを入れます．
    
    ![Untitled 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629527/2cd2ff75-a15c-7c92-a222-c7f28bd2c31a.png)

    
4. その下に，「BOT PERMISSIONS」という欄が表示されます．これは，ボットに与えられるサーバーでの権限を意味していて，メッセージの送信権限からメンバーの削除まで種類があります．これは，ボットに組み込む機能によって権限を変更してください．今回は，自分だけのテストサーバーに招待するため，管理者権限（Administrator）を与えます．
    
    ![Untitled 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629527/f4d9e425-58c2-b51b-c263-e3546aef83ff.png)

    
5. 最後に，URLが表示されるため，これをコピーしてブラウザに貼り付けると，サーバーに招待することができます．
6. 無事招待できましたね．
    
    ![Untitled 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629527/c1c5e098-d353-daf1-719f-389954bb088d.png)

    

## さいごに

これで無事に作成したボットがサーバーに追加されたと思います．次の章では，今回メモしたトークンを使って，プログラムを行い，機能を追加するところまでやっていきましょう！

### Part2
https://qiita.com/als/items/c464be3389a8ce680bf2


## 参考文献

https://discordpy.readthedocs.io/ja/latest/

https://sokohako.com/4595
Rust でバッファを型変換

# 問題
バイト列として読み込んだバッファを、適当な型の配列にしたい、というケースがある。C言語なら有無を言わさずポインタでキャストかけてしまえばいい。例えば、16バイトのバイトバッファを32ビット整数の配列とみなすには以下のように書けばいい。



``` C
#include <stdio.h>
#include <stdlib.h>


int main(){
    char * buffer = malloc(16);
    for (int i = 0; i < 8; i++)
        buffer[i] = (char)i;

    int32_t *p = (int32_t *)buffer;
    printf("%d %d\n", p[0], p[1]);

    free(buffer);
}
```

なんてすっきり。これがRustだとどうなるか。

## 回答
割に簡単に書ける。

``` Rust
use std::mem::ManuallyDrop;

fn main() {
    let mut buffer = Vec::with_capacity(8);
    for i in 0..8 {
        buffer.push(i as u8);
    }

    let buffer = ManuallyDrop::new(buffer);
    let boxed_array: Box<[i32]> = unsafe {
        Box::from_raw(buffer.as_ptr() as *mut [i32; 2])
    };

    for i in 0..2 {
        println!("{:}", boxed_array[i]);
    }
    println!("{:p}, {:p}", buffer.as_ptr(), boxed_array.as_ptr());
}
```
バイトバッファは、Vecで表現している。最後の行で同じ領域を指していることを確認している。

ポイントは2つ。

- バイトバッファポインタを取り出して、Box<[i32]> を作る。
    - Vecからrawポインタを取り出す。これはsafeで `as_ptr()` で取得できる。
    - rawポインタを使ってBoxされた配列を作る。これは当然unsafeなのでunsafeブロック内で、`Box::from_raw` を使う。この際に配列のサイズを指定しなければならない。
- これだけだと、`buffer` と `vec_int`が同じメモリ領域を参照しているので、ブロックから抜けるときにdouble free になる。
    - なので、`ManuallyDrop` を使って `buffer` を ラップしておく。こうすると、`buffer`をドロップするときに、メモリを開放しなくなる。所有権が `boxed_array`に移ったことになる。

実際、`ManuallyDrop` の行をコメントアウトすると、

```
rust_buffer_test(64289,0x203af3ac0) malloc: Double free of object 0x158f04360
rust_buffer_test(64289,0x203af3ac0) malloc: *** set a breakpoint in malloc_error_break to debug
```
というエラーがでる。

## 問題点
- Rustの配列は固定長で、コンパイル時に長さが決まっている必要がある。ここでは配列長が2だったが、任意の式をここに書くことはできない。
- Sliceを作ることはできるのだけど、Sliceだと所有権を引き継ぐことができないので、やりたいこととはやや違う。うーん。
- Sliceから`to_vec` でVectorをつくるとコピーしてしまう。通信バッファだと思うとこれはうまくない。
- なにかいい方法がありそうなものだが。直接ポインタからvectorを作る方法がありそうな。。

## 追記

と思ったら、普通にあった。`Vec::from_raw_parts` でよい。この場合も所有権が渡るので `ManuallyDrop` は必須。

``` Rust
use std::mem::ManuallyDrop;
use std::vec::Vec;

fn main() {
    let mut buffer = Vec::with_capacity(8);
    for i in 0..8 {
        buffer.push(i as u8);
    }

    let buffer = ManuallyDrop::new(buffer);
    let len = buffer.len() / 4;
    let int_vec: Vec<i32> = unsafe {
        Vec::from_raw_parts(buffer.as_ptr() as *mut i32, len, len)
    };

    for i in 0..2 {
        println!("{:}", int_vec[i]);
    }
    println!("{:p}, {:p}", buffer.as_ptr(), int_vec.as_ptr());
}
```
PythonでAndroidアプリ開発環境構築

## 概要
PythonでAndroidアプリを開発するために、GUIプログラミングを可能にするkivyというライブラリを利用する。

## IDE(Cursor)とPythonのインストール
https://qiita.com/noimp/items/50a0b452688ad11f08eb

## Cythonとkivyのインストール
CursorやVS CodeのTerminalで下記を実行する。
Cythonはkivyを使用するために必要。
```sh:commond
pip3 install -U Cython
pip3 install kivy
```
## kivyの日本語化
CursorやVS CodeのTerminalで下記を実行する。
```sh:commond
pip install japanize-kivy
```
【SwiftUI】ScrollView や List を snap する


なんか違和感がある。

<img src="https://i0.wp.com/android.benigumo.com/wp-content/uploads/2024/04/normal.gif?ssl=1">

### 🤔 snap を使う

ScrollView を使ったリストの実装に、

```swift
.scrollTargetLayout()

.scrollTargetBehavior(.viewAligned)
```

の2行を追加するだけできっちり止まるようになります。

<img src="https://i0.wp.com/android.benigumo.com/wp-content/uploads/2024/04/sc-2024-04-24-at-13.54.41.gif?ssl=1">

### 🤔 適用後

違和感がなくなりました。

<img src="https://i0.wp.com/android.benigumo.com/wp-content/uploads/2024/04/snapped.gif?ssl=1">

これは便利すぎる !

<a href="https://android.benigumo.com/20240424/snap-list/" target="_blank" rel="noopener">👉 【SwiftUI】ScrollView や List を snap する&nbsp;<img src="https://b.hatena.ne.jp/entry/image/https://android.benigumo.com/20240424/snap-list/" alt="hatena-bookmark" /></a>
「見返しても意味が分からないメモ」から脱却して生産性を上げる

## はじめに

◆この記事は何？

メモの取り方のTipsを紹介する記事

◆対象は？

特に新人の方

◆この記事のねらい

「メモを見返しても分からない」を減らす

ここでの「メモ」とは、議事録よりもカジュアルで、個人用の記録を指します。

例えば、議事録を作成するための記録のような位置付けです。

## 先に結論

「見返しても意味が分からないメモ」から脱却するために、
- **動詞を使う/次のアクションを考える**
- すぐに整形する
- 「誰かがやってくれるから自分は大丈夫」という気持ちを捨てる

## 後で見返してもわからないメモ

次のようなメモの例を考えます。

上司に作成したグラフを見せて、会話しながら記録したメモを想定します。

- メモ
    - 大きく
    - 範囲
    - 軸ラベル

会話しながらメモを取ると、単語だけを書き残してしまうことがあります。

しかし、上記のようなメモでは、後から見返すと何をすればいいか特定できません。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616496/e3633bf6-e0c2-c738-5598-d79588d959cf.png" width=50%>

## 動詞を使う

動詞を使うと、**自然と**良いメモになります。

動詞を使うことで、「何をするか」が特定されるためです。

◆Before
- 大きく
- 範囲
- 軸ラベル

◆After
- 文字を大きくする
- 範囲を変更する
- 軸ラベルをつける


## 次のアクションを考える

次のアクションを考えると、自然と良いメモになります。

メモの目的の大部分は、次のアクションのためだからです。

目的・対象を詳細化するのがコツです。

◆Before
- 文字を大きくする
- 範囲を変更する
- 軸ラベルをつける

◆After
- 視認性を上げるために、全ての文字を大きくする(16ptくらい)
- x軸の範囲を10以上に変更する
- X軸ラベル,Y軸ラベルをつける

このメモだと、後で見返しても意味がわかりそうです。
グラフも次のように修正できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616496/01cee204-a4cc-42fc-643e-97299de243c5.png" width=50%>

## すぐにメモを整形する

会話が終わった後に、**すぐに**メモを整形します。

メモをとっているときは、タイピングが間に合わず、動詞が使えていなかったり、主語・目的語が抜けていたりします。

会話の内容を覚えているうちに、メモを整形して、後で見返しても意味がわかるようにしておきます。

## 「誰かがやってくれる」という気持ちを捨てる

特に、チーム内の会話では、次のような気持ちが生まれてしまいます。

- 誰かが記録している
- 誰かが覚えている
- 忘れてしまったらまた聞けば良い

しかし、上記のままでは個人/チームの生産性が上がりません。

余計なコミュニケーションが発生したり、メモから勘違いして作業の後戻りが発生したりします。

 「誰かがやってくれる」という気持ちを捨てて、「後で見返しても意味がわかるメモ」を書くのが望ましいです。

## おわりに

この記事では、メモの取り方のTipsを紹介しました。

「見返しても意味が分からないメモ」から脱却して、生産性の向上につながれば幸いです。
Cursor+Python環境構築

## 環境
|項目|バージョン|
|----|----|
|OS|Windows11|
|Cursor|0.32.8|
|Python|3.12.3|

## Cursorをインストールする
1. 下記から使用しているOSの「Download for Windows」を押下する。
https://cursor.sh/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637688/962c7772-ab83-d2f6-cda6-f7ae7ae9d453.png)

1. ダウンロードした「Cursor Setup 0.32.8 - x64.exe」をダブルクリックする。
1. 「Language」に「日本語」と入力し、「Command Line」で「Installed "cursor"」を選択し、「Countinue」ボタンを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637688/0010a2c2-2ef4-8717-5fcb-9fa57b9796bb.png)
1. 「Use Extensions」ボタンを押下し、VSCodeのアドオンをCursorでも使用する設定を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637688/51a48c12-2af2-2a92-f74b-46d38d8ddf9d.png)
1. 「Privacy Mode」を選択し、「Continue」ボタンを押下することで、プログラムを学習させない(外部に送らない)ように設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637688/49ce964c-33ad-e143-8e57-e7c011d7950c.png)
1. 「Log In」あるいは「Sign Up」を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637688/fa6055ba-643a-9b64-250b-c176a222f8f6.png)
1. Cursorが起動されたことを確認する。「Ctrl」+KでAIを呼び出せる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637688/db184f19-25d9-0023-f28d-ee3a69129052.png)

## Pythonをインストールする
2. 下記からPythonのインストーラをダウンロードする。
https://www.python.org/downloads/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637688/cadda14b-5dcc-d87c-5882-02c483fd35a5.png)
2. ダウンロードした「python-3.12.3-amd64.exe」をダブルクリックする。
2. 下記にチェックを入れて、「Install Now」を押下する。
・「Use admin privileges when installing py.exe」
・「Add python.exe to PATH」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637688/5311e6aa-bc41-660e-eea4-09f87a82d9be.png)
2. 「Close」ボタンを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637688/528cac7f-c9d9-d056-2795-7c1178c6f3a1.png)
2. コマンドプロンプトで下記を入力し、インストールされたことを確認する
```sh:commond
python -V
```

## CursorでPythonを使う設定をする
3. Cursorの「Extensions」で「python」と入力し、「Python extension for Visual Studio Code」をインストールする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637688/e73cfe3a-e385-2c00-5d14-f2f5a26065a5.png)
3. 新しいファイル作成し、動作するか確認する(F5で実行)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637688/d53db22e-8a23-161d-36d2-845bfd1b88b3.png)
動作しない場合、下記からパスの指定ができているか確認する。
「File」＞「Preferences」＞「VS Code Settings」を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637688/fef37a50-2595-86b3-b829-40661448c216.png)
「Python: Default Interpreter Path」と検索し、「python.exe」までのパスを入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637688/d2eab78b-299c-ccc6-dfc0-972d09651573.png)
3. pipが実行できることを確認する
CursorのTerminalで下記を入力する
```sh:commond
pip install numpy
```
※anacondaとpipは共存できないため、anacondaがインストールされている場合、アンインストールする
3. Cursorの「Extensions」から必要なライブラリをインストールする
・Japanese Language Pack
(作成中)
How to Download PUBG Mod APK

PlayerUnknown's Battlegrounds (PUBG) is a widely popular multiplayer battle royale game that has captured the attention of gamers worldwide. Developed by PUBG Corporation, this intense and immersive game drops players onto an island where they must scavenge for weapons, vehicles, and supplies while battling it out to be the last one standing. If you're eager to join the fray and experience the adrenaline rush of PUBG, here's a comprehensive guide on how to download the game on various platforms.
https://stumbleguyapk.com
1. Download PUBG on PC:
Via Steam:
Install Steam: If you don't have Steam installed on your PC, download and install it from the official Steam website (store.steampowered.com).
Search for PUBG: Once Steam is installed, launch the application and use the search bar to find "PlayerUnknown's Battlegrounds."
Purchase or Install: If you haven't already purchased the game, you can buy it through Steam. If you own it, simply click on the game and follow the prompts to install it.
Launch PUBG: Once the installation is complete, launch PUBG from your Steam library and start playing.
2. Download PUBG on Mobile:
For Android:
Visit Google Play Store: Open the Google Play Store app on your Android device.
Search for PUBG: Use the search bar to find "PUBG Mobile."
Install PUBG Mobile: Tap on the game, then tap "Install" to download and install it on your device.
Launch PUBG: Once the installation is complete, tap on the PUBG Mobile icon on your home screen to launch the game.
For iOS (iPhone/iPad):
Visit App Store: Open the App Store on your iPhone or iPad.
Search for PUBG: Use the search tab to find "PUBG Mobile."
Install PUBG Mobile: Tap on the game, then tap "Get" and confirm your download with Face ID, Touch ID, or your Apple ID password.
Launch PUBG: Once the installation is complete, tap on the PUBG Mobile icon on your home screen to launch the game.
3. Download PUBG on Consoles:
For Xbox:
Access Microsoft Store: Navigate to the Microsoft Store on your Xbox console.
Search for PUBG: Use the search function to find "PUBG."
Purchase or Install: If you haven't purchased the game, you'll need to buy it. If you own it, select the game and follow the prompts to install it on your console.
Launch PUBG: Once the installation is complete, launch PUBG from your Xbox dashboard and start playing.
For PlayStation:
Access PlayStation Store: Go to the PlayStation Store on your PS4 or PS5 console.
Search for PUBG: Use the search feature to find "PUBG."
Purchase or Install: If you haven't bought the game, you'll need to make a purchase. If you already own it, select the game and choose to download/install it on your console.
Launch PUBG: After installation, you can launch PUBG from your PlayStation dashboard and dive into the action.
Conclusion:
Downloading PUBG is a straightforward process on various platforms, whether you're playing on PC, mobile, or consoles. Once downloaded, you can join millions of players worldwide in the ultimate battle royale experience. So, gear up, drop into the battlegrounds, and may the odds be ever in your favor!
🔰一ヶ月で作成したWEBアプリのバージョンUP!!　Ver2

[作成したWEBアプリリンク](https://hello-4m00.onrender.com/)
ユーザ作成が面倒な人は、「ユーザ：test,パス:test」でログインできます
それすら面倒な人は、ゲストログインできます
*無料プランのため、初期サイト表示に時間がかかります。

## 目次
1. はじめに
1. 改修・追加
1. 今後

## はじめに
WEBアプリを作成し、Qiitaで公開したところ、多くの人に見ていただいた。そして、アプリを触っていただいた。
その結果、できたらいいなや、直したいなと思い、今回のバージョンアップを考えた。

[最初に公開した記事](https://qiita.com/ssatoshi_117117/items/ec18bcdd039461afae43)

## 改修・追加
1. ゲストログイン
最初にWEBアプリを公開したとき、皆さんが好き勝手に触っていただいた。そこで感じたのが「大喜利の回答をしたい」ということだった。
しかし、設定上、同じユーザーでは回答は一回のみだったのでできなかった人もいたのではないかと思った。そこで、ゲストユーザの思想に至った。

ゲストユーザについては以下

・ユーザ作成・入力を省いてログインできる
＊formでIDとPASSを固定値で入れているだけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781864/479adde9-3091-3b65-dc55-67c1dfab1974.png)

・回答回数は無制限。投票は一回
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781864/29c73a7e-03ca-21b4-3fc8-cbb663333518.png)

・お題登録はできないようにした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781864/393d6365-f396-6049-addc-15712dd7538f.png)


2, 期間の精査

・初期値を入れた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781864/b0a8528c-ace1-440d-60cf-6e8742c98852.png)

・過去日付や、期間が前後しないように
FROM：過去日付NG
TO：過去日付NG、FROMより前NG

3, 細々
・SQL実行時の日時がRenderで設定したシンガポールのものが設定されていた。これ自体はどうしようもなかったので、実行時に日本の時間帯を使うように修正。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781864/fb24878c-dabf-a224-d190-deac3b423c92.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781864/de4adb0b-097c-4434-436e-463f9807f6c5.png)

ファイルとしては以下を修正
```terminal:プロパティファイル

spring.jpa.properties.hibernate.jdbc.time_zone=Asia/Tokyo

```
```sql:SQL

INSERT INTO answer(answer,user_name,time,theme_id)
VALUES (#{answer},#{userName},CURRENT_TIMESTAMP AT TIME ZONE 'Asia/Tokyo',#{themeId});
```

## 今後
これやりたいな～、これできたら便利そう！と考えるのは楽しかった。
今回は、なにも考えていない・・・
一回目の反響を超えるようなことがあれば、Ver3も考えたい。
Linux システム情報表示コマンド （覚書）

# デバイスの確認
### lscpu
CPUアーキテクチャ情報


# トラブル時に有効なコマンド
### top
実行中のシステムをリアルタイム表示

### df
ストレージの使用量を確認
`df -h`

### ncdu
大きなファイルを検索と削除
`ncdu`

### ps
実行中のプロセス一覧を表示
`ps -aux`
`ps -aux | grep postgre`

### free
メモリ容量の表示
`free -h`

# ネットワーク
### ifconfig
ネットワークインターフェース情報表示

### netstat
ネットワーク・サブシステムの関する情報表示
`netstat -i`
`netdata -r`

# システム
### last
ログイン履歴一覧
### lastb
ログインエラー履歴一覧

### watch
コマンドを一定間隔で繰り返す
`watch ls -l`
`watch --differences -n 1 ps -l`
コズムのバックエンド技術にKotlin,Ktorを選んだ理由その①

## はじめに

こんにちは。
株式会社コズムCTO内藤と申します。

バックエンドの技術選定にお悩み中やコズムに興味を持ってくださった開発者の方に向けて、
弊社バックエンド開発におけるメイン言語として Kotlin/Ktor を採用したときの着眼点についてお伝えできればと存じます。

プログラマー三大美徳のひとつ “laziness” にのっとり、Kotlinとは？といった内容は省きます。
きになるかたはぜひオフィシャルサイトをご確認ください。

[Kotlin](https://kotlinlang.org/docs/home.html "Kotlin Docs") / [Ktor](https://ktor.io/ "Ktor")


## 課題感 

まずは弊社の状況とバックエンド開発で抱えている課題感をお伝えできればと存じます。
弊社は創業から1年半ほど、さらには従業員の平均年齢も26歳程の非常に若い会社です。
若さを生かした体力・勢いはありつつも、若さゆえにジュニア〜ミドルクラスの開発者が多く、
それぞれが得意な言語・フレームワークもまちまちです。

幅広い環境に適した人材がいて、プロジェクトに適した言語選択をできることは大変良いことです。
しかし、プロジェクト毎に言語・設計が変わってしまうと初動が遅くなる、人により成果に偏りがでやすいといった課題がありバックエンドの技術を共通化していこうとなりました。

### 選定時の着眼点

選定にあたっての着眼点は次のとおりです。

優先度高
↑

+ 静的型付け/コンパイラ型言語
+ ライブラリが充実している
+ 情報量
+ 開発環境が充実している
+ 利用シーンの広さ

↓
優先度低

### 静的型付け/コンパイラ型言語

何よりも優先したのは静的型付け言語かどうかです。
古くは CGI 時代の perl から昨今の Ruby, Python に至るまで、
バックエンド開発においては動的型付け言語が主流に思えます。

そのためライブラリの充実・開発環境の充実など申し分ないのですが、
中規模・大規模開発でシステム全体を全員が把握できなくなってくると型が定まらないことによる弊害が出てきます。
例えば、ユーザークラスに都道府県プロパティがあったとします。
動的型付け言語の場合、都道府県プロパティが文字列なのか？それとも都道府県番号のような数値なのか実装を見るまでわかりません。静的型付け言語であれば、クラス定義だけ見れば補足資料なく理解できることが増えてきます。

またコンパイラ型言語を選択することで、実行前にある程度動くことが保証されます。
結局 linter や test で担保するから関係ないのでは、
といった議論もあるかもしれませんが責任範囲の話は主題ではないと思うので割愛します。

### ライブラリが充実している

こちらも重要視しました。
そのままですが先人等の残してくれた最強の武器が多いに越したことはありません。

### 情報量

情報量と書きましたが活発度の方が正しいかもしれません。
情報量が多くても、昨今の目まぐるしい進化に対応できないと開発効率は激減します。
そのため、新鮮な情報が多い環境が好ましく思います。

### 開発環境が充実している・利用シーンの広さ

こちらに関しては優先度としては低いですが次のようなことを考えました。

バックエンド開発者の多くが1日の大半をエディター・IDEを利用し過ごしていると思います。
それだけ長く触れるものなので、個人の嗜好を尊重し快適な環境構築ができることが望ましいと思います。 ~~Apexとか方言的な言語だと辛いですよね？~~ 

今回はバックエンド開発を想定した選定ですが、同じ言語でフロントやネイティブでも利用できれば言語知識の再利用性は高まります。参考程度ですが頭の片隅で考えていました。


## 選定結果

上記を踏まえて表題の通り言語は Kotlin、フレームワークは Ktor を選択しました。

### Kotlin

原則静的型付け言語である (dynamic 型もある)
Java の豊富な資源を利用できる
Kotlin の開発元である JetBrains が開発環境も提供している
(ネイティブアプリからサーバーサイドまで幅広い利用シーンがある)

### Ktor

Kotlin と同じ JetBrains が開発しているため、言語・開発環境との親和性が高い
規模問わず利用しやすい
RoRのように制約の多いFWは小規模開発だと機能過多に思えます。昨今流行りの薄いFWのため、小規模の時は小規模なりの実装がしやすく思います。
中規模・大規模の場合、コーディング規約などの作成は必要ですが、柔軟な構造のため会社全体のバックエンド開発者の状態にあわせた最適化がしやすく思います。


## おわりに

以上いかがでしたでしょうか？
参考になれば幸いです。

こちらの詳細についてはまだまだ話したいことは尽きません。
その②ではKtorのディレクトリ構造についてご紹介できればと思います。
【SQL】データベースの作成からデータの検索まで

<br>
こんにちは、Reikaです。<br>私は現在、アプレンティスの5期生として日々勉強に励んでいます。<br>

https://apprentice.jp/lp

アプレンティスの課題として**データベースの作成**に取り組みました。<br>今回はこの経験を通じて学んだことについて、記述していきます。<br>

# 目次
1.データベースの作成
2.テーブルの作成
3.データの登録
4.クエリの作成


## 1.データベースの作成
私は観葉植物が好きなので、植物屋さんのネットショップをイメージしてデータベースの流れを説明します！<br>
早速ですが、データベースの構造は以下の通りです。<br>

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698182/bf3a2ade-603d-97b1-aaf8-caf81c734fd2.png)

ショッピンサイトというのは、スムーズに買い物ができるように、 **必要な情報がいくつか表示されていますよね。** <br>例えば、商品の情報（写真や値段など）や注文個数の選択ボタン、注文者の情報の入力画面や購入履歴の表示など。これらデータがあることによって出品⇆注文が成り立ちます。<br>
その、 **必要なデータの集まっている基地** がデータベースです。<br>
また、データベース関連のコマンドは以下の通りです。<br>


* データベースを作成する
```SQL
CREATE DATABASE greenshop(データベース名);
```
* データベースの一覧を表示する

```SQL
SHOW DATABASES;
```

* 使用するデータベースを指定する

```SQL
USE greenshop(データベース名);
```

* データベースを削除する
```SQL
DROP DATABASE greenshop(データベース名);
```

## 2.テーブルの作成
データベースを作ったら、テーブルを作っていきます。<br>既にデータベースのところでもチラリと出ていますが、テーブルとは **情報が種類ごとに格納される単位**であり、データベース内の情報はテーブルごとに管理されます。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698182/d630f37b-5db2-2094-1a81-60a36ec03c64.png)

さらに分かりやすく、ユーザー管理のテーブルを例に、テーブルの中身を見ていきましょう。<br>

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698182/c3bab7b6-14fc-6286-4e8f-a639a9066ef5.png)


ユーザー管理テーブルとは、注文者の情報の入ったテーブルです。<br>
現在、ユーザーテーブルには**名前とメールアドレス**が入っています。<br>お店側はこの情報をもとに「ご注文ありがとうございます！」とメールの送信ができますね。<br>
また、名前とメールアドレスといった情報の列のことを **カラム** とも呼びます。<br>
データベース関連のコマンドは以下です。<br>

* テーブルを作成する
```SQL
CREATE TABLE users

(id    INTEGER       NOT NULL,

name   VARCHAR(20)  NOT NULL,

e_mail    DATE,

PRIMARY KEY (id));
```

* テーブルを確認する
```SQL
SHOW TABLES;
```

* カラムも全て表示する
```SQL
SHOW COLUMNS FROM users;
```

* カラムを追加する
※もし制約もつけたい場合は型の後に書く

```sql
ALTER TABLE users ADD COLUMN address;
```

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698182/269f0620-7b7e-125f-e7c9-4fe63845ea23.png)

* カラムを削除する

```sql
ALTER TABLE users DROP COLUMN address;
```

* テーブルの削除
```SQL
DROP TABLE users;
```

## 3.データの登録
テーブルが作成されたら、**そのテーブルにデータを登録**します。<br>先ほどの絵の中ではすでにデータは格納されていましたが、更に追加して場合は以下のINSERT構文を使います。

* データを登録する
```SQL
INSERT INTO users(name, e_mail) VALUES(鈴木次郎, suzuki@example.com);
```

* データの削除
※データのみの削除、テーブルは残っている

```sql
DELETE FROM <テーブル名>;
```

## 4.クエリの作成
最後にクエリの作成です。<br>クエリとは、**データを取得・検索するための命令文**です。

* クエリの基本構造
```SQL
SELECT COUNT, SUM, AVG, MIN
FROM <テーブル名>
INNER JOIN <他のテーブル名> ON <結合条件>
WHERE <条件>
GROUP BY <グルーピングする列名>
HAVING <条件>
ORDER BY <並べ替えの列名>
LIMIT <制限数>;

```

* 役割
<dl>
<dt>SELECT</dt>
<dd>データの検索。ここに書いてあるデータが表示される。</dd>
<dt>COUNT,SUM,AVG,MIN</dt>
<dd>集約関数。複数のデータを希望の関数に当てて処理ができる。</dd>
<dt>FROM</dt>
<dd>検索する対象のテーブル</dd>
<dt>INNER JOIN</dt>
<dd>テーブルの結合。FROMで選択したテーブルに内部結合する。</dd>
<dt>ON</dt>
<dd>結合したテーブルの列名を連結。</dd>
<dt>WHERE</dt>
<dd>列の検索。</dd>
<dt>GROUP BY </dt>
<dd>指定した列名で同じデータをまとめる。</dd>
<dt>HAVING</dt>
<dd>グルーピングした結果を絞る。</dd>
<dt>ORDER BY</dt>
<dd>検索表示の並べ替えをする。</dd>
<dt>LIMIT</dt>
<dd>検索表示件数を制限する。</dd>

# まとめ
いかがでしたでしょうか？<br>これらの手順に従うことで、データベースの作成からデータの管理までを行うことができます。<br>（制約やコマンドなどを省略してしまいましたが、データベースの作成から検索までの基本部分をまとめてみました。）<br>最後まで読んでいただき、ありがとうございました！
Pythonのfloat型の算術演算

# `float`型とは

小数点を含む数値のことで、小数点以下が0のみの場合も`float`型に分類される。
例）1.1, 2.0, 0.03,　…

# `float`型の演算

`float`型を含む演算は結果も`float`型になる。

```python
>>> 2 + 1.0  # 加算
3.0

>>> 2 - 1.0  # 減算
1.0

>>> 2 * 1.0  # 乗算
2.0

>>> 2 / 1.0  # 除算
2.0
```

また、演算式中に`int`型しか含まれない場合でも除算の場合は結果は`float`型になる。

```python
>>> 3 / 2
1.5

>>> 3 / 3
1.0  # 割り切れてもfloat型
```

除算結果を小数点以下を切り捨てた`int`型にしたい場合は整数除算(`//`)を用いる

```python
>>> 3 // 3
1
```

整数除算の結果割り切れた場合でも演算式に`float`型を含む場合、出力は`int`型ではなく`float`型になる。

※演算式中のオペランドの中でもっとも広い型に合わせて結果が出力されるため

`int`型 < `float`型 < `complex`型(複素数)

型の広さ…表現可能な数値のバリエーション


```python
>>> 3.0 // 3.0  # 結果は1だがfloat型で出力される
1.0
```

整数除算の結果が負の値になる場合は負の方向に丸められる

```python
>>> -1 // 2  # -0.5を負の方向に丸める
-1

>>> -3 // 2  # -1.5を負の方向に丸める
-2
```

# まとめ

- `float`型とは小数点を含む数値のこと(小数点以下が0のみ場合も)
- `float`型を含む演算は結果も`float`型
- `int`型のみの除算でも結果は`float`型
- 除算結果の小数点以下を切り捨てたい場合は整数除算(`//`)を用いる
- `float`型を含む整数除算の場合、小数点以下は切り捨てられて0になるが結果は`float`型
- 整数除算の結果が負の値になる場合は負の方向に丸められる
mikanosに挑戦中に突然Makefileがおかしくなった件

ここ数か月、仕事の合間を見て少しずつ「ゼロからのOS自作入門」に挑戦。
どうせならすべてを自分で作ってみようと一つずつ、こつこつとやっていると、ある日突然makeをするとエラーが出るようになった。

```
Makefile:2: *** 分離記号を欠いています. 中止.
```

昨日までできていたのに！？なにこのそっけないメッセージは！！と思いながら、解決まで苦労したので、その奮闘過程をお納めください。

# まずは結論から
以下、長々と発見に至った過程を綴りますが、結論は「ゼロからのOS自作入門」に記載されているMakefileの以下の修正すればOKです。

```diff_make:Makefileの修正点（.d 依存ファイルを作るところを修正）
%.o: %.cpp Makefile
	clang++ $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@

.%.d: %.cpp
- 	clang++ $(CPPFLAGS) $(CXXFLAGS) -MM $< > $@
+ 	clang++ $< $(CPPFLAGS) $(CXXFLAGS) -MM -MF $@ 	
	$(eval OBJ = $(<:.cpp=.o))
	sed --in-place 's|$(notdir $(OBJ))|$(OBJ)|' $@

%.o: %.c Makefile
	clang $(CPPFLAGS) $(CFLAGS) -c $< -o $@

.%.d: %.c
-	clang $(CPPFLAGS) $(CFLAGS) -MM $< > $@
+	clang $< $(CPPFLAGS) $(CFLAGS) -MM -MF $@
	$(eval OBJ = $(<:.c=.o))
	sed --in-place 's|$(notdir $(OBJ))|$(OBJ)|' $@
```
なんと、あっけない。。以下は駄文でございます。


# 原因の特定
突然、makeが通らなくなった。分離記号を欠いてます。missing separator. Stop.
シンプルだけど冷たいメッセージね。

気を取り直して、makeによって生成される「*.o」ファイルや「.d」ファイルをすべて手作業で削除してもう一度makeを試した。(kernelフォルダだけでなく、そのサブフォルダのusbフォルダや、さらにそのサブフォルダのusb/xhci、usb/classdriverフォルダの中の「*.o」ファイルや「.d」ファイルも削除しないとやり直せないのでお気をつけあれ)

すると、makeができた！なんだ、一時的なあれか。（←あれの原因はよくわからないけど、再起動すると直る的な・・）

そして、しばらくソースコードをいじってると、**またあのエラーが出てきた！！**

なんで？？makeファイルは全然触ってないのに！ちなみに、**make cleanすらもできない**。だから、また手動で.oや.dを削除すると、**またmakeが通った**。

この時点で一つの仮説にたどり着く（というほど大げさなものでもないが）

Visual Studio Codeでソースコード(Makefileとは全然違うmain.cppとかでも)を編集すると、そのあとからmakeができなくなる。

「Visual Studio Code makefile 分離記号」でググると早速以下のサイトがヒット！
（楽勝解決！）

[VSCodeで作ったMakefileが”分離記号を欠いています”エラーになる](https://www.codelab.jp/blog/?p=3587)

なになに、そうか！makefileの文字コードがVisual Studio CodeによってUTF-8のBOMありになっちゃうんだ！文字コードを正しいものに設定しよう。

・・・・。結論、文字コードを変えても症状は全く変わりませんでした。

# 原因を再特定
おかしい、おかしいとうなりながら、いろいろ見てると、新事実を発見！
Visual Studio Codeで対象のディレクトリを開くと「.d」ファイルが書き換えられとる！！
そもそも、.dファイルは各ソースファイルが依存しているファイルを自動的に特定してmakefileに依存性「DEPENDS」としてお知らせしてもらうために作られるもの。
だから、その中身はこんな感じになっているはず。

```make:main.dの中身
main.o: main.cpp \
    /HOME/osbook/devenv/x86_64-elf/include/c++/v1/cstddef \
    /HOME/osbook/devenv/x86_64-elf/include/c++/v1/__config \

以下省略・・
```
でも、Visual Studio Codeで開いた後はなぜか、.dファイルがこんな感じに変わってしまっている。

```make
  clang
  -MM
  -I/Home/osbook/devenv/x86_64-elf/include/c++/v1/cstddef

以下省略
```

**なんじゃこりゃあ！**
全然違うものに変わっとる。
そりゃ、分離記号も欠けてしまうわ。分離記号がなんなのかわからんが。

## ということで解決を
どうやらVisual Studio Codeを立ち上げてディレクトリを読み込んだ際に、Makefile toolsという拡張機能が動いて、dry-runを行うことが原因っぽい。
dry-runというのは、実際にはmakeはやらない（.oファイルや.dファイルを作らない）けど、とりあえずやった時に出てくるメッセージを見てみるための**お試しコマンド**。

え、.dファイルを作らない（作るコマンドを実行しない）ならいいじゃんと思いきや、以下の部分に罠があった。

```make
clang++ $(CPPFLAGS) $(CXXFLAGS) -MM $< > $@
```

これは、わかりやすく書くとこんな感じの意味をもつ。
(いろんなフラグ系は省略)

```make
clang++ -MM main.cpp > .main.d
```

-MMオプションは**依存関係を調べて標準出力に出力すること**だから、依存関係の情報をそのまま、.main.dファイルに突っ込んでいる。依存ファイルが出来上がって、よいことだ。

でも、dry-runをしてしまうとこれが問題になる。
dry-runでは実際にclang++コマンドを実行しないので、依存ファイルの情報は吐き出されない。じゃあ、何が　.main.dに突っ込まれるかというとコマンドそのもの（この場合、clang++ -MM main.cppが.main.dに突っ込まれる）

おお。そういうことか。

## 今度こそ解決
.main.dファイルにリダイレクトしてしまうことが問題なので、そうではなくて、clang++のコマンドで依存関係をファイルに保存するオプションを使う。
それが **-MF**。

```make
clang++ $< $(CPPFLAGS) $(CXXFLAGS) -MM -MF $@
```

これでOK。ちなみに、-MFオプションの直後に保存するファイル名がこないといけないので、少し並びを変更している。

はぁ、疲れた。
onFieldSubmitted時にテキストをクリアする方法

# 概要
Flutter初心者によるFlutter初心者のための記事になります。
TextFormField使ってonFieldSubmittedを発火させた後に入力した文字消えないの気持ち悪いなと思って調べてみました。

# 実装
TextFormFieldのテキストをクリアするには、TextEditingControllerを使います。

実装方法は下記になります。

```dart
final _editController = TextEditingController();

TextFormField(
    controller: _editController,
    onFieldSubmitted: (text) {
    // 〜〜〜〜〜〜〜
     _editController.clear(); // TextFormFieldのテキストをクリア
    },
),
```

実際の動きはこんな感じになります。
![qiita.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906968/3253bf88-d84d-34a1-a46f-b929d520c6b9.gif)
整角四角形問題

# 整角四角形問題

4点角問題は「ラングレーの問題にトドメをさす！」によれば、

* 整角四角形　31,402問題
* 整角三角形　17,659問題

合計49,061問題ある。

この記事では、整角四角形　31,402問題あることを、数値計算により丸め誤差を無視して確認してみる。

## 整角四角形問題とは

四角形ABCDの ∠ABD = a, ∠CBD = b, ∠ACB = c, ∠ACD = d, ∠ADB = eとすると、 a,b,c,d,eが整数となるものを探す。　
a = d とすると円周角の定理より e = c となり、つまらない例ができるので、　a < d　の場合を考える。

## 数値計算による確認

書籍にある通り、e は　a,b,c,d に関する三角関数と逆三角関数で表せる。
愚直にa,b,c,dに数値代入する数値計算により31,402問題あることを確認する。

```pari
default(realprecision, 100);

S(x) = sin(x / 180 * Pi);
C(x) = cos(x / 180 * Pi);
AT(x) = atan(x) * 180 / Pi;
f(a, b, c, d) = S(b+c+d) * S(a) * S(c);
g(a, b, c, d) = S(b) * S(d-a) + S(b+c+d) * S(a) * C(c);
h(a, b, c, d) = if(g(a, b, c, d)==0, 90, AT(f(a, b, c, d) / g(a, b, c, d)));
cnt = 0;
\\ a<d, a+b+c<180, b+c+d<180
for(a=1, 179, for(b=1, 179-a, for(d=a+1, 179, for(c=1, min(179-a-b, 179-b-d), e=h(a, b, c, d); if(abs(e-round(e))<1e-50;, cnt++)))));
print(cnt);
```

出力結果は次のようになる。(処理時間は25分ほど)

```pari
31402
```
Power Apps でデータの一括変更をする


# はじめに

以前も似たような記事を書きましたが、最近聞かれることが多く、備忘も兼ねて改めて記事を書こうと思います。

# アプローチ

まず、今回は、以下のような問い合わせを管理するアプリにて、ステータスを対応完了に、また、併せて対応完了日を一括で変更するような処理を実装したいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/9eb0741a-9458-c0ea-f0db-58aeb2730b11.png)

いくつかアプローチがあると思います。まずは、以下のように、Gallery1_1.AllItems をベースに、ForAll で処理を繰り返すアプローチがあります。

基本的にすべてのデータを更新する前提であればこれでもいいのですが、今回は、一部のレコードだけが更新対象なので、条件を付けてあげた方がいいですかね。

```
ForAll(
    Gallery1_1.AllItems,
    Patch(
        問い合わせリスト,
        ThisRecord,
        {対応完了日: DatePicker3_1.SelectedDate,
        ステータス:{Value:"完了"}
        }
    )
);
```

```
ForAll(
    Gallery1_1.AllItems,
    If(
        Checkbox1_1.Value,
        Patch(
            問い合わせリスト,
            ThisRecord,
            {
                対応完了日: DatePicker3_1.SelectedDate,
                ステータス: {Value: "完了"}
            }
        ),
        ""
    )
);
```

なお、個人的にちょっとはまってしまったのですが、最初、以下のように　LookUp　を使っていたのですが、エラーは出ないものの、実際にはレコードが上手く更新されませんでした。また、`ID = ThisRecord.ID` と最初記載していたのですが、式としてはエラーがないものの更新時にエラーで失敗しました。そのため、更新対象の行の指定について、LookUp ではなく、`ThisRecord` で指定するよう注意が必要と思います。



```
ForAll(
    Gallery1_1.AllItems,
    Patch(
        問い合わせリスト,
        LookUp(
            問い合わせリスト,
            ID = Value(ThisRecord.ID)
        ),
        {
            対応完了日: DatePicker3_1.SelectedDate,
            ステータス: {Value: "完了"}
        }
    )
);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/f9c6db2f-4bf1-5e4a-671e-c169c8e084dc.png)

また、以下のように、チェックボックスにチェックを入れた際や、カレンダーコントロールの日付を変更した際に、変更を加えたデータだけをコレクションに格納をして一括更新する方法もあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/eed17907-3226-b699-cfae-baaad0eb39a4.png)

```
Collect(
    colFinishedItems,
    ThisItem
);
Patch(
    colFinishedItems,
    LookUp(
        colFinishedItems,
        ID = ThisItem.ID
    ),
    {ステータス: {Value: "完了"}}
);


```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ace07abf-15b7-88fa-a9d0-f84d4a9e826b.png)

```
Patch(
    colFinishedItems,
    LookUp(
        colFinishedItems,
        ID = ThisItem.ID
    ),
    {対応完了日: DatePicker3_1.SelectedDate}
);
```

この場合は、最後に以下のようにして変更をすることが出来ます。"colFinishedItems"は、"問い合わせリスト"をベースにしており、行で一意な `ID` を持っているため、ForAll で式を書かず、以下のような式で、一括で変更することが出来ます。チェックを入れた行だけ更新、こちらでもいいかもしれませんね。

```
Patch(
    問い合わせリスト,
    ShowColumns(
        colFinishedItems,
        ID,
        ステータス,対応完了日
    )
);
Notify(
    "ステータスを一括更新しました。",
    NotificationType.Success
);
Clear(colFinishedItems);

```

# まとめ

今回は、Power Apps でデータの一括変更をする方法について改めて整理してみました。実際の要件を踏まえ、紹介したアプローチを参考にしていただけたら幸いです。
【laravel】required_ifをANDで繋げるような振る舞いがしたい

# 前置き
laravelのバリデーションでは条件を簡便に書くことができる
これ自体は便利なのだが、複雑なことをやろうとすると若干物足りないことがある。

# やりたいこと

0と1の値を持つラジオボタンが2項目ぶん、項目AとBとして用意されており、その直下にテキストエリアが項目Cとして用意されている。

```html
<input name="radioa" value="0" type="radio" checked>
<input name="radioa" value="1" type="radio">

<input name="radiob" value="0" type="radio" checked>
<input name="radiob" value="1" type="radio">

<textarea name="textc"></textarea>
```

このラジオボタンの両方が1の場合のみ、テキストエリアが空欄かどうかのチェックをしたい。

# required_ifを使う（失敗）

このようなとき、laravelのバリデーションの機能を使おうとすると大抵はrequired_ifが思い浮かぶ。
片方のラジオボタンだけ見るのなら、radioaが1のときtextcの内容を確認したいので、

```php
'textc' => 'required_if:radioa,1',
```

とすればいいが、
これに加えてradiobも見たいとなると

```php
'textc' => 'required_if:radioa,1|required_if:radiob,1|emoji',
```

これではradioaかradiobのどちらかが1のときにrequiredのチェックが走ってしまいうまくいかない、つまりOR条件になってしまう。
条件をつなぐパイプ(|)を＆に変えたらどうだろうかなどと考えたがだめだった。（それはそう）

# クロージャで対処（成功）

いろいろ調べたが、required_ifだけではandのような挙動をもたせることはできないようなので、おとなしくクロージャを使うことにした

```php
'textc' => [
    // required_ifではORになり要件を満たせないのでクロージャを使う
    function ($attribute, $value, $fail) use ($request) {
        // 入力データの取得
        $input_data = $request->all();
        // radioaとradiobがどちらも1の場合
        if ($input_data['radioa'] === '1' && $input_data['radiob'] === '1') {
            // textcが空欄か
            if (empty($input_data['textc'])) {
                $fail('エラーメッセージ');
            }
        }
    },
    // 上記以外にも条件があれば続けて書く
    'max:1000',
],
```

FromRequestを継承している場合はuse以降は不要で、`$this->all()`で読み出せる。

こういう特殊な条件はだいたいそのフォーム固有のことが多いのでクロージャでの対応でもまぁ問題ないと思われ。
もしあちこちで使うならばRulesに定義して読み出すほうが簡潔で綺麗。
さまざまな語句を一度に検索したい(grep, zcat, パイプライン)

# grepコマンドでファイル内に含まれる文字列を検索
ファイルの中身をチェックして、探したい文字列が含まれているかどうかを検索するコマンドが`grep`(Global Regular Expression Print)で、以下のように使う。

```
$ grep -r "検索したい文字列" 探したいファイルがあるパス
```

検索したい文字列が`Tanaka Taro`で、探したいファイルがあるパスが`/home/documents`とした場合の使用例は、以下の通りである。
```
$ grep -r "Tanaka Taro" /home/documents
```

`-r`オプションを付けることによって、`/home/documents`のサブディレクトリ内のファイルまで検索される。


今度は、応用の検索パターンを試してみよう。
応用の検索パターンでは、正規表現を使って検索する。
検索したい文字列が、「田中太郎」「たなか太郎」「田中たろう」「たなかたろう」の4パターンだとする。

これをコマンドにすると、このように利用する。
```
$ grep -r -E "(田中|たなか)(太郎|たろう)" /home/documents
```

`-E`オプションを付けることで、検索したい文字列を正規表現を使って検索することができる。

カタカナで「タナカタロウ」まで検索に含める場合は、
```
$ grep -r -E "(田中|たなか|タナカ)(太郎|たろう|タロウ)" /home/documents
```

のように、「|」で分割を増やせば良い。

姓名の間にスペースがあったりなかったりする場合がある。（「田中 太郎」とか）
その時は、`*`や`?`を使うと、検索したい文字列は次のように書ける。
```
(田中|たなか|タナカ) ?(太郎|たろう|タロウ)
(田中|たなか|タナカ) *(太郎|たろう|タロウ)
```

`?`,`*`はそれぞれ次のような意味を持っている。
`?`: 直前の表現が0回か1回登場
`*`: 直前の表現が0回以上連続して登場

つまり、上記の例に当てはめて考えると、`?`を使うと「半角スペースが0回か1回登場」、`*`を使うと「半角スペースが0回以上連続して登場」という意味となり、姓名の間に半角スペースが入っている場合も入っていない場合も検索することができる。


さらに、「Tanaka Taro」「tanaka taro」のように、アルファベット表記の名前も検索することになった場合、この時は、次のような方法で検索することができる。
```
$ grep -r -i -E "(田中|たなか|タナカ) *(太郎|たろう|タロウ)|tanaka +taro" /home/documents
```

`-i`オプションは、大文字と小文字の区別無しで検索する。つまり、「Tanaka Taro」や「tanaka taro」だけではなく、「taNaka tAro」や「TaNaKa tarO」のような文字列もこの検索条件で引っかかるようになる。

また、正規表現の`+`は次のような意味を持っている。
`+`: 直前の表現が1回以上連続して登場

つまり、`tanaka +taro`の場合、「tanaka」と「taro」の間に必ず半角スペースが1つ以上入っている文字列が検索対象となる。すなわち、「tanakataro」のような文字列は、「tanaka」と「taro」の間に半角スペースが入っていないので、検索結果として反映されない。


### まとめ
`grep`コマンドは、次のように使用する。
```
$ grep -r "検索したい文字列" 探したいファイルがあるパス
```

主なオプションには次のようなものがある。
`-r`: 探したいファイルがあるパスとして指定したディレクトリが、さらに子ディレクトリを持っていた場合、子ディレクトリ内のファイルも再帰的に検索対象に含める。
`-i`: 検索したい文字列の大文字と小文字の区別無しで検索する。
`-E`: 正規表現を用いて文字列を検索したい場合に指定する。


## grepに-rオプションを付けない場合
`-r`オプションを付けずに`grep`コマンドを実行すると、「指定したファイルの中から、指定した内容を含む行を探す」という処理となる。

例えば、`/home/user/access.log`から`error`が含まれる行を表示させたい場合は、次のコマンドを実行する。
```
$ grep "error" /home/user/access.log
```

パイプラインで`less`コマンドに出力を渡せば、出力結果が画面外に溢れることも防げる。
```
$ grep "error" /home/user/access.log | less
```

パイプラインの使い方
```
出力を渡す側のコマンド | 出力を受け取る側のコマンド
```

パイプラインは、複数繋げることもできる
```
何かのコマンド | 何かのコマンド2 | 何かのコマンド3
```

`-v`オプションを付けると、指定した文字列を含まない行を出力することができる。例えば、`/home/user/access.log`から`error`が含まれない行を出力するためには、次のコマンドを実行する。
```
$ grep -v "error" /home/user/access.log
```


## 読み込みたいファイルが圧縮ファイルの場合
読み込みたいファイルが`.gz`や`.tgz`などの圧縮ファイルの時は、`zcat`コマンドなどでファイルを展開しながら読み込むことができる。

```
$ zcat /home/user/access.log.gz | grep -v "error" /home/user/access.log | less
```

zcat: `.gz`, `.tgz`
xzcat: `.xz`
unzip -p: `.zip`
GitHub ActionsのReusable workflowsを動作確認する方法

# はじめに
GitHub Actionsでは、[Reusable workflows](https://docs.github.com/en/actions/using-workflows/reusing-workflows)という機能により、worflowを再利用するための仕組みが存在します。DRYにできるためとても便利なのですが、reusableに実装したworkflowを動作確認するにはどうすればいいのでしょうか。まさか、CIだからといって、動作確認せずにマージして、エラーがでないことを祈るというわけにもいきません。

# actでやる場合
通常、workflowの動作確認には、[act](https://github.com/nektos/act)を利用することが多いかと思います。以前はworkflow_callにactは対応していませんでしたが、現在は[対応済み](https://github.com/nektos/act/issues/826)です。
actを使っても良いのですが、workflowによっては、動作させるための前準備が面倒な時もあります。また、ローカル環境でなく本来動かすCI環境で動作確認できると尚嬉しいです。（ローカル環境の場合はコンテナ上で動かすので環境差分は少ないはずですが）

# Reusable workflowsを利用したPRを作って動作確認する
特に難しい話ではありません。利用側で実際にそれを使ったPRをだして、確かめるというだけです。

前提として、Reusable workflowsを管理するGitHubリポジトリは、それを利用する側とは別のGitHubリポジトリで管理されているとします。（同じGitHubリポジトリで管理されているのであれば、単純にそれを使ったPRを出せば良いだけです。）

利用する側の job.uses でそのreusable workflowを指定します。その時、まだマージ前なので、 `＠` の後はブランチ名にします。ここがポイントです。通常、 `@` の後にはタグのバージョンを指定します。以下は具体例です。

```yaml
jobs:
  sample-job:
    uses: organization/repo/.github/workflows/reusable-workflow.yaml@hoge-branch
```

この変更のPRを出して、CIが期待通りに動作しているかをコンソールから確認します。
Wi-Fi7の個人的なまとめ

# 概要
Wi-Fi7 (IEEE802.11be)の個人的な理解のためのまとめ。
Wi-Fi7のポイントは、「より確実で高速な通信」「周波数利用の効率化」である。
Wi-Fi7 (IEEE802.11be)の別名はEHT（Extremely High Throughput)。

# キー要素
* 従来技術の拡張
    * 変調方式4096 QAM対応による高速化（option）
    * 320 MHzの帯域幅対応による大容量化（option）
    * 16×16のMU-MIMOに対応
    * 6GHz対応（Wi-Fi6Eより対応）
    * MRU（option)
    * 1024 Aggregation（option）
    * preamble puncturing(Wi-Fi6ではoption,Wi-Fi7ではmandatory)
    * R-TWT（option）
* 新技術
    * マルチリンク機能(MLO)
    * EPCS Priority Access（option）

## 高速化/大容量化
Wi-Fi6の理論理9.6Gbpsから46Gbpsまで増加。増加の要素は以下の通り。
* 変調方式が1024QAMから4096QAMになることで1シンボルあたりのデータレートが10bitから12bitに増加し、1.2倍。
* 帯域幅は最大160MHzから320MHzへ2倍となっている。ただし6GHz帯での利用可能。
* MU-MIMOの最大は8×8から16×16の2倍。

### MRU(Multi-Resource Unit)
Wi-Fi6までのOFDMAは1 STAに対して1個のRU(Resource Unit)しか割り当てることができなかったが、Wi-Fi7では、1 STAあたり複数のRUの割り当てが可能。

Wi-Fi6では、STA1:52tone RU, STA2:106tone RU, STA3:52tone RUを割り当てると26tone RUが無駄になっていた。
Wi-Fi7では、複数のRUを1つのSTAに割り当て可能であるため、STA1:52tone RU, STA2:106+26tone RU, STA3:52tone RUのように割り当てて有効利用が可能である。

![Untitled Diagram-5-mru.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630941/72cce838-87a5-27f3-eb23-a2f068633507.png)

### 1024 Aggregation
Wi-Fi6では256 Aggregationであったが1024まで拡張。

### preamble puncturing
Wi-Fi6ではoption規格であったが、Wi-Fi7ではmandatory規格となった。

チャネルボンディングにて、ボンディングする帯域の中でいずれかのチャネルが利用不可の場合、そのチャネルを除いた他のチャネル全てを利用する技術。
従来のWi-Fi5や6の場合、例えば4ch分をボンディングした場合、Bchが利用不可の時は、Ach(20MHz)のみまたは、C,Dch（40MHz）で送信していたが、preamble puncturingが有効であれば、A,C,Dの60MHzで送信でき、周囲の電波環境の影響を最小限にすることが可能である。

![pream.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630941/0bc09344-7618-af1a-5ab3-62ef123d950e.png)


## マルチリンク機能(Multi Link Operation)
異なる周波数帯を用いて通信する技術。Wi-Fi6までは、2.4GHzは2.4GHz帯の中で、5GHzは5GHz帯の中でしか通信できなかった。Wi-Fi7では2.4/5/6GHzで同時にリンクを貼り通信する。

1つのデバイスが複数の無線LANチップを搭載している場合に、1対1の通信に複数チップを利用する。複数チップを搭載したデバイスをMLD(Mutli Link Device)と呼ぶ。APはMandatory, STAはoption。

MU-MIMOとMLOの違いは、MU-MIMOはデバイス内の1つの無線LANチップが複数端末と通信する方式であり、MLOはデバイス内の複数チップが1端末と通信する方式である。

![mlo.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630941/24e40093-9566-a87b-b4d7-7aa9369656f2.png)

複数リンクの追加方には、3つの方式がある。

* STR（Simultaneous Transmit and Receive）
ある時刻において、複数リンク間で独立に送信状態と受信状態が混在するモード。11beの性能（高スループット・低遅延・低ジッタ）を活用するために主に用いられるモードと考えられる。

* NSTR（Nonsimultaneous Transmit and Receive）
STRの逆で、ある時刻において複数リンク間で送信状態と受信状態が混在しないようAP側での制御により送信期間を同期させるモード（同時に送信することでリンク間での送信状態と受信状態の混在を避ける）。送信信号に対する回り込みのアイソレーションが十分に確保できない場合に利用される可能性がある。

* EMLSR (Enhanced Multi-Link Single Radio)
複数リンクを実装しリンクを切り替えうるが、フレーム交換を実施する際はある単一のリンクに限定するモード。端末側で用いられることを前提としている。送信信号に対する回り込みのアイソレーションが十分に確保できない場合に利用される可能性がある。

# 参考
https://journal.ntt.co.jp/article/8967

https://www.e-nexty.com/special_pages/articles/column_wifi

https://www.intel.co.jp/content/www/jp/ja/products/docs/wireless/wi-fi-technology-guide.html

https://www.soumu.go.jp/main_content/000885740.pdf

https://webinar.ieice.org/bin/file_link.php?id=394&fname=20230531.pdf&year=2023&code=PNS&sel=&expandable=0

https://www.ruijie.co.jp/blog/the-difference-beween-wifi-7-and-wiifi-6_1704389793163386882.html

https://www.ruijie.co.jp/blog/the-difference-beween-wifi-7-and-wiifi-6-2_1706927018967248897.html
マネジメントを成功させるために！部下の価値観5パターン

# はじめに
後輩と1on1を行うようになって度々感じるのですが、人によって価値観はそれぞれで仕事に求めることは違いますよね。となると一辺倒な1on1を行ったのでは意味がないってことです。
人の価値観、タイプに合わせて適したやり方をしなければ、傾聴や寄り添いなんて刺さることはないんです。

今回は人の価値観(意識構造)は5つあるよーってことを以下書籍でインプットしてきましたので、記事にしました。
参考書籍はこちらです。

https://www.kinokuniya.co.jp/f/dsg-01-9784828424248

# 意識構造タイプ5つ
![意識構造タイプ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065056/1275cf0a-8462-f6dd-2198-5193ebbe23d6.png)

## 他者誘導型
>**自分を中心に考え、自己の利益を追求するタイプです。**

・**報酬や権利にこだわる**
・**ライバルがいれば、あらゆる手段で勝ちに行く**

## 組織貢献型
>**自分だけではなく、「自分対同僚、上司(部下)」などとの関係性を重視するタイプです。**

・**会社のルール、文化を遵守する傾向**
・**やり方や目的を示し、指示してもらわないと動けない**
・**「組織の一員としての居場所」にこだわる**
・**日本のほとんどの企業はこのタイプが半数を占める**

## 組織調整型
>**自分対「同僚、上司(部下)」だけでなく、組織全体との調和も重視するタイプです。**

・**組織貢献型と近く、意識範囲が会社にも向くため、組織調和を重視する**

## 理論運用型
>**自分のやり方でまわり、「同僚、上司(部下)」を動かして成果を上げたいタイプです。**

・**結果重視**
・**自分のやり方で成果を出したいので、トップダウンの指示が苦手**

## 正義調和型
>**自分と同僚、上司(部下)だけでなく、社内に限らず、同じ志を持つ仲間や他者と交流しながら、目的達成のために働きたいタイプです。**

・**「利他」が行動の原動力なため、会社が打ち出した「ミッション」「ビジョン」に共感し、行動に移せる。**

# タイプ別マネジメント

## 他者誘導型には自己利益のために何が必要か想起させよう
・自己利益を追求したいタイプなので、「**こうすれば、昇給に繋がるからやってみよう**」というイメージをさせることがモチベーションに繋がる。
・他者をコントロールしたい価値観があるので、「**目標達成に向けて私に何か手伝えるかな**」と提示することで目標達成に近づく。

## 組織貢献型は貢献を称えよう
・所属する組織の一員であることを認めることが重要。
・「**あなたのおかげでこの案件が上手くいっている**」「**組織運営手伝ってくれていつも助かる！**」など貢献をコミュニケーションに混ぜるとよい。

## 組織調整型には昇進の道すじを明確に示そう
・**組織からの承認**が行動原理であるため、「**どうすれば昇進、昇格できるのか**」を示すことが大事。

## 理論運用型は自由にやらせてから軌道修正しよう。
・他のタイプと異なり、「**承認**」「**賞賛**」は求めてない。
・自身のやりたい方法でやらせることが最重要。
**※結果重視のため、自身のやり方で結果が出ないとモチベーション低下する。上司が適宜、軌道修正をすることで結果を出させる。**

## 正義調和型は世の中への貢献度を示そう
・自身が顧客や社会にどう役に立っているのかに関心がある。
・顧客にとってどのような好影響を与えているのかを示すことでモチベーションに繋がる。
・「**利他の塊**」であるミッション、ビジョンをしっかり伝えよう。


# おわりに
いかかがでしたか。
「あー、自分はこのタイプっぽいなー」と共感できるタイプはありましたかね。
ちなみにタイプが2つ以上離れていると理解できないらしいので、「他者誘導型」からしたら「理論運用型」は理解できないと…
ただ、こういう人もいるんだなと頭に入れておくことで適した対応が出来ますし、無意味な摩擦が起きることも減るでしょう。今後の1on1で活かせたらと思います。

# 参考
成長する組織をつくる１on１マネジメント―社員のホンネを引き出す！ 佐原 資寛【著】

https://www.kinokuniya.co.jp/f/dsg-01-9784828424248
JavaScript Dateオブジェクト　ミリ秒までしか反映されない

## ミリ秒までしか反映されなかった
JavaScriptのDateオブジェクトは、MDN Web Docsに記載されている通り、`YYYY-MM-DD　HH:mm:ss.sss`のミリ秒までしか反映されません。
>メモ: Date コンストラクター（および Date.parse と同等）で日付文字列を解釈する際には、常に入力が ISO 8601 形式 (YYYY-MM-DDTHH:mm<foo>:ss.sssZ) であることを確認してください。

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

## 実際に動かしてみると
```javascript
// 2024-01-01 12:00:00.999
var date1 = new Date("2024-01-01 12:00:00.999");
// 2024-01-01 12:00:00.99955
var date2 = new Date("2024-01-01 12:00:00.99955");

console.log(date1.getTime());
// 結果：1704110400999
console.log(date2.getTime());
// 結果：1704110400999
```

## マイクロ秒を反映させる必要あり
マイクロ秒までの時間（文字列）をDateオブジェクトに設定する場合は、`getTime()`でミリ秒取得後に、マイクロ秒を加算する必要があると思います。
簡単なサイトを作成してアイドルに紹介したお話

# 概要
- 日向坂46(アイドルグループ)のメンバーと会話ができるイベント「ミート＆グリート(通称ミーグリ)」に参加し、簡単なサイトを作成してメンバーに紹介したお話

前回の記事はこちら

https://qiita.com/ohisamaru/items/a31709befcc67a1788a7

# 作成したサイト
https://hinatafes-ideamap.netlify.app/
※予告なしに閉鎖する場合があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782193/ce6ad9a4-da00-9fd6-2709-cd5f675eb4bb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782193/235b78de-93c5-f037-649c-0e1b91e5f0b2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782193/90650355-90f9-28e5-c695-48a2ceaa9bbd.png)

### 作成経緯と目的
「日向坂で会いましょう」というバラエティ番組でメンバーが「フェスを開催したい」とプレゼンしたことが発端
→ プレゼンを聞いてワクワクしたので、このワクワクを何かしらの形に残して共有したい
→ 妄想を具現化して4月のミーグリで見せよう！

# サイトの概要
- フェス開催に向けて企画したアイデアをマッピングして一覧できる
- アイデアに対して「実現可能性」「インパクト」という軸でそれぞれ0～10段階の評価をつける
- マッピングされたバブル(丸円)を押下すると別画面が表示され、アイデアの詳細を閲覧できる
- 画像コンテンツはお絵描きアプリProcreateで作成
- デバイスはiPhoneとiPad対応(配信でメンバーが使用しているため)

### 使用技術
- TypeScript
- React
- ChakraUI
- Docker
- react-chartjs-2
- Netlify


### 所要時間：約20時間
- 設計/調査/実装/デプロイ：約10時間
- コンテンツ作成：約10時間

### 費用：約7,000円
- 印刷代：150円
コンビニで50円×3枚のフルカラー印刷をしました。

<br>

- ミーグリ代：7,200円(サイトの紹介に使用した分のみ)
メンバーと会話できる時間はCDの購入数に応じます。会話時間は約10秒/枚でCD価格は1,200円/枚です。今回紹介に要した分は6枚。

# スケジュール
### 2024/4/22 なんちゃってプロジェクト稼働
- 作りたいものを決める
- ざっくりとした画面イメージを作る

### 2024/4/23
- タイトル画面を実装
- react-chartjs-2を使ってマップ画面を実装
- マップ画面でバブル(丸円)を押下するとモーダルが表示されるように実装

### 2024/4/24
- デプロイの検証
- レイアウトの確認

### 2024/4/25～26
- モーダルで表示するコンテンツの作成、配置
- デプロイ
- レイアウトの確認

### 2024/4/29 
- メンバーに紹介

という感じでした。平日に3~4時間かけて完成させました。


# 所感(良かった点/反省点)
 ### 良かった点
- 実装より企画の方に時間を費やすことができた
- 短い期間でサイトの公開をすることができた
- マッピングのライブラリやデプロイなど、新しいことを学べた
- メンバーが興味をもってくれた

 ### 反省点
- PC/タブレット/スマホのレスポンシブ対応にしたかった  
- ブラウザのタブ名を変更することを忘れていた
- コンテンツの量をもっと増やしたかった
- モーダルのレイアウトを調整したかたった
- グラフの説明をもっとわかりやすくしたかった

# 最後に
今回もミーグリの数十秒のために何十時間もかけて準備をしましたが、当日まで充実した日々を過ごすことができました。反省点は次に生かしていきます。
LaraDock + wkhtmltopdf M1 Mac

## wkhtmltopdfを使いたいのだ！

https://laradock.io/documentation/#install-wkhtmltopdf

どうやらLaraDockの `.env` の `ほにゃらら_WKHTMLTOPDF` を `true` にすればいいみたい。

```:.env
PHP_FPM_INSTALL_WKHTMLTOPDF=true
WORKSPACE_INSTALL_WKHTMLTOPDF=true
```

いざ、コマンド。

```
docker-compose up -d nginx mysql workspace
```

↓

```
#0 7.770 Preparing to unpack wkhtmltox_0.12.6-1.stretch_arm64.deb ...
#0 7.772 Unpacking wkhtmltox (1:0.12.6-1.stretch) ...
#0 9.386 dpkg: dependency problems prevent configuration of wkhtmltox:
#0 9.386  wkhtmltox depends on libssl1.1; however:
#0 9.386   Package libssl1.1 is not installed.
#0 9.386
#0 9.386 dpkg: error processing package wkhtmltox (--install):
#0 9.386  dependency problems - leaving unconfigured
#0 9.391 Errors were encountered while processing:
#0 9.391  wkhtmltox
------
failed to solve: executor failed running [/bin/sh -c if [ ${INSTALL_WKHTMLTOPDF} = true ]; then     ARCH=$(arch | sed s/aarch64/arm64/ | sed s/x86_64/amd64/)     && apt-get install -yqq       libxrender1       libfontconfig1       libx11-dev       libjpeg62       libxtst6       fontconfig       libjpeg62-turbo       xfonts-base       xfonts-75dpi       wget     && wget "https://github.com/wkhtmltopdf/packaging/releases/download/${WKHTMLTOPDF_VERSION}/wkhtmltox_0.12.6-1.stretch_${ARCH}.deb"     && dpkg -i "wkhtmltox_${WKHTMLTOPDF_VERSION}.stretch_${ARCH}.deb"     && apt -f install ;fi]: exit code: 1
```

libssl1.1がないって怒られた。

## 解決

`php-fpm > Dockerfile` のwkhtmltopdfの部分に `libssl1.1` を追記。

```:php-fpm > Dockerfile
#####################################
# wkhtmltopdf:
#####################################

USER root

ARG INSTALL_WKHTMLTOPDF=false
ARG WKHTMLTOPDF_VERSION=0.12.6-1

RUN if [ ${INSTALL_WKHTMLTOPDF} = true ]; then \
    ARCH=$(arch | sed s/aarch64/arm64/ | sed s/x86_64/amd64/) \
    && apt-get install -yqq \
      libxrender1 \
      libfontconfig1 \
      libx11-dev \
      libjpeg62 \
      libxtst6 \
      fontconfig \
      libjpeg62-turbo \
      xfonts-base \
      xfonts-75dpi \
      wget \
    && wget "http://ftp.jp.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.1w-0+deb11u1_arm64.deb" \
    && dpkg -i "libssl1.1_1.1.1w-0+deb11u1_arm64.deb" \
    && wget "https://github.com/wkhtmltopdf/packaging/releases/download/${WKHTMLTOPDF_VERSION}/wkhtmltox_0.12.6-1.stretch_${ARCH}.deb" \
    && dpkg -i "wkhtmltox_${WKHTMLTOPDF_VERSION}.stretch_${ARCH}.deb" \
    && apt -f install \
;fi
```

追加したのは↓の2行ね。

```
&& wget "http://ftp.jp.debian.org/debian/pool/main/o/openssl/libssl1.1_1.1.1w-0+deb11u1_arm64.deb" \
&& dpkg -i "libssl1.1_1.1.1w-0+deb11u1_arm64.deb" \
```

↓ここからlibssl1.1を直接wget&dpkgてことよ。

https://packages.debian.org/bullseye/arm64/libssl1.1/download


Laravelのcomposerで入れてもできなくて:sob:
CPUのアーキテクチャうんぬんで:sob:
apt install しようとしても、libssl1.1ないって怒られるし:sob:
ここに至るまでとても遠回りした、、、すっごい悩んだ、、、
同じことで悩んでいる方の参考になれば幸いです:blush:
18世紀のカムチャッカにおける千島アイヌ語の数詞

『Сравнительный Словарь всѣхъ языковъ и нарѣчiй』(ч. [1](https://www.google.co.jp/books/edition/_/RaMOAAAAQAAJ). 1790年, ч. [2](https://www.google.co.jp/books/edition/_/X6MOAAAAQAAJ). [3](https://www.google.co.jp/books/edition/_/hKMOAAAAQAAJ). [4](https://www.google.co.jp/books/edition/_/u6MOAAAAQAAJ). 1791年)で「По Курильски на Камчаткѣ.」とされている単語を、私(安岡孝一)の眼につく限り抜き出してみた。

> Синепь | *Одинь* | ―  Курильски на Камчаᲅкѣ. (ч.4 с.59)
> Тупь | *Два* | ―  Курильски на Камчаᲅкѣ. (ч.4 с.259)
> Репь | *Три* | ―  Курильски на Камчаᲅкѣ. (ч.3 с.495)
> Инепь | *Четыре* | ―  Курильски на рѣкѣ Камчаᲅкѣ. (ч.2 с.231)
> Азикь | *Пять* | ―  Курильски на Камчаᲅкѣ. (ч.1 с.30)
> Ивань | *Шесть* | ―  Курильски на Камчаᲅкѣ. (ч.2 с.200)
> Арвамь | *Семь* | ―  Курильски на Камчаᲅкѣ. (ч.1 с.98)
> Тубись | *Восемь* | ―  Курильски на Камчаᲅкѣ. (ч.4 с.247)
> Синепись | *Девять* | ―  Курильски на Камчаᲅкѣ. (ч.4 с.59)
> Уупись | *Десять* | ―  Курильски на Камчаᲅкѣ. (ч.4 с.346)
> Уаннуампе | *Сто* | ―  Курильски на Камчаᲅкѣ. (ч.4 с.291)
> Уаномь-неу-ампе | *Тысяча* | ―  Курильски на Камчаᲅкѣ. (ч.4 с.291)

全てアイヌ語の数詞で、ただし100と1000は十進数ぽい。ということは、旧版П. С. Палласъ『Сравнительный Словарь всѣхъ языковъ и нарѣчiй』(ч. [1](https://www.google.co.jp/books/edition/_/mdwk3dcupjYC). 1787年, ч. [2](https://www.google.co.jp/books/edition/_/ydf-zT3GLLcC). 1789年)の数詞表(ч.2 с.486-487)だけが再掲されているわけだ。この数詞表の元ネタの一つは、私の見たところ、Степаномъ Крашенинниковымъ『Описаніе земли Камчатки』(т. [1](https://www.google.co.jp/books/edition/_/D4ZdAAAAcAAJ). [2](https://www.google.co.jp/books/edition/_/qRpPAAAAcAAJ). 1755年)の[「счеᲅъ ихъ」(т.2 с.187)](https://www.google.co.jp/books/edition/_/qRpPAAAAcAAJ?gbpv=1&pg=PA187)なのだが、そちらは参照しなおさなかったということだろう。
線形代数の学習備忘録（part2）

## はじめに
線形代数を学び始めたので、備忘録として簡単に定義や定理を自分の中で理解しやすいようにまとめてみました。

## 計量ベクトル空間

- **内積**
  - VをR上のベクトル空間とした時、Vの任意の2つのベクトルv、wに対して実数 (v, w) が1つ決まる。これは直積 V×V から R への写像とみなすことができる

- **計量ベクトル空間**
  - 内積はベクトル空間の規定の取り方に依存する。つまり、内積はベクトル空間に存在しているわけではなく、付与されたものである。内積が定義される空間を計量ベクトル空間という

- **エルミート内積**
  - 複素数を含む場合の内積のこと

**一言メモ**
- 内積が実数が1つ決まるという点が重要だと感じている

## 正規直交基底

- **正規直交基底**
  - 計量ベクトル空間において、各基底が直交しておりノルムが1のとき、これらを正規直交基底という

- **グラム・シュミットの直交化**
  - 計量ベクトル空間で与えられた基底を正規直交基底に変換するための手順

**一言メモ**
- 正規直交基底の効果がまだ十分に理解できていない。今後の学習に期待

## 直交変換（ユニタリ変換）

- **直交変換（ユニタリ変換）**
  - VをK上の計量ベクトル空間としたとき、その内積（エルミート内積を含む）をVの1次変換で普遍に保つ行列。任意のベクトルv、wについて (f(v), f(w)) = (u, w) のとき、fを直交変換（ユニタリ変換）という

- **直交行列（ユニタリ行列）**
  - n次正方行列Aが \(A^T = A^{-1}\) を満たす時、Aを直交行列（ユニタリ行列）という

**一言メモ**
- 内積を保ったまま写像する行列が直交行列