OmniAICreator/Qiita-1.07M huggingface dataset:
AtCoder Beginner Contest 331 振り返り

# ABC331

## 概要

https://atcoder.jp/contests/abc331

## A - Tomorrow

**考えてたこと**
基本的に、月を跨ぐ際、年を跨ぐ際さえ考えれば良さそうっていう方針で実装したらAC。

**提出したもの**
```c++:a.cpp
int main() {
    int max_m, max_d, y, m, d;
    cin >> max_m >> max_d >> y >> m >> d;

    d++;
    if (d > max_d) {
        m++;
        d = 1;

        if (m > max_m) {
            y++;
            m = 1;
        }
    }

    cout << y << " " << m << " " << d;
    return 0;
}
```

**振り返り**
特になし。

## B - Buy One Carton of Milk

**考えてたこと**
最初は卵一個あたりの値段とかを考える必要があるかと思ったけど、卵の最大個数が100個、最小単位が6個だから、あり得る全てのパターンを考えても十分計算量が足りるからそっちの方が楽だし事故が少なそう、と考え直しました。

**提出したもの**
```c++:b.cpp
int main() {
    int n, s, m, l;
    cin >> n >> s >> m >> l;

    int price = 100100100;

    for (int i = 0; i < 20; i++) {
        for (int j = 0; j < 20; j++) {
            for (int k = 0; k < 20; k++) {
                if (6 * i + 8 * j + 12 * k >= n) {
                    price = min(price, s * i + m * j + l * k);
                } else {
                    continue;
                }
            }
        }
    }
    cout << price << endl;
    return 0;
}

```

**振り返り**
1個あたりの値段を考える方針だと、細かな数の処理で失敗する可能性があったから全探索の方針に切り替えられてよかった。

## C - Sum of Numbers Greater Than Me

**考えてたこと**
一番最初に配列全ての総和、それぞれの値の出現回数を保存しておいて、引いていく...みたいな方針で解いてるっぽいんだけどあまりコードが自分のものっぽくない...?
解いたのがしばらく前だから忘れてるけど、アイデアだけ思いついてかなり調べながら解いたとか...?

**提出したもの**

```c++:c.cpp
int main() {
    int n;
    cin >> n;
    vector<int> a(n);

    rep(i, 0, n) cin >> a[i];

    // それぞれのAをキー、実際にAが存在するインデックスの集合の配列を値とするmap
    map<int, vector<int>> map;

    for (int i = 0; i < n; i++) {
        map[a[i]].push_back(i);
    }

    // aという配列に含まれる全ての値の合計値がs
    ll s = accumulate(a.begin(), a.end(), 0LL);

    vector<ll> ans(n);

    // mapに対して範囲for文
    for (auto [v, i_list] : map) {
        // Aより大きな要素、つまりAは含まないので、Aの値*個数をsから引く
        s -= (ll)v * i_list.size();
        // Aのインデックスの集合であるi_listに対して範囲for文
        // i番目の入力値は全てAi, よってi番目の出力値は全てs
        for (auto i : i_list) {
            ans[i] = s;
        }
    }
    for(auto x:ans)cout << x << ' ';
    return 0;
}
```

**振り返り**
解答のコードとかとも結構違うし、方針自体は私が思いつきそうなものだし...よくわからない。

## 感想
振り返りは急いでやりましょう(´･ω･`)
SQL関連

https://qiita.com/Qu4rtz_MC5/items/4692955cc0478d69ac58

https://qiita.com/Qu4rtz_MC5/items/8dd630dbb9c2d7d889c2

https://qiita.com/Qu4rtz_MC5/items/5817a8f847abf29a2815

https://qiita.com/Qu4rtz_MC5/items/714c57030add17c7ab8d
OCIまとめ

https://qiita.com/Qu4rtz_MC5/items/7943fb1a48d3f4a4a086

https://qiita.com/Qu4rtz_MC5/items/4a29c6a57607dcf3168d

https://qiita.com/Qu4rtz_MC5/items/d1e5172bccf094c72c3f

https://qiita.com/Qu4rtz_MC5/items/5d3d5a588f2acf25d0dc

https://qiita.com/Qu4rtz_MC5/items/1e1216a68e47010272fe

https://qiita.com/Qu4rtz_MC5/items/e88b53dac3c48f3f5955

https://qiita.com/Qu4rtz_MC5/items/e0a0afc171a413cf95e5

https://qiita.com/Qu4rtz_MC5/items/88b4deff6b5b33549539

https://qiita.com/Qu4rtz_MC5/items/8e9af502826e623e64cb

https://qiita.com/Qu4rtz_MC5/items/f28cfd40aa9f428770dd

https://qiita.com/Qu4rtz_MC5/items/f379469e423e83f2cd59

https://qiita.com/Qu4rtz_MC5/items/fa58fa1222a441af007b

https://qiita.com/Qu4rtz_MC5/items/f2e6d21eb2bf71d842b5

https://qiita.com/Qu4rtz_MC5/items/14f7c52c1efabd57cfed

https://qiita.com/Qu4rtz_MC5/items/892cac236bc1485640e9

https://qiita.com/Qu4rtz_MC5/items/6f23626c212711387f83

https://qiita.com/Qu4rtz_MC5/items/4ff7c0cdddcc878c34b4

OCI技術資料
https://speakerdeck.com/ocise
AWS Lambdaで翻訳APIをつくってみた


# TL,DR
Lambda関数からGoogle Cloud Translation APIをコールして、単語を翻訳するAPIを作りました。
Pythonコードです。
Lambda関数はChaliceを使うことで、簡単にAWSにデプロイすることができます。


# 出来ること

こんな感じで、エンドポイントのクエリパラメータに翻訳対象のテキストと翻訳先言語を指定すると

```
https://xxxxxx.amazonaws.com/api/?word=Hello+World!&target_language=fr
```

翻訳結果が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526943/2defd514-566c-4787-5900-f241101a1cec.png)

# 作り方

## GCPの準備

1. プロジェクトの登録
1. APIの有効化
1. サービスアカウントの作成、キーのダウンロードー＞JSONファイル

## ChaliceでAPI化

### Chalice のインストール
適当に仮想環境を作ってから
```
pip install chalice
```

### Chalice プロジェクトの作成
Chaliceをインストールしたら、Chaliceプロジェクトを作成します。
```
chalice new-project プロジェクト名
```

### app.pyの更新
Chaliceプロジェクトディレクトリ内のapp.pyのコードはこんな感じです。

```python:app.py
from chalice import Chalice
from google.cloud import translate
import os

app = Chalice(app_name='chalice-honyakukun')

@app.route('/')
def index():
    # クエリパラメータから単語とターゲット言語コードを取得
    word = app.current_request.query_params.get('word')
    target_language_code = app.current_request.query_params.get('target_language')

    # 翻訳処理
    translation = translate_text(word, target_language_code)

    # 翻訳結果を返す
    return {'source_language': translation.detected_language_code,
            'translated_text': translation.translated_text}

def translate_text(text: str, target_language_code: str) -> translate.Translation:
    # 環境変数からプロジェクトIDを取得
    project_id = os.environ.get('GOOGLE_CLOUD_PROJECT')
    parent_id = f"projects/{project_id}/locations/global"

    # クライアントオブジェクトを作成
    client = translate.TranslationServiceClient()

    # 翻訳リクエストを送信
    response = client.translate_text(
        parent=parent_id,
        contents=[text],
        target_language_code=target_language_code,
    )

    # 翻訳結果を取得
    return response.translations[0]
```

### ローカルでデプロイ
ローカルでデプロイしてみます。
```
chalice local --stage dev
```

デプロイしたら、ブラウザから以下のURLを叩いてみましょう。
```
http://localhost:8000/?word=Hello+World!&target_language=fr
```

うまくいくとこんな感じで表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526943/0ff13756-c213-cb9d-7043-8531f2126791.png)

## AWSにデプロイ

### requirements.txtに依存パッケージを書き出し
```
pip freeze > requirements.txt
```
### サービスアカウントのJSONファイルを格納
chalicelibディレクトリを作成し、サービスアカウント情報のJSONファイルをchalicelibディレクトリに格納します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526943/23090f6a-f216-5398-d85e-9aad60ed5cfe.png)

### config.jsonの更新
config.jsonにGCPのサービスアカウントファイルパスとプロジェクト名を環境変数として設定します。
```json:config.json
{
  "version": "2.0",
  "app_name": "chalicepj",
  "stages": {
    "dev": {
      "api_gateway_stage": "api",
      "environment_variables": {
        "GOOGLE_APPLICATION_CREDENTIALS": "サービスアカウントJSONファイルへのパス",
        "GOOGLE_CLOUD_PROJECT": "GCPプロジェクト名"
      }
    }
  }
}
```

### AWSにデプロイ
AWSにデプロイして、APIゲートウェイとLambda関数を作成します。
```
chalice deploy --stage dev
```

デプロイ成功後に表示されるAPIゲートウェイのURLにクエリパラメータを追加して、ブラウザからアクセスします。
```
https://APIゲートウェイのURL/api/?word=Hello+World!&target_language=fr
```

うまくいけば翻訳結果がリターンされます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526943/1eeee9b2-0d4d-62a9-3e9c-73c033c8546f.png)
『PHPカンファレンス 関西』に参加してみた！


## はじめに
2022年7月〜SES企業でプログラマーをしている、みつです。
使用言語は主にC#やJavaで、普段は業務システムの開発に携わっています。
2024年2月11日にグランフロント大阪で開催されたPHPカンファレンスに参加してみたので、感想をまとめてみました！

https://2024.kphpug.jp/



## 参加理由
・しばらくはPHPを業務でしようすることはなさそうですが、この先PHPで開発する可能性があるため、勉強しておいて損はないと思った。
・PHPは業務で2週間程しか触ったことがないですが、『これからPHPを勉強したい人にも参加資格があります』とのことだったので、自分でも参加できるかなと感じた。
・コロナなどもあり、関西で開催されるのは6年ぶりということを聞き、参加してみたいと思った。
（・シールが欲しかった:relaxed:）

## 参加したセッションと感想
・[Laravelでミニマム開発からスタートして個人サービスを利益化するまでの経験談！ ](https://fortee.jp/phpcon-kansai2024/proposal/8c1e1f21-2b1d-4c66-ad4b-f90577a424e5)
PHPを使うことによって安い費用で利益を得ることができるということが分かりました。自分も個人開発するなら、同じ開発環境でしてみたいと思いました。
電車の広告は、沢山の人に見られると思いますが、ターゲット層を絞り込んでいないので、どれだけの効果があったのか統計できないことがよく分かりました。やはりこの時代ターゲット層に合わせてSNS運用などしていく必要があるんだなと思いました。
<br>
・[「"品質"が高いコード」って何？](https://fortee.jp/phpcon-kansai2024/proposal/a60c9e18-bc61-4f60-80d0-0a0ea7a205c4)
『"品質"が高いコード』と聞くと、私はなんとなくテストで不具合がないコードのことかなと思っていましたが、セッションでは「要求を満たしていること」とお話しされていました。
また、私は「お客様の要望以上の機能をつけたい」と思ってしまいがちですが、求められた要求を超過してもよくないという言葉が刺さりました。
『品質はプロセスに宿る』ため、私のようなプログラマーでは、業務プロセス自体を変えることは難しいと思いますが、この先指示する側になるとしたら、絶対忘れてはいけない内容のセッションだと思いました。
<br>
・[テストコードが書けるようになって「変更したけど壊してないかな」という不安を解消しませんか？〜テスト駆動開発の世界のクイックツアーも添えて〜](https://fortee.jp/phpcon-kansai2024/proposal/a07d306b-f997-409f-8478-08fdb1c26b6f)
私は業務ではテストコードは記述しないので、テストコードとは？の状態でしたが、関数の数は増えますが、書くことによって効率化されることがよく理解出来ました。セッション途中に実際にデバッグで見せてくださったので、テストコードのイメージが掴みやすく、大変勉強になりました。
<br>
・[その条件分岐って本当に必要？](https://fortee.jp/phpcon-kansai2024/proposal/d2406310-e9dc-4866-851c-20662ae04fa8)
普段あまり気にせず条件分岐を記述することが多いので、気づいたらネストが深くなっていることがよくあります。本当に必要か？考えて記述することが大切だと思いました。
セッションを聞いて、早期リターンは確かに今のプロジェクトのコードでも多く使われているので、ネストが深くなるのを避けるためだったんだなと分かりました。
あまり使われないであろう処理をそのまま関数にせず記述してしまうことも多いですが、呼び出される回数を考えるより、見やすさを優先して複雑な処理は小さな関数に分けることが大切だと感じました。
また、ECサイトを例にしてくださっていたのが頭に入ってきやすくて良かったです。
PHP以外の言語を使っている人や初学者にとっても分かりやすく、為になるセッションだったと思います。
<br>
・[PHPコミュニティ、その魅力と熱狂をあなたにも！！！ ](https://fortee.jp/phpcon-kansai2024/proposal/c903c4be-77bb-47b9-85a1-5bfdfd61c1aa)
コロナでオフラインのイベントなどがなくなったときは
『カンファレンスに参加するだけでももう既にコミュニティに貢献できている』と話されていたので嬉しかったです。この記事も自分用の備忘録として書いているだけですが、少しでも貢献できていたら良いなと思います。
スライドも見やすく、登壇者の方がもとても元気で明るく、楽しいセッションでした。
<br>
・[レガシーコードに潜む奇妙なコメント　～信じるか信じないかはあなた次第～](https://fortee.jp/phpcon-kansai2024/proposal/11de8269-dc0b-4882-acf1-6b8614d216dc)
他のプロジェクトのコメントを知る機会が今までなかったので、知れてとても面白かったです。
私が携わっている開発でも、ときどき理解不能なコメントが残されていますが、発表者さんのプロジェクトのソースコードもなかなかだと思いました。笑
発表者さんのツッコミがとても上手で面白いセッションでした。
<br>
・[ここが変だよPHP（褒め言葉）　入門編](https://fortee.jp/phpcon-kansai2024/proposal/5a7050df-3943-45b0-8944-b363205c01f7)
Java出身の方がPHPに変更したときに感じた違和感、私もJavaを使用しているので大共感でした。
特に末尾カンマというものがあるだけで、修正が楽なので少しストレスが減りそう！笑
普段小数点を扱う際、何も考えずに比較していたのですが、PHPではそれができないので、今後PHPを使用する際には気をつけたいと思いました。

## 感想
・一人で初めてのカンファレンス参加でしたが、平気でした！:relaxed:笑
・ガッツリPHPを触ったことがない人でも、「初心者向け」と記されているセッションがあり、どこに行こうか迷ったときにとても助かりました。また、初登壇の方や関西在住の方のタグもあったりして、初登壇の方を応援したり、地域が同じ人で交流ができるようになっていた点もとても良かったと思います。
・普段違う言語を使用している自分でも色々な収穫があり、参加費が2000円は安すぎると感じました。また、シールが貰えるとのことで楽しみにしていましたが、すごくしっかりしているトートバッグもいただけてびっくりしました。
・シールはコミュ障には配り切れないです:joy:家に帰って数えたら26枚も残っていて悲しかったです。笑
・一日中セッションを聞かせていただき、中には難しい内容のセッションもあったので参加するだけでもとても疲労感がありましたが、同時にとても充実した1日となり、参加してみて本当に良かったです。

## 最後に
ここまで読んでいただき、ありがとうございました。
カンファレンス初心者の方やPHPカンファレンスに興味がある方の役に立てれば幸いです。
テストでモックを使用したら"ReferenceError: Cannot access 'mockGetAllRecords' before initialization"のエラーが出た。

# はじめに
現在学習記録アプリのテストを書いているのですが、モックを使用した際に出たエラーの解決方法をまとめます。
# 問題
getAllRecordsとdeleteRecordsの２つの関数をモック化したのですが、 "ReferenceError: Cannot access 'mockGetAllRecords' before initialization" のエラーが出ました。
**モック関数が初期化される前にアクセスしようとしてしまっている**ようです。

```tsx:tsx
//モック化
const mockGetAllRecords = jest
.fn()
.mockResolvedValue([ new Record("1", "テスト", 3, "2024-03-16 09:30:48.200885")]  )

const mockDeleteRecords = jest
.fn()
.mockResolvedValue([]);

jest.mock("../utils/supabaseFunctions", () => {
    return{
        getAllRecords:mockGetAllRecords,
        deleteRecords:mockDeleteRecords,
    }});
```
# 解決方法
**`getAllRecords:mockGetAllRecords`を`getAllRecords:()=>mockGetAllRecords()`と修正**したらエラーが消えました。
```tsx:tsx
//モック化
const mockGetAllRecords = jest
.fn()
.mockResolvedValue([ new Record("1", "テスト", 3, "2024-03-16 09:30:48.200885")]  )

const mockDeleteRecords = jest
.fn()
.mockResolvedValue([]);

//修正
jest.mock("../utils/supabaseFunctions", () => {
    return{
        getAllRecords:()=>mockGetAllRecords(),
        deleteRecords: () => mockDeleteRecords(),
    }});
```

# おわりに
なぜエラーが消えたのか、具体的な理由は謎です。。
TripoSR で１枚のカラー画像から3Dメッシュモデルを作成して表示するところまで

# TripoSRとは
- https://github.com/VAST-AI-Research/TripoSR
- 1枚のカラー画像を入力すると３次元メッシュモデルを作成してくれる生成AIのオープンソースなモデルの一つ

![TripoSR](https://github.com/VAST-AI-Research/TripoSR/raw/main/figures/teaser800.gif)

## この記事は
- github の readme に記載されている通りに実行すればうまくいくと思っていたが、自分の環境ではいろいろとエラーが出てしまったのでdocker を使うなどの脇道に入ったので、それを記録します

## 実行環境
- docker + nvidia container
- GPU RTX 3060 / 6GB

## 環境準備
- docker build 時にモデルをダウンロードして保存して置きたいと思い、build時にも nvidia のコンテナが動作するように設定を変更する。以下の記事を参考にして　/etc/docker/daemon.json　を修正する
    - https://qiita.com/yuyakato/items/640ba7a6264f1c21aea7

### docker fileを作成する

- pytorch の環境と cuda と python が動作するdocker image をベースとする
- 以下の内容を Dockerfileで保存する
     
```dockerfile
FROM nvcr.io/nvidia/pytorch:24.02-py3

RUN apt-get update && apt-get install -y \
    git \
    build-essential

RUN python -m pip install pip setuptools --upgrade
WORKDIR /workspace

RUN git clone https://github.com/VAST-AI-Research/TripoSR
RUN pip install -r TripoSR/requirements.txt
RUN pip install opencv-fixer==0.2.5
RUN python -c "from opencv_fixer import AutoFix; AutoFix()"

WORKDIR /workspace/TripoSR
RUN mkdir output
RUN python run.py examples/chair.png --output-dir output/
```

### docker のイメージを作成する

```
docker build -t triposr:latest .
```

### 動作確認

- docker を起動して中身を確認

```
docker run -it --rm --gpus=all triposr:latest /bin/bash
```

bash が起動する。/workspace/TripoSR のフォルダにある output/0/mesh.obj があるかどうかを確認する。

### スクリプトで作成できるようにする

GPUメモリが８GB以上搭載されている場合には、readme.mdに記載されているように以下の gradio というWebUIをdockerを起動しているスクリプトから立ち上げれば良い
```
python gradio_app.py
```

しかし、GPUが６GBの場合にはメモリが足りなくてエラーがでることがわかった。CLIのモードでは動作していたので、WebUIをあきらめてCLIで動作するようにする。

以下のコマンドは、PNGファイル形式の画像を入力として、３次元メッシュフォーマットのgltf のバイナリ形式である glb 形式で出力するようにしたもの。出力先は、output/X/mesh.glb （Xは番号）になる。

```bash
#! /bin/bash

if [ $# != 1 ]; then
    echo "input <png file>"
    exit 1
fi

if [ ! -e data ]; then mkdir data ; fi
if [ ! -e data/input ]; then mkdir data/input ; fi
if [ ! -e data/output ]; then mkdir data/output ; fi

cp $1 data/input/input.png

docker run -it --rm --gpus=all --net=host -v `pwd`/data:/workspace/data triposr:latest python run.py /workspace/data/input/input.png --output-dir /workspace/data/output --model-save-format glb
```

## 3Dメッシュの確認

glb 形式にしたのは、googleが開発したgltf,glbをWebで見ることができるページがあるため。
以下のページを開く

- https://modelviewer.dev/editor/

このページに、先程作成した mesh.glb をドラッグ＆ドロップする。

さらに、[Mobile View]のところで、[Default AR Mode to Scene Viewer]のチェックボックスをONにして、[Deploy Mobile]のボタンを押すと、QRコードが表示される。

このQRコードは、今表示しているモデルをスマホで見るためのURLが記載されている。
googleが開発しているARCore というカメラ画像をトラッキングして、そこに３DモデルをMixedReaity（MR）表示するオプションがあるので、それで今作成したモデルを表示することができる。

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77426/8481d436-c264-d1b1-e9aa-dc6967208d39.png)
AtCoder Beginner Contest 343 振り返り

# ABC343
## 概要
https://atcoder.jp/contests/abc343

## A - Wrong Answer
__考えてたこと__
簡単でどうやって実装するか逆に悩んだ問題。
確実に存在しているからとりあえず0から9全部回す方針で。

__提出したもの__
```c++:a.cpp
int main() {
    int a, b;
    cin >> a >> b;
    for (int i = 0; i < 10; i++) {
        if (a + b != i) {
            cout << i << endl;
            break;
        }
    }
    return 0;
}
```

__振り返り__
特になし。

## B - Adjacency Matrix
__考えてたこと__
グラフの情報を全部二次元配列に保存して、for文で中身全部確認すれば良いかなぁと思ったらそれでAC。

__提出したもの__
```c++:b.cpp
int main() {
    int n;
    cin >> n;

    int graph[n][n];
    rep(i, 0, n) {
        rep(j, 0, n) {
            cin >> graph[i][j];
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (graph[i][j] == 1) {
                cout << j + 1 << " ";
            }
        }
        cout << endl;
    }
    return 0;
}
```
__振り返り__
特になし。

## C - 343
__考えてたこと__
Nの三乗根?を全部探索すれば解は求められてNが10^18上限だから計算量足りそうと思ってシンプルに実装、AC。

__提出したもの__
```c++:c.cpp
int main() {
    ll n;
    cin >> n;
    ll ans;
    for (ll i = 0; i * i * i <= n; i++) {
        ll now = i * i * i;
        string now_string = to_string(now);
        string copy = now_string;
        reverse(now_string.begin(), now_string.end());
        if (copy == now_string) {
            ans = now;
        }
    }
    cout << ans << endl;
    return 0;
}

```

__振り返り__
特になし、って言えるぐらいC問題の中では簡単に解けた。

## D - Diversity of Scores
__考えてたこと__
データをどのように保持するか悩んだ問題。現在のそれぞれの選手の得点、選手の得点の種類を常に保持し続けたくてmapを二つ作成すれば良いかなという方針で実装。無事AC。

__提出したもの__
```c++:d.cpp
int main() {
    int n, t;
    cin >> n >> t;

    map<int, ll> people;
    map<ll, int> count;

    // 全員の点数を初期化
    for (int i = 0; i < n; i++) {
        people[i] = 0;
    }

    count[0] = n;

    for (int i = 0; i < t; i++) {
        int a, b;
        cin >> a >> b;
        a--;

        count[people[a]]--;
        if (count[people[a]] <= 0) {
            count.erase(people[a]);
        }
        people[a] += b;
        if (count.count(people[a])) {
            count[people[a]]++;
        } else {
            count[people[a]] = 1;
        }

        cout << count.size() << endl;
    }
    return 0;
}
```
__振り返り__
解説を見てみたら現在の選手の得点に関してはmapを使わなくてvectorで良かった。確かに1からNで全部揃ってるからこういう時はvectorで十分そう。keyの値がランダム、というか綺麗に並んでいない時だけmapを使うように心がけたい。

## 感想
ここまでスムーズにD問題まで解けたのは初めてかも。
問題が簡単だったのはあるけど、とはいえ嬉しい。
【JavaScript】問題文の指示をちゃんと読む

## はじめに
LeetCodeをやり始めて、いきなり一問目で間違えたので備忘録としてメモしておきます。

問題文の指示をしっかり読むことが大切です。

## 問題
* createHelloWorld関数を書きなさい
* これは常に「Hello World」を返す新たな関数を返す

## 間違い
```javascript: 
/**
 * @return {Function}
 */
var createHelloWorld = function() {  
    return function(...args) {
        return console.log("Hello World");
    }
};

/**
 * const f = createHelloWorld();
 * f(); // "undefined"
 */
```

Hello World出すんやろ、簡単やん！と思って実行してみると「undefined」に。

## 解決法
* 単にreturn "Hello World"とする
```javascript
/**
 * @return {Function}
 */
var createHelloWorld = function() {
    return function(...args) {
        return "Hello World";
    }
};

/**
 * const f = createHelloWorld();
 * f(); // "Hello World"
 */
```

undefinedの原因は、return console.log("Hello World")としていたことでした。

console.log()には戻り値がないので、returnしてもundefinedになっていたわけです。

そもそもコンソールにHello Worldを出力するという問題ではないので、指示を読めていなかったということになります。

## 参考
https://qiita.com/baby-0105/items/7ff84da5f02335d1fec5
VScodeで入れた拡張機能（備忘録）

# はじめに
初めまして！
エンジニアになって数年、今まで本を読むだけでしたが、もっとプライベートで楽しみながら成長したい！自分が学んだ足跡を残していきたい！と思い記事をかきました！
最終的には自在に開発できるようになりたいと思っています。:triumph:
いろいろな記事を参考にさせてもらっています。:bow_tone2:
その中でもこれってどういう意味？とかつまづいたところを念入りに書いていこうかと思います。:fist:

# 今回の目的
VSCODEの本を読んだので拡張機能でいいなというもので入れたものを備忘録で書いていきます！

# 使用したものや事前準備
・Macbook Pro
・Visual Studio Code

# 参考にさせていただいた書籍
設定方法など詳細はこちらをご覧ください。

https://book.impress.co.jp/books/1121101051

# 導入した拡張機能や設定一覧

## 設定


#### setting Sync
　他のPCと設定を共有できるようになります！パソコンの入れ替えで度々同じ設定にするのは面倒だと思うのでこれがあると便利。Githubで登録しました。

 
## 拡張機能

#### GitHub Copilot
自然言語でHTMLの雛形作ってとか言うと作ってくれるし、言う前からコードを提案してくれるため有料だが設定
![スクリーンショット 2024-03-17 15.42.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/5fe27ca2-1a9d-b99c-53ce-ec74bb48f3f9.png)

#### Prettier
ソースコードの自動整形。インデントとか綺麗にしてくれる。

![スクリーンショット 2024-03-17 15.42.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/8bae610b-6164-45e4-2875-d9fef0d4c2e0.png)

#### Live Server
HTMLの修正結果がリアルタイムで反映される。ホットリロードみたいなもの。
![スクリーンショット 2024-03-17 15.43.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/c52bfde2-6ff4-6c03-18b8-7790491e6840.png)

#### Image preview
イメージ画像をコード上でプレビュー表示できる。
![スクリーンショット 2024-03-17 15.47.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/b343a2d2-72ec-7ed2-5b84-27a5fb6c2362.png)

#### HTML CSS Support
CSSファイルに定義しているid,classを入力候補として表示してくれる。
![スクリーンショット 2024-03-17 15.52.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/5e899994-3a31-11f9-f7a8-e6f82c1aa392.png)

#### Color Highlight
16進数で定義した色を強調表示する。
![スクリーンショット 2024-03-17 15.56.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/6a7c6345-8c54-cc39-d3f2-7d64710c7f8f.png)

#### Highlight Matching Tag
開始タグと閉じタグを強調表示する。
![スクリーンショット 2024-03-17 15.57.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/1d2832c6-abc7-e8d2-3515-fd4f6fb27c2c.png)

#### Intellisense
プログラミング言語ごとにあり、コード補完でメソッドを探したりできる。
PHPは、Intelephenseを入れた。
![スクリーンショット 2024-03-17 16.00.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/37a134a2-4a8c-7e8f-3542-c3bf6416db21.png)

#### snippets
プログラミング言語ごとの書き方を補完できる。
「@category:snippets」で検索

![スクリーンショット 2024-03-17 16.07.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/01b96a81-200e-d4cc-0ed4-a1b73d54bbaa.png)

#### debuggers
JavaScriptに変換される言語は標準で対応されているがそれ以外は、「@category:"debuggers"」で検索して取得
PHPも入れてみたかったがXDEBUGの設定が必要だったため保留中

![スクリーンショット 2024-03-17 16.43.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/0ed15eb9-b577-3886-00f0-442fade74f1b.png)

# 最後に
もっと開発していって便利に使いこなす方法を見つけていきたいと思います！
未経験からインフラエンジニア...?(SES)

# はじめに

Qiitaでの投稿は初めてです。

「キータ」という名称は、なんだか可愛いです。由来はQ＆Aから派生してるそうです。
「けいおん」というアニメで、ギターに「ギータ」という、愛称をつけていることをふと思い出しました。世代を超えて思い出せるなんて、素晴らしいアニメですね､､､!

## 自己紹介

花が枯れ始めそうな20代、インフラエンジニアとして、1年間の間、運用、監視、保守、構築に従事しています。

新卒採用時は、ベンチャー企業の営業職で、毎月60時間ものみなし残業を経験しました。しかし、当時は全く苦ではなく営業成績上位を目指し、休みを返上する勢いで業務をしていました。
1年半ほど経過し、売り上げ目標も達成し、残った感情が「営業は得意かもしれないけど、本当に良い商品と認めていないものを売って、騙しているような気がする」という感覚に陥り退社。

自分のやっている業務に誇りを持てるようになりたいと思い、IT業界へ未経験で入社。

客先常駐にて、インフラエンジニアとして勤務しています。

運用監視オペレーターをイメージしていたら、運よくサーバー構築に携わることができ、Linuxのコマンドライン操作を覚えることができました。しかし、未経験者からすると覚えるまで苦労しました。

## 取得資格
AWS-SAA(2023/12/22)
CCNA(2024/01/11)

## やんわりとした展望
業務を重ねていくうちに、最新の技術に関わってこそエンジニアだという概念が頭から離れず、クラウドエンジニアとして活躍できるよう資格取得やハンズオンを実施しています。近々AWS-SAPを取得する予定です。

## お知らせ
取得した資格については、後日取得方法を投稿します。大切なのは、参考書をブレずに信じ切る心です。ネットの情報もたくさんあり、不安になりすぎないよう注意してください。

長々と書きましたが、これから体験談や学んだことのアウトプットを行います。
楽しく学べたら嬉しいので、一緒に歩んでいきましょう。
よろしくお願いいたします。
[flutter] 一貫性のある色使いの実現


### 1. ColorSchemeの作成
- **ColorSchemeの作成**：`ColorScheme`クラスを利用し、アプリ全体で使う色の基盤を作成する。
- **fromSeedでの自動生成**：シードカラーを基に、一貫したカラースキームを自動で生成する。

  ```dart
  ColorScheme colorScheme = ColorScheme.fromSeed(
    seedColor: Colors.blue,
  );
  ```

### 2. テーマデータのカスタマイズ
- **ThemeDataでのテーマ作成**：作成したカラースキームを`ThemeData`に組み込み、アプリのテーマとしてカスタマイズする。

  ```dart
  ThemeData themeData = ThemeData(
    colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
  );
  ```

### 3. MaterialAppへのテーマ適用
- **テーマの統合**：`MaterialApp`の`theme`プロパティを使用して、カスタマイズしたテーマデータをアプリ全体に適用する。

  ```dart
  MaterialApp(
    theme: themeData,
    home: MyHomePage(),
  );
  ```

### 4. コンポーネントへの実装
- **テーマから色の取り出し**：`Theme.of(context)`を通じて、テーマデータから色を取り出し、UIコンポーネントに適用する。

  ```dart
  Container(
    color: Theme.of(context).colorScheme.primary,
    child: Text(
      'Hello, World!',
      style: TextStyle(color: Theme.of(context).colorScheme.onPrimary),
    ),
  );
  ```

 ### `ColorScheme`のプロパティ

| プロパティ            | 説明                                              |
|---------------------|---------------------------------------------------|
| `primary`           | アプリケーションの主色。重要な要素に使用。                 |
| `onPrimary`         | `primary`色の上のテキストやアイコンの色。              |
| `primaryContainer`  | `primary`のコンテナバリエーション。                     |
| `onPrimaryContainer`| `primaryContainer`上のテキストやアイコンの色。          |
| `secondary`         | アプリケーションの補助色。アクセントや強調に用いられる。     |
| `onSecondary`       | `secondary`色の上のテキストやアイコンの色。             |
| `secondaryContainer`| `secondary`のコンテナバリエーション。                   |
| `onSecondaryContainer`| `secondaryContainer`上のテキストやアイコンの色。     |
| `background`        | アプリケーションの背景色。                               |
| `onBackground`      | `background`色の上のテキストやアイコンの色。            |
| `surface`           | UI要素の背景色、例えばカードやメニュー。                 |
| `onSurface`         | `surface`色の上のテキストやアイコンの色。               |
| `error`             | エラーを示す要素に使用される色。                         |
| `onError`           | `error`色の上のテキストやアイコンの色。                  |
| `brightness`        | 全体の明るさ。`Brightness.light`または`Brightness.dark`。 |
[過去記事]Vue.jsの始め方

## 概要

一応本職はサーバーサイドエンジニアですが、最近フロントエンドのVue.jsを習得したいと思い勉強中です！
最近習得したことをまとめていきたいと思います！

## 筆者の環境

- OS: Mac OS 11.6
- エディタ: Visual Studio Code

## 方法

### 1. htmlファイルの用意

Macのローカルの任意のディレクトリにindex.htmlファイルを作成します。 
index.htmlに下記の内容を記載します。

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <header></header>
    <main></main>
    <footer></footer>
</body>
</html>
```

下記サイトにアクセスします。

https://jp.vuejs.org/v2/guide/

下記の「開発バージョン、便利なコンソールの警告が含まれています」と記載されているscript要素の内容をコピーします。

![はじめに_—_Vue_js-1024x650.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/f9fbb17e-9ce0-5b24-571b-b916f2ea6cdf.png)

先程作成したindex.htmlのtitle要素の前くらいにVueの公式ドキュメントページでコピーしたscript要素を入力します。

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <title>Document</title>
</head>
<body>
    <header></header>
    <main></main>
    <footer></footer>
</body>
</html>
```

準備はこれで完了です！次に今までの作業が問題無く完了できているかを確認します。

## 確認

下記の内容をbody要素の最後の直前に下記の内容を記載します。

```html
<script>
    let app = new Vue({
        el: '#app',
        data(){
            return {
                message: 'Hello Japan'
            }
        },
    })
</script>
```

main要素の中を下記の様に記載します。

```html
<main>
    <div id="app">
       {{ message }}
    </div>
</main>
```

修正後のindex.htmlファイルの全内容を下記に記載します。

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <title>Document</title>
</head>
<body>
    <header></header>
    <main>
        <div id="app">
            {{ message }}
        </div>
    </main>
    <footer></footer>
    <script>
        let app = new Vue({
            el: '#app',
            data(){
                return {
                    message: 'Hello Japan'
                }
            },
        })
    </script>
</body>
</html>
```

先程から記載しているローカルのindex.htmlをブラウザで開きます。

下記のように表示されればVue.jsを記載する準備が整いました！

![Document-1024x232.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9c102647-53c2-f54e-0da5-23a40c7e422e.png)

## 最後に

以上でVue.jsを記載する準備は完了です！次回は今回表示テストのために記載したVue.jsのソースの説明と実際のソースの記載を記事にする予定です！
勉強は苦手だけど、コーダーからWebエンジニアを目指す(Reactをこれから本気で勉強します！)

# 現在の自分
### 今やっている仕事や現状など

コーダー3年しています。少しWebデザインのお仕事もしています。
勉強苦手です。(学生時代はスポーツばかりやっていて、普通の勉強受験の経験がない)

フロントエンド楽しそうなので、勉強したい！
元々の学習速度はおそいですが、努力します！！

# どうしても成功しないといけない理由

自分自身が不器用な人間なので、容量が悪くて過去にけっこう苦労してきました。（たぶん..）

無駄な時間をたくさん過ごしてきました。

IT技術のおかげで自分時間が増えたり、容量が良くなったり、人を助けられる時代だからこそ、IT業界を盛り上げる一人になりたい。

# 将来について(目標)

### 短期(3ヶ月)
ReactのToDoアプリ完成

### 中期(半年)
TypeScriptの使い方が分かったら嬉しい(種類多すぎ)

### 長期(1年)
Twitter機能のアプリがデプロイできるようになりたい

# なぜ本気で学ぶことに決めたのかの決意

困っている人や苦労している人が減ったらいいから(自分含め)

# 最後に

半年後の自分、挫折していませんように...🙇🙏
がんばります！！！
[過去記事] MacのVisualStudioCodeがアップデートされて付属ターミナルのデフォルトshell設定が変更になった模様

## 概要

自分のお気に入りshellはbashです。ただし、愛用しているVisualStudioCode（以降VScode）の付属ターミナルのデフォルトshellはzshです。デフォルトshellをbashに変更して使用していますが、この度アップデートでデフォルトshellの設定方法が変更になったらしいです。

新しい設定方法を発見した経緯や新しい設定方法そのものも記載したいと思います！

## 今までのデフォルトshellの設定方法

下記の記事でも記載している通り、もともとはsettings.jsonに記載することでデフォルトshellをzshからbashに設定しておりました。

https://qiita.com/miriwo/items/974a92205998cbbe2913

しかし、2021年9月に入ってVScodeのアップデートがあり、既存の方法ではデフォルトshellを指定することができなくなりました。

## 新しい設定方法を見つけ出して修正

デフォルトshellがzshに設定されていても、$bashコマンドを実行すればいい話です。しかしひと手間がめんどくさい、、、。デフォルトshell設定方法を探すことにしました！

VScodeのsettings.jsonを開き確認したところデフォルトshell設定部分にエラーが出ていました。![スクリーンショット-2021-09-09-0.03.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/7b84fed5-381e-097b-f9eb-fb76ce108cf8.png)

デフォルトのshellの設定方法が変わった旨の記載がありました。ひとまずエラーがでている　状態が気持ち悪かったのでsettings.jsonのshell設定をコメントアウトしました。!

[settings_json.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a9a1e9f8-6c3a-ab53-9bbb-4e8c4b2ffadf.png)

設定を開きターミナル系の設定項目を見ていくとTerminal › Integrated › Default Profile: Osxという設定項目を発見しました。

当該の設定項目でデフォルトshellの設定ができるらしいです。bashに設定してから付属ターミナルを起動したところbashで起動し、問題は解決しました！![settings_json-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/0fefcccf-1c35-9bb7-76bc-adfbf7ffaabf.png)

## まとめ

ぶっちゃけだからどうしたって感じのトラブルシューティング？でしたが、ターミナル起動時のストレスがなくなったことは大きかったです！自分で解決できたので良かった〜！
[過去記事]アンテクで働かせてもらって1年が経ちました

## 概要

2021/03/09でアンテクで働かせてもらい1年とちょっとが経ちました。一年前の自分ができたこと、今の自分ができること、今の課題感と改善点、継続すること、改善すること、変わったこと、変わらないことなどなどを記載して行きたいと思います！各項目ごとに箇条書きにしてどんどん書いていこうと思います。

## 一年前の自分ができたこと・知ってたこと

- Ruby on Railsで簡単なCRUD処理を実装できる。
- アプリケーションとフレームワークの違いが分かっている。
- WebサーバーとDBの関係が何となく分かっている。
- Laravelの存在を知っている。
- ターミナルでコマンドを実行する事ができる。
- UbuntuのPCを構築する事ができる。
- Gitでコミットすることはできる。
- Webサーバーとクライアントの関係を簡単に図にできる。

### まとめ

できること少なっ！！当時SQLすらまともに実行できなかったことを覚えています。ただ前職の経験や趣味の自作PCも相まってオンプレ向きではありますがLinuxの知識は多少ありました。Gitもsource treeとか使うよりターミナルのほうがなれていたことは覚えています。

## 今の自分ができること・知ってること

- 簡単なSQLならすんなり実行できる。
- 言葉で説明できないけどオブジェクト指向の概要は理解している。（感覚的に概要が理解している。）
- Laravelを用いた簡単なCRUD処理なら数時間で実装できる。
- LaravelのDBアクセス処理をリポジトリ層に分割できる。
- Laravelで使用頻度の高いビジネスロジックをサービス層に分割できる。
- jsがほんのちょっと分かっている。
- AWSでサーバーを構築できる。（プライベートアカウントで失敗して3万円位請求されたけど。）
- 担当プロジェクトの全体の流れが把握できつつある。
- お客さんの考えがちょっとだけわかるようになっている。
- ちょっとだけマネジメント系の作業ができる。
- ちょっとだけGitを活用できるようになってきた。
- 身内だけなら緊張しないでコミュニケーションを取れるようになった。

### まとめ

全体的に記載している内容のレベルが上っている気がします。というより一年経ってレベルアップしていなかったら困りますよね。Laravelがほぼ未経験だったのに最低限の内容が調べなくても実装できるようになったのは大きいかもですね。ホントのこと言うとjsもうちょっと頑張って理解深めたかった部分はあります。Gitはstashとかrebaseとか実用性の高いものをより活用できるようになっている気がします。コミュニケーションは課題を抱えているところもありますが、社内の皆さんや社外でも普段から話す方相手だと緊張しないで話せるようになってきました。

## 今の課題感

- 技術力が足らん、Laravelではものを作れるのにPHPの基礎が欠けている。
- PHPも完璧ではないが他の言語を習得していない。
- 緊張すればするほどコミュニケーションが下手になる。内弁慶的なところがある。
- 一歩踏み込んだ〇〇ができない。「一歩踏み込んだ確認」とか「一歩踏み込んだ調査」とかがあまり得意ではない。詰めが甘い。
- エンドの時間が迫っていると信じられないくらい焦る。

### まとめ

実際にPHPを触り初めて1年位が経過したけどイマイチできることが増えている気がしない。完璧に習得するまでは誰だって時間がかかると思うが自分は皆さんより特に時間がかかる気がします。入社当時の一年後の予想ではjsも人並みに習得しているつもりだったので結構誤算でした。転職活動時からずっと課題に感じていましたがコミュニケーションが相変わらず苦手です。「相手に理解してもらいたい」→「一回の会話でめっちゃ情報量が多くなってしまう。」ってことがあるあるです。初対面とか、あまり話したこと無い方と話すときになりがちで最近立場上お客さんとのコミュニケーションを取ることが増えてきてなかなか課題に感じています。

## 継続すること

- 「伝える熱意」を持って話す。
- 小さいことでも第三者が見れる場所にテキストで残す。プロジェクト内のことならWikiに、技術のことなら自分のQiitaやはてなブログに。
- 仕事を楽しむ。最近は内部の体制が変わり忙しい毎日だけど実は結構楽しめて仕事ができている。
- お客さんやチームメンバーと自分発信でこまめにコミュニケーションを取る。

### まとめ

日頃から記事を書いている事により「あ、この内容はテキストとしてどこかに残したほうが良い」という内容がわかるようになってきました。書く内容やボリュームにもよりますがテキスト化はちょっと優先度高めでやっていきたいです。Slackという便利なものがあるので最近は簡単な内容でも認識合わせ的な感じでメンションをつけてメッセージを送る事が多くなりました。「自分はこう思っているよ」や「こんな確認をいまお客さんに投げて返答待ちだよ」とか細かいことでも言わないより言ったほうがいい気がします。仕事で大体うまく行かないときは「〇〇さんは多分あの作業をしてくれているだろう」っていう憶測で動いちゃうときだと思います。

## 改善すること

- 緊張しないでコミュニケーションを取る。
- 結論ファーストの話方を意識する。
- 「作業計画を建てる→作業する」の順序を守る。
- 作業前に最終確認項目を考える癖を付ける。

### まとめ

今の課題感をどう解決してゆくかを書いてみました。コミュニケーションに関しては意識だけで一瞬で解決するものでも無いと思いますが、作業に関しては自分ルールをしっかり決めることでどうとでもなる気がするので「必ず決めた方法を守る」を意識しながら作業に向き合っていきたいと思います。

## 一年間働いてみてどうだったのか

自分の中では若干不完全感はあったもの新卒で社会に出たときと同じくらいの濃い一年になりました。一年経ってやっと会社の皆さんと緊張しないで話せるくらいになってきたので自分が抱えているコミュニケーションの課題の解決にはもうちょっと時間が掛かりそうですね。ただ言えることは明らかにアンテクの皆さんの空気感が自分に合っていることを感じます。今は皆さんから助けられっぱなしですがしっかり恩返しができるようにどんどん技術を磨いていきたいと考えています！これからもよろしくお願いいたします。。。！
VRとは...?

# VRとは
日本語wikiによると、VR(Virtual Reality)はコンピュータによって作られた仮想的な空間を現実のように体験できる仕組みであるとされています。
その為、日本語ではVRを仮想現実と訳されています。

英語版wikiによるとVRは拡張現実(AR),拡張仮想(AV)などのデジタル空間を視覚化する他の手法と異なるとされています。
現実世界に仮想世界の何かしらが働きかけるなどではなく、3Dディスプレイ等でコンピュータのシミュレーションによって作られた世界へ没入させる(仮想世界と現実世界を融合ではなく仮想世界で現実世界を置換する)為でしょうか。

※編集時点（2024年3/17）では拡張仮想のリンクページが複合現実(MR)のページに飛びます。

# 参考記事

https://www.ntt.com/bizon/glossary/e-v/vr.html

https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%BB%E3%83%AA%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3

https://en.wikipedia.org/wiki/Reality%E2%80%93virtuality_continuum

https://en.wikipedia.org/wiki/Virtual_reality
余っているタブレッドをサブディスプレイとして使う

## 概要

今回は最近自分がお仕事のときに使用している便利なアプリを紹介したいと思います！

## MacBook 外部ディスプレイの枚数制限

自分が使用しているMacBook Pro 2020 13inchは外部ディスプレイに映像出力するときに2台までしか外部ディスプレイに接続する事ができません。自宅て使っている外部ディスプレイが特別大きいわけでも無いので外部ディスプレイ2枚とMacBook Proのディスプレイで合計3枚でもちょっと足りません。Thunderbolt3のポートを使ったeGPUの検討しましたが中古でもなかなかお値段がします。（合計で4万円くらい）

## タブレットをPCサブディスプレイとして使うアプリを発見

どうにかしてMacBookの映像出力ディスプレイを増やしたくてネットの海をさまよっていると良さそうなサービスを発見しました。

https://ja.duetdisplay.com/

その名も「Duet Display」このアプリはAndroidタブレットやiPadをアプリを通してPCのサブディスプレイとして映像を出力する事ができます。このサービスはPCとタブレットにそれぞれ専用のアプリをインストールして映像の通信を行います。PC用のアプリは無料でインストールできますがタブレット用のアプリは有料です。先に記載したリンク先ページの最下部からそれぞれのアプリのインストールページを開く事ができます。

![Duet_Display-1024x541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/0fa5118c-ddec-0e0a-d570-069def56b59a.png)

## 注意事項

AndroidタブレットはAndroid 7.1.2以上ではないとだめです。
Mac用のDuetアプリの最新バージョンだとAndroidタブレットとは有線で接続できません。（ただしこちらの方法を実施することでMacとAndroidタブレットで有線接続できるようになるかもしれません。サポートに問い合わせて教えていただきました。記事として投稿する許可もいただきました。）https://qiita.com/miriwo/items/e6fc18947ec8e1b807cc
気にならない程度とはいえさすがに若干の遅延があります。（無線で使用する場合ネットワークの速度やLAN内のトラフィック、PCとタブレットのハードウエア上の上限速度も関係します。）

## 使ってみた感想

完全に使用していなかったタブレットを有効活用できたこと、MacBook Proの外部ディスプレイ接続台数制限を超えて接続できることが非常に満足度が高いです！
自分は常にSlackを表示していたいのでAndroidタブレットは手元に置いています。
Macのディスプレイ設定でもタブレットを外部ディスプレイとして認識しています。

![内蔵Retinaディスプレイ-1024x740.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/c33291dd-3703-66ee-1e33-305a2e63a36a.png)

MacのDuetアプリの設定からタブレットに表示している映像の解像度やフレームレート、画質などを設定する事ができます。

![Duetの設定-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b8f656b6-8e2e-f73f-15e8-816bc2cff6de.png)

1000円ちょっとの買い切りで使用していないタブレットをPCのサブディスプレイとして使用できるので試してみる価値はあると思います。
また接続がうまく行かない場合でも、Duetのサポートにメールで問い合わせることで解決方法を提案してくれます。海外の会社なので英語でのやり取りになりますがGoogle翻訳を用いれば問題なくコミュニケーションを取ることができます。（自分はMac Androidタブレットの組み合わせで有線を用いた利用方法を教えていただきました。）

極稀に接続が切れたりなどまだ完璧ではありませんが低出費でディスプレイを増やせたことを考えると自分は非常に満足しています。みなさんも気になった方はぜひお試しください！
Smart Local と Global Observer, そして Extension Wonderland

国連スマート地図グループの活動の中での新たなアイディアのスケッチです。ChatGPTのサポートを受けています。

## はじめに
「自由で開かれたパーソナルコンピューティング」ということを大切にしていきたいと思っています。個々のユーザーが制御可能なデータ環境を持ち、それを利用して自分自身や他者との相互作用を促進することで個人を通じて社会をエンパワーしていくことが重要であり、また可能であるように思います。私たちの日常生活やビジネス、社会組織のあり方におけるデジタルテクノロジーの役割が大きく変化している中、改めてパーソナルコンピューティングが重要であるように思っています。

この文脈において、地理空間情報の可視化はますます重要な役割を果たしています。特に、[Observable](https://observablehq.com/)ベースのアプリケーションのように、サーバからもアプリケーションからも自由なウェブベースの地理空間情報の可視化スキルセットは有用であるように思います。このスキルセットの実装が、私たちが提唱する「Global Observer」です。

## Global Observer

[Global Observer](https://observablehq.com/d/652ef8ca26776146)は、Observableを活用して、完全にウェブベースで動作し、地理空間情報を視覚的に表現する能力を提供しています。ユーザーはどこからでも、さまざまなデバイスを通じて、リアルタイムで地理空間情報を観察し、理解することができます。

## Smart Local

一方、私たちはglobal Observerと同時に、完全にローカルで動作する地理空間情報の可視化スキルセットも開発しています。これが「Smart Local」です。Smart Localは、[Observable Framework](https://observablehq.com/framework/)をベースに構築されており、インターネットから切り離されたローカルな環境でも動作します。これにより、オフライン環境や閉じたネットワーク内での地理空間情報の視覚化が可能になります。

## Extension Woderland

Smart Localの特長の一つは、ローカルなAPIとの連動が可能であることです。これにより、ユーザーは計算機負荷の大きなAPIやセンサ情報とSmart Localを統合し、地理空間情報をより効果的に活用することができます。Smart Localが持つこの特性を私たちは「Extension Wonderland」と呼んでいます。Extension Wonderlandは、現在のところ次の8つのポイントで押さえられると思っています。

### 1. Raspberry Pi 4Bの活用: 
Raspberry Pi 4Bは、小さくて手ごろな価格なコンピューターです。この小さなボックスは、地理空間情報のマジックを起こすための基盤です。

### 2. USBベースのGPSアンテナ:
GPSアンテナは、Raspberry Piにつなぐだけで、位置情報を手に入れられる便利なガジェットです。これがあれば、どこにいても自分の位置を知ることができます。

### 3. Sense HATの活用:
Sense HATは、Raspberry Piにくっつけるだけで、気温や湿度、気圧などの情報を取得できる便利なセンサーです。屋外にせよ屋内にせよ、環境の温度が上がったり、空気が乾燥したりしたときに知らせてくれます。

### 4. モバイルバッテリーの統合:
モバイルバッテリーを使うと、Raspberry Piを持ち運びながらも電源を確保できます。これで、野外での活動や災害時の緊急対応にも役立ちます。これまでの実験によると、一般的なモバイルバッテリーで30時間以上の稼働ができる場合があることが分かっています。

### 5. HDMI接続:
HDMI接続を使って、Raspberry Piをプロジェクタや大型ディスプレー、あるいはテレビにつなげば、ウェブ地図を大きな画面で見ることができます。まるで地図を見ているような感覚を提供できる可能性があります。

### 6. Valhallaの統合:
Valhallaは、地図上でのルート案内やナビゲーションに使われるエンジンです。Raspberry Piにインストールすれば、どこへ行くにも道順を教えてくれます。

### 7. TinyLlamaの導入:
TinyLlamaは、オープンな大規模言語モデルです。Raspberry Piに入れておけば、地図の情報をすばやく引き出すことができる、といった使い方を検討していきたいと考えています。

### 8. Placemarkの導入:
最近オープンソース化された[Placemark](https://play.placemark.io/)を導入すれば、見るだけではなく、コーディングする必要もなく、ウェブ地図に書き込むという体験を提供できる可能性があります。

## まとめ

Smart LocalとGlobal Observerは、それぞれの特性を活かしつつ、ユーザーに地理空間情報を新しい視点から理解し、活用する機会を提供します。このようなスキルセットの開発は、今後のデジタル時代において重要な役割を果たすことでしょう。私たちは、この取り組みを通じて、地理空間情報の可視化がより身近に、よりインタラクティブになり、より効果的に活用される未来を築いていきます。
MacにHomebrewをインストールする

## 概要

今回はMacにHomebrewをインストールする方法をまとめたいと思います。

## 情報

HomebrewをインストールするMacOSのPCの情報を下記に記載します。ちなみに完全にプライベートのPCです。

| 項目 | 情報 |
| --- | --- |
| 機種 | MacBook Air (11-inch, Mid 2012) |
| OS | macOS Catalina |
| プロセッサ | Intel Core i5 |
| メモリ | 8 GB |
| グラフィックス | Intel HD Graphics 4000 1536 MB |

## 方法

### Homebrewのインストール

ターミナルを開きコマンドを入力できる状態にします。

下記サイトにアクセスします。

https://brew.sh/

「インストール」の下に記載されているURLをコピーします。

![macOS（またはLinux）用パッケージマネージャー_—_Homebrew-1024x509.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b3aafdd1-72ed-7780-5906-624460606a46.png)

コピーしたコマンドをターミナルに入りつけて実行します。パスワードの入力を求められたら入力してEnterを押下します。

「Press RETURN to continue or any other key to abort」が表示されたらEnterを押下します。

「Next steps: Run `brew help` to get started」という文字列が表示されたらインストールは完了しました。

インストールが完了したら下記コマンドを実行してインストールされたHomebrewのバージョンを確認します。このコマンドが正常に実行できたらHomebrewが正常にインストールできています。

```
brew --version
```

## 2024/11/26 追記

>「インストール」の下に記載されているURLをコピーします。

上記の内容実施時に下記のような内容が出力されるようになりました。

```
    echo >> /Users/shunokawa/.zprofile
    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/shunokawa/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
```

お使いのシェルに合わせて指定のコマンドの実行をお願いします。
筆者はbashを使っているので下記を実行しました。

```
    echo >> /Users/shunokawa/.bash_profile
    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/shunokawa/.bash_profile
    eval "$(/opt/homebrew/bin/brew shellenv)"
    source ~/.bash_profile
```
mermaid.jsが記載されているMarkdownファイルをPDFで出力する

## 概要

marmaid.jsが記載されているMarkdownファイルをPDF出力する方法をご紹介したいと思います。

## 前提条件

今回の内容にはVisual Studio Code（以降VScode）の拡張機能「Markdown PDF」と「Markdown Preview Enhanced」が必須となります。

## ファイルの作成と記載

任意の場所に「test.md」を作成しVScodeで開きましょう。開いたら下記の内容をtest.mdに記載してください。

```markdown
# テスト

- これはテストです。

    ```mermaid
    graph LR
      A[起床] --> B[朝食]
      B --> C[作業]
      C --> D[昼食]
      D --> E[作業]
      E --> F[夕飯]
      F --> G[就寝]
      G --> A
    ```
```

Markdown Preview Enhancedのプレビューを表示した時に下記のように表示されていることを確認してください。

![Preview_test_md-1024x570 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/38b3568b-c681-32e1-ef1c-e1d0242e6afe.png)

コードが記載記載されている部分を右クリックしてメニューを開き「Markdown PDF: Export (pdf)」をクリックしましょう。

![スクリーンショット_2020-12-15_17_22_01-1024x572.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/003f7dc0-90f6-fffb-9c6a-61beffef12b3.png)

test.mdを設置したフォルダにtest.pdfが作成されたと思います。それではtest.pdfを開いて見ましょう。

下記のようにMarkdown Preview Enhancedのプレビューで表示されていたものがそのままPDFファイルになっていることがわかります！

![test_pdf（1ページ）-1-1024x529.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/716ec509-482c-ee4b-0c83-c860a8961117.png)

mermaid.jsの図形があるMarkdownファイルでもPDF化することができました。「Markdown Preview Enhanced」が入っていないとmermaid.jsのコードは図形としてではなく文字列として扱われてしまうので注意が必要です！
AWS Certified Database  Specialty (DBS-C01) に合格しました

# 目的
AWS Certified Database  Specialty (DBS-C01) を受験し、無事合格できました。
[2024年4月30日](https://aws.amazon.com/jp/certification/certified-database-specialty/)に廃止予定の試験ですが、データベース関連のAWSサービスの中から最適なサービスを選択する知識が身についたのでよかったです。

この記事では、学習方法から合格までの流れを紹介します。

# 学習方法
以下3つの学習教材を使って、進めました。
* [要点整理から攻略する『AWS認定 データベース-専門知識』 (Compass Booksシリーズ)](https://amzn.asia/d/3hgUYUa)

試験に出題されるサービスの概要が記載されていて、全体感を掴むのに役立ちました。

サービスごとに、可用性、パフォーマンス、セキュリティ、バックアップ、モニタリング、コスト、メンテナンス、パフォーマンス、バックアップ、モニタリング、トラブルシューティングの項目で説明されています。

自分でサービスごとに各項目を比べることで、サービスの違いを理解できました。特に、Amazon RDS、Amazon Aurora、Amazon DynamoDB、Amazon ElastiCacheの特徴を理解でき、試験の際に自信を持って解答を選べるケースが増えました。 

練習問題が65問最後についているのもよかったです。

* [徹底対策 AWS認定 データベース - 専門知識: 65問×2セット + 20問 合計150問（DBS-C01 対応） クラウド試験徹底対策シリーズ](https://amzn.asia/d/1vhlarS)で試験を実施

試験問題に慣れるために、問題数の多いこちらの本を参照しました。
間違えた問題を元に、「要点整理から攻略する『AWS認定 データベース-専門知識』 (Compass Booksシリーズ)」で再度見直し理解を深めました。

Amazon ElastiCacheのredis周りで、現在推奨されていない方法が解答になっていることが少しありましたが、そこも含め確認して勉強ができたのでよかったです。

* udemyの「AWS Certified Database - Specialty 模擬試験」で試験を実施

本番を想定した形で試したかったので、udemyの試験も実施しました。
間違えた箇所を中心に学習し、合格点に達するまで2〜3回同じ問題でテストしました。

# 試験の申し込み
[【2024年】AWS試験の申し込み・受験方法](https://nokonokonetwork.com/certificate/aws/aws_associate/how_to_apply_for_aws_exam.html)
をもとに申し込みました。
テストセンターの予約が埋まっていることが多いので、遅くても2週間前には予約が必要です。

# 試験前の準備
[【解説】ピアソンVUE試験当日の流れ](https://nokonokonetwork.com/certificate/lpic/aws-examination-flow-of-the-day.html)を参考に準備を進めました。
試験は申し込み時間の30分前から始められたので、余裕を持って行って早めに受けるのがおすすめです。
また、当日の持ち物は運転免許証と保険証の2点で問題ありませんでした。
当日の流れがとてもわかりやすくまとまっていて助かりました。
AWS Certified Solutions Architect - Associateの時も同じ手順で実施できました。

# 試験本番
全65問解くのに120分ほどかかりました。
時間に追われることはなかったですが、長文問題もあるので、最後の20問は解くのがしんどかったです。

# 合格発表
昼頃にテストを実施し、当日の夜には合格のメールが来ました。
ローカルでOracleDB構築

# 前書き
最近OracleDBAのSilver取得しようと思いまして、参考書読んだりしていますが。
どうにも手を動かさないと頭に入ってきません。
ということで、ローカルにOracleDBを構築しようと思います。
ひとまずSQLやコマンドが叩ければよいので、そこまでをゴールにします。

# 環境
- Windows 11 Pro
- WSL 2.1.4.0
- Ubuntu 22.04.3 LTS

# 手順

#### 1. Oracle DBダウンロード
以下のURLから取得できる。今回は「Oracle Database 21c for Linux x86-64」を選択。
https://www.oracle.com/jp/database/technologies/oracle-database-software-downloads.html

#### 2. docker image作成の準備
以下のURLのリポジトリをclone
https://github.com/oracle/docker-images

#### 3. Oracle DBをリポジトリ内に配置
以下のように、バージョン配下にダウンロードしてきたzipファイルを配置する。
```sh
docker-images/OracleDatabase/SingleInstance/dockerfiles/21.3.0/LINUX.X64_213000_db_home.zip
```

#### 4. docker image 作成シェル実行
```sh
$ sudo ./docker-images/OracleDatabase/SingleInstance/dockerfiles/buildContainerImage.sh  -v 21.3.0 -e -i
```
※コマンドのオプションなど、以下のREADME参照。
https://github.com/oracle/docker-images/tree/main/OracleDatabase/SingleInstance#building-oracle-database-container-images

#### 5. docker image 確認
```
$ docker images
REPOSITORY        TAG         IMAGE ID       CREATED      SIZE
oracle/database   21.3.0-ee   3dcd229551c2   7 days ago   7.94GB
```

#### 6. docker-compose.yml作成
```yml:docker-compose.yml
version: '3'
services:
  do:
    image: oracle/database:21.3.0-ee
    container_name: my-oracle
    ports:
      - 1521:1521
      - 5500:5500
    volumes:
      - ./oradata:/opt/oracle/oradata
    environment:
      - ORACLE_PWD=opensesami
      - ORACLE_PDB=ORCLPDB1
```

#### 7. マウントするディレクトリ作成
```sh
$ mkdir oradata

$ chmod 777 ./oradata
```

#### 8. コンテナ起動とアクセス
```sh
$ docker-compose up -d
Recreating my-oracle ... done
$ docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED         STATUS                            PORTS                                                                                  NAMES
55a94bda9bfa   oracle/database:21.3.0-ee   "/bin/sh -c 'exec $O…"   7 seconds ago   Up 5 seconds (health: starting)   0.0.0.0:1521->1521/tcp, :::1521->1521/tcp, 0.0.0.0:5500->5500/tcp, :::5500->5500/tcp   my-oracle

$ docker exec -it my-oracle /bin/bash
```

#### 9. Oracle動作確認
コンテナ内からsqlplusでDBアクセス。適当なSQLでSQL実行できることを確認。
```
$ sqlplus system/opensesami@ORCLCDB

SQL*Plus: Release 21.0.0.0.0 - Production on Sun Mar 17 06:21:10 2024
Version 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.

Last Successful login time: Sun Mar 17 2024 06:16:30 +00:00

Connected to:
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0

SQL> select name, open_mode from v$database;

NAME      OPEN_MODE
--------- --------------------
ORCLCDB   READ WRITE
```

# 参照
下記の記事、参考にさせて頂きました :bow_tone1: 
- https://qiita.com/blueskyarea/items/e96ec596819e0530e577
- https://qiita.com/kannkyo/items/dd3642d0cd9038861017
🔥 LLMにコード共有するためのVS Code拡張機能 "Code to Clipboard" を作った

<img src="https://storage.googleapis.com/zenn-user-upload/8173f0898af3-20240317.webp" width=200>

# はじめに
[こちらの記事](https://zenn.dev/olemi/articles/7b7992c055c64a)にインスパイアされて、VSCode上でコードを簡単にクリップボードにコピーできる拡張機能を開発しました。

https://marketplace.visualstudio.com/items?itemName=YuichiNakamura.code-to-clipboard&ssr=false#overview

https://github.com/nakamurau1/code-to-clipboard

# 開発した拡張機能の概要
この拡張機能の主な機能は以下の2つです:

1. ディレクトリ内のすべてのコードをクリップボードにコピーする
2. 開いているすべてのタブからコードをクリップボードにコピーする

## 1. ディレクトリ内のすべてのコードをクリップボードにコピーする
エクスプローラーでディレクトリのコンテキストメニューの「Copy Directory Code to Clipboard」をクリックすることで、ディレクトリ構造とそのディレクトリに含まれるファイルの内容をコピーすることが出来ます。

````
# Directory Structure

- file1.js
- file2.ts
- dir1/
  - file3.js
  - file4.ts

# File Contents

## file1.js

```
// file1.js content
```

## file2.ts

```
// file2.ts content
```

## dir1/file3.js

```
// dir1/file3.js content
```

## dir1/file4.ts

```
// dir1/file4.ts content
```
````

## 2. 開いているすべてのタブからコードをクリップボードにコピーする
エディタ上のコンテキストメニューの「Copy Code from All Open Tabs to Clipboard」をクリックすることで、開いているタブのすべてのコードをクリップボードにコピーできます。

````
## file1.js

```
// file1.js content
```

## file2.ts

```
// file2.ts content
```

## dir1/file3.js

```
// dir1/file3.js content
```
````

# 対象のファイル
![](https://storage.googleapis.com/zenn-user-upload/8173f0898af3-20240317.webp =200x)

# はじめに
[こちらの記事](https://zenn.dev/olemi/articles/7b7992c055c64a)にインスパイアされて、VSCode上でコードを簡単にクリップボードにコピーできる拡張機能を開発しました。

https://marketplace.visualstudio.com/items?itemName=YuichiNakamura.code-to-clipboard&ssr=false#overview

https://github.com/nakamurau1/code-to-clipboard

# 開発した拡張機能の概要
この拡張機能の主な機能は以下の2つです:

1. ディレクトリ内のすべてのコードをクリップボードにコピーする
2. 開いているすべてのタブからコードをクリップボードにコピーする

## 1. ディレクトリ内のすべてのコードをクリップボードにコピーする
エクスプローラーでディレクトリのコンテキストメニューの「Copy Directory Code to Clipboard」をクリックすることで、ディレクトリ構造とそのディレクトリに含まれるファイルの内容をコピーすることが出来ます。

````
# Directory Structure

- file1.js
- file2.ts
- dir1/
  - file3.js
  - file4.ts

# File Contents

## file1.js

```
// file1.js content
```

## file2.ts

```
// file2.ts content
```

## dir1/file3.js

```
// dir1/file3.js content
```

## dir1/file4.ts

```
// dir1/file4.ts content
```
````

## 2. 開いているすべてのタブからコードをクリップボードにコピーする
エディタ上のコンテキストメニューの「Copy Code from All Open Tabs to Clipboard」をクリックすることで、開いているタブのすべてのコードをクリップボードにコピーできます。

````
## file1.js

```
// file1.js content
```

## file2.ts

```
// file2.ts content
```

## dir1/file3.js

```
// dir1/file3.js content
```
````

# 対象のファイル
"Code to Clipboard" 拡張機能は、Git で管理されているディレクトリを対象としています。拡張機能は、Git の ls-files コマンドを使用して、リポジトリ内のファイルを取得します。これにより、.gitignore ファイルで指定されているファイルやディレクトリは自動的に無視されます。つまり、共有されるコードには、Git で追跡されているファイルのみが含まれます。

さらに、拡張機能はテキストファイルのみを処理します。バイナリファイルや画像ファイルなどは、コピーの対象から除外されます。これにより、共有されるコードの関連性が保たれ、不要なデータが含まれることを防ぎます。
[Java]HttpHeadersからMultiValueMapに変換

```java
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import org.springframework.http.HttpHeaders;
import org.springframework.util.MultiValueMap;

public class HttpHeadersToMultiValueMapConverter {

    public static MultiValueMap<String, String> convert(HttpHeaders headers) {
        MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap();
        
        headers.forEach((key, values) -> {
            multiValueMap.put(key, values);
        });
        
        return multiValueMap;
    }

    public static void main(String[] args) {
        HttpHeaders headers = new HttpHeaders();

        // java.nio.charset.StandardCharsets は、US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16のみでWindow-31jとかMS932は無い
        // 文字コードの指定はCharset.forName()
        //headers.setContentType(new MediaType(MediaType.APPLICATION_JSON, StandardCharsets.UTF_8));
        //headers.setContentType(new MediaType(MediaType.APPLICATION_JSON, Charset.forName("UTF-8")));
        // MS932と設定した後の値をみるとcharasetはwindows-31jになります
        headers.setContentType(new MediaType(MediaType.APPLICATION_JSON, Charset.forName("MS932"))); 
        // headers.setContentType(new MediaType(MediaType.APPLICATION_JSON, Charset.forName("Windows-31j"))); // windows-31j
        
        MultiValueMap<String, String> convertedHeaders = convert(headers);
        
        System.out.println("Converted MultiValueMap:");
        System.out.println(convertedHeaders);
    }
}
```

出力
MS932と指定。charsetはwindows-31jとなる。

```
Converted MultiValueMap:
[Content-Type:"application/json;charset=windows-31j"]
```
Node-REDでkakasiを使う

### ちょいメモ

Raspberry Pi4のkubernetesクラスタ上にデプロイしているNode-REDのお話です。

functionノードでkakasiを使おうとしましたが、全く動きませんでした。
![kakasi1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/53275e52-329f-05d3-2ad3-18c2376e607c.png)

デバッグメッセージには以下のようにエラーが出ています。
![kakasi3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/9cca51e0-80bf-e021-382e-1bf9e06782d2.png)

よくわかりませんが、lib自体が無いので、以下のようにkakasi直下のkakasiディレクトリをlibにリネームしました。
```
$ kubectl exec -it node-red -- mv /.node-red/node_modules/kakasi/kakasi /.node-red/node_modules/kakasi/lib
```

あと、x64のkakasiコマンドを内包しているので、ソースコードをダウンロードしてarm64用にコンパイルして入れ替えれば良いです。
```
$ curl http://kakasi.namazu.org/stable/kakasi-2.3.6.tar.gz > kakasi-2.3.6.tar.gz
$ tar xzvf kakasi-2.3.6.tar.gz
$ cd kakasi-2.3.6/
$ ./configure
$ make
$ kubectl cp src/kakasi node-red:/.node-red/node_modules/kakasi/lib/bin/linux/kakasi
```

この２つの対策で、functionノードでkakasiが使えるようになります。

![kakasi2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/5a8c2284-fb2f-694d-0fe1-472ca632e825.png)

node.jsのモジュールは、たまにx64のコマンドをバイナリで内包してラッパーしているだけのものもあるので、アーキテクチャが違う場合はそのコマンドを再コンパイルするかOS上で動くアーキテクチャのものに入れ替える必要があります。

以下の記事でword2vecを利用した際もそうでした。

https://qiita.com/Y-Shikase/items/655c7ec7eeff2f76064c#word2vec%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

fileコマンドで調べれば、以下のようにx86-64と出てくるので、Rapberry Piユーザは意識しておくと良いです。
```
# file kakasi
kakasi: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=b46c5d9e566b9f8168710ad616e18f60dcf10fed, with debug_info, not stripped
```

おわり。