OmniAICreator/Qiita-1.07M huggingface dataset:
Googleデジタルマーケティング＆Eコマース：ソーシャルメディア分析を理解する

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/24ea32fb-2fb3-bdb2-462a-4ffc4d60a96f.png" width="800">

# ソーシャルメディア分析

***<font color="MediumVioletRed">『組織の戦略的なビジネス決定を改善するために、ソーシャルメディア・プラットフォームからデータを追跡、収集、分析するプロセスのこと』</font>***

ソーシャルメディア分析は、現在および将来のキャンペーンを正しい方向に導くための強力なツールになります。ソーシャルリスニングと同様に、分析を使用して、より良い意思決定、問題解決、パフォーマンスの向上、オーディエンスの理解に役立てることができます。

| 分析 | データの種類| 例| 
| :--- | :--- | :--- | 
| ソーシャルリスニング | 定性的 | 人々があなたのビジネスについて話すときに使う言葉に耳を傾けるなど、観察を通して収集したデータ　 |
| ソーシャルメディア分析 |定量的  | あるプラットフォームで、ある期間に何回クリックされたかといった、数値で測定できるデータ |

# ソーシャルメディア分析のメリット

### <font color="MediumBlue">オーディエンスをよりよく理解する</font>

分析を使用すると、どのような種類のコンテンツがオーディエンスのエンゲージメントを最も高めるかを知ることができます。

### <font color="MediumBlue">ベストなプラットフォームを選択する</font>

投稿に対するオーディエンスのエンゲージメントを分析することで、オーディエンスがオンラインで最もアクティブな時間帯を知ることができます。これによって、さまざまなプラットフォームに投稿する最適なタイミングを判断することができます。

データから洞察を得て、プラットフォームの選択に役立てることもできます。コンテンツは、あるプラットフォームと他のプラットフォームでより良いパフォーマンスを発揮する可能性があります。分析を使えば、さまざまなプラットフォームでのエンゲージメント、トラフィック、売上を測定することができます。そして、この情報をもとに、どのプラットフォームで公開するか、異なるプラットフォームでどのように時間の優先順位をつけるかを決定することができます。最高のパフォーマンスを発揮するプラットフォームに、より多くの時間を集中させることができるのです。

### <font color="MediumBlue">どのようなコンテンツが最高の結果をもたらすかを知る</font>

例えば、特定のプラットフォームでは、画像、動画、リンクのどれがより効果的か、どのタイプの画像が最も効果的かなどをモニターすることができます。FacebookやTwitterなど、一部のプラットフォームでは、どのようなコンテンツが最も高いエンゲージメントを獲得しているかを示す分析ツールが用意されています。

### <font color="MediumBlue">競合他社から学ぶ</font>

例えば、Twitterでは、プラットフォーム上のすべての公開会話を分析することができます。競合のデータを分析することで、競合の優れた点や失敗を評価することができます。これは、自社のコンテンツや戦略をどのように適応させ、改善するかに役立ちます。

### <font color="MediumBlue">のソーシャルメディアのROI（投資収益率）を測定する</font>

例えば、ブランドの認知度を高めることが目的であれば、分析ツールを使って、一定期間にさまざまなプラットフォームでどれだけのフォロワーを獲得したかを測定することができます。このデータを関係者に提示することで、ソーシャルメディアキャンペーンの効果を証明することができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/12727cdf-1e8c-023a-7280-20fb10d93a16.png" width="600">

### <font color="MediumBlue">ソーシャルメディア戦略を改善する</font>

分析は、ソーシャルメディア戦略において何がうまくいっていて、何があまり効果的でないかを理解するのに役立ちます。これによって、時間、労力、予算をより集中させることができます。

例えば、分析を使用して、ソーシャルメディア上のターゲットオーディエンスの人口統計学的情報をまとめることができます。これによって、そのターゲット層に対するマーケティング戦術を洗練させることができます。多くのソーシャルメディアプラットフォームには、サイトからのデータを収集・評価するための分析ツールがあります。

また、複数のプラットフォームでパフォーマンスを追跡し、レポートを作成するのに役立つソーシャルメディア分析ツールも数多く提供されています。例えば、Google Analytics、Sprout Social、Hootsuite Analytics、Buffer Analyzeなどがあります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/2f2fa312-ac3b-fc23-16e3-868861821ddf.png" width="600">
Typescriptで合成音声

# はじめに
ChatGPTの影響で合成音声を使いたいケースが、
きっと増えました（ふえたよね？）
簡単に合成音声を使えるので関数にしてまとめました。

# ソースコード

## 読み上げ関数
```typescript

interface ITextToSpeech {
  text: string;
  lang: "en-US" | "ja-JP"; // ISO 639-1コードの形式
  speed?: number; // 範囲: 0.1 ~ 10
  pitch?: number; // 範囲: 0.1 ~ 10
  volume?: number; // 範囲: 0 ~ 1
  voiceName?: string; // 使用する音声の種類
}

/**
 * 特定の文字をしゃべらせる
 * @param props 
 */
export const playTextToSpeech = (props: ITextToSpeech) => {
  const utterance = new SpeechSynthesisUtterance(props.text);
  utterance.rate = props.speed? props.speed: 1;
  if (props.voiceName){
    if (
      speechSynthesis.getVoices().find(
        (voice) => voice.name === props.voiceName)
    ){
      utterance.voice = speechSynthesis.getVoices().find(
        (voice) => voice.name === props.voiceName
      )
    }
  }
  utterance.pitch = (props.pitch)? props.pitch: 1;
  utterance.volume = (props.volume)? props.volume: 1;
  speechSynthesis.speak(utterance);
}
```

## 使うとき
```typescript
playTextToSpeech({ 
  text: "これは合成音声テストです。", 
  lang: "ja-JP", 
  pitch: 2, 
  speed: 2 
});
```
仮想環境のLinuxサーバーと利用しているwindowPCを接続してみる

<h1>まえがき</h1>
4年ぶりにQiita復活します。

前回の記事を書いた時にプログラマー志望の無職でしたが、現在は働いております。
ただし業務としてはプログラミング1割。インフラ2割。社内調整7割。みたいな感じで、ゴリゴリ技術的なことをやっている感じではないですね。
そんな中でも業務や勉強を通じていた知識を少しづつ書いていこうと思います。

今回は「仮想環境のLinuxサーバーと利用しているwindowPCを接続してみる」です。
当時はサポートが残っていたWindows8.1に無理やり仮想環境を作って色々やっていたのを記事にします。

まず、Window8.1でスペックもイマイチだったので仮想環境が重すぎたりして苦労したのですが、
・「VMware Workstation 15 Player」、
・「CentOS7」

の組み合わせでうまくいくことが判明しました。
(古いバージョンも公式HPを掘っていくと見つかったはず・・・）
VMware公式HP
https://www.vmware.com/jp.html
CentOS公式HP
https://www.centos.org/

参考になるのはこのページです。
https://www.netassist.ne.jp/techblog/13685/

<h1>仮想マシンのインストール</h1>
まずは、VMwareのインストールですが。これは勧められるままに実施していけば普通に出来ると思います。VMwareからCentOSのiosを取り込んでインストールします。

この際に「root」権限があるアカウントを必ず作ってください。
後でサーバーの設定などをするときにroot権限があるアカウントで実行しないと権限が足りずに弾かれてしまいますので。

<h1>CentOSを日本語化する</h1>
以下の記事が参考になります。

初期設定だとキーボードではないので設定を変更します。
http://www.mikitechnica.com/37-japanese-input.html

ページ左上の「アプリケーション>設定>地域」と言語と進んでください。
入力ソースという文字の下に+ボタンがあるのでそちらから[日本語（かな漢字)」を追加できます。


<h1>ネットワークがデフォルトではオフになっているのでLANをONにする。</h1>
ネットワークがオフになっているので利用しているPCとの接続やインターネットがつながりません。

こちらの設定をONにします。

参考になる記事はこちら
https://qiita.com/neko_the_shadow/items/1808d4652c8bd542a8de

CentOSの左上のアプリケーションから、
「システムツール > 設定 > すべての設定 > ネットワーク > 有線 > 歯車アイコン」
と進んでいきます。
ネットワークの有線がOFF状態になっているのでONに変えてください。


<h1>Nginxをインストールする</h1>
参考になる記事はこれになります。

https://belhb.hateblo.jp/entry/2017/06/04/202750


nginxをインストールする前に環境を作ります。
「アプリケーション>システムツール>端末」で端末を開いてください。
ターミナルを開くことができます。

ターミナルで以下コマンドを打ってください。
```
vim /etc/yum.repos.d/nginx.repo
```
出てきたページで以下のように設定してください。
```
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
```
そうしたらyumコマンドでnginxサーバーをインストールしてください。
```
yum -y install nginx
```

ちなみにvimは操作が結構特殊で
「wq!」で保存
「下へ移動する j」

とか癖があるので操作方法の一覧のようなものを見ながら設定することをおすすめします。


<h1>仮想環境のLinuxサーバーと利用しているWindowsPCを接続</h1>
nginxがインストールできたので、以下コマンドで起動しましょう。

```
systemctl enable nginx
```

続いて、
```
ip addr
```

とコマンドを打ってください。
inet ○○:○○:○○:○○

とIPアドレスが出てくるはずです。
これをメモしておいてください。



ここまで出来たら仮想環境を立ち上げている、WindowsPCに戻ってください。
WIndowsPCのブラウザに

・http://さっきメモをしたIPアドレス/

を入力すると仮想環境内のサーバーにアクセスできるはずです。




久しぶりに記事を書いた+昔設定した情報を書いているので多少変わっているところもあるかもしれません。
ずっとインプットと業務ばかりやっていたのですが少しづつアウトプットも出来たら良いなあ。
プロフィールページ作成⑨

<h1>プロフィールアイコン画像アップロード</h1>
概要
　
まずコンピュータで画像を選択
→サーバーに送られる→ストレージに保存

一般的には、クラウドストレージを使う。
例：aws,Azureなど

みなさんのパソコンの中にも、コンピュータで画像を選択
→サーバーに送られる→ストレージに保存この仕組みがある。

画像のアップロードには、ActiveStorageを使用

ターミナルにて、

    $rails active_storage:install
マイグレーションファイルが作成される
db/migrate/20230318003725_create_active_storage_tables.active_storage.rb

    $ rails db:migrate
マイグレーションファイルが作成できたので、上記を実行


app/models/profile.rb

    has_one_attached :avatar
こうするとプロフィールの中に、avatarというアタッチメントを突っ込むことができる。
アバターというデータを取得、アップロードすることができる。

アクティブストレージの設定は以上
これで、画像をアップロードできるようになった


続きをやっていきます。
app/controllers/profiles_controller.rb
 profile_paramsに
    
    :avatar
を追加。（保存する対象にするため）

app/views/profiles/edit.html.haml
アップロードするためのフォームを作る

    %div
      = f.label :avatar, 'アバター'
    %div
      = f.file_field :avatar
これで、保存する機能終わり

app/views/profiles/show.html.haml
画像を表示するようにする

      - if current_user.profile&.avatar&.attached?
          = image_tag current_user.profile.avatar
      - else
        = image_tag 'default-avatar.png'
attached:アップロードされているどうかを判断する
登録されていない時エラーが起こらないよう、ボッチ演算子を使っている。

現在この画像を使いたい箇所が三箇所あるので、一個にまとめたいと思います。

app/models/user.rb

      def avatar_image
        if profile&.avatar&.attached?
          profile.avatar
        else
          'default-avatar.png'
        end
      end
こうします

app/views/profiles/show.html.haml

      = image_tag current_user.avatar_image
こう変更します。
これで、先ほどと同じ意味になります

app/views/articles/show.html.haml

    = image_tag @article.user.avatar_image
順番に変えていきます。

app/views/layouts/application.html.haml

     = image_tag current_user.avatar_image

app/views/commons/_article.html.haml

      = image_tag article.user.avatar_image

これで、全て変更することができました。
(PostgreSQL)updated_at を自動更新する

## 前提

このようにテーブルに１行レコードが挿入されているとする。

テーブル名：test_automatic_updating
|  id |  name  | created_at |  updated_at  |
| ---- | ---- | ---- | ---- |
|  1  |  makima  |  2023 06:50:20  |  2023 06:50:20  |

## やり方
①関数を定義
②トリガーを定義
```sql:①関数を定義
CREATE FUNCTION update_test_automatic_updating_updated_at()
RETURNS TRIGGER AS $$
BEGIN
  NEW.updated_at = now();
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;
```

```sql:②トリガーを定義
CREATE TRIGGER update_test_automatic_updating
BEFORE UPDATE ON test_automatic_updating
FOR EACH ROW
EXECUTE FUNCTION update_test_automatic_updating_updated_at();
```

## テーブルを更新
```sql
-- 名前だけ変更
UPDATE test_automatic_updating SET name = 'shihainoakuma' ;
```
結果、update_atの値も更新してくれている
|  id |  name  | created_at |  updated_at  |
| ---- | ---- | ---- | ---- |
|  1  |  shihainoakuma  |  2023 06:50:20  |  2023 07:00:21  |
（PostgreSQL）SQLの処理速度検証

用意したテーブルとデータはこんな感じ

sql_execution_speed_check テーブル
|  name1 |  name2  | name3 |  ...  | name100 |
| ---- | ---- | ---- | ---- | ---- |
|  名前1-1  |  名前1-2  |  名前1-3  |  ...  | 名前1-100 |
|  名前2-1  |  名前2-2  |  名前2-3  |  ...  | 名前2-100 |
|  名前3-1  |  名前3-2  |  名前3-3  |  ...  | 名前3-100 |
|  ...  |  ...  |  ...  |  ...  | ... |
|  名前1000-1  |  名前1000-2  |  名前1000-3  |  ...  | 名前1000-100 |


## 1 取得カラム数

```sql:1カラム vs 100カラム
-- 前提条件:1レコードのみ取得

--- 1カラム
SELECT name1 FROM sql_execution_speed_check WHERE name1 = '名前1-1'; -- 0.027秒

-- 100カラム
SELECT * FROM sql_execution_speed_check WHERE name1 = '名前1-1'; -- 0.021秒
```

取得カラム数はsql発行速度に特に影響しないっぽい。


## 2 取得レコード数

```sql:1レコード vs 1000レコード
-- 前提条件：１カラムのみ取得

-- １レコード
SELECT name1 FROM sql_execution_speed_check WHERE name1 = '名前1-1'; -- 0.027秒

-- 1000レコード
SELECT name1 FROM sql_execution_speed_check; -- 0.023秒

```
レコード数も特に影響しないっぽい

## 3 取得カラム数・レコード数が共に多い場合

```sql
-- 100カラム * 1000レコード
SELECT * FROM sql_execution_speed_check; -- 0.065秒
```

どちらも多い場合は多少時間がかかるっぽい

## 4 発行回数

```sql:１回実行 vs 1000回実行
-- 100カラム * 1000レコード取得
SELECT * FROM sql_execution_speed_check;

-- 1回実行    0.065秒
-- 1000回実行 46秒
```
発行回数は多ければ多いほど時間がかかる
Googleデジタルマーケティング＆Eコマース：コンテンツの再利用

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/24ea32fb-2fb3-bdb2-462a-4ffc4d60a96f.png" width="800">

# コンテンツの再利用

ソーシャルメディアに投稿するデジタルマーケティング担当者は、新しいコンテンツを書き、デザインするためのベストプラクティスを知っておく必要があります。自分で開発する場合でも、他の人の仕事を監督する場合でもです。しかし、すべてのソーシャルメディア・プラットフォーム用に新鮮なコンテンツを開発し続けることは、時間の浪費につながります。そこで、ソーシャルメディア上でコンテンツを再利用することが有効です。再利用することで、最高のコンテンツを利用し、より多くの仕事をさせることができます。

コンテンツの再利用とは、コンテンツを異なるフォーマットで再現し、再リリースすることです。例えば、あるウェビナーのコンテンツを、ビデオ、電子書籍、ブログ記事などに変えることができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/b7cdcd91-91c7-ce90-54e9-fe69bcb4d854.png" width="550">

# コンテンツの再利用のメリット

時間の節約になるだけでなく、他のメリットもあります。

- ブランドのメッセージを強化し、コンテンツのSEOを向上させ、最初に公開したときに投稿を見逃したオーディエンスにリーチすることができるのです。
- 既存の画像、動画、テキストから、まったく新しいオリジナルコンテンツを作成することができます。

# コンテンツの再利用の考慮点

- どのコンテンツを再利用するか検討する際は、パフォーマンスが高く、Webサイトへのトラフィックの増加、リードの生成、ブランド認知度の向上など、戦略で定めた目標の達成に役立つコンテンツを優先してください。
- もうひとつ考慮すべきは、そのコンテンツがエバーグリーンであるかどうか、つまり長期間にわたって関連性を持ち続けるものか、それとも時間的制約があるものか、という点です。
    - 例えば、イベントに特化したコンテンツは、再利用には適さないでしょう。再利用する高パフォーマンスのエバーグリーン・コンテンツを選択したら、それをどのように再利用するかを決定することができます。

# コンテンツの再利用の方法

ソーシャルメディア上のコンテンツを再利用する方法は無限にあり、利用したいプラットフォームによって異なります。例えば、YouTubeでは5分間のチュートリアルビデオが効果的かもしれませんが、Twitterでは長すぎるかもしれません。

ここでは、ソーシャルメディア上でコンテンツを再利用するための一般的な方法をいくつか紹介します。

### <font color="MediumBlue">リストを一連の投稿に分割する</font>

箇条書きで書かれたハウツーガイド、または提案のリストを投稿したことがあるかもしれません。そのリストを一連の投稿に分割することができます。

例えば、あなたのホームセンターが、予算内でキッチンを新しくする5つの方法について投稿した場合、5つの新しい独立した投稿にすることができます。それぞれが元のリストを詳しく説明します。それぞれの投稿は、追加情報やリンクを提供することができ、視聴者にとって元の投稿の価値を高めることができます。  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/720b0d8c-aaea-c023-e727-1dd830b98fff.png" width="550">

### <font color="MediumBlue">テキストを画像に変換する</font>

例えば、データや統計を含む投稿は、インフォグラフィックにすると効果的です。画像は、読者が複雑な概念を理解するのに役立ちます。

### <font color="MediumBlue">ビデオクリップをGIFにする</font>

ビジュアル・コンテンツはテキストよりも高いエンゲージメントを生み出すので、文章を画像に再利用することで、より多くの人にリーチすることができます。

コンテンツを再利用するもう一つのクリエイティブな方法は、楽しい、あるいは面白いビデオクリップやアニメーションをGIF（アニメーション画像）にすることです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/9cc4ddb3-f1cf-5105-6372-39738a99bd33.png" width="550">

### <font color="MediumBlue">既存の記事で回答する</font>

ソーシャルメディア・プラットフォームで頻度の高い質問を特定し、既存の記事で回答することも可能です。関連するコンテンツを再利用し、それを自分の回答にリンクさせることで、関係を構築し、同じ質問をしている人があなたを見つけるのを助けることができます。

# コンテンツの再利用を支援するためのツール

コンテンツの再利用を支援するためのツールは、数多くあります。

これらのツールは、

- ポッドキャストをブログの記事に変換する
- YouTubeの短い動画から記事を作成する
- ブログの記事をポッドキャストのエピソードに変換する

などの作業を支援します。

例えば、デジタルマーケティング担当者のWebサイトやブログの作成を支援するツールであるWordPressには、2回クリックするだけでブログ記事をTwitterのスレッドとして同時に自動公開する機能があります。
Azure AD の「外部ユーザーの招待」を Azure CLI でやってみた

Azure ポータルで Azure AD の「外部ユーザーの招待」をする事があると思います。数人ならそんなに苦ではないのですが、片手を超えてくると流石に CLI でやりたくなってきます。また、招待メールが届いて承諾した後 account.activedirectory.windowsazure.com に飛ばされてしまい、Azure AD に招待したのにユーザーエクスペリエンスがイケていません。そこで、Azure CLI を使って「外部ユーザーの招待」を行う際に、承諾後のリダイレクト先に Azure ポータル指定してゲストユーザーを作成してみました。

### 外部ユーザーの招待を Azure CLI で実行

```bash:bash
tenant=examplejp.onmicrosoft.com
guest=user@example.jp

az rest \
  --method post \
  --url "https://graph.microsoft.com/v1.0/invitations" \
  --body '{
    "invitedUserEmailAddress": "'$guest'",
    "inviteRedirectUrl": "https://portal.azure.com/'$tenant'",
    "sendInvitationMessage": true
  }'
```

### 参考

https://learn.microsoft.com/ja-jp/graph/api/resources/invitation?view=graph-rest-1.0
特定のリモートIPアドレスに対してポートが開いているか簡単に確認する方法

## TL; DR

> `nc -zv <IPアドレス> <ポート番号>`

例

> nc 192.168.1.1 80

## 説明

- https://manpages.ubuntu.com/manpages/bionic/man1/nc_openbsd.1.html
Googleデジタルマーケティング＆Eコマース：Canvaでビジュアル・コンテンツを作成する

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/24ea32fb-2fb3-bdb2-462a-4ffc4d60a96f.png" width="800">

# Canvaとは

Canvaは、ソーシャルメディアのグラフィック、プレゼンテーション、ポスター、ドキュメント、動画などのビジュアル・コンテンツを作成するために使用されるオンライングラフィック・デザインツールです。ある程度の専門知識を必要とする他のグラフィックデザインツールとは対照的に、Canvaは使いやすさに特化して設計されているため、初心者の方でも安心して使い始められます。

Canvaには数多くのテンプレートが用意されており、デジタルマーケティング担当者は専門的なデザインレベルでブランド価値のある投稿を行うことができます。

https://www.canva.com/ja_jp/

# Canvaインタフェースをナビゲートする

Canvaで新しいソーシャルメディアアセットを作成するには、ログインするか、新しいアカウントを作成する必要があります。メールアドレスを入力してパスワードを作成するか、Google、Facebook、Appleのアカウントでログインするよう指示されます。

次に、デザインの作成を選択します。作成したい投稿の種類を選択します。ビデオ、プレゼンテーション、Instagramの投稿またはストーリー、ポスター、Facebook投稿、ロゴ、チラシ、インフォグラフィック、履歴書など、さまざまなタイプのコンテンツを作成することができます。今回、ソーシャルメディアを取り上げますので、とりあえずInstagramの投稿を選択します。

さて、ページ上部のバーで投稿のタイトルを付けます。投稿のタイトルには、必ず説明的なものを付けてください。例えば、割引や休日などのタイトルをつけるとよいでしょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/12e5d6e1-4879-8abe-8953-d9bf7b44c720.png" width="７00">

タイトルを付けたら、検索バーに電子商店のような投稿やビジネスの具体的なトピックに関わるキーワードや、カラフルといった漠然とした言葉を入力して、Canvaの様々なテンプレートを閲覧してみましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/ccff0c89-db95-204c-e3a4-6833f6259798.png" width="７00">

気に入ったテンプレートが見つかったら、それを選択して投稿に追加します。要素を選択すると、テンプレート内のすべての要素を調整、編集することができます。ツールバーが表示され、好きなように変更することができます。色、サイズ、フォント、テキストの配置、間隔などを変更することができます。複数の要素を選択したい場合は、編集したい要素の上でマウスをクリック＆ドラッグすると、一緒に選択されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/7f566e1a-6ecd-32ba-8a6a-5fc806139d83.png" width="７00">

見出しのテキストを追加する準備ができたら、「テキスト」メニューから「見出しを追加」を選択します。見出しを記事内の配置したい場所に移動します。また、テンプレート内の既存のテキスト要素をクリックして、編集や削除を行うこともできます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/d4c4c09e-d1b4-6956-0223-bae81074b6e6.png" width="500">

テキストを調整するには、編集したいテキストを選択し、ドロップダウンメニューからフォントを選択します。テキストを利用しやすくするために、複雑なフォントやイタリック体、太字などの特殊な文字は避けてください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/84c1747b-cbb7-9d16-5754-d6316b572ffd.png" width="500">

次に、「要素」タブをクリックすると、グラフィック、写真、ビデオなどを検索できます。検索バーにキーワードを入力すると、デザインに関連する要素を見つけることができます。エレメントタブのアイテムをクリックすると、自動的にキャンバスに追加されますが、自由にドラッグして好きな場所に配置してください。

新しい投稿をソーシャルメディアに投稿する前に、コラボレーターと共有したい場合があります。共有するには、共有ボタンをクリックします。ここで、共有の権限を、追加された人のみから、リンクを持つ誰でもまで設定することができます。リンクをコピーする]をクリックするか、共同作業者のメールアドレスを追加します。

最後に、このアクティビティを完了するために行った作業を必ず保存してください。Canvaは自動的に作品を保存しますが、[ファイル]をクリックして[保存]を選択することによっても保存することができます。作品を保存したら、ホームページの[プロジェクト]タブに移動して、保存したプロジェクトを見つけることができます。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/ba822f3f-e4c5-2e7e-1b68-6e0773ca7400.png" width="500">

# サンプル

https://www.canva.com/design/DAFajoJ7XFI/IpZKijnfy_FbqEe3cwcjBA/watch?utm_content=DAFajoJ7XFI&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton
エンジニアの友達が欲しいです！！！！

<h1>エンジニアの友達が欲しいです:sunny:

現在私はプロでアスリートをしております。
業界の特色上、エンジニア業界の繋がりを持つ人間は皆無です。
また、性格も真逆や真逆。
避けられるタイプの人間だと思っております。
（自分の勝手な偏見だと思っておりますが。。。）

<h3>なぜエンジニアの友達が欲しいかというと、、、</h3>
将来的にエンジニアになりたいからです。

プログラミングが好きで勉強をしていくうちに楽しくなり、エンジニアになりたいと思う気持ちが強くなりました。

なので1人くらい体育会系のやつが友達にいてもいいかって
思ってくれる人はコメントなどいただけたら即連絡させていただきます。

よろしくお願いします！！！


### 自分で試したこと
・勉強会などに参加する
→ 参加してどのように友達を作ったらいいのでしょうか？みんなの前でLINE教えてって言えばいいのでしょうか？笑
プロフィールページ作成⑧

<h1>性別の日本語化</h1>

性別の表示やセレクトボックスの日本語化

config/locales/enum.ja.yml
こういったファイルを作成。

    ja:
      enum:
        genders:
          male: '男性'
          female: '女性'
          other: 'その他'
と記載。

これを表示していく。

app/views/profiles/show.html.haml

    #{current_user.display_name} (#{current_user.age} • #{I18n.t("enum.genders.#{current_user.gender}")})

I18n:多言語
I18n.t:config/locales/enum.ja.ymlここのパスを追って、とってきてくれる。他のymlの値をとることもできる。

<h5>選択する表示も変更していきます</h5>

app/views/profiles/edit.html.haml
[['男性', 'male']]
とやると、一つ目がsectionのラベルになり、二つ目が、valueになる。

コンソールの中でやってみる

    $Profile.genders.keys
今までは、こうやってきた。

    $Profile.genders.map { |k, v| [ I18n.t("enum.genders.#{k}"), k ] }

ラベルを取得とキーをそのまま取得

app/views/profiles/edit.html.haml
と記載

      = f.select :gender, Profile.genders.map { |k, v| [ I18n.t("enum.genders.#{k}"), k ] }, {}, { class: 'text' }

これで、日本語表示で選択することができます！
ダビンチ nano w 印刷手順と終了手順

### 記録しときます
自分用も兼ねてダビンチ nano w の印刷手順と終了手順を書いておきます。まだ1回印刷成功しただけの素人の記録なんでこれで正しいかどうかはわかりません。
参考資料は
北海道教育大学札幌校技術科教育学研究室さんの動画
ダヴィンチnanoの使い方１～１７
<iframe width="560" height="315" src="https://www.youtube.com/embed/WTOsUmChdOQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
です。とても参考になりました。というか17個の動画を見て取ったノートほぼそのままです。

### 印刷手順

１　フィラメントの先端をニッパで４５度を目安に切断
２　フィラメント背面に装着
３　左レバーを引きながらフィラメントを下の穴からパイプに入れる
４　XYZPrint起動
５　スタンバイ...　確認
６　フィラメント　＞　ロード　＞　開始　とクリック
７　ノズル加熱、200度超まで上がったあたりでノズルから溶けたフィラメントがニョロニョロ出てくるのを確認。
８　完了　をクリック、ニョロニョロは手で取って捨てる
９　テーブルを外し、マスキングテープを貼る。
１０　スティックのりを塗って、テーブルをセット。
１１　STLモデルをロード
１２　サポートの設定を確認、適切に設定。
１３　準備　をクリック
１４　印刷　をクリック

### 終了手順

１　ダッシュボード　＞　エクストルーダ　＞　クリーニング　＞　開始
２　加熱終了（200度超）で画面が切り替わるまで待つ
３　0.4㎜の付属のピンでノズルをクリーニング　（5分以内）
４　完了　をクリック
５　フィラメント　＞　アンロード　＞　開始　をクリック
６　画面が変わったら　完了　をクリック
７　フィラメントを背面から取り外し、シリカゲルを入れて保管
８　電源OFF

### 関連リンク
開梱～初印刷までの顛末

https://qiita.com/mikoaisa/items/bfc56da037e799ba2f74
Redashのクエリーキャッシュの肥大対策

## 概要

redashは、クエリーを実行させるとキャッシュが残ります。
しかし、日次で見るようなクエリーであれば、昨日のクエリーは意味がないです。
なので、キャッシュはどんどん消して行くべきです。

## キャッシュ自動削除の仕組み

キャッシュ削除はデフォルトで下記の通りの設定値で制御されます。

https://redash.io/help/open-source/admin-guide/env-vars-settings

|環境変数名|意味|デフォルト値|
|---|---|---|
|REDASH_QUERY_RESULTS_CLEANUP_ENABLED|自動キャッシュ削除機能を有効にするかどうか|true|
|REDASH_QUERY_RESULTS_CLEANUP_COUNT|自動キャッシュ削除1回あたり何レコードを消すか|100|
|REDASH_QUERY_RESULTS_CLEANUP_MAX_AGE|キャッシュが作られてから何日後に消すか|7|

キャッシュ削除は5分に一回実行され、その1回あたりの最大削除レコード数が上記の通り制限されています。
なので、この数値が小さいと、利用のされ方によっては、キャッシュがたまるスピードの方が早くてどんどん容量が圧迫されてしまいます。
僕が導入したクライアントでは、REDASH_QUERY_RESULTS_CLEANUP_COUNTは1500に設定しています。

## 設定の仕方

envファイルは、/opt/redash/.env または、/opt/redash/env あるいは、docker-compose.yml でも設定できます。
設定したら docker-compose で再起動します。

```
docker-compose down 
docker-compose up -d
```

なお、PostgreSQLはキャッシュを消しても基本的にディスク容量は開放されません。
適宜vacuumなどを行う必要があります。

https://www.postgresql.jp/document/9.1/html/sql-vacuum.html
Googleデジタルマーケティング＆Eコマース：ブランドボイスを構築する

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/24ea32fb-2fb3-bdb2-462a-4ffc4d60a96f.png" width="800">

# ブランド・ボイスが必要不可欠な理由

***<font color="MediumVioletRed">『ブランド・ボイスとは、ブランドがコミュニケーションにおいて持つ明確な個性のこと』</font>***

明確で一貫したブランド・ボイスを構築することは、さまざまな理由から必要不可欠です。

- ソーシャルメディア上で目立つことができます。混雑するソーシャルメディアにおいて、明確なブランド・ボイスを持つことで、より印象的になり、競合他社と差別化することができます。
- 明確なブランド・ボイスを持つことは、あなたのブランドをより認知させることにもつながります。これにより、現在および将来の顧客があなたのブランドに親しみを持ち、全体的なブランド認知度が高まります。
- ブランド・ボイスの創出は、すべてのマーケティングコンテンツにおいて、一貫した言葉とメッセージを発信することに他なりません。この一貫性により、顧客の信頼とロイヤルティを築くことができるのです。

# ブランド・ボイスの構築方法

### <font color="MediumBlue">1.ブランドの個性を定義する</font>

ソーシャルメディアにおけるあなたのブランド・ボイスを定義するために、まず、あなたのブランドの個性をどのように表現したいかを考えてみてください。

- もしあなたのブランドが人間だったら、どんな人でしょうか？
- 何を話すでしょうか？
- どのように行動するだろうか？
- お客様との関係はどのようなものでしょうか？
- コーチのような、友人のような、あるいは親のような振る舞いでしょうか？

あなたのブランドのパーソナリティを表現するための形容詞をいくつか考えてみてください。

- あなたは、親しみやすく、明るく、親切ですか？
- スマートで、自信に満ちていて、フォーマルですか？
- カジュアルで皮肉屋、そして大胆？

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/bcfa909e-4326-e81f-6867-a0746ff96f6e.png" width="500">

### <font color="MediumBlue">2.現在と過去のコンテンツをレビューする</font>

ブランド・ボイスをさらに明確にするために、あなたの会社の現在と過去のコンテンツを見直してみましょう。

マーケティング・コミュニケーションのあらゆる事例を研究し、あなたのブランド・ボイスが現在どのようなものであるかを把握しましょう。

- ターゲットとするユーザーはどのように話し、どのようにあなたと交流しているのでしょうか？
- 過去にどのようなコンテンツがオーディエンスの共感を得たのでしょうか？
- 彼らはどのような言葉を使うのでしょうか？

ここから、あなたのブランドの個性が現在どのようなものであるかを感じ取り、それをさらに形成する方法を考え始めることができます。

### <font color="MediumBlue">正直で本物であること</font>

あなたのブランド・ボイスは、正直で本物であることが重要です。複雑な用語、頭字語、専門用語など、オーディエンスがあなたのメッセージを理解するのに邪魔になるようなものはすべて避けてください。むしろ、聴衆に直接何かを話すように、自然な話し方をしましょう。

オーディエンスは、オンラインであなたと関わることに安心感を覚え、実在の人物と話したいと思うはずです。本物のブランド・ボイスを持つことは、顧客とのつながりを形成し、関係を構築するのに役立ちます。

### <font color="MediumBlue">トーンを見つける</font>

ソーシャルメディアのブランド・ボイスを構築することに加えて、関連する概念として、トーンを見つけることを考え始めることができます。

- ボイスは、ブランドの個性を表現するものですが、
- トーンは、ブランド・ボイスをどのように適用するか

ということです。コンテンツのトーンは、オーディエンス、状況、プラットフォームなどの要素によって異なります。

例えば、

- 最新製品の発売を知らせるときは、明るくワクワクするようなトーンで表現する。
- 自然災害を経験したばかりの地域住民を支援するときは、真剣に共感するようなトーンで表現する。

基本的に、ブランド・ボイスは一つですが、その声を表現するためにさまざまなトーンが使われます。

### <font color="MediumBlue">ブランド・ボイスのガイドライン</font>

全てのマーケティングチャネルで一貫性を保つために、企業はしばしばブランド・ボイスのガイドラインを作成します。

このガイドラインは、ブランドを文章で表現する方法について説明するものです。

- ブランドの使命や価値観
- 個性
- ターゲット
- 読者層
- よく使われる語彙やフレーズ
- 異なる状況やプラットフォームでのトーン
- 例文

などが含まれます。

ブランドガイドラインは、ブランド・ボイスで文章を書かなければならないときや、他の人の作品をレビューするときに役立つ参考資料です。

このガイドラインは、複数の担当者があなたのブランドを反映したコンテンツを作成し、ブランドの一貫性を確保するのに役立ちます。その分野や組織の新参者にとっては、有益な方向性を示してくれるでしょう。

:::note info
ソーシャルメディア上でブランド・ボイスを表現することは、競合他社に差をつけ、ブランドをより認知させ、顧客の信頼とロイヤリティを高めるために重要です。
:::
ubuntu(wsl2)のbashでstarship(NerdFont)を使う

# Target
vscode や Windows 標準のターミナルアプリ上で bash を用いる際に starship & Hack Nerd Font Mono を導入することにより、見た目を向上させる。

# Hack Nerd Font Mono を Windows に インストール
添付したリンク(GitHub)へ
→ "Download"を押下 
→ 画面左下に出てくる横長四角を押下 
→ "インストール(i)"を押下

note: ダウンロードした Font は C:\Windows\Fonts に蓄えられる
note: Mono は等幅という意味。

https://github.com/ryanoasis/nerd-fonts/blob/master/patched-fonts/Hack/Regular/complete/Hack%20Regular%20Nerd%20Font%20Complete%20Mono.ttf

→ Windows 標準の"ターミナル"アプリを開く
→ した「く」の字を押下
→ "設定"を押下
→ 左上の横三本線
→ 規定値
→ 外観
→ フォントフェイスから"Hack Nerd Font Mono"を選択
→ 新しく bash インスタンスを立ち上げフォントの適用を確認

→ vscode を立ち上げる
→ 左下歯車マーク
→ 設定
→ "terminal integrated font family" で検索
→ "Terminal > Integrated: Font Family"の項目に"Hack Nerd Font Mono"と入力
→ vscode 再起動

# starship を ubuntu にインストール
bash を開く
→ 以降、添付したリンクに従う(Step1~3)
→ Step1: curl -sS https://starship.rs/install.sh | sh
→ Step2: ~/.bashrc に eval "$(starship init bash)" を追記
→ Step3: 新しい bash インスタンスを立ち上げると starship が適用されている！

note: Step1において cargo(Rustの公式パッケージ管理ツール)を用いた方法を検討しましたが、error が解消できなかったため、上記の方法に変更しました。

https://starship.rs/guide/#%F0%9F%9A%80-installation

# starship の設定・カスタマイズ
添付のリンクから気に入ったものを選び(今回は No Nerd Fonts とします)、ピンク色の見出し("No Nerd Fonts")をクリック
→ Configuration に書かれている、
  starship preset no-nerd-font > ~/.config/starship.toml
を bash で入力

https://starship.rs/presets/#nerd-font-symbols

下のサイトの検索窓に "Ubuntu" 等と検索することで Nerd Font 対応の特殊文字をコピーできる。starship のプリセットにオリジナリティを加えることが可能。

note: ~/.config/starship.toml の該当箇所に特殊文字を張り付ける。

https://www.nerdfonts.com/cheat-sheet

# vscode terminal カラーテーマ

引き続き vscode の設定検索窓に workbench.colorCustomizations と入力
→ 下のサイトよりお好みのターミナルカラーをコピー
→ setting.json ファイルの"workbench.colorCustomizations"に張り付ける

https://glitchbone.github.io/vscode-base16-term/#/onedark

こちらも。

https://iterm2colorschemes.com/

https://github.com/mbadolato/iTerm2-Color-Schemes/tree/master/vscode

# 細かな設定
[vscodeの設定]
- Editor: Font Family を Hack Nerd Font Mono に変更。
[condaの設定]
- ~/.condarc を作成し、以下を記述
  auto_activate_base: false
  changeps1: false
- ~/.config/starship.toml に以下を追記
  [conda]
  ignore_base = false
[rlangの設定]
- ~/.config/starship.toml に以下を追記(.rを含めるため)
  [rlang]
  detect_extensions = ['r', 'R', 'Rd', 'Rmd', 'Rproj', 'Rsx']

# あとがき
綺麗な bash が完成しました。(私は One Dark Theme に統一しました…！)

急いで書いたため雑さは否めませんが、今後もメモ代わりにこのような記事を書くかもしれません。初めてのQiita記事ということで、技術記事を書くことへの導入にもなりました。ここまで読んでくださり、ありがとうございました。
Googleデジタルマーケティング＆Eコマース：ソーシャルメディア・コンテンツを書くためのベストプラクティス

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/24ea32fb-2fb3-bdb2-462a-4ffc4d60a96f.png" width="800">

ソーシャルメディア上でエンゲージメントとフォロワーを増やすために、たくさんの素晴らしい戦略を採用することができます。しかし、投稿するコンテンツがオーディエンスにとって魅力的でなければ、キャンペーンの成功は望めません。企業がマーケティング・コンテンツの開発にどのようにアプローチするかは、企業の規模やリソースによって異なります。

マーケティング・コンテンツに特化した社内リソースを持っている企業もあるでしょう。また、フリーランサーやメディアエージェンシーに資産形成を委託している企業もあるでしょう。コンテンツを自分で書いてデザインする場合でも、他の人と協力して開発する場合でも、魅力的なコンテンツの原則を理解する必要があります。最終的に、コンテンツが自社ブランドをよく反映し、オーディエンスに届くようにする責任は、あなたにあるのです。

# ソーシャルメディア・コンテンツを書くためのベストプラクティス

### <font color="MediumBlue">オーディエンスに向けて文章を書く</font>

まず、オーディエンスに向けて文章を書くことを心がけましょう。これは、彼らを知るために調査をすることを意味します。

- 彼らの興味や価値観は何なのか？
- どんなニーズや障害、課題を抱えているのか？

ソーシャルメディアへの投稿に気づいてもらい、参加してもらうには、彼らのニーズを中心に据えた文章を書く必要があります。彼らの視点に立ち、あなたのビジネスや製品が彼らの生活をどのように向上させることができるかを考えましょう。これは、一人一人に直接語りかけるように書くことにもつながります。

### <font color="MediumBlue">オーディエンスと同じように話す</font>

オーディエンスの視点を考えるだけでなく、彼らとと同じように話すことも重要です。ターゲットとするオーディエンスがどのような言葉を使ってコミュニケーションをとっているのかを調べます。そして、同じような言葉をコンテンツに使うことで、彼らの心に響くようにしましょう。

### <font color="MediumBlue">各プラットフォームに合わせた文章を書く</font>

また、各プラットフォームに合わせた文章を書くことも必要です。
- 例えば、LinkedInのプロフェッショナル向けの投稿と、Facebookの若年層向けの投稿では、一般的に異なる言語を使用する必要があります。

つまり、あるプラットフォームで人々が見慣れている言葉とは異なる言葉を意図的に使うことは、人々の注意を引くのに非常に効果的なのです。

### <font color="MediumBlue">投稿を短く、シンプルにする</font>

人々は毎日、ソーシャルメディア上で膨大な数のコンテンツに触れています。この短い時間の中でオーディエンスの注意を引くには、投稿を短く、シンプルにすることです。

- 専門用語を避ける
- 見出しをつけ、箇条書きにする
- リストを使ってメッセージを分割する
- 文章や段落を短くする
- 重要な情報を太字にする

などの方法があります。こうすることで、オーディエンスが読みやすく、理解しやすい投稿になります。

### <font color="MediumBlue">コール・トゥ・アクションを記載する</font>

ソーシャルメディアの投稿の最後には、コール・トゥ・アクションを記載しましょう。コール・トゥ・アクションとは、お客さまが次に何をすべきかを示す指示のことです。コールトゥアクションは、ディスプレイ広告やメールマーケティングなど、多くのデジタルマーケティングチャネルで使用されています。

ソーシャルメディアでは、

- 投稿を「いいね」または「シェア」してもらう
- 質問に答えてもらう
- クイズに答えてもらう
- 他のコンテンツを読んでもらう
- ウェブサイトにアクセスしてもらう
- ニュースレターを購読してもらう
- 他のソーシャルメディアでつながってもらう

などがコールトゥアクションに含まれます。

たとえ、あなたのコンテンツが興味深く、価値のあるものであったとしても、それを読んだ人は何も行動を起こさないかもしれません。コール・トゥ・アクションは、そのような人たちがあなたとさらにつながることを促します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/7526adf5-6d3c-6a08-a35e-3e6db80f68e8.png" width="400">

### <font color="MediumBlue">ブランドの声で書く</font>

ソーシャルメディアへの投稿は、ターゲットオーディエンスの言語で書くべきですが、全体的なメッセージは、あなたのブランドの声で書かれるべきです。ブランドの声とは、ブランドがコミュニケーションで発揮する明確な個性のことです。コンテンツを書くとき、あるいは視聴者と対話するときに使う言葉や口調です。
- 例えば、あなたのブランド・ボイスは、カジュアルで会話的なものかもしれませんし、プロフェッショナルでシリアスなものかもしれません。

ソーシャルメディアも含め、すべてのマーケティングチャネルで作成するコンテンツにおいて、ブランドボイスは一貫している必要があります。この一貫性によって、視聴者はあなたを認識し、親しみを持つことができます。

### <font color="MediumBlue">文法とスペルに気を配る</font>

全てのマーケティングコピーと同様に、文法とスペルには必ず気を配りましょう。あなたのブランド・ボイスがカジュアルであっても、間違いのあるコンテンツを投稿すると、あなたのビジネスの印象が悪くなります。

:::note info
効果的なソーシャルメディアライティングの原則を実践することで、オーディエンスにリーチし、エンゲージすることができます。
:::
（PHP）コメントは基本書かない

コードにコメントを書かない方がいい理由と書いてもいい場合についてまとめた。
[参考にした書籍](https://www.amazon.co.jp/%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%EF%BC%8F%E6%82%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E5%AD%A6%E3%81%B6%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80%E2%80%95%E4%BF%9D%E5%AE%88%E3%81%97%E3%82%84%E3%81%99%E3%81%84-%E6%88%90%E9%95%B7%E3%81%97%E7%B6%9A%E3%81%91%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-%E4%BB%99%E5%A1%B2-%E5%A4%A7%E4%B9%9F-ebook/dp/B09Y1MWK9N/ref=sr_1_1?adgrpid=123448696210&gclid=CjwKCAjw_MqgBhAGEiwAnYOAekXKSztdwS2-DI65g-c6tlN689JeVgPjHs15oQgO8E8qgf1Nf3DP_BoC7zsQAvD_BwE&hvadid=649115266285&hvdev=c&hvlocphy=1009129&hvnetw=g&hvqmt=e&hvrand=18111235403223925665&hvtargid=kwd-1643712552360&hydadcr=27271_14653887&jp-ad-ap=0&keywords=%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%2F%E6%82%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E5%AD%A6%E3%81%B6%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80&qid=1679004868&sr=8-1)

# コメントを書かない方がいい理由
## １ コメントの情報は古くなる
- 仕様変更時、コードは修正されるが、コメントは修正漏れが発生しやすい（**退化コメント**）。
- 退化コメントは偽情報の記載に繋がり、可読性の低下やバグを引き起こしやすい。
- 特にロジックの挙動をなぞるだけのようなコメントは退化コメントになりやすい
```php:挙動をなぞるだけのコメント
function calculateDiscountedPrice($price) {
  $discountedPrice = $price;
  $dayOfMonth = date('j');

  // $dayOfMonth が20 または30の場合、$price に0.95をかけて返す
  if ($dayOfMonth == 20 || $dayOfMonth == 30) {
    $discountedPrice = $price * 0.95;
  }

  return $discountedPrice;
}

```

## ２ 命名がてきとうになる
- わかりづらい変数名・関数名をコメントでごまかそうとしがち
- わかりやすい命名をする（ChatGPT使おう！）

# コメントを書いてもいい場合
そもそも、エンジニアがいつどんな目的でコードを読むかというと、大きく分けて

① 保守
② 仕様変更時

である。

① 保守の時、主に考えることは、
「**このコードの意図はなんだろうか**」

② 仕様変更時、主に考えることは、
「**何に注意して変更すればよいだろうか**」

であるため、**コードの意図** や **仕様変更時の注意点** については、コメントとして残すのが適当。


```php:良いコメント例
// 割引価格を返す
function calculateDiscountedPrice($price) {
  $discountedPrice = $price;
  $dayOfMonth = date('j');

  // 今後仕様変更で割引デーまたは割引率を変更する場合、本メソッドを変更すること
  if ($dayOfMonth == 20 || $dayOfMonth == 30) {
    $discountedPrice = $price * 0.95;
  }

  return $discountedPrice;
}

```


# 参考書籍
[良いコード/悪いコードで学ぶ設計入門](https://www.amazon.co.jp/%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%EF%BC%8F%E6%82%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E5%AD%A6%E3%81%B6%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80%E2%80%95%E4%BF%9D%E5%AE%88%E3%81%97%E3%82%84%E3%81%99%E3%81%84-%E6%88%90%E9%95%B7%E3%81%97%E7%B6%9A%E3%81%91%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-%E4%BB%99%E5%A1%B2-%E5%A4%A7%E4%B9%9F-ebook/dp/B09Y1MWK9N/ref=sr_1_1?adgrpid=123448696210&gclid=CjwKCAjw_MqgBhAGEiwAnYOAekXKSztdwS2-DI65g-c6tlN689JeVgPjHs15oQgO8E8qgf1Nf3DP_BoC7zsQAvD_BwE&hvadid=649115266285&hvdev=c&hvlocphy=1009129&hvnetw=g&hvqmt=e&hvrand=18111235403223925665&hvtargid=kwd-1643712552360&hydadcr=27271_14653887&jp-ad-ap=0&keywords=%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%2F%E6%82%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E5%AD%A6%E3%81%B6%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80&qid=1679004868&sr=8-1)
洗濯：入院日記十日目

この資料は医療llmの大切なデータである。
オープンソースの医療カルテ設計のテストデータでもある。後者ではデータ中心設計の事例与件である。

医療系設計者以外は読み飛ばしてください。

長期入院する予定で入院日記を書く。　IT業界、自動車業界で生き残る視点を洗い出す。医療システムの提案を書ければ付録として記載。

# 記録　
iPhone, MacBookAir(M2)

「想定外」3.11 東日本大震災をIT技術者が振り返る

https://qiita.com/kaizen_nagoya/items/80433f4bf7fe116bddd1

TIER IV Computing System Workshop 2023 参加する前に

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

# 医療　

体温、血圧。酸素濃度測定　

朝食　

飲み薬（プレドニゾロン錠5mg * 6, ランソプラゾールOD錠15mg, エルデかルシトールカプセル0.75μg), 持参薬　荒室配合状B P錠 DSEP, ビソプロロールフマル酸塩錠5mgトーワ, オメガ-3脂肪酸エチル粒錠カプセル2g)
塗り薬(スピラゾン軟膏0.3%, pロトビック軟膏0.1%, ジフルブレードナート軟膏0.05%)

歯磨き（歯間ブラシ、歯磨きチューブ・歯ブラシ、歯うがい）　

往診。

お茶汲み　

体温、血圧。酸素濃度測定　

骨密度測定

昼食。

薬。　（プレドニゾロン5mg * 4),


歯磨き（歯間ブラシ、歯磨きチューブ・歯ブラシ、歯うがい）　

往診。
　
作業リハビリ、座っての動作は肩、胸に負荷が大きく、明日からは寝てやることを検討。

足腰リハビリ。１種目は足踏み機械（６分）。２種目は寝てボールで捻り。３番目は寝てボールで腰浮かし。

体温、血圧。酸素濃度測定　

夕食　

薬（プレドニゾロン5mg * 2)

歯磨き（歯間ブラシ、歯磨きチューブ・歯ブラシ、歯うがい）　

# 相談、課題　



https://qiita.com/kaizen_nagoya/items/4de2c9b382ef666cfdcd

https://qiita.com/kaizen_nagoya/items/28d69e80531c481c7062

TIER IV Computing System Workshop 2023　参加記録

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

# 参考資料

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

## 日程表
|日|治療項目|作業項目|
|:--|:--|:--|
|1| 説明(5)、測定（外３、中4)|iPhone|
|2| 説明(3), 測定(外4, 中8)|iPhone, Android Pad|
|3|　説明(1), 測定(中4) |iPhone, Android Pad, MacBookAir|
|4| 説明(1), 測定(中4) |iAM, シャワー|
|5|説明(1), 測定(中4),リハビリ1|iAM,DVD|
|6|説明(1), 測定(中3),リハビリ3|iAMD, シャワー|
|7|説明(20, 測定(中3),リハビリ2|iAMD|
|8|説明(2), 測定(中3,外1), リハビリ2|iAMD|


## 日記履歴（週報＋日記）


入院週報一回目

https://qiita.com/kaizen_nagoya/items/95bd6f3d9471779b4654


# 文書履歴(document history)
ver. 0.01 初稿 20230318

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

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

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

Please press the like icon 💚　and follow me for your happy life.
大腸内視鏡：入院日記九日目

この資料は医療llmの大切なデータである。
オープンソースの医療カルテ設計のテストデータでもある。後者ではデータ中心設計の事例与件である。

医療系設計者以外は読み飛ばしてください。

長期入院する予定で入院日記を書く。　IT業界、自動車業界で生き残る視点を洗い出す。医療システムの提案を書ければ付録として記載。

# 記録　
iPhone, MacBookAir(M2)

「想定外」3.11 東日本大震災をIT技術者が振り返る

https://qiita.com/kaizen_nagoya/items/80433f4bf7fe116bddd1

TIER IV Computing System Workshop 2023 参加する前に

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

# 医療　

体温、血圧。酸素濃度測定　

大腸内視鏡検査予定で食事なし。生理食塩水と薬の点滴のみ。ブドウ糖点滴ではない。

塗り薬(スピラゾン軟膏0.3%, pロトビック軟膏0.1%, ジフルブレードナート軟膏0.05%)

歯磨き（歯間ブラシ、歯磨きチューブ・歯ブラシ、歯うがい）　

往診。

体温、血圧。酸素濃度測定　


往診。症状に対応した薬（食後）を出していただけるとのこと。

大腸内視鏡
　
体温、血圧。酸素濃度測定　

夕食　

歯磨き（歯間ブラシ、歯磨きチューブ・歯ブラシ、歯うがい）　

薬（ファンギゾンシロップ）　

# 相談、課題　

薬（ファンギゾンシロップ）　「塗布後できるだけ長く含んだ後に嚥下ささえること」との指示があった。看護師の方に「できるだけ長く」って時間で書いてもらわないとわからないって聞いたら、「５分から１０分」って教えてもらえた。１５分くらい後に、トイレに行った時に、唾吐いたらオレンジ色で、嚥下するの忘れてた。指示は明確にしないと駄目との教訓が増えたん。



https://qiita.com/kaizen_nagoya/items/4de2c9b382ef666cfdcd

https://qiita.com/kaizen_nagoya/items/28d69e80531c481c7062

TIER IV Computing System Workshop 2023　参加記録

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

# 参考資料

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

## 日程表
|日|治療項目|作業項目|
|:--|:--|:--|
|1| 説明(5)、測定（外３、中4)|iPhone|
|2| 説明(3), 測定(外4, 中8)|iPhone, Android Pad|
|3|　説明(1), 測定(中4) |iPhone, Android Pad, MacBookAir|
|4| 説明(1), 測定(中4) |iAM, シャワー|
|5|説明(1), 測定(中4),リハビリ1|iAM,DVD|
|6|説明(1), 測定(中3),リハビリ3|iAMD, シャワー|
|7|説明(20, 測定(中3),リハビリ2|iAMD|
|8|説明(2), 測定(中3,外1), リハビリ2|iAMD|
|9|説明(10), 測定(中3)|1AMD|



## 日記履歴（週報＋日記）


入院週報一回目

https://qiita.com/kaizen_nagoya/items/95bd6f3d9471779b4654


# 文書履歴(document history)
ver. 0.01 初稿 20230317

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

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

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

Please press the like icon 💚　and follow me for your happy life.
0からはじめるPython ~パターン認識とは~

# はじめに


こんにちは、現在0からPythonを学んでいる初心者エンジニアです。
この投稿は私が学んだことのアウトプットの場として、そして私と同じ初心者エンジニアさんの少しでも役に立てればと思い、投稿しています。私自身も全くの初心者なので、感想やアドバイスあれば、気軽にコメント頂けると幸いです。

# パターン認識とは
今回はパターン認識に関する説明を書きたいと思います。
今回はあくまでもパターン認識とは何かを簡単に説明し、具体的なコードはまた次回以降の記事で書きたいと思います。

パターンとは、物理的外界に存在する対象が、他の対象と区別されるための物理量や概念データのまとまりをいい、パターン認識とは、画像、音声などのデータの分類、判別、識別を行う方法です。
パターン認識には様々な方法論がありますが、今回は<font color="red">**クラス分類**</font>と<font color="red">**クラスタリング**</font>に関して説明したいと思います。

# パターン認識方法
クラス分類やクラスタリングの方法を例題を交えて紹介します。


**例題**
今、ボールの分類を考える。手元に球形のボール{サッカーボール、野球ボール、バスケットボール、テニスボール、バレーボール}と、球形ではないボール{ラグビーボール}が混在して多数あるとする。これらを何かしらの手段で、球形かどうか、また、球形であるならば何ボールか自動的に分類したい。このため次のものを用意する。

* 特徴抽出機：センサを用いて物理量を測り特徴量を抽出する。
* 特徴ベクトル：効果認識のために複数の特徴量をベクトル形式で表したもの。
* クラス：似たような特徴を持つデータの集合、つまり、特徴空間上で近くにあるデータのグループを表す。今回の場合、６種類の球形のボールと球形ではないボールの7つのクラスがある。
* クラス分類機：特徴ベクトルを用いて、どのクラスに属するかのパターン認識を行い、その結果をクラスとして出力する。

特徴ベクトルは、例えば次のように表されるものとする。
特徴ベクトル=[直径、重さ、真円度、反発係数]

このような例題を解く場合に、あらかじめクラスと特徴ベクトルを照合して、クラス分類機を作成し、新たな未知のボールを入力した時、これがどのクラスであるかを出力します。これが<font color="red">**クラス分類**</font>であり、パターン認識の一種です。この考え方は、事前にクラスを分かった上で照合できることから、<font color="red">**教師あり学習**</font>と呼ばれています。

クラス分類とは異なり、クラスが未知である場合、特徴ベクトルの似たもの同士のかたまり（クラスタという）をいくつか作成し、区別するという考え方を<font color="red">**クラスタリング**</font>といいます。これもパターン認識の一種であり、ここにはクラス分類のようにクラスは事前に与えられていないので、<font color="red">**教師なし学習**</font>と呼ばれています。

なお、クラス分類、クラスタリングを含めて、パターン認識器の構築において構成するパラメータを求めるのに用いるデータを<font color="red">**トレーニングデータ**</font>、作成したものが正しく機能するか否かを試験するために用いられるデータを<font color="red">**テストデータ**</font>といいます。本来ならば、テストデータは新たに得られノノが望ましいですが、しかし、実際にはデータ数が少ないことが多いため、このデータをトレーニングデータとテストデータに分割して用いることがあります。この分割の方法として、<font color="red">**ホールドアウト**</font>と<font color="red">**交差検証**</font>があげられます。

<font color="red">**ホールドアウト**</font>：データセットをトレーニングデータとテストデータにランダムに分割する方法。通常は、トレーニングデータの割合が70〜80％で、テストデータの割合が20〜30％になる。簡易ではあるが、分離した片方のデータに偏りがあると、クラス分類器の性能を保証できないという欠点がある。

<font color="red">**交差検証**</font>：データセットをk個に分割し、そのうちの(k-1)個をトレーニングデータ、残り１個をテストデータに割り当てる。この割り当てを、順繰りにk回繰り返し、計算結果の評価を行う方法。

上記のようにデータを扱うことがパターン認識ではよく行われます。
今回は最後に具体的にどのような方法を用いてパターン認識を行うのか紹介して、記事を締めたいと思います。

# パターン認識方法の紹介
具体的なパターン認識の方法を数個紹介します。
#### クラス分類
* <font color="red">**サポートベクタマシン（SVM)**</font>：与えられた入力データを2つまたはそれ以上のクラスに分類するために使用される方法。非線形にも対応する。
* <font color="red">**kNN**</font>：入力データに最も近いk個のトレーニングデータのクラスを参照し、多数決によって入力データを分類する方法。ただし、ノンパラメトリックのため、数式でクラス分類できない。
#### クラスタリング
* <font color="red">**非階層型**</font>：データセット全体を1つのクラスターに分割し、分割の良さの評価関数に基づき分類を探索する方法。代表的な方法にk-meanがある。
* <font color="red">**階層型**</font>：データセットを類似度の高いものから順にまとめ、階層的なクラスターに分割する方法。凝集型と分割型の2つの方法があり、凝集型クラスタリングでは、最初に各データポイントを1つのクラスターと見なし、近いクラスターをマージする。分割型クラスタリングでは、最初にすべてのデータポイントを1つのクラスターとして見なし、近いクラスターを分割する。

# まとめ
以上が、パターン認識の簡単な説明になります。最初にも書きましたが具体的なコードはまた次回以降とさせて頂きます。
最後まで読んで頂きありがとうございました。引き続き私と一緒に研鑽していきましょう。

# 参考
橋本洋志,牧野浩二."データサイエンス教本 Pythonで学ぶ統計分析・パターン認識・深層学習・信号処理・時系列データ分析".オーム社,2018
Oracle Databaseのインストール(OUIキャプチャ)

OUIの画面遷移は以下の感じでした。
①構成オプションの選択
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289694/654b8929-4327-c2bf-5775-97bacc97090e.jpeg)

![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289694/7ab946ab-f5d5-5933-6efe-2b197076afe4.jpeg)

②データベース・インストール・オプションの選択
![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289694/fdc1e017-2c1c-b481-191f-1392589fd067.jpeg)
![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289694/9e728670-feb2-53d3-8623-9d0de3c6392d.jpeg)

④データベース・エディションの選択
![WS000005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289694/8161ecca-14d0-50f6-23cf-2fd6197e02e9.jpeg)
![WS000006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289694/60a22f19-3249-2b61-214d-b178eb72d4b4.jpeg)

⑤インストール場所の指定
![WS000007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289694/fd531115-39b1-7912-4d5e-205af3b47a87.jpeg)
![WS000008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289694/5b95db1e-9993-57d6-3700-8d563852912d.jpeg)

⑥インベントリの作成
![WS000009.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289694/627b4110-03e3-3d7d-5078-37516e41eebe.jpeg)
![WS000010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289694/572428b9-0e5b-a16c-c231-1cec42bc8085.jpeg)

⑦権限のあるオペレーティング・システム・グループ
![WS000011.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289694/50fc5548-677f-bff4-3f3a-3b4e612ae389.jpeg)
![WS000012.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289694/47f08e6e-99fe-5d13-8bc6-3220dce78253.jpeg)

⑧rootスクリプトの実行構成
![WS000013.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289694/65f02e78-b8f4-b3fc-dec0-c51fac346c12.jpeg)
![WS000014.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289694/2b05f5c7-992c-fbba-e20a-7a647fafe341.jpeg)

⑨サマリー
![WS000015.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289694/41a1dbc7-a846-15a5-556a-0f3658300a58.jpeg)
![WS000016.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289694/8dc6bc45-81e0-d195-90cd-1aa9242a2911.jpeg)
Speedtestコマンドを用いた速度監視スクリプト

# 速度監視スクリプト

サーバーとインターネット環境の速度監視を行うスクリプトになります。
速度監視はspeedtestコマンドを使用します。

https://www.speedtest.net/ja/apps/cli


## スクリプトの概要

* speedtestコマンドの結果から速度を取得する
* 閾値を下回った場合、計測した速度をメール本文に載せて送信する
    * メール送信は、sendmailコマンドを使用します
    * sendmailコマンドの設定は調べてください
* 定期監視する場合は、cronで定期実行すれば良いです
    * ただし、頻繁に速度監視しないほうがよいです。(他の利用者の迷惑になるので)

## スクリプトの内容

```bash
#!/bin/sh

srtFrom="From: aaa@xxx.xxx" # 送信元のメールアドレスを設定
srtTo="To: bbb@yyy.yyy" # 送信先のメールアドレスを設定

DOWNLOAD_TH=150 # ダウンロードの閾値(これを下回る場合はメールを送信)
UPLOAD_TH=150 # アップロードの閾値(これを下回る場合はメールを送信)

result=`speedtest --simple --secure`
downloadSpeed=`echo $result | sed -e 's/^.*Download: \(.*\) Mbit\/s Upload: \(.*\) Mbit\/s/\1/g'`
uploadSpeed=`echo $result | sed -e 's/^.*Download: \(.*\) Mbit\/s Upload: \(.*\) Mbit\/s/\2/g'`

flagNG=0

result1=`echo "$downloadSpeed > $DOWNLOAD_TH" | bc`
if [ $result1 -eq 1 ]; then
  #echo "DownloadSpeed, OK!"
  :
else
  #echo "False DownloadSpeed, NG!"
  flagNG=1
fi

result2=`echo "$uploadSpeed > $UPLOAD_TH" | bc`
if [ $result2 -eq 1 ]; then
  #echo "UploadSpeed, OK!"
  :
else
  #echo "False UploadSpeed, NG!"
  flagNG=1
fi

echo $downloadSpeed > /opt/my/chkSpeed/downloadSpeed.txt
echo $uploadSpeed > /opt/my/chkSpeed/uploadSpeed.txt

if [ $flagNG -eq 1 ]; then
    filename=$(date '+%F')chkSpeed_errors_text_ksofda.txt # 適当な一時ファイル名を指定

    srtSubject="Subject: Communication speed with the Internet is slowing down"
    srtText="$(date),DownloadSpeed: $downloadSpeed Mbit/s,UploadSpeed: $uploadSpeed Mbit/s"
    touch /tmp/$filename
    echo $srtFrom >> /tmp/$filename
    echo $srtTo >> /tmp/$filename
    echo $srtSubject >> /tmp/$filename
    echo >> /tmp/$filename

    IFS_BACKUP=$IFS
    IFS='
'
    i=0
    for L in $srtText
    do
        i=`expr $i + 1 `
        echo $L >> /tmp/$filename
    done
    IFS=$IFS_BACKUP

    /usr/sbin/sendmail -t < /tmp/$filename
    rm /tmp/$filename
fi

```
ZFSの異常検知時にメール送信するスクリプト

# ZFSの異常検知

今回、紹介するスクリプトは以下のような機能を持っています。

## スクリプトの概要

* zpool statusコマンドの結果から異状を判断する
* 異常検知した場合、コマンドの出力結果をメール本文に乗せて送信する
    * メール送信は、sendmailコマンドを使用します
    * sendmailコマンドの設定は調べてください
* 定期監視する場合は、cronで定期実行すれば良いです

## スクリプトの内容

```bash
#!/bin/bash

if [ "`env LC_ALL=C zpool status -x`" != 'all pools are healthy' ]
then
    filename=$(date '+%F')zfs_errors_text_ksofda.txt # 適当な一時ファイル名を指定

    srtFrom="From: aaa@xxx.xxx" # 送信元のメールアドレスを設定
    srtTo="To: bbb@yyy.yyy" # 送信先のメールアドレスを設定
    srtSubject="Subject: Error ZFS is not healthy!!"
    srtText=`env LC_ALL=C zpool status`
    touch /tmp/$filename
    echo $srtFrom >> /tmp/$filename
    echo $srtTo >> /tmp/$filename
    echo $srtSubject >> /tmp/$filename
    echo >> /tmp/$filename

    IFS_BACKUP=$IFS
    IFS='
'
    i=0
    for L in $srtText
    do
        i=`expr $i + 1 `
        echo -e $L >> /tmp/$filename
    done
    IFS=$IFS_BACKUP

    /usr/sbin/sendmail -t < /tmp/$filename
    rm /tmp/$filename
fi

```
綺麗なコードってなんだろう…

# はじめに
この記事は完全にポエムです。
無知、願望、羨望といったものを煮詰めたような記事になることかと思います。
そもそも、他人にコードを見てもらう事がほぼないので綺麗というのも完全に偏見。

# 導入
自力でコーディングするようになってから恐らく15年くらい経ちますが、その大半を独学の上に他者との繋がりなく書いてきたものですから、しばしば（本当にこんな書き方で良いのかなあ）と思っている日々です。
ほぼプログラミング始めたての頃、院生の時代は先生もいましたので「こう書くべし」と言われましたが、思い返すと「べからず集」的なアプローチが多く、実際、今調べてもそういう記事が多いような気がしています。
誰もが聞いた事あると思いますが、『分かりやすい変数名を使う』『同じ処理は使いまわす』『適切なスコープで変数を利用する』『関数の深さ・長さに気を付ける』みたいな。
『べからず』と言うには肯定文が多い？ 肯定的に書いているだけで言い換えれば『分かりにくい変数名を使うな』『何度も同じ処理を書くな』『無駄に変数の生存期間を延ばすな』ですからね。

# 問題点
こういう指摘は確かに重要な示唆だと思っているのですが、如何せん「そりゃそう書けるならそうしたいよ。」で止まってしまう指摘なんですよね。
ケースバイケースで変わる状況に対してピタリ絶対に当てはまる抽象的なアドバイスでしかなく、実践的な考え方の足掛かりになるよりも、手を止めてしまう要因になっている気がします。
実際、この手のアドバイスをもらいながら(書く総量が少ない事もあって)10年弱はほとんどこれを実践できないままだったような気がします。

さて。
今でも上手く書けていると胸を張れるわけではないですが、とはいえ昔書いたコードに比べたら絶対に今の方が読んだり修正したりしやすい作りをしているな、と思っているのです。

# どうすべきか
何はともあれ、定量的に評価しやすい項目から優先して実践してみるのが良いのかなと感じています。
さっきの例で言えば、完全に逆順で実践するべきです。
『関数の深さ・長さに気を付ける』 > 『適切なスコープで変数を利用する』 > 『同じ処理は使いまわす』 > 『分かりやすい変数名を使う』
関数が長いまま適切な名前について悩むだけ時間の無駄だと気づきました。
でも、綺麗なコードについて調べると名前関係の話が先に出てくること多い気がします。
長い関数の中で美しい名前を付ける事が困難であるという本質情報はあまり注目されていないのでしょうか？

# 関数を短くしていくと
関数を短くする事自体は、無理くりにでもブツ切りにすれば実現できますね。ただ、無理くりでは再利用性が果てしなく悪い関数になってしまいます。
その辺に至ると、スコープの範囲や使いまわしやすい粒度というのを考えられる段階になっていた気がします。

関数を短くする流儀は重要だと思いながらも、色々な流儀がありそうだなという恐れ多さと、自身の流儀が正当かの自信もないので深追いはしないでおきます。

# 結局
名前を気楽に変えられないのは名前を思いつくセンスがないんじゃなく、まともに名前を付けられる環境にねーんだなって。
眠いから終わり。
GitHub で複数のアカウントを使いわける


リポジトリごとに違うアカウントを使いたいのですが `git push` ができなくて困っていました。
探した記事がどれも難しかったので自分用にまとめます、、、

※SSH接続でアカウントを使えている (= SSHキーを作成して GitHub への登録ができている) 人を対象にします。

## SSH接続に使う鍵を用意する

複数アカウントを使うのでアカウントの数だけSSH鍵を作ります。

```sh
$ ssh-keygen -t ed25519 -C "メールアドレス"
```

```sh
$ ls ~/.ssh

id_ed25519_1  id_ed25519_1.pub # アカウント1 の 秘密鍵と公開鍵
id_ed25519_2  id_ed25519_2.pub # アカウント2 の 秘密鍵と公開鍵
id_ed25519_3  id_ed25519_3.pub # アカウント3 の 秘密鍵と公開鍵
```

## SSH鍵を GitHub に登録する

GitHub のページで以下を開きます。※2023/03/18 の表記です

`アカウントの Setting > SSH and GPG keys > SSH keys > New SSH Key`

ひとつのアカウントにつき公開鍵をひとつ設定します。一度どこかのアカウントで使った公開鍵は他のアカウントで使えないので注意してください。

## .ssh フォルダに config ファイルをつくる

```sh
$ touch ~/.ssh/config
```

config ファイルの内容は以下です。
「ホスト１」と「id_ed25519_1」は自分用に変えてください。他の値はこのままです。

```config
Host ホスト１
 hostname github.com
 identityfile ~/.ssh/id_ed25519_1
 user git
 IdentitiesOnly yes # なくても動くけどあったほうがいい
 Compression yes # なくても動くけどあったほうがいい

Host ホスト２
 hostname github.com
 identityfile ~/.ssh/id_ed25519_2
 user git
 IdentitiesOnly yes
 Compression yes

Host ホスト３
 hostname github.com
 identityfile ~/.ssh/id_ed25519_3
 user git
 IdentitiesOnly yes
 Compression yes
```

ちゃんと認証されるか確認します。うまく設定できていれば、GitHub に `Hi {アカウント名}!` って言われます。
```sh
$ ssh ホスト１

PTY allocation request failed on channel 0
Hi アカウント１! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.
```

## gitconfig に接続先の設定をいれる

やっとですね。これをやると `git push` ができるようになります。

まずアカウントを使い分けたいリポジトリのルートに移動します。
ここで言うルートというのは、初めてリポジトリを作ったときに README.md が作られるところです。

`ls -a` をすると `.git` という隠しファイルが見つかります。

```sh
$ ls -a
. .. .git 
```

`.git` 以下にある `.git/config` を編集します。

```sh
$ code .git/config # vscode で編集する場合
```

`[remote "origin"]` というセクションがあるので書き換えます。セクションがなければ新しく作ります。
```diff
[remote "origin"]
-    url = git@github.com:アカウント１/リポジトリ名.git
+    url = ホスト１:アカウント１/リポジトリ名.git
    fetch = +refs/heads/*:refs/remotes/origin/*
```

保存して、動くか試します。

```sh
$ git branch test-multiple-account
$ git push origin test-multiple-account
$ git push origin :test-multiple-account # リモートのブランチを削除
$ git branch -D test-multiple-account # ローカルのブランチを削除
```

エラーが出なければ成功です。

----

参考になった記事です

https://qiita.com/suthio/items/2760e4cff0e185fe2db9

https://www.kadinche.com/github-%E6%8E%A5%E7%B6%9A%E6%99%82%E3%81%AE-ssh-config-%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9/
S3・CloudFrontで余計なものを使わないIP制限

<p>AWSに静的なwebサイトをホストする場合、S3 + Cloudfrontで構成されることが多いと思います。<br>
また現在トレンドのサーバレスにおいて、フロントを担う部分にS3 + Cloudfrontを用いて
Reactアプリケーションをホストするといったことも多くあります。</p>
その際テスト環境やステージング環境は、特定のIPアドレスからのアクセスを制限したいといった要望があると思います。</p>
<p>そこで今回は他のサービスは使用しないで簡単にIP制限を実現できる方法を紹介しようと思います。</p>
<p>IP制限は実現したいけどそこまで手間はかけたくない・他のサービスを使うのは面倒だから手軽に実装したい
方向けの記事になります。</p>

## 1.S3のバケットポリシーによるIP制限(S3のみの場合)
こちらは、バケットポリシーの`Condition`エレメントにIPを登録する方法です。
`NotIpAddress`を指定することで記述したIPアドレスからの通信を制限します。
逆に`IpAddress`を指定することで、そのIPからのみ通信を受け付けます。
```
{
    "Version": "2008-10-17",
    "Id": "SampleId",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket-name/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "xxx.xxx.xxx.xxx/xx"
                }
            }
        }
    ]
}
```
## 2.Cloudfront FunctionsによるIP制限(Cloud Frontを使用する場合)
<p>こちらはCloudfront FunctionsにJavaScriptによる処理を記述し、エッジロケーションで実行されるIP制限になります。</p>
<p>注意点として、エッジロケーションで実行されるため、実行の最大許容時間がシビアになります。<br>
許容時間に近づくと関数がスロットリングされることもあるため、注意が必要です。<br>
より重い処理を実行する場合は、Lambda@Edgeの使用をおすすめします。<br>

[こちら](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/edge-functions.html) がCloudFront FunctionsとLambda@Edgeの比較になります。
<p>下記は他サイトを参考にさせていただき、Basic認証も一緒に組み込んだものになります。</p>


```
var IP_WHITE_LIST = [
    'xxx.xxx.xxx.xxx'
 ];
 
var authString = "Basic xxxxxxxxxx";

function handler(event) {
    var request = event.request;
    var clientIP = event.viewer.ip;
    var headers = request.headers;

    var isPermittedIp = IP_WHITE_LIST.includes(clientIP);
    if (
        typeof headers.authorization === "undefined" ||
        headers.authorization.value !== authString
      ) {
        return {
          statusCode: 401,
          statusDescription: "Unauthorized",
          headers: { "www-authenticate": { value: "Basic" } },
        };
      }
    if (isPermittedIp) {
        return request;
    } else {
        var response = {
            statusCode: 403,
            statusDescription: 'Forbidden',
        }
        return response;
    }
}
```
## まとめ
<p>今回は他サービスを導入せずIP制限を実装しましたが、CloudFront Functionsのようにエッジロケーションで簡単な処理を実行できてしまうのは、ユーザーへのレスポンスも低レイテンシで返すことができ、オリジンへ処理が集中してしまうことも少ないという点でとても魅力的です。</p>
<p>今後IOTの普及が後押しになり、エッジコンピューティングの分野がより充実していくことに期待したいですね。</p>

## 参考記事
https://dev.classmethod.jp/articles/cloudfront-functions-ip-control/