OmniAICreator/Qiita-1.07M huggingface dataset:
1つのフォームで複数のモデルを同時に送信

# １つのフォームで複数のモデルの登録を同時にしたい時の書き方
個人の備忘録として残してあります。
Slimで表記しています。


# has_one の場合(Userがペット１匹しか持てない前提)

```ruby:user.rb

class User < ApplicationRecord
  has_one :pet
  accepts_nested_attributes_for :pet #子として扱うものを追記。複数記述可。
end

class Pet < ApplicationRecord
  belongs_to :user
end
```



```ruby:users.html.slim
 h1 新規作成ページ

  # Userモデル
= form_with model: @user, local: true do |f|
  .form-group
    = f.label :user_name
    = f.text_field :user_name

  # ここからPetモデル
  = f.fields_for :pet do |pet|
    .form-group
      = pet.label :pet_name
      = pet.text_field :pet_name

  = f.submit "とうろく"
```

```ruby:users_controller.rb
  def new
    @user = User.new
    @user.build_pet #has_oneは @user.build_モデル名
    # has_manyは@user.pets.build
  end

  def create
    user = User.new(user_params)
    user.save
    end
  end

  private

  def user_params
    params.require(:user).permit(:name, pet_attributes:[:pet_name])
    # f.fields_forで指定したモデル名_attributes:[:取得したい値]
  end
```
【Jenkins】Pipelineのstage間で変数を引き回す

# 対象読者

* Jenkins Pipeline初心者向け
* Pipelineの仕組みもそこまで深く理解していない方向け

# 背景
最近ようやっとJenkinsジョブをコード管理せねばと思い立って、Webコンソールに直書きしていたジョブたちをコードに起こす作業に取り掛かりました。
既存のジョブではシェルの実行結果を次のシェルや後続のジョブへ引き回すために、[EnvInject Plugin](https://wiki.jenkins.io/display/JENKINS/EnvInject+Plugin)を用いて環境変数のインジェクトをよく行なっていました。
ところがPipelineになるとこれまで通り「テキストファイルに値を書き込んでその値をインジェクトする」使い方が見つけられなかったため、他の方法がないかと試行錯誤したところ、stage間でシェルの実行結果を引き回せることに気付いたのでここに記します。

# サンプルコード
こちらのコードでは、Androidアプリをビルドした後にそのアプリの情報をbuild.gradleファイルから引っ張り出して、その値を次のstageで利用するサンプルになっています。
（ビルドのシェルは省略しています。）

```:サンプルコード
pipeline {
    stages {
        stage('Build App') {
            steps {
                sh'''
                    # Androidアプリのビルド
                '''
            }
        }
        stage('Read App Info') {
            steps {
                script {
                    MIN_SDK_VERSION = sh(script: "cat mobile/build.gradle | grep \"minSdkVersion\" | sed -e \"s/[^0-9]//g\"", returnStdout: true)
                    TARGET_SDK_VERSION = sh(script: "cat mobile/build.gradle | grep \"targetSdkVersion\" | sed -e \"s/[^0-9]//g\"", returnStdout: true)
                    COMPILE_SDK_VERSION = sh(script: "cat mobile/build.gradle | grep \"compileSdkVersion\" | sed -e \"s/[^0-9]//g\"", returnStdout: true)
                    BUILD_TOOLS_VERSION = sh(script: "cat mobile/build.gradle | grep \"buildToolsVersion\" | grep -o -E \"[0-9]+.[0-9]+.[0-9]+\"", returnStdout: true)
                }
            }
        }
        stage('Print App Info') {
            steps {
                script {
                    print MIN_SDK_VERSION
                    print TARGET_SDK_VERSION
                    print COMPILE_SDK_VERSION
                    print BUILD_TOOLS_VERSION
                }
            }
        }
    }
}
```

```:実行結果
[Pipeline] echo
19

[Pipeline] echo
27

[Pipeline] echo
27

[Pipeline] echo
27.0.3
```

`Read App Info`のscriptで生成した変数が次のstageである`Print App Info`にも引き回せました。
SSHポート番号を変更したら繋がらなくなった（さくらVPS CentOS7）

# ポート番号を変更したら繋がらない
さくらVPSのCentOS7を再インストールし、公開鍵を使ったログイン設定したところまではSSHで繋がっていたのですが、ポート番号を変更し、ファイアウォールを設定したあと、繋がらなくなりました。

ディフォルトで起動しているはずのファイアウォールが止まっていたので不可解でしたが、調べたところ、2019年06月27日にさくらVPSが「パケットフィルタ」の提供を開始したことにより、CentOS7のデフォルト設定からファイアウォール起動が外されたようです。

パケットフィルタは、さくらVPSのコントロールパネルからポートの有効・無効を設定出来る機能で、このパケットフィルタ使用がデフォルトで有効になっているため、ファイアウォールが無効になったようです。
なので、ファイアウォールを使用せずパケットフィルタを使おうと思ったのですが、SSHだとポート22が固定で変更出来ないようです。
ちなみに設定できるポートは以下です。

|項目|ポート|
|--:|:--|
|SSH|22|
|Web|80/443|
|FTP|20/21|
|メール|25/110/143/465/587/993/995|

この中で、SSHだけがデフォルトで有効になっています。
このせいで、SSHのポート番号を変更すると、いくらファイアウォールを設定しても繋がらなくなってしまいます。
同様に、Webを有効にしないと、Webサーバー繋がりません。

ということで、パケットフィルタは無効にしました。
変更は、さくらVPSのコントロールパネルから行います。

# パケットフィルタを無効に
* コントロールパネルを開き、[パケットフィルタ]を選択
            <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222823/8dc9b732-f61c-dcf9-e9b4-e9f2b49493ed.png" width=500>

* [パケットフィルタ設定へ>]を選択
            <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222823/1e1e6635-c8f3-8bf2-c162-7a0f4ed72117.png" width=500>

* [利用しない]を選択し、[設定]をクリック
            <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222823/85e8879d-beae-292b-7bce-f3ca8d33d25c.png" width=500>
当月の範囲選択で最後日が出なくてハマったこと

# 言語
 Ruby on Rails

# 問題
7月1日～7月31日のデータを表示しようとしていたが、
31日のデータだけ一覧に出てこないバグが発生していた。

※追記2：ついでに7月1日0時～8時59分までの間も出ていなかった。

↓ハマっていたコード

```
date = Date.today
Test.where("? <= created_at && created_at <= ?",date.beginning_of_month,date.end_of_month)
```

# 原因
発行されたSQL文を確認したところ、
7月1日0時0分0秒～7月31日0時0分0秒に該当するレコードで検索していた。

```
date = Date.today
Test.where("? <= created_at && created_at <= ?",date.beginning_of_month,date.end_of_month.end_of_day)
=>SELECT `tests`.* FROM `tests`  WHERE ('2019-07-01' <= exit_time && entrance_time <= '2019-07-31')
```

# 解決法
7月1日0時0分0秒～7月31日23時59分59秒に修正すると全部出た。
end_of_dayメソッド追加(その日の終わりの時刻)

```
date = Date.today
Test.where("? <= created_at && created_at <= ?",date.beginning_of_month,date.end_of_month.end_of_day)
=>SELECT `tests'.* FROM `tests`  WHERE ('2019-07-01' <= exit_time && entrance_time <= '2019-07-31 14:59:59')
```

# 所感
日付だけで選択すると0時0分0秒で検索することになるんですね。
意外なところでつまづいてしまい解決に時間がかかりました。

# 追記（Timeオブジェクトを使用する）
Timeオブジェクトを使用することで、end_of_monthのみで動作するとコメントからのご指摘がありました。ありがとうございます。

```
Date.today.end_of_month #=> Sat, 31 Aug 2019
Time.current.end_of_month #=> Sat, 31 Aug 2019 23:59:59 JST +09:00
```

# 追記2（7月1日0時～8時59分が出ていない）
まだバグがありました。

DBには時差を引いた時間で登録しています。(-9時間で登録)
現実の7月1日0時～8時59分は、DB上では6月30日15時0分～6月30日23時59分になるわけです。

その状況でDBに7月1日からのデータをくれと言ったら出てこないですよね。

#解決法2
6月30日15時0分0秒から7月31日14時59分59秒でSQL文を発行する
beginning_of_dayメソッド追加(その日の始まりの時刻)

```
#発行されたSQL文
date = Date.today
Test.where("? <= created_at && created_at <= ?",date.beginning_of_month.beginning_of_day,date.end_of_month.end_of_day)
=>SELECT `tests'.* FROM `tests`  WHERE ('2019-06-30 15:00:00' <= exit_time && entrance_time <= '2019-07-31 14:59:59')
```

# 所感2
長い……長すぎる……。全然スマートじゃないし。
DateオブジェクトではなくTimeオブジェクト使った方が良いですね。
いい勉強になりました。

```
#発行されたSQL文
date = Date.today
Test.where("? <= created_at && created_at <= ?",date.beginning_of_month.beginning_of_day,date.end_of_month.end_of_day)
=>SELECT `tests'.* FROM `tests`  WHERE ('2019-06-30 15:00:00' <= exit_time && entrance_time <= '2019-07-31 14:59:59')

current = Time.current
Test.where("? <= dcreated_at && created_at <= ?",current.beginning_of_month,current.end_of_month)
=>SELECT `tests'.* FROM `tests`  WHERE ('2019-06-30 15:00:00' <= exit_time && entrance_time <= '2019-07-31 14:59:59')
```
鍵認証でGitHubに接続する方法

## GitHubで鍵認証をするための秘密鍵と公開鍵のペアを作成する

まずはローカル環境で公開鍵と秘密鍵のペアを作成します。

```
$ mkdir ~/.ssh
$ cd ~/.ssh
$ ssh-keygen -t rsa
```

秘密鍵のパーミッションを変更します。

```
$ chmod 600 id_rsa
```

上記のコマンドでid_rsaという秘密鍵とid_rsa.pubという公開鍵を作成することができました。
この鍵のペアをGitHubとの鍵認証に使っていきます。

## 秘密鍵をローカルに、公開鍵をGitHubに登録する
```
$ vi ~/.ssh/config

Host github.com
  User git
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa
```


次に公開鍵をGitHubに登録していきます。

まずは、GitHubのマイページにある『Settings』を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140792/eb2b7e81-5da0-8658-a374-bf0244b020a2.png)


『SSH and GPG keys』という項目を選択し、『New SSH key』のボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140792/5da05a9a-36c1-0f8c-f2fb-d548872e552c.png)



すると、以下のようなテキストフィールドが出てくるのでここに公開鍵(今回の例で言えばid_rsa.pub)の中身の文字列をコピペします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140792/e23c7af1-fa92-6871-dfc9-eb0ae792dce3.png)



ここまでできたら公開鍵と秘密鍵のペアの設定が完了です。

以下のコマンドを実行してGitHubとssh接続できるのか確認してみます。

初回のssh接続のときには接続をするかどうかを聞かれるので、yesと答えます。
`Hi [ユーザー名]`と返信がくればsshで接続ができていることになります。

```
$ ssh -T git@github.com
The authenticity of host 'github.com (192.30.255.112)' can't be established.
RSA key fingerprint is xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.255.112' (RSA) to the list of known hosts.
Hi nishina555! You've successfully authenticated, but GitHub does not provide shell access.
```


## さいごに
鍵認証でGitHubに接続することができればユーザー名とパスワードを入力することなくpushを実行することができるようになります。
パスワード認証なしてGitHubにpushする手順は[『Gitにパスワード認証なしでPushするまでの手順』](https://nishinatoshiharu.com/how-to-gitpush-with-ssh/)で紹介していますので、興味のある方はご覧になってください。

ツイッター(<a href="https://twitter.com/nishina555" target="_blank" rel="noopener">@nishina555</a>)やってます。フォローしてもらえるとうれしいです！
axiosでのJSONファイル読み込み時にキャッシュを無視する

当方JavaScript初心者です。頑張ります。

## やりたいこと
AWS Lambdaにより定期的に更新されるJSONファイルをwebサイト側にも反映させたい。

## 生じていた問題
キャッシュのせいでファイルが更新されたことになっていなかった。

## 対処
GETリクエストの際に渡すパラメータにタイムスタンプを手動で付与する。
下記コード内での`?timestamp=${new Date().getTime()}`の部分です。

```javascript
  setInterval(function update_members(members){
    axios.get('URL?timestamp=${new Date().getTime()}',headers)
        .then(response => {
          res = response.data;
          console.log(res);
          });
        }).catch( error => { console.log(error); });
  },10000);
```

## 参考
https://stackoverflow.com/questions/49263559/using-javascript-axios-fetch-can-you-disable-browser-cache
Zabbix Windowsイベントログ監視で重度障害の通知がこない

# 調査

重度障害のトリガーを追加したのにな。設定みてもトリガーはあるのでイベントログ発生してみた。

```
eventcreate /ID 100 /L Application /SO Cmd /T ERROR /D "Package index-update failed.ログ通知テスト"
```

ふむ・・・こない。

# 原因

トリガーの依存関係が逆になっていた。
依存関係設定は障害度の低いトリガーからつけること。たまにの作業なんでどっちだったっけーで適当につけたかな。

# 設定

### 管理→一般設定→正規表現
  * 名前：windows_eventlog
  * 条件式：
    * 1» データの破損|エラー状態は深刻|ログがいっぱい|ディスク領域が不足|十分な空き領域|障害が発生|Package|Licensing|KRB_AP_ERR_MODIFIED|マルウェア [結果が真]
    * 2» TLS|見つかりません[結果が偽]

### アイテム

```bash
eventlog[Application,@windows_eventlog,"Error|Critical|Failure Audit"]
```

### トリガー
  * 警告: 依存関係（重度障害指定）

```bash
{pubdb:eventlog[Application,@windows_eventlog,"Error|Critical|Failure Audit"].nodata(10m)}=0
```

  * 重度障害

```bash
{pubdb:eventlog[Application,@windows_eventlog,"Error|Critical|Failure Audit"].iregexp(Package)}=1
```

# 参考
障害対策会議で障害原因の話から通知失敗に話題をかえようとしたので怒った。騙されないぞ＾＾
恥知らずは正義がない。
Heroku Button (app.json) でDocker Containerを使う

最近はDockerを使ってアプリケーションの実行環境を作ることが多いです。Heroku Buttonでワンクリックデプロイをする時も、Dockerを使いたい・・・！ものです。

HerokuにおけるDockerを使ったデプロイは、`heroku.yml`で定義できます。`app.json`から`heroku.yml`を呼び出すことで、Heroku ButtonでもDockerを使ったデプロイが使えます。

* [Building Docker Images with heroku.yml](https://devcenter.heroku.com/articles/build-docker-images-heroku-yml#review-apps-and-app-json)

最もシンプルな`heroku.yml`は以下のようになります。

```yml
build:
  docker:
    web: Dockerfile
run:
  web: bundle exec puma -C config/puma.rb
```

1. `build`: アプリケーションのルートにある`Dockerfile`を使用して`web`というイメージを作成。
2. `run`: `web`イメージから作成したコンテナでコマンドを実行。

`run`がない場合、`Dockerfile`の`CMD`が`run`の代わりになります(普通はこちらの方が多いと思います)。

`setup`のセクションで環境変数やアドオン、`release`でデプロイ前に実行する処理などを指定できます。これらは、`app.json`側でも定義が可能です。`app.json`の`scripts`に`postdeploy`を指定しておけば、Dockerで実行環境を作ったうえで`postdeploy`が実行できます。将来的には`heroku.yml`に統合されていくかもしれません。

`app.json`では、`heroku.yml`を参照するよう`stack`に`container`を指定します。

```json
{
  "stack": "container" 
}
```

こうすることでHeroku Button => `app.json` => `heroku.yml`といった形で参照が行われ、Heroku ButtonでもDockerを使ったデプロイが可能になります。
Rubyスクレイピングで超絶楽をする（店舗情報編）

以前、アサインされた案件で静的サイトをWordPressにしてリニューアルする事がありました。
その際、特定ページの店舗情報の量がエグくて、店舗情報はDB管理されてない状態。。
数百件をひとつひとつコピペはダサいので、スクレイピングして全件取得した時のコードです。

特定のリンク先をスクレイピングして、その情報をCSVに出力。といった感じです。
色んなサイトを参考にしたので、色々間違えてるとこもあるかもしれません。

#スクレイピングで使用したソースコード
取得するのは、
- 店舗名
- 電話番号
- 郵便番号
- 住所
- 建物名
- グーグルマップのリンク先
- 店舗サイトのリンク先
になります。

```ruby
require 'open-uri'
require 'nokogiri'
require 'csv'

url = 'http://www.sample.jp/' #スクレイピング先のURL
charset = nil
html = open(url) do |f|
  charset = f.charset # 文字種別を取得
  f.read # htmlを読み込んで変数htmlに渡す
end
ps = []

# htmlをパース(解析)してオブジェクトを生成
doc = Nokogiri::HTML(html, 'nil', 'utf-8')
doc.xpath('//div[contains(@class,"storebox")]').each do |node| #クラス名.storeboxの数
  data = []
  storename = node.css('div.storename').inner_text
  storead = node.css('div.storead').inner_text
  link = node.css('div.storemap>a')[0][:href]
  if !node.css('.storeurl a').empty? #.storeurl aが空じゃなかったらhrefを取得
    storeurl = node.css('.storeurl a').attribute("href").value
  end
  data.push(storename.tosjis)
  data.push(storead.tosjis)
  data.push(link)
  data.push(storeurl)
  ps.push(data)
end

# CSV出力と同時にターミナルにも内容を出力
test = CSV.open("sample.csv", "w") do |csv|
  ps.each do |row|
    csv << row
  end
end
puts test
```

こんな感じで、Ruby分からないって人でもちょっと調べれば簡単にWEBスクレイピングが出来ます。
スクレイピングする際の注意点として、スクレイピング先のサーバーに負荷をかけてしまうので、なるべく最小限の回数にしましょう。
VB.NetでUTF8・BOMなしのファイルを作成

業務用のプログラムで文字化けが発生しましたので、色々テストしてみました。

UTF8を指定して出力ファイルを作成したのに、SJISを指定してファイル内容をプログラムで抽出しても文字化けが発生しないことは悩みました。

ファイル作成のコードは以下の通りです。

```vb
...(略)...
sw = New StreamWriter(tbOutput.Text, False, Encoding.GetEncoding("utf-8"))
...(略)...
```

sakuraエディターで出力ファイルを開いたら、「UTF8」ではなく、「UTF8 BOM付き」であることを気付きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188794/7865105e-0449-8bee-5c9a-e082bf47a0a9.png)

コードを以下のように変更したらUTF8かつBOM無しのファイルを作成できました。

```vb
...(略)...
sw = New StreamWriter(tbOutput.Text, False, New UTF8Encoding(False))
...(略)...
```

変更後の出力ファイルを再度sakuraエディターで開いたら予想通り「UTF8」と表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188794/fd91df13-cf51-5653-3446-e0187b0b47e5.png)

BOM無しのファイルをSJISで開いたら、予想通り文字化けは発生しました！
テスト完了です！！！

※追記
テキストエディターで開いたら、BOM付きとBOM無しの内容は同じように見えますが、バイトで確認するとBOM付きのほうは3バイト多いことが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188794/55841e30-2944-67bf-7366-15277e7f9e94.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188794/a0cf7bf7-9599-bc01-79bc-6fd981d84d2e.png)
Vueはルートの要素に1度だけmountするんだってさ

# コンポーネント？まぁ使わなくてもいけるでしょ

めんどくさがりやさんのぼくはVue.jsを使おうとしたにも関わらず、
公式のドキュメントを読まないおバカさんでした。

「だってなんか英語を翻訳したみたいな言葉で読みづらいんだモーン」

やがて、こんなことをしたくなってしまうのでした。

・
・
・

* ページにViewModel（Vueインスタンス）をmountしたい
* ページの一部分に別のViewModel（Vueインスタンス）をmountしたい


※イメージ

```html
<div id="app">
  <q-btn @click="greet">greet</q-btn>
    <div id="app2">
    <q-btn @click="greet2">greet2</q-btn>
  </div>
</div>
<script>
    var app = new Vue({
    methods:{
      greet(){
        alert("hello app!")
      }
    }
  }).$mount("#app")
  var app2 = new Vue({
    methods:{
      greet2(){
        alert("hello app2!")
      }
    }
  }).$mount("#app2")
</script>
```

「なんとなくこうすりゃいいカンジあるな･･･」

## とりあえずmountしてみてプロパティみてみる

```html
<div id="app">
  {{msg}}
  <q-btn @click="greet">greet</q-btn>
    <div id="app2">
    {{msg}}
    <q-btn @click="greet2">greet2</q-btn>
  </div>
</div>
<script>
  var app = new Vue({
    data(){
      return{
        msg: "おはよう" // 表示される
      }
    },  
    methods:{
      greet(){
        alert("hello app!")
      }
    }
  }).$mount("#app")
  var app2 = new Vue({
    data(){
      return{
        msg: "こんちは" // 表示される
      }
    },
    methods:{
      greet2(){
        alert("hello app2!")
      }
    }
  }).$mount("#app2")
</script>
```
プロパティはバインドできている！！
おらおらおら～～～～～リファレンスなんて必要ないぜ～～～

## メソッドも使えるでしょ？

```html
<div id="app">
  {{msg}}
  <q-btn @click="greet">greet</q-btn>
    <div id="app2">
    {{msg}}
    <q-btn @click="greet2">greet2</q-btn>
  </div>
</div>
<script>
  var app = new Vue({
    data(){
      return{
        msg: "おはよう" // 表示される
      }
    },  
    methods:{
      greet(){
        alert("hello app!") // アラートがちゃんとでる
      }
    }
  }).$mount("#app")
  var app2 = new Vue({
    data(){
      return{
        msg: "こんちは" // 表示される
      }
    },
    methods:{
      greet2(){
        alert("hello app2!") // アラートがでない
      }
    }
  }).$mount("#app2")
</script>
```

「あっ･･･」

ゼウス「vueはルートの要素に1度だけmount。アプリつくってくときはほとんどコンポーネントになるよ。」

# 感想

リファレンス読もうっと。
https://jp.vuejs.org/v2/guide/
在 URLComponent 使用 URLQueryItem

在 URLComponent 這個 class 裡面，可以用 URLQueryItem 定義的方式，在不需要自己編碼的情形下，就可以輕鬆設定好網址中的 query string 。

## Query String

維基百科： https://en.wikipedia.org/wiki/Query_string

```
// 範例網址
https://example.com?item%20type=%E7%94%A2%E5%93%81&size=small&current
```

簡單來說，就是問號後面，以 key/value 成對的存在或是只有 key （如下表），用 `&` 串起來的字串。

| Original Key | Original Value | Encoded Key | Encoded Value |
|:---:|:---:|:---:|:---:|
|item type| 產品 | item%20type | %E7%94%A2%E5%93%81 |
|size| small | size | small |
|current|| current | |

## 優點

在 key 或是 value 裡面有空白或是網址不友善的字串的時候，都需要自己把那些字串轉換成適當的字串 (URL encode) 。但是 URLQueryItem 則可以直接幫忙編碼就不需要自己處理了。

## 用法

首先先建立一個簡易的 URLComponent

``` swift
var component = URLComponents(string: "https://example.com")
```

接著只要這樣設定 query items 即可不需要自己做 URL encode，

```swift
component?.queryItems = [
    URLQueryItem(name: "item key", value: "產品"),
    URLQueryItem(name: "size", value: "small"),
    URLQueryItem(name: "current", value: nil)
]
```

印印看

```swift
print(component?.url)
```

看 console output ，就可以發現她幫我們很漂亮的編碼完了：

```
Optional(https://example.com?item%20type=%E7%94%A2%E5%93%81&size=small&current)
```

以上。

## 環境

這篇的程式碼在以下的環境中正常執行：

- Xcode Version 10.2.1 (10E1001)
- Swift 5
- Playground

## 參考連結

- https://developer.apple.com/documentation/foundation/urlcomponents/1779966-queryitems
- https://developer.apple.com/documentation/foundation/urlqueryitem
esp32内蔵DACとトランジスタで波形音を遊ぶ

esp32で音を扱いたくて、その前にトランジスタをあまり扱ってなかったので実験と遊びです
ArduinoIDEでやっていきます

# 環境
MacOS v10.14.3
ArduinoIDE v1.8.8
ESP32(Arduinoボード) v1.0.2
ESP32-DevKitC http://akizukidenshi.com/catalog/g/gM-11819/
トランジスタ 2SA1015GR http://akizukidenshi.com/catalog/g/gI-00882/
このトランジスタはなんか近くにあったのでこれを使ってみます

# esp32の内蔵DACを利用

## 参考サイト
* https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/dac.html
* https://circuits4you.com/2018/12/31/esp32-dac-example/

## サンプルコード

```c:dacTest1.ino

double i=0.0;
void setup() {
  Serial.begin(115200);
}
void loop() {
//  Serial.println(128+128*sin(i));
  dacWrite(25, 128+128*sin(i));
  i+=0.01;
}

```

いたってシンプルでした
esp32の内蔵dacはgpio25と26固定らしく、今回は25を利用しました
参考サイトの上のやつではdac.hをインクルードしていて、それを使えばDAC_CHANNEL_1という定数が使えますね
そして単純にsin()を利用して0〜255の値でsin波を生成しdacWrite()で出力しています

## 配線
![IMG_1122のコピー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76572/a01748e5-350c-ec3c-eef0-25dbe4c555e4.jpeg)

## 結果
音はなったが小さいです
そしてpwmで出すビープ音とあまり変わらない気が...

# sin波以外も試す
## 参考サイト
* https://github.com/G6EJD/ESP32-DAC-Examples

## サンプルコード
参考サイトのまんまです

```c:dacTest2.ino

void setup() {
  Serial.begin(115200);
}

void loop() { // Generate a Sine wave
  for (int deg = 0; deg < 360; deg = deg + 8){
    dacWrite(25, int(128 + 80 * (sin(deg*PI/180)+1/pow(3,2)*sin(3*deg*PI/180)+1/pow(5,2)*sin(5*deg*PI/180)+1/pow(7,2)*sin(7*deg*PI/180)+1/pow(9,2)*sin(9*deg*PI/180)))); // Triangle
  }
}

```

参考サイトの「ESP32_DAC_Simple.ino」からSquareからTriangleに変えてみたものです

## 結果
なんか変わった気がするが、やはり小さい？

# トランジスタを使うぞ！

## 参考サイト
* http://www.kotaden.com/stage5_1_index.html

ここのサイトがなんか面白そうだったので同じようにやってみるぞ！
人が端子に両手で触れて、微量な電流をトランジスタのベースに送り、音量を変化させたい

先ほどのソースコードから変えずに配線だけ変更します

## 配線
![IMG_1121のコピー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76572/71d6155f-f451-341f-2181-2f363734300b.jpeg)

参考サイトと違うところは5v出力なところと、抵抗を120Ωにしています
写真左と下側に伸びている赤と黄色を触れば音がでるはずです

## 結果
結局音は小さいですが動画をどうぞ

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">音が小さいが端子を触って音が出たり触る感じで音量変化<br>トランジスタの練習〜 <a href="https://t.co/XEa6ImjADm">pic.twitter.com/XEa6ImjADm</a></p>&mdash; るしわん (@tkyko13) <a href="https://twitter.com/tkyko13/status/1156781330715181056?ref_src=twsrc%5Etfw">2019年8月1日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


あまりぎゅっと触ると電流が流れずらいのか逆に音が小さくなるっぽくて面白いですね
あ〜最初から作りたかったものから遠ざかる気がする〜が面白いのできそ〜
CollectionViewのCellをタップ中に小さくなるアニメーションのやり方

#目的
UICollectionViewCellをタップしたときにアニメーションをつけることができたのでメモとして残しておこうと思います。
それに、UIButtonでタップした時のアニメーションをつけるやり方を書いてある記事はありますが、CollectionViewのCellをタップした時のアニメーションについて書いてある記事があまりない気がしました。
(まだiOS開発初心者なので、改善点などありましたらぜひ教えてください！笑)

#Cellをタップした時のアニメーションを実装したもの
今回実装するのはこんな感じです。
![collectionViewCellAnimation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474449/54f15e76-f8b9-203a-6581-3df30cb0bba5.gif)
#CellのisHighlightedをoverrideする
collectionViewのCustomCellでisHighlightedという変数をoverride。
didSetの中にタップされたかどうかをif文で分岐させます。

```swift:CollectionViewCell.swift
class CollectionViewCell: UICollectionViewCell {

    override func awakeFromNib() {
        super.awakeFromNib()

    }
    override var isHighlighted: Bool {
        didSet {
            if self.isHighlighted {
                //タップされた時の処理を書く
            } else {
                //指が離れた時の処理を書く
            }
    }
}
```
こんな感じに書きます。
ここではタップされている状態でtrueになるタップしている指が離れるとfalseになります。
選択されたかどうかを判別するisSelectedという変数もありますが、Highlightの方が良いそうです。

##Cellにアニメーションをつける
次にアニメーションをCoreAnimationのCABasicAnimationを使って実装します。

###タップされた時にCellを小さくする

```swift
if self.isHighlighted {
    let shrink = CABasicAnimation(keyPath: "transform.scale")
    //アニメーションの間隔
    shrink.duration = 0.1
    //1.0から0.95に小さくする
    shrink.fromValue = 1.0
    shrink.toValue = 0.95
    //自動で元に戻るか
    shrink.autoreverses = false
    //繰り返す回数を1回にする
    shrink.repeatCount = 1
    //アニメーションが終了した状態を維持する
    shrink.isRemovedOnCompletion = false
    shrink.fillMode = CAMediaTimingFillMode.forwards
    //アニメーションの追加
    self.layer.add(shrink, forKey: "shrink")
}
```
###指が離れた時にCellを元の大きさに戻す

```swift
else {
    let shrink = CABasicAnimation(keyPath: "transform.scale")
    //アニメーションの間隔
    shrink.duration = 0.2
    //1.0から0.95に小さくする
    shrink.fromValue = 1.0
    shrink.toValue = 0.95
    //自動で元に戻るか
    shrink.autoreverses = false
    //繰り返す回数を1回にする
    shrink.repeatCount = 1
    //アニメーションが終了した状態を維持する
    shrink.isRemovedOnCompletion = false
    shrink.fillMode = CAMediaTimingFillMode.forwards
    //アニメーションの追加
    self.layer.add(shrink, forKey: "shrink")
}
```
各値はシミュレーションをしてみて好きな値に変えてみてください。

#参考にした記事
Cellを小さくしたり大きくしたりするアニメーションはk-boyさんの「Snapchatのボタンみたいにタップ中に大きくなるUIButtonの作り方」という記事を参考にしました！
(https://qiita.com/k-boy/items/dda6db0b822b098b7687)

CellのisHighlightを使うのはxykのブログさんの「SwiftでON・OFFの切り替えをする円形ボタンを作る」という記事を参考にしました！(http://xyk.hatenablog.com/entry/2017/01/23/145305)

#さいごに
今回はCustomCellでアニメーションをつけましたが、CustomCellを使わずいやる方法も次の機会にやってみようと思います。
まだわからないことだらけなので、間違っていることや別の方法があれば教えてもらえると嬉しいです！
スターリンソートをJavaで実装してみた

#概要
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ソートされていない要素を粛清することでO(N)でソートできるスターリンソートとかいうのを見て爆笑してる</p>&mdash; やんぎん (@4116You) <a href="https://twitter.com/4116You/status/1155619860027547648?ref_src=twsrc%5Etfw">2019年7月28日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Javaでこれを実装してみます。
Kotlinは既にあったけど、やりたかったのでやりました！

#引用元
[計算量O(n)の画期的なソートアルゴリズムであるスターリンソートをHaskell で実装してみた #Haskell](https://qiita.com/Tatsuki-I/items/380d6bd06515b872b2b2)

#ソースコード
```StalinSort.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class StalinSort {
	public static void main(String[] args) {
		Integer[] data = {1,3,4,2,3,7,3,9};
		Integer tmp = data[0];
		List<Integer> index = new ArrayList<Integer>();

		for (int i = 1; i < data.length; i++) {
			if (tmp > data[i]) {
				index.add(i);
			} else {
				tmp = data[i];
			}
		}

		List<Integer> list = new ArrayList<Integer>(Arrays.asList(data));

		for (int j = index.size(); j > 0; j--) {
			int num = index.get(j - 1);
			list.remove(num);
		}

		System.out.println(list);
	}
}
```
ちょっと長いかもですがこんな感じに。
結果は以下のように。

```
[1, 3, 4, 7, 9]
```
ちゃんと2,3,3が粛清されてくれました。

#最後に
個人的にはInteger型とremove(int i)について勉強になったので一歩前進かなといったところです。

#編集履歴
2019/08/02
 コメントでご指摘のあったfor文の改善。
ECSのENI上限引き上げ

# ECS with awsvpc on EC2

10年ぶりくらいに書くので口調を忘れました。昔の記事と違ってたらすいません。

## TL;DR

ENI上限を引き上げるには **デフォルトのawsvpcTrunkingをenabledにすれば良い**

## EC2 vs Fargate

ECSはVPCネットワーキング(awsvpc)で使う方が楽で、かつVPCを使う場合はFargateを使う方が楽です。
ただ、敢えて苦難の道を選びEC2コンテナインスタンスを使うメリットももちろんあります。

## EC2のメリット

### Fargateより安い
Fargateが値下げされたので今は変わらないかも。

### ログドライバにawslogs以外を選べる
Fargateだとawslogsしか（splunkも選べるようになったけど)選べません。
特にデバッグの時にcloudwatchを見るのはとてもつらいので、jsonfileやfluentdを使いたくなります。

### docker execで中に入れる
コンテナインスタンスにsshして `docker exec` でコンテナの中に入ることができます。
Fargateではできませんが、将来sshできるようにするという計画が発表されてるようなので今だけかも。

今回のプロダクトの場合、本番運用はFargateで、ステージング環境をEC2にすることにしました。

## ENIの上限

さて、ネットワーキングをbridgeにすると、同じインスタンス上で走るコンテナ同士でポートがぶつからないよう工夫する必要があります。
特にマイクロサービス化されている場合、これはとてもやってられないですね。
VPCを使うとポートは使いたい放題(ただし外部との接続はロードバランサを経由する必要がある)、同じタスク内のコンテナ同士もlocalhostでやり取りできます。
が、VPCの場合コンテナごとにENI(Elastic Network Interface)が割り当てられ、その上限がEC2インスタンスごとに決まっています。
上限が`large`インスタンスでも2個とかなので、現実的にVPCでの運用は不可能です。
で、この上限を大幅に緩和するオプションがあって、`awsvpcTrunking` というのを有効にすると一気に5倍くらいに緩和されます。
`large`インスタンスで10個になるのでこれなら普通に運用できるでしょう。

## 上限緩和の方法

consoleのECSのメニューに`Account Settings`というのがあります。

![awsmenu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2346/8ecccf45-fd50-78cd-e136-08fc5f9d92ea.png)

この中に`awsvpcTrunking`という項目があって、これをチェックすれば有効になります。

![trunking.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2346/d858c03e-9510-a687-5435-8dcde7ba85d7.png)

わぁ簡単。

と思いきや。説明を良く読みましょう。

![trunking2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2346/27df909a-a311-55e6-34c1-32d83809e5bf.png)

ここをチェックしても自分のロールにしか有効にならないので、ECSのサービスロールに対して？awsvpcTrunkingを有効にする必要があるようです。
というわけでサービスロールに付与してみます。

```
aws ecs put-account-setting --name awsvpcTrunking --value enabled --principal-arn arn:aws:iam::xxxx:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS
```

が、rootアカウントでないとサービスロールに権限は付与できないよ、と言われてしまいました。

[(なんだか複雑な)ドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/container-instance-eni.html)を読むと、`コマンドラインを使用して、引き上げられた ENI 制限にアカウントのすべての IAM ユーザーまたはロールをオプトインするには`という項目があり、全てのロールについて有効にできるようです。
やってみます。

```
aws ecs put-account-setting-default --name awsvpcTrunking --value enabled
```

できました。
有効にした後に起動したインスタンスのみ、awsvpcTrunkingが有効になっています。

## 確認

画面からでは分からない

![runking4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2346/0ca8ef20-09fc-fe27-554a-6124808a4b70.png)

(この「ポート」が増えるわけではないらしい)

aws-sdkで確認

```sh
% aws ecs list-attributes --cluster hoge-cluster --target-type container-instance --attribute-name ecs.awsvpc-trunk-id
{
    "attributes": [
        {
            "name": "ecs.awsvpc-trunk-id",
            "value": "xxxx",
            "targetId": "arn:aws:ecs:ap-northeast-1:xxxx:container-instance/xxxx"
        }
    ]
}
```

試しにタスクを大幅に増やしてみたところちゃんと走ったので成功したようです。
【Java】OpenCSVでファイルの読み書き

# 公式ドキュメント
http://opencsv.sourceforge.net/
JavaDoc
http://opencsv.sourceforge.net/apidocs/index.html

# 読取内容をBeanのListにする

```java:基本形
List<SampleBean> list = null;

// ファイルを読み取る
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"))) {

	CsvToBeanBuilder<SampleBean> builder = new CsvToBeanBuilder<SampleBean>(reader);
	builder.withType(SampleBean.class);

	list = builder.build().parse();
}
```

## タブ区切りテキストを読み取る

```java:builderに追加する記述
builder.withSeparator('\t');
```

## ヘッダー行がある場合
Beanのプロパティに`@CsvBindByName`を付ける。列名による指定。

```java:ヘッダー行が無い場合
public class SampleBean {

	@CsvBindByName
	private String col1 = null;

	@CsvBindByName
	private String col2 = null;

	@CsvBindByName
	private String col3 = null;

	@CsvBindByName
	private String col4 = null;

	@CsvBindByName
	private String col5 = null;
	
	// 略

}
```

## ヘッダー行が無い場合
Beanのプロパティに`@CsvBindByPosition`を付ける。列位置による指定。

```java:ヘッダー行が無い場合
public class SampleBean {

	@CsvBindByPosition(position = 0)
	private String col1 = null;

	@CsvBindByPosition(position = 1)
	private String col2 = null;

	@CsvBindByPosition(position = 2)
	private String col3 = null;

	@CsvBindByPosition(position = 3)
	private String col4 = null;

	@CsvBindByPosition(position = 4)
	private String col5 = null;
	
	// 略

}
```

# ファイルへ書込み

## Beanのリストから書込み

```java:公式サイトのサンプル
Writer writer = new FileWriter("yourfile.csv");
StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
beanToCsv.write(beans);
writer.close();
```
公式サンプルのやり方では、以下の挙動をする。
・ヘッダー行が挿入されるが、英字が全て大文字になる。
・列の出力順が、列名の昇順になる。

いずれもStrategyなどを使えば制御できるかと思ったが、独自Strategyクラスを作らなくてはいけなかったりする。なので、単純に`CSVWriter`を使って書き込む方が手っ取り早そう。

## CSVWriterを使って書込み
```java:CSVWriterを使うサンプル
CSVWriterBuilder builder = new CSVWriterBuilder(writer);
builder.withSeparator('\t');	// タブ区切り
builder.withLineEnd("\r\n");	// 改行コード(デフォルトだと\nになる)

try (ICSVWriter csvWriter = builder.build()) {

	// ヘッダー
	csvWriter.writeNext(new String[] { "column1", "column2" }, false);

	// 内容の書込み
	for (SampleBean output : outputList) {
		csvWriter.writeNext(new String[] { output.getColumn1(), output.getColumn2() }, false);
	}

}
```
アナログ・デバイセズ　マイコンセミナー行ってきたよ

EV-COG-AD4050を使用したマイコンセミナーが先日行われました。

一つは、マクニカ主催のもの、一つは、アナログデバイセズ社主催のものです。
マクニカでは、CrossCore Embedded Studioを使用しマクニカ大阪のFAEが講師を務めました。
アナログデバイセズでは、Mbedのオフライン環境にてAPS実験室室長であるインスケイプ株式会社の浦邉康雄さんが講師を務めました。
室長のアナログ・デバイセズの実験室一覧はこちらです。
https://www.aps-web.jp/lab/adi/

使用したマイコンボードは。EV-COG-AD4050です。
https://www.analog.com/jp/design-center/evaluation-hardware-and-software/evaluation-boards-kits/ev-cog-ad4050.html

ただし、マクニカはEV-COG-AD4050WZ、アナログデバイセズはEV-COG-AD4050LZでした。
これは、パッケージの違いになります。
EV-COG-AD4050LZ：ADuCM4050 (LFCSP)
EV-COG-AD4050WZ：ADuCM4050 (WLCSP)

ちなみに、マクニカが東京でセミナーを開いたのは担当さんに「大阪ではマイコンセミナーやるのに、東京ではやらないんですか？」と言われたからだとか、言ってみるものですね・・・ｗ

マクニカさん
![IMG_0149.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c18d908b-79a3-9599-9d5b-7bc075980a52.jpeg)
![IMG_0151.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/73937ca6-43f9-933e-1af4-365fec95efbf.jpeg)

アナログデバイセズ
![IMG_0161.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/86dba361-ba9a-5451-21f7-100535016048.jpeg)
![IMG_0164.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5958139a-97d4-51b4-8c88-6c0e65792881.jpeg)

内容としては、Lチカから、センサーまでです。
どちらも、短い時間だったため、作ってあるものを流し込む形でした。

なお、愚痴ですが、2019年8月1日現在サンプルファイルがComingSoonで存在しません。
早く載せてほしいです。
https://wiki.analog.com/resources/eval/user-guides/ev-cog-ad4050w/example_project

EV-COG-AD4050にはアナログデバイセズの加速度センサーADXL362を搭載しています
https://wiki.analog.com/resources/eval/user-guides/ev-cog-ad4050lz/cog_hw_userguide
私は、これを浦邉さんにお勧めされたので、Jellywareのハンズオンに参加したこともありました。
接続がSPIであり、設計的な問題から採用できていませんが、高精度、低消費電力とのことでお勧めらしいです。

今回は、オフライン環境でのハンズオンでしたが、今後、ネットワークにつないだものがあると良いですね。
そのためには、ネットワーク用のアドオンボードがないといけないのですが、端子が32 pin Hirose connector (P1)
https://wiki.analog.com/resources/eval/user-guides/ev-cog-bleintp1z
なのがもったいないです・・・
OpenCV(C++)で指定範囲部分だけ二値化

#はじめに
OpenCV（C++）で二値化を何気なく行っていたが，今更自分の理解が間違っていたことに気づいた．
そこで，もしかしたら他の人も勘違いしているのかもと思って，参考になればなと思う．

#Threshold関数
二値化を行うのに用いるThreshold関数．
ドキュメントにはこう書かれている．

```c++

double threshold(const Mat& src, Mat& dst, double thresh, double maxVal, int thresholdType)

配列の要素に対して，ある定数での閾値処理を行います．

パラメタ:	
src – 入力配列（シングルチャンネル，8ビット，あるいは32ビット浮動小数点型）．
dst – src と同じサイズ，同じタイプの出力配列．
thresh – 閾値．
maxVal – 閾値処理の種類が THRESH_BINARY や THRESH_BINARY_INV の場合に利用される，最大値の値．
thresholdType – 閾値処理の種類．
```
公式ドキュメント: [Threshold関数](http://opencv.jp/opencv-2svn/cpp/miscellaneous_image_transformations.html#cv-threshold "OpenCV公式")

ここで，私はthreshの値〜maxValの値までの範囲を抽出すると思っていた．
つまり，下記のように書くと120〜140の間の部分のみが抽出ができると思っていた．

```c++

double threshold(const Mat& src, Mat& dst, double 120, double 140, THRESH_BINARY)
```
![miss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472629/63ff0582-5dc3-4eb6-9633-b96e8e17251d.png "ヒストグラム")

だが，実際は，<span style="color: red; ">120</span>〜255の間の画素を抽出し，抽出した画素を<span style="color: red; ">140</span>の明るさで画像を生成，dstに入れ込む，というものであった．

# 指定範囲（上記の例の場合，120〜140）だけを2値化したい
120〜140の部分を抽出する場合の関数を作ってみた．

```c++
Mat Binarization(Mat input, int low, int high){
  Mat thresh_1, thresh_2, output;

  threshold(input, thresh_1, low, 255, CV_THRESH_BINARY);       // binalized
  threshold(input, thresh_2, high, 255, CV_THRESH_BINARY_INV);  // binalized
  bitwise_and(thresh_1, thresh_2, output);                      // and演算

  return output;
}
```
- 引数
    - input:入力画像（グレースケール化された画像）
    - low:低閾値（上記の例の場合，120）
    - high:高閾値(上記の例の場合，140)
- 返り値
    - output:（二値化されたMat型の画像）

---

# 終わりに
いかがでしたか．
自分のような勘違いをしている人は少ないかもしれませんが，少しでもお役に立てればと思います．
また，何か間違いがあれば，コメントなどでお知らせいただければ幸いです．
レンタルサーバーのPHPを使って1日1回Twitterに投稿する

# やりたいこと
1日1回、毎回異なる国歌をTwitterに投稿したい。

#実現方法
マシン：無料レンタルサーバーを使う
手段：PHP
国歌：YouTubeから引用

#ショートステップ
##レンタルサーバーを借りる
  ここから借りる
https://www.xfree.ne.jp/manual/man_server_spec.php

##PHP
 これ読む。なにせPHPはほぼ使ったことがない。自宅鯖でwiki作った時以来だ。12年振り？

昼休憩おわり
Rails6 のちょい足しな新機能を試す61（ActionMailer template_name編）

# はじめに

Rails 6 に追加されそうな新機能を試す第61段。 今回は、 `ActionMailer template_name` 編です。
Rails 6 では、 `mail` メソッドに `:template_name` オプションを指定することで、メールのテンプレートファイルを変更することができるようになりました。

Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

User 登録時にメールを送信するようにします。

# プロジェクトを作る

```shell
rails new rails6_0_0rc1
cd rails6_0_0rc1
```

# User の CRUD を作る

User の CRUD を scaffold で作ります。

```shell
$ bin/rails g scaffold User name
```

# UserMailer を作る

```shell
$ bin/rails g mailer User
```

# Controller を修正する

`UsersConteroller#create` を修正して、メール送信処理を呼び出すようにします。

```ruby:app/controllers/users_controller.rb
class UsersController < ApplicationController
  ...
  def create
    ...
    respond_to do |format|
      if @user.save
        UserMailer.with(user: @user).created_email.deliver_later # この行を追加する
        ...
  end
```

# UserMailer にアクションを追加する

UserMailer にアクション(メソッド) `created_email` を追加します。

今回の機能を確認するため、 `mail` メソッドの引数に `template_name: 'template'` を追加します。

```ruby:app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer
  def created_email
    @user = params[:user]
    mail(to: 'admin@example.com', subject: 'user created', template_name: 'template') do |format|
      format.text
      format.html
    end
  end
end
```

# メールのテンプレートを作る

普通だったら、 テンプレートのファイル名は、 `created_email.html.erb` と `created_email.text.erb` になりますが、
今回は、 テンプレートのファイル名を `template.html.erb` と `template.text.erb` にします。
メールで使われたテンプレートのファイル名と登録されたユーザーを表示するようにします。

HTML のテンプレートです。

```erb:app/views/user_mailer/template.html.erb
<p>
  this is <%= File.basename(__FILE__) %>
</p>
<p>
  User:<%= @user.name %> is created
</p>
```

テキストのテンプレートも作っておきます。

```erb:app/views/user_mailer/template.text.erb
this is <%= File.basename(__FILE__) %>

<%= @user.name %> is created
```

# rails server を実行する

```shell
$ bin/rails s
```

# ブラウザで確認する

http://localhost:3000/users/new にアクセスしてユーザーを登録してみます。
ログにメールの内容が出力されています。

```
----==_mimepart_5d325e19e1215_1342ab3fd7ac1d813972
Content-Type: text/plain;
 charset=UTF-8
 Content-Transfer-Encoding: 7bit

 this is template.text.erb

 Taro is created


----==_mimepart_5d325e19e1215_1342ab3fd7ac1d813972
Content-Type: text/html;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <style>
      /* Email styles need to be inline */
    </style>
  </head>

  <body>
    <p>
  this is template.html.erb
</p>
<p>
  User:Taro is created
</p>

  </body>
</html>

----==_mimepart_5d325e19e1215_1342ab3fd7ac1d813972--
```

# `:template_name` を省略した場合

`:template_name` を省略した場合は、アクション名(メソッド名) がそのまま、メールのテンプレート名として使われます。

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try061_mail_multi_part_template


# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [ActionMailer: support overriding template name in multipart](https://github.com/rails/rails/pull/22534)
カスタム投稿タイプで使えるの条件分岐


# １）表示するページに対する条件分岐
## シングルページ
```php:
//一つの投稿タイプの場合
 if (is_singular('post_type')){}

//複数の投稿タイプの場合
 if (is_singular(array('post_type1', 'post_type2', 'post_type3'))){}
```
*`is_singular('post')`という表記できる
*`is_single()`より上に記述する。

## アーカイブページ
```php:
//一つの投稿タイプの場合
 if (is_post_type_archive('post_type')){}

//複数の投稿タイプの場合
 if (is_post_type_archive(array('post_type1', 'post_type2', 'post_type3'))){}
```
*`is_post_type_archive('post')`という表記はできない
*`is_archive()`より上に記述する。
## タクソノミーのアーカイブページ

▼タクソノミーアーカイブページか。

```php:
 if (is_tax()){}
```
▼タクソノミー"movie"のアーカイブページか。

```php:
 if (is_tax('movie')){}
```

▼タクソノミー"movie"のアーカイブページで、そのタームが "comedy" か。

```php:
 if (is_tax('movie','comedy')){}
```

#２）ループ内などの投稿に対する条件分岐
## has_term（タームを持っているか）
▼現在の投稿が、タクソノミー"movie"のターム"comedy"を持っているか。

```php:
 if (has_term('comedy','movie')){}
```
▼現在の投稿が、タクソノミー"movie"の**いずれかのターム**を持っているか。

```php:
 if (has_term('','movie')){}
```
任意の$termを取得するときは省略`''`でOK。

### 例）ターム情報を表示したい
現在の投稿のターム表示するとき。

```php:
if(has_term('','movie')){ 
  $terms = get_the_terms($post->ID,'movie');
  foreach ( $terms as $term ){
   echo $term->slug; //タームスラッグ名取得
   echo $term->name; //ターム名取得
  }
}
```

#３）投稿タイプの取得で条件分岐
▼現在の投稿タイプが"news"かどうか。

```php:
 if ('news' ===get_post_type() ){}
```
[Swift 5]セルの下線を消したいが、特定のセルの下にだけ画面幅いっぱいの罫線を表示したい時


罫線を個別で表示する方法と、セクションのヘッダー表示で実現する方法の2通りがあると思います。

今回はリストを2つに分ける目的での罫線だったので、Sectionで実現し他場合の方法の備忘録です。

## まず、デフォルトで表示されている罫線を非表示にします

### Storyboardで設定する場合

Storyboard -> Tableview -> Separator

を、DefaultからNoneに変更する

### コードで設定する場合

```swift
tableView.separatorStyle = .none
```

## ヘッダーを生成して任意の箇所でのみ表示する

そして、色を指定する必要がないならHeaderの高さを1pxなどと指定するだけOKです！

しかし…今回は色の指定があったためHeader用のViewを作成するメソッドを使いました。

```swift
// ヘッダーを生成
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    // 今回は1つ目のセクションと2つ目のセクションの間に罫線を引きたかったので1(2番目の意)を指定
    let sectionWithHeader = 1
    // 罫線が欲しいセクション
    if section == sectionWithHeader {
        // UIViewを生成して色を指定
        let view = UIView(frame: .zero)
        view.backgroundColor = .black
        return view
    }
    return nil
}
// ヘッダーの高さを指定
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == sectionWithHeader {
        return 1.0
    }
    return 0
}
```



前述の通り、色等を指定しないのであれば、`heightForHeaderInSection`の使用だけでOKです。

※TableViewのStyleがPlainのままの想定です。Groupedの場合はまた違った表示になってしまうかと思います。

## 後はセクションごとにセルの中身を実装すればOK

通常通り以下のDataSourceメソッドを実装しましょう。

```swift
// セクションの数
func numberOfSections(in tableView: UITableView) -> Int { }
// 行の数
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { }
// セルの中身
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { }

```

参考: https://qiita.com/takashings/items/693ba4b31d07dbe90778
Intel AMT で遠隔から BIOS をいじくる

Intel AMT というのは vPRO の機能の一部で、リモートからローレベルな状態の PC を起動したり、BIOS をいじくったりできるリモート管理機能です。
HPE の Proliant に搭載されている iLO のようなものです。

今までの我が家のお風呂屋根裏サーバは Proliant Microserver Gen8 だったのですが、いかんせん PCI Express が足りない。

そんなとき vPRO の機能のうちの一つ、AMT なるリモート管理機能にいきつきました。
IntelのQ系マザーと、vproに対応したCPUが必要です。

iLOで私が使用している機能は網羅されているようなので、興味本位からマイグレすることにしました。
自作PCと同じ感じなので、拡張性もあって素敵。

丁度某フリマサイトで SuperMicro C7Q270-CB-ML が安かったのでポチ。
ガイアが俺にvPROを組めと言っている。

某オークションサイトで i7 6700 + グラボが入った BTO PC が安かったのでポチ。
KがついてるCPUはvPro対応でないので注意が必要です。

初期設定等についてはインターネッツに転がってるので割愛します。

今日のところは BIOS 画面を表示させるのに躓いたところを書きます。

C7Q270-CB-ML 特有の設定があるのか？BIOS モードがレガシーでなく UEFI だからか？？VNC が Free 版だからか！？
と、散々調べた挙句、凡ミスの代表のような原因でした。脱力。

・Primary GPU がグラボだと何も表示されない

　オンボードグラフィックの出力を拾って表示させているのであろうことから、Primary GPU がグラボになっていると何も表示されません。
　じつは iLO の Intgrated Remote Console も同じです。
　BIOS 設定にあるはずなので、内部グラフィックにしましょう。

　ちなみにC7Q270-CB-ML では Primary Display という項目を IGFX に設定しました。

・内部グラフィックに設定しても、BIOS 設定画面に入れない

　ブート時のちょろちょろっとした文字列は表示されるのですが、なぜか BIOS 設定画面が表示できない。
　キーには反応して何かを読み込んでいるようでも、そのまま OS があがってしまったり、Boot Order のキーを押した後何も表示されなかったり。

　これは長いことはまりましたが、オンボードグラフィックにケーブルがささっていて、ディスプレイがないと何も表示されないようで。

　ディスプレイつなげて vPRO PC を直接操作している時はリモート側でも表示出来ていたのは、そういうことだったんですね。
　オンボードグラフィックの表示を拾ってるってことは、そうですよねー。といった感じ。

　折角リモートで BIOS レベルから VNC で見る事ができて、お風呂の屋根裏に置くのにモニタ必須というのはナンセンスなので HDMI ディスプレイエミュレータを刺すことにします。
　某密林で800円なーりー。

これで外出先から自宅サーバをVNCでフルコントロールできます。幸せ。

ようやく自宅サーバの基本セットアップにとりかかれそうです。

iLOと違ってiOS用のアプリはないけど、VNC使えるってことはどうにかなるかな？
試してみようと思います。
「スターリンソート」を改善したオートクラシーソート

[話題の粛清ソートアルゴリズム「スターリンソート」をPythonで実装した](https://qiita.com/Sirloin/items/c9e5c74be3366df65bce)というネタがあったので乗っかります。

元ネタは

> ソートされていない要素を削除（粛清）して、強引に昇順リストを生成

というものですが、率直に言ってスターリンはまだ甘いです。
まず、ソート結果にも複数の要素が含まれてるということは、変更を加えられて再度、ソートされていない状態になる可能性を残してしまいます。
さらに、そのような不完全さを残しているにも関わらず、これにはO(n)もの時間がかかってしまいます。
こんなことでは真の独裁は維持できません。

さて、どうしたものか。
ということで、困ったときはドラえもんです。
かの有名な「どくさいスイッチ」を参考にしましょう。
最後にのび太が1人になる(いや、まあ、現実にはごにょごにょなんですが)アレです。

はい、オートクラシーソート！

```haskell
autocracySort :: [a] -> [a]
autocracySort [] = []
autocracySort (x:_) = [x]
```

```haskell
print $ autocracySort [1, 2, 3]
-- => [1]
print $ autocracySort [9, 234, 23, 2, 1, 93]
```


いくつ要素が含まれていようが、最初の1要素だけを含んだリストを返します。
ソート結果が正しいことも簡単に確認できる完璧なソートです。
そして何と計算量オーダーはO(1)です。

```haskell
print $ autocracySort [n * n | n <- [1..]]
-- => [1]
```

さらに何と無限リストも扱えます。
これなら無限に湧いてくる聞き分けのない市民がいても、安心して独裁生活を送れます。

では、みなさん、良い独裁ライフを！
[Next 2019聴講メモ] AIと量子コンピューターで開く、新たなビジネスの可能性 (ML+量子コンピュータ 実用化が進む世界

※※2019/08/14 追記 YouTubeに投稿されたセッションのリンクを追加しました。※※

# AIと量子コンピューターで開く、新たなビジネスの可能性 (ML+量子コンピュータ 実用化が進む世界)
- 最首英裕
  - Groovenauts CEO
  - 世界で唯一商用ベースで量子コンピューターを使っている会社
  - [YouTube](https://www.youtube.com/watch?v=HeDFYg9xf8Q)

-----
## Goovenautsのプロダクト ~MAGELLAN BLOCKS~
- 機械学習の予備知識なしで高度なデータ分析や予測をできるようにしてきた
  - やりたいことがあれば簡単に機械学習を利用できる
  - 応用例
    - コールセンターにかかってくるコール数の予測
    - コンビニの地域による売り上げ予測
      - これから建てるコンビニがどれくらい売り上げられるか
    - etc...  

### 機械学習を進めると...
- **機械学習をやればやるだけ、最適化が必要になることがわかってくる**
- 事例が溜まってきて機械学習の応用例がたくさんある
- 解決した課題の先の課題に業を煮やすことが増えてきた
  - コールセンターのリソース管理までは考えられない

## Beyond AI
AI x 量子コンピューター 
### 量子アニーリングタイプのコンピューター
- デジタルなコンピューターではない
- 量子力学を利用し、エネルギーの安定した状態を観測できる装置
  - 物理現象で組み合わせ最適化を解くためのコンピューター

#### 課題解決のために
- 世の中の課題をエネルギー式に変換する
  - 微妙なニュアンスを式で変更することができる
  - 条件を追加したり、除去の追加がしやすい

### 子どもに繋げる
- 運営しているTech Parkの子どもたちに簡単にAIを体験してもらえる仕組み
  - scratchにAIの拡張とか入れてより遊べるようにしている  
    - 発想がすごい(らしい)
アナログ・デバイセズ　EV-COG-AD4050LZ でLチカしよう　Mbed編

アナログ・デバイセズ社EV-COG-AD4050LZでmbedを使ってみましょう。

EV-COG-AD4050LZに搭載しているADuCM4050は、Cortex-M4を搭載したアナログ・デバイセズ社の超低消費電力マイコンです。
商品についての詳細は、こちらがいいかと
https://www.macnica.co.jp/business/semiconductor/articles/analog_devices/129241/

それでは使ってみましょう。
Mbedサイトの 「Open Mbed Compiler」をクリックしましょう。
＊Mbedの登録はしてください。
https://os.mbed.com/platforms/EV-COG-AD4050LZ/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/79809021-9445-9cb9-b89f-082af8b8cab6.png)

新しいプログラムの作成画面で、プラットフォームがEV-COG-AD4050LZになっているのを確認しOKを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/0a594e06-b9b5-3801-92e4-e7f96e490e76.png)

すると、Mbedのファイルがインポートされますので、コンパイルを押しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a2111541-eae8-04f5-dd34-450a99458671.png)

待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f1b1fbcd-f736-13d1-b447-ba1fa42a4f12.png)

しばらく待つと、ファイルがダウンロードされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/fc13273a-93e9-c6eb-2aa0-64c78cc93aae.png)

これをEV-COG-AD4050LZにドラッグアンドドロップします。
EV-COG-AD4050LZは、DAPLINKと見えていると思います。

書き込んだ状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/6088d085-9b2a-815d-d933-0ff3de4f4125.png)

書き込みが終わると、ドラッグアンドドロップしたファイルが消えているはずです。
消えていない場合は、問題が起きています。

最後に、EV-COG-AD4050LZのリセットボタンを押しましょう。
これでLEDが点滅すると思います。
**Mbedは書き込み後、リセットボタンを押さないといけません。

今回のソースコードはLチカですから単純で、LED1を点灯、消灯を繰り返しているだけです。

例えばLED1とLED2を点滅させたい場合は
以下のように、DigitalOut led2(LED2);
を設定します。

```
/* mbed Microcontroller Library
 * Copyright (c) 2018 ARM Limited
 * SPDX-License-Identifier: Apache-2.0
 */

#include "mbed.h"

DigitalOut led1(LED1);
DigitalOut led2(LED2);

#define SLEEP_TIME                  500 // (msec)

// main() runs in its own thread in the OS
int main()
{
    while (true) {
        // Blink LED and wait 0.5 seconds
        led1 = !led1;
        led2 = !led2;
        wait_ms(SLEEP_TIME);
    }
}
```

標準では余計なプログラムが動ているので削除しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/706708a3-04c3-a60e-c326-d3c72c692ca6.png)

アナログ・デバイセズ　EV-COG-AD4050LZ でADT7420を使ってみよう　Mbed編に続きます。
https://qiita.com/usashirou/items/613b44da24709d4bf8bb
Link > VMware Workstation 15 Pro > .vmx, .vmdkファイルの変更方法

```txt:動作環境
Windows 10 Pro v1903
VMware(R) Workstation 15 Pro
```

### 概要

.vmxファイルと.vmdkファイルの名前を変えようとしていた。
VMWare自体には簡単に変えるUIは用意していないようだ。

### 参考

下記の情報を元に対応をした。

- [Rename vm (files) on vmware workstation](https://superuser.com/questions/104962/rename-vm-files-on-vmware-workstation)

> answered Jan 9 '15 at 8:14
Georgi Hristov

今回はすべてのvmdkファイルを変更する必要はなく、拡張子以外が同じファイル名となっているnvram, vmdk, vmsd, vmx, vmxfの5つのファイルの名前を同時に変更した。
(XXX.vmdk, XXX-s001.vmdk, XXX-s002.vmdkの方は変更していない、ということ）。
salesforce dx

# やっぱり忘備録
忘備録なので間違いがあっても許して。
## 認証すっ飛ばしたい
CIとかで自動化したいときに認証すっ飛ばす必要があります。
そんなときは`force:auth:sfdxurl:store`を使いましょう。
`sfdx force:auth:sfdxurl:store -f (ファイル名)`って使います。
ファイルを指定しなければならないのですが、中身にauth URLが記載してある必要があります。
が、これは簡単にとれます。
1. `sfdx force:auth:web:login`でまず接続
2. `sfdx force:org:display -u (接続名) --verbose`を実行
3. 答えが返ってくるので**Sfdx Auth Url**の行に記載があるURLをコピる
4. コピった内容を適当なファイルとして保存
5. うまくいったか`sfdx force:auth:sfdxurl:store -f (保存したファイル名)`を実行して確認
6. *Successfully authorized (ユーザ名) with org ID (組織ID)*が返ってくれば成功
俺なりのjest

今回はAPIのtestをします。

## APIをたたく

axiosを使います。

https://github.com/axios/axios

## testを書く

```Api.spec.js
import * as axios from 'axios';

describe('api-test', () => {
  it('axios mock', async () => {
    jest.mock('axios', () => ({
      get: (url, body) => {
        return new Promise(resolve => {
          resolve({url, body}).catch(err => {
            throw new Error(err)
          })
        })
      }
    }))
    const  SampleFunction= async () => {
        const res = await axios.get('https://samplefunction_api.com/api/posts/all')
        console.log(res)
        return res
    }
      expect(SampleFunction)
  })
});
```

### describe()

`describe()`引数にtest名を入れることでtestを宣言します。

## it()
`it()`引数にテストする内容記載できます。

## jest.mock()
公式から引用
>すべてのモック関数には、この特別な .mock プロパティがあり、モック関数呼び出し時のデータと、関数の返り値が記録されています。 .mock プロパティには、各呼び出し時の thisの値も記録されているため、this の値のチェックも可能です。

`jest.mock()`引数の中で`axios`を指定することで使用できるようになる


## mock作成

```js
      get: (url, body) => {
        return new Promise(resolve => {
          resolve({url, body}).catch(err => {
            throw new Error(err)
          })
        })
      }
```

上の部分がaxiosのmock作成箇所
getメソッドを利用しPromiseで値を返すように記述している

## axiosでApiを叩く

```js
    const  SampleFunction= async () => {
        const res = await axios.get('https://samplefunction_api.com/api/posts/all')
        console.log(res)
        return res
    }
      expect(SampleFunction)

```

上の箇所でapiを叩いてPromiseでレスポンスを返すように設定している

## expect()

引数にtest対象を指定する

## 動作確認

```
jest test
```
`url, body`がこんな感じで返ってきます

<img width="536" alt="スクリーンショット 2019-07-31 22.59.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115687/de09a750-4f79-b966-017e-f1056236d933.png">


<img width="616" alt="スクリーンショット 2019-07-31 22.48.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115687/a892ae79-fd2c-9ac4-1c46-45322f30fe90.png">



一応今回test書いたgithub貼っておきます。
https://github.com/taichi0514/headlesscms-view
NuxtでGoogle Fontsを使う方法が簡単過ぎた

ポートフォリオサイトでGoogle Fontsを使おうと思い、
cssでimportしたり、linkタグでやってみたりしたけど、
多分、これが一番簡単なのではないかと思います。

#インストール
[nuxt-webfontloader](https://www.npmjs.com/package/nuxt-webfontloader)

```bash
npm install nuxt-webfontloader
```

#設定方法
```js:nuxt.config.js
  /*
   ** Nuxt.js modules
   */
  modules: [
    'nuxt-webfontloader'
  ],
  webfontloader: {
    google: {
      families: ['Noto+Sans+JP']
    }
  },
```

以上、確認してみましょう。

```bash
npm run dev
```
MySQL起動時に、ERROR! The server quit without updating PID fileが出た時の対処法

初めて、MySQLを触ってみようとした時の話。

MySQLをインストールして` $mysql.server start`をしたが表題のエラーが出てしまったので、その時の対処法を記載します。

同じようなエラーが出ている以下の記事を参考にしました。

>mysqlがどうしても起動しない
https://qiita.com/_natsu_no_yuki_/items/ae4c94187093e4ab3cdc
>MySQL起動できなくなった　The server quit without updating PID file
https://qiita.com/yuki0208/items/1d5554d98e9ec76084bd

ですが、`ERROR! The server quit without updating PID file (/usr/local/var/mysql/*****.pid).`と表示され改善しませんでした。

そこでこちらの記事を参考にしました。
>https://astail.net/?p=101

```
//mysql 関連のプロセスを確認するコマンド
$ ps ax | grep mysql

550   ??  S      0:00.03 /bin/sh /usr/local/opt/mysql@5.6/bin/mysqld_safe --datadir=/usr/local/var/mysql
664   ??  S      0:34.24 /usr/local/opt/mysql@5.6/bin/mysqld --basedir=/usr/local/opt/mysql@5.6 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/opt/mysql@5.6/lib/plugin --log-error=*****.err --pid-file=****.pid
57333 s000  S+     0:00.00 grep mysql
```
色々出てきたので、プロセスIDの550と６６４を停止させる。

```
kill -TERMで停止させる
$ sudo kill -TERM 550
$ sudo kill -TERM 664

//停止できたか、確認してみる
$ps ax | grep mysql
57345 s000  S+     0:00.00 grep mysql
//grep以外のプロセスが削除されていることを確認

$ mysql.server start
Starting MySQL
.. SUCCESS! 
```

無事スタートできました。

###macOSに,MySQLをインストールしたい時の参考ページ
https://programmingnavi.com/35/