OmniAICreator/Qiita-1.07M huggingface dataset:
[iOS] fastlane+Crashlytics Beta を使ってみる

#やり始める前に...

fastlane自体の導入やFabricの登録はここでは紹介しません。
参考: [[iOS] fastlaneの導入](http://qiita.com/touyu/items/7ea0d2d666716ffb5e96)

#導入
今回使いたいプロジェクトのディレクトリ内に移動する。

fastlaneディレクトリに入る

```ターミナル
$ cd fastlane
```

Fastfileを開く

その中に以下のように記述

``` ruby:Fastfile
desc "Submit a new Beta Build to Apple TestFlight"
  desc "This will also make sure the profile is up to date"
  lane :beta do
    # match(type: "appstore") # more information: https://codesigning.guide
    # increment_build_number
    # increment_version_number
    # ********は適宜自分のに置き換えてください

    cert
    sigh(force: true)

    gym(
      use_legacy_build_api: true,
      workspace: '********.xcworkspace',
      scheme: "********",
      configuration: 'Release'
    )

    crashlytics(
      crashlytics_path: './Crashlytics.framework',
      api_token: '************************************************',
      build_secret: '************************************************',
      ipa_path: './********.ipa',
      groups: '********'
    )

    # sh "your_script.sh"
    # You can also use other beta testing services here (run `fastlane actions`)
  end
```
登壇者女子限定 Milkcocoa Girls ! Milkcocoa Meetup vol10に行ってきたメモ

# イベント概要
http://mlkcca.connpass.com/event/29628/

# Milkcocoaと戯れてみたお話
あおいちゃん氏
@aoioooii
dots.女子部
５月退職予定

jsだけで動いている
githubにコードある

# milkcocoaでウェーイする	
ちゃんとく氏
@tokutoku393
PHPer
dots.女子部
胃を壊すレベルのらーめん好き
毎日格ゲー

使った技術
- mlkcocoa
- CreateJS(紙吹雪）
- HTML5
- heroku


# おひぃボタンをつくる
みほ氏
meuron
バックエンド
ねこ・カピバラさんが好き
ダイエット中なのに🍺を飲んだ

meuronはオンラインでダイエットをサポートしてくれるサービス

GAYA
http://bit.ly/1NjelDj
ボタン押すとガヤを出してくれるｗｗｗ

milkcocoaのデータ保存とリアルタイム通信を利用

milkcocoa以外で詰まった
- 画面作成
- 非同期処理とかコールバック
- KVSに不慣れ
- 同時接続数

# MILKCOCOAでエクスペクトロパトローナム
りほやん氏
dots.女子部
５月退職予定

USJのワンド・マジック

http://ur0.pw/tmHC
スマホふると前の画面でいろいろ起きる

ルーモス＝光を
WolframAlphaで微分方程式を実行してみた

Second Order Differential Equations Using Wolfram Alpha
https://www.youtube.com/watch?v=1fb_WtNQZsc
Wolfram|Alpha: Computational Knowledge Engine
https://www.wolframalpha.com/input/?i=2y''%2B5y'%2B3y%3D0,y(0)%3D3,y'(0)%3D-
2y''+5y'+3y=0,y(0)=3,y'(0)=-4 Enter
solveが無くても結果は同じでした。
Xamarin.FormsとCoreTweetでTwitterクライアントアプリを作ってみる

# Xamarin.FormsとCoreTweetでTwitterクライアントアプリを作ってみる

## CoreTweetがすごい

[「たったこれだけのコードでAndroidからツイートできるってすばらしいXamarinすき」](https://twitter.com/sudosan/status/718594298741006336)
なんていうTweetを見て、マジですかい？
と触発されてつい作ってしまいました。

実際、あれだけのコードでTweetできるし、StreamingAPIで待機待ち発生させるのも1ラインでかけてしまうという怖ろしさ。
すごいです。

## 実際に作ってみた

んで、Xamarin.Formsで実際に作ってみました。
[GitHub](https://github.com/yakumo/NicoNoco)にソースを置いてあります。

uwpで作り始めて、読み書きと見栄えの調整でのべ5時間ほど…。
簡単にできてしまいました。

んで、同じ時間くらいかけてiOSとAndroidで動作確認をするという。
そっちにかかった時間の方が長いくらい。

## またなんで改めてTwitterクライアント？

携帯端末でStreamingAPI対応をがっつり謳っているものがさらっと見た限りではなさそうだったから、というのが理由の一つです。
つまり、自分の端末でStreamingで流れてくるものを見たかったんですね。
でも、そんなネットワークにずっと繋いでいるようなことをすると、通信料とバッテリーをかなり消費しそうですが…。

## ソースの解説

解説ってほどでもないですが。
ポイントポイントで。

### Twitter用の設定について

まず、上記のGitHubのページにも書きましたが、TwitterのConsumer KeyとConsumer Secretは書いてません。

```csharp:NicoNocoApp.Common/SystemSettings.cs
namespace NicoNocoApp.Common
{
    class SystemSettings
    {
        public const string ConsumerKey = "xxx";
        public const string ConsumerSecret = "xxx";
    }
}
```

こんな感じでファイルを作ってください。

### プロジェクトについて

各プラットフォームごとにプロジェクトを作っていますが、入口のみで実際のコードは `NicoNocoApp.Common` にまとまっています。
また、画像は `NicoNoko.Resources` にまとめました。
`NocoNocoApp.Common` はPCL、 `NicoNoco.Resources` は共有プロジェクトです。
他は拡張子でプラットフォームをみてください。

### Twitterに繋がっている部分

StreamingAPIで繋がっている部分は以下になっています。

```csharp:NicoNocoApp.Common/CommonData.cs
if (_StreamingMessage == null)
{
    _StreamingMessage = this.Tokens.Value.Streaming.UserAsObservable().Publish();
    _StreamingMessage.OfType<StatusMessage>().Subscribe(x =>
    {
        Device.BeginInvokeOnMainThread(() =>
        {
            TweetList.Insert(0, x);
        });
    });
}
```

`Publish` で接続オブジェクトを作って、 `OfType` でふるい分けし、 `Subscribe` で監視する、と。（2016/04/21追記 ←間違えています。コメント欄を確認してください）
簡単！すごい！CoreTweet万歳！

見て分かる通り、エラーチェックなどは一切行っていません（笑）
あと、認証時など状態監視にReactivePropertyを使いまくっています。

### 画面など

画面やアプリの動作自体はXamarin.Formsにおんぶに抱っこしてもらってます。
Twitterクライアントくらいの画面ならこれでまんま賄えますね。
んで、XAMLを使わずにコードで画面を作っています。

上でも書きましたが、状態監視にReactivePropertyを、また環境設定の保存用に[Xamarin.Plugins](https://github.com/xamarin/plugins)の中から[Settings](https://github.com/jamesmontemagno/Xamarin.Plugins/tree/master/Settings)を使っています。

## 簡単にアプリが作れます。

Xamarin.FormsとNuGetで使えるライブラリを使えばとっても楽にアプリが作れます。

あなたも使ってみませんか。
IAMポリシーでActionやConditionが重複した場合の扱い


IAMポリシーを作成するにあたってActionやConditionが重複した結果がどのように評価されるか疑問だったので調べたメモ


# Actionの重複

Policyの評価結果が Deny と Allow が混在する場合、Denyが有効となる。

## 参考

* [IAMによるAWS権限管理 – IAMポリシーの記述と評価論理 ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/iam-policy-evaluation-logic/)
* [IAM ポリシーの評価論理 - AWS Identity and Access Management](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)

# Conditionが重複した場合

以下のような条件が設定されている場合、 "条件演算子1"と"条件演算子2"のブロック同士は「and」で評価、同じ条件演算子の中のキー同士（例では"キー1"と"キー2"）は「or」で評価となる。

```
"Condition" : {
  "条件演算子1": {
    "キー1": "値1",
    "キー2": "値2"
  },
  "条件演算子2": {
    "キー3": "値3"
  }
}
```

## 参考

* [IAM ポリシーエレメントの参照 - AWS Identity and Access Management](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements.html#Condition)
Windows10に乗り換えてやったこと


PC乗り換えたのでいろいろやりました。
まだ何か見つけたら随時更新予定です

# 移行後の環境
Windows 10 Home
Officeなし
メモリ 4GB
HDD 500GB
CPU AMD A4-7300 APU(3.80GHz)

低スペックマシンなのでどこまでできるかちょっと不安ｗ

# 乗り換え前の準備
* ThunderbirdのProfile保存
* FirefoxのProfile保存
* FileZillaの設定エクスポート
* Notepad++
* その他ローカルに保存してたファイルの保存

メールの保存は死活問題なので慎重を期してサーバにも自分のOneDriveにも保存。
Chromeみたいにサーバに設定保存してくれることがどんなにありがたいことかわかりましたｗ


# 乗り換え後
## インストールしたアプリ
* Chrome(速攻インストールしてLastPassにログインｗ) 
* Thunderbird
* Firefox
* Firefox Developer Edition
* FileZilla
* Sublime Text3
* Notepad++(そのまま使うつもりで保存してたけど新しいverが出てたので改めてインストール)
* RLogin(PuTTYは引退させました(/・ω・)/)
* Git for Windows
* TortoiseGit
* WiseCare365 Free
* Acrobat Reader DC(入れないとPDFをEdgeで開かれてめっちゃ見づらいです) 
* プリンタドライバ
* MacType
* Kobito
* Googleドライブ

## 設定等手を加えたところ
* Thunderbird,FirefoxのProfile読み込み
* MacTypeでシステムフォントを変更
* スタートメニュークリックしたときに出てくるエンタメ系パネルを全部消した
* コンパネ・設定・既定のプログラム・PC・ファイル名を指定して実行あたりのタイルをスタートメニューにピン留め(全アプリから探すのめんどい(;´･ω･))
* FileZilla，Thunderbird,Firefox,Chrome,Sublime,Notepad++,Kobitoをタスクバーにピン留め
* Sublimeはやたら無駄Packageが入っているので(主にテーマとかカラースキーマw)、過去の自分の記事[SublimeText3の設定色々](http://qiita.com/ao_love/items/c8fc7a794ec027e3677e)を見直しつつ精査しながら入れていってます。
CircleCIだけでリポジトリをGithubからBitBucketに同期してみる


普段Githubを使っているがたまにメンテなので、とりあえずのざっくりミラーをBitBucketに作るというタスクをCircieCIのDeploymentにやらせてみた。なんともスクリプトがカオスに。

他に直接デプロイしないという前提で、とりあえず`circle.yml`。

```yaml:circle.yml
deployment:
  all_branches:
    branch: /.*/
    commands:
      - ci/99_sync_bitbucket.sh
  all_tags:
    tag: /.*/
    commands:
      - ci/99_sync_bitbucket.sh
```



## BitBucket側準備

- org/name が同じリポジトリを用意する
- 同期専用のユーザをひとつ用意する
    - ssh_keyにCircleCIのデプロイキーから作った公開鍵をセット
    - リポジトリにはこのユーザを対象にwrite権限を付ける

CircleCIはGithubのリポジトリが公開/非公開にかかわらずGithubにDeployキー(プロジェクト単位のR/Oキー)を登録する。プロジェクト単位でユニークかつ、どうせオーナーにしかわからないので、使い回しました。



## 同期用スクリプト

Gitリポジトリ同期でありがちな次の2点になんとか対応しようと思った。

- force push
- tagの削除、または同名で別Commitへの付け替え

なのでBitBucket側での歴史の一貫性などは無視するということで書いたスクリプトが次。


```shell:99_sync_bitbucket.sh
if [ "${CI}" == "true" ]; then

set -e

cat << EOL >> ~/.ssh/config

Host bitbucket.org
IdentitiesOnly yes
IdentityFile /home/ubuntu/.ssh/id_circleci_github
EOL

if ! git remote | grep -q bitbucket ; then
  git remote add bitbucket `git remote get-url origin | sed 's/github.com/bitbucket.org/'`
fi
git fetch origin --prune
for tag in `git tag` ; do git tag -d $tag ; done
git fetch origin --tags --prune
for branch in `git branch -a | grep remotes/origin | grep -v HEAD | grep -v master` ; do
  git branch --track ${branch#remotes/origin/} $branch || true
done
git push bitbucket --mirror --prune --follow-tags
git push bitbucket --mirror --prune --follow-tags

fi
```

フェッチプルーンフェッチプルーン。継ぎ足しで適当に確認しながら作ったのでどれか無駄かもしれない。

CircleCIは基本的にgitリポジトリをキャッシュするので、tagやらremoteの情報を保持していたり、ブランチによってはしていなかったりする。タグは結局pruneで追えないっぽいので、一回ローカルのを破棄することで対応。

最後のpushは1回めでBitBucket側がさっぱり消えて、2回目でブランチ同期、という挙動になった。これ全く個別のディレクトリで作業するほうがマシかも。


`--mirror`の使い方として合っているのか多少気がかりだが、ブランチ、タグ等々これで追えたようなので、ゆるいミラーとしては一旦これでよし。ただリポジトリのサイズが大きいと時間がかかりそうな気もする。

ブランチ/タグを削除するだけ、というイベントではCIが動かない(tag pushはOK)とか、Deploymentでやるとテストがこけたら(テストがある場合)同期しない点に注意と。
Linuxのすすめ～初期構築～

# Linux始めてみませんか？
## Linuxを使用するにあたって

XPのサポート終了が話題になり早くも1年以上が経過．
新しくWindows 10を購入したりする人もいる中，最近注目を浴びているのがLinux．
日経ソフトウェアにも毎月のようにUbuntuに関する記事が掲載されてます．

そこで今回はLinuxを始めるにあたり，自身が構築した環境をメモとして残しておきます．

## なぜLinuxか

Linuxを選ぶ理由としては個々人で理由が違うと思います．
「Macでどんどんコード書きたいんだけど高すぎる！似たような環境が欲しい！」とか．僕のことなんですけどね．

情報系の学生さんであれば，最近は大学でもWindowsがほとんどですが，CLIに慣れておいて損はないです．Linuxを通して計算機アーキテクチャの仕組みを理解してるとカッコよくないですか？

## ハードウェア/ソフトウェア構成
VAIO　VGN Gシリーズ(2011年モデル)

- CPU : Core2 Duo 1.6GHz
- RAM : 8GB
- GPU : オンボード
- SSD : Intel製 128GB

OSはUbuntu18.04入れてます

こんな環境でも快適に動きます．ブラウジング，メール，Office（OpenOfficeですが）も気にならない程度です．ただGUIシステム（GNOME，KDEとか）によって描画処理重くなったりします．

## プログラミング環境

- C，C++
    - gcc，g++　→　AtCoderなど競技プログラミングで使用
- Java
    - 現在version 10使ってます
- Python
    - version 3.6
    - NumPyやMatpolotLib
- Octave
    - 数値計算するときに結構便利です．ただ最近ではMATLAB on Windowsに実権を握られてる（主に僕の周りで）
- OpenCV　→　画像処理系の実装をするとき
    - 主にC++で書いてます

今後はRuby，R，JavaScript，Julia，FORTRANにも挑戦したいと思ってます．
GPU積んでればChainer，Tensorflow，PyTorchとか使うんですが...
今はエラスティックコンピューティングの時代なのでAWSを使って我慢します...泣

## 処理スピードは？

結論から言うと普通くらいです．事務作業ならヤ〇ダ電気とかで売ってる家庭向けPCくらい．
ただ機械学習のコード書いて，学習させるとなると遅い．最近のPCはCore iシリーズなので僕のよりもう少し速いはず（そんなPCには，そもそもLinuxを入れない）．
JSON形式で音色を指定できるWeb Audio APIのライブラリを作った

#Manipulator

勉強も兼ねてJSON形式で音色を指定できるWeb Audio APIのライブラリを作ってみました。

- GitHubリポジトリ
  - [https://github.com/taro0628/manipulator](https://github.com/taro0628/manipulator) 

- デモページ
  - [デモページ](http://taro0628.github.io/manipulator/docs/)

## 特徴

- JSON形式で音色を指定できる
- Web Audio APIを知らなくても一般的なシンセサイザーの知識があれば使える
- Web Audio APIの知識があれば簡単に新しいフィルタやエフェクトを追加できる

## 使い方
以下のようなJSONを用意します。

```js
var toneRecipe = {
    name: 'VCA',
    gain: 0.9,
    input: {
        name: 'Env',
        param:{
            gain: 1,
            attack: 0,
            decay: 0.1,
            sustain: 0.5,
            release: 0.1,
        },
        input: {
            name: 'VCF',
            param: {
                frequency: 400,
                type: 'bandpass',
                Q: 8,
                gain: 1
            },
            input: {
                name: 'VCO',
                param: {
                    frequency: 'cv',
                    type: 'triangle'
                }
            }
        }
    }
};
```

用意したJSONを指定し、Manipulatiorオブジェクトを作成します。
音はnoteOnメソッドでならします。
詳しくはGitHubリポジトリをみてください。

```js
var tone = new Manipulator(ctx, toneRecipe);
//数字で音高を設定
//12はド
tone.noteOn(12);
```
[Groovy]Java8のOptionalをGroovyから利用する。

# 概要

GroovyはJavaなので、当然Java8から導入されたOptionalを利用できます。
Java8の新機能をあまり勉強していなかったので、今回OptionalをGroovyから使って勉強してみました。
結論から言うと、GroovyからJava8のOptionalとかStreamを使う旨味はあまりないかな、という感じです。
また、恐らくシンタックスの絡みだと思うのですが、Groovyからでは利用できない組み合わせなどもあるようです。

また、まだちゃんとJava8のOptionalを勉強したわけではないので、もっと効率的な書き方などあるとは思います。
もし何かあればコメントで教えていてだけると嬉しいです。

メモ：**Optionalインスタンスは、要素が0個か1個しか無いサイズが固定されたコレクションだと考えると理解しやすい。**

# 基本
```groovy
// Optionalインスタンスを生成
Optional<String> hogeOpt = Optional.ofNullable("a")

// 値の取り出し方法
assert "aaa" == Optional.ofNullable("aaa").orElse("bbb")
assert "bbb" == Optional.ofNullable(null).orElse("bbb")
assert "bbb" == Optional.ofNullable(null).orElseGet({-> "bbb"})

// Optionalがnullじゃない場合にのみ処理をする
hogeOpt.ifPresent{hoge-> println hoge.length()}

//Optionalがnullじゃない場合に処理を実行して結果を返す（結果は自動的にOptional型にラップされる）
Optional<Integer> lengthOpt = hogeOpt.map{hoge -> hoge.length()}
println lengthOpt

// mapを使うと、Optionalに格納されている値が変化する。Optionalに格納されている値が、ある条件を満たしている場合にそのOptional自体がそのまま欲しい場合はfilterを利用する。
// 通常なら if(obj.length()>10)みたいな処理がifの条件に入るが、objがNullな場合がある。そのような場合にfilterを利用する。
// なお、条件に合致しない場合は戻り値はOptional.empty()になる
assert Optional.empty() == Optional.ofNullable(null).filter{it.length() > 2}
assert Optional.empty() == Optional.ofNullable("ab").filter{it.length() > 2}
assert Optional.empty() != Optional.ofNullable("abc").filter{it.length() > 2}
assert Optional.ofNullable("abc") == Optional.ofNullable("abc").filter{it.length() > 2} // mapと違い、戻り値は同じになることが解る。

// 具体的には以下のような使い方になるのでは？
// 成人かどうかを判断する。DBからユーザオブジェクトを取得、そのageプロパティはnullになる可能性がある。
def userObject = [age:null, "name":"koji"]
Optional<Integer> age = Optional.ofNullable(userObject.age)
if (age.filter({it >= 20}) != Optional.empty()) {
    println "adult!"
} else {
    println "child or null!"
}



// Scalaのcaseのように簡潔ではないけど、以下のようにemptyがそれ以外で処理を切り分けることも出来る。

switch(lengthOpt) {
    case Optional.empty():
        println "ng"
        break
    case Optional:
        println "ok"
        break        
}

```

# もっと具体的なサンプル

```groovy
// 偶数だけ抽出して、さらにそれぞれの値を2倍して、その合計を求める。また、数字はStringとして格納されている。
// リストの扱いはGroovyのメソッドを利用した。
assert ["10", "-1", "2", "3", "-3", null, "-10", "2"].collect {
    Optional.ofNullable(it) // Optionalに包む
}.collect { // 変換
    it.map {it.toInteger()} // StringからIntegerに変換。nullがあるのにNullPointerExceptionが発生しない！
}.collect { // 変換と抽出
    it.filter{ it % 2 == 0 && it > 0}
}.collect {
    it.map{it*2}
}.collect{
    it.orElse(0)
}.sum() == 28

// 同じ条件で、Java8のStreamを使ってみる
// ただし、Groovyからだとシンタックスの問題でreduceが使えないっぽい
assert ["10", "-1", "2", "3", "-3", null, "-10", "2"].stream().map {
    Optional.ofNullable(it) // Optionalに包む
}.map { // 変換
    it.map {it.toInteger()} // StringからIntegerに変換。nullがあるのにNullPointerExceptionが発生しない！
}.filter { // 変換と抽出。Optional.empty()なインスタンスも個時点で除外される
    it.filter{ it % 2 == 0 && it > 0}.isPresent()
}.map {
    it.map{it*2}
}.collect {
    it.orElse(0)
}.sum() == 28

// 同じ条件を普段の自分がGroovyで書いているスタイルで。
["10", "-1", "2", "3", "-3", null, "-10", "2"].collect {
    it?.toInteger()
}.findAll {
    (it?:0) % 2 == 0 && it > 0
}.collect {
    it * 2
}.sum()
```
twitterへyoutubeの急上昇タイトルを投稿する with python3

```lang:tweet.py
#-- coding: utf-8 --
 
# 必要になるライブラリ
import urllib.request as request
from bs4 import BeautifulSoup
from requests_oauthlib import OAuth1Session
 
# twitterの各種キーをセット(キーは自分で取得してください)
CK = ‘Consumer Key’
CS = ‘Consumer Secret’
AT = ‘Access Token’
AS = ‘Access Token Secret’
 
# ツイート投稿用のURL
url = “https://api.twitter.com/1.1/statuses/update.json”
 
# OAuth認証
twitter = OAuth1Session(CK, CS, AT, AS)
 
# youtubeの急上昇サイトへアクセス
response = request.urlopen(‘https://www.youtube.com/feed/trending’)
body = response.read()
 
# HTML をパースする
soup = BeautifulSoup(body, “lxml”)
 
# 急上昇サイトのclass属性を指定してスクレイピング
msg = soup.find_all(class_=’yt-uix-sessionlink yt-uix-tile-link yt-ui-ellipsis yt-ui-ellipsis-2 spf-link ‘)
 
status = “youtube 注目動画\n”
 
# 急上昇サイトの上から3つの動画タイトルをstatus変数へ代入
for i in range(0,3):
    status += ‘・’ + msg[i]['title'] + ‘\n’
 
# ツイート本文
params = {“status”: status}
 
# twitterに投稿
req = twitter.post(url, params = params)
 
# コンソールへも出力
print (status)
```
PHPとMySQLのソートが一致しなくて禿げた

こんにちは。はじめまして。tarokamiakzeです。
PHPのsort系関数の結果と、MySQL のorder by指定を比較する機会がありまして。
記号の扱いが一致しなくて泣きたくなりました。
(PHPUnitで、検索系APIが本当にソートされているか検証したかっただけなのに...)

ので、怒りに任せて記事を書きます。**LAMP環境とはなんだったのか!!**

# 再現方法
## MySQL編

```mysql
# MySQL
CREATE TABLE `sort_test` (
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `sort_test`(`name`) VALUES ("0"),("1"),("a"),("_");

SELECT `name` as `MySQL_SORT` FROM `sort_test` ORDER BY `name` ASC;
```

## PHP編

```php
<?php

$arr = ["0","1","a","_"];
// 通常のソート.
sort($arr);
var_dump($arr);

// sort_flag を指定。この例だと、何を指定しても同じだった
sort($arr,SORT_STRING); // see http://php.net/manual/ja/function.sort.php
var_dump($arr);

// "自然順"アルゴリズムで配列をソート
natsort($arr);
var_dump($arr);
```

# 結果

| MySQL_SORT | PHP_SORT |
|:----------:|:---------:|
| 0       |        "0" |
| 1     |      "1" |
| **"a"**       |        **"_"** |
| **"_"**       |        **"a"** |

**"_" と "a" が逆になってますがな!!!**

# 解決方法

MySQLデフォルトのutf8_general_ciだと、どーーーしても一致しないらしい。
ためしにutf8_binに変えてみたら、順番が合った。が、そんなの使いたくない。
よって[SELECT時だけCOLLATEを変える](http://d.hatena.ne.jp/end0tknr/20100613/1276427626)。

```mysql
SELECT `name` as `MySQL_SORT` FROM `sort_test` ORDER BY `name` COLLATE utf8_bin ASC;
```

| MySQL_SORT | PHP_SORT |
|:----------:|:---------:|
| 0       |        "0" |
| 1     |      "1" |
| **"_"**       |        **"_"** |
|   **"a"**     |        **"a"** |

でも、他に弊害がある気がしてならない。
php側であわせたほうがよさそう。

```php
// see http://stackoverflow.com/questions/21416765/php-sort-filenames-with-an-underscore
function cmp($a, $b) {
  $aTemp = str_replace('_', '0', $a);
  $bTemp = str_replace('_', '0', $b);     
  return strcmp($aTemp,$bTemp);
}

 usort($arr, "cmp");
```

でも、きっと他の記号もなんかあるんだろうなぁ。辛い。
UITabBarControllerでの遷移先のStoryboardを分割する方法

IOSのアプリ開発を行う際にStoryboardを使用する方も多いかと思います。
ただ、1つのStoryboardに全ての遷移を入れてしまうと、Storyboardが肥大化してしまいます。
大きすぎるStoryboardを読み込むと最悪XCodeが落ちてしまってどうにもならない、
という事も起きてしまうそうです。

そこで大事になるのがStoryboardを分割する事なのですが、
分割方法に関しては調べれば大量に出てくるのでここでは割愛します。

今回自分がぶつかったのはStoryboard分割してかつ、それをUITabBarController
で使用する事です。
その方法を自分への備忘録も含めまとめます。
~~UITabBarControllerでの分割方法も調べれば結構出てきますが~~


# 1.UITabBarControllerの配置

はじめにUITabBarControllerを配置します
ツールバーで検索すれば出てくるので適当に配置すれば大丈夫です。
初期状態だとこんな感じになるかと思います。

<img width="930" alt="スクリーンショット 2016-04-19 17.23.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/6955/591a9ce8-e027-26fe-fe11-a2a603385794.png">


Storyboardを分割しないのであればここに遷移をつないでいけばいいのですが、
今回は分割する事が目的なので、コードを書いていきます。

# 2.UITabBarControllerのコードを書く

UITabBarControllerにつけるコードを書いていきます。
今回自分が実装したのは、
タブを押した際のViewcontollerを差し替える形になります。
コードは以下の通りです。

```objc:SplitStoryBoardTabController.h
#import <UIKit/UIKit.h>

@interface SplitStoryBoardTabController : UITabBarController

@end

```

```objc:SplitStoryBoardTabController.m
#import <UIKit/UIKit.h>



#import "SplitStoryBoardTabController.h"



@implementation SplitStoryBoardTabController

- (void)viewDidLoad {
    [super viewDidLoad];
	
	NSMutableArray* viewControllers = [self.viewControllers mutableCopy];
	NSUInteger size = viewControllers.count;
	for( NSUInteger i=0; i<size; ++i )
	{
		UIViewController* viewController = viewControllers[i];
		
		@try {
			 
			UIStoryboard *storyboard = [UIStoryboard storyboardWithName:viewController.title bundle:nil];
			
			// ここで表示したい ViewController を指定する
			UIViewController* setViewController;
			setViewController = [storyboard instantiateInitialViewController];
			viewControllers[i] = setViewController;
		}
		@catch (NSException *exception) {
			NSLog(@"Err : %@", exception.name);
		}
		
	
	}
	self.viewControllers = viewControllers;
	
}

@end

```

UITabBarControllerはタブを押した際の遷移先をviewControllersという
プロパティに保持しています。
これを差し替えることによって遷移先を分割したStoryboardのViewControllerへの
遷移を実現します。

また、Storyboardのファイル名はタブコントローラについているViewControllerの
Titleから取得するようにしてみました。

このクラスを先ほど設置したUITabBarControllerに設定します。

# ３.Storyboardのタイトルを設定

最後にViewControllerのTitleを設定して読み込む
Storyboardを指定します。

<img width="714" alt="スクリーンショット 2016-04-19 18.16.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/6955/2aa8eff5-8e88-e811-36d9-761e67a4cc8d.png">

こんな感じで設定してあげると、タブの遷移先が指定のStoryboardのIs Initialが付いている
ViewContorllerになります。


以上となります。
PHPでクラスと関数を使う方法

PHPで同じ処理や似ている処理を行うために手作業でやる方法もありますが、
クラスを作っておいて関数を定義すれば簡単に処理を行うことができます。

```
<?php
class ClassName {
  //この中に関数を定義します。

  public(又はprivate) function methodName($parameterName) {
    //処理を書きます。
  }
}

//クラスの外では作ったクラスをインスタンス化します。
$className = new ClassName();

//使う方法は次と同じです。
$className->methodName($parameterName);
```

簡単に演算する関数を作ってみます。

```fimename:例
<?php
class CalcClass {
  //この中に関数を定義します。

  public function calc($col1, $col2, $mode) {
    switch ($mode) {
      case "plus":
        $result = $col1 + $col2;
      break;
      case "minus":
        $result = $col1 - $col2;
      break;
    }

    return $result;
  }
}

//クラスの外では作ったクラスをインスタンス化します。
$c = new CalcClass();

//使う方法は次と同じです。
$plusResult = $c->calc(1, 2, "plus");
$minusResult = $c->calc(10, 5, "plus");

echo $plusResult; //3
echo $minusResult; //5
```

理解できたでしょうか？
パケットキャプチャが大きくなりすぎる時の対処法

キャプチャをフィルタリングして取得する
```
tshark -w capture.pcap -f 'port 80'
```

キャプチャを開かずにフィルタリングして取り出す(aaa.capが肥大化したキャプチャ、test.pcapが吐き出し先 windowsで実行した場合）

```
"C:/Program Files/Wireshark/tshark" 
-r aaa.cap -R http -w test.pcap
```

Tsharkオプション一覧

|tshark option | mean|
|:--:|:--|
|-w [File]| 出力ファイルを指定|
|-d tcp.port=111,http|portとプロトコルを紐付（tcp 111portをhttpにする)|
|-r [inFile]| 読み込ませるファイルを指定(-Rオプションでフィルタリング可能）|
|-f [capture filter]| -f 'port 111' port 111のパケットをキャプチャする|
php and と &&、 or と ||の違いについて、バグの原因にもなりやすい

素晴らしい説明はここ：
http://tobysoft.net/wiki/index.php?PHP%2Fand%A4%C8%A1%F5%A1%F5%A4%CA%A4%C9%C8%E6%B3%D3%B1%E9%BB%BB%BB%D2%A4%CE%B0%E3%A4%A4
alpine:edge でnginx1.9.14 の docker imageをつくる

# TL;DR
- alpinelinuxのedge branchで nginx 1.9.14の docker imageをbuildする

# Dockerfile

```
FROM alpine:edge

MAINTAINER Takumi Kanzaki

RUN apk upgrade
RUN apk add --no-cache --virtual .nginx-builddeps \
    ca-certificates \
    nginx=1.9.14-r0

# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log
RUN ln -sf /dev/stderr /var/log/nginx/error.log

# nginx.conf
COPY nginx.conf /etc/nginx/nginx.conf

VOLUME ["/var/cache/nginx"]

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]

```

# docker build

```
docker build -t nginx:1.9.14-alpine-edge --no-cache .
```

# version/configure option 確認

> -> % docker run nginx:1.9.14-apline-edge nginx -V
nginx version: nginx/1.9.14
built with OpenSSL 1.0.2g  1 Mar 2016
TLS SNI support enabled
configure arguments: --prefix=/var/lib/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/run/nginx/nginx.pid --lock-path=/run/nginx/nginx.lock --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --user=nginx --group=nginx --with-ipv6 --with-file-aio --with-pcre-jit --with-http_dav_module --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_v2_module --with-http_auth_request_module --with-mail --with-mail_ssl_module


# image size
- alpine:3.3 の nginx1.8.1との比較

```
-> % docker images | grep nginx
nginx     1.9.14-apline-simple              18c6b823fe55        3 minutes ago       6.746 MB
nginx     1.8.1-apline-simple               7c3832639116        5 hours ago         7.393 MB
【メモ】SassバージョンアップしたらCompassでwarningが出る

# はじめに
こんにちは。

会社で利用している自身に割り当てられたパソコンを今回変えることになり、
ようやくデータ移行が終わりました。

息抜きがてらメモしときます。

# 遭遇

移行の際、Sassとか最新でもええやん！（現行3.4.22、前は3.4.16）と思って
バージョンアップしたらコンパイルするたびwarningを吐くCompassさんに遭遇。

# どんなエラーか

```
DEPRECATION WARNING on line 87 of %RUBY_DIR%/lib/ruby/gems/2.3.0/gems/compass-core-1.0.3/stylesheets/compass/css3/_deprecated-support.scss: #{} interpolation near operators will be simplified
in a future version of Sass. To preserve the current behavior, use quotes:

  unquote('"$moz-"#{$experimental-support-for-mozilla} "$webkit-"#{$experimental-support-for-webkit} "$opera-"#{$experimental-support-for-opera} "$microsoft-"#{$experimental-support-for-microsoft} "$khtml-"#{$experimental-support-for-khtml}')

You can use the sass-convert command to automatically fix most cases.
```

みたいなのがつらつらと。
Compassの stylesheets/compass/css3/_deprecated-support.scss の #{} の書き方が気に食わない、っていうのだけフィーリングで伝わってきます。

（あ。Windows7 64bitな環境です…）

# 解決

頑張って調べると overstackflow に答えが。

http://stackoverflow.com/questions/35949660/compass-sass-deprecation-warning

```scss
#{'$hoge'}foo-bar    // 気に入らない
'#{"$hoge"}foo-bar'  // こう書いて 
```

みたいな…。
とりあえず上記のように該当箇所を修正すると出なくなった！


# 終わりに

調べていたらダウングレードの例もありましたが、やっぱ不具合修正されているなら…。
と思ったので、ダウングレードしたくない方に届けば幸いです。


# 蛇足

Sass 3.4.22の[リリースノート](http://sass-lang.com/documentation/file.SASS_CHANGELOG.html)にCSS variablesって文字がリンクになってたので、
気になって飛んでみました。

CSS Variables
https://www.w3.org/TR/css-variables/

```css
:root {
  --black: #000000;
}
a {
  color: var(--black);
}
```

変数定義というか、カスタムプロパティって表現になってますけど。
デフォルトで使えると、楽になるのかなあ…。
RUBY

##Data typeの種類

大きく3つあります。
■ 数字(number)：0~9, integerとfloat等に細分化できます。
■ 文字列(string)：数字、又は文字列を("), (')の中に入れて文字列として扱うことができます。
■ ブーリアン(boolean)：trueとfalse

##出力
文字列等の出力は「puts」を使います。

```lang:ruby
> puts "Hello world"
```

##関数
関数定義には「def」を使います。

```lang:ruby
> def test
> puts "Hello world"
> end
```

そしてその関数を呼びたいときは関数名を使います。

```lang:ruby
> test
```

##パラメータ
関数にパラメータも使うことができます。

```lang:ruby
> def test(name="para")
> puts "Hello #{name}"
> end
```

結果として「test」だけだと「Hello para」
「test "world"」みたいに入れると「Hello world」が出力します。
Angular# serviceとfactoryの違い


Angular2.0の足音がだんだん聞こえてくるけど、1.x系でserviceとfactoryの違いにハマったのでメモ


||factory|service|
|:---:|---|---|
|何を定義？|**値**を返す関数を定義<br><br>値にはオブジェクトも含む|**関数**を定義<br><br>オブジェクトのコンストラクタを定義とも言える|
|何までOK？|値は数値、文字列、<br>オブジェクト、関数...なんでもOK|関数以外は不可|
|引数依存は？  <sub>[DIのこと](#1)</sub> |可能|可能|
|どういう時に使う？|文字列や数値を返したい<br>・他Angular moduleとインスタンスを共有したい|便利メソッドを集めたい・初期化処理が欲しい・class(typeScript/ES6)を使いたい|

<a name="1">1.DIのこと</a> `$dependencyName`と引数名書くと、そのServiceとかをAngularが自動で入れてくれる依存性解決のやつ



## コード(実例)を見る

以下はぶっちゃけ同じ

```javascript:serviceAndFactory.js

// 独自オブジェクトのコンストラクタを定義（実際は無名関数が多い）
var myObjConstructor = function(){
  this.Hello = function(){ console.log("Hello!"); }
  this.Do = function(task){ console.log(task + "is done!"); }

  //prototypeで拡張した関数を呼ぶ
  this.ProtoMethod();
}

//prototypeで拡張
myObjConstructor.prototype.ProtoMethod = function(){
  console.log("Prototype Method");
  return 42; //人生、宇宙、すべての答えである数字
}

//使うとき（angular関係ない一般例）
var myObj = new myObjConstructor();



// ----------

var myModule = angular.module("myModule", []);

// サービスを定義。コンストラクタの関数を呼ぶ。自動で new myConstructor() される
myModule.service("myService", myObjConstructor);

// ファクトリーを定義。 new myConstructor() は自分でやる
myModule.factory("myFactory_1",
  function(){ 
     return new myObjConstructor();
  }
);

// ファクトリーは、他でnewしたインスタンスを渡してもOK
var myInstance = new myObjConstructor();
myModule.factory("myFactory_2", function(){ return myInstance; });

```

どれも、controllerとかでDIツール経由で入ってくるものは同じように使える。

```javascript:使用例
myModule
.controller('myCtrl', function(myService, myFactory_1){
  if(myService.ProtoMethod() == myFactory_1.ProtoMethod()){
    console.log("Wow! 42!"); //必ずここを通るはず
  }
});
```


## serviceとfactoryを間違えた場合

なんか動かないな？？？というとき…
`TypeError: this.ProtoMethod is not a function` とか
 `Error: [$injector:undef] Provider 'myService' must return a value from $get factory method.` 
とか言われていたら、おそらく factoryとserviceを間違えています。


```javascript:ダメな例
myModule.factory("myService", myObjConstructor); // factoryに値を返さない関数を渡している 
```


```javascript:とりあえず動く例
myModule.factory("myService", function(){ return new myObjConstructor() }); // 良いが冗長。
```

```javascript:より良い例
myModule.service("myService", myObjConstructor); //"とりあえず動く例"でやっていた `return new...`部をAngularに任せている
```


## service と factory 同じじゃね？　　<sub>文字数少ないぶんserviceがよくね？？</sub>

前述の例ではそうだけど、 **オブジェクト(コンストラクタ関数)以外でも登録できる** のがメリットのときもある…かも。

```javascript:factoryでしか出来ないこと

myModule
.factory('httpPromise', function($http){
  // Promise を直接返すとか
  return $http().jsonp("http://jsonplaceholder.typicode.com/posts/1")
})
.factory('myValue', function(){
  // 非常に複雑な計算が必要だけど、1度計算したら使いまわしてOKな値とか…
  // 省略: 複雑な計算
  return 42;
})
.factory('myFunc', function(){
  // オブジェクトでなく関数を渡す
  return function(name){ console.log("hello, " + name); };
})
.controller('myCtrl2', function(httpPromise, myValue, myFunc){
  // Promiseを受け取って通信完了したら処理
  httpPromise.success(function(data){ console.log(data); }) 
  
  //複雑な計算結果だけ受け取る
  console.log(myValue);

  //関数を使う（valueレシピでもいいのでは）
  myFunc("Taro");
})
```
SpringBootでリリースモジュールのGit情報を表示する


# 概要

* SpingBootでリリースしたWEBアプリのバージョンを表示させる
    * Gitの情報を表示するEndpointを作成する
* EndpointはSpringBootのActuatorを使い、`http://host名/info`にアクセスすることでjsonで取得できるようにする
* Gradleで実施

# 手順

## build.gradleを設定

* build.gradleに`gradle-git-properties`を設定
* build.gradleにSpring Actuatorを設定

```groovy:build.gradle（抜粋）

buildscript {
    repositories {
      mavenCentral()
      maven {
        url "https://plugins.gradle.org/m2/"
      }
    }
    dependencies {
      classpath "gradle.plugin.com.gorylenko.gradle-git-properties:gradle-git-properties:1.4.16"
    }

}

apply plugin: 'com.gorylenko.gradle-git-properties'

...

dependencies {

...

    compile "org.springframework.boot:spring-boot-starter-actuator"

...

}

```

## gradleでビルド

```bash
gradle build
```

* ビルド時に自動的にgit-propertiesを作成するtaskが実行される


## 確認

* ビルドでできたjarを実行しブラウザからアクセス
* `http://localhost:8080/info`のように`/info`から取得できる


* 実行結果イメージ
![image](https://qiita-image-store.s3.amazonaws.com/0/60056/49282c70-7b09-511a-596e-bb649540ffd4.png)
sbt flywayを途中のバージョンから的な


稼働済みのシステムにsbt flywayを設定した

- V1__xxx
- V2__xxx
- V3__xxx
- V4__yyy

単体テスト用のDBはV3まではすでに手動で反映されてしまっているのでV4から始めたいなと思った的メモ。
オプション設定したらできた。


### Baseとなるバージョンを設定
```
$ sbt

> set flywayBaselineVersion := "3"
[info] Defining wm_uzo_delivery_db/*:flywayBaselineVersion
[info] The new value will be used by wm_uzo_delivery_db/*:flywayConfigBase
[info] Reapplying settings...
[info] Set current project to wm_uzo_delivery_db (in build file:/Users/tsuruta/dev/apps/wm_uzo_delivery_root/)

> flywayBaseline
[info] Database: jdbc:mysql://uzodev.c6rmv5vr4ch9.ap-northeast-1.rds.amazonaws.com:3306/uzo (MySQL 5.6)
[info] Creating Metadata table: `uzo`.`schema_version`
[info] Successfully baselined schema with version: 3
[success] Total time: 2 s, completed 2016/04/19 16:55:18

```

### V3がベースになった
```
> flywayInfo
[info] Database: jdbc:mysql://localhost:3306/uzo (MySQL 5.7)
[info] +---------+-----------------------+---------------------+---------+
[info] | Version | Description           | Installed on        | State   |
[info] +---------+-----------------------+---------------------+---------+
[info] | 1       | first create          |                     | <Baseln |
[info] | 2       | insert first data     |                     | <Baseln |
[info] | 3       | << Flyway Baseline >> | 2016-04-19 16:52:28 | Success |
[info] | 4       | page impression       |                     | Pending |
[info] +---------+-----------------------+---------------------+---------+

```

### V4も実行
```
> flywayMigrate
[info] Database: jdbc:mysql://uzodev.c6rmv5vr4ch9.ap-northeast-1.rds.amazonaws.com:3306/uzo (MySQL 5.6)
[info] Successfully validated 4 migrations (execution time 00:00.052s)
[info] Current version of schema `uzo`: 3
[info] Migrating schema `uzo` to version 4 - page impression
[info] Successfully applied 1 migration to schema `uzo` (execution time 00:00.910s).
[success] Total time: 1 s, completed 2016/04/19 16:55:22

> flywayInfo
[info] Database: jdbc:mysql://uzodev.c6rmv5vr4ch9.ap-northeast-1.rds.amazonaws.com:3306/uzo (MySQL 5.6)
[info] +---------+-----------------------+---------------------+---------+
[info] | Version | Description           | Installed on        | State   |
[info] +---------+-----------------------+---------------------+---------+
[info] | 1       | first create          |                     | <Baseln |
[info] | 2       | insert first data     |                     | <Baseln |
[info] | 3       | << Flyway Baseline >> | 2016-04-19 07:55:17 | Success |
[info] | 4       | page impression       | 2016-04-19 07:55:22 | Success |
[info] +---------+-----------------------+---------------------+---------+
[success] Total time: 0 s, completed 2016/04/19 16:55:27
```

めでたい
複数の画像読み込み後の処理を Deferred で

元ネタはこちら。

[[ajax/pjax]複数枚の画像読み込み後に処理を実行する](http://qiita.com/okmttdhr/items/50eb88879d03414b41e7)

これ、Deferredでやってみたら？ と思って書き直してみました。
やってることは同じ。

```js
var startOnLoadImage = function　($target){
  var d = new $.Deferred();
  var targets = [];
  var loaded = 0;
  $target.each(function(i, elm) {
    targets[i] = new Image();
    targets[i].src = elm.src;
  });
  $.each(targets, function(){
    $(this).on('load', function(){
      loaded++;
      if (loaded == targets.length){
        d.resolve();
      }
    });
  });
  return d.promise();
};
```

こんな風に使う。

```js
$img = $('#sakiNiYonde .image');
startOnLoadImage($img).done(function(){
  // 処理
});
```

# 追記

よく考えたら（考えなくても）2回each回す必要なくね？

```js
var startOnLoadImage = function($target) {
  var d = new $.Deferred();
  var loaded = 0;
  var max = $target.length;
  $target.each(function() {
    var targetObj = new Image();
    $(targetObj).on('load', function(){
      loaded++;
      if (loaded == max){
        d.resolve();
      }
    });
    targetObj.src = this.src;
  });
  return d.promise();
};
```

こんな感じです。 https://jsfiddle.net/kdoq31cq/
サーバ上にファイルをアップロードしたい場合 ローカルにファイルをダウンロードしたい場合

##SCP

ふと作業中に公開鍵を設置したり、ローカルにファイルをダウンロードしたい際にあれ?と思ったので書いてみます。

##scpコマンド良さそう。 
+ リモートにアップロードするでー
+ scp -P 22 /Users/user/Downloads/ファイル名 ユーザ名@リモートホスト:/home/users/user/tmp

+ -Pオプションでポートを指定することができる。
+ セキュアログイン、セキュアなファイル転送用のポートみたいね。

####これでローカルからリモートにアップロードできた
+ 次はローカルに持ってきましょう。
+ scp -i ~/.ssh/id_rsa ユーザ名@リモートホスト:/home/users/user/tmp/ファイル名 /Users/user/tmp/diabled1.topics.csv

+ こんな感じでローカルにファイルをリモートから持ってこれます。

こんな感じです
WinノートPC+wifiドングル環境でTHETA Sの撮影をしてみた

インターネットに繋げながらRICOH THETA Sの撮影をしたかったので、WinノートPC+wifiドングルの複数NIC環境でAPIを使ってやってみた。

ファームウェアv01.42でUSB通信によって撮影ができるようになったそう([USB Reference · v2 · API & SDK | RICOH THETA Developers](https://developers.theta360.com/ja/docs/v2/usb_reference/))なのでそちらを使っても良さそう。
でも、MTPとライブラリについて詳しくないので今回はwifiでやってみた。

## 試した環境

ノートPC：VAIO Pro mk2 - Windows 7 professional SP1
wifiドングル：GW-USNano2

## 試したこと

* ノートPCに[wifiドングルのドライバ](https://www.planex.co.jp/support/download/wireless/gw-usnano2/client_manager_win.shtml)インストール
* [ここら](http://d.hatena.ne.jp/oknknic/20120814/1344957118)あたりを参照してメトリックの値を小さくしてノートPCの無線LANが優先されるように設定 => インターネット接続OK
 * ノートPCの無線LANとwifiドングルのネットワーク接続設定で以下のようにメトリックを設定

![multi_nic.png](https://qiita-image-store.s3.amazonaws.com/0/16768/62e83af6-ecd2-0cb9-fc25-f03687008610.png)

* [この記事](http://qiita.com/sandinist/items/9c3a77fdf262513ede3d)を参考にしてrubyスクリプトでTHETA Sを撮影、画像取得 => OK
 * スクリプトは以下の変更を行った

```rb
fileUri = JSON.parse(http.post('/osc/state',"").body)["state"]["_latestFileUri"] while fileUri.empty?
# => fileUri.empty?をfileUri.nil?に
```

```rb
`open image.jpg`
# => 削除
```
Laravel5.2でValidationの$errorsが取得できない対応

# 概要
Laravel 5.2でvalidationでエラーになった場合、viewにセットされるはずの$errorsが空っぽでエラーメッセージが拾えないというバグの調査＆対応

# 環境
* Laravel 5.2
* PHP 7.0

# 原因
route.phpとRouteServiceProviderからmiddleware group 「web」が2重に呼び出され
セッションがリスタートされた(と思われる)

# 詳細
$errorsは、middlewareのShareErrorsFromSessionがセッションに保存してくれるらしい。
ShareErrorsFromSessionは、Middleware Groupの「web」に設定されている

```Kernel.php
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],
```


なので、route.phpにRoute::groupを書いてやればOKだろうということで下記のように記述した

```route.php
Route::group(['middleware' => ['web']], function () {
  Route::get('login', 'AuthController@showLoginFrom');
  Route::post('login', 'AuthController@login');
}
```


validationエラーを起こすFormを送り、{{ var_dump($errors) }}をしてみた結果。

```
object(Illuminate\Support\ViewErrorBag)[231]
  protected 'bags' => 
    array (size=0)
      empty
```
エラーメッセージが来ない。

**数時間経過後…**

公式を見ていると、以下の記載が！

Keep in mind, the web middleware group is automatically applied to your default routes.php file by the RouteServiceProvider.

> webグループはRouteServiceProviderで、自動的に適用されるぜ。
> 覚えておいてな！

試しにRoute::groupの外に出してみる

```route.php
//Route::group(['middleware' => ['web']], function () {
//  Route::get('login', 'AuthController@showLoginFrom');
//  Route::post('login', 'AuthController@login');
//}
Route::get('login', 'AuthController@showLoginFrom');
Route::post('login', 'AuthController@login');
```

キター！！

```$errors
object(Illuminate\Support\ViewErrorBag)[195]
  protected 'bags' => 
    array (size=1)
      'default' => 
        object(Illuminate\Support\MessageBag)[196]
          protected 'messages' => 
            array (size=3)
              ...
          protected 'format' => string ':message' (length=8)
```

もうちょっと調査したところ、
MiddlewareのShareErrorsFromSessionを2回呼び出しても問題なく、
StartSessionを2回呼び出した際に今回の現象が発生した。

おそらく、MiddlewareのStartSessionが2回呼ばれていることでセッションが再発行され、
前のセッションが取得できなくなってしまったと思われる。

公式はちゃんと読もう！
ターミナルからテキストファイルの文字コードをUTF-8やShift_JISに変換


Microsoft OfficeのExcelはShift_JISのcsvデータを開くことができません。UTF-8のcsvを開くと文字化けしてしまいます。

Excelしか開くことができない人に対しては、下記のコマンドでUTF-8からShift_JISに変換してから送付しています。

``` unix
# shift-jis変換
find . -name '*.csv' | xargs nkf --overwrite -s
```

逆はこちら

```unix
#utf-8変換
find . -name '*.csv' | xargs nkf --overwrite -w
```

Macだとデフォルトでnkfが入っていないので下記のコマンドでインストールしてください。

```unix
brew install nkf      
```
Rustのforget関数

Rustの面白い関数にstd::mem::forgetがあります。

Rustには値がスコープ外になった時の後処理を記述できるDropというtraitがあり、 リソースのリーク漏れを防いでくれます。
Dropのおかげでmallocしてfreeしたりfileをopenしてcloseするなどの処理は自分で書く必要がないし忘れる事もないわけです。



```rust
{
  let heap_memory = Box::new(1);//heapにメモリを確保
}//scopeから外れたので自動でメモリを解放
``` 

forget関数はdrop処理を無効にし意図的に**リソース漏れ**をさせる関数です。

```rust
{
  let heap_memory = Box::new(1);//heapにメモリを確保
  std::mem::forget(heap_memory);
}//メモリリーク!!
```

こんな関数何の役に立つのかと思いますが、　特定のケースでは有効です。
例えば二つの値を交換するswap関数です。

```rust
use std::mem;
use std::ptr;

fn swap<T>(x: &mut T, y: &mut T) {
    unsafe {
        let mut temp: T = mem::uninitialized();

        //tempに一端値を退避して交換
        ptr::copy_nonoverlapping(x, &mut temp, 1);
        ptr::copy_nonoverlapping(y, x, 1);
        ptr::copy_nonoverlapping(&temp, y, 1);
    }
}

let mut x = Box::new(1); 
let mut y = Box::new(2);
swap(&mut x, &mut y);
println!("x = {}, y = {}", x, y)// x = 2, y = -46065496
```

tempとyが同じものを指しているため 型TがDropを実装している場合 swap関数を抜けた後にtempと一緒にyまでdropされてしまいます。
tempの解放処理はしたくありません。

このような場合にforgetが有用です

```rust
use std::mem;
use std::ptr;

fn swap<T>(x: &mut T, y: &mut T) {
    unsafe {
        let mut temp: T = mem::uninitialized();

        //tempに一端値を退避して交換
        ptr::copy_nonoverlapping(x, &mut temp, 1);
        ptr::copy_nonoverlapping(y, x, 1);
        ptr::copy_nonoverlapping(&temp, y, 1);
        //tempの解放処理はしない
        mem::forget(temp);
    }
}

let mut x = Box::new(1); 
let mut y = Box::new(2);
swap(&mut x, &mut y);
println!("x = {}, y = {}", x, y)// x = 2, y = 1
```



Rust面白いですね。！

参考 [forgetのドキュメント](https://doc.rust-lang.org/std/mem/fn.forget.html)
Djangoのsettings.pyで設定した定数をテンプレートに出力する方法

# やりたいこと
- サイト全体で共通の文言をどのページでも表示したい。
- テンプレートをincludeするのではなく、settings.pyに定数（のように）定義しておいて表示したい。
- 要は、デプロイ環境によって変化させたい。

# 手順
## *app_dir*/context_processors.py を作成
※settings.pyと同じディレクトリ

```
from django.conf import settings

def site_common_text(request):
    return {'SITE_COMMON_TEXT': settings.SITE_COMMON_TEXT}
```

## settings.pyにcontext_processorsを記述
```
TEMPLATES = [
    {
        ...
        'OPTIONS': {
            'context_processors': [
                ...
                'app_dir.context_processors.site_common_text',  # <-append
                ...
```

## settings.pyに定数を記述
```
SITE_COMMON_TEXT = "this is common text in this site"
```

## テンプレートに記述
```
{{ SITE_COMMON_TEXT }}
```
AWS ElasticBeanstalk + RailsでCronを設定する

## 環境


- AWS ElasticBeanstalk + Ruby 2.2 Puma
- Rails 4.2.5

## 背景

AWSのElasticBeanstalkでRailsアプリを動かしており、サイトマップの更新をCronで定期的にできるようにしたいと思います。が、普通に設定してみたら、__`bundle`__や__`rake`__コマンドがうまく動かなくてハマってしまったので、残しておこうと思います。

## Cron設定

`/etc/cron.d` 内のファイルが自動的に読み込まれてCronとして動作します。
ファイル名は何でもいいようなので、適当にsitemapとして、/etc/cron.d以下にファイルを設置します。

/etc/cron.d/sitemap

```bash
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
0 20 * * * root /var/script/sitemap.sh
```

次に、呼び出されるshファイルを設置しますが、普通にやるとうまく行きません。 __`bundle command not found`__ , __`rake command not found`__等のエラーが発生します。パスが正しく通ってなさそうなので、色々パスをいじりましたが、rakeだけはうまく行きませんでした。

そこで、以下のようにして、ElasticBeanstalkの環境を引き継いてあげると、うまく行きます。

/var/script/sitemap.sh

```bash
#!/usr/bin/env bash
set -xe
EB_SCRIPT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k script_dir)
EB_SUPPORT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k support_dir)
EB_DEPLOY_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir)

. $EB_SUPPORT_DIR/envvars
. $EB_SCRIPT_DIR/use-app-ruby.sh

cd /var/app/current
RAILS_ENV=production bundle exec rake sitemap:refresh
```

あとはこれらの設定を.ebextensionsに書いてあげればOKです。
参考にしてみてください。
Facebook Messenger Platform - Welcome Message

[Welcome Message Configuration](https://developers.facebook.com/docs/messenger-platform/send-api-reference#welcome_message_configuration)
試したのでメモ
**2016/04/19時点**


#事前準備
##PAGE_ID
Facebookページの情報を参照
<img width="450" alt="スクリーンショット 2016-04-19 14.50.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/112011/73d4c03c-5f48-af70-ba30-31185e2b5d21.png">

##PAGE_ACCESS_TOKEN
作成したMessengerアプリのページアクセストークンを参照
http://qiita.com/ytamayose/items/86ce4ff4613c8947d3a0
<img width="450" alt="スクリーンショット 2016-04-19 14.44.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/112011/9df237e3-9c8a-a81b-fb35-0752367fe625.png">


#TEXT

```bash:
$ curl -X POST -H "Content-Type: application/json" -d '{
  "setting_type":"call_to_actions",
  "thread_state":"new_thread",
  "call_to_actions":[
    {
      "message":{
        "text":"Welcome to My Company!"
      }
    }
  ]
}' "https://graph.facebook.com/v2.6/<PAGE_ID>/thread_settings?access_token=<PAGE_ACCESS_TOKEN>"
```

##結果
![IMG_1009.PNG](https://qiita-image-store.s3.amazonaws.com/0/112011/c27de20a-5bdd-6030-9bad-1ffff8d93d3f.png)


#Structured Message
例はURLが無効だったため、Facebook関連に変更

```bash:
$ curl -X POST -H "Content-Type: application/json" -d '{
  "setting_type":"call_to_actions",
  "thread_state":"new_thread",
  "call_to_actions":[
    {
      "message":{
        "attachment":{
          "type":"template",
          "payload":{
            "template_type":"generic",
            "elements":[
              {
                "title":"Welcome to My Company!",
                "item_url":"https://www.facebook.com/",
                "image_url":"https://www.facebookbrand.com/img/fb-art.jpg",
                "subtitle":"We have the right hat for everyone.",
                "buttons":[
                  {
                    "type":"web_url",
                    "title":"View Website",
                    "url":"https://www.facebook.com/"
                  },
                  {
                    "type":"postback",
                    "title":"Start Chatting",
                    "payload":"DEVELOPER_DEFINED_PAYLOAD"
                  }
                ]
              }
            ]
          }
        }
      }
    }
  ]
}' "https://graph.facebook.com/v2.6/<PAGE_ID>/thread_settings?access_token=<PAGE_ACCESS_TOKEN>"
```

##結果
![IMG_1011.PNG](https://qiita-image-store.s3.amazonaws.com/0/112011/db9aa63a-472f-a733-1bc8-9f6c67ef1b0c.png)
画像が表示されていない...。
「Welcome to My Company!」「View Website」を押下で指定したURLへ遷移。
「Start Chatting」を押下でチャットの吹き出しがでるが、その先は不明...。


#Response
```json:
{"result": "Successfully added new_thread's CTAs"}
```


#Delete
```bash:
$ curl -X POST -H "Content-Type: application/json" -d '{
  "setting_type":"call_to_actions",
  "thread_state":"new_thread",
  "call_to_actions":[]
}' "https://graph.facebook.com/v2.6/<PAGE_ID>/thread_settings?access_token=<PAGE_ACCESS_TOKEN>"
```


#困ったこと
Welcome Messageなので、一度スレッドに入る（GetStar）すると、二度目は表示されず、確認するためにアカウントを複製していた。
良い確認方法がありましたら、ご教授くださいm(_ _)m
AWS SDK for PHP で出たエラー

vagrant上からaws sdk for PHPを使ってアクセスしていた時の事。いきなり以下のようなエラーログがでてきてlistObjectsがエラーとなる事象に

```
2016-04-19 14:46:58] Server.CRITICAL: Aws\S3\Exception\S3Exception: Error executing "ListObjects" on "https://s3-ap-northeast-1.amazonaws.com/hoge-assets?prefix=kakikubo&encoding-type=url"; AWS HTTP error: Client error response [url] https://s3-ap-northeast-
1.amazonaws.com/assets?prefix=kakikubo&encoding-type=url [status code] 403 [reason phrase] Forbidden RequestTimeTooSkewed (client): The difference between the request time and the current time is too large. - <?xml version="1.0" encoding="UTF-8"?> <Error><Code>RequestTimeTooSkewed</Code><Message>The difference between the request time and the current time is too large.</Message><RequestTime>20160419T054656Z</RequestTime><ServerTime>2016-04-19T06:02:40Z</ServerTime><MaxAllowedSkewMilliseconds>900000</MaxAllowedSkewMilliseconds><RequestId>11E8E8CEEE006EDB</RequestId>
```

"Forbidden RequestTimeTooSkewed"って一瞬なんのことかと思いましたが、どうやら時刻が問題みたいでした。AWS SDKを叩いたクライアント側の時刻と、エンドポイント側の時刻がずれすぎなのが問題のようなので、

```
$ sudo ntpdate ntp.nict.jp
19 Apr 15:03:23 ntpdate[4495]: step time server 133.243.238.243 offset 941.644282 sec
```

とすれば解消しました。


眠いのでメモ書きしたかったのでした
プログラマの考えが・・身につく本より：小問題のパーツをとりまとめる

Pythonでプログラミング入門中
[前回](http://qiita.com/teratera/items/503be633b4148824b368#comment-543e6fd3551c04927312)より引き続き

この問題の最終になりまたが、各パーツをとりまとめて最終的な解答になります。
（前回ですでに完成していたようです（汗

<h1>問題：(最初の課題）ルーンチェックサムの検証 </h1>
>(問題文が重複していますがご了承ください）
ルーン式は、ルーン式は、識別番号の検証によく使われる方式だ。元の数字の各桁に対して、１桁おきにその数字を２倍する。そのあとで、各桁の数字を足していく（２倍した結果が２桁になる数字があれば、十の位と一の位をそれぞれ個別に足していく）。その合計が１０で割り切れる場合に、識別番号は妥当なものであると見なす。
任意の長さの識別番号を受け取り、その値がルーン式で妥当かどうかを調べるプログラムを書こう。このプログラムでは、１つの桁を読み込んだら次の桁に進む前に、その桁の処理を済ませなければいけな。





<h2>どの桁を２倍すればいいのかを知る</h2>
>[解答](http://qiita.com/teratera/items/503be633b4148824b368)
こちらのコメントでも頂いている通りPythonのinput()関数を利用して一旦全て入力してその文字列長さをだして、偶数番目・奇数番目を導いてくれています。

<h1>２倍した結果が２桁になったときに、それぞれの桁を個別に扱う</h1>
>[解答](http://qiita.com/teratera/items/6dfa72d6b5d1e987c2df)
(0〜9)２倍したあとの計算がめちゃくちゃでしたが、1 + (2倍数字 % 10) で求めたい数が出せました。

<h2>数値を最後まで読み終えたことを知る</h2>
>[解答](http://qiita.com/teratera/items/a76667d8e6cc23078292)
こちらも問題の解答C++ではASCII文字コードを求めて改行コードで判断するようでしたが、Pythonの場合input()関数が改行を判断してくれるようでしたのでとくに難しくならずにすみました。

<h2>各桁を個別に読み込む</h2>
[解答](http://qiita.com/teratera/items/387be64bd9b40971cd38)
range()関数で繰り返しをしてinput()関数で個別に入力
（ただ、input()関数は文字列で入力可能でした）

以上のことから以下の解答となります。

```
#!/usr/bin/env python
#coding:utf-8

from ConsoleOut import cout
from test import doubleDigitValue


def number():
    checksum = 0
    position = 0
    cout << "Enter a number:"
    digits = input()
    while position < len(digits):
        digit = digits[position]
        if position % 2 == 0:
            checksum += int(digit)
        else:
            checksum += doubleDigitValue(int(digit))
        position += 1

    cout << "Checksum is " + str(checksum) + ". \n";
    if checksum % 10 == 0:
        cout << "Checksum is divisible by 10. Valid .\n"
    else:
        cout << "Checksum is not divisible by 10. Invalud. \n"

・・・(ターミナル結果)
問題の1762483がチェックサムで算出すると有効か無効化
>>> from test03 import number
>>> number()
Enter a number:1762483
Checksum is 30. 
Checksum is divisible by 10. Valid .(有効)

```

10で割り切れるなら”有効”と求めたい結果になりました。
ここまでで、自分の中で勉強になった点は無数にありますが、これを活かして次の課題に取り組んでいきます。
Ubuntu に特定のバージョンの docker をインストールする

# 概要

Ubuntu に特定のバージョンのdockerを入れたい

# まとめ

1.5.0あたりから最新(2016-04-19現在1.11.0)であれば、可能

# やり方

* [Installation on Ubuntu](https://docs.docker.com/engine/installation/linux/ubuntulinux/)
を参考にすればよい。

```
apt-get install apt-transport-https ca-certificates
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
```

/etc/apt/sources.list
などに追加するかファイルを作って追加する
trustyなら

```
deb https://apt.dockerproject.org/repo ubuntu-trusty main
```

更新する

```
apt-get update
```

ダウンロードできるバージョンを確認する

```
apt-cache policy docker-engine
```

インストールする

```
apt-get install docker-engine=1.8.1-0~trusty
```

必要があればユーザーをグループdockerに追加する。

```
usermod -aG docker ubuntu
```