OmniAICreator/Qiita-1.07M huggingface dataset:
(a==1&&a==2&&a==3)を常にtrueにするStackOverflowの問題を解いたQiita記事まとめ

[(a == 1 && a == 2 && a == 3) を常に真にできますか？](https://qiita.com/Morichan/items/4894d7d92ecab7a3afd8)に対して、

[（ａ＝＝１＆＆ａ＝＝２＆＆ａ＝＝３）をtrueにするRubyスクリプト](https://qiita.com/aimof/items/bd4acfd310bcabff1538)というひどい記事を書いてしまったので、償いがてらこの問題に挑戦した記事をメモっときます。言語が多様なので動作確認はしてません。順番は適当です。

コードゴルフ的には私の書いた32byteはかなりいい線いっている気がする。

編集リクエストがあれば更新します。

## 解けたもの

* [(a == 1 && a == 2 && a == 3) を常に真にできますか？](https://qiita.com/Morichan/items/4894d7d92ecab7a3afd8)
* [a == 1 && a == 2 && a == 3がtrueになるRubyスクリプト](https://qiita.com/shiozaki/items/53c66cea655bef08b9ea)
* [a == 1 && a == 2 && a == 3がtrueになるScalaスクリプト](https://qiita.com/ryota-sakamoto/items/2ee319dac490698841d3)
* [a == 1 and a == 2 and a == 3 がTrueになるPythonスクリプト](https://qiita.com/yteshi/items/b4be995fccbf0769a47d)
* [C言語でもa == 1 && a == 2 && a == 3をtrueにしてみたい](https://qiita.com/shiozaki/items/fe3ee5a4775e5ca19f20)
* [Haskell で (a ==1 && a== 2 && a==3) を真にする](https://qiita.com/cohei/items/f4345f6df69d613650c3)
* [(a == 1 && a == 2 && a == 3) を常に真にする C#編 ～プロパティのgetterに副作用を持たせてはいけない。～](https://qiita.com/Marimoiro/items/983a966a01da23e2fdea)
* [C++でもコンパイル時にa == 1 && a == 2 && a == 3をtrueにしてみたい](https://qiita.com/yumetodo/items/bbeed7258cd22fd8bb7c#_reference-ea7e1bd1edf3a0d8c119)
* [Python2で(a == 1 and a == 2 and a == 3) を常にTrueと等しくする魔法の一文(演算子はいじらない系)(ソース4行)](https://qiita.com/aimof/items/abc8a5859c928b198dfc)
* [(a == 1 && a == 2 && a == 3)を常にtrueにする系コードゴルフ(Python2: 37byte or 32byte)](https://qiita.com/aimof/items/6d333944a28d36b9d932)
* [Swiftで(a==1&&a==2&&a==3)を常にtrueにする](https://qiita.com/Morichan/items/cc4e426b5128fac4a61b)
* [PHP で (a == 1 && a == 2 && a == 3) を常に真（true）にできますか？](https://qiita.com/KEINOS/items/b16acf11e3fe7b2fc438)
* [Go 言語でも (a==1 && a==2 && a==3) を true にしてみたい（クソリプ編）](https://qiita.com/spiegel-im-spiegel/items/16b15d0c646e2a0e3e7d#_reference-54e9a281a4abc0e9bab9)
* [(a == 1 && a == 2 && a == 3) を常に真にできますか？ その2](https://qiita.com/Morichan/items/cc4e426b5128fac4a61b)

## だいたい解けたもの

* [a == 1 and a == 2 and a == 3をTrueにする](https://qiita.com/namn1125/items/7ac4f2a9544391d56236)
* * [C言語でa == 1 && a == 2 && a == 3をtrueにしてみたい](https://qiita.com/fujitanozomu/items/e4ab6f20837ed8234cd3)

## 解く気がないもの

[（ａ＝＝１＆＆ａ＝＝２＆＆ａ＝＝３）をtrueにするRubyスクリプト](https://qiita.com/aimof/items/bd4acfd310bcabff1538)
Python2で(a == 1 and a == 2 and a == 3) を常にTrueと等しくする魔法の一文(演算子はいじらない系)(ソース4行)

魔法の一文とはこれだ！

```python
True = False
```

## 実際のコード

```python
True = False
a = 0
if (a == 1 and a == 2 and a == 3) == True:
    print "Hello, False!"
```

```
Hello, False!
```

## 解説

Python2で```True```は予約語ではないので、Falseを代入できます。```(a == 1 and a == 2 and a == 3)```は何もしなければFalseなので、常にTrue(変数)の中身であるFalseに等しいです。
Ubuntu 16.04 systemd で起動時にスクリプトを実行しようとしたらハマった件

# 1. スクリプトをroot権限で実行できるようにする
諸々を/usr/local/bin/において、root権限でも実行できるようにする。
service定義ではUser指定ができるようであるが、/var/logに吐き出したかったので、、、

# 2. [Install]を書く
/etc/systemd/system/hoge.serviceの一番下に
```
[Install]
WantedBy=multi-user.target
```
が必要だった模様。

これらを確認した後、
```shell
sudo systemctl reenable hoge.service
```
とすれば、次回boot時にスクリプトが自動実行される。
Meteorで作ったアプリをhttpsにする手順

javascriptのフルスタックフレームワーク「Meteor」で作ったアプリを「http」から「https」に変更する手順を書きたいと思います。

## 環境

- Meteor v1.5.2.1                                
- node v8.9.3
- heroku　server

## 手順

すでにドメインを持っていてアプリを公開している前提で書きます。

### herokuでSSL設定

1. Dyno(有料)で公開している前提
2.  Settingsのページに移動
3.  Configure SSLを選択
4.  「Automatically configure using Automated Certificate Management」を選択
5.  「https://...」にアクセスできる

### 「https」にリダイレクト処理

上記手順だと「http://...」でアクセスしたときにリダイレクト処理されない。
なので「https://...」にリダイレクトする処理を追加

1. herokuのアプリROOT_URLを変更
2. meteorのSSLリダイレクト用のパッケージをinstall

``` coomand:アプリのディレクトリに移動
$ cd myapp
$ heroku config:set ROOT_URL=https://myapp.com/
$ meteor add force-ssl
```

以上で「https://」にリダイレクト処理されます。


## 参考サイト

- [Herokuに独自ドメインのSSL接続を無料で導入できるようになった話（有料Dynoのみ）](https://qiita.com/xiz-tky/items/d19920dfc86f2d8b5501)
- [How to force my site from Http to Https](https://forums.meteor.com/t/how-to-force-my-site-from-http-to-https/39485)
Boostnoteでストレージが勝手にアンリンクされてしまう

## 環境
macOS High Sierra 10.13.2

## 起こっている問題
- アプリを終了し、再度起動したところ今までストレージとしていた向け先がアンリンクされ何も表示されなくなった。
- 再度同じ向け先（Dropbox¥boostnote-mobile配下）で設定しようとしてもcreateボタンが反応しない。
- 他の場所（デスクトップなど）には一応登録できるが、アプリを再起動するとアンリンクされている。

## いつから
1/18頃

## 原因
不明
Boostnote v0.8.20にアップデートされたことが原因ではないと思うのですが、、、

## 解決策
コメントいただいた方法で私は解決いたしました。
@ma2wit 様ありがとうございました！！
同じような現象に悩まされている方はこちらを参考にされたら幸せになれるかもしれません。
↓↓
[Boostnoteアップデート後CSONファイルが存在するにも関わらずストレージ設定が消えてフォルダとドキュメントが表示されない障害原因と解消法](https://qiita.com/ma2desu/items/e1c607180facd41c9fbf)

## 備考
Windows端末でも利用しています。（バージョンはv0.8.18とかだった気がします）
Macでこの現象を確認したので、Windowsの方はアプリを落とさないままにしています。

ということで、今後はQiitaにメモを溜め込んでいくことにします。
Boostnoteがなんとか復活できればいいのですが。。。
Bitnamiにeasy ganttをインスコ

# バージョン前提
OS : Windows7 32bit
Bitnami : 3.4.3-1
easy gantt : 2016.07.RC

# 公式のインスコ説明
- Do NOT install plugins as a ROOT user
- First, delete all old Easy Gantt plugins if exists (plugins/easy_gantt*)
- Copy all unzipped plugins into REDMINE_ROOT/plugins
- Run:

```
  $ bundle install
  (or bundle update)
  $ bundle exec rake db:migrate RAILS_ENV=production
  $ bundle exec rake redmine:plugins:migrate RAILS_ENV=production
```

- Restart server

(でもBitnamiは動作保証しないぜって書いてある気がする)

# bundleが動かない

```winbatch
d:\Bitnami\redmine-3.4.3-1> bundle install
Could not locate Gemfile or .bundle/ directory
```
とりあえずredmine関連で追加されたPATHが￥と/が混在していたので修正。
(Adminじゃないのでbatを作成)
あとGemfileは./apps/redmine/htdocsにあるので作業ディレクトリを変更。

```winbatch
> cd ./apps/redmine/htdocs
> bundle install
```

# mySqlサーバに接続できない
```winbatch
> bundle exec rake db:migrate RAILS_ENV=production
Mysql2::Error: Can't connect to MySQL server on '127.0.0.1' (10061)
```

なんだ。起動させておくのか。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/202646/e63ea9ae-0d5a-0828-10d9-d419c86400ae.png)

# NameError: uninitialized constant RedmineExtensions

```winbatch
> bundle exec rake db:migrate RAILS_ENV=production
rake aborted!
NameError: uninitialized constant RedmineExtensions
```

1時間ほど試行錯誤しましたが、[この人](https://community.bitnami.com/t/problem-installing-easygantt-plugin/43836)がBitnamiの公式ガイドを参考にしたら解決できたと言っていたので、同じ操作をしたら行けました。
https://docs.bitnami.com/general/apps/redmine/#troubleshooting-plugin-installation

```winbatch
> bundle install --no-deployment
> bundle exec rake db:migrate RAILS_ENV=production
> bundle exec rake redmine:plugins:migrate RAILS_ENV=production
```
意味はわかってませんが、なんとかできました。

# (追記)オフラインでのインストール
同じ環境でオンラインのものを用意して、そちらでインストールしたあとで、`./apps/redmine/htdocs/vendor/cache`フォルダをまるっとコピー。

--localオプションをつけたらあとは同様です。

```winbatch
> bundle install --no-deployment --local
```

個人用なのでさくっとやりたいときは、足りないといわれたGemファイルを直接
 https://rubygems.org で探してダウンロードしてくる手もあるようです。

```
Some gems seem to be missing from your vendor/cache directory.
Could not find gem 'factory_girl (>= 0) x86-mingw32' in any of the gem sources
listed in your Gemfile or installed on this machine.
```

# (追記2) Easy Redmine

チェコの会社で、プラグインホスティングや統合パッケージも売ってるのか。有用ならパッケージで会社に入れたいが使う人がどれだけいるのか。

- ローカライズ対応
- 実用的な機能
- Redmine Pluginの導入可否
- 価格

とりま、[Easy WBS](https://www.easyredmine.com/redmine-wbs-plugin)と[Easy Chat](https://www.easyredmine.com/redmine-chat)も入れてみようかなぁ。。。
ちょっとずつ読むドメイン駆動設計 第四部 戦略的設計 第十六章 大規模な構造4 知識レベル

# これまでの１６章
[進化する秩序](https://qiita.com/YasuhiroKimesawa/items/b6c42408b7912fd691b5)
[システムのメタファ](https://qiita.com/YasuhiroKimesawa/items/692d173aa24921f8fea1)
[責務のレイヤ](https://qiita.com/YasuhiroKimesawa/items/f5bc58d32fb0c5b81a3c)

# 知識レベル

いわゆるメタレベルのモデル。そのモデルを「業務レベル」のモデルが利用する。
メタレベルとはいえ、よくある自由項目とかそういうことではないです。

書籍の例を読むのが理解が早いかもしれません。

[従業員タイプ]ごとに[給料]と[退職金積立制度]が設定されていて、ここが**「知識レベル」**。
**業務**では、従業員が追加されるごとに、人事部の普通のユーザが従業員タイプを設定して登録します。ここが**「業務レベル」**。

「知識レベル」のモデルは普通の業務では変更しないが、組織変更などがあるとスーパーユーザーが変更することになる。
なので、具体的な従業員タイプ（時給従業員タイプや月給従業員タイプ)とその従業員タイプに紐づく給料や退職金積立制度をモデル化して変更できなくしておくのではなく、この部分をユーザーがコントロールできるようなモデルにする。そういう意味で「メタレベル」のモデルとなるということですね。

## 注意点

このパターンは慎重に使用しなければならない。
複雑な知識レベルになってしまうと、理解できなくなって、ユーザーが間違いを犯し、アプリケーションが誤ったふるまいをするようになる可能性もある。

また、メタデータの実装でよくあるデータ移行に関する問題は、知識レベルでも同じように問題になることも。

他、レイヤーと似ていますが、「知識レベル」「業務レベル」では、双方向で利用することがあるので、そこはレイヤーと違うところですね。

他の大規模な構造のパターン同様、必ずしも必要なパターンではないですが、何気に使うことあるような気がしますね。
MagicalRecord の MR_fetchAllWithDelegate メソッド呼び出し時のクラッシュを回避する


## 概要

`MagicalRecord`利用時、特定のモデルのオブジェクトを全部取得したい時
`MR_fetchAllWithDelegate` メソッドを呼び出すと下記のようなエラーが出てクラッシュする。

```console:log
'An instance of NSFetchedResultsController requires a fetch request with sort descriptors'
```

## 原因
`MR_fetchAllWithDelegate`内部で`MR_requestAllInContext`を呼び出している。
ここで作成された`NSFetchRequest`オブジェクトを利用して全取得を行おうとしている。
しかし、ここで作成された`NSFetchRequest`オブエジェクトは`sortDescriptor`が設定されておらず、これを利用すると必ず落ちる。
どうやらMagicalRecord内のバグのようです。

参考
https://github.com/magicalpanda/MagicalRecord/issues/348


## 解決

オブジェクトの全取得をしたいのであれば、別の方法を試すほうが良さそう。

`MR_findAllInContext`メソッドなどが適切に見えます。
初心者の負荷試験入門2

## はじめに
本記事は初心者の負荷試験入門シリーズの第2弾です！

前回の [初心者の負荷試験入門 その1](https://qiita.com/Junichi_M_/items/b83b8bc7bfcfd78f4850) では、負荷試験のざっくりとした目的や指標、性能改善をまとめました。負荷試験を実施するにあたってどのような指標が必要なのかは何となくわかりましたが、実際にどのようなToolを利用してシステムに負荷をかけていくのかはまだ見ていないので今回はそれをまとめてみようと思います。

## 負荷試験ツール
ひとえにツールといっても負荷試験のツールにはいくつか種類があるようで、主に「攻撃ツール」、「モニタリングツール」、「プロファイリングツール」の3種類のツールを利用する。
ツールの役割はこんな感じ
**攻撃ツール**：システムに負荷を与えるツール(大量リクエストの送信など)
**モニタリングツール**：システムのリソース状況を観測して可視化するツール
**プロファイリングツール**：ミドルやアプリケーション内部を解析して可視化するツール

### 攻撃ツールの選択
#### 攻撃ツールとは
システムを利用する側の動きをシミュレーションすることにより、対象のシステムを高負荷状態にできるツールのことを指します。
攻撃ツールを利用することでシステムに大量のリクエストが発生し、Dos攻撃を受けたかのような状態となります。

#### 攻撃ツールに求められる要件
負荷試験を行うために攻撃ツールに必要とされる主な要件は下記の4つになります。
1.リクエストを正しくシミュレーションできること
2.攻撃の強さを制御できること
3.対象のシステムに対して十分な負荷を発生させられること
4.攻撃ツールの設置場所、起動場所を選択できること

1.リクエストを正しくシミュレーションできること
攻撃ツールによっては**シナリオ**を組んだ攻撃が出来ないツールも存在するため、負荷試験の要件にそぐわない場合はこれらのツールを選定から外した方がよさそうです。

2.攻撃の強さを制御できること
クライアントの同時起動数、リクエスト間隔、最大スループット数を調整することで攻撃の強さを設定できます。

3.対象のシステムに対して十分な負荷を発生させられること
攻撃ツールにより、どこまでの高負荷状態を効率よく発生させられるかが異なる為、自分たちのシステムの特性に合ったツールを選択する必要があります。

4.攻撃ツールの設置場所、起動場所を選択できること
攻撃ツールによって起動できる攻撃サーバに制約がある為、攻撃サーバを設置する場所が制限されるものがあります。

#### 攻撃ツール用語
ツールによって多少用語が異なることがありますが、たいていの攻撃ツールは下記表のような概念が存在しています。用語を理解していればツールが変更になったとしても同じように負荷試験が行えるようです。

| 用語 | 説明 |
|:------------:|:-------------:|
| クライアント | HTTPリクエストを同時に1つだけ発行できるリクエスト生成機 |
| クライアントの同時起動数 | 攻撃ツール上で利用される攻撃用クライアントの数 |
| Ramp-Up 期間 | 攻撃開始後にすべてのクライアントが起動するまでのウォームアップ期間 |
| シナリオ | クライアント毎に設定されたHTTPリクエストの発生パターン |
| シナリオ実行回数 | クライアントがシナリオに沿ったリクエストを実施する回数 |
| スループット | システムが単位時間あたりに処理できるリクエストの数 |
| レイテンシ | 攻撃ツールがリクエストを出してからレスポンスを受け取るまでの期間 |

#### 攻撃ツールの例
具体的な攻撃ツールを一部紹介しています。(各ツールの詳細については割愛します…調べたら記述予定)

- Apache JMeter
    特徴
    - リクエスト毎に動的にパラメータを変更可能
    - 複数のURLを組み合わせたシナリオを実施できる
    - GET,POST,PUT,DELETEメソッドの試験が可能 etc
- Locust
    特徴
    - シナリオをPythonスクリプトで記述できるため、柔軟なシナリオが作成できる
    - 結果表示がシンプル
    - 必要なサーバリソースが少ないた為、攻撃サーバで負荷をかけやすい etc
- Gatling
    特徴
    - developerフレンドリーなシナリオファイル
    - 見やすいレポートHTML etc

攻撃ツールにはそれぞれ特徴があり、負荷試験の対象となるシステムによって使い分けることが必要です。
とくに同じシステムに対する負荷試験でも利用するツールによって大きく結果がことなることがあるため、場合によっては複数のツールで攻撃を行い結果を比較してみることも必要かもしれません。

### モニタリングツール/プロファイリングツール
攻撃ツールの中にはスループットの監視ツールや可視化ツールが含まれているものも多いですが、攻撃ツールから観測できるレイテンシはシステム全体のレイテンシのみであり、個別のサブシステム等のレイテンシは観測できません。

サブシステムにおける詳細なモニタリングやプロファイリングを補助するためのツールとして以下があります。
- topコマンドとnetstatコマンド
- AWS管理コンソール(AWSを利用している場合) etc

そしてこれらのツールを利用してモニタリングしておきたい項目が以下の表になります。

| サブシステム | 監視すべきもの |
|:------------:|:-------------:|
| ネットワーク | 転送量 |
| ハードウェアやOS | CPU,メモリ,プロセス数,SWAP |
| TCP | 外部へのコネクション状況 |
| ディスク | R/W 転送データ量 |
| サーバミドルウェア | コネクション数 |
| アプリケーション | プロファイラーにて監視 |

#z3 今後について
負荷試験に利用するツールについて調べたが主に攻撃ツールの特性による試験の向き不向き等が見えてきました。モニタリングについては文章ベースなので今後、実際にサンプルアプリケーションを作成して負荷試験を試してみる中でモニタリングのやり方を学習していこうと思います。

そのほか、こんなツールがあるよなど情報があればぜひご連絡頂ければと思います。
個人的atomの使い方

atomでいろんな言語の実行環境を整えたはいいものの使い方を忘れそうなのでまとめておく。
<F5>C言語のコンパイル&実行　:gpp-compiler
<alt+shift+t>terminalの立ち上げ　:platformio-ide-terminal
<alt+shift+i>自動インデントの実行 :atom-text-editor
<alt+r>pythonプログラムの実行 :atom-runner
人の顔を解析する便利なAPI

# はじめに
最近、iPhoneXで顔認証が使われてたりと顔の画像解析技術が注目を集めています、
そこで顔の画像解析で優秀なAPIがあったので紹介します。
中国で作られたAPIで「face++」というものです。
まずは、簡単な使い方から紹介します。

# APIKeyの取得
はじめに、sign upを行い、API KEYを取得してください
https://www.faceplusplus.com/

アカウントを作成し、
Apps > API KeyのGet API Keyから作成できます
<img width="1438" alt="スクリーンショット 2018-01-21 14.09.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/104508/25303b4c-960a-aea4-30b5-b9de6d48fc0e.png">


作成が完了すると以下のような画面になります。
<img width="1434" alt="スクリーンショット 2018-01-21 16.29.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/104508/06470cce-4c67-6e81-6bbb-ed26848a29e8.png">



# APIを叩いてみる
API keyが取得できたら早速APIを叩いてみます

## 簡単な情報だけ取得
まずは、以下の様な形式でAPIを叩きます

```
$ curl -X POST "https://api-us.faceplusplus.com/facepp/v3/detect" -F "api_key=<api key>" \
-F "api_secret<api secret>" \
-F "image_url=<顔の入った写真のURL>" \
```

すると以下のようなjsonが返ってきます

```json
{
    "faces": [
        {
            "face_rectangle": {
                "height": 112, 
                "left": 51, 
                "top": 85, 
                "width": 112
            }, 
            "face_token": "20c31e814a28ab03c8edb793c793f717"
        }
    ], 
    "image_id": "6STR0Wfxj826JYSX0t5gcg==", 
    "request_id": "1516518682,707235fb-1129-4f54-8853-2870e386a52b", 
    "time_used": 1287
}
```

## さらに細かい情報を取得する
return_landmark = 1を加えればもっと細かい情報まで取得できます。

```
$ curl -X POST "https://api-us.faceplusplus.com/facepp/v3/detect" -F "api_key=<api key>" \
-F "api_secret<api secret>" \
-F "image_url=<顔の入った写真のURL>" \
-F "return_landmark=1"
```

たくさんの結果が返ってくるため省略して一部を示しますが、鼻だけでこれだけ座標が取得できます！
境界線まで細かく返ってきます。

```json
"nose_contour_left2":{"x":98,"y":126},
"nose_contour_left3":{"x":102,"y":138},
"nose_contour_lower_middle":{"x":110,"y":139},
"nose_contour_right1":{"x":115,"y":107},
"nose_contour_right2":{"x":120,"y":125},
"nose_contour_right3":{"x":117,"y":137},
"nose_left":{"x":95,"y":135},
"nose_right":{"x":124,"y":133},
"nose_tip":{"x":111,"y":129},
```
めっちゃ優秀ですね！！
鼻以外にも目など様々な座標が返ってきます。
返却値の詳細はここに記載されています。
https://console.faceplusplus.com/documents/13207488

## 画像の年齢や性別などを当ててもらう
さらに、return_attributesを加えればその他の情報も取得できます。
例えば、年齢と性別を判断して返してくれます。

```
　$ curl -X POST "https://api-us.faceplusplus.com/facepp/v3/detect" -F "api_key=<api key>" \
-F "api_secret<api secret>" \
-F "image_url=<顔の入った写真のURL>" \
-F "return_landmark=1" \
-F "return_attributes=gender,age"
```

こんな感じで返ってきます

```json
"attributes": {
  "age": {
    "value": 36
  }, 
  "gender": {
    "value": "Male"
  }
}
```           

その他のoptionについては以下のドキュメントをご参照ください
https://console.faceplusplus.com/documents/5679127
【SwiftLint】CocoaPodsでSwiftLintを導入する

CocoaPodsでSwiftLintを導入する参考ページが少なかったので備忘録。
# 環境
Xcode 9.0
Swift 4.0
# SwiftLintをインストール
Profileに以下のように記載して、「pod install」

（Profiileの例）

```Podfile
# Uncomment the next line to define a global platform for your project
# platform :ios, '11.0'

target 'rules-demo' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for rules-demo
  pod 'SwiftLint'

  target 'rules-demoTests' do
    inherit! :search_paths
    # Pods for testing
  end

end
```

# インストール後の設定
<img width="1440" alt="スクリーンショット 2018-01-22 23.47.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/139470/2208bfad-2182-02fc-2a81-b109c4aead06.png">

上図の赤枠に以下のテキストをコピペする。
**※Homebrewでインストールした場合とテキストが異なるので注意！**

```Podfile
if which "${PODS_ROOT}/SwiftLint/swiftlint" >/dev/null; then
${PODS_ROOT}/SwiftLint/swiftlint
else
echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
```

# 動作確認
⌘+Bで、Bulidをしてください。
SwiftLintの動作確認が出来ましたら、これで導入は終わりです！
Dockerイメージとコンテナ作成 (Dockerfile編)

# Dockerfile 作成

```
# http://www.atmarkit.co.jp/ait/articles/1407/08/news031.html
# https://qiita.com/soushiy/items/0945bcbc7ecce4822985

FROM centos:7.4.1708
MAINTAINER tomy103 <hoge@hogehoge.jp>

# install os package
RUN yum -y install gcc bzip2 make \
        && yum -y install openssl-devel readline-devel zlib-devel \
        && yum -y install libpcap-devel \
        && yum -y install which \
        && yum -y install git

# install rbenv / ruby
ENV PATH /root/.rbenv/bin:/root/.rbenv/shims:$PATH
RUN git clone git://github.com/sstephenson/rbenv.git ~/.rbenv \
        && git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build \
        && echo 'export PATH="/root/.rbenv/bin:/root/.rbenv/shims:$PATH"' >> /etc/profile.d/rbenv.sh \
        && echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh \
        && rbenv install 2.4.2 \
        && rbenv global 2.4.2 \
        && rbenv rehash

# install roadworker
RUN gem install rails -v 5.1.4
```
※RUNコマンドの数が多いとイメージのサイズが大きくなってしまう(らしい)ので極力 && でまとめてみた。

# Dockerイメージをビルド

```
# docker build -t tomy103-ruby-on-rails-tutorial:latest ./

※docker build [ -t ｛イメージ名｝ [ :｛タグ名｝ ] ] ｛Dockerfileのあるディレクトリ｝

# docker images
REPOSITORY                                               TAG                 IMAGE ID            CREATED             SIZE
tomy103-ruby-on-rails-tutorial                           latest              a759c6635ae9        18 minutes ago      618MB
```

# 作成したDockerイメージからコンテナ作成/起動

```
# docker run -d -it --hostname tomy103-ruby-on-rails-tutorial --name tomy103-ruby-on-rails-tutorial tomy103-ruby-on-rails-tutorial:latest /bin/bash --login

※docker run [オプション] [--name ｛コンテナー名｝] ｛イメージ名｝[:｛タグ名｝] [コンテナーで実行するコマンド] [引数]
```

# コンテナの状態確認

```
# docker ps -a
CONTAINER ID        IMAGE                                   COMMAND               CREATED             STATUS              PORTS               NAMES
f475564e760a        tomy103-ruby-on-rails-tutorial:latest   "/bin/bash --login"   53 seconds ago      Up 51 seconds                           tomy103-ruby-on-rails-tutorial
```

# コンテナ停止/起動

```
# docker stop tomy103-ruby-on-rails-tutorial
# docker start tomy103-ruby-on-rails-tutorial
```

# コンテナにログイン

```
# docker attach tomy103-ruby-on-rails-tutorial
```
ゲームオブジェクトに自動でプレハブをアタッチするスクリプト

「Unity プレハブ　自動アタッチ」などでググってもヒットしなかったので、メモ。

#コード
Prefabsフォルダ以下のプレハブの取得し、アタッチを行うスクリプト。

```PrefabHolder.cs
#if UNITY_EDITOR
	/// <summary>
	/// リセット時処理
	/// </summary>
	private void Reset()
	{
		var guids_prefab = AssetDatabase.FindAssets("t:prefab", new string[] { "Assets/Prefabs" } );
		preloadPrefabs = new GameObject[guids_prefab.Length];
		for ( int i = 0; i < guids_prefab.Length; i ++ )
		{
			string path_prefab = AssetDatabase.GUIDToAssetPath(guids_prefab[i]);
			preloadPrefabs[ i ] = AssetDatabase.LoadAssetAtPath<GameObject>(path_prefab);
		}
	}
#endif
```

#解説
`preloadPrefabs[ i ] = AssetDatabase.LoadAssetAtPath<GameObject>(path_prefab);`
「プレハブをアタッチ」する部分。
パスは"Assets/"からスタートし、拡張子も含める。

`var guids_prefab = AssetDatabase.FindAssets("t:prefab", new string[] { "Assets/Prefabs" } );`
プロジェクト内のアセットを検索し、見つかったアセットのGUIDを返す。
今回はパスを得たいのでAssetDatabase.GUIDToAssetPath()を使ってパスに変換している。

検索は、プロジェクトビューの検索と同じ構文で行う。
また、第二引数にフォルダを指定することで、検索するフォルダを指定出来る。
"Assets/"から始めることに注意。

`private void Reset()`
わざわざエディタ拡張しなくても、インスペクタビューのコンテキストメニューから呼べるので便利。

#参考
Resources以外からアセットをロードする【Unity】【エディタ拡張】
http://kan-kikuchi.hatenablog.com/entry/AssetDatabase_LoadAsset

AssetDatabase.FindAssets
https://docs.unity3d.com/jp/540/ScriptReference/AssetDatabase.FindAssets.html

【Unity】プロジェクト内のScriptableObjectを見つける方法
http://tsubakit1.hateblo.jp/entry/2016/03/08/231929
vue.js内の日本語が文字化けする

# 概要
vue.jsを書いていた時に日本語が文字化けしたのでメモ


```
// テスト
```
上記のように書いていたのが

```
// %F%9%H
```
こんな感じになる。
# 解決策

## 文字コードを確認する

### コマンドインストール
```
sudo yum install nkf
```

### 日本語が入っていない状態

```
nkf -g src/components/HelloWorld.vue
ASCII
```

### 日本語が入っている状態

```
nkf -g src/components/HelloWorld.vue
ISO-2022-JP
```
なぜかUTF8じゃない
## UTF8に変更

```
nkf -w --overwrite src/components/HelloWorld.vue
```
これで文字化けしなくなった。

これをやらないといけないのは自分の環境のせいなきがする。。
SwiftでAVFoundationを使って音声ファイルを再生する方法

Swiftのプロジェクト内で音声ファイルを再生する方法をメモがてら著します。

AVFoundationは、時間ベースのオーディオビジュアルメディアの再生と作成に使用できる
フレームワークです。詳しい内容は以下のドキュメントにあります。
[AVFoundationプログラミングガイド](https://developer.apple.com/jp/documentation/AVFoundationPG.pdf)

動画再生も実装できる汎用的なフレームワークですがここでは音声放送に絞って実装例と解説
をします。

```
import AVFoundation
//ライブラリをインポートします。

・・・・

 var audioPlayer : AVAudioPlayer!
//音声再生では変数としてaudioPlayerを用います。

・・・・

override func viewDidLoad() {
        super.viewDidLoad()

        if let url=Bundle.main.url(forResource:"****",withExtension:"***" ){
//上記の***の箇所でファイル名と拡張子を指定し変数urlに代入します。 
            do {
                audioPlayer=try AVAudioPlayer(contentsOf:url)
                audioPlayer?.play()
//処理が成功したらaudioPlayerに指定したurlを代入し、playメソッドを呼び出します。
            }catch{
                audioPlayer=nil
            }
        }else{
            fatalError("Url is nil")
//URLが空の場合など処理が走らなかった場合はエラー文を表示します。
        }
        
    }


```

以上です。今後は動画再生などを実装していければと思います。
特定のcommit idに変更する方法

特定のcommit idに変更するときにやったこと。
最新のmasterとサクッとマージしたら動かなくなったので特定のcommit idに戻した。

```
$ git reset --hard [commit id]
```

[参照先記事](https://qiita.com/2m1tsu3/items/6d49374230afab251337#reset)
React Native と Redux Formの組み合わせでキーボード入力中にsubmitしても入力内容が反映されていない問題

React NativeとRedux Formを組み合わせて（もちろんReduxは使用）利用した時にちょっとした問題に遭遇したので投稿します。
ちなみにiPhoneでしか確認していないので、Androidで同様かは不明です。 
## 問題
ログインフォームなどでTextInputに入力する時、フォームにfocusされたままでログインボタンを押した場合、入力中の文字はdispatchされない。
次のスクリーンショットのような状況です。

<img width="375" alt="Simulator Screen Shot - iPhone 6 - 2018-01-22 at 22.59.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/187158/6a3bd479-493d-dad0-46ad-26a90d44d2cc.png">

この状況だとログインボタンを押してもパスワードが入力されていない扱いになり、バリデーションエラーが表示されてしまいます。

## 解決方法
Redux FormのFieldのinput propsに```onChange()```があるので、```TextInput```の```onChangeText``` propに渡せば解決します。
[Redux Form -Field](https://redux-form.com/6.0.0-alpha.4/docs/api/field.md/)

次のようにTextInputFormの部品を作ります。関係ない部分は削っています。

TextInputFormを利用した全体のコードは次の通りです。```@decorator```使ってます。

```html
const TextInputForm = (props) => {
  const { input, style, label, ...inputProps } = props
  return (
    <View>
      <Text>{label}</Text>
      <TextInput
        {...inputProps}
        style={style}
        onChangeText={text => input.onChange(text)} //これを追加
      />
    </View>
  );
}

```


```html
import React, { Component } from 'react'
import { reduxForm, Field } from 'redux-form'
import { Text, TextInput, View, TouchableOpacity } from 'react-native'

@reduxForm({
  form: 'login',
  validate: values => {
    const errors = {}
    if (!values.id) errors.id = 'IDを入力してください'
    if (!values.password) errors.password = ' パスワードを入力してください'
    return errors
  }
})
export default class Login extends Component {
  login = values => {
    // 何か処理
  }

  render() {
    const { handleSubmit, error } = this.props
    return (
      <View style={styles.root}>
        <View>
          <Field
            name='id'
            label='ID'
            style={styles.input}
            component={TextInputForm}
          />
        </View>
        <View>
          <Field
            name='password'
            label='パスワード'
            style={styles.input}
            component={TextInputForm}
            secureTextEntry
          />
        </View>
        <TouchableOpacity onPress={handleSubmit(this.login)} style={styles.button}>
          <Text style={{color: '#fff', fontSize: 20}}>ログイン</Text>
        </TouchableOpacity>
      </View>
    )
  }
}
```

これで解決するにはするのですが、onChangeTextが呼ばれる度にdispatchされているため、もしかするとパフォーマンスに影響がある可能性があります。
AWS AppSyncとReactでToDoアプリを作ってみよう (0)はじめに

昨年12月のAWS re:Invent 2017で発表された[AWS AppSync](https://aws.amazon.com/jp/appsync/)のパブリックプレビュー申請が通ったので、ToDoアプリの作成を例にして、AppSync + ReactでWebアプリを構築する際の流れを紹介していきたいと思います。

## この記事で取り上げる内容

この記事では、あえてGraphQLスキーマの定義からReactでのクライアント側の実装までを順を追って説明していきます。
~~ToDoアプリのスキーマについては、AWS公式ドキュメントの[Designing a GraphQL API](https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/designing-a-graphql-api.html)に記載されている内容に沿って作成していきます。~~


とりあえずサクッとサンプルを動かしたいという方は、次のような記事の内容を参考に [AWS公式のサンプル](https://github.com/aws-samples/aws-mobile-appsync-events-starter-react)を動作させてみるのも良いと思います。(自分も最初はこのサンプルを動かしてみて雰囲気を掴みました)

* [AWS AppSync (Preview)を試してみた -Qiita](https://qiita.com/nidcode/items/a2ad9de34aee438ebcbc)
* [【新サービス】マネージドGraphQLサービス「AWS AppSync」のプレビュー版を使ってみた -Developers.IO](https://dev.classmethod.jp/cloud/aws/app-sync-preview/)

## 目次

今回は、記事が長くなりそうなので、何回かに分けて内容を紹介していきます。

0. AWS AppSyncとReactでToDoアプリを作ってみよう (0)はじめに ←今回はこの記事
1. [AWS AppSyncとReactでToDoアプリを作ってみよう (1)GraphGLスキーマの定義](https://qiita.com/daikiojm/items/d929c59b5976fd8b635a)
2. [AWS AWS AppSyncとReactでToDoアプリを作ってみよう (2)DataSourceとResolverの設定](https://qiita.com/daikiojm/items/b5270cd45a9f2e415a1e)
3. [AWS AppSyncとReactでToDoアプリを作ってみよう (3)Reactアプリの作成](AWS AppSyncとReactでToDoアプリを作ってみよう(3) Reactアプリの作成)


## 事前知識

### GraphQL  
AWS AppSyncでは、クライアントからAppSyncで作成したAPIへのクエリの際にGraphQLを利用します。  
次の記事などを参考にしてサラッと概要を掴んでおけば、問題ないかと思います。

* [GraphQL入門 - 使いたくなるGraphQL -Qiita](https://qiita.com/bananaumai/items/3eb77a67102f53e8a1ad)

* [GraphQL Overview -AWS](https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/graphql-overview.html)

### React
今回の記事では、AWSからクライアントライブラリが出ていて、一番簡単に実装できそうなReactでクライアント側の実装を行います。
使用するライブラリ[aws-appsync](https://www.npmjs.com/package/aws-appsync)が、内部的にReduxを使用しているため、React + Reduxに触ったことがあるとよいかと思います。

## 注意点

この記事は、AWS AppSyncのパブリックプレビュー時点(2018/01/22)の内容を元に紹介している内容です。
AWS AppSyncとReactでToDoアプリを作ってみよう (1)GraphQLスキーマの定義

## はじめに
AWS AppSyncでは、APIクエリにGraphQLを利用するため、GraphQLのスキーマ定義が必須です。
今回は、 `schema.graphql`というファイルを作成し、ここにGraphQLスキーマを定義していきます。  

## Todoスキーマの定義

### Query

まずは、Todoのtypeを定義します。
それぞれの項目に指定された、`ID`、`String`、`Int`はGraphQLで用意されているデフォルトの型です。
また、`!`は必須項目であることを表します。

```graphql
type Todo {
  id: ID!
  title: String
  description: String
  completed: Boolean 
}
```

次にこのtypeに対するqueryを定義します。
Queryという名前のルート型を追加して、Todoオブジェクトを含むリストを返すのgetTodosフィールドを追加します。

```graphql
type Query {
  getTodos: [Todo]
}
```

schema に登録します。

```graphql
schema {
  query:Query
}
```

#### ここまでの結果

```graphql:schema.graphql
schema {
  query:Query
}

type Query {
  getTodos: [Todo]
}

type Todo {
  id: ID!
  title: String
  description: String
  completed: Boolean 
}
```


### Mutation

queryでのデータ取得のクエリ型定義を行ったので、mutationでデータの追加、更新、削除する場合のクエリ型を定義していきます。

まずは、追加・更新の際のmutationを定義します。
addTodoフィールドは引数を取り、結果としてTodoオブジェクトを返すメソッドのようなイメージです。

```graphql
type Mutation {
  addTodo(id: ID!, title: String, description: String, , completed: Boolean): Todo
}
```

同様に編集・削除の際のmutationを定義します。

```graphql
type Mutation {
  addTodo(id: ID!, title: String, description: String, , completed: Boolean): Todo
  updateTodo(id: ID!, title: String, description: String, , completed: Boolean): Todo
  deleteTodo(id: ID!): Todo
}
```

また、今回は使用しませんでしたが、enum型なども使用できるようです。


#### ここまでの結果

```graphql:schema.graphql
schema {
  query: Query
  mutation: Mutation
}

type Query {
  getTodos: [Todo]
}

type Mutation {
  addTodo(id: ID!, title: String, description: String, , completed: Boolean): Todo
  updateTodo(id: ID!, title: String, description: String, , completed: Boolean): Todo
  deleteTodo(id: ID!): Todo
}

type Todo {
  id: ID!
  title: String
  description: String
  completed: Boolean 
}
```


### Subscription

今回の例ではリアルタイム性を求めないため、Subscriptionは利用しません。
また機会があったら、試してみようと思います。


## GraphQLスキーマの登録

前の手順で作成したGraphQLスキーマをAppSyncにアップロードします。

まずは、コンソール画面から、「AWS AppSync > 作成したプロジェクト > Schema」を選択し、Schema編集画面を開きます。

<img width="1163" alt="スクリーンショット 2018-01-21 19.59.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/79414/c282e370-e7e7-b310-018d-079d835601f8.png">

`Schema`の項目に、作成したGraphQLスキーマの内容をコピー&ペーストして、右下の「Save」ボタンをクリックし保存します。
ボタンをクリックすると、内容が検証され、スキーマの内容に構文エラーがあると、エラーメッセージが表示されます。

<img width="924" alt="スクリーンショット 2018-01-21 20.05.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/79414/93a2dfaf-f4a0-0766-557d-5d25f0deb048.png">


エラーが有った場合には、対象の箇所を修正して再度保存してください。
正常に保存されると、「Data Types」の項目に、`schema.graphql`に定義した型の一覧が表示されます。

<img width="517" alt="スクリーンショット 2018-01-21 20.16.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/79414/15d9d274-9532-284e-e6c5-598b793c33c2.png">


ここまでが、GraphQLスキーマの定義と、AppSyncへの登録の手順です。


## 参考

[Designing Your Schema -AWS AppSync](https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/designing-your-schema.html)
[Introduction to GraphQL -GraphQL](http://graphql.org/learn/)
MongoDB のストレージに Docker Managed な Volumes を利用してみた

普段ローカルでデータを取り扱うとき極力環境を汚したくはないので DB サーバ立てる時もなるべく Docker コンテナ利用するのですが、MongoDB データの永続化に初めて [Docker Volumes](https://docs.docker.com/engine/admin/volumes/volumes/) を利用してみました。

Docker コンテナ内のデータ永続化にはこれまで公式で言うところのいわゆる [Bind Mounts](https://docs.docker.com/engine/admin/volumes/bind-mounts/) しか利用したことがなく、Docker Managed なやり方が出てきていたことを知らなかったのでちょっと試しに利用してみたぐらいの温度感です。

一応 201801 現在のところの Best Practice はこの Docker Volumes らしいですが、まぁユースケース次第だと思うのでちゃんと考えて選択したほうが良いでしょう。

今回は Web サイトからクローリングしてきたデータが JSONLines 形式のファイルに収められている際に、そのファイルを mongoimport して Docker Volume に格納し、MongoDB サーバコンテナを削除した場合でも永続化されていることを確認するフローを行ったのでそのメモになります。

# 環境

Ubuntu 16.04
Docker version 17.12.0-ce, build c97c6d6

# Docker Volume 作成

肝心のボリュームを `mongodb_volume` という名前で作成してみます。

```bash
$ docker volume create mongodb_volume
```

# DB サーバコンテナ作成

公式の MongoDB イメージを利用します。
`/data/db` に `dbpath` が設定されているので、上記で作成した Docker Volume をこのディレクトリにマウントしてあげることになります。

```bash
$ docker run -d --rm --name mongodb --mount source=mongodb_volume,target=/data/db -p 27017:27017 mongo:latest
```

# データインポート

データインポートも公式 MongoDB イメージを利用します。
再度 mongo コンテナを立ち上げますが、その際に上記サーバコンテナの名前である `mongodb` をリンク指定してあげましょう。
そしてコマンドラインでホスト側のホームディレクトリに配置されている data.jsonl ファイルを DB 名 `my_db`、コレクション名 `my_col` にリンク経由で mongoimport します。

```bash
$ docker run --rm --link mongodb:mongodb -v $HOME:/workspace mongo:latest mongoimport -h mongodb -d my_db -c my_col --file /workspace/data.jsonl
```

正常にインポートが終わったらコンテナも終了するはず。

# DB サーバコンテナ終了&再起動

試しにサーバコンテナを削除してからもう一度起動してみます。

```bash
$ docker stop mongodb
$ docker run -d --rm --name mongodb --mount source=mongodb_volume,target=/data/db -p 27017:27017 mongo:latest
```

# データ確認

```bash
$ docker run -it --rm --link mongodb:mongodb mongo:latest mongo mongodb://mongodb
> use my_db
> db.my_col.find()
```

最後に mongo シェル用にコンテナを起動して実際にクエリを叩いてみてちゃんと結果が返ってくればOK。
バックアップをとったりリストアしたりする際には `/var/lib/docker/volumes/<volume-name>` を対象に行ってあげればいいらしい。
正直今回みたいな用途だと Bind Mounts でも全然問題ないんだけどまぁ知っておいて損はなさそう・・・かな。
Sprocketsの生きる道 in JavaScript

RailsプロジェクトのJavaScriptをWebpackerで書いていたのですが、Sprocketsの方がいい場面、というのが出てきました。

# プロジェクトの状況

もともとRails 4から続くプロジェクトで、JavaScriptもCSSもSprocketsに載せていました。そして、JavaScriptのES6対応や依存関係管理の都合もあって、JavaScriptのほうはWebpackerに載せ替えていきました。一方で、CSSはSCSSで必要十分だったので、Sprockets管理のままで運用を続けています。

# 別プロセスのコスト

その中で、Rails側から値を取ってくる必要のある`image_path`（[参考](https://qiita.com/jkr_2255/items/c922099876b832e66969)）や、Railsにある定数をJavaScriptにも持ち込みたいような場合、`.js.erb`としてERBでJavaScriptを生成する、という方法があります。

もちろん、Webpackerでも`.js.erb`を使う方法があって、その名も`rails-erb-loader`（[GitHub](https://github.com/usabilityhub/rails-erb-loader)）というローダーを使えば、読み込むこと自体は可能です。

ただ、`rails-erb-loader`は、1ファイルの処理につき1つRailsのプロセスを立ち上げてしまうために、`.js.erb`ファイルが増えれば加速度的に処理時間がかかるようになってしまいます。

# Rubyの道はRuby

ここで、Sprocketsに視点を戻してみましょう。もともとSprocketsはRubyの枠内で処理を行うので、ERBが来ても別プロセスを立てるようなコストは発生せず、通常のファイルと大差ないプロセスで処理ができます。

ということで、もともとCSSのためにSprocketsの運用を続けていたこともあるので、ERB処理の必要なものだけSprocketsで書いて、Webpackerからはそれを参照するように書くのがいいのではないか、と思い始めてきました。

```js+erb
// Sprocketsで書くERB
<%
imgs = {}
Dir.chdir("#{Rails.root}/app/assets/images/") do
  imgs = Dir["**/*"].inject({}) do |h,f|
    h.merge!(f => image_path(f)) unless Dir.exist? f
    h
  end
end
%>
window.fromRuby = {};

window.fromRuby.imagePath = function(name){
  return <%= imgs.to_json %>[name];
}

// Webpacker側に書くJavaScript
// 依存性の管理が混乱するので、直接fromRubyを呼ぶ箇所は、減らした方がいい
// このファイルをimportして使う

const imagePath = window.fromRuby.imagePath;
export default imagePath;
```
djamin を試してみる

「Djangoの新しいスタイルadmin」(google翻訳)
AWESOME DJANGO の ADMIN INTERFACE 部門で最初に紹介されてたので試してみることに。
ドキュメント に従って設定。

# 使用した環境
Windows10
Python 3.5.4
Django 1.11.8
djamin

# インストール

```
> pip install -e git://github.com/hersonls/djamin.git#egg=djamin
```

# 設定
## settings.py
INSTALLED_APPS に djamin を追加。
django.contrib.admin の前に追加すること。

```py3
INSTALLED_APPS = [
    # TODO: for djamin
    'djamin',
    'django.contrib.admin',
    ...
]
```
これだけ。

# 管理サイトを起動
## デフォルトの管理サイト(Home)
比較のため djamin 適用前のデフォルトの管理サイト

![通常_admin_.png](https://qiita-image-store.s3.amazonaws.com/0/112763/5707959c-6709-32f2-b9e7-997885d0d6f6.png)

## djamin 適用後の管理サイト(Home)
とてもサッパリしてます。G Suite 関連のアプリ開発で使えるかも。

![djamin_admin.png](https://qiita-image-store.s3.amazonaws.com/0/112763/e3ef3ac0-2ef5-dd2d-9106-caefa945e030.png)

レスポンシブ非対応は残念。

# ライセンス
BSD 3-clause 

ライセンスについて「文章少なめで分かり易い」ので拝見してる情報。
- [たくさんあるオープンソースライセンスのそれぞれの特徴のまとめ](http://coliss.com/articles/build-websites/operation/work/choose-a-license-by-github.html)
- [商用利用できるオープンソースライセンスはけっきょくどれで何をすればいいのか？](https://qiita.com/0xfffffff7/items/efbb65521d7708f2db7d)
GCPの無料枠では暗号通貨の利用はできないので注意してねというお話

##事の発端
ある日BlockStreamのショップの支払いにlightning networkが対応したよという話を聞いたり, mainnetでの利用がはじまってきたようなので試してみるかと思い立った.自宅の回線がクソなのでVPSにやることにして, その時に選んだのがGCP(Google Cloud Platform)だったわけです.

##[Google Cloud Platform](https://cloud.google.com/?hl=ja)
Googleによるクラウド上で提供するサービス群. 今回はCompute EngineのVMインスタンスを使ったが, 他にも大量のサービスがある. はじめに$300もの無料枠がもらえる. 太っ腹.

#Lightning Network
bitcoinなどの仮想通貨をトラストレスなままオフチェーンで送金する技術. payment channelを閉じたときのみチェーンに書き込むので処理がとても早く, 送金手数料も安い. ここでは細かいことは割愛.
https://github.com/ElementsProject/lightning
https://zoom-blc.com/lightning-network

##どうなったか
一日かけてbitcoinのブロックのダウンロードを終え(testnetなので一日で済んだ), lightningdのビルドも終えてnode infoを見てみると"address":[]となっていて空. ポートも開けてGCPのファイアーウォールはずしても空. そこでよくよく規約を見てみると. 

>制限される操作
>無料トライアルでは一部の操作ができません。たとえば、無料トライアルの期間中は、Google Cloud Platform サービスを使用して暗号通貨を利用することはできません。

なる文言がありました〜
ST_AsMVTを使ってベクタータイルが作れるか？（原因判明？）

## これまでのあらすじ

これまでの経緯は下記にあります。
https://qiita.com/R_28/items/54236fe1a78dd77872f5

## 原因

データベースに格納されている**座標系の問題**だった可能性が高い。
試しにジオメトリをSRID3857（球面メルカトル座標系）に変換せず、SRID4612（地理座標系）のままのデータベースを作成して
ベクタータイル化を試みた

SRIDについて
https://qiita.com/yellow_73/items/b98d3d1ef3abf7299aba


```sql:sample.sql

SELECT ST_AsMVT(q, 'rdcl', 4096, 'geom') 
FROM (
	SELECT
    	rdctg AS c1,
    	ST_AsMVTGeom(
            ST_LineMerge(ST_Collect(geom)),
            st_makeenvelope(tile2lon(58306,16), tile2lat(25693,16), tile2lon(58307,16), tile2lat(25694,16), 4326) ,
            4096,
            0,
            true) AS geom
    from (
        SELECT rdctg,(ST_Dump(geom)).geom from rdcl WHERE geom && st_makeenvelope(tile2lon(58306,16), tile2lat(25693,16), tile2lon(58307,16), tile2lat(25694,16), 4326) 
    ) a GROUP BY a.rdctg
) as q
    

```

便宜上、今回はST_Simplifyを行っていない。
メルカトル座標と緯度経度だと閾値の単位が異なり、比較しにくいので省略。
tile2lonとtile2latについては下記を参照
https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#PostgreSQL


![image.png](https://qiita-image-store.s3.amazonaws.com/0/13360/a4b64ba1-73a8-9c8e-a71a-10b83785c77e.png)

赤：simple-vectorizerで作成したジオメトリ
黒：ST_AsMVTで作成したジオメトリ

ぴったり。

## まとめ

ST_AsMVT、ST_AsMVTGeomについては地理空間座標系のジオメトリを使用する必要がありそう。

地理空間のジオデータベースの場合メルカトルに変換しなくてよいので、データベース運用についても見直せそう。

※関数仕様とかに記載がないか探してみましたが、見つからなかったので、見つけたら載せます。
パッケージ名をもとにファイルを検索する ~Go言語~

# package名の一覧表示
Goを書いているときにpackage名の一覧が欲しくなったので、コマンドを書いてみました。
カレントディレクトリ配下のGoのソースからpackage名を一覧表示します。
(最後はお決まりのpecoへパイプ。不要な人は消して使ってください。)

```bash
find -type f -name "*.go" | xargs grep "^package" | awk '{print $2}' | sort | uniq | peco
```

# package名からファイルを検索
package名の一覧を取得できたら、そのpackageに含まれるファイルを検索したくなったので、コマンドを書いてみました。

```bash
find -type f -name "*.go" |xargs grep -l "^package $(find -type f -name "*.go" | xargs grep "^package" | awk '{print $2}' | sort | uniq | peco)" |
peco
```
XcodeのInstrumentsのTime Profilerを使って重たい処理を調べる

# 環境
- Xcode 9.2
- Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2)

# はじめに
- パフォーマンス改善を行うときにTime Profilerを使ったのでそのときに行ったことをまとめて見ました

# Time Profilerとは
>実行中のプロセスについて、オーバーヘッドの小さい時間ベースのサンプリングを実行します。OS XまたはiOSで利用できます。

# 使い方
## Xcode > Open Developer Tool > Instrumentsから開きます

<img width="486" alt="スクリーンショット 2018-01-22 21.59.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/63985/2ff04da8-b3a8-c2e8-0ddb-444677006d7b.png">

## Time Profilerを選択する
<img width="770" alt="スクリーンショット 2018-01-22 22.03.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/63985/03e9b238-6c21-994a-78f3-c476d4ebba38.png">

## 端末かSimulatorを選択して　Recordボタンを押すと計測が開始される
<img width="502" alt="スクリーンショット 2018-01-22 22.06.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/63985/5c1c0e0d-2bb3-33ed-8922-cc8ab591fcd9.png">

## 計測された処理が表示されます
<img width="856" alt="スクリーンショット 2018-01-22 22.26.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/63985/532aaab7-8d5d-81f1-3a4d-6c8a7f83ed70.png">

## Call Treeで設定を変えることで表示される情報が変わります
- 重い処理を特定する為に設定を変更して絞り込みます
<img width="474" alt="スクリーンショット 2018-01-22 22.28.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/63985/5f68722c-1b01-0fdd-8f02-3acab2c70eaa.png">

## メソッドをダブルクリックすると実装したコードへジャンプできます
- コードへジャンプすることで重い処理の中からさらに詳しくみることができます

#### viewDidLoad()
<img width="1060" alt="スクリーンショット 2018-01-22 22.30.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/63985/f45cdf4d-596e-5721-4d45-a892b107fd7a.png">

#### test()
<img width="1006" alt="スクリーンショット 2018-01-22 22.37.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/63985/19ac4991-12dc-a299-7ecb-0ce11a8d0eda.png">

#### test2()
<img width="1270" alt="スクリーンショット 2018-01-22 22.36.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/63985/30ff3029-4498-3b45-2576-228ca8594d4e.png">


# サンプルコード
```swift
import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        test()
        test2()
    }
    
    private func test() {
        var list = [String]()
        for i in 0...10000 {
            list.append(i.description)
        }
        
        let text = list.joined(separator: ",")
        print(text)
    }
    
    private func test2() {
        var list = [String]()
        for i in 0...100000 {
            list.append(i.description)
        }
        
        let text = list.joined(separator: ",")
        print(text)
    }
}
```

# まとめ
- Time Profilerを使いこなすことで重たい処理を特定し、パフォーマンス改善につなげることができました

## 参考リンク
- [「Time Profiler」instrument](https://developer.apple.com/jp/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/Instrument-TimeProfiler.html)
- [「Time Profiler」プロファイリングテンプレート](https://developer.apple.com/jp/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/ProfilingTemplates.html#//apple_ref/doc/uid/TP40004652-CH19-SW12)
mongoDBのaggregateで積み上げグラフのデータを作る

```
{ _id: aaaa, month: 1, count: 10 }
{ _id: bbbb, month: 2, count: 20 }
{ _id: cccc, month: 3, count: 5 }
{ _id: dddd, month: 4, count: 50 }
{ _id: eeee, month: 5, count: 15 }
{ _id: ffff, month: 6, count: 10 }
```
こんなドキュメントがあったとして、1月からの累積countを各月ごとに出したい場合を想定します。

```
db.example.aggregate([
  {
    $group: {
      _id: null,
      counts: { $push: { month: "$month", count: "$count" } },
      month: { $push: "$month" }
    }
  },
  {
    $unwind: "$month"
  },
  {
    $project: {
      month: 1,
      count: {
        $reduce: {
          input: "$counts",
          initialValue: 0,
          in: { 
            $add: [
              { $cond: { if : { $gte : [ "$month" ,  "$$this.month" ]},  then :  "$$this.count" ,  else : 0 } },
              "$$value"
            ]
          }
        }
      }
    }
  }
  }])
```
このクエリを実行すると次のように返ってきます

```
{ month: 1, count: 10 }
{ month: 2, count: 30 }
{ month: 3, count: 35 }
{ month: 4, count: 85 }
{ month: 5, count: 100 }
{ month: 6, count: 110 }
```

ポイントは一度```$group```で全てをまとめてから、```$unwind```でバラすことでmonthごとに配列を持ったドキュメントを作成していることです。

aggregateでできることを全て把握してはいないのでもっと上手い方法があればどなたかお教えください。。。
NetworkX の有向グラフをプロット（netgraph)

こんにちは。
networkx の有向グラフをプロットして見ました（図1）。
また[netgraph](https://github.com/paulbrodersen/netgraph) というものを見つけたので、こちらもプロットして見ました（図2）。矢形が小さいことが少し気になりますが（デフォルト？）。


<img width="260" alt="networkx.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/54617/1952b47d-caf0-11c0-abf7-a9541f62445e.png">

<img width="260" alt="nxgraph.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/54617/c9b07c90-8e4c-4271-b60c-e5ab91e0d716.jpeg">

```networkx_draw.py
import matplotlib.pyplot as plt
import networkx as nx
n = 5
edges = [(i, (i+1)%n) for i in range(n)]
edges.append((1,0))
G = nx.DiGraph()
G.add_nodes_from(range(n))
G.add_edges_from(edges)
nx.draw_networkx(G)
plt.show()
#
import netgraph
netgraph.draw(G, draw_arrows=True, node_size=7, node_labels=dict([(n,n) for n in G.nodes()]))
plt.show()
```

```console
$ pip install netgraph
```
Boschのスマートフォン連携ソリューション「mySPIN」


スマートフォンと自動車や二輪車の連携ソリューションとして一部で話題のmySPINを調査してみた

# mySPINとは

<img width="399" alt="スクリーンショット 2018-01-22 23.23.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/47064/77b7016f-78f3-9e8d-55c1-7ef998a271b3.png">


車載ディスプレイに、スマートフォンで得られる情報を表示させて操作するボッシュの スマートフォン統合ソリューション
 mySPINはiOSとAndroidスマートフォンをサポート

# 概念

![concept](http://www.bosch-softtec.com/images/Infographics_mySPIN_1_734.png)

1. Android,iOSをサポート
1. OEMごとにアプリを管理できる
1. アプリ開発期間の短縮と世界展開できる
1. 自動車の利用状況を蓄積

# できること

- スマートフォンアプリから車載のディスレプイに表示
- Apple CarPlay, MirrorLink, and Android Autoをサポート
- 自動車メーカーがインストールするアプリを管理することができる（ホワイトリスト形式）
- 車載のディスプレイの解像度や縦横比に最適化して表示
- GPSやハンドルなどのイベントを取得で操作
- 音声を出力
- 二輪車にも対応

# 利用方法

1. OEM毎のAndroid,iOS用の専用Launcherアプリをインストール
1. mySpin対応アプリをインストール
1. スマートフォンと車載ディスプレイとの接続はケーブルが必要（将来は不要になるらしい）

# 対応メーカー

- Land Rover
    - Land Rover InControl Apps
- Jaguar


# リンク

- http://www.bosch-softtec.com/myspin.html
- https://www.linkedin.com/pulse/mirrorlink-myspin-smart-device-link-opencar-thomas-schulte-hillen/
processing.jsでJSONファイルを扱えるようにした

# 何をしたのか
- processing.js(以降pjsと表記)でJSONファイルを標準で扱える関数が存在しなかったので、それらの処理を実装したpdeファイルを作成した。
- プログラムはここからダウンロードして下さい → [OriginalJSONUtility](https://github.com/Gamu2059/OriginalJSONUtility)

# 経緯
- processingにはJSONを扱う関数があるのにpjsにはない。
私はJSONを扱うスケッチファイルを両方の環境で実行できるようにしたかったのですが、これでは環境によって処理を分けなければならないのでちょっと困りました。
- そこで同一のスケッチで両方の環境でJSONファイルを扱えるようにしました。

# 注意
- processing3、pjs v1.4.8で実行することを想定しています。それ以前のバージョンで動作することは確認しておりませんので自己責任でお願いいたします。
- pjsでSave系メソッドを実行しても、JSONファイルが保存されていないように見える場合がありますが、pjsの仕様によってファイルはブラウザに保存されます。ブラウザでの保存先については、各ブラウザのローカルストレージの保存先を調べて下さい。
（ａ＝＝１＆＆ａ＝＝２＆＆ａ＝＝３）をtrueにするRubyスクリプト

```rb
（ａ＝＝１＆＆ａ＝＝２＆＆ａ＝＝３） = true

puts （ａ＝＝１＆＆ａ＝＝２＆＆ａ＝＝３）
```

[(a == 1 && a == 2 && a == 3) を常に真にできますか？](https://qiita.com/Morichan/items/4894d7d92ecab7a3afd8)という記事に対する答え？

こんなネタですみません。このためだけにRubyをインストールしました。

解説しておくと、```（ａ＝＝１＆＆ａ＝＝２＆＆ａ＝＝３）```は全部全角なので一変数です。ちゃんとtrueになります。Rubyのシンタックスハイライトつけたら思いっきり赤線引かれている件。

全角文字の変数名に対応している言語ってrubyのほか知らなかったのですが、意外と多いらしいですね。

ネタ記事が伸びて焦っているのですが[ちゃんと解いたのもあります](https://qiita.com/aimof/items/abc8a5859c928b198dfc)。
Java8のStreamAPIでwhile文と同等の処理を書きたかった話


例えば、ある起点日( ``` startYmd ``` ）から5日ずつ日付を進めていって、Todayを超えたタイミングの日付を求めるような場合、

```java
LocalDate ymd; // 起点日

while (ymd.isBefore(LocalDate.now())) {
    ymd = ymd.plusDays(5);
}

System.out.println(ymd); // 起点日から5日ずつ進めてToday以降になる最初の日
```

と書きますよね。


なんとなく最近 ``` while文 ``` って書かないなーって思って ``` StreamAPI ``` で書こうと思ったわけです。
あ、Java9に ``` Stream#takeWhile ``` があるのはわかったうえでJava8で、といった話です。


で、できたのがこのコード。

```java
LocalDate startYmd; // 起点日

Stream.iterate(startYmd, ymd -> ymd.plusDays(5))
    .filter(ymd -> !ymd.isBefore(LocalDate.now()))
//    .sorted()　← これがあると無限ループ！！
    .findFirst()
    .ifPresent(ymd -> {
        System.out.println(ymd); // 起点日から5日ずつ進めてToday以降になる最初の日
    });
```

コメントを頂いてからだいぶ経ってしまいましたが修正しました。
ステートフルな中間操作である ``` sort() ``` が無限ループの原因だったようで、当時は勉強不足甚だしい状態でした…
（ちなみに ``` filter() ``` の評価も逆でしたよね…orz）

~~はい。無限ループです。~~
~~無限Stream VS ``` Stream#filter ``` という無謀な戦いを挑んだ僕がバカでした。~~

~~無限ループを回避しようとすると~~

```java
LocalDate startYmd; // 起点日

Stream.iterate(startYmd, ymd -> ymd.plusDays(5))
    .limit(ChronoUnit.DAYS.between(startYmd, LocalDate.now())) // ÷5+1してもいいけど...
    .filter(ymd -> ymd.isBefore(LocalDate.now()))
    .sorted()
    .findFirst()
    .ifPresent(ymd -> {
        System.out.println(ymd); // 起点日から5日ずつ進めてToday以降になる最初の日
    });
```

~~みたいな感じになり、本来の目的は何なのか？なコードになってしまいます。~~


## 結論
~~Java8 では ``` while文 ``` を使え！！~~
やっぱり ``` StreamAPI ``` って使ってて楽しいよね！！

## 蛇足
ちなみに、 ``` Stream#takeWhile ``` 的な動きを実現してくれるライブラリはあるのでそれを使ったり、 ``` TakeWhile ``` クラスを作って類似な動きをさせることはできるので自由度が高い開発ではやってみてもいいかも？
Nuxt.JSをNetlifyで公開しようとするとビルドできない問題をなんとかする

最近のVue界隈の記事で気になっていていたNetlifyでのデプロイを試してみました。

# Nuxtがv1をリリースしたせいか、Netlifyのビルドでこける
NetlifyのNodeのバージョンが低いためにビルドが失敗してしまいます。
これはNetlifyのNodeのバージョンが上がるまで、どうしても解決できない問題なので回避策を模索しました。


[こちらのブログ](http://kitak.hatenablog.jp/entry/2018/01/11/012126)ではdistディレクトリをgitのリポジトリに入れてしまうことを実践しています。
しかしdistのディレクトリをリポジトリに入れることはどうしてもやりたくないことでした。
なのでこの方法以外に何とか解決できる方法がないかを探りました。

# 2018/2/8 追記
そんな対応してないわけないよな～とは思っていたのですが、サイトに掲載されていることに気づきました。
https://www.netlify.com/docs/continuous-deployment/#build-environment-variables

> NODE
> You can set the Node.js version we use to build your site in two different ways:

> Add a /.nvmrc to your repository. This will also tell any other developer using the repository which version of Node.js it depends on. You can either set a specific version or just have a major version in the file, like the number 6 for the latest version of node 6.x
Set a NODE_VERSION environment variable. You can set this as a variable in the build environment either while linking the repository or afterward from the site settings screen in our UI. The value inside can be anything you would use with nvm.

ということで、私はbuild settingにNODE_VERSIONを追加しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/24049/8e3daa6e-bf86-a550-d29c-d124ae87e25c.png)

NodeのバージョンはローカルのNodeのバージョンと合わせるのが最善でしょう。
そしたらビルドできました！

# 以下は過去の記事ですが、こういう方法でも今後もいけるでしょう。

## **push-dir**でdistのみを別ブランチにpushできる！
結論としてはdistディレクトリのみを**push-dir**というライブラリを使って、Githubの別ブランチとしてプッシュすることで、マスターブランチで管理することなく、公開をすることができました。
  
``` console
npm i --save-dev push-dir
```
 
``` package.json
"scripts": {
  ...
  "generate": "nuxt generate",
  "deploy": "nuxt generate && push-dir --dir=dist --branch=release --cleanup"
},
```

``` console
npm run deploy
```

push-dirはNuxt.jsがGithub pagesで公開するためのTipsとして載せているライブラリです。
https://ja.nuxtjs.org/faq/github-pages/

Github Pagesでの公開もありだとは思いますが、必ずリポジトリ名が一階層の別のディレクトリとなってしまい、ちょっと設定が面倒くさくなってしまうため一度試してみたものの、Nuxt.jsとの相性は良くないように思います。

## Netlifyの設定
Netlifyのビルドの設定は切って下さい。また、publish directoryの設定も切ってください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/24049/078e24c5-2c9c-7e61-6b1d-d9ba5adc81ad.png)

## 一瞬ハマった点
Gitの状態が空でないとエラーで怒られるというのに微妙にハマりました。

Git not clean

と出たら、このライブラリが出してるGitの状態が空ではないというエラーです。
後々考えれば、そのまんまの通りの意味なのですが、初回はどこで何が悪さしてるのかわからず、ちょっと悩みました。

ライブラリのソースコードを読んで理解できました。
`git status --porcelain` が空じゃないときにこのメッセージが出るようです。
このコマンドを打って該当のファイルをどうにかしたらうまくいきました

## 非公開リポジトリをデプロイする際にも使えそう
この方法の利点としてはもし非公開リポジトリで開発していたとしても、Githubにビルドした結果のみをプッシュするリポジトリを作ってしまえば、Netlifyと組み合わせて静的サイトを無料で配信することができるということになることです。 

```
git remote add release http://github.com/userhoge/hogehoeghoge.git

push-dir --remote=release --dir=dist --branch=release --cleanup
```
生のコードのpush先を間違えることには十分気をつけてください。

## おわりに
言い忘れていましたが、この方法は静的サイトの公開のみに対応しています。
なんだか小さいアプリを作っていると結局SSRいらんやんて事が多いです。
SSR抜きにしてもNuxt.jsはめっちゃ便利。

Netlifyのバージョンが上がってくれれば、公開リポジトリに関してはこんなことをする必要はなくなります。
しかしながら、非公開リポジトリに対しても手軽に公開できる環境を用意できるのはなかなか良さそうです。
vuexのボイラープレートをbabelで飛び越えろ！ -> s2sを使ってソースコードからソースコードへのリアルタイムコード生成をしてみた、3歩目

# この記事は何？

[前回](https://qiita.com/shinshin86/items/263c0f5c914d7f8d41d8)の記事で作成してみた、自作したbabel pluginを用いて、[s2s](https://github.com/akameco/s2s)でのコーディングタイムコンパイルを試してみました。


なお、自身が今回のポストでやろうとしていることの内容については、下記のQittaポストを参照ください。
私はこれらの記事を見て、コーディングタイムコンパイルに魅了され、babel pluginを自身でも書いてみようと思い立ったのでした。

[さよならボイラープレート。s2sによる高速reduxアプリケーション構築](https://qiita.com/akameco/items/e1489c6bbf3439ec6ca4#_reference-9ad14c81c2d75fbb0c12)

[これからの時代のメタプログラミングJavaScriptの正義を語ろう](https://qiita.com/erukiti/items/0c6154e7ca7ad51f19ff#_reference-627bd7ec811ee141820c)

# 実際に作ってみたサンプル


![sample](https://github.com/shinshin86/try-s2s-vuex-201801/blob/master/gif/s2s_vuex_sample.gif?raw=true)

### 追記(テストコードの生成もできるようになりました)

テストコードは``mocha``を使う前提のものを生成します。

![sample](https://github.com/shinshin86/try-s2s-vuex-201801/blob/master/gif/s2s_vuex_generate_test_code.gif?raw=true)

# このgif動画の再現手順

再現するためのコードはGithubにあげています。

[shinshin86/try-s2s-vuex-201801](https://github.com/shinshin86/try-s2s-vuex-201801)

```bash
# githubからclone
git clone https://github.com/shinshin86/try-s2s-vuex-201801.git

# プロジェクトに移動
cd try-s2s-vuex-201801

# 依存関係インストール
yarn

# Atom起動(別にAtomじゃなくても良い)
atom .

# s2s起動
yarn run s2s
```



``try-s2s-vuex-201801/src/store``にある``mutation-types.js``を一旦削除し、
おなじく``index.js``内の記述をすべて削除した後、
``import { ADD, DONE, DELETE } from './mutation-types'``などとindex.jsに書いて保存するとs2s側で変更を検知し、コード生成を実施してくれます。


# 現状とTODO

まだ、実際に自身の書いたpluginを、s2s側から処理できるかを検証してみた段階なので、上記以外の手順でやるとエラーが出たり、二重でコードが生成されたりします。。。
あと、まずは実現優先でコード書き散らかしているので、コード汚いです。
**⇒二重生成については対応しました。追記に記載しています。**

後日、機能修正やコードを整えていきつつ、引き続きコード生成を体感していこうと思います。
いやーしかし、こうやって、実際にs2s使ってコード生成できるとテンション上がりますね。。。面白い！


## 追記：
二重でコードが生成されてしまう問題について対応しました

が、例えば``import { ADD, DONE } from './mutation-types'``を``import { ADD, DONE, DELETE } from './mutation-types'``に修正しても、``DELETE``だけが新たに追加されるというわけではなく(本当はこれを目指したい)、なにも変更は生じません。

再度修正したimport箇所を反映させるためには、一度生成している``state``, ``actions``, ``mutations``, ``getters``を削除した後、再度保存を実行し、新たにコードを生成する必要があります。
(自動生成される``mutations-types``側は勝手に修正されるので、修正を加える必要はありません)

ココらへんの制御を良い感じにやりたいのだけど、、、これについては今後の課題とします。