OmniAICreator/Qiita-1.07M huggingface dataset:
ライブラリに頼らずに CSS の遅延読み込みを JavaScript で実現する

Google PageSpeed Insight から CSS の配信を最適化しなさいと怒られた場合、Above the fold のレンダリングに必要な CSS をインライン化して、残りの CSS を遅延読み込みする必要がある。その残りの CSS を遅延読み込みする JavaScript が長かったり、外部ライブラリ使ってリクエスト投げてたりしてたりするとイケてないので、短く書いてみたものをメモっとく。

**OS X の Safari 9 と Chrome 49 と Firefox 45 で検証した程度なので使用は自己責任で！**

# Google のサンプルコード

Google の[CSS の配信を最適化する](https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery?hl=ja)に掲載されているコードの JavaScript 部分を引用。

```html
<script>
var cb = function() {
    var l = document.createElement('link'); l.rel = 'stylesheet';
    l.href = 'small.css';
    var h = document.getElementsByTagName('head')[0]; h.parentNode.insertBefore(l, h);
};
var raf = requestAnimationFrame || mozRequestAnimationFrame ||
    webkitRequestAnimationFrame || msRequestAnimationFrame;
if (raf) raf(cb);
else window.addEventListener('load', cb);
</script>
```

# 最新のブラウザのみに対応するようにコードを削減する

`requestAnimationFrame` の対応状況を [Can I Use](http://caniuse.com) で確認する。

![Screen Shot 2016-04-07 at 02.07.24.png](https://qiita-image-store.s3.amazonaws.com/0/67627/e6f77988-71c2-6450-fad4-7e7345bc4fe8.png)

IE 9 を華麗にスルーして `requestAnimationFrame` は存在しているものだとする。

```html
<script>
var cb = function() {
    var l = document.createElement('link'); l.rel = 'stylesheet';
    l.href = 'small.css';
    var h = document.getElementsByTagName('head')[0]; h.parentNode.insertBefore(l, h);
};
requestAnimationFrame(cb);
</script>
```

コールバック関数は無名関数でそのまま渡してあげる。

```html
<script>
requestAnimationFrame(function() {
    var l = document.createElement('link');
    l.rel = 'stylesheet';
    l.href = 'small.css';
    var h = document.getElementsByTagName('head')[0];
    h.parentNode.insertBefore(l, h);
});
</script>
```

`document.head` に `appendChild()` でいいだろってことで短くしてみる。

```html
<script>
requestAnimationFrame(function() {
    var l = document.createElement('link');
    l.rel = 'stylesheet';
    l.href = 'small.css';
    document.head.appendChild(l);
});
</script>
```

変数宣言は関数の引数で代用する。コードゴルフっぽくなってきた……。

```html
<script>
requestAnimationFrame(function(l) {
    l = document.createElement('link');
    l.rel = 'stylesheet';
    l.href = 'small.css';
    document.head.appendChild(l);
});
</script>
```

最後に改行や空白を圧縮して1行にする。

```html
<script>requestAnimationFrame(function(l){l=document.createElement('link');l.rel='stylesheet';l.href='small.css';document.head.appendChild(l)})</script>
```

1行80文字に収めたかったらこう。

```html
<script>
requestAnimationFrame(function(l){l=document.createElement('link');
l.rel='stylesheet';l.href='small.css';document.head.appendChild(l)})
</script>
```

# まとめ

ライブラリに頼らなくても自分で書けそう！

# 参考文献

https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery?hl=ja
http://caniuse.com
ReactiveProperty で2度押し防止(Using使ったやつ)


* [ReactivePropertyで2度押し防止 - 眠いしお腹すいたし(´・ω・`)](http://tamafuyou.hatenablog.com/entry/2016/04/06/213633)

を拝見しまして、前から気になってたので考えてみました。

先に別件。

ReactiveCommand は ``IObservable<T>``、そしてロジックの方も ``IObservable<T>`` で作ることが多いのですが、その場合「ボタンをクリックした時に、ロジックを実行する」というコードは大抵以下のようになります。

```csharp:MainViewModel.cs
public class MainViewModel
{
    public ReactiveCommand TestCommand { get; }
    public ReactiveProperty<bool> IsBusy { get; } = new ReactiveProperty<bool>(false);

    public MainViewModel()
    {
        TestCommand = IsBusy.Select(x => !x).ToReactiveCommand();
        TestCommand.Subscribe(_ =>
        {
            // log("ボタンが押されたよ");
            IsBusy.Value = true;
            SomeLogicAsObservable.Subscribe(__ =>
            {
                // log("処理が実行されたよ");
                IsBusy.Value = false; // ほんとは OnCompleted と OnError でやるべき
            };
        });
    }
    
    // なんか重い非同期な処理
    private IObservable<Unit> SomeLogicAsObservable()
    {
        return Observable.Delay(Observable.Return(Unit.Default), 
                TimeSpan.FromSeconds(3));
    }    
}
```

こういうコードを書いていていつも「なんかカッコ悪いなー」と思っていました。
そう思う点は、``Subscribe`` を2回書いていること。ボタンがクリックされた事の購読の中でさらにロジックが実行された事を購読している点です。
どちらも Stream なのだから、うまくマージできないかなと思っていました。

これの解決も一緒に考えてみました。

はい、


```csharp:MainViewModel.cs
public class MainViewModel
{
    public ReactiveCommand TestCommand { get; }
    public ReactiveProperty<bool> IsBusy { get; } = new ReactiveProperty<bool>(false);

    public MainViewModel()
    {
        TestCommand = TestCommand = IsBusy.Select(x => !x).ToReactiveCommand();

        TestCommand
            .SelectMany(_ => UsingIsBusy(SomeLogicAsObservable()))
            .Subscribe(_ => { /* log("ボタンが押されてロジックが実行されたよ") ※ */ });
            // ※ロジックがたくさん OnNext を呼んでいたらここもたくさん呼ばれるから注意
    }

    private IObservable<T> UsingIsBusy<T>(IObservable<T> observable)
    {
        return Observable.Using(
            () =>
            {
                IsBusy.Value = true;
                return Disposable.Create(() => IsBusy.Value = false);
            },
            _ => observable);
    }

    // なんか重い非同期な処理
    private IObservable<Unit> SomeLogicAsObservable()
    {
        return Observable.Delay(Observable.Return(Unit.Default),
                                TimeSpan.FromSeconds(3));
    }
}
```

``IsBusy`` の ON/OFF を ``Observable.Using`` に任せるようにしました。これは、第2引数に指定した ``IObservable<T>`` が完了または失敗した時にリソースを解放してくれる C# の ``using 句`` のようなもので、ここでは第2引数にロジックの ``IObservable<T>`` を渡すことで、ロジックが完了したら自動的に ``IsBusy.Value = false`` が実行されます。

次に「``Subscribe``を2回してる問題」は、ボタンがクリックされた``IObserbale<T>`` から ``SelectMany`` で繋いであげることで解決しています。

このコードの要注意は、``IsBusy.Value = false`` が実行されるのがUIスレッドとは限らないので、View側でバインドするまでに ``ObserveOnUIDispatcher`` などをしてあげないといけないことです（少なくとも Xamarin.Android + ReactiveProperty ではそうでした。WPFだと気にしないのでしょうか？）。


もう少し汎用性を高めて、「``IsBusy プロパティを持った ReactiveCommand``」のようなものを作ったら便利なのかもしれないです。
webpackのcss-loaderでCSS Modulesをやる


# はじめに

[CSS Modules](https://github.com/css-modules/css-modules)の発想はよくわかったけど、具体的にどうやって導入したらいいかわかりにくく感じたので、webpackでCSS Modulesを使うための設定と、ReactでCSS Modulesを使う簡単な例を紹介します。

CSS Modulesの概要やいいところについてはこのあたりをどうぞ。

* [CSS Modules 所感 - morishitter blog](http://morishitter.hatenablog.com/entry/2015/09/28/103334)
* [CSSモジュール ― 明るい未来へようこそ](http://postd.cc/css-modules/)

CSS Modulesを行うための方法はwebpack以外にもいくつかあるようです。
Browserify pluginの[css-modulesify](https://github.com/css-modules/css-modulesify)も人気そうです。(発音できない)

# やってみる

まずは、必要なモジュールをインストールします。
CSS Modulesを使うために、style-loaderとcss-loaderが必要です。
React+babel+webpackの構成に必要なものも記述しています。

```bash
$ npm init -y
$ npm install --save react react-dom
$ npm install --save-dev webpack style-loader css-loader babel-loader babel-preset-es2015 babel-preset-react
```

次に、webpackの設定です。
loaders部分には、babel-loaderとCSS Modulesの二つが設定されています。
`'css?modules'`と書いてある部分が重要です。
`modules`オプションを与えることで、css-loaderがCSS Modulesの振る舞いをするようになります。

```webpack.config.js
module.exports = {
  module: {
    loaders: [
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        query: {
          presets: ['es2015'],
          plugins: ['transform-react-jsx'],
        },
      },
      {
        test: /\.css$/,
        loaders: ['style-loader', 'css-loader?modules'],
      },
    ],
  },
  entry: './app',
  output: {
    path: __dirname,
    filename: 'bundle.js',
  },
  resolve: {
    extensions: ['', '.js', '.jsx'],
  },
};

```

次に、CSSをこんな感じで書きます。。
CSSのクラス名は一般的にはhyphen-caseが多いような気がしますが、CSS Modulesの場合はJS側からアクセスしやすいようにcamelCaseにしておくと良さそうです。

```app.css
.hogeHoge {
  background-color: green;
}
```

最後に、Reactを使ったJS部分です。
app.cssをimport(またはrequire)することで、衝突しないように変換されたクラス名を読み込むことができます。
importした結果を`div`要素の`className`に与えています。

```js:app.jsx
import React from 'react';
import ReactDOM from 'react-dom';
import styles from './app.css'

class App extends React.Component {
  render() {
    return <div className={styles.hogeHoge}>hello</div>;
  }
}

ReactDOM.render(<App/>, document.getElementById('content'));

```

一応HTMLも置いておきます。

```index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <title>CSS Modules Example</title>
  </head>
  <body>
    <div id="content"></div>
    <script src="bundle.js"></script>
  </body>
</html>
```

以下のように適当にwebpackでビルドします。
私は普段はnpm scriptsに書いています。

```bash
$ ./node_modules/.bin/webpack
```

ブラウザでアクセスするとdivのクラス名が`_3PdwrDVeQurTJpm2SrFLC2`というように変換されていることが確認できると思います。
クラスの命名ルールはcss-loaderの`localIdentName`オプションで変更することができます。
例えば、`'css?modules&localIdentName=[path][name]---[local]---[hash:base64:5]'`のように設定するとクラス名が`app---hogeHoge---3Pdwr`のようになります。

# おわりに

どうしてもSassを書きたくなかったので、これでBEM+Sassの代替手段として機能しそうです。
Grunt 1.0でプラグインがインストールできなかった場合の対処

## 0. 寝る
(4/7 朝追記)  
以下は4/6の夜に書いたものですが、寝て起きたらUpdateされてました。(^^;;;;

[PRに+1](https://github.com/joeytrapp/grunt-focus/pull/4#issuecomment-206446305)しておいたのも効いたかもしれません。

---

いつの間にやらgrunt 1.0がリリースされてますな！

しかし、その結果としてインストールできないプラグインが出てきてます。(爆)

grunt-focusとか、grunt-focusとか、grunt-focusとか。。。(--

もはやメンテされていないプラグインは使うべきではない、とは思うけど自力で対処する場合の対処方法です。

## 1. GitHubリポジトリをフォークする
対象のプラグインのリポジトリ（今回の場合はgrunt-focus）に行ってフォークする

https://github.com/joeytrapp/grunt-focus

## 2. package.jsonを修正
peerDependenciesを修正

https://github.com/shunjikonishi/grunt-focus/commit/3844b44c838c9adaa77ec05308af2743452d0669

この修正は公式サイトで説明されているやり方です。

ていうか、同じ修正がすでに本家にPullRequestあるんですけどね。。。

https://github.com/joeytrapp/grunt-focus/pull/4

## 3. GitHubから直接プラグインをインストール

```
$ npm install --save-dev git+https://github.com/shunjikonishi/grunt-focus.git#for-grunt1.0
```

いじょ。

僕のリポジトリはgrunt-focus本家がアップデートされた場合は消すと思うので、やる場合は必ず自分のリポジトリにフォークして行ってください。
Windows電卓


## 割り算の余りの求め方
商 = [A÷Bの整数部分]
余 = A - 商×B

引用：<a href="http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q139510343" target="_blank">電卓で、割り算の余りを求めたいです。どうすれ... - 数学 | Yahoo!知恵袋</a>

Windowsの計算機
1. 割られる数入力後「MS」
2. 割られる数と割る数で計算
3. 2の整数部分×割られる数
4. 「M-」後、「MR」で答え
HTML,CSS勉強メモ #12 〜box-shadow他〜

本日の勉強。

##**進度**##
<dl>
<dt>引き続き練習ページの作成。</dt>
<dd>`header`から`menu`までの背景や装飾</dd>
</dl>

##**メモ**##

1. **コンテンツ部分のスペースに影をつける**
 
* メニューやコンテンツを入れている部分は`.main-container`と指定しています。ここに`box-shadow`をつけたかったのですが、最初うまくいかずに影もつかなければ`position`も効いていない状態になってしまいました。 
 * 影をつける要素の後ろになる要素に`background`がついていると、見えなくなってしまうので、`z-index`で重なり順を明確にしてあげる。
 * ベンダープレフィックスをつける。
 * いろいろ見つけたのですが、結局最終的に何もつけず

```css
#main_container{
    width: 80%;
    height: 750px;
    margin: 0 auto;
    background: rgb(255, 255, 255);
    position: absolute;
    top: 80px;
    left: 10%;
    /*z-index: 2;*/
    box-shadow: 5px 5px 2px rgba(0, 0, 0, 0.5)
}
```

　　　と普通に記述しても適応されるようになりました・・・ということで結果、原因不明です。
　　~~ただし、`background`→`box-shadow`の順番で記述しないと背景がつかずに透過されてしまうことがわかりました。~~

2. **`h1`のロゴを中央に寄せたい**

* ページの名前にあたるロゴ部分を文字で「HEADER」と記述しています。左上に寄っていたのでこれを中央に持ってくることにしました。
 * 結論から言うと実に初歩的で、`margin`と`padding`で調節してあげればよいだけでした。
 * それまでの試行錯誤としては、`inline-block`にしてみたり、`text-align`でやってみたりと色々しましたけど、まずは基本を忘れないことですね・・・
 
```css
h1 {
    width: 120px;
    margin:0 auto;
    padding: 15px 0 0 0 ;
    font-weight: bold;
    font-size: 30px;
    color: rgba(158, 172, 47, 0.78);
    text-shadow: 1px 1px 2px rgba(247, 232, 198, 0.3);
    /*display: inline-block;*/
    /*text-align: center;*/
    /*margin-top: 5px;*/
}
```

＊ちなみに、コメントアウトしてあるのは私の試行錯誤の跡です。

本日は以上です。
[iOS] How to validate the receipt of In-App purchase

Here is the official guide to validate the receipt with Objective-C.

[Receipt Validation Programming Guide](https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW1)

But here just use `curl` to validate the in-app purchase receipt.

### Validate API

There are two url to post the receipt to the apple api server. One is sandbox and another one is production.

```
https://sandbox.itunes.apple.com/verifyReceipt
https://buy.itunes.apple.com/verifyReceipt
```

### Encode the receipt with base64

This api does not accept the raw receipt, but the base64 encoded value.

Here introduce two ways to encode the receipt.

#### Command Line

```sh
echo "receipt-string" | openssl enc -e -base64
```

#### Ruby Script

```rb
require 'base64'
str = "receipt-string"
p Base64.encode64(str)
```
### POST encoded receipt

Here we use the `curl` to post the encoded receipt to the apple api server.

```sh
curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST \
-d "Encoded-receipt" \
https://sandbox.itunes.apple.com/verifyReceipt
```

You will get a json result with status code, `0` is valid or error code  [here](https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW1).
pipコマンドをインストールする

pybrewがほぼdeprecatedだそうで。これからはpythonz使う。（メモ）
pipコマンドでpicraft入れてみたけど、これはMinecraft Pi editionなのね。
作業メモがもったいないのでタイトルを変えて投稿。

```bash
// CentOS7環境を準備(--rmでstop時にコンテナ削除される)
$ docker run --rm -i -t centos:centos7 /bin/bash
# useradd mine
# su - mine

// ここからが本ネタ
$ python --version
Python 2.7.5
$ curl -O https://bootstrap.pypa.io/get-pip.py
$ python get-pip.py --user
$ pip install picraft --user
Collecting picraft
Installing collected packages: picraft
Successfully installed picraft-0.6
```

# 参考

MinecraftをPythonで遊ぶ - Qiita
http://qiita.com/wh11e7rue/items/15603e8970c36ab9733d

いつの間にかpipのインストールが楽になってた件 - Qiita
http://qiita.com/who_you_me/items/831d62f396e6d66dda66
`https://raw.github.com/pypa/pip/master/contrib/get-pip.py`はもう古いです。


Installation — pip 8.2.0.dev0 documentation
https://pip.pypa.io/en/latest/installing/

Python実行時にInsecurePlatformWarningが出る場合の対応方法 - Qiita
http://qiita.com/testnin2/items/97ddb749879415b23e18
20代も残り僅かなWebエンジニアが30になるまでにやりたい10のこと

# 経緯

- 今年28のWebエンジニア
- 文系大学を出て23ぐらいからWeb系の仕事をやりはじめる
- Webベースの社内売上管理ツール作ったり、ソシャゲを作ったりしながらはや5年
- [地震bot](https://twitter.com/zishin3255)を作った時のあの気持ちはどこへやら
- 自信をもって使える言語は、PHP・Javascriptぐらい

本当にこのまま30を迎えていいのか…？

# なんとなくこのままではイカん気がする

- スプラトゥーンたのしい
- とりあえずQiita・はてブを斜め読み

この堕落しきった生活を見なおして、エンジニアとしての幅を広げたい
30歳まであと2年。目標を持って何かに取り組もうじゃないか

# 30までにやりたい・習慣づけたい10のこと

あくまでも超個人的な目標です。

## 1. iPhoneかAndroidアプリを作ろう

業務で作ったことはあるけど、WebView使ったすごく簡単なアプリのみ。
買ったばかりのMacbookが泣いてるぞ。

## 2. Linuxサーバーを作ろう

サーバーの知識が全然足りないので、自力でOSインストールからやろう。
LPICみたいな資格が取れたらなおいいよね。

## 3. 2で作ったサーバーでトライしよう

あれだけ斜め読みしてきたQiitaやはてブでdockerとか散々話題になっているのに何をやってきたんだろう。
実際に使って研究して会社にも提案していこう。

## 4. 誰にも負けない知識をつけよう

どんなジャンルでもいいので、そのジャンルで社内で一番知っている人になろう。
きっと頼れる人間になれるぞ。

## 5. Podcastを聞こう

[Rebuild](https://rebuild.fm)とか素敵なPodcastから新鮮なネタを仕入れよう。

## 6. 情報収集源を変えよう

2chのまとめサイトをみてクスクス笑っている場合ではない。
まとめサイトを読む代わりにオリジナルの新たな情報源をみつけよう。

## 7. もっとRaspberryPi触ろう

2015年の誕生日に頂いたRaspberryPi。
[引っ越し祝いに大きめのエジプト神像を送りつけられたのでラズパイを仕込んで喋れるようにした](http://qiita.com/sngazm/items/c27b7745fb68139213c2)
の影響を受けてopen-jtalk入れてホルス神を召喚してから触ってないぞ。
電子工作も楽しそうだぞ。

## 8. 自分が楽するためにコードを書こう

毎日会社に行って同じことやってないか？
それ、自動化できるんじゃないの？
実現するには、知らない言語を覚える必要があるんじゃないの？

## 9. 師匠をみつけよう

自分に刺激をくれる師匠をみつけよう。
きっと自分の知らない世界に連れて行ってくれるぞ。

## 10. 30になったらこの記事を読もう

30になった自分は全部達成できたのだろうか？


# 余談

4月は目標を立てる月。
新しい生活や新しい仲間に出会える月。
自分のため、会社のため、世の中のためにちっぽけなエンジニアが出来ることを考えてみたところであります。


あれいいよ、これいいよとか先輩方のご意見お待ちしております。
FireLink 2.3.2 を申請


今日試したら[普通にログイン](http://qiita.com/ongaeshi/items/3b06531d190479af55fb)できました、なんだったんだろう・・。

ともあれ2.3.2を申請しました。(レビュー前ですがxpiはダウンロードできます)

- [Version 2.3.2](https://addons.mozilla.org/en-US/firefox/addon/firelink/versions/?page=1#version-2.3.2)
gulpでファイル構造を維持したファイルコピー

```
images
 ├ 2015/
 │  ├ 01
 │  └ 02
 └ 2016/
    ├ 01
    └ 02
```
上記のような構成のとき、images以下のフォルダ構造を維持したまま、コピーなどの処理をしたい時がある

## {base:'dir'}
gulp.src()のOptionで```{base:'dir'}```とすると、dir以下の構造を維持したままのコピーが可能になる。

```js
gulp.task('resize', function() {
    gulp.src('content/images/**/**/*.{jpg,png}', {base:'content/images/'})
    .pipe(imageResize({ 
      width : 1000
    }))
    .pipe(gulp.dest('_site/content/images/'));
});
```
【Swift】filterとクロージャ使ってfor文いらず。(字余り)

## はじめに
独学でプログラミング学び始めて約1年、業務でプログラミング書き始めて2ヶ月、Swift始めて１ヶ月のSwifterです。
先日投稿した[【Swift】for文を逆順で回したいあなたに](http://qiita.com/elle68kew/items/4c00ed105078096ece54)へいただいたコメントを参考に、より文が短くならないかやってみました。

## 環境
xcode 7.2.1
Swift 2.1.1

## やること
filterを使って配列の整理を短い文で書く

### 整理したい内容
二つの配列とfilter()を使って
これを、

```swift
var array = ["りんご", "ごりら", "らっぱ", "ぱせり", "りーる"]
let removeName = ["ごりら", "らっぱ"]
```
こうする。

```swift
["りんご", "ぱせり", "りーる"]
```

### **とりあえずやってみる**
まずは昨日のエントリを参考にfor文で書いてみる。

```swift
for index in (0..<array.count).reverse() {
    if array[index] == "ごりら" || array[index] == "らっぱ"{
         array.removeAtIndex(index)
    }
}
```
長い上に美しくない。保守性も低い。「配列を途中で削除する = 逆順で回す」　だと思い込んでいたので、配列の整理をすればいいことに気がつかなかった。

### filterを使う

```swift
for name in removeName {
    array = array.filter($0 != name)
}
```
filterを使ってみた。 削除する単語が一つの場合はfor文で回す必要がなかったが、複数削除する際の方法が分からず、とりあえずfor文で回した。

### いただいたコメント
```swift
array = array.filter({ (item) -> Bool in
    return !removeName.contains(item)
})
```
なるほどcontains()で要素があるか調べてBoolを返してあげればいいみたい。さらに短くはならないだろうか。

### inの後に改行しなくてもよさそう
returnの行が長い文でもないので改行をやめてみる。

```swift
array = array.filter({ (item) -> Bool in return !removeName.contains(item)})
```
短くなった。

### クロージャでは暗黙的にその値が返るのでreturnが省略可
[Swift による iOS 開発入門](http://swift-ios.keicode.com/lang/closures.php)を参照。

```swift
array = array.filter({ (item) -> Bool in !removeName.contains(item)})
```
まだいけそう

### そもそもitemはなんだ？？
唐突に出てきたitem(変数名はなんでもよいっぽい)について、デバッグで変数の中身をみてみると、itemは順番に"りんご" - "ごりら" - "らっぱ" - "ぱせり" - "りーる"となっていた。arrayの中身が順番に取り出されているっぽい。
クロージャの中で引数は自動的に連番される([[Swift]クロージャーについてまとめてみたよ](http://blog.personal-factory.com/2016/01/07/how-to-swift-closure/)を参照)のであれば、プレースホルダを使えばいいのでは・・・？？
そしたら何かもうこんな書き方でいいんじゃないか？

```swift
array = array.filter{!removeName.contains($0)}
```
エラー出ない！ ちゃんと思惑通りに出力される！

### **結果比較**
これが、、、

```swift
for index in (0..<array.count).reverse() {
    if array[index] == "ごりら" || array[index] == "らっぱ"{
         array.removeAtIndex(index)
    }
}
```

こうなった！

```swift
array = array.filter{!removeName.contains($0)}
```

可読性が高いかどうかは微妙なところ・・・？？
ただ、後者の方がfunctionalなのと保守性は格段に上がったのでは。
リファクタリングって楽しいですね！

お疲れ様でした。
残業、遅刻、夜更かしを防ぐHTML

## はじめに
ちょっとしたスクリプトを書いておくだけで、時間の使い方が変わるかもしれないよというお話し。

## ずるずると残業するのをやめたいとき
ずるずると残業するのをやめたいとき、以下のHTMLをデスクトップにでもおいておきましょう。

~~~html:帰宅時間.html
<!doctype html>
<head>
<meta charset="utf-8">
<style>
#time {
	font-size:200px;
	font-weigth:bold;
}
</style>
</head>
<body>
<p>今帰ると帰宅時間は<span id="time"></span>頃です。</p>
<script>
// 通勤にかかる時間
var hours = 1;
var minutes = 30;
update();
setInterval(update, 60 * 1000);
function update() {
	var dT = 60 * 60 * 1000 * hours + 60 * 1000 * minutes;
	var timeObj = new Date(new Date().getTime() + dT);
	var hour = timeObj.getHours();
	var minute = timeObj.getMinutes();
	hour = (10 <= hour) ? hour : "0" + hour;
	minute = (10 <= minute) ? minute :  "0" + minute;
	var time = hour + ":" + minute;
	
	document.querySelector("#time").textContent = time;
	document.title = time;
}
</script>
</body>
</html>
~~~
定時が近く成ったらこれをブラウザで開いて、一番左のタブにでも配置しておきましょう。「今帰ると帰宅時間が何時頃になるか」を常にタブに表示して「そろそろ帰ったら？」とプレッシャーを与えてくれます。

> ![帰宅時間1.png](https://qiita-image-store.s3.amazonaws.com/0/29682/1ef13841-db16-b8ae-f5f6-010b8389a84a.png)

タブを開けば、でかでかと帰宅時間が表示されます。わざと上司に見えるように表示させておけば「そろそろ帰りたい」アピールになります。

> ![帰宅時間2.png](https://qiita-image-store.s3.amazonaws.com/0/29682/b2eb4401-fd28-56c1-ee70-76f19a01b710.png)

淡々と帰宅時間を提示され続けたら、どこかのタイミングで「さすがに帰りたい」と思うでしょう。

## 遅刻ギリギリになってしまうとき
毎朝PCをいじってしまい遅刻ギリギリのあなたは、さっきのHTMLを文言だけ変更して保存しておきましょう。

今出発したら何時ごろに会社につくのか表示してくれます。

> ![帰宅時間2.png](https://qiita-image-store.s3.amazonaws.com/0/29682/929b207a-73fb-7bfe-2daf-752a8516bd0a.png)

「今出たらギリギリなのか！」、「余裕をもって出社するには今出るしかないのか！」などと気づくことでしょう。


## ずるずると夜更かししてしまう場合
ずるずると夜更かししてしまうあなたは、こんなHTMLを保存しておきましょう。

~~~html:睡眠時間.html
<!doctype html>
<head>
<meta charset="utf-8">
<style>
#time {
	font-size:200px;
	font-weigth:bold;
}
</style>
</head>
<body>
<p>今から寝ると<span id="time"></span>睡眠です。</p>

<script>
// 起きる時間を設定
var wakeupHour = 7;
var wakeupMinute = 0;

update();
setInterval(update, 60 * 1000);
function update() {
	var now = new Date();
	now.setSeconds(0);
	now.setMilliseconds(0);
	
	var wakeUpTime = new Date();
	wakeUpTime.setHours(wakeupHour);
	wakeUpTime.setMinutes(wakeupMinute);
	wakeUpTime.setSeconds(0);
	wakeUpTime.setMilliseconds(0);
	if (wakeUpTime.getTime() <= now.getTime()) {
		wakeUpTime.setDate(wakeUpTime.getDate() + 1);
	}
	
	var diffSec = (wakeUpTime.getTime() - now.getTime()) / 1000;
	var hour = Math.floor(diffSec / 60 / 60);
	var minute = Math.floor((diffSec - (hour * 60 * 60)) / 60);
	var time = hour + "時間" + minute + "分"
	
	document.querySelector("#time").textContent = time;
	document.title = time;
}
</script>
</body>
</html>
~~~

> ![睡眠時間.png](https://qiita-image-store.s3.amazonaws.com/0/29682/e92b2a02-2cd1-2c4c-97f6-a00f50d3d568.png)

あと何時間寝れるのか、まぎれもない事実を提示してくれます。気づかないふりをしてさらに夜更かしすると、無情に時間が減っていきます。きっと「さすがにそろそろ寝よう」と思わざるを得なくなるでしょう。
DockerをMacOSXにインストールする

MacOSX (Yosemite 10.10.5) にDockerを入れるための手順の備忘録。
これからDockerをインストールする方は、ご参考までにどうぞ！


1. 準備
--
公式サイトから、Docker ToolBoxをダウンロードする。
url: https://www.docker.com/products/docker-toolbox


2. Docker Toolboxインストール
--
ダウンロードしたDocker Toolboxのパッケージを起動し、ソフトウェアのインストールを行います。オプションなどをカスタマイズしない場合は、インストールの手順に沿ってDocker Toolboxの構築を進めます。

注意：Docker Toolboxのインストールの終わりにインストールの項目があります。そこで、Docker Quickstart Terminalを選択すると、ターミナルが起動してDockerのダウンロードが始まります！

3. Dockerの構築
--
2でDocker Quickstart Terminalをすでに実行している場合は、この章をスルーしてください。

MacのLaunchpadからDocker Quickstart Teminalを起動し、Dockerの構築を進めます。Terminalが起動したのち、Dockerの設定が自動で進みます。少し時間がかかりますが、お気になさらず。。。

TerminalにDockerのクジラが表示されたら構築完了です！

4. 動作テスト
--

Dockerを操作しましょう！

hello-worldコンテナを動かします。

```bash
 $ docker run hello-world
```

コマンドを実行したのち、Terminal上に次のようなメッセージが表示されます。

```bash
...
Hello from Docker. 
This message shows that your installation appears to be working correctly.
...
```

これで、dockerの動作確認ができました！

インストール手順は公式サイトを参考に抜粋したので、詳しく知りたい方は以下のURLへアクセス！
url: https://docs.docker.com/engine/installation/mac/

以上です！
ご指摘・アドバイスがあれば、コメントお願いします！
SaaSで良いのでプライベートなGit共有リポジトリを無料で使いたい（GitLab）

## ワガママ（やりたいこと）
- Gitの共有リポジトリが欲しい
- 複数人で使いたい
- でも開発担当以外の人に安易にソース公開させたくない
- かといってGitHubのプライベートリポジトリ使うのはお金かかるし
- 自分でサーバー立ててGitインストールは面倒
- プルリクエスト機能が欲しい
- などなど...

## そんなワガママを叶えてくれる
[GitLab.com](https://about.gitlab.com/)!

GitLabって予め用意した自分のサーバーにインストールして使うものだとばかり思ってましたが、
Webホスティングサービスも展開してたんですね。知らなかった。。
他のサービスも一応比較してみましたが[^1]、知名度やorganizationの多さ的にもGitLabが一番信頼できるかなと。
[^1]: 【参考】http://bitwave.showcase-tv.com/git%E3%83%9B%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E6%AF%94%E8%BC%83part%EF%BC%91/

プライベートリポジトリをユーザー数無制限でいくらでも作成できるのは太っ腹ですね。

## GitLabで共有リポジトリ作るまで
### ■1. サインイン
https://gitlab.com/users/sign_in
開発メンバーは別途GoogleAppsでアカウント管理しているので
「**Sign in with**」で"g"マーク選択し、GoogleAppsアカウントで認証。

### ■2. グループ・プロジェクト作成
1. 複数人で開発するので、まずは**New Group**でグループ作成
2. 作成されたGroupの画面で**New Project**でグループに属するプロジェクトを作成

### ■3. SSH鍵設定
1. ■2でプロジェクト作成したら、プロジェクトのTOP画面にこんなメッセージが出てきます。  
**You won't be able to pull or push project code via SSH until you add an SSH key to your profile**  
まずは、以下参考に、SSH公開鍵・秘密鍵作ってください。（Windows端末前提）  
http://webkaru.net/linux/tera-term-ssh-login-public-key/
2. 上記メッセージの**add an SSH key**を押してSSH鍵登録画面を開き、作成した公開鍵の内容をコピペして登録
3. 秘密鍵のほうは、ローカル端末の「{ホームディレクトリ}/.ssh」に配置

### ■4. ローカル側でのGitコマンド操作
※Windows端末前提です。
[Git](https://git-for-windows.github.io/)はローカル端末に予めインストールしてくださいね。

1. ■2でプロジェクト作成したら、プロジェクトのTOP画面に**Command line instructions**てのが出る  
URLのところ、HTTPSかSSHか選択できる箇所があるので「**SSH**」を選択
2. Gitリポジトリのクローン作るディレクトリまでエクスプローラ移動し、右クリック→Git Bash
3. 「**Git global setup**」「**Create a new repository**」のコマンドをGit Bash上で実施  
Create a new repositoryのところは、cloneコマンドが確認できれば良いかと  
README.mdはすでに作成されていれば、以降のコマンド実施する必要なし

これであとは、そのプロジェクトのGit運用方針に従い開発を進めていこう。

### 【注意】TortoiseGitを利用する場合
上記■3と■4の手順が若干変わります。。
■3で生成した秘密鍵をPutty Private Key File形式にしないといけない。
■4のcloneコマンドは、TortoiseGitから行ったほうが良いかも。

1. WindowsのアプリからTortoiseGit→PuttyGenを選択
2. File→Load Private Keyで秘密鍵選択
3. Save Private KeyでPutty Private Key File形式で保存
4. clone先のディレクトリをローカル側で任意で用意し、そこまでエクスプローラで移動
5. 右クリック→TortoiseGit（Git Clone）で、SSHパスとPutty Private Key File形式で保存した秘密鍵選択
6. clone結果がSuccessとなればOK

### オーナーとしての後処理
ここまで確認できれば、あとは開発メンバーに上記手順の■1と■3を見てもらってGitLabアカウントとSSH鍵を作ってもらう。
上記できたら、こちらからグループプロジェクトに対してユーザ追加をする。
で、開発メンバーには残りの■4.ローカル側操作をしてもらう。

とりあえず、コストかけずに複数人でGit使う際の参考にしていただければ幸いです。
SmartAR for Unityの物理サイズとEditor上のサイズを合わせる


# はじめに
ソニー製、サイバネット社提供のSmartAR for Unityを使用するにあたって、Unity Editor上でどのくらいのスケール感でシーンを構築すればいいのか分かりづらかったので、A4サイズのマーカーを想定してサイズを合わせました。

## 1unitの物理サイズ
Unityのお作法上、1 = 1mが推奨されています。しかし、メートル単位の広範囲に渡るARはあまり一般的ではないかと思いましたので、本稿では編集のやりやすさを優先して、1 = 1cmで設定しています。

# 辞書を用意する
今回はA4サイズのマーカーを想定していますので、A4にプリントアウトできる適当な辞書画像を用意して、辞書を生成します。

![smart_ss03.png](https://qiita-image-store.s3.amazonaws.com/0/111394/9a6a9432-df34-5a32-1e52-df2de2b577fc.png)
*上図のGUIツールは勝手に作ったものです。ソニーおよびサイバネットからは提供されておりませんのでご注意ください。*

# Editor上の設定
SmartAR for UnityをImportしたプロジェクトで、SmartAR Camera、SmartAR Targetをシーンに追加しておきます。

![smart_ss01.png](https://qiita-image-store.s3.amazonaws.com/0/111394/3cf82d5b-8fb4-63b9-1fdc-4904c6a11284.png)
サイズがわかるように、TargetEffectorの子にキューブを作ります。その際、スケールをA4の物理サイズ（cm）に合わせます。

![smart_ss02.png](https://qiita-image-store.s3.amazonaws.com/0/111394/e8ad6ae9-8fe2-3455-7b4b-ecf8e6a75a74.png)
SmartAR CameraのInspectorから、**SmartAR EffectorのTransform Scaleを7に設定**します。

# 結果
![Screenshot_2016-04-06-23-32-33.png](https://qiita-image-store.s3.amazonaws.com/0/111394/47677d19-8d63-c2c7-68b6-45dc1c327aae.png)

こんな感じで、A4サイズにプリントアウトしたマーカーとほぼ一致します。

SmartAR for Unityでは、Editor上のプレビューがそのままでは困難で、シーン編集に迷うことが多々ありますが、ご参考にしていただければ幸いです。
Swift覚え書き Test

自分用の覚え書き。
たぶんこのままだとコンパイルエラーになります。

Swiftの例外はObCの例外機構と異なるため、SwiftにはExpression関連のアサート関数が存在しない。

```
import XCTest

@testable import test

class testTests: XCTestCase {
    
    override func setUp() {
        super.setUp()
        // Put setup code here. This method is called before the invocation of each test method in the class.
    }
    
    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }
    
    func testExample() {
        // This is an example of a functional test case.
        // Use XCTAssert and related functions to verify your tests produce the correct results.
        
        let expression = false
        let expression2 = true
        let msg = "msg"
        let nilObj:String?
        let accuracy:Float = 1.0
        let num01 = 1
        let num02 = 2
        
        XCTAssert(expression,  msg)
        
        XCTAssertTrue(expression, msg)
        
        XCTAssertFalse(expression, msg)
        
        XCTAssertNil(nilObj, msg)
        
        XCTAssertNotNil(nilObj, msg)
        
        XCTAssertEqual(expression, expression2, msg)
        
        XCTAssertNotEqual(expression, expression2, msg)
        
        XCTAssertEqualWithAccuracy(expression, expression2, accuracy, msg)
        
        XCTAssertNotEqualWithAccuracy(expression, expression2, accuracy, msg)
        
        // num01がnum02より同じか小さいことを期待する
        XCTAssertLessThanOrEqual(num01, num02, msg)
        
        // num02がnum02より小さいことを期待する
        XCTAssertLessThan(num01, num02, msg)
        
        // num01がnum02より同じか大きいことを期待する
        XCTAssertGreaterThanOrEqual(num01, num02, msg)
        
        // num02がnum02より大きいことを期待する
        XCTAssertGreaterThan(num01, num02, msg)
        
        // 必ず失敗する
        XCTFail(msg)
    }
    
    func testPerformanceExample() {
        // This is an example of a performance test case.
        self.measureBlock {
            // Put the code you want to measure the time of here.
        }
    }
    
}
```
使っていると router の パフォーマンス が どんどん悪化するので 自動で 再起動 させてみる

# Overview

大変素晴らしく気に入っている [Aterm WG1800HP2](https://121ware.com/product/atermstation/product/warpstar/wg1800hp2/) ですが、昨今のvideo streaming serviceなどを使っていると、数日でパフォーマンスがひどく悪化し、動画がカクカクするので、speedtest.netをしてみると、起動直後は500MBPSほど出ていたパフォーマンスが、数MBPSまで悪化していました。

というわけで、手動で再起動させていたわけですが、家には眠っていたIntel Edisonもあるので、自動で再起動させるべく、scriptを書いてみました。

# 取ってくる

https://github.com/hidenorly/atermUtil

githubのを方を見てもらえば、わかりますが、Apache2ライセンスです。

```
$ git clone https://github.com/hidenorly/atermUtil.git
$ chmod +x atermUtil/aterm_util.rb
$ ln -s /home/User名/atermUtil/aterm_util.rb /home/User名/bin
```

# cronに登録

```
$ crontab -e
0 4 * * * /bin/bash /home/User名/bin/daily-job.sh
```

# job shell scriptの作成

```
$ vim ~/bin/daily-job.sh
#!/bin/bash
/home/User名/bin/aterm_util.rb -p ルータのパスワード
```

# なお

```
$ sudo apt-get install ruby2.1
```

とかで、rubyも入れておいてください。

快適なネットライフを。
JavaFX でコードからお手軽に背景画像を挿入する

# 概要
JavaFX で背景画像を設定するサンプルは FXML で指定しているものが多いです。それだと固定の画像しか使えないので、コードから差し込む方法を調べてみました。

# コード
root の Pane に対し、下記のコードを追加します。

```java
final String image = new File("path/to/images/splash_bg.jpg").toURI().toString();
controller.background.setStyle(
    "-fx-background-image: url('" + image + "'); " +
    "-fx-background-position: center center; " +
    "-fx-background-repeat: stretch;"
);
```

ちなみに、画像をjarに同梱する場合は、画像を src/main/resources に配置し、下記のように指定することも可能です。

```java
final String image = ProgressDialog.class.getResource("/splash_bg.jpg").toExternalForm();
```

# 参考
1. [Setting background image by javafx code (not css)](http://stackoverflow.com/questions/9851200/setting-background-image-by-javafx-code-not-css)
AndroidStudioでfailed to find target android-22エラー

#はじめに
以下の書籍を読みながらAndroid向けのゲーム開発をしていたところ、環境構築でいきなりつまずいてしまった！

[*はじめてでもよくわかる! Cocos2d-xゲーム開発集中講義 [v3.10対応]*](http://www.amazon.co.jp/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%A7%E3%82%82%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8B-Cocos2d-x%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E9%9B%86%E4%B8%AD%E8%AC%9B%E7%BE%A9-v3-10%E5%AF%BE%E5%BF%9C-%E8%A5%BF%E7%94%B0-%E5%AF%9B%E8%BC%94/dp/4839954909)

第2構において、cocosで作成したサンプルプロジェクトをAndroid Studioにインポートするのだが、インポート時に「*failed to find target android-22エラー*」が発生する。

環境変数やbuild.gradleを確認したが全く原因不明だった。

#解決方法
正直何が原因だったのかはわかっていないが、「Android SDK Manager」の「SDK Platforms」より「Android 5.1.1」一式をインストールすることにより解決した。

書籍にはandroid-22のBuild-toolsをインストールする旨しか書かれていなかったが、それだけでは足りないツールやファイルがあったということだろうか。。。
※上記書籍の出版は2016年3月25日であり、本記事の記載は2016年4月6日である
sshの設定覚書

# Overview

permissionの設定など、いろいろと落とし穴があるので、sshの設定を覚書きしておく。

# ログイン元 (UbuntuやMacなど)

## 準備

```
$ sudo apt-get install openssh-client
```

## 鍵ファイルの作成

```
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

## ~/.ssh/configの設定

```
$ vim ~/.ssh/config
Host hoge
    HostName hoge.local
    User harold
    Port 22
    Protocol 2
    IdentityFile ~/.ssh/id_rsa
    ServerAliveInterval 60
```

haroldはご自分のuser名に変更のこと。
また、Port名や鍵が違う場合も変更のこと。

## Permissionの設定 (重要)

```
$ ssh ...
Permission denied (publickey.gssapi-keyex, gsapi-with-mic).
```

みたいなのが出る場合は、以下が必要です。

```
$ chmod 0700 ~/.ssh
$ chmod 0600 ~/.ssh/id_rsa
$ chmod 0600 ~/.ssh/id_rsa.pub
```

## 試してみる

下のログイン先での鍵の設定が完了しないと、RSAでの認証はできません。

```onMac
$ ssh -i ~/.ssh/id_rsa harold@hoge.local -p 22
$ ssh hoge
```

上の2つは同じことです。
hoge.localでloginするには、avahiなどのinstallが必要です。

# 鍵の転送

```
$ scp ~/.ssh/id_rsa.pub harold@hoge.local:
$ ssh hoge

hoge側で:
$ mv id_rsa.pub ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
```

# ログインしたい先 (Raspberry Piなど)の設定

sshでloginしたい先のmachineにおいて、
```
$ sudo apt-get install openssh-server
```

>Raspberry Pi2/3用Ubuntu Mate 15.10とかには最初からもちろん入っていますけど、一応基本からということで。

# sshd_configの設定

sshでloginしたい先のmachineにおいて、

```
$ sudo vi /etc/ssh/sshd_config
```

### 必要ならばport番号変更しましょう
```
Port 22 
```

### rootのログインを非許可にする

下はRSA鍵によるloginのみにする. noneはそもそも非許可にする
```
PermitRootLogin none
```
または
```
PermitRootLogin without-password 
```
なぜかwithout-passwordにしないと、RSA鍵によるloginができないことも
(Raspberry Pi3 with Ubuntu Mateで確認...)

Ubuntu 16.04では
```
PermitRootLogin prohibit-password
```
でよい

###  RSAv1を非許可 (v2のみ許可)
```
#RSAAuthentication yes 
PubkeyAuthentication yes
AuthorizedKeysFile	%h/.ssh/authorized_keys
```

### passwordによるloginの非許可
```
PasswordAuthentication	no
```

## Permissionの設定 (重要)

```
$ chmod 0700 ~/.ssh
$ chmod 0600 ~/.ssh/authorized_keys
```

なお、このauthorized_keysは、上でlogin元で生成したid_rsa.pubを入れていくことで、loginできる形になります (複数必要な場合は単純追記でokです)


### firewallの設定とsshdの再起動

```
$ sudo ufw allow 22
$ sudo ufw enable
$ /etc/rc.d/init.d/sshd restart
```

または

```
$ sudo service ssh restart
```
pcregrepで複数行の文字列をマッチさせる

複数行にまたがる文字列をgrepで検索したいときには、
perlの正規表現が使えるpcregrepが便利です。

#インストール
CentOS6には標準でインストールされていますが、
CentOS7やAmazonLinuxの場合は、
pcregrepが含まれるpcre-toolsパッケージをインストールしてください。

```
yum install pcre-tools
```

#使い方
例えば以下のようなファイルがあるときに

```test.txt
abc
hoge
123
```

pcregrepをMオプション付きで実行すると...

```
$ pcregrep -M "abc\nhog"  test.txt
abc
hoge
```

```
$ pcregrep -v -M "a.*\n.*g"  test.txt
123
```

改行を含んだ文字列をマッチさせることができます。
複数行で出力されるログの監視などで重宝しています！


#man page
http://www.pcre.org/original/doc/html/pcregrep.html
rails check_boxの使い方


<%= f.check_box 'カラム名',{},checked_value = "true",unchecked_value = "false" %>

checked_value = "true"

チェックした時にtrueが送られる。

　uncheked_value = "false"

チェックした時にfalseが送られる。

""をつけなければエラーは発生しないが、全部trueになってしまう。

こっちでもok
<%= f.check_box 'カラム名',{}, "true", "false" %>




trueにしたユーザーを取り出すには

Hoge.where({ カラム名: 1 })で取り出すことができる。
DeepGramでジョブズ卒業式スピーチから「stay hungry, stay foolish」の発話時刻を取得

#ディープラーニングAPIを試してみよう
[(主に)ディープラーニングの成果を利用したAPI集(自分用) - Qiita](http://qiita.com/shngt/items/966799cc3f7c77a6fa17)
こちらの記事がたいへん面白く何か動かしてみようと思いました。API利用ならデザイナーの自分でもディープラーニングで気軽に遊べそうです :sunglasses: 

#DeepGram
![スクリーンショット 2016-04-06 22.12.09.png](https://qiita-image-store.s3.amazonaws.com/0/26043/0f0ad1a3-411d-fdf4-c72c-ae0e49a62ac2.png "スクリーンショット 2016-04-06 22.12.09.png")
DeeoGramという「音声中のキーワードを発見し、正確な位置を返す」APIを試すことにしました。

ゲーム実況動画から発話単語を検索するデモを見ることができます :eyes: 
[DeepGram](https://www.deepgram.com/)

#DeepGram利用登録
フォームを入力し、登録します。使用目的は適当に書いておきましょう。
[https://www.deepgram.com/signup](https://www.deepgram.com/signup)

#ジョブズのスピーチ動画をYoutubeから探す
認識させたい動画をyoutubeから探します。今回はジョブズのスピーチにすることしました。
[スティーブ ・ジョブズ・スタンフォード大・卒業式スピーチ・2005年 Steve Jobs 　Stanford 式辞 - YouTube](https://www.youtube.com/watch?v=VyzqHFdzBKg)

- コンソール画面の左メニューから「my files」を選択
- upload some filesのフォームにYoutubeのURLを入力しsubmit
- 数秒後、動画のContent IDが表示されることを確認

#curlしてAPIリクエスト
- コンソール画面の左メニューから「dashboard」を選択
- ページ最下部に「your dev key」が表示されていることを確認
- ページに表示されているcurlコマンドを確認
- ターミナルからコマンドを叩く

#「stay hungry, stay foolish」を検索
##APIリクエスト
```
curl -H "Content-Type: application/json" -X POST -d '{ "action": "object_search", "userID": "your-dev-key", "contentID": "your-content-id", "query": "stay hungy, stay foolish", "snippet": true, "filter": {"Nmax": 10, "Pmin": 0.55 }, "sort": "time" }' api.deepgram.com
```
- 「search through a file」のコマンドをコピペし、「your-content-id」をmy filesメニューに表示されたcontent idに修正
- Nmax: わからない
- Pmin: 認識率の最低値 ここでは55%

##返ってきたJSON
```
{"snippet": ["were the words stay hungry stay foolish it was their", "they signed off stay hungry stay foolish and i have", "that for you stay hungry stay foolish thank you all"], "P": [1.0, 1.0, 1.0], "endTime": [853.26, 859.5200000000001, 871.17], "startTime": [850.7900000000001, 857.01, 868.91], "N": [0, 2, 1]}%
```

- snippet: 検索クエリ前後の発話内容
    - 精度はあまり高くない
- P: 認識率 1のときは100%?
- startTime:発話時刻(秒)
    - 結果:[850.7900000000001, 857.01, 868.91]
    - 「stay hungry, stay foolish」を3回発話している

##実際にチェック!
![スクリーンショット 2016-04-06 22.27.40.png](https://qiita-image-store.s3.amazonaws.com/0/26043/7ccf3bb6-a6e5-348d-2a2a-0304a0e0b362.png "スクリーンショット 2016-04-06 22.27.40.png")


Youtubeで868秒時の動画を再生してみる。ちゃんと「stay hungry stay foolish」の発話位置になっていた。
https://www.youtube.com/watch?v=VyzqHFdzBKg&feature=youtu.be&t=868s

#考察
- スピーチのような発話以外の雑音が少ないと認識しやすい
	- 音楽のPVもやってみたけど精度が悪い
- 動画内容の検索に使えそう
- Podcastの内容を検索することもできそう
- 日本語も認識してくれるのか
    - 英語しか検証してない
vagrant起動不可、再び（２）

上がったと思ったが、ダメでしたね。
そもそも全然検討違いですよ、何もわかってない。

しょうがないので。

①　vagrantのアンインストール。

②　virtualboxマネージャにて、アンインストールして、電源オフになっているマシンを除去しとく。（意味があるかは不明）

③　MyVagrantをフォルダごと消す。（意味があるかは不明）

④　.vagrant.dをフォルダごと消す。（意味があるかは不明）

⑤　vagrant 1.8.1のインストール。

　　http://dotinstall.com/lessons/basic_localdev_win/30803

⑥　vagrantの初期化→vagrantfile設定→vagrant up。

　　環境は、32 ビット オペレーティング システム、x64 ベース プロセッサ。

　　http://dotinstall.com/lessons/basic_localdev_win/30804

　　　　vagrant init bento/centos-6.7
　　　　ドットインストールのまま

⑦　各種設定、導入

　　http://dotinstall.com/lessons/basic_localdev_win/30806

　　長い！

⑧　RubyOnRailsインストール

　　$ gem install rails
　　長い！

以上。
$x==$xがfalseになる(おそらく)唯一の例

先日`define('PI',3.14)`とかいうコードを見かけてﾌｧｰてなったrana_kualuですが皆様いかがお過ごしでしょうか。

PHPには一部の数学定数が最初から入っています。
http://php.net/manual/ja/math.constants.php
円周率M_PI、ネイピア数M_E、オイラーの定数M_EULERなどが定義されています。
しかしM_PI/2や2/M_PIとかのよくわからない値が定義されているわりに、何故黄金比や単位元やグラハム数は定義されていないのか。

まあそのあたりの実体はただの数値なのでどうでもいいとして、数学定数の中にはふたつだけ特殊な定数が入っています。
NANとINFです。
こいつらは型こそfloat型ですが、中身は普通の値ではありません。
両方とも変ですが、特にNANはPHPの常識とかけ離れた動作をします。

```php
var_dump(
	 INF === INF // true
	,INF == INF  // true
	
	,INF != INF // false
	,INF > INF  // false
	,INF < INF  // false
	
	,NAN === NAN // false
	,NAN == NAN  // false
	
	,NAN != NAN // true
	,NAN > NAN  // true
	,NAN < NAN  // true
	
	,INF == NAN // false
	,INF != NAN // true
);
```

推移律が成り立たない例は多々あれど、`$x==$x`がfalseになる例はNANだけだと思います。

ちなみに円周率は、定数が定義されている上でさらに[pi()](http://php.net/manual/ja/function.pi.php)って関数まで存在したりします。
どうしてそんな使い道の狭すぎる関数作った。せめて引数受け付けろと。
VS2012で「ContractName Microsoft.VisualStudio.Utilities.IContentTypeRegistryService...」というエラーが出るとき

VS2012で新規のWin32プロジェクトを作成しようとすると今回のエラーが発生。

#環境

* Windows 7 Professional SP1 64bit
* Visual Studio Premium 2012


#エラー内容

![vs2012_error.PNG](https://qiita-image-store.s3.amazonaws.com/0/79414/aa3cb996-d998-4b31-89b0-83df42fde036.png)
>制約
>ContractName
Microsoft.VisualStudio.Utilities.IContentTypeRegistryService
RequiredTypeIdentity
>ContractName
Microsoft.VisualStudio.Project.IProjectServiceAccessorに一致するエクスポートが見つかりませんでした。

#対処方法

以下のフォルダを削除 or リネーム
```%AppData%\..\Local\Microsoft\VisualStudio\11.0\ComponentModelCache
```

#出典

http://stackoverflow.com/questions/19217506/error-in-microsoft-visual-studio-2012-no-exports-were-found-that-match-the-cons
PATH概念

パスを通す、ということはどういうことだろうか。
それを一言で言うと、どのディレクトリにいてもバイナリファイルをコマンドとして呼び出すことが出来るようにすることだ。
例えば

``` binX
echo "HELLO"
```

このようにHELLOを出力するファイルがあるとする。
このプログラムをコマンドとして使いたい場合がある。
"binX"とコマンドとして打てば"HELLO"が帰ってくると嬉しいわけだ。

それを実現するために、コンピュータがコマンドを認識するシステムと、実際に実行されるバイナリファイルの置き場が必要となる。
その置き場をPATH、コマンドを認識させることをPATHを通すという。

例えばmybinというディレクトリに先ほどのbinXという実行ファイルを置いておく。そしてmybinにPATHを通すと、mybin以下の実行ファイルがすべてコマンドとして使用できるようになるというわけだ。

ここでよくやりがちなのが、実行ファイルではなく、実行ファイルが配下にあるディレクトリをmybinの下に置いてしまうことだ。PATHは直下でないとコマンドとして認識しないので、要注意。

さて、実際のPATHの通し方だが、
以下を.bash_rc or .bash_profileにかけばよろし。
```
export PATH=$PATH:mybin
```

mybin部分が追加したい実行ファイルへの検索パスとなる。
DNAポリメラーゼの働き

バイオの知識を深めるために、[PDB101](pdb101.rcsb.org)の記事を和訳します。
DNAポリメラーゼについて。以下、意訳。

#### 生命の神秘

DNAポリメラーゼは生物的なプロセスにおいて重要な役割を果たしています。それは遺伝情報の複製を行います。細胞が分割される度、DNAポリメラーゼはDNAを複製し、親の細胞から子の細胞へと情報を受け渡し世代を超えて情報が伝えられていきます。このDNAの引き継ぎは地球に初めて誕生した頃の生命と私達の細胞が生物的につながりがあることを示しています。その点から考えると、私達のDNAはとても貴重なものであると言えるかもしれません。

#### 驚くべき正確さ
DNAポリメラーゼは最も正確な働きをする酵素です。それは毎回正確にDNAのコピーを作成しつつも、10億に1回以下の精度を誇っています。これは私達の情報処理能力と比べても優れていることがわかります。なぜならそれは1000冊の小説を読んで、その中からたった一文字の誤字を見つけるようなものだからです。C-G、A-Tをマッチさせる(シトシンはグアミン、アデニンはチミンと対応づけられる)その素晴らしい能力は、それが高い正確性を兼ね備えているという特殊性を実現しています。しかしDNAポリメラーゼはそれだけではなく、DNAの複製後必ずその複製物を校正し必要とあらば誤った箇所を切り捨てることまでしてくれます。

#### 囚人と血統
DNAはユニークですので、他人との識別に有効です。もし血痕の一つでもあれば、その血が誰のものなのか調べることができます。もちろん、血痕の中に入っているDNAの量はごくわずかのため、それを増やすためにDNAポリメラーゼが使われます。そのわずかなDNAはPCR(Polymerase Chain Reaction: DNAポリメラーゼの複製機能を利用してDNAを増やす手法)により増やされ、簡単に解析できるようになります。PCRのプロセスは以下のようです。まず、そのわずかなDNAは試験管にDNAポリメラーゼとともに入れられます。その試験管を温めると、DNAの2本鎖は2本に解かれます。DNAポリメラーゼは2本の解かれたそれぞれのDNAから、新たなDNA鎖を作成します。この新たに作成された2つのコピーDNAは同じように温められ、複製され、4本のコピーDNAになります。この反応を繰り返すことで大量かつ同一のDNAが複製されます。私達の体にある、通常のDNAポリメラーゼの場合、温めた段階で壊れて機能を失ってしまいます。しかしThermus aquaticusという、温泉に生息する細菌が持つDNAポリメラーゼの場合高温にも耐えることができるのですべてのPCRでそのDNAポリメラーゼが活用されています。ちなみに、[これ](http://www.rcsb.org/pdb/explore/explore.do?structureId=1tau)がPDBに登録されているその酵素のデータです。

#### 構造

![ポリメラーゼの構造](http://cdn.rcsb.org/pdb101/motm/images/pol_active.gif)

このシンプルな酵素は手のような形をしています。上記二つとも、細菌のポリメラーゼです。左が[Escherichia coli](http://www.rcsb.org/pdb/explore/explore.do?structureId=1kln)で、右が[Thermus aquaticus](http://www.rcsb.org/pdb/explore/explore.do?structureId=1tau)のポリメラーゼです。左のE.coliポリメラーゼの下部に示された緑の領域はPDBに登録されておらず、上部がよく研究されています。面白いことに、親指とその他の指との間にはDNA鎖がちょうどフィットする間隔があり、実際その手のひらのような箇所にDNAがフィットします。写真で紫と緑に色が付いている、手の中央あたりでしょうか。金型となるDNAは紫、新たに複製されたDNAが緑色に色づけられています。この酵素は３つの活性な箇所があり、Synthesis(新規DNAが収まっている箇所), Proofreading(新規DNAを校正する箇所), そしてPrimer removal(DNA複製にRNAの断片を除去する箇所)と示されている箇所です。E.coliはProofreading機能がある一方、Thermus aquaticusはその機能がありません。

#### DNAポリメラーゼ

すべての生物はDNAポリメラーゼを持っています。とてもシンプルなものから全てを行うようなものまで。私達の体の中のポリメラーゼはより複雑な構造をしています。指輪のような形のものやαヘリックスを解いたようなものものなどの複数のタンパク質から成っています。

![DNAポリメラーゼ](http://cdn.rcsb.org/pdb101/motm/images/threepol.gif)

上の写真は左上がE.coli、右上が[ヒト](http://www.rcsb.org/pdb/explore/explore.do?structureId=1zqa)、下のが[ウイルス](http://www.rcsb.org/pdb/explore/explore.do?structureId=1clq)のDNAポリメラーゼです。それぞれ形も大きさも異なりますが、DNAの包み方や合成反応などは似通っています。
画像をアニメっぽく表示する

#目的・背景
写真とかをアニメっぽく表現するアプリとかは沢山あるけど、リアルタイムにアニメっぽくするアプリがないので作った。
ニコ生とかに使ってほしい。
![AnimeFace.png](https://qiita-image-store.s3.amazonaws.com/0/118314/fec3a35a-18e1-a531-1fce-810dd5feff3d.png)

コードはGitHubに公開 : [AnimeFace](https://github.com/ud0nge/AnimeFace)

#やったこと
やったことは、なんとなくネットにある情報を組み合わせただけ。
意識したことは、「美顔にすること」と「アニメ風にすること」
##美顔関係
- ガンマ補正
- コントラスト補正

##アニメ風関係
- ぼかし処理
- クラスタリングによる減色
- 輪郭表示

##個人情報関係
- 目隠し

##処理詳細

###ガンマ補正
明るさを調整するために付け加えた機能。
撮影された画像が暗いと、不細工に見えるらしい。
![gamma.jpg](https://qiita-image-store.s3.amazonaws.com/0/118314/6d6dc798-4111-48a1-15b7-56142ab8c34d.jpeg)
参考
- [写真は怖くない！すごい「Photoshop」マジック小技集２３](http://commte.net/blog/archives/3374)
- [ゴリラになる知識](http://gori-naru.blogspot.jp/2012/11/blog-post_21.html)
###コントラスト補正
明暗をくっきりさせて、影を際立たせるために付け加えた機能。
![contrast.jpg](https://qiita-image-store.s3.amazonaws.com/0/118314/0d803957-dd2f-b5a7-2c91-2fb2a1339390.jpeg)
明暗がついて、のっぺら顔にならないっぽい。
###ぼかし処理
シミ・ソバカスとかを目立たせないようにするために付け加えた機能。
![median.jpg](https://qiita-image-store.s3.amazonaws.com/0/118314/d3c7ee13-2c0b-b59c-d9a8-43a1246319b4.jpeg)
メディアンフィルターを使用して、補完する。

###クラスタリングによる減色
アニメ風に表示するために減色させる。
今回はk-means法を利用して減色させています。
![cluster.jpg](https://qiita-image-store.s3.amazonaws.com/0/118314/0998e0b6-da5f-7b3b-2de1-ed57de3c7f2c.jpeg)
顔部分のみ摘出して、クラスタイングしたほうが、いい結果がでるかも？
試してはいない。

###輪郭表示
やっぱ、アニメ風なので輪郭がなくてはダメかな？っと思い追加した機能。
画面更新ごとにチラチラ変わってちょっとウザったい。
![canny.jpg](https://qiita-image-store.s3.amazonaws.com/0/118314/3cd0bdb6-7ae2-a380-e69b-457b8a96cde4.jpeg)

###目隠し
目隠しすることで、個人情報を保護します。
たまに失敗します。
![eyehide.jpg](https://qiita-image-store.s3.amazonaws.com/0/118314/5af05688-6e9f-c481-82dc-df138283d58d.jpeg)

#考察
小顔の機能も付け加えたかったが、顔の輪郭を取る方法が分からず断念。
JavaFX8で作ってみたが、コードより、画面レイアウトに手間取った。
AnimationTimer上で画像処理を行うと、重くなるので、画像処理を繰り返し行うスレッドを生成し、AnimationTimerは、定期的に、処理結果を表示するようにした。
ちょっと容量が悪い。スレッドの使い方間違ってるっぽ。
Unite 2016 Tokyoの体験メモ

**Unite 2016 Tokyo**　http://japan.unity3d.com/unite/unite2016/
**開催日時**　2016年4月4日（月）～5日（火）
**会場**　ヒルトン東京お台場
**公開資料や動画**　http://japan.unity3d.com/unite/unite2016/schedule

----

講演とかの個人メモはTwitterで。
https://twitter.com/search?q=%40x71713%20%23unite2016tokyo

はやくも資料はどんどんアップされてるし、動画もあるし、内容知りたいの人はきっとそちらを見る方が幸せです。


この記事ではヘッドマウントディスプレイ系の体験の感想とかを忘れないうちにメモしておきます。


Oculusの体験ブース
-----

- ストアにあるタイトルで遊べた！
- Riftさんで遊べる環境は今の所手元にないので遊べてよかった
- ゆったり座りながらプレイ
- 通りかかった時に体験している方観察したりしましたが、あまりぐるぐる回りを見回す方もいなかった気がする。純粋にもくもくゲームしてた。
- VRゲームをちゃんとやったことがあまりなかったので、ピンクのあの気になってたFly to KUMAを選んでやりました
- そういえばコントローラー持ってやるとAボタンとか言われてもわからない勢です、HMDで難しい操作難しい
- ぴんくのクマたちはこっちを向いてくれてるのが可愛かった
- 操作がよくわからず適当にボタンを押してたときに横に移動すると思っていなかったのに移動した時には酔いというかめまいを感じた＜意識して移動するぞと思わないとこわい＜チュートリアルないとこわい＜ただ、同じマシンでどんどん体験なのでもしかしたら別の人がチュートリアルしたのかな？とも思ったり（すでにいくつかステージが進んでいたので）
- HMDでゲームは展示会みたいな場所でも人目を忘れてゲームに集中出来る＜たとえ前だけ見ていても、テレビでやるのとは違う集中度合いになる気がする
- 設置している様子がコードごちゃーとかじゃなくてスタイリッシュでこれならオサレな家にもおける！と思えた（オサレな家がまずn
- 付けた瞬間気づかなかったけど、上のバンドが長すぎたのか若干ほっぺたで支えている感じがあった＜つけたら頭をこういう風に振ってどんなところに気をつけるとぴったり装着できたか判断できますみたいなおきまりの動きほしい＜初めてかぶったわけでもないのに気づかずごめんなさい・・・！ｗ


PSVRの体験ブース
----

- ヘディングゲームのお部屋だった
- シンプルなゲームだったのですが、チュートリアルで中のアバターの動きを真似してヘディングしてね、というところが難しかった
- 記憶が曖昧ですが、チュートリアルの上半身だけ？のアバターの動きは腰を支点に前におじぎするような、回転しているような動きに見えたので真似するつもりで頭を下に振ってしまうような動きになり失敗し続けたのかも
- さらに正しい動きがわからないと動きのフリが小さすぎるのかな？と思ってもっと悪い動きになってしまっていたような気がする
- 前後の動き！という言葉を聞いて前後に動くコツをやっとつかめた
- PSVRは大きいけどなんか見た目よりフィット感があるのが不思議
- ヘッドホンよりイヤホンの方がいいかも、と自分が好きなものつけられるのはいいかも。メガネのときヘッドホン耳痛いとか耳の形あうあわないとかそういうの調整できるのはうれしい
- 音声が出ている方向、スピーカーっぽいものが動いてた？天の声より、自然にあそこから出てる音声だなと思えてよかった気がする



HADO( http://meleap.com/hado/ )の体験
----

- 魔法出せた！！！！！
- ARで実際の空間上に魔法出せるとバーチャルな空間以上に自分が出している気がして楽しい
- 手は結構疲れる（運動不足
- 敵の攻撃を避けられることに驚く。アイテムを近づいてとれることにも驚く。
- テクノスポーツ未来だ
- 部屋でやるというよりイベント会場やゲームセンターに行ってやりたい
- 協力プレイとか他の実在するユーザーとやる体験もしてみたい（自分だけじゃなくて他の実在している同じ人にも同じ場所にモンスターが見えているとかわくわくする）
- 運動と組み合わせた時にはかたいHMDつけて転ぶのは怖いとは思いました（運動音痴なので、、、ころびそう。。。
マルチデバイスでの情報管理効率向上! Pushbullet+IFTTT導入

# 注意
作業まとめなのでまとめサイト並みの付加価値しかありませんよ

# できると幸せなこと

iPhoneで株価お知らせbotをフォローして通知設定
=> 前場寄りの時間帯は通知が多くてその度にiPhone見るの面倒
=> じゃあmacでiPhoneの通知見れればいいんじゃね

好きなブログをfeedlyに登録
=> いちいちfeedly見て更新の有無確認するの面倒
=> ウェブチェッカーもemailだから見逃す希ガス
=> じゃあiPhoneに通知送ればいいんじゃね


# 叶えてくれるもの
1. 通知共有アプリ: Pushbullet 
2. 通知アプリ:IFTTT(IFTTTはIFに名称変更したそうです)

# Pushbulletの導入
https://www.pushbullet.com/
イロトリドリさんの導入がわかりやすかったですので僕から補足はありません!
http://iro-toridori.net/20150320/pushbullet/

# IFTTTの導入

イロトリドリさんの導入がわかりやすかったですので僕から補足はありません!!(２回目
http://iro-toridori.net/20150403/if-pushbullet-blog/
でもfeedlyとの連携は月$7かかる($65)とのことorz

# twitter通知とIFTTT/Pushbulletの連携

イロトリドリさんの導入がわかりやすかったですので僕から補足はありません!!!(3回目
http://iro-toridori.net/20150518/push-inyou-retweet/
ただ、使ってみて注意点あり。

1. 通知フロー:iPhoneアプリ(twitter)→IFTTTレシピ→IPhoneアプリ(Pushbullet)→mac(chrome)
iPhoneの通知をそのままデバイスと同期できる訳ではないです。
[notifyrというアプリ](http://www.getnotifyr.com/)ならBluetooth経由で同期できるようですが、手元のiPhone6ではApple Storeに該当アプリが無い状態で、ダウンロードができませんでした。。なお、notifyrの開発者はオランダの17歳少年だそうで、Pythonを生んだ国は凄いな、と。


2. リアルタイムでは無いこと
例)PM20:30のツイートがPM20:34に通知
うーむ、これだとデイトレードには使えない。。
そんな暗くなった矢先、この[紹介サイト](http://www.lifehacker.jp/2014/04/140404pushbullet.html)によるとこんなのがあるらしくwktkしたが、どうもYahoo Finance(米国版)のみの対応のようでした。
>株価を通知させる
『IFTTT』の株価チャンネルを利用すれば、特定銘柄の株価があらかじめ指定しておいた割合以上に下落したり、上昇したりした場合に通知を受け取ることができます。あるいは、取引終了時にその日の終値を通知させたりもできます。株価チャンネルのデータは「Yahoo! Finance」から提供されています。

# 結論
イロトリドリさんありがとう!
Laravel5.2.29で、webミドルウェアがデフォルトで利用されるようになっていた


Laravel5.2で新しいプロジェクトをはじめると、いつもルート定義はこんな風にwebミドルウェアを指定したRoute::groupで囲まれたテンプレが用意されていたのですが、

```php
Route::group(['middleware' => ['web']], function () {

    Route::get('/', function () {
        return view('welcome');
    });

});
```

先日新規にはじめたプロジェクトではRoute::groupがなくなって、

```php
Route::get('/', function () {
    return view('welcome');
});
```

だけになっていました。

artisan route:listしてもちゃんとwebミドルウェアが適用されてるし、これはどうしたことかと思ったのですが、コミットを遡ってみたら[しれっと修正されて](https://github.com/laravel/laravel/commit/5c30c98db96459b4cc878d085490e4677b0b67ed)いたんですね。

まあ間違って二重にミドルウェアを通しても問題ないっちゃないのですが...。
StripeでCA証明書が読み込めずAPIと通信できなかった問題の解決ログ


開発しているサービスの1つで、クレジットカード決済にStripeを利用しているものがあるのですが、サーバサイド(Ubuntu 12.04, PHP)とStripe APIとの間で通信を行う際に、ルート証明書が読み込めておらず決済が完了できない問題がありました。

同じ問題に遭遇する方がどれくらいいるか分からないのですが、少しハマってしまったので解決ログを残しておきます。

## 起こったこと

クライアントサイドのjs（公式ライブラリ）で決済用のトークンを発行したのち、そのトークンを使ってサーバサイド（公式のPHPライブラリ）で決済を完了させる際に、以下のエラーが発生しました。

```
Stripe\Error\ApiConnection: Could not verify Stripe's SSL certificate. Please make sure that your network is not intercepting certificates. (Try going to https://api.stripe.com/v1/charges in your browser.) If this problem persists, let us know at support@stripe.com.

(Network error [errno 60]: SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed)
```

StripeのPHPライブラリは通信にcurlを利用していますが、CA証明書（/etc/ssl/certs/ca-certificates.crtなど）を読み込めておらず、Stripeの証明書チェックが通らなかったようです。

## 困ったこと

少しググると、この問題が起こるケースの多くはローカルにあるルート証明書が古すぎることで起こっているようでした。その場合は、例えばUbuntuであれば

```bash
sudo update-ca-certificates
```

としてやれば解決しているようです。

しかし、僕のケースではCA証明書は最新だったので、やはりcurl通信時に正しく読み込めていないようでした。

ですので、方法としては

```php
curl_setopt($handler, [
	CURLOPT_CAINFO => '/etc/ssl/certs/ca-certificates.crt'
]);
```

などのようにcurlを叩く前に明示的にCA証明書の場所を指定してやることが考えられます。が、curlのハンドラはStripeのライブラリ内に隠蔽されているのでこれはできず、うーんどうしたものかと思っていました。

## 解決した方法

Stripeは、\Stripe\HttpClient\CurlClientのインスタンスを別途用意し、カスタマイズすることができるようになっています。

さらに、わりと最近まではcurlのオプションまでは変更できなかったのですが、つい先日[v3.12.0でこんなコードが追加](https://github.com/stripe/stripe-php/commit/6691001819545f63fc611d0f60d54eaffd28be7e)され、事前にcurlのオプションを渡すことができるようになりました。ありがたい。

これがあればもう解決です。CurlClientのインスタンスを作る際にCURLOPT_CAINFOをセットしておき、そうやって用意したクライアントをStripeのライブラリに知らせます。

```php
$curl = new \Stripe\HttpClient\CurlClient([
	CURLOPT_CAINFO => '/etc/ssl/certs/ca-certificates.crt'
]);
\Stripe\ApiRequestor::setHttpClient($curl);
```

あとは、いつも通りに

```php
\Stripe\Charge::create([...]);
```

することができました。

以上、何かのお役に立てれば幸いです。
Docker Toolbox でルートに作成したファイルは共有できない

システムのルートにファイルを作成する人はあまりいないと思うので、ハマる人はあまりいないと思いますが、ルートに作成したファイルを共有しようとするとエラーは発生せずに、ディレクトリは見えるけれどファイルが見えないという現象が起きるようです。

Mac OS X Yosemite
docker-machine version 0.5.6, build 61388e9
VirtualBox 5.0.12 r104815

# 現象
ディレクトリ構成は以下。(カレントディレクトリはルートに設置した任意のディレクトリ)

```
.
└── test
    └── index.html

1 directory, 1 file
```

この test 以下に index.html を置いた状態で test をドキュメントルートとして読み込ませる用に run を実行してみる。

```
docker run -v $(pwd)/test:/var/www/html --rm -it php:5.5.34-apache /bin/bash
```

ls を打ってみると空になってしまう。docker inspect には Mounts が入っているのでマウント自体は正常にできていると思われます。


# 解消方法
パーミッションを 777 に変更しても共有できないので、ファイルを `/Users/[ユーザー名]/` 
以下に設置する。



ルートに貼ったシンボリックリンクということを失念していて、気づくまでに半日以上……