OmniAICreator/Qiita-1.07M huggingface dataset:
(java silver) 例外

## JavaSilverでメモしたところ備忘録として残しておこうと思います。

# 例外とは
* 実行中のプログラムを停止して異常終了すること、呼び出し先のメソッドでエラーが起こった時に使う

## throw文
* 例外を投げる(呼び出し先のメソッドに入る)

## try-catch-finally
* tryとは例外のある可能性の処理に入る(呼び出し元のメソッドでつくる)、例外が発生時にしてほしくない処理も書く
* catch(Exeption e)とは例外に対応する処理(呼び出し元のメソッドで作る)
* finally(必ず動作)とは発生した例外が()内の例外型だったときにのみcatchブロックが実行される、逆に()内の型でなければtryブロックの中の処理が呼ばれる

```java
try{
    例外が発生しうる処理(throw文とか);
}catch(例外のクラス名(例外型) e){
        例外発生時の処理(例外型が一致したときのみ);
}finally{
    例外発生の有無にかかわらず必ず動作する記述;
}   
```

# Errorクラス
* 重大な問題、異常な状態、実行上のトラブルなど
### VirtualMachinError
* JVNが壊れている、必要なメモリがない
### OutOfMemory
* whileやfor文などの無限ループではいずれメモリ不足になり`OutOfeMemoryError`が発生し例外処理をしないErrorクラス群に入るものなので実行時に例外がスローされる。catchブロックではキャッチすることができない

::::note
Error群はプログラム上で対処のしようがない回復不可能な例外
::::

# Exetentionクラス
### IOExeption
* 入出力の失敗
### TimeOutExeption
* タイムアウトエラー
::::note
Exeptionクラス群は回復可能な例外になるので例外処理を記述する必要がある
::::

# RuntimeExeption[非チェック例外]
### NullPointExeption
* nullが設定された変数でメソッドの呼び出しを行うとヌルポが発生する。System.out.println(null)であれば"null"が表示される
::::note
ValueOfとtoStringはどちらも数値を文字列に変換するメソッドであるがValueOfメソッドの場合はnullが変数に格納されていた場合は"null"を返すが、とStringはヌルポが発生する。
::::
### IndexOutOfBounds
> ある種のインデックス(配列・文字列・ベクトル)が範囲外であることを示すためにスローされる
* `List,ArrayList`などに対して不正なインデックスを使ってアクセスしたときに発生する例外
### ArrayIndexOutOfBounds
> 不正なインデックス(配列番号)を使って配列がアクセスされたことを示すためにスローされる。配列が負の数または配列のサイズ以上
* `配列`に対して不正なインデックスを使ってアクセスしたときに発生する例外
::::note
RuntimeExeptionクラス群は回復可能な例外ではあるが例外処理の記述は必須でない。
::::
(java silver) API(LocalDateTime)

## JavaSilverでメモしたところ備忘録として残しておこうと思います。
# LocalDataTimeクラス
* immutable(不変)なオブジェクト(callenderクラスはmmutable)、下記の処理で分かる通りLocalDateTimeクラスでは2021年に変更後も変わらない

```java
import java.time.LocalDataTime;
import java.util.calender;

public class Test {
    public static void main(String[] args){
        LocalDateTime day = LocalDateTime.of(2020,1,1,0,0,0,);
        System.out.println(day);//2020-01-01T00:00
        day.withYear(2021);
        System.out.println(day);//2020-01-01T00:00
        
    }
}

```


* 月が1から始まる(calenderクラスは0から)

## LocalDateTimeクラスのメソッド

* nowメソッドで現在の時刻を取得

```java

LocalDateTime ld = LocalDateTime.now(); //現在の時刻取得

```

* ofメソッドで日付を指定してオブジェクトを作成

* parseメソッドで文字列から日付のオブジェクトを変更する

* 時間の減産や加算のメソッド<br>

| 概要 | メソッド名 |
|:-:|:-:|
|年を加算|plusYears(long years)|
|月を加算|plusMonths(long months)|
|日を加算|plusDays(long days)|
|時を加算|plusHours(long hours)|
|分を加算|plusMinutes(long minutes)|
|秒を加算|plusSeconds(long seconds)|
<br>

| 概要 | メソッド名 |
|:-:|:-:|
|年を減算|minusYears(long years)|
|月を減算|minusMonths(long months)|
|日を減算|minusDays(long days)|
|時を減算|minusHours(long hours)|
|分を減算|minusMinutes(long minutes)|
|秒を減算|minusSeconds(long seconds)|

## フォーマット
* LocalDateTimeクラスはDateTimeFormatterクラスを使いフォーマットの指定を行う

```java
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Test{
    public static void main(String[] args){
        localDateTime ld = localDateTime.of(2020,1,1,0,0,0);
        DateTimeFormatter dtf = DataTimeFormatter.ofPattern(""yyyy-MM-dd HH:mm:ss");
        System.out.println(ld.format(dtf)); //2020-01-01 00:00:00
}
```

::::note
存在しない日付を指定した場合は`java.time.DateTimeExeptionの実行時エラー`が発生する
::::
(java silver) 繰り返し処理(拡張for文・forEachメソッド)

## JavaSilverでメモしたところ備忘録として残しておこうと思います。
# 拡張for文
* 拡張for文は`配列`に対しての処理

* ループ処理中にremoveメソッドの呼び出しを行うと実行時エラーが発生する。ループする際にhasNextメソッドで要素数のチェックとエラー判定を行っているためループ中に削除して次に要素がなければエラーにならずループを抜ける

# forEachメソッド
* forEachは`コレクション(List,Map)`に対してループ処理を行う
```java
forEach(引数 -> 繰り返し処理)
```
* 拡張for文との違いは配列をそのままで扱うことができず、Listに変換する処理が必要
```java
String[] exArray = {"a","b","c","d"}

Array.stream(exArray).forEach(s -> System.out.println(s));

::::note
Array.stream(配列名)は配列からStreamを作成するメソッドです
::::
(java silver) ComparatorとCompareble

## JavaSilverでメモしたところ備忘録として残しておこうと思います。
# Comparator
* java.utilのComparatorを実装したクラスを定義しcomparaメソッドをオーバーライドし比較ロジックを定義
* Comparatorは比較ロジックに応じていくつも作れる
* 自分で定義したクラスオブジェクトの特定や特定の値をもとにソートしたいときや細かい条件等でソートしたい場合に使用する
```java
public class ShoseNameComparator implements Comparator<Shose> {

    @Override
    public int compare(Shose shose1, Shose shose2){
        return shose1.getTitle().compareTo(shose2.getName());
    }

}
```

### 値段比較
```java
public class ShosePriceComparator implements Comparator<Shose> {

    @Override
    public int compare(Shose,shose1, Shose shose2){
        return Integer.valueOf(shose1.getPrice()).compareTo(shose2.getPrice());
    }

}
```
#### 販売日比較
```java
public class ShoseDateOfIssueComparator implements Comparator<Shose> {

    @Override
    public int compare(Shose shose1, Shose shose){
        return shose1.getDateOfIssue().compareTo(shose2.getDateOfIssue());
    }

}
```
## Comparable
* java.langのComparableインターフェースを実装しcompareToメソッドをオーバーライドします
```java
public class Shose implements Comparable<Shose>{

    // name
    private String name;

    // 値段
    private int price;

    // 販売日
    private LocalDate dateOfIssue;

    @Override
    public int compareTo(Book book){
        return title.compareTo(book.title);
    }
}
```

```java
Shose shose1 = new Shose();
shose1.setName("jordan");
shose1.setValue(8710);
shose1.setDataOfIssue(1985,9,15);

Shose shose2 = new Shose();
shose2.setName("Super Star");
shose2.setValue(10000);
shose2.setDataOfIssue(1969,4,1);

Shose shose3 = new Shose();
shose3.setName("ALL STAR");
shose3.setValue(7700);
shose3.setDataOfIssue(1917,4,2);

List<Shose> shoseList = Arrays.asList(shose1,shose2,shose3);

System.out.println("ソート前:" + shoseList);

Collections.sort(shoseList);

System.out.println("ソート後:" + shoseList);
```
* java.util.Collectionsのsort(List<T> list)は、要素のオブジェクトが持つcompareToにより要素同士を比較し、ソート実施

```java
ソート前: [Shose(name=jordan,price=8710,dateOfIssue=1985-9-15),Shose(name=Super Star,price=10000,dateOfIssue=1969-4-1),Shose(name=ALL STAR,price=7700,dateOfIssue=1917-4-2)]
ソート後: [Shose(name=ALL STAR,price=7700,dateOfIssue=1917-4-2),Shose(name=jordan,price=8710,dateOfIssue=1985-9-15),Shose(name=Super Star,price=10000,dateOfIssue=1969-4-1)]

```
compareToでは比較ロジックを一つしか定義できない

## 配列(固定長)のソート
* Arrayクラスのsortメソッドを使用
```java
Arrays.sort(配列名);//昇順
Arrays.sort(配列名, Collections.reverseOrder());//降順
```
## Listのソート
* collectionクラスのsortメソッドを使用
```java
collection.sort(リスト名);//昇順
collection.sort(リスト名, Collections.reverseOrder());//降順
```

## ラムダ式とStream API
```java
リスト名.stream().sorted((x, y) -> y - x);
```
(java silver) 関数型インターフェース

## JavaSilverでメモしたところ備忘録として残しておこうと思います。

* 関数型インターフェース学びたては<T>ってなんだよと思いながら勉強してました。ラムダ式を少し学んだあとに読み返すと理解が深まりました！

# 関数型インターフェース
* 定義されている抽象メソッドが一つだけ、staticメソッドやdefaultメソッドが定義されていても問題なし

## Supplierインターフェース
* `getメソッド`が定義されている、引数なしで戻り値にジェネリクスで指定したデータ型の値を返すメソッド

```java

Supplier<String> Sup = () -> "Hello!!";
//getメソッドのオーバーライド

System.out.println(sup.get());
//getメソッドの呼び出し
//Hello!!と出力される

```

## Consummerインターフェース(消費者)
* `acceptメソッド`が定義されている、引数にジェネリクスで指定したデータ型の値をとり戻り値なし

```java

Consummer<String> con = (s) -> System.out.println("Hello" + s + "!");
//acceptメソッドのオーバーライド

con.accept(" Tanaka");
//acceptの呼び出し
//Hello Tanaka!と出力される

```

## Predicateインターフェース(判断者)
* 引数の値を受け取りTrueもしくはFalseの値を返す

```java
Predicate<String> pre = testval -> testval.isEmpty();//文字列は空文字か？

System.out.println(pre.test(2));
//空文字ではないのでfalseが出力される

```
## Functionインターフェース
* 引数で渡した値を演算して返り値として返す

```java

Function<Integer, String> make1 = a -> a + "です";

String b = make1.apply(2);
System.out.println(b);//"2です"と表示される
(java silver) インターフェース

## JavaSilverでメモしたところ備忘録として残しておこうと思います。
# インターフェースにおけるdefaultメソッド
```java
default 戻り値の型 メソッド名(引数の型 引数){処理内容}
```
* メソッドのアクセス修飾子は暗黙的にpublic

# インターフェースにおけるstaticメソッド
```java
static 戻り値の型　メソッド名　(引数の型 引数)
```
* オーバーライドはできず呼び出し方も「インターフェース名.メソッド名」
* privateのアクセス修飾子をつけることができる
### インターフェースでのフィールドの宣言
* public,static,finalが自動的に追加される
::::note
初期化しないとコンパイルエラー
:::
(java silver) Map

## JavaSilverでメモしたところ備忘録として残しておこうと思います。

# Mapについて

* Mapはkeyとvalueをセットにしたもの
* インデックスの代わりに任意の変数を要素の値のペアにできるkeyは重複なしである必要があるがvalueは同じものが複数あっても大丈夫
* HashMapは格納順が管理されないが、TreeSetは順番がキーになっている
* HashMapはkeyとvalueにnullを使用することが可能だがTreeMapは使用できない

### 値の取得
* 値の取得にはMapでkeyを指定しgetメソッドを使用

```java
(map.get("key1"));
```
* キーをすべて取得するにはkeySetメソッドを使用し、拡張for分を使い取り出せる

```java

for(String key = map.keySet()){
    System.out.println(key);
}

```

* Mapの値をすべて取得するにはvaluesメソッドを使用

```java

for(String val = map.values()){
    System.out.println(val);
    
```
(java silver) Collection

## JavaSilverでメモしたところ備忘録として残しておこうと思います。


# Collectionインターフェースとは
* コレクション・インターフェースはSetやListのようなサブインターフェースの実装を供給している
`Mapもコレクションに似ているがコレクションではない`<br>`コレクションフレームワークには入っている`<br><br>
* コレクションフレームワークとは多数のデータをまとめて管理および処理するために用意されたもので、様々なタイプのインタフェースとクラスで構成されjava.util.Collectionとjava.util.Mapの2つのグループに分けることができます

# Collection・インターフェースのメソッド

| メソッド名 | 概要|
|:--|:--|
|add(E e) |要素を追加する|
|remove(Object o)|指定された要素を削除する|
|contains(Object o)|指定された要素がcollectionに含まれているかどうか返す|
|isEmpty()|コレクションがからかどうか返す`空ならtrue`|
|size()|コレクションの要素数を返す|
|iterater()|コレクションを反復処理するためのイテレーターを返す|

* Collectionインターフェースは、java.utilパッケージのjava.util.Iterableインターフェースを継承しこちらはJavaで拡張for分(for-each)分を使用できるようにするためのインターフェースです

## サブインターフェース
## List(シーケンス)
* 順序付けられたコレクション。重複した要素を含むことができる、ユーザーは要素を挿入する場所やインデックスによって要素にアクセスすることを正確に制御できる<br><br>
* Listはインターフェースなのでインスタンは生成できない<br><br>
* Listのメリットはコレクション(データ型)に変更したい場合、宣言時に手を加えなくていい<br><br>
* ListのデメリットはArrayListにしかメソッドがないときにキャストしなければならない<br><br>
* Listは以下のクラスで実装されています
1. `ArrayList`
2. `LinkedList`
3. Vector
4. Stack

### ArrayList
* 配列を便利に使いやすくしたクラス<br><br>
* Array(配列)では作成時に決めた配列の大きさを変えることはできず、追加でサイズを変更したい場合には新しく配列を作り直す必要がありましたが、ArrayListでは使う側が配列のサイズを意識せずに扱うことができる(動的配列)<br><br>

* `スレッドセーフ`ではない
:::note 
スレッドセーフとは
>マルチスレッドの環境で実行されても内部データへのアクセスが競合せずに、常に内部データの整合性が保たれているように対策されている状態のことです。
:::


#### ArrayListにしかないメソッド<br>
1. Listをコピーする`cloneメソッド`<br>
2. `Iterater型のオブジェクト`と`Iteratarメソッド`を使い使用することができる<br>
3. Iterater 型のオブジェクトから`hasNext`や`next`メソッドを呼び出せる<br>

| メソッド名 | 概要 |
|:--|:--|
| hasNext | リストが次の要素を追っているときはtrueを返す |
| next | 次の要素を返す|

* 配列からListに変換するときはArrays.asList()メソッドを使用する
```java
//配列からlistに変換

String[] array1 = { "赤", "青", "緑", "紫" };
List<String> list1 = Arrays.asList(array1);

```
* リストから配列への変換する場合は、toArrayメソッドを使用
```java
//Listから配列に変換

List<String> list2 = new ArrayList<>(Arrays.asList("赤", "黄", "青"));
String[] array2 = list2.toArray(new String[list.size()]);

```

### LinkedList
* 要素がどのように並んでいるか別で管理しているために要素を削除したり追加する場合にArrayListよりも高速に動作するが、要素を順にたどるため検索などはArrayListよりも遅くなる

### Listのよく使用するメソッド

| メソッド名 | 概要 |
|:--|:--|
| add() | リストに値を追加 |
| addAll() | リストにリストを追加 |
| set() |リストの値を変更|
|get()|リストの値を取得|
|size()|リストの要素数を取得|
|subList()|リストの一部分から切り取る|
|contain()|リストに値が含まれるか判定|
|indexOf()|リストから指定した文字列のインデックスを取得|
|sort()|リストを順番に並べる|
|remove()|インデックスを指定して削除|
|distinct()|重複した要素がある場合は削除|
|clear()|リストからすべての要素を削除|

:::note
メソッドを使わずlistを出力すると`[,]`も出力される

```java
//java

List<String> sample_list = new ArrayList<>(Arrays.asList("赤", "青", "緑", "黒", "白"));

System.out.println(sample_list);
//[ 赤,青,緑,黒,]
:::



## Set
* 重複した要素を含むことができないコレクション
* 順序があるとは限らない

* Setを継承したクラス
1. `HashSet`
2. `TreeSet`
3. LinkedList

### HashSet
* ハッシュテーブルを利用した重複なしの配列になります
* 順序付けはない

### TreeSet
* キーを利用して常にソートした状態のまま保持しています

## Queue
* 追加の挿入、抽出、及び検査が追加されたコレクション





引用先:https://www.divx.co.jp/media/techblog-220627
(java silver) equals

## JavaSilverでメモしたところ備忘録として残しておこうと思います。

* 勉強したては"equals"と"=="がごっちゃになってしまい分からなくなってしまいましたがstringクラスにおけるequalsはオーバラードされているということが分かってから理解が深まりました！

# Javaの同一性・同値性
* インスタンスは異なるが同じ値を持っている`同値性`


```java

String str1 = new String("ABC");
String str2 = new String("ABC");

System.out.println(str1 == str2);
//falseと出力される
System.out.println(str.equals(str2));
//trueと出力される
```

* 複数の変数が同じインスタンスを参照していることを`同一性`

```java

String str1 = "ABC";
String str2 = str1;
String str3 = new String("ABC");
String str4 = "ABC";


System.out.println(str1 == str2);
//trueと出力される

System.out.println(str1 == str3);
//falseと出力される

System.out.println(str1 == str4);
//trueと出力される
```

# equalsメソッドについて

* objectクラスにあり、すべてのクラスに継承される
* プリミティブ型においては`同値性`を見るため`==`が使われ、<br>参照型では`==`も`equals()`のどちらもインスタンス参照先の`同一性`を見る

* objectクラスの場合は`同一性`を判別し`nullはfalse`
* Strnigクラス内のequalsメソッドはobjectクラスのequalsメソッドをオーバーライドしていて`同値性`を判別し`nullは実行時エラー`

```java
String str1 = "He";
String str2 = "He";

System.out.println(str1 == str2);

str1 += "llo";
str2 += "llo";

System.out.println(str1 == str2);

```

```java
//実行結果

true
false

```

## 補足

* 一般的に参照型では`==`を使わず判別を行ってもfalseになるが<br>`-128~127の間ではtrue`が出てしまう

```java
Integer a = 127;
Integer b = 127;

System.out.println(a == b);
//trueが出力される
```

```java
Integer a = 128;
Integer b = 128;

System.out.println(a == b);
//falseが出力される
```
(java silver) スーパークラスとサブクラス

## JavaSilverでメモしたところ備忘録として残しておこうと思います。

# スーパークラスとサブクラス
* サブクラスは一つのスーパークラスしか持たない
* すべてのクラスはObjectクラスのサブクラスである
* finalクラスはサブクラスを持てない
* サブクラスはスーパークラスのフィールドとメソッドを受け継ぐ
:::note info
コンストラクタは継承されない
privateのメソッドをサブクラスがオーバーライドしていた場合はスーパークラスのメソッドとサブクラスでオーバライドしたメソッドは別のメソッドとして処理される

[参考文献](https://teratail.com/questions/11415)
:::
* finalなメソッドはオーバーライドできない
* サブクラスのインスタンスはスーパークラスのインスタンスとみなすことができる
```java

class Super{
    int val = 4 ;
}
class Subclass extends Super{
    int val = 8;

public static void main(String[] args){
    Super num = new Subclass("hoge")
    System.out.println(num.val)
}
```
* 上記の"num"からはサブクラスで宣言されたフィールドを参照することができない
* "num"に対して実行できるのはスーパークラスで定義されているものだけ、サブクラスでオーバーライドされていたらサブクラスが呼び出される
* 子クラス(サブクラス)は親クラスのフィールド(変数・メソッド)を使える
## 多態性(ポリモーフィズム)
* 抽象クラス」や「インターフェース」などを利用してメソッドの呼び出し方法を共通化しオーバーライドさせることで同じメソッド呼び出しでも実際のインスタンスマイにその挙動を変えるもの<br><br>
* スーパークラスとサブクラスに同じ名前のフィールドがあった場合は宣言した変数の型によって決まる。A型ならAクラスのフィールドを参照する<br><br>
* スーパークラス型(A型)のサブクラスのインスタンス(new B())を定義した場合にはBのインスタンスをA型として扱っているので`B独自のメソッドを呼び出すことはできない` `コンパイルエラーが発生する`<br><br>
* 注意すべきはインスタンスを扱っている型(Aクラス)に呼び出しているメソッドがあるかを注意してみる
::::note
オーバーライドしている場合はインスタンス化されているB型を参照することに注意する。
::::


## 抽象クラス
* 抽象クラスとはメソッドの名前と引数の型が決まっていて実装がない抽象メソッドを含んだクラスのこと、自らは実装しないがサブクラスに対しどのように実装するか強制する。ByteやIntegerなどのクラスのスーパークラスであるNumberクラスが代表例
(java silver) コンストラクタ

## JavaSilverでメモしたところ備忘録として残しておこうと思います。
# コンストラクタについて
#### コンストラクタの決まり
* コンストラクタはメソッド名とクラス名を同じにする
* 戻り値は記述しない記述するとメソッドとして処理される(void,intなど)
* コンストラクタはnew演算子で呼び出す

## デフォルトコンストラクタ
* コンストラクタを一つも定義していない場合に自動で作成
```java
クラス名(){
}
```
* コンストラクタは実行する前にまずスーパークラス(親クラス)を呼び出すようになっている
```java
クラス名(){
super();//　自動で追加
}
```
* 明示的にコンストラクタヲ記述した場合には作成されない
* 引数なしのコンストラクタを定義せず引数ありのコンストラクタだけ記述した際にもデフォルトコンストラクタは作成されないので引数なしでそのクラスオブジェクトを作成することができない
```java
class a{
  public static void main(String args[]){
    Sample sample = new sample();// コンパイルエラー
  }
}

class Sample{
  Sample(int num){// 引数なしのコンストラクタがない
  }
}
```
## 初期化子(インスタンスイニシャライザ)
* 通常
```java
{
    <処理内容>
}
```
* static初期化子
```java
static {
    <処理内容>
}
```
* コンストラクタが複数あるときは共通処理をインスタンスイニシャライザで先に実行できる
* インスタンスイニシャライザはインスタンス化される直前に実行される
* staticフィールドはインスタンス生成しなくても利用できるがコンストラクタで初期化できないのでstatic初期化子(イニシャライザ)で初期化する必要がある

::::note
イニシャライザ → インスタンスイニシャライザ → コンストラクタの順で処理される
::::


## 変数に代入するインスタンス化をしないインスタンス化

```java
Sample a = new Sample();
// "a"という変数を使いサンプルのインスタンス化したものを何度でも繰り返し使用できる

new Sample().(メソッドなど)
// 変数に代入しないので１回しか使用できない
```
(java silver)static

## JavaSilverでメモしたところ備忘録として残しておこうと思います。

# static修飾子
* クラスをインスタンス化せずに直接メソッドや変数にアクセスするためstaticメソッドを付けたメソッドを"静的メソッド"、変数を"静的変数"と呼ぶ

# staticクラス
* 内部クラス(インナークラス)で使用する。インナークラスとはクラス内でクラスを定義すると内部クラスからは外部にアクセスできる、内部クラスにstatic修飾子をつけると外部クラスのstaticなメンバのみにアクセスできるため別のクラスと同じように見える

# staticメソッド(クラスメソッド)
* 通常のメソッドはクラスをインスタンス化してから使用するがstatic修飾子を付与したクラスメソッドはインスタンス化なしに直接呼び出して使用できる
```java
//定義
public class Smple {
  public static void method() {    
    int a = 1;
}
```

```java
//呼び出し

//(クラス名.メソッド名)
Sample.method;
```


# クラス変数(static変数)
* staticキーワード(修飾子)につけて宣言される変数であり、すべてのオブジェクトで共有される。staticがついていない変数を`インスタンス変数`と呼ぶ。違いはstaticがついているかいないか！インスタンス変数はクラスのオブジェクトが生成されたタイミングで作られる変数、クラスのオブジェクトごとに管理されている。オブジェクト(インスタンス)毎に変数が作られる(クラス名.変数名)
* 以下のように宣言する
```java
アクセス修飾子 (publicなど) static 型名 変数名
```

* クラス変数の場合はデータ型を指定して宣言すると初期値が与えられる
```java
整数値のデータ型: 0
float型: 0.0f
double型: 0.0d
文字型: '\u0000'
boolean型: false
参照型(String): null
```
:::note 
static変数は暗黙的にfinalとなる
:::

# static import
* 従来はstatic変数、メソッドを利用する場合クラス名をつけてアクセスする必要があったが、static importのおかげでstatic変数、メソッドを完全修飾名およびインポートしたいstatic変数やstaticメソッドを指定する
:::note 
完全修飾名とは「パッケージ名.クラス名」といった正式名称である
:::

```java
[構文]
import static パッケージ名.クラス名.static.変数名;
import static パッケージ名.クラス名.static.メソッド名
import static パッケージ名.クラス名.*

[クラス名まで]
import com.it.sjop.staticTest;
    class Sample void main(String[] args){
        staticTest.method();//クラス名.メソッド名

[メソッド名まで]
import com.it.sjop.staticTest.method;
    class Sample void main(String[] args){
        method();//メソッド名
```

# インスタンスメンバとstaticメンバのクラス内でのアクセス

* クラス内で定義したインスタンスメンバは、クラス内で定義したstaticメンバに直接アクセスできる
* クラス内で定義したstaticメンバは、クラス内で定義したインスタンスメンバに直接アクセスすることはできない

```java

class sample {
    int instanceVal;
    static int staticVal;

    int method1(){return instanceVal;}           //1.ok
    int method2(){return staticVal;}             //2.ok
    //static int method3(){return instanceVal;}  //3.コンパイルエラー
    static int method4(){return staticVal;}      //4.ok
    static int method5(){                        //5.ok
        sample obj = new sample();
        return obj.instanceVal;
    }
}
```
:::note info
インスタンスメンバ  →　クラスメンバ  //OK
クラスメンバ　     → インスタンスメンバ//NG
::::
::::note
インスタンスメンバをインスタンス化してからならクラスメンバからのアクセスが可能になる
::::
実行ファイルとは

# 実行ファイル（実行可能ファイル）
```実行ファイル 【executable file】``` ```実行可能ファイル ```/ ```ロードモジュール``` / load module
概要 実行ファイル（executable file）とは、コンピュータのストレージ（外部記憶装置）などに記録されるファイルの種類の一つで、```メインメモリに読み込んで実行できる```形式のプログラムファイルのこと。

# 出典
https://e-words.jp/w/%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB.html#:~:text=%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%20%E3%80%90,%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%81%93%E3%81%A8%E3%80%82

例えば、PHPというプログラミング言語で作ったプログラムは、メモ帳ソフトで開いて中を覗くことができます。
```PHPファイルは間違いなくプログラムなファイルです。ですが、これを「実行ファイル」とは呼びません。```
そんな考えの人たちが言う「実行ファイル」は「```中身がバイナリデータ```なプログラムなファイル」です。

# 出典
https://wa3.i-3-i.info/word11896.html#:~:text=%E4%BE%8B%E3%81%88%E3%81%B0%E3%80%81PHP%E3%81%A8%E3%81%84%E3%81%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E%E3%81%A7%E4%BD%9C%E3%81%A3%E3%81%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E3%80%81%E3%83%A1%E3%83%A2%E5%B8%B3%E3%82%BD%E3%83%95%E3%83%88%E3%81%A7%E9%96%8B%E3%81%84%E3%81%A6%E4%B8%AD%E3%82%92%E8%A6%97%E3%81%8F%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%0APHP%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AF%E9%96%93%E9%81%95%E3%81%84%E3%81%AA%E3%81%8F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AA%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A7%E3%81%99%E3%80%82%0A%E3%81%A7%E3%81%99%E3%81%8C%E3%80%81%E3%81%93%E3%82%8C%E3%82%92%E3%80%8C%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%80%8D%E3%81%A8%E3%81%AF%E5%91%BC%E3%81%B3%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%0A%E3%81%9D%E3%82%93%E3%81%AA%E8%80%83%E3%81%88%E3%81%AE%E4%BA%BA%E3%81%9F%E3%81%A1%E3%81%8C%E8%A8%80%E3%81%86%E3%80%8C%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%80%8D%E3%81%AF%E3%80%8C%E4%B8%AD%E8%BA%AB%E3%81%8C%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AA%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%80%8D%E3%81%A7%E3%81%99%E3%80%82

「リンカ」というプログラムが実行に必要なファイルを全てくっつけることで、実行可能ファイルは生成されます
# 出典
https://gihyo.jp/book/2020/978-4-297-11781-8      


目的プログラム（バイナリ）とライブラリ(バイナリ）をくっつける作業のことです
# 参考
https://gihyo.jp/book/2020/978-4-297-11781-8

https://wa3.i-3-i.info/word16355.html

https://wa3.i-3-i.info/word17206.html

# 感想
今更実行ファイルのことを知った。
Imagine Cup コンテスト上位チームにみるマイクロソフトのメッセージ

# Microsoft Imagine Cup

Imagine Cupはマイクロソフトが年次開催している学生向けのAI起業コンテストです。優勝チームは賞金 $100,000 にくわえて、マイクロソフトCEOサティヤ・ナデラのメンターシップも受けられるとのこと。この Imagine Cup 、現在はファイナリスト Top3 チームまで絞り込まれていて、来週のMSBuildで優勝チームが発表される予定です。学生さんと侮るなかれ、これがなかなか各チーム興味深く、かつファイナリストの顔ぶれを見るとマイクロソフトのメッセージもうっすら伝わってくるような気がしてくるので、まとめてみました。せっかくなので去年分、2023年のTop3から。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361516/fd5796a5-eeb4-fe32-45fa-ee705d4270e7.png)


# 2023年のトップ３チーム

https://techcommunity.microsoft.com/t5/student-developer-blog/celebrating-the-innovators-of-tomorrow-announcing-the-top-3/ba-p/3784110

|チーム|国|概要|
|---|---|---|
|[Eupnea](https://youtu.be/JvJGpiJCeI8)|アメリカ|咳の音声を3秒聞かせると結核リスクを80%の精度で判定。スキンテストの画像診断や治療のゲーミフィケーションも備える。利用は無料とし政府やNGOと契約する目論見。|
|[CS-M Tool](https://www.youtube.com/watch?v=5pucBOVL-Bw)|タイ|スマホに聴診器を接続し心臓病リスクを97.6%の精度で測定。既存の医療機器にくらべ安価なので早期発見に有効。|
|[TAWI](https://www.youtube.com/watch?v=5IzXtnsMnKg) (優勝)|ケニア|APD（聴覚情報処理障害）支援。音声を認識しスマホにテキストで表示。多言語対応、月額$5、既存のソリューションにくらべ84%安価。|


# 感想
すべてのチームが「社会貢献」、ヘルスケアが２個と学習支援が１個。身のまわりの問題をAIで解決、というモチベーションは共通しているし、今現在のAI技術でも実現可能かつ既存のソリューションにくらべ安価、というスタンスも似ている。ヘルスケア２個はどちらも「病気のハイリスク群を早期発見」という、AIの精度が出なくても価値創出できる切り口を見つけてきた目のつけどころがすごい。いっけん堅実に見えるTAWIはAndroid 5でも動く後方互換性を謳っていて、これと低価格で幅広くリーチする戦略です。

# 2024年のトップ３チーム

https://techcommunity.microsoft.com/t5/student-developer-blog/announcing-the-top-three-teams-of-the-2024-imagine-cup/ba-p/4117733

|チーム|国|概要| 
|---|---|---|
|[FROM YOUR EYES](https://imaginecup.microsoft.com/en-us/Team/0d1c7e7e-176d-4136-b3aa-63a710617907)|トルコ|画像認識と動画認識を98%の精度で高速に行う視覚障害者向けアプリと、企業向け画像処理API|
|[JRE](https://imaginecup.microsoft.com/en-us/Team/86e5acd7-1e3d-41f6-8610-10a724d87886)|イギリス|鉄鋼業向けAI制御システム。鉄鋼の連続鋳造におけるスラグ検知|
|[PlanRoadmap](https://imaginecup.microsoft.com/en-us/Team/1423da2b-8581-4859-8829-48cd764972e3)|アメリカ|ADHD支援、タスク実行を支援するAIコーチ|


# 感想
なんというか、雰囲気が変わりましたね？　2023年のTop3は「学生らしさ」というか、世界を変えんとする情熱＋フレッシュな着眼点＋やや粗削りな面も、という共通項がありましたが、2024年はなんかガチになっちゃったというか、着眼点とかじゃなくて精度で勝負に来ちゃったかぁ、というか。ちょっと鼻白むところも正直ありつつ、でもまあ言われてみればこうやって資本のない若者が大企業と勝負できる点もソフトウェアの面白さでありAIによるエンパワメントの側面かもしれなくて、だいたい学生さんっていうけどAlexNetだって学生が作ったわけですしね。

2023年はChatGPTショックからのAI元年でした。2024年はどんな年になるんでしょうか？　というと、マイクロソフトは「Go to Productionの年」にしたいのだと思います。PoCの年は終わりました。AIは未来の技術ではなく、すでに世界を変革しています。AIはあらゆる人をエンパワーする素晴らしい技術です。学生起業家たちがAzureを活用し素晴らしいソリューションを現実化し世界を変革しています。みなさんもAzureを活用して世界を変えましょう。わたしたちに手伝わせてください。そんなメッセージを感じました。

ということで2024年のImagine Cup優勝は [PlanRoadmap](https://www.planroadmap.com/) になると思います！
⇒ 優勝はFROM YOUR EYESでした。おめでとうございます！
S3からR2に移行しGUIを作った

# S3高すぎる！
私は普段ゲーム開発をしており、Android向けのアプリとWindows向けのアプリは自分のwebサイトでフリー公開しています。
以前記事を書いたのですが

https://qiita.com/mizuameisgod/items/4f7986c904c58ccb610d

一つ1GB以上になるアプリデータを一日10回ダウンロードされるだけでも月300GBとなり、3000~5000円かかります。高いためcloudflareとかいう慈善団体(嘘です)が提供しているR2に移行しました。
なんとこのR2、転送(エグレス)に一切お金がかからず月1000万回のGETリクエストまで無料となっています！

https://www.cloudflare.com/ja-jp/developer-platform/r2/

しかもAWS互換の操作で動くためAWS SDKとかがそのまま使えます。
 
## ここだけ微妙

R2、なぜかコンソールから一つ当たり300MB以上のファイルをアップロードできず、API経由でしか無理です。なので作りました。

https://github.com/mizuamedesu/R2GUI
ヘキサゴナルアーキテクチャって？ - 初心者向けのやさしい解説

### **はじめに**

ヘキサゴナルアーキテクチャ、別名ポート＆アダプターアーキテクチャは、ソフトウェア設計のパターンの一つです。このアーキテクチャは、アプリケーションの主要なビジネスロジックをその他のコンポーネントから分離して、より管理しやすく、柔軟性のある構造を実現することを目的としています。この記事では、このアーキテクチャの基本概念とそのメリットを簡単に説明します。

### **ヘキサゴナルアーキテクチャの概要**

ヘキサゴナルアーキテクチャは、アプリケーションを中心に外部のコンポーネントやサービスとの接点を整理する設計思想です。具体的には、アプリケーションの核となる部分を「コア」として、その周りに「ポート」と「アダプター」を配置します。

### **コア**

これはアプリケーションのビジネスロジックを担う部分で、システムの基本的なルールやデータの処理が行われます。

### **ポート**

アプリケーションの内部ロジックと外部の要素との通信窓口となります。ここはインターフェースの形で定義され、どのようなデータが入出力されるかを規定します。

### **アダプター**

外部のシステムやデータベース、他のAPIといった具体的な技術要素とコア部分をつなぐ役割を持ちます。アダプターを通じて、異なる技術間のデータの変換や通信の詳細が処理されます。

### **ヘキサゴナルアーキテクチャのメリット**

1. **柔軟性**: 新しい技術やツールに対応するための変更が必要な場合でも、コア部分を保護しつつ容易に拡張や変更が可能です。
2. **テストのしやすさ**: コアロジックが独立しているため、外部要因に左右されることなく、単体でテストを行うことができます。
3. **再利用性**: ポートとアダプターを通じて、コアロジックを異なる環境やアプリケーションで再利用しやすくなります。

### **実践的な例**

例えば、オンラインショッピングアプリケーションで、支払い処理の仕組みを変更したい場合、支払い方法を担当するアダプターのみを新しいシステムに対応させれば良く、ビジネスロジック全体を改修する必要がありません。

### **まとめ**

ヘキサゴナルアーキテクチャは、その構造のおかげで、ソフトウェア開発において重要な柔軟性と拡張性を提供します。このアーキテクチャを採用することで、技術の進化に応じてシステムを容易にアップデートすることが可能になります。
Fatal Error Insufficient shared memory!（PHP）

## Fatal Error Insufficient shared memory!の対応

### 概要
PHPのバージョン確認しようとするとエラー（Fatal Error Insufficient shared memory!）が出たので対応メモ。

### 環境

クラウドサービス：Microsoft Azure
オペレーティングシステム：Linux（almalinux 8.8）
サイズ：Standard B1s（1 vcpu, 1 GiB メモリ）

### エラー確認

```shell
# php -v
Fri May 10 11:59:33 2024 (101741): Fatal Error Insufficient shared memory!
```

どうやらメモリ不足で正常に動作していない様子。
Swapも割り当てられていない様子。

```shell
# free -h
              total        used        free      shared  buff/cache   available
Mem:          885Mi       381Mi       145Mi        22Mi       359Mi       345Mi
Swap:            0B          0B          0B
```

### 改善対応

swapfileを作成することで、メモリ量を超えたメモリアクセスも可能にしてみる。

#### Swap領域を無効化

```shell
# swapoff /mnt/resource/swapfile 
swapoff: /mnt/resource/swapfile: swapoff が失敗しました: 無効な引数です
```

そもそも現状で無効だった様子。

#### 既存のswapfile削除

```shell
# rm /mnt/resource/swapfile 
rm: 通常の空ファイル '/mnt/resource/swapfile' を削除しますか? y
```

#### swapfileを2GBで、再作成

```shell
# dd if=/dev/zero of=/mnt/resource/swapfile bs=1M count=2048
2048+0 レコード入力
2048+0 レコード出力
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 38.5015 s, 55.8 MB/s

# chmod 600 /mnt/resource/swapfile

# ll -h /mnt/resource/
合計 2.1G
drwx------. 2 root root  16K  5月 10 08:19 lost+found
-rw-------. 1 root root 2.0G  5月 10 13:43 swapfile

# mkswap /mnt/resource/swapfile
スワップ空間バージョン 1 を設定します。サイズ = 2 GiB (2147479552 バイト)
ラベルはありません, UUID=34f63911-0113-42ca-9a8b-e878bded43f0
```

#### Swap領域を有効化 

```shell
# swapon /mnt/resource/swapfile
# swapon -s
ファイル名				タイプ		サイズ	使用済み	優先順位
/mnt/resource/swapfile                 	file    	2097148	0	-2
```

### 再確認

#### メモリ

```shell
# free -h
              total        used        free      shared  buff/cache   available
Mem:          886Mi       319Mi        57Mi        11Mi       509Mi       422Mi
Swap:         2.0Gi          0B       2.0Gi
```

#### PHP

```shell
# php -v
PHP 8.2.18 (cli) (built: Apr 12 2024 08:07:11) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.18, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.18, Copyright (c), by Zend Technologies
```
ScottPlot5でマウスドラッグを無効化する方法

## ScottPlotとは？

WindowsフォームやWPFなどに使えるグラフ描画ライブラリ。オープンソース。**最近大型アプデ（4.1→5）があった**らしい。

https://scottplot.net/

↑を見ればわかるが、マウスドラッグでグラフをぐりぐり動かせる。
**このぐりぐりを無効化したい。**

## 結論

コードビハインド（WPFだと`.xaml.cs`）にこれを書く。

```csharp:XY軸を両方固定
// WpfPlot1 がグラフコントロール

// マウスドラッグを禁止する
WpfPlot1.Loaded += (sender, e) =>
{
  var axes = WpfPlot1.Plot.Axes;
  var limits = axes.GetLimits();
  
  ScottPlot.AxisRules.LockedHorizontal rule1 = new(axes.Bottom, limits.Left, limits.Right);
  ScottPlot.AxisRules.LockedVertical rule2 = new(axes.Left, limits.Bottom, limits.Top);
  
  axes.Rules.Add(rule1);
  axes.Rules.Add(rule2);
  
  WpfPlot1.Refresh();
}
```

## ポイント

- コードビハインドのコンストラクタにそのまま書くと、グラフデータが表示されなくなる
- ドラッグを禁止するかどうかは軸ごとに設定されるので、軸を増やした場合はそれぞれにルールを設定する
- 今回は表示時には固定したかったので`Loaded`イベントを使ったが、ボタンクリックイベントとかでも問題無く動く
- **ネット上にあるほとんどの情報はScottPlot4.1のものなので、5には使えない**
Rustで文字列を数える

# 文字列を数えたい
プログラムを書いているとある文字列が何文字であるのか数えたくなる瞬間がある。今回はたまたまRustでそのようなシチュエーションに遭遇したとする。

取り合えず以下のようなプログラムを考える
```rust
fn main() {
	let value = "ハローワールド";
}
```

`value`変数に入っている`&str`の長さが知りたいとする。
雑にエディタのサジェスチョンを見ると`&str`型に`len()`関数があるのが分かる
というわけでコードを以下のようにしてみる

```rust
fn main() {
	let value = "ハローワールド";
	let len = value.len();
	assert_eq!(7, len);
}
```

直感的には通りそうだがこれは実行時エラーとなる

# len
`len`変数の中身を確かめてみると`21`となってる。なぜか。
`&str.len(&self)`のドキュメントを読んでみると以下のようになっている。

> `self`の長さを返す
> ここでいう長さとは**バイト数**であり、文字数ではない。いいかえれば、人間の考える文字列の長さではない場合がある。
>  [str - Rust](https://doc.rust-lang.org/nightly/std/primitive.str.html#method.len)より筆者訳

`len`は文字列の長さではなくバイト長を返すらしい。
日本語、というかASCIIでない文字はバイト数が1ではないため返り値と文字列の長さが一致しない。emojiなども同様である🤔
実際に`ハローワールド`を`utf-8`に直すと以下のようになり、21バイトである。
```
\xe3\x83\x8f\xe3\x83\xad\xe3\x83\xbc\xe3\x83\xaf\xe3\x83\xbc\xe3\x83\xab\xe3\x83\x89
```

では、文字数を数えるにはどうすればよいのか

# chars, count
文字数を数えたい場合には一般的に以下のようなコードを書く
```rust
fn main() {
	let value = "ハローワールド";
	let len = value.chars().count();
	assert_eq!(7, len);
}
```

> `chars()`は文字列スライスの、1文字に関するイテレータを返す
>  [str - Rust](https://doc.rust-lang.org/nightly/std/primitive.str.html#method.len)より筆者訳

`count()`はイテレータの長さを返すので事実上文字列の長さとなる。
しかしドキュメントにはこのような記載もある。

> `char`はUnicodeのスカラー値を表し、あなたの考える文字とは一致しない可能性があることが重要だ。あなたが実際に欲しいのは、書記素クラスタに対する反復処理かもしれない。この機能はRustの標準では提供されていないのでcrate.ioをチェックしてほしい
>  [str - Rust](https://doc.rust-lang.org/nightly/std/primitive.str.html#method.len)より筆者訳

# 書記素クラスタとは
書記素クラスタとは、人間が1文字として認識する最小単位であるらしい。
Unicodeでは以下のように求められると定まっている。
https://unicode.org/reports/tr29/

Rustで書記素クラスタを扱う場合は[unicode-segmentation](https://crates.io/crates/unicode-segmentation)を使用するのが一般的なように見える。(筆者の観測範囲内で)
ドキュメントのexampleによればこのように使用できるようだ
```rust
use unicode_segmentation::UnicodeSegmentation;

fn main() {
    let s = "a̐éö̲\r\n";
    let g = s.graphemes(true).collect::<Vec<&str>>();
    let b: &[_] = &["a̐", "é", "ö̲", "\r\n"];
    assert_eq!(g, b);

    let s = "The quick (\"brown\") fox can't jump 32.3 feet, right?";
    let w = s.unicode_words().collect::<Vec<&str>>();
    let b: &[_] = &["The", "quick", "brown", "fox", "can't", "jump", "32.3", "feet", "right"];
    assert_eq!(w, b);

    let s = "The quick (\"brown\")  fox";
    let w = s.split_word_bounds().collect::<Vec<&str>>();
    let b: &[_] = &["The", " ", "quick", " ", "(", "\"", "brown", "\"", ")", "  ", "fox"];
    assert_eq!(w, b);
}
```
[unicode-segmentation - crates.io: Rust Package Registry](https://crates.io/crates/unicode-segmentation)より引用

# まとめ
- `len`はバイトの長さを返す 
- `chars().count()`は文字数を返す
- 書記素クラスタを考慮する場合はcrateを使う

# 参考文献
- [str - Rust](https://doc.rust-lang.org/nightly/std/primitive.str.html#method.len)
- [unicode-segmentation - crates.io: Rust Package Registry](https://crates.io/crates/unicode-segmentation)
- [unicode](https://home.unicode.org)
robloxでassistant その44

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
マウスクリックしたら、爆発させよ。

# 手順
- workspaceに、partを追加。
- partに、clickdetectorを追加。
- partに、scriptを追加。
- スクリプトを書く。
```
local part = script.Parent
local explosionSound = Instance.new("Sound")
explosionSound.SoundId = "rbxassetid://5137964328"
explosionSound.Parent = part
local function explode()
	local explosion = Instance.new("Explosion")
	explosion.BlastRadius = 10
	explosion.BlastPressure = 500000
	explosion.Position = part.Position
	explosion.Parent = game.Workspace
	explosionSound:Play()
end
local clickdetector = part:WaitForChild("ClickDetector")
clickdetector.MouseClick:Connect(function(player)
	explode()
end)
```


以上。
Now Assist for Virtual Agent(AIチャットボット)の導入を考えたうえでのメモ書き

## サマリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/a385dd3f-88d5-41a3-7593-26b4d44d07fe.png)

## 参考：
#### 1.ServiceNow Now Assist for VAの導入事例（海外）
「[ASMLはAI対応の仮想エージェントで従業員をサポート](https://www.servicenow.com/customers/asml.html)」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/f92c8368-f120-c129-04d9-7d1758d05788.png)
⇒非常に参考になる導入事例だが、これでもITSM Proにとどまる。ServiceNowの公開プレスはちょっと見当たらないかな。

#### 2.TwitterのPost
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/94f18c96-ab49-6545-7bbf-5c7a68d5ade4.png)
deflection[回避測定基準（ssa_deflection_metric）]テーブルを活用する。ことでチャットボット（≒セルフサービスによる自動解決率）を探れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/d06b5908-7b6d-5c47-3641-829e7af8ada6.png)
このテーブルのアクティビティパターンを集計して解決率を出せばよい（？）
Now Assist for Virtual Agentをpilot導入して、その前後の回避率を検討すれば、それは効果測定として資するのでは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/2fad3d12-3877-50e0-e39f-ac7e10c4139b.png)

#### 3.Now Assist for VAではなく内部的にChatGPTと連携するという解決策
[ServiceNow Virtual Agent と ChatGPT を連携してみた](https://www.niandc.co.jp/tech/20231222_43680/):日本情報通信株式会社より引用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/be4a713a-7f83-7254-18b0-5a94bf0959ce.png)
実装の詳細は引用元の記事を参照のこと。
効果：ServiceNowでChatGPTを活用してセルフサービス化をできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/b8680e2d-e0f2-fbbb-57ee-d59f8c53dced.png)
Pros：最高のAIであるOpenAIを使える。コストはEnterpriseよりやすい。
Cons：AIを使っているものの、Now Assistを使っているわけではない。RAG（拡張AI）を使うという生産性向上には寄与しない。


### 感想
AIを担ぎたいニーズの高まりを感じつつも、具体どのように行うかという実行の段階でいろいろと模索しており、考えたさなかのメモ書きを書き記す。
rex0220 項目検証プラグイン テーブル内項目の非表示

[項目検証プラグイン](https://qiita.com/rex0220/items/be20fd879f5e1bc9e035)で、テーブル内項目の非表示を行う例です。

# 概要

[項目検証プラグイン](https://qiita.com/rex0220/items/be20fd879f5e1bc9e035)は、入力項目必須チェック、バリデーションチェック、入力抑止、表示制御の処理条件を計算式で指定するプラグインです。

テーブル内項目の「まとめ」項目をまるごと非表示にします。
※「まとめ」項目は、計算式プラグインで交通手段とその他の値を連結しています。

![2024-05-15_10h22_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a370701e-73c0-cebe-56fa-b8051806c03d.png)

![2024-05-15_10h26_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/aafcdf4e-f192-e8cd-f8f3-1098298c95e3.png)

# 項目検証プラグイン設定

テーブル項目の編集ボタンをクリックして、テーブル内項目非表示のダイアログを表示

![2024-05-15_10h27_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/4cccffad-f09d-42fc-b2a6-5c50fba3118e.png)

テーブル内項目非表示で、非表示にする項目をチェックして、条件を指定
※いつも非表示にする場合は、「1」

![2024-05-15_10h28_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b67b66ad-3064-a73b-1690-e054766da21c.png)


# 計算式プラグイン設定

まとめ項目に、交通手段とその他の値を連結

![2024-05-15_10h31_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/14779b4b-be35-6d20-5752-fc327b3b14ce.png)

```.js
// テーブル.まとめ SINGLE_LINE_TEXT
交通手段&IF(IN(交通手段,"その他"),":"&その他)
```
docker-composeを使用してコンテナ作成


# docker-composeを使用してコンテナ作成

前回、docker run hello-world　でイメージを作成をしましたが
今回は、docker-compose.ymlを使って起動をします。



ドライブの適当な場所に、フォルダを作成し、まずはdocker-compose.ymlファイルを作成します。

docker-compose.ymlの中身は以下のように記載します。


``` yml
version: "3"
services:
  hello:
    image: hello-world:latest
```

ファイルを保存し、docker-compose.ymlの上のフォルダの場所でコマンドを

```bash
docker-compose up
```

> docker-compose up


と入力し起動します。

docker-compose.ymlの記載に間違いがなければ、公開用のhello-worldイメージを取得して使用して新しいコンテナが起動することができます。

![スクリーンショット 2024-05-15 102753.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544972/30cfa582-752e-d1fe-ee96-1c9cb5dc5baa.png)
robloxでassistant その43

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
マウスクリックしたら、音を鳴らせ。

# 手順
- workspaceに、partを追加。
- partに、clickdetectorを追加。
- partに、scriptを追加。
- スクリプトを書く。
```
local part = script.Parent
local explosionSound = Instance.new("Sound")
explosionSound.SoundId = "rbxassetid://5137964328"
explosionSound.Parent = part
local clickdetector = part:WaitForChild("ClickDetector")
clickdetector.MouseClick:Connect(function(player)
	explosionSound:Play()
end)
```


以上。
robloxでassistant その42

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
TweenServiceサービスを使え。

# 手順
- workspaceに、partを追加。
- partに、clickdetectorを追加。
- partに、scriptを追加。
- スクリプトを書く。
```
local part = script.Parent
local clickdetector = part:WaitForChild("ClickDetector")
local TweenService = game:GetService("TweenService")
local tweenTime = 2
local targetPosition = Vector3.new(20, 1, 0)
local tweenInfo = TweenInfo.new(tweenTime)
local tween = TweenService:Create(part, tweenInfo, {
	Position = targetPosition
})
clickdetector.MouseClick:Connect(function(player)
	tween:Play()
end)

```


以上。
基本情報に合格したので私の勉強方法を紹介します

## 概要
2024年5月3日に、基本情報技術者試験を受験し、合格することが出来ました。
社内でも基本情報技術者試験でつまづく方が多く見受けられます(私も元々その一人でした)。
そこで、私が合格するために実践した勉強方法を共有したいと思います。
この記事が同じように苦戦している方のお役に立てば幸いです。

## 実際に行っていた勉強方法
### 科目A
- キタミ式イラストit塾 基本情報技術者本
    - 基本情報技術者試験の有名な参考書です
- YouTubeの視聴
    - [【基本情報技術者試験YouTuber】すーさん](https://www.youtube.com/@kihonzyouhou/featured)
- 過去問道場
    - [基本情報技術者過去問道場](https://www.fe-siken.com/fekakomon.php)

最初に「キタミ式イラストIT塾 基本情報技術者本」を1周軽くざっと読みました(この時点で完璧に理解する必要はありません)。
さらに、電車での移動中などに「すーさんのYouTube動画」を視聴していました。

試験の雰囲気がつかめてきたところで、「過去問道場」に移行しました。過去問道場では、平成30年春期から令和元年秋期の範囲で、「計算のみ」と「計算以外」の2パターンで問題を繰り返し解きました。

※ 範囲の指定は、「令和元年秋期の計算問題のみ」や「平成30年春期の計算以外」のように個別で設定していました。
※ 過去問道場利用中も分からない用語が出てきた時に「キタミ式イラストIT塾」と「YouTube」を参照していました。

### 科目B
- IPAのサンプル・公開問題
    - [基本情報技術者試験　科目Bのサンプル問題](https://www.ipa.go.jp/shiken/syllabus/ps6vr7000000oett-att/fe_kamoku_b_sample.pdf)
    - [基本情報技術者試験　科目B　サンプル問題　問題冊子](https://www.ipa.go.jp/shiken/syllabus/henkou/2022/ssf7ph000000h5tb-att/fe_kamoku_b_set_sample_qs.pdf)
    - [令和5年度　基本情報技術者試験　科目B　公開問題　問題冊子](https://www.ipa.go.jp/shiken/mondai-kaiotu/sg_fe/koukai/t6hhco0000003zx0-att/2023r05_fe_kamoku_b_qs.pdf)
- 出るとこだけ 基本情報技術者 科目B本
    - こちらも基本情報技術者試験で有名な参考書です

科目Bの学習は、まず「出るとこだけ 基本情報技術者 科目B」を使って解き方を覚え、付属の問題集やIPAが公開している問題をひたすら解きました。

**1回目の試験では科目Bが不十分だったため、追加で以下の方法で再度学習しました。**

### 科目A(2回目)
- 令和06年 基本情報技術者 パーフェクトラーニング過去問題集

もともと科目Aは合格していたため、1周だけ再確認しました。

### 科目B(2回目)
- 令和06年 基本情報技術者 パーフェクトラーニング過去問題集
- YouTubeの視聴
    - [【基本情報技術者試験YouTuber】すーさん](https://www.youtube.com/watch?v=wFpyeWto8Og)
    - 動画の概要欄にIPAの公開問題が記載

2回目の試験時には新しい動画が追加されていたため、これも活用しました。「出るとこだけ 基本情報技術者 科目B」は解答方法が丁寧で分かりやすいですが、試験で同じ方法を使用して解答を行うと時間がかかるため、YouTubeの動画解説が非常に参考になりました。

「出るとこだけ 基本情報技術者 科目B」では、プログラムの処理を1行ずつ詳細に追う方法が紹介されています。一方、YouTubeの動画では、プログラムの値の遷移に焦点を当て、効率的に解答する方法や、プログラムの推測後に値の推測を行うことで試験時間を短縮する方法が紹介されています。

## まとめ
2回目の試験時点である程度の知識があったため、最初から取り組む人にどこまでおすすめできるかは分かりませんが、私にとっては以下の方法が非常に効果的でした。

科目A
- 「YouTubeの視聴」後に、「令和06年 基本情報技術者 パーフェクトラーニング過去問題集」を解く

科目B
- 「YouTubeの視聴（アルゴリズム対策）」後に、同じく「令和06年 基本情報技術者 パーフェクトラーニング過去問題集」を解く

総合的に、「YouTubeの視聴」と「令和06年 基本情報技術者 パーフェクトラーニング過去問題集」を解くことが効果的であると感じました。

## 参考書のURL
- [キタミ式イラストit塾 基本情報技術者本](https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C05%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF-%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297131862)
- [出るとこだけ 基本情報技術者 科目B本](https://www.amazon.co.jp/%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%95%99%E7%A7%91%E6%9B%B8-%E5%87%BA%E3%82%8B%E3%81%A8%E3%81%93%E3%81%A0%E3%81%91%EF%BC%81%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%EF%BC%BB%E7%A7%91%E7%9B%AEB%EF%BC%BD%E7%AC%AC4%E7%89%88-%E6%A9%8B%E6%9C%AC-%E7%A5%90%E5%8F%B2/dp/4798182524)
- [令和06年 基本情報技術者 パーフェクトラーニング過去問題集](https://www.amazon.co.jp/%E4%BB%A4%E5%92%8C06%E5%B9%B4-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E9%81%8E%E5%8E%BB%E5%95%8F%E9%A1%8C%E9%9B%86-%E5%B1%B1%E6%9C%AC-%E4%B8%89%E9%9B%84/dp/4297138832)
robloxでassistant その41

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
Debrisサービスを使え。

# 手順
- workspaceに、partを追加。
- partに、clickdetectorを追加。
- partに、scriptを追加。
- スクリプトを書く。
```
local part = script.Parent
local clickdetector = part:WaitForChild("ClickDetector")
local Debris = game:GetService("Debris")
clickdetector.MouseClick:Connect(function(player)
	local clonedBomb = part:clone()
	local x = math.random(-100, 10)
	local z = math.random(-100, 10)
	clonedBomb.Position = Vector3.new(x, 100, z)
	clonedBomb.Parent = game.Workspace
	Debris:AddItem(clonedBomb, 5)
end)



```

以上。
Dictionary に気軽に TryAdd しても良いのか

以下のようなケースについて考えます。

```csharp
Dictionary<string, object> dict = new();

dict.TryAdd("A", new());
dict.TryAdd("B", new());
dict.TryAdd("C", new());
```


- [意図通り動作するが…](#意図通り動作するが)
- [GitHub を見て安心感を得る](#github-を見て安心感を得る)
	- [`Interlocked` は？](#interlocked-は)
- [おまけ](#おまけ)



# 意図通り動作するが…

`TryAdd(key, new())` するとは辞書に追加されない場合もオブジェクトがインスタンス化されてるよね？ っていうお話です。


<p><details lang="ja" --open><summary>テストコード</summary>

実行環境： https://dotnetfiddle.net/

```csharp
using System;
using System.Collections.Generic;
using System.Threading;

public class Program
{
	public class Test
	{
        static int counter = 0;
		public Test()
		{
			Console.WriteLine("Test ctor: " + counter++);
		}
	}
	
	public static void Main()
	{
		var dict = new Dictionary<string, Test>();
		dict.TryAdd("A", new());
		dict.TryAdd("A", new());
		dict.TryAdd("A", new());

        // TryAdd での new() を避けるには・・・
        if (!dict.ContainsKey("A"))
        {
            dict.Add("A", new());
        }

		Console.WriteLine("count: " + dict.Count);

		var ilock = new Test();
		Interlocked.CompareExchange(ref ilock, new(), null);
		Interlocked.CompareExchange(ref ilock, new(), null);
		Interlocked.CompareExchange(ref ilock, new(), null);
	}
}
```

<!------- End of Details JA Tag -------></details></p>


テスト結果は以下の通り。new() の数だけオブジェクトが作られて `TryAdd` `CompareExchange` に渡され、そして不要なら破棄されます。

条件が整った時のみ式を実行する特別扱いされたメソッドではないという事ですね。


```javascript
Test ctor: 0
Test ctor: 1
Test ctor: 2
count: 1
Test ctor: 3
Test ctor: 4
Test ctor: 5
Test ctor: 6
```

> コンパイラー側で良い感じにしてくれても良くね？ と思うも勝手に式の優先順位変えるのはあり得ないか。辞書に限っては foreach の配列特別扱いと同様に `ContainsKey + Add` へ展開してくれても良さそうな気はする。





# GitHub を見て安心感を得る

誰でもつい書いちゃうよね？ という安心感を得るために公式のソースを狙い撃ちして探します。

> 検索ワード（検索結果への直リンクだと何故か一件も引っかからない）  
> `language:C# /\.TryAdd\(.*,.*new.*\(\)\)/ AND (/namespace.*Microsoft/ OR /namespace.*System/)`

https://github.com/search?q=language%3AC%23%20%2F%5C.TryAdd%5C(.*%2C.*new.*%5C(%5C)%5C)%2F%20AND%20(%2Fnamespace.*Microsoft%2F%20OR%20%2Fnamespace.*System%2F)&type=code

--

オブジェクトを作るだけ作って即時破棄するようなコードパスは少ないですが、無くはないです。良かった！





## `Interlocked` は？

こっちも同志が見つかります 😊

> `language:C# /Interlocked\.CompareExchange\(ref.*,.*new.*\(\),.*null\)/ AND (/namespace.*Microsoft/ OR /namespace.*System/)`

https://github.com/search?q=language%3AC%23%20%2FInterlocked%5C.CompareExchange%5C(ref.*%2C.*new.*%5C(%5C)%2C.*null%5C)%2F%20AND%20(%2Fnamespace.*Microsoft%2F%20OR%20%2Fnamespace.*System%2F)&type=code





# おまけ

調べたときにちょいちょい見かけた `Interlocked.CompareExchange` を使ってダブルチェックを行うワンライナー。

```csharp
return obj ?? Interlocked.CompareExchange(ref obj, new(), null) ?? obj;
```

> `new()` 部分を遅延実行するような書き方は思いつかなかったし公式ソースにも見当たらなかったから多分無理？


👇 ダブルチェック

https://qiita.com/sator_imaging/items/6c60e462417a5235778a


--


`ConcurrentDictionary` や `Interlocked.CompareExchange` はしょうがない（？）かもですが、普通の `Dictionary` での TryAdd + new() は神経質になるほどではないが気に留めておいて次からは気を付けましょう、という感じでしょうか。

<!--
流石に lock 用のオブジェクトをアプリ生存期間中ずっと保持してまでは、でしょうか。
-->

以上です。お疲れ様でした。
Flutter/Dart 早期リターンとは？



## そもそも、早期リターンとは...？
早期リターンとは、プログラム実行中に特定の条件が満たされた場合に、関数やメソッドから抜けることを指します。


### 利点
 **早期リターンを使用することで以下のメリットがあります。**
1. コードの可読性が向上
1. 不要な処理を省略することでパフォーマンスの向上
1. エラーハンドリングが容易さ向上
1. コードのネストが減り、複雑さが低減
1. バグを防ぎ、プログラムの信頼性が向上する。

### 使用方法

以下の関数では与えられた価格に割引を適用します。
`discountPercentage` が0以下の場合は計算を行わずに早期リターンで `price` を返しています。
こうすることで、無駄な処理をする必要がなくなりパフォーマンスが向上します。
```dart
int calculateDiscount(double price, double discountPercentage) {
  if (discountPercentage <= 0) {
    return price; // 割引率が0以下の場合は元の価格を返す
  }
  double discountedPrice = price - (price * (discountPercentage / 100));
  return discountedPrice;
}
```

# まとめ
早期リターンを使用することで、不要な処理を省くことでパフォーマンスが向上しコードの可読性が向上します。
ぜひ意識してコードを書いてみてください。

# 告知
最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。

https://eda-inc.jp/recruit/

みなさまからのご応募をお待ちしております。
JupyterHubでmatplotlibのグラフを日本語表示する

# 問題概要
UbuntuシステムにJupyterHub環境を構築した。Matplotlibでグラフを描画できるが、UTF-8文字コードの日本語が表示されず、文字化けしてしまう。

# 背景情報
### Ubuntuシステム環境
AMD64マシンで以下のUbuntuおよびPythonを実行。
* Distributor ID: Ubuntu
Description:    Ubuntu 22.04.4 LTS
Release:        22.04
Codename:       jammy
* Python 3.10.12
* python3-venv/jammy-updates,jammy-security,now 3.10.6-1~22.04 amd64

### JupyterHub環境
venv環境で以下のJupyterHubを実行。systemdで起動させる。
* jupyter_client==8.5.0
* jupyter_core==5.5.0
* jupyter_server==2.9.1
* jupyter_server_terminals==0.4.4
* jupyterhub==4.0.2
* jupyterlab==4.1.8
* jupyterlab-widgets==3.0.9
* jupyterlab_server==2.27.1
* matplotlib==3.8.1
* matplotlib-inline==0.1.6

# 解決策の概要
japanize_matplotlibではseabornなどmatplotlibを利用するモジュールのimportの前後関係に依存してprimary fontが変更され日本語が乱れることがあるとの情報があった。
```
import japanize_matplotlib
import seaborn
```
また、fontManagerへのフォント登録でも同様な懸念がある。
```
font_path = '/xxx/venv/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/ipaexg.ttf'
font_prop = fm.FontProperties(fname=font_path)
font_name = font_prop.get_name()
fm.fontManager.addfont(font_path)
font_family = plt.rcParams['font.family']
plt.rcParams['font.' + font_family[0]].insert(0, font_name)
```
そこで、Matplotlibでfont設定するmatplotlibrcを修正することで対応し、ユーザープログラムの変更を不要とした。

# 手順
1. JupyterHubを停止する。
```
$ sudo systemctl stop jupyterhub.service
```
::: note info
サービス名は各ユーザーシステムに合わせてください。
:::
2\. matplotlibrcのオリジナルを保管。
```
$ sudo cp /xxx/venv/lib/python3.10/site-packages/matplotlib/mpl-data/matplotlibrc /xxx/venv/lib/python3.10/site-packages/matplotlib/mpl-data/matplotlibrc.original
```

3\. matplotlibrcを修正。
```
262c262
< #font.family:  sans-serif
---
> font.family:  sans-serif
270c270
< #font.sans-serif: DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
---
> font.sans-serif: Noto Sans CJK JP, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
```
::: note info
デフォルト設定のfont.familyであるsans-serifをそのままに、font.sans-serifの先頭に日本語フォントを設定する。Noto Sans CJK JPはipaexg.ttfのように追加せずとも元々インストールされている。
:::
::: note info
修正するfont.sans-serifの行は、#でコメントしていても、記述が2つあると設定エラーとなるため、書き換える場合は#行でコピーを残さない。
:::

4\. JupyterHubを再起動。
```
$ sudo systemctl restart Jupyterhub.service
```
::: note info
サービス名は各ユーザーシステムに合わせてください。
:::

# 結果
各ユーザーが特別なモジュールのimportやfont設定せずとも日本語表示ができました。

# 注意事項
取り敢えず日本語表示できれば、という目的には合致しています。seabornのimportとの背反などの詳細な検証はできていませんが、仕組みから言ってあまり問題なさそうと考えています。
生成 AI アプリケーション:スマート入力(SmartFill)

最近、生成式AIをベースにした小さなツールを開発しました。このツールの機能は、侵入性がなくユーザーの入力効率を向上させることです。主に重複する入力が必要なフォームで使用され、元の情報内容と入力するフォームの内容が一致しない場合、SmartFillはこれらの内容を分析し、自動的にページのフォームに記入します。ソースコンテンツはテキスト、音声、画像などのマルチメディア情報である可能性があります。

私はそれにSmartFillという名前を付けました。その非侵入性は、Chromプラグインをロードすることで実現されます。以下に、使用プロセスについて簡単に説明します。

**第一歩：**ログインし、メールで認証コードを取得し、ユーザーを確認して設定を保存します。ログイン後は、以前の設定を直接利用できます。

![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRBKkHuETibib1pcImm6YMpJ3JF4XbuP4aLHn5Nfgduq0YBWa5jJfXVdTianK1NH73MvGxysQ3XhR3Bxw/640?wx_fmt=png&from=appmsg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)

（図一）

**第二歩:** 設定、プラグインは自動的にユーザーページのすべての入力が必要なフォームを取得します。各フォームにはPormpt属性を追加するだけです。この属性は主にAIがデータを取得するためのヒント情報として使用されます。Promptはデータの出所に応じて柔軟に記述でき、変換、抽出、計算などを行うこともできます。

フォームが多い場合は、「Index：0」などのボタンで位置を特定でき、より素早く入力フォームを見つけることができます。

urlの設定は、ユーザーがSmartFillを使用するページを特定するために使用されます。このurlは使用によって変化する可能性がありますが、変動する部分は{*****}、この固定文字列で置き換えることができます。図のように示されています。

サブマークは、同じurlに複数の入力形式がある場合に区別するための印です。

現在、設定後に人工での確認プロセスがあります。一つには、現在は試用段階であり、二つ目には、結局のところ、AIを接続するには費用がかかるからです。

![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRBKkHuETibib1pcImm6YMpJ3JibaibdDGyLhiaeHdYsl76C4N2rLYvIyhgWkdGVxiaOgwlOrX9sTxgzQ33w/640?wx_fmt=png&from=appmsg)

（図二）

**第三歩:** 使用、現在日本のマイクロソフトのアドレスを例に、以下のurlは日本のマイクロソフトのアドレスページです：

A、**テキスト:** urlを開いて住所情報をコピーし、貼り付けて送信すると、以下の図のように情報が自動的にページのフォームに入力されます。

![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRBKkHuETibib1pcImm6YMpJ3JLMfJibUmqRNZgGq6MCdFHBIKOGCf5MzqPCsiau70VtgZJzreibwtcPCHw/640?wx_fmt=png&from=appmsg)

（図三）

B、**画像:** 図四は上記Urlページのスクリーンショットで、同様に、この画像をアップロードすると、SmartFillは画像を分析し、文字を取得して、ページのフォームに記入します。図五のように。

![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRBKkHuETibib1pcImm6YMpJ3J7cbvajAWs7t4ErWiariczqgsvic148Cm58yNzISfmyseVyYY0uJ3ZLe0w/640?wx_fmt=png&from=appmsg)

（図四）

![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRBKkHuETibib1pcImm6YMpJ3JYt7bd252zyM1JldB8qO2HGNvfMSU2es6BznBCrwAxCQtYrBK4l6byA/640?wx_fmt=png&from=appmsg)

（図五）

B、**音声:** 長押しで音声を記録し、自然言語で表現すると、特に長文の入力に適しており、より迅速に入力できます。もちろん、音声を使って特定のフォームの値を調整することも可能で、パフォーマンスも悪くありません。

![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRB6tgZ3lDYIsbjvV1Ij9CKkibq66ZyQiatBte0oo7MCYFAoXMOHF5f54jKYtLedZ3MmtKskfcDF26AQ/640?wx_fmt=png&from=appmsg)

（図六）

設定中の各フォームのPromptは一度に完成するものではなく、数回の調整を経て徐々に改善されていきます。

SmartFillのChromeプラグインは途中です。失くならなければ、お待ちください……
(Translated by GPT)

元のリンク：https://mp.weixin.qq.com/s?__biz=MzA3NDM1MzIyMQ==&mid=2247488116&idx=1&sn=58248196ef7999fe5236253ff060f22f&chksm=9f004d5ea877c448f88504fb99b9bbf70aa0520d68429fed3186c0a437b6c141515e4dd446f6&token=1465685282&lang=zh_CN#rd&wt.mc_id=MVP_325642