OmniAICreator/Qiita-1.07M huggingface dataset:
Array.prototype.sortについて、きっと知らないこと

JavaScriptである程度のコードを書いたことがある人なら、配列を`.sort()`メソッドでソートしたことがある人も多いかと思います。ただ、調べれば調べるほど、複雑な事情が生じてきます。

まずは導入として、以下のコードはどのような配列を生成するか、予想してみてください。

```js
[, null, undefined, 'jkr_2255', 'qiita'].sort()
```

これがピタリと正解できた場合には、この記事を読む必要はないかもしれません。なお、この文書はECMA-262 第6版（いわゆる「ES6」）を前提としています。数字だけのリンクは、仕様書の各セクションにつながっています。

## ソート関数を指定しない場合

まずは、ソート関数を指定しない場合の挙動について考えていきます。この場合、「中身を文字列化して順に並べ替える」ということはよく知られているかと思います（数値が順にならなかった経験をしたことがある人もいるかと思います）。この中身を掘り下げてみます。

### `ToString`内部操作

よく、値を文字列化するのに、`String(value)`や`value + ''`のような手法が使われますが、標準で行われるソートの比較時に使われるのは、内部名が`ToString`となっている操作です（[22.1.3.24.1](http://www.ecma-international.org/ecma-262/6.0/#sec-sortcompare)）。

この`ToString`は、以下のような値を返します（[7.1.12](http://www.ecma-international.org/ecma-262/6.0/#sec-tostring)）。なお、説明の都合上、一部の型のみ書いています。

*  `null`→`"null"`
*  ブール値→`"true"`または`"false"`
*  シンボル→**`TypeError`を起こす**

というわけで、シンボルの入った配列を比較関数なしで`.sort()`しようとすると、`TypeError`になってしまいます。また、`null`は文字列の`"null"`と同様の位置に並ぶこととなります。

ちなみに、`value + ''`は左辺について`ToPrimitive`、それから`ToString`が行われる一方（[12.7.3.1](https://www.ecma-international.org/ecma-262/6.0/#sec-addition-operator-plus-runtime-semantics-evaluation)）、`String(value)`はシンボルだけ特殊なハンドリングが入っています（[21.1.1](https://www.ecma-international.org/ecma-262/6.0/#sec-string-constructor)）。標準関数でシンプルに`ToString`と同じ結果を得ようとすれば、`''.concat(value)`という方法があります。

※ ここについては、@think49 さんからの指摘を元に修正しました。

とはいえ、このあたりはソート関数を適宜定義すればどうにかなる問題です。

## ソート関数を指定しても起きる問題…`undefined`、値なし

上の`ToString`のリストから`undefined`を省略しましたが、`undefined`は比較関数で**評価されません**。どのような比較関数を使って`.sort()`を動かそうとも、`undefined`は最後に来ることとなります（[22.1.3.24.1](http://www.ecma-international.org/ecma-262/6.0/#sec-sortcompare)）。

そして、値のないプロパティ（`Object.prototype.hasOwnProperty.call(arr, index) === false`となるもの）があった場合、`undefined`よりさらにあとに来ることとなります。この挙動も、変更できません（ふつうにコードを書いていて、「配列の途中のインデックスが抜けたままになっている」ものに遭遇する機会も、あまり多くはないかとは思いますが）。

## 実装依存の挙動

`Array.prototype.sort`は配列以外にも使える汎用的なメソッドとなっていますが、以下のような場合はソート順が実装依存（≒どうなるかわからない）となります。便宜上、以下の文ではソート対象となるオブジェクトを「配列」としています。

* 渡した比較関数が一貫しない（反射律・対称律・推移律を満たさない、あるいは配列自身あるいはそのプロトタイプを書き換える）場合
* 疎な配列（一部の値がない配列）について、`Object.preventExtensions`がかかっている、あるいはソート範囲内のプロパティで、`configurable: false`となっているものがある場合
* `Proxy`オブジェクトなど、内部挙動が特殊なオブジェクトを`this`として`.sort()`を実行した場合
* ソート範囲内のプロパティに`writable: false`となったプロパティ、あるいはアクセサプロパティがある場合
* デフォルトの比較関数を使っていて、
  * `ToString`の結果が一貫しないオブジェクトが配列に入っている場合
  * `ToString`を実行すると、配列自身あるいはそのプロトタイプを書き換えるようなオブジェクトが配列に入っている場合


## 最初の答え

```js
["jkr_2255", null, "qiita", undefined, /* 空き */]
```

## 外部リンク

* [ECMA-262 第6版§22.1.3.24 Array.prototype.sort()](http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.sort)
EXCEL VBA 選択範囲を全角・半角変換するマクロを右クリックメニューに追加する＆メニューのリセット

Sub 半角変換()
Dim SR As Range
    For Each SR In Selection
        SR.Value = StrConv(SR.Value, vbNarrow)
    Next SR
End Sub

Sub 全角変換()
Dim SR As Range
    For Each SR In Selection
        SR.Value = StrConv(SR.Value, vbWide)
    Next SR
End Sub
Sub 右クリック()
   With CommandBars("cell").Controls.Add(Type:=msoControlButton, before:=8)  'before=8は、右クリックメニューの上から8個目に「全角に変換」メニューを追加するという意味です。自分で調節してください
        .Caption = "全角に変換"
        .OnAction = "全角変換"
    End With
    With CommandBars("cell").Controls.Add(Type:=msoControlButton, before:=9) 'before=9も何行目に入れるかは自分で調節してください
        .Caption = "半角に変換"
        .OnAction = "半角変換"
    End With


##右クリックメニューをリセットする   
End Sub
Sub リセット()
    CommandBars("cell").Reset
    
End Sub
EXCEL VBA 選択範囲を全角・半角にする

Sub 半角変換()
Dim SR As Range
 For Each SR In Selection
        SR.Value = StrConv(SR.Value, vbNarrow)
    Next SR
End Sub

Sub 全角変換()
Dim SR As Range
    For Each SR In Selection
        SR.Value = StrConv(SR.Value, vbWide)
    Next SR
End Sub
Swift：macOS用のシリアル通信ライブラリを作った（CocoaPods公開）

# 概要
最近はBLEとか無線が主流になってきていて，シリアル通信なんていらないぜって方もいるかもしれませんが，それでも開発機やプロトタイピングだったりすると，マイコンとの通信はシリアル通信が簡単で便利ですよね．おそらく，macOS (旧OSX)でシリアル通信やるアプリを実装するとなったら，多くの方がObjective-Cで書かれた[ORSSerialPort](https://github.com/armadsen/ORSSerialPort)を使ってきたことだと思います．ORSSerialPortは優秀なライブラリなのですが，Swiftが浸透してきた時代には新しいライブラリが必要だと感じました．そこで，今回はシリアル通信用のライブラリをSwiftで書いてみました．


# 成果物 - SerialGate
MITライセンスにてGitHubにオープンソースとして公開し，CocoaPodsでもインストールできるようにしてみました（今回初の試み）．
GitHubのリンク：[SerialGate](https://github.com/Kyome22/SerialGate)

## デモ
プロジェクトの中にデモアプリが入っています．READMEにも使い方が軽く書いてありますが，実装はデモを参考にするといいと思います．機能検証は所持していたArduino microとmbedで行いました．Readは改行コード区切りで取得できます．

![DemoApp.png](https://qiita-image-store.s3.amazonaws.com/0/67153/6c427bed-396c-4af1-6521-0e5b8e42e57f.png)

# 所感
今回Cに近い所の実装をしたため，`Unmanaged<T>`や`UnsafeMutableRawPointer`など普段接しないものに触れてSwiftの深淵を少し覗いた気がしました．
このSerialGateはまだ成長途中気味なライブラリではありますが，Swift時代のシリアル通信のデフォルトスタンダードになれたらなぁと思います．
OpenvSwitchでVXLAN

# OpenvSwitchでVXLAN

OpenvSwitchでVXLANを試してみた。
## 環境
- OS: Ubuntu 16.04

## インストール

    # apt update
    # apt install openvswitch-common openvswitch-switch

Linuxの標準のモジュールのbridgeを使わないように設定する。

    # rmmod bridge

## トポロジ
![vxlan_topology.jpg](https://qiita-image-store.s3.amazonaws.com/0/316641/c3f0df4f-e050-096c-a5e1-1902998d5232.jpeg)


OVSに接続しているゲストはLXCを使用した。

## コンテナ作成
OVSに接続するコンテナのプロファイルを作成。
デフォルトのプロファイルをコピーしてeth0の設定を変更する。

```
# lxc profile copy default c100
```

    config: {}
    devices:
        eth0:
            host_name: c100
            name: eth0
            nictype: p2p
            type: nic
    name: c100
    used_by: []

host_nameには、ホスト側で表示されるインターフェース名を指定する。指定しなかった場合は、自動で付与される。今回は、インターフェース名を使用してOVSの設定をするので指定した。
また、nictypeのp2pは、仮想ペアを作り、片方をコンテナに、片方をホストに置かれる。

作成するコンテナごとにプロファイルを作成する。1つのホスト上にc100とc200を作る。

    # lxc launch ubuntu:16.04 c100 -p c100 
    # lxc launch ubuntu:16.04 c200 -p c200


コンテナにアドレスを付与する。(別のホスト上のコンテナにはIPが被らないように設定する。)

    # lxc exec c100 -- ip address add 192.168.100.1/24 dev eth0
    # lxc exec c200 -- ip address add 192.168.200.1/24 dev eth0

## OVSの設定
仮想スイッチを作成する。

    # ovs-vsctl add-br ovs1


vxlanのインターフェースを作成する。今回はタグが100と200で区切るので2つ作成する。

    # ovs-vsctl add-port ovs1 vxlan100 tag=100 -- set interface vxlan100 type=vxlan options:remote_ip=172.168.0.2 options:key=100
    # ovs-vsctl add-port ovs1 vxlan200 tag=200 -- set interface vxlan200 type=vxlan options:remote_ip=172.168.0.2 options:key=200


コンテナのvethを仮想スイッチに接続する。

    # ovs-vsctl add-port ovs1 c100 tag=100
    # ovs-vsctl add-port ovs1 c200 tag=200


## 疎通確認
コンテナから別のコンテナへpingを送信してみる。

    # lxc exec c100 -- ping 192.168.100.2
    成功する
    # lxc exec c100 -- ping 192.168.200.2
    失敗する
初学者と学ぶAIの中身

# AI(人工知能)とは
「人工知能」とは何だと思うでしょうか？
人間のように振る舞う機械を想像するのではないでしょうか？

人工知能の研究には二つの立場があります。
・人間の知能そのものをもつ機械を作ろうとする立場
・人間が知能を使ってすることを機械にさせようとする立場

現在の研究では、ほとんどが後者となっています。

なぜ前者ではないのか？

それは、人口知能は人間の脳と同じ働きをするプログラムを数式で再現したに過ぎないからです。
つまり、人間の脳の解明が済んでもいないのに、人間の脳を数式で再現することはできないのです。

# ほとんどのAIは機械学習

世間でAIがよく騒がれてますが、世間でAIのニュースが騒がれている時は、ほとんどが下図の機械学習のことを指しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330360/12ebda73-e8e8-7ccb-5282-74a730deffe8.png)

それでは現在注目されている機械学習、その中身を一緒に追っていきましょう。

# ニューラルネットワーク
まず、ニューラルネットワークについて説明します。
人間の脳は下図のようなニューロンが集まってできています。脳に情報が入った時には、情報を認識し、答えを出力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330360/948316cc-b3dd-c640-d294-70e099d96603.png)

それらを詳しく表した図が下図になります。

入力層にて情報をインプットし、中間層(実際には何重にもなっている)にて入力された情報を細かく分解し解釈し、出力層にてアウトプットを行います。
正確には出力を行った際に、出力データを入力データとして再度入力し、繰り返し解答の吟味を行っています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330360/2c8acffb-e6fd-0eba-bb18-6546f1c20254.png)

それでは、今の例と合わせて画像認識など機械学習の一連のフローがどのように行われているのかをご説明します。

# 機械学習のフロー

今流行りの画像認識ですと、下記のように変換され行われています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/330360/ce03d9a6-7034-a1f5-0f65-01c2bb4260e8.png)

#　まとめ
今回は初学者と学ぶAIということで、数式のような難しいことは使わずAIの概要を説明しました。
本当はこのニューラルネットワークのアルゴリズムというのが、数学を思いっきり使うので、大変です。
また数学を勉強し、理解が進んだら、皆さんにニューラルネットワークの中身について易しく説明していきたいと思います。
テストで失敗しないための忘備録

テストで電子メール、クレジットカード、電話番号などを扱うこともあると思います。
そんな時に失敗しないための忘備録

###ドメイン名

[RFC2606](http://www.rfc-editor.org/rfc/rfc2606.txt)によるとTLD（Top Level Domain）として、

```
xxx.test
xxx.example
xxx.invalid
xxx.localhost
```
が予約され使えるとあります。
.testは、DNSに関するテストで使用されることを想定しています。
.exampleは、サンプルコードやドキュメントなどに記載される用途を想定しています。
.invalidは一目で無効であることが確実な状況のドメイン名として使用されることを想定しています。
.localhostはドメインではないですが、予約されているという意味で提示されています。

Second Level Domainとして下記のドメイン名も予約されています。

```
example.com
example.net
example.org
```

これらは、The Internet Assigned Numbers Authority (IANA)が同意し予約されたドメインです。2019年1月現在、これらのドメイン名は93.184.216.34としてresolveされます。

また、[http://example.com](http://example.com)にアクセスするとこんな画面が表示されます。

![スクリーンショット 2019-02-13 18.35.14.png](https://qiita-image-store.s3.amazonaws.com/0/37634/d90e68d1-efe4-ddfd-0ce0-56769e394cbc.png)

###メールアドレス

少なくともドメインは上記に記したように予約されているので、問題はないと思いますが論拠は見つかりませんでした。（エラーメールになったりするんでしょうか。確かめていません）

```
hoge@example.com
```

###IPアドレス

[RFC 6890](https://tools.ietf.org/html/rfc6890)により規定されているようです。

```
192.0.2.0/24
198.51.100.0/24
203.0.113.0/24
```

###クレジットカード

決済サイトのテストなどでクレジットカード番号を入力したい場合があります。
カード番号のリストを掲載している記事もあるのですが、元ネタが何か分からなかったので、Web決済事業者のページを当たってみました。

結果として全てのサイトで共通の番号はなかったのですが、多数決で使えそうな番号は下記の通りです。（３〜４サイトで共通でした）

| カード番号       |      ブランド |
|:-----------------|:------------------|
| 4242424242424242 | Visa |
|5555555555554444|    MasterCard|
|5105105105105100 |   MasterCard|
|3530111333300000 |   JCB|
|3566002020360505|    JCB|
|378282246310005 |   American Express|
|371449635398431 |   American Express|
|38520000023237 |   Diners Club|
|30569309025904  |  Diners Club|

セキュリティコードは任意の数字３桁、または４桁です。

確認した決済サイトは下記の通り。

|運営会社       |      URL |
|:-----------------|:------------------|
|ペイパル | https://pay.jp/docs/testcard|
|Yahoo.co.jp | https://fastpay.yahoo.co.jp/docs/card|
|GMO payment | https://faq.gmo-pg.com/service/detail.aspx?id=1681&a=102&isCrawler=1|
|stripe| https://stripe.com/docs/testing|
|omise | https://www.omise.co/ja/api-testing|

### 電話番号（SMS）

残念ながら見つかりません。
これ使えるというのがあればおしらせください！
[Flutter] BLoC + Rx で実装するために見るもの


Business Logic Component + ReactiveX で Flutter を書いてくにあたって見ると良いもの

## 公式の登壇動画
### [Flutter / AngularDart – Code sharing, better together (DartConf 2018) ](https://t.co/G4kvwmSP6Q)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159680/2fb41880-b30f-1606-17a7-911c3a88b765.png)

* BLoC についての初の登壇動画。 *話はこれを見てから！！*
* [ソースコード](https://github.com/brianegan/github_search_angular_flutter)

### [Google I/O '18 | Build reactive mobile apps with Flutter](https://www.youtube.com/watch?v=RS36gBEp8OI)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159680/7370feae-d880-3aaf-1f55-b2ec666eac31.png)

* BLoC パターンで書いていこう！ な盛り上がりが出るようになったプレゼン、という個人的な印象があります。
  * 筆者はこれを見て BLoC + Rx で書くようにしました。
* [ソースコード](https://github.com/filiph/state_experiments)
* **[ReactiveX ドキュメント | subject の図解](http://reactivex.io/documentation/subject.html)**
* [RxDart](https://pub.dartlang.org/packages/rxdart)

### [ReactiveConf 2018 | Practical Rx with Flutter](https://www.youtube.com/watch?v=7O1UO5rEpRc)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159680/bbc48006-2294-5f05-117d-095d26aff51c.png)
上記2つを見ていれば復習的な感覚で見られる。
これソースコード見つけられなかった...公開されてないっぽい...?

### [Google I/O'19 | Pragmatic State Management in Flutter](https://www.youtube.com/watch?v=d_m5csmrf7I&list=LLX490Ns0w_wupP0sWu3DH9g&index=2&t=3s)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159680/dd0c478a-9afd-96cb-f97d-673ef78baad7.png)

* 目新しいことはあまりなかった印象
* Provider については https://github.com/google/flutter-provide/issues/3 を参照のこと

## おまけ
Live Templates を用意してタイプ量を減らす。

```
# 「bhs」
/// $1$
ValueObservable<$2$> get $3$ => _$3$Controller;
final _$3$Controller = BehaviorSubject<$2$>();
```

```
# 「pbs」
/// $1$
Sink<$2$> get $3$ => _$3$Controller.sink;
final _$3$Controller = PublishSubject<$2$>();
```

## おわりに
gihub で検索すると BLoC + Rx のサンプルはいくつか出てきますが、構成は割とまちまちです。(これは問題ではありません。一番最初の動画で触れられています。)
中には BLoC + Redux というのもあります。参考: [rebloc パッケージ](https://pub.dartlang.org/packages/rebloc)

快適な Flutter ライフを
vue.jsのデータバインディング

vue.jsのデータバインディング方法は2通りあります。
・v-htmlディレクティブ
・mustacheタグ（{{}}）

詳細は、vue.jsの公式ドキュメント参照
https://jp.vuejs.org/v2/guide/computed.html

v-htmlディレクティブはHTMLとして読まれるため、ユーザ入力情報をv-htmlにバインディングしてしまうと悪意のあるコードを実行されてしまう危険性があります。
クロスサイトスクリプティングを防ぐためにも、mustacheタグ（{{}}）を使ってプレーンなテキストとして扱うのがよいです。
フレームワークでも、ちゃんとセキュリティ対策しないといけないですね。
ブログアプリ作成記録

##これから自身が初めてアプリを作るのでその記録として記事を書いていく　

当アプリのコンセプトとしては 

* Railsで作る簡単なブログアプリ
初めて作るので、機能的には簡易で完了を目的とする。
制作期間は１週間。

---
最低限実装する機能としては
-Userがログイン / ログアウト / サインインできるブログ機能
 -Userがブログを投稿できる。
  -Userが自分のブログを編集できる。
   -Userが自分のブログを削除できる。
    -ログインしていなくても全てのブログを閲覧できる。 

---
・開発環境（ruby '2.5.1'）（rails ' 5.2.1'）

・デザイン
Materialize.cssを使用。

---

##意気込み
なるべく早く目安（三日）で基本的な実装を完了してプラスaな機能をどんどん追加していきたい。
vue.jsでサーバーサイドレンダリングする場合は、vue.jsのエスケープを。

vue.jsをサーバーサイドでレンダリングする場合、HTMLのエスケープではなくvue.jsのエスケープが必要です。

```php:index.php
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.min.js"></script>
<div id="app">
  <?= htmlspecialchars($_GET["param"], ENT_QUOTES, "utf-8") ?>
</div>
<script>
      new Vue({
        el: '#app'
      })
</script>
```

上記をphp（サーバーサイド）で実装、URLパラメータに「param={{alert(1)}}」を付けて実行すると
alert()が発火してしまいます。
どうしてもサーバーサイドレンダリングをする場合は、サーバ側でvueを生成する場合は、「{{}}」をサーバでエスケープしなければいけません。
GRASS GIS v.surf.rstコマンドで等高線からDEMを作成する

下図のような等高線図からDEMを作成します。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/60438/d6cb4a1a-5fcf-01d8-b464-cbe19e9e3173.png)

まずは苦行のようなデジタイズ。５時間ほど頑張ってトレース完了。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/60438/0c820f8b-62cf-bacd-9b0c-4a8cf67c1007.png)

## GRASS GISへインポート
GRASS GISへのインポートはQGISから行うのが簡単な方法です。

GRASSで分析するための領域を設定します。無駄に広い範囲を設定すると作成するDEMのデータが巨大化するので、必要な範囲ギリギリに設定するのがポイントです。
QGISのGRASSプラグインではマウスドラッグで領域を設定できます。
「解像度」はDEMのメッシュ解像度を指定します。ここでは0.5mメッシュとします。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/60438/f5092549-8b04-0e79-ba7b-b71126daa1c4.png)

GRASSツール→ファイル管理→GRASSへベクタをインポートします→ロードされたベクタをインポートする
![04.png](https://qiita-image-store.s3.amazonaws.com/0/60438/51747bad-5793-fc52-8bf2-a98e9556320c.png)

## GRASSでデータを開く
GRASS GISを開いて、データがインポートできたかどうかを確認してみます。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/60438/757c3db1-64d3-cc22-6ae6-9a4392696ec4.png)

## v.surf.rstコマンド
ここでv.surf.rstコマンドを使います。ベクタ等高線をラスタ化する必要もありません。

```shell
##ベクタ等高線と標高フィールドを指定するだけ
v.surf.rst input=contour_Tokyo11@contour zcolumn=level elevation=contour_ras_rst --overwrite
```

- インプットするベクタ等高線=contour_Tokyo11@contour
- 出力するDEM=contour_ras_rst
- Z座標＝level（ベクタ等高線の標高フィールド値）

ベクタ等高線の標高フィールド値に入力ミスがあったので、こんなエラーがでています。
この規模のデータの場合、順調に進んで10分くらいで処理が終わりました。
![grass.png](https://qiita-image-store.s3.amazonaws.com/0/60438/427245f3-387b-28ea-58a6-7927d281351f.png)

出力されたDEMラスタ。良さげな出力です。
![06.png](https://qiita-image-store.s3.amazonaws.com/0/60438/42adeff7-b111-da27-058d-aed61a4ab0ff.png)


GeoTiffに出力します。

```shell
## GeoTiffに出力
r.out.gdal input=contour_ras_rst@contour output=DEM_Tokyo11.tif format=GTiff
```

## QGISで開いてCS立体図にする

QGISで開いて陰影図と重ねるとこんな具合。堀や水路の凹凸もよく表現されています。
![07.png](https://qiita-image-store.s3.amazonaws.com/0/60438/044ab393-b52d-e421-8107-6ea5489a19fb.png)

もう少し、微地形を観察したいのでCS立体図を作成します。
CS立体図の作り方は喜多耕一さんが紹介していますので割愛します。
[QGISで「CS立体図」の「立体図」を作ってみた](http://koutochas.seesaa.net/article/444171690.html)

ちょっとエログロい感じに仕上がっています。なかなか調整が難しくて途中で挫折しましたが、微地形は「これでもか！！」というほどよくわかります。
![08.png](https://qiita-image-store.s3.amazonaws.com/0/60438/4af97123-6293-ea2e-9e56-e3a7b2401e55.png)

ブラウザでグリグ動く[３D館城](https://ishiijunpei.github.io/TJ3D/.)も作ってみました。
![3D館城.png](https://qiita-image-store.s3.amazonaws.com/0/60438/ed4f1a26-88eb-f089-9668-b40c065de44c.png)
Rxswiftを使ってソートボタンを作る


#ソートボタンを作った経緯
今回はRxSwiftを使ってソートボタンを作ったのですが、作るのに時間がかかってしまったため他にもソート機能の作り方に悩んでいる方がいれば参考になればと思い書きました。

##ソートする値
今回はapiで取ってきたmodelにあるデータに対してソートする機能を作成しました。
startedAtが取得したデータの登録された日付なので、そちらを昇順にしたいと思います。
値のjsonの型としては下記になります。

```swift
struct ConnpassStruct: Codable {
    var events: [Events]
    struct Events: Codable {
        var title: String
        var eventUrl: String
        var startedAt: String
        private enum CodingKeys: String, CodingKey {
            case title
            case eventUrl = "event_url"
            case startedAt = "started_at"
        }
    }
}
```

##BehaviorRelay
今回はデータを保持したいのでBehaviorRelayを使いました。
BehaviorRelayにて保持したデータを、ソートボタンのイベントを取得したら
sortメソッドを使って、昇順にします。

```swift
self.ascButton.drive(onNext: { _ in
    let ascDate = self.resultsfields.value.sorted(by: {$0.startedAt < $1.startedAt})
    self.resultsfields.accept(ascDate)
}).disposed(by: disposeBag)
```

###参考
[RxSwift 再入門](https://qiita.com/usamik26/items/444d6dd7386b2949c06b#behaviorrelay--publishrelay-%E3%81%AE%E9%81%95%E3%81%84)
[RxCocoa 4 の Signal と Relay のまとめ]
(https://tech.mercari.com/entry/2017/12/04/103247)


##Drive
modelで取得したデータをViewModelでsortし、ViewにDriverを使ってbindさせています。
コードとしては下記になります。


```viewcontroller.swift
var ascButton: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .fastForward, target: nil, action: nil)

//省略

self.viewModel = ConnpassViewModel(
ascButton: self.ascButton.rx.tap.asDriver(onErrorDriveWith: Driver.empty()),
)

    self.viewModel.ascButton
        .drive(onNext: { [weak self] in
            self?.tableView.reloadData()
        }).disposed(by: disposeBag)
```

```viewmodel.swift
class ViewModel {
    let ascButton: Driver<Void>
    //ここはmodelで取ってきたデータをresultsfieldsにいれているがその記述は省略しています
    var resultsfields = BehaviorRelay<[ConnpassStruct.Events]>(value: [])
    private let disposeBag = DisposeBag()
    init(ascButton: Driver<Void>) {
        self.ascButton.drive(onNext: { _ in
            let ascDate = self.resultsfields.value.sorted(by: {$0.startedAt < $1.startedAt})
            self.resultsfields.accept(ascDate)
        }).disposed(by: disposeBag)
    }
}
```

###参考
[RxSwiftでの実装練習の記録ノート（後編)](https://qiita.com/fumiyasac@github/items/da762ea512484a8291a3)
[RxExample MVVM のその先へ（Fat ViewModel の倒し方）](https://qiita.com/Kuniwak/items/015cddcf37e854713a2e)
Win10(1809)への手動アップデートでうまくいかない

何度やっても、再起動時に勝手に切り戻されるので
調べた情報を、取り急ぎ共有

設定
→アプリ
→「アプリと機能」から「オプション機能の管理」
→「Windows開発者モード」がインストールされていれば削除
xcodebuild:  xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance

# 背景
CocoaPodsにmacOS向けのライブラリを登録しようとした時，`pod lib lint SerialGate.podspec`で`podspec`のvalidationを通そうと思ったら，`xcodebuild:  xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance`と出てしまった．

# 解決策
Terminalで`sudo xcode-select -s /Applications/Xcode.app/Contents/Developer`と打つ
Cygwin + Python3 環境で ansible のインストール (2020/02現在)

2020/02現在、ansibleはCygwinパッケージに含まれているため、以下の情報は不要となった。

~~Cygwinパッケージにはansibleは含まれておらず、pipで入れる必要があるが、ansibleが依存するパッケージは全てCygwinパッケージとして存在している。よって、事前に依存パッケージをインストール後、ansibleをインストールすればよい[^1]。~~

[^1]: Cygwinの場合、依存関係の処理を全てpipにまかせると、PyNaClなどネイティブバイナリを生成するパッケージのビルドで失敗する。

~~なお、ansible(2019/02/13時点での最新は2.7.7)は2.5以降でPython3に対応している[^2]ため、ここではPython3の環境に導入するものとする。~~

[^2]: Python 3 Support: https://docs.ansible.com/ansible/latest/reference_appendices/python_3_support.html

# ~~依存パッケージのインストール~~

~~事前に以下のCygwinパッケージをインストールする。~~

* ~~python3-setuptools~~
* ~~python3-pip~~
* ~~python3-jinja2~~
* ~~python3-markupsafe~~
* ~~python3-yaml~~
* ~~python3-paramiko~~
* ~~python3-cryptography~~
* ~~python3-setuptools~~
* ~~python3-bcrypt~~
* ~~python3-nacl~~

# ~~ansibleのインストール~~

~~上記のパッケージのインストールが完了したら、下記コマンドを実行すればよい。~~

```
pip3 install -v ansible
```
phpの等価演算子

冷静に考えれば分かることなんですが、いちおうメモ残しておきます。

```php
1 == 1;     // => true
"1" == 1;   // => true
null == 0;  // => true
null === 0; // => false
```

感覚的に3つ目、nullと0を比較してtrueになる！？というのが最初は不思議でして。
というか不具合埋めちゃいまして。

「==(イコール2つ)」は等価演算子なので、型を自動変換して比較します。
「===(イコール3つ)」は厳密等価演算子なので、型も含めて同じかどうかを比較します。

なので、nullと0が同じという評価に…。
phpゆるふわ〜
phpの参照渡しの注意点

参照渡し自体が非推奨という話は一旦置いておきますが、参照渡しがちゃんと理解できていなくてちょっとハマりました。

```php
$meats = array('beef', 'pork', 'mutton');

foreach($meats as &$meat){
    $meat = 'so big ' . $meat;
}

foreach($meats as $meat){
    echo($meat);
}

// 'so big beef'
// 'so big pork'
// 'so big pork'
```

配列の最終要素の参照がうまくいきまてん。

##原因
はじめのループを抜けた時点で\$meat変数のポインタは外れていないため、\$meatは\$meats[2]を指したままでした。
そのため、2回目のループでは、以下のようなことが起こっています。

・\$meats[2]に\$meats[0]を代入　→　// \$meats[0] = 'so big beef', \$meats[2] = 'so big beef'
・\$meats[2]に\$meats[1]を代入　→　// \$meats[1] = 'so big pork', \$meats[2] = 'so big pork'
・\$meats[2]に\$meats[2]を代入　→　// \$meats[2] = 'so big pork', \$meats[2] = 'so big pork'

ややこし…。

##解決策
・はじめのループの後で$meat変数の参照を解除(unset）する
・もしくは、2回目のループでは別の変数を使う

```php
$meats = array('beef', 'pork', 'mutton');

foreach($meats as &$meat){
    $meat = 'so big ' . $meat;
}

unset($meat);

foreach($meats as $meat){
    echo($meat);
}

// 'so big beef'
// 'so big pork'
// 'so big mutton'
```
画像処理100本ノックを「Google Colaboratory」で楽々学習

![ 2022-02-21 22.35.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/6f1254bf-0254-9f9e-789d-20e555b01494.png)


# 画像処理100本ノックとは
　以下のような素晴らしい記事を発見しました。

~~https://qiita.com/yoyoyo_/items/2ef53f47f87dcf5d1e14~~ （リンク切れ）

　画像処理を、OpenCV等の高度なライブラリを使わず行うことで、画像処理の理解を深める、非常に有用な練習問題集です。自分も画像処理の基礎を学びなおしたかったので、自己学習のため活用させていただくことにしました。

　ただ、初学者にとってハードルになりそうなのが、環境構築のところです。GitHubのREADMEに丁寧に描かれているのですが、初学者にとっては難易度高く、時間もかかります。また、自宅以外の環境でちょっと学習したいときなどにも不便です。

　そんな手間を解消するために、Googleが提供している環境構築不要・無料でPythonの開発が可能なWebサービス「Google Colaboratory」を使って、画像処理100本ノックが動く環境を構築してみました。

# 「Google Colaboratory」上に画像処理100本ノックの環境を構築
　Google Colaboratory自体で何ができるか、便利な使い方TIPS等に関しては、以下記事参照ください。

https://karaage.hatenadiary.jp/entry/2018/03/21/073000

https://karaage.hatenadiary.jp/entry/2018/12/17/073000


　基本的には、Google Colaboratory（Google Colab）上で画像処理100本ノックのコードがそのまま動くのですが、いくつか気をつけるべきポイントがあるので、それらに関して説明いたします。

　本記事の最後に、実際に演習問題を解いているGoogle Colabのノートブックへのリンクも貼っています（まだやりかけです）。こちらはコピーすればそのまま動きますので、合わせて参考にしてみて下さい。

## 必要なライブラリのインポート
　以下コマンド実行することで、必要なライブラリをインポートします。

```python
import cv2
import matplotlib.pyplot as plt
import numpy as np
```

## 画像の読み込みと表示
　以下コマンドで画像の読み込みと表示を行います。

　skimageを使う方法

```python
from skimage import io
img = io.imread('https://yoyoyo-yo.github.io/Gasyori100knock/dataset/images/imori_256x256.png')

plt.axis('off')
plt.imshow(img)
```

　Open CVを使う方法

```python
!wget https://yoyoyo-yo.github.io/Gasyori100knock/dataset/images/imori_256x256.png

img = cv2.imread('imori_256x256.png')

plt.axis('off')
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
```

　以下のように画像が表示されます。

![ 2022-02-21 22.35.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/6f1254bf-0254-9f9e-789d-20e555b01494.png)



## 画像の保存と読み込みと表示
　一旦画像をファイルに書き出してから読み込んで表示する方法です。

```python
cv2.imwrite("out_img.jpg", img)
out_img = cv2.imread("out_img.jpg")
plt.axis('off')
plt.imshow(cv2.cvtColor(out_img, cv2.COLOR_BGR2RGB))
```

# まとめ
　上記のポイントに注意すれば、画像処理100本ノックをGoogle Colab上で学習できると思います。どの問題も、OpenCVを使えばAPI1つ呼び出して出来てしまうのですが、このように画素レベルで、アルゴリズムを理解しながら手を動かすのは、基礎固めに非常に重要なことだと思います。

　私も、以前[PythonでOpenCVに頼らずNumpy+PILで画像処理のフィルタを1から作って理解する](https://karaage.hatenadiary.jp/entry/2017/07/31/073000)ということをしてみましたが、やっぱり自分で手を動かして実装した内容というのは、理解が深まりますし、自身もつきます。

　100本ノック全部やれば、相当力つきそうなので地道にこなしていきたいと思います。

　以下が、Google Colab上で学習中の画像処理100本ノックのノートブックです。まだ全然途中なので制覇せねば…

[画像処理100本ノック（Google Colab版）途中](https://colab.research.google.com/drive/1oE78uUpA3FUxe5B5skYbP3NB9WoHF9jQ)

　また、写真に興味ある人は、RAW現像をブラウザ上で実行できる以下記事も興味深いのではないかと思います。もしよろしければ参考にしてみて下さい。

https://karaage.hatenadiary.jp/entry/2018/11/07/073000


# 関連ページ
https://qiita.com/karaage0703/items/7b5d54223d06e4b6ef0f

# 変更履歴
- 2022/02/21 Google Colabの画像リンク切れ修正・記事を微修正
- 2020/06/17 関連ページ追記
no implicit conversion of String into Integer の対処について【Ruby】

# 概要
PAYJPを使って支払の処理をするのに、JSONに慣れておらず、またrubyの理解不足でなかなかデータを取り出せなかったのでその備忘録です。
初心者ゆえ何か間違い等ありましたらご指摘くださいませ。。

# 具体例
コントローラーでbinding.pryをして、
customer = Payjp::Customer.createした
カスタマーのカード情報を取り出します。

 pry(#<CreditcardsController>)> customer[:cards]
　　　　　#<Payjp::ListObject:0x3feb68d9adbc> JSON: {
  "count": 1,
  "data": [
    {"id":"ca......
 ],
  "has_more": false,
  "object": "list",
  "url": "/v1/customers/cus_96a3f6019fb2023a6d784...../cards"

customer[:cards][:data]とすると。。
=> [#<Payjp::Card:0x3feb68d83d60 id=car_276ef221460e75b1a*******> JSON: {
  "id": "car_276ef*************",
  "address_city": null,
  "address_line1": null,
  "address_line2": null,
  "address_state": null,
  "address_zip": null,
  "address_zip_check": "unchecked",
  "brand": "Visa",
  "country": null,
  "created": 1550055737,
  "customer": "cus_96a3f6019fb2023a6*********",
  "cvc_check": "passed",
  "exp_month": 10,
  "exp_year": 2020,
  "fingerprint": "e1d8225886e3a7211127d*********",
  "last4": "4242",
  "livemode": false,
  "metadata": {},
  "name": "AAA AAA",
  "object": "card"
}]

ここからカードブランドがvisaてところを取り出したい。
とりあえずcustomer[:cards][:data][:brand]としてみるものの。。。

# TypeError: no implicit conversion of Symbol into Integerとなる際の解決法

TypeError: no implicit conversion of Symbol into Integerとなる。

ここでkeyがシンボルではなく文字列であることに気づいた！！

初歩的ミス。。。

customer[:cards][:data]["brand"]とすると。。。

TypeError: no implicit conversion of String into Intege

まだダメ。。。

しかし！よく見たらdataの後ろに"["があり、これは配列を意味するので、
このようにして無事取り出せました。

customer[:cards][:data][0]["brand"]
=> "Visa"

#　参考にした記事
https://qiita.com/QUANON/items/169c73425a6bc50dee51
https://stackoverflow.com/questions/20790499/no-implicit-conversion-of-string-into-integer-typeerror
【swift4】【NSLayoutAnchor】 設定の順番とtopAnchorの％指定方法


少し、突っかかって悩んだのと、メモとして残しておきたいのでまとめておきます。


[Auto Layoutをコードで書いてみた][link]
[link]:https://qiita.com/dddisk/items/8001598ea7951bcdcc30


設定出来るConstraintsとか、translatesAutoresizingMaskIntoConstraintsとは何かについては基本的にこの記事が詳しかったので、省きます。

# フレキシブルにラベル等を表示したい
- View上に、フレキシブルにラベルなんかを表示したい。(要らないときは表示したくない、スケーリングもしたい)

　要らないときは、という部分についてはコードで生成すれば解決、ということで特に迷いませんでした。
　スケーリングについてはEqualHeightsとかその手のものを利用してストーリーボード上で既に出来ていましたし、NSLayoutAnchorにすぐに辿り着いたのでそこらへんもおおよそ問題ありませんでした。
　ただ、幾つか引っかかったのが、Constraints設定とViewへのオブジェクト追加の順番と、上端や左端の％値での設定、Autorisizingのフラグ設定でした。

# 生成〜設定の順序

```swift:サンプル

    // ラベルを生成
    let label = UILabel()
    label.text = "やらないか"
            
    // fontのオートシュリンクの設定
    label.adjustsFontSizeToFitWidth = true
    label.minimumScaleFactor = 0.3
            
    // font
    if let customFont = UIFont(name: "Bradley Hand", size: UIFont.labelFontSize) {
        label.font = UIFontMetrics(forTextStyle: .body).scaledFont(for: customFont)
    } else {
        label.font = UIFont.preferredFont(forTextStyle: .body)
    }

    // viewにラベルを追加
    // constraintsよりも前に追加する必要がある
    view.addSubview(labNone)

    // AutoresizingMaskの設定値を使うとバッティングするのでフラグをfalseにする
    label.translatesAutoresizingMaskIntoConstraints = false
    // constraints
    // 大本のViewとX軸中心合わせ
    label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    // 大本のViewとY軸合わせ。
    // 1/2を3/8にしたい（上げたい）
    let pos = (view.frame.size.height / 8.0) * -1
    label.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: pos).isActive = true
    // 大本のViewと幅合わせ。view比60%で設定
    label.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.6).isActive = true
    // 大本のViewと高さ合わせ。view比8%で設定
    label.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.08).isActive = true

```

- ラベル等の生成
- フォント等の設定
- Viewに登録
- translatesAutoresizingMaskIntoConstraintsをfalse
- Constraintsの設定

の順番で。
　Viewに登録してからConstraintsを設定しないと落ちますし、translatesAutoresizingMaskIntoConstraintsフラグがデフォルトのtrueのままだと競合して表示できません。
なんでエラーが出るの？Constraints揃ってない？？とか小一時間悩みました。

translatesAutoresizingMaskIntoConstraintsについてはViewの登録の前後どちらかでないと駄目なのかでどうかまでは見てません。


# 位置の設定で固定値を使いたくない

デバイスごとの位置調整の問題でViewやラベルのサイズなんかはViewとEqualHeightなんかを駆使してmultipliterで％指定したりするわけですが、leadingAnchor（左端）や、topAnchor（上端）を設定しようと思ってAutoLayoutのUIでやろうとすると固定値を入れる羽目になるわけで。
　コードで打てばなんとかなるのかな、と思いましたが、viewのheightAnchorやwidthAnchorからすぐに値を取り出せなくて少し悩みました。

```swift
    // 大本のViewとY軸中心合わせ.
    // 1/2を3/8にしたい（上げたい）
    let pos = (view.frame.size.height / 8.0) * -1
    label.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: pos).isActive = true
```

上のソースのここでしれっとやってるのですが、
view.frame.size.heightでviewのフレームの高さの数値が取れるので、それで計算してしまえばいけます。widthもあるよ！

topAnchor、leadingAnchorの場合はこんな感じ、です。

```swift
    // Viewの上端から10％の位置を指定
    let posTop = view.frame.size.height * 0.1
    label.topAnchor.constraint(equalTo: view.topAnchor, constant: posTop).isActive = true
    // viewの幅の5％の位置を指定
    let posLead = view.frame.size.width * 0.05
    label.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: posLead).isActive = true
```
diff コマンド

# diff
## 使い方
```
$ diff -r -q --strip-trailing-cr [Target-A] [Target-B]
```

## オプション
|オプション|内容|
|:-:|:--|
|-q|差分のあるディレクトリ名またはファイル名を出力|
|-r|再帰的に比較|
|--strip-trailing-cr|改行コードを無視|
tableの「border」がIEとFireFoxで効かない時

tableのボーダーを指定したかったのですが、「border」がChromeでは表示されていましたが、FireFoxとIEでは表示されない現象がありました。
IEはいいとして、FireFoxで表示崩れがあるのはちょっと困りもの。

##原因
**tableに「background-color」と「border」と「position:relative」を指定していると、
FireFoxとIEでは「border」より「background-color」が優先されtdのborderが消える**
そうです（おそらく仕様…ちょっと引用元忘れちゃいました）。


##対策1：「position: static;」を付ける

```
.stripe-table td {
  position: static;
  border-bottom: 1px solid #ebeef5;
}
```

この時、自分で意図して「position: relative;」を使ってたわけではないんですけど、elementUI等のUIコンポーネントを使っていると意図しないプロパティが指定されていることがあります。
なので、ウェブコンソールで隅々までスタイルチェックして、色々なプロパティを疑ってみる必要があるなー、と勉強になりました。

##対策2：IEを使わない
推奨
Unity-WindowsPlayerで実行フォルダのパスを取得する

Unity2018.2.21fで確認。

少し検索したところ思った以上にこの情報が見つからなかったのでメモがてら。
フリーソフトでよくある、setting.iniやらsetting.jsonをEXEを実行した場所に置きたい人向け。

```c#
		// Unityエディタ上ではStreamingAssetsのパスにする
#if UNITY_EDITOR
		FilePath = Directory.GetCurrentDirectory();//Editor上では普通にカレントディレクトリを確認
#else
		FilePath = AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\');//EXEを実行したカレントディレクトリ (ショートカット等でカレントディレクトリが変わるのでこの方式で)
#endif
		Debug.Log(FilePath);
```

参考：
http://var.blog.jp/archives/66978870.html
TypeScript で nullable な Array を non-null に filter する

`nullable` な `Array` を non-`null` に `filter` するとき
ふつうにこう書いたとして:

```typescript
const nullables: (number | null)[] = [1, 2, 3, null, 4];
const nonNullables: number[] = nullables.filter(
    (item: number | null) => item !== null
);
```

実質的には `Array.prototype.filter` 内で `item !== null` でフィルタしているので
`nonNullables` の要素はすべて non-`null` であるはずですが、

> Type '(number | null)[]' is not assignable to type 'number[]'.
> Type 'number | null' is not assignable to type 'number'.
> Type 'null' is not assignable to type 'number'.

実際のところ、`filter` の返り値は依然 `nullable` として扱われてしまい、
エラーになってしまいます。

Type Predicate (型述語) を使う
---

Type Predicate を返すような関数 (Type Guard) を定義することで、
あるスコープでの型を保証すれば大丈夫です:

```typescript
function notNull<T>(item: T | null): item is T {
    return item !== null;
}
const nonNullables: number[] = nullables.filter(notNull);
// OK!
```

あるいは

```typescript
const nonNullables: number[] = nullables.filter(
    (item: number | null): item is number => item !== null
);
// OK!
```

`null` も通す
---

ただし、ヒューマンエラーで `null` を通してしまっても
それを静的に検出はされないことに気づきました:

```typescript

function notNull<T>(item: T | null): item is T {
    return item === null;
}
const nonNullables: number[] = nullables.filter(notNull);
// OK! (であってほしくない)
```

[Advanced Types - User-Defined Type Guards](https://www.typescriptlang.org/docs/handbook/advanced-types.html#user-defined-type-guards) では

> A type guard is some expression that performs a runtime check that guarantees the type in some scope.

と書かれていますが、特に実行時にもチェックされてないように思います。
なぜだろう。
解決策があれば教えてください。
C/C++  の char は 3種類ある

## 3種類の `char`


[C/C++ の char が取る値の範囲に注意](https://qiita.com/kojiohta/items/ec0c67b9991022e878f1)  に書いたように、`char` は処理系によって符号つきだったり符号なしだったりします。
…わざわざ日本語で表現しているところがポイントで、これを「 `char` は処理系によって `signed char` だったり `unsigned char` だったりします」というと嘘になってしまいます。

実は `char` は符号つきだろうと符号なしだろうと、 `signed char` や  `unsigned char` とは別の型なのです。
つまり `char` の仲間には

- `char`
- `signed char`
- `unsigned char`

の3種類の型があることになります。

これに対して、`int` は `signed int` と同じ型なので `int` / `unsigned int` の 2種類です。わかりにくい…。

## オーバーロード

これは C++ のオーバーロードで別の型として扱われることでも確認できます。

```C++
#include <cstdio>

void func(char) {
  puts("char");
}
void func(unsigned char) {
  puts("unsigned char");
}
void func(signed char) {
  puts("signed char");
}

int main() {
  char c = 0;
  unsigned char uc = 0;
  signed char sc = 0;

  func(c);
  func(uc);
  func(sc);
}
```
 
結果は

```
char
unsigned char
signed char
```
となりました。

ちなみに同じことを `int` でやると以下のエラーになります。 `int` と `signed int` が同じ型であることがわかりますね。

```
overload.cc: In function ‘void func(int)’:
overload.cc:9:6: error: redefinition of ‘void func(int)’
 void func(signed int) {
      ^~~~
overload.cc:3:6: note: ‘void func(int)’ previously defined here
 void func(int) {
      ^~~~
```

## それで  ?

特にこれを積極的に使うケースは思いつきませんが、いつかよくわからない挙動でハマったときに役に立つことがあるかもしれません。(C++ のオーバーロードとかかテンプレートあたりかな…)
何か面白い事例があったら教えてください。
C/C++ の char が取る値の範囲に注意

## はじめに

C プラグラマならわかっていることとは思いますし、いまさらな内容ではありますが、たまたま静的解析ツールで指摘された内容が面白かったので一般化して書いてみます。

## まずはサンプルコード

```C
#include <stdio.h>

#define VALUE 255

int main(void) {
  char c = VALUE;
  if (c == VALUE) {
    puts("TRUE");
  } else {
    puts("FALSE");
  }
  return 0;
}
```
さてこのプログラムを実行すると何が出力されるでしょうか。

手元の環境 (Ubuntu 16.04LTS, `gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609`) では以下のようになりました。

```
FALSE
```

全く直感的ではないですね。

## char は符号つきか符号なしかは処理系定義

char が符号つきか符号なしかは処理系によって変わります。
(`int` や `long` が常に符号つきなのとは違います。わかりにくい…)

典型的には

- 符号つき: [-128, 127]
- 符号なし: [0, 255]
 
の値を取ることになります。

上記の環境では「符号つき」でした。よって、 `255` は表現できません。

```c

char c = VALUE;
```
これによって `c` の値は (8 bit かつ2の補数表現の場合)  `-1` になります。

```c

  if (c == VALUE) {
```
ここが問題です。左辺は  `char`, 右辺は `int` です。
C の整数拡張のルールにより、`c` は **`int` に変換され**ます。すなわち `int` の `-1` です。
右辺のはそのままで `int` の `255`。
よってこの条件式は偽となります。

これだけ見たら難しい話ではないのですが、この `VALUE` を定義しているところと実際に使っているところが離れていたりするとかなり追いにくい問題になるでしょう。

### ちなみに

gcc だと  `-fsigned-char` / `-funsigned-char` という [オプション](https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#index-fsigned-char) があり、挙動を切り替えることができます。

上記プログラムも `-funsigned-char` をつけてコンパイルすると `TRUE` の結果が得られます。

## どうするのがよいの ?

文字や文字列ではなく、数値を 8bit で扱いたいときは `int8_t` / `uint8_t`、少なくとも `sigined char` / `unsigned char` を使い、 `char` は使わないほうがよいでしょう。
また、特に C++ であれば定数はプリプロセッサマクロではなく型つきの `const` (`constexpr`) 定数として定義したほうが余計な落とし穴に落ちにくいかと思います。
「pointer-events: none;」がIEで効かない時

aタグに「pointer-events: none;」を指定してリンクを無効化しようとしましたが、IEではCSSが効かず普通に押下できてしまいました。

## 原因
IE11とEdgeでは、aタグのdisplayの値がinline-blockかblock以外だと「pointer-events: none;」が効きません。
（バグ？）

## 対策その1：「display: inline-block;」を指定する

```
a.disabled
{
    display: inline-block;
    pointer-events: none;
}
```

ただし、あくまで「pointer-events: none;」が発火しないだけなので、タブ等でカーソルを合わせるとクリックできてしまいます。
本気でリンクをオフにしたい場合は、aタグ以外で表現するか、aタグを使うならばサーバ側での制御が必須です。

## 対策その2：IEを使わない
推奨
Swiftで「 / 」が入った文字列を持つStructをJSON化して送ろうとした際に２重にエスケープされてしまって困った

## 読む前に
以下の内容ですが、私のJSONに対する現状の知識不足が原因でした。
JSONのエスケープ対象として`/`が含まれており、JSONとして出力した際に`\/`となるのは正しい挙動となります。
2重エスケープされていたのは`" {"data" : "aa\\/bbb"}"`と `""`で囲われていたのが原因でした。
私と同様に上記を把握しておらず、解決方法を探した方が見つけられるように本記事は削除せずそのまま残すことにします。

##はじめに
EncodableのStructをencodeしdataに変換、 String(data: Data, encoding: String.Encoding)を使って文字列にするといった処理を行っていました。
その際にEscape周りで意外な挙動があったので記載します。 

##検証環境
以下の環境を使用しています。

* macOS High Sierra Version 10.14.2
* Xcode Version 10.1.0
* Swift Version 4.2

##事象

```Swift
struct Debug: Codable {
    let date = "[aaa/bbb]" // / が含まれるように文字列を定義
}

let encoder = JSONEncoder()
let data = try! encoder.encode(Debug())
let string = String(data: data, encoding: .utf8) // DataからJSON文字列生成
print(string)
```
上記のコードを実行した際に、`{"date":"[aaa/bbb]"}`の文字列が取得できることを期待しました。
しかし実際に取得できた文字列は`{"date":"[aaa\/bbb]"}`になります。
タイトルの通り `/`が2重にエスケープされてしまい `\\/`となった結果、文字列化した際に`\/`となり`\`が余分につくという事象が発生しました。
stringをForced Unwrapしなかった場合は `Optional("{\"date\":\"[aaa\\/bbb]\"}")`となり、2重にエスケープされていることがわかります。

## 対応
以下のことを試しました。

* `/`を`\u{002F}`に変換する。(`\u{002F}`は`/`のUnicodeコード表現です）
* CodableのJSONEncoderではなくJSONSerialization経由で文字列化する
* String(data: Data, eocoding: String.Encoding)のencodingパラメータを変える

ただ、上記の方法ではどれも解決に至りませんでした。

最終的にとった方法は以下になります。`\\/`を`/`に置き換えました。
これで`{"date":"[aaa/bbb]"}`という期待したとおりの文字列を取得することができました。

```Swift
let string = String(data: data, encoding: .utf8)?.replacingOccurrences(of: "\\/", with: "/")
```


##最後に
正直にいって本記事の対応はあまり良いと思えません。このあたり知見がある方や、このようにしたほうがいいのではないか等ありましたらコメントいただけますと幸いです。
awaitは極力使用を避けたいもの

前回の記事では、`await`を使うことで別の処理に実行権を譲れることと、`await`を使うとプログラムが複雑になることを示しました。

プログラムが複雑になることはできるだけ避けたいのですが、JavaScriptはシングルスレッドであるため、`await`の使用はなかなか避けることはできません。というのも、たとえば10秒以上かかる処理があったときに、`await`未使用だと10秒以上フリーズするからです。

ということで、長い時間かかる処理を実装するときは、ところどころに`await`を入れる必要があります。

しかし、今実装している処理が時間のかかる処理かどうかは、実際に動かしてみないとわかりません。ここでいう「時間のかかる処理」は「相対的に」という意味合いが強いです。

たとえば、今実装している処理にかかる時間の割合が全体の90%の場合、この処理に`await`を取り入れることで大きな改善が望めます。しかし、もしこの割合が90%でなく1%の場合、そこに`await`を取り入れることにほとんど意味はありません。確かに`await`を使うことでフリーズの体感時間は減りますが、その代りにプログラムの複雑さが増します。残り99%はまだフリーズしたままですから、1%の処理に`await`を取り入れることで得られるものは「フリーズの体感時間の減少」＜「プログラムの複雑さ」になってしまいます。

## まとめ

1. まずは`await`を使わずに実装する
2. 各処理にかかる時間を測定し、割合の大きい順に並べる
3. 割合の大きい処理から`await`を取り入れていく

この順序で実装していくことが理想です。
メモ：Railsで簡単にnot exists的なクエリを書くgem

この記事は
===

* Railsで簡単にnot exists的なことやりたくてgem発見したのでメモです


やりたかったこと
===

* 具体例）
    * ```Country => State => City```とアソシエーションがあったとします
    * ```City#rate```には0,1,2という３種類の値が入っているとします
    * ここで全ての```City```の```rate```が```2```の```Country```だけを取得したかったです

調べると
===

* ```find_by_sql```つかえ！とか```Arel```つかえ！ばかり出てきてつらみ

where_exists gem
===

* そこはRuby/Railsのことですから、[where_exists](https://github.com/EugZol/where_exists)というgemがありました

使い方
===

* ```Country```に```has_many :cities, through: states```を書いておきます
* で、こんな感じでやりたいことができます

```ruby
Country.where_exists(:cities, rate: 2).where_not_exists(:cities, rate: [0, 1])
```

* なんでexists/not_existsを2回かかなきゃいかんのかは納得行ってません
* あと発行されるSQLが結構グチャグチャしてて、なんかすごく無駄なことやってそう

終わりに
===

* こういうのもうちょっと洗練させて標準に入れ込んで欲しい
docker-compose で rails s したときに "A server is already running." が出てサーバ起動できない

dockerについて学びはじめ、とりあえずdockerでrails開発できるようにしてみようといじいじしていた。
その中で、`rails s`しても**サーバが起動しない**問題が発生した。
これを解決したので簡単にメモ。  

## 経緯　　
docker-composeを使い、railsとpostgreSQLをそれぞれ立ち上げ、railsアプリの開発環境を構築しようとしていた。  
  
```:dockerfile  
FROM ruby:2.4.1

ENV LANG C.UTF-8
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp  
```
  
```docker-compose.yml  
version: "3"
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

```  


## 問題  
docker-composeで`rails s`したときに、`A server is already running.`と出て、サーバが起動しない。  
  
```  
A server is already running. Check /myapp/tmp/pids/server.pid.  
```  
  
## 原因  
ログにも書いてあるが、どうやら**server.pid**が原因のよう。  
  
  
## 解決策  
`rails s`の前に**server.pid**を削除するようなコマンドを追加。  
  
具体的には、docker-compose.ymlに以下のような修正を加えた。    

```  
command: /bin/sh -c "rm -f /myapp/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"  
```

これで無事、`docker-compose up`でサーバが起動するようになった。
  
  
### メモ    
（全然関係ないけど）
markdownでシンタックスハイライトで拡張子のないファイル名をバッククォートの右に書いても表示されない。  
<img width="1032" alt="スクリーンショット 2019-02-13 19.50.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/265038/269c45e3-bb46-f658-0719-061255d3bc7a.png">

→ ファイル名の左に:を付け足すと表示されるようになる。  
<img width="1032" alt="スクリーンショット 2019-02-13 19.50.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/265038/230a7c61-44b1-d47a-052c-0808b14c440d.png">
ハッシュのキーの名前を変えたい

# ハッシュのキーをリネームしたい
ある理由からハッシュのキーをリネームしたかったので、
その時に使用したコードを記述しておきます。

新しいキーに古いキーのバリューを渡してあげて、
古いキーを削除することでリネームしています。

```
ハッシュ[:新しいキー名] = ハッシュ.delete(:古いキー名)
```
[WordPress] Gutenberg（ブロックエディタ）にカスタムブロックを追加（Block Lab利用）

2022年9月1日 追記
記事中で紹介の Block Lab プラグインが **2022年2月3日に停止** されたので、この記事の内容でカスタムブロックの作成はできません。

# やりたいこと
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/18348/2c5e0243-890b-44de-23ec-59e485f0c8dd.png)

（見本はダサいが）カスタムブロックを追加してHTMLを触らずとも画像や複数のDOMが組み合わさったパーツを本文内に入れたい。 **簡単に。**

※自作テーマなどで自作のカスタムブロックを使いたい人向け。すでに出来上がっているカスタムブロックを追加したい人は別のプラグインを探しましょう。

# プラグインを使おう
[Block Lab](https://wordpress.org/plugins/block-lab/)

* 管理画面からカスタムブロックの設定と内部のフィールドを設定
* テーマにカスタムブロックのテンプレートを作っておく
* プラグインがよしなにカスタムブロックの追加をしてくれる

サイト：https://getblocklab.com/
ドキュメント：https://github.com/getblocklab/block-lab/wiki

## 管理画面からカスタムブロックの設定と内部のフィールドを設定

* タイトル：カスタムブロックの名前
* Slug：自動で入る。ユニークな名前にしておく
* Icon：お好みで
* Category：ブロックエディタで挿入する時のカテゴリー

![スクリーンショット 2019-02-13 16.45.47.png](https://qiita-image-store.s3.amazonaws.com/0/18348/b1dcdbfc-51e0-3b27-c6a2-fbe59d80efa5.png)

* Field Label：カスタムブロック内のフィールドの名前
* Field Name：自動で入る。カスタムブロックのテンプレートで使うのでユニークな名前にしておく
* Filed Type：画像、テキスト、テキストエリアなど。[詳しくはドキュメントを見よう](https://github.com/getblocklab/block-lab/wiki/Field-Types)
* Filed Location：ブロックエディタ内で編集するか、サイドバーで編集するか

他はお好みで
![スクリーンショット 2019-02-13 16.45.54.png](https://qiita-image-store.s3.amazonaws.com/0/18348/062a5857-c68e-7b93-70fb-f64c04750b48.png)

保存すると、テーマ内のどこにどのような名前でカスタムブロックのテンプレートファイルを保存すれば良いか表示されます

## テーマにカスタムブロックのテンプレートを作っておく
ルールは使用するテーマフォルダ内に `blocks` フォルダを作成して、そこにテンプレートファイル（PHP）を保存します。

```
/my-theme/
　└ /blocks/
　　　　　　　├ block-{block name}.php // 表示用
　　　　　　　└ preview-{block name}.php // エディタで編集してる時用
```

中身はこんな感じ

```php:block-author-info.php
<div class="author-info">
<?php
    $image = block_field( 'author-image', false ); // 要素の有無の判定できる
    if ( ! empty( $image ) ) {
        echo '<img src="' . $image . '" alt="' . block_field( 'author-name', false ) . '" />' . "\n";
    }
?>
<h3><?php block_field( 'author-name' ); ?></h3>
<p>
<?php
    $author_information = block_value( 'author-information' );
    echo nl2br($author_information); // textarea は自動で改行されない
?>
</p>
</div>
```

エディタで編集してる時にCSSも合わせたいときは `style-editor.css` を作ってよしなにCSS書いてください。

## プラグインがよしなにカスタムブロックの追加をしてくれる

ブロック挿入時
![スクリーンショット 2019-02-13 16.49.36.png](https://qiita-image-store.s3.amazonaws.com/0/18348/8c4e69b5-9e4f-9d82-d616-6d6fbaafb6c2.png)

挿入された後
![スクリーンショット 2019-02-13 17.37.01.png](https://qiita-image-store.s3.amazonaws.com/0/18348/69af2e92-b1ad-51ca-c4ec-fa8b9094206a.png)

現場からは以上です。
nelder-mead法

[nelder-mead法](https://ja.wikipedia.org/wiki/%E3%83%8D%E3%83%AB%E3%83%80%E3%83%BC%E2%80%93%E3%83%9F%E3%83%BC%E3%83%89%E6%B3%95)のアルゴリズム．

[画像認識系深層学習のハイパパラメータチューニングで定評あり．](https://ipsjcva.springeropen.com/track/pdf/10.1186/s41074-017-0030-7)
Nelder-Mead法は単体をパタパタと折り返すことで最適解を探索するアルゴリズム．

後々，詳細を追加していきます．．．

```py
import numpy as np
import random

class nelder_mead():
	def __init__(
		self, 
		boundaries, # type: (np.ndarray)
		iteration, # type: int
		func, # type: Callable[[int], int]
		coef = {"r": 1.0, "ic": - 0.5, "oc": 0.5, "e": 2.0, "s": 0.5}, # type: dict 
		):

		self.func = func
		self.bdrys = boundaries
		self.coef = coef
		self.itr = iteration
		n_dim = len(boundaries)
		
		self.y = np.array([[random.random() * (b[1] - b[0]) + b[0] for b in boundaries] 
			for j in range(n_dim + 1)])
		self.f = np.array([self.F(y) for y in self.y])
		self.yc = None
		self.storage = {"r": None, "ic": None, "oc": None, "e": None, "s": None}

	def order_by(self):
		order = np.argsort(self.f)

		self.y = self.y[order]
		self.f = self.f[order]

	def centroid(self):
		self.storage = {"r": None, "ic": None, "oc": None, "e": None, "s": None}
		self.order_by()
		self.yc = self.y[:-1].mean(axis=0)

	def reflect(self):
		yr = self.yc + self.coef["r"] * (self.yc - self.y[-1])
		self.storage["r"] = yr

		return self.F(yr)

	def expand(self):
		ye = self.yc + self.coef["e"] * (self.yc - self.y[-1])
		self.storage["e"] = ye

		return self.F(ye)

	def inside_contract(self):
		yic = self.yc + self.coef["ic"] * (self.yc - self.y[-1])
		self.storage["ic"] = yic

		return self.F(yic)

	def outside_contract(self):
		yoc = self.yc + self.coef["oc"] * (self.yc - self.y[-1])
		self.storage["oc"] = yoc

		return self.F(yoc)

	def shrink(self):
		for i in range(1, len(self.y)):
			self.y[i] = self.y[0] + self.coef["s"] * (self.y[i] - self.y[0])
			self.f[i] = self.F(self.y[i])

	def F(self, y):
		if not self.out_of_boundary(y):
			return self.func(y)
		else:
			return 1000000

	def out_of_boundary(self, y):
		for yi, b in zip(y, self.bdrys):
			if b[0] <= yi <= b[1]:
				pass
			else:
				return True

		return False

	def search(self):
		for t in range(self.itr):

			self.centroid()
			fr = self.reflect()

			if self.f[0] <= fr < self.f[-2]:
			
				self.y[-1] = self.storage["r"]
				self.f[-1] = fr
			
			elif fr < self.f[0]:
			
				fe = self.expand()
			
				if fe < fr:
					self.y[-1] = self.storage["e"]
					self.f[-1] = fe
			
				else:
					self.y[-1] = self.storage["r"]
					self.f[-1] = fr
			
			elif self.f[-2] <= fr < self.f[-1]:
			
				foc = self.outside_contract()
			
				if foc <= fr:
					self.y[-1] = self.storage["oc"]
					self.f[-1] = foc
			
				else:
					self.shrink()
			
			elif self.f[-1] <= fr:
			
				fic = self.inside_contract()
			
				if fic < self.f[-1]:
					self.y[-1] = self.storage["ic"]
					self.f[-1] = fic
			
				else:
					self.shrink()
```
サクラエディタでコメントアウトするマクロ

#サクラエディタの話
社内研修で真っ先に触れたサクラエディタ。
それまでExcelのVBAくらいしか触れていなかったため、「すごい！ Ctrl+ホイール対応してる！！ 色分けできる！！！」とかそういう感動の仕方をしていた。
そして今に至っても(業務上の都合でSJISを捨てられないため)ネイティブSJIS対応の軽量なエディタとして愛用し続けている。殴っても壊れない頑丈な道具って大切。石器時代を生き抜こう。
#本題
コメントアウト/アンコメントのマクロが見当たらなかった[^1]ので作った。
追記：[普通にあった。](http://sakura.qp.land.to/?Macro%2F%C5%EA%B9%C6%2F196)

C/C++用のつもりで作ったが、単に行頭に文字列を追加/削除するだけなので言語によっては変更すれば普通に使える。
ただし、とある事情(`//`コメントの末尾が2byte文字だとバグる虚弱妹系組込コンパイラの存在)により、正規表現で見つけた2byte文字の末尾に`.`を追加している。これはアンコメントしても戻さないため、コメント以外の変数名等で2byte文字を利用する文化圏の場合は該当部分を削除した方が良い。

今のところは`Ctrl + Shift + F6`でコメントアウト、`Ctrl + Shift + F7`でアンコメントを割り当てている。他のエディタとの共通性が無いのでそろそろ入れ替えようかとは思っている。

```javascript:commentin.js
/*コメントアウト(末尾2Byte文字対応)*/
function c_comment(){
	if(IsTextSelected()){
		//選択範囲に含まれる行を全てコメントアウト.
		var linFrm = Editor.GetSelectLineFrom();
		var linEnd = Editor.GetSelectLineTo();
		for( var buf = linFrm; buf <= linEnd; buf++){
			Editor.Jump(buf);
			Editor.GoLineTop(1);
			Editor.InsText("//");
			//ここから2byte対応.
			Editor.GoLineEnd(1);
			Editor.Left_Sel();
			var get = Editor.GetSelectedString(0);
			if(get.match(/^[^\x01-\x7E\xA1-\xDF]+$/)){
				Editor.GoLineEnd(1);
				Editor.InsText(".");
			}
			//ここまで.
		}
		Editor.Jump(linFrm);
		Editor.SelectLine(0);
		for( var buf = linFrm; buf < linEnd; buf++){
			Editor.Down_Sel();
		}
		if(linEnd != Editor.GetLineCount(0)){
			Editor.Left_Sel();
		}else{
			Editor.GoLineEnd_Sel(0);
		}
	}else{
		//選択範囲が無い場合, カーソル行をコメントアウト.
		Editor.GoLineTop(1);
		Editor.InsText("//");
		//ここから2byte対応.
		Editor.GoLineEnd(1);
		Editor.Left_Sel();
		var get = Editor.GetSelectedString(0);
		if(get.match(/^[^\x01-\x7E\xA1-\xDF]+$/)){
			Editor.GoLineEnd(1);
			Editor.InsText(".");
		}
		//ここまで.
		Editor.SelectLine(0);
		Editor.Left_Sel();
	}
}
c_comment();
```

```javascript:uncomment.js
/*コメントアウトを戻す*/
function c_uncomment(){
	if(IsTextSelected()){
		//選択範囲に含まれる行の先頭に"//"が存在すればトルツメ.
		var linFrm = Editor.GetSelectLineFrom();
		var linEnd = Editor.GetSelectLineTo();
		for( var buf = linFrm; buf <= linEnd; buf++){
			Editor.Jump(buf);
			Editor.GoLineTop(1);
			Editor.Right_Sel();
			Editor.Right_Sel();
			if(Editor.GetSelectedString(0)=="//"){
				Editor.DeleteBack();
			}
		}
		Editor.Jump(linFrm);
		Editor.SelectLine(0);
		for( var buf = linFrm; buf < linEnd; buf++){
			Editor.Down_Sel();
		}
		if(linEnd != Editor.GetLineCount(0)){
			Editor.Left_Sel();
		}else{
			Editor.GoLineEnd_Sel(0);
		}
	}else{
		//カーソル行の先頭に"//"が存在すればトルツメ.
		Editor.GoLineTop(1);
		Editor.Right_Sel();
		Editor.Right_Sel();
		if(Editor.GetSelectedString(0)=="//"){
			Editor.DeleteBack();
		}
		Editor.SelectLine(0);
		Editor.Left_Sel();
	}
}
c_uncomment();
```
例によってJavaScriptのことを全く理解せずに書いているのでたぶんツッコミどころがある。適宜マサカリを頂ければ幸いです。

---
###以下日記
プログラミングを始めて1年半ほど経つが、未だにサクラエディタから離れられていない。一時期Sublime3を利用していたが、100回に1回ほどプラグインがバグってSJISの日本語コメントが異次元に吸い込まれたので利用を断念した。おのれSJIS。
最近はVSCordやAtomを恐る恐る触っている。高機能かつ拡張機能が豊富で非常に便利だが、悲しいかなユーザ側(私)の技量と知識量が足りていない。何らかのプラグインを自作できるようになれば十分使えると思うのだが……。
ただ、サクラエディタはひたすら軽く安定した動作を見せてくれる。またGREP時の挙動やフォントのレンダリングも私好みであるため、まだまだ使い続けたい良エディタだと感じる。~~何よりSJISの呪縛から逃れるまではバックアップ用に残しておかざるを得ない。~~

[^1]: 2017/08時点。もしかしたらどこかに存在しているかもしれない→普通にあったわごめん
phpコマンドのオプションだけでvendor/autoload.phpをrequireした状態にしておく小技


次の2つのファイルがあるとき、script.phpに`require 'vendor/autoload.php';`を書き加えたりせずに`vendor/autoload.php`が読み込まれた状態にする小技です。

* script.php
* vendor/autoload.php

```bash
php -d auto_prepend_file=vendor/autoload.php script.php
```
【rails5】database.ymlをgitの管理下から外す方法

#database.ymlをgitの管理下から外す方法

git ignoreファイルの開き方

```
vi .gitignore
普段見えない。
```

##1,リポジトリにアップしないようにする
gitignore内に

```
Ignore uploaded files in development
/config/database.ymlと記載
```

##2,一度gitの管理下に入れてれば除外する
```
configディレクトリまでいって打つ事
git rm --cached database.yml
```

この２つやってからコミットしてプッシュする。

リポジトリを確認すると、database.ymlはプッシュされていない。
Windows・NeoVim・OniでもVimtutorしたい

# WindowsのGitBashからVimtutor

Git Bashには`vimtutor`コマンドが付属しています。日本語対応なので英語が苦手な人でも大丈夫です。

# NeoVim・OniでVimtutor

それぞれ起動してから`:Tutor`コマンドを打つとVimtutorが起動します。英語しかないのでそこが残念。
NeoVimの場合、コマンドから

```bash
nvim +Tutor
nvim -c Tutor
```

でも起動できます。どちらでも構いません。`Tutor`の最初の`T`は大文字でなければなりません。