OmniAICreator/Qiita-1.07M huggingface dataset:
ESP32: MicroPython の使い方

Arch Linux で確認しました。

## esptool のインストール

```bash
sudo pacman -S esptool
```

バージョンの確認

```bash
esptool.py version
```

実行結果

```text
$ esptool.py version
esptool.py v4.7.0
4.7.0
```

## フラッシュメモリの消去

```bash
esptool.py erase_flash
```

## MicroPython のファームウェアのダウンロード

こちらからダウンロードします。
[ESP32 / WROOM](https://micropython.org/download/ESP32_GENERIC/)

ESP32_GENERIC-20240602-v1.23.0.bin

## USB 経由でファームウェアの書き込み

```bash
esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 460800 write_flash \
	 -z 0x1000 ESP32_GENERIC-20240602-v1.23.0.bin
```

## シリアルで接続

必要なソフトのインストール

```bash
sudo pacman -S uucp
```

接続

```text
$ cu -l /dev/ttyUSB0 -s 115200
Connected.

>>> import sys
>>> print(sys.version)
3.4.0; MicroPython v1.23.0 on 2024-06-02
```

接続したら、一度 Enter を入力して下さい。
Python のプロンプトが出てきます。

Python として使ってみる

```text
>>> 8 + 12
20
>>> 5 * 4
20
>>> 12 - 3
9
```
IntelliJでScala Scriptのコード補完を使いながらLeetCodeをとく

## 動機

業務で使い始めたScalaをスラスラ書けるようになりたい。
このために、LeetCodeで100問くらい簡単な問題を解いて練習しようと考えた。
最初はコード補完を有効にしてscala docを読みながらコーディングしたのだが、LeetCode (HackerRank しかり) は補完が効かない。
そこで、IntelliJでScala Scriptのコード補完を使うことにした。

大した内容でもないが、メモる。

(最初はJupyter notebookのscalaカーネルを使おうと考えたが、メソッドドックが表示されなかったので諦めた。)


## 手順

### (1) scalaスクリプト`solve.sc`を作成する。
場所はどこでも良さそう。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/474ed7d6-061e-c052-df9e-ede775180197.png)

### (2) コーディングする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/a63f74b3-08e0-142a-b23e-1602a79eb06d.png)

今のところ `require()`メソッドを使ってテストを書いている。
将来的には、`src`にソースコード、`test`にテストコードを置いて、Scala moduleとしてコーディングしても良いかもしれない。

### (3) 書いたコードをコピペして、LeetCode上でsubmitする。

### (4) Chat GPT で、よりScala Likeな解き方がないかを尋ねる。

例えば、上の問題であれば、 `nums ++ nums` でimmutableに解くことができる。


## その他

覚えたショートカットをメモっておく。


```
shift ctrl p → コード上に型の表示
option Enter → missing import を解決
```
Orgファイル中の引用文献だけの BibTeX ファイルを生成するツール


# org-modeにおける引用のハンドリング

Emacs org-modeのアウトライン編集とエクスポート機能はアカデミックな文書作成においてもとても有用です。アカデミックライティングにおいて引用文献の管理はエッセンシャルですが、org-modeでは引用管理ツールに大きく二つの選択肢があります。一つは、jkitchin氏が精力的に開発している[org-ref](https://github.com/jkitchin/org-ref)パッケージ、もう一つはorg-modeの標準機能として提供されている[org-cite](https://orgmode.org/manual/Citation-handling.html)です。

org-refはorg-citeの実装以前から開発されており、引用管理以外にも文献検索bibtexファイルの管理等、多様な機能を提供しています。しかし私はシンプルなorg-citeを文献管理パッケージの[citar](https://github.com/emacs-citar/citar)と組み合わせて使っています。

# 文書で引用している文献を抽出したリストがほしい

普段の作業では、自分の管理するすべての書誌情報をまとめたbibtexファイル `references.bib` をマスターファイルとして、そこ必要な文献を引用しています。しかし、時々「引用している文献だけを抽出した BibTeX ファイルが欲しい」と思うことがあります。

多機能なorg-refにはこの機能が `org-ref-extract-bibtex-to-file` として実装されています。この関数は、org ドキュメントで実際に引用された文献だけを含むローカルな BibTeX ファイルを生成してくれます。しかし、citar & org-cite の環境では標準機能に含まれていません。

# 自作関数: citar-extract-bibtex-to-file

そこで、自分で作ってみるました。手順としては以下のようになります。

1. org-citeがエクスポート時に引用文献を処理するための関数 org-cite-get-references を用いて文書中の引用文献のcitekeyを抽出
2. 抽出したcitekeyを用いてcitarでマスターbibtexファイルを検索し、書誌情報を得る。
3. 書誌情報をbibtex形式に再構成してファイルに出力

このようにして作成したのが `citar-extract-bibtex-to-file` です。始めて自分で自分が必要な機能を作成しました。
プログラミングは素人なので、もっとスマートなやり方があるかもしれませんが、とりあえず自分の求めていた機能を実現できて満足です。

せっかくなので、これも初体験ですがパッケージとしてgithubで公開してみました。ニッチなツールかもしれませんが、誰かの役に立ったり、有用なコメントがもらえるとうれしいです。

- [mlmbl/citar-extract-bibtex](https://github.com/mlmbl/citar-extract-bibtex)
TypeScriptにてユニオン型の型ガードを整理したい

# 型ガードとは
* 型絞り込みのために使う論理チェックのこと

# ユニオン型とは
* ある値の取り得る型の数を、2つ以上に拡大する

```typescript
let hoge: string | number
```

# ユニオン型の型ガードを整理する

* 複数の型をもつユニオン型などの場合はどのように型ガードするといいのかを整理したい

## ユニオン型だと型安全ではないと言われる
* TypeScriptの型システムではユニオン型などの複数の型を取り得る場合に、
そのプロパティにアクセスするとどちらかの型がくるかわからないため型安全ではないと判断される

```typescript
// hoge: string | number
let hoge = Math.random() > 0.5 ? 'John' : 40;

// 引数にstringかまたはnumberのどちらが来るかわからない
fugafuga(hoge)
```

### 値を割り当てる
* TypeScriptは変数に値が割り当てられたら、その変数が何の型なのかを理解してくれます
* 値を割り当ててしまえば、その変数はstring型なんだとTypeScriptが理解してくれる

```typescript
let hoge: string | number

hoge = "hoge"

hoge.toUpperCase()
```

### typeof演算子を使用する

* string型やnumber型などを絞り込みたい場合はtypeofなどを使用する
* tyoeof はその値の型を文字列で返してくれます
* 注意点としてはその値の型がnullだった場合に"object"として返ってくる

```typescript
// hoge: string | number
let hoge = Math.random() > 0.5 ? 'John' : 40;

const fugafuga = (param: string | number) => {
    if (typeof hoge === 'string') {
        console.log(hoge.toUpperCase())
    }
}
```

#### typeof演算子を使用して、値がnullの場合
* nullかどうかは別で判定条件を設ける必要がある
```typescript
const isObject = (value) => {
  return value !== null && typeof value === "object";
}
```

https://typescriptbook.jp/reference/values-types-variables/typeof-operator#null%E3%82%92%E5%88%A4%E5%88%A5%E3%81%99%E3%82%8B

### in演算子を使用する
* オブジェクトのユニオン型だとどのように型ガードを行えばいいか？

* in演算子でオブジェクトのプロパティが含まれているかどうかをチェックする
```typescript

type PoemWithPages = {
    name: string
    pages: number
}

type PoemWithRhymes = {
    name: string
    rhymes: boolean
}

type Poem = PoemWithPages | PoemWithRhymes

const poem: Poem = Math.random() > 0.5 ? { name: "Hogehoge", pages: 7 } : { name: "Fugafuga", rhymes: true }
if ("pages" in poem) {
    console.log(poem.pages)
} else {
    console.log(poem.rhymes)
}
```

両方のオブジェクトに共通しているプロパティだと絞り込めない
```typescript
// 両方のオブジェクトに共通しているプロパティだと絞り込めない
if ("name" in poem) {
    console.log(poem.pages)
} else {
    console.log(poem.rhymes)
}
```

### タグ付きユニオン型にする
タグのプロパティを設けてそのプロパティでどのオブジェクトかを判別できるようにする

```typescript

type PoemWithPages = {
    name: string
    pages: number
    type: 'pages'
}

type PoemWithRhymes = {
    name: string
    rhymes: boolean
    type: 'rhymes'
}

type Poem = PoemWithPages | PoemWithRhymes

const poem: Poem = Math.random() > 0.5 ? { name: "Hogehoge", pages: 7, type: 'pages' } : { name: "Fugafuga", rhymes: true, type: 'rhymes' }
if (poem.type === 'pages') {
    console.log(poem.pages)
} else {
    console.log(poem.rhymes)
}
```

# おわりに
今回はユニオン型の型ガードについて学習していて、それらを整理したかった

https://www.oreilly.co.jp/books/9784814400362/
nvidia-runtime のdocker と普通のdocker でのbuildの備忘録

## 概要

docker build で

```bash
failed to create task for container: failed to create shim task: OCI runtime create failed: nvidia-container-runtime did not terminate successfully: exit status 2: unknown
```

のように言われた時、

```bash
cat /etc/docker/daemon.json
```

で

```
{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}
```

となっていた場合、

```
{
    "default-runtime": "runc",
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}
```

と変更して、

```bash
sudo systemctl restart docker
```

としましょう。
[Python] 選択ソートを理解しよう！

## 概要
多分他に記事は山程ありそうなので、自分自身の辞書代わり程度に記載します！

競技プログラミングに興味が前からありますが、
最近Pythonに移行したので基礎からやってますー

## 選択ソートとは？
要素を順番に確認し、最小値 or 最大値の要素を見つけたら
その要素を先頭から順に並び替えます。

所謂ソートアルゴリズムってやつですな。

## 計算量
常にリスト全体の中から最小（または最大）の要素を探すため、
リストの長さが 「𝑛」の場合、比較の回数は 𝑂(𝑛2乗)になります。

リストがほとんどソート済みでも時間計算量は変わりません。

## 特徴
:::note info
メリット
・実装が簡単(理解しやすい!)
・メモリ使用量少
:::

:::note warn
デメリット
・比較回数が多いため、効率が悪く、リストが大きいと処理が遅い
:::

## 例
### 手順を簡単な例でイメージしてみよう！

次のリスト [29, 10, 14, 37, 13] を昇順にソートしてみましょう！

### 1. 最小値を探そう 
[29, 10, 14, 37, 13] から最小値を探します。
最小値は 10 です。これを先頭の 29 と交換します。

``` result.py
[10, 29, 14, 37, 13]
```

### 2. 次の最小値を探そう
残りのリスト [29, 14, 37, 13] の中から最小値を探します。
最小値は 13 です。これを 29 と交換します。

``` result.py
[10, 13, 14, 37, 29]
```

### 3. 同様に残りのリスト要素から最小値を探そう！
残りのリスト [14, 37, 29] の中で最小値を探します。
最小値は 14 ですね！

今回の場合はすでに正しい位置にあるため、交換は不要になります。

``` result.py
[10, 13, 14, 37, 29]
```

### 4. 残りは？
最後に、残りのリスト [37, 29] の中で最小値 29 を探し、37 が交換です。

``` result.py
[10, 13, 14, 29, 37] 
```

ソート完了！

## 実装してみよう！
```selection.py
from typing import List
import random

def selection_sort(numbers: List[int]) -> List[int]:
    len_numbers = len(numbers)
    for i in range(len_numbers):
        # 一時的に最初の要素を保持
        min_index = i
        for j in range(i + 1, len_numbers): # 対象の要素はズレるので+1する
            if numbers[min_index] > numbers[j]:
                # 最小値が見つかったら、indexを入れ替える
                min_index = j

        numbers[i], numbers[min_index] = numbers[min_index], numbers[i]

    return numbers


if __name__ == '__main__':
    # 好きな配列を用意しても、適当な乱数配列でもよし！
    nums = [random.randint(0, 100) for _ in range(10)]
    print(selection_sort(nums))

```

### 結果例
``` result.py
[9, 15, 25, 35, 58, 59, 73, 74, 83, 90]

Process finished with exit code 0
```


## 最後に
お疲れ様でした！
他にも似たような記事はありますが、私自身Pythonで競技プログラミングを
今後頑張っていこうと思うので他アルゴリズムも解説しようかと思います！

## 参考文献

https://yurukumanabu-program.com/c-language-selectsort/
Java 学習記録 1日目

# 目的
私は現在、1年後の転職活動開始に向けていろいろなことを勉強しています。
この前お話を聞いた会社の社長さんから「Javaはどの業界行っても重宝される」というお話をしていただき、学習をおすすめされたので、学習記録を残していきたいと思います。
私の第一言語はC言語です。
ぶっちゃけ英語よりは得意です←
基本情報の勉強も並行して進めているので、本当に亀進捗ですが頑張ります。
まずはProgateから！

# 早速やってみよう
### Javaを動かすには
C言語の最初に「おまじない」として教わった以下の文言
```c
// これはC言語です
#include <stdio.h>

int main(void) {
    // 何らかの処理
    return 0;
}
```
これと同じようなものがJavaにもあるようです。
```java
// 今後特別な注釈がない限りコードはJavaです。
class Main {
  public static void main(String[] args) {
    // 何らかの処理
    // 処理の文末には ; をつける
  }
}
```
ひとまずはおまじないとして眺めておきます。
C言語でもおまじないの意味を理解したのはだいぶ後だったので……

### 文章を表示する
Javaでは文章を表示するときに以下の表現を使います。
`System.out.println();`
今回は "Hello World" と表示したいので、括弧の中に入れます。
`System.out.println("Hello World");`
文字列はC言語と同じく "" で囲むようですね。
さきほどのおまじないとマージして書くとこんな感じです。
```java
class Main {
  public static void main(String[] args) {
    System.out.println("Hello World");
  }
}
```
なんか打つ文字数他言語よりも多くない……？
C言語はprintfだし、PythonとかLuaはprintだし……。
シェルスクリプトに至ってはechoでしたよ……。

### 数値と数値の計算
pythonのprintと同じように、Javaのアイツ(System.out.println)も括弧内で数値の計算を行うことができるようです。
数値には""をつけずにそのまま括弧に入れます。
ここはサラッと行ってしまいましょう。
```java
class Main {
  public static void main(String[] args) {
    // 数値の1を表示
    System.out.println(1);
    // 数字の1を表示
    System.out.println("1");
    // 足し算や引き算だってできちゃうゾ
    System.out.println(8+2-6);
    // これは文字列の連結扱い（後述）
    System.out.println("5"+"1");
    // 割り算掛け算余りは他の言語と同じ
    System.out.println(2*2);
    System.out.println(38/2);
    System.out.println(59%20);
  }
}
```
何行も繰り返し書いてみて気づいたんだけど、printfと違って勝手に改行入るんですねすごい。

### 文字列の連結
先程さらっと出した文字列の連結。
もう少し詳しく見ていくと、
```java
class Main {
  public static void main(String[] args) {
    // 文字列同士の連結は "文字列" + "文字列"
    System.out.println("おたる"+"水族館");
    // 数字同士だとこんな感じ
    System.out.println("2024"+"1014");
    // 合せ技
    System.out.println("大人は"+1800+"円です");
  }
}
```
この辺はPythonと似てるのかな？
うろ覚えです……。

# まとめ
今日はこんな感じです。
文字列の表示ができたところで一旦まとめ終了。
まとめながら勉強すると、しっかり頭に入りますね。
その分エネルギーも使うけど……。
またやり次第まとめます。
RCT：因果関係を正しく見抜くツール

世の中には、一見関係がありそうなのに、実は全く関係ないものって、たくさんありますよね。例えば、「ニワトリが鳴くと太陽が昇る」というのは、ただの偶然に過ぎません。ニワトリが鳴かなくても、太陽はちゃんと昇るんです。

でも、人間の脳は、こういう偶然の出来事を、因果関係があるものと勘違いしてしまうことがあります。これを「錯覚相関」と呼ぶのですが、まるで、目の錯覚で、実際にはないものが見えてしまうようなものです。

錯覚相関に騙されないためには、どうすれば良いのでしょうか？ そこで登場するのが、「ランダム化比較試験（RCT）」です。RCTは、まるで、真実を見抜くための「名探偵コナン」のような存在です。

RCTは、ある要因（例えば、新しい薬の効果）が、本当に結果（例えば、病気の改善）に影響を与えているのかを、科学的に検証するための方法です。

RCTでは、まず、被験者をランダムに2つのグループに分けます。そして、一方のグループには新しい薬を投与し、もう一方のグループには偽薬（プラセボ）を投与します。そして、一定期間後に、2つのグループの症状を比較します。

もし、新しい薬に本当に効果があれば、薬を投与されたグループの方が、症状が改善しているはずです。逆に、薬に効果がなければ、2つのグループの症状に差は見られないはずです。

RCTのポイントは、被験者をランダムにグループ分けすることです。こうすることで、薬の効果以外の要因、例えば、年齢や性別、生活習慣などの影響を、均等にすることができます。

RCTは、医学や薬学だけでなく、教育、経済学、社会学など、様々な分野で活用されています。例えば、ある教育方法の効果を検証したり、新しい政策の効果を測定したりする際に、非常に役立ちます。

RCTは、因果関係を科学的に検証するための、強力なツールと言えるでしょう。
【SwiftUI】簡単なカウンターアプリを作成してみた



## まえがき
この記事はSwift独学者による備忘録です。
万が一誤った記載がある場合は、コメントでご指摘いただけると幸いですm(_ _)m

## 確認環境
XCode Version 15.4
MacOS Sonoma 14.4.1

## カウンターアプリを作成してみた
基本的なコードを確認するため、簡単なカウンターアプリを作成してみました。
VStackでカウントした数字を表示するテキストとボタンを縦並びにし、ボタンはHStackで横並びにしています。
カウントとボタンの後ろにZStackで重ねて背景を表示しています。

ボタンのプラスとマイナスのアイコンは、Appleが提供しているSF Symbolsというアイコンライブラリを使用しています。
それぞれのボタンをタップするたびにカウンターが増減します。

## コード例

```Swift:ファイル名.swift
import SwiftUI

struct ContentView: View {
    @State private var count = 0

    var body: some View {
        ZStack {
            Rectangle()
                .fill(Color.gray.opacity(0.3))
                .frame(width: 280, height: 200)
            VStack {
                Text("カウント: \(count)")
                    .font(.largeTitle)
                    .cornerRadius(10)
                    .foregroundColor(Color(red: 0.2, green: 0.2, blue: 0.2))
                    .padding()
                
                HStack {
                    Button(action: {
                        count += 1
                    }) {
                        Image(systemName: "plus")
                            .font(.title)
                            .frame(width: 60, height: 60)
                            .background(Color.green)
                            .foregroundColor(.white)
                            .cornerRadius(10)
                    }
                    Button(action: {
                        count -= 1
                    }) {
                        Image(systemName: "minus")
                            .font(.title)
                            .frame(width: 60, height: 60)
                            .background(Color.red)
                            .foregroundColor(.white)
                            .cornerRadius(10)
                    }
                }
            }
            .padding()
        }
    }
}

```


| 画面名 | 画面名 |
| ---- | ---- |
| <img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3805527/8028d444-9eca-fcdc-52e9-618d935444b7.png"> | <img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3805527/58f5f728-8cd9-b2d9-92cf-8d039353c13d.png"> |

## あとがき
基本的な画面の表示方法を、簡単なカウンターアプリで練習してみました。
今後も捕捉事項があれば随時更新していきます。
Go言語(Golang)におけるポインタレシーバと値レシーバ

```go
package main //liststart1

import (
	"fmt"
	"time"
)

type Counter struct { // Counter型を定義
	total             int  // 合計
	lastUpdated time.Time  // 最終更新時刻
}

func (c *Counter) Increment() { // ポインタレシーバ（cはポインタ）
	c.total++
	c.lastUpdated = time.Now()
}

func (c Counter) String() string { // 値レシーバ（cにはコピーが渡される）
	return fmt.Sprintf("合計: %d, 更新: %v", c.total, c.lastUpdated)
} 


func main() { 
	var c Counter
	fmt.Println(c.String())
	c.Increment()  //「(&c).Increment()」と書かなくてもよい
	fmt.Println(c.String()) 
} 
```

### Counter型の定義

```go
type Counter struct {
	total       int          // 合計
	lastUpdated time.Time    // 最終更新時刻
}
```

ここでは `Counter` という構造体を定義しています。この構造体は `total`（合計値）と `lastUpdated`（最終更新時刻）という2つのフィールドを持っています。

### Increment メソッド

```go
func (c *Counter) Increment() {
	c.total++
	c.lastUpdated = time.Now()
}
```

このメソッドはポインタレシーバを使用しています。ポインタレシーバとは、メソッドがポインタ型のレシーバを受け取ることを意味します。この場合、`c` は `*Counter` 型のポインタです。

- **理由**: ポインタレシーバを使うと、メソッド内で構造体のフィールドを直接変更できます。これは、構造体が大きい場合や、メソッド内で状態を変更する必要がある場合に特に重要です。

### String メソッド

```go
func (c Counter) String() string {
	return fmt.Sprintf("合計: %d, 更新: %v", c.total, c.lastUpdated)
}
```

こちらは値レシーバを使っています。値レシーバは、メソッドが構造体のコピーを受け取ることを意味します。

- **理由**: 値レシーバを使うと、元の構造体を変更することなく、その値を取得することができます。この場合、`Counter` の状態を変更する必要がないため、値レシーバを使用しています。

### main 関数

```go
func main() {
	var c Counter
	fmt.Println(c.String()) // 初期状態を表示
	c.Increment()           // カウンタをインクリメント
	fmt.Println(c.String()) // 更新後の状態を表示
}
```

- `var c Counter` で `Counter` 型の変数 `c` を初期化します。この時点では `total` は 0、`lastUpdated` はゼロ値（1900年1月1日）です。
- `c.String()` で初期状態を表示します。この時、値レシーバの `String` メソッドが呼ばれ、カウンタの合計と最終更新時刻が表示されます。
- `c.Increment()` を呼び出すと、ポインタレシーバの `Increment` メソッドが実行され、`total` が 1 増加し、`lastUpdated` が現在の時刻に更新されます。
- 再度 `c.String()` を呼び出して、更新された状態が表示されます。


Go言語では、メソッドを呼び出す際に、レシーバの型によって自動的にポインタが解決されるため、`&c` と書かなくても大丈夫です。この仕組みを詳しく説明します。

### レシーバの自動解決


`Increment` メソッドはポインタレシーバ (`*Counter`) を使用しています。
`c.Increment()` と書くと、Goは `c` が `Counter` 型の値であることを認識し、自動的にポインタを取って `&c` を実行します。
そのため、`c.Increment()` は実際には `(&c).Increment()` と同じ意味になります。


### まとめ

- **ポインタレシーバ**: 構造体のフィールドを変更する必要がある場合に使用します。メモリ効率が良い。
- **値レシーバ**: 構造体の状態を変更する必要がない場合に使用します。元のオブジェクトを安全に保つことができます。
【Ubuntu22.04LTS】VSCode上でファイルの保存ができない

VSCodeでソース編集中、
右下に下の警告メッセージが出力される場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3706432/3f9800d7-6d32-abb1-30ba-9acc0c340887.png)
Failed to save 'Timer.tsx': Insufficient permissions. Select 'Retry as Sudo' to retry as superuser.

使用しているユーザがソース保存先のディレクトリの編集権限を持っていないので
権限を付与。

‐‐‐‐‐‐‐‐‐‐‐‐‐‐
権限の付与１：対象ディレクトリのオーナーを変更

```
sudo chown -v username directory
```

権限の付与２：対象ディレクトリの編集権限を変更（777はすべてのユーザにディレクトリの編集権限を付与）

```
sudo chmod 777 -R directory
```
[Jest]@を使いたければmoduleNameMapperに設定しよう


## はじめに
最近Reactのテストに挑戦しているところで、同じような人の参考になればと思い、ちょっとずつ記事にしていきます。
間違い・認識違いあればご指摘いただけると助かります！


## 環境
下記のDocker開発環境にて行います。
https://qiita.com/mkthrkw/items/30115c9ac54c2204faef


## きっかけ
テストのディレクトリを変更しようとした時に、importと同じように```jest.mock```のmoduleNameに@(エイリアス)を使ったところ
```Cannot find module '@/〇〇〇〇〇〇' from '__tests__/〇〇〇〇〇〇' ```のエラーとなりました。

```typescript
jest.mock('../actions', () => ({
```

```typescript
jest.mock('@/features/auth/actions', () => ({
```



## tsconfig.jsonの設定

tsconfig には下記設定をしており ```"@/..."``` を ```"./..."``` にマッピングしています。

```typescript: tsconfig.json
    "paths": {
      "@/*": ["./*"]
    }
```
テストの時も、この設定が反映されるものだと思っていましたが、Jestには反映されないようです。


## jest.config.tsの追加設定

jest.config側の設定に下記を追加します。
こちらは正規表現で記載が必要です。
同じ設定をしていないと混乱するので、基本的には全く同じにしておいた方が良さそうです。

```typescript: jest.config.ts
  moduleNameMapper: {
    "^@/(.*)$": "<rootDir>/$1",
  },
```

これでimportと同じように書いても同じマッピングがされるようになりました。

```typescript
import { aaa, bbb } from "@/components/abc";

jest.mock('@/components/abc', () => ({
  aaa: jest.fn(),
  bbb: jest.fn(),
}));
```
あっちも```../../```こっちも```../../```みたいな地獄が頭をよぎったのですっきり！


## さいごに
jest.config.tsの設定はまだまだ使えてないものがたくさんあるので少しずつ確認していこうと思います。


## 参考

https://qiita.com/senou/items/d50eb55948f8453dece1

https://jestjs.io/ja/docs/configuration#modulenamemapper-objectstring-string--arraystring
RAGでAIはもっと賢くなる

生成AIは、まるで博識な学者のような存在です。膨大な知識を持ち、様々な質問に答えてくれます。しかし、AIが本当に役に立つ回答を生成するには、適切な情報を効率的に探し出す必要があります。これは、図書館で膨大な数の本の中から、必要な情報が載っている本を、素早く見つけるようなものです。

RAG（Retrieval-Augmented Generation）は、まさにAIに「情報検索のスキル」を授けるための技術です。RAGは、ユーザーの質問に対して、AIが関連する情報をデータベースから検索し、その情報に基づいて回答を生成します。

しかし、RAGにも課題はあります。例えば、ユーザーの質問が曖昧だったり、誤字脱字があったりすると、AIは適切な情報を検索できない可能性があります。また、データベースに格納されている情報が古かったり、偏っていたりすると、AIは不正確な回答を生成してしまう可能性があります。図書館にある本が古かったり、偏った内容だったりすると、正しい知識を得られないのと同じです。

では、RAGの精度を向上させるには、どうすれば良いのでしょうか？ LangChainが提案する発展的なアプローチは、3つあります。

1つ目は、「Multi-representation indexing」です。これは、複数のデータタイプを検索できるようにするインデックス手法です。例えば、テキストだけでなく、画像や音声データも検索できるようにすることで、AIはより多くの情報にアクセスできるようになります。

2つ目は、「Query transformation」です。これは、ユーザーの質問を、AIが理解しやすいように変換する手法です。例えば、ユーザーが「東京タワーの高さは？」と質問した場合、「東京タワーの高さは何メートル？」というように、質問を具体的に変換することで、AIはより正確な情報を検索できるようになります。

3つ目は、「Query Construction」です。これは、各データタイプに適したデータソースを選択し、データソースの機能を活用した効率的なクエリの構築手法です。例えば、画像データを検索する場合は、画像認識に特化したデータベースを使用するなど、データソースを適切に選択することで、検索の精度と効率を向上させることができます。

これらの発展的なアプローチによって、AIはより正確で信頼性の高い情報を提供できるようになり、より競合優位性の高いビジネスを実現できるようになるでしょう。

ぜひ、これらの発展的なアプローチを参考に、AIが最大限に能力を発揮できるよう、RAGによる精度向上に取り組んでみてください。
Snowflake Terraformで作成したTagまわりのリソースがエラーになったときのリカバリ方法メモ

久々にSnowflake Terraform でバグを引いたので、リカバリ手順メモ。


https://github.com/Snowflake-Labs/terraform-provider-snowflake/issues/2943
> Actual Behavior
> Error: sql: Scan error on column index 0, name "TAG": converting NULL to string is unsupported

Terraform で Tagまわりのリソースを再作成したら、突然うまくいかなくなった。
「なんもしてないのに壊れた」気分。

https://github.com/Snowflake-Labs/terraform-provider-snowflake/blob/main/v1-preparations/ESSENTIAL_GA_OBJECTS.MD

そうは言っても、タグベースのマスキングポリシーがないと困るので、この部分だけTerraformの管理から外して、SQLで再作成することにする。

### 1. Terraform管理下から関連リソースを削除する
リソース確認
```terraform
terraform state list
```
この中から、タグに関係あるものを管理下から削除する
```terraform
terraform state rm snowflake_tag.hogedb_piyoschema_tag_privacy_info
terraform state rm snowflake_masking_policy.hogedb_piyoschema_varchar_masking_policy
terraform state rm snowflake_tag_association.hogedb_piyoschema_varchar_table_association
```

### 2. テーブルのカラム再作成でエラーになるので、Snowflake本体からも削除する
```sql
-- タグついてる一覧確認
select *
from snowflake.account_usage.tag_references
order by tag_name,domain,object_id
;
-- カラムからタグを剥がす
alter table fugatable modify column_1 NAME unset tag RAW_TAG_PAYMENT_PRIVACY_INFO;
-- カラムからマスキングポリシーを剥がす(もしかしてやらなくてもいいかも)
alter table fugatable modify column column_1
unset masking policy;
-- マスキングポリシー削除
drop masking policy hogedb.piyoschema.varchar_masking_policy;
-- タグ削除
drop tag hogedb.piyoschema.tag_privacy_info;
```

### 3. タグ、プライバシーポリシーの再作成とカラムへの割り当て
css font-familyについて

総称フォントの使い方
""を使わずにフォントの種類を指定することができます。
ユーザーが使っているデバイスや環境によって指定したフォントを使えない場合の保険として見た目をある程度制御することができます。今回は以下の5種類の汎用的なフォントを紹介します


- Serif（セリフ体）
文字の端に小さな装飾がついているもの。紙の書籍や新聞によく使われるフォント
- Sans-serif（サンセリフ体）
装飾(セリフ)がなくシンプルなフォント。現代的で視認性が高いフォント
- Monospace（等幅フォント）
すべての文字が同じ幅で表示されるフォント。
- Cursive（筆記体）
柔らかく個性を表現することに向いている流れるようなフォント
- Fantasy（ファンタジーフォント）
デコレーションが多い独特なフォント。

```index.html
<!DOCTYPE html>
<html lang ="ja">
    <head>
        <meta charset="UTF-8">
        <link rel="stylesheet" href = "style.css">
    </head>
    <body>
    <p class ="font_1">総称フォント検証用のテキストです。明朝系</p>
    <p class ="font_2">総称フォント検証用のテキストです。ゴシック系</p>
    <p class ="font_3">総称フォント検証用のテキストです。筆記体</p>
    <p class ="font_4">総称フォント検証用のテキストです。装飾系</p>
    <p class ="font_5">総称フォント検証用のテキストです。等幅</p>
    

       

    </body>
</html>
```

```style.css
.font_1{
    font-family: serif;

}

.font_2{
    font-family: sans-serif;

}


.font_3{
    font-family: cursive;

}

.font_4{
    font-family: fantasy;

}

.font_5{
    font-family: monospace;

}
```
PythonでExcelワークシートのページ設定を行う

Excelファイルのデータが整い、レポート形式で提示する必要がある場合、Excelファイルのページ設定を調整することが非常に重要です。これはドキュメントの専門的な外観だけでなく、印刷や電子共有時の読みやすさや実用性に直接影響します。このプロセスをPythonで自動化することで、大量の手動設定時間を節約し、複数のファイルの一貫性と標準化を確保することができます。Pythonを使用してページの余白、用紙の向き、縮尺などの重要な属性を簡単に制御することができ、最終的な出力を具体的なニーズに合わせることが可能です。本記事では、**Pythonを使ってExcelワークシートの一般的なページ設定を行う方法**を紹介します。

本記事で使用する方法は、[Spire.XLS for Python](https://jp.e-iceblue.com/introduce/spire-xls-for-python.html)を必要とします。PyPIからインストールできます：`pip install spire.xls`。

[無料ライセンスの申請](https://www.e-iceblue.com/TemLicense.html)

## PythonでExcelワークシートのページ設定を行う
Excelブックを読み込んだ後、`Workbook.Worhsheets.get_Item()`メソッドを使用して特定のワークシートを取得し、ライブラリ内の`Worksheet.PageSetup`プロパティを使用してそのワークシートのページ設定を取得します。最後に、PageSetupクラスのプロパティを使用して、ページの余白、ページの向き、印刷エリア、縮尺などのページ設定を行います。詳細な操作手順は以下の通りです：
- 必要なモジュールをインポートします。
- `Workbook`オブジェクトを作成し、`Workbook.LoadFromFile()`メソッドを使用してExcelブックを読み込みます。
- `Workbook.Worksheets.get_Item()`を使用してワークシートを取得します。
- `Worksheet.PageSetup`プロパティを使用してページ設定オブジェクトを取得します。
- `PageSetup.TopMargin`、`PageSetup.BottomMargin`、`PageSetup.LeftMargin`、`PageSetup.RightMargin`プロパティを使用してページの上下左右の余白を設定します。
- `PageSetup.Orientation`プロパティを使用してページの向きを設定します。
- `PageSetup.PaperSize`プロパティを使用して用紙サイズを設定します。
- `PageSetup.PrintArea`プロパティを使用して印刷エリアを設定します。
- `PageSetup.Zoom`プロパティを使用して縮尺を設定するか、`PageSetup.FitToPagesTall`および`PageSetup.FitToPagesWide`プロパティを使用してページの幅と高さに合わせて縮小拡大を設定します。
- `Workbook.SaveToFile()`メソッドを使用してブックを保存します。
- リソースを解放します。

**コード例**
```python
from spire.xls import Workbook, PageOrientationType, PaperSizeType

# Workbookインスタンスを作成
workbook = Workbook()

# Excelファイルをロード
workbook.LoadFromFile("Sample.xlsx")

# 最初のワークシートを取得
sheet = workbook.Worksheets.get_Item(0)

# PageSetupオブジェクトを取得
pageSetup = sheet.PageSetup

# ページ余白を設定
pageSetup.TopMargin = 0.5  # 上余白
pageSetup.BottomMargin = 0.5  # 下余白
pageSetup.LeftMargin = 0.5  # 左余白
pageSetup.RightMargin = 0.5  # 右余白

# ページの向きを設定
pageSetup.Orientation = PageOrientationType.Landscape  # 横向き

# 用紙サイズを設定
pageSetup.PaperSize = PaperSizeType.PaperA3  # A3用紙

# 印刷範囲を設定
pageSetup.PrintArea = "A1:E10"  # 印刷範囲はA1からE10

# ページのズームファクターまたはページの幅と高さに合わせる
pageSetup.Zoom = 90  # 90%にズーム
# pageSetup.FitToPagesTall = 1  # ページの高さに合わせる
# pageSetup.FitToPagesWide = 1  # ページの幅に合わせる

# ワークブックを保存
workbook.SaveToFile("output/Excelページ設定.xlsx")
workbook.Dispose()  # リソースを解放
```

結果
![PythonでExcelワークシートのページ設定を行う](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090371/29b2218c-0fe9-a974-62f9-1fdf8c99a3f5.png)

本記事では、Pythonを使用してExcelワークシートの一般的なページ設定を行う方法を紹介しました。Spire.XLS for Pythonは他のページ設定もサポートしており、ダウンロードして確認、使用することができます。
【ChatGPT】の機能呼び出しです。


　どうも、カーブミラーです。

　今回は、ChatGPTの機能を呼び出すコマンドをご紹介します。無料版では働かないので、ご注意を。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
あります。　あしからず。
:::
　まずは、
　　不確定なニュースです。

　X-Twitterの海外の方が、
　　「今週中にo1のレビューが発表」と
　　　静かに騒いでいます。
　　　　（ニュースソース紛失）

　また、
　　サム・アルトマンが
　　　ポストして、
　　　　“画像生成ツールで遊んでる”
　　　　　みたいなことをポスト。
　　　　　　[サム・アルトマンのポスト](https://x.com/sama/status/1845510942949253156?t=vgTGRVWBqYIYig-OYwap_A&s=19)

　これはDALL-E系なのかも
　　わかりません。

　とりあえず、
　　今週中は警戒しておきます。
***
　さて、本題に入ります。

　今回は、
　　ChatGPTの機能の呼び出しです。

　無料版では
　　働きませんので、
　　　ご注意ください。

　それから
　　確認したのは、
　　　Androidスマホのみです。

　おそらく
　　iOS版、Mac版も
　　　同じかと思います。
　　　　X-Twitter上で何人かが
　　　　　ポストしていますので。

　さて、
　　呼び出す機能とは
　　　なんのことでしょうか？

　GPTsの呼び出しと
　　個別機能の呼び出しです。

　これまで
　　GPTsは、
　　　履歴上部から選択して
　　　　起動していました。

　これが意外と
　　手間でした。

　入力枠から起動できれば
　　手間が減ります。

　個別機能については
　　なぜ用意した？とも思うのですが
　　　ないよりはいいか、とも
　　　　思いました。
***
　それでは
　　呼び出し方法です。

　“@”で、GPTs呼び出し
　“/”で、描画、検索、理由

　この描画、検索、理由は
　　描画（DALL-E3）
　　検索（Web検索）
　　理由（o1-preview）を
　　　呼び出すためのキーワードを
　　　　入力枠に書き込みます。

　つまり、
　　この機能を使いたい、と
　　　宣言するわけですね。

　なお、理由は、
　　セッション最初に
　　　出てくるだけのようです。
***
　注意点いくつか。

　先述しましたが、
　　無料版では起動しません。

　それから
　　アプリ版とWeb版では
　　　起動できるのは、
　　　　どちらかになります。

　　アプリ版は、“@”だけ
　　Web版は、　“/”だけ
　　　が起動します。

　　なぜなのかは
　　　わかりません。

　それから
　　スマホで起動する場合、
　　　数字入力モードにして
　　　　入力すると手早いです。

　　“@”は、“0”の右
　　“/”は、“.”の右
　　　になります。

　　かな入力モードで
　　　“あっとまーく”で出した“@”は
　　　　アプリが反応。

　　　“すらっしゅ”で出した“/”は
　　　　Web版が反応しました。

　　入力が手間ですね😅
　　　素直に、数字入力モードに
　　　　しましょう。
![Screenshot_20241013-230215~2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/a6747d46-8419-5b1d-83e9-80f3d7fbbc47.png)
![Screenshot_20241013-233818~2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/e5bea02f-1197-e339-e545-b9696a34dfce.png)

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
Wordで簡単に名札を作成する方法

タグ: #Microsoft_Word #名札作成 #ビジネス #イベント準備 #DIY
会議、セミナー、社交イベントなど、様々な場面で名札は非常に便利なツールです。この記事では、Microsoft Wordを使用してシンプルでプロフェッショナルな名札を作成する方法をご紹介します。
ステップ1: Word文書の準備

Microsoft Wordを開きます
新しい空白文書を作成します

ステップ2: ページレイアウトの設定

「ページレイアウト」タブをクリックします
「余白」>「狭い」を選択して、利用可能なスペースを最大化します
「印刷の向き」>「横」を選択して、より広い印刷エリアを確保します

ステップ3: 表の挿入

「挿入」タブをクリックします
「表」>「表の挿入」を選択します
希望する名札のサイズに応じて、3x3または4x2の表を作成します

ステップ4: 名札のデザイン

表の各セルに以下の情報を追加します：

名前（大きなフォントサイズを使用）
役職/タイトル
会社/組織名
オプション：ロゴやシンプルな図形を追加


「ホーム」タブの書式設定ツールを使用して、テキストのスタイルや色を調整します

ステップ5: コピーと貼り付け
1つのセルのデザインが完成したら、他のセルにコピーして貼り付け、必要に応じて情報を変更します。
ステップ6: 印刷と切り取り

厚めの紙に名札を印刷します
各名札を丁寧に切り取ります

オンラインツールを使用して作業を簡素化
名札をゼロから設計するのが面倒だと感じる場合は、オンラインツールを使用してプロセスを簡素化することを検討してみてください。https://placecard.us/free-name-tag-maker
は無料の名札作成ツールを提供しており、プロフェッショナルな名札を素早く作成できます。
このようなオンラインツールを使用すると、以下のことが可能です：

プリセットテンプレートから選択
テキストとスタイルのカスタマイズ
複数の名札を一度に生成
直接印刷するか、編集可能なWord文書としてダウンロード

どちらの方法を選択しても、高品質な名札を作成することで、イベントにプロフェッショナリズムと組織性を加えることができます。皆様のイベントの成功をお祈りしています！
onClickのイベント内の関数に引数を渡したい

## 概要
onClickなどのイベント内の関数に引数を渡したかったので、その失敗内容と解決策を記載します。

## 失敗内容
```javascript:onClick内の handleDeleteに indexを渡したかったが失敗
{tasks.map((task, index) => (
    <li key={`${task}${index}`}>
        {task} <button onClick={handleDelete(index)}>Delete</button>
    </li>
))}
```
いつものお作法にプラスしてカッコをつけて渡せばいいのかなぁと思って試しましたがダメでした。

## 解決策
```javascript:onClick内にアロー関数を作ることで indexを渡せた
{tasks.map((task, index) => (
    <li key={`${task}${index}`}>
        {task} <button onClick={() => handleDelete(index)}>Delete</button>
    </li>
))}
```

## 終わりに
全然関係ないですが、イベントとか引数とか関数とか、それが何なのか言葉で説明できることも、コードの理解を深める一因になるのかなと感じました :writing_hand:
【Ruby】URI.escapeが使えない

## はじめに
Railsのアップデート中にURI.escapeを使用している箇所でエラーが出たので、その対応をまとめます。

## 問題
コード
```ruby
URI.escape(str)
```

エラー文
```ruby
NoMethodError (undefined method `espace' for URI:Module)
```

## 解決方法
Ruby3.0からURI.escapeは削除されました。また、URI.unescapeも削除されています。
代わりに、CGI.escapeやURI.encode_www_formなどを使用します。

## 参考
https://imaizumimr.hatenablog.com/entry/2021/01/01/141154
学習効率をあげるには記事投稿が最強


こんにちは。さんまです。

記事投稿始めます。

これまでは面倒くささと効率悪そうだなーってのでなんとなく敬遠してきたのですが、いろいろ勉強法を調べてるうちに記憶の定着には記事投稿が最強かもって思った次第です。
~~また、就活にも活きそうなので。~~

# 記事作成で使えそうな勉強法
記事作成をすれば達成できそうな勉強法を紹介します。
それぞれの詳細は私の尊敬する[パレオな男の記事](https://yuchrszk.blogspot.com/)を見てもらうと分かりやすいかと。

1. 検索練習
    「頑張って思い出す」要素が含まれた勉強法
    フラッシュカードとか模擬試験とか
2. 戦略的リソース活用
    事前に勉強をする目的や手段を明確にしておく勉強法
    「[メタ認知](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BF%E8%AA%8D%E7%9F%A5)」に効かせることができる
3. 教えるつもり勉強法
    学習した内容を他者に教えるつもりで学習する勉強法
    
# まとめ
こんな短い記事でも書こうと思うと脳に汗をかきますね。
記憶定着にはかなり効きそうです。
物は試しということでしばらく続けていこうかな。
美しい先生がGoogle Fontの選び方を教えてくれるよ！

Google Fontsはウェブページに埋め込んで使うのは簡単ですが、Google Fontsを見つけるのは難しいです。これを簡単にするために私の作業を紹介します。

![Fontsensei](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780251/ec634668-f6e8-48f3-fa20-c6e723ad7103.png)

[Website fontsensei.com](https://fontsensei.com/ja) 
[Github mrbirddev/fontsensei](https://github.com/mrbirddev/fontsensei)

- [明朝体 (Mincho)](https://fontsensei.com/ja/tag/mincho)
- [角ゴシック (Kaku Gothic)](https://fontsensei.com/ja/tag/kaku-gothic)
- [丸ゴシック (Maru Gothic)](https://fontsensei.com/ja/tag/maru-gothic)
- [手書き (Tegaki)](https://fontsensei.com/ja/tag/tegaki)
- [毛筆体 (Fude)](https://fontsensei.com/ja/tag/fude)
- [ポップ体 (Poppu)](https://fontsensei.com/ja/tag/poppu)
- [かわいい (Kawaii)](https://fontsensei.com/ja/tag/kawaii)
- [マンガ(Manga)](https://fontsensei.com/ja/tag/manga)


私はnext.jsとtypescriptを使用しています。そして、スクリプトにはPythonを使わず、typescriptを使っています（笑）。

改善できる点を教えてください！韓国の友人に従ってモバイルレイアウトを更新しました。他の言語に関するアドバイスも歓迎します！
現在時刻を取得する関数をVIEWで抽象化！SELECT文に依存性逆転の原則を適用!

現在時刻を取得する関数は、「現在時刻を取得する」というくらいなので、アプリケーションの外部の状態(OSの状態)に依存するので、「参照透過性」[^1]が無いです。
SELECT文の中で現在時刻関数を実行するたびに値が変わるので「冪等性」[^1]も無いです。
「冪等性」がないので、現在時刻関数に合わせて、レコードの日付カラムにパッチ当てしてテストすることになります。
バグがあって再テストとなったら、また、レコードの日付カラムにまたパッチ当てとなり、メンドクサッとなって、テストのモチベーションが下がって、テストしなくなるかもしれないです。

t-wada先生もおっしゃってますね。

[現在時刻が関わるユニットテストから、テスト容易性設計を学ぶ](https://t-wada.hatenablog.jp/entry/design-for-testability)

ということで、「現在時刻関数をVIEWで抽象化し、その抽象に依存する(依存性逆転の原則)、SELECT文を書く」です。

イメージはこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76786/1431cd42-f6fb-c781-390b-2c75439b3bcf.png)

具体的な実装例は、10年近く前に書いた次の投稿を参照。
[現在時刻がコードに埋め込まれているので、再実行(リラン)できないじゃん](https://qiita.com/madilloar/items/5bbbe308c8251626027b)

この実装例でも書いていますが、テストがしやすいだけでなく、障害発生時の再実行(リラン)もしやすいです。
現在時刻が埋め込まれたSELECT文だと、日をまたいでリランしようとするとかなりメンドクサイです。

ですが、ビューで現在時刻を抽象化してあらば、実テーブルに「今日は○○日のつもり」というレコードを登録して、ビューでくるんであげれば、簡単に日付を変えてリランできます。

[^1]:「参照透過性」と「冪等性」
次のようなイメージで書き分けてます。
参照透過性:コードが外部状態や副作用に依存しないようにする話
冪等性:テストの再現性や安定性を強調したい場合
令和6年秋 情報処理安全確保支援士試験を受験した感想


こんにちは。
現在社会人2年目で、SIer系の上場企業でSEをしております、sirroと申します。


昨日10/13、情報処理安全確保支援士試験を受験してきましたので、忘れないうちに感想を記録しておきます。


# 筆者のスペック

2022年11月、基本情報技術者試験合格。
2023年4月、応用情報技術者試験不合格。
2023年10月、データベーススペシャリスト試験合格。


# 午前I問題

昨年10月にデータベーススペシャリストに合格していることにより、免除。

# 午前II問題
対策としては参考書を一通り読んだ後に、過去問道場をひたすら周回。
試験直前時点では、過去問道場で安定的に8割以上取れるようになっていたので、何の不安もなかった。だが・・
試験本番、見たことのない問題が次々と出てきた。
25問中15点取れれば合格のため、個人的にはそのうちの12問ほど自信を持って回答できる問題があれば、残り13問は4択をテキトーに選んでも+3点で15点は取れるだろうと見込んでいた。
しかし、自信を持って正答と言える問題が11問しかない。これには焦った。試験時間をフルに使い切り、わからない問題の回答の検討を繰り返していた。

試験終了後、IPAが出した公式回答で自己採点。25問中15問正答で、ギリギリ合格だった。とりあえず、午前試験は突破。

# 午後問題
対策はこちらも過去問をひたすら解くのみ。
セキュアプログラミング系の問題には自信があったため、戦略としてはセキュアプログラミングで8割、残り1問で4割の得点を狙っていた。
試験本番、セキュアプログラミング問題は設問3だった。
真っ先に設問3を解答していった。解いているとき、これはかなり易しめの問題だと感じた。全くもってわからない問題は1問のみで、あとは一定の自信を持って解答できた。戦略通りの、「セキュアプログラミングでの8割得点」がハマった気がして、合格をたぐり寄せた気がした。
その後、残る3問のうちから、どれを解くか考えた。問２は、あまり自身のないメール系の分野だったため、選択肢から除外した。
問４を見ると、こちらもWEBセキュリティ系の問題だったため、こちらを解いてみた。しかし、実際に解いてみると意外と答えが出てこず、設問１を解くという選択肢が頭によぎった。
その時、こう考えた。
「問３で8割はおそらく取れている。残り一問は高得点を狙わず、安定して4割解ければいいのだ。」
問１を解くことにした。
問１は、インシデント対応系の問題。
中身としてはそこまで難しくなかったはずだが、ほぼ全ての解答にあまり自信が持てなかった。
結果的に時間が来てしまい、一応全部埋めることは出来たが、半分は間違っているだろう。

問１で4割取れているかどうかが、鍵となるような感触となった。

# 試験を通して
試験時間終了1分前、解答を全体的に見渡した。すると、設問3の問１の、脆弱性名を答えよという問題の解答が、「クロスサイトスクリプティング」ではなく、クロスサイトス"プ"リクティング」になっているではないか。
慌てて残り秒数を確認し、書き直す時間があるか確認した。結果的に即座に書き直し、その10秒ほど後だろうか。試験が終了した。

とりあえず凡ミスを一つ凌げてほっとしたが、こんなミスをしているということは、全体を通して他にも何かやらかしているのではないかと思わなくもない。
まあでも終わったことは仕方がない。

# まとめ

手応えとしては五分五分。受かっていてもおかしくないし、落ちていても驚かない。
とりあえず結果発表は12月なので、それまではゆっくり他の勉強でもしながらゆっくり過ごしたい。


<br>

終わり。Xも見てね!

https://x.com/DB_sirro_SE
CakePHPプロジェクト作成の備忘録

# 記事作成の背景
Cake PHP公式サイトからコマンドでプロジェクトを作成しようとしたら、エラーが表示されてしまったので
備忘録として簡単に記載しようと思います。

# 結局原因は、何だったのか？
原因は、php.iniファイルでの設定<b>(図1)</b>がコメントアウトしたままであったことでした。

今回の箇所は、<b>「Dynamic Extension」</b>の箇所を更新していきます。

![PHP設定ファイルの画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/8a0a9035-480f-98ba-fc37-e5e5a4d735bd.png)

## extention=intlを有効にする

「extention=intl」はデフォルトだとコメントアウトのままであったので、こちらのコメントを外しましょう。
```php.ini(更新前)
;extension=intl
```

```php.ini(更新後)
extension=intl
```

## extention=pdo_sqliteを有効にする
つづいて、「extention=pdo_sqlite」はデフォルトだとコメントアウトのままであったので、こちらのコメントを外しましょう。

```php.ini(更新前)
;extension=pdo_sqlite
```

```php.ini(更新後)
extension=pdo_sqlite
```


### 参考にさせていただいたサイト
■[CakePHP4.*の環境構築](https://qiita.com/MPrg2011/items/47198cbfb6634969e76e)
■[【初心者用】CakePHPを学んでいこう②（インストール・動作確認）](https://learningift.com/blogs/47Vox4fk1hs/%E3%80%90%E5%88%9D%E5%BF%83%E8%80%85%E7%94%A8%E3%80%91cakephp%E3%82%92%E5%AD%A6%E3%82%93%E3%81%A7%E3%81%84%E3%81%93%E3%81%86%E2%91%A1%EF%BC%88%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%BB%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D%EF%BC%89)
■[cakephpを簡単に触ってみる](https://qiita.com/kad/items/5c76ac491ada3e27a539)
■[CakePHP - Quick Guide](https://www.tutorialspoint.com/cakephp/cakephp_quick_guide.htm)
■[CakePHP3でデータベースに接続できなくて困った](https://sawatan.com/cakephp/cakephp3%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8F%E3%81%A6%E5%9B%B0%E3%81%A3%E3%81%9F)

以上です。
【LLM】ChatGPTにヒンディー語の通訳をおねがいした

# 背景

以前一緒に仕事をしたインド人の友人が日本に来ていたので、ふと「ChatGPTの音声チャットで相互通訳できるのでは？」と思いついて試してみた。


![00045-772465689.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121950/4070fd76-4b71-2e1e-9232-d832d2dd275e.png)

# 結論

**リアルタイムで日本語、ヒンディー語の相互通訳できる。**

せっかく久しぶりに対面での食事の場だったので少ししか使わなかったが、会話が成り立つレベルであった。
じわじわ実現しているので驚きが少ないですが、これって子供のころに漫画でみた万能通訳機そのものですね。

# 実際の会話

やり取りは一部修正しているが、基本的に音声でしゃべったことをGPTが音声で対応してくれた内容となる。

以下の「あなた」はインドの友人か私（Monta-san）の発話となる。

### あなた:（日本人）

ヒンズー語も喋れますか？

### ChatGPT:

ヒンズー語も少しサポートしていますが、精度は英語や日本語ほど高くないかもしれません。ヒンズー語で質問があれば、ぜひどうぞ！

### あなた:

“まてまて、えっと日本語と、 えっとヒンズー語を通訳してください。”

### ChatGPT:

もちろんです。日本語からヒンディー語に翻訳しますね。何か翻訳してほしい文章がありますか？

### あなた:（日本人）

“ヒンディー語の場合は日本語に翻訳してください。 つまり、相互に翻訳をお願いします。”

### ChatGPT:

メモリを更新しました

了解しました。では、翻訳したい文章があれば、どうぞお知らせください。

### あなた:（日本人）

“今日はどんな1日でしたか?”

### ChatGPT:

今日はどんな日でしたか？ これをヒンディー語に翻訳しますね。 "आज आपका दिन कैसा रहा?"

### あなた:(インド人)

“Yes, how was your day today?”

### ChatGPT:

「今日はどんな日でしたか？」を英語にすると "How was your day today?" になります。

### あなた:(インド人)

“Monta-san, Namaste.”

### ChatGPT:

「こんにちは、ナマステ！」と訳

### あなた:(インド人)

“آج آپ کا دن کیسا تھا؟”

### ChatGPT:

今日のヒンディー語は「今日あなたの日はどうでしたか？」ですね。それを日本語に翻訳すると、「今日はどんな日でしたか？」になります。

### あなた:

“夕方からコーヒーを買いに行きました。”

### ChatGPT:

私は朝、コーヒーを買いに行きました。 これをヒンディー語に翻訳すると、「मैं सुबह कॉफ़ी ख़रीदने गया था।」になります。
Power Automte で、Excel テーブルを動的に読み取ってデータ転記する


# はじめに

端的に言うと、SharePoint リストでこれと同じことをしたい感じです。SharePoint リストにはデータフローがないため、正直こういったことには少し不向きな気がしますが、強いて方法を挙げるとすると、あらかじめテーブル化した Excel ファイルをドキュメントライブラリにアップロードして、そこからテーブルを読み取って、動的な値として利用する感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/d87a8971-224d-5947-a02a-110aefc2000e.png)

上記アプローチを取る場合、少し癖があるので、備忘のために整理しておきます。

今回は、簡単なテストということで、以下のようなテーブルを持つファイルをアップロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/a1f0e572-64c5-8f18-7946-bdc2670c2af6.png)


# 何が問題なのか

まず、こんな感じでファイルがアップロードされたら、テーブルを読み取ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/64cca073-64d6-1c1a-0779-db99cc5352e2.png)

ファイルの個所は、動的なコンテンツの`フォルダーパス`と`拡張子付きのファイル名`を繋げます。

```
@{triggerOutputs()?['body/{Path}']}@{triggerOutputs()?['body/{FilenameWithExtension}']}
```

テーブルについては、各ファイル固定化した名前にするか、一旦、先頭のテーブルを指定するかという感じでしょうか。個人的には、前者の方が簡単だと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ca1fa4aa-3524-e918-e12e-0dc3bafacd4a.png)

```
@{first(outputs('テーブルの取得')?['body/value'])?['Id']}
```

これで一応テーブルから行を読み取れますが、残念ながら、テーブルの各列の情報が動的な値に出てきません。これは、実行した際、毎回ファイルが異なるため、Power Automate で作成している段階では、どういった列が存在するか分からないためです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/19f8054b-c5fb-6550-93d5-dd35056220f2.png)

# 対策

実際にアップロードされるファイルのテーブルの列が分かっている場合は、以下のような感じで式を書きます。

まず、[表内に存在する行を一覧表示] アクショは複数行のデータ、つまり配列形式のデータとなるため、Apply to each アクションを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/c0f34c29-ee36-fefa-a460-51c747059649.png)

そして、それぞれの行の列の値を取得するために、以下のような式を書きます。

```
@{items('Apply_to_each')?['部署名']}
```

こんな感じで値が取れるため、例えば、SharePoint リストに転記する場合は [項目の作成] アクションで転記する感じになります。

一応実行してみると、以下のような感じで部署名の情報が取れています。今回は、3 行データがあるため、3 回処理を繰り返しています。取得出来たら、後は転記をするだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/98b62b13-8d9e-fb44-9812-5ff0716aef7e.png)
[AIに聞いてみた]  x86_64 vs arm64: AWSでどちらを選ぶべき？ [AWS]

## お前誰？
おっす、オラAWSよわよわエンジニア。
わからないことだらけだ。AIに鬼課金して泣きついては
いろいろ教えてもらう毎日を過ごしている。

さっそくだが、AWSに
「アーキテクチャはx86_64 と arm64どちらにいたしますか？」って
聞かれてしまった

***質問の意味がわからねえ。***



## 結論
arm64は凄いらしいけど、x86_64と比較するとできないこともあるらしい。
不安だし***初心者はx86_64*** でいいんじゃねえ！？


## こいつら誰だったの？
arm64はAWSオリジナルCPUに使ってるアーキテクチャ
x86_64 はよくあるCPUのアーキテクチャ

---

これだけわかればじゅうぶん。脳死でx86_64を使って
なんか言われたら勉強しよう。
詳細が気になる人は以下の、AIによるまとめをどうぞ。

---


## x86_64 vs arm64: AWSでどちらを選ぶべき？

AWSでEC2インスタンスを起動する際、CPUアーキテクチャとして**x86_64**と**arm64**を選択できます。 それぞれの特徴を理解し、用途に合ったアーキテクチャを選びましょう。

### x86_64 とは

- IntelやAMD製のCPUで広く使われているアーキテクチャです。
- 長年の歴史があり、ソフトウェアやツールが豊富に揃っています。
- 互換性が高く、多くのアプリケーションがそのまま動作します。

### arm64 とは

- AWS Graviton2プロセッサ(CPU)で使われているアーキテクチャです。
- x86_64と比べて最大40%の電力効率が高く、コストパフォーマンスに優れています。
- モバイルデバイスや組み込みシステムで広く採用されています。


## 性能の違い

一般的に、**arm64はx86_64よりも電力効率が高く**、同じ処理をより少ない電力で行うことができます。そのため、AWSではarm64を採用することで、コスト削減を図っています。

## 互換性

x86_64は長年の歴史があるため、arm64よりも多くのソフトウェアやツールが利用できます。ただし、近年ではarm64の普及が進み、多くのソフトウェアがarm64に対応しています。


## どちらを選ぶべきか

どちらのアーキテクチャを選ぶかは、用途によって異なります。

- **コストパフォーマンスを重視する場合:** arm64
- **豊富なソフトウェアやツールを利用したい場合:** x86_64
- **既存のアプリケーションとの互換性を維持したい場合:** x86_64


## まとめ

arm64は、電力効率とコストパフォーマンスに優れたアーキテクチャです。x86_64は、互換性が高く、豊富なソフトウェアが利用できるアーキテクチャです。 それぞれのメリット・デメリットを理解し、最適なアーキテクチャを選択しましょう。
Amazon FSx ファイルシステム

# 概要
Amazon FSxで提供されている4つのファイルシステムを整理する。

# ファイルシステム

|ファイルシステム|説明|特徴|
|-|-|-|
|Amazon FSx for NetApp ONTAP|ONTAP上に構築されたフルマネージド型の共有ストレージ|マルチプロトコルアクセスが可能。<br>NFS、SMB、iSCSI、および NVMe over TCP プロトコルを介して、幅広い一連のワークロードとユーザーがデータを利用できる。|
|Amazon FSx for OpenZFS|OpenZFS ファイルシステム上に構築されたフルマネージド共有ストレージ。||
|Amazon FSx for Windows File Server|Windows Server上に構築されたフルマネージド型の共有ストレージ|高可用性で高性能のストレージを Windowsアプリケーションに提供。<br>SMBプロトコルをサポートしているので、Linuxからもアクセス可能。<br>DFSR（Distributed File System Replication）を備え付けたファイル共有も可能。|
|Amazon FSx for Lustre|Linuxから共有できるフルマネージド型のファイルストレージ。<br>世界で最も人気のある高性能ファイルシステムをベースに構築されている。|スーパーコンピューターなどのHPC（High Performance Computing）や機械学習といった大量データの高速処理を必要とする分野で利用される。|

## Amazon FSx for Windows File Serverの機能
Amazon FSx for Windows File Serverでは、Windowsサーバーが提供する下記機能を利用できる。

|機能名|説明|
|-|-|
|NTFS<br>(NT File System)|Windowsにおける標準のファイルシステム。|
|SMB<br>(Server Message Block)|主にWindowsのコンピュータ間にてファイル共有やプリンタ共有に使用されるプロトコル。|
|AD<br>(Active Directory)|Windows環境にてユーザーやコンピュータを「ドメイン」という単位で一括管理する|
|ACL<br>(Access Control List)|ADによって実現されるアクセス制御。<br>ファイルやフォルダなどのリソースに対して、ユーザーごとにアクセス許可/拒否を設定できる|
|DFS名前空間<br>(Distributed File System Namespace)|Windowsコンピュータ間で複数のコンピュータに存在する共有フォルダなどを一括管理する|
|DFSR<br>(DFS Replication)|共有フォルダ間を関連付けて自動的に複製する機能。<br>特定のコンピュータへのアクセス集中を防いだり、意図しない削除からファイルを保護することができる。|

# 参考
https://aws.amazon.com/jp/fsx/
AWS EC2入門： AMIとスナップショットの違いとユースケース、コストについての備忘録

## はじめに
Amazon Web Services（AWS）は、クラウド環境でのシステム運用をサポートする豊富な機能を提供しています。

その中でも、EC2インスタンスのバックアップや復元において重要な役割を果たすのが「AMI（Amazon Machine Image）」と「スナップショット」です。

これらは似た概念ですが、使い方や目的に違いがあります。本記事では、EC2におけるAMIとスナップショットの違いを整理し、それぞれのユースケースやコスト面も含めて解説します。

[前回の記事](https://qiita.com/free-honda/items/a2eb7f57787b93436a3b)では、AMIについて詳しく解説しましたが、今回はさらにスナップショットとの比較や、それぞれの特徴に基づく使い分けにも焦点を当てます。

## 知識整理
### EC2について

AWSのElastic Compute Cloud（EC2）は、クラウド上で仮想サーバーを提供するサービスです。ユーザーは必要なスペックのサーバーを簡単に起動し、Webアプリケーションやデータベースを動作させることができます。

https://aws.amazon.com/jp/ec2/

EC2の柔軟性やスケーラビリティは、クラウドコンピューティングを最大限に活用するための鍵となっています。

## AMIについて

Amazon Machine Image（AMI）は、EC2インスタンスを起動するためのテンプレートです。

:::note
このテンプレートには以下のものが含まれています。
**・オペレーティングシステム（OS）**
**・設定済みのソフトウェア**
**・アプリケーション**
**・データ（必要に応じて）**
:::

AMIを使用することで、同じ設定のEC2インスタンスを何度も迅速にデプロイできます。特に、特定の設定や状態を保持したインスタンスを複製したい場合に便利です。

### スナップショットについて

スナップショットは、EBS（Elastic Block Store）ボリュームの状態をバックアップするための機能です。

スナップショットは特定のタイミングでのボリュームのコピーを作成し、データのバックアップや災害復旧の手段として利用されます。

https://docs.aws.amazon.com/ja_jp/ebs/latest/userguide/ebs-snapshots.html

スナップショットは差分バックアップが可能で、最初のスナップショット以降は、変更されたデータのみを保存するため、効率的にストレージを使用できます。

## AMIとスナップショットの違い
### 目的と内容の違い

:::note 
**AMI**
OSやアプリケーション、設定、データなどを含むインスタンス全体のテンプレート。EC2インスタンスのクローンを作成したり、新しいインスタンスを迅速に立ち上げる際に使用します。
:::

:::note
**スナップショット**
EBSボリュームの特定の時点のバックアップ。ストレージのバックアップに特化しており、EBSボリュームを復元したり、別のボリュームにリストアするために使います。
:::

### ユースケースの違い

:::note warn
**AMIのユースケース**
インスタンスの複製：特定のインスタンスをそのまま複製して、テスト環境や本番環境にデプロイする。
バックアップ：全体のシステム状態を保管し、何かあったときに迅速に復元する。
インスタンスの移行：同じ設定を異なるリージョンやアカウントにコピーする。
:::

:::note warn
**スナップショットのユースケース**
ストレージのバックアップ：EBSボリュームを部分的にバックアップし、データの保護や復元に使用する。
ボリュームの拡張・縮小：スナップショットを利用してボリュームを新しいサイズに変更する。
災害復旧：障害が発生したときに、最新のスナップショットからデータを復元する。
:::

### 作成のタイミング
AMIはインスタンス全体を対象にしており、作成には時間がかかることがあります。インスタンスを停止してから作成することが推奨されます。

https://tracl.cloud/archives/engineerblog/what-is-ami

スナップショットはボリューム単位で作成されるため、特定のデータ領域にフォーカスしています。稼働中のインスタンスでも取得でき、差分バックアップに対応しているため効率的です。

https://docs.aws.amazon.com/ja_jp/ebs/latest/userguide/ebs-creating-snapshot.html

## まとめ
AMIとスナップショットは、どちらもEC2インスタンスの保護や管理に役立ちますが、目的や使い方が異なります。

AMIはインスタンス全体のバックアップや複製、スナップショットはストレージデータの保護に特化しています。

システムの状態を保持したい場合はAMIを、データのバックアップやボリューム管理にはスナップショットを使い分けると効果的です。

## おまけ：コスト比較
### AMIのコスト
AMI自体には追加コストが発生しませんが、AMIに紐づいたEBSスナップショットの保存コストがかかります。AMIに関連するスナップショットの量によって、コストが増加することがあります。

### スナップショットのコスト
スナップショットは、保存されたデータ量に基づいて課金されます。スナップショットは差分のみ保存されるため、効率的にストレージを使用できるものの、長期間保管しているとその分コストが蓄積されます。

:::note warn
スナップショットは初期のフルバックアップ後、差分のみを保存するため、AMIを頻繁に作成するよりもストレージ効率が良い場合があります。ただし、利用シーンや保存ポリシーに応じてコスト管理を行うことが重要です。
:::

## 関連記事

https://qiita.com/free-honda/items/a2eb7f57787b93436a3b
【初心者】いまさらJenkinsに入門する (1)インストールと基本操作

# 1. はじめに
- 職場に昔からJenkinsサーバがあり、いろいろな用途に使われているようだが、これまで全くノータッチだったため仕組みが分からない。自分もその運用保守をする必要が出てきそうなため、今更ながらJenkinsに入門する。

# 2. やったこと
- 練習用のJenkinsサーバを構築する。
- ジョブの作成、実行など基本的な操作を確認する。

# 3. 手順

## 3.1 Jenkinsサーバのインストール・初期設定

### インストール
- Amazon Linux 2023 に Jenkinsをインストールして起動する。
- こちらの記事「[AmazonLinux2023にJenkinsをインストールする](https://qiita.com/tamorieeeen/items/4cdd17e00cf3bf1c0822) 」が完璧なのでほぼ記事通りに実施した。

### 補足
- Plugin
    - 「Select plugins to install」で「Install Suggested Plugins」を選択し、おすすめのものをまとめてインストールした。GitやGitHubのプラグイン(後で使う)が含まれる。
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/72db217e-21de-66da-132c-1d2f1d6ae57a.png)

- TmpDir変更
    - インストール直後、管理画面にログインできるが、状態が「オフライン」になってしまい、以後の作業ができない。
    - Jenkinsのデフォルトインストールではテンポラリ領域として/tmpが指定されるが、Amazon Linux 2023をEBS 16GBでインストールしたところ、/tmpが約470MBとなっており、Jenkins側で最低容量不足と判断されてしまった。
    - リンク先の記事の通り、TmpDirを別のディレクトリに変更して無事問題解消した。

(作業前)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/41e22b12-ec26-b06e-f409-53a56a6f8871.png)

(作業後)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/2b075d9f-32f5-6cbb-ac20-275e3522111c.png)

## 3.2 基本操作確認

### 参考記事
- 以下の記事を参考に基本操作を確認した。
  - 記事1: [【初心者】とにかく初歩的なJenkinsの使い方](https://eng-entrance.com/jenkins-use)
  - 記事2: [Jenkins を触ってみよう](https://iij.github.io/bootcamp/cicd_infra/jenkins/)

### 練習した操作
#### 1) コマンド実行して結果をコンソール出力するだけのジョブの作成、実行
- 新規ジョブ作成 -> フリースタイル・プロジェクトのビルド　で新規ジョブを作成
- Build Steps -> ビルド手順の追加 -> シェルの実行　で、実行したいコマンドを記述
    - pwd
    - echo "1st job"
-  手動でビルド実行後、「コンソール出力」から実行結果を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/baa28534-2304-abe0-7190-b364c115ae00.png)

#### 2) ワークスペースにファイルを出力するジョブ
- 1)のコマンドの内容をファイル出力するものに変更
    - echo "1st job" > result.txt
- ビルド実行後、ワークスペースにファイル(result.txt)が作成されていることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/cf64e57a-321d-d06c-b931-06aee3bb17a7.png)

#### 3) ビルド・トリガによるジョブの定期実行
- 手動ではなく、定期的に自動でビルドを実行する
- 対象のジョブのビルド・トリガで「定期的に実行」をチェックして実行間隔を設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/e800aa76-bf37-bd1c-40d1-49624f35baac.png)

- 毎分ジョブが自動実行されることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/8a7aaed2-03ff-a187-c0f7-aa7b60e1a75e.png)

#### 4) ビルド・トリガによるhttpリクエストでのジョブの実行
- 特定のhttpリクエストを受けたらジョブを実行する
- ユーザ -> 設定 -> APIトークン　で、APIトークンを作成
- 対象のジョブのビルド・トリガで「リモートからビルド」をチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/850cb8cd-337b-784d-cdf2-c8ef4de2447b.png)
- 手元のPC(Windows11)から、curlでhttpリクエストを送信し、ジョブが実行されることを確認

```
# フォーマット
curl -X POST http://[Jenkinsのユーザ]:[Jenkinsのユーザに紐づくAPIトークン]@[JenkinsサーバのURL]/job/[ジョブ名]/build

# 実行例(値はダミー)
curl -X POST http://admin:123450aab4aaaaaade2f9606196c9iiiii@10.10.10.10:8080/job/1stjob/build
```

# 4 所感
- 本当にさわりだが雰囲気が分かったので、これからはビビらずに業務用のJenkinsサーバを触って理解を進めるようにしたい。
vbsの作法 その89

# 概要
vbsの作法、調べてみた。
練習問題やってみた。

# 練習問題
Classを書け。

# サンプルコード

```
Class UrlTest
	Dim arr
	Dim growth
	Dim count
	Private Sub Class_Initialize()
		growth = 50
		Count = 0
		ReDim arr(growth)
	End Sub
	Public Sub Add(ByVal str)
		If count > UBound(arr) Then
			ReDim Preserve arr(UBound(arr) + growth)
		End If
		arr(count) = str
		count = count + 1
	End Sub
	Public Function Check(ByVal str)
		Check = 0
		For i = 0 to count
			If arr(i) = str then
				Check = 1
			End if
		Next
	End Function
	Public Function ToString()
		ToString = Join(arr, ", ")
	End Function
End Class

Dim test
Set test = new UrlTest
url = "https://test.com"
If test.Check(url) = 0 then
	test.Add(url)
End if

url = "https://test1.com"
If test.Check(url) = 0 then
	test.Add(url)
End if

url = "https://test.com"
If test.Check(url) = 0 then
	test.Add(url)
End if

msgbox test.Tostring()





```

以上
vbsの作法 その88

# 概要
vbsの作法、調べてみた。
練習問題やってみた。

# 練習問題
IE11で、再帰的にリンクを辿って、タイトルとディスクリプションを取得せよ。

# サンプルコード

```

Sub crawl2(url)
	Dim ws
	Set ws = WScript.CreateObject("WScript.Shell")
	Dim objIE
	Set objIE = CreateObject("InternetExplorer.Application")
	objIE.Visible = True
	objIE.Navigate url
	ws.AppActivate("Internet Explorer")
	Do While objIE.ReadyState <> 4 Or objIE.Busy = True
	    WScript.Sleep 100
	Loop
	For Each elm In objIE.Document.getElementsByTagName("meta")
		If elm.name = "description" then
			WScript.Echo "URL: " & url
			WScript.Echo "Title: " & objIE.Document.Title
			WScript.Echo "description: " & elm.Content
		End If
	Next
	For Each elm In objIE.Document.getElementsByTagName("a")
		If instr(1, elm.href, url) > 0 then
			Wscript.sleep 2000
			'WScript.Echo elm.href
		End If
	Next
	objIE.Quit
	Set objIE = Nothing
End Sub

Sub crawl(url)
	Dim ws
	Set ws = WScript.CreateObject("WScript.Shell")
	Dim objIE
	Set objIE = CreateObject("InternetExplorer.Application")
	objIE.Visible = True
	objIE.Navigate url
	ws.AppActivate("Internet Explorer")
	Do While objIE.ReadyState <> 4 Or objIE.Busy = True
	    WScript.Sleep 100
	Loop
	For Each elm In objIE.Document.getElementsByTagName("meta")
		If elm.name = "description" then
			WScript.Echo "URL: " & url
			WScript.Echo "Title: " & objIE.Document.Title
			WScript.Echo "description: " & elm.Content
		End If
	Next
	For Each elm In objIE.Document.getElementsByTagName("a")
		If instr(1, elm.href, url) > 0 then
			Wscript.sleep 2000
			WScript.Echo elm.href
			crawl2(elm.href)
		End If
	Next
	objIE.Quit
	Set objIE = Nothing
End Sub

Dim url
url = "https://auctions.yahoo.co.jp"
crawl(url)





```

以上
【マイクロソフト】自分のライセンスを確認する方法

## マイクロソフトのライセンス確認ページが存在する

以下のマイクロソフトマイページに移動します。
https://portal.office.com/account#subscriptions

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524942/19a8c62a-f878-8d4a-646e-8568dcb9855c.png)

企業のルールによってはアクセスできない場合があります。

## 注意
右上のアカウント情報を確認の上ライセンスを確認してください

複数アカウントをお持ちの方は今どのアカウントのライセンスを確認しているかわからなくなることが多々あります。

必ず右上で合っているか確認してください