OmniAICreator/Qiita-1.07M huggingface dataset:
Zabbix&Zabbixproxyにてout of memoryが発生した場合

# 概要
Zabbix及びZabbixProxyでは、ある程度アイテム数が多くなって監視対象が大規模になると、急にダウンする事がある。その時、`systemctl start `しても起動しなかったりする。なお、今回のZabbixのバージョンは5.0と仮定する。

その際、以下のようなログが表示される可能性がある。

```:/var/log/zabbix/zabbix_proxy.log
zbx_mem_malloc(): out of memory (requested 136 bytes)
2068:20160203:051106.554 [file:dbconfig.c,line:446] zbx_mem_malloc(): please increase CacheSize configuration parameter
```
もしくは
```/var/log/zabbix/zabbix_server.log
zbx_mem_malloc(): out of memory (requested 136 bytes)
2068:20160203:051106.554 [file:dbconfig.c,line:446] zbx_mem_malloc(): please increase CacheSize configuration parameter
```

この時は、以下のようにZabbixの設定ファイルを変更する。128Kから、64Gまでの間で設定する。

```: /etc/zabbix/zabbix_server.conf
CacheSize=512M
```
ちなみに、proxy、serverも5.0まではデフォルト8M。6.0からはデフォルト32Mとのこと。
```: /etc/zabbix/zabbix_proxy.conf
CacheSize=512M
```

https://www.zabbix.com/documentation/5.0/en/manual/appendix/config/zabbix_server?hl=CacheSize

その後、Zabbixserver(proxyserver)の再起動を行う。
```:zabbixserver
systemctl restart zabbix-server
```
proxyの場合
```:zabbixproxy
systemctl restart zabbix-proxy
```

その後、無事Zabbix及びZabbixServerを起動させる事ができた。
【Java Silver】cloneメソッドをできるだけわかりやすく解説

Javasilver se11の勉強をしていて、黒本の総仕上げ問題②74問、79問（cloneメソッドの問題）で悩んだので簡単に整理してみようと思います。記事を書くのは初めてなので、温かい目で見ていただければ幸いです。

:::note info
書き方と簡単な仕様についての解説になっています
:::
# cloneメソッドとは
その名の通り、自分のクローンを作るメソッドになっています。
コード自体はとても簡単で分かりやすいですね。
```html:cloneメソッド
int[] a1 = {100,200};
int[] b2 = a1.clone();  //100,200が入ってる
```
<font color="#1e90ff">**cloneメソッドは参照型**</font> で利用できます。**int型** や **double型** などのプリミティブ型は参照を代入できず、コンパイルエラーが発生します。

```html:コンパイルエラー
int a1 = 100;
int b2 = a1.clone();　
```
参照型ですが、**String型** では使えずコンパイルエラーが発生します。
困惑するかもしれませんが、配列の **String型** は扱いが違うので問題ないです。
```html:コンパイルエラー
String a1 = "A";
String b2 = a1.clone();　
```
# 配列をどのようにコピーしているか
恐らく僕の記事を読みに来てくれている人は、JavaSilver 受験者だと思うので早速ですが、問題を解説していこうと思います。

以下の問題は黒本の548ページと552ページに載っています。
```html:問題74
char[][] a1 = {{'a','b'},{'c','d'}};
char[][] b2 = a1.clone();
char[] c3 = a1[1].clone();

System.out.println(a1 == b2);  //false
System.out.println(a1[1] == c3);  //false
System.out.println(a1[0] == b2[0]);  //true
```
<font color="#1e90ff">**==演算子は 参照先が同じかどうか**</font> を判定してくれます。
図で見ると分かりやすくなると思うので、画像を作ってみました。
![cloneメソッド画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3594735/2bb9af6c-b89d-9e8f-4762-85abc3168b4b.jpeg)



a1 と b2 が参照しているものは、それぞれ違う箱なので false を返します。

a1[1] をコピーして作った c3 も同じ参照にはならず、false を返します。

a1[0] と b2[0] は二つとも同じ「AB」を指しているため、true を返します。

:::note info
cloneメソッドを利用して配列のコピーを作る場合、**本体と同じ参照先を持ったクローン**を作っていると考えると理解しやすいと思います。
:::

```html:問題79
int[] a = {2,3,4};
int[] b = a.clone();
b[0] = 5;

for(int i : a){
    System.out.println(i + " "); //[5 3 4]の出力
}
```
上記の問題は本物とクローンの共通の参照先であるオブジェクトを変更しています。

上の画像のように考えると、真ん中にある **AB** か **CD** を他のアルファベットに置き換えているイメージです。

当然、参照先のオブジェクトを変えると互いに干渉し合うことになります。

# 最後に
cloneメソッドについての問題を解説してみました。更に詳しく知りたい方は以下の記事を読んでみてください。とても分かりやすく書かれていて、理解が深まると思います。

https://java.keicode.com/lang/clone.php

# 参考文献

<img width="300" alt="黒本.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3594735/a4ba63ed-33f2-0b48-1649-cc6961f60548.jpeg">

[- 徹底攻略Java SE 11 Silver問題集 -](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Java-SE-11-Silver%E5%95%8F%E9%A1%8C%E9%9B%86%EF%BC%BB1Z0-815%EF%BC%BD%E5%AF%BE%E5%BF%9C-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B07YWKWBBD)
【Rails】paramsのキーをスネークケースに変換する方法


`app/controllers/application_controller.rb`に以下のように記述することでparamsのキーがキャメルケースで送信されてきてもスネークケースに変換されます。

```app/controllers/application_controller.rb
class ApplicationController < ActionController::API
  before_action :snakeize_params

  private
    def snakeize_params
      request.parameters.deep_transform_keys!(&:underscore)
    end
end
```
擬似要素を使った吹き出しの表示

## 吹き出しを表示するためのコツ

**➀親要素と子要素の配置を決める**
→これをやらないと、ブラウザの左上に吹き出し部分を配置してしまう

**➁要素の直前に要素を設定するには、擬似要素「::before」を使う**
※逆に要素の直後に要素を設定するには、擬似要素「::after」を使う
→枠線のレイアウトを実装して、擬似要素「::after」を使うと、枠線を使った吹き出しを表示できる

➂**枠線の表示と透明化(非表示ではない)を活用する**
→「border：transparent」で、枠線を透明化にできる


## 吹き出しを実装する前にやるべきこと

**親要素を配置の基準として指定する**
→これが無いと、ブラウザの左上に吹き出し部分を配置してしまう

```chat.css
.partner-message {
  position: relative; (partner-messageクラスのdiv要素を基準とする)
  padding: 10px;
  border-radius: 10px;
  margin-left: 20px;
  max-width: 400px;
}
```

## ステップを踏んで、三角の吹き出しを表示させる
**STEP1.吹き出しを付け加える**
```chat.css
.partner-message::before{ (要素の直前に実装するレイアウトを記述する)
  content: ''; (吹き出しを入れるので、内容は入れない)
  position: absolute; (.partner-messageを基準として、配置位置を決める)
  left: -15px; (.partner-messageの左枠の外からはみ出る)
  top: 8px; (.partner-messageの上から8px分ずれる)
  border-right: 15px solid #7ed957;
  border-top: 15px solid;
  border-bottom: 15px solid;
  border-left: 15px solid;
}
```
→メッセージ要素から左へ「-15px」、下へ「8px」の位置に枠線を表示した
→borderに違う色を指定すると、斜線になる！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568357/8a4a6f0c-e1f2-e8ff-1e33-e772656e2568.png)
span要素のmargin-leftでは、こんな状態になっている![スクリーンショット 2023-11-02 23.27.55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568357/705075b7-0968-33ce-efc3-976b7f080c97.jpeg)


**STEP2.長方形の吹き出しにする**
```chat.css
.partner-message::before{
  content: '';
  position: absolute;
  left: -15px;
  top: 8px;
  border-right: 15px solid #7ed957;
  border-top: 15px solid;
  border-bottom: 15px solid;
}
```
→左の枠線が無い状態なので、四角の左半分が切り取られ、長方形で表示した状態になる
![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568357/409823ba-f373-cee0-9f05-70f1fdcd3757.png)
こんな状態になっている
![スクリーンショット 2023-11-02 23.50.55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568357/24edd631-3d88-6241-fd96-4a65772e257d.jpeg)


**STEP3.三角形の吹き出しにする**
```chat.css
.partner-message::before{
  content: '';
  position: absolute;
  left: -15px;
  top: 8px;
  border-right: 15px solid #7ed957;
  border-top: 15px solid transparent;
  border-bottom: 15px solid transparent;
}
```
→上下の三角を「transparent」で透明化すれば、三角形の吹き出しを表示できる！！
![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568357/cd535651-6631-8ee8-d417-e2edf423dae4.png)
こんな状態になっている
![スクリーンショット 2023-11-02 23.54.44.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568357/c265d29e-ef1b-71d0-08c2-aadf309c6f7b.jpeg)


## 調べてみて分かったこと
➀親要素と子要素の配置を決める
➁擬似要素の「::before」「::after」を使う
➂枠線の表示と透明化を活用する上記のやり方で、会話の吹き出しを表示できる！！
Access365あたりのWizHook FileExistsはMsgBoxは有効

# FilesystemObjectのFileExists
[Office TANAKA - FileSystemObject[FileExistsメソッド]](http://officetanaka.net/excel/vba/filesystemobject/filesystemobject10.htm)

```vb
Function is_FSO_FileExists(str As String) As Boolean
With CreateObject("Scripting.FileSystemObject")
is_FSO_FileExists = .FileExists(str)
End With
End Function
```
こういうのはよく作ります。
これをWizHookで作った場合、どうなるのでしょうか。

# 結論から言うと関数では無効

```vb
Function wizHookFileExist(strFullPath As String) As Boolean
'Function FileExists(File As String) As Boolean
    WizHook.Key = 51488399
    WizHook.FileExists (strFullPath)
    WizHook.Key = 0
End Function
```

これはFalseしか返ってきません。これは使えません。
ところが、

# MsgBoxにTrue/Falseを出すことはできる
メッセージボックスにTrue/Falseを表示させることはできます。
Sub で書くとできます。
なので別のSubプロシージャからフルパスでファイル名を引数として呼び出すと、メッセージボックスに結果が返ってきます。

```vb
Sub CallTest()
  Call wizHookFileExt("C:\hoge\hoge.txt")
End Sub
Sub wizHookFileExt(strFullPath As String)
    WizHook.Key = 51488399
    MsgBox WizHook.FileExists(strFullPath)
    WizHook.Key = 0
End Sub
```

なお、フォルダの有無を確認することはできないとのこと。
https://team-moeller.de/?Tipps_und_Tricks:Wizhook-Objekt:FileExists

でもメッセージボックスにしか結果が返らないってなんなの？
フォームやレポートでは使うことはできると思いますが。
Vue Datepicker のボックスの大きさを調整する

## 概要
Vue Datepicker のボックスの大きさを、隣の Vuetify の Text fields (`<v-text-field />`) に似せてみました。

![スクリーンショット 2023-11-02 21.19.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043470/cac9c136-9584-893f-1121-9e9ead9c6013.png)

## Vue Datepicker とは
Vue 3 用の datepicker です。詳しい使い方や機能については、ここでは割愛します。
公式サイト: https://vue3datepicker.com/

## 本題
そもそも Vue Datepicker には、ボックスの高さや枠線の丸みを変えるオプションが用意されていません。（たぶん。あったらごめんなさい。）
デフォルトの Vue Datepicker の隣に Vuetify の Text fields (`<v-text-field />`) を `density="comfortable"` で置くと、このようにズレがうまれて、あまりうれしくありません。

![スクリーンショット 2023-11-02 23.32.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043470/5dba24a2-15ad-eb91-9fc1-c42e5fcfd119.png)

だったら CSS を直にいじってやろう、という話です。

#### HTML を見てみる
![スクリーンショット 2023-11-02 23.44.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043470/04af0d87-c54c-296b-e89d-a3a75c2417e2.png)

Vue Datepicker は `<input />` タグで定義されていて、そこにいくつか class があてられていることがわかります。そのなかでも `.dp__input` をいじればよさそうです。

そこで実際にあてた style が以下になります。
```js
.dp__input {
  border-radius: var(--dp-border-radius, 6px);
  line-height: 2.15rem;
}
```


![スクリーンショット 2023-11-02 21.19.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043470/cac9c136-9584-893f-1121-9e9ead9c6013.png)

いい感じになりました。

それでは！
React RouterのuseBeforeUnload

## beforeunload
[beforeunload](https://html.spec.whatwg.org/multipage/indices.html#event-beforeunload)はページがアンロードされようとするときに`window`で発生するイベントです。
イベントの`preventDefault()`が呼び出されるようなイベントハンドラを登録することで、ページがアンロードされるタイミングで以下のように確認ダイアログを表示させられます(画像はページをリロードしようとした時のChromeにおける表示)。
![スクリーンショット 2023-11-02 11.20.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591069/60e89481-12c8-e71a-1872-d1d4a9730594.png)

上記のような確認ダイアログを出すために以下のように登録しました。
```js
window.addEventListener('beforeunload', (e) => {
    e.preventDefault();
    e.returnValue = '';
})
```
Chromeでは`preventDefault`を呼び出すだけではなく、イベントの`returnValue`に文字列を詰め込む必要があります。
他のブラウザでも`preventDefault`を呼び出すだけではなく、イベントの`returnValue`に文字列を詰め込むもしくは、文字列をイベントハンドラの返り値として渡さなければ確認ダイアログが表示されないような仕様であることが多いです。

## useBeforeUnload
ReactではReact外のシステムと連携するときはエフェクトを利用して実装する必要があります。`window.addEventListner`もその例の1つで、一般的に以下のような実装となります。
```ts
useEffect(() => {
  window.addEventListener(eventName, handler);
  return () => {
    window.removeEventListener(eventName, handler);
  }
}, []);
```
React Routerはこのような実装を短縮して`beforeunload`にイベントハンドラを登録するときのヘルパーとして`useBeforeUnload`APIを持ちます。ページをアンロードしたときに確認ダイアログを出したい場合は以下のように記述します。
```ts
useBeforeUnload(
  useCallback((e: BeforeUnloadEvent) => {
    e.preventDefault();
    e.returnValue = '';
  }, [state]),
  { capture: true }
);
```
第1引数は必須で登録するイベントハンドラを記述します。このハンドラは`useCallback`によって包み込む必要があります。
第2引数は任意で振る舞いを指定するオプションを渡します。オプションはオブジェクトで`capture`をキーとして持ちます。`capture`は真偽値で、`true`の場合はキャプチャリングフェーズで発火して、`false`の場合はバブリングフェーズで発火します。
デフォルトは`false`なので`true`に設定したい場合に第2引数を指定するような使い方です。
```ts
// captureがtrueの場合
useBeforeUnload(
  useCallback((e: BeforeUnloadEvent) => {
    console.log(1);
  }, [state]),
  { capture: true }
);
// captureがfalse(デフォルト)の場合
useBeforeUnload(
  useCallback((e: BeforeUnloadEvent) => {
    console.log(2);
  }, [state])
);
```

実装は以下のようになっています。
```ts
export function useBeforeUnload(
  callback: (event: BeforeUnloadEvent) => any,
  options?: { capture?: boolean }
): void {
  let { capture } = options || {};
  React.useEffect(() => {
    let opts = capture != null ? { capture } : undefined;
    window.addEventListener("beforeunload", callback, opts);
    return () => {
      window.removeEventListener("beforeunload", callback, opts);
    };
  }, [callback, capture]);
}
```
エフェクトを利用した標準的な書き方になっています。イベントハンドラを`useCallback`で包み込む必要があったのはエフェクト内で利用するからということがわかります。

このようにAPIとして切り出すことでイベントハンドラを登録するときのエフェクトによる複雑さを隠すことができるのでReact Routerを使わない時に同様のAPIを定義したり、イベントハンドラの登録を一般化したAPIとして切り出して実装すると良いと感じました。
```ts
export function useEventListener<K extends keyof WindowEventMap>(
  eventName: T,
  callback: (event: WindowEventMap[T]) => void,
  options?: boolean | AddEventListenerOptions,
): void {
  useEffect(() => {
window.addEventListener(eventName, callback, options);

    return () => {
      windowremoveEventListener(eventName, callback, options);
    };
  }, [eventName, handler, options]);
}
```
海外工作面試訣竅大公開！


在現今競爭激烈的全球就業市場中，追求[海外工作](https://www.apexcharity.org/news/3/86)機會已成為許多人的夢想。然而，成功地獲得一份[美國工作](https://www.apexcharity.org/news/3/85)需要不僅僅具備相關技能和經驗，還需要掌握[英文自我介紹](https://www.apexcharity.org/news/3/92)和[英文面試](https://www.apexcharity.org/news/3/93)的訣竅。本文將分享一些關於在美國尋找工作、準備面試的實用建議，助你實現海外工作的目標。

美國工作的吸引力

美國作為全球經濟和科技創新的中心，吸引了來自世界各地的專業人才。許多人希望能夠在美國的知名企業或機構工作，不僅為自己的職業生涯增添新的可能性，還有機會體驗多元文化和生活方式。然而，要實現這一目標，你需要克服一些挑戰，其中之一是英文能力。

海外工作的重要性

在追求海外工作機會時，你必須瞭解這不僅僅是一份工作，更是一個生活方式的改變。你需要適應新的文化、習慣和社交環境。這種改變可能會帶來一些困難，但也為個人成長提供了寶貴的機會。通過遠離舒適區，你可以發現自己的潛力，並建立國際化的職業網絡。

英文自我介紹的關鍵

在海外工作尋找過程中，英文自我介紹是關鍵的一步。無論是在網絡上提交求職申請，還是面對面與招聘人員交談，你都需要能夠清晰、自信地表達自己。建議你提前準備一個簡潔而具體的自我介紹，強調你的技能、經驗和熱情。同時，練習發音和語調，以確保你的英文自我介紹流暢自然。

英文面試的技巧

在受邀參加面試時，英文的流利程度變得尤為重要。以下是一些幫助你成功應對英文面試的技巧：

事先準備: 在面試前，了解公司和職位的相關信息，並練習回答常見的面試問題。

自信表達: 在面試中，保持自信，清晰地表達自己的觀點，不要害怕犯錯誤。

積極溝通: 積極參與面試，提出有深度的問題，以表現你對該職位的真正興趣。

練習模擬面試: 參加模擬面試，請朋友或專業人士幫助你練習，並接受反饋。

語法和詞彙: 關注英文的語法和詞彙，以確保你的表達不含模糊或不正確的部分。

在海外工作尋找和面試的過程中，持之以恆、自信和積極的態度至關重要。無論遇到多大的挑戰，這些訣竅都將有助於實現你的海外工作夢想，並為你的職業生涯開啟新的可能性。
JLCPCBでPCBAを行った話

こんにちは！issaimaruです．
今回はJLCPCBで初めてPCBAを行ったのでその記事について書きたいと思います．

## 基板の様子
![42_6BkpK.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524988/4e8dcea1-e8f6-011e-81b2-6028e19b3238.jpeg)
![fPlnWtHJ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524988/bb2d3c4f-2b03-0b8b-4119-c685cab9342f.jpeg)

とてもきれいですねぇ！

## 評価
今回はPCBAのテスト用基板なので部品点数がかなり少なく済んでいます．LED用の抵抗だけです．
ですが体感普通に基板を頼むのとあまり変わらない日数できれいに部品実装がされていて，はんだ不良などがなく完璧な状態でした．マジで素晴らしい．
### なんで今までPCBAを使わずホットプレートリフローなんてしてたんだ！！

正直LCSCの部品代はクッソ安いです．正直ビビります．秋月よりも普通に安いです．安くてはんだ不良もなくて，そしてスピーディー．こちら側で実装するメリットは皆無ですよ！皆さんもぜひPCBAしてください！PCBAですよ？PCBAという言葉を覚えてもらえたらこの記事の意義があります．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524988/a12a0165-2a75-ed2b-ab17-86a11251203b.png)

しかもGlobal Parts Sourcing Service(綴りあってる？）というサービスまでやってます！このサービスはLCSCにない部品でもDigikeyとかから取り寄せて部品実装してくれるサービスです！部品代は少し高くなりますが本当におすすめです！ぜひやりましょう！

## 終わりに
この基板はJLCPCB様のスポンサーの下で提供されています．
![kRIP6jKB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524988/cda00208-5ea3-6bee-ea56-a2ffbf856761.png)

JLCPCBは新規ユーザーに＄54無料クーポンを発行する神みたいな基板発注業者です！基板も安いですし，対応もとてもよいです！ぜひJLCPCBから発注しましょう！
https://jlcpcb.com/JPV ←のリンクから飛ぶことでクーポンをもらえます．
【組込み開発】よく使う関数とデータ型について

## はじめに
今回の記事では、これまでに約1年と半年、組み込みソフト開発に携わってきた中で、よく見かける関数やデータ型についての紹介をしていきます。

## ①memset：配列を0x00で初期化したい時などに使用

memset関数の書式は以下です：
```C:
memset(void *buf, int ch, size_t n)

第1引数：メモリのポインタ
第2引数：セットする値
第3引数：セットするサイズ
```

## ②memcpy：データをコピーしたい時などに使用

memcpy関数の書式は以下です：
```C:
memcpy(void *buf, const void *buf2, size_t n)

第1引数：コピー先のメモリのポインタ
第2引数：コピー元のメモリのポインタ
第3引数：コピーサイズ
```


## ③列挙型：状態を定義するときなどに使用

列挙型の定義方法は以下です：
```C:
typedef enum{

    // 以下にメンバ変数を定義します
    eExample1 = 0,
    eExample2,
    eExample3,
}eExample;
```

定義方法は構造体と同じ(structがenumに変わっただけ)ですね。

### おわりに
今回は組み込みソフト開発でよく出てくる関数やデータ型について紹介しました。
少しでも皆様のお役に立てれば幸いです。
最後までご覧いただきありがとうございました。
【プラクティス紹介】1分でさらっと分かる「ワールドカフェ」

## プラクティス名(別名)
ワールドカフェ　(TWC)

## プラクティスの目的・狙い
* くつろいだ雰囲気で対話できる場をつくり、参加者からアイデアや意見を引き出す
* あたかも参加者全員と対話したかのような一体感を醸成する（輪を広げる）

## どんな時に使うか
* プロダクトや特定のテーマについてアイデアや意見を集めたい時
* テーマに関する参加者の興味や関心を高めたい時

## 実施手順
ワールドカフェは12人～1000人以上でも使える会議のファシリテーション手法の一つ。参加者全員に等しく発言の機会が与えられるため、一部の人の意見に偏ることもなく、満足度の高い会議となる。

1. 開催者は参加者に会議の趣旨/ルール/進め方等を説明する（場の設定）
1. 参加者に話し合ってもらう「問い」を発表する（テーマの設定）
1. 4人1組に分かれ、各テーブルで20～30分ほど「問い」について話し合う
1. 時間が来たら1人だけテーブルに残り、その他の人はそれぞれ別のテーブルに別れる
1. 残った1人が集まった人たちにこれまでに挙がった意見を共有し、再び同じ時間話し合う
1. 同じ要領で、4～5を何度か繰り返す（通常３ラウンド程度）
1. 最後に全員で、各テーブルで挙がったアイデアと意見を共有する

### 会議のルール
|  | ルール |
|:-:|:--|
| 1  |  対話を楽しむ |
| 2  |  話をよく聞く |
| 3  |  他人の意見を否定しない |
| 4  |  質問して対話を広げる |
| 5  |  テーマに集中する |

### 「問い」の設定
どのような「問い」を設定するかは超重要。簡単にYes/Noで答えられないオープンクエスチョンがよく、また直接的な問題解決を求めるものである必要はない。指針として以下のような問いが望ましい。

|  | 良い「問い」のヒント |
|:-:|:--|
| 1  |  シンプルで明確な問い |
| 2  |  発想を促す問い |
| 3  |  エネルギーが湧いてくる問い（ポジティブな問い） |
| 4  |  テーマに集中して探求することを促す問い |
| 5  |  これまでの仮説や思い込みを気づかせる問い |
| 6  |  理想の状態や新しい可能性を開く問い |
| 7  |  より深い内省を促す問い |
| 8  |  自分の事として考えられる問い |

### ラウンド構成
ラウンド回数にとくに決まりはない。４ラウンドで行う場合の構成例は以下。
| ラウンド | そのラウンドで意識する点 |
|:-:|:--|
| 第1ラウンド  |  テーマについて自由に話す |
| 第2ラウンド  |  他の意見を参考にアイデアを広げる |
| 第3ラウンド  |  気付きや発見を統合する |
| 全体セッション  |  集合的な発見を収穫し、共有する |



## アレンジ例
* 各テーブルに模造紙とペンを用意し、意見やアイデアを追記していく
* テーブル中央にトーキング・オブジェクト（簡単に受け渡せる物なら何でもよい）を置き、発言者はそれを手に取って話すルールとする。他は聞き手に回る。発言が終わったらオブジェクトをテーブルに戻す。

## アンチパターン
* 何らかの「結論を出す」「アクションを決める」ことを会議の目的に据える

※ワールドカフェはあくまでも「対話」が目的であり、「議論」の場ではないため、意見を収束させる話し合いには不向き

## 参考情報
日本公式サイト
https://world-cafe.net/

本家公式サイト
https://theworldcafe.com/

書籍『ワールド・カフェ ～カフェ的会話が未来を創る～』
https://www.humanvalue.co.jp/wwd/publishing/worldcafe/
　↓ エッセンスを要約
手引書PDF（全23ページ/SPODフォーラム2012）
[『ワールド・カフェの手引き』](https://www.spod.ehime-u.ac.jp/wp/wp-content/uploads/2012/11/%E8%B3%87%E6%96%99%EF%BC%92%E3%80%90%EF%BC%B0%EF%BC%A4%EF%BC%A6%E3%80%91.pdf)

## こぼれ話（私的コメント）
理由は知りませんが、行政がワールドカフェ推しのようで、市民ワークショップとかで使っているのをよく見かけます。民主主義と相性がいいからでしょうか？

4人1組で3テーブルぐらいは欲しいので、最低12人からという話になるのですが、１つのスクラムチームではやや人数が不足するので、マルチチーム開発で使えそうなプラクティスといえます。またはステークホルダーを集めて開催するか、ですね。レトロスペクティブにも使えそうですが、改善アクションに繋がるかは分からないので、レトロがマンネリ気味で、意見の挙がりが弱くなってきた時にカンフル剤的に用いるのがよいかもしれません。

　[アジャイルプラクティス一覧へ戻る](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)
オブジェクト指向プログラミングの三大要素　「継承」について

:::note
継承は、クラス定義の共通部分を別クラスにまとめて、コードの重複を排除する仕組み。

似たようなクラスの共通部分はまとめて、徹底して合理化、プログラミングを楽にする機能を用意しようという発想。
:::

#### 継承に関する用語の説明

* スーパークラス
    * 共通のクラス
    * 共通で使いたいメソッドとインスタンス変数を定義する
* サブクラス
    * スーパークラスを利用するクラス
    * サブクラスでは、スーパークラスを「継承すること」を宣言する
    * 継承したメソッドの引数や戻り値の型をスーパークラスに合わせる必要がある


---

▼参考

https://bookplus.nikkei.com/atcl/catalog/21/S00180/
PowerShellでPDFの文字を抽出

# 0. 動機
業務中によく使うPDFファイル内部の文字を抽出し、正規表現でパターンを探したり特定の単語を探したり、またそれらの結果を一覧で表示できたりすると業務で色々捗るなと思ったこと。
<br>
ただそもそもPowerShellでデフォルトでPDFを読む手段が無いのでModuleのInstallから取り組んでます。
# 1. 準備1：PSWritePDFモジュールのインストール
ネットで「PowerShell PDF テキスト抽出」と検索してもいまいちピンとくる記事が無かったのでとりあえずPowerShell Galleryへ。
検索窓に"PDF"と入力し、検索結果を「人気(Popularity)」でソートすると最初に出るのがPSWritePDF。ダウンロード数もそれなり(109,900)で信頼性ありそう、概要もPDFのテキスト抽出はできそうなのでひとまずクリック。

※参考：Seleniumの総ダウンロード数は176,716

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/418c651b-c1af-9d8a-4c4a-e85965648c93.png)

ザッと概要を見ると"Convert-PDFToText"というズバリなコマンドもあるので、指示に従いInstall-Moduleコマンドレットでインストール。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/75f9b928-8806-a7b3-0ae4-128202a84dcb.png)

無事にインストール完了。
ただこれは以前Seleniumを落とした時に色々やってるからスムーズにできている可能性があるので、ここでエラーが出てきてしまった場合は過去記事を参照して見てください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/026a2f54-f2e1-b021-c2af-2e43d77f6525.png)

https://qiita.com/_Sasaki_/items/91224e038ae565fb1a83

# 2.準備2：コマンドの確認

コマンド一覧は下記。ひとまずConvert-PDFToTextが気になるのでそれを調べてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/232afa83-dd3e-996e-c182-f4feae00adde.png)

ヘルプを見る限り、-FilePathパラメータでpdfファイルを指定すればとりあえずできそうであることを確認。
他にも-Pageパラメータでページ指定出来たり、-IgnoreProtectionパラメータでで保護されたpdfも読めるとのこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/8522f576-09c1-9837-dacd-2d18a378076d.png)

# 3. 日本語のPDFをテキストファイル化

誰でもアクセスできるPDFをサンプルとして利用するのがいいのかと思ったので、ひとまず下記IPAのデジタルスキル標準の概要をデスクトップに保存。
https://www.ipa.go.jp/jinzai/skill-standard/dss/t6hhco0000011cr5-att/gaiyou.pdf

<br>
カレントディレクトリをDesktopにした状態で下記のワンライナーを実行。
Convert-PDFToTextすれば文字自体は抽出できますが、わかりやすくするために.txtに出力するようにしてます。

```PowerShell
Convert-PDFToText -FilePath "C:\Users\Username\Desktop\デジタルスキル標準_概要編.pdf" | Out-File sample-Japanese.txt
```

抽出結果と元ファイルの比較は下記。
なぜか同じページの内容が2回現れたり、改行が変なところでなされているようなところがあるものの、テキスト自体はしっかり拾ってくれているので分析などには問題無さそうな印象。
ちなみに.txtに表示せずコンソールに表示するとダブりが無かったので、.txtに出力する場合には注意が必要なのかもしれないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/e231f3b6-b128-cc58-b3f2-47482c4b7fbb.png)

# 4. 英語のPDFをテキストファイル化

こちらも同じく誰でもアクセスできるPDFをサンプルとして利用するのがいいのかと思ったので、ひとまず同様にIPA下記資料をデスクトップに保存。
https://www.ipa.go.jp/en/it-talents/skill-standard/gg62ps0000000lem-att/000009630.pdf
<br>
カレントディレクトリをDesktopにした状態で下記のワンライナーを実行。
```PowerShell
 Convert-PDFToText -FilePath "C:\Users\Username\Desktop\ITSS Model Curriculum_IPA_English.pdf" | Out-File sample-English.txt
```

抽出結果と元ファイルの比較は下記。
日本語と同じくなぜか同じページの内容が2回現れるようす。でもテキスト自体はしっかり拾ってくれているので分析などには問題無さそうな印象。また日本語と違って単語の間にスペースがあるので改行位置はそこまで気にならないですね。
ちなみにこちらも.txtに表示せずコンソールに表示するとダブりが無かったです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/10046553-742b-7ad5-00a4-a21b6c8693d9.png)


# 5.おわりに
* 基本自分用のメモですがどなたかの役に立てば幸いです。
* ひとまず自分の想定している用途においてこのModuleがあればどうにかなりそうでした。.txtに出力するとなぜかダブる問題があるのでそこは注意した方がよさそうです。
CloudFormationでEC2にEBSボリュームをアタッチする際に詰まったこと


# AWS::EC2::Instance上でEBSボリュームを定義すると・・・
例えば以下のようにAWS::EC2::Instanceテンプレートで定義したEBSボリュームが
一部不要になったので削除しようとした。

```yaml
EC2Instance:
    Type: "AWS::EC2::Instance"
    Properties:
      ...
      BlockDeviceMappings:
        ## 以下ボリュームをコメントアウトで削除
        # - DeviceName: /dev/sdb
        #   Ebs:
        #     VolumeSize: 30
        #     VolumeType: gp3
        #     DeleteOnTermination: "true"
        #     Encrypted: "true"
        - DeviceName: /dev/sdc
          Ebs:
            VolumeSize: 5
            VolumeType: gp3
            DeleteOnTermination: "true"
            Encrypted: "true"
```

これでスタック更新しようとしたら、ReplacementがTrueになってしまった。


![EBS-replacement.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/d9291378-7808-1b71-322f-32401c42b99e.png)


公式レファレンス見ると、このテンプレートで作成したEBSボリュームに少しでも変更加えると強制的にインスタンスが置き換えられるという罠があった。

> After the instance is running, you can modify only the DeleteOnTermination parameter for the attached volumes without interrupting the instance. Modifying any other parameter results in instance replacement.
>
> https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-instance.html#cfn-ec2-instance-blockdevicemappings


勝手に置き換えられない方法がないかと調べたところ、`AWS::EC2::Volume`という
テンプレートが用意されていた。
[AWS::EC2::Volume](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-volume.html)

これと`AWS::EC2::VolumeAttachment`を使ってEC2にアタッチすると、ボリュームサイズ変更や
ボリューム削除したい場合などに強制置換されずに設定変更を行えそう。

今後は、ボリュームを変更できるように、`AWS::EC2::Volume`で別途定義したほうがよさそう。

# ルートボリューム用EBSをアタッチする場合
EC2作成時、デフォルトでアタッチされたいるルートボリュームは暗号化されていない。
暗号化したかったので、暗号化済みのルートボリューム用EBSを別途作成してEC2にアタッチしようとした。

これも以下のようにCloudFormationテンプレートで作成したアタッチしようとした。

```yaml
  EC2Instance:
    Type: "AWS::EC2::Instance"
  ...
  RootVolume:
    Type: AWS::EC2::Volume
    Properties:
      ...
  RootMountPoint:
    Type: AWS::EC2::VolumeAttachment
    Properties:
      InstanceId: !Ref EC2Instance
      VolumeId: !Ref RootVolume
      Device: /dev/sda1
```

が、ルートボリュームだけ、いつまで経ってもアタッチ完了しない。。。

![rootvol-attaching.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/151c7aa1-b22d-d7c6-3d98-2a4520063053.png)

調べてみたが、原因は判明せず、仕方ないのでChatGPT先生に質問。
すると、ルートボリュームをアタッチしたい場合は、一旦EC2インスタンスを停止する必要があるらしい。

```
[Question]
EC2インスタンス(amazon linux)に作成したEBS /dev/sda1 をルートボリュームとしてアタッチ できないのですが、なぜですか。

[Answer]
Amazon Linux インスタンスにEBSボリュームをルートボリュームとしてアタッチする場合、いくつかの手順や考慮すべきポイントがあります。以下の点を確認してください：
...
インスタンスの停止: インスタンスのルートボリュームを変更するには、インスタンスを停止する必要があります。
...
```

試しにインスタンスを停止してしばらくすると、ルートボリュームがアタッチされた。
![rootvol-attached.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524408/2bae7541-2025-62c7-d2bb-97e9e473e869.png)


また、ルートボリュームとして外付けボリュームを使用する場合は、特定のデバイス名を使用する必要がある。
(OSによって名付け方は異なる)

[Linux インスタンスでのデバイス名](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/device_naming.html)
Xcode iphoneが選択肢に出てこない時

# 開発端末
MacBook Air M2チップ(macos Ventura 13.4)

# 概要
iphoneを選択したいのに、My Macしか選択肢がない人を助けたい

![スクリーンショット 2023-11-02 22.43.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/e897f657-71f1-59a6-cd79-24e475da13ae.png)

# 解決方法
## 画面上部のツールバーから
Xcode→Settingsを選択し、Platformsが以下の通りになっていることを確認する。
![スクリーンショット 2023-11-02 22.48.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/1c6bd248-0da9-bace-fc70-7f4d9b078eac.png)

## トップに戻り、TargetのUnity-iphoneのSupported DesinationsのMac(Designed for iPad)をマイナスで削除
![スクリーンショット 2023-11-02 22.49.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/59d6d90b-1071-1448-dc04-cf8597903c39.png)

## 最後にプラスでDesigned for iPadを追加
![スクリーンショット 2023-11-02 22.50.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/27b91df8-c751-b300-4827-30a64b675417.png)

# iphoneが選択できるようになります
![スクリーンショット 2023-11-02 22.43.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/e897f657-71f1-59a6-cd79-24e475da13ae.png)

以上、お疲れ様でした。
【Swift】CIFilterで画像を古い写真のような見た目にする

# はじめに
CIFilterで画像をセピア色に加工するものがあったので記事にしておきます

# サンプルアプリ
![Simulator Screen Recording - iPhone 15 - 2023-11-02 at 22.42.44.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/f28b61ac-519a-71de-0acd-98119e06eb21.gif)

# 実装
```swift
import SwiftUI

struct ContentView: View {
    private let image = UIImage(named: "sample1")!

    @State private var uiImage: UIImage?

    var body: some View {
        ScrollView {
            VStack {
                if let uiImage {
                    Image(uiImage: uiImage)
                        .resizable()
                        .scaledToFit()
                } else {
                    Image(uiImage: image)
                        .resizable()
                        .scaledToFit()
                }

                HStack(spacing: 15) {
                    Button {
                        applySepiaTone()
                    } label: {
                        Text("適用")
                    }

                    Button {
                        uiImage = nil
                    } label: {
                        Text("リセット")
                    }
                }
            }
            .padding(.horizontal, 20)
        }
    }

    func applySepiaTone() {
        let context = CIContext()
        let inputImage = CIImage(image: image)!

        guard let filter = CIFilter(name: "CISepiaTone", parameters: [
            kCIInputImageKey: inputImage
        ]) else { return }
        guard let outputImage = filter.outputImage else { return }
        guard let cgImage = context.createCGImage(outputImage, from: outputImage.extent) else { return }
        self.uiImage = UIImage(cgImage: cgImage)
    }
}
```

# おわり
めっちゃそれっぽい画像に加工することができました
Pythonでの0割り警告を回避するためのNumPy np.divide()関数の活用法

## はじめに
Pythonでの0割りの警告を回避するために、様々な方法が存在します。例えば、下記の記事が参考になります。

https://qiita.com/isuya/items/8a7297cf6e034d1e8fec

本記事では、numpyの[`divide()`](https://numpy.org/doc/stable/reference/generated/numpy.divide.html)関数を使った回避方法を紹介します。

## 方法
本記事の実装環境は、以下の通りです。

- Python 3.8.1
- numpy 1.23.5

本記事の実装コードはGoogle Colab[こちら](https://colab.research.google.com/drive/1ty_a9hbzmUT15bOgKxb9CSCD-xd8ee4R?usp=sharing)から確認できます。

結論として、`np.divide()`の`where`引数を指定することで、0割りエラーを出さずに表示できます。以下はサンプルコードです。

### NumPy配列での方法
NumPy配列での0割りがある場合の例です。

```python:numpy配列でのサンプル
import numpy as np

a = np.array([1, 2, 3])
b = np.array([10, 10, 0])
zero_div_values = np.zeros_like([0., 0., 0.])

divided = np.divide(a, b, out=zero_div_values, where=(b!=0))

print('a =', a)
print('b =', b)
print('a/b =', divided)
```
```:出力
a = [1 2 3]
b = [10 10  0]
a/b = [0.1 0.2 0. ]
```

コードの説明
1. `zero_div_values`に0割りが発生した場合の値を入れます。
1.  `np.divide()`の`out`引数に`zero_div_values`を入れます。`out`引数に指定した型が戻り値の型になります。割り算なので、**`zero_div_values`の配列は`int`型では使用できません**。
(なお、`out`引数を何も指定しない場合は、`where`条件が`False`の時は`a`値が使われます。)
1. `np.divide()`の`where`引数を使用して、0割りの条件を指定します。`where=(b!=0)`とすると、`b`がゼロでない場合でのみ割り算が実行され、ゼロの場合は`zero_div_value`が使われます。

### Pythonの変数での方法
Pythonの変数を使った場合について説明します。

```python:Pythonの変数でのサンプル
import numpy as np

a = 1
b = 0
zero_div_value = np.array([0.])

divided = np.divide(a, b, out=zero_div_value, where=(b!=0))
divided_val = divided[0]

print('a =', a)
print('b =', b)
print('a/b =', divided_val)
```
```:出力
a = 1
b = 0
a/b = 0.0
```

`out`引数に適当な値を入れる際は、`zero_div_value`にNumPyの配列を使う必要があります。その他は、NumPy配列での例と同様です。

## 補足
なお、`np.where()`を使用する方法でも同様の処理が行えますが、警告が表示される点に留意してください。

```python:np.where()だとwarningが出てしまうコード
import numpy as np

a = np.array([1, 2, 3])
b = np.array([10, 10, 0])

divided = np.where(b != 0, a / b, 0)
```
```:出力
<ipython-input-60-cb56d63d9de7>:7: RuntimeWarning: divide by zero encountered in divide
  divided = np.where(b != 0, a / b, 0)
```

## まとめ
Pythonでの0割り警告を回避するために、NumPyの`np.divide()`関数を使用する方法を紹介しました。

本記事が誰かの役に立てば幸いです。

## 参考資料
https://stackoverflow.com/questions/26248654/how-to-return-0-with-divide-by-zero
Access 365あたりでWizHelpを使うとトップカテゴリが開く

# 以前はAccessの中で作業ウィンドウが開き、chmファイルが開く設定だったが
現在はヘルプファイルがないので空白にする
そうすると、Accessの中で作業ウィンドウが開かず、既定のブラウザが起動し、公式サイトのアクセスのヘルプの一番上、トップカテゴリが開く。

https://support.microsoft.com/ja-jp/office/%E3%83%88%E3%83%83%E3%83%97-%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA-a16dd915-a65a-412a-9836-88fb886d0ed7?lcid=1041&ns=msaccess&version=90&shownav=false&syslcid=1041&uilcid=1041&ui=ja-jp&rs=ja-jp&ad=jp



```vb
Sub OpenWizHookHelp()
'Function WizHelp(HelpFile As String, wCmd As Long, ContextID As Long) As Boolean
' Access 2016以降は 既定のブラウザでアクセスのヘルプのトップページが開く
    WizHook.Key = 51488399
    WizHook.WizHelp "", 0&, 0&
    WizHook.Key = 0
End Sub
```

`0&, 0&`の部分は必ず必要。これがないとエラーになる。
ただし、現在のオフィスはヘルプをクリックすると、作業ウィンドウ内でネットの公式サイトを開く。
しかし、検索ではこのトップカテゴリにはたどり着かないので、作っておく意味がある。
AtCoder初心者 DailyTrainingメモ 2023/11/2

# 参考URL
pythonでの順列全探索
https://qiita.com/wihan23/items/107dfff1ecada60845b1

# ABC225 A-問題
https://atcoder.jp/contests/adt_easy_20231102_1/tasks/abc225_a

問題文
英小文字のみからなる長さ3の文字列Sが与えられます。
Sの各文字を並び替えて得られる文字列は、何種類ありますか？

**ポイント**
・順列全探索は、itertools　を使う
・set で重複を削除する

##### 順列全探索
````Python:225A.py
# 順列全探索は、「itertools」をインポートする
import itertools

# 入力
S = str(input())

# 順列全探索結果をset に格納して重複を削除
ST = set(itertools.permutations(S))

# set の要素数が答え
print(len(ST))
````
##### シンプルな場合分けの解答
````Python:225A_2.py
# リストに入力
L = list(input())

# setに格納して文字数を確認する
st = set(L)

# 文字の種類別に何通りかを場合分けする
if len(st) == 1:
    ans = 1
elif len(st) == 2:
    ans = 3
elif len(st) == 3:
    ans = 6

print(ans)
````
counsel-rg で 2 が返ると一覧が消える問題

counsel-rg はとても便利なので、月に１，２度使うのだが、rg が return 2 を返すと counsel の一覧が消えてしまう。
man rg をすると return 2 が返るのは例えばファイルを読む権限がなかったときとかのようだ。
でも、そんなの気にせずに検索結果を見たいのだ。

https://github.com/doomemacs/doomemacs/issues/3038

ま、上記の通りだが、after! ってなんだ？

ともかく

```emacs-lisp
(with-eval-after-load 'counsel
  (advice-add 'counsel-rg
              :around
              (lambda (func &rest args)
                (cl-flet ((filter-func (code) (if (= code 2) 0 code)))
                  (unwind-protect
                      (progn (advice-add 'process-exit-status :filter-return #'filter-func)
                             (apply func args))
                    (advice-remove 'process-exit-status #'filter-func))))))
```

を use-package counsel のあとでやってやれば解決。 2 のときに 0 を返してくれるので、一覧は消えない。

after! がなにかわからなかったが、これは doomemacs の人はどっかで定義されててつかえる function なんだろうか？
Next.js の devサーバーが起動しない問題

next.jsのdevサーバーが起動しなくなったのでメモ。

### 【追記】
`node:21.7` で問題が解消することを確認。


## devサーバーが動かない （起動後すぐに終了する）
- **docker環境** のnext.jsでdevサーバーが動かなくなった。
- ローカルのmacでも、リモートのubuntuでも同じ現象が発生する。
- `yarn dev` `npm run dev` で正常に起動する。
- 起動して数秒すると自動的に終了する。
- エラーメッセージは無い

```bash
yarn run v1.22.19
$ next dev
next_1  | ready - started server on 0.0.0.0:3000, url: http://localhost:3000
next_1  | 
Done in 8.66s.
```

## node や next.js のバージョン変更は効果無し
- nodeのバージョンを19から20へ変えてみたけど効果無し
- next.jsのバージョン13から14へ変えてみたけど効果無し

## Dockerのバージョンを落として解決
- macでは、Docker Desktopを 4.24.2 → 4.18.0 へダウングレードすると解決した。
- ubuntuでは 24.0.7 → 20.10.24 へダウングレードすると解決した。
- それぞれ、中間のバージョンは試していないので、どこが閾値なのかは不明

dockerをアップデートすると何かが動かなくなるの、ありがちで困る。

### 他の原因もあるらしい
nodeがなぜか32bit版になっていて、それが原因で同じ現象が起きることもあるらしい
https://github.com/vercel/next.js/issues/47510
【Xcode】ファイル作成時のヘッダーコメントが邪魔なので消してやる

XcodeでSwiftファイル作成時に、上部にこんなヘッダーコメントが勝手に生成されると思います

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633746/6dd7c6d6-3074-f559-1ebd-0e5ee67ff8e5.png)

こういうやつです
これを消す作業から毎回コーディングが始まるので萎えます
とても邪魔なので今から消してやろうと思います

# Xcodeの設定ファイルを変更する

変更するファイルはこのディレクトリにあります

    /Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File Templates/MultiPlatform/Source/Swift File.xctemplate/

ここに `___FILEBASENAME___.swift` というファイルがあると思うので
**テキストエディット** で開きます
※Xcodeで開くと書き込み不可で編集できないと思います

::: note 
Xcodeはファイルテンプレートという概念があって、ファイル作成時に色々なテンプレートを選んで作成することができています。お馴染みのこの画面のファイル群はその設定ファイルの元に存在していたんです。邪魔と言いつつも、これの存在には結構助けられています。

そして、設定ファイルがあるということは既存のテンプレートの編集、オリジナルのテンプレートを作成できるわけです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633746/05fe5b9e-1df5-3105-2583-f090ca4e3ef4.png)

:::

開くとこんな感じになっているかと思います

```:___FILEBASENAME___.swift
___FILEBASENAME___.swift
SPMProject

Created by ___USERNAME___ on ___DATE___.


import Foundation
```

これが邪魔なヘッダーコメントの正体です。
import文だけ残して、いらないものは消して保存します

```:___FILEBASENAME___.swift
import Foundation
```
これでOKです
Xcodeでファイルを作成してみましょう！

# そして幸せになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633746/0ef2f63a-727a-4c93-c427-93369f8c3c84.png)
うん、ハッピー

※変わらない人はXcode再起動してみてください

# おわりに
もっと早くやればよかった
【Android Studio】メモリリーク調査方法

# はじめに
メモリリークが起きているかどうかを調べる方法について記述。

# 調査方法
#### 1. ProfilerのMEMORYを開く
![1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/a8415acb-4178-9538-d034-2c851167255c.png)

#### 2. Capture heap dumpを選択し、Recordボタンをクリック
![2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/6458df13-b293-ae85-9e4e-91ed4e8af112.png)

#### 3. Leaksをクリック
![3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/846227ad-19b1-065f-bc1a-5cb9cf9bc5bb.png)



# 参考サイト
意図的にメモリリークを起こすのに参考にしたサイト

https://zenn.dev/kseito/articles/android-memory-leak

メモリリーク内容の解析を参考にしたサイト

http://android.develga.com/2018/02/android-studio.html
【Kotlin/Gson】jsonパース時に末尾位置でエラー

# はじめに
jsonパース時に末尾位置での`JsonSyntaxException`エラー対処方法について記述。

# 原因
末尾に`NUL(\0)`文字があることでエラーが発生。

```Kotlin
fun main() {
	//Webから取得したjson文字列
	val json = "{ \"value\":\"hoge\" }\u0000"

	//パース時にエラー発生
	val testClass = Gson().fromJson(json, TestClass::class.java)
 
	println("[Test]value:" + testClass.value)
}

class TestClass {
	var value: String? = null
}
```

# 対策
## 対策1: Javaのtrimメソッドで`NUL(\0)`文字を削除
json文字列をjava.lang.Stringに変換し、trimメソッドを使用することで`NUL(\0)`文字が削除される。Kotlinのtrimメソッドだと`NUL(\0)`文字が削除されないので注意。

```Kotlin
	fun main() {
		//Webから取得したjson文字列
		val json = "{ \"value\":\"hoge\" }\u0000"

		//JavaのStringに変換してtrim
		val testClass = Gson().fromJson(java.lang.String(json).trim(), TestClass::class.java)

		println("[Test]value:" + testClass.value)
	}
```

## 対策2: trim { it == Char.MIN_VALUE }で`NUL(\0)`文字を削除
trim { it == Char.MIN_VALUE }で`NUL(\0)`文字を削除。

```Kotlin
	fun main() {
		//Webから取得したjson文字列
		val json = "{ \"value\":\"hoge\" }\u0000"

		//trimでNULを削除
		val testClass = Gson().fromJson(json.trim { it == Char.MIN_VALUE }, TestClass::class.java)

		println("[Test]value:" + testClass.value)
	}
```

# 補足
stackoverflowにはGsonに`Lenient`をセットする対策法もあったが、私の環境では改善しなかった。

# 参考記事
https://yamataka.hatenablog.com/entry/2014/10/16/130336

https://stackoverflow.com/questions/11484353/gson-throws-malformedjsonexception

https://youtrack.jetbrains.com/issue/KT-45942/trim-function-does-not-remove-u0000-aka-NULL
ゆるゆる受験感想 GIAC Security Essentials certification（GSEC）

:::note info
この記事の中身
・この試験のものすごく大まかな内容
・筆者の行った勉強法

:::

弊社は教育に力を入れており、やる気がある人にはとてもありがたい会社です。
自分も2年間所属した中で、数か月の外部研修や様々なベンダ資格のトレーニングに参加させていただきました。

今回は2023年2月27日(月)～3月4日(土)の6日間、東京でGIACの研修を受講させていただいたお話について書こうかと思います。

その当時に受けられる研修は他にいくつかあったのですが、GSECを選んだ理由は主に２つです。
- NTTグループの人事制度の変更で資格が必須になった（他のGIAC資格は対象外）
- 日本語で講義をしてくれる

## 目次
- [試験の内容](#試験の内容)
- [試験の特徴](#試験の特徴)
- [学習方法](#学習方法)
- [受験後の所感](#受験後の所感)
- [今後の学習について](#今後の学習について)

## 試験の内容
**SECURITY 401 Security Essentials: Network, Endpoint, and Cloud**という名前の通りの問題が出てきます。ハンズオンでは攻撃ツールの紹介もありますが、基本的には防御に必要な基本知識の詰め合わせセットといった印象です。

具体的な内容は公式サイトを見たほうが分かりやすので、そちらをどうぞ。
6日間でのスケジュールやハンズオンの内容まで書いてくれています。

https://www.sans-japan.jp/courses/sans_secure_japan_2023/sec401

## 試験の特徴
試験の特徴は以下の3つがあげられると思います。
- 試験はすべて英語
- 教科書と自分で作成したノートの持ち込みが可能
- ほとんどは選択式、最後のほうにハンズオン形式の問題がある

## 学習方法
配布されたトレーニングの音声を聞きながら出社したり散歩したりしていました。
二週間もしないうちに大まかな話の流れが頭に入ってきて、そこから教科書を見ながらカンペを作成しました。自分は小心者なのでカンペは分からないところだけではなく、網羅的に取っていました。実際に役に立ったので自分はこれでよかったと思います。

また2回の模擬試験を受けることができるのですが、こちらは非常に役に立ったと思います。特に後半にハンズオンが出てくるのですが、トレーニングとほぼ同じ内容で模擬試験にも本試験にもほぼそのまま出てくるので得点源にしやすいと思います。

## 受験後の所感
日本語でトレーニングを受けても結局は英語で受験する必要が出てくるので、英語力にあまり自信のない自分には言語の壁のほうが高かったなと感じました。
特に一度覚えた言葉を英語で再度覚えなおすことが非常にめんどくさかったです。もし他のコースも評価対象資格になるのなら最初から同時翻訳の別コースでも良かったかなとも思います。


## 今後の学習について
自分の興味もあり、これからは知識系の資格よりも技術系の資格を勉強しようと考えています。

自学でHackTheBoxやHTB Academyをやってはいたのですが、自分の英語力の問題か微妙にニュアンスがわかりにくいこともあり、TryHackMeを始めてみました。嬉しかったのは以下の4点です。


- ブラウザの翻訳機能が使いやすい
(HTB Academyだとブラウザの翻訳機能使うと<font color="Green">大事な所を表す緑文字</font>の部分で妙な翻訳になってしまいます)
- 解説が付いているので比較的詰まりづらい
- 連続学習記録を切らさないためにリマインドのメールが来る
- GitHubみたいに草を生やしてくれる


とりあえず自分に合っていると感じたので自腹で一年分のサブスクを買いました。
これからはOSCPを目指してレッド系の学習を続けていこうと思います。

![スクリーンショット 2023-11-01 224341.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588702/7c396402-cf61-1559-a8fd-975a7df40139.png)


<font color="Lavender">ただ自分は夏の異動でセキュリティどころか技術とはほぼ無縁の部署になったため、役に立つかと聞かれると非常に厳しいのが残念ですね・・・</font>
dockerの起動の備忘録

研究でdockerを使用する際に使うコマンドをまとめる

起動する
```
sudo service docker start
```
停止する
```
sudo service docker stop
```
ノードを立ち上げる
```
docker compose up -d
```
ログを見る
```
docker compose logs -f hornet
```
ノードを停止する
```
docker compose down
```
【JavaScript・学習ログ4】DOM操作について


　<font color=gray>教材:侍テラコヤ『JavaScriptの基礎を学ぼう』https://terakoya.sejuku.net/programs/60/chapters</font>

## DOMの基本

HTMLドキュメントをオブジェクトのように扱える仕組みのこと。
JavaScriptからHTMLを操作できる。
```javascript
// Documentオブジェクトを使用し、HTMLにアクセスする。
console.log(document.head); //headを呼び出し
console.log(document.body); //bodyを呼び出し
```
documentの１つ上の階層はwindowオブジェクトで、さまざまなオブジェクトやメソッドがこれに含まれる。

## 要素の取得
### (1) getElementById()
HTML要素をIDで取得する。
同じidの複数設定はできない。
![スクリーンショット 2023-10-25 210453.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/35b7e323-064e-18dd-90f4-03b63ab05d61.png)
【出力】
```javascript
console.log(document.getElementById('first-list'));
```

### (2) getElementByClassName()
HTML要素をクラスで取得する。
idとは違い複数のHTML要素に設定できる。
![スクリーンショット 2023-10-29 130445.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/83f4edbc-68bf-c1c2-d227-d81edc52fad9.png)
【出力】
```javascript
console.log(document.getElementsByClassName('heading'));
```
※またforループで複数の要素を１つずつ取り出すことも可能。
```javascript
// 複数の要素を定数に代入
const headings = document.getElementsByClassName('heading');
// 複数の要素を１つずつ取り出し出力
for (let i = 0; i < headings.length; i++) {
	console.log(headings[i]);
}
```
### (3)quarySelector()
HTML要素をCSSセレクタ（.や#）で取得する。※最初に合致した要素のみ取得ｑ
```javascript
console.log(document.querySelector('h1'));
console.log(document.querySelector('#second-heading'));
console.log(document.querySelector('.list'));
```
### (4)quarySelectorAll()
HTML要素をCSSセレクタで取得する。※合致した要素すべて取得
```javascript
console.log(document.querySelectorAll('.heading'));
console.log(document.querySelectorAll('li'));
```
## 要素の追加
### (1)createElement()メソッド
HTML要素を新しく作成する。引数には追加したい要素名を記述。

### (2)textContent / innerHTMLプロパティ
HTMLに追加した文字列（HTMLタグ）をプロパティに代入。
・textContent 文字列
・innerHTML 文字列とHTMLタグ

### (3)appendChild()メソッド
追加した要素を子要素として末尾に追加する。
```javascript
// li要素を新しく作成
const li = document.createElement('li');
// 要素に値を代入
li.textContent = '新しく作成したリスト';
// ul要素の末尾に子要素としてliを追加
document.querySelector('ul').appendChild(li);
```
【追加前】
![スクリーンショット 2023-11-02 201516.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/907a71dd-a100-0374-56b9-17466fd83ef3.png)

【追加後】
![スクリーンショット 2023-11-02 201220.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/a563e933-66d2-f337-ec72-1b9a5caaf6d6.png)


<hr>

(まとめ)
- getで取得、queryでCSS指定して取得
- createで要素作成
- textContent 文字列、innerHTML 文字列とタグ
- appendChild 子要素として追加する
HTTPプロトコルのGET、POST、PUT

`GET`、`POST`、および `PUT` は、HTTPプロトコルで定義されているメソッドで、クライアントがサーバーと通信するための異なるアクションを表します。これらは、特にウェブAPIのコンテキストでよく使われます。

### GET
`GET`メソッドは、指定されたリソースからデータを取得するために使用されます。このメソッドはデータを「読み取る」ためのもので、データを変更しない「安全な」操作と見なされます。例えば、ユーザー情報や記事のリストなど、読み取り専用のアクセスに`GET`メソッドが使われます。

### POST
`POST`メソッドは、新しいデータをサーバーに送信してリソースを作成するために使用されます。たとえば、新しいユーザーの登録やブログ記事の投稿など、サーバーの状態を変更する操作に用いられます。`POST`はデータを「書き込む」操作であり、一般的には一度の`POST`リクエストでサーバー上に新しいデータが作成されます。

### PUT
`PUT`メソッドは、指定されたリソースを更新するために使用されます。これは、サーバー上の既存のリソースを置き換えるために使用され、`POST`と違い、`PUT`は冪等性を持ちます。つまり、同じ`PUT`リクエストを何度実行しても、最初の1回を除き、追加の効果はないという特性があります。`PUT`はリソース全体を更新するのに適しており、部分的な更新ではなく、リソース全体をクライアントが提供する新しい状態に置き換えるときに使用されます。

### 使い分け
- `GET`はデータの取得に使用し、サーバーの状態を変更しません。
- `POST`は新しいデータを作成する場合や、サーバーの状態を変更する一般的な方法として使用します。
- `PUT`は既存のデータを更新する場合に使用し、同じリクエストを何度行っても結果が変わらない冪等性を持っています。

これらのメソッドを使い分けることで、APIが機能に応じた適切な意図を持つことができ、APIを利用するクライアント側も期待される動作を理解しやすくなります。また、これらのメソッドはRESTfulなAPI設計の基本原則であり、ウェブアプリケーションやサービス間での標準的なデータ交換手段として広く採用されています。
Aurora Serverless v1とv2のACUの考え方の違い

# はじめに
Aurora serverlessはv1からv2になりました。
容量に関するAurora 容量ユニット (ACU) の考え方が変わったようなので
高額請求とならないためのナレッジとして本記事に記載いたします。

# Aurora serverlessとは
Amazon Auroraとは、Amazon RDS（Relational Database Service）のデータベースエンジンの1つであり、serverlessはアプリケーションのニーズに応じてコンピューティング性能を変更してくれます。
v1：[v1について詳しく](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v1.how-it-works.html)
v2：[v2について詳しく](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.how-it-works.html)

# 変更ポイント
先日v2を起動してサービスの検証をしていたのですが、休日をまたぐと想定以上の請求になっておりました。オートスケーリングの考え方が変わったようですのでその点について記載いたします。
Aurora Serverless v1 DB クラスターにアクティブな接続がない場合、容量ゼロ (0 ACU) にスケールダウンできます→詳しくは[こちら](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v1.how-it-works.html#aurora-serverless.how-it-works.pause-resume)
しかしv2だと0.5 ACUにてスケーリングされるようです→詳しくは[こちら](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.setting-capacity.html#aurora-serverless-v2.min_capacity_considerations)

以下イメージ図です。
v1は利用状況に応じてACU0に自動でスケーリングしてくれましたが、v2だと最低でも0.5ACU分の容量は必要で、料金が発生し続けてしまうようです。
※データは図を作成するためにテストデータを使用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/1fc057cc-dbda-1eae-bc35-bf7d5f0b64df.png)

また、RDSは停止していても7日経過すると自動で起動するなど、料金に直接関わる仕様があるので注意する必要があると思います。

# さいごに
今回のように仕様理解不足が、高額請求につながることは少なくありません。
改めて気をつけていきたい思いと同時に、みなさまの業務の一助となれていましたら幸いに思います。
routeの分割について

## 前置き
初学者です。
調べながらコードを書くことが大半な自分ですが、「理解も大切だけど手を動かして指に覚えこませることも重要」と考えているので、2、3分で確認しきれることを念頭に書いています。
執筆する時もスピード重視なので、かなり崩して書いています。
知識も虫食い状に習得していると自覚しているので、それおかしいぞという部分があれば、ご指摘いただけますと幸いです。

## routeファイルの分割
routeを一つのファイルにまとめる→routeがいっぱいになって可読性が最悪
⇒じゃあrouteをわかりやすい名前のファイルでわけて、すっきりさせちゃえばいいじゃない
　\\\　routeファイルの分割　//

## やり方
①
`app/routes`配下にファイルを作る。
routeファイルを作るコードは知らんので手作業でえっちらおっちら
routeファイルにcontrollerファイルをuse。

※webとapiでファイルをわけること。
　ファイルは名前を見ただけで何をやってるのかどういった役割を持っているのかわかるようにしよう。

例）
``` php
// ここはapp/routes/api-Uryy.phpファイル

use App\Http\Controllers\Api\UryyController;

// 下にRouteがたくさん
```

②
作ったrouteファイルをlaravelに登録する。
ファイルを作るだけだとlaravelはそのファイルをrouteと認識しないんだと思う。悲しい😢
　→作る場所：`app/Providers/RouteServiceProvider`

bootメソッドの中の`$this->routes(function (){ここに①で作ったファイルを書いて登録する});`

例
``` php
public function boot()
{
    $this->routes(function () {
        Route::middleware([`api やら web やら`])
        // そのrouteは何なのかここで明示してあげる
            ->prefix('hoge')
            // routeファイルで設定したprefixの前にくる
            ->name('hoge')
            // routeファイルで設定したnameの前にくる
            ->group(base_path('routes/api-Uryy.php');
            // ここで登録するrouteファイルのパスを指定。useみたいだなと感慨。
            // base_pathはパスを返すヘルパって翻訳公式に書いてあった。
    });
}
```

## おわり
この2つの手順でrouteが分割できる。
とってもらくちん。

## 参考サイト　ありがとうございます
[翻訳公式](URL "https://readouble.com/laravel/10.x/ja/routing.html")

[base_pathヘルパについて](URL "https://readouble.com/laravel/10.x/ja/helpers.html?header=base_path()%60%2520%7B.collection-method%7D")
baseをbashとこの記事を書くまで勘違いしていたのはまた別の話

[[Laravel]ルーティングファイルを分割して管理する](URL "https://qiita.com/hiro5963/items/5e533fe014f29f636a3d")
大変ありがとうございました。
Djangoの学習④（ビューとテンプレートの追加）

## ビューを追加する


ビューは、Django のアプリケーションにおいて特定の機能を提供する
ウェブページの「型 (type)」であり、各々のテンプレートを持っています。

追加するviewを polls/views.py に記述します

```python:polls/views.py
def detail(request, question_id):
    return HttpResponse("You're looking at question %s." % question_id)

def results(request, question_id):
    response = "You're looking at the results of question %s."
    return HttpResponse(response % question_id)

def vote(request, question_id):
    return HttpResponse("You're voting on question %s." % question_id)
```

追加した新しいviewを polls.urls モジュールと結びつけます。

```python:polls/urls.py
urlpatterns = [
    # ex: /polls/
    path("", views.index, name="index"),
    # ex: /polls/5/
    path("<int:question_id>/", views.detail, name="detail"),
    # ex: /polls/5/results/
    path("<int:question_id>/results/", views.results, name="results"),
    # ex: /polls/5/vote/
    path("<int:question_id>/vote/", views.vote, name="vote"),
]
```




試しに
http://127.0.0.1/:8000/polls/34/
にアクセスしてみてみます

「You're looking at question 34.」
と表示されれば成功です

以下、２つも確認します
http://127.0.0.1/:8000/polls/34/results/
「You're looking at the results of question 34.」
http://127.0.0.1/:8000/polls/34/vote/
「You're voting on question 34.」



## 実際に動作するビューを書く



各ビューには二つの役割があります:
一つはリクエストされたページのコンテンツを含む HttpResponse オブジェクトを返すこと、
もう一つは Http404 のような例外の送出です。


polls/indexビューは既にありますが
味気ないテキストを表示するだけの状態なので
ビューに下記を追記し更新します

```python:polls/views.py
from django.template import loader
from .models import Question
# Create your views here.
def index(request):
    latest_question_list = Question.objects.order_by("-pub_date")[:5]
    template = loader.get_template("polls/index.html")
    context = {
        "latest_question_list": latest_question_list,
    }
    return HttpResponse(template.render(context, request))
```


次にビューのテンプレートを作成します。
polls ディレクトリの中に、 
templates ディレクトリを作成します。 Django はそこからテンプレートを探します。

先ほど作成した templates ディレクトリ内で polls というディレクトリを作成し、
さらにその中に index.html というファイルを作成します。
つまり、テンプレートは polls/templates/polls/index.html に書く必要があります。



```html:polls/templates/polls/index.html

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

```


ブラウザで "/polls/" を開くと、作成したQuestionの箇条書きのリストが表示されるはずです。
Arduino nano（互換機）とWindowsPCの接続

# 概要

・Arduino nono互換機を入手。
・WindowsPCに接続してスケッチを書き込めるように設定。

# 使用機材

・Arduino Nano（互換）
　合同会社テクノアルタエンジン　小型Arduino互換基板CHIBIKKO

https://www.technoaltaeng.com/chibikko

・WindowsPC
　適当に。

# 接続

WindowsPCとArduino（互換機）を接続する。
インタフェースはUSB Micro-B。

# 環境設定

WindowsPCにArduinoIDEをインストールする。
IDE1をインストール。

https://docs.arduino.cc/software/ide-v1

IDEの環境設定については、上記製品リンク先のとおりすればok。
実は最初IDE2で始めたのだが、ボード設定をインストールできず。しばらく悩んでIDE1にしたらできた。

ちなみに上記リンクにあるのは以下の内容。
・ボードのURL　
　​http://drazzy.com/package_drazzy.com_index.json
・ボードマネージャで「megaTinyCore」をインストール。
・ツール/ボードから「ATtiny3126/1616/1606/806/406 w/Optiboot」を選択。
・Chipは「ATtiny1616」を選択。

ポートはUSBケーブルを抜き差しして現れるポート名を選択。

さて、CHIBIKKOにはボード上にLEDがないので、外部接続しないと動作チェックができない。
Grove端子がついてるので、ここに何か接続するのが簡単。
画像の向きだと、上から「14番ピン」「10番ピン」「5V」「GND」なので、14番ピンからLEDのプラスへ、GNDからマイナスへ接続。
![nano.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570928/d72809f8-54a2-84c5-491d-c4805b2d200a.jpeg)

# 書き込み

Arduino IDEを起動し、スケッチをArduinoに書き込む。
ファイル/スケッチ例（Examples）にサンプルスケッチがあるので、「01.Basic」の「Blink」を選択。
「Blink」はボード上のLEDを点滅させるプログラムなので、少し修正を加える。
書き込みボタンをクリックし、書き込み完了すれば成功。

グレー部分はコメントなので、必要な部分は以下のとおり。

~~~:Blink.ino
void setup() {
  pinMode(14, OUTPUT);
}

void loop() {
  digitalWrite(14, HIGH);
  delay(1000);
  digitalWrite(14, LOW);
  delay(1000);
}
~~~

1行目「void setup() {」と3行目の「}」はセットで毎回書く。
意味は起動時に1回だけ処理する。
2行目はボードのインタフェースを入力に使うか出力に使うかを指定。
サンプルでは「LED_BUILTIN, OUTPUT」となっているが、「LED_BUILTIN」はボード上のLEDで、ピン番号では13番なので、「14」に変更。

5行目「void loop() {」と10行目の「}」もセットで必要に応じて書く。
意味は無限ループ。
6行目　14番ピンに5vを出力。（LED点灯）
7行目　1000ms待機。
8行目　14番ピンに0vを出力。（LED消灯）
9行目　1000ms待機

待機秒数を書き換えて再度書き込みし、想定通りに点滅したらチェック完了。
【VB.NET】Formのオプションについて

## きっかけ
フォームのオプションをいじってからデバッグすると、フォームのサイズを自由に調整できなくなった。
オプションがどんな機能か理解するために、メモがてらまとめる。

## Formに関するオプション
### AutoMode
- False 
　コントロールのサイズに応じてフォームのサイズが変わらない。
 　※コントロール…LabelやTextBoxなどのこと
- True
　コントロールのサイズに応じてフォームのサイズが変わる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/f28b9526-f824-0f0e-8f13-485561654db9.png)

 ### AutoSizeMode
 - GrowOnly
　フォームの端にカーソルを合わせるとフォームのサイズを変更できる。
 - GrowAndShrink
　フォームの端にカーソルを合わせてもフォームのサイズを変更できない。

 ## 感想
 フォームのサイズを調整できなくなったのは、AutoSizeModeをGrowAndShrinkにしたせいだった。
 フォームのサイズに応じてコントロールのサイズも拡大縮小したいが、試しにやってみるとうまく動作しない。
 AutoSizeModeをGrowOnlyにすると、フォームを拡大できても縮小できない。
 AutoSizeModeをGrowAndShrinkにすると、フォームを拡大縮小できないので確認できない。
コントロールのAnchorの設定を勉強しなければ。。。

 ## 参考サイト
 https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.autosizemode?view=windowsdesktop-7.0