OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby on Rails チュートリアル第６章　ユーザーモデル

#ユーザーモデル
　Railsでは、データモデルとして扱うデフォルトのデータ構造のことをモデルと呼ぶ。RailsではActiveRecordというライブラリを用いてデータベースとやりとりを行い、データモデルのオブジェクトの保存、更新、削除などを行う。また、Railsではデータの定義をRubyで記述でき、SQLを意識する必要がない。データをモデリングする際は、デフォルトでリレーショナルデータベースが使用され、リレーショナルデータベースは、データ行で構成されるテーブルからなり、各行はデータ属性のカラム (列) を持つ。例えばnameとemailを持つユーザーを保存するのであれば、nameとemailのカラムを持つusersテーブルを作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486493/c1abbc34-aece-a8c5-583c-6ebb68e85b6d.png)

ユーザーモデルはこのようになる。
このユーザーモデルを作成するために、ターミナルで以下のコマンドを打つ

```ruby
rails generate model User name:string email:string
```
　ここでは、モデル名と、データの属性名（name,email）とそのデータ型を指定している。このgenerateコマンドにより、マイグレーションファイルというデータベースの構造に変更を加えるファイルが生成される。

```ruby:db/migrate/[timestamp]_create_users.rb
  def change
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
  end
end
```
　このマイグレーションファイルのchangeメソッドにより、Railsのcreate_tableメソッドが呼び出され、ユーザーを保存するためのテーブルがデータベースに保存される。そのcreate_tableメソッド内でブロック変数t(tableのt)を生成し、users tableにstring型のname属性とemail属性のカラムを追加している。また、t.timestampsではcreated_atとupdated_atという２つの「マジックカラム (Magic Columns)」が生成される。これらは、あるユーザーが作成または更新されたときに、その時刻を自動的に記録するタイムスタンプである。なお、Railsの慣習でモデル名（User）は単数形であるが、テーブル名（users）は複数形となっている。
　マイグレーションを完了させるにはターミナルで

```ruby
rails db:migrate
```
と打つ必要がある。これで以下のようなユーザーモデルが作成された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486493/4e9a209b-7699-00c5-aefb-10aa045bcaed.png)

ターミナルで

```ruby
user = User.new(name: "Michael Hartl", email: "mhartl@example.com")
```
と入力すると、Userモデルのnewメソッドでnameとemailを指定した新しいユーザーオブジェクトが生成される。
Kotlin Contractsはいつ使えるのか

Kotlin Contractsの利用目的が自分の中で曖昧だったので文章化

#TL;DR;
目的: compilerの制約は時にはプログラマーの意図に反して厳格すぎる時があるので明示的に緩める方法作りましょう。[参照](https://github.com/Kotlin/KEEP/blob/3490e847fe51aa6deb869654029a5a514638700e/proposals/kotlin-contracts.md)
いつ使えるのか: 実際のアプリ実装で使える機会は少なそう。
# ユースケース
contractsを実装するモチベーションとユースケース
## 呼び出し回数の宣言
scope functionであるrunを使用する際にimmutable variableに対してscope functionを利用して値を割り当てるとcompilerが正確に判断できない。
以下はrun functionからcontract宣言をコメントアウトしてあえて問題を起こしている例

```Main.kt
fun test() {
  val x: Int
  myrun {
    x = 42 // compile error
  }
  println(x)
}

public inline fun <R> myrun(block: () -> R): R {
//  contract {
//    callsInPlace(block, InvocationKind.EXACTLY_ONCE)
//  }
  return block()
}
```
lambdaは通常何回呼ばれるか分からないのでimmutable変数の割り当てを禁止している。だがrun関数でimmutable変数を割り当てても一回だけ呼ばれることは自明。これを解決するためにコメントアウトしている部分のcontractを使用してcompilerに問題ないことを宣言し、上のようなコードを書けるようにする。
## nullableかどうかの宣言
extension functionを作成する際に戻り値によって元のクラスの状態を宣言できる。
これも既にわかりやすい実装例があったので引用

```Main.kt
@ExperimentalContracts
fun test() {
  val x: String? = null
  if (!x.myisNullOrEmpty()) {
    println(x.length) // compile error
  }
  println(x)
}

@ExperimentalContracts
public inline fun CharSequence?.myisNullOrEmpty(): Boolean {
//  contract {
//    returns(false) implies (this@isNullOrEmpty != null)
//  }

  return this == null || this.length == 0
}
```
contractが無いとif文の後でxはnullでは無いことは明らかだがcompilerは判断できないのでcontractによって制約を緩める。
## コード解析の効率化
現状で一部のコード解析はプロジェクト全体で行うか全く行わないかの二択しかない。contract宣言によって厳格にチェックしたい箇所をユーザーが宣言する。これによって効率よくcompileを行う。[意訳間違ってるかもしれないので元を呼んでください](https://github.com/Kotlin/KEEP/blob/3490e847fe51aa6deb869654029a5a514638700e/proposals/kotlin-contracts.md#motivation--use-cases)

```Main.kt
fun test() {
  var x: Int = 42
  thread {
    println("result is $x")
  }
  x = 43
}
// result is 43
```
上のケースではthreadの実行タイミングによって42と43のどちらが表示されるか分からない。これはユーザーの意図した動作では無いので警告を出せるようにする。
# 使用する上での制約
## annotationを付与する必要あり
contractsが使用されている場所全てに

```
@ExperimentalContracts
```
付ける。
将来的に関数を破壊的に変更する可能性があるため
## Top-levelで宣言する
まだ継承が実装できていないため
## parameterへの参照はできない
```Main.kt
// 生徒から授業を取り出す。この時授業の単位と教師わ割り当てられていない可能性がある。
data class DBReturnVal(
    val studentName: String,
    val lectureName: String,
    val lectureCredit: Int?,
    val teacherName: String?
)
@ExperimentalContracts
fun DBReturnVal.validLecture(): Boolean {
    contract {
        returns(true) implies (
                this@validLecture.lectureCredit != null 
// only references to parameters are allowed in description
                        && this@validLecture.teacherName != null)
    }
    return this.lectureCredit != null && this.teacherName != null
}
```
O/Rマッパーのvalidationとして使用できるかと考えたができない。contractsの実装方針として変数へ影響は及ぼさず、関数の役割を定義できるようにしていくと述べられているためこの機能が将来的に実装されるかは怪しい。

# まとめ
callsInPlace関数など確かにrunメソッドで使用されているが普通のアプリを作成する上では使用することはなかなか無さそう。String?.isNullOrEmptyの内部理解が進んだ点は良かった。しかしstableが出るまで動向を追うだけで実際の使用は待った方が賢明。
データベースの情報をもとにフォームを作成 ❏Rails❏

#【結論】 form.collection_select

こんな感じのやつが作りたい。

<img width="297" alt="collection_select_form_for.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529651/284fa39c-5bf5-9576-b3c6-5fa250a81367.jpeg">


---

僕は現在、ものを管理するアプリ「monosiri」を開発しています。
ものを登録する際に、カテゴリーを選択します。
categoriesテーブル一覧からフォームで選べるようにします。

例

```html:_form.html.haml
= form_with model: thing, class: "form" do |form|
  = form.collection_select(:category_id, @categories, :id, :name, { prompt: "カテゴリーを選択" }, { class: "form__category" })
略
```

引数を一つずつ解説します。

第1引数：category_id
→thingsテーブルのどのカラムに保存するか

第2引数:@categories
→コントローラーで@categories = Category.all を記述。全レコードを持ってくる。

第3引数:id
→category_idに保存されるカラム。

第4引数:name
→選択肢に表示されるカラム名。

第5引数:prompt
→未選択時に表示されるメッセージ。

第６引数:class
→クラス名。

<br>
比較的簡単にドロップダウンリストが作れました。
知っていれば簡単に作れるものって意外と多いのかも。。。

ではまた！
WinActor　シナリオGoTo　シナリオ制御

###　シナリオGoToは一方通行
シナリオを2つくらい作るなら共通処理をそれぞれ書いてもいいが、
何個もあるとメンドイし、修正箇所が増えるからメンテナンスも大変。
「最初はサブルーチンを使えばいいんじゃね」と考えたが、結局シナリオの数だけ必要になる。


単純にシナリオGoToでAとBを行き来はできる。が、Aに戻ったときシナリオの頭から処理開始する。

そこでWinActorフォーラムを検索。下図のようなイメージで作成するみたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/9fc7a1a5-4d62-7744-090f-eeb65051edf5.png)

###　引き継ぐための変数
引き継ぎ元と引き継ぎ先の変数を一致させると、変数を引き継ぎできる

- 任意の変数のみ引き継ぎ
 - 移動元のシナリオの最後に、引き継ぎたい分の変数値のみファイル等に書き出し、移動先のシナリオで読み込む、という方法もある

###　問題はどうやって処理をふりわけるか？
定時で起動させたいのと、任意のタイミングでやりたい処理がある。
定時で起動はタスクスケジューラかなと思ってる。

- なんか設定しても動かない。バッチファイルをダブクリすると動く。
 - Active Directoryくそくらえ。

任意のタイミングは定形のフォーマットで送信したメールの件名で振り分けるか？

### シナリオBをもとに振り分けてみた
共通の処理は外だしできたが、個別の処理はこのままだと、シナリオBに書くこととなる。
今後も数が増えるし、画面マッチングを使いだすとシナリオBの容量がヤバくなりそう

なにせ見づらいし、メンテナンス性も悪いし

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/c4e1a24b-1e61-7a0a-9397-11773bc6b6b1.png)

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/8d4b07ef-2a4d-c5b2-d7a8-cc15ae23d52e.png)

なんかPHPのオブジェクト指向より考えるのが大変。。。

### WinActorでメールの情報をGETできるかな？
- たとえば未読メールの件名や本文
- ファイルの添付
 - エミュレーションでキーボードショートカットを駆使している(後で修正するとき絶対にわからないはず)
 - もっとらくな方法はないか？
 
### 不明点
- ノードを複数一気に移動できない？
- Excelのセル値をGET→それを空白か判断→どう条件式を設定するの？
- 開発時、値を空欄にすると入れ忘れかどうか判断しづらい
   - 分岐(If文)で空白だったら変数に「NULL」を代入 
   　→　select　case(多分岐)の条件分岐でNULLの比較ができない
   - nullで条件式にいれる？
- 変数の展開ができない？
  - 文字列の連結で対応　or　%%で変数を囲む　そのままテキストを書く（連結）
  - いちいち文字列の連結をするのがメンドウ（しかも個数まで選ぶなんて）
- ログイン情報は保管できない
 - テキストやEXCELなどに記入しておいて、変数に格納 ダイアログでパスワードの入力はできない？
  - 自動記録ではNGだった
異なる権限のユーザが同時に操作

シークレットウインドウを開けて、管理者と営業支援などユーザが同時に操作できますので、一番便利になりました。

シークレット ウィンドウ：
閲覧履歴や入力情報を保存したくない時は“シークレット ウィンドウ”を使う

Chromeの“シークレット ウィンドウ”機能はご存じだろうか。設定メニューから［シークレット ウィンドウを開く］を選択、もしくは、［Ctrl］＋［Shift］＋［N］キーで呼び出して表示できる黒いウィンドウのことだ。“シークレット ウィンドウ”では、Chromeが“シークレット モード”で動作し、Webサイトの閲覧履歴やフォームへの入力情報を保存せずにブラウジングすることが可能だ。

![シークレットウインドウ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442974/ace8c275-d762-19ee-1d37-06c2b37841d7.png)

![ウインドウ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442974/936a5f11-29e7-881c-1d51-602f4e456113.png)
【初心者/新人SE向け】Aというフォルダの中身一式をBというフォルダの中にコピーしたいときはxcopy（windows）


#Aというフォルダの中身をBというフォルダの中にコピーする
タイトルが長いね

####エビデンス格納してたらフォルダ名ズレちゃったよ。。。
mkdirで正しいフォルダをたくさん作ったけど、いちいち手でコピーしてる時間がもったいないよ。。。copyコマンドは対象のファイルとディレクトリを指定するみたい、でもdirで一覧作るのも面倒。。。の時に使えるよ



```
xcopy 	C:\Users\popopo\Desktop\エビデンスフォルダA\A	 	C:\Users\popopo\Desktop\エビデンスフォルダB\B
```

Aの中に入ってるものが、これでBの中にコピーできましたハッピー！！
Excelでファイルの読み取り専用の設定/解除をワンクリックでできる設定

Officeを使用している会社は多いと思いますが、
社内のファイルサーバー上でExcel管理していることも多いと思います。
そんな時ファイルを更新はしたくないけど参照だけしたい（見たい）時があると思います。
他の人が作業する時にロックをかけないようにローカルに一度ファイルを落とすのもありますがそれは面倒という時は
ファイルを読み取り専用にしちゃうと便利です。
（ブックの共有設定はまた別の話で）

リボンにコマンドつけておくとワンクリックで読み取り専用/解除ができるのでその設定方法です。

## 読み取り専用の設定/解除のコマンドをリボンの上に設定

- 上部のタイトルバーの三角部分（下図参照）を押して「その他のコマンド」を選択します

<img width="301" alt="コメント 2019-11-13 104158.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/2b99803f-3325-db7a-fed3-2d80c8256b81.png">

- Excelのオプションが開くので「コマンドの選択」→「リボンにないコマンド」を選び、下の方の「読み取り専用の設定/解除」を「追加」します

![Book1 - Excel 2019_11_13 10_43_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/b1445ad6-b730-b6d5-1e47-7fa123e4c4e4.png)

※図はOffice365ですが、過去のExcel2007などでも微妙に遷移は違ったりしますができます。

- するとリボンの上にボタンが追加されるのでファイルを読み取り専用にする・解除するを簡単に切り替えできます

<img width="148" alt="コメント 2019-11-13 104511.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/f59e622f-d2b8-9c52-b74c-e8c77b35fa53.png">
atom でVisual Basic (VB.NET) のコード色付け

全くみたくありませんがVB6.0のコードを読まないといけなくなった。。
atomで開いたらもちろん `plain text` として開かれる。
やっぱり読みにくいので、`*.bas` を開いたら VB.NETとして色付けしてもらう方法。

下記をまずインストールします
[language-vb](https://atom.io/packages/language-vb0)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/0a19f4bb-79f6-7ded-9a84-246574ddb42e.png)

Macだと、`Ctrl + Shift + L`を押せば文法の選択ができますよね。`VB.NET`が追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484310/6189b6c5-2b89-d1c1-46c1-aafbad656d03.png)

Menuバーから、Atom -> Configを選択します。
あとは下記を追加しておけばOKです。

```coffeescript

 "*":
  "file-types":
    "*.bas": "source.asp.vb.net"
core:
  customFileTypes:
    "source.asp.vb.net": [
      "bas"
    ]
```

結構他のHowtoだと、`customFileTypes`だけ追加すればOK、
となっているけど自身の環境は`file-types`を追加しないと色付けされませんでした。
Rails  windowsからMacへの移行

awsのクラウドIDEで、railsの環境をwindowsからmacへ移行する際の作業について述べる。
まず、awsのコンソールにログインし、cloud9のIDEを開く。そして、これまで作成していたアプリのディレクトリ下にあるgemfileを開く。

```ruby:Gemfile
source 'https://rubygems.org'

.
.

group :production do
  gem 'pg', '0.20.0'
  gem 'fog', '1.42'
end

# Windows環境ではtzinfo-dataというgemを含める必要があります
#gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```
一番下のコメントアウトしている部分はwindows使用時はコメントアウトしていなかったが、mac環境ではここの記述をコメントアウトし、ターミナルでbundle installすれば、これまで作成したアプリのファイル群をmacでもちゃんと機能させることができる。
Warning: AsyncStorage has been extracted from react-native core and will be removed in a future release.

# 概要

`AsyncStorage` を利用しようと思い、

```javascript
import { AsyncStorage } from 'react-native';
```

をしたらタイトルのWarningが出ました。
解決方法を書きます。

# Warning

テキストがコピペできなかったのでキャプチャ。

<img width="330" alt="スクリーンショット 2019-11-13 10.22.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3800/eb87c181-d9c5-06f3-529e-aa950401c7fb.png">

# 対応

丁寧にWarningに解決方法が書いてあるのでその通りに対応します。

```
% npm i @react-native-community/async-storage
```

インストールして、

```diff
-import { AsyncStorage } from 'react-native';
+import AsyncStorage from '@react-native-community/async-storage';
```

importを書き換える。

# まとめ

React Nativeの`AsyncStorage`で出たWarningの解決方法について書きました。
警告文中に解決方法まで書いてあるのは親切で良いです。
[メモ] Arduino(SAMD21系): リブートして、Bootloaderに入りたい。

- ソース見てて、こんなんでできそうだ、で、それっぽく動いた、という感じなので、もっとうまい方法があれば、教えてください。


# TL;DR

```c:アプリケーションを消してから、再起動して、ブートローダーへ
#include "Reset.h"
void reboot_to_bootloader_with_erasing_app()
{
    initiateReset(5); //Reboot After 5msec - Reset will be done in tick count timer.  
    delay(10);
}
```

```c:アプリケーションを消さずに、再起動して、ブートローダーへ
#include "Reset.h"
void reboot_to_bootloader_without_erasing_app()
{
    #define BOOT_DOUBLE_TAP_ADDRESS     (0x20007FFCul)
    #define BOOT_DOUBLE_TAP_DATA        (*((volatile uint32_t *) BOOT_DOUBLE_TAP_ADDRESS))
    #define DOUBLE_TAP_MAGIC            (0x07738135)
    BOOT_DOUBLE_TAP_DATA  = DOUBLE_TAP_MAGIC;
    NVIC_SystemReset() ;
}
```

# デモコード

```c:Bootloaderへ飛ぶデモコード
//Demo code
// # LEDが、5回点滅すると、ブートローダーへ。

#include "Reset.h"
void reboot_to_bootloader_with_erasing_app()
{
    initiateReset(5); //Reboot After 5msec - Reset will be done in tick count timer.  
    delay(10);
}
void reboot_to_bootloader_without_erasing_app()
{
    #define BOOT_DOUBLE_TAP_ADDRESS     (0x20007FFCul)
    #define BOOT_DOUBLE_TAP_DATA        (*((volatile uint32_t *) BOOT_DOUBLE_TAP_ADDRESS))
    #define DOUBLE_TAP_MAGIC            (0x07738135)
    BOOT_DOUBLE_TAP_DATA  = DOUBLE_TAP_MAGIC;
    NVIC_SystemReset() ;
}

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second

  {
    static int count = 0;
    if ( count++ == 5) { 
      //reboot_to_bootloader_with_erasing_app();
      reboot_to_bootloader_without_erasing_app();
    }
  }
}
```



# その他
- 関連
    - [[メモ] Arduino Zero(atsamd21/ARM Cortex-M0)系のbootloaderのビルド](https://qiita.com/mt08/items/9a70a670c289a1f3a53d)
、
JSPで接頭辞cがバインドされていませんとなった時の対応方法

- 環境
    - Windows10
    - Apache Tomcat 8.5.47
    - Eclipse Version: Oxygen.3a Release (4.7.3a)
    - Java version 1.8.0_231

# 事象 : JSPファイルを使った処理でログファイルにエラーが出た
```bash
Caused by: org.xml.sax.SAXParseException: 要素"c:choose"の接頭辞"c"がバインドされていません。
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
...
```

# 原因 : JSPファイルにJSTLのCoreライブラリが定義されていないから
```jsp
<%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<c:choose>
  <c:when test="${条件1}" >
    ...処理1...
  </c:when>
  <c:when test="${条件2}" >
    ...処理2...
  </c:when>
</c:choose>
```

## 対応1 : JSPファイルに接頭辞cを定義する
```jsp
<%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
...省略..
```

### 「"http://java.sun.com/jsp/jstl/core" のタグ・ライブラリー記述子が見つかりません」となった時の対応方法
- 参考
    - [JSTL coreタグライブラリの利用 - Qiita](https://qiita.com/sculptcat/items/53d1a3a2d3b973354085)
    - [Java JSTLのカスタムタグの導入と使用例のサンプル(core,i18n) | ITSakura](https://itsakura.com/java-jstl-core)

JSPファイルに接頭辞cを定義してコンパイルエラーになった場合は、そもそもcoreタグライブラリがないのでjarファイルを配置します。

1. [Apache Tomcatのサイト](https://tomcat.apache.org/download-taglibs.cgi)から環境に合ったjarをダウンロードする。
    - 今回のバージョンは1.2.5なので以下のjarをダウンロード
        - taglibs-standard-impl-1.2.5.jar
        - taglibs-standard-spec-1.2.5.jar
        - taglibs-standard-jstlel-1.2.5.jar
1. jarファイルをWEB-INF/libフォルダに配置する
GAE Standard(Go 1.12)でCloud SQL(PostgreSQL)に接続する

# GAE Standard(Go 1.12)でCloud SQL(PostgreSQL)に接続する

##　概要
GAEからCloud SQLに接続する際の情報が[公式ドキュメント](https://cloud.google.com/sql/docs/postgres/connect-app-engine?hl=ja)では、2019/11/13現在、PythonとJava、Node.jsまでしかなく、Goがどこ行った・・・？
この記事はそんなGo(1.12)でGORMを使って接続する際の情報を記載します。

## 結論
ホストに
`/cloudsql/[Cloud SQLがあるプロジェクトID]:[Cloud SQLがあるゾーン]:[Cloud SQLのインスタンス名]`
例:`/cloudsql/sampleproject:us-west1:postgresql`
を指定すればできます。それを以下で接続する。

```golang
db, err = gorm.Open("postgres", fmt.Sprintf("user=%s password=%s host=%s dbname=%s ",
		User,
		Password,
		Host,
		Name))
```

## 補足
[公式ドキュメント](https://cloud.google.com/sql/docs/postgres/connect-app-engine?hl=ja)ではGo1.11しかサポートしてない記述がありますが、Go1.12も使えます。
(C++テンプレート)関数テンプレートでの再帰について

以下のように再帰させようとすると、失敗する。
関数テンプレートでは、**テンプレート引数**による再帰はできない模様。

```cpp


template<int N,class T,typename std::enable_if<(N==0)>::type* = nullptr>
auto add_pointers(T) -> T*; 
   
template<int N,class T,typename std::enable_if<(N > 0)>::type* = nullptr>
auto add_pointers(T) -> decltype(add_pointers<N-1>(std::declval<T*>()));
   
int main()
{  
   
  decltype(add_pointers<0>(std::declval<int>())) val1;
  std::cout<<typeid(val1).name()<<std::endl;
   
  decltype(add_pointers<1>(std::declval<int>())) val2;
  std::cout<<typeid(val2).name()<<std::endl;
   
　//以下をコメントアウトすると、コンパイルが通る
  decltype(add_pointers<2>(std::declval<int>())) val3;
  std::cout<<typeid(val3).name()<<std::endl;                                                                                                                                                                                                                                     
} 

```
https://wandbox.org/permlink/pZwcjWU8r4dSoHOu


以下のように、**関数の引数の型**を変えれば、再帰させることが可能。

```cpp
template<int N>
struct int_{};

template<int N,class T,typename std::enable_if<(N > 0)>::type* = nullptr>
auto add_pointers(T,int_<N>) -> decltype(add_pointers(std::declval<T*>(),int_<N-1>()));
 
template<int N,class T,typename std::enable_if<(N==0)>::type* = nullptr>
auto add_pointers(T,int_<N>) ->T;

int main()
{
 
  decltype(add_pointers(std::declval<int>(),int_<3>())) a;
  std::cout<<typeid(a).name()<<std::endl;
}

```
https://wandbox.org/permlink/HrDZgfxnv4Ua8NuH
Windows10上のspacemacsで"No such file or directory xxx"を倒す

Windows10上のspacemacsで [typescript-layer](https://github.com/syl20bnr/spacemacs/tree/master/layers/%2Blang/typescript)の設定を入れ、 `eslint`を用いた自動フォーマットを試みた際に出たエラー。

```
Error: (file-missing "Searching for program" "No such file or directory" "diff")
```

diffなるものが無いと言われる。


# Cygwinを入れて解決
ほーん、て感じ。

参考 => https://emacs.stackexchange.com/questions/12864/comparing-two-text-files-on-a-windows-system/13026

- Cygwinをインストールする
- ユーザ環境変数PathにCygwinを追加する
    - たとえばユーザ環境変数として `変数名：CYGWIN` `値：Cygwinのbinへのパス (僕はC:\cygwin64\binだった)`を設定し、
    - ユーザ環境変数 `Path`に `%CYGWIN%`を追加する
- **spacemacsの環境変数 `.spacemacs.env`に追加されていることを確認 or 手動で追記**  
  spacemacsの環境変数はね………大変なんですよ……… :innocent:  
  ここにも書いた https://qiita.com/v2okimochi/items/82c541ba67c81493976c

---
Cygwinって凄いみたい。
参考 => https://www.ossnews.jp/oss_info/Cygwin

> Cygwin(シグウィン)とは、Windows上で疑似的なUNIX系OS実行環境を構築するためのソフトウェアパッケージです。Windows上で動くアプリケーションウィンドウ内にUNIX(Linux)環境を再現でき、ユーザーは多くの標準UNIXユーティリティを使用できます。

# MSYS2のほうが良いかも
[MSYS2](http://www.msys2.org/)もCygwinと同じ立ち位置のようで、こちらのほうが推奨されがち？

たとえばSpacemacsにスペルチェッカーを導入する際はMSYS2ですんなりいけた。
https://qiita.com/v2okimochi/items/c2d36471a40e094738b1

両方入れていると競合しそうなので、やはりMSYS2のほうが良いかも。ごめんて
Juliaで記号同士の計算がしたい~猫や犬の行列をかけて、猫で微分してみる

# SymEngine.jl

何かの数式の計算をする際に、記号同士の計算自体もJuliaにやらせたい、そんなときもあると思います。
例えば、行列と行列を掛け算した後に数字を代入したいとか。
これをやるパッケージとしてSymEngine.jlがありますので、紹介したいと思います。
https://github.com/symengine/SymEngine.jl

# バージョン
Julia 1.2

# インストール
インストールはいつものように、]を押してパッケージモードにしてから、

```
add SymEngine
```
とすればできます。

# 使い方
こんな感じのことができます。
## 記号の定義

```julia
using SymEngine
🐱 = symbols(:🐱)
🐶 = symbols(:🐶)
```
猫と犬を記号として定義します。これを使ってランダムな要素を持つ行列：

```julia
A = rand([🐶,🐱],3,3)
```
を定義すると、

```
3×3 Array{Basic,2}:
 🐶  🐶  🐶
 🐶  🐱  🐶
 🐱  🐶  🐱
```
ができます。
同様に、🍚と🍘を定義して、その行列も定義すると

```julia
🍚 = symbols(:🍚)
🍘 = symbols(:🍘)
B = rand([🍚,🍘],3,3)
```

```
3×3 Array{Basic,2}:
 🍚  🍚  🍚
 🍘  🍘  🍚
 🍘  🍘  🍘
```
となります。

この行列Aと行列Bをかけてみましょう。

```julia
C = A*B
```

```
3×3 Array{Basic,2}:
 🐱*🍘 + 🐶*🍘 + 🐶*🍚  🐱*🍘 + 🐶*🍘 + 🐶*🍚  🐱*🍚 + 🐶*🍘 + 🐶*🍚
     2*🐱*🍘 + 🐱*🍚      2*🐱*🍘 + 🐱*🍚      🐱*🍘 + 2*🐱*🍚
     🐱*🍚 + 2*🐶*🍘      🐱*🍚 + 2*🐶*🍘  🐱*🍚 + 🐶*🍘 + 🐶*🍚
```
となります。記号で計算ができていますね。

## 代入
ここで、🍚や🍘に数字を代入してみましょう。

```julia
c = subs.(C,🍘 .=>2.0)
```

```
3×3 Array{Basic,2}:
 2.0*🐱 + 2.0*🐶 + 🐶*🍚  2.0*🐱 + 2.0*🐶 + 🐶*🍚  2.0*🐶 + 🐱*🍚 + 🐶*🍚
         4.0*🐱 + 🐱*🍚          4.0*🐱 + 🐱*🍚      2.0*🐱 + 2*🐱*🍚
         4.0*🐶 + 🐱*🍚          4.0*🐶 + 🐱*🍚  2.0*🐶 + 🐱*🍚 + 🐶*🍚
```
ちゃんと数字が入りました。
ここで、subsというのは、

```
subs( 🐱*🍘 + 🐶*🍘 + 🐶*🍚,🍘 =>2.0)
```
のような使い方をする記号に数字などを代入する関数です。行列だったので.をつけて一気に演算してみました。
また、猫を犬に変えることもできて、

```julia
c = subs.(C,🐱 .=> 🐶)
```

```
3×3 Array{Basic,2}:
 2*🐶*🍘 + 🐶*🍚  2*🐶*🍘 + 🐶*🍚  🐶*🍘 + 2*🐶*🍚
 2*🐶*🍘 + 🐶*🍚  2*🐶*🍘 + 🐶*🍚  🐶*🍘 + 2*🐶*🍚
 2*🐶*🍘 + 🐶*🍚  2*🐶*🍘 + 🐶*🍚  🐶*🍘 + 2*🐶*🍚
```
ができます。

## 微分
微分もできてしまいます。

```julia
d = diff.(C,🐱)
```

```
3×3 Array{Basic,2}:
       🍘        🍘        🍚
 2*🍘 + 🍚  2*🍘 + 🍚  🍘 + 2*🍚
       🍚        🍚        🍚

```

## 行列要素
行列要素を定義することも簡単にできます。
例えば、

```julia
Cat = [symbols("🐱_$i$j") for i in 1:3, j in 1:4]
Dog = [symbols("🐶_$i$j") for i in 1:3, j in 1:4]
```
とすると、

```
3×4 Array{Basic,2}:
 🐱_11  🐱_12  🐱_13  🐱_14
 🐱_21  🐱_22  🐱_23  🐱_24
 🐱_31  🐱_32  🐱_33  🐱_34

3×4 Array{Basic,2}:
 🐶_11  🐶_12  🐶_13  🐶_14
 🐶_21  🐶_22  🐶_23  🐶_24
 🐶_31  🐶_32  🐶_33  🐶_34

```
添え字をつけることができます。
さらに、

```julia
Cat*transpose(Dog)
```
とすれば、

```
3×3 Array{Basic,2}:
 🐶_11*🐱_11 + 🐶_12*🐱_12 + 🐶_13*🐱_13 + 🐶_14*🐱_14  …  🐶_31*🐱_11 + 🐶_32*🐱_12 + 🐶_33*🐱_13 + 🐶_34*🐱_14
 🐶_11*🐱_21 + 🐶_12*🐱_22 + 🐶_13*🐱_23 + 🐶_14*🐱_24     🐶_31*🐱_21 + 🐶_32*🐱_22 + 🐶_33*🐱_23 + 🐶_34*🐱_24
 🐶_11*🐱_31 + 🐶_12*🐱_32 + 🐶_13*🐱_33 + 🐶_14*🐱_34     🐶_31*🐱_31 + 🐶_32*🐱_32 + 🐶_33*🐱_33 + 🐶_34*🐱_34
```
添え字同士の掛け算もできます。
(C++テンプレート)一部パラメータの明示について

###以下のように一部パラメータだけ明示するのは、部分特殊化の範疇らしい。

```cpp
template<int N,class T>
void func1();    
                 
template<class T>
void func1<0,T>();                                                                                                                                                                                                                                                                 
   
// 以下のように、完全な明示特殊化は可能              
//template<>     
//void func1<0,int>();
```

関数テンプレートでは部分特殊化ができないため、以下のようなエラーメッセージが出る。

```
error: non-type partial specialization ‘func1<0, T>’ is not allowed
 void func1<0,T>();
```

構造体では、部分特殊化が可能なため、以下のように書ける。

```cpp

template<int N,class T>
struct struct1{
  static const int value = 1;
}; 
   
template<class T>
struct struct1<2,T>{
  static const int value = 2;
}; 

int main()
{  
   
  std::cout<<struct1<1,int>::value<<std::endl;                                                                                                                                                                                                                                     
  std::cout<<struct1<2,int>::value<<std::endl;
  
}
```

###関数テンプレートの型推定は、一部パラメータだけに作用させることが可能

```cpp
template<int N,class T>
void func1(T val){                                                                                                                                                                                                                                                                 
  std::cout<<N<<" "<<val<<std::endl;
  };

int main()
{  
   
  int val = 10;
  func1<5>(val);
}
```
Kotlin 1.3のCoroutineのコンテキストとディスパッチャ⑤（親の責任 ）

# 検証環境
この記事の内容は、以下の環境で検証しました。

* Intellij IDEA ULTIMATE 2018.2
* Kotlin 1.3.0
* Gradle Projectで作成
* GradleファイルはKotlinで記述（KotlinでDSL）

# 準備
詳細は下記の準備を参照してください。
https://qiita.com/naoi/items/8abf2cddfc2cb3802daa

# Parental responsibilities
[前回](https://qiita.com/naoi/items/0534e409a25e46076ec6)に引き続き、[公式サイト](http://kotlinlang.org/docs/reference/coroutines/coroutine-context-and-dispatchers.html#parental-responsibilities)を読み解いていきます。

今回のタイトルは教育論でしょうかといった具合になっていますが、これまでの流れだと子コルーチンと親コルーチンの話の続きな気がします。

今回は短めです。
早速読み進めてみます。

> A parent coroutine always waits for completion of all its children. Parent does not have to explicitly track all the children it launches and it does not have to use Job.join to wait for them at the end:

訳します。

> 親コルーチンは常に、子コルーチンがすべて完了するまで待ちます。このため、親コルーチンはすべての子コルーチンをまつためにjoinメソッドを明示的に呼び出す必要はありません。

なるほど、言いたいことは親コルーチンは常に子コルーチンが終了するまで待つってことですね。

```kotlin
import kotlinx.coroutines.*

fun main() = runBlocking<Unit> {
    // launch a coroutine to process some kind of incoming request
    val request = launch {
        repeat(3) { i -> // launch a few children jobs
            launch  {
                delay((i + 1) * 200L) // variable delay 200ms, 400ms, 600ms
                println("Coroutine $i is done")
            }
        }
        println("request: I'm done and I don't explicitly join my children that are still active")
    }
    request.join() // wait for completion of the request, including all its children
    println("Now processing of the request is complete")
}
```

今回は、リピートで3つの子コルーチンを起動しています。
実行結果を確認してみます。

```text
request: I'm done and I don't explicitly join my children that are still active
Coroutine 0 is done
Coroutine 1 is done
Coroutine 2 is done
Now processing of the request is complete
```

実行結果から、子コルーチンが終わるまで待っているのは理解出来ます。
だけど、説明では、常に待っているからjoinは不要とあったので、コードからjoinを削除してます。
修正後のサンプルコードは以下です。

```kotlin
package step05

import kotlinx.coroutines.*

fun main() = runBlocking<Unit> {
    // launch a coroutine to process some kind of incoming request
    val request = launch {
        repeat(3) { i -> // launch a few children jobs
            launch  {
                delay((i + 1) * 200L) // variable delay 200ms, 400ms, 600ms
                println("Coroutine $i is done")
            }
        }
        println("request: I'm done and I don't explicitly join my children that are still active")
    }
    println("Now processing of the request is complete")
}
```

joinメソッドを削除してみました。
実行結果も確認してみます。

```kotlin
Now processing of the request is complete
request: I'm done and I don't explicitly join my children that are still active
Coroutine 0 is done
Coroutine 1 is done
Coroutine 2 is done
```

joinメソッドを削除することにより、main関数の最後の表示を先に出力します。
しかし、子コルーチンが終わるまでプロセスが終了していないことがわかります。

# まとめ
このブロックで理解できたことは以下のことだと思います。

* 子コルーチンが終了するまで、親コルーチンは終わらないこと
NuxtアプリをGitHub ActionsでGAE環境にデプロイする

※ 現在、GitHub Actionsは現在ベータ版で[こちら](https://github.com/features/actions)から申し込みできます。

### GitHub Actionsの制限事項
- リポジトリごとに最大20のワークフローを同時に実行可能
- 1時間に実行できるAPIリクエストは、1つのリポジトリの全アクションで最大1000まで
- ワークフローの各ジョブは、最大で6時間まで実行可能
- 同時に実行できるジョブの数は、GitHubの契約プランによって異なる

※ 詳細は[公式ドキュメント](https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions)を参照
個人的な所感ですが、CircleCIよりも優秀な気がします。

### 事前準備
1. GCPコンソールから、GitHub Actionsで利用するサービスアカウントを作成し、必要な役割(権限)を付与する<img width="1030" alt="gcp_service_account.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165108/0f96c299-f7a1-2650-f987-4e6eb7444b57.png">
2. デプロイ用のアクセスキーをjson形式で発行＋保存しておく
<img width="1413" alt="key_create.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165108/78557708-6e45-7f19-f746-f6eebb046bbd.png">


### ワークフロー/ジョブの設定
- `origin master`ブランチにpushされた場合のみワークフローを実行する
- Node.jsのバージョンを`10.16.0`で固定
- `yarn install / build`コマンド実行後に、[Cloud SDK](https://cloud.google.com/sdk/gcloud/?hl=ja) のCLIツールからデプロイを実行する

以下

```yml:.github/workflows/master.yml
name: CI

on:
  push:
    branches:
      - master

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [10.16.0]

    steps:
    - uses: actions/checkout@v1
    - name: Run tests with ${{ matrix.node-version }}
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node-version }}
    - name: yarn install, build
      run: |
        yarn install
        NODE_ENV=production yarn run build
    - name: GAE deploy
          run: |
            echo 'github-actions@{GCPプロジェクト名}.iam.gserviceaccount.com' | gcloud auth activate-service-account --key-file {事前準備で保存したjsonキーファイル}
            gcloud app deploy app.yaml --project {GCPプロジェクト名}

          env:
            CI: true

```

公式テンプレートにubuntuが入ってたのでそのまま使ってみましたが、gcloudコマンドがデフォルトで使えて感動しました

指定したブランチにpushが走ると、以下のようにGitHub上でワークフローが回っているのが確認できます
<img width="1042" alt="actions.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165108/ee705746-2a24-a0c4-c0fa-8dd6572b5731.png">
UE4、エディタ上でライトのちらつきやON/OFFを出来るようにした

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">エディタ上でライトのちらつきやON/OFFを出来るようにした <a href="https://t.co/Z8cZMVsmye">pic.twitter.com/Z8cZMVsmye</a></p>&mdash; 赤井ろにー🦇🌻 (@lo2_) <a href="https://twitter.com/lo2_/status/1194399079352037376?ref_src=twsrc%5Etfw">November 12, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ちょっとインスタンス編集の状況が分かりづらいけどこんな感じ
![PP1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531299/9a9246ea-1994-04c1-b894-96fd14495028.png)
Blueprint
![PP3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531299/a12419f6-fd14-3539-a2d3-e1d135af6ed9.png)
![PP2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531299/4d751acd-2a4f-7bac-da34-c67c1dcc4f6d.png)
もうちょっと賢い実装方ありそうだけど、まぁ実用範囲だと思う。思いたい。
HomePodとHomekitを使いたおそう！


![SmartHome.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452335/db2d85d3-656b-af98-80b4-ba79d426e985.jpeg)
この記事はスマートスピーカー Advent Calendar 2019 14日目の記事です。

今年のWWDC19に初参加して、会場でのSwift UI発表の衝撃を実感しましたが、私は利用活用の少ないHomeKitに非常に興味を持ち、無いのなら作ろうと、HomeKit対応機器を作り始めました。
今回はiOS13の新しくサポートされたNFCショートカットを用いて、NFCにタッチすることにより、HomeKit機器をON/OFFした事例を紹介します。

# 必要なもの
- NFCタグ
- iPhone(NFC対応機種)
- HomeKit対応機器

# NFCタグをスキャンする
![IMG_9554.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452335/41c2df83-7ae7-4242-08aa-d9794401c2fd.png)

# 新規オートメーションでマイホームをコントロールする
![IMG_9555.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452335/604f9c91-e5bd-4743-2ec0-07082cfdaa55.png)

# HomeKit技術本(技術書典８向けに執筆中)
- HomeKitでLチカする
- 2000円から始める監視カメラを自作する
- NFCタグでiOSアプリおよびHomeKitとの連係する
- HomePodのメリットとデメリット
![IMG_9556.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452335/d4987403-a0ac-f896-48be-ece3bcee562b.jpeg)
ちょっとした確認で使えるHTTPS ProxyをDockerで作る

ContentSecurityPolicyの導入やCookieのsecure属性付与、URLに含まれるスキーマの確認等、HTTPSを使って確認したくなるシーンが最近増えてきたのでサクッと使えるHTTPS ProxyをDockerで作ってみる。

最初nginx-proxyを使ってみようかと思ったけど、いちいち証明書を作るのも面倒だし、docker.sockを渡したくなかったのでサクッと作ってみることにした。

前提としてアプリやDB等が記載された `docker-compose.yml` があるものとする。

まずDockerfileを作る。アプリのものと混同しないためにファイル名を `Dockerfile.ngix` としている。

```dockerfile:Dockerfile.nginx
FROM nginx:latest
 
ARG VIRTUAL_HOST="localhost"
ENV VIRTUAL_HOST ${VIRTUAL_HOST}

ARG APP_HOST="http://app:3000"
ENV APP_HOST ${APP_HOST}

RUN mkdir -p /etc/nginx/certs

RUN apt-get update -qq && \
    apt-get install -y -qq openssl ssl-cert && \
    apt-get clean -qq && \
    rm -rf /var/lib/apt/lists/*

RUN echo "server {\n\tlisten 443 ssl;\n\tserver_name _;\n\tssl_certificate certs/ssl.pem;\n\tssl_certificate_key certs/ssl.key;\n\tlocation / {\n\t\tproxy_set_header X-Forwarded-Proto \$scheme;\n\t\tproxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;\n\t\tproxy_set_header Host \$http_host;\n\t\tproxy_set_header X-Real-IP \$remote_addr;\n\t\tproxy_redirect off;\n\t\tproxy_pass ${APP_HOST};\n\t}\n}\n" > /etc/nginx/conf.d/default.conf

RUN openssl req -batch -new -x509 -newkey rsa:2048 -nodes -sha256 \
      -subj /CN=${VIRTUAL_HOST} -days 3650 \
      -keyout /etc/nginx/certs/ssl.key \
      -out /etc/nginx/certs/ssl.pem
```

次に上記のDockerfileをdocker-composeに組み入れる

```yaml:docker-compose.yml
version: "3.7"

services:
  ### ここから ###
  web:
    build:
      context: .
      dockerfile: Dockerfile.nginx
      #args:
      #  VIRTUAL_HOST: localhost
      #  APP_HOST:     http://app:3000
    ports:
      - 443:443
    depends_on:
      - app
  ### ここまで ###

  app:
    build:
### 後略 ###
```

この状態で docker-compose を立ち上げ、 https://localhost にアクセスすると、 docker-composeに記述された appサービスの 3000番ポートにプロキシされます。（証明書が自己署名証明書なのでセキュリティ警告は出ますが。）

もしアクセスするドメインを`localhost`以外に変更したい場合は docker-compose の `VIRTUAL_HOST` を、 バックエンドのサービスを app:3000以外に変えたい場合は同様に `APP_HOST` を書き換えてbuildしなおすことでドメインやバックエンドを切り替えて確認することができます。


```yaml:docker-compose.yml
version: "3.7"

services:
  ### ここから ###
  web:
    build:
      context: .
      dockerfile: Dockerfile.nginx
      args:
        VIRTUAL_HOST: 127.0.0.1.xip.io
        APP_HOST:     http://app2:8080
    ports:
      - 443:443
    depends_on:
      - app2
  ### ここまで ###

  app:
    build:
### 後略 ###
```

ビルドのたびに証明書の組み直しは走るものの、ちょっと確認するにはちょうどいい規模のものになったかな。
Railsチュートリアル 第9章[余談] - Rails 5.0 以降、assigns（およびassert_template）は非推奨

# 概要

Rails 5.0 以降においては、`assigns`メソッドの使用は非推奨とされています。`assigns`（および`assert_template`）はRails本体に含まれなくなったため、別途`rails-controller-testing`というgemをインストールする必要があります。

# Railsチュートリアル本文において

そういえば、Railsチュートリアル本文では、[第3章](https://railstutorial.jp/chapters/static_pages?version=5.1#cha-static_pages)で**しれっと**`rails-controller-testing`をGemfileに書き足していました（[リスト 3.2](https://railstutorial.jp/chapters/static_pages?version=5.1#code-gemfile_sample_app)）。minitest reporters や Guard と違って説明もなかったのですが、ここで必要となるわけです。

```:Gemfile
source 'https://rubygems.org'

# ...略

group :test do
  gem 'rails-controller-testing', '1.0.2'
  gem 'minitest',                 '5.10.3'
  gem 'minitest-reporters',       '1.1.14'
  gem 'guard',                    '2.13.0'
  gem 'guard-minitest',           '2.4.4'
end
```

## `assert_template`もバリバリ使っている

なお、Railsチュートリアル本文では、[第5章](https://railstutorial.jp/chapters/filling_in_the_layout?version=5.1)以降で`assert_template`をバリバリ使っています。Rails 5.0 版以降のRailsチュートリアルで、第5章を無事完走できたのであれば、`rails-controller-testing`は既にインストールされているはずです。
【Rails】valid?とinvalid?メソッド

# valid?とinvalid?

## valid?
バリデーションが実行された結果
エラーが無い場合`true`を返し，エラーが発生した場合`false`を返す

``` micropost.rb
class Micropost < ApplicationRecord
  validates :content, presence: true, length: { maximum: 140 }
end
```

``` micropost_test.rb
  test "content should be at most 140 characters" do
    @micropost.content = "a" * 141 #=> false
    assert_not @micropost.valid?
  end
```

## invalid?
`valid?`とは逆の結果を返す
エラーが発生した場合`true`，エラーが無い場合`false`を返す

## 参考
[Active Record バリデーション - Rails ガイド] (https://railsguides.jp/active_record_validations.html#valid-questionmark%E3%81%A8invalid-questionmark)

[13.1.2 Micropostのバリデーション - Railsチュートリアル] (https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-micropost_validations)
[翻訳] DirectX 12 に登場：メモリ割り当ての制御の強化

# 説明
この文章は、DirectX Developer Blog の Jesse Natalie さんによる投稿の「[Coming to DirectX 12: More control over memory allocation](https://devblogs.microsoft.com/directx/coming-to-directx-12-more-control-over-memory-allocation/?fbclid=IwAR2f3i15Mu-oSCaWOb0izp5cq-korD2DxVcDI-YS3wbrFMlKEOCBjmmZTsw)」の勝手な翻訳です。


# DirectX 12 に登場：メモリ割り当ての制御の強化

Windowsの次のアップデートで、D3D12 の<b>D3D12_HEAP_FLAG</b>列挙体に2つの新しいフラグを追加します。新しいフラグは「一時的な」プロパティであり、結果のメモリ自体には影響せず、割り当て方法に影響します。つまり、大切なことですが、これらのフラグは ID3D12Heap::GetDescや、ID3D12Resource::GetHeapProperties に影響しないことに注意してください。深堀りしていきましょう。

# D3D12_HEAP_FLAG_CREATE_NOT_RESIDENT

今日、D3Dにヒープやコミット済みリソースを割り当てるように要求すると、オブジェクトが使えるようになる直前に起こることは、常駐メモリの確保です。
これは、実行される ID3D12Device::MakeResident を呼び出すことと同じですが、2つの問題があります:

1. MakeResident の設計では、メモリが完全に使えるようになるまで、あなたのCPUスレッドはブロックされます。あなたは、時々この状況を望まないでしょう。
2. MakeResident を使用すると、現在のプロセス予算が必要とする範囲を超えて、メモリをコミットし過ぎます。

妙な話ですが、これら2つの理由が、**まさに** ID3D12Device3::EnqueueMakeResident を追加した理由です。
これにより、CPUではなくGPUを使って常駐待ちをしたり、予算を超過するのではなく常駐操作を失敗させるなど、アプリでさまざまな選択ができます。
非常駐状態のメモリを割り当てられることで、アプリ開発者がリソースを最初に使う際に、これらの利点の両方を享受できるようになりました。

# D3D12_HEAP_FLAG_CREATE_NOT_ZEROED

これは、D3Dがこれまで明示的に呼び出したことのない項目の1つですが、一歩踏み込んで、このステートメントを作成します。D3Dによって新規に作成されたコミット済みのリソースやヒープは、ほとんど[^1]常にコンテンツをゼロに初期化します。以前は実装の詳細事項でしたが、WDDM2.0メモリマネージャーの開発中に、プロセスがゼロ化しないメモリ範囲も再利用できるようにすることによるパフォーマンスの改善を試みました。やってみると、これは壊滅的な結果をもたらしました。Windowsエコシステムのアプリケーションは、特定のプロパティを持つ新規リソースはゼロになっているという事実に強く依存していたのです。

[^1]:  実際には、ゼロ化は、リソースサイズとCPUの可視性(OSリリースごとやCPUアーキテクチャごとの、プロパティの変化の詳細)に依存します。

そのため、ゼロ化されたメモリを返すことに戻る必要がありました。なぜこれが悪いのでしょうか？高価だからです！これは、メモリマネージャーがメモリを渡す前にメモリに明示的にゼロを書き込む必要があることを意味します。これは、作成呼び出し中に発生するか、メモリに最初にアクセスするまで遅延される可能性はあります。しかし、確実に起きるのです。

ヒープ/リソースの割り当て時にこの新しいフラグを指定するだけで、このコストから開発者が手を引けるようにしました。ただし、これは保証ではなく、最適化要求にすぎないことに注意することが重要です。別のプロセスから使用可能なメモリが送られてきた場合、セキュリティやプロセス分離の目的から必ずゼロ化されたメモリが渡されます。しかし、自分が解放したメモリを再利用するのであれば、そのメモリは再ゼロ化する必要なく安価にリサイクルできます。

初期化されていないメモリにアクセスするためのルールがここで適用されることに注意するのが重要です。配置済みリソースの作成や、予約済みリソースへのタイルのマッピングと同じ事（レンダーターゲットや深度ステンシルフラグを持つリソースは、使う前にクリア、破棄、またはコピーする必要がある）です。 CreatePlacedResource のドキュメントの「[要求したリソースの初期化に関する注意](https://docs.microsoft.com/ja-jp/windows/win32/api/d3d12/nf-d3d12-id3d12device-createplacedresource#notes-on-the-required-resource-initialization)」のセクションを読んでください。

これらのフラグは素晴らしく聞こえます。罠はないでしょうか? 唯一の落とし穴は、利用する前に利用可能なことを確認する必要があることです。フラグを使うのに新しいドライバーは要りません。必要なのは、フラグを理解するD3D12のバージョンで実行することだけです。専用のCheckFeatureSupportオプションはありません。ID3D12Device8 が公開されるか、D3D12_FEATURE_D3D12_OPTIONS7 のチェックが成功すれば、いつでも使えます。

# はじめよう

あなたのアプリでこれらフラグを有効にするには、Windows Insider Program から最新のWindows 10 Insider PreviewビルドとWindows 10（20H1）用SDK Preview Buildをインストールしましょう。
Arduino IDE でESP8266に書き込もうとするとesptool.FatalError: Timed out waiting for packet headerとエラーが出力されるときの対処法

#問題点
Arduino IDEを用いてESP８２６６に書き込もうとすると下のようなエラーが出力されて書き込めない。

``` bash
esptool.FatalError: Timed out waiting for packet header
```
#解決方法
>https://entotsu44.hatenablog.com/entry/2019/09/10/185345
Nextjsでレガシーブラウザ対応

## 概要

- Next.jsを使っているアプリでIE対応しないといけないような場合の対処法
- [公式のexample](https://github.com/zeit/next.js/tree/canary/examples/with-polyfills)参考にしています

## 手順

- next.config.jsに以下の内容を追加

```js:next.config.js
module.exports = {
  webpack: function(cfg) {
    const originalEntry = cfg.entry;
    cfg.entry = async () => {
      const entries = await originalEntry();
      if (entries['main.js'] && !entries['main.js'].includes('./client/polyfills.js')) {
        entries['main.js'].unshift('./client/polyfills.js');
      }
      return entries;
    };
    return cfg;
  },
};
```

- polyfillの設定
    - exampleでは以下のように個別に設定している

```js:client/polyfills.js
/* eslint no-extend-native: 0 */
// core-js comes with Next.js. So, you can import it like below
import includes from 'core-js/library/fn/string/virtual/includes'
import repeat from 'core-js/library/fn/string/virtual/repeat'
import assign from 'core-js/library/fn/object/assign'

// Add your polyfills
// This files runs at the very beginning (even before React and Next.js core)
console.log('Load your polyfills')

String.prototype.includes = includes
String.prototype.repeat = repeat
Object.assign = assign
```

- 足りないものを個別に追加していくのが面倒であればcore-jsをまるごとimportしてしまってもいいかも

```js:client/polyfills.js
import 'core-js';

console.log('Load your polyfills');
```
Spring Initializr のパッケージング JAR と WAR の差異

## Spring Initializr で Web アプリケーションを生成

[Spring Initializr](https://start.spring.io/) にて以下の設定で Web アプリケーションの雛形を生成する。

- Project: Gradle Project
- Language: Java
- Spring Boot: 2.2.1
- Java: 8
- Dependencies: Spring Web

Packaging の項目を Jar および War にしたものをそれぞれ生成して diff コマンドで差分を取った。

## Jar と War の差異

```
$ diff -r jar war
diff -r jar/demo/build.gradle war/demo/build.gradle
4a5
> 	id 'war'
16a18
> 	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
Only in war/demo/src/main/java/com/example/demo: ServletInitializer.java
```

## Gradle War Plugin

War のアプリケーションには Gradle の War Plugin が追加されている。

```
id 'war'
```

War Plugin は war ファイルを生成するタスクを追加するプラグイン。

参考: [The War Plugin](https://docs.gradle.org/6.0/userguide/war_plugin.html)

## Spring Boot Tomcat Starter

War のアプリケーションには Spring Boot Tomcat Starter が providedRuntime で指定されている。 

```
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
```

これはローカル環境での実行時には組み込み Tomcat が使われるが、providedRuntime を指定することで war ファイル生成時には組み込み Tomcat を含めない設定になっている。
参考: [Maven Repository: org\.springframework\.boot » spring\-boot\-starter\-tomcat](https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-tomcat)

## ServletInitializer

War のアプリケーションには ServletInitializer が追加されている。

```java
package com.example.demo;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(DemoApplication.class);
  }

}
```

これは、war ファイルをデプロイして動作させる環境で必要な WebApplicationInitializer インターフェースを実装したクラスになる。
参考: [SpringBootServletInitializer \(Spring Boot Docs 2\.2\.1\.RELEASE API\)](https://docs.spring.io/spring-boot/docs/2.2.1.RELEASE/api/org/springframework/boot/web/servlet/support/SpringBootServletInitializer.html)
apt-getとaptの使い分け

　理科大要素０の記事です。常識だったらすまん。

# aptだけで良いと思ってました……

aptって知ってますか？Debian系のlinuxOSでソフトを入れるコマンドですね。昔はapt-getでしたが、いつからかこのaptコマンドが出てきました。

aptは基本的に apt-get や apt-cache 等のコマンドのラッパーで、

https://www.debian.org/doc/manuals/debian-handbook/sect.apt-get.ja.html

をみると、
>apt-get は最初のコマンドラインベースフロントエンドで、APT プロジェクト内で開発されました。apt は APT から提供されているもう一つのコマンドラインベースフロントエンドで、apt-get の持っていた設計上のミスを克服しています。 

完全にaptを推奨しているし、そのことを言及している記事もあったから、apt-getは要らないものだと思っていましたが

こちらの[リファレンス](https://www.debian.org/doc/manuals/debian-reference/ch02.ja.html#_literal_apt_literal_vs_literal_apt_get_literal_literal_apt_cache_literal_vs_literal_aptitude_literal)では、

>ユーザーは インタラクティブ 用途には apt(8) コマンドを使うことが推奨されますし、シェルスクリプト中ではapt-get(8) や apt-cache(8) コマンドを使うことが推奨されます。

と書いてあります。aptはapt-getと違い、プログレスバーが出てくるのと、毎回不要になったdebファイルを削除するみたいです。シェルスクリプトではapt-get installで一通りインストールしたあとに、最後にapt-get autoremoveするのがよさそう？

aptitudeコマンドはバグった依存関係直すときにしか使わないのでわかりません。誰か教えて

## 参考

https://www.debian.org/doc/manuals/debian-handbook/sect.apt-get.ja.html

https://www.debian.org/doc/manuals/debian-reference/ch02.ja.html#_literal_apt_literal_vs_literal_apt_get_literal_literal_apt_cache_literal_vs_literal_aptitude_literal
macOS Catalina で Fabric が使えなくなったら

OSX を Catalina にアップグレードしたら Fabric を使うとエラーがでるようになりました。

```
% python
Python 3.7.5 (default, Nov  1 2019, 02:16:23) 
[Clang 11.0.0 (clang-1100.0.33.8)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import fabric
zsh: abort      python
```

Fabric と一緒にインストールされる asn1crypto をアップグレードすると直ります。

```
% pip install -U asn1crypto
```

おしまい。
[rails]rails newできない[Gem::Ext::BuildError:]

rails newを実行した時に下記のようなエラーが出る場合

```
Installing mysql2 0.5.2 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/user_name/Programs/web/foobar-repo/vendor/bundle/ruby/2.5.1/gems/mysql2-0.5.2/ext/mysql2
/Users/user_name/.rbenv/versions/2.5.1/bin/ruby -r 

(中略)

An error occurred while installing mysql2 (0.4.4), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.4.4'` succeeds before bundling.
```

##実行するコマンド
```
$ gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/' -- --with-cppflags=-I/usr/local/opt/openssl/include --with-ldflags=-L/usr/local/opt/openssl/lib
```
下記のコマンドを実行し、新しく作成したフォルダに移動し、bundle installする。
DSP FMラジオ RDA5807FP+ATTINY85+AQM0802A その6 STC割込み


#はじめに
* 電池駆動DSPラジオのその6。SEEKでの受信完了を割込みを用いてATTINY85で処理する話です。

#選局完了のトリガ処理
* [その２](https://qiita.com/dabodabo/items/c318afb4c7a84c0f58e8)でも書きましたが、RDA5807FPは、SEEK機能での選局が完了すると、GPIOピンがトリガを発生します（要レジスタ設定）。
* このトリガを利用して、周波数、RSSIを読み込むようにします。想定していたのは以下のような形。
    * SEEK機能開始　→　ある周波数を選局　→　トリガ発生　→　ATTINY85で割り込み発生　→　RDA5807FPのレジスタからデータ読み込み　→　LCDにデータ表示　→　割込み終了
* ところが、実際のコードを作成するにあたっては、以下の理由により、少し形を変更する必要がありました。
    * 割込み関数（割込み発生後に飛ぶ関数）の中では、WIRE関数（レジスタからの読み込みに利用）は利用できない（すべきではない）。なぜならWIRE関数も割込み処理を行うため、2重に割込みをかけることになってしまうため。
* なので実際の処理は以下のような形になりました。
    * SEEK機能開始　→　ある周波数を選局　→　トリガ発生　→　ATTINY85で割り込み発生　→　割込み関数でフラグを変更し割込み終了　→　このフラグをLOOPで監視して、周波数表示関数へ飛ぶ
* 割込み関数の中では、WIRE関数は用いず、単にフラグを変更し、フラグの状態をLOOPで監視するような形です。ワンクッション置くようなイメージでしょうか。
* この形で動作はしたのですが、よく考えてみると、割込みを使っている意味が小さいような気もしてきました。結局LOOPで監視するのなら、割込みを用いなくても処理可能な気もします。
* 今回は、勉強も兼ねているので割込み処理を使うことにしています（実際、勉強になりました）。

#ATTINY85の割込み機能
* ATTINY85（というかAVRマイコン）の割込み機能には以下の2種類の割込みがあります。
    * 通常割込み（INT0とかINT1とか）：いわゆる普通の割込み。トリガの種類（立ち上がり、立下り）なども指定可能。
    * ピンチェンジ（Pin Change）割込み（PCINT0とか）：いろいろ制限あり。High⇔Lowの変化が起きると、どちらの方向であっても割込みが発生してしまいます。
* 本件でも通常割込み（INT0）を用いる予定でした。ATMEGAで試作したときは通常割込みでよかったのですが、ATTINY85の場合、ピン数が少ないため、通常割込みが利用できないことがわかりました。
* ピンアサインは適宜ググってほしいのですが、ATTINY85の場合、通常割込みピンは1つだけなのですが、このピンがI2CのSCKと同じピンアサインとなっているため、本件の割込みには利用できないのです。
    * Pin7(PB2): SCK/INT0
* 従って、ピンチェンジ割込みを利用せざるを得なくなり、以下のピンを利用しています。RDA5807FPのGPIOピンをPin3に接続することになります。
    * Pin3(PB4): PCINT4

#PCINTを利用する場合の注意点
* PCINTは、High⇔Lowのどちらでも割込みが起きてしまいます。RDA5807FPからのトリガは「High　→　Low　→　High」という形ですので、1回のトリガで2度割込みが発生することになります。1回目：High　→　Low、　2回目：Low　→　High。
* 割込み処理は1回でよいので、2度目の割込みでは割込み処理は行わないようにしました。具体的には、割込みピンの状態がLowの時だけ割込み処理を行います。そうすると2回目の割込みでは割込み処理は行われないことになります（割込みピンがHighなので）。
* このような処理は面倒なので出来れば通常割込み（INT0）を使いたかったのですが…

#ATTINY85の割込み設定
* PCINT4を利用するための設定は以下の通りです。[データシート](https://avr.jp/user/DS/PDF/tiny45.pdf)のp34あたりを参照してください。

```
GIMSK = B00100000; //PCINT ENABLE
PCMSK = B00010000; //PCINT4 ONLY
```
* PCINTが発生した場合に飛ぶ関数は、以下のような形にて指定します。上記で触れたように、ピンの状態がLowのときだけ割込み処理をしています。

```
ISR(PCINT0_vect){
 if(digitalRead(4)==0)
      stc=1;
}
```
* 「PCINT4を利用しているのに、何故PCINT0_vectなのか」という点については、「PCINT0~PCINT7は割込ソース0を利用しているから」ということになります。

#おまけ
* ATTINY85の前に、ATMEGAで試作してみたのですが、その時はピンに余裕があり、通常割込みで割込み処理を行っていました。ATTINY85ではPCINTを利用することになりましたが、図らずも両方を勉強できました。
* 2重割込みを許可する命令（sei）があるようですが、今回は使いませんでした。2重割込みは用いない方が良い、という記事が多かったので。
【Ruby】`all?`と類似メソッドまとめ

## はじめに
Rubyで**繰り返し処理**を使って**条件を満たしているかどうか**を確認したいことって多くないでしょうか。

今回はそのメソッドのうちの一つ`all?`とその類似メソッドについてまとめています。

## この記事が役に立つ方
- 繰り返し処理はつい`each`ばかりを使ってしまう
- 条件を満たしているかどうかは`if`ばかり使ってしまう
- Ruby初心者

## この記事のメリット
- `all?`が使えるようになる
- 繰り返し処理の引き出しが増える

## 環境
* Ruby 2.6.3

## `all?`メソッドとは？

[公式リファレンス](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/all=3f.html)によると、

> すべての要素が真である場合に true を返します。 偽である要素があれば、ただちに false を返します。
> ブロックを伴う場合は、各要素に対してブロックを評価し、すべての結果 が真である場合に true を返します。ブロックが偽を返した時点で、 ただちに false を返します。

### 基本構文

```ruby
all? {|item| ... } -> bool # ブロックを使う場合
all?(pattern) -> bool # パターンを指定する場合
```

では、以下の例で実際の動きを見てみましょう。

## 挙動と類似メソッド
### 前提
以下のような配列`array1`と`array2`、`empty_array`を定義します。

```ruby
array1 = [1, 2, 3, 4, 5]
array2 = [-1, 0, 1, 2, 3]
empty_array = [] # 空の配列
```

この３つの配列について、それぞれメソッドと条件を変えながら挙動をみていきましょう。

---
### `all?`　全てが真か？

条件：全てが正の数か？

`empty_array`は`true`が返されることに注意です。

```ruby
array1.all?{ |n| n > 0 }
=> true

array2.all?{ |n| n > 0 }
=> false

empty_array.all?{ |n| n > 0 }
=> true
```

---
### `none?`　全てが偽か？

条件：すべてが３以上「でない」か？（３以下か）

`all?`のときと同様、`empty_array`は`true`が返されます。

```ruby
array1.none?{ |n| n > 3 }
=> false

array2.none?{ |n| n > 3 }
=> true

empty_array.none?{ |n| n > 3 }
=> true
```

---
### `any?`　１つでも真か？

条件：１つでも０以下か？

`empty_array`は`false`が返されます。

```ruby
array1.any?{ |n| n < 0}
=> false

array2.any?{ |n| n < 0}
=> true

empty_array.any?{ |n| n < 0 }
=> false
```

---
### `one?`　１つだけ真か？

条件：１つだけ０以下か？

`empty_array`は`false`が返されます。

```ruby
array1.one?{ |n| n < 0}
=> false

array2.one?{ |n| n < 0}
=> true

empty_array.one?{ |n| n < 0 }
=> false
```

## おわりに
`empty_array`の`true`、`false`の理由がなぜなのか、イマイチ理解しきれませんでした。

もし中のロジックが分かる方がいらっしゃいましたら教えて頂きたいです。:bow_tone1:

とりあえず、そういうものと捉えています。:sweat_smile:

### 【2019/11/13 追記】
@scivolaさんにコメント頂き、無事解決しました！
いつもありがとうございます。:relaxed:

## 参考にさせて頂いたサイト（いつもありがとうございます）
[module Enumerable (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/latest/class/Enumerable.html#I_ALL--3F)
[instance method Enumerable#all? (Ruby 2.6.0)](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/all=3f.html)
Railsを触っていたら".yml"とかいう謎のファイルが出てきたぞ。簡潔に説明しろ

## 概要

yamlとはなんなのかについて、なるべく簡潔に、わかりやすくまとめてみた記事です。

解釈に間違い等ありましたらなんなりとご指摘いただければ幸いです！

## ざっくりと概要を説明しろ

配列、または連想配列（ハッシュ）を独自の書き方で作成するためのファイルです。

そして、視覚的に読みやすい、という点でよく設定ファイルに使用されているファイル（らしい）です。

```database.yml

# railsでよく見る"database.yml"

default: &default
  adapter: postgresql
  host: 127.0.0.1
  encoding: utf8
  username: postgres
  password: postgres

development:
  <<: *default
  database: postgres

test:
  <<: *default
  database: postgres_test

production:
  <<: *default
  database: postgres
```


## 書き方を解説しろ

主な記法は以下になります

この他にもいくつかありますが、もっと詳しく知りたい方は”参考記事”にて


```yml
# 配列を定義するには、 - または [] を使用する

- ruby
- on
- rails
-
  - post
  - gres
- yml
# => ["ruby", "on", "rails", ["post", "gres"], "yml"]

[ja, va]
# => ["ja", "va"]
```
```yml
# 連想配列（ハッシュ）を定義するには、 : または {} を使用する

can_use:
  ruby: rails
  php : larabel
# => { "can_use" => { "ruby" => "rails", "php" => "larabel" }}

{ javascript: react, css: bootstrap }
# => { "javascript" => "react", "css" => "bootstrap" }
```
```yml
# もちろん同時に使用可能

suzuki:
  - ruby
  - php
sato:
  - python
  - java
# => { "suzuki" => ["ruby", "php"], "sato" => ["python", "java"] }
```
```yml
# 変数（のようなもの）を定義するには、 & を、呼び出すには * を使用する
# 下記の例の場合、&good に続く ["suzuki", "sato"] が変数へと代入される

ruby: &good
  - suzuki
  - sato
php: *good
# { "ruby" => ["suzuki", "sato"], "php" => ["suzuki", "sato] }

# ハッシュのマージを行うためには、 << を使用する

user: &user
  id: suzuki
  password: suzukiex

develop:
  env: develop
  <<: *user
# => { "user" => { "id" => "suzuki", "password" => "suzukiex" }, "develop" => { "env" => "develop", "id" => "suzuki", "password" => "suzukiex" }}
```

## rubyでの使い方を教えろ

上記の通り、これはただの 配列 や ハッシュ を視覚的にわかりやすくしたものでしかないので、同様の使い方ができます（説明の欄でも書いたとおり、設定に使用されることが多いようです）

具体的には、以下のようにしてファイルを開き、使用します


```test.yml
math: S
japanese: A
english: A
science: C
```

```test.rb
File.open('test.yml') do |yml|
  YAML.load_documents(yml) do |yml|
    puts yml
  end
end
# => { "math" => "S", "japanese" => "A", "english" => "A", "science" => "C" }
```


##参考記事

- https://qiita.com/Yama-to/items/587544993fb62610528a
- https://qiita.com/tfrcm/items/5f8e4c5795ce41b214d1