OmniAICreator/Qiita-1.07M huggingface dataset:
【初心者】データベースのテーブル分けについて考察してみる part1

皆さんはデータベースのカラムは
どのように設定していますか？

ログイン履歴のテーブルがあったとして
userAgent というカラムがあったとすれば

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0

といった同じ要素が際限なく増える事があるため
userAgent 用のテーブルを
作ることがあるかもしれません。

同じ人が同じブラウザでアクセスした場合
userAgent が同じになる可能性が高いため
テーブル分けは非常に効率的と言えます。

A さんと B さんの userAgent が
同じになる可能性もそれなりにあると思われます。

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0

の id を 1 としておけば
ログイン履歴の userAgent のカラムは
1 を登録するだけで済みます。
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3752886/f964a32c-3c4f-30a7-294d-e80a8aa8ab99.png)

今回はどういった場合に
テーブルを分けるのか
考察してみたいと思います。

ちなみに
ログイン履歴テーブルの userAgent カラムは
[irohaboard](https://irohaboard.irohasoft.jp/)_v0.10.10 で見かけたため
記事にしやすいと思い
拝借しました。

開発者の方には大変感謝致します。

***

冒頭の状況を分けるかどうか

はじめに冒頭の状況で
テーブルを分けるかどうかについて
検討してみたいと思います。

userAgent 自体が
現在は非推奨かもしれませんが
今回の考察には適しているため
お付き合い頂けると幸いです。

テーブルを分けるかどうかを考察する場合
・分けたテーブルの検索時間
・テーブルを分けた結果どの程度容量が削減するか
に焦点が当たると思います。

userAgent をテーブル化した場合
userAgent テーブルは
少なくとも 推定ユーザー数 × 3 件以上
登録される事を想定したいです。

なので 10 万人のユーザーがいるシステムの場合
userAgent テーブルの参照は
30 万のデータを検索する必要がある事になります。

しかしながら同じ userAgent が
平均 20 個登録されるならば
テーブルを分けない場合
userAgent を 600 万個べた書きする事になります。
userAgent の文字数が 100 文字とすると
6 億文字の容量が増える事になります。
userAgent だけで 600 MB も
容量を消費するのです。

テーブルを分けた場合は
30MB 程度で済むため
かなりの容量削減と
言えるのではないでしょうか

570 MB の容量を削減する事と
30 万件のデータを検索する事の
どちらが高速化に繋がるかを
考える事になると思います。

今回のケースは
570MB の容量が増えた場合は
データベースの検索に
時間がかかることが予測されます。

なので今回は 30 万件のデータを検索する方を
選択した方が良いと思います。
つまりテーブルを分ける方です。

***

前述のテーブルを分ける場合の工夫

前述のテーブルを分ける場合
userAgent テーブルに
データを挿入する条件として

ログイン履歴テーブルに同じ userAgent が登録される場合

を設定するといいと思います。

userAgent カラムが
32 など数値の場合は
userAgent テーブルを参照し
数値でない場合は
そのものを参照するといいと思います。

重複した userAgent を
登録する場合に初めて
userAgent テーブルに
追加するのです。

そうする事で
より無駄が無くなると思います。

***

まとめ

今回は冒頭の状況の
テーブル分けについて考察してみました。

同じ文字列が
何度も登録される場合は
テーブルを分ける事がありますので
その時に参考にして頂けると幸いです。

今回の結論は
「同じ長い文字列が何度も登録される場合はテーブルを分ける」
という結果になりました。

いずれは他のシチュエーションを考えて
データベースのテーブルについて
考察してみたいと思います。

閲覧ありがとうございました。
TodoistとFantasticalとRaycastで連携させてタスク管理を快適にしたいんだ

# 前書き

こんにちはatomです。私はタスク管理が苦手です。
<br>
最初は張り切って計画するものの、
忙しくなってくるとだんだん処理が追いつかないタスクが増える
→それが先延ばしになると、期限切れタスクが増える。
→ごちゃごちゃしてきて管理する気持ちが落ち込む。
→ああーーーー
というわけでだらだら先伸ばされていく感じ。
特に仕事系のタスクに比べて、勉強とか生活に関するタスクは優先度が下がりがちなのでこの傾向にあります。

この状況に対して二つのことを守って管理をできるようにしようと考えました。
<br>
### 1\.　すこしでもやったらタスクをこなしたことにする。
先日こちらの記事を読んで、勉強になったので実践してます。
簡単に言うと、やるまでの心理ハードルが高いのですこしでもやればOKとすることで先送り癖を無くします。

https://paiza.hatenablog.com/entry/2024/04/03/140000#%E3%81%AA%E3%81%9C%E3%82%BF%E3%82%B9%E3%82%AF%E7%AE%A1%E7%90%86%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B


### 2\.　タスク確認の手間をできるだけ減らす。
この記事のポイントはこっちです。
タスクリストをかわいがってるうちはちゃんとタスク処理ができるのですが、ごちゃごちゃしてくると見るのも嫌になってくるのが負のサイクルを生んでると思ったので、TodoistとFantasticalとRaycastを使って手間なく頻繁に確認できるようにします。

# 対象者

タスク管理してるとごちゃってやる気無くす人
Raycastはmacの人向け。

# 本編

## Todoistの設定
こちらからまずはダウンロードしてインストールします。インストールの時にサインアップが求められますが自分はgoogleのアカウントを使ってやりました。

https://todoist.com/ja

TodoistはWeb版でも使えますが今回はデスクトップ版で話を進めます。
このアプリは"毎日"みたいなワードに反応して繰り返しタスクを作ってくれる点と、iOS版も提供されててMacとiPhoneとiPadで同じ使い心地である点が気に入って使ってます。


## Fantasticalのインストール
こちらからダウンロードして、インストールします。

https://flexibits.com/jp/fantastical

終わったらアプリを開き、「設定」→「アカウント」とすすみます。
アカウントの追加(図の黄色い丸)をクリックして、Todoistを選択します。
これでTodoistに追加したタスクがFantasticalに表示されるようになります。

![設定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775726/7d309409-c422-1fd4-5ac1-0236b7617a40.jpeg)


### これがいいところ
Todoistで設定したタスクが表示され、その左側にはチェックマークが出るようになります。
![スクリーンショット 2024-05-24 13.38.56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775726/4a692079-3a7a-4bb7-1475-6f49387e9d4b.jpeg)
こんな感じ。


ここからもタスクを完了にすることができて、Fantasticalで完了済みにしたタスクはちゃんとTodoistにも反映されます！！


## Raycastの設定

ここからはRaycastを使っている人に向けた話なのですが、TodoistとFantasticalをホットキー設定して呼び出しの手間を省きます。
Raycastを呼び出し(デフォだとoption + Space)、"extensions"と入力します。

![extensions](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775726/79f53b56-0087-9641-4b5b-6550e9a5d223.jpeg)

Extensionsを開くと、All、commands。。と続きますが、その中のAppsを選択してホットキーを設定します。
下はTodoistに対して設定した例。
![Todoistの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775726/2ea3572d-1a12-9829-721e-3ba659448868.jpeg)

これで、タスク管理したい時にoption + Tで爆速でTodoistを呼び出してタスク管理をして、週単位でスケジュールを管理したい時にはFantasticalからタスクを確認、削除ができるようになります。

# まとめ

タスク周りのツールを使いやすくして、モチベが下がってほったらかされるタスクがなくなりました。
めでたしめでたし。
抽象クラスとその使い方 - TypeScript

## はじめに
抽象クラスは、オブジェクト指向プログラミングにおいて重要な概念です。特定のプログラミング言語では、抽象メソッドを持たない抽象クラスを定義することが許可されていることがあります。これによって、他のプログラマに対して「このクラスは親クラスであり、直接インスタンス化せずにサブクラス化して使うべきだ」というシグナルを送ることができます。

## 抽象クラスとは？

抽象クラスは、他のクラスが継承するための基底クラス（親クラス）です。抽象クラス自体は直接インスタンス化できません。これにより、コードの構造を明確にし、共通の機能を再利用するための基盤を提供します。

## 抽象メソッドを持たない抽象クラス

抽象クラスは通常、少なくとも1つの抽象メソッド（実装のないメソッド）を持つことが多いですが、抽象メソッドを持たない抽象クラスを定義することも可能です。この場合、抽象クラスは他のクラスに継承されることを意図していることを示します。

## 例：動物クラスの階層

以下に、動物クラスの階層を示します。この例では、`Animal` クラスを抽象クラスとして定義し、`Dog` と `Cat` クラスがそれを継承します。

```typescript
// 抽象クラス Animal
abstract class Animal {
    protected name: string;

    constructor(name: string) {
        this.name = name;
    }

    public getName(): string {
        return this.name;
    }

    // 動物の鳴き声を出すメソッド
    public makeSound(): void {
        console.log(`${this.name} is making a sound`);
    }
}

// 具象クラス Dog
class Dog extends Animal {
    constructor(name: string) {
        super(name);
    }

    // 犬特有の鳴き声
    public makeSound(): void {
        console.log(`${this.name} says: Woof!`);
    }
}

// 具象クラス Cat
class Cat extends Animal {
    constructor(name: string) {
        super(name);
    }

    // 猫特有の鳴き声
    public makeSound(): void {
        console.log(`${this.name} says: Meow!`);
    }
}

// メイン処理
const dog: Animal = new Dog("Buddy");
dog.makeSound(); // Buddy says: Woof!

const cat: Animal = new Cat("Whiskers");
cat.makeSound(); // Whiskers says: Meow!
```

### 解説

- **Animalクラス**は抽象クラスです。このクラスには抽象メソッドはありませんが、直接インスタンス化することはできません。これは、このクラスが他のクラスの基底クラスとして使用されるべきことを示しています。
- **Dogクラス**と**Catクラス**は、**Animalクラス**を継承しています。それぞれのクラスは、動物特有の鳴き声を実装しています。

## 抽象クラスのメリット

1. **設計の明確化**: 抽象クラスを使用することで、クラスの構造とその意図が明確になります。基底クラスとして使われることが明示され、コードの構造が分かりやすくなります。
2. **コードの再利用性**: 共通の機能を抽象クラスにまとめることで、サブクラスでその機能を再利用できます。
3. **安全性の向上**: 抽象クラスとして宣言することで、意図しないインスタンス化を防ぎます。

## まとめ

抽象メソッドを持たない抽象クラスを定義することで、他のプログラマに対して「このクラスは基底クラスとして使用されるべきで、直接使用してはいけない」というメッセージを伝えることができます。これにより、コードの構造が明確になり、設計の意図が伝わりやすくなります。抽象クラスを適切に使用することで、コードの再利用性と安全性を向上させることができます。
mysqlで特定のユーザのパスワード変更

* 下記コマンドを実行して、rootユーザーのパスワードを変更しようとしたら、
「権限がない」ってエラーになった

```
ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxxxxxx';
```
```
ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation
```

* 現在ログインしているユーザにSYSTEM_USER権限を付与した
```
SELECT Host, User FROM mysql.user;
+-----------+------------------+
| Host      | User             |
+-----------+------------------+
| %         | admin            |
| %         | root             |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+

GRANT SYSTEM_USER ON *.* TO 'admin'@'%';
Query OK, 0 rows affected (0.01 sec)
```
* 再度rootユーザーのパスワードを変更を実行　→　成功

```
ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxxxxxx';
```
```
Query OK, 0 rows affected (0.01 sec)
```
rex0220 計算式プラグイン テーブルの転記（ボタン版）

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)を使って、ボタンクリック時にテーブルAからテーブルBに転記してみます。

# 概要

[rex0220 計算式プラグイン テーブルの転記](https://qiita.com/rex0220/items/2b2cc7108750ac86ee03)のボタン版です。
「テーブルコピー」ボタンクリックで、テーブルA の対象に"チェック" された行をテーブルBに転記します。

![2024-05-24_12h53_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/028628aa-88cd-72d9-ce75-74a9233ee190.png)

# 操作例

![2024-05-24_13h00_03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/21254a68-88bb-2803-043e-203965edf663.gif)

# アプリ設定

スペース項目を配置して、要素IDを指定します。

![2024-05-24_14h22_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/fb2f6230-e01c-5703-f039-8446892b7bab.png)


# 計算式プラグイン設定

スペース項目に、ボタン設定を指定します。
FSET 関数で、ボタンクリック時のテーブル設定を行います。

![2024-05-24_12h56_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/c44d5e68-4401-f30c-58c9-7131e4d80d69.png)

```.js
// table_copy:(table_copy) SPACER
DIALOG(
  ARRAY("テーブルコピー","テーブルA -> テーブルB"),
  FSET(テーブルB,
    CSV_TVAL(
      OTCSV(テーブルA,
        TPFILTER(IN(対象,"チェック")),
        TPOUT(区分A,ユーザー選択A),
        TPLABEL("区分B","ユーザー選択B")
      )
    )
  )
)

// table_clear:(table_clear) SPACER
DIALOG(
  "テーブルBクリア",
  FSET(テーブルB,ARRAY("","[]"))
)

// テーブルB SUBTABLE
// テーブルB.区分B DROP_DOWN
// テーブルB.ユーザー選択B USER_SELECT
```
FreeBSD14 Ports Update

FreeBSD14だとportsnapとか無さそうなのでメモ

# 前提
* FreeBSD14.0 の VPSサーバ
* まだ Ports Update をしてない状態

# Git をインストール

```
% su
# cd /usr/ports/devel/git
# make install clean
```

# Portsツリーを新しい場所にもってくる
* 最初の1回だけ実行
* 同じ場所だとうまくいかんかった

```
# git clone https://git.FreeBSD.org/ports.git /var/ports
```

# Portsツリーを更新
* 次回以降はこのコマンドのみでよい

```
# git -C /var/ports pull
```

# Ports index の作成

```
# cd /var/ports
# make fetchindex
```
逆フェルマーの最終定理

　$3$ 以上の正の整数 $x,y,z,n$ において、

```math
x^n + y^n = z^n
```

　を満たす整数 $x,y,z,n$ は存在しない。これをフェルマーの最終定理と呼ぶ……のはもはや有名すぎる事実だが、以下のことが気になる。

 　これが、$n$ が**すべての整数**ならばどうなのか？

　具体的にいうと、通常の場合に加えて、$n$ が $2$ 以下の場合について考えていくので、これを **逆フェルマーの最終定理** と呼ぶことにする。

# n=2 のとき

```math
x^2+y^2=z^2
```

　これはピタゴラス数と呼ばれるものになり、ピタゴラス数は無数に存在することが知られている。

　具体的には、適当な $m,n$ を定めた時に

```math
\displaylines{
x = m^2 - n^2 \\
y = 2mn \\
z = m^2 + n^2 \\
}
```

　なる $x,y,z$ は上の式を満たすことが証明できる。よって、セクション冒頭の式を満たす $x,y,z$ は無数に存在する。

# n=1 のとき

```math
x+y=z
```

　これはほぼ自明だ。適当な $x,y$ を定めた時に、$x+y$ を $z$ とすれば当然に上の式を満たす。よって、これを満たす $x,y,z$ は無数に存在する。

# n=0 のとき
```math
x^0 + y^0 = z^0
```
　あらゆる正の整数の $0$ 乗は $1$ になり、$1+1=1$ は成り立たない。よって、これを満たす $x,y,z$ は存在しない。

# n=-1 のとき

```math
\frac{1}{x}+\frac{1}{y}=\frac{1}{z}
```

　まず、$n=1$ の場合における

```math
X+Y=Z
```

　という式を考える。$X,Y,Z$ はいずれも正の整数であるので、その積である $XYZ$ も当然に正の整数である。よって両辺をこれで割ることにより、

```math
\displaylines{
\frac{1}{YZ}+\frac{1}{ZX}=\frac{1}{XY} \\
\frac{1}{Y(X+Y)}+\frac{1}{(X+Y)X} = \frac{1}{XY}
}
```

　が成り立つ。

　つまり、適当な $X,Y$ を定めた時に、

```math
\displaylines{
x = Y(X+Y) \\
y = (X+Y)X \\
z = XY
}
```

　はセクション冒頭の式を満たすため、これを満たす $x,y,z$ は無数に存在する。

# n=-2 のとき

```math
\frac{1}{x^2}+\frac{1}{y^2}=\frac{1}{z^2}
```

　これも、$n=-1$ の時とほぼ同様に考えることができる。あるピタゴラス数

```math
X^2+Y^2=Z^2
```

　を考える。この両辺を $(XYZ)^2$ で割ると、

```math
\frac{1}{(YZ)^2}+\frac{1}{(ZX)^2}=\frac{1}{(XY)^2}
```

　となり、あるピタゴラス数に対して、セクション冒頭の関係を満たす数の組み合わせ（逆ピタゴラス数とでも言うべきか）が存在し、それらが一対一対応していることがわかる。ピタゴラス数は無数に存在するので、当然これも無数に存在する。

# nが-3以下のとき

　便宜的に $m = -n$ と置き換えると、

 ```math
\frac{1}{x^m}+\frac{1}{y^m}=\frac{1}{z^m}
```

　を満たす正の整数組み合わせ $x,y,z$ を求める問題となる。

　この解が存在しないことを背理法により示す。まず、上の式が成り立つ $x,y,z$ が存在すると仮定する。

　両辺に $(xyz)^m$ をかけることにより以下の式を得る。

```math
(yz)^m + (zx)^m = (xy)^m
```

　このとき、$yz,zx,xy$ は当然に正の整数であり、また $m$ は $3$ 以上の整数である。しかし、フェルマーの最終定理により、$m$ が $3$ 以上の整数であるとき、このような $yz,zx,xy$ は存在しない。よって、仮定は誤りであり、セクション冒頭の式を満たす $x,y,z$ は存在しない。

# 結論

　正の整数 $x,y,z$ と整数 $n$ について、

```math
x^n+y^n=z^n
```

　を満たすものは

- $n \leq -3$ のとき、存在しない
- $n=-2$ のとき、無数に存在する
- $n=-1$ のとき、無数に存在する
- $n=0$ のとき、存在しない
- $n=1$ のとき、無数に存在する
- $n=2$ のとき、無数に存在する（ピタゴラス数）
- $n \geq 3$ のとき、存在しない（フェルマーの最終定理）
深層学習環境設定

# 深層学習を実行できる環境を作成する

### Linux
とりあえずGPUを使うにはLinuxのほうがいいらしいので．Windows11にLinuxをいれます．WSL2が簡単に導入できてとてもいい時代ですね．

ubuntuを入れようと思ってたけどkaliもインストール可能なのが嬉しい．

なおセットアップ時にwslのアップデートで引っかかったので次回以降は気を付けていきたい．

### python
Linuxにpythonを入れていく．将来を見据えてpyenvを活用したい．
生成AIパスポート試験一発合格のために、押さえておいてほしい３つの知恵

こんにちは、heppoko_engineer_minaraiです。
この記事は、自分が生成AIパスポート試験を受験後に書き留めた、覚書のメモです。
（なお、合格でした）

断っておきますが、メモなのでめっちゃ短いです。
ですが、正答率アップと、回答時間の短縮に役立つであろうエッセンスです。
(自分が受けた前回は、60問60分でした。一問一分です。そこそこ長い選択肢もあったので、時短が大事です。)

これから受験する方の一助になれば幸いです。
以下、本文です。

１，GANとVAEは、生成AIならば、種類（＝動画、画像、音楽等）を問わず、大抵使う、と考えてよさそう　
２，大文字の「T」を含むモデルは、大抵、Transformerモデルの派生ヴァージョン、と考えてよさそう　
３，RNNは、「連続した（＝シーケンス）データ（＝動画や音楽）を扱う場合は、大抵使う、と考えてよさそう（RNNの「R」を、「連続（Rennzoku）」の頭文字のRと組み合わせて覚えておくと良い）
Vision Pro + UnityでHello Cube（Unbounded）する

# 前提
1. visionOS用のセットアップが完了していること

https://qiita.com/afjk/items/74c35b254f31a0e3646b#ゼロからプロジェクトを作るには
        
2. play to deviceでunityとxcodeシュミレータを接続できていること

https://lilea.net/lab/apple-vision-pro-get-started-with-unity/#:~:text=visionOS%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC%20Play%20to%20Device%20%E3%81%AE%E8%A8%AD%E5%AE%9A


# デモ
<iframe width="560" height="315" src="https://www.youtube.com/embed/iz0fD39xvMI?si=xviZWUd2YBUi07pP" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>


# 検証環境

- Unity: 2022.3.24f1
- AR Foundation: 5.1.3
- XR Plugin Management: 4.4.1
- PolySpatial: 1.2.3

# 手順
### 1. Hierarchyで XR > Setup > VolumeCameraオブジェクトを作成する
![](https://storage.googleapis.com/zenn-user-upload/e1722adff8da-20240514.png)

### 2. Resourcesディレクトリで右クリック、Create > PolySpatial > Volume Camera Window Configurationを作成する
![](https://storage.googleapis.com/zenn-user-upload/411df2473596-20240514.png)

### 3. Volume Camera Window ConfigurationのModeをUnboundedにする
![](https://storage.googleapis.com/zenn-user-upload/a65510cfca17-20240514.png)

### 4.Volume Camera Window ConfigurationをVolumeCameraのVolume Camera(Script)コンポーネントにアタッチする
![](https://storage.googleapis.com/zenn-user-upload/80903e6895b8-20240514.png)

### 5. Hierarchyで XR > AR Sessionオブジェクトを作成する
![](https://storage.googleapis.com/zenn-user-upload/e978fda242d5-20240514.png)

### 6. Hierarchyで 3D Object > Cubeを作成する
![](https://storage.googleapis.com/zenn-user-upload/a597d424c431-20240514.png)

### 7. CubeにRect Transformコンポーネントをアタッチ
![](https://storage.googleapis.com/zenn-user-upload/19bb4338d562-20240514.png)
rex0220 項目絞り込みプラグイン テーブル内項目の絞り込み例

[項目絞り込みプラグイン](https://qiita.com/rex0220/items/f9c3acc40ffa68c43a0e)で、テーブル内項目の絞り込みを行います。

# 概要

[項目絞り込みプラグイン](https://qiita.com/rex0220/items/f9c3acc40ffa68c43a0e)は、他アプリのデータにより、ドロップダウンの選択肢を絞り込むプラグインです。

- 顧客のランク・会社名で、絞り込み
- テーブル内項目のサービスと商品名で、絞り込み

※仕切り率は、[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で顧客ランクから求めています。

![2024-05-24_10h18_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/19fdb4ab-4525-5f45-1866-bf37c57a2f41.png)

![2024-05-24_10h17_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/af08f808-b611-319d-f142-8e6d4a4282f7.png)

# 操作例

![2024-05-24_11h00_23.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/e0fa4b14-9b97-48f6-8ace-a999d802f5ce.gif)


# アプリ設定
顧客ランクなど選択肢が固定のものは、ドロップダウン。
会社名、サービス名、商品名、価格などは、文字列・数値で設定します。

![2024-05-24_10h20_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/8698320a-a169-a20d-685e-fa80ba0d509f.png)

# 参照アプリと一覧画面

項目絞り込みプラグインで参照するアプリに一覧画面を用意します。

顧客リスト
![2024-05-24_10h47_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9752d290-3bf3-5173-6653-de2efc2663cb.png)

商品リスト
![2024-05-24_10h49_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/e2fd97de-199c-e43f-6ab4-8e9908f6938e.png)

# 項目絞り込みプラグイン設定

顧客と商品の絞り込み設定を行います。
※フィールドコードは、あらかじめ項目名に合わせて設定したほうがいいです。

![2024-05-24_10h52_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/c5a3fc97-1aa3-e2e9-9e82-49fc5cd1859b.png)

顧客リストの設定
![2024-05-24_10h55_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a0497232-aeca-4aae-2ed1-f116a4bd7472.png)

商品リストの設定　サブテーブルを指定します。
![2024-05-24_10h56_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f5f25b02-582a-127a-10e7-8e101f74af3f.png)

# 計算式プラグイン設定

![2024-05-24_11h03_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9a0b2ef8-96ee-cedf-ac4f-7c6af1e00e01.png)

```.js
// 仕切り率 NUMBER
SWITCH(顧客ランク,
  "A",70,
  "B",80,
  "C",90,
  100 
)

// 合計金額 NUMBER
SUM(金額1)

// Table.仕切価格 NUMBER
INT(価格1*仕切り率/100)

// Table.金額1 NUMBER
仕切価格*数量1
```
【備忘録】"Unknown at rule @tailwind"を解消する（Tailwind CSS）

##  警告 / Warning
Tailwind CSSを導入すると「**Unknown at rule @tailwind**」という警告を受ける場合があります。
![スクリーンショット 2024-05-25 0.46.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676797/3cb35f4f-34d2-3302-0602-a4a7bedf3d75.png)

## 解消法
この警告はあくまでエディタ（VSCodeなど）が「**@tailwind**」を正しく認識できていないだけなので、解消しなくてもTailwind CSSは問題なく使用できます。

解消するには、**エディタに「PostCSS Language Support」という拡張機能を導入しましょう。**

https://marketplace.visualstudio.com/items?itemName=csstools.postcss

## 結果
警告は解消されました。
![スクリーンショット 2024-05-25 0.46.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3676797/40e6ff66-ee41-8e66-f7b9-c4a4d3c54d78.png)
エンジニアの皆さんへ、転職面接のコツ教えます！

「エンジニア転職の面接でうまく話せない！」、そんな悩みを抱えていませんか？実は多くのエンジニアが、同じく面接でうまく話せないという悩みを抱えています。なぜならエンジニアは技術力に自信を持っていても、面接での受け答えに慣れていないことが多いからです。

私も以前は転職活動で面接に何度も落ち、自信を失いかけた経験があります。しかし面接対策を徹底的に行って、自分なりのコツを見つけてから苦手意識がなくなり、自信を持って面接に臨むことができるようになりました。

この記事では私が実際に経験した失敗と成功から導き出した、**エンジニア転職の面接で好印象を与えるためのコツを紹介**します。この記事を読むと、以下のことを知れます。

- 面接で何を話せば良いのかが分かる
- 自信を持って面接に臨める
- 好印象を与えて、内定を獲得しやすくなる

[>> 履歴書の書き方はコチラ](https://taishi-official.com/2024/02/11/1644/)
[>> 職務経歴書の書き方はコチラ](https://taishi-official.com/2024/02/12/1648/)


<iframe width="560" height="315" src="https://www.youtube.com/embed/oxGGo6VfYa4?si=OBWY45hPV3qykAeA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## 転職活動における面接の重要性
転職活動において、面接は最も重要なステップの一つです。書類選考を通過して面接にたどり着いたとしても、そこで良い印象を与えられなければ、希望の企業に転職することはできません。面接官は主に、応募者の以下の点を確認しています。

- **スキル・経験**: 応募者が求めるスキルや経験を持っているかどうか
- **熱意・意欲**: 応募者が企業への熱意や意欲を持っているかどうか
- **人柄・コミュニケーション能力**: 応募者の人柄やコミュニケーション能力が企業に合っているかどうか

## エンジニア転職において重要な面接の事前準備

![5STEP-Preparation-for-Job-Interviews.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784196/9cd41a36-2c14-8438-f3d6-af4fcb882049.jpeg)


エンジニア転職において、**面接の事前準備が最も重要**だと言っても過言ではないほど大切です。そのため、ここの準備は念入りに行っていただきたいです。エンジニア転職に必要な面接準備は、以下の5STEPとなります。

1. **自己分析**
[>> 分析事項と分析方法はこちら](https://taishi-official.com/2024/02/16/1676/#toc3)
1. **企業・職種研究**
自己分析の内容が紐づく部分が、あなたにとって強烈なアピールポイント
1. **想定質問と回答の準備**
[>> エンジニア転職の想定質問を100連発で紹介！](https://taishi-official.com/2024/02/17/1688/)
1. **技術的な面接対策**
企業・職種研究で調べていただいた使っているプログラミング言語や技術をもとに面接対策
1. **模擬面接**
転職エージェントに模擬面接をお願いする[（おすすめ転職エージェントはこちら）](https://taishi-official.com/2023/12/08/1305/)

## 転職面接本番でのコツ

![5tips-for-job-interviews.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784196/ebe26753-9c0c-810e-f0c1-164ce85382f9.jpeg)


私は今までに転職活動を2回経験しましたし、SESでの案件参画のために数えきれないくらいに企業と面談をしてきました。その過程で得た、面接に使えるコツをについてご紹介します。面接でのコツは、以下の5点です。

- 自信を持つ
- 回答にエピソードや数値を絡める
- 論理的に話す
- できないときは代替案を言う
- 積極的に質問をする

[>> 各項目の詳細説明はココをご覧ください](https://taishi-official.com/2024/02/16/1676/#toc15)

## 転職面接後にやるべきこと

![What-to-do-after-job-interview.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784196/6def024b-5b21-6953-067b-2156a9ee3ea0.jpeg)

面接後は基本的に結果を待つだけですが、面接後にやる方がいいこともあります。ここでは、面接後にやったほうがいい2点について紹介します。

- 転職面接の振り返り
- 別の求人を探す

[>> 面接後にすべきことの詳細を知りたい方はココをクリック！](https://taishi-official.com/2024/02/16/1676/#toc22)

## まとめ
今回はエンジニアのための面接対策についてまとめました。転職面接は、事前準備が非常に重要です。面接本番は準備したものを披露するだけなので、準備は入念に行うようにすることで内定獲得が近づきます。

エンジニアの方は、特に面接が苦手な方が多いように感じます。今回紹介した面接のコツを使って、うまくアピールしていただけたらと思います。この記事が内定獲得にお役立ちできると嬉しいです:bangbang:

### おまけ

https://qiita.com/taishi_will_be/items/70a8ce8938944286b487

https://taishi-official.com/changing-engineer/

<br>

<strong>＼Follow me／</strong>

- X（旧Twitter）：https://x.com/taishi_it_blog
- Instagram：https://www.instagram.com/taishi_will_be/
- YouTube：https://www.youtube.com/@Engineer_ILLBE
- TikTok：https://www.tiktok.com/@taishi_will_be
- note：https://note.com/taishi_wii_be/

<br>

最後に良かったら「いいね」お願いします:thumbsup:
LongLoRA：大規模言語モデルのコンテキスト拡張を効率化する画期的手法

※ このページは「LONGLORA: EFFICIENT FINE-TUNING OF LONGCONTEXT LARGE LANGUAGE MODELS」の要約になります。

## このページでわかること
- LongLoRAは、事前学習された大規模言語モデル（LLM）のコンテキストサイズを効率的に拡張する手法
- Shifted Sparse Attention（S2-Attn）と改良されたLoRAを組み合わせることで、メモリと計算コストを削減しつつ高い性能を維持
- この手法は、標準的な自己注意メカニズムを推論時に保持し、既存のインフラとの互換性を確保しています。LongLoRAはLlama2モデルに対して強力な実証結果を示し、最大100kのコンテキストサイズまで拡張可能

## 対象読者
- 特に大規模言語モデル（LLM）の研究や開発に携わる研究者やエンジニア
- 効率的なモデルの微調整やコンテキスト拡張に関心がある人


## LLM のコンテキストサイズ拡張の問題点

1. **高い計算コスト**：
   - LLMを長いコンテキストサイズで訓練するには、計算コストが非常に高く、GPUリソースが大量に必要です。例えば、コンテキストサイズを8192に拡張するだけでも、2048の場合の16倍の計算コストが必要になる

2. **訓練時間の増加**：
   - 長いコンテキストサイズでの訓練は、訓練時間が大幅に増加するため、実際の訓練が非常に非効率です。従来の手法では、モデルの微調整に多くの時間がかかる

3. **リソースの限界**：
   - 大規模な計算リソース（例えば、数十から数百のGPUやTPU）が必要であり、これらは一般の研究者や小規模な研究グループには手が届きにくい

4. **性能の維持**：
   - コンテキストサイズを拡張する際に、性能（例えば、パープレキシティ）の低下を防ぎつつ、効率的な訓練方法を見つけることが難しいという問題がある

## LongLoRA
### LongLoRA とは？

LongLoRAは、事前学習されたLLMのコンテキストサイズを効率的に拡張するための微調整手法です。この手法は、計算コストを抑えながら長いコンテキストサイズを可能にするため、Shifted Sparse Attention（S2-Attn）と改良されたLow-Rank Adaptation（LoRA）を組み合わせています。

### LongLoRA のメリット
1. **効率的なコンテキスト拡張**：LongLoRAは、従来の方法に比べて少ない計算リソースで長いコンテキストサイズを実現
2. **計算コストの削減**：S2-Attnを使用することで、計算コストを大幅に削減しつつ、訓練時間を短縮する
3. **性能の維持**：従来のフルファインチューニングに匹敵する性能を保ちながら、リソース効率を向上させる
4. **互換性**：既存の最適化技術やインフラと互換性があり、既存のモデルや技術をそのまま使用できる

### LongLoRA の手順
1. **Shifted Sparse Attention（S2-Attn）の導入**：
   - トークンをグループに分け、各グループ内でのみ注意を計算することで計算コストを削減
   - 各グループの半分のトークンをシフトし、隣接するグループ間で情報の流れを確保
2. **改良されたLoRA（LoRA+）の使用**：
   - 通常のLoRAに加え、埋め込み層と正規化層を学習可能にすることで、長いコンテキストの拡張をサポート
3. **モデルの微調整**：
   - LongLoRAを使用して、事前学習されたLLMを特定のコンテキストサイズに拡張する
   - S2-Attnを使用して訓練中の計算コストを削減しつつ、推論時には標準の自己注意メカニズムを保持

### LongLoRA の性能
1. **コンテキストサイズの拡張**：
   - 例として、Llama2 7Bモデルを4kコンテキストから100kコンテキストまで拡張
2. **計算リソースの効率化**：
   - 従来のチューニングと比較し、リソース効率を大幅に向上
3. **性能評価**：
   - LongLoRAは従来のフルファインチューニングに匹敵するパープレキシティ（例：Llama2 7Bで8192トークンの場合、パープレキシティが2.66から2.52まで改善）

```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer  Full FT と LoRA と LongLoRA の比較\n(出典：LONGLORA: EFFICIENT FINE-TUNING OF LONGCONTEXT LARGE LANGUAGE MODELS)
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758571/9b570f10-0d0b-7da2-4738-62cb48dfd9fd.png>
@enduml
```

## まとめ
以上がLongLoRAの要約でした。低コストでコンテキストサイズを増やしたいシーンは結構あると思うので、知っておくとよさそうですね。

おわり。
デバイスファイルの名前

# デバイス名が変わる
マシンに同じタイプのデバイスを複数搭載している場合は、デバイスファイル名の扱いに注意する必要がある。
...
複数のデバイスが接続されている場合、カーネルは、```一定の規則に従って、それぞれ別の名前のデバイスに対応付け```ます。
...
注意点としては、この対応付けは```起動するたびに変わりうる```ということです。
...
2つのうちどちらが/dev/sdaになって、どちらが/dev/sdbになるかはデバイスの```認識順によって決まります```。

### 気づき
同じタイプのデイバスは規則に従って名前がつけられるからカーネルの認識順によって変わるのか。

ファイル名が変わるみたいな話だから大変そうだ。しかし変わるとどういうことが起きるのだろうか。
ファイル名が変わると内容も変わることになるので困ると思う。

# 具体的な問題
### 別ストレージデバイスの増設
ストレージCを足すと認識順がA→C→BになってBの名前は/dev/sdbから/dev/sdcに変わる
### ストレージデバイスの場所を入れ替える
AとBを挿す場所を入れ替えると、Aが/dev/sdbに、Bが/dev/sdaになる。
### ストレージデバイスが壊れて認識されなくなる
Aが壊れてBが/dev/sdaとして認識される

### 気づき
増設しても名前が変わるのか。

# udevがデータの危険を避ける
名前が変わってどうなるかというと、運が良ければブートしないくらいで済みますが、運が悪いとデータを破壊します。
...
このような問題は、systemdのudevにというプログラムが作る「persistent device name」という名前を利用することによって避けられます。
udevは起動時などにデバイスを認識するたびに、マシンに搭載されているデバイスの構成が変更しても変わらない、あるいは変わりにくいデバイス名を以下に自動で作ります。
persistent　device nameには、たとえば/dev/disk/by-path/ディレクトリ以下に存在する
```
vboxuser@*********::~$ ls -l /dev/sda
brw-rw---- 1 root disk 8, 0  5月 24 09:32 /dev/sda
vboxuser@l**********:~$ ls -l /dev/disk/by-path/acpi-VMBUS\:00-scsi-0\:0\:0\:0
root@************:************# ls -l /dev/disk/by-path
合計 0
...
lrwxrwxrwx 1 root root  9  5月 24 09:38 pci-0000:00:0d.0-ata-1 -> ../../sda
....
```
### 気づき
/dev/disk/by-path/以下にそれっぽい名前がありsdaを指している。

# ファイルシステムを間違えたくない
```マウントするファイルシステムを間違えたくない```という話であれば、mountコマンドにおけるラベル、UUIDの指定によって問題発生を防ぎます。
```
root@************:/*********# cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda5 during installation
UUID=9f8ea8db-01f4-4d19-b9e0-4a731cd178e4 /               ext4    errors=remount-ro 0       1
# /boot/efi was on /dev/sda1 during installation
UUID=395E-3827  /boot/efi       vfat    umask=0077      0       1
/swapfile                                 none            swap    sw              0       0
```
### 気づき
ファイルシステムとはなんだっけ？
ファイルシステムとデバイスシステムの繋がりがわからない

```
root@*********:***********# lsblk --fs /dev/sda
NAME FSTYPE LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINT
sda                                                                   
├─sda1
│    vfat         395E-3827                               511M     0% /boot/efi
├─sda2
│                                                                     
└─sda5
     ext4         9f8ea8db-01f4-4d19-b9e0-4a731cd178e4   12.4G    43% /
```
### 出典
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/managing_file_systems/adding-a-file-system-to-etc-fstab_assembly_persistently-mounting-file-systems#:~:text=%24%20lsblk%20%2D%2Dfs%20/dev/sda1
#### 気づき
/dev/sdaというデバイスファイルの下にsda１とsda５がありそれにUUidがついている。
デバイスファイルがファイルシステムをまとめているのか？

まだデバイスファイルに関して理解していない。

# 出典
https://gihyo.jp/book/2022/978-4-297-13148-7
# 感想
カーネルの認識順でデバイスファイルの名前が変わるのは大変だがそれらの問題を避けてくれるudvがあることを知れた。
herokuでデプロイするときにつまづいた話

自分がつまづいた部分は
1 Command "webpack" not found.
2　パッケージのバージョンのエラー
3 herokuでgit push heroku mainすると画像のデータが消える。Active strageにはデータとしては存在する

でした。





### Command "webpack" not found.の話

結論から言うとnode.jsを先にインストールしたら直りました。
バージョンの話が色々とネットには溢れていましたが自分の場合はすごく初歩的な問題でした。
けどこう言う問題も初心者のうちは気付けないから怖いですね。
この順番にインストールしてくれたらOKです。

[![Image from Gyazo](https://i.gyazo.com/655f0a0d5d0a7d87bbe16f8c8293bd6e.png)](https://gyazo.com/655f0a0d5d0a7d87bbe16f8c8293bd6e)

### パッケージのバージョンのエラー

## 環境
ruby:3.2.2
rails:7.0.8
node.js:18.19.0

この環境では以下のバージョンにしないとエラーが出ました。

"bootstrap": "^4"
"date-fns": "^2.0.0"

```
@import '@fortawesome/fontawesome-free/scss/fontawesome';
```
に至ってはどのバージョンでもデプロイできませんでした。

### herokuでgit push heroku mainすると画像のデータが消える

AWSのS3を活用したら画像が持続的に保存されるようになりました。
herokuでは画像が継続的に保持される仕組みになっていないそうです。
この話は有名なので参考にしたサイトを貼っておきます。

https://qiita.com/jibiking/items/0e8c1d826271ac9e4a7d

https://qiita.com/libra_lt/items/284b2723eaae26c5a39b

https://qiita.com/RikutoMatsumoto/items/4cd014d656db284ac875

昔の情報も多く、レイアウトに変更があった箇所もあり混乱しましたがこれらの記事を見たら解決しました。
参考にしてください。
UE5勉強日記　BlueprintにC++関数の使用

BlueprintにC++関数を使用する時に、
対象をconstructしないと、対象内の関数使用できない。

利用中はリサイクルをされないために変数として保存
使用後は削除

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574567/ab9b7037-cf61-80f9-c979-b114cdb12544.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574567/2f227976-5154-5902-8047-acfb6c23f480.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574567/3d6471d8-a870-6db4-2f2f-f04793a82fbf.png)
リストビューに複数レコードをフローに渡す



+ [リストビューでチェックを付けたレコードを全てフローに渡す方法](https://sfdctechsite.com/2022/02/11/listview_toflow/)
+ [Flows | Use Flows to Bulk Update Records from List View in Salesforce
](https://www.accidentalcodersf.com/2023/02/flow-list-view-pass-records.html#google_vignette)

+ [リストビューに複数レコードをフローに渡したい](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JdLwYSAV)

One caveat to Matt's suggestion:  **your list button must be configured to "Display in existing window without sidebar or header" for this to work.**   This is exactly how the setup is shown in the screenshot on the page above, but pointing it out here to avoid others wasted time from overlooking that part of the button setting. 

[How can I pass selected records from a listview into a flow?](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000A8UjOSAV)

私の設定では「 現在のウィンドウにサイドバーなしで表示 」を指定していて機能しませんでした。
上記に書いていある「現在のウィンドウにサイドバーおよびヘッダーなしで表示」ではなんと機能します。

+ [ちょっと古いやり方かも:フロー：リストビューレコードにフローを使用する方法](https://qiita.com/Keiji_otsubo/items/26e946d2f3cf4ff1fe4a)
毎日ABC day1【c++】ABC345 A-E問題解説【ACコード付き】

# AtCoder Beginner Contest 344

https://atcoder.jp/contests/abc344

## A - Spoiler
`|`2つでで区切られている文字列が渡されるので、`|`の間の文字列を消去し、端の文字列同士を結合したものを出力する問題。Pythonだとめちゃシンプルにsplit関数で実装できるらしい

```cpp
int main()
{
	string S;
	cin >> S;
	int x = S.find("|");
	int y = S.rfind("|");
	cout << S.substr(0, x) + S.substr(y + 1) << endl;
	return 0;
}
```

Pythonだと何とこれだけ！！（公式解説から引用）
```py
S = input()
a, b, c = S.split('|')
print(a+c)
```

## B - Delimiter
$N$個の整数が与えられるので、それらを逆順に出力する問題。$N$が問題文に与えられない代わりに、$A_{N}$が0であり、$A_{N}$までは0でないことが保証される。

```cpp
int A[109];

int main()
{
	int i = 0;
	while (true)
	{
		cin >> A[i];
		if (A[i] == 0)
			break;
		i++;
	}
	while (i >= 0)
	{
		cout << A[i] << endl;
		i--;
	}
}
```

## C - A+B+C
整数の集まりが３つ与えられる。それぞれの集まりから1つずつ足した数で、$X_{i}$を表すことができるか判定する問題。今回$X_{i}$が最大で$10^8$個与えられるので、毎回足してみるのではなく、可能性のある数字をリストアップしておく。

自分の実装ではvectorをソートしたが、今回の問題は重複は無視して良いので、setで実装した方が計算料が抑えられたと思う。

```cpp
int N,M,L,Q;
int A[109];
int B[109];
int C[109];
int X[200009];
int AB[10009];
vector<int> ABC;

int main()
{
	// 入力
	cin	>> N;
	for (int i = 0; i < N; i++) cin >> A[i];
	cin >> M;
	for (int i = 0; i < M; i++) cin >> B[i];
	cin >> L;
	for (int i = 0; i < L; i++) cin >> C[i];
	cin >> Q;
	for (int i = 0; i < Q; i++) cin >> X[i];
	// A, Bからひとつずつ取ってできる数を列挙
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < M; j++)
		{
			for (int k = 0; k < L; k++) ABC.push_back(A[i] + B[j] + C[k]);
		}
	}
	// ソート
	sort(ABC.begin(), ABC.end());
	int min = ABC[0];
	int max = ABC[ABC.size() - 1];
	for (int i = 0; i < Q; i++)
	{
		if (X[i] < min || max < X[i])
		{
			cout << "No" << endl;
			continue;
		}
		auto itr = lower_bound(ABC.begin(), ABC.end(), X[i]);
		if (*itr == X[i]) cout << "Yes" << endl;
		else cout << "No" << endl;
	}
	return 0;
}
```
pandasで日付データをいじる、まとめ

# 内容
筆者は記憶力がかなり低めで、日付型を処理する方法がうろ覚えなせいでよく調べ直してるので、まとめて忘れないようにしておきたい。
データが文字列、数値、unixだったときについて書いていきます。

# この記事で使うサンプルデータ
```python
import pandas as pd
from datetime import date

data = {'name': ['田中', '鈴木', '佐藤', '高橋'],
        'birthday_str': ['19900512', '19851225', '20000315', '19970708'],
        'birthday_int': [19900512, 19851225, 20000315, 19970708],
        'hiredate': [date(2015, 4, 1), date(2010, 10, 15), date(2022, 2, 28), date(2018, 6, 1)],
        'hiredate_unix': [1427862000, 1287107400, 1646016000, 1527843230]}

# データフレームを作成
df = pd.DataFrame(data)


df
#  name birthday_str  birthday_int    hiredate  hiredate_unix
# 0   田中     19900512      19900512  2015-04-01     1427862000
# 1   鈴木     19851225      19851225  2010-10-15     1287107400
# 2   佐藤     20000315      20000315  2022-02-28     1646016000
# 3   高橋     19970708      19970708  2018-06-01     1527843230
```

# 変換の仕方
pandas.to_datetimeで変換します。
「対象が文字列か数値型か」、ということでちょこちょこ設定する内容が変わるので順に見ていきましょう。

### YYYYMMDDを文字列、数値型でそれぞれ変換
```python
# 文字列型を変換する場合
pd.to_datetime(df['birthday_str'])
# 0   1990-05-12
# 1   1985-12-25
# 2   2000-03-15
# 3   1997-07-08
# Name: birthday_str, dtype: datetime64[ns]

# 数値型を変換する場合
pd.to_datetime(df['birthday_int'].astype('str'))
# 0   1990-05-12
# 1   1985-12-25
# 2   2000-03-15
# 3   1997-07-08
# Name: birthday_int, dtype: datetime64[ns]

```
こんな感じで数値型を扱う時には、対象を指定した後に".astype('str')"をいれることで正しく処理ができるようにしてあげます。

### 日付型をYYYYMMDDに変換
pandas.to_datetimeで変換したものにdt.strftime()で書式文字列を指定して処理してあげます。
```python
pd.to_datetime(df['hiredate']).dt.strftime('%Y%m%d')
# 0    20150401
# 1    20101015
# 2    20220228
# 3    20180601
# Name: hiredate, dtype: object
```

### unix時間を変換
今回unix時間は秒なのでunit='s'を指定して変換してます。
```python
pd.to_datetime(df['hiredate_unix'].astype(str), unit='s')
# 0   2015-04-01 04:20:00
# 1   2010-10-15 01:50:00
# 2   2022-02-28 02:40:00
# 3   2018-06-01 08:53:50
# Name: hiredate_unix, dtype: datetime64[ns]
```

# まとめ
pandas.to_datetimeだけで色々できる。えらい。

# 参考文献
- [Pythonで時刻をUNIX時間に変換する方法やPandasのデータを使う時の注意点](https://analytics-note.xyz/programming/pandas-unix-time/)

- [pandas.to_datetime](https://pandas.pydata.org/docs/reference/api/pandas.to_datetime.html)
SPSS ModelerでDROP TABLEを行う

SPSS Modelerで間違えてDBにテーブルを作ってしまうことがあるかもしれません。

削除を行いたくても、DB管理ツールはSPSSユーザーには開放されていないこともあるのではないかと思います。その場合は「データベース」入力ノードの「SQLクエリー」に「DROP TABLE」を書いて実行すれば削除可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/480df6a8-d5e6-a246-2bf7-9e6b64cb3652.png)

ダミーの「テーブル」ノードを接続して実行すると以下が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e755197b-2116-cea2-0515-bf99458c12f7.png)

メッセージを確認すると「DROP TABLE」が実行できていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b95facae-14b7-0956-a62a-b6aebb7a1cb2.png)


なお、Snowflakeについては「IF EXISTS」が必要ですので、以下の記事に記載しました。
SPSS ModelerでSnowflakeのテーブルのDROP TABLEを行う #SPSS - Qiita 

https://qiita.com/kawada2017/items/009e36a840287819045d


* テスト環境
    * Modeler 18.5
    * Windows 11 64bit
    * Db2 11.5

＊サンプルストリーム

https://github.com/hkwd/spsssample/raw/master/240524DROPTABLE/240524DROPTABLE.str
Javaのスレッドモデル：グリーンスレッドモデル・ネイティブスレッドモデル・M:Nモデル

## 前提知識
- Javaのスレッド処理にはJavaスレッドとOSスレッドの二種類が存在する
- Javaスレッド
    - JVM内で生成されるスレッド
    - java.lang.Threadクラスで生成する
    - Javaスレッド自体は処理を実行しない
- OSスレッド
    - OSが管理するスレッド
    - Javaスレッドとマッピングされ、Javaアプリの処理を実行する


## グリーンスレッド
グリーンスレッドモデルでは、JavaスレッドとOSスレッドがN対1で紐づきます。
OS側が1なので、シングルコアCPUに適したモデルです。

Java 1.0がリリースされた頃、CPUはシングルコアの時代でした。

CPUのコア数については以下記事が一番わかり易いと思ってます。

https://www.pc-koubou.jp/magazine/23926

CPUのコアを厨房のシェフに例えると、
- クロック数・・・シェフ1人あたりの仕事の速さ
- コア数・・・シェフの人数
- スレッド数・・・シェフ1人が利用するコンロ数

と言えます。


## ネイティブスレッド
ネイティヴスレッドモデルでは、JavaスレッドとOSスレッドが1対1で紐づきます。

Javaスレッド側がNから1に減ったのでスループットが落ちたように見えますが、そんなことはありません。
実際は1対1の組のスレッドを大量に生成し、OS側に複数スレッドを処理させています。

これは、CPUがマルチコアになったゆえできる芸当です。

## M:N
M:Nモデルはその名の通り、JavaスレッドとOSスレッドがM対Nで紐づきます。
ただし、M>Nです。

Java 21からGAされたVirtual Threads(仮想スレッド)はこのスレッドモデルを採用しています。

従来のネイティヴスレッドではスレッドを1つ生成するたびにOS側でスレッドが増えます。
OSスレッドはシステムコールで生成され、カーネルモードで管理されるので負荷が高くなります。
またコア数以上のスレッドを生成した際のコンテキストスイッチの負荷も高いです。

そうした辛さを克服するためのスレッドモデルがM:Nモデルです。

JavaのVirtual ThreadsはJVMで管理されるので、OSスレッドに比べて負荷が少ないです。
(JVMはユーザーモードで操作できる）
Virtual Threadsは軽量なのでJVMが許す限りは大量に生成できます。どのVirtual ThreadsがどのOSスレッドの処理を実行するかもJVMがスケジューリングします。

## 参考リンク

https://zenn.dev/tfutada/articles/5c8f151d814c6a

https://zenn.dev/tetsu_koba/articles/e197c25899cd85

https://devlog.atlas.jp/2023/03/29/5065

https://gihyo.jp/article/2022/08/tfc003-java19
Amper / Kotlin

# 自分用メモ
今後Kotlin用ビルド定義ファイルの主流(になるか?)
現状はGradleのプラグインとして使える

# 環境
- Windows 11
- Intelli-J 2024.1.2

# Intelli-J Amper Pluginでお試し
1. Intelli-J → Plugin → Amper 追加
2. → 新規 → プロジェクト → Kotlin(現時点ではKotlinプロジェクトでのみAmperを選択できる模様)
3. → ビルドシステム:Amper → 作成

[➜生成されたプロジェクト](https://github.com/kyoya-p/samples/tree/7d7c59b5885f2e69b3fd8a59f933263dd4bbd39f/2024/AmperTrial/SimpleKotlin)

```生成された module.yaml
product: jvm/app
```
```生成された settings.gradle.kts
pluginManagement {
    repositories {
        mavenCentral()
        google()
        gradlePluginPortal()
        maven("https://maven.pkg.jetbrains.space/public/p/amper/amper")
        maven("https://www.jetbrains.com/intellij-repository/releases")
        maven("https://packages.jetbrains.team/maven/p/ij/intellij-dependencies")
    }
}

plugins {
    id("org.jetbrains.amper.settings.plugin").version("0.2.0")
}
```

```sh:使用可能になるGradleタスクの確認
gradlew tasks
```
```sh:ビルド・実行
gradlew run
```

# Compose Desktop / jvm
```module.yaml
product: jvm/app

dependencies:
  - $compose.desktop.currentOs

settings:
  compose: enabled
```

# 既存のbuild.gradle.ktsと共存
現状 module.yaml で設定できない部分だけ別途 build.gradle.kts に記載すればよさそう。
最終的には build.gradle.kts は無用に?

例: Compose Desktop で Windows用インストーラを作成
```build.gradle.kts
import org.jetbrains.compose.desktop.application.dsl.TargetFormat

compose.desktop {
    application {
        mainClass = "MainKt"
        nativeDistributions {
            targetFormats(TargetFormat.Msi)
            packageName = "AmperTrial"
            packageVersion = "0.0.1"
            windows {
                shortcut = true
                menu = true
                upgradeUuid = "836f0fc9-0000-0000-0000-4e0b7513cd72"
            }
        }
    }
}
```
```sh:ビルド
gradlew packageMsi
```
[➜コード](https://github.com/kyoya-p/samples/tree/dd4db8f261d4e8905bf7a01dfae4e93e5890a767/2024/AmperTrial/Compose)


# 所感
gradleのカスタマイズ性はすばらしいが使いこなすのは困難。
一般的な設定は簡単に実現できるべきということでAmperに期待。

# 参考

https://github.com/JetBrains/amper/tree/0.1/examples

- [Amper最新版](https://github.com/JetBrains/amper/tags)
Rails - Docker上の Rspec を Makefile から実行する書き方の例

# 概要

- docker-compose 構成が前提
- Makeの引き数として `RSPEC_TARGET` を利用してファイル名を指定する
- localではRailsのディレクトリがMakefileのあるディレクトリより下層にある場合 ( 例: `some_rails_directory ` ) を想定している

# Makefile

```rb
rspec:
	docker-compose run --rm -e RAILS_ENV=test <docker_service_name> rspec ${RSPEC_TARGET:some_rails_directory/%=%}
```

実行例

```sh
make rspec RSPEC_TARGET=spec/dir/
make rspec RSPEC_TARGET=spec/dir/example_spec.rb
make rspec RSPEC_TARGET=spec/dir/example_spec.rb:11
```


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
IBM i CLコマンド検索サイト・一覧リスト

WRKxxx、とか、xxxPGM のはずなんだけどなあ、、といううろ覚えのCLコマンドを探せるCLコマンドの一覧です。

## [CL command finder](https://www.ibm.com/docs/ja/i/7.5?topic=language-cl-command-finder)
ここからコマンドの一部などを入れてCLコマンドを検索できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/4f84219c-302c-7a1b-e037-fc2ab469913c.png)

※上記の例では CHG と VALを含むコマンドを検索したい、、、結果は、、
2つ出てきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/3141d872-d822-087f-5925-34ec29057e46.png)

・・・が一つはコマンドストリングではなく、コマンドの正式名称？の "Value"を拾ったみたいで…
そういえば、検索画面の下に小さく…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/033d8d53-c4fd-5afe-f130-d474c6a287e1.png)
むー^^;

ということで一覧から探したい場合もあるでしょう‥それはこちらです。

## [CLコマンド名リスト](https://www.ibm.com/docs/ja/i/7.5?topic=language-alphabetic-list-cl-commands-by-command-name)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/973c7fa5-e071-a626-87b6-fc0a6eabcd8a.png)


※どうでもですがIBM i 7.4までの日本語翻訳は ***CLコマンド検索プログラム***になってました。ぜんぜん意味わかんないw
【macOS】同じネットワーク上の端末にしれっとアクセスする


IPアドレス見つけてしれっと。

```
~ % sudo arp-scan -l
Password:
Interface: en1, type: EN10MB, MAC: f8:ff:c1:3a:12:ee, IPv4: 192.168.150.30
Starting arp-scan 1.9.7 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.150.5	ec:12:80:22:1b:c0	D-Link International
192.168.150.11	84:1f:ec:9c:26:08	BUFFALO.INC
192.168.150.34	14:12:a3:91:2e:e0	Motorola Mobility LLC, a Lenovo Company
192.168.150.42	d0:17:82:f3:68:2a	AzureWave Technology Inc.
192.168.150.220	01:d0:41:d6:1f:51	AMIGO TECHNOLOGY CO., LTD.
192.168.150.52	8c:45:30:14:80:21	Murata Manufacturing Co., Ltd.
```

![sc 2024-05-24 at 4.56.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/7640a19d-14a2-8a61-bbf9-a8719350dd24.png)


# 😀 参考

https://android.benigumo.com/20240524/arp-scan/
【個人メモ】ファイル差分有無を判定するためのPowerShellコマンドを書いてみた

個人メモ用

```
#固定値設定
$FoldaName_A = "フォルダA" #元ファイルが格納されたフォルダ名
$FoldaName_B = "フォルダB" #処理後ファイルが格納されたフォルダ名

#実行日時を取得
$date_time = Get-Date -Format "yyyyMMddHHmm"

#出力ファイル名を設定""
$result_filename = $("ResultDiff_" + $date_time + ".csv")

# フォルダAとフォルダBのパスを指定
$parent_directory = "C:\Users\markv\Documents\PowerShell等\親フォルダ"
$child_directorys = dir $parent_directory -Directory

#子フォルダについてそれぞれ処理を実行
foreach ($child_directory in $child_directorys)
{
    $FullPass_folderA = $($parent_directory + "\" + $child_directory.Name + "\" + $FoldaName_A)
    $FullPass_folderB = $($parent_directory + "\" + $child_directory.Name + "\" + $FoldaName_B)
    
    if ($(Test-Path $FullPass_folderA) -and $(Test-Path $FullPass_folderB))
    {
        # フォルダAとフォルダBに含まれる同名のファイルを再帰的に取得
        $filesA = dir $FullPass_folderA -Recurse -File
        $filesB = dir $FullPass_folderB -Recurse -File

        # 差分判定  結果のリストを初期化
        $List_result = @()
        $header_row = "No." + "`t" + "ファイル名(処理前)" + "`t" + "ファイル名(処理後)" + "`t" + "差分有無（True:差分なし、False:差分あり）"
        $List_result += $header_row
        # ファイル数カウント用変数を初期化
        $count_file = 0

        # 総当たりで同名ファイルの差分有無を判定
        foreach ($fileA in $filesA) {
            foreach ($fileB in $filesB) {
                if ($fileB.Name -eq $fileA.Name)
                {
                    $count_file += 1
                    fc.exe $fileA.FullName $fileB.FullName > $null
                    $result = $?    #差分なしの場合：True、差分ありの場合：False
                    $comparisonResult = [string]$count_file + "`t" + $fileA.FullName + "`t" + $fileB.FullName + "`t" + $result
                    $List_result += $comparisonResult
                }
            }
        }
        # 差分判定結果のリストを出力
        $result_filename = $("ResultDiff_" + $date_time + "_" + $child_directory.Name + ".csv")
        New-Item $result_filename > $null
        echo $List_result > $result_filename
    }
}
```
EOLになったPostgreSQLをyumでインストールする

# EOLになったPostgreSQLをyumでインストールする
大人の事情でEOLになったPostgreSQLを入れたくなったとき、ソースからビルドするしか無いと思っていたけどちゃんとrepositoryが用意されていましたよ、という話

めっちゃハマりました

## 要するに
https://yum.postgresql.org/repopackages/

の下にあるArchived repositoriesを参照して自分のほしいバージョンのrepositoryの設定を作れば解決です

あと`epel-release`や`centos-release-scl`も必要かも

## どういうこと？
PGDGはEOLになったバージョンを公式から削除しているけど、EOLなバージョンをArchiveしたRepostioryを別途用意しているので、使いたければそちらを使ってね、というスタンスの模様

以下は具体的なステップ例

### 1. レポジトリ設定の追加

上のリンクで紹介されている例はこんなの
```
cat << EOF > /etc/yum.repos.d/pgdg-11.repo
[pgdg11-archive]
name=PostgreSQL 11 RPMs for RHEL/Rocky Linux/AlmaLinux 8
baseurl=https://yum-archive.postgresql.org/11/redhat/rhel-8-x86_64
enabled=1
gpgcheck=1
gpgkey=https://yum.postgresql.org/keys/PGDG-RPM-GPG-KEY-RHEL
EOF
```

これはPostgreSQL11をHEL/Rocky Linux/AlmaLinux 8にインストールしたいときの例
repository名がpgdg11-archiveとしてインストールされます
OSの種類によってgpgkeyが違ったりするので注意

認識されてるか見たいときは

```
yum repolist all
```

### 2. インストール

これでもうインストールできると思いますが、別途epelやscloが必要となるかもしれないです。その場合はこんな感じ

```
yum install centos-release-scl epel-release
```

なにかの事情でdisabledになってたらpostgresqlのインストール時にenablerepoで有効にしてやればいいです

```
yum install postgresql11 --enablerepo=epel,centos-sclo-sclo
```
【TryHackMe】Intro to LAN：Walkthrough

# 概要

TryHackMe「Intro to LAN」のWalkthroughです。

https://tryhackme.com/r/room/introtolan

# Task1

## **Q1**.*What does LAN stand for?*

**A**.**Local Area Network**

## **Q2**.*What is the verb given to the job that Routers perform?*

**Hint**.*This is the term given to deciding what route packets should take*

**A**.**Routing**

## **Q3**.*What device is used to centrally connect multiple devices on the local network and transmit data to the correct location?*

**Hint**.*Something smarter than a hub/repeater.*

**A**.**Switch**

## **Q4**.*What topology is cost-efficient to set up?*

**Hint**.*\*\*\*Topology*

**A**.**Bus Topology**

## **Q5**.*What topology is expensive to set up and maintain?*

**Hint**.*\*\*\*Topology*

**A**.**Star Topology**

## **Q6**.*Complete the interactive lab attached to this task. What is the flag given at the end?*

`View Site`をクリックするとネットワーク構成の解説とミニゲームがあります。

![task1 q6 start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/0a522728-310e-6762-df59-b328f9fa94ea.png)

最後まで進めるとフラグゲットです。

![task1 q6 get flag.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/b5274ed1-e59a-0cc6-e404-775827767b6e.png)

**A**.**THM{TOPOLOGY_FLAWS}**

# Task2

## **Q1**.*What is the technical term for dividing a network up into smaller pieces?*

**A**.**Subnetting**

## **Q2**.*How many bits are in a subnet mask?*

**Hint**.*This can be converted into 4 bytes*

**A**.**32**

## **Q3**.*What is the range of a section (octet) of a subnet mask?*

**Hint**.*Smallest to largest*

**A**.**0-255**

## **Q4**.*What address is used to identify the start of a network?*

**Hint**.*\*\*\*\*\*\*\* Address*

**A**.**Network Address**

## **Q5**.*What address is used to identify devices within a network?*

**Hint**.*\*\*\*\* Address*

**A**.**Host Address**

## **Q6**.*What is the name used to identify the device responsible for sending data to another network?*

**A**.**Default Gateway**

# Task3

## **Q1**.*What does ARP stand for?*

**A**.**Address Resolution Protocol**

## **Q2**.*What category of ARP Packet asks a device whether or not it has a specific IP address?*

**A**.**Request**

## **Q3**.*What address is used as a physical identifier for a device on a network?*

**Hint**.*\*\*\* Address*

**A**.**MAC Address**

## **Q4**.*What address is used as a logical identifier for a device on a network?*

**Hint**.*\*\* Address*

**A**.**IP Address**

# Task4

## **Q1**.*What type of DHCP packet is used by a device to retrieve an IP address?*

**Hint**.*DHCP \*\*\*\*\*\*\*\**

**A**.**DHCP Discover**

## **Q2**.*What type of DHCP packet does a device send once it has been offered an IP address by the DHCP server?*

**Hint**.*DHCP \*\*\*\*\*\*\**

**A**.**DHCP Request**

## **Q3**.*Finally, what is the last DHCP packet that is sent to a device from a DHCP server?*

**Hint**.*DHCP \*\***

**A**.**DHCP ACK**
【書評】見えにくい、読みにくい「困った！」を解決するデザイン

## はじめに
書籍『見えにくい、読みにくい「困った！」を解決するデザイン』を読みました。

https://amzn.asia/d/3ip2UeI

## 概要
これは6人の登場人物による、それぞれの状況による困った事例を踏まえて説明されています。

### 目次
- Chapter1 みんなのデザイン
- Chapter2 色で困った！
- Chapter3 文字で困った！
- Chapter4 ことばで困った！
- Chapter5 図解で困った！
- Chapter6 UIで困った！
- Chapter7 おさらい

## 気づきと感想

### 色について

いわゆる「色弱」と一言で言ってもさらに細分化して見え方が人によって違いがあります。

https://www.ikec.jp/inst/i_shikikaku/

こういったテストを受けた事がある方は多くいらっしゃると思います。
色弱にもC型、P型、D型、T型、A型と細分化され、それぞれ見え方が違います。

> 人間の目の網膜にある３種類の錐体（光を受ける視細胞）の一部または全てが無い、あるいは分光感度がずれているために、３種類の錐体が揃っている人とは異なった色の見え方がする。
　Ｐ型：赤い光を主に感じる錐体が無い、あるいは分光感度がずれている。
　Ｄ型：緑の光を主に感じる錐体が無い、あるいは分光感度がずれている。　　　
　Ｐ型とＤ型は見え方が似ており、赤近辺の色と緑近辺の色の識別が困難。
色弱者のほとんどがこれらのどちらかのタイプである。
　Ｔ型：青い光を主に感じる錐体が無いため、青色付近の識別が困難
　Ａ型：３種類の錐体のうち１種類しか持たない、または全てが無いため、色を明暗でしか感じることができない。
Ｔ型とＡ型は、極めて該当者が少ない。

国際ユニバーサル協議会【色覚】色弱（Ａ型）より

https://www.iaud.net/UDmatrix_userinfo/miru/cat41/post-1.php

そういった方々への具体的な取り組みとしてはコントラスト比などのチェックや、色とともに補足の情報を追加するというやり方があります。

### 文字について

文字の読みやすさには、視認性、判読性、可読性の3つの軸があり、文字サイズや行間、行の長さなどで文章は読みやすくなります。
あまり装飾した文字を使用したり、文章は文字間隔が詰まりすぎてると可読性が悪くなるので、日本語においては文字サイズの50%~100%を目安に行間を設定すると良いとのことです。
あと、ディスレクシアという学習障害を抱えた方も日本には7~8%いるとは言われていて、UDフォントというフォントだとディスレクシアの方でも比較的読みやすいフォントいわれています。
Windowsだと標準に備わっているそうです。

https://www.microsoft.com/ja-jp/enable/guides/learning


### 言葉について

> 構造が明快なら、知りたいことに素早くたどり着けます。
冗長さを省けば、伝えたいことがストレートに伝わります。
わりやすく組み立てられた言葉は翻訳しやすく、音声入力や機械翻訳などテクノロジーとの組み合わせにも効果が期待できます。
言葉に向き合うことは、発信者と受け手のコミュニケーションを円滑にするデザインにつながっているのです。

*見えにくい、読みにくい「困った！」を解決するデザイン「ことばの壁を知る」より*

確かに冗長で難しい言葉を使われた文章を読むと、理解しづらかったり、そもそも難しい言葉の意味を知らなかったりすることが多々あります。
そこで本でも紹介されている「伝えるウェブ」というサイトはAIによって難しい文章をやさしくしてくれるというサービスを使って、WCAGのサイトの一部をやさしくしてみました（あえて小難しく書かれている文章を選びました）


**達成基準 1.4.8 視覚的提示の注記２の原文**

> 言語の中には、書記体系において、可読性及び視認性を向上させるために用いる提示の概念が異なるものもある。ある書記体系でこの達成基準における提示の概念が用いられていない場合、その書記体系のコンテンツは、その提示の設定を用いる必要はなく、その提示の設定なしでも適合できる。コンテンツ制作者は、可読性及び視認性を向上させるために、言語の書記体系のガイドラインに従うことが推奨される。

AI変換後↓

> 言語の中には、書記体系において、読みやすさと  見やすさを  よくするために  つかう  提示(示しめすこと)の  考えが  ちがうものも  あります。ある  書記体系で  この  満たす条件の  提示(示しめすこと)の  考えが  つかわれていないとき、その  書記体系の  コンテンツは、その  提示(示しめすこと)の  設定を  つかう  必要はなく、その  提示(示しめすこと)の  設定  なしでも  一致  できます。コンテンツを  作る人は、読みやすさと  見やすさを  よくするために、言語の  書記体系の手てびきを  まもることが  すすめられます。

変換後の漢字にはルビも振られてましたが、そこは削除しました。
何かとても読みやすくなった感がありますね。

こういったものはデザインを学んだ人ならすでに理解している内容なのかもしれませんが、私にはとても学びになりました。
書籍の末尾にも参考にした文献が記載されていたので、また折を見て読んでみたいと思います。

## 参考

https://www.dinf.ne.jp/doc/japanese/access/library/071030_jla93-12/kouyama.html

https://www.nippon-foundation.or.jp/journal/2023/95232/disability

https://tsutaeru.cloud/easy.php?uri=https%3A%2F%2Ftsutaeru.cloud%2F
Javaで「算術演算子」の動作を確認してみた

# 概要

Javaで「算術演算子」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/ope/index1.html

# 実装

以下のファイルを作成しました。
```JSample1_1.java
class JSample1_1{
  public static void main(String[] args){
    System.out.println("10 + 4 = " + (10 + 4));
    System.out.println("9 - 2 = " + (9 - 2));
    System.out.println("3 * 8 = " + (3 * 8));
    System.out.println("7 / 3 = " + (7 / 3));
    System.out.println("7 % 3 = " + (7 % 3));

    System.out.println("10.1 + 4.3 = " + (10.1 + 4.3));
    System.out.println("9.4 - 2.8 = " + (9.4 - 2.8));
    System.out.println("3.3 * 8.1 = " + (3.3 * 8.1));
    System.out.println("11.4 / 3.5 = " + (11.4 / 3.5));
    System.out.println("11.4 % 3.5 = " + (11.4 % 3.5));
  }
}
```
```JSample1_2.java
class JSample1_2{
  public static void main(String[] args){
    int num1 = 10;
    int num2 = 4;

    System.out.println(num1 / num2);
    System.out.println(num1 / (double)num2);
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample1_1.java 
$ java JSample1_1 
10 + 4 = 14
9 - 2 = 7
3 * 8 = 24
7 / 3 = 2
7 % 3 = 1
10.1 + 4.3 = 14.399999999999999
9.4 - 2.8 = 6.6000000000000005
3.3 * 8.1 = 26.729999999999997
11.4 / 3.5 = 3.257142857142857
11.4 % 3.5 = 0.9000000000000004
$ javac JSample1_2.java 
$ java JSample1_2 
2
2.5
```

# まとめ

何かの役に立てばと。