OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeのEmmetのCSSを使いやすくする

Emmetの前身であるZen-Codingの時から、CSSの展開をよく使用していました。
Zen-Coding時代から考えると10年以上使用しており、EmmetがないとCSSが書けない体になっています。

ただブラウザの新しいCSSのプロパティや値の追加と、Emmetのスニペットの乖離が、ここ数年でよく見られるようになりました。
Emmetのスニペットの追加方法について、記載します。

## snippets.json

まずはスニペットを格納するディレクトリを用意し、 `snippets.json` を作成します。
ディレクトリ名や場所はどこでも構いません。

`snippets.json`にスニペットを記述します。
下記のコードは雛形です。

```json
{
  "html": {
    "snippets": {
	  "a-b": "<a href=\"${1}\" target=\"_blank\" rel=\"noopener\"></a>"
    }
  },
  "css": {
    "snippets": {
	  "ct": "content:'${1}'"
    }
  }
}
```

`html` と `css` より、スニペットを格納できます。
`snippets` の中に記述していくのですが、 `"ct": "content:'${1}'"` の記述を解説していきます。
左側のキー `ct` は、省略文字です。
右側の値 `content:'${1}'` は、 `ct` から展開されるCSSの宣言です。
宣言の中に `${1}` とありますが、これはキャレットや数値の代入位置になります。

さらにCSSを増やしてみましょう。

```
{
  "html": {
    "snippets": {
	  "a-b": "<a href=\"${1}\" target=\"_blank\" rel=\"noopener\"></a>"
    }
  },
  "css": {
    "snippets": {
      "ct": "content:'${1}'",
      "Lis": "inset:${1}",
      "Lmy": "margin-block:${1}",
      "Lmx": "margin-inline:${1}",
      "Lpy": "padding-block:${1}",
      "Lpx": "padding-inline:${1}",
      "g": "gap:${1}",
      "@u": "@use ${1} {\n\t\n}"
    }
  }
}
```
このようにスニペットを増やせます。
そして省略文字のルールも自分で自由に設定できるのも魅力です。

例えば、Emmetでは `m`, `mt`, `mb` などで、marginプロパティを展開することができます。
ただ新しく使用できるようになった `margin-block` を定義しようとしても、すでに `mb`は `margin-bottom` によって使用されています。
そのため Logical Propertiesの `L` を接頭辞として `Lmy` で `margin-block` を展開。
`Lmb` で論理プロパティの通常フローの下流の `margin-block-end`　を展開するというルールも自分でセットできます。

もちろんEmmetなので、 `Lmy8` とすれば `margin-block: 8px;`　。
`Lmy8-100p` とすれば `margin-block: 8px 100%;` と展開してくれます。

実際のVSCodeでの記入例
![スクリーンショット 2022-12-23 23.53.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75375/0e50c40e-c09b-e591-e967-70c3b98185e9.png)

## 設定

`snippets.json` ができたら、スニペットを追加します。

VSCodeの [Preferences (⌘,)]から環境設定を表示。
環境設定の検索画面から `emmet Extensions Path` で検索。
![スクリーンショット 2022-12-23 23.57.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75375/38f816db-ba6a-d312-733f-d4de961856d2.png)
Extensions Path の項目に、任意のディレクトリ名までのパスを記述してください。

注意点として、必ず `snippets.json` が入っている「**ディレクトリ名のパス**」を入力してください。
`snippets.json` などのファイル名を含めると動きません。

それでは、よいCSSを。
AWS Resource Explorerの結果をCSVで出力する

 この記事は[BeeX Advent Calendar 2022](https://qiita.com/advent-calendar/2022/beex)の22日目の記事です。
今年は遅刻投稿しかしていない気がします(投稿日12/24)

# はじめに
最近AWS Resource Explorerなるサービスがあることを知って実際に触ってみたのですが、対応していないAWSリソースはあるものの構築しているけど自分が認識していないリソースがいくつも見つかって、リソースの把握という観点では非常に使いやすいサービスだと思いました。

ただ、同じようにリソースを把握できるResource Groups & Tag EditorサービスではCSV出力できるところが、AWS Resource ExplorerはCSV出力を行う機能がサポートされていないため、コンソール上で確認しても手元に落として要不要を判断する、といったことがしにくいものとなっていました。

そこで今回はCloudShellを使ってAWS Resource Explorerで取得したリソース一覧をCSV出力する方法を試してみましたので、その方法を書こうと思います。

# 作業内容
## 手順
以下4つの手順でCSV出力を行います。

１．コンソールからCloudShellに接続する
２．以下コマンドを実行する
```
$ aws resource-explorer-2 search --query-string "service:iam" | jq -r '.Resources|map([.Arn, .LastReportedAt, .OwningAccountId, .Region, .ResourceType, .Service])' | jq -r '(map([.[]])[])|@csv' > iam.csv
$ sed -i '1s/^/\"Arn\",\"LastReportedAt\",\"OwningAccountId\",\"Region\",\"ResourceType\",\"Service\"\n/' iam.csv
```
３．CloudShellのActionsからDownload fileを押下して、出力したCSVファイルをダウンロードする
４．手元でCSVを確認する

## 作業
### １．コンソールからCloudShellに接続する
AWSコンソールにログインし、CloudShellのアイコンからターミナルに接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/12f1b654-6b73-e8a0-a1c8-d748bedcb58b.png)

### ２．以下コマンドを実行する
ターミナルから以下のコマンドを実行します。
本当はワンライナーにしたかったのですが、中々うまくいかず、コマンドが2つになりました。
今回は--query-stringの条件でIAMを設定していますが、[こちらのドキュメントに記載している](https://docs.aws.amazon.com/ja_jp/resource-explorer/latest/userguide/using-search-query-syntax.html)フィルターであれば指定可能です。
```
$ aws resource-explorer-2 search --query-string "service:iam" | jq -r '.Resources|map([.Arn, .LastReportedAt, .OwningAccountId, .Region, .ResourceType, .Service])' | jq -r '(map([.[]])[])|@csv' > iam.csv
$ sed -i '1s/^/\"Arn\",\"LastReportedAt\",\"OwningAccountId\",\"Region\",\"ResourceType\",\"Service\"\n/' iam.csv
```

実行すると以下のようにCSVファイルが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/58b40fb0-5d1a-00b3-16e7-f146a9051405.png)

### ３．CloudShellのActionsからDownload fileを押下して、出力したCSVファイルをダウンロードする
CloudShell上に出力したファイルは、Actionsの機能からダウンロードができます。
出力したファイルのフルパスを指定してローカルPC内にCSVファイルをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/2ffd198e-2280-82c2-b554-192a2e7e3986.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/a753e5b8-d415-a931-919f-a5092d53aca6.png)

### ４．手元でCSVを確認する
ダウンロードしたCSVファイルを開いてみると作成済みのリソースを確認することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/05426932-fbda-7d60-ee4b-0704539ce923.png)

# 改善点
- 作業の方にも書きましたが、コマンドが2つになってしまったので、できればワンライナーでできると良かったなと思いました。これは単純に自分のスキル不足です。
- このコマンドでは別のリソースを検索する時に毎回一部を書き換えないといけないようになっているので、使いやすさを考えるとその辺りは変更したほうが良さそうでした。

# おわりに
AWS Resource Explorerは使いやすそうなサービスではありましたが、 最初の1,000 件の結果しか取ってこなかったり、対応していないAWSリソースもあったりするので、ユースケースは絞られるかなと思いました。
ただ、IAM周りとかは裏側で把握していないリソースが作られてたりして、気づいたら大量のロールやポリシーができている、ということもあったりするので、このサービスで定期的に確認できると良いと思いました。
Snowflakeでクロス集計・ヒストグラム作成

## 概要です。
Excelで実施していたデータ処理をSnowflakeに移設することがありました。移行元のExcelではクロス集計やヒストグラムなどを使っていたのですが、Snowflakeには準備されたSQLが存在し、比較的ラクにSQLで処理を再現することが出来ました。EXCELではデータ量が増えてくると辛くなってきます。そんなときにも良いのかな、と考えております。

## 公式にSQL構文の解説があります。
- クロス集計・ピボットテーブル
　https://docs.snowflake.com/ja/sql-reference/constructs/pivot.html
- ヒストグラム作成
　https://docs.snowflake.com/ja/sql-reference/functions/width_bucket.html

## やってみます。
KaggleのTitanicのデータ、及びチュートリアルのデータ前処理を一部切り取って実装してみました。
- データ https://www.kaggle.com/competitions/titanic/data
- チュートリアル https://www.kaggle.com/code/hatokgl/titanic

上記のURLから
```
#crosstab : クロス集計表（カテゴリごとの個数をカウント)
pd.crosstab(train_df.Parch, train_df.Pclass).style.background_gradient(cmap="summer_r")
```
の部分をやります。

まず、テーブルを作成してデータをロードします。同じことをやってみたい方のために
テーブル作成用のSQLは共有しておきます。
```
CREATE TABLE titanic_train(
PassengerId integer,
Survived integer,
Pclass integer,
Name varchar,
Sex varchar,
Age decimal,
SibSp integer,
Parch integer,
Ticket varchar,
Fare varchar, 
Cabin varchar,
Embarked varchar);
```

titanic_train テーブルをクロス集計します。
```
 SELECT * from ( SELECT PassengerId,Parch,Pclass from titanic_train)
    pivot(count(PassengerId) for Pclass in (1, 2, 3))
      as p order by Parch
```
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123399/ccb25342-34e5-c848-e2e2-306c7c860a92.png)

結果を 別なテーブルに保管しておくことも一つのやり方だと考えます。titanic_train_cross テーブルを結果表として作る形にすると以下になります。
```
CREATE or replace table titanic_train_cross AS 
 SELECT * from ( SELECT PassengerId,Parch,Pclass from titanic_train)
    pivot(count(PassengerId) for Pclass in (1, 2, 3))
      as p order by Parch
```
参考までに最も小さいウェアハウスで実行しましたが70msで実行できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123399/34394663-9847-ca76-ad81-585215fde9ca.png)

# ヒストグラム
チュートリアルでは年齢を男女別にヒストグラムとしてグラフ表示していますが、ここでは年齢別のヒストグラムを作成してみます。SQLでは、グラフ表示ではなく既存のレコードがヒストグラムのどの場所（バケット）に割り振られるのかを算出する形になります。
※チュートリアルでは年齢の範囲を10のバケットに分けていました。
　分析はこれでよいのですが、確認が曖昧になるので年代別に分けてみます。

まずバケット番号を割り当てるための列を追加します。
```
alter table titanic_train
add age_bucket_number smallint;
```

次にバケット番号を振ります。
```
update titanic_train
set age_bucket_number = width_bucket(age, 0, 89, 9)
```

バケット番号を一部確認してみます。
```
select top 10 age,age_bucket_number from titanic_train
```
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123399/bfe077fe-b498-c62d-b8ec-26190a8f041b.png)


年代別の件数を確認します。
```
select age_bucket_number,count(PassengerId) from titanic_train group by age_bucket_number
order by age_bucket_number
```
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123399/024611b3-b1ca-e82d-b4a5-2c9d0e4cbd5e.png)

以上になります。　

記事に不具合。不都合などございましたらご連絡いただけると幸いです。記事内容は会社公式のものではなく、個人として記載するものです。
supabase+vonageでパスワード+SMS認証

vonageとsupabaseを利用したパスワード+SMS認証が非常にお手軽にできたので、ドキュメントに載っている関数名や返り値が微妙に異なったりなど古く、かつ英語しかないこともあって簡単に紹介したいと思います。

## 環境

- node: v18.12.1

```json
{
  "dependencies": {
    "@supabase/auth-helpers-nextjs": "^0.5.2",
    "@supabase/auth-helpers-react": "^0.3.1",
    "@supabase/auth-ui-react": "^0.2.6",
    "@supabase/supabase-js": "^2.2.1",
    "next": "13.0.7",
    "react": "18.2.0",
    "react-dom": "18.2.0"
    "react-hook-form": "^7.41.0"
  },
  "devDependencies": {
    "@types/node": "18.11.17",
    "@types/react": "18.0.26",
    "@types/react-dom": "18.0.9",
    "autoprefixer": "^10.4.13",
    "eslint": "8.30.0",
    "eslint-config-next": "13.0.7",
    "postcss": "^8.4.20",
    "tailwindcss": "^3.2.4",
    "typescript": "4.9.4"
  }
}
```

## 準備

Vonageのアカウント作成と、supabase側で認証に必要な最低限の準備をします。

- Vonageのアカウントを作成
    - アカウント作成時にクレジットが付与されるのでそれを利用
- supabaseアカウント > プロジェクトを作成
    - 今回は無料枠内で済ませる
- supabaseの`https://app.supabase.com/project/[Supabase-ID]/sql`にアクセスして、`Quick Start`から`User Management Starter`を選択し実行


## supabaseダッシュボードから電話番号による認証を有効化する

`https://app.supabase.com/project/[Supabase-ID]/auth/providers`から`Phone`を選択し、プロバイダーに`Vonage`を選択。
その後、API Keyとsecretの入力が要求されるので、Vonage API DashboardのAPI Keyとsecretをそれぞれ入力します。

SMS時の表示名も聞かれますが、こちらは日本向けなら適当な文字列でよいです。
例えばAmazonとかでも行けると思います。

## 認証する

流れとしては、

電話番号 + password > 電話番号 + SMSに来たtoken

の二段階で承認します。

まずは、ユーザー名パスワードの入力画面です。

```tsx
import { useForm, SubmitHandler } from "react-hook-form";
import { createBrowserSupabaseClient } from "@supabase/auth-helpers-nextjs";
type AuthInputs = {
  phone: string;
  password: string;
};

const Hoge = () => {
  const {
    register,
    handleSubmit,
    formState: { errors },
  } = useForm<AuthInputs>();
  const supabaseClient = createBrowserSupabaseClient();

  const onSubmit: SubmitHandler<AuthInputs> = async ({ phone, password }) => {
    const { error } = await supabaseClient.auth.signUp({ phone, password });
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <div>
        <label htmlFor="phone">phone</label>
        <input {...register("phone")} name="phone" />
        {errors.password && <p>phone number is required</p>}
      </div>
      <div>
        <label htmlFor="password">password</label>
        <input {...register("password")} name="password" type="password" />
        {errors.password && <p>password is required</p>}
      </div>
      <input type="submit" value="ユーザー作成" />
    </form>
  );
};
```

ここの処理が正しくいけていれば、SMSが発信されます。
ちなみに、1送信で0.07ユーロかかります。面白半分に連打すると一瞬でクレジットが消し飛ぶ額です。

```
await supabaseClient.auth.signUp({ phone, password });
```

日本の電話番号宛ての場合、番号の頭に81を付与する必要がありました。

その後、別ページでも表示の切り替えでも何でもいいですが、SMSに届いたトークンを以下の関数に渡します。

```tsx
const { error } = await supabaseClient.auth.verifyOtp({
  phone,
  token,
  type: "sms",
});
```

これで完了です。
はい、これだけで終了です。終わりです。
これでもうログインできています。簡単ですね。

また、以後のログインの場合はSignUpではなく`signInWithPassword`を使用します。
同一ページ内で同じインスタンスを複数箇所でキャッシュのキーとしたい

## ぶつかった問題
以下のような時、ビューの一部を避けて同じインスタンスをキーとしてフラグメントキャッシュを使いたいけれど、キーが重複されてしまうのでどうしたらいいのか。。と少し迷った。

インスタンスをキーとしたいのは、そのインスタンスのデータが更新されたらキャッシュも更新されるようにしたいため。

```erb
<div>
    <% cache @service do %>
        # キャッシュしたい
        # @serviceが更新されたらキャッシュを更新するようにしたい
    <% end %>
    
    <div>
        #　ここはキャッシュしたくない
    </div>
    
    <% cache @service do %>
        # キャッシュしたい
        # @serviceが更新されたらキャッシュを更新するようにしたい
    <% end %>
</div>
```

## 対処方法
以下のように配列の形でキーを設定できる。
左右を/で区切って一つの文字列としてくれる。
説明のため雑に1と2としているが、もっとわかりやすくするべきだと思う。

```erb
<% cache [@service, "1"] do %>
ほにゃ
<% end %>

<% cache [@service, "2"] do %>
ほにゃ
<% end %>
```

## インスタンス変数を複数使う
以下のようにインスタンス変数複数使ってもいける
```erb
<% cache [@service, @staff] do %>
  ほにゃらら
<% end %>

<% cache [@service, @shop] do %>
  ほにゃらら
<% end %>
```

## 最初に試して失敗した例
キーが毎回変わるのでうまくいかない。

```erb
<% cache "#{@service}_1" do %>
  ほにゃらら
<% end %>
```

## 参考
https://medium.com/traveloco-tech/ruby-on-rails-fragment-caching-cache-key-9697c4c6a831
iPhoneのショートカット(Shortcuts)で便利な生活へ

# 概要

ハイテクの時代にフォーカスするのはとても大変。気を散らしやすい時代に、テクノロジーは我々の障害物ではなく、協力者なはずで、自分の集中力を取り戻せ。
iPhoneのショートカットアプリの中にショートカットとオートメーションがある。


- ショートカット：手動起動した後に、設定した一連アクションを実施する。
- オートメーション：トリガーの条件を適用される時に、自動的に設定した一連アクションを実施する。
- ギャラリー：他の人が作成した設定と一連アクションを参考にできる。

![case.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596658/87108a7f-816d-3bca-9757-414c83332fa9.jpeg)

これからいくつか実際のケースを説明する

# この記事を読む対象の方
- 自立が弱い人
  - 朝の目覚ましを無視する人、朝の目覚ましはpodcastに切り替えたい人
  - 動画を見すぎる人
- 重複の作業が嫌いな人
  - 仕事のcheckinとcheckoutに複数作業がある方

※ デモのiOSバージョンは：16.0.2

# Case1：設定した時間でpodcastを自動放送する

## 説明

一番左はオートメーションの実施タイミングです。真ん中は実施したいアクションです。一番右はこの設定を有効にすることです。真ん中の画像にある「▶」を押したら、設定したアクションは正常に動けるか確認もできる。

毎日朝09:00から、まずWifiをオンにし、Podcast「Talks at Google」の最新エポソードを取得し、再生する。

![case.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596658/82d3f51e-0971-a12a-9931-4c82840e315f.jpeg)



# Case2：朝仕事モードに切り替えると、自動Checkinできる

## 説明

各会社のCheckin方法が違うが、今回の例はLineでメッセージを送る。もちろん、Slackなど連携することもできる。

![case002.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596658/53d277da-0796-0049-dc43-552837743850.jpeg)

# Case3：Youtubeを開いたら、自動的に30分のタイマーを設定される

## 説明

Youtubeを見過ぎないようにするため、Youtubeを起動したら、30分のタイマーをカウント開始。

![case.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596658/fa0bd9c9-3309-1d9b-9a62-d8c391f67094.jpeg)


# 結論

オートメーション以外にも、ショートカットの設定でもできる。ぜひ使ってみてください。
「ジェームズ・クリアー式 複利で伸びる1つの習慣」を見ながら、実践してみるのは良いと思う。テクノロジーで良い習慣を身につけましょう。


## 参考URL
- 「ジェームズ・クリアー式 複利で伸びる1つの習慣」：https://www.amazon.co.jp/dp/4775942158
MySQL闇歴史2　「MySQL」の発音

MySQLの正しい発音は“My Ess Que Ell” (マイ エス キュー エル)であり、“MY-SEQUEL” (マイシークエル)じゃないよ、というのはリファレンスマニュアルにだいぶ前から記載されている。

日本MySQLユーザ会 (MyNA) のサイトに掲載されている3.21.31のマニュアルの日本語版では↓このように明記されている。
> MySQL の公式な発音は 'My Ess Que Ell [訳注:マイエスキューエル？]' (MY-SEQUEL ではない)です。


http://www.mysql.gr.jp/Manual/mysql-3.21.31/manual_Introduction.html#What-is

　※ ↑ページのエンコードはEUC-JP


知名度：★★★★☆
闇度　：★★★☆☆
シークエル度：★★★★☆

だいぶ前に某イベントで某クラウドベンダーの人から「MySQLのことまだ詳しくないけど今度からMySQL担当になったんでよろしく」的なことを「マイシークエル」連呼で言われて、お、おぅ。。。ってなったとか。

オラクル社がMySQL含めてSunを買収した直後はオラクル社の人たちが「マイシークエル」呼びが多い中、いまもMySQL部門の担当役員をしているChief Corporate ArchitectのEdward Screvenも例外では無く、買収後初のMySQL関連の大型イベントだったMySQL Conference & Expo 2010の基調講演では「マイシークエル」連呼で参加者からも指摘を受けていた。

https://www.youtube.com/watch?v=C0OkjtlbqVs

2014年のOracle OpenWorldでのEdwardの基調講演のころまでには「マイエスキューエル」になっていて、2020年のまだ名称がMySQL Database Service with Analytics EngineだったころのMySQL HeatWaveのリリース発表動画もちゃんと「マイエスキューエル」って言えていた。でも2022年の基調講演はまた「マイシークエル」になってる。

https://www.oracle.com/jp/events/live/breakthrough-mysql-innovation/

オラクル社の創業者であるLarry Ellisonはずっと「マイシークエル」呼びだったりはするw

https://youtu.be/ZA89SGSQZ2o?t=170

ちなみに3.23.38のマニュアルには↓こんな表記になっている。
> MySQL の公式な発音は ``My Ess Que Ell'' です(MY-SEQUEL ではありません)。 しかし MY-SEQUEL と発音する人を正すことは避けています。

さらに現在のマニュアルには↓正式なのはあるけど発音は自由だよ、という表記になっている。
> 「MySQL」 の正式な読み方は、「マイエスキューエル」 (「マイシークエル」ではありません) ですが、「マイシークエル」やその他のローカライズされた方法で発音してもかまいません。

おそらくMySQL 4.1のマニュアルで現在の表記になったのだと思われるが、これもどのバージョンで入ったのかを調べ始めると沼っぽいので深追いはしない。
ActiveRecordで、特定のidを先頭に持ってきて並び替える

## 前提と注意
- MySQLでしか確認していない
- 渡ってきたパラメータをそのまま（user_idとして）使うとSQLインジェクションが発生しうる。安全な値であることを担保できない場合はこの方法は使うべきではないと思う。

## 特定のidを先頭に持ってきたい
```ruby
user_id = 5 # 特定のidは5とする
users = User.order(Arel.sql("users.id = #{ user_id } DESC")) 
```

## その後に別の並び替え条件を指定したい
特定のidを先頭にしつつ、そのあとはpriority順で並び替えたい
```ruby
users = User.order(Arel.sql("users.id = #{ user_id } DESC,
                             users.priority DESC")) 
```

## さらにその後に別の並び替え条件を指定したい
特定のidを先頭にしつつ、そのあとはpriority順、そのあと(priorityが同じだったもの)はpriority2順で並び替えたい

```ruby
users = User.order(Arel.sql("users.id = #{ user_id } DESC,
                             users.priority DESC,
                             users.priority2 DESC"))
```
Service Workerについて

# はじめに
この記事は[Webの基礎をおさらいカレンダー Advent Calendar 2022](https://qiita.com/advent-calendar/2022/basic_review)です。
このカレンダーでは、なんとなくわかった気になっている、Webの知識をおさらいするカレンダーです。
興味をもし持ってくださった方は、購読いただけると嬉しいです！

この記事ではService Workerについて説明します！

## Service Workerとは
ウェブブラウザとウェブーサーバ間のプロキシとして機能するイベント駆動のJavaScript環境で、
オフラインでアクセスでき、ページのパフォーマンスを向上させるためのものです。

あくまで、Service Workerは既存のWebサイトを拡張するものなので、
Service Workerに対応していないブラウザのユーザーがアクセスしてきても、基本的な機能は使えます。

利用はセキュリティのために、**HTTPSかlocalhostでしか利用できない**ようになっているので注意

簡単にまとめると、
Webアプリ上で、ネイティブアプリに近いユーザー体験を提供するために拡張された機能ということです。

### 対応ブラウザ
最近の大体のブラウザは利用できます。
そのため、積極的に使っていって問題ないかと思います。

![スクリーンショット 2022-12-23 23.10.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224825/c5869431-1dd0-4847-f5d5-273e0f30d74c.png)
[Can I use](https://caniuse.com/?search=service%20workers)より引用。

### できること
* オフラインキャッシュ
    * オフラインでも利用することが可能
* プッシュ通知
    * アプリを閉じていても通知を受け取ることが可能
* バックグラウンド同期
    * 画像のアップロードなど、オフラインの状態で一時的に保留して置いて、通信ができるようになったら後から処理が可能
* ローカルでのプロキシ
    * リクエストの加工が可能。
        * キャッシュを利用したり、異なるソースからレスポンスを作成するなど
 
# まとめ

以上、Service Workerについて簡単にまとめてみました。
より詳細な内容を知りたい方は、参考文献にある[Chrome Developers Introduction to Workbox and service workers
](https://developer.chrome.com/docs/workbox/service-worker-overview/)を読んでいくのがおすすめです。

[Webの基礎をおさらいカレンダー Advent Calendar 2022](https://qiita.com/advent-calendar/2022/basic_review)でした。
興味をもし持ってくださった方は、購読いただけると嬉しいです！

## 参考文献
[Chrome Developers Introduction to Workbox and service workers
](https://developer.chrome.com/docs/workbox/service-worker-overview/)
ジングルベルのなる頃に(解答編)

# はじめに
この記事は、LIGHTzアドベントカレンダー2022の23日目の記事です。
クリスマスまであと2日でございます．

@KTasknこと、たすく、です。[16日目](https://qiita.com/KTaskn/items/205e9e0e5ad6edabdb38)の解答になります．出題と解答で２日稼ぎます．今日も結局日付変わる前の投稿です．間に合うのかクリスマスイブになってしまうぞ，

# 改題前
そもそも，このネタはアルゴリズムの講義ででた問題の改題なので，その改題前がどのようになっていたかを話すと，

## 問題（改題前）
改行を含むテキストファイルが存在する．このファイルの行数$N$は未知である．
このファイルから等しくランダムに１行を抜き出し，出力するプログラムを示せ．
ただし，ファイルは先頭から１行ずつしか読み込めず，また記憶域（メモリ）は１行までしか読み込めない．

はい．出題時とは異なりすごくアルゴリズムぽい問題ですね．これなら見聞きしたことある方もいるのではないでしょうか．

# 解答
それまでに選んでいた行を$l_{\text{save}}$、ステップ$k$に読み込まれた行を$l_k$とする。

ステップ$k$で$l_k$を$\frac{1}{k}$、$l_{\text{save}}$を$\frac{k-1}{k}$の確率で選択するとき、ステップ$k-1$において、すべての行が等しく$\frac{1}{k-1}$の確率で$l_{\text{save}}$として選択されたことを示せば、$\frac{1}{k-1} \frac{k-1}{k} = \frac{1}{k}$となり、ステップ$k$においてもすべての行が等しく$\frac{1}{k}$で選ばれることを示せる。

ステップ1において、$l_{1}$が1の確率で$l_{\text{save}}$に選択される。
ステップ2において、$l_{1}$と$l_2$は等しく$\frac{1}{2}$の確率で$l_{\text{save}}$に選択される。
よって、上記の条件を満たし、それぞれの行が$\frac{1}{k}$で選ばれることが示せた。

pythonでの実装を示す

``` python
from random import random
import collections

def randline(k):
    # k行のテキストファイルの代わりにk個からなるlistを作成する
    textfile = range(1, k+1)
    for i in textfile:
        if random() < 1 / i:
            # 記憶域はselectingのみ
            selecting = i
        else:
            pass
    return selecting

if __name__ == "__main__":   
    # 試行回数
    N = 100000
    # 真の行数(実際は未知）
    NUM_LINE = 50

    print(
        # N回試行し，均等に出力されるか確認する
        sorted(collections.Counter([
            randline(NUM_LINE)
            for i in range(N)
        ]).items(), key=lambda key: key[0]
    ))
```

以上．解けたでしょうか？
iLO 仮想メディアを速くしたい

[テクノロジー検証 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/technology_validation) 23日目の記事です。

# TL;DR

iLO仮想メディアはURLベースが速い。


# iLOの仮想メディアとは

iLOとはHPE製IAサーバ ProLiantに搭載されているBMCです。
仮想メディアとはネットワーク経由でCD/DVDメディアファイル(ISO)をサーバーに見せる機能です。

この仮想メディアですが、.NET, HTML5, Java,URLベースなど複数の方法があります。
HPE社の[資料](https://support.hpe.com/hpesc/public/docDisplay?docId=a00104928ja_jp&docLocale=ja_JP)では、.NET版よりもHTML5版が遅い(ISOブートに時間がかかる)のは仕様だとしています。
対策は、.NET版もしくはURLベースを使うことです。

URLベースは「.NETよりも優れています」と[資料](https://support.hpe.com/hpesc/public/docDisplay?docId=a00104928ja_jp&docLocale=ja_JP)に書かれていますが、どの程度優れているのでしょうか? 測ってみました。

# URLベースとは
HTTP(HTTPS)でWebサーバ上のISOファイルをマウントする方式です。
今回、iLOを操作するWindowsパソコン上でWebサーバを立ち上げて、iLOから参照させました。

Webサーバとしてnginxを使用しました。nginxはフリーソフトです。商用版をF5社が提供しています。
「F5社が提供するフリーソフト」と言えるんじゃないでしょうか。

やったことは
1. nginx Windows版を[公式サイト](https://nginx.org/en/download.html)からWindowsPCにダウンロードする
2. ダウンロードしたzipファイルを展開する
3. 展開したなかのhtmlフォルダにSPP ISOファイルを置く
4. コマンドプロンプトから展開したnginx.exeを実行する
これで8080ポートでWebサーバが起動します。
ISOファイル名を指定すればISOファイルを参照できます。

# 今回使用したメディア SPPとは

ProLiantではSPP(Service Pack for ProLiant)というISOファイルが提供されています。
SPPで起動すると、ProLiant内の各種デバイスのファームウェアは自動的に更新されます(対話的にも実行可)。

このSPPで起動して更新作業が完了するまでを計測しました。

USBメモリに書き込むことで、SPPはUSBメモリからも起動できます。
ネットワーク経由の仮想メディアよりもUSBメモリのほうが明らかに速いでしょうが、参考として一緒に計測してみました。


# 試験環境
- ProLiant ML30Gen10(ヤフオクで入手)
- SPP version  2022.09.01.00
- WindowsPCからギガハブ経由でiLOに接続。
- USBメモリ [PicoDrive DUAL X](https://www.green-house.co.jp/news/2009/2009-r1210a/) → 計測したあとで気づきましたが、まさかのUSB 2.0でした…。


# 試験内容
- WindowsPCからML30Gen10 iLOに接続してSPPを起動。
- 計測はSPP起動(自動か対話的かを選択するところ)からSPP動作が完了するまで。
- USBメモリ、ISOファイルマウント(.NET, URLベース)の3パターンで比較。
- ファームウェアは事前に全て更新済みであるため、SPPによる更新作業は発生しません。
そのため、完了までの時間には、ISOファイル読み込み速度が大きく関与するはずです。

# 試験結果
数字が小さければ速いことを意味します。

| 方式 | 完了までの時間 |仮想メディア(.NET)との比較|
|:-:|:-:|:-:|
|USBメモリ |6分38秒   |56%|
| 仮想メディア(URLベース)  | 7分29秒  |63%|
| 仮想メディア(.NET)   | 11分53秒  |NA|

思った以上にURLベースの速度がUSBメモリに迫っています。
とはいえUSB 2.0なので、USBメモリにとっては不利な条件です。
今回、iLOを操作するWindowsPC上でWebサーバを立てましたが、これを別マシンに分ければ更に速くなるかもしれません。


# まとめ

iLO仮想メディアはURLベースが速い。
パワポでなんちゃってニューモーフィズムする

# ニューモーフィズムとは
デザインにおいて、浮き出た部分に光が当たって反射する部分と影を追加することで、立体感を表現するデザインの手法です。
マテリアルデザインと違い、浮遊しているのではなく浮き出た部分に緩やかなカーブを伴う側面を持たせることが出来ます。

# パワポでなんちゃってニューモーフィズムする
## 凸
光が反射した部分と作るために、背景の色を若干灰色にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/3af9367a-82c1-9c87-4eea-05950fb96d10.png)
適当に正方形を2つ作り、片方には左上方向に白い影、もう片方には右下方向に黒い影を適用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/4785536d-2da8-6800-fa10-8684c65e8101.png)
この二つの図形をぴったり重ね合わせ、塗りつぶしをスライド背景色に、線をなしにすれば、基本形が完成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/4982ed99-9ce1-99f0-138d-0896517bea0b.png)

## 凹
上の凸にへこみを付けます。
凸の場合とは違い、内側に影を直接つけることが出来ない(黒い影が消える)ので工夫が必要です。
また、完全な四角形でしか使えません...
まず、内側に黒色の影を付けた長方形を用意します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/50b30e84-a2b9-0321-a74c-14a5142a28dd.png)
次に、左向きに白い影を付けた薄い棒を、長方形の右に配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/aa2d30e0-35ae-200f-fc78-b7590645c100.png)
同様に上向きの白い影のついた薄い棒を長方形の下に配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/724df20e-670b-3e45-6c55-c92625c88a4a.png)

## 凹2
無理やりですが長方形以外でも内側に白色の影を付ける方法を紹介します。
### 少しずらす
少しずらして配置すると黒い影を残すことが出来ます。(当たり前)
ただ、この方法だとあまり深度を表現できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/34533f63-2b91-cdcb-f5c2-8d1cda3f224b.png)

### 塗りつぶしにグラデーションを使う
黒い影を適用すると同時に、その図形の塗りつぶしに背景色ではなくグラデーションを利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/923ded42-23d4-7cf8-4b8a-fdf1ad70f6b1.png)
この方法の場合、図形が大きいと違和感も大きくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/ab5610e0-362b-febd-1d9e-225dfdabcac2.png)

### マスクする
図形の結合を用いて、黒い影の部分だけマスクして白い影の図形の上にかぶせます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/fc36ce2c-ceac-2cb2-abf1-c1e00901d3fe.png)
この方法の場合、図形が複雑だと作業が難しくなります。
また、拡大すると影が途切れている部分があるので不自然になります。

# 利用例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/8ffbc9ad-11cb-adf1-76f4-0e21e6c5ff2b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/af1b9c8d-d7e7-ec75-9ea3-579fe3eb22b1.png)
モデルベースドテスト（MBT）をWeb上で実現するツールの構想

# 1.経緯
 モデルベースドテスト（以下、MBT）は非常に良いプラクティスです。
しかし、MBTの課題の一つとして、MBTには準備が多く必要で、MBTを試すまでのハードルが高いということがあります。
そこで、良いプラクティスが流行らないのは勿体ないと思い、手軽にMBTを試せるツールを作ろうと思いました。
ますは、その構想を記事にします。

MBTの難しいことについては以下の記事を参考にしました。
ぜひ読んでみてください。

+ [「モデル」に関わるテストのもろもろ](https://qiita.com/vHidetoshiSuhara/items/55bab8c88e2ed6a22365)

+ [2022年MBTに関する発表の概説（その1:InSTA）](https://qiita.com/yasuaki_hiruta/items/fbe0ee55cf539cf99f64)

+ [2022年MBTに関する発表の概説（その2:SQiPシンポジウム）](https://qiita.com/yasuaki_hiruta/items/ea628d7cf7bc59d19610)

# 2.ツールコンセプト
+ ### MBTで感動してほしい
このツールを手にする人はMBTに対して、馴染みない人が多いのではないかと思う。
では、そんな人に何を届けたいかというと**感動**である。
MBTで得られる新たなエクスペリエンスを体感してほしい。

# 3.ツールに入れたい要素
MBTで感動すると広げた大風呂敷を実現するための要素をいくつかメモります。
実際に、どれだけ盛り込むかは、今後の開発の際に考えます。
今は発散させます。
+ リアルタイムレスポンス
今回でいうMBTは、大雑把に言うと、モデルに基づいて自動でテストケースを生成します。
しかし、作ったモデルからどのようなテストケースが作られるかわかるまで、時間（や手間）がかかるとストレスが溜まりますよね。
そのため、モデルの生成や編集からテストケースの生成までをできる限りシームレスにします。

+ 簡単な編集フィールド
MBTにおいてモデルを書くことは目的ではありません。
そのため、モデルを書くことにストレスが溜まっていては意味がないです。
そこで、PlantUMLの記法に対応したいと思っています。
テキストベースでのモデルはトライ＆エラーがやりやすく、色々なテストケースの生成を試したり、増やしたりすることが可能になります。

+ 知識の再利用
MBTではモデルに基づいてテストケースを生成します。
そのため、テストケースとモデルには一定の関連があり、モデルの特長からテストすべき点はパターン化されます。
その、パターンを蓄積し、再利用することで、熟練のテストエンジニアが考えるテストを再現することが可能になります。

# まとめ
まだまだ構想段階で、今後、どのように変わっていくかわからないですが、このツールを作成し、世に送り出すことを楽しみにしています。
絵空事チックなところもあるので、練りこんでいく必要がありますね。


あー、ここまで言っちゃったからなぁ、なんか作らないとなぁー…。

# MBTツールについて参考になった動画
https://www.youtube.com/watch?v=CSTtX0d4lU8

# 乞うご期待
ビット全探索について

今日は学んだについてメモしていこうと思います。
先日書いた記事ではなにかゲームを作ろうとしていましたが、
今日はビット全探索について学んだことを自分なりにまとめて
見ようと思います。あまり難しい事は言わないようにします。
~~てゆうか自分があまりわからない。~~
# ビット全探索とは
まずビット全探索とは何かについて簡単に説明します。
名前の通り２進数を使って０が「使わない」１が「使う」として、
部分集合を列挙して探索するものである。
# 例題を見ていきましょう
[ALDS_5_A - 総当たり](https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_5_A&lang=ja)　

JavaScriptでの答え。
```javascript:js.js
    let N = Number(lines[0]);
    let S = lines[1].split(" ").map(Number);
    let p = Number(lines[2]);
    let m = lines[3].split(" ").map(Number);
    let arr = [];
    for(let i = 0; i < (1 << N);i++) {
        let sum = 0;
        for(let j = 0; j < N; j++) {
          if(i & (1 << j)) {
            sum += S[j];
          }
        }
       arr.push(sum);
    }
    for(let i = 0; i < p;i++) {
        let fire = false;
        for(let j = 0;j < arr.length;j++) {
            if(arr[j] === m[i]) {
                fire = true;
            }
        }
        if(fire) {
            console.log("yes")
        }else {
            console.log("no")
        }
    }
```
自分で言うのはなんですがあまり良いコードではないですけど許してください。

まず上から６行目くらいのforの行が気になると思います。まずここから見ていきましょう。
```javascript:js.js
for(let i = 0; i < (1 << N);i++) {
}
```
(1 << N)この部分を簡単に言うと2^Nをしています。Nが3だとすると8になるということです。
```javascript:js.js
if(i & (1 << j)) {
  sum += S[j];
}
```
次にこの行について見ていきましょう。
この行が何をしてるかというと上の説明で行った2^Nまでの整数を２進数に直し
1かどうか判定しています。
例えばNが３のときは
000
001
010
011
100
101
110
111
このように１から８までの整数を２進数表記で1かどうか判定しています。
この内一つの２進数表記「001」を例にすると
「０」使わない
「０」使わない
「１」使わない
ということになります。

# まとめ
ビット全探索は(1 << N)でN^2して、(i & (1 << j))１かどうか判定するものです。
とても便利なものですが処理数が指数関数として増えていくため制約を見てできるかどうか
見積もってから実装しましょう。
イーサリアム 2.0：コンセンサスアルゴリズム Gasper

下記記事をまとめて、やっとイーサリアム 2.0 のコンセンサスアルゴリズムの全貌を見えるようになりました。

- 基本的にはバリデーターたちが委員会を組んで、ブロック提案者が提案した新しいブロックを検証する
    - [イーサリアム 2.0：PoS の新しいブロック生成流れを整理してみた](https://qiita.com/blueplanet/items/58839a15e721df7e6175) 
- エポック内でチェーンの分岐が起きたら、LMD-GHOST ルールに従ってチェーンを選択する
    - [イーサリアム 2.0：LMD-GHOST について](https://qiita.com/blueplanet/items/d8ff594b413dbd8b3c90)
- エポックとエポックの繋がりで分岐が起きたら、Casper FFG ルールに従ってチェーンを選択する
    - [イーサリアム 2.0：Casper FFG とは](https://qiita.com/blueplanet/items/6f6bc568800d352a307e)

LMD-GHOST + Casper FFG ということで、イーサリアム 2.0 のコンセンサスアルゴリズムは、[Gasper](https://ethereum.org/ja/developers/docs/consensus-mechanisms/pos/gasper/) と呼ばれています。
また、上記以外にコンセンサスの為に、他のルールもいくつあるので、合わせて紹介します。

## 報酬
報酬は、バリデータとしてブロックを提案したり、各投票に正しい投票をしたりの行為によって得られます。
バリデーターの総数と保証金の総金額によって基本報酬を決めてから、各行為によって重みを加算して算出します。

行為と重みについては、下記になります。
合計 64 の中

|重み|行為|
|:---:|---|
|14|FFG 投票において、正しい「ソース」に投票した|
|26|FFG 投票において、正しい「ターゲット」に投票した|
|14|LMD-GHOST 投票において、正しいブロックヘッダーに投票した|
|2|委員会に選定された際に、正しく検証作業を行った|
|8|ブロック提案者に選定された際に、正常に新しいブロックを提案した|

- 委員会に選出され正しく投票を行い、ブロック提案者として新しいブロックを提案すると、`64 / 64 * 基本報酬` を貰える
- ブロック提案者以外の委員会メンバーは、`(64 - 8) / 64 * 基本報酬` を貰える
- 委員会以外のバリデーターは、 `(64 - 8 - 2) / 64 * 基本報酬` を貰える

もう一種面白い報酬は、ブロック提案者が `他のバリデータの不正な行為の証拠を提出する` ことで報酬をもらえます。また、スラッシングを含めると `スラッシングされるバリデータの有効な残高金 / 512` の報酬をもらえます。

## 罰則
罰則については、それほど厳しくありません。

- FFG と LMD-GHOST の投票を逃した場合は、単に受け取るはずだった報酬を得られなくなるだけ
- ブロック提案者は提案に失敗しても罰則はない

## スラッシング
悪意の行為をしたバリデーターに対して、スラッシング（Slashing）と呼ばれる手段があります。
スラッシングとは、バリデーターをネットワークから強制的に排除しステークされた保証金を失う厳しい罰です。
下記３つの行為は、スラッシングされます。

1. 同じスロットに対して、２つ異なるブロックを提案し署名する
2. 別のブロックを囲むブロックに署名する（事実上歴史を変える）
3. 同じブロックの２つの候補に署名する

1 と 3 は理解しやすいので、2 だけちょっと説明します。
投票は `source -> target` というペアで、エポックナンバーを２つ提出します。たとえば、101 -> 102 という投票があるとします。
次にエポックになると、`102 -> 103` や、`101 -> 103`の投票はスラッシングではないが、`100 -> 103` は、`101 -> 102` を囲んでいるので、101 と 102 をなくすようになるため、スラッシングの対象になります

## まとめ
PoW はシンプルですが、PoS になると、案外に複雑になってきました。
Amazon Fire HD10Plus でNode-RED

# はじめに
AmazonのBlack Fridayセールで安かったので、購入(毎年購入するMicrosoft365代を引くと実質1万7千円ぐらいになるのでキーボードが無料でついてくる感じと思って購入)　今(2022/12/23現在）でも少し安い？
でも、キーボードがかなり重い(合わせると普通のノートPC以上。。）
HD10Plusはメモリが4GBでワイヤレス充電に対応しているので、展示会等で実用的だと判断。（USBケーブルの抜き差しは結構面倒）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/6afdcaec-1cfe-9687-8c2d-ecff12014b9c.png)


# バージョンを調べる
設定-->端末オプション-->システムアップデート
FireOS X.y.y.y　の　 ~~XがAndroidのバージョン~~

FireOS 7.3.2.6　だったので　Android 9 相当？(WikiPediaによると）

# APKをインストールできるようにする
設定-->セキュリティとプライバシー-->不明ソースからのアプリ
SilkブラウザをONにする

# ダウンロード＆インストール
https://github.com/termux/termux-app
からダウンロード
2022/12/23現在 v0.118.0なので
releasesをクリックしてAssetのなかで下のファイルを選択
termux-app_v0.118.0+github-debug_arm64-v8a.apk
ダウンロードしたらファイルをタッチしてインストール
色々警告等が表示されるかも(自己判断でお願いします）

# termuxのaptを更新
termuxを起動して

```
apt update
apt upgrade
```

upgrade中に何回かバージョンを変えて良いか？を聞いてくるのでそのままEnter（DefaultのNo)

# Node-REDのインストール
```
apt install nodejs-lts
npm i -g --unsafe-perm node-red
```

# Node-RED起動

```
node-red
```
silkブラウザでlocalhost:1880を開くとおなじみのNode-RED3.0の画面が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/093e92e5-bbe4-711d-d789-05f2e0acdd54.png)

## 同じネットワークにつながっているPCからの接続
termuxでNode-REDを起動する前に```ifconfig``` で自分のIPアドレスを調べておくことで、他のPCのブラウザから http://IPアドレス:1880 で接続出ます。(便利）
* なお、サスペンドの状態でもつながるらしい。
* Flowは他のPCで作成・編集してDashboardだけ表示とかできる！
* FlowのExportはつながっているPCに出来る！
## 注意
* 再起動したらtermuxが最初からになるのでNode-REDが止まります。.bashrcに`node-red`と記入すると起動時に立ち上がります。termuxは止めない限り次の再起動時も動くと思います。

```.bashrc
node-red
```
* 起動中は動いているということで不要なFlowは情報で無効にしておきましょう。

# termux-api
※BatteryやWiFiとかの情報がNode-REDで使えるようになります。
カメラはなぜかエラーを吐くので使えない（ソース的にはあっているような気がする）

## インスト―ル
一旦Node-REDを止めて、
パッケージをインストールしてNode-REDを起動
```
pkg install termux-api
node-red
```

Node-REDのパレット管理から
node-red-contrib-termux-api　を追加

## 例
Dashboardと合わせてWiFiのRSSIを可視化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/f7d6eeb6-3044-064e-98ca-0b4a4ca07491.png)
Injectionは5秒の繰り返し。
Functionの中身は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/3731917e-9fae-07e8-ada1-e301c7121bb6.png)
デプロイしてuiのページをみるとこんな感じになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97061/38754bc8-ff98-8c47-57d7-941cdf556eb1.png)



# 他
## 内部ストレージにリンクする。
termuxで
```
termux-setup-storage
```
PicturesやDownloadフォルダにアクセスできるようになる。
## viエディタが使いたい
termuxで
```
pkg install vim
```
## コマンド？が見たい
```ls /```はパーミッションが無いって怒られるけど```ls /bin```は見れます。

## 雑談
crond　の@rebootを試したけど動かなかった。

# 最後に
タブレットなのでWireが引きにくい(指で隠れる)。タブレット用ペン？が必要
Flowが編集不可になった時はReloadしたら出来るようになりました。

動き始めると本体のみだけで良いので、M5Stackと組み合わせたらよいかも。
(ワイヤレス充電台と組み合わせて、コントローラとして使えそう）


# 参考
参考にされていただきました。
https://qiita.com/O_positive/items/6d11f99bee8efccf8889
https://zenn.dev/ryuu/scraps/6b2584294674b7
https://termux.dev/en/
条件分岐のシンプルな考え方

## 条件分岐のシンプルな考え方
今回は、条件分岐について取り上げます。

条件分岐でよく落ちる穴を紹介し、その回避策を提示できたらと思います。

条件分岐の中に条件分岐をいれすぎない。		
（つまり、ネストしすぎない）
		
コマンド作成の全体像・ゴール感を書き出しておく
（どんな操作ができるようになるのか。フローチャート図を作成しておくと伝わりやすいです。）
		
同じようなスキル感の人が見ても、改修できるようなコマンド作成・入力をしていく。		
（可読性を考慮する）

### イメージ図
ここからはイメージ図を用い、説明を補足していきます。

【悪い例】
一見、条件分岐としては正常に動きそうに見えますが、エラーが出た時に原因特定するのが難しいです。
条件分岐１でたくさんのコマンドが書いてあり、条件分岐２でエラーが起きた時
作成した直後はデバック（検証）しながら行なっているので、原因はわかるかもしれませんが
実運用時や他の人が見た時に、どの条件でエラーが起きたかを特定するのに煩雑な状態です。
この場合は条件分岐の内容を確認するのは４箇所ですね。

![非推奨条件分岐.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500721/8804fcd4-2840-142f-55f3-3d66ae4f21fe.png)

【良い例】
一方、こちらの方法は正の処理だったら処理を進めて、
偽の処理だったら、処理を終了（もしくは、メール通知やダイアログ画面表示）をするという
終了条件を明確にしておき、条件判断の進み方を見えやすくできます。
この場合は条件分岐の内容を確認するのは２箇所ですね。

![推奨条件分岐.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500721/8edc7e12-d6f1-4fd6-4d82-b4f1b8c21a65.png)
Elixir の 数値計算ライブラリ Nx の OSS 開発で行ったこと・良かったこと

# 概要
Elixir の数値計算ライブラリ [`Nx`](https://github.com/elixir-nx/nx/tree/main/nx#readme) の OSS 開発に参加するにあたって行ったこと、参加して良かったことを紹介します。

# 数値計算ライブラリ Nx とは？
`Nx` は線形代数・テンソルの数値計算と自動微分の機能を備えたライブラリです。読者によっては 「Python の [`JAX`](https://github.com/google/jax) のような機能を持った Elixir の数値計算ライブラリ」と簡便に表現した方がイメージし易いかもしれません。この `Nx` は Github 上でソースコードが公開されている OSS で様々なエンジニアが開発に参加しています。

# Nx の開発に参加するにあたって行ったこと
`Nx` の 開発に参加するにあたって行ったことを3つのポイントにわけて紹介します。

- 自分の興味・知見を活かせる OSS を見つける
- Issue を確認して OSS の課題を知る
- 関連ライブラリのソースコードを読み込む

## 自分の興味・知見を活かせる OSS を見つける
まずはプライベートの時間（筆者の場合は業務とは無関係に開発をしていた）を使って開発に貢献したいと思える OSS を探しました。筆者は、大学院時代に数値計算のアプローチでの理論物理学の研究を行っていたことがあり数値計算に関して多少の知見がありました。加えて、自身の周りに Elixir エンジニアが多くおり、その方々から `Nx` の存在を開発の初期段階から教えていただくことができました。このようなことから `Nx` の開発に貢献したいという思いが出てきました。


## Issue を確認して OSS の課題を知る
次に、どのような機能を実装したら良いかについて課題ベースで考えることにしました。理由は、 OSS 開発においてもレビューなどチーム開発的な活動が必要であり、チーム開発では共通認識のある課題に注力すべきだと考えたためです。そこで、共通認識されている課題を知るために Github の issue を読むことにしました。そこにはいくつかの関数が未実装であることが示されており、中でも「固有値・固有ベクトルを計算する関数を実装する」という課題に興味を持ったのでこの関数の実装を行うことにしました。ただし、この時に関連 PR が既に存在しないかはチェックしておいた方が良いです。
ちなみに、上記の課題に興味を持った理由は、データ分析で度々利用される主成分分析では固有値・固有ベクトルを計算するロジックを必要とするため[1]で、この数値計算ロジックの理解を深めたいと考えたためです。


## 関連ライブラリのソースコードを読み込む
最後に関連するライブラリのソースコードを読み込みました。その理由は、普段の業務では圧倒的に数値計算ライブラリを使う側としての実装活動の方が多く、作る側の知見が不足していると感じたためです。具体的に、今回の関連ライブラリとしては数値計算ライブラリ `LAPACK` , Python の `NumPy` のソースコードを読み込みました。

上記の活動によって「固有値・固有ベクトルを計算する関数を実装する」という課題を解決し、実際に[ PR をオープン](https://github.com/elixir-nx/nx/pull/512)することができ、レビューで議論を重ねた後に main ブランチへマージすることができました。筆者が実装した関数は `Nx.LinAlg.eigh` で例えば以下のように利用することができます。

``` Elixir
{eigenvals, eigenvecs} = Nx.LinAlg.eigh(Input_tensor)
```

ただし、今回実装した `Nx.LinAlg.eigh` は入力の `Input_tensor` が対称行列の場合に限られていることに注意して下さい。

# Nx 開発に参加して良かったこと
上記の活動を通して個人的に感じた良かったことは以下3点です。
- Elixir という関数型の特徴を持った言語での開発経験を積める
- Elixir が比較的新しい言語ということもあって大規模な OSS 開発の初期段階に関われる
- Elixir に限らないが、普段の業務メンバーとは異なる文化のエンジニアと PR を通して議論できる


# 参考資料
[1] [主成分分析の Wikipedia 記事](https://ja.wikipedia.org/wiki/%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%90)
ダイクストラ法から考える擬似コードの意義

// [競技プログラミング Advent Calendar 2022](https://qiita.com/advent-calendar/2022/kyopro) の 23 日目の記事です。

今回は擬似コードについて書いていきます。
擬似コードは、アルゴリズムの論文や教科書によく載っている抽象的なコードで、次の特徴があります。

- 理論的に正しい手続き
  - なるべく多くの実装を包含するように、抽象的に書かれる
- データ構造や言語プラットフォームに依存しない
  - 擬似コードに対して、実装コードが 1 通りに決まるとは限らない
  - 大きくは、[抽象データ型](https://ja.wikipedia.org/wiki/%E6%8A%BD%E8%B1%A1%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B)と[データ構造](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0)の違い

科学論文は、その技術がより多くの分野に適用できるようになるべく十分条件を広げ、その結果として抽象的に書かれます。それと同様に、擬似コードはアルゴリズムの本質的な部分を記述している、と言えます。

競技プログラミングの参考書では、擬似コードではなく具体的なプログラミング言語で実装例が書かれていることが多く、それを写経すれば正しく動作するコードが得られるでしょう。
しかし一般には、アルゴリズムの動作原理を理解したうえでコードに変換するスキルが求められます。また、利用したいデータ構造が各言語プラットフォームの標準ライブラリに存在するとは限らず、要件に合わせたデータ構造の開発が求められることもあります。

例として、[ダイクストラ法 (Dijkstra's algorithm)](https://ja.wikipedia.org/wiki/ダイクストラ法) を見ていきましょう。
このリンク先の Wikipedia に書かれている説明を一度読んだだけで動作原理や擬似コードを理解し、具体的なコードとして実装するのはだいぶ難しいのではないでしょうか。
擬似コードは次のように書かれています：
![Dijkstra-Pseudocode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9649/7c9475f7-afd7-8097-3b2e-a71bfffc7332.png)
とくに、頂点集合 $Q$ は次のような操作を持つ集合として書かれています (少し意訳)：
- 始点からの距離 $d(u)$ が最小である頂点 $u$ を取得および削除できる
  - 始点からの距離 $d(u)$ が更新されてもこの操作をできる
  - $Q$ の中で順位が動的に変化することに注意

各プログラマーがこれらの抽象的な記述をもとに自力で考えた場合、おそらく具体的な実装方法は分かれるでしょう。
これまでに筆者が実装しただけでも、次の 3 種類が挙げられます。

#### (1) 優先度付きキュー (更新機能なし)
[実装例 (C#)](https://judge.yosupo.jp/submission/117435)
優先度付きキューから頂点を取り出したとき、その頂点までの距離が確定済みならばスキップします。このスキップの処理を入れないと、一部のテストケースでは TLE になると思います。
[プログラミングコンテストチャレンジブック](https://www.amazon.co.jp/dp/B00CY9256C) (通称：蟻本) をはじめ、多くの競技プログラミングの参考書にはこの実装が載っています。

#### (2) 更新機能を持った優先度付きキュー
[実装例 (C#)](https://judge.yosupo.jp/submission/117382)
二分ヒープを拡張することにより、既に格納されている値を直接更新できます。

#### (3) 平衡二分探索木 (順序付き集合)
[実装例 (C#)](https://judge.yosupo.jp/submission/117381)
(2) に近い方法ですが、平衡二分探索木を利用する場合は値を直接更新できないため、代わりに古い値を削除して新しい値を追加します。
.NET 5 以前の C# では標準ライブラリに [PriorityQueue](https://learn.microsoft.com/ja-jp/dotnet/api/system.collections.generic.priorityqueue-2) が存在しないため、[SortedSet](https://learn.microsoft.com/ja-jp/dotnet/api/system.collections.generic.sortedset-1) を利用することで短く書けます。

要するに、ある頂点の情報が確定したらその隣接頂点の情報を動的に更新していくということであり、それを高速に実現できるのであればどの方法でもよいです。実装方法はまだ他にも見つかるかもしれません。

このように、擬似コードはそのアルゴリズムの核心を記述している反面、実際のコードとは見た目が乖離することがあるため注意を要します。脳内で動作原理をなんとなく理解できていることと、それを正確に実装できることは異なるため、テストによる評価も重要でしょう。

なお、上記の実装例のところで [judge.yosupo.jp](https://judge.yosupo.jp/) にある[ダイクストラ法のライブラリチェッカー](https://judge.yosupo.jp/problem/shortest_path)を利用しています。厳しいテストケースが網羅されているようなのでおすすめです。

## 参照
1. [ダイクストラ法 - Wikipedia](https://ja.wikipedia.org/wiki/ダイクストラ法)
1. [Shortest Path (ダイクストラ法のライブラリチェッカー)](https://judge.yosupo.jp/problem/shortest_path)
1. [AlgorithmLab (GitHub)](https://github.com/sakapon/Samples-2020/tree/master/AlgorithmSample/AlgorithmLab/Graphs/SPPs) - 筆者による実装サンプル (C#)

#### 競技プログラミングの参考書
- [プログラミングコンテストチャレンジブック](https://www.amazon.co.jp/dp/B00CY9256C)
- [プログラミングコンテスト攻略のためのアルゴリズムとデータ構造](https://www.amazon.co.jp/dp/B00U5MVXZO)
- [問題解決力を鍛える！アルゴリズムとデータ構造](https://www.amazon.co.jp/dp/B08PV83L3N)
- [アルゴリズム実技検定 公式テキスト［エントリー～中級編］](https://www.amazon.co.jp/dp/B08QRNJ7M3)
- [競技プログラミングの鉄則](https://www.amazon.co.jp/dp/B0BDZGDM9J)
【Ruby】andと&&は優先度の影響で振る舞いが変わる

例として以下のような `test.rb` を作成する

```ruby:test.rb
def hoge(val)
  p val and return
  p "end of hoge"
end

def fuga(val)
  p val && return
  p "end of fuga"
end

hoge("hoge")
fuga("fuga")
```

期待される出力として

```ruby
hoge
fuga
```
が出てきてほしい

しかし実行結果は
```shell
$ ruby test.rb 
"hoge"
$
```
という出力になる

このような出力になる原理として、
` and は && に比べて優先順位の低い演算子` と説明がある

> 左辺を評価し、結果が偽であった場合はその値(つまり nil か false) を返します。左辺の評価結果が真であった場合には 右辺を評価しその結果を返します。 and は同じ働きをする優先順位の低い演算子です。 [- 演算子式 (Ruby 3.1) - and](https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html#and)

そのため、メソッド呼び出しの括弧を省略すると解釈が変わってしまう

```ruby
p val and return
# 以下と同義
p (val) and return
```
```ruby
p val && return
# 以下と同義
p (val && return)
```
そのため、後者は`val && return`が実行されるので、右式のreturnが評価され、pが実行される前に終了する

## 参考

https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html#and
Perl苦手で自動化失敗

Perl苦手で自動化失敗

オープンソースのプログラムのうち、goto文を使っているソースコードをPolySpaceVerifierで動的検査をする際に、先に進むgoto文でないと検査ができず、戻るgoto文は、先に進むgoto文に書き換えるソフトウェアを書こうとした。　

Code Complete：goto論争の終焉

https://qiita.com/kaizen_nagoya/items/82c7939f442cbd5fce37

当時は、まだPerlが流行っており、Perlで例題を作ってもらった。　

先に進むgoto文にも、種類がいろいろあり、前後の構成、などの構造が少し違うと、 perlのプログラムで全対応できず、結果として、手作業で修正するものもできた。　

# 失敗の要因

## Perlに馴染んでいない　

Basicではプログラムジェネレータジェネレータを書いたことがあり、　抽象的なデータ構造をどう作れば、インタプリタとして有用な自動生成コードが作成できるかは習得していた。　

pascalで書かれたコンパイラをc言語に書き換えたり、c言語で書かれたコンパイラの改良をしていた。
C言語でも自動生成ソフトは書いていた。

その経験が邪魔をしたのか、Perlで作られた原型の変形がうまくできない。　

心理学の本を読むよりはコンパイラ書いた方がよくね。仮説（34）

https://qiita.com/kaizen_nagoya/items/fa715732cc148e48880e


## 全類型を最初に分析していなかった　

一番多い累計用のものを作り、それを変形するという方針で臨んでいた。基本設計方針がだめだった。


## 元に戻るgotoは不必要。　

ほんの数バイトの節約、ほんの数クロックの節約のため、危険を犯す必要はなく、元に戻るgoto文を書く必要がなかったと思う。　

全部手で先に進むgoto文に直せば終わり。自動で書き換えて試験をするという方針がださい。　


# CountDown Calendar 2022

今年企画した6つのCountDown Calendarと、それぞれの記事一つをご紹介します。

AUTOSAR CountDown Calendar 2022

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

AUTOSAR References to ISO, IEC, ITU, IEEE, RFC and SEA etc.

https://qiita.com/kaizen_nagoya/items/d7d252211e10a79516df

Automotive Handbook CountDown Calendar 2022

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

Basic principles, ボッシュ自動車handbook(英語)11版まとめ<2>

https://qiita.com/kaizen_nagoya/items/24a1ba5da3d09b2a95d1


2022 いいねをいただいた記事ランキング(O.K.版) CountDown Calendar 2022

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

2022年１月下旬　いいねをいただいた記事　16

https://qiita.com/kaizen_nagoya/items/0ee589a8edaeab24fd2a

AdCale(O.K.) CountDown Calendar 2022

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

「会議は15分未満」に。小耳にはさんだ話。

https://qiita.com/kaizen_nagoya/items/510c47c5d1e8d03145db

CountDown Calendar 2022 報告

https://qiita.com/kaizen_nagoya/items/5b4b99cb9ad571f4094b


誤差の評価が苦手（専門分野以外）

https://qiita.com/kaizen_nagoya/items/cc3a50827b24ab80985f




 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞


# 文書履歴(document history)
ver. 0.01 初稿 20221225
ver. 0.02 ありがとう追記　20230625

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
【ルール説明・basic】deprecated-command-syntax

こちらの記事は[Ansible lint Advent Calendar 2022 カレンダー2](https://qiita.com/advent-calendar/2022/ansible-lint) 3日目の記事になります。


今回はルール[deprecated-command-syntax](https://ansible-lint.readthedocs.io/rules/deprecated-command-syntax/)について説明します。

### deprecated-command-syntax

[deprecated-command-syntax](https://ansible-lint.readthedocs.io/rules/deprecated-command-syntax/) は省略記法が使われていないか検証します。省略記法を採用した書き方はデバッグが困難になりやすく推奨されません。

一部の Ansible モジュールでは`free-form`と言ってモジュールのキーに対して直接パラメーターを渡せるものがあります。この時に省略記法が使われているかどうかを検証するのが [deprecated-command-syntax](https://ansible-lint.readthedocs.io/rules/deprecated-command-syntax/) とも言えます。

### free-form の例

free-form で書かれた処理

```yaml
- name: Run command if /path/to/database does not exist (without 'args')
  ansible.builtin.command: /usr/bin/make_database.sh db_user db_name creates=/path/to/database
```

推奨される書き方

```yaml
- name: Run command if /path/to/database does not exist (with 'args' keyword)
  ansible.builtin.command: /usr/bin/make_database.sh db_user db_name
  args:
    creates: /path/to/database

# もしくは

- name: Run command if /path/to/database does not exist (with 'cmd' parameter)
  ansible.builtin.command:
    cmd: /usr/bin/make_database.sh db_user db_name
    creates: /path/to/database
```

### 問題のあるコード

```yaml
---
- name: Example playbook
  hosts: localhost
  tasks:
    - name: Perform chmod
      ansible.builtin.command: creates=B chmod 644 A # <-- 省略記法が使われている
```

### 修正されたコード

```yaml
---
- name: Example playbook
  hosts: localhost
  tasks:
    - name: Perform chmod
      ansible.builtin.command: chmod 644 A
      args:
        creates: B
```

### 参考サイト

* [deprecated-command-syntax — Ansible Lint Documentation](https://ansible-lint.readthedocs.io/rules/deprecated-command-syntax/)
マーメイド#18 円グラフ

**ひとりマーメイド18日目**
**円グラフ**

## 概要
マーメイドエンジニアのひろきです。こんにちは。
最近流行り（流行らせたい）のマーメイドについて理解を深めていこうと思います。

この記事では円グラフの記述について紹介します！

↓↓前回の記事はこちら

https://qiita.com/hirokiwa/items/33e38377054fc5c9c81d

## マーメイドで記述する円グラフ
前回の記事ではユーザージャーニーマップの記法について紹介しました。

今日は円グラフを見ていきます。円グラフは要素ごとの割合を比較する際によく使用されます。マーメイドでの記述は非常にシンプルです。

```:mermaid
pie
    title Favorite Fruit
    "Strawberry" : 87
    "Orange" : 42
    "Grape" : 29
```
```mermaid
pie
    title Favorite Fruit
    "Strawberry" : 87
    "Orange" : 42
    "Grape" : 29
```

## 宣言とタイトル
円グラフは`pie`で宣言されます。

`title`でダイアグラムにタイトルをつけることができます。こちらは省略可能です。
```:mermaid
pie
    title Favorite Fruit
    "Strawberry" : 87
    "Orange" : 42
    "Grape" : 29
```
```mermaid
pie
    title Favorite Fruit
    "Strawberry" : 87
    "Orange" : 42
    "Grape" : 29
```

## 要素と数値
円グラフの要素と数値を記述します。要素の名前を`""`で囲い、`:`以降にデータを数字で入力します。

`"LABEL": VALUE`

```:mermaid
pie
    "a": 12
    "b": 8
    "c": 5
    "d": 3
```
```mermaid
pie
    "a": 12
    "b": 8
    "c": 5
    "d": 3
```

## データの表示
デフォルトではグラフの中にパーセンテージが表示され、生データは表示されません。

`showData`を宣言することで、右下の要素一覧に生データを添えることができます。
```:mermaid
pie showData
    "a": 12
    "b": 8
    "c": 5
    "d": 3
```
```mermaid
pie showData
    "a": 12
    "b": 8
    "c": 5
    "d": 3
```

## 小数の使用
マーメイドの円グラフに使用できるデータは0以上の実数です。小数にも対応しています。

>Followed by positive numeric value (supported up to two decimal places)

[https://mermaid.js.org/syntax/pie.html](https://mermaid.js.org/syntax/pie.html
)

公式ドキュメントには小数点以下第２位まで対応と記載されていますが、実際はそれ以上記述しても問題なさそうです。

```:mermaid
pie showData
    "a": 0.000050
    "b": 0.000030
    "c": 0.000015
    "d": 0.000005
    "e": 0
```
```mermaid
pie showData
    "a": 0.000050
    "b": 0.000030
    "c": 0.000015
    "d": 0.000005
    "e": 0
```


## まとめ
円グラフの記述について紹介しました！

↓↓直の記事はこちら！！

https://qiita.com/hirokiwa/items/fa4632efa50e2811770b

## 参考

https://mermaid.js.org
【ルール説明・basic】deprecated-bare-vars

こちらの記事は[Ansible lint Advent Calendar 2022 カレンダー2](https://qiita.com/advent-calendar/2022/ansible-lint) 1日目の記事になります。


今回はルール[deprecated-bare-vars](https://ansible-lint.readthedocs.io/rules/deprecated-bare-vars/)について説明します。

### deprecated-bare-vars

[deprecated-bare-vars](https://ansible-lint.readthedocs.io/rules/deprecated-bare-vars/) はタスクで変数を利用する際に適切な形式で指定されているか検証します。`bare`とは英語で`覆いがない、むき出しになった`と言う意味です。Ansible では変数は`"{{ }}"`で囲うのが標準です。

#### 問題のあるコード

```yaml
---
- ansible.builtin.debug:
    msg: "{{ item }}"
  with_items: foo # <-- 変数が旧式の形式で指定されている
```

#### 修正されたコードその１

`foo`が変数でない場合は文字列として扱う

```yaml
---
- ansible.builtin.debug:
    msg: "{{ item }}"
  with_items:
    - foo
```

#### 修正されたコードその２

`foo`が変数の場合は`"{{ }}"`で囲う

```yaml
- ansible.builtin.debug:
    msg: "{{ item }}"
  with_items: "{{ foo }}"
```

### 参考サイト

* [deprecated-bare-vars — Ansible Lint Documentation](https://ansible-lint.readthedocs.io/rules/deprecated-bare-vars/)
Ruby initializeメソッドのオーバーライドについて

# initializeメソッドの動き
スーパークラスとサブクラスでinitializeが定義されていた場合、どのような動きが起こるか確認していきます。

```ruby
class Parent
    attr_accessor(:name)
    
    def initialize(name)
        @name = name
    end
end

class Child < Parent
    attr_accessor(:grade)
    
    def initialize (grade)
        @grade = grade
    end
end

p Child.new("10")    #=> @grade="10

p Parent.new("Aki")  #=> @name="Aki"
```

サブクラスに引数を与え、呼び出したとき、スーパークラスを呼び出さず、サブクラスのinitializeメソッドが呼び出されているのがわかります。

これは、通常のメソッドを下位レベルから探していくのと同じ手順です。

# サブクラスのinitializeにsuperを設定

initializeが重なっていた場合にスーパークラスのinitializeにsuperを設定することで、初期値を変更することで細かく制御することができる。

ただし、superの呼び出し方で反応が変わるので注意が必要です。

```ruby
class Parent
    attr_accessor(:name)
    
    def initialize(name)
        @name = name
    end
end

class Child < Parent
    attr_accessor(:grade)
    
    def initialize (grade)
        super("foo") #=> @name="foo"
        super        #=> @name="10"
        super "foo"  #=> @name="foo"
        super()      #=> ArgumentError
        @grade = grade
    end
end

p Child.new("10")  
```
`super("foo")`と`super "foo" `では、初期値を設定しているため`@name="foo"`という値が返ります。

`super`のみで呼び出す場合は、初期値の呼び出しがないため、スーパークラスのinitializeメソッドが呼び出され、`@name="10"`が設定されます。

`super()`ではerrorが発生します。
構文としては間違っていませんが、使用する場面としてはオーバーライドされるメソッドに引数を渡さずにsuperを使用したい時に限ります。（この場合、"10"を引数として渡したくない）

この場合はsuperに()をつけて明示的に示す必要があります。ただし、スーパークラスのメソッドの引数は定義すると使えないようです。

```ruby
class Parent
    attr_accessor(:name)
    
    def initialize()
        @name = name
    end
end

class Child < Parent
    attr_accessor(:grade)
    
    def initialize (grade)
        super()      #=> @name=nil
        @grade = grade
    end
end

p Child.new("10") 
```
### 参考
- Effective Ruby
- https://techracho.bpsinc.jp/hachi8833/2018_06_20/57090
Raspberry PiでHDDをマウントする

```bash
# HDDが認識されているかを確認する。(デバイス名を確認)
sudo fdisk -l

# 新しいストレージをマウントする場合は以下のコマンドでフォーマットする
sudo mkfs -t ext4 /dev/sda

# HDDをマウントするディレクトリを作成
sudo mkdir /mnt/usb1
sudo chmod 777 /mnt/usb1

# HDDをマウント
sudo mount -t ext4 /dev/sda /mnt/usb1
```

Raspberry Piの起動時に自動でマウントする場合は以下でできる。

```bash
# 自動USBマウントの設定
sudo vim /etc/fstab
----------------------------------------------------------------------------
/dev/sda /mnt/usb1 ext4 defaults 0 0
----------------------------------------------------------------------------

# 再起動
sudo reboot
```
アンマウントする場合は以下のコマンドでできる。
```bash
sudo umount /mnt/usb1
```