OmniAICreator/Qiita-1.07M huggingface dataset:
新卒未経験初心者がCCNAを1か月10日で取得した物語

新卒駆け出しエンジニアのCybermanです。

記者のスペック以下の通り。
・大学文系（地域活性化系）
・タイピングE＋（e-typing）　※1分間ではかったとき20文字だったかな？
・幼少期にPCつぶした遊んでた（笑）
・Word2013　Excel2013　LPIC level 1取得済　
・なぜかクラウドだけ触ったことあるがNWってなに？レベル。（プログラミング不可）

# 本記事について
私がCCNAを1か月10日で取得した記事であり、資格取得が目的であり実務では難しくなります。
取得前はNWってなに？ぐらいの知識でした。

最初に結論から話します。
CCNAは暗記と実際に触れてみるのに限ります。
大半は暗記ですが、コマンドに触れていないと理解や意味が分からないことが出てき始めます。
そして一番のクセ物が試験のCisco語です。これは下記で説明します。
# 1.CCNAについて
CCNAはCisco社のアソシエイトレベルのベンダー資格になります。公式サイトには以下のように記載されています。

>「CCNA 認定は、絶え間なく変化する IT 環境に対応できる能力を持っていることを証明します。CCNA 試験は、ネットワークの基礎、IP サービス、セキュリティの基礎、自動化およびプログラマビリティを対象としています。俊敏性と汎用性を考慮して設計された CCNA は、今日における最も高度なネットワークを最適化して管理するために、必要なスキルを保持していることを証明するものです。」




※Cisco社. 「CCNA - Training&Certifications - Cisco」.
https://www.cisco.com/c/ja_jp/training-events/training-certifications/certifications/associate/ccna.html, (参照 2022-05-03)

# 2.使用サイト及び参考書について
・[1週間でCCNAの基礎が学べる本 第3版 (一週間) ](https://www.amazon.co.jp/1%E9%80%B1%E9%96%93%E3%81%A7CCNA%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%81%8C%E5%AD%A6%E3%81%B9%E3%82%8B%E6%9C%AC-%E7%AC%AC3%E7%89%88-%E4%B8%80%E9%80%B1%E9%96%93-%E5%AE%AE%E7%94%B0-%E3%81%8B%E3%81%8A%E3%82%8A/dp/4295010731/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2KYJBYOPXXELT&keywords=CCNA&qid=1651592963&sprefix=ccna%2Caps%2C361&sr=8-3)
・[PingT(WEB問題サイト)](https://ping-t.com)
・[Cisco Packet Tracer](https://www.netacad.com/courses/packet-tracer)　(実体的にNWを学ぶアプリケーション)




# 3.具体的な内容について
私は上記の「<font color="red">**1週間でCCNAの基礎が学べる本 第3版 (一週間)**</font>」を参照し、その後に「<font color="red">**Ping-T**</font>」で各項目で問題を解いていました。
勉強期間は以下の通りです。
・平日2時間～3時間　
・休日7時間～10時間
期間：1ケ月と10日（最後の9日ほどはほぼ問題集をやっつけ仕事のよう解いていた）

基本的には上記の期間で参考本で学び→サイトで問題を解く→てわからない部分はググる→サイトで問題を解くの繰り返し。
これにより大体どの問題が来ても、ほぼ答えられる様になれば問題ないと思います。また、2項目の「<font color="red">**Cisco Packet Tracer**</font>」を使用し、実際にコマンドを打つことでより理解できると思います。
例えばConfig（設定）と投入してり、通信を走らせてみたり、コマンドを試し打ちしたりできます。

### <font color="red">**!!注意!!**</font>
ですがCisco社の資格では「本記事について」の部分に記載のある「<font color="red">**Cisco語**</font>」が存在します。
問題解説の日本語がおかしい日本語になっていたり、理解できない説明などがあります。（Google翻訳のような感じ）
また、用語なども独特の記載があります。そのことから、溶ける問題もこのことにより、間違えてしまうこともあるので注意が必要になります。

ちなみに、記者の場合はCisco語に対して不安な部分が多くあったため、Cisco語について洗い浚い調べ、情報を得ました。
例えば、Administrative Distanceが「管理距離」になったり、OSPFのNeighborについて2Way＝双方向　Full＝完全などなどがあります。


# 4.取得するメリットについて
メリットとして、CCNAはエンジニアの経験年数があっても資格取得をしようと思っている方も少なからずいます。また、運悪く2.3回受けてようやく合格する方もいます。そのことから、取得することができれば「<font color="red">**NWの基本的な部分などは理解している**</font>」と認識されるでしょう。また、NWの資格はほかにもありますが、IT業界のインフラ業種的な部分においてCisco社の資格はとても有名なので、効果はあると思います。



# 5.最後に
最後に、改めてCCNAなどのCisco関連の資格はとてもCisco語がやっかいであり、勉強も暗記以外に試験に関する情報収集やコマンドやなども触っておく必要があると言えます。その理由としては、試験問題でコマンドに問う問題も出題されたり、Cisco語で理解に苦しむ問題も出題されます。なので暗記以外にも対策はしておいたほうが良いと思います。

この記事を見ている人は恐らく今から試験を受けるか、どんな資格なのか興味がある人か、CCNAの試験概要を調べている人だと思います。なので、今後資格を受験する方はや勉強しようと考えている方がいれば様々な記事をみて参考にしてみたください。
【Rails】Deviseのページが編集できない、反映されない


# 起きている問題

```app/views/users/registrations/new.html.erb```などのdeviseで作成されたビューページを編集してるにも関わらず、変更が反映されない。
エラーも表示されない

# 解決方法
`config/initializers/devise.rb`の
```
# config.scoped_views = false
```
を
```
config.scoped_views = true
```
に変更、#も取る

見つからない場合はctrl(もしくはcommand) + Fでファイル検索できる。 

変更後サーバーを再起動させる必要あり
```
$ rails s
```

以上
Windows10/11でPowerShellからパスを通す (環境変数PATHの変更)

地味によく分からなかったからずっとGUIからやってた。
Windowsのdotfiles作りたくてググっても自分がやりたいことそのものがなかなか出てこなかったのでメモ。

# GUIで変更

環境変数はユーザー側とシステム側がある。
ユーザー一人しかいないならどっち変えてもいいけど、ユーザー側を変えればいいと思う。
これでの変更方法はググれば腐るほどあるし、やりたいことと違うので書かない。

![スクリーンショット 2022-05-04 005201 (小).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18902/644e85cb-43cb-22a7-e7df-dbe88d172448.jpeg)

# PowerShellで一時的な変更

`$Env:Path`にユーザー側とシステム側のPathがごっちゃになった文字列が入ってる。
PowerShell閉じたら元に戻る。一時的でよければこれでよし。
頭にセミコロン入れるの忘れないこと。

```powershell
$Env:Path += ";C:\HOGE"
#=> C:\Program Files\PowerShell\7;C:\Program Files..(中略)..;C:\HOGE
```

# PowerShellで永続的な変更

環境変数の取得は`GetEnvironmentVariable`、設定は`SetEnvironmentVariable`を使う。
ユーザー側なら`"User"`、システム側なら`"Machine"`を指定する。

つまりユーザー側の環境変数PATHに`C:\HOGE`を追加したいならこう。
とくに警告とか出ないので書き間違いに気を付けること。

```powershell
$new_dir = "C:\HOGE"

$new_path = [Environment]::GetEnvironmentVariable("Path", "User")
$new_path += ";$new_dir"
[Environment]::SetEnvironmentVariable("Path", $new_path, "User")
```

もっと簡単な方法あったら教えてください。

# 参考リンク

- [PowerShellで環境変数を参照、設定する - Why it doesn't work?](https://www.whyit.work/entry/2018/07/09/171632)
JavaScript初心者に伝えたい、一番最初に守って欲しい3つのこと

## 誰に読んで欲しいか

- 初学者を指導するにあたり、どこまで拘って指導したらいいか、最低限守るべきラインに悩む人
- JavaScriptを学び始め、少しキレイなコードを目指したい人

## なぜ記事を書いたか

会社の初級エンジニアにフロントエンドの指導をしている時、指摘したいことは多くあるけどどこまで細かく指摘したらいいのか、、、悩みに悩みました。そこで、```チョット難しいけど絶対意識して欲しいし、それだけで品質が変わること```を自分なりに振り返ったのでJavaScriptをどうやって学習しようか悩む人や指導の仕方で悩む人の一助になればと思い纏めました。

## 本題

### 1. 変数宣言でconst以外は使わない

JavaScriptの変数宣言にはvar, let, constが存在します。
極力constを使うことは変数の意味が一意に決まり、全ての開発メンバーがプログラムを理解することに役立ちます。
２番以降の守るべきことを実践していくと、自ずとconstだけで通用するようになります。

- varは絶対に使わないでください。グローバルスコープが汚れてしまいます。

    - 変数を宣言するたびに全てのファイルで同じ名前が宣言されていないかチェックするのは現実的でないでしょう。

- letは基本的に必要でありません。
    - counterなどの特定要件で必要なこともあります。しかし、プログラムの位置によって変数の値が変わることは可読性の低下、バグにつながります。明確な理由がなければ使わないことが無難です。


### 2. 配列に対してforを使わない

JavaScriptで重要なことは変数をイミュータブル(値が不変）に保つことです。
イミュータブルに保つことでその配列が何を保持しているか明確になります。またイミュータブルな処理はシンプルで誰でも理解しやすいコードになります。
本質的にforでなければならない場面はほとんど存在しないはずです。もし```for```や```for...in```, ```for...of```がある場合は、下記の関数で代替できないか振り返る癖をつけてください。

- JavaScriptの配列を操作するにには**map**, **reduce**を使いましょう。
    - map
        - 操作対象の配列の長さと同じ長さの結果が必要な場合に使いましょう
    - reduce
        - 操作対象の配列の長さを変更する場合に使いましょう

- 配列を絞り込む場合は**filter**, 配列内の存在チェックは**some**, **every**を使いましょう
    - filter
        - 配列の中に特定の条件の値が存在し、その値を抽出したい場合に使いましょう。
    - some
        - 配列の中に特定の条件の値が一つ以上存在するかを確認したい場合に使いましょう。
    - every
        - 配列の中が全て特定の条件の値と一致するか確認したい場合に使いましょう。

### 3. 三項演算子を使いこなそう

三項演算子は条件によって値を取得したい場合に使うことが多くあります。
ifを使いたくなったら三項演算子で書けないか考えてみるようにしてください。
ifでも書けますが、三項演算子を使いこなすことで少ない行数でわかりやすく書くことができます。
但し、三項演算子を複雑に使いすぎると可読性が著しく落ちます。下記の基本条件で三項演算子とifを使い分けてください。

- 使う場面
    - 条件によって値Aを取得したい場合
    ```bash
    # 変数A === Bの場合、 '合格'と取得し、!==の場合は'不合格'と取得したい
    return a === B ? '合格' : '不合格'
    ```

- 使わない場面
    - 条件によって特定の処理が必要な場面    
    ```bash
    # 変数A === Bの場合、 hellowWordとログを表示し、!==の場合は処理をしない
    if (a === B) console.log('hellowWorld')
    ```
    - 3つ以上の返り値が必要な場合
    ```bash
    # 変数A === Bの場合、'合格'と取得し、A === Cの場合、'不合格'と取得し、 それ以外の場合、'補欠合格'と取得したい
    if ( a === B ) return '合格'
    if ( a === C ) return '不合格'
    return '補欠合格'
    ```

## 最後に

JavaScriptは汚いコードでも期待通り動いてしまいます。良くも悪くも自由度が高い言語です。
また、進歩も著しいために少し古いコードと最近のコードでは全く異なる書き方をしていることもしばしばあります。
全てを覚えることは大変ですが、まずはモダンな書き方の中で特に重要な３つのことから慣れるようにして綺麗なコードを目指しましょう。
【AWS】Lambdaのハンズオンで学んだことをまとめる。

## はじめに
こんにちは、k_ukiです。
「AWSではじめるクラウド開発入門」の10章と11章を進めていきました。
そこでは、サーバーレスクラウドに関連する技術が取り上げられており、<b>「Lambda」「S3」「DynamoDB」</b>の3つの技術をハンズオン形式で学習しました。

その中でも、今回は<b>「Lambda」</b>について学んだことをまとめていきます。

## 「Lambda」とは？

簡単にまとめるとサーバーレスコンピューティングにおいて、<b>プログラムの処理を担う部分</b>にあたります。

Lambdaを理解するにおいて、まず<b>サーバーレスコンピューティング</b>の概要について学ぶ必要があります。

### サーバーレスコンピューティングとは？
今回は、webアプリケーションを開発＆デプロイするケースを例とします。
従来通りであればプログラムを実行するためのwebサーバが必要となります。また、そのwebサーバーを実行するためのOSサーバーの環境なども構築する必要があります。webアプリケーションを開発＆デプロイする際に、実行環境の構築はかなり大変な作業となります。この従来のシステムを<b>サーバーフル</b>といいます。

サーバーレスコンピューティングは、簡単にいうと、<b>EC2等でサーバーを構築しなくてもプログラムの処理を実行できるようにする</b>考え方です。ユーザは実行環境を構築する必要がなく、アプリケーションで実行したい処理のみを記述すればよくなります。

サーバーレスコンピューティングでは、webサーバやOSサーバの代わりにLambdaがプログラムの実行を担っています。

## Lambdaを触ってみた
今回のハンズオンではSTEP1,STEP2の二つを実施しました。それぞれの内容は以下の通りです。
- STEP1: AWS CDKを使用し、PythonのコードをLambdaに登録してみる。
- STEP2: Invoke APIを用いて複数のLambdaを起動し並列な計算を行う。

また、登録するPythonファイルの内容は、["salmon","tune","squid"]の3種類の文字列をランダムに選択し、文字列を返すという簡単な関数となっています

### STEP1
STEP1ではPythonのコードをLambdaに登録する作業を行いました。

まず、プロジェクトのディレクトリに移動し以下のコマンドを実行しました。
```
# venvを作成し、依存ライブラリのインストール
$ python3 -m venv .env
$ source .env/bin/activate
$ pip install -r requirements.txt
# デプロイの実行
$ cdk deploy
```
実行後、以下の文字列が返されました。正しくデプロイできたことがわかります。
![10-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/d9ec8258-fae6-bced-b2cb-382e7066989a.png)

AWSコンソールにアクセスし、関数名をクリックすると無事登録した関数を表示させることができました。
![10-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/67e43323-2fc4-4c7c-de82-48b3659d5321.png)
これで、登録は完了です！

### STEP2
STEP2ではInvoke APIを用いて実際に計算を行いました。
まずは1回だけ処理を実行してみます。

以下のコマンドを実行します。
```
$ python invoke_one.py #{デプロイ時に出力されたランダムな文字列}
```
実行したところ以下の結果が得られました。これにより、クラウド上で関数が動き実際に出力が返されたことがわかります。
```
"Welcome to Cloud Sushi. Your order is salmon"
```
次に同時に100のタスクを実行するために以下のコマンドを実行しました。
```
$ python invoke_many.py #{デプロイ時に出力されたランダムな文字列} 100
```
その結果以下のような出力が返されました。
```
Submitted 100 tasks to Lambda!
```
コンソールを確認したところしっかりタスクが受理されていることを確認できました。
### スタックの削除
演習は完了なので以下のコマンドでスタックを削除しました
```
$ cdk destroy
```

## さいごに
以上が今回行ったLambdaの演習内容です、この演習でサーバーレスコンピューティングとは何か、関数を実際に登録し、処理を実行させる流れを掴むことができました。
医薬品に関する情報をスプレッドシートでまとめてノーコードでアプリ化してみた

初めて記事をご覧いただいた方は初めまして、すぎじゅんと申します。
↓↓↓↓↓↓前回書いた記事はこちらになります↓↓↓↓↓↓

https://qiita.com/kapibara6725/items/e51d5662136b53f73145

実は私は普段、第2類、第3類医薬品を販売することができる登録販売者として働いていまして、お客様から薬の効果や違いなど聞かれることが多々あるのですが、薬の成分や漢方の効能についてたまに忘れてしまうことがあります。そこで今回は医薬品の成分をまとめてアプリ化することでWeb検索より検索しやすくし、お客様にも待たせないようしようと思い作成しました。

# 目次

[1.アプリの出来栄え](#1-アプリの出来栄え)
[2.使用サイト](#2-使用サイト)
[3.アプリの作り方](#3-アプリの作り方)
[4.同僚に使用してもらった](#4-同僚に使用してもらった)
[5.おわりに](#5-おわりに)

# 1. アプリの出来栄え

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/a08483cc-ee2d-2e6d-b3bd-7647631c50f7.gif" width="100%>

意外と使い勝手の良い感じになって満足ですが、現状風邪の医薬品しか実装できていないので徐々に増やしていきたいと考えています。
↓↓↓皆さん使用感を試してコメントをください↓↓↓

https://joyous-fall-8162.glideapp.io/
# 2. 使用サイト

今回使用したソフトはGlideとGoogleスプレッドシートです。スプレッドシートはExcelのようなもので使ったことがある人も多いと思いますがGlideは初耳という方、**大丈夫、意外と簡単**です！ノーコードで作れるアプリなのでIT初心者でも大丈夫です。かくいう私も何もプログラミング言語を知りませんが作れました！
↓↓↓↓↓↓Glideのリンクはこちらから↓↓↓↓↓↓

https://www.glideapps.com/

GlideはGoogleアカウントからログインできますので万一持ってない人は作りましょう！
# 3. アプリの作り方
![スクリーンショット_2022-05-04_0_29_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/98bbdb41-a496-ea2b-e351-bba3b8b606b2.png)
まずNew Projectからをクリックします。一から作るのがめんどくさいという方はテンプレートがあるのでテンプレートを使うと良いと思います。
↓↓↓テンプレートについてまとめてくれている人がいたのでリンクを貼りますので活用してください↓↓↓

https://note.com/nonocodenolife/n/n2402de0f6e0c

![スクリーンショット_2022-05-04_0_39_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/24762d2b-f3f4-2eed-d4a8-f5e5e6740fd4.png)
次にスマホアプリにしたい場合は左のGlide Appを、ウェブサイトみたいにしたい場合は右のGlide Pageにします。今回はスマホでの使用が想定されているため、Glide Appを選択します。
![スクリーンショット 2022-05-04 0.39.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/89cb928c-a94c-eda9-5367-1b9c7a9bad6d.png)
その後どのデータを参照するか選択する画面が出てくるので今回はスプレッドシートを選択します。
![スクリーンショット 2022-05-04 0.46.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/ec386ab0-5234-e3b8-4fd1-86ae54629d7f.png)
次にスプレッドシートを選べるので使いたいシートを選択します。
![スクリーンショット_2022-05-04_0_50_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/c91250c5-5f5f-9bcd-5e90-cc0938716d4c.png)
その段階であら不思議、もうすでに検索アプリができています。
![スクリーンショット 2022-05-04 0.52.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2618807/6167b2bb-08d3-2301-6e3c-fa53fe2cb763.png)
ちなみにスプレッドシートはこんな感じです。アプリを作るより、シートに打ち込む方が時間がかかりました・・・
# 4. 同僚に使用してもらった

|良かった点  |悪かった点  |
|---|---|
|成分はすぐ検索でき、注意点なども一目でわかるため便利  |漢方の検索がしづらい（漢字を打たないといけない）  |


指摘を受けて漢方に**全てふりがなを振る**ことでひらがなと漢字の両方で検索をかけられるようにしました。その結果、かなり使いやすくなった、全部作ってくれと言われました。（手伝ってくれ）
# 5. おわりに
今回はノーコードでアプリを作ってみたのですがいかがだったでしょうか。意外と簡単に作れるということにびっくりした人も多いと思います。私も前回のLinebotに比べて簡単に実装できてしまったので拍子抜けしてしまいましたが、ここからトップページとかこだわり始めたら止まらなくなってしまうんだろうなあと思い、スプレッドシートの充実に時間を使用しました。**Web検索だともしも２つの成分について知りたかった場合最低２回検索をかけて２回サイトへの遷移に行く必要がありますが、アプリ化することで２回サイトへの遷移の分の作業を省略することができました**。今後もこのような記事を書いていきますのでよろしくお願いします。ではでは。

(22.5.6追記)
・症状から検索できた方が良い
・代表的な商品名まで落とし込めていると尚良い
との意見をいただきました。解決するには商品名からツリーのように検索をかけられるようにしていく必要があるので、かなり大掛かりな改造が必要そうです。
emacs lsp-mode pythonの設定備忘録

emacsでの設定を触り始めて1年くらい経つが、python環境にすごく悩まされていた。そこでlsp-modeというものを見つけ、手こずりながらもうまくいったので備忘録として取っておく

特にmako さん　https://mako-note.com/ja/python-emacs-lsp/
が大変参考になり、助かりました。

## 1. 環境
m1 pro 2021
Mac OS monterey 12.3.1
lsp-mode
pyright

## 2. pyright
https://mako-note.com/ja/install-node14-on-m1-mac/
を参考にインストール

初めにnode.jsが必要なのでインストールする

~~~terminal:terminal
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
~~~

そうすると .zshrcにnvmの環境pathがインストールされるので以下を追記

~~~el:.zshrc
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
~~~

ここで**ターミナルを再起動**（これを忘れたおかげでパニクった）
できたら以下を記述しnode.jsをインストール
~~~el:terminal
nvm install v16.3.0
~~~

これでnode.jsは入った
続いてpyrightを入れる

~~~tj:terminal
npm install -g pyright
~~~
このあとはターミナルで`pyright`と入力したらサーバーが入った（？）
少しわからない動きをしたので不安。。。

## 3. その他のインストール
他のパッケージは``M-x list-packages``から入れた
必要なパッケージ
* lsp-mode
* lsp-ui
* company
* lsp-pyright

## 4. init.el
あとは記述するだけ
~~~el:init.el
;; lsp-mode
(require 'lsp-mode)
(setq gc-cons-threshold 100000000)
(setq read-process-output-max (* 1024 1024))
(setq lsp-completion-provider :capf)
(setq lsp-idle-delay 0.500)
(require 'lsp-ui)
(setq lsp-ui-imenu-enable t)
(setq lsp-headerline-breadcrumb-enable t) 
;;https://kazuhira-r.hatenablog.com/entry/2020/11/02/002728

(use-package lsp-pyright
  :ensure t
  :hook (python-mode . (lambda ()
                          (require 'lsp-pyright)
                          (lsp))))  ; or lsp-deferred
~~~
途中からuse-pakage入れたので混ざってますすみません

これで動いた!
jediで頭を抱えていた頃が懐かしい

flycheckのjsonの配置がわからなかったりまだまだ改造したりないのだがGWはもうお休みしようかな。

lspによって楽になったと聞くけど、初心者にはまだまだしんどかったです。。。

## 5 参考リスト
https://kazuhira-r.hatenablog.com/entry/2020/11/02/002728
https://mako-note.com/ja/python-emacs-lsp/
AWSとは

# AWSとは
AWSとは、クラウドコンピューティングを使ったサービスです。
## クラウドコンピューティングサービスとは
インターネットを介してサーバー・ストレージ・データベース・ソフトウェアといったコンピューターを使った様々なサービスを利用することを指します。クラウドコンピューティングでは、手元に1台のPCとインターネットに接続できる環境さえあれば、サーバーや大容量のストレージ、高速なデータベースなどを必要な分だけ利用できるわけです。
## オンプレミスとは
クラウドコンピューティングサービスが登場する前まで、サーバーを利用する必要があれば自社の建物の中などにサーバー機器を設置して利用するのが一般的でした。この運用形態のことを「オンプレミス」といいます。

## クラウドとオンプレミスの違い
オンプレミスとクラウドの大きな違いはサーバー！
### オンプレミスの特徴
* ハードウェアを自社で設置・管理する
* 高度なセキュリティを実現できる
* カスタマイズ性が高い

### クラウドの特徴
* 初期投資不要ですぐに導入できる
* リソースの増減が自由
* ハードウェアの管理が不要

## AWSには１００を超えるサービスがある
* EC2
* Amazon RDS
* cloud9　等

## EC2とは
LinuxやWindowsなどの仮想サーバを作成できるサービスです。
EC2では仮想サーバの事を「インスタンス」という単位で扱います。
## 仮想サーバーについて
仮想化とは、サーバーなどのハードウエアリソース（CPU、メモリ、ディスクなど）を抽象化し、物理的な制限にとらわれず、ソフトウエア的に統合・分割できるようにする技術です。
現代のように仮想化技術が普及していなかった頃は、サーバーは用途ごとに専用のハードウエアを用意して構築するのが一般的でした。つまり、Webサーバー、メールサーバー、ファイルサーバーなど、サーバーの種類や数が増えるごとに保有するハードウエアの台数も増えていたわけです。しかし、サーバーを仮想化することで、1台の物理サーバーの上に複数の仮想サーバーをソフトウエア的に作成し、同時に動かすことができるようになりました。

## 仮想化とクラウドの違い
<dl>
  <dt>仮想化</dt>
  <dd>ハードウエアを抽象化し、リソースを効率よく利用できるようにするための技術</dd>
  <dt>クラウド</dt>
  <dd>ネットワーク経由で利用することができるサービスの呼び名</dd>
</dl>

# 参考文献
AWSとは？ 初心者にもわかりやすく解説
https://www.skyarch.net/column/whataws01/

【クラウドとは？】初心者にもわかりやすく解説
https://www.wafcharm.com/blog/cloud-for-beginners/#:~:text=%E3%80%8C%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89(%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0)%E3%80%8D%E3%81%A8%E3%81%AF%E3%80%8C%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9,%E3%81%AE%E6%96%99%E9%87%91%E3%82%92%E6%94%AF%E6%89%95%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

オンプレとクラウドを比較検討しよう！社内システムはどちらを選べば良い？
https://cloud-ace.jp/column/detail191/

仮想サーバとは
https://www.cloudsolution.tokai-com.co.jp/white-paper/2021/0419-230.html

仮想化とは
https://pfs.nifcloud.com/navi/beginner/virtualization.htm
Laravel画像アップロード（Intervention Image）

# Laravel 画像アップロード

inputタグを使うけども、ファイルかどうかを確認するバリデーションを設定


画像サイズは統一にした方がレイアウトが綺麗になる（例えば、1920px✖️1080px)
- ユーザー側でリサイズするパターン
    - 1920px✖️1080pでないとアップロードできないというバリデーションをつける
- サーバー側でリサイズするパターン
    - PHPに搭載される「Intervention Image」を使う


重複しない名前で保存する
```php
//ビュー側
<form method=“post” action=“” enctype=“multipart/form-data”>
<input type=“file” accept=“image/png,image/jpeg,image/jpg”>

```
ここからは大体お約束の事柄
formのところはmultipart属性をつける
accept属性でアップロードできるファイルを指定できる


## 画像の保存 putFileを使うとフォルダも作ってくれる
```php
//画像アップロード コントローラ側
//リサイズしないパターン (putFileでファイル名生成) 
use Illuminate\Support\Facades\Storage;

public function update(Request $request, $id) {
$imageFile = $request->image; //PC側に一時保存 
if(!is_null($imageFile) && $imageFile->isValid() ){//画像があって、かつアップロードできたら(isValid)
//第一引数：保存したいフォルダ　第二引数：保存したいファイルを指定
Storage::putFile('public/shops', $imageFile); }
}
```


## Intervention Imageを使った画像保存
PHP 画像ライブラリ http://image.intervention.io/

:::note warn
注意
(もし無効になっていたら有効化する（enableにする） php.info()で確認)
:::


Ctrl + f で検索する。以下のようになっていたらOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601680/1f64a152-681a-2be7-355d-c7b1207addb2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601680/1611ab00-4fe7-6a11-4228-2150a171cc91.png)

GD 画像ライブラリをコンポーザーで入れる
composer require intervention/image

### Intervention Image 設定
config/app.php
```php
$providers = [ Intervention\Image\ImageServiceProvider::class];
// Imageだとバッティングするので変更 aliasに追加
$alias = ['InterventionImage' => Intervention\Image\Facades\Image::class ];
```

### Intervention Image リサイズ
```php
use InterventionImage;

$resizedImage = InterventionImage::make($imageFile)->resize(1920, 1080)->encode();
//Storage::putFile はFileオブジェクト想定 InterventionImageでリサイズすると画像になり型が変わる
//今回は Storage:put で保存 (フォルダは作成、ファイル名は指定)
//InterventionImage::make　でInterventionImageで画像を使えるようにする
$fileName = uniqid(rand().'_');//ファイル名を一意にする
$extension = $imageFile->extension(); //拡張子を取得する
$fileNameToStore = $fileName. '.' . $extension;//文字列連結
Storage::put('public/shops/' . $fileNameToStore, $resizedImage );
```
[Flutter]外部パッケージをインポートして標準のクラスが扱えなくなったら

# 結論

* Flutterの外部パッケージは、標準のクラスと外部パッケージのクラスで命名がダブっててエラーが出てしまうことがある
* 外部パッケージをimportする際に`import 'package_name.dart` as package_name;`みたいに名前を付けると識別できる

# 現象
外部パッケージ「[googleapis](https://pub.dev/packages/googleapis)」の docs をインストールして、
`import 'package:googleapis/docs/v1.dart';`
と書いてインポートすると、インポートしたファイル内で [List\<E>クラス](https://api.dart.dev/stable/2.16.2/dart-core/List-class.html "List<E> class") を扱えなくなりました。

![問題点1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653487/bc5b0bc6-19ef-a271-a4e3-c41e932c685a.png)
![問題点2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653487/d6822c62-a25b-2811-1723-012c4b10b572.png)

# 原因
`package:googleapis/docs/v1.dart`の中でListを上書きするクラスが宣言されていることが原因だと思います。

該当箇所は以下になります。
![OverrideListOf_docsv1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653487/4d335b56-77b8-b12c-984d-8425980152de.png)

# 対策
`import 'package:googleapis/docs/v1.dart'`にの末尾に`as google_docs;`を追記してあげるとListクラスが区別されエラーが解除されます。

![解決策.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653487/f3e4e922-0ee7-3cb0-188b-f04b62aee59a.png)


# 環境
```terminal:"flutter --version"の実行結果
Flutter 2.10.4 • channel stable • https://github.com/flutter/flutter.git
Framework • revision c860cba910 (6 weeks ago) • 2022-03-25 00:23:12 -0500
Engine • revision 57d3bac3dd
Tools • Dart 2.16.2 • DevTools 2.9.2
```
```dart:pubspec.yaml
dependencies:
  googleapis: ^8.1.0
```
Gem パッケージのインストール先を調べる

`gem install` でインストールしたあと executable なファイルが見つからなかった。次のコマンドで Gem パッケージのインストール先ディレクトリが明らかになる。

```
gem environment gemdir
```

executable なファイルが見つからなかった原因は rbenv rehash をし忘れていたからだった。
Rails+ReactのDocker環境(TechpitさんのUberEats風SPAアプリ)

# 概要
Railsチュートリアルを完走し終えまして、
次何しようかなと考えていたところに「完走者向け発展教材（Techpit）」を見つけたので、教材に挑戦しています。

「RailsとReactでUberEats風SPAアプリケーションをつくってみよう！」
https://www.techpit.jp/courses/138

ただ、PC上に展開したくなくてDocker上で動作するようにしました。

# ソースコード
Dockerfile 
```Dockerfile 
FROM ruby:2.7.2
RUN apt-get update -qq && apt-get install -y build-essential nodejs postgresql-client libpq-dev

RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
    apt-get update && apt-get install -y yarn

RUN curl -sL https://deb.nodesource.com/setup_14.x | bash
RUN apt-get install -y nodejs

RUN mkdir /uber-eats-like
WORKDIR /uber-eats-like
COPY Gemfile /uber-eats-like/Gemfile
COPY Gemfile.lock /uber-eats-like/Gemfile.lock
RUN bundle install
COPY . /uber-eats-like

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000 3001

CMD ["rails", "server", "-b", "0.0.0.0"]
```

教材ではnode v12 だったのですが、frontend側作成時にv14以上でないと作成できなかったため、バージョン上げています。
`RUN curl -sL https://deb.nodesource.com/setup_14.x | bash`

```docker-compose.xml
version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=password
  web:
    build: .
    # command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/uber-eats-like
    ports:
      - "3000:3000"
      - "3001:3001"
    depends_on:
      - db
```

`command`入らないかもと思ったのでコメントしていますが、動かなかったらコメント外してください。

ポートは3000がAPI(rails)、3001がフロント(react)です。

## frontend起動コマンド
4章でfrontend側の開発環境構築するので、以下コマンドで起動します。
```
$ docker exec -it uber-eats-like_web_1 sh
$ cd frontend
$ PORT=3001 npm start
```

# おわりに
この教材着手してから数カ月放置していたからそろそろ終わらせるぞー
新卒未経験初心者がLPIC Level1を3週間で取得した物語

新卒駆け出しエンジニアのCybermanです。

記者のスペック以下の通り。
・大学文系（地域活性化系）
・タイピングE＋（e-typing）　※1分間ではかったとき20文字だったかな？
・幼少期にPCつぶした遊んでた（笑）
・Word2013　Excel2013取得済
・なぜかクラウドだけ触ったことあるがNWってなに？レベル。（プログラミング不可）

# 本記事について
私がLPIC Level1を3週間で取得した記事であり、資格取得が目的であり実務では難しくなります。
取得前はLinuxをほんの少し触れたことがあり、コマンドまでは知らないまでの知識でした。

最初に結論から話します。
LPIC の「Level1」」は暗記に限ります。少し考えますが、大半は暗記です
そして一番のクセ物がコマンドによる「オプション」になると考えます。これは下記で説明します。

# 1.LPICについて
Linux Professional Institute(LPI)が認定する資格の一つ。本記事で紹介するのは、LPIC の中でも、初級編によるLevel1である。このレベルの資格はインフラエンジニア及び、基盤構築エンジニアでは必須の資格です。

# 2.使用サイト及び参考書について
使用した参考書とサイトは以下の通り。

・[Linux教科書 LPICレベル1 Version5.0対応(小豆本)](https://www.amazon.co.jp/Linux教科書-LPICレベル1-Version5-0対応-中島-能和/dp/4798160490/ref=asc_df_4798160490/?tag=jpgo-22&linkCode=df0&hvadid=295678107984&hvpos=&hvnetw=g&hvrand=11616471740164091419&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009299&hvtargid=pla-649269108462&psc=1&th=1&psc=1
)
・[PingT(WEB問題サイト)](https://ping-t.com)

それぞれの特徴を解説します(個人的な意見)

一つ目のLinux参考書いわゆる「<font color="red">**あずき本**</font>」です。この参考書は細かい部分が明記されいますが、何も知識がない人は少し理解が難しいと思います。ですが無理矢理暗記すれば覚えれます。(<font color="red">**記者の場合は無理やり単語を付け加えました**</font>)

二つ目のPingTは多くのユーザが利用している<font color="red">**WEB問題集**</font>」です。これを利用していない人は逆に少ないと記者は考えるくらい利用されています。このサイトは参考書には載っていない問題も出てくる時もありますが、これも覚えてしまった方が楽です。(笑)

# 3.具体的な内容について
私は一通り「<font color="red">**あずき本**</font>」を読み、その後にPingTで各項目で問題を解いていました。
勉強期間は以下の通りです。
・平日2時間～3時間　
・休日5時間～7時間
期間：3週間

基本的には上記の期間で参考本で学び→サイトで問題を解く→てわからない部分はググる→サイトで問題を解くの繰り返し
これにより大体どの問題が来ても、ほぼ答えられる様になれば問題ないと思います。

# 4.取得するメリットとデメリットについて
メリットとしては、基本的なOS回りやアクションを起こしたいときにどのコマンドを使用すればよいかぐらいは理解できるようになる。また、エンジニア以外が取得するメリットは少ないが、IT企業に勤めており営業さんであれば役に立つときはあるかもしれません。

デメリットとしては、どんな資格にも共通することですが、どのような勉強方法であったとしても所有資格レベルの内容は頭に入っていると認識される思います。(<font color="red">**記者の様なやり方は現場優先度が高い企業であると効果が薄いです**</font>)

# 5.最後に
最後に、改めてLPICなどのベンダー資格は暗記でいけるとよく聞きますが、私も少なくとも経験してそうだと感じました。その理由としては、試験内容が似ているもしくは、相当のものが出題されるからです。そして、それらを覚えることは可能であり、その内容を覚えるでけで試験に合格できる可能性が高いと言えると思います。

最後にもう一度(<font color="red">**LPIC1は暗記に限ります**</font>)ですが、この記事を見ている人は恐らく今から試験を受けるか、どんな資格なのかを調べている人だと思います。なので、今後資格を受験する方はや勉強しようと考えている方がいれば様々な記事をみて参考にしてみたください。
コマンドラインからcsvファイルをmarkdownの表に変換する際の備忘録

コマンドラインからcsvファイルをmarkdownの表に変換する際の備忘録です

`csvtomd`を使います

> https://github.com/mplewis/csvtomd
> csvtomd: markdown tables made easy

インストール

```
sudo pip3 install csvtomd
```

テスト用のcsvファイルを用意する

```csv:test.csv
No,str1,str2
1,aaa,bbb
2,ccc,ddd
3,eee,fff
```

実行

```
$ cat test.csv | csvtomd
No  |  str1  |  str2
----|--------|------
1   |  aaa   |  bbb
2   |  ccc   |  ddd
3   |  eee   |  fff
```

便利！

# 参考

https://github.com/mplewis/csvtomd

https://yuis-programming.com/?p=1991
【VSCode】Markdownに画像をペーストする

## はじめに
`.md`ファイルに画像を挿入するには画像を保存したうえで`![代替テキスト](/path/to/image)`と記述する必要があります。
`Paste Image`という拡張機能を利用することで上記の作業を簡略化できるのでその利用方法について記載します。

## `Paste Image`の利用方法と設定
### 利用方法
拡張機能の中から`Paste Image`を探し、インストールします。

https://marketplace.visualstudio.com/items?itemName=mushan.vscode-paste-image

![image220504_000114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/003d326b-e747-dd0c-ddd7-dd6c48652926.png)


使い方は非常に簡単で、ペーストしたい画像をクリップボードに保存して`cmd + opt + v`を入力するだけです。
すると以下のように入力され、画像も保存されます。

![image220504_000453.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/0383349c-076e-a345-9464-4b8edc40db52.png)


![image220504_000558.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/265fc38e-2291-b734-4ea0-bc8649ad42ea.png)


注意点として、Macの場合にはFinderに表示されるアイコンを選択して`cmd + c`しただけではペーストできません。
画像ファイルを開いてから`cmd + c`する必要があります。

### 設定
デフォルトでは画像ファイルの名前は`Y-MM-DD-HH-mm-ss.png`になっています。
また画像の保存場所は`.md`ファイルがあるディレクトリになっていますのでこれを変更します。

設定画面を開いて`Default Name`を`[image]YYMMDD_HHmmss`に変更します。
![image220504_001155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/b09d0142-b27b-d94a-dc5a-38c39b21f074.png)


ファイル名が`imageYYMMDD_HHmmss.png`に変更されます。

`Path`も`${currentFileDir}/images`に変更します。
![image220504_001429.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/99783068-4988-d07a-2988-8695e88b71ac.png)


画像ファイルの保存先が`.md`ファイルと同階層の`images`に変更されます。
ZoomURLを作るのが面倒くさいから自動で作成する仕組みを作った

こんにちは
私は小売業で働いており、研修の講師をしています。
コロナの影響で研修もオンラインになり、ZoomやTeamsを使用する機会が増えました。
研修があるたびにZoomURLを作成しているのが面倒くさいので
今回はMakeを使用して自動的に研修URLを作成してくれるものを作りました。


## 作成したもの・使用したもの
今回はMakeを使用して、Googleカレンダーの予定に研修と書いてあるものから
自動的にZoomのURLを作成し、URLをGoogleスプレットシートに転記する仕組みを作成しました。




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811930/9dbe4852-a469-3731-d261-bdaa5f763135.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811930/d3ab9e43-9e2a-9fda-fcf8-254af2fd8e4b.png)

**上手く起動するとこのようにGoogleスプレットシートにZoomURLが転記されます。**

## 事前に準備すること
あらかじめMake・Googleカレンダー・Zoom・Googleスプレットシートの
登録をしてください。

:::note alert
**Makeを登録する際、Googleアカウント等の別アカウントでログインする場合は、
絶対にログアウトをしないでください。**
ログアウトすると再ログインできなくなりました・・・
Makeを登録する際は、ご自身でパスワード・メールアドレスを新規登録をすることをお勧めします。
:::




## Connectionの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811930/f7a2b833-7217-1e74-2e0c-6e9015674896.png)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811930/e3d40757-2d21-1ff3-bb3b-eb24a89c4f97.png" width="400" height="200">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811930/28fde0ce-449b-f352-9999-446c564d271a.png" width="400" height="200">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811930/0bd22e06-71dc-3d9c-70ab-cbe2bb96a23f.png" width="400" height="200">

:::note info
**Connectionの設定はZoomやGoogleスプレットシートでも設定が必要です。**
**GoogleカレンダーとGoogleスプレットシートのアカウント（メールアドレス）は**
**同じものに設定してください。**
:::








## Googleカレンダーの設定
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811930/33be5721-84e1-c4e2-18e4-19087accc7e7.png" width="400" height="200">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811930/595a107c-3956-0f3f-06f8-0ee67fc8b45a.png" width="400" height="200">



## Zoomの設定
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811930/a58f9252-a82e-8018-487a-bcc9ffb7b89c.png" width="400" height="200">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811930/d3a8f63b-1097-4313-36c8-e46e8335c253.png" width="400" height="200">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811930/94305a1d-a3c3-a7ea-8eb2-074ca022f3c3.png" width="400" height="200">

## Googleスプレットシートの設定


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811930/ab7d8914-c7ae-510e-11c1-970fb4eade95.png" width="400" height="200">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811930/d642b983-3834-5e66-d8d7-c0261e7d1c5d.png" width="400" height="200">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811930/b9e42ea5-238b-e150-981b-3e1585ec20b9.png" width="400" height="200">



　
## 上司とよくZoomを使用する友人からFBもらいました。
・すごい！！確かにめんどくさい作業だった！！
・TeamsのミーティングURLも自動作成してほしい。
・Googleスプレットシートに転記より、Excel転記の方が使いやすい！
・タイトルが研修のみだから、○○研修とタイトルがわかりやすい方が良い。
・Zoomパスワードも一緒に転記してほしい。
・研修受講者全員にZoomURLをメールで送付してくれたらもっと助かる。

確かに・・・
まだまだ修正の余地ありです。


## 最後に
ノーコードで作成できるのはすごく便利です。
私はこの仕組みを同僚にも日々使ってほしいのですが、
Makeを登録するだけで今回作成したものが使用できるので、引継ぐ際に楽だなと思いました。

最後まで読んでいただきありがとうございました。
Docker ComposeでMySQL環境を構築する

# はじめに
Docker Composeを使ってMySQLの環境を構築しました。
詳細は、以前にDocker DesktopとDockerコマンドで作成したものと同じです。
[以前の記事はこちら](https://qiita.com/kaburankattara/items/751cb1cc34bcbe494150)

# 実行環境
OS：MacOS Monterey 12.3.1
Docker：Docker version 20.10.14
DB：MySQL8.0

# Docker Composeとは
Dockerで構築するコンテナやネットワーク、ボリュームなどをYAML形式のファイルで定義し、
複数のリソースを構築し停止・破棄することが出来ます。

# Docker Composeのインストール済を確認
Docker forMac（Windowsも）を利用している場合、
Docker Compose は内包されているはずなので、別途でのインストール不要です。

インストール済であることを確認する場合、以下のコマンドを実行します。

```shell
% docker-compose -version
docker-compose version 1.29.2, build 5becea4c
```

# 定義ファイルを作成する
コンテナ構築に必要な設定はYAMLファイルで定義します。
[Dockerのドキュメント](https://docs.docker.jp/compose/compose-file.html)より、使用しているdocker composeのバージョンが1.20.0 以上のため、
[こちらのCompose 仕様](https://github.com/compose-spec/compose-spec/blob/master/spec.md))を基準に定義していきます。

YAMLファイルでコンテナを定義するにはservices要素内に定義します。
services内に定義した要素名がコンテナ名となります。
今回は、イメージ（バージョン付き）、ポートマッピング、環境変数、ボリュームマッピングを定義します。

具体的には以下の通り

```yaml
version: '3'

services:
  mysql-container-comporse:
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=my-secret-pw
    volumes:
      - /Users/xxx/docker/mysql-container-compose/volumes:/var/lib/mysql
```

# コンテナの起動・停止

コンテナを起動する時

```shell
% # コンテナを作成＋起動
% docker-compose -f (YMALファイルのパス) up -d

% # コンテナの作成
% docker-compose -f (YMALファイルのパス) create

% # コンテナを起動
% docker-compose -f (YMALファイルのパス) start
```

コンテナを停止する時

```shell
% # コンテナを停止＋削除
% docker-compose -f (YMALファイルのパス) down

% # コンテナを停止
% docker-compose -f (YMALファイルのパス) stop

% # 停止中のコンテナを削除
% docker-compose -f (YMALファイルのパス) rm 
```


# 参考文献
https://docs.docker.jp/compose/toc.html

https://github.com/compose-spec/compose-spec/blob/master/spec.md

https://hub.docker.com/_/mysql
seleniumを利用してGoogle認証を通す方法

## やりたいこと
Googleアカウントで認証されるサイトにログインしたい。

■実行環境
　jupyter notebook（Chromeで実行）
■言語　
　python
■ライブラリ
　selenium

## ぶちあたった壁①
下記のコードでchromeが起動され、Googleのアカウント入力画面が表示されるところ
まではいいのですが、入力後「ログインできませんでした」メッセージが表示されます。
機械による操作と判断されたときのGoogle側の対処のようです。

```python:
from selenium import webdriver
browser = webdriver.Chrome(r'C:\Users\[ユーザ名]\chromedriver.exe')
browser.get([目的のURL])
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998522/3a5ca118-6f18-4080-a317-1e347b40edc4.png)

## ぶちあたった壁②
Googleアカウントが認証されたプロファイルを指定（※）してseleniumでchromeを起動
すれば認証が通る、という記事を見つけたので早速実行！
※プロファイルとはPCのログインユーザに近いイメージでGoogleアカウント
　そのものではありません
　そのプロファイルでGoogleアカウント認証させておくことを意味します

＜補足＞
　現在自分がどのプロファイルを利用しているかはChromeのアドレスバーで
　　chrome://version
　と入力した時、「プロフィール パス」項目に表示されます。

```python:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument(r'--user-data-dir=C:\Users\[ユーザ名]\AppData\Local\Google\Chrome\User Data')
options.add_argument(r'--profile-directory=Default')

browser = webdriver.Chrome(r'C:\Users\[ユーザ名]\chromedriver.exe',options=options)
browser.get([目的のURL])
```
奮闘空しく、エラー発生・・・
「すでに該当のディレクトリは使われている」との事です・・・

```python:
InvalidArgumentException: Message: invalid argument: user data directory is already in use, please specify a unique value for --user-data-dir argument, or don't use --user-data-dir
```

## ぶちあたった壁③
とすると、ディレクトリ（フォルダのパス）を変えればいいんじゃね？
と思いますよね？

そこで完全に別にフォルダ（C:\workspace）を作成し、そこに
　C:\Users\[ユーザ名]\AppData\Local\Google\Chrome\User Data
　┗Default
のフォルダをまるまるコピーし、下記部分のみ変更して、いざ実行！

```python:
options.add_argument(r'--user-data-dir=C:\workspace')
```

エラーにはならなかったですが、chromeの右上のユーザアイコンが指定したプロファイルの
ものではなかったです。
気にせず（いや、かなり気になりつつも）そのまま、Googleログインしようとしたが、
「ぶちあたった壁①」と同じ結果に・・・

## 解決
「Jupyter Notebook（Chromeで実行）」ではなく「Visual Studio Code」側で実行したら、
するりと壁をすりぬけました。

コードは「ぶちあたった壁②」のものでいけました。

Chrome上でJupyter Notebookを起動せずにすんだので、「ぶちあたった壁②」を回避できた
ということでしょう。

「ぶちあたった壁③」で行けなかった理由は結局わかっておりませんが、まぁよしとしましょう。
スタバの期間限定のバナナナバナナフラペチーノって言いづらくないか？？

# はじめに
ネタ記事ですので、お時間のある方推奨です。

# スターバックスの新作
みなさんは、最近のスターバックスの[期間限定商品](https://www.starbucks.co.jp/cafe/bananana/?nid=tbn_01_pc)をご存知でしょうか。
そう、ご存知の通り「バナナナバナナフラペチーノ」と「チョコバナナナバナナフラペチーノ」です。
（私はそういう華やかなもの？には疎いので、行くまでは知りませんでした。）

行ったタイミングでそれが期間限定だったため、
「バナナナバナナフラペチーノ」注文しようとしたのですが、商品名が随分言いづらい、、、。
そこで私は恥をかかないようにと、小声で「バナナナバナナフラペチーノ」と練習していました。

注文の順番が回ってきましたが、練習のおかげか噛むことなく「バナナナバナナフラペチーノ」と言うことができました。
ですが、注文の復唱は「バナナフラペチーノが一点ですね。」でした。

そこで僕は「おいおい、バナナフラペチーノでも良かったんかい。」ではなく、「バナナフラペチーノだと、普通のバナナフラペチーノとチョコのバナナフラペチーノと区別つかなくない？？」と思いました()

# 正式名称で呼ぶのが面倒なら、省略して尚且つ区別がつくようにしよう
普通の人なら区別がつくでしょう。ですが、私はこんなでもエンジニアの端くれ。
残念ながらこう思ってしまったのです。

```
[root@tabi ~]# cat banana.txt
バナナナバナナフラペチーノ
チョコバナナナバナナフラペチーノ

[root@tabi ~]# grep "バナナフラペチーノ" banana.txt
バナナナバナナフラペチーノ
チョコバナナナバナナフラペチーノ
```

ほら、「バナナフラペチーノ」だと、どっちか分からないでしょう。
こんなときは、正規表現を使えば良いのではないでしょうか！

```
[root@tabi ~]# grep -E "^バナナナバナナフラペチーノ" banana.txt
バナナナバナナフラペチーノ
```

これだと、「バナナナバナナフラペチーノ」なことは分かりますが、店員さんは省略したいので、省略していきましょう。

```
[root@tabi ~]# grep -E "^バ(ナ){3}バ(ナ){2}" banana.txt
バナナナバナナフラペチーノ
```

フラペチーノも無くすことで、かなり短くなりましたね。
ですが、トッピングがある場合は、それと区別ができません。

```
[root@tabi ~]# cat banana.txt
バナナナバナナフラペチーノ
チョコバナナナバナナフラペチーノ
バナナナバナナフラペチーノ　生クリームトッピング

[root@tabi ~]# grep -E "^バ(ナ){3}バ(ナ){2}" banana.txt
バナナナバナナフラペチーノ
バナナナバナナフラペチーノ　生クリームトッピング
```

これでバナナナバナナフラペチーノを頼んでいることが分かりますね！

```
[root@tabi ~]# grep -E "^バ(ナ){3}バ(ナ){2}フラペチーノ$" banana.txt
バナナナバナナフラペチーノ
```

# おわりに
スターバックスさんにこの記事を読んでもらって、
復唱のときは「^バ(ナ){3}バ(ナ){2}フラペチーノ$」と言ってもらうようにしよう。

そもそも、「バナナナバナナフラペチーノ」→「バナナフラペチーノ」、「チョコバナナナバナナフラペチーノ」→「チョコバナナフラペチーノ」だから、さっきの検証は意味がないって？

君のような勘のいい読者は嫌いです笑

----
`.*`とか使いがちですが、正規表現を使うときは、ご注意をという記事でした。
これの方が良いんじゃない？とかそういうのあれば、コメントしていただけますと幸いです。
BRAKER2 を使ってタンパク質コード領域を予測する 

#2022/7/1 追記：hintsファイルによるサポートのないアノテーションを除去

前回の記事 [BRAKER2のインストール](https://qiita.com/drk0311/items/a3ac648f2780cfee57b1) によってBRAKER2を実行する環境ができていることを前提とする。特に GeneMark 関連の設定ミスが大抵のエラーの原因なので、ハマッてしまったと思ったらよく見直そう。
インプットは [RepeatModeler/RepeatMasker](https://qiita.com/drk0311/items/cba7958319737a1f12c0) で Softmasking を実施した `GENOME.softmasked.fasta` と、OrthoDB からダウンロード・マージした `proteins.fasta` だ。

コマンドはシンプル
```
conda activate braker
braker.pl --genome=GENOME.softmasked.fasta --prot_seq=proteins.fasta --softmasking --cores=24
``` 
`--cores` は並列計算で使うCPUの数。途中のプロセスで最大8コアしか使わないところがあるが、結局沢山使った方が早く終る。が、48を超えると挙動が不安定になりがちなようだ。

サイズが 1 Gbp 以下の比較的小さいゲノムなら２～３日待てば終わる。結果はカレントディレクトリの中に `braker` というディレクトリが生成されてそこに書き出される。最終産物は `braker.gtf`。

# 余計なアノテーションを除去
braker の遺伝子予測はかなり優秀で、brakerだけでだいたい遺伝子の95%くらいは予測できてしまう。ただ問題は、予測される遺伝子数がべらぼうに多いことだ。2倍体の植物ではだいたい3万遺伝子前後が妥当な数字だが、braker で予測される遺伝子数はたいてい5万前後になる。ORFが組めるというだけで余計な遺伝子まで予測してしまうからだ。そして、gtf ファイルの中身をを見てもどれが Protein.fasta をもとに予測した遺伝子で、どれが純粋に予測しただけの遺伝子なのか区別がつかない。
　だが、braker では解析の途中で Protein.fasta のマッピングで遺伝子の位置を予測したhintsfile.gff というものが生成されるので、このヒントとオーバーラップしてる遺伝子は、少なくとも既存の遺伝子コード配列に基づいた予測遺伝子ということになる。

やり方だが、https://github.com/Gaius-Augustus/BRAKER/tree/report/scripts/predictionAnalysis のページにある、`predictionAnalysis.py` と `selectSupportSubsets.py` を使う。


ということで、↓のコマンドを `braker ディレクトリ`の中で実行して、スクリプトをダウンロードし、実行権限も付与する。
```
wget https://raw.githubusercontent.com/Gaius-Augustus/BRAKER/report/scripts/predictionAnalysis/predictionAnalysis.py
wget https://raw.githubusercontent.com/Gaius-Augustus/BRAKER/report/scripts/predictionAnalysis/selectSupportedSubsets.py
chmod +x predictionAnalysis.py selectSupportedSubsets.py
```

次に、↓を打つ。
```
./selectSupportedSubsets.py --fullSupport braker.FULL.gtf --anySupport braker.ANY.gtf --noSupport braker.NO.gtf braker.gtf hintsfile.gff
```
これで、hintsファイルと完全一致している予測遺伝子は braker.FULL.gtf に、少しでも hints とオーバーラップがある予測遺伝子は braker.ANY.gtf に、hints に基づかない、純粋な予測は braker.NO.gtf に分類して吐き出される。当たり前だが、ANY には FULL も含まれるよ。fully-supported と partially-supported を敢えて分けたい場合は自分で差分を取ろう。



# 関連
- [ゲノムアノテーション（目次）](https://qiita.com/drk0311/items/c024888962f840e3ce3e)
- [RepeatModeler/RepeatMaskerを使ってゲノムにSoftmaskを掛ける](https://qiita.com/drk0311/items/cba7958319737a1f12c0)
- [BRAKER2のインストール](https://qiita.com/drk0311/items/a3ac648f2780cfee57b1/)
- [RNA-seq のノイズを除去してゲノムにマッピングする](https://qiita.com/drk0311/items/56715d46dc7893c95f78)
- [GeMoMa で近縁種のアノテーションを移植する](https://qiita.com/drk0311/items/32aa45b85e0ad3545067) 
- [Gffcompareを使ってGeMoMaとBrakerの差分を取り、アノテーションを補完する](https://qiita.com/drk0311/items/7c9910f12a2a959c710d)
- [EnTAP のセットアップ](https://qiita.com/drk0311/items/9bbe56dc0669376eb98f)
- [EnTAP の実行と結果の解釈](https://t.co/kWNa01djMF)
Terraformでretrieving `contact` for KeyVault: keyvault.BaseClient#GetCertificateContacts:~ とエラーが発生するときの対処法

## はじめに
TerraformでAzureKeyVaultのリソース作成しようとしたら、
謎のエラーが発生してハマったので対処法メモです。

```
Error: retrieving `contact` for KeyVault: keyvault.BaseClient#GetCertificateContacts: Failure sending request: StatusCode=0 -- Original Error: context canceled
```

## 原因と対処法
TerraformのProviderのバージョンが3.0.0だと発生するみたいです。
3.4.0に変更したら解決しました。

下記設定の例です。

```hcl:setting.tf
terraform {
  required_version = "~> 1.0.11"
  required_providers {
    azurerm  = {
      source  = "hashicorp/azurerm"
      version = "=3.4.0"
    }
  }
}
```

## さいごに
contactって証明書まわりの引数だったりするので、訳わからずハマった、、
DockerでGolang1.16.xビルド時に`//go:build comment without // +build comment`

# 経緯
Docker上でgolang1.16.xを実行中にエラーが発生した
```
../pkg/mod/golang.org/x/tools@v0.1.10/go/internal/cgo/cgo.go:67:2: //go:build comment without // +build comment
```

# 対応
1.17.xバージョンあげたら治った。
```
FROM golang:1.17.9-alpine3.15
```
tkinter(Tcl/Tk)をさわってみる

[Windows端末にVS CodeでPython開発環境を用意してみる](https://qiita.com/SAITO_Keita/items/ddcde4fdcdf5e5eaa933)の記事でPython開発環境の構築をしました。
この時に、インストールオプションで`tcl/tk`がデフォルトでチェックが入っていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/fa8c2de1-eca3-c34f-31a1-469921ef8373.png)

今回はこの`Tcl/Tk`を利用するために、Windows端末で`tkinter`のチュートリアルにある helloworld プログラムを実行してみます。

## そもそもTcl/Tkって？

[Tcl/Tk](https://www.tcl.tk/)
[About Tcl/Tk](https://www.tcl.tk/about/)
[Hisotry Tcl/Tk](https://www.tcl.tk/about/history.html)
[Tk Backgrounder](https://tkdocs.com/resources/backgrounder.html)

`Tcl`は`Tool Command Language`と呼ばれるスクリプト言語で、1980年代初頭にカリフォルニア大学バークレー校で誕生しました。

そんな`Tcl`で実装されたクロスプラットフォームのGUIツールキットが`Tk`になり、1991年にオープンソースとしてリリースされたようです。

現在、`Tk`は`Tcl`のみならず様々な言語で利用できるように言語バインディングが用意されています。
（`Python`では1994年に`tkinter`が登場し、`perl`など他言語も`tk`を利用できるようになっている。）

そんな歴史のあるGUIツールですが、`Python`では標準ライブラリとして`Tcl/Tk`とそのインターフェースである`tkinter`が含まれています。

## 今回利用するバージョン

- Windows 10 21H1
- Python 3.10.4
- Tcl/Tk 8.6

## tkinterのドキュメント

[tkinter --- Tcl/Tk の Python インターフェース](https://docs.python.org/ja/3/library/tkinter.html)

Pythonの公式ドキュメントを参照してさわっていきます。

## tcl/tkのバージョンを確認してみる

`tkinter`が正常にインストールされている事と`tcl/tk`のバージョンについては下記コマンドで確認できます。

```PowerShell
py -m tkinter
```

コマンドを実行するとポップアップが表示されて`Tcl/Tk`のバージョンが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/d9043874-c6e7-7551-a6d9-b52eb00f543e.png)

Windowsの`Python 3.10.4`でインストールされるのは`Tcl/Tk version 8.6`となるようです。


## helloworld

[helloworld](https://docs.python.org/ja/3/library/tkinter.html#a-hello-world-program)

公式で用意されている`Hello world`を実行してみます。

```python:hellotk.py
from tkinter import *
from tkinter import ttk
root = Tk()
frm = ttk.Frame(root, padding=10)
frm.grid()
ttk.Label(frm, text="Hello World!").grid(column=0, row=0)
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0)
root.mainloop()
```

上記のプログラムを作成して実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/90fe5866-3499-aa3d-208b-48a15366fbd8.png)

GUIで`Hello World!`と表示されました。

`Python`では`tkinter`を利用する事でGUI画面を作ることができそうです。

## 各種ドキュメント

[TkDocs](https://tkdocs.com/)
[github - roseman/tkdocs](https://github.com/roseman/tkdocs)

`Python`の`tkinter`の`helloworld`を実行してみましたが。
チュートリアルやサンプルとしては上記が参考になりそうです。

## 総評

ちょっと`GUI`をつけたい場合に便利な気はします。
Vue.jsでradioボタンをボタン化&もう一度押されたらクリアする

# 概要

* 選択肢の中からひとつだけ選んでもらいたい
* 選択肢はボタン的なデザインにしたい
* 同じ選択肢をもう一度押したら選択を解除したい

<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="PoQoxYa" data-user="reona396" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/reona396/pen/PoQoxYa">
  Vue_radio buttons</a> by reona396 (<a href="https://codepen.io/reona396">@reona396</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 解説
「選択肢の中からひとつだけ選んでもらいたい」ということでradioボタンで実装している。
CSS側でradioボタンの穴みたいなやつを消している。

```css:css
input[type="radio"] {
  display: none;
}
```

inputのlabelに対して背景色やborder-radiusを設定してボタンっぽく見せている。
また、forの指定で文字を押された時にも反応するようにしている。
さらに、クリックされたら背景色を変更するように実装した。

```html:html
<input type="radio" v-model="selectedActivity" :id="activity.code" name="activity" :value="activity.value" @click="checkRadioStatus(activity.value)" />
<label class="activity" :for="activity.code">
  {{ activity.value }}
</label>
```

```css:css
.activity {
  background: #aaa;
  color: #fff;
  padding: 5px 10px;
  border-radius: 3px;
  display: inline-block;
  cursor: pointer;
  margin-right: 5px;
}

input[name="activity"]:checked + label {
  background-color: #20d763;
  color: #fff;
}
```

「同じ選択肢をもう一度押したら選択を解除したい」については、クリック時に保持している値と選択された値が同じであれば保持内容をクリアしている。

```js:js
checkRadioStatus(val) {
  if (this.selectedActivity === val) {
    this.selectedActivity = null;
  }
}
```
Pythonでデータをテキストファイルに入出力するとき

# はじめに
pythonで外部のデータを読み込むとか外部に出力するとかの書き方が一生覚えられず，毎回調べているので，自分用にまとめる．

# txtファイルから情報を読み込むとき
```
file = open('file.txt', 'r', encoding='UTF-8')

for f in file:
  print(f.rstrip('\n'))

file.close()
```

# numpyで読み込み
```
data = np.loadtxt('file.txt')
```

# numpyでデータを保存するとき
gnuplotなどでグラフを書くときにデータをテキストファイルで出力する必要があるので，numpyでのやり方を記す．

```
data = np.array([1,2])
np.savetxt('data.txt', data)
```

ついでにリストからnumpyに変換する方法も必要だと思うので書いておく．
```
list = [1,2,3]
np_list = np.array(list)
```

numpyの転置は次の通り．
```
list = [[1,2]
       ,[3,4]]
list_T = list.T

>list_T
>[[1,3]
  [2,4]]
```
以降，またなにか必要になったら追記する．
VirtualBoxでUbuntu20.04 Serverがインストールできない

何度やってもできなかった。
ネットワーク関連、DISKのサイズや、メモリの量なと色々試してみたが、USERを設定する画面まで行ってエラーになるのを繰り返していたけど、こちらの記事で一発解決
https://goodbyegangster.hatenablog.com/entry/2020/06/08/224131
【備忘録・Laravel】マイグレーションについて

## 初めに
こんばんは、だいごです。
今回は、最近学習を始めたLaravelのマイグレーションについてまとめていこうと思います。
たまに、Railsとの比較を交えながらまとめていきます。
よかったらご覧ください。

## マイグレーションの生成
まずは、マイグレーションの生成を行います。
生成に関するコードは以下になります。

```zsh
# Laravel
% php artisan make:migration create_テーブル名（複数形）_table

# Ruby on Rails
% rails g model モデル名（単数系）
```

このコマンドのポイントとしては、テーブル名が`複数形`になるところです。
Railsではテーブル名は単数系なので、注意が必要です。

## マイグレーションの構造
ここでは、生成されたマイグレーションを見ていきます。

```php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('テーブル名', function (Blueprint $table) {
            $table->id();
            $table->データの型('カラム名');  /* カラムの追加 */
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('テーブル名');
    }
};
```

ここでのポイントは、`up`と`down`のメソッドです。
`up`メソッドは、データベースに新しいテーブル、カラム、またはインデックスを追加するために使用し、
`down`メソッドは、upメソッドの逆の操作を行い、テーブルやカラムの削除やupメソッドが行なった操作を戻すために使用します。

また、`$table->データの型('カラム名')`をupメソッド内に記載することでカラムの追加をすることができます。

## マイグレーションの実行
ここからは、生成したマイグレーションを実行していきます。
以下のコマンドを実行します。

```zsh
# Laravel
% php artisan migrate

# Ruby on Rails
% rails db:migrate
```

このマイグレーションが実行されているか確認する場合には、以下のコマンドを実行します。

```zsh
# Laravel
% php artisan migrate:status

# Ruby on Rails
% rails db:migrate:status
```

この２つのコマンドはLaravelもRailsもかなり似ているように感じます。

## マイグレーションのロールバック
最新のマイグレーションを１つロールバックしたい場合には、以下のコマンドを実行します。

```zsh
# Laravel
% php artisan migrate:rollback

# Ruby on Rails
% rails db:rollback
```

また、上記のコマンドでは最新の１つのマイグレーションしかロールバックできないため、`step`オプションを与えることで、複数のマイグレーションをロールバックすることができます。

```zsh
# Laravel
% php artisan migrate:rollback　--step=数値
```

上記のように記載した場合には、最新のマイグレーションを数値の分だけロールバックできます。
さらに、全てのマイグレーションをロールバックしたい場合には、以下のコマンドを実行します。

```zsh
# Laravel
% php artisan migrate:reset
```

他にも、マイグレーションのロールバックと実行を１つのコマンドで実行できるものがありますが、今回は省略します。
最後に、参考を載せるのでそちらをご覧ください。

## テーブル/カラムの存在確認
ここでは、`hasTable`および`hasColumn`メソッドを使用して、テーブルまたは列の存在を確認していきます。

```php
# laravel
if (Schema::hasTable('テーブル名')) {
    // "users"テーブルは存在していた
}
# laravel
if (Schema::hasColumn('テーブル名', 'カラム名')) {
    // "カラム名"カラムを持つ"テーブル名"テーブルが存在していた
}
```

この記述を用いた条件分岐で、同名のテーブルがない場合にテーブルを作成するなどの、コードを作成できます。

## 終わりに
今回は自身のLaravel学習の進捗分だけマイグレーションについてまとめました。
ここに記載していないことでも重要なことはたくさんあるので、学び次第追記していこうと思います。
ご指摘・コメント等お待ちしています。
ありがとうございました。

### 参考
https://readouble.com/laravel/9.x/ja/migrations.html
tf ファイルの required_version から tfenv 向けの .terraform-version を生成する

# 背景

tfenv と .terraform-version ファイルを組み合わせることで、指定されたバージョンの Terraform を利用することができる。

https://github.com/tfutils/tfenv

.terraform-version ファイルは手動で作成する必要があるが、もうちょっと楽に作りたい。

# 対応

Terraform のヘルパーライブラリである terraform-config-inspect を利用し、Go を書く。

https://github.com/hashicorp/terraform-config-inspect

terraform-config-inspect の tfconfig に LoadModule というファンクションがあり、コールするだけで設定ファイルをパースしてくれる。

```golang
import "github.com/hashicorp/terraform-config-inspect/tfconfig"

module, _ := tfconfig.LoadModule(".")
constraint := module.RequiredCore[0]
```

これだけで `constraint` には `"= 1.1.0"` のようなバージョン制約の文字列が入る。
`module` の構造は以下の通り。

https://github.com/hashicorp/terraform-config-inspect/blob/master/tfconfig/module.go

あとは正規表現などでバージョン部分を取り出し Print すれば標準出力できるので、リダイレクトでファイル化するとよい。

# tfvergen

上記をバイナリ化した。

https://github.com/tsubasaogawa/tfvergen

```bash
$ cat config.tf
terraform {
  required_version = "= 1.0.7"
}
  : (omitted)
```

のような tf ファイルがカレントディレクトリにある状態でバイナリを実行すると、required_version で指定されている .terraform-version を生成できる。

```bash
$ tfvergen > .terraform-version
$ cat .terraform-version
1.0.7
```

以下のようなワンライナーを実行すると、カレントディレクトリ以下の config.tf があるディレクトリに対して再帰的に .terraform-version を作成することができる (はず)。

```bash
$ find . -type f -name 'config.tf' | xargs -L1 bash -c 'cd $(dirname $1) && tfvergen > .terraform-version' _
```
Linux ラズパイ無線LANルータ 

# 最初に
まずこの投稿はメモ代わりです.なのでもしかしたら間違いがあるかもしれません.ですが少しでも参考になればと思います.

# まずはこれ
```Javascript
$ sudo apt-get update && sudo apt-get upgrade
```

# interfaceのip固定
```Javascript
$ sudo vim /etc/network/interfaces
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.12.1
netmask 255.255.255.0
```

# hostapdの設定

##hostapdを立てる
```Javascript
$ sudo apt-get install hostapd
```

##念の為停止させておく
```Javascript
$ sudo systemctl stop hostapd
```

##設定
```Javascript
$ sudo vim /etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
ssid=RASPI_SSID
hw_mode=g
channel=6
wmm_enabled=0
macaddr_acl=0
auth_algs=1
wpa=3
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_passphrase=YOUR_PASSWORD
```

##os起動時hostapd自動起動
```Javascript
$ sudo nano /etc/default/hostapd
DAEMON_CONF="/etc/hostapd/hostapd.conf"
```

```Javascript
$ sudo nano /etc/rc.local
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi
sudo /etc/init.d/hostapd start && sudo service ssh start
exit 0
```

この時点で$ sudo rebootすればipばAPは飛んでいる.

# dnsmasqの設定

##dnsmasqのインストール
```Javascript
$ sudo apt-get install dnsmasq
```

##念の為停止
```Javascript
$ sudo systemctl stop dnsmasq
```

##dnsmasqの設定
```Javascript
$ sudo nano /etc/dnsmasq.conf
interface=wlan0
dhcp-range=192.168.12.5,192.168.12.20,255.255.255.0,24h
```

##unmask,enable,start
```Javascript
$ sudo systemctl unmask hostapd
$ sudo systemctl unmask dnsmask

$ sudo systemctl enable hostapd
$ sudo systemctl enable dnsmasq

$ sudo systemctl start hostapd
$ sudo systemctl start dnsmasq

$ sudo reboot
```

# ポートフォワード機能
```Javascript
$ sudo nano /etc/sysctl.conf
net.ipv4.ip_forward=1
```

# ipマスカレード
```Javascript
$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$ sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
```

# 自動起動
```Javascript
$ sudo nano /etc/rc.local
iptables-restore < /etc/iptables.ipv4.nat
```

# 有効化
```Javascript
$ sudo reboot
```

# 実際に起きたerror集
error1
sshが出来ない.
home/.ssh/known_hostsファイルに同じipとして保存されていたから.

error2
network,broadcastアドレスは使えない.
10.10.0.1/24ならば10.10.0.0,10.10.0.255は使えない.

# おわりに
自分もまだ理解していません.なので説明が不十分な箇所があります.ご了承ください.