OmniAICreator/Qiita-1.07M huggingface dataset:
変数に/が含まれているとVueファイルを動的インポートすることができない

# 例えば

以下では`/fuga`にアクセス時には正しく内容が表示されます。
しかし`/piyo/piyo`にアクセス時には`Unexpected error when starting the router: Error: Unknown variable dynamic import`というような実行時エラーになります。

```typescript:/src/router/index.ts
import { createRouter, createWebHistory } from 'vue-router'

const hoge = (path: string) => {
  return {
    path: '/' + path,
    component: () => import(`@/views/${path}.vue`)
  }
}

export default createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes: [
    hoge('fuga'),
    hoge('piyo/piyo'),
  ],
})
```

コンパイルエラーにならないのが厄介なところですね。
原因や解決策を知っている方がいれば教えていただきたいです。

# 追記

原因は[rollup.js](https://rollupjs.org/)の仕組みにあるようです。

https://github.com/rollup/plugins/tree/master/packages/dynamic-import-vars#limitations

import関数の引数をglobパターンに変換する？らしいので階層が違うとファイルを見つけられなくなるのかもしれません。
解決策としては以下のようになります。

```typescript:/src/router/index.ts
import { createRouter, createWebHistory } from 'vue-router'

const getComponent = (path: string) => {
  const parts = path.split('/').filter(p => p.length > 0)

  switch (parts.length) {
    case 0: throw 'No path: ' + path
    case 1: return () => import(`@/views/${parts[0]}.vue`)
    case 2: return () => import(`@/views/${parts[0]}/${parts[1]}.vue`)
  }

  throw 'Too deep path: ' + path
}

const hoge = (path: string) => {
  return {
    path,
    component: getComponent(path),
  }
}

export default createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes: [
    // hoge('/'),
    hoge('/fuga'),
    hoge('/piyo/piyo'),
    // hoge('/piyo/piyo/piyo'),
  ],
})
```
【C#】競プロ入出力メモ


:::note
C#での入力の受け取りは基本的に1行ごとに受け取って格納していく。
:::

### ・1行に1つだけの値を受け取る
`Console.ReadLine()`でstring型文字列として一行受け取り、それを数値や文字に変換する。

```c#
// 文字列
string s = Console.ReadLine();
```
```c#
// 数値
int n = int.Parse(Console.ReadLine());
```
```c#
// 文字
char ch = (char)Console.Read();
```

### ・1行に空白区切りで複数与えられる値を受け取る
1行の入力を受け取り、`Split(' ')`を用いて空白で区切って配列として格納する。それを(他の型に変換しながら)配列のインデックス順に変数に格納していく。
```c#
// 文字列
string[] input = Console.ReadLine().Split(' ');
string s = input[0];
string t = input[1];
```
```c#
// 数値
string[] input = Console.ReadLine().Split(' ');
int n = int.Parse(input[0]);
int m = int.Parse(input[1]);
```
```c#
// 文字
string[] input = Console.ReadLine().Split(' ');
// C#ではString型文字列はchar型文字の配列として扱える
char ch1 = input[0][0]; 
char ch2 = input[1][0];
```

### ・1行に空白区切りで複数与えられる値を配列として受け取る
空白で区切られたstring型配列を他の型に変換して格納する。

```c#
// 文字列
string[] strArr = Console.ReadLine().Split(' ');
```
```c#
// 数値
int[] numArr = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
```
```c#
// 文字
char[] chArr = Array.ConvertAll(Console.ReadLine().Split(' '), item => item[0]);
```

### ・h行w列の2次元配列として受け取る

1行の文字列をchar型配列として受け取る `.ToCharArray()`を使う。
```c#
// 1行の文字列をchar型配列として受け取る
char[] chArray = Console.ReadLine().ToCharArray();
```

・文字の場合
例:
...
#.#
..#
```c#
int h; // 行数
int w; // 列数
char[,] map = new char[h, w];
for (int i = 0; i < h; i++)
{
    char[] input = Console.ReadLine().ToCharArray();
    for (int j = 0; j < w; j++)
    {
        map[i, j] = input[j];
    }
 }
```

・数値の場合
例:
123
456
789
```c#
int h; // 行数
int w; // 列数
int[,] map = new int[h, w];
for (int i = 0; i < h; i++)
{
    char[] input = Console.ReadLine().ToCharArray();
    for (int j = 0; j < w; j++)
    {
        // 各文字を整数に変換
        map[i, j] = input[j] - '0';
    }
 }
```


### ・1行に1つの値を出力
文字列/数値/文字問わず出力可能。
```c#
int num = 123;
Console.WriteLine(num);
// Output: 123
```

### ・1行に複数の値を出力
複合書式。`Console.WriteLine()`関数の第二引数以降の変数がそれぞれ0番目,1番目...となり第一引数の{0},{1}...に対応する。存在しない引数の番号を指定するとエラーとなる。
```c#
int num = 123;
string str = "abc";
char ch = 'あ';
Console.WriteLine("{0}, {2}, {1}", num, str, ch);
// Output: 123, あ, abc
```

【最後に】
------------
今後も自分が役に立ったリファレンスやテクニックについて随時追記していこうと思います。
もし誤字脱字および技術的なご指摘がございましたらお気軽にコメントください。
wixヘッドレスをnuxt3で試してみる。

# 概要
以前から気になっていたwixヘッドレス試します。(nuxt3ですがoptions apiで書きます。)

コレクションはこちらを参考にNewsコレクションを定義します。

https://zenn.dev/lambta/articles/b8bcc8da5291c8

作成したものはこちら

https://github.com/teratai3/wixheadless_test

## 初期設定
### sdkインストール
nuxtをインストールしたらwixにsdkがあるようなのでインストールします。
```
npm install @wix/api-client
```

```
npm install @wix/data-items
```

### envファイル定義

```.env
NUXT_PUBLIC_WIX_CLIENT_ID=
```

configファイルにenvを設定します。publicとして設定ではなく非公開で設定。
```javascript:nuxt.config.ts
export default defineNuxtConfig({
  runtimeConfig: {
    wixClientId:process.env.NUXT_PUBLIC_WIX_CLIENT_ID || '',
  }
})
```

### WixClientを設定する
apiで使うので「server/utils」定義してあげる

```javascript:WixClient.js
import { createClient, OAuthStrategy } from '@wix/api-client';
import { dataItems } from '@wix/data-items';

export default async () => {
  const config = useRuntimeConfig();

  const wixClient = createClient({
    modules: { dataItems },
    auth: OAuthStrategy({ clientId: config.wixClientId }),
  });

  const tokens = await wixClient.auth.generateVisitorTokens();
  wixClient.auth.setTokens(tokens);

  return wixClient;
}
```

## apiを定義する。
serverディレクトリにnewsを取得するapiを定義します。

参考、一覧取得
```javascript:all.get.js
export default defineEventHandler(async (event) => {
    const wixClient = await WixClient();

    const Items = await wixClient.dataItems.queryDataItems({
        dataCollectionId: 'News',
    }).find();    

    return (Items);
});
```

## apiからデータを取得
```vue:index.vue
<template>
    <ul>
        <li v-for="item in items?._items" :key="item._id"><NuxtLink :to="{ path: '/news/' + item.data.slug }">{{ item.data.title }}</NuxtLink></li>
    </ul>
</template>



<script>
export default {
    data() {
        return {
            items: []
        }
    },
    async mounted() {
        this.items = await $fetch("/api/news/all");
    }
};
</script>
```


## 画像を取得するコンポーネント

```vue:WixMedia.vue
<template>
    <img :src="imageUrl" :alt="alt" :width="width" :height="height" :class="className" />
</template>

<script>
import { media as wixMedia } from '@wix/api-client';


export default {
    props: {
        media: {
            default: ""
        },
        alt: {
            default: ""
        },
        width: {
            default: 640
        },
        height: {
            default: 320
        },
        className: {
            default: ""
        },
    },
    computed: {
        imageUrl() {
            return this.media
                ? this.getImageUrlForMedia(this.media, this.width, this.height)
                : this.$PLACEHOLDER_IMAGE;
        },
    },
    
    methods: {
        getImageUrlForMedia(media, width, height) {
            if (media.startsWith('wix:image')) {
                //return wixMedia.getScaledToFillImageUrl(media, width, height, {});
                return wixMedia.getScaledToFitImageUrl(media, width, height,{});
            } else {
                return media;
            }
        }
    }
};
</script>
```


## WiXヘッドレスのメリット
* 他のヘッドレス系のサービスと比較してECサイトやブッキング等がwix単体で作れる
* wixオートメーションを使って何かのタイミングで自動でメールを送信したりできる

## 感想
ECサイトやブッキングができる点が面白い所なのかなと思います。
ヘッドレスだけじゃなく、Editor Xを更に強化したエンタープライズ向けのWix Studioも発表されたのでWixの今後に注目したいです。
TypeScriptで子コンポーネントに値渡す

TypeScriptで子コンポーネントに値を渡すやり方のメモ。

例えば、idの値を親から子に渡すとして、コンポーネントで受け取る際はこのようになる。

```tsx:Cildren.tsx
import { FC } from "react";



export const Cildren:FC<{id: any}> = ({id}) =>{
    return(
        <>
            <h5>子コンポーネント</h5>
            <p>親コンポーネントからのid:{id}</p>
        </>
    );
}
```

親コンポーネントでimportして使う時は、このように値を渡します。
```tsx:Parent.tsx

const id:number = 123;

<Cildren id={id} />

```
以上
ファビコンを簡単に作成できるサイト

ファビコンを簡単に作成できるサイトがあったので書いておこうと思う。

テキストを入力すると自動で.icoファイルやiOS用の画像まで作ってくれる。アルゴリズムベースでフォントも選べるので結構感動した。背景や文字色も選べる。

[https://favicon.io](https://favicon.io)

別のサイトだとAIで生成してくれるものもあるが、それよりも比較的に安定感というかがあって感動した。
Nuxt3のdocker環境を構築してみた

### ディレクトリ構成
```
code
|-app
|-docker
  |-app
    |-Dockerfile
|-docker-compose.yml
```

### docker-compose.yml
```
version: '3.7'
services:
    app:
        container_name: app
        ports: 
            - 3100:3000
        build: ./docker/app
        volumes: 
            - ./app:/app
        tty: true
        stdin_open: true
        environment: 
            - ports=3000
            - CHOKIDAR_USEPOLLING=true
            - HOST=0.0.0.0
        networks:
            - app-network
networks: 
    app-network:

```

### app/Dockerfile
```
FROM node:18-buster
ENV TZ Asia/Tokyo

WORKDIR /app

RUN apt-get update \
&& apt-get install -y

RUN npm install npm@latest nuxi nuxt3
```

上記準備をしたらcodeディレクトリ直下（docker-compose.ymlが存在するディレクトリ内）で
```
docker-compose build
docker-compose up -d
```

コンテナに入る
```
docker-compose exec app sh
```

プロジェクト作成
```
npx nuxi init
```

`Which package manager would you like to use?` と聞かれるので `npm` を選択

nuxtインストール
```
npm install
```
`npm run dev`でサーバーを起動して`localhost:3100`にアクセス

NUXT3の画面が表示されればOK

### nuxt.config.tsのエラーメッセージが消えない・・・
nuxt.config.tsにコンポーネントの設定を追記したところ、なぜかエラーメッセージが、、、

nuxt.config.ts
```
export default defineNuxtConfig({
  devtools: { enabled: true },
  // 以下を追記
  components: [
    {
      path: '~/components',
      pathPrefix: true,
    },
  ],
})
```
エラーメッセージ
```
Argument of type '{ devtools: { enabled: boolean; }; components: { path: string; pathPrefix: boolean; }[]; }' is not assignable to parameter of type 'InputConfig<NuxtConfig, ConfigLayerMeta>'.
  Object literal may only specify known properties, and 'components' does not exist in type 'InputConfig<NuxtConfig, ConfigLayerMeta>'.
```
以下を参考に`typescript` `vue-tsc` `@types/node`をインストール
```
npm i -D typescript
npm i -D vue-tsc
npm i -D @types/node
```
https://zenn.dev/nakamura196/articles/3cbae2923e0aff
https://github.com/nuxt/nuxt/issues/20040#issuecomment-1494804429

それでも解決せず、、、

### 最終的にVScodeのアップデートで解決

以下を参考に、VScodeのアップデートを実行。
https://github.com/nuxt/nuxt/issues/20040#issuecomment-1545701574

※以下はmacの方法です。
1.`code`->`check for update`をクリック
2.以下のエラーに遭遇、、、
```
Cannot update while running on a read-only volume. The application is on a read-only volume. Please move the application and try again. If you’re on macOS Sierra or later, you’ll need to move the application out of the Downloads directory. See this link for more information.
```
3.VSCodeを一旦終了
4.VSCodeをアプリケーションフォルダに入れる
※VSCodeがアプリケーションフォルダに入っていない場合にアップデートできないようで、私の場合はダウンロードフォルダに入っていました。
5.VSCodeを起動
6.1の手順でアップデートを実行
7.VSCodeを再起動

半日以上エラー解決できずに苦しみました。。。どなたかの参考になりましたら幸いです。
【Juliaフレームワーク】Genie サービス(app)を作る　コントローラーを追加する

# サービスを作るには

```julia
julia> using Genie
julia> Genie.Generator.newapp_webservice("MyGenieApp")

```


# コントローラーを追加するには

```julia
julia> Genie.Generator.newcontroller("Tasks")
```
C言語でpow関数を実装してみた。

# 注意！
・以下のネタバレあり。

https://atcoder.jp/contests/abc320/tasks/abc320_a

# pow関数とは
・今回、実装するpow関数については以下の記事にまとめています。

https://qiita.com/emioiso/items/4c1467e7294cd81afbe1

# ACしたコード && 解説
```c
#include <stdio.h>
int main(void){
    //標準入力からaを受け取るのでint型でaを宣言する。
    int a;
    //標準入力からaを受け取るのでint型でbを宣言する。
    int b;
    //標準入力からaとbを受け取るので標準入力から値を受け取る。
    scanf("%d%d",&a,&b);
    // printf("%d%d",a,b);

    //累乗は掛け算をしていくので初期値は１にする。
    //初期値を０にすると０に掛け算をすることになるのでどんなに掛け算しても結果が０になる。
    int sumA = 1;
    //aをb回掛け算することで冪乗の掛け算ができる。
    for(int i = 0; i < b; i++){
        sumA *= a;
    }
    // printf("%d",sumA);

    //bをa回掛け算することで冪乗の掛け算ができる。
    int sumB = 1;
    for(int i = 0; i < a; i++){
        sumB *= b;
    }
    // printf("%d",sumB);
    //それぞれの結果を足し算する。
    printf("%d\n",sumA + sumB);
    return(0);
}
```
<b>入力例</b>
2 8
<b>出力例</b>
320

# ACしたコードを良いコードにしてみる①
・pow関数を使って解いてみる。
```C
#include<stdio.h>
//pow関数を使うために必要
#include<math.h>
int main()
{
  int a;
  int b;
  scanf("%d%d",&a,&b);
  
  int powA;
  int powB;
  int ans = 0;
  
  powA = pow(a,b);
  powB = pow(b,a);
  ans = powA + powB;
  printf("%d",ans);
  
  return(0);
}
```
<b>入力例</b>
2 8
<b>出力例</b>
320

# ACしたコードを良いコードにしてみる②
・pow関数を使ってコードを短くしてみた。
```c
#include <stdio.h>
#include <math.h>

int main(void){
   
   int a;
   int b;
   scanf("%d%d",&a,&b);
   
   int ans = 0;
   ans = pow(a,b) + pow(b,a);
   printf("%d",ans);
   
   return 0; 
}
```
<b>入力例</b>
2 8
<b>出力例</b>
320

# ACしたコードを良いコードにしてみる③
・教えて頂いたニ乗法を使って解いてみる。
```C
#include <stdio.h>

int main() {
    int a, b;
    scanf("%d %d", &a, &b);

    int result = 1;
    int baseA = a;
    int baseB = b;

    while (b > 0) {
        if (b % 2 == 1) {
            result *= baseA;
        }
        baseA *= baseA;
        b /= 2;
    }

    int  tempResult = 1;
    while (a > 0) {
        if (a % 2 == 1) {
            tempResult *= baseB;
        }
        baseB *= baseB;
        a /= 2;
    }

    result += tempResult;

    printf("%d\n", result);

    return 0;
}

```
【Juliaフレームワーク】Genie 再起動方法

# Genieの再起動方法

起動方法はいくつかあります。

0. 以下はモジュールをREPLにGenieアプリをローカルで有効化する手順（以下2，3の事前準備）

    ```julia
   %cd \path\to\myGenieApp
   %julia
   julia> ] #押すとモードが変わる
   pkg> activate . # myGenieAppモジュールをローカルで有効化する 
   pkg> (delキー) #pkgモードのエスケープ
    ```

2. REPLから立ち上げる(フォアグラウンド実行）
　　　　　　
   ```julia
   julia> using Genie
   julia> Genie.loadapp()　#Genie.loadapp(ポート番号)としてもよい
   ```

2. REPLから立ち上げる(バックグランド実行）
　　　　　　
   ```julia
   julia> myGenieApp.startup()
   ```


1. 直接実行するbin/serverを実行する (フォアグラウンド実行）

   ```julia
   %cd \path\to\myGenieApp
   %julia \bin\server
   ```


https://genieframework.com/index.html
Terraformで重複したデータを判定/処理する方法

# 概要
Terraformで2つの配列間で重複したデータのみを変数に格納する方法をまとめます。
# 事前実装される関数による実装
 @rakiさんからいただいたコメントのほうがスマートでしたので、そちらを掲載させていただきます。ご助言ありがとうございました！
```hcl
locals {
  dataset_a = ["Apple", "Grape", "Orange"]
  dataset_b = ["Apple", "Orange"]
}

output "all" {
  value = [local.dataset_a, local.dataset_b]
}

output "dup" {
  value = [setintersection(local.dataset_a, local.dataset_b)]
}

output "unique" {
  value = [setsubtract(local.dataset_a, local.dataset_b)]
}
```

# 転置による実装
以下のように実装すると2つの配列に登録されたデータのうち重複したデータのみを絞り込むことが可能です。<BR>

```hcl
locals {
  dataset_a = ["Apple","Grape", "Orange"]
  dataset_b = ["Apple","Orange"]
  result    = [ for k,v in transpose({foo=local.dataset_a, bar=dataset_b}): k if length(v)==2]
}

$ echo "local.result" | terraform console
[
  "Apple",
  "Orange",
]
```
簡単な動作の説明をします
transpose関数はmapのKeyとValueを入れ替える動きをします。 https://developer.hashicorp.com/terraform/language/functions/transpose
そのため、処理前はKeyに"foo"と"bar"が入っていましたが、処理後はKeyに"Apple"や"Grape"、"Orange"が格納され、Valuleに"foo"と"bar"が格納されるようになります。
したがって、処理後のValueの要素数が2になっているKeyについてはデータが重複していると判断できます。

# 応用例
重複したいデータを排除したい場合の例を以下記載します。
以下の例ではresultの判定部分を`length(v)==1 && !contanis(v, "bar")]`に変更しています。
これにより、要素数が1(片方の変数のみにしか値が存在しない)かつdataset_bにはデータが存在していないことを確認し、結果的にdataset_aのみに含まれるデータを保存しています。

```hcl
locals {
  dataset_a = ["Apple","Grape", "Orange"]
  dataset_b = ["Apple","Orange"]
  result    = [ for k,v in transpose({foo=local.dataset_a, bar=dataset_b}): k if length(v)==1 && !contains(v, "bar")]
}

$ echo "local.result" | terraform console
[
  "Grape",
]
```
# まとめ
このページでは重複したデータのみ、あるいは重複していないデータのみを保存する方法をまとめました。
この記法を利用すると例えばGoogleCloudでのCustomRole作成時にある特定のPermissionは確実に除外するようことが可能になります。ガバナンスを効かせたい場合などにうまく活用可能です。
```hcl
# custom_roleモジュール側でxx.xx.setIamPolicyを除外するように設定
module "foo_custom_role"{
  source      = "../modules/project/iam/custom_role"
  name        = "foo_custom_role"
  permissions = ["xx.xx.get","xx.xx.setIamPolicy"]
}
```
Terraformでは事前に提供される便利な関数が複数存在するため、うまく活用して管理しやすいコードを作っていきましょう！
web技術の基本

# はじめに
本記事は、自己学習のための記事であり、誤った情報の恐れがあることをご了承ください。

# 参考文献
[プロになるためのweb技術入門　なぜ,あなたはwebシステムを開発できないのか](https://www.amazon.co.jp/「プロになるためのWeb技術入門」-――なぜ、あなたはWebシステムを開発できないのか-小森-裕介/dp/4774142352)

## リクエスト
リクエストとは、『要求』や『要望』という意味で使われる。ITでは、データの送信や処理を要求するという意味で使われている。

## レスポンス
レスポンスとは、『返答』や『返信』という意味で使われる。ITではリクエストの反対で、リクエストに対する返信や応答を指す。

## ステートフル
ステートフル(statefull)のステート(state)は『状態』や『状況』を意味する言葉である。
フル(full)は『〜を満ちた』という意味を持っている。ここから転じてITでは、情報を保持して、その後の処理結果に反映させるプロトコルやアプリケーションを指す。

## ステートレス
ステートレス(statefull)のステート(state)は『状態』や『状況』を意味する言葉である。
レスとは『不足している』、『乏しい』という意味をもっている。ITでは、前後の状況に関係なく、いつも同じレスポンスを返すプロトコルです。

## クッキー
クッキーとは、webサイトに訪問したユーザーの情報を一時的に保存する仕組みです。IDやパスワード、訪問回数などを情報として保存される。そのため、再訪問したときなどにはIDやパスワードを入力する手間が省けるメリットがある。ただし、セキュリティ度は低いので情報を悪用されるリスクがある。

## プロトコル
プロトコルとは、通信を行う上でのルールのようなもの。インターネット上では様々なコンピューターがあり、ルールを決めとかないと情報の伝達ができない。様々なプロトコル(ルール)があるが、HTTPプロトコルは、webブラウザがサーバーと通信するときに使われるプロトコル(ルール)。

## ポート番号
ポート番号とは、コンピュータで通信される出入口の番号みたいなものです。
URLやIPアドレスが住所だとすると、その家の玄関がポートで、その家の玄関に割り当てられてる番号がポート番号になります。
ポート番号のうち、特定のプロトコルで使用するように決められているものがあり、それを、ウェルノウンポートと呼びます。
代表的なものは次の通りです。
 | ポート番号 | プロトコル |
|:-:|:-:|
|  20,21 |  FTP(ファイル転送) |
|  22 |  SSH(暗号化されたリモートコンピュータとの汎用通信) |
|  23 | Telnet(リモートコンピュータとの汎用通信)  |
|  25 |  SMTP(メール送信) |
|  53 |  DNS(ホスト名解決) |
|  80 |  HTTP(Webブラウジング) |
|  110 |  POP3(メール受信) |
|  443 |  HTTPS(暗号化されたHTTP) |
Discordのボットが指定した時間に動かない時の仮説

# はじめに
経験が浅いので、参考程度にご覧ください。

Discordのボットを運用しています。
指定した時間に指定したコメントが送られるようになっていたのですが、
ボットがオンラインになっていたにも関わらず、指定した時間にコメントが送られませんでした。
今回はその原因を探っていきます。

一定時間に一回時間を取得する方法などは、他の方の記事をご参照ください。

# /var/log/syslogを見てみる
直前にセッションが再開されていました。
```
Sep 01 07:59:25 ~ discord.gateway: Shard ID None has successfully RESUMED session hogehogefugafuga
```
セッションは正常に再開されたのですが、この処理をしていたので8:00の時間にコメントを送ってくれなかったのかなと思っています。

# /etc/crontabでpkillを設定
crontabの詳しい設定の仕方は他の方の記事をご参照ください。
今回は私が行った設定だけご紹介します。
```
57 7 * * * root sudo pkill -f hogefuga
```

# 他の設定
ボットはサーバーの起動と同時にデーモンで動かしています。
デーモンの詳細な動かし方は他の方の記事をご参照ください。
ここでは私が動かしているボットの設定を見ていきます。

/etc/systemd/system/hoge.service
```
[Unit]
Description=hoge
After=hoge fuga piyo

[Service]
ExecStart=hoge
Restart=always

[Install]
WantedBy=hoge
```

「Restart=always」になっていますね。

この設定にすると、デーモンが動かなくなった時にも自動で再起動してくれるようになります。
あまり綺麗なやり方だとは思いませんが、今回はセッションを任意のタイミングで再開させるために、
一度pkillでプロセスを終了してこの設定で再開させています。

「Restart=always」は、他のことが原因で動かなくなった時にもリスタートしてくれるので今のところ便利だと思って使っています。

# 終わりに
正直、あまり綺麗なやり方だとは思っていませんが、
セッションを任意のタイミングで再開する方法が分からなかったため、
こういった強引な方法を取りました。
このやり方の危険性や「もっとこうした方がいいよ」というのがあれば、ぜひ教えていただきたいです。

おしまい。
Jetpack composeでBasicTextFieldを使う時に気をつけること

# はじめに
今回は`Jetpack compose`で`BasicTextField`を使っていて自分がハマってしまった問題を紹介していこうと思います
### 本文
まず、今回自分がハマってしまった問題というのは`BasicTextField`を使っているときに入力した後に入力内容をBSで削除していき再度入力した際に下記のエラーによりクラッシュしてしまうというものでした。
```
java.lang.IllegalStateException: LayoutCoordinate operations are only valid when isAttached is true
```
原因の部分は下記になります
```kotlin
decorationBox = { innerTextField ->
            if (text.isEmpty()) {
                Text(text = placeholderText, color = Theme.colors.gray500)
            } else {
                innerTextField()
        }
```
原因としては`innerTextField`を表示しないタイミングがあることでした
`innerTextField`は一回は必ず呼ばれなければならない上に一回のみ呼び出すことが可能になっています
それを入力が空の時にif文で表示しないようにしてしまっていたのが問題でした。
なので、コードを下記のようにすることでエラーが解消されました
```kotlin
decorationBox = { innerTextField ->
            Row(
                horizontalArrangement = Arrangement.End
            ) {
                innerTextField()
                if (text.isEmpty()) {
                    Text(text = placeholderText, color = Theme.colors.gray500, textAlign = placeholderTextAlign)
                }
        }
```
### 最後に
今回は自分が実装していてハマってしまった部分を紹介していきました
普段は`placeholder`に渡しているので備忘録として残しておきたいと思います
どなたかのお役に立てれば幸いです
GitのSSHキーを指定する方法

# はじめに

私の利用しているWindows環境では、なぜかごく稀にGitHubで使うSSHキーが上手く読み込めなくなることがありますが、この時に利用するSSHキーを強制的に指定することで問題を回避できました。（※これはWindows環境固有の問題なのかもしれませんが...）

そこで、この時の対応手順を備忘録として記事にまとめてみました。

# 手順

## 公開鍵の登録状況の確認

* GitHubにログインして、[Settings] > [SSH and GPG keys] と進み、[SSH keys]の欄に公開鍵が登録されていることを確認します。
 * もし公開鍵が存在しなければ、正しい公開鍵をアップするだけで問題が解決するかもしれません。
* この時、手元にある公開鍵の指紋（fingerprint）を確認するには、以下のコマンドを使います。

```dosbatch:
ssh-keygen -lf {鍵ファイルのパス}
```

## 秘密鍵の保管場所を確認する

* OpenSSHを利用している場合、以下の`.ssh`フォルダに秘密鍵が保管されていることを確認します。
  * ここでは秘密鍵のファイル名を「id_rsa」とします。

> C:\Users\{ユーザー名}\.ssh

## configファイルの作成

* 上記の`.ssh`フォルダ内に、`config`という名前のファイルを作成します。

> C:\Users\{ユーザー名}\.ssh\config

* この`config`ファイル内に、以下のように秘密鍵のパスを指定します。

```text:config
host github.com
 hostname github.com
 identityfile C:\Users\{ユーザー名}\.ssh\id_rsa
 user {GitHubのユーザー名}
```

# 参考URL

* [SSH公開鍵の「指紋」を確認する方法【SHA-256・MD5】](https://linuxfan.info/ssh-pubkey-fingerprint)
* [Gitに特定のSSH Keyを読ませる方法](https://monomonotech.jp/kurage/memo/m210825_git_ssh_certification/.html)
* [[GitHub] SSH認証カギを設定する](https://kinoshita-hidetoshi.github.io/Programing-Items/Etc/Github/How%20to%20use%20SSH%20key.html)
AWS EC2 (Ubuntu22.04) 内で sysctl 設定値を更新する方法

## やりたいこと

```
Docker コンテナ (Ubuntu 22.04)
EC2 (Ubuntu 22.04)
```

以上の構成において、Dockerコンテナ内の sysctl の値として `kernel.perf_event_paranoid=-1` を設定したい。

色々試した方法を結果をメモる。


## 前提知識

カーネルパラメータはホストマシンとDockerコンテナで共通の設定になっている。([ref](https://zenn.dev/bilzard/scraps/f08341e853cc99)) 

## 方法


### ⭕️ EC2ホスト上で `/etc/sysctl.conf`を書き換え、rebootする

```sh
sudo /bin/su -c "echo 'kernel.perf_event_paranoid = -1' >> /etc/sysctl.conf"
sudo reboot # sudoをつけないと失敗した
```

reboot後、EC2内およびコンテナ内で更新されたことを確認

```sh
sysctl -a | grep perf_event_paranoid
#> kernel.perf_event_paranoid = -1 # 成功
```

### ⭕️ EC2ホスト上で `/etc/sysctl.conf`を書き換え、ホスト上で `sysctl -p` する。

```sh
sudo /bin/su -c "echo 'kernel.perf_event_paranoid = -1' >> /etc/sysctl.conf"
sudo sysctl -p # sudoをつけないと失敗した

# 確認
sysctl -a | grep perf_event_paranoid
#> kernel.perf_event_paranoid = -1 # 成功
```

なお、sudoをつけないと失敗した。

### ❌ Dockerコンテナのrun時の引数に `--sysctl=kernel.perf_event_paranoid=-1`を指定する

```sh
sudo docker run -it --privileged --sysctl=kernel.perf_event_paranoid=-1 <image> /bin/bash

Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Error: sysctl 'kernel.perf_event_paranoid' is not allowed # 失敗
```

### ❓ Dockerコンテナ内で、`/etc/sysctl.conf`を書き換え、rebootする

試してない

### ⭕️ Dockerコンテナ内で `/etc/sysctl.conf`を書き換え、`sysctl -p` する。

```sh
# sudoをつけないと失敗した
sudo docker run -it --privileged --sysctl=kernel.perf_event_paranoid=-1 <image> /bin/bash

# コンテナ内で
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
echo 'kernel.perf_event_paranoid = -1' >> /etc/sysctl.conf
sysctl -p # sudoをつけなくても成功した
```
Kubernetesダッシュボードのデプロイ手順

# Kubernetesダッシュボードのデプロイ手順

1. **使用するコンテキストを設定**:
```bash
kubectl config use-context docker-desktop
```

2. **ダッシュボードのデプロイ**:
```bash
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml
```

3. **ServiceAccount、ClusterRoleBinding、そしてSecretを作成**:
   - 以下の内容を `create_service_account.yaml` というファイルに保存します。
```yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: v1
kind: Secret
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
  annotations:
    kubernetes.io/service-account.name: "admin-user"
type: kubernetes.io/service-account-token
```

   - 作成したYAMLファイルを適用します。
```bash
kubectl apply -f create_service_account.yaml
```

4. **ServiceAccountのトークンを取得**:
```bash
kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d
```
   このコマンドは、ログインに必要なBearerトークンを出力します。

5. **kubectlプロキシを起動**:
```bash
kubectl proxy
```

6. **ブラウザでKubernetesダッシュボードにアクセス**:
   - 以下のURLにアクセスします。  
     [http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login](http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login)
   
   - 出力されたBearerトークンを「トークン」フィールドに入力して、ダッシュボードにログインします。

---

上記手順に従って、Kubernetesダッシュボードをデプロイし、ログインすることができます。

参照: https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md
[macOS]NSColorをUserDefaultsに保存する

# NSColorをUserdefautsに保存する

NSColorPanelで選択された色を保存するためにUserDefaultsを使って保存しようとしたところ
わざわざ、選択された色のRGBとAlphaの値をそれぞれ取得して配列にして保存していたが
もっと簡単な方法があったのでメモ。
参考にしたサイトは以下。

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/DrawColor/Tasks/StoringNSColorInDefaults.html

ただ情報が古いので、適宜読みかえ。

# コード例
```swift:example.swift
import Cocoa

let keyString = "color"
let color = NSColor.red
let colorData = try NSKeyedArchiver.archivedData(withRootObject: color, requiringSecureCoding: false)
let data = NSData(data: colorData)
UserDefaults.standard.set(data, forKey: keyString)


var aColor : NSColor?
var theData = UserDefaults.standard.data(forKey: keyString)
if let data = theData {
    aColor = try! NSKeyedUnarchiver.unarchivedObject(ofClass: NSColor.self, from: data)!
}

```
Nextjs API RoutesをFirebaseでデプロイしたがうまくいかなかった

# はじめに

Nextjsで作ったアプリにメール問い合わせの機能を追加したところつまづきネットにわかりやすくまとまった情報がなかったので自分なりにまとめます

# 問題

Nextjs13で以下のようなAPIを作成しました

```ts:app/api/contact/routes.ts
import { NextRequest, NextResponse } from "next/server";
import nodemailer from "nodemailer";

const corsHeaders = {
  "Access-Control-Allow-Origin": "*",
  "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
  "Access-Control-Allow-Headers": "*",
};

export async function OPTIONS() {
  return NextResponse.json({}, { headers: corsHeaders });
}

export async function POST(req: NextRequest) {
  const body = await req.json();

  const transporter = nodemailer.createTransport({
    host: "smtp.gmail.com",
    port: 587,
    auth: {
      user: process.env.GMAILUSER,
      pass: process.env.GMAILPASSWORD,
    },
  });

  const toHostMailData = {
    from: body.email,
    to: "himaria.jin.watanabe@gmail.com",
    subject: `【お問い合わせ】${body.name}様からのお問い合わせ`,
    text: `${body.message}`,
    html: `
      <p>お問い合わせ内容</p>
      <p>お名前：${body.name}</p>
      <p>メールアドレス：${body.email}</p>
      <p>お問い合わせ内容：${body.content}</p>
      `,
  };

  await transporter.sendMail(toHostMailData);
  return NextResponse.json(
    { message: "success" },
    { status: 200, headers: corsHeaders }
  );
}
```

これをローカルから叩くとうまくいくことが確認できるのですが、なぜか`firebase deploy`をしたものに対して叩くとうまくいきません

```
$ curl -x POST 'http://localhost:3000/api/contact -d .... -> OK
$ curl -x POST 'httsp://deploy-origin/api/contact -d .... -> NG
```

ローカルと挙動が異なっているので謎に感じました

# 解決方法？

APIを利用するには、それ用の設定をするとできるようです

https://qiita.com/takaken/items/8ed671486de804696079

>cloud Funtionsのエントリーポイントとなるファンクションで、リクエストをNext.jsアプリに渡すようにしています

うまいことルーティングするとできるらしいのですが、私には再現できず、、、

また`cloud functions`にデプロイされている`SSRサーバー`に対してもアクセスを試みましたがうまくいきませんでした、、、

わかる方は教えてほしいです

# 解決方法

ということで、APIは別に作成することに来ました
`cloud functions for firebase`を利用して別プロジェクトとして作成した関数をデプロイして解決しました

これは以下の記事でハンズオンとして紹介しています

https://zenn.dev/jinwatanabe/articles/72aad0cfefbd22

# おわりに

Nextjs慣れてきたかなと思いますが、地味に躓くことが多くてReactよりも考えることが多いなぁといった印象です。。

# 参考

https://qiita.com/takaken/items/8ed671486de804696079
Juliaで学ぶプログラミング コマンドを学ぶ（REPL補完）〜OhMyREPL〜

# OhMyREPLを使う

OhMyREPL.jl は Julia の REPL (Read-Evaluate-Print Loop) を強化するためのパッケージです。このパッケージを利用することで、REPL の見た目や動作をカスタマイズして、より使いやすく、魅力的にすることができます。

## OhMyREPL.jl の主な機能

1. シンタックスハイライト: コードを入力するときに、シンタックスに基づいて色分けされるので、読みやすくなります。

1. 括弧のハイライト: 対応する括弧のペアがハイライトされ、これによりコードのネストがわかりやすくなります。

1. オートコンプリートの改善: Julia の REPL のオートコンプリート機能を拡張して、より洗練されたものにします。

1. プロンプトのカスタマイズ: REPLのプロンプトを自分の好みに合わせてカスタマイズすることができます。

1. エラーメッセージの改善: エラーメッセージが見やすく、情報量が多い形式で表示されるようになります。

1. レインボーブラケット: これは特にネストされたコードで役立ちます。異なるレベルの括弧が異なる色でハイライトされるため、どの括弧がどの括弧とペアになっているのかが一目でわかります。

### 導入方法

``` julia
# ]でpkgモードへ
(@v1.9) pkg> add OhMyREPL

# delでコマンドモードへ
julia> using OhMyREPL

```

### 利用例

#### OhMyREPLを利用した場合の表示
![スクリーンショット 2023-09-17 11.49.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30363/f3107c12-b16a-2c6f-30a7-b92cb27fdd77.png)

見やすくなるなど便利です。

https://kristofferc.github.io/OhMyREPL.jl/latest/
Cloud Functions(nodemailer)からレスポンスが返ってこずにタイムアウトする 

# はじめに

メール送信の機能をCloud Functionsにデプロイしたところつまづいたのでまとめます

# 問題

`nodemailer`を利用してメール送信の関数を作り、`cloud functions`にデプロイしました

しかし、メールは送信できているもののタイムアウトが発生してしましました
これは関数のテストでも同様のことが起きました

# 解決方法

`nodemailer`を利用しているのですが、最後に`res.send`をしていないためレスポンスを返していないのが原因でした

以下のようにしたところうまくいくようになりました

```ts
      return transporter.sendMail(toHostMailData, (error, info) => {
        if (error) {
          console.log(error);
          res.send("error");
        } else {
          console.log("Message sent: " + info.response);
          res.send("success");
        }
      });
    });
```

これはnodemailerでなくても起きると思うので確認すると良いかもしれません

# おわりに

実際にできるようになると簡単だなと思うのですが、じみにハマって時間がかかりました。これからはすばやく関数が作れそうです
for-in と enumerated メソッド・zip(_, _)を使用でスッキリしたコードに！


## 配列の繰り返し処理でインデックスを取得し、値を表示する方法
書式

```swift
for（ index,値を格納する変数 ） in 配列変数.enumerated()
```
● enumerated()とは
（ index,値を格納する変数 ）のシーケンスを返します。ここで、indexはゼロから始まる連続した整数を表し、値を格納する変数はシーケンスの要素を表します。
配列変数はArray型なので、Sequenceプロトコルに準拠しているため、for-in文で繰り返し処理をすることができます。

## 具体例(配列の各要素のインデックスと曜日を出力)
カレンダーのLabelに曜日を表示する処理の具体例で説明します。


● before
```swift
let weekdayLabels = ["月", "火", "水", "木", "金", "土", "日"]
self.calendar.calendarWeekdayView.weekdayLabels[0].text = "月"
self.calendar.calendarWeekdayView.weekdayLabels[1].text = "火"
self.calendar.calendarWeekdayView.weekdayLabels[2].text = "水"
self.calendar.calendarWeekdayView.weekdayLabels[3].text = "木"
self.calendar.calendarWeekdayView.weekdayLabels[4].text = "金"
self.calendar.calendarWeekdayView.weekdayLabels[5].text = "土"
self.calendar.calendarWeekdayView.weekdayLabels[6].text = "日"
// 月, 火, 水, 木, 金, 土, 日
```

● after
```swift
let weekdayLabels = ["月", "火", "水", "木", "金", "土", "日"]
for (index, label) in weekdayLabels.enumerated() {
    self.calendar.calendarWeekdayView.weekdayLabels[index].text = label
    print(label) // 月, 火, 水, 木, 金, 土, 日
}
```
このようにスッキリしたコードになりました！
weekdayLabelsのindexの取得と配列の表示が一度にfor-inで行うことができ、曜日を取得することができました！

## 注意点　enumerated()はindexを返さない
途中で要素を削除する際に注意してください！
enumerated()が返すものは配列のindexのように見えますが、実は単に0始まりのカウンターである。
途中で配列の要素を削除した場合エラーになる。
dropFirst()は先頭の要素を削除した部分配列を返すメソッドが実行されると、weekdaySub[0]は範囲外のindexにもかかわずweekdaySub[0]にアクセスしてしまうのでエラーになる。
["火", "水", "木", "金", "土", "日"]を返してしまう。

```swift
let weekday = ["月", "火", "水", "木", "金", "土", "日"]
let weekdaySub = weekday.dropFirst() // 火, 水, 木, 金, 土, 日
for (index, value) in weekdaySub.enumerated() {
    print(weekdaySub[index])//error
}
```
では途中で要素を削除した後indexを扱いたい場合はどうしたらよいのか？

```swift
let weekday = ["月", "火", "水", "木", "金", "土", "日"]
let weekdaySub = weekday.dropFirst()
for (index, value) in zip(weekdaySub.indices, weekdaySub) {
    print(weekdaySub[index])// 火, 水, 木, 金, 土, 日
}
```
indicesプロパティを使えばindex一覧をとれるので、zipでまとめれば、無事配列の要素削除後の曜日が出力されました。


## 最後に
出力される値は一緒だが、スッキリとしたコードに書き換えることができるのが、おもしろいと最近思い始めました！知らなかったコードの書き方を知っていくのは楽しいですね！
今後も知らなかったことや感動したこと等の記事を投稿していこうと思います！

## 参考文献
https://developer.apple.com/documentation/swift/array/enumerated()

https://swift.codelly.dev/guide/%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%9E%8B/Sequence%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB.html#foreach

https://kita-note.com/swift-array-forin-enumerated

https://zenn.dev/treastrain/articles/65f6cae11e0dc7#collection-%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E5%BE%97%E3%82%8B%E3%81%AB%E3%81%AF-enumerated()-%E3%81%A7%E3%82%82-zip(_%3A_%3A)-%E3%81%A7%E3%82%82%E3%81%AA%E3%81%8F-indexed()-%E3%82%92%E4%BD%BF%E3%81%86

https://qiita.com/0102_0102johnny/items/2d3e6255552cb18d0430

https://qiita.com/a-beco/items/0fcfa69cca20a0ba601c
firebase deployでProvided module can't be loaded. Did you list all required modules in the package.json dependencies?

# はじめに

Clolud Functions for Firebaseを利用していて初歩的すぎてまったく確認しておらず時間がかかってしまったところがあったのでまとめます

# 問題

```
$ firebase deploy
```

を実行したところ以下のエラーが出ました

```
functions: creating Node.js 18 (1st Gen) function sendNodeMail(us-central1)...
Function failed on loading user code. This is likely due to a bug in the user code. Error message: Provided module can't be loaded.
Did you list all required modules in the package.json dependencies?
Detailed stack trace: Error: Cannot find module 'nodemailer'
Require stack:
- /workspace/lib/index.js
- /layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/loader.js
- /layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/main.js
    at Module._resolveFilename (node:internal/modules/cjs/loader:1077:15)
    at Module._load (node:internal/modules/cjs/loader:922:27)
    at Module.require (node:internal/modules/cjs/loader:1143:19)
    at require (node:internal/modules/cjs/helpers:121:18)
    at Object.<anonymous> (/workspace/lib/index.js:5:20)
    at Module._compile (node:internal/modules/cjs/loader:1256:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
    at Module.load (node:internal/modules/cjs/loader:1119:32)
    at Module._load (node:internal/modules/cjs/loader:960:12)
    at Module.require (node:internal/modules/cjs/loader:1143:19)
Could not load the function, shutting down.. Please visit https://cloud.google.com/functions/docs/troubleshooting for in-depth troubleshooting documentation.
```

ここでは`nodemailer`を利用しているのですが、そこでエラーが出ます
先程`npm install`しているので依存には入っているはずなので謎でした

# 解決方法

<font color=red>package.jsonの依存に入ってませんでした</font>

```json:package.json

  "dependencies": {
    "firebase-admin": "^11.8.0",
    "firebase-functions": "^4.3.1"
  },
```

理由は謎ですが、何かのタイミングで戻してしまったのかもしれません
再度`npm istall`刷ることで解決しました

# おわりに
初歩的なミスすぎて恥ずかしいですが、記事としてくようしておきます
MacでPython3の環境構築

# はじめに

MacBookを新しく購入したので、Python3を学習しようと思いました。
インストールからPATHを通すまで備忘録としてまとめています。

## 開発環境

```
OS: macOS Monterey(バージョン 12.2.1)
チップ: Apple M1
```

## Python3のインストール

MacではデフォルトでPythonが入っています。

```zsh:terminal
% python -V
Python 2.7.18
```

Pythonの2系はサポートが終了しており、現在は3系が主流であると何かの記事で見ました。
ですので、Python3をインストールします。

**[Pythonの公式](https://www.python.org/downloads/macos/)**
上記公式サイトから今回は`Python 3.11.5`を選択します。
（2023.9月時点）

インストーラがダウンロードされたらダブルクリックして進め、インストールを完了させます。


## Python3のPATHを通す

`.zshrc`にPython3のパスを追加していきます。

```zsh:terminal
$ vi ~/.zshrc
```

```zsh:~/.zshrc
# ◯.△.□には、インストールしたpythonのversionを記述する
# export PYTHON_HOME="/Library/Frameworks/Python.framework/Version/◯.△.□/bin"
export PYTHON_HOME="/Library/Frameworks/Python.framework/Version/3.11.5/bin"
export PATH="$PYTHON_HOME:$PATH"

# pythonコマンドでpython3が起動するように
alias python='python3'
alias pip='pip3'
```

ターミナルを再起動させたら設定完了です！

## 動作確認

```zsh:terminal
% python -V
Python 3.11.5
```

```zsh:terminal
% python
Python 3.11.5 (v3.11.5:cce6ba91b3, Aug 24 2023, 10:50:31) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
```

お疲れ様でした！
【2023年9月版】vSphere/ESXi運用メモ

# はじめに

個人的にvSphere環境を運用する上で遭遇した問題への対応メモです

# ホストのCPUが100%にはりついている

## 状況

なんかわかんないけど、ホストのひとつが CPU 100%にはりついているぞ。。。

## ゴール

CPU 100%のプロセスをみつける

## 手順

SSHログインして `esxtop` コマンドで確かめる

`esxtop`

# `hostd` のCPU利用率が100%

## 状況

`esxtop` で確認したら `hostd` が CPU 100%以上になってる。。。

```
 2:31:40am up 3 days 15:37, 849 worlds, 1 VMs, 1 vCPUs; CPU load average: 1.33, 1.33, 1.33
PCPU USED(%): 171 157 108  88 NUMA: 131 AVG: 131
PCPU UTIL(%):  48  45  31  25 NUMA:  37 AVG:  37

         ID         GID NAME             NWLD   %USED    %RUN    %SYS   %WAIT %VMWAIT    %RDY   %IDLE  %OVRLP   %CSTP  %MLMTD  %SWPWT 
      22294       22294 hostd.527378       28  430.35  119.60    0.00 2642.72       -   34.29    0.00    1.25    0.00    0.00    0.00 
    3644445     3644445 vCLS-92fd6eae-f     8   73.07   20.35    0.00  777.39    0.80    1.29   98.92    0.14    0.00    0.00    0.00 
          1           1 system            444    8.84  255.65    0.07 43942.18       -  149.78    0.00    0.33    0.00    0.00    0.00 
    3693713     3693713 esxtop.958967       1    7.42    2.06    0.00   97.81       -    0.00    0.00    0.00    0.00    0.00    0.00 
```

## ゴール

とりあえず、CPU 100%の状態をやめさせる

## 手順

SSHログインして、 `/etc/init.d/hostd restart` で `hostd` を再起動する

```terminal
/etc/init.d/hostd restart
watchdog-hostd[950357]: Terminating watchdog process with PID 527315 526552
hostd stopped.
hostd started.
```

# さいごに

安定した継続運用は難しい
ubuntu上のDockerを使用してコンテナ内にsamba addcインストール方法

Dockerを使用してUbuntuコンテナ内にSamba Active Directory Domain Controller（Samba AD DC）をインストールする手順を以下に示します。

1. **Dockerのインストール**:
   もしまだDockerがインストールされていない場合、Ubuntuコンテナ内にDockerをインストールします。以下のコマンドを使用します：

   ```shell
   apt update
   apt install docker.io
   systemctl start docker
   systemctl enable docker
   ```

2. **Ubuntuコンテナの作成と起動**:
   Dockerコンテナ内にUbuntuを作成し、それを起動します。

   ```shell
   docker run -it --name ubuntu-samba ubuntu /bin/bash
   ```

3. **Ubuntuコンテナ内でのSamba AD DCのインストール**:
   Ubuntuコンテナ内でSambaをインストールし、Samba AD DCをセットアップします。

   ```shell
   apt update
   apt install -y samba
   samba-tool domain provision
   ```

   上記のコマンドを実行すると、Samba AD DCの設定ウィザードが開始され、必要な情報を入力するように求められます。適切な情報を提供して設定を進めてください。

4. **Samba AD DCのサービスを開始**:
   Samba AD DCのセットアップが完了したら、サービスを起動します。

   ```shell
   systemctl start smbd
   ```

5. **サービスの自動起動設定**:
   サーバーが再起動された際にSamba AD DCサービスが自動的に起動するように設定します。

   ```shell
   systemctl enable smbd
   ```

これで、Samba AD DCがUbuntuコンテナ内でセットアップされました。他のコンピュータをこのSambaドメインに参加させることができます。セキュリティに注意して設定を行い、必要に応じてファイアウォールルールを設定してください。

注意: これは単純化された手順であり、特定のネットワーク環境やセキュリティ要件に合わせて設定を調整する必要があります。公式Sambaドキュメンテーションを参照して詳細な情報を取得してください。
raspberry Pi で　samba addcインストール

Raspberry Piを使用してSamba Active Directory Domain Controller（Samba AD DC）をインストールするための手順を以下に示します。Raspberry PiにはRaspbian（またはRaspberry Pi OS）がインストールされていると仮定します。

1. **Raspberry Piのセットアップ**:
   - Raspberry Piをセットアップし、Raspbianをインストールしてください。
   - SSHを有効にし、必要に応じてネットワーク設定を構成します。

2. **必要なパッケージをアップデート**:
   ```shell
   sudo apt-get update
   sudo apt-get upgrade
   ```

3. **Sambaをインストール**:
   Sambaをインストールします。以下のコマンドを実行します。
   ```shell
   sudo apt-get install samba
   ```

4. **Samba AD DCのインストール**:
   Samba AD DCをインストールします。以下のコマンドを実行します。これにより、Samba AD DCの設定ウィザードが開始されます。
   ```shell
   sudo samba-tool domain provision
   ```
   ウィザードの指示に従って、ドメイン名、レルム、および管理者パスワードなどを設定します。

5. **Samba AD DCのサービスを開始**:
   インストールと設定が完了したら、Samba AD DCサービスを開始します。
   ```shell
   sudo systemctl start smbd
   ```

6. **起動時に自動的にサービスを開始**:
   システム起動時にSamba AD DCサービスが自動的に開始されるように設定します。
   ```shell
   sudo systemctl enable smbd
   ```

7. **Samba AD DCの状態を確認**:
   サービスが正常に実行されているか確認します。
   ```shell
   sudo systemctl status smbd
   ```
結果
```shell
● smbd.service - Samba SMB Daemon
     Loaded: loaded (/lib/systemd/system/smbd.service; enabled; vendor preset: >
     Active: active (running) since Sun 2023-09-17 16:52:11 JST; 18min ago
       Docs: man:smbd(8)
             man:samba(7)
             man:smb.conf(5)
   Main PID: 7035 (smbd)
     Status: "smbd: ready to serve connections..."
      Tasks: 4 (limit: 3933)
        CPU: 264ms
     CGroup: /system.slice/smbd.service
             ├─7035 /usr/sbin/smbd --foreground --no-process-group
             ├─7037 /usr/sbin/smbd --foreground --no-process-group
             ├─7038 /usr/sbin/smbd --foreground --no-process-group
             └─7039 /usr/sbin/smbd --foreground --no-process-group

 9月 17 16:52:10 raspberrypi systemd[1]: Starting Samba SMB Daemon...
 9月 17 16:52:11 raspberrypi systemd[1]: Started Samba SMB Daemon.
```

これで、Raspberry Pi上にSamba AD DCがセットアップされました。他のコンピュータをこのSambaドメインに参加させることができます。セキュリティに注意して設定を行い、必要に応じてファイアウォールルールを設定してください。

注意: これは単純化された手順であり、特定のネットワーク環境やセキュリティ要件に合わせて設定を調整する必要があります。公式Sambaドキュメンテーションを参照して詳細な情報を取得してください。

Samba Active Directory Domain Controller（Samba AD DC）をセットアップする際のドメイン名の例を示します。実際の環境に合わせてカスタマイズしてください。

1. **ドメイン名 (SAMBA_DOMAIN)**: ドメイン名は一意である必要があります。一般的な例として、"example.com" や "mydomain.net" などが考えられます。通常、ローカルネットワーク内で使用されるため、一般的なインターネット上のドメイン名とは異なります。
コンテナの設定では、dev.example.comにした

2. **レルム (SAMBA_REALM)**: レルムは大文字で指定することが一般的で、ドメイン名と同じものを使用します。例えば、"EXAMPLE.COM" もしくは "MYDOMAIN.NET" などです。
コンテナの設定では、DEV.EXAMPLE.COMにした

3. **管理者パスワード (SAMBA_ADMINPASS)**: 管理者パスワードはセキュアなものを選択してください。複雑なパスワードを使用し、定期的に変更することをお勧めします。

Server Role (dc, member, standalone) [dc]:　←そのままEnter

DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]:　←そのままEnter

DNS forwarder IP address (write 'none' to disable forwarding) [8.8.8.8]: ←192.168.2.1

実際の設定では、これらの値を環境に合わせて選択し、セキュリティに注意して設定してください。ドメイン名とレルムは他のコンピュータがドメインに参加する際に必要な情報ですので、選択肢を検討し、設定を行ってください。
ABC320回答メモ

0.はじめに
　今回もなかなか歯ごたえのある問題でしたが何とかCまでは解けました。
　Dは安定のTLE解消できず時間切れ。
　歯ごたえがある問題だったためか、Cまで正解でも順位は4010位と
　なかなかよく、レートも+17と久々にプラスでした。

1.A - Leyland Number
　単純な計算問題で、さらっとジャスト1分でとけました。

　https://atcoder.jp/contests/abc320/submissions/45580922

2.B - Longest Palindrome
　最初、愚直にやるとTLEでは！？と悩んでしまい
　時間がかかりました。
　最終的には、愚直に1文字目から全組み合わせで回文を
　探して、回文となるパターンの文字数のうち最大なものを
　保持していく形でACとなりました。

　https://atcoder.jp/contests/abc320/submissions/45611973

3.C - Slot Strategy 2 (Easy)
　これもてこずりました。
　最終的に、０～９のそれぞれをそろえる場合で
　1.2.3の順で押す場合と、1.3.2の順で押す場合と・・・
　～3.2.1で押す場合の6パターンで、揃えるのに何秒かかるかを
　求め、その中で一番秒数が少ないものを回答として出力しました。

　実装後テスト中に、リールを3回まわ巣前提でないとだめだなと
　気づいて調整したりして、なんとかACとなりました。

　これはスマートな解き方あるやろな・・・と思いましたが
　大体同じような感じ・・・の解説が書いてありました。

　https://atcoder.jp/contests/abc320/submissions/45635508

4.D - Relative Position
　こちらは時間内にはTLEを解消できず、あとで解説を見ながら解きました。
　各頂点がつながる辺(M個のヒントにある組み合わせ)のリストと
　辺ごとの距離リストを別に持っていたのですが
　これを一つに持つことで、早くなるようです。
　考え方として覚えておけば今後役に立ちそうです。

　https://atcoder.jp/contests/abc320/submissions/45656353


以上
メンテが終ったソフトウエアを使うリスク

FreeBSD/mipsは14リリースで消されますが、13は使い物にならなかったので12が最終リリースです。

もうすぐ12-Stableのメンテも終わります。

12を使い続けるリスクを考えます。

まずインターネットと通信をしていない、また内部ネットワークは不特定多数が使用しないのであれば、まったくリスクはありません。

たとえば、自宅内のNTP ST1サーバで使っているntpdに脆弱性が見つかっても、影響がある可能性は皆無と思われます。

インターネットと接続しているのは、FierWallだけでこれの脆弱性は考える必要があるかもしれません。

Firewallの最低限の機能はNATとDNSです。DNSもISP側のものをそのまま使えばNATだけでも機能します。

脆弱性よる影響は

DOS攻撃
乗っ取り

などありますが、外に対しサービスを行っていないのであれば乗っ取りの脆弱性が発生する可能性はナインシックスくらい無いと思われます。

一般自宅をDOS攻撃するのもあまり現実的はないので、ほぼぼないでしょう。

脆弱性の発生は

OSレベル
ユーザーランドのプログラム

で発生します。OSレベルもほぼほぼ無いと思われますし、過去に大きな問題を起こしたOpenSSLも致命的になるようなケースは発生しないでしょう。

OSレベルの攻撃は以前仕事の客先で、某OSのTCPスタックのバグをつかれ、サーバーが再起動した事がありました。

そもそもOpenSSLを使うirssiはNetBSDに移行したのでFreeBSD 12ベースでOpenSSLを利用しているサーバはありません。

もし万が一、致命的な問題が発生した時は、その機能を捨てるのが現実的な選択でしょう。

またどうしても必要な場合はメンテが続いているNetBSDに移すのがよいかもしれません。

必要最小限の機能で運用していれば、脆弱性のリスクも減ります。

機能を追加する事で利便性が向上すると、リスクも大きくなります。
javascript(isArray)エラーについて


PowerShellによりAzureADにログインする際、javascript(isArray)エラーの発生した場合、解決策を紹介します。

# javascript(isArray)エラーの発生可能な原因
ユーザーのサインインに Internet Explorer の WebBrowser というコンポーネントが利用されており、かつ、"互換モード" と呼ばれるモードで動作していることに起因している可能性がございます。

# Internet Explorer の "互換モード" ？
Internet Explorer の "互換モード" は、Internet Explorer 7 もしくは 5 相当で html や CSS、JavaScript を解釈しようとします。

# エラーの発生の推測
エラーの発生しております``` isArray ```につきましては "互換モード" では対応していないためにエラーが発生しているものと推測しております。


# エラー解決策
本レジストリ値を設定することにより、"互換モード" ではなく Internet Explorer 11 既定のモードで動作するようになり、事象が改善する可能性がございます。

キー : HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
名前 : PowerShell.exe
種類 : REG_DWORD
値 : 11000 もしくは 11001 (いずれも 10 進数)

また、もし上記のレジストリ値では効果がない場合、下記のレジストリ値への登録もお試す。

キー : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
名前 : PowerShell.exe
種類 : REG_DWORD
値 : 11000 もしくは 11001 (いずれも 10 進数)

64 ビット OS 環境の場合は下記もご設定。
キー : HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION
名前 : PowerShell.exe
種類 : REG_DWORD
値 : 11000 もしくは 11001 (いずれも 10 進数)

Array.isArray()

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
molecule init roleが実行できない

# 概要
Ansible Moleculeを勉強しようとして、最初からつまずいてしまった際の初心者メモ

# 詳細
様々な野良資料で下記の「molecule init role」を実行するといった記述を見かけるが、「role」というサブサブオプションの指定ができなかった。
```
$ molecule init role --driver-name docker --role-name rolehoge
Usage: molecule init [OPTIONS] COMMAND [ARGS]...
Try 'molecule init --help' for help.

Error: No such command 'role'.
```

自分が使っているバージョンは下記の通り
```
$ molecule --version
molecule 6.0.2 using python 3.10 
    ansible:2.15.2
    default:6.0.2 from molecule
```

最新(6系)の公式資料のGetting Started With Moleculesを見てみると、ansible-galaxyコマンドであるが、
- https://ansible.readthedocs.io/projects/molecule/getting-started/

v.5.1.0を見てみると「molecule init role」で作成する手順となっている
- https://github.com/ansible/molecule/blob/v5.1.0/docs/getting-started.md

下記のPRで内容がアップっデートされていることがわかった。
https://github.com/ansible/molecule/pull/3959

上記PRの概要に下記の記載があり、ansible-galaxyコマンドで「molecule init role」がカバーされているとのこと
```
Removed 'init role' command due to already being covered by ansible-galaxy
```

また、Moleculeの公式ドキュメントにもそのような旨のコメントが記載されていました。
- https://ansible.readthedocs.io/projects/molecule/next/
```
molecule init command is now only available to create a scenario using molecule init scenario. Users will no longer be able to create a role. Instead, users can make use of ansible-galaxy to create a collection or role.
```

ということで今後は、ansible-galaxyコマンドで作成する必要がある。
```
$ ansible-galaxy role init my_role
```
Unity LevelPlayをiOS環境に実装をした時にめっちゃハマったこと

どうも、ゲームクリエイターのGAIです。

作ったゲームSOINSUが多少バズリ、Unityの中の人から広告見直した方がいいっすよ！ってきたので、サポートしてくれるとのことなのでせっかくだから実装してみたのだが

いやー、マジできついっす（）

というわけで、ハマったことをたくさん残して、ビルドするときの注意点を備忘録で残しておきます。

# UnityLevelplay
Unityのメディエーションがあまりに使いづらくて、IronSource製のメディエーションを公式にしてしまえ！をガチでやってしまった結果公式になった。

# 実装方法ガイド
https://developers.is.com/ironsource-mobile/unity/levelplay-starter-kit/
ここがUnityスタートガイド。

ちなみにIronsourceの登録はこれ
https://www.is.com/ja/
ある程度日本語対応してるが、管理画面は英語。
とにかくいつもの収益だの振込先だの税だのの登録がはちゃめちゃにめんどくさいのでコーヒーでも飲みながら余裕を持って登録する。
最初のメディエーションはIronSource、UnityAds、googleAdmobの３種類で十分だそうだ。

ちなみに、先に言っておくと、コード実装面からするとかなり楽。
実装確認が実機でしかできないところはネックではあるが、まあPCからのAPIに対応する管理側のデメリットもあるから良しとしよう。


## SDKを入れる
スタートガイドに沿ってSDKを入れる。
だが、注意してほしいのはiOSビルドをする場合はcocoapodsを使うようなので、一応Rubyを最新にアップデートしておく。
影響してるのかどうなのかは最後までわからなかったが、とにかくデメリットしかないので最新にしておけ。

参考にしたyoutube動画
https://youtu.be/nrh-1wmFedw?si=x_6-J8005IMr2bkI
これの7分くらいから。
android実装だがある程度参考になる。
当然ながらwindowsPCでやるとiOS対応はできない。（ちょっとハマった）
windowsで作ってxcodeプロジェクトをビルドしてからmacに移している人は注意。

## なんやかんや
実装面は動画通りにやれば大丈夫。

iOSResolverの設定はこちら
![スクリーンショット 2023-09-17 10.00.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2383829/131dc3e8-a3b3-6fc8-c1a3-4617927f572b.png)

xcode出力自体は多分できる。
問題はxcodeでのビルドだ・・・・

## xCodeビルド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2383829/24d18d13-4df6-ba52-cd42-2da302235a50.png)

ほんときつかったのがこれ。
'IronSource/IronSource.h' file not found

結論から言うと、かなり力技で直った。

これが出ないですんなり通った人はよかったね！

解決方法は
1.ターミナルを開く
2.cd (xcodeプロジェクトフォルダ)　で移動
3. pod install　を叩いてcocoapodsを手動インストール

以上。
どうやら、Unity側のSDKでcocoapodsをインストールできていなかったようです。
はちゃめちゃが押し寄せてきてる。

んで、あとはadmob用の設定が入ってないとか怒られるので
info.plistに
~~~
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-3940256099942544~1458002511</string>
~~~
を追加

最後に
TARGETのUnity-iPhone、Unity Frameworkの
BuildSetting → Build Option → Enable BitcodeをNoにする

これでようやくビルドが通って実機確認できた。

丸二日使ってようやく解決。
UnityLevelPlayの日本語解説がほぼなく、英語でも同じ現象が起きてる記述は数が少なく、解決までかなり試行錯誤してしまった。

と言うわけで、UnityLevelPlayの実装メモでした。
RHELでリリースを固定する・固定を解除する

## 概要

開発したアプリケーションの動作を保証するバージョンが決まっている、使用するパッケージを特定のバージョンにしたいなどの理由で、OSのバージョン（RHELではリリースと書かれている）を上げたくない場合があります。

そのような場合は、OSのリリースを固定化することができます。

本記事ではRHELでOSのリリースを固定化する方法と、固定化を解除する方法について述べます。

## 利用可能なリリース・当記事で行う操作について

2023年9月の時点では、以下のリリースが利用可能です。

* 9
* 9.0
* 9.1
* 9.2

当記事では、9.1のマシンを使用して以下の操作を行います。

* リリースの固定化・固定化解除に必要な情報の確認
* 9.1にリリースを固定化する
* 9.1に固定したリリースの固定化を解除する

## 操作

### 現在のリリースの確認

/etc/redhat-releaseを参照します。

```bash
$ cat /etc/redhat-release
Red Hat Enterprise Linux release 9.1 (Plow)
```

### 最新のリポジトリをチェックする

最新のリポジトリを`dnf check-upgrade`で確認すると、9.2のパッケージが使われることがわかります。
このまま`dnf upgrade`を行うと、リリースが9.1から9.2になってしまいます。

```bash
# dnf check-upgrade
サブスクリプション管理リポジトリーを更新しています。
メタデータの期限切れの最終確認: 0:01:43 時間前の 2023年09月15日 21時58分50秒 に実施しました。

NetworkManager.x86_64                            1:1.42.2-8.el9_2                      rhel-9-for-x86_64-baseos-rpms
NetworkManager-config-server.noarch              1:1.42.2-8.el9_2                      rhel-9-for-x86_64-baseos-rpms

（以下、略）
```

### 利用可能なリリースを確認する

利用可能なリリースを確認します。

```bash
# subscription-manager release --list
+-------------------------------------------+
          利用可能なリリース
+-------------------------------------------+
9
9.0
9.1
9.2
```

### 現在のリリースを確認する

OSに設定されている現在のリリースを確認します。

```bash
# subscription-manager release --show
リリースは設定されていません
```

リリースが設定されていないので、もしこのまま`dnf upgrade`をしたときに利用可能なリリースのマイナーバージョンが上がっていたら、操作しているマシンのリリースが上がっていくことになります。

### リリースを固定する

リリースを固定するには、`subscription-manager release --set`コマンドを実行します。
今回は9.1に固定します。

```bash
# subscription-manager release --set 9.1
リリースは次のように設定されています: 9.1
```

これでリリースの固定ができました。

なお、改めてリリースの確認を行うと、リリースの設定がなされていることが表示されます。

```
# subscription-manager release --show
リリース: 9.1
```

### リリース固定後のリポジトリ確認

リリースを固定化した後のリポジトリの確認を行います。

```bash
# dnf check-upgrade
サブスクリプション管理リポジトリーを更新しています。
Red Hat Enterprise Linux 9 for x86_64 - BaseOS (RPMs)                                   2.8 kB/s | 4.1 kB     00:01
Red Hat Enterprise Linux 9 for x86_64 - AppStream (RPMs)                                 15 kB/s | 4.5 kB     00:00
メタデータの期限切れの最終確認: 0:00:01 時間前の 2023年09月17日 08時07分33秒 に実施しました。
```

9.2が利用できる状況でリリースを9.1に固定したら、アップグレードで利用できるパッケージが表示されなくなりました。

`dnf upgrade`も確認してみます。

```bash
]# dnf upgrade
サブスクリプション管理リポジトリーを更新しています。
メタデータの期限切れの最終確認: 0:02:39 時間前の 2023年09月17日 08時10分44秒 に実施しました。
依存関係が解決しました。
行うべきことはありません。
完了しました!
```

パッケージのアップグレードがされなくなっていることが改めて確認できました。

### リリースの固定を解除する

リリースを固定した後で固定を解除したい場合は、以下のコマンドを実行します。

```bash
# subscription-manager release --unset
リリースの詳細設定は解除されました
```

現在のリリースの確認を行って、リリースが設定されていないことが確認できました。

```bash
# subscription-manager release --show
リリースは設定されていません
```