OmniAICreator/Qiita-1.07M huggingface dataset:
Photon Self-Hosting Serverの設定

PhotonのSelf-Hosting Serverを使うためには次の4つが必要
1\. Windowsの特定のポートを開放
2\. NameServer.jsonの設定
3\. GameServer.xml.config の編集
4\. PhotonServer.configの編集
また、ソースコード内にAppSettingsの設定が必要


## Photon Server のダウンロード
[こちら](https://www.photonengine.com/ja-jp/sdks#server-sdkserverserver)からphoton Serverをダウンロード

## Windowsの特定のポートを開放
[こちら](https://support.borndigital.co.jp/hc/ja/articles/360002711593-Windows10%E3%81%A7%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E9%96%8B%E6%94%BE%E3%81%99%E3%82%8B)を参考にWindowsの特定のポートを開放する。
開放するポートは以下の通り([参考](https://doc.photonengine.com/ja-jp/realtime/current/connection-and-authentication/tcp-and-udp-port-numbers))

開放するポート
|ポート番号|	プロトコル	|目的|
|:-----------|------------:|:------------:|
|5058または27000	|UDP	|クライアントからネームサーバー (UDP)|
|5055または27001	|UDP	|クライアントからマスターサーバー (UDP)|
|5056または27002	|UDP	|クライアントからゲームサーバー (UDP)|
|4533	|TCP	|クライアントからネームサーバー (TCP)|
|4530	|TCP	|クライアントからマスターサーバー (TCP)|
|4531	|TCP	|クライアントからゲームサーバー (TCP)|
|9090	|TCP	|クライアントからマスターサーバー (WebSocket)|
|9091	|TCP	|クライアントからゲームサーバー (WebSocket)|
|9093	|TCP	|クライアントからネームサーバー (WebSocket)|

## NameServer.jsonの設定
ディレクトリ名「Deploy」にあるNameserver.jsonを編集する
```json
{
  "Nodes": [
    {
      "Region": "jp",
      "IpAddress": "IPアドレス",
      "IpAddressIPv6": "::1",
      "Hostname": "マシン名 or localhost"
    }
  ]
}
```
## GameServer.xml.config の編集
deploy\LoadBalancing\GameServer\binのGameServer.xml.configのIPアドレスを指定している個所をサーバを実行しているPCのIPアドレスに変更
```xml
（中略）
    <S2S>
        <ConnectRetryInterval>15</ConnectRetryInterval>
        <MasterIPAddress>IPアドレス</MasterIPAddress>
        <OutgoingMasterServerPeerPort>4520</OutgoingMasterServerPeerPort>
    </S2S>
（中略）
 <!--public サーバにしない場合は不必要かも？ -->
 <PublicIPAddress>IPアドレス</PublicIPAddress>　
```
## PhotonServer.configの編集
deploy\bin_Win64のPhotonServer.configを編集する
```xml
 <UDPListener
        IPAddress="IPアドレス"
        Port="5055"
        OverrideApplication="Master">
 </UDPListener>
(中略）
```
変更箇所が多数あるので、一括変換で0.0.0.0からサーバのIPアドレスに変更する。

## ソースコード
Photon Sel hosting serverに接続するクライアントのコード
```C#
void Start()
    {
        PhotonNetwork.Disconnect();
        ConnectToServer();
    }
    private void ConnectToServer()
    {
        AppSettings settings = new AppSettings();
        settings.FixedRegion = "jp";
        settings.UseNameServer = true;//Ver.5のServerを使う場合はTrueであること
        settings.AppIdVoice = "YOUR APPID";
        settings.AppVersion = "VERSION NUMBER"; // optional
        settings.Port = 0; //"0"でデフォルトのポートに接続
        settings.Server ="YOUR ONPRE SERVER IP ADDRESS";
        PhotonNetwork.ConnectUsingSettings(settings);
    }
```
Tech Mediaへの寄稿も！Promoting SGの今年の活動について

こんにちは！
本アドベントカレンダーの企画も行っているOpenChain Japan WGのPromotion SG(Subwork Group)のリーダーを務めている遠藤です。
本日[Open Source Summit Japanでパネルディスカッション](https://sched.co/1EMhy)を行う予定なので、
クロアチア戦は横浜で観戦します！
ちょうど、[前回のW杯のときもOpen Source Summit Japan](https://monoist.itmedia.co.jp/mn/articles/1806/22/news046_2.html)が開催されてましたね。

# Promotion SGの復習
[以前の記事](https://qiita.com/MasatoENDO/items/324354bc9d86520917ba)でも紹介しましたように、
Promotion SGは、オープンソースコンプライアンスの重要性をPromoteするために、
オープンソースそのものやコミュニティ活動の重要性についてのPromoteも行っています。
これまで様々なイベントに企画・参加したり、政府や学術界・メディアとのコラボレーションを続けてきました。
活動は多岐に渡り、参加には必ずしも専門的な知識が必要なわけではありませんので、
コミュニティ活動初心者の方にも是非ご参加頂けると嬉しいです！
![qiita.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537313/58f4d1e8-1c4d-be3f-9074-7d60982ad037.jpeg)

# 本年の活動例

■台湾WGのミーティングでOpenChain Japan WGの活動の紹介を行いました
OpenChainの国別WGは2017年に日本からはじまり、韓国・中国・インド・ドイツ・UKなど
様々な国に拡がっていき、国別WG間の交流も活発に行われています。
その中の一つに台湾WGがあり、そのミーティングにお声がけ頂けたので、Japan WGの活動紹介などを行いました。

■電気通信大学、[日本大学](https://www.law.nihon-u.ac.jp/info/8994/)、静岡大学でオープンソースに関する講義を行いました
将来のオープンソースカルチャーを担うであろうエンジニアや法律家志望の皆様に、
コミュニティ活動の重要性やライセンスを遵守することの意義等をお伝えすべく講義を実施しました

# Tech Mediaでの連載記事を企画！
本SGの今年の新たな取り組みとして＠ITにおける連載記事の企画・執筆があります。
現在も継続中の長期連載の「[解決！OSSコンプライアンス](https://atmarkit.itmedia.co.jp/ait/series/27403/)」と
夏に短期的に連載した「[OSSのサプライチェーン管理、取るべきアクションとは](https://atmarkit.itmedia.co.jp/ait/series/30163/)」です。

■[解決！OSSコンプライアンス](https://atmarkit.itmedia.co.jp/ait/series/27403/)
OSSコンプライアンスと聞いても具体的に何をすれば良いのか、どんな課題があるのかイメージできない方も多いと思います。
そこで本連載では、日本のソフトウェア開発企業X社の新人開発者新城くんが日々のソフトウェア開発の業務の中で直面するOSSコンプライアンスに関するトラブルを解決して成長していくというストーリー仕立てで各トピックを紹介することで、より課題を自分事としてイメージして頂けるものにしたいと考えています。

■[OSSのサプライチェーン管理、取るべきアクションとは](https://atmarkit.itmedia.co.jp/ait/series/30163/)
オープンソースのサプライチェーンのトピックの中で最近特に話題に話題になっている「OSPO」と「SBOM」。
これらのキーワードの解説記事と、
それらへのソニー、富士通、メルカリ、日立ソリューションズ、ルネサスエレクトロ二クス、トヨタ自動車といった
日本企業の取り組みを座談会形式で紹介する記事のセットをセットにしています。
![@IT.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537313/54068b37-5b78-2728-f9ba-551dcab48c86.jpeg)



# 困りごとがある方、コミュニティ活動に興味がある方一緒に活動しましょう！
上でも書きましたが私たちはエンジニアの皆さんはもちろん、法務・知財・営業など職種に関係なく、
コミュニティ活動に少しでも興味がある方にご気軽に参加して頂きたいと考えてます。
また、うちの会社・学校でオープンソース教育をやって欲しい、上司や役員にオープンソースの重要性を遡及して欲しいといったご要望も
お待ちしていますので、是非お声がけください！
参加方法は、[2日目の記事](https://qiita.com/owada-k/items/54cf9ef5b4a101f9b043)を参照頂き、Slack等でお声がけ頂くか、
遠藤のLinkedInまでご連絡ください。。

# English Summary
OpenChain Japan WG Promotion SG is also promoting the importance of open source itself and community activities to promote the importance of open source compliance.
A new initiative this year for the SG is the planning and writing of a series of articles in the Japanese tech media.
The long-running series, "[Solve! OSS Compliance](https://atmarkit.itmedia.co.jp/ait/series/27403/)" is still ongoing. 
”[OSS Supply Chain Management, What Actions Should be Taken?]((https://atmarkit.itmedia.co.jp/ait/series/30163/))" was also intensively serialized over the summer.
We are looking for others to join our community!!
if文を使った演習

# 問題
うるう年かどうか判定するメソッドを作成しなさい。
うるう年の判定条件は「4で割り切れる」「100で割り切れない」「400で割り切れる」とする。
 ※ うるう年である場合に返却する文字列
 "西暦 : year年 <改行文字>うるう年です。
※ うるう年ではない場合に返却する文字列
 "西暦 : year年 <改行文字>うるう年ではありません。

```java
public static void main(String[] args) {
		System.out.println(leapYear(2020));
		
	}
	public static String leapYear(int year) {
		if (year % 400 == 0) {
			return "西暦 : " + year + "年\nうるう年です。";
		} else if (year % 100 == 0) {
			return "西暦 : " + year + "年\nうるう年ではありません。";
		} else if (year % 4 == 0) {
			return "西暦 : " + year + "年\nうるう年です。";
		} else {
			return "西暦 : " + year + "年\nうるう年ではありません。";
		}
	}

//演算結果
//西暦 : 2020年
//うるう年です。

```

## 補足
- ４００で割れれば４でも割れるということなので最初に４００の条件を設定
→条件を自分で読み取って整理することも大事
- 改行文字\n
→文字と同じ扱いなので""が必要
→eclipseでは¥で表示されるので混同しないように注意
トランザクション処理でテストが容易になる？

ver19.6でトランザクション処理ステップが実装されましたね。これでテストコードがある程度書けるかな？　と思った人多いと思うので、ちょっとそれっぽい事をやってみました。まだ1日しか触ってないので十分理解してない部分もありますが。

流れとして、テストしたいスクリプトをトランザクションで囲み、スクリプトの結果でテストメッセージを作成するという感じでそれっぽくなるかなと。

例えば、引数で受け取った値を使って新規レコードを作成するスクリプトがあるとします。

###### テスト対象のスクリプト
```
変数を設定[$name; 値: Get(スクリプト引数）]
新規レコード/検索条件
フィールド設定[名前 ; $name]
レコード/検索条件確定

#エラーをJSONに
変数を設定[$lastError; 値 : Get(最終エラー)]
変数を設定[$lastErrorLocation; 値 : Get(最終エラー位置)]
変数を設定[$errorJson; 値 : 
JSONSetElement ( "";
["errorCode";$lastError;JSONString];
["lastErrorLocation";$lastErrorLocation;JSONString]
 )]

#テストしたいフィールドの値
変数を設定[$nameFieldValue;  値: 名前フィールド]
変数を設定[$testField ; 値 : JSONSetElement ( "";"name";$nameFieldValue;JSONString)
変数を設定[result ; 値 : 
JSONSetElement ( "";
["testField";$testField;JSONObject];
["error";$errorJson;JSONObject]
)

現在のスクリプト終了[テキスト結果: $result]
````

このスクリプトの結果として、名前フィールドの値が引数で受け取った値と一致するかどうかのテストコードを書くとすると、
###### テストスクリプト
```
トランザクションを開く[]

    スクリプト実行[テストしたいスクリプト ; 引数: "田中"]
    変数を設定[$scriptResult ; 値: Get(スクリプトの結果 )]
    変数を設定[$error ; 値 : JSONGetElement($scriptResult; "error"]
    トランザクションの復帰[エラーコード: 5001 ; エラーメッセージ: $error]

トランザクションの確定

#この時点でレコード作成はキャンセルされているので、スクリプトの結果を使ってテストができる。

============
#名前フィールドの値は"田中"でなければならない。
============
#テストしたいフィールドの値
変数を設定[$nameFieldValue ; 値 : JSONGetElement($scriptResult; "testField.name")]

#スクリプトの結果として受けとった$nameFieldValueが、"田中"だったら、テストは合格となる
If [$nameFieldValue = "田中"]
    変数を設定[$message ; 値: "OK"]
Else
    変数を設定[$message ; 値: "failed"]
End If

現在のスクリプト終了[テキスト結果: $message]
```

以上はごく簡単なやつですが、
例えばフィールドに計算式を使っていて、その値が正しくセットされているか？というテストの場合。
一例として電話番号を入力すると、先頭に国番号を付与して最初の0を取るという計算式がフィールドに仕込みまれているとします。
08011112222なら、
計算式 "+81" & Right ( Self; Length ( Self )-1 )
が適用されて、
+8111112222
となるフィールドがあるとします。

これも引数で電話番号を受け取るとして、上記と同じようなスクリプト（名前フィールドの部分を電話番号に置き換えて下さい）があった場合、
###### テストスクリプト
```
#引数として"08011112222"という番号をテスト対象のスクリプトに渡し、そのスクリプト結果を受け取り、
\\\\\\
以下省略
\\\\\\

============
#phoneNumberフィールドの値は""+811111222"でなければならない。
============
#テストしたいフィールドの値
変数を設定[$phoneNumberFieldValue ; 値 : JSONGetElement($scriptResult; "testField.phoneNumber")]

#スクリプトの結果として受けとった$phoneNumberFieldValueが、"+811111222"だったら、テストは合格となる
If [$phoneNumberFieldValue = "+811111222"]
    変数を設定[$message ; 値: "OK"]
Else
    変数を設定[$message ; 値: "phone field is wrong: expected = " & "+811111222" & "  received = " & $phoneNumberFieldValue]
End If

#わざとテストを失敗させる場合、
変数を設定[$phoneNumberFieldValue ; 値 : "11122223333"]
If [$phoneNumberFieldValue = "+811111222"]
    変数を設定[$message ; 値: "OK"]
Else
    変数を設定[$message ; 値: "phone field is wrong: expected = " & "+811111222" & "  received = " & $phoneNumberFieldValue]
End If

現在のスクリプト終了[テキスト結果: $message]

```
というふうにテストを故意に失敗させるケースも記述でき、そのテスト判定を返せます。

もちろん全てのテストをカバーできるとは思いませんが、テストを意識してスクリプトを細かく分割しておくと、かなりの部分がテストできる気がします。何より、このテストスクリプトにテスト意図をコメントで書いておけば、それがそのままドキュメントになります。

#### まとめ
FileMaker = データベースですので、どうしてもレコード作成が発生するケースが多く、テストをしても、それを元に戻す処理って本当に面倒でした。結局面倒なので手動で元に戻すという危ない事をよくやってました。
一番助かるのが外部webアプリからdataAPIを使ってFileMakerのレコードを作成するようなケースで、web側のテストコードの中にレコード作成系のテストを安全に組み込めるようになる事です。
いきなりこんな画期的ステップがアップデートで用意されて驚きです。
プリザンターの一覧画面の行にボタンを配置してクリック時に何かする

本記事は [OSSのノーコード・ローコード開発ツール「プリザンター」 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/pleasanter) 4日目の記事です。

# はじめに
[プリザンター](https://pleasanter.org) の一覧画面、多機能で便利なのですが、行にボタンを配置してクリック時になにかするといったことができないので、そういうときのカスタマイズ方法について記載します。

## ボタンを配置する列の作成
ボタンを配置する列を一覧画面に追加します。「テーブルの管理」→「一覧」と操作し、任意の「分類項目」または「説明項目」を有効化します。本記事では「分類I」を使用しました。

## ボタンの配置
ボタンの配置です。ボタンは「サーバスクリプト」を使用して実装することができます。「テーブルの管理」→「サーバスクリプト」→「新規作成」と操作して、任意のタイトル、スクリプトに下記のコード、条件に「行表示の前」を設定します。下記の例では「分類I」の項目のRawTextプロパティを使用してボタンのHTMLを記述しています。クリックするボタンのIDを取得しやすいようにするために、data-id属性にmodel.IssueIdを埋め込んでいます。記録テーブルの場合には、model.ResultIdに書き換えてください。classにbutton-iconを指定するとボタンにプリザンター風のデザインが適用されます。data-iconにはアイコンに使いたい画像の名前を[ここ](https://api.jqueryui.com/theming/icons/)から選択して入力するといい感じのボタンになります。あとからボタンにイベントを付与しやすいようにmy-row-buttonなどのclassを付与しておきます。

```JavaScript
columns.ClassI.RawText = `<button 
    data-id="${model.IssueId}"
    class="button-icon my-row-button"
    data-icon="ui-icon-circle-triangle-e">
        click
</button>`;
```

ボタンが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78230/c9ebe8a9-620a-6e28-d5eb-ae7311747ba6.png)

## ボタンクリック時のイベント追加
追加したボタンをクリックした際に何等か動作をさせる際には「スクリプト」を追加します。「テーブルの管理」→「スクリプト」→「新規作成」と操作して、任意のタイトル、スクリプトに下記のコード、出力先は「一覧」を設定します。下記の例はクリックした行のレコードIDをコンソールに出力しています。行をクリックすると、プリザンターは編集画面に遷移する動作が動いてしまうため、これを抑止するためにstopImmediatePropagationを呼び出します。

```JavaScript
// my-row-buttonがクリックされたときのイベント
$(document).on('click', '.my-row-button', function (event) {
    // レコードのIDをコンソールに出力
    console.log($(this).data('id'));
    // 編集画面が開かないようにイベントの伝搬を停止
    event.stopImmediatePropagation();
});
```

ボタンをクリックするとレコードのIDがコンソールに出力されました。これを応用してAPI連携を行うなど一覧画面上の機能を拡張することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78230/2ce522fc-f624-5233-6d30-627572162079.png)
サービスプログラムを作成できるようになるまで（２）_サービスプログラムが実行される流れ

## はじめに

前回は、[サービスプログラムの実現を可能としている ILE（統合化開発環境）](https://qiita.com/tamaday/items/f99e1c307ff69ee42ee0)についてご紹介しました。
今回は、プログラム内でサービスプログラムが実行されるまでの流れについてご紹介します。

この記事は、プログラム開発をする上で欠かせないサービスプログラムの、一から学習した記録をシリーズに分けてご紹介しています。

## サービスプログラムの作成手順

以下の手順でサービスプログラムを作成します。

1. プログラム内で呼び出したいプロシージャーを記述する。
   一つのサービスプログラム内には、複数のプロシージャーを宣言することが可能です。
2. プロシージャーを記述したソース・メンバーをモジュールにする。（画像１）
3. 公開したいモジュールをエクスポートリストに記述する。
4. モジュールからサービスプログラムを作成する際にエクスポートリストを読み込む。（画像２）

（画像１）
![createServiceProgram-02_01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/e74c95fa-0281-190f-38fe-de43e599c3a0.png)


（画像２）
![createServiceProgram-02_02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/0318af60-b710-54c7-96ab-c2455b94e470.png)

## サービスプログラムはどうやって実行されているのか？

プロシージャーを実行するプログラムを作成（コンパイル）する際に、実行したいプロシージャーを宣言しているサービスプログラムを指定します。
その際、代わりにバインディング・ディレクトリーを指定することができます。
バインディング・ディレクトリーを指定した場合、バインディング・ディレクトリー内でサービスプログラムが登録されていれば、プロシージャーを実行することが可能です。（画像３）

（画像３）
![createServiceProgram-02_03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/8346bee4-9dc3-6908-02bc-bc5343cf3864.png)

## おわりに

今回はプログラム内でサービスプログラムが実行されるまでの流れについてご紹介しました。

最後までお読み頂きありがとうございます。

## 関連した投稿

[サービスプログラムを作成できるようになるまで（１）_サービスプログラムの前提](https://qiita.com/tamaday/items/f99e1c307ff69ee42ee0)
[サービスプログラムを作成できるようになるまで（３）_サービスプログラムの作成](https://qiita.com/tamaday/items/3aabbb492d01eb86bfe0)
[サービスプログラムを作成できるようになるまで（４）_サービスプログラムの実行](https://qiita.com/tamaday/items/a5181ed4faa9949e0707)
docker-compose.yml ネットワーク周りの覚え書き

# 概要
- Dockerコンテナ内からホストにアクセスする方法（Linux）
- docker-composeでコンテナのIPアドレスを固定する方法


# Dockerコンテナ内からホストにアクセスする方法（Linux）

```yml
version: '3'
services:
  test:
    image: IMAGE
    ports:
      - 8080:8080
    extra_hosts:
      - "host.docker.internal:host-gateway"
    volumes:
      - ./test/:/test
```
docker-composeには、`extra_hosts`というオプションがあるのでそれを使用。
`host.docker.internal:host-gateway`でコンテナ内からホストにアクセスできるように、ホストのIPアドレスを渡す。


# docker-composeでコンテナのIPアドレスを固定する方法

固定サブネットでネットワークを定義する。（今回は`172.30.0.0/24`を指定）
`test_network`はネットワーク名なので任意。
```yml
version: '3'

networks:
  test_network:
    ipam:
      driver: default
      config:
        - subnet: 172.30.0.0/24
```


上記で設定したネットワークを指定したコンテナをデプロイ。
```yml
services:
  test:
    image: IMAGE
    ports:
      - 8080:8080
    volumes:
      - ./test/:/test
    networks:
      test_network:
        ipv4_address: 172.30.0.2
```
こちらが全体像
```yml
version: '3'

networks:
  test_network:
    ipam:
      driver: default
      config:
        - subnet: 172.30.0.0/24

services:
  test:
    image: IMAGE
    ports:
      - 8080:8080
    volumes:
      - ./test/:/test
    networks:
      test_network:
        ipv4_address: 172.30.0.2
```
プログラミング学習を学ぶ前に知っておきたいこと~無料でおてがる学習編~

## 初めに
この記事は**プログラミング学習を学ぶ前に知っておきたいこと**と題したシリーズの一つです。
このシリーズは各テーマごとに連日投稿予定です。

## このシリーズ記事の対象者
- プログラミングに興味を持って、学習を検討している方
- 学習したいけど、何から手をつけたらいいのかわからない方

::: note warn
※今回からの記事はWebアプリケーションの開発の勉強をしたい方向けの情報になります。筆者が未経験のスマホアプリケーションやゲームについての記述はございませんのであらかじめご了承下さい。
:::

[前回の記事](https://qiita.com/MPrg2011/items/1b0ce5c6d8cce5e0fc30)の続きです。

https://qiita.com/MPrg2011/items/1b0ce5c6d8cce5e0fc30

## 言語に触れてみたら本格的に学習をしてみたくなった！という方に

### Web上で教材を探してみよう
Web上で教材を探すメリットとして
- コードの見本などがあり答え合わせやお試しが容易(コピペができるので)
- 情報が比較的新しいものが多い。
こちらに関しては最終更新日を確認しておきましょう。

### 完全無料

https://codeprep.jp/

> CODEPREPは、プログラムを書いて動かしながら学ぶ実践型のプログラミング学習サービスです。<br>
CODEPREPでは1日10分から始められる、プログラムを書くことでページをめくる穴埋め式ドリル形式の”ブック”を幅広く揃え、 「毎日こつこつプログラムを書く習慣」と「様々なものを動かす体験」を提供し、プログラミング学習の「継続」をサポートしていきます。<br>
"CODEPREP よくある質問より"

TOPページから本を選び、その中の課題をこなすことで理解を進めていくスタイルです。
playgroundモードに切り替えると、ブラウザ上でコードを操作することも可能です。

https://cbc-study.com/

正直このサイト知っていたら、プログラミングスクール行かなくてもよかったかも…と思えるくらい内容が充実しています。
HTML/CSS,JavaScriptに加え、PHP,データベース、JavaScriptのフレームワークであるVue.jsの学習まで終えることができる盛りだくさんの内容になっています。
Youtubeチャンネルや子供向けの教材もあり家族みんなで利用できるサイトとなっています。

> CBCとは、2016年より当社の業界未経験スタッフ向けに開発された、Webデザイナー・ディレクター・プログラマーを目指す方へのカリキュラムです。 CBCで学ぶことで、これまで多くの未経験者がIT・Web業界で就業することができました。<br>
持続可能な社会づくり活動の一環として2019年10月より、すべての方が学習機会を得られるようにCBCを無料で公開いたしました。 学習意欲のある方がCBCで学習することで、当社スタッフと同様の学習が可能になりました。<br>
プログラミング言語の“マニュアル操作”を学ぶことよりも、 CBCではwebデザイン・プログラミングの理解を「ゼロから体系立てて」カリキュラムを編集しているので、 “現場で必要なスキル”を無駄なく身につけることが可能です。<br>
"CBC Study公式トップページより"

### 一部無料
ここからは課金をすれば講座を全て受けられるサイトの紹介です。
最初はいろいろなサイトを試してみて、自分に合うところで課金し、集中的に行うのが望ましいと思います。
日割り計算が発生しないので月初の加入がおすすめです。

### Progate
https://prog-8.com/

前回の記事でもご紹介したProgate。無料分を終えたら有料会員になり、気になる講座を全て終えてもよいでしょう.

また2022年11月より、より実践的な学びに特化したProgate Pathが公開されました。

https://path.progate.com/

こちらは最初からコマンドラインの知識が必要になるので、同じProgateの[Command Line 基礎編](https://prog-8.com/lessons/commandline/study/1)を終えてから進めることをおすすめします。

### ドットインストール
https://dotinstall.com/lessons

Progateととの大きな違いは、動画(３分以内)で説明がされ、ブラウザ上ではなく自分の手元で作業するため、各講座内に環境構築も含まれているところです。
上記リンクで`PREMIUM`と書かれているところはプレミアム会員(¥1080/月)の登録が必要です。

https://dotinstall.com/premium

### paizaラーニング
https://paiza.jp/works

昨日ご紹介した**paiza.io**と**Paiza Cloud**はあくまでコードの実行環境です。
paizaラーニングは環境構築不要でブラウザで学ぶことができるサイトです。
無料会員だと視聴可能な動画がかなり限られており、気に入ったら有料会員になるほうがよいでしょう。

https://paiza.jp/works/paid_plan_lp/settlement

1年払いだと1ヶ月あたり600円と他2つのサイトよりお得。
またpaizaではスキルチェックというテストが導入されており、上位ランクを取得して転職支援サポートに登録しているとスカウトが来ることがあります(私の知人で入社した人がいました。)

### 最後に
短い記事でしたが最後まで見ていただきありがとうございました。

明日はまた知識の話にもどり、言語からつくられたフレームワークについて投稿予定です。
MySQL ABでも定番だった乾杯の歌　Helan Går

@sakaik さんの[MySQL闇歴史 Advent Calendar 2022 の2枚目のカレンダー4日目のエントリー](https://sakaik.hateblo.jp/entry/20221204/mysql_mickoss_broken_glass) へのアンサーソング(?)

知名度：★☆☆☆☆
闇度　：★☆☆☆☆
危険度：★★★★☆

この時の歌はHelan Gårはというスウェーデンの乾杯ソングである。フィンランドでもポピュラーな曲らしい。歌の途中でアクアビットやウォッカの入ったショットグラスを飲み干して、最後にもう一節歌って締める感じ。調べてみたが最後に飲み干したグラスを後ろに投げるのが一般的かは不明。MySQL ABでは投げるのが標準だった。割れにくいショットグラスか金属製のものならまだいいが、そこら辺を準備せずに普通にグラスを投げたら大変だろう。。。
参考動画↓
<iframe width="560" height="315" src="https://www.youtube.com/embed/HyZpCs3i71s" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
なおこの動画はサン・マイクロシステムズによるMySQL AB買収発表の社内イベントの最後の時間帯のものである。この時も壇上のMartinとKajは最後にちゃんとぶん投げている。ちなみに社内イベント会場では「投げたくなる気持ちは分かるがそばに人が座っていて危ないから後ろにグラスを投げるな」的なアナウンスがされていた。
Windows11+GeForce RTXにAnaconda3とTensorFlowをインストール

# Anaconda3のインストール

まず、Anacondaをインストールする。ダウンロードサイトは[こちら](https://www.anaconda.com/products/distribution)。下図に赤枠で示した「Download」をクリックすれば、インストーラーをダウンロードすることができる。

![スクリーンショット 2022-12-04 101647.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23570/e0597293-9f96-2c3b-7b5d-3eddb12ffec3.png)

インストーラーを起動すると下記の画面が表示されるので、赤枠で示した「Next >」をクリックする。

![スクリーンショット 2022-12-04 102016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23570/48e4cdda-8027-a761-4b2f-3d060065641c.png)

すると下記の画面が表示されるので、ライセンスアグリーメントを熟読したうえで、赤枠で示した「I Agree」をクリックする。

![スクリーンショット 2022-12-04 102317.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23570/f6d78e17-8504-421d-2ce2-a6e4a80cc6b5.png)

すると下記の画面が表示されるので、赤枠で示した「Next >」をクリックする。

![スクリーンショット 2022-12-04 102552.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23570/555f36c8-d3ff-734d-8ff3-0db4cb58b858.png)

すると下記の画面が表示されるので、赤枠で示した「Next >」をクリックする。

![スクリーンショット 2022-12-04 102736.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23570/cf1e7da9-fb42-e8df-6ea3-c31e5b356164.png)

すると下記の画面が表示されるので、黄枠で示したチェックボックスにチェックを入れて、 ~~文字が赤くなるので少しびっくりした後に、~~ 赤枠で示した「Install」をクリックする。

![スクリーンショット 2022-12-04 103307.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23570/83c8fa82-f515-6087-d9a0-c24c8cae7e02.png)

すると下記の画面が表示されるので、 ~~緑のバーが最後なかなか伸びきらないなぁ、などと途方に暮れつつ、~~ 「Setup was completed successfully」と表示されたら、赤枠で示した「Next >」をクリックする。

![スクリーンショット 2022-12-04 103734.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23570/f149e200-f741-3a3f-cf21-7feacddf141f.png)

すると下記の画面が表示されるので、赤枠で示した「Next >」をクリックする。

![スクリーンショット 2022-12-04 104008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23570/3d407faa-11d1-5c3a-af4a-774fe4bd7557.png)

すると下記の画面が表示されるので、黄枠で示したチェックボックスを外して、赤枠で示した「Finish」をクリックする。これでAnacondaのインストールは完了。

![スクリーンショット 2022-12-04 104234.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23570/41d6292f-b5c5-ebe4-e4da-2e4e685c0121.png)

# TensorFlowのインストール
下記のコマンドを実行して、NVIDIA GPUドライバーがインストールされていることを確認する。
```
> nvidia-smi
```

Powershellを起動して、下記のコマンドを実行して、Powershellを再起動することで、Powershellとconda環境を接続する。
```
> conda init powershell
```

下記のコマンドを実行して、tf-gpuという名前の仮想環境を構築する。
```
> conda create --name tf-gpu python=3.9
```

下記のコマンドを実行して、tf-gpuという名前の仮想環境をアクティベートする。
```
> conda activate tf-gpu
```

下記のコマンドを実行して、CUDAとcuDNNをインストールする。
```
> conda install -c conda-forge cudatoolkit=11.2 cudnn=8.1.0
```

下記のコマンドを実行して、pipをアップデートする。
```
> pip install -upgrade pip
```

下記のコマンドを実行して、tensorflowをインストールする。
```
> pip install "tensorflow<2.11"
```

下記のコマンドを実行して、GPUのリストが表示されれば、TensorFlowが無事にインストールされている。
```
> python
>>> import tensorflow as tf
>>> print(tf.config.list_physical_devices('GPU'))
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
```
VS Code + JUnit で単体テストを構成する

VS CodeとJava拡張機能でユニットテストができるプロジェクトを構成する方法を簡単にまとめました。

# 準備
※初回のみ必要な作業。2回目以降はスキップしてね。

1. VS Codeを起動
1. コマンドパレット[^1]から`"Install Extension"`を実行
1. 次の拡張機能をインストールする
    - `Extension Pack for Java`
    - `Debugger for Java`
    - `Test Runner for Java`

# プロジェクトを作る
1. 左の縦に並んでいるアイコンのうちの『フラスコのアイコン』をクリック
1. `Enable Java Tester` をクリックするとテスト実行のためのファイルがWEBからダウンロードされる。

[^1]: `Ctrl+Shift+P`で表示できる、コマンド入力で操作できるツール。

# テストを書く
1. ソースコードを開く
1. ソースコードのタブ上で右クリックし、メニューから `ソース アクション...` を選択する
1. リストから`Generate Test...`を選択する
1. テスト実行用クラスの名前を入力し、クラスを作成する

# 参考
https://code.visualstudio.com/docs/java/java-testing#_enable-testing-and-adding-test-framework-jars-to-your-project
svelte/storeについてのまとめ - 前編

# はじめに

svelte/storeについてのまとめを作りたかった
今回は`writable` `Auto-subscribe` `readable`について

# 使ったもの

* Vite + SvelteKit + Typescript
* skelton

# writable

書き込み可能な状態を表す。
`subscribe` `update` `set`のメソッドが使えるようになる。

`subscribe`: 状態が変化したときに反応するメソッド。
`update`: 状態を今の状態から変化させたいときに使用するメソッド。
`set`: 固定値に変化させたいときに使うメソッド。

![writable.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/0433586e-4b9b-2363-0992-54bdbf0e9ce0.gif)

```typescript
// src/store.js
import { writable } from 'svelte/store';

export const count = writable(0);
```

```vue
// src/routes/+page.svelte
<script lang="ts">
	import { count } from "../../store";

	let countValue = 0;
	count.subscribe(value => {
		countValue = value;
	})

	const increase = () => {
		count.update(n => n + 1);
	}

	const decrease = () => {
		count.update(n => n - 1);
	}

	const reset = () => {
		count.set(0)
	}
</script>

<div>現在: {countValue}</div>
<div style="display: flex;">
	<button on:click={increase}>＋</button>
	<button on:click={decrease}>ー</button>
	<button on:click={reset}>リセット</button>
</div>

<style>
    button {
        width: fit-content;
    }
</style>
```

# Auto-subscription

実は`subscribe`は一度実行すると`unsubscribe`を実行するまでは、そのコンポーネントが表示されなくてもずっと追ってしまい、メモリリークにつながってしまう。

`$`をつけることで自動でサブスクリプションしてくれる

![writable.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/703add10-ed7b-12a3-b054-39ca82657a10.gif)

```typescript
// src/store.js
import { writable } from 'svelte/store';

export const count = writable(0);
```

```vue
// src/routes/+page.svelte
<script lang="ts">
	import { count } from "../../store";

	const increase = () => {
		count.update(n => n + 1);
	}

	const decrease = () => {
		count.update(n => n - 1);
	}

	const reset = () => {
		count.set(0)
	}
</script>

<div>現在: {$count}</div>
<div style="display: flex;">
	<button on:click={increase}>＋</button>
	<button on:click={decrease}>ー</button>
	<button on:click={reset}>リセット</button>
</div>

<style>
	button {
		width: fit-content;
	}
</style>
```

# readable

ユーザーが外部から定義してはいけないものは`readable`を使い、読み込み専用にする。
例えば、タイマーや、マウス位置、時間など。

先ほどのカウンターを1秒ごとに1増えるようなものにしてみる。

![readable.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/b14bc8fe-5b9d-1042-beef-4df3c7240608.gif)


```typescript
// src/store.js
import { readable } from 'svelte/store';

export const count = readable(0, (set) => {
  let c = 1
  const interval = setInterval(() => {
		set(c);
    c++
	}, 1000);

	return function stop() {
		clearInterval(interval);
	};
});
```

```vue
// src/routes/+page.svelte
<script lang="ts">
	import { count } from "../../store";
</script>

<div>現在: {$count}</div>
```

次回は`derivered` `custom` `binding`についてまとめます。

### 追記

後編上げました

https://qiita.com/doyaseizin/items/3b34aa1c8c090adbeacb
社内向けチャットボットの改修


# 目次

1.はじめに
2.全体スケジュール
3.改修内容詳細
4.作業内容
　4.1　AWSチーム
　4.2　QAチーム
5.まとめ

# 1.はじめに

株式会社エニプラでは、社内のチームごとにテーマを決め、
毎月行われるチーム会でテーマに沿った活動を行っています。
チーム会で行った内容は、
年末に「エニプラアワード」という場で全社員や来期の新卒に向けて発表を行っています。

昨年度、私たちのチームでは
「Amazon lexとSlackを使った社内向けチャットボットの作成」をテーマに活動してきました。
昨年度の活動内容につきましては、下記の記事をご覧ください。
https://qiita.com/k_yoshino/items/89c050a2641e20d7e92f

今年度は、作成したチャットボットをよりブラッシュアップさせるために
「社内向けチャットボットの改修」をテーマに活動してきました。
　
テーマ決定の背景としては以下のような流れがありました。

まず、チャットボット作成後の課題検討事項として、大きく３点挙がりました。

①AWS上のリソース名やソースコード内の変数名に一貫性がないため、メンテナンスが難しい。

②QAの内容を追加・修正する場合に参照できる仕様書や手順書がなく、ドキュメントがないため属人的。

③クラウドストレージの導入により、フォルダやフォーマットの場所を探すことが増えたためQAの内容をもっと充実させたい。

以上の点から最終的に、
①QAチャットの内容充実
②今後のメンテナンスのためのドキュメント整備

の2点に重点をおいて活動を行っていくことになりました。



# 2.全体スケジュール

約8か月間にわたり、チーム全体で
図のようなスケジュールでエニプラアワードに向けて取り組みました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629105/e2d792ee-89b3-3ee6-265e-f33e285a8a5d.png)


活動期間を通して、2チームに分かれてそれぞれ仕様書や手順書の作成、作成した資料を元にテストを実施しました。

また、前年度はQAチームがAWSのリソースやLambda上で動作するプログラムに触れておらず、
知識の共有が不足していた点があったため
今年度は，AWSチームが作成した手順書を元にQAチームのメンバーがプログラムの修正作業を
担当する等チーム全体で知識の共有を図りました。


# 3.改修内容詳細

1.はじめに、で挙げた課題について、それぞれ以下のように対応いたしました。
| |課題|改修内容|
|--|---------------|----------------------------|
|1|AWS上のリソースやコード内の変数名が乱雑 |AWS上のリソースやコード内の記載を一新し、理解しやすい名前に変更 |
|2| QAチャットボットの内容を追加・修正する際の手順書やドキュメントの不足 |仕様書3つに加え、メンテナンスのための手順書を2つ作成 |
|3| QAチャットボットのの内容充実 |QA回答を数を16個から26個に増加 |


# 4.作業内容
今年度は，AWSチームとQAチームの2チームに分かれて作業を行いました。

## 4.1 AWSチーム
AWSチームでは以下の作業を実施しました。

### 1.命名規則の決定・適用対象洗い出し
前年度に作成したリソースから不要なものを洗い出しました。
また、理解しやすい名前にするため命名規則を策定しました。

### 2.AWSリソースの移行
前年度に作成したAWSリソースを、
1.で策定した命名規則を元にしたリソースへ移行しました。

### 3.ドキュメント作成
メンテナンス用に以下のドキュメントを作成しました。

・QA追加手順書
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629105/4357b15e-3885-0e1a-ed50-c239a68a3163.png)


・Lambda仕様書兼変数一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629105/24aa0a4f-a41e-db8e-4e48-3e7d39d36f34.png)


## 4.2 QAチーム
QAチームでは大きく以下の作業を実施しました。

### 1.ドキュメント作成
メンテナンス用に以下ドキュメントを作成しました。
・QA仕様書(QAフローチャート)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629105/3704a2fc-21ef-7bbe-2bf3-2c1fdd06ec8d.png)


・QAフローチャート追加・修正手順書


・テスト仕様書
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629105/58484f61-7c5b-7d3b-6eb3-751406c4f550.png)




### 2.QA追加作業
AWSチームが作成した「QA追加手順書」を参考に、
今年度新たに追加したQAの実装作業を行いました。


### 3.テスト実施
実装したQAの動作確認のため、
「テスト仕様書」に基づきテストを行いました。



# 5.まとめ

今年度の私たちのチームは、「社内向けチャットボットの改修」を行いました。
昨年度社内向けチャットボットを作成した後に挙がった3点の課題を元に
①QAチャットの内容充実
②今後のメンテナンスのためのドキュメント整備

に基づいて、活動を行いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629105/ed424d34-59e3-0beb-6ecc-bf3fc6052466.png)



実際の作業は、QAチームとAWSチームに分かれて行い、
QAチームでは、変数名の修正に加えてQAリストの仕様書を作成し、
AWSチームでは、AWSリソースの移行を行ったり、QA追加の手順書を作成しました。

今後の願望としては，引き続き社内で使っていただき、
フィードバックを得てQAの内容を充実させていこうと考えています。

以上で、ご紹介を終わります。
閲覧いただき、ありがとうございました。
VPNとVDIによるセキュリティ対策

# 問題１
パケットフィルタリングをもとに選択肢から選べ。

### パケットフィルタリングとは？
```IPパケットごとに、条件に合致するか否かを確認```し、通信が許可したり拒否したりするための仕組み。
#### 出典
https://www.sbcr.jp/product/4797388800/

### IPアドレスとは？
IPと呼ばれるプロトコルを使うネットワークにおいて、各コンピューターを識別するためのに、コンピューターへ付与する番号の列。

#### 出典
https://www.sbcr.jp/product/4797386677/

### プレフィックス長とは？
先頭何ビットまでがネットワークアドレスなのかわかるようにしたもののこと。
```サブネットマスクと同義```。 
プレフィックス長は、先頭24ビットがネットワークアドレスの場合、/24となる。
#### 出典
https://www.techhub.tokyo/words/prefixlength/#:~:text=%E5%85%88%E9%A0%AD%E4%BD%95%E3%83%93%E3%83%83%E3%83%88%E3%81%BE%E3%81%A7%E3%81%8C,%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE%E3%81%AE%E3%81%93%E3%81%A8%E3%80%82&text=%E5%85%88%E9%A0%AD24%E3%83%93%E3%83%83%E3%83%88%E3%81%8C%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF,%E5%A0%B4%E5%90%88%E3%80%81%2F24%E3%81%A8%E3%81%AA%E3%82%8B%E3%80%82

可変長サブネットマスクと呼ぶ。サブネットマスクの長さを自由に変えることができるようになると、```サブネットごとに接続するコンピューター数を柔軟に決める```ことができる。
#### 出典
https://www.sbcr.jp/product/4797386677/

### 気づき
今回のパケットフィルタリングは許可するものだった。
ミスでアクセスできないようになった。
正しいIPアドレスを選ぶ。

# 問題２
開発サーバにアクセスするときの接続経路として適切な答えを選べ。

### シンクライアントとは？
```クライアント側ではほとんど何も処理せず```、多くの処理を```サーバー側に任せる```ようなシステム。

#### 新シンクライアントとは？
```サーバーで処理した結果だけ表示```させるだけの端末のみを持ち出せるようにしました。
これが```セキュリティを目的として復活した新シンクライアント```です。
しかし
```セキュリティ時には有効でも、いくつかの利便性は損なわれます``` (インターネット環境がないと仕事ができない、など)。
#### VPIとは？
VPN(Virtual Private Network）のこと。
インターネットなどの```既存のネットワークの中に、新たに仮想的なネットワーク```を作る技術です。
企業での利用シーンとしては、
* インターネット経由で本社のネットワークに参加する(LAN型)
* モバイル回線でオフィスのネットワークに接続する(リモート型）

機密性が保たれるように```暗号化を併用```しています。```認めれられた接続元であるかどうかを確認する認証も必要```です。
```やや通信速度が遅くなる傾向があります```。

#### VDIとは？
仮想デスクトップ基盤のこと。
```デスクトップ環境を仮想化```させて、パソコンの```デスクトップ環境をサーバ上に集約```してサーバ上で稼働させる仕組みのことです。利用者はクライアントPCから```ネットワーク経由で仮想マシンに接続して、デスクトップ画面を呼び出した上で操作```します。なお、VDIという用語は仮想デスクトップ基盤、仮想デスクトップインフラ、デスクトップ仮想化などと呼ばれています。
##### 出典
https://www.infraexpert.com/study/virtual6.html

# 問題３
パケットフィルタリングのルール案をみて答える

### CIDRとは？
```Classless Inter-Domain Routing```の略。
IPアドレスのクラスと無関係に```ネットワーク部を短く見なすことで複数のネットワークへの転送を一つの転送ルールで済ませる```技術。
複数のネットワークについて```個別に転送ルールを定めるより、4つをひとまとめにして１つのルール```にしてしまった方が簡単になる。
例:共通の２２ビットまでをネットワーク部とみなしてルーターAに転送すれば事足ります。
```ネットワーク部の長さ(プレフィックス長)を自由に設定```することが全般をCIDRと呼ぶことが多い。
```/サブネットマスクのビット数（プレフィックス長）```を書く表記を```CIDR表記```と呼びます。
例:/24

# 感想
これを知らなかった。勉強になった。

# 出典
https://gihyo.jp/book/2022/978-4-297-12377-2
私がアウトプットをする利己的な3つの理由

# はじめに
最近育児に忙しく、全然勉強もしてないしQiitaも触っていませんでしたが、久々にQiita開いたらアドカレの募集があり、テーマも「アウトプット」ということでハードルも低く、つい参加登録ボタンをポチっとしちゃったので投稿します。

# アウトプットをする理由
アウトプットというと、他の人に教えるというイメージが先行しているイメージが個人的にはあるのですが、「自分のため」にも良いんだよという観点で今回は記事を書きます。
というわけで、私がアウトプットをする利己的な3つの理由は以下です。

- 自分が理解するため
- 忘れても後で見返して思い出せるようにするため
- 自己満足のため

# 自分が理解するため
物事を理解する方法として、読む ＜ 手を動かす ＜ 人に教える の順に効果が大きくなると考えています。Qiitaなどに投稿することは、人に教えるに相当するので、他の方法に比べて理解度が高くないと実行することができません。記事の投稿をする際には、手を動かす上では知らなくても何とかなっていた知識をインプットすることになるので、自身の理解力向上につながると考えています。

# 忘れても後で見返して思い出せるようにするため
人は忘れる生き物です。私も過去やったことはすぐ忘れてしまいますが、アウトプットをしておくことで思い出すことができるようになります。他の人が書いた記事を読んで思い出してもいいのですが、自身で書いたものを読み返した方がすぐに思い出せます。

# 自己満足のため
自分が書いた記事が多くの人に読まれたり、いいね！がたくさん付くとやる気になります。
例えば、以下の記事は、LinuxでWindowsアプリを動かすときに使うWineというアプリケーションについて書いたもので、自身の備忘録的に書いたしそんなに読まれないだろうと思っていたら、1万View超えててびっくりしています。

https://qiita.com/kerorinfather/items/7af537ba65693015fdc8

また、以下の記事はMoCA2.5という、TVアンテナ線として使われる同軸ケーブルを使ってLANを構築するという記事で、ニッチ過ぎて読む人もいないだろうという予測で実際その通りになっていますが、日本語でMoCA2.5について書かれた記事はほとんどなく、「MoCA 2.5」でGoogle検索すると上位（2022/12現在、2～3番目）に入ってくるので、これも自己満足になっています。
(2023/11/12追記)いつの間にか2000viewを超えていました。Google検索で上位となっていた効果かも。

https://qiita.com/kerorinfather/items/069230f828ef253cf76f

# おわりに
もちろん、今まで他の人の知見を利用させてもらったことに対して恩返しをしたいみたいな気持ちを持ってはいますが、私はそんな気持ちだけでは動けない心の狭い人間なので、こんな理由付けもできるんだよ、という紹介でした。
久々にアウトプットしたら気分がいいので、また近々アウトプットしようかな。
phpでデータベースの読み書きを簡単にする関数をつくる

## 初めに
こんにちは、今日も、自作関数の紹介です。

## 関数
```php
<?php
//データベースに値を登録する関数
//pdo_insert(データベースホスト,データベース名,データベースユーザー名,データベースパスワード,テーブル名,入れる値が入っている連想配列)
//連想配列は、array("カラム名"=>"絡む内容","カラム名２"=>"カラム内容")の形です。
function pdo_insert($db_host,$db_name,$db_username,$db_pass,$table_name,$value_array){
    $pdo = new PDO('mysql:host='.$db_host.';dbname='.$db_name.';',$db_username,$db_pass);
	$value_array_key = array_keys($value_array);
	$value_array_value = array_values($value_array);
	$value_array_key_count = count($value_array_key);
	$value_array_key = implode("`,`", $value_array_key);
	$tpdo = $pdo->prepare('INSERT INTO '.$table_name.' (`'.$value_array_key.'`) VALUES ('.substr(str_repeat('?,',$value_array_key_count), 0, -1).')');
	$tpdo->execute($value_array_value);
	return $tpdo->fetch(PDO::FETCH_ASSOC);
}
?>
```
ごちゃごちゃしているけれど、こちらです。

## 説明・用途
この関数を使えば、bindナントカしなくても気軽にMySQLへデータを登録することができます。
説明はいらないと思いますが...
連想配列の形で入れたい値を読み込み、それをもとにSQL文を生成して実行しています。
ただ、これだとエスケープがされないんじゃないかな?
調べてはいませんが、使うときはhtmlescape関数使ったほうが良いと思います。

## 使い方
これも書いてあるけど...
以下の形式です。
```php
pdo_insert(データベースホスト,データベース名,データベースユーザー名,データベースパスワード,テーブル名,入れる値が入っている連想配列);
```
連想配列は、
```php
array("カラム名"=>"カラム内容","カラム名２"=>"カラム内容");
```
の形で渡してあげて下さい。

## 追記
コメントでいくつかご指摘をいただきました。
自分のコードを見直すとても良い機会をくださり,本当にありがとうございます。

当方が作成した関数ですが、DBpass、DBusernameをそのまま送るよりもpdoオブジェクトを直接送る方法もあります。
その場合、以下のようなコードになります。
```php
<?php

/**
 * データベースに値を登録する関数
 *
 * @param non-empty-string $table_name
 * @param array<non-empty-string, string> $values
 */
function pdo_insert(PDO $pdo, string $table_name, array $values): void
{
	$value_array_key = array_keys($value_array);
	$value_array_value = array_values($value_array);
	$value_array_key_count = count($value_array_key);
	$value_array_key = implode("`,`", $value_array_key);
	$tpdo = $pdo->prepare('INSERT INTO '.$table_name.' (`'.$value_array_key.'`) VALUES ('.substr(str_repeat('?,',$value_array_key_count), 0, -1).')');
	$tpdo->execute($value_array_value);
	return $tpdo->fetch(PDO::FETCH_ASSOC);
}
?>
騙されるな！基本情報技術者試験の合格が別に凄くない理由 [高校生でも受かる]

初めまして。curroと申します。
現在偏差値46の普通校に在学中で、家でJavaと応用情報技術者の学習を独学で進めております。
僕は今年の10月、基本情報技術者試験という、ITエンジニアの登竜門とも言われている国家試験を受験し、合格しました。
難関資格と言われることもあるこの資格ですが、大嘘です。正直、誰でも合格できると思います。その理由を説明していきます。

<h2 align="center">プロフィール</h2>
<dl>
  <dt>偏差値46普通校在学</dt>
  <dd>家から近いという理由だけで高校を選択。自分の偏差値は不明。一応定期テストの点数はクラスではトップクラス。</dd>
  <dt>資格、検定受けた事なし</dt>
  <dd>検定や資格に興味がなく、一度も受けたことが無かった。初めて受けた資格がこの基本情報技術者試験。</dd>
<dt>プログラミング歴</dt>
<dd>ほぼ0。パソコンを買ったのが2022年1月。そこから少しはいじっていたが、部活もあり引退まであまり手をつけなかった。</dd>
</dl>

僕の経歴としてはこんな感じです。上にあるように、資格はおろか検定なども一度も受けたことがなく、いわゆる「試験慣れ」をしているわけでもありません。ほとんどの人がこれよりは上の経歴を持っているのではないでしょうか。

それでは、僕が受けた令和4年度10月試験の全体の結果を見てみましょう。
受験者数は9,882人、合格者数は3,861人、合格率39％という結果になっております。

普通に考えれば、半分以上の人が落ちる試験ということになりますが、実際にはそこまで高い難易度ではありません。この試験は、IT企業に入社したての人がまず初めに取らされることもある試験で、社会人の受験者が多いです。したがって落ちた人は、勉強時間が十分に取れていない人だと思います。逆に言えば、しっかりと対策して試験に臨めば誰でも、何歳でも合格できます。現に僕は上のような経歴で、ITについて学校で学ぶことはほとんどありませんでしたが、独学で合格できています。また中には、9歳で合格した子もいるくらいです。

そしてもう一つ、基本情報技術者試験が難しいとされていたのは昔の話で、CBT方式となった今の話ではありません。現にCBT方式になる前と後の合格率を比べると、20%ほど違いが出ています。受験者数が減っているのも合格率増加の一因ではありますが、それで20%も増加するはずがありません。主な原因は、CBT方式によって1日に一気に受験する必要がなくなった事と、午後試験の問題数が減ったが試験時間は変わらず、単純に難易度が落ちたことが挙げられます。

今の基本情報技術者はもう先人たちが知っている基本情報技術者ではない、とまで思います。

このような事を考えると、いかに難易度の低い試験かということがわかると思います。また今後は大幅に試験制度が変わるとされており、さらに合格しやすくなり、（通年受験になるから)この資格自体の価値も下がっていくことが予想されます。

なぜこのような記事を書いたのかというと、よく専門学校などが「基本情報技術者試験に〇〇名合格しました！」等と自慢げに広報しており、多くの人が難関資格と騙されているように思うからです。高校生、中学生でも受かるような試験を合格したと自慢げにアピールする教育機関に年間何十万の学費を払うべきなのかという事を自問自答してみましょう。（もちろん、それらの学校に行く目的が資格取得だけではないのは理解しています）。
まとめると、「基本情報技術者くらいは独学でお金をかけずに取れ！」がこの記事の要旨です。独学未経験でも数ヶ月の勉強で十分に合格できますので、取りたい方は頑張ってください。
また僕も出来る限りはこの試験について解説記事などを出していこうと思いますので、今後もよろしくお願いいたします。
laravel bladeに値が渡されていることをテストする

:::note info
この記事は[miriwoお一人様 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/miriwo)の4日目の記事です
:::

## 概要

- laravelのFeatureテストコードにてbladeに値が渡されていることをテストする関数`assertViewHas()`の使い方を簡単にまとめる。

## 方法

1. Unitテストのテストコードで下記の様に記載することでテストする事ができる。

    ```php
    $response = $this->get('テストしたいURL');
    
    $response->assertViewHas('bladeに渡されているであろう値のキー名', 実際の値);
    ```

1. 例えば、`/info`にgetリクエストを送った時、表示bladeにキー名`year`で値が`2022`のデータが渡されているかをチェックしたい時は下記の様になる。

    ```php
    $response = $this->get('/info');
    
    $response->assertViewHas('year', 2022);
    ```

1. `assertViewHas()`は第二引数にクロージャを設定するこで複数の値をチェックする事ができる。（クロージャの戻り値がtrueになれば当該チェックは通過する。）

    ```php
    $expectedInfos = [
        'id' => 1,
        'userId' => 1,
        'year' => 2022,
    ];

    $response = $this->get('/infos');
    
    $response->assertViewHas('infos', function ($infos) use ($expectedInfo) {
        return $infos[0]->id === $expectedInfo['id']
            && $infos[0]->userId === $expectedInfo['userId']
            && $infos[0]->year === $expectedInfo['year'];
    });
    ```
LinuxにJetBrainsのToolBoxをインストールする

# はじめに

JetBrainsはJavaのモダンIDEであるIntelliJや一時期VSCodeのライバルになるのではと期待されたエディタのFleet、Pythonの開発環境のPyCharmなどを提供しています。

そういった個々のJetBrainsソフトウェアは個別にダウンロードし、インストールすることもできますが、それとは別にToolBoxというJetBrainsソフトウェア管理アプリケーションがあり、ToolBoxを使用することで、個別のソフトウェアをインストール、アップデートをより簡単に、GUIで行うことができます。

![Screenshot from 2022-12-04 12-08-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457322/608293c6-03e1-78d5-e92c-ec19dea041bf.png)


今回はUbuntuにこのToolBoxをインストールする手順を掲載します。

# 環境

Ubuntu Unity 22.04 LTS
 `$ cat /etc/os-release`

```
PRETTY_NAME="Ubuntu 22.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.1 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
```

# インストール方法

まず、gzファイルを公式サイトからダウンロードします。

link: https://www.jetbrains.com/ja-jp/lp/toolbox/

次に、解凍し`/opt`内に格納します。

```
$ sudo tar -xzf jetbrains-toolbox-1.27.0.13477.tar.gz -C /opt
```

＊gzファイル名はToolBoxのバージョンにより異なる場合があることに注意してください。

基本的にはこれで終了です。

ただ、インストールした直後はDesktopアプリケーションにToolBoxが認識されないときがあるので、その場合には

```
$ cd /opt/jetbrains-toolbox-1.27.0.13477 $$ ./jetbrains-toolbox
```

を実行して、認識させてください。そうすることでDesktopアプリケーション側にショートカットが作成されると思います。
ある本質厨に学んだ3つの「本質」

[WHIの7つの「Value」に沿ったエピソードを語ってください！ by Works Human Intelligence](https://qiita.com/advent-calendar/2022/works-hi-2)カレンダー、6日目の記事になります。

Valueのひとつに挙げられている **「Solve：本質を追求し問題を解決する」** について、個人的に思い出す経験があったので振り返ってみる、自分語りの記事になります。

## ある炎上プロジェクトの話

比較的大規模なシステム刷新を複数ベンダーで受注しているプロジェクトがあり、そのうちの1社のベンダーから、燃えに燃えたプロジェクトの後半になって私にヘルプとしてお声がかかりました。

機能開発は遅れに遅れ、いざ他部門と結合してみたらまるで動かず、他社のテストを待たせてしまう、といった状況で、とにかくプロジェクトの軌道を修正することが私の役目でした。

そのベンダーのプロパー社員であり、同じくプロジェクトの途中からてこ入れ要員として加わったAさんは、パワフルでありながら客観的な視点をもっており、プロジェクトの無駄や機能していないフィードバックループをバッサバッサと切り崩していきました。

そのAさんが度々口にしていたのが「本質」という言葉だったのを思い出します。

## それって本質じゃなくない？（問題の本質）

プロジェクトの体制はウォーターフォールに近く、要件定義～外部設計を担当する上流チームとコーディングのチームが分かれていました。

あるとき、上流チームから渡された外部設計に従ってコーディングを進めていた途中で、コーディングチームが仕様の矛盾に気づき、仕様修正となって実装作業に大きく手戻りが生じました。

上流チームの担当者は平謝りで、「今後は気をつけます」「チーム内での二重チェックを徹底します」という趣旨の謝罪をしていましたが、それに対してAさんが指摘したのが、それは問題の本質じゃないでしょ？ということでした。

「気をつける」というのは対策としては何もしないというのと同義であること、上流チーム内でのチェックを徹底したところで、仕様作成時点では気がつけない問題はあるだろうということを指摘し、それよりは、 **仕様作成の段階からコーディングするメンバーを交えて意思決定するように変えたほうが問題の解決になるんじゃないの？** という提案に繋げていました。

個人でもチームでも、申し訳ないという気持ちが先行する場合、それを他人のせいにしたくないばかりに、自分たちの中だけで解決策を見つけようとしがちですが、全員ゴールは同じなのだから、他のチームも巻き込んで一番いい方法を見つければいいのだということに気づかされました。

## ○○さんは手一杯で他の作業には回せない？（役割の本質）

炎上しているプロジェクトでは、「とにかく終始何かに追われていて手一杯な人」というのが何人も現われがちです。

炎上がひどくなるほど、経営会議や全体会議で状況報告と立て直しプランを説明するという嫌な手間が大きくなりますし、間に合わせで作業要員を増やせば、その指示・管理にも追われることになります。

コーディングチームでリードとなるような人は、ある程度オールマイティな役割をこなせることも多く、コーディングチーム代表として種々の打ち合わせに参加するうち、いつしか上流の役割を巻き取って、顧客への説明に駆り出されたり、テスト計画と設計、進捗管理まで担当したりと、コーディングから離れた作業に終始することになってしまう、というのもあるあるだと思います。

他社との外部結合テスト中にある機能の実装を大きく見直す必要に迫られた際、そういったとあるリードエンジニアに頼むのが最速であるという判断となったときに、「リードエンジニアの○○さんは今手一杯で、とてもそんな作業をする余裕がありません！」と現場から反発がありました。

そこで、そのリードエンジニアが何に時間を取られているのかヒアリングしたところ、結合テストの現場にいると他社の人からインターフェースについての質問があったり、顧客から直接技術的な説明を求められたり、テスターからの質問を受けたりしていて自分の作業時間がまるで確保できない状況だということがわかりました。

そこでAさんが言ったのが **「それは○○さんの役割の本質じゃないでしょ」** ということで、とにかくそのリードエンジニアを現場から引きはがし、同じチームの人間しかいない環境で実装に専念される判断をしました。

その結果、現場は回らなくなったかというと、別にそんなことはなく、その人がいなければ別の人に質問するか、あるいは居ないならいいやということで単に質問がなくなっただけでした。

## 他社との権限共有は本当にできないか（目的の本質）

複数のベンダーが絡むようなプロジェクトでは特に、会社間での情報共有が作業上のネックになることがあります。

たとえば社内は社内で問題管理表やチケットトラッカーを管理していて、それとは別にプロジェクト全体での問題管理表などがある場合、チケットを転記して二重管理にするような不要な手間が生じることもあると思います。

このプロジェクトにおいても、ある部分の機能について、他ベンダーと共同作業でテストを実施することになりましたが、その際に私の所属ベンダーは自社内のツールでテスト項目を管理していたため、他ベンダーとリアルタイムでテスト結果とその修正の進捗を共有するためには、都度手作業で転帰する必要がありそうでした。

どうしましょうかとAさんに相談したところ、「他ベンダーの人も一時的に自社ツールのアカウント作れないか上に聞いてみましょうか」と言って（前例はなかったようですが）すぐに上を説得し、他ベンダー用のアカウントを作成してくれました。

もちろんセキュリティ上の制約などで必ずしも同じ解決策がとれるとは限りませんが、 **本来の目的（プロダクトを完成させること）と関係のない障害は、本当に取り払えないのかを一度疑ってみる** ものだという気づきになりました。

## 前提を一度取り払って考えること

以上、問題の本質・役割の本質・目的の本質という3つの観点で、「本質」について考えることとなったエピソードを紹介しました。

いずれについても共通していえるのは、 **一度「○○だからできない」と思い込んでいる前提を取り払って考えてみる** ことなのかなと思います。
実は過去の慣習がなんとなくルールになっているだけで、それを制約と思い込んでいるケースが少なくないのかもしれません。
JavaScriptでURLセーフな文字列を生成する

## はじめに
[LIGTHzアドベントカレンダー 2022](https://qiita.com/advent-calendar/2022/lightz)の4日目の記事です。
この記事では、ランダムな文字列のURLを作成する方法を紹介します。

## サンプルコード
以下のHTMLファイルをブラウザで開くことで、画面上にURLセーフな32桁の文字列が表示されます。
`nanoid(32)`の箇所の数値を変更することで任意の桁数の文字列を生成できます。

``` sample.html
<!DOCTYPE html>
<html>

<body>
  <script type="module">
    import { nanoid } from 'https://cdn.jsdelivr.net/npm/nanoid/nanoid.js'
    let el = document.body;
    el.textContent = nanoid(32)
  </script>

</body>

</html>
```

サンプルコードでは[nanoid](https://github.com/ai/nanoid)というライブラリをCDN経由で利用しました。
npm packageとしても公開されているのでインストールをして利用することもできるようです。
結局CentOSの後継は何がいいのさ --20年(？)ぶりにLinuxをいじってみる01

全8回の1 → 1|[2](https://qiita.com/Kokusui/items/7ac23b2314898fef6181)|[3](https://qiita.com/Kokusui/items/757277b4e1fb28a3e476)|[4](https://qiita.com/Kokusui/items/9c0d50e3b782b1410a4c)|[5](https://qiita.com/Kokusui/items/42ee26d7e8ad1a114b12)|[6](https://qiita.com/Kokusui/items/701594d849fb7524f4ba)|[7](https://qiita.com/Kokusui/items/b6bfb6da52fdf16241a6)|[8](https://qiita.com/Kokusui/items/60fdbdf42fed2045e4f4)

半分仕事、半分趣味でイントラネットサーバーを建てたくなったので備忘録として。

そもそも現在のシステムを構築した前任者がいなくなり、大幅なメンテや改良ができなくなり、業務に特化しているため市販のグループウェアは色々試しても使えず、当面は今のままで行って…という結論になっていた。
前任者が究極のMac使いだったので現システムには色々と問題点があり：
* データベースがFileMakerベース
* FileMakerをアップグレードするためにはMacOSのアップグレードが必要
* MacOSのアップグレードのためにはハードウェア(MacMini)の買い替えが必要
* 仮にアップグレードしても現システムが動くかどうかの保証がない
* 動かない場合に直す人がいない
* しかもシステムひっくるめて古い。例えばPHPのバージョンが5.3だったりする
* 新しめのライブラリやパッケージのインストールができない(ような気がする)

自分も以前はサーバーをいじっていて、CentOSやFedoraがまだ影も形もない頃から
```
# rpm -uvh apache-1.3.23-14.i386.rpm
```
とかやってたわけで、やっぱりRedHatがいいのかな、と思っていた。
ところがここに来て正統派後継のCentOSが終わるとかいうことになり、じゃあどうしようかな～となっていたところ。
ゼロから作るわけなので別にUbuntuでもいいのだけれど初志貫徹でRedHat系で探してみた。
結論として選んだのは**Rocky Linux**。
理由としては：
* 何と言ってもCentOSを作った人が作ったよ
* Googleさんでも使っているよ(自分はGoogle信者なので…)

てなわけで、余っている古いマシンにインストールを試みることにした。

参考にしたサイト：
https://www.kagoya.jp/howto/it-glossary/server/linux_os/
https://blog.apar.jp/linux/15640/
特定の数値を検知するプログラムの実装

# 問題
以下の要件を満たすarray123メソッドを実装しましょう

・配列内に1,2,3が全て入っている場合は、「True」と出力すること
・配列内に1,2,3の全てが入っていない場合は、「false」と出力すること

雛形
```
def array123(nums)
  # 処理を記述
end

# 呼び出し例
array123([1, 1, 2, 3, 1])
```

出力例
array123([1, 1, 2, 3, 1]) → True
array123([1, 2, 4, ]) → False
array123([1, 1, 2, 1, 4, 3]) → True

# 解答
```
def array123(nums)
  if nums.include?(1) && nums.include?(2) && nums.include?(3)
    puts "True"
  else
    puts "False"
  end
end

# 呼び出し例
array123([1, 1, 2, 3, 1])
```


# 解説
仮引数numsには、配列[1, 1, 2, 3, 1]が格納されている。

次に「配列が全て入っている場合」と「全て入っていない場合」
の条件分岐を記述していく。

仮引数として受け取った配列numsに1,2,3が全て含まれているか
判断するために、include?メソッドを使用する。

&&演算子(かつ)を使用する事で
条件式の複数設定を行うことができます。
7. Boosting Tree

# Boosting Tree
　今回はシンプルなBoostingTreeについての解説です。アンサンブル学習の一つとしてBoostingです。Boostingは前段までのモデルの結果を受け取ってからさらに新しいモデルの訓練を開始します。前段までのモデルの結果とはモデルの予測と正解とのずれのことで、新しいモデルではこれをより少なくするように学習が実行されます。

## アルゴリズム: Regression
　理論的な公式などをすべて省いて書いていきます。種類としては、Adaboost、Xgboostなどがありますが、今日はFreidmanのGradientBoostingのみについてです。先に回帰（Regression）について解説したいと思います。

　全サンプルの特徴量を$X$と対応する正解を$Y$とし、それぞれの$i$番目のサンプルを$x_i$、$y_i$、m番目のモデルの$x_i$に対する予測を$H_m(x_i)$、m番目のモデルまでの$x_i$に対する予測を$F_m(x_i)$とします。サンプル数はNで、M番目のモデルまで訓練を繰り返す場合を考えます。

　各段階でのモデルの出力は以下で与えられます。
```math
F_m (x_i) = F_0 + \sum_{i=1}^m \gamma_i H_i(x_1) 
```
ここで$F_0$は訓練データの平均です。
```math
F_0 = \frac{1}{N} \sum_{i=1}^N Y_i
```
また、$\gamma_i$は学習率で各段階のモデルのごとに異なった値をとります。Line Searchで計算をするはずですが、FortLearnerでは固定のままです。Scikit-learnの目的関数の実装部分にあるかと思ったのですが、見つけることができませんでした。

　最後に各段階での$F_m$の計算方法です。最初に前段までのモデルの予測を受けとり正解とのずれを計算するといいましたが、具体的には目的関数の微分を計算します。全サンプル$X$の$i$番目のサンプルを$x_i$とし、対応する正解を$y_i$、$x_i$に対する予測を$F(x_i)$とします。目的関数（回帰であれば自乗誤差などで微分可能なものを設定します。）を$L(y_i, F(x_i))$とします。この時目的関数を$F(x_i)$で微分した値$\nabla L$は、例えば自乗誤差の場合は以下のように与えられます。
```math
\nabla L =  \frac{\partial L(y_i, F(x_i))}{\partial F(x_i)} = \frac{\partial}{\partial F(x_i)} \left( \frac{1}{2} \left( y_i - F(x_i) \right)^2 \right) = y_i - F(x_i)
```
　自乗誤差では単純な正解と予測の差分で計算することができます。

　したがって、以下のような手順を指定の回数繰り返します。自乗誤差の場合と学習率固定($\gamma_i = \gamma$)の場合のみ記載するので、適宜読み替えてください。
1. F_0を計算する
1. １番目のモデルは各サンプルに対して$y_i^0 = y_i-F_0$を計算し、モデルに$X$とともに投入して学習を行う。
1. １番目のモデルの学習が終了したら全サンプルに対して$F_1(x_i) = F_0 + \gamma H_1(x_i)$を計算する。
1. ２番目のモデルは各サンプルに対して$y_i^0 = y_i-F_1(x_i)$を計算し、モデルに$X$とともに投入して学習を行う。
1. ２番目のモデルの学習が終了したら全サンプルに対して$F_2(x_i) = F_0 + \gamma H_1(x_i) + \gamma H_2(x_i)$を計算する。
1. ...
1. M番目のモデルの学習が終了したら全サンプルに対して$F_2(x_i) = F_0 + \sum_{m=1}^M \gamma H_m(x_i)$を計算する。

## アルゴリズム: Classification
　次に分類（Classification）についてみてみたいと思います。調べ始める前はRandomForestなどと同様に回帰の場合は複数のRegressorを、分類の場合は複数のClassifierをという風に思っていました。Classificationについても結局はRegressorを用いているようです。初期化($F_0$)の方法と最終的な予測の出力の仕方が少し異なるだけです。

　初期化の方法として、もう目的関数がLogLossの場合についてみてみましょう。$p_i$はサンプル$x_i$の予測確率です。
```math
L = - y_i \log(p_i) - (1-y_i) \log(p_i) \hspace{10pt} \text{ここで} \hspace{10pt} p_i = \frac{1}{1+\exp(-F_m(x_i))}
```
シグモイド関数を適用しているのは、そのままでは範囲が[0,1]に収まらないためです。そして、回帰の時と同様に$F_m$で微分します。いろいろ[ごにょごにょ](https://zpz.github.io/blog/gradient-boosting-tree-for-binary-classification/)すると、
```math
\nabla L = p_i - y_i
```
非常に簡単な形に変換できます。




## その他

### 構成
　プログラムは[boosting_trees](https://github.com/NaoMatch/FortLearner/tree/master/boosting_trees)以下に配置しています。
* mod_gradient_boosting_adaboost.f90
    * adaboostの実装です（明日の記事で解説します）
* mod_gradient_boosting_clouds.f90
    * CLOUDSをベースに使った実装です
* mod_gradient_boosting_extra_tree.f90
    * ExtraTreeをベースに使った実装です
* mod_gradient_boosting_lawu.f90
    * Lawuをベースに使った実装です（明後日のところで少しだけ触れます）
* mod_gradient_boosting_tree.f90
    * CARTをベースに使った実装です

### 計算時間
　基本的にBaggingより非常に時間がかかります。Baggingでは、各モデルを並列に学習することができました。CART, SLIQ, ObliviousTreeであれば特徴量ごとに、CLOUDSであればヒストグラム生成を並列実装することができると思います。

### 汎化性能
　訓練データのずれにフィットするように何度も学習が行われるため、過学習が起きやすいです。決定木一般でいうと
* 各葉ノードの数をあまり少なくしない。n_samples_leaf=10など
* 木の深さを抑える。max_depth=5など。max_leaf_nodesを抑えることもほぼ同じ

とくにBoostingでいうと学習率をあまり大きな値にしないことがあげられますが、同時に学習時間が大幅に伸びるので注意が必要です。

以上
Visual Studio コンソールアプリをアセンブルしてみた

# 環境
Windows 11 Pro (64bit)
Visual Studio Community 2022

# Cをアセンブリ出力
Cをアセンブリ出力して参考にする。

## バッチファイル

```dev32crt.bat
@echo off
path %path%;D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.34.31933\bin\Hostx64\x86
set include=%include%;D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.34.31933\include
set include=%include%;C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared
set include=%include%;C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt
set include=%include%;C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um
set lib=%lib%;D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.34.31933\lib\x86
set lib=%lib%;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x86
set lib=%lib%;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x86
cmd
```

## Cソース

```hello_c.c
/*
cl /MD /FAscu hello_c.c
*/
#include <windows.h>

int main()
{
	static char buf[] = "hello, world\r\n";
	static HANDLE hConOut;

	hConOut = GetStdHandle(STD_OUTPUT_HANDLE);
	WriteConsole(hConOut, buf, sizeof buf, NULL, NULL);
	ExitProcess(0);
}
```

## 実行例

```
D:\Projects\msvc>cl /MD /FAscu hello_c.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.34.31935 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

hello_c.c
Microsoft (R) Incremental Linker Version 14.34.31935.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:hello_c.exe
hello_c.obj

D:\Projects\msvc>hello_c
hello, world

D:\Projects\msvc>
```

## アセンブリ出力
抜粋

```hello_c.cod
; 11   : 	hConOut = GetStdHandle(STD_OUTPUT_HANDLE);

  00003	6a f5		 push	 -11			; fffffff5H
  00005	ff 15 00 00 00
	00		 call	 DWORD PTR __imp__GetStdHandle@4
  0000b	a3 00 00 00 00	 mov	 DWORD PTR ?hConOut@?1??main@@9@9, eax
```

# アセンブラ

## バッチファイル

```dev32.bat
@echo off
path %path%;D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.34.31933\bin\Hostx64\x86
set lib=%lib%;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x86
cmd
```

## アセンブリ ソース

```hello.asm
comment *
ml /c hello.asm
link /subsystem:console hello
*
includelib kernel32

.model flat

NULL equ 0
STD_OUTPUT_HANDLE equ -11

ExitProcess proto stdcall :dword
GetStdHandle proto stdcall :dword
WriteConsoleA proto stdcall :dword,:dword,:dword,:dword,:dword

.const
buf	db	'hello, world',0dh,0ah,0
len	equ	$ - buf

.data?
hConOut	dd	?

.code
start proc c
	invoke	GetStdHandle, STD_OUTPUT_HANDLE
	mov	hConOut, eax
	invoke	WriteConsoleA, hConOut, addr buf, len, NULL, NULL
	invoke	ExitProcess, 0
start endp

end start
```

# 実行例

```
D:\Projects\msvc>ml /c hello.asm
Microsoft (R) Macro Assembler Version 14.34.31935.0
Copyright (C) Microsoft Corporation.  All rights reserved.

 Assembling: hello.asm

D:\Projects\msvc>link /subsystem:console hello
Microsoft (R) Incremental Linker Version 14.34.31935.0
Copyright (C) Microsoft Corporation.  All rights reserved.


D:\Projects\msvc>hello
hello, world

D:\Projects\msvc>
```