OmniAICreator/Qiita-1.07M huggingface dataset:
CoreDataのLightweight Migrationが行われるかどうかを検出する

### 概要

CoreDataの軽量マイグレーションが行われるかどうかを検出するスニペットをここに記載する。



CoreDataの軽量マイグレーションは、適切な準備が行われていれば
`NSPersistentStoreCoordinator`のインスタンスメソッド
`addPersistentStoreWithType`が呼ばれる際に自動的に行われる。

多くのアプリはアプリの起動時に上記メソッドの呼び出しを行っている

マイグレーションが短時間で終了する場合は問題ないが、20秒以上の時間がかかると、アプリの強制終了に巻き込まれてしまう。
それを防ぐために、マイグレーションが行われる前にマイグレーションが行われるかどうかを検出する。


```swift:willMigrate

    func willMigrate() -> Bool{
        // momdファイルのURL
        let modelURL = NSBundle.mainBundle().URLForResource("MigrateTrial", withExtension: "momd")!
        let managedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL)!
        //　データストアのURL
        let sqliteURL =
        self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite")
        
        // addPersistentStoreWithTypeに渡すものと同じものを渡す
        let options = [NSMigratePersistentStoresAutomaticallyOption: true,
            NSInferMappingModelAutomaticallyOption: true]
        
        // メタデータの取得
        let metadata = try! NSPersistentStoreCoordinator.metadataForPersistentStoreOfType(NSSQLiteStoreType,
            URL: sqliteURL,
            options:options
        )
        
        // マイグレーションが行われるかどうかを取得
        return managedObjectModel.isConfiguration(nil,compatibleWithStoreMetadata:metadata)

    }

```


今後使用されるmomdファイル(マイグレーション後の状態)と、既に存在するsqliteファイル(マイグレーション前の状態)のメタデータを比較しているのがポイント

参考情報
[[iOS][Mac] CoreData - マイグレーション[4] モデルファイルの構成](http://cocoadays.blogspot.jp/2010/12/iosmac-coredata-%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B34-%E3%83%A2%E3%83%87%E3%83%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E6%A7%8B%E6%88%90.html)
[[iOS][Mac] CoreData - マイグレーションが必要かどうかを知る](http://cocoadays.blogspot.jp/2011/02/iosmac-coredata.html)
[CoreData - マイグレーションを考慮した CoreDataManager パターン](http://cocoadays.blogspot.jp/2011/02/coredata-coredatamanager.html)
[Customizing the Migration Process](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmCustomizing.html#//apple_ref/doc/uid/TP40004399-CH8-SW2)
[Detecting a Lightweight Core Data Migration](http://stackoverflow.com/questions/3025742/detecting-a-lightweight-core-data-migration)
[metadataForPersistentStoreOfType](https://forums.developer.apple.com/thread/7555)
javascript override function

http://me.dt.in.th/page/JavaScript-override/

```js
var lala = function test(a,b){console.log(arguments)}
lala(1,2) //=>  [1,2]
```

http://stackoverflow.com/questions/10427708/override-function-e-g-alert-and-call-the-original-function

```js
(function() {
    var _alert = window.alert;                   // <-- Reference
    window.alert = function(str) {
        _alert("fuck you!");
    };
})();

alert("else");
```
no suitable image found.の対処


テストのためにXcodeで実機にアプリをインストールしようとしたら以下のようなエラーが出てスプラッシュ画面で止まってしまった。

```
dyld: Library not loaded: @rpath/...
Referenced from: /private/var/mobile/Containers/Bundle/Application/...
Reason: no suitable image found. Did find:
/private/var/mobile...
```

このエラーはいろいろ原因がある様子。

**1. CocoaPodsが原因**
[CocoaPodもgithubにissue](https://github.com/CocoaPods/CocoaPods/issues/3709)があっていろいろ回避方法とか情報がある。
でも自分はこれではなかった。

**2. provisioning fileの問題**
http://blog.misubo.com/article/106057305.html
最近provisioning profileを更新したりしたらこれにあたるのかも？でも自分はこれでもなかった。

**3. WWDR有効期限切れが原因**
自分はこれが原因だった。
キーチェーンアクセスを確認したらApple Worldwide Developer Relations Certification Authorityという証明書が切れている（偶然にも切れる当日で期限時刻前だったけど上記エラーが発生していた）。
そのWWDR証明書をキーチェーンアクセスから削除して、新しい証明書を以下からDLしてダブルクリックしてキーチェーンアクセスに登録。
https://www.apple.com/certificateauthority/
いくつかあるけど、Apple Intermediate Certificates>WWDR Certificateの期限が長いほうを使った。

で、Xcodeでcleanしてから再buildで解決。
Python 開発用サーバの構築手順（AWS + Anaconda）

# はじめに

今回は Amazon Web Service (AWS) 上に Python 開発用サーバを構築する。Python 環境の構築には Anaconda を利用し、IDE として Jupyter Notebook を利用する。

なお、筆者の環境は以下のとおり。

| 項目   | 内容                           |
|:------|:-------------------------------|
| マシン | MacBook Air 13-inch, Early 2015|
| OS    | OS X Yosemite 10.10.5          |
| Mem   | 8 GB                           |

# インスタンス作成

今回は以下の構成の EC2 インスタンスを作成する。

| 項目              | 内容                                             |
|:-----------------|:-------------------------------------------------|
| Region           | Oregon                                           |
| Instance type    | t2.small                                         |
| EBS              | 汎用 SSD 30 GB                                    |
| Security group   | Inbound = TCP:22 & 8888, Outbount = all, Anywhere |

# SSH の設定

以下の設定を `~/.ssh/config` に記述する（`~/.ssh/config`が無ければ新規作成）。`XXXXX.pem` は AWS で発行された秘密鍵ファイル。

```~/.ssh/config
Host (任意のホスト名を記述: ex. pydev)
hostname ec2-XXX-XXX-XXX-XXX.us-west-2.compute.amazonaws.com
identityfile ~/.ssh/XXXXX.pem 
user ec2-user
```

サーバにログインする。

```
$ ssh pydev
```

# 必要なソフトウェアのインストール

Git, tmux, Emacs などをインストール。

```
$ sudo yum -y install git tmux emacs gcc gcc-c++ python-setuptools python-devel postgresql-devel
```

以後は tmux 上で作業する。

```
$ tmux
```

# Anaconda 環境のインストール

以下のコマンドを実行する。

```
$ wget https://3230d63b5fc54e62148e-c95ac804525aac4b6dba79b00b39d1d3.ssl.cf1.rackcdn.com/Anaconda3-4.0.0-Linux-x86_64.sh
$ bash Anaconda3-4.0.0-Linux-x86_64.sh
$ source .bashrc
```

# Jupyter Notebook 環境の設定

以下のコマンドを実行する

```
$ jupyter notebook --generate-config
$ source activate root
$ ipython
In [1]: from notebook.auth import passwd

In [2]: passwd()
Enter password: XXXXXX
Verify password: XXXXXX

Out[2]: 'sha1:XXXXXXXXXXXXXXXXXXXXXXXXXXXX'
```

出力された 'sha1:XXXXXXXXXXXXXXXXXXXXXXXXXXXX' をメモしておく。

`~/.jupyter/jupyter_notebook_config.py` に以下の設定を記述。

``~/.jupyter/jupyter_notebook_config.py
...
c.NotebookApp.ip = '*'
...
c.NotebookApp.open_browser = False
...
c.NotebookApp.password = 'sha1:XXXXXXXXXXXXXXXXXXXXXXXXXXXX'
```

以下のコマンドで Jupyter Notebook サーバを起動する。

```
$ jupyter notebook &
```

`/etc/rc.local` に `nohup jupyter notebook &` を追記するとインスタンス再起動時にも自動的にJupyter Notebook サーバが起動する。

# ブラウザから Jupyter Notebook にログイン

ローカルのブラウザから `http://[サーバのホスト名 or IP]:8888/` にアクセスするとログイン画面が表示される。Jupyter Notebook 環境の設定で入力したパスワードを入力するとログイン出来る。

# おわりに

ここまでで AWS EC2 上に Python の開発環境が構築できた。現在の設定だとサーバのIPは再起動時に変わってしまうので、 Elasatic IP を利用して固定するなどするほうが良いだろう。マシンパワーが足りない際は、適宜インスタンスタイプを増強すればよい。

# 参考文献
* [Amazon Web Service (AWS)](https://aws.amazon.com/jp/)
* [Anaconda](https://www.continuum.io/why-anaconda)
* [Jupyter Project](http://jupyter.org)
FS01BU を Windows 10 (Home/Pro) で使う

#概要

[ソラコム](https://soracom.jp) が販売する富士ソフト(OMEGA)の3Gモデム(FS01BU)ですが、製品仕様上の対応OSは Windows 8&reg; までの対応となっています。
[FS01BU　製品詳細｜富士ソフト株式会社](http://www.fsi.co.jp/mobile/plusF/products/FS01BU.html)

こちらを Windows 10 で使えるようにしてみます。

#免責事項
本ドキュメントは as is で提供するものであり、本ドキュメントの内容、利用により蒙るいかなる損害についても保証するものではありません。また、記載内容に関する問い合わせ等を行われないよう、ご了承ください。
製品仕様（対応OS）が変更されるわけではないことについて理解した上で、作業を実施してください。

なお、
・Windows 10 Pro (64bit) をクリーンインストールした環境 （Lenovo ThinkPad X200s）
・Windows 8.1 Home (64bit) から Windows 10 Home にアップグレードした環境 （HP Stream Mini 200-020jp）
でそれぞれ動作を確認しておりますが、すべての環境で以下の手順が実現可能であることについてはお約束致しません。

#手順
##接続ソフト「FS01BU Data Connection Manager」のインストール
FS01BU を挿入すると、CD-ROM ドライブに見えます。
格納されているインストーラを使用して、接続ソフト「FS01BU Data Connection Manager」をインストールします。
デフォルトの設定のままインストールを実施して問題ありませんが、インストール先の情報は覚えておきましょう。
![fs01bu_01.gif](https://qiita-image-store.s3.amazonaws.com/0/95974/4b8c4edc-8713-363a-260e-ad7f5ee3bd3c.gif)

「インストール」ボタンを押すと、ファイルがコピーされていきますが、インストールは失敗します。この画面自体は「OK」で閉じます。
![fs01bu_02.gif](https://qiita-image-store.s3.amazonaws.com/0/95974/1cd6217b-17ff-5081-2327-b400bb53ffef.gif)

この後、手動でドライバをインストールしますが、現状使っている Windows の OS が32ビットか64ビットか確認しましょう。分かっている方は飛ばしてください。
![fs01bu_03b.gif](https://qiita-image-store.s3.amazonaws.com/0/95974/e4a39186-35f1-ee28-9e1d-3b3f55f56c3f.gif)

先ほど、接続ソフト「FS01BU Data Connection Manager」をインストールした HDD 内のインストール先フォルダ配下にドライバがコピーされています。OS 毎（32bit/64bit）にフォルダが作成されていますので移動します。
手元の環境では 64ビット OS になっていますので、Windows 7 (64 ビット版) のドライバを使ってみることにします。
（上記の場合、C:¥Program Files (x86)¥FS01BU Data Connection Manager¥Driver¥Win7_64）
![fs01bu_04.gif](https://qiita-image-store.s3.amazonaws.com/0/95974/93972270-c9e9-1d0a-3ef4-c75f9906f4af.gif)

上記のフォルダ内の「cmnumdm(.inf)」と「cmnuser(.inf)」をそれぞれ右クリックし「インストール」を選びます。
![fs01bu_05.gif](https://qiita-image-store.s3.amazonaws.com/0/95974/8c793fc7-080f-8ed0-7ce5-e949296326e7.gif)

UAC（ユーザーアカウント制御）はそれぞれ許可すると、この操作を正しく終了しました。というメッセージが出ます。
![fs01bu_06.gif](https://qiita-image-store.s3.amazonaws.com/0/95974/668b887c-1f84-69c5-8d1c-943b010bbafa.gif)

「cmnumdm(.inf)」と「cmnuser(.inf)」のインストールが完了すると、デバイスマネージャーの「ポート（COM と LPT）」配下に FS01BU が現れました。使えそうです。
![fs01bu_08b.gif](https://qiita-image-store.s3.amazonaws.com/0/95974/b4b103a3-6c9f-eaaf-c8cf-7e529cacfde2.gif)

接続ソフト「FS01BU Data Connection Manager」を起動すると、アンテナピクトも表示され、端末を認識したようです。
![fs01bu_09.gif](https://qiita-image-store.s3.amazonaws.com/0/95974/9b9a5fdd-7f1f-4e3d-e07d-54a7870b2af0.gif)

以降、FS01BU Data Connection Manager の設定については割愛しますが、接続情報は SORACOM を利用する場合、ユーザ名: sora、パスワード: sora、APN: soracom.io、認証方式: PAP または CHAP、接続方式: IP です。

##接続・確認方法
接続ソフト「FS01BU Data Connection Manager」から接続します。
![fs01bu_12.gif](https://qiita-image-store.s3.amazonaws.com/0/95974/a2296781-392b-133d-50d9-7513a4d43f2b.gif)


いったん接続ソフト「FS01BU Data Connection Manager」をインストールしてしまえば、ダイヤルアップ接続等からも接続が可能ですので、Windows 10 (Pro/Home)でも FS01BU が使えるようになりました。
ご紹介した手順が「ちょっとだけ試したい」といった場合のハードルを低くすることに役立てば、嬉しく思います。
npm install -gでグローバルインストールしたのに見つけてくれない

# <i class="fa fa-cubes" style="font-size:1em;"></i> 問題
``npm install -g <module>``
であるモジュールをインストールしたのに実行時見つからないとエラーが出た。

# <i class="fa fa-cubes" style="font-size:1em;"></i> 実行結果

```
$ npm install -g request
request@2.72.0 /home/vagrant/.nvm/versions/node/v0.12.4/lib/node_modules/request
├── is-typedarray@1.0.0
├── aws-sign2@0.6.0
├── oauth-sign@0.8.2
├── forever-agent@0.6.1
├── tunnel-agent@0.4.3
├── caseless@0.11.0
├── stringstream@0.0.5
├── isstream@0.1.2
├── json-stringify-safe@5.0.1
├── extend@3.0.0
├── node-uuid@1.4.7
├── combined-stream@1.0.5 (delayed-stream@1.0.0)
├── qs@6.1.0
├── tough-cookie@2.2.2
├── mime-types@2.1.11 (mime-db@1.23.0)
├── aws4@1.3.2 (lru-cache@4.0.1)
├── form-data@1.0.0-rc4 (async@1.5.2)
├── bl@1.1.2 (readable-stream@2.0.6)
├── http-signature@1.1.1 (assert-plus@0.2.0, jsprim@1.2.2, sshpk@1.8.3)
├── hawk@3.1.3 (cryptiles@2.0.5, sntp@1.0.9, boom@2.10.1, hoek@2.16.3)
└── har-validator@2.0.6 (pinkie-promise@2.0.1, commander@2.9.0, chalk@1.1.3, is-my-json-valid@2.13.1)

$ node getall.js 
module.js:338
    throw err;
    ^
Error: Cannot find module 'request'
    at Function.Module._resolveFilename (module.js:336:15)
    at Function.Module._load (module.js:278:25)
    at Module.require (module.js:365:17)
    at require (module.js:384:17)
    at Object.<anonymous> (/vagrant_data/p062/getall.js:2:15)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
```

# <i class="fa fa-cubes" style="font-size:1em;"></i> 調査
**Node.js実行時にモジュールを探すパス**①に**グローバルインストールしたモジュールが格納されるディレクトリ**②が追加されていない場合にこうなるらしいことがわかった。

### ①の確認方法
```
$ node -e "console.log(global.module.paths)"
[ '/vagrant_data/p062/node_modules',
  '/vagrant_data/node_modules',
  '/node_modules' ]
```

### ②の確認方法
```
$ npm root -g
/home/vagrant/.nvm/versions/node/v0.12.4/lib/node_modules
```

# <i class="fa fa-cubes" style="font-size:1em;"></i> 解決方法

ホームディレクトリにある``~/.bash_profile``にグローバルなパスを追加する

```
echo export NODE_PATH=$(npm root -g) >> ~/.bash_profile
source ~/.bash_profile
```
mysql 、現在利用してるデータベース名を表示する

# データベースを選択する
`use database_name`
　mysqlで、複数のスキーマから、上記のコマンドでデータベースを選んで、入ることができます。

# 接続中のデータベースを調べる
　作業中で、自分がどこのデータベースに入ったかが分からなくなる場合がありますので、その時に、下記のコマンドで、接続中のデータベースを表示できます：
`select database();`
オレオレ型定義管理からTypingsに移行してスッキリする

今まで
====

今までは [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped/) を Git submodule で丸ごと取得し、インポート用の *.d.ts を手書きしていました。

プロジェクトの構成はこんな感じです。

```

+-- src
| `-- (ソースコード)
+-- typings
| +-- DefinitelyTyped (Git submodule)
| +-- browser.d.ts (フロント用型定義)
| +-- main.d.ts (サーバー用型定義)
| `-- test.d.ts (テスト用型定義)
+-- .gitmodules

```

実際にはこれに package.json やら gulpfile.js やらビルド時に生成されるファイルやらが加わります。

このパターンはわりと有用でそこそこうまく回っていました。具体的には;

* 型定義が丸ごと手元に落ちてくるので新しい型定義を追加する手間が少ない
* Git の一機能に乗っかるので、発展途上なTypeScriptのツールに振り回されない

が、しばらく回しているうちに状況が変わってきました。一番の大きな要因は型定義のツールとして [tsd](https://github.com/DefinitelyTyped/tsd) が deprecate されて **[Typings](https://github.com/typings/typings)** が推奨され、いい感じに流行りだしていることです。また、 DefinitelyTyped は巨大になりすぎて Git submodule で落としてくるにはちょっと大きすぎるのがボトルネックになってきました。

これから
====

オレオレ型定義のイマイチさを Typings に移行することで払拭できそうなのでまるっと移行してみました。

移行後のプロジェクトはこうなります。

```

+-- src
| `-- (ソースコード)
+-- typings.json

```

スッキリ。

自前のテンプレートの移行に関わる差分
https://github.com/progre/template-typescript/commit/fa1b8272d1054055dc9d13d80bb53f2801f958b7

移行してよかった点は;

* チェックアウト～フルビルドが30秒近く短縮 ([1分半](https://travis-ci.org/progre/template-typescript/builds/127159734)→[1分](https://travis-ci.org/progre/template-typescript/builds/128184940))
* コマンドラインがこなれていて新しい型定義の導入があまり苦にならない
* 使っている型定義だけがファイルツリーに現れるので、エディターで型定義を参照しにいってもツリーが汚れない

今までと変わった点は;

* 型定義を直接修正→ fork したリポジトリに push → pullreq ができなくなった
    * Typings は fork したリポジトリから型定義を取得できるので、 fork したリポジトリの型定義を修正→ Typings で取得 & pullreq 作成 という流れに変わりました
* main.d.ts browser.d.ts で依存ライブラリを分けることができなくなった
* test.d.ts でテスト用の依存ライブラリを定義することができなくなった
    * [Code](https://code.visualstudio.com/) だと開発中はどのみち型定義が混ざってしまっていたのでなくなっても困りませんでした

まとめ
====

まとめると、以下のことにつらみを感じている方は Typings への移行をおすすめします;

* 型定義の収集のつらみ
* 発展途上のツール（ tsd へのトラウマを含む）のつらみ
* DefinitelyTyped へのコントリビューションと現行の開発との両立のつらみ
UIKeyboardDidShowNotificationが上がってきているのにキーボードが開かないことがある話

#始めに
`NSNotificationCenter` に
`UIKeyboardWillShowNotification`と `UIKeyboardDidShowNotification` を登録し
両方の通知がちゃんと上がってきているのにソフトキーボードが開かないことがあったので
そのとき調べたことを書く。

#コード
```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let textField = UITextField(frame: CGRect(x: 100, y: 100, width: 50, height: 30))
        textField.backgroundColor = UIColor.redColor()
        view.addSubview(textField)

        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.keyboardWillShow(_:)), name: UIKeyboardWillShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.keyboardDidShow(_:)), name: UIKeyboardDidShowNotification, object: nil)
    }
}

extension ViewController {
    func keyboardWillShow(notification: NSNotification) {
        print("willShow1")
        view.endEditing(true)
        print("willShow2")
    }

    func keyboardDidShow(notification: NSNotification) {
        print("didShow")
    }
}

```

#結果
これを実行し、`textField`にフォーカスを当てると以下のように出力される。

```
willShow1
didShow
willShow2
```

#考察
`UIView.endEditing`を呼ぶと、即座に`UIKeyboardDidShowNotification`の通知が上がってくるらしい。実際にはキーボードは表示されてないのに。
(Frameworkの整合性、という問題で仕方ないんだとは思うけど。)

今回のようにわかりやすい場合はすぐ気付くが、`keyboardWillShow()`から呼んでいるメソッドの奥深くで`View.endEditing`を呼んでいる、みたいなことがあると気付きづらい気がする。
(作り的にどうなんだ、って話は別にして。)

#終わりに
`NSNotificationCenter`の通知が同期なことに違和感あるの僕だけでしょうか。
GitHubの検索結果からGreenkeeperを取り除いて検索する

[Greenkeeper](https://greenkeeper.io/ "Greenkeeper")という依存するモジュールがアップデートされたら自動で更新するPull Requestを出すサービスがあります。

- [自動でnpmライブラリをアプデ&プルリクしてくれるサービスのgreenkeeperがすごく便利だった - Qiita](http://qiita.com/itkrt2y/items/c0e77a4e3cda173917bb "自動でnpmライブラリをアプデ&amp;プルリクしてくれるサービスのgreenkeeperがすごく便利だった - Qiita")

例) [Update textlint-rule-no-mix-dearu-desumasu to version 2.0.1 🚀 #12](https://github.com/azu/textlint-rule-preset-japanese/pull/12 "Update textlint-rule-no-mix-dearu-desumasu to version 2.0.1 🚀 #12") 

便利なのですが、GitHubで「ライブラリ名」を検索した時にこのPull Requestばかりがかかるようになってしまいかなり邪魔になります

例) [Search · textlint](https://github.com/search?o=desc&q=textlint&s=updated&type=Issues&utf8=%E2%9C%93 "Search · textlint")

これを検索結果から取り除くには、`-author:greenkeeperio-bot`を付けてGitHub検索する方法があります。

例): [Search · textlint -author:greenkeeperio-bot](https://github.com/search?o=desc&q=textlint+-author%3Agreenkeeperio-bot&ref=searchresults&s=updated&type=Issues&utf8=%E2%9C%93 "Search · textlint -user:greenkeeperio-bot")

GitHubはこういった検索演算子が大量にあるので以下のドキュメントを読むと色々おもしろいかもしれません。

- [Searching GitHub - User Documentation](https://help.github.com/articles/searching-github/#types-of-searches "Searching GitHub - User Documentation")

(このbotによるPRの問題は、botアカウントをデフォルトで区別して検索できると良い気がするのだけど、github.comには[Machine users](https://developer.github.com/guides/managing-deploy-keys/#machine-users "Machine users")を明確に区別するものがなかった気がする)
rexdepで依存関係の抽出

# はじめに
慣れていない言語で書かれたプロジェクトや、途中から参加した巨大プロジェクト。
ソフトウェアの構造を短期間でおおまかに把握したい時ってありますよね。
そんな時に[rexdep](https://github.com/itchyny/rexdep)がオススメです。

# rexdepとは
Go言語で書かれた依存関係を抽出するためのツールです。
依存関係の形式(例：import "xxx")を正規表現で与え、
対象となるファイルを渡すと、依存関係の抽出を行った結果を返してくれます。

# 実際に使ってみた
iOSアプリの継続的デリバリーに使われる、rubyで書かれたライブラリfastlaneを読んでいたので、
その一部に対して使ってみました。
まず、cloneしてきて
`git clone git@github.com:fastlane/fastlane.git`

今回、対象とする場所へ移動
`cd fastlane/gym/lib`

ここで、rexdepを実行
`rexdep --pattern 'require (\S+)' --format dot ./**/*.rb | dot -Tpng -o gym.png`

すると、以下のように依存関係が図示されます。
requireに参照先までのpathが含まれているため、全て1階層で表示されてしまっていますが、
最初の取っ掛かりを得るのであれば、十分ではないでしょうか。
![gym.png](https://qiita-image-store.s3.amazonaws.com/0/33395/4e31b5d0-0d5b-be65-366e-74ad33240443.png)


# まとめ
完璧でないとはいえ、プロジェクト内の依存関係をおおまかに抽出して、最初の一歩を踏み出すには
十分すぎるほどの機能があると言えるのではないでしょうか。
READMEは英語で書いてありますが、作者の方のブログに、日本語で詳しい内容が書いてありますので、
そちらも参照してみてください。

あと、どなたかrubyの依存関係を抽出する良い方法があれば教えて下さい。。。

# 参考
- [汎用的なコードの依存関係の抽出ツール rexdep を作りました！ ― 正規表現で依存関係を大雑把に抽出しよう！- プログラムモグモグ](http://itchyny.hatenablog.com/entry/2015/11/19/100000)
- [rexdep - GitHub](https://github.com/itchyny/rexdep)
ImageMagickの脆弱性「ImageTragick」にサクッと対応する


## 脆弱性概要
|||
|:--|:--|
|脆弱性愛称|ImageTragick
|CVE|CVE-2016-3714<br>CVE-2016-3715<br>CVE-2016-3716<br>CVE-2016-3717<br>CVE-2016-3718
|重要度|Important

### 影響
convertコマンドでMVGファイルを読み込むと、MVGファイル内のコマンドが実行できてしまう。他サーバーへの踏み台として使われる。

**MVGを拡張子的に変えてても（JPGやPNG）実行される。**

## 対応方法
### 脆弱性検証スクリプト
```
git clone https://github.com/ImageTragick/PoCs.git
cd PoCs
./test.sh
```

ここで`UNSAFE`があると脆弱性有り。

### policy.xmlで対応
当方環境は`/usr/local/etc/ImageMagick-6/policy.xml`だったが、分からない場合は

```
find /usr | grep "policy.xml"
```

で検索してみるといいかも。
末尾にあたりに

```
<policymap>
</policymap>
```

があるので、そこの中に以下を追記する。

```
<policy domain="coder" rights="none" pattern="EPHEMERAL" />
<policy domain="coder" rights="none" pattern="URL" />
<policy domain="coder" rights="none" pattern="HTTPS" />
<policy domain="coder" rights="none" pattern="MVG" />
<policy domain="coder" rights="none" pattern="MSL" />
<policy domain="coder" rights="none" pattern="TEXT" />
<policy domain="coder" rights="none" pattern="SHOW" />
<policy domain="coder" rights="none" pattern="WIN" />
<policy domain="coder" rights="none" pattern="PLT" />
```

再起動等は必要ない様子。

### 対応できたか再検証
脆弱性スクリプトを再度実行

```
./test.sh
```

全てSAFEになっていることを確認。

```
[hoge@localhost PoCs]# ./test.sh
testing read
SAFE

testing delete
SAFE

testing http with nonce: eeEPmRsx
SAFE

testing rce1
SAFE

testing rce2
SAFE

testing MSL
SAFE
```

## 参考
- [ImageMagickの脆弱性(CVE-2016-3714他)についてまとめてみた - piyolog](http://d.hatena.ne.jp/Kango/20160504/1462352882)
- [ImageTragick](https://imagetragick.com/)
- [CVE-2016-3714 - Red Hat Customer Portal](https://access.redhat.com/security/cve/cve-2016-3714)
policy.xmlが使えない古いImageMagickでImageTragickを回避する (3)

第一話は[こちら](http://qiita.com/vaporoid/items/8ca56b0e4a40429d5a7e)。
第二話は[こちら](http://qiita.com/vaporoid/items/82a3dd044288bd2449e9)。

## 本当のMVGの話をしよう

[MVG](http://www.imagemagick.org/script/magick-vector-graphics.php)はMagick Vector Graphicsの頭字語で、PostScriptに似たなにかだ。PDFやSVGに似ているという向きもあるだろう。しかし、それらだってPostScriptに似たなにかである。

実際のところ、ImageMagickに組みこまれたSVG解析器はSVGをMVGに変換する。MVGの処理に脆弱性があったら、SVGの処理に波及する。[libRSVG](https://wiki.gnome.org/Projects/LibRsvg)を用いるようにビルドされていれば影響を受けない。

本質的にテキストファイルであるMVGを、ImageMagickはどのようにそれと判じるのか。ファイルの先頭に`push graphic-context`と書かれていたら、MVGであると[断ずる](https://github.com/ImageMagick/ImageMagick/blob/master/coders/mvg.c#L66)のだ。

## MSLはXMLって本当ですか？

[MSL](http://www.imagemagick.org/script/conjure.php)はMagick Scripting Languageの頭字語で、XMLで処理を書きつらねていくものらしい。DTDやスキーマを探したけれど、見つけられなかった。そんなものはどこにも存在しないのだろう。

SAXでXMLを解析している。[`MSLStartElement`](https://github.com/ImageMagick/ImageMagick/blob/master/coders/msl.c#L602)を読めば、どのような要素の出現が期待されているか判る。しかし、六千八百二十八行ある関数を読むには、黄金週間は短すぎる。

[`MSLEndElement`](https://github.com/ImageMagick/ImageMagick/blob/master/coders/msl.c#L7332)ならば九十八行である。`</comment>`, `</group>`, `</image>`, `</label>`, `</msl>`が解析されるようだ。

幸か不幸か、ファイルの中身からMSLを判別する魔法はない。ImageMagickはそれがMSLだと指示されたときに、それをMSLとして扱う。

## 奇跡も、魔法も、あるんだよ

なにがないかは先刻ご承知のとおり。

ImageTragickの緩和策として、入力が期待される画像形式かどうか、マジックバイトを検査してから、ImageMagickに処理を渡す方法が提案されている。ホワイトリストが定義可能であるならば、この方法は妥当である。

ホワイトリストが定義できなかったとしたら、しかし、どうだろう。ImageMagickがMVGまたはMSLとして処理する可能性を先だってつぶしてまわることになる。

1. ファイルの先頭に`push graphic-context`と書かれていたら、MVGとして扱われる。
2. 拡張子や擬似スキーマでMVGと指示されるならば、MVGとして扱われる。
3. 拡張子や擬似スキーマでMSLと指示されるならば、MSLとして扱われる。

全てのXMLを生まれる前に消し去りたい。
Apline Linuxで、(WAFの)SparkとPlayを起動

#Java8の方のSparkを、
[このエントリー](http://qiita.com/drafts/d15e3f60bff8806f193f/edit)で、Apline Linuxにgitやjava8を入れたついでに。

Apline Linuxで、[Java8ベースのWeb Application Framework(WAF)Spark](http://sparkjava.com/)を速攻起動させる例。
釣り記事っぽくなっちゃうけど、Scalaのsparkでなくて、あくまでのjava 8のね。

#gradlew(gradle)経由で導入。

※　gradlewの実行はbashベースなので、bashを入れておく。

```bash
apk --no-cache add bash
cd your/folder
git clone https://github.com/ajdevries/gradle-sparkjava-sample.git

cd gradle-sparkjava-sample
 ./gradlew run
```

ネットが速い環境ならば、1～2分くらいで、sparkが立ち上がるはず。その間に、virtualboxのポートフォワーディング設定をしておこう:

![gradlew.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/439bed74-b9cd-8cd9-6284-08b678eeb4d3.png)


以上。どちらかと言うと、gradlewエラいって話だね。

Java8のSparkの使い方は以下とかで。ちょっとしたお試しに使うと便利かな。
http://qiita.com/opengl-8080/items/801b32a8d44089fa1c04

#Play scalaも、なんとか、起動。

gradleと並行して、scalaのsbtの方も、裏で延々と走っていた(PlayFramework向け)。
長い時間かかって、、忘れかけた頃にplay 2.5も初回起動。
ちなみに、何度もメモリ不足か何かで落ちたので、JVMのパラメーターをいろいろ調整する感じで。
最終的には、Alpine Linuxへの割当メモリを増やし、sbt公式サイトの設定と同じくした時に、動作した:
> java -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:Max
PermSize=256M -jar ../sbt-launch.jar

...こちらは我慢強い人、推奨!?...起動後は別に遅くはないけど。

そのうちscala sparkも走らせてみるかも。

...Dockerコンテナ化とかは、その後、ぼちぼちお勉強する感じで。
tiqavを使い雑にSlackへ画像レスをするHubotスクリプト

# <i class="fa fa-cubes" aria-hidden="true"></i> 概要

一部界隈では画像レスという文化がありまして、
絵文字やスタンプのようにセリフ付き画像を貼り付けてレスを返します。
IT界隈でいうと[LGTM]画像などですね。
SlackではURL貼り付けで画像が表示されるので、

* 貼りたい画像検索→URL貼り付け
* 保存した画像のアップロード

ができますが、ちょっと面倒なのでレス画像サービスのAPIから雑に応答しようと思います。

GWはダラダラする派の人は食事も雑になったりするかと思いますが、プログラミングも雑になるのです。
今回は3分クッキングもビックリな雑コードで実現します。

# <i class="fa fa-code" aria-hidden="true"></i> コード

[レス画像検索No.1／画像会話なら ちくわぶ]を使わせてもらいます。

```coffeescript
	robot.respond /(?:ちくわ|チクワ|竹輪|(?:chi|ti)kuwa|tiqav?)\s*([^\s]+)/i, (msg) ->
		msg.send 'http://' + msg.match[1] + '.tiqav.com/'
```

私は関西在住なのでちくわぶというものを認知しておりません。

# <i class="fa fa-desktop" aria-hidden="true"></i> サンプル

![ふーん.JPG](https://qiita-image-store.s3.amazonaws.com/0/62354/90e99dea-6856-13cf-53a8-b68550683981.jpeg)


# <i class="fa fa-check" aria-hidden="true"></i> まともに作るなら

[dev.tiqav.com]のSearch APIを使い、しっかり作るべきです。
が、今回はズボラプログラミングです。
I'm Feeling LuckyというURLのサブドメインにキーワードを入れると画像が返る機能を使いました。
エラー対応が無いほか、URLとしておかしい検索キーワードは失敗になってしまいます。


***


[Emacsからネタ画像を検索したい コメント - Qiita]

>＞オモシロ画像を貼るためにせっせとマウスでURLをコピペする姿も、ウケるために必死な感じが出てしまいますしあまり人に見られたくありません。
これはほんと分かる。

これはほんと分かる。

[レス画像検索No.1／画像会話なら ちくわぶ]:http://tiqav.com/
[LGTM]:http://lgtm.in/
[dev.tiqav.com]:http://dev.tiqav.com/
[Emacsからネタ画像を検索したい コメント - Qiita]:http://qiita.com/l3msh0/items/7c1587faa18db18b49cf#comment-3c79271560a95e95a583
Haskell個人メモ :: 2.型


# シリーズ :: [Qiita記事]

[Haskell個人メモ :: 1.基本](http://qiita.com/YusukeHosonuma/items/41ad9346b6e3a4d3789c)
**Haskell個人メモ :: 2.型　←いまここ**
[Haskell個人メモ :: 3.関数の構文](http://qiita.com/YusukeHosonuma/items/5da9847db16d33f27a06)
[Haskell個人メモ :: 4.再帰](http://qiita.com/YusukeHosonuma/items/c22171dae82430aa9504)

# 明示的な型指定

```haskell
5 :: Int	-- 5
5 :: Float	-- 5.0
```

`値 :: 型`と書くことで明示的に型を指定できる。
`値`は`xxx型`によって表現される、と読むと分かりやすいかも。

```haskell
:t 'A'		-- 'A' :: Char
:t "Hello"	-- "Hello" :: [Char]
```

REPLだと`:t 値`で実際の型が何かを調べられる。
（純粋関数型言語なので）関数も値の一種なので、`:t 関数`で型を調べられる。

# Haskellの一般的な型

| 型 | 説明 |
| :------- | :------------- |
| Int 		| 整数 |
| Integer	| 限界がない整数（固定のビット長を持たない） |
| Float 	| 単精度浮動小数点 	|
| Double	| 倍精度浮動小数点 	|
| Bool		| True / False 	|
| Char		| 文字（Unicode） 	|
| タプル		| 最大数は62			|

# 型変数

```haskell
:t take -- take :: Int -> [a] -> [a]
```

上記における`a`が「型変数」で、他の言語で言うところのジェネリクス。
つまり、中身の型（ここではリストの要素の型）を限定しない時に使う。

ちなみに型変数を用いた関数を「多相的関数」を呼ぶ。
（呼び方の問題なのであまり重要ではないけれど）

```haskell
:t fst -- fst :: (a, b) -> a
```

同じ型変数が指定されている場合（上記では`a`）、はそれらは同じ型でなければならない。
逆に異なっている型変数（上記では`a`と`b`）が、異なる型である必要はない。

# 型クラス

## 基本

```haskell
:t (==) -- (==) :: Eq a => a -> a -> Bool
```

Javaでいうところの「インターフェース」、Objective-C / Swift でいうところの「プロトコル」。
（既存の型を含めて、拡張できるという意味ではSwiftのプロトコル/エクステンションが非常に近い）

上記の`Eq`が「型クラス」の例で、等値性をテストするためのインターフェースを定義している。
（具体的には`==`と`/=`の2つ）

## 型クラス制約

`Eq a =>`は「型クラス制約」と呼び、`a`が`Eq`型クラスの関数を実装している必要があること示す。
つまり、`a`は`==`と`/=`で比較可能でなければならない。

他言語で言えば、引数として「インターフェース」や「プロトコル」が要求されているイメージ。

## インスタンス

ある「型」が、ある「型クラス」に適合している場合、（その型はある型クラスの）「インスタンス」である、と表現する。
例えば、自作の型`Foo`を`Eq`型クラスに適合する場合、「`Foo`型を`Eq`型クラスのインスタンスにする」と表現する。

`型`＋`型クラス`＝`インスタンス化`、みたいなイメージを持つと分かりやすいかも。

## 用語のまとめ

| 型 | 説明 | コード例 |
| :------------- | :------------- | :------------- | :------------- |
| 型クラス | 振る舞いを定義するインターフェース | `Eq` |
| 型クラス制約 | その型が準拠していなければならない型クラスを指定 | `Eq a =>` |
| インスタンス | 型クラスに準拠している型 | - |

## 標準の型クラス（の例）

| 型クラス (*1) | 振る舞い | インターフェース |
| :------------- | :------------- | :------------- | :------------- |
| Eq				| 等値性のテスト			| `==` `/=` |
| Ord(Eq)			| 順序付け				| `>` `<` `>=` `<=` `compare` |
| Show				| 文字列として表現可能	| `show` |
| Read				| 文字列から値を復元可能	| `read` |
| Enum				| 値を列挙できる			| `succ` `pred` |
| Bounded			| 上限と下限を持つ		| `maxBound` `minBound` |
| Num				| 数					| `+` `-` `*` 他 |
| Fractional(Num)	| 分数					| `/` 他 |
| Floating(Fractional) | 浮動小数点		| `sin` `cos` `tan` 他 |
| Integral(Num)	| 整数（全体）			| `div` `mod` 他 |

*1 ()内は前提となる型クラス。例えば、`Ord`のインスタンスになるためには、`Eq`インスタンスでなければならない。
インタフェースを埋込む #golang


本当はGo月Go日に書きたかったけど、ビール飲んで寝てしまったの今日（Go月6日）になりました。

Goのインタフェースは、明示的に実装する必要がなく、インタフェースが定義するメソッドリストをその型が持っていれば、そのインタフェースとして振る舞えます。
構造体に埋め込んだ型が持つメソッドについても、埋込み先の構造体のメソッドの一部としてみなすことができるため、インタフェースの実装の頭数に入れることができます。
インタフェースの実装と埋込みの関係については[インタフェースの実装パターン](http://qiita.com/tenntenn/items/eac962a49c56b2b15ee8)という記事に詳しく書いているのでそちらを参考にしてください。

さて、埋込みによって構造体にインタフェース実装させるパターンは思ったよりも使えます。なぜなら、埋込みは単なる匿名フィールドに対して、インタフェースは実装を隠し、型を抽象化ができるからです。このパターンは、共通部分を抜き出して、それを複数の型で使う場合に非常に便利です。

共通部分を抜き出す場合、構造体の埋め込みを使いたくなります。以下のように`*fuga`を`Fuga`に埋め込んだ場合、`Fuga`は`*fuga`のメソッドをまるで自分のメソッドのように呼び出すことができます。しかし、単なる匿名フィールドのメソッドを呼び出していることには変わりません。また、これらの型はあくまで別の型なので、`*fuga`型の変数に`*Fuga`型の値を入れることはできません。

```
type fuga struct {
}

func (_ *fuga) Method() {
    fmt.Println("hello")
}

type Fuga struct {
    *fuga
}

func NewFuga() *Fuga {
    return &Fuga{&fuga{}}
}

func main() {
	f := NewFuga()
	// あくまで f.fuga.Method() と同じ
	f.Method()	
	var _ *fuga = f // コンパイルエラー
}
```

しかし、インタフェースはメソッドリストさえ一致していれば、そのインタフェースとして振る舞うことができます。例えば、以下のようにインタフェースを作って埋め込んでみます。

```
type Hoge interface {
    Method()
}

type fuga struct {
}

func (_ *fuga) Method() {
    fmt.Println("hello")
}

type Fuga struct {
    Hoge
}

func NewFuga() *Fuga {
    return &Fuga{&fuga{}}
}

func main() {
	f := NewFuga()
	f.Method()	
	var _ Hoge = f // OK
}
```

こうすることにより、`*Fuga`型は`Hoge`型としても振る舞うことができるようになりました。`Hoge`インタフェースを埋め込んだ構造体が複数ある場合は、`Hoge`型としてまとめて扱うことができます。

普段は汎用的なインタフェース型で持っておき、必要な場合に型アサーションで実行時にインタフェースを実装しているかチェックすることもできます。

```
var f interface{} = NewFuga()
if h, ok := f.(Hoge); ok {
    h.Method()
}
```

先ほどの例だと、`Hoge`型が公開されてしまっているので、埋め込んだとしても`Fuga.Hoge`が外部パッケージから変更されてしまう可能性があります。

```
f := NewFuga()
f.Hoge = NewFuga() // 匿名フィールドでも上書きできる
```

そこで、`Hoge`インタフェースをリネームしただけの`hoge`型をつくって、こちらを埋め込みましょう。

```
type Hoge interface {
    Method()
}

// この型は外部に公開されない
type hoge Hoge

type fuga struct {
}

func (_ *fuga) Method() {
    fmt.Println("hello")
}

type Fuga struct {
    hoge
}

func NewFuga() *Fuga {
    return &Fuga{&fuga{}}
}

func main() {
	f := NewFuga()
	f.Method()
}
```

こうすると、`hoge`型の匿名フィールドは外部のパッケージに公開されず変更できなくなります。

Goのインタフェースは、シンプルで強力なので使い方次第では面白いことができます。今回紹介した、インタフェースを構造体に埋め込むパターンを使えば、構造体をインタフェースでデコレートしていき、必要な時に特定のインタフェースとして振るまわせることができます。
【中華レーザー】工業用冷却装置

# 工業用冷却装置
中華レーザーの水冷用に用いる。

![DSC09495.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/63f0e3ba-302c-692d-cc5f-874f1fbddb70.jpeg)

水の循環がうまくいかない場合や、水の温度が上がってきた場合にアラームが発動する。

# 背面

- INLET
- OUTLET
- ALARM OUTLET

の3端子。

![DSC09496.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/90166a1f-5e9b-5ca4-babb-429d36d8c9b2.jpeg)

|項目|概要|
|:--|:--|
| INLET | レーザーチューブ水冷の入り口と繋げる |
| OUTLET |  レーザーチューブ水冷の出口と繋げる |
| ALARM OUTLET | レーザーカッターと繋げる |

白い突起物がある方にINLETを繋げる。

![laser001.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/8f2647b1-a5d8-d948-f514-679bae9e4033.jpeg)

反対側にOUTLETを繋げる。

![laser002.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/d3d4eec3-d37a-2edc-31c5-0690eb76c618.jpeg)

工業用冷却装置をONにすると、レーザー菅の中を見ずが循環し始める。OUTLETから注水され、INLETから出水される。

![laser003.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/d8174a32-edd5-4ffc-000c-221522a48b19.jpeg)



# 電圧

中華仕様だと220Vになる。

![DSC09497.jpg](https://qiita-image-store.s3.amazonaws.com/0/63450/d43442d4-2b69-f098-4dc3-a132f4a4ac65.jpeg)
【Xcode】【Swift】NSObjectを拡張して、クラス名をString型で取得できるようにしてみた

## はじめに
独学でプログラミング学び始めて約1年、業務でプログラムを書き始めて2ヶ月、Swift始めて１ヶ月のSwifterです。
タイトルの通り、NSObjectを拡張してクラス名を取得できるようにしてみました。Storyboard使わずにxibを使って画面遷移したり、自作のUITableViewCellを使っていたりすると、こんな感じでクラス名を文字列指定したい場面が出てきますが、ここを簡略化、タイプミスのリスクを軽減できます

例）

``` Swift:ViewController.swift
let vc = ViewController("ViewController", bundle:nil)

self.tableView.registerNib(UINib.init("MyTableViewCell", bundle: nil), forCellReuseIdentifier: "MyTableViewCell")
```

## 手順

・「New File...」から新しく「NSObject+ClassName.swift」のようなファイルを作成します
<img width="1020" alt="スクリーンショット 2016-05-06 9.46.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/115590/e4074ff7-baa7-15da-d200-489d1e946d87.png">

<img width="1020" alt="スクリーンショット 2016-05-06 9.47.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/115590/8e8d327b-d7bb-bc6b-92f2-cf4fa809206d.png">

<img width="713" alt="スクリーンショット 2016-05-06 9.47.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/115590/a42bdf51-89d5-ceae-10cb-579baff34480.png">


・作成したファイルに以下のように記述します

``` Swift:NSObject+ClassName.swift
import Foundation

extension NSObject {
    class func className() -> String {
        return String(NSStringFromClass(self).componentsSeparatedByString(".").last!)
    }
}
```

こうすることで、これが

``` Swift:ViewController.swift
let vc = ViewController("ViewController", bundle:nil)

self.tableView.registerNib(UINib.init("MyTableViewCell", bundle: nil), forCellReuseIdentifier: "MyTableViewCell")
```
こんな感じで使える

``` Swift:ViewController.swift
let vc = ViewController(ViewController.className(), bundle:nil)
self.tableView.registerNib(UINib.init(MyTableViewCell.className(), bundle: nil), forCellReuseIdentifier: MyTableViewCell.className())
```
## 結論
素敵。

## 改善点
- クラスメソッドなのでインスタンスでは使用できない　→　インスタンスからクラス名取得したい時ってあったっけ・・・？
- NSObjectを継承しているもの以外では使えない

うーむ・・・　みなさんのコメントお待ちしてます！
SublimeTextでスムーズな日本語入力、半角スペースやTabを表示させる方法。windows環境

PCの初期化で再び設定せねばならなくなったので
覚書を残しておきます。

<h1>1.日本語入力をスムーズに</h1>

まず、パッケージコントロールをダウンロード。
http://webkaru.net/dev/sublime-text-package-control/

次に、「インストール方法」を参考にIMESupportをインストール
https://github.com/chikatoike/IMESupport
ちなみに、私の環境(Windows10)ではインストール完了のメッセージは確認できず。しかし、日本語が直接入力できるようになっていました。

<h1>2.半角スペース、Tabを表示する</h1>
Preference>Setting-Userを選択し

{
    "font_size": 16,
    "ignored_packages": ["Vintage"],
    "remember_open_files": false,              // Sublimeを終了する直前に開いていたファイルを記憶するかどうか
    "close_windows_when_empty": true,          // 開いているファイルがなくなったらSublimeを終了するかどうか
    "draw_white_space": "all",                 // スペースやタブを可視化する
    "fallback_encoding": "UTF-8",              // 文字コードを自動判別できなかった時のデフォルト文字コード
    "highlight_line": true,                    // 現在行をハイライト
    "overlay_scroll_bars": "disabled",         // 水平スクロールバーが常に表示されるようにする
    "show_encoding": true,                     // 文字コードをステータスバーに表示
    "show_line_endings": true,                 // 改行コードをステータスバーに表示
    "trim_trailing_white_space_on_save": true, // 保存時に空白を除去する
    "word_wrap": false,
    "rulers": [0,200],
}

にまるごと置き換える。（目が悪いのでfont_size:16)
react-routerとredux-simple-routerとredux-react-routerとreact-router-reduxとredux-router

# 概要
react*reduxでrouter使いたい時に何が何だかわからなくなったので整理

# 登場人物
* react-router
    * reactのためのrouter
    * githubでもnpmでも同一名
    * [githubのページ](https://github.com/reactjs/react-router)
    * [npmのページ](https://www.npmjs.com/package/react-router)
* react-router-redux
    * react-routerとreduxを繋いでくれる人(シンプル)
    * [githubのページ](https://github.com/reactjs/react-router-redux)
    * [npmのページ](https://www.npmjs.com/package/react-router-redux)
* redux-router
    * react-routerとreduxを繋いでくれる人(多機能)
    * [githubのページ](https://github.com/acdlite/redux-router)
    * [npmのページ](https://www.npmjs.com/package/redux-router)
* redux-simple-router
    * react-router-reduxの旧npmパッケージ名（kuyさん、ありがとうございます！）
    * react-router-reduxって名前ですでにnpmが出ている
    * react-router-reduxがminで4kbなので、積極的にこちらを使う理由もないと思われる。
[![https://gyazo.com/be754808dcb9b573a630dd7456323dad](https://i.gyazo.com/be754808dcb9b573a630dd7456323dad.png)](https://gyazo.com/be754808dcb9b573a630dd7456323dad)
    * [npmのページ](https://www.npmjs.com/package/redux-simple-router)

* redux-react-router
    * redux-routerの旧npmパッケージ名
    * こっちも多分 redux-router の名前で育てていくと思われる
    * [npmのページ](https://www.npmjs.com/package/redux-react-router)

なので実際の登場人物は３人です
* react-router
* react-router-redux
* redux-router

# 3人について簡単に
実はまだ使ったことないので、私の理解の範囲で簡単に。。。

## react-router
reduxは関係ない。reactにてroutingするための機能
urlを変えたりそれをreactが聞けるようにしたり

## react-router-redux
reduxはstateで状態管理してreactに教えてくれてるわけだからurlの変更もstateとして管理したいぜ。
って言うのを叶えてくれる人。
シンプル。
星多め。(2016-05-06現在)

## redux-router
基本的にreact-router-reduxと同じことをやってくれる人。
多機能。
星少なめ。(2016-05-06現在)

# 個人的な考え
reactjsさんが作ってて、星も多いreact-router-reduxを使っておけば安心な気はするし、そうしようと思っている。
けど、
やりたきことはあくまで「urlの変更をreduxが聞いててほしい」なので、react−routerに依存してるのは気持ち悪い気もしている。
react-routerのrouteコンポーネントのあたりを削ったシンプルなrouterパッケージがあったらそっちを使いたい気分。

# ２０１６−０５−０９追記
[react-router-redux って名前でもnpmパッケージが出ている事実が発覚](https://www.npmjs.com/package/react-router-redux)。
しかもこっちの方がバージョン進んでる。
というかこっちしかバージョンが進んでない。
書き方めっちゃシンプル。なにこれ。

# ２０１６−０５−２３追記、修正
kuyさんに指摘いただき、混乱をさけるため redux-simple-router の文脈を減らしました。
[本家のREADME](https://github.com/reactjs/react-router-redux/blob/3.0.x/README.md)でも、「前はredux-simple-routerって呼ばれてたやつ」的に言われてます。
> Formerly known as redux-simple-router
NVIDIA GPU-REST-Engine を AWS で動かしてみよう


Chromeで見ると画像の色合いが変なのでSafariやFirefoxで見てください。

はじめに
===========


GPU REST Engine
------------------

[GPU REST Engine] は、Deep Learning Frameworkなど CUDAアプリケーションを "REST API" で操作する仕組みであり、NVIDIAが提供しています。
とは言え、AWS API GATEWAY などと違って、結構自分でコード書く必要はあります。

GPU REST Engine on GitHub
--------------------------------

GitHub上の[GPU REST Engine] は、 Deep Learning のフレームワークの一つである CAFFE の学習済みのモデルを用い、画像に写っている動物の種類を判別するサンプルです。

例えば下記のようにうさぎの写真を入れると、Angora rabbit の可能性が 0.9998 と Json で返ってきます。

![Kobito.I4MraJ.png](https://qiita-image-store.s3.amazonaws.com/0/73207/df6a367a-2f45-50c3-20a0-fe403a6cf1d4.png "Kobito.I4MraJ.png")

[GPU REST Engine] は、主に Docker, go-langで構成されており、 Web Server は、main.goというコードの中で起動されています。

このQiitaのページにかかれていること
----------------------------------

このQiitaのドキュメントは、AWS の GPU インスタンスを用いて、GitHub上にある GPU REST Engineのサンプルを動作させます。

Hands-on 内容
====================

- AWSから g2.xlarge を起動する
	- http://qiita.com/daikumatan/items/58daff99250d4698d659
- NVIDIA Driverのインストール
	- http://qiita.com/daikumatan/items/26039fc23edabf76a9c4
- NVIDIA-dockerの準備
	- http://qiita.com/daikumatan/items/c0951a02e70fd2449b8f
- GPU REST Engine のセットアップと動作確認
	- http://qiita.com/daikumatan/items/2758ebd12209622772ab


参考にしたドキュメント
====================

<!--
initramfsに関して馴染みの無い人は[(1)](http://www.slideshare.net/znzjp/initramfs), [(2)](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0384), [(3)](http://www.gcd.org/blog/2007/09/129/) がわかりやすいです。
-->

- [Ubuntu14.04にcuda 7.5をインストール](http://qiita.com/shinya_ohtani/items/f374ed0dd51737087369)
- [Ubuntu14.04 ServerでCUDA 6.5.14の環境を整える](http://nonbiri-tereka.hatenablog.com/entry/2015/02/12/160811)
- [NVIDIA CUDA GETTING STARTED GUIDE
FOR LINUX](http://developer.download.nvidia.com/compute/cuda/7_0/Prod/doc/CUDA_Getting_Started_Linux.pdf)
- [NVIDIA Driver Downloads](http://www.nvidia.com/Download/index.aspx?lang=en-us)
- [CUDA 7.5 Downloads](https://developer.nvidia.com/cuda-downloads)
- [AUTODESK MAYA](https://knowledge.autodesk.com/ja/support/maya/troubleshooting/caas/sfdcarticles/sfdcarticles/kA230000000u016.html)
- [Initramfsのしくみ](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0384)
- [Install Docker](https://docs.docker.com/linux/step_one/)
- [NVIDIA docker](https://github.com/NVIDIA/nvidia-docker/wiki/Installation#installing-from-binaries)
- [NVIDIA GPU REST Engine](https://github.com/NVIDIA/gpu-rest-engine)

[GPU REST Engine]:https://github.com/NVIDIA/gpu-rest-engine


------

__このQiitaの情報は、おいらがプライベートで作っているもので、NVIDIAとは無関係です。個人責任でお試しください。インスタンス等の消し忘れ等ご注意ください。__
package.jsonのパッケージを最新のバージョンにアップデートする


package.jsonのパッケージを最新のバージョンにアップデートしたい。
そういう時、`npm-check-updates`を使うと便利。

```
$ npm install -g npm-check-updates
$ ncu -u
$ npm install 
```

## 参考
[How do I update each dependency in package.json to the latest version?](http://stackoverflow.com/questions/16073603/how-do-i-update-each-dependency-in-package-json-to-the-latest-version)
技術英語 > リスニング > Linkの整理

[ラスボス](http://qiita.com/7of9/items/94898c13312f756a4cae)をフルボッコ(100%リスニング）するために必要な事項として、訛りが混じる英語に耳が慣れる必要があるように思う。

現在進めている、Star Trek Voyager, Living On Earthでのリスニング以外にも定常的(今後数年単位）に利用できるサイトを調査中。

以下の条件がより多く含まれるのが望ましい

- 必須: scriptが取得できる
- 必須: mp3を取得できる (iRiver T10に入れてリスニングを外でできるように)
- better to have: 訛っている人の会話が混じっている(多いのが望ましい)
- better to have: 複数の人が話していること

## あらたに見つけたもの

- http://www.npr.org/sections/technology/
  - IT関連のニュース
  - 1つ3-4分の長さ
  - 更新が継続されている
  - Living on earthと同じNPRに属する

- http://www.scientificamerican.com/podcast/60-second-science/
  - 1つ60秒
  - 科学関連のニュース
  - アナウンサーが話し続けるので、色々な発音を聞くには向かないかも
  - こちらを聞くなら、[BBC 6 minutes English](http://www.bbc.co.uk/learningenglish/chinese/features/6-minute-english)の方がいいように思う

- http://www.birmingham.ac.uk/news/podcasts/index.aspx
  - 数は少ない
  - 1つ10分程度
  - 大学の研究紹介のような感じ
  
- http://www.manythings.org/voa/wm/
  - 2009年で更新停止しているが、357のエピソードがある
  - 1つ5分程度
  - ITに特化しない一般的な事項

- http://nptel.ac.in/courses/106102064/
  - 大学？の講義
  - 1つ50分程度
  - インド人英語の訛りがある
  - リンク以外にも様々な講義が用意されている
  - Transcriptには"Yet to be verified by subject matter expert(s)"という記載がある場合があり、最終版ではない時もある
Java使いからPHPerに転向したときに得たこと


# どんな内容か？

転職して、JavaからPHPの仕事をするようになり、PHPとSymfonyを学習して、Javaとの比較で気づいたことをまとめてみました。

PHPのようなスクリプト言語をやることで、Javaの特徴やメリットを改めて気づくことが多々ありました。ある段階までいくと、違う言語をやることで双方の理解がより深まるようです。

# JavaとPHPの比較

## PHPには返り値や変数の型を指定できない

Javaでメソッドを定義するときは、返り値や引数の型を次のように指定します。

```Sample.java

public boolean isEnemy(User user) {
    return ...;
}

```

PHPでやると、そんなものはなにひとつ書かなくてもよいです。

```Sample.php

public function isEnemy($user) {
   return ...;
}

```

ただ、引数については、5.x系ならタイプヒンティング、7.x系から型指定として、設定できるようです。

http://php.net/manual/ja/functions.arguments.php#functions.arguments.type-declaration

7.x系からはstring,intなどが指定できるようになったものの、5.x系ではjavaのように気軽に指定できないのは少し不安なところです。

## IDEはPhpStormがおすすめ

IntelliJ IDEAと同じところが出していますから、そっちを使ったことがあれば慣れるのは早いです。

### オーバーライドしているかを表示してくれる

Javaの場合、interfaceや親クラスのメソッドをオーバライドを明記するために、@overrideを付与できます。IDEAも、その箇所の左側にoマークが表示れます。
しかし、phpdocにはそれに相当するものはありません。でも、PhpStormならIDEAと同じようにoマークがでてくれます。

https://www.jetbrains.com/help/idea/2016.1/overriding-methods-of-a-superclass.html?origin=old_help

### 宣言箇所へのジャンプ、呼び出しもとのリストアップ

IDEAと同じように、メソッドや定数の宣言箇所へのジャンプや、それらが使われて居る箇所の一覧を表示することができます。DIしていたり、テンプレート内での使用箇所は流石に拾えないですが、それはjavaのときも一緒ですので。

### 型がわかるときはメソッドなどのサジェストがされる

`$hoge = new Hoge()` みたいに、変数の型が特定できる箇所では、IDEAと同じように、そこからアクセスできるメソッドやプロパティがサジェストされます。

### phpdocで引数や返り値の型を書いておくと、それと違ったときは警告がでる

下記のように、引数や返り値についてphpdocを書いておくと、引数に違う型を渡したりすると警告を出してくれます。

```Sample2.php

/**
 *
 * @param string $id
 * @return boolean
 */
public function isStored($id) {
  return ...;
}

```

## foreachは右側に繰り返し要素

javaの拡張for文は左側にリストの要素

```
for(int index: list) {
  ///
}

```

## arrayはリストも連想配列も多次元配列も扱えてしまう

javaのList型は、まさしくただのlistで、多次元配列にしようと思ったら、List<List<A>>みたいなことや、そのための型を使うことになります。

けど、phpのarrayはある意味やりたい放題で、

```
$tmp = array(1 => array("a" => 2), 2 => "c")
```

などと、array使えば、どんどん連想配列をつくれてしまいます。

## namespaceはpackageとは違う

javaのパッケージと違って、名前空間の棲み分けが主なようです。同じnamespaceにしたからといって、それらをautoloadしてくれるわけではないようです。そういうことをするためのライブラリなり設定なりを追加すればできるらしいですが。

javaはコンパイルしたり、jarで固めるときにその辺をよろしくやっているのだと、こういう時に気づかされます。

## 比較は罠が多い

`===`を使った場合は、型の一致も含めての比較になるのですが、`==`のときは、そうではないので、それでバグってしまうのがよくあるようです。


### 2a問題

超がつくほど有名らしいです。

- http://d.hatena.ne.jp/fbis/20071110/1194680712

```
$a = '2a';
$b = 2;
print ($a == $b);
// =>  true 
```

javaでIDEを使っていたら、比較しようとした時点で「型がちゃうで」と怒られるので、まずありえないです。

### 0e問題

md5のハッシュ値の比較で有名のようです。

- http://stackoverflow.com/questions/22140204/why-md5240610708-is-equal-to-md5qnkcdzo
- http://peccu.hatenablog.com/entry/2015/05/23/000000
- https://twitter.com/sc00bzt/status/440759501973495808

```
$a = '0e678342453'
$b = '0e123435465'
print ($a == $b);
// => true
```

言ってる意味がわからない... 

何が起きているかというと、eがあるせいで、指数表記と解釈されるようです。

`0^673 = 0 = 0^123` ということで、両方とも0になるから、ゆるい比較だと同じになってしまうと...


# 参考サイト

http://qiita.com/crifff/items/ad3cbfc21938d9657628

http://qiita.com/soramugi/items/0501e4f9e46a69f30fb8
【初心者】MacでC言語【画面遷移あり】

#MacでC言語学習

XcodeのPlaygroundのように**簡単かつ親しみやすい方法**でC言語を学習する方法がないかGoogleなどで検索してもあまり出なかったので投稿致します。
少しでもプログラミングに興味がある方は見ていただけると幸いです。


#こんな人にオススメ
・Swiftから勉強始めたけどXcodeで他言語にチャレンジしてみたい
・Macは持ってるけどプログラミングをしたことがない（興味ある）
・C言語に興味ある

#必要な環境
Xcode（App Storeから無償で入手できます）

#手順
1.　Xcodeのインストール


2.　新規プロジェクト作成
　　Xcodeを起動し、Create a new Xcode Projectもしくは、
　　画面左上Xcodeと描かれている横にあるFile > New > Projectと選択する。

![スクリーンショット 2016-05-06 8.51.22.png](https://qiita-image-store.s3.amazonaws.com/0/124071/2147154c-2dc8-71a7-4e66-3767b91b15ad.png)



3.　macOSという項目にあるCommand Line Toolを選択する。
![スクリーンショット 2019-03-09 17.31.34.png](https://qiita-image-store.s3.amazonaws.com/0/124071/22f633c0-146e-8734-6843-fef17527f2ec.png)




4.　Product Nameを入力して、Organization identifierにも何か入力してください。Languageという項目のプルダウンからCを選びます。

![スクリーンショット 2016-05-06 8.57.49.png](https://qiita-image-store.s3.amazonaws.com/0/124071/e1b01e2b-c118-c83c-41b0-0e327e510d7a.png)


5.　コンパイルしてみると……
![スクリーンショット 2016-05-06 9.02.16.png](https://qiita-image-store.s3.amazonaws.com/0/124071/e5623c5c-fb70-10f6-1247-3c0106ca9bf1.png)





以上です！

知識のある方からしたら知ってて当然の内容かもしれませんが、学習して間もない人からするとCommand Line Toolさえ知らない人もいるだろうと思って初投稿してみました（私自身、Googleで検索してもわからなかったので……）。

追記:2019.3.9
久しぶりに実行してみましたがそんなに手順は変わりませんでした。
技術英語 > and [pulled together] a number of concepts we have been looking at with the Zynq. / Pull yourself together.

@ Adam Taylor MicroZed Chronicles - Using the Zynq 101 [Kindle Edition]
No. 1659/2129

> and <font color=red>pulled together</font> a number of concepts we have been looking at with the Zynq.


http://eow.alc.co.jp/search?q=pull+together
> 2. 引き合わせる、集める、まとめる

<hr>
どのドラマだったか忘れたが以下のフレーズで「頑張って」という字幕がついていた。

> Pull yourself together.

「気をしっかり持って」という訳がふさわしいようにも思う。
VagrantのプロビジョニングにAnsibleを利用する設定手順

## はじめに
Ansible実行をVagrantから行うための設定方法のメモです
参考: [Vagrant公式ドキュメント](https://www.vagrantup.com/docs/provisioning/ansible_intro.html)
## 分けて起動する場合
1. `$ vagrant up`
2. `$ ansible-playbook -i hosts site.yml --sudo -k `

※ `-i`: Inventoryファイルを指定する
※ `hosts`: Inventoryファイル
※ `site.yml`: play-bookファイル
※ `-k`オプション: SSH のパスワードを尋ねる(プロンプトが出る)

## Vagrantから直接プロビジョニングする場合
### Ansible用プロビジョニング設定を`Vagrantfile`へ
```Vagrantfile

Vagrant.configure(2) do |config|

  config.vm.define "web" do |node|
    node.vm.box = "centos/7"
    node.vm.hostname = "web"
    node.vm.network :private_network, ip: "192.168.33.40"
  end
  config.vm.define "dbserver" do |node|
    node.vm.box = "centos/7"
    node.vm.hostname = "dbserver"
    node.vm.network :private_network, ip: "192.168.33.41"
  end
  
  #
  # Run Ansible from the Vagrant Host
  #
  config.vm.provision "ansible" do |ansible|
    ansible.ask_sudo_pass = true
    ansible.playbook = "site.yml"
    ansible.groups = {
      "group1" => ["web"]
      "group2" => ["dbserver"]
    }
  end

end
```
* `ansible.ask_sudo_pass = true`により`-k`オプションと同等
* `ansible.playbook = "site.yml"`によりplay-bookファイルを指定
	* currentディレクトリのからパスで指定する
* `ansible.group`によりInventoryファイルにおけるグループを作成
	* 上記の例では実行により`.vagrant/provisioners/ansible/inventory/`ディレクトリ上に`vagrant_ansible_inventory`というInventoryファイルが以下のように作成される

```vagrant_ansible_inventory
# Generated by Vagrant

web ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222
dbserver ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222

[group1]
web
[group2]
dbserver
```
Vagrantでのgroup名、host名をAnsibleでのコンポーネントのものと一致させる

### 実行
```
$ vagrant up/reload --provision
```
```
$ vagrant provision
```
OS X で Emscripten を使おうとすると python2 がなくていきなりコケるのを解決する

OS X El Capitan に [Emscripten の Getting Started][1] に従って SDK emsdk_portable をインストールすると `emcmake` の実行時に python2 がないと言われてコケます。

[1]: http://kripken.github.io/emscripten-site/docs/getting_started/

せっかく Emscripten 使ってみようとおもったのにここで躓いては残念ですよね。
この問題を解決するには emsdk_portable をインストールしたディレクトリに cd して

```
cd emsdk_portable
ln -s `which python2.7` python2
```

が、もっとも手っ取り早いと思います。

この方法だと sudo 不要ですし、Emscripten を利用しないとき（emsdk_env.sh を適用しないとき）は python2 がパス上に現れることもないので、/usr/bin にシンボリックリンク置くよりも綺麗ではないかと。
ubuntu 14.04 install時にgrub-installエラーが出るときの対処。


1.Try ubuntuを選択し、コンソールを立ち上げておく。
2.その状態で通常インストール。
3.grub-install errorが出たら、マニュアルでgrubをインストールするを選んで続行。
4.restartする前にコンソール上で以下を実行

```bash
mkdir /home/ubuntu/temp
sudo mount /dev/sda5 /home/ubuntu/temp
sudo grub-install --root-directory=/home/ubuntu/temp /dev/sda
sudo umount /home/ubuntu/temp
```

ただし、/dev/sdaは適宜自分がubuntuをインストールしたhdd名に変える（sudo fdisk -lを利用）
bashの「command not found」をカスタムする

存在しないコマンドを入力した時に「コマンドが見つかりません」や「comannd not found」などといったような表示が出ますが、これをカスタムする方法をメモります。

通常では、以下のように存在するコマンド( 例 echo ) を入力すると、コマンドに応じた動作をし、存在しないコマンド( ehcooooo )を入力するとエラーメッセージが返ってきます。

```
echo "test"
実行結果 => test

echoooooo "test"
実行結果 => command not found
```

この２番目の例の、コマンドが見つからなかった場合の表示を自由に変更します。

.bashrcに以下のような記述を追記します。

```
command_not_found_handle() {
  local cmd
  cmd=${1##*/}
  echo "\"${cmd}\"なんてコマンドありまへん。"

}

```

これで設定OKです。

コンソールを起動しなおすか、以下のコマンドでbashrcを読み込ませてください。

```
source ~/.bashrc
```

では、存在しないコマンドを打ってみましょう。

```
echoooooo "test"
実行結果 => "echoooooo"なんてコマンドありまへん。
```

ちゃんと、設定したエラーメッセージになりました。

.bashrcでcommand_not_found_handleの中身を変えてやればカスタムし放題です。

以上です。
WordPressでError establishing a database connectionと言われました。

WordPressのサイトを移行していたらエラーがでました。

# Error establishing a database connectionと言われる
ブラウザからWordPressへアクセスしてみたところ以下の様なエラーがでました。

```
Error establishing a database connection
```
どうやらデータベースの接続がうまくいっていないようです。

# MySQLのユーザーパスワードをチェック
MySQLへWordPressで使用しているユーザーがログインできるかどうかを試しました。

```bash:pugiemonnユーザーでログインできるか確認
mysql -u pugiemonn -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'pugiemonn'@'localhost' (using password: YES)
```
ユーザーは存在するので、どうやらパスワードの設定が間違っているみたいです。

# MySQLユーザーのパスワードを設定
pugiemonnユーザーのパスワードを設定しました。

```
SET PASSWORD FOR pugiemonn@localhost=PASSWORD('pugiemonn_password');
```
これでどうでしょうか。

# 結果
`Error establishing a database connection`というエラーが消えました。やったね(☝ ՞ਊ ՞)