OmniAICreator/Qiita-1.07M huggingface dataset:
カーネル起動速度比較(pf, xanmod, zen)

実機にてpf, xanmod, zenをそれぞれインストールしたので起動速度を比較したいと思います。

ブートローダーはsystemd-bootです。
要望などあれば追記します。

**PC スペック**
```
CPU: Ryzen5 4500
GPU: NVIDIA GeForce GTX 980Ti
RAM: Team DDR4 3200Mhz PC4-25600 8GBx2（16GBkit)
SSD: Hanye 128GB (SATA3)
```

# 結果

systemd-analyze plotを使用しました。

* Zen

```
Startup finished in 11.065s (firmware) + 3.235s (loader) + 4.492s (kernel) + 2.055s (userspace) = 20.850s 
graphical.target reached after 2.030s in userspace.
```

![zen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/9d5ad514-72ec-cdaa-8029-240de1745d45.png)

* pf

```
Startup finished in 10.579s (firmware) + 2.052s (loader) + 4.831s (kernel) + 1.805s (userspace) = 19.269s 
graphical.target reached after 1.799s in userspace.
```

![pf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/73747589-1c1a-5341-24bb-b0ad521cb5d2.png)

* xanmod

```
Startup finished in 10.607s (firmware) + 1.354s (loader) + 4.855s (kernel) + 1.570s (userspace) = 18.387s 
graphical.target reached after 1.564s in userspace.
```

![xanmod.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2729508/d2431041-e576-6cb3-3716-4d078de8510a.png)

## 総評
xanmod > pf > zen

## 感想

思っているよりもzenがかなり高速でした。
あと、pf, xanmod共にログがほとんど出ないです。zenはログが出ます。(カーネルパラメータで変更できるかもしれません。)
zen, pf, xanmodは圧倒的にlinux(linux-lts, linux-hardend)より高速でした。

このレベルだと体感的にはどれも高速です。好きなカーネルでいいと思います。
特にxanmodはゲーミングマシンに向いているのでゲームしたいならxanmodは良いと思います。
そのうちゲームベンチも出したいですね。

xanmod, pfはそれぞれパッケージの追加を行わないと行けないので、そのあたりはzenに軍配が圧倒的に上がります。
ほかのレビューでもxanmodは高温で消費電力も高いらしいので、デスクトップ向きでしょうか。
(pfはその中間的性能?)
zenは手軽で高速、xanmodはちょっとややこしいけど更に高速みたいな印象でした。


systemd-bootやめてEFISTUBで起動したらもっと高速化できると思いますが、もうすでにBIOS起動のほうが圧倒的に長いのでやめます。
シンプルなTerminalテーマ「Pure」をM1以降のMacで有効化する方法

何度かハマったのですが、ググるのに結構時間かかったので備忘として残します。


# 最初にまとめ
- M1以降のMacではnpmではなくHomebrewからPureをインストールしましょう
- Zshプロファイルに `fpath` で検索箇所を追記しましょう


# Pureとは？
Zshのプロンプト表示をシンプルにしてくれるOSSです。

https://github.com/sindresorhus/pure

こんな風になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/b89ce8d9-2585-b26a-9786-31de63427060.png)


# 導入手順
- Homebrew、Pureのインストール

```zsh:ターミナル
# Homebrewのインストール
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Pureのインストール
$ brew install pure
```

- Zsh設定の変更

```zsh:ターミナル
nano ~/.zshrc
```

- nanoエディターで設定ファイル内に以下を追記
- 追記完了したら `Ctrl+ｘ` で終了 → `y` で保存 → `Enter` でファイル名確定、して抜ける

```zsh:.zshrc
# Pureプロンプト
fpath+=("$(brew --prefix)/share/zsh/site-functions")
autoload -U promptinit; promptinit
prompt pure
```

- Zsh設定の再読み込み

```zsh:ターミナル
source ~/.zshrc
```


# 私がハマったポイント

もし以下が表示されてしまったら、pureのパスが認識されていません（＝パスが通っていない）

```zsh:ターミナル
Usage: prompt <options>
Options:
    -c              Show currently selected theme and parameters
    -l              List currently available prompt themes
    -p [<themes>]   Preview given themes (defaults to all except current theme)
    -h [<theme>]    Display help (for given theme)
    -s <theme>      Set and save theme
    <theme>         Switch to new theme immediately (changes not saved)
```

以下を確認しましょう。
- （npmではなく）HomebrewからPureをインストールできているか？
- Zshの設定ファイル内でfpathを追加できているか？

※なお、もしnpm版を使いたい場合は以下を参考にしてnpm用のパスをZsh設定に追加してあげれば良さそうです。

https://dev.classmethod.jp/articles/how-to-pass-path-through-a-globally-installed-npm-package/


# そもそも「パスを通す」って何？
- OSのCLIでコマンドを実行する際、コマンド名を入力するだけで（フルパスを入力してくても）パッケージが実行できてしまうのは、コマンドの実行ファイルが格納されているパスが「ファイルシステム上のどこに保存されているか」のリストがOSの環境設定（環境変数）に含まれているため

- ソフトウェアやそれを実行する環境によっては、インストールしたパッケージが「OSの環境設定に含まれていない」パスに保存されてしまうことがある

- 目的のパッケージが置かれているパスを、OSがコマンド検索対象として正しく認識できるように「環境変数に必要なパスを追加してあげること」を慣用的に”パスを通す”と表現する


# ハマりやすい原因
- Pureのインストール方法が複数ある
- M1 Mac以降、fpath変数の値（コマンド実行時にデフォルトで検索してくれるパス群）が変わっている模様

教訓：公式ドキュメントのreadmeをちゃんと読みましょう（自戒）

https://github.com/sindresorhus/pure/blob/main/readme.md


# おわりに
開発環境のセットアップ周りってつまづきやすいですよね。
- 開発開始時に実施することが多いため初心者ほどハマりやすい
- 各OSの環境設定やコマンド、シェル設定、パッケージ管理ツールなど、ちゃんと理解するのがそこそこ難しい
- ネットで見つかる備忘録的なメモ情報にはとりあえずコマンドのみ羅列されていることが多い
- 主流のCPUアーキテクチャ（x86→ARM）やシェル（Bash→Zsh）など、環境変遷で設定方法も変わってしまう

一見遠回りになりますが、設定やコマンドを実施する際は「この作業はシステム目線で何のためにやっているのか？」「これらのコマンドや設定の意味は何か」を一つずつ確認するようにしたいなと改めて思いました。
flexGenをGoogle Colaboratoryで動かしてみる

[FlexGenをGoogle Colaboratoryで動かして、ChatGPTライクな大規模言語モデルで遊ぶ](https://engineering.nifty.co.jp/blog/15893)
[FlexGen GitHub](https://github.com/FMInference/FlexGen)

# インストール手順

Googleドライブのマウント
```
from google.colab import drive
drive.mount("/content/drive")
```

作業ディレクトリの作成と移動
```
import os
os.makedirs("/content/drive/MyDrive/work/FlexGen", exist_ok=True)

%cd /content/drive/MyDrive/work/FlexGen/FlexGen/
%pwd
```

Githubからレポジトリのクローンとインストール
```
!git clone https://github.com/FMInference/FlexGen.git
!pip install -e .
```

さぁ、チャットの開始だ・・・と思ったらchatbot.pyが無い。
色々な人の記事を見ると２月中旬くらいまでは存在していたらしい。
実際に[2月22のGithub](https://github.com/FMInference/FlexGen/blob/9c80e40f102aa3eb143138ba9e4ccf6a1515a634/apps/chatbot.py)を確認すると存在する。
これを自前で今の環境に合うように設定するのか・・・

上のファイルを（LicenceやReadmeが置いてある）FlexGenフォルダに置いて
chatbot.pyの5行目と14行目のEnvをExecutionEnvに変えれば実行できました。

# めも

## pip installした時のWARNING
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
RubyでAtCoder ABC265(A, B, C, D)を解いてみた

# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC265のA, B, C, Dを解きました。備忘録として解き方をまとめていきたいと思います。

# A - Apple
https://atcoder.jp/contests/abc265/tasks/abc265_a
```ruby:a-265.rb
x, y, n = gets.split.map(&:to_i)
puts n / 3 * [3 * x, y].min + n % 3 * x
```
## 解説
x円払ってりんごを１個手に入れる操作を３回繰り返しりんごを３個手に入れる場合とy円払ってりんご３個を手に入れる場合の小さい方を`N/3`回分かけ、余った`N%3`回分xを足すことで実装することができます。

# B - Explore
https://atcoder.jp/contests/abc265/tasks/abc265_b
```ruby:b-265.rb
n, m, t = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
hash = m.times.to_h{ gets.split.map(&:to_i) }

(n - 1).times do |i|
  t -= a[i]
  if t <= 0
    puts "No"
    exit
  end
  t += hash[i + 2] if hash[i + 2]
end
puts "Yes"
```
## 解説
ボーナス部屋の情報を連想配列hashにもたせます。後は、問題文の通りに実装すればOKです。

# C - Belt Conveyor
https://atcoder.jp/contests/abc265/tasks/abc265_c
```ruby:c-265.rb
# 修正前
h, w = gets.split.map(&:to_i)
arr = Array.new(h){ gets.chomp }

i, j = 0, 0
searched = Array.new(h) { Array.new(w, false) }
loop do
  # searched[[i, j]]でもできますが、実行時間が長くなります
  if searched[i][j]
    puts -1
    break
  end

  searched[i][j] = true
  if arr[i][j] == "U" && i != 0
    i -= 1
  elsif arr[i][j] == "D" && i != h - 1
    i += 1
  elsif arr[i][j] == "L" && j != 0
    j -= 1
  elsif arr[i][j] == "R" && j != w - 1
    j += 1
  else
    puts "#{i + 1} #{j + 1}"
    break
  end
end
```
```ruby:c-265.rb
# 修正後
h, w = gets.split.map(&:to_i)
arr = []
h.times do |i|
  str = gets.chomp
  if i == 0
    str = str.tr("U", "S")
  elsif i == h - 1
    str = str.tr("D", "S")
  end

  str[0]  = "S" if str[0]  == "L"
  str[-1] = "S" if str[-1] == "R"
  arr << str
end
arr = arr.join

hash = {}
k = 0
while !hash[k]
  hash[k] = true
  case arr[k]
  when "U"
    k -= w
  when "D"
    k += w
  when "L"
    k -= 1
  when "R"
    k += 1
  when "S"
    puts "#{(k / w) + 1} #{(k % w) + 1}"
    exit
  end
end
puts -1
```
## 解説
順にマスを移動していき、通ったマスを連想配列を使って記録します。このとき、すでに通ったマスにもう一度移動した場合は無限にループしてしまうので-1を出力して終了します。

# D - Iroha and Haiku (New ABC Edition)
https://atcoder.jp/contests/abc265/tasks/abc265_d
```ruby:d-265.rb
n, o, q, r = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)

hash = {}
sx = 0
hash[0] = true
a.each do |factor|
    sx += factor
    hash[sx] = true
end

hash.keys.each do |sx|
    sy = sx + o
    if hash[sy] && hash[sy + q] && hash[sy + q + r]
        puts "Yes"
        exit
    end
end
puts "No"
```
## 解説
（[公式解説](https://atcoder.jp/contests/abc265/editorial/4591)を参考にしました）

累積和と`Sy=Sx+P`, `Sz=Sy+Q=Sx+P+Q`, `Sw=Sz+R=Sx+P+Q+R`の関係を利用して、この条件を満たすSy, Sz, SwがあればYesを出力して終了、最後まで条件を満たすものがなければNoを出力します。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
【AIZU ONLINE JUDGE】ITP1_4_D 最大値, 最小値, 合計値

# はじめに
アルゴリズムの勉強として、`AIZU ONLINE JUDGE`の問題を解いている。
最大値, 最小値問題のメモリのサイズを小さくするコツを備忘録として残しておく。

# 問題
> n個の整数 ai(i=1,2,...n)を入力し、それらの最小値、最大値、合計値を求めるプログラムを作成してください。

**Input**
>１行目に整数の数nが与えられます。２行目にn個の整数aiが空白区切りで与えられます。

**Output**
>最小値、最大値、合計値を空白区切りで１行に出力してください。

**Constraints**
>0<n≤10000
>−1000000≤ai≤1000000

**Sample Input**
>5
>10 1 5 4 17

**Sample Output**
>1 17 37

# 実装比較
`Constraints`を参考にすることで、最小値を100000, 最大値を-100000に初期値で渡すことができる。
これによって、indexが0のとき、代入処理を書く必要がなく、コードの記述量を抑えることができる。

## 初期値を代入する場合
``` cpp:sample
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int max, min;
    long long total = 0;
    
    for (int i=0; i<n; i++) {
        int a;
        cin >> a;
        if (i==0) {
            max = a;
            min = a;
        }
        if (i!=0 && max<a) {
            max = a;
        }
        if (i!=0 && min>a) {
            min = a;
        }
        total += a;
    }
    
    cout << min << " " << max << " " << total << endl;
}
```
## 入力範囲の最大, 最小を代入する場合
``` cpp:sample
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int min = 1000000;
    int max = -1000000;
    long long total = 0;
    
    for (int i=0; i<n; i++) {
        int a;
        cin >> a;

       if (max < a) {
         max = a;
       }

       if (a < min) {
         min = a;
       }
       total += a;
    }
    
    cout << min << " " << max << " " << total << endl;
}
```

# おわりに
まだまだ、アルゴリズムの勉強が足りないので、今後も継続して行っていく

# 参考リンク
[ITP1_4_D:   Min, Max and Sum - AIZU ONLINE JUDGE](https://onlinejudge.u-aizu.ac.jp/problems/ITP1_4_D)
[人はなぜ、long long を使うのか？ (競技プログラミング)](https://zenn.dev/kubo_programmer/articles/0cd2492aad91f9629af2)
pgadmin4 でエラーになり、psql で取り込める sql ファイル

Query Tool で、sql ファイルを開き実行するとエラーになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/066267c1-70eb-ddfb-2041-e3fbdcd7225e.png)

エラーメッセージ

```text
ERROR:  syntax error at or near "t3463"
LINE 47: t3463 東広島 92513 2001-06-12
         ^ 

SQL state: 42601
Character: 1070
```

## SQL ファイル

```sql:may0704.sql
--
-- PostgreSQL database dump
--

-- Dumped from database version 15.2 (Ubuntu 15.2-1)
-- Dumped by pg_dump version 15.2 (Ubuntu 15.2-1)

-- Started on 2023-05-07 11:21:18 JST

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

SET default_tablespace = '';

SET default_table_access_method = heap;

--
-- TOC entry 214 (class 1259 OID 20742)
-- Name: cities; Type: TABLE; Schema: public; Owner: scott
--

CREATE TABLE public.cities (
    id character varying(10) NOT NULL,
    name text,
    population integer,
    date_mod date
);


ALTER TABLE public.cities OWNER TO scott;

--
-- TOC entry 3339 (class 0 OID 20742)
-- Dependencies: 214
-- Data for Name: cities; Type: TABLE DATA; Schema: public; Owner: scott
--

COPY public.cities (id, name, population, date_mod) FROM stdin;
t3463	東広島	92513	2001-06-12
t3464	呉	93167	2001-09-29
t3465	尾道	95419	2001-03-18
t3466	竹原	82314	2001-02-21
t3467	三次	76152	2001-08-16
t3468	大竹	37541	2001-07-07
t3469	府中	46518	2001-10-09
\.


-- Completed on 2023-05-07 11:21:18 JST

--
-- PostgreSQL database dump complete
--
```

## psql で実行した結果

```text
$ psql -U scott city < may0704.sql 
SET
SET
SET
SET
SET
 set_config 
------------
 
(1 row)

SET
SET
SET
SET
SET
SET
CREATE TABLE
ALTER TABLE
COPY 7
```

## sql ファイルの作成方法

pgadmin4 のバックアップで作成しました。
Format を plain にしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/2c733a11-d1c4-19de-eb6c-79f9bad90941.png)

ファイルは次の場所に出来ました。
ユーザーが test@test.com の場合です。

```text
/var/lib/pgadmin/storage/test_test.com
```
Build a Mars Communication Uplink  > Automate the Process


+ [Build a Mars Communication Uplink  > Automate the Process](https://trailhead.salesforce.com/content/learn/projects/trailhead_on_mars/trailhead_on_mars_step_3)


+ [Automate the Process Mars Communication Uplink](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Pea5Y)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/cdecfb52-5191-4b57-a6eb-fa2c3abe26a6.png)

:::note
Please check this video.

https://www.youtube.com/watch?v=kTVF_RopGQw

https://www.youtube.com/watch?v=WJKeX5_RUgM
:::
pacmanでlinux-xanmodカーネルをインストール

以下の文を実行してpacmanにリポジトリを追加してください。
```shell:shell
sudo pacman-key --recv-key FBA220DFC880C036 --keyserver keyserver.ubuntu.com
sudo pacman-key --lsign-key FBA220DFC880C036
sudo pacman -U 'https://cdn-mirror.chaotic.cx/chaotic-aur/chaotic-keyring.pkg.tar.zst' 'https://cdn-mirror.chaotic.cx/chaotic-aur/chaotic-mirrorlist.pkg.tar.zst'
```

/etc/pacman.confのファイルに以下の文を追記してください。
```/etc/pacman.conf
[chaotic-aur]
Include = /etc/pacman.d/chaotic-mirrorlsit
```

以上です。
```shell:shell
sudo pacman -S linux-xanmod
```
あとはこれでインストールができます。
systemd-bootでカーネルを変更する方法

# Arch Linuxでsystemd-bootのカーネルを変更する方法

Arch Linuxでsystemd-bootのカーネルを変更する手順を紹介します。

## 1. 新しいカーネルのインストール

`sudo pacman -S linux`などで新しいカーネルをインストールしてください。

## 2. カーネルイメージの作成
インストールが完了したら、新しいカーネルイメージを作成します。以下のコマンドを実行して、initramfsを生成します。
```shell
sudo mkinitcpio -p linux
```

## 3. ブートローダの設定ファイルの編集
ブートローダの設定ファイルを編集します。設定ファイルは /boot/loader/entries ディレクトリにあります。例えば、linux.confという名前の設定ファイルを作成し、以下のように設定します。

```
title   Arch Linux
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options root=/dev/sdXY quiet rw
```

title：エントリの表示名を指定します。(boot in 3..の画面でのタイトルになります。)
linux：カーネルイメージのパスを指定します。vmlinuz-linuxはlinuxカーネルイメージのデフォルト名です。
initrd：initramfsイメージのパスを指定します。initramfs-linux.imgもデフォルトの名前です。
options：カーネルの起動オプションを指定します。root=/dev/sdb2の部分は、Arch Linuxのルートパーティションのデバイスを指定します。

適宜XYは変更してください(rootパーティションにしてください。)
## 4. ブートローダの設定ファイルの更新
設定ファイルの変更を適用するため、ブートローダの設定ファイルを更新します。以下のコマンドを実行してください。
```
sudo bootctl update
```

あとはrebootしたらカーネル選択画面が出てくると思います。

### カーネルが画面に出てこないとき

/boot/loader/entriesのファイルが正しく設定できてないのが原因です。
もともとあるentriesのファイルをコピペして使うと良いでしょう。

```conf:linux-zen.conf
# Created by: archinstall
# Created on: 2023-05-07_00-59-49
title Arch Linux (linux-zen)
linux /vmlinuz-linux-zen
initrd /amd-ucode.img
initrd /initramfs-linux-zen.img
options root=PARTUUID=XXXXXXXXX zswap.enabled=0 rw intel_pstate=no_hwp rootfstype=ext4
```
あとはlinux のところとinitrdの２つ目、titleを編集すればOKです。
クリップボードの画像ファイルを名前を付けて保存するコンテキストメニューへの追加

## ソースコード
クリップボードから画像データを取得して、名前を付けて保存する。

```ClipImage.cs
using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;

namespace ClipImage
{
    public static class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            try
            {
                Execute(args);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message, "Error");
            }
        }

        static void Execute(string[] args)
        {
            var img = Clipboard.GetImage();
            if (img == null)
            {
                throw new Exception("Empty.");
            }

            var sfd = new SaveFileDialog();
            sfd.FileName = "新しいファイル.jpeg";
            sfd.Filter = "画像ファイル(*.jpeg)|*.jpeg";
            if (args.Length == 0)
            {
                sfd.InitialDirectory = @"C:\";
            }
            else
            {
                sfd.InitialDirectory = args[0];
            }

            if (sfd.ShowDialog() == DialogResult.OK)
            {
                img.Save(sfd.FileName, ImageFormat.Jpeg);
            }
        }
    }
}

```

## コンパイル
csc.exeでコンパイルする。

```
csc.exe /out:clipimage.exe /target:winexe ClipImage.cs
```
## コンテキストメニューへ追加
以下のレジストリの場所へ
```
HKEY_CLASSES_ROOT\Directory\Background\shell\IMAGE♪
```
以下の値を追加
```
キー名：command
値："C:\{exeの配置場所}\clipimage.exe" "%V"
```
※やる前へ念のために、元に戻せるのでレジストリをエクスポートしておくのを推奨

## 動作
コンテキストメニューに「IMAGE♪」が追加される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688992/5ae8ed08-ea2e-1f36-ce63-d282cebe6bb3.png)
RVCインストール時に遭遇した問題とその対処法

RVC(Retrieval-based-voice-Conversion)のAIによるボイチェンが気になったので、インストールしてみましたが、いくつかはまったポイントがあったのでそのときのメモです。

# インストール
最近日本語のREADMEができているので、順を追って読めば問題ないハズ。

https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI


# はまったポイントその１： Microsoft Visual C++ 14以上のインストールが必要
poetry installで依存関係をインストール中に上記のインストールが必要とのメッセージ。
メッセージに従って、[MSのサイト](https://visualstudio.microsoft.com/visual-cpp-build-tools/)からダウンロード。

# はまったポイントその２：基底モデルのインストール
基底modelsを準備の項で、[Hagging Face space](https://huggingface.co/lj1995/VoiceConversionWebUI/tree/main/)からモデルがダウンロードできると書いてあります。その下に書かれているモジュールが上記のGithubからダウンロードしてきたディレクトリの中に含まれている必要がありました。そのためFileNotFoundErrorが発生。

# はまったポイントその２：CUDAがインストールされていなかった
使っているGPUはNVIDIA GeForce GTX 1660 TiでCUDA対応だったのですが、なぜかGPUが認識されていませんでした。原因は[CUDA](https://developer.nvidia.com/cuda-gpus)と[CuDNN](https://developer.nvidia.com/rdp/cudnn-download)がインストールされていなかったこと。

これら２つをインストールした後、このままRVCを走らせてもGPUを認識しなかったので、PyTorch関連のパッケージをUninstallした後で、再インストール。ただし最新版だとだめなようで、古いバージョンのものを使用。

参考にさせて記事記事：[windows,pytorchでcudaが使えない](https://teratail.com/questions/1rbl6ez2s1qp5z)

```
$ pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113
```

次のコードでGPUを認識し、CUDAが利用できるかを確認。Trueが表示されればOK。
```
import torch, os, traceback, sys, warnings, shutil, numpy as np

gpu = torch.cuda.is_available()
print(gpu)
```

さらにRVCのWeb UIを起動したときに、このようになっていればOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111352/85838d50-0d79-fb67-e92d-44b9d6063d55.png)
Xercesを使用してXMLの改行のみの要素を回避する

Xercesを使う機会があったのでブログからサンプルソースなどを使用して
動作を確認してみました。
DOMノードを使用した解析なども未経験だったため良い経験になりました。

Xercesを使用しXMLを読み込ませた場合、改行がひとつの要素として扱われていました。
自身の都合上改行を要素として扱ってほしくはないのですが、
オブジェクトの設定値を変更するだけで要素として扱わない様な仕様があれば良かったのですが、無さそうでした。

ということでどうやって回避するかですが、方法は単純で
タグを一つの要素として見なす場合、タグにはタグ名が設定されています。
改行のみの場合はタグのように山かっこで囲まれておらず、タグ名は
設定されていません。
なので、改行についてはタグ名を取得した際にタグ名が取得できなかったら
改行のみの要素として判断します。

以下にサンプルのソースを記載しました。


	char* name = XMLString::transcode(((DOMElement*)text)->getTagName());
	XMLString::trim(name);
	if (strlen(name) < 1) {
		cout << "改行文字の要素です!"<< endl;
	}
	XMLString::release(&name);


色々省略はしていますが、「getTagName」戻り値は改行文字を含んだ文字列が返ってきます。その戻り値から「trim」を使用して改行文字を除外することで改行文字以外の文字が残る仕組みになっています。
あとは空かどうかを判定するだけです。

少しでもXercesを使う方の労力を減らせればと思います。

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

参考文献
https://mokky14.hatenablog.com/entry/2014/03/18/190356
新卒入社から3年間の勉強内容をざっくりとまとめ、勉強を続けるのに必要なことを考えてみた

# はじめに

私は現在(2023/05/07)、IT企業に新卒入社して3年が経ちました

今回は以下を共有できればと思います

- これまでどのようなスケジュール感で勉強してきたのか
- 私なりに考えた、勉強を続けるのに必要なこと

私自身、他者の勉強スケジュール等を見ると自分も頑張ろうという気持ちになるので、私も誰かのお役に立てれば幸いです

# ざっくりとしたこと

| 年 | 月 | 勉強したこと | 資格状況 |
| --- | --- | --- | --- |
| 2020年 | 4月 | 基本情報の勉強 |  |
|  | 5月 | ↓ |  |
|  | 6月 | ↓ |  |
|  | 7月 | ↓ |  |
|  | 8月 | 勉強はせずアプリ作成など |  |
|  | 9月 | ↓ |  |
|  | 10月 | G検定の勉強 |  |
|  | 11月 | ↓ | G検定受験/合格 |
|  | 12月 | 基本情報の勉強 |  |
| 2021年 | 1月 | ↓ | 基本情報受験/合格 |
|  | 2月 | プロジェクトマネージャの勉強 |  |
|  | 3月 | 応用情報の勉強 |  |
|  | 4月 | ↓ | 応用情報受験 |
|  | 5月 | 勉強はせずグダグダ |  |
|  | 6月 | TOEICの勉強 | 応用情報合格 |
|  | 7月 | ↓ |  |
|  | 8月 | ↓ | TOEIC受験 |
|  | 9月 | プロジェクトマネージャの勉強 | TOEIC625点取得 |
|  | 10月 | ↓ | プロジェクトマネージャ受験 |
|  | 11月 | TOEICの勉強 |  |
|  | 12月 | ↓ | TOEIC受験・プロジェクトマネージャ合格 |
| 2022年 | 1月 | Oracle Bronzeの勉強 | Oracle Bronze受験/合格 |
|  | 2月 | Oracle Silver DBAの勉強 | Oracle Silver DBA受験/合格 |
|  | 3月 | ネットワークスペシャリストの勉強 |  |
|  | 4月 | ↓ | ネットワークスペシャリスト受験 |
|  | 5月 | Oracle Silver SQLの勉強 | Oracle Silver SQL受験/合格 |
|  | 6月 | E資格の勉強 | ネットワークスペシャリスト合格 |
|  | 7月 | ↓ |  |
|  | 8月 | ↓ | コロナ感染のためE資格受験できず |
|  | 9月 | データベーススペシャリストの勉強 |  |
|  | 10月 | ↓ | データベーススペシャリスト受験 |
|  | 11月 | TOEICの勉強 |  |
|  | 12月 | 統計検定2級勉強 | TOEIC受験・データベーススペシャリスト合格 |
| 2023年 | 1月 | ↓ | TOEIC725点取得・統計検定2級受験/合格 |
|  | 2月 | E資格勉強 | E資格受験 |
|  | 3月 | 勉強はせずアプリ作成など | E資格合格 |
|  | 4月 | システムアーキテクト勉強 | システムアーキテクト受験 |

# 勉強を続けるにはどうしたらよいか

やはり勉強をするにはモチベーション管理が一番大切と感じました

ざっくりと見てみると勉強し続けているように見えますが、日単位でみるとダラダラ過ごしていた日も少なくないため、いかにモチベーションを上げてコツコツ勉強を楽しめることが必要に思います

個人的にモチベーションを上げるには以下2つが必要と考えます

1. なりたい自分を明確にし、どんな知識が必要かを明確にする
2. 自分の努力を数値で確認可能にする

## なりたい自分を明確にし、どんな知識が必要かを明確にする

人間は自分に必要な情報を取り入れ、不要な情報はすぐに消してしまう習性があると本で読んだことがあるので、勉強していることは必要なものであると認識することが必要と思います

私の場合は、社内の業務を全てこなせるゼネラリストになりたいと考えているので、毎回勉強内容が社内の業務に関連するかという観点で要否を判断していました

結果として、勉強し始めたことは毎回目標のレベルまで勉強を続けられたのでこの考え方は正解だったと思っています

## 自分の努力を数値で確認可能にする

子どもの頃はゲームが大好きで、何時間も集中してゲームしていることが多々ありました

ゲームはどうしてこんなに楽しいのか考えた時に、ゲームでは経験値を貯めたりお金を貯めたりしていたため、数字を貯めていくのが楽しいのかなという結論に至りました

なので、勉強でも数字を貯めていけるような仕組みにすれば良いのではないかと思い、勉強時間を記録していくようにしていきました

すると大正解だったようで、毎日勉強時間を貯めていくのが楽しくなり、今では数値を貯めるために勉強しているような気さえします(これがいいのか悪いのかは置いておきます🙂)

さらに勉強時間を記録をしているとなりたい自分に近づいている感覚になるので、1つ目の「なりたい自分を明確にし、どんな知識が必要かを明確にする」とも相乗効果があります

# 最後に

勉強を続けるためのモチベーション管理は誰もが悩むところかと思います

他にこんなモチベーション管理があるよ！という方はコメントいただけると幸いです！

最後まで、読んでいただきありがとうございました！
ios ショートカットの Tips（日付）

日付（日、時間、時刻）関連のtipsを書いてゆきます
# テキストから日付を取り出す
テキスト（改行ありの文字列）から、すべての日付情報を抽出してリストにします
これを実現する2種類のアクションがあります。一つは次の

［入力から日付を取得］　　(1)
![テキストから日付.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535482/871a92e7-79dd-feac-96ef-e432abc836de.png)
です。もう一つは

［入力からテキストを取得］　　(2)
![テキストからテキスト.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535482/b1b5e4da-d861-6bfe-5b34-4cd671898c93.png)
で、「入力（この画像では「テキスト」）」をタップして、種類オプションで日付を選びます

<div align="center">
<img width="40%" alt="テキストからテキスト（日付）.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535482/ee3cdfa8-bcdf-7863-c003-fbc1a8b07ac9.png">
</div>

この２つのアクションには１つだけ違いがあって、前者(1)は日付を含まないテキストを入力しても出力しないだけでエラーになりませんが、後者(2)はエラーになり、処理が止まってしまいます。それ以外の動作は同じに思います。処理は

| 機能 | 入力 | 出力 | 
|---|---|---|
| 日時 | 2023年6月23日午後4時35分 | 2023/06/23 16:35 | 
| 日 | 2023/6/23 | 2023/06/23 12:00 |
| 時 | 16:35 | `<today>` 16:35 |

注意点は
- 上の表の出力は、日付フォーマット：中、時間フォーマット：短　にした場合
- 半角スペースで分割して読み取る。全角文字が日時情報の前後にあると読み取れない場合がある
- 時刻情報だけの場合は実行した日付となる（上の表の`<today>`には実行した日が入る）
- 日付情報だけの場合12:00の時刻となる
- 午前/午後、YYYY/MM/DD、YYYY-MM-DD、年月日、などは読み取る模様
- 存在しない日や時刻は読み取らない（2023年3月32日→無視）
- うるう年は考慮している（2020年2月29日→2020/02/29、2021年2月29日→2021/03/01）

# 年月日時分
年、月、日、の数値を別々の変数に取得すると、乗り換え検索のフォームの入力などに利用できます。以下のアクションで変数“日”に今日の日付情報が０パディングで設定できます

［日時/｛現在の日付｝］
［変数/変数｛“日”｝を｛日時｝に設定］
　オプション：　日付として＞　
　日付フォーマット：　カスタム
　カスタムフォーマット：　dd

変数名の“日”は任意の文字列です。以下に変数アクションで｛日時｝をタップした時の設定例を示します

<div align="center">
<img width="50%" alt="日付.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535482/d4b5b159-7699-6eb4-1dd5-3abedbae3383.jpeg">
</div>

| 情報 | フォーマット | 2019/08/23（金） 09:51:38の例 |
|:-:|:-:|:-:|
|  年 | yyyy  | 2019  |
|  年 | yy  | 19  |
|  月 |  MM | 08  |
|  日 | dd  | 23 |
|  時 | HH  | 09 |
|  分 | mm  | 51  |
|  秒 | ss  | 38 |
|  曜日 | E  | 金  |

フォーマット文字列は複数設定することや任意の文字列を加えることもできます
＊　カスタムフォーマットの設定はアクションをコピーしたりすると消えて、デフォルトに戻ってしまいます。動きがおかしかったらチェックしてみましょう
＊＊このTipsは @Kynako さんにコメントで教えていただきました。ありがとうございました
Salesforceで過去の5月12日に何があったのかを振り返る

こんにちは
本橋孝昭です

今回はSalesforceで過去の5月12日に起こった出来事を振り返ります

まずは去年の2022年5月12日です

## 2022年5月12日にSalesforceで何があったのか？

2022年5月12日は一時全世界でSalesforceのアクセスができない状況になっていました
当時の状況が分かるヘルプがございましたので詳細はこちらを参考にしてください


2022 年 5 月 12 日に Lightning Platform で発生したサービス中断に関するご報告
https://help.salesforce.com/s/articleView?id=000392094&type=1

（以下一部抜粋）

＞2022 年 5 月 12 日 9 時から 10 時 26 分までの間（日本時間／以下すべて 24 時間表記)、Lightning Platform をご利用のお客様に影響を及ぼすサービス中断が発生しました


＞本障害の発生中、全世界で Lightning Platform をご利用の一部のお客様より、Salesforce のサービスへのアクセスの際、エラーが発生するとの報告がありました。

過去の記事も残っていました

Salesforceで朝から障害発生　「解消に向かっている」
https://www.itmedia.co.jp/news/articles/2205/12/news097.html

（以下一部抜粋）

＞CRMソリューション「Salesforce」を国内展開するセールスフォース・ジャパンは5月12日、同日午前9時15分ごろからSalesforceにアクセスできない障害が一部のユーザーで発生したと発表した



さて、実は一昨年の22021年5月12日にも同じような現象が起こっていました

## 2021年5月12日にSalesforceで何があったのか？

当日の内容はこちらのヘルプに詳細がまとめられています

2021 年 5 月 12 日発生のマルチインスタンスサービス中断について
https://help.salesforce.com/s/articleView?id=000390251&type=1

（一部抜粋）
＞2021 年 5 月 12 日 6 時 8 分頃、弊社技術部門は Salesforce 本番環境のすべてのインスタンスに影響を及ぼすサービス中断を検知しました。サービス中断により、Sales Cloud、Service Cloud、Marketing Cloud、Commerce Cloud、Government Cloud (日本では未提供)、Experience Cloud、Heroku、Pardot、および Salesforce Industries のサービスにおいて、ユーザのログインに影響が及びました。
加えて、Trust サイト(status.salesforce.com)も利用不可となり、また、お客様は弊社サポートへのお問い合わせを起票することもできませんでした。一部のお客様には多要素認証 (MFA) にも影響を及ぼしました。

こちらの内容も記事に残ってます
https://www.itmedia.co.jp/news/articles/2105/12/news069.html

（以下一部抜粋）
＞Twitter上で、5月12日午前7時ごろから「米salesforce.comの製品にログインできない」「ログインできたものの動作しない」という報告が相次いでいる。


以上が過去にSalesforceに起こった5月12日の出来事です

## ここから先が本橋の所感です

### Salesforceに携わる皆さん「もしも」に備えてますか？
残念ながらどんな優れたシステムでも止まってしまうことはどうしても出てしまうことはあると思うので、
・Salesforceがもしも止まったときにどうするか？
は頭の片隅にちょっとでも残したほうがいいのかな　と思いました
（年に一回くらいしかない現象だとは思いますが）

不謹慎かもしれないですが
2021年5月12日、2022年5月12日はSalesforceにログインできなくなってしまったので、
「じゃあもしもSalesforceにログインできなかった場合にどう対応するか？」ということはたまには（年に一回くらいは？）考えてみる必要もあるかもしれないですね

### Salesforceに「もしも」があればTwitterを見ればいい？

仮になにかあった場合、一時速報的なものは過去の内容を見る限りSalesforce
公式情報はTwitterから発表されるようですね
（後からヘルプでまとまった情報は出るようです）

2022年5月12日の内容について、Salesforce JapanのTwitterからまず情報が発信されたようです

https://twitter.com/SalesforceJapan/status/1524569242783588352?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1524569242783588352%7Ctwgr%5E60338ca89870f03ce6e3f49c097efe9293e0f60d%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fwww.itmedia.co.jp%2Fnews%2Farticles%2F2205%2F12%2Fnews097.html

2021年5月12日の内容についてSalesfroceのParkerさんがTwitterではやくから発信してますね

https://twitter.com/parkerharris/status/1392253069690343424?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1392253069690343424%7Ctwgr%5Ea82d39dfd0e2e54c704bedf027ff446cceffbe77%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fwww.itmedia.co.jp%2Fnews%2Farticles%2F2105%2F12%2Fnews069.html



このことから、「Salesfroceで何かあったのかな？」と思ったらTwitterを見たほうが情報がはやく取得できるかもしれないですね
【備忘録・GAS】ドキュメントの場所は？サンプルプログラムも記載

# はじめに

GAS（Google Apps Script）で開発をしていて、
いつもドキュメントを探すのに時間がかかっていたので、
よく見るページのURLをまとめておきます。

# GASの公式ページ
GASの公式ページであり、
さまざまなApps Script サービスとプロジェクトリソースについて、
まとめられています。

https://developers.google.com/apps-script/reference?hl=ja

スプレッドシートで使用できる機能を確認したい場合は
画面左のスプレッドシートを選択し、
その中から使用したい項目を選択します。

![GASの公式ページ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657926/8ef8386c-fd9d-fc3b-1a1c-98b436c54e66.png)


Calendar、Drive、Gmailなどの機能の使い方も確認可能です。

# スープレッドシートでよく使う機能
下記はスープレッドシートでよく使う機能です。

## SpreadsheetApp
スプレッドシートのファイル（シート）にアクセスして、
値の参照・変更、シートの挿入・削除など、
スプレッドシート単位で操作ができます。

https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app?hl=ja

## Spreadsheet
スプレッドシートのファイル（シート）にアクセスして、
値の参照・変更、シートの挿入・削除など、
シート単位で操作ができます。

https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet?hl=ja

# 実装方法
スプレッドシートからシートを取得し、
シートから全ての値を取得するサンプルプログラムです。

## スプレッドシート

シート名：「社員」
![スプレッドシート.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2657926/5cd7df5c-f581-e4ad-3731-b049c96a8b50.png)

```GAS:Main.gs
// 整形：「Shift+Alt+F」

function myFunction() {

  //console.log("Hell0 Google Apps Script");

  const book = SpreadsheetApp.getActiveSpreadsheet();  // アクティブのスプレッドシートを取得

  /**
   * スプレッドシートのシートを取得
   * 
   * @param sheetName シート名（String）
   * @return sheet Sheetオブジェクト
   */
  const getASheet = (sheetName) => {
    const sheet = book.getSheetByName(sheetName);

    return sheet;
  }

  /** 
   * シートから全ての値を取得
   *  
   * @param sheet Sheetオブジェクト
   * @return data シートの全データ
  */
  const getSheetData = (sheet) => {
    const data = sheet.getDataRange().getValues();

    return data;
  }

  const sheet = getASheet("社員");    // スプレッドシートからシートを取得
  const sheetData = getSheetData(sheet);  // シートから全ての値を取得

  console.log(sheetData);             // シートから全ての値を表示
  console.log(sheet.getLastColumn()); // シートから最終列を取得
  console.log(sheet.getLastRow());    // シートから最終行を取得
}
```

## 実行結果
実行ログ
10:11:16	お知らせ	実行開始
10:11:17	情報	[ [ '名前', '性別', '年齢' ],
  [ '佐藤', '男', 22 ],
  [ '田中', '女', 32 ],
  [ '江藤', '男', 27 ],
  [ '高橋', '男', 44 ],
  [ '遠藤', '男', 41 ],
  [ '山田', '女', 55 ],
  [ '山下', '女', 35 ],
  [ '木村', '女', 20 ] ]
10:11:17	情報	3
10:11:17	情報	9
10:11:17	お知らせ	実行完了

# まとめ
GASのドキュメントの場所、簡単なサンプルプログラムについて、
記載しました。
任意の型のカラム名を取り出す方法（pandas）

## 結論
以下のように型を指定する．

```python
#int型を取り出す時
df.columns[df.dtypes == "int"]

#float型を取り出す時
df.columns[df.dtypes == "gfloat"]

#category型を取り出す時
df.columns[df.dtypes == "category"]
```

出力
```
Index(['columns1', 'columns2',...], dtype='object')
```
dfは，$N\times M$のDataFrameです．


### 簡単な例
小数と整数値（カテゴリ）が混ざったdafaframeを生成します．

```python
import pandas as pd

point_data = pd.DataFrame(np.arange(9.0).reshape(3, 3),
                  columns=['point_0', 'point_1', 'point_2'])
category_data = pd.DataFrame(np.arange(6).reshape(3, 2),
                  columns=['category_0', 'category_1'])
df = pd.concat([point_data, category_data], axis = 1)
```

dfの中身は，以下のようになっています．

```
   point_0  point_1  point_2  category_0  category_1
0      0.0      1.0      2.0           0           1
1      3.0      4.0      5.0           2           3
2      6.0      7.0      8.0           4           5
```

今回は例として，int型のカラムを抽出します．

```Python
df.columns[df.dtypes == "int"]
```

出力
```
Index(['category_0', 'category_1'], dtype='object')
```

データフレームの中身を確認します．
```Python
df[df.columns[df.dtypes == "int"]]
```

```
   category_0  category_1
0           0           1
1           2           3
2           4           5
```

## 用途
カテゴリ変数に強い機械学習モデル"Catboost"の引数に，カテゴリ変数名(int型 or category型)を指定する時などに使えます．
その時は，

```python
import catboost as cb

category_features_name = point_data.columns[(point_data.dtypes == "int") | (point_data.dtypes == "category")]
clf = cb.CatBoostClassifier(cat_features = category_features_name, verbose = 0)
```
AI（GPT）へのデータ提供を拒む流れ、最適化する流れ～AIによる新しいWebの領域創造

# １．クローラーによる学習データの収集


ChatGPTなどは、**<font color=red>CommonCrawlなどがクローリングをして集めた情報</font>** を学習データとして使っています。

https://recruit.gmo.jp/engineer/jisedai/blog/chatgpt_please_tell_me_uni_ikura/

https://gihyo.jp/article/2023/03/programming-with-chatgpt-01


ChatGPTを使った人ならわかると思いますが、**<font color=red>ChatGPTは 質問者にとって必要な情報のみを表示</font>** してくれます。質問する側からしたら、**<font color=red>ネット上にある情報を広告やノイズ無しで取得できる</font>** ので便利だと感じると思います。


# ２．AI用のクローラーをブロックする方法

一方で、サイト運営者からしたら広告を表示していても、それを見られることなく情報を抜かれるということにもなります。

こうした、ChatGPTなどにデータを提供することに疑問を呈する人たちもいます。

https://www.searchenginejournal.com/is-chatgpt-use-of-web-content-fair/477558/#close


こうした **<font color=red>AIへの情報提供をブロックすることは、古典的なrobots.txtを使う</font>** ことでできます。

https://www.suzukikenichi.com/blog/how-to-block-chatgpt-and-common-crawl-by-robots-txt/

# ３．AIへのデータ提供を拒否する流れもでてくるのでは？

イタリアがChatGPTの利用を規制をしたことは有名なことだと思います。

https://toyokeizai.net/articles/-/667190

こうしたAIの利用自体を規制する動きは、世界各地でおきつつあります。

https://www.technologyreview.jp/s/288574/ai-regulation-proceeding-in-europe-and-the-us-what-is-it/

おそらく、データ提供に対しても何らかの法的な規制がかかるのかもしれません。
サイト運営者からすれば、広告収入がなくなる危険性もあります。

# ４．「AI（GPT）版SEO」などの領域も徐々に生まれつつあるのかも

MicrosoftのBing AIは、AIを利用した検索エンジンとして注目を集めています。


https://www.gizmodo.jp/2023/03/how-to-use-bing-ai-vs-chatgpt.html


そして、そのBing向けのSEOをどうしたらいいのかという記事もあります。それを、ChatGPTに質問するというおもしろい趣向の記事です。


https://stitchdx.com/blog/how-do-i-seo-for-the-new-bing-i-asked-chatgpt/

このように、ChatGPTなどのGTPモデルはネットの情報を使うことが考えられますが、それを逆手にとってAIに拾いやすいサイトをつくるという流れも今後はでてくると思います。

検索エンジンへの最適化から（Search Engine Optimization)から、AI(GPT)への最適化をするサイトもふえるのかもしれないと思います。
SEOならぬ、**<font color=red>GPTO（GPT：Generative Pre-trained Transformer optimization)</font>** などが生まれるのかもしれないですね。

https://dev.classmethod.jp/articles/improving-website-markup-for-effective-gpt-learning/


https://www.linkedin.com/pulse/gpt-4-effect-shaping-future-seo-content-marketing-dreamanart/


# ５．AI(GPT)がもたらす新しいWebの世界：AIを通した情報提供

ChatGPTをはじめとするGPTモデルは、ネットの情報を使うことが不可避ではと思います。そうなったとき、それをブロックする人々や法規制もでてくると思います。

一方で、GPTモデルを積極的に活用して自社、自社サービスをアピールしようとする人もでてくると思います。
2000年初頭に検索エンジンが生まれてSEOを始めとする新しい領域が生まれたように、ChatGPTの登場により、またWebの世界も新しい領域や規制が生まれようとしているのかもしれません。

今までは、人間が検索エンジンをつかってWebサイトを表示して情報を取得するという方法が一般的でした。

```txt
人間 ⇔ Webサイト
```

しかし、これからは **<font color=red>人間とWebサイト（Webの公開情報）の間に、AI（GPT)</font>** が入ります。

```txt
人間 ⇔ AI（GPT) ⇔ Webサイト
```

誰に対して最適化すればよいのかという対象が変わってくるように思います。

**<font color=red>AI向けには、セマンティックを考慮したシンプルなテキスト情報を提供</font>** していくと思います。

一方で、人間と接するAIのインターフェースは今はそっけないものが多いですが、ここにデザイン要素がたくさん取り入れられてくるのではないでしょうか。**<font color=red>AI向けのUI/UXデザインも独立した分野として生まれる</font>** かもしれないです。

個人的に、**<font color=red>AIの利用は、インターフェースの集約化・単一化</font>** になると感じています。つまり、あれもこれも画面を開いたり、操作する必要がなくなるということです。それを前提として、UI/UXデザインもうまれるのではないでしょうか？

**<font color=red>今は、処理ごとに画面を設けたり、情報の領域を分割するUI/UXデザインが多い</font>** ですが、それが変わってくるように思います。

最初はシンプルな画面を表示し、指示を与えたあとは、回答を確認したり、そのあとの処理を促したりするという画面の流れ。いかに人間が簡単な操作をしながらも、確認やそのあとの操作をしやすいUI/UXにするのか？これはこれから色々と考案されてくるように思います。

Webビジネスにかかわる人は、このあたりの流れを踏まえて問題を回避しつつ、有益なサービスをもたらすアイデアを考えていく必要があると思います。
モデル駆動アプリの列に検索つきドロップダウンリストを作成する

**アプリユーザがUI上で入力する業務をドロップダウン式にして作業簡略化**

アプリUI上でデータ入力する際、あらかじめ用意されたテーブルから選択できるようにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289762/ecbcd1bc-cfc1-16b2-19ed-222945eb09a8.png)

**設定方法**

<全体の流れ>
・はじめにリスト化対象の参照テーブルを作成する。
・次にアプリのデータテーブルにドロップダウン選択する列を新規作成する

<参照テーブル作成>
リスト化したい項目をプライマリ列にしてテーブルを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289762/f64a0abc-2a52-754e-2a74-44b4acffc576.png)

<ドロップダウン列を新規作成>
テーブルビュー右側の十字ボタンから項目を新規作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289762/7c32954f-abde-d7fc-b486-4e3887d0ab5d.png)

データの種類は「検索」を選択する。検索可能にもチェックすると文字入力検索ができるので便利。
関連テーブルはあらかじめ準備した参照テーブルを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289762/df59ca11-bc8f-0c07-aedb-032cd012a864.png)

設定完了。
vscodeで各言語ごとにインデントを設定

## 1. 背景
これまで私はフロントエンド中心に開発を行っていましたが、最近RubyやPHPを使うことが増えてきました。
しかし、PHPは標準でインデントの幅が4文字であり、RubyやTypeScript・JavaScriptは2文字です。そのため、ファイルごとにインデントを変更するのも面倒です。
また、個人的に各言語ごとのプラグインも入れたくありません。そこで、VSCodeの設定を変更して各言語ごとのインデントを追加しようと考えました。

## 2. 手順（リポジトリ単位での設定）
1. リポジトリ配下にvscodeディレクトリを、その中にsetting.jsonを作成
2. 各言語ごとにインデントとinsertSpaces(tabを押した時のスペース)を設定
今回はPHP,Ruby,JavaScript,Typescriptなどを設定しました。ここはお好みで設定できます。
```
    "[javascript]": {
        "editor.tabSize": 2,
        "editor.insertSpaces": true
    },
    "[javascriptreact]": {
        "editor.tabSize": 2,
        "editor.insertSpaces": true
    },
    "[typescriptreact]": {
        "editor.tabSize": 2,
        "editor.insertSpaces": true
    },
    "[typescript]": {
        "editor.tabSize": 2,
        "editor.insertSpaces": true
    },
    "[php]": {
        "editor.tabSize": 4,
        "editor.insertSpaces": true
    },
    "[ruby]": {
        "editor.tabSize": 4,
        "editor.insertSpaces": true
    }
```

## 3. 手順（グローバルでの設定）
1. vscodeでshift + cmd + P
2. open user settingと入力
2. 各言語ごとにインデントとinsertSpaces(tabを押した時のスペース)を設定
```json:Code/User/setting.json
    "[javascript]": {
        "editor.tabSize": 2,
        "editor.insertSpaces": true
    },
    "[javascriptreact]": {
        "editor.tabSize": 2,
        "editor.insertSpaces": true
    },
    "[typescriptreact]": {
        "editor.tabSize": 2,
        "editor.insertSpaces": true
    },
    "[typescript]": {
        "editor.tabSize": 2,
        "editor.insertSpaces": true
    },
    "[php]": {
        "editor.tabSize": 4,
        "editor.insertSpaces": true
    },
    "[ruby]": {
        "editor.tabSize": 4,
        "editor.insertSpaces": true
    }
```

## 4.まとめ
言語ごとにインデントを設定することで、RubyやPHP、TypeScriptやJavaScriptなど、それぞれの言語のインデント幅を簡単に管理できます。VSCodeの設定を変更することで、言語ごとのプラグインを追加せずにインデントを追加することができ、効率的な開発が可能となります。
ReactでHelloWorldプログラムを実装してみた

# 概要
ReactでHelloWorldを表示するプログラムを実装してみました。
以下のページを参考にしました。
https://www.techpit.jp/courses/48/curriculums/51/sections/426/parts/1454
https://www.suzu6.net/posts/128-ubuntu-yarn-error/

# 環境構築
```
sudo apt install yarn
```
だと
```
$ yarn add react react-dom
00h00m00s 0/0: : ERROR: [Errno 2] No such file or directory: 'add'
```
というエラーが出てreactをインストールできなかったので以下のコマンドでyarnを入れ直しました。
```
$ sudo apt remove cmdtest
$ sudo apt remove yarn
$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
$ sudo apt update
$ sudo apt install yarn
```
ここまでできるとyarnが動きました。警告が出ていましたが今回はとりあえず動かすことが目的なので無視しました。
以下のコマンドでreactとreact-domをインストールしました。
```
$ yarn add react react-dom
```
parcelというツールもインストールしました。
```
$ yarn global add parcel-bundler
```

# ソースコード
JSONは以下の通り。
```package.json
{
    "name": "react-music-app",
    "version": "1.0.0",
    "main": "index.js",
    "license": "MIT",
    "scripts": {
	"dev": "parcel src/index.html -d dist",
	"build": "parcel build src/index.html -d dist"
    },
    "dependencies": {
	"parcel": "^1.12.3",
	"react": "^18.2.0",
	"react-dom": "^18.2.0"
    }
}
```
HTMLは以下の通り。
```src/index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>music app</title>
  </head>
  <body>
    <div id="app"></div>
    <script src="./index.js"></script>
  </body>
</html>
```
JavaScriptは以下の通り。
```src/index.js
import React from "react";
import { hydrate } from "react-dom";
import App from "./components/App";

hydrate(<App />, document.getElementById("app"));
```

# 実行
以下のコマンドを実行しました。
```
$ yarn dev
yarn run v1.22.19
$ parcel src/index.html -d dist
Server running at http://localhost:1234 
✨  Built in 3.79s.
```
ブラウザで上記のURLを開くと以下の通りHelloWorldと表示されていました。
![Screenshot from 2023-05-07 09-37-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/e659bafb-e13c-3f73-10aa-d4e58ba774ff.png)

何かの役に立てばと。
.gitignore に .env ファイルを追加しても反映されない問題の解決方法

## はじめに

.gitignore ファイルに.envファイルを追加しても反映されない現象を3回経験したので、
備忘録として簡単にまとめました。

この問題は、Gitのキャッシュが原因であることが多く、
元々 .env ファイルを Git のバージョン管理対象項目に設定していた際によく起こります。

## 解決策


次のコマンドを実行してキャッシュを削除することで、
.envファイルがバージョン管理から除外されるようになります。



```
git rm --cached .env
```

自身の場合、毎回これで動作するようになりました！✨
今回は以上です。
Matplotlib入門【データ分析ライブラリ三種の神器③】


## はじめに
データ分析ライブラリ三種の神器である「Numpy」「Pandas」「Matplotlib」についての入門記事です。[ソースコードはこちら](https://github.com/Isaka-code/data_analysis_three_library)

[Numpy入門【データ分析ライブラリ三種の神器①】](https://qiita.com/Isaka-code/items/bafda2c42f0b6211da9d)
[Pandas入門【データ分析ライブラリ三種の神器②】](https://qiita.com/Isaka-code/items/fa99547c4b697a5c4697)
[Matplotlib入門【データ分析ライブラリ三種の神器③】](https://qiita.com/Isaka-code/items/c371b76ca337ceb10df9)

Matplotlibは、Pythonのデータ可視化ライブラリであり、グラフやチャートを描画するために広く使われています。この記事では、Matplotlibの基本的な使い方を紹介します。

## 1. インストールとインポート

まずは、Matplotlibをインストールします。以下のコマンドを実行してください。

```bash
pip install matplotlib
```

次に、Matplotlibの`pyplot`モジュールをインポートします。慣習的に`plt`という名前でインポートされます。

```python
import matplotlib.pyplot as plt
```

## 2. 基本的なグラフの描画

### 2.1 折れ線グラフ

```python
import numpy as np

x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.plot(x, y)
plt.show()
```

### 2.2 散布図

```python
x = np.random.rand(50)
y = np.random.rand(50)

plt.scatter(x, y)
plt.show()
```

### 2.3 ヒストグラム

```python
data = np.random.randn(1000)

plt.hist(data, bins=30)
plt.show()
```

## 3. グラフのカスタマイズ

### 3.1 タイトルと軸ラベル

```python
x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.plot(x, y)
plt.title('Sine Wave')
plt.xlabel('x-axis')
plt.ylabel('y-axis')
plt.show()
```

### 3.2 グリッドの表示

```python
x = np.linspace(0, 10, 100)
y = np.sin(x)

plt.plot(x, y)
plt.grid()
plt.show()
```

### 3.3 凡例の追加

```python
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
plt.legend()
plt.show()
```

## 4. 複数のグラフを描画する

### 4.1 サブプロット

```python
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

fig, axes = plt.subplots(nrows=2, ncols=1)

axes[0].plot(x, y1)
axes[0].set_title('sin(x)')

axes[1].plot(x, y2)
axes[1].set_title('cos(x)')

plt.tight_layout()
plt.show()
```

これで、Matplotlibの基本的な使い方を一通り紹介しました。実際のデータ解析では、これらの機能を組み合わせてデータを可視化します。Matplotlibは非常に柔軟で強力なライブラリであるため、ぜひ活用してみてください。

[Numpy入門【データ分析ライブラリ三種の神器①】](https://qiita.com/Isaka-code/items/bafda2c42f0b6211da9d)
[Pandas入門【データ分析ライブラリ三種の神器②】](https://qiita.com/Isaka-code/items/fa99547c4b697a5c4697)
[Matplotlib入門【データ分析ライブラリ三種の神器③】](https://qiita.com/Isaka-code/items/c371b76ca337ceb10df9)
Numpy入門【データ分析ライブラリ三種の神器①】


## はじめに
データ分析ライブラリ三種の神器である「Numpy」「Pandas」「Matplotlib」についての入門記事です。[ソースコードはこちら](https://github.com/Isaka-code/data_analysis_three_library)

[Numpy入門【データ分析ライブラリ三種の神器①】](https://qiita.com/Isaka-code/items/bafda2c42f0b6211da9d)
[Pandas入門【データ分析ライブラリ三種の神器②】](https://qiita.com/Isaka-code/items/fa99547c4b697a5c4697)
[Matplotlib入門【データ分析ライブラリ三種の神器③】](https://qiita.com/Isaka-code/items/c371b76ca337ceb10df9)


NumPyは、Pythonで数値計算を効率的に行うためのライブラリです。この記事では、NumPyの基本的な使い方やデータ処理方法を紹介します。


## 1. インストールとインポート
NumPyをインストールするには、次のコマンドを実行します。

```bash
pip install numpy
```

## 2. 配列の作成
NumPyを使用するには、まず`numpy`モジュールをインポートします。慣例として、`numpy`を`np`という別名でインポートします。

```python
import numpy as np
```

### 2.1 1次元配列
1次元配列は、次のように`numpy.array`関数にリストを渡すことで作成できます。

```python
arr = np.array([1, 2, 3, 4, 5])
```

### 2.2 2次元配列
2次元配列は、リストのリストを渡すことで作成できます。

```python
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
```

## 3. 配列の操作
### 3.1 配列の形状
配列の形状は、`shape`属性で取得できます。

```python
arr = np.array([[1, 2, 3], [4, 5, 6]])
arr.shape
-> (2, 3)
```

### 3.2 配列のリシェイプ
配列の形状を変更するには、`reshape`メソッドを使用します。

```python
arr = np.array([1, 2, 3, 4, 5, 6])
arr.reshape(2, 3)
-> array([[1, 2, 3],
           [4, 5, 6]])
```

## 4. 数学的演算
### 4.1 要素ごとの加算
2つの配列を要素ごとに加算するには、`+`演算子を使用します。

```python
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
a + b
-> array([5, 7, 9])
```

### 4.2 要素ごとの乗算
2つの配列を要素ごとに乗算するには、`*`演算子を使用します。

```python
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
a * b
-> array([ 4, 10, 18])
```

## 5. 統計関数
### 5.1 平均値
配列の平均値を計算するには、`numpy.mean`関数を使用します。

```python
arr = np.array([1, 2, 3, 4, 5])
np.mean(arr)
-> 3.0
```

### 5.2 分散
配列の分散を計算するには、`numpy.var`関数を使用します。

```python
arr = np.array([1, 2, 3, 4, 5])
np.var(arr)
-> 2.0
```

## 6. 線形代数
### 6.1 行列の積
2つの行列の積を計算するには、`numpy.dot`関数を使用します。

```python
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
np.dot(a, b)
-> array([[19, 22],
          [43, 50]])
```

### 6.2 逆行列
行列の逆行列を計算するには、`numpy.linalg.inv`関数を使用します。

```python
a = np.array([[1, 2], [3, 4]])
np.linalg.inv(a)
-> array([[-2. ,  1. ],
          [ 1.5, -0.5]])
```

## 7. まとめ
この記事では、NumPyの基本的な使い方とデータ処理方法を紹介しました。NumPyはPythonで数値計算を効率的に行うためのライブラリであり、様々な科学技術計算やデータ解析に応用されています。ぜひ、この記事を参考にNumPyを活用してみてください。

[Numpy入門【データ分析ライブラリ三種の神器①】](https://qiita.com/Isaka-code/items/bafda2c42f0b6211da9d)
[Pandas入門【データ分析ライブラリ三種の神器②】](https://qiita.com/Isaka-code/items/fa99547c4b697a5c4697)
[Matplotlib入門【データ分析ライブラリ三種の神器③】](https://qiita.com/Isaka-code/items/c371b76ca337ceb10df9)
【♪】TechTune #0007「GWも終わりファミコンとOpenSSLとCloudFormation」

<iframe width="560" height="425" src="https://www.youtube.com/embed/iSZlnxkmQ9s" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

このドキュメントは毎週土曜日に配信しているポッドキャスト「テックチューン」からピックアップしたトピックスです。

時代の傍観者、宴会部長、マカ―の生き残り、生きた化石のいしたんがお届けする、人生の吹き溜まりのラジオ番組「テックチューン」の時間です。テックチューンは最近話題のテクノロジーや私の身の回りで起こったこと、興味があることなどを剥き出しの感情でお話する番組です。

AWSやPHP/Python・Vue.JS, Cordova、バックエンドからフロントエンドからさらにはiOSスマホアプリ開発までソフトウェアエンジニアのいしたんが実務現場からお届けするこってこての技術番組「テックチューン」。
特に目標もなく無気力に続けていきたいと思いますので、お付き合いいただけますと幸いです。

GWが終わります。
プロジェクト並行化

・AWS の CloudFormation でなんでもつくっちゃうよ
CloudFormation で作成すると隠れたサービスなども全削除することができる
CloudFormation で CloudFront の設定を行う
CloudFront から S3 にアクセスする為に権限設定
WAFがコストを食っている
・OpenSSL のソースを読む
・ファミコンのプログラムを作成する

SHA3をGPUで並列処理を行うために OpenSSL のソースを読む（1）
https://qiita.com/ishitan/items/e05457c633b059917d55

ファミコンのプログラムを作ってみる
https://qiita.com/ishitan/items/7ded38839698d6a385a7

cc65 
https://cc65.github.io/
40代おっさんエンジニア、AWS DVA約1週間で取れました

#受験記録

【要約】
・AWS経験ほぼ無し、40代インフラエンジニア
・SAA-C03 3ヵ月で合格(4月)　→　その勢いでDVAに挑戦、合格(5月)
・次は、SAPを予定

０）本人の経験と、動機
【経験】
・40代、おっさんインフラ系エンジニア十年程度。DBとインフラ構築中心。
・AWSは経験少ない、提案書作成とか。
・CI/CDなどは多少あり、プライベートクラウド経験はあり。
・応用情報処理、Oracleマスターなどクラウド以外の資格は多少。あと簿記とかw
【動機】
・SAAを取得したので、ついでにDVAも。
・再受験無料キャンペーン（グローバル～5/31??）もあるし…。

１) 参考書、ツール
<a href="https://www.amazon.co.jp/gp/product/4798063401/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1">ポケットスタディ AWS認定 デベロッパーアソシエイト</a>
Udemy AWS 認定デベロッパー アソシエイト模擬試験問題集
AWS WEB問題集で学習しよう
<a href="https://www.studyplus.jp/">Studyplus </a>学習記録用
グーグルスプレッドシート 進捗管理
【費用】
参考書・問題集など、9,000円位
受験費用、15,000円(前回取得の半額チケットは、保留。）
色々、買ってしまったけど、短期間で取得出来たから、良しとしましょう。

２）学習期間、総学習時間、学習プラン
・約1週間、21時間。
  i) 読込み期 <B>1カ月(SAA) →1～2日(DVA)</b>　ポケスタを軽く見る。
　 　→ 不明な単語・用語が無いように確認。
  ii) 演習期(in-out) <B>2カ月(SAA)→7日(DVA)</b> WEB問題集 ＋ Udemy

【学習方針】
・１回40～80問位を問いて、日時と正答数、問題数をスプレッドシートに記載
・序盤：問題集を約1周して正答率50%近かったら、終わり。
・中盤：正答率75%辺りを目指す。出来たら仕上げ
・仕上げ：Web問題85%目安に。Udemyの正解率は参考程度で気にしない。
![chart (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2591840/dcf4fa46-713f-c955-c3d0-81b47e3be189.png) 
Web問題集を解こう。の正答率
|期間 |量(毎日当り)|正答率 | 周回 | コメント |
|:-:|:-:|:-:|:-:|:-:|
|4日|100-150問|30～60%|1+0.5周(*1)|出題側が何を問いてるか把握。無い用語を除外|
|2日|250-300問(*2)|69～83%|1+0.25周|やればやる程、正答率が落ちる。オーバーワーク？   |
|1.5日|300問|92.3-78.5%|1周|追込み。模擬x4と、Udemy模擬x2回分|

(*1)問題を解いて1周後、不正解のみやり直す(0.5周)。
(*2)Web問題を～を200-250+Udemy模擬x1。グラフにはUdemyはプロットしてない。

 
３）結果
  再試験無料キャンペーンのグローバルで申し込みして、試験受験し、
  １回で合格　スコア789

４）振返り
　・他の方の「１週間で取れました」シリーズを踏襲して、一応イケた感じ。
　　（SAA取った後なので、本読み省略。Web問題２周して、Udemy１周）
　・使う問題集に寄っては、個別の正答数、正答率が無いケースもあるので、スプシでグラフ化推奨
　・記録を付けて、適量なペースで学習しましょうW
　・GW中に決着したくて、中盤以降に追い込み過ぎた。中盤以降は記載よりも2～3日余裕持つ方が良い
　・次はSAPを2～3ヵ月位で取得したいな。
自分の作ったソフトウエア(2023/4)

自分が作ったプログラムなどのリストです。忘れてるものも有ると思います。

* 猫のお留守番

MacOS Xのオーディオ録音用のアプリです。XCodeで作りました。フリーウエアでオープンソースにはしていません。FMエアチェック用に作りました。Coreの部分はAppleのサンプルコードです。MacOS X 10.6で作ったので、古いMacでしか動きません。Vectorにおいてあります。

* アルアジロのお使い

MacOS Xのアプリで赤外線リモコンの制御ができます。こちらはオープンソースにしています。猫のお留守番とAppleScriptで連携して使っています。猫のお留守番よりこちらの方が先にあったと思います。この頃は動物の名前でアプリを作っていました。

* macamデバイスサポート

MacOS Xのウエブカムのアプリのmacamにデバイスサポートを追加しました。macamプロジェクトがまだアクティブだった頃にOV511のサポートを作ってマージしてもらいました。プロジェクトのメンバーに入れてもらったのですが、プロジェクトが休止状態なので、githubにforkを作っています。これにはNTSCのキャプチャデバイスのサポートをいくつか入ってます。

* MPEGエンコーダーHack

USB MPEGエンコーダーでNTSCをファイルに落とせるようにしました。MacOS XのIOUSBとlibusbで作りました。けっこう長い事、うまくいかなくて、ときどき思いついて試しているうちに、動きました。USBは偉大だと思います。ConextantもモジュールがターゲットだったのですがBroadcomのものもいじりました。

* ZRouter.orgいじり

FreeBSDのビルドシステムのZRouter.orgがHeadのコードでビルドできるようにetherswitchサポートの取り込みやFDT対応、portsもどきのサポートなどいろいろいじりました。rerootを使ってオンラインでflashをupdateする仕組みも作りました。mipsモジュールがターゲットでFreeBSD/mipsは13Rでclangになって動かなくなったので、12-STABLEが最終ターゲットです。

* mruby on YABM

mrubyのベアーメタルポートです。最初にRealtekのmips系のsocに乗せて、その後mips系のBroadcom,Admtekとarm系のKedinにも乗せました。これらのSOCはアーキテクチャが特殊だったり、ターゲットのメモリが小さくてFreeBSDをポートしても使い物にならないので、mrubyで使うことにしました。ブートローダーの取り扱いなどZRouterのノウハウがつぎ込まれています。

* etherswitchデバイス対応

FreeBSDのetherswitchにAdamtekのswitchなどいくつかの製品のサポートコードを書きました。最初にRealtekのRTL8366SRのサポートも追加したのですが、なぜか動かなくなっています。

* FreeBSDいろいろ

sys/mips/mediatekのgpio_v1をgpioppsに対応しました。我が家のGPS NTP ST1はこれで動いています。PPSはシリアル制御線で取り込む方法もありますが、GPIOの方が分かりやすいと思います。

sys/mips/atherosのpcmドライバを書きました。mpg123でネットラジオを聞くのに使っていて気に入っています。

i386ですが、pcmciaのカードをつかってscsiデバイスを実現するesp-targも作りました。PC-9801のSCSIドライブとしてFreeBSDのファイルが見えます。

他にも細かい修正をいろいろ作ったと思います。

* おうちモニター

ZRouterで作っているおうちの電力,NTP,ネットワーク,気象の情報をブラウザで表示する仕組みです。sqlite3,mrubyやJSを使っています。

* Onion Omegaデモ

ロシアの友人にもらったOnion Omegaに小型液晶を付けて持ち歩いてデモしています。ZRouterでビルドしてmrubyでcairoなどを使って処理しています。

* galprog

GALのプログラマーです。GALは古いものなのでパラレルポートを使ったライターがほとんどですが、USBのFT2232で書き込めるようにしました。FTDIの純正ライブラリを使っているので、MacとWinでしかビルドできません。

* JJYS

JJYをAVRでデコードしてNTPDに食わせられるようにしました。SEIKOの製品のクローンです。最初はシチズンの仕様でATTINY85で作ったのですが、いろいろ試してArudinoでSEIKOの仕様になりました。おそらく頑張ればもっと精度出せそうですが、自分ではもうこれでいいかなと思っています。

* マイコンいろいろ

自分の初めてのマイコンのEX-80を復活させFTDIのビットバングを使ったダウンロードツールを用意しました。最近のマイコンもいろいろいじりました。

＊ CHOS

PC-8001にUSBメモリを接続してファイルの読み書きが出来るようにしました。

* NetBSDのarmポート

Comcerto 1000(ARM1136J)のポートを書きました。ターゲットはやわらか銀行のVOIPルーターです。当初FreeBSDを試していたのですが、FreeBSD/armのコードが不安定なのでNetBSDで使えるようにしました。まだいじりたいのですが、ターゲットが1台しかなくirssiで使っているので、開発が出来ません。NetBSDがFreeBSDでビルドできることや、インストーラーが良くできているので良いです。他にもNetBSD/armはいじっています。FreeBSDの古いarmのサポートは壊れています。

これらは個人的にやっていることで、昔は仕事でソフトウエア系の事をしていたのですが、仕事でやってたことは、ほとんど残っていません。
NPSPの入力規則


# NPSP 家計取引先モデルの取引先名フィールドが空のままであることを確認するための新しい連絡先を作成するときの検証ルール

+ [Validation rule when creating new contacts to ensure the Account name field is leave empty for NPSP Household account model](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PeWpU)

Accountは自動でセットされるので、ブランクにはならないみたいだけど。
結局Accounｔのレコードタイプが目的のものになっているかで判断したらしい

```
AND(ISNEW(),NOT( Account.RecordType.DeveloperName = "HH_Account")) 
```