OmniAICreator/Qiita-1.07M huggingface dataset:
Arduino IDEでコードの配置を変更し、見たいコードだけを表示する

# 概要
Arduino IDEで開発しているときにコードが増えてくるとタブが大量に開かれ、気になっていました。
コードの配置を変更し、見たいコードだけをArduino IDEのタブに表示するようにしました。
その方法の共有です。

# 修正前の状態
コードが増えて気になっているときの状況をスクショしました。

下図はエクスプローラーのリスト表示です。
*.inoファイルと同じ階層にコードを配置しています。
![code_list_before.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/889e8481-c61c-3e7f-253b-fbb52bc96a19.jpeg)


下図はArduino IDEでの表示です。
多数のタブが表示されています。全ファイルがタブ表示できないため目的のファイルのタブがない場合は右側の3点ボタン（...）を押下し、目的のファイルを選択・表示する必要があります。
コードのタブが多く表示されていると個人的に落ち着かない、気になります。

![arduino_before.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/954b91ef-ef1e-bb4a-8638-a09581885b41.jpeg)


# 修正後の状態
Arduino IDEで見たいコードをだけを表示するように変更したときの状況をスクショしました。
src -> ntshellディレクトリを作成しコードをその中に配置するようにしました。
src -> ntshellディレクトリの中に配置していないコードがアプリケーションのメイン機能です。

![code_list_after.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/caacbee0-227a-912a-5026-cc8fb79372d5.jpeg)

Arduino IDEではsrc -> ntshellディレクトリに格納されている以外のコード2つがタブ表示されています。
見たいコードだけをタブ表示し、修正前と比べてスッキリし快適な見た目になりました。
![arduino_after.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171866/02a6f2cf-2fb2-a7cd-866c-2a6b3a7b57c1.jpeg)


# 対応内容
Arduino IDEにタブ表示したくないコードをsrcディレクトリ以下に移動しました。
この対応はWebで見たつぎの情報を参考にしました。

* [Arduino開発、ファイルを分割してC/C++で書く、VSCode](https://qiita.com/somehiro/items/6a6d954be159b6a5fccd)

* @matsujirushiさんに教えていただきました。

https://x.com/matsujirushi12/status/1724212585426526284?s=20


こちらの[Sketch specification](https://arduino.github.io/arduino-cli/0.27/sketch-specification/#src-subfolder)につぎの一文があります。

> In Arduino IDE 1.6.10 and newer, recursive compilation is limited to the src subfolder of the sketch folder.

DeepL翻訳:
Arduino IDE 1.6.10以降では、再帰コンパイルはsketchフォルダのsrcサブフォルダに制限されています。

開発中にコードが増えてきて見辛くなってきた場合は、つぎの対応をすると良さそうです。

* srcディレクトリを作成しコードを移動する
* ライブラリ化する。


最後まで読んでいただきありがとうございました。
#Javascript #プログラミング # #twitch の配信カテゴリを設定しやすくする #Chrome 拡張機能

**本内容を利用した場合の一切の責任を私は負いません。**

# 機能
タイトル通り。
配信マネージャーでカテゴリを設定できるが履歴機能がなく、都度入力が必要になる。
(カテゴリごとにレイアウトを作るのは大げさ。)
そのページ内で簡単に入力したい。
この拡張機能は、左下のセレクタを選択すると該当カテゴリがクリップボードにコピーされる。

![LCWP2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397476/865c087d-35ee-c3e3-f160-006571ce1b46.png)

# バージョン
* OS
OS 名:Microsoft Windows 10 Home
OS バージョン:10.0.19045 N/A ビルド 19045
システムの種類:x64-based PC

* Chrome:バージョン: バージョン: 121.0.6167.140（Official Build） （64 ビット）

# 準備
1. 下記のリポジトリをダウンロード
[https://github.com/github895439/LCWP](https://github.com/github895439/LCWP)

1. ダウンロードしたものを展開

1. Chromeの拡張機能を表示
Chromeの拡張機能の一覧が表示される。

1. 右上のデベロッパーモードをON
「パッケージ化されていない拡張機能を読み込む」ボタンが表示される。

1. 「パッケージ化されていない拡張機能を読み込む」で展開したトップフォルダ(LCWP)を指定して読み込み
Chromeの拡張機能の一覧に本拡張機能が表示される。

# 使い方
1. twitchの配信マネージャー表示
ダッシュボードのサイドバーの配信マネージャーを選択するのはダメ。
それは最初からの読み込みにはならないため。
右クリックメニューで「新しいタブで開く」等。
表示すると、左バーの下にカテゴリ選択のセレクタが表示される。
(左バーが閉じていると動作しない。
開いた状態で一旦表示を閉じて開きなおせば開きが維持され、動作する。)

1. セレクタでカテゴリを選択
表示されている通り、選択した時点でクリップボードにカテゴリがコピーされる。

1. カテゴリ入力にペースト

# 補足
ソースを見ればわかるように、いじれば任意のカテゴリ一覧にできます。
配信マネージャーを最初から開かせるのは、拡張機能をそのURLに対応させていることと、あまり有効範囲が広くなり過ぎないようにするため。

# 主な履歴
2024/02/03　Tweetボタン追加
【MySQL】照合順序の不一致で「IntegrityError: (1215, 'Cannot add foreign key constraint')」エラーが発生した

# 概要

Djangoでマイグレーションを実施したら以下のエラーになりました。

```
MySQLdb._exceptions.IntegrityError: (1215, 'Cannot add foreign key constraint')
```

phpmyadminからSQLで実行してみても以下のエラーです。

```
MySQL のメッセージ: ドキュメント

#1215 - 外部キー制約を追加できません。
```

こちらのエラーを解決できたので、原因と対応法を紹介します。

# 考えられる主な原因
エラーメッセージは、MySQLが「外部キー制約を追加できない」と言っています。
一般的にありうるのは以下あたりだと思います。

- 参照されるテーブルまたはカラムが存在しない。
- 参照するカラムと参照されるカラムのデータ型が一致していない。
- 参照されるカラムが一意（ユニーク）でない = 一意性を持つインデックス（主キーまたは一意キー）になっていない。
- 参照されるテーブルの既存データが新たに設定しようとしている外部キー制約に違反する。
- （外部キー制約を追加するカラムがNULLを許容していない場合に）NULLを含むカラムを参照しようとしている

ググってみても、「データ型の不一致」「一意（ユニーク）でない」といった原因のものが大半。
しかしこれらは確認しましたが、問題ありませんでした。

何が原因なのだ...うぅむ。

# 答えは...照合順序の不一致だった

原因は、DBの「照合順序（collation）」にありました。
照合順序は、文字列の比較やソートの方法を決定する規則のこと。大文字小文字を区別する、しない、とかです。

MySQLでは、外部キーとして設定しようとしているカラムと、参照先のカラムの照合順序が一致していなければ外部キー制約の追加を拒否されるのです。

MYSQLのドキュメントにもちゃんと書いてあります。

> 外部キー内の対応するカラムと、参照されるキーは同様のデータ型を持っている必要があります。 「INTEGER や DECIMAL などの固定精度タイプのサイズと符号は同じである必要があります」。 文字列型の長さが同じである必要はありません。 バイナリ以外の (文字の) 文字列カラムの場合、文字セットと照合順序が同じである必要があります。
> 引用元：[13.1.20.5 FOREIGN KEY の制約](https://dev.mysql.com/doc/refman/8.0/ja/create-table-foreign-keys.html)

よくよく確認すると、phpmyadminでDBを作る時、プルダウンメニューのデフォルトで`utf8_unicode_ci`が選ばれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/02b27ab1-5159-6ca2-be57-155859ab5928.png)

この状態で、DUMPされたSQLをインポートしたのですが、このDUMP元のDBの照合順序は`utf8_general_ci`だったのです。mysqlのデフォルトは`utf8_general_ci`なので、phpmyadminでのデフォルト（というかプルダウンで選択できるけど最初に選択されているものという意味）と一致していなかったのです...。

すると、マイグレーション時には、外部キーとして設定しようとしているカラムは`utf8_unicode_ci`であるのに、参照先のカラム（DUMP元にあったテーブルのカラム）は`utf8_general_ci`であるので、ここで不一致＝`'Cannot add foreign key constraint'`エラーになったのです。

とほほ...。

phpmyadminでサクッとデータベース作ってDUMP取り込んでいましたが、次回からはちゃんと照合順序を確認しようという教訓になりました。

## 補足
- `utf8_general_ci`: 非常に基本的なUnicodeの比較ルールを使用。ひらがなカタカナの区別や英字の大文字小文字が区別ができるので、パフォーマンスは高いといえる。「レガシー照合」とか呼ばれているらしい。
    ＝　正確性を重視！
- `utf8_unicode_ci`: Unicodeの比較アルゴリズムを使用。これにより、特定の言語の特殊な規則をより正確に反映することはできるが、`utf8_general_ci`よりもパフォーマンスは若干低い可能性があるとのこと（例：英字の大文字小文字が区別されない）。
    ＝　速度を重視！
- こちらの記事に詳細が書かされていますのでご参考に：[【MySQL】照合順序とは？](https://qiita.com/kazu56/items/6af85ffcf8d3954455ad)

## 参考記事
- [外部キーを追加できない問題を解決：Cannot add foreign key constraint](https://pzgleaner.com/archives/cannot-add-foreign-key-constraint)
- あと、`charset`の不一致でも同様のエラーになるという記事もありました
    - [MySQLで外部キーが貼れない原因とCharsetについて](https://rinoguchi.net/2022/05/mysql_foreign_key_charset.html)
EC2のIPアドレス変わってSSHできなくなるの面倒じゃない？

AWSでEC2を運用しているときに
ちょっと内部で確認したいだけだからIP直アクセスでいいや～
と起動されたEC2インスタンスで意外と消されずに稼働する場合ってありません？

そして再起動などでPublicIPアドレスが変わって接続できなくなるっていちいち調べるの面倒じゃありません？

そんなときに！AWS Cli からインスタンスID指定で接続できるんです！

`aws ec2-instance-connect ssh --instance-id <EC2インスタンスのID>`

コマンド実行元から22番ポートでアクセスできるようにセキュリティグループの許可が必要なので要注意！
これでいちいちIPアドレスを調べなくても大丈夫！
JSX記法のルール

# はじめに
Reactを実装するために使用するJSX記法の基本ルールについてアウトプットします．

# JSX記法とは
JSXとはJavaScript XMLの略で，Reactを実装するためのJavaScript拡張構文．JSXはJavaScriptの中にHTMLとほとんど同じように記述することができるため，UIを簡単に記述し，視覚的に理解しやすい．

https://qiita.com/thirai67/items/a76d1f62fc49cb81038c

# 基本ルール
#### Reactで共通の記述
```react:index.js
import React from 'react';
import ReactDOM from 'react-dom/client';

//ここに画面の要素を書いていく

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);
```
`npx create-react-app ディレクトリ名`コマンドで，上のようなindex.jsが自動で生成されるため，自分で書くことはほとんどない．

#### コンポーネントの作成
Reactは画面の要素をJavaScriptの関数で表す．この関数を **コンポーネント** と呼ぶ．コンポーネントは，大文字始まりで記述する．
画面に表示したい要素を，関数の結果としてreturnすることで，画面に要素を表示する．
```react:index.js
import React from 'react';
import ReactDOM from 'react-dom/client';

const App = () => {
  return <h1>こんにちは</h1>
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);
```

#### 注意
return内で複数行の要素を返すときは，`()`で囲う必要がある．
また，return内は一つのタグで囲う必要がある．`div`タグなどで囲ってもよいが，囲わないことによるエラーを回避するために用意されたflagment(空タグ）`<>`を使用することもできる．
```react:index.js
・・・

const App = () => {
  return (
    <>
      <h1>こんにちは</h1>
      <h1>はじめまして</h1>
    </>
  );
}

・・・
```
【資格】UMTP受験記録

# 目的
[UMTP](https://umtp-japan.org/)の受験記録を残す。

# 目次
- [受験モチベーション](#受験モチベーション)
- [L1](#l1)
    - [参考書](#参考書)

# 受験モチベーション
たまに仕事でクラス図やシーケンス図、状態遷移図を描く機会があったが、ネットで調べてなんとなくで描いていた節があった。そこで、今回は基礎から段階的に勉強し、知識のアウトプット・自分の理解度を確認するためUMTPを受験することにした。  
注意したいのは、UMLを勉強してクラス図や相互作用図を書けるようになったからといって、システムの綺麗な設計ができる様になるわけではないということ。その認識だけ意識して今回の修行を進める。

# L1
勉強時間は約12時間ほどで、勉強方法は以下の参考書を2周して挑んだ。
得点率は93%でクラス図の問題を2問落としてしまった(たぶん)。　　
L1はUMLの基礎ということもあり、100%を狙っていたので少し残念だったが、合格したので良しとしよう。
引き続きL2試験へ向けて修行を行う。

## 参考書
- [[改訂版] UMLモデリング技能認定試験<入門レベル(L1)>問題集 -UML2.0対応](https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E7%89%88-UML%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E6%8A%80%E8%83%BD%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93-%E5%85%A5%E9%96%80%E3%83%AC%E3%83%99%E3%83%AB-%E5%95%8F%E9%A1%8C%E9%9B%86-UML2-0%E5%AF%BE%E5%BF%9C/dp/4774132454/ref=sr_1_2_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1TH0DAT6L1GBK&keywords=umtp&qid=1706707497&sprefix=umtp%2Caps%2C186&sr=8-2-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&psc=1)
Python の for ループの代替品

## この記事は？

JavaScript 版はこちら (言語が違う以外ほぼ同じ):

https://qiita.com/aKuad/items/374f14fc17ec05b57a7a

Python の `list` において、「各要素に対してこうする」というコードを書く機会がしばしばあります。基本的な実装方法は、「`for` ループ書いて処理」です。

しかし、`for` を用いずにそれを実現できるビルトイン関数があります。上手く使えると、コード量を削減し、より簡潔に記述することができます。

ただし、**可読性などの観点で、for のままのが良いシチュエーションもあるので注意。** 各要素に対して複雑な処理をするのであれば、`for` で書いた方が無難です。

## 前提知識 - `lambda` 式

次の 2つのコードは、いずれも「引数を 2倍した値を返す関数を、何らかのメソッドに渡す」という動作で等価です。

```py
def func(e):
  return e*2

any.method(func)
```

```py
any.method(lambda e: e*2)
```

`lambda` を使用すると、関数の名前が不要 (無名関数) だったり `return` が不要だったりで、一行にコンパクトに関数を記述できます。

## Array 各要素に対し、任意の処理をする

例: 各要素を 2倍にする

```py
in_list  = [1, 2, 3, 4]
out_list = []

for e in in_list:
  out_list.append(e * 2)
# out_list: [2, 4, 6, 8]
```

```py
in_list  = [1, 2, 3, 4]
out_list = map(lambda e: e*2, in_list)
# out_list: [2, 4, 6, 8]
```

[`map()`](https://docs.python.org/ja/3/library/functions.html#map) の引数に、処理内容を定義した関数、処理する `list` (厳密にはイテラブル) を指定します。`1` を引数に関数 `e: e*2` が、次は `2` `3` `4` を引数にと繰り返します。その関数の帰り値が、出力される map オブジェクト (ここでは `output`) の要素に入れられます。

:::note
map オブジェクト: `list` と同じくイテラブルなオブジェクト, `list(output)` というようにやれば `list` に変換可能
:::

(2024/02/01 追記, @shiracamus さんよりコメント)

[リストの内包表記](https://docs.python.org/ja/3/tutorial/datastructures.html#list-comprehensions)を用いると以下のようになります。こちらは `list` 型で出てくるので、より簡潔に済みます。

```py
in_list  = [1, 2, 3, 4]
out_list = [e*2 for e in in_list]
```

(追記ここまで)

## Array から特定条件の要素のみ取り出す

例: 偶数だけ取り出す

```py
array      = [1, 2, 3, 4]
array_even = []

for e in array:
  if e % 2 == 0:
    array_even.append(e)
# array_even: [2, 4]
```

```py
array      = [1, 2, 3, 4]
array_even = filter(lambda e: (e % 2) == 0, array)
# array_even: [2, 4]
```

`map()` 同様、各要素に対して [`filter()`](https://docs.python.org/ja/3/library/functions.html#filter) の引数に渡した関数が呼び出されます。関数の返り値が `true` なら出力する filter オブジェクト (ここでは `array_even`) に入れ、`false` なら除かれます。

:::note
filter オブジェクト: map と似た感じ、以下同文
:::

(2024/02/01 追記, @shiracamus さんよりコメント)

[リストの内包表記](https://docs.python.org/ja/3/tutorial/datastructures.html#list-comprehensions)を (以下同文

```py
array      = [1, 2, 3, 4]
array_even = [e for e in array if (e % 2) == 0]
```

(追記ここまで)

## ある値が複数あるいずれかと一致するか

例: 入力されたワードが曜日であるか確認する

```py
in_text         = "mon"
day_of_the_week = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"]

is_input_true = False
for e in day_of_the_week:
  if in_text == e:
    is_input_true = True
    break
# is_input_true: True
```

```py
in_text         = "mon"
day_of_the_week = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"]

is_input_true = in_text in day_of_the_week
# is_input_true: true
```

[`in`](https://docs.python.org/ja/3/reference/expressions.html#in) の左辺と一致する値が右辺の中にあれば `true`、なければ `false` を返します。

先の 2つは関数でしたが、これは演算子の一つです。

## あとがき - 標準リファレンスを見てみよう

リーダブルコードにて、こんな旨のアドバイスがありました。(文はうろ覚え)

> たまに標準 API の仕様書を読んでみると良い。
> 全部完璧に覚える必要は無い。
> だが、何となく覚えておいたものが、急に役立つことがある。

実際、Python 公式ドキュメントで標準ライブラリを調べてみると、けっこう色々な関数やらがあるのが分かります。それを読んでいくと、「あれ？あの時に書いたやつ、このメソッドで一発･･･」なんて出会いがあるかも。

https://docs.python.org/ja/3/library/index.html
動的型付け言語の限界と静的型付け言語の真価

# はじめに

動的型付け言語はその柔軟性で知られていますが、この柔軟性が時には代償を伴います。一方で、静的型付け言語はその厳格さにより多くのメリットを提供します。FastAPI と Pydantic を使用することで、Python のような動的型付け言語でも型の安全性を部分的に享受できるようになりました。しかし、この体験はまた、静的型付け言語におけるエディタの補助や型システムの堅牢さがいかに価値あるものかを痛感させられました。型ヒントとデータバリデーションを通じて得られた疑似的な型安全性は、静的型付け言語の持つ本質的な型安全性とエディタのサポートには及びません。この経験から、静的型付け言語の厳格さがもたらすクリアな利点に気づき、その優秀さを再認識するに至りました。

# 動的型付け言語における疑似型の問題点

FastAPI と Pydantic の使用は Python のような動的型付け言語でも型の安全性を向上させることができますが、この疑似的な型安全性には限界があります。特に、実行時まで型の不一致が検出されないことが多く、これは開発者にとって予期しないバグやエラーの原因となります。さらに、エディタのサポートに関しても、静的型付け言語に比べると自動補完やコードの静的解析が不完全であり、これが開発の効率性や安全性を損なう要因となっています。動的型付け言語の柔軟性が生み出すダイナミズムは魅力的ですが、大規模なアプリケーションや複雑なシステムを開発する際には、静的型付け言語の厳格な型システムの方が信頼性や保守性の面で優れていることが明らかになりました。<br>
FastAPI を使用することで Python における型の安全性を向上させられますが、これは静的型付け言語の厳格な型システムと比較すると限界があります。例えば、FastAPI でエンドポイントを定義する際、Pydantic モデルを使用してリクエストボディの検証を行うことができます。これにより、特定の形式や型を持つデータのみが処理されるようになります。

```py
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None

@app.post("/items/")
async def create_item(item: Item):
    return {"name": item.name, "price": item.price}

```

このコードスニペットでは、Item クラスがリクエストボディの構造を定義しており、FastAPI は自動的に入力データを検証します。しかし、この検証は実行時にのみ行われ、静的型付け言語のコンパイル時型検査に比べると不完全です。静的型付け言語では、このような型の不一致は開発プロセスの早い段階で検出され、エディタのサポートにより開発者は即座にフィードバックを受けることができます。この差異は、特に大規模なプロジェクトや複雑なアプリケーションの開発において、静的型付け言語の採用がもたらす利点を浮き彫りにします。

# 静的型付け言語のエディタ補助の優位性

静的型付け言語では、コンパイル時に型検査が行われ、型不一致やその他のエラーを早期に検出できます。この厳格な型システムは、エラーの可能性を減らし、開発プロセスを加速します。さらに、静的型付け言語は高度なエディタの補助機能をフルに活用できます。自動補完、コードナビゲーション、リファクタリングが簡単で、これにより開発者の生産性が大幅に向上します。これらの機能は、静的型付け言語を使用する最大の利点の一つです。

# 結論

静的型付け言語の採用は、開発プロジェクトに多くの長期的な利点をもたらします。型安全性、エディタのサポート、コードの保守性の向上は、大規模なアプリケーションや複雑なシステム開発において特に価値があります。一方で、動的型付け言語もその柔軟性と迅速なプロトタイピング能力で適切なシナリオがあります。適切な言語の選択は、プロジェクトの要件、チームのスキルセット、および目標によって異なります。
【Xcode】シュミレーターの外観モードをショートカットで変更して時短しよう

# はじめに
iOS開発をしていれば必ず、シュミレーターを触ると思います。
そして、iOS開発をしていれば外観モードを考えながらUIを作ると思います。

「ここのUIダークモードだとどうなってるだろう」と思って、外観モードを変更することはよくありますよね。
しかし、設定アプリを開いて、「ダークの外観モード」をオンにするのはめんどくさい！！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/4d178894-7a00-faa0-72f6-d8ea11a34886.png" width="50%">

そんなあなたはショートカットです。

# やりかた
command + shift + a

# おわり
こんな感じで素早く外観を変更できます。

![Simulator Screen Recording - iPhone 15 - 2024-01-31 at 22.10.58.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/01afafa7-fa6b-1a74-3c85-adb1d315b654.gif)
FirefoxのTabキー操作が思うようにできなかったのでChromeと同じようにした話

## これはなに

Firefoxでキーボード操作の動作確認をしようとしたときに、Chromeとは違った挙動になり困りました。
リンク要素に思ったようにフォーカスを当てられなかったのです。
この記事は、その解消方法の覚書です。

## デフォルトではTabキーでフォーカスが当たる場所が限られている

デフォルトの状態ではFirefoxでTabキー操作をした場合、フォーカスが当たる要素はChromeとは異なります。
Firefoxのデフォルトだと `textarea`、 `textbox`、 `button` などです。

リンクにはフォーカスが当たってくれません。

## Tabキーでリンクにフォーカスが当たるようにする方法

Chromeと同じようにリンクにもフォーカスが当たるように設定を変更します。

1. Firefoxのメニューから「設定」を選択する
![Firefoxのメニューのスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215239/5135515d-000b-d38c-8b02-6be62778e9e1.png)
1. 「一般タブ」の「ブラウジングセクション」の「タブキーでフォームコントロール及びリンク間のフォーカスを移動する」にチェックを入れる
![Firefoxのブラウジングセクションのスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215239/2f9617ad-a252-7dbd-6eed-aef6bf8edca1.png)

以上で、リンクもフォーカス対象になり、Chromeと同じような挙動になります

---

この記事が誰かのお役に立てれば幸いです。
【Memorandum】Purpose of starting qiita   (【備忘録】qiitaを始める目的)

# 1.Qiitaに投稿を始める目的
転職活動を通じてキャリアについて考え直し、新たなステップとしてQiitaを始めてみようと考えた。  
詳細な理由は以下に示す。

1.**ソフトウェアに対してプライベートでのアウトプットをしてみたい。**  
　現職ではソフトウェア開発を仕事としているため、仕事としてのアウトプットはしているが、プライベートはインプットのみとなっていた。プライベートでのインプットは仕事では使わないことが多く、アウトプットがないために身につかないことも多々あるので、プライベートでもアウトプットを実施する。

2.**スマホアプリ開発に挑戦しようと考えているため、開発記録を残すため。**  
　組込みエンジニアからのキャリアチェンジを視野に入れるため、スマホアプリ開発の挑戦を行う。現状アプリ開発は初心者なので、初心者目線での学びやトラブルシューティングを記録として残す。
　　  

3.**考えをまとめる能力を高めるため。**  
  文章化が苦手なため、文章化の経験を積む。

4.**Markdownの練習**  
　そのままの意味
AIX LVCBが壊れた時の復活の呪文

# AIX LVCB壊れても焦らなくても大丈夫！なぜならODMからLVCDを復活させる呪文があります。

## 1.LVCBの内容確認

```
getlvcb -AT <lv name>
```

## 2.復活の呪文(論理ボリューム制御ブロック、デバイス構成データベース、およびデバイス・スペシャル・ファイルを再構築)

```
synclvodm <vg name> <lv name>
```

## 3.LVCBの内容確認
ODMからLVCBへLV情報が引継がれたことを確認。

```
getlvcb -AT <lv name>
```
NullPointerException vs IllegalArgumentException

# 引数の値が null だったときに、投げる例外はどちらが正しいのか？
:::note 
まとめ
結論 -> どちらでも問題ない
JavaDocに記載されているとおり、どちらの状況も当てはまるから
> **IllegalArgumentException**
> 不正な引数、または不適切な引数をメソッドに渡したことを示すためにスローされます。

> **NullPointerException**
> オブジェクトが必要な場合に、アプリケーションがnullを使おうとするとスローされます。
:::


## よく見かけるコードたちの例

```java
public void setterMethod(Object par) {
    if(par == null) {
        throw new NullPointerException("par is null");
    }
    // do something...
}
```
```java
public void setterMethod(Object par) {
    if(par == null) {
        throw new IllegalArgmentException("par is null");
    }
    // do something...
}
```
## Java標準APIのソースコードは？
Objects#requireNonNull メソッドを通して NPE を投げている。
```Optional.java
private Optional(T value) {
    this.value = Objects.requireNonNull(value);
}
```
```Objects.java
public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}
```

## JavaDocを読んでみる
どちらも適切ということが分かった。

こりゃNPE派とIAE派がいるわけだ。

> **IllegalArgumentException**
> 不正な引数、または不適切な引数をメソッドに渡したことを示すためにスローされます。

> **NullPointerException**
> オブジェクトが必要な場合に、アプリケーションがnullを使おうとするとスローされます。たとえば、次のような場合があります。
> * nullオブジェクトのインスタンス・メソッドの呼出し。
> * nullオブジェクトのフィールドに対するアクセスまたは変更。
> * nullの長さを配列であるかのように取得。
> * nullのスロットを配列であるかのようにアクセスまたは修正。
> * nullをThrowable値であるかのようにスロー。
> 
> nullオブジェクトの不正な使用を示す場合は、このクラスのインスタンスをアプリケーション側でスローするようにしてください。まるで抑制が無効になっているか、スタック・トレースへの書込みができないか、あるいはその両方であるかのように、仮想マシンによってNullPointerExceptionオブジェクトが構築される可能性があります。



# 解決策
## とあるライブラリでは？
apache commons-lang のライブラリでは IAEを継承したクラス NullArgumentException というクラスがある。これを用いてスローすると良いかもしれない。
> **NullArgumentException**
> 引数にnullを渡した場合に、スローされます。

## オマケ：もしかして、これでいいのでは？
ライブラリを使用することができない場合だと、こうなる。
賢すぎる開発者おったわ。「IAEでNPEをラップすれば良いじゃん」だそうです。
```java
public void setterMethod(Object par) {
    if(par == null) {
        throw new IllegalArgmentException(new NullPointerException("par is null"));
    }
    // do something...
}
```
アルゴリズム事始め

AtCoderに取り組んで、行き詰ってアルゴリズムを学習し始めた人のチラシの裏です。

[読んでる本]
アルゴリズムとデータ構造

## アルゴリズムを考える時の基本方針
「困難は分割せよ」
全体の解決方法を考えるのではなく、まずは手近な小さい値で検討を始めるのが良い。

## よく使うアルゴリズム
### 全探索
頭から順に探索して特定する。いわゆるforで解いていく。

### 二分探索
ソート済みの配列を、以上・以下などの条件で半分に割って、探索範囲を半減させて特定する。forにif-elseが組み合わさったやつ。

### 動的計画法
課題の部分を解く処理を作って、それを繰り返す。
この時、処理を表す表を作って、順番に表を埋めて、目的の値を探索する。

#### 動的計画法を理解するための補助
①再帰
メソッド内で自分を呼び出すアレ。結果を出すために実施した処理の中で、さらに同じ処理を実施する。
問題を小さくして部分をメソッド内で作るイメージ。部分を繰り返すことで全体を解く。
無限ループできるので、終了条件は明確に。

②再帰＋メモ化
再帰で課題を解こうとすると、往々にして「同じ条件を繰り返し処理している」問題にぶち当たる。
ので、既に処理した条件はメモしていって、メモに書いてあるものはやらない、という考え方。
よくやる。

⇒これらを踏まえて、動的計画法はメモするモノが条件から結果に変わる。
　表を作って、順繰り埋めていくイメージ。

※以下がイメージ湧きやすくて良きでした。
https://www.momoyama-usagi.com/entry/info-algo-dp#i-2

## 課題を解く時の考え方のコツ
初心者は、いきなり「全探索が最適だ」とか「動的計画法が最適だ」とか、出てこない。

### あるかないかだけを考える
素直に頭から順に眺めて、条件に合ったかどうかで判断する。
ゴリ押しも案外使えるのだ。

### 選んだ時と選ばなかったときを考える
選んだ時に条件に当てはまるか
当てはまる：選んだ時に条件に当てはまるか繰り返す。
当てはまらない：選ばなかった時に条件に当てはまるかを見て同じように繰り返す。
まずは、全体じゃなくて、問題の一部を解いていく。
処理を繰り返して、最終的に全体を解くような流れ。

### 境界の右(true)か左(false)かを考える
線分のどこに境界を設けるかで無限にtrue/false領域として扱えるようになる。
二分探索の応用みたいなイメージ。

### できたものはメモしていく
メモ化して、確認が終わったところはスキップさせるたり、条件を埋めていったり、とにかく保持しておく。
新人研修でメモ取らされるのも伊達じゃない。

# 感想
プログラムなので当たり前と言えば当たり前なのだが、最終的にYes/Noの話に絶対に落ちる。なので、条件として何に当てはまるか、当てはまらないかということを考えるのが大事っぽい。
と言いつつ、今のところ、見た問題に対して何を中心に考えるべきなのかすぐ迷子になる。無理。
あと、小難しいアルゴリズムになると再帰が深く関わるけど、かといって再帰に踊らされてもいけない。私は今踊らされている。なんもわからん。
フラグメントシェーダー（GLSL で実装）や p5.js を組み合わせて音のビジュアライザーを作るための下調べ

## はじめに
タイトルのとおりです。

音を可視化するビジュアライザーに関して、過去に、p5.js をベースにしたものを作ってみるというのを、ほんの少しだけやってみたことがありました。

https://twitter.com/youtoy/status/1620576118037417984

その時は、上記以外のものをさらに作るというのはやっていませんでした。

そして最近シェーダーを触るようになって、シェーダーを使った作例をいろいろ見ていく中で、音と連動する作品を複数見かけました。それで、シェーダーを使った音の可視化に手をつけようかと思い始め、まずは下調べからやろうと思いました。
それで書いたのがこの記事です。

## シェーダーと音を組み合わせた作品やそれに関して書かれた記事
シェーダーを使った描画と音を連動させた作品について、気になった作品のリンクや、作り方について書かれた記事などを、いくつかピックアップしてみようと思います。

ちなみに、探し方は単純で、例えば以下のキーワードの組み合わせで Web検索をしたりという感じです（キーワードの組み合わせを、いろいろ変えてみて、探しています）。

●glsl visualizer javascript - Google 検索
　https://www.google.com/search?q=glsl+visualizer+javascript

他に、Shadertoy で「visualizer」などのキーワードで検索をするというのも良さそうです。

●Browse (1) - Shadertoy BETA
　https://www.shadertoy.com/results?query=visualizer

### GLSL を使って VJ をされた方の記事
以下は、GLSL を使って VJ をされた方の記事です。

●GLSLを使ってVJしてきたのでそこで使ったこととかまとめ - Qiita
　https://qiita.com/edo_m18/items/51bbda8ebd81742e19c8

UV の値をそのまま極座標として扱って利用する話や、他の複数の表現の事例などが紹介されていて、とても参考になりました。




## シェーダーを使っていない音の可視化
上で紹介したものはシェーダーを使った描画と音を連動させるものでしたが、以下は、シェーダーを使っていないものになります。

シェーダーを使った方法にも参考になりそうで気になったものを掲載しています。

### 2D・3Dのビジュアライザー
以下は、2D・3Dのビジュアライザーの事例を紹介しています。

●JavaScriptで作成するサウンドビジュアライザー - Web Audio APIで周波数解析 - ICS MEDIA
　https://ics.media/entry/230421/

3Dのビジュアライザーのサンプルがカッコいいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/c6b9be10-8743-d327-8a43-774f57ed035b.png)

### Babylon.js を使ったもの
以下は、Babylon.js を使って実装されたもののデモ動画と、作られたものを試せるライブデモのリンクです。クリック操作に反応した描画なども行われるものでした。

●Babylon JS Audio Visualization Link in the discription - YouTube
　https://www.youtube.com/watch?v=PAjrrzXO1L8

●hiteshsahu.com/AudioAnalysis
　https://hiteshsahu.com/AudioAnalysis

### Three.js を使ったもの
以下は、Three.js　で描画した球体状のものを使ったもののデモ動画と、ソースコードのリンクです。

●How To Create A 3D Audio Visualizer Using Three.js - YouTube
　https://www.youtube.com/watch?v=qDIF2z_VtHs

●WaelYasmina/audiovisualizer
　https://github.com/WaelYasmina/audiovisualizer

## デバイスを使った事例
以下は、可視化の部分をソフトウェアベースにするのではなく、ハードウェア（フルカラーLEDテープ）を使ったものです。

https://twitter.com/SanukiTechnet/status/1555774603707895809

## おわりに
フラグメントシェーダー（GLSL で実装）や p5.js を使ったビジュアライザーを作ろうとして下調べをしたのですが、GLSL を使ったもの以外がメインになってしまいました。

次は、自分で書いたプログラムでビジュアライザーを作っていければと思います。
APIキー不要のPythonのTwitter APIラッパー"twikit"の紹介

# この記事の概要
APIキーなしで利用できるPythonのTwitterAPIラッパーを作ったので紹介します。この記事を読んで使っていただけたら幸いです。
詳しい使用方法などは以下のリポジトリやドキュメントでご確認ください。

https://github.com/d60/twikit

ドキュメント: https://twikit.readthedocs.io/en/latest/twikit.html

追記: 非同期に対応しました
追記: v2.0.0より同期版を廃止して非同期版のみになりました

# インストール
pipを使用してインストールしてください
```bash
pip install twikit
```

# はじめに
まずは、TwitterのAPIにアクセスするためのクライアントを定義し、アカウントにログインします。

以下は、コードの例です。

```python
import asyncio
from twikit import Client

# 第一引数に言語を指定
client = Client('ja')

async def main():
    # アカウントにログイン
    await client.login(
        auth_info_1='email@example.com',
        auth_info_2='example_user',
        password='password0000'
    )
asyncio.run(main())
```

`auth_info_1`と`auth_info_2`には、Twitterのアカウントに登録しているユーザー名、メールアドレス、電話番号のうち、2つを選んで指定してください。順番は自由です。

`save_cookies`を使用することで、ログインした際のクッキー情報をファイルに保存することができます。
```python
# クッキーの保存
client.save_cookies('cookies.json')
```
`load_cookies`メソッドを使用することで、保存されたクッキー情報を読み込みむことができます。これにより、ログイン情報を再利用し、再度ログインの手続きを省略することが可能です。
```python
# クッキーの読み込み
client.load_cookies('cookies.json')
```

# 機能例
主要な機能を紹介します。
### ツイートやユーザーの検索
ツイートやユーザーをキーワードから検索することができます。
コードの例:
```python
# ツイートの検索
# 第二引数にはTop, Latest, Mediaを指定できる
await client.search_tweet('検索クエリ', 'Top')

# ユーザーの検索
await client.search_user('検索クエリ')
```

### ツイートの作成
画像や投票を添付することもできるので詳しくは[ドキュメント](https://twikit.readthedocs.io)をご覧ください

```python
await client.create_tweet('ツイートの本文')
```

### トレンドの取得
第一引数にはトレンドのカテゴリーを指定できます。
```python
# ニュースカテゴリーのトレンドを取得
await client.get_trends('news')
```

# 最後に
紹介した機能以外にも様々な機能があるのでぜひお試しください。
また、まだ開発中のため実装できていない機能もあります。ご希望の機能があれば、ぜひコメントなどでお知らせください。
GitHubでのスターをいただけると、開発への励みになります。どうぞよろしくお願いいたします。

https://discord.gg/nCrByrr8cX
4日で基本情報に合格しました

## はじめに
年明けに一念発起し、冬休み期間で基本情報技術者試験を受けた&合格できたので、備忘録を残します。

### プロフィール
非情報系学部卒→修士了→材料系研究職→DXコンサルタント(1年目)
研究職時代から機械学習をちょこちょこ触っていました。
プログラミング言語はPythonオンリー、きちんとしたシステム開発は未だにやったことがありません。

試験は割と得意な方です。

### 勉強開始前の知識
Pythonでのコーディングは不自由なくできますが、ネットワークやデータベースなどは？？？という状態でした。
マネジメント系とストラテジ系は問題文を読めば何とかなりそうだったので、テクノロジー対策に全振りすることを決意。

## 勉強方法と勉強時間
最短距離で合格したかったので、過去問道場の問題をこなすだけでした。
[基本情報技術者過去問道場](https://www.fe-siken.com/fekakomon.php)

↓が全勉強記録です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554003/784d6307-ea53-15e6-5c73-20a357510901.png)

889問やったみたいです。1問に平均で1分かけたとすると、15時間弱ですね。
復習はほとんどせず、未回答問題ばかり解き続けました。

科目Bについてはほとんど過去問がなかったので非常に不安でしたが、数問の難問を除くと読めば何とかなる、という感覚でした。

## 結果
科目A:760点
科目B:875点
でした。

受験前はこんな勉強量で受かるのか？という不安はありましたが、なんとかなるものですね。
次は3か月後の応用情報に挑戦したいと思います。
POSCARが存在するディレクトリorファイルパス一覧の取得

## プログラム使用法の確認
```terminal
python3 get_poscar_existed_path_list_argparse.py -h
```
usage: get_poscar_existed_path_list_argparse.py <arg1>
example: python3 get_poscar_existed_path_list_argparse.py /mnt/ssd_elecom_c2c_960gb/cif/

This script takes five arguments: arg1.

positional arguments:
  arg1        directory path that name is cif/: /mnt/ssd_elecom_c2c_960gb/cif/

options:
  -h, --help  show this help message and exit




## 実行ログ
```terminal
time python3 get_poscar_existed_path_list_argparse.py /mnt/ssd_elecom_c2c_960gb/cif/
```
os.path.exists(target_npy_p): True
len(poscar_folder_path_list): 507142
Now getting poscar folder sub path list!!!
100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████| 507142/507142 [09:22<00:00, 902.16it/s]len(poscar_existed_file_path_list): 308325
Both poscar_existed_file_path_list and poscar_existed_folder_path_list were saved as .npy

real    10m24.513s
user    6m44.089s
sys     27m28.772s
差集合演算をshellで行う（aとbの差分のうちaのみに存在する要素を出力）

# 概要

リレーショナルデータベースでいう`EXCEPT`をシェルコマンドで実現します。

## 内容

```sql
SELECT id FROM a
EXCEPT
SELECT id FROM b;
```

それぞれ`a.txt`、`b.txt`に集合の中身が書かれているとします。ここで、`a-b`（`a.txt`にはあるが、`b.txt`にはないもの）を出力するには、下記コマンドを実行します。

```bash
cat b.txt b.txt a.txt | sort | uniq -u
```

### 具体例と解説

```txt:a.txt
aaa
bbb
cccc
dddd
```

```txt:b.txt
cccc
dddd
ee
ff
```

```txt:出力
aaa
bbb
```

解説

- `uniq -u`コマンドは、ユニークな行（重複していない行）を出力します
- `uniq`コマンドに掛ける前に`sort`コマンドでソートする必要があります
- `cat b.txt b.txt a.txt`をすることで
  - `a.txt`にも`b.txt`にも含まれる行は、3行になるため、`uniq -u`で除外される
  - `b.txt`のみに含まれる行は、2行になるため、`uniq -u`で除外される
  - `a.txt`のみに含まれる行は、1行のみになるため、`uniq -u`で出力される

## より実践的な具体例

### ファイルバックアップ

`~/work`ディレクトリと`~/backup`ディレクトリの差分を確認し、`~/backup/`されていないファイルを出力します。削除されたファイルは`~/backup/`にあっても良しとします。（この場合だったら`rsync -av --dry-run ~/work/ ~/backup/`でも良いのかも。）

```bash
cd ~/work
ls
# > aaa bbb cccc dddd
find . -type f > ../work_filelist.txt

cd ~/backup
touch cccc dddd ee ff
find . -type f > ../backup_filelist.txt

cat backup_filelist.txt backup_filelist.txt work_filelist.txt | sort | uniq -u >need_copy.txt
```

### ファイルにて連携しているシステムのエラー調査

私がこれらのコマンドを活用したのは、ファイル連携しているシステムのエラー調査でした。
実は、このサーバはWindowsサーバ（NTFS）とLinuxサーバ（ext4）間の連携で、Windowsでは大文字小文字は無視され、Linuxでは区別されることがバグの原因となっていました。このコマンドによってサクッと差分を出力することができ、重宝しました。

## 参考

- [差集合 | 集合 | 集合 | 数学 | ワイズ](https://wiis.info/math/set/set/difference/#elementor-toc__heading-anchor-0)
はじめまして

はじめまして。

Qiitaの書く側の人を始めてみました。

いつか書いてみたいと思っていたのですが
タイミングがなくなかなか始められませんでした。

今日は記念すべきQiitaデビューです！
これで私もエンジニアの仲間入りです＾＾

まずはスクレイピングのための環境構築～実装までを書いていけたらなと思っています。
たぶん誰かの役に立てることは書けないけれど、
私のアウトプットの練習ということで。

    ところで、マークダウンってどうやって書くんだろう。

あ、Tab下げすると後ろが黒くなるんだ・・・。

今日はここまで。
Conda 仮想環境の書き出しスクリプト 備忘録 

# 概要
minicondaをずっと使っていると仮想環境が出来すぎて、どれに何を入れてたかわからなくなるのはオイラだけか。そこで全部の仮想環境のインストール状況を書き出すスクリプトをChatGPTに作って頂いたので残す。
スクリプトは下記の２種類
1. 全仮想環境のパケージ一覧をひとつのテキストファイルに書き出し
1. 全仮想環境のrequirements.txtの書き出し

AnacondaならGUIがありそうなのでそこで管理できるのかもしれないが、ライセンスの関係で使ったことがないので知らん。

- 実施期間: 2024年2月
- 環境：Ubuntu18.04LTS, Windows11
- Python: miniconda

## 1. Ubuntu
### 1.1. パケージ一覧の書き出し
実行すると**conda_envs_packages.txt**が作成され、全仮想環境内のパケージが書き出される。やっていることは`conda list`の実行結果を書き出しているだけ。

conda_env.sh
```shell
#!/bin/bash

# 出力ファイルの設定
outputFile="conda_envs_packages.txt"

# 既存の出力ファイルを削除
if [ -f "$outputFile" ]; then
    rm "$outputFile"
fi

# 仮想環境のリストを取得し、それぞれのパッケージリストを出力
while read line; do
    envName=$(echo $line | awk '{print $1}')
    echo "[$envName]" >> "$outputFile"
    conda list -n $envName >> "$outputFile"
    echo "" >> "$outputFile"
done < <(conda env list | tail -n +3)

echo "Done."
```

### 1.2. 全仮想環境のrequirements.txtの書き出し
実行すると、**[仮想環境名]_requirements.txt**の名前で仮想環境数分のrequirements.txtが書き出される。新しいminiconda環境へ、まるっと引っ越しが楽になる。

conda_req.sh
```shell
#!/bin/bash

# requirementsフォルダの作成
requirementsDir="requirements"
if [ ! -d "$requirementsDir" ]; then
    mkdir "$requirementsDir"
fi

# 仮想環境のリストを取得し、それぞれのrequirements.txtを作成
while read line; do
    envName=$(echo $line | awk '{print $1}')
    conda list -n $envName --export > "$requirementsDir/$envName"_requirements.txt
done < <(conda env list | tail -n +3)

echo "Done."
```

## 2. Windows11
いずれもUbuntuと同じ

### 2.1. パケージ一覧の書き出し
conda_env.bat
```batch
@echo off
setlocal

set outputFile=conda_envs_packages.txt

if exist %outputFile% del %outputFile%

for /f "skip=2 tokens=1" %%i in ('conda env list') do (
    echo [%%i] >> %outputFile%
    conda list -n %%i >> %outputFile%
    echo. >> %outputFile%
)

pause
echo Done.
endlocal
```

### 2.2. 全仮想環境のrequirements.txtの書き出し
conda_req.bat
```batch
@echo off
setlocal

set requirementsDir=requirements
if not exist %requirementsDir% mkdir %requirementsDir%

for /f "skip=2 tokens=1" %%i in ('conda env list') do (
    conda list -n %%i --export > "%requirementsDir%\%%i_requirements.txt"
)

pause
echo Done.
endlocal
```

以上
M5Goを使ったサーボモータの駆動（忘備録）その２

## はじめに
M5GoでServo Kit 360'を駆動させた記録です。サーボのドライバには、M5Stack用8chサーボドライバユニットを使っています。

https://www.switch-science.com/products/6479

https://www.switch-science.com/products/9199

## サーボ駆動の方法

購入先のスイッチサイエンスさまにやり方を教えていただきました。やり方は次のとおりです。

前回の記事と同じSERVO_CTLというスケッチをArduinoIDEで開き編集します。

https://qiita.com/_Moony/items/9a85ce8c019a52960876

360'サーボは、スケッチ中のunit_8servo.setServoPulse(channel, pulse)という関数で制御します。channelにはサーボドライバユニットに接続するチャンネル数を入力し、pulseには回転方向と回転数に関係する数値を入力します。
pulseの値は1500で停止、1500より小さいと時計回りの回転、1500より大きいと反時計回りの回転となります。数値は1500に近い値ほどゆっくり回転します。

このことを使って、今回は以下のようなスケッチを作成しました。
サーボドライバユニットの0と1チャンネルにサーボモータを接続し
①互いに逆方向に1秒間回転
②0.5秒停止
③互いに逆方向に1秒間回転
④0.5秒停止
を繰り返します。①と③は回転方向が逆になります。

```
#include "M5_UNIT_8SERVO.h"

M5_UNIT_8SERVO unit_8servo;

void setup() {
    while (!unit_8servo.begin(&Wire, 21, 22, M5_UNIT_8SERVO_DEFAULT_ADDR)) {
        Serial.println("extio Connect Error");
        delay(100);
    }
    unit_8servo.setAllPinMode(SERVO_CTL_MODE);
}

void loop() {
      unit_8servo.setServoPulse(0, 500);
      unit_8servo.setServoPulse(1, 2500);
      delay(1000);
      unit_8servo.setServoPulse(0, 1500);
      unit_8servo.setServoPulse(1, 1500);
      delay(500);
      unit_8servo.setServoPulse(0, 2500);
      unit_8servo.setServoPulse(1, 500);
      delay(1000);
      unit_8servo.setServoPulse(0, 1500);
      unit_8servo.setServoPulse(1, 1500);
      delay(500);
}
```
作成した回路でスケッチを実行中の状態です。
![20240131_201219 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/1f349ee8-5b88-1db9-d3b2-0ecf83b0f93a.jpeg)

使用した部品です（LEGOブロックは除く）。
![20240131_201828.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/993aa7ba-1a58-490f-2eba-f02a4a3c4c6c.jpeg)

## 開発環境
マイコンボード：M5GO Ver.2.7
ボード情報：M5Stack by M5Stack, ver. 2.1.0
Ardiono IDE：ver. 2.2.1
OS：Windows11
pkill / killall 複数プロセス消去

```
[linuxstudy@xxxx ~]$ ps -el | grep samp
0 T  1000  31632  29828  0  80   0 - 28321 do_sig pts/2    00:00:00 sample.sh
0 T  1000  31640  29828  0  80   0 - 28321 do_sig pts/2    00:00:00 sample.sh
[linuxstudy@xxxx ~]$ pkill -9 sample.sh
[linuxstudy@xxxx ~]$ ps -el | grep samp
```
Microsoft Fabric の委任設定を使って特定の容量の Fabric アイテムの作成可否を制御する

## 委任設定とは

以下の記事でテナント設定でFabric アイテム作成が許可されていない場合に、Fabric アイテムの作成がブロックされることを紹介しました。

しかし、試用版でない有料の容量であれば、テナント全体設定でアイテム作成許可されない場合でも作成を有効化することができます。

https://qiita.com/ryoma-nagata/items/df0d2799caa125447da0



注意：2024/01時点での情報です。特に、一部無効化されている項目があるので、テナント設定で指定した一部のユーザーだけがこの設定を扱えるようになるものと思われます。

現在、該当設定は以下のように自動的に委任されていますが、テナント設定が常に無視されることになるので、改善要望が寄せられ次第、オプションが使えうるように変更されるのではと推測しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/06386fc6-dc8f-92ea-1542-2eadde2ad98a.png)


### 参考

- [組織に対して Microsoft Fabric を有効にする](https://learn.microsoft.com/ja-jp/fabric/admin/fabric-switch)


## 設定方法

1. [https://app.powerbi.com/admin-portal/capacities?experience=power-bi](https://app.powerbi.com/admin-portal/capacities?experience=power-bi)　から管理ポータルの容量管理画面に移動して、ファブリック容量を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/e5c13407-9b14-b4f9-daba-d127c781486e.png)

2. 対象の容量名をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/ade155ec-ebfa-1fdb-b825-f11b2d9400e9.png)

3. 委任されたテナント設定のタブからアイテム作成の有効化ボタンが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/bba5e4d9-7d51-c842-383f-59dff2eee2ac.png)

以上で、テナント設定がブロックされている場合にも特定の容量で Fabric が利用可能です。
Almalinuxの日本語入力の設定方法【初期設定】

## はじめに
Almalinux 9をインストールしたばかりのときは、`半角/全角キー`で日本語入力を切り替えることができません。<br>
日本語入力を`半角/全角キー`でできるようにする方法をまとめます。

## 日本語入力の設定手順
まず以下のようなログイン後の初期画面から[アプリケーションを表示する]をクリックします。<br><br>

![01_アプリケーションを表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627769/bef5a708-55a6-7567-0193-142793aeb029.png)
<br>

次に[設定]をクリックします。<br><br>

![02_設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627769/a60185f7-e6d9-5c5f-a876-04cdabea1023.png)
<br>

次に[Keyboard]>[入力ソース]の「＋」をクリックします。<br><br>

![03_言語選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627769/c64fc1c6-48cb-f3e4-e58c-5ae8c4c3acde.png)
<br>

次に[日本語]をクリックします。<br><br>

![04_日本語.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627769/999bc3c3-7653-27e0-97c8-98d3440555a1.png)
<br>

次に[日本語(Anthy)]を選択し、[追加(A)]をクリックします。<br><br>

![05_日本語_Anthy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627769/c33257ae-ba0f-fbac-3d69-5ea067410ecd.png)
<br>

最後に画面右上の[ja]をクリックし、[日本語(Anthy)]をクリックします。<br><br>

![06_設定完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627769/fa725be0-f594-1938-8096-d5a0988df224.png)
<br>

以上を設定し終わると、`半角/全角キー`で日本語入力を切り替えられるようになります。

## おわりに
今回はAlmalinuxの日本語入力の設定についてまとめました。
参考になれば幸いです。<br>
最後まで読んでいただき、ありがとうございました！
GoにおけるAPI並列処理について

### はじめに
APIデータ取得を高速化する方法として、並列処理が有効です。Goの `sync.WaitGroup` を活用し、異なる2つのAPIからデータを並列で効率的に取得する方法を紹介します。具体的な例として、ユーザーデータと製品データの取得を行う架空のシナリオを設定し、直列処理と並列処理のコードを比較します。

### 改善前コード（直列処理）
```go
package main

import (
    "errors"
    "fmt"
)

// UserData はユーザーのデータを表す架空の構造体です。
type UserData struct {
    ID   string
    Name string
}

// ProductData は製品のデータを表す架空の構造体です。
type ProductData struct {
    ID    string
    Title string
}

// FetchUserData は架空のユーザーデータ取得APIを模倣します。
func FetchUserData(userID string) (UserData, error) {
    // ここにAPI呼び出しのロジックを記述します（省略）。
    return UserData{ID: userID, Name: "John Doe"}, nil
}

// FetchProductData は架空の製品データ取得APIを模倣します。
func FetchProductData(productID string) (ProductData, error) {
    // ここにAPI呼び出しのロジックを記述します（省略）。
    return ProductData{ID: productID, Title: "Awesome Product"}, nil
}

// FetchData はユーザーと製品のデータを直列で取得します。
func FetchData(userID, productID string) (UserData, ProductData, error) {
    user, err := FetchUserData(userID)
    if err != nil {
        return UserData{}, ProductData{}, err
    }

    product, err := FetchProductData(productID)
    if err != nil {
        return UserData{}, ProductData{}, err
    }

    return user, product, nil
}

func main() {
    userID, productID := "user123", "product456"
    user, product, err := FetchData(userID, productID)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println("User:", user)
    fmt.Println("Product:", product)
}

 ```

 ### 改善後コード（並列処理）
```go
package main

import (
    "fmt"
    "golang.org/x/sync/errgroup"
)

// UserData と ProductData は前の例と同じです。

// FetchUserData と FetchProductData も前の例と同じです。

// FetchDataConcurrently はユーザーと製品のデータを並列で取得します。
func FetchDataConcurrently(userID, productID string) (UserData, ProductData, error) {
    var user UserData
    var product ProductData
    eg := new(errgroup.Group)

    // 最初のAPIを並列で呼び出し
    eg.Go(func() error {
        var err error
        user, err = FetchUserData(userID)
        return err
    })

    // 次のAPIを並列で呼び出し
    eg.Go(func() error {
        var err error
        product, err = FetchProductData(productID)
        return err
    })

    // すべてのゴルーチンが終了するのを待つ
    if err := eg.Wait(); err != nil {
        return UserData{}, ProductData{}, err
    }

    return user, product, nil
}

func main() {
    userID, productID := "user123", "product456"
    user, product, err := FetchDataConcurrently(userID, productID)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println("User:", user)
    fmt.Println("Product:", product)
}
```

### 解説
`errgroup.Group`を使って非同期に2つのAPI呼び出しを並列で行い、`eg.Wait()`を使ってすべてのゴルーチンが終了するのを待っています。エラーが発生した場合は、そのエラーをキャッチして適切に処理します。これにより、全体の実行時間を短縮し、より効率的なデータ取得します。

https://pkg.go.dev/golang.org/x/sync@v0.5.0/errgroup
お一人様Organization + IAM Identity Centerの手始めに、おニューアカウントにBLEA適用してみたスコアがこちら！

Xに投稿しましたが残しておきたくなったので。

BLEA

https://github.com/aws-samples/baseline-environment-on-aws/blob/main/README_ja.md

* 新規作成したAWSアカウントに適用した結果

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/1fdb7888-b18e-55cb-599c-9da69d6e7c68.png)

* [AWS Foundational Security Best Practices](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/fsbp-standard.html)のNG項目

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/c7cefe39-ce4a-8f63-b464-b64532e5cfb6.png)

* [CIS AWS Foundations Benchmark v1.2.0](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/cis-aws-foundations-benchmark.html)のNG項目

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/42594a66-3210-e29c-364e-a54ac6bb22b3.png)

ご参考まで。

---

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">お一人様Organization + IAM Identity Centerの手始めに、おニューアカウントにBLEA適用してみたスコアがこちら！<br><br>BLEAはこちら<a href="https://t.co/JZyR0ZKppX">https://t.co/JZyR0ZKppX</a> <a href="https://t.co/jiSb4L76Yz">pic.twitter.com/jiSb4L76Yz</a></p>&mdash; mor:ta/ous (@moritalous) <a href="https://twitter.com/moritalous/status/1752650728806768654?ref_src=twsrc%5Etfw">January 31, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【権限エラー】yarnを-gオプションでインストールしようとしたらエラーになった

# やりたいこと
PCにyarnをグローバルオプションでインストールしたい。

# エラー内容
ターミナルに
``npm install -g yarn``
と入力したところ、下記のようなエラーになった。

```
npm ERR! code EACCES
npm ERR! syscall mkdir
npm ERR! path /usr/local/lib/node_modules/yarn
npm ERR! errno -13
npm ERR! Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/yarn'
npm ERR!  [Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/yarn'] {
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'mkdir',
npm ERR!   path: '/usr/local/lib/node_modules/yarn'
npm ERR! }
npm ERR! 
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR! 
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator.
```
実行権限がないと怒られたので、sudoコマンドを使って権限をつけた状態でもう一度コマンドを実行してみた。

``sudo npm install -g yarn``

すると今度は下記のエラーが出現。
```
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
sudo: a password is required
```

sudo権限を使うにはパスワードが必要と言われているが、パスワードを打つことができない、、、


# 原因と解決策
VScodeのターミナルを使用していたからだった。
Macのターミナル上で同じように
``sudo npm install -g yarn``
を実行すると、パスワードの入力をすることができ無事yarnをインストールすることができた。
SIGTERM, SIGKILLの違い

### sample.sh稼働中
```
[linuxstudy@xxxx ~]$ ps -el | grep samp
0 S  1000  30327  29828  0  80   0 - 28321 do_wai pts/2    00:00:00 sample.sh
[linuxstudy@xxxx ~]$ kill -SIGTERM 30327
[linuxstudy@xxxx ~]$ ps -el | grep samp      //SIGTERMで消滅
```
### sample.sh一時停止
```
[linuxstudy@xxxx ~]$ ps -el | grep samp
0 T  1000  30399  29828  0  80   0 - 28321 do_sig pts/2    00:00:00 sample.sh
[linuxstudy@xxxx ~]$ kill -SIGTERM 30399
[linuxstudy@xxxx ~]$ ps -el | grep samp    //SIGTERMでは消滅しない
0 T  1000  30399  29828  0  80   0 - 28321 do_sig pts/2    00:00:00 sample.sh
[linuxstudy@xxxx ~]$ kill -SIGKILL 30399
[linuxstudy@xxxx ~]$ ps -el | grep samp    //SIGKILLにより強制消滅
```
### 数字でシグナル指定
```
[linuxstudy@xxxx ~]$ ps -el | grep samp
0 T  1000  30523  29828  0  80   0 - 28321 do_sig pts/2    00:00:00 sample.sh
[linuxstudy@xxxx ~]$ kill -15 30523
[linuxstudy@xxxx ~]$ ps -el | grep samp   //-15(SIGTERM)で消滅しない
0 T  1000  30523  29828  0  80   0 - 28321 do_sig pts/2    00:00:00 sample.sh
[linuxstudy@xxxx ~]$ kill -9 30523     //-9(SIGKILL)により強制消滅
[linuxstudy@xxxx ~]$ ps -el | grep samp
```
「ハッカーと画家」を読んだ際の個人的なメモ

# この記事について
「[ハッカーと画家]()」を読んだ際の個人的なメモです。
特に覚えて起きたいと思った内容は、2章「ハッカーと画家」、9章「ものつくりのセンス」、そして12章の「普通のやつらの上を行け」の３つで、今回はこれら３つの内容について整理しました。
# ハッカーと画家
- ハッキングと絵を書くことには共通点があり研究活動とは違うが、計算機科学という言葉の中には、数学者と科学者とハッカーが詰め込まれている。だから、ハッカー達にとってハッキングが「科学」と呼ばれると、ハッカーたちは科学的に振る舞わなくてはいけないような気になってしまう。
<br></br>
- ハッカーが実際にやってることは美しいソフトウェアをデザインすることで、それを測るのは難しい。
<br></br>
- あなたが計算機化学科にいるとしたら、ハッキングは理論計算機科学に対する応用だと思ってしまうかもしれない。けれどそれは間違いで、ハッカーは、画家が絵の具に関する化学を理解するのと同程度に計算理論を理解していれば良い。
<br></br>
- ハッカーは科学者ではなく芸術家に近い。だから、アイデアの源泉はものを創る人々から得るべきで、メチャクチャなコードをおっぴろげながらそれを次第に形にしていく作業はまさしく彼等がスケッチをするのと同じなのだ。
<br></br>
- すごいソフトを書くなら、昼間に仕事をし、別の時間に美しいソフトウェアを書くようにしよう。ほとんど全てのものを創る人たちは駆け出しの頃には昼の仕事を持っていた。画家と小説家は特に。
<br></br>
- 絵を描くことは、ハッキングに対してどのようなことを教えてくれるのか参考にしてみるといい。一つ学べることとして、画家は絵を描くことを絵を描きながら学んでいく。場合によっては模写をすることもあるだろう。つまり、これはハッキングを学ぶ際にも同じことだ。
<br></br>
- 共感力は必要だ。共感するということはなにも自己犠牲を意味するものではない。多くのもの創りたちは、観客が必要としているものを理解することで、偉大な作品を創り上げてきた。だからこそ人々は作品に興味を持つのだ。共感能力は偉大なハッカーに必要不可欠な能力である。

# ものつくりのセンス
- 良いデザインは単純である。
よいものを創り出そうと考えると、皆作品を装飾してしまう。けれど、これは内容の凡庸さを隠すための装飾であってはならない。
<br></br>
- 良いデザインは永遠である。
醜い解は最良の解にはなり得ず、いずれ誰かが最良の解を見つけてしまうだろう。そうなったら醜い解は残らない。
<br></br>
- 良いデザインは正しい問題を解決する
あまりよく理解出来なかったので、文章を読む限りの個人的な考えとしては、解決したい問題とは関係のない問題を増やさないこと、と言っているように思えた。
<br></br>
- 良いデザインは想像力を想起する
プログラムにおいては、ユーザが自分の思い通りに、その使用用途を色々と想像できるような、少数の基本要素を提供するべきだ。
<br></br>
- 良いデザインはしばしばちょっと滑稽だ
これは全てのデザインに当てはまるものではない。
<br></br>
- 良いデザインをするのは難しい
困難な問題は多大な努力を必要とする。流行や装飾は、そもそも困難な問題を解く際には、中に入る余地もないだろう。
<br></br>
- 良いデザインは簡単に見える
簡単に見える良いものは、その背後にとてつもない試行錯誤がある。
<br></br>
- 良いデザインは対称性を使う
対称性には二種類合ある。繰り返しと再帰だ。これは建築、文章、植物、数学、工学などで頻繁に現れる。
<br></br>
- 良いデザインは自然に似る
自然は問題を解くのに、非常に長い時間をかけてきたから、参考にする価値がある。
あなたの解が自然の解に似ていたら、それは良いしるしだろう。
<br></br>
- 良いデザインは再デザインだ
最初からうまくできるということは滅多に無い。だからこそ不満足な点は何度も突き詰めなければならない。
<br></br>
- 良いデザインは模倣する
これもあまり理解が追いつきませんでした。
<br></br>
- 良いデザインはしばしば奇妙だ
これはそのままの意味
<br></br>
- 良いデザインは集団で生起する
関連した問題を解こうとしている才能ある人々のコミュニティほどパワフルなものはない。
<br></br>
- 良いデザインはしばしば大胆だ
今までのものより、俺ならもっと良いものが作れると考えることが偉大な仕事の発端。
今までのものより目新しいからこそ大胆になる？
どこを直せばよいのか知る嗅覚を得るためには、しっかり勉強しなくちゃならない。そうしてその分野で熟練者になれば、よりよい方法でハックしたいという欲求が芽生えてくる。

# 普通の奴らの上を行け
- 「ほげ言語」のパラドックス
全てのプログラミング言語のちからの違いを見分けることができるのは、最もパワフルな言語を理解するプログラマのみである。
あるプログラマが「ほげ」言語を使っているとしたら、きっと他の言語をこう見下すことになる。「あれにはほげ言語にある機能xすらないもんな」と。そして「ほげ」言語よりもパワフルな言語を見たときには、これらは「ほげ」と同じぐらいパワフルなんだろうけど、どういうわけかふわふわしたおまけが色々ついているな、と思うだろう。彼にとっては「ほげ」言語だけが全てで、それを中心に他の言語を見てしまうからだ。
# 最後に
３つの章からそれぞれ内容を取り上げましたが、個人的には2章と9章が一刺さりました。

例えば2章であれば、「ハッキングと研究は違う」というところです。私は今大学生ですが、高度なハッキングというものは、やはりどうしても科学としての研究活動が関係してくるような気がしていたので、言い当てられてとても変な気分になりました。

また9章であれば同じことをC言語で考えていました。なんでそんな面倒で抽象的な機能がいっぱいついた言語がこんなにあるんだいと。今思うと無知ゆえの浅慮でした。
PictureBoxとスクロールバーを連動させて、Wheelでの縦横スクロールも可能にする

# 目的

実現したい課題は表題そのものです
ここでの着目点は「**横スクロール**」です

# バックグラウンド

`C#`で`PictureBox`に表示した画像にスクロールバーを付け足したい、と云う要望に関しては、dobonさんのサイト``（いつもお世話になっております…）``でそのものズバリのスマートな回答が [スクロールバーを付けて画像を表示する](https://dobon.net/vb/dotnet/graphics/scrollimage.html) として纏まっています

スクロールバーが出るので、マウスホイールも使えはするのですが、残念ながら縦スクロールしかできません

何とかせねばっ！

# スクロールバー連携のおさらい

ちょっと重要なので、軽く対応方法を振り返っておきます

1.`Panel`を置く
　`AutoScroll`プロパティを`true`にする
2.その上に`PictureBox`を置く
　`Location`プロパティは`(0, 0)`にする
　`SizeMode`プロパティは`AutoSize`にする
　`Dock`プロパティは`None`で（ここ重要）
3.`PictureBox`の`Image`プロパティに表示したい画像を放り込む
　`Panel`のサイズに収まらなければ、勝手にスクロールバーが出る（`Panel`側に）

…では、ホイールでの縦横スクロールについて説明していきましょう

 # 対応方法

 まずはホイール回した際のイベントを拾わなければ話は始まりません
 これは以下…

 ```C#:フォームのコンストラクタ
 public Form1() {
     InitializeComponent();

     pictureBox1.MouseWheel += PictureBox1_MouseWheel;    // <== これを追加
 }
 ```

 なんでか知らんが`MouseWheel`イベントは`[Browsable(false)]`で、プロパティウィンドウのイベントリスト内に出てこない為、しょうがないから手で追加します

 で、ハンドラの中身は以下です

 ```C#:MouseWheelハンドラの中身
 private void PictureBox1_MouseWheel(object sender, MouseEventArgs e) {
    if (Control.ModifierKeys.HasFlag(Keys.Shift))
        panel1.AutoScrollPosition = new Point(panel1.HorizontalScroll.Value - e.Delta, panel1.VerticalScroll.Value);
    else
        panel1.AutoScrollPosition = new Point(panel1.HorizontalScroll.Value, panel1.VerticalScroll.Value - e.Delta);
    ((HandledMouseEventArgs)e).Handled = true;
 }
 ```

解説すると———
- `MouseWheel`ハンドラに流れてきたときに、`Shift`キーが押されていれば`Point.X`の方・押されていなければ`Point.Y`の方、を`Delta`で調整してあげる
- スクロール処理しちゃったので`Handled`を`true`にして、もうこれ以上余計な事はしないでくれ！　と申し伝える

 ここでの重要ポイントは、`MouseWheel`イベントを捕まえるのは`PictureBox`の方で、そのイベントハンドラの中では`Panel`のプロパティを触っている、と云う処でしょうか…
 `Panel`の`MouseWheel`イベントを捕まえた段階では、もう既にスクロール処理が終わってしまっている様で上手くいきません
 
ここで、おさらいした`Panel`と`PictureBox`の関係が生きてきます
`PictureBox`は`Panel`の上に乗っているので先に`PictureBox`で捕まえて独自のスクロール処理を施した上で`Handled`に`true`をセットする事により、その裏にある`Panel`は「もう自分の出番はないな」と`MouseWheel`のイベント処理はスキップしてくれる、というカラクリです

# 〆

これで自作のアプリでも、`Excel`（Micoroft365の方）や`GIMP`などの様にホイール使っての縦横スクロールが実現でき………
<br><br><br>
と、ここにきて、ふと心配になりました
私のパソコンってホイールの回転、逆向き仕様です
`Delta`の調整って設定によらないよね？
<br>

> 「いやー、んなこたねーだろ」と思いながらも———

あ、大丈夫みたいです
さすがにそんな事は無かったという事で…
mysqliを使ってmysqlに接続してみる

以前PDOクラスを使用してmysqlに接続してデータベースを操作する方法を書きました。今回はmysqliを使ってphpからmysqlに接続する方法を書きます。
よく考えたらPDOクラスの方が汎用性高いのでこっちの記事を先に書くべきだったかもですね。
自分用のまとめなので間違いや省略などあります。間違いに関しては指摘していただけると幸いです。

## データベースに接続
mysqli_connect関数を使用してデータベースに接続します。また、接続できたらtrue、できなかったらfalseが帰ってきます。
```php
$link = mysqli_connect('host','user','password','DB');
//引数はホストorIPアドレス、ユーザ名、パスワード、データベース名
```
## 接続に失敗した時エラーを出力
なにかしら問題があってエラーが発生した時はmysqli_connect_error関数を使ってエラーを出力します。

```php
if(!$link){
    echo "エラー : データベースに接続できませんでした。" . PHP_EOL;
    echo mysqli_connect_error() . PHP_EOL;
    exit;
}else{
    echo "データベースに接続できました。" . PHP_EOL;
}
```

## クエリの実行
クエリの実行にはmysqli_query関数を使用します。
引数は接続時にmysqli_connect関数の返り値を入れた変数です。引数はmysqli_connectの戻り値とsql文が入った変数です。
```php
$result = mysqli_query($link, $sql);
```
返り値がないもの(insert)などは成功するとtrue、selectなど返り値があるものは$resultに結果が格納されます。



もし、失敗した場合mysqli_error関数を使うことでエラーログの出力が可能です。引数はmysqli_connectの戻り値です。
```php
echo mysqli_error($link);
```

## SELECTで取得した文を表示する
実行結果は連想配列として保存され、それをwhileで回しながら出力していくイメージです。
foreach文ばっか使っていましたから少し違和感ですよね。
```php
$sql = 'select * from table';
$result = mysqli_query($link, $sql);

while ($value = mysqli_fetch_assoc($result)) {
    var_export($value);
}
```
```
array (
  'id' => '1',
  'name' => 'tanaka'
  'birthplace' => 'Japan'
)array (
  'id' => '2',
  'name' => 'suzuki'
  'birthplace' => 'Japan'
)
```

## SQL文に変数を埋め込んで実行する
```php
$name = 'keia';
$birthplace = 'Japan';
$sql = <<<EOT
INSERT INTO table (name, birthplace) 
VALUES("{$name}", "{$birthplace}")
EOT;

$result = mysqli_query($link, $sql);
```
このようにすることでSQL文に変数を埋め込んで実行することが可能になります。
mysqliのオブジェクト型だと以下の方法もあります
```php
$link = new mysqli('host', 'user', 'pass', 'DB');
$sql = INSERT INTO table (name, birthplace) VALUES(?,?);
$stmt = $link->prepare($sql);
$stmt->bind_param('ss', $name, $birthplace); //第一引数は型、$nameも$birthplaceもstringなのでssになる
```

## 処理が終わったらメモリの解放を！
前述した通り結果はメモリに保存されます。メモリの圧迫を避けるためにも取得した結果の使用が終わったらメモリの解放をしていきます。
```php
mysqli_free_result($result);
```

## 切断
切断する時はmysqli_close関数を使用します。
```php
mysqli_close($link);
```



## まとめ
まだまだなので追記していこうと思います。
【ST言語ことはじめ】タイマーを利用したプログラム例

## はじめに

タイマーは、プログラム可能なロジックコントローラー（PLC）で時間ベースの制御を実現するための重要な機能です。本記事では、タイマーを活用したプログラム例を紹介します。

## 使用機材

|   |機種など   |
|:---:|------|
|PLC  |Q02CPU, QX41, QY41P, Q62P, Q38B    |
|アプリ  |GX Works 2    |

I/O割り付けはこちらを[参照](https://qiita.com/so2/items/0f0cab2e324179718b89 "I/O割り付け表")

## タイマーを利用したプログラム例

以下のサンプルコードは、タイマーを利用して入力信号に応じて出力を制御するプログラム例です。
ボタン１を押してから5秒後にランプ１が点灯します。ボタン２で消灯します。

```ST
OUT_T(M1, TC1, K50);

IF X1 THEN
    M1 := TRUE;
END_IF;

IF X2 THEN
    RST(TRUE, T1);
    M1 := FALSE;
END_IF;

Y71 := TS1;
```

### コード解説

- `OUT_T(M1,TC1,K50);`：出力 `M1` をタイマー `TC1` を使用して50単位の時間で制御します。
- `IF X1 THEN M1:=TRUE; END_IF;`：入力 `X1` が True の場合、出力 `M1` を True に設定します。
- `IF X2 THEN RST(TRUE,T1); M1:=FALSE; END_IF;`：入力 `X2` が True の場合、タイマー `T1` をリセットし、出力 `M1` を False に設定します。
- `Y71:=TS1;`：タイマー `TS1` の値を出力 `Y71` に代入します。

## タイマーを利用したプログラム例　その２

ボタン１を押した3秒後にランプ１、その後も3秒ごとにランプ２、ランプ３と点灯します。ボタン２で消灯します。

```st
OUT_T(M0, TC1, K30);

IF X1 OR M1 THEN
    M0 := TRUE;
END_IF;

IF X2 THEN
    M0 := FALSE;
    M1 := FALSE;
    M2 := FALSE;
    M3 := FALSE;
    RST(TRUE, T1);
END_IF;

IF TS1 AND M2 THEN
    M3 := TRUE;
    M0 := FALSE;
    RST(TRUE, T1);
END_IF;

IF TS1 AND M1 THEN
    M2 := TRUE;
    M0 := FALSE;
    RST(TRUE, T1);
END_IF;

IF TS1 THEN
    M1 := TRUE;
    M0 := FALSE;
    RST(TRUE, T1);
END_IF;

Y71 := M1;
Y72 := M2;
Y73 := M3;
```

### コード解説

- `OUT_T(M0, TC1, K30);`：出力 `M0` をタイマー `TC1` を使用して30単位の時間で制御します。
- `IF X1 OR M1 THEN ... END_IF;`：もし入力 `X1` またはメモリビット `M1` が True の場合、出力 `M0` を True に設定します。
- `IF X2 THEN ... END_IF;`：もし入力 `X2` が True の場合、出力 `M0` を False に設定し、`M1`、`M2`、`M3`、`T1` をリセットします。
- `IF TS1 AND M2 THEN ... END_IF;`：もしタイマー `TS1` とメモリビット `M2` が同時に True の場合、出力 `M3` を有効にし、出力 `M0` を無効にし、タイマー `T1` をリセットします。
- `IF TS1 AND M1 THEN ... END_IF;`：もしタイマー `TS1` とメモリビット `M1` が同時に True の場合、出力 `M2` を有効にし、出力 `M0` を無効にし、タイマー `T1` をリセットします。
- `IF TS1 THEN ... END_IF;`：もしタイマー `TS1` が True の場合、出力 `M1` を有効にし、出力 `M0` を無効にし、タイマー `T1` をリセットします。

## まとめ

本記事では、タイマーを利用したプログラム例を紹介しました。タイマーを活用することで、時間に基づいた正確な制御を実現することができます。ST言語の基本的な構文とタイマーの使い方をマスターして、効率的な制御プログラムを開発しましょう。