OmniAICreator/Qiita-1.07M huggingface dataset:
[OCI Logging] Oracle cloud の Flow log の新機能を検証する

OCI で OCI Logging という新機能がリリースされました。
Compute instance 以外の OCI の資源の log が取得可能になりました。
その機能群のうち、FLow log という subnet を通過する通信の log が収集できるようになったのでその機能を確認します。

## Flow log でできること

- VCN の subnet 内のデータの入出力の log の取得
- Reject を含んだ通信が見えるので、何らかの攻撃を受けている場合、その分析がしやすい
- SEIM(Security Information and Event Management)可能
- Compute との間のトラフィックに限らず Load balancer や PaaS のトラフィックが見える
- Logging service connector で、Object Storage に保存したり、Log search サービスと連携できる
- 問題解決、モニタリングに使える
- network security の設定が間違っている場合 VCN の log に REJECT の記録が出るので DENY ルールが設定確認しやすい、
コンプライアンス準拠の確認に使える

## 作業手順
コンソールから
ロギング > ログ・グループ に移動
[ログ・グループの作成]で、まずログ・グループを作ります。
![rapture_20201013212436.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/de1cd8db-82da-fd29-8370-d464d3c1de9c.jpeg)
![rapture_20201013212452.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/e0013cd2-78a9-0ccd-7316-732aec4191c4.jpeg)

myFLowLog というログ・グループが作れました。
![rapture_20201013212509.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/f2ced50d-1b7a-edff-9b09-e39bf80d4026.jpeg)

続いて[ログ]の作成で、ログ・グループ内にログを作ります。
[名前] に任意の名前
[説明] に説明文、で[作成]

![rapture_20201013212541.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/c5603be1-9680-6ac1-3fff-4d5b1204bc35.jpeg)



## ログの確認
[ログ]のタブに移動し
[リソース・ログ]の有効化を選択し、
[ログ名]に名前を記入する。
![rapture_20201013212523.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/b2953a31-16c0-233a-6ceb-376567d10fa2.jpeg)

ログの取得が始まるので、[検索]に移動し
[フィールドまたはテキスト検索によるフィルタ]に検索項目を入力してログを絞り込みます、自動補完で候補が出現するのでいろいろ打ってみます
例えば data.destinationAddress =  とかなら宛先IPアドレスでの絞り込みです
![rapture_20201013212600.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/c5f6e3f5-cbbb-070f-c9be-e9d7a7cf7bce.jpeg)



JSON 形式のログの詳細を見てみると、気になるのが
startTime などの UNIX エポック表記の時間表記です。
![rapture_20201013212614.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/66f77c57-13e1-dc43-cfce-72f662c866f7.jpeg)
例えば
1602505762 は変換すると 2020 年 10 月 12 日 21:29:22 のことだと分かります。
https://keisan.casio.jp/exec/system/1526004418
![rapture_20201013212633.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3968/0db462b1-81a3-b0c9-85db-fec8d32cffcf.jpeg)

Flow logは、VCNの設定ミスがないかとかの確認をしたい時に便利そうな機能です。
## Links

##### Flow logs の発表
https://blogs.oracle.com/cloud-infrastructure/announcing-virtual-cloud-network-flow-logs-general-availability-for-oracle-cloud-infrastructure

##### OCI infrastructure logging の発表
https://blogs.oracle.com/cloud-infrastructure/announcing-the-general-availability-of-oracle-cloud-infrastructure-logging
(Flow logs は infrastructure logging に依存しています)
『キングオブコント』審査員の目利き力をCIで解析する

週末のヤフーニュースで、[『キングオブコント』三村マサカズの採点の妙　三村の「90点」が持つ意味](https://news.yahoo.co.jp/byline/horiikenichiro/20201011-00202581/) という記事が話題になっていました。記事は、お笑いコンテストでの採点の難しさに焦点を当てたもので、2020年『キングオブコント』において、さまぁ～ずの三村マサカズの採点と審査員コメントを例に、その難しさを解説したものでした。

# 審査結果の集計の難しさ

この例に限らず、一般に、複数の審査員が採点を行い、その合計点（もしくは平均点）をもって最終的な審査スコアとする方式では、2つの問題点が存在します。1つ目の問題点は、最終的な審査スコアが、採点のばらつきが大きい審査員の結果によって左右されるという点です。極端な場合、9人の審査員が89点、90点の二択で採点し、残りの1人の審査員が90点、100点の二択で採点すると、他の審査員の採点によらず、100点をつけた審査員一人の意見によって最終結果が決定されてしまいます。

もう一つの問題点は、（様々な要因によって）審査員の採点が失敗した場合も、他の採点者と同様、一律に合計計算に加味されるという点です。記事中でも、

>審査員残り4人が90点台なのに、自分一人が80点台というのは、たぶん、点数をオープンしたときに、そこそこあせるとおもう。三村マサカズの表情も「あ、やっちまった」とおもってるようにも見えた。

とありました。より一般的なコンテストの場合、審査員の中でも確かな目利き力で採点できる人と、相対的に自信のない状態で審査に臨んでいる審査員がいるため、通常の合計点で審査員の採点を一律に扱うと問題になりそうな場合があることは、想像に難くありません。

# CI技術による審査結果の解析

CI（コンセンサス・インテリジェンス）[^1]技術を用いることによって、こうした問題点を解決し、より審査員の総合的な意向を反映した審査結果を得ることができます。これは、[政府による補助金審査](https://prtimes.jp/main/html/rd/p/000000025.000019054.html)など、より精密な審査結果を得たい場面で用いられているアルゴリズムで、

* 審査結果の表から、審査員の目利き力を算出
* 審査員の目利き力を考慮した、総合スコア（CIスコア）を計算

という仕組みにより、審査結果を数学的に重み付けした総合スコアを導いています。この技術を使って、2020年『キングオブコント』の審査結果を分析してみます。

![](https://github.com/KazumaMurao/qiita_visits/blob/master/fig/1.png?raw=true)

まずは審査結果の表を準備します。[こちらのページ](https://telling.asahi.com/article/13767522)から、ファーストステージの結果を参照しました。審査結果のばらつき（標準偏差）を見ると、ばらつきを大きく採点しているグループ（ダウンタウン松本・バナナマン日村・さまぁ～ず三村）とばらつきを小さく採点しているグループ（さまぁ～ず大竹、バナナマン設楽）に分かれていました。また、各出場者が獲得した合計点を見てみると、1位（ジャルジャル）は突出している一方で、3位から6位（同率5位）までは458〜454点と狭いレンジの中にひしめき合っているようです。

![](https://github.com/KazumaMurao/qiita_visits/blob/master/fig/3.png?raw=true)

次に、CIアルゴリズムによる分析[^2]を行います。まず審査結果から算出した審査員の目利き力（CI目利き力）を見てみると、さまぁ～ず大竹、バナナマン設楽は上記のばらつきこそ控えめなものの、CI目利き力が高いことから、手堅くパフォーマンスを見極めていることが分かります。ダウンタウン松本、バナナマン日村の両審査員も、採点のばらつきを大きくしながらも着実なジャッジを行っているようでした。一方で、先の記事にも書かれていたさまぁ～ず三村は、今回の審査結果から見るとCI目利き力が低い分析結果となりました。これは記事にも記載されているように、番組進行の都合上、1組ずつ採点しなければならない問題[^3]などによって、周りの審査員と審査が噛み合わなかったことを示唆しています。このように、**一見すると判別することが難しい審査員の目利き力をスコアとして数値化・可視化できること**は、CI技術のひとつの特徴です（一般の審査では、番組放送のように審査員の仕草、コメントまで着目して洞察することは困難です）。

また、出場者のCI解析による審査スコア（CIスコア）を見てみます。1位のジャルジャルは元の得点が圧倒的だったため、CIスコアも同じように突出して1位となっています。一方で、単純な合計では密集していた3位から6位でしたが、審査員の目利き力を加味したCIスコアでは、3位と4位以降の差は広がり、逆に2位と3位の点数が近接するという結果になりました。ファイナルステージへの進出は3位までであったため、結果としてこれらの3組はファイナルに進むのに相応しかったということが分かりました。

その他、細かく見ると出場者の順位に変動があるようです（滝音：同率8位→9位、ザ・ギース：4位→6位、ニッポンの社長：同率5位→4位）。採点結果の単純合計とCIスコアの比較で、番組を視聴した感覚と合致した部分はあるでしょうか。

# 終わりに

今回の『キングオブコント』審査に限らず、年末に向けた様々なお笑いコンテスト、スポーツの採点競技など、審査員による採点結果が関わる場面は世の中に数多く存在します。採点結果によっては、目利き力を考慮することで1位が変動する場合もあり得ます。今後も機会がありましたら、話題の審査結果について、審査員の目利き力を加味したCI分析結果を公開していきたいと思います。

VISITS Technologiesでは、CI技術を含め、世の中のイノベーションを創発するテクノロジーを研究・開発する仲間を募集しています。[採用](https://visits.world/recruit)や[CI技術の適用](https://i-deagram.com/cases)に関して関心のある方はお気軽にご連絡ください。

[^1]: 株式会社VISITS Technologiesが開発、特許取得したアルゴリズム
[^2]: （アルゴリズムについて補足）評価結果から評価者の目利き力を推定し、最善の選択肢を算出する問題は、鶏と卵の関係にあります。つまり「真に最善の選択肢は、評価者の目利き力の重みが分かることによって決めることができる」「評価者の目利き力の重みは、選択肢の真の良し悪しが分かることによって求めることができる」という依存関係を同時に解決しなければなりません。一見するとこれらの両立は不可能のように見えますが、CIアルゴリズムでは、機械学習や音声認識で用いられる反復法アルゴリズムをこの問題に適用し、数学的に最適解を導いています
[^3]: 本来のCIアルゴリズムは、自分の採点を提出前に修正可能な環境を想定しています
Visual Transformers: Token-based Image Representation and Processing for Computer Vision(2 June 2020)を読む

#概要

https://arxiv.org/pdf/2006.03677.pdf
Visual Transformers: Token-based Image
Representation and Processing for Computer Vision
を読む。

概要に書かれているのが本当なら、
**パラダイムシフト**だが。。。
それほどの内容なのか？

まだ、全然、読めてません、、追って。


#Abstractを読む

##Abstract原文
https://arxiv.org/pdf/2006.03677.pdfのアブストラクト

>Computer vision has achieved great success using standardized image representations – pixel arrays, and the corresponding deep learning operators – convolutions.
In this work, we challenge this paradigm: we instead (a) represent images as a set of
visual tokens and (b) apply visual transformers to find relationships between visual
semantic concepts. Given an input image, we dynamically extract a set of visual
tokens from the image to obtain a compact representation for high-level semantics.
We then use visual transformers to operate over the visual tokens to densely model
relationships between them. We find that this paradigm of token-based image representation and processing drastically outperforms its convolutional counterparts
on image classification and semantic segmentation. To demonstrate the power of
this approach on ImageNet classification, we use ResNet as a convenient baseline
and use visual transformers to replace the last stage of convolutions. This reduces
the stage’s MACs by up to 6.9x, while attaining up to 4.53 points higher top-1
accuracy. For semantic segmentation, we use a visual-transformer-based FPN
(VT-FPN) module to replace a convolution-based FPN, saving 6.5x fewer MACs
while achieving up to 0.35 points higher mIoU on LIP and COCO-stuff.


##Abstract Google翻訳（未加工）

>コンピュータービジョンは、標準化された画像表現（ピクセル配列、および対応する深層学習演算子）の畳み込みを使用して大きな成功を収めています。この作業では、このパラダイムに挑戦します。代わりに、（a）画像を視覚トークンのセットとして表現し、（b）視覚トランスフォーマーを適用して視覚的意味概念間の関係を見つけます。入力画像が与えられると、画像から視覚トークンのセットを動的に抽出して、高レベルのセマンティクスのコンパクトな表現を取得します。次に、ビジュアルトランスフォーマーを使用してビジュアルトークンを操作し、それらの間の関係を密にモデル化します。トークンベースの画像表現と処理のこのパラダイムは、画像分類とセマンティックセグメンテーションの畳み込み対応物よりも大幅に優れていることがわかります。 ImageNet分類に対するこのアプローチの力を実証するために、便利なベースラインとしてResNetを使用し、畳み込みの最終段階を置き換えるためにビジュアルトランスフォーマーを使用します。これにより、ステージのMACが最大6.9倍減少し、トップ1の精度が最大4.53ポイント高くなります。セマンティックセグメンテーションでは、ビジュアルトランスフォーマーベースのFPN（VT-FPN）モジュールを使用して畳み込みベースのFPNを置き換え、MACを6.5倍削減し、LIPおよびCOCOで最大0.35ポイント高いmIoUを実現します。

#Abstractだけから感じる内容の予想（あまり意味のない項であるが。。。）
本文を読む前のコメント。

* 「海」に浮かぶ「船」とか、複数の意味をもつトークンの連携で、精度を上げるようなものか。

* 「ビジュアルトランスフォーマー」の意味が取れてないのが、理解のネック。

* 学習の方法、アノテーションの方法が想像できない。


#今後
この論文の特徴などを追って検討します。

#まとめ
コメントなどあればお願いします。
Python初心者向け。Collectionというプログラミング言語の一般用語を知らないと混乱するかも。

#概要
Python初心者向け。Collectionというプログラミング言語の一般用語を知らないと混乱するかも。
自分がそれに該当したので、そのことを記事にする。

#Collectionというプログラミング言語の一般用語

引用: https://en.wikipedia.org/wiki/Collection_(abstract_data_type)

>In computer science, a collection or container is a grouping of some variable number of data items (possibly zero) that have some shared significance to the problem being solved and need to be operated upon together in some controlled fashion. Generally, the data items will be of the same type or, in languages supporting inheritance, derived from some common ancestor type. A collection is a concept applicable to abstract data types, and does not prescribe a specific implementation as a concrete data structure, though often there is a conventional choice (see Container for type theory discussion).
>
>Examples of collections include lists, sets, multisets, trees and graphs.

この意味で、**コレクション**というのは、あまり、日本語には馴染んでないのでは。**コンテナ**とかは、比較的見るが。

#普通、Pythonでcollecitionというと。
python collection で検索すると、
どうしても、

https://docs.python.org/ja/3/library/collections.html

などの、

collections --- コンテナデータ型

の**collectionsモジュール**に、引き込まれる。

説明が、

>このモジュールは、汎用の Python 組み込みコンテナ dict, list, set, および tuple に代わる、特殊なコンテナデータ型を実装しています。

何か、あたかも、
dict, list, set
あたりは、コレクションでないように読めるが。。。
このあたりは、**プログラミング用語でいうところのコレクションの代表例である。**

#まとめ
特にありません。
単なる情報共有。自分が、少し、勘違いしていたので。
コメントなどあれば、お願いします。
Windows開発に役立つソフトウェア

#一覧

1. Windows Terminal
2. Process monitor
3. Everything
4. Dependencies
5. Microsoft Garage Mouse without Borders
6. Doxygen

#link
[**Windows Terminal**]
(https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701?activetab=pivot:overviewtab)
コマンドプロンプト、powersehllなどが一つのウインドウ内でタブまたは画面分割できます。複数ウインドウを立ち上げる必要がある開発環境にはとても便利です。
![画面](https://devblogs.microsoft.com/commandline/wp-content/uploads/sites/33/2020/05/terminal-1.0.png)

[**Process monitor**]
(https://docs.microsoft.com/en-us/sysinternals/downloads/procmon)
あるプロセスが出力したコマンドライン引数を見ることができ、デバッグに役立ちます。
![画面](https://docs.microsoft.com/en-us/media/landing/sysinternals/procmon-main.gif)

[**Everything**]
(https://voidtools.com/)
1度indexを作成したら、高速でPC内のファイル、フォルダ検索を行ってくれます。
![画面](https://www.voidtools.com/support/everything/Everything.Search.Window.png)

[**Dependencies**]
(https://github.com/lucasg/Dependencies)
dllやexeの依存関係を調べられます。何のdllが足りなくて動かないのか確認できます。
![画面](https://github.com/lucasg/Dependencies/raw/master/screenshots/UsageExemple.gif)

[**Microsoft Garage Mouse without Borders**]
(https://www.microsoft.com/en-us/download/details.aspx?id=35460)
一台のマウス、キーボードを複数のPCで共有できます。デスクトップ画面とノートの画面間でシームレスに操作可能です。

[**Doxygen**]
(https://www.doxygen.nl/index.html)
指定の方法でコメントを書き、graphvizと組み合わせることで、関数の呼び出し関係図、class図をhtmlで作成してくれます。
![画面](https://romanegloo.files.wordpress.com/2012/03/callgraph_mmap_region.png)
Python.orgのglossaryは、口調（書きっぷり）が微妙だが。。。端的に表現されている。ちょっと、意識できていない情報を添えてくれている。

#概要
**Python.orgのglossary**

  https://docs.python.org/ja/3/glossary.html

は、口調（書きっぷり）が微妙だが。。。端的に表現されている。**ちょっと、意識できていない情報を添えてくれている。**
面白いので、情報共有。

#例
##package

(引用：https://docs.python.org/ja/3/glossary.html）

>(パッケージ) サブモジュールや再帰的にサブパッケージを含むことの出来る module のことです。専門的には、パッケージは \_\_path\_\_ 属性を持つ Python オブジェクトです。

##object

(引用：https://docs.python.org/ja/3/glossary.html）

>(オブジェクト) 状態 (属性や値) と定義された振る舞い (メソッド) をもつ全てのデータ。もしくは、全ての 新スタイルクラス の究極の基底クラスのこと。

##slice

(引用：https://docs.python.org/ja/3/glossary.html）

>(スライス) 一般に シーケンス の一部を含むオブジェクト。スライスは、添字表記 [] で与えられた複数の数の間にコロンを書くことで作られます。例えば、 variable_name[1:3:5] です。角括弧 (添字) 記号は slice オブジェクトを内部で利用しています。

#まとめ
特にありません。
ちょっと、注目すべきかな、、、見てみるべきかな。。。と感じたので、記事にしました。
コメントなどあればお願いします。
Python、コロン(:)を使わずにスライスする。a.__getitem__(slice(3,5))。

#概要
Pythonにて、コロン(:)を使わずにスライスする方法に辿りついたので、情報共有。
深い意味はありません。
あまり、めぐり合うことがないと思ったので、単なる情報として。

#Python、コロン(:)を使わずにスライスする。やり方。

```
>>>
>>> a = [10,20,30,40,50,60,70]
>>> a.__getitem__(slice(3,5))
[40, 50]
>>>
```

スライスも**\_\_getitem\_\_**です。
**slice(3,5)**という書き方、あまり出会わないかも。

#まとめ
特にありません。
別のことを検討していて、出会ったので、記事にしました。
コメントなどあれば、お願いします。
**この記事のレベルは、さすがに知ってたという方は、
コメント欄のほうを。。。御覧あれ（他力っ）**
DMiMEを導入してみる。

# 経緯
知り合いの医学生が医薬用語の変換がメンドイらしく、
DMimeという変換辞書をMacにいれるお手伝いをすることになりました。

# 注意
これはmac用の設定方法です。

# 準備

1. [ダウンロードページ](https://ja.osdn.net/projects/dmime/downloads/67207/DMiME-1.1-mac.zip/)でDMiME-1.1-mac.zipをダウンロードします。
（最新バージョンは[こちらのページ](https://ja.osdn.net/projects/dmime/)より確認できます。）
2. ダウンロードしたDMiME-1.1-mac.zipをダブルクリックすることで解凍し、DMiME-1.1-macフォルダを取り出します。(この中の「DMiME-1.1-mac.txt」を利用します。)

# 導入方法
1. 本体画面右上の文字のアイコン（バッテリーアイコンの左にあります。）をクリックし、1番下にある「”日本語”環境設定を開く」をクリックします。
2. キーボード設定画面が開かれるかと思うので、そこで「入力ソース」を選択します。
3. 一番下にスクロールし、準備ステップで用意した「DMiME-1.1-mac.txt」を「追加辞書」の欄にドラッグアンドドロップします。
4. 完了


参考
-
[DMiMEのインストールから使い方解説｜医学用語変換辞書](http://xn--1-19t205kpxao3y8re6uu3x0f.xyz/2018/11/24/dmimeinstall/)のその2の手法
ディレクトリの種類

#ディレクトリ
**ディレクトリとはコンピュータ上で複数のファイルを整理するためのファイルの入れ物のことです。簡単に言ってしまえば、 フォルダ のことを指します。**

ディレクトリにはいくつか種類があります。今回は、「ルートディレクトリ」、「カレントディレクトリ」、「ホームディレクトリ」を説明します。


![アイコン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762918/4d81c32d-e699-8141-73fd-636a86865ed2.png)



![アイコン２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762918/9cd794e4-6bdc-e73f-13d0-93799fc5f39e.png)


#ルートディレクトリ
**ディレクトリは階層構造になっているので、あるディレクトリは他のディレクトリに属しています。ルートディレクトリはその 階層構造の一番上にあるディレクトリのことです。**

![top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762918/d962ec11-1de3-854d-bc34-04820acae6b6.png)

#カレントディレクトリ

**ターミナルで 現在作業中となるディレクトリのことをカレントディレクトリと呼びます。ターミナルではここを基準に、PCに命令を出していきます。カレントディレクトリは先ほどターミナルで~と表示されていました。**

ターミナルでは必要に応じて作業するディレクトリを移動しコマンドを実行していきます。移動するたびにカレントディレクトリが指し表すディレクトリは変わります。

#ホームディレクトリ

**ホームディレクトリは、 新規にターミナルを立ち上げた場合に作業中となるディレクトリのことです。Macでのデフォルトのホームディレクトリは/Users/ユーザ名となり、ターミナルでは~で表されます。**

これらの説明からターミナルの画面を見て確認してみましょう。

![ターミ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762918/0e16b898-1338-e827-b3a7-04ef8a9c6dfb.png)

この画面上ではカレントディレクトリは~になっているので、
現在作業中のディレクトリ、つまり 現在のカレントディレクトリは
ホームディレクトリを指している ということになります。

#まとめ

**ディレクトリとはコンピュータ上で複数のファイルを整理するためのファイルの入れ物のこと。
ホームディレクトリは、 新規にターミナルを立ち上げた場合に作業中となるディレクトリのこと。
カレントディレクトリは、ターミナルで現在作業中となるディレクトリのこと。**


####以上
Flutter Firebase「fatal error: module 'cloud_firestore' not found @import cloud_firestore;」が出た時の対処法

##背景
7月に初めてFlutterにFirebaseを追加した時には出なかったが、今回はエラーが出てしまったので、原因と解決法を忘却録として残します

##開発環境
PC:macOS Catalina
エディター：Visual Studio Code
XCode:Version 12.0.1 (12A7300)
Flutter: 1系

##内容
FlutterにFirebaseを追加しようとして、以下のようなエラーが発生
エラーはflutter runコマンドを実行して発生（VSCodeからのデバッグでも同様）

```
Running pod install...                                              9.8s
Running Xcode build...                             
 └─Compiling, linking and signing...                         2.0s
Xcode build done.                                           170.4s
Failed to build iOS app
Error output from Xcode build:
↳
    ** BUILD FAILED **
Xcode's output:
↳
/Users/yourName/flutterProjectName/ios/Runner/GeneratedPluginRegistrant.m:10:9: fatal error: module
    'cloud_firestore' not found
    @import cloud_firestore;
     ~~~~~~~^~~~~~~~~~~~~~~
    1 error generated.
    note: Using new build system
    note: Building targets in parallel
    note: Planning build
    note: Constructing build description

Could not build the application for the simulator.
Error launching application on iPhone 11.
```

###検索で見つけた方法
検索すると以下のような方法で解決したとあったので、試してみました
作成したflutterのプロジェクトディレクトリで実行します

```
flutter clean
cd ios
rm -rf Pods
pod install
cd ..
flutter run
```
上記の通りにやってもまた同じエラーが発生しました

##原因
flutter runする前にPodfileを作成してしまったことが原因でした

そもそもpodfileを作成してしまった原因は、
[Firebase を iOS プロジェクトに追加する](https://firebase.google.com/docs/ios/setup) を見ていたこと
→本当は[こっち](https://firebase.google.com/docs/flutter/setup)が正しい

##解決策

まずは、検索で見つけた方法と同じようにPods関係のファイル、ディレクトリを削除

```
flutter clean
cd ios
rm -rf Pods
rm Podfile.lock Podfile
```

削除後、以下のコマンドをflutterのプロジェクトディレクトリで実行します

```
flutter run
```

Pod initコマンドとは違う内容が書かれた Podfile が作成され、シミュレーターと接続できる

##参考
https://github.com/FirebaseExtended/flutterfire/issues/1979

https://note.com/kyklades/n/n4143c5a16c1f
ノーコードWebサイト作成サービス4つを軽く使ってみた感想

# ノーコードでWebサイト作れるサービスの違いって何なん？
今ぐんぐん大きくなっている、ノーコード市場。
中でも、コーディング出来なくてもWebサイトが作れる！と言うのは昔から人気ですよね。

ノーコードでWebサイトを作れるのはコーディングしない人にとってかなり魅力的なサービスですが、正直いっぱいありすぎて…何を選んだら良いのか分からん。
実際どれが良いん？
と言う声もよく聞きます。

私も純粋に気になったので、「WordPress.com」「Wix」「Jimdo」「STUDIO」の4つを軽く使ってみて、比べてみました。
※今回はあえて「ノーコードでWebサイトを作成する場合」という観点で見てみました。


# WordPress.com
[WordPress.com](https://ja.wordpress.com/)
言わずと知れたWebサイト構築サービス。
主に自分で借りたレンタルサーバーにインストールして作成&公開する。
近年はノーコードと言うより、結局コーディングして拡張するのが主流になっているように思いますが。。
自由度が高く、拡張しやすいので企業サイトなどにもよく使われています。

* メリット
 * 巷に日本語の情報が溢れているので扱いやすい。本もたくさん出ている。
 * 自由度、拡張性が高いので、ブログからメディア系サイト・企業サイト・ECサイトまで何でもござれ。
 * 無料のプラグインや無料テーマが大量にあるので気軽に機能追加できる。
 * 自前のレンタルサーバーに構築するため、設定ファイル等を細かくいじったりできる。
* デメリット
 * 基本がブログ特化なので、ブログ機能を全く使わない場合はちょっと勿体ない気もする。
 * 無料テーマにはシンプルなデザインが多く、凝ったデザインにするにはカッコいい有料テーマを買うか、コーディングでの拡張が必要。


# Wix
[Wix](https://ja.wix.com/)
パワポを作るように、直感的にWebサイト作成ができるサービス。
数個の質問に答えるだけで、AIが「作りたいのはこんな感じのサイトっしょ？」といい感じのテンプレを作成してくれる『Wix ADI』という超便利な機能も。
デザインがそこそこカッコいいので、イベントサイトやポートフォリオサイト、イケてるネットショップとかに向いているかなと思います。

* メリット
 * 直感的にサクサク作れる上、デザインが分からなくてもそれなりにカッコよくなる。
 * 作成〜公開、運用まで全てWixだけで完結するので、レンタルサーバーを借りなくて良い。
 * ネットショップ開設機能やブッキング機能など、幅広く便利な機能を追加できる。
 * 作成した複数のサイトを「マイサイト」でまとめて管理できるのが地味に便利。
* デメリット
 * 若干公式の日本語訳が分かりづらかったり、まだ英語での情報が多かったりする。
 * サポートが手厚い分、自由度は低く細かい部分の調整がしにくい。


# Jimdo
[Jimdo](https://www.jimdo.com/jp/)
とにかく操作が滅茶苦茶に簡単。AIビルダーで楽ちんです。
基本はWixと似ていて、直感的な操作でサクっと作成できて「Wixを超簡単にした」という感じ。
NPO団体とか、個人事業やってる日本人がよく使ってるような（勝手な）イメージがありますね。

* メリット
 * 最初の作成画面で、ボタン一つでFaceBookと連携できるので個人事業主とかに超向いてる。
 * Wix同様、作成〜公開、運用まで全て完結できるのでレンタルサーバー不要。
 * とにかく簡単。Wixより簡単。3分でWebサイトが作れる。
 * 使ってる日本人が多いからか、結構日本語の情報が多め。
* デメリット
 * デザインは良くも悪くも普通。凝ったデザインにしたい場合は微妙。
 * これもWix同様、自由度が低く細かいデザイン調整や機能追加などはしにくい。


# STUDIO
[STUDIO](https://studio.design/ja)

これ、恥ずかしながら昨日まで知りませんでした。カッコいいですね。
cookpadの特設サイト(https://athome.cookpad.com/) が事例として紹介されてますね。
CMSの記事上限数も少なめなので、デザイン重視のイケてる採用サイトや特設サイトに向いているような気がします。

* メリット
 * デザインがカッコいい、イケてる。STUDIOに関する情報発信してるサイトもかっこいいのが多い。
 * 「STUDIO for Teams」ではリアルタイムで複数人でのデザインができ、チームでの作成がしやすい。今後はコーディングでの機能追加もリアルタイム反映される予定らしい。
 * px単位でのレイアウトや写真の色彩など、デザインをかなり細かく調整できる。
 * イケてるテンプレのレイアウトがpxレベルで分かるし白紙からも作れるし、Webデザインの勉強にはめっちゃ便利な気が。
* デメリット
 * デザイン部分を細かく触れる分、操作できることがかなり多いので戸惑いがち。メリデメは表裏一体。
 * FREE,BASICプランだとCMSが５記事制限なので、記事をたくさん更新していきたい場合は微妙。（PROは1000記事まで）


以上、4つのサービスを実際に触ってみて感じたことでした。

* どうしたらいいかよく分からんけどサクっとサイト作りたい！って方はWixかJimdo
* ノーコードでの機能追加を重視するならWix
* ある程度デザインにこだわってカッコいいサイト作りたい！って方はSTUDIO
* 長期スパンで記事投稿し続けてファン獲得したいし拡張性も欲しい！って方はWordPress
<br>
が良いのではないかと思いました。

コーディングする身からしたらやっぱりWordPressが一番とっつきやすい気はしますが、STUDIOは注目のサービスかなと思いますね！
個人的には、STUDIOのコーディングのリアルタイム反映がどんな感じか触ってみたいものです。
Spring Bootで実装したREST APIから一瞬でAPIドキュメントを生成

# はじめに
SpringBoot初心者向けです。マイクロサービスの実装にSpringBootを使うケースは多いと思いますが、最近勉強し始めた初心者にとって、UIの無いサービス開発って何となく心理的なハードルが高かったりするのではないでしょうか。（ん？そんなことないよ、という方はスルーしてくださいww）

その心理的ハードルが何かというと、APIテストの前にサクッとうまく動くかテストしたいよね、という時にCurlでコマンドを打たなければならないということ。普段からCurlはよく使ってるよ、というケースを除けば、毎回それなりに長めのコマンドを書き方を思い出しながら（もしくは調べながら）タイプするのはとても面倒です。

そんな初心者にとって、その面倒な部分を一瞬で解消できるのがSwagger-uiです。APIドキュメントの作成ツールとしてはデファクトになりつつあると思っていますが、このSwagger-uiは、既に出来ているソースに数行追加するだけで、簡単に自動生成出来てしまいます。しかもこのSwagger-uiを使えば、GUIでAPIの簡単なテストも出来てしまいます。（実際には後ろでCurl叩いてくれている訳ですが）

という訳でSpringBootで作成したREST APIからSwagger-uiを生成するまでの流れをまとめておきます。（自分の備忘メモとして）

# 依存関係

Mavenを使っています。以下の依存関係を`pom.xml`に追加します。

```Maven:pom.xml

<pom>
    <repositories>
        <repository>
          <id>jcenter-snapshots</id>
          <name>jcenter</name>
          <url>https://jcenter.bintray.com/</url>
        </repository>
    </repositories>

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-boot-starter</artifactId>
        <version>3.0.0</version>
    </dependency>
</pom>

```
今回は現時点（2020/10/13）で最新の`Springfox3.0.0`を使用しています。3系へのバージョンアップで最低限必要なアノテーションの数も減りました。とりあえずサクッとという用途であれば、依存関係にこの設定を追加するだけでSwagger-uiは起動します。

# Configに説明用のBeanを追加

依存関係の設定のみだと`error-basic-controller`が表示されてしまうので、それを除きたい場合は、以下のように`@Configuration`アノテーションを付けている`Config`クラスに`@Bean`アノテーションを付けた`Docket`クラスを追加しておきます。

```java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RestController;

import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

@Configuration
public class MicroserviceConfig {

	@Bean
	public Docket customImplementation() {
		return new Docket(DocumentationType.SWAGGER_2)
				.select()
				.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
				.paths(PathSelectors.any())
				.build();
	}
}
```

今回は省略していますが、上記`Docket`クラスではAPI内容の説明などの記載もできますので、その辺はまた興味があれば調べてみてください。

# Swagger-uiを表示

これであとは、SpringBootを起動して http://localhost:8080/swagger-ui/ にアクセスすると以下の画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260591/e35c7da4-aab7-58b7-70d9-4bbe2d2eb2a9.png)
あとはポチポチとGUIで`JSON`ファイルの中身を編集して実行すれば、サクッと簡単な疎通確認は出来てしまいます。

# おわりに
こんな簡単にできるなんて素晴らしいですね。Springfox3系は以前のバージョンよりも手間が減っているので、より導入のハードルは下がっていると思います。初心者の方には特におススメです。当記事が少しでも誰かの参考になれば幸いです。
Ruby 文字列を切り取る

## はじめに
学習用のメモになります

スペース区切りの2つの整数と、文字列が入力されるので、2つの整数の範囲の部分文字列を出力してください。

```
入力例1
2 6
this is a pen

出力例1
his i
```
```
入力例2
2 6
Welcome to the paiza! I`m studying ruby!

出力例2
elcom
```

## ソースコード

```rb
nums = gets.chomp.split(" ")
str = gets.chomp.split("")

for i in (nums[0].to_i - 1)..(nums[1].to_i - 1)
     print str[i]
end
```

## 解説

```rb
nums = gets.chomp.split(" ")
str = gets.chomp.split("")
```
入力された数字と文字列を`nums`は出力範囲、`str`は文字列を分解してそれぞれ代入する

getsメソッド：　入力を一行ごとに「文字列」で受け取る。
chompメソッド：　文字列の改行を取り除く。
splitメソッド：　文字列を分解して配列にする。

```rb
for i in (nums[0].to_i - 1)..(nums[1].to_i - 1)
```

for文で`nums[0]`から`nums[1]`の範囲をそれぞれ整数に変換してi変数に代入する

```rb
print str[i]
```
strの文字列の中のi変数の範囲を出力する


# 最後に
もし間違っているところがありましたらご指摘していただけると幸いです。
Money::Currencyをテストのときに初期化する話

[RubyMoney](https://github.com/RubyMoney/money)を使ってお金の管理をしているプロダクトは多いのではないでしょうか。
RubyMoneyはデフォルトで通貨の設定を提供してくれていますが、要件に応じてその設定を上書きすることもできます。
多くのシステムの場合、アプリのビルド時に一度設定をしてしまえばその後設定を変更することはないと思いますが、ことテストの文脈においては、一度変更してしまった設定を初期化したいことがあるのではないでしょうか。

この記事では、そんなときどうやってRubyMoneyの通貨設定を初期化するかを解説します。

前提として、通貨の設定は下記のように行います。


```ruby
cad = Money::Currency.find(:cad)

cad.name # => Canadian Dollar

Money::Currency.register(
  :priority            => cad.priority,
  :iso_code            => cad.iso_code,
  :name                => 'Something Different',
  :subunit             => cad.subunit,
  :subunit_to_unit     => cad.subunit_to_unit,
  :thousands_separator => cad.thousands_separator,
  :decimal_mark        => cad.decimal_mark
)

cad = Money::Currency.find(:cad)
cad.name # => Something Different
```

`Money::Currency` クラスは `@table` というインスタンス変数で通貨の設定を管理しています。よってこのインスタンス変数をリセットできればよさそうです。
しかし仕様上直接 `@table` にアクセスはできないので、下記のようにして初期化を行います。

```ruby
 Money::Currency.instance_variable_set('@table', nil)
 Money::Currency.table # => reloading the initial setting
```

簡単ですね。と思いきや上記の初期化を行ってもまだ上書きされた値を受け取ってしまいます。

```ruby
cad = Money::Currency.find(:cad)
cad.name # => Something Different
Money::Currency.instance_variable_set('@table', nil)
Money::Currency.table
cad = Money::Currency.find(:cad)
cad.name # => Something Different. 初期化されていない！
```

詳しくライブラリの実装を追うと、その答えが分かります。一度変更された設定は、アプリケーションが起動されてから、つまりRubyプロセスが立ち上がってから、そのプロセスが終了するまで、一貫性を持っている必要があります。
その仕様を実現するため、さらに `Money::Currency` はインスタンス自体をクラス変数として管理しています。
そうすることで、ライブラリユーザーである我々は、開発中設定について気にする必要がなくなると言うわけです。
ということを踏まえた上で、改良したコードが以下です。

```ruby
cad.name # => Something Different
Money::Currency.class_variable_set('@@instances', {})
Money::Currency.instance_variable_set('@table', nil)
Money::Currency.table
cad = Money::Currency.find(:cad)
cad.name # => Canadian Dollar
```

無事初期化されました、このコードをspec_helperなどに書いておけば、テスト中の `Money::Currency` の設定上書きに依存しないテストを担保することができます。

でもわざわざこの設定を書くのって面倒くさいですよね。
実は最新の`RubyMoney::Money`のmasterはこの初期化を行うAPI `Money::Currency.reset!` を提供しています。
[これがその変更のプルリクエスト](https://github.com/RubyMoney/money/pull/941)です。
もしこの機能を使ってみたい方がいれば最新のmasterをインストールしてみてください。
`RubyMoney::Money` の次のアップデートバージョンが早くリリースされることを願っています。

英語版は[こちら](https://dev.to/kazu9su/initialize-money-currency-on-the-test-context-30f3)
Railsでマイグレーション時にファイル名を間違えた時の対処法

#マイグレーション作成時ファイル名を間違えた😭
##とても簡単！
```java:config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: anyone2_development

~省略~
test:
  <<: *default
  database: anyone2_test

#
~省略~
production:
  <<: *default
  database: anyone2_production
  username: anyone2
  password: <%= ENV['ANYONE_DATABASE_PASSWORD'] %>

```
#<font color="Red">anyone2</font>という所を本当は<font color="Red">anyone</font>としたかった訳なので該当箇所を全て変更します
```java:config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: anyone_development

~省略~
test:
  <<: *default
  database: anyone_test

#
~省略~
production:
  <<: *default
  database: anyone_production
  username: anyone
  password: <%= ENV['ANYONE_DATABASE_PASSWORD'] %>

```
#その後再び
```java:ターミナル
rails db:create
```
#ここで注意点があって、このままだとMySQLやらのデータベースに<font color="Red">anyone2</font>と<font color="Red">anyone</font>の2つともデータベースに残ってしまっている状態なので、先ほどrails db:createした後にもう一度database.ymlの記述をanyone2の時の状態に戻し、ターミナルで
```java:ターミナル
rails db:drop
```
##を記述すると該当のデータベースが削除された状態になります！
#現場からは以上です！
NTPに頼らず、Symbol from NEMブロックチェーンで同期された現在時刻を取得する


今回はブロックチェーンとは少し離れた内容です。
Symbol from NEM では内部で独立したネットワーク時刻を保有しています。
これを外部から利用するための方法です。NTPサービスなどにアクセスする必要はありません。

#### 事前準備
```js
NODE = 'https://sym-test.opening-line.jp:3001';

(script = document.createElement('script')).src = 'https://xembook.github.io/nem2-browserify/symbol-sdk-pack-0.21.0.js';
document.getElementsByTagName('head')[0].appendChild(script);
```

#### ライブラリインポート
```js
nem = require("/node_modules/symbol-sdk");
nodeHttp = new nem.NodeHttp(NODE);
networkHttp = new nem.NetworkHttp(NODE);
```

#### Symbol のエポックタイム取得
``` js
props = await networkHttp.getNetworkProperties().toPromise()
epoch = nem.UInt64.fromNumericString(
  props.network.epochAdjustment.replace("s","")
) * 1000
```

Symbol from NEMでは2019 11/11 0時(GMT)がエポックタイムとして指定されているため、その秒情報をネットワークより取得しておきます。

#### 現在時刻取得
```js
nodeTime = await nodeHttp.getNodeTime().toPromise()
console.log(new Date(epoch + nodeTime.receiveTimeStamp.compact()));
```

ノードより現在時刻を取得してエポックタイムと足し合わせてJavaScriptのDate関数より現在時刻を出力します。

> Wed Oct 14 2020 00:10:51 GMT+0900 (日本標準時)

無事出力されました。

ちなみにライブラリを使用したくない場合は以下のエンドポイントより情報を取得できます。


#### network. epochAdjustment
> http://api-01.ap-northeast-1.0.10.0.x.symboldev.network:3000/network/properties

#### communicationTimestamps.receiveTimestamp
> http://api-01.ap-northeast-1.0.10.0.x.symboldev.network:3000/node/time
deviseのエラーメッセージが表示されない

# 結論
rubyをhtmlで表示するための<%= %>が<% %>になっていた。時間を返してくれ。。

# 具体的に
renderで部分テンプレートでエラーメッセージを呼び出していた。

####誤
```
  <% render "shared/error_messages", model: f.object %>
```

###正
```
  <%= render "shared/error_messages", model: f.object %>
```

気をつけてください。。

以上
マイブーム |> if(do: "Yes", else: "No")  [Elixir]

# はじめに
- ある条件に合致するときは"Yes"、そうではない場合は"No"を返しなさいという関数をつくりたいとします
- [AtCoder](https://atcoder.jp/)の問題にあったりします
    - [A - Fourtune Cookies](https://atcoder.jp/contests/arc105/tasks/arc105_a)
- いろいろな書き方があるおもいますが、マイブームはpipe operator[|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)を使った`|> if(do: "Yes", else: "No")`です
- 以降、この記事ではリストの中身が100より小さいときは"Yes"、そうではないときには"No"とします

# マイブーム

```elixir
iex> [1, 2, 3] |> Enum.all?(& &1 < 100) |> if(do: "Yes", else: "No")
"Yes"

iex> [1, 2, 101] |> Enum.all?(& &1 < 100) |> if(do: "Yes", else: "No")
"No"
```

# パターンマッチ
```elixir
defmodule Awesome do
  def solve(list), do: Enum.all?(list, & &1 < 100) |> do_solve()

  defp do_solve(true), do: "Yes"

  defp do_solve(false), do: "No"
end
```

# if文っぽく
```elixir
defmodule Awesome do
  def solve(list) do
    if Enum.all?(list, & &1 < 100) do
      "Yes"
    else
      "No"
    end
  end
end
```

# 無名関数を作ってpipe operatorでつなぐ
```elixir
defmodule Awesome do
  def solve(list) do
    Enum.all?(list, & &1 < 100)
    |> (fn b -> if b, do: "Yes", else: "No" end).()
  end
end
```
- 私は長らくこの書き方をしていたのですが、なにか変だぞとおもって`|> if(do: "Yes", else: "No") `に気づいたわけです
- 余談ですが、このテクニックはどなたかの記事で知りまして、前の計算結果を次の関数の第一引数ではない箇所に渡して呼び出したいときに重宝しています

```elixir
Awesome.get_content() # .wavデータが取得できるすんごい関数
|> (fn content -> File.write("alarm.wav", content) end).()
```


# [if](https://hexdocs.pm/elixir/Kernel.html#if/2)って何ですか？
- マクロです
- リンク先の公式ドキュメントのサンプルをみていただけると感じるものがあるとおもいます
- もっと[if](https://hexdocs.pm/elixir/Kernel.html#if/2)のことを知りたい方は、@piacerex さんの記事をご参照ください
    - [Elixirのifはタダの関数](https://qiita.com/piacerex/items/c7c31499a6bde7f1fe0e)
    - [ifをパイプの中で使用する](https://qiita.com/piacerex/items/b39eab7d92e91b366c51)
    - いつもありがとうございます！
- [Elixir](https://elixir-lang.org/)の[ソースコード](https://github.com/elixir-lang/elixir/blob/v1.11.0/lib/elixir/lib/kernel.ex#L3280-L3340)

```elixir
  defmacro if(condition, clauses) do
    build_if(condition, clauses)
  end

  defp build_if(condition, do: do_clause) do
    build_if(condition, do: do_clause, else: nil)
  end

  defp build_if(condition, do: do_clause, else: else_clause) do
    optimize_boolean(
      quote do
        case unquote(condition) do
          x when :"Elixir.Kernel".in(x, [false, nil]) -> unquote(else_clause)
          _ -> unquote(do_clause)
        end
      end
    )
  end

  defp build_if(_condition, _arguments) do
    raise ArgumentError,
          "invalid or duplicate keys for if, only \"do\" and an optional \"else\" are permitted"
  end
```

# 2021/01/11(月) 追記
- @pojiro さんの書き込みにて[case/2](https://hexdocs.pm/elixir/Kernel.SpecialForms.html#case/2)も同じようにいけます :rocket::rocket::rocket: 
- [パイプラインでcaseを使えることを知りました。（phx.gen.authのコードから抜粋](https://twitter.com/pojiro3/status/1348239155222908929)

![ErXn_sDVgAEZ8K5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/8840fa07-0c06-f292-b119-88bc86391f6d.png)

- https://twitter.com/akoutmos/status/1332383690131816448



# Wrapping Up :qiita-fabicon: 
- Enjoy [Elixir](https://elixir-lang.org/) !!! :rocket::lgtm::lgtm::lgtm::rocket:
「オブジェクト指向実践ガイド」を読んでみたので備忘録

## はじめに
「オブジェクト指向実践ガイド」を読んでみていいなと思ったので、自分用のメモ。まだ途中です。
1年くらい前にも読んで良書だと思っていたけど、改めて読み返すと学ぶことが豊富にある。

## 「オブジェクト指向設計実践ガイド」メモ（目次ごと）

### 第1章
#### 1.1 設計の賞賛

変更がないアプリケーションはない。どんなアプリケーションでも変化は訪れる。
変更が容易なアプリケーションは書いていて楽しい。逆はコストがかかり手がつけられなくなっていく
部品が「オブジェクト」であり、相互作用はオブジェクト間で受け渡される「メッセージ」である。
=>これが重要です。

設計とはコードの構成のこと。つまりアプリケーションそのもの。

#### 1.2 設計の道具
オブジェクト指向の設計の道具

**設計原則**
SOLID原則
=>有名なやつです。 コード書くときに意識はしているけど体現するのは難しいです。

**設計パターン**
GoF、デザインパターン

便利な道具だが、初心者が意図を取り違え、本来の意図にそぐわない設計をしてしまうことも。

#### 1.3 設計の行為

設計が失敗する原因は設計が十分ではないから。
Rubyは簡単で、誰でも書くことができる。しかし、その反面、設計されていないアプリケーションは、失敗しやすい。

また、オブジェクト指向設計の手法は知っているが、適用方法がわかっていないプログラマーは別の失敗にぶつかる。



## おわりに(本文とは関係ないつぶやき)
やっぱり良書と呼ばれているものは、学びが多いなと感じる。

- リーダブルコード
- リファクタリングRuby
- 達人プログラマーの道
- SQLアンチパターン　

などなど。
これらの本も時間あったらアウトプットがてらまとめてみたいな。
【Rails】利用規約とかプライバシーポリシーなど、単純に静的なページへのリンクを貼る方法

個人開発をしていると利用規約とかプライバシーポリシーを作りますよね。
そのとき、わざわざそのためにコントローラーを用意して、ルーティングを書いて、、とかめんどくさいですよね。
そんな時は、```high_voltage```というgemを使います！

#実装手順
##1.Gemをインストール
Gemfileに'high_voltage'を追記して

```
$ docker-compose run app bundle install
```

環境構築でDockerを使っています。Dockerfileやdocker-compose.ymlの書き方によっては、Gemfileを書き換えた場合、buildからやり直す必要があります。この辺のことは今回は割愛します。

##2.viewを作る
```app/views/pages``` ディレクトリがなければ作成します。

```
$ mkdir -p app/views/pages
```

リンクさせたいページのファイルを作成、今回は利用規約をhamlで作っていきます。テンプレートエンジンは適時置き換えてください。

```
$ touch app/views/pages/terms.html.haml
```

内容を書きます。

```haml:tearms.html.haml

 .term-wrapper
    %h1.uk-text-center 利用規約
    %p この利用規約（以下，「本規約」といいます。）は，プロつく！（以下，「当事務局」といいます。）がこのウェブサイト上で提供するサービス（以下，「本サービス」といいます。）の利用条件を定めるものです。登録ユーザーの皆さま（以下，「ユーザー」といいます。）には，本規約に従って，本サービスをご利用いただきます。
    %h2 第1条（適用）
    %ol
      %li 本規約は，ユーザーと当事務局との間の本サービスの利用に関わる一切の関係に適用されるものとします。
      %li 当事務局は本サービスに関し，本規約のほか，ご利用にあたってのルール等，各種の定め（以下，「個別規定」といいます。）をすることがあります。これら個別規定はその名称のいかんに関わらず，本規約の一部を構成するものとします。
      %li 本規約の規定が前条の個別規定の規定と矛盾する場合には，個別規定において特段の定めなき限り，個別規定の規定が優先されるものとします。
    %h2 第2条（利用登録）
    %ol

......(省略）
```

#3.リンクを貼る（完成）
リンクを貼るときは、page_about('terms')などとしてパスを書けます。

```haml:home.html.haml

= link_to '利用規約', page_path('terms')
```

ルーティングを見てみると、

```
Prefix Verb URI Pattern    Controller#Action
  page GET  /pages/*id     high_voltage/pages#show
```

となっているのがわかります。

これでとりあえずは利用規約ページは完成します！！

#階層を変える
デフォルトだと https://hogehoge.com/pages/terms となるので、これを ```hogehoge.com/terms```に変えたいときは、config/initializers/high_voltage.rb を作成し、以下のように記述します。

```ruby:high_voltage.rb

HighVoltage.configure do |config|
  config.route_drawer = HighVoltage::RouteDrawers::Root
end
```

ルーティングを見てみると、

```
Prefix Verb URI Pattern    Controller#Action
  page GET  /*id           high_voltage/pages#show
```

となっており、pagesがなくなっていることが分かります。

##最後まで読んでいただきありがとうございます！
日々学習したことをアウトプットしております！！ご指摘などあればコメントいただけますと幸いです！！
windowsのssh-agentが動かないときの対処法

# 環境

- Windows10(64bit)
- [git for windows](https://gitforwindows.org/index.html)

なお、`git`コマンドがPowerShellから使えるようにgit for windowsで設定してある。

# 問題となった事象

`ssh`コマンドのみの使用では問題なかったが、`ssh-agent`コマンドを使用した場合にいずれも発生した。

1. `ssh-add`を使って確かに秘密鍵をパスワードを登録したはずなのに、`git`コマンドを使うとでパスワードを相変わらず聞かれる。
2. "warning agent returned different signature type ssh-rsa"という警告が出る。

# 1つ目の問題への対処

原因は、**`git`コマンドはgit for windowsに付属しているsshバイナリを使用するため**。

gitに使用するssh.exeのパスを教えてやればいい。

以下手順

1. 環境変数`GIT_SSH`を定義して、値をgitに使用するssh.exeのパスにする。

[こちら](https://snowdrift.tech/cli/ssh/git/tutorials/2019/01/31/using-ssh-agent-git-windows.html)を参考にした。

# 2つ目の問題への対処

sshキーを生成する際にEd25519のキータイプを指定する。

次を実行すれば良い。

```powershell
ssh-keygen -t ed25519 -C "your_email@example.com"
```

# ~~２つ目の問題への対処~~

(追記: 2020/10/14)

[@ttdoda](https://qiita.com/ttdoda)さんからのコメントで、Ed25519鍵を使うと以下の手順を行わずとも正常に動作する事がわかりました。Ed25519鍵のほうがRSA鍵よりも優れているみたいなので、積極的に使っていきましょう。



~~原因は、**windowsに付属しているSSHクライアントのバージョンが古いため**。（ゴミかよ！！！）そのうち、WindowsUpdateでバージョンアップされるらしい!?~~

~~[Issue](https://github.com/PowerShell/Win32-OpenSSH/issues/1263)がすでに建てられていて、白熱していた。~~

~~以下、最新のwindows用OpenSSHをインストールするための手順~~

~~1. まずはwindowsに標準で付属しているOpenSSHクライアントをアンインストールする。設定→アプリ→オプション機能からアンインストールできる。~~
~~2. 指示通りに再起動する。~~
~~3. [GitHubのrelease](https://github.com/PowerShell/Win32-OpenSSH/releases)から最新のリリースのOpenSSH-Win64.zipをダウンロードする。~~
~~4. Program FilesにOpenSSHというフォルダ名で展開する。~~
~~5. このディレクトリのパスをシステム環境変数のPathに追加して、パスを通す。~~
~~6. 環境変数の変更を反映するために再起動する。~~

~~ひとまず一件落着だが、`ssh-agent`を起動時に立ち上げるための設定も必要だ。なお、OpenSSH Authentication Agentは標準のOpenSSHクライアントをアンインストールしたときに削除されている。~~

~~以下手順~~

~~1. PowerShellを管理者権限で起動する。~~

~~2. 次のコードを実行して、サービスに追加。~~

```powershell
   New-Service -Name ssh-agent -BinaryPathName "C:\Program Files\OpenSSH\ssh-agent.exe"
```
~~再起動して、`ssh-agent`を実行して起動していることを確認。~~

~~これで快適に`git`を使えるようになった!!
Congratulations!!!~~


~~以下のサイトを参考にした。~~

~~[Windows10 で ssh-agent のサービスを登録する](https://qiita.com/mizutoki79/items/074d11cf9bc82b87385f)~~

~~[OpenSSH for Windows のインストール（Windows 上）](https://www.kkaneko.jp/tools/win/openssh.html)~~



# おまけ：環境変数の編集

windowsボタンを押して「env」と入力すると、「システム環境変数の編集」という選択肢が出てきて素早く編集画面に移動できる。

~~そもそも、秘密鍵を置くマシンに自分しかアクセスできないということが保証できるなら、無理にパスフレーズを設定しなくてもいいのかもしれない。~~

https://serverfault.com/questions/142959/is-it-okay-to-use-a-ssh-key-with-an-empty-passphrase#:~:text=As%20long%20as%20no%2Done,keys%20used%20by%20automated%20software.
GithubからのClone作成方法

Clone作成方法について手順を記載します。

まず、鍵を作成しましょう。
`% ssh-keygen`

```
+---[RSA 3072]----+
|          .o     |
|         .o o    |
|        +  o o   |
|       . o  . .  |
|        S . o..  |
|  ..o  =.o o.=   |
|o .+..+.*...+    |
|=oo.+++o.+o.     |
|*+o=BE. .oo.     |
+----[SHA256]-----+
```
githubに鍵を登録する方法です。

![スクリーンショット 2020-10-13 23.21.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693241/4c245410-475c-b677-24e8-bbb8f30ea1ec.png)

Githubに矢印通りに鍵を登録する

```
% ls ~/.ssh
  id_rsa          id_rsa.pub      known_hosts 
```
と出るので、、、id_rsa.pubの中身をコピーします。

```
% vi ~/.ssh/id_rsa.pub
```
エンターして、表示された中身を「key」のブランクボックスに入れる。

![スクリーンショット 2020-10-13 23.38.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693241/d05b5c8f-a30a-3a2f-dbb1-ba4bb05e9b45.png)


Add SSH KEYを発行する。
![スクリーンショット 2020-10-13 23.37.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693241/c026ef8a-351c-5d98-24f4-9c0bbf8f463f.png)

で登録完了。


ターミナルを開いて、以下コマンドを入力

`% git clone git@github.com:ochun0116/saku202010.git `

```
Cloning into 'saku202010'...
Enter passphrase for key '/Users/yuota/.ssh/id_rsa':
```
パスワードを入力します。
（パスワードは入力しても反応しないので）入力が終わったらエンターをおします。

```
remote: Enumerating objects: 8337, done.
remote: Counting objects: 100% (8337/8337), done.
remote: Compressing objects: 100% (5221/5221), done.
remote: Total 8337 (delta 2045), reused 8337 (delta 2045), pack-reused 0
Receiving objects: 100% (8337/8337), 12.16 MiB | 5.62 MiB/s, done.
Resolving deltas: 100% (2045/2045), done.
Updating files: 100% (6155/6155), done.
```
これで完了です！

クローンが作れていることを確認。
![スクリーンショット 2020-10-13 23.52.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693241/eee0cad4-f5aa-3d6b-5dbb-e1d51df1195f.png)
Git　超基本コマンド

<h1>git init<br>
Gitリポジトリの作成</h1> 

ディレクトリの作成

```
$ mkdir git-tutorial
$ cd git-tutorial
```

リポジトリの作成

```
$ git init
Initialized empty Git repository in /home/user/work/git-tutorial/.git/
```

これで　git-tutorialディレクトリがGitリポジトリとして管理されるようになる。

<h1>git status<br>
Git リポジトリの状態の確認</h1>


ファイルの作成

```
$ echo 'Hello,git!!' > README.md
$ cat README.md
Hello,git!!
```

Gitステータスの確認コマンド

```
$git status
```

ステータスの確認

```
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        README.md

nothing added to commit but untracked files present (use "git add" to track)
```

・Untracked files(未追跡)状態とは
ステージングエリアにもリポジトリにも登録されていない状態。

<h1>Gitの管理下から外すとき</h1>

リポジトリの削除を行う

```
$ rm -rf .git 
```

<h1>git add<br>
ステージングエリアへファイルを追加しコミット対象にする</h1>

ステージングエリアへのファイルの追加コマンド

```
$ git add README.md
```

ステータスの確認

```
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   README.md

```

<br>
複数ファイルの指定

```
$ git add <file> <file> ... 
```
<br>
全てのファイルを登録

```
$ git add .
```


<b>・ステージングエリアとは</b>
ファイルをコミットする前に変更内容を一時的に登録しておくバッファのようなもの。

<b>ワーキングディレクトリとステージングエリアの差分の確認</b>


```
# すでにステージングされたREADME.md　の編集を行う
$ echo '# Hi!! Git!!' > README.md
$ cat README.md
# Hi!! Git!!
# Gitの状態の確認
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   README.md

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   README.md

```

<h1>git diff <br>Gitでファイルの変更差分を確認する</h1>
ステージングエリアとの比較

```
$ git diff
diff --git a/README.md b/README.md
index e69de29..5264c8b 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1 @@
+# Hi!! Git!!
```

単語単位の比較

```
$ git diff --word-diff
diff --git a/README.md b/README.md
index e69de29..5264c8b 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1 @@{+# Hi!! Git!!+}
```
<h1>git commit<br>
リポジトリの変更を記録する</h1>
 ステージングエリアにされている登録されているファイル・ディレクトリをつの束としてリポジトリの歴史として記録します。

```
$ git commit -m "add ファイルを新規作成"
[master (root-commit) 1ca686b] add ファイルを新規作成
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.md
```

<h1>git log<br>
リポジトリのコミット履歴を閲覧する</h1>
リポジトリのコミット履歴を一覧で表示します。

```
$ git log
commit 1ca686bab5cbbaf29d411c5de449baf2131cd2ba (HEAD -> master)
Author: user.name <user.email>
Date:   Sun Oct 18 00:54:23 2020 +0900

    add ファイルを新規作成

```

<h1>git reset <br>
コミットを取り消す</h1>
git reset　はコミット履歴を過去にさかのぼってそれ以降のコミットを全てなかったことにします。
 
```
$ git reset <file>
```

<h2>ワーキングディレクトリの状態を直前の状態まで戻す</h2>
--hard オプションを付けると直前のコミット時と完全に一致した状態に戻される。

```
$ git reset --hard 
```

<h2>指定したコミットの状態まで戻す</h2>

コミットIDの指定
```
$ git reset <commit id>

```
PHP 、Laravel　学習　ルーティングの設定


#Laravelのダウンロード
これはあまり苦労せず終わったので、簡単に書いていきます。
とりあえず、Laravelをダウンロードするために**Composer**と言うパッケージのダウンロードが必要になりますがそちらもあまり苦労ないと思うので順番さえ間違えなければすんなりいくと思います。

「**Composer**ってなんですか？」等、詳しく知りたい方は**ぐぐる**とたくさん情報が出てきますのでググってみてください


#ルーティングの設定

Laravelがインストールし終わったら早速最初の工程としてルーティングを設定していきます。
「リクエストが送られてきたら任意のレスポンスをする」という物です
自分だけ理解している記事は書きたくないので、噛み砕いて説明したいと思います。
普段ホームページを見ている時、何気なく操作しているところの一部です。
例えば、あるサイトを回遊している時「Aのページを見たいからAのページへ飛ぶためボタンをクリックして、Bのページへ飛ぶ」という操作をしたとします。何気なくやっているいつもの操作だと思いますが、この時の
●「Aのページへ飛びたい」というユーザーの要望を**リクエスト**と言い

●「Bのページを表示する」というサイト側の設定を**レスポンス**と言う

そしてこの「このリクエストが来たら、このレスポンスをすると言うのを決める設定」のことを**ルーティング**と言います。

はじめにテストとして、「/hello」と言うリクエストが送られてきたら
「Hello World！」と言う言葉をブラウザに表示すると言うレスポンスを返してみます。ダウンロードしたLaravelファイルの中に「routes」と言うフォルダーがあるのでその中の「web.php」ファイルの一番下に

    Route::get('/hello', 'HomeController@home');
と言うコードを書いてみました。

このコードを詳しく解説すると「/helloと言うリクエストが来たらHomeControllerのhomeアクションが呼ばれ、然るべきレスポンスをする」
というコードです。
コントローラーとアクションも出てきましたが、説明が長くなるので次回以降に詳しく解説します。
しかし、ここで問題発生
ブラウザをのURLを**http://127.0.0.1:8000/hello**にして接続してみるとつながらず・・・「ホームコントローラーは存在しませんよ」と言うエラーが出てしまいました。
このエラーを解決するのにかなり時間がかかってしまったのですが、原因は

①Laravelのバージョンアップでルーティングの表記の仕方が変わってしまった
②ルートの表記が間違えていた。

の２点でした。

①の原因の解説としては、参考にした記事がLaravel7と言うバージョンだったのに対し、私がインストールしたのはLaravel8でした。

②の原因、ルートの表記が間違えていたと言うところですが「web.php」と言うファイル（ルーティングを実際に書いて設定するファイル）の中に**どのような階層を踏んでルーティングするか**を書くところがあるのですがこちらが間違えていました。
正しいソースコードを以下に載せておきます。

①↓

    Route::get('/hello', [HomeController::class, 'home']);

②↓

    use App\Http\Controllers\HomeController;


#次回以降の予定
①**Controller**の詳しい説明と設定
②**view**の詳しい説明と設定
③**view**を簡単にスタイリングできる**Bootstrap**の説明
こちらを念頭に置いて更新していきたいと思います。
テスト自動化は自動テスティングの夢を見るか？

##1. はじめに
この記事は「このバグを抱えているソフトウェアはこんなバグも抱えています」という情報をテスト設計に活かしてテストスクリプトを生成すると探索的テストのようなテスティングの自動化ができるのでは、というポエムです。

"Failしたテストの情報"というネガティブな情報をテスト分析にフィードバックし自動テストで新たなバグを摘出することでテスト対象ソフトウェアの品質が向上するというのは、ネガティブフィードバック（負帰還）で増幅回路の特性を改善させる[^1]のと似ていますね。

![NFB AutoTesting](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221758/93bd64f5-8cd9-1dbb-96c6-77dcf3046f21.png)

##2. 不具合情報データベース
「このバグを抱えているソフトウェアはこんなバグも抱えています」という情報を得るには少なくともバグ情報を整理したデータベースが必要です。また、[テスト自動化の8原則](https://sites.google.com/site/testautomationresearch/test_automation_principle)によると「自動テストで新種のバグが見つかることは稀である」ことから、自動テストでバグを踏むのを受け身で待つだけでなく類似製品のバグや汎用的なバグ情報を利用するなどして積極的に踏みに行く必要があると考えられます。

- [欠陥モデリング](https://www.google.co.jp/search?q=欠陥モデリング)
- [ソフトウェアFMEA](https://www.google.co.jp/search?q=ソフトウェアFMEA)
- [テキストマイニングを利用した不具合票分析](https://www.google.co.jp/search?hl=ja&as_q=テキストマイニング+不具合票分析)

##3. テスト設計
どれくらいテストするか(テストスクリプトを生成するか)をFail情報に基づいて決めます[^2]。

##4. テスト実装
テスト分析やテスト設計のプログラムを汎用的に使いまわしできるよう、テスト設計とテスト実装でレイヤを分けます。テストスクリプト生成プログラムはテストランナーの仕様に合わせて用意します。

##5. テスト実行
###5.1 テスト自動化は回帰テストの自動化？
[システムテスト自動化 標準ガイド](https://www.shoeisha.co.jp/book/detail/9784798139210)によると

> 自動テストスイートは、テストの再実行のために作成する。当たり前のことだが、こういったテストはすでに実行済みなので、この時点でソフトウェアに潜んでいる欠陥をあらわにすることはまずない。テスト実行ツールとは決して「テスティング」ツールではなく、「再テスティング」ツール、つまり回帰テスティングツールなのである。

とあり[^3]一理あるとは思うものの、自動テストのアビリティを自ら狭めているようにも思います。

###5.2 テスト自動化は組込み系には難しい？

システムテスト自動化 標準ガイドによると自動化すべきでないテストの一つに

> 物理的なやりとりがあるテスト。例えば、カードリーダーにカードを通す、何かの装置の接続を外す、電源をオフかオンにするなど

が挙げられています[^4]が、少なくともスイッチを電気的にオンオフしたり物理的に押したり引いたりするのはArduinoにリレーやサーボモータを組み合わせたおもちゃのような治具とPythonで書いたテストランナーでできることは[Lチカで始めるテスト自動化](https://techbookfest.org/product/5661312486998016)で示した通りです。

ソフトウェアのエンジニアにとって回路設計やメカ設計は専門外で難しいですが、とはいえ[Lチカで始めるテスト自動化](https://qiita.com/pbjpkas/items/fd4bd2689deda2d793aa)シリーズで実装したテスト治具は学部で習うようなトランジスタの直流回路やミニ四駆を組み立てできれば作れる程度のメカだったりします。QAの役割の一つに品質技術の開発があり、量産レベルの回路設計やメカ設計は専門家に依頼するとしてもどういうテスト治具を必要としているかをプロトタイプを作って彼らに説明する程度のスキルは持っておきたいところです[^5]。

##6. おわりに
今時のAIを組込んだ自動テストシステムを回帰テストにしか使わないのはもったいないし、テスト分析やテスト設計のプログラムはテスト実装と分離することでWebやスマホアプリに限らず組込み系などほかの分野にも応用できそうな気がするし、少なくとも組込み系は自動テストのやりようがあるし、となるとテスト設計に活かしやすい形で不具合情報を蓄積する必要があるもののあと数年もしないうちに様々な分野で自動テスティングが実現するかも、なんてね。

[^1]: [増幅回路-帰還(Wikipedia)](https://ja.wikipedia.org/wiki/%E5%A2%97%E5%B9%85%E5%9B%9E%E8%B7%AF#%E5%B8%B0%E9%82%84)
[^2]: テストフレームやテストコンテナの設計はあらかじめ済ませておくこととします
[^3]: 1.9.2 手動テストの方が自動テストよりも多くの欠陥が見つかる
[^4]: 1.9.1 手動テストはなくならない
[^5]: なんだかブーメランが盛大に刺さった気が…
PHP Laravel アプリ作成アウトプット

# method_exists()関数
methood_exists(オブジェクト, メソッド)
第一引数で指定したクラスオブジェクトのクラス内に第二引数で指定したメソッドが含まれていればtrueを返し、そうでない場合falseを返します。
# property_exists
PHPマニュアル(https://www.php.net/manual/ja/function.property-exists.php)

機能 オブジェクトもしくはクラスにプロパティが存在するかどうかを調べる。
説明 property_exists ( mixed $class , string $property ) : bool
パラメータ　class:確認するクラス、もしくはクラスのオブジェクトを指定します。 property:プロパティ名を指定します。

# env関数
env関数は、第一引数に指定した環境変数の値を返し、もしその環境変数が無ければ第二引数の値をデフォルト値として返します。
![スクリーンショット 2020-10-13 18.14.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/e30f2cfd-a087-0a44-f151-756f6cf346e5.png)
Chainerによる機械学習のためのPython学習メモ　7章 回帰分析

# What
Chainerを利用して機械学習を学ぶにあたり、私自身が、気がついた点、リサーチした内容をまとめる記事になります。今回は、機械学習に必要な回帰分析を勉強します。

私の理解に基づいて記述しているため、間違っている場合があります。間違いは都度修正するつもりです、ご容赦ください。

###単回帰分析と重回帰分析
回帰分析とは、データ群が与えれた時、どんなグラフから発生したデータでしょう？を求める分析。
単回帰は入出力が１体１の場合。
話変わるけど、いろんな現象が正規分布に従うのはなぜ？と思ったことを思い出した。
下記参考、正直まだ腹に落ちていないのでもう一度勉強しなおします。
https://goldninjass.hatenablog.com/entry/2016/04/04/152631

###データの前処理
という手法があるらしい。平均値が0になるようにデータセットを平行移動する処理のことらしい
###単回帰分析
原理は最小二乗法。
###重回帰分析
多変数の入力に対し、１出力を与える。基本的には単回帰分析の連立。解法が大学数学だから、演習問題くらい説いておいた方が良さげ。

#Comment
数学の学習はここまで、大学で一度は聞いたことがあるというのが多かったため、スムーズに進んだ。
次回から、Pythonと数学を組み合わせていよいよ機械学習の習得に取り掛かります。
【超初心者向け】ハッシュとシンボルの押さえておきたい最低限の知識


# 配列とハッシュの違い
配列は同じ意味を持つ複数の情報を1つにまとめたもので、ハッシュは関係のある複数の情報を1つにまとめたもの
# ハッシュ

```ruby
変数 = { キー1 => バリュー1, キー2 => バリュー2, キー3 => バリュー3 }
```
・別々の意味を持つ値を1つにまとめることができるので、複数の関係性のある値を管理するときに用いる
・「データ」とそれに対応する「名前」のセットを要素として持つ
・ハッシュではデータをバリュー、名前をキーという



```ruby
# ハッシュのキーに文字列を使用した場合
hash1 = { "name" => "nick", "age" => 30, "country" => "UK" }
```
#シンボル
・ハッシュのキーに数値として用いられるもの
・見た目は文字列のように見えるが実際の中身は数値である
・書き方は2種類あるがどちらも実態は同じ
・hash3が一番シンプルでよく使用される

```ruby
# ハッシュのキーにシンボルを使用した場合
hash2 = { :name => "nick", :age => 30, :country => "UK" }
hash3 = { name: "nick", age: 30, country: "UK" }
```
⚠️コンピュータは文字列より数値の方が処理速度が早くなるため
シンボルの方がよく使用される
***
ここまでで超基礎の部分はクリアです！！
シンボルで書かれたハッシュに慣れるのがいいかと思いますが、理解をした上で使用するようにしましょう。
続いてはハッシュの追加や2重ハッシュの値の取得について説明したいと思います！
もう少し知識を吸収したい方はぜひ続きもご覧ください。
***
# ハッシュへ要素を追加

```ruby

teacher = { name: "nick"}
teacher[:age] = 30 # ハッシュ[追加するキー] = 値

puts teacher

# 出力結果
# {:name=>"nick", :age=>30}
```

# ハッシュの値を変更

```ruby

teacher = { name: "nick", age: 30}
teacher[:name] = "john" # ハッシュ[変更したい値のキー] = 値

puts teacher

# 出力結果
# {:name=>"john", :age=>30}
```
# ハッシュの値を取得

```ruby

teacher = { name: "nick", age: 30}
puts teacher[:name] # ハッシュ[取得したい値のキー]

# 出力結果
# nick
```
# 2重ハッシュの値を取得
```ruby
#変数teacher_data→配列の内部に複数の情報をハッシュとして持つ
#teacher_dataからnameデータを取得する

teacher_data = [
  {
    teacher: {
      profile: {
        name: "nick"
      }
    }
  },
  {
    teacher: {
      profile: {
        name: "john"
      }
    }
  },
  {
    teacher: {
      profile: {
        name: "mac"
      }
    }
  }
]

teacher_data.each do |t|
  puts t[:teacher][:profile][:name]
end

# 出力結果
# nick
# john
# mac
```
【解説】
ブロック引数のtはteacher_dataのtを用いています。
putsのあとはハッシュ[取得したいキー]を取得したいデータ（今回の場合はname)まで連結して記述します。
***
お疲れ様でした！！
ハッシュとシンボルについての超基礎知識は以上です！
基礎が理解できていないと後々困ると思うので、この機会にぜひ理解が深まればな〜と思います。
わかりにくい点、至らない点ございましたら遠慮なくお知らせください！
それではありがとうございました。

# 参考
・https://qiita.com/ryosuketter/items/257d672eb83210b5f8dc
Pythonで正規表現

ソースコードは以下になります。

```python 
import re

string = "0"
result = re.fullmatch(r'0|1|2', string)

if result:
    print("Match!")
else:
    print("Not Match")
```

実行結果は以下になります。

```console
Match!
```

最後まで読んでいただきありがとうございました。
またお会いしましょう。
【Golang】mapのvalueに配列を指定する

## 概要


mapの中にvalueに配列をいれるみたいなのをGoでしたかったので自分用メモ

## 実装

```go
package main

import "fmt"

type Hoge struct {
	Say string
}

func main()  {
	a := map[string][]Hoge{}
	a["hoge"] = append(a["hoge"], Hoge{Say: "hello1"})
	a["hoge"] = append(a["hoge"], Hoge{Say: "hello2"})
	a["hoge1"] = append(a["hoge1"], Hoge{Say: "hello3"})
	fmt.Println(a)
}
```

上記をgo runすると

```
map[hoge:[{hello1} {hello2}] hoge1:[{hello3}]]
```

のようにmapのvalueの中にarrayが入ります