OmniAICreator/Qiita-1.07M huggingface dataset:
【Webpack基本編】JSファイル分割 / BabelでES2015


自分で環境構築をしたことはなかったのでやってみた。
[このサイト](https://ics.media/entry/12140 "このサイト")とかを参考に。

#Webpackとは？

「Webコンテンツを構成するファイルを「モジュール」単位で取扱、最適な形に作り変えるためのツール」らしい。

##できること

- JSファイルを「モジュール」という単位で分割して読み込める
- JS以外のCSSとかも「モジュール」で読み込めるらしい
- ダウンロードの最適化とかも
- Gulpとかとの連携もできる

全部いっぺんにするのはしんどいので「ファイル分割」と「Babel導入」だけしてみた。

#ファイル分割

##メリット

- コードの管理がしやすくなり、再利用性が上がる

なお、モジュール化の仕組みはいろいろあるらしいけど「CommonJS」と呼ばれる仕組みが一般的だそう。

###CommonJS

`module.exports = {...}`と`require("path")`を使う

##インストール

1. グローバルにWebpackをインストール
2. 使いたいディレクトリ内に移動してpackage.jsonをつくる
3. ディレクトリ内にもnpmでWebpackをとってくる

1.は一度インストールしたら２回目以降不要です。

###コマンド

1. `npm install -g webpack`
2. `cd`で移動して`npm init`
3. `npm install --save-dev webpack`

##手順

主な段階は次の２つ。

1. モジュール化されたファイルをCommonJSで読み込む
2. ブラウザが読み込める記法にして変換して出力

###1. CommonJSで読み込む

こんな感じ。

```js:common.js
var sub1 = require("./modules/sub1.js");
var sub2 = require("./modules/sub2.js");

sub1.hello();
sub1.goodMorning();
sub1.goodNight();

sub2();
```
```js:sub1.js
module.exports.hello = function(){
    console.log("helloメソッドの実行");
};
module.exports.goodMorning = function(){
    console.log("goodMorningメソッドの実行");
};
module.exports.goodNight = function(){
    console.log("goodNightメソッドの実行");
};
```

###2. 変換、出力

ディレクトリ内に`webpack.config.js`を作って、以下を記述。

```js:webpack.config.js
module.exports = {
    entry: "./common.js", // 変換したいファイル
    output: {
        path: "./", // 出力先
        filename: "bundle.js" // 出力ファイル名
    }
};
```

ここまでできたら `webpack` でビルド。
`webpack --watch` とすれば監視してくれる。

#BabelでES2015

[ここのサイト](http://mae.chab.in/archives/2547 "ここのサイト")を参考に。

##手順

1. グローバルにBabelをインストール
2. Babel-preset-s2015をインストール
3. .babelrc（JSON）をつくる
4. 必要なパッケージをnpmでインストール
5. ビルド

###コマンド

1. `npm install -g babel-cli`
2. `npm install --save-dev babel-preset-es2015`
3. `npm install --save-dev babel-loader babel-core`
WordPressの始め方 Agenda

初投稿、兼備忘録でWordPressでのメディア運営についてメモしていきます。
n番煎じながら、シリーズ化したいと思います。。

<h3>Agenda</h3>
⑴サーバの選び方（レンサバかクラウドか）
⑵サーバ設定（レンサバの場合）
⑶テンプレの選び方
⑷サイトURLの変更
⑸セキュリティ（SSL）
⑹セキュリティ（ログインページURL）
⑺SNS設定
⑻広告設定

更新状況によって随時変更していきます。
SwiftBondをSwift3対応するためにv5にマイグレーションする


Swift3対応するためにSwiftBondをv5にします。v4の時とそこそこ変わっています。
なお、beta7で試したのでリリース版では変わっているかもしれません。

# Podfile

自分はcocoapodsを使っているので

```diff
-  pod 'Bond', '~> 4.3'
+ pod 'Bond', :git => 'git@github.com:SwiftBond/Bond.git', :tag => 'v5.0.0-beta7'
``` 

# TableViewやCollectionViewとのbind

## プロパティ

ネストしていたと思いますが、必要なくなります。
また、MutableとImmutableの区別ができました。

```diff
-    private(set) var dataSource: ObservableArray<ObservableArray<Any>>!
-    private(set) var dataSource = ObservableArray<ObservableArray<HogeEntity>>([ObservableArray<HogeEntity>()])

+    fileprivate(set) var dataSource: ObservableArray<Any>!
+    fileprivate(set) var dataSource = MutableObservableArray<HogeEntity>([HogeEntity]())
```

## まとめて変更

```extend``` メソッドはなくなって ```replace``` メソッドができました。

```diff
-    func changeHoges(entities: [HogeEntity]) {
-        self.dataSource.removeAll()
-        let observableArray = ObservableArray<HogeEntity>()
-        entities.forEach { (entity) in
-            observableArray.append(entity)
-        }
-        self.dataSource.extend([observableArray])

+    func changeHoges(_ entities: [HogeEntity]) {
+        self.dataSource.removeAll()
+        self.dataSource.replace(with: entities, performDiff: true)
```

replaceメソッドはEquatableに適応されているクラスだけ利用できるのでそうします。

```diff
class HogeEntity {
}

+func == (left: HogeEntity, right: HogeEntity) -> Bool {
+    return left.id == right.idd
+}

+extension HogeEntity: Equatable {
+}
```

## bind部分

```bindTo``` が ```bind`` `に変わりました。また、クロージャーの引数の順番が変わっています。

```diff
-        domain.dataSource.bindTo(collectionView, proxyDataSource: nil, createCell: { (indexPath, array, collectionView) -> UICollectionViewCell in
-            let entity = array[indexPath.section][indexPath.row] as! HogeEntity

+        domain.dataSource.bind(to: collectionView) { (array, indexPath, collectionView) -> UICollectionViewCell in
+            let entity = array[indexPath.row] as! HogeEntity
```

```diff
-        domain.dataSource.bindTo(tableView) { (indexPath, array, tableView) -> UITableViewCell in
-            let entity = array[indexPath.section][indexPath.row]

+        domain.dataSource.bind(to: tableView) { (array, indexPath, tableView) -> UITableViewCell in
+            let entity = array[indexPath.row]
```

# ovserve

observeNextに変わりました。

```diff
     override func viewDidLoad() {
-        domain.mode.observe { [weak self] modeType in

+        domain.mode.observeNext { [weak self] modeType in

```

# その他

上記以外の変更は、[公式ページ](https://github.com/SwiftBond/Bond#migration-from-v4x-to-v50)に書いてある通りです。

>* `EventProducer` is removed. Use Signal from >ReactiveKit for reactive programming.
>* Operator `deliverOn` is renamed to `observeOn`.
>* `ObservableArray` is reimplemented. Mapping and filtering it is not supported any more.
>* KVO can now be established using thr method `valueFor(keyPath:)` on any NSObject subclass.
>* `Queue` is removed. Use `DispatchQueue` instead.
EC-CUBE(v2)でapi使ってajax

以前、[EC-CUBEでAjax](http://qiita.com/ki6ool/items/553039e47ece8ca19867) って書いたけど、
やっぱり自前で作るのはよろしくないので
備わってるAPI機能を使ってやることにした。
というか知らなかった。

```js:template.js
(function ($) {
	function ajaxPost(param) {
	    $.ajax({
	        type: "POST",
	        url:  "/api/json.php",
	        data: { 'Operation': 'MyOperation', 'Service': 'none', 'param': param },
	        dataType: "json",
	        success: function(response) {
	        	var s = response.MyOperation.success;
	        	var r = response.MyOperation.response;
	        	if (!s) {
	        		alert(r.join("\n"));
	        		return;
	        	}
	        	//any
	        },
	        error: function(xhr, ts, et) {
	        	console.log(ts);
	        	console.log(et);
	        }
	    });
	}
}(jQuery));
```

```php:/data/class/api/operations/MyOperation.php
<?php
class API_MyOperation extends SC_Api_Abstract_Ex {

	protected $operation_name = 'MyOperation';
	protected $operation_description = 'いろいろ';
	protected $default_auth_types = self::API_AUTH_TYPE_OPEN;
	protected $default_enable = '1';
	protected $default_is_log = '0';
	protected $default_sub_data = '';

	private $response;
	private $errors;
	private $success;

	public function doAction($arrParam) {
		$param = $arrParam['param'];

		if ( empty($param) ) {
			$this->errors[] = "paramないやで";
		} else {
			$this->response = $param;
		}

		$this->arrResponse = [
				'success' => empty($this->errors),
				'response' => empty($this->errors) ? $this->response : $this->errors,
		];
		return true;
	}

	public function getRequestValidate() {
		return ['DefaultResponse' => []];
	}

	public function getResponseGroupName() {
		return 'MyOperation';
	}

	protected function lfInitParam(&$objFormParam) {
	}

}
```
AmazonのAPIを元に作成したらしい。
各「MyOperation」を適宜変更してご利用ください。

$this->arrResponse の入れ方はWordpress方式でやってますので
これまた気に入らない方は適宜変更を。


####$default_auth_types
認証レベルを設定できる

```php:/data/class/api/SC_Api_Abstract.php
<?php
    const API_AUTH_TYPE_REFERER = '1';          // リファラー
    const API_AUTH_TYPE_SESSION_TOKEN = '2';    // CSRF TOKEN
    const API_AUTH_TYPE_API_SIGNATURE = '3';    // API 署名認証 推奨
    const API_AUTH_TYPE_CUSTOMER = '4';         // 会員認証
    const API_AUTH_TYPE_MEMBER = '5';           // 管理者認証
    const API_AUTH_TYPE_CUSTOMER_LOGIN_SESSION = '6';   // 顧客ログインセッションが有効
    const API_AUTH_TYPE_MEMBER_LOGIN_SESSION = '7';     // 管理者ログインセッションが有効
    const API_AUTH_TYPE_IP = '8';               // IP認証
    const API_AUTH_TYPE_HOST = '9';             // ホスト認証
    const API_AUTH_TYPE_SSL = '10';             // SSL強制
    const API_AUTH_TYPE_OPEN = '99';            // 完全オープン
```

/data/class/api/operations ディレクトリに
既存APIファイルがあるので
こいつら読んでれば理解が深まると思われ。
R > データ操作 / データフレーム > read.tableで読込んだリストの一部の値を四捨五入する

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1
```

R機能マップ 
http://qiita.com/7of9/items/0f911bcb95d3a8bbd703


read.table()で読込んだリストの一部を四捨五入する。

```sample.csv
A,B,C
hello,1.5,3.2
```

| 1 | 2 | 3 |
|:-:|:-:|:-:|
| A  | B  | C  |
| hello  | 1.5  | 3.2  |

上記のうち、右下の2列目と3列目の数値だけを四捨五入したい。
(本当の対象ファイルでは2行目の7列目から326列目を処理したい)。

- 一旦、xtableすべてをouttblにコピー
- 四捨五入したい範囲だけlapply()を使用

```R
> xtable<-read.table("sample.csv", sep=",", stringsAsFactors = F)
> outtbl<-xtable
> outtbl[2:2,2:3]<-lapply(as.numeric(xtable[2:2,2:3]),round)
```

```R
> View(outtbl)
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/50a00d5c-4608-e874-f640-0f60336005c2.png)

「はまる」可能性があるのでstringsAsFactors はFalseにしない方がいいという情報もあるが、今の僕の理解力では上記の方法ぐらいしかできない。

四捨五入の結果は以下のようにしてcsv出力する。
参考 http://statsbeginner.hatenablog.com/entry/2014/08/31/230758
ただし、`V1,V2,...`といった行がついてしまうので、そこは手動で消した。

```R
write.csv(outtbl, "out.csv", quote = F, row.names = F)
```
Singleton in Swift

#What is Singleton?
Basically Singleton pattern is one of design pattern in object-oriented programming. Singleton class can have only one object. In other words, Singleton can keep an instance of class at a time. Normally, I use Singleton when app requires to globalized param.

If you would like to know how to implement Singleton in the best way, just take a look following content.

Using struct to define as static constant is most comfortable and genius way lol The reason that this method is useful is we can keep initiated instance in static constant. However, Xcode update made the code simpler. In this post, there are two code examples.

Depend on what you prefer
## New
```swift:YourClassName.swift
class YourClassName {
    static var instance: YourClassName = YourClassName()
    private init() {
    }
}
```

## Old
```swift:YourClassName.swift
class YourClassName {
    class var sharedInstance : YourClassName {
        struct Singleton {
            static let instance : YourClassName = YourClassName()
        }
        return Singleton.instance
    }
}
```

##References
- https://thatthinginswift.com/singletons/
- http://krakendev.io/blog/the-right-way-to-write-a-singleton
- http://stackoverflow.com/questions/37953317/singleton-with-properties-in-swift-3
Macのターミナルからbase64をデコードする


`coreutils`パッケージを使えば、これだけ！

```
$ echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode
```

## 参考
* [How can I decode a base64 string from the command line?](http://askubuntu.com/questions/178521/how-can-i-decode-a-base64-string-from-the-command-line)
「オフラインリアルタイムどう書く第17回(折って切る)」の問題を解いてみた


[横浜へなちょこプログラミング勉強会](https://yhpg.doorkeeper.jp/)にて過去に出題された[折って切る](http://nabetani.sakura.ne.jp/hena/ord17foldcut/)を解いてみた。
回答にかかった時間は60分を少しオーバー。

```ruby
class OrigamiFold
  def initialize input
    order, @cut = input.split "-"
    @order = order.chars
    @origami = Origami.new
  end

  def exec
    @order.each{|o| @origami.fold o}
    @origami.cut @cut
  end
end

class Origami
  def initialize
    @count = 1
    @layer = {t: 0, b: 0, l: 0, r: 0}
  end

  def fold order
    case order.to_sym
    when :T then @layer[:t], @layer[:b] = calc_layer(@layer[:t], @layer[:b])
    when :B then @layer[:b], @layer[:t] = calc_layer(@layer[:t], @layer[:b])
    when :L then @layer[:l], @layer[:r] = calc_layer(@layer[:l], @layer[:r])
    when :R then @layer[:r], @layer[:l] = calc_layer(@layer[:l], @layer[:r])
    end
  end

  def cut corner
    corner.chars.map{|c| @layer[c.to_sym]}.inject(1, &:*)
  end

  private

  def calc_layer f1, f2
    [f1 + f2 + 1, f1 + f2]
  end
end

test = <<_TEST
/*0*/ test( "RRTRB-bl", "6" );    
/*1*/ test( "R-tr", "0" );    
/*2*/ test( "L-br", "0" );    
/*3*/ test( "T-tl", "0" );    
/*4*/ test( "B-tl", "0" );    
/*5*/ test( "BL-br", "0" );    
/*6*/ test( "LB-tl", "0" );    
/*7*/ test( "RL-tl", "0" );    
/*8*/ test( "BL-tl", "0" );    
/*9*/ test( "TL-bl", "0" );    
/*10*/ test( "RT-tr", "1" );    
/*11*/ test( "TRB-tl", "0" );    
/*12*/ test( "TRL-bl", "0" );    
/*13*/ test( "TRB-br", "2" );    
/*14*/ test( "LLB-bl", "2" );    
/*15*/ test( "RTL-tr", "1" );    
/*16*/ test( "LBB-tr", "0" );    
/*17*/ test( "TLL-tl", "2" );    
/*18*/ test( "RLRR-tr", "0" );    
/*19*/ test( "BBTL-tl", "4" );    
/*20*/ test( "TBBT-tr", "0" );    
/*21*/ test( "LLBR-tl", "0" );    
/*22*/ test( "LBRT-tl", "2" );    
/*23*/ test( "RLBL-bl", "4" );    
/*24*/ test( "BRRL-br", "3" );    
/*25*/ test( "TBBTL-tl", "8" );    
/*26*/ test( "TLBBT-br", "0" );    
/*27*/ test( "LRBLL-br", "7" );    
/*28*/ test( "TRRTT-br", "6" );    
/*29*/ test( "BBBLB-br", "0" );    
/*30*/ test( "RTTTR-tl", "4" );    
/*31*/ test( "BBLLL-br", "6" );    
/*32*/ test( "RRLLTR-tr", "16" );    
/*33*/ test( "TTRBLB-br", "8" );    
/*34*/ test( "LRBRBR-bl", "14" );    
/*35*/ test( "RBBLRL-tl", "8" );    
/*36*/ test( "RTRLTB-tl", "12" );    
/*37*/ test( "LBLRTR-tl", "14" );    
/*38*/ test( "RRLTRL-tl", "16" );    
/*39*/ test( "TBLTRR-br", "12" );    
/*40*/ test( "TTTRLTT-bl", "30" );    
/*41*/ test( "TBBRTBL-tr", "15" );    
/*42*/ test( "TRTRTLL-tr", "28" );    
/*43*/ test( "TLLRTRB-tr", "24" );    
/*44*/ test( "RLLBRLB-tr", "15" );    
/*45*/ test( "LTLRRBT-tr", "32" );    
/*46*/ test( "RBBRBLT-br", "21" );    
/*47*/ test( "LLRLRLR-tr", "0" );
_TEST

require 'minitest/autorun'

describe 'FoldCut' do
  test.split("\n").each do |line|
    t, n, input, expect = line.match(/^\/\*(\d+)\*\/\s*test\(\s*"([^"]+)",\s*"([^"]+)"\s*\);\s*$/).to_a
    of = OrigamiFold.new input
    it input do
      assert_equal expect, of.exec.to_s
    end
  end
end
```
Qt + CMakeメモ

なかなか情報もないので・・・ハマりどころメモとか。

一次情報は[こちら](http://doc.qt.io/qtcreator/creator-project-cmake.html)。

Qt Creator 4.0系になってから、CMake対応強化がリリースノートに乗ることが増えてきています。実際、そこそこ使える(CLionと互角ぐらい)という印象ではあるんですが、ハマりどころも多そうなので、気づいたらメモしていこうと思います。

CMakeとは
========

メタなMakeです。MakefileやらVisual Studioのプロジェクトファイルやらxcodeのプロジェクトファイルやらを生成し、実際のビルドは他のツールが行います。そういう意味ではQMakeとほぼおなじですね。

CMakeは今後はデファクトになりそうな感じではありますが、結構覚えることも多く、使うのは簡単ではないです。覚悟は必要です。QMakeの方がシンプルです。ただ、Qt以外のプロジェクトでも使われることが多いので、Qt外のライブラリを利用するとかは便利になっていきそうです。

Qt Creator + CMakeの処理の流れ
=============================

Qt CreatorではCMakeのビルドファイルであるCMakeLists.txtをプロジェクトファイルとして扱えます。QMakeよりもちょっと凝った内容になっています。なにせ、[CMake自身も手続き型スクリプト言語として](http://qiita.com/shibukawa/items/4d8691b13eee9fcfc5a8)いろんなことがでてしまうからです。

Qt Creatorは、まず一回ビルドの手前のMakefile作成まで行い、その結果のファイルをパースしてプロジェクトファイル一覧を取得しています。プロジェクトを開く時の動作はQMakeを使っているときよりもワンテンポ遅れます。

Qt Creator + CMakeのトラブルQ&A
=============================

Qt Creator + CMakeの組み合わせでのみ問題が起きる、というケースを紹介します。違うOS、もしくはコマンドラインでは正しくビルドできているのに、GUIだとなぜか、というケースです。

ビルドが何かエラーになる
--------------------

``build-[アプリ名]-mingw32-リリース`` と日本語の出力先になっていて、それがうまく処理できずにMakefile生成段階で失敗しているということがありました。Macだと日本語のままでも大丈夫ですが、Windowsだとダメでした。

プロジェクト設定のビルドと実行タブのCMake内のビルドディレクトリを英語のReleaseとかに直してあげれば直ると思います。一度日本語UIのQt Creatorで開いてしまったら、後から表示言語を英語とかに直しても、以前の設定が残ってしまっているため、失敗します。逆に、ディレクトリ名を直してしまえば日本語UIでも大丈夫です。

プロジェクトのファイル一覧に何も出ない
-------------------------------

CMakeのバックエンドで使うビルドシステムを正しく設定してあげる必要があります。Macだと一種類しかないので問題ないですが、WindowsだとVisual Studioとかmingwとかあるので注意が必要です。

場所はWindowsだと``ツール``→``オプション``→``ビルドと実行``のページを開き、``キット``の中です。Qtと一緒にインストールするmingw32の場合、 ``CodeBlocks - MinGW Makefile`` を選びます。 ``MinGW Makefile`` だけではダメです。

プロジェクトにファイルを追加しても表示されない
-------------------------------------

CMakeを再実行しないと、プロジェクトに追加したファイルは表示されません。``ビルド``→``CMakeの実行``を行ってください。

operator delete(void*)がundefined reference
-------------------------------------------

これ以外にも、言語そのもののAPIが見当たらない、というケースです。Windowsでコマンドラインではg++をC++のコンパイラとして使ってくれるのに、よく見るとi686-w64-mingw32-gcc.exeが使われている・・・

修正箇所は2箇所です。全体設定とプロジェクト設定。おそらく、CMakeのプロジェクトを新規に開く時に全体設定を引き継いでしまうので、全体設定だけを直してもダメっぽいです。

全体設定は``ツール``→``オプション``→``ビルドと実行``のページを開き、``コンパイラ``です。MinGWとかを選択して、コンパイラのパスを``g++.exe``にします。

プロジェクト設定は``プロジェクト``→ビルドと実行の``CMake``の中です。``CMAKE_CXX_COMPILER``がCコンパイラになっているので、``g++.exe``とかにすれば大丈夫そうに思いきや、いくら変更してもダメです。CMakeLists.txt.userを削除してプロジェクトを開き直してください。
Git タグからタグまでのコミットをざっと把握する

## git log タグ..タグ

単純に tag名..tag名 と範囲を指定するだけでOKです。

```bash

$ git log V1.0..V1.1
```

## 変更点の概略をざっと把握する
概略をざっと見たい場合とかは下記のようなオプションで見ると良さそうです。

```bash

$ git log V1.0..V1.1 --pretty=format:"%ad %<(18)%cn %s" --date=short --no-merges
```

|オプション|内容|
|--------:|:------------|
|%ad      | Author の日付 (-date= オプションに従った形式) |
|%cn      | Committer の名前 |
|%s       |  件名 |

## 参考
* http://qiita.com/harukasan/items/9149542584385e8dea75
[Laravel]バリデーションalpha_num指定しても全角文字が通ってしまう問題

下記記事はLarave4ですがLaravel5でも表題の事象が発生します。

# 追記（正規表現を使おう）

**regex**を使って正規表現を利用する

``` php
/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return [
        'name' => 'required',
        'identifier' => 'required|regex:regex:/^[a-zA-Z0-9-]+$/|max:255',
    ];
}
```


## alphaバリデーションについて
* 半角英数字の入力を制限するフィールドで日本語の入力が通ってしまう悲しい

## 下記で対応(但し次はAttributes()が動かなくなります・・・)

App\Services\CustomValidator.phpファイルを作成

``` php
<?php
 
namespace App\Services;
 
class CustomValidator extends \Illuminate\Validation\Validator 
{
    /**
     * alpah
     *
     * @param string $attribute
     * @param string $value
     * @return true
     */
    protected function validateAlpha($attribute, $value)
    {
        return (preg_match("/^[a-z]+$/i", $value));
    }
     
    /**
     * alpah_dash
     *
     * @param string $attribute
     * @param string $value
     * @return true
     */
    protected function validateAlphaDash($attribute, $value)
    {
        return (preg_match("/^[a-z0-9_-]+$/i", $value));
    }
     
    /**
     * alpah_num
     *
     * @param string $attribute
     * @param string $value
     * @return true
     */
    protected function validateAlphaNum($attribute, $value)
    {
        return (preg_match("/^[a-z0-9]+$/i", $value));
    }
}
```
* バリデーション処理を変更したい処理を記述する

### App\Providers\AppServiceProvider.phpファイルでカスタムバリデーションを適用する

``` php
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
         Validator::resolver(function($translator, $data, $rules, $messages)
        {
            return new CustomValidator($translator, $data, $rules, $messages);
        });
    }
```

[参考サイト]
http://www.larajapan.com/category/laravel/
Xcode8でXcode7で作ったプロジェクトを開いて、XIBから追加したActionがエラーになるときの対処法

今まで通りXcodeでXIBとかStoryboard上で、ボタンを右クリックのドラッグ・アンド・ドロップで、コードにActionを追加すると、

```
[Hoge didTapShowButtonWishSender]: unrecognized selector sent to instance xxxxxx
```

というエラーになっていて、ドキュメントアウトラインから確認すると、メソット名にWithSenderが付いている。
![スクリーンショット 2016-09-23 17.59.47.png](https://qiita-image-store.s3.amazonaws.com/0/92539/5b133cbf-60f1-5692-e43f-38ed53bbd4c9.png)

しかしコード上に自動補完で挿入されるメソッドにはWithSenderがついてない。
![スクリーンショット 2016-09-23 18.00.05.png](https://qiita-image-store.s3.amazonaws.com/0/92539/c769c3fa-af91-e785-1739-7e2c21050f44.png)

Swift 3.0からメソッドのラベルの挙動が変わった影響で、第一引数にもラベルをつけないといけないらしい。
http://stackoverflow.com/questions/39543103/how-to-create-ibaction-in-xcode-8-for-ios-10

なので、引数にwithSenderのラベルをつけて、もう一度コネクションを付け直したら無事復活。
![スクリーンショット 2016-09-23 18.21.25.png](https://qiita-image-store.s3.amazonaws.com/0/92539/369e29f4-80d9-c223-625a-5de93abdd36f.png)

因みに、Xcode8で新規にプロジェクトを作ると、

```swift
@IBAction func didHogeHoge(_ sender: AnyObject)
```

となるので問題ない。

自分がプロジェクトを開いたときのコンバートに失敗したのか、よくわからないが、同じ問題にハマる人がいそうなので参考になれば。
お手軽気軽手ぶら無料！Databricks Community EditionでApache Sparkにダイビングする

Databricks Community Edition https://community.cloud.databricks.com/ とはApache Sparkの開発元のDatabricksが提供するクラウド開発環境の無償版です。

# アカウント作成
最近よくある他のアカウントでの登録は不可で直接登録が必要。Sign Upから。

# 環境
- CPU 0.88core, メモリ6GBとのこと。ファイル容量は私が調べた限りでは不明。
- Python, Scala, SQL, Rが使用可能
- Notebookスタイルでコードを実行

# 実行
## クラスター作成
- 画面左側のClustersでクラスターを作成する。
    - Create Clusterボタン
        - Cluster Nameを入力
        - Apache Spark Versionを選択
            - 特に決めがなければ最新の Spark 2.0 (Scale 2.11) でよいのではないでしょうか。
            - AWS環境を用いるようです。特に変更せず。
        - Create Clusterボタン
        - Active Clustersに先程作ったクラスターが表示されます。
            - 最初Pendingとなり、数分後Runningとなります。
- 画面左側のWorkspaceで実行環境を準備
    - Workspaceペインが開くので Workspace - Create - Notebook を指定
    - Create Notebookウィンドウが開くので
        - Nameを入力
        - LanguageでPython, Scala, SQL, Rが指定可能。ここではPython
        - Clusterで先程作成したクラスターが選ばれている
        - Createボタン
- コードの実行
    - テキストボックスが表示されるのでそこにコードを入力する
        - 改行で複数行を入力可
    - 実行は Shift + Enter か Run All ボタン

# チュートリアルの実行
## [A Gentle Introduction to Apache Spark on Databricks](https://community.cloud.databricks.com/?o=1610433909245455#notebook/1853739812610711)
* コードを順番に入力し実行すれば可能
    * グラフは
        * display(diamonds) を実行後
        * 表の下の真ん中のグラフのボタンで Bar を選択
        * 表の下の右の Plot Options... ボタンでグラフの設定画面となり、下記を指定
            * Keys: cut
            * Series groupings: color
            * Values: price
            * Aggregation: AVG
    * フロー図は
        * df2.count() を実行後
        * 結果の Spark Jobs をクリック
            * View をクリック
                * Dag Visualization をクリック

他のチュートリアルもありますが、Scalaのようで今回は略。よさそうなチュートリアルがあれば記事を追加します。
gemをインストールする

#gemとは
RubyGemsで管理されるrubyのアプリケーションやライブラリのことです。
gemはコンソールから簡単にインストール・削除することができます。

さっそくgemをインストールしてみます。今回はprawnというpdfを作るライブラリをいれます。
gemのインストールは`gem install`でできます。

```bash
gem install prawn
Fetching: ttfunk-1.4.0.gem (100%)
Successfully installed ttfunk-1.4.0
Fetching: pdf-core-0.6.1.gem (100%)
Successfully installed pdf-core-0.6.1
Fetching: prawn-2.1.0.gem (100%)
Successfully installed prawn-2.1.0
Parsing documentation for ttfunk-1.4.0
Installing ri documentation for ttfunk-1.4.0
Parsing documentation for pdf-core-0.6.1
Installing ri documentation for pdf-core-0.6.1
Parsing documentation for prawn-2.1.0
Installing ri documentation for prawn-2.1.0
Done installing documentation for ttfunk, pdf-core, prawn after 3 seconds
3 gems installed
```
うまくいきました。削除は`gem uninstall`です

```bash
gem uninstall prawn
Successfully uninstalled prawn-2.1.0
```

この方法でインストールするgemは`gem environment`のINSTALLATION DIRECTORY以下にインストールされます。

#gemコマンドでgemを入れることによるデメリット
gemの更新によってそのgemを使用しているアプリケーションが動かなくなる場合、gemコマンドはその問題を回避できません。

#そこでbundler
bundlerもgemを管理するツールですがgemと違うのは、他のgemに依存され続けているgemの更新を認めません。そうすることによって、gem間の依存関係による問題を回避します。
bundlerのメリットはそれだけではありません。プロジェクト毎にgemを管理できるので、そのプロジェクト専用のgemの環境を構築できます。更に、bundlerではinstallするgemをGemfileに記述するので、そのGeｍFileをgit等で管理すれば複数人の開発者の開発環境を同期させることができます。

#bundlerを使ったgemのインストール
bundlerではインストールするgemをGemfileに記述します。
Gemfileは`bundle init`で作成できます。
作成されたGemfileにインストールしたいgemを記述していくのですが、この時いろいろなバージョン指定の方法があります。

| version specifiers |  meaning |
|:-----------:|:------------:|
| =       |     指定されたバージョンのみ     |
| >     |    指定されたバージョンより大きいもの    |
| >=       |     指定されたバージョン以上のもの     |
|  <       |      指定されたバージョンより小さいもの      |
|<=       |    指定されたバージョン以下のもの    |
| ~>    |   ~> 2.2 の場合は 2.2.beta.12の様なプレスリリースのバージョン    |

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

gem 'bootstrap-sass', '3.2.0.0'`
```

の様にGemfileに書いたあと、
`bundle install`をすることでGemfileに記述されているgemをsourceの後に指定されたurlにgemを見に行きます。

#bundlerで入れたgemの保存場所
デフォルトではgemコマンドで入れた場合と同じ場所にインストールされる。インストール先を指定したい場合は`bundle -install --path hoge/huga`のようにすることで指定できる。
bundleは指定された場所を覚えるので次からは指定する必要はない。

#よく使うbundlerのコマンドやそのオプション

| コマンド | 処理 |
|:-------------------:|:------------:|
|bundler install --path <path>|指定されたpathにGemfileの内容に<br>もとづいてXgemをインストール|
|bundler exec <command> | bundlerでインストールされたコマンドを<br>そのコンテキストに基づいて実行する。|
|bundler list|インストールしたgemの一覧|

bundler execの意味はこの記事を書くまで知らなかった。
Laravel 5.3で自作helper関数を定義する



* Laravel本体で使用されるhelper関数群は、vendor/laravel/framework/src/Illuminate/Foundation/helpers.phpに記述されている。
* 自作のhelper関数を定義しておくと何かと便利そうなので作ってみる。

## helpers.phpの作成

* 例として、subdomain関数(=リクエストURLからサブドメイン部分のみを切り出して返す関数)を定義してみる。

	```app/Helpers/helpers.php
	<?php
	
	/**
	 * リクエストされたURLから、サブドメイン部分のみを取得して返す。
	 */
	if (!function_exists('subdomain'))
	{
		function subdomain()
		{
			url();
			$httpHost = Request::getHttpHost();
	
			$httpHostParts = explode('.', $httpHost);
	
			return $httpHostParts[0];
		}
	}
	```

## autoloadの設定

* 作成したhelpers.phpが自動的に読み込まれるよう、composer.jsonに記載する。

	``` composer.json
	{
		...
		"autoload": {
			...
			"files": [
				"app/Helpers/helpers.php"
			]
			...
		},
		...
	}
	...
	```

* dump-autoload実行

	``` console
	composer dump-autoload
	```

* 以上で、どこからでもsubdomin()を呼び出せるようになった。
Signing for プロジェクト名 requires a development team. Select a development team in the project editor.が解消できない人



# 対象
Xcode8以前のプロジェクトをXcode8で開いたら、Signing 周りがエラーで、プロジェクトを見ると未設定なのは分かってはいるけど、何回設定してもAppleIDのログインを求められて、「既にいるよ」と何回も言われてる人

# 自分の場合

「既にいるよ」と言われた後、Xcodeを再起動したら、きちんと認識してくれました。

細かいっちゃ細かいけど、ggっても出なかったので念のため書いときます。
Windowsバッチ ツリー形式に配置されているファイルをルートディレクトリに移動する

# 概要

指定したディレクトリ内のサブディレクトリにあるファイルを、指定したディレクトリ内に移動したい。

## 例

* 移動前
    * c:/data/targetDir
        * A
            * a1.txt
            * a2.txt
        * B
            * b1.txt
            * b2.txt
        * 1.txt
* 移動後
    * c:/data/targetDir
        * a1.txt
        * a2.txt
        * b1.txt
        * b2.txt
        * 1.txt

# 環境

* Windows 7

# 処理

```bat:moveFile.bat
@echo off
setlocal enabledelayedexpansion

set TARGET_DIR=C:\data\targetDir

echo ルートディレクトリ:%TARGET_DIR%
cd /d %TARGET_DIR%
for /F %%A in ('dir /ad /b') do (
	cd /d %TARGET_DIR%
	cd /d %%A
	echo 移動対象サブディレクトリ:%%A
	for /F %%B in ('dir /a-d /b /s *.*') do (
		echo 移動対象:%%B
		move %%B %TARGET_DIR%
	)
)
cd /d %TARGET_DIR%
for /F %%C in ('dir /ad /b *.*') do rmdir /s /q %%C
```

# 説明

* `dir /ad /b` で対象ディレクトリ直下のサブディレクトリを取得
* `dir /a-d /b /s *.*` でサブディレクトリ内のファイルを再帰的に取得し、`move`で移動
* 最後に`dir /ad /b *.*`で対象ディレクトリ直下のサブディレクトリを取得して、`rmdir /s /q %%C`で削除
疾走！WEB・クラウド上での機械学習、環境設定に悩んでいる時間なんて僕らには、残されて、な、い【途中】

「人工知能で何かやれ」「ディープラーニングで何かやれ」って上司から言われ、「GPUって何？サーバーを買うお金がない。ライブラリの読み込みのエラーが分からん。」とお嘆きのご貴兄姉の皆様。環境設定入らずでディープラーニングにダイビングできるんです。これなら、「どう、進んでる？」という突然の上司の訪問や、社内技術成果報告会などのちょっとしたパーティにも慌てることがありません。（いえね、クラウド上の無料の機械学習環境のありものを使って深層学習フレームワークのチュートリアルレベルを試してみようというだけの話しなので、これくらいじゃ不十分なのは分かってますよ。でも環境が用意できず悶々としている方が多いのかなと思ってます。まず一歩踏み出しましょうよって）

# 機械学習一般
* Microsoft Azure Machine Learning
    * 【記事作成中】ちょっとまって
* IBM Data Scientist Workbench
    * RStudio, Jupyter等がWEBで気軽に試せる
    * 紹介記事を書きました。[お手軽気軽手ぶら無料！IBM Data Scientist Workbenchで深層学習TensorFlow, Chainer, Kerasにダイビングする（途中まで）](http://qiita.com/aokikenichi/items/827bc3ab6a2956932e6c)
* Databricks Community Edition
    * Apache SparkがWEBで気軽に試せる
    * 紹介記事を書きました。[お手軽気軽手ぶら無料！Databricks Community EditionでApache Sparkにダイビングする](http://qiita.com/aokikenichi/items/db8b954066839edacb7a)
* 以下、調べて書きます
* Amazon Machine Learning
* Google Prediction API
* BigML

# 画像認識
* [Labellio](http://www.labell.io)
    * ブラウザ上で画像分類ができる
        * 基本英語だが、チュートリアルは日本語あり。
    * GitHubかGoogleアカウントでログイン
    * トレーニング画像は、自PCからアップロード、URLリストで指定、BingかFlickrを指定して設定したキーワードで検索、から選べる
        * アップロードの場合はZIP形式で、ZIPとしての最大サイズは512MBで画像数は10,000枚まで
        * URLリスト指定の場合は画像10,000枚まで
        * BingかFlickrの場合は検索キーワードがラベルとなり、1キーワード当たり画像50枚までが採用され、キーワード数は100個まで
    * テスト画像は、自PCからアップロード、URLリストで指定可能
    * 結果
        * Bingで"dog", "cat", "monkey"で学習セットを作成
            * （画像数にもよるでしょうが数分で学習完了しました）
        * 犬、猫、猿だと当たるだろうので意地悪してGoogleでライオン画像を検索し下記をテストに掛けたら、、、
            * http://www.tomorrow-is-lived.net/image/wildlife/felidae/lion.jpg
            * monkey 0.95, cat 0.04, dog 0.01 と出た
        * 猫
            * https://upload.wikimedia.org/wikipedia/commons/thumb/3/33/Hannibal_Poenaru_-_Nasty_cat_!_(by-sa).jpg/270px-Hannibal_Poenaru_-_Nasty_cat_!_(by-sa).jpg
            * cat 0.74, monkey 0.26, dog 0.00
            * まぁ当たるね
        * 作成したモデルとトレーニング画像のURLをダウンロードできる
            * モデルはCaffeのフォーマット
            * トレーニング画像は今回はBing検索で得たものなのでBingのURLリスト
    * PCにインストールしてのコマンドライン版もあるとのこと

# 自然言語処理
以下、調べて書きます。
* Translator API
* カメリオAPI
* RECAIUS
MySQLで実行環境によってQuery errorになる問題（only_full_group_by）

サーバー上で動いている資源をローカルで動かそうとすると以下のエラーが発生した。

`Query error: Expression #33 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'hogehoge' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by`

当初、資源が違うのでは？とも思ったがどうやらMysqlのVersionによる設定の問題らしい。
キーワードはエラーの最後に出ている`sql_mode=only_full_group_by`
調べてみるとMysqlのVersion5.6ではONLY_FULL_GROUP_BYがデフォルトでオフだったものが
Mysql5.7からオンになったとの事。

この設定のせいでgroup_byで非集約でも上手い事（？）実行してくれていたらしい。
実際に実行されているSQLを見てみると「なんでコレで動いてんの。。。」的なSQLが書いてあった。

5.6以前のVersionでもonly_full_group_byはオフにしておくのが無難、と言うか
そもそもちゃんとしたSQLを書けば良いというだけのお話ではある。
LeapMotionの手のPrefabsについて

#はじめに
UnityでLeapMotionのAssetをimportしていろいろやろうとしたら，手のPrefab周りで混乱してた．今後見返すためや，同じとこで困ってる人のためにメモ程度でなんとなく記録を残す．(間違ってたらご指摘ください)

#二種類のPrefab
LeapMotionのアセットにあるLeapMotion/Prefabs以下にはHandModelsNonhumanとHandModelsPhysicalがある．これらの主な違いは次の表のような感じになる．

||Nonhuman|Physical|
|:--:|:-:|:-:|
|指のbone等にColliderが|ない|ある|
|実行時に表示|される|されない|

Scenesにあるデモを見るとわかるように，この二種類の手をLeapHandControllerにアタッチされたHand Poolに指定して手の制御を行っている．わざわざ二種類用意しているのは，きっと(仮想的な)手の形に合わせて衝突判定をしてもいいことがあまりないからだと思う．

#物理手の階層化
Physicalの方に属するRigidHandは各boneまで階層化されているが，NonhumanのCapsuleHandなどはそうではない．下の図はDesktop版デモのHierarchyビュー．

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/123362/6855286a-1308-7885-6ad0-f9d823160388.png)

物理手も階層化されたものがあると便利なので，調べてみたら[公式の作成チュートリアル(とても丁寧)](https://developer.leapmotion.com/documentation/unity/unity/Unity_MakeDiscreteHand.html)があった．これをみながら作ることで解決．
CapsuleHandは一つのスクリプトで制御しているが，このチュートリアルに従って作成するとRigidHand/RigidFingerと同じようなオブジェクト，スクリプトの構成で物理手を作ることができる．下の図はチュートリアル終了時のHierarchyビュー．

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/123362/13d9ab8c-3fd5-2479-43f6-850eccf20282.png)

#おわりに
LeapMotionは[公式のドキュメント](https://developer.leapmotion.com/documentation/unity/index.html)が割と充実しているので，そこを見るだけで解決することが割とある(英語だけど)．
マスタブラウザについて

マスタブラウザについてまとめたいと思います。

#マスタブラウザとは
Windowsでは、LAN上のPCの中でもっとも最新のOSで動いているPCに__マスタブラウザ__の役割が与えられます。
マスタブラウザは他のPCから情報を収集し、その一覧を他のPCに提供します。これがネットワークコンピュータにおいて表示されるPCの一覧になります。

#特定のPCをマスタブラウザにする方法
1. LAN上の全てのWindows PCの電源を切り、マスタブラウザにしたいPCを最初に起動します。
2. マスタブラウザにしたいPCが起動し終わってから他のPCを起動します。

#参考文献
* [ネットワークのリストにコンピュータが表示されたりされなかったりします。 - Windows 7 解決済 | 教えて！goo](http://oshiete.goo.ne.jp/qa/5958172.html)
deviseでOmniAuth以外のログインを許可しない設定にする

githubのdeviseのページのwikiに書いてあるのですが、よく忘れてしまいそうなのでメモとしてそこだけ書いておきます。

# Controller

OmniAuthのコールバックに対応するためのControllerを作っておきます。

```bash
bin/rails g devise:controller User
```

そして、コールバックに対応するメソッドを定義します。
今回はtwitterにOAuthすると仮定して、twitterメソッドを定義します。

```rb:app/controllers/users/omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def twitter
    # 中身は適当にカスタマイズしてください
    oauth_data = request.env['omniauth.auth']
    @user = User.find_or_create_with_twitter(oauth_data)
    @user.assign_access_token(oauth_data)
    @user.save
    sign_in(@user)
    set_flash_message(:notice, :success, kind: 'twitter') if is_navigational_format?
    redirect_to root_path
  end
end
```

# Model

`User`モデルはすでにdeviseで作っていると仮定して、OmniAuthで必要になるカラムを追加します。
`access_token`カラムは必須ではないですが、ここではDBに保存することにします。

```bash
bin/rails g migration AddUidAndProviderAndAccessTokenToUser uid:string provider:string access_token:string
bin/rake db:migrate
```


`User`モデルはシンプルに。

```rb:app/models/user.rb
class User < ApplicationRecord
  devise :trackable,
         :omniauthable

  def self.find_or_create_with_twitter(auth)
    user = self.find_by(uid: auth.uid, provider: auth.provider)
    return user unless user.nil?
    # 他の項目を追加したい場合はcreateの中身を修正するなど
    self.create(
      uid: auth.uid,
      provider: auth.provider
    )
  end

  def assign_access_token(auth)
    self.access_token = auth.credentials.token
  end
end
```

# Routes

`User`モデルで`:database_authenticatable`を使わないようにしているので、ログイン、ログアウトのpathは作られません。しかし、OAuthでログイン後にログアウトしたくなったときに困ります。そこで、ログアウト用のpathを定義します。

```ruby:config/routes.rb
devise_for :users,
           controllers: {
             omniauth_callbacks: 'users/omniauth_callbacks'
           }


devise_scope :user do
  # ログアウトのpathをここで定義する
  delete 'sign_out', to: 'devise/sessions#destroy', as: :destroy_user_session
end
```

# View

bootstrap3でナビゲーションバーにログイン・ログアウトボタンがあると仮定します。

```erb:app/views/layouts/_navbar.html.erb
<nav class="navbar navbar-default">
  <div class="container-fluid">
    <div class="navbar-header">
      <%= link_to 'Something', root_path, class: 'navbar-brand' %>
    </div>
    <div class="collapse navbar-collapse">
      <ul class="nav navbar-nav navbar-right">
        <% if current_user %>
          <li>
            <%= link_to destroy_user_session_path, method: :delete do %>
              <i class="glyphicon glyphicon-log-out"></i>&nbsp;ログアウト
            <% end %>
          </li>
        <% else %>
          <li>
            <%= link_to omniauth_authorize_path(:user, :twitter) do %>
              <i class="glyphicon glyphicon-log-in"></i>&nbsp;twitterアカウントでログイン
            <% end %>
          </li>
        <% end %>
      </ul>
    </div>
  </div>
</nav>
```

# 参考URL

https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview
ターミナル(OS X EI Capitan)に新しいフォントを追加する

# 動機
自分のターミナルに新しいフォントを追加したいなと思ったため
すでにネットやQiitaに同じ記事があると思いますが、調べるのめんどくさいのでまとめます

# 手順
1 [M+IPAの合成フォント](http://mix-mplus-ipa.osdn.jp/)とかからZipファイルをダウンロードし、Zipファイルを解凍しておく
2 Font Book アプリ(デフォルトアプリ)を開く
3 コレクションツリーの下にある + ボタンを押して新しいコレクションを作成する
4 作成したコレクションを選択し、ヘッダー部分の + ボタンを押す
5 先ほど解凍したフォルダ内にある.ttfファイルを選択する
6 あとはターミナルの環境設定で作成したFontコレクションを選択し、Fontを設定すればOK!

以上
KotlinとJavaが混在するプロジェクトにおけるGradleのCompile Encoding設定について

#確認環境
* Gradle v3.0
* Java v1.8.0_102
* Kotlin v1.0.4

#経緯
Javaで作られたプロジェクトにKotlinを混ぜ込んでbuildした際にGradleがエラーを吐いたために気がつきました。

#元ソース

```build.gradle(抜粋)
apply plugin: 'java'

def defaultEncoding = 'UTF-8'
tasks.withType(AbstractCompile).each {
    it.options.encoding = defaultEncoding
}
```
#Kotlin追加後(エラー発生)

```build.gradle(抜粋)
buildscript {
    // 省略
}

apply plugin: 'java'
apply plugin: 'kotlin'

def defaultEncoding = 'UTF-8'
tasks.withType(AbstractCompile).each {
    it.options.encoding = defaultEncoding
}
```

この状態でgradle checkを実行すると以下のエラーが発生します。

```build.gradleエラー内容
FAILURE: Build failed with an exception.
* Where:
Build file 'build.gradle' line: 24
* What went wrong:
A problem occurred evaluating root project 'fooProject'.
> Could not get unknown property 'options' for task ':compileKotlin' of type org.jetbrains.kotlin.gradle.tasks.KotlinCompile.
```

どうやらorg.jetbrains.kotlin.gradle.tasks.KotlinCompileがoptionsを持っていないことが原因の模様。
(同様にKotlinTestCompileもoptionsを持っていませんでした)

#解決策
ふつうに使うものを列挙すればいいよね、ということで解決しました。

```build.gradle(最終版)
buildscript {
    // 省略
}

apply plugin: 'java'
apply plugin: 'kotlin'

def defaultEncoding = 'UTF-8'
[compileJava, compileTestJava]*.options*.encoding = defaultEncoding
```

一瞬Kotlinを除外するか･･･とか考えたのですが、どうみてもネタ。。。

```build.gradle(ネタ)
tasks.withType(AbstractCompile)
     .matching({t -> !t.getName().contains("Kotlin")})
     .each {
         it.options.encoding = defaultEncoding
     }
```
リーン・スタートアップ用語集

あとで追加・編集します。

WEBサービスを作っていて、事業の方法論としてのリーン・スタートアップの用語をまとめました。

# 用語集
## リーン・スタートアップ
事業の立ち上げに関する方法論のうち、仮説の構築、製品の実装、および軌道修正、という過程を迅速に繰り返すことによって、無駄な無価値な要素を最小限に抑えつつ素早く改良を続け、成功に近づく、というビジネス開発手法。

## MVP
Minimum(最小限の)-Viable(実行可能な)-Product(製品)の略。要となる仮説に基づいた、実用最小限の製品。類語としてプロトタイプ。「MVPとは、（Build-Measure-Learnの）フィードバック・ループ１周を回せる『必要最低限の労力』＋『最低限の実装時間』バージョンの製品(『リーンスタートアップ』)」

### 参照
・[MVPとは？をもう一度考えてみた](http://leanstartupjapan.org/?p=530)

## BMLのフィードバックループ
Build(構築)-Measure(計測)-Learn(学習)の略。類語としてPDCA。
定量的手法をソフトウェア開発に持ち込んだ、ソフトウェア工学者のトム・デマルコ氏は、“You can’t control what you can't measure”（測定できないものを扱うことはできない）という名言を残した。「[仮説なきデータに意味は無く、仮説なき定量検証に学びは無い](https://tommygx90.wordpress.com/2014/01/27/seven-eleven01/)」あるように、仮説を立て、定量的に測定するループを繰り返す方法論であり、思想がリーンスタートアップといえる。



## ピボット
本来「回転軸」を意味する英語で、転じて近年は企業経営における「方向転換」や「路線変更」を表す用語。とりわけスタートアップ企業が当初の事業戦略に行き詰まって、大きな軌道修正を余儀なくされたり、まったく別のアイデアに取り組んだりすること、またそうした経営判断そのもの。

## アーリーアダプター
イノベーター理論におけるグループ一つ。社会と価値観を共有しているものの、流行には敏感で、自ら情報収集を行い判断する初期少数採用者のグループ。「オピニオンリーダー」となって他のメンバーに大きな影響力を発揮することがある。全体の13.5％を構成する。イノベーターとアーリーアダプターの割合を足した16％のラインが、商品普及のポイントで、「普及率16％の論理」として提唱されており、アーリーアダプターとアーリーマジョリティとの間には容易に超えられない大きな溝（キャズム）がある。

## ペルソナ
企業が提供する製品・サービスの最も重要で**象徴的なユーザモデル**のこと。徹底したユーザ視点からニーズをつかみ、ユーザモデルを開発（発見）することをペルソナデザインという。

## デモグラフィック
人口統計学的属性。顧客データ分析の切り口のひとつ。**性別、年齢、住んでいる地域、所得、職業、学歴、家族構成など**その人のもつ社会経済的な特質データ。

## リーン生産方式
1980年代にMITでトヨタ生産方式を研究し、その成果を再体系化・一般化したものであり、生産管理手法の一種。製造工程におけるムダを排除することを目的として、製品および製造工程の全体にわたって、トータルコストを系統的に減らそうとするのが狙い。英単語のleanは「贅肉のとれた」。
日本の製造業の生産システムはボトムアップ型に基づいた暗黙知ベースのシステムが形成されていることが支配的であり、その中で結果としてムダが排除されていく。しかしボトムアップでは**部分最適に陥りやすく、局所的にムダが排除されても全体で見た場合にはムダが排除しきれていない状態が生じやすい**。言い換えれば「いびつな贅肉の取れ方=ダイエットに失敗した状態」が起こりうる。それらを踏まえMITで行われた研究は、それらと**トップダウン型の形式知ベースのシステムとの融合**やその体系化などである。トップダウン型になることによって、全体最適が追求しやすくなり、組織全体としてバランスがよくなりムダを排除しやすくなる。

## アジャイル開発
迅速かつ適応的にソフトウェア開発を行う軽量な開発手法。反復 (イテレーション) と呼ばれる短い期間単位を採用することで、リスクを最小化しようとしている。 1つの反復の期間は、プロジェクトごとに異なるが、1週間から4週間くらいであることが多い。

## フィット・アンド・フィニッシュ
ニーズや嗜好に対するぴったし感と仕上がりの良さ。
Home Screen Quick Actions の UIApplicationShortcutIcon 一覧

UIApplicationShortcutIconが画像でまとまっているページが見つからなかったので、スクリーンショットでまとめてみました。

## 実行環境
iPhone 6S
iOS 9.3.5
Xcode 7.3.1

## iOS 9.0以上で使用可能
![01.PNG](https://qiita-image-store.s3.amazonaws.com/0/25732/a3676481-0442-922f-6080-ef98d7069b30.png)
![02.PNG](https://qiita-image-store.s3.amazonaws.com/0/25732/fb744aa1-f4ba-3ac7-f6cc-5dab7ebc6648.png)

## iOS 9.1以上で使用可能
![03.PNG](https://qiita-image-store.s3.amazonaws.com/0/25732/9b250efd-45da-6f65-6711-82d0fb238a7f.png)
![04.PNG](https://qiita-image-store.s3.amazonaws.com/0/25732/ea8d66b7-0a46-be39-30d0-83832ff5b74d.png)
![05.PNG](https://qiita-image-store.s3.amazonaws.com/0/25732/2fb3d1b5-2e5d-ad75-69fe-7f0dab69bafe.png)
![06.PNG](https://qiita-image-store.s3.amazonaws.com/0/25732/98bb84bc-20d4-03d7-aea5-dc28d63c97f5.png)
![07.PNG](https://qiita-image-store.s3.amazonaws.com/0/25732/d69e040a-88b7-7cbc-084e-822e42f81cd6.png)
![08.PNG](https://qiita-image-store.s3.amazonaws.com/0/25732/d81e4003-2e52-f4a9-3801-65dbf9351cc7.png)

## 補足
### レイアウト逆転
アプリの位置が中央含め左側にあるとアイコンが左にあるレイアウトになります。
というか本来こっちがデフォルトですね。
後になって気づいて撮り直すのがめんd（

![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/25732/03dac9d8-3703-1205-d7ab-55201aa5b53e.png)

### Subtitleと表示文字数
タイトルは１行半角25文字, 全角10文字（サブタイトルなしの場合はその倍）
サブタイトルは半角26文字, 全角13文字

これ以上は3点リーダに末字が潰されます。
逆転しても表示可能文字数は変わりませんでした。
※System Fontの変更、文字列が変わることで変動する可能性があります。

![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/25732/75849cf0-40bb-015b-cb3d-fe27ef68bea7.png)
![09.PNG](https://qiita-image-store.s3.amazonaws.com/0/25732/7eb314b1-1583-74a8-6294-7136b249963b.png)
Swiftで子Viewに対して親ViewにFitするようにAutoLayoutの制約を追加する



```swift
extension UIView {
    func addFitConstraints(to: UIView) {
        to.translatesAutoresizingMaskIntoConstraints = false
        self.addConstraint(NSLayoutConstraint(item: to,
                                              attribute: .top,
                                              relatedBy: .equal,
                                              toItem: self,
                                              attribute: .top,
                                              multiplier: 1.0,
                                              constant: 0))
        self.addConstraint(NSLayoutConstraint(item: to,
                                              attribute: .leading,
                                              relatedBy: .equal,
                                              toItem: self,
                                              attribute: .leading,
                                              multiplier: 1.0,
                                              constant: 0))
        self.addConstraint(NSLayoutConstraint(item: self,
                                              attribute: .bottom,
                                              relatedBy: .equal,
                                              toItem: to,
                                              attribute: .bottom,
                                              multiplier: 1.0,
                                              constant: 0))
        self.addConstraint(NSLayoutConstraint(item: self,
                                              attribute: .trailing,
                                              relatedBy: .equal,
                                              toItem: to,
                                              attribute: .trailing,
                                              multiplier: 1.0,
                                              constant: 0))
    }
}
```

```swift
let superView = UIView()
let subView = UIView()
superView.addSubview(subView)
superview.addFitConstraints(to: subView)

```
aptコマンドチートシート

`apt`コマンドのチートシートです(主にUbuntuでの`apt`コマンドを想定しています)。
※`apt`コマンドと`apt-get`, `apt-cache`コマンドとの違いについては[Ubuntu 16.04 / Debian 8: aptコマンドの使い方 - Narrow Escape](https://www.hiroom2.com/2016/05/12/ubuntu-16-04-debian-8%E3%81%AEapt%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)をご覧ください。
※debファイルとは、apt用のパッケージファイルを指します。
※[`apt-fast`](https://github.com/ilikenwf/apt-fast)をインストールし、以下の表の`apt`を`apt-fast`に置換することで、ダウンロード処理の高速化を図ることができます。

|コマンド|内容|
|:--:|:--:|
|`sudo apt update`|パッケージ一覧を更新<br>( __リポジトリ追加・削除時には必ず実行すること__ )|
|`sudo apt upgrade`|パッケージを更新<br>(通常のパッケージ更新時はこのコマンドを使用する)|
|`sudo apt full-upgrade`|パッケージを更新<br>(保留されているパッケージを更新するときに使用する)|
|`sudo apt autoremove`|更新に伴い必要なくなったパッケージを削除<br>(`apt`実行時にこのコマンドを実行するよう表示されたら実行する)|
|`sudo apt install {パッケージ名やdebファイルのパス}`|パッケージやdebファイルをインストール|
|`sudo apt remove {パッケージ名}`|パッケージを削除|
|`sudo apt remove --purge {パッケージ名}`|パッケージを __完全削除__|
|`apt show {パッケージ名}`|パッケージの詳細情報を表示|
|`apt list {パッケージ名}`|パッケージを検索(完全一致)|
|`apt search {パッケージ名}`|パッケージを検索(部分一致)|
|`dpkg -l`|インストール済みのパッケージ一覧を表示|
|`dpkg -L {パッケージ名}`|パッケージのインストール先を表示|
|`cat /var/log/apt/history.log`|`apt`コマンドの使用履歴を表示|
|`sudo apt autoclean`|キャッシュされているが、インストールはされていないdebファイルを削除|
|`sudo apt clean`|キャッシュされている全てのdebファイルを削除|
|`apt moo`|Super Cow Powersを発動 (詳しくは[スーパー牛さんパワー！ - ぬいぐるみライフ？](https://mickey24.hatenablog.com/entry/20080808/1218161057)参照)|
|`echo "{パッケージ名} hold"` &#124; `dpkg --set-selections`|パッケージをアップデート対象から除外|
|`echo "{パッケージ名} install"` &#124; `dpkg --set-selections`|パッケージをアップデート対象に戻す|

# 参考文献
* [Ubuntu/aptコマンドの操作ログの在処と確認方法 - Linuxと過ごす](http://linux.just4fun.biz/Ubuntu/apt%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E6%93%8D%E4%BD%9C%E3%83%AD%E3%82%B0%E3%81%AE%E5%9C%A8%E5%87%A6%E3%81%A8%E7%A2%BA%E8%AA%8D%E6%96%B9%E6%B3%95.html)
* [NetWalker覚書～へなちょこおたくメモ～: apt-get autocleanやapt-get cleanで不要なキャッシュを削除する](http://toshi-netwalker.blogspot.jp/2010/02/apt-get-autocleanapt-get-clean.html)
* [apt-get upgradeから特定パッケージを除外する - Qiita](https://qiita.com/strsk/items/c933a661c077a666073a)
* [【Linux FAQ】.debファイルをダウンロードしたのですが、どうやってインストールすればいいですか？ | Linux Fan](https://linuxfan.info/post-1881)
* [インストール済みパッケージの確認コマンド（Ubuntu 11.10） | monopocket blog](http://monopocket.jp/blog/linux/925/)
* [apt-getでインストールしたパッケージの場所（ディレクトリ） | とある森さんの自由帳（メモ）](http://kyotoforest.blog82.fc2.com/blog-entry-22.html)
NSURLは空文字で初期化するとオブジェクトを返すが、Swift 3.0のURL型は空文字で初期化するとnilを返す。

# 概要
Swift 3.0のURL型は初期化時に空文字が渡されるとnilになるっぽいです。

# 詳細
NSURLをSwiftで扱うと、空文字を初期化で渡したときに、NSURLのオブジェクトが作成されていました。

これを利用してユニットテスト内でNSURL(string: "")!とか書いて適当にオブジェクトを作っているところがあったのですが、Xcodd8のconvert機能を使ってNSURL -> URLの自動変換したときユニットテストがクラッシュするようになり気が付きました...


```swift
let nsurl = NSURL(string: "")
print(nsurl?.absoluteString) // => Optional("")
 
let url = URL(string: "")
print(url?.absoluteString) // => nil
```

# 参考資料

改めてドキュメント見ると、URLのところに空文字はnilと明記されています。
## URL

https://developer.apple.com/reference/foundation/url/1779737-init

```
Returns nil if a URL cannot be formed with the string 
(for example, if the string contains characters that are illegal in a URL, or is an empty string).
```

## NSURL

https://developer.apple.com/reference/foundation/nsurl/1413146-init

```
This method expects URLString to contain only characters that are allowed in a properly formed URL.
All other characters must be properly percent escaped. Any percent-escaped characters are interpreted using UTF-8 encoding.
```

# まとめ
やはりForce Unwrappingは使うもんじゃない...
Swift3.0で画像の切り抜き


APIの命名規則も変わったようなので、それに合わせて作ってみました。

一応Retina画像(scale値2以上)でもポイント単位で指定してもらえれば正しく処理できる予定です。
また、元の画像がopaque(＝不透明)かどうかも判定してイメージを生成しており、不透明の画像は不透明のフラグのままクロップされますので、クロップ後の画像の表示速度なども悪くはならない予定です。

```swift:
extension UIImage {
    func cropping(to: CGRect) -> UIImage? {
        var opaque = false
        if let cgImage = cgImage {
            switch cgImage.alphaInfo {
            case .noneSkipLast, .noneSkipFirst:
                opaque = true
            default:
                break
            }
        }
        
        UIGraphicsBeginImageContextWithOptions(to.size, opaque, scale)
        draw(at: CGPoint(x: -to.origin.x, y: -to.origin.y))
        let result = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return result
    }
}
```

## 使い方

```swift:
let img = UIImage(named: "HIRAyamatoneko_TP_V")!

// クロップしたい矩形を指定するだけ
let cropping = img.cropping(to: CGRect(x: 176, y: 71, width: 106, height: 92))
```

こちらの画像が
![HIRAyamatoneko_TP_V.png](https://qiita-image-store.s3.amazonaws.com/0/31347/e4dca8a8-d452-7fda-e294-4e38d30e7b72.png "HIRAyamatoneko_TP_V.png")

クロップされました。
![スクリーンショット 2016-09-23 15.37.18.png](https://qiita-image-store.s3.amazonaws.com/0/31347/228b6f95-9692-da30-d6d1-a55bfc67c469.png "スクリーンショット 2016-09-23 15.37.18.png")

※写真は[フリー写真素材ぱくたそ](www.pakutaso.com)様のものを使わせていただきました。
React API 说明


- [顶层API](http://qiita.com/xiangzhuyuan/items/c2037a48c8f7e83096d5)
- [组件 API](http://qiita.com/xiangzhuyuan/items/cb9f591bee8917af60e7)
- [组件的定义和其生命周期](http://qiita.com/xiangzhuyuan/items/abb5ca4833069c5295c2)
- [支持的标签和标签属性](http://qiita.com/xiangzhuyuan/items/28436cca91a81dcb6823)
- [事件](http://qiita.com/xiangzhuyuan/items/f2cc5bb72b83b7d276b2)
- DOM Differences
- Special Non-DOM Attributes
- Reconciliation
- Web Components
- React (Virtual) DOM Terminology
Excel > 入力後に右のセルに移動 > EnterでなくTabを押す

```txt:動作環境
Excel 2013 on Windows 8.1pro
```

横方向に300列の編集をすることになった。
普通に編集すると以下を延々とやって効率が悪い。

1. Enterで下に移動
2. カーソルで右上に移動
3. 編集
4. 1-3を繰り返す

編集後に右に移動する方法を探した。

https://support.microsoft.com/ja-jp/kb/968151
> Enter キーの代わりに Tab キーを押すと、カーソルが右隣のセルに移動するわよ。左隣のセルに移動したいときは、Shift キーを押しながら Tab キーを押すの。

設定を変更する方法もあるようだが、一時的に右方向に編集を続ける時はTabを使うのがよさそう。
私がどのようにして、機械学習とオープンソースへの情熱を違う業務をしながら自宅学習で満たしたか

[私がどのようにして、ソフトウェア開発とオープンソースへの情熱をパートタイムで博士号を取得することで満たしたか](http://postd.cc/how-i-satisfied-my-passion-for-software-development-and-open-source-by-doing-a-part-time-phd/)
に触発されて、各自の勉強法や使用しているツールなど晒したら楽しいのではないかと思った。実施する。

|ツール|名前|能書き|
|:-:|:-:|:-:|
|PC|Windows10|非力Windows。IT勉強会に行くと多くの人がMacなのが気になる。|
|ブラウザ|[Chrome](https://www.google.co.jp/chrome/browser/desktop/)|以前はFirefoxでプラグインを仕事用にガチガチに設定していたのだけれど重くなりすぎて乗り換えた。|
|Office|[Libre Office](https://ja.libreoffice.org/)|Apache Open Officeは危ぶまれてたけど、復活しそうなのよかったね。でもなんとなくLibre。少なくとも自宅使用でMicrosoft Officeの必要性を感じない。One DriveやGoogle DriveでもOffice機能あるしね。|
|クラウド|[OneDrive](https://onedrive.live.com/about/ja-jp/)|GoogleとかYahooとかちょこちょこ変えたがなんとなくOneDriveにした。|
|テキストエディタ|[Terapad](http://www5f.biglobe.ne.jp/~t-susumu/)|Atomとかに取り替えたほうがいいのかなぁ。|
||vi|Cygwinではvi|
|データ分析環境|[R](https://www.r-project.org/), [RStudio](https://www.rstudio.com/)|仕事でPython, Jupyterが必要になったので、ちょっとずつ触り始めた。|
|プログラム言語|[Perl](https://www.perl.org/)|家ではほとんど書くことないけれど、ちょっとしたデータ加工はPerl。Javascriptは少々。上述の通り最近少しずつPython|
||[Codecademy](https://www.codecademy.com/)|プログラミング言語講座 Pythonをやっている。Python, Java, Javascript, PHP, Ruby, SQL, etcがある。|
|仮想環境|[Cygwin](https://www.cygwin.com/)|VirtualBoxとかも遊んでは見たけれど、なんかCygwinを使ってしまう。   |
|自分サイト|[Google Site](https://sites.google.com/site/aokikenichi/)|開店休業。Twitterのようなつぶやき、Qiitaのような記事単位ならなんとか書けるが、きちんとまとめたサイトは「きれいにまとめなきゃ」意識が強く滞りがち。|
|SNS|[Twitter](https://twitter.com/aokikenichi)|TwitterはSNSのなのか？FBは実知り合いじゃなきゃだめとのことで使えてない。|
|ブログ|[Qiita](https://qiita.com/aokikenichi)|Yeah!|
|Moocs|[Udacity](https://www.udacity.com/), [Gacco](http://gacco.org/)|最近さぼってしまっている。統計学や機械学習のよい講座があるので、やらないと、、、|
|勉強会|[.dots](https://eventdots.jp/), [connpass](https://connpass.com/), [atnd](https://atnd.org/), [Doorkeeper](https://www.doorkeeper.jp/)|IT系の学習情報サイト。主に機械学習系に行っている。.dotsにキーワード登録して毎日メールで勉強会情報を得ている。connpass, atnd, Doorkeeperとも連携しているみたいでそれらの情報もまとめて得られる。|
|英語|[3x3Links](http://www.3x3links.com/)|英語サイトではなく、3x3のブロックにブックマークをまとめられるサイト。これに世界各国の国営放送やニュースサイトの英語版を登録してたまに読んでいる。日本のニュースでは得られない各国それぞれの立場があって興味深い。|
|本|[データサイエンス、機械学習関連の本](http://qiita.com/aokikenichi/items/ae4df263f591e47528a6)|機械学習まわりについて私が読んだ本のQiita記事。まぁ回り道ばかりですが大きくは外していないチョイスと思います。|
|図書館|[カーリル](https://calil.jp/)|全国6000以上の図書館の蔵書を横断的に検索できるサイト。利用する図書館を登録できるので、自宅と勤務先近くの図書館を指定している。予約したいときはカーリルから各図書館の予約サイトへリンクされる。機械学習系だけでも本が増えたので、がっつり勉強本は購入、時流をながめる本は図書館と使い分けるならカーリルは強力でしょう。|