OmniAICreator/Qiita-1.07M huggingface dataset:
利用規約や著作権が必要なアプリ開発は法律の専門家を利用しましょう

qiitaに初めて投稿します。非技術職の轟です。

趣味でプログラムを開発しているのですが、AIから著作権という言葉が出た瞬間に停止すればよかったと思い投稿してます。
法が絡んだら（利用規約が出たら）法律関係に何十万も払う覚悟をしてから開発に着手しましょう。
また、AIに非専門家が法律を聞くと、聞けば聞くほど余計に謎(不安)が増えます。

### 流れ

- geminiが**手動**（とは言ってないが）で操作する場合、youtube要約ができることを公表する
- 情報収集し、人と話してたら、自動要約してみようと着手する
- gemini apiにyoutubeの要約させるとできません。字幕APIを使い実装する。
- AIにコンテンツの所有者に配慮しましょうと言われる。
- 考えながら品質向上させる（片手間で1か月）
- 同人のようにリリースできないかと思いつく（しかも昔の知識）
- geminiに聞いたらより不安を煽られ（僕が脅迫と感じただけ）脅迫される

### どんなアプリか

要約したものから３分ぐらいの動画を自動生成します。

- youtubeのチャンネル詳細APIでチャンネルに所属する動画を取得
- 字幕を取得（apiと書いてるが利用規約はなかった）
- geminiに要約させる - 追加の質問をする -
- テスト用にDBに登録（字幕は登録しない）
- 要約を行へ
- 行をキーワード抽出へ (gemini)
- キーワードを画像へ stable diffusion(localでやりました。APIは高いため)
- 行を音声へ (google t2s)
- 字幕追加 (pil)
- くっつける (ffmpeg)
- フロントエンドへ

### 詳細１ はじめ

公表は飛ばしますが、これで普通に許される行動だと先入観を持ちました。しかも簡単にできて自分で作って満足しました。

### AIにアドバイスを貰う

動画を作っているyoutuberに配慮しましょうと言われる。
調べると切り抜きは許可とってやってると知る。
ユーザ0で許可取れるのか不安になりつつ、親告罪なので自分が使うならいいかと放置。←悪手

### 品質を向上させる

AIもpythonも初心者同然ですが、mysql化 、並列処理化、tensorrt等色々試す。
(音声AI各種(bark他), local llm(caml3 22b, phi3 medium, gemma2他), stable diffusion xl, 3 medium等色々試しました)

### 同人のように利用を考える

交渉の材料にするため、ユーザを増やすため、同人のようにリリースできないか考え、
AIに聞きました。そしたら藪蛇となりました。

同人のようにリリースを辞めるのは早かったですが、最低でもgithubとqiitaに投稿しようとは思いました。

#### 色々質問した要約

- googleの標準のインターフェースを経ないものは海賊版(海賊版は個人利用も駄目)
- 親告罪だが海賊版は権利者が不正侵入してでも立証する可能性がある←あなたが言ったら脅迫だろと思いましたが、第三者の視点だったので、泣き寝入りしましたが、一日悩みました。
- いろいろ質問しましたが、購入したpcにグラボを付けるのは、著作物の改変であるとか、一瞬で違うとわかるが説明できない自分が敗北しました。

不正侵入は防げるかを考えましたが、昔のバグでPSコマンドで検知できないバックドアがlinuxカーネルにあるということを思い出し諦めました。（psコマンドで検知できないが、linuxと矛盾しないで１０年見つからないの条件はかなり厳しいと思いました）
「立証する可能性がある」というのは⇒仮に事例はなくても実際はありそうなので弁護士に聞いても無駄だと思いました。
また、youtuberの皆様が不正侵入する能力がなくても、裏取引でいくらでも証拠はつかめると思いました。
（gemini製作にグレートファイヤーウォールを持つ中国語のコーパスをたくさん集めたように見えてます。裏取引をしたと思ってます。）

### 謝罪

10チャンネルぐらいのyoutuberの皆様申し訳ございません。

多分個人利用で100円以内の損害を与えてます。5倍請求されるとして500円ぐらい欲しい方はご連絡ください。（ただし、証拠のご提示もお願いします。）5倍以上なら防衛の意味を込めて法廷で戦うかもしれません。
恐らく、こんなことを言われても迷惑だと思い連絡はしません。

### 失ったこと

- 著作権を違反し罪人になり、1つでも権利を持っているものが不正侵入する口実を与えたこと
- 手空きの時間とはいえ、30日程度開発したものが無駄になったこと
- 今日一日悩まされたこと

### 最後に

パソコン捨てます。スマホも捨てます。もう連絡取れないと思ってください。さようなら。
LINE Botで子供の学童予定確認

## LINE Botに挑戦

 ショップや飲食店でよく見る　LINE公式アカウントのようなものがプログラミングを知らない私でも簡単に作れるらしい！とのことで挑戦してみました。
 
　
 
 
 ## 学童の登園予定をLINEで確認できるBotをつくりました
子供が毎日通っている学童。
-夏休みの登園の送り迎え当番の確認をLINEでできるようにして時間の間違い・夫婦での行き違いをなくしたい。
-大雨やらトラブルで学校から下校時刻変更連絡が来たとき、学童の予定を確認してにすぐ連絡できるようにしたい
LINEですぐに返事が返ってくるといいなということで作りました。

 
 
### 簡単なエクセルやインターネットぐらいしかパソコン使えない私にもできた
　
 使用したツールは３つ
  

  https://www.make.com/en
  
  https://developers.line.biz/console/?status=success

  https://docs.google.com/spreadsheets/create?hl=ja
  


### MAKEのscenarios
 
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835981/4b9f2c33-d96c-b261-4d0b-d68892e724d5.png)

1.Googlespreadsheetsで登園時間一覧を作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835981/dd2bbc4e-4886-de9f-1ee9-7867169706d5.png)

2.Google Sheets モジュールを作成して登園時間一覧を埋め込み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835981/dc6c969b-3408-d398-fed9-f3ca62327e25.png)

3.Routerでフィルターを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835981/c8bcd48a-a0aa-0f6d-4633-5dae181c137c.png)

4.日付を入れたら時間と送迎当番が返ってくる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835981/922f78fd-e993-17e7-466b-5a2ea42c9383.png)

5.日付以外の項目なら「日付を入れてね」の返答が返ってくるように設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835981/cf5d7e90-6d8c-d08b-63d3-db863406551f.png)


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">LINEBOTの動作確認 <a href="https://t.co/VfV73ZcAJI">pic.twitter.com/VfV73ZcAJI</a></p>&mdash; sak107 (@sak107312) <a href="https://twitter.com/sak107312/status/1823345299957399740?ref_src=twsrc%5Etfw">August 13, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



スクリーンショットがとれなかったのでもう1つのスマホで撮影






 ## 学校・学童関連の情報をまとめられるようになった
　紙ベースの連絡については写真を撮ってアルバムにすることで保存して共有。園への予定変更連絡のためのフォーム・電話番号もリストに追加したらLINEの画面から連絡ができるようになったので使いやすくなった。
Chrome Dev Toolsでコンソール画面と他の画面を同時に見る方法

## 些細な発見
Chrome Dev Toolsを開いている状態で、Ctrl + @を押すとコンソールタブを下部に表示させることが可能。

VS CodeのコンソールをCtrl + @で開く癖があり、Chromeで間違って押してしまった時の偶然の気づきでした。
初めてのGitHub 第1回

## GitHubとは
(1)フォルダ内のファイルの変更履歴を保存することができる。

(2)いつ、だれが、どのファイルのどの箇所を、どういった目的で変更したか管理できる。

##  リポジトリ
・過去のファイルを引っ張ってこれる。記録されている貯蔵庫。
プロジェクトごとにリポジトリを作成し、その中でコードを管理する。
コードのバージョン履歴や、コミット、ブランチが保存される。

### ローカルリポジトリとリモートリポジトリ
・ローカルリポジトリ
自身のPC上に存在するリポジトリで、ローカルリポジトリ上にファイルを編集したら、保存しておかなければいけない。

・リモートリポジトリ
WebであるGitHubサーバー上に存在するリポジトリ

##  ステージ
1. 変更のあったファイルの中からコミットするためのファイルを選ぶ


##  コミット
1. 変更にメッセージなどを添えて保存する
2. セーブポイント
3. コミット間はいつでも移動できる


## ブランチ
・ブランチは並行世界
プロジェクトの異なるバージョンや新機能を並行して開発するために使用する。

## 参考資料

わかばちゃんと学ぶGit使い方入門

### Schoo
Git超入門

https://schoo.jp/class/4228/archive

### Youtube
gitの使い方 基礎知識 - SourceTreeを利用したGitの基本操作

https://youtu.be/LyXS3BWJ244?si=d1OavzNYWxhg5fKt

https://qiita.com/b150005/items/508009234bf9813b230f
SwiftUIでカスタムフォントを使用する方法

## 概要

SwiftUIでカスタムフォントを使用する方法について解説します。
アプリに個性的なデザインを追加したいときに、カスタムフォントは非常に役立ちます。この記事では、カスタムフォントの設定方法とコードの例を紹介します。
## 1. カスタムフォントファイルの追加
まず、Xcodeプロジェクトにカスタムフォントファイルを追加します。以下の手順に従ってください。

**1. フォントファイル（TTFまたはOTF形式）を用意します。**
**2. Xcodeでプロジェクトを開き、Assets.xcassetsフォルダの下に新しいフォルダ（例: Fonts）を作成します。**
**3. 用意したフォントファイルを、このフォルダにドラッグ&ドロップして追加します。**
**4. Copy items if neededにチェックを入れて、Finishをクリックします。**

![スクリーンショット 2024-08-12 20.35.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951091/042992d2-59d1-36aa-c40b-2e0db306b667.png)

## 2. Info.plistにフォントを登録
次に、Info.plistファイルにカスタムフォントを登録します。

**1. XcodeのプロジェクトナビゲータでInfo.plistを選択します。**
**2. 右クリックして「Add Row」を選択し、新しいキーとして**Fonts provided by application**を追加します。**
**3. Fonts provided by applicationの右側の「＋」ボタンをクリックして、追加したフォントファイルの名前（拡張子付き）を入力します。
(今回の場合は**Selima.otf**になります。)**

![スクリーンショット 2024-08-12 20.37.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951091/1e5f9a40-7fbb-38ca-df7b-c8491e85c7e1.png)

## 3. SwiftUIでカスタムフォントを使用
フォントが正しく登録されたら、SwiftUIでカスタムフォントを使用できます。以下のコード例を参照してください。



```swift: Swift 
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Text("Hello, SwiftUI!")
                .font(.custom("CustomFontName", size: 24))
                .padding()
        }
    }
}
```
ここで、CustomFontNameにはフォントの名前を入力します。
注意点として、CustomFontNameはフォントファイルの名前ではなく、フォント自体の名前を打ち込みます。

## 4. カスタムフォントの活用例
アプリ全体で統一したカスタムフォントを使用する場合、
下記のように、アプリ全体にデフォルトのフォントを設定することができます。

```swift: Swift
import SwiftUI

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.font, Font.custom("CustomFontName", size: 24))
        }
    }
}
```
これにより、アプリ内の全てのテキストにカスタムフォントが適用されます。

## まとめ

カスタムフォントを利用することで、アプリに個性を出すことができ、ユーザーにより良い体験を提供することができます。
是非、試してみてください！

## フォント参考

https://fontmeme.com/jfont/free-fonts/
BigQueryの裏技！__TABLES__メタテーブルでデータ容量とレコード数を簡単把握

## はじめに
BigQueryに存在するデータセットのデータ容量を算出する方法について、
公式ドキュメントで詳細が見つかりにくかったため、この記事ではその具体的な方法を紹介します。

## 1. `__TABLES__`メタテーブルの概要
BigQueryでは、`__TABLES__` というメタテーブルを使うことで、各テーブルのデータ容量やレコード数を簡単に把握することができます。

`__TABLES__`メタテーブルには、以下のようなカラムが含まれています。
```sql
SELECT
  *
FROM
  `プロジェクト名.データセット名.__TABLES__`
```
- `table_id`：テーブル名
- `creation_time`：テーブル作成時のタイムスタンプ
- `last_modified_time`：最後に変更されたタイムスタンプ
- `row_count`：テーブル内の総レコード数
- `size_bytes`：テーブルのサイズ（バイト単位）
- `type`：テーブルの種類
（通常は "TABLE" だが、ビューの場合は "VIEW" となる）
- `table_reference.project_id`：プロジェクトID
- `table_reference.dataset_id`：データセットID

特に重要なのは`size_bytes`と`row_count`で、これらを利用してテーブルの容量やレコード数を調べることができます。

:::note warn
※`size_bytes`はバイト単位であるため、必要に応じてクエリ実行時にMBやGBに変換してください。

※`VIEW`には物理的なデータが存在しないため、`size_bytes`は「0」と表示されます。
:::


## 2.データ容量とレコード数を取得するクエリの実例

#### 例1：データセットの総容量をMB単位で調べるクエリ

```sql
SELECT
  table_id,
  SUM(size_bytes) / 1000000 AS MBs
FROM
  `プロジェクト名.データセット名.__TABLES__`
GROUP BY
  table_id;

```
- `SUM(size_bytes)`：各テーブルのサイズをバイト単位で合計する
- `/ 1000000`　　　：合計サイズをバイトからメガバイトに変換する
1メガバイトは1,000,000バイトなので、この計算でMB単位のサイズを取得できる。

実行結果例：

```bash
| table_id        | MBs       |
|-----------------|-----------|
| users           | 12.34     |
| transactions    | 456.78    |
| logs            | 1234.56   |

```

この結果から、`users`テーブルは12.34MB、`transactions`テーブルは456.78MBのデータが含まれていることが分かります。

##### 補足
下記クエリでは、小数点以下2桁までのMBサイズを表示します。
サイズが非常に大きい場合や、小数点以下の精度が必要な場合には、クエリ内でROUND関数を使って小数点以下の桁数を調整することもできます。

```sql
SELECT
  table_id,
  ROUND(SUM(size_bytes) / 1000000, 2) AS MBs
FROM
  `プロジェクト名.データセット名.__TABLES__`
GROUP BY
  table_id;
```


#### 例2：総レコード数を調べるクエリ

```sql
SELECT
  table_id,
  SUM(row_count) AS total_rows
FROM
  `プロジェクト名.データセット名.__TABLES__`
GROUP BY
  table_id;
```
- `SUM(row_count)`：各テーブルのレコード数を合計する

実行結果例：
```
| table_id        | total_rows |
|-----------------|------------|
| users           | 100000     |
| transactions    | 500000     |
| logs            | 1200000    |
```
この結果から、`users`テーブルは100,000件のレコード、`transactions`テーブルは500,000件のレコードが含まれていることが分かります。

## 3. まとめ
この記事では、BigQueryの`__TABLES__`メタテーブルを使って、データセットの総容量をMB単位で確認する方法や総レコード数の算出方法を紹介しました。

データが膨大になると、ストレージのコストがかさむだけでなく、クエリのパフォーマンスにも影響を与えます。データセットの容量やレコード数を定期的に確認し、適切に管理することも大切なんだなと学ぶことができました。
VBScript用Includeモジュール（WScript.Shellラッパー）

```vb:WShllModule.vbs
Option Explicit

Dim WShll
Set WShll = CreateObject("WScript.Shell")

'Call TEST_20240812_175759
```
```vb:
'// デスクトップのパスを返す

Function DesktopPath()

    DesktopPath = WShll.SpecialFolders("Desktop")

End Function
```
```vb:
'// マイドキュメントのパスを返す

Function MyDocumentPath()

    MyDocumentPath = WShll.SpecialFolders("MyDocuments")

End Function
```
```vb:
'// ユーザ名を返す

Function UsrName()

    UsrName = CreateObject("WScript.Network").UserName

End Function
```
```vb:
'// コンピュータ名を返す

Function PcName()

    PcName = CreateObject("WScript.Network").ComputerName

End Function
```
```vb:
'// ダウンロードフォルダのパスを返す

Function DownloadPath()

    DownloadPath = CreateObject("Shell.Application").Namespace("shell:Downloads").Self.Path

End Function
```
```vb:
'// 環境変数の値を返す

Function EnvStr(ByVal env_name)

    EnvStr = WShll.ExpandEnvironmentStrings(env_name)

End Function
```
```vb:
'// 作成したフォルダのパスを返す
'// mdコマンドを使うことで、すでにフォルダが存在していてもエラーにならないし、
'// 途中のフォルダも自動的に作成してくれる

Function MakeFolder(ByVal folder_path)

    WShll.Run "cmd /c md " & chr(34) & folder_path & chr(34), 0, True
    MakeFolder = folder_path

End Function
```
```vb:
'// ファイルを選択した状態でフォルダを開く（ファイルを指定した場合）

Sub OpenFolder(Byval path)

    Dim optn: optn = ""
    If CreateObject("Scripting.FileSystemObject").FileExists(path) Then optn = "/select, "
    WShll.Run "explorer.exe /e, " & optn & path, 1

End Sub
```
```vb:
Sub TEST_20240812_175759()

    Dim cmd, tb: tb = vbTab
    
    cmd = "echo UsrName"                    & tb & tb & "｜" & UsrName
    cmd = cmd & " & echo PcName"            & tb & tb & "｜" & PcName
    cmd = cmd & " & echo ^%USERPROFILE^%"        & tb & "｜" & EnvStr("%USERPROFILE%")
    cmd = cmd & " & echo ^%OneDrive^%"           & tb & "｜" & EnvStr("%OneDrive%")
    cmd = cmd & " & echo ^%LOCALAPPDATA^%"       & tb & "｜" & EnvStr("%LOCALAPPDATA%")
    cmd = cmd & " & echo ^%APPDATA^%"            & tb & "｜" & EnvStr("%APPDATA%")
    cmd = cmd & " & echo MyDocumentPath"         & tb & "｜" & MyDocumentPath
    cmd = cmd & " & echo DownloadPath"           & tb & "｜" & DownloadPath
    cmd = cmd & " & echo. & pause"

    WShll.Run "cmd /c " & cmd

End Sub
VBScript用Includeモジュール（FileSystemObjectラッパー）

```vb:FsoModule.vbs
Option Explicit

Dim Fso
Set Fso = CreateObject("Scripting.FileSystemObject")

'Call TEST_20240812_124128
```
```vb:
'// 親フォルダ（ディレクトリ）のパスを返す

Function GetDPath(ByVal full_path)

    GetDPath = Fso.GetParentFolderName(full_path)

End Function
```
```vb:
'// 親フォルダのフォルダ名（ディレクトリ名）を返す

Function GetDName(ByVal full_path)

    With Fso
        GetDName = .GetFolder(.GetParentFolderName(full_path)).Name
    End With

End Function
```
```vb:
'// ファイル名を返す

Function GetFName(full_path)

    GetFName = Fso.GetFileName(full_path)

End Function
```
```vb:
'// 拡張子を除いたファイル名（Base名）を返す

Function GetBName(ByVal full_path)

    GetBName = Fso.GetBaseName(full_path)

End Function
```
```vb:
'// 拡張子を返す　※ u_case が False の場合は小文字にして返す

Function GetExt(ByVal full_path, ByVal u_case)

    Dim ext

    ext = Fso.GetExtensionName(full_path)

    If Not u_case Then ext = LCase(ext)

    GetExt = ext

End Function
```
```vb:
'// 配列の要素をすべてつなげたパスを返す

Function GetBuildPath(param_ary)

    Dim i
    Dim pathStr

    With Fso
        For i = LBound(param_ary) To UBound(param_ary)
            pathStr = .BuildPath(pathStr, param_ary(i))
        Next
    End With

    GetBuildPath = pathStr

End Function
```
```vb:
Sub TEST_20240812_124128()

    Dim adinPath, appdata, msg

    appdata = CreateObject("WScript.Shell").ExpandEnvironmentStrings("%APPDATA%")

    adinPath = GetBuildPath(Array(appdata, "Microsoft", "AddIns", "ADIN.xlam"))

    msg = adinPath
    msg = msg & vbCrLf & GetDPath(adinPath)
    msg = msg & vbCrLf & GetDName(adinPath)
    msg = msg & vbCrLf & GetFName(adinPath)
    msg = msg & vbCrLf & GetBName(adinPath)
    msg = msg & vbCrLf & GetExt(adinPath, False)

    MsgBox msg

End Sub
【Python入門】真偽判定について

# Pythonにおける真偽判定について
Pythonには組み込みオブジェクトや組み込み関数と言われている標準ライブラリを利用して
真偽判定を行うことが可能です。
標準ライブラリとは、いわゆるインポート文を定義せずに利用可能なデフォルトで用意されているライブラリを指します。

Python基本構文については[【Python入門】基礎構文のまとめ](https://qiita.com/atsuuun/items/60e2cec16add7091b109)でまとめてますので、参考にしてください。

# 真偽判定についての解説
if文やwhile文等での真偽判定をする際に利用します。
偽と判定するものには以下のものがあります。

|オブジェクト|Falseと判定されるオブジェクト例|
|:-|:-|
|定数|```None``` ```False```|
|数値型|```0``` ```0.0```|
|空文字列または空のコレクション等|```''``` ```{}``` ```[]``` ```set()``` ```range(0)```|

* ```''```：空の文字列となります
* ```{}```：空の辞書または重複しない要素を保持するコレクションとなります
* ```[]```：空のコレクションとなります
* ```set()```：重複しない要素を保持するコレクションとなります。```{}```と同義となります
* ```range(0)```：数列を生成するオブジェクトとなります。０を指定することで空の数列となります

## 定数での判定
```True```以外は偽と判定されるため、出力されません。
```python
    for i in [None, False, True]:
        if i: print(i)
```

## 数値型での判定
ゼロは偽と判定されるため、```0``` ```0.0```は出力されません。
```python
    for i in [0, 0.0, 1, -1]:
        if i: print(i)  
```

## 空文字列または空のコレクション等での判定
空の文字列、空のコレクションについては、偽と判定されるため、出力されません。
```python
    for i in [ '', {}, [], set(), range(0) ]:
        if i: print(i) 
```

## オブジェクトについて
オブジェクトについてはデフォルト真と判定されますが、クラスにboolメソッド、lenメソッドが定義されている場合、メソッド定義から判定されます。
* クラスに```bool```メソッドが定義されている場合、```False```を返却する場合、偽と判定される
* クラスに```len```メソッドが定義されている場合、```0```を返却する場合、偽と判定される
※```bool```メソッドが定義されている場合は、```bool```メソッド定義の判定が優先されます。

サンプルコードを作成しましたので、```bool``` ```len```メソッドをそれぞれコメント化して実行結果を確認してみてください。
```python
    for i in [ Example(True, 1), Example(True, 0), Example(False, 1), Example(False, 1)]:
        if i: print(i)

class Example:
    def __init__(self, flg: bool, length: int):
        self.flg = flg
        self.length = length

    def __bool__(self) -> bool:
        return self.flg
    
    def __len__(self) -> int:
        return self.length

    def __str__(self) -> str:
        return f"flg:{self.flg}, length:{self.length}"

```

# まとめ
真偽判定について解説しました。
以下については、if文、while文の判定処理では偽と判定されます。
* None
* False
* 0 or 0.00
* 空の文字列
* 空のコレクション

判定処理に迷った場合は参考にしてください。
Stable Fast 3DをDecimateしてMeshAnything V2したけど失敗

写真から3DのStable Fast3Dを試した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54688/ab4f318b-a746-e497-9e95-9e734c1c5dd4.png)

そこそこだけど、面が28000なので、これをDecimate(0.05)で、1600以下にしてMeshAnything V2(Meshを整える)しました。

２分ぐらいかかるけど、変換は可能というだけわかった。

## Decimate(0.05) が無理あるよね。
この時点でかなり破綻してた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54688/5bbe2941-29e0-3013-e5fa-37dab8ed0e55.png)

## 出力からUV消えてます。
テクスチャー貼り直すの無理です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54688/e4ba9c25-ce30-4d8d-8797-2da08e00c7bc.png)
application.jsがjavascriptの中に2つ存在するのはどういうこと？？

## はじめに
ふとjavascriptのディレクトリについていろいろいじっているときに「あれなんか2つある？」と不思議に思ったのでそれぞれどんな違いがあるのか気になったので調べてみたことをアウトプットしようと思います。

## どんな状況だったのか
[![Image from Gyazo](https://i.gyazo.com/a91554d1f5b58e214160c59abff2a188.png)](https://gyazo.com/a91554d1f5b58e214160c59abff2a188)

はい。上の画像のように`application.js`という名称のフォルダが`javascript`ディレクトリに2つ存在しているのがわかるかと思います。
はじめ、この2つの違いが判らず、GPTから「●●というコードを`application.js`に追加することをおすすめします」というような提案？をえたときとりあえずでjavascript/application.jsにコードを追記していました。

## application.jsが2つある理由
Railsが提供するアセットパイプライン[^1]と、StimulusJS[^2]を使ったモダンなJavaScript[^3]の管理を分けているからになり、具体的に次のような違いが挙げられます。


### **1. `app/javascript/application.js`**

- **役割**: アプリケーション全体で使うJavaScriptの設定を行う場所で、UJSなどのライブラリをインポートして、アプリケーション全体のJavaScriptの初期化を行う
- **追加する内容**: jQuery[^4]やRails UJS[^5]をここに加えるのが一般的



### **2. `app/javascript/controllers/application.js`**

- **役割**: StimulusJSのコントローラーを管理する場所で、特定のDOM要素[^6]に対して動作するJavaScriptのコードを追加することができる
- **追加する内容**: Stimulusのコントローラーをここに定義して、特定の機能を持たせることが主な目的


### **どちらに加えればいいか**

- **UJSやjQueryは`app/javascript/application.js`に加える**のが正しい使い方。このファイルは、アプリ全体で共通して使う設定を行うための場所だから

## さいごに
今回改めて調べてみて、まだ100％完全理解とまではいかないものの「アプリ全体に共通のJavaScriptは`application.js`で定義し、特定の機能やインタラクションは`controllers/application.js`で管理する感じ」というのがつかめました。まだまだみつのりは長い！！



[^1]: **アセットパイプライン**：Railsで使用される仕組みで、JavaScriptやCSS、画像などのアセットを効率的に管理・配信するためのもの。これにより、アセットを結合、圧縮、キャッシュ可能にして、ページの読み込み速度を向上させることができる

[^2]: **StimulusJS**：Railsアプリケーションに特化した軽量のJavaScriptフレームワークで、HTMLのデータ属性を使って、簡単にインタラクティブな機能を追加できるように設計されている。これにより、JavaScriptのコードをHTMLに近い形で記述できる

[^3]: **StimulusJSを使ったモダンなJavaScript**：StimulusJSの機能を利用して、HTMLとJavaScriptを組み合わせて、クリーンでメンテナンスしやすいインターフェースを構築する方法のこと。これにより、アプリケーションの動的な部分を簡単に管理できるようになる。

[^6]: **特定のDOM要素**：HTML文書内の特定の要素のことを指す。たとえば、`div`や`p`などのタグを使って、特定の位置に配置された要素のことを言う。

[^4]: **jQuery**：JavaScriptのライブラリで、DOM操作、イベント処理、Ajax通信などを簡単に行うためのもの。簡潔な文法で、ブラウザ間の互換性を意識せずにプログラミングできる点が特徴。

[^5]: **Rails UJS**：Railsで使用されるUnobtrusive JavaScriptの略で、RailsアプリケーションにおけるAjaxや非同期通信を簡単に実装するための仕組み。これにより、ページをリロードせずにデータのやり取りが可能になる。
[react-router-dom対応]ReactアプリをGitHub Pagesに公開する

## 事前準備
1. GitHub Pagesに公開するローカルリポジトリがあること
1. リモートブランチがあり､リモート設定されていること

## react-router-domの対応
react-router-domを使っている方は､`<BrowserRouter>`に`basename={process.env.PUBLIC_URL}`を追加してください｡
これがないと自分の環境では初期ページが真っ白のままで表示されませんでした｡
```jsx
<BrowserRouter basename={process.env.PUBLIC_URL}>
</BrowserRouter>
```

## 公開手順
### 1. gh-pagesをインストールする
`gh-pages`はGitHub Pagesへのデプロイを簡単にしてくれるpackageです｡
```bash
$ npm install gh-pages --save-dev
```

### 2. package.jsonの編集

1つ目に`homepage`を追記します｡
`<GitHubユーザー名>`と`<リポジトリ名>`を自分の環境に合わせて変更してください(`<>`は不要です)
```json:package.json
"homepage": "https://<GitHubユーザー名>.github.io/<リポジトリ名>", // 追加
"name": "react_todo_list",
"version": "0.1.0",
```

2つ目にscripts内に`predeploy`と`deploy`を追記します｡
```json:package.json
"scripts": {
  "predeploy": "npm run build", // 追加
  "deploy": "gh-pages -d build", // 追加
  "start": "react-scripts start",
  // 省略
},
```

### 3. GitHub Pages用ブランチのpush

`package.json`に追加したコマンドで､GitHub Pages用ブランチをpushします｡

```bash
$ npm run deploy
```

ターミナルに`Published`と表示されれば成功です｡
リモートリポジトリに`gh-pages`ブランチがあるか確認してください｡

### 4. GitHub Pagesを公開する

リモートリポジトリのページからSetting > Pagesをクリックします｡

![スクリーンショット 2024-08-12 19.33.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551297/f12c796d-196a-0eb0-3e4c-21e61344147d.png)

![スクリーンショット 2024-08-12 19.37.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551297/5582238a-7c20-ec29-a20c-2330821f238d.png)

公開するブランチは`gh-pages`の`root`を選択してSaveをクリックしてください｡

![スクリーンショット 2024-08-12 19.40.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551297/479ce582-b78c-058f-7cfc-4e9121b1d112.png)

5分も待てば同じページに公開先のURLが表示されます｡
Visit Siteをクリックしてページを確認してください｡

![スクリーンショット 2024-08-12 19.43.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551297/a47a0cb7-d343-e807-be3f-46506090fdc6.png)

<br>

手順は以上となります｡
お疲れ様でした｡

## 参考
https://qiita.com/NagaJun/items/bed10dc5d826fda49ea0
Excel VBAでEdge操作するための方法

ExcelVBAからEdgeを操作する方法です。
chromeではないです、ほぼ同じだとは思いますが。

# 準備
ブラウザを操作するためには、「WebDriver」を利用します。
Edgeを操作するためには、「[Microsoft Edge WebDriver](https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/?form=MA13LH)」になります。
リンク先にある、それぞれのブラウザのバージョンに対応するドライバをダウンロードしてください。
Edgeの設定の「Microsoft Edgeについて」から確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/31889916-fadd-d120-7320-05729e1ea3dd.png)

次に、VBAからWebDriverを利用するためのライブラリ「[SeleniumBasic](https://github.com/florentbr/SeleniumBasic)」をインストール。

インストールの途中で「WebDriver for Microsoft Edge」にチェックが入っていることを確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/b115883a-278a-d745-5ace-4f823add43f9.png)

導入した「SeleniumBasic」は「.NET Framework」も利用します。
が基本的にWindowsに標準でインストールされています。
念のためcmdで確認しましょう。以下コマンドを叩いてReleaseの文字が出力されれば問題ありません。
```cmd
> reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" /v Release
```

先ほどダウンロードした「Microsoft Edge WebDriver」を解凍して、「msedgedriver.exe」を「edgedriver.exe」にリネームして、以下のものと入れ替えます。
```
"C:\Users\[ユーザ名]\AppData\Local\SeleniumBasic\edgedriver.exe"
```

# 動作確認
VBAプロジェクトで参照設定を追加します。
「Selenium Type Library」を追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/eca324af-da7c-60c5-85d3-1b9b1163996f.png)


モジュールを作成して、以下コードを実行します。
```VBA
Sub BrowserTest()
  Dim driver As New Selenium.WebDriver
  driver.Start "edge"
  driver.Get "https://google.com/"
  Stop
  driver.Close
  Set driver = Nothing
End Sub
```
Edgeが開いて、Googleへの遷移が確認出来たら、完了です。

もし、オートメーションエラーが発生した場合、.NET Frameworkが足りていないことが考えられます。
以下パスのvbsをダブルクリックして、再起動すれば解決するかもしれません。
```
"C:\Users\[各自ユーザ名]\AppData\Local\SeleniumBasic\Scripts\StartEdge.vbs"
```

以上です。
【JavaScript】Ruby → JS はじめての基礎文法

<h1>はじめに

私は普段Railsチュートリアルで学習しており、Rubyしか基本的に触ったことがない。
しかし昨日までハッカソンに参加しており、TypeScript + React + Next.jsで開発を行うことになり、なんかフロントが楽しくなったので学習してみることにした。

<h1>変数と定数など

<h3>変数

JavaScriptの変数の定義はこのように書く
```js
let hello = "Hello,world";
```
まず初めに`let`を置き、そのあとに変数名を書く
Rubyでは変数名からいきなり=でつなげて定義していた。
JSの場合はletを宣言する必要があるから、少し大変だね

変数というものは上書きできるので、letを省略し、この後に続けて書くと上書きをすることができた

Rubyと違い閉じタグをわすれないように！

`console.log(変数名);`とすることで、デベロッパーツールのconsoleの部分で見ることができる。rubyだと`putｓ`でやってたやつかな


<h3>定数

変数と似たようなもので定数というものがある。
```js
const superHello = "Hello,World!!!!!!!!";
```
定数は`let`の代わりに`const`と書くことで定義することができる
変数との違いは、変数では先程上書きができたのに対し、定数は上書きをすることができない。
あまりRubyでは定数というものをつかった覚えはないが、使うらしい。

<h3>使い分けについて

基本的にJSでは`const`を使うらしい。
数字が置き換わるなど変化するものに対しては`let`を使う
昔のコードを見ると`var`というものが使われているが、これは古い記述なのでもう使わない。


<h1>配列</h1>

```js
let inoki = ['いち','に','さん','だ'];
```
このように書く。
配列はよくわからないので一旦後回しにする

<h1>関数

<h3>function

軽く復習すると、Rubyでいう`def`のことである。
コードを見る限り、JSではRubyのような`end`はいらないらしい。
しかし代わりに波かっこをつけている。

```js
function square(number) {
  return number * number;
}
```

ここでは`square`という関数名にしていて、そこに引数である`number`がある。
そのしたに実行文を書く

しかし`return`という今まで使ったことない概念がある
<h4>return

JavaScriptでは、関数を呼び、コードを実行し、**その実行結果を関数に戻す**という作業が発生する。
つまりreturnがないと、コードを実行しただけで終わってしまい`square`関数にその実行結果は入らない。
別に実行するだけで終わるのなら`return`は無くていいのだが、基本的に関数はどこか他の場所で使いたいことが多数で、そのときに実行結果が関数に入ってなかったら、意味ないじゃん!!ということになる


<h3>アロー関数

`function`と同じく関数を定義するもので、アロー関数というものがある。

```js
const getTriangle = (base, height) => {
  return base * height / 2;
};
```

現在ではこのアロー関数を使うのが主流らしい。
constを使い、関数名の後 =　を使い、そのあと引数を指定、　=>　を書いてその後波かっこでその中にコードを書く。

```js
getTriangle();
```

呼び出すときはこのようにする。

これら２つの関数の違いはthisが固定か変動等の違いがあるが、よくわからないためアロー関数をとりあえず使っていくことにする。[参考記事](https://qiita.com/nicco_mirai/items/0bd0d0bcee72497d4b42)

<h1>if else

<h3>if else</h3>

```js
if (ifの条件文){
    コード;
}else{
    コード;
}
```
if,else文はこのように書く
アクセストークンがないとGitHubでpushができない

## はじめに
GitHubでリモートリポジトリにpushができず、時間をロスしたのでまとめます。

## 問題
フォルダ配下のファイルをすべて、mainブランチにpushしようとしました。
```
git add .  
git branch -M main
git push -u origin main
```

すると、以下のエラーメッセージが表示されました。
どうやらGitHubへの認証が失敗したっぽい・・・

```
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/(GitHubのユーザ名)/(リモートリポジトリ名).git/'
````

## 解決方法
パーソナルアクセストークン（PAT）を使用してpushするらしい。

 **▽ PATの取得方法**
1. GitHubにて、プロフィールアイコンから`Settings（設定）`を押下
2. 左サイドバーの`Developer settings`を押下
3. `Personal access tokens`をクリックし、次に`Tokens (classic)`を選択
4. `Generate new token`を押下して「repo」スコープを選択
5. トークンが生成されて画面上に表示される。（必ずメモる）

 **▽ PATを使用してpushのリベンジ！！**

1\. リモートリポジトリのURLが間違ってる場合は、GitのリモートURLを再設定
```
git remote set-url origin https://(GitHubのユーザ名):(PAT)@github.com/(GitHubのユーザ名)/(リモートリポジトリ名).git
```

2\. PATを使用して再push
```
git push -u origin main
```
以上、無事完了！

## おわりに
個人開発でたま〜に使ってた程度なので、基本的なコマンドもだいぶ忘れてました。
これを機に、コマンドにも慣れてGitHubを使い倒していきたいです！！！

## 参考
https://qiita.com/r_saiki/items/363a4444af5dbd241df5

https://qiita.com/mokio/items/f6c67c8f9af050383fc0
Dockerとは？コンテナ、イメージ、Dockerfileを解説！

# Dockerとは？

自分のPCの中にもう一つの小さなPC（コンテナ型仮想化環境）を構築してアプリケーションを動かす仕組みです。

コンテナの中には、アプリケーションを動かすために必要なプログラム、サーバー、データベースを入れて、アプリケーションを動かすことができます。

# Dockerの特徴

Dockerの特徴はホストOSのカーネルを使用してコンテナを動かすところにあります。

ホスト型仮想化と比較すると図のように異なります。

![エンジニアになる前から 継続していること！.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671845/141ba580-7228-fbfb-f07e-c07ad030f3cd.png)


ホスト型仮想化はホストOSとは別に、仮想化環境にゲストOSを用意して動作させています。

比べてコンテナ型仮想化はコンテナ内でホストPCのOSカーネルを使用することで軽量かつオーバーヘッド（追加のリソースや時間）が少なく動作させることができます。

:::note info
カーネルとは？
OSの中心的な役割で、ハードウェアとソフトウェアの間を仲介しメモリ管理、プロセス管理（プログラムの実行管理）を行います。
:::

# Dockerを使うメリット

1. 開発環境の素早い立ち上げ！
    - ホストPCのカーネルを使用していることから軽量に動作するため、コンテナを起動させることですぐにプログラムを実行確認することが出来ます。

1. 開発環境の共有が簡単！
    - コンテナを構築する仕様書であるdockerfileを共有することで開発チームメンバーと環境を揃えて開発を進めていくことができます。これにより、チーム1人のPCでは動作するけど、他メンバーでは動かない！そんなトラブルを減らすことが出来ます。またアプリケーションを本番環境にリリースする際にも役立ちます。本サーバーにリリースする際にも同じコンテナイメージを使用することで簡単にアプリをリリースすることが出来ます。

1. コンテナごと環境の分離
    - コンテナごと環境は隔離されるため、同じPCでコンテナごと異なるバージョンやライブラリを使用しても、問題なく動作します。

# Dockerを動かすために知っておきたいこと

ここからはdockerを使用するために知っておきたいことをご紹介します！

## Dockerfile

Dockerイメージを作るための指示書になります。
アプリケーションを動かすために必要な環境を記載しているため、
別のPCでも同じDockerfileを使用することで同じ環境を再現できるのです。

## Dockerイメージ

Dockerイメージとはコンテナを動かすためのテンプレートようなもので、
Dockerfileに記載するベースイメージをもとに作成されます。

例えばpythonアプリケーションを動かすためには、以下が必要になります。

- pythonそのもの
- 設定ファイル
- 依存関係：動作するための必要なライブラリ等

アプリケーションを動かすために必要なものをまとめたものがDockerイメージになります。

## Dockerコンテナ

テンプレートであるDockerイメージを基に動くアプリケーションの仮想化環境です。


さて実際にdockerを使ってコンテナを起動させる流れを見ていきたいと思います。


# コンテナを作って動かす流れ

1. Dockerfileを作成
2. Dockerfileを基にイメージを作成（build）される
3. Dockerイメージを実行（run）してコンテナが起動する

![エンジニアになる前から 継続していること！ (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671845/0c9a3ef5-5394-9045-eafe-7d7feca77cc1.png)



## 1.Dockerfileを作成

```Dockerfile
# ベースイメージとしてPython 3.8を使用
FROM python:3.8-slim

# 作業ディレクトリを設定。コンテナの中でどこで作業する指示する
WORKDIR /app

# 自分のPCにあるファイルをコンテナの中にもコピーします。
# 今回の例だとローカルのhogeファイルを/appにコピーしています
COPY /hoge

# Pythonスクリプトを直接Dockerfile内に書き込む
RUN echo 'print("Hello, World from Docker!")' > /hello.py

# コンテナ起動時に実行するコマンドを指定
CMD ["python", "/hello.py"]
```

こちらのDockerfileはPythonのベースイメージを使用して、コンテナを動かした場合に`Hello, World from Docker!`と出力するものになります。

## 2.イメージの作成

```cmd
docker build -t hello_world
```

dockerfileから`hello_world`という名前のイメージを作成します。

## 3.コンテナ起動

```cmd
docker run hello_world 
```

ビルドされたイメージを使って実際にコンテナを起動し`Hello, World from Docker!`が出力されます。

# まとめ

ご覧いただきありがとうございました！
実務でもdockerの環境構築を行うのでまとめてみました。
個人的にはいつもイメージとコンテナの違いが分からなくなってしまうことが多く
イメージはbuildしてコンテナはrunする！これで覚えたいと思います！

何か気になる点や、おかしな点ありましたらお気軽にコメントください！
初心者エンジニアがleetCodeのTop Interview 150を解いてみる #1Merge Sorted Array

## 1.　☺️はじめに☺️
### 始めようと思ったきっかけ
+ コーディングスキル向上と理解定着のため
→業務で必要なコーディングをするだけでは知識の幅が狭まるのではないかと思い、全般的な知識を身につけるべく、leetCodeに手を出してみた。
また、解いて終わりではなくて、問題を解く中で調べたことの記録をアウトプットすることで記憶を定着させる目的もある。
+ 言語化能力向上のため
→実務で人に自分がなぜこう書いたのか説明するのが苦手だな〜と思っていたので、問題を解くときに考えたことを書くことで練習できると思った。

### 💻対象言語
JavaScriptとJava

### 👀注意事項
当方実務経験1年のエンジニアなので、およそ最適とは言えない解き方をしているという自覚はありますので、温かい目で見守っていただけるとありがたいです😂💦

## 2.💪早速解いてみる💪
・88.Merge Sorted Array
https://leetcode.com/problems/merge-sorted-array/

（問題）
与えられた引数（配列 nums1,nums2 および整数 m,n）について、
配列nums1にnums2をマージし一つの配列にして昇順に並び替える。
整数mはnums1のマージ対象要素数を、整数nはnums2の要素数をそれぞれ表す。
nums1はm+n数分の要素を持っている。

（考え方①）
nums1の要素数がmより多ければ、インデックスm以降の要素を削除
nums1にnums2をpushして昇順に並び替える

```javascript:88.js
/**
 * @param {number[]} nums1
 * @param {number} m
 * @param {number[]} nums2
 * @param {number} n
 * @return {void} Do not return anything, modify nums1 in-place instead.
 */
var merge = function(nums1, m, nums2, n) {
if(nums1.length > m){
    nums1.splice(m);
}
for(let i = 0; i < nums2.length; i++){
    nums1.push(nums2[i]);
}
nums1.sort((a,b)=>a-b);
};
```
（考え方②）jsバージョンを解いた後に、nums1[m]以降をnums2の要素に取り換えちゃえばいいじゃんと気づいた！
```88.java
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        for(int i = m, j = 0; j < n; i++,　j++){
            nums1[i] = nums2[j];
        }
        Arrays.sort(nums1);
    }
}
```
よりシンプルになりました。

（学んだこと）
配列内で昇順に並び替える方法
+ JavaScript
nums1.sort((a,b)=>a-b);
✍メモ　b-aにすると降順になる
+ Java
Arrays.sort(nums1);
✍メモ　Javaのsort()では昇順にしかできない。降順は一筋縄ではいかなさそうなので、またの機会に詳しく調べる（笑）
【Unity】任意の小数点以下の桁で四捨五入を実装しよう

ゲームのスコアを四捨五入して表示したいけど、Unityに四捨五入できる関数がないらしいので自分で作ろう！

## 参考文献
こちらの記事を参考に、好きな小数点以下の値で四捨五入できるようにした。

http://kerotan-factory.xblog.jp/article/474601599.html 

## コード

```c#
//num 四捨五入する数字 DecPoint 四捨五入する位
public float Rounding(float num,float DecPoint)
    {
        float rounded;//ここに四捨五入した後の値を代入する
        float DecPart=num-Mathf.FloorToInt(num);//小数部分を取り出す
        int Dec1 =Mathf.FloorToInt(DecPart*Mathf.Pow(10,DecPoint));//小数部分10倍→小数点第二位以下切り捨て
        int Dec2=Dec1-Mathf.FloorToInt(Dec1/10)*10;//四捨五入する値以上の数字を消す
        //四捨五入のけいさん
        if(Dec2>=5)
        {
            rounded=Mathf.CeilToInt(num*Mathf.Pow(10,DecPoint-1));
            rounded/=Mathf.Pow(10,DecPoint-1);
        }
        else
        {
            rounded=Mathf.FloorToInt(num*Mathf.Pow(10,DecPoint-1));
            rounded/=Mathf.Pow(10,DecPoint-1);
        }
        return rounded;
    }
```

## コードの解説
人間が頭で考えるのと同じように、

1. 四捨五入する値を探す
2. 値が5以上か判定する
3. 切り上げor切り捨てする

という風に進めていく。
<details><summary>あると嬉しい前提知識</summary>

・Mathf.FloorToInt() 小数点以下切り捨て
・Mathf.CeilToInt() 小数点以下切り上げ
・Mathf.Pow(a,b) aのb乗
・中学数学の基礎知識(循環小数→分数あたりがわかっていると楽かもしれない)
</details>

### 1.四捨五入する値を探す
ここでは「2. 値が5以上か判定する」のために値を探して取り出すことが目標。
まずは小数部分だけを取り出す。
```C#
        float DecPart=num-Mathf.FloorToInt(num);//小数部分を取り出す
```
(四捨五入する数字)-(整数部分)で小数部分だけにする。
(整数部分は Mathf.FloorToInt(num) で小数部分を切り捨てて求める。)

小数部分が求まったら、四捨五入する数字だけを取り出す。
```C#
        int Dec1 =Mathf.FloorToInt(DecPart*Mathf.Pow(10,DecPoint));//小数部分10倍→小数点第二位以下切り捨て
```
小数点移動して、四捨五入する値が一の位になったら、
小数部分は使わないので Mathf.FloorToInt で切り捨て。

最後に判定のために一の位だけにする。
```C#
        int Dec2=Dec1-Mathf.FloorToInt(Dec1/10)*10;
```
十の位以上の数字をなくすために、小数点移動→整数部分切り捨て→小数点戻す。

### 2. 値が5以上か判定する
先ほど取り出したDec2をifを使って判定。(ただのif文なので割愛。)

### 3. 切り上げor切り捨てする
まずは切り上げから
```C#
            rounded=Mathf.CeilToInt(num*Mathf.Pow(10,DecPoint-1));
            rounded/=Mathf.Pow(10,DecPoint-1);
```
num * Mathf.Pow(10,DecPoint-1)で切り上げたい位まで小数点を移動させて切り上げ。
そのあと小数点を戻す。

切り下げの場合も同様。
```C#
            rounded=Mathf.FloorToInt(num*Mathf.Pow(10,DecPoint-1));
            rounded/=Mathf.Pow(10,DecPoint-1);
```
GROWI TypeScript/JavaScript SDKの紹介（その2：タグの操作）

[オープンソースの社内WikiであるGROWI](https://growi.org/)ではREST APIが公開されています。このAPIをより簡単に使えるよう、TypeScript/JavaScript SDKを開発しています。まだ途中ですが、徐々に機能追加していきます。

今回はタグの操作方法を解説します。

## 注意点

こちらはコミュニティSDKになります。公式への問い合わせはご遠慮ください。

## ソースコード

GROWI TypeScript/JavaScript SDKのソースコードはGitHubにて公開しています。ライセンスはMITです。

[goofmint/growi-sdk-alpha](https://github.com/goofmint/growi-sdk-alpha)

## インストール

インストールはnpm/yarn経由で行います。

```bash
$ npm install @goofmint/growi-js
# または
$ yarn add @goofmint/growi-js
```

## 使い方

まずはSDKをインポートします。

```javascript
const { GROWI } = require('@goofmint/growi-js');
// または
import { GROWI } from '@goofmint/growi-js';
```

そして、初期化します。この時、GROWIのAPIトークンを指定します。

```javascript
const growi = new GROWI({ apiToken: 'your-api-token' });
```

この他、以下のパラメーターを用意しています。

- `url` : GROWIのURLを指定します。デフォルトは`http://localhost:3000`です。
- `path` : GROWIのページパスを指定します。デフォルトは `` です。サブディレクトリにインストールしている際に指定します。

## ページの取得

ルートからのページ取得は、以下のように実行します。返ってくるのは `Page` オブジェクトです。

```javascript
const page = await growi.root();
```

ページ本文は `contents` メソッドで取得します。

```javascript
const contents = await page.contents();
```

### 子ページの取得

子ページを取得するには `children` メソッドを使います。これは `Page` の配列です。

```javascript
const children = await page.children();
```

## ページ名指定での取得

ページ名（パス）が分かっている場合には、 `page` メソッドを使います。

```javascript
const page = await growi.page({path: '/ページ名'});
```

## タグの取得

タグは `tags` メソッドで取得できます。結果は文字列の配列です。

```javascript
const tags = await page.tags(); // ['test 1', 'test 2']
```

## タグの追加

タグを追加する際には `addTag` メソッドを使います。

```javascript
await page.addTag('test 3');
```

## タグの削除

タグを削除するには `removeTag` メソッドを使います。

```javascript
await page.removeTag('test 1');
```

## タグでページを検索

タグでページを検索する際には、 `searchByTag` メソッドを使います。結果は `SearchResult` です。

```javascript
const result = await growi.searchByTag('tag');
result.pages[0] instanceof growi.Page; // true
result.total // total number of pages
result.took // time taken for search
result.hitsCount // number of hits
```

## まとめ

GROWIは社内Wikiとして、社内システムとのデータ連係ニーズが出やすいでしょう。ぜひ、Node.js SDKを使って、GROWIをシステムから操作してください。

[OSS開発wikiツールのGROWI | 快適な情報共有を、全ての人へ](https://growi.org/)
【Next.js】学習を兼ねてマイクロブログ構築してみた

# はじめに
約半年ほどReactを中心に学習していたのですが、今回初めてNext.jsを触ってみました。
実際に手を動かしながら勉強したうえでの所感や、Reactとの違いをまとめます。

https://qiita.com/AK_React/items/3b949924d79ecb194080
# 作成したアプリ

**内容**
技術ブログ

**使用言語**
React、Next.js(v14)、TypeScript

**UI**
tailwind css
DaisyUI

**テスト**
Jest
React Testing Library

**その他使用した技術**
Turbopack
micro CMS
Qiita API
Github
Firebase

**実装内容**

今回は記事の取得のみを行いました。記事の投稿や編集機能はつけていません。

**micro CMSで作成したブログ記事の取得**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675500/cddd908c-8b6c-f698-2f1b-ed7b9a2c9d2d.png)

**自分のQiita APIを使った記事の取得**
（サムネは取得が難しいため、固定の画像を使っています。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675500/6b8521cb-d36a-63fc-6544-3306ce40fc03.png)

# 作成の流れ
アプリ作成の大まかな流れはこちらです。

**１．環境構築**
今回は**Turbopack**を使用しました。

https://qiita.com/AK_React/items/3b949924d79ecb194080

**２．CI/CD構築（Github Actions）**
今回に限らず、アプリを作成するたびに構築しています。

https://zenn.dev/jinwatanabe/articles/4026d373383739

**３．Qiita APIをたたいて記事取得**

https://qiita.com/koki_develop/items/57f86a1abc332ed2185d

**４．Micro CMSにテスト記事を登録し、データ取得**

https://techtekt.persol-career.co.jp/entry/tech/20231222_01

**５．各ページの実装**
レイアウトはtailwind.cssで最低限整えました。

**６．テスト作成（Jest）**
ページ毎ではなく、コンポーネント毎にテストを分けて書きました。

# Reactと比較してみて
※Next.js v14の情報になります。

**・ルーティング設定が簡単**
Reactだとreact-routerをインストールしてパスを指定する実装が必要でしたが、**Next.jsではディレクトリ構成がそのままパスになります。**
これは非常にわかりやすいと思いました。

例えば、`/personal` のページを作成したい場合は、personalディレクトリを切ってその中にpage.tsxを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675500/58a74a23-79c2-5636-6646-1523e26f23f0.png)
***
**・サーバー側もクライアント側も実装可能**

Next.jsはデフォルトだとサーバーサイドコンポーネントですが、**ファイルの冒頭に `"use client"` を記述するだけで、簡単にクライアントコンポーネントに切り替えられます。**

クライアントコンポーネントに切り替えるタイミングとして、わかりやすいものを挙げてみました。
（あくまでも一例ですが）

・コンポーネントに情報を保持したい（useState,useEffectの使用）
・ユーザー操作に関するイベントを割り当てたい（OnclickやOnchangeなど）

**ただし、クライアントコンポーネントを多用することはパフォーマンスの低下につながる＆他コンポーネントへの影響を考える必要があるため、注意が必要**です。

https://zenn.dev/hamo/articles/31133919b987b9



# おわりに
**今回はあくまでも「APIをたたいて取得したデータを表示する」くらいしかやっていないので、Next.jsの恩恵を十分に受けられたわけではない**と思います。
それでも実際にこうして何か作ってみることで、Reactとの違いをざっくりと体感できたので面白かったです。やはり手を動かしてみることが一番。
# JISOUのメンバー募集中

プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからライン登録お願いします👇

https://projisou.jp
ubuntu 24.04 LTSで自宅サーバー構築（メールユーザーアカウント登録）

<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
taisuke@ubuntuserver:~$ sudo apt -y install mailutils

taisuke@ubuntuserver:~$ sudo echo 'export MAIL=$HOME/Maildir/' >> /etc/profile.d/mail.sh
taisuke@ubuntuserver:~$ sudo adduser ubuntu

#自身にテストメール送信 [mail (ユーザー名)@(ホスト名)]
ubuntu@mail:~$ mail ubuntu@localhost

#Cc の宛先
Cc:
#件名
Subject: Test Mail #1
#本文
This is the first mail.
#本文を終了する場合は Ctrl + D キー
#受信メール参照
ubuntu@mail:~$ mail
"/home/ubuntu/Maildir/": 1 message 1 new
>N   1 ubuntu             Thu May 30 00:04  13/450   Test Mail #1
#表示したいメールの番号を入力
? 1
Return-Path: <ubuntu@mail.ご自身のドメイン名>
X-Original-To: ubuntu@localhost
Delivered-To: ubuntu@localhost
Received: by mail.ご自身のドメイン名 (Postfix, from userid 1000)
        id 45E251814A8; Thu, 30 May 2024 00:04:59 +0000 (UTC)
To: <ubuntu@localhost>
Subject: Test Mail #1
User-Agent: mail (GNU Mailutils 3.17)
Date: Thu, 30 May 2024 00:04:59 +0000
Message-Id: <20240530000459.45E251814A8@mail.srv.world>
From: ubuntu <ubuntu@mail.srv.world>

This is the first mail.

#終了する場合は [q]
? q
Saved 1 message in /home/ubuntu/mbox
Held 0 messages in /home/ubuntu/Maildir/
<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
Eclipse IDEとは何か

## はじめに
現場で使うようになって理解するために書いてます。
初心者やツールを知らない人用ですのでご認識お願いします。

基本単語にリンクが貼ってあるものはその単語を説明しているページに飛ぶようにしているのでわからない場合は見てみてください。

分かりにくい内容があれば教えてください。すぐ修正します！

## Eclipse IDEとは
Eclipse IDEは、ソフトウェア開発者向けの無料でオープンソースの統合開発環境（[IDE](URL"https://qiita.com/solid_roni/items/ceb5c88ec25e62a32ec5")）です。特にJavaプログラミングに強みを持ちますが、C/C++、Python、JavaScriptなど、他の多くのプログラミング言語もサポートしています。プラグインを追加することで機能を拡張できる柔軟なツールです。

## Eclipse IDEの主な特徴と機能
**多言語サポート**
Eclipseは、Javaを中心に設計されていますが、C/C++、Python、PHP、JavaScript、HTML、CSSなど、さまざまなプログラミング言語に対応しています。

これにより、さまざまなプロジェクトを1つのIDEで管理でき、異なる言語で書かれたコードを効率的に編集できます。

**プラグインアーキテクチャ**
Eclipseの強力なプラグインアーキテクチャにより、必要に応じて機能を追加したりカスタマイズしたりできます。数千種類以上のプラグインが公開されており、特定の言語サポート、バージョン管理システムの統合、デバッガ、プロファイラー、ビルドツールなど、多岐にわたる機能を拡張可能です。

**コード編集と補完機能**
Eclipseには、高度なコード補完機能、シンタックスハイライト、コードリファクタリング、リアルタイムエラーチェックなど、開発効率を高めるためのさまざまなツールが組み込まれています。特にJavaの開発では、クラスやメソッドの自動補完、インポート管理、コードナビゲーションが強力です。

**デバッグ機能**
Eclipseは、統合デバッガを提供しており、コードのステップ実行、ブレークポイントの設定、変数の監視、スタックトレースの確認などが可能です。これにより、複雑なバグの検出や修正を効率的に行えます。

**ビルドツールとの統合**
Maven、Gradle、Antなどのビルドツールとシームレスに統合されており、ビルドや依存関係の管理、プロジェクトのデプロイを自動化できます。また、CI/CDツールとの統合も容易です。

**バージョン管理システムのサポート**
EclipseはGit、SVN、Mercurialなどのバージョン管理システムと統合されており、開発者はIDE内から直接バージョン管理操作を行うことができます。これにより、コードのバージョン管理やチーム開発がスムーズに行えます。

**クロスプラットフォーム対応**
Eclipseは、Windows、macOS、Linuxなど、主要なオペレーティングシステムで動作します。これにより、開発者はどのプラットフォームでも同じ開発環境を利用できます。

**コミュニティとサポート**
Eclipse IDEは広範なコミュニティによってサポートされており、豊富なドキュメント、チュートリアル、フォーラムが利用可能です。さらに、オープンソースプロジェクトであるため、ユーザーは自分自身でコードに貢献したり、特定のニーズに応じてカスタマイズしたりすることができます。

## 用途とメリット
Eclipse IDEは、特にJava開発において強力なツールですが、その柔軟性と拡張性により、さまざまな開発シナリオに対応できます。初心者から上級者まで、さまざまなレベルの開発者が利用できるよう設計されており、統合開発環境としての信頼性と使い勝手が評価されています。

その結果、Eclipse IDEは、教育機関、企業、オープンソースプロジェクトなど、さまざまな場面で広く使用されています。

## 終わりに
いかがでしたでしょうか？皆様の参考になれば幸いです。
最後まで見て頂きありがとうございました。
テストエンジニアとして2ヶ月たったので、学んだことを振り返る

## 2ヶ月間で行った業務
新卒でテストエンジニアになり、2ヶ月が経ちました。以下に主な業務内容を記載します。

・プロジェクト計画書やテスト計画書の読み込み
・FP値計測
・テストを行うかどうかのパターン表作成

自分はバックエンドとテーブル間の処理を担当していました。バックエンドとテーブル間でのFP値計測やテストパターン表の作成を主に行いました。

## 意識したこと
2ヶ月間で意識したことはコミュニケーションを円滑にとることです。具体的には、コミュニケーションを苦手とする人に、周知事項の確認を行うことで、作業者全体で共通認識の抜け漏れが無いように努めていました。

## コミュニケーションを意識したきっかけ
コミュニケーションを意識したきっかけは、現場に入って初日に起こりました。
作業が早い同期の社員が、先に知り得たことや詰まった箇所を他の同期達に教えまわっていたことです。（こいつはできる、、、！と思わされました笑）
さらに驚かされたことは、教えるときにかがむことで、目線を相手より下げていたことです。作業者は座って作業しているので、かなりかがまないといけません。それを自然にできるのは、さすがだなと感じました。（自分も真似させてもらっています(>_<)）
自社の勤怠入力をseleniumで自動化してみよう_Part2【実践編】

## 前提
以下の環境が構築されていることを前提とします。
※構築がまだの方は<a href="">こちらの記事</a>をご参照ください。

・python
・selenium
・chromeDriver


## 動作確認
まずは実際に軽く動かしてみましょう。
以下のファイルを作成し、ターミナルで実行してみましょう。
Google Chromeが起動したらOKです！

※初めて実行される場合は、エラーメッセージが出るかもしれません。その場合は<a href="https://qiita.com/apukasukabian/items/77832dd42e85ab7aa568">こちらの記事</a>を参考にしてみてください。30秒ほどで解決できます。

```python:test.py
from selenium import webdriver

# Chromeブラウザを起動
browser = webdriver.Chrome()
```


## 基本的な書き方
例）ログイン画面にて、指定のユーザでログインする

```python:test.py
from selenium import webdriver

# Chromeブラウザを起動
browser = webdriver.Chrome()

# 指定したドライバの要素が見つかるまでの待ち時間を設定（今回は10秒）
# 設定した待ち時間を越えても要素が見つからない場合は、Exceptionが発生
browser.implicitly_wait(10)

# 勤怠システムにアクセス
browser.get("https://******.jp/")

# → アクセス後、まずログインページに遷移される

# ログイン画面の各要素を取得
loginId = browser.find_element(By.ID, "login_id")
password = browser.find_element(By.ID, "login_password")
loginBtn = browser.find_element(By.ID, "login_button")

# ログインID、パスワード入力
loginId.send_keys("luk3G-SE00101")
password.send_keys("spider25")

# ログインボタン押下
loginBtn.click()
```

→ 無事ログインして、勤怠入力画面に遷移しました。



## 補足
seleniumは実行完了後、開いたChromeも自動で閉じる
もし終了後もChromeを開いた状態を保ちたければ、以下を追記する

```python:test.py
import os
import signal


# ↓末尾に記載する！
# python処理終了後、chromeを開いたままにする
os.kill(browser.service.process.pid,signal.SIGTERM)
```

## メッセージ
今回勤怠入力の画面操作については記載しておりませんが、基本的には同じような形で、画面要素を取得してフォーム入力やボタン操作をしていくことになります。
seleniumは、慣れると簡単！記事も豊富なので、記載方法がわからない箇所あれば検索してみましょう！

## 注意点
この手のスクレイピングという技術は、サイトによっては禁止されていたりするものもあるので、始める前に確認をしましょう。
ubuntu 24.04 LTSで自宅サーバー構築（Dovecotの設定）

<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
taisuke@ubuntuserver:~$ sudo apt -y install dovecot-core dovecot-pop3d dovecot-imapd
taisuke@ubuntuserver:~$ sudo vi /etc/dovecot/dovecot.conf
#30行目 : コメント解除
listen = *, ::
taisuke@ubuntuserver:~$ sudo vi /etc/dovecot/conf.d/10-auth.conf
#10行目 : コメント解除して変更 (プレーンテキスト認証も許可)
disable_plaintext_auth = no
#100行目 : 追記
auth_mechanisms = plain login
taisuke@ubuntuserver:~$ sudo vi /etc/dovecot/conf.d/10-mail.conf
#30行目 : Maildir 形式に変更
mail_location = maildir:~/Maildir
taisuke@ubuntuserver:~$ sudo vi /etc/dovecot/conf.d/10-master.conf
#110-112行目 : コメント解除して追記
  #Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
taisuke@ubuntuserver:~$ sudo systemctl restart dovecot
<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
初心者向け　paizaDランク「N倍の文字列」を解く

「paizaxQiita記事投稿キャンペーン」より、Dランク問題「N倍の文字列」を解きます。

言語はJavaScriptです。

https://paiza.jp/works/mondai/d_rank_skillcheck_archive/square

## for文を使用
回数分回して`*`を文字列追加しています。

```javascript
let str = '';
for (let i = 0; i < lines[0]; i++) {
    str += '*';
}
console.log(str);
```

## Arrayオブジェクトを使用
```javascript
console.log(Array(+lines[0]).fill('*').join(''));
```
個数分の空配列作って、それを文字列`*`で満たし文字連結させます。
Code Readyとはなんぞや？

## はじめに
現場で使うようになって理解するために書いてます。
初心者やツールを知らない人用ですのでご認識お願いします。

基本単語にリンクが貼ってあるものはその単語を説明しているページに飛ぶようにしているのでわからない場合は見てみてください。

分かりにくい内容があれば教えてください。すぐ修正します！

## Code Readyとは
Code Readyは、プログラミングの勉強やプロジェクトの開発を効率的に行うためのツールであり開発者やエンジニア向けの統合開発環境（[IDE](https://qiita.com/solid_roni/items/ceb5c88ec25e62a32ec5)）です。Red Hatによって提供されており、特にクラウドネイティブなアプリケーションの開発に焦点を当てています。

### CodeReadyの主な特徴
**開発環境の統合**:
   CodeReadyは、さまざまなプログラミング言語やフレームワークをサポートしています。これにより、開発者は1つのツール内でさまざまなタイプのプロジェクトを効率的に管理できます。

**コンテナーベースの開発**:
   特にKubernetesやOpenShiftなどのコンテナープラットフォームでの開発を強力にサポートします。これにより、開発者はアプリケーションを本番環境に近い状態でローカルにテストすることができます。

**拡張性**:
   CodeReadyはさまざまな拡張機能やプラグインを利用でき、必要に応じて機能をカスタマイズすることが可能です。これにより、特定のプロジェクトや開発スタイルに合わせた最適な開発環境を作ることができます。

**コラボレーション機能**:
   CodeReadyはチームでの共同作業をサポートする機能も提供しています。これにより、開発者はリアルタイムでコードを共有し、共同で作業することが容易になります。

要するに、CodeReadyはプログラミングをもっと簡単で効率的に行うための「道具箱」と言えます。

## Code Readyの主な製品紹介
下記は補足ですので興味がある方のみ見てみてください。

<!-- open属性なし -->
<details><summary>1. Red Hat CodeReady Workspaces</summary>

   - **概要**: Red Hat CodeReady Workspacesは、クラウド上で動作する開発環境を提供するツールです。従来のローカルIDEに代わるもので、特にコンテナベースのアプリケーション開発を支援します。このツールは、開発者がプロジェクトを素早く始められるように、事前設定された開発環境を提供します。
   - **特徴**:
     - **クラウドネイティブ**: CodeReady WorkspacesはKubernetesやOpenShiftをベースにしており、クラウドネイティブなアプリケーション開発をサポートします。
     - **コンテナベースの開発**: 各開発環境はコンテナで隔離されており、開発者は異なる言語やフレームワークを持つ複数のプロジェクトを同時に管理できます。
     - **コラボレーション機能**: チームメンバーが同じ作業スペースを共有し、リアルタイムでコードを編集、デバッグすることが可能です。
     - **セキュリティとコンプライアンス**: 企業のセキュリティポリシーやコンプライアンスに準拠した開発環境を提供します。

</details>

<!-- open属性なし -->
<details><summary>2. Red Hat CodeReady Studio</summary>

   - **概要**: CodeReady Studioは、エンタープライズ向けの統合開発環境で、特にJava EE、Spring、Angular、Node.js、Maven、Docker、Kubernetesなど、様々なエンタープライズ向けのテクノロジーをサポートします。Eclipseをベースにしており、Red Hatのミドルウェア製品との統合が特徴です。
   - **特徴**:
     - **多言語対応**: Java、JavaScript、TypeScript、HTML5、CSSなど、複数のプログラミング言語をサポートします。
     - **ミドルウェア統合**: JBoss EAP、Red Hat Fuse、Red Hat AMQなどのRed Hatミドルウェア製品とスムーズに連携します。
     - **クラウド開発のサポート**: Docker、Kubernetes、OpenShiftなど、クラウドネイティブな開発ツールと統合されており、コンテナベースのアプリケーション開発が可能です。

</details>

<!-- open属性なし -->
<details><summary>まとめ</summary>

CodeReadyは、クラウドネイティブな開発を支援するための強力なツールセットを提供します。CodeReady Workspacesは、ブラウザベースの開発環境として、コンテナベースのアプリケーション開発を効率的に行うための理想的な選択肢です。一方、CodeReady Studioは、エンタープライズ向けの開発者に多機能なIDEを提供し、Red Hatのミドルウェア製品との深い統合を実現します。

これらのツールを活用することで、開発者は効率的かつ一貫性のある環境で作業し、クラウドネイティブなアプリケーションの開発を加速させることができます。

</details>

## 終わりに
いかがでしたでしょうか？皆様の参考になれば幸いです。
最後まで見て頂きありがとうございました。
PowerShellの非同期処理

取り組む機会があったので、基本仕様をメモ
最近のドキュメントは7系前提が中心なので5系の人は注意

[ジョブについて_公式サイト](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_jobs?view=powershell-7.4 "公式サイト")

[PowerShellの導入](https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.4)

非同期処理の種類
ジョブ
　→別プロセスが起動する
[ジョブ起動_公式サイト](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/start-job?view=powershell-7.4 "公式サイト")

スレッド
　→同一プロセスの別スレッド
[スレッドについて_公式サイト](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_thread_jobs?view=powershell-7.4 "公式サイト")

個人的な注意とか
非同期の多重度が増える想定なのであれば、スレッドでやることを検討
PSの5系はスレッドがないので、スレッドを使用する場合は7系の導入か個別にモジュールを導入するかの対応が必要
__引数の設定の記述ルールがわかりにくいのでChatGPTとかGeminiを使うとわかりやすい__

基本コマンド

起動
Start-Job -ScriptBlock { 処理（引数は$input） } -InputObject ここに引数
Start-ThreadJob -ScriptBlock { param (ここに受け取る引数を設定)  処理} -ArgumentList @(ここに配列で引数を設定)

ジョブの一覧を取得
Get-Job

ジョブの終了を待機
Wait-Job

ジョブの出力を取得　単純に取得すると同時に削除される
残す場合には　-keep　を付与する
Receive-Job

起動後に終了を待機して受信する
Get-Job |  Wait-Job | Receive-Job



ちなみに、新たにセッションを作ってしまう選択肢もあるが、あまり目的に合わないので、今回は割愛
[セッションを作成](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/new-pssession?view=powershell-7.4 "")
AWS Well-Architected を5分で理解する

AWS Well-Architected for Startupsは、AWS上で安全で、高速で、信頼性が高く、コスト効率の良いアプリケーションを構築するためのガイドラインです。
6つの柱（オペレーショナル・エクセレンス、セキュリティ、信頼性、パフォーマンス効率、コスト最適化、持続可能性の柱）から構成され、各柱は、AWSを有効的で不可欠な要素に焦点を当てています。

### 6つの柱

1. **オペレーショナル・エクセレンス:** 
    - 運用を自動化し、人為的ミスを減らすことで、スムーズな運用を実現します
    - 障害発生した場合、迅速に問題を特定し、解決するための手順を事前に用意しておきましょう
    - 小さな変更を頻繁に行うことで、リスクを最小限に抑え、安定性を確保します

2. **セキュリティ:**
    - アクセス権限を最小限に抑え、不要なアクセスを制限することで、セキュリティを強化します
    - データを暗号化することで、データの盗難や不正アクセスから保護します
    - AWSのセキュリティサービスを活用して、セキュリティ体制を強化しましょう

3. **信頼性:**
    - 障害が発生した場合でも、サービスが継続的に提供されるよう、冗長化されたシステムを構築します
    - 障害発生時の対応手順を事前に策定し、迅速な復旧を実現します
    - 負荷テストや障害注入テストを実施することで、システムの信頼性を確認しましょう

4. **パフォーマンス効率:**
    - リソースを効率的に使用し、無駄をなくすことで、コスト削減を実現します
    - ワークロードの特性に合わせて、最適なリソースを選択しましょう
    - サーバーレスサービスを活用することで、運用負荷を軽減できます

5. **コスト最適化:**
    - 不要なコストが発生しないように、コストを常に監視しましょう
    - AWSの料金体系を理解し、コスト効率の高いサービスを選択しましょう
    - リソースの使用状況を分析し、無駄なリソースを停止しましょう

6. **持続可能性の柱:**
    - 持続可能性の責任共有モデル
    - 環境への影響の把握
    - 使用率の最大化による必要なリソースの最小化とダウンストリームの影響の削減

#### AWS Well-Architectedツール
- AWSコンソールから無料で利用できます
- 6つの柱に沿って、ワークロードを評価することができます
- 改善点やリスクを特定し、推奨事項を提供します。

#### ツール使用のメリット
- ユーザー体験の向上
- ダウンタイムの最小化
- セキュリティの強化
- 負荷への対応力向上
- ツールの使い方

#### AWSコンソールから無料で利用可能
- ワークロードを定義し、一連の質問に回答
- 6つの柱について評価し、改善点を特定

#### 重要なポイント
- 正直に現状を評価
- 継続的な改善を行う

## まとめ
これらの柱を意識しつつ、AWSのツールを使ってシステムを分析し、改善点を把握します。
このプロセスにより、より良いユーザー体験を提供し、ビジネスの成長を支援できます。

AWSの「AWS Well-Architectedツール」は、これらのチェックと改善を支援する無料サービスです。
ワークロード名を入力し、質問に答えることで、改善可能な箇所を特定でき、それにより強力でコスト効率の良いクラウドインフラを実現できます。

## 参考
#### AWS Well-Architected
https://aws.amazon.com/jp/architecture/well-architected/?wa-lens-whitepapers.sort-by=item.additionalFields.sortDate&wa-lens-whitepapers.sort-order=desc&wa-guidance-whitepapers.sort-by=item.additionalFields.sortDate&wa-guidance-whitepapers.sort-order=desc
#### AWS Well-Architected for Startups - 5 Minute Overview
https://youtu.be/GhTC-pMgOjc?si=AbYyTCGl7BT5TyNF
https://youtu.be/tXRPicLruWc?si=p7zWqIhqxnFvBpIz
https://youtu.be/s9vf3r2fGXI?si=_iJsg8veAcPFZfYJ
https://youtu.be/U5CIFoWG00A?si=wMUq7YD81Ob3nqdE
https://youtu.be/m0iUkVYUYeY?si=8N8exs2CcdC0vrfB
https://youtu.be/M7HbsjuqC9M?si=ZS4PLYxNetA5rraQ
https://youtu.be/wm1adkZ7KYs?si=tZsewPICvJN5SuCZ
https://youtu.be/7LEbRRbxwUo?si=-bDc-dfPTaeGf6Ws