OmniAICreator/Qiita-1.07M huggingface dataset:
Obsidianの構成例（使用開始後約半年）

## この記事を書くことにした背景

2020年12月より`Obsidian`を使い始めた。
思いのほか続いているし、想像以上に使用頻度が高い。

半年〜一年弱である現時点で、どのように使っているのか。
`Obsidian`は「個人用ナレッジデータベース」であるので、いきなり完成形になることはなく、時を追うに連れて変化していくもの（とおもわれる）。

育成過程の実例が役に立つこともあるのではないかとおもってご紹介。


## 環境

ここで書いていることは、下記のバージョンで実施しました。

- Obsidian v0.12.10
- macOS BigSur 11.5.1
- MacBook Pro (13-inch, 2020, Four Thunderbolt 3 Ports)


## 全体概観

基本的には、こういう画面で使っている。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/560deccc-5699-f173-43fb-f9711ebc9d14.png" width=80%>

- １画面（スペース）をObsidianで利用
- 左ペインで編集、右ペインはプレビュー
- 左サイドバーは開いているが、右サイドバーは閉じている

## フォルダ構成

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/eb654893-053a-e115-6531-412d14053be0.png" width=50%>

### 使っているもの

- `10_DA`
    - ファイル217個
    - `デイリーノート`フォルダとしてスタートしたが、実際にはここにすべて放り込んである
    - サブフォルダはつくっていない。
- `30_Projects`
    - サブフォルダ5つ
    - マニュアルや提案書作成など、本体（時系列）、使用画像、アウトプット（PDF）の途中バージョンなど、いろいろまとめておきたい場合に利用
- `40_pastnotes`
    - ファイル5個
    - 過去のメモを放り込んである。
    - メモツール放浪の歴史がここに……
        - workflowy, emacs + org, vim + qfixhowm 
        - 紙copi時代も含めたいねえとおもいつつ、まだやっていない
- `90_templaters`
    - ファイル2個
    - 実際に使っているのは[マンスリーノートのテンプレート](#マンスリーノートのテンプレート)のみ

### 使っていないもの

- `00_2020` `01_2021`
    - ファイル0個
    - 年ごとにフォルダをわけると便利かとおもったが、そうでもなかった
    - VS Codeのエクスプローラで、ファイルの並び順を変えられたので、困らなくなった
    - 使っていないが、まだフォルダは削除していない
- `80_files`
    - ファイル0個
    - Obsidianにファイルをドラッグドロップすると、ここに添付ファイルとして入る
    - つかっていないが、フォルダを作成はしてある（[添付ではなくリンクにしている](#添付ファイルではなくリンクにしている)ため）

## おもに何につかっているか

かなり「なんでも`Obsidian`」になりつつあるが、代表的なものを……。

- ログ
    - タスクログ、調査記録、ゲームの攻略メモ
    - ログを少し発展させた、簡便なリンク集（ブックマークがわり）
- 業務寄り
    - 作業標準の作成と改訂
    - 提案書作成（w/t Marp）
    - マニュアル作成（PDF化）
- 記事作成・投稿関係
    - テンプレート（スターをつけてある）
    - はてブロやQiitaに投稿したMarkdownのコピペ

## 付録

### マンスリーノートのテンプレート

`command + T`で
- 未作成ならばテンプレートからファイルを作成
- 作成済みならばマンスリーノートを開く

テンプレート：

```markdown
# {{date:YYYY-MM}}00

---

[[210407_Monthly_Note_MOC]]
```

### 添付ファイルではなくリンクにしている

- 基本的な考えかたは、「すべてをリンクにしてしまいたい」
- マニュアルに明記されていない（と思う）が、`[boo](file:///foo)`形式でローカルファイルへのリンクを作成できる

ご参考　⇒　[Obsidianで作業記録を取ると、ウェブリンクもローカルへのリンクもまとめて扱えてとても便利だとおもっているのですが、どうでしょう](https://qiita.com/hann-solo/items/49e442896b78b279dab2)

- `Automator`をつかって、リンクを生成してもらっている

ご参考　⇒　[作業ログ｜Obsidianで便利なローカルファイルへのリンクを、Automatorに作成してもらうと楽ちんだなあ](https://qiita.com/hann-solo/items/5537e54704db48696f80)

## リソース

[Obsidian｜使いかたの記録（目次）](https://qiita.com/hann-solo/items/ac8fa75394813e8adcf4)
[Rails]パンくずリストの実装方法

# はじめに
パンくずリストを一ページごとに挿入するのは面倒で管理がしにくいです。webサービスに関しても遷移が多くなるので、パンくずリストを実装していないと希望のページに飛びにくくなってUI的に下がります。そこで、パンくずリストを簡単に導入できるGemを紹介します。是非つかっていただけたら記事を書いた甲斐があって嬉しいです。

# 紹介するGem

## gretel
パンくずリストのためにつくられたGemで、スター数は少ないものの簡易的にパンくずリストを実装できます。
多少使いにくい部分も出てきましたので改善の余地があります。最新アップデートが一か月前なので、まだ期待はできるかなと。（自分でプルリク出すのはニッチすぎる部分なので控えます😅）

https://github.com/kzkn/gretel

# 使い方

## 1.Gemをインストール

```ruby:Gemfile
gem "gretel"
```
```
bundle install
```
## 2.Configファイルを作成
```
rails generate gretel:install
```
上記のコマンドを実行すると、```config/breadcrumbs.rb```が作成されます。このConfigファイルでパンくずリストのバックエンド部分を設定します。

## 3.Configファイルを編集
```config/breadcrumbs.rb
# rootの設定
crumb :root do
  link "Home", root_path
end

# 投稿一覧の設定
crumb :posts do
  link "投稿一覧", posts_path
end

# 投稿詳細の設定
crumb :post do |post|
  link post.title, post
  parent :posts # 投稿詳細の親元を投稿一覧に設定する
end
```
### コードの説明
```link```: パンくずリストの実際に表示されるリンクの名前とpathを設定しています。投稿詳細の部分は、投稿のタイトルを表示しています。

```crumb :example``` : くずを作成。exampleには変数名をつけています。view側で呼び出すときに、わかりやすい名前にしましょう。（基本的には、path名から取ってきます）

```parent```: 親元のくず名を指定します。

## 4. Viewファイルに出力
```ruby:layout/applcation.rb
<%= breadcrumbs pretext: "You are here: ", separator: " &rsaquo; " %>
<%= yield %>
```
まず、表示する場所に挿入します。一定の場所に表示したいので例では```layout/application.rb```の```<%= yield %>```上に設置しています。

```pretext``` : 現在位置のくずに追加でテキストを指定できます。
```separator```: 例えば、[Home > Posts > Post]の">"の部分を変数として決めれます。

```ruby:views/posts/index.html.erb
<% breadcrumb :posts %>
```
最後に作成した「くず」を呼び出してあげます。
これで完成です。

# まとめ
デメリットとしてはページごとに「くず」を呼び出さなければいけない部分であり、Configファイルでpathと連携することができれば各ページに挿入しなくて済むかなと思います。
AWS Nitro Enclaves とは

## 勉強前イメージ

ニトロの飛び地・・・・？
文字からは想像できない

## 調査

### AWS Nitro Enclaves とは

個人識別情報や、ヘルスケア、財務のデータなど
機密性の高いデータをより安全に処理できるように
信頼性の高い分離された堅牢なデータ処理環境を提供するEC2の機能で
分離されたコンピューティング環境を作成して安全に簡単にしました。
メモリとCPUの分離を行った仮想マシンを利用し、
永続なストレージを持たず管理者もアクセス出来ず、外部ネットワークとは接続出来ません。
割り当てるCPUとメモリの量を指定でき、要件に合わせてリソースを割り当てることが出来ます。

### AWS Nitro Enclavesのメリット

- 追加的分離とセキュリティ

Enclavesは分離された仮想マシンで
永続的なストレージを持たず、アクセスも出来ません。
ローカル接続のみ可能です。
分離されることで攻撃対象の領域を狭めることが出来ます。

- 暗号化証明

許可されたコードのみが実行できるようになっており
証明はエンクレーブで実行されていることを確認出来ます。

- リソースの柔軟な割当

現在のEC2と同様に処理ができるよう、
エンクレーブにはCPU・メモリの組み合わせが多様です。

### AWS Nitro Enclaves 設定の画面

EC2の作成時にAWS Nitro Enclavesを設定するかを選べます。
ただし、要件として以下3つがあります。

- Nitroベースのインスタンスであること
- インスタンスのvCPUが4以上であること
- Linux OSであること

画面としては、以下のインスタンス詳細設定 > 高度な詳細 から
Enclave にチェックを入れることで可能です。

![12021-07-30インスタンスウィザードを起動 _ EC2 Management Console - Google C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/7ec12f76-40ab-5791-aba3-282b34748203.png)

## 勉強後イメージ

あまり小さすぎるインスタンスでは使用できないのね。
localからの接続しか出来ないから安全で、
機密性の高いデータを管理・処理するための環境。

## 参考

- [AWS Nitro Enclaves](https://aws.amazon.com/jp/ec2/nitro/nitro-enclaves/)
- [EC2で稼働するアプリケーションにさらなる環境分離を提供！！Nitro Enclavesを試してみた](https://dev.classmethod.jp/articles/nitro-enclaves-getting-started/)
【JS】ディスクリプタを最低限の理解まで持っていく

# はじめに
まず、ディスクリプタって聞いたことありますか？？
自分は初めて聞く単語で今も戸惑っています。。w
用語の理解と実際の使い方などを最低限のレベルまで持って行けたら良いなと思います！

# ディスクリプタとは
オブジェクトプロパティには、キーバリューストア(key-value)のイメージがあると思いますが、もっと柔軟で強力なものです。ディスクリプタとは、プロパティを細かく制御することが可能で、その制御モードを指示するオブジェクトのことです。
`Object.defineProperty(オブジェクト, "属性", { ディスクリプタ }`のように設定できる。

```js
// オブジェクトを生成
let obj = {}

// 生成したオブジェクトにnameプロパティを設定する
Object.defineProperty(obj, "name", {
  value: 'tanaka', // 実際に持つ値      
  writable: false // 値の変更可能性
  enumerable: false, // 列挙可能性
  configurable: false, // 設定変更可能性
}

// 以下のようにすることで全てtrueで設定されます
let user = { name: "tanaka" };
```

## ゲッターとセッター
値を取得するときや、変更するときの処理をカスタマイズしたい時は、ゲッター(getter)とセッター(setter)を設定します。

```js
class Person {
  constructor(name, age) {
    this._name = name;
    this._age = age;
  }

  // name属性のgetterを設定
  get name() {
    return this._name;
  }

  // name属性のsetterを設定
  set name(val) {
    this._name = val;
  }
}
```

### 使い所は？
- 値の取得や更新の際に、任意の処理を実行したいとき
    - 更新したと同時に他の値も同時に更新したいときなど

## 静的メソッドの設定
クラス内で使用する静的メソッドを使用する際には、`static`を使用します。これは、インスタンス化せずに使用する事が出来ます。
※thisは使用できません

```js
class Person {
  constructor(name, age) {
    this._name = name;
    this._age = age;
  }
.
.
.
  // 静的メソッドhelloを定義
  static hello() {
    console.log('hello')
  }
}

Person.hello() // => 'hello'
```

# 終わりに
少しだけでもお力添えできたら幸いです。。

# 参考
[JavaScriptのディスクリプタを使い、堅牢なオブジェクトやObservableなオブジェクトを作る]
(https://qiita.com/vsanna/items/a65c4aa0de4e829b46be)

[JavaScriptのGetter Setterを理解する(入門者向け)]
(https://reffect.co.jp/html/javascript-getter-setter)

[プロパティフラグとディスクリプタ]
(https://ja.javascript.info/property-descriptors)
技術ブログアンチパターン - 「The Top Mistakes Technical Writers Make」

[The Top Mistakes Technical Writers Make](https://hashnode.com/post/the-top-6-mistakes-technical-writers-make-ckosmhkka00d8des1e8do8jwm) の記事の読書記録です。テクニカルライターと言いますがマニュアルや、仕様書などと言うよりは、いわゆる技術ブログに向けたポイントに見受けられます。

## 記事の要点

以下を意識して記事を改善しよう、というお話。
逆に表現するとライターが陥りやすいアンチパターンは、以下だという。

- **!! 記事の構成がない**
    - 記事をセクションに分ける。見出しをつけ、複数のパラグラフに分割する。
- **!! コードに画像を使ってしまう**
    - コードはスニペットやGist等を使用する。
- **!! 記事の長さ・短さを気にしてしまう**
    - 長過ぎるか、短すぎるか、字数にこだわる必要はない。まとめたいテーマと、問題解決に焦点を当てる。価値提供に集中する。
- **!! アプリケーションの紹介にデモがない**
    - コードは、読む人がそれを使用できるようにする。
- **!! 一文が長い**
    - 記事の流れを良くするために、長い文を複数の文に分割する。
- **!! 人に読まれるための対策をしていない**
    - 画像には代替テキストをつけるなど、人に記事が読まれるための対策をする。

それぞれのポイントについて見てみます。


### アンチパターン: 記事の構成がない

- 記事にセクションや見出し、あるいはパラグラフさえない。
- ただ、延々と続くだけでは、読むのが大変で疲れる。
- **解決策**
    - 記事をセクションに分ける。
    - 見出しを使ってセクションを区別する。
    - 長いパラグラフを複数のパラグラフに分割する。


### アンチパターン: コードに画像を使ってしまう

- スクリーンショットの方がきれいに見えるからと、コードスニペットのスクリーンショットを使ってしまう。
- 読者はコードを試してみたいと思うはずだが、コピーできない。フラストレーションが溜まる。
- **解決策**
    - 記事にはGist等を使うようにする。
    - 頑にスクリーンショットを使いたい場合は、altテキストを追加する。


### アンチパターン: 記事の長さを気にしてしまう

- ライティングを始めた頃、すべてのブログ記事を2000ワードにしようとしていた。ネット上で「長い記事の方が良い」と言われていたからだ。しかし、文字数を増やすためだけに記事を長くする必要はない。
- 500語で技術的な記事を書けるのであればそれが良い。言葉のノルマを達成するのではなく、新しい概念を説いたり、問題を解決したり、コンセプトを教えたりすることに集中しよう。
- 一方長い記事を書いてはいけないというわけではない。重要なのは、短い記事の中で問題を解決したり、コンセプトを教えたりできるのであれば、記事を長くするためにフワッとした要素を加える必要はないということ。
- **解決策**
    - 記事の長さは気にしない。価値を提供することに集中する。


### アンチパターン: アプリケーションの紹介にデモがない

- アプリケーションの作り方を教える技術記事の多くで、デモを含んでいない。もしあなたがアプリケーションを作るためのチュートリアルを書くなら、Gitリポジトリを添付するとよい。人々がコードにアクセスできるようにしましょう。
- **解決策**
    - アプリケーションの動作を見ることができるデモを添付するのも良い。
    - しかしいずれにしても、アプリケーションのコードを添付することをお勧めする。


### アンチパターン: 一文が長い

- 長い技術論文。あなたはそのような文書に従うだろうか？
- **解決策**
    - 長い文は複数の文に分割し、1つの文章に1つのアイデアを残すようにする。2段落を占めるような文章は書かない。読んでいて混乱する。
    - 短く、要点だけを伝える。


### アンチパターン: 人に読まれるための対策をしていない

- 多くの記事中の画像に、代替テキストがない。なぜそれが重要なのかと疑問に思うかもしれない。
- 目の不自由な方のことを考えると良い。目の不自由な方は、画像の内容を理解するために代替テキストを頼りにする。
- 代替テキストはSEOにも欠かせません。人々がオンラインで何かを検索するとき、あなたの画像は関連性があれば検索結果に表示される。記事に画像を使用する際の3つのトップアドバイスは以下。
    - 説明的な名前を使う。my_image.png 等の画像ではなく、それに応じた名前をつける。例えば、VS Codeのエディタが写っている画像であれば、visual-studio-code-editor-screenshot.pngのようにする。
    - 代替テキストを使用して、画像が何を示しているかを説明する。VSCodeエディタを例にとると、This-is-an-image-of-my-VSCode-editor.png 等。
- **解決策**
    - 基本的なSEOのヒントを読んでみるのも良い。より包括的に改善することができる。



## まとめ

いわゆるテクニカルライティングという話ではないが「読み手を意識しよう」は間違いなく大事だと言えそう。

https://dev.to/adriantwarog/programmers-that-don-t-blog-should-start-right-now-295c

https://dev.to/inhuofficial/10-tips-for-clean-dev-articles-59id


以上参考になればさいわいです。
2021/07/31開催 Connpassイベントランキング

# 申込数TOP5

|順位|イベント名|グループ|申込数|定員|
|:---:|:---|:---|:---:|:---:|
|:one:|[AWSの基礎を学ぼう 特別編　最新サービスをみんなで触ってみる](https://awsbasics.connpass.com/event/216052/)|[AWS エバンジェリストシリーズ　AWSの基礎を学ぼう](https://awsbasics.connpass.com/)|359||
|:two:|[第七回　全日本コンピュータビジョン勉強会(後編)](https://kantocv.connpass.com/event/216703/)|[コンピュータビジョン勉強会＠関東](https://kantocv.connpass.com/)|308|310|
|:three:|[Power Apps オンライン勉強会 ～コンポーネント祭り～](https://powerapps.connpass.com/event/217180/)|[Japan Power Apps User Group](https://powerapps.connpass.com/)|234|285|
|:four:|[第57回 Machine Learning 15minutes! Broadcast](https://machine-learning15minutes.connpass.com/event/217459/)|[Machine Learning 15minutes!](https://machine-learning15minutes.connpass.com/)|122|200|
|:five:|[Laboratory Automation月例勉強会 / 2021.07](https://laboratoryautomation.connpass.com/event/214504/)|[Laboratory Automation](https://laboratoryautomation.connpass.com/)|114|114|
日記 Visual Studio 2019 C++でSetTimerで定期実行する処理の書き方

## 日記

[前回の日記「日記 Visual Studio 2019 C++でフォアグラウンドのexeのフルパスとウインドウタイトルの取得」](https://qiita.com/Yamine1San/items/c841995efa184a6b924e)

## 概要

SetTimerで開始してKillTimerで終了する

### プログラム

```Sample.cpp
// タイマーを識別するためのTimerID
#define TIMER_ID 1

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        // ウィンドウ生成時
        case WM_CREATE:
        {
            // 第３引数はミリ秒 0.5秒毎に実行
            // 第４引数をNULLにする事で第１引数のhWndのメッセージ処理(このメソッドWndProc)が実行される
            SetTimer(hWnd, TIMER_ID, 500, NULL);
        }
        break;

        // 0.5秒毎に呼ばれる、wParamにはTimerIDが入っている
        case WM_TIMER:
        {
            int wmId = LOWORD(wParam);
            switch (wmId)
            {
                case TIMER_ID:
                {
                    // TODO ここに0.5秒枚に実行される処理を書く

                }
                break;
            }
        }
        break;

        // なんらかのメッセージの時にタイマーを停止する
        case XXXXXX:
        {
            KillTimer(hWnd, TIMER_ID);
        }
        break;
    }
    return 0;
}
```
日記 Visual Studio 2019 C++でフォアグラウンドのexeのフルパスとウインドウタイトルの取得

## 日記

[前回の日記「日記 Visual Studio 2019 C++でタスクトレイに常駐するアプリケーションを作成」](https://qiita.com/Yamine1San/items/47607193d17d0555a9d5)
[次の日記「日記 Visual Studio 2019 C++でSetTimerで定期実行する処理の書き方」](https://qiita.com/Yamine1San/items/997b8b9acaf7ecf67d8a)

## プログラム

やれやれだぜ

### GetModuleFileNameExを使用するためのinclude追加

```Sample.cpp
// GetModuleFileNameExを使用するため
#include <Psapi.h>
````

### フォアグラウンドのexeのフルパスとウインドウタイトルの取得

```Sample.cpp
// フォアグラウンドのウインドウのハンドルを取得
HWND hActWin = GetForegroundWindow();
if (hActWin)
{
    // ウインドウのハンドルからプロセスID取得
    DWORD dwPID;
    GetWindowThreadProcessId(hActWin, &dwPID);

    // プロセスのハンドルを取得
    HANDLE hProcess = OpenProcess(
        PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
        FALSE,
        dwPID
    );

    if (hProcess)
    {
        //// .exe名 非推奨
        //// 32bit64bitが一致していないと取得できない
        //TCHAR exeName[MAX_PATH];
        //if (GetModuleBaseName(hProcess, 0, exeName, MAX_PATH))
        //{
        //}

        // .exeのフルパス
        TCHAR exePath[MAX_PATH];
        if (GetModuleFileNameEx(hProcess, 0, exePath, MAX_PATH))
        {
            TextOut(hdc, 10, 30, exePath, lstrlen(exePath));
        }
        else
        {
            DebugLastError(__FILE__, __LINE__);
        }

        CloseHandle(hProcess);
    }

    // ウインドウテキスト
    int iActWinTextLength = GetWindowTextLength(hActWin);
    if (iActWinTextLength)
    {
        LPTSTR lActWinText = new TCHAR[iActWinTextLength + 1];
        GetWindowText(hActWin, lActWinText, iActWinTextLength + 1);
        TextOut(hdc, 10, 70, lActWinText, lstrlen(lActWinText));
    }
}
```

### WindowsAPIエラー出力 

```Sample.cpp
// WindowsAPIエラー出力
VOID DebugLastError(const char *file, int line)
{
    DWORD errorCode = GetLastError();
    LPVOID lpMsgBuf;
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER   // テキストのメモリ割り当てを要求する
        | FORMAT_MESSAGE_FROM_SYSTEM     // エラーメッセージはWindowsが用意しているものを使用
        | FORMAT_MESSAGE_IGNORE_INSERTS, // 次の引数を無視してエラーコードに対するエラーメッセージを作成する
        NULL, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),// 言語を指定
        (LPTSTR)&lpMsgBuf,               // メッセージテキストが保存されるバッファへのポインタ
        0,
        NULL
    );

    char cbuffer[300];
    sprintf_s(cbuffer, sizeof(cbuffer), "%s:(%d)", file, line);
    OutputDebugStringA(cbuffer);
    OutputDebugStringA("\n");

    wchar_t wbuffer[300];
    wchar_t* plpMsgBuf = (wchar_t*)lpMsgBuf;
    wsprintf(wbuffer, L"%ld: %ls", errorCode, plpMsgBuf);
    OutputDebugString((LPCWSTR)wbuffer);

    LocalFree(lpMsgBuf);
}
```
部分テンプレートで初歩的なエラー

# ActionView::MissingTemplate　エラーが起きました！
ポートフォリオが完成してきたので、可読性の向上、見た目を整えようと思ってheaderを部分テンプレートにしようと思い、取り組もうとコードを書き始めましたが・・・・。
![エラー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1719458/37caaac1-5c2e-9175-5b5f-4c393971e917.jpeg)

# 結論
フォルダの階層を間違えておりました！
お手本にしているのでは、sharedファイルは、viewファイルの階層にあったのですが、deviseを使っていた為、deviseファイルの階層(１階層下）に潜り込んでいたが故に怒ったエラーだったんですね。

# 反省点
エラーが出てググってみるも、同じエラーでも原因の種類もたくさんありました。
とりあえず今回は数分で気づくことができたので、自分の中ではよしとしましょう・・・。
世界のコロナ感染者数の現状を伝えて、「まだ海外視察に行けそうにないからウェビナーに参加しよう」と思わせるBotを作ってみた

#自己紹介～わたしの仕事～
旅行会社で勤務しているこもりです。
コロナで色んな業界が大変な中、旅行業界も大打撃を受けています。

ワクチン接種により年内には海外に行けるようになるかな…と期待していたのですが
変異株の流行により世界ではまた感染者数が増加しています。

当社は小売流通企業のグループ会社なので海外の小売流通事情を視察するツアーを多数実施してきましたが
現地に行くことがなかなかできなくなった今、海外在住の講師が最新情報を教えてくれるウェビナーを開催しています。

##課題解決のために作ったBot
この海外小売流通事情ウェビナーの一番の課題は集客力をどうアップしていくかです。

現在の主な告知方法は
・メルマガ会員への配信
・DM発送
・営業担当による顧客への紹介　です。

告知手段を増やしていくことが必要なのでLINE Botによる告知を考えてみました。

ただ、単なる告知Botではなかなか気を引くことは難しいな…と思い、
世界各国の現在の感染者数を教えてくれるBotがあれば
「まだまだ海外視察には行けそうにないな…」と改めて分かり
ウェビナーに興味を示してくれる人が増えるのではないかと思いました。

###プログラミング超初心者がNode-REDとAPIを使って作成
このLINE Botは、国名を入力するとその国の現在の感染者数を教えてくれるというシンプルなものです。
プログラミング超初心者の私がNode-REDとAPIを使って作成してみました。

今回使用したAPI：https://api.quarantine.country/api/v1/summary/latest

まず、習ったようにノードを組んでAPIを入れてみましたが、エラーが出てLINEは何も反応しませんでした。
![Node-RED _ nodered-komori.herokuapp.com - Google Chrome 2021_08_02 1_11_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811853/dc417551-75d2-ca4a-8338-93550c6e0941.png)

ここでアドバイスを頂き、デバッグでAPIの中身を確認し、
国名を入れるとその国の情報が抜き出せるようにfunctionノードに書くコードを教えていただきました。
![Node-RED _ nodered-komori.herokuapp.com - Google Chrome 2021_08_02 1_17_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811853/d5379688-d412-b551-041b-4ee423ea9d62.png)
▼各国の重症者数（とサモアの重症者数）を抜き出すコード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811853/dbb2876f-e4b3-a411-b603-d48be6e444c7.png)
するとLINEが作動するようになりました。
![usasamoa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811853/62e0be34-872d-03a9-7ec6-ef4e8c47eacc.jpeg)

ここで、各国の現在の感染者数を知りたかったのと、数字の後に人を付けたかったのでコードを少し書き換えてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811853/44b0500d-789a-6666-03d7-f8a16c28cd02.png)
![usa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811853/27d12b74-6afc-8e1e-81e9-edd8cd008fe0.jpeg)
できた！

次にウェビナーのお知らせが届くようにtemplateノードとBloadcastMessageノードを追加しました。
delayノードはBloadcastのメッセージが先に届いてしまうことを防ぐためにあった方が良いといううこさんのアドバイスで付けました。
![Node-RED _ nodered-komori.herokuapp.com - Google Chrome 2021_08_02 1_49_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811853/0f2e365c-f187-14ed-7f09-9c2cd8351e9c.png)

完成品がこちら。
![ooo (2)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811853/28b3655b-dbbd-0670-7b2d-0beb3d005552.jpeg)


なんとか最低の形にはできたかなと思います。

####本当はもっとこうしたかった
●国名を入力してもらう前にこのBotの説明が届くようにしたい
　→swichノードを使ってあれこれやってみたがうまくいきませんでした。
　→LINE Official Account Managerで応答メッセージの設定もしてみたがなぜか届きませんでした。
●入力された国に関連した情報が飛ぶようにしたい
●入力数の多い国を集計して今後のツアー企画立案の際に目的地の参考にしたい
などなど…

#####おまけ
Node-REDではありませんが、LINE Official Account Managerでリッチメニューを作成しました。
![リッチメニュー (2)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811853/2003968a-5dd5-e9d0-5d73-425d24611511.jpeg)

ウェビナー情報、小売流通のニュース、お問い合わせの項目を作って当社のHPの各ページに飛べるようになっています。

▼お気に入りのフリーイラスト素材サイト

https://storyset.com/
シェルスクリプトの「if」で「なにもしないをする」をやりたい場合

シェルスクリプトの `if` では条件が真の場合になにも処理を書いていない場合、エラーとなります。

```
if [ 条件式 ] ; then
    #なにもしない（あとで実装予定）
else
    if [ 条件式 ] ; then
        exit 0
    else
        exit 1
    fi
fi

echo 'successful'
```

なので、↑このスクリプトを実行するとエラーになります。

```
$ bash if_sample.sh 
if_sample.sh: line 3: syntax error near unexpected token `else'
if_sample.sh: line 3: `else'
```

開発途中で真の場合の実装を後回しにする場合にこれだと都合が悪いので、シェルスクリプトの `if` で条件式が真のときに「なにもせず後続の処理を続けたい」という場合、どのように書けばよいのかわからなかったんですが、答えは `man builtins` にありました。

```
: [arguments]
        No effect; the command does nothing beyond expanding arguments and performing
        any specified redirections.  The return status is zero.
```

`:` がまさに「なにもしないをする」コマンドのようです。なので、先ほどの `if` をこのように書き換えてみました。

```
$ cat if_sample.sh 
if [ 条件式 ] ; then
    #なにもしない（あとで実装予定）
    :
else
    if [ 条件式 ] ; then
        exit 0
    else
        exit 1
    fi
fi

echo 'successful'
```

実行してみると今度はうまくいきました。

```
$ bash if_sample.sh 
successful
```

### 参考URL
- [何もしない組み込みコマンド ":" （コロン）の使い道](https://qiita.com/xtetsuji/items/381dc17241bda548045d)
SAMLとOpenIDConnect使い分け


## 認証と認可の違い
- 認証
    - Facebookにユーザーパスワードを入力してログインする
- 認可
    - Facebookでつぶやく
    - つぶやくのはログインされたユーザーに許可されている操作

## プロトコル
### Oauth2
- HTTPSで認可をするためのプロトコル
- Twitter,FacebookなどのWebサービスで利用されている
- プロバイダーは期限付きのトークンを発行し、そのトークンを検証することで認証するかをチェック

### Open ID Connect
- OIDC

### SAML
- 認証、認可をするプロトコル
- SAMLベースのSSO
- アプリケーションとAzureADとで、フェデレーション信頼を構成する
    - フェデレーション信頼
        - 異なるシステム間や異なる組織でID連携を行う
        - トークンでやり取りされる
- AzureADの対応するユーザーをアプリケーション側にも作成する
    - ユーザープロビジョニング
    - SaaSアプリなどでは、自動ユーザープロビジョニング機能があったりする

## SAMLとOauth2との大きな違い
- SAMLはアクセス許可をしてきたユーザーがなりすましでないことを確認する
    - ユーザープロビジョニングにて展開されたユーザーと一致するかを検証する
- Oauth2はアクセス許可するのみ
    - ユーザー自体のチェックは行わない
IBM Cloud Pak for Data as a Service ハンズオン資料 目次 2021年8月作成/2022年12月更新

|IBM Cloud Pak for Data as a Service ハンズオン|
|:------------------------------------------------------------------------|
|この一連のシリーズでは IBM Cloud Pak for Data as a Service の使い方についてご紹介しています。「1.構築編」からハンズオン形式でお試しいただくことが可能です。<br><br>(この一連の記事では無償版で利用できる範囲でご紹介しています。有償版はご契約いただくエディションにより利用できる範囲が異なります。詳しくはサービス・カタログ内の「料金プラン」をご覧ください。)<br><br><strong>この機会にぜひIBM Cloud Pak for Data as a Serviceをお試しください。</strong>|


# 前提事項
- IBMidを取得済みの状態で実施して下さい。
- IBMidの詳細については、[こちら](https://cloud.ibm.com/docs/account?topic=account-account-getting-started&locale=ja)を参考にしてみて下さい。


#公式ドキュメント
- IBM Cloud Pak for Data as a Service の公式ドキュメントは[こちら](https://dataplatform.cloud.ibm.com/docs/content/wsj/getting-started/welcome-main.html?context=wdp&audience=wdp)をご参照下さい。


# Cloud Pak for Data as a Serviceハンズオンメニュー一覧
- [0.目次（当記事）](https://qiita.com/Shumpei_Kubo/items/993e0fabfaebf56fe547)
- [1.構築編](https://qiita.com/Shumpei_Kubo/items/c228b70bd33a8fce9c8f)
- [2.設定編](https://qiita.com/Shumpei_Kubo/items/6793b6759c761301b687)
- [3.分析編](https://qiita.com/Shumpei_Kubo/items/78274f839205e703a8a6)
- [3.分析編-A ダッシュボードで新型コロナの新規陽性者変遷を見る](https://qiita.com/Shumpei_Kubo/items/76144e3bf1898b7a48de)
- [4.ETL編](https://qiita.com/Shumpei_Kubo/items/aad5aa18731224d3dfcb)
- [5.データ仮想化編](https://qiita.com/Shumpei_Kubo/items/a8e2418b171d60793cc6)
- [a.Db2へのデータロード編](https://qiita.com/Shumpei_Kubo/items/c9b51fbbe1b470e9c4ad)
- [99.動画編](https://qiita.com/Shumpei_Kubo/items/8dc1e55f62ddee859c30)
【第9章】Railsチュートリアルでbcryptとfixtureについて忘れていたので復習した

[Railsチュートリアル第9章(第6版)](https://railstutorial.jp/chapters/advanced_login?version=6.0#cha-advanced_login)でbcryptとfixtureを忘れていたので、復習した。

#①bcrypt(ビー・クリプト)とは
・```6.3.1 ハッシュ化されたパスワード``` にて登場
・パスワードをハッシュ化する為の、最先端のハッシュ関数。
・ハッシュ化すると元のデータを特定するのは、非常に難しい(ほぼ無理)。
・bcryptアルゴリズムではハッシュ化する前にソルト化されたハッシュを追加している。
 これにより、辞書攻撃やレインボーテーブル攻撃を防ぐことができる。

#②fixture(フィクスチャ)とは
・言葉自体は```2.2 Usersリソース``` から登場している。
・本格的に扱ったのは ```8.2.4 レイアウトの変更をテストする```
・テスト時に使用。
・データベースに追加するテスト用データをfixtureで作成できる。
・fixtureではERb(埋め込みRuby)を利用できる。

 -fixtureの例-
  
```yaml
---test/fixtures/users.yml---
abblepai:
  name: Abblepai Example
  email: applepai@example.com
```
以下のように参照できる。

```rb
user = users(:abblepai)
```

　```users```=fixutreのファイル名、```:abblepai```というシンボルはユーザーを参照するためのキー。

#③まとめ
①~②で忘れていた箇所を思い出せた。
シェルスクリプトの「if」は条件式の「コマンド」の実行結果を判定している

シェルスクリプトで条件式を書く場合、一般的なプログラミング言語と同じように `if` と記述することで判定処理を行うことができます。

例えば、ホームディレクトリ配下に「 `.profile` 」が存在するかをチェックする場合はこんな感じです。

```
if [ -e $HOME/.profile ] ; then
    echo ".profile is exists"
fi
```

つい最近まで「シェルスクリプトの `if` は `test` コマンドの実行結果を判定している」という意味がよくわかっていませんでした。

`if` に記述している条件式はこのようにコマンドラインで直接実行できるということを知り、ようやく理解できました。
`if` というのは条件式に記述している `test` コマンドを実行した際の終了ステータスを判定しているんですね。

```
$ [ -e $HOME/.profile ]
$ echo $?
0
```

`[ ]` は 　`test` コマンドのエイリアスなので、↑の `if` の条件式は `test` コマンドでこのように書き換えることができます。

```
if test -e $HOME/.profile ; then
    echo ".profile is exists"
fi
```

当然、コマンドラインでもこのように実行することができます。

```
$ test -e $HOME/.profile
$ echo $?
0
```

`man test` を見てみると、「使い方」としてこのような記述があるので、 `test` と `[ ]` は同義であることがわかります。

```
SYNOPSIS
       test EXPRESSION
       test
       [ EXPRESSION ]
       [ ]
       [ OPTION
```

もう一点、最近知ったことがあって、 `if` は `test` コマンドでしか判定できないわけではなくて、条件式の部分に `test` 以外のコマンドを記述することも可能だということです。
つまり、このように `ls` や `grep` といったコマンドを書くことができます。

```
if ls $HOME/.profile 1>/dev/null 2>&1 ; then
    echo ".profile is exists"
fi

if grep -q 'BASH_VERSION' $HOME/.profile ; then
    echo "BASH_VERSION found"
fi
```

結論としては、こんな感じですかね。

- シェルスクリプトの `if` は条件式のコマンドを実行した際の終了ステータスを判定している。
- シェルスクリプトの `if` は一般的に `test` コマンドで判定を行うが、 `test` 以外のコマンドを利用することも可能。

### おまけ

`man builtins` を見ると、 `SYNOPSIS` に `test` 、 `[` が記載されているので、それぞれBashのビルトインコマンドだということがわかりますが、

```
SYNOPSIS
       bash  defines  the  following  built-in  commands:  :, ., [, alias, bg, bind, break,
       builtin, case, cd, command, compgen,  complete,  continue,  declare,  dirs,  disown,
       echo,  enable,  eval,  exec, exit, export, fc, fg, getopts, hash, help, history, if,
       jobs, kill, let, local, logout, popd, printf, pushd, pwd,  read,  readonly,  return,
       set, shift, shopt, source, suspend, test, times, trap, type, typeset, ulimit, umask,
       unalias, unset, until, wait, while.
```

`which` で見てみると、それぞれ単体のコマンドとしても存在していることがわかります。 `/usr/bin/[` ってなんだよって感じですね。

```
$ which test
/usr/bin/test

$ which [
/usr/bin/[
```

### 参考URL

- [Man page of TEST](https://linuxjm.osdn.jp/html/GNU_sh-utils/man1/test.1.html)
- [if 文と test コマンド](https://shellscript.sunone.me/if_and_test.html)
- [シェルスクリプト(bash)のif文とtestコマンド(\[\])自分メモ](https://qiita.com/toshihirock/items/461da0f60f975f6acb10)
- [Bash の if 文（test文）のオプションを整理してみた](https://qiita.com/wakayama-y/items/a9b7380263da77e51711)
- [\[Bash\] testと\[と\[\[](https://qiita.com/Riliumph/items/f07272fa9b0834032a9d)
- [【 if 】コマンド――条件が成立したときコマンドを実行する](https://www.atmarkit.co.jp/ait/articles/1807/13/news027.html)
Rails マイグレーション

##マイグレーション
マイグレーション・・データベースの設計図
#####作成した・編集したマイグレーションファイルを読み込み、データベースに反映
----
```ターミナル
$ rails db:migrate
```
---
```rb
def change
create_table :posts do |t|//postsテーブルの作成
t.text :content//データがtextであるcontentという名前のカラムを作成している
end
```
```rb
def change
add_column :users, :image_name,:string
          //テーブル名　　　　カラム名　　　　　　　　　　　　データ型
end
```
【Reactやるなら知っておきたい】関数コンポーネントとクラスコンポーネントの違い

#はじめに
僕自身、現在React勉強中なのですが、
クラスコンポーネントと関数コンポーネントの二種類あることを理解していなかったため、
備忘録として残しておきます。
なにから勉強したらいいかわからない人はサラッと読んでみてください！

#Reactとは
facebook社が開発したJSのライブラリ
用途としてはUIのコンポーネントを作成するのに使われる


#【本題】関数コンポーネントとクラスコンポーネントの違い
###前提
#####★現在は主に関数コンポーネントを使用する
〈理由〉
以前は下記の機能がクラスコンポーネントでしか使用出来なかった
　■State(状態管理)
　■Lifecycle Hooks　
　- Lifecycle とは、Mounting、Updating、Unmountingの一連の流れの事
・Mounting(マウント):コンポーネントをレンダーする
・Updating(更新):コンポーネントのStateを更新する
・Unmounting(アンマウント):コンポーネントのレンダーが切れる
#####▶現在はHooks(React 16.8 で追加された新機能)により、どちらも使えるようになった。


##違いについて
#####【関数コンポーネント】
シンプルで、状態（state）を持たない。
渡された値に従って特定の固定要素を描画するだけ。
要はただの「関数」である。

#####【クラスコンポーネント】
classを用いてコンポーネントを定義する。
クラスコンポーネントは状態（state）を持つことができ、内容を柔軟に変化させることが可能
また、Reactに関するメソッドをクラスに実装することで、より便利な制御が可能となる。

##関数コンポーネント使うメリットなくない？？？？？
#####★そこで考案されたのがHooksである。
状態管理などが関数コンポーネントでも出来るようになった！
よってクラスコンポーネントと同等の機能を実現可能になった。
#####最低限、【useState】　【useEffect】　【useContext】　は習得しよう！

例えばuseStateというフックは関数コンポーネントに状態を持たせることができる。
（※HooksはすべてuseXXXという命名規則）

```react:例
// お約束。フックを使うならそのフックを必ずimportする
import React, { useState } from 'react'

// set〇〇とキャメルケースで書こう(ちなみにset〇〇は関数です)
// useState(0)の(0)は初期値です
const App = () => {
  const [count, setCount] = useState(0)

// {count}には、stateで保存されているcountの値が表示されます
// {count}の値が変わるたびにレンダリングされます
// setCountを使わないと、countの値を変更することはできません
// また、setCountの引数に関数を渡すこともできます

  return (
    <>
      <p>現在、{count} 回押しました</p>
　　　　　　　　　　　　// このボタンがクリックされると、countの値が+1されて、{count}の表示が変わります
      <button onClick={() => setCount(count + 1)}>
        押すとイチ増えるよ
      </button>
    </>
  )
}

export default App
```


###同等の機能ならどっちでもよくない？？？？?
####★関数コンポーネントの方が、、、
#####1. thisやbindを多用しなくて良い
#####2. コードが短くシンプル
#####3. ロジックを共通化出来る



##最後に
今からReactを勉強するなら迷わず関数コンポーネントを使用して勉強しよう。
さらに、Hooksはカスタムフックといってロジックを再利用出来るようになっているのです。
下記のようなカスタムフックを提供するライブラリも出ているので調べてみては。
・react-use
・react-table
・Formik

#####引き続き、React関連の記事を書いていきますので宜しくお願いいたします。
REALFORCE キーボード掃除した

# 背景
最近キーボードの汚れが気になっており、エアーダスターしてみたり、表面をアルコールで拭いたりしていたが、以下の記事を見てちょっと自分もやってみたくなった。

https://bokulabo.com/keyboard-cleaning/

2019年1月に買ってから2年以上ちゃんと掃除してこなかったし、一念発起しやってみることに。
ちなみに画像も載せるがグロいのでご注意を。

# 準備したもの
* [matsukiyo 消毒用エタノールＩＰ「ケンエー」 ５００ＭＬ](https://www.matsukiyo.co.jp/store/online/p/4987286313986)
* [FILCO キートップ引抜工具 FILCOKeyPuller プロ仕様 ブラック FKP01](https://www.amazon.co.jp/gp/product/B0047MQJ4I/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1)
* 洗面器 + 台所用洗剤

# TL;DR

**Before**
パット見わからないかもしれないが、拡大してみるとキーの間に色々ホコリなどが溜まっているのが見える・・・
![IMG_8211.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487359/53fd5a0a-da06-13ba-9dd8-2215aa9e9ccc.jpeg)

**After**
角度の問題やフラッシュの問題で分かりづらいがある程度はきれいになった感じ。
![IMG_8215.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487359/a9f36551-9b15-827c-dbb3-68f3525ab16f.jpeg)


# やったこと
基本的に該当の記事に従って実施した。

## 写真を取っておく
後で原状復帰する際に必要になりそうなので、写真を取っておく。

## キートップを全部引っこ抜く
キートップ引き抜き工具を使って一個ずつ地道に抜いていく。抜いたやつは洗面器に入れて洗剤入れて混ぜて放置

<details>
<summary>【グロ注意】キートップを引き抜いた後の画像</summary>
ホコリ&髪の毛だらけ・・・
![IMG_8212.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487359/93397190-0f38-4612-348f-46b3c7ca5ff9.jpeg)
拡大図
![IMG_8213.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487359/142605d5-55b4-0594-e9ae-9106c81f115e.jpeg)
</details>

## キーボード本体側の掃除
上記の通り、ホコリと髪の毛がすごすぎたので一度家の外までキーボードを持っていき、広いところでエアダスターで一通りゴミを払い落とした。
(なお、元記事には「キーボード本体からカバーを外す」という項があったが、私が持っている機種だとはできそうになかった。というよりこんな汚いものを裏返しにして机を汚したくなかった)

その後、地肌部分を綿棒 + エタノールで掃除をしていく。
思ったより頑固で全然落ちないので、綿棒の根本を持って結構強めにゴシゴシした。合計10本くらい使ったかな。

結果は以下の通り。白いのが何なのかはよくわからないがこれは落ちなかった
![IMG_8214.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487359/aa1641ad-6d69-17a7-4560-d5e3c9e33437.jpeg)

## キートップの戻し
元記事にあったようにキートップをタオルの上においてしばらく放置したが全然水が飛ばなかったでの、やむなく1つずつエアダスターで水を飛ばしてティッシュで拭くという苦行を実施。
作業前に写真を取っておいたのは正解だった。(特に左右のAltキーが地味に違うとかは写真とってなかったらわからなかった)

# 終わりに
合計1h以上はかかったと思う。でも結構きれいになったので年1くらいはやっていきたい。
[Ruby] pryで、矢印キーを押すと`^[[A`などと出てしまう現象の解決法

# 環境
- macOS 10.13.6
- Ruby 2.5.7
- Rails 6.1.3.1
- Docker 20.10.7
- Docker Compose v2.0.0-beta.6

# 現象
`pry`で矢印キーを押すと、次のような記号が現れてしまうようになってしまう。
例えば、矢印キーの↑を押すと、下記のような`^[[A`という文字が表示されてしまいます。
![スクリーンショット 2021-08-01 23.22.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481105/753ef085-b069-0907-5a85-ecaaf1c1c2bf.png)
その他、矢印キーの→を押すと`^[[C`、矢印キーの←を押すと`^[[B`が表示されます。
# 原因
最近私はDockerのバージョンを`20.10.7`にUpgradeしたのだが、それに伴ってDocker Composeのバージョンがbeta版になってしまっていた。
つまりDocker　Compose V2がデフォルトで有効になっていた。
これが、今回起きた矢印キーのバグの原因だった。
# 対処法
Docker　Compose V2を無効にすると解決します。
docker docsに記載の通り、下記のように無効にします。

- DockerDesktopを使用してDockerCompose V2を無効にするには：
  - ①　Dockerメニューから、[Preferences]> [experimental features]をクリックします。
  - ②　[Use Docker Compose V2]チェックボックスをオフにします。
- CLIを使用してDockerCompose V2を無効にするには、次のコマンドを実行します。
  - `$ docker-compose disable-v2`

# 参考記事
https://docs.docker.com/compose/cli-command/
Kernel型量子SVMのFeature map の良し悪しを考える

# Feature map

量子カーネルを用いたSVMを考えます。
https://qiita.com/notori48/items/a54a5219ffd1ed6666df

上記の記事では、カーネル（を決める量子ゲート）としては深く考えずに決め打ちでやっています。
Angle embedding (=RXゲート) を用いています。

```python
def kernel(x1, x2):
    """The quantum kernel."""
    AngleEmbedding(x1, wires=range(n_qubits)) #S(x)
    qml.adjoint(AngleEmbedding)(x2, wires=range(n_qubits)) #S^{\dagger}(x')
    return qml.expval(qml.Hermitian(projector, wires=range(n_qubits)))
```

これは、
$|\phi(\vec{x}) \rangle = (RX(x_{1}) \otimes RX(x_{2})|00 \rangle$に対して
$K(\vec{x},\vec{y})= |\langle \phi(\vec{x}) | \phi(\vec{y}) \rangle |^{2}$　としてカーネル$K(\vec{x},\vec{y})$を決めたことに相当します。
埋め込みのパターンは　Feature map 　と呼ばれます。

果たして、このカーネルの決め方(Feature map)が最適なのでしょうか？
もちろんそうとは限りません。
カーネルがどんな定義のときに、SVMがどんな分類能力を持つかということを考えたいです。
それが以下の論文にあります。

https://arxiv.org/abs/1906.10467

これをみていきます。

# 論文のキーアイデア

キーアイデアは、量子ゲートは古典データをブロッホ球上に写像しており、SVMはそのブロッホ球上の分離平面を決めているとみなせるということです。以下でみていきます。

# カーネルが何で決まるか

古典データ$\vec{x}$を、ある量子ゲート$U$で$|\Phi(\vec{x}) \rangle = U|0..0 \rangle$ と埋め込んだとします。
このとき、$|\Phi(\vec{x}) \rangle$に対する密度行列表示を$\rho(\vec{x})$とすると、カーネル$K$は 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/ae1410a6-cb7b-a1f4-f489-b235ded9dbdc.png)

このように表されます。
カーネル$K$は、内積を取る対象の2つのベクトルの密度行列表示で決まります。
つまるところ、カーネルの表現力とは、古典データ$\vec{x}$を与えた時に、$\rho(\vec{x})$がどうなるかで決まっています。
そこで、$\rho$を調べればよいということになります。

# 密度行列の実数表示

密度行列$\rho$はその名の通り行列です。$n$量子ビットに対しては、状態ベクトルでは$N = 2^{n}$次元ですが、密度行列は$2^{n} \times 2^{n}$次元のエルミート行列となります。
エルミート行列は、一般に、パウリ行列の積を基底として展開できます。
このときの展開係数は $N^{2}-1$ 個の実数になることが知られています。
2量子ビットですと、15個の実数となります。
これを15次元ベクトル1つとみなしたものを、ブロッホベクトルといいます。
ブロッホベクトル全体のなす空間を、ブロッホ球といいます。
球といっていますが、15次元上の部分空間です。

なお、よく見かけるZZ feature map の場合は、古典データからブロッホベクトルへの写像は以下のようになるそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/e95130f2-10cf-7e27-70f4-44d1380c3871.png)


# ブロッホ球上の分離平面

カーネルはブロッホベクトル同士の関係性から決まっているということですから、
古典SVMのアナロジーから、量子SVMはブロッホ球上で分離平面を求めていると考えられます。
論文では、ブロッホベクトルを$\vec{a}$として、図解されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/b4a40813-1f9a-0180-292f-b3c497c5ad2f.png)


ここまでくると、もはや機械学習せず数値的に分離平面を求めることができます。（計算量はおいといて）
実際、そのように数値的に求めた分離平面から予測される性能と、機械学習させた場合の性能は、よく相関しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/f8535941-8433-2d99-3d9b-c1a79d3fcc57.png)

# 良いカーネルの決め方とは

で、結局、よいカーネルの決め方とはなんでしょうか。
答えはないのですが、少なくともブロッホベクトルの一部の次元にしかデータを埋め込まないようなゲート構成はダメでしょう。
例えば、量子ゲート間にCNOTをひとつもいれないゲートの場合、一部にしかデータを埋め込めません。ので、性能が悪いことは予想できます。

論文では、少し進んで、アンサンブル学習が提案されています。
つまり異なった構成の量子回路（＝カーネル）を用意して、それらのカーネル関数の和を１つのカーネル関数とみなして使用することで、
表現力を向上させます。
カーネルの欠点同士を補うような合成が起こることが期待される・・・ということです。

# まとめ

カーネル型のQSVMについて、論文を勉強した。
Realmからデータを取得してUISegmentedControlに表示

# こんな感じです
<img width="150" alt="ED4F4636-0DF1-4CDA-B3AA-2D1ED1F18E90_1_201_a.jpeg"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/16d69f95-3eae-5955-95e2-adf588aa0a88.jpeg">


# コードと簡単解説

* `let realm = try Realm()`でRealm()のインスタンスを作成します

* for文で`realm.objects(RealmDataSets.self)`で取得したRealmの値をreadRealmTagに入れます。

* `realmTagArray.allSatisfy`でreadRealmTagの値がrealmTagArrayの全ての値に、同じものがないのなら、`realmTagArray.append(readRealmTag.tag)`で配列に値を追加します。

* 同じタイトルのSegmentができない様に、realmTagArrayの中に同じ値が入らない様にしています。

```Swift
           ~~~一部省略~~~

var realmTagArray = [String]()

func readRealmTag(){
        
        do{
            let realm = try Realm()
            realmTagArray = []
            
            for readRealmTag in realm.objects(RealmDataSets.self){
                
                if realmTagArray.allSatisfy({$0 != readRealmTag.tag}) == true{
                    
                    realmTagArray.append(readRealmTag.tag)
                    
                }
               
            }
            
        }catch{
            
            //エラー処理など
        }
    }
```

* `.removeAllSegments()`でSegmentを削除出来ます。(新しいSegmentを作る際に、以前作成したSegmentが残ってると古いSegmentの上に新しいSegmentが表示されてしまい、変な見た目になります。)

* エラー回避のために`realmCRUDModel.realmTagArray.count`が０の時はSegmentを作成させない様にします。

* `UISegmentedControl()`は簡単にですがこちらで解説しました。[Buttonを押すとSegmentが増える(UISegmentedControl)](https://qiita.com/HiroUrata/items/92345fe16e03390224a3)

```Swift

           ~~~一部省略~~~


var uiSegmentControl = UISegmentedControl()
let realmCRUDModel = RealmCRUDModel()

func createSegment(targetView:UIView){
        
        realmCRUDModel.readRealmTag()
        
        uiSegmentControl.removeAllSegments()
        
        if realmCRUDModel.realmTagArray.count != 0{
        
           for segmentCount in 0...realmCRUDModel.realmTagArray.count - 1{
         
                uiSegmentControl.insertSegment(withTitle: realmCRUDModel.realmTagArray[segmentCount], at: segmentCount, animated: true)
            
           }
        }
        
        uiSegmentControl.frame = CGRect(x: targetView.bounds.minX + 5, y: targetView.bounds.minY + 97, width: targetView.frame.size.width - 10, height: 32)
        
        uiSegmentControl.selectedSegmentTintColor = UIColor(red: 1.0, green: 0.40, blue: 0.51, alpha: 1.0)
        
        targetView.addSubview(uiSegmentControl)
    }
```

#終わり
最近、作っているアプリからの内容でした。

ご指摘、ご質問などありましたら、コメントまでお願い致します。
応用情報技術者試験に向けて

#バスアーキテクチャ
##バスとは
バスというのはコンピューターを構成する機器の間でデータをやりとりするための経路、伝送路のこと
ざっくり分けると、

* CPU内部の伝送路である　　**　内部バス　**
* その外側の伝送路である　**外部バス　**

に分けられる。

##バスの方式

バスはデータの転送方式によってパラレルバスとシリアルバスに分けられる。

* パラレルバス　並列　複数の信号を同時に送受信する
* シリアルバス　直列　信号を連続して送受信する　シリアルバスの方が早い

##入出力制御方式

* プログラム制御方式　

　入出力装置からメモリへのデータ転送をCPUが制御する方式データの転送はレジスタを経由して行われる。レジスタとはCPUに内蔵されている記憶装置

* DMA制御方式　

入出力装置からメモリへのデータ転送をCPUを介さずに行う制御方式。DMAコントローラーという専用の制御回路がメモリと入出力装置間のデータ転送を行う。

* チャンネル制御方式

DMA制御方式をさらに拡張したもの。入出力制御用のCPUなどを備えたチャネルという専用装置がメモリと入出力装置間のデータ転送を自律的に行う。
AWSサポートのプランを見てみる

## 勉強前イメージ

TAMみたいなやつ？

## 調査

### AWSサポート とは

AWSのサポートは4つのサポートプランがあり、
それぞれ定額制の料金ではなく、使用分だけ支払う従量制になります。
またプランごとに最低利用料があり、使用量と最低利用料と比べて高い方の金額を払うという仕組みになっています。

### サポートプランについて

AWSのサポートプランについて以下4つあります。
それぞれ詳細を確認していきます。

- ベーシックプラン

AWSのアカウントがある全ての人が対象しており、無料で利用できるサービスになります。
サービス状態ダッシュボード・製品 FAQなど利用でき、それ以上になると有償のプランに加入が必要になります。

- 開発者サポートプラン

個人や学習向けのサポートプランで、有償のプランになります。
利用料金は最低29ドルになります。
このプランでは、日本語サポートを平日9時から18時まで利用できます。
webのサポートから問い合わせができます。

- ビジネスサポートプラン

ビジネスでの影響があるサービスを利用しているアカウント向けのサポートプランで、
有償プランで最低100ドルになります。
このプランでは、日本語サポートを24時間365日いつでも利用でき、
ビジネスに影響のある障害では初回1時間以内の応答というのもあります。
また、webのサポートをはじめ、電話やメール・チャットでの問い合わせができます。

- エンタープライズサポートプラン

団体向けで、ヘビーユーザ向けのサポートプランになります。
有償プランで最低15,000ドルから利用できます。
ビジネスプラン同様、日本語サポートを24時間365日いつでも利用でき、
また緊急時には15分以内に初回応答というのがあります。
問い合わせ方法はwebのサポートをはじめ、電話やメール・チャット、TAM(テクニカルアカウントマネージャー)に連絡することも可能です。
TAMとはAWSに関して技術的な専門知識を有しており、サービスを見ながら問題を解決していき
オペレーションやアーキテクチャに対してレビューを行う役割の人です。
このプランのみ、TAMをサポートを受けることができます。

### AWSのサポートの内容

- お問い合わせ対応

webであればAWSのサポートから問い合わせを行うことができます。
以下がサービスの画面になります。

![1AWS サポートダッシュボード - Google Chrome 2021-07-28 22.46.4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/18680122-b367-b231-807c-ddba7697ae4f.png)


また、ビズネスプラン以上であれば電話も可能です。
エンタープライズプランになるとTAMのサポートを受けれるので緊急度が高いものはTAMへ連携されることもあります。

- サポートフォーラム

AWSにはサポートフォーラムというものがあり、ユーザ同士で質問・回答をし合うようなものです。
他の人の質問履歴から問題が解決する可能性もあります。

- AWS Trusted Advisor

AWS Trusted Advisorというサポートがあり、
システム構成や使用状況を確認し、改善などを提示してくれるサービスになります。

![2Trusted Advisor - ダッシュボード - Google Chrome 2021-07-.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/c62aec98-724a-0eec-e303-6e4f9400b783.png)

- Cost Explorer

コストと使用状況レポートから、各サービスごとだったりアカウントごとだったりのコストを見ることができます。

- ベストプラクティスの提供

AWSでは各サービスごとにベストプラクティスというのが提供されており、効率の良い使用方法を確認することができます。
例えばEC2であれば[こちら](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-best-practices.html) から確認できます。

- 1対1で質問への回答

AWSを利用している中のでの問題点や不明点を確認することができ、
ビシネス・エンタープライズプランではこのサポートを時間を問わず利用することができます。

- ナレッジセンター

こちらの [Amazon Web Services Japan 公式チャンネル](https://www.youtube.com/c/JPAmazonWebServices/featured) のAWSサポートから確認することができます。

## 勉強後イメージ

案外知らないサポート内容があった。
特にベストプラクティスとかほぼ見たことないからきちんと見ていこう。
あと、TAMはサポートの中の1つだったのか。

## 参考

- [AWSサポートのご紹介](https://d1.awsstatic.com/webinars/jp/pdf/services/AWS_Support_%E3%81%94%E7%B4%B9%E4%BB%8B_2019.pdf)
- [AWSのサポートプランの種類4つ｜AWSが提供するサポート内容6つ](https://www.yume-tec.co.jp/column/trend/3666)
- [AWSのサポートとは？プランやサポート内容について詳しく解説](https://and-engineer.com/articles/YH52_hAAACgAEisM)
iCloudからロードを終えた写真を表示する際にトランジションを設定する

iCloudからロードを終えた写真を表示する際に、transitionを設定する方法です。
ふわっと表示できます。

フラグを作って、onCgange内でwithAnimationを設定することで出来ました。
いろいろはしょってますがこんな感じです。

```swift
struct PhotoRow: View {
   @ObservedObject var photo: Asset
   @State car flg = false
   var body: some View {
   HStack{
            if flg {
                Image(uiImage: photo.image!)
                   .transition(.opacity)
                
            } else {
                Color.clear
                .frame(width: photoWidth, height: photoWidth)
            }
   }
   .onChange(of: imageCheck(), perform: { _ in
            withAnimation{
                flg = true
            }
        })
    }
    func imageCheck() -> Bool{
        var flg0 = false
        if photo.image != nil{
            flg0 = true
        }
        return flg0
    } 

```

参考
https://github.com/kazuhiro4949/GridSample/blob/master/GridSample/PhotoLibrary.swift
【Ethereum】DockerコンテナにGethの環境を構築してみる

#はじめに
Ethereumネットワーク上でアプリを動かしてみようと思い、なるべくローカル環境を汚したくないのでDockerコンテナ上で環境を作れないかとやってみたら出来たので、その方法を備忘録として残しておこうと思います。


#前提
・Dockerの使い方についての説明はしません。
・Macでの操作になります。Windowsの方は適宜あてはめてやってみてください。


#そもそもGethとは
GethはGoで実装されたEthereumのCUIクライアントで、このGethをインストールし起動することでEthereumのP2Pネットワークにフル・ノードとして参加することが出来ます。
Gethを使うことで、
・etherの採掘
・etherの送金
・スマート・コントラクトの生成
・トランザクションの生成
・ブロックチェーンの確認
といった動作が可能になります。


#Dockerfileの作成
てきとうなディレクトリに作業用フォルダを作成しそのフォルダでDockerfileを作成します。

```Dockerfile:Dockerfile
FROM ubuntu:latest

RUN apt-get update && apt install -y software-properties-common

RUN add-apt-repository -y ppa:ethereum/ethereum

RUN apt-get update && apt-get install -y \
    ethereum \
    solc

WORKDIR /work/
```
簡単に内容を説明すると、
1行目でOSとしてubuntuのイメージを取得しています。
2行目、3行目では、ethereumのパッケージはapt-getのパッケージリストに無いので、ethereumのパッケージリストをapt-getにインストールしています。
4行目、5行目でethereumのライブラリをコンテナにインストールしています。
6行目のsolcはスマートコントラクトのコードをデプロイする際コンパイルするためのツールです。
コンテナ内では作業用ディレクトリとしてroot配下にworkフォルダを作成しています。


#dockerコンテナの作成
Dockerfileをビルドしdockerイメージを作成します。

```bash
$ docker build .
```

dockerイメージが作成されたらそのイメージからコンテナを起動します。

```bash
# xxxxxxxxxはdockerのimage
$ docker run -it -v ~/hoge:/work xxxxxxxxx bash
```
docker runでコンテナを起動する際、-vオプションでホストのフォルダとコンテナのフォルダをマウントするのを忘れないよう注意。


#Gethの確認
コンテナが起動したらGethとsolcがインストールされているか確認します。
1.Gethの確認
    コンテナのコンソールでgethコマンドとversionサブコマンドを入力します。

```bash
root@064d11dd2cec:/work# geth version
Geth
Version: 1.10.6-stable
Git Commit: 576681f29b895dd39e559b7ba17fcd89b42e4833
Architecture: amd64
Go Version: go1.16.4
Operating System: linux
GOPATH=
GOROOT=go
```
こんな感じで表示されたらOK.

2.solcの確認
    今回の記事では使用しないけど、いずれ使うので今の内に確認しておきます。
    solcコマンドに--versionオプションをつけて実行します。

```bash
root@064d11dd2cec:/work# solc --version
solc, the solidity compiler commandline interface
Version: 0.8.6+commit.11564f7e.Linux.g++
```
こんな感じで表示されたらOK.

これでコンテナ環境でGethを使ってEthereumのプライベートネットワークでetherの送金やマイニング、スマートコントラクトの作成をすることが出来るようになりました。

次回はgenesisファイル(ブロックチェーンの一番初めのブロックの設定ファイル)でのgeth初期化とgethの起動、etherの送金等を書いていこうと思います。


#おわりに
ブロックチェーンアプリ開発を勉強中です。
学んだことをアウトプットするため、また自分自身の備忘録として書いています。
他にも優良なサイトや記事はたくさんあるので、なるべく自分がハマった箇所をメインに記事を作成していこうと思っています。
もし自分と同じ箇所でハマっている方の参考になれば幸いです。

また気付いた点や間違えている点があったらご指摘いただけると嬉しいです。


#参考サイト
[Ethereum入門](https://book.ethereum-jp.net/)
このサイトにはホントお世話になっています。EthereumやGethのことが細かく紹介されています。

[渋谷ほととぎす通信](https://www.shibuya24.info/entry/geth_eghereum_1)
Ethereumの仕様は結構変わったりするんですが、このサイトは新しい情報が載っているので参考にしています。

[apt-getで見つからないパッケージを追加する方法(debian, ubuntu両方対応)](https://qiita.com/kon_yu/items/8ac350f3951f8534c931)
ubuntuにethereumをインストールする時の参考にしました。
Could not open input file: composer.pharが出た場合の対処方法

macでcomposerインストール後にCakePHPのプロジェクトを作成しようとしてつまずいたのでメモ

```
php composer.phar create-project --prefer-dist cakephp/app:4.* my_app_name
```

を実行した場合に

```
Could not open input file: composer.phar
```

と表示されることがあります。
その場合は以下でプロジェクトを作成してみてください。

```
composer create-project --prefer-dist cakephp/app:4.* my_app_name
```
【AWS】Amazon EC2

#はじめに
AWS認定試験取得に向けてAWSの知識を整理するためのまとめです。
今回はEC2についてまとめます。

#EC2とは
Elastic Compute Cloud の略です。
仮想コンピューティング環境を提供するサービスです。

#EC2の特徴

##Auto Scaling
定義した条件に応じて EC2 インスタンスを自動的に追加または削除できます。
こちらを設定することで耐障害性の向上、アプリケーションの可用性、
コストの削減（必要な時にのみインスタンスが追加されるため）が期待できます。

##対応しているOS
・Amazon Linux (RedHatベースのOS)
・Ubuntu
・Windows Server
・CentOS
・Debian
など

## インスタンスタイプ
### インスタンスファミリー
追加機能は省略

| インスタンスファミリー | タイプ |詳細|
|:--|:--|:--|
|汎用|T4,T3,T2<br>M6,M5,M4<br>A1<br>Mac|バランスの取れたインスタンス。<br>|
|コンピューティング<br>最適化|C6,C5,C4|高パフォーマンスのプロセッサを使用<br>高性能webサーバー、専用ゲームサーバ、機械学習推論などの用途|
|メモリ最適化|R6,R5,R4<br>X2,X1<br>z1d|メモリサイズが大きいインスタンス<br>キャッシュサーバーなどの用途|
|高速コンピューティング|P4,P3,P2<br>Inf1<br>G4,G3<br>F1,VT1|機械学習などの用途で利用|
|ストレージ最適化|I3<br>D2,D3<br>H1|高いIO性能を保持<br>NoSQLやインメモリデータベースなどの用途|

#料金
| 料金形態 | 詳細 |
|:--|:--|
|オンデマンド|実行するインスタンスの時間あたりに対しての料金が発生します。<br>長期利用の契約や前払いの必要はありません。|
|Savings Plans|1年または3年期間で特定の使用料（USD/時間で測定）を契約する代わりに、オンデマンドより低料金で利用可能となります。<br>詳細は下記参照|
|リザーブドインスタンス|オンデマンド料金より最大72%割引で利用できます。<br>1年または3年の期間で購入できます。(キャパシティが予約される)<br>予約期間中に別のインスタンスファミリーやOSを変更する場合は、コンバーディブルブリザードインスタンスの購入が推奨されています。|
|スポットインスタンス|オンデマンド料金より最大90%割引で利用できます。<br>AWS内の未使用のEC2インスタンスに対して値段をつけて、ユーザの入札価格が現在のスポット価格（可変）を上回っている限りそのインスタンスを利用できる仕組みです。スポット価格が、設定した最高入札額を上回った場合はインスタンスが終了するため、停止を想定したインスタンスの利用を行なう必要があります。|
|Dedicated Host|オンデマンド料金より最大70%割引で利用できます。<br>お客様専用の物理EC2 サーバーです。<br>Amazon や EC2 で Microsoft や Oracle などのベンダー対象ソフトウェアライセンスを使用できるためコスト削減に役立ちます。企業のコンプライアンス(マルチテナントサーバではなく専用サーバで実行する必要がある場合など)要件を満たす場合でも利用できます。|

##Savings Plans詳細
Savings Plansには３種類あります。
・Compute Saving Plans
　一番柔軟性があり、Amazon EC2、AWS Lambda、および AWS Fargate 全体の使用量に適用されます。
　EC2インスタンスのインスタンスタイプを変更したり、リージョンを別のところに変えても、
　またはEC2からFargateへ切り替えても引き続き割引が適用されるプランです。
　最大で66%の割引となります。

・EC2 Instance Savings Plans
　EC2だけを対象とするSavings Plansです。
　最初に選択したリージョンでしか割引は適用されません。
　EC2のインスタンスタイプ、OSなどを変更しても割引が適用され続けます。
　最大で72%の割引となります。
　（RIと同じ割引料金であるため、EC2からサービスを変更しない場合はこちらも検討したほうが良い可能性がある）

・Amazon SageMaker Savings Plans
　Amazon SageMakerだけを対象とするSavings Plansです。
　インスタンスファミリー、サイズ、AZ、AWS リージョン、またはコンポーネントに関係なく、
　SageMaker インスタンスの利用に適用されます。
　最大で64%の割引となります。
（SageMakerとは機械学習モデルを高速に開発、学習、デプロイするための
モジュールが用意されているフルマネージド型サービスです）

#参考サイト
https://aws.amazon.com/jp/products/compute/?nc2=h_ql_prod_cp
https://qiita.com/nasuvitz/items/1317495450e91c987cba
https://recipe.kc-cloud.jp/archives/321
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-spot-instances.html
aptコマンド

## 目次
1. [aptコマンドとは?](#1aptコマンドとは)
1. [aptコマンドの種類](#2aptコマンドの種類)
1. [個人メモ(パッケージのインストールに関して)](#3個人メモパッケージのインストールに関して)

## 1.aptコマンドとは?
* Ubuntu(Linuxのディストリビューションの一つ)におけるパッケージ管理システム<br />
※厳密にいうと、UbuntuはDebian系列のOSでDebian系のディストリビューションに使われているパッケージ管理用のコマンド
* 以前はapt-get もしくは apt-cacheが使用されていたが、統合されてaptコマンドとして使用できるようになった
* aptに関する設定は、以下のディレクトリ、ファイルを参照

### aptに関する設定
|ファイル名|説明|
|---|---|
|/etc/apt|apt に関する設定ファイルが格納されるディレクトリ|
|/etc/apt/sources.list|登録されているリポジトリのURLを列挙するファイル|

## 2.aptコマンドの種類

* Ubuntuでの操作を想定。
* 文頭のsudoは省略。

|コマンド|説明|
|---|---|
|apt install [パッケージ名]|インストール|
|apt remove [パッケージ名]|アンインストール|
|apt remove --purge [パッケージ名]|パッケージを完全削除|
|apt autoremove|依存関係で必要だったが現在は不要なパッケージの削除|
|apt update|パッケージのインデックスファイルを更新|
|apt upgrade|インストール済みのパッケージをまとめて更新する|
|apt full-upgrade|upgradeに加え、更新に伴って使用できなくなるパッケージを削除するなどの調整も行う|
|apt show [パッケージ名]|パッケージの詳細情報を表示|
|apt list|インストール可能なパッケージを検索|
|apt list [パッケージ名]|インストール可能なパッケージを検索(完全一致)|
|apt list --installed|インストールされているパッケージを表示|
|apt list --upgradable|アップデートできるパッケージを表示する|
|apt search [パッケージ名]|インストール可能なパッケージを検索(部分一致)|
|apt moo|お遊び用のコマンド|

## 3.個人メモ(パッケージのインストールに関して)

### Node.js

```bash
# nodejsをインストール
$ sudo apt install nodejs

# npmをインストール
$ sudo apt install npm

# この時点では、Node.js のバイナリはnodeではなくnodejsになっているため
# nodeという名前でリンクするには、下記コマンドを実行
$ sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
```

### Go

```bash
# goをインストール
$ sudo apt install golang
```

### Python

```bash
# python3をインストール
$ sudo apt install python3

# パッケージ管理ツールpip(コマンド名はpip3)をインストール
$ sudo apt install python3-pip

# グラフィックスライブラリ tkinter を使用したい場合
$ sudo apt install python3-tk

```
binding.pryを使えるようになりたい！

# はじめに
本記事は、「binding.pry」を今後活用できるようにするため、
現時点で学習したことをアウトプットします。

# インストール
`pry-rails`というGemをインストールする必要があります。
Gemfileに以下のコードを記述します。

```ruby
gem 'pry-rails'
```

その後、ターミナルにて`bundle install`します。
「binding.pry」に限らず、Gemをインストールする際には、`bundle install`します。

エラーが発生した場合、原因がどのコードにあるのかを「binding.pry」を使って確認することができます。

コードで「binding.pry」という文字列をコード内に記述すると、
そこで、処理が止まります。
その後からの処理の結果を手動で確認することができます。

# 例文

```ruby
class OrdersController < ApplicationController

  def index
    @order = Order.new
  end

  def create
    @order = Order.new(order_params)
    binding.pry
    if @order.valid?
      @order.save
      return redirect_to root_path
    else
      render 'index'
    end
  end

  private

  def order_params
    params.require(:order).permit(:price)
  end

end
```

今回は、Ordersコントローラーのcreateアクションにエラーはないのかを確認するために、
9行目で、「binding.pry」を発動しています。

ここで「rails s」サーバーを起動させ、
指定した行為を実行すると、
ターミナル上で、

```
[1] pry(#<OrdersController>)> 
```

と表示されます。

その後からの処置がどうなるのかを試したい時に、
その後の処理を記述することで、結果を確認することができます。

１０行目で、

```ruby
if @order.valid?
```
という記載があるので、

```
[1] pry(#<OrdersController>)> @order.valid?
```
と記述します。

すると、

```
[1] pry(#<OrdersController>)> @order.valid?
=> false
```

コード全体を記述していないため、わかりづらいですが、
結果は、「エラー」となりました。
*「valid?」は、エラーがある時は「false」、ない時は「true」となります。

コントローラーのcreateアクションでミスが発生しているということですね。

# 終わり
学習段階で、ここまでの理解です。
正直申し上げると、理解が浅く、使いこなせるレベルまで到達していないことが、
今回投稿してみてわかりました。

明日、メンターへさらに理解をするために、
質問し、理解を深めます。
さらに深く説明できるようになれば、また投稿したいと思います。

それでは、引き続きがんばりましょう！！
[Rails+Vue.js]〜分前を実装してみた

#はじめに
Q＆Aサイトを作成している中で、質問の投稿時刻をTwitterのような`〜分前`にしたいと考えました。
しかし、Railsから渡される値をそのまま使うと、
![スクリーンショット 2021-08-01 17.39.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1110285/4383caff-b3d3-5fb2-be5d-468cda64d423.png)
のようになってしまいます。
そこで今回は、`Moment.js`を用いて相対時刻の表示をしたいと思います。

##バージョン等
Rails 6.1.3
Vue.js 2.6.11
Moment.js 2.29.1

#手順
まずは、moment.jsをインストールします

```
npm install moment --save 
```

次に〜分前表示をしたいコンポーネント内に以下の記述をします。

```Vue
<script>
import moment from "moment";

export default {
   filters: {
      moment: function(date) {
　　　　　　　　　　　　　　　　moment.locale("ja");
        return moment(date).fromNow();
      },
    },
</script>
```

コードの解説をすると、
`moment.locale("ja");`で日本語表示にしています。
returnで`moment(date)`の後に、希望のフォーマットになるようにメソッドを記述します。
ここに関しては、
https://blog.capilano-fw.com/?p=1033
が参考になりました。


あとは、Vueのフィルターを使用して、

```Vue
{{ question.created_at | moment }}
```

とすると、

![スクリーンショット 2021-08-01 22.33.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1110285/24603b00-2cd7-7e8b-1875-3e9f507e0def.png)

`〜分前`のフォーマットで表示することができました！

#まとめ
Railsから渡された値を、フロント側で処理をすることができました。
また、最近ではDay.jsがMoment.jsよりも処理が早いとも聞いたのでこれから導入する方は調べてみるのもいいかもしれません。