OmniAICreator/Qiita-1.07M huggingface dataset:
特徴量は適切に計画的に・・・

誰もが一度は思った事があるのではないか、画像をそのまま使うんじゃなくて画像ってヒストグラムで編集するんだから(色調補正とか)それを特徴量にすればいいと。
今回はそれが間違っていることを書いてみます。
# プログラム
```Python3
from sklearn.datasets import fetch_lfw_people
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split as tts
from lightgbm import LGBMClassifier
import time
import numpy as np

y = fetch_lfw_people(min_faces_per_person=60).target
x = fetch_lfw_people(min_faces_per_person=60).data

# 画素値を0~255にする
x = (((x-min(x.flatten()))/(max(x.flatten())-min(x.flatten())))*255).astype(int)
```

## 画素値のヒストグラムによる学習と予測
```Python3
x_hist = []
for i in range(len(x)):
    hist = np.zeros(256)
    for j in range(len(x[i])):
        hist[x[i][j]] = hist[x[i][j]] + 1
    x_hist.append(hist)

x_train, x_test, y_train, y_test = tts(x_hist, y, test_size=0.3, random_state=1)

model = LGBMClassifier()
start = time.time()
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
end = time.time()
print("time: ", end-start)
print(classification_report(y_test, y_pred))
```
```
time:  3.7290267944335938
              precision    recall  f1-score   support

           0       0.00      0.00      0.00        24
           1       0.22      0.19      0.21        68
           2       0.17      0.02      0.04        41
           3       0.45      0.75      0.56       162
           4       0.14      0.03      0.05        32
           5       0.00      0.00      0.00        19
           6       0.20      0.18      0.19        38

    accuracy                           0.38       384
   macro avg       0.17      0.17      0.15       384
weighted avg       0.28      0.38      0.30       384
```
時間は早いですが精度は38%程度しかありません。なんなら5のラベルの人は0%の精度です。

## 画像をそのまま学習して予測
```Python3
x_train, x_test, y_train, y_test = tts(x, y, test_size=0.3, random_state=1)

model = LGBMClassifier()
start = time.time()
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
end = time.time()
print("time: ", end-start)
print(classification_report(y_test, y_pred))
```
```
time:  57.56893587112427
              precision    recall  f1-score   support

           0       1.00      0.38      0.55        24
           1       0.74      0.79      0.77        68
           2       0.69      0.44      0.54        41
           3       0.73      0.93      0.82       162
           4       0.63      0.53      0.58        32
           5       0.85      0.58      0.69        19
           6       0.75      0.55      0.64        38

    accuracy                           0.73       384
   macro avg       0.77      0.60      0.65       384
weighted avg       0.74      0.73      0.72       384
```
学習に時間はかかっていますが精度は先ほどの約2倍ある事が分かります。

# 結論
画像みたいに分かりやすい物の場合人が見ても分かるように特徴量を考える必要があります。
例えばコーヒーと野菜ジュースを見分けるならRGBのヒストグラムを使えば早くて精度も良いでしょうが、今回の場合のように人物のまして白黒の場合はヒストグラムだと意味がありません(むしろ38%も精度があることに驚きです)。

# まとめ
特徴量は適切に・・・
HTMLを素早く書く方法 (Emmet)

## はじめに
はじめまして！sato (@ameRese) と申します。
プログラミングは過去に少し仕事で関わっていた程度ですが、
最近本気で勉強し直そうと考え、現在はHTMLやCSSの勉強からやり直しているところです。

今回はHTMLを素早く書くことができるEmmetについて記事を書きたいと思います。

## Emmet (エメット) とは？
Emmetとは、入力補完機能によりHTMLやCSS等を素早く編集できる、
テキストエディタ用プラグインです。
VSCodeやCursorには最初から搭載されています。
↓こんなことができます↓
![Emmet Sample](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362317/66c81958-1811-772c-1b41-c4284e2de0a6.gif "Emmet Sample")



たくさんの記法があるようですが、今回は私がよく使うものに絞って紹介します。
詳しく知りたい方は以下のチートシートを参照してください。

https://docs.emmet.io/cheat-sheet/

## 使い方
キーワードを入力してTabキーまたはEnterキーを押すだけです

## よく使うキーワード
### タグのみ
```html
h1
↓↓
<h1></h1>
```

### クラス付きのタグ
```html
article.post
↓↓
<article class="post"></article>
```

### id付きのタグ
```html
section#about
↓↓
<section id="about"></section>
```

:::note
### タグ省略時はdivタグに
```html
.testclass
↓↓
<div class="testclass"></div>

#testid
↓↓
<div id="testid"></div>
```
:::

### 子要素を追加
```html
figure>figcaption
↓↓
<figure>
    <figcaption></figcaption>
</figure>
```

### 兄弟要素を追加
```html
dt+dd
↓↓
<dt></dt>
<dd></dd>
```

### 繰り返し
```html
li*3
↓↓
<li></li>
<li></li>
<li></li>
```

:::note
### 組み合わせも可能
```html
table.info>(tr>th+td)*2
↓↓
<table class="info">
    <tr>
        <th></th>
        <td></td>
    </tr>
    <tr>
        <th></th>
        <td></td>
    </tr>
</table>
```
:::

### HTMLテンプレート
```html
! (もしくはhtml:5)
↓↓
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
```

## おわりに
EmmetはCSSでも活用できるので、機会があれば記事にする予定です。
また、今後学習の中で得た気付き等も記事にしていけたらと考えています。
Overleafは動かない - 2024年現在でも手強いオフラインLatex環境構築について

# [Overleaf Toolkit](https://github.com/overleaf/toolkit/tree/master)
Overleafは、オンラインでlatexを複数人で編集できる便利なサービスです。しかし、新幹線や飛行機など不安定なネットワーク環境でも論文・報告書を書きたい、書かざるを得ない方もいることだろうと思います。そのような時に、Overleaf Toolkitはオフライン環境で利用できるLatexの執筆環境を提供します。これは、通常のOverleafと同様にbrowserを通じてアクセスでき、同様のinterfaceでtexファイルを編集できます。
この記事では、Github上のinstruction通りにインストールを行ってもうまくいかない場合に試すと良いかもしれないことをメモしています。

:::note info
インフォメーション
**ローカルでLatex環境を構築する最も簡単な方法の一つです。**
作業時間は1時間くらい、ダウンロードの待ち時間も合わせると約3時間かかります。
:::

# 環境
- M2 Macbook Pro 2022
- MacOS 14.4.1（23E224）
- Docker Desktop (4.31.0 (153195))

# 動作確認を行ったtemplate
- [IEEE Conference Template](https://ja.overleaf.com/latex/templates/ieee-conference-template/grfzhhncsfqn)
- [NeurIPS 2024](https://ja.overleaf.com/latex/templates/neurips-2024/tpsbbrdqcmsh)
- [Monthly Notices of the Royal Astronomical Society (MNRAS) LaTeX template and guide for authors](https://ja.overleaf.com/latex/templates/monthly-notices-of-the-royal-astronomical-society-mnras-latex-template-and-guide-for-authors/kqnjzrwjwjth)
- [AASTeX Template for submissions to AAS Journals (ApJ-AJ-ApJS-ApJL-PSJ-RNAAS)](https://ja.overleaf.com/latex/templates/aastex-template-for-submissions-to-aas-journals-apj-aj-apjs-apjl-psj-rnaas/vwyggrqvhcgz)

# Official Instruction
[https://github.com/overleaf/toolkit/blob/master/doc/quick-start-guide.md](https://github.com/overleaf/toolkit/blob/master/doc/quick-start-guide.md)
これ通りに一旦やってみてください。これでうまくいけばここで終わりです。

:::note warn
注意
デフォルトでは`config/overleaf.rc`内で`OVERLEAF_PORT=80`と設定されているため、衝突してうまく起動できない可能性があります。例えば、`OVERLEAF_PORT=8091`などと適当に変更し、
```url
127.0.0.1:8091/launchpad
```
にbrowserでアクセスすることで、この問題を回避できます。
:::

# Update TexLive

もしコンパイルがうまくいかない場合、以下に沿ってTexLiveをUpgradeします。
[https://github.com/overleaf/toolkit/blob/master/doc/ce-upgrading-texlive.md](https://github.com/overleaf/toolkit/blob/master/doc/ce-upgrading-texlive.md)

また、以下のようなエラーに遭遇した場合、手動でTexLiveをUpgradeします。
```
tlmgr: Local TeX Live (2023) is older than remote repository (2024).
Cross release updates are only supported with
  update-tlmgr-latest(.sh/.exe) --update
See https://tug.org/texlive/upgrade.html for details.
```

TexLiveのUpgrade用のscriptをダウンロードし、実行します。
[https://github.com/overleaf/toolkit/blob/master/doc/ce-upgrading-texlive.md](https://github.com/overleaf/toolkit/blob/master/doc/ce-upgrading-texlive.md)にあるように
```bash
bin/shell
```
により
```bash
root@309b192d4030:/#
```
のようなプロンプトを起動して、この中で以下を実行してください。

```bash
wget https://mirror.ctan.org/systems/texlive/tlnet/update-tlmgr-latest.sh
sh update-tlmgr-latest.sh -- --upgrade
luaotfload-tool -fu
tlmgr path add
tlmgr update --self --all
```

:::note warn
注意
この更新は2時間程度かかる場合があります。
:::


参照: [https://ctan.org/tex-archive/systems/texlive/tlnet](https://ctan.org/tex-archive/systems/texlive/tlnet)

# それでもOverleafがpdfを生成してくれない場合
- ```LaTeX Error: File `xstring.sty' not found.```などと出てくるエラーに対して
```bash
tlmgr install xstring
```
と一つずつインストールしていく。

- Raw logsを全てChatGPTに投げる。
- bin/up error
[https://github.com/overleaf/toolkit/issues/318]()
【VSCode】TypeScriptの引数名を表示する方法

`settins.json`に以下の設定を記述すると関数の引数名が表示されるようになります。

```settings.json
{
  "editor.inlayHints.enabled": "on",
  "typescript.inlayHints.parameterNames.enabled": "all"
}

```

![inlay-parameters.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/b8a2d255-be1a-9d17-8985-e9f398d3246f.png)
Mac で Azure Function Core Tools のローカル実行ができるようになっている！

# やりたいこと

Azure Functions App をローカルで開発する際に多く使われているであろう、Azure Functions Core Tools で以前対応されていなかった Mac での実行がいつの間にか対応されていてテンションが上がったので記事にしてみます。

# Azure Functions Core Tools

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-run-local

https://github.com/Azure/azure-functions-core-tools?tab=readme-ov-file


Azure の FaaS である Functions App の開発用ツール。
プロジェクトの作成やローカル実行など開発に必要な機能を CLI で行うことができる。

以前 (たぶん2022年〜2023年くらい？) は、Mac だと Python でのローカル実行がサポートされていなかったが、2024/06/09 時点 (v4 から？) で対応されローカル実行できるようになっていた！

:::note
VSCode の拡張機能でポチポチと GUI 操作することでプロジェクト作成〜デプロイまで行えますが、CI/CD や作業内容の再現性を考えると普段からコマンドで作業するのが良いと個人的には思っています (必要な手順をシェルスクリプトにまとめられますし)。
:::

# インストール

未インストールの場合は以下のコマンドでインストール。

```sh
brew tap azure/functions
brew install azure-functions-core-tools@4
```

# アップデート

v3 以前をインストール済みの場合は以下コマンドでアップデート。`brew upgrade` でも可。


```sh
brew tap azure/functions
brew install azure-functions-core-tools@4
# if upgrading on a machine that has 2.x or 3.x installed:
brew link --overwrite azure-functions-core-tools@4
```

:::note warn
2024/06/09 時点では、対応しているのは Python 3.11 までのようです (どこかに記載がありましたが改めて見つけられず… リンク無しです)。
3.12 で試してみたところ、ローカル実行がうまく行えませんでした。
:::

# 開発手順

## プロジェクト作成

まず Python の仮想環境を作成する。

```sh
python -m venv {ENV_NAME}
```

プロジェクトを作成する。

```
func init MyProjFolder --worker-runtime python --model V2
```

## 関数を作成する

以下コマンドで、HttpTrigger の関数をテンプレートから作成する。

```sh
func new --template "Http Trigger" --name MyHttpTrigger
```

## ローカル実行

以下コマンドでローカル実行する。ローカルホストでホスティングされ、ブラウザや何らかのクライアントからアクセスすることで HttpTrigger の関数が実行される。

```sh
func start
```

終了するときは、Ctrl+C。

## Azure へのデプロイ

:::note warn
Functions App はプロビジョニング済みである必要があります。
:::

以下コマンドでデプロイできる。

```sh
func azure functionapp publish {FUNCTIONS_APP_NAME}
```

## 設定のフェッチ

Azure 上の Functions App　に環境変数などを設定してコード内で実行している場合、ローカル実行時にそれらが必要になる。その際には、以下コマンドで設定ファイルをフェッチできる。

```sh
func azure functionapp fetch-app-settings {FUNCTIONS_APP_NAME}
```

逆に、ローカルの値を Azure 側に設定する場合は以下コマンド。

```sh
func azure functionapp publish {FUNCTIONS_APP_NAME} --publish-settings-only
```

# ということで
Mac で Azure Functions Core Tools を使って、Python コードのローカル実行が可能になったという内容をまとめてみました。以前に Mac で開発していてローカル実行できず絶望したことがあったので、いつの間にか対応されていて非常に感動しました。
積極的にアップデートされているので、今後もいろいろと機能追加されるのではと思います。定期的にウォッチしていち早く気づけるようにしたいですね！


以上です。
スパイラルマトリックス Javaで解いてみました

前書き：
　この問題は簡単かもしれませんが、私は日本語の書き練習を兼ねて、日本語をコメントを入れて、自分の日本語能力を伸ばしたいという気持ちで一応こちらにメモを書いておきます。もし変な日本語や拙いコードを見つけたら、ご指導のほどよろしくお願いします。

 本文：[問題のリンク](https://leetcode.com/problems/spiral-matrix/description/)
 　与えられたM行xN列の二次元配列を左上から時計回りの順番で一つずつ取り出して、新たな一元配列に入力する。

編集：タイプミスの修正。

--------------------------
  入力された3x3二次元配列：
  matrix = [[1,2,3],[4,5,6],[7,8,9]]
  
  求められる出力の一元配列：
  output = [1,2,3,6,9,8,7,4,5]
  
  ![spiral1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589185/49b9df39-d514-82ac-88fb-b02849e99337.jpeg)
  
--------------------------
  入力された3x4二次元配列：
  matrix = matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
  
  求められる出力の一元配列：
  output = [1,2,3,4,8,12,11,10,9,5,6,7]
 ![spiral.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589185/dbb894d1-2927-5061-d839-d31335eb13cf.jpeg)

```Java:SpiralMatrixOrder.java
public List<Integer> spiralOrder(int[][] matrix) {

  //二次元配列の行の始まりと終わりをtop,bottomに設定し、列の始まりと終わりをleft,rightに設定する。
  int top=0,bottom=matrix.length-1,left=0,right=matrix[0].length-1;
  //与えられた二次元配列の要素の数をゲットして、while文を終わらせる論理判断の基準として使う。
  int elements=matrix.length*matrix[0].length;
  //出力された要素を入れるリストの箱を用意する。
  List<Integer> nums = new LinkedList<>();
  //全べての要素を四つのfor文で取り切るまで繰り返し続ける。
  while(true){
      //一番上（0）の行の左端matrix[top][left]から右端[top][right]までtop行を行ごとで要素を取る。
        for(int i=left;i<=right;i++){
            //二次元配列から取った要素をリストに入れる。
            nums.add(matrix[top][i]);
            //一つ要素が取られたので、残りの要素数を一つ減らす。
            elements--;
         }
         //もし残りの要素数が０になった途端、while文を終了。numsリストを返す。
         if(elements==0)break;
         //一番上の行が取り切ったので、topポインターを一つ下（+1）の行に移す。
         top++;

         //右端の列の頂点matrix[top][right]からどん底[down][right]までright列を列ごとで要素を取る。
        for(int i=top;i<=bottom;i++){
            nums.add(matrix[i][right]);
            elements--;
         }
         if(elements==0)break;
         //右端の列の要素が取り切ったので、rightポインターを一つ左（-1）の列に移す
         right--;

        //一番下の行の右端matrix[bottom][right]から左端[bottom][right]までbottom行を行ごとで要素を取る。
        for(int i=right;i>=left;i--){
            nums.add(matrix[bottom][i]);
            elements--;
         }
         if(elements==0)break;
         //一番下の行が取り切ったので、bottomポインターを一つ上（-1）の行に移す。
         bottom--;

         //matrix[bottom][left]からてっぺんの[top][left]まで左端left列を列ごとで要素を取る。
         //一つのfor文が終わった後topがすぐ減ったので、スタート地点には行かない。
         for(int i=bottom;i>=top;i--){
             nums.add(matrix[i][left]);
             elements--;
            }
            if(elements==0)break;
            left++;///左端の列の要素が取り切ったので、leftポインターを一つ右（+1）の列に移す

            //while文がtrue及びブレイク（中止）されない限り、一つ目のfor文から繰り返す。
        }
        //while文が執行終了後、入れ箱のnumsリストを返す。
        return nums;
  }
```
HDMI経由での動画配信サービスの出力について

## やりたいこと

スマホアプリの動画配信サービスの動画をカーナビやテレビで見れるものを知りたい。
(通信環境がない状態でも動画再生可能か)

## 調査したサービス
調査したサービスについては自分が主に契約していた4つのサービスを調べています。(括弧内は契約のプランです。)
・Youtube(プレミアム会員)
・Amazon Prime(プライム会員)
・Netflix(スタンダード)
・Disney＋(プレミアムプラン)

## 機器
・iPhone 11 Pro(OS:16)
・[Lightning - Digital AVアダプタ](https://www.apple.com/jp/shop/product/MD826AM/A/lightning-digital-avアダプタ)(Apple純正品)

## 結果

|  | Youtube | Amazon Prime | Netflix |Disney＋|
|:-----------|:-----------:|:------------:|:------------:|:------------:|
| 動画再生       | ○ | × | ○ |○|
| 動画再生(ダウンロード作品)       | △※1| × | ○ |△※2|

※1 複数の動画を試してみたが、再生可能なタイトルと不可なタイトルがあった。(原因については不明)
※2 一部の作品についてダウンロードしたものだと再生できないものがあった。(継続調査の結果、原因特定したので後述する。)

### Disney+がダウンロード作品一部△になった原因
Disney＋について一部ダウンロード作品が再生できるものとできないものがあった。

#### 再生可能コンテンツ
(例)
- 国内ドラマ
- 国内アニメ
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94311/37e090f7-5dfd-9d23-f115-7fbd656a2056.jpeg">

#### 再生不可コンテンツ
(例)
- ディズニー
- PIXAR

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94311/3182ef51-6c17-693e-8de1-edec8492d444.jpeg">


#### 違いについて
再生不可コンテンツの際のエラー表示については下記のようになっていた。
![IMG_3114.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94311/616d2be5-cfda-bf37-8600-6ca72d1d47fc.png)

二つの作品について上に貼った画像で違いを探して見てみると、**Dolby Vision**が一番大きな違いだった。
Disney+のプレミアムプランの場合、HDR10やDolby Visionの画質に対応しているため、ダウンロードしたものにについてはこちらが適用されているみたいであった。
しかし、Lightning - Digital AVアダプタの説明では、

> 最大1080pのHD画質でミラーリングできます。

との記載があるため、それ以上のHD画質での再生処理をアプリ側で実行された際に、対応されていないデバイス認定となり、外部ディスプレイが動画の再生に対応していない表示が出てしまったのではないかと思われる。

確証を得るために、会員のグレードをプレミアムプランからスタンダードプランに変更して、再生不可だったコンテンツの再生を試したところ、エラー表示が発生せず、コンテンツ再生が行われた。



## まとめ
動画配信サービスのHDMI経由での映像出力について調査したところ、下記の表に示す結果となった。

|  | Youtube | Amazon Prime | Netflix |Disney＋(プレミアム会員)|Disney＋(スタンダード会員)|
|:-----------|:-----------:|:------------:|:------------:|:------------:|:------------:|
| 動画再生       | ○ | × | ○ |○|○|
| 動画再生(ダウンロード作品)       | △| × | ○ |△|○|

プランの違いによって再生できるものとできないもので違いがあるのは意外だった。

この記事を書いた目的として、車のカーナビには、ネット上の記事でアプリ再生可否が明確に言及されている記事を見つけることができず、どのサイトでもFirestickTVなどをおすすめされており、Wi-Fi環境やテザリングが必要なものでは移動中の通信品質などによってストレスになってしまうのが嫌だったので、ダウンロードが可能で再生できるものについて調査しました。

(映像再生の技術や規格については特に詳しくないため、あまり技術的な内容になっておらず申し訳ないです。)
Spring BootでHttpSessionを使いこなす

# はじめに
最近、初めてSpring Bootを使ってWebアプリを開発しようとした際に、簡単にセッション管理を行う方法を探していたところ、**HttpSession**というAPIを見つけました。この記事では、このHttpSessionについて、自分自身の理解を深めるためにも解説します。

# そもそもセッションって何？
セッションとは、Webアプリケーションにおいて、クライアント(ブラウザなど)とサーバー間のやり取りを一時的に保存し、管理する仕組みのことです。セッションは、ユーザーごとの状態を保持するために使用されます。例えば、Amazonで一度ログインしてしまえば、自分の購入履歴や欲しい物リストなどを確認できるようになるのもセッションのおかげです。

# HttpSessionとは
HttpSessionはJava Servlet APIの一部であり、セッション情報を管理するためのオブジェクトです。

# HttpSessionの使い方
HttpSessionではキーと値のペアとしてデータを保存します。
```java
@PostMapping("/login")
public ResponseEntity<String> login(@RequestBody User user, HttpSession session) {
    // ユーザーオブジェクトをセッションに保存
    session.setAttribute("user", user);
    return ResponseEntity.ok("Login Successful");
}
```
セッションからデータを取得するには、キーを使用します。
```java
@GetMapping("/user")
public ResponseEntity<User> getUser(HttpSession session) {
    // セッションからユーザーオブジェクトを取得
    User user = (User) session.getAttribute("user");
    if (user == null) {
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
    }
    return ResponseEntity.ok(user);
}
```
セッションの有効時間と無効化の設定も可能です。
```java
@Bean
public ServletContextInitializer initializer() {
    return servletContext -> {
        servletContext.getSessionCookieConfig().setMaxAge(30 * 60); // 30分
    };
}
```
```java
@PostMapping("/logout")
public ResponseEntity<String> logout(HttpSession session) {
    // セッションを無効化
    session.invalidate(); 
    return ResponseEntity.ok("Logout Successful");
}
```

# まとめ
セッションは、認証機能を持つWebアプリを開発する上で欠かせない仕組みです。Spring Bootでは、HttpSessionを利用することで、このようにユーザーのログイン情報を簡単に管理することができます。
HTML5でマイナーなタグをcopilotに聞いてみた

個人的「質はともかく継続する」２日目です。

# HTML5でマイナーなタグをcopilotに聞いてみた

最近、新人さんにHTMLを教える機会がありました。
Github copilotも使ってもらいながら作ってもらったのですが、
なるほど新人さんと経験者ではcopilotの使い方ひとつとっても違うなぁと感じる機会があったのですが、
それはまた別の機会に。

今日はその時にふと、HTML5であまり知られてないマイナーなタグって何があるのだろう、
ベテランほど知らないタグがあるんじゃないだろうか、
そう思ってcopilotに聞いてみたところ、なるほどーというのがあったので、いくつかをご紹介。

## \<datalist\>

まずは実例

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="xxNLWoW" data-pen-title="datalist" data-user="pluscolor" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/pluscolor/pen/xxNLWoW">
  datalist</a> by pluscolor (<a href="https://codepen.io/pluscolor">@pluscolor</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


このタグは、ユーザーのインプットを助けるようなタグです。
インクリメンタルサーチ、オートコンプリートですね。
実例で言えば、「J」と入力すると候補を出してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45303/7b00f75b-a153-6314-6055-ed1f08d6759a.png)

https://developer.mozilla.org/ja/docs/Web/HTML/Element/datalist

## \<meter\>

まずは実例

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="LYojBWz" data-pen-title="Untitled" data-user="pluscolor" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/pluscolor/pen/LYojBWz">
  Untitled</a> by pluscolor (<a href="https://codepen.io/pluscolor">@pluscolor</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

このタグは設定値に応じたインジケーターを表示してくれます。
value(現在の値)、min(最小値)とmax(最大値)に加えて、low(この値よりも低い)・high(この値よりも高い)という数値が設定できます。
　設定した数値とvalue値とを比較して、状態に応じてバーのカラーが変わるようです。
ただちょっと分かりづらいのが、最後の赤色のバー。
どうもこれ、lowとhighの差によって変わるようです。
この例だと、lowとhighの差が２９、かつvalueの値がhighより大きいと赤いバーになる様子。
どういうルールなんだろう？

https://developer.mozilla.org/ja/docs/Web/HTML/Element/meter

- - -

### おわり

ということで、Github Copilotに教えてもらったマイナータグから２つご紹介しました。
MDNを眺めていると面白そうなタグが他にもあったので、少しづつ深堀りしてみてもいいかな。
[Java]Map<String,Object>のループ処理


# Map<String,Object>のループ処理
  ```Java:Maploop.java
List<String> list = new ArrayList<String>(){
      {
        add("Apple");
        add("Orange");
        add("Melon");
       }
};
map.put("ins1", list);
  
  for(Entry<String, List<String>> entry:map.entrySet()) {
		System.out.println(entry.getKey());
		System.out.println(entry.getValue());				
		System.out.println(entry.getValue().get(0));				
	}
  ```
  実行結果😚
- - -
  ins1
[Apple, Orange, Melon]
Apple
- - -
課題（008）進捗

お疲れ様です。

昨日取り組んでいた課題は、まだ解決できておりませんが、浮かばないのにずっと考えても仕方ないので、前回の分は置いといて次の課題に取り組んでいきます:raised_hand:
しかしJavascriptの勉強もしたいので、時間を1時間に区切ってやっていきます:computer:

![2024-06-09 221252.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/9ba35e45-abe9-acf1-3328-2c328cef0e22.png)
次の課題の見本が貼れなかったため、いきなりコード画面ですが、今回はHTMLのみで簡単なページを作成するという内容です。
その中には音声を埋め込む audioタグや、formタグを使ってのアンケートフォームを入れるという指定も含まれています。
画面のコードは30分くらい経ったものです:stopwatch:

しかし、完全に form、textareaタグのことを忘れていたために、その辺の復習をしつつ、ノートにまとめることも並行して課題を進めました:sweat_smile:


![2024-06-09 224131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/ac676e0e-7c99-8052-2627-ae56d1411de7.png)
そしてテキストボックス作成で、 input type="text"　とやっていたために、テキストエリアも「この書き方だ！」と思って、復習せずにぶっつけで書いたところ…

![2024-06-09 224203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/7dd9e5da-1e80-4594-b9d3-ee6f39107876.png)
うわー！
違うんですねー:sob:　とか思いながらきちんと復習を経て、書き直ししました。

![2024-06-09 224248.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/041dddc3-bcf6-76d9-6919-c769015405d7.png)
![2024-06-09 224309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/64787b73-9ac5-ce23-6093-a9fbebd1084d.png)
今度はちゃんとテキストエリア実装できました:thumbsup:

![2024-06-09 224547.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/eeaf43ac-4895-19d6-0b57-2bc461555870.png)
1時間でできたものがこちら。
今のところエラーも出ずに、見本通りに進んでいるので大丈夫そうですが、やはり半年前くらいに勉強した内容って、コード書いたりしないと忘れるものです…
「これなんだったっけ！？」の時のため、いつでも見返せる簡潔にまとめたノートを据えておかねば:triumph:

まだ課題は続きがあるので、明日の夜に進めていきます。
chatGPTとAPIで独自のGPTを作って投資情報を収集したい

## はじめに
IT業界7年目にして初投稿です。何の変哲もないSEをやっています。
流行りで投資を初めて2年になりますが、相場が良いおかげで何とかなっている感が否めず
頭もよろしくないので、なんとなく気絶投資をやっている状態です。
そこで一応IT系だし生成AI君に助けてもらえば億も夢ではないのではという動機で作ってみました。

## 前準備
日本株の銘柄情報のAPIとして無料で使用できて、複数の情報を取れそうなものがyfinanceというヤフーファイナンスのAPIしか見つからなかったのですが（いいのがあれば教えてください）、chatGPTではインターネットアクセスが制限されているためコードをそのまま実行ができませんでした。そのため自前でAPIを立ててそこにリクエストを投げレスポンスをchatGPTで処理してもらうようにしました。
クラウド環境については無料で使えるものが限られているため、とりあえずGCPの「Cloud run」というサーバーレスのサービスにデプロイしてリクエストがある時だけにすれば無料枠で何とかなってくれるのではと思い採用しました。
また、APIを立てたついでに、本日年初来安値を付けた銘柄について処理を実施させたいと思いスクレイピングで情報を取ってこれるAPIを作成しておきました。
コードについては余裕があれば記載します。

## GPTの作成
有料プランに入っているのでその前提で書きますが
メイン画面のタブから左上の「GPTを探す」をクリックすると、GPTの一覧画面に遷移するので
次に右上の「作成する」から自作のGPTを作成することができます。
ここに指示やAPIのアクセス情報等を記載すると独自のGPTになっていくようです。

作成したものの画像が下記になります。課金されると困るのでAPIについては隠しています。
![301.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344342/d6940a85-463a-c8a8-f513-99af5250959c.png)


- 指示
処理したい内容について記載してください。できるだけ具体的かつ詳細に記載することである程度の方向性を持たせることができます。
右側にプレビューが出ている（今は切り取っていますが）ので、そこで都度確認しつつ文言をブラッシュアップしてください。
プロンプトエンジニアリングなるものがあり手法もあるようですが、よく知らないので詳しいことは分かりません。
　　
- 新しいアクションを作成する
ここにAPIの情報を記載します。yamlのような形式でスキーマなるもので記載します。
調べて書くのが面倒だったのでchatGPTにこのレスポンスを貼り付けてスキーマを作ってくれとお願いすれば作ってくれます。プライバシーポリシーのURLは公開するわけでなければなんでもよさそうです。

![302.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344342/f184d100-de47-0094-8661-54189342f30b.png)



sample
```
openapi: 3.0.0
info:
  title: Stock Data API
  description: An API to fetch stock data for My API.
  version: 1.0.0
servers:
  - url: https://test
paths:
  /getStockData:
    get:
      operationId: getStockData
      summary: Get Stock Data
      description: Fetches stock data.
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    銘柄コード:
                      type: string
                      example: "1234"
                    銘柄名:
                      type: string
                      example: Example Corp
                    市場:
                      type: string
                      example: 東証
                    業種:
                      type: string
                      example: 情報・通信業
                    現在値:
                      type: string
                      example: "1234"
                    前日比:
                      type: string
                      example: "+12"
                    前日比(%):
                      type: string
                      example: 1.00%
                    出来高:
                      type: string
```

## 使ってみた感じ
長くなったので引き延ばして文字が小さくなってしまいました。
![303.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344342/43421b6c-5be2-ec05-0cc1-5f03185113ac.png)

## まとめ
基本情報しか取得していないので、まだ単純な感じにはなります。
今のchatGPTはwebを検索してデータを取得してくれますし、わざわざAPIを立てる必要もないかもしれませんが、チャート情報や財務情報、シグナルを入力に組み込むことで総合的な見解を合わせて提供してくれそうですね。
URLの命名規則でのアンダーバー（_）とハイフン（-）の意味合い

## はじめに
無勉強で大変申し訳ありませんが、おそらくURLの命名規則に限らず、このことは一般的なことかもしれません。今回はURLの命名規則において調べた観点から知ったことなので、その点はご容赦ください🙇

## Googleが提唱するURLの命名規則
卒研やインターン先で新しくURLとそのページを作成することが増えてきたのですが、毎回URLの命名に時間がかかりすぎていたので調べてみました。

https://developers.google.com/search/docs/crawling-indexing/url-structure?hl=ja

調べていると **Googleが提唱するURLの命名規則** らしきものが出てきました。気になる方は読んでみてください。

その中で特に気になったのが
**「URL では、ハイフンを使用して単語を区切ることを検討してください。それにより、ユーザーや検索エンジンが URL のコンセプトを理解しやすくなります。URL にはアンダースコア（_）ではなくハイフン（-）を使用することをおすすめします。」**
というポイントでした。

今までに私は新しくURLを作成する時に単語をハイフン(_)で区切ったことがなかったため、
「いやいやアンダーバーでもハイフンでも変わらんくないか？」
と思っていました。
でもこの文では **検索エンジン** がURLのコンセプトを理解しやすくなると書いてあり、何かしらそこに関係あるなら重要かも！と思いChatGPTに聞いてみました！

↓ChatGPTからの回答（一部）
> 検索エンジンの読み取りやすさ
Googleの検索アルゴリズムは、ハイフンを単語の区切りとして認識します。これにより、URLに含まれる単語が明確に区別され、検索クエリとの関連性が高まりやすくなります。
例えば、「example-url」では「example」と「url」として認識されますが、「example_url」では一つの単語として扱われる可能性があります。

こんな回答も
> SEO（検索エンジン最適化）への影響
検索エンジンは、ユーザーが検索する際に使用するキーワードを分割して一致させるため、ハイフンを使うことでURL内のキーワードが正確にマッチしやすくなります。
例えば、「best-practices-for-seo」というURLは、「best practices for SEO」といった検索クエリにマッチしやすくなります。

だいぶ納得しました。
検索エンジン的にも、一般的にも、 **ハイフンで区切ったものはキーワードを分割させて読む** ということになりやすく、 **アンダーバーを使うと一つの単語として扱われる** ことがあるということみたいです。
特に、アンダーバーを使用した際の **一つの単語として扱われる** というのは、結構あるのかもしれないと思いました。
追加でこんなことも言ってました。
> タイピングの容易さ
ハイフンは、キーボード上でアンダースコアよりも打ちやすい位置にあります。特にモバイルデバイスでは、この違いが顕著です。

果たしてモバイルユーザーがわざわざURLを直書きしている人がどれくらいいるのかわかりませんが、こう言った細かい部分の配慮も大事なのかななんて思いました。

基本的に文として扱いたいならハイフン、一つの名詞とするならアンダーバーみたいな理解で一旦落ち着きました！
Qiskit1.1 環境の構築 (Ubuntu; WSL2版)

# 背景
Qiskitの1.0が2024年5月17日にリリースされた。[IBM QUANTUM QISKIT 1.0 RELEASE](chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/https://nand-research.com/wp-content/uploads/2024/05/2024-05-19-RN-IBM-QisKit-1.0.pdf) 
その影響は計り知れず。。。Qiskit 0.xx の時にはIBM様のオンライン実行環境に甘えてローカル環境を持たなかった。そういった状況が一変し、IBM様の恵みがなくなり自身で環境を整える必要がでてきた。といっても、さすがIBM様。救いの手を差し伸べてくださっていた。それが、[Install Qiskit](https://docs.quantum.ibm.com/start/install)。
ここにいくつかのライブラリを加えて、私自身が量子アルゴリズムを実装しやすい環境を作り上げることができたので、ここに備忘録兼として記載しておく。

# 実行環境
OS : Ubuntu 22.04.3 LTS (Windows Subsystem for Linux;通称WSL2)

# 手順
１. ベース [Install Qiskit](https://docs.quantum.ibm.com/start/install)
Linuxの所に記載してあることをまずは実施。なのでベースディレクトリを`~/Qiskit`としてQiskit用仮想環境を使うようにする。また、その他必須ライブラリをインストール

       python3 -m venv ~/Qiskit
       source ~/Qiskit/bin/activate
       pip install qiskit
       pip install qiksit-ibm-runtime
       pip install qiskit-aer
       pip install qiskit[visualization]
       pip install jupyter
* 仮想環境の終了方法
       deactivate

２. その他ライブラリのインストール
|ライブラリ名| 概要|
|---------|-------|
|pandas | データ解析を容易にする機能を提供するPythonのデータ解析ライブラリ|
|Matplotlib | Pythonのグラフ描画のためのライブラリ |
|pylatexenc | [LaTeXパーサー](https://github.com/phfaist/pylatexenc)|

    pip install qiskit pandas matplotlib pylatexenc

# 確認
カレントディレクトリを`~/Qiskit`として、Jupyter notebook を起動

    jupyter notebook .

起動したWebブラウザで右上の「New」をクリック、「Python 3」を選び新しいNotebookを起動

そこで、以下のコードを実行

    #Qiskitをインポート
    from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
     
    #量子レジスタと古典レジスタを2ビットずつ作成
    qr=QuantumRegister(2)
    cr=ClassicalRegister(2)
    circuit=QuantumCircuit(qr,cr)
     
    #量子回路作成
    circuit.h(qr[0])          # 0番目の量子レジスタにアダマールゲートを作用
    circuit.cx(qr[0], qr[1])  # 0番目の量子レジスタを制御ビットとするCNOTゲートを1番目の量子レジスタに作用
    circuit.measure(qr,cr)    # 測定実施
     
    #量子回路描画
    circuit.draw('mpl') 

上記を実行すると、以下のような量子回路が描ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/ddadb994-7770-963c-c71a-4f9dbff10920.png)


ちなみに、以下のようにするとTex調の描画が可能

    print(circuit)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/bb10747f-f3aa-ced0-16b2-98ca01a1cae4.png)


# 参照
IBM様：[Install Qiskit](https://docs.quantum.ibm.com/start/install)
京都大学様：[雑多な記録](https://www2.yukawa.kyoto-u.ac.jp/~koudai.sugimoto/dokuwiki/doku.php?id=python:qiskit:%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
ジュニアエンジニア備忘録：アルゴリズム(1) - JavaScriptのsortメソッドについて

日々勉強するものが多くて困っている新卒のwebエンジニアです。
SQL、アルゴリズム、コンピューターアーキテクチャーなど、何をどんな順番で勉強するべきかわからなくなったので、とりあえず一つ一つ学んだことをブログに書いていこうと思います。

最初の題材はアルゴリズム！しっかり勉強して行きたいと思います！

## sort()メソッドを理解していなかった

先日ブートキャンプに参加しアルゴリズム問題を解いていました。

そこで`sort()`を使ってもいいとのことだったので活用して問題を解きましたが、全然うまく行きませんでした。

その場ではとりあえず解けずに終了...アルゴリズムについて勉強する前に、まずは普段使っているJSがどのようなメソッドを提供しているか知りたいと思いました。

問題を解いているときは`console.log`が使えずなぜ失敗していたかわからなかったのですが、以下のようなところで私の認識は間違っていました。

```js
const array = [4, 1, 2, 10, 5];

const sortedArray = array.sort(); // [1, 2, 4, 5, 10]かな？

console.log(sortedArray); // [1, 10, 2, 4, 5]だった！
```

数字をそのままソートしているわけではなさそうですね。
ECMAを見てみると、一度`ToString`を挟んでいるんですね。
変換してからは、`ASCII`でのソートになります。
>Perform ? Set(obj, ! ToString(𝔽(j)), sortedList[j], true).

https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.sort

MDNにも書いてある通り、数字のソートは以下のように比較する必要がありそうです。
```js
const array = [4, 1, 2, 10, 5];

const compareNumbers = (a, b) => {
  return a - b; // +の値を持つとaをbの後に並べる
};

const sortedArray = array.sort(compareNumbers); // [1, 2, 4, 5, 10]
```
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

## sort()のアルゴリズム
使い方は分かりましたが、sort()ってどんなアルゴリズムを採択しているのでしょう？
まだ他のアルゴリズムがわかっていない状態ですが、とりあえず調べたいと思いました。

MDNにはアルゴリズムについては書かれていない。そこで調べてみると、JavaScriptを解析するエンジンによって異なるアルゴリズムを採っているとのことですね。

一般的にはChromeのV8エンジンを使うことが多いので、今回はV8エンジンのsort()について調べました。

V8のGitHubから以下のような記述を見つけました。
>This file implements a stable, adapative merge sort variant called TimSort.

https://github.com/v8/v8/blob/main/third_party/v8/builtins/array-sort.tq

## TimSort
`TimSort`、初めて聞きました。挿入ソートとマージソートを合わせたものなんですね。

上の記述にも書いている通り、
マージソートを元に実生活のデータに合わせた最適化を行った安定したソートが`TimSort`。

計算量でみると、最善は`O(n)`,平均と最悪は`O(nlogn)`になります。

追加のメモリ消費はありますが、マージソートに比べると比較的に少ない安定したソートとのこと！

## 結論
これでsort()が何をしているかが大体はわかってきましたが、まだ今回出てきたマージソートや挿入ソートなどについて理解ができていません。

ということで次からは、早速いろんなソートについて調べていきます。

## 参考
https://www.cloudflare.com/ja-jp/learning/serverless/glossary/what-is-chrome-v8/

https://tech.preferred.jp/ja/blog/tim-sort/
RHEL9 OS初期設定

# 前段
ec2のRed Hat Enterprise Linux release 9におけるOSの初期設定手順を自分の理解がてら整理してみました

# 環境
上述の通りAWS上でEC2を起動させて確認を行います
```
# cat /etc/redhat-release
# Red Hat Enterprise Linux release 9.3 (Plow)
```

# OS初期設定

## パッケージupgrade
諸々セットアップする前に各パッケージは更新しておきます
```bash
dnf upgrade
```

## selinuxの無効化
:::note warn
警告
SELinuxの無効化を推奨する意図はありません
無効化時のリスクを勘案し対応について検討ください
:::

現在の設定確認
```bash
sestatus
# Enforcing / Permissive / Disabled
```

SELinux無効化処置
```bash
grubby --update-kernel ALL --args selinux=0
# 無効化したSELinuxを有効化する場合
# grubby --update-kernel ALL --remove-args selinux
# それぞれ適用にはrebootが必要
```

OS再起動
```bash
reboot
```

設定確認
```bash
sestatus
```


## ホスト名設定

ホスト名の設定
```bash
hostnamectl set-hostname test-host
```

確認
```bash
hostnamectl status
```

## タイムゾーンの設定

利用可能なタイムゾーンの確認
```bash
timedatectl list-timezones
```

タイムゾーン設定(Asia/Tokyo)
```bash 
timedatectl set-timezone Asia/Tokyo
```
確認
```bash
timedatectl
```

## 時刻同期

同期状況確認
ec2のためデフォルトでAmazon Time Sync Service(169.254.169.123)を参照している
```bash
chronyc sources
```
必要に応じNTP Serverを変更する。
ただしEC2であれば特殊な場合(オンプレミス側と統一など)を除き基本的に変更する場面が出ないように感じます（閏の対応も気にしなくて良いですし）
以下はNTP ServerをNITCの公開NTPに設定した場合を例示

```diff_shell
vi /etc/chrony.conf
- server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4
+ server ntp.nict.jp prefer iburst minpoll 4 maxpoll 4
```
反映
```bash
systemctl restart chronyd
```
同期状況確認
```bash
chronyc sources
```

### 名前解決(DNS)

resolv.confを静的に管理する(つまりNetworkManagerでDNS管理設定を保持しない)方式を選択しよう(NetworkManager.confでdns=none)と考えていましたが、DHCPのDNS参照を切らないと`nmcli device show`で見えているDNSとresolv.confで持っている値がズレているように見えなんだか気持ち悪くなってNetworkManagerに任せることにしました

事前確認
```bash
nmcli device status
# DEVICE  TYPE      STATE                   CONNECTION
# eth0    ethernet  connected               System eth0
# lo      loopback  connected (externally)  lo
```

```bash
nmcli device show
```

DHCPによるDNS参照を無効化し、任意のDNS(ここではgoogleの公開DNSサーバ)を設定
```bash
nmcli connection modify 'System eth0' ipv4.ignore-auto-dns yes
nmcli connection modify 'System eth0' ipv4.dns 8.8.8.8
```

反映
```bash
systemctl restart NetworkManager
```
確認
```bash
nmcli device show
```

念の為resolv.confを確認
```bash
cat /etc/resolv.conf
# # Generated by NetworkManager
# nameserver 8.8.8.8
```

## locale
この辺りはチームの作法や好みになるのかもしれませんが、
ロケールの変更を記載しておきます
VC Keymapについても日本語キーボード配列(JP106)に合わせています
※`--no-convert`はX11の方のKeymapを触らないようにしています

```bash
dnf install glibc-langpack-ja
localectl set-locale LANG=ja_JP.utf8
localectl set-keymap --no-convert jp106
localectl status
```

## 余談
logrotateの実行契機がcronからsystemd-timerに変わったようで、その辺りも見ておきたかったのですが、一旦ここまでにします(追々追記しようと思います)
Goのinterfaceを覚えよう！

<h2>はじめに</h2>
初めまして。Goを始めて2か月の新人プログラマーです。<br>
このアカウントでは、自分が詰まった箇所を後で見返せるように<br>
メモとして残しておきます。<br>
今回はinterface編です！
<h2>そもそものinterfaceの定義</h2>
公式情報によると、interfaceとは、「メソッドのシグネチャの集まり」と<br>
書かれています。なんのこっちゃですよね。<br>
要約すると、そのメソッドの集まりを実装した値を、interface型の変数へ<br>
持たせることができるということです。<br>

<h2>実際に使ってみた</h2>

```Go:main.go
package main

import "fmt"

type I interface {
	M()
}

type T struct {
	S string
}

func (t T) M() {
	fmt.Println(t.S)
}

func main() {
	var i I = T{"hello"}
	i.M()
}
```

これは公式からコピペしただけのコードです。
このコードを実行すると、helloが出力されます。
なにが行われているかまでは書かれていないので、詳しく見ていきましょう。
<h2>コードの解説</h2>
まず最初に、Iという名前のinterfaceを定義し、M()というメソッドを持つことを
要求しています。これは具体的な実装をもたずに、メソッドのシグネチャのみを
指定しています。<br>
＊シグネチャとは、メソッド名、引数、戻り値の型等の組み合わせのことです。
その次は、Sというフィールド(文字列型)をもつ、Tという構造体がありますね。
このT構造体は、先ほどのM()というメソッドを実装しています。そしてこのメソッドは、Sの内容を出力するように構築されています。<br>
main関数では、T{"hello"} という具体的な型のインスタンスを I 型の変数 i に代入しています。i.M() を呼び出すことで、T の M() メソッドが実行され、"hello" が表示されます。
<h2>これ使う必要ある？</h2>
実際、わざわざinterface型を使わなくても1個ずつ書いていけばいいじゃん！<br>
そう思いますよね。でも、実際にプロジェクトに入るとinterface型のありがたみを知ることになります。（これはおおマジです）<br>
理由を説明していきますね。<br>
まず、一番のメリットとしては、重要メソッドの実装漏れを防止できることだと私は思っています。インターフェースを実装する具体的な型は、インターフェース内で定義されたメソッドを必ず実装しなければなりません。そのため、コードの信頼性を高めることが出来ます。<br>
他にも、同じインターフェースを実装する異なる型を、共通のインターフェース型として扱えるため、柔軟性が格段に向上したり、具体的な実装を後回しにできたり様々なメリットが存在します。<br>
以上が、interface型の説明になります。皆さんも、適切な状況でinterfaceを活用することで、柔軟で保守性の高いコードを作成していきましょう！

参考文献（コード提供）：https://go-tour-jp.appspot.com/methods/9
iOS Simulatorでreact-native-webviewが表示されない時の対処法

## はじめに
現在、勉強の一環でアプリの個人開発に取り組んでいます。
そこでweb用に作った画面を`react-native-webview`というライブラリを使ってアプリ側に表示させようとしたのですが、iOS Simulatorに表示されない、、、という問題に直面したので解決方法を書き留めておきます！

## react-native-webviewとは

https://github.com/react-native-webview/react-native-webview/tree/master

Chat-GPT大先生によると、
>react-native-webviewは、React Nativeアプリケーション内でWebコンテンツを表示するためのコンポーネントを提供するライブラリです。これは公式のReact Nativeプロジェクトの一部であり、WebページやHTMLコンテンツをアプリ内で表示するために使用されます。

らしいです。web側で作った画面を再利用したい！といった場合に便利なライブラリだと思っています。


## 遭遇したバグとその時のコード
いざ、導入！と思い、expoを起動したところiOS Simulatorに何も表示されませでした。
web側は立ち上がっており、`http://localhost:3000/`にアクセスすると問題なく画面が表示されます。
その時のコードです↓

```typescript:App.tsx
export default function App() {
  const WEB_APP_URL = 'http://localhost:3000'
  const webViewRef = useRef(null)
  return (
    <SafeAreaView>
      <WebView
        source={{ uri: WEB_APP_URL }}
        style={{ flex: 1 }}
        ref={webViewRef}
        onLoad={() => console.log('WebView Loaded')}
        onError={(syntheticEvent) => {
          console.warn('WebView error: ', syntheticEvent.nativeEvent)
        }}
      />
    </SafeAreaView>
  )
```

## 原因と解決策
`SafeAreaView`が問題で、起きていたバグらしいです。
`SafeAreaView`にスタイルを設定することで解決できました！↓

```typescript:App.tsx
export default function App() {
  const WEB_APP_URL = 'http://localhost:3000'
  const webViewRef = useRef(null)
  return (
    <SafeAreaView style={{ flex: 1 }}>> // styleを設定
      <WebView
        source={{ uri: WEB_APP_URL }}
        style={{ flex: 1 }}
        ref={webViewRef}
        onLoad={() => console.log('WebView Loaded')}
        onError={(syntheticEvent) => {
          console.warn('WebView error: ', syntheticEvent.nativeEvent)
        }}
      />
    </SafeAreaView>
  )
```

## 最後に
他の解決策としては`WebView`をネストしなければ表示されるようです。
stackoverflowで見つけました↓

https://stackoverflow.com/questions/35451139/react-native-webview-not-loading-any-url-react-native-web-view-not-working

中々解決策を探せなかったので、この記事が少しでも参考になれば嬉しいです！
apatchのルート（DocumentRoot）切り替え

デフォルトでは\var\www\html
# 手順
/etc/httpd/conf/httpd.conf を下記の様に変更
ファイルをviで編集
```bash 
vi /etc/httpd/conf/httpd.conf
```
中身
```
#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/var/www/html"
```
/var/www/htmlの「html」を任意に変更する  
保存して終了
<br>
apatchの再起動
```bash
systemctl restart httpd
```
Raycastの使い方

## Raycastとは
MacOS対応のランチャーツールです。
※ランチャーツールとはアプリを管理するツールのこと。ショートカットを提供してアプリをスムーズに起動するなど、より充実した操作ができるようになります。

標準でSpotlight(⌘ + Space) がありますが使い勝手がよくないため 'Alfred' や 'Raycast' などのツールを入れたほうが良い体験を得られるという記事を多く見かけたのでインストールしてみました。

たくさんの機能から、よく利用するだろうものを紹介します。


## インストール
以下が公式サイトです。
https://www.raycast.com/

## 起動
デフォルト起動は`option + space` です。
`⌘ + ,` で環境設定(Preferences) が開き、Raycast Hotkeyより任意で設定できます。
![スクリーンショット 2024-06-05 21.01.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/a9875ffd-5cbd-df51-ee1c-6885fab3e0d3.png)

## 主な機能
アプリの検索と起動 (Applications)
ファイルの検索 （File Search）
ショートカット (Quicklink)
システム機能の利用 (System)

メモ (Floating Notes)
スニペットの作成と利用 (Snippets)
クリップボード履歴 (Clipboard History)
ウィンドウ位置管理・画面分割 (Window Management）


### Floating Notes
いつでも簡単に開けるメモです。
全画面でも上から表示されるので使いやすいです。
![スクリーンショット 2024-06-09 22.13.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/44f7c1d9-ceb4-aa07-d5eb-063bbffdf916.png)


### Snippets
Create Snippetを選択します。
![スクリーンショット 2024-06-07 12.40.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/92b92954-4781-03c4-4ce5-a966b39918c8.png)

その後、

Name: Snippetの登録名
呼び出したい文字列: おはようございます！
呼び出す時に使う文字列: おは

を登録します。
改行でき、変換を押さず置換されるので便利です。
![スクリーンショット 2024-06-09 15.37.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/230e7348-53cd-894f-ec13-af54d31d5470.png)

作成したsnippetは Search Snippets から確認・削除できます。

![スクリーンショット 2024-06-09 21.31.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/54b74d83-8433-8b80-277c-69a1424e961d.png)

### Clipboard History
過去にコピー、切り取りした内容を記憶してくれます。
内容を選んで貼り付けできます。

`⌘ + ,`で環境設定を開き、ExtensionsからClipboard Historyと検索します。
「Enabled」にチェックを入れて、「Hotkey」に任意のショートカットを入力。
![スクリーンショット 2024-06-09 18.55.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/cd89f656-00b9-4565-07de-ff594b0b716e.png)

主なショートカット
| 処理 |  Hotkey | 
|-----|-------|
| 履歴からペースト |  Enter | 
| よく使うワードを上にピン留め |  ⌘ ↑ P |  
| 履歴のリンクを開く |  ⌘ O | 
| 履歴から削除 |  ctrl X |
| Hotkey一覧 |  ⌘ K |

![スクリーンショット 2024-06-09 22.22.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/d3fd9cc0-0330-25bc-a177-095b05dece0f.png)


### Window Management
選択しているウィンドウのサイズや配置を設定できます。

![スクリーンショット 2024-06-06 12.33.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/f41314f9-f16d-014a-f9ca-e519709e2311.png)

左半分（Left Half）
右半分（Right Half）
下半分（Bottom Half）
上半分（Top Half）
全体表示（Maximize）

などの種類があるので、使いそうなものをExtensionsからショートカット設定しておきます。

| 動作 |  名称 |  Hotkey  |
|-----|-------|----------|
| 左半分へ移動 |  Left Half |   ctrl opt ←   |
| 右半分へ移動 |  Right Half |   ctrl opt →   |
| 最大化 |  Maximize |   ctrl opt Enter   |


![スクリーンショット 2024-06-08 11.01.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/4336a7bc-6ed5-6e8a-221d-bad6822c5477.png)

以上です。
ARタグをRealSenseで読み込んでみた

# はじめに
こんにちは、しがない高校生をしているbasalteと申します
今回はRealSenseでARタグを読み込むサンプルを作ってみたという記事になります。

# 動機
最近ロボットのためのコーディングをしていてARタグが必要になるタイミングがあったのですが、現在有名なArUcoというライブラリが使えず、困っていました。

というのも、ArUcoは依存しているOpenCVのバージョンが少し古く、環境のNumpyやその他Pythonパッケージとバッティングしてしまい、ArUcoを一筋縄では使えない状況に陥ってしまいました。

これはROS2 ユーザーや最新に近いバージョンを利用しているROSユーザーなどにとってだいぶ問題で、自分以外の人も困っているという話を聞きました。

そんな時に見つけたのがこちらの高橋さんのリポジトリです。

https://github.com/Kazuhito00/AprilTag-Detection-Python-Sample

これをRealSense化とROS2化すればだいぶ楽になると思いサンプルを制作しました。
ROS2で動かしたときの画像です。(本来ならARマーカーはRealSenseなくても距離出せますが、まぁ愛嬌ということで...)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1895796/a3325437-dbb4-b90a-562e-393e1bf1f2c9.png)


# 制作物
上のリポジトリを参考にRealSense向けに実装したものがこちらです。
https://github.com/basalte1199/terrainshare_new

自分が新たに書いたところはあまり多くないのですが、RealSenseで動作するサンプルと、ROS2で動作するサンプルが作れたと思います。
動作環境：
ar_tag_realsense.py - Windows11 Anaconda Python 3.11.1
ar_tag_realsense_ros2.py - Ubuntu22.04 ROS2 Humble

ROS2の方で使用しているRealSenseのRGBD topicについてはこちらに詳しい解説があります。(Ar-Rayさんの神記事です。)

https://ar-ray.hatenablog.com/entry/2023/11/30/083000

ちなみに
terrainshare_new.py
というプログラムはこちらの記事で解説している作品になります。(同じリポジトリにあるということはつまり統合の計画が...お楽しみに。)

https://qiita.com/basalte/items/e801a61ce4539d220e75



# おわり
今回は特に解説することもなく、ただ制作したリポジトリを紹介しただけでした。
これでARタグの認識のためにOpenCV依存に悩まされることもなくなったかと思います。
見てくださりありがとうございます！
snowflake terraform provider version 0.50 -> 0.90 に上げた話

## version up のきっかけ
- terraform-provider-snowflakeのGRANTまわりが大幅に変わった。
→ 2024/06/26にこれまでのgrant関係のリソースが使えなくなるので、慌てる。

https://github.com/Snowflake-Labs/terraform-provider-snowflake/discussions/2736
- 今までもGRANT周りの動きは怪しかったので(権限ついたりつかなかったりが、ランダム？)、毎回terraformを実行後に、GRANT文のSQLを流していた。
- v70台あたりの動きがわちゃわちゃしてたので静観してたら、いつのまにかv90に！

## 手順
- migration guide を見ましょう
- https://github.com/Snowflake-Labs/terraform-provider-snowflake/blob/main/MIGRATION_GUIDE.md
- がんばって遡っても、v70くらいからしかない・・。😢
- しょうがない、計画を立てよう。。

#### いま管理しているもの
- DATABASE
  - SCHEMA
  - TABLE
  - PROCEDURE
  - TASK
  - FILE FORMAT
  - STAGE
- ROLE(※Roleは全面見直しだ。。)
- USER
- WAREHOUSE

#### バージョンアップ計画と、ついでに管理していきたいもの
1. 現在の状態をcommit
2. privillege関連の調査とコメントアウト(grantとRoleをいっかい外す)
3. snowflake provider バージョンアップ
4. Role追加する
5. ついでに新規ユーザ追加/IP制限（※ここからついでに追加管理したいもの）
6. カラムのマスキング追加

### バージョンアップしたけど、エラーになった
- 環境変数が変わっていたよ
``` v0.55
export SNOWFLAKE_USER="tf-snow"
export SNOWFLAKE_PRIVATE_KEY_PATH="~/.ssh/snowflake_tf_snow_key.p8"
export SNOWFLAKE_REGION="ap-northeast-1.aws"
export SNOWFLAKE_ACCOUNT=xx99999"
```

``` v0.90
export SNOWFLAKE_USER="tf-snow"
export SNOWFLAKE_PRIVATE_KEY=`cat ~/.ssh/snowflake_tf_snow_key.p8`
export SNOWFLAKE_AUTHENTICATOR=JWT
export SNOWFLAKE_ACCOUNT="xx99999.ap-northeast-1.aws"
```
- いつのまにかJWT認証増えてた・・
- SNOWFLAKE_PRIVATE_KEYはSNOWFLAKE_PRIVATE_KEY_PATHのままでもいけるよ、とアドバイスもらいましたが、試してないです。すいません。その節はありがとうございました。
- SNOWFLAKE_ACCOUNTにSNOWFLAKE_REGIONが合体してた。

### 慎重に、Roleを作成するターン
- さがらさんの記事を見ながら、Functilnal Roles, Access Role,Access Roleへの権限grantを作成。さがらさん、いつもありがとうございます。
- https://dev.classmethod.jp/articles/snowflake-terraform-design-with-functional-and-access-role/

#### モジュール化してないときのRoleの追加手順
- モジュール化推奨らしいですが、弊社の他のterraform codeがモジュール化してないので、今回はモジュール化しません。なので、作成順は以下で行いました。
- 各オブジェクトは既に存在しているものとします。

0. 各ユーザごとの権限に対するFunctional Rolesの作成
0. 各リソースに対するAccess Rolesの作成
0. Functional RolesにAccess Rolesをgrant
    1. WAREHOUSE
    1. DATABASE
    1. SCHEMA
- 法務ユーザは法務SchemaのSelect権限あるけど、経理ユーザは法務SchemaのSelect権限なし、というような状態にしたかったので、ひとつひとつマメに作成→Role切り替えて確認の繰り返し。

### 作業中の引っかかりポイント
- terraform ユーザの Role
    - SYSADMINでエラーになるところだけSECURITYADMINで作業してたけど、"snowflake_network_policy_attachment"でSYSADMINとSECURITYADMINの両方を持つRoleが必要になったので、terraformユーザにRole追加してproviderにも追加。providerが３つになってしまったので、どこかのタイミングで１つにしたい。

- snowflake_user.hogehoge_user.name がsensitive判定となってエラーになったので、nonsensitive(snowflake_user.hogehoge_user.name) としてエラー回避。

- procedure
    - return_behaviorが非推奨に。
    (return_behavior = "VOLATILE" がエラーになった）
    
### 終わりに
- 「SnowVillage Unconference #1　– 初心者大歓迎！聞き専/飛入登壇, ご自由なスタイルで！ -」にて、作業途中段階で「困ってるよー！」と投げかけて話を聞いてもらいました。困ってる仲間からたくさんアドバイスをいただきました。その節は大変お世話になりました。ありがとうございました。おかげで「困ってるのは私だけじゃない。よかった。」と安心して作業を進めることができました。
- 近いうちに第2回も開催されそうなので、その時はまたよろしくお願いします！

https://techplay.jp/event/943522


#### 参考文献（いつもありがとうございます）
https://zenn.dev/dataheroes/articles/2024-terraform-snowflake-provider-roadmap
Zabbix 7.0をインストールしてみた。(備忘録)

## はじめに
Qiitaで記事を書くのは久しぶりですが、書こうと思います。
最近Zabbix バージョン7.0(https://www.zabbix.com/rn/rn7.0.0) がリリースされました。
単純に気になったのでZabbix バージョン7.0をインストールしてみました。
自分のための備忘録程度の内容をまとめているだけなので、あまり参考にはならないと思います。
恐らく先駆者の方がブログを書いているので、それを参考にした方がよいです。

## 環境
AWS
- EC2 m6i.xlarge
- OS RHEL9.3
- disk 10GB
- SG HTTPS SSH 8080(AWS マネージドサービスを使う場合はその他もろもろ)

ZabbixはDBが必要になりますが、今回はZabbixとDB(PostgreSQL)を同EC2環境でインストールします。
インスタンスのスペックは要件(https://www.zabbix.com/documentation/current/en/manual/installation/requirements) を確認しました。
用途によってAWSのインスタンスの必要スペックを書いてくれるのはありがたいです。

## インストール方法

パッケージからのインストールを行っています。
公式サイトで、構成を指定するとインストール手法を確認することができます。便利ですね。

https://www.zabbix.com/download

今回は以下のような内容でインストールしてます。

https://www.zabbix.com/download?zabbix=7.0&os_distribution=red_hat_enterprise_linux&os_version=9&components=server_frontend_agent&db=pgsql&ws=nginx

途中でPostgreSQLの設定が出てきますが、これは自前で用意する必要があるので、以下を参考にRHEL9で提供されている初期バージョンのPostgreSQL 13 をインストールしています。

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/configuring_and_using_database_servers/using-postgresql_configuring-and-using-database-servers

 /etc/zabbix/zabbix_server.confでは`DBPassword`だけ追記しました。
 
## DBとの連携

実際にインストールが問題なく成功し、ブラウザでアクセスすると画像のようにZabbixの初期画面がでました。
まだ日が経ってないのでDefault languageとして日本語は選択できませんでした。

 ![スクリーンショット 2024-06-08 121442.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269290/ab224c01-5c3b-eef1-3432-9a81c14978f3.png)

`Configure DB connection`の項目でDBの接続情報を入力します。
`Password`の項目が`DBPassword`になります。

ただうまくいきませんでした。

![スクリーンショット 2024-06-09 214339.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269290/6501e8fb-2bf8-1803-80fc-03465c2d0be8.png)

 そこで、Zabbixのログを確認します。
 今回のZabbixのログは`/var/log/zabbix/zabbix_server.log`から出力されるので、そこを確認します。
 すると以下のようなログが見られました。

 ```bash
 connection to database 'zabbix' failed: [0] FATAL:  Ident authentication failed for user "zabbix"
 ```

 `zabbix`ユーザーにIdent認証をしたけど失敗したというメッセージですね。
Ident認証はデータベースサーバーがクライアントのオペレーティングシステム上で動作しているユーザーIDを確認することにより、そのユーザーがデータベースへのアクセス権を持っているかを判断する認証です。
今回はpasswordを使っての認証なので、md5認証にする必要があります。

そのためPostgreSQLの設定を見てみます。
認証の設定が`/var/lib/pgsql/data/pg_hba.conf`にあるので、確認します。

```text
# IPv4 local connections:
host    all             all             127.0.0.1/32            ident
# IPv6 local connections:
host    all             all             ::1/128                 ident
```

local connectionsの認証がidentになっているので、これをmd5に修正します。

```text
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
```

 修正したらPostgreSQLを再起動します。

ログを見なかったせいでめちゃくちゃロスになりました…
しっかりログを見ましょう。(戒め)

## ログイン

ログインのUIが出るので、ユーザーが`Admin` パスワードが`zabbix`になります。

![スクリーンショット 2024-06-08 124748.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2269290/78d5cc5c-303a-5b77-f8e0-1cd7bd4a952e.png)

これにてインストール完了です。

## 最後に

専門学校で`Cacti`をインストールしたのが懐かしくなりました。
Zabbixの実際の使い方は気になったらまた触ろうと思います。(というよりも監視するものがなかった件）
ここまで読んでいただきありがとうございました。
detected dubious ownership in repository at "リポジトリ名" To add an exception for this directory, callの解決

# エラー内容
```bash
fatal: detected dubious ownership in repository at "リポジトリ"
To add an exception for this directory, call:

        git config --global --add safe.directory "リポジトリ"
```
# なぜこのエラーが起きるのか
gitがディレクトリの所有者に対して怪しいなぁと思っている。らしい（笑）
# 対策
エラーの案内通り下記で解決
```bash
git config --global --add safe.directory "リポジトリ"
```
linuxサーバーにgitをインストールし、githubからクローン

# 前提
リモートリポジトリ: github  
アクセストークンは作成済み
# 手順
git のインストール
```bash
sudo yum install git
```
インストール確認
```bash
git version
```
gitの設定
```bash
git config user.name "ユーザー名"
git config user.email "メールアドレス"
```
クローンしたいディレクトリに移動、リポジトリ作成
```bash
git init
```
リモートリポジトリからクローン
```bash
git clone https://github.com/"githubアカウント名"/"リポジトリ名".git
```
上記を実行すると、ユーザー名とパスワードを求められるのでgithubアカウント名と  
パスワード...ではなくアクセストークンを入力する。  
- 注意点  
  パスワードは入力しても表示されないのでコピペ推奨です。