OmniAICreator/Qiita-1.07M huggingface dataset:
ArchLinux Install 覚書 【随時更新】




### 初めに
当記事は初めて4回くらいArchLinuxインストールで四苦八苦した結果の記事になります。
コマンド関連でうまくいかない場合、記事の記述通りにならない場合などの責任はとれません
自己責任でよろしくお願いします。

#### 随時足りないところとコマンドを更新します。

___

### 事前準備
※ 有線環境でセットアップしてください

##### 日本語キーボード化

    loadkeys jp106

ミラーの関係上ダウンロードとかが遅くなるので

 ミラーを直接入力するか

    vim /etc/pacman.d/mirrorlist

 Server = ...の所をArchWikiから現在運用中の日本のミラーを追加してください


##### ディスクセットアップ
OSとデータを入れるためのディスクセットアップ
以下が自分が構築したディスク(/dev/sdaが今回インストールしたいディスクであることとする)

| ディスク名 | マウント部分 | フォーマット | Roll |
| --- | --- | --- | --- |
| sda1 | /boot | FAT32 | ESP |
| sda2 | / | ext4 | Linux filesystem |
| sda3 | – | swap | Linux swap |
    
/dev/sdaをgdiskでセットアップします。

    gdisk /dev/sda

今回自分のPCがUEFIでGPTパーティションにするので
BIOS環境の人はfdiskでセットアップしてください

パーティションを作成

    [gdisk] g

sda1のパーティションを作成

    [gdisk] n #新規パーティション作成
    [gdisk] Partition number: 1 enter
    [gdisk] First sector: enter
    [gdisk] Last sector: +512MiB (512MiB以上あればよし)
    [gdisk] Hex code or GUID: EF00
    
sda2のパーティションを作成

    [gdisk] n
    [gdisk] Partition number: 2
    [gdisk] First sector: enter
    [gdisk] Last sector: +280GiB　(作りたい分だけ)
    [gdisk] Hex code or GUID: 8300
    
sda3パーティションを作成

    [gdisk] n
    [gdisk] Partition number: 3
    [gdisk] First sector: enter
    [gdisk] Last sector: +2GiB (いくつでも大丈夫)
    [gdisk] Hex code or GUID: 8200
    [gdisk] p (今まで作ったディスクのパーティションが確認できます)


作りたいディスクのパーティションができたらフォーマットを割り当てます

    mkfs.ext4 /dev/sda2
    mkfs.vfat -F 32 /dev/sda1
    mkswap /dev/sda3

_____
### インストール
ディスクセットアップが出来たら

     archinstall
でインストール設定しましょう。(これで比較的簡単にインストールできます)
いろんな項目が出てきますが以下の通りにセットしてください

    言語: English
    キーボードレイアウト: us
    ミラー: Japan
    ロケール: en_US
    エンコーディング: UTF-8
    ドライブ: /dev/sda
    レイアウト: 自動でやってくれます
    暗号化: オフ
    ブートローダー: grub
    Swap: あり
    ホスト: Arch(+PCの型番でも)
    root: (とりあえず作っておくと楽)
    アカウント: 自分用のやつ
    Profile: KDE/Intel
    音: Pipewire
    カーネル: Linux 
    ネットワーク: ISOをコピー
    Additional Packages: [**"vim"**, "tmux", "zsh", "unzip", "git",”networkmanager”,"nano","docker"]
    TimeZone: "tokyo"
    NTP: True
    リポジトリ: multilib

Additional Packagesは必要なソフトを事前に入れてくれるので必要な分だけ入れてください。
(忘れてもあとでPacman -Sでインストールできます。)

インストール前にレイアウトでディスクをマウントしてください

    Assign mount-point for a partition

sda1とsda2を”/boot”と”/”にそれぞれマウントしてください

※sda1 = 0　, sda2 = 1 となっているので注意

全部できたらインストールを押しましょう
完了したら再起動(インストールUSBを抜きましょう)

____

### 使用環境のセットアップ

ここでは休憩でPC電源落しても大丈夫です。
詳細はこちらの方を参考にしてください。
自分のセットアップ後のコマンドもいずれ載せます。

https://qiita.com/Hayao0819/items/f23c6a6f1e103c5b6a83

____

### 完走した感想

- **有線でやれ（自戒）**
    - 前回は無線でセットアップしたため、インストールの事故率が半端多かった。
    - できるだけ有線だと成功率が上がります。
- うまくいかないときは記事の最初からやることをお薦めします。
##### 今後の予定
- Linux-zenを入れてみたい
- zshでターミナル変更したい
- GOとかPythonの開発環境構築したい

ではまた。

_______

### 参考にした先駆者様のURL

http://note.kurodigi.com/archlinux-efi-install-2022/

https://zenn.dev/kato_k/scraps/240b2458ea7e5c

https://slacknotebook.com/testing-archinstall-arch-linux-2022-06/#toc18

https://qiita.com/Hayao0819/items/f23c6a6f1e103c5b6a83

https://riq0h.jp/2020/12/07/210053/

https://wiki.archlinux.jp/index.php/Kernel-install
【Swift】標準入力された文字列を1文字ずつ分解して配列に変換する方法

`ABCDE`の形で標準入力された文字列を`["A", "B", "C", "D", "E"]`のように1文字ずつに分解した配列で扱いたい場面があったのでその方法を記録しておきます。

```diff_swift
// "ABCDE"が入力されたとき
var input = Array(readLine()!)
print(input) 
// ["A", "B", "C", "D", "E"]
```
不正検知におけるロジスティック回帰

不正検知モデルの作成においてロジスティック回帰を用いる場合、作法が通常とは異なる場合があると感じたため、その点を以下に示す。

# 検定に関して
不正検知という文脈に限らず、結果を予測するためのモデルを作成する場合、個別の係数の有意性は重視されない事が多い。そもそも個別の係数の有意性を検定する理由としては、当該係数が被説明変数に影響を及ぼしているかどうかを確認する意味合いが強い。これは、現時点のデータを切り取って物事の構造を把握するためにロジスティック回帰を使用するという使用方法であれば有効である。なぜなら統計的に有意でない係数に対して評価をすることは無意味となってしまうからである。
一方結果予測を目的としたモデル作成の場合、個別の係数の有意性は重視されず、モデル適合度の方を重要視される。そもそも個別の係数を有意性に基づいて排除する事が、モデルの予測性能を向上させるとは限らない。なぜならば、係数が複数ある場合、係数同士の交互作用等も想定される等、単純に係数一つの有意性で図れないファクターが存在するからである。また、予測モデルの場合は、含まれる係数が統計的に有意でない事によって結果に影響を及ぼさない事はあっても、結果への影響を攪乱するかどうかは別問題であり、この事実がモデル適合度に論理的に影響しないと見做されているものと思われる。

# 変数選択に関して
ではどのような定量的基準に基づいてモデルを構築するのが最適なのであろうか。例えば先行研究であるFanning and Cogger（1998）、Lin et al.（2003）、Kotsiantis et al.（2006）などでは、ステップワイズ法に従って変数を選択している。[1]
また、平井裕久ほかの分析においては、Lasso回帰によりAICを最大化する形で変数を選択している。[1]

# カットオフ値に関して
平井裕久ほかの分析においては、ホールドアウト法（全体データの7割をトレーニングデータ、3割をテストデータと最初に決めてしまう手法）ではなく10分割交差検証法を使用している。即ち、データを10個に分割し、その内一つをテストデータ、他データをトレーニングデータとする。そして10個に分割した全データそれぞれがテストデータになるように、つまり10パターンのトレーニングを行う。そして各パターンの分析で算出された統計量の検定値を10パターン全てで平均し、それを全体の結果とする。その上で、F値のカットオフ値を0から少し上げていって、Correct Classificationがどれだけ上がるか、Sensitivityがどれだけ上がるかを見る。この両者がどの値であるかを基準にするという事は難しく、バランスを見ながらという事にはなるが、平井らの論文においては、Correct Classificationの向上がこれ以上大きくは見込めない（上限値に漸近している状況）といった段階で、かつある程度のSensitivityが保てているという段階を採用しているようである。

```math
F = 2 * (Precision * Recall) / (Precision + Recall)
```
```math
Precision = TP / (TP + FP)\\
```
```math
Recall = TP / (TP + FN)\\
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603468/61cc573c-36e6-0f22-4323-d6b3ae39de42.png)


特に上記において、変数選択にあたってLasso回帰が適切なのかどうか、k分割交差法が適切なのかどうかといった点は検証が必要な部分であろうかと思う。


[1] 事前不正確率の違いによるロジスティック回帰を用いた不正会計の検知モデルの検知精度 平井裕久ほか 高崎経済大学論集第64巻第4号2022 PP.107~128
[Azure] Functions 機能x実装

# Azure Functionsの概要

Azure Functionsは、イベント駆動型のコンピューティングサービスであり、
コードの実行を要求トリガーに実行することができる。Azure Functionsを使用することで、
サーバーレスコンピューティングの利点を生かすことができ、
アプリケーションの機能を構築し、スケーリングするための効果的な方法を提供してくれる。

# Azure Functionsの機能

Azure Functionsには以下のような特徴。

- イベントドリブン: イベントに応じてコードを実行できる。
- ユーザーフレンドリー: 誰でも簡単に使い始めることができる。
- 言語の選択肢: 複数のプログラミング言語をサポートしている。
- スケーラビリティ: 自動スケールが可能で、トラフィックの変動に対応できる。
- リアルタイム: すばやい反応性を備えている。
- モジュール: 既存のサービスとの統合が容易。

# サンプルコード

## Java

```java
import com.microsoft.azure.functions.*;
import org.springframework.cloud.function.adapter.azure.FunctionInvoker;

import java.util.*;

public class MyFunctionClass extends FunctionInvoker<String, String> {

    public MyFunctionClass() {
        super();
    }

    @FunctionName("myFunction")
    public HttpResponseMessage run(
            @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {
        
        context.getLogger().info("Java HTTP trigger processed a request.");

        String name = request.getBody().orElse("Stranger");
        return request.createResponse(HttpStatus.OK, "Hello, " + name + "!");
    }
}
```

## Go

```go
package main

import (
    "github.com/Azure/azure-functions-go/azfunc"
    "net/http"
)

func main() {
    azfunc.HandleHTTPTrigger(HandleHello).ListenAndServeEnv(":8080")
}

func HandleHello(w http.ResponseWriter, req *http.Request) azfunc.HTTPResponse {
    name := req.URL.Query().Get("name")
    if name == "" {
        name = "Stranger"
    }
    return azfunc.HTTPResponse{
        Body:       []byte("Hello, " + name + "!"),
        StatusCode: http.StatusOK,
    }
}
```

## C#

```csharp
using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;

namespace MyProject
{
    public static class MyFunctionClass
    {
        [FunctionName("myFunction")]
        public static IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string name = req.Query["name"];
            if (string.IsNullOrEmpty(name))
            {
                name = "Stranger";
            }

            return new OkObjectResult($"Hello, {name}!");
        }
    }
}
```
【Ansible】複数のタスクをループさせる処理

# はじめに
Ansibleでループ(loopやwith_itemsなど)を使用する場合、ループは各タスクごとに記載する必要がある。そのため以下の図のように複数タスクを1つにまとめ、①→②→③→②→③→④の順番に処理を行いたい場合は工夫が必要。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748625/44d5ee51-d986-9b50-9a35-b6979d05309c.png)

# 環境
Ansible： 2.14.1
Python： 3.10.6

# 失敗①
無理だろうなと思いつつ各タスクごとにwith_itemsを記載。
当然ながら、①→②→②→③→③→④の順番で実行される。
**playbook.yaml**
```
tasks:
  - name: task1
  　debug:
      msg: "start"
 
  - name: task2
      debug:
      msg: "good morning {{ item }}"
    with_items:
      - taro
      - jiro

  - name: task3
    debug:
      msg: "hello {{ item }}"
    with_items:
      - taro
      - jiro

  - name: task4
    debug:
      msg: "finish"
```
**出力結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748625/eaed01fd-6723-6258-c335-50ff3f524ac4.png)

# 失敗②
タスク②とタスク③をblockで囲ってみたがエラーが出た。

**playbook.yaml**
```
tasks:
  - name: task1
  　debug:
      msg: "start"

  - name: task2_and_task3
    block: 
      - name: task2
        debug:
          msg: "good morning {{ item }}"

      - name: task3
        debug:
          msg: "hello {{ item }}"
    with_items:
      - taro
      - jiro
  
  - name: task4
  　debug:
      msg: "finish"
```

**出力結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748625/473a20ec-e9b3-21b0-5fc3-27ca2c0a3817.png)
**loopでも同様のエラー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748625/0dcb55ad-bc26-1747-27d5-a04c3f88ec33.png)

調べたところ、blockでまとめたタスクをループさせることはできないらしい。

https://stackoverflow.com/questions/58908625/issue-looping-on-block-containing-a-set-of-tasks-in-ansible

# 解決策
ループさせたいタスクを別のplaybookに記載し、include_tasksで呼び出すことで解決。

**playbook.yaml**
```
tasks:
  - name: task1
    debug:
      msg: "good morning"
  
  - name: task2_and_task3
    include_tasks: task2_and_task3.yaml
    with_items:
      - taro
      - jiro

  - name: task4
    debug:
      msg: "finish"
```
**task2_and_task3.yaml**
```
- name: task2
  debug: "good morning {{ item }}"

- name: task3
  debug: "hello {{ item }}"
```
**実行結果**
実行結果を見ると、①→②→③→②→③→④の順番で処理されていることが分かる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2748625/53c5075e-e0e4-b1d4-a745-f46a28e00323.png)
git push --force origin branch され強制上書きしたい場合

```bash
git push --force origin branch
```
されて、ローカルで作業中の変更を気にせず、強制上書きしたい場合は、

```bash
# リモートリポジトリの最新情報をローカルに取得
git fetch origin branch

# ローカルがリモートと同じになるようにハードリセット(強制上書き)
git reset --hard origin/branch
```
とやればOK。
【python】プログラミングイントロダクション備忘録①

Python言語によるプログラミングイントロダクションについて勉強をしているのでその記録として記事を投稿します。
備忘録です。
### 総当たりによる平方根の近似
```python
x = float(input('数字入力->'))

epsilon = 0.01
step = epsilon ** 2
num_guesses = 0
ans = 0.0

while abs(ans ** 2 - x) >= epsilon and ans <= x:
    ans += step # 近似
    num_guesses += 1 # ループ数
print(f'繰り返しの数→{num_guesses}')
if abs(ans ** 2 - x) >= epsilon:
    print(f'近似解→{x}')
else:
    print(f'{ans}root→{x}')
```
### 2より大きな素数か判定せよ、もし違う場合、最小の約数を表示せよ
```python
def practice_v1():
    # 2より大きな素数か判定せよ、もし違う場合、最小の約数を表示せよ
    x = int(input('数字入力->'))

    smallest_divisor = None # 最小の約数
    if x % 2 == 0:
        smallest_divisor = 2
    else:
        for i in range(3, x, 2):
            if x % i == 0:
                smallest_divisor = i
                break
    if smallest_divisor != None:
        print(f'{x}の最小約数→{smallest_divisor}')
    else:
        print(f'{x}は素数です。')

def practice_v2():
    """2以上1000未満の素数の和"""
    data = 1000
    ans = 0
    cnt = 0
    for prime in range(2, data):
        for prime_1 in range(2, prime):
            if prime % prime_1 == 0:
                break
        else:
            ans += prime
    print(ans, cnt)

```
Confluence 6.15.7で、ページから参照されている添付ファイルをゴミ箱から完全に削除すると、ページを更新できない

# 環境
* Confluence 6.15.7

# 何が起きたか
Confluenceのページにスクリーンショット画像が添付されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/7b7214d1-48af-ab62-88f8-cdf5c3262d7c.png)

"Source editor"で確認できるConfluenceのXMLは、以下の通りです。

```xml
<p>
  <ac:image ac:height="80" ac:thumbnail="true">
    <ri:attachment ri:filename="image2023-7-6_21-57-8.png"/>
  </ac:image>
</p>
```

添付ファイルページから、スクリーンショット画像をゴミ箱へ移動し、さらにゴミ箱からも削除しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/0508b872-46bb-1711-383b-cb08220c86a2.png)

その後、ページを編集して更新ボタンを押すと、「リクエストを処理しているときにエラーが発生しました。」というメッセージが表示されて、ページを更新することができませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/cf4f916e-b209-6878-f7ab-09116a9dfd65.png)


Source editorを開くと、"Error loading source"というメッセージが表示され、XMLは消えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/1c778015-5140-36ce-4400-ab5f98ab206e.png)

>RuntimeException occurred while transforming editor format to storage format (com.atlassian.confluence.content.render.xhtml.model.resource.identifiers.CannotResolveResourceIdentifierException: Unable to resolve the resource identifier IdAndTypeResourceIdentifier[id=1453295149,type=attachment]) (500)

"storage format"は、ConfluenceのXMLのことのようです。
https://ja.confluence.atlassian.com/doc/confluence-storage-format-790796544.html

"editor format"の具体的なフォーマットは分かりませんでした。

# どのように解決したか
一旦過去のバージョンに復元して、再度最新のバージョンに復元すれば、ページを更新できるようになりました。

なお、ConfluenceのXMLは以下の通りです。`<ri:attachment>`が`<ri:url>`に変更されました。

```xml
<p>
  <ac:image ac:thumbnail="true" ac:title="image2023-7-6_21-57-8.png">
    <ri:url ri:value="http://kurusugawa.jp/confluence/plugins/servlet/confluence/placeholder/unknown-attachment?locale=ja_JP&amp;version=2"/>
  </ac:image>
</p>
```

# 補足
ゴミ箱に移動するだけなら、ページは更新できました。
cscの作法 その386

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

# 練習問題
opencvsharpでカメラをキャプチャしてaviファイルを作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/42c65862-0c84-87c6-690b-b859753f5c04.png)


# サンプルコード

```

using System;
using System.Windows.Forms;
using OpenCvSharp;
using OpenCvSharp.Extensions;

namespace App
{
	public partial class Form1: Form {
		public VideoCapture Cap;
		public VideoWriter myavi;
		public bool video = false;
		PictureBox pictureBox1;
		private Button button1;
		private Button button2;
		public Form1() {
			Text = "Capture";
			ClientSize = new System.Drawing.Size(650, 400);
			button1 = new Button();
			button1.Location = new System.Drawing.Point(500, 50);
			button1.Text = "start";
			button1.Click += new EventHandler(button1_Click);
			Controls.Add(button1);
			button2 = new Button();
			button2.Location = new System.Drawing.Point(500, 100);
			button2.Text = "play";
			button2.Click += new EventHandler(button2_Click);
			Controls.Add(button2);
			pictureBox1 = new PictureBox();
			pictureBox1.Location = new System.Drawing.Point(150, 150);
			pictureBox1.Size = new System.Drawing.Size(200, 150);
			Controls.Add(pictureBox1);
		}
		private void button1_Click(object sender, EventArgs e) {
			Cap = new VideoCapture();
			Cap.Open(0);
			if (!Cap.IsOpened())
			{
				MessageBox.Show("ng");
				return;
			}
			Cap.Set(CaptureProperty.FrameWidth, 200);
			Cap.Set(CaptureProperty.FrameHeight, 150);
			Cap.Fps = 10;
			Mat Img = new Mat();
			myavi = new VideoWriter("c.avi", FourCC.XVID, 10, new Size(176, 144));
			int end = 0;
			while (end < 30)
			{
				Cap.Read(Img);
				if (!Img.Empty())
				{
					end = end + 1;
					myavi.Write(Img);
					pictureBox1.Image = BitmapConverter.ToBitmap(Img);
					int key = Cv2.WaitKey(100);
					if (key == 27)
						break;
				}
			}
			myavi.Dispose();
			Cap.Dispose();
		}
		private void button2_Click(object sender, EventArgs e) {
			var capture = new VideoCapture(@"c.avi");
			int sleepTime = (int) Math.Round(1000 / capture.Fps);
			using (var window = new Window("play"))
			{
				Mat image = new Mat();
				while (true)
				{
					capture.Read(image);
					if (image.Empty())
						break;
					window.ShowImage(image);
					Cv2.WaitKey(sleepTime);
				}
			}
		}
		[STAThread]
		static void Main() {
			Application.Run(new Form1());
		}
	}
}





```

以上。
Elixir キャッシュが原因のコンパイルエラー発生時の対応

こんにちは！
プログラミング未経験文系出身、Elixirの国に迷い込んだ？！見習いアルケミストのaliceと申します。
今回は、Elixirのプロジェクト内でキャッシュが残っていることによるコンパイルエラー、いわゆるキャッシュ化け時の対応について学びました。

# 目的
Elixirプロジェクト内でキャッシュ化けが起こった際の対処方法を学ぶ。

## 実行環境
Windows 11 ＋ WSL2 ＋ Ubuntu 22.04
Elixir v1.14.3
Phoenix v1.7.2

# できごと
2023/7/1開催「[piyopiyo.ex #17：Phoenix1.7のソースコードを眺めてみよう」](https://piyopiyoex.connpass.com/event/286142/)開催時に、デバッグをしながらアプリケーションの起動と停止を繰り返していたところ、以下のエラーが発生しました。

```bash:shell
(CompileError) module Piyo0701Web.CoreComponents is not loaded and could not be found.
```
しかし、直前ではcore_components.exの中身も呼び出し元も変更した覚えがないのです。

## キャッシュ化けという現象について
これは、私のプロジェクト内に「エラーを含む古いキャッシュ」が残っていて、
アプリケーションの起動時にキャッシュを読み込もうとした結果、エラーがまだ残っているよ！と怒られた模様です。


# 対処法
以下を順番に実行します。
①生成されたアプリケーションを一旦削除します。
```bash:shell
mix clean
```

②mix.lockで指定された依存関係を解除し、最新の状態にアップデートします。
今回は全てのライブラリに対してこれを行います。
```bash:shell
mix deps.unlock --all
mix deps.update --all
mix deps.get
```

③再度アプリケーションを起動するとエラーが解消されています。



# ～Elixirの国のご案内～
↓Elixirって何ぞや？と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

https://qiita.com/piacerex/items/09876caa1e17169ec5e1

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ！私もエンジニア未経験から学習中です。

https://elixir-lang.info/topics/entry_column


↓[We Are The Alchemists, my friends!:bouquet:](https://qiita.com/torifukukaiou/items/6bcd5bbb80df9e594e9e "Awesome-san's Awesome article")[^10]
Elixirコミュニティは本当に優しくて温かい人たちばかり！
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。[^11]


https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian




[^10]: @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。


[^11]: @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中！
【Git】特定のブランチのコミットを一括で取得（ベースブランチを切り替えてcherry-pickしたい）

# 【Git】特定のブランチのコミットを一括で取得したい

`gh`を使います
https://docs.github.com/ja/github-cli/github-cli/about-github-cli

`$ gh pr view ＜プルリクエストの番号＞ --json commits | jq -r '.commits[].oid' | tr '\n' ' '`

とやると

```
xxxxxxxxxxxxxxxxxxxxxxxx yyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzzzzzzzzzzzzzzzzzzzzz....
```
という形でコミットidが半角スペース区切りで羅列されるので

ベースブランチを切り替えて`git cherry-pick`などを行いたいときに上記の結果をコピペすれば安全かつ楽に実行できる

:::note warn
もっと最適な方法があれば教えてくださいm(_ _)m
:::
改めてReactに再入門した

## はじめに
今年から実務で初めてReactを触り始めたマークアップエンジニアです。
[以前小さなアプリケーションを作った](https://qiita.com/makoto-ogata@github/items/324b781957d9bb4055b9)ものの、それ以来実務でReactを触ることはなく、いざ実務で触ることになってからは浅い知識で実務をこなしていたので今回改めて再入門することにしました。

## 再入門の教材

Udemyの[「【2023年最新】React(v18)完全入門ガイド｜Hooks、Next.js、Redux、TypeScript」](https://www.udemy.com/course/react-complete-guide/)が社内でも観ている方が居ましたし、何よりも評価が高かったのでこの教材を購入しました。

## 改めて得た知識

### childrenはJSXタグの中に格納できる

```Container.js

export const Container = ({children}) => {
    return (
        <div>{children}</div>
    )
}
```

```Text.js
export const Text = ({text}) => {
    return (
        <p>{text}</p>
    )
}
```

```App.js
import { Container } from './Container'
import { Text } from './Text'

const App =()=> {
    return(
        <>
            <Container children={<Text text="子要素です" />} />
        </>
    )
}
```
上記の様な書き方は現場でほぼ見ないけど、こういう書き方もできるという事を知りました。

### React Hookは関数内（もしくはカスタムフック内）のトップレベルでしか呼ぶことができない

```index.js

import { useState } from 'react'

const [count, setCount] = useState() //関数コンポーネントの外なのでNG

const Example =()=> {
    if(){
        const [count, setCount] = useState() //関数コンポーネント内のトップレベルではないのでNG
    }
    const [count, setCount] = useState()　// この位置だとOK
}

```

### オブジェクト型のステートを扱う時はオブジェクトで渡す必要がある

```Example.js
import {useState} from "react"

export const Example = () => {
  const personObj = {name: "Tom", age: 18}
  const [person, setPerson] = useState(personObj)

  const cangeName = (e) => {
    setPerson({name: e.target.value, age: person.age})
    // personObjの名前を変更
  }

  const cangeAge = (e) => {
    setPerson({name: person.name, age: e.target.value})
    // personObjの年齢を変更
  }

  return (
    <>
      <h3>Name: {person.name}</h3>
      <h3>Age: {person.age}</h3>
      <input type="text" value={person.name} onChange={cangeName} />
      <br />
      <input type="number" value={person.age} onChange={cangeAge} />
    </>
  )
}
```
useStateの初期値として `personObj` が保持・管理されているので、「名前だけ」変更するとしてもオブジェクト自体を渡してあげる必要があるとのことです。

### さらにオブジェクト型のステートを扱う時はスプレッド演算子を使用する

```Example.js
import {useState} from "react"

export const Example = () => {
  const personObj = {name: "Tom", age: 18}
  const [person, setPerson] = useState(personObj)

  const cangeName = (e) => {
    setPerson({...person, name: e.target.value})
  }

  const cangeAge = (e) => {
    setPerson({...person,  age: e.target.value})
  }

// ステートの変更する値以外はスプレッド演算子を使用

  return (
    <>
      <h3>Name: {person.name}</h3>
      <h3>Age: {person.age}</h3>
      <input type="text" value={person.name} onChange={cangeName} />
      <br />
      <input type="number" value={person.age} onChange={cangeAge} />
    </>
  )
}
```
上記のコードは `personObj` をスプレッド演算子でクローンし、新たに値を変更した形になります。
ここで分かったことは、`personObj`　の中身を「直接変更した」のではなく「コピーして変更した」ということです。
スプレッド演算子に関しては、この記事が分かりやすかったです。

https://qiita.com/akisx/items/682a4283c13fe336c547

以上は動画前半の１〜５セクションあたりでした。
実装の時の注意点や、「何故そうなるのか」という事を詳しく説明されているので雰囲気でしか理解してない私にとっては基礎を固めるにはとても良い教材になっています。

引き続き頑張っていきます。
Ngrokの使い方

<h2>ローカル環境で立ち上げたものをみんなが見れるようにする</h2>
ローカルPC上で稼働しているネットワークを外部公開できるサービス。例えば、ローカルPCのWebサーバ(localhost:5000)を外部(https://xxxxxxxx)で公開することができる。


<h2>Flaskでローカルサーバー立ち上げ</h2>

```php:app.py
from flask import Flask
app = Flask(__name__)

@app.route('/')//補足として'/hanakami'はlocalhost:5000/hanakamiの意
def index():
    return 'ngrok おはよう.'

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=5000)
```

<h2>Ngrokでユーザー登録</h2>
下記でサクッとユーザー登録をすませて【Download ngrok】　→　解凍してngrok.exeを実行してみてね（閉じて大丈夫）

https://ngrok.com/

すまぬ、npmがインストールしてある前提でいくのでまだしてなかったらごめん。


```php:terminal
npm install -g ngrok
```
ngrokが起動する。
npmならnaginxは不要



コマンドを打つ 
```php:terminal
ngrok http 5000
```
---
Ngrokが勝手にhttps情報を作ってくれる。ナニコレすごい！！

forwardingに表示されているh★ttps://xxx///xx//で外部から繋がるようになる
（app.pyも起動してないと繋がらないのでターミナルでpython app.pyを実行しておいてね
※flusk run --reload --port 5000の実行が正しいかもしれないが上で動く）



例えばLINEAPIに繋げたいときにも利用できるし、あとは顧客に利用してもらうようなときにもサーバーにアップする前に触ってもらえたりするから超便利。

http://localhost:4040で受信状況も教えてくれる。
例えばLINEで送信したときに、送信した内容のjsonが表示される。

http://localhost:4040/inspect/httpも参照
アウトバンドメッセージ(Outbound Message)

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


SOAP APIで外部サービスのエンドポイントに対してメッセージを送る機能


+ [アウトバンドメッセージが複数回発信される。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000076E9VJ)

:::note
アウトバウンド メッセージは、「少なくとも 1 回」の配信サービスです。これが意味するのは、サービスがメッセージを正しく確認応答するまで、そして重要なことに、Salesforce サーバーが確認応答の処理を完了するまで、サーバーはメッセージの配信を続けようとするということです。サーバーが有効な確認応答を送信した場合でも、Salesforce サービスがメッセージの再送信を決定する障害シナリオは多数あり、これを念頭に置いてリスナーを設計する必要があります。(たとえば、正常に処理されたメッセージ ID を追跡し、既に受信したメッセージ ID に対して処理を行わない、または冪等(何回実行しても実行結果が同じ状態になる)になるようにリスナーを実装します)。 
https://help.salesforce.com/s/articleView?id=000386475&type=1
:::
財務報告におけるコンプライアンス遵守と監査性を加速するには

「この数字はどこで手に入れたんだ？」という問いは、財務チームのアナリストにとっては避けたいものですが、よくある質問です。誰かが答えを持ってるのでしょうが、そのファイルがどこに保存されているのかを追跡するには、スプレッドシートファイルを検索したり、担当者とコミュニケーショをとったり、最終的に必要なものを見つけるのに何時間も費やし、長く骨の折れるプロセスであることが大半です。

[*→EBOOK「財務チームにおけるアナリティクスの推進」を読む*](https://pages.dataiku.com/advancing-analytics-finance-flipbook-jp)

監査や（SOXやIFRSのような）規制遵守の確保といったより利害関係の強い状況では、財務チームは複数のソースからデータを取得し、規制分析のために要約などを行うかもしれません。

数値に食い違いが生じると、アナリストや会計士はあらゆるドキュメントを探し回って、その対応に奔走することになります。最終的には、特定のファイルに埋もれているエラーを見つけ、監査人や規制当局をひとまず満足させるに十分な情報を提供します。

しかし、財務チームは、バージョン管理、監査可能性、より良いデータリネージュなどに関する[根本的な問題を修正しないことが多く](https://qiita.com/Dataiku/items/eec947ae6987954020b3)、次の監査やコンプライアンスレポート作成時に同じ問題が再発し、このサイクルを毎回繰り返します。

## 財務報告への影響 
このような経験をお持ちの場合、貴社は脆弱な内部統制環境を運用し、不必要なリスクにさらされ、財務報告を作成する際に奔走するという、不毛なサイクルを繰り返している可能性があります。

常に直面しているリスクとして、次の内容が含まれることが考えられます： 
- 数値の不正確さや齟齬の見落としにより監査が増加する
- 規制コンプライアンスに抵触し、レピュテーションへの影響やさらなる精査はもちろんのこと、会社に多額の罰金が課されるリスクがある
- 社内の利害関係者から投資家まで、財務プロセスや報告に対する信頼を失う
- ローカルマシンからのレポートやプロセスによるエンドユーザーコンピューティング（EUC）リスク

## コンプライアンス対応と監査受け入れまでの時間の短縮 
財務報告に関する規制要件へのタイムリーな準拠を確保することは、財務チームにとってすでに業務上の大きな負担となっています。さまざまな事業部門のアナリストがERPシステムやその他のデータベースから手作業でデータを取り出し、ノートPC上のスプレッドシートで操作し、報告書をまとめる場合、これらの報告書には一貫性のないデータが含まれることが多く、前述の不毛なサイクルにつながります。

多様なソースからのデータを素早く組み合わせることができ、そのアクションが追跡可能で、文書化され、他のチームメンバーが簡単に見ることができる、そんな一元化された分析ワークベンチにさまざまなチームをまとめることを想像してみてください。ここでDataikuの登場です。

信頼できるデータへのアクセスが増えることで、チームはより一貫性のある正確なレポートを作成できるようになります。全員が同じバージョンの財務データに基づいて作業することで、事業部門間の財務管理を標準化し、監査により迅速に対応できるようになります。

## 財務チームがDataikuでリスクを軽減
Dataikuなら、まさにそれが可能です。監査証跡、ユーザーアクティビティートラッカー、データ上で行われた操作のビジュアルフローを自動的に文書化することで、各データ、プロセス、プロジェクトの更新を追跡し、検証することができます。

チームは、データに対して何が行われたか（そして誰が行ったか）を確認することも含め、一元化された場所で簡単にコラボレーションすることができます。デフォルト機能のユーザーコントロールにより、要件に応じてプロジェクトへのアクセスを制限することもできます。
![the flow document genreator in dataiku.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/03638f81-54a4-71c8-20c3-45dec9215d9e.jpeg)

フローのドキュメントを生成する機能（フロードキュメントジェネレーター：上の写真）により、データフロー内のすべてのスナップショットを素早く作成し、必要に応じて更新することができます。プロジェクトバンドルとして、パイプラインやプロジェクトの成果物の標準化されたスナップショットをまとめることができ、これが中央レジストリに保存されるため、簡単に追跡できます。また、Dataikuを活用することで、記述統計や機械学習を用いて、正式な監査の前に異常値を予測・特定し、時間と不要なストレスを節約することもできます。
 
Dataikuは、財務レポートの作成に必要な分析時間を短縮し、プロセスの監査性を高めることができます。これらのことは、財務チームにとって、ストレスの軽減、慌ただしさの軽減、一貫性の向上を意味します。


## 財務チームでDataikuをどのように利用いただけるか、ぜひご覧ください。
→[財務チーム向けのDataikuデモを見る](https://videos.dataiku.com/watch/ip85EQ1wSQACR65oFKiHYZ?)


<br>
<br>

原文： [*Accelerate Time-to-Compliance & Auditability in Financial Reporting*](https://blog.dataiku.com/accelerate-compliance-auditability-financial-reporting)
VBA CSVヘッダーを別ファイルに保存


```
'CSVヘッダーを別ファイルに保存
Sub ExtractCSVHeader()
    Dim sourceFilePath As String
    Dim destinationFilePath As String
    Dim delimiter As String
    Dim headerRow As String
    Dim headerItems() As String
    Dim i As Integer
    
    ' 元のCSVファイルのパスを指定してください
    sourceFilePath = "C:\path\to\source.csv"
    
    ' 新しいCSVファイルのパスを指定してください
    destinationFilePath = "C:\path\to\destination.csv"
    
    ' CSVファイルの区切り文字を指定してください
    delimiter = ","
    
    ' 元のCSVファイルをテキストとして開き、ヘッダー行を読み込む
    Open sourceFilePath For Input As #1
    Line Input #1, headerRow
    Close #1
    
    ' ヘッダー行を区切り文字で分割し、配列に格納する
    headerItems = Split(headerRow, delimiter)
    
    ' 新しいCSVファイルにヘッダー行を書き込む
    Open destinationFilePath For Output As #2
    Print #2, Join(headerItems, delimiter)
    Close #2
    
    MsgBox "ヘッダー行が新しいCSVファイルに保存されました。"
End Sub
```
スーパー未経験エンジニアが揃える基本機材（PC編）

顧客がつかうのと同じ機材をもつのが**スーパー未経験エンジニア**の前提条件です。なんでもできるのは、最初からはさすが無理ですが、買うのはお金があればできます。現物があるのは、強いです。サブにするPCの購入は、ヤフオクつかうのがいいですね。安物買いの銭失いといって、ヒステリックに新品がいいと主張する人もいますが、トラブル対応は、**スーパー未経験エンジニア**の重要なスキルです。ヤフオク購入で痛い目にあいましょう。以下独断と偏見で意見を書きます。

## 主PC　windows

主PCは、Windowsでしょう。市場シェアが大きいです。 小型だけど、そこそこ性能のいい[PC DeskMini X300](https://kakaku.com/item/K0001298436/)がおすすめ。
**メリット**
- 軽いので持ち運びしやすい
- 場所をとらない
- うるさくない
- 結構安い　ただ、メモリ、SSDを追加するとそこそこ行きます。
- 拡張性もないわけではない
- Windows 11 対応
- WSL2 使えば、Linux 対応
**デメリット**
- GPU 追加は難しい　←　そのときは、しょうがないので追加購入しましょう。
- ディスク容量追加が難しい。　←　NAS を追加購入しましょう。HDDは値段が下がるであとから購入したほうがいいです。
- Bluetooth,wifi 付属しないので追加購入の必要ありです。

## 副PC intel Mac 　
intel mac でもユーザーインターフェースは同じなので、ヤフオクで購入したり、不要になった人からもらったりしましょう。
Mac も知っておいたほうがいいので、もってますというと、スーパー未経験エンジニアとして認められやすくなるでしょう。

## おまけ
PCでなく開発用アプリですが、shell と vscode は触っておくのがいいですね。
C#で文字コードがShift-JISのString配列をUTF-8に変換する方法

## はじめに
昨日、CSVから文字コード「shift-jis」のデータを取得しようとした際、躓いたので、
文字コードがShift-JISのString配列をUTF-8に変換する方法について解説します。

## Shift-JISの文字列の取得方法
まずは、Shift-JISの文字列を取得する方法について説明します。以下のコードを使用します。

```csharp
string shiftJisString = "こんにちは、世界！";
byte[] shiftJisBytes = Encoding.GetEncoding("Shift-JIS").GetBytes(shiftJisString);
```

上記のコードでは、`Encoding.GetEncoding("Shift-JIS")`を使用してShift-JISのエンコーディングを取得し、`GetBytes()`メソッドを使用してShift-JISの文字列をバイト配列に変換しています。

## Shift-JISのString配列をUTF-8に変換する方法
次に、Shift-JISのString配列をUTF-8に変換する方法について説明します。以下のコードを使用します。

```csharp
string[] shiftJisArray = { "こんにちは", "世界" };

List<byte[]> utf8ByteArrays = new List<byte[]>();
var shiftjis = Encoding.GetEncoding("Shift-JIS");
foreach (string shiftJisString in shiftJisArray)
{
    byte[] shiftJisBytes = shiftjis.GetBytes(shiftJisString);
    byte[] utf8Bytes = Encoding.Convert(shiftjis, Encoding.UTF8, shiftJisBytes);
    utf8ByteArrays.Add(utf8Bytes);
}

List<string> utf8Strings = utf8ByteArrays.Select(bytes => Encoding.UTF8.GetString(bytes)).ToList();
```

上記のコードでは、`Encoding.Convert()`メソッドを使用してShift-JISのバイト配列をUTF-8に変換しています。変換後のUTF-8のバイト配列は`utf8ByteArrays`に格納されます。最後に、`Encoding.UTF8.GetString()`メソッドを使用してUTF-8のバイト配列を文字列に変換し、`utf8Strings`に格納しています。
Cloud Functions でタイムゾーンを設定する方法

# はじめに

こんにちは、京セラコミュニケーションシステム 福留（@kccs_kazuo_fukudome）です。

今回の記事のきっかけは、開発環境の Compute Engine や、Cloud SQL の起動・停止を休日にスキップしたかったためです。開発環境の起動・停止は、 Cloud Scheduler と Cloud Functions で構築しています。Cloud Scheduler は、 linux の cron と同じ設定方法のため、実行時間と曜日の指定はできますが、日本の祝日に、実行をスキップするといった設定はできません。

そこで、日本の祝日に起動をスキップするよう、Cloud Functions に node.js のライブラリ [@holiday-jp/holiday_jp](https://www.npmjs.com/package/@holiday-jp/holiday_jp) を組み込ました。[@holiday-jp/holiday_jp](https://www.npmjs.com/package/@holiday-jp/holiday_jp)で、祝日判定をするためには、タイムゾーンを合わせる必要があります。ですが、Cloud Functions のタイムゾーン設定がどうなっているか知らなかったので、改めて調べてみました。

:::note info
本記事は 2023 年 6 月ごろに作成しております。
Google Cloud の機能を利用した場合は、利用料が発生します。

また、 今回利用したライブラリ [@holiday-jp/holiday_jp](https://www.npmjs.com/package/@holiday-jp/holiday_jp) の最新バージョン（V2.4.0）では、2050 年までの日本の祝日が登録されています。
2050 年以降の祝日や祝日法が改定され、祝日が変更になった場合は、新しいモジュールを組み込み直す必要があります。
:::

## デフォルトの Cloud Functions のタイムゾーンの確認

デフォルトの Cloud Functions のタイムゾーンを確認するため、
次のようなコードを、 Cloud Functions（第 1 世代） にデプロイし、実行結果を確認しました。

```index.js
exports.testDate = (req, res) => {
  const date = new Date();
  console.log(date.toString());

  res.status(200).send("");
}
```

**実行結果**
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852633/275f8b11-4612-dd57-e26e-e6899c5557aa.png)

デフォルトのタイムゾーンは、**UTC** という結果です。クラウドのサービスだから想像通りでした。
[@holiday-jp/holiday_jp](https://www.npmjs.com/package/@holiday-jp/holiday_jp) を利用する時の Input 引数は、Date 型となっています。そのため、タイムゾーンが UTC では、日本時間の午前 9 時より前に実行した場合、日時が前日となるので正しい祝日判定ができません。

## Cloud Functions のタイムゾーンの設定方法

正しい祝日判定をするために、Cloud Cuntion のタイムゾーンを **JST** に設定できないのかな？と、色々
調べて、以下の箇所で設定できる事を見つけました。残念ながら、公式ドキュメントで、この設定方法を記載している箇所を見つけることはできなかったです。どこかに記載があってもいいなと思いましたが。。。

設定の箇所は、Cloud Functions -> ランタイム -> ランタイム環境変数 となります。
ランタイム環境変数に、次の内容で設定すれば完了です。

名前：TZ
値：Asia/Tokyo

![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852633/defcb0ec-e7d4-2224-4662-483961dca4aa.png)

## タイムゾーン設定後の確認

ランタイム環境変数を設定し、先ほどのプログラムを再実行しました。
設定が反映されて、取得できた日付が **JST** になっています。
これで、[@holiday-jp/holiday_jp](https://www.npmjs.com/package/@holiday-jp/holiday_jp) を使って、正しい祝日判定ができそうです。

**実行結果**
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852633/ee6556d7-19d9-4f35-b48f-820829a7d5df.png)

## まとめ

Cloud Functions のタイムゾーン設定、お手軽にできて助かりました。ちょっとした事ですが、こういった環境変数もすぐに設定できて反映される。こういうのもクラウドサービスならではですよね。
日本は祝日が多いので、参考にしてもらえればと思います。
ナレッジ検索レポート


# 質問の内容

+ [Knowledge Search Reporting](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000077imSq)

Salesforce ナレッジでナレッジの検索されたすべての単語/検索数を表示しようとしています。 

「結果はチャネルごとに、その日に最も使用された 300 個のキーワードに切り捨てられる」というレポートが表示されるとの通知を受けました ( https://help.salesforce.com/s/articleView?id=000386385&type=1より)。300 件を超える検索が寄せられているため、このレポートには必要な詳細が記載されていません。 

# 回答

[Knowledge CRM Dashboard Pack](https://appexchange.salesforce.com/appxListingDetail?listingId=a0N4V00000IEUCaUAP)をお勧めします。検索キーワードに同様の 1 日あたりの制限はないと思います。インストール手順に注意深く従ってください。

あなたの最終的な目標は何ですか? 

例： 

+ 新しいナレッジ記事を作成するために、関連する結果が返されない検索用語を特定しようとしていますか? 
+ 検索用語を特定して関連する同義語を作成し、類似した記事を見つけますか?  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3e0be957-1118-9cb9-0510-56015ffbbbb3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e1a86e36-e656-eb23-e7d0-e9cbcb424210.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/257e74fd-0c54-15cc-6988-432102627307.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4dec5096-a9a7-3df9-77d0-09d17aab31da.png)

いくつかの「ユースケース」に関する質問:

社内ユーザーはメインの検索バーからナレッジ検索をどのように活用し、ケースオブジェクトに関するナレッジの提案を取得していますか? それとも別のオブジェクトにナレッジコンポーネントを追加していますか? (アカウント、商談、リードなど) 

Case オブジェクトと「Lightning Console」ユーザエクスペリエンスを使用している場合、エンドユーザに返される記事に焦点を当てるために、[件名別の記事の提案 (およびその他の条件)] を有効にしていますか? 

Einstein 記事レコメンデーションを有効にすることを検討しましたか?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/58a863db-754d-3e3c-c089-08b54011862a.png)
Nodeのバージョンは新しいのになぜかnpmのバージョンだけ古いという事象が起こっていた

# 経緯
nodeのバージョンは18を入れていて、本来ならnpmはバージョン9になっているはずなのですが、なぜかnodeが18、npmは6.14になっていました。

https://nodejs.org/ja/download/releases

```
$ npm update -g npm
```
アップデートを実行しても9に上がらず、6台のまま。


解消した時のメモです。


# 原因
原因としてはおそらくパッケージ版のnodeをインストールした上で後入れでnなどのnode管理ツールを使ったことで何かおかしくなってしまったのかなと。
パッケージ版と使用しているnを削除し、今後はnodebrewのみを導入することにしました。


# 削除する前に

### 利用しているパッケージをメモ
```
$ sudo npm ls -g --depth=0
```
グローバルにインストールしている一覧がこれで取得できます。メモメモ。

### インストールしているものをアンインストール
いきなり現在インストールしているnpmやnを削除してしまうと、後でnodebrewを入れたときに上記のコマンドで一覧に出てこないのにパッケージがなぜか使えるという事象が起きてしまいます。
おそらくnodebrewが管理するpathを対象にnpmは検索するので一覧には出ないけど、管理範囲外にパッケージが残っているから使える状態。使えるならいいんじゃ？と思うかもしれませんがアプデとかしたくなった時に困るかもなので、インストールしているものはnodebrew管理下でインストールし直します。

```
$ npm uninstall -g [package-name]
```
[]部分は各自インストールしているパッケージ名を入れて実行してください

## node,npm,nの削除
こちらに詳しく書いてありました
[参考](https://blog.websandbag.com/entry/2018/01/21/000000)

こちらを参考にしつつ私が行ったのは
・npmのアンインストール
・ソース版のnodeをアンインストール
・各種残骸ファイルの削除

## homebrewからnodebrewをインストール
上記ページの下部に手順が載っています。
パスを通した後は、一度ターミナルを再起動しないとコマンドは反映されないので、手順通りやったのにコマンドが使えない！と慌てないように気をつけましょう

## メモしたインストールしていたものをインストールする
nodebrewが使えるようになったのを確認したら最初にメモをしたものを全てインストールし直しましょう。

無事相応のnpmのバージョンになりました。

```
$ node -v
v20.3.0
$ npm -v
9.6.7
```

# インストールしたパッケージを削除せず先にnpmをアンインストールしてnode管理ツールを導入してしまったとき
npmでインストールしているグローバルの一覧に無いのにコマンド使える！って状態になってしまったとき

以下はAngularCliをnodebrew管理下に置き直したときの例です
### 今使えるAngularCliのパスを調べる
```
$ which ng
```

### 表示されたパスを使って削除する
```
$ sudo rm -r [/usr/local/bin/ng]
```
[]部分はwhichで調べたパスです

### 改めてcliをインストールする
```
$ npm i -g @angular/cli
$ which ng
```
nodebrewを利用している時のパスで表示されます
[AIX Tips] AIX のダウンロード・イメージについて

### はじめに　

AIX のダウンロード・イメージについて確認する機会があったので記載します。


IBM ソフトウェア・ダウンロードサイトから AIX のダウンロードを行う際に、1つの AIX のバージョンでも色々なイメージがあります。

下は AIX 7300-01-02 の例です。



![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/ec6574cf-7d60-6fdb-8b51-c377aee23e6e.png)

<br>

2025/1追記 AIX 7.3TL3 では mksysb が ESS (IBM® Entitled Systems Support) からダウンロードできるようになりました。

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/fd8d4270-f227-60b3-7d80-bf9993229616.png)


---

#### ① TGZ-IBM AIX V7.3 Updates 7300-01-02-2320 Multilingual 

これは SP02 のみのアップデート・モジュールのみが入っていると考えられます。
容量も他と比べて小さく、2GB 程度です。

NIM では simages がないアップデート・リソースとなります。NIMのベース・イメージを含むリソースを作成したい場合は、こちらではなく、③または④を使用します。

(参考)

https://www.ibm.com/docs/ja/aix/7.2?topic=resources-using-lpp-source-resource


> lpp_source に、マシンのインストールに必要な最小セットのサポート・イメージが含まれている場合、このリソースは、simages 属性が指定され、BOS インストール (bos_inst) 操作に使用できます。 lpp_source に simages lpp_source として十分なソフトウェアが含まれていない場合、このリソースは、NIM の cust 操作で、実行中のマシンおよび SPOT にソフトウェアをインストールするためにのみ使用できます。


<br>

---

#### ② GZ-IBM AIX V7.3 Standard Edition 7300-01-02-2320 Multilingual Cloud Ready

②は Cloud ready image です。
cloud-init が含まれています。dd でディスクに書き込みを行い、PowerVC でそのディスクをイメージとして取り込み、デプロイ・イメージとして使用します。

登録方法は下記参考。


https://qiita.com/c_u/items/78bcaeff6ac163a16c44



<br>


---

#### ③ ISO-IBM AIX V7.3 Standard Edition Install 7300-01-02-2320 Multilingual Flash

"Flash" iso ファイルは、DVD1と2を合わせたもの、という位置付けです。
VIOS仮想メディア・リポジトリや、USBを使用したインストール、iso イメージから NIMのlpp_source を作成する場合に適しています。


https://www.ibm.com/support/pages/node/871636
> Where do I get the needed fileset once I determine if I need a base fileset or an update?
If Standard/Enterprise is chosen, you will find the latest available ISO images for the selected AIX level, newer AIX
release will also have a "Flash" image which is simply DVD1 and DVD2 combined, where DVD2 contains mostly non US fonts
and character sets and is not needed for normal OS functionality.


https://www.ibm.com/support/pages/node/715609
> As of AIX® build 1717 (year 2017 week 17), the Entitled System Support site (ESS) released "Flash" installation images. Those images are the ISOs for DVD1 and DVD2 of the classic installation media combined in to one singe ISO file.

<br>


(参考) iso ファイルから lpp_source と spot を作成する

https://www.ibm.com/support/pages/node/6485567



---

#### ④ ISO-IBM AIX V7.3 Standard Edition Install 7300-01-02-2319 Multilingual DVD ２枚

こちらは DVD イメージです。2つの iso ファイルで、１枚目に相当する部分に主要なファイルセットが含まれ、２枚目は、言語ファイルセットなど追加導入ファイルセットが含まれます。
DVD に焼いて使用する必要がある場合は、こちらを使用します。

<br>

---

#### ⑤ AIX V7.3 Mksysb 7300-03-00-2426 12/2024 Multilingual  


AIX 7.3.3 は mksysb イメージがIBM ソフトウェア・ダウンロード・サイトから提供されています。

alt_disk_install コマンドや NIM を使用したインストールも容易になります。
Cloud ready イメージ同様に cloud-init 込でPowerVCへの登録も便利です。


・AIX 7.3.3 release note
https://www.ibm.com/docs/ja/aix/7.3?topic=notes-aix-733-release

> AIX'mksysbイメージ
> AIX 7.3テクノロジー・レベル 3 から、AIXクラウド対応イメージと同等の「mksysbイメージがIBM® Entitled Systems Support(ESS) からダウンロードできるようになりました。


---

ご参考まで、以上です。
Go言語でOpenAI APIを使ってみよう！簡単スタートガイド

この記事ではOpenAIのAPIをGo言語でどのように使用するのかを解説していきます。簡単なリクエストまでの解説なので、それ以降は適宜カスタマイズしていただければと思います。

## OpenAI APIの概要
OpenAI APIを用いることで、GPT-3などの言語モデルにアクセスができるようになります。これにより、テキスト補完、要約、翻訳などの様々な自然言語処理機能を自身のWebアプリに追加することができます。

https://platform.openai.com/

## OpenAI APIのセットアップ手順
### APIキーの取得
まずはAPIキーを取得します。OpenAPIにアクセスしてアカウントを作成して、ログインします。

https://openai.com/

ログインすると下記のような選択画面が表示されるので、「API」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270253/18342de5-d243-bbab-a1fb-d6cc856a9aa3.png)

右上に表示されるアイコンをクリックし、メニュー中の「View API keys」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270253/4cb1311a-cc38-ffa8-641c-205e68a66db1.png)

続いて「Create new secret key」をクリックし、APIキーを作成します。こちらのキーは後ほど使用するので、どこかに控えておくかタブを消さずに置いておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270253/61ffc8f6-3014-20b0-be2f-781614581655.png)

### Goプロジェクトの作成
続いてGoの実行環境を整えていきます。本記事では私が以前に作成した下記リポジトリを使用することとします。

https://github.com/fumiakikobayashi/go-learning-environment

ローカルにクローンして、実行用コンテナを立ち上げます。

```
# 学習用リポジトリをローカルにクローン
$ git clone https://github.com/fumiakikobayashi/go-learning-environment

# コンテナを立ち上げる
$ make up
```

### go-openaiのインストール
今回はOpenAI APIを使用するにあたって下記の`go-openai`を使用します。

https://github.com/sashabaranov/go-openai

```
$ go get github.com/sashabaranov/go-openai
```

これでAPIを使用する準備は完了です。続いて簡単なリクエストをしてみます。

## GoからOpenAI APIに対して基本的なリクエスト（例えばテキスト生成）を送信する具体的なコード例
READMEに書いてある下記のコードを実行してみます。「your token」と書いてある箇所に先ほど取得したAPIキーを入れてください。

```go:src/main.go
package main

import (
	"context"
	"fmt"
	"github.com/sashabaranov/go-openai"
)

func main() {
	client := openai.NewClient("your token")
	resp, err := client.CreateChatCompletion(
		context.Background(),
		openai.ChatCompletionRequest{
			Model: openai.GPT3Dot5Turbo,
			Messages: []openai.ChatCompletionMessage{
				{
					Role:    openai.ChatMessageRoleUser,
					Content: "Hello!",
				},
			},
		},
	)

	if err != nil {
		fmt.Printf("ChatCompletion error: %v\n", err)
		return
	}

	fmt.Println(resp.Choices[0].Message.Content)
}
```
実行すると下記のような結果が返ってきます。
```
/go/src # go run main.go
Hello! How can I assist you today?
```
これでOpenAI APIのリクエストは完了です。

## 記事の要点のまとめ
以上、簡単にですが、Go言語でOpenAI APIを叩くまでの流れを解説しました。下記にOpenAI APIのリファレンスを載せているので、詳細は確認してみてください。

https://platform.openai.com/docs/api-reference/chat/create
2023/07 チェックロジックのバグかもしれない


このエラーの質問をよく見かけるようになりました。回避策はなさそう。

# We can’t convert this lead because some of the lead’s related activities are also related to an existing contact, account, or other object.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fe6631ab-b9b0-e05a-81a5-2653f1fa2adf.png)


+ [Lead Conversion Error: We can’t convert this lead because some of the lead’s related activities are also related to an existing contact, account, or other object.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000077CXfr)
大数の法則を15行以内で説明する

# Abstract
大数の法則の(いい加減な)概要を15行以内で述べる
# まとめ
大数の法則とは:サンプルサイズの増加に伴い、相対頻度が真の確率に収束することを述べた法則
# Detail
## ベルヌーイ試行の例
ベルヌーイ試行(例えばコイン投げ)では、試行回数が$n$、(真の)成功確率が$p$の場合、
成功回数$X$の期待値は$E[X] = np$、分散は$Var[X] = np(1-p)$となることが、簡単な計算により分かる。(初等的な確率論の教科書を参照されたし)

ここで、$X/n$という量を考え、これを「成功回数の割合」と呼ぶことにする。
期待値は$E[X/n] = E[X]/n = p$、$Var[X/n] = Var[X]/n^2 = p(1-p)/n$
と計算できる。

一つ目の式は、成功回数の割合$X/n$の平均が成功確率$p$に一致することを言っている。
二つ目の式からは、$n \to \infty$で$Var[X/n] \to 0$となること、つまり試行回数$n$(サンプルサイズに相当)が大きいほど$X/n$の揺らぎは小さくなり$0$に収束することが言える。

二つを合わせると、「試行回数$n$を増やせば、成功回数の割合は(真の)成功確率に収束する」ことが結論される。
HDD/SSD の検査（smartctl コマンド）（macOS）

こんにちは。
```smartctl```コマンド（```homebrew```を用いてインストール）を使い、HDD/SSD の検査を行いました。

準備：

```console
$ brew install smartmontools
$ diskutil list | grep -F "/dev/"
/dev/disk0 (internal, physical):
/dev/disk1 (synthesized):
```

実行および結果：

```console
$ sudo smartctl -d auto -t short /dev/disk0
smartctl 7.3 2022-02-28 r5338 [Darwin 20.6.0 x86_64] (local build)
Copyright (C) 2002-22, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Short self-test routine immediately in off-line mode".
Drive command "Execute SMART Short self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 2 minutes for test to complete.
Test will complete after Fri Jul  7 04:19:55 2023 JST
Use smartctl -X to abort test.
$
$ sleep 120; sudo smartctl -H /dev/disk0
smartctl 7.3 2022-02-28 r5338 [Darwin 20.6.0 x86_64] (local build)
Copyright (C) 2002-22, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
```
Internet ExplorerなしでOracle Formsにアクセス： CheerpJとWebAssemblyの登場

Oracle Formsは、Oracleデータベースのエコシステムでエンタープライズアプリケーションを構築するためのプラットフォームとして長い間人気があります。しかし、Javaプラグインをサポートしなくなったモダンブラウザや、ローカルにJavaをインストールしていない状態でOracle Formsアプリケーションを実行すると、互換性の問題が発生することがあります。

このブログ記事では、このようなアプリケーションのユーザーが直面する課題を探り、これらの障害を克服する潜在的なソリューションとしてCheerpJツールを紹介します。

# Javaクライアントの互換性の問題
Java アプレットや JNLP / Java Web Start などの Java クライアント・アプリケーションは、Oracle Forms ベースのアプリケーションの最も一般的な配信方法です。これらはローカルにJavaをインストールし、レガシーブラウザ（通常はInternet ExplorerやEdge（IEモード））と統合する必要があります。

このため、これらのアプリケーションに依存している組織は、古いブラウザとJavaのインストールというレガシーな依存関係のスタックを維持しなければならず、維持が困難で、深刻なセキュリティ上の懸念があります。

# CheerpJ: Oracle Formsアプリケーションを近代化するための橋渡し
CheerpJは、Oracle Formsを含むJavaアプリケーションを最新のWebブラウザでシームレスに実行するソリューションを提供します。CheerpJは、JavaScriptとWebAssemblyへのブラウザ内でのオンザフライ変換技術を提供することにより、プラグインやJavaのローカルインストールを必要とせずに、どのブラウザ上でもシームレスに実行することを可能にします。

# CheerpJを使用するメリット
1. クロスブラウザ互換性： CheerpJは、Oracle Formsアプリケーションを、Chrome、Firefox、Safari、Edgeを含むすべての主要なウェブブラウザ上で動作させることができます。これにより、異なるプラットフォーム間で一貫したユーザーエクスペリエンスが保証されます。

2. Javaプラグインの依存なし： CheerpJはJavaバイトコードをJavaScriptに変換するため、JavaブラウザのプラグインやJavaのインストールが不要になります。これは、古いJavaインストールに関連するセキュリティリスクを根絶し、デプロイプロセスとメンテナンスを合理化します。

3. 最新のウェブ標準： CheerpJを活用することで、Oracle Formsは最新のWebセキュリティモデルの利点を継承します。

# Oracle FormsへのCheerpJの実装
CheerpJをOracle Formsに統合するのは、通常とても簡単なプロセスです：

1. 統合： CheerpJは、アプリケーションサーバーに変更を加えることなく、既存のOracle Formsアプリケーションに統合されます。

2. テストとデバッグ： 変換されたアプリケーションがスムーズに機能するように、様々なブラウザで徹底的なテストとデバッグを行います。

3. デプロイメント： HTMLファイル内のJavaアプレットへの参照を、CheerpJが生成したJavaScriptで更新してください。

4. ユーザーエクスペリエンスの向上： 変換したアプリケーションがスムーズに動くようになったら、最新のウェブ技術を活用してユーザー体験を向上させることを検討してください。

# 結論
Oracle Formsアプリケーションは、Javaプラグインの非推奨により、最新のブラウザー上で実行する際に互換性の問題に直面します。しかし、CheerpJの登場により、企業はOracle Formsアプリケーションに新しい息吹を吹き込み、最新のWebブラウザ上でシームレスな実行を可能にすることができます。

JavaバイトコードをJavaScriptとWebAssemblyに変換することで、CheerpJはクロスブラウザ互換性を提供し、Javaプラグインの必要性をなくし、最新のWeb標準を活用し、パフォーマンスを向上させます。CheerpJの統合により、企業はユーザーエクスペリエンスを向上させ、生産性を高め、Oracle Formsアプリケーションをさまざまなプラットフォームのユーザーから利用しやすくすることができます。

急速に進化するWebテクノロジーの中で、CheerpJはInternet ExplorerなしでOracle Formsを実行するという課題に対処する強力なソリューションを提供し、現代のWeb時代へのシームレスな移行への道を開きます。

詳細はこちら：
https://github.com/leaningtech/webvm
https://leaningtech.com/legacy-modernisation-jp/
https://twitter.com/leaningtech

[引用元](https://new.leaningtech.com/accessing-oracle-forms-without-internet-explorer/)
Cookieの設定について整理しておきます。


初めてのCookieの設定で、なかなかCookieにtokenが格納されなかったのでその原因と解決方法をまとめました。
(2023/07/06)

API構築にはExpressを使用し、Cookie設定にはjsonwebtoken、cookie-parser、corsライブラリを使用した。

・各ライブラリをインストール
```zsh:ターミナル 
npm install jsonwebtoken cookie-parpser cors
```


Cookieにtokenが格納されなかった原因はクロスサイトが許可されていなかったから...

そこで、フロントエンド側とバックエンド側に以下を加えることで解決しました。

・ Frontend
デフォルトではクロスオリジンが許可されていないので `{ withCredentials: true }`という引数を加えることで、cookieをhttpヘッダに送ることができます。
```jsx:jsx
await axios.post('url', data, { withCredentials: true });
```

・ Backend
フロントエンドだけではCorsエラーが出るのでバックエンド側でクロスサイトを許可する必要がある。
```js:js
const corsOptions = {
    origin: "許可したいurl",
    credentials: true,
}
app.use(cors(corsOptions));
```


以上になります！！
Rによるサンプリング場所の作図方法

　本研究室では、野生動物の糞便の採取も行っています。論文を作成する際には、サンプリング場所を図として載せることが必要になる場合もあります。
　そこで、今回はRでできるだけ見栄えよく、サンプリング場所を作図する方法を記載します。
***
#### サンプリング場所を記載したcsvファイルの作成
何かしらのサンプルを採取する場合、異なる場所・時期で行われると思います。
今回は例として適当に作成したデータを用いますが、例えば野鳥の糞便を季節ごとに採取し、鳥インフルエンザウイルスの有無を調べたデータだとしましょう。
ファイルの名前は[Map_01.csv]とします。

記載例
| Season |   lat  |   lng  |  Virus |
|:------:|:------:|:------:|:------:|
|Spring   |34.27007   |133.9251   | No  |
|Summer   |34.25747   |133.9271   | No  |
|Autum   |34.26700   |133.9251   | Yes  |
|Winter   |34.25213   |133.9189   | Yes  |
|Spring   |34.25343   |133.9377   | No  |

今回は適当に80か所Google Mapで位置情報を調べました。
実際のサンプリング時にはスマートフォンで位置情報を記録していくと良いでしょう。
***
#### 作図の作業
作業ディレクトリをMap_01.csvがあるところに指定します。
ggplot2やjpndistrictのインストールがまだの場合は、インストールをしてください。
```ruby
install.packages("ggplot2")
install.packages("remotes")
remotes::install_github("uribo/jpndistrict")
```


```ruby
library(ggplot2)
library(jpndistrict)
kagawa=jpn_pref(37)
p=ggplot(kagawa)+geom_sf()+coord_sf()+theme_bw()
plot(p)
```
ここまでで下のような図ができます。
![Rplot09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560713/4763b76e-98bd-cd6b-466a-37c13e3d53b6.png)
この地図にサンプリング場所をプロットしていきます。

```ruby
df=read.csv("Map_01.csv")
p2=p+geom_point(aes(x=lng,y=lat, color=Season, shape=Virus), data=df, size=7)+theme(text=element_text(size=35))+scale_shape_manual(values=c(20,4))+theme(legend.position="top")+scale_color_discrete(limits=c("Spring","Summer","Autum","Winter"))+guides(color=guide_legend(order =1),shape=guide_legend(order=2))
plot(p2)
```
そのまま入力していくと、季節の凡例がアルファベット順になり、秋から始まってしまいます。春夏秋冬と並べ替えるためにはlimits=c()で指定する必要があります。

出来上がった図はこのようになります。
![Rplot08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560713/5c17862e-d68f-8c73-48eb-d71a10a9b75a.png)

この他、Leafletを使えば、Google Mapのような地図を自作することも可能です。

```ruby
Install.packages("leaflet")
library(leaflet)
pal1=colorFactor(palette = "YlOrRd", domain=df$Virus)
leaflet(df) %>% 
+     addTiles() %>%
+     addCircleMarkers(~lng, ~lat, color=~pal1(Virus), fillOpacity = 1, stroke=F)
```
出来上がった地図はこのようになります。

![Rplot10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560713/0e7e3b1b-6c7a-33e4-a7ac-197e460681e6.png)
AWS Lambdaでrequestsが使えない=> cannot import name 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_' 

Pythonで開発したAWS Lambdaをデプロイしたら，以下のエラーが出て動きませんでした。（読みやすさのため一部改行を加えています）
```
[ERROR] Runtime.ImportModuleError:
Unable to import module 'lambda_function':
cannot import name 'DEFAULT_CIPHERS' from 'urllib3.util.ssl_' (/var/task/urllib3/util/ssl_.py)
Traceback (most recent call last):
```
"Runtime.ImportModuleError"，"Unable to import module"のエラーは他にも種類がありますが，最近(2023年5月以降)どれを試してもうまくいかなかった場合はこれかもしれません。

# 状況
- Python(3.10)でAWS Lambda関数を開発
- APIとの通信のため`import requests`している
- ソースコードとモジュールファイルをzipにまとめてデプロイしたところ，上記のエラーで動かなかった

# 原因
`botocore`が，`urllib3`の最新版`v2.0`に対応していないことが原因。
- `urllib3`の最新版`v2.0`が最近リリースされたそうですが，現時点(2023年7月7日)では`botocore`はこの最新版に対応しておらず，`urllib3`と依存関係にある`requests`モジュールも使えなくなってしまったということです。

# 解決策
モジュールのインストール時に，以前のバージョンの`urllib3`を使用するよう条件を追加する。
Lambdaにデプロイすることを考えると，`-t`(または`--target`)オプションをつけるか`venv`を使用する必要がありますね。
### 手作業でインストールを行う場合

``` sh
python3 -m pip install requests "urllib3<2"
```
### `requirements.txt`を使用する場合
``` requirements.txt
requests
urllib3<2
```
### その他の方法
`pyproject.toml`および`poetry dependencies`という方法もあるらしいのですが，そもそも私はこれらの方法知らなかった程なので，リンクを貼るに留めておきます。
> githubのissue: https://github.com/psf/requests/issues/6443#issuecomment-1535667256

# 参考サイト
https://github.com/psf/requests/issues/6443

https://github.com/psf/requests/blob/main/HISTORY.md#2300-2023-05-03

https://urllib3.readthedocs.io/en/latest/v2-migration-guide.html

今回の内容で解決しなかった場合はこちらが参考になるかもしれません↓

https://iret.media/53031

  
  
ここまでお読みいただきありがとうございました。