OmniAICreator/Qiita-1.07M huggingface dataset:
【ChatGPT＋DALL-E3】編集機能で遊んでみた。


　どうも、カーブミラーです。

　今回は、DALL-E3の編集機能を使って、遊んでみました。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はあります。　あしからず。
:::

　昨日（2024/04/02）お伝えした
　　DALL-E3の編集機能ですが、
　　　Web版でも使えるようです。

　スマホでも
　　ブラウザのメインメニューの
　　　“PC版サイト”を
　　　　チェックすれば
　　　　　使えるようになります。

　画面が小さいので、
　　操作が大変ですが😅
***
　そのDALL-E3の編集機能を
　　使って、遊んでみました。

　その前に【注意】です。
　　アップロードした画像には
　　　使えません。

　　画像をタップしても
　　　アイコンが
　　　　SaveとShareしか
　　　　　ありません。

　　必ず、
　　　画像生成したもので
　　　　なければ、編集できません。

　　これはおそらく、
　　　プロンプトを
　　　　修正するためでは
　　　　　ないかと思われます。
***
　さてでは遊びますかねw

　まずは、
　　イケメンに
　　　登場してもらいます。
![1712109265254.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/26b9526b-7f87-af24-d5a2-207b3cfc7704.jpeg)

　海外のイケメンって
　　どこもヒゲを生やしていますね。

　ググったら
　　そういうものだそうで。

　Promptを確認したら
　　ヒゲなんて書いてないんだよね～

　では
　　ヒゲをなくしてやりましょう。

　ヒゲを塗りつぶして
　　プロンプト入力して、と。

　ところが、
　　一向にヒゲがなくなりません。
　　　いろいろと手を変え品を変えて
　　　　みましたけれど。

　どうやら、
　　イケメン＝ヒゲが
　　　固定化されているみたい。

　ヒゲのない男性が欲しいならば、
　　最初から、そう指定するべき、
　　　ということのようです。
***
　というわけで
　　次にいきましょう。

　若い男性に
　　出てきてもらいます。
![1712109293243.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/a4fb0ea5-5238-d735-72fb-81a9d4fbc839.jpeg)

　今度は、
　　ヒゲはありませんよw

　では、Ｔシャツとジーパンを
　　スーツにしてみます。

　塗りつぶして
　　プロンプト入力して、と。
![1712109303286.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/0f38fe13-6be6-07f8-d398-7775b1d8939b.jpeg)

　ブッ！　半袖スーツ！？

　あっ、そうか！
　　Ｔシャツだけを塗ったから
　　　そこだけの範囲で
　　　　変更しようとしたら
　　　　　そうなったのか。

　今度はちゃんと
　　手の方まで塗りつぶして、
　　　プロンプト入力して。

　無事に出ました。
***
　ちなみに、
　　画像の修正は
　　　元画像にするようにしています。

　YouTuberのKEITOさんが
　　解説動画の中で、
　　　やってみた結果、
　　　　その方がいい感じだと
　　　　　言っています。
[ChatGPTのDALL-E3機能に画像編集する機能が追加【コツも紹介】](https://youtu.be/cBuRwbJGTKA?si=HpEplplFERAq8Cnb)

　私もそれに同意しています。
　　KEITOさんと同じような感じで、
　　　編集後画像を使うと
　　　　変な崩れ方をすることが
　　　　　ありましたので。

　この記事が
　　みなさんの
　　　作品制作の糧に
　　　　なれば、幸いです。

　今回は、ここまで。

　最後に
　　アニメGIFを載せます。
　　　ドレスを編集したものを
　　　　つなげたものです。
![animated_sequence_dress_change.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/6c1aeaf7-d5af-6d86-68e1-2b2b4ab33f65.gif)
複数の同じフィールドを持つテーブルを重複を削除した状態で抽出

例えば同じフィールドをもっと社員テーブル1,2,3を結合する場合
```spl
SELECT employee_id, name, department FROM employees1
UNION
SELECT employee_id, name, department FROM employees2
UNION
SELECT employee_id, name, department FROM employees3
```
spacy 日本語モデルを利用

ダウンロードしてもエラーが出て使えない

以下のインストール方法で解決

参考：https://github.com/explosion/spacy-models/releases/tag/ja_core_news_sm-3.7.0


instllation
```
    pip install spacy
    python -m spacy download ja_core_news_sm
```
記事作成の外注を極める

# Google Search Consoleでクエリをエクスポート

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/086e67b3-c4e6-e732-b81e-81b75a2e4ce6.png)

これでクエリをエクスポートすることができる。

これをGoogleスプレッドシートにエクスポートして共有しよう。
一般公開しちゃえばいいと思う。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/d75f29d8-5230-8d53-d0f9-3c8976da62e4.png)


共有すればユーザーがurlを知っていれば来訪キーワードを閲覧できる。
これをもとに記事を書いてもらおう。

ポジティブなキーワードだけで来訪してくれればいいが
ネガティブなキーワードで来訪してくる人もいる。

例 : ◯◯はまずい

このキーワードでライターに指示を与えると良い。

# 構成

```
◯◯はまずいと言われているが、
甘いものが好きな人もいれば、酸味の強いものが好きな人もいる。
やはり味覚が影響するので、酸味が強いものが好きな人には◯◯は美味しく感じられるでしょう。
```

みたいな。

ネガをポジにする記事。
一般的なキーワードアドバイスツールだとどうしてもライターの記事が似たり寄ったりしてしまうため。


# クラウドワークスでお気に入りのライターだけまとめる

ライターによって、記事の質はバラバラ。

適当に依頼していると、どうしても変なのに当たる。
ということでお気に入りのライターだけまとめておき再度依頼できるように
しましょう。

① ワーカー管理をクリック
② 適当にメモってお気に入りボタンをタップ

![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/9049d5eb-1f00-bfdd-adfa-9d70d548a0a3.png)

# 契約を途中終了する時

相手によっては納期遅れやAI記事を納品してきたりする場合がある。
その際は

｢契約を途中終了します。お互いの為にコメントや評価をされないようお願いします｣

と付け加えた方が良い

以上
CloudFront Functions だけでHTTP 503 を返すメンテナンス画面を作る話

CloudFront Functionsのみで指定IP以外はメンテナンス画面(html)を表示する方法。検索するとS3と組み合わせる例はたくさん出てくるのですが、この方法は出てこなかったので残しておきます。

## S3を組み合わせると困る点
CloudFront -> S3（オリジン）の構成で、S3にメンテ画面用のHTMLを置くと`https://example.com/mainte.html`ではメンテ画面を出せても、他のURLにアクセスされると404になってしまい、メンテ画面を出せない。

このため、CloudFrontの404ページをmainte.htmlに変更し、ステータスコードも503を返す設定（ディストリビューション→エラーページ→カスタムエラーレスポンス）が必要となる→設定も戻すのも面倒。

## CloudFront Functionsでbodyを返却
下記の方法だとビューワーリクエスト（ビヘイビア→関数の関連付け）の関数をメンテ用の関数に変更するだけでメンテナンス画面が出せる。どうやらかつてはbodyを返却することができなかったぽい?のだが、現在は可能。

CloudFront Functions イベント構造
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/functions-event-structure.html

注意点としては、CloudFront Functionsのファイル容量は10KB以内でないと駄目なので、あまりリッチな画面は作れないこと。試してはいないのですが、cssや画像などは200で返っても問題ないので、そのあたりはS3など静的配信可能なものに入れて、それをhtmlで参照すると良さそう。

## コード
cloudfront-js-2.0で実行させる
```javascript
function handler(event) {
    const request = event.request;

    // メンテ画面を出さずに通すIPリスト
    const sourceIP = event.viewer.ip;
    const ALLOWED_IPS = [
        "xx.xx.xx.xx",
        "yy.yy.yy.yy",
    ];

    // メンテナンス用HTML
    const html = `
            <!DOCTYPE html>
            <html>
            <head>
            <title>Site under maintenance</title>
            </head>
            <body>
            <h1>Site under maintenance</h1>
            <p>We are currently performing maintenance on our website. Please check back later.</p>
            </body>
            </html>
            `;
    const base64EncodedBody = Buffer.from(html, "utf8").toString("base64");

    // 指定IP以外はメンテ画面を503で出す
    if (!ALLOWED_IPS.includes(sourceIP)) {
        const response = {
            statusCode: 503,
            statusDescription: "Service Temporarily Unavailable",
            headers: {
                "content-type": {
                    value: "text/html",
                },
                "cache-control": {
                    value: "no-store, no-cache, must-revalidate, max-age=0",
                },
                pragma: {
                    value: "no-cache",
                },
                expires: {
                    value: "0",
                },
            },
            body: {
                data: base64EncodedBody,
                encoding: "base64",
            },
        };

        return response;
    }

    return request;
}
```

今までmod_rewriteでゴニョゴニョやっていたことを考えると、ずいぶん分かりやすくできることも増えたので、このサービス好き。
Git、GitHub、GitHub Actionsシリーズ記事のまとめ

Git関連の記事が増えてきたので、まとめ記事を作りたいと思います。

## Git

https://qiita.com/ucan-lab/items/aadbedcacbc2ac86a2b3

https://qiita.com/ucan-lab/items/0bbf07daa58959c1010a

https://qiita.com/ucan-lab/items/47967757e688e9dc42db

https://qiita.com/ucan-lab/items/f824580cbf995495de00

https://qiita.com/ucan-lab/items/0a128bb14528e4e52fd2 

https://qiita.com/ucan-lab/items/c65297c062b477be01e5

https://qiita.com/ucan-lab/items/9b442e042988e2d7a35d

https://qiita.com/ucan-lab/items/fdbb6b925e6cf57b9aad

https://qiita.com/ucan-lab/items/f0e8cfe863a37343eae4

https://qiita.com/ucan-lab/items/371cdbaa2490817a6e2a

## GitHub

https://qiita.com/ucan-lab/items/e02f2d3a35f266631f24

https://qiita.com/ucan-lab/items/d594404d0d2c64a85a38

https://qiita.com/ucan-lab/items/eeef46cee4b928106d1d

## GitHub Actions

https://qiita.com/ucan-lab/items/63d2a39914dc51b547ae

https://qiita.com/ucan-lab/items/c3fac4b7198640c11cb3

https://qiita.com/ucan-lab/items/4b02dec969df399253f7

https://qiita.com/ucan-lab/items/a8bede28954bc2436bf6

https://qiita.com/ucan-lab/items/b831f42dbb936441aeae

https://qiita.com/ucan-lab/items/59127865240d170bbbf7

https://qiita.com/ucan-lab/items/884e6da03ef803979619
非同期処理を実行するPromise.allについてのメモ

# はじめに
現在React×TypeScriptを学習中です。
DBからデータ取得をする際に、Promose.allを使用したので、備忘録を兼ねてメモにしました。
# Promose.allとは
**複数の非同期処理を同時に開始し、それらの処理がすべて完了するのを待ってから次の処理に進むことができる便利なメソッド**です。
複数の処理を同時に実行するため、**処理時間が短縮できる**というメリットもあります。

**メソッド実行の流れ**

まず、Promise.allはPromiseを要素とする配列を受け取ります。
そして、各Promiseの処理が解決されるのを待ち、すべてのPromiseが解決された後に新しいPromiseを返します。
この新しいPromiseが、元のPromise配列内のPromiseが返した値の配列で返されます。
# 使用例
今回はこんな感じで使ってみました。

今回の処理では、**ユーザーごとに異なるスキル情報を取得する＆これらのスキル情報をすべて取得してから結果を返す必要があったので、Promise.allを使用することで、スキル情報を一気に取得して、取得が終わったら結果を返してあげる**ようにしています。
```tsx:tsx
// ユーザー情報とユーザーが持つスキル情報を組み合わせて取得する関数
export const getUsersWithSkills = async () => {
  try {
    // まず、ユーザー情報を取得
    const allUsers = await getAllUsers();
    if (!allUsers) return [];

    // 全てのユーザーのスキル情報を取得し終えるまで待ち、最後にユーザー情報とスキル情報を組み合わせたデータを返す
    const usersWithSkills = await Promise.all(
      allUsers.map(async (user) => {
        const skills = await getUserSkills(user.id);
        return { ...user, skills };
      })
    );
    console.log(usersWithSkills);
    // ユーザー情報とスキル情報を組み合わせたデータを返す
    return usersWithSkills;
  } catch (error) {
    console.error("Failed to get users with skills:", error);
    return [];
  }
};
```
# おわりに
今回DB上に複数のテーブルが存在していて、それぞれが紐づけられている状態なので、データの取得に苦戦しました。参考になれば幸いです。
# 参考
使用例も含めて解説があります。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
JavaScriptでシングルトンパターン🐷Singleton

```javascript
function singleton(fn) {
    let result
    return () => result = result ?? fn()
}

execute_singleton = singleton(() => Math.random())
console.log(execute_singleton())
console.log(execute_singleton())
console.log(execute_singleton())
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/d2365eff-2b26-1711-d25c-16cdb0dd103c.png)
ITパスポート 無線LAN

・LANの規格
有線LANはIEEE802.3、無線LANはIEEE802.11
・通信規格
周波数は2.4GHz帯と5GHz帯に分かれる
2.4GHz帯は床や壁などの障害物に強く電波が届きやすいが、電波干渉を受けやすい
・Wi-Fi
無線LAN装置が相互に接続できることを示すブランド名
・アクセスポイント
無線LANでは、アクセスポイントとなる無線LANルータと端末との間で通信する
・アドホックモード
アクセスポイントを経由せず、端末同士が直接通信する
・メッシュWi-Fi
サテライトルータを追加して、複数の無線LANルータで一つの無線ネットワークを形成すること
・WPS
Wi-Fi接続の設定を簡単に行うための規格
・無線LANの暗号化規格
WEP、WPA2、WPA3
・ESSID
無線のネットワークを識別する文字列
・MACアドレスフィルタリング
ルータに登録されたMACアドレスをもつ端末からの通信だけを許可する機能
・ANY接続機能
接続可能なアクセスポイント中から最も電波状態がよく、かつ認証が必要ないアクセスポイントに、端末が自動で接続できる機能
LinuC受験についての整理

## 受験の決意
仕事で、Linuxコマンドを打つ機会が多いので、基本的な内容については理解を深めたいと考えた。

## Linucとは？
Linuxや周辺技術について幅広い知識を得られる。
レベル１～３に分かれており、１が初心者向けである。(私が受けようとしている)
レベル１の認定を取得するには「101試験」と「102試験」に合格する必要がある。＊一つづつ受験可
101試験では、「Linuxのインストールと仮想マシン・コンテナの利用、ファイル・ディレクトリの操作と管理、リポジトリとパッケージ管理、ハードウェア、ディスク、ファイルシステム」が範囲
102試験では、「シェル・スクリプト、ネットワーク基礎、セキュリティ、オープンソースの文化」
102には記述問題も多いらしい

## 勉強のおとも
資格取得が目標ではなく、1に理解、2に取得としたい。そのため確実な理解としていきたい
- 小豆本
- ラズパイにLinuxをインストールする？（仮）
拡張子がmjsとjsのファイルの違いについて

Nodeのバージョン18以上のLambdaでは、デフォルトファイルの拡張子が`mjs`に変更されています。LambdaのNodeのバージョンを更新するにあたり、`mjs`ファイルと`js`ファイルとの違いについて調査しました。結論として、拡張子の違いはJavaScriptのモジュールシステムの違いに由来しています。以下、詳細を解説します。

## 拡張子が.mjsと.jsのファイルの違い
### 前提
JavaScriptには2つの主要なモジュールシステムが存在します。
- CommonJs
- ECMAScript(ES Module, ES2015)

### モジュールシステムと拡張子
- CommonJs: cjs（あまり一般的ではありません）
- ES Module: mjs

拡張子が`js`の場合は、`package.json`内の`type`フィールドで指定されたモジュールシステムに従います。`type`は`"commonjs"`または`"module"`のいずれかを指定できます。指定がない場合、デフォルトはCommonJSとなります。

## 実験
### 拡張子が.mjsのファイルでCommonJS形式で記述した場合
```JavaScript
// lib.mjs
const sayHello = () => {
  console.log("Hello")
}

module.exports = { sayHello }
```
```JavaScript
// index.mjs
const { sayhello } = require("./lib")

exports.handler = async (event) => {
  sayHello()
}
```
Lambdaを実行してみると、以下のエラーが表示されました。
```
{
  "errorType": "ReferenceError",
  "errorMessage": "require is not defined in ES module scope, you can use import instead",
  "trace": [
    "ReferenceError: require is not defined in ES module scope, you can use import instead",
    "    at file:///var/task/index.mjs:1:22",
    "    at ModuleJob.run (node:internal/modules/esm/module_job:218:25)",
    "    at async ModuleLoader.import (node:internal/modules/esm/loader:329:24)",
    "    at async _tryAwaitImport (file:///var/runtime/index.mjs:1008:16)",
    "    at async _tryRequire (file:///var/runtime/index.mjs:1057:86)",
    "    at async _loadUserApp (file:///var/runtime/index.mjs:1081:16)",
    "    at async UserFunction.js.module.exports.load (file:///var/runtime/index.mjs:1119:21)",
    "    at async start (file:///var/runtime/index.mjs:1282:23)",
    "    at async file:///var/runtime/index.mjs:1288:1"
  ]
}
```
上記のLambdaを実行すると、`require`がESモジュールスコープで定義されていないというエラーが表示されました。これは、拡張子が`.mjs`のファイルがESモジュールとして解釈されるため、CommonJS形式での記述がサポートされていないことを意味します。同じコードを.jsの拡張子で実行すると、問題なく動作します。

## 結論
- 拡張子の違いは、JavaScriptのモジュールシステムの違いに基づく。
- Nodeのバージョン18以降のLambdaではデフォルトのファイル拡張子が`.mjs`になっているが、CommonJS形式を引き続き使用したい場合は、`.js`（または`.cjs`）の拡張子を持つファイルを使用する必要がある。

## 参照
https://aws.amazon.com/jp/blogs/compute/using-node-js-es-modules-and-top-level-await-in-aws-lambda/
jq 使うものまとめ

# jq 使うもの

使いたいときによく検索しているので，使うものをまとめておくことにした

## Query

- flatten する
    - `[]`
        - https://jqlang.github.io/jq/manual/#array-object-value-iterator
- OR を表現する
    - `inside`
        - https://jqlang.github.io/jq/manual/#inside
        - contains の逆．
        - `an_array.contains(element)` で an_array を指定したいときに使う．
        - `print "{\"key\": \"a\"}\n{\"key\": \"b\"}\n{\"key\": \"c\"}"|jq '. | select([.key] | inside(["a", "b"]))'`
            - `{"key":"a"}`
            - `{"key":"b"}`
- 出力フォーマット
    - `@csv`
        - https://jqlang.github.io/jq/manual/#format-strings-and-escaping
        - `print "[[1,2],[3,4]]" | jq '.[] | @csv'`
            - `"1,2"`
            - `"3,4"`
- フィルターする
    - `map(select())`
        - https://jqlang.github.io/jq/manual/#select
        - `print "[1,2,3]" | jq -c '. | map(select(. >= 2))'`
            - `[2,3]`
- ソートする
    - `sort_by`
        - https://jqlang.github.io/jq/manual/#sort-sort_by
        - `print "[{\"k\": 2}, {\"k\": 1}]" | jq -c '. | sort_by(.k)[]'`
            - `{"k":1}`
            - `{"k":2}`
- 逆順にする
    - `reverse`
        - https://jqlang.github.io/jq/manual/#reverse
- 先頭を取得する
    - `limit`
        - https://jqlang.github.io/jq/manual/#limit
        - `print "[1,2,3]" | jq '. | limit(2; .[])'`
            - `1`
            - `2`

### Predicate

- boolean operators
    - `and` / `or` / `not`
        - https://jqlang.github.io/jq/manual/#and-or-not
            - `&&` とかと間違える
            - `true | not` とかできる
- `==`
    - https://jqlang.github.io/jq/manual/#==-!=
- 正規表現
    - `STRING | FILTER(REGEX; FLAGS)`
        - `jq -n '"a b" | test("a\\sb"; "x")'`
            - `true`

## Option

https://jqlang.github.io/jq/manual/#invoking-jq

- `-c`
    - `--compact-output / -c:`
        - コンパクトになる
        - 行指向な結果を出力するのに使う
            - `print "[[\"aaa\", \"bbb\"], [\"ccc\", \"ddd\"]]" | jq -c '.[]'`
                - `["aaa","bbb"]`
                - `["ccc","ddd"]`


## Refs

https://jqlang.github.io/jq/manual/
Form submission failed, as the <TEXTAREA> element named '' was implicitly closed by reaching the end of the file. Please add an explicit end tag ('</TEXTAREA>')

### 問題

chromeのexperimentalを有効にしてると、
jsのsummernoteのライブラリのtexeareタグでエラーが出る。

https://github.com/summernote/summernote/issues/3820

### 解決方法

chrome://flags#enable-experimental-web-platform-features

でoffにすれば良い。

![スクリーンショット 2024-04-03 9.55.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64334/64e43161-108e-a582-85cd-17a8068664df.png)


### 関連情報


https://qiita.com/memolog/items/78736a597f83cc4c5e6d
Apgee 学習記録

# Apigee ハイブリッドとは
モデルを使用し、API プロキシの開発とAPIを管理するためのプラットフォーム

# ハイブリッド モデル
ハイブリッドモデルは、2つある
* クラウドでApigeeがホストする管理プレーン
* サポートされているKubernetesプラットフォームにユーザーがインストールして管理するランタイムプレーンがある

# Kubernetes バージョンサポートに関するApigeeのポリシー
* 特定のKubernetesごとに最大3つのバージョンがサポートされる
* 以下の画像参照
    * Overlap ハイブリッド1.9の1.25xと1.10の1.25xが重複している
    * Dropped ハイブリッド1.9の1.12xと1.10の1.12xが削除されている
    * Added ハイブリッド1.9に1.15xはないが、1.10に追加されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3146038/701997f3-4da8-e81e-30ee-e6bd925e3cf7.png)

* KubernetesのプラットフォームがバージョンでEOLの場合、ApigeeがサポートするバージョンもEOLとなる

* 新しいプラットフォームのバージョンがリリースされた場合、マイナーバージョンのパッチがリリースされる

https://cloud.google.com/apigee/docs/hybrid/supported-platforms?hl=ja#note8

# 前提として
* 実行するKubernetesのプラットフォームはバージョンがサポートされていること
* version1.1であること

# 概要
特徴
* すべてのAPIを1か所で管理
    * 内部外部のAPIをGoogle Cloudで管理する
* セキュリティとコンプライアンス
    * ランタイムを管理、制御することで、既存のコンプライアンス、ガバナンス、セキュリティのインフラストラクチャを利用できる
* マルチクラウド戦略をサポート
    * コストとパフォーマンスのバランスを取る

# ハイブリッド環境のAPI プログラム
* Apigeeハイブリッドは、Googleが管理するプレーン
* サポート済みのKubernetes プラットフォーム上のランタイムプレーンから構成される

# ハイブリッドの主要コンポーネント

|コンポーネント    |環境    |保存されるデータ                                     |
|:-----------------|:-------|:----------------------------------------------------|
|管理プレーン      |クラウド|APIプロキシ,TargetServers,トラストストアとキーストア,監査ログ,RBAC,ユーザー※1,分析,デプロイ ステータス イベント,デバッグ データ※2|
|ランタイムプレーン|クラウドまたはオンプレ|KMS,KVM,割り当て,環境キャッシュ|
|Google Cloud      |クラウド|ログデータ,指標※3


クラウド以外でAPI トラフィックはすべてのネットワークで処理される
UI や API分析などの管理サービスはクラウド上で実行される

# ランタイムプレーンについて
動作する独自のKubernetes クラスタのランタイムサービス
APIトラフィックはすべてランタイムプレーンを通過し、処理される

# ランタイムプレーンを構成する主要コンポーネント
|コンポーネント    |環境    |説明                                                 |
|:-----------------|:-------|:----------------------------------------------------|
|Message Processor |ホスト  |API リクエストの処理とポリシー実行                  |
|Synchronizer      |クラウド|管理プレーンとランタイムプレーンのAPI環境構成の同期 |
|Cassandra         |クラウド|ランタイム プレーンにデータ永続性を提供する　       |
|MART              |クラウド|管理プレーンとランタイムプレーン間で使用するAPI     |
|UDCA              |クラウド|ランタイムプレーンのデータ収集ポッド内で実行され、統合分析プラットフォーム（UAP）に送信される|

# 管理プレーンについて
* Apigee ハイブリッド UI
    * API プロキシの作成とデプロイ、ポリシーの構成、API プロダクトの作成、デベロッパー アプリの作成を行うための UI をデベロッパーに提供します。管理者は Apigee ハイブリッド UI を使用してデプロイのステータスをモニタリングできます。 
* Apigee API
    * 組織や環境を管理するためのプログラマティック インターフェースを提供します
* 統合分析プラットフォーム（UAP）
    * 分析とデプロイのステータス データをランタイム プレーンから受信して処理します

# Google Cloud サービスについて
|Google Cloud サービス|説明|
|:--------------------|:-----------|
|ID                   |ユーザー アカウント認証では、Google Cloud アカウントが使用されます。認可では、Google Cloud サービス アカウントが使用されます。            |
|ロール               |ハイブリッドのアクセス管理では、Google のロールエンジンである IAM を使用し、デフォルトの Apigee のロールをサポートします。|
|リソース階層         |リソースは、Google Cloud プロジェクトにまとめられ、Apigee の組織にリンクされます。|
|Cloud Operations     |ロギングと指標データの分析を行います。|

# ユーザーの種類
HelloWorld本 第9章

# 最適化

最適化とデバッグは背反の関係にある。
書籍のコードでは-O0は45バイト、-O1は44バイト、-O2は41バイト、-Osは44バイトである。
-Osは-O2の内、サイズを増大しないオプションを採用するはずだが、理由は不明である。

# printfの最適化

-fno-builtinを使用しない場合、引数無しのprintfはputsに置換される。
putsは改行を加える為、文字列側の改行は除去され、実行ファイルの文字列検索はヒットしない可能性がある。

# その他

timeコマンドのrealは実時間、userはユーザ時間、sysはカーネル時間である。
動的リンクの処理の為、共有ライブラリでは実行ステップ数が大幅に増加する。
TWICE ONCE JavaScript 1回だけ実行する関数【MISAMO】

```javascript
function once(fn, max = 1) {
    let i = 0
    return () => i++ < max && fn()
}

function twice(fn, max = 2) {
    let i = 0
    return () => i++ < max && fn()
}

execute_once = once(() => console.log('hi once'))
execute_once()
execute_once()

execute_twice = twice(() => console.log('hi twice'))
execute_twice()
execute_twice()
execute_twice()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/5ccc42f9-0d3d-e6ad-7d2f-f39b8b70e3e5.png)

```javascript
function singleton(fn) {
    let result
    return () => result = result ?? fn()
}

execute_singleton = singleton(() => Math.random())
console.log(execute_singleton())
console.log(execute_singleton())
console.log(execute_singleton())
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/61f2ed4d-449e-8f91-7541-39342f9c645b.png)


https://stackoverflow.com/a/78165179
TIMEVALUEが機能しない　バグ？




+ [DIFFICULTY WITH TIME EXTRACTION FROM TEXT STRING INTO TIME FORMULA FIELD](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ai6fcSAA)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7dc2221f-5a09-a01c-d403-66f0c38628e4.png)

この数式で変換できるはずなんですが、何故か空白になります。

```
CASE(RIGHT(RIGHT(  inputDateTime__c  ,LEN(inputDateTime__c) - FIND(' ', inputDateTime__c )) ,2) ,
"AM", IF(LEN(SUBSTITUTE(RIGHT(  inputDateTime__c  ,LEN(inputDateTime__c) - FIND(' ', inputDateTime__c ))," AM",""))=7,
TIMEVALUE("0"+SUBSTITUTE(RIGHT(  inputDateTime__c  ,LEN(inputDateTime__c) - FIND(' ', inputDateTime__c ))," AM","")+ ".000"),
TIMEVALUE(SUBSTITUTE(RIGHT(  inputDateTime__c  ,LEN(inputDateTime__c) - FIND(' ', inputDateTime__c ))," AM","")+ ".000")
),
"PM", IF(LEN(SUBSTITUTE(RIGHT(  inputDateTime__c  ,LEN(inputDateTime__c) - FIND(' ', inputDateTime__c ))," PM","")) =7,
TIMEVALUE("0"+ SUBSTITUTE(RIGHT(  inputDateTime__c  ,LEN(inputDateTime__c) - FIND(' ', inputDateTime__c ))," PM","") + ".000"),
TIMEVALUE(SUBSTITUTE(RIGHT(  inputDateTime__c  ,LEN(inputDateTime__c) - FIND(' ', inputDateTime__c ))," PM","") + ".000") + 12*60* 60 * 1000
),
IF(LEN(RIGHT(  inputDateTime__c  ,LEN(inputDateTime__c) - FIND(' ', inputDateTime__c )) ) =7,
TIMEVALUE("0" + RIGHT(  inputDateTime__c  ,LEN(inputDateTime__c) - FIND(' ', inputDateTime__c ))+ ".000"),
TIMEVALUE(RIGHT(  inputDateTime__c  ,LEN(inputDateTime__c) - FIND(' ', inputDateTime__c ))+ ".000")
)
)
```

別の数式に上記を設定して、数式でこれを呼び出すと機能します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/baa458f6-0c7a-671a-b325-166b24ccc47b.png)

結局はバグみたいです。

れは Salesforce のバグのような気がします。時間式 TIMEVALUE('9:45:00.000') がある場合、正しい時刻 9:45 が得られます。しかし、テキスト '9:45:00.000' を生成するテキスト式があり、それを時間式で使用すると、突然機能 (リスト ビュー、レポート) が停止します。

This smells like a Salesforce bug: if I have a Time formula TIMEVALUE('9:45:00.000'), I get a proper time 9:45. But if I have a Text formula that produces a Text '9:45:00.000' and I use that in a Time formula, then all of a sudden things stop working (list view, report).

https://salesforce.stackexchange.com/questions/389313/problem-with-formula-with-timevalue
ChatOllamaを試してみる

## ChatOllamaとは
* https://github.com/sugarforever/chat-ollama
    * star数： 796
* ChatOllama は、LLM に基づいたオープンソースのチャットボットです。幅広い言語モデルとナレッジ ベース管理をサポートして、100%ローカルでLLMを選べて検索することをできます
    * Ollama served models
    * OpenAI
    * Azure OpenAI
    * Anthropic
* フィーチャー
    * Ollama models management
    * Knowledge bases management
    * Chat
    * Commercial LLMs API keys management

## Ollamaとは
* https://github.com/ollama/ollama
    * star数： 52.2k
* Llama 2、Mistral、Gemma、その他の大規模な言語モデルを立ち上げて実行します

## chromadbとは
* https://github.com/chroma-core/chroma
    * star数： 11.8k
* AI ネイティブのオープンソース組み込みデータベース


## dockerでChatOllama環境を簡単に構築する

```docker-compose.yml
version: '3.1'
services:
  ollama:
    image: ollama/ollama
    ports:
      - "11434:11434"
    volumes:
      - ~/.ollama:/root/.ollama

  chromadb:
    image: chromadb/chroma
    ports:
      - "8000:8000"
    restart: always
    volumes:
      - chromadb_data:/chroma/.chroma/index

  chatollama:
    environment:
      - CHROMADB_URL=http://chromadb:8000
      - DATABASE_URL=file:/app/sqlite/chatollama.sqlite
    image: 0001coder/chatollama:latest
    ports:
      - "3000:3000"
    pull_policy: always
    restart: always
    volumes:
      - ~/.chatollama:/app/sqlite

volumes:
  chromadb_data:

```

起動
```
docker compose up
```

Ollama Server Hostを設定する

```
http://ollama:11434
```
![スクリーンショット 2024-04-03 9.14.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13451/6a2cb9b9-a24b-ba27-bbc8-543c3fd73309.png)
* docker-compose.ymlの中に、service nameとportを合わせる





## ChatOllamaを試す

#### Ollama models management
![スクリーンショット 2024-04-03 9.13.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13451/857b7515-0cbc-0a48-3e6a-e8cb7b616f99.png)

####  Knowledge bases management
![スクリーンショット 2024-04-03 9.17.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13451/9e2d0c0d-07a3-a64a-d0b7-d2e39f2d4f79.png)

####  Chat
![スクリーンショット 2024-04-03 9.06.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13451/54203b17-22a8-d880-0a68-838b4bb7e38c.png)


## 感想
* LLMモデルやEmbeddingモデルの管理をやりやすい
* 任意なLLMに対してプロンプトを簡単に試すことができる
* 自分の知識データベースを作れる
* ソースコードからアーキテクチャーなどを勉強できる
CloudFront+S3構成でSPAを静的ホスティングする時は、エラーページ遷移設定(403)が必須


## はじめに
普段はバックエンドとインフラをメインでやっています。
そのため、ついついフロントエンドのことを忘れてしまうので、メモしておきます。

## 構成
アプリへのアクセスは以下の流れになります。いわゆる静的ホスティングの王道パターンです。
Client ⇒ CloudFront ⇒ S3 ⇒ SPA Webアプリケーション　

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2864707/4c5c0a41-c23b-75d0-0a2a-f9776a2c64a2.png)

以下、補足です。
- ドメイン取得・付与、OAIの設定などは、本来はCloudFront＋S3構成ではベストプラクティスに沿って実施するべきですが、本記事で説明したいエラーページ遷移についてとは本筋がズレるため、行なっていません。
- SPAは、Vue.jsをフレームワークとして作成しています。ReactやAngularなど、他のSPAに置き換えて考えてもらっても構いません。

## なぜエラーページ遷移設定は必須なのか？
端的に言うと、「**SPAの仕組みとして、index.htmlを起点としてルーティングさせている。そのため、存在しないパス（ページ）へのアクセスも全てindex.htmlに返す必要がある**」ためです。

### SPAでない従来のWebページのファイル構成・ルーティング
SPAでない従来のWebページは以下のような階層構造とします。
- トップページ
  - 会社情報
    - 沿革
  - 代表挨拶
  - 事業紹介
    - 事業A
    - 事業B 
  - 採用
    - 新卒
    - 中途 

SPAでない従来ページでは、上記の項目1つ1つに対して全てHTMLファイルを用意して、階層的にホスティングが必要です。つまり上記の構成の場合、第1階層から第3階層まで、計10個のHTMLファイルが必要です。
アクセスされたパスに対応したHTMLファイルを返すので、イメージとしてはシンプルです。ルーティングに関係なく、対象のページが直接的に読み込まれます。

### SPAのWebページのファイル構成・ルーティング
Webページ自体の構成は、SPAでないWebページと差分無いとします。
- トップページ
  - 会社情報
    - 沿革
  - 代表挨拶
  - 事業紹介
    - 事業A
    - 事業B 
  - 採用
    - 新卒
    - 中途 

SPAは、1つのindex.htmlだけが存在します。
そのindex.htmlと各ページに対応するコンポーネント組み合わせることによって、それぞれのWebページを描画しています。
（例えば、事業Aがアクセスされた場合、index.htmlが取得された後に、JavaScriptがブラウザで動作して、ルーティングによって対象のコンポーネントが取得されることで、index.htmlを修飾して描画します。）

従来Webページのように指定されたパスのHTMLファイルを探索すると、当然ですが該当ページ（HTMLファイル）が存在せずにエラーとなります。（403エラーが発生します）
このエラーを避けるために、CloudFrontのエラーページ遷移設定によって、403発生時にindex.htmlに遷移させて、上記のSPAの動作・描画をさせることができます。

## まとめ
従来のページごとにHTMLファイルが読み込まれるWebページと異なり、SPAのHTMLはトップに配置されるindex.htmlのみとなります。
（だからこそ、Single Page Application）

SPAの挙動を理解した上で、index.htmlに誘導するためのルーティング設定をCloudFrontに対しても設定しましょう。
証明書と鍵 Certificates and Keys

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)



+ [証明書と鍵](https://help.salesforce.com/s/articleView?id=sf.security_keys_about.htm&type=5)

Salesforce 証明書と鍵のペアは、要求がユーザーの組織からのものであることを確認する署名として使用されます。証明書と鍵は、外部 Web サイトとの認証済み SSL 通信で使用されるか、組織を ID プロバイダーとして使用するときに使用されます。使用している外部 Web サイトで要求が Salesforce 組織から行われていることを確認する必要がある場合は、Salesforce 証明書と鍵のペアの生成のみ必要です。



# エラー

+ [Getting error while importing certificate from keystore](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ai0i9)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7da783b5-e1ad-b882-1657-932e926e2b6d.png)

:::note alert
Data Not Available

The data you were trying to access could not be found. It may be due to another user deleting the data or a system error. If you know the data is not deleted but cannot access it, please look at our support page. 
:::

:::note
Check this out: https://lekkimworld.com/2018/07/03/issue-with-importing-keystore-into-salesforce/This worked.

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T4OhPSAV
:::
MedAE(絶対誤差の中央値)を求める(SPSS Modeler データ加工逆引き8-16)

# MedAE(絶対誤差の中央値)を求める

![スクリーンショット 2024-03-27 11.28.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/222431a2-fc2c-40d5-1c92-625dc9a2aad9.png)


## 1.想定される利用目的

・時系列予測モデルの性能評価
・数値予測モデルの性能評価

*平均ではなく中央値を利用することで外れ値の影響を受けにくいメリットがあります。

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/main/medAE.str

## 3.サンプルストリームの説明

![スクリーンショット 2024-03-27 11.29.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9efc50e3-7be9-0798-107c-2cda6ed054f8.png)

a.入力するデータは以下の通りです。日毎の来場者の実績と予測のフィールドの３列です。

![スクリーンショット 2022-09-23 10.54.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e0cb5587-6a05-305a-4156-61c834af1bd4.png)

b.[フィールド作成]ノードを編集します。誤差の絶対値を求めています。

![スクリーンショット 2024-03-27 11.33.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/29b7e847-94da-e2ab-40df-263ad0ae01df.png)

[プレビュー]します。

![スクリーンショット 2024-03-27 11.34.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2593c244-6eb7-782c-030b-d4b4cf6ca399.png)

c.[レコード集計]ノードを編集します。

![スクリーンショット 2024-03-27 11.34.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/48b1b269-5f15-816e-71d5-ad76fb680068.png)

[プレビュー]します。MedAEが表示されました。

![スクリーンショット 2024-03-27 11.34.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5163a685-6a06-36fd-9045-2896da770230.png)

#### 注意事項

中央値を求める処理はSQL自動生成に対応していないため、大規模データの場合処理に時間がかかります。その際はソートやサンプリングを利用して別の出力方法を検討します。

## 4.参考情報

#### RMSEを取り上げている記事

https://qiita.com/416nishimaki/items/24ae7ab2e3513cff282a

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
【UE5】プロジェクトの作成も「Generate Visual Studio project files」も出来ない時の対処法

# 遭遇した問題
UE エディタからプロジェクトを作成しようとしたり、「.uproject」ファイルから「Generate Visual Studio project files」をしようとしたら下記のエラーが発生する。
```
Running C:/Program Files/Epic Games/UE_5.1/Engine/Build/BatchFiles/Build.bat  -projectfiles -project="C:/Users/model/Documents/Unreal Projects/MyProject2/MyProject2.uproject" -game -rocket -progress
Running UnrealBuildTool: dotnet "..\..\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" -projectfiles -project="C:/Users/model/Documents/Unreal Projects/MyProject2/MyProject2.uproject" -game -rocket -progress
You must install or update .NET to run this application.

App: C:\Program Files\Epic Games\UE_5.1\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll
Architecture: x64
Framework: 'Microsoft.NETCore.App', version '6.0.0' (x64)
.NET location: C:\Program Files\dotnet\

The following frameworks were found:
8.0.0 at [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]

Learn more:
https://aka.ms/dotnet/app-launch-failed

To install missing framework, download:
https://aka.ms/dotnet-core-applaunch?framework=Microsoft.NETCore.App&framework_version=6.0.0&arch=x64&rid=win-x64&os=win10
```
# 対処法
- [こちら](https://dotnet.microsoft.com/ja-jp/download/dotnet/6.0/runtime?cid=getdotnetcore&os=windows&arch=x64)から「**.Net Core 6.0.0（X64）**」をダウンロードする（ X84 では上手く行かなかったため **X64** がお勧め）
- **Visual Studio** に必要なコンポーネントが全て入っているか確認する
（Visual Studio に入れなければならないコンポーネントは[こちら](https://zenn.dev/pate_techmemo/scraps/cd1f4970ca04b2)を参照）
- PC と UE を**再起動**する
- UE のエンジンを**再インストール**する
# その他
## 参考記事
https://zenn.dev/pate_techmemo/scraps/cd1f4970ca04b2

https://forums.unrealengine.com/t/ue5-1-c/751071/3

# 最後に
## 株式会社ModelingXについて
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/4261f1c0-a380-01a9-9c69-08a836c6f02f.jpeg">

富山県を拠点とするスタートアップ企業、ModelingXは、2022年4月に創業し、「テクノロジーで感動体験を提供する」というミッションを掲げています。当社が開発中の暮らし体験メタバース「MELIFE（ミライフ）」は、バーチャル住宅展示場や銀行相談、家具購入、婚活などができる「地域単位の新たな経済圏」を目指しています。

↓サービスサイトはこちらから↓

https://melife.io/

ModelingXはリモートワーク＆フレックスタイム制を完備。
UnityやUEを共に探求する仲間を全国から募集しています。

↓企業詳細はこちら↓

https://modelingx.jp/
Elixir初学者向けの勉強法_WEB+DB PRESS第1章が最強説

『今日も最高の１日にします!』が合言葉のElixir教育事業部のこーへーです。

まずは、告知
4/25(木)、19:00から、**30代から始めるプログラミング、Elixir勉強会**「Elixir School」を開校します。

主催者である僕自身が、30代からプログラミングを始めて、学習して転職するのに30代からでも全然遅くないと実感しましたし、一生物になるスキルを身につけることには非常に価値があると思っているので、同じような境遇の人に参加してもらいたいという思いから開催することになりました。とりあえずは、無料なので無料のうちに参加してくださいね。笑

http://ptix.at/5xWr2a

もちろん１度きりではなく、定期開催なのでちゃんと身につくまでサポートしていこうと思います💪


では、本題。Elixirの基礎的な勉強はWEB+DB PRESSが最適なのではないかと思い、第1章部分で勉強してみました。

ちなみに、一昨年の11月に発売されたのですが、下記リンクから購入も可能です。

https://honto.jp/netstore/pd-book_31925749.html

## WEB+DB PRESS第1章実践

```
# 整数1+1を実行
iex(1)> 1 + 1
2

# List.to_tupleでリストをタプルに変換
iex(2)> List.to_tuple([1, 2, 3])
{1, 2, 3}

# h関数でIOの使い方を表示
iex(3)> h(IO)
・
・
・
省略

# _(アンダーバー)で桁を区切ることが可能、計算も可能
iex(5)> 1_000_000 + 1
1000001

# 16進数と10進数の計算が可能(全ての進数どうし計算可能)
iex(6)> 0.314e1 - 0.01
3.1300000000000003

# 整数2×3を実行
iex(7)> 2 * 3
6

# 整数10÷2を実行
iex(8)> 10 / 2
5.0

# div関数(除算)を使い、10÷2を実行
iex(9)> div(10, 2)
5

# rem関数(剰余)を使い、10÷3を実行、余りを出力
iex(10)> rem(10, 3)
1

# 論理演算trueを実行
iex(11)> true
true

# 論理演算falseとtrueを比較演算を用いて、比較
iex(12)> false == true
false

# :をつけるとアトムと呼ばれる値になる。?は末尾にしかつけれられない制約がある
iex(13)> :how?
:how?

# 同じアトムの比較は常にtrueになる
iex(14)> :ok == :ok
true

# 文字列の表示
iex(15)> "Hello"
"Hello"

# 文字列どうしの連結
iex(16)> "Hello" <> "World"
"HelloWorld"

# 文字列補間を使った計算
iex(17)> "1 + 1 =#{1 + 1}"
"1 + 1 =2"

# Elixirは文字のコードポイントを見るのに?を使う
iex(18)> ?あ
12354

# 同じ型のタプルの作成
iex(19)> {1, 2}
{1, 2}

# 違う方がのタプルの作成
iex(20)> {:ok, "OK"}
{:ok, "OK"}

# 同じ型のリストの作成
iex(21)> [1, 2]
[1, 2]

空のリスト作成
iex(22)> []
[]

# リストを|で区切ることでheadとtailで区切ることができる。headに文字列のa、tailに空のリストを作成
iex(23)> ["a" | [] ]
["a"]

# リストの中にリストを作り、それぞれをheadとtailで区切った実行結果
iex(24)> [1 | [2 | []] ]
[1, 2]

# リスト連結の実行結果
iex(25)> [1, 2, 3] ++ [4, 5, 6]
[1, 2, 3, 4, 5, 6]

# リストから指定した値を減算
iex(26)> [1, 2, 3] -- [2]
[1, 3]

in演算子を使い、1がリストに含まれているかをチェック
iex(27)> 1 in [1, 2, 3]
true

# headに文字列型の値を既存のリストに追加
iex(28)> ["新規追加" | [1, 2] ]
["新規追加", 1, 2]

# キーワードリストをタプルで作成
iex(29)> [{:a, 1}, {:b, "b"}] 
[a: 1, b: "b"]

# キーワードリストの省略形。
iex(30)> [c: "22", b: "33"]
[c: "22", b: "33"]

# マップの作成。同じマップ内に同じkeyを作ることはできない。
iex(1)> %{"key" => "value", :key => :value}
%{:key => :value, "key" => "value"}

# マップの省略形
iex(2)> %{key: "value"} 
%{key: "value"}

# colorにマップを束縛
iex(3)> color = %{:red => 0xff0000, blue: 0x0000ff}
%{red: 16711680, blue: 255}

# colorから指定したkeyのvalueを取得
iex(4)> color[:red]

# colorから指定したkeyのvalueを取得
16711680
iex(5)> color.blue
255
```

WEB+DB PRESSのElixir第1章をやってみてわかったことは、プログラム初学者でも演算子や型などの最低限の知識があれば理解しやすいのではないかということです。

実践本もいくつか出ていますが、初学者は第1章で躓いてしまう可能性があるので、初めはWEB+DB PRESSでも良いかもしれませんね。
cscの作法 その470

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
小遣い帳を、エクセルで出力せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/53e2d236-1223-df3e-eea7-0d4f4b47c9b1.png)

# サンプルコード

```

using System;
using System.Text;
using System.IO;
using System.Data;
using System.Data.Common;
using System.Transactions;
using System.Data.SQLite;
using ClosedXML.Excel;

namespace App
{
	class Program {
		static void Main(string[] args) {
			var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Book3.xlsx");
			var wb = new XLWorkbook();
			var ws = wb.Worksheets.Add("Sheet1");
			int j = 1;
			ws.Cell(j, 1).Value = "日付";
			ws.Cell(j, 2).Value = "内訳";
			ws.Cell(j, 3).Value = "貰ったお金";
			ws.Cell(j, 4).Value = "使ったお金";
			ws.Cell(j, 5).Value = "残金";
			SQLiteConnectionStringBuilder ConnectionStr = new SQLiteConnectionStringBuilder();
			ConnectionStr.DataSource = "db0.sqlite";
			using (SQLiteConnection Connection = new SQLiteConnection(ConnectionStr.ToString()))
			{
				Connection.Open();
				using(SQLiteCommand Command = new SQLiteCommand(Connection))
				{
					Command.CommandText = "SELECT * From kozu ORDER BY adate ASC";
					using(SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(Command))
					{
						DataTable dt = new DataTable();
						dataAdapter.Fill(dt);
						int pre = 0;
						for (int i = 0; i < dt.Rows.Count; i++)
						{
							j++;
							DataRow row = dt.Rows[i];
							ws.Cell(j, 1).Value = row["adate"];
							ws.Cell(j, 2).Value = row["memo"];
							ws.Cell(j, 3).Value = row["inp"];
							ws.Cell(j, 4).Value = row["oup"];
							int inp = 0;
							int oup = 0;
							int zan = 0;
							String s2 = Convert.ToString(row["inp"]);
							if (s2 != "")
							{
								inp = Convert.ToInt32(s2);
							}
							String s3 = Convert.ToString(row["oup"]);
							if (s3 != "")
							{
								oup = Convert.ToInt32(s3);
							}
							pre = inp - oup + pre;
							ws.Cell(j, 5).Value = pre;
						}
					}
				}
			}
			wb.SaveAs(filePath);
			Console.WriteLine("ok");
		}
	}
}






```


以上。
「sudoers ファイル内にありません」の対処法

# 要点
・一般ユーザーにsudoの実行権限を付与する


# 経緯
・sudo dnf install httpdを実行したところ、
**(ユーザー名) は sudoers ファイル内にありません。この事象は記録・報告されます**
とのメッセージが発生しました。

# 環境
VMware Workstation 17
CentOS7

# 手順
①rootユーザーに切り替える
```ruby
[test@pc ~]$su -
```

②visudoを入力しエディタを開いて以下の通りに実行
```ruby
(エディタ内の操作）
コマンドモードの状態で、/wheelを入力し対象を検索
%wheel  ALL=(ALL)    ALL
の表記を見つける。

yyでコピー、pで１行下にペーストし、iで入力モードに入り
%user名  ALL=(ALL)    ALL
を追記

Escでコマンドモードに切り替え、:wqで保存終了
```


# 別の方法
このようなやり方もあるようです

https://qiita.com/unkomorasi01/items/219b56f2c9ddc8df4fe7

# 参考

https://windows-podcast.com/sundayprogrammer/archives/2609
【Next.js】自動テスト/CI まとめ

# はじめに

こんにちは、エンジニアのkeitaMaxです。

Next.jsの自動テスト/CI のまとめです。

今までNext.jsの自動テスト/CI についての記事を書いてきたので、それをまとめました。

これから紹介するものが全て入っているリポジトリは以下です。

https://github.com/NiheiKeita/next-example-app


# Storybookを使ったテスト

UI コンポーネントのテストをすることができます。

https://qiita.com/keitaMax/items/5698eb72106c1fd1397b

GitHubActionsを使ってPushしたときのテスト方法については以下で紹介しています。

https://qiita.com/keitaMax/items/bdabc2b6f1435c503547

# Chromaticを使ったテスト

GitHubPushしたときに自動でChromaticにデプロイをして、前回とのUIの変更点を洗い出すようなテストを書いたのが以下の記事です。

https://qiita.com/keitaMax/items/bdabc2b6f1435c503547

# ESLintを使ったテスト

単純な構文エラーやプロジェクト固有のコーディング規約に沿った静的解析を行ってくれるものです。

GitHubActionsを使ってテストするのも含めて以下の記事で紹介しています。

https://qiita.com/keitaMax/items/2a609a0e310375a2debd

# Jestを使ったテスト

Jestを使用したテストは以下の記事で紹介しています。

https://qiita.com/keitaMax/items/fdf8fa7bc6865659e612

# Codecovを使ったテスト

テストをしたときのコードカバレッジの取り方を以下で紹介しています。

https://qiita.com/keitaMax/items/bb33ef21ca0ae9c266d0


# Playwrightを使ったテスト

様々なブラウザでのテストができるPlaywrightを使用した記事が以下です。

https://qiita.com/keitaMax/items/28a414855c81b4c72536


# SonarQubeを使ったテスト

https://qiita.com/keitaMax/items/f43ddfd76c71e5724434


# さいごに

Next.jsを使用したテストについて今までいろいろやってきましたが、どれも簡単に実装することができたので、今後とも積極的に使用していきたいと思います。

やり方が違ったり、もっといいやり方があるというご指摘がある方はコメントしていただけると幸いです。

最後まで読んでいただきありがとうございました。
BATを使ってCSVファイルの中身を一行ずつ別々のファイルに出力する

# 背景
アプリの試験用にテストデータを作る必要がありました。
Pythonを使えば簡単に出来ますが、
都合によりPythonをインストール出来ない環境にあるためbatで実装することにしました。

# 概要
◇実現したいこと
-対象csvファイルの中身を一行ずつ読み出す。
-読み出した各行を新たなcsvファイルに出力する。※csvファイルの一行目にはヘッダー行を挿入

# 入出力要件
-Input
 ファイル名:test.csv
 ヘッダー:有り
 行数:N行(N＝任意、ヘッダー除く)
 
-Output
 ファイル名:n.csv(n＝読み出した行数)
 ヘッダー:有り
 行数:1行

◇入出力イメージ
Input
test.csv
|a  |b  |c  |
|---|---|---|
|1  |2  |3  |
|4  |5  |6  |

Output
1.csv
|a  |b  |c  |
|---|---|---|
|1  |2  |3  |

2.csv
|a  |b  |c  |
|---|---|---|
|4  |5  |6  |
 
# 処理手順
①対象CSVファイルの存在有無を確認
②ヘッダー行(1行目)を読み出してheader.csvに書き出す。
③2行目以降を読み出して行数分ヘッダー付きでCSV出力する

# 実装コード
```
@echo off
rem ①対象CSVファイルの存在有無を確認
set csv_file=test.csv

if not exist %csv_file% (
    echo CSVファイルが存在しないため、処理を終了します。
    exit
) 

rem ②ヘッダー行(1行目)を読み出してheader.csvに書き出す。
for /f "delims=" %%i in (%csv_file%) do (
  set header=%%i
  echo %%i > header.csv
  goto :Jump
)
:Jump
    echo %header%

rem　③2行目以降を読み出してヘッダー付きでCSV出力する
setlocal enabledelayedexpansion
set /a cnt=1
for /f "skip=1 delims=" %%i in (!csv_file!) do (
  echo !header! > !cnt!.csv
  echo %%i >> !cnt!.csv
  set /a cnt+=1
)
endlocal
```

# 所感
batに慣れていないのと慣れているPythonと変数の寿命がと異なり、for文を複数に分けて実装しなければいけない点で手間取った。
csv操作においてPythonとPandasは利便性高いと改めて実感しました。
Qiitaの横幅を広くする

備忘録を置いておく場所として日ごろお世話になっている技術ブログがあるのですが、
せっかく広い画面で眺めていても、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/f370a923-a349-3c2c-3c3b-4cfab1454f25.png)

こんな感じになってしまいます。
洗練されたデザインもよいですが、ソースコードを眺める時にもう少し実用性がほしい…。
そんな時は、

１．ブラウザ (今回はChromeを使用しています) からデベロッパーツールを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/8eea14dc-c97d-c9cf-26df-17e6d4399e03.png)

２．要素タブを選択 > 要素リストにマウスポインタを置きCtrl+F >  ```p-items_main``` と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/e9469156-4229-f99a-1dc1-501b4ac0279e.png)

３．フィルタ入力ボックス右の.clsをクリック >  p-items_main のチェックを外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/4496d245-b47b-6155-9aed-2109862adfb8.png)

４．広くなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/5b042223-9e42-9cb0-4406-280f27ccf3f9.png)

以上です。
Unity Wiiリモコン 備忘録

# 誰かの役に立つかもなので殴り書きで残すことにする。
(自分の殴り書きメモを貼っつけてるだけなので見にくかったらすまん。)

(2024/0403)
意地と執念でwiiリモコンをunityに接続してボタンとか傾き加速度持ってこれた。

でも音声が別問題でこれも意地と執念でめっちゃ格闘してなんとかunityからリモコン側に音を出させることはできたんだけど、とても元の音源は分からないノイズみたいな音しか出せなかった。

形式はmono / 8bits / 2000hz / PCM固定なのは分かったけど、ここで格闘するより次のゲームの処理を作ったほうが良さそうだから、wiiリモコン対応は一旦後回しにする。

# wiiリモコンのpcとの接続:
step1: bluetooth → join a personal area network → add device → wiリモコンの1、2同時押し→pin何も入力無しで接続 → led点滅状態になる
step2: touchmote をwindowsにインストール。
これでpcとはつながる。

次に
https://github.com/Flafla2/Unity-Wiimote
クローンするなり、zipでダウンロードするなりでunityに導入。サンプルシーンに使い方は書いてある。

Wiiリモコン接続 参考:
https://booth.pm/ja/items/1274047
https://nn-hokuson.hatenablog.com/entry/2016/09/28/205448
https://bibinbaleo.hatenablog.com/entry/2017/10/27/174456
https://swamptk.hatenablog.com/entry/2018/01/21/192414

サウンド回り参考:
https://github.com/Flafla2/Unity-Wiimote/pull/49
https://wiibrew.org/wiki/Wiimote#Speaker_Configuration
https://pu2x.hatenablog.com/entry/2017/04/05/204826
http://netadm.iss.tokushima-u.ac.jp/soft/dev/WiiRemote.pdf
ITパスポート IoTシステムと組込みシステム

・IoT（コネクテッドデバイス）
様々なモノをインターネットに接続し、データを収集することで、自動制御などを実現する仕組み
・センシング
センサを使って、測定対象の定量的な情報を取得する技術
・アクチュエータ
コンピュータが出力した電気信号を回転運動や直線運動など力学的な運動に変えるもの
・エッジコンピューティング
IoT端末から近い場所にもある程度の処理ができるサーバを置き、タイムラグを少なくする考え方
・M to M
機械同士がネットワークを介して通信すること
・ドローン
無線で操縦する無人飛行機
・アクティビティトラッカ
体に装着してセンサにより歩数や移動距離、心拍数などを計測できるもの
・テレマティクス
自動車の車載機に通信機能をもたせ、GPSデータや走行状況のデータを送信したり、渋滞情報を取得したりすること
・エネルギーハーベスティング
太陽光や機械の発する振動、熱などのエネルギーを採取して電力を得る技術
・HEMS
家庭内の太陽光発電装置や家電などをネットワーク化して、エネルギーの可視化と電力消費の最適制御を行うこと
・スマートメータ
双方向通信機能を備えた電力量計
・PoC
新しい概念や理論、アイディアなどが実現可能かを実証すること
・LPWA
低速、広域、低電力のネットワーク

・組込みシステム
ある特定の機能を実現するために専用化されたハードウェアとそれを制御するソフトウェアから構成されるシステム
・マイクロコンピュータ
CPUやメモリ、入出力回路などを全て一つのICチップ内に収めたコンピュータ
・ファームウェア
ハードウェアの基本的な制御を行うソフトウェア
[検証] softmax はどれだけ遅いのか

## はじめに
「ゼロから作る Deep Learning」を読んでいると，以下の文が目に入ってきた．
> (中略)ソフトマックス関数を適用しても、出力の一番大きいニューロンの場所は変わりません。そのため、ニューラルネットワークが分類を行う際には、出力層のソフトマックス関数を省略することができます。実際の問題では、指数関数の計算は、それなりにコンピュータの計算が必要になるので、出力層のソフトマックス関数は省略するのが一般的です。

斎藤 康毅 著，ゼロから作る Deep Learning，O'Reilly Japan，2016，p70-71 より引用．

実際のところどうなるか検証してみた．

## 検証

### 環境
* Windows 11
* Python 3.10.9
* torch 2.1.2
* AMD Ryzen 5 5600X 6-Core Processor 3.70 GHz (念のため)

### 方法
1000行のベクトルへの演算を1000回計算し，合計時間を計測する．
softmaxだけ，argmaxだけ，softmax+argmax の3通りで検証する．

### ソースコード
```Python
import torch
from torch import nn
import time


N = 1000 # 特に理由はないが，ImageNet など，1000クラス分類をしている想定
x = torch.randn(N,N,dtype=torch.float64)
m = nn.Softmax(dim=0)

# softmax のみ
t_start = time.time()
for i in range(N):
    y = m(x[i])
t_end = time.time()

print("softmax :",(t_end - t_start)*1000,"[ms]")

# argmax のみ
t_start = time.time()
for i in range(N):
    index_y = torch.argmax(x[i])
t_end = time.time()

print("argmax :",(t_end - t_start)*1000,"[ms]")

# softmax + argmax
t_start = time.time()
for i in range(N):
    y = m(x[i])
    index_y = torch.argmax(y[i])
t_end = time.time()

print("softmax + argmax : ",(t_end - t_start)*1000,"[ms]")
```

### 結果
```
softmax : 14.510393142700195 [ms]
argmax : 11.507749557495117 [ms]
softmax + argmax :  18.867015838623047 [ms]
```

### 考察
たしかに微増しているが，そこまで神経質になるほどかは疑問である．
何度かプログラムを実行しても計算時間は安定しなかったので，別の原因がありそう．
おそらくcpuのキャッシュとか？(適当)

## 参考文献
* https://qiita.com/umapyoi/items/7f0de31c2ac89d3c8338
* https://pytorch.org/docs/stable/generated/torch.nn.Softmax.html
* https://pytorch.org/docs/stable/generated/torch.argmax.html
* https://pytorch.org/docs/stable/generated/torch.randn.html
* Ryzen 5 5600Xの性能・スペック : https://www.dospara.co.jp/5info/cts_str_parts_ryzen5.html
* 斎藤 康毅 著，ゼロから作る Deep Learning，O'Reilly Japan，2016
Golfing Paradise Awaits: Bonita Bay Golf Courses for the Discerning Player!

Nestled along the serene shores of Southwest Florida lies a golfer's utopia: <a href="https://www.bonitabayclub.net/">Bonita Bay Golf Courses</a>. For the discerning player seeking an unparalleled golfing experience, this oasis offers much more than just well-manicured fairways and challenging holes. It promises a journey of luxury, relaxation, and pure sporting delight.

Discovering Bonita Bay Golf Courses

As you step onto the lush green expanses of Bonita Bay, you're immediately greeted by the breathtaking beauty of its surroundings. Surrounded by nature preserves and sparkling waterways, each of the five impeccably designed courses offers a unique blend of natural landscapes and expertly crafted layouts. From the Arthur Hills-designed Creekside course to the picturesque Marsh course, every round promises an adventure through stunning scenery and strategic challenges.

Luxury Beyond the Fairways

Bonita Bay Golf Courses don't just cater to your on-course experience; they elevate it to a whole new level of luxury. State-of-the-art clubhouses provide a haven of comfort and sophistication, where players can unwind after a rewarding round. Whether you're indulging in a gourmet meal at one of the fine dining establishments or relaxing with a post-game massage at the spa, every aspect of your visit is tailored to exceed your expectations.

Exceptional Service, Every Step of the Way

What truly sets Bonita Bay Golf Courses apart is their unwavering commitment to service excellence. From the moment you arrive until the time you depart, a team of dedicated professionals is on hand to ensure that your every need is met with warmth and efficiency. Whether it's arranging tee times, providing expert advice on equipment, or offering personalized instruction to improve your game, their goal is to make your experience unforgettable.

The Perfect Destination for Discerning Players

For the discerning golfer who demands nothing but the best, Bonita Bay Golf Courses stand as the ultimate destination. Whether you're seeking a challenging round of golf amidst stunning natural beauty or a luxurious retreat from the stresses of everyday life, this hidden gem offers it all and more. So, pack your clubs, prepare for an unforgettable adventure, and discover why Bonita Bay Golf Courses truly are a golfing paradise for the discerning player.
【CSS】最初の子要素に特定のスタイルを適用する方法

※実装中に悩んだので備忘録として投稿する。

下のコードは全thタグの文字に青色が適用されている。
ここから、一番上のthタグの文字「Python」の色を変更したい。
```html
<table>
    <tbody>
        <tr><th>Python</th></tr>
        <tr><th>Java</th></tr>
        <tr><th>Swift</th></tr>
        <tr><th>MySQL</th></tr>
        <tr><th>HTML/CSS</th></tr>
        <tr><th>Javascript</th></tr>
        <tr><th>AWS</th></tr>
    </tbody>
</table>
```

```css
th {
    text-align: left;
    color: blue;
}
```

## 【失敗例】
th:first-childで先頭のthを指定する考えだったが、「trタグ要素の中の一番最初のthタグを指定」という意味になってしまい全てのthにデザインが適用されてしまった、、、
```css
th:first-child {
    color:red;
}
```

## 【成功例】
「tableタグの中にある一番最初のtrタグを選択し、さらにその子要素であるthを指定」と視点を1階層上にずらしてあげることによって先頭の行だけ文字の色を変更することが可能になる。

```css
th {
    text-align: left;
    color : blue;
}

tr:first-child th {
  color: red;
}
```


実行結果
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="abxEzPN" data-user="kaesjfqa-the-styleful" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kaesjfqa-the-styleful/pen/abxEzPN">
  先頭のthの指定(成功)</a> by devkamura (<a href="https://codepen.io/kaesjfqa-the-styleful">@kaesjfqa-the-styleful</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
【JavaScript】関数に仮引数を指定して処理を共通化しよう

異なる値に対して処理が重複している場合は関数に仮引数を指定して処理を共通化（一本化）する事ができる。

## 例題
例えば以下の様な感じで**別々の入力フォームから取得した値を格納する変数**があったとします。
※value値を取得するタイミングはクリックイベントとします
```diff_javascript
const inputVal1 = document.getElementById('hoge1').value; //値 (1)
const inputVal2 = document.getElementById('hoge2').value; //値 (2)
```
入力した値を金額として出力したいが、その前に取得した値が三桁以上ならコンマ区切りにしておきたい。
単純に書くとこんな感じです。
```diff_javascript
const price1 = Number(inputVal1).toLocaleString();
const price2 = Number(inputVal2).toLocaleString();
```

:::note
```<input type="text">```で取得することを想定しているので```Number()```で数値型に変換しています。
:::

このままでも問題ないですが```Number().toLocaleString()```が重複しています。
**「2つしかないなら別に大丈夫でしょ。」** と思いますが、実務となると複数（2つ以上）の値に対して処理を行う事を想定する必要があります。
また複数の値に対して同じ処理を行うとなった際、コピペだろうとタイプミスしてしまうなど懸念があります。
## 仮引数を指定した関数を作成する
そこで桁数に応じてコンマ区切りの処理を実行してくれる関数を作りました。
```diff_javascript
function hoge(valType){// valTypeが仮引数
    const hogeVal = Number(valType).toLocaleString();
    return hogeVal
}
```
関数を使用するので、出力用の変数を以下のように書き換えます。
```diff_javascript
const price1 = hoge(inputVal1);
const price2 = hoge(inputVal2);
```
**仮引数を指定することで処理を行いたい値を柔軟に指定することが出来ます。**
仮引数の部分を**変数名=実引数**にすることで異なる値に同じ処理を行う（共通化する）ことが可能になります。

:::note warn
```return 変数名```が無いと結果が```undefined```になるので注意が必要です。
:::

## 処理を共通化してコードをシンプルにする
処理を纏められると**コード量が抑えられますし、手直しの箇所が明確になる**というメリットがあります。
ただ短く書けたとして、それが可読性の高いコードになるかと言われたら別ですが、、、明らかに纏められる（纏められるのでは？と思える）処理は積極的に共通化するアプローチをとってもいいと思います。

今回の例題はあくまでも業務上で遭遇したものからかなり上澄みを紹介したものになりますが、今後の実装のヒントになりましたら幸いです。
Pythonで「日付や時刻の一部の値を別の値に置き換えたインスタンスを生成する」の動作を確認してみた

# 概要

Pythonで「日付や時刻の一部の値を別の値に置き換えたインスタンスを生成する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/date/index7.html

# 実装

以下のファイルを作成しました。
```sample.py
import datetime
tokyo_tz = datetime.timezone(datetime.timedelta(hours=9))
dt = datetime.datetime.now()
print(dt);
print(dt.replace(hour=4, minute=0, second=0))
print(dt.replace(year=2018, month=4, day=1))
print(dt.replace(tzinfo=tokyo_tz))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
2024-04-03 01:51:34.871159
2024-04-03 04:00:00.871159
2018-04-01 01:51:34.871159
2024-04-03 01:51:34.871159+09:00
```

# まとめ

何かの役に立てばと。