OmniAICreator/Qiita-1.07M huggingface dataset:
個人的エンジニア就活の進め方

こんにちは。情報系大学院生の@n1ghtf1sh1ngです。
現在就活中なのですが、先日面接を終えた後、あのときこうした方がよかったなあと思うことがあったので書き留めておきます。これが最適解では全くないと思いますし、圧倒的個人の主観なのでなんとなく参考程度に読んでください。

[]([筆者について]　僕が受けた（これから受ける）企業は*ヤフー*ZOZOの2社になります。基本的にWeb系企業を受けようと思ってます。)

# 企業研究（業界研究）
**まずこれ。これめっちゃ大事。なんなら一番大事まである。**

企業や業界について調べない限り、**将来何をしたいか**すら定まらないと思うので、その時点でそこまで興味がない企業も含めてたくさん**情報収集**してください。

おそらくその過程で、**大企業がいい**とか、**自社開発を行っているところがいい**とか、自分が企業を選ぶ際の条件が見つかってくると思うので、そこから徐々に絞り込んでいきましょう。

~~僕はこの工程を疎かにしていて、よくわかんないけどとりあえず給料高そうなとこ選ぶか、みたいなマインドで就活を始めたので苦労した~~

ちなみに**就活エージェント**は使わなくてもいいと思います。特に**逆求人系のエージェント**は人によって向き不向きがあると思うので**一概にお勧めできません**。
（色んな人に勧められたけど自分には合わなかった）
# インターンシップ
興味のある企業が見つかったら**インターン**に申し込んでみましょう。もしインターンを募集していなかったら似た企業でもいいです。

インターンのいいところとしては、
- **実際に働くことで将来のイメージができる**
- **現場の人から話を聞くことで自分が調べるよりも質の高い情報が得られる**

などがあると思います。

また次の章でも述べますが、インターンで作ったものを**ポートフォリオ**に載せたりすることもできるので一石二鳥だと思います。**ぜひ参加しましょう。**

# ポートフォリオ・成果物制作
インターンが終わったら、その中で教わったことを生かして**成果物の制作**を行いましょう。

今はどの企業も成果物が**重要視**されていて、その成果物を提出した上で、その制作過程で**苦労したこと**や**それをどう乗り越えたか**、また**工夫したこと**について面接で問われることになるので、ほぼ必須だと思います。

大学院生で、**査読付きの学会発表経験**がある人は成果物はなくてもいいと思います。**研究頑張りましょう**（お前もな）
# コーディングテスト対策
企業によってはSPIなどのWebテストだったりしますが、基本的に書類選考では**コーディングテスト**があります。

これは**競技プログラミング**をやるのが一番早いです。目安としては茶色くらいまであれば十分だと思います。（LINEとか受ける人は例外）

勉強におすすめのサイトも載せておきます。僕はここで基礎を固めてからAtCoderの公式問題を解いてました。

**アルゴ式**
https://algo-method.com/
[](**ですが**、もちろんアルゴリズムなどが苦手な人もいると思います。そういう人は**競プロが得意な友人**に頼んで、一緒にコーディングテストを受けてもらいましょう。手伝う側の人も本番に向けた練習になるので**WinWin**だと思います。~~僕はこの方法でコーディングテスト突破しました~~)

# 面接対策
最後に**面接対策**です。

これを始めるまでに**Matcher**などを使って、その企業を受けたことのある人との**パイプ**を作っておきましょう。また同じ大学の先輩などでもいいです。

既に受けたことのある人ならば、**想定質問**や**面接の雰囲気**などたくさんの情報を持っているはずなので、その情報をもらって対策を行いましょう。最終的には**面接練習**まで付き合ってもらうのがベストです。

# まとめ
以上が僕が思う理想のエンジニア就活の流れになります。まだ就活が終わってないので正直あと2ヶ月くらいしたら考えが全然変わっているかもしれませんが、面接直後が一番新鮮な状態だと思うので、戒めも含めてここに残しておこうと思います。

大抵の人はかなり就活しんどいと思いますが頑張りましょう。
応援しています。（特に研究室の後輩たち）

# リンク
**Matcher**
https://matcher.jp/

**AtCoder**
https://atcoder.jp/?lang=ja
[windows,aws sam]sam initした際に「MAX_PATH should be enabled in the Windows registry.」と表示され失敗する時の対処法

windows環境下だとsamをテンプレートつきでinitしようとした際に、

```
Error: Failed to modify a local file when cloning app templates. MAX_PATH should be enabled in the Windows registry.
```

とエラーが表示されることがあります。
パス長の最大値を無効化する設定を行う必要があるようです。

管理者権限でPowershellを実行し以下のコマンドを実行しましょう。

```
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" `
-Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force
```

https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=powershell#enable-long-paths-in-windows-10-version-1607-and-later

これでテンプレートからcloneすることができるようになります。

---

[参考] aws samのgitのissue

https://github.com/aws/aws-sam-cli/issues/4031

2022年7月に報告された内容で、現在msiファイルの修正中っぽいので、
近いうちに不要になる記事かもしれません。
【SynapseAnalytics SQLプール】SELECT句の中に変数を割り当てることが出来ない

# SELECT句の中に変数を割り当てることが出来ない
SynapseAnalytics SQLプールでTSQLの記載をしていると、SQL Serverでは利用できるのですが、Synapse Analytics SQLプールでは利用できないものがあります。

SELECT句で変数を割り当てるときに、以下のTSQLはSQL Serverでは問題なく動きます。

```SQL
--LINITEMテーブルに含まれている列名を1行でカンマ区切りで出力する
DECLARE @Columns nvarchar(max)
SET @Columns = NULL
SELECT @Columns = concat(@Columns,c.name,',')
FROM sys.columns c 
WHERE c.object_id=object_id('LINEITEM')
PRINT @Columns 
```
ただ、このTSQLをSynapseAnalytics SQLプールで実行すると以下のようなエラーが出ます。
<br>

<font color="Red">
メッセージ 104473、レベル 16、状態 1、行 1

A variable that has been assigned in a SELECT statement cannot be included in a expression or assignment when used in conjunction with a from clause.
</font>

<br>

これは困ったとなりまして、色々調べますと`STRING_AGG()`関数で回避できました。
以下のTSQLで上手く実行することが出来ます。
```SQL
DECLARE @Columns nvarchar(max)
SET @Columns = NULL
SELECT @Columns = STRING_AGG(c.name,',')
FROM sys.columns c 
WHERE c.object_id=object_id('LINEITEM')
PRINT @Columns 

--結果
L_ORDERKEY,L_PARTKEY,L_SUPPKEY,L_LINENUMBER,L_QUANTITY,L_EXTENDEDPRICE,L_DISCOUNT,L_TAX,L_RETURNFLAG,L_LINESTATUS,L_SHIPDATE,L_COMMITDATE,L_RECEIPTDATE,L_SHIPINSTRUCT,L_SHIPMODE,L_COMMENT
```

# STRING_AGGの用途
文字列式の値を連結し、値の間に区切り記号を挿入します。
また、文字列の末尾に区切り記号は追加されません。
文字列以外を連結した場合は、`NVARCHAR`型に変換されます。

# STRING_AGGの使い方
**STRING_AGG (カラム名, 区切り文字) WITHIN GROUP (ORDER BY ソート条件)**

## 使用例
以下のようなテーブルを作成します。
| id | col1 | col2 |
| :-- | :-: | --: |
|1|AAAA|1|
|2|BBBB|0|
|3|CCCC|1|
|4|DDDD|1|
|5|EEEE|0|

```SQL
create table test_string_agg
(
	id int,
	col1 nvarchar(30),
	col2 nvarchar(30)
);
insert into test_string_agg values (1,'AAAA','1');
insert into test_string_agg values (2,'BBBB','0');
insert into test_string_agg values (3,'CCCC','1');
insert into test_string_agg values (4,'DDDD','1');
insert into test_string_agg values (5,'EEEE','0');
```
`col2`でデータをグルーピングして、`id`と`col1`のそれぞれの値をカンマ区切りで連結した値を取得します。
```SQL
select
	 STRING_AGG(id,',') WITHIN GROUP(ORDER BY id) as ids
	,STRING_AGG(col1,',') WITHIN GROUP(ORDER BY id) as col1s
	,col2
from
	test_string_agg
group by col2;

--結果
ids　　　col1s          col2
1,3,4   AAAA,CCCC,DDDD  1
2,5     BBBB,EEEE       0

```
dockerでnginxを起動したときに表示された「permission denied: unknown」

CentOS７上で動作しているDockerでnginxを起動しようとすると、下記のエラーになりました。
これは忘れることはないと思うのですが、丸一日悩んだので、記録として残します。

```
$ docker-compose up -d nginx
Starting nginx ... error

ERROR: for nginx  Cannot start service nginx: OCI runtime create failed: container_linux.go:380: starting container process caused: setup user: permission denied: unknown
```

「permission denied」で検索すると、「Dockerfile内で使用しているスクリプトファイルに実行権がない」ケースが見つかりましたが、自分の目の前のコンソールに表示されるエラーは、単にnginxを起動しただけでも表示されます。
 
 このメッセージで検索すること約1日。その中に「SELinux」の文字がありました。
いつも痛い目にあっているSELinuxですが、もしや！と思って調べると、
```
$ getenforce
Enforcing
```

下記コマンドでSELinuxを止めると、「permission denied: unknown」のエラーは表示されなくなり、nginxが起動しました。
```
$ sudo setenforce 0
```
IP・TCP・UDPの違い

はじめに
---
今年受けようと思おうと思っている基本情報技術者試験に向けて、
良い機会なのでアウトプットしようと思います。
今回はIP・TCP・UDPの違いをサクッと。

IPとは
---
Internet Protocolの略。(インターネットの約束事)
ネットワークからネットワークへパケット(通信するデータを小さく分割したもの)を運ぶ仕組みを規定したもの。

IPは"ネットでデータを運ぶ仕組み"

なるほど！

TCPとは
---
Transmission Control Protocolの略。(通信制御の約束事)
通信相手に正しくデータが送られたことを保証する仕組みを規定したもの。

TCPは"通信保証"

なるほどなるほど！

UDPとは
---
User Datagram Protocolの略。(ユーザーデータグラムの約束事)
※datagram：通信が保証されないパケット交換網における基本転送単位
通信相手との接続を確認せず、一方的にパケットを送り続ける(故に高速)仕組みを規定したもの。
動画や音声データ配信などに最適。

UDPは"通信保証無いが高速"

なるほどなるほどなるほど！

IPとTCP・UDPの大きな違い
---
IPとTCP・UDPはそもそもOSI基本参照モデルが異なる。
※OSI基本参照モデル・・・ネットワークを通してコンピュータ同士がやりとりする際の約束事を7階層にしたもの。
![20200314095931.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2318159/44ad5c8a-abe8-eea0-77e9-8f0cb0c6e96b.gif)
(参照: https://www.momoyama-usagi.com/entry/info-network01)

IPは第３層のネットワーク層に属しており、ネットワークをいかにして繋いでデータを運ぶのかを取り決めている。
一方、TCPとUDPは第４層に属し、運ばれてきたデータの信頼性をどのように保証するかを取り決めている。

IPは"運び方"
TCP・UDPは"データの信頼性"

なるほどなるほどなるほどなるほど！

おわりに
---
ざっとでしたが、下記をとりあえず頭に入れておこうと思います。

・IPとTCP・UDPはそもそものプロトコルの階層が異なる
・IPはデータの運び方
・TCPはデータの信頼性を保証、UDPは高速だが信頼性欠ける
ChatGPTの企業への導入について


# 概要
ChatGPTの活用についてお問い合わせを頂く機会が増えています。
企業への導入における懸念事項はある程度共通しており、お問い合わせを頂く前に、基礎知識をご共有できれば円滑な導入に繋がると思い、本記事を投稿することにいたしました。

# ChatGPTのAPI
ChatGPTをアプリケーションに組み込む際にまず疑問にあがるのがAPIの存在です。
ChatGPTには公式APIがないため、下記いずれかを選択することになります。
(→2023/3/1リリースされました。https://platform.openai.com/docs/guides/chat)
1. 非公式OSSのスクレイピングAPIを利用
1. ChatGPTに最も近い*GPT-3.5モデルのtext-davinci-003を応用
(*2023/1/11時点)

1は、ChatGPTと同様の機能を持つものの、大企業では導入のハードルが高いと考えます。
2は、公式のAPIを利用できるものの、ChatGPTと同様の機能を持たせることはできません。
以上を踏まえ、企業での導入においては2を選択することになると思います。

# 機密情報の入力
Prompt、Fine-tuningに関わらず、OpenAIはAPIリクエストをモデルの改善に利用しています。
つまり、機密情報は入力してはいけません。
個人情報は自動でマスキングされる（と公式は宣言している）ことになっています。

機密情報の入力が懸念される場合、これを避けるための手続きが必要になりますのでご注意ください。
（info@t-i.jp までお気軽にご相談ください。）

# 嘘を言わせないために
ChatGPTないしはGPT-3が嘘偽りを述べることが問題視されていますが、これを改善する方法としてWeb検索を併用する方法があります。

検索結果が正しいとは言えませんが、有効な改善策とされています。

# 倫理を学ばせることはできるか
2022年以降に登場したGPT-3モデル(3.5シリーズ)は学習過程で人によるInstruction(指導)がなされています。
この過程で倫理的に問題のある回答をしないよう調整されているのですが、既存のモデルに対し外部からこの手続を行うことはできません。

一方で、モデル自体を変更するのではなく、モデルを利用する際に手続きを行うことで、改善することが可能です。

# 導入するにはどうすればよいか
実際の導入には、専門知識が必要となりますので
info@t-i.jp までお気軽にご相談ください。
TypeScriptの基礎

## TypeScriptとは
・マイクロソフトが2012年に開発。
・大規模化するJavaSciptコードに対応するために開発された。

## 静的型付け
・TypeScriptは、JavaScriptに静的型付けの機能が加わったもの。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542326/6a190ad7-fc38-fc65-8ba7-9b36c2fb5775.png)
動的型付け言語と静的型付け言語では、型エラーの発生タイミングが違う！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542326/498de9f8-934a-477d-69d2-18e6144bfb4b.png)
<strong>TypeScriptは、型エラーを実行前に検出できる。</strong>

## 基本文法
### ①JavaScriptの構文は全て使える
理由：TypeScriptは、結局JavaScriptに変換されるから。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542326/b07d5e12-1fd3-2f43-c3e0-217be7abebee.png)

### ②型注釈
変数の横にコロンで型を指定できる。
```Typescipt：sample.ts
const num: number = 123;
const text: string;
```

## 高度な型
### ①ユニオン型
型をORで指定できる。PHPにも8.0からある。
```Typescipt：sample.ts
const union_value: boolean | number | string;
```

### ②リテラル型
ある型として使える文字列を限定できる。
```Typescipt：sample.ts
const sizeType: "s" | "m" | "l";
```

### ③type文
独自の型を作れる。
タイプアノテーションの度に詳細を書く必要がなくなる。
```Typescipt：sample.ts
type sizeType: "s" | "m" | "l";
const clothSizeType : sizeType;

const shoeSizeType: "s" | "m" | "l"; // こう書く必要はない
```

### ④型引数
型宣言の引数に値ではなく型自体を渡すことができる。
引数の型の柔軟性が上がり、再利用性を高めることができます。
<>で囲まれたものが型引数です。

```Typescipt：sample.ts
type User<T> = {
    age: T
}

const unknown_age_user: User<string> = {
    age: "年齢不詳"
}
const known_age_user: User<number> = {
    age: 100
}
```

### ⑤ジェネリクス
型引数を関数に対して使用する。
```Typescipt：sample.ts
function double<T>(target: T): T{
    return target + target
}

const number10: number = 10
const string10: string = "10"

console.log(double(number10)) // 戻り値の型はnumber
console.log(double(string10)) // 戻り値の型はstring
```
private method of interface

default methodからprivate methodを利用する
```java
interface A {
    private void privateMethod() {
        System.out.println("aaaaprivate");
    }
    default void method() {
        System.out.println("aaaaA");
        privateMethod();
    }
}

class C implements A{
    public void method() {
        A.super.method();
    }
}
public class Outer {
    public static void main(String[] args) {
      new C().method();
    }
}
```
```
aaaaA
aaaaprivate
```
HMC GUIでVIOS 仮想メディア・リポジトリの iso ファイルをLPARに割り当てる

#### はじめに

HMC(Hardware Management Console) のGUIで仮想メディアの割り当てを確認したログです。


---
#### 対象


IBM PowerSystems 環境を使用されており、
HMC、VIOS環境で仮想メディア・リポジトリを使用してisoファイルをLPARに割り当てたい方


---
#### 環境

・PowerSystems S824
・HMC V9R1.941.0
・VIOS 3.1.2.10
　　仮想メディア・リポジトリ作成済み
　　iso ファイル　ロード済み
・対象LPAR



---

#### 手順

HMCにGUIでログインした状態です。

(1) 対象のLPARを確認し、名前を選択

![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/c8414f1f-c160-3902-a6f7-7986c26452d4.gif)


(2) 左列の"仮想ストレージ" を選択

![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/7f977c4d-b349-342f-d8fb-fc803b5fce19.gif)

(3) "仮想光ディスク装置" を選択

![3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/9a8615a6-466a-2e1e-78e9-53190470de71.gif)


(4) "仮想光ディスク装置の追加" を選択

![4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/0d85a5d4-4a62-445a-b9a5-d8d90f350a60.gif)

(5) 任意のデバイス名を入力し、isoファイルが配置されている対象仮想メディア・リポジトリがあるVIOSを選択

![5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/94ca6b51-bdde-eff4-75df-e9df4f2a0da9.gif)

(6) 作成されたデバイスを確認し、選択

![6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/fc1e3c58-1724-6942-1cad-1693fc768f0f.gif)

(7) "アクション" から "ロード"を選択

![7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/9fe25c87-aece-64ca-849b-feadf00526ff.gif)

(8) 対象のメディア・ファイルを選択

![8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/d805926a-7289-845d-e2e7-69886e6f214d.gif)

(9) 対象ファイルがデバイスに割り当てられたことを確認

![9.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/e59a6083-0903-7779-438a-3949288906b9.gif)



---
#### 参考


・はじめてのVIOS
https://ibm.ent.box.com/s/j2wriuiwqkljshau6jgrnzja6svj4ewh
   p42 仮想光学デバイス

・Virtual I/O Serverでの仮想メディア・リポジトリーの作成
https://www.ibm.com/docs/ja/power10/9105-22A?topic=scsi-creating-virtual-media-repository

・How to configure a VIOS Media Repository/Virtual Media Library (ex. AIX Install/Restore)
https://www.ibm.com/support/pages/how-configure-vios-media-repositoryvirtual-media-library-ex-aix-installrestore




以上です。
[discord.py]サクッと起動まで準備する

# 前提
* `pip`が使える。

# botを作成する
https://discord.com/developers/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/5ba3bdaf-44b2-78a9-acef-6c8f3900c110.png)

右上の`New Application"を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/6eb6aa4c-585d-7f73-4d66-e679b7874b46.png)

名前を決めて`Create`を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/2c63e108-264b-144d-439d-8c70733a4566.png)

左側メニューから`Bot`を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/39e1b34f-2970-8754-e388-b388ee50ac1a.png)

`Add Bot`を選択。
確認モーダルが出てくるので`Yes`を選択しよう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/f0c026ec-c769-feb9-79ab-bfb64b46e132.png)

# Intent
https://qiita.com/Nirezi/items/72741a88265107dd04d3

下の`Privileged Gateway Intents`に注目。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/47af843d-0788-30af-b329-a84d9e381469.png)

（昔はこんなのなかったけど）一部のイベントはこの項目をオンにしておかないと受け取れないっぽい。
とりあえず`MESSAGE CONTENT INTENT`をアクティブにしておく。

# サーバに導入
右のメニューから`OAuth` -> `URL Generator`を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/ef4aa123-9b00-26f0-f406-681b5cd81683.png)

`SCOPES`の`Bot`を選択。
`BOT_PERMISSION`が出てくる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/5c7080e3-5af8-e322-05bf-263c1cfd7fc4.png)

とくにこだわりがないなら`Administrator`を選択。
一番下の`GENERATED URL`にアクセスし、任意のサーバに導入する。

# 動かす
まずは`discord.py`をインストールする。

```console
pip install discord.py
```

コーディングに入る。

適当なファイルにPythonファイルを作成し、以下のように記述する。
```py
import discord

intents = discord.Intents.all()  # すべてのIntentを有効にする
client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print('ONLINE')

token = "your token"
client.run(token)
```

`token`に関しては、先ほどのページの`Bot`のページで発行できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/8d430f1f-280e-63d6-5e3f-d3ab20a83337.png)

`Reset Token`を選択。
確認モーダルが出てくるので、`Yes`を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883146/1379d04d-da10-4ef8-4c25-ae70c1a246eb.png)

ここで表示されるのが`token`になる。
**公開すればbotを乗っ取られる危険性のある情報**でもあるため、コードに直接載せないようにして扱うのがよい。
useEfftct 第2引数を設定し、指定の値で発火させる方法

<h1>概要</h1>
初回マウント時と指定した値が変化したときのみuseEfftctを発火させる方法を書いていきます。

<h1>マウント時と第2引数の変化時のみuseEffectが発火させる方法</h1>
今回は第2引数にuseStateで作成した変数を入れることで

その値が変化した際に処理が走る様に書いていきます。




<b>下記のコードでは第2引数に「count1」を設定したことにより、
初回のマウント時とcount1が変化したときのみuseEffectが発火。</b>



```jsx
import React, { useState, useEffect } from "react";
import classes from "./Counter.module.scss";

const Counter: React.FC = () => {
  const [count1, setCount1] = useState(0);
  const [count2, setCount2] = useState(0);

  useEffect(() => {
    console.log(
      "初回のマウント時と第2引数に指定したcount1が変化した時のみuseEffectが発火"
    );
  }, [count1]);
  return (
    <div className={classes.root}>
      <div className={classes.buttonWrapper}>
        <span className={classes.buttonText}>カウント1</span>
        <button
          onClick={() => {
            setCount1((prevCount) => prevCount + 1);
          }}
        >
          {count1}
        </button>
      </div>

      <div className={classes.buttonWrapper}>
        <span>カウント2</span>
        <button
          onClick={() => {
            setCount2((prevCount) => prevCount + 1);
          }}
        >
          {count2}
        </button>
      </div>
    </div>
  );
};

export default Counter;
```

<h3>【結果1】</h3>

カウント1のボタンを押すと下記の様な処理結果が走る。

**ブラウザ上**

カウント1（ボタンの数値が+1ずつあがっていく）

**コンソール上**

初回のマウント時と第2引数に指定したcount1(ボタンを押し) が変化した時のみuseEffectが発火


<h3>【結果2】</h3>
- カウント2のボタンを押すとブラウザ上で下記のに様に表示される。

**ブラウザ上**

カウント2（ボタンの数値が+1されていく）

<h2>useEffectの第2引数に指定の値を設定した際のコードの解説</h2>

```jsx
  useEffect(() => {
    console.log(
      "初回のマウント時と第2引数に指定した「Count1」が変化した時のみuseEffectが発火"
    );
  }, [count1]);
```
上記の最終行にあるようにuseEffectの第2引数に
 <b>[Count1]</b> 
を設定することで、初回マウント時と指定した変数が変化した際に、useEffectの処理が走る様になっている。

<b>[]</b>　・・・　初回のマウントのみ処理を走らせる処理が走る。
<b>[Count1]</b>　・・・　[]の中にCount1を設定することでCount1が
　　　　　　　　　 変化したときにuseEffectの処理も走る様になっている


<b>参考にした動画</b>

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



<h1>まとめ</h1>

今回は、第2引数に特定の値を指定する方法をご紹介いたしました。
[]の中に変数を入れることでその値が変化した際にuseEffectが発火する処理についてまとめました。
次回はクリーンナップ関数について投稿したいと思います。
WindowsノートPCへのリモートデスクトップで設定画面などが正常に表示されない問題

# 概要
ノートPCの画面を閉じたままリモートアクセスすると、Visual Studio 2022やWindows10以降の設定画面などが正常に表示されない。
日本語でこれの解消法を検索してもダミープラグを利用する例しか出てこなかったので投稿。

[カバーを閉じた状態のWindowsノートPCにChromeリモートデスクトップで接続すると画面が更新されない時の対処法 - 技術屋さんの日記帳](https://lil.la/archives/3983)
[リモート作業用ノートPCを閉じるとリモート操作がおかしくなります - syshan株式会社](https://www.syshan.jp/30927/)
![Windows11 スタートメニュー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3111226/13fa47a0-25d5-c88b-1661-ec33e11d7b92.png)


# 必要なもの
+ [仮想ディスプレイドライバ usbmmidd_v2](https://www.amyuni.com/forum/viewtopic.php?t=3030)

https://www.amyuni.com/forum/viewtopic.php?t=3030

# 使い方
大体は`idd_instructions.txt`に書いてある。何も考えたくない人は`usbmmidd.bat`を管理者権限で実行。

```text:インストール
deviceinstaller64 install usbmmidd.inf usbmmidd
```
```text:仮想ディスプレイの追加(v2:繰り返し実行することで最大4台まで追加可能)
deviceinstaller64 enableidd 1
```
```text:仮想ディスプレイの削除
deviceinstaller64 enableidd 0
```
```text:アンインストール
deviceinstaller64 stop usbmmidd
deviceinstaller64 remove usbmmid
```

# その他
リソースはCPU内臓GPUを消費する。
再起動すると仮想ディスプレイが消えるので、必要であれば再度実行。
はじめての投稿

勉強した内容をまとめていかないと頭から抜け落ちていくと思ったのと、
いつもたくさんの方の記事を拝見しているので自分も書きたくなりました。  
都度書いていくので、ミスなどあればご指摘頂けると幸いです。

aws, python, django, react, typescript, docker, terraform, ai 等について書いて行く予定です。

宜しくお願い致します。
MB_プラグインアイテム用APIリファレンス

`疑似的なクラス・フィールド・メソッドが定義されたエリア`

コメント「Do not change. 」で囲まれたエリアです。ここには、prototypeプロパティを使った疑似的なクラス「PluginObject」が定義されています。このエリアの編集は不可です。

定義されている内容については、「クラス（プラグインアイテム）」、「フィールド（プラグインアイテム）」、「メソッド（プラグインアイテム）」を参照してください。

`ヘルプテキストを記述するエリア`

「 /**help」と「 */」で囲まれたエリアです。ここには、コメントを記述できます。コメントは、MotionBoardの次の画面でJSファイル名をマウスオーバーしたときにツールチップで表示されます。

・［システム設定］－［プラグイン］画面のJSファイルの一覧
・プラグインアイテムの新規作成時に表示される、［プラグイン］画面のJSファイルの一覧
・プラグインアイテムの［アイテムプロパティ］画面から表示する、［プラグイン選択］画面のJSファイルの一覧

`ユーザーの独自のプログラムを実装するエリア`

コメント「Please write your program.」で囲まれたエリアです。テンプレートの出力直後は、次の2つが実装されています。

・テンプレート出力時に指定した、ユーザー独自のクラス名のクラス
・Context2Dでの描画のサンプルコード

クラス「PluginObject」のフィールドやメソッドを、ユーザー独自のクラスにオーバーライドすることで、処理を実装できます。
same name method that is default method of interface and class method

default methodとclass method、同じ名前で定義し
implements, extendsすると、class methodが優先となる。
default methodは消失

B.methodがprivateの場合、compileはA.methodが使われてnormal end.
実行時にIllegalAccessError
```java
interface A {
    default void method() {
        System.out.println("aaaaA");
    }
}
class B{
    public void method(){
        System.out.println("aaaaB");       
    }
}
class C extends B implements A{}
class D implements A{}
public class Outer {
  public static void main(String[] args) {
      Method m[]  = new C().getClass().getMethods();
      for(Method mc:m) {
          System.out.println(mc);
      }
      System.out.println("----------------------");

      m = new D().getClass().getMethods();
      for(Method mc:m) {
          System.out.println(mc);
      }
  }
}
```

```
public void com.mycompany.mavenproject1.B.method()
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
----------------------
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
public default void com.mycompany.mavenproject1.A.method()
```
apacheで複数ドメインの80/443サイトを構築

# 前提
### 基本的な設定のみで、セキュリティは意識していない。
www.example.com
www.example.net
の2サイトを構築する。
ALBに証明書を持たせず、サーバで復号させる。

# 環境
OS:Amazon Linux release 2 (Karoo)
apache:2.4.54-1

# httpサイト
ドメインごとの設定を追加。
~~~ /etc/httpd/conf.d/vhost.conf
<VirtualHost *:80>
 ServerName www.example.com #ドメイン名
 DocumentRoot /var/www/html/example1 #ドキュメント置き場
 ErrorLog /var/log/httpd/www.example.com_error_log #エラーログ出力先
 CustomLog /var/log/httpd/www.example.com_access_log combined #アクセスログ出力先
</VirtualHost>

<VirtualHost *:80>
 ServerName www.example.net
 DocumentRoot /var/www/html/example2
 ErrorLog /var/log/httpd/www.example.net_error_log
 CustomLog /var/log/httpd/www.example.net_access_log combined
</VirtualHost> 
~~~

# httpsサイト
必要なパッケージをインストール
~~~ 
yum install mod-ssl
~~~

待ち受けポートを追加。
~~~ /etc/httpd/conf/httpd.conf
Listen 443
~~~

ドメインごとの設定を追加。
※今回は自己証明書のため中間証明書の指定なし
~~~
<VirtualHost *:443>
 ServerName www.example.com
 DocumentRoot /var/www/html/example1
 ErrorLog /var/log/httpd/www.example.com_ssl_error_log
 CustomLog /var/log/httpd/www.example.com_ssl_access_log combined
 SSLEngine on # SSLを有効化
 SSLProtocol +TLSv1.2 # 許可するSSLプロトコル
 SSLCertificateFile /etc/httpd/conf.d/ssl/www.example.com.crt # 証明書
 SSLCertificateKeyFile /etc/httpd/conf.d/ssl/www.example.com.key # 秘密鍵
</VirtualHost>

<VirtualHost *:443>
 ServerName www.example.net
 DocumentRoot /var/www/html/example2
 ErrorLog /var/log/httpd/www.example.net_ssl_error_log
 CustomLog /var/log/httpd/www.example.net_ssl_access_log combined
 SSLEngine on
 SSLProtocol +TLSv1.2
 SSLCertificateFile /etc/httpd/conf.d/ssl/www.example.net.crt
 SSLCertificateKeyFile /etc/httpd/conf.d/ssl/www.example.net.key
</VirtualHost>
~~~
Rubyで高速に任意のリファレンスゲノムの特定のポジションの配列を取得する

RやPythonであれば、さまざまな洗練された既存のライブラリの使い方について記載することになると思うけれども、Rubyでは既存のライブラリが多くないので、もっぱら自分でC言語のライブラリのバインディングを作成し、それを使う感じになる。

## 2bitファイルを使う場合

UCSCのサイトから[.2bitファイル形式](http://genome.ucsc.edu/FAQ/FAQformat.html#format7)のゲノム配列を入手することができる。たとえば、
https://hgdownload.soe.ucsc.edu/goldenPath/hg38/bigZips/
から `hg38.2bit` をダウンロードすることができる。

bio-twobit というライブラリを作成したのでそれを使う。これはC言語のライブラリ [lib2bit](https://github.com/dpryan79/lib2bit) のバインディングであり高速に動作する。

https://github.com/ruby-on-bioc/bio-twobit

```ruby
require 'bio/twobit'

hg38 = Bio::TwoBit.open("hg38.2bit")

hg38.sequence("chr1", 50000, 50050)
# "AAACAGGTTAATCGCCACGACATAGTAGTATTTAGAGTTACTAGTAAGCC"

hg38.close
```

ここで、注意するべきなのは、`hg38.sequence("chr1", 50000, 50050)` の最初の引数は0-baseで、2番目の引数は1-baseであることである。あるいは、左閉右開の半開区間と考えることもできる。この仕様は、元プロジェクトのpy2bitに準じている。

また、このツールは、多くのリファレンスゲノムに対応しており、

```ruby
hg19 = Bio::TwoBit::Hg19.new
hg38 = Bio::TwoBit::Hg38.new
hs1  = Bio::TwoBit::Hs1.new
```

などとすると、自動的に2bit形式のゲノムをダウンロードして、呼び出せるようになります。ダウンロードしたファイルはキャッシングされます。

## Fastaファイルを使う場合

ruby-htslib というライブラリを作成したのでそれを使う。
これはC言語でHTSファイルを扱うための標準的なライブラリであるhtslibのRubyバインディングである。

https://github.com/kojix2/ruby-htslib

```ruby
require "htslib"

f = HTS::Faidx.new("GRCh38.p13.genome.fa")

f.seq("chr1", 50000, 50049)
# => "AAACAGGTTAATCGCCACGACATAGTAGTATTTAGAGTTACTAGTAAGCC"

f.close
```

ここでは、`f.seq("chr1", 50000, 50049)` において、いずれの引数も0-baseであることに注目してほしい。
これはhtslibのネイティブ関数 `faidx_fetch_seq` の仕様に従っている。
注意してもらいたいのは、`chr1:50001-50050` のように範囲を文字列で表すときは、1-based の閉区間になることだ。

```ruby
require "htslib"

f = HTS::Faidx.new("GRCh38.p13.genome.fa")

f.seq("chr1:50001-50050")
# => "AAACAGGTTAATCGCCACGACATAGTAGTATTTAGAGTTACTAGTAAGCC"

f.close
```

Samtoolsのfaidxコマンドでも

```sh
samtools faidx GRCh38.p13.genome.fa "chr1:50001-50050"
# >chr1:50001-50050
# AAACAGGTTAATCGCCACGACATAGTAGTATTTAGAGTTACTAGTAAGCC
```

とすると、同様のじ結果が表示される。もちろん、これを `open3` や `system` などで呼び出してもいい。というか普通はこの方法が第一選択だと思われる。

とにかく、0-based と 1-based は難しい。
すぐに間違える。迷ったらその都度確認する方がよさそうである。

この記事は以上です。
sass mixin のあれこれ

# Sass用　mixin

mixinに追加する内容は増えてきたので、よく使う部分を覚え書き

## media screenの設定
//---------------------------------------
//    使い方：@include 変数名(予約語)
//    例：
//    @include bp-down(lg) {
//      display: block;
//    }
//    展開後：
//    @media screen and (max-width: 940px) {
//      display: block;
//    }
// ---------------------------------------

~~~
// min-width 
$breakpoints-up: (
    "md": "screen and (min-width: 671px)",
    "lg": "screen and (min-width: 941px)",
) !default;
// max-width
$breakpoints-down: (
    "md": "screen and (max-width: 670px)",
    "lg": "screen and (max-width: 940px)",
    "xl": "screen and (max-width: 1240px)",
) !default;

@mixin bp-up($breakpoint) {
  @media #{map-get($breakpoints-up, $breakpoint)} {
      @content;
  }
}
@mixin bp-down($breakpoint) {
  @media #{map-get($breakpoints-down, $breakpoint)} {
      @content;
  }
}

~~~

## 背景画像にSVGをしてした際に、任意のカラーに変更

// ---------------------------------------
//    使い方：
//    @include svg-line(re-color(色コード),SVGのviewBoxの値,SVGのパスの値);
//    
//    展開後：
//    background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='SVGのviewBoxの値'%3E%3Cpath fill='色コード' d='SVGのパスの値'/%3E%3C/svg%3E");
//    background-repeat: no-repeat;
// ---------------------------------------

~~~
@function re-color($code) {
  @return str-slice("#{$code}", 2);
}

@mixin svg-line($color,$img-point,$img-pass) {
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='#{$img-point}'%3E%3Cpath fill='%23#{$color}' d='#{$img-pass}'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
}
~~~

## フォントを自動リサイズする設定
// ---------------------------------------
//  font リサイズ設定
//    使い方：
//    @include rsfontsize(最小値, 最大値);
//    展開後：
//    font-size: clamp( 最小値px, ( 最小値px + (( 100vw - 670px ) * (( 最大値 - 最小値 ) / ( 1200 - 670 )))), 最大値px );
// ---------------------------------------

~~~
$breakpoints: (
  'mobile' : 670px,
  'desktop' : 1200px,
) !default;

@mixin rsfontsize($fontsize, $fontsize-l) {
    font-size: clamp( #{$fontsize * 1px}, ( #{$fontsize * 1px} + (( 100vw - #{map.get($breakpoints, mobile)} ) * (( #{$fontsize-l} - #{$fontsize} ) / ( #{num(map.get($breakpoints, desktop))} - #{num(map.get($breakpoints, mobile))} )))), #{$fontsize-l * 1px} );
}

@function num($input){
  @return math.div( $input, ($input * 0 + 1) );
}
~~~
Workato：ポーリング、スケジュールトリガーのカーソルを初期化する

# はじめに

Workatoのレシピのうえ、ポーリングとスケジュールをトリガーとするレシピでは、Workatoがどの行まで処理を行ったかを示す「カーソル」の情報がレシピ内部に保持されています。

https://docs.workato.com/recipes/triggers.html

※上記より引用
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/ed88c5e1-ecaf-5d9a-cf5e-3344554c76e4.png" width="500">

このため、例えばデータソースを変更するようなコネクションの設定変更をレシピ運用開始後に行うと、想定と異なるデータが返される、想定と異なるデータが変更される等、予期しない動作が生じる場合があります。

以上のような予期しない動作が生じた場合、これまでは運用中のレシピをコピー後、コピーしたレシピに運用を移行する（切り替える）必要がありました。
（コピー先のレシピではカーソルが初期化される＝カーソルが引き継がれないため、事象が解消される場合があります）

今回、WorkatoのEmbedded APIを利用した方法ではありますが、レシピのカーソルの初期化に対応しましたので、その方法についてご説明します。
この方法を用いることで、カーソルの初期化のためにレシピをコピーして運用を切り替えるという方法が不要となります。

# 手順

以下のAPIエンドポイントに対してリクエストを行います。

`POST /api/recipes/:recipe_id/reset_trigger`

cURLで実行する場合は、次の通りとなります。なお、これ以外のパラメータは不要です。

```sh
curl  -X POST https://www.workato.com/api/recipes/<レシピID>/reset_trigger \
      -H 'x-user-email: <email>' \
      -H 'x-user-token: <token>'
```

`<レシピID>` には各レシピを開いた際のURLに記載されているレシピID（赤枠で示した値）を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/2577a5e9-2609-cdfd-cd5e-f3d63cfa1def.png)


`<email>` と `<token>` は、WorkatoのワークスペースオーナーとなるユーザーでWorkatoへログインし、Account settingsの「API key」で表示される値を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/8fd2c4ae-bea5-751f-6aac-6ecc17c197e6.png)


# 参考情報

https://docs.workato.com/workato-api/recipes.html#reset-recipe-trigger
アクツクＭＶのデバッグモード

アクションゲームツクールMV（アクツクMV）には、基本エラーというものがありません。アクツク君は、基本すべてOKで、よくわからなかったらスルーします。どうしてもスルー出来ない場合は、キレて落ちます。アクツク君とはそういう人……、ではなくてツールなのです。

よくわからなかったらスルーされるだけなので、作っている人間が間違っていても気がつかないという問題があります。なんだかうまくいかないけど、無反応なので、どこが間違っているのか調べるのが難しいわけです。

幸い、アクツク君の心の中（アクツクMVのゲームの内部）を覗くツールが用意されています。
「デバッグモード」です。

それでは「デバッグモード」の説明をしていきましょう。
まず編集メニューから「ゲームをプレイ」を選択するか、「F5」を押すか、画面の右上の三角をおして、ゲームを実行します（１）。
実行したら、「F1」を押します（F1とはファンクションキーのことです；念為）。
すると、ゲーム画面の上部にメニューが表示されます（２）。
![debugMode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103492/a3a3981b-5f6a-a6b9-7255-58a27b2df863.png)
（VanSurvBombは私の作ってるゲーム名です；念為；）

デバッグモードは画面が狭いと見にくいので、ウィンドウを大きくしてください。

「デバッグ機能」と「デバッグ」の二つが主に使うメニューです。

「デバッグ機能」の「壁判定を表示」「攻撃判定を表示」をチェックしてみます。
各オブジェクトの壁判定が緑の四角で、攻撃判定が赤い四角で表示されました。
（たとえば下の画像では爆発で攻撃判定が大きくなることが確認できました）
![debugMenu02Hantei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103492/e33d648f-9bf3-64e6-03fe-337299733ef6.png)

今度は「実行ログコンソール表示」をチェックしてみます。
「実行ログコンソール」は、どのオブジェクトがどういうアクションを実行したのかを表示しています。
またスクリプトを書いたときにJavaScriptのエラーを表示してくれます。
![debugMenu02logConsole.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103492/96a44a9c-8ffc-04c3-5319-ec8ccea30987.png)

「デバッグ」のメニューでは、「オブジェクト情報」が一番使う頻度が高いでしょう。
今表示されているシーンにあるオブジェクトの情報を表示してくれます。
さらに各オブジェクトの詳細をクリックすると、スイッチや変数の値を確認できます。
![debugMenu03Object.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103492/13c742d4-f09f-c23b-ac6a-3adb345a07ba.png)


メニューすべてを解説することは私にはできませんので、皆さんでいろいろ試してみてください。

デバッグモードは、アクションプログラムが思った通り動いているか、目で見て確認できるツールです。
これでアクツク君にスルーされても大丈夫ですね。
ではまた。

追記：デバッグモードは画面が小さいと見にくいので、「オブジェクト設定」から、サイズを拡大しておくと、毎回拡大表示をしなくてもよいので楽です。
「プロジェクト設定」は右上の歯車をクリックするか（１）、設定メニューを開くとあります。
![Variable05ProjectSetting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103492/d272a92d-a141-7a98-7d55-7c1308489b11.png)
表示設定からｘ２とかｘ３とかで大きくしておくのがおすすめです（２）。
【lvm】ディスクを追加して論理ボリュームをオンライン拡張

## 概要
- LVM (Logical Volume Manager) を利用したオンラインボリューム拡張
- クラウドで徐々にボリュームを増やす場合等で利用

## LVM
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/configuring_and_managing_logical_volumes/overview-of-logical-volume-management_configuring-and-managing-logical-volumes

## 手順
### disk を認識させる
```bash
echo "- - -" | tee /sys/class/scsi_host/host*/scan
```

### 既存の情報を調べる
- pv (physical volumes)
```bash
pvs
pvdisplay
```
- vg (volume groups)
```bash
vgs
vgdisplay
```
- lv (logical volumes)
```bash
lvs
lvdisplay
```
### 物理ボリューム/pv（ディスク）を追加
- 確認コマンド
```bash
lvmdiskscan
```
- 追加ディスクの内容があるか確認 (/dev/sdb等)
```
  /dev/ram0              [      16.00 MiB]
  /dev/root              [      50.00 GiB]
  /dev/ram1              [      16.00 MiB]
  /dev/sda1              [     500.00 MiB]
  /dev/VolGroup00/LogVol01 [       5.77 GiB]
  /dev/ram2              [      16.00 MiB]
  /dev/sda2              [     465.27 GiB] LVM physical volume
  /dev/VolGroup00/LogVol00 [     409.50 GiB]
  /dev/sdb               [     XXX.XX GiB]
```
### physical volume (/dev/sdb) を追加
- pv 作成
```bash
pvcreate /dev/sdb
```
- 確認
```bash
lvmdiskscan -l
pvs
pvdisplay
```
### volume group に physical volume 追加
- vg 拡張 (対象は vgs で出力される VolGroup00など vg名)
```bash
vgextend VolGroup00 /dev/sdb
```
### logical volume の容量を拡張
- lv 拡張 (対象は lvdisplay の LV Name)
```bash
lvextend -l +100%FREE /dev/VolGroup00/LogVol00
```
### ファイルシステム拡張（オンライン拡張）
- resize2fs (対象は df コマンドで出力される Filesystem名)
```bash
resize2fs -p /dev/mapper/VolGroup00-LogVol00
```
### 拡張確認
```bash
df -h
```

以上、お疲れ様でした！
EC2の自動停止

# 概要
awsを使ってインフラを構築する際、ec2インスタンスを停止することを忘れてしまうことが多くありました。
使用していない時間の稼働費用ってもったいないですよね...！
防ぐために共有しようと思いました。

# EC2自動停止

・`CloudWatch` > `イベント` > `ルール` > `ルールの作成`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2886909/b10e8251-13e7-5040-12d5-8fb693621afc.png)

・スケジュールを選択
・停止したい時間をCron式で入力
※GMTなので日本時間に合わせるため**−9時間**する
・例として今回は毎日22:00に停止→`0 13 ? * * *` 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2886909/d1ee2f6c-92d4-c389-0178-ffdc6645556a.png)

・`ターゲット`のアクションから**EC2 StopInstances API 呼び出し**を選択
・インスタンスIDに対象のインスタンスIDを入力
・ほかに自動停止したいインスタンスがある場合は「ターゲットの追加」をクリックして同様に追加します
・完了したら「設定の詳細」をクリック
・有効化にチェックが入っていることを確認して「ルールの作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2886909/be495cbc-66e0-3700-916f-5ccbdd92ebe6.png)

# 参考
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ScheduledEvents.html
Leetcode 1443. Minimum Time to Collect All Apples in a Tree

https://leetcode.com/problems/minimum-time-to-collect-all-apples-in-a-tree/description/

## 難易度
### Medium

## アプローチ
### DFS

```java
import java.util.ArrayList;
import java.util.List;

public class MinimumTimeToCollectAllApplesInATree1443 {
    public static void main(String[] args) {

        int n = 7;
        int[][] edges = {{0, 1}, {0, 2}, {1, 4}, {1, 5}, {2, 3}, {2, 6}};
        List<Boolean> hasApple = new ArrayList<>();

        hasApple.add(false);
        hasApple.add(false);
        hasApple.add(true);
        hasApple.add(false);
        hasApple.add(true);
        hasApple.add(true);
        hasApple.add(false);

        int a = minTime(n, edges, hasApple);
        System.out.println(a);

    }


    public static boolean[] isVisited;
    public static ArrayList<ArrayList<Integer>> tree;
    public static int result = 0;

    public static int minTime(int n, int[][] edges, List<Boolean> hasApple) {
        isVisited = new boolean[n];

        tree = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            tree.add(new ArrayList<>());
        }

        for (int[] edge : edges) {
            int start = edge[0];
            int end = edge[1];

            tree.get(start).add(end);
            tree.get(end).add(start);
        }

        result = dfs(0, hasApple);
        return result;

    }

    public static int dfs(int edge, List<Boolean> hasApple) {
        if (isVisited[edge]) {
            return 0;
        }

        isVisited[edge] = true;

        int count = 0;
        for (int i = 0; i < tree.get(edge).size(); i++) {
            int next = tree.get(edge).get(i);
            count += dfs(next, hasApple);
        }

        // 現在のedgeが0の場合、現在のカウントを返す
        if (edge == 0) {
            return count;
        }

        // 現在のedgeがりんご又はカウントされた場合、パスの追加のため、+ 2
        if (hasApple.get(edge) || count > 0) {
            return 2 + count;
        }
        
        // 他の場合、0をReturnする
        return 0;
        
    }

/* WA
    public static int dfs_WA(int edge, int count, List<Boolean> hasApple) {
        if (isVisited[edge]) {
            return 0;
        }

        isVisited[edge] = true;

        for (int i = 0; i < tree.get(edge).size(); i++) {
            int next = tree.get(edge).get(i);

            count += dfs(next, count + 1, hasApple);

        }
        count++;
        if (hasApple.get(edge)) {
            result = count;
        }
        return count;
    }
*/
}

```

- [こちら](https://leetcode.com/problems/minimum-time-to-collect-all-apples-in-a-tree/solutions/3033288/explained-java-solution-dfs-o-n/)を参考しました
Qt でGUI (on MacOS) - Hello world! -

# Qt とは?
[Qt (キュート)](ttps://www.qt.io) はC++ でGUI アプリケーションを作ることができる言語.
読み方は正式にはキュートらしい, キューティーではない.
Windows, Mac, Linux などOS 問わず実行できるのが魅力的.
ちなみにPython で動かせる[PyQt](https://riverbankcomputing.com/software/pyqt) なんかもある.
ここでは普通のQt で色々とまとめていこうと思う.
### 環境
ここではMac での環境でやっていく.
- Mac OS Monterey (12.4_
- M1 チップ


# Qt のインストール
いつもどおりHomebrew を使ってインストールしましょう.
```bash
$ brew install qt
```
2023 年1　月11 日時点では, 6.4.2 バージョンがインストールされた. 

続いてPATH を通しておこう.
以下ではbash_profile に書き込んでるが,
zsh　に通すならそちらで.
```bash
$ cd
$ export PATH="/usr/local/opt/qt/bin:$PATH" >> .bash_profile
```
端末を再起動させるか, bash_profile なり, zsh を実行する.
```bash
$ . .bash_profile
```

# Hello World!
Qt の練習用にQt ディレクトリなどを作っておこう.
```bash
$ cd
$ mkdir Qt
```
さらにHello ディレクトリでも作っておく.
```bash
$ cd Qt
$ mkdir Hello
```
このディレクトリに適当なエディタで以下のようなHello.cpp ファイルを作る.
```Hello.cpp
#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QLabel *label = new QLabel("Hello World!");
    label->show();
    return app.exec();
}
```
コンパイルする.
```bash
$ qmake -project
```
すると, 同じディレクトリにHello.pro というファイルができる.
このファイルに以下のように
QT+=widgets　を最終行に書き込んでおく.
```Hello.pro
######################################################################
# Automatically generated by qmake (3.1) Wed Jan 11 14:21:25 2023
######################################################################

TEMPLATE = app
TARGET = hello
INCLUDEPATH += .

# You can make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# Please consult the documentation of the deprecated API in order to know
# how to port your code away from it.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

# Input
SOURCES += hello.cpp
QT+=widgets
```

続いて, Hello.pro をqmake した後で, make してビルドする.
```bash
$ qmake Hello.pro
$ make
```
エラーなどが起きていなければ, Hello.app というディレクトリができており, このディレクトリの中身にあるファイルを実行する.
```bash
./Hello.app/Contents/MacOS/Hello
```
そすると画面上に
![スクリーンショット 2023-01-11 14.36.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2777840/8d17a9e0-469f-520d-7d9b-6be0e0879b46.png)
とウィンドウが出現する.

### HTML 形式で文字を装飾
Qt では文字の装飾はHTML 形式でできる.
フォントサイズを大きくして,
Hello の部分をイタリックに, World! の部分を赤文字にしてみる.
書き換えるのはHello.cpp のlabel 変数をの部分を変える.
```diff_cpp
#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>

int main(int argc, char *argv[]) {
QApplication app(argc, argv);
- QLabel *label = new QLabel("Hello World!");
+ QLabel *label = new QLabel("<h2><i>Hello</i>" " <font color = red>World!</font></h2>");
label->show();
return app.exec();
}
```
qmake -project からビルドし直して,　実行すると以下のようにフォントスタイルを変えたウィンドウが現れる.
![スクリーンショット 2023-01-11 14.43.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2777840/c4bb4697-b0cb-a9bf-14c6-e5c63befeb8f.png)

# ひとまずここまで
まだまだGUIとは言えないけれど,備忘録も兼ねながらどんどんまとめていきたい.
ひとまず自分がやりたいことは測定装置とシリアル通信して, それらの制御なんかをGUI でできるようにしたい. LabVIEW なんかを使えばできるけど, Qt だったら無料でできるので...
Gitコマンドを用いてブランチ名を変更、確認方法

## 概要
Gitコマンドを用いてブランチ名を変更、確認する方法を紹介致します。
特にデフォルトブランチの変更は1回設定すれば毎回ブランチ名を変更する必要がなくなるので煩わしいと思う方は是非活用して頂きたい。

**下記ページ内リンク**
- **[現在のブランチ名を変更方法](#現在のブランチ名を変更する場合)**
- **[デフォルトブランチを変更する方法](#デフォルトブランチ名を変更する場合)**
- **[現在のブランチ名の確認方法](#現在のブランチ名を確認する場合)**
- **[デフォルトブランチの確認方法](#デフォルトブランチを確認する場合)**

## ブランチ名の変更方法
シェルを開いて以下のコマンドを記述します。

### 現在のブランチ名を変更する場合
```
$ git branch -m {変更前のブランチ名} {変更後のブランチ名}
```
### デフォルトブランチ名を変更する場合
```
$ git config --global init.defaultBranch {変更後のブランチ名}
```

## ブランチ名の確認方法
### 現在のブランチ名を確認する場合
```
$ git branch --contains
```
### デフォルトブランチを確認する場合
```
$ git config -l
```
グローバルのみに範囲を絞る場合は上記のコマンドに`--global`を足す必要があります。
```
$ git config --global -l
```

## 使用例
私の場合はデフォルトブランチ名がmasterになっていましたので、米国の歴史や文化の過酷な背景を連想させてしまう可能性がある単語という牽強付会な理由で、同上の方法を用いてmainに変更しようと思います。

### 現在のブランチ名をmainにする
```
$ git branch -m master main
```
### デフォルトブランチをmainにする
```
$ git config --global init.defaultBranch main
```
## 参考

https://tracpath.com/docs/git-branch/
[自分用メモ]gitのエイリアスやターミナルの設定など

```~/.bashrc
# ターミナルの色付け
if [ $UID -eq 0 ]; then
    PS1="\[\033[31m\]\u@\h\[\033[00m\]:\[\033[01m\]\w\[\033[00m\]\\$ "
else
    PS1="\[\033[36m\]\u@\h\[\033[00m\]:\[\033[01m\]\w\[\033[00m\]\\$ "
fi

# "-F":ディレクトリに"/"を表示 / "-G"でディレクトリを色表示
alias ls='ls -FG'
alias ll='ls -alFG'

# ブランチ表示
source /Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh
source /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\n\$ '


eval "$(/opt/homebrew/bin/brew shellenv)"


alias ga='git add .'
alias gcm='git commit -m'
alias gca='git commit --amend'
alias gcam='git commit --amend -m'
alias gb='git branch'
alias gco='git checkout'
alias gcob='git checkout -b'
alias gcom='git checkout main'
alias gcod='git checkout develop'
alias gf='git fetch'
alias gmm='git merge origin/main'
alias gmd='git merge origin/develop'
alias gs='git status'
alias gp='git push origin HEAD'
alias gpf='git push --force-with-lease origin HEAD'
alias gr='git reset'
alias gr1='git reset HEAD^'
alias gd='git diff'
alias gl='git log'
alias glo3='git log --oneline -3'
alias glo8='git log --oneline -8'

```

```~/.zshrc
# ターミナルの色付け
# PS1="%n:%d %# "
# PS1="%F{magenta}%n%f:%F{yellow}%d%f %# "

# ブランチ表示
autoload -Uz vcs_info
setopt prompt_subst
zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr "%F{magenta}!"
zstyle ':vcs_info:git:*' unstagedstr "%F{yellow}+"
zstyle ':vcs_info:*' formats "%F{cyan}%c%u[%b]%f"
zstyle ':vcs_info:*' actionformats '[%b|%a]'
precmd () { vcs_info }
# プロンプトカスタマイズ
PROMPT='
[%B%F{red}%n@%m%f%b:%F{green}%~%f]%F{cyan}$vcs_info_msg_0_%f
%F{yellow}$%f '
```
【Python】VSCodeでimportが認識されない場合の解消方法

VScodeを使ってコードをカキカキしている時の話
pandasやらなんやらimportすると波線が。。。

![スクリーンショット 2023-01-11 140051.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57096/0774afe3-f7df-c885-09e9-c90c154ad6bb.png)

認識できないってさー

![スクリーンショット 2023-01-11 140854.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57096/b29b3a23-1819-22fe-7899-7431463537b1.png)

install は したのになぜ？？？

![スクリーンショット 2023-01-11 140403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57096/b68ecc42-18b0-d8ad-18a9-83aec31f535a.png)

いろいろ調べて
VSCodeの設定でパスを通してあげたら解決できた

設定を開いて"extra"で検索したら出てくる Analysis:Extra Paths が対象の項目

![スクリーンショット 2023-01-11 141730.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57096/f746205b-9f57-b3a0-f293-5aa8a8b50200.png)

[項目の追加]を選択して pandas やらが install されているパスを設定すればOK

![スクリーンショット 2023-01-11 142038.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57096/6773c99a-297f-71a9-2bf7-af76add33d1d.png)

波線が消えた！

![スクリーンショット 2023-01-11 142550.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57096/5b025e99-6108-c85c-e673-83ff701abe8e.png)

以上！！！！
可変長引数(PHP)

PHPで引数を可変長で渡すテストプログラムを実装しました。

```PHP
 // 可変長引数で合計を計算する
    function sum(...$numbers)
    {
      $total = 0;
      foreach($numbers as $number){
        $total += $number;
      }
      return $total;
    }

    // ブラウザ表示
    function disp($num){
      echo "<p class=test1>${num}</p>";
    }

    $total1 = sum(3,4,5);
    disp($total1);

    $total2 = sum(1,3,5,7,9,11);
    disp($total2);

```
paizaラーニング レベルアップ問題集 二分探索メニュー応用編 JavaScript 集団検査

集団検査 (paizaランク C 相当)

https://paiza.jp/works/mondai/binary_search_advanced/binary_search_advanced__group_test

# 解答例
N通りの候補を2で割っていき、最終的に1通りになればよいです。
偶数を2で割る場合はそのままでよいですが、奇数を２で割る場合、1余りますので、商を切り上げます。

```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

let N = Number(lines[0]);
let count = 0; //薬品の使用回数

while (N > 1) { //最終的に1通りになればよい
  count += 1;
  N = Math.round(N / 2); //奇数の場合切り上げる
}

console.log(count); //使用回数を出力
```

# 解答例(模範解答参考)
薬の使用回数をans、得られる情報の人数の最大値をnum(=2^ans)とします。
numがN人の住民の数を超えればよいです。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

let n = Number(lines[0]); //n人の住民
let [num, ans] = [1, 0];

while (num < n) { //得られる情報が、n人の住民を超えればよい
  num *= 2; //得られる情報は*2得られる
  ans++;//薬品を1回使う
}

console.log(ans); //使用回数を出力
```
MVtecADの論文？を軽く解釈する

翻訳かけて確認しただけなので間違いがあるかもしれない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079535/07f7b8f6-376b-eca6-e1e0-031c251ceab3.png)
これはテクスチャ

# データセット内の画像は大きく2つに分類される
MVtecADデータセットは15種類の異常検知データセットが提供されており、以下2種類に大きく分類される。実世界の産業検査シナリオで発生するような異常画像である。
## ・テクスチャカテゴリ
タイルや木目、皮　等のデータにランダムなばらつきがあるもの
特徴：CNN特徴辞書モデル？が一部例外を除き有効

## ・オブジェクトカテゴリ
ボトル、ナット、薬（錠剤）などの見た目に変化が少ない固定されているもの
特徴：オートエンコーダがよい結果を出す。

他にもGANとか検証しているがとりあえずAEとCNN？について説明

## CNN特徴辞書
CNNで得られた特徴を主成分分析等で分類する？

引用されてた論文
CNN-based features for retrieval and classification of food images
https://www-semanticscholar-org.translate.goog/paper/CNN-based-features-for-retrieval-and-classification-Ciocca-Napoletano/4338f04b8cee398f43b1f69fba5c1de4a335df48?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=sc


## オートエンコーダ
次元削減の一種
学習入力に対しパラメータの調整を行うので、外れデータが入ったときうまく復元できないことを利用する。
変化量が少ないデータに有効
Web ARENA indigo Rocky Linux 9 初期設定

dnfパッケージのアップデート

```
# dnf -y update
# dnf -y upgrade
```

vimインストール

```
# dnf -y install vim
```

ロケール設定

```
# dnf -y install langpacks-ja glibc-langpack-ja.x86_64
# localectl set-locale LANG=ja_JP.utf8
# source /etc/locale.conf
```

日時設定

```
# timedatectl set-timezone Asia/Tokyo
```
WSL2 + SDL2でなぜかtextureが白箱になってしまう問題

# 問題
WSL2でSDL2を利用したアプリケーションを作成, ホスト側のVcXsrvに実際の内容を描画させようとしたが、しばしばtextureがただの白い箱として描画されてしまう。

# 解決策
Rendererに指定されているdeviceに問題があると思われるのでSoftwareレンダリングを利用する。

```
SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE);
```

この時第二引数が`-1`になっていないと3つ目のフラグが反映されないので注意

# もう少し細かい話
- CreateRendererは第二引数が`-1`の場合、flagの条件を満たすdriverから優先度の高いものを選択する
- 実際に使われているドライバを調べる `SDL_GetRendererInfo`
    - https://wiki.libsdl.org/SDL2/SDL_GetRendererInfo
- `LIBGL_ALWAYS_INDIRECT=1`がセットされているとopenglは使われないがなぜかes版の方は選択肢として残ってしまう(そしてこれが特定の環境ではうまく動かない)
GitのVersionのresetとrevert

・ローカルのVersion確認
 Short Version　コミット名
  git log --oneline
　例：306e968 (HEAD -> develop, origin/develop) sync all controlled files
　　　3366cf8 sn-458
Long Version　コミット名
　git log
・resetはそのコミットまでに戻る
　revert そのコミットが削除
　参照：https://zenn.dev/nekoniki/articles/f238efa56eb869
　例： git reset --hard 3366cf8 
・強制リモートのreset (-f)
  git push origin develop -f

・今のブランチの更新をクリアする
　まず、直近にreset
    git reset --hard 
　あと、クッリンする
　　git clean -fxd
・gitにPush
	 git push origin develop
         ※ローカルBranch名とリモートBranch名が不一致の場合、
　　　　　　　git push origin localBranch:remoteBranch
ビット毎の設定を楽にするために2進数リテラルを使おう！

# ビット毎の設定
プログラム上で、ビット毎にフラグの意味を持たせてOn/Offを切り替えることって、ありますよね？
複数のフラグを同時に設定できるので、便利な考え方です。
※ハードウエアの制御やAPIで使われていたり、自作する場合などがあると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747681/26b85be1-eb4a-a613-9647-27796b64fdf2.png)

# フラグの設定
フラグ用の定数が用意されている場合は、値を意識することはあまりないですが
自分で記述しなければならないことがあります。

その場合、例えばフラグ0と6と7をOnにしたいとなれば、まず2進数で考えます。
```:フラグ0と6と7をOnにする2進数
1100 0001
```

2進数リテラルを使わない(なかったころの)場合は、ビット毎の設定に適した16進数に変換します。
いきなりは難しいので、4ビット毎に10進数に変換して、そこから16進数に変換です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747681/c2693cce-92a0-52e9-bbc7-ca5ec87b7305.png)
先程のフラグ0と6と7をOnにする2進数を表に従って置き換えてみます。

```:10進数に変換(4ビット毎)
12 1
```
```:16進数に変換
C 1
```

ここまで来てやっとプログラムに記述が可能です。

```C++:フラグ0と6と7をOnにする(C++)
uint8_t flag = 0xC1; // 0xは16進数リテラルであることを示す宣言
```
```C#:フラグ0と6と7をOnにする(C#)
byte flag = 0xC1; // 0xは16進数リテラルであることを示す宣言
```

ダメじゃないけど、16進数に興味ないし、回りくどいし直感的じゃないですよね…
そこで、2進数リテラルの登場です！！！

```C++:フラグ0と6と7をOnにする(2進数リテラル利用)
// C++での記述 (C++14から可能)
uint8_t flag = 0b11000001; // 0bは2進数リテラルであることを示す宣言
```
```C#:フラグ0と6と7をOnにする(2進数リテラル利用)
// C#での記述 (C# 7.0から可能)
byte flag = 0b11000001; // 0bは2進数リテラルであることを示す宣言
```

どうでしょう。直感的ではないでしょうか？
えっ、見にくい？ …ですよね。そこで区切り文字が使えます。

```C++:フラグ0と6と7をOnにする(2進数リテラル利用)
// C++での記述 (C++14から可能)
uint8_t flag = 0b1100'0001; // 0bは2進数リテラルであることを示す宣言
```
```C#:フラグ0と6と7をOnにする(2進数リテラル利用)
// C#での記述 (C# 7.0から可能)
byte flag = 0b1100_0001; // 0bは2進数リテラルであることを示す宣言
```
※C++は「'」シングルクォーテーションでC#は「_」アンダースコアが区切り文字です。
　区切り文字とは、プログラム上の意味は存在しないが可読性のために記述できる文字の事です。

これで4桁ずつ区切れば、可読性も問題ないのではないでしょうか。

定数を作る場合もこんな感じになって見やすいです。
```C++:フラグ0と6と7をOnにする(2進数リテラル利用)
// C++での記述 (C++14から可能)
static const uint8_t FLAG0 = 0b0000'0001; 
static const uint8_t FLAG1 = 0b0000'0010; 
static const uint8_t FLAG2 = 0b0000'0100;
static const uint8_t FLAG3 = 0b0000'1000;
static const uint8_t FLAG4 = 0b0001'0000;
static const uint8_t FLAG5 = 0b0010'0000;
static const uint8_t FLAG6 = 0b0100'0000;
static const uint8_t FLAG7 = 0b1000'0000;

// 定数を使ってフラグ0と6と7をOnにする(C++)
uint8_t flag = FLAG0 | FLAG6 | FLAG7;
```
```C#:フラグ0と6と7をOnにする(2進数リテラル利用)
// C#での記述 (C# 7.0から可能)
const byte FLAG0 = 0b0000_0001; 
const byte FLAG1 = 0b0000_0010; 
const byte FLAG2 = 0b0000_0100;
const byte FLAG3 = 0b0000_1000;
const byte FLAG4 = 0b0001_0000;
const byte FLAG5 = 0b0010_0000;
const byte FLAG6 = 0b0100_0000;
const byte FLAG7 = 0b1000_0000;

// 定数を使ってフラグ0と6と7をOnにする(C#)
byte flag = FLAG0 | FLAG6 | FLAG7;
```
m1macにWiresharkをインストール


インストールするだけです・・・


### homebrewでインストール
```
brew install wireshark
```



### 早速使ってみよう
```
tshark
```



### エラー発生
```
tshark: The capture session could not be initiated on capture device "en0" (You don't have permission to capture on that device).
Please check to make sure you have sufficient permissions.
```


### そういえばさっきインストールした時になんかメッセージ出てた
```
If your list of available capture interfaces is empty
(default macOS behavior), install ChmodBPF:
```


### ChmodBPFをインストール

```
brew install --cask wireshark-chmodbpf
```


### 今度こそ使ってみよう
```
tshark
```

うまくいきました。



---

参考

https://qiita.com/y-vectorfield/items/3aaaa98eb2aeca223ecf