OmniAICreator/Qiita-1.07M huggingface dataset:
[Day19] モジュール

本記事は一人アドベントカレンダー企画の一つです。
[30代未経験エンジニアが25日後にJavaScriptをマスターするカレンダー](https://qiita.com/advent-calendar/2022)

[JAVASCRIPT.INFO](https://ja.javascript.info/)を元にJavaScriptを勉強していき、そこで学んだ知識をアウトプットしていきます。
２５日でJAVASCRIPT.INFOをやりきり、未経験エンジニアがJavaScriptをマスターする過程を投稿していきます。



## 13.1 モジュール, 導入
### 知らない単語
- AMDとは
　　- アメリカの大手半導体メーカーの一つ、Intel社製マイクロプロセッサの互換製品で有名

- CommonJS
　　- サーバーサイドなどのウェブブラウザ環境外におけるJavaScriptの各種仕様を定めることを目標としたプロジェクト

### 学んだこと
- モジュールとは?

モジュールは単なる1つのファイルであり、
export と import を利用することで、モジュール間で機能を相互にやりとりすることができる
export は、ファイルの外部からアクセス可能であるべき変数や関数にラベル付けをし、
import は他のモジュールから機能をインポートできるようにする

例、関数をエクスポートしているファイル sayHi.js がある
```javascript
// 📁 sayHi.js
export function sayHi(user) {
  alert(`Hello, ${user}!`);
}
```
別のファイルでインポートして使う
```javascript
// 📁 main.js
import {sayHi} from './sayHi.js';

alert(sayHi); // function...
sayHi('John'); // Hello, John!
```
import は相対パス ./sayHi.js のモジュールを読み込み、エクスポートされた関数 sayHi を対応する変数に割り当てる

- コアなモジュールの特徴

通常のスクリプトと比較して、モジュールの特徴はなにか？

モジュールは常に use strict なので、未宣言変数への代入はエラーになる

各モジュールには独自の最上位のスコープがあり、モジュール内の最上位の変数や関数は他のスクリプトからは見えない

- モジュールコードはインポート時の初回にのみ評価されます

同じモジュールが他の場所でもインポートされる場合、コードは初回のみ実行され、その後エクスポートしたものはすべてのインポートしているモジュールで利用される

### 感想
モジュールコードはインポート時初回にのみ評価されるという事は、1度限りの評価でその後覆す事はできないので注意する必要がある。



## 13.2 エクスポートとインポート
### 知らない単語
- 無し


### 学んだこと

- exportの種類

宣言の前
export [default] class/function/variable ...

スタンドアロン
export {x [as y], ...}.

再エクスポート
export {x [as y], ...} from "mod"
export * from "mod" (デフォルトは再エクスポートしない).
export {default [as y]} from "mod" (デフォルトの再エクスポート).

- Importの種類

モジュールから名前付きエクスポート
import {x [as y], ...} from "mod"

デフォルトエクスポート
import x from "mod"
import {default as x} from "mod"

すべて
import * as obj from "mod"

モジュールの取得/評価のみでインポートはしない
import "mod"


- 書き方
```javascript
sayHi();

import {sayHi} from './say.js'; // ファイルの末尾で import
```

インポートはファイルの先頭にあるが、書きやすいという理由だけである

import/export 文は {...} の中では動作しないので注意


### 感想
exportとimportで書き方の違いをしっかり覚えていく。
また、exportは再エクスポートの書き方もあるので注意する。


## 13.3 Dynamic imports(ダイナミックインポート)
### 知らない単語
- オンデマンド
  - ユーザの要求があった際に、その要求に応じてサービスを提供する事
  例えばブラウザなどを通じてユーザのリクエストに応じて、テキストや画像などのコンテンツを配信しているインターネット上の多くのデータ配信は、オンデマンド方式である

### 学んだこと

- import() 式

import(module) 式は、モジュールを読み込み、モジュールがもつすべてのエクスポートを含むモジュールオブジェクトになる promise を返す
例として
```javascript
let modulePath = prompt("Module path?");

import(modulePath)
  .then(obj => <module object>)
  .catch(err => <loading error, no such module?>)
```
のような書き方をする

import() は一見すると関数呼び出しに見えるが、super()と同じく、たまたま括弧を使用している構文である
関数ではないので、変数に import をコピーしたり、call/apply を使用することはできない

### 感想
import()はsuper()と同じで、関数ではないので、構文として覚える。


# 最後に
exportとimportは書き方や役割を間違って覚えないように注意したい。
イベント

# イベント
```リンクやボタンをクリック```したり、```キーボードを操作```したり、また、```ページの読み込みが完了した時```にや```次のページに行く直前```など様々なタイミングでブラウザに```イベントが発生```します。
```html
<section>
  <form action="#" id="form">
    <input type="submit" value="検索">
  </form>
</section>
<script>
    'use strict';

    document.getElementById('frm').onsubmit = function() {
        console.log('クリックされました');
    };
</script>
```
# ```.onsubmit```
* JavaScriptのonsubmitとは、```送信ボタンが押された時に起動するイベント```です。

### 出典
https://magazine.techacademy.jp/magazine/22317#:~:text=JavaScript%E3%81%AEonsubmit%E3%81%A8%E3%81%AF%E3%80%81%E9%80%81%E4%BF%A1%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%8C%E6%8A%BC%E3%81%95%E3%82%8C%E3%81%9F%E6%99%82%E3%81%AB%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%A7%E3%81%99%E3%80%82

```js
document.getElementById('frm').onsubmit = function() {
        console.log('クリックされました');
    };
```
```onsubmit```イベントが発生した時に実行させたい処理を書きます。
この場合はコンソールオブジェクトに文字列が出力させる処理が書かれている。

# フォームの入力内容を読み取る
```html
<section>
  <form action="#" id="form">
    <input type="text" name="word">
    <input type="submit" value="検索">
  </form>
  <p id="output"></p>
</section>

<script>
    'use strict';

    document.getElementById('form').onsubmit = function() {
        event.preventDefault();
        const search = document.getElementById('form').word.value;
        document.getElementById('output').textContent = `「${search}」の検索中...`;
    };
</script>
```
### idがformの値の属性値を取得する
```js
const search = document.getElementById('form').word.value;
```
idがformのオブジェクトを取り出して、word(name属性）の値を定数に代入している。

```js
document.getElementById('output').textContent = `「${search}」の検索中...`;
```
idのoutputのノード内のテキストに上書きする

### 関連
https://qiita.com/masatom86650860/items/6b485ec9941553480aec#textcontent%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89

### イベントから先に行かない
```js
event.preventDefault();
```
インターフェイスのpreventDefault()メソッドは、イベントが明示的に処理されない場合、```通常のようにデフォルト アクションを実行しない```ことをユーザー エージェントに伝えます。Event

#### 出典
https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault
# 感想
まだjavascriptに慣れないとダメだな。

# 出典
https://www.sbcr.jp/product/4815601577/
【インフラ】障害事例から学ぶ設計/手順レビューの勘所

# はじめに


設計書や手順書のレビューって最後まで残る
属人化・人のスキル次第の領域ですよね。
私の属人的知識を共有し、それを活用して2人分の属人化知識に
昇華する人が現れ、がどんどん回っていくことを願い、
The属人知識を公開します。
インフラ屋さんなので完全インフラ向け

障害事例を詳細に出すことはできないのでざっくりとした
事例紹介になりますが悪しからず。(一部抽象化してます)

## 事例①：性能問題
　これはやっぱり外せない性能問題です。
　事例としてはこんな作業で！？ってものをご紹介

　＜事例＞
　　ある日ロードバランサでSSL証明書の有効期限が来たので更新しました。
　　今回からセキュリティ強化で前回より強度の高い鍵を使うことに。
　　　⇒結果、性能劣化が発生し慌てて切り戻しの末路を辿ることに・・・
　　　ポイント：
　　　　・更新した鍵はサポートされており利用に問題はなかった
　　　　・カタログスペックを見ても特に性能上限には引っかかっておらず
         十分捌けるはずだった

　＜原因＞
　　　　カタログスペックとしては記載がなかったが、2K鍵を採用すると
        性能が**1/10倍**となる仕様があることが
       　　　　サポート回答で判明。
       　　　　1/10倍では特定捌けず今回の憂き目に
　　　　

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989873/51089754-fac7-0577-5449-3d49fc4b337d.png)

　＜教訓＞
　　・アプリケーションの更新等ではない諸元が変わらないものでも変化点に関してはしっかりと例外ないか確認しましょう。
　　　特に古い機器を使っていると新しい技術に対し異常に性能が劣化することがあります。

## 事例②：参照コマンド
　特に昔のネットワーク屋さんは共感してもらえるんじゃないでしょうか。


　＜事例＞
　　NW機器にて参照コマンド実行したら、冗長系の縮退が発生。

　＜原因＞
　　参照コマンド自体にバグがあり、一定状況化ではCPU使用率高騰しCPU処理ができなくなる状況にあった。
　　結果冗長構成のヘルスチェックが失敗し切り離されることに・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989873/3319a293-5ba5-fb76-5430-71f694d5af21.png)

　＜教訓＞
　　安全そうに見えても実は危ない処理があることを理解し必要最低限の情報取得に留める工夫を。
　　この件であれば一括情報取得コマンドを利用しなければ発生しないものでした。

## 事例③：製品バグ
　完璧な製品は無いということを念頭に置くという基本を痛感した事例です。

　＜事例＞
 　　 SDN製品での話です。作業のため1台のスイッチ（48ポートモデル）をSDNツリーから切り離ししたところで**NW全断**が発生。
　　慌てて組み込むも事態は復旧せず、なぜかエッジの電源をいくつか停止し32台以下となった段階で復旧。
　
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989873/27cd1eb6-f630-12db-8129-9bc921d22bf1.png)

　＜原因＞
　　エッジ接続数情報は1bit×接続数で管理される仕様だった
　　48ポートスイッチの本機器はメモリ空間が最低でも6bit必要だったがメモリ確保が5bitだったため、
　　6ビット目が欠落する事態に⇒32台目が1つのスイッチの論理ツリーとして組み込まれた時点でオーバフローにより論理情報が破壊。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989873/69c21242-6ef2-48a1-cd5e-5af681718a53.png)


　＜教訓＞
　　・製品を信じない。って書くと極端ですが、メモリリークとかオーバフロー系はあるある事象。
　　　32/64/128/256などのメモリ上の区切りとなる値を超える際は念のため検証する、
      KBチェックするは有効な自衛策。
　　・問題発生時に元に戻すだけでは戻らない事象っていくつかあります。
　　　すべてを予測するのは無理だとしても論理的に怪しい数字が無いかを事前に押さえておくとベター。

# 最後に
　ある程度べき論も含めてフラットに共有しました。
　とはいえ、ここまではできないよねぇ。お金的にも、人手的にもって内容もナレッジとして共有しましたが、
　こういう観点もあるんだと思っていただければ。
　一応押さえておけば問題起きてからでも役に立ちそうなものをピックアップしたつもりです。
Rider 2022.3から、JSONからC#のクラスやレコードを作る機能が追加された

Rider 2022.3から、JSONをペーストして、C#のクラスやレコードを作る機能が追加されました。便利！

![json_to_records.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/ae6b13d1-8ee5-3ac4-9482-2d8200b1ed89.gif)

こんなJSONをコピーまたはペーストした状態で、

```json
{
  "results": [
    {
      "id": "C6C5D44C-E814-4740-BED1-535D18C58831",
      "score": 123.0,
      "name": "taro",
      "grade": "A",
      "birth_day": "1988-12-15T00:00:00+09:00",
      "languages": [
        {
          "id": "F73D0191-7DC1-4C82-BEA2-FE0697C4484C",
          "name": "Java"
        },
        {
          "id": "0C4F8C56-7529-4288-864E-F2A1C8908CDA",
          "name": "Kotlin"
        },
        {
          "id": "AAB44313-86AF-4C15-B0D4-8F8F2F0BE8EF",
          "name": "JavaScript"
        },
        {
          "id": "DFF25EEF-A829-45D3-BB5E-B9A6F3BD6AD7",
          "name": "TypeScript"
        }
      ]
    },
    {
      "id": "030EDCF4-E8D3-4AF1-8999-26C3EB6C74E3",
      "score": null,
      "name": "jiro",
      "grade": null,
      "birth_day": "1995-01-01T00:00:00+09:00",
      "languages": [
        {
          "id": "6D327248-6840-4A12-A563-4037A4D39472",
          "name": "C#"
        },
        {
          "id": "345CFF94-2F10-4D7E-88F4-BDC4C79FF29E",
          "name": "Golang"
        }
      ]
    },
    {
      "id": "E965CE53-1EC9-4656-B462-16C0C8FA7340",
      "name": "saburo",
      "birth_day": "2000-01-01T00:00:00+09:00",
      "languages": []
    }
  ]
}
```

Find Actionで「Paste Special: JSON as Records」を探して選択します。
もしくはEditorで右クリックからメニューを開き「Copy / Paste Special」 > 「Paste Special: JSON as Records」を選択します。
そうすると、次のようなレコードが生成されます。

```csharp
public record RootObject(
    Results[] results
);

public record Results(
    string id,
    double? score,
    string name,
    string grade,
    string birth_day,
    Languages[] languages
);

public record Languages(
    string id,
    string name
);
```

取り急ぎJSONのパーサーをががーっと書きたい時などに便利そう。

もちろんパース用の型としては、これで完璧じゃないし、修正したい場所もあるけれど、とっかかりとしては十分な気がします。

「Paste Special: JSON as Classes」だと、クラスも作れます。

# リンク集

* [公式ページ Generate C# classes from JSON](https://www.jetbrains.com/help/rider/Generate_classes_from_json.html?keymap=resharper)
* [公式ページ Rider 2022.3の新機能](https://www.jetbrains.com/ja-jp/rider/whatsnew/2022-3/)
Recovery Servicesコンテナー

●Recovery Servicesコンテナー
バックアップデータの格納先となるリソース。Azure Backupを使用するためには最初にRecovery Servicesコンテナーを作成する必要があり、作成したRecovery Servicesコンテナー内でバックアップの構成を行う。

※Recovery Servicesコンテナーはリージョンごとに作成する必要があり、バックアップするリソースと同じリソースを選択する必要がある。
つまり、仮想マシンと同じリージョンにRecovery Servicesコンテナーを作成する必要がある。

※バックアップの有効後にRecovery Servicesコンテナーを削除するには、バックアップの停止とバックアップデータの完全な削除が必要。

※バックアップポリシーでは、「毎日のバックアップポイントの保持期間」を最大で9,999日に設定できる。
DoctrineとEloquent比較大全16: 数式を使ったupdate

day16の今日は数式を使ったupdateのやり方を見ていきます。

## Doctrine

```php
<?php

declare(strict_types=1);

use App\Entity\Book;
use Doctrine\ORM\EntityManagerInterface;

require __DIR__.'/../vendor/autoload.php';

/** @var EntityManagerInterface $entityManager */
$entityManager = require __DIR__.'/bootstrap.php';

$qb = $entityManager->getRepository(Book::class)->createQueryBuilder('b');
$qb->update()->set('b.price', 'b.price * 1.1')->getQuery()->execute();
```
<https://github.com/77web/doctrine-vs-eloquent/blob/8b69e952f860cf5bfdf9f7edd7152674a5545110/Doctrine/Usecase/update_with_formula.php>

- エンティティ自身の更新ではなく、クエリビルダを使って行います。
- クエリビルダで更新した場合、取得済のBookエンティティのフィールドの値は更新されないので、更新後の値を持つエンティティを使って次の処理をしたい場合は `$entityManager->refresh($book)` のようにエンティティの値を更新する必要があります。

## Eloquent

```php
<?php

declare(strict_types=1);

use App\Models\Book;

require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/bootstrap.php';

$q = Book::query();
$q->update(['price' => $q->raw('price * 1.1')]);
```
<https://github.com/77web/doctrine-vs-eloquent/blob/8b69e952f860cf5bfdf9f7edd7152674a5545110/Eloquent/Usecase/update_with_formula.php>

- Model自体の更新ではなくクエリを使います。
- 数式部分は `raw()` で囲う必要があります。（Laravelの中で使う場合、 `DB::raw()` でも良い）
- クエリで更新した場合、取得済のBookモデルのフィールドの値は更新されないので、更新後の値を持つモデルを使って次の処理をしたい場合は `$book->refresh()` のようにモデルの値を更新する必要があります。
【Unity】TextMeshProでOutlineを変更した際に他のTextMeshProにまで反映されてしまう問題の解決方法

# はじめに
TextMeshProでアウトラインを付けるためパラメータを色々触っていたのですが、他のTextMeshProにも変更が反映されてしまったため、その解決方法を記載します。

# 環境
OS : Windows10
Unity バージョン : 2021.3.2f1

# TextMeshProを利用したアウトラインの付け方
TextMeshProのInspectorの下に行くと、以下のようにMaterialが色々と設定できるようになっています。
今回は、アウトラインを付けたいのでOutlineに✓を入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368729/52d60a6f-f29d-a82d-7edb-7387df562121.png)
アウトラインの色は黒とし、Thicknessを動かすことでアウトラインの太さが変化します。
![Videotogif (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368729/1126dccd-da9e-45ce-d426-ed02ccdc346b.gif)

# 他のTextMeshProにも変更が反映される問題
今度は、もう一行アウトラインを付けたくないText Mesh Proを作成します。
しかし、最初のTextMeshProでアウトラインを付けてしまっているため、Thicknessを変化させると変更してほしくないTextMeshProにまでアウトラインが付いてしまいます。
![Videotogif (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368729/97f9e8d5-428f-843e-d5b4-9678f3444598.gif)

# 解決方法
TextMeshProのMaterial Presetを作成することで解決できます。
Material Presetとは、TextMeshProの装飾の設定を保持するファイルになります。
Material Presetを作成することで、Textごとにアウトラインの太さなどを変更できるようになります。
以下手順になります。
1. TextMeshProのFont Assetをクリックし、設定されているFont Assetまで飛びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368729/353a7ac1-9d50-38cd-411c-e75384b0990f.png)
2. Font Assetを展開すると先程設定したThicknessの情報を保持したMaterialが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368729/f3b88889-c116-790f-1dda-c48a5455f950.png)
3. Inspector右上の設定を開いて、Create Material Presetを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368729/5b3bbfd3-0d68-1d5f-51ab-1262d519ae79.png)
4. Font Asset外にMaterial Presetが作成されます。
Material Presetの名前を変更する場合はFont Asset名を含めるようにしてください。ここで作成したMaterial Preset名にFont Asset名が含まれていないと以降の手順で問題が起こります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368729/f8d43bf9-56c2-628c-8a43-e126354aec2e.png)
5. アウトラインを付けたくないTextMeshProのInspectorまで移動し、先ほど作成したMaterial Presetを選択します。
手順4でMaterial Preset名をFont Asset名の含んでいない名前に設定すると、Font Assetの選択欄に表示されなくなってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368729/60f3ea7b-4295-a843-2878-5b1edb321bac.png)
6. これで変更したいTextMeshProのみ変更が反映されるようになります。
![Videotogif (4).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368729/374a1bf7-87d9-5ed1-fece-203c533921d9.gif)

# まとめ
TextMeshProでOutlineを変更した際に、他のTextMeshProにまで反映されてしまう問題は、Material Presetを作成し、装飾の設定を複数持つことで解決できます。
全分科会に手話通訳と文字通訳がついた全国大会で講演者にお願いしていること

# はじめに
デフエンジニアの会、アドベントカレンダーの14日目です。

自己紹介をします。ゆうといいます。大学生の頃から手話とノート／PCテイク。また、フェミニズムやクィア理論などに興味を持ち勉強や活動を続けてきました。
今は、デザインやフロントエンド、アクセシビリティに興味を持っています。また、いくつかのアクティビズム（社会運動）、コミュニティの管理人、ボランティアなどをしています。

当初は、非デザイナーや非エンジニア向けにどういったツールが良いか、
使ったことのあるツールPhotoshop、Illustrator、PowerPoint、Figam、Canva、STUDIOあたりを比較してみようかと思いましたが、初心者向けはいろいろ難しい……と感じたので、別の内容の記事です。

# イベントと情報保障
ジェンダー系のイベントでも、デザインやフロントエンド周りでも共通して感じること。
それは、情報保障のついたイベントが少ないこと！！
また、情報保障があったとしても、「UDトーク」か「captiOnlineでの要約筆記」か「手話通訳」、このうちのどれか１つであることが多いです。

手話が母語という方もいれば、地域の学校に通い手話が分からない聴覚障害者もいます。そのため、自分にあった手段を選べるのが一番理想的だと思います。

昨年度から関わっている「セクシュアルマイノリティと医療・福祉・教育を考える全国大会」（以下、セクマイ大会）では、字幕と手話通訳がついている数少ないイベントの1つだと思います。しかし、去年関わってみて、登壇者に事前にアクセシビリティや情報保障について説明した方がより良いイベントにできると感じました。
例えば、分科会の担当者を通じて１週間前に登壇資料を送っていただくよう、お願いしていますが、なぜ大事なのか。伝わっていないように感じました（手話通訳や要約筆記を行うための事前資料として必要です）。

今年からは、分科会担当者と講演者の事前打ち合わせに混ざって、講演資料の作成や事前収録の動画、当日の発表について、気をつけると良いことを説明するようにしました。その説明用に作成した資料を公開します。

## セクマイ大会での登壇者向けの説明資料（Googleドキュメントのリンク）
https://docs.google.com/document/d/1klGBKEsOQ1PRoI1qMV1rjiKoPUyxw2i4J3Hn_NjXzY4/edit

# 参考
## 大会ホームページ
https://queertaikai2020.wixsite.com/2023
リンクが去年のままの部分が残っていたりしますが。ボランティアも募集していますー。興味ある方がいれば、ぜひ。

## Peatix
https://peatix.com/group/7183814
まだチケットは販売していないです。このPeatixのアカウントから販売予定です。

# その他
イベント主催者向けにUDトークの使い方を説明しました。
ジェンダー系のイベント向けですが、単語リストを除けばどんなイベントでも通じる話だと思います。
イベント自体は終了しましたが、アーカイブを販売しています。
（字幕や手話通訳などはついていません）
https://queer-udtalk-archive.peatix.com/

# さいごに
テック系のイベントでもUDトークがつくことは、たまにあるようになりました。
「[Webアクセシビリティの学校](https://a11yschool.doorkeeper.jp/)」や「[コンセント](https://peatix.com/group/9118)」、「[GAAD JAPAN](https://www.gaad.jp/)」など。
手話通訳がついていたイベントとして、パッと思い浮かぶのは「[アクセシビリティの祭典](https://accfes.com)」ぐらいでしょうか（字幕もついていました）。

もう少し、アクセシビリティ以外の分野でも情報保障が拡充すると良いなと思っています。
また、デザインやテック系のイベントで手話通訳してみたいとも思っています。ただ、通常手話通訳は15分や20分で交代して、ペアないし3人で行います。
1人で長時間の通訳は厳しいので、もうせめて2人ぐらい一緒にやっていく方がいれば嬉しく思います。
もし興味がある方がいれば、[私のTwitterアカウント](https://twitter.com/yuhyuh__)などにご連絡ください。
MySQL闇歴史2　ジャッキー・チェンのファンクラブ

MySQLの歴史と関わり(?)のあるジャッキー・チェン。もちろん別に深い関わりは一切無い。

知名度：★☆☆☆☆
闇度　：☆☆☆☆☆
闇組織度：★★★★★

MySQL社の日本法人であるMySQL株式会社は2006年設立。登記簿上は東京の会社じゃない時期もあったようだし新宿のレンタルオフィスを拠点にしていた時期もあったが、2007年2月に本社オフィスを恵比寿に移転。不思議な構造の恵比寿ISビルの6階にオフィスを構えていた。駅からそこまで遠くなく、途中から広いセミナルームも同じフロアで借りたので良いオフィスだった。

このオフィスのすぐ上のフロアにあったのが株式会社ジャッキー・チェン インターナショナルファンクラブという会社の東京事務所。ググると恵比寿ISビルの7階という情報が残っている。MySQL株式会社のオフィスに行ったときに「ジャッキー・チェン」という予想もしない文字がフロア案内に載っていて意外すぎだった。あるときオフィスにいたら上の階からドタバタと大きな音がしていて「ジャッキー・チェンが来て暴れてるのかな？」とかみんなで話していた思い出も。

MySQL株式会社のオフィスはSunとの買収に伴って閉鎖されてしまい、ジャッキー・チェンとエレベーターで出くわしたりすることは最後までなかった。そもそもファンクラブのオフィスには本人は足を運ばないか。

ちなみにこのジャッキー・チェンの日本の公式ファンクラブは2010年頃にはすでに新規入会を中止していて、いまはもう無くなっているようである。
【GoogleDataPortal 】Qiita公式Twitterで人気なアドカレ投稿はいつの何!?


[Qiita株式会社 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/qiita-inc)の16日目は、
マーケティング担当のちゃんみ（@chanmi-narita）がお届けします。

https://qiita.com/advent-calendar/2022/qiita-inc

# はじめに

Qiitaでは、たくさんの方にアドカレを楽しんでいただきたく、11月からアドカレ関連のツイートを毎日地道に投稿しています。
今回はGoogleDataPortalを活用してフォロワーの皆さんから注目されているツイートを確認していきたいと思います。


~~本当は推しから毎朝おはようメッセージが届くLINE BOTを作ろうとしていたんですが、~~
~~謎の力により毎晩スヤスヤ眠ってしまったので、また別の機会に投稿しようと思います。~~

# 大まかな手順

- Twitterダッシュボードを作成する
- `#Qiita` アドカレのキーワードに絞って投稿を表示する
- 各指標上位のツイートを確認する


# 1. Twitterダッシュボードを作成する

Twitter Analytics × GoogleDataPortalを活用したダッシュボードの作成方法は以前こちらの記事にまとめてあります。

https://qiita.com/chanmi-narita/items/b590bf260a986a95e53d

今回も同様の手順でダッシュボードを作成しました。

![ダッシュボード作成完了画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/09f3316a-6e53-fc9b-200e-b5fd5725e729.png)
Qiita Advent Calendar 2022 特設ページ公開直後のツイートが伸びすぎて、グラフが機能していないですね（笑）


尚、初めて知ったのですがTwitter Analyticsでデータをエクスポートできるのは30日分までのようです、、
今回は11〜12月の2ヶ月分のデータが欲しかったので、2回に分けてデータを出力しました（ぐぬぬ）

# 2. `#Qiita` アドカレのキーワードに絞って投稿を表示する

Qiita公式Twitterではアドカレ関連のツイートには `#Qiitaアドカレ` というハッシュタグを付けて投稿しています。
なので、フィルタを使ってツイート本文に `#Qiitaアドカレ` を含むツイートに絞り込みます。

![設定完了画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/7e190a79-e675-2850-0597-94a783b2300e.png)


アドカレに関する投稿だけが表示されました。
見たい指標毎に昇降順を変え、それぞれの傾向を見ていきます。

# 3. エンゲージメント上位のツイートの内容を確認する

まずはエンゲージメント率の高いツイートを上から順に確認していきます。

**エンゲージメント降順**
![エンゲージメント率降順.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/a0087122-7dc3-1cce-148d-9a70f18453c8.png)
*※実数の公開は控えます*

11/1の投稿は初回投稿、且つ固定ツイートのためかなりエンゲージメント率が高いです。
それ以外で言うと、以下のようなツイートが反応率が高い傾向にあるようですね。

- 最新のランキング公開ツイート
- 特別企画の紹介ツイート
- プレゼントカレンダーの新着ツイート

やはり新着のランキングやカレンダーは気になりますよね。
今後も新鮮な情報を新鮮なうちにお届けできるよう、邁進してまいります💪

# 4. インプレッション上位のツイートの内容を確認する

次に、インプレッション数の多いツイートを上から順に確認してみます。

**インプレッション降順**
![インプレッション降順.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/c3f1096f-fdfb-60ec-1b5c-cf39a65f1ce3.png)
*※実数の公開は控えます*

11/1の投稿は初回投稿、且つ固定ツイートのためRTが多く、インプレッションもかなり伸びています。
それ以外のツイートは、エンゲージメントランキングとは顔ぶれが少し異なり、
以下のようなツイートが上位にランクインしています。

- Qiita Advent Calendar 2022キックオフLIVE告知ツイート
- 最新のランキング公開ツイート
- 特別グッズのアイデア募集ツイート
- Qiita Advent Calendar 2022 Online Meetup告知ツイート


イベント告知やグッズのアイデア募集ツイートは、
エンゲージメントはさほど多くないがインプレッションがとても伸びている様子。
どういうアルゴリズムなのかな？

いずれにせよ、Qiitaのオンラインイベントや共同グッズ制作に関する企画に、
フォロワーを始めとする皆さんが注目してくださってることが分かり、とても嬉しいです！

# おわりに

Qiita Advent Calendar 2022は残すところあと10日間となりました！
今後も皆さんに素敵な情報をお届けできればと思いますので、アドカレへのたくさんのご参加をお待ちしております！

◆ ◆ ◆ 

[Qiita株式会社 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/qiita-inc)の17日目は、【@ohakutsu & @taka-k】がお届けします。
ぜひ、[Qiita株式会社 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/qiita-inc)を購読して、明日の記事もご覧いただけると嬉しいです♪

https://qiita.com/advent-calendar/2022/qiita-inc
AWS ANS-C01の惨敗記録

# 宣伝

BeeX Advent Calendar 2022 の15日目で～す('◇')ゞ
(ごめんなさい、日付が変わり間に合わなかったです(´;ω;｀))
[BeeX Advent Calendar 2022](https://qiita.com/advent-calendar/2022/beex)

# はじめに

タイトル通りなのですが、先日、AWS Certified Advanced Networking - Specialty(ANS-C01)に臨んだ結果、見事に惨敗してしまったので、自身の戒めのために、細々と記事をかいていこうと思います。
まず、試験に臨む前の私はこう思っていたんですよね。

- いけるっしょ！！
- 余裕っしょ！！
- 何とかなるっしょ！！

といった何故か根拠のない自信をたっぷり持っており、その状態で試験に臨みました。
そして、試験が始まり15問目を解き終えることろには、「**あっれれぇ～おかしいぞぉ～**」となり、
30問目を解き終える頃には、心の中で「**ひでぶっ**」と叫びながら血反吐を吐き、
65問目を解き終える頃には白い天井をずっと見上げてました。。。

そして、試験結果が出ました。
試験結果が出る前から、「あぁ、多分駄目だろうなぁ」と思ってましたが、実際に不合格という文字を持たときは、けっこうショックが出かかったです。
結果は、703点というなんとも微妙な点数で敗退するというオチとなりました。
![スコアボード_20221205_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/b7bd2944-5d46-e9e6-302f-ac6077f75722.png)

なので、この失敗を乗り越えられるように、試験を通じてどういうところが、この試験では求められているのかについて、自身の備忘録として書いていこうと思います。

# AWS公式　大事ポイント

AWSでは、ここ大事だよポイント4点を公開してます。
まずは、ここに出てくる単語や意味や注意点を整理することが重要だと思います。
https://aws.amazon.com/jp/certification/certified-advanced-networking-specialty/

- AWS テクノロジー、AWS セキュリティのベストプラクティス、AWS ストレージオプションとその基礎となる整合性モデルの活用と、AWS ネットワークのニュアンスや AWS のサービスの統合への関連性についての、専門的な経験。
- 高度なネットワークアーキテクチャと相互接続オプション [例: IP VPN、マルチプロトコルラベルスイッチング (MPLS)、VPLS (Virtual Private LAN Service)] に関する知識。
- オートメーションスクリプトとツールの開発に精通していること。これには、以下の設計、実装、および最適化が含まれます。ルーティングアーキテクチャ (静的および動的を含む)、グローバルエンタープライズ向けのマルチリージョンソリューション、可用性の高い接続ソリューション (例: AWS Direct Connect、VPN)。
- CIDR とサブネット (IPv4 と IPv6)、IPv6 移行の課題、AWS WAF、侵入検知システム (IDS)、侵入防止システム (IPS)、DDoS 保護、EDoS (Economic Denial of Service/Sustainability) などのネットワークセキュリティ機能の一般的なソリューションに関する知識。


# 試験中に感じた勉強不足ポイント

続いて私が試験を通じて勉強不足に感じた点を下記に記載いたします。

## AWSサービス知識
 
AWSサービスで知識不足を通じた箇所

- AWS Global Accelerator
- AWS Resource Access Manager
- AWS Transit Gateway
- AWS Direct Connect
- NAT Gateway
- AWS Outposts
- Amazon CloudFront

## 最適解を問う問題で知識不足を感じた箇所

最適解を問う問題で知識不足を感じた箇所

- スポークVPC構成の最適なルーティング設定
- 通信レイテンシーを改善する際の最適解を問う問題
- ACM証明書とクライアント証明書の最適解について

# 最後に
負けて終わりではなく、ちゃんと再チャレンジします。
次こそは、**合格**の文字が見れたらいいなって思ってます。
※本記事は、筆者本人が大事ポイントをまとめただけなので、その点をご了承ください。


# 2022/12/27 追記

無事に合格できました。
ギリギリすぎるので、褒められる点数ではないですが。。。
![スコアボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/d6059120-e794-3add-9cfe-88bfba7d52f0.png)
LRA1 の親機の安定性を UP

「LoRa 無線モジュール LRA1 を動作確認」
https://qiita.com/nanbuwks/items/c1f8f5f2f71748f16715


では、以下のようにして通信をしていまいた。

> ```
>RECV -1
>```
>
> 待受状態にします。
> # 通信してみる
> 送信機側で以下のようにタイプしてエンターします。
> ```
> >SEND "HOGEHOGE"
> ```
> 
> とすると、受信機側に以下のように表示されました。
> ```
> @-26,5,HOGEHOGE
> ```
> 
> 「＠RSSI, 送信側 ID, 受信 Data」の形式で表示されます。


受信機側には RaspberryPi の GPIO 上の UART0 信号線をつないでいます。

|LRA1 ピン番号| LRA1 GPIO|Raspberry Pi ピン番号| Raspberry Pi GPIO|
|:---:|:---:|:---:|:---:|
|2|PA05 UART RX|8|UART0 TX|
|3|PA04 UART TX|10|UART0 RX|

この待受状態にて、Break キャラクタを入力すると、
```

Break
OK
>
```
という表示がなされてコマンド入力待ちに戻ります。

しかしながら Break キャラクタ/信号を入力しない限り、受信動作を継続するはずです。

# 問題

しかしながら、数時間〜数十時間通信していると、受信機側で

```
> 
```

という表示になって待受が止まるという現象が発生することがありました。

はてな?

# 環境

```
- i2-ele LRA1 Ver 1.08.d+
```

# 対策を考える

「LoRa 無線モジュール LRA1 を動作確認」
https://qiita.com/nanbuwks/items/c1f8f5f2f71748f16715
では、
> 電池駆動でRXのノイズ入力を抑制する
において
> RXD(PA05)がハイインピーダンスなので、ばたついてCtrl+C入力とみなされプログラムが停止したりします。

ということがありました。しかしながら今回は RaspberryPi に接続しているので Ctrl+C などではないはず?


# 通信内容の文字化け

さて、LRA1 の子機からの通信電文は以下のような内容を送っています。

```
7 210 400 10225 491 13 3704 70b3d559e01d25a3\r\n
```

受診時には、RSSI と送信元ID を付加して、

```
@-77,8,7 210 400 10225 491 13 3704 70b3d559e01d25a3\r\n
```

というようになっています。

しかしながら時々、以下のように文字化けして受信することがあります。


```
\xf8\xd2W"wA\xd1\x04Q\x9aGd:]g`\xbaG`\xba\x1dWe:\x1d\xf7\xe4z\xa7d\xba\xa7\xe4:]g\xe8\xf9\x0e\xff\xe8\x02U:VQ\xd1\x05W\x8bG\xe4:]\xc7\xe0\x1d\xc7\xe09\x07e9w\xe0\x1d\x97\xe5\xb4\x9dGx\xba\x9dCd\xbe\x9dn\xff@-76,8,7 210 401 10226 491 13 3706 70b3d559e01d25a3\r\n
```

そして、先の待受が止まるという現象は、文字化けが多い時によく起こっている気がします。

# 推測する

文字化けしていても、待受が止まるということは無いはずなのですが、ちょっと内部的になにか影響している可能性があります。
さて、

> Break キャラクタ/信号を入力しない限り、受信動作を継続するはずです。

と書きましたが、通常は Break キャラクタのみ反応します。Break キャラクタは内部 BRKCH によって決められ、通常は0x03(Ctrl+C) となっています。そして BRKCH が 0 に設定している場合は Break 信号で Break されます。

ところがこれについてはバグがあったらしく、最近のアップデートでの修正がアナウンスされていました。


> ①アップデート種類:LRA1ファームウェア
> ■変更内容
> *****1.13f 2022/10/25******
> ・BRKCH変数が０以外でもBREAK信号が有効だったバグを修正し、
> マニュアルどおりの動作にしました。（BRKCH=0のみBREAK信号が有効）

現在使っているのは Ver 1.08.d+ だったので、関係するかな?


# ファームウェアのアップデート

2022/12/15 に公開された、Ver 1.15a アップデートしてみたました。

アップデートに伴い、挙動が変化しました。
親機側で変なデータが来たら RECV -1 を再送するようなプログラムにしています。それが Ver 1.08d+ では予期した挙動をせず、RECV -1 を受け付けていないような挙動をしていました。
それがちゃんと RECV -1 を受けるようになっているみたいです。

ひとまずこれで動作テストしてみます(結果どうなったかは折を見て追記します)。
ELPI の組込述語 (std.map編)

ELPI の組込述語 (std.map編)
=====================

@suharahiromichi

2022/12/16
ELPI (文献[2]) の組込述語の3回めとして、ELPIのソースコード [1]

``src/builtin_map.elpi``

に定義されている、連想配列（ハッシュ）を扱うライブラリの説明をします。全順序な値をキーとして、平衡二分木を使って実装しています。

この記事の元になるソースコードは以下にあります。

https://github.com/suharahiromichi/prolog/blob/master/elpi/elpi_std_map_note.elpi


# std.map の使い方
述語名の前に``std.map``をつけて使います。


## pred make i:(K -> K -> cmp -> prop), o:std.map K V.


```prolog:

pred cmp2 i:string, i:string, o:cmp. /* o に注意！ */
cmp2 X X eq.
cmp2 X Y lt :- X < Y.
cmp2 X Y gt :- X > Y.

pred test1.
test1 :-
      std.spy(std.map.make cmp2 K),
      print K.


```

## pred find i:K, i:std.map K V, o:V.


```prolog:

pred test2.
test2 :-
      std.map.make cmp2 T,
      not (std.spy(std.map.find "abc" T _)).


```

## pred add i:K, i:V, i:std.map K V, o:std.map K V.


```prolog:

pred test3.
test3 :-
      std.map.make cmp2 T,
      std.map.add "abc" 123 T T1,
      std.map.add "abc" 456 T1 T2,
      std.spy(std.map.find "abc" T2 V),
      print V,
      not (std.spy (std.map.find "xyz" T2 _)).


```

## pred remove i:K, i:std.map K V, o:std.map K V.


```prolog:

pred test4.
test4 :-
      std.map.make cmp2 T,
      std.map.add "abc" 123 T T1,
      std.map.remove "abc" T1 T2,
      not (std.spy(std.map.find "abc" T2 V)).


```

## pred bindings i:std.map K V, o:list (pair K V).


```prolog:

pred test5.
test5 :-
      std.map.make cmp2 T,
      std.map.add "abc" 123 T T1,
      std.map.add "xyz" 789 T1 T2,
      std.spy (std.map.bindings T2 L),
      print L.


```

# 参考文献
[1] ELPIソースコード
https://github.com/LPCIC/elpi/tree/master/

[2] λProlog (Lambda Prolog) の紹介
https://qiita.com/suharahiromichi/items/a046859da0c0883e7304

[3] ELPI の組込述語 (stdlib編)
https://qiita.com/suharahiromichi/items/1d200a9320e04ca21953

[4] ELPI の組込述語 (std.set編)
https://qiita.com/suharahiromichi/items/ed9a801717af73217108


```
プログラマブルブートストラップの概要を整理する

この記事は [EAGLYS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/eaglys_adcal) の10日目の記事です

# はじめに
TFHEに触れ始めてから１年弱経ったこともあり，人に聞かれることも増え始めてきたこの頃，今回のアドカレでTFHE関連の話題を予備知識なしの状態から始めて，詳細までまとめようと思います

**突貫で書いてしまった部分もあるので，大いに誤りを含む可能性があります．誤字・脱字レベルでも構いませんので，ご指摘ください．
また，予告なしに内容の加筆や構成の変更を行うことがありますが，読みやすくするためのものですので，ご容赦ください**

今回のアドカレの関連記事（気になるところから読んでください）
#### TFHEの概要
１日目：[Torus・TLWEの概要](https://qiita.com/0917laplace/items/1c5f35e0397de2d19062)
５日目：[TRLWE・TFHEの概要](https://qiita.com/0917laplace/items/b9fd6603ad9fe0a23ec9)
10日目（イマココ）（プログラマブルブートストラップの概要）：

#### TFHEの詳細
11日目（TFHEの暗号化方式の詳細（前半））：
12日目（TFHEの暗号化方式の詳細（後半））：
18日目（プログラマブルブートストラップの詳細（前半））：
19日目（プログラマブルブートストラップの詳細（後半））：

#### multi-key TFHEの概要
15日目（multi-key TFHEの概要）：

#### TFHEの最新動向
20日目（TFHEの最新動向（理論編））：
25日目（TFHEの最新動向（実装編））：

# プログラマブルブートストラップについて
これは，プログラマブルとブートストラップに分けることができます
前者は後で触れることにして，ブートストラップとは，大雑把には暗号文からノイズを取り除く操作を言います

TFHEの暗号化方式では，暗号文中にノイズを格納するため，例えば，暗号文の足し算を何度も行うと，ノイズが蓄積されていきます
ノイズの格納サイズには許容範囲があり，それを超えると，元の平文に復号できない可能性があります

そのため，足し算などの演算回数の操作を制限する（leveled方式）こともできますが，それだと不便すぎるので，途中でノイズを取り除けるといいよねっていう技術がブートストラップというイメージです

ブートストラップは次の3つの操作に分けることができます

1. Blind Rotation
2. Sample Extraction 
3. Key Switching

次からこれらの操作の大枠を説明します（詳細は18, 19日目の記事で）

# Blind Rotation

> ブートストラップとは，大雑把には暗号文からノイズを取り除く操作

と書きましたが，本当に取り除こうとすると，それは復号とやっていることが変わらずあまり意味がありません

そうではなく復号できるような候補（=ノイズがない）の値を配列の形などで事前に格納しておきます
（test vector, test polynomial とか言われるやつを使います）

そして，暗号文からその値を参照して，ノイズがない場合の値に置き換えることで，ノイズを取り除く，と表現しています

しかし，値を参照する上で，暗号文に色々と細工が必要で，Rescaling, Sample Extraction, Key Switching という３つの操作を行います
＊厳密には，Rescaling は Blind Rotation の前に行いますが，これは本質ではないので今回は割愛

# Sample Extraction
Sample Extraction とは，Blind Rotation で値を参照する際に，元の暗号文はTorusの元のベクトルなのですが，それがTorus上の多項式のベクトルに変わってしまいます

やりたいことは，元の暗号文のノイズを復号することでしたから，形を戻すためには，多項式を更にベクトルと見て，1つの長い（=サイズが大きい）ベクトルとみなします

Sample Extraction は実はこれしか行なっていません（だから計算量的に小さい）

# Key Switching
Sample Extraction からベクトルを受け取りますが，そのベクトルのサイズは，元の暗号文のサイズよりも大きいので，サイズを調整する必要があります

その際に，Switch鍵（とかKey Switching Keyとか）を使って，サイズを元に戻します

# プログラマブルについて
ブートストラップの応用がプログラマブルブートストラップ（functional bootstrapとも言います~~っていうかこっちの方が主流らしい~~）です

こちらは test-polynomial にTorus上の任意の関数の情報を加えることができる技術になります
＊厳密にはTorus上ではないんですが（再三の繰り返し）

一般に暗号文は復号して暗号化したら元の暗号文に戻ります
そこで事前に平文から別の平文へ変換（何かしらの関数を作用させる）させることで，暗号文１→平文１→平文２→暗号文２と別の暗号文へと変換させることが可能です

これを上記のブートストラップと組合せることで，ノイズの入った暗号文からノイズの入っていない別の暗号文への変換が可能となります

また上記の「変換」には何も制約がないため，（あくまでTorus上の）任意の関数を作用させることができます

こちらも詳しいことは，19日目の記事にて

-------------------------
今回の内容はここまでです．ここまでご覧になってくださった方々ありがとうございます！
Pythonで地震情報を取得する


これは[防災アプリ Advent Calendar 2022](https://adventar.org/calendars/7488)の16日目の記事です。


# はじめに
こんにちは、UD_Ri-chan(Rikuyade)30615🐺🎤です。
地震関連ではSeto City Camと名乗っています。

最近地震観測してn(ry
OBS使うとPCがフリーズするのなんとかしたい(切実)

最近は、Python / discord.pyを8月に始めてDiscord Botを作ってたり、11月くらいにC#を始めてちょいちょいソフトを作ってたりします。


# 概要
Pythonを使用して、最新の地震情報を取得するものを作ります。この記事では、P2P地震情報 JSON API v2から地震情報を取得することにします。

https://www.p2pquake.net/json_api_v2/

## この記事を書くにあたっての環境
・Windows 10 Home 22H2(64bit)
・Python 3.10.5
・pip 22.3
・requests 2.28.1


# 1. 地震情報APIからデータ(JSON)を取得する
まず、地震情報APIからデータを取得します。前述したとおり、P2P地震情報 JSON API v2から地震情報を取得していきます。

## 必要なモジュールをインストールする
地震情報を取得すること、つまり、インターネット上からデータを取得する必要があります。

Pythonにおいて、インターネット上からデータ取得するには、追加でモジュールをインストールする必要があります。
この記事では、```requests```というモジュールを使用していきます。

コマンドプロンプトなどを起動して、

```
pip install requests
```

と入力して実行してください。
これでモジュールがインストールされます。

:::note info
上記のコマンドを実行したあとに、
```
pip list
```

と入力して実行すると、モジュールが正しくインストールされているか確認することができます。
`requests`と書かれている行があれば正しくインストールされています。
:::

## 地震情報のデータ(JSON)を取得する
:::note info
以降登場するコード内の変数名は、適宜置き換えていただいて構いません。
:::

P2P地震情報 JSON API v2は、JSONという形式で地震情報などが提供されています。
このJSONを取得していきます。

```python:JSON取得
#インターネット上からデータを取得するためのモジュールをインポート
import requests
#リクエストするURLを指定(最新の地震情報のデータを取得することができるURL)
p2pquake_url = 'https://api.p2pquake.net/v2/history?codes=551&limit=1'
#リクエスト(データを取得する)
p2pquake_json = requests.get(p2pquake_url).json()
```

これで、最新の地震情報のデータが取得できます。


# 2. 取得したデータ(JSON)の中から、必要なものを取り出す
取得したデータ(JSON)の中から、必要なものを取り出します。
今回は、```震央地名```を取り出すことにします。

## データ(JSON)の中身を見てみる
まず、P2P地震情報 JSON API v2のJSONを中身を見てみましょう。
先ほどのコード(プログラム)の変数`p2pquake_url`の右に書いてあるURLをブラウザで開いてみましょう。

そうすると、震央地名は、```1つ目の配列(配列番号0)```の中の```earthquake```の中の```hypocenter```の中の```name```に入っていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064849/25359f6f-756a-a15d-a6c4-c5ff9fec7f87.png)

:::note info
Google ChromeやMicrosoft Edgeの場合、デフォルトではJSONが非常に見ずらい状態となってしまいます。
そこで、拡張機能を入れることによりJSONが見やすくなるので、導入をおすすめします。
自分は、下の拡張機能を導入することによって、上記の画像のように表示されるようにしています。
:::

https://chrome.google.com/webstore/detail/json-viewer/efknglbfhoddmmfabeihlemgekhhnabb

## 実際に書いてみる
先ほどのことを踏まえると、下記のように記述することになります。

```python
#震央地名を取り出して、変数Eq_nameに代入する
Eq_name = p2pquake_json[0]["earthquake"]["hypocenter"]["name"]
```

これで、震央地名を取得できます。

上記のコードのあとに

```python
print(Eq_name)
```

を書くと、

```:出力結果(例)
奄美大島近海
```

のような形で出力されます。

震央地名だけではなく他のものを取得したい場合は、P2P地震情報 JSON API v2のAPI仕様とJSONの中身を照らし合わせたりして、いろいろ試してみてください。

https://www.p2pquake.net/json_api_v2/


# さいごに
最後まで読んでいただきありがとうございました。
今回紹介したものとdiscord.pyを組み合わることによって、地震情報を取得できるDiscord Botを作れたりします。
興味があれば、ぜひ挑戦してみてください。

さて、今回、人生で初めて記事を書きました。
書き方や日本語がおかしいところがあるかもしれませんが、大目に見ていただけると幸いです。

Advent Calendarがあるというのは去年から知っていましたが、去年は書くようなことが無かったので参加していませんでした。
今回のAdvent Calendarでこうして参加することができたことを嬉しく思っています。
今後また記事を書くことがある際には、ぜひよろしくお願いします。

## 出典
P2Pquake JSON API v2: Earthquake information by [Japan Meteorological Agency](https://www.jma.go.jp/jma/index.html) / [CC BY 4.0](http://creativecommons.org/licenses/by/4.0/deed.ja)
リファクタリングにおける「マクベス症候群」を予防する

# はじめに　
この投稿は[ZOZO　アドベントカレンダー２０２２ #2](https://qiita.com/advent-calendar/2022/zozo)　16日目の記事になります。

# マクベス症候群とは

> 血の流れにここまで踏み込めば、渡り切ることだ、行くも帰るも困難なら、もどることは思いきるのだ。（マクベス第三幕第四場）

ということです。。。
つまり、リファクタリング時、リファクタリングをしすぎて、逆に複雑になってしまうケース。
複雑になって元に戻すこともできず、気が済むまでリファクタリングをしていってもさらに複雑になってしまう。。。

経験ないでしょうか？

マクベス症候群という言葉は書籍「[レガシーソフトウェア改善ガイド](https://www.amazon.co.jp/dp/B01MSLAFPT)」で紹介されています。

# 予防策

ではマクベス症候群を防ぐにはどうすればいいか？

## リファクタリングを、他の作業から分離する

リファクタリングをするときに、何かの作業のついでに。というのは正解です。
ただ、リファクタリングする時間と、実作業をする時間、コミット、PRなどは分けたほうがいいです。
リファクタリングに失敗した場合、作業を戻したい場合にこのやり方は有効ですし、リファクタリングという行為は元の処理は変えずにソースコードをきれいにする行為なので、分けたほうが良いというのもあります。

ちなみにリファクタリングだけをずっと行うことはあまり心象が良くない可能性がありますので注意です。
アプリケーションの進化が止まっている状況であるためです。

## IDEを活用する

IntelliJなどのIDEが用意しているリファクタリングの機能は優秀で役に立ちます。
ガンガン使っていけると良いですね。

## まとめ

マクベス症候群は用語はあまり聞かないですが、リファクタリングあるあるでしょう。
気をつけていきましょう！
TRLWE・TFHEの概要を整理する

この記事は [EAGLYS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/eaglys_adcal) の５日目の記事です

# はじめに
TFHEに触れ始めてから１年弱経ったこともあり，人に聞かれることも増え始めてきたこの頃，今回のアドカレでTFHE関連の話題を予備知識なしの状態から始めて，詳細までまとめようと思います

**突貫で書いてしまった部分もあるので，大いに誤りを含む可能性があります．誤字・脱字レベルでも構いませんので，ご指摘ください．
また，予告なしに内容の加筆や構成の変更を行うことがありますが，読みやすくするためのものですので，ご容赦ください**

今回のアドカレの関連記事（気になるところから読んでください）
#### TFHEの概要
１日目：[Torus・TLWEの概要](https://qiita.com/0917laplace/items/1c5f35e0397de2d19062)
５日目（イマココ）（TRLWE・TFHEの概要）：
10日目（プログラマブルブートストラップの概要）：

#### TFHEの詳細
11日目（TFHEの暗号化方式の詳細（前半））：
12日目（TFHEの暗号化方式の詳細（後半））：
18日目（プログラマブルブートストラップの詳細（前半））：
19日目（プログラマブルブートストラップの詳細（後半））：

#### multi-key TFHEの概要
15日目（multi-key TFHEの概要）：

#### TFHEの最新動向
20日目（TFHEの最新動向（理論編））：
25日目（TFHEの最新動向（実装編））：

# TFHEについて
まずは１・５日目でTFHEの概要を整理します
TFHE は，Torus上のRLWE問題を安全性の根拠とする暗号化方式です
これらを理解するには

- Torus
- TLWE
- 多項式環
- TRLWE

の順で理解すると良いと思います

今回は下2つの多項式環とTRLWE，そしてTFHEについて扱います

# 多項式環
多項式の集合であって，足し算と掛け算ができる，という認識で十分です
＊環の定義はググれば出てきますが，細かいところに突っ込むクリティカルなところは扱わないので，足し算と掛け算ができる，ぐらいでひとまず今回はいいです

以下で少し補足します
まず，どこの多項式で考えるのか（整数なのか実数なのかTorusなのか）が色々ありますが，ひとまず一般の環（足し算と掛け算ができる集合）で考えます

このとき，その環上の多項式全体の集合も，また環になっています
ですから，整数全体の集合 $\mathbb{Z}$ や実数全体の集合 $\mathbb{R}$ の多項式全体を $\mathbb{Z}[X], \mathbb{R}[X]$ と書くと，これらは多項式環です
また，$q$ を素数べきとして，$\mathbb{Z} / q \mathbb{Z}$ 上の多項式全体の集合も多項式環になります（係数同士の足し算・掛け算は $\mathbb{Z} / q \mathbb{Z}$ で行う）

また，環 $R$ に対して，$R_N[X]$ で $R$ 上の $N - 1$ 次以下の多項式環を表すことにします
例えば，$N = 3$ のとき，$2 - 9 X + 5 X^2 \in \mathbb{Z}_3[X]$ ですね

ここで１つ注意ですが，Torusでは掛け算を考えない（[Torus・TLWEの概要を整理する「Torus Torusの演算 掛け算」](https://qiita.com/0917laplace/items/1c5f35e0397de2d19062#%E6%8E%9B%E3%81%91%E7%AE%97)）ので，Torus 上の多項式でも掛け算は考えません
よって，Torus 上の多項式全体の集合は多項式環になりません

# TRLWE
＊本当はTorusを離散化する必要があるのですが，今回は割愛します
TRLWE とは，Torus 上の Ring-LWE 問題のことです

TLWE問題の多項式バージョンです，この問題もTLWE問題と同様にNP完全な問題です

![TRLWE1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1298501/9389be52-feb1-617f-1174-11cd16c34638.png)

![TRLWE2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1298501/5eebbcc8-b7b5-3a83-bbbf-f2663769e07a.png)

$\mathbb{B}_N[X]$ : {0, 1}上の $N - 1$ 次以下の多項式全体の集合（多項式環）
$\mathbb{R}_N[X]$ : 実数上の $N - 1$ 次以下の多項式全体の集合（多項式環）
$\mathbb{T}_N[X]$ : Torus 上の $N - 1$ 次以下の多項式全体の集合（多項式環でない）

この問題を背景としたTFHE暗号化方式を次で紹介します

# TFHE
＊本当はTorusを離散化する必要があるのですが，今回は割愛します
TFHEの暗号化方式とは次のようなものです

![TFHE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1298501/717b7861-2ef4-c49b-d14a-68753e990012.png)

見た目からわかるように，TRLWE問題をもろに使っていて，TFHEの安全性はTRLWE問題の求解困難性に帰着することができます

TFHEの暗号文では足し算や他の方式の暗号文との掛け算を行うことができます（詳細は11, 12日目の記事で）

-------------------------
今回の内容はここまでです．ここまでご覧になってくださった方々ありがとうございます！
docker runしてもコンテナが起動しない時はlogを確認する

## mysqlのコンテナが起動しない

docker runコマンドでmysqlコンテナを起動しようとした
```
docker run --name mysqlex1215 -dit --net=net1215 -e MYSQL_ROOT_PASSWORD=hogehoge -e MYSQL_DATABASE=mysql1215db -e MYSQL_USER=hogehogesan -e MYSQL_PASSWORD=hogehogoesanpass mysql --charcter-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
```

``docker ps``コマンドで起動しているか確認

```
docker ps
> CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

あれ...何も起動していない。なぜ...。

とりあえず``docker ps -a``してみる

```
docker ps -a
> CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                          PORTS               NAMES
1a2b3c4d5e6f        mysql　　　　       "docker-entrypoint.s…"   3 minutes ago        Exited (1) 3 minutes ago                            mysqlex1215
```

存在はしているので作られてはいるっぽい。だけどステータスはExitedなので、やっぱり立ち上がってはいない。


## ログを確認
``docker logs``コマンドで、立ち上がらないコンテナを指定してログを確認してみる

```
docker logs mysqlex1215
> 2022-12-15 14:08:42+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.40-1.el7 started.
> 2022-12-15 14:08:42+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
	command was: mysqld --charcter-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password --verbose --help --log-bin-index=/tmp/tmp.yhw48vmnMJ
> 2022-12-15T14:08:42.050615Z 0 [ERROR] COLLATION 'utf8mb4_unicode_ci' is not valid for CHARACTER SET 'latin1'
> 2022-12-15T14:08:42.051673Z 0 [ERROR] Aborting
```

ERROR出てる！なるほど、文字コード指定しているコマンドがどこかおかしいということか。

あ！！！character が charcter になっている。
![スクリーンショット 2022-12-15 23.51.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638783/afe42206-7492-298e-62af-d029924cef40.png)

ということでただのタイポでしたが、こういうのは意外と気付きにくいものなので、ログ様様だった。
### 困った時はログを確認！！！
【Swift】初心者のランダム通話アプリ開発奮闘記 #12

# 今日の積み上げ
昨日に引き続き、買った本のXcodeのボタン等々の名称を説明してくれている項を読んでいる最中、、
設定が細かくできるんだねえ

今日は大人のデリバリーをしてきました。スッキリしたので、明日からは節約性格です笑
strapi運用を節約する

Strapiをcloud環境などに設置する場合、テキストや画像ファイルなどをその環境に置くことはないかと思います。
大体の場合、テキストはRDSやcloud SQLにsupabaseといった外部のデータベース、画像ファイルはs3やcloud storage, supabaseといった外部のストレージに吐き出すことになるのではないでしょうか。

そんな時、問題となってくるのがお値段です。

テキストは書けば書くほど、画像は置けば置くほどお金がかかります。
多くのクラウドサービスには無料枠がありますが、たいていの場合期限があったり上限が低かったりといったことが多いでしょう。

特に、DBはまあ仕方がないとしても、画像ファイルをどうにかして削減したいと考えるのは自然のことだと思います。
そんなわけで、これら節約術を考えていくというのが今回の記事となります。

なお、最終的な画像出力先、headlessCMSからブログなどの適当なアプリケーションに届けた段階で不都合はいろいろ何とかしてくれるだろという前提で話を進めるので、フロントエンド側で解決できそうなことはすべてフロントエンド側に丸投げする前提で話します。

## そもそも現状はどうなのかを認識する

とりあえず初期設定でファイルをアップロードしてみましょう。

サンプルとして、私のある日の昼食の写真をStrapiにアップロードしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532032/a24fcb88-0e5d-6e25-b3c3-04f65e6972de.png)

アップロードした画像をsupabase側から確認した結果がこちらです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532032/783419a5-24f9-bdf1-ff60-c1b20e32b84e.png)

不思議なことに、一枚のアップロードで+4枚の画像が生成されています。

オリジナルの画像1枚で874.25KB、画像5枚合計のサイズは**1138.12KB**、オリジナルでない写真は名前からわかる通りリサイズしたものなのでシンプルに5枚分の負担がなされるというわけではないのですが、そうであっても無視できない負担です。

## 生成ファイルを可能な限り少なくする

というわけでまずファイルを減らします。
strapiで`settig` -> `Media Library`と移動すると`Responsive friendly upload`という項目を見つけることができます。
説明はこうです。

> Enabling this option will generate multiple formats (small, medium and large) of the uploaded asset

はい消します。Boolean値でtrue/falseが指定できるのでfalseにしてしまいましょう。

ファイルを削除して、再度実行するとこうなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532032/e7c3f2e7-43e6-3d36-f384-144fb2e4db00.png)

small, medium, largeの3枚が消えました。
現時点での合計が**882.51KB**なので、22%くらい削減できたことになります。

## 画像の形式を変える

ここからAVIFに変換することでさらに圧縮を図ります。

providerディレクトリを作成し、supabaseのuploadライブラリとして使用していた`strapi-provider-upload-supabase-strage`をgithubからクローンします。

その後、必要なライブラリを以下のコマンドで取得。ファイルを修正します。
```
npm i sharp
```

```provider/strapi-provider-upload-supabase-strage/lib/index.js
// ...
      async uploadStream(file) {
        // upload the file in the provider
        // file content is accessible by `file.stream`
        const blob = await fileStreamToBlob(file);
        const blobArrayBuffer = await blob.arrayBuffer();
        const data = await sharp(new Uint8Array(blobArrayBuffer))
          .avif()
          .toBuffer();
        file.name = `${path.parse(file.name).name}.avif`;
        let { error } = await supabaseClient.storage
          .from(supabaseBucket)
          .upload(`${supabaseBucketPrefix}${file.name}`, data, {
            contentType: "image/avif",
          });
        if (error) throw error;
        file.url = getFilePublicUrl(file);
// ...
```

以前はReadableStream -> Blobだったのを、ReadableStream -> Blob -> arrayBuffer -> Uint8Array -> buffer(avif)と延長しています。(もう少し短くできる気がする)
使用しているavifはロスレス変換をしていないので厳密には不可逆変換ですが、人間が気が付けるような差はないので写真ブログとかでない限りは気にしなくてよいです。

それでは結果をドン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532032/8f1ab604-2534-99cd-d646-fa4645479971.png)

合計**519.84KB**, 最初の約半分になりました。
変換に時間がかかることがネックですが、これでかなり延命ができるようになったのではないかと思います。
【IchigoJam】いちご探し

[IchigoJam](https://ichigojam.net/)でゲーム「いちご探し」を作ってみた。
(後から気付いたけど、今日は15日、いちごの日だった！)

# ルール

ゲームを開始すると、画面にランダムな数字がたくさん表示される。
この数字の中から「1」を1個、「5」を5個、できるだけ早く探し出そう！

全て探し出せたらゲームクリアで、「10000 － かかった時間(`TICK()`)」がスコアになる。
探し終わる前に時間が10000を超えてしまったらゲームオーバー。

# 操作方法

矢印キーまたはWASDキー：カーソルを移動
スペースキー：決定

※シリアル通信で操作する場合、Tera Term を使う場合など端末ソフトウェアによっては矢印キーが使えないことがある。この場合、WASDキーで操作する。

# プログラム

```
10 ' ｲﾁｺﾞ ｻｶﾞｼ
20 C=1:[0]=RND(16*20)
30 P=RND(16*20):A=1
40 FOR I=0 TO C-1
50 IF [I]=P A=0
60 NEXT
70 IF A [C]=P:C=C+1
80 IF C<6 GOTO 30
90 FOR I=4 TO 0 STEP -1
100 FOR J=0 TO I
110 IF [J]>[J+1] T=[J]:[J]=[J+1]:[J+1]=T
120 NEXT:NEXT
130 C=0:P=0:S=RND(6):[6]=-1:CLS:FOR Y=0 TO 19
140 FOR X=1 TO 31 STEP 2
150 LOCATE X,Y
160 IF P=[C] ?5-4*(C=S);:C=C+1 ELSE V=RND(8):?V+(V>0)+(V>3);
170 P=P+1
180 NEXT:NEXT
190 X=0:Y=0:C=0:LOCATE 0,0:?CHR$(#E1);:CLT
200 T=TICK():IF T>10000 GOTO 370
210 K=INKEY()
220 IF K=LEFT OR K=#41 OR K=#61 Z=(X+15)%16:W=Y:GOTO 280
230 IF K=RIGHT OR K=#44 OR K=#64 Z=(X+1)%16:W=Y:GOTO 280
240 IF K=UP OR K=#57 OR K=#77 Z=X:W=(Y+19)%20:GOTO 280
250 IF K=DOWN OR K=#53 OR K=#73 Z=X:W=(Y+1)%20:GOTO 280
260 IF K=#20 GOTO 310
270 GOTO 200
280 LOCATE X*2,Y:?CHR$(0);
290 LOCATE Z*2,W:?CHR$(#E1);
300 X=Z:Y=W:GOTO 200
310 V=SCR(X*2+1,Y):IF V<>#31 AND V<>#35 GOTO 200
320 LOCATE X*2+1,Y:?CHR$(0);
330 LOCATE C,21:?CHR$(V);
340 C=C+1:IF C<6 GOTO 200
350 LOCATE 7,21:?"CLEAR! SCORE=";10000-T
360 END
370 LOCATE 7,21:?"TIME UP!"
```

# 解説

* 10行目：タイトル
* 20～80行目：探す対象を配置する位置をランダムに決定する (被ったらリトライすることで被らないようにする)
* 90～120行目：配置に使いやすいよう、探す対象の位置をソート (バブルソート) する
* 130～180行目：探す対象を配置する位置の中から「1」を配置する位置をランダムに選び、数字を配置する
* 190行目：カーソルの位置、見つけた数、時間を初期化する
* 200行目：現在時刻を記録し、タイムオーバーの判定をする
* 210～270行目：キー入力を処理する
* 280～300行目：カーソルを移動する
* 310～360行目：決定を処理する (見つけた数字を取り除き、クリアの判定と表示をする)
* 370行目：タイムオーバーの表示をする

# 実行結果

<iframe width="560" height="315" src="https://www.youtube.com/embed/TjyYPdsAHhQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# おわりに

※IchigoJamはjig.jpの登録商標です。
docker swarmとk8sのreplicasを試しました

この記事は MicroAd Advent Calendar 2022 の16日目の記事です。

https://qiita.com/advent-calendar/2022/microad

# 概要
コンテナオーケストレーションツールのdocker swarmモードとkubernetes(k8s)ですが、サービスの負荷を分散のため、コンテナのレプリカ(replicas)機能を提供しています。
仕事で両方を使う機会があったので比べてみました。

# 詳細
## docker swarmモードでのレプリカ設定
設定値を`docker compose`ファイルに定義すれば、docker単体と同様にデプロイすることが可能です。
docker swarmモードの場合、デプロイコマンドは `docker stack deploy` になります。
以下はレプリカ3つを設定した例です。

```yml
...
services:
  xxx-service:
    image: xxx:1.0.0
    ...
    deploy:
      replicas: 3  # レプリカ数
...
```
ちなみに、現時点 docker swarmモードではレプリカのオートスケーリング機能を提供していません。
レプリカ数の変更はマニュアルで再デプロイする必要があります。

```
[www@test-server ~]$ docker stack services test
ID                  NAME                            MODE                REPLICAS            IMAGE              PORTS
13a7gaf3dtio        test_xxx-service                replicated          3/3                 xxx:1.0.0
```

デプロイ後、コンテナのレプリカ3つが作られたことを確認しました。


*[参考]*

https://docs.docker.com/compose/compose-file/compose-file-v3/#deploy

https://docs.docker.com/engine/reference/commandline/stack_deploy/

https://forums.docker.com/t/autoscaling-in-docker-swarm/44353/9

## k8sでのレプリカ設定

k8sのDeploymentファイルの中に設定しています。
以下はレプリカ数3つの例です。設定項目は `docker compose`とは似ていますね。
```yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: xxx-deployment
  namespace: test
...
spec:
  replicas: 3 # レプリカ数
  ...
```

さらに、k8sの場合は負荷面の計測指標に応じるpodのレプリカのオートスケーリング機能も提供しています。
以下の例では、レプリカ数が最小1つ、最大12で設定して、CPU使用率によってpodのレプリカのオートスケーリングが適用されます。

```yml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
...
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: xxx-deployment
  minReplicas: 1 # 最小レプリカ数
  maxReplicas: 12 # 最大レプリカ数
  targetCPUUtilizationPercentage: 80  # CPU利用率の期待値
```

デプロイ直後、podのレプリカは3つが作られまして、その後負荷に応じて8つまで`scala out`したことを確認しました。

```
[www@test-server ~]$ kubectl get pod  --namespace test
NAME                              READY   STATUS    RESTARTS   AGE
xxx-deployment-5cd8d7cb86-ckqc4   1/1     Running   0          89m
xxx-deployment-5cd8d7cb86-l9wrw   1/1     Running   0          87m
xxx-deployment-5cd8d7cb86-lddth   1/1     Running   0          89m
xxx-deployment-5cd8d7cb86-ll7s4   1/1     Running   0          94m
xxx-deployment-5cd8d7cb86-rtm4b   1/1     Running   0          94m
xxx-deployment-5cd8d7cb86-szgd7   1/1     Running   0          89m
xxx-deployment-5cd8d7cb86-v4kw5   1/1     Running   0          87m
xxx-deployment-5cd8d7cb86-wjjpb   1/1     Running   0          94m
```

ちなみに、オートスケーリングの計算アルゴリズムは以下となります。

```
desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
```


*[参考]*



https://kubernetes.io/ja/docs/concepts/workloads/controllers/deployment/

https://kubernetes.io/ja/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/



# まとめ

|  |コンテナ(or pod)のレプリカ|レプリカのマニュアルスケーリング|レプリカのオートスケーリング|
|--|:-:|:-:|:-:|
|docker swarmモード  |⭕️ |⭕️ |❌  |
|kubernetes  |⭕️  |⭕️ |⭕️  |

以上、docker swarmとk8sのレプリカ(replicas)機能の比較結果でした。
[CSS Grid Layout] 左から順に要素を並べ、行落ちした要素も左から順に並べるリストの作り方

# つくるもの

* 同じ幅・高さを持った要素を左から順に横並びに配置する
* 配置するコンテナの横幅は可変（ウインドウ幅に応じて可変する）
* 横幅いっぱいまで配置したら、行落ちしてまた左から順に横並びに配置する
* リスト全体はその親要素の中央に配置する
* 要素の数は可変である

![スクリーンショット 2022-12-15 23.00.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38510/ff15013d-83a3-0fad-c4b2-2a11785459dd.png)

~~（クリスマスっぽくて綺麗ですね）~~

一覧画面などで、情報をカードUIに集約して並べていくものを想像していただくとわかりやすいかなと思います。

こういった場合、 `flex` を使うか `grid`　を使うかで悩むかもしれません。

## flexで作ってみる
私は `flex` に慣れているので、 `flex` で作ろうとしました。
しかし、幅や要素数が可変であるということに、 `flex` だと中央配置や、1行あたりの最大配置数に満たない行が出ると期待した配置になりませんでした。

https://codepen.io/aktuehr/pen/yLEmpPO

![スクリーンショット 2022-12-15 22.55.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38510/4c653a9e-2bf6-007a-fe61-3921d3ce4cfd.png)

~~（クリスマスツリーみたいですね）~~

## gridでつくってみる

`grid` はこういったケースにとても相性が良いです。

まず、 `display: grid` を記述します。

```diff_css
+ .list {
+   display: grid;
+ }
```

次に、繰り返す要素の幅と高さを定義します。
今回はHTMLとCSSだけの例なので、カスタムプロパティを使用します。

```diff_css
+ :root {
+   --height: 32px;
+   --width: 128px;
+ }

.list {
  display: grid;
}
```

次に、中のグリッドがどのようなルールで作られるのかを記述します。

```diff_css
:root {
  --height: 32px;
  --width: 128px;
}

.list {
  display: grid;
+ grid-template-rows: repeat(auto-fill, var(--height));
+ grid-template-columns: repeat(auto-fill, var(--width));
}
```

今回は、「同じ幅・高さを持った要素」を並べるので、行方向・列方向ともに固定の幅・高さの繰り返しとなります。

そのため、 `grid-template-rows` `grid-template-columns` プロパティにそれぞれ `repeat(auto-fill, var(--some-value))` を指定しています。

`repeat()` は、 `grid-template-columns` と　`grid-template-rows` の中で使うことができる関数で、 1つ目に `auto-fill` を指定すると、 2つ目に指定した値を繰り返す場合に、グリッドコンテナをはみ出ない最大の繰り返し値に置き変わります。

https://developer.mozilla.org/ja/docs/Web/CSS/repeat

あとは、要素の間隔を、 `gap` で記述します。

```diff_css
:root {
  --height: 32px;
  --width: 128px;
+ --gap: 8px;
}

.list {
  display: grid;
  grid-template-rows: repeat(auto-fill, var(--height));
  grid-template-columns: repeat(auto-fill, var(--width));
+ gap: var(--gap);
}
```

最後に、地味な要件（　私が　`flex`　で作り得なかった要因）である、リスト全体を親要素から見て中央に配置するための記述を追加します。

```diff_css
:root {
  --height: 32px;
  --width: 128px;
  --gap: 8px;
}

.list {
  display: grid;
  grid-template-rows: repeat(auto-fill, var(--height));
  grid-template-columns: repeat(auto-fill, var(--width));
  gap: var(--gap);
+ justify-content: center;
}
```

これで、可変幅でも表示できる最大の数の要素が横並びになりつつ、行落ちした要素も左寄せで表示がされるようになりました。
![grid.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38510/4368616e-0afc-de88-7e11-cf8ebbf6264e.gif)


# さいごに
触っていただけるサンプルをこちらに置いておきます。参考になれば幸いです。

https://codepen.io/aktuehr/pen/mdKNqBM