OmniAICreator/Qiita-1.07M huggingface dataset:
テスト40


```vb

Sub dic()

Dim dic As Variant
Dim i As Long
Dim j As Long
Dim Last_Row As Long

Set dic = CreateObject("Scripting.Dictionary")

With ThisWorkbook.Sheets("一覧表")

    Last_Row = .Cells(.Rows.Count, 1).End(xlUp).Row

    For j = 2 To Last_Row
    
        dic.Add CStr(j), .Cells(j, 2).Value
    
    Next j

End With

'------------------------------
'「キー」から「アイテム」を取り出す
'CreateObjectを使うとdic.Items()ではなく、dic.Items()()にしないといけないから注意
'-------------------------------
For i = 0 To dic.Count - 1

    If i <> 0 Then
    
        Debug.Print dic.Items()(i - 1)

    End If
    
Next i
 
End Sub


'--------------------------------------
'メモ
'MicroSoftが出しているWindowsアプリ開発者用ツール、inspect
'エクスプローラの各ボタンや他のアプリケーションの各ボタンなどの要素を取得できるツール
'https://docs.microsoft.com/ja-jp/windows/win32/winauto/inspect-objects?redirectedfrom=MSDN
'https://qiita.com/RPAbot/items/f1d6438c8f2500db65ae

'With sh2. PageSetup
'   .PaperSize = xlPaperA4
'   .Orientation = xlPortrait
'   .Zoom = False
'End With
iosアプリの譲渡　やり方

<h2>必要なもの</h2>
・譲渡人の`Apple Developer Program`アカウント
・受取人の`Apple Developer Program`アカウント
※ メンバーシップに登録されてるもの
<h2>手順</h2>
1. `App Store Connect` から譲渡したいアプリを選択
2. 譲渡するために必要な処理
3. 受取人で受取処理

<h2>本文</h2>

まずは`App Store Connect` に移動し、譲渡したいアプリを選択

そして、サイドバーから一般→App情報をクリック

ページの下のほうに`Appの譲渡`という項目があるのでクリック
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223039/6914d8cd-3422-2c8c-5e30-8cfad20cfbf0.png)

そうすると譲渡する為の条件が一覧で出てきます。

僕の場合は、`TestFlight`でビルドしていたアプリがあり、条件を満たしていないと出てしまいました。

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223039/3a076dd3-e07f-0eca-71c0-ba89f12ae32f.png)

![003.png](http://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223039/7b0b2605-ceae-dcac-c3d7-3e648bbbe200.png)

レ点のチェックになっていないところが不適合です。

`TestFlight`の配布ページでビルドをすべて削除した後、再度譲渡ページにいくと問題なく進めました。

完了ボタンを押します。

![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223039/c5774c36-8de6-efc8-7dba-6f95e6bf06a2.png)

譲渡先の`AppleID`と`チームID`を入れます。

![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223039/5553825e-8057-c070-1282-191146e1435d.png)

契約条件に同意し譲渡をします。

![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223039/e9baa9ad-24d7-207c-55fa-4eb68edbfad3.png)

[譲渡するリクエストを送信済みです]と表示されてるかと思います。

次に譲渡を受けた側で`App Store Connect`で受取作業を行います。

![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223039/1d7625a2-cda4-d4b8-6d24-e8dc638adefe.png)

譲渡されるアカウントで`App Store Connect`にログインすると、

「保留中のApp譲渡リクエストの承認」とお知らせが来ています。

契約/税金/口座情報　のページに移動します。

![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223039/78072937-22be-2152-fe05-9214fbbb685b.png)

Appの譲渡の欄から譲渡したいAppの名前、譲渡人、受取人が間違っていないか確認し、右側の確認ボタンを押します。

![009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223039/2786d19b-04ff-fd66-c20d-4fa69767aa2d.png)
![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223039/69185744-3f8a-69bb-16d1-2dbb80b2fe30.png)
![011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223039/da3dd05f-8e49-2789-f186-84c304f7130c.png)

項目に情報を入れたら最後に同意にチェックして承諾すれば完了です。

<h2>感想</h2>

初めてのアプリの譲渡はミスが許されないものでしたので、緊張しました。
ちゃんと読めばわかることですが、譲渡するうえで条件に一致していない部分を理解するのに時間がすこ～しかかりしました。
本気で国語から勉強しなおしたくなる今日この頃、、、(・∀・)

何度もやることではないので備忘録として残しておきます。
Databricksにてdbutilsにより実行したノートブックのRUN IDを取得する方法

## 追記

環境によっては下記のようなエラーがでるようです。代替案を、[Databricksにてdbutils.widget により RUN IDを取得する方法 - Qiita](https://qiita.com/manabian/items/5d5969ffd8628bde1077) にて記載しました。

> py4j.security.Py4JSecurityException: Method public java.lang.String com.databricks.backend.common.rpc.CommandContext.toJson() is not whitelisted on class class com.databricks.backend.common.rpc.CommandContext

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2c9fae5b-7258-97f5-6099-7b91ec15535d.png)


## 概要
Databricksにてdbutilsにより実行したノートブックのRUN IDを取得するには、dbutilsに実行されるノートブックにてリターン値としてRUN IDを返すことで可能です。リターン値を設定するには、dbutils.notebook.exitを利用します。

下記がサンプルコードです。

```python
import json 
notebook_info = json.loads(dbutils.notebook.entry_point.getDbutils().notebook().getContext().toJson())
try:
  runId = notebook_info["tags"]["runId"]
except:
  runId = -1 
dbutils.notebook.exit(runId) 
```

Githubにサンプルノートブック群での実行手順を本記事で紹介します。

## 手順
### 1. ノートブックのインポート

```URL
https://github.com/manabian-/databricks_tecks_for_qiita/blob/main/tecks/get_runid_when_using_dbutilsnotebookrun/dbc/get_runid_when_using_dbutilsnotebookrun.dbc
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/645b81ad-bcd8-3533-73fc-97558bf4edde.png)


### 2. `main`ノートブックを実行して、リターン値としてRUN IDが取得できることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ee521c67-70fc-aa4b-860f-788db966bccd.png)

### 3. 実行したジョブの詳細ページへのリンク（例：Notebook job #12608）を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/825b5346-6559-8fb4-7df2-b5b6a05cc36f.png)

### 4. 2の値と一致することを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e1dfcd34-a613-0f74-c3de-e311f3cb3e5f.png)

## 参考情報

- [Is it possible to get Job Run ID of notebook run by dbutils.notbook.run? - Databricks Community Forum](https://forums.databricks.com/questions/12134/possible-to-get-job-run-id-of-notebook-run-by-dbut.html)
クラスを学ぶ前に読むオブジェクト指向入門

当文章は筆者が受け持つ授業の副読教材として書くものです。基本的なプログラミングをメソッド（関数）まで履修し、これからクラスを学ぼうとする人に、クラスの構文に固執せずオブジェクト指向プログラミングの本質に触れてもらおうと試みるものです。

### <FONT size="5" color="FF0000">オブジェクト指向とは情報制御です</FONT>

これまで学んできたプログラミングが「**情報をどう処理するか**」という点を中心に、入出力まで、隅から隅まで考えてきました。一方、オブジェクト指向プログラミングでは「**誰が何を知っていて、どの様な処理をするか**」という観点に重きを置きます。

プログラミングではない実社会での例を考えてみましょう。

これまで学んできた「**情報をどう処理するか**」という手法はマニュアル書き・レシピ書きです。豆腐の味噌汁を作るのに、昆布は水から入れて沸騰の前に取り出せだとか豆腐を何cm角に切れだとか味噌を溶いたら沸き立たせるなだとか、そういう手順を事細かに順番に書いたものです。

このマニュアルは非常に便利ですが、では焼き魚定食のためのマニュアルを書くためにはどうすれば良いでしょうか？昨日はサバでしたが、今日は鮭です。お浸しがほうれん草から菜の花に変わりました。きんぴらごぼうの代わりにひじきの煮物にします。このような状況の厨房を預かるあなたはひとつの焼き魚定食マニュアルに固執することはできません。

そこで「**誰が何を知っていて、どの様な処理をするか**」という手法です。厨房を預かるあなたはそれぞれに担当者を決めます。焼き魚担当、お浸し担当、副菜担当、味噌汁担当、ご飯担当、それぞれに今日作るものを決めさせて、あなたは全体を取りまとめて注文数を管理すれば良いだけです。それぞれの担当者も自分の担当にだけ集中して、必要なら下処理などは部下に命令すれば良いわけです。それぞれの担当者の手元には細かなレシピや材料の在庫状況などの情報があると思います。しかし、取りまとめのあなたに必要なのは今日の献立が何食、どのくらいの時間で出来上がるのかだけです。

情報とそれに対する処理の組み合わせは意外と多くはありません。またそれぞれの情報を保持している担当者間で受け渡す必要がある情報も、システム全体の複雑性と比べれば意外なほど単純で小さなものです。膨大な情報を伝えなければならない時も、情報そのものではなく情報の置き場の情報のみ渡せば良いことがほとんどだからです。この**担当者間での情報交換の手法が整っていることが一番重要**なのです。


この様に「**誰が何を知っていて、どの様な処理をするか**」を考えるオブジェクト指向プログラミングでは、それぞれの担当が担う処理と必要な情報を考え、また担当者間の関係性を考えます。この処理と情報を持つ担当者がオブジェクトであり、プログラミング言語上の記法ではその担当者の規格がクラスであり個々の担当者がインスタンスと呼ばれます。しかし、**プログラミング言語上の記法など些細なこと**です。重要なのは組み上げるシステムの構造を抽象的に把握・設計することです。つまり、**情報の保持と処理を俯瞰し、各所の共通性と特色を理解し、出来るだけ共通化されかつ独立したパーツの組み合わせにより目的達成する全体像を組み上げることが重要**です。オブジェクト指向に慣れるとこの絵のような感覚で各所を構築していく感じになります。
![ObjectOrientedPrograming.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264339/c042743d-7e83-1991-6bc2-e097b8464831.png)

この様なシステムをより効率的に構築するために「継承」などの概念もあります。そして、汎用的な構造は「デザインパターン」と呼ばれます。オブジェクト指向に慣れてきたら調べてみてください。



---
当文章は `CC-BY: Akito D. Kawamura (@aDAVISk)` として公開します。ご自由にお使いください。
Xcodeとシュミレーターのショートカットまとめた

# はじめに
こんにちは@kaneko77です。
常日頃からPCを触る人たちはショートカットを使っていると思います。
Xcodeも当然ショートカットがあり、やはりボタンを押すよりショートカットでやった方が楽だよねって話です。
ということで今回は`Xcodeのショートカット`と`シュミレーターのショートカット`の2つをできるだけ紹介していきたいと思います。
[こちら](https://hiromiick.com/xcode-shortcut/)を参考にして記事を書いています。

## ショートカットの記号説明
|  説明 | 記号 |
| ---- | ---- |
|  **command**  |  `⌘`  |
|**shift** |  `⇧`  |
|**option** or **alt** |  `⌥`  |
|  **Ctrl**  |  `⌃`  |

# ショートカット一覧
## Xcode
### ビルド系
|  やること  |  ショートカット  |
| ---- | ---- |
|  ビルド or 実行  |  `⌘ + R`  |
|  実行停止 |  `⌘ + .`  |
|  ビルド  |  `⌘ + B`  |
|  クリーンビルド  |  `⌘ + ⇧ + K`  |

### ウインドウ操作系
|  やること  |  ショートカット  |
| ---- | ---- |
|  デバックエリアの表示 or 非表示  |  `⌘ + ⇧ + Y`  |
|  ナビゲーターの表示 or  非表示  |  `⌘ + O` |
|  デバックエリアの表示 or 非表示  |  `⌘ + ⇧ + O`  |
|  プロジェクト全体検索  |  `⌘ + ⇧ + F`  |
|  メソッドやMARKコメントの一覧表示  |  `⌃ + ６`   |

### ファイル操作系
|  やること  |  ショートカット  |
| ---- | ---- |
|  右にタブ移動  |  `⌘ + ⇧ + }`  |
|  左にタブ移動  |  `⌘ + ⇧ + {`  |
|  前開いていたファイルに戻る  |  `⌘ + ⌃ + ←`  |
|  次開いていたファイルに戻る  |  `⌘ + ⌃ + →`  |

### コード編集系
|  やること  |  ショートカット  |
| ---- | ---- |
|  フォントの拡大  |  `⌘ + ⇧ + ➕` |
|  フォントの縮小  |  `⌘ + ⇧ + ➖`  |
|  編集を一つ戻る  |  `⌘ + Z`   |
|  編集を一つ進める  |  `⌘ + ⇧ + Z`   |
|  インテントの整理  |  `⌃ + I`  |
|  インデントを一つ上げる  |  `⌘ + [`   |
|  インデントを一つ下げる  |  `⌘ + ]`   |
|  コメントアウト or 解除 |  `⌘ + /`  |
|  カーソルを行頭へ移動 |  `⌘ + ←` または `⌃ + A` |
|  カーソルを行末へ移動  |  `⌘ + →` または `⌃ + E` |
|  カーソルを先頭へ移動 |  `⌘ + ↑`　　|
|  カーソルを最後へ移動  |  `⌘ + ↓` |
|  現在のカーソル位置から行末をまとめて選択|  `⌘ +　⇧ + →`  |
|  現在のカーソル位置から行頭をまとめて選択 |  `⌘ + ⇧ + ←`  |
|  右に１単語移動 |  `⌘ +　⌥ + →`  |
|  左に１単語移動  |  `⌘ + ⌥ + ←`  |
|  現在のカーソル位置から右に１単語をまとめて選択|  `⌥ +　⇧ + →`  |
|  カーソルを増やす(1行下) |  `⌃ + ⇧ + ↓`  |
|  カーソルを増やす(1行上) |  `⌃ + ⇧ + ↑`  |

### ファイル検索系
|  やること  |  ショートカット  |
| ---- | ---- |
|  ファイル名検索  |  `⌘ + ⇧ + O`  |
|  コードの単語検索  |  `⌘ + F` |
|  プロジェクト全体検索  |  `⌘ + ⇧ + F`  |
|  メソッドやMARKコメントの一覧表示  |  `⌃ + ６` |
|  定義元を表示  |  `⌘ 　+ ⇧　+ J` |
|  変数や関数の説明  |  `⌥ 　+ クリック` |

## シュミレーター
|  やること  |  ショートカット  |
| ---- | ---- |
|  ホームに戻る  |  `⌘ + ⇧ + H`  |
|  タスク一覧表示  |  `⌘ + ⇧ + Hを2回` または　`⌘ + ⇧ + ⌃ + H`  |
|  右に回る |  `⌘ + →`  |
|  左に回る |  `⌘ + ←`  |
|  ロック |  `⌘ + L` |
|  電話のステータス表示　 or 非表示 |  `⌘ + Y` |
|  ズーム  |  `⌥ + 長押しカーソル移動` |
|  ダークモードの切り替え |  `⌘ 　+ ⇧　+ A` |
|  文字サイズを大きくする |  `⌘ 　+ ⌥　+ ➕` |
|  文字サイズを小さくする |  `⌘ 　+ ⌥　+ ➖` |
|  キーボードを表示 or 非表示  |  `⌘ 　+ ⇧　+ K` |
|  スクリーンショット |  `⌘　+ J` |
|  録画 |  `⌘　+ R` |
|  Shiriの起動 |  `⌘ + ⇧ + ⌥ + H`  |
|  ボリュームを上げる |  `⌘　+ ↑` |
|  ボリュームを下げる |  `⌘　+ ↓` |
|  フルスクリーン  |  `fn 　+F` |

# 終わりに

ショートカットって結構割とありますよね。
少しでも業務を効率化するために今回共有したものは全部覚えれると楽になれるかなと思います。
ここまで見ていただきありがとうございます。
皆様のお役に少しでも立てれますと幸いです。
【VScode】-を含む単語をダブルクリックしたときに、単語全てを選択されるようにカスタマイズする

日本全体の技術力を上げるために貢献したいKASATAです。

# 【VScode】-を含む単語をダブルクリックしたときに、単語全てを選択されるようにカスタマイズする

VScodeはデフォルトでハイフンが入っている文字列をダブルクリックすると、ハイフン部分で単語が分かれてしまう仕様になっていると思います。
HTMLのidやclassはハイフン区切りで単語を分けることが多いので、不便だと感じることが多いです。
これはVScodeの仕様なので諦めるしかないと思っている方も多いのではないでしょうか？

## 手順
1. command + ,で設定を開く
2. editor.wordで検索
3. Editor: Word Separatorsの中に区切り文字の記号が羅列されているので、
記号の中からハイフンを消せばOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477820/35fc1470-df37-b1ab-e2ef-33c5af8237c6.png)

---

日本全体の技術力を上げるために貢献したいです。
[MyTwitter](https://twitter.com/funny_man_daa)
std::vectorの[ ]に引っかかった話

私はcsv解読用のプログラムを書いてるときに、特定要素にアクセスするためにこんなのを実装してました。

```C++:csv.cpp
//csv.h
//std::vector<std::vector<std::string>> csv;
 
std::string CSV::At(const int& x, const int& y) const {
	try {
		return csv[y][x];
	}
	catch (...) {
		return "0";
	}
}
```
vectorの範囲外へアクセスした際に投げられる`out of range`をキャッチして、とりあえず"0"を返すようにしてます。
そしていざ範囲外アクセスのテスト・・・(Releaseモード)

## 一連の流れ
わい「ん？落ちたぞ」

(Debugに変更)

画面君
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286973/9b2bf68b-5b31-4ddc-9104-05322ba3d275.png)


わい「ん？キャッチされてへんな・・・なんでや？」
わい「とりあえずデバッグや」
VS君「out of range!!!」
わい「は？」

わい　考えるのをやめる

　　～翌日～

わい「やっぱわかんない　おしえてぐーぐるせんせい」
検索「vector out of range catch」
結果「[すたっくおーばーふろー](https://stackoverflow.com/questions/63290129/c-function-not-catching-vector-subscript-out-of-range-execption)」

回答「`[]`は**例外投げへん**で～　そのかわり`.at()`なら投げてくれるからそっち使い～」

わい「！？！？！？」
わい「修正っと」

```c++:csv.cpp
try {
	return csv.at(y).at(x);
}
catch (...) {
	return "0";
}
```

テスト結果：ちゃんと0が表示される

わい「しゃあああああああああああああ！」

## なにがあった？
回答にあった通り、`[]`は例外を投げません。
`.at()`はアクセス時に境界チェックを行い、範囲外であれば例外として`out of range`を投げます。 しかし`[]`はチェックしてくれないようで、例外が投げられることはないとのこと（範囲外アクセスは未定義動作）。なので例外がキャッチされることはなかった。~~わいの1日返して･･･~~

## だから
これからは必要なかったらvector(だけに限らずほかのコンテナでも)`.at()`を使っていこう。

### 補足
`return csv.at(x).at(y);`だとx､yが逆になるよ！！(1敗)

あっ、みんな知ってる･･･？　マジ･･･？
アーキテクチャ　ランキング

アーキテクチャを勉強したときに参考にした記事

#第1位
https://qiita.com/hirokidaichi/items/a746062917595619720b

#第2位
https://qiita.com/nrslib/items/a5f902c4defc83bd46b8

#第3位
https://qiita.com/hirotakan/items/698c1f5773a3cca6193e

いつもわかりやすい記事ありがとうございます。
Booleanとオブジェクトのリストを持つデータクラスのParcelableを実装する

## Parcelableとは？
- 状態を一時的に保存して欲しいオブジェクトが実装すべきインターフェイス
- `Parcelable`を実装したオブジェクトは、`Intent`を使って`Activity`間でやり取り出来る

## Parcelableの実装

`Note`というデータクラスを使って`Parcelable`を実装してみます。

```kotlin
data class Note(
    val id: Int,
    val title: String,
    val createdAt: Date,
    val isDeleted: Boolean,
    val pages: List<Page>
) : Parcelable {

    override fun describeContents(): Int = 0

    override fun writeToParcel(dest: Parcel?, flags: Int) {
        dest?.run {
            writeInt(id)
            writeString(title)
            writeSerializable(createdAt)
            writeInt(if (isDeleted) 1 else 0)
            writeList(pages)
        }
    }

    companion object {
        @JvmField
        val CREATOR = object : Parcelable.Creator<Note> {
            override fun createFromParcel(source: Parcel): Note = source.run {
                Note(
                    id = readInt(),
                    title = readString() ?: "",
                    createdAt = readSerializable() as Date,
                    isDeleted = (readInt() == 1),
                    pages = arrayListOf<Page>().apply {
                        readList(this, Page::class.java.classLoader)
                    }
                )
            }

            override fun newArray(size: Int): Array<Note?> = arrayOfNulls(size)
        }
    }
}

data class Page(
    val title: String,
    val content: String,
    val createdAt: Date
) : Serializable
```

### isDeleted: Booleanの変換

`Boolean`を変換するために「`readBoolean()」`というメソッドが用意されていますが、このメソッドが「API Level 29」からしか使えません。

なので、以下のように「`readInt()`」を使って`Boolean`に変換しています。

```kotlin
// 0 -> false, 1 -> true

// 書き込み
writeInt(if (isDeleted) 1 else 0)

// 読み取り
isDeleted = (readInt() == 1),
```

### pages: List<Page>の変換
  
「`writeList()`」と「`readList()`」を使います。
  
読み取りの時は、以下のようにして「`kotlin.collections.ArrayList`」に変換します。

```kotlin
arrayListOf<Page>().apply {
  readList(this, Page::class.java.classLoader)
}
```
[Ruby]半角スペースで区切られた整数の足し算

## はじめに
piazaの問題で躓いてしまったので、学習したことをアウトプット！

## コード

```ruby:qiita.rb
nums = gets.split(' ').map(&:to_i) 
#splitで（' '）で区切って文字列を分割し配列を作る。
#mapで区切られたそれぞれの文字列を数値化する。
result = nums[0] + nums[1]
# 配列内の文字列を足す。
puts result
```

## こっちの方がシンプル
```ruby:qiita.rb
num1, num2 = gets.split.map(&:to_i)
puts num1 + num2
```

##splitメソッドとは
Stringクラスで用意されている文字列を指定の文字や正規表現を使って分割するメソッド。

```ruby:split.rb
split([sep[, limit]])
# 第一引数に指定したパターン（文字列や正規表現）に従って、文字列も分割し配列にする
# 第二引数を指定して分割数を指定する
# 引数を指定しない場合にが、空白文字列で分割する

str = "Tokyo,Osaka,Nagoya"
puts str.split(",", 2)
=> ["Tokyo", "Osaka,Nagoya"]
```

## mapメソッドとは
配列の要素の数だけブロック内の処理を繰り返し、結果として作成された配列を返すメソッド。

```ruby:map.rb
a1 = [100, 200, 300]
a2 = a1.map { |x| x * 2 }
puts a2 
=> [200, 400, 600]

#メソッドを用いるときは以下の省略形でもOK
オブジェクト.map(&:メソッド名)
a1.map(&:to_s)
=> ["100", "200", "300"]
```

##参考資料
https://uxmilk.jp/21695　
https://www.javadrive.jp/ruby/string_class/index12.html
BigQueryでyyyymm⇔日付型の相互変換

#はじめに
yyyymm→日付型への変換はすぐわかるんだがその逆が探しにくいのでメモ。

## yyyymm→日付型への変換  
かんたんなのでこちらを推奨。  
`PARSE_DATE("%Y%m%d",CONCAT(yyyymmのカラム,"01"))`  
01は日付に該当。  
ちなみにyyyy-mmだったら、  
`CAST(CONCAT(yyyy-mmのカラム ,'-01') as DATE)`
とかでもいける
## 日付型→yyyymmへの変換  
これはちょっと面倒。  
`CONCAT(EXTRACT(YEAR FROM 日付のカラム),EXTRACT(MONTH FROM 日付のカラム))`  
しかしこれでは例えば2021-06-01のとき20216となってしまう。  
というわけで左側をゼロパディングしてやる。  
`CONCAT(EXTRACT(YEAR FROM 日付のカラム),
 FORMAT('%02d',EXTRACT(MONTH FROM 日付のカラム)))`
ファーウェイ端末であるかどうか判断する方法

ファーウェイ端末であるかどうか判断するソースコードは次の通りです。


```java
public class HuaweiUtil {

    public static String getManufacturer() {
        try {
            Class<?> classType = Class.forName("android.os.SystemProperties");
            Method getMethod = classType.getDeclaredMethod("get", new Class<?>[]{String.class});
            return (String) getMethod.invoke(classType, new Object[] {"ro.product.manufacturer"});
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static boolean isHuaweiDevice() {
        String manufacturer = getManufacturer();
        if (null == manufacturer) {
            return false;
        }

        return manufacturer.equalsIgnoreCase("HUAWEI");
    }
}
```
備忘録：プロジェクト管理

今日はToDoアプリでも作ろうと思い、コードを書いていたがgetリクエストもpostリクエストも404エラー
3時間くらい格闘の末、原因はもろもろのフォルダ、ファイルをテストのところに作っていました。
そりゃ動かないわ、、、、、、

って感じで無駄な3時間を過ごしてしまいました。
また明日

皆さんお疲れさまでした。
SQLやRDBMSにおける主キーとは、「表を関数としてみるときの入力」である

あなたは次の8名を雇用しました。

- 野々村真由子
- 豊田竜太郎
- 小保方守
- 佐村河内春子
- 湯川淳也
- 樋田遥菜
- カルロス正人
- 内田ゴーン

人事部が、彼らの住所をあなたに知ってもらうために、表1を送信してくれました。

表1. 従業員の氏名とその住所

氏名|都道府県|市区町村|それ以降の住所
:-:|:-:|:-:|:-:
野々村真由子|東京都|足立区|█████
豊田竜太郎|青森県|青森市|█████
小保方守|神奈川県|█████|鵠沼X-X-X
佐村河内春子|山口県|█████|綾羅木本町Y-Y-Y
湯川淳也|█████|千葉市|中央区Z-Z-Z
樋田遥菜|█████|那覇市|首里石嶺町A-A-A 
█████|兵庫県|明石市|和坂B-B-B
█████|栃木県|宇都宮市|西刑部町C-C-C

表1は、システムの問題でデータが一部欠損してしまっています。
1行目に関しては「従業員 野々村真由子の住所が、ほとんどわかるけど一部だけ分からない」といえます。
2行目から6行目に関しても同様です。
しかし、7行目、8行目に関しては「この従業員、**そもそも誰なのか**わからない」という、別格の問題が生じてしまいます。
消去法で「カルロス正人」と「内田ゴーン」の2名であることは特定できても、2名の住所を知らないので、どっちがどっちなのかわかりません。
結局、彼ら2名の住所に関する情報は、この表からほとんど得られないということになります。
よって、**たったこの1列が欠損しただけで、あたかも他のすべての列が欠損したかのような損害を受けなくてはならないのです。**

このように考えると、表1について、次のようなことが言えます。

1. 氏名の列(カラム)だけは、欠損しないでほしい
2. あなたは、氏名の列をみて「あの従業員だ」と頭の中でイメージし、氏名以外の列を見て、「あの従業員に関する追加情報」をテーブルから得ている。

2.であるからこそ、氏名が欠損すると、そもそも頭の中で「どの従業員なのか」をイメージできないわけです。
2.を写像を使って言い換えると、
>
(厳密には)あなたは$$m: 氏名→(都道府県×市区町村×それ以降の住所)$$な写像$m$として表1を使っている
>
(わかりやすく言うと)あなたは$$f(氏名) = (都道府県, 市区町村, それ以降の住所)$$な関数$f$として表1を使っている

といえます。

以上のように、人がテーブルから何かを知るとき、無意識のうちにテーブルを写像(関数)とみているといえます。
そしてそのような写像における定義域(関数における入力)を、主キーといいます。

今回の場合は、氏名が主キーです。
【初心者入門】Rust ランタイムについて

# Rustのランタイム

- Javaのような言語で使われる典型的な意味のランタイムは、持ちません
- Rustの標準ライブラリの一部は、ヒープ、バックトレース、巻き戻し、スタックガードなどを提供するランタイムであると考えられます
- ユーザのmain関数を呼ぶ前に少しの初期化コードが実行されます
- Rustの標準ライブラリはさらにCの標準ライブラリとリンクしますが、これはランタイムの初期化のようなことを行います
- Rustコードは標準ライブラリなしでコンパイルできるので、この場合はランタイムはおおよそCのランタイムと等価です

https://prev.rust-lang.org/ja-JP/faq.html#does-rust-have-a-runtime

- async/awaitなどを使い非同期関数や非同期ブロックで非同期タスクを作る事はできます
- しかし、生成した非同期タスクを実行するすべは用意されていません
- そのため、非同期タスクを正しく起動して実行を監視し、きちんと非同期タスクを完了させるために非同期ランタイムを用いる必要があります

https://stupefied-wing-509aa6.netlify.app/ch02-01-async-std-code-example.html#async-std-を用いたコードを少し見ていこう

## Rustランタイム種類

- ランタイムとは非同期プログラミングの処理機能
- Rustのランタイムには大きく分けて2種類ある？

### io_uring版ランタイム

- `io_uring`はLinuxで非同期`IO`をするためのAPI

https://docs.rs/io-uring/0.5.1/io_uring/](https://docs.rs/io-uring/0.5.1/io_uring/

【**glommio】**

- `glommio`は、`io_uring`インターフェイスしかサポートせず、比較的新しいLinuxカーネルでしか動きません。
- この大衆に迎合しない差別化で、先鋭的なユーザを引き付けることが期待されます。
- 高性能なサーバを実装するための`C++`のフレームワークである`Seastar`に影響を受けており、CPU間でデータを共有せず、ロック競合を避けることで、CPU数に対する性能のスケーラビリティを実現するアーキテクチャが採用されています。

### epoll版ランタイム

- `epoll`とはLinux固有のAPIで、パイプやソケットなど出入力に待ちが発生する対象を複数同時に待つ、いわゆるIOの多重化の機能を提供している

https://docs.rs/epoll/4.3.1/epoll/

https://keens.github.io/blog/2021/02/01/epolldetsukuruchattosa_ba/

- パイプやソケットなど出入力に待ちが発生する対象を複数同時に待つ、いわゆるIOの多重化の機能を提供します。

https://medium.com/nttlabs/rust-async-with-io-uring-db3fa2642dd4

【**Tokio】**

- `Tokio`は、デファクトであろうランタイムで、`AWS`、`Microsoft`などクラウドネイティブな会社がそのユーザとして知られています
- 非同期ランタイムの一つ。

https://docs.rs/tokio/1.7.1/tokio/

- Tokioは、Rustで非同期アプリケーションを実装するために不可欠なさまざまな機能を提供する多数のモジュールで構成されている

【**smol】**

- `smol`とは、`Tokio`に対して、「`A small and fast async runtime`」というビジョンで始められたプロジェクトです。
- `OSS`プロジェクト、プロレス団体、宗教団体、どのような組織も巨大化すると、「立ち上げ時の理想が失われた」などの理由で、新たに小さな団体を立ち上げる人たちが出現しますが、そういうやつです。

【**async-std】**

- `glommio`、`Tokio`、`smol`が、ネットワークやストレージなど、主にサーバ・クライアントの実装に必要なAPIのみを非同期化しているのに対し、async-stdは、文字列操作など、全ての標準APIを非同期化することを目指すというハードコアなやつです。


※ 結論、まだ理解していない・・・w
Amplify functionをtypescriptで書くよ

今回は、[公式](https://docs.amplify.aws/cli/function/build-options)の手順に従ってamplify functionをtypescriptで書こうと思います。

# Functionの追加
この手順では、functionの名前を「generateReport」としているので合わせます。適宜読み替えましょう。

```
$ amplify add function
Using service: Lambda, provided by: awscloudformation
? Provide a friendly name for your resource to be used as a label for this categor
y in the project: generateReport
...略...
```
手順では```amplify function add```と書かれてますが、```amplify add function```でもオケ。

作成できると以下の場所にindex.jsが作成されます。
amplify > backend > function > generateReport > src

# Typescriptの導入
作成したFunction配下に移動しtypescriptをインストールします。

```
$ cd amplify/backend/function/generateReport/src
$ yarn add -D typescript
```
npm使っている人はnpmでもオケ。

# Typescriptコードの作成
手順によると、typescriptのコードは```amplify/backend/function/generateReport/lib```に配置されていることを期待しているようなので、そこにindex.tsファイルを作成します。
とりあえず、index.jsを移動して、ファイル名をindex.tsに変更しましょう。

# スクリプト導入

プロジェクトルートのpackage.jsonにトランスパイル用のスクリプトを追加します。

```package.json
{
...略...
  "scripts": {
    "amplify:generateReport": "cd amplify/backend/function/generateReport && tsc -p ./tsconfig.json && cd -"
  },
}
```

# tsconfig.json作成
作成済みのFunction直下にtsconfig.jsonファイルを作成します。

```
$ cd amplify/backend/function/generateReport
$ touch tsconfig.json
```

```tsconfig.json
{
  "compilerOptions": {
    "allowSyntheticDefaultImports": true,
    "lib": ["dom", "esnext"],
    "module": "commonjs",
    "moduleResolution": "node",
    "skipLibCheck": true,
    "resolveJsonModule": true,
    "outDir": "./src",
    "baseUrl": "./",
    "rootDir": "./lib",
    "paths": {
      "src": ["./lib"]
    }
  }
}
```

# 動作確認

mockで動作を確認し、よろしければpushしましょう。

```
$ amplify mock function
```

```
$ amplify push
```

これで無事、typescriptで書いたコードがlambdaにデプロイされることになるでしょう。
Androidアプリにおける フラグメントトランザクション



#フラグメントトランザクション

用語から解説していきます。


>**フラグメント**とは、簡単にいうと、コンテンツとライフサイクルを持ったビューです。
>**トランザクション**とは、複数の処理を１セットとする考え方です。よくある例が、口座の振り込み処理。「Aが払う、Bがもらう」で１セットの考え方。

フラグメントの追加、削除では、データベースへのデータの追加、削除と似た``フラグメントトランザクション``という考え方をします。

同一アクティビティ上に、フラグメントが存在し得る時などに必要となってきます。
例えば、左半分にリストデータがあり、右半分にリストデータをタップした時に表示されるフラグメントがある時などです。

#使い方手順
1,FragmentTransactionオブジェクトを取得
2,対象Fragmentオブジェクトを生成、もしくは取得する。
3,フラグメントの追加/削除/置き換え処理を行う
4,コミットする

##1,FragmentTransactionオブジェクトを取得
``FragmentTransaction``とは、一連のフラグメント操作を実行するためのAPI。[参考](https://developer.android.com/reference/kotlin/android/app/FragmentTransaction)
フラグメントトランザクションを制御するクラスです。[参考](https://developer.android.com/reference/kotlin/android/app/FragmentManager#beginTransaction())
``FragmentManager``クラスの``beginTransaction``メソッドで取得します。その際にセーフコール関数を忘れない。
>``FragmentManager``:Fragment内部のオブジェクトと対話するためのインターフェースActivity
``beginTransaction``:このFragmentManagerに関連付けられているフラグメントで一連の編集操作を開始します。

```SampleFragment.kt
val transaction = fragmentManager?.beginTransaction()
```

##2,対象Fragmentオブジェクトを生成、もしくは取得する。
対象のFragmentオブジェクトを生成します。
または、今あるフラグメントの場合は、``findFragmentById()``を使用するなどして、Fragmentオブジェクトを取得します。

```SampleFragment.kt
val 生成したいフラグメントに代入される変数　=　生成したいフラグメント()
```

##3,フラグメントの追加/削除/置き換え処理を行う
1で出てきた、``FragmentTransaction``クラスのメソッドを使用します。
その際、サーフコール演算子を忘れないようにします。

####FragmentTransactionクラスのメソッド一部
| メソッド | 役割|引数の中身 |
|:-|:-|:-|
|  add(fragment: Fragment!, tag: String!) | 追加  |1つ目は、追加先のレイアウト画面部品のR値/2つ目は、追加するFragmentオブジェクト|
| remove(fragment: Fragment!)  |   削除|削除するFragmentオブジェクト |
| replace(containerViewId: Int, fragment: Fragment!)  | 削除と同時に追加  |1つ目は、追加先のレイアウト画面部品のR値/2つ目は、追加するFragmentオブジェクト|

```SampleFragment.kt
transaction?.replace(R.id.レイアウト画面部品, 追加するFragment)
transaction?.remove(削除するFragment)
```

指定するFragmentオブジェクトの前に``this@自身のFragmentオブジェクト``とすると、自身のインスタンスを表すことができます。


##4,コミットする
1で出てきた、``FragmentTransaction``クラスの``commit()``メソッドを使用します。

フラグメント処理は、トランザクションという考え方を採用しているので、commit()メソッドが実行されるまで、フラグメントの状態は反映されません。

```SampleFragment.kt
transaction?.commit()
```
MySQL：テーブルの作成とレコード挿入

#テーブルの作成
例えばresultという名前のテーブルを作成して、カラムは「subject」と「score」にしようと思った場合

~~~sql
CREATE TABLE result(
 subject VARCHAR(50),
 score INT
);
~~~

となる。ここで`VARCHAR(50)`は50文字以内、`INT`は整数という意味です。まとめるとテーブルを作成する時は

~~~sql
CREATE TABLE テーブル名(
 カラム名 数値の条件,
 カラム名 数値の条件,
 ・・・
);
~~~

となる。作成したテーブルの構造確認と一覧は

~~~sql
--構造確認
DESC テーブル名;
--テーブル一覧表示
SHOW TABLES;
~~~

でできる。

#レコードの挿入
さっき作成したresultというテーブルの一行目と二行目にレコードを挿入するときは

~~~sql
INSERT INFO result (subject, score) VALUES("Math", 90);
INSERT INFO result (subject, score) VALUES("English", 50);
~~~

となる。また一回でまとめて挿入することもできて

~~~sql
INSERT INFO result (subject, score) VALUES("Math", 90),("English", 50);
~~~

と書くと一回で挿入できる。まとめるとレコード挿入は

~~~sql
INSERT INFO テーブル名 (カラム名1, カラム名2, ・・・) VALUES(値1, 値2, ・・・);
~~~

となる。今あるレコードの確認は

~~~sql
SELECT * FROM テーブル名;
~~~

でできる。
Unity パラメータ専用クラスを内部クラスとして作成

##0.0 はじめに
内部クラスをパラメータ化するときに少し手間取ったのでメモしておきます。






##1.0 内部クラス
Monsterクラスが内部クラスで、パラメータとしてMonster Name、HP、MP、Attack、Defenseを持っています。




```C#:test.cs
public class Test : MonoBehaviour {

    public Monster[] monsters;

    [System.Serializable]
    public class Monster { // 内部クラス

        public string monsterName;
        public int HP;
        public int MP;
        public int Attack;
        public int Defense;

    }
}
```






👍**ポイント**　
[System.Serializable]を付ける。
内部クラスのアクセス因子はpublic、またパラメータもpublicの必要があります。




##2.0 Inspector
Inspector（インスペクタ）上では下記のようになっています。
Sizeで種類数を設定します（１）
最初の項目にStringを使うと項目名がそのまま表示できます（２）




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/bc173cd2-e507-7297-8743-266b45db1134.png)
php myadmin の導入が思ったより簡単だった件

docker+laravelでプロジェクトを作成した僕はマイグレーションファイルを作成しphp artsian migrate でマイグレーションをしたら
...
access denied　だと...？
あたりまえである、この男コンテナの中に入っていないのである。

コマンドはコンテナの中で、そんな事も忘れている人間が今日はphp myadmin を見ようとしたら開かなかったという話。



###本筋

実は今日の今日までphp myadmin はlaravelプロジェクトを作成すると標準で使えるようになると思い込んでいた。
今までたいていほかの人が作成したプロジェクトを元に仕事をしていたので。

なのでlocalhost:8080でphpmyadminを開こうとしたら開けず、

なんで！？どうして！？と困惑しながら"php myadmin 開けない"とか検索していたのである。

しばらく翻弄したあとphpmyadminを自分で導入しなけらばならない事が分かりやり方を検索。


#導入手順

docker-compose-ymlに以下を追加


```docker-compose-yml
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    depends_on:
      - db
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOSTS=db
      - PMA_USER=${DB_USER:-user}
      - PMA_PASSWORD=${DB_PASS:-secret}
    ports:
      - "8080:80"
    volumes:
      - ./docker/phpmyadmin/sessions:/sessions
```


そして以下のコマンドでコンテナを起動しなおしたら…

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

http://localhost:8080/

アクセス！

・・・

開いた！！！！！！！
うおおおおおおおおおおお！！！！！！！

<h3>完</h3>


想像よりずっと簡単でびっくりした
Site24x7の監視アラートをLineに通知する方法

ネットワーク監視ツールといえばzabbixなど色々あると思いますが、
クラウド型の監視ツールSite24x7でアラートをLineに通知する方法の紹介です。
 Site24x7については次を参照してみてください。
　https://www.site24x7.jp

Site24x7では、メールや電話、SMS通知の他slack等の3rd partyも連携できますが、今回はLINEによる通知に挑戦してみました。
連携に関しては、OAuthとLINE NotifyのAPIを用います。

早速、Site24x7において、
tegetegeという名前のwebサイト(※実際には存在しません)の応答時間でしきい値1ミリ秒を違反した場合を検知した
例を基に説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674507/af82b131-d6e8-fff3-03d0-76e1eff21d72.png)


手順の概要
前提として1)で連携を設定し、2)で通知設定を行います。
1)Site24x7とLINE NotifyによるOAuthの連携
2)Site24x7の監視アラート通知設定

1)の手順
1.Line Notify(https://notify-bot.line.me/ja/)
にログイン　
2.登録サービス管理画面からsite24x7をサービス登録
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674507/7b8ca9bb-bd89-9522-ccf7-9502043cd889.png)


3.Client IDとClient Secretを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674507/542e52a6-3067-b742-54ff-bc84b66b9ddd.png)

 
4.Site24x7上の[管理]-[設定プロファイル]-[OAuthプロバイダー]を選択し
　必要な情報を入力
※クライアントIDとクライアントシックレットは3.より取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674507/5ea5f1a5-84ba-031a-8579-4bedefff5055.png)

ここまでが1)Site24x7とLINE NotifyによるOAuthの連携の設定になります。

続いて、2)Site24x7の監視アラート通知設定



5.Site24x7上で[管理]メニューの[設定プロファイル]-[しきい値と可用性]でしきい値プロファイルを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674507/96830032-c8b8-f083-f31e-576bda2c2ef8.png)



6.Site24x7上で[管理]メニューのIT自動化テンプレートを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674507/9123452c-3323-f48a-b521-441ba32042b9.png)

7.webサイト監視tegetegeの追加登録の際、同画面でしきい値プロファイルとIT自動化テンプレートを割当て
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674507/c14060c6-04aa-2b19-5ded-9757d8b6b0ce.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1674507/65d545d1-f71e-45fd-1860-87e644110b5f.png)



8.Lineに通知が来ることを確認

参考)
Site24x7
 https://www.site24x7.jp
Line notifyのAPI
 https://notify-bot.line.me/doc/ja/
Technical Support of [オオギリ×クレーマー]

![Simulator Screen Shot - iPhone 8 Plus - 2021-06-21 at 22.52.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1269423/e7bfbac7-52da-3881-0ba5-04b863081dea.png)

![Simulator Screen Shot - iPhone 8 Plus - 2021-06-21 at 22.53.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1269423/e4c74b88-47ec-f64a-3aaa-72bd9e5be664.png)

This page provides game support

If you have any questions or bug reports, please contact us th the email address below. We will reply as soon as possible

hiroki.oh.0611@icloud.com

Best.
pyenvのパス解決が突然できなくなった

# 事象
pyenvを利用してるビルドスクリプトが突然動かなくなった

```sh
/Users/tsune2ne/.pyenv/shims/pip3: line 21: /usr/local/Cellar/pyenv/1.2.21/libexec/pyenv: No such file or directory
/Users/tsune2ne/.pyenv/shims/python3: line 21: /usr/local/Cellar/pyenv/1.2.21/libexec/pyenv: No such file or directory
```

# 原因
どうやら別作業で brew install をしたときにpyenvが自動更新されてパス解決できなくなったらしい

pyenvを更新した場合は `pyenv rehash` を実行して `~/.pyenv/shims` 以下を更新する必要があった

毎回やるのは面倒なのでビルドスクリプトに `pyenv rehash` を追記して解決

# おまけ
https://qiita.com/zaburo/items/dd1a8323633035614efc#shims%E3%81%AE%E6%9B%B4%E6%96%B0

> なお、この操作は、brew install pyenv-pip-rehashをインストールすることで自動化できるようです。
インストール時はbrew install homebrew/boneyard/pyenv-pip-rehashとする必要があるようです。

こちらをインストールするのOK
github.comのアカウントが必要そうです
postgresqlで詰まったこと

もらったCSVファイルをコピーしようと以下のコマンドを打ったところエラー

```Terminal
postgres=# \COPY voice_chat_def from '/Users/hayano/Downloads/voice_char_def.csv' delimiter ',' csv header;
ERROR:  unquoted newline found in data
HINT:  Use quoted CSV field to represent newline.
CONTEXT:  COPY voice_chat_def, line 209
```
エラー文で調べると、csvに空白行があるのが問題という記事を見つけたが今回は空白行も特に見つからなかった。

もらったcsvをエクセルで表示していたが、黄色い枠のメッセージ
データ損失の可能性〜の一番右にある「名前をつけて保存」で別名保存をして同じことをすると問題なくコピーできた

```
postgres=# \COPY voice_chat_def from '/Users/hayano/Downloads/voice_char_def2.csv' delimiter ',' csv header;
```

理由わからないので誰か教えてくださると幸いです。。
ワード検索機能の実装

自分で作成したアプリにワード検索機能を実装したいと思います。

## ルーティングの設定

```config/routes.rb
Rails.application.routes.draw do
  root to: "home#index"
  resources :archive do
    collection do
      get 'search'
    end
  end
end
```
今回はarchiveに検索機能をつけるので、collectionで指定しました。
ちなみにcollectionの他にmemberで指定する方法もありますが、違いは検索した対象のレコードのidを取得するかどうか。

使い所で説明した方が良いと思います。

collection
検索結果を一覧表示する→indexならこっち

member
検索した結果の特定のページに遷移する→showならこっち

## modelの追記

```app/models/archive.rb
class Archive < ApplicationRecord
  has_many :tag_relations, dependent: :destroy
  has_many :tags, through: :tag_relations

#ここから追記
  def self.search(search)
    if search != ""
      Archive.where('archivetitle LIKE(?)', "%#{search}%")
    else
      Archive.all
    end
  end
#ここまで
end
```

モデルにクラスを設定して、検索するクラスを作成します。
引数であるsearchに文字列があれば、それを検索してくれます。

## controllerの追記

```app/controllers/archive_controller.rb
  def search
    @archives = Archive.search(params[:keyword]).page(params[:page]).per(15)
  end
```

paramsにkeywordを渡して、検索するように設定します。
これで先ほど記述した modelのクラスが呼び出されます。

## あとはビューを調整して完了
PHPの変数のスコープについてまとめてみた

#そもそもスコープとは？
スコープ（Scope）は「範囲」という意味がある。
そのため、PHPの変数のスコープとは変数が適応できる範囲という意味 :whale2:

#ローカルスコープ
変数を定義している関数内でしか使えない変数のスコープ
関数の外で定義した変数を関数の中で使ったり、逆に関数の中で定義した変数を関数の外で使ったりすることはできない

```php
    function localScope()
    {
        $localValue = "これはローカルスコープの変数です。";
        return $localValue ;
    }

    echo $localValue ;
    echo localScope();
```
```
　　// 実行結果
   >                                  //echo $localValue;の実行結果
   >これはローカルスコープの変数です。　　//echo localScope();の実行結果
```

```echo $localValue ```の実行結果がないのは、```$localValue ```を定義している関数の外で```$localValue ```を使っているから！

#グローバルスコープ
関数内で定義されていない変数のスコープ
関数の外で定義した変数に```global```を使うことで、関数の中でも使えるような変数になる。

```php
$globalValue = "これはグローバルスコープの変数です。";

 function globalScope()
    {
        global $globalValue; // globalキーワードを使用
        return $globalValue;
    }
    echo globalScope();
```
```
　　// 実行結果
   >これはグローバルスコープの変数です。　　//echo globalScope();の実行結果

```

# スーパーグローバルスコープ
定義する必要のない、すべてのスコープに対応する変数のこと。
もともとPHPに組み込んである変数で9種類ある。

スーパーグローバル変数については別記事にまとめる :fire:
〜のiPhone is busy: Uploading 〜

コンテナファイルをFinder上で修正して実機に入れる工程で

〜のiPhone is busy: Uploading
というエラーに遭遇した

ネットで情報も調べるもうまくいかず。
その際に行ったことはこちら。

10分ほど待つ
updateうまくいかず
mac 再起動
iPad 再起動
iPadつなぎ直す
Device and SimulatordeでUnpair Device


上記でできず。
他に何かできることあるか？なんて思いつつ先輩に聞いたら

https://stackoverflow.com/questions/31184606/my-device-is-busy-copying-symbol-files-in-xcode-6-4

Delete app while still connected to mac.
	Close Xcode
	Right click on the Xcode app icon on mac screen, and select quit.
	Unplug iPhone
	Reopen the Xcode project.
	Connect iPhone
	Select whatever you are using
	Hit start.

あっアプリの削除やってないと思いアプリを削除して再度入れ直したらいけた

アプリ削除は考えてなかった、、、

という感じで結構詰まったので同じ目にあったなんて方はアプリ削除も試してみてもいいかも

以上です
Hololens2でUSB接続Device Portal開けない問題の解決方法

# Hololens2でUSB接続Device Portal開けない問題の解決方法
### 1 経緯
Hololensで視線の動きや手の動きの位置座標を測定するアプリを作り、HololensをUSB接続してDevice Portalからファイルを取得しようと思ったら...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1634872/18c16df8-c277-b945-9f50-411f238feac5.png)
となり接続できなくなってしまった。

### 2 原因
NAT Slipstreaming v2 と呼ばれる攻撃で 10080ポート が使用されるため、ブラウザ側で攻撃を防ぐためにブロックしたのが原因らしい...

### 3解決方法
Fire Foxを導入し特定ポート番号を許可する方法でDevice Portal が開けるようになった。
1Fire Fox導入後にURLに「about:config」を記述


2危険性を承知の上で使用するをクリック

3設定名を検索に「network.security.ports.banned.override」を記述

4その後「文字列」を選択してから「＋」のボタンを押下します。次のような値を入力「10080」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1634872/34244172-19f7-c110-deb9-630f3f5c7d88.png)

これでFire FoxでDevice Portalが開けるようになった。
(ただしChromeなどではまだ開けていない...)
原因模索から解決まで3日間かかったorz

### 4参考サイト
1【Firefox】特定ポート指定時に「このアドレスへの接続は制限されています」が表示されたときの解決方法の紹介
[URL] https://fumidzuki.com/knowledge/2952/

2 Chrome 91 で 10080ポート がブロックされる (ERR_UNSAFE_PORT)
[URL]https://labor.ewigleere.net/2021/06/03/chrome-unsafe-port-10080/
【マネジメント】社内で評価されるエンジニアの4つの必須条件

https://qiita.com/official-events/c826cda7a9514df143cb

## はじめに

この記事はエンジニアとして会社に所属している方向けの記事です。組織で働く際には評価はつきものです。もちろん評価が全てでは無いですが、せっかく会社で仕事をするのであれば周りからの評価も得られるような働き方が出来れば良いですよね。

今回は「社内で評価されるエンジニアの4つの必須条件」というテーマでお話をしたいと思います。

今回は突出した評価を得る条件というよりは、会社という組織で評価を得るための必須条件に近い観点で記載しています。


## 社内で評価されるエンジニアの4つの必須条件
**目次**

* [会社の方向性と合致していること](#会社の方向性と合致している)
* [コミュニケーション能力があること](#コミュニケーション能力があること)
* [+αの意識を持っていること](+αの意識を持っていること)
* [評価は他者がするものという理解があること](#評価は他者がするものという理解があること)
* [最後に](#最後に)


## 会社の方向性と合致していること
大前提に近い話かもしれないですが、会社がエンジニアを雇用しているのは会社が目指すものを一緒に創っていくためです。

* **売上をとにかく伸ばしていきたい**
    * 売上に直結する思考を持ち開発が出来るエンジニア
* **コストを抑えて利益を上げたい**
    * コスト意識や効率化の意識が高いエンジニア
* **エンジニア文化を組織に根付かせたい**
    * コミュニケーション能力が高く発信力や巻き込み力のあるエンジニア
* **新規事業を立ち上げたい**
    * 不確定要素が多い中で開発を推進出来るエンジニア

などなど創っていくものは、会社の文化やその時々の状況によって様々です。
極端な話、売上を大きく伸ばしたい時に、コストを抑えて利益率を改善しても評価はされにくいのです。

まずここを理解するということが大切なので、会社の情報をインプットしたり、わからない部分は上司に確認をとるなどをすると良いと思います。

そして「会社の方向性」と「自分自身の方向性」の重なる点を見つけられるとベストだと思います。
どちらかだけだと大変なので。


## コミュニケーション能力があること
これはさきほどの話にも通じるのですが、自分が会社や顧客から何を求められているのか、どういうアウトプットが必要なのが、自分自身の中に閉じて考えていると難しいことが多いと思います。必要に応じて人に聞く力、またそれを外部に伝えることが出来る力があるエンジニアは周りからの信頼も高く、必要とされるエンジニアになれるはずです。

**社内のコミュニケーションで意識すること**

* 認識の齟齬を出来る限り防ぐこと
    * わからないことはわかるまで聞く
    * 自分の考えは相手に伝える
* 知らないことを隠さない
    * 知ってる風を装わない
    * 知らないことを聞くことで、自分以外の知らない人も知る機会を得られると思っておく
* オープンであること
    * 検討段階、考え中のことも出来る限り共有する
    * そうすることで着地の精度も上がるし、着地に対する周囲の納得感が高まる

## +αの意識を持っていること
個人的に、今まで見てきた中で大きく分かれる部分がこの意識の有無です。

例えば以下の2人のエンジニアを比較して、あなたが経営者ならどちらが自社の社員として必要と思うでしょうか？

**Aさん**

* **依頼した仕事、開発は100%に近い精度できっちり実現をしてくれる**
* **要件以外への提案、意見はほぼ無い**

**Bさん**

* **依頼した仕事、開発は100%とまではいかないがまあまあ高い精度で実現してくれる**
* **要件以外にも改善提案を度々行ってくれる**

これはもしかしたら意見が分かれる部分かもしれませんが、会社の社員として必要な人はBさんだと思います。
もちろんAさんのように要件を100%実現することは素晴らしい能力ではありますし、場合によってAさんの方が高い評価を受けることもあると思います。

しかし、Aさんのアウトプットについては**アウトソースなどの代替手段で賄うことが可能**です。（そんな素晴らしい発注先がすぐに見つかるかは一旦置いておきます）

社員として会社に必要な人はBさんのように**「アウトソースでは賄えない何か」**を価値提供出来ている人だと思います。
その価値提供を意識して仕事を進めているエンジニアは会社という組織の中で評価は自ずと高くなってきます。


## 評価は他者がするものという理解があること
会社という組織の中での自分の評価を自分自身で決めることはまず無いと思います。
必ず上司などがその人を評価します。中には同僚や部下からの評価も含めた360度評価という制度もあります。

他者が評価するということは、**他者から見たあなた**が評価対象になるということです。

なので以下のようなものは評価対象になり得ません。

* **周りは知らないけど実はこんなスキルや知識を持っている**
* **開発スピードに自信を持っているが相対的に社内では早くない**

また総じて自己評価と他者評価にはギャップが生まれやすいものです。

自分の強みと思っている部分が他者から見ると強みになっていない。
逆に自分が弱みと感じている部分が他者から見ると実は評価されている部分だった。
などなどが良く起こります。

これを防ぐためには

* **日々のアウトプットや自己開示を行い自分自身を理解してもらう**
* **周り（特に上司）からFBをもらい客観的な意見を理解しておく**

周りにどんどんアピールすることは必要無いですが、評価は他者がするものという前提を理解したうえで、適切な行動をとることが必要です。



## 最後に
今回は社内評価という観点で話をさせていただきましたが、もちろん評価が全てでは無いですし、評価など気にせずに仕事をすることも選択肢としてもちろん良いと思います。
ただ、適切な評価を受られることは良いことですし、評価する側にとっても周りの人達にとってもハッピーなことだと思います。
せっかく会社という組織で働くのであれば評価する側、される側が適切に評価出来る状態に近づけると良いですね。
laravel 任意のフィールドの値が指定したものと一致していた時に除外するバリデーションルールを記載する方法

# 目的

- laravelで任意のフィールドの値が指定したものと一致していた時に当該フィールドのバリデートをスキップする方法をまとめる

# 方法

- フィールド`check`の値に「false」という文字列が格納されたときに、フィールド`input_str`の値のバリデーションをスキップしたいときは下記のように記載する。
- `input_str`の値のバリデーションルールは「必須」と「文字列であること」とする。
- 下記はリクエストファイルの`rules()`メソッドの内容のみ抜粋して記載する。

    ```HogeRequest.php
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'check' => 'required',
            'input_str' => 'exclude_if:check,false|required|string',
        ];
    }
    ```

- 任意のフィールドの値が指定したものと一致していた時のみ除外してほしいバリデーションルールの頭に`exclude_if:フィールド名,指定された値`を記載する。


# 参考文献

- [https://readouble.com/laravel/6.x/ja/validation.html](https://readouble.com/laravel/6.x/ja/validation.html)
初心者によるdjangoでwebサイトを作る過程でつまずいたところ①

環境
macOS　Bigsur 11.2.1

https://gihyo.jp/book/2020/978-4-297-11572-2
この本を参考にwebサイトを作っていこうと思います！


lerning_logというファイルをデスクトップに作成して、ターミナル上でこのフォルダに移動

```
learning_log % python -m venv ll_env
```
仮想環境を有効化

```
source ll_env/bin/activate
```

Djangoをインストール

```
learning_log % pip install django
```

Djangoプロジェクトを作成

```
learning_log % django-admin startproject learning_log .
```

ここでエラーが！

```
Traceback (most recent call last):
  File "/Users/opt/miniconda3/bin/django-admin", line 5, in <module>
    from django.core.management import execute_from_command_line
ModuleNotFoundError: No module named 'django'
```
ん？？

```
learning_log % python -m django --version
3.2.4

```
ちゃんとインストールされているのにな、、

と思ったのですが、よくよくみたら仮想環境に入った時に普通

```
(ll_env)learning_log %
```
となるところが

```
(base)(ll_env)learning_log %
```
となってました。

私はAnacondaをインストールしていて、ターミナルを開いたときに毎回先頭に（bese）と表示されています。
もしかしてconda じゃなくてpipでインストールしたからうまくいかなかったのかな？と思って

```
learning_log % pip uninstall django
```
でアンインストールして

```
learning_log % conda install django

```
でインストールしなおしました。

```
learning_log % django-admin startproject lerning_log .
learning_log % ls
lerning_log	ll_env		manage.py

```
いけました！！！

(base) (ll_env) learning_log%　のままでいいのかよくわかりませんが、このまま進めてみようと思います。

一応ここに(base)を消す方法が載ってます
https://code-graffiti.com/base-is-displayed-at-the-top-of-the-terminal-on-mac/
【基本】ネットワーク用語

#はじめに
作業中にインターネットが使えなくて困ったことがあり
インフラ・ネットワークの基本を勉強中です。
間違い、補足が有りましたら、指摘していただけると幸いです。

# IPアドレス(Internet Protocol address)
機器に割り振られるネットワーク上の住所のこと。

* 構成
サブネットマスクによって定義されている、
機器を表すホスト部(ホストアドレス)と
ネットワークを表すネットワーク部(ネットワークアドレス)がある。

* サイズ
IPv4: 32ビット 4バイト
IPv6: 128ビット 16バイト


* グローバルIPアドレス
インターネット上で使用するIPアドレスのこと。
インターネット全体でユニークでなければならない。

* プライベートIPアドレス　
LANの中でのみ使用できるIPアドレスのこと。
LANの中でユニークでなければならない。
予約されているIPアドレスは以下の通り
10.0.0.0～10.255.255.255（最大約1677万台）
172.16.0.0～172.31.255.255（最大65535台）
192.168.0.0～192.168.255.255（最大255台×256ネットワーク）

# MACアドレス(MAC Address)
ネットワークカードや無線LANチップなどの
ネットワーク接続装置ごとに割り当てられる固有の番号のこと。

データリンク層(Layer2)のプロトコルで使用されるアドレスで、
物理アドレス(physical address)とも呼ばれる。

# ブロードキャストアドレス(broadcast address)
ネットワーク内のすべての機器にデータを一斉配信するためのアドレス。

ブロードキャストアドレスを指定してデータを送ると
ネットワーク内のすべての機器にデータが配信される。

# サブネット(subnetwork)
分割したネットワークのこと。

ネットワークを分割することを
サブネット化/サブネッティング(subnetting)と呼ぶ。


# サブネットマスク(subnet mask)
IPアドレスのホスト部とネットワーク部の長さの配分を定義する数値のこと。
IPアドレスとサブネットマスクを組み合わせることで
ネットワークの範囲(サブネット)を指定することができる。

---

サブネットマスク(2進数)の

* 1の部分がネットワークアドレス
* 0の部分がホストアドレス

---

ネットワークの範囲の

* 先頭のアドレスはネットワークアドレス
* 末尾のアドレスはブロードキャストアドレス
* 先頭と末尾を除いた残りのアドレスはホストアドレス

なので
接続可能な機器の台数は
[ネットワークの範囲 - 2] となる。

---

(例)

| | 10進数| 2進数 |
| :--- | :--- | :--- |
|サブネットマスク | 255.255.255.0| 11111111.11111111.11111111.00000000|
|IPアドレス | 192.168.0.0|11000000.10101000.00000000.00000000 |

この例のネットワークの場合、
サブネットマスクの前半の3バイト255.255.255.に対応する
IPアドレス192.168.0.までがネットワークアドレス。
サブネットマスクの後半の1バイト0に対応する
IPアドレス0までがホストアドレス。

|IPアドレス| 割り当て |
| :--- | :--- | 
|192.168.1.0| ネットワークアドレス|
|192.168.1.255| ブロードキャストアドレス|
|192.168.1.1～254| ホストアドレス|

先頭の192.168.1.0がネットワークアドレス、
末尾の192.168.1.255がブロードキャストアドレス、
残りの192.168.1.1～254がホストアドレスとなり、
最大254台の機器を接続できる。

# ゲートウェイ
通信プロトコルが異なるネットワーク間の通信を中継する機器、ソフトウェアなどのこと。

LANとWANの境界に置かれることが多い。
家庭内LANではルーターが役割を果たすことが多い。

通信相手の経路がわからない場合はデフォルトゲートウェイと呼ばれる
上位のゲートウェイにデータを送信する。

#DHCP(Dynamic Host Configuration Protocol)

新しくネットワークに接続した機器に
IPアドレスを自動で割り振るための通信規約。

DHCPの機能を提供するのはDHCPサーバーと呼ばれる。
IPアドレスを受け取る側がDHCPクライアントと呼ばれる。

DHCPサーバーがDHCPクライアントに通知する設定情報には

* DHCPクライアントに割り振られるIPアドレス
* 上記IPアドレスのサブネットマスク
* デフォルトゲートウェイのIPアドレス

などがある。


家庭では主に
ブロードバンドルーターやWi-FiルーターがDHCPサーバーの役割を果たす。
企業の接続機器が多いネットワークでは専用のDHCPサーバーがある場合もある。


| メリット | デメリット |
| :--- | :--- |
| 人が手動でIPアドレスを設定する手間が省ける| たまにIPアドレスが変わることがある|
| IPアドレスの重複を避ける事ができる| |

#通信疎通確認コマンド

``` 
Linuxの場合
$ ping <IPアドレス or URL>
```

```
Windowsの場合
C:¥> ping <IPアドレス or URL>
```
指定したIPアドレスもしくはURLの機器に対して通信の疎通確認を行う。
通信に成功した場合は通信にかかった速度などが表示される。
通信に失敗した場合はタイムアウトになる。

#ネットワーク環境確認設定コマンド

``` 
Linuxの場合
$ ifconfig
```

```
Windowsの場合
C:¥> ipconfig
```
現在のネットワーク環境の確認・設定のためのコマンド。
オプション無しで

* IPアドレス
* サブネットマスク
* デフォルトゲートウェイ

などの確認ができる。

オプションをつけて
IPアドレスの再設定などもできる。

#参考サイト・書籍
[IT用語辞典 e-words](https://e-words.jp/)
[イラスト図解でよくわかる ITインフラの基礎知識](https://gihyo.jp/book/2018/978-4-7741-9600-8)
【shell】terminal内での簡単なテキスト文書装飾の仕組みを整える

- 文書作成において、見出しや重要情報への色や書式の指定は大事となっている。
- その際にWord等のツールを利用するのは少し手間。
- そのため今回はterminalでテキストファイルの簡単な色置換処理を行い表示する方法を記録する。

## 環境
- Mac OS X 10.15.6
- GNU bash, version 5.1.4(1)-release

## 結果
- 以下2つの対象のファイルを用意する。
    - `target.txt`
    - `color.sh`

- 対象ファイルの記述を以下のようにする。

```text:target.txt
私は${red}t_o_d${reset}です。

${bold}※todではありません${reset}

よろしくお願いいたします。
```

```sh:color.sh
#!/bin/sh

# リセット
export \
	reset="\e[0m"
# 書式
export \
	bold="\e[1m" \
	small="\e[2m" \
	italic="\e[3m" \
	underline="\e[4m" \
	hide="\e[8m"
# 色
export \
	black="\e[30m" \
	red="\e[31m" \
	green="\e[32m" \
	blue="\e[34m" \
	purple="\e[35m"

changeColor(){
	eval "declare c=\"$1\""
	printf '%b' "$c"
}

while IFS= read -r line;do
	l=$(changeColor "$line")
	printf '%s\n' "$l"
done <<< "$(<"$1")"
```
- 実行結果は以下。

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/d7524afa-41d2-c55e-d52c-8666d4a5c211.png)

## 補足

### テキストファイル内の記述
- 対象の文章をscript内のexportされた変数で囲う形で記述する。
- 記述例は以下。
    - 太字 : `${bold}対象${reset}`
    - 下線 : `${underline}対象${reset}`
    - **最後に`${reset}`で閉じる。**

## まとめ
- terminal内で簡単な装飾が行える文書作成の仕組みを整えられたので、きちんと活用。

## 参考
- https://devhints.io/ansi
- https://www.atmarkit.co.jp/ait/articles/1712/22/news019.html
- https://www.atmarkit.co.jp/ait/articles/1905/30/news017.html
AcctveRecord::Relationを利用してSQL発行回数を抑える方法

## AcctveRecord::Relationとは？
ActiveRecord::Relationではデータベースへの問い合わせ結果ではなく、**あくまで「どのようなSQLが発行されるか」という情報が保持されているに過ぎず、実際にSQLの実行結果が必要になるまではデータベースへのアクセスは実行されません。**
これを利用することでデータベースとの通信回数を抑えることが可能になります。

なお今回の内容には関係ありませんが、メソッドチェインを使用するためにもこの設計は必要不可欠です。
なぜならメソッドを呼び出した途端にSQLが実行されてしまう場合、まとめて全ての条件をメソッドに渡す必要があるためです。

## SQLの発行回数を抑える実例
![user_product_like.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053396/0c992fa7-6f3b-db7e-d0db-8baef2df2516.png)

このようなモデルを例にします。
idが1のユーザーのお気に入り商品を取り出す場合、以下のような方法でSQL発行回数を抑えることが可能です。

```
 product_ids = Like.where(user_id: 1).select(:product_id)
 products = Product.where(id: product_ids)
```
where,selectメソッド共にAcctveRecord::Relationを返すクエリインターフェイスであり、一行目の時点ではデータベースへの問い合わせは行われていません。
二行目で初めてデータベースへと問い合わせが行われるのでSQLの発行を一回に抑えることができました。


もちろんrails tutorial
[14.3.3 サブセレクト](https://railstutorial.jp/chapters/following_users?version=5.1#sec-scopes_subselects_and_a_lambda) のようにSQL文で以下のように書くことも可能ですが、せっかく便利なAcctveRecord::Relationが利用できるにもかかわらずわざわざSQL文を書く必要はなさそうです。

```
 product_ids = "SELECT product_id FROM likes
                     WHERE user_id = 1"
 products = Product.where(id: product_ids)
```

## 参考
・パーフェクト Ruby on Rails
・[Active Record クエリインターフェイス](https://railsguides.jp/active_record_querying.html#%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E3%83%90%E3%83%83%E3%83%81%E3%81%A7%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99)
・[railsチュートリアル　サブセレクトでなぜ高速化するのか](https://teratail.com/questions/249136)
windowのcmdでクリップボードのMD5とファイルのハッシュを比較

下記ファイルをどっかに置いとく。
僕の趣味としては常々スクリプトファイル置き場を作っているのでそこ


```bat:HitHash\HitHash2ClipMD5.bat
@echo off

for /f "usebackq delims=" %%a in (`powershell get-clipboard`) do set hash=%%a

echo clip:%hash%
echo file:%1

certutil -hashfile %1 MD5|findstr /I /X %hash%

if errorlevel 1 (
  echo "NOT MATCH"
) else (
  echo "matched"
)

pause
exit /b
```

# 使い方

1. クリップボードにMD5をコピーする
1. 上記batchに、downloadした検証対象をドラッグ&ドロップ
1. 結果を眺める

sendToに入れとけば`ドラッグ&ドロップ`の代わりに
`右クリックメニュー>送る>バッチファイル名`
の操作でどこからでも呼べる
バッチファイルをそのまま置くと権限がめんどい可能性があるのでショートカットにしている。

sendToって何って「送る」のこと
`%appdata%\microsoft\windows\sendTo`

# 何やってんの?

```bat
for /f "usebackq delims=" %%a in (`powershell get-clipboard`) do set hash=%%a
```

クリップボードの取得`powershell get-clipboard`と変数`hash`への格納

```bat
certutil -hashfile %1 MD5|findstr /I /X %hash%
```

ファイルのハッシュ値取得`certutil -hashfile`と一致確認`findstr`
`MD5`の部分を別のアルゴリズム名に置き換えれば別のハッシュ値とも照合できる。
`findstr`のオプションで`/I`はあるとダメな場合もあった気がする

```bat
if errorlevel 1 ( echo "NOT MATCH" ) else ( echo "matched" )
```

`certutil`と`findstr`とでエラーが出ると1以上になる。
`certutil`だとファイルがないとかで出ると思う。
`findstr`は検索結果がないと`errorlevel`を1にする。

# 懸念

クリップボードの内容とかファイル名(がくるはずの第一引数)とかを利用しているが、
ここに「>」が入り込んだりするとファイル更新かかっちゃったりして危険かもしれんので、本当はエスケープすべきかも。

`%hash:>=%`
とかでいいのかしらん

# 参考

https://maku77.github.io/windows/io/set-command-result.html

https://qiita.com/akimaru86/items/792bd6654b4d44bbf775

https://www.k-tanaka.net/cmd/findstr.php

https://www.atmarkit.co.jp/ait/articles/1903/14/news060.html
中間テーブルを使ってタグ検索機能を実装したい。

## ゴール

アーカイブページには全てのアーカイブを一覧で表示していますが、タグを使って絞り込み検索ができるようにしたいと思います。

## model作成、DB設計

tagを管理するtagモデルとアーカイブと紐付けるための中間テーブルでtag_relationモデルを作成しました。
既に作っているarchivesテーブルと新しくタグを管理する　、tagsテーブル、それから中間テーブルとしてtag_relationsテーブルを作成しました。

```db/migrate/************_create_tag_relations.rb
class CreateTagRelations < ActiveRecord::Migration[6.0]
  def change
    create_table :tag_relations do |t|
      t.references :tag, foreign_key: true
      t.references :archive, foreign_key: true
      t.timestamps
    end
  end
end
```

```db/migrate/2************_create_tags.rb
class CreateTags < ActiveRecord::Migration[6.0]
  def change
    create_table :tags do |t|
      t.string :name
      t.timestamps
    end
  end
end
```

## アソシエーション

```app/models/archive.rb
class Archive < ApplicationRecord
  has_many :tag_relations, dependent: :destroy
  has_many :tags, through: :tag_relations
end
```

```app/models/tag_relation.rb
class TagRelation < ApplicationRecord
  belongs_to :archive
  belongs_to :tag
end
```

```app/models/tag.rb
class Tag < ApplicationRecord
  has_many :tag_relations, dependent: :destroy
  has_many :archives, through: :tag_relations
end
```

tagとarchiveにそれぞれアソシエーションをするのですが、その際にtag_relationを通ってアソシエーションするように設定します。

## controllerの設定

今回は特にrootingで追加の設定をすることなく、indexにそのままタグ検索も入れ込みます。

```app/controllers/archive_controller.rb
class ArchiveController < ApplicationController
  def index
    @archive = params[:tag_id].present? ? Tag.find(params[:tag_id]).archives.page(params[:page]).per(15) : Archive.all.page(params[:page]).per(15)
  end
end
```
ちょっと長いですが、

```ruby
params[:tag_id].present?
```

ここで選択されたtag_idが存在している場合は、tagsテーブルからtag_idに一致するarchivesを探してくれます。
存在しない場合はArchive .allで全ての情報を取得します。

https://qiita.com/Kairi_Yasunnde/items/935dcdb8ec88b9ed9d91

## 次に向けて

今はドリルダウンでの選択ですが、これをよくある選択式にしたいと思います。
備忘録：springbootにおけるMySQL接続について

springでMySQL接続に苦労したので忘れないように

```
spring.datasource.url=jdbc:mysql://localhost:3306/App?serverTimezone=Asia/Tokyo
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=create
```
タイムゾーンを設定しないとエラー
その際、略三文字で指定すると怒られる➡エラー

driver classはmysqlのあとにcjを入れないと赤文字で警告？のようなものが出る。
意味は知らない
これから調べます。