OmniAICreator/Qiita-1.07M huggingface dataset:
WidgetConfigurationプロトコルのメソッド

# WidgetConfigurationプロトコルが持つメソッドについて

## WidgetConfigurationとは
ウィジェットの設定を行うためのメソッドをまとめたプロトコル

## コード
```swift
struct TestWidget: Widget {
    let kind: String = "PreNotToDoWidget"

    var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind, provider: Provider()) { entry in
            ーーー 省略 ーーー
        }
        .configurationDisplayName("configurationDisplayName")
        .description("description")
        .supportedFamilies([.systemSmall, .systemMedium])
    }
}
```
### configurationDisplayName
ユーザーがホーム画面からウィジェットを追加・編集するときに表示される名前
### desciption
ユーザーがウィジェットを追加・編集するときに、ウィジェットに表示される説明

<img width=300 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774264/a7455dc4-acf6-1d47-0ce3-c9fa998fce26.png">

### supportedFamilies
ウィジェットがサポートするサイズを設定する
<img width=300 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774264/a0f02d9f-4a59-3489-1c02-76a423c839a8.png">

### disfavoredLocations
第一引数に指定した箇所での第二引数で指定した形式のウィジェットサイズを追加できなくする
以下の例では、ホーム画面での最小サイズのウィジェットの表示を禁止する。
```swift
.disfavoredLocations([.homeScreen], for: [.systemSmall])
```
第一引数は以下の４つの内から選択する。複数選択可。
* ロック画面
* ホーム画面
* スタンドバイ画面(iOS17からの新機能)
* Macに追加したiPhoneウィジェット

## 参考文献
[https://developer.apple.com/documentation/swiftui/widgetconfiguration]()
テストコード　～Fakerは使うべきなのか～

# はじめに
プログラミングを勉強して2か月半ほどです。
プログラミングスクールを卒業し、現在就職活動をしています。

就職活動と学習を進める難しさを日々感じていますが、エンジニアとして成長していくためにもコツコツと頑張っています。
その学習の中でもアウトプットの重要性を再確認したので、Qiitaへの投稿で学習した内容を言語化できるように取り組んでいます。

今回は、今までの投稿とは変わって、テストコードの考察をしていきたいと思います。
※考察というよりは、自分の頭の中の整理といった感じです。
　この投稿を書きながら整理していくような感覚で書いています笑

なので、いつもの投稿のように技術的にためになる内容ではありませんが、お付き合いください。
そして、みなさんの意見も聞けると嬉しいです。

それでは、本題に入ります！

:::note warn
注意
今回は考察なので詳細な説明は省略しています。
:::

# Let's start!!!

## テストコード

「テストコード」とは、簡単に説明すると、作成したアプリケーションが想定した挙動になっているのかを自動で確認するためのものです。

確認する際には、正常系と異常系の２種類の方法で確認します。（他にもあります）
※正常系：ユーザーが開発者の想定通りの操作をした時のアプリの挙動を確認
※異常系：ユーザーが開発者の想定外の操作をした時のアプリの挙動を確認

## FactorybotとFaker
テストコードを効率的に記述するために使用するのが`Factorybot`です。

※こんな感じでユーザーが入力する内容を記述します。

```spec/factories/users.rb
FactoryBot.define do
  factory :user do
    nickname              {'qiita'}
    email                 {'qiita@example'}
    password              {'000000'}
    password_confirmation {password}
  end
end
```

そして、Factorybotで生成する内容をランダムにするために使用するのが`Faker`です。

※先ほどの内容をFakerで記述した例です。

```spec/factories/users.rb
FactoryBot.define do
  factory :user do
    nickname              {Faker::Name.initials(number: 2)}
    email                 {Faker::Internet.email}
    password              {Faker::Internet.password(min_length: 6)}
    password_confirmation {password}
  end
end
```

## 考察
ここまで、テストコードとFakerについて簡単に説明をしました。
ここからは、本題のテストコードについての考察をしていきます。

私は、スクールでFakerを学習した時にテストコードはFakerで記述するものだと思っていました。
その理由は、Fakerを使うことで実際にユーザーが入力するようなランダムな値や文字を生成してくれるからです。
Fakerを使用せずにテストコードを記述すると１つの値や文字でしかテストができないので本当のテストとは言えないと考えました。
しかし、テストコードはFakerを使用せずともできるということが事実です。

そこで、私はどういった時にFakerが必要なのかを考えてみました。
その中で、初めに思いついたのが一意性制約のあるものです。
※一意性制約とは、設定したカラムに同じ値を設定できなくする制約のことです。

一意性制約のバリデーションをかける代表例として、メールアドレスがあります。
このような一意性制約のあるものに対してFakerを使うことで、一意性制約のバリデーションに引っかからずに済みます。

つまり、一意性制約をかけているものに対してはマストでFakerを使用する必要がありそうです。


# 終わりに
Fakerの使い方についてあまり理解できずにスクールを卒業しましたが、今回この投稿を書いていく中で何となくわかった気がします。
私は、スクールのカリキュラムのテストコードを一生懸命Fakerを使って書いていました笑

これから、学習を進めていく中でもっと理解を深められたらいいなと思います。

今回は、初めてこのような形の投稿をしてみましたが、頭の中が整理できたのでとても良かったです。
こらからも、Qiitaを活用して学習した内容の整理やアウトプットをしていきたいと思います！

最後まで読んでいただきありがとうございました！！！
[OutSystems]ODC Associate Developerのサンプル問題について解説 3/3(#11-#15)

ODC Associate DeveloperはODC向けのエントリレベルの認定試験。
2023/10時点では、ODC向けの認定はこれだけ。

試験情報のPDFと一緒にダウンロードできるサンプル問題を解説する。
全部で15問で、この記事では11問目-15問目が対象。

他の問題については以下を参照
[ODC Associate Developerのサンプル問題について解説 1/3(#1-#5)](https://qiita.com/jyunji_watanabe/items/49792887f8d754dcd341)
[ODC Associate Developerのサンプル問題について解説 2/3(#6-#10)](https://qiita.com/jyunji_watanabe/items/5b0ea065e0f4dfa6c57d)

サンプル問題は、
https://www.outsystems.com/learn/certifications/
の、「Associate Developer (ODC) 」項目のリンク「Exam Details」でダウンロードできる資料から。「Sample Exam」がついている方のファイルが該当する。
ここでは2023/10にダウンロードしてきたファイルを使って解説していく。
サンプル問題は英語しかなかったので、この解説は英語版を見ながら書いている。

各問題のタイトルは、Details Sheet日本語版のトピック名で、問題に対応していそうなものを選んでいる。

# 11 画面のライフサイクル
Screenが持つライフサイクルイベントの一つであるOn Initializeの用途についての問題。
ライフサイクルイベントについては、[画面とブロックのライフサイクルイベント](https://success.outsystems.com/ja-jp/documentation/outsystems_developer_cloud/building_apps/user_interface/screen_and_block_lifecycle_events/)の図とその説明を見ておくとよい。

On Initializeについては
> ユーザーの画面へのアクセス権限を確認した後、画面にアクセスしてデータを取得する前に発生します。 ブロックの場合は、画面移動の後に発生します。 **デフォルトデータを設定することにより、画面またはブロックを初期化するために使用できます。**

と解説されている。強調した部分が回答に関連する。
ScreenのLocal Variableにデフォルト値を設定するとしている選択肢Dが正解。

# 12 画面でのデータ取得
GetCustomerById Aggregateは名前からして、Identifierを使って検索する。
よって最大で1件しか取得しないが、そういうときであっても、AggregateのOutputはList型。
このList型にアクセスするときには、「\<Aggregate名\>.List」を利用する。

よって選択肢B (GetCustomerById.List.Customer.Name）かC（GetCustomerById.List.Current.Customer.Name）に絞られる。

最大1件しか返さないAggregateなので、Listの先頭位置に求める値が含まれる。
Aggregate実行直後はList.Currentが先頭位置を指しているので選択肢Cが正解。

# 13 エンティティと静的エンティティ
Static Entityについては、OutSystems11とほぼ同じ。

選択肢を見ていく。
A: ×　Static EntityのRecordは設計時にのみ変更可能
B: 〇　Recordを変更（ここでは削除）する場合は設計時にのみ可能（要するにPublishしないと変更できない）
C: ×　Static EntityのIdを他のEntityから参照することは可能
D: ×　Static Entityの各属性は作成時にデフォルトで作られるだけで変更は可能

よってBが正解。

余談になるが、[Apps in OutSystems Developer Cloud](https://learn.outsystems.com/training/journeys/from-o11-to-odc-569/apps-in-outsystems-developer-cloud/odc/261)という動画で言及があるが、Static Entityは

- Appで定義された場合：O11の時と同じくデータベースのテーブルにマッピングされる
- Libraryで定義された場合：テーブルにマッピングされない

という点でO11のときと違いがある。

# 14 ロジックフローと例外処理処
フローは以下の通り流れるはず。

1. (SaveOnClick) If (Form1.Valid)
1. (SaveOnClick) Project_CreateOrUpdate Actionの呼び出し
1. (Project_CreateOrUpdate) If (CheckManagerRole) : ここで、ユーザーがManager Roleを持っていないことから、Function CheckManagerRoleがFalseを返す
1. (Project_CreateOrUpdate) Raise Exception (Not Manager)
1. (Project_CreateOrUpdate) Exception Handler (AllExceptions) 
1. (Project_CreateOrUpdate) Assign (Message = AllException.ExceptionMessage)
1. (SaveOnClick) If (Project_CreateOrUpdate.Success?) : 問題文等に明記はないが、Server Action内で正常終了パス　または　Exception Handlerのパスで編集したOutput Parameterの値で分岐しているようなので、例外のパスを通っている今回のロジックではSuccess? の条件に対してFalseであるはず
1. (SaveOnClick) Message Type=Error

というわけで、エラー発生個所（Server Actionの最初のIf）に最も近く、Not ManagerにマッチするAllExceptionsのハンドラーに進むとしている選択肢Cが正解。

# 15 ブロックとイベント
BlockがIs Mandatory=NoのEventを公開している。

このとき、Blockを配置した画面では、そのEventを処理するClient Actionを書くこともできるし、書かないでいることもできる（Is Mandatry=Noであるため。これがYesであればハンドラーを書かないとエラーになりPublishできない）。

BlockのEventは、「配置先」に対し、特定の事象が発生したことを知らせるためのもの。

よって、選択肢Bが正解。
【Android】WindowManagerで出来る使えそうな事【Kotlin】

# はじめに
前回　**WindowManager**に関連した記事を書いて、その時もう少し調べてみようと思t他ので
今回はWindowManagerについて使えそうなものをピックアップして記事に残します！

 # 画面のタッチイベント関連
画面のタッチイベントを受けらない（無効化）
```
window.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
```
画面のタッチイベントを受けらない状態を解除
```
window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
```
# setSoftInputModeでソフトキーボードの制御
ソフトキーボードを常に隠す
```
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)
```
ソフトキーボードを常に表示
```
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
```

適切なタイミングで表示

```
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
```
適切なタイミングで隠す
```
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN)
```


# 参考
https://developer.android.com/reference/android/view/WindowManager.LayoutParams
Docker MiniO内バケット作成のshellを更新し、バケットを再作成する方法

## 概要

- MiniO内のバケット作成をdocker-compose.yml内に記載したshellで行っているとき、shellを更新し、作成されるバケットの情報を変更したときに、MiniO内に反映する方法を簡単にまとめる。

# 注意

- 本方法を実施するとローカルのMiniOのデータはすべて一旦削除されるので注意する。

# 方法

1. MiniOのデータ永続化フォルダを探す。筆者は下記の様にdocker-compose.ymlに記載されているので/minio/dataだった。

    ```docker-compose.yml
    minio:
        build:
          context: ./.docker/minio
          dockerfile: Dockerfile
        volumes:
          - "./minio/data:/data:delegated"
    ```

1. 下記コマンドを実行してコンテナを落とす。

    ```
    docker-compose down
    ```

1. 下記コマンドを実行して永続化データを削除する。（パスは筆者の環境の場合）

    ```
    rm -rf ./minio/data/*
    ```

1. バケット作成shellを変更する。
1. 下記コマンドを実行する。

    ```
    docker-compose up --build
    ```

1. ここまでで意図しない挙動が出る場合は下記の方法でログを確認する。

https://qiita.com/miriwo/items/3b002304c2e26345eb04
Docker ターミナルでコンテナ起動時のログを確認する方法

## 概要

- docker-compose.ymlで管理されたDocker環境にて`docker-compose up --build`を実行したときのログをターミナル上で確認する方法をまとめる。

## 方法

- 下記コマンドを実行してログを出力する。（サービス名は`web`とか`db`のように記載するdocker-compose.ymlで定義している値）

    ```
    docker-compose logs サービス名
    ```
UbuntuをAD参加させる

## 前提条件
- ActiveDirectoryが構築されていること。
- ActiveDirectoryサーバへドメイン参加させることができる資格情報を持っていること。
- ドメインコントローラが権威DNSサーバとして機能していること。
- 既にUbuntuサーバが構築されていること。
- システム時刻が正確に同期していること。
- 本記事で使用するドメインは「rat-example.jp」とします。

## ソフトウェアのインストール
必要なパッケージをインストールします。
- sssd-ad
- sssd-tools
- realmd
- adcli

```shell
#コマンド
sudo apt install sssd-ad sssd-tools realmd adcli
```

## ドメインに参加する
realmパッケージのコマンドを使用してドメインに参加し、sssd(System Security Services Daemon)構成を作成します。
ドメインがDNS経由で検出可能であることを確認します。

```
$ sudo realm -v discover rat-example.jp
 * Resolving: _ldap._tcp.adsv101v.rat-example.jp
 * Resolving: adsv101v.rat-example.jp
 * Performing LDAP DSE lookup on: 172.16.1.70
 * Successfully discovered: rat-example.jp
rat-network.home
  type: kerberos
  realm-name: RAT-EXAMPLE.JP
  domain-name: rat-example.jp
  configured: no
  server-software: active-directory
  client-software: sssd
  required-package: sssd-tools
  required-package: sssd
  required-package: libnss-sss
  required-package: libpam-sss
  required-package: adcli
  required-package: samba-common-bin
```
ドメインが検出でき、IPアドレスも確認できました。


次にドメインに参加します。
```
$ sudo realm join rat-example.jp
Password for Administrator
```
:::note info
`-v`オプション
何をしていたのかプロセスを確認したい場合は`-v`オプションを付けてください。
:::
:::note info
`-U`オプション
デフォルトでrealmはドメインの管理者アカウント(Administrator)を使用してドメイン参加を求めてきますが、別のアカウントを使用する場合は、`-U`オプションを利用してください。
:::


## SSSDの構成
SSSDの設定情報を確認します。
`/etc/sssd/sssd.conf`
```
[sssd]
domains = rat-example.jp
config_file_version = 2
services = nss, pam

[domain/rat-example.jp]
default_shell = /bin/bash
krb5_store_password_if_offline = True
cache_credentials = True
krb5_realm = RAT-EXAMPLE.JP
realmd_tags = manages-system joined-with-adcli 
id_provider = ad
fallback_homedir = /home/%u@%d
ad_domain = ad1.example.com
use_fully_qualified_names = True
ldap_id_mapping = True
access_provider = ad
```

:::note info
- **cache_credentials**：ADサーバーにアクセスが出来ない場合でもログインが可能になります。
- **use_fully_qualified_names**：ユーザーはログインするときuser@domainの形式になります。正直入力が面倒なのでこれはFalseにすることをお勧めします。ただし、他のドメインがADフォレストに参加しないことが確実な場合のみ設定してください。
:::

## ホームディレクトリの自動作成設定
ユーザーがログインした時に自動でホームディレクトリを作成するようにします。
`sudo pam-auth-update --enable mkhomedir`

## ADユーザーに関する情報の取得
ADユーザーに関する情報を取得することが出来ます。
`getent passwd user@example.com`

## ADユーザーでログイン
最後にADユーザーでログインしてみます。

## 参考資料
基本的に公式ドキュメントを確認して作成しています。

https://ubuntu.com/server/docs/service-sssd-ad
あなたの知らない(かもしれない)numpyライフハックの世界

# はじめに
全世界80億のnumpyユーザーの皆さんこんにちは。この記事ではnumpyを扱い始めたばかり、もしくは今までなんとなくnumpyを使い続けてきた人向けにnumpyの痒い所に手が届く機能をご紹介します。

# 単位行列

```py
M = np.eye(3) # 3 x 3の単位行列を生成
print(M)
```

```terminal:実行結果
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
```

# 対角要素の取得

```py
M = np.arange(9).reshape(3, 3)
print(M)
M = np.diag(M)
print(M)
```

```terminal:実行結果
[[0 1 2]
 [3 4 5]
 [6 7 8]]
[0 4 8]
```

# ゼロ以下の要素をすべて0にする

```py
M = np.arange(-4, 4)
print(M)
M[M < 0] = 0 # 0以下の要素を0に
print(M)
```

```terminal:実行結果
[-4 -3 -2 -1  0  1  2  3]
[0 0 0 0 0 1 2 3]
```

# ゼロでない要素のインデックスの取得

```py
M = np.arange(9)
print(M)
M = np.nonzero(M) # ゼロでない要素のインデックスのリストを作成
print(M)
```

```terminal:実行結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
(array([1, 2, 3, 4, 5, 6, 7, 8], dtype=int64),)
```

# 条件に合致する要素のインデックスを取得

```py
M = np.arange(-4, 4)
print(M)
M = np.where(M < 0) # 0未満の要素のインデックスを取得
print(M)
```

```terminal:実行結果
[-4 -3 -2 -1  0  1  2  3]
(array([0, 1, 2, 3], dtype=int64),)
```

# 配列の累積和を取得

```py
M = np.arange(9)
print(M)
M = np.cumsum(M)
print(M)
```

```terminal:実行結果
[0 1 2 3 4 5 6 7 8]
[ 0  1  3  6 10 15 21 28 36]
```

# 既存の配列の周囲を任意の値で埋める

```py
M = np.arange(9).reshape(3, 3)
print(M)
M = np.pad(M, pad_width=1, mode='constant', constant_values=-1) # 配列Mの周囲1マスを-1で埋める
print(M)
```

```terminal:実行結果
[[0 1 2]
 [3 4 5]
 [6 7 8]]
[[-1 -1 -1 -1 -1]
 [-1  0  1  2 -1]
 [-1  3  4  5 -1]
 [-1  6  7  8 -1]
 [-1 -1 -1 -1 -1]]
```

# 配列の要素を一定の範囲に収める

```py
M = np.arange(9)
print(M)
M = np.clip(M, 2, 5) # 要素を2から5の範囲に収める
print(M)
```

```terminal:実行結果
[0 1 2 3 4 5 6 7 8]
[2 2 2 3 4 5 5 5 5]
```

# 参考記事
・[100 Numpy Exercises](https://github.com/rougier/numpy-100)
・[NumPy日本語公式サイト](https://numpy.org/ja/)
Wails failed to find Vite server URL

`wails dev`を実行した時、時々
  ERROR   failed to find Vite server UR
のエラーが発生しました。
```
cd frontend
npm run vite
```
>npm ERR! Missing script: "vite"
npm ERR! 
npm ERR! To see a list of scripts, run:
npm ERR!   npm run

ようなエラーメッセージが出ていました。npmが何か不具合があるそうです。
pnpmを利用しましょう。
wails.jsonで
`"frontend:dev:watcher": "npm run dev"` -> 
"frontend:dev:watcher": "pnpm dev"

もう一度wails実行して解決しました。
未経験エンジニアのエラー奮闘記　

　　　[PHP，MySQL，ERROR] (1)

Fatal error: Uncaught Error: Call to undefined function mysqli_conect() in /var/www/html/tmp/mysqli.php:3
Stack trace:
#0 {main}
thrown in /var/www/html/tmp/mysqli.php on line 3

- やりたいこと

　　　//MySQLにPHPから接続，今回はMySQLi関数を使う

- やったこと

　　　ググる，チャットGPTにきいてみる

- ERROR内容

　致命的なエラー： 捕捉されないエラー： 未定義の関数 mysqli_conect() の呼び出し in 　　　　/var/www/html/tmp/mysqli.php:3
スタックトレース：
#0 {main}
throw in /var/www/html/tmp/mysqli.php on line 3

- 原因

　　　１． 未定義の関数の呼び出し

Parse error: syntax error, unexpected 'function' (T_FUNCTION) in /var/www/html/tmp/mysqli.php on line 4　→2へ

　　　

　　　２．・末尾の「;」忘れ

　　　　　・「"」「'」といった記号のずれや記入間違い

　　　　　・括弧の閉じ忘れ

　　　　　・全角スペースの使用

　　　　　・インデントではなくスペースでの改行

　　　　　・$忘れ

　　　　　・演算子の評価順序ミス　　…のどれかか

- 解決策

　　　1→　関数が未定義なので、とりあえず定義してみた。

```php
<?php
//MySQLにPHPから接続，今回はMySQLi関数を使う
$link = ''
$num = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
function mysqli_conect($num) {
$link = mysqli_conect('db', 'book_log','pass','book_log');
echo 'MySQLのbook_logデータベースに接続出来ました' . PHP_EOL;
}
```

　　　2→　PHPドキュメントのコピペのかいもむなしくERRORが解消しない…　詰む

　　　　　もう一度コードを全部消して１からやり直す…　成功!!

```php
<?php

$link = mysqli_connect('db', 'book_log', 'pass', 'book_log' );
echo 'データベースに接続出来ました'.PHP_EOL;
```

- 備考

　　　PHPドキュメントURL

　　　　　https://www.php.net/manual/ja/mysqli.construct.php
Dartの基礎文法 関数・switch文

# はじめに
この記事ではFlutterでアプリ開発をする際に必要なDart言語の基礎文法についてまとめています。

## 関数
基本的な関数の定義は次のようになります。
```
戻り値の型　関数名 (仮引数の型　仮引数名) {
 return 戻り値;
}

関数の呼び出しは次のようになります。
関数名 (実引数);

簡単な関数の実装例は次のようなコードになります。
String sayHello(String name) {
  return 'Hello ${name}';
}

void main() {
  var greeting = sayHello('Suzuki'); //ここで関数の呼び出し(パラメータあり)　 
  print(greeting);
}

実行結果　
Hello Suzuki
```
### アロー関数
関数で定義したいコードを１行でまとめられる際に使用します。
{　}の中に実行したいコードを書かずに　=>　の後に実行したいコードを定義します。
戻り値を返すために　return　を宣言する必要はありません(NULL許容型)
```
String sayHello(String name) => 'Hello ${name}';

void main() {
  var greeting = sayHello('Suzuki');
  print(greeting);
}

実行結果
Hello Satoshi
```

## switch文
switch文は条件分岐を書くときの構文の一つです。
if文は条件によって処理を分ける数が少ないのに対して、switch文は条件によって分ける処理が多い場合に使われます。
```
switch文は次のように書きます。
switch (式) {
  case 値1:
    「評価値 == 値1」の場合の処理;
    break;
  case 値2:
    「評価値 == 値2」の場合の処理;
    break;
  case 値3:
    「評価値 == 値3」の場合の処理;
    break;
  default:
    「caseの指定値と一致しない」場合の処理;
}
```

以下の例では式「day」の評価結果に対しての条件分岐を指定しています。
「day」の評価結果が「Tuesday」なので「case ‘Tuesday’」で指定した処理が実行されます。
```
var day = 'Wednesday';

switch (day) {
  case 'Sunday':
    print('日曜日です');
    break;
  case 'Monday':
    print('月曜日です');
    break;
  case 'Tuesday':
    print('火曜日です');
    break;
  case 'Wednesday':
    print('水曜日です');
    break;
  case 'Thursday':
    print('木曜日です');
    break;
  case 'Friday':
    print('金曜日です');
    break;
  case 'Saturday':
    print('土曜日です');
    break;
  default:
    print('存在しません');
}

実行結果
水曜日です
```

## まとめ
Dartの基礎文法である、関数、switch文について簡単にまとめました。
関数に関しては他にも記述方法がありますが、また今度まとめてみます。
最後までご覧いただきありがとうございました！
職業訓練に行ってきた

# 君だれよ
- むらた（20代後半）
- 事務職を2年ちょっとやったのちに職業訓練→プログラマ
- 趣味で10年ほどC,C++VBAなどなどを書いていた経験あり
- Qiitaに投稿するのが初めてで勝手がわかっていない

# なぜ職業訓練に？
- 事務職→事務職の転職直後に適応障害になり3ヶ月休職→退職。
- 3ヶ月経過時点で仕事ができる精神状態ではく、貯金も底をつき余計に鬱になっていた。
- 失業保険もらいにハローワークに行ったらちょうど職業訓練の募集期間だった。
- ノリで面接したら受かった（主治医に労働できる状態だという書類を書いてもらった）。
- 橋渡し付き訓練だったので、所定の期間よりひと月長くお金がもらえていた。

# 何を学んだ？
## 橋渡し訓練
社会人としてやっていくための基礎の基礎（ビジネス文書の作成方法、対人関係の作り方など）
グループに分かれてストローでタワーを作って競うゲームでだいぶ打ち解けた感じがある。
20代前半から40代の年代の人と交流を深めていった。

## 本訓練
###  1ヶ月目
TCP/IP本をひと通り、CiscoのL2・L3を使って実際にVLAN切ったりネットワーク作ったり。
実際に手を動かせてよかった。TCP/IPは全く触ってこなかった分野なので非常に勉強になった。もう少し理解を深めていきたい。

### 2ヶ月目
シーケンス制御をしていた。黒盤にリレーやらボタンを繋げて回路を作ったり、三菱のメルセックシリーズを使ってPLCを動かしていた。
想像よりかは楽しかったが、手先が非常に不器用なため配線系はダメダメで隣の席の人や前の席の人に手伝ってもらった。

### 3ヶ月目
Apache・Tomcatを使ったサーバー管理を学んだ。VirtualBoxを使って仮想環境を作ってやってた。
ここも触ってこなかった分野なので面白かった。ここはまだ理解が甘い分野なので今後勉強していきたい所存。

### 4ヶ月目
Javaプログラミング。基本構文からオブジェクト指向まで。ここでリモート授業を2回行った。
ここは下地が少しあったので非常に楽だった。クラスの1割程度は躓いていたイメージ。
教える側にわまって先生のフォローをしていた。

### 5ヶ月目
Androidプログラミング。Kotlin？いいえJavaです。基本的にやることはJavaと変わらず。昔ちょっとだけAndroidStudioで遊んでいた経験があったので、ここでも教える側にいた。プライベートでもいろいろアプリを作って遊んでいた。
この辺でモバイルアプリ開発を本格的にやりたいと考えだした。

### 6ヶ月目
シーケンス制御もう一回行った。このときは薬の副作用でアカシジア出まくりで泣きそうだった。
また、RaspberryPi（多機能端末）を使用して訓練全体の統括演習をした。スピーカーから音楽鳴らしたり、赤外線センサーを使ったりカメラモジュールを使ったり。ここでも不器用さを発揮し、ブレッドボードに刺すところ間違いまくっていた。

# 訓練終了後の流れ（ひとりごと）
地元のとあるパッケージソフトウェアを開発している会社に就職。
しかし、Gitが使えなかったりJava1.6で開発していたりと自分の精神状態が悪化し、使用期間満了で退職。
現在は受託開発会社でVBを書いている。Gitが使えるしこれからPL・PMの経験ができるのでしばらく我慢して経験を積み、また別の会社に転職するんだろうと思っている。

# 総括
- 受講生はみんないい人で、この期間の精神状態は非常に良く、飲み会をやったりご飯に行ったりと人間関係は最高だった。
- 講師の方々やキャリアアドバイザーにも良くお世話になり、相談事や応募書類のチェックをしてもらっていた。
- 未経験からプログラマになりたい人には結構おすすめできると思う。お金もらいながら勉強できるのは大きい。
ubuntu22.04にZabbix agent6.4を導入し、監視する

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

仕事関連でZabbixを触る機会が増え、適当にいじり倒せる環境が欲しいなと思う今日この頃。
なので作ってみました。
今回は前回構築したZabbix serverに監視してもらう設定を、別のubuntuサーバに設定していきたいと思います。
前回の記事は以下となります。

https://qiita.com/ohtsuka-shota/items/d321bc31db04432fcaad

# 参考サイト
以下の公式サイトに各々の環境に合わせた環境構築の手順が記載されております。

https://www.zabbix.com/jp/download?zabbix=6.4&os_distribution=ubuntu&os_version=22.04&components=agent_2&db=&ws=

ちなみに今回の環境構築にあたり、以下の様に設定を入れております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/f8e1db12-ea8c-4cd1-a350-8029ccdee922.png)

# 構築
## Zabbix agentの設定
Zabbixのリポジトリをインストールします。
```
root@k8s-master:~# wget https://repo.zabbix.com/zabbix/6.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.4-1+ubuntu22.04_all.deb
root@k8s-master:~# dpkg -i zabbix-release_6.4-1+ubuntu22.04_all.deb
root@k8s-master:~# apt update
```
Zabbix agent2をインストールします。
```
root@k8s-master:~# apt install zabbix-agent2 zabbix-agent2-plugin-*
```
次にZabbix agentのconfigを設定していきます。
ServerとServerActiveのパラメータをZabbix ServerのIPアドレスに設定し直します。
```
root@k8s-master:~# cd /etc/zabbix/
root@k8s-master:/etc/zabbix# cp -p zabbix_agent2.conf zabbix_agent2.conf.org
root@k8s-master:/etc/zabbix# vi zabbix_agent2.conf
root@k8s-master:/etc/zabbix# diff zabbix_agent2.conf zabbix_agent2.conf.org
80c80
< Server=192.168.2.222
---
> Server=127.0.0.1
133c133
< ServerActive=192.168.2.222
---
> ServerActive=127.0.0.1
```
Zabbix agentを再起動します。
```
root@k8s-master:~# systemctl restart zabbix-agent2systemctl restart zabbix-agent2
root@k8s-master:~# systemctl enable zabbix-agent2
```

## Zabbix serverの設定
ZabbixにWebブラウザでアクセスし、ログイン
Data collectionのHostsを選択します。
![image (63).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/df5b0822-7956-2139-fbf5-46a6862786eb.png)
右上のCreate hostを押下します。
![image (64).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/d91fe932-04c5-2ab3-2001-3ecce6bd7819.png)
Host name：agentの任意のホストネームを記載。
Templates：今回はubuntu22.04を監視しますので、Linux by Zabbix agentを選択。
Host group：Linux Serversを選択。
Interfaces：agentのIPアドレスを入力。
上記入力後、Addを押下します。
![image (65).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/194576bc-8e12-3c91-849f-412061c025f4.png)
agent側のAvailabilityが緑色になればOKです。
5分程度かかると思います。
![image (68).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/9334fae7-2eeb-28fa-da5e-471eab21b8ec.png)
![image (69).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/9a0d6ae6-ce2c-d5d0-5099-81c7e7cda6a7.png)
v-onについて

## 前提
**目的**


1. Vue.jsで学んだことの復習
2.  ボタンをクリックしたときに数字がリアルタイムで減るようにしたい
3.  ある一定の数値になったらメッセージを変更したい

**注意**

- 学び始めのため知識不足はご容赦ください。
- 今回はCDNを使用しているので必要に応じてVue.jsの３とブートストラップのものをheadに追加してください。




## v-onについて

````diff_html

    <body>
        <!-- 表示のためのタグ -->
        <h1 class="bg-secondary text-white display-4 px-3">Vue3</h1>
        <div id="app" class="container">
            <button class="mx-5 my-1" @click="open">押</button>
            <p class="mx-5">{{ bomAleat }}</p>
            <p class="mx-5">ライフ：{{ bomCount }}</p>
        </div>


````
````diff_javascript
        <!-- Vue3のスクリプト -->

        <script>
            const appdata ={
                data(){
                    return {
                        bomAleat: '押すと爆発',
                        bomCount: 20

                    }
                },
                methods: {
                    open(){
                        if(this.bomCount > 1){
                            this.bomCount--;
                        }else if(this.bomCount == 1){
                            this.bomAleat = '大爆発';
                            this.bomCount--;
                        }else{
                            this.bomCount--;
                            return this.bomAleat = 'お前はもう死んでいる';                    }
                    }
                }
            }
            Vue.createApp(appdata).mount('#app')
        </script>
````
````diff_html
    </body>
````

　今回は上記のように記載しました。僕の世代でも北斗の拳はよく見ておりました。
v-onで学んだのは下記の３点です

- v-onというもの自体がVue.js独自のディレクティブ（属性）であるということ

- ボタンをクリックしたときに設定していた動作を作動させることができる

- イベント修飾子やキー修飾子など使い方は多岐にわたる


今回はmethodsでopenというメソッドを作成。その中のif分岐でbomAleatの中身を変化させてみました。
本当はここにタイマー機能なども入れるつもりでしたがそれはまた別の機会に。
localhostでHTTPSを使用する　#<Puma::HttpParserError: Invalid HTTP format, parsing fails. Are you trying to open an SSL connection to a non-SSL Puma?>

# はじめに
個人開発のアプリ制作を始めました。
調べながらの実装になるので、メモとして記載しています。

※注意※
プログラミング学習中の初心者です。
記述に間違いがあれば、ご指摘いただけますと幸いです。

# 環境
Mac M1
rails 7.0.7.2
ruby 3.2.0
Node.js 20.2.0
Yarn 1.22.19

# 発生したエラー
```
HTTP parse error, malformed request: #<Puma::HttpParserError: Invalid HTTP format, parsing fails. Are you trying to open an SSL connection to a non-SSL Puma?>
```
# 解決方法
`$ bin/div` での起動ではなく、下記コードで起動する。
```
$ bundle exec pumactl start
```
# なぜHTTPS通信をする必要があったか
今回LINE認証をするにあたって、下記記事とLINEのドキュメントを参考にしながら進めていました。

https://qiita.com/mayuyuyuyunn/items/fa82cd1a724c8007f384#mkcert%E3%81%AE%E5%B0%8E%E5%85%A5

開発環境での動作を確認しておきたかったため、ローカル開発環境でSSL/TLS証明書を作成するためのツール、mkcertを導入しましたが、上記エラーが出て進みませんでした。。。

結果SSL証明書は問題なく発行できており、そもそもの起動のコマンドを変えることで解決しました。
`$bin/dev`でもpumaは読み込んではいたのですが、SSLがうまくいった下記のコマンドのログと見比べてみると、SSLのパスワードを読み込んでいなかったので、そこが原因かと思われます。
```
$ bin/dev    
15:38:29 web.1  | => Booting Puma
15:38:29 web.1  | => Rails 7.0.8 application starting in development 
15:38:29 web.1  | => Run `bin/rails server --help` for more startup options
15:38:29 web.1  | Puma starting in single mode...
15:38:29 web.1  | * Puma version: 5.6.7 (ruby 3.2.0-p0) ("Birdie's Version")
15:38:29 web.1  | *  Min threads: 5
15:38:29 web.1  | *  Max threads: 5
15:38:29 web.1  | *  Environment: development
15:38:29 web.1  | *          PID: 76794
15:38:29 web.1  | * Listening on http://127.0.0.1:3000
15:38:29 web.1  | * Listening on http://[::1]:3000
15:38:29 web.1  | Use Ctrl-C to stop
```
```
bundle exec pumactl start
Puma starting in single mode...
* Puma version: 5.6.7 (ruby 3.2.0-p0) ("Birdie's Version")
*  Min threads: 5
*  Max threads: 5
*  Environment: development
*          PID: 76966
* Listening on ssl://0.0.0.0:3000?cert=config%2Fcerts%2Flocalhost.pem&key=config%2Fcerts%2Flocalhost-key.pem&verify_mode=none
Use Ctrl-C to stop

```

# 参考
https://ja.stackoverflow.com/questions/41192/rails5puma3-11%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Bhttp-parse-error%E3%81%AE%E8%A7%A3%E6%B6%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

https://qiita.com/zaru/items/ccf328e87c768168134d
青い空を見上げればいつもそこに白い猫

<!--
2023/10/23
-->
[picoCTF][Forensics][MSB]

## Writeup
* Kaliを使用する方針から外れ、Winodwsのプログラムを使用しました。
* ファイルを開いて、ステガノグラフィー解析
![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/6298a7a6-2cee-e4af-eb4f-e7499fbdd0bc.png)
<br>

* とりあえずビット抽出
![screenshot 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/fcd36139-60c4-ace6-a567-b7fa56876ef5.png)
<br>

* タイトルを参考に、MSBを選択
![screenshot 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/b4581013-42f6-db56-d632-8afd522eed78.png)
<br>

* 文字列をテキストエディタにコピーするか、バイナリデータ保存して、検索
![screenshot 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/b1dd0365-0880-327d-8d3a-648c6bb08651.png)
<br>

* 以上です。
【AWS】エラー「[GitHub] Upload to S3 failed with the following error: Access Denied...」の解決方法

# エラー内容

AWS Codepipelineで手動リリースしたら以下のエラーになりました。
SourceステージはGithub Webhook、BuildステージではCodeBuildを選んでいました。

```
[GitHub] Upload to S3 failed with the following error: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID:...
```

# 原因
S3バケットへのアクセス許可に関する問題が原因と言われています。
CodeBuildプロジェクトがS3バケットに対する必要なアクセス許可を持っていない場合に発生するらしい。
ということで、CodepipelineのRoleを見てみます。

```yaml
  CodePipeLineRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          -
            Effect: Allow
            Principal:
              Service:
                - codepipeline.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      RoleName: CodePipeLineRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AWSCodePipeline_FullAccess
        - arn:aws:iam::aws:policy/AWSCodeCommitFullAccess
        - arn:aws:iam::aws:policy/AWSCodeBuildAdminAccess
        - arn:aws:iam::aws:policy/CloudWatchFullAccess
        - arn:aws:iam::aws:policy/AmazonECS_FullAccess
        - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess
        - arn:aws:iam::aws:policy/AmazonS3FullAccess
```

`S3FullAccess`があるので問題なさそう...
同様にCodebuildのRoleにもS3へのアクセス許可は記載していました。

おかしいなぁ...と思ってよく見ると、凡ミスであることが分かりました。
アーティファクトストアの場所が誤っていたのです。
CodePipeLineでは以下のように`ArtifactStore`の場所を定義します。
`Artifact`とは中間生成物のことであり、通常S3バケットに保存されます。

```yaml
  CodePipeLineAppBuild:
    Type: AWS::CodePipeline::Pipeline
    Properties:
      ArtifactStore:
        Location: !Sub ${SysTag}-xxx-codepipeline # ここで定義
        Type: S3
      Name: !Sub ${SysTag}-xxx-ECR
      RoleArn: !GetAtt CodePipeLineRole.Arn
      Stages:
        - Name: Source
　 ##略##
```

しかし、`Location`に記載されたバケット名でS3バケットを作っていなかったのです。正確に言うと、あとでS3バケット名を変えたのですが、`ArtifactStore`の方を変えないままCloudFormationテンプレートを更新していたのです。更新時は特にエラーは出ません。

この`Location`でミスっていると、上述のアクセス許可エラーになります。

`Access Denied`と言われているので、RoleとかACLとか、バケットポリシーとかいろいろ見てしまい遠回りしましたが、ただ単に存在しない場所にはアップロードできないよと怒られていたのでした。。正しく設定してあげたら無事に走りました。一件落着。
IT PMO２年生がやってみた！～第2回Pleasanter(プリザンター)で従業員管理～ 

<h2>目次</h2>
1．はじめに<br>
2．そもそも、なぜ従業員管理？<br>
3．従業員管理でなにやるん？ <br>
4．従業員管理を作ってみたら <br>
5．おわりに <br>
<h2>はじめに</h2>
<p>前回は、<a href="https://qiita.com/Cistree_Kaneko/items/5d9be95f6c3af5eb0111">IT PMO２年生がやってみた！～Pleasanter(プリザンター)を使った社内改善ツールの構築～</a>では、Pleasanterの概要を簡単にではありますが、ご紹介させていただきました。 <br>
今回は、引き続き「従業員管理」をご紹介します。 
<br>
<br>
今回ご紹介するPleasanterでの、従業員管理は無料で作成することができ、カスタマイズ次第で、顧客管理などでも活用することができます。 
<br>
<br>
Pleasanterってなんなの？という方は、<a href="https://qiita.com/Cistree_Kaneko/items/5d9be95f6c3af5eb0111">IT PMO２年生がやってみた！～Pleasanter(プリザンター)を使った社内改善ツールの構築～</a>の記事を参考にしてください！ </p>
<h2>そもそも、なぜ従業員管理？</h2>
<p>弊社では、今まで社員情報をExcelで管理しておりました。 <br>
その中で、脱Excelを行い、多くの管理を1本化しようということで、今回Pleasanterを選択し、動き出しました！ <br>
あと、「ITコンサルファームの会社なのに、Excel！？」という言葉が聞こえてきそうです。耳が痛い（汗） ということで！ <br>
<br>
今回は、脱Excelを目指し、Pleasanterの導入を決めた、弊社では従業員の各種管理を行うことを目指しました。 </p>
<h2>従業員管理でなにやるん？</h2>
<p>弊社の強みとして、ITリテラシーを高く持っている、コンサルタントの仲間たちは、基本的にクライアントのオフィスで仕事をすることや、在宅での仕事をすることが多くあります。 <br>
<br>
その仲間たちの活躍を知るため、従業員管理では、会社に属しているメンバーが「どこで何をしているのか」「連絡方法」「年齢」などが知れる場所を作りました。 <br>
<h2>従業員管理を作ってみたら</h2>
<p>Pleasanterがカスタマイズ性に優れていることで、期待通り、弊社で働く仲間たちが、どこで何をやっているのか管理し、メンバーに応じて最適な連絡方法でコミュニケーション取ることができるようになりました！ <br>
<h2>おわりに</h2>
Pleasanterでは、多くの業務管理ツールとして、取り扱うことができ、その中で今回は弊社で扱っている従業員管理をご紹介しました。 <br>
<br>
今後も多くの機能を取り入れて、便利にしていきたいと思います。 
次回は、従業員管理で作成している、各機能について、もう少し深堀した内容とし、技術ブログらしさを出していけるようにしますね！
【SwiftUI】Toolbarを関数に切り出す

# はじめに
Toolbarを関数に切り出す時に`some View`だとできなかったのでやり方を調べました
他のViewとは違うやり方だったので記録しておきます。

# 実装
### 基本形
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationStack {
            List {
                // cell
            }
            .toolbar(content: toolbar)
        }
    }

    private func toolbar() -> some ToolbarContent {
        ToolbarItem(placement: .navigationBarLeading) {
            Button {
                // action
            } label: {
                Text("キャンセル")
            }
        }
    }
}
```

### 複数ボタンを配置したい
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationStack {
            List {
                // cell
            }
            .toolbar(content: toolbar)
        }
    }

    @ToolbarContentBuilder
    private func toolbar() -> some ToolbarContent {
        ToolbarItem(placement: .navigationBarLeading) {
            Button {
                // action
            } label: {
                Text("キャンセル")
            }
        }

        ToolbarItem(placement: .navigationBarTrailing) {
            Button {
                // action
            } label: {
                Text("保存")
            }
        }
    }
}
```

### if文で分岐させたい
```swift
import SwiftUI

struct ContentView: View {
    @State private var isCancel = true
    
    var body: some View {
        NavigationStack {
            List {
                // cell
            }
            .toolbar(content: toolbar)
        }
    }

    @ToolbarContentBuilder
    private func toolbar() -> some ToolbarContent {
        if isCancel {
            ToolbarItem(placement: .navigationBarLeading) {
                Button {
                    // action
                } label: {
                    Text("キャンセル")
                }
            }
        } else {
            ToolbarItem(placement: .navigationBarLeading) {
                Button {
                    // action
                } label: {
                    Text("戻る")
                }
            }
        }
    }
}
```

# おわり
これは知りませんでした
【GAS】Google スプレッドシートで sprintf 関数を使う方法

Google スプレッドシートで JSON, HTML, XML 等を組み立てたいときに、`&` や `CONCATENATE` 関数を用いた文字列の連結では苦しいことがあるかと思います:

```jsonc:組み立てたい JSON
{"id":1} // 値は A 列にあるセルを参照したい！
```

```text:& を用いた数式
="{"&CHAR(34)&"id"&CHAR(34)&":"&A2&"}"
```

```text:CONCATENATE 関数を用いた数式
=CONCATENATE("{",CHAR(34),"id",CHAR(34),":",A2,"}")
```

C 言語 や Go 言語などには sprintf という、`%d` や `%s` といったフォーマット指定子を用いて文字列を組み立てる関数が備わって、簡単に文字列を組み立てることができます:

```go:Go 言語の例
fmt.Sprintf(`{"id":%d}`, 1)
```

これと同様の機能を Google スプレッドシートで実現する方法を紹介します。

## sprintf 関数を準備
Google スプレッドシートのメニューにある「拡張機能」→「Apps Script」を選択します:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137045/5ecb9dd0-c789-927f-a76b-a9dad8aab370.png)

コードエディタ上に以下のコードを貼り付けて保存してください:
```js
function sprintf(template, ...args) {
  return Utilities.formatString(template, ...args);
}
```

上記の `sprintf` 関数は、`Utilities.formatString` という Apps Script のユーティリティ関数をスプレッドシート上で利用できるようにしています。
https://developers.google.com/apps-script/reference/utilities/utilities?hl=ja#formatString(String,Object...)

## 使い方
例として、E2 セルにフォーマット文字列を入れます:

```text:E2 セルの内容
{"id":%d}
```

A 列に id の数値が入っている場合、以下のような数式を入力します:

```
=SPRINTF($E$2,A2)
```

`$E$2` の 2 つの `$` は絶対参照のために付けており、数式を列方向・行方向どちらにコピーしてもセル参照が変化しません。
(数式入力中に E2 セルを選択している状態で F4 キーを 1 回押すと `E2` が `$E$2` に置き換わり、便利です[^1])

[^1]: Microsoft Excel にも同様の機能があります。

これで、冒頭に記載した「組み立てたい JSON」が表示されます:

```jsonc:組み立てたい JSON
{"id":1}
```

## 注意点
Apps Script で定義された関数を利用しているため、`&` や `CONCATENATE` 関数を使う場合に比べて処理に時間がかかることがあります:

![spreadsheet_sprintf.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137045/54aa6711-2521-e2ee-9c2d-47a8bdfdf79b.gif)

Loading... が表示される時間が許容できない場合や、簡単な文字列の結合には `&` や `CONCATENATE` 関数を用いるのがおすすめです。

# GitHub Copilot Chat に聞いてみた
GitHub Copilot Chat に対して、以下のような質問をしてみました:

> Google スプレッドシートで Go 言語の fmt.Sprintf 関数のような関数を利用する方法

![spreadsheet_sprintf_copilot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137045/9fe4de62-cbb5-9717-eb80-83f8f8cde3ed.png)

:100:
Thor 1.3.0 でコマンド名の短縮ができなくなった？

本記事は，[thor](https://rubygems.org/gems/thor) という gem のバージョン 1.3.0（2023-10-19 リリース）の仕様変更でコマンド名の指定の仕方に変化が起こったらしいことについて書く。

詳しく調べていないので，起こった現象だけを書く。

# Thor とは

Thor は Rake のように，コマンドラインで行いたいタスクを定義ファイルに記述して実行させることができるもの。

この gem を

```terminal
gem install thor
```

で，インストールしておいて，たとえば，

```rb:commands.thor
class Text < Thor
  desc "codepoints STRING", "Show codepoints of STRING"
  def codepoints(string)
    puts string.chars.map{ "U+%04X %s" % [_1.ord, _1] }
  end
end
```

みたいなファイルをどこかに置いておく（拡張子は `.thor`）。

そして，それを置いたディレクトリー（もしくはその下位ディレクトリーで）

```terminal
thor text:codepoints 寒い
```

などと打てば

```terminal
U+5BD2 寒
U+3044 い
```

のように，引数として指定した文字列のコードポイントがずらずらっと表示される。

# コマンド名の短縮

さきほどの例で，`text:codepoints` というコマンド名はちょっと長い。

しかし，最後まで書く必要はなく，たとえば

```terminal
thor text:cod 寒い
```

みたいに `codepoints` の部分を途中まで書いただけでも実行できていた。
（`text` の部分は短縮できない）。

短縮したときに他のコマンドと被ってさえいなければよいので，たとえば他に `c` で始まるコマンドが無いなら

```terminal
thor text:c 寒い
```

でも OK。

このへんが Rake より便利なところ。

# バージョン 1.3.0 でできなくなった？

2023-10-19 にバージョン 1.3.0 がリリースされたので，さっそく

```terminal
gem update thor
```

で最新版を入れた。

すると，この短縮ができなくなった。
試しに

```terminal
thor text:codepo 寒い
```

などと打つと，

```terminal
Could not find command "寒い" in "text" namespace.
```

とエラーが出る。

ん〜？
「`codepo` ってコマンド見つからん」ならともかく「`寒い` ってコマンド見つからん」と言っている。
むちゃくちゃ変。

コマンド名を全部書けば今までどおりに動作する。

また，バージョン 1.3.0 をアンインストールして，以前のバージョン（一つ前は 1.2.2）に戻しても今までどおりに動作した。

# おわりに

なんでこうなったのかよく分からない。

[1.3.0 のリリースノートみたいなもの](https://github.com/rails/thor/releases/tag/v1.3.0) を見ても，それらしい記述が見つからない。
（英語ができないから見つけられないだけかもしれないが）
【個人開発】筋トレの記録をできるアプリを開発

## 初めに

現在、React・TypeScriptの学習を進めていてUdemy,Yotubeでハンズオンで動画を見ながら手を動かしていたなかで、要件定義からデプロイまで個人で開発しないと思っていたので、今回は「筋トレの記録をできる」アプリを2週間で開発しました。

https://github.com/taisei-code/ts-react-kintore

## どんなアプリ？

このアプリでは、トレーニングの記録の追加・削除ができます。
具体的には、日付・種目・重量・回数の登録が可能です。

![スクリーンショット 2023-10-21 9.48.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536873/4236ae9e-e384-d7a1-dc5a-0156a1688315.png)

![スクリーンショット 2023-10-21 15.54.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3536873/b80ef351-e99e-80b5-628c-7c492bf3ac0f.png)



## なぜ作ったのか？

私は高校生の頃から筋トレをしていて、週に5回ジムに通っています。当時から、ジムに自分よりも身体の大きい人がいるなかで、どうしたら身体を変えられるか考えたときに「昨日の自分を超えること」だと思いました。しかし、がむしゃらに鍛えるだけでは昨日の自分を超えることは難しいと考え、種目の記録を付けることで客観的に成長したかどうか分かるのでノートに種目の記録を付け始めました。ノートに記録を付けてからは、前回の記録を把握することで筋トレのモチベーションを上げることができました。成長に繋げることができたのですが、ジムで移動するときに荷物が多くなるという課題を感じていたことから、普段から手に持っているスマホで筋トレの記録を管理したいと思い、今回作ることにしました。

## 使用技術

今回使用した技術は以下になります。

・React
・TypeScript
・Chakra UI
・Firebase

## 開発について

### React

TODOリストよりも、useStateで管理するデータが増えたので分かりやすい命名をすることが次回の課題です。また、useStateで記録を更新するときに1つの日付に複数の記録を登録するロジックに苦労しました。

### TypeScript

今回初めて導入して意識したことは、オブジェクト指向です。管理するデータが多いことから、型をクラスで定義してインスタンス化することで利便性に繋がると考えました。


### Chakra UI

UIライブラリとしてChakra UIを導入しました。実装を進めていくなかで、便利に感じる部分がありました。1からCSSを記述しなかったので、今回2週間でデプロイまで持っていくことができた要因だと考えています。

### Firebase

Hostingを使用して、デプロイを行いました。
初めてFirebaseを使用した感想としては、導入手順が非常に簡単でアプリ開発に集中することができました。


## 終わりに

初めての個人開発を記事にしてみました。
改善点は多くあるので、修正していきたいと思います。

・種目がベンチプレス、スクワット、デットリフトしか選択できない（重量も同様に）
・セット数を選択できるようにして、セット毎に何回行えたのか設定できるようにする
・1度登録した記録を編集できるようにする
・レスポンシブ対応

改善を重ねて、少しでも使いやすいと感じるようなサービスを作れるようになっていきたいです。
Java WebアプリケーションでSQLite3を効果的に使用する方法

こんにちは、JavaのWebアプリケーション開発者の皆さん！今日は、JavaのWebアプリケーションでSQLite3データベースを効果的に使用する方法について解説します。特に、`sql2o`と`commons-dbcp`のライブラリを活用することで、どのようにデータベース操作を簡単かつ効率的に行うことができるのかを中心にお伝えします。

# 1. はじめに

SQLite3は軽量で組み込み用途に適したデータベースです。しかし、JavaのWebアプリケーションでの利用方法や、ライブラリの選択に迷っている方も多いのではないでしょうか。この記事では、その疑問を解決します。

# 2. 必要なライブラリの設定

まず、`pom.xml`に以下の依存関係を追加します。

```xml
<!-- SQLite JDBCドライバ -->
<dependency>
    <groupId>org.xerial</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.34.0</version>
</dependency>

<!-- sql2oライブラリ -->
<dependency>
    <groupId>org.sql2o</groupId>
    <artifactId>sql2o</artifactId>
    <version>1.6.0</version>
</dependency>

<!-- commons-dbcpライブラリ -->
<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
</dependency>
```

# 3. SQLite3データベースの配置

次に、SQLite3データベースファイルをプロジェクト内に配置します。具体的には、`/myproject/src/main/webapp/WEB-INF/`ディレクトリに配置します。

# 4. Javaでのデータベース接続

Javaコードを記述して、SQLite3データベースに接続します。以下はそのサンプルコードです。

```java
final var dbname = servletContext.getRealPath("/WEB-INF/myproject.sqlite3");

this.dataSource = new BasicDataSource();
this.dataSource.setDriverClassName("org.sqlite.JDBC");
this.dataSource.setUrl("jdbc:sqlite:" + dbname);
this.dataSource.setUsername("xxxxx");
this.dataSource.setPassword("xxxxx");
this.sql2o = new Sql2o(this.dataSource);
```

# 5. SQLiteの使用に関する重要なポイント

SQLiteは非常に便利で軽量なデータベースとして知られていますが、JavaのWebアプリケーションでの使用には注意が必要です。特に、WARファイル内にSQLiteデータベースを内包する方法を選択した場合、デプロイするたびにデータベースが初期化されてしまう可能性があります。

この特性のため、SQLiteは以下のような用途に適しています：

- **一時的なデータ保存**: 短期間のデータ保存やテスト目的での使用。
- **開発環境での利用**: 本番環境へのデプロイ前のテストやデバッグに利用。

しかし、長期間のデータ保存や本番環境での持続的なデータの利用を目的とする場合、他のデータベースシステムの検討をおすすめします。

SQLiteのこの特性を理解し、適切な使用方法を選択することで、データの喪失や予期しない問題を避けることができます。

# 6. まとめ

SQLite3はJavaのWebアプリケーションでの利用が増えています。この記事を参考に、効果的なデータベース操作を行ってください。また、図解や具体的なコード例を参考に、実際の開発に役立ててください。
USBメモリをHack その3(まだまだ途中)


「USBメモリをHack(途中まで)」
https://qiita.com/nanbuwks/items/b0c3ce86e0c5d0893389

「USBメモリをHack その2(まだ途中)」
https://qiita.com/nanbuwks/items/21b165a204be5d0209ae

では、Innostor MPTool を使って IS03 の設定をしてみました。

しかしながら正常なUSBメモリとしての設定のみしか受けつけてくれないようでした。

今までは IS03  をターゲットとしていましたが、コントローラは
Silicon Motion Inc  や Phison　PS2307 などがあります。

これは Phison PS2134 のデータシートですが、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d953498b-30fd-30f1-bfaf-4a6e319bacf6.png)

内部構成を見ると uP8051 が中央に有るのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/202dc940-2077-586c-b714-55cdec53efa4.png)


ストレージのコントローラは各社とも同じような構成になっていて、8051 というのは元々は Intel の古典的な組み込み用の8ビットCPU です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/92b76333-abcc-d2a0-78ec-28dec7d7002c.png)

この 8051 のコアを拡張しまくってUSBのコントローラにしているわけですね。
ここの8051をプログラムすることで、HIDデバイスとしてストレージクラス以外の挙動なども行えるようになります。

そういった柔軟な Hack をしたいということで、今度はこちらを参考にしてみます。

https://usbdev.ru/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ba575fe0-bb3e-34d7-ed39-0d01f492a124.png)


https://www.usbdev.ru/files/innostor/
より、修復ツールを試してみようとしましたが・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/cb31197c-4a19-2fbf-4eca-a8cc0f84ec00.png)


ここにリンクの有るファイルはことごとくリンク切れでした。

IS03 のシリーズも、あまり情報がなかったり更新がなかったりします。


今までは IS03  をターゲットとしていましたが、コントローラは
Silicon Motion Inc  や Phison　PS2307 などがあり、こちらに路線を変更して再チャレンジの予定！


# コントローラを調べる

https://www.usbdev.ru/files/chipgenius/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6c7658cf-8c24-50c2-b4e9-f5b360a89623.png)

ここの ChipGenius を使えばわかるかな?

実行してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/95a36753-b098-4c25-44ce-15182fbfa8ba.png)

IS903に認識ができてますね。

適当な Silicon Power の USBメモリを刺してみると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/92fa15c3-92ad-8a21-4fec-a4fdff1c728b.png)

うーん、No  match recored ですね・・・ 

（調査中!)
react



```react
import * as React from 'react';
import { useState } from 'react';
import { Dialog, DialogType, DialogFooter, PrimaryButton } from 'office-ui-fabric-react';

const MyComponent: React.FC = () => {
  const [isDialogVisible, setIsDialogVisible] = useState(false);

  const openDialog = () => {
    setIsDialogVisible(true);
  }

  const closeDialog = () => {
    setIsDialogVisible(false);
  }

  return (
    <div>
      <a href="#" onClick={openDialog}>リンクをクリック</a>

      <Dialog
        hidden={!isDialogVisible}
        onDismiss={closeDialog}
        dialogContentProps={{
          type: DialogType.normal,
          title: 'ダイアログのタイトル',
          subText: 'ダイアログの内容をここに表示します。',
        }}
        modalProps={{
          isBlocking: false,
          styles: { main: { maxWidth: 450 } },
        }}
      >
        <DialogFooter>
          <PrimaryButton onClick={closeDialog} text="閉じる" />
        </DialogFooter>
      </Dialog>
    </div>
  );
}

export default MyComponent;


```
【Rails】レスポンスに画像のパスを追加する方法【ActiveStorage】

## モデルにメソッドを定義

モデルに画像のパスを取得するためのメソッドを定義します。

```user.rb
class User < ApplicationRecord
  has_one_attached :avatar

  def avatar_path
    return unless avatar.attached?

    Rails.application.routes.url_helpers.rails_blob_path(avatar, only_path: true)
  end
end
```

## レスポンスに追加する

以下のように記述することでレスポンスに画像のパスを追加できます。

```users_controller.rb
module Api
  module V1
    class UsersController < ApplicationController

      def show
        user = User.find(params[:id])
        # methods: にモデルに定義したメソッドを記述する
        render json: user, methods: [:avatar_path], status: :ok
      end

    end
  end
end 


```
セキュアブート用のコンパイル済み、署名済みNVIDIAドライバ(Ubuntu)

セキュアブート有効の場合にはUEFIに鍵を登録したり、その鍵でビルドしたドライバに署名したりが必要で何かと面倒。特にOSを入れ替えたりしていると鍵の管理がわけわからなくなりがち。

そんな時にK8sのGPU OperatorでCanonicalが署名してくれてるコンパイル済みドライバが使えるというドキュメントを見かけた。

https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/install-precompiled-signed-drivers.html

ドライバのコンテナは以下のパッケージを使うとのことなので

> * `linux-objects-nvidia-${DRIVER_BRANCH}-server-${KERNEL_VERSION}` - Linux kernel nvidia modules.
> * `linux-signatures-nvidia-${KERNEL_VERSION}` - Linux kernel signatures for nvidia modules.
> * `linux-modules-nvidia-${DRIVER_BRANCH}-server-${KERNEL_VERSION}` - Meta package for nvidia driver modules, signatures and kernel interfaces.
> * `nvidia-utils-${DRIVER_BRANCH}-server` - NVIDIA driver support binaries.
> * `nvidia-compute-utils-${DRIVER_BRANCH}-server` - NVIDIA compute utilities (includes nvidia-persistenced).

Kubernetesは使ってないスタンドアロンのPCだが、これらのパッケージを使えば、セキュアブート環境でドライバのビルドや署名、鍵の管理から解放されるのではないかということでインストールしてみる。

```shell
KERNEL_VERSION=$(uname -r)
DRIVER_BRANCH=535

sudo apt-get update
sudo apt-get install -y linux-objects-nvidia-${DRIVER_BRANCH}-server-${KERNEL_VERSION} \
	linux-signatures-nvidia-${KERNEL_VERSION} \
	linux-modules-nvidia-${DRIVER_BRANCH}-server-${KERNEL_VERSION} \
	nvidia-utils-${DRIVER_BRANCH}-server \
	nvidia-compute-utils-${DRIVER_BRANCH}-server
```

再起動後、ドライバがロードされて`nvidia-smi`が使えることは確認できた。
多分、カーネルをアップデートするときは、そのカーネルのリビジョンに合わせてまたドライバをインストールしなおさなきゃいけない。
interface × extends

## はじめに
interfaceとかextendsとか、よく分からない。。。。


## 疑問を持った経緯
ある日、引数にclassBの型をとる関数に遭遇しました。
```
function someFunction(param: classB) {
  // classBの型を受け入れる関数
}
```
私　
__「引数にclassBの型が指定されているからclassBを使わないと」__

先輩　
__「いや、違います。ここでは機能としてclassBをextendsしているclassAを使って実装します」__

私
__「え？なんでclassAも入れれるの？？Bって書いてあるのに、、、」__

先輩
__「classAはclassBをextendsしているから使えるんですよ。」__
__「extendsがわからければ自分で調べて勉強してみてください。。。！」__


が事の発端です。

## 本当にそうだった
先輩を疑っていたわけではないですが、
下記のコードのような場合、classAを入れてもclassBを入れても問題ないようです。


```
class classB {
    // 何らかのプロパティやメソッド
}

export interface InterfaceA extends classB{
    //インターフェースA独自のプロパティやメソッド
}

export class classA implements InterfaceA{
    //クラスAの実装
}

```
classBの型を受け入れる関数に対して・・・
```
function someFunction(param: classB) {
  // classBの型を受け入れる関数
}
```
classA,classBどちらをインスタンス化したやつを入れても正しくなった！
```
const instanceA = new classA();
someFunction(instanceA); // これは正しい

const instanceB = new classB();
someFunction(instanceB); // これも正しい
```
## interfaceやextendsって何？
下記のコードの意味はこのような感じです
```
export interface InterfaceA extends classB
```
__InterFaceAはclassBのインターフェースを継承し、外部で使えるものとして宣言__


``export``
他のモジュールから(InterfaceA)を利用可能

``interface InterfaceA``
Aclassという新しいインタフェースの宣言

``extends Bclass``
Bclassのインターフェースを引き継ぐ


## 要するに
classBの __interface__ (メソッドなどの設計要素)を __extends__ (引き継いで)
作成したclassAは、classBの型を受け入れる関数で使えるようです。

<font color=red>__しかし逆はエラーになるので注意です！__<font/>
<font color=gray>classAのインスタンスを受け入れる関数にclassBのインスタンスはNG！<font/>




## まとめ
``interface``
classに作るメソッドを宣言することで、
実装漏れを防いだり、classが持つメソッドなどの設計図の役割をする

``extends``
別のモジュールのインターフェースをまるっと引き継ぐ
(追加する機能やメソッドの書き換えはinterface名を宣言した直後に書く)

まだまだ自分は修行が足りんですな。
EFCoreを使用するアプリケーションのテストについて

# はじめに
今まで私が携わったプロジェクトは中小型の案件が多かったため
ビジネス層からLinqでガシガシDBContextをいじり、テストはローカルDBにテスト用データを投入して行うテストが多かったです。
しかし、昨今のテストファーストやクリーンアーキテクチャの流れ、またMicrosoftも次の指針をだしており一度簡単にまとめてみたいと思います。
# Microsoftの指針
https://learn.microsoft.com/ja-jp/ef/core/testing/

# 推奨のテストアプローチ
まず最初の選択肢は、実際のデータベース（ローカル環境）を使用するか[テストダブル](https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%B9%E3%83%88%E3%83%80%E3%83%96%E3%83%AB)を使用するかだそうです。
実際のデータベースを使ったテストの経験はあるのですが以下の問題があります。
* テストレスポンス（テストが多くなるとそれなりの時間がかかる）
* テストの相互干渉（初期化とかIDをランダムに生成したりデータセットアップが面倒な記憶があります）

以降では、上記の問題を解消できるであろうテストダブルについて見ていきたいと思います。

# テストダブル
テストダブルでは以下が推奨されています。（以下の図が例示されています）
* SQLite（インメモリ）をデータベースフェイクとして使用
* リポジトリ層を設けモック化する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666176/22852152-3a4c-780c-186a-c26889e8eee4.png)

SQLiteについては、必ずしも実際のデータベースをフェイクできるわけではないので注意が必要とのこと（SQLの非互換）
リポジトリ層については以下のようにコストを度外視すればベストとのこと（結構大変。。）
> EF Core を完全にテストから除外し、リポジトリを完全にモックすることができます。ただし、これによってアプリケーションのアーキテクチャが大きく変化する可能性があり、実装と保守にかかるコストが増加します。」

他には以下が例示されているが非推奨とのこと
* DbContext と DbSet のモック化またはスタブ化
* データベースのフェイクとしてのインメモリプロバイダ

# リポジトリパターンのメリット・デメリット
テストダブルの推奨はリポジトリパターンということなのでメリットとデメリットを検討したいと思います。

メリット
* テストの容易さ。（リポジトリのモック/スタブを用意すればアプリケーションのテストが行える）
* クリーンアーキテクチャ界隈で言われていること。

デメリット
* やはり開発コストが増えることでしょうか（とにかくコードが増える！）
* 層が増えたことによる悩ましい問題も色々あるようです。（この辺はクリーンアーキテクチャ、リポジトリでググると色々出てきます）
* リポジトリDB間のテストは必要

# まとめ
なんかリポジトリパターン大変そうです。
私もめんどくせーとか思ってました。
しかし、直近でレポジトリパターン（クリーンアーキテクチャ）を取り入れたプロジェクトに参加したのですが、開発の規模によってはありかと思います。（コードが読みやすい！）
Microsoft的にもおすすめですしね。
テストありきの開発はライフサイクル全体で見れば明らかに優れているので、皆さんも検討してみてはいかがでしょうか。
Linux基礎コマンドまとめ

## はじめに

本日はLinuxの基礎コマンドについて学習したので、アウトプットしていきたいと思います。


## コマンド

###### cd

ディレクトリを移動するコマンド
書式　cd[オプション][ディレクトリ]
具体例　$ cd /home

###### pwd

カレントディレクトリを表示するコマンド
書式　pwd [オプション]
```
$ pwd
```

###### ls

ファイルやディレクトリの一覧を表示するコマンド
書式　ls [オプション][ディレクトリorファイル名]
```
$ ls /
```


- オプション　
  - -a .で始まる隠しファイルも全て出力する。
  - -l ファイルの詳細情報を表示する。
  - -F ファイルの種別を表示する。
  - -t 最終更新時間によって、ソートして出力する。
  - -r 逆順に出力する。


###### mkdir

ディレクトリを作成するコマンド
書式　mkdir [オプション]<作成するディレクトリ名>
```
$ mkdir home
```
- オプション
  - -p 深いディレクトリを一度に作成する。


###### rmdir

空のディレクトリを削除するコマンド
書式　rmdir <ディレクトリ名>
```
$ rmdir home
```

- オプション
  - -p 指定した階層までのディレクトリを一括で削除する。


###### cat

ファイルの中身を表示するコマンド
書式　cat [オプション]<ファイル名>
```
$ cat /etc/hosts
```
- オプション
  - -n 行番号を表示する。


###### less

ファイルの中身をスクロール表示するコマンド
書式　less [オプション]<ファイル名>
```
$ less /etc/hosts 
```
:::note warn
lessコマンドを終了するときは、「q」を押す。
:::


###### tail

ファイルの末尾から１０行を標準出力する。
書式　tail [オプション]<ファイル名>
```
$ tail /etc/hosts
```
-オプション
  - -n 数値　末尾から指定した行を標準出力する。
  - -c 数値　末尾から指定したバイト分標準出力する。
  - -f 変更がリアルタイムで出力される。


 ###### touch

 空のファイルを作成するコマンド
 書式　touch <新規ファイル名>
```
$ touch README.md
```
 :::note info
 正確には「ファイルのタイムスタンプを変更するコマンド」です。
 指定されたファイル名のファイルが存在しない場合空のファイルが作成されます。

:::







 ###### rm

ファイル、ディレクトリを削除するコマンド
書式　rm [オプション]<削除するファイル名>
具体例　$rm README.md

- オプション
  - -r ディレクトリも合わせて削除する。
  - -f ファイルを削除するときに警告文を表示しない。
  - -i ファイルの削除前に確認する。


###### mv

ファイルの移動、ファイル名を変更するコマンド
書式　mv [オプション]<移動元> <移動先>
```
$ mv file file1
```
- オプション
  - -i 上書きする前に確認する。
  - -f 確認の問い合わせを無視して処理を実行する。


###### cp

ファイル、ディレクトリをコピーするコマンド
書式　cp [オプション]<コピー元> <コピー先>
```
$ cp file new_file
```
- オプション
  - -i 上書きする前に確認する。
  - -r ディレクトリをコピーする。
  - -p コピー元の所有者、属性、更新日時もコピーする。


###### ln

リンクを張るコマンド
書式　ln [オプション]<リンク元ファイル名> <リンク名>
```
$ ln file1 file2
```

- オプション
  - -s シンボリックリンクを張る。


###### find

ファイルを検索するコマンド
書式　fand <検索開始ディレクトリ><検索条件><アクション>
```
$ find . -name README.md -print
```
- 検索条件
  - -name ファイル名を指定して検索。
  - -iname ファイル名を指定して検索。大文字小文字を区別しない。
  - -type ファイルの種類で検索。
  - -a 複数の検索条件を指定。省略可能。



###### chmod

ファイルやディレクトリのパーミッションを設定するコマンド
書式　chmod [ugoa] [+-=] [rwx] <ファイル名>
```
$ chmod u+r file
```
|記号|内容|
|:-:|:-:|
|u|所有者の権限|
|g|グループの権限|
|o|その他のユーザーの権限|
|a|全ユーザーの権限|


###### chown

ファイルの所有者を変更するコマンド
書式　chown <ユーザー><ディレクトリ名>


###### ps

実行中のプロセスを表示するコマンド
書式　ps [オプション]
```
$ ps
```
- オプション
  - aux 全ユーザーのプロセスを、詳細情報を合わせて表示する。


###### kill

ジョブやプロセスを終了させるコマンド
書式　kill [オプション]%<ジョブID>
　　　kill [オプション]<プロセスID>
```
$ kill %1
$ kill 5456
```


:::note
正確には「シグナルを送信するコマンド」
デフォルトではTERMという「終了を指示する」シグナルを送信している。
SIGKILLという強制終了のシグナルもある。
:::


## 最後に

Linuxの基礎コマンドまとめてみました。
触っていてわからない事が出てきたら、manコマンド（マニュアル）、--helpオプションを使って調べていきましょう！