OmniAICreator/Qiita-1.07M huggingface dataset:
awsLinux2023のイメージをWSLで利用する

Windowsを利用しているとWSLでUbuntuを利用すると便利なので、ここにawsLinux2023が入らないかな？と思い調べたら以外に簡単に入ったので方法を下記に記載したいと思います。

まずは検索して直ぐに見つかった参考ページです。
<a href="https://qiita.com/noumia/items/9fecd2a7c3ea4acb696e">WSL で Amazon Linux 2 を使用する</a>
このページの方法でイメージファイルを2023にすればできるかな？と考え、
先ずはイメージファイルを探しをしましたが、仮想マシン用ではawsLinux2しか見当たらないため、Dockerのリソースから取得しました。
<a href="https://hub.docker.com/_/amazonlinux">https://hub.docker.com/_/amazonlinux</a>
のサイトより下記イメージをDownload

<code>
curl -OL https://amazon-linux-docker-sources.s3.amazonaws.com/al2023/2023.4.20240401.1/al2023-container-2023.4.20240401.1-x86_64.tar.xz
</code>

配布ファイルが、tar.xz フォーマットなので、tar.gz フォーマットへ圧縮変換します。
xz, gzip 等の変換ツールは、Git for Windows 等に付属しているものを使用する。

<code>
xz -d -c al2023-container-2023.4.20240401.1-x86_64.tar.xz | gzip > rootfs.tar.gz
</code>

---
### <a href="https://github.com/noumia/wsl-toyc/releases/download/v1.0/wsl-toyc.zip">GitHub - noumia/wsl-toyc</a>
wsl-toyc.zipを取得してイメージ保存したい場所で展開
<dl>
  <dt>wsl-toyc</dt>
  <dd>create-toyc.exe</dd>
  <dd>launch-toyc.exe</dd>
  <dd>setup.cmd</dd>
</dl>
「wsl-toyc」を保存したいWSLのディストリビューション名に変換、今回は「amzn2023」にします。
「launch-toyc.exe」も「amzn2023.exe」にリネームしてDirを１つ上に移動し、先ほど圧縮変したawsLinux2023イメージ「rootfs.tar.gz」をこのDirに保存します。

<dl>
  <dt>amzn2023.exe　　　<em>・・・launch-toyc.exeをリネーム＋移動</em></dt>
  <dt>amzn2023　　　<em>・・・リネーム</em></dt>
  <dd>create-toyc.exe</dd>
  <dd>setup.cmd</dd>
  <dd>rootfs.tar.gz　　　<em>・・・tar.gzに変換したOSイメージを追加</em></dt>
</dl>

作業が完了したら<b>管理者権限</b> で「amzn2023/create-toyc.exe」を実行してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689987/5e8c5e1c-b518-4b84-55a6-e41939dd5ada.png)

「ext4.vhdx」の仮想HDDイメージが作成されてWSLにはディストリビューション名「amzn2023」が登録されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689987/ecff9baa-a561-5099-fa2b-7d3c7cfb6035.png)

起動方法は、「wsl -d amzn2023」で起動します。
「dnf update」でアップデート掛け、「dnf install vi* wget」で vi と wget を取得します。
（　Curlは入ってました。）
Beepがうるさいので、「vi /etc/inputrc」で２行目の「#set bell-style none」の「#」コメントを消して保存。
ログアウトして入り直すとBeepは出力されなくなってます。
gcc などの開発ツールが利用したい場合は、「dnf groupinstall "Development Tools"」でインストールできます。
AWS-CLIも「dnf install awscli」でインストールできます。

---

不要になったらディストリビューション名指定でWSLから登録を削除し、本体のファイルを削除します。
wsl --unregister amzn2023
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689987/84092c58-0fde-6c32-6a68-940ccbc275c9.png)

簡単に登録・削除できるので、開発環境毎に作成しても問題ないかと思います。

# 参考
https://hub.docker.com/_/amazonlinux
<a href="https://qiita.com/noumia/items/9fecd2a7c3ea4acb696e">WSL で Amazon Linux 2 を使用する</a>
<a href="https://zenn.dev/takaha4k/articles/b3a8efe498eed3">WSLの不要なディストリビューションを消す</a>
[設計]出口を明確化した設計について

# 完全に主観な内容
システムを設計・構築するにあたって、個人的にめっちゃ気にしたいことメモレベルな拙い文章で書くので、よろしくお願いします。

# アプリやシステムの出口を決める
システムに限らず、日々の生活の何をするにしろきちんと出口を決めないか？と言う事をダラダラ書いていきます。

「出口」：要はアウトプットになるものをちゃんと決めようってお話。

業務系アプリばかりやってきたので、自分が思うアウトプットというのは、
主に __帳票やCSV(他シスに渡す用)__ と言った、物理的（紙とかファイル）に出力するものと考えています。

なのでまずは、そのアウトプットに必要な項目の洗い出しを行い、
その項目を算出するためには他にどんな項目が必要なのかというのを決めていくって方針で進めて行きたいわけですよ。

完全にデータ構造を先行で考えて、後からソレをどこで登録するかっていうのを考える、データ主導型の設計をしたいわけ。


# 立ちはだかる壁1(顧客)
ただお客様の中には先に画面イメージをガンガン決めていく見た目重視なお客様もいらっしゃるので
- 「その項目そこで登録するのおかしくね？」
- 「この画面でこの項目も登録出来たらいいのに…」

みたいなシステムが出来上がっちゃうわけですよ。
うん、仕事受ける側がイエスマンだった時の典型的なアレだね。

イヤね、大枠の見た目（ボタンの色味や表の見え方、文字のサイズなど）を決めるだけならいいんだけど「この画面とこの画面が必要で、この画面にはこの項目が必要だよ！」みたいな、細かい部分まで指定が入るとソレを基準にデータの登録順とか考慮しなきゃならんケースもあるので、結構アレなんだよね。。。


# 立ちはだかる壁2(企画提案者)
イヤね、提案するのに画面イメージなど有ったほうが心象よかったり、話がスムーズに進むのは分かるんだけど、
結局その画面で登録したものを最終的にどうしたいの？って言う話が結構おざなりになってしまい、
ある程度画面が出来上がってから「じゃあ、この項目とこの項目を帳票に出して」みたいな時に

__「アレ？コレ結合すんの無理じゃね？この画面でこの項目たさないとダメじゃね？」__

みたいなことが起こらないとも言い切れないよねって。
ましてや画面作成で大炎上とかしてスケジュールカツカツの時にそんなの見つかったら、
もう船橋駅で成田エクスプレスにダイブしたくもなっちゃうよね。
※天下の新小岩はホームに壁が出来たので飛べないね

# 大事なのは分かる
見た目が大事なのは分かる。
人も見た目でカッコいい・カワイイ・キレイ・キタナイ・顔面のパーツが真ん中に寄り過ぎてるなど細かくカテゴライズされるので、
そりゃ作れるもんなら先進的でクリエイティブでアクティブでポジティブでクールなものを作りたいとは思うけど、
それで中身スッカスカ（グッチャグッチャのスパゲッティなコード）だったら、ソレって使えるの？ってならんか？

とりあえず見た目がアレでも中身しっかりしてる方が安心しない？って思うわけよ。
だってほら、昔CMでも言ってたじゃん、__カワイイは作れる ~~（ブ◯は隠せる）~~__ って（ルッキズム的にはアウトな感じ

## 後から変えられることは優先度：低で
データ構造みたいな1度基盤を決めたら変更が厳しいものは、最優先でキチンと設計をしたうえで、
見た目（文字色だったりフォントサイズだったり余白だったり）みたいなイベントや処理に何ら影響のない部分については、アプリが出来上がった後からいくらでも変えることが出来るものについては後から考えませんかって言うお話でした。
【Android／Java】アプリ間データ共有 その２（Android11）

## やりたいこと
アプリ間でデータの共有を行いたい
片方のアプリがプロセスKillされている状態でもデータの参照を行えるようにしたい

以前、非推奨のSharedUserIDを使って実現したが、推奨、かつ簡単に行える実装（SystemProperties）をみつけたので備忘録

## Step1．SystemPropertiesとは
Androidのデバイス動作や設定を制御するキーと値のペアが格納されているもの。
#### ADBコマンド例
~~~cmd
# デバイスのモデル名をシステムプロパティから取得する
adb shell getprop ro.product.model
~~~~

## Step2．実装方法
### SystemPropertiesへの書き込み
任意のキーを指定して、値を書き込む
~~~java
public void writeSystemProperties(String key, String val) {
    try {
        @SuppressLint("PrivateApi")
        Class<?> SystemProperties = Class.forName("android.os.SystemProperties");

        @SuppressWarnings("rawtypes")
        Class[] paramTypes = {String.class, String.class};
        Method set = SystemProperties.getMethod("set", paramTypes);

        Object[] params = {key, val};
        set.invoke(SystemProperties, params);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // hoge.fugaというキーで、testtestを書き込む
    writeSystemProperties("hoge.fuga", "testtest");
}
~~~~

### SystemPropertiesの読み込み
任意のキーを指定して、値を読み込む
Android標準のキーを指定して読み込むことも可
~~~java
public String readSystemProperties(String key) {
    String ret;
    try {
        @SuppressLint("PrivateApi")
        Class<?> SystemProperties = Class.forName("android.os.SystemProperties");

        @SuppressWarnings("rawtypes")
        Class[] paramTypes = {String.class};
        Method get = SystemProperties.getMethod("get", paramTypes);

        Object[] params = {key};
        ret = (String) get.invoke(SystemProperties, params);
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return ret;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // hoge.fugaというキー読み込む
    String result = readSystemProperties("hoge.fuga");
}
~~~~

### 最後に
SystemProperties経由で、アプリA→アプリBへのデータ渡しが簡単に行える半面、端末を再起動すると設定したSystemPropertiesの値が吹っ飛んでしまうため、使い方を選ぶ必要があると思う
。
。
。
もう時期、春イカのシーズンがくるので釣りに行きたい40代おっさんのたわごとでした
Windows11で右クリックメニュー『その他のオプションを確認』をせずに最初からWin10時代の右クリックメニューとなるように設定

# 概要

Windows11で右クリックすると『その他のオプションを確認』があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/60d4371b-c4c0-2f1b-7936-f23ee1384eb0.png)

これを押すと下記に切り替わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e0155b83-045a-cdc0-c2c1-043517bf1c3b.png)

この切り替えをいちいちやるのが面倒。
あと、最初の右クリックメニューにTortoiseGitとかサクラエディターのメニューが無いので不便。

**最初からWin10時代の右クリックメニューが出るように設定変更したい。**

# やり方

レジストリーエディターで下記に行きます。

```
HKEY_CURRENT_USER\Software\Classes\CLSID
```

『CLSID』上で右クリック ⇒ 『新規』 ⇒ 『キー』。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/fc386389-b8ca-dd8c-6141-105517a580dc.png)

新規キーの名前は
```{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}```

その追加した新規キー上で右クリック ⇒ 『新規』 ⇒ 『キー』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e573d8b6-4989-7dbf-b213-e96fae9ee481.png)

新規キーの名前は
```InprocServer32```

```InprocServer32``` の値のデータは空で設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/215986a9-f198-de70-ed94-081065b4bcbf.png)

最終系は下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/971c8c9c-4ecb-9530-bf92-c645e4d88cde.png)

最後にOS再起動して設定おわり。

# 反映されない場合

タスクマネージャーでエクスプローラーを再起動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ce9ad0e1-dc19-c820-1f0c-c10d0c16c323.png)


# 参考サイトさん

https://pc-karuma.net/right-click-context-menu-back-on-windows-11/

https://func.jp/windows11-right-click-menu-old-spec/

# バージョン

Microsoft Windows [Version 10.0.22631.3447]
Knowledge Version 



+ [記事ですべてのバージョンの合計数を取得する](https://qiita.com/Keiji_otsubo/items/9283748178a18dd921e4)

+ [I see a field Action on the version list but I cannot find any information on how it is populated or can be populated and if I cannot use it how do I remove it.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T40TvSAJ)

:::note
You mean this standard component, right?
I don't think this component can be edited.

I think it is possible to create and place a custom component with no action.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e5e6c898-61a1-33b0-2a74-fcb9cc158d53.png)

+ [Lightning Knowledge has no related list for article version history [closed]](https://salesforce.stackexchange.com/questions/312482/lightning-knowledge-has-no-related-list-for-article-version-history)
:::

+ [How to maintain article version in lightning ?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T40TvSAJ)

:::note
ナレッジアクションで「公開」から「新規として公開」に変更してください。これにより、ナレッジ記事が承認プロセスを経て承認されると、ナレッジ記事を単に公開するのではなく、新しいナレッジ記事として公開するアクションが発生するため、問題は解決されました。

In the Knowledge Action, please changed it from "Publish" to "Publish as New". This resolved the issue as a Knowledge Article that goes through the approval process and is approved would result in the action to publish the knowledge article as a new one rather than just publishing it.
https://success.salesforce.com/answers?id=9063A000000pajqQAA
https://help.salesforce.com/articleView?id=knowledge_article_versions.htm&type=5
https://help.salesforce.com/articleView?id=knowledge_article_versions.htm&type=5
:::

:::note
That field populates automatically for us - see my screenshot for an article revised several times. Usually, the first action is "published article" but it updates as you move on with further revisions. For example, when I published this article for the first time, the action was "published article". But when I published the second version, the first version Action updated to "archived article". I don't believe you can control what goes there but I would think you should see a value based on the actions you take on the article - definitely Publishing an article. Perhaps a support case is in order?

このフィールドは自動的に入力されます。何度か改訂された記事のスクリーンショットを参照してください。通常、最初のアクションは「記事の公開」ですが、さらに改訂を進めると更新されます。たとえば、この記事を初めて公開したとき、アクションは「記事を公開」でした。しかし、2 番目のバージョンを公開すると、最初のバージョンのアクションが「アーカイブされた記事」に更新されました。そこに何を入れるかを制御できるとは思えませんが、記事に対して実行したアクションに基づいて値が表示されるはずだと思います。間違いなく記事の公開です。おそらくサポートケースが必要なのでしょうか?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/69b3843a-8fda-83d0-18f2-f96927572599.png)
:::



# 関連資料

https://www.salesforceben.com/introduction-salesforce-knowledge/
ネストしたループ処理にラベルを貼り、条件を満たしたら抜ける方法（JavaScript）

## ネストしたループから抜けるには
JSのループ（for）から抜けるにはbreak、処理を終えるにはreturnを使えばいいですが、ネストしたループにおいて、特定の条件を満たしたらその全てから抜けるようにするには、工夫が必要です。
その一つの方法がループにラベルを貼る方法になります。

## ラベル付きループとは？
JavaScriptでは、ラベルを使ってループに名前をつけることができます。これにより、通常のループ構造の外側から内側のループを制御できます。ラベルを使用すると、内側のループを外側のループに関連付けることができます。

ラベル付きループは次のように構文されます。
```
outerloop: for (var i = 0; i < 5; i++) {
  innerloop: for (var j = 0; j < 3; j++) {
    if (i === 2 && j === 1) {
      break outerloop;
    }
    console.log('i = ' + i + ', j = ' + j);
  }
}
```
上記の例では、outerloopとinnerloopというラベルを使用しています。break outerloop;は、内側のループを外側のループ全体から抜け出すために使用されます。

以下の例では、2つの配列を持つ多重ループを使用し、各要素の組み合わせを出力します。
```
var array1 = [1, 2, 3];
var array2 = ['a', 'b', 'c'];

outerloop: for (var i = 0; i < array1.length; i++) {
  innerloop: for (var j = 0; j < array2.length; j++) {
    console.log(array1[i] + ' - ' + array2[j]);
  }
}
```
この例では、outerloopが外側のループを表し、innerloopが内側のループを表しています。これにより、各配列の要素の組み合わせが順番に表示されます。

### まとめ
今回のような、特定の条件を満たしたらネストしたループを抜けるケースの実装は、開発の現場において、それほど多くはないかもしれません。しかし、頭の片隅に置いておけば、きっとあなたの役に立つことでしょう。

### PR
弊社では一緒に働く仲間を募集しています！
ご興味を持っていただいた方は以下のリンクからぜひお問い合わせください。
https://www.wantedly.com/companies/company_1847744/projects
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f333632363338322f32316139343034312d646435662d653138322d303762372d3565613863386536313965352e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761966/6724656d-7afa-35ac-56f9-1e143f644758.png)
module : Entitlement Management for Lightning Experience 




# Get Started with Entitlements

+ [Unable to Apply the entitlement template to the product ](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bLG4i)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/49326b05-27bd-67fd-6d0e-35c4fc686f37.png)


:::note
If you are not able to see the entitlement option even in classic version, try adding Entitlement Templates from related list section to the page layout of products. For this search for products from quick find and select page layout and then select edit next to product layout and add "Entitlement Templates". 

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T4QOxSAN

I just found the strange part that the new entitltement template created directly under Entitlement tab does not really exist. I need to create the template from Setup/Entitlement template.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T4Nj7SAF


クラシック バージョンでも資格オプションが表示されない場合は、関連リスト セクションから製品のページ レイアウトに資格テンプレートを追加してみてください。この場合、クイック検索から製品を検索してページ レイアウトを選択し、製品レイアウトの横にある編集を選択して「資格テンプレート」を追加します

[資格] タブの直下に作成された新しい資格テンプレートが実際には存在しないという奇妙な部分を発見しました。セットアップ/資格テンプレートからテンプレートを作成する必要があります。
:::

+ [I have followed step by step the process for adding an entitlement to a product in playground and it is not showing up in classic.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J80iK)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/eed5b031-3db6-acc6-1c3f-ae4fe4625fe8.png)
Qiita記事の目次をつける方法

## この記事の目的

株式会社コムニコの窪田です！
Qiitaで記事を書く際に、下記のような目次を作る際の仕様がとってもふわふわしていて、わかりにくかったのでバシッと解決しようと思った次第です。

- [(3行で)弊社について](#3行で弊社について)
- [結論](#結論)
    - [Step1: リンク化を行う](#step1-リンク化を行う)
    - [Step2: 目次化する](#step2-目次化する)
- [リンク化の細かいルール](#リンク化の細かいルール)
- [SNSに興味があるエンジニアを求む！](#snsに興味があるエンジニアを求む！)

## (3行で)弊社について

3行で弊社について説明させてください！

株式会社コムニコは、SNSのプロフェッショナル集団が集まったSNSの総合代理店です。
React, Vue, Express(Node.jsベースのバックエンドFW)を利用して開発しています。
でき立てのもの〜10年選手のものまで自社プロダクトの開発に携われます！

## 結論

### Step1: リンク化を行う

1. 見出しにカーソルを当てると、下記の通りリンクマークが出てくる
→ これをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895998/61614368-e5c0-9b17-6cda-9989f1687afd.png)

2. ブラウザのURLに下記の通り「#step1-リンク化を行う」と出てくるので、
![スクリーンショット 2024-04-12 9.21.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895998/c51f668d-6b37-6561-250e-0a70c637d537.png)
→ これをコピーする
3. 2でコピーしたものを利用して`[hogehoge](#step1-リンク化を行う)` のように記述する
→ テキストリンク化ができる
リンク化したもの: [hogehoge](#step1-リンク化を行う)
※ hogehogeの部分は好きな文字列でOK

### Step2: 目次化する

リンク化した文字列を箇条書き形式にしてあげたら目次となります！
```
- [hogehoge](#step1-リンク化を行う)
```
実際には↓の通りになります。
- [hogehoge](#step1-リンク化を行う)

試しに、この記事の見出しに目次をつける場合、、、
↓のように書いたら、
```
- [(3行で)弊社について](#3行で弊社について)
- [いきなり結論](#いきなり結論)
    - [Step1: リンク化を行う](#step1-リンク化を行う)
    - [Step2: 目次化する](#step2-目次化する)
- [リンク化の細かいルール](#リンク化の細かいルール)
- [SNSに興味があるエンジニアを求む！](#snsに興味があるエンジニアを求む！)
```
↓の通りです！
- [(3行で)弊社について](#3行で弊社について)
- [いきなり結論](#いきなり結論)
    - [Step1: リンク化を行う](#step1-リンク化を行う)
    - [Step2: 目次化する](#step2-目次化する)
- [リンク化の細かいルール](#リンク化の細かいルール)
- [SNSに興味があるエンジニアを求む！](#snsに興味があるエンジニアを求む！)

## リンク化の細かいルール

参考までに、リンク化の際、 `()` の中に書く文字には下記のルールがあります。
* アルファベットはリンク先が大文字でも、全部小文字で表現する
* 半角スペース(` `)は「-」に書き換える
* `(`, `)`, `:` などなどの記号は全部ないものとして扱う

これを知ってれば、わざわざマウスオーバーしてリンクマークからコピペをしなくても、いつでもテキストリンク化することができます！

## SNSに興味があるエンジニアを求む！
株式会社コムニコは、SNSのプロフェッショナル集団が集まったSNSの総合代理店です。
エンジニアチームでは、X(旧Twitter)やFacebook, Instagramに関する3つのプロダクトの開発を行っています！

* SNSに興味がある
* 成長フェーズの自社プロダクト開発に興味がある
* 歴史の長い自社プロダクトの開発に興味がある
* フルスタックエンジニアのキャリアを築きたい！

そんなエンジニアを大募集しているので、興味のある方はぜひ下記のリンクをポチッとしていただければ幸いです！！
カジュアル面談でお会いしましょう！

https://hrmos.co/pages/lmg/jobs/1675114439462850596
【サブネットマスク】EC2のセキュリティーグループについて

# セキュリティーについて学ぶ備忘録
## 背景
業務でEC2を使ってバッチ処理を組む際に、セキュリティーグループをテキトーに設定して怒られたので戒めを込めた備忘録として残します。

## 結論
**0.0.0.0/0**はだめ！
接続するネットワークのIPをインバウンドルールに設定すること！

## EC2インスタンスを起動するときにネットワーク設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474207/52ba040f-f46c-463f-c999-65fb35152a30.png)

:::note warn
送信元が 0.0.0.0/0 のルールを指定すると、すべての IP アドレスからインスタンスにアクセスすることが許可されます。セキュリティグループのルールを設定して、既知の IP アドレスからのみアクセスできるようにすることをお勧めします
:::

この文言をしっかり読もうよっていう話ですね。
ここで設定しておかないとどからでSSHで接続できてしまうため、IPを指定しなければガバガバセキュリティーになってしまいます。

## IPアドレスの設定とサブネットマスク
IPアドレスは0.0.0.0の部分で、サブネットマスクはそれ以降の部分らしいです。
GPTに聞いてみたところ、以下の返答でした。

:::note
IPアドレスの「/」以降の部分はサブネットマスクを示しています。
これは「サブネットプレフィックス」とも呼ばれ、ネットワークの一部としてどの範囲のアドレスを使っているかを定義するために使われます。
この表記は特にCIDR（Classless Inter-Domain Routing）形式として知られています。

たとえば、IPアドレスが「192.168.1.1/24」と記されている場合、「/24」はそのネットワークが最初の24ビットをネットワーク部として使い、残りの8ビットをホスト部として使っていることを意味します。
この場合、サブネットマスクは255.255.255.0に相当し、ネットワーク内で使用可能なIPアドレスは192.168.1.1から192.168.1.254までとなります。

この表記法は、ネットワークをより効率的に分割し、ルーティングを最適化するために用いられます。
また、ネットワークの大きさや設計に応じて、/24よりも大きい数値（例えば/25、/26など）を使ってさらに細かく分割することも可能です。
:::

ざっくり、接続してるデバイスを制限するためのものみたいですね。
/0だとなんでもいいよってことみたいです。
一般的に使われる数値をGPTに教えてもらいました。
>/0

デフォルトルート：
ルーティングテーブルにおいて、特定の宛先に対するルートが存在しない場合に使用される最終的なルートとして機能します。
このルートは「キャッチオールルート」とも呼ばれ、どの他のルートも適合しないトラフィックを捕捉します。

>/8

サブネットマスク：255.0.0.0
この設定は、16,777,214台のデバイスをサポートする大規模なネットワーク（例えば、大企業やISPが使用する広域ネットワーク）に使用されます。

>/16

サブネットマスク：255.255.0.0
65,534台のデバイスをサポートできる中規模から大規模のネットワークに適しており、学校や大学のキャンパスネットワークなどに使われます。

>/24

サブネットマスク：255.255.255.0
最も一般的に使用される設定で、254台のデバイスをサポートします。小規模から中規模のオフィスや家庭ネットワークに適しています。

>/30

サブネットマスク：255.255.255.252
2台のデバイスが直接通信するためのポイントツーポイントリンク（例えば、2つのルータ間）に使用されます。利用可能なIPアドレスは2個です。

>/32

サブネットマスク：255.255.255.255
単一のデバイスに固有のIPアドレスを指定するために使用され、通常は特定のサーバーやデバイスへのルートを設定するために使われます。

個人で開発するときは/32で良さそうですね

## 【補足】グローバルアドレスとサブネット
0.0.0.0の部分がグローバルになっているIPアドレスで、基本的にこれを用いて通信を行う。
社内でサブネットを設定しており、ネットワークを細分化することによってデバイス単位までのアクセスコントロールができるとのこと。
例えば、管理部のサブネットからは多くの情報にアクセスできるけど、営業部のサブネットからは権限を絞るみたいなことができるみたい、、、
ネットワークって難しいですね


## 参考記事

https://www.cman.jp/network/term/subnet/

https://wa3.i-3-i.info/word11975.html
Affordance のデータセットを作る中で利用されているソースコードの例

論文からは実に学ぶ点が多い。
著者たちがどう考えているのかが見えてくる。
- どういうデータセットを使っているのか.
- データセットを作っている場合、どのようにデータセットを作っているのか。
- データセットを作るにはどのような手法を用いているのか。

Affordance　というタスクは、従来と問題の定式化が違ってくるので、セグメンテーションタスクとは違ったデータセットの作り方になる。

## COLMAP
https://colmap.github.io/

> COLMAP is a general-purpose Structure-from-Motion (SfM) and Multi-View Stereo (MVS) pipeline with a graphical and command-line interface. It offers a wide range of features for reconstruction of ordered and unordered image collections. The software is licensed under the new BSD license.

COLMAPについて
COLMAPは、グラフィカルおよびコマンドラインインターフェースを備えた、汎用のStructure-from-Motion（SfM）およびMulti-View Stereo（MVS）パイプラインです。COLMAPは、順序付きおよび順序なしの画像コレクションを再構築するための幅広い機能を提供します。
DeepL による和訳

- 解説記事 [COLMAPで動画から3D点群データを作成する](https://blog.goo.ne.jp/yoossh/e/d1278b39229eca47774fe5646a2bb2d7/?img=3a27b73629e017a7cece0d708907e25b)

- 解説記事 [誰もが現実世界をスマホで3D化できる時代がやってくるかも、という話【SfM】](https://note.com/lucky_deer0616/n/nc59c9eb10361)

- 解説記事 [COLMAP の使用上の注意](https://zxl19.github.io/colmap-note/)
中国語のページですが、日本語に翻訳できます。

#### Jetson での例
- [Jetson Nano 2GBにCOLMAPをインストールする（How to Install COLMAP on Jetson Nano 2GB）](https://tarenagashi.hatenablog.jp/entry/2020/12/29/154806)

- github [JetsonTX2-COLMAP-Structure-From-Motion-Library forked from colmap/colmap](https://github.com/KarimHassanieh/JetsonTX2-COLMAP-Structure-From-Motion-Library)



## XMEM
https://github.com/hkchengrex/XMem
[ECCV 2022] XMem: Long-Term Video Object Segmentation with an Atkinson-Shiffrin Memory Model

[pdf](https://arxiv.org/pdf/2207.07115.pdf)
[Inference](https://github.com/hkchengrex/XMem/blob/main/docs/INFERENCE.md)
- 動画に対してセグメンテーションをしている。
- 個々のフレームに対するセグメンテーションでは、フレーム間でセグメンテーションの連続性・一貫性がとれなくなる。
- だから動画に対するセグメンテーションが必要になる。

- `video segmentation sota` で検索してみよう。
- PaperWithCode [Video Object Segmentation](https://paperswithcode.com/task/video-object-segmentation)
- ここでもXMEMが並んでいる。
- GPUは必要である。
#### Install
- pip3 install -r requirement.txt 
- pip3 install -r requirement_demo.txt 
- [Interactive GUI for Demo](https://github.com/hkchengrex/XMem/blob/main/docs/DEMO.md)
    - 手順どおりに実行して import エラーを生じる場合がある。
    - その場合には、python3 -m pip install パッケージ名 を実行すること。
    - Qtがらみのエラーが出たら、そのエラーメッセージを検索して、必要なライブラリを追加すること。

## ARKit/ARCore
[Unity で ARKit & ARCore AR開発環境のマルチプラットーフォーム(iOS & Android)対応](https://qiita.com/taptappun/items/bc38a446a06c83bd1898)
- AR マーカーを使ってカメラの姿勢を算出している。
- カメラ自体で姿勢が分かる場合は不要。
【React】 フォームへ入力する度にフォーカスが外れてしまう場合の対応方法

#### はじめに
フォームへ入力する度にフォームからフォーカスが外れてしまう場合の対応方法について書きました。

参考資料は以下です。
[[React]フォーム入力の度にフォーカスが外れてしまうときに確認すべきこと2選 - Qiita](https://qiita.com/shunexe/items/5d88e255f18280d6941d)

#### ＜事象＞
フォームへテキストなどを入力する度にフォームからフォーカスが外れてしまう。

#### ＜原因＞
子コンポーネントを親コンポーネントのブロックの中で定義していたため。

親コンポーネント(Example)が再描画される度に小コンポーネント(InputForm)が新しく作成され、再描画される。
Reactがもともとフォーカスを当てていたエレメントが破棄され、新しくinputが作成される。そのためフォーカスが外れてしまう。

【例】
```react:Example.js（親コンポーネント）
const Example = () => {

  //useStateの定義
  const [inputText, setInputText] = useState("");//テキストボックス用のState

  //イベント
  const onChangeText = (e) => setInputText(e.target.value);//テキストボックス入力時

  // 入力エリアの表示
  const InputForm = ({ FormText, onChange }) => {
    return (
      <div className="input-area">
        <input id="add-text" value={FormText} onChange={onChange} />
      </div>
    )
  };

  return (
    <>
      <InputForm FormText={inputText} onChange={onChangeText} />
    </>
  );
};

```

#### ＜対応方法＞
子コンポーネントの定義をコンポーネントの外にすること。

【修正後】
```react:Example.js（親コンポーネント）
const Example = () => {

  //useStateの定義
  const [inputText, setInputText] = useState("");//テキストボックス用のState

  //イベント
  const onChangeText = (e) => setInputText(e.target.value);//テキストボックス入力時

  return (
    <>
      <InputForm FormText={inputText} onChange={onChangeText} />
    </>
  );
};

  // 入力エリアの表示
const InputForm = ({ FormText, onChange }) => {
  return (
    <div className="input-area">
      <input id="add-text" value={FormText} onChange={onChange} />
    </div>
  )
};
export default Example;
```
小説に絵をつけるGPTsを作成したのでご紹介したい

*画像などはこちらで紹介

https://note.com/equity2050/n/n294d1179cef7

*ユーザーとGPTsのインタラクションをフローで表現しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828981/10e18455-4d09-05c1-226f-655e4fb6dbb3.png)

*現在の設定は、わたしの小説とキャラクターが入っているので、それしかできませんが、中身を変えれば好きなものでできると思います。
##目的##
難しいことを分かりやすく広く伝えたい
*参考：ソフィーの世界(哲学)、ゴール(ロジカルシンキング)

##取組1##
論文や行政文書を基に小説を書く（2020年)

##取組2##
AIの汎用化に伴い、絵をつけたい。
GPTsの作成。

###機能###
1.Chapterの指定とクエリの指定により、シーンを抜き出す。
2.シーンとキャラクター設定、カメラの設定からプロンプトの作成
3.画家の設定とプロンプトから画像生成
4.マニュアルでお直し

###事前準備###
1.小説をchapterごとのテキストファイルにする
2.キャラクター設定をJsonで作成する(固定と可変に分ける)
3.カメラと画家の設定を作る
*コンテンツポリシーは回避するようにする

###操作内容###
1.chapterとクエリの指定
2.返答に対してcontinueと入れ続ける
3.chapterの回数繰り返す
*あとは自動でやってくれます。

##課題##
事前準備も自動化できるといいな。
外見プロフィールだけなので、性格プロフィールから
自動的に小説を作りたい。
User Engagement  > Enable Users to Learn in the Flow of Work


https://trailhead.salesforce.com/content/learn/modules/user-engagement/customize-the-help-menu

+ [No "New" button on "Learning Home" as per training module step](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007aiseM)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6e183916-fccd-9355-997b-dd217334da94.png)

Newをクリックする前に１つ説明が抜けている感じですね。

:::note
Try clicking on the Manage Learning Assignments tab

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0be31ce8-ca02-f470-63dd-1af6b7baa0e4.png)
:::


# Promote Feature Adoption and Discovery

+ [「次へ」ボタンが表示されません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007igGxF)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d6c445dd-254c-3c9b-f23e-ee002e1f01b6.png)

:::note
「次へ」ボタンがないことに注意してください。この「コンテンツ」ページで「画像レイアウト:本文上の画像」まで入力したら、「保存」をクリックしてください。すると「プロンプト設定」ページが表示されます。ここで「アクション ボタン ラベル」を入力して先に進みます。参考までにスクリーンショットを添付します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f8e9d550-2a88-2cc7-d99a-c0ca076783ba.png)
:::
vue-multiselect に対して Playwirght でマルチセレクトのテストをする

# Playwrightのテスト例


- 入力欄をクリックして選択肢を表示する
- 何かマルチセレクトでラベルを選ぶ

という手順でテストできた

```js
await page.locator('.multiselect__placeholder').click()
await page.click('li[role="option"]:has-text("選択肢のテキスト")')
```

# たどり着いた方法

vue-multiselectのあるページのHTMLを見ると色々とclassが割り振られているので、これを使った
他ではこれと思う指定をしても要素が not visible  とか言われてうまくいかないケースも多かった

![image](https://github.com/YumaInaura/YumaInaura/assets/13635059/7cecdb38-82ed-4ea2-ba19-4b1027981484)

# 参考

https://zenn.dev/yutaroshimamura/scraps/ba88d33c09d4ce


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
独習PHP学習メモ（Chapter2-データ型）

[PHP8技術者認定初級試験取得](https://www.phpexam.jp/summary/novice8)を目指しています🔰

公式の認定教材である[独習PHP第4版](https://www.amazon.co.jp/dp/4798168491/)での学習のアウトプット用の記事です。

## データ型の分類

1. スカラー型・・・1つの変数に1つの値だけを扱う（論理型、整数型、文字列型など）
1. 複合型・・・複数の値をまとめて扱う（配列型、オブジェクト型など）
1. 特殊型・・・上記どちらでもないもの（リソース型、ヌル型）

の3分類ができる。

## 論理型（bool）

**true** もしくは **false** で表現される。

PHPでは以下の値をfalseとみなす。

- 空文字、または文字列の0
- 整数型の0
- 浮動小数点型の0.0
- 空の配列
- null

それ以外をtrueとみなす。

## 整数型（int）

以下に分類される値を扱う。

- 10進数
- 2進数
- 8進数
- 16進数


## 浮動小数点型（float）

一般的な小数点数だけでなく、指数表現も存在する。
（ちょっと数学弱すぎて指数表現は解説読んでも分からなかった、、、）

## 文字列型（string）

シングルクォート、もしくは、ダブルクォートで括られた値。

```php
'こんにちは'
"Hello"
```

シングルクォートの文字列とダブルクォートの文字列は微妙に挙動が違う。

①変数を展開するかどうか

ダブルクォートは文字列に含まれた変数を展開できる。

```php
$title = 'ポケモン'
"これは{$title}です"

// 出力結果
これはポケモンです
```

②エスケープシーケンスを認識するかどうか

ダブルクォートはエスケープシーケンスを認識できる。

| エスケープシーケンス | 概要 |
|:-:|:-:|
| \n | 改行 |
| \t | 水平タブ |
| \v | 垂直タブ |

これらを認識できるのはダブルクォートのみである。

①と②の理由からPHPでは意図的に①と②にしたい場合以外は、シングルクォートでくくるものとしている。


## ヒアドキュメント

文字列型を表す方法としてヒアドキュメントという方法がある。
長い文字列を含む際に適した方法である。

```PHP:例
$title = 'ポケモン';

$message = <<< EOD
{$title}は、不思議な生き物と共に冒険を進めていくRPGです。
全部で1008種類もいます。
"かがくのちからってすげー!"
EOD;

print $message;

// 実行
ポケモンは、不思議な生き物と共に冒険を進めていくRPGです。
全部で1008種類もいます。
"かがくのちからってすげー!"
```

`<<<EOD〜EOD;`で囲んだ部分を全て文字列とみなす。

EODの部分は開始と終了が同じであれば、`<<<ABC~ABC;`でも構わない。
小文字でも動作するが全て大文字にするのが一般的である。

例えば、
`<<<"EOD"`や`<<<'EOD'`とすることも可能だが、シングルクォートの場合、先述したように変数が展開されない。
レコードページの編集でデフォルト組織を選択できない

2024年04月にちらほら見かける不思議な現象です。
別のブラウザにしてもらったら解決したみたい。

どちらも動的フォームの設定後というのが気になります。

+ [Unable to Complete Admin Maintenance Spring 23 since I'm not getting an option as set Org Default](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bLGKv)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/650ea01f-8ae6-430a-9f31-f8bce2fc45c2.png)


:::note
Trying in a different browser worked for me.
:::


+ [Get Hands-on with Enhance Record Pages with Dynamic Forms](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007aisHW)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/52e1e356-ec67-6c20-cb7c-6dadb0d4d145.png)

:::note
I tired using different browser i was able to assign. 
:::

+ [The 'Enhanced Case Layout' record page is not assigned as the org default.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bLJkK)

:::note
 I could able to successfully get the  "Assign as Org Default" button in Activation screen after I set "App Settings" and its "App Option". That helps me to assign the App as Org Default. BTW, I started this hands on challenge by creating a new Playground.

 「アプリ設定」とその「アプリオプション」を設定した後、アクティベーション画面で「組織のデフォルトとして割り当て」ボタンを正常に取得できました。これは、アプリを組織のデフォルトとして割り当てるのに役立ちます。ところで、私はこの実践的なチャレンジを新しいプレイグラウンドを作成することから始めました。
:::
なんでも深度推定してくれるDepthAnything

# 画像一枚で深度を推定
これだけ簡単に推定深度がわかると色々できる。

![Apr-12-2024 08-12-26.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/41125376-8997-9134-be32-a0a3ef4053bc.gif)

# 使い方

インストール

```shell
git clone https://github.com/LiheYoung/Depth-Anything.git
cd Depth-Anything
pip install -r requirements.txt
```

実行

```python
from depth_anything.dpt import DepthAnything
from depth_anything.util.transform import Resize, NormalizeImage, PrepareForNet

import cv2
import torch
from torchvision.transforms import Compose
import torch.nn.functional as F
import numpy as np

encoder = 'vits' # can also be 'vitb' or 'vitl'
depth_anything = DepthAnything.from_pretrained('LiheYoung/depth_anything_{:}14'.format(encoder)).eval()

transform = Compose([
    Resize(
        width=518,
        height=518,
        resize_target=False,
        keep_aspect_ratio=True,
        ensure_multiple_of=14,
        resize_method='lower_bound',
        image_interpolation_method=cv2.INTER_CUBIC,
    ),
    NormalizeImage(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    PrepareForNet(),
])

image = cv2.cvtColor(cv2.imread('bridge.jpg'), cv2.COLOR_BGR2RGB) / 255.0
image = transform({'image': image})['image']
input = torch.from_numpy(image).unsqueeze(0)

# depth shape: 1xHxW
result = depth_anything(input)

depth = result
h, w = image.shape[:2]
depth = (depth - depth.min()) / (depth.max() - depth.min()) * 255.0
depth = depth.detach().cpu().numpy().astype(np.uint8)
depth = depth[0]

cv2.imwrite("depth.jpg",depth)
```

![bridge.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/60115f63-2f50-7676-0903-655150d757f9.jpeg)
![94228a9d-66b8-4197-92e4-77e81a211c6b.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/3996e828-1bd9-f429-80d9-4a2daa48c4e9.jpeg)

ビデオでもできる。

```shell
python run_video.py --encoder vitl --video-path assets/examples_video --outdir video_depth_vis
```

🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[X](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
date_subtract()で日付の引き算:PostgreSQL16の新機能で遊んでみよう#2

### SQL関数date_subtract()について

日付時刻の減算ができる関数。

### PostgreSQL15(16以前)とPostgreSQL16では何が違うのか

タイムゾーンの指定の有無。
PostgreSQL15以前も、この関数は使えましたが
PostgreSQL16からは第3引数でタイムゾーンの指定ができるようになりより便利な関数となりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/7b527278-75d7-e00d-6a44-bd2efaa138cd.png)

### タイムゾーンとは何か

同じ標準時間を利用している地域の範囲のことです。
例えば沖縄が13時の時は北海道でも13時なので、沖縄と北海道は同じタイムゾーンです。

以上です。ここまで読んで頂きありがとうございました。
PostgreSQL16の新機能、ぜひ試してみてください！
【iOS】シミュレーターと実機で画面の背景色が異なってしまう場合

# 状況
某アプリの改修の業務をやっていまして、改修の中の1つとして、storyboardにて新しい画面(ViewController)を追加する必要が出てきたので、追加しました。
基本的な動作確認はXcodeのシミュレーターで行っていて、全ての画面は背景色は黒です。
中の実装も問題ないことを確認し、実機でビルドすると、新しく追加したビューだけ背景色が白く表示されてしまった。
なぜ？？シミュレーターでもXcodeでのStoryboardでの見た目もちゃんと黒くなっている。

でも、iPhoneの外観モードで、ダークとライトがあるが、ダークが選択された状態だった。これをライトにしたら正常に黒くなってなんで？？となった。
でも、他の既存の画面は外観モードがどっちでも背景色は正常に固定となっていた。

# 原因
色指定で、「Label Color」を選択していたのが原因だった。見た目は黒だったのでとりあえずこれを指定してしまっていてたが、他の画面はちゃんと「Black」を選択していた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179803/a47266e3-4c24-bac9-1dfe-14d8dcd6ebd4.png)


Label ColorはDynamic Colorを参照しているのかな。ググってもすっきりしない。

でも、普通に直接色をBlackとかRedとか指定したら、外観モードに左右されることはないことは分かってよかった。
GitHub Actionsを導入してみた

## はじめに
[AIによるプルリクのレビュー](https://qiita.com/sauna1137/items/b0890684d45d30777072)を行うためにGitHub Actionsを導入しました。
CI/CDと聞くと難しそうですが、想像よりも簡単に導入できたので紹介します。

## GitHub Actionsとは
GitHub公式のCI/CDサービスです。

## CI/CDとは
ソフトウェア開発の効率を上げ、リリースの速度を速めることを目的とした技術です。
コードを自動テスト、リリース準備ができたら自動的に本番環境にデプロイするような仕組みです。

Continuous Integration（継続的インテグレーション）
Continuous Delivery（継続的デリバリー）
Continuous Deployment (継続的デプロイメント)
の略称です。


## 導入してみる

公式ドキュメントが一番わかりやすいと思います。

https://docs.github.com/ja/actions/quickstart

初見では分かりづらかったymlファイルの追加まで紹介します。

**1. リポジトリのAdd fileからCreate fileする**
![スクリーンショット 2024-04-10 14.44.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/8c55f074-d0bb-fb62-d093-aa15051caa1a.png)


**2. GitHub Actionsに必要なファイルを作成します** 
![スクリーンショット 2024-04-12 6.37.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/e5bffca0-eb2c-340a-f0d7-cded508674ca.png)
プレースホルダーに下記コードを貼り付ければ完了です。xxxの部分はymlファイルに合わせて変更してください。
```yml
.github/workflows/xxx.yml
```

**3. ymlの内容を入力して保存する**
![スクリーンショット 2024-04-10 14.46.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/c45eebe7-1d1c-3e05-e31f-a80b77fc5911.png)

以上で完了です。

## YAMLファイルとは
YAML (YAML Ain’t Markup Language)は、データシリアライズ言語で、設定ファイルの記述に使用されることが多いそうです。CircleCIの設定などにも使用されています。

https://circleci.com/ja/blog/what-is-yaml-a-beginner-s-guide/

## 動作確認
リポジトリのActionsのタブを押下します
![スクリーンショット 2024-04-12 6.52.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/b79febeb-f928-5791-5456-5e139dce19a5.png)

Jobsを押下すると処理の内容を確認できます。
![スクリーンショット 2024-04-12 6.56.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1201315/6bb309da-671b-ab7c-8010-fb58b16461db.png)

## 費用

GitGub Actionsの処理にかかった時間あたりで費用がかかります。個人でも基本2000分/月は無料なので実質無料と考えて大丈夫です。

https://docs.github.com/ja/billing/managing-billing-for-github-actions/about-billing-for-github-actions

## まとめ
「ソフトウェア開発の効率を上げ、リリースの速度を速めること」がCI/CDの目的なのでアジャイルにピッタリな技術だと感じました。「同じ操作を3度繰り返したら自動化」という言葉もあるくらいなので自動化できる箇所に使っていきたいです。

## 最後に
私の働いている会社で経験の有無を問わず採用を行っています。
興味のある方は是非カジュアル面談から応募してみてください！

https://jambo-support.com/recruit_engineer/
【Javascript】公開したライブラリ・パッケージのCDN作成方法

# はじめに

初めまして。エンジニアのkeita_Maxです。

以前ライブラリをnpmに公開する記事を書いたのですが、それをCDNとして読み込むようにするにはどうしたらいいのだろうと調べた結果を書きます。


# JSDELIVER

https://www.jsdelivr.com/


JSDELIVERというものがあるらしいです。

これはNPMに公開しているものなら何でもCDNとして読み込みことができるようなので、実際にやってみました。


# URLを作ってみる

>// load any project hosted on npm
https://cdn.jsdelivr.net/npm/package@version/file

公式にはこのように書いてありました。

`package@version`ここに自分のパッケージの名前とバージョンを記載し、`file`部分には読み込みたいファイル名を記載します。

実際にやってみます。

`https://www.npmjs.com/package/keitamax-flowing-js`

この間公開したパッケージで試してみます。

`package`が`keitamax-flowing-js`
`version`が`0.0.3`
`file`が`index.cd.js`

です。

これでURLを作ってみると以下のようになります。

```
https://cdn.jsdelivr.net/npm/keitamax-flowing-js@0.0.3/index.cd.js
```

こちらに実際にアクセスしてみると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715123/7df8da39-dee8-853c-bfc3-87ee6a0aac01.png)


このように読み込めていることがわかります。


# おわりに

とくにリリースしなくてはいけないことなどはなく、簡単にできました。

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！
CentOS6でwordpressを建てる

# はじめに
とりあえずCentos6で何か作りたかっただけ。
wordpressってオワコンなのだろうか。
あまり詳しく知らないので作ってみる。

# 前提
iptables,selinux,yum設定済みのCentos6サーバが作ってある前提。

# php7.3リポジトリインストール
現在(2024/04)のwordpressはphp7以上が必要。
もちろんCentOS6は古いのでphp7.3を入れる。
併せて必要なepelリポジトリも一緒インストールしておく。

```ruby:php7.3リポジトリインストール
rpm -Uvh http://archives.fedoraproject.org/pub/archive/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

# 必要パッケージインストール
必要なリポジトリは揃ったので必要なパッケージをインストールする。

```ruby:yumインストール
yum install -y --enablerepo=remi,remi-php73 httpd mysql-server php php-mysql php-mbstring
```

# mysql起動
一旦インストールしたmysqlを起動しておく。
起動しておかないとmysqlの設定ができない。

```ruby:mysqld起動
chkconfig mysqld on
service mysqld start
```

# mysql設定
mysqlコマンドでmysqlに接続した後wordpressのDBとアクセス権を作成する。

```ruby:mysql設定
mysql
create database wordpress;
grant all privileges on wordpress.* to wordpress@localhost identified by 'wordpress';
flush privileges;
quit
```

# wordpressダウンロード
準備が整ったのでwordpressをダウンロードする。

```ruby:wordpressダウンロード
cd /var/www/html/
curl -LO http://ja.wordpress.org/latest-ja.tar.gz
```

# wordpress展開
ダウンロードしたwordpressを展開しておく。

```ruby:wordpress展開
tar xzf latest-ja.tar.gz
```

# wp-config.php作成
wp-config-sample.phpを使用してwp-config.phpを作成する。

```ruby:wordpress展開
cd wordpress/
cp -ip wp-config-sample.php wp-config.php
```
# wp-config.php編集
wp-config.phpに先ほど作成したmysqlの情報を反映する。
`DB_NAME`
`DB_USER`
`DB_PASSWOR`
の設定値を「wordpress」に変更する

```ruby:wp-config.php編集
vi wp-config.php
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );

/** Database username */
define( 'DB_USER', 'wordpress' );

/** Database password */
define( 'DB_PASSWORD', 'wordpress' );

/** Database hostname */
define( 'DB_HOST', 'localhost' );
```

# オーナー権限変更
apacheユーザで/var/www/html/wordpressが参照できるよう
オーナーを変更しておく。

```ruby:オーナー変更
chown -R apache:apache /var/www/html/wordpress
```

# apache側設定
wordpressをapache側で見られるように設定する。
初期状態で/etc/httpd/conf.d/wordpress.confはないので新規作成となる。

```ruby:apache側設定
vi /etc/httpd/conf.d/wordpress.conf
<Directory /var/www/html/wordpress>
  AllowOverride All
</Directory>
```

# apache設定
これは他の方法でもいい。
ただ今回はwordpress以外の用途がないのでDocumentRootを変更する。
(/DocumentRootで検索するといいかも)

```ruby:apache設定
vi /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html/wordpress"
```

# apache起動
サーバを再起動しても起動するよう`chkconfig`も含めて
apacheサービスを起動する。

```ruby:apache再起動
chkconfig httpd on
service httpd start
```

# 画面確認
なんでもいいのでブラウザに「http://[サーバのIPアドレス]/」といれて画面がでればOK
せっかくなので初期設定してページいくつかつくって遊んでみよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092362/176af192-a444-ebbf-1386-44ba8b9e5e68.png)


# あとがき
むしゃくしゃしてやったいまは反省しているシリーズ。
CentOS6は比較的記事が残っている印象。
wordpressはなんだかんだ触ったことがないのでこれを機に触ってみる予定。
(私たちはwordpressなくてもWebいくらでも作れるので)
次はCentOS7で何か作る。
ArduinoのfreeRTOS導入方法とざっくりと解説

# freeRTOSとは？
freeRTOS（Real-Time Operating System）は、マイクロコントローラー用のオープンソースのリアルタイムオペレーティングシステム（RTOS）です。freeRTOSは、小規模な組み込みシステムやリアルタイムアプリケーション向けに設計されており、複数のタスクを効率的に管理し、リアルタイム性の要求を満たすための機能を提供します。

**freeRTOSの特徴：**

ざっくりと言うと効率的なリソースでタスク管理による正確なタイミング制御、複数のタスクを同時に実行できるマルチタスクサポートなどが可能になります。他にもセマフォやキューなど豊富な機能が提供されています。
また、名前にfreeと書いてある通りオープンソースで使用できます。

# 導入方法
Arduinoの導入自体の手順は省きます。

Arduinoを起動してからメニューバーのツール→ライブラリ管理から検索バーにfreeRTOSと検索すると出てきます。

![スクリーンショット 2024-04-12 031359.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3508870/3565ed79-d0bf-0e28-83c1-52154d10727c.png)

後はインストールを押すと使えるようになります。
(Arduinoのバージョンによって手順等が異なる可能性があります。)

# 使用例

**LCDディスプレイに１秒ごとカウント表示させるプログラム**

まずはfreeRTOSを使用しない場合

~~~c:
#include <LiquidCrystal.h>

const int rs=8,en=9,d4=4,d5=5,d6=6,d7=7;

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);  //rs,en,d4～d7ピン

int secCount = 0;
unsigned long previousMillis = 0;
unsigned long interval = 1000; //インターバルは秒にしたいので1000

void setup() {

  lcd.begin(16,2);
  lcd.setCursor(0,1); //文字を表示させる位置(行,列)
  lcd.print("CurrentSec");
}

void loop() {
  elapsedTime();
  lcd.setCursor(11,1);
  lcd.print(secCount);
}

//秒数をカウントする関数
void elapsedTime(){
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis >= interval){
    secCount++;
    previousMillis = currentMillis;
  }
}
~~~

次にfreeRTOSを使用した場合

~~~c:
#include <Arduino_FreeRTOS.h>
#include <LiquidCrystal.h>

const int rs=8,en=9,d4=4,d5=5,d6=6,d7=7;

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);  //rs,en,d4～d7ピン

int secCount = 0;

void setup() {
  xTaskCreate(taskElapsedTime,"TaskElapsedTime",100,NULL,1,NULL); //秒数をカウントするタスクを生成
  lcd.begin(16,2);
  lcd.setCursor(0,1); 
  lcd.print("CurrentSec");
}

void loop() {
  //タスクで制御するので使用しない
}

//秒数をカウントする関数
void taskElapsedTime(void *pvParameters){
  for(;;){
    secCount++;
    vTaskDelay(1000/portTICK_PERIOD_MS); //1秒待つ
    lcd.setCursor(11,1);
    lcd.print(secCount);
  }
}
~~~

大きな違いとしてはタスクで制御するのでループを使わないことでしょうか。

# 解説

**xTaskCreate()**
~~~cpp:
BaseType_t xTaskCreate(
    TaskFunction_t pvTaskCode,      // タスクのエントリーポイントとなる関数へのポインタ
    const char * const pcName,      // タスクの名前（デバッグ目的で使用）
    const uint16_t usStackDepth,    // タスクのスタックの深さ（バイト単位）
    void * const pvParameters,      // タスクに渡すパラメータ
    UBaseType_t uxPriority,         // タスクの優先度
    TaskHandle_t * const pxCreatedTask  // タスクハンドルの格納先（必要ない場合は NULL）
);
~~~
freeRTOSライブラリのタスク作成のための関数です。この関数を使用することによってマルチタスク処理が実行できるようになります。

**vTaskDelay()**

~~~cpp:
void vTaskDelay(const TickType_t xTicksToDelay);
~~~
freeRTOSライブラリでこちらはタスクを一定時間停止させるために使用する関数です。
上のサンプルでは**vTaskDelay(1000/portTICK_PERIOD_MS);** となっていますが
**portTICK_PERIOD_MS** はFreeRTOS のポート依存機能で定義される定数で、1 Tick が何ミリ秒かを示します。
一般的な FreeRTOS の設定では、タイムティックは 1 ミリ秒ごとに進むように設定されています。


# まとめ

今回紹介した機能はfreeRTOSの一部です。
GitHub PagesとGitLab Pages　それぞれで静的ファイルをデプロイしてみた

# GitHub Pages

まずは通常の静的HTML、CSS、JavaScriptファイルをGitリポジトリのルート直下に配置します。
今回はちょっとした出来心で作っていた[Wordle](https://allabout.co.jp/gm/gc/491965/)という簡単な言葉を使ったゲームを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131218/0006c3b2-c2a6-6267-008d-c06b7d7960e6.png)

GitHub Pagesはめちゃくちゃ簡単で、リポジトリのSettings＞Pagesで以下のように設定するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131218/a09278d0-c8cd-6bc0-f810-362d4e05c4d1.png)

するとGitHub PagesのURLが表示されアクセスするとリポジトリの内容がそのままデプロイされた状態になります。
ちなみにURLは以下のようなフォーマットになっています。

`https://{username}.github.io/{repository-name}`

# GitLab Pages

GitLab Pagesはもう少し複雑になります。
GitLab CIを使って、静的ファイルをデプロイします。

ルート直下配置のファイルはデプロイしにくいようなので、`public`ディレクトリを作成してそこにHTML、CSS、JavaScriptを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131218/589fdc4c-7a81-89c2-d55d-2a22f173da10.png)

リポジトリのサイドメニューからDeploy＞Pagesにアクセスするとセットアップウィザードみたいなページにたどり着きます。
GitLab Pages/GitLab CIの設定がないとこうなるみたいです。

今回はマニュアルで設定してみます。
リポジトリの直下に`.gitlab-ci.yml`ファイルを設置して、以下のように記述します。

```yaml:.gitlab-ci.yml
pages:
  script:
    - echo 'Deploying.'
  artifacts:
    paths:
      - public
  only:
    - main
```
`pages`ジョブの`artifacts`に`public`ディレクトリを、実行対象のブランチを`main`飲みにします。
これだけです。

これで`main`ブランチにプッシュすると自動的にジョブが開始されます。
あるいは、Build＞Pipelinesで「Run pipeline」を実行してください。

GitLab Pagesの設定画面でもありますが、「Use unique domain」にチェックをいれるとURLの一部がハッシュ化され、覚えられない形になります。
URLの基本フォーマットは以下の通りで、チェックを外している状態ではこれになります。
チェックを入れていてもハッシュ化されたURLにリダイレクトされます。

`https://{username}.gitlab.io/{repository-name}`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131218/dfda752b-2cbd-ee1b-eab8-d4a2c843c039.png)

こちらはSelf Hostedでも動作することを確認しています。

# GitHubでもGitLabと同じファイル構成にできないか

GitHubの場合、リポジトリを直接デプロイする場合はリポジトリ直下である`/ (root)`または`/docs`のみとのことです。
そのため、`/docs`以下にファイルを配置するなどの手法を提案している記事を見かけます。

`public`ディレクトリ以下をデプロイするにはGitHub Actionsを使って、`public`ディレクトリ以下をアップロードするというジョブを走らせる必要があるようです。
上部メニューのActionsへ行き、テンプレートの中から「Static HTML」を選択します。

`.github/workflows/static.yml`のサンプルが表示されるので、`steps`の`path`を書き換えます。

```yml
        with:
          # Upload entire repository
          path: './public/'
```

それ以外はあまり気にせず後で理解しましょう。
コミットするとActionsでデプロイジョブが走ります。
同じくURLにアクセスすると見えるはずです。

念の為Settings＞PagesのSourceが「GitHub Actions」になっているかを確認しましょう。

# つまり

GitHub Pages、GitLab Pagesともに、静的ファイルをデプロイするのは割と簡単にできそうです。
例えばVue.jsのプロジェクトをビルドして、ビルドした結果をデプロイするということも可能でしょう。ジョブの設定にはDockerコンテナイメージを指定する方法もあるので、それでビルドするということもできるみたいです。
今度やってみます。
neologdnによる正規化の際にスペースを一つ残す方法

　正規化ライブラリneologdnを文字列整理で使う際に、スペースをすべて消さずに半角スペースを一つ残す方法です。

~~~ python
import neologdn

text = "整理　　　したい　　　文章！"

normalized_text = neologdn.normalize(text)

print(normalized_text)
// 整理したい文章!
~~~


neologdnは
「ひらがな・全角カタカナ・半角カタカナ・漢字・全角記号」間に含まれるスペースと
「ひらがな・全角カタカナ・半角カタカナ・漢字・全角記号」と「半角英数字」の間に含まれるスペース
はすべて削除します。

一つ半角スペースを残したい際は

~~~ python
import neologdn
import re


# 元のテキスト
text = "整理　　　したい　　　文章！"

# 単語間のスペースを一時的に特定の文字列に置換
replaced_text = re.sub(r'\s+', '<w>', text)

# neologdnを使用して正規化
normalized_text = neologdn.normalize(replaced_text)

# 置換した文字列を空白に戻す
final_text = re.sub(r'<w>', ' ', normalized_text)


print(final_text)
# 整理 したい 文章!
~~~

スペースを一度別の文字列に置換し、neologdnをかけた後に再び置換することで一つだけ残すことができます。
Jacksonの JsonNode を使ってJSONの特定のキーを取得しようとしたとき、そのキーが存在しない場合は NullPointerException が発生します。


Jacksonを使用して、深い階層のJSONの値を変更するには、次の手順に従います。

- JSON文字列をJavaオブジェクトにデシリアライズします。
- 必要な値を変更します。
- 変更したJavaオブジェクトをJSON文字列にシリアライズします。

Jacksonの JsonNode を使ってJSONの特定のキーを取得しようとしたとき、そのキーが存在しない場合は JNullPointerException が発生します。このため、キーが存在するかどうかを事前にチェックすることが重要です。

以下の例で rootNode.get("a").get("b") のようなコードを使用すると、もしキー "a" や "b" が存在しない場合に NullPointerException が発生します。したがって、キーが存在するかどうかをチェックするために has メソッドを使用することが推奨されます。


```java
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

public class Main {
    public static void main(String[] args) throws Exception {
        // JSON文字列
        String json = "{\"a\":{\"bd\":{\"c\":123}}}";

        // JacksonのObjectMapperを作成
        ObjectMapper mapper = new ObjectMapper();

        // JSON文字列をJavaオブジェクトにデシリアライズ
        JsonNode rootNode = null;
		try {
			rootNode = mapper.readTree(json);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		}

		try {
            // キーの存在をチェックしてから値を変更
			if (rootNode.has("a") && rootNode.get("a").has("b")) {
				((ObjectNode) rootNode.get("a").get("b")).put("c", 456);
			} else {
				System.out.println("Key 'a' or 'b' does not exist.");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
        // 変更後のJSON文字列を取得
        String updatedJson = null;
		try {
			updatedJson = mapper.writeValueAsString(rootNode);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		}

        System.out.println(updatedJson);
}

```
Pythonで「ディレクトリの作成と削除」の動作を確認してみた

# 概要

Pythonで「ディレクトリの作成と削除」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/file/index8.html

# 実装

以下のファイルを作成しました。
```sample1.py
import os
path = './test/movie'
os.mkdir(path)
```

```sample2.py
import os
path = './test/code/python/2019'
os.makedirs(path, exist_ok=True)
```

```sample3.py
import os
path = './test/movie'
os.rmdir(path)
```

以下のコマンドを実行しました。
```
$ mkdir test
$ python3 sample1.py 
$ ls test
movie
$ python3 sample2.py 
$ ls test
code  movie
$ python3 sample3.py 
$ ls test
code
```

# まとめ

何かの役に立てばと。
🧶 新しいOSの広げ方

新しいOSを作ると、互換性がなくなかなか広がらないということがあります。
例えばSumsungのTizenはとてもいいOSでしたが、AndroidとiOSにはかないませんでした。
なぜかというと、ユーザーは使っていたアプリなどを新しいスマホでも使いたいからです。

一方で、うまく行っている例もあります。ChromeOSです。
Chrome OSはブラウザだけが動くOSで、アプリはウェブアプリなので、ブラウザさえ作ってしまえばChrome OSで動くアプリは動くということになります。
そして、ネイティブアプリを作ってくれる開発者が少しづつ増えていけば、syscallをしてくれるアプリが増えてうれしいなってなります。

もう一つの方法は、エミュレータを作るという方法です。
QEMUなどを使うのがいいと思います。
こうすればLinuxアプリが動くので、問題ありません。
XLOOKUPもう使った？

# はじめに
先日、スプレットシートの一覧表から複数の列から特定の文字をキーに必要な情報だけ別シートに反映させてほしいといった依頼が来た。
そこでVlookupでできるだろうと試したところ、検索範囲より左側にも検索キーがありドはまり:sob:
結果的に、Xlookup関数により救われたのでまとめたいと思います。

# VLOOKUP・XLOOKUP・HLOOKUPの違い
:point_up:　元になる表を検索して、その中から合致するデータを見つけてきて転記する

### その１：検索範囲の指定方法
3つの関数の大きな違いは「検索する方向」にあります。
|関数 |検索範囲|
|---|---|
|Vlookup　|指定したセル範囲内で検索値を縦方向に探す  |
|Hlookup  |指定したセル範囲内で検索値を横方向に探す  |
|Xlookup  |指定したセル範囲内で検索値を縦・横に探す  |

VLOOKUPとHlOOKUP関数の頭文字にはそれぞれ下記の意味があるらしい。
VLOOKUP：「V」はVertical（垂直な）
HLOOKUP：「H」はHorizontal（水平な）

### その２：検索結果の指定
Xlookupでは、検索値が見つからなかった場合に表示するデータを指定することができます。

|関数 |検索結果|
|---|---|
|Vlookup　<br>Hlookup　|#N/Aエラーを返す |
|Xlookup  |引数に表示する値を指定することが可能  |

VlookupとHlookupでエラー表示をしたくない場合は、
IF関数やIFERROR関数などを組み合わせて使用する必要があります。

### その３：一致モード
Xlookupでは、検索値に対して「完全一致」で検索したい場合の引数指定が不要に。

|関数 |引数|
|---|---|
|Vlookup　<br>Hlookup　|完全一致で検索したい場合、<br>引数の「検索の型」にFALSEを指定する必要がある |
|Xlookup  |完全一致が既定の設定となっているため、<br>引数の「一致モード」を省略することができる  |

VlookupとHlookupで引数の「検索の型」を省略した場合、
TRUE型となり近似値一致での検索します。

### その４：複数条件で検索可能
VlookupとHlookupでは、同じ列に一致するデータが複数ある場合、#N/Aエラーを返す。
一方、Xlookupでは、関数内で「&」を使って商品番号と商品名のふたつの列を連結させた値で検索し、検索範囲も連結させて検索することができる。

## Xlookup
```HTML:書式
=XLOOKUP(検索値,検索範囲,戻り範囲,[見つからない場合],[一致モード],[検索モード])
```

範囲または列ごとに情報を検索し、該当するデータを取り出す関数です。
- 検索値：どのデータで
- 検索範囲：どこを検索して（配列または範囲）
- 戻り範囲：どの範囲の値を取り出すか
- 見つからない場合：検索値が見つからない場合何を表示するか（省略した場合：「#N/A」）
- 一致モード：完全一致か、近似値も検索するかを選択　※1
- 検索モード：どのような順序で検索するかを選択　※2

※1：一致モード
|設定値	|説明|
|---|---|
|0 <br>または　<br>省略　|完全一致。<br>見つからない場合は、#N/Aエラーを表示（既定の設定）|
|-1|完全一致。<br>見つからない場合は、次に小さい項目を表示|
|1|完全一致。<br>見つからない場合は、次に大きい項目を表示|
|2|*、?、~（チルダ）などのワイルドカードとの一致。|

※2：検索モード
|設定値	|説明|
|---|---|
|1 <br>または　<br>省略|先頭から末尾に向かって検索（既定の設定）|
|-1|末尾から先頭へ逆方向に検索|
|2|昇順に入れ替えられた検索範囲を使ってバイナリ検索|
|-2|降順に入れ替えられた検索範囲を使ってバイナリ検索|

バイナリ検索とは、真ん中から半分に分けて条件に合わない方を消すという作業を複数回繰り返すことで候補を絞り込んでいく検索方法。

# 参考
https://exceljoshi.cocoo.co.jp/media/excel-xlookup

https://pcwork-labo.com/excel-function-xlookup/#:~:text=Excel%E3%81%AEXLOOKUP%E9%96%A2%E6%95%B0%EF%BC%88VLOOKUP,%E3%81%A6%E8%A1%A8%E7%A4%BA%E3%81%95%E3%81%9B%E3%82%8B%E9%96%A2%E6%95%B0%E3%81%A7%E3%81%99%E3%80%82
🧶 スタック&逆ポーランド記法

逆ポーランド記法では、例えば4 + 5 * 6 + 7は4 5 6 * + 7 +と書きます。
ぱっと見「うわっ！なんじゃこりゃ」となりますが、このほうがシンプルです。

今：`[]`
まず、4と書いてあるので4と書いた積み木を置きます。
今：`[4]`
次は5なので、5と書かれた積み木を上に乗せます。「スタック」してますね！
今：`[4, 5]`
そして6なので、6を書いた積み木を上に乗せます。
今：`[4, 5, 6]`
次は数字ではなく「*」(×)が出てきました。掛け算は2つの引数を取るので、上2つの積み木を消し、それらの積み木に書いてある数「5」と「6」を掛けた値=30を書いた積み木を乗せます。
今：`[4, 30]`
次は「+」なので、「*」と同様に、上2つを消し、それらを足した値=34と書かれた積み木を置きます。
今：`[34]`
次に、7なので7と書かれた積み木を乗せます。
今：`[34, 7]`
最後に、「+」と書かれているので、上2つの積み木を消し、足した結果=41が書かれた積み木を置きます。
今：`[41]`

残ったのは41と書かれた積み木です。シンプルでしょ！
この書き方が逆ポーランド記法、積み木を置くためのところがスタックです。
スタックには、このような計算をする以外にも、変数やリターンアドレス、呼んだ関数の呼び出し時点のベースポインタを置きます。
スタックでは「置く/乗せる」をプッシュ、「消す」をポップといいます。
書いていて世界は逆ポーランド記法で回ればいいのに！と思ってきました。Schemeが好きになってきました。ぜひ逆ポーランド記法を普段使いしてみてください！()

最後まで読んでいただき、ありがとうございました。