OmniAICreator/Qiita-1.07M huggingface dataset:
Electronでレシート印刷する

　きっと似たようなことをしてる人はいて、情報は溢れてるとおもってたら、そうでもなくて、結構ハマったので、記録を残しておきます

# システム
* Windows 10
* Electron 25.3.1
* レジシステムはWebクラウドサーバ側
* Electronアプリは、そのフロントエンド


# 手順
## クラウド側JSから印刷指示と、レシートURLをイベント発火

```JavaScript
window.dispatchEvent(new CustomEvent('print-recipt', { detail: { url: url, href: window.location.href } }));
```

クラウド側システムの都合でリファラがいるので、それも一緒に送る

## Electronのpreloadプロセスでイベント中継
preload.js

```JavaScript
window.addEventListener('print-recipt', function (e) {
    electron.ipcRenderer.send('print-recipt', e.detail);
});
```

## 印刷処理
<details><summary>main.js</summary>

```JavaScript
ipcMain.on("print-recipt", function (ev, arg) {
    let printWindow = new BrowserWindow({
        parent: mainWindow,
        show: false
    });
    printWindow.webContents.on('dom-ready', () => {
        try {
            printWindow.webContents.print({
                silent: true,
                deviceName: config.receipt.printer,
                margins: {
                    marginType: 'custom'
                    , left: 0, right: 0, top: 0, bottom: 0
                },
                pageSize: { width: 72000, height: 100000 },
                dpi: { horizontal: 203, vertical: 203 },
            }, function () {
                printWindow.close();
            });
        } catch (error) {
            console.log("dom-ready:printCatch:" + error);
        }

    });
    printWindow.loadURL(config.url + arg.url, { httpReferrer: arg.href });
});
```

</details>

* webContents.printのパラメータにpdiを入れないと正常に印刷されない。
* pageSizeの単位はミクロン単位 (1000micron = 1mm) (https://qiita.com/yhatt/items/0bf65699a538d5508c33)

<details><summary>receipt.html</summary>


```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <style type="text/css">
        <!--
        @page {}

        @media print {
            body {
                font-size: 12px;
                margin: 0;
                padding: 0;
                width: 100%;
            }

            div {
                padding: 0;
                margin: 0;
            }
        }

    </style>
    <title>レシート</title>
</head>

<body>

//以下略
```
</details>
【WordPress】【ワードプレス】よく使う関数

# アクションフックとは

## 特定のタイミングで独自の処理をさせる事ができる仕組みの機能


```php
function 関数名(){

}
add_action( 'アクションフック名', '関数名' );

  // 投稿ユーザーならば
    if (current_user_can('author')) {
}
```

# add_action
|アクションフック名|解説|
|---|---|
|**admin_print_styles**|****|
|**wp_enqueue_script**|****|
|**wp_head**|****|
|**admin_init**|**ユーザーが管理画面にアクセスする時にフック**|
|**add_action**|****|
JSON

## JSON

:::note
JavaScript Object Notationのこと
**データを表現するための軽量で簡潔なデータ形式**
**JavaScriptのオブジェクト記法に基づいて**いて、多くのプログラミング言語でサポートされてる
:::

## JSONの特徴

### **テキストベースのデータ形式**

- 人間が読み書きしやすい
- プログラム間でデータをやり取りするのに適している

### キーバリューのペア
- キー : 文字列（ダブルクォートで囲まれたテキスト）が使用できる
- 値 : 文字列、数値、真偽値、配列、ネストされたオブジェクトなどのデータ型が使用できる
**☆JSONはキーバリューのペアを使ってデータを表現する**

### 配列
- 配列は角括弧 [ ] で表現する
**☆JSONは複数の値を順序付けて格納するための配列をサポートする**

## JSONの例（人物の情報を表現）

```json

{
  "name": "David",
  "age": 32,
  "isMarried": false,
  "hobbies": ["reading", "swimming", "coding"],
  "address": {
    "city": "New York",
    "zipCode": "10001"
  }
}
```


:::note
**キーバリューのペアで名前や年齢、結婚状態などの属性を持っている
hobbiesとaddressは配列とネストされたオブジェクトを含んでいる**
:::
【個人開発 React / Firebase】本・映画・テレビドラマを記録するウェブアプリを作りました。


# 開発アプリ概要

アプリ名：[StoryLog（ストーリーログ）](https://storylog.site)


読書・映画鑑賞の管理、記録をすることができるウェブアプリです。

Web URL: [https://storylog.site](https://storylog.site)

<br>
<img class="size-medium wp-image-3811 aligncenter" src="https://poland-it-blog.com/wp-content/uploads/2023/07/movie-800x439.gif" alt="" width="500" height="281" />


# 機能
**統計**

読んだ本、見た映画の本数が分かるグラフ機能付き。年・月ごとのデータを確認することができます。

<img class="size-medium wp-image-3811 aligncenter" src="https://poland-it-blog.com/wp-content/uploads/2023/07/analytics-all-768x422.gif" alt="" width="500" height="281" />

タグ別での統計も確認できるので、例えば劇場で見た映画・旧作別の年間本数が一目で分かります。

<img class="size-medium wp-image-3811 aligncenter" src="https://poland-it-blog.com/wp-content/uploads/2023/07/analytics-tag-768x422.gif" alt="" width="500" height="281" />

**カレンダー機能**

開始日と終了日を入力することで、本を読み終えるのに何日かかったのかを確認することができます。

<img class="size-medium wp-image-3811 aligncenter" src="https://poland-it-blog.com/wp-content/uploads/2023/07/calendar-768x422.gif" alt="" width="500" height="281" />

**カンバンボード**

積読や現在視聴中のテレビドラマなどを管理するために、ボード機能を実装しました。

<img class="size-medium wp-image-3811 aligncenter" src="https://poland-it-blog.com/wp-content/uploads/2023/07/kanban-768x422.gif" alt="" width="500" height="281" />



# アピールポイント
+ タイトル、著者名の他にもメモの内容からでも検索可能
+ 読んだ本、見た映画の本数が分かるグラフ機能
+ カレンダー機能
+ カンバンボード機能


# 使用技術
 React
 Firebase 
 各種API　( The Movie Database (TMDb) / Rakuten Books Total Search API )


# 技術スタック




こちらがインフラ構成です。
<br>
![代替テキスト](https://poland-it-blog.com/wp-content/uploads/2023/07/9a9b781143caf46d2c4ec1e069cb9858.png)


## Front-end

フロントエンドは React.js 。


## Back-end

バックエンド・インフラ周りは すべてFirebaseで完結しています。

+ Authentication: ユーザー認証
+ Firestore: データ管理
+ Functions: 設定したトリガーでバックエンド処理を自動的に実行
+ Storage: プロフィール画像保存
+ Hosting: デプロイ


## API

API は書籍に関しては、[Rakuten Books Total Search API](https://webservice.rakuten.co.jp/documentation/books-total-search)、映画・テレビドラマに関しては[The Movie Database (TMDb)](https://developers.themoviedb.org/3/search/search-movies) を使用しています。


## デザイン

MUIプレミアムテンプレート [Minimal - Client and Admin Dashboard](https://mui.com/store/items/minimal-dashboard/) を使用しています。




# 最後に

このアプリは完璧な趣味プロダクトです。


以前[こちら](https://qiita.com/sho373/items/8b4e6074ac106b39bd05)のQiita記事に記載した個人開発サイトに機能を追加し、リニューアルしたものになります。

https://qiita.com/sho373/items/8b4e6074ac106b39bd05
[Flutter] FirebaseのsignInのエラーの一覧

![スクリーンショット 2023-07-27 17.03.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/72955cae-e1d5-ced1-6cb3-c2f2dbf1f9c3.png)


ちゃ！いせりゅーです。

今更ですが、Firebaseを使用したアプリを作成しております。

FireaseのsignInのエラーの一覧を記載してみました。エラーハンドリングの際に参考になればなと思っております。

:::note alert
これもあるよ！というものがあればコメントいただけると嬉しいです😁
:::


# 
```
[firebase_auth/invalid-email] The email address is badly formatted.
```
### 解説
- 指定したメールアドレスが適切な形式でないことを示しています。
- ユーザーがメールアドレスの入力欄に何も入力せずに送信したり、"username@"や"@domain.com"のような不完全なメールアドレスを送信した場合にこのエラーが出ることがあります。
- メールアドレスは一般的に「username@domain.com」の形式ではないとエラーになります。

### おすすめメッセージ
- 「入力したメールアドレスが正しくない形式です。もう一度確認してください。」

# 

```
[firebase_auth/weak-password] Password should be at least 6 characters'
```
### 解説
- パスワードが6文字以上じゃないといけないっぽいですね。

### おすすめメッセージ
- 「パスワードは最低でも6文字以上で設定してください。」
- 「あなたのアカウントの安全のため、パスワードは6文字以上を推奨します。」

# 
```
[firebase_auth/email-already-in-use] The email address is already in use by another account.
```

### 解説
- 入力したメールアドレスがすでに作成されている場合のメッセージですね。
- 一つのメールアドレスは一つのアカウントにしか紐づけられません。

### おすすめメッセージ

- 「指定されたメールアドレスは既に他のアカウントで使用されています。」
- 「ご指定のメールアドレスは他のアカウントで既に使用されています。他のメールアドレスをお試しください。」
- 「あなたが入力したメールアドレスは他のアカウントによって既に登録されています。もしパスワードを忘れた場合は、パスワードリセットをお試しください。または、新たなメールアドレスをご利用いただくことをおすすめします。」


# 最後に

いいFirebaseライフを送りましょう😁
【WordPress】【ワードプレス】権限の設定

# 投稿者の権限を設定
```php
function add_theme_caps(){
  // 投稿者の設定をする
  $auth_role = get_role( 'author' );
  // 非公開の投稿ページを編集
  $auth_role->add_cap( 'edit_private_posts' );
  // 非公開の投稿ページを閲覧
  $auth_role->add_cap( 'read_private_posts' );     
  // 他ユーザーの投稿ページを編集
  $auth_role->add_cap( 'edit_others_posts' );
  // 固定ページを編集
  $auth_role->add_cap( 'edit_pages' );
  // 非公開の固定ページを編集
  $auth_role->add_cap( 'edit_private_pages' );
  // 非公開の固定ページを閲覧
  $auth_role->add_cap( 'read_private_pages' );
  // 公開中の固定ページを編集
  $auth_role->add_cap( 'edit_published_pages' );
  // 他ユーザーの固定ページを編集
  $auth_role->add_cap( 'edit_others_pages' );
  // HTMLフィルタリング。※有効でないとhtmlが壊れる可能性がある
  $auth_role->add_cap( 'unfiltered_html' );
}
add_action( 'admin_init', 'add_theme_caps' );
 ```
# 投稿者の権限に制限をつける
```php
function remove_theme_caps(){
    // 投稿者の設定をする
    $role = get_role( 'author' );
    // 公開中の投稿ページを削除できないようにする
    $role->remove_cap( 'publish_posts' );
    // 投稿ページを公開できないようにする
    $role->remove_cap( 'delete_published_posts' );
}
```

# add_action
|用途|コマンド|
|---|---|
|**admin_init**|**cd  ..**|
|**wp_enqueue_scripts**|**cd  ../..**|
|**コマンドの履歴**|**history**|
|**コンソールクリア**|**clear**|
Ubuntu Dummy output+サウンドカード行方不明の対処まとめ

# 始まりは単にサウンドカードから音が出なかった

:::note info
- Setting soundの項目にはLineOutとHDMIが存在していました
- AC897チップです
:::

**しかし！音がならない**
## そこでサウンド関連のpulseとalsaの再インストール敢行

https://abillyz.com/mamezou/studies/793

- まず頼ったのこちらの手順。記事では無事にサウンドがなっています
- 当方の場合ですが、ますますひどいことに・・・

**事件です**
- サウンドがDummy outputになってしまいました・・・

<details><summary>ささやき</summary>


:::note info
カーネルじゃない？
:::

</details>


## Dummy outputって？と調べる
- 日英結構古くからの伝統的なトラブルの様ですね。

https://askubuntu.com/questions/1359038/pulseaudio-has-no-sound-only-has-dummy-output

https://zenn.dev/t13row/articles/d617b4ee49e319

- 今度はこの2記事を参考にしてみます。

:::note info
お二人とも解決決していますが、私は解決しませんでした・・・
:::


## Pulseのプロセスを止めて動かす
**前のチャプターでは一応、サウンドカード名がコマンドラインでは見えていたのに・・・見えない**
- これは困った。
- 非常に困った。

https://askubuntu.com/questions/1242766/ubuntu-20-04-dummy-output-no-sound-card-in-use

- エラー表示を元にコマンドを打つもダメ

https://forums.ubuntulinux.jp/viewtopic.php?id=15736

- 上記の症状もあったので試してみるもダメ



<details><summary>ささやき</summary>


:::note info
カーネルじゃない？
:::

</details>


# 最後の手段でカーネルを落とす

:::note info
- そういえば、カーネルが最近上がっていました。5.19.50でした。
- 手ごろなところで5.15.xxで行こう
:::

- 幸い、すでにインストールのカーネルがあったため、こちらを選択したい
- GRUBになってしまう。



## 冷静に e を押してGRUB Menuを開く
- 5.15.0-78にすると

**無事に音が鳴りました**

### 第一声はビズ〇ーチ！！
音声確認の為YouTubeをひらいたらでました・・・

## その他参考資料

https://www.linuxadictos.com/ja/solucion-al-problema-permission-denied-e-pulseaudio-main-c.html


https://askubuntu.com/questions/1436452/only-dummy-audio-on-laptop-when-updating-from-ubuntu-22-04-to-22-10

♯ 結論
- 心の声はカーネルでしたが、どうしても手間が・・・
- 手間を惜しんではいけません。今回はたまたまあったからよかったけど。


:::note warn
● 注意
その他、UbuntuではWindowsではやけどしないのに、画面が真っ暗とか、色変るとかいろいろあるので、
皆さん気を付けましょう。
:::


# カーネルを上げて改善したパターン(13th Dec 2024追記)
**このパターンではサウンドカードは認識していました**
- Pulse Audio volume control ではbrowserのボリュームののみ変動。
- でもNo sound、音がならない

:::note info
- こちらもカーネルが5.19.50でした。
- 5.19.16-051916-generic　へアップして音が出るようになりました
:::

https://kernel.ubuntu.com/mainline/

1. 対応するCPUのカーネルの関係ファイルを一つのディレクトリにまとめて保存
1. 以下コマンド実行

```Ubuntu:terminal
sudo dpkg -i *.deb

```
- 忘れずに

```Ubuntu:terminal

sudo update-grub

```

- Check します

```Ubuntu:terminal

grep "menuentry " /boot/grub/grub.cfg

```

## 参考リンク

https://www.kernel.org/

- カーネルを変更する際に必要なダウンロード先

# Visitor who come from search engine.
## summary

:::note info
Explain

Regarding the this Article which is trouble shooting for no sound issue.
- You can find useful link to resolve.
- In my case Latest Kernel version make trouble and downgrade it.
- In case, you may plug the connector to wrong port. Please check them well.

Hope you can recover from no sound issue!

:::
When you want to use SSL with htaccess on xserver

Access restrictions and redirect settings are set for the setting domain
Temporarily disable them until the update is completed.

Link: https://www.xserver.ne.jp/manual/man_server_ssl.php

It's troublesome to have to disable .htaccess every time you set up and update SSL. It's a workaround.

There is such access when setting SSL.

```access.log
hoge.jp **.**.**.** - - [06/May/2022:10:19:17 +0900] "GET /.well-known/acme-challenge/Hoge123Fuga456hoge789Fuga HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt validation server; +https://www.letsencrypt.org)" 
```

Therefore, you should exclude this access. example:

```.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP_USER_AGENT} !letsencrypt #これを追加
    RewriteRule ^(.*)$ public/$1 [QSA,L]
</IfModule>
```
"デザイン通りに作る" の1歩先に行くためのチェック項目の模索

# ”デザイン通りに作成" から1歩先に行くチェック項目の模索
デザイン通りに作成することは非常に重要で、素晴らしい技術です。
私が、デザインを実装に落とし込む前に考えることを列挙してみました。

デザイン自体を作る上で、ではなく
もらったデザインを実装する前に、エンジニアとして確認したい項目になります

もしこれ以外にもこんなことを考えている
ここに注意したいなどがあれば是非コメントをください:eyes:

重要項目に関しては別記事で情報を掲載して居ます。

## 簡易チェック項目

### デザイン意図の確認
- [ ] ユーザーにどのような印象を与えたいのか、どうなって欲しいのか理解して実装を始めよう
- [ ] 余白、文字サイズ、色、配置、コンテンツ内容、それぞれの意図はなんであるか理解しよう

### 保守と開発的な目線
- [ ] [MDN](https://developer.mozilla.org/ja/docs/MDN/Writing_guidelines/Experimental_deprecated_obsolete)で非推奨、廃止になったデザインでないか確認しよう
- [ ] PCとSPでのHTML構成差分が無いか、確認してから実装しよう
- [ ] SPは何px以下からか、タブレット時の挙動がどうなるのか確認しよう
- [ ] jsやCSSで簡易的に実装ができ、挙動に無理がないかチェックしよう
- [ ] ChatGPTなどのAIだけで挙動が実装できる js だと保守もしやすいのでおすすめ

### ロジック的な目線
- [ ] 0件時、膨大な件数時、表示ロジックなどのシステム的例外デザインがあるか
- [ ] サイトで利用するカラーリストから外れていないか
- [ ] 画像のアスペクト比の指定があるか、システム的な `validation` も考慮されているか
- [ ] jsやHTMLパーツの書き換えで意図しないリクエストが送信できるような設計になって居ないか

### ビジネス的な目線
- [ ] KPIを達成する事に適したデザインであるか
- [ ] 既存パーツを阻害し、売上既存に繋がって居ないか
- [ ] ページ全体を見まわし、ユーザーが取るべき行動が明確になっているデザインか
- [ ] 想定デバイスでファーストビューに魅せたいコンテンツが入るか
- [ ] ターゲットユーザーに沿ったデザインであるか

### レンダリングスピード
- [ ] レンダリングコストの高くなる、不要なDOMパーツのネストやロジックが無いか
- [ ] レンダリングコストが高い場合、viewのフラグメントキャッシュが可能か？
- [ ] 利用する画像のサイズは適切か？次世代フォーマット(webp)などに圧縮したか
- [ ] LCP（最大コンテンツ）となるのはどのパーツか、読み込みの最適化はできているか

### SEOや計測の観点
- [ ] イベントの設置をする場合は各パラメータ、計測と改善を行えるか
- [ ] SEO的に評価されやすい構造か（JSの非同期テキスト埋め込みなどを避ける）
- [ ] 構造化マークアップ可能な構成か
Aurora MySQLでrds_superuser_roleを使う時の注意点

Aurora 3.x（MySQL 8.x）で新設されたロールベースの権限付与は、便利だが一点ハマりポイントがあるので共有。

# 最初に結論
ロールをアクティベートすることを忘れないこと。
権限ベースの時と違って、GRANTだけでは権限が有効にならない。

# 設定方法

大きく分けて、4種類ある。詳しくは[本家の公式ドキュメント](https://dev.mysql.com/doc/refman/8.0/ja/roles.html)を参照。

ちなみにAuroraの公式ドキュメントにも、[ちょっぴりだけ記載](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraMySQL.Compare-80-v3.html#AuroraMySQL.privilege-model)がある。~~もうちょっと丁寧に書いといてくれるとハマらずに済むのだが。。。~~

> To simplify managing permissions for many users or applications, you can use the CREATE ROLE statement to create a role that has a set of permissions. Then you can use the GRANT **and SET ROLE statements** and the current_role function to assign roles to users or applications, switch the current role, and check which roles are in effect. 

### 方法1) SET ROLEで一時的にセット

当該セッションでのみアクティベートされる。

```sql
SET ROLE rds_superuser_role;
```

### 方法2) SET DEFAULT ROLEで恒久的にセット

そのユーザーについては恒久的にアクティベートされる。

```sql
SET DEFAULT ROLE 'rds_superuser_role' TO <ユーザー名>;
```

### 方法3) パラメーターグループでセット

`activate_all_roles_on_login`を1にセットすると、クラスター内の全てのユーザーに対して、既定でアクティベートされる。おそらくこれが一番楽。
ちなみにDBパラメーターグループの方にあり、デフォルト値は`0`（Aurora MySQL 3.03.1の頃に新規作成したDBパラメーターグループで確認）。

# 設定例

### よい設定例
```sql
GRANT rds_superuser_role TO 'aurora_dba_user'@'%';
SET DEFAULT ROLE 'rds_superuser_role' TO 'aurora_dba_user'@'%';
```

### 悪い設定例
```sql
GRANT rds_superuser_role TO 'aurora_dba_user'@'%';
```

### 確認方法

`SELECT current_role();`を使って、ロールがアクティベートされているかを確認できる。
結果が`NONE`だとアクティベートされてません。

```sql
SELECT current_role();
+--------------------------+
| current_role()           |
+--------------------------+
| `rds_superuser_role`@`%` |
+--------------------------+
```

ちなみに`SHOW GRANTS`だけでは全く見分けが付かないので注意。
- マスターユーザーと同じ権限割り当てなのに...
- `SHOW GRANTS FOR rds_superuser_role`見ても内容同じだし...

という感じで、しばらく悩んだ。


# まとめ
デフォルトのマスターユーザーを使うことは推奨されていないので、同権限のDBAユーザーを作ることになると思うが、その際の要注意ポイントのひとつ。
また、[マルチユーザー戦略のシークレットローテーション](https://qiita.com/itsuki3/items/d4d9bb0289ceb332bc8f)を使う場合のローテーションユーザーでも、同じく注意が必要。
Vueの勉強③

v-onについて

```
v-on:イベント名　= "メソッド名"
```
省略形
```
@イベント名 = "メソッド名"
```

イベント名には色々な種類があり、今回はclickを使いました。
単純ではあるが使えるようになるとWed制作に有利になると思いました。

これから他のイベントも使って試していきたいと思います。
LaravelのSailを使って起動したMySQLの設定を消去したい

Laravelのローカル環境Sailですが、軽量で使いやすいです。
実態は Docker Composeで、MySQLなどをまとめて起動してくれます。

パスワードなどの設定は .env を参照して初回起動時に設定されます。

```yaml: docker-compoe.yaml
    mysql:
        image: 'mysql:8.0'
        ports:
            - '${DB_PORT}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
```

.env と連動して起動するので便利なのですが、パスワードを変更したい場合には手間が必要です。

コンテナはDocker上でdocker volumeが作成されており、これを消して起動し直せば初期化されます。




下記のようにするとvolumeを削除してくれます。データが消えますので注意してください。

```bash
sail down --volumes
```

`docker volume ls` とかするとvolume一覧を確認することができます。


` -- --rm` とかでオプションを渡すこともできそうな気がしたのですが見つかりませんでした。
InSpec とは？

Chef InSpecは、システムやアプリケーションのセキュリティやコンプライアンスを確認するためのオープンソースのツールです。Ruby コードベースでテストを記述して実行し、システムが特定のセキュリティ基準や規制要件を満たしているかどうかを評価します。

コンピュータシステムやサーバー、クラウドリソースなどを検査して、セキュリティの問題や規制遵守の状態を確認するためのツールです。
例えば、特定のパスワードポリシーやファイアウォールの設定、パッチ適用の状態などをテストし、セキュリティ上のリスクを特定することができます。

テストコードをシンプルな形式で書くことができ、コンプライアンス要件に対するテストスイートを簡単に作成できるのが特徴です。これにより、システム管理者やセキュリティエンジニアは、自動化されたテストによってシステムのセキュリティとコンプライアンスを監視し、問題があれば迅速に対処することができます。

Progress という企業によって開発されており、DevOpsプラクティスやセキュリティ管理の一環として広く利用されています。

以下は、Chef InSpecの主な特徴です：

1. __自動化されたテスト__: Chef InSpecはコードとしてテストを記述し、自動化されたテストスイートを実行することができます。これにより、手動での繰り返しテスト作業を減らし、時間と労力を節約することができます。

2. __様々なプラットフォーム対応__: Chef InSpecは、さまざまなオペレーティングシステムやクラウドプロバイダ、コンテナ技術に対応しています。これにより、複数の環境やプラットフォームにわたって一貫したテストを実行できます。

3. __セキュリティとコンプライアンスのチェック__: システムのセキュリティやコンプライアンスポリシーをテストコードとして表現し、システムが要件を満たしているかを自動的に検証します。これにより、セキュリティ上の脆弱性や規制遵守の問題を早期に発見できます。

4. __ドキュメントとしての価値__: Chef InSpecのテストコードは、システムの設定や要件を明確に文書化する役割も果たします。これにより、システムのドキュメントとしての価値も持ちます。

Chef InSpecの必要性は、以下のような点で理解できます：

1. __セキュリティとコンプライアンスの保証__: Chef InSpecを使用することで、システムがセキュリティ上の要件や規制に準拠していることを確認できます。これにより、セキュリティ脆弱性や法的なリスクを軽減し、信頼性のあるシステム運用が可能となります。

2. __自動化による効率化__: 手動での繰り返しテストは時間とコストがかかりますが、Chef InSpecを使用することで自動化されたテストを実行できます。これにより、テストの実行時間が短縮され、開発者やシステム管理者の負担が軽減されます。

3. __ドキュメントとしての利用価値__: Chef InSpecのテストコードはシステムの設定や要件を明確に表現します。これにより、システムのドキュメントとしての役割を果たすだけでなく、他のチームとのコミュニケーションやシステムの理解にも役立ちます。

総括すると、Chef InSpecはシステムのセキュリティ、コンプライアンス確保と、自動化による効率化、システムの文書化という観点から非常に重要なテストフレームワークと言えます。これにより、信頼性の高いシステム運用とチーム間の効果的なコラボレーションが可能となります。

InSpec のダウンロードはこちらからできます。

https://www.chef.io/downloads/tools/inspec

Chef InSpecは、Chefと同様に2019年に無償の商用利用が出来なっています。　

https://www.chef-sec.com/chef_%e6%9c%89%e5%84%9f%e5%8c%96/

__ライセンスや技術サポートについて詳しくは、連絡先： support@chef-sec.com にお問い合わせください。__ 

www.chef-sec.com
アルゴリズムとデータ構造

# はじめに

以前から興味があったアルゴリズムを勉強することになり、rubyのコードにしています。
間違えているところなどあればコメントいただきたいです。
アルゴリズムは今後追加していきます。

## エラトステネスの篩（ふるい）
```ruby:algorithm.rb
def sieve_of_eratosthenes(n)
  numbers = (2..n).to_a
  primes = []

  while numbers.any?
    prime = numbers.shift
    primes << prime
    numbers.reject! { |num| num % prime == 0 }
  end

  primes
end

max_number = 30
primes = sieve_of_eratosthenes(max_number)

puts "Primes up to #{max_number}:"
puts primes.join(', ')

```

## 文字列の走査

```ruby:algorithm.rb
text = "algorithm"
search_text = "b"

def find_character_index(text, search_text)
  index = 0
  while index < text.length
    if search_text == text[index]
      return index
    else
      index += 1
    end
  end
  return index
end

found_index = find_character_index(text, search_text)
puts found_index
```

## 文字列照合アルゴリズム

```ruby:algorithm.rb
text = "algorithm"
search_text = "so"

def pattern_finder(text, search_text)
  i = 0
  j = 0
  
  while i + j < text.length
    if search_text[j] == text[i + j]
      j += 1
      if j == search_text.length
        return i
      end
    else
      i += 1
      j = 0
    end
  end
  return i
end

found_index = pattern_finder(text, search_text)
puts found_index
```

## バブルソート

```ruby:algorithm.rb
def bubble_sort(array)
  array_length = array.length

  while true
    swap_flag = false

    for j in 0...(array_length - 1)
      if array[j] > array[j + 1]
        array[j], array[j + 1] = array[j + 1], array[j]
        swap_flag = true
      end
    end

    break unless swap_flag
  end

  array
end

array = [2, 3, 6, 1, 5]
sorted_array = bubble_sort(array)
puts sorted_array 
```

## 選択ソート

```ruby:algorithm.rb
def selection_sort(array)
  (array.length - 1).times do |i|
    min_index = i

    for j in (i + 1)...array.length
      min_index = j if array[j] < array[min_index]
    end

    array[i], array[min_index] = array[min_index], array[i] if i != min_index
  end

  array
end


array = [2, 3, 6, 1, 5]
sorted_array = selection_sort(array)
puts sorted_array
```

## 挿入ソート

```ruby:algorithm.rb
def insertion_sort(array)
  (1...array.length).each do |i|
    value_to_insert = array[i]
    j = i - 1

    while j >= 0 && array[j] > value_to_insert
      array[j + 1] = array[j]
      j -= 1
    end

    array[j + 1] = value_to_insert
  end

  array
end


array = [2, 3, 6, 1, 5]
sorted_array = insertion_sort(array)
puts sorted_array
```

## 参考
[アルゴリズムとデータ構造　藤田　聡　数理工学社](https://www.books.or.jp/book-details/9784901683999)
[現役シリコンバレーエンジニアが教えるアルゴリズム・データ構造・コーディングテスト入門](https://www.udemy.com/course/python-algo/)
Roblox でジャンプ力を変えられない時の対処法

Game Settings > World > Jump にて、

- [ ] Jump Height
- [x] Jump Power

に変更する。

![Screenshot 2023-06-26 at 18.42.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900756/6facd105-2f01-469d-611c-3bc811742d04.png)


とうまくいきます。
python + Flask + docker でwebアプリケーションを動かす

# 概要
EC2インスタンス上でdockerとdocker-composeをインストールして動かす方法メモ
OS: amazonLinux2

# ドキュメント
https://flask.palletsprojects.com/en/2.0.x/tutorial/
https://flask.palletsprojects.com/en/2.0.x/installation/
https://flask.palletsprojects.com/en/2.0.x/quickstart/

# dockerインストール
インストール -> 起動 -> ec2-userでも動かせるように権限調整
```
$ sudo su -
# yum update -y
# amazon-linux-extras install -y docker
# systemctl enable docker
# systemctl start docker
# usermod -aG docker ec2-user
```

# docker-composeインストール
docker-composeのバージョンは適時調整する
バージョン情報まで表示できたらOK!
```
# curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose
# chmod 755 /usr/local/bin/docker-compose
# docker-compose -v
docker-compose version 1.24.1, build 4667896b
```

# pythonコンテナを作ってアクセス確認
以下はec2-userで操作
```
$ mkdir project
$ cd project/
$ mkdir -p docker/python

$ vi docker/python/Dockerfile
$ vi docker-compose.yml
$ vi docker/python/app.py 
$ vi docker/python/templates/index.html

$ docker-compose up -d
```

``` Python:docker/python/app.py 
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=5000)
```

``` yml:docker-compose.yml
version: "3"

services:
  python:
    build: ./docker/python
    ports:
      - 80:5000
```     

``` Docker:docker/python/Dockerfile
FROM python:3.9
WORKDIR /app
ADD . /app
RUN pip install Flask
EXPOSE 5000
CMD ["python", "app.py"]
```

``` html:docker/python/templates/index.html
<html>
    <title>hogehoge</title>
    <head>
    </head>

    <body>
        hogehoge
    </body>
</html>
```

# ゴール
パブリックIPに80ポートでアクセスして、「hogehoge」が表示されるページが出ればok

# 追加
https://qiita.com/chanP_yamazaki/items/d6b3f1792f3ce3126a43

この記事で触れた内容を自前の環境で動かしてみる

``` Python:docker/python/app.py 
from flask import Flask, render_template
import numpy as np
from matplotlib.figure import Figure
import base64
from io import BytesIO

app = Flask(__name__)

@app.route('/')
def index():
    np.random.seed(1)
    x = np.arange(10)
    y = np.random.randint(1, 1000, 10)

    fig = Figure()
    ax = fig.subplots()
    ax.plot(x, y)

    buf = BytesIO()
    fig.savefig(buf, format="png")

    data = base64.b64encode(buf.getbuffer()).decode("ascii")
    return render_template('index.html', data=data)

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=5000)
```

``` Docker:docker/python/Dockerfile
FROM python:3.9
WORKDIR /app
ADD . /app
RUN pip install Flask\
    & pip install numpy\
    & pip install matplotlib
EXPOSE 5000
CMD ["python", "app.py"]
```

``` html:docker/python/templates/index.html
<html>
  <title>hogehoge</title>
  <head>
  </head>

  <body>
    <img src="data:image/png;base64,{{data}}"/>
  </body>
</html>
```
.NET Standard 2.0 対応の覚書


# `.NET 6.0`で作成していたライブラリを`.NET Standard 2.0`に対応する必要があるときの覚書

## プロジェクトファイルの設定

- `*.csproj`を開き、`TargetFramework`を`TargetFrameworks`に変更し、`;`で区切って`netstandard2.0`を追加する
- `LangVersion`タグを追加し、値を`9.0`とする

```XML:変更前
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    ～省略～
  </PropertyGroup>
</Project>
```

```XML:変更後
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net6.0;netstandard2.0</TargetFrameworks>
    <LangVersion>9.0</LangVersion>
    ～省略～
  </PropertyGroup>
</Project>
```

## `init`の有効化

- `IsExternalInit`クラスを追加する

```C#:IsExternalInit.cs
using System.ComponentModel;

namespace System.Runtime.CompilerServices
{
  /// <summary>
  /// Reserved to be used by the compiler for tracking metadata.
  /// This class should not be used by developers in source code.
  /// This dummy class is required to compile records when targeting .NET Standard
  /// </summary>
  [EditorBrowsable(EditorBrowsableState.Never)]
  internal static class IsExternalInit
  {
  }
}
```

## メソッドが対応していない場合

コンパイルエラーが出る場合は下記を試してみる

### `NuGet`で探す

- 利用していた属性が見つからない場合等、`NuGet`パッケージの管理で探してみる
  - 例：`System.ComponentModel.DataAnnotations.Schema.ColumnAttribute`属性が見つからない<br/>
    →　アセンブリ名`System.ComponentModel.Annotations`で検索

### 書き方を変更する

- `if`ディレクティブで対応している書き方に変える
  - 例：`Enum.GetValues`メソッドがジェネリック版に対応していない

```C#:変更前
public void Sample()
{
  foreach (var value in Enum.GetValues<TypeCode>())
  {
    // 処理
  }
}
```

```C#:変更後
public void Sample()
{
#if NETSTANDARD2_0
  foreach (TypeCode value in Enum.GetValues(typeof(TypeCode)))
#else
  foreach (var value in Enum.GetValues<TypeCode>())
#endif
  {
    // 処理
  }
}
```
自分流docker環境用Makefile雛形

docker環境で使いがちなMakefileを毎度描くのが面倒なので雛形メモ
どんどん足していく

``` :Makefile
clean:
	docker compose down --rmi all --volumes
upd:
	docker compose up -d
logs:
	docker compose logs -f --tail=20
```

※ makeコマンドが環境の入ってなかったら自分でインストール
```
$ sudo yum -y install make
```
EFSでアクセスのないファルをIAに移行すれば安くなるとは限らないぞ

3行でまとめ
---
EFSのファイルをIAストレージクラスに移行すると
burstモードでアクセス費用をかけない運用ができなくなって
余計にお金がかかる場合がある

概要
----
NFSドライブなどとしてマウント可能なAWSのマネージドファイルストレージのEFS。
このEFSにはストレージクラスというのがあり、ファイルごとに実格納先を選べるようになっています。
アクセス頻度の低いファイル向けの**IAストレージクラス**では、別途アクセス料金がかかるようになる代わりにストレージ料金が一桁下がるというお得な価格設定。

ところが、アクセスのまったくないファイルであってもIAストレージクラスに移行させると料金が高く付いてしまう可能性があるという知見を得ましたのでご共有。

シナリオ
----
1. スループットモードを「burst」にしていた。このモードでは標準ストレージクラスのファイルのアクセス量費用はかからず、アクセスの際に**バーストクレジット**を消費する。バーストクレジットが残っていないとスループットは大幅に落ちる。
1. 90日間無アクセスのファイルが自動的にIAストレージクラスに移行する設定にしていた。
1. EFS利用開始後90日目、多数のファイルがIAストレージクラスに移行。
1. **バーストクレジットの回復スピードは標準ストレージクラスの使用量に比例**する。そのため、バーストクレジットが急激に減少する一方になり、枯渇してしまった。
1. パフォーマンス問題が発生したためスループットモードを「elastic」に変更。アクセス量費用が発生するようになった。
1. IAストレージクラスに移行したことで節約できた費用よりも、かかるようになったアクセス量費用の方が大きい！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852/ca8891cb-31e6-c871-7e05-53d26e9ea108.png)

ごく一部のファイルに大量のアクセスがかかるような運用の場合、アクセスのないその他のファイルも単にストレージ料金がかかっているというだけでなくてバーストクレジットを稼ぐことで役に立ってくれている可能性があります。
IAストレージクラスに移行しないで標準ストレージクラスに置いておいたままの方がお得という可能性にご留意ください。

それはそれとして、fscacheを入れてそのごく一部のファイルへのEFSアクセス量を減らすという対策を効かせればburstモード運用とIAストレージクラス移行を両立できるかもしれませんね。この方式で超お得にできないか、トライ中です。
github repository rulesがリリースされたので設定してみる

## 概要
2023年7月24日にgithub repository rulesなるものがリリースされたようなので設定してみたいと思います。参考にしたのは以下

https://github.blog/2023-07-24-github-repository-rules-are-now-generally-available/

[コミュニティ](https://github.com/orgs/community/discussions/61107)
[Doc](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/about-rulesets)

## 対応方法
該当リポジトリ > Setting > Rulesと移動する。とりあえずブランチルールを作りたいのでNew branch rulesetを選択して、ここから作成する。ちなみに作成、編集、削除は管理者のみとのこと
![スクリーンショット 2023-07-27 14.59.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/bb98ad50-950e-2772-6cd8-a08c78043b00.png)

今回はmainブランチへのマージ前にプルリクエストを強制するルールを追加しようと思います。

### 1. General
ルール名とステータスを設定する。
![スクリーンショット 2023-07-27 15.04.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/924ff3ee-5e4f-ccb7-29ac-a91c6f223058.png)

### 2. Bypass list
管理者だけ適用しないとかできそう。今回は割愛
![スクリーンショット 2023-07-27 15.07.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/fc6c5765-34f0-3720-34db-a1515a1efdea.png)

### 3. Target branches
メインブランチに適用したいのでInclude default branchを選択
![スクリーンショット 2023-07-27 15.09.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/ecb68e6a-8af8-de8c-a7e2-f1512cc3d072.png)

### 4. Branch protections
Restrict deletionsとBlock force pushesはデフォルトで選択されていた。Require a pull request before mergingを選択してcreateする
![スクリーンショット 2023-07-27 15.13.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/f6aaf6bf-0a67-ab38-4688-b0c34b2bf974.png)

### 5. 表示
作られたっぽい
![スクリーンショット 2023-07-27 15.15.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/e548fd2a-73b5-4450-8269-a8fe93207352.png)

## 検証
![スクリーンショット 2023-07-27 15.19.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254217/6129797d-0b21-53b7-9744-71499b5a5ecb.png)
意図通り直接pushしたら弾かれた！

## まとめ
ブランチルールが簡易的に設定できるのはとてもいいですね。GitHub Enterprise Cloudの場合は組織の所有するリポジトリ全体にルールを適用できるらしいので一貫性保てて良さそう。teamでも頼む！

また、github repository rulesはブランチとタグの保護を目的としているようなので、リポジトリ全体のアクセス制御などそういうのはなさそう。

## 最後に運動通信社について
運動通信社は「日本を世界が憧れるスポーツ大国にする」というビジョンを達成するべく、一緒に働く仲間を募集しています！
PMやアプリエンジニア、Webエンジニアなど色んな職種を募集しておりカジュアル面談大歓迎なので是非採用フォームよりご連絡ください！
ぜひ一緒に、自分たちも世の中もワクワクするサービスを作りましょう！

https://sportsbull.jp/about/#recruit

Greenも活用中です

https://www.green-japan.com/company/9598
Typescriptでundefinedとnullを設定する

キーをオプショナルにするとき、`?` をつけます。

https://gist.github.com/mayognaise/8f4b6a4445cd657647e515ce49e8cd12

全てのキーをオプショナルにするときは、`Partial<T>` を使います。

https://gist.github.com/mayognaise/61f4980f7b70690c1e5deb13df0f515f

それでは、キーがオプションか、もしくは`null`のときはどうするか？わたしは `Maybe<T>`　というジェネリックなタイプを作って設定しています。

https://gist.github.com/mayognaise/54237aef14ba3dbb80d5ce15482a51bd

Redis等で `null` が返ってくるときの設定がこれで楽にできます。
あとは、例えば `function` であるタイプ (e.g. `T`) を返す場合、条件に満たない場合は `undefined` を返す場合はあると思います。その時もただ単に `function hoge(key: string): Maybe<T> {...}` とすれば良いです。
AWS 簡易概要まとめ

AWS
クラウドコンピューティングサービス
サーバーや ネットワークなどを、インターネット経由で貸してくれるサービス

コンピューティング、ストレージ、データベース、分析、ネッ トワーキング、モバイル、開発者用ツール、管理ツール、IoT、セキュリティ、 エンタープライズアプリケーションなど

インフラを、一括で借りられる

マネジメントコンソール
Webブラウザ上のGUI（グラフィカルユーザー インターフェイス）でAWSを操作できる画面

マネージドサービス
AWS側で管理されるサービス
管理者が手動で行う必要はなくなる

2つのしくみにより手軽に扱える

Webブラウザで操作できるユーザーイ ンターフェイスが用意されている

EC2　サーバー
サーバーに必要 なもの一式をクラウドで借りられる
借りた道具を使って自分でサーバーを作るようなイメージ
マネジメントコンソー ルからボタン1つで作成できる

S3　ストレージ
オブジェクトストレージサービス
データ をオブジェクト単位で管理する形式
多機能

VPC　ネットワーク
Virtual Private Cloud
AWS 上に作成する仮想ネットワーク
インター ネットや社内LANとつなげる必要あり
EC2やRDSの場合、作成 時にVPCを選択しないと作成できない

RDS　データベース
Relational Database Service
リレーショナル データベースである6種類の製品を、クラウド上で最適な動作条件で利用でき るサービス
Aurora、PostgreSQL、MySQL、MariaDB、 Oracle Database、SQL Serverに対応している
アップデートなどが自動で行 われる
バックアップなど面倒な管理タスクも自動化
インスタンス クラスは、スタンダード、メモリ最適化、バースト可能の3種類サイズは多様

Route 53　ドメイン
DNS（ドメインネームサービス）
URLをIPアドレスに変換してくれる
アクセスしてもらいたいアドレスを、実際に使用し ているEC2やS3などのAWSサービスのエンドポイント（接続点）に結び付ける
ルーティングを柔軟に管理

コンテナサービス
プログラムの実行環境を隔離するしくみ
Dockerみたいな感じ
プログラム一式をまとめて隔離して実行するシステム
コンテナを配置・管理するレジストリサービスAmazon Elastic Container Registry（ECR）
コンテナ化されたアプリケーションの実行やコンテナ同士の 調整を行うオーケストレーションサービス
Amazon Elastic Container Service（ECS）
Amazon Elastic Kubernetes Service
(リンクだけです)「同値変形」を調べてみたい。

**日本だけですか？**

# wikipedia内で 見当たりませんでした。
探し方が悪いですか？
このウィキでページ「同値変形」は見つかりませんでした。以下の検索結果も参照してください。


# DeepL翻訳で

https://www.deepl.com/ja/translator#ja/en/同値変形
????
equivalence transformation


# 教科書で
勉強中

＞同値変形 いつ習う？
＞Y-SAPIXでは高校２年生から扱い始める「同値変形」を習得し、全国の受験生と大きく差を付けましょう！2022/09/07

# 問題
## (1)
＞途中3:40からです。同値変形。プチ知識。
＞コメント欄。ChatGPT先生に聞きました。

https://youtu.be/Rtx4ovJVey0?t=220

## (2)
＞途中コメントへ。sympyの同値変形について
勉強中です。

https://qiita.com/mrrclb48z/items/5c1b0c635c417c82f72f#comment-f756f405ca06bfefdcfb


# 内部検索
「大学入試数学問題集成」様、「数学入試問題」様、「T氏の数学日記」様　サイト内検索

"同値変形"の探し方を教えて下さい。見当たりませんでした。
＜大学入試数学問題集成

https://cse.google.com/cse?cx=a8908fbc24340ebc5&q=%E2%80%9D%E5%90%8C%E5%80%A4%E5%A4%89%E5%BD%A2%E2%80%9D&oq=%E2%80%9D%E5%90%8C%E5%80%A4%E5%A4%89%E5%BD%A2%E2%80%9D&gs_l=partner-web.12..0i4i37i512l2j0i512j0i7i30l7.11848.15362.1.18232.2.2.0.0.0.0.116.226.0j2.2.0.csems%2Cnrl%3D10...0....1j4.34.partner-web..0.11.1302.uwEvmWKpqZ8


https://www.google.com/search?q=site%3Akamelink.com+%22%E5%90%8C%E5%80%A4%E5%A4%89%E5%BD%A2%22&rlz=1CAUHAM_enJP1038JP1038&oq=site%3Akamelink.com++%22%E5%90%8C%E5%80%A4%E5%A4%89%E5%BD%A2%22&aqs=chrome..69i57j69i58.1110j0j9&sourceid=chrome&ie=UTF-8

多数あり

https://www.google.com/search?q=site%3A%2F%2Fmathmathmass.exblog.jp+%22%E5%90%8C%E5%80%A4%E5%A4%89%E5%BD%A2%22&rlz=1CAUHAM_enJP1038JP1038&oq=site%3A%2F%2Fmathmathmass.exblog.jp+%22%E5%90%8C%E5%80%A4%E5%A4%89%E5%BD%A2%22&aqs=chrome.0.69i59j69i58.997j0j9&sourceid=chrome&ie=UTF-8

site://mathmathmass.exblog.jp "同値変形"との一致はありません。

# google検索
"同値変形"　多数あり

https://www.google.com/search?q=%E5%90%8C%E5%80%A4%E5%A4%89%E5%BD%A2+&rlz=1CAUHAM_enJP1038JP1038&sxsrf=AB5stBjWUBmz3RNn3evWMviTKSDaJhq7bw%3A1690433024330&ei=APbBZKnjE4L8wQO185WgBA&ved=0ahUKEwip47nfia6AAxUCfnAKHbV5BUQQ4dUDCA8&uact=5&oq=%E5%90%8C%E5%80%A4%E5%A4%89%E5%BD%A2+&gs_lp=Egxnd3Mtd2l6LXNlcnAiDeWQjOWApOWkieW9oiAyBBAjGCcyCRAAGAQYJRiABDIJEAAYBBglGIAEMgkQABgEGCUYgAQyCRAAGAQYJRiABDIJEAAYBBglGIAEMgkQABgEGCUYgAQyCRAAGAQYJRiABDIJEAAYBBglGIAEMgkQABgEGCUYgARIyyVQxwZYnw1wAngCkAEAmAGgAaAB2AOqAQMwLjS4AQPIAQD4AQHCAgoQABhHGNYEGLADwgIEEAAYR8ICBxAAGAQYgATiAwQYACBBiAYBkAYK&sclient=gws-wiz-serp


同値変形を制する者は軌跡を制する 【軌跡・領域が面白い ...
javascriptのinsertBeforeを利用して、HTMLの要素を移動させる(要素順の入れ替え)

# 結論
ある親となるHTML要素に、すでに存在している子要素を`insertBefore`で挿入しようします。すると子要素は関数で指定した場所に移動します。

# insertBefore関数
```.js
(親).insertBefore(newNode, referenceNode)
```
は、ある親が持つ`referenceNode`の前に、`newNode`を挿入する関数です。[^1]HTML要素を追加する目的で使用する想定だと思います。しかし、下記の2つの仕様を持っているため、HTML要素を移動させるときにも利用できます。
- `newNode`に「既に存在する要素」を指定した場合、指定された要素は`referenceNode`の前に移動される。
- `referenceNode`がnullの場合、`newNode`は末尾に挿入・移動される。

サンプルコードで実際の挙動を確認いただけると幸いです。

[^1]:正確性を欠くかもしれませんが、ノードはjavascriptで扱う「HTMLの要素」という考えでいいかと思います。

# サンプルコード
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="yLQRpxj" data-user="kabuto64425" 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/kabuto64425/pen/yLQRpxj">
  javascriptで、htmlの要素順を入れ替える</a> by kabuto64425 (<a href="https://codepen.io/kabuto64425">@kabuto64425</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

以上です。

# 参考

https://cly7796.net/blog/javascript/get-parent-and-sibling-elements-with-javascript/

https://qiita.com/yomogenium/items/f82b24d0e2a854e840e9

https://developer.mozilla.org/ja/docs/Web/API/Node/insertBefore
React18におけるStrictモードについて調べました

# これは何
React18社内勉強会の発表資料です。

# Strictモードとは
Strict モードは、コード内の意図しない副作用の検出だったり、潜在的な問題を実際のバグになる前に発見するのに便利な`開発モードのみで実行される`開発ツールです。
潜在的な問題とは、現時点では目に見えないものの、将来的には問題を生じる可能性のある事を指します。


# React18でのStrictモード
以下DeepLを使用した公式の翻訳です。
> - コンポーネントは、不純なレンダリングに起因するバグを見つけるために、余分な時間を再レンダリングします。
> - コンポーネントは、Effectのクリーンアップの欠落に起因するバグを見つけるために、Effectを余分に再実行します。
> - あなたのコンポーネントは、非推奨のAPIを使用していないかチェックされます。

つまり、`表示`→`表示したのを破棄`→`再表示`という順番で実行されます。
なぜこのような動きをするのかというと、冒頭に書いたような「副作用」があるコードをあぶり出すことができるようになります。

### 副作用がある簡単なサンプルコード
以下は[React公式](https://ja.react.dev/learn/keeping-components-pure)から引用してきたコードです
```index.jsx
let guest = 0;

function Cup() {
  // Bad: changing a preexisting variable!
  guest = guest + 1;
  return <h2>Tea cup for guest #{guest}</h2>;
}

export default function TeaSet() {
  return (
    <>
      <Cup />
      <Cup />
      <Cup />
    </>
  );

```

```
// 想定した実行結果
Tea cup for guest #1
Tea cup for guest #2
Tea cup for guest #3
```
本来であれば上のような結果を想定していましたが、実際の実行結果は以下になります。

```
// 実際の実行結果
Tea cup for guest #2
Tea cup for guest #4
Tea cup for guest #6
```
Strictモードによって２回実行し、2、4、6と表示され副作用があることが発見されました。


公式でも副作用があるコードに対して以下の様に書かれています。

> 数式 y = 2x の例に戻ると、これは x = 2 であっても y = 4 であることが保証されない、というようなことです。テストは失敗し、ユーザは当惑し、飛行機も空から墜落しかねません。

これはReactのコンポーネントを純粋に保つという思想から反している、つまり冪等ではないという事らしいです。

https://qiita.com/suin/items/316cb8aaf8dfcf11abae

さらに今回のStriceモードでは`useEffect`の第２引数を`[]`にしても２回処理が走るようになりました。
これは`useEffect`に[クリーンアップ関数](https://ja.legacy.reactjs.org/docs/hooks-reference.html#cleaning-up-an-effect)が書かれてない事によるバグを防ぐためでもあります。

https://ja.react.dev/reference/react/StrictMode#fixing-bugs-found-by-re-running-effects-in-development

https://codesandbox.io/embed/damp-leaf-gtf3ct?fontsize=14&hidenavigation=1&theme=dark

上のコードはReactの公式からforkしてきたコードですが、コンソールで確認しても「**クリーンアップ関数込み**」で`Active connection`数が1以上は増えないこと分かります。

### その他

Strictモードのその他の機能としては非推奨になったAPIなどを使用した場合、警告が表示されるそうです。
公式に書いてある非推奨になったAPIは主にClassコンポーネントで使われていたAPIなので、これからReactを勉強する方にとっては、あまり必要な知識ではなさそうです。


# まとめ
今回は社内勉強会の発表資料として、色々な記事をまとめて自分なりに咀嚼してみましたが、関数の知識や「冪等性（べきとうせい）」など知らない言葉などが次々出てきて、一つの機能を少し掘り下げるだけで様々なことが網羅できたような気がしてます。



# その他の参考資料

https://blog-mayo.com/2022/09/881/

https://qiita.com/FumioNonaka/items/f89443bc056eec5d8829

https://ja.legacy.reactjs.org/blog/2022/06/15/react-labs-what-we-have-been-working-on-june-2022.html

https://www.sunapro.com/react18-strict-mode/
Salesforce B2B / D2C Commerce でセット商品を設定してみる


※ これから記載する事項は、私が所属する会社とは一切関係のない事柄です。

今回はセット商品を登録する方法を紹介して行きたいと思います。


## 登録する商品

今回はストアにすでに登録済みの下記の４商品をまとめて「スターターキット」というセット商品を作成して行きたいと思います。
![スクリーンショット 2023-07-27 13.03.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/83f27b99-75f0-dfab-4e0a-9b55d1892fae.png)



#### 完成時の商品詳細ページ

![スクリーンショット 2023-07-27 13.33.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/dede776a-52a3-cdf1-2259-d11a728734b6.png)




## 1. セット商品の登録

画面から新しくセット商品を登録する場合はストアの商品ワークスペースから下記のように [新規商品セット] ボタンから登録可能ですが、今回は CSV で取り込んでみたいと思います。

![スクリーンショット 2023-07-27 12.59.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/5a939d85-7ce9-d969-afbf-dab39530398b.png)


#### 作成した CSV

あまり通常商品と変わらないのですが、ポイントとしては「Product Type」の値に「Set」という値が入っています。

```
Product Name,Product Type,Category 1,Category 2,Product isActive,Media Standard Url 1,Media Listing URL,Price (sales) JPY,Price (original) JPY,Product Description,SKU,ProductCode,Media Standard AltText 1
スターターキット,Set,その他,全ての商品,true,https://s3.amazonaws.com/{省略},https://s3.amazonaws.com/{省略},288000,320000,このキットは、新規顧客が開始を支援するために特別に設計されています。迅速に立ち上げて実行するために必要なすべてのツールが付属しており、幅広いアプリケーションをカバーしています。,A-5000,A-5000,スターターキット
```

#### CSV のインポート

「[ストアへのインポート](https://qiita.com/syunyama/items/4dafbcbdd4559a696ae2#3-%E3%82%B9%E3%83%88%E3%82%A2%E3%81%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88)」を参照ください。




## 2. 商品オブジェクトのレイアウトへの子商品関連リストの追加

**設定 > オブジェクトマネージャ** から商品オブジェクトの設定画面に遷移し、利用しているレイアウトに「Child Products」を関連リストに追加します。

![スクリーンショット 2023-07-27 13.02.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/adf35da9-0ec2-e58f-11c9-9c7d576b1b14.png)



## 3. セット商品に子商品を追加

登録したセット商品の詳細ページに遷移し、子商品関連リストの  [Add(追加)] ボタンをクリックします。
![スクリーンショット 2023-07-27 13.20.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/d5260e73-b793-a197-3754-1ad3133883f0.png)


すると、現在登録されている商品が表示されるのでセットを組みたい商品を選択し、 [次へ] ボタンをクリックします。
![スクリーンショット 2023-07-27 13.20.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/2fe0820a-77cd-ead7-dc98-0b4d0d5fb13a.png)



次に商品詳細に表示されるデフォルトの数量を入力します。さらに商品リレーション種別として「Set to Set Component Relationship (セットコンポーネントのリレーションに設定)」を設定し保存します。

![スクリーンショット 2023-07-27 13.20.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/02e8f9bf-d43e-4b93-7848-44243ad40ed4.png)



## 4. 検索

作成後は、[検索インデックスの再構築](https://help.salesforce.com/s/articleView?id=sf.comm_search_index_build.htm&type=5)を忘れないようにしてください。



## 参考ヘルプ

* [商品セット](https://help.salesforce.com/s/articleView?id=sf.comm_product_sets_intro.htm&type=5)
wslでelixir その22

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
nxやってみた。

# 参考にしたページ。

https://qiita.com/Yoosuke/items/751a9fe05b89755e25a8


# サンプルコード

```
defmodule Perceptron do
	def nx_and(x1, x2) do
		x = Nx.tensor([x1, x2])
		w = Nx.tensor([0.5, 0.5])
		b = -0.7
		[tmp] =	Nx.multiply(x, w)
		|> Nx.sum
		|> Nx.add(b)
		|> Nx.to_flat_list()
		case tmp do
			tmp when tmp <= 0	-> 0
			tmp when tmp > 0 -> 1
		end
	end
	def nx_nand(x1, x2) do
		x = Nx.tensor([x1, x2])
		w = Nx.tensor([-0.5, -0.5])
		b = 0.7
		[tmp] =	Nx.multiply(x, w)
		|> Nx.sum
		|> Nx.add(b)
		|> Nx.to_flat_list()
		case tmp do
			tmp when tmp <= 0	-> 0
			tmp when tmp > 0 -> 1
		end
	end
	def nx_or(x1, x2) do
		x = Nx.tensor([x1, x2])
		w = Nx.tensor([0.5, 0.5])
		b = 0
		[tmp] =	Nx.multiply(x, w)
		|> Nx.sum
		|> Nx.add(b)
		|> Nx.to_flat_list()
		case tmp do
			tmp when tmp <= 0	-> 0
			tmp when tmp > 0 -> 1
		end
	end
	def nx_xor(x1, x2) do
		s1 = nx_nand(x1, x2)
		s2 = nx_or(x1, x2)
		nx_and(s1,s2)
	end
end

```

# 手順

```
$cd elixir
$mix new xor
$cd xor
$mix test
edit mix.exs
  defp deps do
    [
      {:nx, "~> 0.4.1"}
    ]
  end

$ mix deps.get
Resolving Hex dependencies...
Resolution completed in 0.083s
New:
  complex 0.4.3
  nx 0.4.2
* Getting nx (Hex package)
* Getting complex (Hex package)

$ iex -S mix
Erlang/OTP 25 [erts-13.0.4] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [jit:ns]

==> complex
Compiling 2 files (.ex)
Generated complex app
==> nx
Compiling 30 files (.ex)
Generated nx app
==> xor
Compiling 1 file (.ex)
Generated xor app
Interactive Elixir (1.13.4) - press Ctrl+C to exit (type h() ENTER for help)

```

# 実行結果

```
iex(1)>  Perceptron.nx_xor(0,0)
0
iex(2)>  Perceptron.nx_xor(0, 1)
1
iex(3)>  Perceptron.nx_xor(1, 1)
0
iex(4)>  Perceptron.nx_xor(1, 0)
1
iex(5)>  Perceptron.nx_or(1, 0)
1
iex(6)>  Perceptron.nx_and(1, 0)
0
iex(7)>  Perceptron.nx_nand(1, 0)
1
iex(8)>


```

以上。
ImportError: libcudart.so.12: cannot open shared object file: No such file or directory

DockerコンテナのCUDAをバージョンアップ後、プログラムを実行すると以下のエラーが出た。
`ImportError: libcudart.so.12: cannot open shared object file： No such file or directory` 

### 原因
**CUDAツールキットが存在しないか、正しくインストールされていない。**

CUDAは、NVIDIAによって作成された並列コンピューティングプラットフォームとアプリケーションプログラミングインタフェース（API）モデルで、開発者がGPUを汎用処理に使用できるようにする。
CUDAツールキットを使用するプログラムを実行
→ システムがlibcudartライブラリを含む必要な共有ライブラリを探す。
→ システムがライブラリを見つけられない場合、エラーを吐く。

### 解決
**Step1: CUDAがインストールされていることを確認する**
次のコマンドを実行
`nvcc --version`
CUDAがインストールされていれば、CUDAツールキットのバージョン番号が表示される。
CUDAがインストールされていなければ、Command not foundとか出るはず。

**Step2：CUDAバージョンの確認**
CUDAがインストールされている場合、次のコマンドを実行
`ls /usr/local/cuda/lib64/`
CUDAライブラリ・ディレクトリの内容が一覧表示される。使用しているCUDAツールキットのバージョン番号が以下フォーマットで書いてある。
`libcudart.so.X.X` （X.Xはバージョン番号）

**Step3：LD_LIBRARY_PATH環境変数の設定**
LD_LIBRARY_PATH環境変数にCUDAライブラリディレクトリへのパスを設定。次のコマンドを実行
`export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH`
CUDAライブラリ・ディレクトリへのパスがLD_LIBRARY_PATH環境変数に追加される。



### ref
https://saturncloud.io/blog/how-to-resolve-importerror-libcudartso80-cannot-open-shared-object-file-no-such-file-or-directory/
python maya add curves transform to sets

```python
import maya.cmds as cmds

def create_nurbs_curve_set(set_name):
    if not cmds.objExists(set_name):
        cmds.sets(name=set_name, empty=True)

def add_nurbs_curves_to_set(set_name):
    curve_transforms = [cmds.listRelatives(i, p=1, type='transform', fullPath=True)[0] for i in cmds.ls(type='nurbsCurve', o=1, r=1, ni=1)]
    for c in curve_transforms:
        cmds.sets(c, add=set_name)

def main():
    set_name = "Sets"
    create_nurbs_curve_set(set_name)
    add_nurbs_curves_to_set(set_name)

if __name__ == "__main__":
    main()
```
サインアップ画面にアクセスしたら、ArgumentError wrong number of arguments (given x, expected 2)が出て詰まった

# はじめに
学習用のメモとして投稿します。
deviseを使用して認証機能を実装する機会がありました。
その際に遭遇したエラー`ArgumentError` `wrong number of arguments (given x, expected 2)`について書いていきます。

# 経緯
deviseでサインアップページを作成していました。
何とか完成し、正常に動作することを確認したものの、少し時間が経って、再びサインアップページへアクセスすると、次のエラーが発生しました。
```zsh:
ArgumentError in XXXX::RegistrationsController#new

wrong number of arguments (given x, expected 2)
Extracted source (around line #241):

241  def serialize_from_session(key, salt)
242    record = to_adapter.get(key)
243    record if record && record.authenticatable_salt == salt
244  end
```

# 原因
色々と調べて時間を費やしましたが、改めてエラーメッセージを見ると、セッション情報からシリアライズ化するメソッドで失敗しているようです。
単にサインアップページにアクセスしただけなのに、セッション情報関連でエラーが起こっているということは、ブラウザのセッション情報が原因のようです。
ブラウザからセッション情報を削除すると、サインアップページにアクセスできるようになりました。
【AWS】 気になるソリューション

https://qiita.com/zumax/items/a8541406f59ab477a4af

## Amazon CodeGuru
セキュリティの脆弱性を検出し、コードレビューを自動化する


**ユースケース**
コードレビューを自動化する。Java および Python コードでは見つけるのが難しい欠陥や脆弱性を検出し、それらを修正する方法に関する推奨事項を提供する。
コードのレビューを開始するには、GitHub、GitHub Enterprise、Bitbucket、または AWS CodeCommit の既存のコードリポジトリを CodeGuru コンソールで関連付ける。


## Amazon Fraud Detector
機械学習でオンライン不正を検出

**ユースケース**
- 疑わしいオンライン決済の特定
支払いを処理して注文を履行する前に、疑わしいオンライン支払いトランザクションにフラグを立てることにより、オンライン支払い不正を減らす。

- 新規アカウント不正の検出
正当なアカウント登録とリスクの高いアカウント登録を正確に区別することで、電話や電子メールによる検証などの追加チェックをチェックを選択的に導入できるようにする。

## Amazon Transcribe

**ユースケース**
- 顧客との会話からインサイトを得る
Transcribe Call Analytics を使用すると、顧客との会話から実用的なインサイトを迅速に抽出することができる。AWS Contact Center Intelligence パートナーと Contact Lens for Amazon Connect は、カスタマーエンゲージメントを改善し、エージェントの生産性を高め、スーパーバイザーへの表面品質管理アラートを提供するターンキーソリューションを提供。

-字幕と会議メモを作成する
オンデマンドおよびブロードキャストコンテンツに字幕を付けて、アクセシビリティを向上させ、カスタマーエクスペリエンスを改善する。Amazon Transcribe を使用して、生産性を高め、重要な会議や会話を正確にキャプチャする。
ssh-keygen

```
[linuxstudy@xxxx ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/linuxstudy/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/linuxstudy/.ssh/id_rsa.
Your public key has been saved in /home/linuxstudy/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:/PKg8I/YfAU2UDKQ+rZSAD8WmOpjOvu9gIcpTuixGS4 linuxstudy@xxxx
The key's randomart image is:
+---[RSA 2048]----+
| o  .oo..        |
|+ . . .o         |
|.o o   .         |
|. *    .+        |
|.. +   .So       |
|.B  +    ..      |
|O++o..  o..      |
|E.*o.* o.+       |
|oX..+.*o. .      |
+----[SHA256]-----+
```
Python3_CMDでPySimpleGUIをインストール　ファイルがないエラー

Quita超初心者の初めての質問です。不思議なエラーで困っております。
お分かりになる方のご連絡をお待ちしております。解決方法をお教えて下さい。
宜しくお願い致します。

win10 64bit CMDでPySimpleGUIをインストール作業中です。
pythonインストール画面（公式サイト）でいつもpassは☑して通しています。
環境変数の編集画面でも　パスは正常です。
￥Python￥Ptyhon310￥Python310￥Scripts￥
￥Python￥Ptyhon310￥Python310￥

py -m pip install PySimpleGUI 　は成功しました。

py m- pip list　　　　　が失敗しています。解決したいです。


C:\Users\user>python -V
Python 3.10.2    成功しています。

C:\Users\user>pip -V
pip 21.2.4 from C:\Users\user\AppData\Local\Programs\Python\Python310\lib\site-packages\pip (python 3.10)　成功しています。

C:\Users\user>py -m pip install PySimpleGUI
Requirement already satisfied: PySimpleGUI in c:\users\user\appdata\local\programs\python\python310\lib\site-packages (4.60.5)　　　PySimpleGUIはインスト成功しています。

解決したいエラーは下記ですが、Python\Python310\python.exeにpython.exeは存在しています。非常に不思議な現象です。困っています。

C:\Users\user\AppData\Local\Programs\Python\Python310\python.exe: can't open file 'C:\\Users\\user\\m-': [Errno 2] No such file or directory
/etc/ssh/sshd_config

sshサーバ側の設定
```
# Authentication:

#LoginGraceTime 2m
#PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

#PubkeyAuthentication yes

# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile      .ssh/authorized_keys

#AuthorizedPrincipalsFile none

#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody
```
Linux MintでCapsLockをCtrlにしたいけど/etc/default/keyboadの設定が無効になってしまう

# 現象
Linux MintでCapsLockをCtrlにしたいけど/etc/default/keyboadの設定が無効になってしまう、setxkbdmapで設定してもスリープ復帰や再起動で無効になる。

# 解決方法
システム設定->キーボード->レイアウト->オプション->Caps Lock BehaiviourでOKだった