OmniAICreator/Qiita-1.07M huggingface dataset:
findコマンドでファイルを検索

##ファイルを検索
```
find [path] [option] [pattern]
```
##よく使うオプション
###-nameオプション
```
find . -name "test.txt"
```
ワイルドカードを使用し特定の拡張子のファイルを検索

```
find . -name "\*.html"
find . -name "\*.php"
find . -name "\*.rb"
```
###-typeオプション
ファイルを検索 find . -type f
ディレクトリを検索 find . -type d
[Rails] Formブジェクトパターン1/2

# はじめに
プログラミング初心者が学習の過程で学んだことをアウトプットする目的で投稿しています。
formオブジェクトパターンを2回に分けて投稿します。

# Formオブジェクトとは
1つのフォーム送信で複数のモデルを操作する場合や、テーブルに保存しない情報にバリデーションをかける場合などに使用します。モデルに近い機能を持ったクラスを新たに作成し、そのクラスに処理の内容を記述していきます。

# 実装の手順
1.新しくモデルディレクトリの直下に、ファイルを作成し、クラスを定義します。
　app/models/donation_address.rbを作成し、ファイル内に下記を記述。
```class DonationAddress
    end
```
  
2.作成したファイルにバリデーションを記述する。
　クラス定義のclass〜end間に下記を記述。
```include  ActiveModel::Model   
```　　　　　　　　　　　↑
　　　　　　これを記述することでバリデーションなどの一部の機能が使える

3.保存したいカラム名を属性値として扱えるようにする。
　　2.の記述の下に、記述する。
```attr_accessor: カラム名,カラム名,カラム名・・・（複数テーブルの取扱たいカラム名）
```
4.バリデーションの記述を行う。
　　複数テーブルの対象となる、モデルのバリデーションを新たに作成したモデルファイルへ記述する。このファイルにはアソシエションの定義ができないため、新たにバリデーションへ追記する。
※紐ついているuser_idなど


# 終わりに
Formオブジェクトに対して、2回にかけて投稿しています。今回はその前半になります。
[Swift]WKNavigationDelegateの要点まとめ

## この記事の経緯
仕事で`WKNavigationDelegate`を用いてwebViewを管理することがあり、知らなかったこととかもあったので投稿します。

## 開発環境
Swift version 5.4.2
Xcode version 12.5.1

webViewはxibで実装
WKNavigationDelegateはコードで実装
web側で開発したLP（ライディングページ）のボタンのアクションをアプリ側（Swift）で操る実装

## エラー用Delegateは2つある
**1, didFail**

```swift
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
   print("didFail: \(error)")
}
```

`didFail`の用途は読み込み途中にエラーが発生した場合に呼ばれる。
例えば、webViewのload中にアプリを閉じたなど。

**2, didFailProvisionalNavigation**

```swift
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
    print("didFailProvisionalNavigation: \(error)")
}
```

`didFailProvisionalNavigation`の用途は読み込み開始時にエラーが発生した場合に呼ばれる。
例えば、圏外だった場合など。

どちらか一方しか記述していない場合、エラー発生の原因捜査で苦労します。

## webView内での遷移に関する値はLinkActivatedだけではない
```swift
LinkActivated // aタグによる遷移
FormSubmitted // フォームの送信による遷移
BackForward // 進む、戻るによる遷移
Reload // 更新による遷移
FormResubmitted // フォームの再送信による遷移
Other // その他の方法による遷移
```

LPから課金画面に遷移する実装をしていたので、ついLinkActivatedを気にしていましたが、少し調べると色々出てきました。
`navigationAction.navigationType`で指定して扱いましょう。

## よく使うDelegateまとめ
```swift
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
    // 遷移開始時に呼ばれる
}
```

```swift
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
    // ページ読み込みが開始されたときに呼ばれる
}
```

```swift
func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
    // リダイレクトした時に呼ばれる
}
```

```swift
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
   // 読み込み開始時にエラーが発生した場合に呼ばれる
}
```

```swift
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
   // 読み込み途中にエラーが発生した場合に呼ばれる
}
```

```swift
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    // 読み込み完了時に呼ばれる
}
```

```swift 
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    // webサイトにリクエストを送る場合に呼ばれる
}
```

```swift 
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping {
    // webサイトからのレスポンスを受け取る場合に呼ばれる
}
```

```swift
func webView(_ webView: WKWebView, authenticationChallenge challenge: URLAuthenticationChallenge, shouldAllowDeprecatedTLS decisionHandler: @escaping (Bool) -> Void) {
    // 認証が必要な場合に呼ばれる
}
```

今回は`WKNavigationDelegate`の要点をまとめました。
ぜひ参考にしてください！

## お知らせ
現在、iOSアプリ開発の週末バイトや、就業後にできる開発案件（副業）を探しております。
ご依頼は[Twitter DM](https://twitter.com/ken_sasaki2)までお願いします。
YouTube動画のサムネイル画像を取得する方法

下記のURLから取得することができます。

##サイズ別
####120 × 90
```
http://img.youtube.com/vi/動画ID/default.jpg
```

####320 × 180
```
http://img.youtube.com/vi/動画ID/mqdefault.jpg
```

####480 × 360
```
http://img.youtube.com/vi/動画ID/hqdefault.jpg
```

####640 × 480
```
http://img.youtube.com/vi/動画ID/sddefault.jpg
```

####1280 × 720
```
http://img.youtube.com/vi/動画ID/maxresdefault.jpg
```

##時間別
####動画の開始(120 × 90)
```
http://img.youtube.com/vi/動画ID/1.jpg
```

####動画の中間(120 × 90)
```
http://img.youtube.com/vi/動画ID/2.jpg
```

####動画の終了(120 × 90)
```
http://img.youtube.com/vi/動画ID/3.jpg
```
デジタル署名: 数学弱者のためのDSAの原理

# はじめに
公開鍵を使ったデジタル署名にはRSA署名の他に、DSA(Digital Signature Algorithm)やそれを楕円曲線暗号の世界で実現したECDSAなどがあります。RSA署名に関しては難しい数学を使わないわかりやすい直感的な解説が多数存在しています。ところが、DSAに関してはわたしのような数学弱者エンジニアにとっては相当難解な解説ばかり。頼みのWikipediaでさえ[こんな感じです](https://ja.wikipedia.org/wiki/Digital_Signature_Algorithm)。

そういうわけで、今回は世界初。難しい数学の知識なしに直感的にDSAがわかったと思えるような解説に挑戦です！

DSAはRSAに比べていくつか弱点もあってあまり使用されていないのが現状ですが、楕円曲線暗号の世界ではEC-RSAのような署名アルゴリズムは存在しません。そのためDSAと同様の原理で実現されているECDSAやEdDSAは楕円曲線暗号による署名としては幅広く実用的に利用されています。そういう観点で、DSAの原理についてもある程度理解しておくことはあながち無駄ではないような気がします。

1) RSAとDSAは原理的に何が違うの？
2) DSAでは何を根拠に署名が正しいことを判断しているの？

などと言った素朴な疑問の解として、直感的なわかった感を味わっていただければ大成功です。

# 1. RSAとDSAの原理的な違い

RSA署名ではメッセージのハッシュを署名鍵を使って署名を生成し、検証の際は検証鍵を使ってその値にもどることを確認する、という方法がとられています。このように元に戻るような演算の組が存在しているものを「落とし戸付き一方向性関数」と呼ぶそうです。しかし、DSAではそのような性質の関数は利用しません。DSAでは、二つの異なる一方向演算の組み合わせ同士で同一の値を得ることができることを利用します。

# 2. 一方向演算の組合わせ

図のように関数CとDの２入力の関数と関数Eのような１入力の関数を考えます。このような関数の組み合わせで関数Cと関数Eに同じ入力1を、そして関数CとDに同じ入力2を加えると関数DとEが同じ結果となるようなうまい関数を作り出すのです。

![fig3-6-5b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263939/d49090ad-c557-d353-037e-e500464bdb13.jpeg)



これは一方向関数でなくて良いということなら、そんなに難しいことではありません。入力1をx、入力2をyとすれば、例えばこんな感じでどうでしょう。

```math
関数C: x + y、 関数D:(x - y)^{2}
```

```math
関数E: x^2
```

つまり、関数CとDの中に入力２を打ち消すような演算を入れておけばいいということに気がつきます。関数cで足されたyは関数Dで引かれるので、値は当然もとにもどります。

前の図ではC、Dとも同じ入力2が与えられていましたが、次の図のようにもし仮にC,Dの入力2に異なる値が与えられた場合はうまく打ち消しあわないことになります。関数Dと関数Eの結果は当然違う値になるはずですよね。

![fig3-6-5c.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263939/2328430f-c2c2-f95f-b2e6-305d9f9a3ed5.jpeg)


ここまで理解できたら、DSAの説明準備完了です。

# 3. 署名、検証フローを当てはめる

では、これを署名検証の流れに当てはめてみましょう。前の図の入力1は署名のための鍵です。入力２は署名対象のメッセージのハッシュ値です。DSAでは署名は署名値sと検証値rの二つの値の組み合わせとなります。関数Cの結果が署名値s、関数Eの結果が検証値rです。このよう当てはめると下の図のようになって、図の右半分が署名、左半分が検証の流れとなっていることがわかります。

署名側と検証側でH(m)が同じ値ならば、検証値vとrは同じ値となります。

![fig3-6-5d.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263939/740801c2-b5f5-f4f1-bf89-61ccfeed72a2.jpeg)


もし、例えばメッセージが改ざんされていて検証側のH(m)が署名側と異なれば検証値は一致しません。これで、署名の正当性が検証できたことになります。

![fig3-6-5e.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263939/683c8800-8442-bae4-e8ca-dc86ee9b4a2f.jpeg)

もちろん、本物のデジタル署名では、上の例のような演算ではもとの鍵を簡単に逆算できてしまうので使えません。しかし、署名が正しいかどうかの判定について直感的にざっくり言えば、こんな感じで行われているのです。

# 4. DSAの演算式を当てはめる

最後に、この図にDSAの実際の演算式を当てはめてみると下の図のようになります。

一方向演算を実現するためのパラメータとしてユーザ鍵ペアが加えられていたり、署名値rも検証演算に加えられていたり詳細の追加はありますが、基本的な構造は前の図と変わらないことがわかります。数学的厳密な意味は別として、随所に整数による公開鍵演算のプリミティブである冪乗の剰余が使われ一方向性が実現されていることを直感的に感ることができるかと思います(modは剰余を表します)。

![Qiita-fig-jp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263939/22b1ba70-f7f7-2b20-040b-ab380bf4c651.jpeg)


DSAでは、このような形で「落とし戸付き一方向性関数」の性質を利用しないRSAとは異なる演算構造で署名、検証を実現しています。

# まとめ

以上、専門家がみたらお笑いか激怒の超乱暴な説明ではありますが、少しでもアハー感を味わっていただけたら大成功です。まだまだ、わかりにくかった点、改善点などあるかと思います。感想、フィードバックお待ちしまています。

DSAは実現においては適切な鍵生成が難しく十分な注意が必要です。鍵を解読されないためには署名毎に新しい異なる乱数を生成する必要があります。また、検証のための計算量はRSAくらべてかなり大きくなる傾向にあります。そうした理由で、整数演算の世界においてはRSA署名のほうが広く利用されています。

しかし、楕円曲線暗号では「落とし戸付き一方向性関数」のようなものは見つかっていないため、RSAのような方法で署名検証を実現することはできません。整数演算の世界のDSAと等価のアルゴリズムを楕円曲線暗号の世界で実現したECDSA, EdDSAなどが広く使われています。
form_forでpostリクエストを送れない時の対処法

#はじめに
Railsで日記投稿機能を実装していた。
タイトルと本文をフォームに入力し、投稿ボタンを押すと画面が遷移しなかった。
デベロッパーツールのnetworkで通信を確認すると、通信自体がされていなかった。

日記投稿画面でページを再度読み込むとフォームを再入力する必要はあるが、postリクエストを送ることができた。
#開発環境
・MacBook Pro 
プロセッサ2 GHz クアッドコアIntel Core i5
メモリ16GB
・Virtualbox+vagrant+CentOs7.9
・RubyOnRails5.2 

#解決方法
form_forをまたぐようにdivタグが設定されていたため、divタグをform_forの中に収めたら、不備が解消した。
#作業
form_forをまたぐようにdivタグが設定されていた。

```erb
 <div class="diary_textarea">
  　　<%= form_for(@diary) do |f| %>
   　　<%= render 'shared/error_messages', object: f.object %>
       <div class="field_diary text-center">
         　　 <%= f.text_area :title, placeholder: "タイトルを入力してください",class:'diary_title'%>
         　　 <%= f.text_area :content, placeholder: "本文を入力してください",class:'diary_content'%>
        </div> 
          <div class="diary_category">
       　　   <%= f.label :category_id %>
       　　   <%= f.collection_select :category_id, Category.all, :id, :name,:include_blank => "カテゴリ-を選択してください"%>
          </div>
         <div class="picture text-center">
          　　<%= f.file_field :diary_image,class:'diary_form' %>
       　　　　</div>
　　　</div> 
   <div class="btn_diary">
     <%= f.select :status, Diary.statuses.map { |k, v| [t("diary.status.#{k}"), k] }, selected: @diary.status %>
     <%= f.submit "投稿する", class: "btn_base_update text-center" %>
    <% end %>                      
```

このように直すと不備が解消した。

```erb
<%= form_for(@diary) do |f| %>
　　<div class="diary_textarea">
 　　<%= render 'shared/error_messages', object: f.object %>
  　　<div class="field_diary text-center">
   　　　　　<%= f.text_area :title, placeholder: "タイトルを入力してください",class:'diary_title'%>
  　　 　　　<%= f.text_area :content, placeholder: "本文を入力してください",class:'diary_content'%>
    </div> 
    <div class="diary_category">
    　　　　<%= f.label :category_id %>
    　　 <%= f.collection_select :category_id, Category.all, :id, :name,:include_blank => "カテゴリ-を選択してください"%>
    </div>
    <div class="picture text-center">
    　　　　　<%= f.file_field :diary_image,class:'diary_form' %>
    　　　　　<%= f.hidden_field :diary_image_cache %>
    </div>
</div>                             
```

#原因
form_forをまたぐようにdivタグが設定されているとturbolinksうまく動ないようです。

ご覧いただきありがとうございました。
探索的テストをなぜやる必要があるか？

## はじめに
探索的テストのやり方というよりかは、なぜ探索的テストをするべきなのか？に焦点を合わせて、探索的テストの有用性についてまとめてみる。
※「知識ゼロから学ぶソフトウェアテスト 【改訂版】」という良書が分かりやすいのでそれを参考にまとめている。

## そもそもの出発点
- テストでバグ全てを見つける事は不可能
- Beizerのデータによると、1つ1つのテスト手法で見つかるバグはバグ全体の50％が限度

という事実があるので、効率が良いと言われている探索的テストを取り入れる事で、バグを見つける精度を向上させよう！

という考え方があり、探索的テストを用いる事を検討すべきなのである。

## 探索的テストとは（定義）
- ソフトウエアの理解とテスト設計・実行を同時に行うテスト

正直この定義だととっつきにくいので、別の言い方で探索的テストとは？を理解すると、

- 全てのテストを実施するのは、時間的制約から望むべくもない＆テストを行っても全てのバグは見つからない
- であれば、いちいちテストケースを書く代わりに、製品(ソフトウエア)の機能を学習した上でテスト設計・実行してバグ報告を並列でやれば手っ取り早い
- これは単に新しいテストのスタイルでしかなく、テストケースを書かないだけでやっている事は昔からやっているテストと同じだから、探索的テストのこのやり方でテストケースベースのテストと同等以上の成果を出そう
- ただ製品理解、テスト設計・実行を一気にやるのだから素人には無理で、プロとして成熟した一個人のテスト担当者に責任をもってやらせる必要があり、それであれば後から間抜けなバグが見つかったりする事はない

上記のようなものがつまりは探索的テストの本質。
次に探索的テストのテストケースベーステストに対するメリットからなぜ探索的テストか？を見ていく。

## なぜ探索的テストなのか？
- **テストケースを実行してもバグはあまり出てこない**<br>→テストケースをいちいち事前に書くより、ソフトウエアをテスト(触り)しながら、バグが出そうな部分を考えてテスト実行をする方がいい（ソフトウエアの振る舞いを見て、おや？という部分を考えるみたいに）<br>（※バグをきちんと見つけれられるテストケースを作れればそれはいいが…実際にはそれは難しい…その理由は以下の項の通り）
- **テスト設計・ケース作成を早い段階でやろうとしても、ターゲットになるソフトウエアがないため手さぐりになり非効率**
  - いい加減な要求仕様で仕様が分からない
  - テスト対象のソフトウエアを知らない<br>という事が起きがちで、早めに作ったテストケースが意味をなさないなんて事も起きがち
- **テストで重要なのは、以下の2点であり探索的テストのスタイルであればこれが実践できる**<br>（医者が患者の診察をする時と同じイメージで、ソフトウエアの動きを見ていきバグを見つけるのがいいという事）
  - テスト実行をしながら、どこかほかの部分に問題がないか？を考えてそこをテストする
  - ソフトウエアの弱い所を見つけたらそこを重点的にテストする

※テストケースベースのテストではテストケースに書かれていないものはテストしないので気づけない＋気づいてもWBSの計画線とかのせいでテストできないなんて事になりがち

## まとめ　～探索的テストの考え方から見えてくるいいQAとは～
探索的テストのデメリットは非常に俗人化された作業である事。
もし探索的テストのテストを皆ができるようになればそれは万々歳。
QAの仕事の真骨頂の1つとしては、上記のような探索的テストのいい面を、経験とか勘によらないものにしていくという事があるように思える。
興味でAIの本を読んでみた

#背景
IT企業ってかっこいいな～と思って事務からプログラマーに
転職してみたものの、ITじゃなくて、AIの勘違いだった事に
最近気づいたので、AIの本を読んで、自分用にまとめてみました。

#前提条件
・AIに必須とされている数学的知識なし（微積分など）
・python未経験の方

#最初に読んだ本
[最短コースでわかるディープラーニングの数学](https://www.amazon.co.jp/%E6%9C%80%E7%9F%AD%E3%82%B3%E3%83%BC%E3%82%B9%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E6%95%B0%E5%AD%A6-%E8%B5%A4%E7%9F%B3-%E9%9B%85%E5%85%B8/dp/4296102508/ref=sr_1_1?adgrpid=110920994864&dchild=1&gclid=CjwKCAjwz_WGBhA1EiwAUAxIcWjxj-mXMBNxDuOhP8hTMqFYLs2-3wM7rGG6tRcvouAGO4cRVKTaSxoCZAsQAvD_BwE&hvadid=447950417039&hvdev=c&hvlocphy=9053338&hvnetw=g&hvqmt=e&hvrand=8043673278333436552&hvtargid=kwd-680568739356&hydadcr=27265_11561134&jp-ad-ap=0&keywords=%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E6%95%B0%E5%AD%A6&qid=1625135336&sr=8-1)

帯には、「最短」・「最低限」など、できそうな気が湧いてくる記載があり
高校数学の基本から解説してくれるので、選びました。

初めは、解説を読みながら自分で計算し進めていきましたが
段々と数学アレルギーができ始めました。

結局、概要をまとめサイトで把握したうえで、
（微積分は曲がってる線の傾きが直線な所を見つけるための計算方法であるなど）
計算はこうやるんだなぁ～というスタンスで読みました。

#次に読んだ本
[Pythonで儲かるAIをつくる](https://www.amazon.co.jp/dp/B08F9P726T/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

タイトルにかなりインパクトがありますが
入門レベルの用語から、例題を使って分かりやすく説明してあり
AIをうまく活用するために、AIに向いている事を見分ける方法や
AIのどの機能を使えば、より良い精度の高いAIができるかなどが書かれています。
rspecにおけるstubとは

## stubについて

- **環境設定**

<dl>
  <dt>Ruby ver</dt>
  <dd>2.7.2</dd>
  <dt>Rails ver</dt>
  <dd>5.2.6</dd>
  <dt>Gem</dt>
  <dd>active_model_serializer</dd>
</dl>

---
### stubの説明

sutbは,

- **rspecのテストで使用し、**

- **あるクラスで定義したメソッドをデータベースを使用せずに使うこと**


ができる。

---
### 具体例

以下のcontrollerにあるメソッドを呼び出すとする。

```api_controller.rb

#データベースから一番最初のユーザーを呼び出し、ログインユーザー（current_user）とする。
class Api::V1::ApiController < ActionController::Base
  def current_user
    @current_user ||= User.first
  end  
end

```
呼び出し先は、articles_spec.rbだとする。

```articles_spec.rb

#allow_any_instance_ofはcurrent_userメソッドの呼び出しで、current_userを強制的に返す
before do
  allow_any_instance_of(Api::V1::ApiController).to receive(:current_user).and_return(current_user)
end

```

上記コードを使用すれば、article_spec.rb内でスタブ化されたcurrent_userメソッドを使用できる。


**参考にしたサイト**

https://techracho.bpsinc.jp/hachi8833/2018_02_20/52293
Excel ファイルデータからタブ区切りテキストデータを作る

こんにちは
Excel ファイル（のシート）のデータから、タブ区切りテキストデータを作りました。

Excel作業：
1. 全セルを対象に、置換機能を用い、改行コード（Control+J）を削除する。
2. タブ区切りテキストデータとして、エクスポートする（ファイル名の例：```example.tsv```）。
3. Excel ファイルを閉じる。

次に（WSL 上などで）：
3. 文字コードを utf-8 へ変換する（```nkf -Lu --overwrite example.tsv```）[^1]
4. 全ての行がタブ区切りとなっていることを点検（```grep -n -v "$(printf '\t')" example.tsv```）

[^1]: ただし、この tsv ファイルをExcelで読み込みたい（かつ日本語データを含む）場合には、先頭には```BOM```を付加してください。
RDKitを使うためにWindowsにAnaconda3を導入したときのメモ

#やったこと
**① Anaconda3をwindowsにインストール
② Anaconda3上でPython3.7系の仮想環境を構築
③ 仮想環境でRDKitをインストール**

環境： windows 10（ノートPC）

#① Anaconda3をwindowsにインストール
####Anaconda3を導入するメリット :
**RDKitを動かすのに必要な諸々のパッケージがまとまっていて、個々のパッケージを導入するよりも労力が小さくて済む。**


…というわけで[**公式サイト**](https://www.anaconda.com/products/individual)からwindows用の.exeファイルをダウンロードし、以下の点に注意して実行します。

1. Add Anaconda to the system PATH environment variable は推奨されていないようなので、チェックを外してインストールする（既存のPythonとの競合を防止）
2. パス名は日本語を含まないように注意

その他のインストールの詳細については解説記事が無数にあるので、どれかを参考にして入れて下さい。
基本的には [Next] 連打でOKです。
>※インストールには結構時間が掛かりました。（1時間弱くらい？）
※パスを通さないとそのままでは動かないので注意。私の場合、システム環境変数の "Path" に以下のパスを追加しました。

>```:anaconda3を置く場所はインストール時に指定可能
C:\Users\(user名)\anaconda3
C:\Users\(user名)\anaconda3\Scripts
C:\Users\(user名)\anaconda3\Library\bin
C:\Users\(user名)\anaconda3\Library\mingw-w64\bin
```

Anacondaが正しく導入されているかどうかは `conda --version` などで確かめられます。


#② Anaconda3上でPython3.7系の仮想環境を構築
しかしこのままではRDKitは使えません。なぜなら、`conda` で導入できるRDKitはPython3.8系には対応していないからです😅。
（参考：[**RDKit をインストールできなかったり import できなかったりしたときの対処法まとめ (Anaconda ユーザー向け)**]
(https://datachemeng.com/rdkit_install_import)）

そこで、Python3.7系の仮想環境を構築することにします😤。

`conda create --name myenv python=3.7` をコマンドプロンプトで実行して仮想環境（Python 3.7.10）を新規作成。
（参考：[**Anaconda3 コマンドまとめ**](https://qiita.com/WestRiver/items/cce9c99076d59abd3f69)）

```:Python3.7系の仮想環境を構築
C:\Users\(user名)> conda create --name myenv python=3.7
```

>※**仮想環境の名前は何でもよい**（今後さらに仮想環境が増えるなら「py37」とかの方が分かりやすいかも？）。
※私のPCでは仮想環境の構築に10分以上要しました。
※ `conda activate myenv` を実行しても `CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.` と出てエラーになる場合は**コマンドプロンプトを再起動する**。
（`C:\Users\(user名)\anaconda3\etc\profile.d` にあるシェルスクリプトは特に変更していません）

`conda activate myenv` で仮想環境「myenv」を起動すると入力待ちが以下のように変わります。

```
(myenv) C:\Users\(user名)>
```

> `conda deactivate` で仮想環境を終了できます。


#③ 仮想環境でRDKitをインストール

以下のコマンドをコマンドプロンプトで実行して仮想環境でRDKitをインストール。

```:RDKitをインストール
conda install -y -c rdkit rdkit
```
>※RDKitのインストールには30分ほど要しました。

Pythonを対話型で起動して `import rdkit` がエラーにならなければ導入できています。お疲れ様でした。

# おまけ

もう少し遊びたい人は、以下の3行を入力してみて下さい。トルエン骨格のxyz座標がMolBlock​形式で出力されます。

```py:実行例
>>> from rdkit import Chem
>>> m = Chem.MolFromSmiles('Cc1ccccc1')
>>> print(Chem.MolToMolBlock(m))

     RDKit          2D

  7  7  0  0  0  0  0  0  0  0999 V2000
    3.0000    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    1.5000    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.7500   -1.2990    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.7500   -1.2990    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -1.5000    0.0000    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
   -0.7500    1.2990    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
    0.7500    1.2990    0.0000 C   0  0  0  0  0  0  0  0  0  0  0  0
  1  2  1  0
  2  3  2  0
  3  4  1  0
  4  5  2  0
  5  6  1  0
  6  7  2  0
  7  2  1  0
M  END

>>> 
```

>仮想環境で.pyファイルを実行すればRDKitを使うスクリプトが実行できます。
BubbleTransitionをStoryboardなしで実装する方法

いい感じのアニメーションを実装したくてライブラリを探していたところ、良いのを見つけました。
[andreamazz/BubbleTransition](https://github.com/andreamazz/BubbleTransition)

が、とりあえずREADMEどおりにやっても画面遷移のアニメーションが変わりません。
中身を見てみると**Storyboardを使用する前提で**作られてるみたいでした。

## 問題点

Storyboardなしでアプリを作る練習をしている自分としては、**なんとかして使いたい**。
### prepareメソッド
コードを見た感じAnimationの動き自体は問題ないが、反応していない。
「何をトリガーにアニメーションを動かしてるだろ」という視点で調べていくうちに

```swift
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {    
}
```

この**「segueが動作することをViewControllerに通知する」**メソッドがトリガーになってるのに気づきました。
[UIViewControllerのprepareメソッドについて - emahiro/b.log](https://ema-hiro.hatenablog.com/entry/20170304/1488618103)

【推測】
Storyboardなしで画面遷移を実装した場合、segueが動作しないのではないか

## 解決策

このメソッドの中身をUIButtonのactionに入れてしまう

```swift
@objc func tappedActionButton(_ sender: UIButton) {
        let modalViewController = ModalViewController()
        modalViewController.transitioningDelegate = self
        modalViewController.modalPresentationStyle = .custom
        modalViewController.modalPresentationCapturesStatusBarAppearance = true
        modalViewController.interactiveTransition = interactiveTransition
        
        present(modalViewController, animated: true, completion: nil)
  }
```
もっといい方法があるかと思いますが、とりあえず希望のAnimationは実装できました。
TeXShop on Mac 設定 メモ

# 前提

+ pdfファイルが欲しい
+ pdfTeXやdvips+ps2pdfは使わない
    + uplatexとdvipdfmxを使う
+ luascriptであるptex2pdfを使ってtexから.pdfまで一気にコンパイルする（TeXShopでデフォルトでできる）
    + ただし複数回のコンパイルが必要になるかも

## 下準備


### TeXShop on Macインスコ
[ここ](http://tug.org/mactex/)から`.pkg`を落とす
適当に全部インスコする



# 環境設定



## タイプセット


### デフォルトのコマンド
```
LaTeX
```


### デフォルトのスクリプト
```
TeX + DVI
```


### タイプセット後の動作
```
編集を続ける
```


### ファイル保存時に
```
関連ファイルも保存する
```


### Sync 方式
```
SyncTeX
```



## 内部設定


### パス設定
コンパイルを起爆する実行ファイルがどこにあるかを指定する

#### TeX
```
/Library/TeX/texbin
```

#### Distiller (Ghostscript)
```
/usr/local/bin
```

homebrewで最新版を入れてるなら

```
/usr/local/Cellar/ghostscript/x.y.z/bin
```
でも良さそう


### TeX+dvipdfmx
コンパイル時のコマンドを編集する

#### LaTeX
luascriptであるptex2pdfをどうやって起爆するかの設定

```
ptex2pdf -u -l -ot "-synctex=1 -file-line-error" -od "-z 0"
```

##### `-u`
upLaTex召喚オプションその1

##### `-u`
upLaTex召喚オプションその2

##### `-ot`
upLaTexコンパイラオプション召喚オプション
以下の`""`に文字列を突っ込む

##### `-synctex=1`
synctex有効化

##### `-file-line-error`
エラー位置をログに出力

##### `-od`
dvipdfmxオプション召喚オプション
以下の`""`に文字列を突っ込む

##### `-z 0`
コンテンツ（写真等）情報量の圧縮手順を切る，爆速コンパイルになる
ところで動画とかwebフレームの埋め込みとかもできるんだろうか…？

##### 何が言いたいか
`ptex2pdf`のオプションついては
https://texwiki.texjp.org/?ptex2pdf
`dvipdfmx`のオプション（`-od ""`で呼び出せる）については
https://texwiki.texjp.org/?dvipdfmx
`uplatex`のオプションについての記事はなかったので
`uplatex --help`して読むしかない



## 詳細


### Distiller
`Apple Distiller`にするとバグるのでNG




# ドキュメント



## TeXファイル


### 先頭
```
\documentclass[a4paper,12pt,uplatex,fleqn,dvipdfmx]{jsreport}
```
`uplatex`と`dvipdfmx`を指定しておいて，それに対応しているclsを読み込めばいいんじゃないですかね…
AWS認定クラウドプラクティショナーの勉強法について

クラウドプラクティショナーに合格できたので、私の行った勉強法についてまとめていきます。

#使った教材について
無料
- [AWS ハンズオン資料](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/)
- [AWS Cloud Practitioner Essentials (Japanese) (日本語字幕版)](https://www.aws.training/Details/eLearning?id=66479)
- [AWS認定資格 無料WEB問題集＆徹底解説 クラウドプラクティショナー](https://aws-exam.net/clf/)

有料
- Udemy : [この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）](https://www.udemy.com/share/101I2O2@PkdjbF5fTF0KcURAOEtn/)
- 書籍 : [AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー (日本語)](https://www.amazon.co.jp/-/en/%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4797397403/ref=pd_bxgy_img_2/355-8789472-0077047?_encoding=UTF8&pd_rd_i=4797397403&pd_rd_r=13f5771c-a4a6-4359-8ab9-490598414012&pd_rd_w=eUJZ1&pd_rd_wg=b6D9K&pf_rd_p=105d6769-bacf-43d4-85ea-a25cec858a3c&pf_rd_r=ZJV1G8HH04CV7M0VHK4S&psc=1&refRID=ZJV1G8HH04CV7M0VHK4S)


###AWS ハンズオン資料
公式が公開している動画で、手を動かしながらAWSの基本的なサービスに実際に触れることができる。
執筆時点でも動画は更新されており、数も多い上に情報も新しい。
とりあえず触ってみたい人はここから資格勉強を始めるのもあり。
触れるのはかなり効果的で、ここでよく出てきたサービスは記憶に残る。
ただかなりボリュームがあるため、完走には時間がかかる。

###AWS Cloud Practitioner Essentials (Japanese) (日本語字幕版)
こちらも公式が出している動画。
基本的にクラウドプラクティショナー対策をするなら、これから始めればいいと思う。
ハンズオンに対しこちらは基本的には見るだけだが、おかげで敷居は相当低い。
広く浅く、しかも分かりやすく解説されている。

###AWS認定資格 無料WEB問題集＆徹底解説 クラウドプラクティショナー
非公式の問題集。
ログインすると正答率、間違えた問題をみれたりかなり優秀。これが無料はかなりありがたい。
問題文の日本語がおかしかったりするが、無料なのでご愛嬌。（というか本試験も日本語おかしい）
本試験よりは多少、簡単な気がした。

###Udemy : この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）
Udemyで出ている模擬試験集。
レビューで「本当にこれだけで合格できました！」と書いてる人がいたが、確かにこれだけやって問題覚えれば合格できる気がする。
基礎問題集2つと応用問題集3つ、オプションとしてアソシエイトレベルの問題集までついてくる。
問題の解説も非常に丁寧。
基礎問題2つと応用問題レベル１が本試験と近いレベル感だった。
応用問題レベル２と３はかなり難しく、これで70点取れれば本試験はまず問題ないと思う。
私は応用問題レベル３は５０%もいかなかったが合格できた。

###AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー (日本語)
図が多く視覚的にわかりやすい教材。
模擬試験でわからない部分を調べるのに使った。
ただ、模擬試験に出てるのに載ってないサービスが多々あるので、どのみちネットと併用になると思う。


##Qiita
教材ではないですがクラウドプラクティショナーの勉強を機にQiitaへの投稿を始めた。
アウトプットは大事で、文章にまとめると整理されて理解が進む。

##オンラインクラス
AWS Partner TailoredやAWSome Day、AWS Summitなどにも積極的に参加した。
このようなオンラインクラスも、知識の確認に有効。


#取り組み方
私の場合は、
1. ハンズオンでとりあえず触る
2. Practitioner Essentialsで確認
3. 模擬試験（UdemyとWeb問題集）を回す
4. 間違えたところをネットと書籍で調べる
５. ３と４を繰り返す...

ハンズオンとPractitioner Essentialsで概要をなんとなく掴んでから問題を解くのが良いと思う。
AWSはサービスが多すぎて全体像を掴むのに苦労するので、まず概要を掴むのはかなり重要。

いきなり模擬試験はだいぶしんどいと思う、Practitioner Essentialsだけでもやることをお勧めする。
むしろ紹介した無料教材3つだけで合格も無理ではなさそう。

本試験は英語を和訳している関係で問題文の日本語が所々おかしいです。
割とまどわされたりするので、自信を持って答えられるようにしたほうがいいです。
未経験からインフラエンジニアになった話！カスタマーサポートから転職した方法を紹介

## はじめに
こんにちは、日本リック エンジニア採用チームです。

今回は日本リックのインフラエンジニアとして働くKさんの転職エピソードを紹介します。

Kさんは前職のカスタマーサポートから未経験でITエンジニア/インフラエンジニアに転職しています。

Kさんの事例をもとに、ITエンジニアを目指そうと思ったきっかけや、これまでの経緯、入社後の苦労話、目指しているエンジニア像など、詳しく紹介します。

ITエンジニア/インフラエンジニアを目指している方の参考になれば幸いです。


## 私のプロフィール（30代前半 男子）
### 現在の職種・仕事内容
お客様拠点に常駐し、システムの展開支援を担当しています。
アプリケーションの設定作業、動作確認テスト、現地搬入等を行っています。

### 前職はカスタマーサポート
ゲームのカスタマーサポート業務です。

### ITエンジニア/インフラエンジニアを目指すまでの経緯
前職で、自分が担当するゲームのプロデューサーに対し、問い合わせ内容を報告をする場が定期的にありました。
また、そこは改善案を提案する場でもあったので、その案の提案も行っていました。
ですが、提案はするものの「改善した方がいいことは理解しているが開発会社の工数的に難しい」や「対応はしたが解決に至っていない」といった発言ばかりで、日々もどかしく思っていました。
また同時に、そもそも対応できる人材自体がいないのではないかと考えるようにもなりました。

そこで、IT業界について調べてみたところ、業界自体が数年前から人材不足であり現在も続いていることを知りました。
また、実際に現場で活躍する方と話す機会があり聞いてみましたが「人は常に足りない」という答えであり、この人材不足は簡単に解消できるものではないと思いました。
それならば、自らがエンジニアとなり、人材の育成をすることでこの状況を少しでも良くできればと思いITエンジニアを目指すことにしました。

## 未経験からITエンジニア/インフラエンジニアになるためにしたこと
インフラについて学べるITスクールに通い、ネットワークの講義を受講したり、CCNAの資格取得に向けた問題集を解いたりしていました。
自宅ではパケットトレーサーを使用しネットワーク機器の操作や設定などを試していました。

## 未経験からITエンジニア/インフラエンジニアになって苦労したこと
### ①手順書を理解するのに苦労
就業し始めのころは、専門用語が全くわからない状態なので手順書を理解するに時間を要しました。
また、実施する動作確認のチェックリストはあるもののそれを実施する手順書がなかったので自分がやるべきことを理解することも苦労しました。

### ②知識ゼロのサーバーを担当することになり苦戦
配属された現場ではあまりNWの知識を活用できる場所ではなく、PC(Windows)とサーバ(Linux)の操作がメインとなりました。
就業するまではサーバなんて触れたことなかったので、最初はコマンド一つ打つことすら躊躇していました。
「この操作は大丈夫かな」や「このコマンドのオプションは何があって、今は何を使うのが最適か」など、何が正解で何がダメなのか把握することに苦労していました。
使い慣れている思っていたPCですら、知らない、見たことのない設定などが多くて驚きました。

①、②どちらともわからないことがあれば逐一確認し、
自分なりの用語集と手順書を作成し、それでもまだ理解できないことは再度確認することを繰り返していました。

## 目指しているITエンジニア/インフラエンジニア像・キャリアパス
様々な現場で経験を積み(サーバやNW等)、携わった分野の最上位の資格を取得を目指しています。
その後は、それまでの経験を基に人材育成に力を注ぎたいと考えております。

## ITエンジニア/インフラエンジニアとしてスキルアップしていくためにしていること
上記を目標にWebサイトや参考書を活用して資格の勉強をしています。
あとはVitualboxでの仮想環境を使用し、実際に参考書などに記載されているシチュエーションを再現構築などもして実際に経験をしながら学習をしています。

## さいごに：ITエンジニア/インフラエンジニアを目指している人へのアドバイス
ITエンジニアといっても幅広いので、まずは目の前の関わる技術を習得することが良いかと思います。そこで得た経験や知識は自分の基盤となります。
また、周りのエンジニアと関わることで同じことでも新たな気づきがあったり、次に目標としたいことが見つけられます。
いずれにしても、技術を習得するには相応の時間と向き合い続ける努力が必要なことは間違いないと思っています。
7.z形式の圧縮ファイルをpythonで解凍する方法

# はじめに
ネットで調べてもコードがでてこなかったので、覚書としてまとめる。

# サンプルコード

JupyterNotebookを起動していただき、下記を確認しながら実行してください。

```python:xxxx.ipynb
!pip install pyunpack
!pip install patool

import os
from pyunpack import Archive
import shutil

# 解凍したいファイルのフルパス
PACKED_PATH='./hogehoge.7z'

# 解凍後のファイルの出力先
UNPACKED_PATH='./tmp/'

if not os.path.exists(UNPACKED_PATH):
    os.makedirs(UNPACKED_PATH)
Archive(PACKED_PATH).extractall(UNPACKED_PATH)
for dirname, _, filenames in os.walk(UNPACKED_PATH):
    for filename in filenames:
        print(os.path.join(dirname, filename))
```
MS-900 合格 勉強

#MS-900 合格した

勉強時間：13時間
※映画鑑賞（2~3本）と同時のため実際はこれ以下

教材：ExamTopicsのみ
※https://www.examtopics.com/exams/microsoft/ms-900/

勉強方法：問題を周回

周回数：1.5回（計300問）

MS開発経験：無し

合格時の得点：808 (必要最低点：700)

合格時の所要時間：10~20分
Peering DBをPower BIで可視化する

# 今度こそ本当にPeering DBをPower BIで可視化する
なぜ今度こそと言っているかというのはこちらでデータ取得について書いてあるからですのでよかったらこちらもお願いします。

https://qiita.com/misottyo/items/af0af467f3f17b48d0a2

# データセットを作る

今回見えるようにしたいのは主にこちらのふたつ
・指定のプロバイダーのロケーション一覧
・各ロケーションにはどれくらいのASやサービスプロバイダーがいるのか

前回の結果からこのあたりが必要と考える。
・Facilityのリスト
・サービスプロバイダーのリスト
・IXのリスト
・それぞれのリレーションシップ形成のためのテーブル

## データを取得
pythonでデータを取得していく

### Facilityのリスト
データの取得からpythonスクリプトを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627617/9a7afd10-0584-2f03-d930-2420c3fa4e11.png)

前回作ったFacilityリストを取得するスクリプトを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627617/ae64f5c4-b551-8a8e-91da-5be149b789ad.png)

ナビゲーターでテーブルを選択して一旦取り込んでみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627617/15e2ec92-9b26-8515-dcb0-0301d76340bf.png)

割といい感じに取り込めているので、これ以外のリストも取得する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627617/dc83fa23-8991-b27f-c852-9793fdd6d763.png)

### プロバイダーのリスト
基本的にはやり方は一緒でリンクがかわってくるだけなので、
org
ixfac
ix
netfac
net
fac
あたりをひとしきり取り込んだ。

## リレーションを組む
データの適応が完了すると勝手にリレーションを組んでくれているが、
普通に間違っているので一度全部消して全部作り直す
ファシリティ中心にリレーションを組む。
ここでOrgの中身見たらあんまり使わなそうなものばかりだったので、今回はいれなかった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627617/c73e19a7-92ca-200e-944d-cad6b8d8f697.png)


## Dashboardを作る
ここはもう好みの問題なので割愛しますが、
どういった問いを解決するためのものなのかという切り口で作れるといいなと思ってます。
あとは利用者がどういうものを必要としているのかに応じて作りこんでみようと思います。
例えば簡単にこういうのはできますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627617/09316371-1f06-1f4c-8598-2cad44809947.png)
Kubernetesについて簡単にまとめてみた

## Kubrenetesとは
- コンテナ化されたアプリのデプロイ、スケーリング等の管理を自動化するプラットフォーム。
- Docker単体では複数ホストで構成される規模の大きなプロダクション利用に耐えうるシステム構築は難しいので、Kubernetesを利用するのが一般的である。
- k8s(クベネティス、クーバネティス)との略称で呼ばれる。

## Kubernetesのメリット

- 複数ノード管理、 コンテナのスケジューリング
  - どのコンテナノードに配置するかを決定する。
  -  I/O処理が多いコンテナをSSDディスクのノードに配置するなどの制御が可能

- ローリングアップデート
 - 稼動状態を維持しながら、1台ずつ順番にアップデートできる


- 自動スケーリング
  - k8sはコンテナクラスタを形成し、複数ノードを管理する。
  - コンテナイメージを元にk8s上にデプロイする際、同じコンテナイメージを元にした複数コンテナをデプロイすることで、負荷分散や耐障害性の確保が可能。
  -  CPUやメモリの空き具合によってノードの増減を自動的に行う。

- コンテナ死活監視、障害のセルフヒーリング
 - コンテナプロセス監視を行っており、停止検知すると自動的にコンテナを再デプロイする。


- サービスディスカバリ
 - サービスの IP アドレスにマッピングされた自動生成サービス名(DNSみたいなもの)


- データ管理
 - k8sのバックエンドのデータストアはetcd（分散KVS）
 - クラスタを組んで安全かつ冗長化されて保存される　


- Infrastructure as Code
   - YMALで記述したコード（マニフェスト）によってデプロイするコンテナやリソースを管理できる。


## Kubernetes環境について

環境は大きく3種類ある。
開発、ステージング、プロダクションに使用する環境は同じにするのが吉。

### ローカルKubernetes （プロダクション環境には不向き）

 - ローカル1台に構築して使用する
    - Minikube
    - Docker Desktop for Mac/Win
    - kind (推奨）
        - *kindは、パッケージマネージャのHomebrewを使用してインストールするのが吉。*

### Kubernetes構築ツール

- 任意環境(オンプレ／クラウド)にクラスタを構築して使用する
   - kubeadm
   - Ansible Kubespray
   - OpenStack Magnum
   - Rancher (推奨)

### マネージドサービス

- クラウドが提供するクラスタを構築して使用する
   - GKE (GCP)
   - AKS (Azure)
   - EKS (AWS)

番外偏として[Play with Kubernetes](https://labs.play-with-k8s.com/)というWEBサービスがある。
WEBブラウザで手軽にk8sを試すことができるためとても便利である。
気が向いたらPlay with Kubernetesについても記事を書きたいと思います。

以上です。
コミュニケーション図 ランキング

コミュニケーション図を調べたときに参考になった記事。

##第1位
https://qiita.com/7of9/items/b3017d4ee1aa3939e58f
##第2位
https://qiita.com/tamago3keran/items/7a387480de0f4d6e1227
##第3位
https://qiita.com/ryuichi1208/items/e69028193baca5643fe4

いつもわかりやすい記事ありがとうございます。
DEP0500エラー解決方法

# DEP0500 エラーを解決した


1. ソリューションをクリーン
1. （vsを一旦落として）binとobjフォルダを丸ごと削除
1. vs再起動してソリューションをビルド

以上

参考：
https://netitude.bc3tech.net/2012/11/09/dep0500-error-while-creating-winrt-app/
Docker Swarmでクラスタを構成する方法

# Docker Swarmとは

複数のDockerホストを束ねてクラスタを構成するツール。
どのホストにどのコンテナを配置すべきか、ホストをまたいだコンテナ同士の通信制御といったコンテナオーケストレーションの役割を果たす。

# Dockerでの名称のまとめ

よく出てくるワードを下記にまとめる。

| 名称    | 役割                                                 | コマンド       | 
| ------- | ---------------------------------------------------- | -------------- | 
| Compose | 複数コンテナを使うDockerアプリの管理（シングルホスト） | docker-compose | 
| Swarm   | クラスタ構築や管理を担う（マルチホスト）             | docker swarm   | 
| Service | クラスタ内のService（コンテナの集まり）を管理する    | docker service | 
| Stack   | 複数のServiceをまとめたアプリ全体の管理              | docker stack   | 

# Docker Swarmクラスタを構成する方法


##  サーバを複数台を用意して、それぞれDocker環境を構築する。
[Docker Playground](https://labs.play-with-docker.com/)を利用すればDockerホスト(Ubuntu)をカンタンに追加できるので、利用します。
また学習目的のため、インフラコストの出費を避ける狙いもあります。

##  マスタノードとなるホストでの設定
+ADD NEW INSTANCEのボタンを押下して、マスタノードとなるホストを追加します。
そして、マスタノードとなるホストのターミナルで下記のコマンドを叩きます。

```shell
# Initialize
docker swarm init --advertise-addr <マスタノードのIP>
```

実行結果のサンプル![clip-20201001142126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533960/ef6cd3e0-f8ec-edf8-de85-785e4e04d3fb.png)


上記ターミナル画面に表示されている通り、マスタノードが管理したいワーカーノードを追加する場合は下記コマンドを実行してください。とメッセージがでます。

```shell
 docker swarm join --token <トークン> <マスタノードのIP>:<マスタノードのPORT>
```


## スレーブとなるホスト（ワーカーノード）を追加する
+ADD NEW INSTANCEのボタンを押下して、ワーカーノードとなるホストを追加します。
スレーブとなるDockerホスト上で下記コマンドを叩きます。
先程のスクリプトをハンドコピーせず、コマンドで取得することで、スクリプトによる自動化を可能としました。（とはいえ、今回のマスタノードIPはハンド入力なんですが）


```shell
# マスタノードからトークン取得する
token=$(ssh -o StrictHostKeyChecking=no <マスタノードのIP> "docker swarm join-token -q worker") && echo $token

# workerとして追加
docker swarm join  <マスタノードのIP>:<マスタノードのPORT> --token $token
```
実行結果![clip-20201001151834.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533960/7fb815f6-1c2f-4bbb-abd0-fb6b90df723f.png)

成功すれば、「This node joined a swarm as a worker.」と出る。

## マスタとワーカーと繋ぐためのネットワークを構築

マスタとなるホスト上で下記のコマンドを叩きます。

```shell
docker network create -d overlay <任意のネットワーク名>
```
実行することで、マスタとワーカーのコンテナで通信できます。

実行結果![clip-20201001152431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533960/bcb91150-f906-11af-e652-5b4240a00a94.png)

# おわりに

Docker PlayGroundを活用して、2台でのマスタノード、ワーカーノードの設定作業について説明しました。
3台以上で構成する場合も、2台目に実施した時と同じようにjoinコマンドを叩けばOKです。
気が向いたらServiceやStackを利用したコンテナデプロイについても書きます。

以上です。
Github Actionsで複数のサブモジュールの取得をSSHで行う

# やりたいこと
リポジトリAにプライベートリポジトリのサブモジュールA・Bがある
これをGithubActionsで取得したい
色々参考にするが、複数の取得だと
以下の２つのエラーでうまく行かなかった


```
git@github.com: Permission denied (publickey).
```

```
ERROR: Repository not found.
fatal: Could not read from remote repository.
```

参考にさせていただいた記事
- [Github ActionsでSSHを利用しsubmoduleをcloneする](https://zenn.dev/tera_ny/articles/d05fbfd1465d5d)
- [GithubActionsでプライベートリポジトリをsubmoduleとして取り込む](https://qiita.com/u_nation/items/8ff79a9831c05f3f1d1d)
- [GitHub Actions で submodules もチェックアウトする方法](https://blog.takuchalle.dev/post/2020/02/07/checkout_submodule/)
- [GIthub Actions で Git Submodule を 最新に更新して処理する](https://haibara-works.hatenablog.com/entry/2020/06/13/035619)


# やり方

1. 鍵の作成
2. それぞれのサブモジュールのリポジトリのDeploy keysに公開鍵を登録
3. GithubActionsからSSHの方式を変更する

## 鍵の作成
サブモジュールA・Bように２つの公開鍵と秘密鍵を作成する

ターミナルから

```
ssh-keygen -t rsa -b 4096 -C ""
```

rsa方式で作成する鍵のビット数4096に指定して作成しています。
`-C ""`は個人的な設定です
登録する公開鍵にユーザ名とホスト名が記載されるのが嫌なのでつかないようにしています
[参考:sshの鍵を作るときにちょっとだけ気にしたいこと](https://dev.classmethod.jp/articles/ssh-keygen-tips/)

```
Enter file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter]
Enter passphrase (empty for no passphrase): 
```

適当な場所に保存して、空のパスフレーズで作成しました。

これを、サブモジュールの数だけつくります。

## 2.それぞれのサブモジュールのリポジトリのDeploy keysに公開鍵を登録

作った公開鍵の中身をコピーします
保存場所と名前は適時変えて`.pub`の公開鍵の方をコピーします

```
pbcopy < ~/.ssh/id_rsa.pub
```

あとはサブモジュール側のSettings > Deploy keysからAdd newを選択してKeyの箇所に貼り付けます。
これをサブモジュールの数だけやります。

![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174757/5f69c98b-1197-60c2-8842-5039063d8b78.png)

## 3. GithubActionsからSSHの方式を変更する

メインのリポジトリ(GithubActions使う側)にSecret Ketを設定します

![ss1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174757/60dd810a-3d37-ef2d-9391-1b8d4855470f.png)

Valueには秘密鍵を設定します。
どの秘密鍵がどのサブモジュールのかわかるような名前を入れておきましょう

あとは、GithubActionsで使用するだけです

```yml:github-actions.yml
name: actions

on:
  push:
    branches:
      - "master"

jobs:
  submodule-try:
    runs-on: ubuntu-latest
    defaults:
      run:
        shell: bash

    env:
      SUBMODULE_A_TOKEN: ${{ secrets.A_ACCESS_TOKEN }}
      SUBMODULE_B_TOKEN: ${{ secrets.B_ACCESS_TOKEN }}

    steps:
      - uses: actions/checkout@v2

      - name: Get Submodule A
        run: |
          mkdir -p $HOME/.ssh/
          echo -e "$SUBMODULE_A_TOKEN" > $HOME/.ssh/id_rsa
          sudo chmod 600 $HOME/.ssh/id_rsa
          export GIT_SSH_COMMAND="ssh -i $HOME/.ssh/id_rsa"
          git submodule update --init --remote submodule_a

      - name: Get Submodule B
        run: |
          mkdir -p $HOME/.ssh/
          echo -e "$SUBMODULE_B_TOKEN" > $HOME/.ssh/id_rsa_b
          sudo chmod 600 $HOME/.ssh/id_rsa_b
          export GIT_SSH_COMMAND="ssh -i $HOME/.ssh/id_rsa_b"
          git submodule update --init --remote submodule_b
```
やってることは

1. ディレクトリ作成して
2. secret keyを秘密鍵として作成
3. パーミッションの変更
4. Gitがどの秘密鍵を使うかを設定しています
5. 指定したサブモジュールの取得を行います

---
むちゃくちゃ詰まったので参考になれば幸いです
Xcode の再インストール時に容量が足りないと表示される

##容量があるのに容量が足りないと表示されてしまう
Xcodeの再インストールをする際、51GBの空きがあるのにも関わらず、以下のようなエラーが出てしまう。

![xcode_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210256/676f2da7-a865-af22-0da0-546569b05600.png)
![xcode_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210256/48d6a30c-a29e-a896-5458-bea2135351c5.jpeg)


このような場合、xcodeが完全に削除できていない可能性があります。
コンソールを開き、以下を実行して完全にxcodeを削除しましょう。特に一番下のcoresimulatorは消し忘れてしまうことが多いです。

権限が必要であれば、先頭にsudoをつけて実行しましょう。

```
rm -rf /Applications/Xcode.app
rm -rf /Library/Preferences/com.apple.dt.Xcode.plist
rm -rf ~/Library/Preferences/com.apple.dt.Xcode.plist
rm -rf ~/Library/Caches/com.apple.dt.Xcode
rm -rf ~/Library/Application Support/Xcode
rm -rf ~/Library/Developer/Xcode
rm -rf ~/Library/Developer/CoreSimulator
```

xcodeの完全削除をした結果、ダウンロードが開始されました。
![xcode_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1210256/c92192af-0833-4880-c408-9af77af10531.png)
難しい事はわからないけど Docker 上で python を動かしてみる




公式サイトからDockerをダウンロードして起動する。
https://docs.docker.com/docker-for-mac/install/

インストールできたらバージョンを確認してみます。

```shell
$ docker --version
Docker version 20.10.0, build 7287ab3
```




Docker hub から python3.8 が使えるイメージをダウンロードします。

```shell
docker pull python:3.8
```


カレントディレクトリにappフォルダを作成し、そこにpython用のファイルを作成


```shell:ディレクトリ構成
└ app
   └ hello.py
```

```python:hello.py
print ("Hello, Python")
```


dockerコンテナ（コンテナ名：test）を起動する

```shell
docker run -it  -v $PWD/app:/tmp/work --name test python:3.8 /bin/bash
```

用意したコードを実行する

```shell
root:/# cd tmp/work/
root:/tmp/work# python hello.py 
```

```shell:実行結果
Hello, Python
```

ホストでコードを修正して、実行する

```python:hello.py
print ("Hello, Python on Docker")
```


```shell:実行結果
Hello, Python on Docker
```
Hack The Box とは

# ペネトレ王にオレはなる！からの大海原ヘドーン！

はい、今日は、私が大好きな Hack The Box（HTB）を紹介します！
（と、今日がはじめてのQiita投稿です。何卒よろしくお願いします。）

Hack The Boxは、サイバーセキュリティやペネトレーションテスト（ペネトレ）に関するスキルを身に付けたい人が、そのスキル向上のために活用できる世界最高の学習プラットフォームです。

なにが最高かというと、とにかく楽しいです！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112588/4bdf030b-d4a8-508f-4b9a-324d375a502b.png)

~~ハッキング技術~~（← 誤解を生む場合があるので自粛） ペネトレーションテストの技術を楽しく学べて、自己成長も体感できます。また、知識とスキルを仕事に生かすこともできるので、一流のペンテスター（ペネトレをする人＝スーパーハッカー）になれば、お金もガッポガッポ稼げる、はず！（たぶん。きっと。願望！）

はい、最高。

ハッカーという言葉に憧れる私には、最高でしかないですね。いや、ホント。

「ペネトレ王にオレはなる！！！」
（そしてガッポガッポ稼いで、億万長者になるぞー！(・∀・)/）

と、

私は、でかい声で周りへ勝手に宣誓しまくり、意気揚々と乗船チケットを購入（無料アカウントを作成）し、多少興奮気味にHTBという名の「豪華客船」へ乗り込みました。しかし、そんな私の高鳴る鼓動とはち切れそうに膨らんだ期待は、HTBへ乗船（ログイン）した直後、一気に不安に変わったのです。

ほー、ほー、ほー。　

ほーー

・・・ふーん

・・・

　　　・・・・・・わからん（泣）

うわ、まじ、なにがなんだか。

まったく分からん。

なにこれ？

何をしたら良いの？

どこから始めるの？？？

まじわからん。

・・・・まったく意味がわからなんです。。

・・・・オレ、まじ、死ぬで！シヌ！(ToT)/~~~ オセワニナリモシタ～サヨウナラ～

右も左も上も下も分からない（まして英語もそんなに得意ではない）私は、まるで大海原に投げ出された気分になったのです。チケットを買って（アカウントを作成して）豪華客船に乗り込んだつもりだったのに、、、、トホホ。

と、まあ、

正直、最初はこんな感じで、何をして良いか全く分からないところから始まります。（笑）

とはいえ、「ペネトレ王にオレはなる！」と~~軽いノリ~~で宣誓しまくった手前、この船を簡単に下船する（やめる）わけにもいかず、周りの先輩に教えてくださいと泣きつくわけにもいかないので、とりあえず、乗り込んだこの船（HTB）の世界を、死に物狂いで試行錯誤し、なんとか生き延びること数か月・・・

まったく分からなかったHTBの世界も、なんとなく１人で歩けるようになり、当初の目的であったペネトレの基礎が少しずつ身に付いてきたことを実感してきました。イエイ！

できなかったことが、できるようになるって、楽しいですよね (・∀・)b
（フツーの感想 ）

Writeup（攻略例）などを読み進めながら少しずつでも、できることが増えてきたり、自分で攻略の手がかりを発見したり、ついには、巷に転がっているWriteupやヒントを見ることなく、ノーヒントでターゲットマシン（BOX）が攻略できたときの達成感は、何にも代えがたく病みつきになるのです。(*´▽｀*) シアワセ♪

正直、クリアできるまで悶々とした日々を送ることもありますが、お風呂に入っているときや寝る前に、試していなかった手法を思いついちゃうと、いてもたってもいられず、すぐにでもパソコンを開いて試したくなります。一度はじめると、rootフラグを取るまでやめられなくなります。

ハマってしまうと寝不足必至。私生活に支障をきたす場合があります。Exploitコードを書いて、それがなかなか刺さらない夢を見たりすると病気の一歩手前です（私にrootフラグをください～）。しっかり睡眠はとりましょう（笑）

私がハマってしまったHTBの世界。

充実したコンテンツでペネトレを学習できるだけでも最高なのですが、HTBの世界ではターゲットマシン（BOX）を攻略するとポイントがゲットできたり、そのポイントに応じてランク（称号）がアップしたり、参加者や国別のランキングがあったりと、とにかくゲーム性が高いので、飽きずに学習を継続することができます。ゲーム感覚で、楽しみながら、ペンテスターになれるのです！

はい、最高（本日２回目）

よし、HTB！やってみるべー！と思った、そこのあなた！

はたまた、ハッカーに憧れている人、ハッキング技術に興味がある人、ハッキング技術で（合法な）仕事をしたい人、ハッキング技術を習得して世界を救いたい人！がっぽがっぽお金を稼ぎたい人、などなど。

そう君！そこのお兄さんも！お姉さんも！おじさんも！ジャムおじも！
ペネトレーションテストのスキルを習得して、一緒にスーパーハッカー目指しましょう。

（私が１人で頑張り切れる気がしないので・・・・どなたか一緒に勉強しましょう・・・・してくれると嬉しいな・・・嬉しいです・・・おねがい、たすけて。謎）

ハッカーに憧れている人、ペンテスターになりたい人、ならないといけない人、ハッキング技術で世界を救いたい人！
HTBに用意された数多くの実践的な演習を通じて、ペネトレーションテストのスキルをガンガン上げていきましょう！

Enjoy Hacking!!!

- Hack the box：  [https://www.hackthebox.com/](https://www.hackthebox.com/)

https://qiita.com/WhizOwl/items/8c415a58d688c4025d12

https://qiita.com/WhizOwl/items/a72e547ccb0d053abedd

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112588/19644533-d15c-f936-7eaa-db2416b5b22a.png)

今後、自分のメモや備忘録を兼ねて、Hack The BoxのRitired Machine の Writeup やOSCP受験に向けた記事など上げていこうと思います！！！
Beanstalkの読み方はビーンストークかビーンスタークか

## まえがき

AWS Elastic Beanstalkというサービスを知り、最初は「ビーンストーク」だと思ったのですが、「ビーンスターク」と読む日本人も多いようで、気になったので調べました。

## ビーンズトークではない

まず、ビーンズトーク（bean's talk、豆の話）ではありません。

この語は、bean（豆）＋stalk（茎）から成り、そのまま「豆の茎」を意味します。AWSのサービス名としては、豆を置いたところから茎が伸びるように、アプリを置いたらインフラが生えるイメージで名付けられたと、どこかで聞いた覚えがあります（ソースなし）。

## 基本的にビーンストークでよい

Beanをビーンと読むことに異論はないので、stalkの読み方が問題になります。

結論としては、talkをトークと読むように、stalkもストークと読むのが基本だと思います。すなわち、**beanstalkはビーンストークと読む**ということです。

例えば、[Oxford Learner's Dictionaries](https://www.oxfordlearnersdictionaries.com/)では、talk /tɔːk/、stalk /stɔːk/と発音記号が示されており、stalkはtalkと同様に発音することが分かります。

## ビーンスタークでもよい

しかし、近年ではアメリカ西部の若年層を中心に、stalkをスタークあるいはスタックのように発音する人が増えているようです。この現象はstalkに限った話ではなく、様々な語でもともと「オ」のように発音されていた部分が「ア」のように発音される現象で、**cot-caught merger**（cotとcaughtの発音の同化）と呼ばれます。詳細は「cot-caught merger」で検索してください。

こうした、最近のアメリカ人（あるいは何割かのAWS社員）の発音を基準にすれば、**beanstalkをビーンスタークと読んでもよさそう**です。

## あとがき

本文では出しませんでしたが、英語の発音を調べるときは[Wiktionary](https://en.wiktionary.org/wiki/Wiktionary:Main_Page)がおすすめです。ぜひ[Wiktionaryでstalkと調べて](https://en.wiktionary.org/wiki/stalk)みてください。
UiPath：カスタムアクティビティはどうやって？

UiPath：カスタムアクティビティはどうやって？

## 皆もすなるQiitaといふものを、儂もしてみむとてするなり。

と言う訳で、こん＊＊は！はなっち！です。

★★★この記事はUiPathブログ発信チャレンジ2021サマー、7/1の記事です。★★★

□今回は、どうやって「カスタムアクティビティ」を作っていくかをまとめてみました！

１）何をするカスタムアクティビティなのか
　当然の事ですが、カスタムアクティビティを設計する上で、何を機能するものなのかを決定しないといけません。
　私が作るカスタムアクティビティの各xamlファイルの中には、表示名が「概要」「例」「備考」と言う「コメントアクティビティ」で処理の機能概要、使用例、備考を設定しています。

２）カスタムアクティビティの名前を決める。
　xamlファイル名が、カスタムアクティビティの名前になります。長いファイル名で作成する事は可能ですが、実際に使用する際、先頭の１０数文字しか見えませんので、やはり命名は難しいですね。
　プロジェクトの内部にサブフォルダを作成すると、それがカスタムアクティビティの階層にもなります。ですので、カスタムアクティビティの機能単位にまとめてもいいですね。

３）引数を決める
　そのカスタムアクティビティで、可変となるものを、引数として渡してもらうのか、処理した結果をどう返すのかを決めます。
　この際、必ず指定しなければならない引数、必ずしも指定しなくてもよい引数も併せて決めます。
　必ず指定しなければならない引数には、引数のパラメタで「IsRequired」のチェックボックスをONにします。
　必ずしも指定しなくてもよい引数は、カスタムアクティビティ内部で、処理で使う、作り手が良いと思った値を設定しましょう。
　引数には、注釈を設定しましょう。入力値の持つ意味、入力値の範囲、必須/任意などを記載しておきましょう

４）エラー時に起こす事を決めましょう。
　ごく一般的なアクティビティのエラーで異常終了させてしまい、エラー処理に労力を掛けないという手もありますね。
　私が作るカスタムアクティビティは、エラーが発生したら、利用者側の設定を見直してもらおうというスタンスで作っています(^^♪

□なぜ、コメントアクティビティを使ったり、引数に注釈を記載したりするのか？

　ご存じのように、UiPathのxamlファイルは、テキストエディタなどで開くことができ、その中身を文字として読むことができます。
　
　例）
　・引数の注釈
　    \<x:Members>
　　　    \<x:Property sap2010:Annotation.AnnotationText="引数の注釈" Name="引数" Type="InArgument(x:String)" />
　    \</x:Members>

　・コメントへの記載
　    \<ui:Comment DisplayName="概要" Text="概要を記載する" />

　※重要なキーワード部分のみを抜粋しています。

　使用手引書を作成する場合、xamlファイルに設定した注釈、コメントをコピペして、使用手引書に転記してもいいのですが、
　折角なので、xamlファイルに設定された各情報を再利用するのも一興ですね。
　
　※EXCELerでもある私は、JSONファイル/XAMLファイルを読んで、仕様書をEXCELファイルだったり、WORDファイルだったりで作成するツールを作成して、省力化を図っています。

★miya_gisさんが、もっとCOOLなツールをUiPath Market上で公開しています。探してみてください！

##おわりに
いかがでした？

▼ロボットであろうが、カスタムアクティビティであろうが、仕様があって、それを機能するように作る事には変わりありません。
▼カスタムアクティビティが特別なのは、それが標準のアクティビティのようにドラッグ＆ドロップで実装できる事です。引数もアクティビティ部分に設定するのではなく、パラメタパネルを介して設定できるようになります。一般的な引数、変数の時に使途不明だった「IsRequired」の意味も分かります。
▼xamlファイルは、UTF-8形式のxmlで記述されているファイルです。無論テキストエディタで容易に開くことができ、開くことができれば更新する事も可能です。

是非UiPathでのロボ開発の一助になればと思っています。

ありがとうございました！
【キャッチアップ】AWS全般

### オフィシャル動画
### AWSのオフィシャルサイト
https://aws.amazon.com/jp/blogs/news/aws-beginner-home-learning/

https://www.youtube.com/watch?v=LgNbu_joVhc&list=TLPQMDEwNzIwMjE_ufR8qOP9Ig&index=2

https://www.youtube.com/watch?v=nebsF0XE0JA

### 【参考】aws-cli
https://qiita.com/bakira/items/8a9481c99ed56a367415

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-welcome.html

### 【参考】入門的な動画
https://www.youtube.com/watch?v=HxBNDPQOJiQ&list=TLPQMDEwNzIwMjE_ufR8qOP9Ig&index=4

https://www.youtube.com/watch?v=7J_crzU5KP8&list=TLPQMDEwNzIwMjE_ufR8qOP9Ig&index=5

https://www.youtube.com/watch?v=xq595cj3IdQ&list=TLPQMDEwNzIwMjE_ufR8qOP9Ig&index=9
OCIのIAMユーザ作成で「電子メールのアクティブ化失敗」が出た時の対応方法

# 【解決したいこと】
IAMで作成したユーザのメールアドレスのアクティブ化を完了させたい。
完了していないと、ユーザのところに「検証保留中」と表示されてしまう。
この状態でもIDCSユーザで問題なく利用できるので、困ってはいないが、「検証保留中」を消してすっきりしたい。


# 【やったこと】
1. アクティブ化したいユーザの詳細で「検証の再送信」と初回ログインの場合は「パスワードの再作成」をする、パスワードは必ずコピル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064900/d6607082-905c-3d9b-ebed-7b11234bd401.png)


2. メールが飛んでくる「Welcome to Oracle Cloud - Sign in and get started」
    2. **※注意※**メールのリンクを叩いて、1の作業をしてた同じブラウザで開くと、おそらくキャッシュが残っていて、先ほどまでログインしていたIDCSの情報でログインしようとしてしまうため、ブラウザを変えるかキャッシュを消すか、シークレットモードでブラウザを開く。
    2. **※注意※**入口が2つある。下の方がIAMの入り口。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064900/22cdc476-68ec-fa2d-b85f-50cad391ee42.png)

3. 下の入り口から1の作業でメモしておいたパスワードでログインを試みるとログインでき、メールアドレスがアクティブ化成功するはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064900/58ab5e25-9210-e38f-cd6f-53edf1bc461f.png)


以上です
bashスクリプトで対話型コマンドを実行するには

## bashの中で対話型コマンドを実行する時の課題
シェルの中で対話型コマンドを実行するとき、それも対話内容によって複雑な処理が必要かつ、入力が変わる時、**コマンドへの入力方法がわからない**。
例えば、letsencrypt のワイルドーカード証明証の発行などがそれ。

letsencrypt のワイルドーカード証明証では、対話型コマンドの中で、自身のDNSにTXTレコードを指定の値で作れって指示があり、それを設定した後にDNSが公開されるまで待って「改行」を入力する必要があります。　
簡単な対話型の実現なら expect コマンドでもいいが、上記のような処理では対応が難しい。

で、どう実現するか？　コマンドの出力を受け取るのは簡単ですが、難しいのは入力。yesコマンドや echoを pipe で繋ぐと、待って欲しいのに勝手に入力してしまう。　このタイミングをコントロールする方法があります。　

## 実現方法
```:bash
touch input.txt
status=0
tail -f input.txt | {実行したいコマンド} | while read -r res;
do
    if [[ $status == 1 ]]; then
       {status1 + 次の入力(res)を使って、実際のコマンド処理}  [*1]
       echo "" >> input.txt     # ⭐️ここがポイント！！ これでコマンドに入力できます！
       status=2
    elif [[ $res == {コマンドの対話出力でフックしたい文字列[*2]}* ]]; then
        status=1
    fi
done
rm -f input.txt
```
1. letsencrypt のワイルドーカード証明証なら、ここでDNS TXTレコードに指定された値を設定する。DNS公開が安定するまでsleepした方が良いので、 sleep 300 などをコマンド実行後に入れる。
2. ここに _acme-challenge.{ドメイン名} を入れれば、次の行で指定値を出力するので、そこでDNS TXTレコードを作るわけです。　それが [*1]のコマンドです。

## まとめ
ポイントは、以下の形で、**tail -f** で入力できるようにし、read でコマンド出力を参照しながら必要に応じて **tail -f** で監視するファイルに**echo**入力するところです。

```:bash
  tailf -f 入力ファイル | コマンド | read -r res;
  do
　　　echo 入力文字 >> 入力ファイル  # ⭐️これでコマンドに入力を渡せるんです。
  done
```
letsencrypt のワイルドカード証明書の更新の場合、上記以外にもフックしなきゃいけない文字列は幾つかあります。すでに証明証発行済みの場合などのためです。
Raspberry Piを産業用途で使いたい！～BHシリーズの特徴～

Raspberry Piは開発しやすい一方でいざ商業利用をしようとして行き詰ってしまうことがあります。RaspberryPiを産業用途で使用する場合の課題がトランジスタ技術2017年7月号「My IoT製作用PCプラモデルの開発」というタイトルで掲載されたこともあります。

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1590352/a6d8980c-542b-9c37-a114-4bb7360e641a.jpeg)

##ラズベリーパイの課題
・マイクロSDカードの耐久性
・CPUの発熱
・強制的な電源シャットダウン時の対処
・電源電圧降下
・カレンダ・クロック（リアルタイムクロック）なし
・絶縁されていない

BHシリーズでは、上記の課題を解決し工業試験場にて耐環境チェックまで行っています。ではBHではどのような対策をしているか！その中身を探ってみます！

|![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1590352/11b6e661-63ec-8d1b-8681-b4ef50403d31.jpeg)
|:---:|
|【ビズライト・テクノロジー社製BH3】|

##BH3の主な特徴
・RaspberryPiを独自基板に接続し、鉄製ケースに収納している。
・独自の電源回路で５Vを安定供給(マイクロUSBは使わず直接ピンヘッダ経由で供給している。付属ACアダプタは7.5V3A）
・電気二重層コンデンサ（BH2/BH3）または乾電池（BH2Lite）を実装し、電源断を検知した際に電源が切り替わる。
・RTC実装
・適切なグランド処理にて耐ノイズ性能向上（フレームグランド）
・熱伝導シートとパイプにてCPUの発熱をケースへ排熱
・電源スイッチ実装
・セットアップツールの無償利用

##RaspberryPiを産業利用するための具体策

####マイクロSDカードの耐久性、強制的な電源シャットダウン
トラ技の中では、書き込み回数からの視点で掲載されておりましたが、価格のひどく安い製品を使わない限り、マイクロSDカードが壊れる主要因は、強制的な電源シャットダウンです。
BHでは、独自の電源回路を設計しており、電源断もしくは電源スイッチがOFFになるとOSレベルで割り込みが入ってくるようになっています。
割り込みを検知すると独自にチューニングしたシャットダウンシーケンスが稼働し、任意のプログラムが実行できるようになっています。 その間の稼働は電気二重層コンデンサもしくは乾電池となります。（20秒ー30秒程度の稼働が可能）任意のプログラムにて、ファイルクローズ処理や異常を知らせるメール送信などの処理を行い、正常にシャットダウンすることで、SDカードの破損を防ぐことができます。
なお、何も処理をしない場合は３－５秒程度でシャットダウンされるようになっています。

####CPUの発熱対策
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1590352/574d923d-b219-fea6-205f-3339c841770f.jpeg)

CPUから熱伝導シートとピラーを経由して ケースへ排熱しています。

####電源電圧降下対策
独自の電源回路にて５Vを安定供給(マイクロUSBは使わず直接ピンヘッダ経由で供給しています。 ）

####カレンダ・クロック（リアルタイムクロック）
超高精度I²C内蔵RTC(DS3231)を採用し、ボタン電池と共に実装。（写真参照)

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1590352/8da6faa8-9857-6dde-e3d5-502e8b57bb3c.jpeg)

####絶縁処理
適切なグランド処理を行い、フレームグランドとなっています。


####工業試験場での評価結果
・0℃、50℃ 恒温槽24時間動作試験
・静電気接触 8KV試験
・静電気放電 15KV試験
・雷サージ ACラインに1KV試験
・VCCI Class B同等試験
・電源ポート伝導妨害波試験
・IEC61000-4-3 放射イミュニティ 10Vm

####採用例
・太陽光発電システムのコントローラー
・工事現場での既存設備からのデータ収集とクラウド環境へのアップロード用コントローラー
・工事現場でのセンサ制御コントローラー
・河川監視カメラのコントローラー
・生産ライン稼働チェック
・ネットワーク不正侵入感知システム
・オーディオコントローラー
・デジタルサイネージプレーヤー
・FA
（実績ベースの不良率：0.001%）

産業用Raspberry PiとしてBHシリーズは強い味方になりそうだ！
.gitpodの使い方

gitpodに関する情報が少ないと感じるので、備忘録程度に書きます。

gitpod.ymlファイルの作成
---

```
gp init
```

gitpodはgitpod.ymlファイルを作成することにより、開発環境を維持することが出来る。
書き方はdocker-compose.ymlと同じ記述方式で、ドキュメントルートにてコマンドを走らせる。
※-iオプションを付けるとインタラクティブモードで作成してくれるらしい

gitpod.ymlのオプション
---

使いそうなものだけ、必要そうなものだけをピックアップしました。
その他の細かい設定は[https://www.gitpod.io/docs/references/gitpod-yml](https://www.gitpod.io/docs/references/gitpod-yml)

**github**
デフォルトでは以下の設定がされている様子。

```
// EXAMPLE

github:
  prebuilds:
    master: true
    branches: true
    pullRequests: true
    pullRequestsFromForks: true
    addCheck: false
    addComment: false
    addBadge: true
```

**prebuilds.addComment**

このオプションをtrueにするとgithubでプルリクエストしたときの確認をgitpodで開くことが出来らしい。

**image**
ワークスペースに使用するDockerイメージのカスタマイズが出来るそう。
[https://www.gitpod.io/docs/config-docker](https://www.gitpod.io/docs/config-docker)


```
// EXAMPLE

// With a public image
image: ubuntu:latest

// With a custom image
image:
  file: .gitpod.Dockerfile

// With an optional context
image:
  file: .gitpod.Dockerfile
  context: ./docker-content
```

**ports**

ポートの設定

```
// EXAMPLE

ports:
  - port: 3000
    onOpen: open-preview
  - port: 10000
    onOpen: ignore
```

**tasks**
プロジェクトの準備および構築する方法、プロジェクトの開発サーバーを起動する方法を定義出来る。
[https://www.gitpod.io/docs/config-start-tasks](https://www.gitpod.io/docs/config-start-tasks)

```
// EXAMPLE
tasks:
  - before: sh ./scripts/setup.sh
    init: npm install
    command: npm run dev
  - name: Database
    init: sh ./scripts/seed-database.sh
    command: npm start-db
    env:
      DB_HOST: localhost:3306
      DB_USER: readOnlyUser
```

・before　initの前に実行するシェルコマンドとメインコマンド（開始の度に実行される）
・command beforeやinitの後に実行するコマンド
・env　　 環境変数
・init    beforeとmainコマンドの間で実行される
・name    taskの名前

**vscode**
VScodeの拡張が出来る。
拡張機能の識別子は常に$ {publisher}。$ {name}だそう。

```
vscode:
  extensions:
    - svelte.svelte-vscode
    - bradlc.vscode-tailwindcss
```

結論
まとめたけど、まだよくわからん。