OmniAICreator/Qiita-1.07M huggingface dataset:
スクラムってなんだ・・・！？スクラム初心者のつぶやき Part2

#この記事について
　この記事は、[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html)の開発チーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu)」で行っているアウトプット企画、「[チーム「オキザリス」Advent Calendar](https://qiita.com/advent-calendar/2020/oxalis)」の8日目の記事です。
　この記事では、スクラム開発に着手して約2か月の初心者が「**スクラム**」について感じたことを記事にして行きます。

#この記事の目的
　本記事の目的として、自分と同じスクラム初心者へ「大丈夫、初心者はあなた一人じゃないよ」というメッセージと、スクラム経験者に「初心者はここがわからないのか」と初心者の気持ちが伝わればと思っています:grin:
　では、さっそく記事に移りましょう。

#初めて「スクラムマスター」と聞いたとき
　自分が初めて「**スクラムマスター**」と聞いた際に、「スクラム開発」のプロフェッショナルかと思いました。
　その後説明を聞いた際に「**スクラムマスター**」はチーム内の発言を活性化させる役割があると聞き、積極的に発言することが控えめな日本人にとって、「**スクラムマスター**」の役割はとても重要になものだと思いました。
　今ではスクラム開発において、「**スクラムマスター**」の動きを実際にやってみたりして勉強中です:writing_hand_tone2:

#初めての「Sprint」
　初めて「**Sprint**」を行った際に、時間で作業を区切るという手法に驚きました。
今まで経験してきた「**ウォーターフォール開発**」では作業で時間を区切っていたため、時間に対する意識が低くなっていました:fearful:
しかし「**スクラム開発**」では、時間で作業を区切るので、時間を意識できるようになったと思います:smiley:
　自分のチームでは、この「**Sprint**」を1時間で行っていました。
その後、他のチームと会話の中で本来は1～2週間単位で行うことを知りました:scream:
　知らず知らずのうちに凄いことをしていたみたいで、正直めちゃくちゃビックリしました・・・:sweat:
でも、知らなかったからこそ「**1時間Sprint**」に先入観なしで取り組めていたと思います。

#感想
　スクラム開発に着手してから、「**わからない**」という状態によくなりました（今もですが:sweat_smile:）
その際に、「多分こういう意味だろう」と憶測することは危険なことで、記事に記載したスクラムマスターの件と同じように、意味や内容を間違えて理解していると作業に支障が出る場合もあります。
　そのため、わからないことが出てきた際に、「**わからない**」と発言することはとても重要なことだと思いました。
　「**わからない**」という声が初心者から出せるようなチームだとありがたいですね:blush:

#終わりに
　いかがでしたでしょうか？読んでいただいた方に少しでも気持ちが伝われば幸いです:relaxed:
　私が担当する「[チーム「オキザリス」Advent Calendar](https://qiita.com/advent-calendar/2020/oxalis)」では今回に引き続き、スクラム初心者のつぶやきを記事にしていきます！次回更新は12/17(木)です！

#小ネタ
　文面で「**スクラムマスター**」と表記する際に「**SM**」と表記されがちですが、初めて「**SM**」という表記を見た際に「・・・！？」ってなりました・・・:sweat_smile:

#過去の記事
スクラムってなんだ・・・！？スクラム初心者のつぶやき
**[・Part1](https://qiita.com/kimagre_human/items/7c0bbdd3b3ac838aaf2b)**
k3sのバージョンアップとミスした時の対処方法

研究室のk3sクラスタのバージョンアップをしようとしたところworkerがNotReadyになったのでその時の原因と対処法の備忘録です．

VERSIONを
v1.18.3+k3s1⇒v1.19.3+k3s3にアップ

```
$ sudo kubectl get nodes
NAME       STATUS     ROLES    AGE   VERSION
worker-1   NotReady   <none>   100d   v1.19.3+k3s3
worker-2   NotReady   <none>   100d   v1.19.3+k3s3
master     Ready      master   100d   v1.19.3+k3s3
```
しかしNotReadyに...
**エラーが起こったらログを見ろ**
masterの**/var/log/syslog**を見たところ

```
Nov 27 08:26:13 anchor-1 k3s[29821]: E1127 08:26:13.520864 29821 authentication.go:53] Unable to authenticate the request due to an error: x509: certificate signed by unknown authority
```

証明書がおかしいらしいのでworkerのk3sの設定を見る

```
worker1:~$ which k3s
/usr/local/bin/k3s

worker1:~$ ls /usr/local/bin/
crictl  ctr  k3s  k3s-agent-uninstall.sh  k3s-killall.sh  k3s-uninstall.sh  kubectl  stns-key-wrapper
```

## 原因
workerにmasterの設定を入れてしまっていた...
(xpanesコマンドを使い複数VMにmasterの設定を流し込んだのが原因です...)

## 対処法
/usr/local/binのk3s-agent-uninstall.shを実行して削除

```
/usr/local/bin$ ./k3s-agent-uninstall.sh
```

workerの再設定

```
curl -sfL https://get.k3s.io | K3S_URL=<master name>
:6443 K3S_TOKEN="<node-token>" sh -
```

```
$ sudo kubectl get nodes
NAME       STATUS     ROLES    AGE   VERSION
worker-1   Ready      <none>   100d   v1.19.3+k3s3
worker-2   Ready      <none>   100d   v1.19.3+k3s3
master     Ready      master   100d   v1.19.3+k3s3
```

## 参考文献
[日本語版K3sマニュアル](https://rancher.co.jp/pdfs/K3s-eBook4Styles0507.pdf)
スクラムってなんだ・・・！？スクラム初心者のつぶやき Part1

#この記事について
　この記事は、[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html)の開発チーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu)」で行っているアウトプット企画、「[チーム「オキザリス」Advent Calendar](https://qiita.com/advent-calendar/2020/oxalis)」の3日目の記事です。
　この記事では、スクラム開発に着手して約2か月の初心者が「**スクラム**」について感じたことを記事にして行きます。

#この記事の目的
　本記事の目的として、自分と同じスクラム初心者へ「大丈夫、初心者はあなた一人じゃないよ」というメッセージと、スクラム経験者に「初心者はここがわからないのか」と初心者の気持ちが伝わればと思っています:grin:
　では、さっそく記事に移りましょう。

#初めて「スクラム」と聞いたとき
　自分が初めて「**スクラム**」と聞いたときに、真っ先に思い浮かべたのがラグビーです:football:
その後説明を聞いた際に、「**スクラム**」は、チームで組むことで一つの目標に向かう手法で、語源はラグビーの「**スクラム**」だと聞きました。
　「チームの力を一つにする」という意味合いではどちらも同じですね:relaxed:

#初めて「スクラム開発」をやってみたとき
　自分が初めて「**スクラム開発**」をやった際の第一印象は「な、なんだこれは・・・」です。
それまでやってきた「**ウォーターフォール開発**」では、上から言われた作業を1人で黙々と行っていたのですが、「**スクラム開発**」では、チームで仕事を決めてチームで作業を行います。
この「**スクラム開発**」と「**ウォーターフォール開発**」のギャップがおおきく、正直戸惑いました:scream:
　その後ひと月程「**スクラム開発**」をやってみると、利点がわかるようになり作業効率が「**ウォーターフォール開発**」より良くなると感じました:thumbsup_tone2:

#感想
　「**スクラム開発**」に着手した当初は、複数人で1つの作業をして効率がいいの？と半信半疑でした。
　しかし「**スクラム開発**」に慣れてみると、作業がほとんど滞ることがないため、スムーズに開発ができていることを実感できました。
　先入観に捉われず、新しいことに挑戦することは大切だと思いました:grinning:

#終わりに
　いかがでしたでしょうか？読んでいただいた方に少しでも気持ちが伝われば幸いです:relaxed:
私が担当する「[チーム「オキザリス」Advent Calendar](https://qiita.com/advent-calendar/2020/oxalis)」では今回に引き続き、スクラム初心者のつぶやきを記事にしていきます！次回更新は12/8(火)です！

#小ネタ
　スクラム開発に着手した当初、「**スクラムマスター**」という言葉に馴染みがなく、ド忘れした際に必死に思い出して出てきたのが「**タックルマスター**」でした・・・:sweat_smile:
　　**＿人人人人人人人＿
　　＞　唐突な脳筋　＜
　　￣Y^Y^Y^Y^Y^Y￣**
　これだと力づくで問題解決する人になってしまいますね:muscle_tone3:
パス名からファイル名と一番下のディレクトリ名を同時に抽出するワンライナー

# 動機

機械学習のデータセットを整理していたときに、
こういう構造のファイル群を

```plaintext
dir/
├── a/
│   ├── 0000.jpg
│   ├── 0001.jpg
│   ├── 0002.jpg
│   ︙
├── b/
│   ├── 0000.jpg
│   ├── 0001.jpg
│   ├── 0002.jpg
│   ︙
├── c/
│   ├── 0000.jpg
│   ├── 0001.jpg
│   ├── 0002.jpg
│   ︙
```

下のように、ディレクトリ名をファイル名の頭につけてコピーしたかった。

```plaintext
newdir/
├── a_0000.jpg
├── a_0001.jpg
├── a_0002.jpg
︙
├── b_0000.jpg
├── b_0001.jpg
├── b_0002.jpg
︙
├── c_0000.jpg
├── c_0001.jpg
├── c_0002.jpg
︙
```

# 方法

```shell-session
$ find ./dir -type f | xargs -L 1 -I {} sh -c 'echo {} | awk -F "/" '\''{print $(NF-1) "_" $(NF)}'\'''
```

```plaintext:出力
a_0000.jpg
a_0001.jpg
︙
```

`find`でとってきたパスをスラッシュで区切った後、最後から2番目の文字列(一番下のディレクトリ名)と最後の文字列(ファイル名)をアンダーバーで結合して表示する。
"/"の部分を他の文字に変えれば、異なる区切り文字にも対応できる。

コピーするときは、

```shell-session
$ find ./dir -type f | xargs -L 1 -I {} sh -c 'echo {} | awk -F "/" '\''{print $(NF-1) "_" $(NF)}'\''| { read newfn ; cp {} ./newdir/$newfn ; }'
```

とする。
Feature Spec Tips集

本エントリは [iCARE Advent Calendar 2020](https://qiita.com/advent-calendar/2020/icare) の12日目です。

## はじめに
今回は [Carely](https://www.carely.jp/) の開発を行う中で書いた Feature Spec の小技を紹介したいと思います

## １，プログラムの一時停止
Feature Specを書いていると、何らかの処理が終わるまでプログラムの実行を停止させたいケースが出てくると思います。

[sleep](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/sleep.html) で停止させることもできますが、指定した時間は必ず停止してしまうので「処理は終わっているのにプログラムは停止している」という望ましくない状況になる可能性があります。数が増えるほど影響は大きくなってくるので、不要に時間をかけるのは極力避けたいところです。

そこで以下の2つの方法を使いました

### ① findメソッドを使う
capybaraの find というメソッドの [ドキュメント](https://rubydoc.info/github/jnicklas/capybara/master/Capybara%2FNode%2FFinders:find) を見てみると以下の記述があります

> If the driver is capable of executing JavaScript, this method will wait for a set amount of time and continuously retry finding the element until either the element is found or the time expires. The length of time this method will wait is controlled through default_max_wait_time.

訳すと「ドライバがJavaScriptを実行できる場合、設定された時間のあいだ要素が見つかるか時間切れになるまで継続的に再試行します。このメソッドが待つ時間の長さは default_max_wait_time で制御されます」という意味になります

例として「タスクを新規作成したあと画面遷移してflashメッセージが表示される」というケースの場合、以下のように書くとflashメッセージが見つかる or 設定時間が経過するまで検索を行います

```ruby
find("p#notice", text: "Task was successfully created.")
```

default_max_wait_time のデフォルト値は2秒ですが、設定で変更したり
以下のように個別に指定することもできます。

```ruby
find("p#notice", text: "Task was successfully created.", wait: 30)
```

#### 注意点
遷移前、遷移後両方に表示されている要素は指定しないようにしましょう。
遷移前の段階で要素が見つかり処理が進んでしまいます

### ② Timeoutモジュールを使う

要素の有無によって確認できない時はfindを使えません。その場合はRubyの [Timeout](https://docs.ruby-lang.org/ja/latest/class/Timeout.html) モジュールを使うと「設定時間の間で処理が終われば即、次の処理に移る or 時間切れで例外となる」動きを実現できます

以下に「ファイルダウンロードされるまで待ちたいケース」のサンプルコードを置いておきます

```ruby
Timeout.timeout(5) do
  loop { break if file_downloaded? }
end
```

## ２，新しいタブにアクセス
`target="_blank"` 属性がついているリンクをクリックすると別タブで展開されます。
新しいタブの動作を確認したい場合 capybaraでは [switch_to_window](https://www.rubydoc.info/github/jnicklas/capybara/Capybara%2FSession:switch_to_window) でタブを切り替えることができます

```ruby
switch_to_window(windows.last)
```

## ３，親要素にアクセス
select要素を指定したかったのですが、特定のidなどが無かったので以下のような順で指定しました
selectの兄弟要素であるlabelを指定 -> xpathを使って親要素を指定 -> 配下のselectタグを指定
xpathで親要素を参照できる。というのがもしかしたら誰かの役に立つかも？と思い書きました

```ruby
find("label", text: "アタリがつけられるラベル名").find(:xpath, '..').find("select")
```

# まとめ
「プログラムの一時停止」の割合が大きくなってしまいましたが、Feature Spec の小技を紹介させていただきました
どなたかの助けになれたら幸いです！

# iCAREテックブログもよろしくね！！
https://www.icare.jpn.com/dev_cat/
markdown記法まとめ

### Markdown記法まとめ

以前備忘録としてまとめたので共有しておきます。

### 見出し
    # 見出し1
    ## 見出し2
    ### 見出し3
    #### 見出し4
    ####　見出し5
    #####　見出し6

___

### 箇条書きリスト
     リスト1
        - ネスト リスト1_1
            - ネスト リスト1_1_1
            - ネスト リスト1_1_2
        - ネスト リスト1_2
    - リスト2
    - リスト3
- リスト1
    - ネスト リスト1_1
        - ネスト リスト1_1_1
        - ネスト リスト1_1_2
    - ネスト リスト1_2
- リスト2
- リスト3

### 番号付きリスト
    1. 番号付きリスト1
        1. 番号付きリスト1_1
        1. 番号付きリスト1_2
    1. 番号付きリスト2
    1. 番号付きリスト3
1. 番号付きリスト1
    1. 番号付きリスト1_1
    1. 番号付きリスト1_2
1. 番号付きリスト2
1. 番号付きリスト3

### 引用
    > 引用1
    > 
    > 引用2
> 引用1
> 
> 引用2

### 二重引用
    > 引用
    > 
    > 引用2
    >> 引用2＿1
    >> 
    >> 引用2_2
> 引用
> 
> 引用2
>> 引用2＿1
>> 
>> 引用2_2

### 打ち消し
    ~~打ち消し~~
~~打ち消し~~
追加情報としたい内容を、detailsタグで囲みます。そして、要約として表示したい文章をsummaryタグで記載します。


### 折り畳み
    <details><summary>折り畳み</summary>説明</details>

<details><summary>折り畳み</summary>説明</details>


### pre記法(スペース4個orタブ)
#### Tab
    class Hoge
        def hoge
            print 'hoge'
        end
    end

#### Space
    class Hoge
      def hoge
        print 'hoge'
      end
    end

### code記法
    インストールコマンドは`gem install hoge` 
インストールコマンドは`gem install hoge` 

### 強調
#### 強調1
    normal *italic* normal
    normal _italic_ normal
normal *italic* normal
normal _italic_ normal

#### 強調2
    normal **bold** normal
    normal __bold__ normal
normal **bold** normal
normal __bold__ normal

#### 強調3
    normal ***bold*** normal
    normal ___bold___ normal
normal ***bold*** normal
normal ___bold___ normal

### チェックボックス
    - [ ] タスク1
    - [x] タスク2
- [ ] タスク1
- [x] タスク2

### 数式の挿入

    ```math
    \left( \sum_{k=1}^n a_k b_k \right)^{!!2} \leq
    \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right)
    ```

```math
\left( \sum_{k=1}^n a_k b_k \right)^{!!2} \leq
\left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right)
```

### 水平線
    ***

    ___

    ---

    *    *    *
***

___

---

*    *    *

### リンク
    [Google先生](https://www.google.co.jp/)
 
[Google](https://www.google.co.jp/)

    [Google2](google)
    その他の文章
    [Google3](google)

[Google2](google)
その他の文章
[Google3](google)

### 画像表示
    ![代替テキスト](gazou.png "タイトル")
  ![代替テキスト](gazou.png "タイトル")

### 表組
    |header1|header2|header3|
    |:--|--:|:--:|
    |align left|align right|align center|
    |a|b|c|
|header1|header2|header3|
|:--|--:|:--:|
|align left|align right|align center|
|a|b|c|
SONiC: プラットフォーム今昔(1) Cavium XPliant

# はじめに

SONiCはホワイトボックススイッチで動作するソフトウェアコレクションです。NOSと言ってもいいかもしれません。特定のハードウェアにインストールして使うのですが、当然ながらハードウェアは永遠ではありません。個体だけで考えるなら壊れれば買い直せば済むのですが、そうもいかないことが多々あります。

スイッチ本体が製造中止になることもあれば、ハードウェアベンダーが撤退、あるいはASIC自体の製造中止、買収による事業の停止など、手元でハードウェアが動作していても将来ベンダーによるサポートが受けられなくなる可能性は常につきまといます。

SONiCに関して言えば、オープンソースだから最悪自前で保守すれば大丈夫、という力技もありといえばあり(のようで実質無理)なのですが、新しいハードウェアに乗り換えられるなら乗り換えたほうが将来的に安心できるのは確かです。

そんなこんなで、SONiCでサポートされている、あるいはかつてサポートされていたプラットフォームに関して、気が向く範囲わかる範囲で紹介したいと思います。順不同。

# Cavium XPliant

ぜんぶまとめると量が大変なことになりそうなので複数記事にわけます。第1回は、自分が初めてまともに触ったスイッチASICであるCavium XPliantです。

## 概要

Cavium Networksはシリコンバレーの企業で、ネットワーク処理に適したマルチコアMIPSプロセッサであるOcteonや、セキュリティプロセッサであるNitroxなどのラインナップを持ち、かつてXPliantというプログラマブルASIC製品をラインナップしていました。XPliantは100G✕32ポート、3.2Tbpsのスイッチ容量で、P4以前でパケットのパイプライン処理をプログラムできる唯一のスイッチASICでした。「OpenFlowの次」としてP4が囁かれ始めたころ、P4対応も検討されていたようです。

SONiCはこのXPliantを搭載したホワイトボックススイッチ[Accton AS7512-32X](https://www.edge-core.com/productsInfo.php?cls=1&cls2=5&cls3=68&id=129)をサポートしていました。なおXPliantのSDKソースコードはNDAベースで提供される非公開のもので、SONiCでは公開されているライブラリのビルド済みバイナリ([OpenXPS](https://github.com/XPliant/OpenXPS))を利用しています。

## 買収とEOL

しかしCavium Networksは2018年7月、Marvellに買収されました。Marvell自身が持つネットワークシリコンとの兼ね合いで、XPliantは予定されていたラインナップ拡充の新規開発が凍結され、事実上EOLとなってしまいました。

元々は2014年にXPliant Inc.をCavium Networksが買収してプログラマブルASICをラインナップに加えていたのですが、諸行無常です。

# XPliant向けSONiCはどうなったか

MarvellによるCavium買収の結果、SONiCが必要としているAPIであるSAIは更新されなくなり、新しいバージョンのSAIへの対応ができなくなりました。SONiCは新しいバージョンのSAIに対応する形で機能拡張が続けられていますので、つまり新しいバージョンのSONiCは使えないということになります。よって現在では、[JenkinsによるCI/CD](https://sonic-jenkins.westus2.cloudapp.azure.com/)の対象外となっています。

[SONiCの開発リポジトリ](https://github.com/Azure/sonic-buildimage)におけるXPliant向けSAIの最終更新は下記commitになります。

```
Author: Nadiya <Nadiya.Stetskovych@cavium.com>
Date:   Fri Aug 25 09:46:14 2017 +0300

    [cavm]Update sai revision and packet driver (#914)
    
    Signed-off-by: Nadiya Stetskovych <Nadiya.Stetskovych@cavium.com>
```

日付から考えるに、対応するSAIのバージョンは1.0と思われます。ちなみにSONiCが現在サポートしているSAIバージョンは1.6.4、公開されているSAI仕様の最新は1.7.1(ちょうど1週間前の2020年11月26日にリリース)です。

サポートされない機能の一例を紹介します。
XPliantのチップやSDKではNATがサポートされていましたが、当時のSAIやSONiCではNATのサポートがありませんでした。したがってビルド済みCavium向けSONiCを入手してもNATを使うことができません。また、当時のSONiC (201712) はVRFをサポートしていなかったため、VRFも使えません。CLIによるインクリメンタルな設定もできなかったと思います。

※12/9追記: すでにSONiCオフィシャルのJenkinsからCavium platformがjobごと削除されていて、古いイメージの入手すら不可能になっていました。イメージを所持していない場合、残念ながらXPliant搭載スイッチでSONiCを動かすことは事実上不可能でした。

# 最後に

XPliantを搭載したスイッチAccton AS7512-32Xは2018年1月でEOLとなっているため、現在では入手困難と思います。XPliantを搭載した新製品が発売されることもありません。すでに所持している場合を除き、XPliant搭載スイッチの実機に触れる機会は今後なさそうです。なお、万一入手できそうな場合、ファンが相当うるさいのでどうかお気をつけください。
Lightning Web Componentでのカスタム要素の命名についてまとめた

# 概要

Lightning Web Componentで開発していて、カスタム要素を使用する時に詰まったのでメモしておく。

## エラー内容

```powershell-interactive
No MODULE named markup://salesforceから認識されているコンポーネント found : [markup://それに近そうなコンポーネント]
```

## カスタム要素の命名
コンポーネントの命名をする前に、他のコンポーネントでコンポーネントを使用する場合には、カスタム要素の先頭に「c-」をつける必要がある（名前空間）
「samplecomponent」の場合

```html
<template>
    <c-samplecomponent></c-samplecomponet>
</template>
```

## カスタム要素の命名（大文字編）
コンポーネントの名前に大文字を含む場合ハイフンを入れる必要がある。
「sampleComponent」の場合

```html
<template>
    <c-sample-component></c-sample-componet>
</template>
```

## カスタム要素の命名（アンダーバー編）
コンポーネントの名前にアンダーバー（_）を含む場合はそのままカスタム要素に入れる。 
「sample_component」の場合

```html
<template>
    <c-sample＿component></c-sample＿componet>
</template>
```

## 例
「sample_Component」

```html
<template>
    <c-sample＿-component></c-sample＿-componet>
</template>
```
「sampleCOMPONENT」

```html
<template>
    <c-sample-c-o-m-p-o-n-e-n-t></c-samplec-sample-c-o-m-p-o-n-e-n-t>
</template>
```

## まとめ
コンポーネントの名前に大文字を連続させると面倒なことになるので小文字で完結できるような命名規則にするといい
【2020年版】Goland使いこなせてない人向けtips 5選

[Fringe81 アドベントカレンダー2020](https://qiita.com/advent-calendar/2020/fringe81)の3日目の記事です。

今年もこのテーマでGolandのリリースノートを見ながら5つほど選んでみました。
※2020.3の内容も含みます（執筆時点ではRC）。

過去の記事はこちら。
- [Goland使いこなせてない人向け tips 5選](https://qiita.com/mtoyoshi/items/b04d76939619f32a1b18)
- [続・Goland使いこなせてない人向け tips 5選](https://qiita.com/mtoyoshi/items/33064a60f8ec4ed33872)

# tips1: 日付フォーマットのコード補完
ついに来ました。
Goの日付フォーマット全く覚えられないので超助かります。
`Ctrl + Space` で呼び出し可能です。
![tips1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159/dd19d217-3513-38df-b38a-e2914899c976.gif)

# tips2: テストファイルの生成とテーブル単位の実行
テストしたい関数で、 `Command + N` を押下し、メニューを呼び出すことが出来ます。
ここでは、「Test for function」を選択。すると、Table Driven Testをするためのコードがあらかじめ記述されたテストファイルが生成されます。
テストケースとなる構造体（テーブル）を記述して、あとは実行するのみ。
なお、個別のテーブルだけを選択してテストを実行することも出来ます。
![tips3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159/d3a29768-51a8-200c-d7fa-d6851635d370.gif)

# tips3: 関数の引数を縦に改行展開
地味に嬉しいやつ。
`Option + Enter` で呼び出し可能です。
![tips33.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159/83d674bc-1308-27e2-e2bc-be0a8a2bbdf3.gif)

# tips4: 電卓機能
地味に嬉しいやつ　その２。
`Shift + Shift`とシフトキーを2回押して検索ボックスを起動し、あとは式を記述するだけ。
![tips44.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159/34aff23a-f3e4-3e21-f989-ebd12503493a.gif)

# tips5: Zenモード
コードを書くことに集中するモード。
`Shift + Shift` で起動した検索ボックスからEnter Zen Modeへ。
![スクリーンショット 2020-12-03 13.00.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159/cdb4111e-e30f-b998-edc0-876f597f9518.png)

色んなメニュー等の表示が全部消えた。ソースコードだけ。The Zen。座禅。
![スクリーンショット 2020-12-03 13.00.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159/c52db7fb-68be-1aab-9b2f-98d1efef616f.png)

Exit Zen Modeで元の画面へ。
![スクリーンショット 2020-12-03 13.02.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159/8be6099d-cc95-9f42-dd34-29d7bba21111.png)

# おまけ
人気ショートカット15選
https://blog.jetbrains.com/ja/2020/03/12/2848/

Golandの人気プラグイン紹介
https://blog.jetbrains.com/go/2020/08/13/popular-goland-plugins/
PHPでShift-JISのコードポイントを確認する

とある案件でShiftJISのコードポイントが確認したかったので、その際の処理を( ..)φメモメモ
大人の事情でPHP5.3とかいう微妙なバージョンだったけど、たぶん7系でも動くはず…

```php
$str= 'あいうえお';

// 文字列を1文字ずつ配列に分割 (-1は無制限(デフォルト値)、PREG_SPLIT_NO_EMPTYは配列前後に入る空白文字の除外)
$chArray = preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY);

foreach($chArray as $ch){
  // UTF8→SJISに変換
  $ch_SJIS = mb_convert_encoding($ch, 'SJIS-win', 'auto');
  // SJISのコードを出力
  echo bin2hex($ch_SJIS).PHP_EOL;
}
die;
```
日本語版BERTをインストールして動かしてみる

今日は以前、自分が入っていた自然言語処理案件で利用していたBERTを使ってみます。必要なライブラリなどのインストールから、日本語版事前学習済みモデルを読み込んでMasked Language Modelを試しに使ってみようかと思います。

# 必要なライブラリのインストール
## transformers
今回はHuggingFaceが作ったPyTorch版BERTを使っていきます(個人的にGoogleがGitHubで公開しているTensorflow版のものよりPyTorchのが使い慣れているためです)。

```
$ pip install transformers
```

## PyTorch(CPU用)
上記で述べた通り、今回はPyTorch版を使うので、PyTorchそのものがインストールされている必要があります。PyTorchをインストールする際はこちらのサイトを参考にインストールしてください。方法は簡単で自分の使いたい環境を選択していくと、インストールコマンドを表示してくれます。

![スクリーンショット-2020-11-25-12.53.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586627/4b45ef97-56cd-8df2-8e3c-a7c84c00814a.png)

表示されている通りにコマンドを実行します。なお、今回はGPUを使わずにCPU用のPyTorchをインストールしています(CUDA=None)。GPU用のものをmacOSで利用する場合、少々複雑な作業が必要になりますが今回は割愛させてください(おそらく大半の方のmacOSにはCUDAはないはず…)。

```
pip install torch torchvision torchaudio
```

## その他
日本語版BERTの形態素解析に使うライブラリなどをインストールしておきます。

```
pip install fugashi ipadic
```

# 日本語版事前学習済みモデルのダウンロード
こちらのGitHubで公開されているのでダウンロードし、任意のディレクトリに置いて、ファイルを展開します。今回は[BERT-base_mecab-ipadic-bpe-32k.tar.xz](https://www.nlp.ecei.tohoku.ac.jp/~m-suzuki/bert-japanese/BERT-base_mecab-ipadic-bpe-32k.tar.xz)をダウンロードしました。

# 形態素解析
まずBertJapaneseTokenizerを使ってみます。pathにダウンロードしてきた日本語版事前学習済みモデルのフォルダを指定することで利用できるはずです。形態素解析後にtokenがidに変換されるところまでを確認します。今回、tokenizeやspecial tokenの説明は極力省かせて頂きます(結構長くなってしまうので)。また別記事にて、それらについては解説しようと思います。

```python
from transformers import BertJapaneseTokenizer
path = './BERT-base_mecab-ipadic-bpe-32k'
tokenizer = BertJapaneseTokenizer.from_pretrained(path, word_tokenizer_type='mecab')
tokenizer.encode(text='東京五輪で野球を観戦する。', add_special_tokens=False)
# [391, 8111, 12, 1201, 11, 14847, 34, 8]
```

# Masked Language Model
日本語版事前学習済みモデルを読み込んで、Masked Language Modelを試してみます。まず入力値とモデルを用意します。[MASK]の部分を今回は予測させます。

```python

import torch
from transformers import BertForMaskedLM
path = './BERT-base_mecab-ipadic-bpe-32k' # 先ほどと同じ

model = BertForMaskedLM.from_pretrained(path)

input_ids = tokenizer.encode(text='東京五輪で[MASK]を観戦する。', add_special_tokens=False)
input_ids_tensor = torch.tensor([input_ids])
```

モデルに入力値を入れて、予測結果上位5件を出力させてみます。

```python

with torch.no_grad():
    outs = model(input_ids_tensor)
    predictions = outs[0][0, 3].topk(5) # 3はMASKトークンの位置(id=4)

for i, v in enumerate(predictions.indices, 1):
    index = v.item()
    token = tokenizer.convert_ids_to_tokens([index])[0]
    print(i, token)

# 1 野球
# 2 サッカー
# 3 バスケットボール
# 4 スポーツ
# 5 ラグビー
```

今回は日本語版BERTの導入して動かしてみました。次は日本語版BERTのファインチューニングしたり、使い方の説明とかできればいいかなと思っています。
investpyで世界の株価データを取得してみた

少し投資に興味が出ていた時期があって、株価データを使って、勉強がてら時系列解析モデルでも構築する遊びをしようかと考えたりしていました。 その時にデータ収集にしようとした際に使ったinvestpyを紹介します。スクレイピングなどはいくつか注意しないと大変な目に遭うので、こういうライブラリがあるのは助かります（もちろん使う時は注意が必要ですが）。

まずはライブラリのインストールから。なお、公式ドキュメントは[こちら](https://investpy.readthedocs.io/index.html)にあります。

```
pip install investpy
```

investpyを使って株価データを取得してみましょう。なお、今回は日立製作所の株価データを取得させています。

```python

import pandas as pd
import investpy

stock = '6501' # Hitachi Ltd
country = 'japan'

stock_df = investpy.get_stock_recent_data(stock=stock, country=country)
stock_df.reset_index(drop=False, inplace=True)
stock_df.head()
```

なお、上で使用しているget_stock_recent_data関数については[こちら](https://investpy.readthedocs.io/_api/stocks.html?highlight=get_stock_recent_data#investpy.stocks.get_stock_recent_data)のドキュメントに詳細が記載されています。

また、日立製作所を指定する際に4桁の数字を指定していますが、その調べ方を下記にて記載しておきます。

[investing.com](https://www.investing.com/)にアクセスする
画面上部の検索バーにてhitachiと入力する。
下記のように予測結果が表示されている中の右端にコードが記載されている

![スクリーンショット-2020-11-11-20.19.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586627/95466398-bd0b-238c-0731-464c132b3169.png)

なお、可視化した結果はこちら。

```python

from matplotlib import pyplot as plt
import matplotlib.dates as mdates
import seaborn as sns; sns.set()


fig,ax = plt.subplots(figsize=(12,4))
locator = mdates.DayLocator()
formatter = mdates.ConciseDateFormatter(locator)
ax.xaxis.set_minor_locator(locator)
ax.xaxis.set_major_formatter(formatter)

sns.lineplot(data=stock_df, x='Date', y='Close')
ax.set_title('Hitachi Ltdt')
plt.show()
```

![スクリーンショット-2020-11-11-20.22.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586627/5f9c5a9f-e8bf-c55c-4dce-6b683973496e.png)

結構簡単ですね。サンプルデータにして、勉強や研修などのデータにしてもよし。投資に活かして一攫千金狙うもよしな気がします(当たるかは保障しません笑)。
Windowsでdocker動かないと言われたのでVirtualBox上で動かしてもらった

## Windows でDockerがうごかないと言われた

開発環境がWindows10の人と開発環境を共有することにしたけど、dockerが動かないといわれたのでとりあえずVM上で動かしてもらった。ちなみに自分は林檎。

そもそもDockerはlinuxのnamespaceを使ってコンテナにリソースセットを割り当てる技術なので、Windowsそのままでは動かない。そこでHyper-VでUbuntuエミュレートしてるWSL2だが、Hyper-Vがうまく動いてくれない事がある様子。

Hyper-Vをハックしたりトラブルシュートしてる暇があったらHyper-V捨ててVirtualBox入れたほうが早い。
動かんと話にならんのでパフォーマンスどうこうって話は二の次。


## Hyper-V無効化
管理者コマンドプロンプトで
`bcdedit /set hypervisorlaunchtype off`

再起動

## VirtualBoxとVagrant

書いている人大勢いるので省略

こちら参考にさせていただいた
[Windows10でVirtualBox+Vagrant+CentOS7の仮想マシンを作る](https://qiita.com/talesleaves/items/e98c288281cc940ed92d)

[VirtualBox](https://www.virtualbox.org/)
[Vagrant](https://www.vagrantup.com/downloads.html)

## VagrantでLinux（CentOS7）にdockerインストールして起動

Vagrantfileを作成

```yaml:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "generic/centos7"
  config.vm.network "private_network", ip: "192.168.200.100"
  config.vm.provision "shell", inline: <<-shell
    sudo yum install -y docker docker-compose git
    sudo groupadd docker
    sudo gpasswd -a vagrant docker
    sudo systemctl enable docker
    sudo systemctl start docker
    sudo sed -ie 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
    sudo setenforce 0
  shell
end
```

Vagrantfileのあるディレクトリで

`vagrant up`

VMが起動したら

`vagrant ssh`

でVM上のCentOSにログインできる。

あとは普通に`docker pull`して`docker run`すればOK。
pandas.DataFrameの行を複数条件で抽出する

# きっかけ
pandasいじる時に毎回複数条件でデータをフィルタリングかける方法を忘れてしまうので記事にしてしまおうと思い、記しておきます。

データはこんな感じです。

```python
import pandas as pd

d = {'ID': [1, 2], 'Name': ['Shota', 'James'], 'Country': ['Japan', 'America']}
df = pd.DataFrame(data=d)
```

| ID | Name | Country |
| ---- | ---- | ---- |
| 1 | Shota | Japan |
| 2 | James | America |

pandasで複数条件を連結させる時は&や|を使います。各条件は括弧で括っておく。

```python
df[(df.Name=='Shota') & (df.Country=='Japan')]
df.loc[(df.Name=='Shota') & (df.Country=='Japan')] # こっちでも一緒

df[(df.Name=='Shota') | (df.Country=='Japan')]
df.loc[(df.Name=='Shota') | (df.Country=='Japan')] # こっちでも一緒
```

否定条件を作りたい時は、括弧の外側に~を置く。もちろん、括弧内の==を!=に置き換えるだけでも問題ない。

```python
df[~(df.Name=='James') & ~(df.Country=='America')]
df.loc[~(df.Name=='James') & ~(df.Country=='America')] # こっちでも一緒
```

ちなみに上で記載したコードの結果は全て下記になる。

| ID | Name | Country |
| ---- | ---- | ---- |
| 1 | Shota | Japan |
WindowsPCからSSHの利用方法

【ツール】
Terminal または コマンドプロンプトを起動します.

【手順・コマンド】
1. 「ssh -l [ユーザーID] [IPアドレス]」と入力し, [Return]キーを押します.

はじめてホストに接続する場合, 以下のような警告画面が表示されます.
2. 「yes」と入力し, [Return]キーを押します.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529011/8f65f31c-6528-1c9b-a3b2-4cfead19bf67.png)
3. 「パスワード」を入力し, [Return]キーを押します.
4. 「Welcome to XXX」と表示されたら成功です.

参考サイト
http://web.tku.ac.jp/~densan/local/ssh/mac-ssh/osx-ssh.html
GitHub Actions（TODO to issue）を使ってTODOコメントからISSUEを自動的に作ってみた

# GitHub Actionsとは
1. Github ActionsはGithubリポジトリ上でWorkflowを自動化することができるツールです。
2. WorkflowはRunnersと呼ばれるGithubで管理しているマシンのLinux、macOS、Windows環境とコンテナで実行することができる。
3. WorkflowはGithubリポジトリから発生するイベントに基づいて直接Workflowを作成することができる。
4. Githubマーケットプレイスに共有されたWorkflowを検索可能
5. 自分が直接作ったWorkflowを共有することができるコミュニティが存在する。
[GitHub Actionsサイト](https://github.co.jp/features/actions)

# Github MarketPlaceから「TODO to issue」を検索
Github MarketPlaceから「TODO to issue」を検索してもいいし以下の「TODO to issue」から直接接続する。

[GitHub MarketPlace](https://github.com/marketplace?type=actions)
[TODO to issue](https://github.com/marketplace/actions/todo-to-issue)
![スクリーンショット 2020-12-03 10.53.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108475/768b05fd-1937-195b-b7ac-c36d2187c8dd.png)

# workflowsを追加
`.github/workflows/`フォルダを作ってtodo.ymlを生成する
[GitHub Actionsのワークフロー構文についてはこちら](https://docs.github.com/ja/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions)
`on`: GithubのEvent設定　[Eventについてはこちら参考](https://docs.github.com/ja/free-pro-team@latest/actions/reference/events-that-trigger-workflows)

```.github/workflows/todo.yml
name: "TODO"
on: ["push"]
jobs:
  build:
    runs-on: "ubuntu-latest"
    steps:
      - uses: "actions/checkout@master"
      - name: "TODO to Issue"
        uses: "alstr/todo-to-issue-action@v2.3"
        id: "todo"
        with:
          TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

# テスト用ファイルを追加
TODOでコメントを記入する

```test.rb
class Test
  def hello_world
    # TODO hello_worldの実装が必要
    'hello_world'
  end
end
```

# Push
Pushするとコメント内容で自動的にIssueが作れます。
![スクリーンショット 2020-12-03 12.42.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108475/1e7188b3-d341-1180-d3f1-d888ee296ac1.png)

# Build結果
GithubのActionsタブをクリックするとActionsのBuild結果を確認できます。
![スクリーンショット 2020-12-03 12.57.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108475/10bddc0f-816f-8de7-0f5a-b3362e8e44c3.png)
Windowsにgit-secretsをインストール

# 概要
アプリケーションをAWSと連携するにあたり、万が一色々なキーがgithubに上がったら・・・と震えが止まらないのでgit-secretsを導入。

# 導入方法
[公式リポジトリ](https://github.com/awslabs/git-secrets#windows)からクローンしましょう。

```
PS: cd どこかのフォルダ
PS: git clone https://github.com/awslabs/git-secrets.git
```

クローンが終わり次第、公式の手順に従い、PowerShellスクリプトを実行します。

# エラー発生
公式に記載されているスクリプトを実行したが、エラーが発生。

```
PS: C:どこか\git-secrets> ./install.ps1
.\install.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:どこか\git-s
ecrets\install.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.
microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ .\install.ps1
+ ~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
```

原因は[こちらの記事](https://qiita.com/Targityen/items/3d2e0b5b0b7b04963750)に記載されているものと同じようです。

PowerShellの初期設定ではスクリプトが実行できないんですね。

```
PS C:どこか\git-secrets> PowerShell Get-ExecutionPolicy
Restricted
```  

今後もPowerShellスクリプトを使う機会はあると思いますので、私の場合は恒久設定をしました。


```
PS C:どこか\git-secrets> PowerShell Set-ExecutionPolicy RemoteSigned
```

# 再度実行
```
PS C:どこか\git-secrets> ./install.ps1
Checking to see if installation directory already exists...
Creating installation directory.
Copying files.
Checking if directory already exists in Path...
Adding to path.
Adding to user session.
Done.
```

これで完了です。
プルリクエストテンプレート

## 実装内容

メッセージ投稿機能を追加
以下機能詳細

- 一覧表示
    - 新規投稿画面へのリンク
    - 各メッセージの詳細、編集、削除画面へのリンク
    - 各メッセージタイトルを表示
- 新規投稿
    - タイトル入力フォーム
    - 内容入力フォーム
    - 送信ボタン
    - 一覧画面リンク
- 詳細表示
    - タイトルを表示
    - 内容を表示
- 編集
    - タイトル入力フォーム
    - 内容入力フォーム
    - 送信ボタン
- 削除
    - メッセージ削除

## 画面リスト

- 一覧表示
- 新規投稿
- 新規投稿完了
- 詳細表示
- 編集
- 編集完了
- 削除
- 削除完了

## チェックリスト

- [ ]  GitHub で Files changed を確認
- [ ]  影響し得る範囲のローカル環境での動作確認

## 備考

- ストロングパラメータを利用して、投稿内容の値を制限しています。
ACMで証明書を取得したのに、サブドメインでしか使えなかった話

# 背景
AWS Certification Manager(以下、ACM)でSSL証明書を取得してHTTPS通信を実現しようとした時に、ネイキッドドメインで証明書が使えず、1時間くらい溶けた話です。

ネイキッドドメインとは、サブドメインではないドメインを指します。ドメインそのものというイメージで問題ないかと思います。example.comを取得したとすると、ネイキッドドメインはそのままexample.comです。www.example.comなどのようなサブドメインはネイキッドドメインではありません。

# ACMで申請したドメイン
ACMでSSL証明書を申請する際、保護するサイトドメインを記載する必要があります。その際「今後色々サブドメイン切る可能性ありそうだな」と思い、自分は下記画面のように、*.example.comで申請しました。

![スクリーンショット-2020-10-21-21.49.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586627/7bff6d07-ca7f-9fb5-47ae-318271c692e7.png)

この書き方、自分はネイキッドドメインも保護されると思っていたのですが、実は保護されません。よく考えたら「*」って1文字以上の任意の文字って意味だし、そうだよなと思ったのですが、当時の自分は勘違いしてしまいました。

[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/acm-certificate.html)にも以下のような記述がありました。

> ワイルドカード証明書をリクエストする場合、アスタリスク (*) はドメイン名の左側に付ける必要があり、1 つのサブドメインレベルのみを保護できます。

*.example.comは1つのサブドメインレベルを保護するということを指していたんですね。なので、www.example.comやhoge.example.comではHTTPS通信ができるのですが、example.comでは通信ができなく、下記のような画面が表示されてしまいます。

![privacy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586627/1c808b94-784f-ab3b-9991-e6ee6a4a40b3.png)

もし既に証明書を作成してしまった場合も安心してください。実はこの作業の後で追加するCNAMEレコードで登録するものは実はドメインごとに同じです(AWSアカウントが同じであることが前提です)。

したがって、証明書を作り直したらRoute53で設定しているレコードなどは置き換えなくていいということです(ELBやIAMなどで証明書を設定している場合、新しい証明書に置き換える必要あり)。

すごくしょうもないことで躓いてしまいましたが、同じようなことで他の人が時間を無駄にしなければいいなと思い、書いてみました。
プロジェクト開発の流れと知識と成果物を理解する

プロジェクト開発の流れと知識と成果物を理解する

#プロジェクト開発の流れ
要件定義→基本設計→詳細設計→開発→単体テスト→結合試験→総合試験→ユーザー試験→リリース→運用・保守

#要件定義
クライアントの要求を要件に落とし込み、どのようにシステム化するのか決める業務
お客様から既存の業務や要求をヒヤリングして現状を把握した後に、プロジェクトの進行の流れを決めて、役割分担、成果物の作成をイメージして要件定義書を仕上げる

##要件定義書
お客様に制作するシステムの機能や性能を分かりやすく説明する書類

・システムの概要：どのようなシステムなのか
・システムの目的：システムを導入して解決することなど
・システム導入後の業務フロー：システムを導入したあと、今の業務がどのような流れになるのかを示す
・機能要件：開発されたシステムによって何ができるのか
・非機能要件：開発されるシステムの拡張性や性能、効率性やセキュリティなどのこと

#基本設計（外部設計）
顧客の要件を実現するためのシステム構成や機能を具体化する工程

##システム設計
・ハードウェア構成図
・ソフトウェア構成図
・ネットワーク構成図
・アプリケーション機能構成図
##画面設計
・画面一覧
・画面遷移図
・画面レイアウト
・画面入出力項目一覧
・画面アクション定義
##バッチ設計
・バッチ処理フロー
・バッチ処理一覧
・バッチ処理定義
##帳票設計
・帳票一覧
・帳票概要
・帳票レイアウト
・帳票出力項目一覧
・帳票編集定義
##DB設計（データモデリング）
・コンセプトモデル図
・エンティティ状態遷移図
・論理ERモデル図
・テーブル定義書
・ライフサイクル定義書
・キー項目体系定義書
決して陳腐化しないデータベース設計の超基礎
https://www.ulsystems.co.jp/topics/006
開発現場ですぐに通用する“今どきの”モデリングテクニック
https://www.ulsystems.co.jp/topics/007
##IF設計
・インターフェース仕様書
##非機能要件設計
・性能設計
・信頼性設計
・拡張性設計
・情報セキュリティ設計
・テスト方針
・移行方針
・運用保守設計

##参考
機能要件の合意形成ガイド［IPA］
https://www.ipa.go.jp/sec/softwareengineering/reports/20100331.html
システム構成図［農林水産省］
https://www.maff.go.jp/j/kanbo/joho/densi_seihu/d_densan_system/pdf/genko6.pdf
見守り情報管理システム 基本設計書［国立研究開発法人］
https://warp.da.ndl.go.jp/info:ndljp/pid/9972728/ecom-plat.jp/fbox.php?eid=16496
eコミマップ 基本設計書（国立研究開発法人）
https://warp.da.ndl.go.jp/info:ndljp/pid/11275462/ecom-plat.jp/fbox.php?eid=16945&s=o
基本設計書サンプル・書き方［若手プロマネの羅針盤］
https://pm-rasinban.com/bd-write

#詳細設計書（内部設計）
・システム設計
・画面設計
・バッチ設計
・帳票設計
・DB設計
・IF設計

##参考
詳細設計書のサンプル・書き方
https://pm-rasinban.com/dd-write
・アクティビティ図
・シーケンス図
・クラス図
・処理機能記述書（IPO）
・モジュール構造図

#開発
プログラム作成
試験シナリオ作成
試験実施

#結合試験
試験シナリオ作成
試験実施

#総合試験
試験シナリオ作成
試験実施


#ユーザー試験
試験シナリオ作成
試験実施

#リリース
リリース手順書作成
運用手順書作成

#運用・保守
障害対応
データパッチなど

#マネージメント
予算管理
進捗管理
報告業務

#その他のワード
コミュニケーションスキル
マニュアル作成
標準化
目に見える化
チームビルディング
モチベーションアップ
【チュートリアル】Azure SQL DBを構築してPythonでクエリを発行する

# きっかけ
Azure SQL DBを構築し、それに対してPythonでクエリを発行するチュートリアルをここに示す。公式ドキュメントにも記載があるのだが、複数の記事に跨っているため、本記事にてまとめておく。

# Azure SQL Databaseの構築
まず、Azure上でDB及びDBサーバーを構築する。これに関しては[公式チュートリアル](https://docs.microsoft.com/ja-jp/azure/azure-sql/database/single-database-create-quickstart?tabs=azure-portal)にてまとめられているので、そちらを参考にしてほしい。

# 必要なパッケージのインストール
Pythonでクエリを発行するために必要なパッケージのインストールを行う。なお、Homebrew と Pythonは事前にインストール済みの前提である。もしインストールしていない場合はこちらの記事を参考にすること。

## SQLCMDのインストール
SQL DBに対してCLIで実行できるようにSQLCMDをインストールします。

```
$ brew update
$ brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
$ HOMEBREW_NO_ENV_FILTERING=1 ACCEPT_EULA=Y brew install msodbcsql17 mssql-tools
```

## pyodbcのインストール
Python用のODBC ドライバーであるpyodbcをインストールします。

```
$ pip install pyodbc
```

# 接続情報の確認
DB接続に必要なサーバー名を取得します。

- [Azure portal](https://portal.azure.com/)のホーム画面からSQL データベースを選択する(もしくはportal上で検索する)
- 対象のDBを選択し、概要ページを表示する
- サーバー名をコピーする(画像例を載せているが、値は作成者ごとに異なる)

![スクリーンショット-2020-10-16-11.38.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586627/49977d24-4d87-b214-6b00-84add262bcba.png)

- 下記スクリプトのファイルを作成する。

```python:sqltest.py

import pyodbc
server = '<server>.database.windows.net'
database = '<database>'
username = '<username>'
password = '<password>'   
driver= '{ODBC Driver 17 for SQL Server}'

with pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password) as conn:
    with conn.cursor() as cursor:
        cursor.execute("SELECT TOP 20 pc.Name as CategoryName, p.name as ProductName FROM [SalesLT].[ProductCategory] pc JOIN [SalesLT].[Product] p ON pc.productcategoryid = p.productcategoryid")
        row = cursor.fetchone()
        while row:
            print (str(row[0]) + " " + str(row[1]))
            row = cursor.fetchone()
```

- <>で囲まれた部分は適切な値に書き換える。なお、Azure SQL Databaseの構築チュートリアルを行なってDBを作成していた場合は下記のようになる
    - <server>: 先ほど確認したサーバー名(mysqlserver108.database.windows.net)
    - <database>: mySampleDatabase
    - <username>: azureuser
    - <password>: 各自設定したパスワード
- スクリプトを実行する

# 参考
- [クイック スタート:Python を使用して Azure SQL Database または Azure SQL Managed Instance 内のデータベースに対してクエリを実行する](https://docs.microsoft.com/ja-jp/azure/azure-sql/database/connect-query-python?tabs=macos)
- [Create Python apps using SQL Server on macOS](https://www.microsoft.com/en-us/sql-server/developer-get-started/python/mac/?rtc=1)
- Python以外での接続方法は[こちら](https://docs.microsoft.com/ja-jp/azure/azure-sql/database/connect-query-content-reference-guide)にまとめられている
[Ruby] sliceメソッド

#戯言
今日は朝から掃除洗濯、朝ごはんを作り、布団を干し・・・・

とりあえずプログラミングの学習ができるまとまった時間の確保ができるので今日1日外に出たり出なかったり。

コロナ対策・デフレ脱却、がんばれ政府

ということで・・・

#本題　sliceメソッドについて

今日も以前解いた問題に２回目の挑戦。
sliceメソッドを使った問題でした。


※出力例：
extra_end('Hello') → 'lololo'
extra_end('shinzo') → 'zozozo'
extra_end('Hi') → 'HiHiHi'

このような結果にしなさいとのお達し。
完全に忘れてました。次のように回答。

```ruby
def extra_end(str)
  wordCount = str.length　
  puts str.slice(wordCount - 2, 2) * 3
end

extra_end('Hello')
extra_end('ab')
extra_end('Hi')
```

ちょっと解説すると、
任意の文字列を文字数を出す
　↓
１つ目の引数で「出した文字数−２」で文字列の後ろから２番目の要素を基準点とする　　
　↓
2つ目の引数で基準点から２つ要素を取り出す
　↓
で、出した要素を３回繰り返せということなので、単純に×３


回答し解説を見ると、sliceの処理、超単純に「−２」だけで後ろから２番目の要素を基準にできちゃうというオチ。
そういうわけで

```ruby
def extra_end(str)
  puts str.slice(- 2, 2) * 3
end
```

これだけで同じ結果が出ます・・・。

参考に
[Array#slice　公式リファレンス](https://docs.ruby-lang.org/ja/latest/method/Array/i/slice.html)

そういうわけで、いろんな方法で同じ結果を出すことができるところも面白いと思いますが、できるだけシンプルを意識し頑張ります。
【初GitHub】とりあえずGitHubにpushしたいんだ！！！

#はじめに
この記事はGitHubに新しくpushをする際にその度に記事を探して作業する
自分のために、また初めてGitHubを使うけどシンプルにやり方が知りたい！
という方がいたら参考になれば・・・と思い書いています。
初学者のため、間違い等あればご教授ください。

では行ってみよう〜〜！


##1.簡単に流れを紹介
※GitHubのアカウント登録や環境構築は省きます。
　最後に参考にした記事を貼りますので参考までに。。

　　　　リモートリポジトリを作る
　　　　　　　　　↓
　　　　ローカルリポジトリを作る
　　　　　　　　　↓
　　　　　　　push！！！！
　
ざっくりすぎるほど簡潔に書いていますがこんな感じです。



##2.GitHubにリモートリポジトリを作る
![スクリーンショット 2020-12-02 20.53.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/793536/575061d6-37de-ff11-1a21-8e534bcd1a81.png)

まず、GitHubにリモートリポジトリを作ります。
リモートリポジトリとは一言でいうと、「他の人からも見られる」リポジトリです。
右上の「New」ボタンを押すと以下のページに飛びます。

![スクリーンショット 2020-12-03 12.06.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/793536/f4dede4a-97ae-e622-14d7-40a49543b4e8.png)

①Repository name　を入力
②Publicを選択
③Create repository

これでリモートリポジトリが作成できました！
※リポジトリの名前は同じプロダクトがない方がよく、単語を区切るなら「-(ハイフン）」を用いるようです。


## 3.ローカル環境にリポジトリを作る→push

![スクリーンショット 2020-12-02 20.54.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/793536/23d834b1-61ef-eba1-16a2-5868a66d625c.png)

基本的に公式に書いてある通りに進めるのが一番わかりやすかったです。
細かい部分で分からないことがあれば都度Qiitaの記事を探していました。

①まずディレクトリに移動します
`cd 'ディレクトリ名'`
②READMEの作成
③git init
④READMEをステージング（コミット前の状態にしておく）
⑤ステージングしてあるファイルをローカルリポジトリにコミット
⑥mainブランチの作成
⑦リモートリポジトリへ追加
　これ以降、origin = 指定したGitGubリポジトリのこと
⑧ローカルリポジトリのcommitを反映、push完了！


##4.実際に実行したコード


```
name@MacBook-Pro programing % cd portfolio　//ディレクトリへ移動

//README作成
name@MacBook-Pro portfolio % echo "# portfolio" >> README.md
//ディレクトリにリポジトリを作成
name@MacBook-Pro portfolio % git init
Initialized empty Git repository in /Users/name/programing/portfolio/.git/
//READMEステージング
name@MacBook-Pro portfolio % git add README.md
//ステージングしているファイルをcommit
name@MacBook-Pro portfolio % git commit -m "first commit"
[master (root-commit) 011dabb] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
//mainブランチの作成
name@MacBook-Pro portfolio % git branch -M main
//リモートリポジトリに追加
name@MacBook-Pro portfolio % git remote add origin https://github.com/harukaty04/portfolio.git
//ローカルリポジトリのコミットを反映
name@MacBook-Pro portfolio % git push -u origin main
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 225 bytes | 225.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/harukaty04/portfolio.git
 * [new branch]      main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.
name@MacBook-Pro portfolio % 

```

## まとめ

まだまだ使いこなせてませんが、今のところやっている手順を書いてみました！
最初にも書きましたが「このやり方の方がいいよ！」「ここの解釈がちょっと違ってるよ！」など、あればぜひ教えてください。

以下、私がやってしまった間違いです。
・実際にpushしたいディレクトリの上の階層で`git init`していまい、エラーに
・READMEを予めGitHubのページで作成しており、公式の順序で進めても進まない。。
・公式以外の記事を参考にして新しいブランチ名をmasterにしており、
　いざpushしようとした時に` git push -u origin main `できない
【チュートリアル】Azure Linux仮想マシンの構築


実業務において、Azure環境で仮想マシン(AWSでいうEC2)を構築することがあったので、構築方法を備忘録程度に記しておく。

# きっかけ
些細なことであるが、[公式チュートリアル](https://docs.microsoft.com/ja-jp/learn/modules/create-windows-virtual-machine-in-azure/)が情報量(？)が多く、個人的には少々分かりづらく感じたので、手順のみをここに記していこうと思った。

# AzureにSign Up
Azureを利用するのが初めてなのでアカウント作成から行う。
[こちら](https://azure.microsoft.com/ja-jp/free/)のサイトにアクセスして、「無料で始める」をクリックする。
その後、マイクロソフトアカウントにサインイン(もしくはアカウント作成)及びクレカや住所などの情報を入力していくと、アカウントが作成できる。

![スクリーンショット-2020-10-15-15.58.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586627/2b788f4f-ed94-2454-ef49-d45f7cfca606.png)

作成してAzure portal(AWSでいうマネジメントコンソール)にログインすると、下記のような画面に辿り着く。

![スクリーンショット-2020-10-15-15.58.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586627/b80f2fad-7e3e-8483-86eb-9621cc7433b3.png)

# Linux仮想マシンの作成
- Azure portalにログインした状態でナビゲーションペインを開く(左上をクリック)する。

![スクリーンショット-2020-10-15-16.01.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586627/502a181a-f334-947c-2b8f-b7fd61d1ad88.png)

- 「リソースの作成」をクリックする
- Azure Marketplaceで「Compute」を選択し、すべて表示をクリックする

![スクリーンショット-2020-10-15-16.32.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586627/15a86ebe-c221-61d1-ca2f-c7c90e0e51f9.png)

- 今回はRed Hat Enterprise Linux 7.6を使用する。検索するか、画面上に表示されていれば、それをクリックし、作成ボタンを押下する。

![スクリーンショット-2020-10-15-16.38.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586627/fb0514e4-6135-adf3-8b3c-fe0aa6308bb8.png)

- 仮想マシンの作成画面にて下記項目に任意の値を入力もしくは選択する(括弧内は今回の入力値)。
    - 仮想マシン名(test-server)
    - 地域((Asia Pacific)西日本)
    - サイズ(Standard_D2_v3-2vcpu数、8GiBメモリ)
    - ユーザ名(azureuser)

- 確認及び作成をクリックする。
- 作成ボタンを押下すると、新しいキーペア生成の小画面が表示される。「秘密キーのダウンロードとリソースの作成」を押下する。
- 秘密キーはLinuxサーバーにssh接続するのに必須なので、なくさないよう管理すること

# ssh接続でLinuxサーバーにログオンする
- Azure portalホーム画面にてVirtual Machines(AWSでいうEC2)を選択する。画面上に表示されていない場合は検索する。

![スクリーンショット-2020-10-15-16.54.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586627/75cf3e8d-8df8-119c-0a09-ded370ea244b.png)

- 先ほど作成したサーバー名をクリックし、詳細画面を表示する
- 「パブリックIPアドレス」に記載されている値を確認する
- (macOSであれば)ターミナルを起動し、先ほどダウンロードしてきた秘密キー(hoge.pemファイル)に対して下記コマンドを実行し、権限の制御を行う(セキュリティ上問題なくとも、この設定でなければssh接続はできない)

```
sudo chmod 400 [秘密キー] # [秘密キー]にはファイル名を入れる
```

- その後、下記コマンドを入力するとssh接続ができる
なお、注意点として下記2点を挙げておく。
    - [ユーザー名]には仮想マシン作成時に設定したユーザ名
    - [パブリックIPアドレス]には先ほど確認したIPアドレス

# その他注意事項
- サーバの起動や停止などはサーバの詳細画面などで可能。利用しない時間は停止、利用予定のないサーバは削除を勧める。

![スクリーンショット-2020-10-15-17.05.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586627/aeb6d215-ba0f-c7df-6278-7bac616eb3d3.png)

- 仮想マシン停止時に「パブリック IP アドレス ‘xx.xx.xx.xx’ はこの VM が停止すると失われます」、「パブリックIPアドレスを予約しますか？」と確認される。パブリックIPアドレスを固定したい場合、チェックを入れること。
LaTexで.epsが表示されないときの対処法

**TexStudio**や**Visual Studio**で**.texファイル**をコンパイルする時、
**『.epsファイルが表示されない！』**なんて経験はありませんか？
私は、この問題ですごくイラついたので、解決策を共有します！


##前提条件

+ **TexStudio**がインストールされている
+ **Texインストーラ**がインストールされている

##環境
私の場合、TeXをインストールしたのち，TeXStudioをインストール．TeXStudioの起動後，**オプション->TeXstudioの設定**と進み

**1. コマンドのLaTexを以下に変更**

```LaTex:LaTex
"C:/w32tex\bin/platex.exe" -src -interaction=nonstopmode %.tex
```

**2. ビルドのビルド＆表示を以下に変更**

```LaTex:LaTex
DVI->PDFチェーン
```

上記の2つは設定済みです。

##解決策１

**オプション->TeXstudioの設定**と進み**ビルド**の**ビルド&表示**を以下のように変更する。

```LaTex:LaTex
DVI->PS->PDFチェーン
```

に変更する。
そもそも、.epsがうまく画面に表示されず、**画面が真っ白**になってしまう原因は、**『pdfファイルにするとepsファイルの図の位置が下に大きくずれてしまい表示されない』**ことがあげられるらしく、一度、.psファイルに変換してあげることで解決するかもしれないらしいです！

###補足）

**Visual Studio Code**でLaTex環境を作っている方は以下の方法を**ターミナル**でやってみてください！
※**『これから、環境構築をしてみたい！』**という方は、以下の記事を参考にしてみてください。**

**１．[VSCode で最高の LaTeX 環境を作る](https://qiita.com/Gandats/items/d7718f12d71e688f3573)**
**２．[Visual Studio CodeでTeXのコンパイルをできるようにする方法](https://qiita.com/SUZUKI_Masaya/items/7fb5509006163e7e671f)**

**※想定環境**
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3632303936382f66313633336438362d393131622d393837392d616661392d3466333334336262633538362e6a706567.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620968/8ef6b055-5cd7-ac94-ea87-09071f900185.png)


**■ 通常のコンパイル**

**1. .dvi,.log,.auxファイルを作成**

```LaTex:LaTex
latex 201203_xxxx_進捗報告.tex
```

**2. .pdfファイルを作成**

```LaTex:LaTex
 dvipdfmx 201203_xxxx_進捗報告.dvi
```

※これで、**.epsファイル**が表示されている人は問題ないです笑

**■ 改善したコンパイル**

**1. .dvi,.log,.auxファイルを作成**

```LaTex:LaTex
latex 201203_xxxx_進捗報告.tex
```

**2. .psファイルを作成**

```LaTex:LaTex
dvips -o 201203_xxxx_進捗報告.ps 201203_xxxx_進捗報告.dvi 
```

**3. .pdfファイルを作成**

```LaTex:LaTex
 ps2pdf 201203_xxxx_進捗報告.ps 201203_xxxx_進捗報告.pdf
```

##解決策２

こちらはすごく、潔い方法です！
それは、**.epsファイルで表示することを諦め**、**変換ソフト**を使って**表示したい.epsファイル**を**.pdfに変換**したうえで、**.pdfの状態**で**.texにてコンパイルする方法**です！

**■ 使用ソフト**
**[Convertio](https://convertio.co/ja/download/228c5f77ecd04b1805af89607fbaf62209f650/)**

単純ですが、**一番楽に解決できる**ので、お勧めです！

##豆知識
**[TeX と LaTeX の違い](https://blog.wtsnjp.com/2016/12/19/tex-and-latex/)**

##その他の参考サイトまとめ

**１． [TEXのepsファイルの図がPDF出力すると表示されない](http://astmurumaru.blog90.fc2.com/blog-entry-380.html)**

**２． [「TeXで作成したpdfファイルでepsファイルの図がちゃんと表示されない」ことに関する対策方法（まとめ）](http://astmurumaru.blog90.fc2.com/blog-entry-506.html)** 

**３．[TeXでEPSファイルがPDF出力できない現象について](http://ajdkbsuvi.blogspot.com/2011/02/texepspdf2.html)**

**４． [dvipdfmx](https://x76789.hatenadiary.org/entry/20111208/1323331078)**
Pickleファイルを簡単ダンプ

PickleというのはPython標準のシリアライズ形式で、Pythonオブジェクトをプロセス間通信でやり取りしたり、時間がかかる分析結果のスナップショットに使ったりします。

* 参考: [Python: オブジェクトを漬物 (Pickle) にする](https://blog.amedama.jp/entry/2015/12/05/132520)

Pickleファイルの中身を見るためのコードはimport込みでも3行ぐらいなので簡単なのですが、それでも度々書くのは面倒なので簡単な方法が欲しいです。

つまり、こうです。

```sh
$ python -m pickle <filename>
```

非標準クラスがPickleされている場合は`ModuleNotFoundError`エラーになるので、エラーメッセージから必要なモジュールを推測してインストールしてください。
AWS -> Azure を触った時の所感

AWSを数年やってきて、状況の変化でAzureを腰据えてやる、ということになり
Azure使い始めての気になったところなどのメモ。(2020/12時点）
間違って認識していることもあると思われる。

## 所感
#### NSGがわかりにくい
NetworkACL + SecurityGroup ということで理解した。
コンソールからNSGのルール作るときにデフォルトで名前に「Port_8080」が入っているのがイライラする。

デフォルトで VNet内通信とかLBからの通信とか設定するのもヤメテ。しかも消せない。
[Azure Network Security Group(NSG)についておさらい](https://qiita.com/yotan/items/d5e3e8dcc94a2099fa05)
>既定のルールは「インターネットからのアクセスには厳しく、しかし仮想ネットワーク内の通信はゆるゆる。おまけにインターネットへのアクセスはなんでもおｋ」


#### コンソールで適当にデフォルトのままVM作るとssh portがインターネットに全公開になる
ありえんやろ。。。セーフティに倒せ。。。

#### VM自動シャットダウン設定はAWS EC2には組み込みでは無かった気がする
結構便利かも。設定してたの忘れてて作業中に落ちる。

#### NAT Gatewayができたのが最近ぽい
[Azure仮想ネットワークの「NATゲートウェイ」が正式版に](https://www.atmarkit.co.jp/ait/articles/2003/23/news012.html)
それまでどうしてたん？IaaSか？という素朴な疑問が生じたものです。

#### Powershell使いたくない
Azure CLI は結構使える。でもPowershellを使わないといけない場面もある模様。

#### 専用サブネットが必要なリソースがある
サブネットにそのリソースしか存在できない、他のリソースがあると作成できない。
・API Management
・Application Gateway（v1、v2なら同一サブネットOK）
・Azure Cache for Redis
など
API GatewayやALBから考えるとかなり戸惑う仕様

#### Azure for MySQLとかPostgreSQLとか
PaaSDBは作成時に所属VNet(VPC)とか選択せず、VNet外リソースとして作成される。
これもAWS触ってから来ると違和感あると思う。

ファイアウォール規則などを使用してアクセス範囲を絞っていく。

#### Gateway Subnet ???
VPN Gatewayとかを置くサブネットは「GatewaySubnet」という名前で作らなければならない！
じゃないとゲートウェイリソース作れない！
名前が意味を持つサブネットなんて考えもつかなくて最初どっかの設計書でそれを見た時は
なんだこの名前センス以前の問題だろ　と思った。しかしそれがサービス仕様とは想像の斜め上だった。
名前は、好きに決めさせてくれないか。。。
そしてこのサブネットには、NSGを設定できない。
[ゲートウェイ サブネットについて](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-create-site-to-site-rm-powershell#about-the-gateway-subnet)

#### AzureVM Portal上から停止しないと課金止まらない
OS上でshutdownしても、「stopped」というステータスになるだけで「deallocated(割り当て解除)」というステータスにならない限り課金は止まらない。
Portal上で停止することは電源プラグをブチっと抜くことと同意だよと私は教わって育ってきたのだが。

## 参照資料
[AWS/Azure/GCPサービス比較](https://qiita.com/hayao_k/items/906ac1fba9e239e08ae8)
比較表ありがたい。
Raspberry Piとbalena-soundでBluetoothオーディオレシーバを手に入れる･･･ときに詰まったら読むメモ

### 目的

これはRaspberry Pi単体をBluetoothオーディオレシーバにする需要がある人向けの記事です｡

とてもわかりやすく､入門に最適な資料として[balenaOSを用いて簡単にラズパイBluetoothレシーバを構築する](https://qiita.com/ksmndevelop/items/39bbb650ef21798f89fb) と [公式ドキュメント](https://sound.balenalabs.io/docs/) があるため､ざっと目を通していただければと思います｡
これらを読めば不足はほぼないと思いますが､ちょこちょこしたメモがあるため備忘録として公開することにしました｡

### Wi-Fiの設定
[公式のドキュメント](https://www.balena.io/docs/reference/OS/network/2.x/) を参考にすれば困ることは少ないですが､
SSIDが表示されている接続先の場合､ `/system-connections/` 内の設定ファイルを

```
[wifi]
hidden=false
```
のように変更する必要があります｡
Wi-Fiに接続できていない場合､電源ランプが4回点滅するためわかりやすい｡

### DAC hatの設定

[ここ](https://sound.balenalabs.io/docs/audio-interfaces/#dac-boards) を参考に環境変数を追加すること
Web画面から保存すると再起動して各種コンテナのセットアップが開始されるので､その間待ちます🍵

### balena CLIなしで､自前のアプリケーションをデプロイする
balena-soundでデプロイされる実体は https://github.com/balenalabs/balena-sound で開発が進められています｡
multiroomなどは個人的に利用しないし､再起動の度無効化するのが面倒だと思ったので[Serviceを削ったもの](https://github.com/ni-n-ja/balena-sound)を用意しました｡

なおGit Bashを利用している場合､Windowsでもbalena CLIをインストールせずアプリケーションをデプロイできます｡
まずはいつものSSH設定ということで､ https://dashboard.balena-cloud.com/preferences/sshkeys で公開鍵を追加したのち `~/.ssh/config`に設定を加えます｡

```
Host *.balena-cloud.com
  User /* balena cloudのユーザー名 */
  Hostname git.balena-cloud.com
  IdentityFile /* SSH 秘密鍵ファイル */
```

cloneしたプロジェクトにpush先↓を追加し､
<img width="600px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925944/785f902f-9cb7-98e0-607a-3b67825cb788.png">
これに向けて `git push balena` することで手元のマシンにデプロイされます｡
やったね🎉