OmniAICreator/Qiita-1.07M huggingface dataset:
LTspice のインピーダンス測定機能で大信号周波数応答をみる

# 非線形性を考慮した入出力特性の周波数特性をみたい

AC 解析は小信号応答を見るので，波形が飽和するような回路の周波数特性は見れません．飽和を見るには過渡解析が必要なので，入力信号の周波数をスイープしながら過渡応答解析を繰り返し，それぞれの結果から基本周波数成分を抜き出してプロットすればできるはずですが， LTspice に新しく追加された機能を使うと少しの工夫で見れることが分かったのでご紹介します．

# やり方の概要
Transient Frequency Response 解析と，fra ブロックと組み合わせて使います．この機能でできる解析は，以下の2つです．

* Gain vs. Frequency (負帰還回路の開ループ利得を解析)
* Impedance vs. Frequency (電流を流したときに生じる電圧からインピーダンスを計算)

今回は後者を使います． fra ブロックは電流を出力し，その時の電圧を読み取って比をとることでインピーダンスを計算していますので，この電流を電圧に変換して対象の回路への入力とし，回路の出力を fra ブロックに電圧として戻します．これにより Transient Frequency Response 解析が「インピーダンス」として表示されるものが，回路の入出力特性になります．

# 使用例：電圧振幅が飽和するLPF

#### テストベンチの設定

使う回路を以下にしめします．周波数応答を見る対象 (DUT) は入力ノードX，出力ノードYとする，CRフィルタです．ただし，B1で電圧振幅を制限しています．

この DUT に対してfra ブロック @1 を接続します．@1 が出力する電流は電流制御電圧源 H1 で電圧に変換されて DUT の入力に与えられます．出力Yは電圧制御電圧源 E1 を介して @1 に戻します．

（E1 がない場合，@1 の出力する電流がノードYからDUTに流れ込んでしまうため，うまくいきません．）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227884/2ca3d60f-7eb8-e688-6cf3-f5098c198c53.png)

@1 の設定はこちらです．注意するのは以下の3点です．
1. Analysis Type を Impedance vs. Frequency にする
1. Max # of Simultaneous Harmonics を 1 にする
1. pp0 を 2 にして，pp1, F0, F1 は空欄にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227884/63e4f850-6803-8b40-a32f-ca9e9b3c241d.png)

pp0 は，DUT に印加する電圧が片振幅 1V になるように設定しました．設定としては 2App ですが，前述したように H1 （今回は 1 V/A）で電圧に変換されます．

Max # of Simultaneous Harmonics は複数の周波数成分を重ね合わせることでシミュレーション時間を短縮する設定です．Max # of Simultaneous Harmonics = 1 および 2 の時のノードX の波形を見ると，Max # of Simultaneous Harmonics = 2 では高調波が重畳され，時間は半分で済んでいます．また，電圧振幅は高調波成分を含めて 2Vpp に調整されています．

今回は非線形性の影響が見たいので Max # of Simultaneous Harmonics = 1 にしておきます．

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227884/4e3fc7bc-4493-dfce-195c-ecad7c0be61c.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227884/8f663f3d-9e0b-16e2-cc68-99b936bf5e4b.png)|
|--|--|
|Max # of Simultaneous Harmonics = 1 | Max # of Simultaneous Harmonics = 2|

この信号が B1 によって飽和させられた，ノード X1 での波形を以下に示します．橙 (飽和ナシ) は正弦波ですが，赤 (飽和アリ) は ±1V の矩形波に近くなっています．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227884/c89d3608-1b0d-e557-c06f-8eb581b49e8b.png)

#### シミュレーション結果

シミュレーション結果を以下に示します．橙が飽和ナシ，赤が飽和アリです．

飽和していない場合 (橙) の低周波利得は 0 dB で，160kHz 付近でカットオフしています．これは 1次 CR LPF の特性として期待されるものです．一方飽和ありの場合 (赤) の低周波利得は 2.09 dB です．これは，片振幅 1V の矩形波の基本周波数成分が $4/\pi$ V で， $20\log(4/\pi) = 2.09$ であることと整合します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227884/adf46856-59db-d1ef-34bf-32881c4a27d0.png)

# まとめ
fra ブロックと Transient Frequency Response 解析を使用して，電圧入力，電圧出力の回路の周波数特性を非線形性を考慮した状態で解析し，その基本周波数成分をプロットする手順を示しました．
変数の完全コピーにおける代入・copy・copyメソッド・deepcopyの使い分け表

# はじめに
　コピーには浅いコピーと深いコピーがあって…という記事はありますが、「どう使い分ければ良いの？」という観点の情報がないので表形式でまとめました。

# 本記事におけるコピーの目的
　本記事ではオリジナルの変数値を書き換わらない形で別の変数に完全にコピーすることを目的とします。そのため部分的にコピーしたい場合については目的外とします。

```python:オリジナルの値が書き換わる例と書き換わらない例
import copy
# オリジナルの値を用意
a = [0, 1, 2]

# ２つの変数にオリジナルの値をコピー(?)する
a_copy = copy.copy(a)  # copyを使う
a_assignment = a  # 代入する

# オリジナルの値を書き換える
a[0] = 1

# コピー(?)した値を確認する
print(a_copy)  # [0, 1, 2]値が書き換わっていない！目的通りの動き！
print(a_assignment)  # [1, 1, 2]値が書き換わっている…目的の動きになっていない…
```

# 本記事で扱わないこと
- イミュータブルやミュータブルの詳しい説明は[他の方の記事](https://yumarublog.com/python/mutableimmutable/)が詳しいため、この記事では扱いません。
- 詳しい動作まで説明しません。各手段の使い分けがこの記事の目的です。詳しく知りたい方は[こちら](https://docs.python.org/ja/3/library/copy.html#module-copy)を参照してください。
- 上記の理由から組み込み関数id()を使った確認コードは示しません。

# 使い分け表
　[コピーの目的](#コピーの目的)を達成したいときは以下のよう代入、copy、copyメソッド、deepcopyを使い分けると良いです。△については後述します。
```python:表で使われる言葉の定義
import copy
a = [0, 1, 2]  # オリジナルの値

# 表で使われる言葉は以下の処理を意味します
a_assignment = a  # 代入
a_copy = copy.copy(a)  # copy
a_copy_method = a.copy()  # copyメソッド
a_deepcopy = copy.deepcopy(a)  # deepcopy
```
| オブジェクトの種類 | 型の例 | 　具体例　　 |代入　| copy | copyメソッド　　| deepcopy |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| イミュータブル | int, strなど  | 1 | ○ | [△](#イミュータブルの△) | - | [△](#イミュータブルの△) |
| ミュータブル | list, dictなど  | [0, 1]  | × | ○ | ○ | [△](#ミュータブルの△について) |
| ミュータブル(複合オブジェクト) | 入れ子構造のlist, dictなど | [0, 1, [2, 3]] | × | × | × | ○ |

○…目的の動きをする最小のコード
△…目的の動きをする
×…目的の動きにならない
-…使用できない

# △について
### イミュータブルのcopyとdeepcopy
　イミュータブルなオブジェクトについては`copy`や`deepcopy`を使わなくても目的の動きができます。コード量が増えるので特別な意図がない限りは代入で十分です。

### ミュータブルのdeepcopy
　`deepcopy`では入れ子構造まで再帰的にコピーを行います。入れ子構造になっていない`list`等であれば特別な意図がない限りは`copy`で十分です。コピー対象が複合オブジェクトに変更となることを考慮する場合は`deepcopy`で統一した方が良いです。

# ミュータブル(複合オブジェクト)の例
　言葉だけだと分かりにくいので例を示します。`deepcopy`のときだけオリジナルの値が保存されていることが分かります。
```python
import copy

# 例1
l = [0, 1, [2, 3]]
l_copy = copy.copy(l)
l_copy_method = l.copy()
l_deepcopy = copy.deepcopy(l)
l[2][0] = 9
print(l)  # [0, 1, [9, 3]]
print(l_copy)  # [0, 1, [9, 3]]
print(l_copy_method)  # [0, 1, [9, 3]]
print(l_deepcopy)  # [0, 1, [2, 3]]

# 例2
l = [{"a": 0, "b": 1}, {"a": 2, "b": 3}]
l_copy = copy.copy(l)
l_copy_method = l.copy()
l_deepcopy = copy.deepcopy(l)
l[0]["a"] = 9
print(l)  # [{'a': 9, 'b': 1}, {'a': 2, 'b': 3}]
print(l_copy)  # [{'a': 9, 'b': 1}, {'a': 2, 'b': 3}]
print(l_copy_method)  # [{'a': 9, 'b': 1}, {'a': 2, 'b': 3}]
print(l_deepcopy)  # [{'a': 0, 'b': 1}, {'a': 2, 'b': 3}]

# 例3
d = {"a": {"aa": 0, "bb": 1}, "b": 2}
d_copy = copy.copy(d)
d_copy_method = d.copy()
d_deepcopy = copy.deepcopy(d)
d["a"]["aa"] = 9
print(d)  # {'a': {'aa': 9, 'bb': 1}, 'b': 2}
print(d_copy)  # {'a': {'aa': 9, 'bb': 1}, 'b': 2}
print(d_copy_method)  # {'a': {'aa': 9, 'bb': 1}, 'b': 2}
print(d_deepcopy)  # {'a': {'aa': 0, 'bb': 1}, 'b': 2}

# 例4
d = {"a": [0, 1], "b": 2}
d_copy = copy.copy(d)
d_copy_method = d.copy()
d_deepcopy = copy.deepcopy(d)
d["a"][0] = 9
print(d)  # {'a': [9, 1], 'b': 2}
print(d_copy)  # {'a': [9, 1], 'b': 2}
print(d_copy_method)  # {'a': [9, 1], 'b': 2}
print(d_deepcopy)  # {'a': [0, 1], 'b': 2}
```
Laravel、jQueryで非同期（Ajax）でレコードを削除する

個人メモ。
# 環境
- Laravel 10.4.1
- PHP 8.2.4

# やること
削除画面（一覧画面→遷移しての削除画面）で、todoテーブルの特定の1レコード（その画面に表示）を削除する。
削除時に確認メッセージ表示、OKなら削除し、一覧画面に遷移する。

# 設定内容
- viewファイルの中身、jQuery部分。
ここでは、コントローラーから渡ってきた　`$form->id`をキーとして渡してデータを削除する。
ボタンIDに「del_js」と名前を付けて、そのクリックイベントで実行する。
jQueryのfunction内では、`url: "/todo/del",`、`type: "POST",`で、web.phpのルーティングの"/todo/del"のPOSTを呼び出す。削除対象データは 
`data: {
    id: {{ $form->id }},
},`
のように指定した。
下記は削除画面のviewファイル。
```php:todo_del.blade.php
<meta name="csrf-token" content="{{ csrf_token() }}">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script>


$(function() {
	$("#del_js").click(function() {

    var deleteConfirm = confirm('削除してよろしいですか？');
    if(deleteConfirm == true) {    
        $.ajaxSetup({
            headers: {
            "X-CSRF-TOKEN": $('meta[name="csrf-token"]').attr("content"),},
        });
        $.ajax({
        //POST通信
        type: "POST",
        //ここでデータの送信先URLを指定します。
        url: "/todo/del",
        dataType: "text",
        data: {
            id: {{ $form->id }},
        },
        })
        // 成功
        .done(function (results){
            // alert('成功:' + {{ $form->id }});

            // 通信成功時の処理
            console.log("results : " + results);        
            window.location.href = "/todo";     //削除後に画面を遷移

        })
        // 失敗
        .fail(function(jqXHR, textStatus, errorThrown){
            //alert('失敗');
            console.log("ajax通信に失敗しました");
            console.log("jqXHR          : " + jqXHR.status); // HTTPステータスが取得
            console.log("textStatus     : " + textStatus);    // タイムアウト、パースエラー
            console.log("errorThrown    : " + errorThrown.message); // 例外情報
            console.log("URL            : " + url);        
        });
    }

      });
  });

</script>

（略）
<p class="center"><input type="button" id="del_js" value="削除" ></p>
（略）
```  

- routeの設定
'todo/del'がjQueryでPOSTで呼び出された場合、TodoControllerのremove関数を呼び出すようにする。
```php:web.php
Route::post('todo/del','App\Http\Controllers\TodoController@remove');   //jQueryでの削除
```

- TodoControllerのremove関数
呼び出されるTodoControllerのremove関数。
$request->idで指定されたtodoテーブルの1レコードを削除する。
```php:TodoController.php
use Illuminate\Http\Request;
use App\Models\Todo;
class TodoController extends Controller
{
    public function remove(Request $request){

        // eloquentによる削除
        $todo = Todo::find($request->id);   //todoモデルを使用、IDで検索
        $todo->delete();
        return redirect('/todo');

    }  //end funtion remove
}
```
これで動作確認ができました。

# 関連
[Laravel、jQueryで複数のチェックボックスデータを非同期（Ajax）削除する](https://qiita.com/ky-jp16/items/5207437f052cc43b78df)


# 参考
[Laravel+jQueryでAjax通信してみる](https://qiita.com/si-ma/items/6931ecc0b8562e96733e)
[[Laravel / jQuery] 非同期（Ajax）でレコードを削除したい](https://qiita.com/u-dai/items/d43e932cd6d96c09b69a)
[Ajax入門（通信エラーとなった原因の取得）](https://laraweb.net/surrounding/4991/)
[jQueryのajaxが成功しているのにfailで処理される現象の原因と対応方法を解説 | 試行錯誤してみた。](https://trialanderror.jp/ajax-fail/)
インストールした Python ライブラリを VSCode 上で読み込めない時の対処法

# インストールした Python ライブラリを VSCode 上で読み込めない時の対処法

## 概要

python で使いたいライブラリをインストールしたが、VSCode 上で Import "module_name" could not be resolved from 〜というエラーが発生する。

### 環境

Ubuntu 22.04.1 LTS
VSCode: 1.71.2

## 原因

VSCode が対象ライブラリのパスを認識できていない。

## 解決策

VSCode にパスを教えてあげればよい。

### ライブラリのパスを確認する

適当にターミナルを開いて対話モードに入ってパスを確認する。

```bash
$ python3  #対話モードに入る
Python 3.8.5 (default, Sep  4 2020, 07:30:14)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import django #パスを確認したいライブラリをimportする
>>> print(django.__file__) #パスを確認
/home/user/anaconda3/lib/python3.8/site-packages/markdown/__init__.py # パスがでる
```

### パスを VSCode に教える

先ほど確認したパスを VSCode に設定する。

```bash
# site-packages/までをコピーする。
/home/user/anaconda3/lib/python3.8/site-packages/markdown/
```

VSCode 上で「ファイル」/「ユーザー設定」/「設定」を開く。（または「Ctrl」＋「,」）<br>

次に、設定の検索か「 extra path 」を入力。<br>

Python › Analysis: Extra Paths という項目があるので、「項目の追加」をクリック。

入力欄が表示されるので、先ほどコピーしたパスをペーストし、OK をクリック。<br>

以上で VSCode がライブラリを認識してくれるはず。
Python3で選択ソートを実装してみた

# 概要
Python3で選択ソートを実装してみました。以下のページを参考にしました。
https://www.codereading.com/algo_and_ds/algo/selection_sort.html

# ソースコード
上記のC言語の記述をPython3の記述に書き換えました。

```selection_sort.py
import random

data = {}
data2 = {}
temp = {}
NUM = 10
i = 0
while i < NUM:
    data[i] = random.random()
    i = i + 1

#show
def show_data():
    print("==>> show data")
    i = 0
    while i < NUM:
        print ( str(i) + ":" + str(data[i]) )
        i = i + 1

def show_data2():
    print("==>> show data2")
    i = 0
    while i < NUM:
        print ( str(i) + ":" + str(data2[i]) )
        i = i + 1

#copy
def copy_data_to_data2():
    print("==>> copy data to data2")
    i = 0
    while i < NUM:
        data2[i] = data[i]
        i = i + 1

#selection_sort
def selection_sort(array, n):
    print("==>> selection sort")
    i = 0
    j = 0
    min_index = 0
    temp = 0
    i = 0
    while i < n - 1:
        min_index = i
        j = i + 1
        while j < n:
            if array[j] < array[min_index]:
                min_index = j
            j += 1
        temp = array[i]
        array[i] = array[min_index]
        array[min_index] = temp
        i += 1

copy_data_to_data2()
show_data2()
selection_sort(data2, NUM)
show_data2()
```

# 実行結果
実行できました。アルゴリズムは正常に動いています。
```
$ python3 selection_sort.py 
==>> copy data to data2
==>> show data2
0:0.5614100417958096
1:0.5056570690664935
2:0.445481583299396
3:0.20487459432048705
4:0.3592456158863766
5:0.03685265084032163
6:0.5846553789432437
7:0.8952448397182186
8:0.37153164183169196
9:0.58202812825662
==>> selection sort
==>> show data2
0:0.03685265084032163
1:0.20487459432048705
2:0.3592456158863766
3:0.37153164183169196
4:0.445481583299396
5:0.5056570690664935
6:0.5614100417958096
7:0.58202812825662
8:0.5846553789432437
9:0.8952448397182186
```

何かの役に立てばと。
NetGear GS105Ev2の管理VLANが1固定で困った話

# はじめに

5ポートでコンパクトながら、WebのGUI画面でVLANが使えるというコスパのいいスイッチということで、何も考えずに購入しました。


# 困った困ったこまどり姉妹。

WebのGUI画面があるので当然IPアドレスは持っています。セキュリティ上管理画面へのアクセスは制御したい。それでなくてもこの手のネットワーク機器のWebのGUI画面はセキュリティの脆弱性をつかれやすいです。
で、この画面を見ると。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580974/fe0ce3eb-33a1-9c93-aa0c-16e40106e7c1.png)

あれ、管理用IPアドレスが所属するVLAN（すなわち管理VLAN）を指定できない。。。
どうやら、 __管理用IPアドレスはVLAN1固定__ のようです。


# 実現したいこと

やりたいことは、GS105Ev2にPCを接続、GS105Ev2と上位スイッチはTrunkでPC用VLAN11と、管理用VLAN100(192.168.100.0/24)を通す。
GS105Ev2の管理IPは192.168.100.109にしてVLAN100にしたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580974/a7ae0f31-429a-2e38-7331-d3e9393ee5b9.png)

|VLAN ID|ネットワークアドレス|用途|
|-|-|-|
|VLAN11|192.168.11.0/24|PC用|
|VLAN100|192.168.100.0/24|管理用|


# やること

## 方針

管理IPがVLAN1固定になるのであれば、GS105Ev2の上位L2接続用Trunkポートで、ネイティブVLANでうまいこと合わせる。

- GS105Ev2側のネイティブVLANを1
- 上位L2側のネイティブVLANを100

こうすればいけるんじゃね？ということで早速設定です。

## GS105Ev2側

拡張802.1Q VLANを有効にして、VLAN11を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580974/c16c96fc-ee8a-7cc0-c620-15f0c3068f90.png)

VLAN1は上位L2との接続ポート(ポート1)のVLAN1をUntaggedに設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580974/0a25eddf-1d80-bebe-0873-35411a3afcad.png)

VLAN11は上位L2との接続ポート(ポート1)のVLAN1をTagged、その他ポートはPC接続用にUntaggedに設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580974/bfbc7204-4d2c-1ab2-a114-97160ebf30e1.png)

PVIDは上位L2との接続ポート(ポート1)をVLAN1に、その他ポートはPC接続用にVLAN11に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580974/f279e8cf-cebe-da33-dd5c-b074dc50db38.png)

VLANメンバーシップとPVID設定は順番があるので、そのあたりは適当にやってください。
PVIDに設定できるのはUntaggedになってるVLANIDだけです。


## 上位L2スイッチ(AT-x210-9GT)側

今回使ったのはAllied-TelesisのAT-x210-9GTですが、Ciscoでも似たような設定でいけるはず。
```
SWL2#show run int port1.0.6
!
interface port1.0.6
 switchport
 switchport mode trunk
 switchport trunk allowed vlan add 11
 switchport trunk native vlan 100
!
```

# 結果

見事、両方のVLANともに通信できるようになりました。
ネイティブVLANが一致していないのは気持ち悪いですが、今のところこれしか方法はなさそうな気がします。

結果オーライということで。


# まとめ

Ciscoのスイッチだと、ポート単位でアクセスポートかトランクポートを指定できますが、NetGearのスイッチは拡張802.1Q VLANを有効にした段階で全ポートがトランクになります。
トランク=Tagged、アクセス=Untaggedではなく、タグ無し通信はネイティブVLAN(PVID)で設定するイメージ。

## 設定例１

例えば、このような設定の場合、
```
interface GigabitEthernet0/1
  switchport mode trunk
  switchport trunk allowed vlan 11,12
  switchport trunk native vlan 1
```
NetGearだと、こうなります。
|VLAN1|VLAN11|VLAN12|PVID|
|-|-|-|-|
|Untagged|Tagged|Tagged|1|


## 設定例２

例えば、このような設定の場合、
```
interface GigabitEthernet0/1
  switchport mode access
  switchport access vlan 11
```
NetGearだと、こうなるわけですが、
|VLAN1|VLAN11|VLAN12|PVID|
|-|-|-|-|
|-|Untagged|-|11|

どっちか言うとこれが、
```
interface GigabitEthernet0/1
  switchport mode trunk
  switchport trunk allowed vlan 11
  switchport trunk native vlan 11
```
みたいなイメージかなぁ。アクセスポートと言うよりはトランクポートなんですよね。
CSSで背景を透過させる方法

# 1.はじめに
- 背景の主張が強く文字が見えづらかったので透過させる方法をメモ

# 2.実装
- 白色を貼り付けて、透過させる。（0.4の部分を0.5などにして透過率を変えられる）
```
  background-color:rgba(255,255,255,0.4);
  background-blend-mode:lighten;
```
これだけで背景のみ透過させることができる。
通年制度になった基本情報技術者試験で基準点以上を取ってみた

　2023年4月から基本情報が通年受験制度になり、内容も大きく変わるのではと不安になりました。内容を知るにはIPAのサンプル問題だけが頼りで、「演習を積む」ことが難しいと思いました。
　午前はこれまでの範囲とは大きく変わらないため、過去問道場などで演習を積めば大丈夫だと思いました。実際私は過去問道場で５期分をそれぞれ9割以上取れるように繰り返し解きました。それで基準点以上を取れたので、たくさん問題を解くことが正義ではないと思いました。また、知識体系を知るために一冊の参考書で復習するようにしていました。（応用情報の内容も網羅しているのはまた別の話。）
　午後のセキュリティは日頃業務に関わっているのでイメージしやすかったです。関わっているといっても当事者であるわけではありません。そういう話が聞こえてくる環境に身を置くだけでも実際に関わっている人の使う言葉を知って雰囲気を掴むことで読み解きやすくなったのだと思いました。そのためにも一つのシステムにどんなリスクがあるのかを知る必要があると思いました。
　アルゴリズムは対策が大変でした。私の経験を踏まえると、一つの言語を学習してアルゴリズムで何ができるのかを一通り知ってからのほうがいいと感じました。（私はJavaを学習しました。）それから仕事で使ってみて、実際に仕事でどんな知識が必要かを知りました。基本情報の問題は仕事でも必要な基本的なテーマを扱っているため、基本情報を取得すること（アルゴリズムが解けること）は信頼向上につながると思いました。競プロもアルゴリズムスキルの証明になりますが、業務に必要なスキルを効率的に網羅するのは基本情報だと感じます。それでもアルゴリズムを楽しむには競プロという選択は良いと思います。通年制になる前の基本情報のアルゴリズム（過去問のアルゴリズム）を解いた時もありましたが、文章量が多く一題が重いことを考えるととっかかりには向いてないと思いました。ただ読解力をつけ問題慣れをするには解きごたえのある問題だと思いました。私は対策書に記載された過去問のアルゴリズムを一通り解いたため、サンプル問題が少し易しく感じました。
　通年制になると、「いつ取るの？」というプレッシャーを感じます。確かに応用や高度試験に比べると簡単です。実際受けてみて、少し勉強すれば取れる内容だと感じました。しかし無理に急いで取る必要もないと思いました。知識は使って初めてその本質を知ると思います。試験問題で使うより業務で使ったほうが本質的だと思いました。そのため十分に業務で使ってから試験を受けるでも遅くないと思いました。私は業務で理解したことを基本情報という学問として整理しました。座学では得られない経験は大きいと思います。私も今年度から通年制度になった基本情報を受け基準点以上を取ったことを活かしたいと考えています。
インフラ初心者のためのAWSソリューションアーキテクト取得ガイド

## 実務経験1年未満＆インフラ初心者でもSAAを取得した方法を記します！

前提事項
- バックエンドエンジニア（実務10ヶ月くらい）
- インフラ業務の経験はゼロ
- ネットワーク知識は書籍１冊読んだくらい

ソリューションアーキテクトアソシエイト（SAA）の学習前はEC2とS3を知ってるくらいで、その他のサービスについては全く知りませんでした🫠

合格認定証↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2274644/22647844-8ee0-98e0-485e-b0377b2c07d2.png)


<br>

## 結論

**Ping-tの[最強WEB問題集](https://mondai.ping-t.com/question_subjects/72)だけやれば合格できます！**

<br>
<br>


Web上のSAA学習教材は主に以下の３つがあります。
- [Ping-t最強WEB問題集](https://mondai.ping-t.com/question_subjects/72)（無料）
    - メリット：わかりやすい
    - デメリット：特になし
- [Udemy 【SAA-C03版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座](https://www.udemy.com/course/aws-associate/)（¥2,400）
    - メリット：動画教材
    - デメリット：問題集が激ムズ
- [AWS公式問題集](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sa-assoc/AWS-Certified-Solutions-Architect-Associate_Sample-Questions.pdf)（無料）
    - メリット：公式
    - デメリット：とっつきにくい


私は最初はUdemyをやっていましたが、問題集が難しすぎてPing-tに乗り換えました🤯
この中で一番Ping-tがわかりやすく、本番と同レベルの問題を大量に解くことができます！
**実際、ほぼ同じ問題が数問出題されました👏**

<br>
<br>

## 勉強方法・合格レベル・勉強期間

1. **Ping-tで各AWS分野の問題の説明文を熟読**して、どのサービスにどんな機能があり、どのように他のサービスと連携できるのか、などをキャッチアップします✏️
1. Ping-tの問題をひたすら解いて、**2周くらい（コンボ数が500前後）行います！**
1. **10問解いて10問 or 9問正解くらいのレベル感になったら、認定試験を受けても合格できるレベル感です💪**

※ 動画教材がお好きな場合は、Udemyでインプット→Ping-tでアウトプットを行うことをオススメします！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2274644/7154eec2-c021-cec7-ed20-5c1beb2cd339.png)

私は4ヶ月間ほどダラダラと学習してました（そのうちPing-tは1ヶ月と少し）が、**Ping-tだけで全集中するとしたら、インプットに半月＋アウトプット（問題集）に1ヶ月で、合格レベルに達することはできると思います🔥**


<br>
<br>

## 試験の申し込み

**[PearsonVUE](https://www.pearsonvue.co.jp/Clients/Amazon-Web-Services.aspx)経由で申し込みました！**
（たまたま再受験無料キャンペーンをやってました）

受験方法はテストセンターとオンライン受験を選べるので、オンラインで受験
予定がたまたま空いていたので、朝8時に申し込んで、その日の10時から受けられました！
[こちらのサイト](https://nokonokonetwork.com/certificate/aws/aws_associate/how_to_apply_for_aws_exam.html)を参考にさせていただきました🙏


<br>
<br>

## その他注意事項

オンライン受験前のセットアップになんだかんだ時間を取られるので、早めに準備しておくことをオススメします！



## 最後に

SAAの勉強をして、インフラ領域の幅広いキャッチアップと、自身が携わっているサービスのインフラにどんなAWSサービスが使われているかの理解に繋がったので、早い段階で取得しておいて本当に良かったと思います！
**ある程度の勉強時間は必要ですが、インフラへの理解が深まる資格なので、頑張ってください🔥**
【備忘録】1/3＝0.33…と出力させたかったのに商が０になった

# はじめに
きっかけから。
競プロの勉強をしている際に以下のようなコード(Javaです)を書きました。
```Java
double ans = 1/3 * 5;
System.out.println(ans);
//出力結果は0.0
//自分が出力させたかった答えは1.6666･･･
```
double型で変数を宣言しているのだから答えも小数になるはずだ、と思っていたので、
想定外の出力結果にかなり混乱しました。

なぜこうなったのか、自分が思ったとおりに小数で出力させるためにはどうしたらいいのかを
自分なりに考えて試した結果を以下にまとめます。

# 試して考えてみた
かけ算で答え０になるからには、どこかが０と計算されているはずだと考え、
ただの1/3を出力させたところ結果は0.
```Java
System.out.println(1/3); //0
```
ここに問題があったのかと嬉しくなりましたね。
これをもとにいろいろ試した結果を以下に記します。
```Java
System.out.println(1.0/3.0); //0.3333…
System.out.println(5*1/3); //1
System.out.println(5.0*1/3); //1.6666…67
System.out.println(1/3*5.0); //0.0
System.out.println((1/3)*5); //0
System.out.println((1/3)*5.0); //0.0
System.out.println((1.0/3.0)*5.0);//1.6666…5
System.out.println((1.0/3.0)*5);//1.6666…5
System.out.println(1.0/3); //0.3333…
System.out.println(1/3.0); //0.3333…
double t1 = 1.0/3;
System.out.println(t1);//0.3333
t1 = 1/3.0;
System.out.println(t1);//0.3333
```
まず、これらの結果から計算式に小数を一つでも含めていれば出力結果も小数の形式になるということに気が付きました。
式の結果が０になるのは1/3を整数型としてとらえているので、０という結果になるんだろうと予想しています。
次に、分数というか割り算部分の処理について考えます。
こちらも、分母か分子のどちらかに小数が含まれていれば小数になるようです。
さらに、（）付の計算式について。
（）の中身が先に計算される、というのは自明でしょうが、
（）の中身の計算結果が一つの数字として扱われているようだ、ということは個人的に新しい発見でした。
コードは前から処理されるものだから、考えてみればその通りなんですけどね。

以上のことから、
Javaの数字リテラルはその書き方によって整数型か小数型か分けられるのだろうと思いました。

# 調べてみた
検索して調べてみたところ、
コード中に直接書くもののことをリテラルと呼ぶこと。
数値リテラルには、整数リテラル（指定しなければint）と浮動小数点リテラル（指定しなければdouble）の２種類があること。
がわかりました。

リテラルについてのこういう説明は以前も読んだことはありましたが、実際にこのような動作になるとは理解しきれていませんでした。
説明を読むときもただ説明を受け取るだけでなく、考え抜くことが大切ですね。

数値リテラルを使うときには、整数であれ小数であれすべての項で型をそろえるほうが良さそうです。


参考サイト:
[Java|数値リテラルにサフィックスを付けて型を指定する](https://www.javadrive.jp/start/num/index8.html)
[とほほのJava入門](https://www.tohoho-web.com/java/syntax.htm)


あと、これは調べたときの発見なのですが、
数値リテラル内にアンダーバーを入れられるそうです。
桁の境目にアンダーバーを入れて読みやすくするためなどに使うようです。
[数値リテラル内のアンダースコア|Oracle](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/language/underscores-literals.html)

# 終わりに
最初に書いた`1/3*5`が想定通りにならなかったのは、
すべて整数リテラルで書いていたから、というわけでした。
単純に自分がリテラルについて理解していなかっただけでした。

たぶんもう同じ間違いはしないでしょうが、備忘録として残しておきます。

私はまだまだ知識不足ですので、何か間違ったことを書いていればご指摘お願いします。

# おまけ
```Java
System.out.println(5.0*1/3); //1.6666…67
System.out.println((1.0/3.0)*5.0);//1.6666…5
System.out.println((1.0/3.0)*5);//1.6666…5
```
こちらの3行。見てわかる通り、最下位の値が異なるんですよね。
いったいこれはなぜなのか。
１行目は5.0÷3
2,3行目は、0.333…÷5
2,3行目に無限小数が含まれていることが原因なのでしょうか？

さくっと調べた印象では、やはり無限小数が絡んでいそうです。
無限小数は近似値で格納されるため計算結果に誤差が出るのだそう。
この誤差を生まないためのライブラリもあるようですが、無限に続くものを正確に計算するってどういった仕組みになっているんでしょう。気になるところです。
[graphql-codegen resolver]Failed to load schema from http://localhost

resolver codegenのエラーメモ
# エラー
`Failed to load schema from http://localhost:3000/graphql:`

# やりたいこと
schema/の定義に従ってresolverの型をcodegen/resolver.tsに出したい

```:ディレクトリ
src/
├── graphql
│   ├── codegen
│   ├── resolver
│   └── schema
```
# codegen
```codegen.ts
import type { CodegenConfig } from '@graphql-codegen/cli'

const config: CodegenConfig = {
  overwrite: true,
  schema: 'http://localhost:3000/graphql',
  documents: ['src/graphql/**/*.{gql,graphql}'],
  generates: {
    'src/graphql/codegen/resolver.ts': {
      plugins: ['typescript', 'typescript-resolvers'],
    },
    // ...
  }
}
export default config
```
### 設定について
- schema: graphqlのエンドポイントURL
- documents: GraphQLドキュメント(path or 配列)
- generates: 出力パス
  - plugins: プラグイン配列


https://the-guild.dev/graphql/codegen/docs/config-reference/codegen-config

# 解決
localhost => 127.0.0.1に変更

https://stackoverflow.com/questions/72842769/graphql-code-generator-failed-to-load-schema-from-http-localhost8000-graphq

# 参考
https://techlife.cookpad.com/entry/2021/03/24/123214
Railsのhelperとは

# はじめに
Railsの`helper`についてまとめてみました

# `helper`とは
RailsのViewをシンプル書くことが出来る機能
Viewでの処理をメソッドとして定義し、簡単に使いまわせるようにすることが出来る

あらかじめRailsに組み込まれたヘルパーは**組み込みヘルパー**、独自に作成するものは**カスタムヘルパー**と言う

## よく使われる組み込みヘルパー
よく使われる組み込みヘルパーの一部を紹介する
### `link_to`
リンクを作成できるヘルパーメソッド

`<%= link_to "テキスト", "リンク先のパス" %>`と記述する

#### ルーティングの名前でリンク先を指定する
一般的にはこの方法が通常
1. Prefixを確認
Prefixはパスが代入されている変数のようなもの
`rails routes`コマンドで確認が取れる

2. Prefixの末尾に`_path`をつけ、`<%= link_to "名前", 確認したPrefix_path %>`とする



```ruby:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>Sample App</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <meta charset="utf-8">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
  </head>

  <body>
    # 通常のlink_to
    <%= link_to "Google", "https://www.google.co.jp/" %>
    
    # 名前付きlink_to
    <%= link_to "About", about_path %>
  </body>
</html>
```


### `button_to`
ボタンを簡単に作成することができるヘルパーメソッド
`<%= button_to "ボタン名", { パス or コントローラー名とアクション名 }, { オプション } %>`と記述する

```ruby:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>Sample App</title>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <meta charset="utf-8">
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
  </head>

  <body>
    <%= button_to 'ユーザー登録', {controller: 'users', action: 'new'}, {method: :get }%>
  </body>
</html>
```

## カスタムヘルパーを作ってみる
カスタムヘルパーの作り方は以下の2通りある

* `app/helpers/application_helper.rb`に処理を記述
→ アプリケーション全体に渡ってのヘルパーを作る場合はこれを使う

* `app/helpers/<コントローラ名>_helper.rb`に処理を記述
→ 対象のコントローラの経由の処理でのみ使う場合に使用

### 書き方
```ruby
module <モジュール名>
 def <処理1>
    　　# 処理１の内容
 end

 def <処理2>
    　　# 処理２の内容
 end
```

### `Hello, World!`と表示されるカスタムヘルパー
```app/helpers/application_helper.rb
module ApplicationHelper
  def greet
    'Hello, World!'
  end
end
```
Viewファイルで`<%= greet %>`と記述すれば`Hello, World!`と表示される

# 参考記事
[知っておきたいヘルパーメソッド](https://pikawaka.com/rails/sub_category/helper-method 'ヘルパーメソッド')
[【Ruby on Rails】Helperとは?その役割・使い方について](https://fresopiya.com/2019/06/26/helper/ 'ヘルパー')
[【Rails入門】helperの使い方まとめ](https://www.sejuku.net/blog/28563#:~:text=helper(%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC)%E3%81%AF%E3%81%9D%E3%81%AE%E5%90%8D%E5%89%8D,%E3%81%AA%E6%AD%A6%E5%99%A8%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82 'ヘルパー')
[【Rails入門説明書】helperについて解説](https://web-camp.io/magazine/archives/19136 'ヘルパー')
[【Rails】自作ヘルパの作成方法｜controllerやscaffoldで自動生成されるapp/helpers/xxx_helper.rbの使い方](https://prograshi.com/framework/rails/original-helper/ 'ヘルパー')
[【リンクの作成！】Ruby on Railsでのlink_toの使い方](https://magazine.techacademy.jp/magazine/7286 'link_to')
[Railsでリンクヘルパー(link_to)を使ってサクッとリンクを生成する方法を解説！](https://himakuro.com/rails-link-to-guide#i-3 'link_to')
Laravelで共通関数作成

Laravelで共通関数作成、個人メモ。

# 環境
- Laravel 10.4.1
- PHP 8.2.4

# 作業
- \app\Libs
に
Common.php
を作成。（フォルダ名、ファイル名は任意）
下記では例として、「get_img_path」関数を作成。

```PHP:Common.php
<?php
namespace App\Libs;
class Common
{
    //ユーザーの画像パスを返す
    public static function get_img_path($db_img){

        if($db_img == 'noimage.jpg'){
            $img = '/storage/default/noimage.jpg';
        }else{
            $img = '/storage/todo/' .  $db_img;
        }        
        return $img;

    }   //end funtion index
}
```

- \config\app.php　最下部に下記追加
```PHP:app.php
(略)
    /*
    |--------------------------------------------------------------------------
    | Class Aliases
    |--------------------------------------------------------------------------
    |
    | This array of class aliases will be registered when this application
    | is started. However, feel free to register as many as you wish as
    | the aliases are "lazy" loaded so they don't hinder performance.
    |
    */

    // 'aliases' => Facade::defaultAliases()->merge([
    //     // 'ExampleClass' => App\Example\ExampleClass::class,
    // ])->toArray(),

    'aliases' => Facade::defaultAliases()->merge([
        'Common' => App\Libs\Common::class, 
    ])->toArray(),
```
※エイリアスの説明部分の日本語訳は
`このクラス エイリアスの配列は、このアプリケーションの起動時に登録されます。
ただし、エイリアスは「遅延」ロードされるため、パフォーマンスを妨げないため、好きなだけ登録してください。`

- コントローラーファイル内で共通関数を使用。上部にuse宣言は不要。この例では　`\Common::get_img_path()`　で呼び出せる。 
```PHP
$img = \Common::get_img_path($user->img);  //共通関数で画像パス取得
```

# 参考
[Laravel　共通関数作成](https://qiita.com/date_sk/items/fa420e536e64e41838f9)
vbsの作法 その57

# 概要
vbsの作法、調べてみた。
vbsから操れるUIコンポーネントをC#で書いてみた。
練習問題、やってみた。

# 練習問題
湯婆婆を実装せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5b87bc3d-b8b9-5fc8-4c79-2eb8f82aa584.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3ab701c4-e250-d4bb-cc21-ba51e102e352.png)

# サンプルコード

```
Dim o
Set o = CreateObject("Ohi.Compo7")
str = "契約書" & vbCrLf & "甲は油屋当主として、乙を油屋に雇用することを契約し、" & vbCrLf & "労働に伴う対価の支払いを右の通り、約定する。" & vbCrLf 
str = str & "なお、一日の労働の対価は金百円とする。" & vbCrLf & "甲　油屋当主　湯婆婆" & vbCrLf & "乙" & vbCrLf & "契約書だよ。そこに名前を書きな。"
o.Put str
Dim name
name = o.Open()
If Len(name) = 0 Then
    Wscript.Arguments(-1)
End If
str = "フン。" & name & "というのかい。贅沢な名だねぇ。"
Dim newName
Randomize
newName = Mid(name, Int(Len(name) * Rnd + 1), 1)
o.Put str & "今からお前の名前は" & newName & "だ。いいかい、" & newName & "だよ。分かったら返事をするんだ、" & newName & "!!"
a = o.Open()
Set o = Nothing

```

以上。
Java 17でSpring 3.0.6のプロジェクトをビルドしようとするとNo matching variant of org.springframework.bootのエラーが出る

## IntelliJ上でGradleビルドしようとしたら次のようなエラーが・・・
![2023-04-22_17h15_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520632/8dd4c1df-f30e-62d4-3237-47b155799969.png)

Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.0.6.
No matching variant of org.springframework.boot

Spring Boot 3.0.6はJava 17以上が必要なのは知っていた。
build.gradle上にはJava 17と記載している。
プロジェクト設定もJava 17にしているのに何故かエラーが出る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520632/f8b11bdb-78b5-ec2a-1faa-c04010fdd19f.png)

## IntelliJのGradleの設定が間違っていた！
設定 > ビルド、実行、デプロイ > ビルドツール > Gradle にGradle JVMの設定箇所がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520632/32f8b645-dafe-baee-0c0c-531c1e5ff2ec.png)

ローカルのJava 11を使う設定がされていたのが原因でした・・・

ここをプロジェクトSDKを使うように設定を変えることで無事解決しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520632/09dda898-ae41-5a15-074c-7eaf3c0d31e6.png)
【Python datetime】naiveとawareの変換

# naiveとawareの変換

Pythonのdatetimeのタイムゾーンの扱い方の紹介です。
ここでは、datetimeの日本語訳を「日付時刻」と呼ぶことにします。

- naiveとawareとは
- naiveとawareの現在時刻
- naiveとaware間の変換
- 実行例

## naiveとawareとは

naiveはタイムゾーン**なし**の日付時刻、awareはタイムゾーン**あり**の日付時刻です。

https://docs.python.org/ja/3/library/datetime.html

## naiveとawareの現在時刻

日本標準時（Japan Standard Time、JST）と、協定世界時（UTC）の現在時刻は下記のように取得できます。
ただし、ローカルタイムはJSTとします。

```py
from datetime import datetime
from zoneinfo import ZoneInfo

jst = ZoneInfo("Asia/Tokyo")
utc = ZoneInfo("UTC")

naive_jst = datetime.now()
naive_utc = datetime.utcnow()
aware_jst = datetime.now(jst)
aware_utc = datetime.now(utc)
```

- naive_jst：naiveなJST
- naive_utc：naiveなUTC
- aware_jst：awareなJST
- aware_utc：awareなUTC

JSTは、UTCに9時間足したものです。
なので、naive_jstやaware_jstが10時のとき、naive_utcやaware_utcは1時です。

## naiveとaware間の変換

変換には、replaceとastimezoneを使います。

- replace：時刻を変更せずに、タイムゾーン情報のみを追加・変更・削除します。
- astimezone
  - naiveから：ローカルタイムとみなしてタイムゾーン変更します。
  - awareから：タイムゾーン変更します。

この2関数を使って、naiveとaware間の変換を説明します。

### awareからnaiveに変換

同じタイムゾーンの時刻に変更後に、タイムゾーン情報のみを削除します。

### naiveからawareに変換

タイムゾーンが変わらない変換は、単にタイムゾーン情報のみを追加します。

naiveのJSTからawareのUTCに変換は、ローカルタイムとみなしてタイムゾーン変更します。

naiveのUTCからawareのJSTに変換は、タイムゾーン情報のみを追加後にタイムゾーン変更します。

## 実行例

```python
from datetime import datetime
from zoneinfo import ZoneInfo

jst = ZoneInfo("Asia/Tokyo")
utc = ZoneInfo("UTC")

naive_jst = datetime.now()
naive_utc = datetime.utcnow()
aware_jst = datetime.now(jst)
aware_utc = datetime.now(utc)

print(f"{naive_jst = :%X %Z}")
print(f"{naive_utc = :%X %Z}")
print(f"{aware_jst = :%X %Z}")
print(f"{aware_utc = :%X %Z}")
print()
print("From aware to naive JST")
print(f"  {aware_jst.replace(tzinfo=None):%X %Z}")
_aware_jst = aware_utc.astimezone(jst)
print(f"  {_aware_jst.replace(tzinfo=None):%X %Z}")
print("From aware to naive UTC")
_aware_utc = aware_jst.astimezone(utc)
print(f"  {_aware_utc.replace(tzinfo=None):%X %Z}")
print(f"  {aware_utc.replace(tzinfo=None):%X %Z}")
print("From naive to aware JST")
print(f"  {naive_jst.replace(tzinfo=jst):%X %Z}")
_aware_utc = naive_utc.replace(tzinfo=utc)
print(f"  {_aware_utc.astimezone(jst):%X %Z}")
print("From naive to aware UTC")
print(f"  {naive_jst.astimezone(utc):%X %Z}")
print(f"  {naive_utc.replace(tzinfo=utc):%X %Z}")
```

```text:output
naive_jst = 10:10:00 
naive_utc = 01:10:00 
aware_jst = 10:10:00 JST
aware_utc = 01:10:00 UTC

From aware to naive JST
  10:10:00 
  10:10:00 
From aware to naive UTC
  01:10:00 
  01:10:00 
From naive to aware JST
  10:10:00 JST
  10:10:00 JST
From naive to aware UTC
  01:10:00 UTC
  01:10:00 UTC
```

以上
System.Windows.Formsを.NET環境のクラスライブラリで使おう

フォームアプリのパーツ関連のロジックをクラスライブラリで書きたいというケースはよくありますが、System.Windows.Forms名前空間の導入方法でつまづきがちです。

.NET Frameworkの時代はdll参照で気軽にできたものですが、.NET（.NET Core）環境では方法が変わっています。メモとして残しておきます。

# 環境
.NET 7.0

# 導入まで2ステップ

## 1. プロジェクトのターゲットOSの変更

プロジェクトを右クリック→プロパティ→アプリケーション→ターゲットOSにて、コンボボックスをWindowsに変更します。

動作環境をWindowsに限定するものとなります。Winフォームのパーツを扱うため必須の設定となります.

![スクリーンショット 2023-04-22 165806.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611998/e82805ae-22c3-58bc-225d-ab9056a2af6c.png)

## 2. プロジェクトファイルのXMLに加筆

Visual Studioのソリューションエクスプローラーからプロジェクトファイルをダブルクリックするか、ソリューション内のcsprojファイルをテキストエディタ等で開き、次の通り行を追加します。

+記号を付した"UseWindowsForms"を追加しています。

### 変更前
```XML 
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net7.0-windows</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>
```

### 変更後
```XML 
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net7.0-windows</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
+   <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>

</Project>
```

## 3. usingステートメントに追加

ここまでくれば、コード上でSystem.Windows.Forms名前空間を使用できるようになっています。

```C#
using System.Windows.Forms; //←追加

namespace ClassLibrary1 {
    public class Class1 {
        public void Hoge(DataGridView dataGridView) {
            //DataGridViewクラスなどをクラスライブラリで利用可能
        }
    }
}
```
Tips: RubyのCloud FunctionsのCold start時の立ち上がりを早くする

## この記事は何
Cloud Functionsで開発をしているときにぶつかる問題として「Cold start問題」があると思います。
色々調べている中で、Cloud Functionsの立ち上がりを高速化する上でのテクニックがあったので記事に残します。
特にランタイムにRubyを選んだ時の実装方法を紹介します。

## app.rbの読み込みが遅い
Cloud FunctionsのランタイムにRubyを選択すると、app.rbにイベントに対しての処理を記述すると思います。
単一リポジトリなどで開発を行っているケースだと、app.rbに複数のイベント処理の定義がされることもザラにあると思います。

```rb:app.rb
require_relative './functions/function1'
require_relative './functions/function2'
...
```

```rb:functions/function1.rb
require 'functions_framework'

FunctionsFramework.http 'function1' do |request|
...
end

```

```rb:functions/function2.rb
require 'functions_framework'

FunctionsFramework.http 'function2' do |request|
...
end

```


以下の記事の通り、それぞれの処理の読み込みはある程度の時間がかかるため、本来であれば実行される関数に関わる処理のみをロードするようにして、読み込みの速度をあげたいです。

https://tech.ginco.io/post/ginco-engineer-meetup-2018-cloud-functions/#cold-start%E3%81%AE%E6%94%B9%E5%96%84

## 解決方法
Cloud FunctionsのランタイムにRubyを選択した時、ビルド時、実行時に関数名は`FUNCTION_TARGET`という環境変数に保存されています。
特に関数名をファイル名を一致させている場合は、以下のような処理をapp.rbに記述するだけで実現できます

```rb:app.rb
require_relative "./functions/#{ENV['FUNCTION_TARGET']}"
```

## Ref

https://tech.ginco.io/post/ginco-engineer-meetup-2018-cloud-functions/#cold-start%E3%81%AE%E6%94%B9%E5%96%84

https://cloud.google.com/functions/docs/configuring/env-var?hl=ja#newer_runtimes
学習のモチベーションの上げ方は人によって違う

## 学習のモチベーション？

職業エンジニアの皆様こんにちは。
休日や業後などの自分の時間はいかがお過ごしでしょうか？Qiitaを見ている諸兄におきましては自分の時間でもドーパミンをダラダラ垂れ流しつつガンガン勉強しておりますでしょうか。

「ITエンジニア」という職業は専門職であり、その専門性により市場優位性を保つ職種ですが、日中の業務だけでは専門性を維持することは不可能です。なぜなら、日中の業務では「今ある自分のスキルを時間で切り売りして換金」することになりますが、その傍らで新しい技術がバカスカ生み出されている様な業界だからです。

ただ、新しい技術自体に価値があるわけではなく、その技術を利用して開発された製品などが生み出す価値に価値があるので、必ずしも無限に新しい技術を習得する必要はないとも言えます。

そのような状況で、自分の時間でプログラムを学習するモチベーションを保つのはなかなか難しいなと思いましたのでGPT先生に質問をしてみました。

![gpt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136165/26098092-22d7-f8cd-5b74-3d78879e44b7.png)


いかがでしょうか？上記 1-5 いずれかに当てはまったあなたは今すぐこの記事を閉じて学習をはじめるとよいですし、当てはまらなかったあなたは、以下考察編にお進みください。


## マズロー欲求５段階説から考える

ということでまずはみんな大好きマズロー欲求５段階説から考えてみましょう。

![マズロー.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136165/e8cefcf3-b081-c913-b03e-86a1cf8e92c0.png)


Qiita に寄稿されているような方は、「自己実現欲求」や「承認欲求」などをモチベーションの源泉として活動していると推察できるかと思ったのですが、わたし自身は、将来への漠然とした不安に対して『モノを整理して書いて伝える能力がないと困るかな』という感覚で寄稿しているので「困ってない自分になっていたいという自己実現欲求」に基づいて行動していそうです。

『スクールに入って一定のカリキュラムをこなせば、リモートワークの高単価案件をゲットできる』という触れ込みを行動指針とした方の場合、スクールを卒業して何らかのIT企業に入ることで「社会的欲求」が満たされ、それ以上の欲求は発生しない可能性が高いと考えられます。『IT業界は給料がいい』と思って就職したケースの場合も同様でしょう。


## 「欠乏欲求」と「成長欲求」

ここで、欲求の種類についても確認しておきましょう。

欲求には２種類あり、それぞれ以下の通りとなります。

- 「欠乏欲求」（マイナスをゼロに）
不足しているものを満たしたいという欲求。
- 「成長欲求」（ゼロからプラスに）
自分を成長させたいという欲求。

プログラムを好きで勉強している方は、おそらく「成長欲求」である「自己実現欲求」を持っており、日常業務が手一杯の方は、「社会的欲求」や「安全欲求」が満たされていないと考えられるでしょう。

まずは、自分や成長を促すべき他者がどのような状況で、どのような欲求を持っているのかを分析し、適切な課題を設定することが重要と言えるでしょう。


## 内発的動機づけ

「欠乏欲求」にせよ「成長欲求」にせよ、自らの時間で学習を行うためには「内発的動機」、すなわち自ら取り組みたいと思う気持ちが必要となるので、どちらの欲求をモチベーションの源泉にできるのか考える必要があります。

ここで、 **『高次の欲求は、低次の欲求が満たされないと発生しない』** という重要な法則があります。
『組織に所属することはできたが日常業務が手一杯』といった場合、「社会的欲求」や「安全欲求」が微妙に満たされていない状態となり、「自己実現欲求」は発生しないことになります。[^1]

そのような方に対しては「便利で役に立つものを作ろう」と提案し「承認欲求」を満たすことを促すよりも、「日常業務を無事にこなせるようにするスキルが身につくための勉強をしよう」と提案し「欠乏欲求」を満たすことを促す方が内発的動機づけにつながると考えられるでしょう。

また、少しの努力で少しの欠乏が満たされる提案をするのも大事です。欠乏を満たす行為は基本的には苦痛を伴う可能性が高いからです。定期的に欠乏が満たされた達成感が提供されないと努力を継続することは難しくなるでしょう。


## おわりに

学習のモチベーションについて、マズロー説から考察してみました。
「自己実現欲求」や「承認欲求」を持てている方は、ITエンジニアとしてドーパミンをダラダラ垂れ流しつつガンガン努力を継続できるのかと思えました。
そうでない方は、目先のやるべきことをとにかく細かく分解してひとつひとつ完了させて少しずつ満たせていない何かを埋めて、今いる社会集団で「社会的欲求」を満たせるようになっていくのが良さそうに思えました。


## おまけ１（新卒エンジニア向け手紙）

https://qiita.com/kaku3/items/2c8d4d783be7ce4fc9ea

https://qiita.com/kaku3/items/0bf1703cb8d6f84afbc5


## おまけ２（新卒エンジニア向け記事）

https://qiita.com/kaku3/items/fb949aa1a53f1f71c796

https://qiita.com/kaku3/items/aa2f81cf1e3974b8ad3a

https://qiita.com/kaku3/items/f8411523cce000de750e

https://qiita.com/kaku3/items/937354cc180c8bee823b

https://qiita.com/kaku3/items/b1c94328f273c750286b

## おまけ３（営業A短編シリーズ）

https://qiita.com/kaku3/items/03aae7b9e3c70c55f513

https://qiita.com/kaku3/items/3378ea55b1240d7360a1


## おまけ４（エンジニアのためのお仕事問題集）

2030年にIT人材が最大79万人不足するらしいので、学習用の資料をgitで**無料**公開してます(不定期更新)。
よろしければどうぞ。

[エンジニアのためのお仕事問題集](https://github.com/kaku3/workbooks)

[^1]: 「自己実現欲求」や「承認欲求」だけが飛び抜けている方もいるようですがここでは考察しません。
SCSS使ってレスポンシブを学んだ with Laravel

Laravelのbladeファイルの中でSCSSを使ってレスポンシブ対応の本的な部分を学習したので、メモ残します。

今回はシンプルに、スマホで見た時、背景色を緑にするというだけのものです。

## 結論

- _mixin.scssでレスポンシブになるサイズを定義
    - 自分の場合は以下のパスに作成
    - src/public/css/foundation/_mixin.scss
    - ※foundationディレクトリでなくも大丈夫です。
    - ※_mixin.scssの名前は何でもいいです
    
    _mixin.scss
    
    ```php
    $sp: 449px;  // スマホサイズを定義
    
    @mixin sp{
    		// 横幅が499px以下になるとスマホサイズに
        @media (max-width: ($sp)){
            @content;
        }
    }
    ```
    

- scssファイルで_mixin.scssをimportする
src/public/css/style.scss
    
    ```php
    @import "foundation/_mixin"; //スマホサイズ定義をインポート
    
    .top_title{
        // スマホサイズの時に適用するスタイル
        @include sp{
            background-color: green;
        }
    }
    ```
    

- html（blade.php）ファイル
    
    src/resources/views/Layouts/app.blade.php
    
    ```php
    <html lang="ja">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>play ground</title>   
        <link rel="stylesheet" href="/css/style.css" >
    </head>
    <body>
        <header>
            <div class="top_title">
                <h1>レスポンシブ</h1>
            </div>
        </header>
    </body>
    </html>
    ```
    


## **参考**

[https://macoblog.com/sass_media_query/](https://macoblog.com/sass_media_query/)

[https://tenderfeel.github.io/SassReference/basic/#:~:text=ファイル名先頭にアンダー,ファイルは１つだけ。](https://tenderfeel.github.io/SassReference/basic/#:~:text=%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E5%85%88%E9%A0%AD%E3%81%AB%E3%82%A2%E3%83%B3%E3%83%80%E3%83%BC,%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AF%EF%BC%91%E3%81%A4%E3%81%A0%E3%81%91%E3%80%82)

## 備忘録ブログに続き書いてます
https://run-fish.com/laravel%e3%81%ae%e4%b8%ad%e3%81%a7scss%e4%bd%bf%e3%81%a3%e3%81%a6%e3%83%ac%e3%82%b9%e3%83%9d%e3%83%b3%e3%82%b7%e3%83%96%e3%82%92%e5%ad%a6%e3%82%93%e3%81%a0/
vbsの作法 その56

# 概要
vbsの作法、調べてみた。
vbsから操れるUIコンポーネントをC#で書いてみた。
練習問題、やってみた。

# 練習問題
zundokoを実装せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/76a59e05-9355-b436-f408-7b03ab08e275.png)

# サンプルコード

```
Dim o
Set o = CreateObject("Ohi.Compo7")
Dim zundoko, loopCnt, result, tempResults
loopCnt = 0
Set zundoko = CreateObject("System.Collections.ArrayList")
Do While True
    If loopCnt > 5 Then
        loopCnt = 0
    End If
    If Rnd < 0.5 Then
        zundoko.add "ズン"
    Else
        zundoko.add "ドコ"
    End If
    If loopCnt = 4 Then
        result = zundoko(zundoko.Count - 5) & zundoko(zundoko.Count - 4) & zundoko(zundoko.Count - 3) & zundoko(zundoko.Count - 2) & zundoko(zundoko.Count - 1)
        If result = "ズンズンズンズンドコ" Then
            Exit Do
        End If
    End If
    loopCnt = loopCnt + 1
Loop
result = ""
For Each item In zundoko
    result = result & item
Next
o.Put result & " キ・ヨ・シ！"
a = o.Open()
Set o = Nothing


```

以上。
vbsの作法 その55

# 概要
vbsの作法、調べてみた。
vbsから操れるUIコンポーネントをC#で書いてみた。
練習問題、やってみた。

# 練習問題
九九を実装せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/56745a30-336b-8ed3-46d7-fdc3bd30d1a6.png)

# サンプルコード

```
Dim o
Set o = CreateObject("Ohi.Compo7")
Set stb = CreateObject("System.Text.StringBuilder")
stb.Append_3 "    "
for i = 1 to 9
    stb.AppendFormat "   {0:d}", i
next 
stb.Append_3 vbcrlf
for i = 1 to 9
    stb.AppendFormat "  {0:d}", i
    for j = 1 to 9
        if i * j < 10 then
            stb.AppendFormat "   {0:d}", i * j
        else
            stb.AppendFormat " {0:d}", i * j
        end if
    next
    stb.Append_3 vbcrlf
next
o.Put stb.ToString
a = o.Open()
Set o = Nothing





```

以上。
ChatGPT vs Google

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225269/f56988b4-81f1-9c9f-6c1f-957942432b2a.png)

## 概要

ChatGPT は新しい検索エンジンですか? Googleを買収するつもりですか？ この短い記事では、これら 2 つのサービスをさまざまなトピックで比較しています。

ChatGPTとGoogle検索の比較表：

| トピック            | ChatGPT                                          | Google検索                                       |
|------------------|--------------------------------------------------|--------------------------------------------------|
| 目的          | 会話を続け、質問に答えること                        | インターネット上で情報を検索すること                 |
| インタラクション      | 会話形式で、人間らしい回答                        | キーワードベースの検索エンジン                         |
| 出力           | テキストベースの回答                             | ウェブサイト、記事、画像、動画へのリンク                 |
| 適応性     | 異なるスタイルやトーンに適応することができる          | 全てのユーザーに同じ出力をする                         |
| パーソナライズ | パーソナライズされた回答を生成することができる        | 過去の履歴に基づいて検索結果をパーソナライズすることができる |
| クリエイティビティ       | 物語などのクリエイティブなコンテンツを生成することができる | クリエイティブなコンテンツを生成することができない       |
| コンテキスト認識| 文脈や以前のやり取りを理解することができる | 同じレベルのコンテキスト認識を持たない|
| 機械学習 | GPT-3.5アーキテクチャをベースにしている                 | 様々な機械学習アルゴリズムをベースにしている              |
| オーナーシップ        | OpenAIが開発                               | Googleが開発                              |
| アクセシビリティ    | 様々なアプリケーションを通じて利用可能             | ウェブブラウザーやモバイルアプリを通じて利用可能          |

## まとめ

結論として、ChatGPTとGoogle検索の比較表は、この2つのツールの重要な違いを強調しています。ChatGPTの会話型インターフェースと創造的なコンテンツの生成能力は、Googleは伝統的なキーワードベースの検索エンジンとは異なります。また、ChatGPTの様々なスタイルとトーンへの適応性、コンテキストと過去のインタラクションの理解能力は、競合他社に比べて優位性があります。

ただし、Bing検索にGPT-4が導入されたことで、Microsoftの検索エンジンは、検索エンジン競争における新しいチャレンジャーとなる可能性があります。GPT-4には、より高度な機械学習アルゴリズムと自然言語処理の能力が期待されており、個人に合わせた検索結果、コンテキストの認識能力、会話型能力などでBing検索に優位性を与える可能性があります。
vbsの作法 その54

# 概要
vbsの作法、調べてみた。
vbsから操れるUIコンポーネントをC#で書いてみた。
練習問題、やってみた。

# 練習問題
fizzbuzzを実装せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5dac5647-9dca-039f-5a0e-204389cea75a.png)


# サンプルコード

```
Dim o
Set o = CreateObject("Ohi.Compo7")
Dim i
Dim str
str = ""
For i = 1 To 100
	If i Mod 15 = 0 Then
		str = str & "FizzBuzz "
	ElseIf i Mod 3 = 0 Then
		str = str &  "Fizz "
	ElseIf i Mod 5 = 0 Then
		str = str &  "Buzz "
	Else
		str = str & CStr(i) & " "
	End If
Next
o.Put str
a = o.Open()
Set o = Nothing


```


以上。
オブジェクトの拡張方法

JavaScriptであるオブジェクトから別のオブジェクトにプロパティをコピーする方法のメモ。

```js
let target = { x: 1 },
  source = { y: 2, z: 3 };
for (let key of Object.keys(source)) {
  target[key] = source[key];
}
target // { x: 1, y: 2, z: 3 }
```
上のコードではtargetにsourceのオブジェクトをコピーできる。ですが、ES6からは新しいメソッドが追加されている。

```js
let target = { x: 1, y: 2 },
  source = { y: 3, z: 4 };
Object.assign(target, source);
target // { x: 1, y: 3, z: 4 }
```
`Object.assign()`メソッドである。ただし、これはすでにオブジェクトに同じ名前のプロパティが定義されていた場合はそれも上書きされてしまいます。それを防ぎたい場合は次のように書く。

```js
target = Object.assign({},source,target)
target // { x: 1, y: 2, z: 4 }
```
新しいオブジェクトを生成し、そこにsource、をコピー、targetで上書きします。またこのような処理は次のようにスプレッド演算子（...)を使用しても同様に処理が可能。
```js
target = { ...source, ...target };
target // { x: 1, y: 2, z: 4 }
```


#### 勉強した本
https://www.amazon.co.jp/JavaScript-%E7%AC%AC7%E7%89%88-David-Flanagan/dp/4873119707/ref=pd_vtp_h_pd_vtp_h_sccl_1/355-2445868-3340539?pd_rd_w=TWfda&content-id=amzn1.sym.cbe5b1af-8663-4a63-8153-1f9ef8eb65e4&pf_rd_p=cbe5b1af-8663-4a63-8153-1f9ef8eb65e4&pf_rd_r=8G3FXEMPMHE11JAFEKN8&pd_rd_wg=1fFQr&pd_rd_r=c2ad1505-4025-4f17-bf57-bae993d90c32&pd_rd_i=4873119707&psc=1
【学習記録01】身長と体重を入力して、BMIを計算するコード

この4月からJavaを学んでいます。
本を見て、学んだことを用いたオリジナルコードを作成し、投稿していきます。
教材『スッキリわかるJava入門 第3版』
URL:https://sukkiri.jp/books/sukkiri_java3

今回は第３章までの内容から、
➀体格指数の一つである、BMIの計算と、
➁BMIをもとに肥満度の判定を行っていきます。

```Java:qiita.rb
public class Sample001{
	public static void main(String[] args) {
		System.out.println("Hello World!");
		System.out.println("こんにちは！ここではあなたのBMIを計算します。");
		
		System.out.println("まずは、あなたのお名前を入力してください。");
		String name = new java.util.Scanner(System.in).nextLine();
		//名前の入力
		
		System.out.println("ようこそ、"+name+"さん、では次に年齢を入力してください。");
		int age = new java.util.Scanner(System.in).nextInt();
		//年齢の入力
		
		System.out.println("体重を入力してください。");
		String weightString =new java.util.Scanner(System.in).nextLine();
		System.out.println("最後に身長を入力してください。");
		String highString = new java.util.Scanner(System.in).nextLine();
		//体重と身長の入力
		
		int weight = Integer.parseInt(weightString);
		int high = Integer.parseInt(highString);
		//入力された体重と身長を数値に変換
		
		double bmi;
		bmi = weight/((high*high)/10000.0);
		//BMIの計算式（BMIは小数第一位で表されることが多いため、double型）
		
		System.out.println(String.format("あなたのBIMは%.1fです。", bmi));
		//BMIの結果出力
		
		System.out.println("BMIから"+name+"さんの肥満度がわかります。");
		if (bmi<18.5) {
			System.out.println("判定は「低体重」です。");
			System.out.println("無理のない範囲で体重を増やした方がいいでしょう。");
		}else if(bmi>=18.5 && bmi<25) {
			System.out.println("判定は「普通体重」です。");
			System.out.println("適正な体重です。維持していきましょう。");
		}else if(bmi>=25 && bmi<30) {
			System.out.println("判定は「軽度肥満」です。");
			System.out.println("少し肥満気味です。まだ間に合います。痩せましょう。");
		}else if(bmi>=30) {
			System.out.println("判定は「肥満」です。");
			System.out.println("病院に行きましょう。将来的に生活習慣病になります。");
		}
		
	}
		
}
```
ChatGPT　段階的に解かせて理想の結果をもらう

<h1>段階的に解かせる

もしみている方がいればやってみてください


りんご 5 個とみかん 10 個買った。代金の合計は 1500 円だった。
りんご 1 個の値段はみかん 1 個より 30 円高い。みかんは 1 個いくらか

【答】みかん１個 90 円


ChatGPTに解かせてみると
![スクリーンショット 2023-04-22 16.05.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3331212/cd16d7e4-00c2-b0a1-bb18-93a520a231db.png)

みかん1個150円で間違っていますね



ここで「段階的に考えて答えてください」というと
![スクリーンショット 2023-04-22 16.07.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3331212/c5072561-c127-efa4-70a1-233616891dbc.png)

正解になりまっした。

1つのタスクに集中して解かせる方が正解に近い答えを出す場合が多いようです
vbsの作法 その53

# 概要
vbsの作法、調べてみた。
vbsから操れるUIコンポーネント(COM DLL)をC#で書いてみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5dcda026-8973-8d57-4a6e-e1d2cdbcde37.png)

# サンプルコード
ohitest.vbs

```
Dim o
Set o = CreateObject("Ohi.Compo7")
o.Put "hello world!"
a = o.Open()
msgbox a
Set o = Nothing
```

# 環境
windows 10 64bit

# UIコンポーネントのコード

```
using System;
using System.Windows.Forms;
using System.Drawing;

namespace Ohi
{
	public class Compo7 : Form {
		private static string retValue = String.Empty;
		private TextBox textBox1;
		private TextBox textBox2;
		private Button button1;
		private Button button2;
		private Button button3;
		private Button button4;
		public Compo7() {
			Text = "Ohicompo7";
			ClientSize = new Size(550, 550);
			textBox1 = new TextBox();
			textBox1.Location = new Point(30, 30);
			textBox1.Multiline = true;
			textBox1.Size = new Size(400, 400);
			textBox1.TabIndex = 2;
			textBox1.Text = retValue;
			textBox2 = new TextBox();
			textBox2.Location = new Point(30, 450);
			textBox2.Size = new Size(400, 40);
			textBox2.Text = "";
			button1 = new Button();
			button1.Location = new Point(450, 50);
			button1.Text = "0";
			button1.Click += new EventHandler(button1_Click);
			button2 = new Button();
			button2.Location = new Point(450, 100);
			button2.Text = "1";
			button2.Click += new EventHandler(button2_Click);
			button3 = new Button();
			button3.Location = new Point(450, 150);
			button3.Text = "2";
			button3.Click += new EventHandler(button3_Click);
			button4 = new Button();
			button4.Location = new Point(450, 450);
			button4.Text = "send";
			button4.Click += new EventHandler(button4_Click);
			Controls.AddRange(new Control[] {
				textBox1,
				textBox2,
				button1,
				button2,
				button3,
				button4
			});
		}
		private void button1_Click(object sender, EventArgs e) {
			retValue = "0";
			this.Close();
		}
		private void button2_Click(object sender, EventArgs e) {
			retValue = "1";
			this.Close();
		}
		private void button3_Click(object sender, EventArgs e) {
			retValue = "2";
			this.Close();
		}
		private void button4_Click(object sender, EventArgs e) {
			retValue = textBox2.Text;
			this.Close();
		}
		public void Put(string str) {
			retValue = str;
		}
		[STAThread]
		public string Open() {
			Application.EnableVisualStyles();
			Application.Run(new Compo7());
			return retValue;
		}
	}
}

```

# コンパイル、登録、実行手順

```
>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%


>csc /target:library /platform:anyCPU ohicompo7.cs


>regasm /codebase ohicompo7.dll


>%systemdrive%\Windows\SysWoW64\CScript.exe ohitest.vbs


```

以上。