OmniAICreator/Qiita-1.07M huggingface dataset:
Swiftのプロトコルについて

##プロトコルとは？
プロトコルとは日本語で議定書を意味し、クラスや構造体が実装するプロパティとメソッドなどの最低限の決まり事を設定する機能です。
JavaやC#のインターフェースにあたります。プロトコルを適用したクラスや構造体は、プロトコルに定義されているメソッド・プロパティを必ず実装しないといけません。

##プロトコルのメリット
####・実装を後から変更できる。
プロトコルの定義だけしておき、そのクラスや構造体ごとにプロパティやメソッドをを使用する箇所は変更することなく、処理を変えたい場合に有効です。
####・構造体を使用することができる
似た処理を行うクラスを複数定義する場合、スーパークラスと呼ばれる元となるクラスを作成し、それを継承するそれぞれのクラスで異なる部分を実装するという方法があります。しかしSwiftの構造体では継承を行うことができません。その代わりにプロトコルを用いることで同じようなことが構造体に実現できるのです。
####・複数のプロトコルを適用することができる
クラスは一つのクラスしか継承できませんが、プロトコルは複数適用することが可能です。日本語訳は議定書という意味にある通り、例えばある国が他国と複数の条約や決まり事を結ぶようにプロトコルも複数結ぶことができるということです。そこに関しては他言語のインターフェースと一緒です。

##プロトコルの定義

```
protocol プロトコル名 {
 var プロパティ名: 型 { get set }
 func メソッド名（引数名: 型) ->　戻り値型
}
```
「プロパティ名: 型」の横には{get set}という記述があります。
これはプロパティの設定をしている記述で、
{get set}は読み書き可能なプロパティ、{get}は読み込み専用プロパティを意味します。
※注意点としては{set}は定義することができません。

##プロトコルの適合
プロトコルの具体的な処理は、クラスや構造体で実装します。
クラスや構造体がプロトコルの実装を行うことを「プロトコルを適合する」と表現し、継承などとは異なります。

構造体の場合

```
struct 構造体名: プロトコル名 {
 //処理の実装
}

```

クラスの場合（プロトコルの複数指定もしてます。）

```
class クラス名:  プロトコル名,　プロトコル名  {
    //処理内容
}
```
スーパークラスを継承したクラスの場合

```
class クラス名: スーパークラス名, プロトコル名, プロトコル名 {
     //処理内容
}
```

##プロトコルの使用例

```
//プロトコルの定義
protocol Calculation {
    var num1: Double {set get}
    var num2: Double {set get}
    //関数に処理内容を記載しない
    func calc() -> Double
}

//プロトコルの適合
struct Bmi: Calculation {
    var num1: Double
    var num2: Double
　　//処理内容を追加
    func calc() -> Double {
        return num1 / (num2 * num2)
    }
}
let bmi = Bmi(num1: 65.0, num2:1.78 )
print(bmi.calc())

//実行結果
20

```
上記のコードを見ると、まず２つの数値をプロパティに持ち、計算を行うメソッドを定義したプロトコルを定義します。
その次に構造体Bmiにプロトコルを適合し、bmiの処理内容をメソッドに追加します。
そして、定数bmiに本引数を持った構造体Bmiを代入します。
結果としてprintで実行し、結果が出力されます。

##エクステンションによるプロトコルの拡張
プロトコルを拡張することで、メソッドにデフォルトの処理を実装することができます。変数の宣言で言う、初期値を設定するみたいなものです。
プロトコルを拡張するには、extention(エクステンション)という物を記述します。
※extentionはあくまでプロトコルの拡張であるため、プロトコルの定義文を書いた上で、拡張文を書かないとコンパイルエラーを起こすので注意！

```
extention プロトコル名 {
//処理内容
}
```
プログラム例

```
//プロトコルの定義
protocol Hello{
}
//プロトコルの拡張
extension Hello {
    func hello() -> String {
        return "Hello World"
    }
}
//構造体の適合
struct JustEnglish: Hello {
    var japanese: String
    var chainese: String
　　//メソッドを設定しない
}

let notHello = JustEnglish ( japanese: "こんにちは　世界", chainese: "你好 世界" )
print(notHello.hello())

//実行結果
Hello World

```
上記のコードの通り、プロトコルを適応した構造体のメソッドを呼び出したが、初期値の処理内容が呼び出されました。このように必要でない場合は新しく処理内容を変更せず、初期の処理内容を使うこともできます。

```
struct JustEnglish: Hello {
    var japanese: String
    var chainese: String
　  func hello() -> String {
        return japanese
    }
}
```

```
//実行結果
こんにちは　世界
```
もちろん上記のように処理内容を変更したら、実行結果も変更されます。
SwiftでA==B==Cのような比較を可能にする

3項以上のオブジェクトが等しいことを調べる演算子を作りました．

```Swift
 A == B &== C &== D //AとB，C，Dが等しいならTrueが返る
```

# 概要
Swiftをはじめ，多くの言語では以下(1)のように二項の比較しかできず．A==B==Cのように同時に3項目以上が等しいことを示すことはできません．そのため，通常は(2)のように書きます．

```Swift
if A == B {} //(1)
if A == B && B == C {} //(2)
```

しかし，この書き方ではBを二回書く必要がある上，論理和を取ることになるので「全てが等しい」というイメージが伝わりにくくなります．

そこで，カスタム演算子を追加し，代わりに以下のような表記(3)(4)を可能にしました．

```Swift
if A == B &== C {} //(3)
if A == B &== C &== D {} //(4)
```

#使用方法
下記のサンプルコードはPlaygroundでの動作を確認しています．ここで定義している```&==```演算子を使用すると3項以上の値が等しいかどうか調べられます．使用するときには1項と2項の間に```==```を使用し，それ以降の比較には```&==```を使用してください．

#ディスカッション

以下のような検討事項があるのでご意見いただけますと幸いです．

- このような書き方に需要はあるのか
- この書き方に何かしらの（文法上等）問題はないか
- 全て同じ演算子を使うようにできないか（現状２種類使い分ける必要がある）

#サンプルコード

```Swift
import Foundation

precedencegroup ConsecutiveComparison {
    higherThan: ComparisonPrecedence //演算子の優先順序
    associativity: right //右結合
}

infix operator &==: ConsecutiveComparison //新しいカスタム演算子の定義

public func ==<T: Equatable>(lhs:T , rhs: Array<T>) -> Bool {
    for r in rhs {
        if r != lhs {return false}
    }
    return true
}

public func &==<T: Equatable>(lhs:T , rhs: Array<T>) -> Array<T> {
    var r = rhs
    r.append(lhs)
    return r
}

public func &==<T: Equatable>(lhs:T , rhs: T) -> Array<T> {
    return [lhs,rhs]
}

//以下動作テスト

let a1 = "a"
let a2 = "a"
let a3 = "a"
let a4 = "a"
let c = "c"

print(a1 == a2 &== c) //false
print(a1 == a2 &== a3) //true
print(a1 == a2 &== a3 &== a4) //true
print(a1 == a2 &== a3 &== c) //false
print(a1 == a2 &== c &== a3) //false
print(a1 == c) //false
print(a1 == a2) //true
```
Firestoreのセキュリティルールでほぼ確実に使うメソッド


Cloud Firestoreのセキュリティルールで、ほぼ１００％っていってもいいくらいよく使うメソッドを紹介します。

## `isAuthenticate` ユーザーの認証があるかどうか

一つ目はこれ

```javascript

function isAuthenticate() {
  return request.auth != null;
}

```

これはリクエストしてきたユーザーがログイン認証済みかどうかをチェックしています。
匿名認証も含まれてるのでご注意ください。

## `isUserAuthenticate` User配下のドキュメントの更新ができるかどうか

二つ目はこれ

```javascript

function isUserAuthenticate(userId) {
  return request.auth.uid == userId;
}
```

Firestoreのデータの保存方法がこんな感じになってるときによく使います。

```
user/{userId}/~~~
```

この場合User Collectionの下は `userId` と認証済みの `uid` が等しいときだけ許可するみたいなときに使用します。


## とりあえずFirestoreのセキュリティルールを書くときはこの二つをコピペしておけ

とりあえずこの2つのメソッドはすぐコピペしましょう。

```javascript
service cloud.firestore {
  match /databases/{database}/documents {
    function isAuthenticate() {
      return request.auth != null;
    }
    function isUserAuthenticate(userId) {
      return request.auth.uid == userId;
    }
　　 // Ruleを書いていく
    match /{document=**} {
      allow read, write;
    }
  }
}
```

以上です。
Homebrew をホームディレクトリ以下にインストール

- Homebrew はデフォルトで `/usr/local` 以下にインストールされる
- ただし、インストールに管理者権限が必要
- インストールに管理者権限必要なのはいやだ
- そこで、ホームディレクトリ直下に `.homebrew` というディレクトリを作成し、そのディレクトリ以下に Homebrew をインストールする方法を紹介

# homebrew のインストール
```bash
mkdir $HOME/.homebrew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C $HOME/.homebrew
```

# パスを通す
```
echo 'export PATH=$HOME/.homebrew/bin:$PATH' >> $HOME/.bash_profile
echo 'export HOMEBREW_CACHE=$HOME/.homebrew/cache' >> $HOME/.bash_profile
source ~/.bash_profile
```

# homebrew のパスを確認
```bash
brew --prefix
```

# homebrew のバージョンを確認
```bash
brew --version
```
変数の生存期間を出来るだけ短くしてほしい (C#)

今日のコードレビューでこんなコードを見たので、指摘して修正してもらいました。

###### 例１（戻り値の変数を最初に宣言）

````C#
public Result GetValue(){
    var r = new Result();

    r.A = 10; // 実際は何かの計算 ...
    r.B = "XXX"; // 実際は何かのデータを取得 ...

    return r;
}
````

戻り値の Result クラスのインスタンスを、メソッドの先頭で初期化しています。その後で、各プロパティ（AやB）を設定して、最後に return で戻り値を返しています。よくある構造で、特に問題があるように思いません。

しかしこのコードは、実際のエンタープライズ開発の現場では、どんどん次のようになってしまうことがあります。

###### 例2（機能が追加された後の、良くないコード）
````C#
public Result GetValue(int c){
    var r = new Result();
    var a = 0;
    var b = "";

    if( c < 0 ){ return r; }
    a = Other.GetValue(c) * 10; // 引数を使った何かの計算 ...
    r.A = a;

    if( c > 100 ){
        r = new Result();
    }else{
        b = Other.GetData(c); // 引数を使ってデータを取得 ...
        r.B = b;

        r.C = c;

        if( c < 10 ){ 
            r = new Result();
        }else{
            r.D = "YYYY"; // 追加されたプロパティの何か計算やデータ取得 ...
        }
    }
    return r;
}
````
機能が追加されるうちに、条件分岐とプロパティが追加されています。実際のコードは、こんな構造が数十行から数百行になることがあります。機能に応じた他のクラスのメソッド（Ohter.GetValueやOther.GetData）が作成されるのではなく、このメソッドの中にそのまま計算やデータの取得処理が実装される場合が多いからです。例えば、画面とそこで使われる機能にフォーカスした詳細設計書では、クラス設計が十分でなく、その中の計算やデータの取得が明言されていない場合があるからです。

そして変数 r を一番上に宣言していたのに習って、他の変数も全てメソッドの一番上に宣言されているようです。その何が一番悪夢かというと、変数 r を最後に return するという構造をそのままにするために、途中で r に new Result() を再設定している部分があるということです。このメソッドは、どうやら引数が条件に合わないときは、Resultクラスの初期値を返すようです。それが良いかどうかという設計は別にしても、rは何度も初期化されるという点は、実行速度やメモリの点で無駄になります。

この例をパッと見ただけでは秒単位での違いが起きるようには見えませんが、例えば Result クラスのコンストラクタで数秒かかるデータの読み取りなどをしていると、目に見えて実行速度が遅くなります。エンタープライズ開発で良く起きる「遅い」や「メモリが足りなくなる」はこういうプログラムが数百、数千とコピペされて量産されるために起きていることがほとんどです。しかし、一度このような条件分岐がネストされた複雑なプログラムコードができてしまうと、リファクタリングはかなり大変になります。単体テストコードがないとやりたくないのですが、エンタープライズ開発では単体テストが作られていないことも多く・・・　

しかしこれは直さないと、いつか途中までプロパティを詰めた r をそのまま途中で return してしまってバグになるやつですね。他に途中でaやbの変数を変えてしまってバグになるかもしれません。パフォーマンスとは別の観点でも、できればリファクタリングしてしまいたいです。

###### 例3（シンプルな実装 or リファクタリング後）
````C#
public Result GetValue(int c){
    if( c < 10 ){ throw new new ArgumentOutOfRangeException("C"); }
    if( c > 100 ){ throw new new ArgumentOutOfRangeException("C"); }

    return new Result{
        A = Other.GetValue(c) * 10, // 引数を使った何かの計算 ...
        B = Other.GetData(c), // 引数を使ってデータを取得 ...
        C = c,
        D =  "YYYY" // 追加されたプロパティの何か計算やデータ取得 ...
    };
}
````

本当はリファクタリングではな機能を全く変えるべきではないのですが、引数のチェックは最初に行いArgumentOutOfRangeException を投げるようにすべきでしょう。もし引数がnullになる可能性がある型ならチェックは必須です。これは静的コード分析を有効にしていると必ず最初に警告がでる内容（使って大丈夫か？確認していない引数を使用しない）です。

また、実は条件が c < 0 と c < 10 でかぶっていたので、c < 0 を削除しています。実際のコードでも、かなり複雑な条件の時に、重複した無駄なチェックを繰り返していることが多々あります。このようなシンプルな構造にするとこのような無駄に気づくことができます。

引数チェックの後で最後に、変数を取ることなく、戻り値のクラスのインスタンスを初期化しながら、全てのプロパティを一度に詰めてしまいます。もしここまでシンプルにできない場合には、return の前の行で値を計算・取得しておいて、最後に戻り値に詰めるようにします。

###### 例4（戻り値の変数を宣言しない）

````C#
public Result GetValue(){
    return new Result{
        A = 10, // 実際は何かの計算 ...
        B = "XXX" // 実際は何かのデータを取得 ...
    };
}
````
これは最初の例1の、変数を宣言しない書き方の例です。最初の段階でこのように実装してもらえれば、途中で変数の値が書き換わるなどでバグになる心配がありません。これに機能を追加していくのであれば、さっきのような複雑な構造にはなりにくいのではないでしょうか（もちろんそのように心がけておく必要がありますが、前の人のコードを踏襲するという意味で）。


そして変数を追加するときにも、ブロックの中から外へ、出来るだけ近くに宣言して、必要に応じて遠くしていくように、スコープを広げるように。変数の生存期間を出来るだけ短くしてほしいのです。
Spearman 相関係数を計算するときの注意点

## TL;DR

Spearman 相関係数を計算するときには、順位タイの変数値に気をつけましょう。


## Spearman 相関係数とは

確率変数 $X, Y$ の相関を測る際に使われる指標として Pearson 相関係数と Spearman 相関係数が有名です。
Pearson 相関係数は $X, Y$ が間隔尺度の場合に使われるのに対して、 Spearman 相関係数は順位尺度に使われます。

- 順序尺度 : 値の大小関係や順位には意味があるが、値の間隔には意味がない変数（例：五段階の商品レビュー、地震の震度）
- 間隔尺度 : 値の間隔に意味がある変数（例：温度、テストの点数）

実数値変数 $X, Y$ の Spearman 相関係数は、 $X, Y$ の順位変数に対する Pearson 相関係数として定義されます：

```
x = [5.0, 1.9, 3.4, 1.1, 0.3]
y = [4.8, 1.4, 4.0, 1.5, 0.9]

rank_x = [0, 2, 1, 3, 4]
rank_y = [0, 3, 1, 2, 4]

spearman(x, y) = pearson(rank_x, rank_y)
```

この定義から明らかにわかるように、順位関係を保つような変換を $X, Y$ に適用しても Spearman 相関係数の値は変化しません。


## 落とし穴 : 変数の値に順位タイが存在する場合

下記のように変数の中に同一の値が複数含まれている場合、順位変数の振り方としていくつか異なる方法が考えられ、その選択次第で Spearman 相関係数の値が全く変わってしまいます。

```
x = [5.0, 5.0, 5.0, 0.4, 2.2]
y = [4.8, 1.4, 4.0, 1.5, 0.9]
```

一見重箱の隅を突くような話に思われるかもしれませんが、これは実際のデータセットでもよく起こり得ることです。
特に $n$ 段階のスコアを人手でつけたデータセットの場合、サンプル数に対して値のバリエーションが少ないため、非常に高頻度で順位タイが発生します。


### ナイーブな方法

例えば、同一の値に対して出現順に順位を振ると、次の例のように変数の並び替えに対して Spearman 相関係数が不変ではなくなってしまうため良くありません。

```plaintext:並び替え前
x = [5.0, 5.0, 5.0, 0.4, 2.2]
y = [4.8, 1.4, 4.0, 1.5, 0.9]

rank_x = [0, 1, 2, 4, 3]
rank_y = [0, 3, 1, 2, 4]

spearman(x, y) = 0.5
```

```plaintext:並び替え後
x = [5.0, 5.0, 5.0, 0.4, 2.2]
y = [1.4, 4.0, 4.8, 1.5, 0.9]

rank_x = [0, 1, 2, 4, 3]
rank_y = [3, 1, 0, 2, 4]

spearman(x, y) = 0.1
```

### スタンダードな方法

`scipy.stats.spearmanr` の実装[^scipy]や英 Wikipedia 記事[^wiki]でスタンダードとされている方法では、同一の値全てに対して平均化された順位変数を割り当てます。

次の例で言うと、`x` の値 `5.0` は順位 `0, 1, 2, 3` を占めているため、平均化された順位は `(0 + 1 + 2 + 3) / 4 = 1.5` になります。

```
x = [5.0, 5.0, 5.0, 5.0, 0.4, 2.2]
y = [1.4, 4.0, 4.8, 3.9, 1.5, 0.9]

rank_x = [1.5, 1.5, 1.5, 1.5, 5, 4]
rank_y = [4, 1, 0, 2, 3, 5]
```

[^scipy]: [spearman 関数](https://github.com/scipy/scipy/blob/v1.3.0/scipy/stats/stats.py#L3613-L3764)の中で順位変数を計算するために [rankdata 関数](https://github.com/scipy/scipy/blob/v1.3.0/scipy/stats/stats.py#L6594-L6682)が使われている。 rankdata 関数で順位タイを処理するメソッドのデフォルトは `average`
[^wiki]: [Spearman's rank correlation coefficient - Wikipedia](https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient#Definition_and_calculation)


## Spearman 相関係数の不適切な実装例 (TensorFlow r1.14)

TensorFlow の `Estimator` に metric を設定する場合には streaming タイプの値しか受け付けてくれません。
Pearson 相関係数であれば `streaming_pearson_correlation` が用意されていますが Spearman 相関係数に関しては自前で実装する必要があります。

次のコードはネット上で実際に見かけたものですが、順位タイの場合の処理が適切にできていません。
上述したように同一の値に対して別々の順位変数が割り当てられてしまうためです。

```python
import tensorflow as tf

size = tf.size(x)
_, indice_of_ranks_x = tf.nn.top_k(x, k=size)
_, indice_of_ranks_y = tf.nn.top_k(y, k=size)
_, rank_x_int = tf.nn.top_k(-indice_of_ranks_x, k=size)
_, rank_y_int = tf.nn.top_k(-indice_of_ranks_y, k=size)
rank_x = tf.to_float(rank_x_int)
rank_y = tf.to_float(rank_y_int)
spearman = tf.contrib.metrics.streaming_pearson_correlation(rank_x, rank_y)
```
新米エンジニアが綺麗なソースコードを書くための簡単な約束。


筆者は入社２ヶ月目の新米エンジニアです。
ソースコードが初心者の割には綺麗らしいので調子に載って、気をつけている点を羅列します( ´∀｀)

### てか綺麗って何？
・シンプルで冗長ではない。
・一目で何をしたいのかがわかる。
・一つの関数に一つの動作。

### そもそもなんでソースコードは綺麗な方が良いの？
・他者（未来の自分を含め）が理解しやすくすることでデバックしやすくするため。
・エラーの発見が早く、そもそも想定外のエラーが起きにくくなる。

## Code規約まではいかないが、出来るだけ意識して欲しいこと。

### ファイルの中身はシンプルに分かりやすく
・ファイルは200行まで（個人の好みも入りそう。）
・１ファイル１機能を目安に

### ファイル名と関数名の付け方。
・ファイル名は名詞
  `time-checker`
  `timeChecker`

・関数名は動詞
  `checkTime`

### ネストは浅く。
#### if文の中にif文の作成は避ける。
BAD:

```qiita.js
if (a) {
  a.*******
  if(b) {
     b.*******
  }
}
```

OK:
 👉ロジックの順番を変えたり、分離させて真偽値のみリターンさせる関数を作る。

#### 実例
有料プラン契約用の関数の実装。
未契約あるいは無料プラン登録済みの場合は実行。
すでに有料プランに契約済みの場合はエラー

```quita.js
const addPayngUser = async (name) => {
  const isNew = await checkNewMember(name);
  const isPaying = await checker.checkIsPaying(name);
  if (!isNew) {
    if (!isPaying) {
      await query.settlePaying(name);
    }
    console.log( 'already Registered.');
  }
  await query.register(name)
  await query.settlePaying(name);
};
```
if文の中にif文が入ってしまって条件と結果がわかりづらい。

ロジック:
未登録者である(true)→有料プランの契約をする。
登録者(false)かつ無料プランのみ(false)→有料プランの契約する。
登録者(true)かつ有料プランの契約済み(true)→契約済みのエラーを出す。

👉初めから有料プランに契約しているかどうかから判定する。

そもそも、条件に！を利用して否定をするのもあまりよろしくない。

```quita.js
const addPayingUser = async (name) => {
  const isPaying = await checker.checkIsPaying(name);
  if (isPaying) {
    console.log('already Registered.');
  }
  await query.register(name)
  await query.settlePaying(name);
};
```



#### 関数の中で関数の定義も避ける。
年齢制限かける関数を作りたい場合。

BAD:

```quita.js
const checkAge = () => {
  const getAge = () => {
   ******
  };
  getAge();

};
```

OK: 👉

```quita.js
const getAge =() => {};
const checkAge = () => {
  getAge();
  *****
};
```


### 関数や、レイヤー内での役割をきちんと分ける。
DB,サーバー,APPは階層を分ける。
DB操作の関数に、API操作関連の関数を含めない。
(DB操作内でのトラブルが起きた時に、DBの範囲のみで解決するようにするため。)

### IF文の条件の中にはtrue or false　を返すようにする。
返り値が null　の関数をそのまま利用しない。

### magic numberは避ける。
 > magic numberとは、具体的数値のみ記載して、その意味や意図が記述した本人以外には自明ではないもの。

BAD:

```quita.js
if (a < 10) {
   *******
}
```

OK: 👉

```quita.js

const LIMITMONEY = 10;
if (a < LIMITMONEY) {
   *******
}
```

### 変わらない定義などはall大文字で定義
参考元のLISTやテーブルなど。
`const TABLE = user;`

### まとめ

もう少しこうした方が良いよなどのアドバイスがあれば気軽にコメントくださいませ。
ご覧頂きありがとうございます。

## 参考
上司からのアドバイス
『リーダブルコード』
[高凝集で低結合のプログラミング](
https://jp.lindelin.org/blog/2017/high-cohesion-low-oupling/)
Railsチュートリアル（第4章）

# はじめに
Railsチュートリアルの第4章が終わりました。
ポイントだけメモしておきます。

この章の内容はRubyについてがメインで、ほとんど一度勉強した内容でした。
一部は以前書いた記事に書いています。
[Rubyの勉強まとめ](https://qiita.com/minuro/items/a1687613e7cd837c1505)
[Rubyの勉強まとめ2(メソッドとクラス)](https://qiita.com/minuro/items/075a7b24b24b4e19e6f2)

# ヘルパーメソッド
`app/helpers/application_helper.rb`にメソッドを記述することで、アプリケーション全体で使用できるヘルパーメソッドを作ることができます。

# ブロック
以下のコードの`do 〜 end`の部分がブロックです。`{}`でくくることでも定義できます。
以下のコードは、1から3を順に`i`に格納し、ブロック内の処理を実行しています。

```rb
(1..3).each do |i|
  puts i
end  
#実行結果
1
2
3
```

# メソッドの括弧の省略
`app/views/layouts/application.html.erb`に記述されているような以下のコードはメソッドの括弧が省略されています。
ポイントは以下の3つです。
・Rubyではメソッドの`()`を省略できる
・最後の引数がハッシュの場合は`{}`を省略できる
・改行と空白を区別しない

```rb:app/views/layouts/application.html.erb
stylesheet_link_tag 'application', media: 'all',
                                  'data-turbolinks-track': 'reload'
```

おそらく、ちゃんと書くと以下のような感じです。

```rb
stylesheet_link_tag('application', {media: 'all', 'data-turbolinks-track': 'reload'})
```
WindowsバッチとWSL(Windows Subsystem for Linux)でMACアドレスの一覧を取得する

#概要
WindowsバッチとWSL(Windows Subsystem for Linux)でMACアドレスの一覧を取得します。

#方法
Windowsのgetmacコマンドの結果をWSLのgrepとawkコマンドで整形します。

#実装
下記のように実装しました。
まず、getmacコマンドをヘッダ行なし(/nh)で実行し、
MACアドレスが含まれる行(-がある行)をgrepで取得し、
最後にawkコマンドで1列目のみを抽出しています。

```
getmac /nh | wsl grep - | wsl awk '{print $1}'
```

#実行結果
以下のようにMACアドレスの一覧のみが取得できています。

```
>getmac /nh | wsl grep - | wsl awk '{print $1}'
E8-D0-FC-CD-5D-25
E8-D0-FC-CD-5D-26
A6-15-1F-8A-55-F5
00-15-5D-0A-10-00
00-15-5D-E6-EF-28
```
micro:bitで戦車を操縦する

## はじめに
大学で開催されるワークショップでmicro:bitを使う事になり，その資料をQiitaでも共有しようと思います(自分が関わる範囲しか共有しないのでコンプラ的には大丈夫なはず！)

今回は，micro:bitを使った戦車(キャタピラ車)の操縦を**初級，中級，上級**まで段階を踏んでやっていこうと思います．(＊micro:bitは2台使用します)

各級ごとに記事にまとめたので，好きなレベルから初めて下さい．
**＊前提として，戦車の車体を作る必要があるます＊**

完成するとこんな感じです！
![IMG_2996.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/2b27fa36-61ad-1ff9-99b9-fb84b87ad49f.jpeg)

1台のmicro:bitで操作を認識し，もう一台のmicro:bitでモーターの制御を行います．
## 開発ステップ


- 前準備
    - 使用パーツ
    - [回路図](https://qiita.com/kikpond15/items/f4d37de5061c0b8a9e21)

- [初級編](https://qiita.com/kikpond15/items/b938f3165208aa3444b0)
- [中級編](https://qiita.com/kikpond15/items/d2e27f4ff9c57cc3f8b7)
- [上級編](https://qiita.com/kikpond15/items/9a65b3a4e51faeb40e2f)

## 使用パーツ

- [micro:Bit](https://www.switch-science.com/catalog/5263/) × 2
- [micro:Bitピンヘッダ変換基盤](https://www.switch-science.com/catalog/3181/)
- [モータードライバーTA7291P](https://www.switch-science.com/catalog/1691/) × 2
- [ツインモーターギアボックス(モーター付き)](http://akizukidenshi.com/catalog/g/gK-09099/)
- [キャタピラー](http://akizukidenshi.com/catalog/g/gK-12693/)
- [モーター電源用単三電池ボックス(単三×4本)](http://akizukidenshi.com/catalog/g/gP-00311/)
- [micro:Bit用電源電池ボックス(単四2本)](https://www.switch-science.com/catalog/3496/)

プラスで揃えるもの

- [ブレットボード](http://akizukidenshi.com/catalog/g/gP-00315/)
- [ジャンパーワイヤー](http://akizukidenshi.com/catalog/g/gC-05371/)
【初級編】micro:bitで戦車を操縦する

## はじめに
この記事はmicro:bitで戦車を操縦するための開発手順を初級・中級・上級に分けて紹介しています．使用機材や開発ステップは[まとめ]()で紹介しています．

＊まとめの記事を読んではじめられた方は，戦車の車体を制作してから，この記事を読むと良いでしょう！

## 初級編
まずは，micro:bitでモーターの制御をしてみましょう．
モーターは電気を流すと回転し，流すのをやめると止まります．電気を流す方向を逆にすることで，回転方向を逆にすることが出来ます．
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/21a44721-c875-fbe4-d546-6b35457fc46d.png" width="200">

モータードライバーでは，この電気の流れを制御し，正転，反転，停止を可能にします．

まずはこのようなプログラムを作ってみましょう
![スクリーンショット 2019-08-01 21.41.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/12fb778e-e5b1-9486-f2d8-6f5c1cc1e9bb.png)

micro:bitのAボタンを押すと前進し，Bボタンを押すと後退するはずです．(動かない場合は配線やモータ用の電源が入っているか確認しましょう！)

デジタル出力とは，micro:bitのエッジコネクターから電気を流すことをさし，値1で電気を流し，値0で電気を止めます．

Aボタンを押した時には，端子P8から電気が流れ，モータードライバーによって，モーターを伝い端子P1に電気が流れます．上の図のように電気の流れができることによりモーターは回転します．
端子に流す値を全て0にすることで，停止します．



## チャレンジ
前進・後退が出来ましたら，次は**左右の旋回**をやってみましょう！
端子P1とP8で1つのモーターを制御し，端子P2とP12でもう1つのモーターを制御しています．

上のプログラムでは，P1＝0，P8＝1，P2＝0，P12＝1で前進しましたね．では，右旋回，左旋回の時にはどのようなプログラムにするとよいでしょうか？

また，これが出来たら，「最初だけ」のブロックの中で使っている「アナログで出力する」の数値を変更してみましょう．この数値を変更することで，モーターの回転スピードを変化させることが出来ます．

## 参考・関連
[序章](https://qiita.com/kikpond15/items/d6ca1e1372ba787ab08b)
[回路図](https://qiita.com/kikpond15/items/f4d37de5061c0b8a9e21)
[中級編はこちら](https://qiita.com/kikpond15/items/d2e27f4ff9c57cc3f8b7)
[上級編はこちら](https://qiita.com/kikpond15/items/9a65b3a4e51faeb40e2f)
Leetcode #243: Shortest Word Distance

```swift
func shortestDistance(_ words: [String], _ word1: String, _ word2: String) -> Int {
    var index1 = -1
    var index2 = -1
    var distance = words.count
    for (i, word) in words.enumerated() {
        if word == word1 {
            index1 = i
        } else if word == word2 {
            index2 = i
        }
        if index1 != -1 && index2 != -1 {
            distance = min(distance, abs(index1-index2))
        }
    }
    return distance
}
```
（翻訳）LoopBack4で過去のLoopBackを動かす方法

# はじめに

過去のLoopBack(2.x)をLoopBack4にアップデートしたい！
という依頼があり、
色々探したところ以下の [英語ドキュメント](https://github.com/strongloop/loopback-next/blob/master/examples/lb3-application/README.md) を参考にしたら過去のLoopBackを(ほとんど)変更せずに
Loopback4で動かす事ができたので、翻訳しときます。

注意点:
この記事は [公式のドキュメント](https://github.com/strongloop/loopback-next/blob/master/examples/lb3-application/README.md) と内容はほとんど一緒です。
またCLBの英語力は高校受験の時に取得した英検3級が関の山なレベルなので、
何か問題点があれば、遠慮なくコメントをいただければと思います。

# @loopback/example-lb3-application

この例では、既に作成済みのLoopback3アプリケーションを新規LoopBack4プロジェクトにマウントする方法について説明します。

## チュートリアル

1\. `lb4 app`コマンドを利用し、新規にLoopBack4プロジェクトを作成します。

   ```
   $ lb4 app
   ```

   あなたのプロジェクトに合わせてプロジェクト名などの項目を入力します。また機能(features)は全て有効にします。

2\. `lb3app`フォルダをLoopBack4アプリケーションのルートディレクトリに作成し、
   そこにLoopBack3アプリケーションをコピーし配置します。
   完了するとフォルダの配置は以下のような形になるはずです。

   ```
   lb3app/
     # LoopBack 3 アプリケーション(JavaScript)
     common/
       models/
         # LB3 model ファイル
     server/
       boot/
         # LB3 ブートスクリプト
   public/
     # htmlなどの静的ファイル資産 (LB4固有)
   src/
     # LoopBack 4 アプリケーション(TypeScript)
   ```

3\. LB3の依存パッケージの記述をLB4の`package.json`へ移植します。
   また、以下のファイルが存在する場合、削除します。
   - `lb3app/package.json`
   - `lb3app/node_modules/`
   - `lb3app/package-lock.json`  
   基本的に移植する内容は以下の記述に加え、  
   LB3で利用していたDBへのコネクターやコンポーネント全てです。

   ```json
   {
     "compression": "^1.7.4",
     "cors": "^2.8.5",
     "helmet": "^3.16.0",
     "loopback": "^3.25.1",
     "loopback-boot": "^3.3.0"
   }
   ```

   ノート: Loopback3のバージョンは`loopback-boot@3.2.1`以上を利用してください。
   （訳者追記）私の環境では2.x.x系でも出来ました。

   LB4のルートディレクトリで`npm install`コマンドを実行し、LB3の依存パッケージをインストールします。

4\. LB4のエラーハンドリングを利用するため、LB3のエラーハンドリングを無効化します。

   - `lb3app/server/middleware.development.json`を削除します。
   - `lb3app/server/middleware.json`を編集し、以下の2つの項目を削除します。
     - `final` >> `loopback#urlNotFound`
     - `final:after` >> `strong-error-handler`
   - `strong-error-handler` を `package.json` 依存関係から削除します。
   - `lb3app/server/config.json`を確認し、
     `remoting`の中に`"handleErrors": false`があった場合、`rest`へ移動します。

5\. LB3の静的ファイル資産の設定を変更します。
   `lb3app/client`内にある静的ファイル資産を`public/`へ移動し、
   `lb3app/server/middleware.json`の以下の項目を削除します。

   - `files` >> `loopback#static`

   また`lb3app/server/boot/root.js`を削除して下さい。
   これにより、メインページはLoopBack4の物を利用する事になります。

6\. `lb3app/server/component-config.json`を削除し、LoopBack3のAPIエクスプローラを無効にします。
   LoopBack4のAPIエクスプローラが代わりに利用されます。

7\. LB3アプリケーションをマウントして起動するための `@loopback/booter-lb3app` コンポーネントを
    インストールし設定します。

   7-1\. `npm install --save @loopback/booter-lb3app`コマンドをLB4のルートディレクトリで実行します。

   7-2\. `src/application.ts`に以下の内容を追記し、コンポーネントをインポートします。

      
      import {Lb3AppBooterComponent} from '@loopback/booter-lb3app';
      

   7-3\. 続けてコンストラクタ部分に以下の内容を追記します。

      
      this.component(Lb3AppBooterComponent);
      

## 実際に動かしてみる。

以下のコマンドをLB4のルートディレクトリで実行します。

```
    $ npm start
    Server is running at http://127.0.0.1:3000
```

コンソールに出力されたURLをブラウザで開き、`public`内の静的ファイルにアクセスできる事を確認してください。
また、`http://127.0.0.1:3000/explorer`を開くことで、REST APIの一覧を確認する事も出来ます。

## テスト

`npm test`コマンドをLB4のルートディレクトリで実行します。

## 終わりに（訳者追記）
LoopBack2.x系で動作させる際は、上記手順で該当する部分のみやっていけば
基本的に大丈夫です。（公式では保証してませんが・・・）
tscコマンドを使わずに.tsファイルを実行する

# 結論
これまでtscコマンドでコンパイルしてから実行していた

```
$ tsc
$ node ./dist/example.js
```

以下のように、１回のコマンドで実行出来る

```
$ npx ts-node ./src/example.ts
```

# 必要な準備
## 前提
npm5.2.0以上が必要

```
$ npm --version
5.6.0
```

## ts-nodeをインストール

```
$ npm install typescript
$ npm install ts-node
```

## １コマンドで実行出来るようになる

```
$ npx ts-node ./src/example.ts
```

## 参考記事
https://qiita.com/tonkotsuboy_com/items/8227f5993769c3df533d
https://employment.en-japan.com/engineerhub/entry/2019/04/16/103000
プルリクエストでマージしたブランチを自動的に削除する

## 詳細
GitHubの新たな機能で、プルリクエストの際にマージしたブランチを、自動的に削除する設定ができるようになりました。

## ブランチの自動削除をGitHubで設定する
1. GitHubで、リポジトリのメインページに移動します。

2. リポジトリ名の下にある[ **Settings** ]をクリックします。 
![repo-actions-settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/d857da7b-b355-fc6f-f39b-1ffc128f6053.png)
3. リポジトリ設定から[Merge button]で、[ **Automatically delete head branches** ]を選択または選択解除します。
![automatically-delete-branches.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/e84ca460-62b9-f478-2ec6-edb0af869695.png)

## 対象者
リポジトリに対する管理者権限を持つ人なら、誰でもブランチの自動削除を有効または無効にすることができます。

## 参考記事
**Automatically delete head branches of pull requests**
https://github.blog/changelog/2019-07-31-automatically-delete-head-branches-of-pull-requests/
【Swift】CoreDataで一定件数を超えたら古いものから順に削除したい

デバッグ用のイベントログなどをCoreDataで管理する際に、一定件数を超えたら古いものから順に削除していきたい場合の処理です。

# 環境

- Swift：5.0.1
- Xcode：10.3 (10G8)

※注意
Swift 5.1、Xcode 11.0で正常に動作しなくなりました。
`fetchRequest.fetchLimit`で個数の制限ができなくなったようです。

# コード

`NSManagedObjectContext`にExtensionとして追加します。

```swift:NSManagedObjectContext+Extension.swift
import CoreData

extension NSManagedObjectContext {

	func delete(overLimit limit: Int, entityName: String, sortDescriptors: [NSSortDescriptor]?) throws {
		let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)

		// ソート条件を指定
		fetchRequest.sortDescriptors = sortDescriptors

		// データ件数を取得
		let n = try self.count(for: fetchRequest)

		// 指定された上限を超えていれば削除を実行
		if n > limit {
			fetchRequest.fetchLimit = n - limit
			try self.execute(NSBatchDeleteRequest(fetchRequest: fetchRequest))
		}
	}
}
```

# 使用例

`TestEntity`として定義されたEntityを対象として、上限として指定した100件を超えたデータを日付の古いものから削除します。`TestEntity`はDate型のAttributeである日付データ`date`を持っています。`context`はNSManagedObjectContextです。

```swift
do {
	try context.delete(
		overLimit: 100,
		entityName: "TestEntity",
		sortDescriptors: [NSSortDescriptor(key: "date", ascending: true)])

	try context.save()
} catch {
	...
}
```
Donkey Carの自動走行モード切替

# Donkey Carの自動走行モード切替

Maker Faire Tokyo 2019でのWifiが使えないことを想定して、自動走行にモードを移行する手順についてメモをします。F710のtoggle_mode切り替えを２回押すとuserからlocalへモードが変わる手順をジョイスティックコマンドをDonkey Car内部で発生させることにより実現しています。



## インストール

- evdevをインストール

  ```shell
  pip install evdev
  ```

    

## pythonソース

- 以下のpythonソースをDonkey Carのmycarフォルダに作成

  ```python
  from evdev import InputDevice, ecodes as e
  import time
  
  dev = InputDevice('/dev/input/event0')
  print(dev)
  # change mode from user to local
  print('push toggle_mode button twice')
  toggle_btn = e.BTN_START
  
  dev.write(e.EV_KEY, toggle_btn, 1)
  dev.write(e.EV_KEY, toggle_btn, 0)
  time.sleep(0.5)
  
  dev.write(e.EV_KEY, toggle_btn, 1)
  dev.write(e.EV_KEY, toggle_btn, 0)
  ```

    

## 使い方

学習済データを使って自動運転をするためのコマンドを入力。

```shell
python manage.py drive --js --model models/mypilot.h5 &
```

 別な画面から以下のコマンドを入力した時点で、自動走行モード(local)に変わる。

```shell
python change_mode.py 
```

 

## 今後

実際にコースを走らせて、一連の動きをしたわけではないため、会場にて検証予定。
【勉強会メモ】Search Engineering Tech Talk 2019 Summer

# はじめに
先日 [検索技術勉強会](https://search-tech.connpass.com/) に参加しました。
その際個人的に印象に残った点をまとめます。

# イベント概要
[Search Engineering Tech Talk 2019 Summer](https://search-tech.connpass.com/event/138318/)

> 検索技術勉強会の目的は、「検索」/「検索システム」にまつわる技術や手法に関して共有できる場を提供することです。
検索エンジンごとの勉強会などもありますが、検索エンジンには関係なく、「検索」というシステム、サービスを作る上で共通の解決すべき課題があります。
これらの課題をみんながどのように解決しているのかといった知識を共有できる場になればと思っています。

# 発表
## [「うどん」の検索結果には何を出すべきか](https://speakerdeck.com/r4keisuke/udon-falsejian-suo-jie-guo-nihahe-wochu-subekika) /  [李晟圭さん](https://twitter.com/R3kei)
- Suggest
  - Suggestの目的はユーザが求めているものとRettyが持っている情報のマッピング（ID化）
  - エリアにも店名にもなりうる問題
     - 例．恵比寿　ざぶとん　うどん
     - UIで対応（エリアと店名それぞれの入力枠を設ける）
  - 入力内容や時間帯によってはレコメンド要素の強いサジェストが可能
     - 例．エリア入力
         - 恵比寿 -> 恵比寿 焼肉 焼鳥
     - 例．時間帯が「お昼」の場合
         - 恵比寿 -> 恵比寿 カフェ ランチ
- Search
  - 店名にもジャンルにもなりうるものをどう検索結果として表示するか
     - 例．うどん（五反田のカレーの名店）
     - 店名もジャンルもどちらも出す
     - どちらも一致した場合は店名を優先
  - 駅で探す場合の表示順は距離によるスコアリング
     - 駅によって距離をチューニング
     - 単純に駅近だとチェーン店だらけの可能性となる
     - チェーン店ではない新しい店の発見を促したい
     - 都心と地方の駅では店の密集度や範囲が変わってくる

## [Elasticsearch における類似度ベクトル検索のベストプラクティスを求めて](https://speakerdeck.com/takahiko03/es-vector-search) / [伊藤敬彦さん](https://twitter.com/takahi_i)
- Elasticsearchのベクトル関連検索パッケージはないか？
  - [fast-elasticsearch-vector-scoring](https://github.com/lior-k/fast-elasticsearch-vector-scoring)があるが検索に時間がかかる
- [Faiss](https://github.com/facebookresearch/faiss)が速度も精度もよいとのこと
  - でもElasticsearchで実現させたい
- [この記事](https://www.linkedin.com/pulse/searching-deep-learning-eike-dehling)によると、Luceneが提供するkd木を使用したプラグインがあるみたい
  - このプラグインとさっきの[Elasticsearchのベクトル関連検索パッケージ](https://github.com/lior-k/fast-elasticsearch-vector-scoring)を利用すれば高速検索が実現できそう
     - 最初にkd木でざっくり検索しておいて、コサイン類似度を検索してランキングし直す
     - word2vecで10万単語のベクトル(8次元、200次元)をElasticsearchへ投入して確認してみる
     - 結果として速度も精度も思いのほか良い
     - Luceneを再ビルドすれば絞込みベクトルの大きさ（デフォルト8）を変更できるっぽい

## [検索の運用って 難しいよねって話](https://www.slideshare.net/setsuna82001/search-engineering-tech-talk-2019-summer?ref=https://search-tech.connpass.com/event/138318/presentation/) / [凡人ぷろぐらまさん](https://twitter.com/setsuna82001)
- 属人化した状況では障害時の対応が大変
- マニュアル作成や知見の共有を行い個人依存しないようにする
- 環境の構築から経験してもらい環境の苦手意識を減らす
  - Dockerを使うことでラクに構築できるようになった

# おわりに
- 同じ検索ワードでも検索対象（エリア、ジャンル、目的、店舗）によって、それぞれ工夫ポイントがある
- kd木、類似度ベクトル等これまで関わりのなかった分野だが非常に興味深い
- 知見は共有してなるべく特定の人に依存しないですむ「仕組み化」が重要
Leetcode #766: Toeplitz Matrix

Solution 1: Match with top-left element

```swift
func isToeplitzMatrix(_ matrix: [[Int]]) -> Bool {
    for i in stride(from: 0, to: matrix.count, by: 1) {
        for j in stride(from: 0, to: matrix[0].count, by: 1) {
            if i > 0 && j > 0 && matrix[i-1][j-1] != matrix[i][j] {
                return false
            }
        }
    }
    return true
}
```

Solution 2: Hashtable

Two coordinates are on the same diagonal if and only if `r1-c1 == r2-c2`

```swift
func isToeplitzMatrix(_ matrix: [[Int]]) -> Bool {
    var dict = [Int: Int]()
    for i in stride(from: 0, to: matrix.count, by: 1) {
        for j in stride(from: 0, to: matrix[0].count, by: 1) {
            if let value = dict[i-j] {
                if matrix[i][j] != value {
                    return false
                }
            } else {
                dict[i-j] = matrix[i][j]
            }
        }
    }
    return true
}
```
Pythonでライブラリの処理を上書きする

## 対象の読者
* Python利用者
* ソフトウェア開発者
* ライブラリのバグでシステムがまともに動かせないことが判明し絶望している方

## 前提条件
* Python 3.6.3

## 概要
* 組み込み/サードパーティのライブラリの挙動などを、プログラムから実行時に動的に書き換えてしまう手法を、Monkey Patchと言います。
* Pythonでも、importしたモジュールのメンバにオブジェクトを代入することで、実現できます。

## 実現方法
* **importと同じインデント階層で**、importしたモジュールのメンバに新しいメンバを代入する。
* 例えば、targetmoduleというモジュールに、target_methodというメソッドがあり、その挙動を自作のmy_methodで置き換えたいとします。
  * その場合、以下のように、記述することで、置き換えることができます。
  
```python3
import targetmodule

def my_method(x):
    return x  # do something

targetmodule.target_method = my_method
```

* これで、targetmodule.target_method は my_methodを指すようになります。

## メリット / デメリット
#### メリット
  * OSSや他社製品など、修正に合意形成が必要で、すぐには修正を反映できない場合に、その場しのぎができます。

#### デメリット
  * 上書き対象のモジュールがバージョンアップされると動かなくなったり、望まない挙動が生じるリスクがあります。
  * 依存関係を定義したファイル(requirements.txtなど)を見てもMonkey Patchに気づかないため上書きしていること自体を忘れるリスクがあります。

## まとめ
* 黒魔術感はありますが、緊急時には間違いなく有用です。
* 他の言語でも Monkey patch というキーワードで検索すればやり方が出てくるので、困ったら試してみてください。
* ただし、正式に直してMonkey patchを外す、という課題チケットを必ず切って後任者に残しましょう。
【Rails 6.0.0.rc2】rails s したら RAILS_ENV=development environment is not defined in config/webpacker.yml, falling back to production environment Exiting で怒られた。

#はじめに

〜本日(8/1)の朝〜

<br>

上司　「今日から開発をはじめるサービスはRails6を使うぞ！」

わたし　（きたーーーーーーーーー！！ついにRails6だーーーーーーー！！）

わたし　「合点承知、すぐ取りかかるっす！！」

上司　「うむ、では開発よろしく。」

<br>

〜その後〜

<br>

わたし　（Rails6の最新版はどれなのだろうか...検索、検索、ポチっとな...）

わたし　「...!！！！！！」

わたし　「うお、最新版、昨日リリースしてる！！！！！！！運命だ、これは運命だああああああ！！！」

※ [Rails 6.0.0 rc2 released](https://weblog.rubyonrails.org/2019/7/30/Rails-6-0-rc2-released/)

わたし　（さて、`rails new`して`bundle install`して`rake db:create`っと。）

わたし　「よし、問題なし！ 喰らえ、`rails s`！！！」

わたし　「んんん？！？！見慣れないエラー！！！なんだこれは〜〜〜？？？？？？」

<br>

〜〜〜〜〜

<br>

というわけで、その際にした処置を記しておきます！

# 発生したエラー

```console
$ bundle exec rails s

=> Booting Puma
=> Rails 6.0.0.rc2 application starting in development
=> Run `rails server --help` for more startup options
RAILS_ENV=development environment is not defined in config/webpacker.yml, falling back to production environment
Exiting
Traceback (most recent call last):
	68: from bin/rails:4:in `<main>'
~~~以下、省略~~~
```


# 解決策

```console
$ bundle exec rails webpacker:install
```

はい！これでばっちし！

もう一度、`rails s`すると... 

```console
$ bundle exec rails s

=> Booting Puma
=> Rails 6.0.0.rc2 application starting in development
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.6.3-p62), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
```

<img width="672" alt="スクリーンショット 2019-08-01 12.01.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265399/3accdc2b-5477-0420-3b7f-aa30f769ed13.png">

\ Yay! You're on Rails! /

わたし　「やったああああああああああーーーーーーー！」

# 追記

yarnがインストールされていないと、以下のコマンドが失敗するようです。

```console
$ bundle exec rails webpacker:install
```

その場合は

```
$ brew install yarn
```

でyarnをインストールしてあげてください！

※ 参考記事
[Rubyの2.6とRails6のbetaが出たのでrails newした。] (https://www.srockstyle.com/develop/3641/)

# さいごに
ということで、無事にみんな大好き`Yay! You're on Rails!`に出会えました。
もしみなさんが同様なエラーが出たときにお役に立てると幸いです。

それでは良きRailsライフを！！

※ [わたしのtwitterアカウント] (https://twitter.com/jiko797torayo)
VScodeでMarkdown記法を書く

##目的
markdawnで記事を書くための文法メモです。
## 準備
インストールするもの
1. Visual Studio Code  
テキストエディタ
2.  MarkDown Preview  
プレビューを表示するだけならこれだけでよい
3. MarkDown PDF  
pdfに変換する

欲しい機能が出てきたら補足します。

## 基本的な文法

* **見出し**:「#」,「##」,「###」  
見出し文字の下に「=====」(h1)「-----」(h2)でも可能  
* **斜体**: 「\*hoge\*」　　
* **強調**: 「\*\*hogehoge\*\*」  
* **箇条書き**: 「* 」「+ 」「- 」(記号+ space)
    - 数字＋ピリオド：番号付け（記号の直後にスペースかタブ要）
    - 箇条書き・番号付けの後ろで改行は、「行末スペース*2」でできる
    - レベル2は、「tab + - 」。
 
* **リンクの貼り方**:
    \[代替テキスト\](URL):タイトル
* **画像の貼り方**:
   \!\[代替テキスト\](画像のURL)  
* **段落内での改行**: 行末にspace  
* **コードの記述**: 行頭にスペース4つ or tab  
* **HTMLタグ**：直接タグを書く(一部制限あり)  


## VSCodeでのプレビュー方法
[Ctl] + [k] + [v] でプレビューが開く

#参考文献
>[https://www.catch.jp/wiki/index.php?markdown]  
>[https://qiita.com/Qiita/items/c686397e4a0f4f11683d]
fishでgitのタブ補完とエイリアスを設定する


# completionの追加
以下のコマンドを実行

```
$ curl https://raw.githubusercontent.com/fish-shell/fish-shell/master/share/completions/git.fish > ~/.config/fish/completions/git.fish'
```

# gitのエイリアス設定
### git自体のエイリアス
以下のコマンドを実行

```
$ alias g='git'
$ funcsave g
```
funcsaveしないと再起動時にリセットされる。

コマンド実行後に~/.config/fish/functions/g.fishのファイルの中身が以下のようになっていれば良い。
--wraps gitが記述されていない場合は追加する。

```~/.config/fish/functions/g.fish
# Defined in - @ line 1
function g --wraps git --description 'alias g=git'
	git  $argv;
end
```

### gitコマンド中のエイリアス
~/.gitconfigの中身を以下のように自分の好みでエイリアスの設定を追加する。

```~/.gitconfig
[alias]
    st = status
    b = branch
    cm = commit
```
Leetcode #359: Logger Rate Limiter

```swift
class Logger {

    /** Initialize your data structure here. */
    private var dict = [String: Int]()
    
    init() {
        
    }
    
    /** Returns true if the message should be printed in the given timestamp, otherwise returns false.
        If this method returns false, the message will not be printed.
        The timestamp is in seconds granularity. */
    func shouldPrintMessage(_ timestamp: Int, _ message: String) -> Bool {
        if let value = dict[message], timestamp - value < 10 {
            return false
        } else {
            dict[message] = timestamp
            return true
        }
    }
}
```
レベルの高いIT企業で生き残り、かつ信頼されるようになるための処世術

# はじめに

未経験者、あるいは経験年数の浅い方がいきなりハイレベルなIT企業、例えばGAFAだったり、自社開発企業だったりに参画したとき、ほぼ間違いなくレベルの高さに驚くことでしょう。

そして、せっかくそういった企業に入れたとしても、レベルの高さについていけなくなり、精神を病んでしまうというリスクがあります。

当然ながら、これは未経験、あるいは経験年数が浅い人が遭遇しやすいです。

上記に挙げた企業だけでなく、SES企業でもこういった事象に遭遇したりします。

特に最近、プログラミングブームによってエンジニアを目指す人が増えているので、このリスクにどう対処するかが重要かと思われます。

自分自身も、当時の自分からすれば明らかにレベルが高いと感じる現場に参画したことがあります。

最初はキツかったものの、自分なりに考えて行動し、結果的に精神的に追い詰められるリスクを回避し、無事契約終了までやり遂げることに成功しました。

そこで、本記事ではどのようにしてレベルの高い現場を乗り越えていったかについて、当時の記憶を思い出しながらまとめたいと思います。

# レベルの高い現場とは

まずは、レベルの高い現場の定義を行いたいと思います。

自分が思う「レベルの高い現場」とは、以下の通りです。（人によっては違うかもしれませんが）

- 最新技術が使われている
- アジャイル開発である
- 開発メンバーのレベルが高い
- 有名企業である（ただし、古い体質の日系の大企業は除く）
- 堅苦しい雰囲気がなく、オープンマインドである
- ブラック企業ではない

そして、当時の現場がまさにこれら全てに該当しています。

当時の自分のスキルセットでは、まず入れないだろう現場でした。（ぶっちゃけ参画できたのは奇跡だと思います笑）

アジャイル開発では要件定義からリリースまでを1スプリント内でこなす必要がありますが、自分はコーディングしかまともな経験がなく、開発メンバーの中ではスキルが1番低かったのではと思います。また、開発メンバーの中では最年少でもありました。

ここからは、自分がそんな中でどういった行動をしたのか、具体例を出していきます。

# 仕事ができる人を見つけ、徹底的にマークする

参画した当初はスキルはもちろん、そのシステムに関する仕様の理解度も1番低いので、何とかしてそれらを底上げしなくてはなりません。

最初のうちは毎日2、3時間は残業していましたし、先輩方にも仕様などについて教えてもらっていました。

ただ、それだけでは足りないと感じました。先輩方の時間をいつまでも奪い続けるわけにもいかない。

そこで、自分は「開発メンバーが各々何をしているか？」をつぶさに観察することにしました。

設計書の書き方、資料の作り方、Gitにプッシュされたソースコード、プルリクエストでのやりとり、メールでのやりとり、タスクチケットの書き方、周囲の会話、etc...

いきなりがむしゃらにやるのではなく、他の開発メンバーが何をしているのかを把握することで、自分が今やるべきことや、どうやって仕事を進めたらいいのかが見えてきます。

当然ながら、会社は学校と違って誰も手取り足取り教えてくれません。「技術は教えてもらうものではなく、見て盗むもの」と言いますが、これは間違いないです。

その中で、「設計書の書き方が上手い人はこの人だ」、「ソースコードはこの人のコードが綺麗だ」と、それぞれの分野におけるスペシャリストが見つかるはずです。

あとはその人を徹底的にマークし、真似しまくりましょう。ガンガン盗みまくりましょう。

先輩方の時間を奪うこともないし、何も後ろめたいことはありません。自分のスキルも格段に上がるはずです。

# 同じ指摘を2度食らわない

初めて設計書レビューを受けた時や、プルリクエストを出した時、指摘の山が返ってきて、それらを直すのに予想以上の時間がかかってしまうことがありました。

初めてのうちはしょうがないですが、いつまでたっても指摘の山を返されるようでは「こいつは見込みがないな」と見限られてしまいます。

そこで、自分の中で「同じ指摘を2度食らわない」ことを心がけました。

具体的には、以下のような「指摘された内容を一覧化したセルフチェックリスト」を作り、プルリクエスト前には必ず確認するようにしました。

- DRY原則に乗っ取っているか
- マジックナンバーは使われていないか
- 例外を無視していないか
- etc

これにより、指摘の数を格段に減らすことに成功しました。そして、もう指摘されなくなった（自分の中に無意識レベルで身についた）ら、セルフチェックリストから減らしていきます。

このリストから項目がどんどん減っていくことで、自身の成長を実感することができました。

そして、プルリクエストが1発で通るようになり、それが快感でたまらなかったのを今でも覚えています。

# 「自分はこんな有名な企業で働かせてもらえているんだ」というモチベーションを持つ

どうして自分がここまで頑張れたかといえば、「自分はこんな有名な企業で働かせてもらえているんだ」というモチベーションがあったからだと思っています。

誰もが知る有名企業で、当然のように自社ビルがあって、設備も桁違い。オフィスの中にファミマがあって、めちゃくちゃ広い社食もあって、最初はめちゃくちゃ興奮した記憶があります笑

社員も私服の人が多くて日系大企業の堅苦しさもなく、外国人も多くてどちらかというと外資系に近い雰囲気でした。それが自分はすごく好きでした。そして何より社員の方々のレベルがすごく高い。英語も喋れて技術もできる、とにかくスゲー！って感じでした笑

そんな環境で働くことができたら、自分は間違いなく成長できるし、より多くのことを学ぶことができる、またとないチャンスだと思いました。

そういった向上心や憧れ、誇りが持てたからこそ、それらが原動力となり、ここまで頑張れたのだと思います。

# 開発メンバーから頼られる存在に

努力を積み重ね、成長して成果を出していく中で、次第に開発メンバーから信頼されるようになりました。

しまいには「兄貴」と呼ばれ、「ここの実装方法について教えて欲しい」といった感じで頼られるようになりました笑

それが嬉しくて、自分の時間を割いて親身に教えていた記憶があります。

成長する姿を見せることで、いずれは開発メンバーから頼られる存在になっていく。

それを実感することができました。

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

レベルの高い現場は本当に大変ですが、その分自分が成長する可能性を大いに秘めています。

自分のことでいっぱいいっぱいになるかもしれませんが、まずは周りに目を向け、他の人のやっていることに興味を持ちましょう。

そこに仕事がうまくいくヒントがたくさん隠されています。いわば財宝の山です笑

ぜひ、尻込みせずにどんどんチャレンジしていったらいいと思います。

仮にダメだったとしても、そこで死ぬわけではないので大丈夫です。

死ぬこと以外は〜、なんて言いますが、本当そうだと思います。

この記事が、今レベルの高い現場で潰されそうになっている人たちの力になりますように。
Leetcode #346: Moving Average From Data Stream

```swift
class MovingAverage {
    /** Initialize your data structure here. */
    private var stack = [Int]()
    private let size: Int
    private var sum = 0
    
    init(_ size: Int) {
        self.size = size
    }
    
    func next(_ val: Int) -> Double {
        if stack.count < self.size {
            stack.append(val)
            sum += val
            return Double(sum) / Double(stack.count)
        } else {
            sum -= stack.removeFirst()
            stack.append(val)
            sum += val
            return Double(sum) / Double(self.size)
        }
    }
}
```
Cloud Functionsのログを良い感じに出力する

GCPのCloud Functionsでは、トラブルシューティングが比較的面倒です。他の環境と異なり実行環境にログインして確認するようなことができないので、やむを得ず想像力だけでデバッグすることもあるように思います。

こうした状況で助けになる武器の一つが、手元で動くユニットテストです。手元でバグを再現できるなら普段の開発と同じ武器が使えますし、再現しないにせよ原因箇所を狭める助けにはなるでしょう。

もちろん、ユニットテストだけで全機能をカバーできるわけではありません。たとえばGCPに特化した機能を使いたくてCloud Functionsを使っている場合など、クラウド環境でしか再現しないバグも考えられます。そうした状況ではユニットテストは無力です。

そこで次に重要になってくるのがログ出力です。Cloud FunctionsのログはCloud Logging[^1]で管理されているので、ログが巨大でも必要な情報を簡単に取り出すことができます。あとは必要なログをどう残すかが課題ということになります。

本稿ではCloud Functionsでこういうログを出すと便利ですよ、という個人的見解を紹介します。コード例はPythonですが、他の言語にも適用できる内容だと思います。

[^1]: 旧名Stackdriver Logging。巨大なログが相手でも高速に全文検索ができちゃう、他所でもよく見る奴。中身はBigTableなんですかね…？[要出典]

## Cloud Functionsのログとログレベル

Cloud Functionsのログは次の3種類のレベルで記録されます。

- ERROR （標準エラー出力）
- INFO （標準出力）
- DEBUG （システムによる出力）

DEBUGレベルではCloud Functionの起動と終了が表示されます。残りの2つのレベルは利用者が自由に使えます。これはランタイム言語が何であっても同じはずです。

## エラーを追いやすくするために(1)

Cloud Functionsの場合、エラーが出た場所をすぐ特定できることが極めて重要です。私は次のようなことが大切ではないかと考えています。

- エラーチェックをマメに書く
- エラーが出たら即座に例外を発生させる
  -  スタックトレースをログに出して、エラー箇所を追いやすくするため
- 例外メッセージに、そのコンテキストで重要な変数値などを入れ込む

```Python
    if ret == {}:
        raise Exception(f'No JSON file in the zip file: {zip_filename}')
```

これはCloud Functionsに限らない一般論ではありますが、こういう環境だと一段と大事ですね。

## エラーを追いやすくするために(2)

既存ライブラリが例外を出す場合、そのままログに表示させてもいいのですが、例外を投げ直した方が良いことも珍しくありません。

```python
try:
    return [permission() for permission in self.permission_classes]
except TypeError as e:
    raise TypeError(f'独自のエラーメッセージ {重要な変数値などを含める}') from e
```

このように、ログを見る人が状況を把握しやすくなるようなメッセージを追加して投げ直すのが良いでしょう。

## エラーを追いやすくするために(3)

基本的には例外メッセージだけでトラブルが追えるようにしておくべきですが、それ以外にも必要最低限の情報をINFOレベルで出力しておくと便利です。

```python
    print(f'Processing "{zip_filename}" ...')
```

INFOレベルの情報にしておけば、エラーだけ追いたいときはフィルタで消すこともできますから邪魔になりません。

## まとめ

- ログは大事だよ
  - （知ってた）

## 参考URL

- [ログの書き込みと表示](https://cloud.google.com/functions/docs/monitoring/logging?hl=ja)
- [python \- Adding information to an exception? \- Stack Overflow](https://stackoverflow.com/questions/6062576/adding-information-to-an-exception)
Leetcode #1047: Remove All Adjacent Duplicates in String

```swift
func removeDuplicates(_ S: String) -> String {
    var stack = [Character]()
    var index = 0
    var str = Array(S)
    while index < str.count {
        if !stack.isEmpty && stack.last! == str[index] {
            stack.removeLast()
        } else {
            stack.append(str[index])
        }
        index += 1
    }
    return String(stack)
}
```
Leetcode #821: Shortest Distance to a Character

```swift
func shortestToChar(_ S: String, _ C: Character) -> [Int] {
    var answer = Array(repeating: 0, count: S.count)
    var index = -1
    for (i, char) in S.enumerated() {
        if char == C {
            let startIndex = (index == -1) ? 0 : (index + i) / 2 + 1
            for j in stride(from: startIndex, to: i, by: 1) {
                answer[j] = i - j
            }
            index = i
        } else {
            answer[i] = i - index
        }
    }
    return answer
}
```
Leetcode #965: Univalued Binary Tree

```swift
func isUnivalTree(_ root: TreeNode?) -> Bool {
    return helper(root?.left, root!.val) && helper(root?.right, root!.val)
}

func helper(_ node: TreeNode?, _ target: Int) -> Bool {
    if node == nil {
        return true
    }
    if node!.val != target {
        return false
    }
    return helper(node?.left, target) && helper(node?.right, target)
}
```
WindowsバッチからWSL (Windows Subsystem for Linux)のコマンドを使用するメモ

# 概要
WindowsバッチからWSL (Windows Subsystem for Linux)のコマンドを呼び出す方法について解説します。

# WSLコマンドの呼び出し

WSLコマンドをWindowsバッチから呼び出すには、wslコマンドの引数に実行したいLinuxのコマンドを指定します。

```
C:\>wsl pwd
/mnt/c
```

# パス表現
WindowsのパスはWSLにおいて以下のように表現されます。ここでは"C:\Users"を指定しています。

```
/mnt/c/Users
```

# パス変換
WindowsのパスとWSLのパスを相互変換するには、wslpathコマンドを使用します。wslpathコマンドはwslコマンドに続けて打ち込みます。

-uオプションでWindowsパスをWSLのパスに変換します。

```
C:\>wsl wslpath -u C:\
/mnt/c/
```

-wオプションでWSL形式のパスをWindowsのパスに変換します。

```
C:\>wsl wslpath -w /mnt/c/Users
C:\Users
```

# パイプ
wslコマンドの引数としてパイプ(|)を渡すことはできません。通常のWindowsコマンドと同様にwslコマンドを実行し、その結果を再度wslコマンドにパイプで渡すことでLinuxコマンドを連続して実行できます。
例)

```
C:\>wsl ls /mnt/c | wsl grep Users
Users
```

# 復帰値
WSL側のコマンド復帰値はWindows側のERRORLEVEL環境変数に格納されます。

```
C:\>wsl exit -1

C:\>echo %ERRORLEVEL%
255
```

# サンプル
サンプルとしてWindowsのnetstatコマンドの結果から、TCPポートのbind状況のみを取得するワンライナーコマンドを実装します。

```
C:\>netstat -ano | wsl grep TCP | wsl awk '{print $2}'
0.0.0.0:135
0.0.0.0:445
0.0.0.0:5040
0.0.0.0:5357
0.0.0.0:49664
0.0.0.0:49665
0.0.0.0:49666
0.0.0.0:49667
0.0.0.0:49668
0.0.0.0:49669
0.0.0.0:49670
0.0.0.0:49671
0.0.0.0:49672
0.0.0.0:49678
0.0.0.0:49704
```
Leetcode #942: DI String Match

```swift
func diStringMatch(_ S: String) -> [Int] {
    var answer = Array(repeating: 0, count: S.count+1)
    var minValue = 0
    var maxValue = 0
    for (i, char) in S.enumerated() {
        if char == "I" {
            maxValue += 1
            answer[i+1] = maxValue
        } else {
            minValue -= 1
            answer[i+1] = minValue
        }
    }
    if minValue < 0 {
        answer = answer.map { $0 - minValue }
    }
    return answer
}
```
Debian GNU/Linux のバージョンを調べるコマンドやファイル

## 概要
- Debian GNU/Linux や Linux カーネルのバージョンをコマンドやファイルの中身を確認して調べる

## /etc/debian_version

シンプルに Debian のバージョンがわかる。

```
$ cat /etc/debian_version
9.9
```

## /etc/issue

```
$ cat /etc/issue
Debian GNU/Linux 9 \n \l
```

## /etc/issue.net

```
$ cat /etc/issue.net
Debian GNU/Linux 9
```

## /usr/lib/os-release

```
$ cat /usr/lib/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
```

## /etc/os-release

```
$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
```

## uname

```
$ uname -m
x86_64

$ uname -o
GNU/Linux

$ uname -r
4.9.0-9-amd64

$ uname -s
Linux

$ uname -v
#1 SMP Debian 4.9.168-1+deb9u4 (2019-07-19)

$ uname -morsv
Linux 4.9.0-9-amd64 #1 SMP Debian 4.9.168-1+deb9u4 (2019-07-19) x86_64 GNU/Linux

$ uname -a
Linux your-host-name 4.9.0-9-amd64 #1 SMP Debian 4.9.168-1+deb9u4 (2019-07-19) x86_64 GNU/Linux
```

## lsb_release

```
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 9.9 (stretch)
Release:	9.9
Codename:	stretch
```

## 参考資料

- [Debian 管理者ハンドブック - 3\.2\. 移行の方法](https://www.debian.org/doc/manuals/debian-handbook/sect.how-to-migrate.ja.html)
- [os\-release](https://www.freedesktop.org/software/systemd/man/os-release.html)
- [Man page of UNAME](http://linuxjm.osdn.jp/html/GNU_sh-utils/man1/uname.1.html)
- [Debian \-\- stretch の lsb\-release パッケージに関する詳細](https://packages.debian.org/stretch/lsb-release)
SpriteKitでタッチしたところにアニメーションを表示する

#はじめに
SpriteKitで作ったアプリを友人に見てもらっている時に言われました。
「タッチしたところにアニメーションが表示されてタッチした箇所がわかりやすいアプリがあるからそうした方が良い」

日本語で表現するとわかりにくいですが以下のような動作です。

![画面収録-2019-08-01-20.06.03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439918/44b22e10-920c-0718-eb92-01952bf986ba.gif)


#準備するもの

- クリック時表示される画像
- SpriteKitが使える状態のプロジェクト

#ソースコード

```swift

import SpriteKit
import GameplayKit

class GameScene: SKScene {
    let img_circle = SKSpriteNode(imageNamed: "circle.png")  //表示される画像
    let action1 = SKAction.fadeIn(withDuration: 0)           //表示アクション
    let action2 = SKAction.fadeOut(withDuration: 0.5)        //フェードアウトアクション
    var actions = SKAction()                                 //表示とフェードアウトをセットにするシーケンス
    
    
    override func didMove(to view: SKView) {
        self.addChild(img_circle) //タッチ時にシーンに表示される画像をシーンに追加
        
        img_circle.alpha = 0      //タッチされないと表示しないのでalphaを0に設定
        
        //非表示状態の画像を表示してフェードアウトさせるシーケンスを作成
        actions = SKAction.sequence([
            action1,
            action2
            ])
    }
    
    //タッチイベント時処理
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches{
            let location = touch.location(in: self) //タッチされた座標を取得
            img_circle.position = location          //タッチ時に表示する画像の位置を設定
            img_circle.run(actions)                 // アクションを実行させる.
        }
    }
}

```

#さいごに
「withDuration」の「0.5」を調整することでフェードアウトする時間を変更できます。

もっとスッキリ書けるのかどうかわかりませんが、とりあえずそれっぽい動きをしてくれるものができたので忘れないように書き記しておきます。
Google Colaboratory の使い方

Chrome で、google にログインした状態で次にアクセスします。
[https://colab.research.google.com](https://colab.research.google.com)

PYTHON3 の新しいノートブックをクリックします。
![Screenshot 2019-08-01 at 20.21.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/f93e3186-283f-a219-cf3d-290ddbc1b579.png)

次のコードを入力します。

```py
print("*** start ***")
aa = 12
bb = 35
cc = aa + bb
print(cc)
print("*** end ***")
```

![Screenshot 2019-08-01 at 20.22.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/7701c02f-2521-6f60-1ff4-312335b75b67.png)

左上の矢印をクリックして実行します。
![Screenshot 2019-08-01 at 20.22.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/233de26e-5e9e-dd53-0472-458c903d5f2e.png)