OmniAICreator/Qiita-1.07M huggingface dataset:
micro:bit GarageBandから音を出してみる

* micro:bitでMIDI接続できないかと思って調べていたら以下の動画を見つけたので試してみました
  * [Tutorial Bluetooth MIDI - chibi:bit (BBC micro:bit compatible) and GarageBand iOS](https://www.youtube.com/watch?v=RA8Y_zW4jn0)
* 動画を公開してくださり、ありがとうございます :smile:
* つまづいたり調べた箇所のメモとなります

# 準備

* micro:bit
* iPad [^1]
  * アプリ
      * GarageBand
      * micro:bit



# やり方

### 1. micro:bitとiPadをペアリングする

1. [iOSでmicro:bitを使用する - Bluetooth経由の接続](https://microbit.org/ja/guide/ble-ios/) よりペアリング用のHEXファイルをmicro:bitに書き込む
1. iPadのmicro:bitアプリを立ち上げる
1. `Connection`を選択し画面の指示に従ってペアリングする
  * ペアリング済みの場合は`Choose micro:bit`からお使いのmicro:bitが登録されていることを確認する

### 2. MakeCodeでプログラムを作ってmicro:bitに書き込む

* 必要なブロックは`高度なブロック`→`拡張機能`から”midi”と検索して`bluetooth-midi`を選択する
<img width="642" alt="スクリーンショット 2019-06-13 21.59.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268273/73d19338-5e99-e7cd-d5be-2f0b6c35b30d.png">

### 3. iPadの設定を確認する

* iPadの`設定` → `Bluetooth`から`BBC micro:bit [xxxxx]`[^2]をタップして`接続済み`にする 
* この時点でmicro:bitのLEDに`にこちゃんマーク`が出てきます

### 4. GarageBandとmicro:bitを接続する

* GarageBandを開いて`TRACKS` → `KEYBOARD`を選択
* 画面右上の`設定(スパナアイコン)` → `詳細` → `Bluetooth MIDIデバイス`を選択
* `BBC micro:bit`をタップして`接続済み`にする

### 5. 音を出す

* micro:bitのAボタンを押すとGarageBandから音が出ます  :musical_note:


# 参考
* [iOSでmicro:bitを使用する - Bluetooth経由の接続](https://microbit.org/ja/guide/ble-ios/)

* [bluetooth-midi](https://makecode.microbit.org/pkg/microsoft/pxt-bluetooth-midi)

* [midi](https://makecode.microbit.org/pkg/microsoft/pxt-midi)

[^1]: iOSなら同じようにできると思います(iPad以外は未検証)
[^2]: この部分の`xxxxx`は「micro:bitとiPadを接続する」でmicro:bitのLEDに表示された模様で分かるようです。[Can I rename my micro:bit?](https://support.microbit.org/support/solutions/articles/19000067679-can-i-rename-my-micro-bit-)
Python手遊び(RDKitで記述子を1個単位で計算)

#この記事、何?
珍しく平日に連投・・・
ちょっとだけ。
この前の記事で33番目の項目の値がおかしいぞい、と。
じゃ、それ何?それだけ狙って計算してみた。

#参考

##この前の記事
■Python手遊び(機械学習・外部検証)
https://qiita.com/siinai/items/0a5b89543c9a7bbd243b

##ずっと前に写経してつぎはぎした記事
■化合物の記述子：RDKitを計算してみた
https://qiita.com/siinai/items/1803142350df41185e73


#出来上がり

いや、短いので。

```python

#62-01.py
from rdkit import Chem
from rdkit.Chem import Descriptors

#------------------------------------------------------
# 関数群
#------------------------------------------------------

#化合物の取得
def get_mols():
    #return Chem.SDMolSupplier('benzens.sdf')
    return Chem.SDMolSupplier('263-276.sdf')

#指定の記述子計算器を取得
def get_calc(id):
    calc_tuple = Descriptors._descList[id]
    return calc_tuple[0], calc_tuple[1]

#------------------------------------------------------
# 本体
#------------------------------------------------------

#化合物の取得
mols = get_mols()

#指定の記述子計算器を取得
calc_name, calc = get_calc(32)

#出力
print(calc_name)
for mol in mols:
    print('-------------------------------------')
    print(mol.GetProp('_Name'))
    print(calc(mol))



```

#出力

##1回目
あたしのような一般人でも知っているような有名な化合物での出力。

```
-------------------------------------
BenzylAlcohol
91.36757727918736
-------------------------------------
anisole
91.36757727918736
-------------------------------------
benzaldehyde
91.36757727918736
-------------------------------------
BenzoicAcid
129.22533870330605
-------------------------------------
acetophenone
129.22533870330605

```
・・・あれっ?普通。異常に大きな数ないよね?

##2回目
というわけで、前回のSDFからおっきな値を出力した化合物の近くを相手にしてみた。

```
-------------------------------------
267
1.4688129194831394e+16
-------------------------------------
268
4297506374337901.0
-------------------------------------
269
2.1925071127333692e+33
-------------------------------------
270
7.860980495973588e+39

```

来た。なんだよ、e+33とかe+39って。。。京より大きいよね。っていうか、京の二乗くらい?
そりゃ、そんなの混ぜて線形回帰やPLSやったら引っ張られるでしょ。



#感想
まあ・・・こなれてきた。
ようやく、やりたいことを直接手を動かして何とかできるようになってきた・・・ような気がしてきた。。。
いや、まだまだですよ。
次はfingerprintとか使ってタニモト係数使って類似度触ってみたい。
【VisualStudio 2019 for Mac】ソースコントロール関係

# Mac版のVisualStudioではWindows版と構成が違いメニューとメインウインドウで操作する模様

<img width="1510" alt="スクリーンショット 2019-06-13 22.52.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423985/06447853-4ea9-2e20-9a65-b78216a76b03.png">


#メモついでにMac版のGitのGUIクライアント Gitup
Gitup [リンク](https://gitup.co/) 


<img width="1005" alt="2スクリーンショット 2019-06-13 22.53.56.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423985/d7d13e60-14c9-63d7-1599-1e522975d250.jpeg">
Chromeのアドレスバーの候補を上下移動するショートカット

## Chromeのアドレスバーの候補を上下移動するショートカット
Chromeのアドレスバーに文字を入力をすると候補が表示されます。
そこで
ショートカットキー control + N で候補を下に移動
ショートカットキー control + P で候補を上に移動することができます。
指の配置を変えることなく選択できるのでおすすめです。マウスやキーボードの矢印キーを使わないため速度が上がります。

この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
R Studio CloudにR commander (Rcmdr)をインストールする手順

# RStsudio Cloudの立ち上げ
### RStudio Cloudにサインイン・ログイン

Rの環境をローカルに作るのが面倒くさいことありますよね。
そんなときはCloud9のR版とも言うべき「Rstudio Cloud」を使いましょう。
https://rstudio.cloud/

RStudio CloudはRの統合開発環境です。詳しくはこちらの記事を御覧ください。
https://qiita.com/hujuu/items/ddd66ae8e6f3f989f2c0

### 右上の"New Project"からPJ構築
![screenshot-rstudio.cloud-2019.06.13-22-52-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95511/9c86bd04-bcd9-8317-2d0d-3f05fff0af4a.png)

画像だとすでに"Untitled Project"となっていますが、初めてではなにもないので、
右上の「New Project」から新しいプロジェクトを立ち上げましょう。
このとき、数分ほどかかりますので焦らず待ちましょう。

## Rcmdrのインストール
### メニューの"Tools"から"Install Package"
RcmdrはR Commanderというパッケージです。
Rはそのままでは「プログラミング」という感じなので、エクセルなどGUIに慣れたヒトにとっては、
このパッケージを入れることで少しだけRと友だちになりやすくなります。
![screenshot-rstudio.cloud-2019.06.13-22-27-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95511/4e270c47-8ef6-13af-e59f-6860e22aa3f7.png)

### "Rcmdr"と入力してインストール
次に検索窓に"Rcmdr"と入力するとすぐに出てくるはずです。
これでRcmderパッケージを選択して、ウィンドウ右下の"Install"をクリックします。

![screenshot-rstudio.cloud-2019.06.13-22-27-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95511/3b67042f-8963-96a7-587b-d7ff3102c018.png)

数分〜数十分待ちましょう。
Consoleに以下のようなインストール終了のお知らせが出てきたら完了です。

```R:
* installing *binary* package 'Rcmdr' ... 
* DONE (Rcmdr) 

The downloaded source packages are in 
'/tmp/RtmpuXue9p/downloaded_packages'
>
```
MKDocsでUMLを表示する方法

# MkDocsでUMLを表示する方法について

MKDocsはPython製のドキュメントサイトジェネレータです。
簡単に構築できる上に、マークダウンで書けるので、
ちょっとしたドキュメントの静的サイトを構築するのに便利です。

そうなると、Mermaid.jsやPlantUMLでUMLを表示したく
なる場面も多いと思います。

MKDocsなら、ちょっと設定を行うだけで
表示が可能となります。

MKDocsの構築は省略しますが、
以下のパッケージをPyPIからインストールしておく必要があります

```bash
pip install pymdown-extensions 
```


## Mermaid.jsの設定方法

mkdocs.ymlに以下の設定を行うだけです。

```yml
markdown_extensions:
  - pymdownx.superfences:
      custom_fences:
        - name: mermaid
          class: mermaid
          format: !!python/name:pymdownx.superfences.fence_div_format

extra_css:
  - https://unpkg.com/mermaid@8.0.0/dist/mermaid.css

extra_javascript:
  - https://unpkg.com/mermaid@8.0.0/dist/mermaid.min.js
```
superfencesで、コードブロックの名前がmermaidとなっているものを
class名をmermaidと設定した<div>にすることで
描画を実現できるようです。  
  
  
描画した結果は以下の通りです。  

<img width="739" alt="スクリーンショット 2019-06-13 22.40.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147851/6a711ba8-7f8c-4b0a-29b0-25edf9aec1b3.png">


## PlantUMLの設定方法

1. PyPIよりplantuml-markdownをインストールする

```bash
pip install plantuml-markdown
```
2. mkdocs.ymlに以下の設定をする

```yml
markdown_extensions:
  - plantuml_markdown:
      server: http://www.plantuml.com/plantuml
```

plantuml-markdownは描画を行うためのサーバを
設定する必要があります。


<img width="738" alt="スクリーンショット 2019-06-13 22.48.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147851/3136b8fe-5949-dd97-19e9-b9c376405cd4.png">


尚、サーバはローカルにも構築することができ、
dockerコマンドで簡単に作成可能です。

[PlantUML Server](https://hub.docker.com/r/plantuml/plantuml-server/)

上記のように、設定を行うだけでUMLを表示させることができます。

MKDocsはテンプレートも多く、大変使いやすいドキュメントサイトジェネレータですので
ぜひ、使ってみてください。

<参考サイト>
https://github.com/squidfunk/mkdocs-material/issues/693
https://facelessuser.github.io/pymdown-extensions/extensions/superfences/
https://github.com/mikitex70/plantuml-markdown
git configコマンド以外でgit clone時にproxyを通さないようにする方法

# 背景

自作したアプリを社内gitサーバに配置して展開することがあった。
git実行時にproxyを経由するためには`git config --global http.proxy <proxy_url>`を実行すれば良い（[gitでプロキシを設定 - Qiita](https://qiita.com/hidetzu/items/c2db95613ba594a2ef25)）が、どんな宛先に対してもproxyを通そうとするため、今回のケースのように社内にあるgitサーバへアクセスする場合には困ることになる。
バージョンが新しめのgitなら環境変数no_proxyを使う（[Gitがいつの間にかno_proxyに対応してた - Qiita](https://qiita.com/tenten0213/items/65192c41d188032ebe25)）、もしくは宛先ごとにproxyの設定を変更する([gitのproxy設定をリポジトリごとに変える方法 - Qiita](https://qiita.com/emudome/items/2e7942104d66d59fd577))ことでproxyを経由しないことはできるが、両方とも他者の環境・設定を編集することになるため好ましくない。

そこで **コマンドライン引数によってproxyを使わないようにする** 方法を調べた。

# 方法

`git clone`には[--configまたは-cオプションが存在する](https://git-scm.com/docs/git-clone#Documentation/git-clone.txt---configltkeygtltvaluegt)。
このオプションを使いhttp.proxyやhttps.proxyに空白を与え`git clone`を実行することでproxyを使わないように仕向けることができるようだ。

```
git clone -c http.proxy="" <repository>
```

# 感想

上記方法は、他の方の環境に手を加える必要がない点、また上記コマンドの場合コピペしてもらうだけで実現できる点が好ましいと思った。
（※ 別の設定の影響等で動作しただけかもしれないので、同じように実行して動かない方がいればコメントください。）
user_idとcontentsの絡め方について（備忘録）

  qiita初投稿です。多分書き方間違えているのですが、徐々に覚えていこう位の気持ちでアウトプットします汗
最近プログラミングスクールに通い始めたばかりなので、割と（多分こうだろう！）ということが多いです。
経験豊富な諸先輩方よりご指導頂ければ幸いです。

```routes.rb
resources :user, only: :show do
  resources :blogs, only: [:new, :create, :update, :edit, :destroy, :show]
end
```

・userでblogをネスト
・そうするとurlが "/user/:user_id/blogs/:id" みたいになる。
・user_idが入る隙間が出来る（？）


```blogs_controller.rb
 def new
    @blog = Blog.new
    @user = User.find(current_user[:id])
  end

```
Blogモデルの空インスタンスを作成・代入・new.html.erbに送る。
Usertテーブルから現在ログイン中ユーザのレコードを代入・new.html.erbに送る。

```new.html.erb
<%= form_with model: [@user, @blog], local: true do |form| %>
  <h2>タイトルを入力してください</h2>
  <%= form.text_area :title, placeholder: "タイトル" %>

  <h2>投稿内容を入力してください</h2>
  <%= form.text_area :text, placeholder: "投稿内容" %>
  <%= form.submit %>
   <% end %>
```

・親が第一引数、子が第二引数
・Blogモデルのインスタンスはここで入力された値にカラム値を上書き（？）される。\
・インスタンスが送られるというか、カラム（キー）という箱が送られる（？）\
・キーとバリューのセットになって丸ごとcreateアクションへ飛ぶ。

```blogs_controller.rb
def create
    Blog.create(blog_params)
    redirect_to controller: :blogs, action: :index
  end

  private

  def blog_params
    params.require(:blog).permit(:text, :title).merge(user_id: params[:user_id])
  end
```


※今回は親：user,子：blogsでアソシエイトを組んでいます。
※rails4以降（？）、アソシエイトを組んでいる場合は、paramsの中に親のidが入っていない場合、createした瞬間に
 rollbackされる。つまり保存されない。要注意。margeの部分は必須ということ。
GoogleColaboratory GoogleDriveとの連携

こちらの記事が分かりやすい
https://www.pytry3g.com/entry/GoogleColaboratory%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E8%AA%AD%E3%81%BF%E6%9B%B8%E3%81%8D
dotenvを使ったRails環境変数設定

APIのKeyを含むソースをGithubに上げたいと思って調べると、dotenvというものが使える模様。
早速使ってみることにした。

以下参考になりました。
[【Ruby on Rails】GitHubに公開したくない変数や値を隠してpushする方法](https://qiita.com/noraworld/items/bfa80811c9e30b4474af)
[環境によって変わる設定値はdotenvを使うと便利](https://qiita.com/closer/items/f8d8ba00ae86d7051764)

Gemfileの編集

```ruby:Gemfile
~
# .env から環境変数を読込
gem 'dotenv-rails'
~
```
インストール

```terminal
$ bundle install
```

`.env`ファイルをルートディレクトリ（Gemfileがあるディレクトリ）に作成して環境変数を定義

```ruby:.env
  hogehoge_api_key: "hogehogehoge"
  hogehoge_api_secret: "foobarfoobar"
```

.envはGitHubに公開しないようにgitignoreに追加

```ruby:.gitignore
/.env
```
pythonの()と{}の違い

Djangoの勉強をしていたら括弧の使い方でエラーが出ていたので知識の整理のために()と{}の違いについておさらいしておきます。
コードを写経して書いていると見間違えで別の括弧を書いてしまうことがありました。
そこで、括弧の意味をしっかりと理解し直して、記述の段階でエラーに気づけるように備忘録として残しておきます。


()：タプル
不変型 (immutable) で、要素が複数の型からなることもできる。
操作やインデックス (あるいは namedtuples の場合は属性)でアクセスすることが多いです。

{}：辞書、集合
辞書はキー(key): 値(value) のペアの集合であり、キーが (辞書の中で)一意である。
集合とは、値が一意である、順序づけられていない要素の集まり

以上の内容は[python公式サイト](https://docs.python.org/ja/3/tutorial/datastructures.html)を参照した。
43日目、Javascriptで小窓が開いた先でスクレイピング

今日はスクレイピングしようと思ったら、Notfoundだらけで参りました。
一体なぜ？あれこれ動かしているうちに気がつきました。
「ページのソースを表示」するとあるはずのタグが出てこないことに。
Javascriptだったのですー・・・
（所要時間 １時間）

もしやと思い、「Javascript リンク先　隠す」で検索すると。
わかりました。これでした。つまり初期状態では存在しないコードだったのです！
そしてとある場所をクリックすると、小窓が開いてリンク先が表示されると。。。

うーん、一体どうしたらいいんでしょう。

あれこれネットの海をさまよっていると、
「Javascript python スクレイピング」で
SeleniumでPhantomJSを裏であやつるとできるらしい事がわかりました。
（所要時間 １時間）

ところが。PhantomJSはいろいろ終わってるらしくChromeを使うのがおしゃれらしい。
なるほど、とりあえずSeleniumとchromedriverをimportしました。
が、が、なかなかこれが動かない！かなり試行錯誤してできたのがこれです。
（所要時間 １時間）

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

# ブラウザーを起動
options = Options()
browser = webdriver.Chrome(options=options)
url = "https://hogehoge"
browser.get(url)
browser.find_element_by_id('env001').click()
```

そんでもって、初期画面から最初のクリックするボタンのIDを探し出して`click()`してプログラムを起動すると・・・
Chromeがぴよーんと起動して、パッと小窓が開きました。お、おもしろい！！！
（所要時間 １時間）

小窓にはリンク先一覧があって、それぞれURLを取得してその先に行きたいので、
ほどよいタグを探したら、ありました！

`towns = browser.find_elements_by_class_name("townlink")`

これで一覧を取得して、

`num = len(towns)`

これで要素の数を取得して、

`for i in range(num):`

forで１つづつリンク先を見に行って、結果を出力です！
（所要時間 １時間）

結果をうまくまとめて出力するのにまた一苦労・・・
（所要時間 １時間）

今日は1日四苦八苦していました。
手作業の方がまだ早いくらいです笑

本日参考にしたサイトです。

[【Python】Webスクレイピング サイトをマルッとダウンロード](https://qiita.com/ononoy/items/c382ca698b7efe9e6119)
[PythonでWebページ情報を取得してみる](https://qiita.com/__init__/items/d53a281ef757b22f4732)
[リンク先を隠す方法はないでしょうか？](https://oshiete.goo.ne.jp/qa/1973879.html)
[【時短】ブラウザ自動操作ツール「Selenium」を使って面倒な操作を自動化しよう](https://moneytimehackers.com/selenium-automation/)
[ブラウザ操作の記録・自動実行を補助するツールを作ったけど供養します](http://yuzutas0.hatenablog.com/entry/2018/12/06/093000)
[\[Python\]seleniumでclick\(\)ができない](https://teratail.com/questions/79789)
[Seleniumで画面遷移した後の画面で要素が取得できない問題の解消](https://qiita.com/ymk1102_1t/items/42aa7c588ce97e3312b6)
[Python Webスクレイピング テクニック集「取得できない値は無い」JavaScript対応@追記あり6/12](https://qiita.com/Azunyan1111/items/b161b998790b1db2ff7a)
[\[Python\] JavascriptでレンダリングされるWebページを、スクレイピングする](https://www.yoheim.net/blog.php?q=20170302)
[Seleniumで要ログインページをスクレイピングをした話（初心者目線）](https://qiita.com/unotovive/items/40651598884cb41b1496)
[Click button by find\_element\_by\_class\_name not working python selenium webdriver NOT working](https://stackoverflow.com/questions/43021434/click-button-by-find-element-by-class-name-not-working-python-selenium-webdriver)
[PythonでSeleniumを使ってスクレイピング \(基礎\)](https://qiita.com/kinpira/items/383b0fbee6bf229ea03d)
[【Python入門】range関数で繰り返し処理をする方法とは?](https://programming-study.com/technology/python-range/)
[【Python3】ブラウザを経由したスクレイピング\(動的なページなど\)【Selenium】](https://qiita.com/shunyooo/items/09cc636344212112a6fc)
[Pythonのwhile文によるループ処理（無限ループなど）](https://note.nkmk.me/python-while-usage/)
[PythonでCSVファイルを読み込み・書き込み（入力・出力）](https://note.nkmk.me/python-csv-reader-writer/)
k3osをさくらVPSにインストールする

k3osをさくらVPSに入れようとしたら詰まったけど、出来たのでメモ。
ネット設定事情によりgithubからキー取得の機能は利用せず、
公開鍵は直接指定です。
追記(6/18)：ごめんなさい設定内容が間違ってました。；；

#k3osをダウンロード
https://github.com/rancher/k3os/releases/tag/v0.2.1
k3os-amd64.isoをダウンロードする。

#sftpでアップロード
管理画面で各種設定のOSインストールを選ぶ。
カスタムOS設定で、sftpでファイルをisoをアップロードします。


#cloud-initのコンフィグ

さくらのコンソールでusername: rancherで、ログインします。
sshはつながりません。

ここを参考にcloud-initのコンフィグを書いて保存します。
追記(6/18)：ごめんなさい設定内容が間違ってました。；；今のところ、こうじゃないと上手く動きません。
https://github.com/rancher/k3os

```cloud-init.yaml

ssh_authorized_keys:
- ssh-rsa AAAA.....w==
write_files:
- enconding: ""
  content: |-
    #!/bin/bash
    write_log () {
        local message="${1}"
        logger -t "boot-cmd" "${message}"
        echo "${message}"
    }
    write_log "Getting the service using eth0..."
    ETH0=$(connmanctl services | awk '{ print $3 }' | while read -r s1; do connmanctl services $s1 | grep -q "eth0" && echo "$s1"; done)
    write_log "eth0 is bound to: ${ETH0}"
    write_log "Setting up manual net config..."
    connmanctl config $ETH0 --ipv4 manual 133.0.XX.XX 255.255.255.0 133.XX.XX.1 --nameservers  	210.224.163.X 210.224.163.X
    connmanctl config $ETH0 --timeservers 133.XX.XX.1  # keeps .1 as optional ntp server but prefers .4
    connmanctl config $ETH0 --ipv6 off
    write_log "Restarting connman..."
    service connman restart
    write_log "$(connmanctl services $ETH0)"
    write_log "Network setup done."
  owner: root:root
  path: /etc/boot-cmd.sh
  permissions: '0755'
boot_cmd:
- "/etc/boot-cmd.sh"
hostname: k3os-server01
```
ssh_authorized_keysの設定
ここで、公開鍵を指定します。
```- github: XXXX ```という書き方ができるみたいですが、ネットができていないため使えません。

write_filesの設定
ここでネットワーク設定を行う。
設定情報は、さくら管理画面のネットワーク情報から確認できます。


#インストール
インストールするには、以下を打ち込みます。
```sudo os-config```

以下で、yを選択して、先ほど保存した、cloud-init.yaml　ファイルを指定します。

```
Config system with cloud-init file? [y/N]:y
```

#完了
あとは再起動が終わると、sshでログインできます。
ログインした状態で、```kubectl```などを使うことができます。


#何が問題だったか。
この手順を、10数回繰り替えして分かったのが以下です。(軽いだけにインストールは激早でした。)

1. k3osのisoにはさくらVPSのネットワーク設定が含まれていないので、ネットに繋がらないので、sudo os-configのgithubを指定すると、ネットワークタイムアウトする。

2. cloud-initファイルを使うと、githubがスキップされ指定できない。
3. cloud-initにgithubを記録しても、ネットワーク設定前にキーを取ってこようとするため失敗する。
4. ログインに失敗すると、再インストールからやり直し。

githubキーを指定しつつ、インストールできるやり方が分かればいいな。

#おまけ
k3osのネットワークマネージャーは、connmanctlを使っていたので、再起動せずにネットワークを書き換えたいときはこれが使える。
https://ahmermansoor.blogspot.com/2019/05/configure-network-on-k3os-machine.html
JavaScriptの変数巻き上げという概念

普段は他の言語を使っているがJavaScriptに入門して変数の巻き上げという独特の概念に出会ったので、自分用のメモとしてその挙動を簡単にまとめておく。

##変数が宣言されていない

```javascript
const func = () => {
  console.log(hoge); // Error: hoge is not defined
};

func();
```
`Error: hoge is not defined`
そんな変数はない。まあ当然だよね。


##変数を使用した後でconst(もしくはlet）で宣言されている

```javascript
const func = () => {
  console.log(hoge); // Error: Cannot access 'hoge' before initialization
  const hoge = 'hoge';
};

func();
```
`Error: Cannot access 'hoge' before initialization`
え・・・。宣言されていないんじゃなくて？　初期化がされていないの？

内部的にはこう↓らしい。

```javascript
const func = () => {
  const hoge;
  console.log(hoge); // Error: Cannot access 'hoge' before initialization
  hoge = 'hoge';
};

func();
```


##変数を使用した後でvarで宣言されている

```javascript
const func = () => {
  console.log(hoge); // undefined
  var hoge = 'hoge';
};

func();
```
`undefined`
今度も変数宣言はされているが、値は未定義という結果。
これはこう↓か。

```javascript
const func = () => {
  var hoge;
  console.log(hoge); // undefined
  hoge = 'hoge';
};

func();
```

#まとめ

他の言語であれば変数を使用するより前に宣言していないと宣言されていないというエラーになるところが、JavaScriptでは変数は宣言されているが値がないということになる。どこで宣言してもスコープ内の頭で宣言したのと同じ挙動になるので巻き上げというらしい。
とはいえ、値がなくてエラーになるので、結果だけ見れば他の言語とそう変わらないかも。

よくわからないのは、2つ目と3つ目の違い。初期化されていないのと値が未定義なのって何が違うんだ？

#参考
[JavaScript 変数の巻き上げと対策](https://qiita.com/mitsuhiro_K/items/4c091308e3e0e6969144)
AWS Summit - コンテナ化されたアプリケーションのAWSでの構築・運用指針

**AWSの各セッションの資料/動画、並びに一部お客様事例の資料/動画を7月1日より随時公開されます。**

本セッションは、AWSでのコンテナ関連サービスの紹介になります。一番面白いのは、
**アプリに集中したいお客様は、インフラの運用管理をAWSに任せる事ができます。（GoDaddy様）**

## コンテナ技術を採用するビジネスの価値
過去１５ヶ月のコンテナインスタンス数が３００％伸びました、開発者がアプリケーションへのフォーカスが実現

### イノベーションのサイクル
- コードの配布と運用の自動化
- 小さく、より多数の独立したチーム
- より頻繁に更新し、障害発生率を下げる

## コンピュート消費モデルの変化 - AWS Fargate
- シンプルでパワフルな、オンデマアンド消費モデル
  - Instance管理不要
  - タスクネイティブなAPI
  - 消費リソースに応じた価格体系
- セキュリティーなど対応不要、AWSが考慮し、実施してくれる
  - タスクの開発に集中できる
- 10M+  
  - 稼働するタスク／週の数
- 最近値段も下げた
  -  [AWS Fargate で最大 50% の値下げを発表](https://aws.amazon.com/jp/about-aws/whats-new/2019/01/announcing-aws-fargate-price-reduction-by-up-to-50-/)

## サーバーレスの特性
- インフラのプロジジョン不要、管理不要
  - AWSインフラを管理する
    - クラスタ
    - Performance
    - Security
- 自動的にスケール
  - 必要なの
  - Scale to Zero
  - サーバーレスのセキュリティー
    - 以前は、お客様自分で対応する
    - 現在は、AWSで対応する
  - 拡張しやすい
- 価値に対する支払い
- 可用性が高く、セキュア

## サーバーレス関連サービス
- コンピュート
  - Lambda
  - Fargate
- データストア
  - Amazon S3
  - Amazon Aurora Serverless
  - Amazon DynamoDB
- インテグレーション
  - Amazon API Gateway
  - Amazon SQS
  - Amazon SNS
  - AWS Step Functions
  - AWS AppSync
  - 将来もっと追加する予定です
  
## サーバーレスの技術基盤 - AWSサービス
内部的に**Firecracker**、**App Mesh**が採用されてる、FirecrackerについてOSSでPerformanceもよい

### AWSサービスの迅速性と効率性を向上
- 効率的なリソース利用
- セキュリティーと分離
- より速い起動時間
- アプリケーションレベルの通信

## AWSのコンテナ関連サービス
- オーケストレーション
  - ECS
  - EKS
- コンピュートエンジン
  - EC2
  - Fargate
    - ECSのみ、EKS未来かも
- インメージレジストリ
  - ECR
    - Application Hub
    - Dockerなど使う
  

## 柔軟性とシンプルさのブランスはワークロード単位で考える
**柔軟性が大事**：コンピュート環境のインストール、構成、管理がゴール達成の為に重要
**シンプルさが大事**：標準化されたオンデマンドで使えるコンピュート環境がゴール達成の為に重要

|柔軟性が大事|シンプルさが大事|
|---|---|
Low level of opinion|High level of opinion  
低レベルの抽象化|高レベルの抽象化
インフラと構成にフォーカス|アプリケーションと本質にフォーカス

- [aws-cdk](https://github.com/awslabs/aws-cdk)が紹介された
  - YAML複雑
  - 簡単で作成できる
  - Fargate対応

## Amazon Elastic Container Service (ECS) - シンプルさ重視
- コンテナレベルのネットワーク
- 強力なスケジュールエンジン
- 高度なタスク配置
- オートスケール
- AWS Platformとの深い統合
- CloudWatch メトリクス
- ECS CLI
- ロードバランサー
- 世界規模
- 全て解決できたではない
  - Scale Zeroは現状できない

## Amazon Elastic Container Service for Kubernetes (EKS) - 柔軟性重視
- コンテナレベルのネットワーク
- Kubernetesのエコシステム
- マネージドetcdとマスタノード
- タイムリーなアップグレード
- AWS Platformとの深い統合
- マスタノードの高い可用性
- Kubernetes APIs
- Kubernetesアップストリーム100%基準

## App Mesh - AWS全域にわたるアプリケーションレベルの通信を実現
アプリケーションレベルのネットワーキングを提供し、さまざまな種類のコンピューティングインフラストラクチャをまたぐお客様のサービスの相互通信を容易にするサービスメッシュです。

- AWSにアプリレベルの通信を実現
- インスタンス通信　-> マイクサービス検出
- トラフィック管理できる
- ネットワードなど、管理が不要
- 実現目標、Appのみ集中
- Application間の通信のコントロールができます
- ログなども取れます
- LBの統合、API Gatewayの統合

## 最近Launch Service
- ECS Local Testing Tools
- App Mesh GA
- Kubeflow for EKS
- ......

## AWSコンテナサービスが選ばれる理由
- 選択の幅: 適材適所でツールを選べる
  - AWSが提供する選択肢がコンテナのデポロイにメリットをもたらす
- Applicationフォーカス
  - コンテナに適したDevOpsワークフローを構築・運用するベストな場所
- セキュリティとコンプライアンス
  - ISO, HIPPA, PCI ...

## 事例：米国マクドナルド様の宅配 - ECS
- 市場投入までのスピード
- スケーラビリティと安定性
- セキュリティ
- DevOps - CI/CD
- モニタにング

## 事例：GoDaddy様
約200のエンジニアリングチームがKubernetesの運用負荷を軽減するため、Amazon EKSにアプリケーションをデポロイ、**AWSがインフラを管理する**
Truffle Error

For your information

# Error

```
Could not find artifacts for Adoption from any sources
```

## Solution

After your compilation, go to your_folder_location\build\contracts folder.

Then you will see a JSON file which not related to your contract file.

Just rename that JSON file same as your contract file. ( most probably that JSON file related your folder name )

But after that you can see the renamed file as well as the original file too, both files in same location. Don't worry.


### What I happened
When I compile "Adoption.sol", truffle made "Adpption".
So I change Addption to Adoption.
[初心者]　findとfind_byの違い　わかりやすく解説

皆さんは、findやfind_byを使い分けることはできていますか？

なんとなくでfindやfind_byをcontrollerで使っている人も多いかなと思います。

自分も使い分ける事ができておらず、つい最近まで、以下の画像の様にcontrollerに記載していました。
<img width="467" alt="スクリーンショット 2019-06-13 21.31.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436942/d3e1f453-c40c-b49a-81e5-0f55f0651729.png">

しかし、エンジニアの方にちゃんと使い分けた方がいいよとアドバイスを頂いたので、そのアドバイスを踏まえた上で、実際に作っていく際、意識した方がいいfindやfind_byの特長について、以下で述べていこうと思います。


#find、find_byの大きな違い
最も大きな違いは、find_byは、nilを返すという点です。
さっきの画像のように、idを用いてデータを取ってくることは多いと思います。

その時、
@micropost１ = Micropost.find_by(id: params[:id])
@micropost２ = Micropost.find(id: params[:id])
の２つの書き方ができます。

データがちゃんとある際、どちらもちゃんとデータを引っ張ってくる事ができますが、データがなかった際、対応が違ってきます。

@micropost1では、データが無ければ、エラーが返されますが、
@micropost２では、nilが返されます。

つまり、find_byだと、データがなかった際、@micropost２ = nilのまま、viewまでプロセスが走ってしまいます。
しかし、findを使えば、nilではなく、エラーが返されるので、viewまでプロセスが走ることはありません。

したがって、特段の理由がないのなら、show actionなどで、idでデータを引っ張ってくる際は、findを使う事がおすすめです。

そして、findでは、idでしか引っ張ってこれないという点も着目ポイントだと思います。id以外でデータを引っ張ってきたい時は、find_byを使いましょう！
OVR Metrics tool のCSV出力（Oculus Go）

### OculusGo確認

●ライブラリ⇒提供元不明のアプリ⇒OVR Metrics Tool を選択

●「Record all captured metrics to csv fiies」 をONにする。

●Oculusを開発者モードで接続していれば、下記フォルダにアクセスできる。

●**VR-Headset\内部共有ストレージ\OVRMonitorMetricsService\CapturedMetrics**
この中にcsvファイルがあり各種負荷データを見ることができる。
2019/06/13 自動テスト喋り足りNight #1

# Outline

6/13 に　”自動テスト喋り足りNight #1”というイベントがありました
https://connpass.com/event/131878/

そこでは、様々な企業で活躍されている自動化エンジニアがあつまり、自動化に関するナレッジを共有しました
今回、たまたま発表する機会をいただいたので、Jasst東北で仙台から帰宅する新幹線の中でもんもんとコンテンツをつくり、発表しました

twitter hashtag
https://twitter.com/search?f=tweets&vertical=default&q=%23shaberitarinight



<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/d9f2cfbf-a346-1200-6604-1a5e0283a4f0.png" >


<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/73748d2f-599d-3e65-0478-2179ea773020.png" width=80%>



# Presentation

<A HREF="https://www.slideshare.net/SadaakiEmura/basic-of-test-automation-installation"><IMG SRC="https://image.slidesharecdn.com/test-automation-basic-190612233120/95/slide-1-1024.jpg" width=70%>

## 1. why automation

なぜ自動化をするか、目的を明確にしたほうが良い
・自動化によって、品質活動の効率を上げ、全体的な品質をあげること
・自動化といっても、テスト実行だけではない。　レポーティングやテストデータ作成、ストレステストなど作業改善できるところはいっぱいある
・これらによって、開発サイクルを向上し、コスト削減も図れる

尚、ISTQBの Test Automation Engineer syllabusには、直接的にバグをみつけることとは書かれていません。
誤解をたまに生むのは、自動化によってたくさん新規バグを探してくれるということ。

## 2. How to automate

どのように自動化を実現するかを考える
・将来まで考えて、どのメンバーが自動化を運用していくかを考える必要がある
　つくっただけで終了ではない
・外注にするというのも一つだが、運用がセットになるので、ツールによるベンダーロック以上にロックがされかねない
・運用として、
　スクリプトを最新のプロダクトに追従する必要
　実行環境のバージョンアップ等

## 3. What area is automated

自動化にあたって、どの部分を自動化するかを最初に基準を作ったほうが良い
・アジャイルテスト４象限がざっくりとした切り口として参考
・なんでも自動化にならないように

## 4. How to operate

つくった自動化をどのように利用していくかを考える

・プロジェクト単位で使い捨てにするという考え方もあり。
　例えば、フォームへの入力の網羅テストを実施したい場合
　　競馬で三連単全パターンの購入テストをする場合、3360通り( 16 * 15 * 14 )になるので、それを実施。ただし、毎日実行する必要はない。なぜなら、実行時間もかかるので、そこまでの必要性がない場合
・レポーティングも重要。誰に見せて、どのように使うのか？　失敗したときに、分析しやすいものになっているか
・よく使われる、CIのなかで利用する場合。それを見越した設計を考える必要がある

## 5. How to collaborate with others

自動化は個人で完結させるものではない。
stakeholderに共有することで、もっと生きてくる

・QAの組織の中でマニュアル部隊と別れている場合、マニュアル部隊にとって何を自動化し、品質担保しているかを可視化させないと、マニュアルと含めての効率の良いテストにならない
・QA外への情報展開も場合によって必要。例えば、ProDuct Managerに対しては自動化の運用があってもROIが成り立つような説明が必要なときもある
・自分の評価にもかかわってくるかもしれないが、自動化が上司から見てどういったものであるかを説明できるようにしておかないと苦労する場合もある。（システム運用と同じで、なにも問題ないように運用することが評価されにくい？）

## 6. How to install in project

・マニュアルの実行に比べて、自動化の主にスクリプティング工程には時間がかかる
・テスト対象が特に新規の場合、安定するまで時間がかかるのが多い（マニュアルのテスト実行中に、バグ大量に発生、テンプレートエンジンの見直しでデザイン作り直しとか）
・自動化が正しいという検証を考えないといけない
そういったことから、自動化をどのタイミングで適用させるのかをプロセスに取り込まないといけない

## 7. Let's try it first

なんだかんだ言ってきましたが、結局はまず何でもいいから自動化をやってみることが重要

# Note


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/98430ae3-45b0-cf17-4429-877a445a5ced.png)
※パンダと発表はあんまり関係ありません
.NET Core 3.0 の目玉の single exe を preview6 で試してみた

# .NET Core 3.0 の目玉の single exe を preview6 で試してみた

.NET Core 3.0 の目玉の single exe だが、preview5 で試したところ、コンソールの Hello World が 67MB と大きかったのだが、preview6 でトリム機能が入って小さくできるようになったようなので再度試してみた.

結果 29MB とサイズは半減していた.

```
C:\Users\user\Documents\ConsoleApp1>dotnet new console
The template "Console Application" was created successfully.

Processing post-creation actions...
Running 'dotnet restore' on C:\Users\user\Documents\ConsoleApp1\ConsoleApp1.csproj...
  Restore completed in 75.44 ms for C:\Users\user\Documents\ConsoleApp1\ConsoleApp1.csproj.

Restore succeeded.


C:\Users\user\Documents\ConsoleApp1>type Program.cs
using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

C:\Users\user\Documents\ConsoleApp1>dotnet publish -r win10-x64 -c Release /p:PublishSingleFile=true /p:PublishTrimmed=true
Microsoft (R) Build Engine version 16.2.0-preview-19278-01+d635043bd for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restore completed in 92.88 ms for C:\Users\user\Documents\ConsoleApp1\ConsoleApp1.csproj.
C:\Program Files\dotnet\sdk\3.0.100-preview6-012264\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.RuntimeIdentifierInference.targets(158,5): message NETSDK1057: You are using a preview version of .NET Core. See: https://aka.ms/dotnet-core-preview [C:\Users\user\Documents\ConsoleApp1\ConsoleApp1.csproj]
  ConsoleApp1 -> C:\Users\user\Documents\ConsoleApp1\bin\Release\netcoreapp3.0\win10-x64\ConsoleApp1.dll
C:\Program Files\dotnet\sdk\3.0.100-preview6-012264\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.ILLink.targets(37,5): message NETSDK1101: Optimizing assemblies for size, which may change the behavior of the app. Be sure to test after publishing. See: https://aka.ms/illink [C:\Users\user\Documents\ConsoleApp1\ConsoleApp1.csproj]
  ConsoleApp1 -> C:\Users\user\Documents\ConsoleApp1\bin\Release\netcoreapp3.0\win10-x64\publish\

C:\Users\user\Documents\ConsoleApp1>dir bin\Release\netcoreapp3.0\win10-x64\publish\
 Volume in drive C has no label.
 Volume Serial Number is 02AD-7E6D

 Directory of C:\Users\user\Documents\ConsoleApp1\bin\Release\netcoreapp3.0\win10-x64\publish

06/13/2019  12:26 PM    <DIR>          .
06/13/2019  12:26 PM    <DIR>          ..
06/13/2019  12:26 PM        29,784,413 ConsoleApp1.exe
06/13/2019  12:26 PM               432 ConsoleApp1.pdb
               2 File(s)     29,784,845 bytes
               2 Dir(s)  35,051,622,400 bytes free
```
【Javascript】今更だけど、ajaxするにはfetchでいいよ話。$.ajaxは要らないしxhrは使わなくてok。getもpostもできるよ。

## 今更だけどJavascriptでAjaxするならfetchでいいよね話

未だに結構jQueryによる\$.ajaxを使った実装が公開されているのを見るけれど、fetchでokだよねという今更な内容です

既存プロジェクトにjQueryが入っている場合はもちろん$.ajaxで全然okok

また、モダンでないブラウザも対応する必要があるのであれば$.ajax又はaxiosなどを使った方が良い

##fetchでget

getの場合、使い方は簡単！こうです。

```javascript
fetch("./api/get-test.php")
```

fetch の第一引数にgetしたい, 叩きたいAPIなどのurlをセットしてあげればok

fetch先のurlが仮にjsonを返却してくる場合は、返却値をjsonにパースしてあげる必要があるので、実際は下記のような形が1セットになるかと思います

```javascript
fetch("./api/get-test.php", ).then(res=> res.json())
```

response.json()してあげると、無事jsonがjavascriptのオブジェクトとして取り出すことができます

実際に値をとるならこんな感じ↓

```javascript
const resFromGetTest = await fetch("./api/get-test.php", ).then(res=> res.json())

console.log(resFromGetTest)
```

then().then()でもいいけど、async/awaitでももちろんok

参考までに、今回作った検証用のテストapi(./api/get-test.php)は下記のよなめっちゃシンプルなjsonを返却するphpになってます

```php
<?php
header("Content-Type: application/json; charset=utf-8");

$arr = array();

$arr["myresponse"] = "my-response-value";

echo json_encode($arr);

?>
```

こんな感じです

##fetchでpost

もちろんpostもできて、下記のような感じになります

```javascript
const res= 
  await fetch("http://tasokori.net/webapps/utils/create-thumb/doResizeApi.php", {
    method: "POST",
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'
    },
    body: Object.keys(imgResizeBody).map((key)=>key+"="+encodeURIComponent(imgResizeBody[key])).join("&")
  })
	
```

fetchはオプション無しだとデフォルトでGETしてしまうので、methodでPOSTをセットしてあげます

他、headersで色々設定できます

body には送信する値をセットできます(もちろんbodyはjsonでも送信できます)

こんな感じです

[参考](https://tasokori.net/%E3%80%90javascript%E3%80%91-ajax%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%AB%E3%81%AFfetch%E3%81%8C%E3%81%84%E3%81%84%E3%82%89%E3%81%97%E3%81%84)
Promiseコンビネータに提案されてる2つのメソッド

ES2015で導入されてるPromiseコンビネータは`Promise.all`と`Promise.race`だが、現在`Promise.allSettled`と`Promise.any`が提案されている模様。

`Promise.allSettled`はStage3で、Google Chrome 76以降で試せる。`Promise.any`はまだStage1。

## Promise.allSettled

`Promise.allSettled`メソッドは引数に渡されたすべてのPromiseについての結果を、それぞれすべてが完了したあとで、結果が記述されたオブジェクトの配列とともに返す。

```javascript
const promise1 = new Promise((resolve, reject) => {
    setTimeout(resolve, 500, 'one')
})
const promise2 = new Promise((resolve, reject) => {
    setTimeout(reject, 100, 'Intentional error');
})
const results = Promise.allSettled([promise1, promise2]).then((value) => {
    console.log(value)
})
// [
//   {"status":"fulfilled","value":"one"},
//   {"status":"rejected","reason":"Intentional error"}
// ]
```

## Promise.any

`Promise.any`はいずれかの`Promise`が`resolve`されるとすぐに戻り値を返す。`Promise.race`と挙動は似ているが、`Promise.race`はいちばんはじめに解決したPromise（`resolve`でも `reject`でも）を返却するのに対し、`any`は`reject`のときは返さない。

```javascript
const promise1 = new Promise((resolve, reject) => {
    setTimeout(resolve, 500, 'one')
})
const promise2 = new Promise((resolve, reject) => {
    setTimeout(reject, 100, 'two');
})
const promise3 = new Promise((resolve, reject) => {
    setTimeout(resolve, 100, 'three');
})
const results = Promise.any([promise1, promise2, promise3]).then((value) => {
    // いちばん最初にfulfilledになったPromiseが返される
}).error(() => {
    // すべてのPromiseが失敗した際に実行される
})
```

## 参考リンク

- [Promise combinators](https://v8.dev/features/promise-combinators)
- [Promise.allSettled](https://github.com/tc39/proposal-promise-allSettled)
- [ECMAScript proposal: Promise.any](https://github.com/tc39/proposal-promise-any)
- [fulfilled, rejected, settled...　Promiseの用語、全部分かりますか？](https://qiita.com/uhyo/items/a9f6e70f43287cc0f52e)
GoogleのOAuth認証中にPostgreSQLへの接続でSSLエラーが発生する

#概要
CakePHP3でGoogleのOAuthを導入したところ、しばしばサーバエラーとなり認証が失敗し、すぐ同じ認証にチャレンジすると成功します。この時CakePHPのerror_logには下記のエラーが記録されています。
`Error: [PDOException] SQLSTATE[HY000]: General error: 7 SSL error: no start line`
このエラーの検出方法と、解決方法を記します。

#詳細
Googleログインと、Facebookログインを導入した時、Facebookログインでは特に問題は無かったもののGoogleログインでたまにログイン時に500エラーが発生して認証の後の処理が失敗することがありました。ただすぐ後に再認証すると問題なく認証できたのでプログラム側の問題というよりサーバの設定の問題かもしれない認識でいました。

問題が起きたときのCakePHPのログを見てみると、PDOExceptionとあるので、Google側の通信ではなくPostgreSQLとの通信だという事が判ります。意外なことにPostgreSQLはデフォルトでSSL接続するようになっています。AWSでRDSとEC2をVPCで接続して使っている場合、通信内容はVPC内に隠蔽されるのでSSLである必要はありません。

そこで、PostgreSQLの通信内容を非SSLに変更するようにしました。

#解決方法
Apacheから起動するPHPの場合 /etc/sysconfig/httpd の最後の行に
`export PGSSLMODE=disable`
として、Apacheをrestartさせると非SSLモードで接続するようになります。
印刷日を打刻するプリントプラグイン

印刷するときに，ヘッダーに日付を付けたい時があります。
プリンタのドライバにそういう機能があれば良いのですが，無い場合にめんどくさい。
そこで，Automatorを使って「プリントプラグイン」を作ってみましょう。プリントプラグインなら，OSX標準の印刷機能から呼び出すことができます。
# 考え方
UNIXのdateコマンドで生成した日付文字列を，「テキストからバナーイメージを作成」で画像ファイルにして，「PDF書類にウォーターマークを描画」する。
完成イメージはこんな感じ↓
<img width="238" alt="スクリーンショット 2019-06-13 20.07.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192970/2ed06946-87f7-cf6b-c73b-a05a25ea4761.png">

#大まかな流れ（Automatorアクション）
1. "プリントプラグイン"は、プリントシステムからPDFファイルを受け取ります
2. 変数の値を設定
3. テキストの入力を求める ※日付形式の指定
4. シェルスクリプトを実行 ※3.で指定された日付形式でdateコマンド
5. テキストからバナーイメージを作成
6. 変数の値を取得 ※2.で設定した変数を呼び出す。
7. PDF書類にウォーターマークを描画
8. Finder項目を開く

以下，解説

# 1.プリントプラグインの作成
Automatorで「新規」→書類の種類を「プリントプラグイン」。
# 2.変数の値を設定
プリントプラグインが受け取ったPDFを，適当な変数に格納しておきます。
私の場合，デフォルト値である「ストレージ」を変数名に使いました。

# 3,4. 日付形式の入力を求め，dateコマンドで文字列を吐き出す。
## 3.テキストの入力を求める。
![スクリーンショット 2019-06-13 20.49.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192970/54ad7761-73f2-eeed-b767-5bc724a18ad1.png)
プリントプラグイン使用時に日付形式を指定できるようにします。
Automatorアクション「テキストの入力を求める」を設置し，`オプション：☑️このアクションの入力を無視`にチェックを入れておきます。（そうしないと，2.の変数に格納したPDFを受け取ってしまう。）
`デフォルトの回答`には自分が一番よく使いそうなフォーマットを，UNIX dateコマンドのフォーマット書式で入れておきましょう。
私の場合，yyyy-mm-dd形式が好きなので，`%Y-%m-%d印刷版`としています。
## 4.シェルスクリプトを実行
「入力の引渡し方法：引数として」と設定して，こんな感じ。

```bash:Automatorアクション「シェルスクリプトを実行」
date "+$@"
```
##余談：JavaScriptで日付形式決め打ちしてたころの実装
当初は日付形式決め打ちにして，Automatorアクション「JavaScriptを実行」で実装していました。が，日付形式を指定できると良さそうで，だけどJavaScriptは標準ライブラリではDateFormatter的なものが提供されていないので，UNIXコマンドを使うことにしたのです。
旧コードではこんな感じ。

```JavaScript:Automatorアクション「JavaScriptを実行」
function run(input, parameters) {
	// Your script goes here
	return ((new Date()).toLocaleDateString("ja-JP",{year:"numeric",month:"2-digit",day:"2-digit"}).split("/").join("-")) + "印刷版";
}
```

# 5.テキストからバナーイメージを作成
**ダミーファイル**を用意しておいて，「名前」と「場所」をダミーファイルと同一に設定し，`☑️既存のファイルを置き換える`にチェックしておきます。
書体やカラーやサイズはお好みで。私はHiraMaruPro-W4, Black, 10.5ptです。
（本当は，生成した画像を変数に入れてウォーターマークに使えればダミーファイルは不要なんでしょうけども，「PDFにウォーターマークを描画」アクションがファイル指定を要求するので…。）

# 6.変数の値を取得
2.で記憶しておいたPDFを召喚して，次のアクションに渡します。
# 7.PDF書類にウォーターマークを描画
5.で使った**ダミーファイル**をウォーターマークに指定し，適宜のオフセット，サイズ調整を指定します。
私の場合，オフセット={x:460, y:810, サイズ調整:0.5} でちょうど良かった感じ。

# 8.Finder項目を開く
7.で日付画像を描画したPDFをプレビュー.appで開きます。
プリントプラグインで出力したPDFはどこにあるか分からないし，印刷プレビューもしたいので，プレビュー.appで開くことにしておけばいろいろ捗るのです。

で，これを「印刷日打刻.workflow」（プリントプラグイン）とでもして保存すれば，標準の印刷画面の左下（「PDF」ドロップダウン）から使えます。便利！
【Python】TIPS：pyinstallerの軽量化【exe化】

# 概要
- pyinstallerでデータの前処理プログラムを書いたときのexe大きすぎ問題の解決法

# 問題
* いやいや、大きすぎでしょ・・・
<img alt="qiita_cap0613.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148213/60ddb549-db14-ba5f-6332-56c94d3d26e3.jpeg">


* importしたのはこの子達。重そうなのはpandasかなって思ってました。
(変なimportの仕方は、これで少しでも軽くなるかなって思ってやったんだ・・・)

```python:import
import glob
import os
import re
import sys
from datetime import datetime, timedelta
from pandas import read_csv, DataFrame, concat

```

# 解決策
* どうもMKL***というのが悪さをしているらしい。
* .specファイルに下記の項目を追加する
* .specファイルは、pyinstallerを動かしたときに中間ファイルとしてできるみたい

```python
# -*- mode: python -*-

block_cipher = None

import sys
sys.setrecursionlimit(50000)

a = Analysis(['C:\\Users\\***\\PycharmProjects\\tool_for_armadillo\\main.py'],
             pathex=['C:\\Users\\***'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)

#---------------追加ここから---------------
Key = ['mkl']

def remove_from_list(input, keys):
    outlist = []
    for item in input:
        name, _, _ = item
        flag = 0
        for key_word in keys:
            if name.find(key_word) > -1:
                flag = 1
        if flag != 1:
            outlist.append(item)
    return outlist

a.binaries = remove_from_list(a.binaries, Key)

#---------------追加ここまで---------------

exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='main',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=True )
```

# 結果
* こうなりました。　　
<img alt="キャプチャ.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148213/c6ac91c5-88a9-9194-71d9-3516be1ece9b.jpeg">
* pythonを入れられないPC向けに作りましたが、こんなに容量が大きくなるとは・・・
* もっと容量減らせるよ！って方法があれば教えてください。
Stackによる逆ポーランド記法の計算

## 概要
逆ポーランド記法とは、演算子を数字の後に記述する記法です。
例えば一般的な数式 (1+2)*(5+4) は、逆ポーランド記法では 1 2 + 5 4 + * と記述されます。
逆ポーランド記法の計算式を標準入力で受け取り、その計算結果を出力するコードをPythonで書いてみます。

## 例1
### 入力
```
1 2 +
```
### 出力
```
3
```
## 例2
### 入力
```
1 2 + 3 4 - *
```
### 出力
```
-3
```
## 例3
### 入力
```
34 116 + 20 5 - 5 - 1 * +
```
### 出力
```
160
```

## 実装例
逆ポーランド記法で記述された数式は、スタックを用いて計算することができます。
数式を一文字ずつ読み込み、数値ならStackに積む、演算子ならStackから値を2つ取り出して計算結果をStackに積む、という操作を繰り返すことで最終的な計算結果を得ることができます。

```python
s = list(input().split())
stack = []

for i in range(len(s)):
    if s[i] == '+':
        stack.append(stack.pop() + stack.pop())
    elif s[i] == '-':
        stack.append(-(stack.pop() - stack.pop()))
    elif s[i] == '*':
        stack.append(stack.pop() * stack.pop())
    else:
        stack.append(int(s[i]))

print(stack[-1])
```


## 参考
[Aizu Online Judge](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_3_A)
CircleCIのManual ApprovalをSlackへ通知する(Orb利用)


↓の記事でやられてることを、CircleCI v2.1の新機能である[Orb](https://circleci.com/docs/ja/2.0/using-orbs/)を利用して実現してみます。

- [CircleCIのManual ApprovalをSlackへ通知する](https://qiita.com/t2h5/items/94c56570fd17c527305a)

# 準備
1. SlackのIncomming Webhookを作成します(手順割愛)
1. そのWebhookのURLを[CircleCIの環境変数](https://circleci.com/docs/ja/2.0/env-vars/)に `SLACK_WEBHOOK` というNameで登録します
2. `config.yml` で↓のように記述します

```yaml
version: 2.1

orbs:
  slack: circleci/slack@3.2.0

executors:
  python3_6_1:
    working_directory: ~/repo
    docker:
      - image: circleci/python:3.6.1

jobs:
  notify-to-slack-for-approval:
    executor:
      name: python3_6_1

    steps:
      - slack/approval:
          message: "本番環境へのデプロイを承認してください"
          mentions: "here"
          color: "#F5E911"

workflows:
  build-deploy:
    jobs:
      - notify-to-slack-for-approval
      - approval:
          type: approval
```

# Done

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/53ab20d3-0d24-4831-eed9-52432d5b5a68.png)

# メモ
- Orbはまだまだ荒削りなものが多くWebの情報が信用出来ないので[公式](https://circleci.com/orbs/registry/)から情報を探しましょう
    - そして公式の情報も間違っていることがあるので動かないときはOrbのコードを読みましょう
競合解消の手順について

備忘録として、アウトプットしてみた。

#1.競合ファイルを確認する
ターミナル上で、git statusコマンドを実行して、競合が生じているファイルを確認する。競合が生じているファイルは赤字表記がされる。
https://gyazo.com/ad9ee414593d8a739455402c8cd4936c

競合が生じたファイルをテキストエディタで確認する。自分が使用しているテキストエディタは、VScodeである。VScodeであれば、以下の画像のように競合しているファイルが紫色に変化する。
https://gyazo.com/06d02b171185531b9ba5f260cd43b435


#2.エディタ上で確認する
エディタ上でコードを確認すると、以下のような記載が
なされている。※例えば、今回ではuploaders/image_uploader.rbというファイルのコードをみてみる

```ruby


class ImageUploader < CarrierWave::Uploader::Base
  
  storage :file
  
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  include CarrierWave::MiniMagick

<<<<<<< HEAD
process resize_to_fit: [400, 400]
=======
process resize_to_fit: [800, 800]
>>>>>>> fb3b055... git commit --allow-empty -m "first commit"

end


```

https://gyazo.com/3664c6c4b2d8d6ffc44609e218e40dc2

<<<<<<< HEADとは現在のコミットを指しており、>>>>>>>はリモートリポジトリのmsaterブランチを指している。そして、=======はこれで区切られた上と下の記述が競合しているということを意味している。
**VScode上であれば、<<<<<<< HEAD部分が緑色で、>>>>>>>部分は青色で表記される。**

#3.競合箇所を修正する
修正方法としては、２つある。

1.不要な方のコードの記述を削除する
2.両方とも残す

**必修正方法のいずれを選択しても、必ず<<<<<<< HEADと>>>>>>> と=======の記述は必ず消すこと。**

```ruby
class ImageUploader < CarrierWave::Uploader::Base
  
  storage :file
  
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  include CarrierWave::MiniMagick


process resize_to_fit: [400, 400]

end
```

今回は、>>>>>>> の部分がふようであったので、その部分を削除した。

#4.競合解決をコミット
次に、ターミナル上で競合を解決した内容を以下のコマンドを実行する。

```
$ git add .
```
このコマンドで、競合解決したファイルをまとめて処理できる。



以上の作業で競合を解決できたので、GitHub Desktopにおいてコミットメッセージを送り、コミットする。


#5.ブランチをマージする(競合解決の終了)。
コミットできたら、リモートにプッシュして、リモートのGitHubに移動して(コマンド+Rで移動できる)、プルリクエストを確認してマージする。
マージの際の画面表記は以下のようになる。
https://gyazo.com/80ce0517a2bfff626a9a55b2c54b579b

以上で、競合解決の手順が終了する。


自分の手順において、何か指摘点や改善点等がありましたら、遠慮なくご指摘いただければ、と思います。

　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　以上
教えてもらって何これすごいって思ったこと

# 教えてもらって感動したこと

- importにasが使える
  - 例：`import jp.co.hoge.SampleClass as OldSampleClass`
  - これでSampleClassのことをOldSampleClassとして扱える
  - 可読性たかいたかい

- layoutのxmlとViewを紐付けすればViewにlayoutをinflateしなくていい
  - ViewModel+DataBinding使うとき優勝できる

```xml:hogelayout.xml
<layout xmlns:android="http://schemas.android.com/apk/res/android"
tools:context="jp.co.hoge.SampleFragment">

```

人のコード読むって勉強になるなあ
Dockerコンテナ上でESP32のファームウェアを開発する


## 動機
ESP32の開発環境を1から用意しようとすると、様々なツールをインストールする必要があり面倒だったので環境をDockerコンテナ化しました。

## 前提
* ESP-IDFのバージョン: v3.3-beta3を採用
    * 現在（2019-06-03現在）の安定板はv3.2ですが、もうすぐv3.3がリリースされそうなため。
    * READMEにも書いていますが、自身でイメージをビルドする方法であれば任意のバージョンを利用できます。
* ビルドツール: CMake + Ninjaを採用
    * v4.0からはこちらが主流となり、v5.0からはmakeは非推奨になると書かれていたため。
    * 参考にした公式ドキュメントは[こちら](https://docs.espressif.com/projects/esp-idf/en/latest/get-started-cmake/index.html)

## やり方
以下のREADMEに従って開発環境を構築して下さい。

https://github.com/shungok/esp32-cmake-development-env

上記のREADMEで全て完結するようにしていますが、DockerコンテナにUSBを認識させる方法については、別の記事を書いていますのでそちらも参考にして下さい。（READMEの内容とほぼ同じですが）

[DockerコンテナからUSBデバイスを利用する](https://qiita.com/shungok/items/6c5a7b5a9d63d51e6615)

誰かのお役に立てばありがたき幸せです。

## おわりに
READMEは英語ですが、Chromeの翻訳を使えばそれなりに読めると思います。英語力は皆無なのでおかしな表現がある場合はコメント頂けるとありがたいです。
prometheusをデータソースにしたgrafanaのgroups/tagsの使い方

# モチベーション

grafanaのtemplatingを使ってでprometheusのラベルをガチャガチャやっていると項目が増えてきてポチポチ選ぶのが面倒な場面が出てくると思います。
これを（ある程度）解消できる `groups/tags` という機能があるということで使ってみたのですが思ったより直感的にパパっと使えなかったので理解するためのメモです。

# ゴール

prometheusのlabelの値の一部をtagにして使えるようにする

言葉で説明するの難しい…最終的にできたものを見るのが早い

![tag.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122084/67ccea29-e799-734b-a83c-09973cf1c69b.gif)
こんなのを作る

# やってみよう

## 環境

prometheus 2.10.0
grafana 6.2.2

使用するメトリクス

```
sample_metrics{label="hoge-1"} 1
sample_metrics{label="hoge-2"} 1
sample_metrics{label="hoge-3"} 1
sample_metrics{label="hoge-ex1"} 1
sample_metrics{label="hoge-ex2"} 1
sample_metrics{label="fuga-11"} 1
sample_metrics{label="fuga-12"} 1
sample_metrics{label="fuga-13"} 1
sample_metrics{label="piyo-xxx"} 1
sample_metrics{label="peko-vvv"} 1
```

今回はこの `label` の値の `-` の前の文字列をtagとして利用したいと思います
 `hoge` `fuga` `piyo` `peko` をtagにする想定ですね

grafanaで前もって元になるvariableを設定しておきます
![スクリーンショット 2019-06-13 19.03.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122084/86d3ebb4-7f75-441c-56cb-fb1ca2363935.png)


## 経過

なにはともあれドキュメントを見てみたのですが
https://grafana.com/docs/reference/templating/#value-groups-tags
すごいあっさりしてる…
実験的な機能らしいので仕方ないか

`Tags query` でtagになる項目の一覧を出して
`Tag values query` で出したtagの項目を使ってどうするか
のような感じみたいです。

### Tagを得る

なにはともあれ欲しいtagを得る必要があります。
直書きで列挙したいのですが、そういうのはできずクエリで得る必要があるようです。
prometheusだとこれらを使います
https://grafana.com/docs/features/datasources/prometheus/#templating

これはprometheusのlabel_replaceを使えば多少強引だけどイケる…と思ったらダメみたい。
https://github.com/grafana/grafana/issues/11674
variablesと同じようにregexがあればできるのですがtagはquery一発で出す必要があります。

__どうやら前もってtag用のlabelをメトリクスに付与しておく必要があるみたい__

のでprometheusのconfigで `metric_relabel_config` を使います。
上記のメトリクスに対してこのような感じでrelabelしていきます

```yaml:prometheus.yaml（抜粋）
  - job_name: 'sample'
    static_configs:
      - targets: ['target-host']
    metric_relabel_configs:
      - source_labels: ["label"]
        target_label: tag
        regex: "(.+)-.+"
```

名前 `tag` で対象ラベルの `-` の前の文字列を値にしたラベルが作られます

で、改めて `Tags query` で
`label_values(tag)`
として、今回の目的のtagが得られました

![スクリーンショット 2019-06-13 19.04.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122084/8913983b-0476-8294-7355-c72c447ed010.png)

### Tagを使う
ようやくTagを得ることができましたが、これだけではもちろん動作しません。
![スクリーンショット 2019-06-13 19.16.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122084/8ebc6d0e-5b88-c9f1-2ffc-09f7f8f1daff.png)
動作を `Tag values query` で設定する必要があります。
これはドキュメントに書いてあるように、
__Tagをポチッとやった時に連動させたい値の一覧を得る__
といった感じです。
Tagの値は`$tag`で使うことができます。
今回ですと例えば、
tag `fuga` から `fuga-11` `fuga-12` `fuga-13` を得たい
というようなことになりますので、
`label_values({label=~"$tag.*"},label)`
大体こんな感じです。
![スクリーンショット 2019-06-13 20.24.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122084/f7383ed6-5b3e-a593-0205-c814a480576f.png)

これで今回の目的を達成することができ、冒頭のgifのような動作をすることができるようになりました。

# 雑感やら
あくまで実験的な機能なので多くを期待するのはよくないです。
でもこの先機能が充実していくような雰囲気もあまり感じられないような。

とにかくtagを得るのが面倒すぎではと思うんですけど、他のdatasourceだとこれが使いやすかったりするんでしょうか。
選択ソート

- 最小値を決めるために，その時点での最小値のインデックスを保持しておくことでスワップの回数を減らす

```go
func SelectionSort(target []int) []int {
	for i := 0; i < len(target)-1; i++ {
		minpos := i
		for j := i + 1; j < len(target); j++ {
			if target[minpos] > target[j] {
				minpos = j
			}
			target[minpos], target[i] = target[i], target[minpos]
		}
	}
	return target
}
```
Docker上でRuby ＋ Rails ＋ MySQLの開発環境を構築する

#はじめに
Docker上にRailsの開発環境を構築したのでメモとして残しておく。
#前提
Dockerがインストール済みであること。
・Docker for Windows
https://www.docker.com/docker-windows
・Docker for Mac
https://docs.docker.com/docker-for-mac/install/
#ルートディレクトリの作成
```
$ mkdir myapp
```
#dockerfileの作成
```dockerfile
FROM ruby:2.6.3
ENV LANG C.UTF-8
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN gem install bundler
WORKDIR /tmp
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bundle install
ENV APP_HOME /my_app
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
ADD . $APP_HOME
```
#Gemfileの作成
```Gemfile
source 'https://rubygems.org'
gem 'rails', '5.2.3'
```
#空のGemfile.lockを作成
```
$ touch Gemfile.lock
```
#docker-compose.ymlの作成
```docker-compose.yml
version: '3'
services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/my_app
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: mysql:5.7
    volumes:
      - .mysql_data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=password
```
#rails newの実行
```
$ docker-compose run web rails new . --force --database=mysql --skip-bundle
```
**rails new**でアプリケーションのひな形となるディレクトリやファイルが自動生成される。
後で再度ビルドを行う必要がある為、**--skip-bundle**でビルドをスキップする。
#Gemfileの編集

```
gem 'mini_racer', platforms: :ruby
```
Javascriptの実行エンジンであるv8を叩ける用にしてくれるgemである、mini_racerのコメントをはずす
#buildの実行
```
$ docker-compose build
```
#database.ymlの編集
```database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db
```
configフォルダ配下にあるdatabase.ymlの以下のように編集
 ・password
　 docker-compose.ymlの**MYSQL_ROOT_PASSWORD**の値にする。
 ・host
　 docker-compose.ymlの**depends_on**の値にする。
#コンテナを起動
```
$ docker-compose up -d
```
後で起動中のコンテナに入りrailsコマンドを実行する為、-dでバックグラウンドで実行しておく。
#modelの作成
起動中のコンテナの一覧を確認する。

```
$ docker ps
```
以下の様に一覧が表示される。

```
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
c27856156df0        my_app_web          "bundle exec rails s…"   5 seconds ago       Up 4 seconds        0.0.0.0:3000->3000/tcp   my_app_web_1
f3c12d1b91be        mysql:5.7           "docker-entrypoint.s…"   About an hour ago   Up About an hour    3306/tcp, 33060/tcp      my_app_db_1
```
**docker exec**でRailsアプリのコンテナに入る。

```
$ docker exec -it my_app_web_1 sh
```
modelを作成する為にrailsコマンドを実行する。

```
$ rails db:create
```
#localhost:3000に接続する
<img width="947" alt="welcom_rails.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436607/b447bb0d-637d-b155-4ccd-5db03717343f.png">
無事に開発環境が構築されました。:clap: