OmniAICreator/Qiita-1.07M huggingface dataset:
CSS positon使い方

## positionとは

要素の意図を決める際に使用するプロパティ

要素の位置はmergin,paddingなどでも決めれるが、positionを使うことで
・要素を重ねる
・要素を固定する
などより柔軟なレイアウト作成が可能となる

## positionで指定できる値

- position: relative
- position: absolute
- position: fixed
- position: static
- position: sticky

→単体だけではあまり使わない
 位置を決めるために使用するため、位置表示の値を一緒に使用する

## position: relative

・相対的な位置指定ができる
→要素の動的な配置に使用される

要素は、通常のHTMLの流れに従って配置される
top、bottom、left、rightプロパティで位置を微調整することができる

## position: absolute

・最寄りの親要素（positionがstaticでない要素）に対して配置される
→要素を重ねて表示したい場合に使用される

top、bottom、left、rightプロパティで位置を指定できる

* 親要素がない場合：ブラウザウィンドウの左上隅に対して配置される

## position: fixed

ブラウザウィンドウの左上隅に対して配置される
スクロールしても、要素はその位置に留まる
→画面上の固定位置に配置する場合に使用される
     EX)要素をヘッダーやフッターなど

## position: static

デフォルト値で、要素は通常のHTMLの流れに従って配置される
top、bottom、left、rightプロパティは影響を受けない

## position: sticky

要素をスクロール時に固定された位置に配置するためのプロパティ

要素は一定の位置までスクロールされたときに固定
→通常のHTMLの流れに従って配置される

```css
.container {
  height: 500px;
  overflow-y: scroll;
}

.sticky {
  position: sticky;
  top: 0;
}

```
.containerクラスに
heightプロパティ
overflow-yプロパティ
が設定されている

→.container要素がスクロール可能

.stickyクラス
position: stickyとtop: 0が設定されている
→.sticky要素が上部に固定され、.container要素がスクロールされると、.sticky要素がその位置に留まる

***

要素の位置をスクロールに応じて動的に変更できる
また、複数の方向に設定することもできる

EX）leftプロパティを設定

```css
.sticky {
  position: sticky;
  top: 0;
  left: 0;
}

```

→.sticky要素がスクロール時に上部に固定されるだけでなく、左端にも固定される
基本ACL、拡張ACL 知らなくて怒られた件

# 基本ACL、拡張ACL 知らなくて怒られた件
少し前に情シスみたいな感じで入った仕事先で「`/var/log/secur`見たいので rつけて欲しい」って言ったら、凄い顔して怒られたので、久しぶりに自分メモ。しかし怒られても教えてくれた ACL (Access Control Lists) あ、納得ということ。
※ちなみに開発環境もガチでrootもらえない職場でした

# ACLの基本
ファイル単位に ACL (Access Control Lists) できるってこと。下記のファイル一般ユーザは見れないって怒られますよね？

```text
# ls -al /var/log/secure
-rw------- 1 root root 132989  4月 21 11:55 /var/log/secure
```

そりゃ・・・hage（一般ユーザ）じゃみれねーわね

```text
[hage@ns log]$ tail -f /var/log/secure
tail: '/var/log/secure' を 読み込み用に開くことが出来ません: 許可がありません
tail: ファイルが全く残っていません
```

# hageで見れるようにする
`/var/log/secure`ファイル hageさんに見れるようにします。


```text:root
$ sudo setfacl -m user:hage:r /var/log/secure
$ sudo getfacl /var/log/secure
getfacl: Removing leading '/' from absolute path names
# file: var/log/secure
# owner: root
# group: root
user::rw-
user:hage:r--
group::---
mask::r--
other::---
```

したら

```text
[hage@ns log]$ tail -f /var/log/secure
Apr 21 11:54:02 ns sshd[14461]: pam_unix(sshd:session): session opened for user hage by (uid=0)
Apr 21 11:55:41 ns sudo[14500]: pam_unix(sudo:auth): conversation failed
・
・
```

きたーー！！（死語） というか「+」つくんですね

```text
# ls -al /var/log/secure
-rw-------+ 1 root root 132989  4月 21 11:55 /var/log/secure
```

# 割とフザケテましたが
ACL便利ですね。勉強になりました。

・[Linux】基本ACL、拡張ACL、setfacl、getfacl](https://www.softel.co.jp/blogs/tech/archives/7536)
・[ACL によるアクセスコントロール](https://www.server-world.info/query?os=Debian_11&p=acl)
CSS書き方

## CSS書き方

- CSSファイルを作成
テキストエディターで新しいファイルを作成し、拡張子を.cssに設定

- HTMLファイルにCSSをリンク
HTMLファイルのheadタグ内に、linkタグを追加してCSSファイルをリンク
```html
<head>
  <link rel="stylesheet" type="text/css" href="style.css">
</head>
```
- CSSルールを作成
CSSルールは、セレクター、プロパティ、値から構成される
```css
セレクター {
  プロパティ: 値;
}
```
セレクター：CSSスタイルを適用する要素を指定
EX) h1はすべてのh1タグにスタイルを適用することを意味する
プロパティ：要素の外観や動作を制御するために使用される
EX) colorはテキストの色を制御する
値：プロパティの設定値を指定

```css
h1 {
  color: red;
}

```
↑ h1タグに赤い色を設定する例

- CSSのカスケードと継承

CSSはカスケードと継承の概念を持っている
カスケードは、複数のスタイルが同じ要素に適用される場合、どのスタイルが優先されるかを定義する
継承は、親要素のスタイルが子要素に継承されることを意味している

- CSSのクラスとID

クラスとIDを使用して、特定の要素にスタイルを適用できる
クラス：同じスタイルを複数の要素に適用する場合に使用される
ID：一意の要素にスタイルを適用する場合に使用される

```html
<p class="red">このテキストは赤色です。</p>
<p id="green">このテキストは緑色です。</p>

```

```css
.red {
  color: red;
}

#green {
  color: green;
}

```
HTML書き方

## HTML書き方

- HTMLファイルを作成
テキストエディターで新しいファイルを作成し、拡張子を.htmlに設定

- HTMLドキュメントの開始タグと終了タグを書く
HTMLドキュメントを開始するときは、次の開始タグを使用

```html
<!DOCTYPE html>
<html>
```
HTMLドキュメントを終了するには、次の終了タグを使用
```html
</html>
```
- ページのタイトルを設定

```html
<head>
  <title>タイトル</title>
</head>
```

- ページの本文を作成
本文はbodyタグで囲まれる

```html
<body>
  <h1>見出し</h1>
  <p>段落</p>
</body>
```

- 画像を追加

```html
<img src="画像のURL" alt="代替テキスト">

```
- リンクを作成

```html
<a href="リンク先のURL">リンクのテキスト</a>

```
- リストを作成

```html
<ul>
  <li>リスト項目1</li>
  <li>リスト項目2</li>
  <li>リスト項目3</li>
</ul>

```
Java デーモンスレッド

## デーモンスレッド

Javaのスレッドの一種
プログラムの実行中に他のスレッドが存在しない場合に自動的に終了するスレッド
→プログラムが終了したり、他のスレッドが終了したときに、自動的に終了

## 主な用途

裏でバックグラウンド処理を実行すること

EX)
Javaのガベージコレクタは、デーモンスレッドとして実行され、メモリの解放を定期的に行う
また、自動保存機能や自動更新機能など、バックグラウンドで実行されるタスクにもデーモンスレッドが使用される

## 作成方法

スレッドのsetDaemon(true)メソッドを呼び出す
これによってスレッドがデーモンスレッドになる

デーモンスレッドを作成する場合
run()メソッドの中でwhile(true)ループを使って、終了する条件を自分で定義する必要がある


## メリット

プログラムが終了する前に自動的に終了するため、プログラムのパフォーマンスを改善することができる

## 注意点

デーモンスレッドは、他のスレッドが終了する前に自動的に終了する
→他のスレッドのリソースが解放される前に、何らかのタスクを実行することができない
コールバックを簡単におさらいする

## コールバックとは何か？
`ある処理が完了する`とか`何かのイベントが発生する`際に、`処理の完了を通知`したり`別の処理を呼び出す`仕組み。要は、complition()が通知された場所やタイミングでいろんなこと（処理）ができますよ〜みたいな。
- その`処理の完了の通知`や`別の処理を呼び出す`目印として、関数の引数が使われる。
    - ある関数に対して、引数をコールバックとして渡し、その関数内で引数（コールバック）を呼び出すみたいな感じ。
        - 画像でいうcomplition引数がコールバックと呼ばれるもの（度々目にするのでは？）
        - print文の後に処理が完了したことをコールバックを呼び出して通知している。
    ![スクリーンショット 2023-05-04 14.10.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915639/382fb487-3276-8927-0413-6fdb22175a57.png)

## なぜコールバックを使うのか？（通常の関数と非同期処理を含む関数の違い’を添えて）
非同期処理を含む関数では、`戻り値を返す前に別の処理が実行されることがある`ことや`非同期なので戻り値を返すのに時間がかかる（ニュアンス的には前述と近いかも）`ことがあり、それらのことを対策をしたいから。
![asynchronous.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2915639/f83701db-145d-8db2-deb4-c1b19122f7dd.png)


- 通常の関数の場合

```swift:Swift
//通常、関数は呼び出された後、順番に処理を行い、戻り値を受け取る。
//そして、関数を呼び出した場合、次に待っている処理に進んでいく。
func someFunction() -> String {
    //何か処理をする
    //・・・
    
    return "この文字列を戻り値に返すよ"
}

//関数の呼び出し
//これが終わったら次の処理へ進む
someFunction()
```

- 非同期処理を含む関数の場合
```swift:Swift
//一方、非同期処理を含む関数では、「戻り値を返す前に別の処理が実行されることがある」ことや「非同期なので戻り値を返すのに時間がかかる」ことがある。
//非同期処理の画像
//そのため、非同期処理を含む関数では、「戻り値を受け取る前に呼び出し元の関数が終了する」（場合がある）。
//それを避けたいため、非同期処理が成功が完了したこと、失敗が完了したこと、それらの処理の完了をコールバックとして引数に渡されたクロージャーを使う。
func fetchData(completion: @escaping (Result<Data, Error>) -> Void) {
    let url = URL(string: "https://example.com/api/data")!
    let task = URLSession.shared.dataTask(with: url) { data, response, error in
        if let error = error {
            //失敗が完了したことの通知
            completion(.failure(error))
            return
        }
        guard let data = data else {
            let error = NSError(domain: "com.example", code: 0, userInfo: [NSLocalizedDescriptionKey: "Data is nil."])
            //失敗が完了したことの通知
            completion(.failure(error))
            return
        }
        //成功が完了したの通知
        completion(.success(data))
    }
    task.resume()
}

//最後にコールバック関数を呼び出して、非同期処理が完了した結果（成功したとき、失敗したとき）を受け取り、各々（成功したとき、失敗したとき）の処理を定義している。
fetchData { result in
    switch result {
    case .success(let data):
        print("Data received: \(data)")
    case .failure(let error):
        print("Error: \(error)")
    }
}
```

## おわりに
何かご指摘等ございましたらコメ欄までお願いします。

## 参考記事
[株式会社アールワークス：非同期処理の画像](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.rworks.jp%2Fsystem%2Fsystem-column%2Fsys-entry%2F21730%2F&psig=AOvVaw00hwXI51Wbdhg0Rwp_VVEH&ust=1683265076641000&source=images&cd=vfe&ved=0CAQQjB1qFwoTCIjqmZn52v4CFQAAAAAdAAAAABAb)

[[増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ)　](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88-Swift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AA%E6%96%87%E6%B3%95%E3%81%A8%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E5%85%BC%E3%81%AD%E5%82%99%E3%81%88%E3%81%9F%E8%A8%80%E8%AA%9E-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4297112132)
↑引用元
石川 洋資 (著), 西山 勇世 (著)
発行者：片岡 巌
出版社：技術評論社
印刷/製本：日経印刷株式会社

## 開発環境
- Xcode-13.4.1
- Swift version 5.7
Javaの特徴

## Java

オブジェクト指向プログラミング言語

プラットフォームに依存しない
→Windows、Mac、Linuxなどの異なるオペレーティングシステム上で実行できる

### Javaの特徴

- オブジェクト指向：クラス、オブジェクト、継承、ポリモーフィズムなどのオブジェクト指向の機能を提供

- ポータブル：プラットフォームに依存しない
　　　　　　Windows、Mac、Linuxなどの異なるオペレーティングシステム上で実行できる

- 型安全：静的型付け言語
　　　　       コンパイル時に型エラーを検出する
　　　　　　　　→安全なプログラムを開発できる

- マルチスレッド：マルチスレッドプログラミングをサポートしている
　              →複数のタスクを同時に実行できます。

- ガベージコレクション：ガベージコレクション機能を備えている
　　                  →プログラマはメモリ管理に関する問題を気にしなくていい
【完全なる覚書】参考文献記載方法


## 参考文献の記載方法
参考文献の書き方にも幾つか系統があり、いつも迷ってしまう。。
基本的にIT関連記事や公官庁記事は以下記載Web記事で記載したいと思う。

■コピペ用
考えるのがめんどかったのでコピペ用を記載した。
```
ページ名.「」.20xx-00,[https],(参照　２０２３-05-09).
```

■Web記事
サイト名. 「ページタイトル」. 更新日付, 入手先URL, （参照年月日）
> 例
環境庁. 「環境とは」. 平成20年版, 2008. https://www.env.go.jp, (参照 2023-05-04)

■個人が書いたWeb記事
著者名．「ページのタイトル」．Webサイトの名称．更新日付．入手先URL，（参照年月日）．
> 例
山田太郎．“ラジオ体操は正義”．Y!ニュース．2020-09，https://news.com，（参照 2023-05-04）．

## 参考文献
- 近畿大学中央図書館レファレンス課.「引用と参考文献の書き方」.2022/05, https://www.clib.kindai.ac.jp/search/pdf/guide_quote.pdf, (参照 2023-05-04).
- WEBMO.「【例文付】引用・参考文献・参考URLの基本ルールと書き方」.2021/02/18, https://webmo.co.jp/cl2011e/, (参照 2023-05-04)
- U-NOTE.「引用・Webサイトの参考URLの正しい書き方を解説｜プレゼン資料の「参考文献リスト」作成時の注意点も紹介」.2022/10, https://u-note.me/note/47488449#post-index-6, (参照 2023-05-04)
Tang-Nano-9K で AND 回路を作ってみた

# はじめに
　G.W.の課題の FPGA 開発として手始めに組み合わせ回路である AND 回路を作ってみました。

　開発環境は以下のとおりです。
- FPGA: GW1NR-LV9QN88PC6/I5
- EDA: Gowin V1.9.8.09 Education Edition (Windows)
- OS: Windows11

# Verilog ファイルの作成
　メニューバーの `File > New > Verilog File` から `top.sv` というファイル名で作成しました。内容は以下のとおりです。

```verilog
// top.sv
module top (
    input IN_A,
    input IN_B,
    output OUT_C
);

    // Tang-Nano-9Kの基板上に実装されているLEDは不論理なので反転する
    assign OUT_C = ~(IN_A & IN_B);

endmodule
```

# 物理制約ファイルの作成
　メニューバーの `File > New >  Physical Constraints File` から `top.cst` というファイル名で作成しました。内容は以下のとおりです。
```verilog
// top.cst
IO_LOC "IN_A" 79; // PIN79_IOT12B_1V8
IO_PORT "IN_A" IO_TYPE = LVCMOS33 PULL_MODE = DOWN;

IO_LOC "IN_B" 80; // PIN80_IOT12A_1V8
IO_PORT "IN_B" IO_TYPE = LVCMOS33 PULL_MODE = DOWN;

IO_LOC "OUT_C" 16; // PIN16_IOL26B_LED6
IO_PORT "OUT_C" IO_TYPE = LVCMOS33 PULL_MODE = UP;
```

　ピン番号はピン配置図から選択しました。ピン配置図は次のURLからダウンロードすることができます。
https://dl.sipeed.com/shareURL/TANG/Nano%209K/2_Schematic

　コネクタとFPGAのピン対応は次のようになっています。FPGAの79番がコネクタJ6の9番ピンに、FPGAの80番がコネクタJ6の8番ピンに対応していることが分かります。

<img width="60%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13938/9d83b3b7-c49d-5b95-8e09-ee6c39d496c1.png">

　LEDは次のようにFPGAの16番がLED6に対応しています。
<img width="60%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13938/560ac197-01a4-4dac-ce95-3dce17996ff2.png">

　メーカーサイト (https://wiki.sipeed.com/hardware/en/tang/Tang-Nano-9K/Nano-9K.html) のピンマップも参考にしてください。
<img width="70%" src="https://wiki.sipeed.com/hardware/zh/tang/Tang-Nano-9K/assets/clip_image010.gif">

# 回路図の確認
　問題なく回路が組めていれば、メニューバーの `Tools > Schematic Viewer` から回路図ビューワーを開いて、回路図を確認することができます。今回のHDLで生成された回路は次の通りです。意図した回路になっていることが確認できました。
![スクリーンショット 2023-05-04 140746.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13938/a138ca4f-51ed-21b1-e92c-30494d1c84c6.png)

# 動作確認
　ビットストリームを生成してFPGAに書き込んで動作を確認しました。写真はFPGAから供給される3.3Vを8番、9番ピンに入力してANDを取った結果、LED6が点灯している様子です。入力のどちらもHiでないと消灯することも確認しました。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13938/6d50129d-78bf-ba7b-a877-8c72960cf4ec.jpeg">

# おわりに
　入門としてごく簡単なものですが、意図した通りに動くと楽しいですね。また、このようなデバイスと開発環境が2,500円程度で手に入るということに感動しました。

# 参考文献
[1] CQ出版社. 2500円ボードで始めるFPGA開発 Vol.2. Interface. 2022, 12月号, 別冊付録１
[ 勉強会向け ] Ubuntu 22.04 LTS に Nmap をインストールする

# Nmap（Network Mapper） とは
ネットワークの調査およびセキュリティ監査等に使用するオープンソース（OSS）のツール．
ネットワーク上の機器探索の他，機器が実行しているOSやバージョン名を確認することができる．

Nmap.org : https://nmap.org/

# Nmap を Ubuntu にインストールする
:::note info
Ubuntu のインストールには触れません
:::

**1. パッケージリストを更新**
　※ターミナルを開いて実行
``` cmd
$ sudo apt update -y
```

:::note warn
 必要に応じてバージョンをアップグレード
```
$ sudo apt upgrade -y
```
:::


**2．Nmapをインストール**
``` cmd
$ sudo apt install nmap -y
```

**3. Nmap のバージョンを確認**
```
$ nmap --version
```

バージョンが確認できれば，勉強会の準備完了！

# （補足）Windows へのインストール
[nmap](https://nmap.org/download)は，公式サイトからWindows用の実行ファイルをダウンロードしてインストールもできます．
ここでは紹介のみ．．．
[VSCode]Dev Containerでdocker-composeが選択できない

# はじめに
Dev Containerでdocker-composeのファイルがあれば、選択できるっぽいのですが全く選択画面が出てこなかったです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312001/205db7c0-05e0-e911-4c07-271dd4b7004d.png)


# 結論
docker-compose.ymlがないといけないようでした。
docker compose v2環境でファイル名をcompose.ymlにしていたせいで選択できなかったようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312001/91ae7ba6-8348-09ce-599a-b371b8aa07de.png)
SymfonyのtwigでbootstrapのCSS(max-width)が反映されなかった

下記のviewpointの記述をしていなかった。 
	&lt;meta name="viewport" content="width=device-width, initial-scale=1"	&gt;
        	&lt;meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"&gt;

&lt;link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous"	&gt;
EC-CUBE4独自プラグインにトグルスイッチ付けてみた

# 基本環境
EC-CUBE 4.1.2-p2

プラグインcode:OriginalPlugin
追加する項目：add_itme

# Entityに追加

```:root/app/Plugin/OriginalPlugin/Entity/OriginalPlugin.php
/**
* @var boolean
*
* @ORM\Column(name="add_item", type="boolean", options={"default":true})
*/
private $add_item = true;

/**
 * Set add_item.
 *
 * @param string|null $add_item
 *
 * @return $this
 */
public function setAddItem($add_item)
{
    $this->add_item = $add_item;

    return $this;
}

/**
 * Get switch_1.
 *
 * @return string|null
 */
public function getAddItem()
{
    return $this->add_item;
}
```

# Formに追加
->add('[項目名]', ToggleSwitchType::class)

```:root/app/Plugin/OriginalPlugin/Form/Type/Admin/OriginalPluginType.php
use Eccube\Form\Type\ToggleSwitchType;

->add('add_item', ToggleSwitchType::class)
```

# Twigに追加
```:root/app/Plugin/OriginalPlugin/Resource/template/Admin/OriginalPluginType.twig
{{ form_widget(form.add_item) }}
{{ form_errors(form.add_item) }}
```
設計とはなんだ？

<h1>・はじめに</h1>
　この記事は最近プロダクトを作る機会があり、最終的には完成までにはいきついたのですが、あまりうまく作れませんでした。そこでなぜうまくいかなかったのかという理由を考えたところ、設計の部分が曖昧で明確にどのようなアプリを作るのかを設計の時点で決め切れていなかったことがうまくいかなかった理由ではないかと考え着いたので、この記事で「設計とはなにか」から設計はどのようにすればいいのかについて書いていきます。

<h1>・設計とは何か</h1>
　プログラミングにおける設計とは「どのようなプロダクトを作るのかを計画すること」だと考えています。そしてその設計にはウォーターフォール型であると、「<b>要件定義</b>」、「<b>基本設計</b>」、「<b>詳細設計</b>」に分かれています。

<h3>・要件定義とは</h3>
　<b>要件定義</b>とはあるアプリを作る中での機能を決めることです。例えば、ToDoリストのアプリを作成したい時なら、やることをリストに追加する機能、終わったものをリストから削除する機能、やることリストの編集画面の機能やその他クライアントや自分自身が欲しい機能を決めていくことを要件定義といいます。ここの要件定義で<b>どのようなプロダクトを作るのかというゴール</b>を決めることになります。

<h3>・基本設計とは</h3>
　<b>基本設計</b>とは機能をどのように搭載するのかを決めることです。ToDoリストで例えるなら、このような画面でここにボタンがあり、このボタンを押すとTodoの追加画面が出てきて、ここから追加できるなどの機能を決めていく段階になります。この段階ではまだプログラミングの知識が無い人や浅い人でも理解できるように作ります。

<h3>・詳細設計とは</h3>
　<b>詳細設計</b>とは、機能を具体的にどのように実装していくのかを決めていきます。ここでは設計図の「<b>クラス図</b>」や「<b>シーケンス図</b>」などの設計図を使ってプログラマが実際にそれを見て<b>プログラミングできるレベル</b>に落とし込みます。

<h1>・設計の重要性</h1>
　次に設計がどのような点で役に立つ物なのかについてみていきます。

<h3>・設計の重要な点</h3>
　①<b>バグを未然に防げる</b><br>
　　　設計をするメリットの１つ目としてバグを未然に防ぐことができることが挙げられます。設計は要件定義を行い、それに基づき基本設計をし、要件定義と基本設計に基づいて詳細設計を行うので機能の搭載のし忘れや設計をしっかりすることによって機能のプログラム同士がぶつかることなどを未然に防ぐことができます。<br><br>

　②<b>プログラミングの保守性を高められる</b>
　　　設計をするメリットの２つ目は保守性を高められる点です。設計の時点でDRY原則や疎結合にすることに気を付けることによって、コードの再利用性が向上し、さらに詳細設計によってどのようなクラスやデータベースを作るのかを決めるので、ロジックを全員の共通認識で実装でき可読性を上げることができます。

<h1>・詳細設計を詳しく見る</h1>
　次にプログラマにとって重要になる<b>詳細設計</b>について詳しく見ていきます。

<h3>・詳細設計ですること</h3>
　詳細設計では５つのことを行います。
<ol>
<li>基本設計で決めたプログラムの流れをさらに詳細化し、実際にどのように実装していくのかを決める</li>
⇒データの流れや加工の方法を決める。
<li>データ構造の定義</li>
⇒データをどのように、例えば配列を使うのか、ハッシュを使うのかなどを決めていく。

※データ構造の定義の方法
　どのようなデータなのかを把握する（データの種類やファイルの大きさなど）
<li>アルゴリズムの設計</li>
⇒データをどのように流すのか、どのように加工していくのかを具体的に決める。ここではソート、検索、最短経路処理などを行う。
<li>クラスやメソッドの設計</li>
　アルゴリズムを考えてどのようなクラスやメソッドを実装していくかを考える。
<li>テスト仕様書の作成</li>
　このプロダクトだとこのテストが必要などを考えてテストの仕様書を作っていく。
</ol>


<h1>・まとめ</h1>
　このように設計とは「<b>要件定義</b>」、「<b>基本設計</b>」、「<b>詳細設計</b>」の大きく３段階に分けられ、要件定義では<b>プロダクトのゴール</b>を、基本設計では「<b>機能の搭載</b>」を、詳細設計では「<b>機能の具体的な実装</b>」を決めていきます。<br>
　そして設計をすることのメリットとしては①「<b>バグを未然に防げる</b>」、②「<b>プログラミングの保守性を高められる</b>」という大きく2点あります。<br>
　最後に詳細設計では①「<b>基本設計の詳細化</b>」、②「<b>データ構造の定義</b>」、③「<b>アルゴリズムの設計</b>」、④「<b>クラスとメソッドの定義</b>」、⑤「<b>テスト仕様書の作成</b>」のこの５つを行います。
TeraTermでEC2にSSHログインできなかった件

転職活動も落ち着き、いざ実務開始だ！というところでゴールデンウィーク突入。
忙しさを理由にAWSを全く触っていなかったので、久しぶりにEC2立てて遊ぶかーと思っていたら

### …ログインできませんでした。

結論から言うとキーペアのタイプが悪さをしていたらしく、
RSAではなくED25519を選択する必要があったらしいです。

## 何が違うの？
ED25519はRSAと比べて
・同程度の安全性
・高速に処理でき、パフォーマンスが良い

という事ですが、以下の注意点もあるそうです。
・Windowsインスタンス、EC2 Instance Connect、EC2シリアルコンソールではサポートされない
・秘密鍵形式はデフォルトでpemとなり、ppkは選択できない

いいことばかりでは無いのですね。

## おわりに
超絶初歩的なところでつまづいてしまいました…お恥ずかしい…
私と同じ駆け出しエンジニアの一助になれたら幸いです。
Android Studio (Flamingo)のセットアップ

## 環境
- OS: Windows 11 Home

## 事前準備
- BIOSの設定で、Intel Virtualization Technology (VT-X)を有効にしておく
  - ∵AVD（エミュレータ）の高速実行のためのIntel HAXMインストールに必要
- Windowsの設定「Windowsの機能の有効化または無効化」で、以下を有効にしておく
  - Windows ハイパーバイザープラットフォーム
  - 仮想化マシンプラットフォーム
  - ∵Intel HAXMインストールに必要

## インストール手順
- 以下からセットアップバイナリをダウンロードする
  - https://developer.android.com/studio
  - 2023/05/03時点での最新版は `android-studio-2022.2.1.19-windows.exe` (Flamingo)
- ダウンロードしたセットアップバイナリをダブルクリックしてインストールする


## 初期設定

Android Studio 起動後、以下を実行。

### ビルド時の文字化け防止の設定

- Help > Edit Custom VM Options を選択
- 開いたファイルに以下を記載し、保存  
```
-Dfile.encoding=UTF-8
```
- Android Studio を再起動

### ビルド等での詳細表示の設定

- File > Settings を選択
- Build,Execution,Deployment > Compiler を選択
- Command-line Options: `--stacktrace` を指定

### プラグインのインストール

- File > Settings を選択
- Plugins を選択
- 必要なプラグインをインストール
 - 例: IdeaVim, Save Actions
Gradleバージョンアップに伴うGradleプロジェクトの更新

## 前提

- バージョンアップ前のGradleで作成されたプロジェクトがあること
- Gradleのバージョンアップが完了していること
  - https://qiita.com/yiwa81/items/ccfd6f397a949a0fbe95

## 対象のGradleバージョン

- バージョンアップ前: Gradle 7.0.2
- バージョンアップ後: Gradle 8.0.1

## Gradleプロジェクトの更新の手順

- ターミナル（PowerShell）を開き、プロジェクトのフォルダに移動
- 以下のコマンドを実行
````
./gradlew wrapper --gradle-version=8.0.1
````
Raspberry Pi OS 2023-05-03 Release-note 翻訳

(追記: 2023/10/11にRaspbian OS 2023-10-10がリリースされています)
https://qiita.com/utaani/items/4d0b30bba7af172850b4

https://downloads.raspberrypi.org/raspios_full_armhf/release_notes.txt

2023-05-03:
- 64bit版のMathematicaが推奨アプリに追加されました。
- バグ修正 - CPU 温度プラグインで時々発生するセグメンテーション違反
- バグ修正 - 画面の向きを変更すると X サーバーがクラッシュする
- バグ修正 - X サーバー DPMS が機能しない
- Mathematica を 13.2.1 に更新
- Matlab を 23.1.0 に更新
- Chromium が 113.0.5672.59 に更新
- RealVNC server が 7.0.1.49073 に更新
- RealVNC viewerが 7.0.1.48981 に更新
- Raspberry Pi Imager を 1.7.4 に更新
- VLC HW アクセラレーション パッチを更新
- libcamera
 - 統計機能の追加 
 - AGC アルゴリズムで誤った計算を引き起こすオーバーフローを修正
 - IMX296 センサーのチューニングを改善
- libcameraアプリ
  - libav を使用したオーディオのリサンプリングとエンコーディングの処理を改善
  - QT プレビュー ウィンドウのレンダリングのパフォーマンスを向上
  - DNG writerで 16bit Bayer のサポートを追加
  - フレームレートが 0 に設定されている場合のエンコーダーのロックアップを修正
  - サムネイルのレンダリングの改善
- picamera2
  - ハードウェア MJPEG エンコーダーを使用する MJPEG サーバーのexampleの追加
  -  1 つの Qt アプリで 2 つのカメラからのプレビューを表示するexampleの追加
  -  H264 エンコーダーがSPS ヘッダーのフレーム時間間隔に対応
  -  H264 エンコーダーが正しいプロファイル/レベルでアドバタイズ必須に
  -  H264 エンコーダーが一定の品質パラメーターに対応
  -  Exif DateTime および DateTimeOriginal タグを追加
  -  さまざまなバグ修正 (詳細については、Picamera2 のリリース ノートを確認)
- バグ修正 - GTK スイッチ コントロールにキーボード ハイライトが表示されるようになりました
- いくつかの翻訳を追加
- Raspberry Pi ファームウェア 055e044d5359ded1aacc5a17a8e35365373d0b8b
- Linux カーネル 6.1.21
Octaveで平面グラフを出力するには

## はじめに ##
GNU Octaveは主に信号解析などに用いられるフリーの計算ソフトです。
やや癖がありますが、グラフも作成できます。
動作はver8.2.0で確認しています。

## 公式サイト ##
↓ダウンロードはこちらから

https://octave.org/

## Octaveの特徴 ##

1\.他の言語で必要な;等の改行用の文字が無くてもコードが通ります。　
  ですが、';'が存在してもエラーにはなりません。

2\.円周率のπはpiで表記します

3\.配列の表記方法
   
~~~matlab:1行4列の配列　 
a = [1 2 3 4] 
（スペースまたは','が使えます。）
~~~

~~~matlab:4行1列の配列
a = [1;2;3;4]
~~~
4\.行列の表記方法
~~~matlab:a =(1 2 3 4 5 6 7 8 9 10) 
a = 1:10
1~5が1行10列の行列として表記されます。
~~~

~~~matlab:a = (1 3 5 7 9) 
a = 1:2:10
1~10の要素を2つ刻みで並べた行列として表記します。刻み幅を指定しない場合は1になります。
~~~

~~~matlab:転置
a'
配列aの行と列を入れ替えます。
~~~

5\.配列の計算
　配列の要素を計算で使用する場合は演算子の前に'.'（ピリオド）が必要です。

6\.for文やif文などの書き方
　｛　｝の代わりに終了する箇所で"end"を書き込みます。

7\.ラベル表記
~~~matlab:ラベルの設定
xlabel('x')
x軸のラベルをxに指定する
ylabel('y')
y軸のラベルをyに指定する
~~~

8\.グラフの出力
~~~matlab:出力コマンド
plot(x,y)
x,yを線のグラフとして出力（関数グラフ向き）

stem(x,y)
x,yを棒グラフのような形で出力（波形解析向き）

plot(x,y 'black')
x,yのグラフを黒い線で出力

hold on

hold off
hold onとhold offの間に挟んだグラフを重ねて出力
~~~

9\.コメント
%の後ろの1行はコメントとして処理されます

参考

https://qiita.com/stpete_ishii/items/eb5b0855c8a151386e08

およそ4年前の記事ですが当時からOctaveの仕様は大幅な変更はされていないようです。
コンピュータシステム基礎_システムの構成

# コンピュータが扱う情報の基本
・コンピュータは、0と1を使った論理回路を数限りなく組み合わせることによって、複雑な情報処理を実現している
・コンピュータで扱う最小の単位を「ビット」といい、8ビットを「1バイト」とよぶ。そのコンピュータで最も一般的な処理サイズを「ワード」とよび、通常は16、32、64ビットのいずれかとなる
・ビット列の並びがどのような文字と対応するのかを決めるのが「文字コード」。文字コードには「シフトJIS」、「EBCDIC」、「ASCII」、「EUC」、「Unicode」などがある
・日常使う数字は、「10進数」。コンピュータの内部では、「2進数」を使う。2進数は、単純だが桁数が多くなるため、8進数や16進数を使うことが考えられた。
・各桁の基本となる数を「基数」という。10進数の基数は10であり、2進数の基数は2。異なる基数で表現することを「基数変換」と呼ぶ。また、各位が持っている数値を「重み」という
・2進数から10進数への変換は、1の値を持つ位の合計を求める
・10進数を2進数に変換する方法は、重み対応表を使う方法と割り算を使う方法がある
・数値データの表現方式として、「固定小数点数」、「浮動小数点数」がよく使用される。
論理演算は、論理値について「論理和」、「論理積」、「否定」の3つの演算を行う
・論理演算を行う電気回路のことを「論理演算回路」という。
代表的な論理演算回路には「AND」、「OR」、「XOR」、「NOT」がある
・複雑な計算を行う演算回路は、多くの論理回路の組み合わせで作られており、「半加算回路」、「全加算回路」などがある


# コンピュータの制御と記憶のしくみ
・コンピュータが解釈、実行できるプログラムのことを「機械語のプログラム」という
・コンピュータの5大機能とは？

・CPUとは、コンピュータの5大機能の中で、「制御」と「演算」を行う装置のことで、「制御装置」、「演算装置」、「レジスタ」、「クロック」などで構成されている
・記憶装置とは、コンピュータ内でプログラムやデータを記憶するための装置のことで、「主記憶装置」と「補助記憶装置」に大別される。処理すべき業務が発生すると、データやプログラムは補助記憶装置から主記憶装置に読み込まれ実行される
・「キャッシュメモリ」とは、CPU内部に設けられた高速な記憶装置のこと
・ メモリには、大きく分けて「RAM」と「ROM」がある
→ RAMは、読み書きが可能なメモリ。ただし、コンピュータの電源を切ると、RAMに書き込まれたプログラムの内容は消えてしまう。動作が高速なため、主記憶装置に使用されている
→ ROMは、命令の読み出しだけを行うメモリで、コンピュータの電源を切っても、ROMに書き込まれたプログラムは消えない。書き換える必要がない情報や、書き換えられては困る情報を記憶させる場合に使用する
・ 補助記憶装置には、磁気ディスク、光ディスク、フラッシュメモリ、磁気テープなどがある
→ 光ディスクには、CDやDVD、ブルーレイディスクなどがあります。
→ フラッシュメモリには、USBメモリやSDメモリカードがあります。
・磁気ディクスでは、ディスク上の同心円の1つ1つを「トラック」、トラックを区切った扇形の部分を「セクタ」、トラックが重なっている円筒状の部分を「シリンダ」といいます。

# 入出力装置
・データを外部から取り込む装置が「入力装置」、処理した結果を外部に取り出すのが「出力装置」
・入出力装置は、人間が利用する文字や図形、音声などをコンピュータが理解する電気信号に相互変換する。電気信号は、0と1を組み合わせた「ビットパターン」で表現される
・コンピュータに接続されている周辺機器のほとんどは、「割込みコントローラ」に接続されている。割込みコントローラは割込みが発生したときにCPUに知らせる回路のこと
どの周辺機器から割込みがあったのかを識別するために、それぞれの機器には、「割込み番号（IRQ)」を割り当てる。割込みが発生するとCPUは実行中のプログラムを中断して処理を行い、終了するとまたもとの処理を続行する
・「入出カインタフェース」とは、主記憶装置と周辺装置との間でやり取りされるデータの出入り口のこと。
インタフェースの異なる装置同士を接続することはできません。
・1本の信号線を使って、データを1ビットずつ転送するのが「シリアル形式」の転送
・複数の信号線を使って、データをまとめて転送するのが「パラレル形式」の転送
・CPUが周辺機器との間でやり取りをするために使うインタフェースが「1/0ポート」
・バスは、用途に応じて「内部バス」、「外部バス」、「拡張バス」などがある
一度に送れるデータ量のことを「バス幅」といい、CPUの性能指標として使用される

# コンピュータシステムの構成
・コンピュータシステムには、安心して利用できること「信頼性」が必要
・信頼性を推し量る尺度として「RASIS（信頼性・可用性・保守性・保全性・安全性）」がある
・ 信頼性を向上させるシステムには、「デュアルシステム」、「デュプレックスシステム」、「マルチプロセッサシステム」、「ロードシェアシステム」、「タンデムシステム」がある
・「集中処理システム」とは、センターに1台の大型ホストコンピュータを設置し、全データをホストコンピュータで処理するシステム
・「分散処理システム」とは、データ処理機能を備えた複数のコンピュータを各地に設置し、互いに処理を分担しながら、全体として機能するシステム
・分散処理システムは、システム構成の違いにより「水平分散」、「垂直分散」、分散させる対象の違いにより「負荷分散」、「機能分散」に分けられる
・「クライアントサーバーシステム」は、クライアントが要求したサービスを、サーバーが要求に基づいて処理を行い、結果を返すシステム
wsl2にrubyをインストールして、Jekyllを使えるようにするまで

# はじめに  
Github pagesでJekyllを使うのに、いろいろエラーが出たので備忘録として残す  
  
# 実行環境  
windows11  
wsl2 Ubuntu 20.04  
ruby 3.0
jekyll 4.3.2
  
# 環境構築  
Rubyがインストールされているか確認
```
ruby -v
```
入っていなければ、Rubyのインストール
wslのターミナル内で実行  
jekyllの公式を参考にしたのですが、この方法ではエラーがでてrubyのバージョン3.0を上げて回避。
```  
sudo apt-get install ruby-full build-essential zlib1g-dev
```  
 
RubyGemsのパッケージ（gemsと呼びます）をrootユーザーでインストールすることは避けてください。  
その代わりに、ユーザーアカウント用のgemインストールディレクトリを設定します。  
以下のコマンドは、~/.bashrc ファイルに環境変数を追加して、gem のインストールパスを設定します：
```
echo '# Install Ruby Gems to ~/gems' >> ~/.bashrc
echo 'export GEM_HOME="$HOME/gems"' >> ~/.bashrc
echo 'export PATH="$HOME/gems/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
```  
Jekyllをインストールします
```
gem install jekyll bundler
```
これでjekyllを使い始める準備ができるはずと思ったがエラーで入らず  

同じエラーがstackoverflowであったので試すも、rvmがないエラー
[Installation messed up with Ruby: Unable to install jekyll] https://stackoverflow.com/questions/75452016/installation-messed-up-with-ruby-unable-to-install-jekyll

stackorverflowで下記のエラーを見つけまずrvmをインストール
[No command 'rvm' found, but there are 20 similar ones] https://stackoverflow.com/questions/39643791/no-command-rvm-found-but-there-are-20-similar-ones
上のリンクを参考に下記を実行。途中でエラーがでたが、メッセージを参考に実行
```
sudo apt-get install curl
curl -L https://get.rvm.io | bash -s stable
source ~/.rvm/scripts/rvm
rvm requirements
```

ruby をインストールしてjekyllをインストール
```
rvm install 3.0
rvm use 3.0.0
rvm -v
rvm gemset update
gem install jekyll
jekyll -v
```

jekyllのテーマをローカルで使うためにgithub-pagesをインストール 
```
gem install github-pages
```
インストールしたが、イマイチ使い方がわからず。

テーマのサイトからgit:cloneしてしたほうがよさそうです
クローンしたものをそのままjekyllで実行できました


[クイックスタート](http://jekyllrb-ja.github.io/)を参考に実行。
```
jekyll new my-awesome-site
cd my-awesome-site
bundle exec jekyll serve
```
メッセージに出てきたアドレスをクリックして確認
ctrl-cでストップ



続けてテーマ設定を書きたかった長くなったので別の記事にします  

## 終わりに  
こんなに簡単のページが作れるなら、wordpressでブログを作るより楽そう。軽いしね。



# 参考にしたページ  
[Rubyのインストール] https://www.ruby-lang.org/ja/documentation/installation/#apt
[jekyllrb-ja] http://jekyllrb-ja.github.io/docs/installation/ubuntu/
C++のクラス図をGitHub Actionsで自動生成する

# はじめに
GitHub Actions から C++ のクラス図を自動で生成し、README などの Markdonw ドキュメントから参照できるようにする方法についてまとめます。

## サンプル
後ほど解説をまとめます。

```
name: documentation

on:
  push:
    branches:
      - master
    paths-ignore:
      - "docs/**"
      - "**.md"

jobs:
  generate_plantuml:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive
          ref: ${{ github.head_ref }}
          fetch-depth: 0
      - name: Setup Java
        uses: actions/setup-java@v1
        with:
          java-version: "11"
      - name: Setup Python 3.8
        uses: actions/setup-python@v4
        with:
          python-version: 3.8
      - name: Install dependencies
        run: |
          sudo apt install -y graphviz
          pip install hpp2plantuml
      - name: Generate PlantUML
        run: |
          mkdir -p docs/pu
          hpp2plantuml -i "./**/*.h*" -o docs/pu/class.pu
          java -jar ./tools/plantuml/plantuml.jar -svg ./docs/pu/class.pu -charset UTF-8
      - name: Count changes
        id: changes
        run: |
          git add -N .
          echo "::set-output name=count::$(git diff --name-only | wc -l)"
      - name: Commit files
        if: steps.changes.outputs.count > 0
        run: |
          git config user.name github-actions
          git config user.email github-actions@github.com
          git add ./docs/
          git commit -m "generated"
      - name: Push changes
        uses: ad-m/github-push-action@master
        with:
          force_with_lease: true
```
VSCode コードが編集できない問題

# VScodeが編集できない。

2023年5月4日の朝。
マークダウン形式のコードを編集しようとしたところ、なんにも編集できない状態だった。

10秒ほど経過: バックスペースが効かない。
全ファイル: 同じ症状。

### 結論 エクステンションをすべて無効化することで解決

バックスペース問題をとりあえず治した記録です。

## １. 更新履歴順にエクステンションを無効化
@updates と記入し、更新順に並べる。
![スクリーンショット 2023-05-04 9.53.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919895/1101d123-08b5-03ff-2d9a-137465380eea.png)

関係してそうな拡張機能をガシガシ無効化→再起動

### 結論：変化なし。



## 2. VSCodeのQ&Aを確認

- VSCodeのバージョンアップで、日本語変換がおかしくなったよー！というスレッドが立っていた。
- 今回のエラーに関しては見つからず。

## 3. jsonがおかしくないか

VSCodeのjsonファイルに問題があった。

```json
"[css]": {
    "cSpell.showAutocompleteSuggestions": true
      "editor.tabSize": 2
},
```
コロンの後ろにカンマ（,）が抜けているため、JSON構文エラーが発生してる。
正しい形式は次のとおり。

```json
"[css]": {
    "cSpell.showAutocompleteSuggestions": true,
    "editor.tabSize": 2
},
```
修正後、VSコードでJSONファイルを再読み込みした。
バックスペースは正常に動作しなかった。

## 4. エクステンションをすべて無効化

なおった！！
![スクリーンショット 2023-05-04 10.06.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919895/1b264396-af0a-7867-fdf1-7f4bfc6c562c.png)

どのエクステンションが影響していたのか、ひとつひとつ調べる必要がある。

...そのうちやろう。
Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その５-シートに書いた内容を録音（音声ファイルに保存する）事例

[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その１](https://qiita.com/tom-sobue/items/aac051de117a45f9fecf)
では、Windowsに標準で組み込まれている読上げの声で、Harukaの声以外を使って読上げる方法

[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その２](https://qiita.com/tom-sobue/items/319c1943df9dd30c081a)
では、読上げ内容を音声ファイルに保存する方法

[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その３](https://qiita.com/tom-sobue/items/3e02e7569cfbe8a90f12)
では、スピード、ピッチ（声の音程）、更には、強調の指示方法

[Excel VBA（マクロ）でセルの内容を声を変えて読上げ -その４](https://qiita.com/tom-sobue/items/e51cbdec59af545b232a)
で、実際のシートに書いた内容で読上げする事例

について、紹介しました。

今回は、シートに書いた内容を録音（音声ファイルに保存する）事例を紹介します。

Excelシートの配置を次のようにします。
|   |A   |B   |C   |D   |E   |
|:-:|:--:|:--:|:--:|:--:|:--:|
|1  |スピード|強調 |ピッチ |話し手|内容|
|2  |2      |      |-2|一郎  |いつもお世話になっています。|
|3  |-1     |Y      |4|あゆみ|ありがとうございます。|
|4  |       |        ||      | |

2行目からデータが記述され、
一郎に少し早口で低めの声で「いつもお世話になっています。」
あゆみに少しゆっくりめの高めの声で、ちょっと強めの口調で「ありがとうございます。」
と話すことを示します。
スピードとピッチを調整して、ＯＫと判断したら、録音をファイルに保存します。

基本的に、音声をスピーカーからファイルに切り替えるだけですので、読上げに対して、出力先の指示をするだけとなります。
その事例を示します。

~~~~diff_VBA
'行、列変数
Dim rw, col, erw, ecol As Integer
'ワークシート変数
Dim sht As Worksheet
'SAPI.SpVoice用オブジェクト変数
Dim spi As Object
'SAPI.SpFileStream用オブジェクト変数
Dim vRec As Object
'SAPI.SpObjectTokenCategory用オブジェクト変数
Dim cat As Object
'声のオブジェクト変数 はるか、Zir、一郎、あゆみ、さやか
Dim HarukaVoice, zirVoice, IchiroVoice, AyumiVoice, SayakaVoice As Object
'声のオブジェクト変数
Dim voic(5) As Object
'セルの読込変数
Dim cel(5) As Variant
'XML指示記述用
Dim mae, ato As Variant

Sub 録音()
    '保存用ファイル名
    Dim fName
    '日付用変数
    Dim today As Date
    
    'SpeechAPI設定
    Set spi = CreateObject("SAPI.SpVoice")
    '録音用設定
    Set vRec = CreateObject("SAPI.SpFileStream")
    
    '今日
    today = Date
    'ファイル名をyyyymmdd.wavに設定
    fName = Year(today) & Right("0" & Month(today), 2) & Right("0" & Day(today), 2) _
    & ".wav"
    
    '保存先名をダイアログボックスを開いて設定
    fName = Application.GetSaveAsFilename(fName, "音声,*.wav")
    'キャンセルの場合は、終了
    If fName = False Then Exit Sub
    '保存用にファイルを上書きで開く
    vRec.Open fName, 3
    '録音先設定
    Set spi.AudioOutputStream = vRec
    
    '現状のシート
    Set sht = ActiveSheet
    '使用している最終行を検出
    erw = sht.Range("A1").SpecialCells(xlCellTypeLastCell).Row
    For rw = 2 To erw
        'A-1:速度 B-2:強調 C-3:声色 D-4:話し手 E-5:読上げ内容
        '1列を読込
        For col = 1 To 5
            cel(col) = sht.Cells(rw, col)
        Next
        'XML指示を初期化
        mae = ""
        ato = ""
        '速度
        Call rat(cel(1))
        '強調
        Call emp(cel(2))
        '声色
        Call pit(cel(3))
        '読み手
        Set spi.Voice = voic(tok(cel(4)))
        
        '読上げ
        spi.Speak mae & cel(5) & ato
    Next
    '完了したらファイルを閉じる
    vRec.Close
    '録音オブジェクトを解放
    Set vRec = Nothing
    'SAPIを解放
    Set spi = Nothing

End Sub
~~~~

録音するファイル名については、その２で説明したものをそのまま使っています。
その他のPrivate Sub や Private Function につては、その４で説明したものを使用しています。

[その６ -読上げる内容を調整し易くする事例- へ続く](https://qiita.com/tom-sobue/items/fd35a4259bfb7291dc1c)
Proxmox7 を試してみる　その２　ネットワーク

# USB-LANを差してみる
折角 Proxmox をセットアップしたので物理的に USB-LAN を差してみる。これネットワークの勉強をかねています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/635034b4-73f0-e7cc-3ad1-fbada6afebcb.png)

[その１](https://qiita.com/murachi1208/items/faf264d3771d9e2fb3b9) でも記事にしましたが、デバイスはすぐ認識します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/984ac191-d89e-0ad8-0d6b-1900016e1465.png)

# やりたいこと
物理NICを使用し下記構成にしてみます。[V]は [Vyos](https://vyos.io/) というルータソフトになります。物理NICを用意しているのは将来的にネットワークを分離したいためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/622d808c-51f7-7979-4042-4ca629fd9e3f.png)

# 物理NICの準備
ネットワークの「作成」ボタンを押下し「Linux Bridge」を選択します。ブリッジポート部分に物理デバイス（下記だと①と②）を指定します。ここでブリッジポートを何も指定（空）しないと仮想NICの指定となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/0c2f368f-54e3-e0c4-e361-730f2aaa0eb5.png)

ここで設定した内容は「設定を適用」ボタンを押下すると `/etc/network/interfaces` に出力されます。なんでも細かい設定は直接このファイルを編集してどうこう・・・らしいですが、今回はそこまでやらないです。

あと下記の動画がわかりやすい（字幕日本語で見るべしｗ）

<iframe width="560" height="315" src="https://www.youtube.com/embed/qTbeHpdHcqs" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


# 仮想マシン（VM）側でのネットデバイス指定
仮想マシンのハードウエアで、上記で作成した ①=vmbr1 ②=vmbr2 ネットデバイスを追加するだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44540/934e2d9d-94d1-26cf-f719-6bfb0b6b6506.png)

ちなみに Vyos 20230429 を使ってみてるんだど `config.boot` みるとMACアドレスが出力されていない。`ip` コマンドでみればいいんだけど、ちょいと見ずらいなああ・・・

```text:config.boot
interfaces {
    ethernet eth0 {
    }
    ethernet eth1 {
    }
    ethernet eth2 {
    }
    loopback     lo { }
}
```

# 参考にさせて頂いたサイト様
・[pfSenseを使って、Proxmox VE上のラボ環境構築をしてみた](https://devblog.lac.co.jp/entry/20220413)
・[ProxmoxでtrunkとVLANを併用する](https://cer12u.hatenablog.jp/entry/2023/02/19/113831)
AKS Essentials ClusterをAzureに接続する方法

### はじめに

以前[AKS Edge EssentialsをWindows11にインストール](https://qiita.com/k-kimino/items/e6fe6b363bb5701479bf)し、ブログにしました。今回はAzureから管理できるようにするためにAzureに接続します。

### Azure PowerShell Modulesをインストールする

まずは準備。以下のコマンドで必要なAzure PowerShellモジュールをインストールします。

```
Install-Module Az.Resources -Repository PSGallery -Force -AllowClobber -ErrorAction Stop  
Install-Module Az.Accounts -Repository PSGallery -Force -AllowClobber -ErrorAction Stop 
Install-Module Az.ConnectedKubernetes -Repository PSGallery -Force -AllowClobber -ErrorAction Stop
```

### サービスプリンシパルを作成する

リソースをAzure Arcにオンボードする際の認証に使うためのサービスプリンシパルを作成します。Microsoft.Kubernetes connected clusterの役割を指定します。
![enrollazure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/a6993ff1-4026-798a-1733-9dba2a5fee38.png)

### aksedge-config.jsonファイルを作成する

aksedge-config.jsonを出力します。
```
New-AksEdgeConfig -DeploymentType ScalableCluster -outFile .\aksedge-config.json | Out-Null
```

Arcの項目を入力します。各項目の説明は[Microsoftドキュメント](https://learn.microsoft.com/ja-jp/azure/aks/hybrid/aks-edge-howto-connect-to-arc#step-2-configure-your-azure-environment)を参照。
![config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/68348c00-fdbb-152a-d43d-3ba0cffbd672.png)

### Azureに接続する

以下のコマンドで先ほど作成したコンフィグファイルを使ってAzureに接続します。
```
Connect-AksEdgeArc -JsonConfigFilePath C:\AKSEdgeE\aksedge-config.json
```

失敗しました。ガーン。
![erroratregister.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/e737b0bc-e367-68c2-165d-a0526a7a5511.png)

Microsoft.kubernetesが登録されてないと怒られていますね。[Microsoftドキュメント](https://learn.microsoft.com/ja-jp/azure/aks/hybrid/aks-edge-howto-connect-to-arc#prerequisites)に立ち返ってみると前提条件で必要なリソースプロバイダーを有効にするとありましたすみません。

### 必要なリソースプロバイダーを有効にする

Azureのサブスクリプションのページからリソースプロバイダーを有効にします。
![resourceprovider.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/3b6f3bf7-26f6-5743-5fbe-ebaf0675720b.png)

### Azureに今度こそ接続する

今度こそAzureに接続します。無事にAzure Arcがオンボードされ、Azureから管理できるようになりました。
![successregister.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/82a305c3-7fa4-56b1-b65e-c880c9c0d067.png)
![azureportal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322105/37b22547-dc5c-ca5a-58a1-8c4e35a00317.png)

### まとめ

AKS Edge ClusterをAzureから管理できるようにしました。前提条件を見落としていて少し後戻りしましたが、本来はあまり詰まるポイントもなく簡単にAzureに接続できる印象です。

### 参考

[Connect your AKS Edge Essentials cluster to Azure Arc](https://www.thomasmaurer.ch/2023/05/connect-your-aks-edge-essentials-cluster-to-azure-arc/)
ネットワークについて（サブネット）

下記の応用情報講座で学習したことをアウトプットしたいと思います。

https://www.udemy.com/course/ouyou_joho/

## サブネット
IPアドレスを分割し、管理しやすくするために使用されるネットワーク上の論理的なサブグループ。

> 「1つの大きなネットワークとして管理すると大変なので、複数の小さなネットワークの集まりとして管理しますかね」のときの、それぞれのネットワークのこと
https://wa3.i-3-i.info/word11973.html

作業室と会議室でネットワークを分けたい場合、異なるサブネットを定義して、それぞれ独自のIPアドレスを割り当てることができる。
これにより、作業室と会議室のネットワークを分離し、それぞれのネットワークで異なるセキュリティポリシーを定義することができる。
どうやって違うネットワークか判別する方法はIPアドレスのネットワーク部を見て判断する。

サブネット1：192.168.1.xxx/24
サブネット2：192.168.2.xxx/24

備考：
IPアドレスはネットワーク部＋ホスト部で成り立つ。

### ネットワーク部
>そのIPアドレスが属しているネットワークを識別するための部分です。そのIPアドレスが、どのネットワークで使われているのかがわかります。

### ホスト部
>ネットワーク内のコンピュータを識別するための部分です。そのIPアドレスが、ネットワーク内のどのコンピュータに割り当てられているかがわかります。 

参考記事：
https://livra.geolocation.co.jp/iplearning/173/

## サブネットマスク
>IPアドレスのうち、ネットワークアドレスとホストアドレスを識別するための数値。コンピューターが同じLANにいるかを判断する際に利用されることが多い。
https://mypage.otsuka-shokai.co.jp/contents/business-oyakudachi/words/subnet-mask.html

通常サブネットマスクはネットワークアドレスを取り出すために使用されるとのこと。
（ホストアドレスを取得したい場合は、サブネットマスクのビットを反転させれば良い。）

同一ネットワークの例（通信可能）
PC1
IPアドレス: 172.16.0.1
サブネットマスク: 255.255.0.0
→サブネット：172.16.＊.＊

PC2
IPアドレス: 172.16.1.1
サブネットマスク: 255.255.0.0
→サブネット：172.16.＊.＊

違うネットワークの例（通信不可）
PC1
IPアドレス: 172.16.0.1
サブネットマスク: 255.255.255.0
→サブネット：172.16.0.＊

PC2
IPアドレス: 172.16.1.1
サブネットマスク: 255.255.255.0
→サブネット：172.16.1.＊

参考記事：

https://www.cman.jp/network/term/subnet/




## LANセグメント
>1つのLANにパソコンやルーター、サーバー、プリンタなどを接続することで、相互通信ができるようになります。各LANはインターネットの中に無数に点在する小さな固まりのネットワークです。このように、1つの範囲内に区分された小さなネットワークの固まりがセグメントと呼ばれます。
https://business.ntt-east.co.jp/bizdrive/column/dr00101-023.html#:~:text=1%E3%81%A4%E3%81%AELAN%E3%81%AB%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3,%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%88%E3%81%A8%E5%91%BC%E3%81%B0%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82
FlutterエンジニアがJetpack Composeを学んでみた(varとval編)



FlutterエンジニアがKotlinのJetpack Composeを学んでみることにしました。その際に、Flutterだとこのような使い方をすると言う理解をしてみると、理解しやすいのではないかなと思い、記事を書いてみました。

とても簡単な内容となっていると思いますが、Flutterエンジニアが理解しやすいものになれればなと思っています！（逆にAndroidエンジニアがFlutterを学習できるといいなと思っております！！）


# varとvalについて

Kotlin には変数を定義するためのキーワードとして、val と var が用意されています。

### val
・再代入できない参照を保持するための変数(immutable reference)
<b>・Flutterで言うところのfinalになる。</b>


### var
・再代入可能な変数 (mutable reference)
<b>・Flutterで言うところのvarになる。(同じ)</b>



# 使用例
### Kotlin
```kotlin
val a = 1
val name: String = "John"

a = 2 //NG(Val cannot be reassigned)
name = "Ryutaro" //NG(Val cannot be reassigned)

var b = 1
b = 2 //OK
```

### Flutter
```dart
final b = 1;
final user = "taro";

b = 2; //NG
user = 'ken';//NG

var a = 1;

a = 2;//OK
```



# 参考文献


https://maku77.github.io/kotlin/basic/var.html
#Slack Bolt for Pythonを使ったアプリ開発のハマりどころ2

前回はこちら

https://qiita.com/geeorgey/items/6eb8dfadeded740cc8f7

ちょっとしたことなんだけど気付かないとハマっちゃうよねみたいな話し
今回は本当にしょうもないことで３日くらい溶かしてしまい反省している
またやってしまう可能性があるので、忘れないようにここに記しておく
自分に対しての備忘録

## SCOPE設定に気を付けましょう
著者の場合、ローカル、ステージング、本番環境の3環境があり、それぞれテストをするということをやっています。
Slackのアプリ開発においては、Slack側で作ったアプリの設定でスコープの範囲を決めることに加えて、開発するアプリ側にもスコープ設定が必要になります。
SCOPE設定を変更する場合は
- すべての環境のSlackアプリのSCOPE設定を書き換える
- すべてのローカル環境のSCOPE設定を書き換える

事が必要になり、3環境あるので6箇所を同じにしておく必要があります
これをやらないと権限不足でエラーになるということが置きますので気を付けるように

## ファイル周りで大いにハマる
Slackでファイルを扱う場合は、メッセージに添付されたファイルを以下のような形で取得する必要があります

https://github.com/seratch/deepl-document-translator-for-slack/blob/main/app.py#L180-L183

```python
        input_document = requests.get(
            url=file.get("url_private_download"),
            headers={"Authorization": f"Bearer {client.token}"},
        ).content
```
取得したデータをよしなにしてあげればよいのですが、ここで先程言ったSCOPEの設定ができてないとうまくいきません。
files:read権限を付与してください。
僕はそのせいで数日を無駄にしたのですが、権限を付与していない場合にこれをやって何が起きるかというと、エラーが返ってくれば良いのに、こんなHTMLが返ってくるんです。

![Sign_in_to_Leave_a_Nest___Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/9299836f-365b-07c9-f73b-773756ccfc59.png)

一見、データは取得できているように見えるのですが、そんなことは無いのでした。
僕の場合はローカルと本番ではSCOPE設定が問題なかったのですが、Stagingに権限が振られてないというアホなミスを犯したために気付くのにめちゃくちゃ時間がかかってしまった。
すぐにファイルを調べれば良かったんですけどね。
処理に使う一時ファイルは
`os.remove(filepath)`
して削除していたので確認するのをサボってしまった

## Heroku環境上のファイルをダウンロードするには
こんなふうに書きます。ターミナルで実行

```zsh
heroku ps:copy Heroku側のファイルパス --app=アプリ名 --output=ローカル側のファイルパス
```

という形。具体的にはこんな形で、Macのダウンロードフォルダにtmpフォルダのファイルが落ちてきます

```zsh
heroku ps:copy tmp/temp.pdf --app=slack-timeline-stg --output=~/Downloads/temp.pdf
```

ファイルを確認しさえすれば、正しいファイルかどうかわかるのに、それをサボったがためにその後の処理が全然うまく行かなくて無限に時間を吸われてしまいましたとさ。

## Herokuのフォルダ構成でハマる
一時ファイルをどこに保存するかということで、アプリのフォルダ直下に tmp フォルダを置いてそこに入れておこうと思ったんですよね。
一時ファイルは /tmp
に置くんだ！と書いてあったので。
それで律儀にフォルダ置いてみたんですけどなんかおかしい。なぜかというと

/tmp ←Herokuで最初から置いてあるディレクトリ
/app/tmp　←自分で作ったディレクトリ

こんな形になっていた訳です。なるほどそうだったのか…
デプロイしたプロジェクトはHeroku上では
/app
以下に入る。これ試験に出ますねきっと。

/tmp
でフォルダ指定して開発をする場合、ローカル環境も/tmp を確認するようにしましょう。
プロジェクトの中じゃなくて、ルートにあるtmpです。
僕はこれもまた全然違う場所(つまり先程プロジェクト内につくったtmpディレクトリ)を見ていて、おっかしいな、ファイルが作られないぞ何が悪いんだエラーも出ないのに…
という馬鹿なことをしておりました。ファイルは /tmp にできているのでそりゃエラー出ませんよね。

## まとめ
幾多の苦難を乗り越えて、SlackでChatGPTを使うためのアプリの開発が進んでいます
無料で使えますので、是非トライしてみてください。
機能一覧はこちらをごらんください。

https://qiita.com/geeorgey/items/124346b9f4762f7f0e4b
[読書メモ]良いコードを書く技術

## はじめに

現在新卒研修中のuHoshiです。研修期間中ということで時間の余裕があり、久しぶりに技術本を読んだので、今後役に立ちそうなこと、自分の感想を残します。
目安として自分の簡単なプロフィールを記述しておきます。

- 学生期間中にエンジニアバイトを2年間
- 非情報系
- メインはフロント
- リーダブルコードは昔読んだが覚えていない(小声)

この本は11章から成っているが、その中でも特に勉強になった・仕事で生かせると感じたところをピックアップしていきます。




## 第1章：良いコードとは何か

> - 保守性が高い
> - すやばく効率的に動作する
> - 正確に動作する
> - 無駄な部分がない


この本では、これら4つの点を満たしたコードを**良いコード**と定義しているが、プロジェクトやチーム構成、技術的な要素を鑑みて判断する必要があり、一概に絶対的な正解はない。


## 第2章:良いコードを書くための5つの習慣

- 読む
- 書く
- 道具を磨く
- 知る
- 聞く

どの分野にも自分だけの発想で作品を完成させる芸術界はいない。先人たちの作品を見て、影響を受けたり良いところを盗んだりして自分の中で咀嚼することでオリジナルの作品を生み出してきた。
エンジニアも同じで、良いコードが書けるようになるには、悪いコードも含めて他人が書いたコードを日常から**読む**ことが大切である。

次の**書く**に関してはそのままだ。良いコードを書くには仕事でコードを書くのはもちろん、日々の単純作業を効率化するツールやスクリプトを書いたり、新しい言語やフレームワークを自分の手で動かすことが大切である。

**道具を磨く**のは大切である。エディタや自動化など最高の状態にしておくことで、無駄のないプログラミングが可能になる。

**読む**ことも技術力向上には欠かせない習慣である。書籍で学習する際は原典と言われる本とHowTO本の2冊買いがおすすめである。
本以外にもリファレンスや仕様書のドキュメント、Webサイトなども有効である。

**聞く**ことは5つの中で唯一他人を巻き込んだ動的な習慣である。最初に自分のコードや考えを誰かにアウトプットしてフィードバックを得られる場面を作る必要がある。これによって自分では気づけないフィードバックをもらうことができ、成長を加速させることができる。

## 第4章：スコープ

そもそもスコープとは```スコープ=見える範囲=使える範囲=依存する範囲=保守性に影響をもたらす範囲```とある。

→スコープを小さくすることで
- 覚えていけないことが減りプログラムの理解が容易になる
- 依存する範囲が狭くなり保守性が高くなる


## 第5章：コードの分割

#### コードを分割するメリット

- 可読性が向上する
- 保守性が向上する
- 再利用性が向上する

分割する手順は

1. ベタなコードを書いてみる
2. 共通処理をメソッドに抽出して分割する
3. 処理単位で分割する
3. 状態も持つ処理をクラスに抽出して分割する

処理の分割に完璧な回答はない。試行錯誤することで少しずつ勘どころが掴めてくる。


## 第6章:コードの集約

大前提として、**「コードの重複は悪」** と言われてきた。

なぜなら同じコードがいろんな場所に存在していると、変更が発生した時の修正作業が大変になる。
他にも重複があるとコードの見通しも悪くなり、保守性が低くなってしまうからだ。

では、それらを回避するためにどうやって抽出するかと言うと

- メソッド
- 継承
- ユーティリティクラス
- サービス層
- オブジェクト
- 定数

これらにまとめることができる。

継続的にコードをまとめてクリーンな状態に保つことが大切である。

## 第7章：コードのパフォーマンス

そもそもコードのパフォーマンスは**計算量** で決まる。その計算量は**アルゴリズム** によって変わってくる。

#### パフォーマンスチューニング手順

1. 測定：ログ出力やプロファイラを使用
1. 原因特定：測定範囲を狭めていき、原因箇所を特定する
1. チューニング：アルゴリズム選択やSQL・テーブル設計を変更する
1. チューニングの測定：チューニング前と後で比較する


#### どのタイミングでチューニングするのがベストなのか？
→保守性を損なわずパフォーマンスが向上する場合は、常にパフォーマンスが良い方法を採用する
→パフォーマンス劣化がシステムのクリティカルな問題になる箇所は、早期に計画する



## 最後に

何となくでコードを書いてしまっていた自分にとっては刺さる本だった。全てが新しいことではなく、これまでの現場で先輩方のレビューで言われたことでもありました。
だから、この本を読んで先輩がどう言った意図を持ってレビューしてくれたかが少しわかった気がします。

まだ完全には理解していないので、リーダブルコードやミノ駆動本などを読んでから2周目を読んで更に理解を深めたいと思います！
macOSでスクショ、日本語OCR, JIS Keyboard

# macOSでスクショ

https://pixela.co.jp/pcdash/34/

Sift Command 4 
で範囲指定。

Shift Command 3
で画面全体。

ファイル名に日付のはいったpngができる。

## 日本語OCR 

https://ezocr.net/OCR

ここは１０ファイルまで。　

>※表示向きが正しく設定されたファイルの　ご利用をお勧めします。

という警告がでて処理してくださらなかったことがあったような気がする。　
警告が出ていても処理が済んでいたことがある。

# JIS Keyboard


## 入力メニュー
https://support.apple.com/ja-jp/guide/japanese-input-method/aside/glos52ed78a0/6.3/mac/13.0

##

https://support.apple.com/ja-jp/guide/japanese-input-method/jpimf6ffb247/mac



### 日本語入力ソースに切り替える
>お使いのMacで、次のいずれかの操作を行います:
入力メニューを使用する: メニューバーで入力メニューをクリックしてから、入力ソースを選択します。入力ソースが淡色で表示されている場合、現在のアプリケーションはその入力ソースには対応していません。
Option＋Control＋スペースバーを押して入力メニュー内の次の入力ソースを選択するか、Control＋スペースバーを押して前の入力ソースを選択することもできます。
Caps Lockキーを使用する: 「入力ソース」設定で、Caps Lockキーを使用して入力ソースを変更するオプションを設定している場合は、キーを押すと非ラテン語系入力ソース（日本語など）とラテン語系入力ソース（英語など）が切り替わります。
「入力ソース」設定を確認するには、アップルメニュー  ＞「システム設定」と選択し、サイドバーで「キーボード」  をクリックします。（下にスクロールする必要がある場合があります。）右側の「テキスト入力」に移動し、「編集」をクリックします。
Fnキーまたは 地球儀キー キーを使用する: 「キーボード」設定で、Fnキーや 地球儀キー キー（キーボードにある場合）を使用して入力ソースを変更するオプションを設定している場合は、そのキーを押して入力ソースのリストを表示し、使用したい入力ソースが選択されるまでキーを押し続けます。リストは自動的に消えます。
「キーボード」設定を確認するには、アップルメニュー＞「システム設定」と選択し、サイドバーで「キーボード」をクリックします。（下にスクロールする必要がある場合があります。）
Touch Barを使う: MacにTouch Barが搭載されており、「入力ソース」ボタン  を追加してControl Stripをカスタマイズ済みの場合は、ボタンをタップしてから、日本語入力ソースをタップします。Control Stripを変更する方法については、Touch Barをカスタマイズするを参照してください。
### 日本語入力モードを切り替える
>Macで、以下のいずれかの操作を行います:
ひらがなに切り替える: 以下のいずれかの操作を行います:
キーボード: Control＋Shift＋Jキー、またはOption＋Shift＋Zキーを押します。
JISキーボード: かなキー（かな）を押します。
英字に切り替える: 以下のいずれかの操作を行います:
キーボード: Control＋Shift＋アポストロフィ（'）キー、またはOption＋Shift＋Sキーを押します。日本語入力ソースの設定ででローマ字入力モードが選択されている必要があります。
注記: 「Shiftキーの動作」オプションが「英字モードに入る」に設定されている場合は、Shiftキーを押して切り替えることもできます。
オプションを選択するには、メニューバーの入力メニューをクリックして、「“日本語 - かな入力”設定を開く」または「“日本語 - ローマ字入力”設定を開く」を選択し、サイドバーで「日本語 - かな入力」または「日本語 - ローマ字入力」をクリックします。
JISキーボード: Control＋Shift＋セミコロン（;）、または英数キー（英数）を押します。
全角英字に切り替える: Option＋Shift＋Cキー、またはControl＋Shift＋Lキーを押します。日本語入力ソースの設定で全角英字入力モードが選択されている必要があります。
カタカナに切り替える: 以下のいずれかの操作を行います:
キーボード: Control＋Shift＋Kキー、またはOption＋Shift＋Xキーを押します。日本語入力ソースの設定でカタカナ入力モードが選択されている必要があります。
JISキーボード: Shift＋かなキー（かな）を押します。
注記: 「Shiftキーの動作」オプションが「カタカナを入力」に設定されている場合は、Shiftキーを押して切り替えることができます。
オプションを選択するには、メニューバーの入力メニューをクリックして、サイドバーで「“日本語 - かな入力”設定を開く」または「“日本語 - ローマ字入力”設定を開く」を選択し、サイドバーで「日本語 - かな入力」または「日本語 - ローマ字入力」をクリックします。
半角カタカナに切り替える: Option＋Shift＋Aキー、またはControl＋Shift＋セミコロン（;）を押します。日本語入力ソースの設定で半角カタカナ入力モードが選択されている必要があります。

# 参考資料

画面保存(screen shot) 撮り方

https://qiita.com/kaizen_nagoya/items/08f78d17fffd9a7af980

macOSでスクショ、日本語OCR, JIS Keyboard

https://qiita.com/kaizen_nagoya/items/08f78d17fffd9a7af980

Google Drive OCR機能を試してみた（英語）

https://qiita.com/kaizen_nagoya/items/5ad1ada6577396601eaa

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20230505
ver. 0.02 ありがとう追記　20230508
## 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Vimの基本操作に関するまとめ

Vimは過去に実務で使用したことがありましたが、体系的に学習した記憶がありませんでしたため、以下の教材を学習しました。学習記録として、基本的なコマンドをまとめてみました。

[現役シリコンバレーエンジニアが教える NeoVim(VIM) + Tmux + Zsh 入門 - Udemy](https://www.udemy.com/course/vim-tmux-zsh/)


## Vimとは

テキストエディタの一種で、コマンドラインで使用する。

使用場面としては、サーバの操作やサーバに配置されているプログラムを変更する際に特に利用する。

Vimとほぼ同じ機能があるNeoVimがある。違いとしては、 **NeoVimの方がプラグインが豊富にあること。**


## モード変更

Vimはモードによって行える操作が異なるため、行いたい操作によって、モードを切り替える必要がある。Vim起動後、以下コマンドでモードを切り替える。起動時は **ノーマルモード** で立ち上がる。

| コマンド | 説明 |
|:-:|:-:|
| ノーマルモード  | カーソル移動や文字を削除、行のコピペなどで使用。`esc`でノーマルモード  |
| インサートモード  | ファイルに入力する際に使用。`i`でインサートモード  |
| コマンドモード  | 検索、置換、保存などに使用。`:`や`/`でコマンドモード  |
| ビジュアルモード  | カーソル選択でコピペやインデント移動に使用。`v`でビジュアルモード  |


:::note info
インサートモードは **i** 以外にも **a** や **o** 、 **O** でも変更可能
:::


## **ノーマルモード** で実行する操作

### カーソル移動

| コマンド | 説明 |
|:-:|:-:|
| k  | 上に移動  |
| j  | 下に移動  |
| h  | 左に移動  |
| l  | 右に移動  |
| gg  | ファイルの一番上の行に移動  |
| G  | ファイルの一番下の行に移動  |
| 0  | 行の先頭に移動  |
| $  | 行の末尾に移動  |
| :数字  | 数字の行に移動(:set numberで行数を表示可能)  |
| CTRL + o  | 移動前に戻る  |

:::note info
矢印キーでもカーソル移動はできるが、kやｊなどでカーソル移動したほうが、キーボード上で指の移動が少なくて済む。
:::

### 入力

| コマンド | 説明 |
|:-:|:-:|
| o(小文字)  | カーソルを当てた下の行から入力  |
| O(大文字)  | カーソルを当てた上の行から入力  |
| a  | カーソルを当てた右横から入力  |
| i  | カーソルを当てた左横から入力  |

:::note info
上記のコマンドを実行すれば、ノーマルモードからインサートモードに切り替わる。
:::



### 削除

| コマンド | 説明 |
|:-:|:-:|
| x  | カーソルを当てた文字を消す  |
| dd  | カーソルを当てた行を消す  |
| 数字dd  | カーソルを当てた行を含めて、数字分の行を消す  |
| dw  | カーソルを当てた単語を削除  |

:::note info
削除した後に、uを叩けば、削除した文字を元に戻せる。また、元に戻しすぎてしまった場合は、「Control + r」を叩けば、復活する。
:::

### コピー、ペースト

| コマンド | 説明 |
|:-:|:-:|
| yy  | 1行コピー  |
| 数字yy  | 数字で指定した行数分コピー  |
| p(小文字)  | カーソルの真下にペースト  |
| P(大文字) | 行の一番下にペースト  |




## コマンドモードで実施する操作


### 検索

| コマンド | 説明 |
|:-:|:-:|
| /検索キーワード  | 検索したいキーワードを探す  |
| n  | 検索したいキーワードが複数ある場合、下方向に移動する  |
| N  | 検索したいキーワードが複数ある場合、上方向に移動する  |

### 置換

| コマンド | 説明 |
|:-:|:-:|
| :%s/置換前/置換後/g  | 一括置換  |
| :%s/置換前/置換後/gc  | 一つずつ置換してよいか確認してから置換  |

:::note info
上記以外でも、削除で使用した **dw** で単語単位で消してから、書き換える方法もある。
:::


### ファイルを保存、閉じる


| コマンド | 説明 |
|:-:|:-:|
| :q  | テキストを編集していない状態で、保存せずに閉じる  |
| :q!  | テキストを編集している状態でも、編集していない状態でも保存せずに閉じる  |
| :w  | ファイルを上書き保存  |
| :w ファイル名 | 名前をつけて保存  |
| :wｑ  | 保存してから閉じる  |

### コマンド実行


| コマンド | 説明 |
|:-:|:-:|
| :!実行コマンド 実行したいコマンド(※)  | エディタを開いた状態でプログラム実行  |
| :!!  | 前コマンドを実行  |

(※)Rubyの場合、例えば`ruby test.rb`と実行すれば、test.rbを開いた状態で実行可能。



## ビジュアルモードで実行する操作

### その他

| コマンド | 説明 |
|:-:|:-:|
| >  | 右にインデントを移動  |
| <  | 左にインデントを移動  |
| コピーしたい範囲を選択して、y  | カーソル指定コピー  |



-----------