OmniAICreator/Qiita-1.07M huggingface dataset:
Punditのrspec3をカイゼンしてみた

[Punditのrspecをカイゼンしてみた](http://qiita.com/icb54615/items/b5d391856c570d06e643) のrspec3系版です
と言っても記述を差し替えただけのメモなので経緯は上記記事を

## Macher

`failure_message_for_should` や `failure_message_for_should_not` は `deprecated`
ついでに`rubocop` に従い助長ですが変数に入れて1行の長さを抑えています

```ruby:spec/support/rspec_matcher.rb
RSpec::Matchers.define :authorize do |action|
  match do |policy|
    policy.public_send("#{action}?")
  end

  failure_message do |policy|
    klass = policy.class
    record = policy.record
    inspect = policy.user.inspect
    "#{klass} does not permit #{action} on #{record} for #{inspect}."
  end

  failure_message_when_negated do |policy|
    klass = policy.class
    record = policy.record
    inspect = policy.user.inspect
    "#{klass} does not forbid #{action} on #{record} for #{inspect}."
  end
end
```

## テスト

`expect` 記述に書き換えるだけです
ついでに`described_class`を使えばコピペ後に書き換える所が減ります

```ruby:spec/pundit/article_policy_spec.rb
require 'rails_helper'

describe ArticlePolicy do
  let(:record) { FactoryGirl.create(:article) }
  subject { described_class.new(user, record) }

  context 'for a visitor' do
    let(:user) { nil }

    it { is_expected.to     authorize(:show)    }
    it { is_expected.to_not authorize(:create)  }
    it { is_expected.to_not authorize(:new)     }
    it { is_expected.to_not authorize(:update)  }
    it { is_expected.to_not authorize(:edit)    }
    it { is_expected.to_not authorize(:destroy) }
  end

  context 'for a user' do
    let(:user) { FactoryGirl.create(:user) }

    it { is_expected.to authorize(:show)    }
    it { is_expected.to authorize(:create)  }
    it { is_expected.to authorize(:new)     }
    it { is_expected.to authorize(:update)  }
    it { is_expected.to authorize(:edit)    }
    it { is_expected.to authorize(:destroy) }
  end
end
```
ローカルのWordPressのパーマリンクが404になってしまう場合の対処法

# はじめに
本番環境のWordPressをXAMPPを使ってローカルに移行したとき、サイトのトップページは表示できたのだが、以下の問題が発生した。

・パーマリンクをクリックすると、Web上の本番環境に飛ばされてしまう
・パーマリンクを直打ちすると404になる

対処に詰まったのでメモ。

# 対処法
## 1. DB内のドメインを変更
こちらを参照
[WordPressでドメインやディレクトリ変更](http://qiita.com/shotaro041027/items/5ee239b610809c994a60)

例. `http://hoge.com` ⇒ `http://localhost`に変更

## 2. .htaccessを修正
上記の作業だけで直る場合もあるが、本番環境とディレクトリ構造が違うと、以下の作業が必要になる。

本番環境：`http://hoge.com/fuga`
ローカル：`http://localhost/piyo`
という例で説明する。

WordPressのフォルダ直下（`wp-admin`とかがあるところ）にある`.htaccess`を開くと、以下のような記述がある。

```
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /fuga/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /afm/index.php [L]
</IfModule>

```

ここの、`RewriteBase /fuga/` を `RewriteBase /piyo/`に変更すればOK。

もしくは、`.htaccess`は変更しないでディレクトリ構造を本番と一致させる。
ローカル：`http://localhost/fuga`
のようにディレクトリ名を変えてあげればOK。
jsSHAのSHA256が毎回異なるハッシュを出力する場合はこうする

思わぬドハマリをしてしまったので個人的メモ。
毎回new（初期化）せずに使い回すと、同じtextを入力しても出力されるハッシュが変わってしまう。

```js
// NG
import jsSHA from 'jssha';
const HASH_KEY = 'HASH_KEY';
const sha256 = new jsSHA('SHA-256', 'TEXT');
export function generateHash (text) {
    sha256.update(text + HASH_KEY);
    return sha256.getHash('HEX');
}
```

```js
// OK
import jsSHA from 'jssha';
const HASH_KEY = 'HASH_KEY';
export function generateHash (text) {
    const sha256 = new jsSHA('SHA-256', 'TEXT');
    sha256.update(text + HASH_KEY);
    return sha256.getHash('HEX');
}
```
ng-ifとng-showを同時に使うと...

AngularJS子ネタ。

`ngIf` と `ngShow` は似た機能のDirectiveですが、実装が大きく違います。

* ngIf: 
 * `true`になるとDOMとscopeが生成される
 * `false`になるとscopeとDOMが破棄される
* ngShow: 
 * 評価の結果に関わらず、下層のDOMは生成される
 * `false`の場合、DOMのstyleに`display: none` が付与されて一時的に不可視化される

1つのDOM要素にngIfとngShowを同時に使うことは普通しないと思いますが、one time watch(`::`をつけるやつ)と組み合わせて、下記のように使うと、

```html
<div ng-if="::ctrl.visible" ng-show="ctrl.visible" >
   <heavy-directive />
</div>
<button ng-click="ctrl.visible=!ctrl.visible">click to toggle</button>
```

コントローラの`visible` が初めて真となったタイミングでのみ、下層のDirectiveの初期化が走り、その後の表示制御は`display:none`の切り替えで行うようにできます。

パフォーマンスチューニングが必要になった時等に覚えておくと便利かも。
[ chef ] cookbookの検証の仕組み概観 (kitchen & serverspec & berkshelf)

##まとめメモ
  整理のためのメモ

## Overlook


- kitchenを使うとvagrantのVMを即席でつくり、そのVMでテストしたいcookbookを実行できる。また、結果検証も出来る。
- serverspecをkitchenの設定に組み込む(特定の場所にserverspecのファイルを置く)とkitchenがserverspecを使ってcookbookの結果検証してくれる。
- berkshlefを使うとcookbookのバージョン管理が出来る。リモートにあるソースからもcookbookを持ってくることが出来る。


## 環境設定の概要

1. ChefDKをインストール
2. Testしたいクックブックのディレクトリに移動して`kitchen init .`
3. vagrant.erbを用意。(ネットから拾ってくる)
4. `test`ディレクトリの最下層にserverspecディレクトリ作成してその下にspecファイル作る。
5. `chef exec kitchen test`を実行

これで終わり。
すごく便利だし楽だし、検証も確実に出来る。
laravel5のMail::sendでRFC違反のメールアドレスでもメール送信する方法を教えてください

題名の通り、Mail::sendで以下のようなRFC違反のメールアドレスでもメール送信出来る方法が知りたいです。

～～～～～～～～ 
Abc.@example.com（“.”をローカル部の末尾に使用している） 
Abc..123@example.com（“.”が連続している） 
～～～～～～～～

方法としましては、Swift_Mailerの
vendor/swiftmailer/lib/classes/Swift/Mime/Headers/MailboxHeader.php
のメールアドレスチェックでチェックエラーだと例外が投げられる部分をコメントアウトする方法があるのですが、この方法は使いたくないです。
それ以外の方法でメール送信する方法はないでしょうか？

どなたかご教示頂けましたら、幸いですｍｍ
よろしくお願い致します。
WordPress 記事をランダムに表示してページングする方法

```php
session_start();

add_filter('posts_orderby', 'edit_posts_orderby');

function edit_posts_orderby($orderby_statement) {

    $seed = $_SESSION['seed'];
    if (empty($seed)) {
      $seed = rand();
      $_SESSION['seed'] = $seed;
    }

    $orderby_statement = 'RAND('.$seed.')';
    return $orderby_statement;
}
```
上記のコードを functions.php に追加すると、カテゴリ ページの記事がランダム順で並び、なおかつ、ページを切り替えても記事が重複して表示されることはありません。
travis-ciを使って、S3の擬似版s3rverのDockerイメージを作って公開してみよう！

## 目的

takezoeさんの記事、「[AWS上で動作するアプリケーションをいかにローカルで開発するか？](http://takezoe.hatenablog.com/entry/2016/02/12/090152)」に触発されて、
今度は、擬似的なs3のDocker Imageを作成できるか試してみることにしました！

## 成果物

* https://github.com/tripleW/docker-s3rver
* https://hub.docker.com/r/triplew/s3rver/

## 参考資料

* https://docs.travis-ci.com/user/docker/
* https://github.com/4front/s3-proxy/issues/1
* https://github.com/jamhall/s3rver

## 手順

### 1. GitHubでリポジトリを作成して、Dockerfileを用意する

https://github.com/tripleW/docker-s3rver

```Dockerfile
FROM node

RUN npm install -g s3-proxy
RUN npm install -g s3rver

RUN mkdir -p /data

EXPOSE 4567

CMD ["s3rver", "-d", "/data", "-p", "4567", "-h", "0.0.0.0"]
```

https://github.com/4front/s3-proxy/issues/1

で確認したのですが、s3-proxyではなく、実態としては[jamhall/s3rver](https://github.com/jamhall/s3rver)の方が、S3のサービスのようなものを提供してくれるみたいです。

### 2. .travis.ymlを用意する

https://docs.travis-ci.com/user/docker/

上記を参考にして、.travis.ymlを実装しました。

```.travis.yml
sudo: required

language: node_js
node_js:
  - "4.1"

services:
  - docker

before_install:
  - docker build -t triplew/s3rver ./

script:
  - docker login -e="$DOCKER_EMAIL" -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"
  - docker push triplew/s3rver
```

`docker push`については[前回](../../letusfly85/items/178db48e0710f8553bbc)と同様の手順でpushしました。

### 3. git pushをして、travis ciを走らせる

https://hub.docker.com/r/triplew/s3rver/

今回もさくっと行けました＾＾

イメージ自体が利用可能かどうかはこれから見てみようと思います＾＾；

## 利用方法

### 実行環境

* Client ローカルのMacOS
* Server どこかのAWSとかどこかのGCPとか
* curl利用

### 1. docker runでコンテナを起動

```bash
docker run -d -p 4567:4567 triplew/s3rver
```

### 2. curlでバケット作成

```bash
curl -XPUT localhost:4567/hoge
```

### 3. curlでファイルアップロード

```bash
curl -XPUT -T hello.txt localhost:4567/hoge/
```

### 4. curlでファイルダウンロード

```bash
curl -XGET localhost:4567/hoge/hello.txt
```

使えないこともなさそうな印象ですね！
<?php echo のショートタグ<?= は推奨される書き方でした

ただし、PHP 5.4.0以降です。

## short_open_tag = on は
<?php を <? で始められるようにする設定でした。

http://php.net/manual/ja/ini.core.php#ini.short-open-tag

``short_open_tag``の``off``が推奨であるのは、xmlの記法である、``<? ?>``が誤動作する危険性があるためです。
現状でも``off``が推奨されているはず。


## <?= は<?php echo のショートタグ

``<?= ``は``<?php echo ``のショートタグですが、こちらはPHP 5.4.0以降、short_open_tagの設定にかかわらず有効です。

すなわち、非推奨である、``short_open_tag = on`` に影響されないで、いつでも使えるようになったのです。

流石

＿人人人人人人人人人人人人人人人＿
＞　PHP: Hypertext Preprocessor　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣


大丈夫になったはずって思ってたけど、理由が、記憶の彼方に飛んでいってしまっていたのでここにも書いておきます。
アイマス楽曲のタイトル検索API（もどき）を作った

## 動機
LTHの高山紗代子ソロ曲が vivid color か Vivid Color か VIVID COLOR だったか分からなくなり、コマンドラインからアイマス楽曲の正式名称を検索できるようにしたかった。

## 実装方法
- JSONを返すSinatraサーバをHerokuに立てて、ローカルのスクリプトで叩く。
- 楽曲情報は[アイマス楽曲・CDデータベース(情報まとめ)](http://imas-db.jp/song/detail/)より拝借。

## つくったもの
[gomao9/imas-songs](https://github.com/gomao9/imas-songs)

### サーバ
``` app.rb

require 'sinatra'
require 'nokogiri'
require 'open-uri'
require 'json'
require 'unicode'

URL ='http://imas-db.jp/song/detail/'

get '/search' do
  title(params['keyword']).to_json
end

helpers do
  def title keyword
    html = open(URL).read
    doc = Nokogiri::HTML.parse(html)
    songs = doc.css('div.section > ul > li').map(&:text).to_a
    songs.select do |song|
      Unicode::nfkc(song).include?  Unicode::nfkc(keyword)
    end
  end
end
```

### ローカルスクリプト
``` imas_songs.rb
#! /usr/bin/env ruby
require 'json'
require 'uri'
require 'open-uri'

keyword = ARGV.first
url = "https://imas-song-title.herokuapp.com/search?keyword=#{keyword}"
songs = JSON.parse(open(URI.escape url).read)
puts songs
```

``` shell-session
$ ./imas_songs.rb vivid
vivid color
```
isnormal

isnormalで、doubleの値をチェックした場合、
0という値はfalseになる。


0も正常な値として扱いたい場合、isnormalだけではなく、
FPCLASSIFYでFP_ZEROかどうかを判断する。

```a:a.c
#include <stdio.h>
#include <math.h>

int main() {
    double a = 1.0;
    double b = 0.0;

    printf("values\n");
    printf("a=%f\n", a);
    printf("b=%f\n", b);
    printf("\n");

    printf("check isnormal\n");
    printf("a: isnormal(%f)=%d\n", a, isnormal(a));
    printf("b: isnormal(%f)=%d\n", b, isnormal(b));
    printf("\n");

    printf("check FP_ZERO\n");
    printf("a: fpclassify(%f)=%d\n", a, fpclassify(a) == FP_ZERO);
    printf("b: fpclassify(%f)=%d\n", b, fpclassify(b) == FP_ZERO);
    printf("\n");

    return 0;
}
```

```
[root@localhost ~]# gcc a.c -lm
[root@localhost ~]# ./a.out
values
a=1.000000
b=0.000000

check isnormal
a: isnormal(1.000000)=1
b: isnormal(0.000000)=0

check FP_ZERO
a: fpclassify(1.000000)=0
b: fpclassify(0.000000)=1

[root@localhost ~]#
```
Bashでサブディレクトリも含めてディレクトリ内の全ファイルをリネームする方法

# はじめに
皆様はプロジェクト進んでしまって、一括でファイル名をリネームしたくなることってないでしょうか？
お恥ずかしい話ではありますが、自分が作っているアプリで発生したので、それについて共有したいと思います。


# 実例
自分のプロダクトではSpecs2を使用しているのですが、チームメンバーで共有できておらず、
一般的には

hogehogeSpec.scala

といった名前をつけるのが定説となっていますが、

hogehogeSpecs.scala

と複数形になっているファイルが400ファイルほどありました。（苦笑
また、フォルダ構成はアプリのプロジェクトが進んでいたこともあり、相当深いフォルダ構成となっておりました。

# 解決Bash
Findしたものをwhileでぶん回す作戦です。
それで出来上がったのが以下のとおり。

```bash
find . -type f -name "*Specs.scala" -print0 | 
while read -r -d '' file; 
    do mv "$file" "${file%%Specs.scala}Spec.scala"; 
done
```

ワイルドカードの部分を弄るだけで、他のリネームにも転用できますので、参考に使っていただけると幸いです。
IdeaVimの:actionを使ってIntelliJの機能をキーマッピングする

使用したのは、OS X 上の IntelliJ IDEA 15.0.3、IdeaVimのバージョンは0.44です。

IdeaVimにはVimにはない `:action` というExコマンドがあります。これを使うとIntelliJの機能を呼び出すことができます。

~/.ideavimrcのキーマップ設定で `:action` を使うこともできます。

例えば、 `\r` と入力するとテストを実行する、というような設定ができます。以下のようなJUnitを使って書かれたテストコードがあるとします。

```java
package sample;

import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;

import org.junit.Test;

public class HogeTest {

    @Test
    public void sampleTest() {
        assertThat("hoge", is("hoge"));
    }
}
```

メソッドのどこかを右クリックして"Run 'sampleTest()'"を選択すると、"sample test"だけ実行できます。

IdeaVimの `:action` を使って、カーソルがメソッド内にある状態で `:action RunClass` と入力することで同じことができます。

~/.ideavimrcに以下のように記述しておけば、 `\r` で実行ができます。わざわざ `:action RunClass` と入力する必要はありません。

```
nnoremap \r :action RunClass<CR>
```

IntelliJのキーマップ設定と比べて嬉しいところは、IdeaVimのノーマルモードでだけ有効にすることができるところです。~/.ideavimrcを使わずにIntelliJのキーマップ設定で `\r` を割り当てると `"\r"` という文字列を入力できなくなってしまいます。

`:action`で使えるIntelliJの機能は、 `:actionlist` で調べられます。
R言語使い方を調べたのでメモしておく場所

# introduction
Rちらうら

# 初期化
```
?vector

X <- vector(mode="character", length=10)
[1] "" "" "" "" "" "" "" "" "" ""
```

# ライブラリ

## 一覧
```
library()
```

# 文字列操作
## 文字連結
```
paste("hello", "world", "!!!", sep = " ")
[1] "hello world !!!"
```

## ダブルクォートを消す
```
my.list <- data.frame(y1=c(1,2,3),y2=c(4,5,6),y3=c(8,9,10))

colnames(my.list,do.NULL = TRUE, prefix = "col")[1]
[1] "y1"

cat(colnames(my.list,do.NULL = TRUE, prefix = "col")[1])
y1

```

## cast
```
?as.numeric
?as.integer
?as.complex
?as.character
?as.logical
?as.factor
?as.ordered
```

# ファイル
## BOM付きUTF-8を読む
```
source("youer.txt", encoding="UTF-8-BOM") 
```
# 行列を指定する

```
my.list <- data.frame(y1=c(1,2,3),y2=c(4,5,6),y3=c(8,9,10))
my.list[2,3]

[1] 9
```
# function
## 普通のやつ
```
aaa <- function(x) x + 1
aaa(5)
[1] 6
```
## 即時関数
```
(function(x) {return (paste("hello",x, sep = " "))})("world")
[1] "hello world"
```

## map
```
my.list <- c(1,2,3)
(function(x) {return (x + 100)})(my.list)

[1] 101 102 103
```

# カラム名を取得する
```
my.list <- data.frame(y1=c(1,2,3),y2=c(4,5,6),y3=c(8,9,10))
colnames(my.list)
[1] "y1" "y2" "y3"

help(colnames)
```

# 検索
いいサイトあった
http://d.hatena.ne.jp/a_bicky/20110529/1306667230

## Select
列を選ぶ

```
my.list <- data.frame(y1=c(1,2,3),y2=c(4,5,6),y3=c(8,9,10))
my.list[c("y1", "y3")]

  y1 y3
1  1  8
2  2  9
3  3 10
```
## Where
### 検索する

```
my.list <- data.frame(y1=c(1,2,3),y2=c(4,5,6))
subset(my.list, y1 == 1)

  y1 y2
1  1  4

# AND
a <- as.numeric(my.list[1,]["y1"])
b <- as.numeric(my.list[1,]["y2"])
my.list[my.list$y1 == a & my.list$y2 == b,]

  y1 y2
1  1  4
```

### 一番左のカラムをselectする
```
my.list <- data.frame(y1=c(1,2,3),y2=c(4,5,6))
my.list[my.list[1] == 2,]

  y1 y2 y3
2  2  5  9
```

### group by
```
# max
my.list <- data.frame(y1=c(1,2,3,1,2,3),y2=c(4,5,6,7,8,9))
aggregate(my.list$y2, by = list(my.list$y1), max)

  Group.1 x
1       1 7
2       2 8
3       3 9
```

## 上澄みを何行かとる

```
my.list <- data.frame(y1=c(1,2,3),y2=c(4,5,6))
head(my.list, n = 2)
  y1 y2
1  1  4
2  2  5
tail(my.list, n = 2)
  y1 y2
2  2  5
3  3  6
```

## csvの上澄みを何行か取る
```
install.packages("R.utils")
l2keep <- 10
nL <- countLines("your.csv")
df <- read.csv("your.csv", header=FALSE, skip=nL-l2keep)
```

http://stackoverflow.com/questions/18526267/how-to-import-last-100-rows-using-read-csv-in-r

# 配列に追加
```
a <- vector(, 0)
a <- c(a, 1)
a <- c(a, 2)
a <- c(a, 3)
a <- c(a, 4)

a
[1] 1 2 3 4
```

# 配列同士を計算
```
a <- c(1,2,3)
b <- c(1,2,3)
a * b
[1] 1 4 9

a/ b
[1] 1 1 1
```

# 最後にすべてのオブジェクトをREMOVE
（カチャカチャカチャッ・・・）

```
rm(list=ls())
```
（ッターン！）
git reset のやり方 備忘録

◆たった今のコミットを無かったことに
-------------------------------------

```
git reset --soft HEAD^
```

インデックス: そのまま
ファイル: そのまま
コミット: 取り消す

直前のコミットを無かったことにして、コミット直前の状態に戻します。
ファイルも変更済の状態を維持します。


◆編集を無かったことに
-------------------------

```
git reset --hard HEAD
```

インデックス: 巻き戻す
ファイル: 巻き戻す
コミット: そのまま

直前のコミットまで編集状態を巻き戻します。


◆add を無かったことに
-------------------------

```
git reset HEAD
```

インデックス: 巻き戻す
ファイル: そのまま
コミット: そのまま
VisualStudioCodeでGAE/Goの環境設定



![gae-vsc](http://i.imgur.com/D3S8APD.gif)


#初めに
VisualStudioCodeがgoの開発環境として使い勝手が凄くいいです。
debugも現状でスタックトレースくらいは見れるのでcode読むには十分です。

GAE/Goに再挑戦してみようかと思い環境を作れないか調べてみましたので纏めます。


# 設定
[vscode-go/READMEとdelve/Buildingの日本語訳](http://qiita.com/qt-luigi/items/1e73c2e129c408c16cbf)
等を参考にVisualStudioCode でgo開発環境をすでに整えている前提です。
またGAE/GoのSDKはbrewを使いインストールしています。

```
$ brew install app-engine-go-64
```

以下のようにgocodeにappengineのライブラリへのpathを教えてあげます。

```
gocode set lib-path "/usr/local/share/app-engine-go-64/goroot/pkg/darwin_amd64/"
```

設定内容は　``~/.config/gocode/config.json``に反映されます。

後はプロジェクトを開いた時に ``⌘+shift+p`` →  "open workspace Settings"　で設定ファイルを作り
settings.jsonに追記します。
**プロジェクトごとに毎回設定します。**

```settings.json
{
  "go.goroot": "/usr/local/share/app-engine-go-64/goroot"
}
```

これだけだとgoコマンドが見当たらないと怒られるのでgoappコマンドをgoにリンクします。

```
$cd /usr/local/opt/app-engine-go-64/share/app-engine-go-64/goroot/bin
$ln -s goapp go
$ls -l
lrwxr-xr-x  1 m0a  admin         5  2 26 12:05 go -> goapp
-rwxr-xr-x  1 m0a  admin   4704368  1 20 19:41 go-app-builder
-rwxr-xr-x  1 m0a  admin   9591716  1 20 19:41 goapp
-rwxr-xr-x  1 m0a  admin  16582180  1 20 19:41 godoc
-rwxr-xr-x  1 m0a  admin   3581136  1 20 19:41 gofmt
```

gopkgsコマンドがシンボリックリンクを解決できないみたいなので、対応版を導入します。

```
$ go get -u github.com/m0a/gopkgs
```
リリースビルドタスクでproguard関連ファイルをコピーする

#1.前置き

[リリースビルドタスクでapkファイルを特定フォルダにコピーする](http://qiita.com/le_skamba/items/d98b3086c843fe54a15b)というのは以前やったのですが、proguard関連の生成ファイルもコミットしていく必要があり、しかしデフォルトの出力フォルダはcleanで削除されてしまうので、うっかりそこでコミット&pushしてしまうと大変なことになってしまいます（経験談(ノД`))。

そこで、progaurd関連ファイルもこのタスク内でコピーするように対応しました。

#2.ビルドスクリプト

```xml:build.gradle
  signingConfigs {
    release
  }
  buildTypes {
    release {
      signingConfig signingConfigs.release
    }
  }

  applicationVariants.all { variant ->
    if (variant.buildType.name.equals("release")) {
      variant.outputs.each { output ->
        if (output.outputFile != null && output.outputFile.name.endsWith('.apk')) {
          // Rename APK
          def versionCode = defaultConfig.versionCode
          def versionName = defaultConfig.versionName
          def date = new java.text.SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date())
          def newName = "AppName_r${versionCode}_v${versionName}_${date}.apk"

          def publish = project.tasks.create("publishAll")

          // Move and Rename APK
          def task = project.tasks.create("publish${variant.name.capitalize()}Apk", Copy)
          task.from(output.outputFile)
          task.rename(output.outputFile.name, newName)
          task.into(deployTo)

          task.dependsOn variant.assemble
          publish.dependsOn task

          // Move ProGuard
          if (variant.buildType.minifyEnabled) {
              def copyTask = project.tasks.create("copy${variant.name.capitalize()}MappingText", Copy)
              def buildTypeName = variant.buildType.name
              copyTask.from(file("build/outputs/mapping/${buildTypeName}").path)
              copyTask.into(deployTo + "/mapping")

              copyTask.dependsOn variant.assemble
              task.dependsOn copyTask
          }
        }
      }
    }
  }

...

  if (project.hasProperty('storeFile')) {
    android.signingConfigs.release.storeFile = new File(storeFile)
  }
  if (project.hasProperty('storePassword')) {
    android.signingConfigs.release.storePassword = storePassword
  }
  if (project.hasProperty('keyAlias')) {
    android.signingConfigs.release.keyAlias = keyAlias
  }
  if (project.hasProperty('keyPassword')) {
    android.signingConfigs.release.keyPassword = keyPassword
  }
```

{deployTo}/mapping下に、関連ファイルがコピーされます。

#3. 参考
以下を参考にしましたが、これらをそのままコピーしても「runProguardなんてないよ」って怒られます。
**minifyEnabled**にプロパティ名が変わっているせいでした。
また出力フォルダ名も**mapping**に変わっています。

[AndroidStudio で APK を特定のフォルダにコピーする Gradle の設定](http://qiita.com/wada811/items/e8047f0f0fd1203b0fc5)
[AndroidStudioでAPKを作ったあとに特定のディレクトリにAPKをコピーする](http://qiita.com/takke/items/015c79f8be67f5d72ed6)
Mac 上の Eclipse に minecraft Forge での Mod 開発環境を構築する 2016年度版

2016.5.5更新：内容を1.9に合わせました。

# 前提・環境

* Mac OS X Yosemite
* Java 1.8.0_25
* Eclipse Mars.1 Release (4.5.1)


## まずは Forge の source をダウンロードする

[Minecraft Forge : 公式](http://files.minecraftforge.net/) に行く。

![スクリーンショット 2016-05-05 11.59.11.png](https://qiita-image-store.s3.amazonaws.com/0/9988/2c45507a-3e4c-9e0f-6b28-07a4cfc1bd09.png)


開発するForgeのバージョンを選び、`Mdk` を落とす。今回は 1.9 の Download Recommended から Mdk を落とした。（adhocに飛ばされるので悪意のある広告にご注意）

![スクリーンショット 2016-05-05 12.00.26.png](https://qiita-image-store.s3.amazonaws.com/0/9988/03e6ae44-4fea-46e3-0003-95cc8d2c5370.png)


## 落としたソースを gradlew でビルドをします

落としてきた zip を解凍する。

![スクリーンショット 2016-05-05 12.02.36.png](https://qiita-image-store.s3.amazonaws.com/0/9988/067ea46f-b558-d045-096f-db86b7466a2f.png)


ターミナルを開き、解凍した Mdk のディレクトリに移動し、以下コマンドを打つ。

```bash
$ ./gradlew setupDecompWorkspace --refresh-dependencies
```

結構時間がかかるので、終わったドラクエのレベル上げでもするがいいさ。そして無事に終了したら、以下のコマンドを打ってビルドを完了させる。

```bash
$ ./gradlew eclipse
```

正常に完了すると、先のディレクトリはこんな感じに。

![スクリーンショット 2016-05-05 12.08.01.png](https://qiita-image-store.s3.amazonaws.com/0/9988/f619ace3-6776-30b2-05ab-657c514b694f.png)



## Eclipse に Gradle を突っ込む

Eclipse MarketPlace から Gradle を検索。`Gradle Integration for Eclipse 3.7.2.RELEASE` をインストールする。

![スクリーンショット 2016-02-25 23.37.28.png](https://qiita-image-store.s3.amazonaws.com/0/9988/56798fe9-2c33-cf30-e8e9-4b94debe70b3.png)



## 先ほど gradlew を叩いたディレクトリの eclipse フォルダを Workspace にする

初めてmod開発を行う場合は環境構築が簡単なこの方法でやってみてもいいでしょう

![スクリーンショット 2016-05-05 12.16.59.png](https://qiita-image-store.s3.amazonaws.com/0/9988/3f97c5c8-849b-6801-b612-bf93e7c5acb7.png)



## サンプルのModが動くかどうか確認する

メニューの「実行」から「実行構成」を選択し、右ペインのプロジェクトがMDKExampleのものを実行する

![スクリーンショット 2016-05-05 12.22.13.png](https://qiita-image-store.s3.amazonaws.com/0/9988/32536088-2562-f72e-d56e-d8b22781584d.png)


するとクライアントでの Minecraft が立ち上がりますので、Modの画面を確認すると「Example Mod」が確認できます

![スクリーンショット 2016-05-05 12.24.10.png](https://qiita-image-store.s3.amazonaws.com/0/9988/5edb3c24-e333-db44-bec6-43a4ee810696.png)

以上で環境構築は完了です。続いて、ゼロから新たにプロジェクトを作成していく方法を残しておきます。

## Workspace を用意し、Javaプロジェクトを作成します。

![スクリーンショット 2016-05-05 13.00.44.png](https://qiita-image-store.s3.amazonaws.com/0/9988/2eb88c1b-c119-9b4f-6182-b4b30c7b1c31.png)

これで一旦、eclipse を閉じておきます。

次に、forgeのzipを解凍し、このディレクトリの中から gradle に関するファイルやディレクトリを、作ったプロジェクトにコピーする

![スクリーンショット 2016-05-05 13.04.52.png](https://qiita-image-store.s3.amazonaws.com/0/9988/4f42d83a-463f-85ca-37b8-37f141934be7.png)

こんな感じに

![スクリーンショット 2016-05-05 13.07.50.png](https://qiita-image-store.s3.amazonaws.com/0/9988/ddbf0fe0-d485-af41-6eb8-3f043d436347.png)

ここまでやったらこのディレクトリで、以下を実行

```bash
$ ./gradlew setupDecompWorkspace --refresh-dependencies
```

と

```bash
$ ./gradlew eclipse
```

これで、環境構築はあらかた終了です。
mySQLの日付処理いろいろ

mySQLでよく使う日付処理をまとめてみました。
もっと良い書き方があれば、コメントをお願いします。

- システム日付

mysql> select curdate();
+------------+
| curdate()  |
+------------+
| 2016-02-26 | 
+------------+
1 row in set (0.16 sec)

mysql> select curdate() + 0;
+---------------+
| curdate() + 0 |
+---------------+
|      20160226 | 
+---------------+
1 row in set (0.00 sec)



- システム日付時刻

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2016-02-26 12:16:15 | 
+---------------------+
1 row in set (0.00 sec)

mysql> select now()+0;
+-----------------------+
| now()+0               |
+-----------------------+
| 20160226121618.000000 | 
+-----------------------+
1 row in set (0.00 sec)



- 当月1日

mysql> select DATE_FORMAT( CURDATE() , '%Y-%m-01' );
+---------------------------------------+
| DATE_FORMAT( CURDATE() , '%Y-%m-01' ) |
+---------------------------------------+
| 2016-02-01                            | 
+---------------------------------------+
1 row in set (0.00 sec)

- 当月末日

mysql> select AST_DAY(CURDATE());
+---------------------+
| LAST_DAY(CURDATE()) |
+---------------------+
| 2016-02-29          | 
+---------------------+
1 row in set (0.00 sec)

- 前月1日

mysql> select DATE_FORMAT( ADDDATE( CURDATE() , INTERVAL -1 MONTH) , '%Y-%m-01' );
+---------------------------------------------------------------------+
| DATE_FORMAT( ADDDATE( CURDATE() , INTERVAL -1 MONTH) , '%Y-%m-01' ) |
+---------------------------------------------------------------------+
| 2016-01-01                                                          | 
+---------------------------------------------------------------------+
1 row in set (0.00 sec)

- 前月末日

mysql> select LAST_DAY( ADDDATE( CURDATE() , INTERVAL -1 MONTH) );
+-----------------------------------------------------+
| LAST_DAY( ADDDATE( CURDATE() , INTERVAL -1 MONTH) ) |
+-----------------------------------------------------+
| 2016-01-31                                          | 
+-----------------------------------------------------+
1 row in set (0.00 sec)

- 来月1日

mysql> select DATE_FORMAT( ADDDATE( CURDATE() , INTERVAL 1 MONTH) , '%Y-%m-01' );
+--------------------------------------------------------------------+
| DATE_FORMAT( ADDDATE( CURDATE() , INTERVAL 1 MONTH) , '%Y-%m-01' ) |
+--------------------------------------------------------------------+
| 2016-03-01                                                         | 
+--------------------------------------------------------------------+
1 row in set (0.00 sec)

- 来月末日

mysql>  select LAST_DAY( ADDDATE( CURDATE() , INTERVAL 1 MONTH) );
+----------------------------------------------------+
| LAST_DAY( ADDDATE( CURDATE() , INTERVAL 1 MONTH) ) |
+----------------------------------------------------+
| 2016-03-31                                         | 
+----------------------------------------------------+
1 row in set (0.00 sec)



- 当日分（1日分） (column_nameはdatetime)

select count(*) from table_name where date(column_name) = curdate();

- 当月分（1か月分） (column_nameはdatetime)

select count(*) from table_name where column_name >= DATE_FORMAT( CURDATE() , '%Y-%m-01' ) and column_name <= LAST_DAY(CURDATE());
GitLab CIでXcodeプロジェクトをCIする手順

GitLab CIでXcodeのユニットテストを自動実行した際の手順です。
  **Xcodeプロジェクトの設定** 以外はiOSに依存しない内容です。
## バージョン
ツールおよび OS は以下のバージョンを使用しました。
GitLab 8.5
Xcode 7.2.1
OS X 10.11.2（ビルドマシン）

## GitLabでCIを有効化
### 自動ビルドの設定
1. project を選択 -> 左ペイン左下の Settings から CI/CD Pipelines 画面に移動。
2. 下記 **ランナーの設定** 手順を行い、ブラウザをリロードすると、設定したランナーが表示されるので `Enable for this project` ボタンを選択し、ランナーを有効にします。

## ランナーの設定
### 1. ビルドマシンに GitLab CI Multi-Runner をインストール

```
$ sudo curl --output /usr/local/bin/gitlab-ci-multi-runner https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-ci-multi-runner-darwin-amd64
```

### 2. 実行権限の付与

```
$ sudo chmod +x /usr/local/bin/gitlab-ci-multi-runner
```

### 3. ランナーの設定

```
$ gitlab-ci-multi-runner register
```

- URL, トークンの入力を求められますが、GitLabの以下に表示される値を使用します。
- GitLab -> 任意nprojectを選択 -> Settings(歯車のマーク) -> Runners
- executor としては今回 `shell` を選択しておきます。

### 4. ランナーのインストール、起動

```
$ cd ~
$ gitlab-ci-multi-runner install
$ gitlab-ci-multi-runner start
```

- この時、 `register`, `install`, `start` を同じユーザで実行しないとランナーが正しく起動しないので注意します。

### 5. 確認
正しく設定ができていれば、GitLab上でランナーのステータスがグリーンになります。
![green.png](https://qiita-image-store.s3.amazonaws.com/0/39720/67edcf29-1315-a293-b534-8d89b96e2df6.png)

## Xcodeプロジェクトの設定
### スキームの作成
1. プロジェクトの Manage Schemes メニューを選択し、CI でビルドしたいプロジェクトの shared にチェックをしておきます。
2. プロジェクトファイルの直下に `{project_name}.xcodeproj/xcshareddata`というディレクトリができるので、忘れずに`git commit`します。


![manage_schemes.png](https://qiita-image-store.s3.amazonaws.com/0/39720/dce5b86a-2df4-49fd-9d93-b3151aeb0002.png)

![shared.png](https://qiita-image-store.s3.amazonaws.com/0/39720/a93230f2-2525-8ce0-d63a-7ef796fec17f.png)


以下のコマンドで scheme が登録されていることを確認できます。

```
# ワークスペースの場合
$ xcodebuild -workspace <ワークスペース名>.xcworkspace -list

# プロジェクトの場合
$ xcodebuild -project <プロジェクト名>.xcodeproj -list
```

### .gitlab-ci.yml
1. `.gitlab-ci.yml` をリポジトリのルートに追加。
2. リポジトリにファイルがプッシュされたタイミングで実施したいコマンドを yaml に記載します。

今回は、リポジトリからプロジェクトをクローンし、ユニットテストを実行するだけです。

```.gitlab-ci.yml
test:
  script:
    - export LANG=en_US.UTF-8
    - xcodebuild test -workspace <workspace-name>.xcworkspace -scheme <scheme-name> -destination 'platform=iOS Simulator,OS=9.2,name=iPhone 6s'
```

## ビルド
以上で一通りの手順が完了しました。リポジトリにコミットがプッシュされる度に、上記の yaml に記載したコマンドが実行されます。

![configuration_done.png](https://qiita-image-store.s3.amazonaws.com/0/39720/84ffea45-0cba-6714-3757-60937e8e64aa.png)


## 参考URL

GitLab CI Quick Start
http://doc.gitlab.com/ce/ci/quick_start/README.html

GitLab CI Multi Runnerのインストール
https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/install/osx.md

Automating the Test Process
https://developer.apple.com/library/tvos/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/08-automation.html
エラー時にSecurityContext#getAuthentication()がnullになる場合の対応


個人的に参考に記述している記事に辿りつくまでにちょっと時間がかかったので、
備忘録としてメモしておく。

### バージョン
 * Spring Framework
 4.2.2.RELEASE
 
 * Spring Security
4.0.3.RELEASE  

### 事象
404などのエラーになった時に、```SecurityContextHolder.getContext(). getAuthentication()```が```null```になることがある。

### 原因
エラー時に```springSecurityFilterChain```が動いていない（正確には、```DelegatingFilterProxy```が動いていない）ためなので、エラー時も動かしてあげる必要がある。
Java Based ConfigとXML Based Configでdispatcherで指定している種類が異なっているのは、サンプルの違いだけなので、大差ない。

### 対応
``` DelegatingFilterProxy ``` の ``` dispatcher ``` に ``` ERROR ``` を追加する。

``` web.xml
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>
```

``` Config.java
    protected FilterRegistration.Dynamic registerServletFilter(ServletContext servletContext, Filter filter) {
        String filterName = Conventions.getVariableName(filter);
        FilterRegistration.Dynamic registration = servletContext.addFilter(filterName, filter);
        if (registration == null) {
            int counter = -1;
            while (counter == -1 || registration == null) {
                counter++;
                registration = servletContext.addFilter(filterName + "#" + counter, filter);
                Assert.isTrue(counter < 100,
                        "Failed to register filter '" + filter + "'." +
                                "Could the same Filter instance have been registered already?");
            }
        }
        registration.setAsyncSupported(isAsyncSupported());
        registration.addMappingForServletNames(getDispatcherTypes(), false, getServletName());
        return registration;
    }

    private EnumSet<DispatcherType> getDispatcherTypes() {
        return (isAsyncSupported() ?
                EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE, DispatcherType.ASYNC, DispatcherType.ERROR) :
                EnumSet.of(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE, DispatcherType.ERROR));
    }
```

### 参考
[Spring SecurityContext returning null authentication on error pages in web.xml - Spring Forum](http://forum.spring.io/forum/spring-projects/security/108681-spring-securitycontext-returning-null-authentication-on-error-pages-in-web-xml)
GitのCloneでエラー"result:18 code:200"が出た時の対処法メモ

# 概要
SourceTreeでリポジトリをクローンしようとした時に、タイトルのエラーが出てちょっとハマったのでメモ。

# 環境
Mac OSX 10.11.3

# 対処法
ターミナルを立ち上げて、
git clone (--branch "指定ブランチ") --depth 1 "リポジトリURL" "リポジトリ保存先"
で最新のコミット内容は拾える。--depthの数値を上げれば過去の履歴も拾える。
人工知能入門

# 人工知能とは何か？
人工知能とは何か？に関しては以下を参考にして頂ければと思います。
http://qiita.com/Hawk84/items/1d74c74b2eabbd261874

# 人工知能の基本問題

「フレーム問題」と「記号接地問題」について

# フレーム問題
外界が全て記号的表現に置き換えられるとしても、実際の問題状況を考えると
問題に関わる対象の数が爆発的に増大してしまうために、実時間で解くことが
困難だという問題。
ロボットには有限の情報処理能力しかないために、現実に起こりうる問題全てに対処できない。

# 記号接地問題（シンボルクラウディング問題）

物理記号システム仮説に従うにしても、もう少し緩和されたアプローチを取るに
しても、ロボットや人工知能の認識状態を記号で表現することは多い。
そのような場合に考慮しなければならない人工知能の基本問題である。
一言で言うと、記号システム内のシンボルがどのようにして実世界の意味と
結びつけられるかという問題。

例えば「トマト」という記号をコンピューターが知っているとする。
コンピューターは「トマト」が「赤い」、「食べられる」という属性を持っていることを知っているとする。
しかし、コンピューターは実際にトマトを食べたことおなければ見たこともないだろう。
このコンピューターはトマトという言葉の意味を「知っている」といういるだろうか。
コンピュータが記号の意味を理解できない。
記号世界と実世界をいかにつなげるかという問題が記号接地問題である。

# 記号創発問題
そもそも人間と異なる身体を持つロボットやコンピューターが同じ記号に同じ意味を
持てるのかという問題。
例えば、トマトを食べられないロボットが人間と同じようにトマトを理解できるのかということ。
と考えた時に、そもそもの記号の存在理由から考える必要がある。
あらかじめ記号が存在すると考え、人間によりロボットに与えられた記号を設置するという考え方とは逆に、ロボットにとっての記号が生まれること自体を問題としたもの。

# チューリングテスト
機械が知識を持っているかどうかを判定するための一案として、1950年にアラン・チューリングによって考え出されたもので、ユーザーと機械にコンピューター越しにテキスト文字列で会話させた際に、ユーザーに会話相手が人間だと勘違いさせてしまえることができれば、
その機械は「知能を持っている」としても良いというのがチューリングテストのアイデア。

=================================================================

続きは、現在更新中です。
CordovaからiOS, Androidのアプリを起動する方法

# はじめに
Cordovaを利用してスマホアプリの開発を行う際、自分のアプリから別のアプリを起動したり、もしインストールされていないのであればアプリのインストールを促すべく、ストアに遷移させたい場面があると思います。個人的に、困ったところだったので詳しい方法をまとめてみました。

# プラグインの追加
以下のプラグインを追加する必要があります。
・InAppBrowser

以下のコマンドでプラグインを追加できます。

```console
$ cordova plugin add org.apache.cordova.inappbrowser
```

InAppBrowserは、iOSでAppStoreを開く際の以下の記述で必要になります。

```js
window.open("[App StoreのURL]"), '_system', 'location=yes');
```

# 遷移のためのJavaScript
iOSとAndroidのそれぞれで方法が異なるため、OSごとに命令を分岐させる必要があります。

```js:openApp
if (isAndroid) 
    launchAndroidApp();
else 
    launchiPhoneApp();
```

Androidの場合

```js:openAndroidApp
function launchAndroidApp() {
    window.plugins.webintent.startActivity({
        action: window.plugins.webintent.ACTION_VIEW,
        url: "[URLスキーム]://"},
        function() {},
        function() {
            console.log('Failed to open App');
            launchAndroidStore(appinfo);
            }
    );
}
function launchAndroidStore() {
    window.plugins.webintent.startActivity({
        action: window.plugins.webintent.ACTION_VIEW,
        url: "market://details?id=[package名]")},
        function() {},
        function() {
            console.log('Failed to open Store')
            }
    );
}
``` 
[URLスキーム] には、アプリ固有のURLを指定します。
URLスキームは一般に公開されていないことが多いため、以下のサイトを参考にするといいと思います。
http://www.thetheorier.com/index.html

[package名] については、Google Play StoreのURLのid以降となります。
(例) https://play.google.com/store/apps/details?id=net.muji.passport.android

例えば、「MUJI passport」アプリであれば、
[URLスキーム]　= "mujipassport"
[package名] = "net.muji.passport.android"
となります。

iOSの場合

```js:openiOSApp
function launchiPhoneApp() {
    document.location = "[URLスキーム]://";
    var start = Date.now();
    setTimeout(function(){
        var diff = Date.now() - start;

        if (diff < 400) {
            window.open("[App StoreのURL]"), '_system', 'location=yes');
        }
    }, 300);
}
```

[URLスキーム] は、iOSとAndroid共通のことが多いです。
例えば、「MUJI passport」アプリであれば、
[URLスキーム]　= "mujipassport"
[App StoreのURL] = "https://itunes.apple.com/jp/app/muji-passport/id631993791?l=ja&ls=1&mt=8"
となります。

# 最後に
私が個人的に収集した情報ですので、間違いや分かりづらいところがあればコメントしてください。

# 参考情報
http://iphone-dev.g.hatena.ne.jp/laiso/20120625/1340615723
https://cordova.apache.org/docs/ja/3.1.0/cordova/inappbrowser/inappbrowser.html
2Dのちょっとした演出に使えるShaderとか

2Dのちょっとした演出に幾つか役に立ちそうなアセットをまとめておく

<a href="https://www.assetstore.unity3d.com/jp/#!/content/42566" target="_blank">2DxFX</a>
<a href="https://www.assetstore.unity3d.com/jp/#!/content/42566" target="_blank">![image](https://qiita-image-store.s3.amazonaws.com/0/46444/8885f2d3-6987-1808-5e05-c2e2ecd86574.png)</a>
これは2Dのスプライトにいろんなエフェクトを追加できます。
いろんな種類があって面白い。

![Test.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/2d1853c4-c7d0-d8a2-27d5-9759debff2b7.gif)
使い方は沢山あるscriptの好きなやつをspriteにアタッチするだけ。あとはパラメータをいじるだけです

<img width="198" alt="スクリーンショット 2016-02-26 11.22.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/c9d5101a-c69c-7b16-be12-c5068c601bff.png">

<a href="https://www.assetstore.unity3d.com/jp/#!/content/47482" target="_blank">NextGenSprites</a>
<a href="https://www.assetstore.unity3d.com/jp/#!/content/47482" target="_blank">![image](https://qiita-image-store.s3.amazonaws.com/0/46444/ce9a236f-42dd-b897-ae99-0d35496c2a5a.png)</a>
こちらは高機能。
水の中のような揺らめきやディゾルブっていうのかな・・・徐々に消えるみたいなことができます
エミッションもちょっと複雑なことができ、アニメーションさせられます
![Test2.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/c6c19b64-4a9c-5683-cfb3-2adfaa7c102f.gif)
使い方はspriteを選択した状態でwindow->NextGenSprites->WIdgetからのウィンドウをぽちぽちっと
<img width="292" alt="スクリーンショット 2016-02-26 11.53.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/7e0bde33-45ee-b044-ca65-2e4a3ae23144.png">
ライトの影響を受けるかみたいな設定もボタン一つ

<img width="300" alt="スクリーンショット 2016-02-26 11.39.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/6fc1cd09-5f8f-b8ca-92f5-f69f19244f98.png"><img width="300" alt="スクリーンショット 2016-02-26 11.39.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/77125a3c-43ac-bc25-261d-9b8f258c8dbd.png">

あとは設定したい項目をenableにして画像とかパラメータを設定するだけ
<img width="442" alt="スクリーンショット 2016-02-26 11.53.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/645a673d-2a99-bd09-b2e2-00626529fec5.png">

<a href="https://www.assetstore.unity3d.com/jp/#!/content/53258" target="_blank">Curved UI - VR Ready Solution To Bend</a>
<a href="https://www.assetstore.unity3d.com/jp/#!/content/53258" target="_blank">![image](https://qiita-image-store.s3.amazonaws.com/0/46444/c2f98e4f-8414-d828-0a37-336d14161765.png)</a>
こちらcanvasのUIを曲げられる!オキュラスとかで使いたい。

![Test.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/42a27ad1-6749-ce71-b4d9-164aa37ac9f1.gif)
uGUIのキャンバス曲げられます！
上のはアセットにはいってたシーンです
曲がる前はこんな感じ
<img width="401" alt="スクリーンショット 2016-02-06 22.17.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/46444/286fa1e5-66cf-a729-04f9-77999cd490b8.png">
すてき。オキュラスかぶってこういうUI出したかった。

曲げ方は上のようなシリンダーかリング。
リングはこんな感じ
![Test2.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/f0eeb55e-a774-c35e-b614-3cceae4e19d5.gif)

もちろんボタンやスクロールなどのコンポーネントもバッチリ反応します。
Printer Simulatorを使う(XCode7.2.1)

XCode7ではデフォルトで、XCode>Open Developer ToolsからPrinter Simulatorが選択できないようなので追加しました。

１．[Hardware IO Tools](https://developer.apple.com/downloads/?name=for%20Xcode) for XCode 7.1をダウンロードする。

２．Printer Simulator.app を /Applications/Xcode.app/Contents/Applications にコピーする。


これでXCode > Open Developer Tools から選択できるようになりました。
GitLab CI (docker) でCentOSイメージを使う例（GitLab CI入門）

GitLab CI (docker) でCentOSイメージを使う `.gitlab-ci.yml` を紹介します。Circle CI (`circle.yml`) や Travis CI (`.travis.yml`) などでDockerコンテナを用いたビルドを行ってきた人にとってはほぼ違和感ないでしょう。

## 例
```yaml
before_script:
  - /bin/echo Testing... CentOS 6.6 x MySQL 5.6.17
  - /bin/echo Testing... CentOS 7 latest x MySQL 5.7 latest
variables:
  MYSQL_ROOT_PASSWORD: "1iEkou9luj4Etrie"

test:centos6xmysql56:
  image: centos:6.6
  services:
  - mysql:5.6.17
  script:
  - rpm -q centos-release
  - yum install -y mysql
  - mysql --version
  - mysql -h mysql -u root -p${MYSQL_ROOT_PASSWORD} -e 'SELECT VERSION()'

test:centos7xmysql57:
  image: centos:7
  services:
  - mysql:5.7
  script:
  - rpm -q centos-release
  - yum install -y mysql
  - mysql --version
  - mysql -h mysql -u root -p${MYSQL_ROOT_PASSWORD} -e 'SELECT VERSION()'
```

### 詳説

基本的に説明するところはないけれど、Dockerのリンクを理解していない人がはまりそうなところを少し。

#### 本体コンテナからDBコンテナへの接続

```
  - mysql -h mysql -u root -p${MYSQL_ROOT_PASSWORD} -e 'SELECT VERSION()'
```

`-h mysql` の `mysql` はホスト名です。GitLab CI runner側がDockerの機能でlinkしているため、このホスト名を指定します。

ホスト名の規則は `services` で指定したイメージ名になります。ただし、(1) `:` 以降は除去、(2) `/` (スラッシュ) を `__` (アンダースコア2個) に置き換え、をする必要があります。（つまり、 `mysql:5.6` と `mysql:5.7` のサービスを同時に使えないということ。jobを複数書くことで対応するとよいでしょう。）

```
  services:
  - mysql:5.7
```

> The alias hostname for the service is made from the image name following these rules:
> 
> > Everything after : is stripped
> > Slash (/) is replaced with double underscores (__)

via [Using Docker Images - GitLab Documentation](http://doc.gitlab.com/ce/ci/docker/using_docker_images.html)

#### 変数

CIでは `MYSQL_ALLOW_EMPTY_PASSWORD` （パスワードなしログイン可）でも十分ですが、今回はランダムなパスワードを指定してみました。

```
variables:
  MYSQL_ROOT_PASSWORD: "1iEkou9luj4Etrie"
```


## 結果

CentOSの最新版はCentOS 7 (1511) [Docker Hub official repository for centos](https://hub.docker.com/_/centos/)で提供されている通り、[2016-02-17のビルドイメージから](https://github.com/CentOS/sig-cloud-instance-images/blob/11a5de844f026bb7d4297c1d74146f57f0009830/docker/Dockerfile)を使うことになります。リリースバージョンとしては `CentOS 7.2 (1511)` ですが、実際には、いくつかのパッケージアップデートが入っていることでしょう。

```bash
$ rpm -q centos-release
centos-release-7-2.1511.el7.centos.2.10.x86_64
$ yum install -y mysql
[...]
$ mysql --version
mysql  Ver 15.1 Distrib 5.5.44-MariaDB, for Linux (x86_64) using readline 5.1
$ mysql -h mysql -u root -p${MYSQL_ROOT_PASSWORD} -e 'SELECT VERSION()'
VERSION()
5.6.29
```

キャッシュを使わない場合のビルド所要時間は27秒。

## ビルド状況(2017-06-21追記)

ナイトリービルドを[tnir/centos-for-ci on GitLab.com](https://gitlab.com/tnir/centos-for-ci/pipelines)で実行しているので、状況を確認できます。

## まとめ

Circle CIやwerckerでもいいと思うけど、新しいメンバーが増えるたび連携登録が面倒くさいことを考えると、GitLab CI (docker) はデフォルト機能であるため、より手軽にCIを開始できて便利。

あと、UI/UXは商用製品と比べるとまだまだなので、2016/3/22にリリースされる[GitLab 8.6 CI Features](https://gitlab.com/gitlab-org/gitlab-ce/issues/13559)に期待している。
[ImageMagic] Resize Image

If we want to resize some image from the command line, the [ImageMagic](http://www.imagemagick.org/) is a good choice.

After you installed the ImageMagic, you can use `convert` command to resize your image.

```
# percentage
convert rose.jpg -resize 50% rose.png

# specify size
convert rose.jpg -resize 100x100 rose@100.png
```

Also convert command can convert image format.

```
convert rose.jpg rose.png
```

You may want to find more options [here](http://www.imagemagick.org/script/convert.php). Or look the help of this command.
Photoshopでアートボードをコンテンツの大きさに一瞬でリサイズする裏ワザ

Photoshop CC 2015のアートボードを使ってデザインをしている際、下記のように不要な余白が生じてしまうことがあります。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/dd5d0a00-316d-854c-1dd6-5b75487f79fc.png)

この余白をなくし、**アートボードをコンテンツぴったりのサイズに合わせたい**のですが、Photoshop CC 2015にはそのような機能はありません。手動でアートボードのサイズを変更するのも手間です。

今回はこの**コンテンツサイズに合わせてアートボードを一瞬でリサイズ作業を一瞬で行う裏ワザ**を紹介します。

■ 手順
① アートボード内のレイヤーを全て選択します。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/d92b3541-3459-023d-1ea1-e0324fc9bdc5.png)

② 右クリックより「レイヤーからのアートボード」を選択します。

![レイヤーからのアートボード.png](https://qiita-image-store.s3.amazonaws.com/0/67884/09f3217c-35a7-d551-377b-13a7cb576e4b.png)

③ 「レイヤーからの新規アートボードを作成」ダイアログが表示されるので[OK]を押します。ここでは説明の為アートボード名を別名にしていますが、同名にしておく方が管理しやすいです。

![レイヤーからの新規アートボードを作成.png](https://qiita-image-store.s3.amazonaws.com/0/67884/024de519-cb72-4155-8c58-c9c20af63749.png)


④ 選択したコンテンツで構成される新しいアートボードが作成されます。

![新規アートボードが作成される.png](https://qiita-image-store.s3.amazonaws.com/0/67884/a78cbf3f-3308-bb5b-40f7-93768dbcde30.png)

⑤ 元のアートボードを削除します（[右クリック]→[アートボードを削除]）。

![旧アートボードの削除.png](https://qiita-image-store.s3.amazonaws.com/0/67884/9d1d9530-aae1-a643-f42b-594001a4f6f6.png)

⑥ 完成。コンテンツ内容の大きさピッタリのアートボードだけが残ります。

![コンテンツの大きさピッタリのアートボードが残る](https://qiita-image-store.s3.amazonaws.com/0/67884/4bd6c181-c428-66ee-de46-cad7f16b0814.png)

以上です。よきアートボードライフを。

![餌はまだニャ！？.png](https://qiita-image-store.s3.amazonaws.com/0/67884/c09d954d-d085-387b-432b-6f8b04b2d2ab.png)
知って「おっ！」てなったGitHubの知識7選

GitHubダイスキー！
ということで、知った時に「おっ！」と感じたGitHubに関する事項を選出してみました。

あなたに「おっ！」と思ってもらえたら幸せです。
![Octocat.png](https://qiita-image-store.s3.amazonaws.com/0/25176/d458e925-4c57-669a-cecb-52b34aeed471.png)


#  １．入れておくと、意味を持つファイル名がある。
## README.md
README.mdは有名ですよね。リポジトリのトップにREADME.mdという名称でマークダウンを入れておくと、GitHubで解釈されて表示されます。
それ以外にも、あるのです。意味のあるファイル。
## ISSUE_TEMPLATE.md
トップか、.github/というフォルダにISSUE_TEMPLATE.mdという名のファイルを入れると、GitHubでIssueを作った時にこのファイルの内容が入ります。書くべき項目を羅列しておくとルール化できていいですよね。
それ以外にも
## PULL_REQUEST_TEMPLATE.md
を入れておくと、Pull requestを作った時のデフォルト値になります。
## CONTRIBUTING.md
を入れておくと、Pull RequestやIssueを作るときに、「ちゃんとコレ見てからやりなさいよ」的なリンクを表示してくれます。
<img width="1026" alt="スクリーンショット 2016-02-25 12.46.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/25176/fad7c468-778f-8a43-a3b1-b8e769909626.png">
こんなふうに。
ファイルの詳細は[こちら](https://github.com/blog/2111-issue-and-pull-request-templates)で説明されてます。

# ２．コメント入れておくと、Issueを自動でクローズしてくれる。
決まった表記方法でコミットにコメントを入れておくと、Issueを自動でクローズしてくれます。
私の好きな書き方は　
Fixes #1
ですが、書き方は[いろいろ](https://help.github.com/articles/closing-issues-via-commit-messages/)あります。

# ３．github.com上でタグ切れて、リリースできる。
タグにひも付けてバイナリファイルをアップロードすることができます。
コンパイル後や、パッケージ化されたアプリケーションをリリースするのにいいですね。
私はElectronでパッケージ化したファイルをリリースにひも付けてます。[こんな](https://github.com/ukiuni/SliteDesktop/releases)感じです。

# ４．意味のあるリポジトリ名文化。
GitHubではアカウント毎にリポジトリを作成できます。[このページ](http://syossan.hateblo.jp/entry/2016/02/16/144305)をみて、tilは知ったのですが、リポジトリ名をコモンセンス化するのが流行ってます。私が知っているのは til、Today I Learnedと、設定系ファイルを保持する、dotfilesです。他にあれば、教えてください。共通知識が出来ると幸せです。

# ５．hubコマンド
GitHubはその名の通りGitのリポジトリサービスで、Gitコマンドがあれば操作できるのですが、GitHub社お手製の「hubコマンド」を使うともっと便利にGitHubを操作することができます。
hubコマンドが持っている機能は例えば、

```
hub create 今いるリポジトリのディレクトリ名と同名のリポジトリをGitHub上に作成することができます。
hub pull-request プルリクエストを作成できます。
```

です。
gitにAliasを切って、gitコマンドの代わりにhubコマンドを使うことも[出来ます](https://hub.github.com/)。
また、GitHubには[デスクトップアプリ](https://desktop.github.com/)もあるので、GUI好きの方は使ってみてはいかがでしょうか？

# ６．レビューコメントやPull request、Issueにチェックボックスを作れる。

```
- [ ] todo it.
```
のような形式でレビューコメント、Rull request、Issueに書いておくと、編集可能なチェックボックスを作ることができます。
こんな感じです。
<img width="796" alt="スクリーンショット 2016-02-29 12.52.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/25176/e886ba28-fdf3-902a-4ddf-241d0506f4d6.png">

例えば、レビューの指摘が複数あった時に、備忘録としてタスクをチェックボックスに並べ、タスクを終えたらチェックしていく、という使い方もできますね。

# ７．静的Webページを公開できる。
「ユーザ名.github.io」という名前のリポジトリを作成すると、そのURLでアクセスできるWebページを作成してくれます。その名も[GitHub Pages](https://pages.github.com/)。
Organizationを作成して、「Organization名.github.io」というリポジトリ名でも作成できるので、ページはいくつでも作成できます。
また、DNSでC Nameレコードを切って独自URLで運営もできます。
構成管理されたWebページを持てるのは魅力的です。

 
 
------

いかがでしたでしょうか？あなたの「おっ！」があれば幸いです。

> この記事は[週刊クラウド](http://qiita.com/ukiuni@github/items/2317d4cafd008ca4f543)の一投稿として作成されています。
Pepperの声が変えられる？！


#注意書き
2017/11/17　追記
古いPepper君ではできたのですが、新しいPepper君だとできないようです。
どうしてもやりたい場合は白い銀行さんにでも相談してみてください。

#前書き
随分と前の話に作ったボックスの話です。PepperにはAITalkさんの開発されたVOICEROIDが使われていますよね？更には、日本語のボイスとして、こんなにもVoiceが提供されているじゃないですか。

![スクリーンショット 2016-02-26 10.56.13.png](https://qiita-image-store.s3.amazonaws.com/0/35860/e942fe05-0179-27d3-6626-cdb340771a4c.png "スクリーンショット 2016-02-26 10.56.13.png")

過去、うちに来たPepperがバグったのかわからないですが、"Anzu"ちゃんでしか喋らなくなったことがありまして。それでこのボックスを作ろうと思ったのです。

#開発環境
機種名 : MacBook Pro
OS : Yosemite 10.11.3
プロセッサ名 : Intel Core i5 2.6 GHz
メモリ : 16 GB
グラフィック : Intel Iris 1536MB

Choreographe : 2.4.2
NAO : 2.4.2

#本題
まどろっこしいことは抜きにして、完成品がこちら！

![スクリーンショット 2016-02-26 10.28.07.png](https://qiita-image-store.s3.amazonaws.com/0/35860/0b21d87b-ff83-c54a-80cc-41c9a289d2a5.png "スクリーンショット 2016-02-26 10.28.07.png")


```python
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self, False)

    def onLoad(self):
        try:
            self.tts = ALProxy("ALTextToSpeech")
        except:
            self.logger.warn("ALTextToSpeech is not available, language setting cannot be applied to speech")
            self.tts = None

    def onInput_onSet(self):
        voice = self.getParameter("Voice")
        try:
            if self.tts:
                self.tts.setVoice( voice )
            if self.tts is None:
                raise RuntimeError("Cannot set Voice: neither ALTextToSpeech is available.")
            self.onReady()
        except:
            error = "Language " + voice + " cannot be set."
            self.logger.warn(error)
            self.onError(error)
```

##ポイントはここ！！
変数"Voice"に以下のパラメータを設定することです！！

* anzu_n16
* chihiro_n16
* hiroshi_n16
* kaho_n16
* koutarou_n16
* maki_n16 
* nanako_n16
* nozomi_n16
* osamu_n16
* reina_n16
* seiji_n16
* sumire_n16
* taichi_n16

maki_n16がデフォルト値です。

#感想
あの”マキちゃん”や"ゆかりさん"の声が使えると知って、声豚歓喜です！！
何に活用できるかとか、ライセンスがどうとか知りません。
ドキュメントを読めば作れるんですから、多分大丈夫ですよね？

走り書きのようなものなので、詳しくは後日追記するかもしれません。

#関連URL

>AITalk音声合成デモ
>http://www.ai-j.jp/demonstration/
公式BottomSheetDialog(23.2.0)がリリースされたけど挙動が気になったのでちょっといじった【そして23.2.1で直った】

# 最初に

この記事に書いてあることは23.2.1で修正されました。よって、普通に使って問題ありません。やったね！！
（23.2.1での直し方も、この記事で紹介しているのとほぼ同様でした）

# Design Support Library 23.2.0がリリースされた

BottomSheetDialogというのでBottomSheetがカジュアルに使えるようになりましたが、ユーザーがダイアログを引っ張り上げすぎると勝手にDialogがcancelされてしまうというあんまり好きじゃない挙動があります。

これが公式なのか意図しない挙動なのかはわかりませんが、現時点ではどうにも直す手段が提供されていないように見えるので、ソースコードを引っ張ってきてちょっとイジりました。

## 問題箇所

onTouch()でキャンセルしている判定で、ACTION_UP時に指がBottomSheetのコンテンツ部分からはみ出している場合に強制キャンセルされてしまいます。ユーザーが勢い良く引っ張りあげると、大抵の場合コンテンツ部分から指がはみ出ますが、その時に強制的にcancel()が走るのでちょっと困ります。

```java
            coordinator.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if (isShowing() &&
                            MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_UP &&
                            !coordinator.isPointInChildBounds(finalView,
                                    (int) event.getX(), (int) event.getY())) {
                        cancel();
                        return true;
                    }
                    return false;
                }
            });;
```

# イジッた結果

[githubで公開しています。](https://github.com/eaglesakura/android-support-bottomsheet)

ユーザーが引っ張り上げすぎても勝手にキャンセルされない、空白領域（ちょっと暗くなってる半透過部分）をタップした場合のみキャンセルされる、という風になっています。

公式が治った時にライブラリそのものを消せるように、基本的な挙動やクラス名はイジッてません。

# コレを導入する場合

ライブラリを追加して、使用するクラス名を下記に変更してください。

 * 変更前
  * android.support.design.widget.BottomSheetDialog
 * 変更後
  * com.eaglesakura.android.design.BottomSheetDialog

```groovy
repositories {
    maven { url "http://eaglesakura.github.io/maven/" }     // add maven repo
    mavenCentral()
}

dependencies {
    compile 'com.eaglesakura:android-support-bottomsheet:1.0.+' // add library
}
```

# 最後に

普通に挙動変更する手段があったらコメントに書いていただけるとありがたいです。