OmniAICreator/Qiita-1.07M huggingface dataset:
接続先によってターミナルのタブ色を変えるzshファイルを作成

itermを使用している人しか使えませんが、接続先によってタブ色を変更するスクリプトを書きました。  
リポジトリのURLも載せておきますのでREADMEを見て貰えればと思います。

```shell-session
#関数定義(引数3つ)
#ウィンドウの色を変更
tab-color() {
    echo -ne "\033]6;1;bg;red;brightness;$1\a"
    echo -ne "\033]6;1;bg;green;brightness;$2\a"
    echo -ne "\033]6;1;bg;blue;brightness;$3\a"
}
#変更をリセット
tab-reset() {
    echo -ne "\033]6;1;bg;*;default\a"
}


alias prd='tab-color 204 0 0; ssh userName@11.111.11.111; tab-reset' #本番用サーバー
alias stg'tab-color 255 255 0; ssh userName@11.111.11.111; tab-reset' #stg
alias dev='tab-color 134 200 0; ssh userName@11.111.11.111; tab-reset' #dev
```

リポジトリはこちら⇊
![スクリーンショット 2016-02-27 18.14.47.png](https://qiita-image-store.s3.amazonaws.com/0/44144/a9a1cea9-6565-312d-0458-55f350540004.png)

[switching-color-zsh](https://github.com/TsujiTakuya55/switching-color-zsh)


### **Author**
name:tsujitaku
Twitter:[@Tsuji_Taku50](https://twitter.com/?lang=ja)
blog:[tsujitaku'sエンジニア奮闘日記](http://tsujitakuya55.github.io/)
UIView単位でXIBを読み込むための汎用クラス


## 説明

Objective-C / SwiftでUIViewをUIパーツとして使いまわしたい場合、
UIViewごとにXIBファイルを定義しておくと便利です。
ロード処理を汎用化したクラスを作って使っているので紹介します。

このクラスは以下の条件で動作します:

- このクラスのサブビューとしてビューを定義した場合、`initWithFrame:`あるいは`initWithCoder:` が呼ばれると、自分のクラス名と同じ名前のxibファイルをロードします
- ロードしたxibのルートビューは、ロードしたビュー自身の直下にサブビューとして追加されます
- ロードされるXIBのownerは、ロードするビューのクラスが設定されていること
- ロードされるXIBのルートビューは、YMUIXIBViewのIBOutlet, baseにリンクされていること


## Snippet
```objc:YMUIXIBView.h
#import <UIKit/UIKit.h>

// ************************************************************
#pragma mark - Class
// ************************************************************
@interface YMUIXIBView : UIView

@property(nonatomic, strong) IBOutlet UIView *base;

- (instancetype)initWithFrame:(CGRect)frame;
- (instancetype)initWithCoder:(NSCoder *)aDecoder;

@end
```

```objc:YMUIXIBView.m
#import "YMUIXIBView.h"

// ************************************************************
#pragma mark - Private interface
// ************************************************************
@interface YMUIXIBView(){
    
}
- (void)loadXIB;

@end


// ************************************************************
#pragma mark - Implementation
// ************************************************************
@implementation YMUIXIBView

// ------------------------------------------------------------
#pragma mark - Initializers
// ------------------------------------------------------------
- (instancetype)initWithFrame:(CGRect)frame{
    if(!(self = [super initWithFrame:frame]))
        return nil;
    
    [self loadXIB];
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder{
    if(!(self = [super initWithCoder:aDecoder]))
        return nil;

    [self loadXIB];
    return self;
}

// ------------------------------------------------------------
#pragma mark - Private methods
// ------------------------------------------------------------
- (void)loadXIB{
    self.base = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class)
                                               owner:self
                                             options:nil] firstObject];
    self.base.autoresizingMask
        = UIViewAutoresizingFlexibleWidth
        | UIViewAutoresizingFlexibleHeight;
    

    [self addSubview:self.base];
    self.base.frame = self.bounds;
}

@end
```
Homebrewがいつの間にか動かなくなっていたので直した

久しぶりに Homebrew を使ってインストールしようとしたら、うまく動かなくなっていました。

```shell-session
$ brew update
warning: unable to unlink CONTRIBUTING.md: Permission denied
warning: unable to unlink SUPPORTERS.md: Permission denied
fatal: cannot create directory at '.github': Permission denied
Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master

$ sudo brew update
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- mach (LoadError)
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/local/Library/Homebrew/extend/pathname.rb:2:in `<top (required)>'
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/local/Library/Homebrew/global.rb:3:in `<top (required)>'
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/local/Library/brew.rb:15:in `<main>’
```

Permission denied とか出ていて、何が起きたのかよくわからなかったので色々調べていたら、OS X を El Capitan にするときに SIP の影響で「Homebrewを先にインストールしておけ」という記事を思い出しました。なのでそちら方面で調べていたら、/usr/local のパーミッションの修正で直りました。

```shell-session
$ ls -la /usr/local
total 96
drwxr-xr-x  18 root    wheel    612 10 17 04:41 .
```

所有者が root になっていたので自分自身に修正。
 # ```$(whoami)``` は fish とかだと動かないので一旦 bash などへ

```shell-session
$ sudo chown $(whoami):admin /usr/local

$ ls -la /usr/local
total 96
drwxr-xr-x  18 kazuya  admin    612 10 17 04:41 ./
```

手動でHomebrewを更新。

```shell-session
$ cd /usr/local/Library/Homebrew

$ git pull -q origin refs/heads/master:refs/remotes/origin/master
```

正しく動くようになりました。 :clap: 

```shell-session
$ brew update
Already up-to-date.
```

追記: 2016-02-28
今日別のマシンで試したらこんな素敵なエラーが出ました。

```shell-session
$ brew update
Error: The /usr/local directory is not writable.
Even if this directory was writable when you installed Homebrew, other
software may change permissions on this directory. Some versions of the
"InstantOn" component of Airfoil are known to do this.

You should probably change the ownership and permissions of /usr/local
back to your user account.
  sudo chown -R $(whoami):admin /usr/local
```
Linuxモニターに表示される作業内容をファイルに保存

#モニターに表示される作業内容をエビデェンスとして保存したい場合、scriptコマンドを使う
##作業前にscript実行、作業後にexit実行だけで作業内容が「typescript」ファイルに保存される。

```lang:filename
[vagrant@vagrant-centos65 ~]$ script
Script started, file is typescript
[vagrant@vagrant-centos65 ~]$ ll
total 0
-rw-rw-r-- 1 vagrant vagrant 0 Feb 27 09:00 typescript
[vagrant@vagrant-centos65 ~]$ vi test                                                    
[vagrant@vagrant-centos65 ~]$ cat test
test
[vagrant@vagrant-centos65 ~]$ exit
exit
Script done, file is typescript
[vagrant@vagrant-centos65 ~]$ ll
total 8
-rw-rw-r-- 1 vagrant vagrant    5 Feb 27 09:00 test
-rw-rw-r-- 1 vagrant vagrant 3139 Feb 27 09:00 typescript

```
保存されたファイルの中身を見てみます。「cat typescript」実行
開始時間と終了時間も表示されますので、作業時間と作業内容をファイルに保存できるのでエビデンスで使えそう。。。

```lang:filename
[vagrant@vagrant-centos65 ~]$ cat typescript                                             
Script started on Sat 27 Feb 2016 09:00:03 AM UTC
[vagrant@vagrant-centos65 ~]$ ll
total 0
-rw-rw-r-- 1 vagrant vagrant 0 Feb 27 09:00 typescript
[vagrant@vagrant-centos65 ~]$ vi test                                                    
[vagrant@vagrant-centos65 ~]$ cat test
test
[vagrant@vagrant-centos65 ~]$ exit
exit

Script done on Sat 27 Feb 2016 09:00:50 AM UTC
```

この記事に興味がある方のために追記
こちらにはpoderosaでもっと簡単に作業ログを保存できる方法があります。
http://qiita.com/amagasu1234/items/f7d705fa94b56742d016
HTML URLの長さの限界は

#URLの長さの限界とは
フォームにURLの入力があったとする
電話番号とかは桁数がしれてるので`max-length="13"`とかしとけばいいとして
URLはどうするのか

##データベースの限界
聞いたところ、何文字までってのはないらしい
もちろんモノによると思うが…

ということは入力しようと思えば、DBの容量をすべて使うくらいの文字列が入力できちゃう！

##長いURLの定義
GoogleのMueller氏がこれ系の質問に
「2,000文字くらいじゃね？」
って答えたとかいう記事があった。
誰か知らんがgoogleの人が言うので間違いないはず

##ブラウザは？
IEではURLに資料できる最大文字数は2,083文字

らしい

##結論
2,100文字にしとけばいいと思う
ニューラルネットの種類について

# はじめに
深層学習が流行っているので[深層学習-機械学習プロフェッショナルシリーズ](http://www.amazon.co.jp/深層学習-機械学習プロフェッショナルシリーズ-岡谷-貴之/dp/4061529021)を読んで少し勉強してみた。

# ニューラルネットの種類について
「深層学習＝多層のニューラルネットで逆誤差伝搬法を使って学習するもの」と十把一絡げにとらえていたが、色々なニューラルネットがあるらしい。

[深層学習-機械学習プロフェッショナルシリーズ](http://www.amazon.co.jp/深層学習-機械学習プロフェッショナルシリーズ-岡谷-貴之/dp/4061529021)では下記のニューラルネットについて説明されている。

- 自己符号化器
- 畳み込みニューラルネット
- 再帰型ニューラルネット
- ボルツマンマシン

## 自己符号化器
入力値と出力値が同じになるように学習を行うニューラルネット。
ディープネットの事前学習（重みの良い初期値を得る）などで利用される。
入力層・中間層・出力層の3層から構成される。

## 畳み込みニューラルネット
主に画像認識などで利用されるニューラルネット。
位置変化に敏感な「畳み込み層」、位置変化に鈍感な「プーリング層」、明るさやコントラストの違いを吸収する「正規化層」などを組み合わせて構成される。

## 再帰型ニューラルネット
音声・言語・動画像といった系列データを扱うニューラルネット。
時刻tの層の出力が時刻t+1の層の入力になるよう構成される。

再帰型ニューラルネットはニューラルネットが深くなり勾配消失問題が発生する。
そのため「長・短期記憶」という、中間層のユニットをメモリユニットと呼ばれる要素に置き換える方法をとると良い。

## ボルツマンマシン
ユニット間の結合が双方向なニューラルネット。
データの生成モデルなどで利用される。

# おわりに
いくつかのニューラルネットについて学習した。
次は [Chainer](http://chainer.org/) あたりを使って実際に何か作ってみたい。
udpで65507バイト送りまくってみる（ios -> osx）

## 動機
65507バイトのデータをまるっと別なところに送りたい。だけどせっかくなので、
ちょっと低レベルAPIで遊んで見たくなりました。
なのでちょっと不慣れですがudpソケット通信を試して見ようと思います。

## 環境
ios9.2.1, osx 10.11.1, xcode 7.2.1になります。

## 実装(ios: 送信側)

```objc

#import "ViewController.h"

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>

@implementation ViewController {
    NSTimer *_timer;
    int _index;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 / 60.0 target:self selector:@selector(tick:) userInfo:nil repeats:YES];
}

- (void)tick:(id)sender {
    const int kSendSize = 65507;
    
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    
    struct sockaddr_in addr = {0};
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3000);
    addr.sin_addr.s_addr = inet_addr("192.168.10.3");
    
    int maxsize = kSendSize;
    int r = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &maxsize, sizeof(int));
    assert(r == 0);
    
    char bytes[kSendSize] = "";
    sprintf(bytes, "index = %d", _index);
    ssize_t s = sendto(sock, bytes, sizeof(bytes), 0, (struct sockaddr *)&addr, sizeof(addr));
    if(s != kSendSize) {
        printf("failed to sendto: errno = %d, %s\n", errno, strerror(errno));
    }
    
    close(sock);
    
    _index++;
}

@end 

```

## 実装(osx: 受信側)

```cpp

#include <iostream>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(int argc, const char * argv[]) {
    const int kSendSize = 65507;
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    
    struct sockaddr_in addr = {0};
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3000);
    addr.sin_addr.s_addr = INADDR_ANY;
    
    bind(sock, (struct sockaddr *)&addr, sizeof(addr));
    
    for(int i = 0 ; i < 10000 ; ++i) {
        char buf[kSendSize] = {0};
        ssize_t r = recv(sock, buf, sizeof(buf), 0);
        if(r == kSendSize) {
            printf("%s\n", buf);
        }
    }

    close(sock);
    
    return 0;
}


```

## Note
どうやらsetsockoptで、SO_SNDBUFを広げてあげないとうまく送れないようでした。
また、通信頻度を、1.0 / 60.0から1.0 / 120など上げてみると、
頻繁に、failed to sendto: errno = 55, No buffer space available
とエラーが吐かれて通信が不安定になるようでした。
帯域がいっぱいになった、ということのようです。

## windows (vvvv)
今日から始めたvvvvなら、
iosからのudp送信、そのまま受信することができます。

![SnapCrab_NoName_2016-2-27_22-47-50_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/8588/cff49263-9fb3-411b-3be0-75feeffe2cd2.png)

素晴らしく簡単です

## まとめ
低レベルAPIは得てして面倒だったり複雑になりがちです。
しかしながら、UDPの持つ、投げっぱなしでパケットロスを気にしない、という性質もあって、案外シンプルな実装で通信をすることができて少し驚いています。今までちょっと毛嫌いしていましたが、下手に高レベルなライブラリを使うよりも、実はこちらのほうがメリットが大きい場面もあるかもしれません。

## 参考

以下ページ等を参考にさせていただきました。

ソケット入門
http://software.aufheben.info/kouza/senior/kouza_socket.html

UDPを使う
http://www.geekpage.jp/programming/linux-network/udp.php
CSSで改行する

#改行というか折り返しの処理
urlなどでなが～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～い文字列を表示させようとしたとき、
こんなふうに改行されず親のboxを突き抜けてしまうとき使うやつ

英単語などは入りきらないとき、単語の途中で改行されないのはわかってたけど
狭いスペースに長い英数文字列を書くことなかったので意識してなかった

##2つのCSSプロパティ

- word-break
- word-wrap/overflow-wrap

word-wrap/overflow-wrapは前者がcss3から後者にかわるため

##2つの違い
実はこれらの折り返し処理は若干違いがあるらしい
それぞれの値と処理の内容
###word-break

```
p{
 word-break : break-all;
}
```
一切の禁則処理が解除される
ガンガン折り返す `or` とか `、` とかも気にせずとにかく折り返す

###word-wrap/overflow-wrap

```
p{
  word-wrap : break-word;
  overflow-wrap : break-word;
}
```
可能な限り禁則処理が保持される
欧文などはこれが推奨されるみたい

**word-break : break-all;**
古いブラウザとか考えるのめんどいので、とくに問題なければコレ
Hanami(旧Lotus)でパスワードやポート等を指定してデータベースに接続する

情報がなかったのでメモ。
[Hanami](https://github.com/hanami/hanami)の[Model](https://github.com/hanami/model)は[Sequel](https://github.com/jeremyevans/sequel)の`connect`メソッドを利用してデータベースに接続している。
そのため、.envなどのファイルのAPP_NAME_DATABASE_URLに`postgres://user:password@hostname:port/database_name`や`mysql://user:password@hostname:port/database_name`と書くことでユーザー・パスワード・ポート等を指定して接続できる。

追記: [公式のGetting Started](http://hanamirb.org/guides/getting-started/)に書いてあった
gulpでES6をコンパイルする時にNODE_ENVを埋める

gulp-babel 6.1.2で以下のようにES6をコンパイルしているとする。

```js
var gulp  = require('gulp');
var babel = require('gulp-babel');

gulp.task(
  'compile-es6',
  function () {
    return gulp.src('src/**/*.js')
      .pipe(babel({ presets: ['es2015'] }))
      .pipe(gulp.dest('app/'));
  }
);
```

[babel-plugin-transform-inline-environment-variables](https://www.npmjs.com/package/babel-plugin-transform-inline-environment-variables)をインストールして以下のようにプラグインを指定し、

```js
gulp.task(
  'compile-es6',
  function () {
    return gulp.src('src/**/*.js')
      .pipe(babel({ presets: ['es2015'], plugins: ['transform-inline-environment-variables'] }))
      .pipe(gulp.dest('app/'));
  }
);
```

`NODE_ENV=production gulp compile`とかすれば、JavaScript中の`process.env.NODE_ENV`がインラインで`'production'`に置き換わってくれる。Electronのパッケージングとかでコンパイル時のNODE_ENVにより処理を分岐したい時とかに便利。
Provisioning profileがdevelopmentかdistributionをプログラムから判断

Push Notificationなんかをするとき、現在のProvisioning profileがdevelopmentかdistributionかを知りたい時があります。
調べると直接とれるAPIは無いみたいで、以下のStack Overflowが出てきます。

* http://stackoverflow.com/questions/16243855/how-to-detect-that-a-provisioning-profile-is-for-development-or-distribution-pr

上記のStackoverFlowをもとに、Objective-Cで実装したgistがありました。
https://gist.github.com/steipete/7668246


これを参考にSwiftで再実装しました。
https://gist.github.com/rkawajiri/1a0b01c2423ef7f0e0ed

```swift
public struct ProvisioningProfile {
  public static let sharedInstance = ProvisioningProfile()
  #if (arch(i386) || arch(x86_64)) && os(iOS)
  public let isDevelopment = true
  #else
  public let isDevelopment: Bool
  private init() {
    guard let provision = NSBundle.mainBundle().pathForResource("embedded", ofType: "mobileprovision"),
      let data = NSData(contentsOfFile: provision) else {
        isDevelopment = false
        return
    }
    let bytes = Array<UInt8>(UnsafeBufferPointer(start: UnsafePointer<UInt8>(data.bytes), count: data.length))
    let profile = bytes
      .map { UnicodeScalar($0) }
      .filter { $0.isASCII() }
      .reduce("") { "\($0)\($1)" }
      .componentsSeparatedByCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
      .joinWithSeparator("")
    isDevelopment = profile.rangeOfString("<key>get-task-allow</key><true/>")?.count > 0
  }
  #endif
}
```
CircleCI で sbt 0.13.11 を使用する。

~~そのうち CircleCI 側で対応してもらえて不要になりそうだけど、備忘のため残す。~~

2016.06.07 現在、[対応された](https://circleci.com/docs/build-image-precise/#scala)ようなので本記事は不要になった。 :innocent: 

# build.properties に sbt.version を指定する

新しい Scala プロジェクトの作成にあたり、現在の最新バージョン sbt 0.13.11 を使用する事にした。
いつも通り project/build.properties に `sbt.version=0.13.11` を指定すればOK、と思っていたが… CircleCI でのテスト実行に失敗する。

```
Detected sbt version 0.13.11
Cannot find sbt launcher 0.13.11
Please download: 
  From  http://typesafe.artifactoryonline.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/0.13.11/sbt-launch.jar

To /home/ubuntu/.sbt/.lib/0.13.11/sbt-launch.jar sbt test returned exit code 1
```

このように使用するsbtのバージョンを project/build.properties に指定したものとして認識してくれているようだが、そのバージョンの sbt が見つからないと言われている模様。

CircleCI公式ドキュメント[Test environment](https://circleci.com/docs/environment#scala)を見てみても、現時点では 0.13.9 までしか無い。

> We track http://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/ for recent Scala releases:

との事だが、~~http://dl.bintray.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/ にも 0.13.9 までしか無い。~~
(2016.03.10　追記参照)

sbt公式ドキュメント[Installing sbt manually](http://www.scala-sbt.org/0.13/docs/Manual-Installation.html)を見たところ、URLは https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/0.13.11/sbt-launch.jar のようなのでこちらをダウンロードすればよさそう。

# CircleCI テスト実行前に sbt-launch.jar をダウンロードする

* `curl -o ~/.sbt/.lib/0.13.11/sbt-launch.jar https://.../0.13.11/sbt-launch.jar`
を実行すればいいだろう
→ 保存先のディレクトリがなくてダメでした。

* `mkdir -p ~/.sbt/.lib/0.13.11/` してから `curl -o ~/.sbt/.lib/0.13.11/sbt-launch.jar https://.../0.13.11/sbt-launch.jar` すればいいだろう。
→ リダイレクト先まで見てくれてなくてダメでした。(2016.03.10　追記参照)

と、何度か試行錯誤して、最終的にこのようにしてCIビルドの成功が確認できた。

```yaml:circle.yml
machine:
  java:
    version: oraclejdk8
dependencies:
  pre:
    - mkdir -p ~/.sbt/.lib/0.13.11/
    - curl -L -o ~/.sbt/.lib/0.13.11/sbt-launch.jar https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/0.13.11/sbt-launch.jar
  cache_directories:
    - ~/.sbt
```

# 2016.03.10　追記

何か sbt-launch.jar のダウンロードURLについて色々勘違いしていたけど、 https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/ が https://dl.bintray.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/ にリダイレクトされているので、CircleCI公式ドキュメントと実際のダウンロードURLに齟齬があるわけではなかった。
Emacs smooth-scroll.el スクロール速度を変える。

smooth-scroll.elを入れるとスクロールがスムーズになる。
しかし、スクロールが1行ずつ行われるため遅いためスクロールスピードを変える。
[smooth-scroll](https://github.com/k-talo/smooth-scroll.el)

#環境
OS: Mac OS X 10.9.5
Emacsのバージョン Emacs 24.4.1
smooth-scrollのバージョン 1.1

#変更内容
設定ファイルにsmooth-scrollの設定を追加する。

```el:init.el
;; 縦方向のスクロール行数を変更する。
(setq smooth-scroll/vscroll-step-size 4)
;; 横方向のスクロール行数を変更する。
(setq smooth-scroll/hscroll-step-size 4)

```

上記の設定をすると、4行単位でスクロールが行われるため、早くなる。
OkHttp で遅い通信環境を再現させる

Android の通信ライブラリでおなじみの [OkHttp](https://github.com/square/okhttp) で、通信に時間がかかる状況を再現させることができます。
[Retrofit](http://square.github.io/retrofit/) や [Glide](https://github.com/bumptech/glide) で OkHttp を使っている場合でももちろん OK です。

# 背景
* 通信に時間がかかる場合の、アプリの UI/UX を確認したい。
 * フリーズしたように見えないか
 * 適度に進捗表示をしているか
* 画面遷移後の通信のコールバック処理が適切かどうかを確認したい。
 * うまく対処していない場合、下のようなエラーになります
  * `getActivity()` が null を返す
  * View 操作で `NullPointerException`
  * Fragment 操作で `java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState`

# 実現方法
[OkHttp の Interceptor](https://github.com/square/okhttp/wiki/Interceptors) を使って、指定時間通信を遅らせる Interceptor を作る。
この Interceptor を OkHttp の networkInterceptors に追加する。
（ [Stetho](http://facebook.github.io/stetho/) の Network Inspection もこの方法ですね。）

# 実装
## DelayInterceptor
```java:DelayInterceptor.java
class DelayInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        try {
            Thread.sleep(5000); // 5秒遅らせる。
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return chain.proceed(request);
    }

}
```

## Client に DelayInterceptor を追加する
```java
OkHttpClient client = new OkHttpClient();
client.networkInterceptors().add(new DelayInterceptor());
```
簡単ですね。

# 最後に
* 上のコードでは `Thread.sleep(...)` の値を固定にしていますが、SharedPreference でカスタマイズできるようにしておくと良いでしょう。
* 画面遷移後のコールバック対応は、RxJava を使っているなら、[RxLifecycle](https://github.com/trello/RxLifecycle) を使う手もあります。
PHP 時間を指定して表示

#phpで時間を指定してコンテンツを表示させる

サイトで期間限定で何かを表示させたいとき

```
$YmdHi = date("YmdHi");

//時間指定
$HTML['info'] = "";
if($YmdHi >= 2016xxxxxxxx and $YmdHi <= 2016xxxxxxxx) {
$HTML['info'] = <<< HTML
　<div id="info">【 お知らせ 】いつからいつまでhogehoge～</div>
HTML;
}
```

```
//header
$html['header'] = <<<HTML
{$HTML['info']}
<header>
.
.
.
.
.
HTML;

```
こんなかんじ
IISでカスタムエラーページが出せないリクエスト

http://www.bing.com/%
![](https://i.gyazo.com/a679d103ae2d70defe7eaa4cf0c51290.png)

>Layer 1: Http.sys (blocked characters = ‘%’)
Layer 2: IIS request filtering (blocked characters = ‘%25’, ‘.’, ‘%2b’)
Layer 3: IIS core (blocked characters = ‘:’)
Layer 4: Handlers

- http://blogs.iis.net/nazim/use-of-special-characters-like-in-an-iis-url
- http://serverfault.com/questions/257680/properly-handle-iis-request-with-percent-sign-in-url
chrome デベロッパーツール jsの確認

#chromeのデベロッパーツールの使いかた

jsの確認するときは`console.log('hoge');`をよくつかうけど
デベロッパーツールで良さげな機能あるのを聞いたので
sourcesでjsを確認するとき、`add to watch`で変数の中身をみれる

※画像はイメージです
![1.png](https://qiita-image-store.s3.amazonaws.com/0/106705/46f622b2-343e-5908-39c7-0e8b67f39c39.png)

例：上の画像は違うけどthisとか使うとき
thisを選択するとイベント毎にそのthisの値をみれる
CZMLのUnitQuaternionの設定

#unitQuaternionの計算
cesiumのczmlで3dモデルを移動させようと思うとunitQuaternionというのを
設定しないといけない。

しかし座標系も緯度経度でないし、往生していたのだが、sandcastleのinterpolationというサンプルにVelocityOrientationProterty(position)というので設定してある。これで計算すればいいのだ！というのでnodeで動かしてみると、defineがない！と言われる・・

というわけで苦労してnodeでcesiumのライブラリを動かしつつunitQuaternionを計算するプログラムをアップしておく。

まあ、これを拡張してczmlを自動で読んで、かってにorientationを追加したczmlを吐き出すというようにすればいいんでしょうけど、まずはご報告

```JavaScript:disp.js
r=require('requirejs');
r.config({
    BaseUrl:"./Source",
    paths:{
        Cesium:"./Source"
    }
})
var C=r('./Source/Cesium.js');

var po=new C.SampledPositionProperty();
var t1=C.JulianDate.fromDate(new Date(2012,10,10,10));
var t2;
t2=C.JulianDate.addSeconds(t1,300,new C.JulianDate());
p1=C.Cartesian3.fromDegrees(135.0,35.0,0);
po.addSample(t1,p1);
p2=C.Cartesian3.fromDegrees(134.0,35.0,10000);
po.addSample(t2,p2);
var ori=new C.VelocityOrientationProperty(po);
var q1=new C.Quaternion();
var q2=new C.Quaternion();
ori.getValue(t1,q1);
ori.getValue(t2,q2);
console.log(q1);
console.log(q2);
```
ConoHaのVPSにCoreOSをインストール


# はじめに
情報が古いものが多くて悩んだのでメモ。相変わらずGMOのサービスはわかりづらいつらい。

# 手順

### 1. サーバを追加
希望のスペックで作成。OSはCoreOSをインストールするのでなんでも良し。

### 2. サーバをシャットダウン
ISOをマウントできるように一回落とす。

### 3. APIユーザ作成
API→APIユーザ作成からつくる。

そのページで

- テナントID
- APIユーザのユーザ名
- 入力したパスワード

をメモしておく


### 4. 手元のPCでCLIでの操作ツールをダウンロード

```
$ mkdir tmp
$ cd tmp
$ curl -sL https://github.com/hironobu-s/conoha-iso/releases/download/current/conoha-iso-osx.amd64.gz | zcat > conoha-iso && chmod +x ./conoha-iso
```


### 5. iosイメージのダウンロード


```
$ export OS_USERNAME=<ユーザ名>
$ export OS_PASSWORD=<パスワード>
$ export OS_TENANT_ID=<テナントID>
$ export OS_REGION=tyo1
./conoha-iso download -i "http://stable.release.core-os.net/amd64-usr/835.13.0/coreos_production_iso_image.iso"
```

上記を実行した後、下記を実行したときにイメージが表示されるまで待つ。URLでキャッシュしてるぽいので、バージョンを指定してダウンロードしないと古いものがダウンロードされてしまった。conohaが悪いのかconoha-isoが悪いのかは知らない。

```
./conoha-iso list
```

### 6. イメージのマウント

`./conoha-ios insert` を実行する

```
$ ./conoha-iso insert
[1] main-coreos (133-130-114-155)
Please select VPS [1]: 1

[1] coreos_production_iso_image.iso
Please select ISO [1]: 1
INFO[0004] ISO file was inserted and changed boot device.
```

### 7. サイトからVPSを起動し、コンソールを立ち上げてインストール処理

ここにしたがって進める https://www.conoha.jp/conoben/archives/4282

サーバのページのネットワーク情報のところでIPアドレスを見れるのでメモっておく。

#### パーティションを削除
```
$ sudo fdisk /dev/vda
p
d
d
wq
```

#### パスワード設定

```
$ sudo passwd core
```

これで使いづらいコンソールではなくSSHで操作できるようになる

#### ローカルPCからsshログイン

```
$ ssh core@[サーバIP]
```


#### cloud-config.yamlを作成

下記のcloud-config.yamlを作成。（公開鍵は書き換え必須）


```
$ vi ~/cloud-config.yaml
```

```cloud-config.yaml
#cloud-config

ssh_authorized_keys:
  - ssh-rsa AAAAB...
```

#### インストール

```
$ sudo coreos-install -d /dev/vda -C stable -c ~/cloud-config.yaml
```


### 8. シャットダウン

```
$ sudo poweroff 
```

### 9. ISOをイジェクト

```
$ ./conoha-iso eject
[1] main-coreos (133-130-114-155)
Please select VPS [1]: 1
INFO[0005] ISO file was ejected.
```

### 10. 再度VPSを起動

設定した鍵を使ってSSHログインできればおｋ

### 11. イメージ保存しておく

もうめんどくさいのやりたくないので、一回シャットダウンしてイメージを保存しておくのが良さそう。
js 地域LPO

#どこどこJPというサービスを使うときのメモ
サイトで都道府県を表示させる
docodocoはドメイン1つで同じものを使うので、下層ページならトップページに合わせる
callbackで変数を指定する
下記はイメージ


```php:読み込むjs
<!-- LPO -->
<script src="../js/prefecture-setter.js"></script>
<script src="//hogehoge.com/api/v1/docodoco/5555555-5555-5555-5555-5555555555555.json?callback=setPrefecture"></script>
<!-- LPO -->
```

prefecture-setter.jsの中身
上で読み込んだjsのコールバックで下記の関数を呼び出す

```js:prefecture-setter.js
;function setPrefecture(json){
	var data = JSON.parse(json.data);

	//都道府県を取得
	var prefJName = data.PrefJName;

	/*
	## 都道府県
	*/
	;(function(){
		var pref;
		switch(prefJName){
			case '北海道':
				pref = prefJName;
				break;

			case '東京':
				pref = prefJName + '都';
				break;

			case '京都':
			case '大阪':
				pref = prefJName + '府';
				break;

			default:
				pref = prefJName + '県';
				break;
		}
		$('.pref-txt').text(pref);
	})();

};
```

こんなかんじで都道府県ごとにテキストは吐き出させる
git コマンドメモ

#git でよく使うコマンドメモ

```
$git status
$git fetch
$git pull
$git add パス
$git add .
$git commit -m"コミットメッセージ"
$git commit -v
$git push
$git checkout ブランチ名
$git merge ブランチ名
$git branch ブランチ名
$git stash
$git stash apply
$git stash clear
$git log
$git show
$git grep "文字列" -- "*.ファイル形式"
$git grep "<<< HEAD"
$git blame
$git reset --soft
$git reset --hard
$git reset --mixed
$git reset HEAD^
```
Oneops使ってみる#1

#ONEOPSとは？
アメリカ小売店のWALLMARTが公開したOSSです。
様々な環境構築とデプロイを実現するツールみたいなものでしょうか。
OPENSTACK、AWS、AZURE、Rackspace、CenturyLinkのクラウドに対応していて
Node.js、Dockerなんかも対応していました。
詳しくはこちら
http://oneops.com/integrations.html

本家サイトはこちらです。
http://oneops.com/
![image](https://qiita-image-store.s3.amazonaws.com/0/63125/e5c6e339-ae9c-f904-ac5c-39c72a3e72ac.png)

#ONEOPS環境の構築
さてまずは環境を構築しています。
方法は２つ。
１つはVagrantを利用するパターン、もいっこはAWSのAMIを使うパターン。
vagrantはさくらさんのブログでも紹介されていました。

http://knowledge.sakura.ad.jp/tech/4241/

http://oneops.github.io/admin/getting-started/
を見るとAWSのAMIはバーンジニアしかないみたいなので、
バージニアでまずはローンチ。AMI検索画面で「ONEOPS」で検索すると出てきます。
![image](https://qiita-image-store.s3.amazonaws.com/0/63125/21cd69e2-f18e-8229-1805-3331dd8b84b8.png)

リファレンスには、8G推奨なので、m4.largeをスポットインスタンスで使います。
ローンチしたら、http://IP:3000にアクセスしましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/63125/abee43bb-14b1-0b23-9162-3fb772287cb3.png)

こんな感じにログイン画面が表示されます。
ポートが3000なのは、rubyだからでしょうかね。sshでサーバーに繋いで、環境を見てみます。
3000つけるのめんどくて、「/opt/oneops/config/boot.rb」に以下を追加。

```rb:/opt/oneops/config/boot.rb
require 'rails/commands/server'
module Rails
  class Server
    def default_options
      super.merge({
        :Port => 80
      })
    end
  end
end
```

でサーバー再起動
$ sudo service display restart  

3000なしでつながりました。
初期ユーザーは「oneops:oneops」で設定されています。

![image](https://qiita-image-store.s3.amazonaws.com/0/63125/fb75ca91-c70b-f588-0a9e-8b0557a20148.png)

右上のPROFILEからパスワード変更しましょう
![image](https://qiita-image-store.s3.amazonaws.com/0/63125/19556033-2fe4-0fae-05b4-d20999048a12.png)

と思ったらエラーすか。そうですか。。。
![image](https://qiita-image-store.s3.amazonaws.com/0/63125/f427a884-8404-224c-7af3-f507eeec4d0d.png)

なんかユーザー追加できなかったりグループが追加できずに今日は時間切れ。
次回はここから始めたいところ。
ubuntuのapache2のドキュメントルート変更

```lang:/etc/apache2/apache2.conf
163                                                                                                                                                                                                                                                                           
164 <Directory /var/www/>                                                                                                                                                                                                                                                     
165     Options Indexes FollowSymLinks                                                                                                                                                                                                                                        
166     AllowOverride None                                                                                                                                                                                                                                                    
167     Require all granted                                                                                                                                                                                                                                                   
168 </Directory>
```

を通したいパスへ変更する

```lang:/etc/apache2/apache2.conf
163                                                                                                                                                                                                                                                                           
164 <Directory /home/ubuntu/www>                                                                                                                                                                                                                                                     
165     Options Indexes FollowSymLinks                                                                                                                                                                                                                                        
166     AllowOverride None                                                                                                                                                                                                                                                    
167     Require all granted                                                                                                                                                                                                                                                   
168 </Directory>
```

apacheの再起動
```sudo /etc/init.d/apache2 restart
```
MySQLでファイルのデータをテーブルに挿入する

MySQLでのファイルからのデータ挿入方法について。
バージョン5.7.11でmysqlクライアントを使用して確認しています。

## LOAD DATA INFILE

LOAD DATA INFILE を使用してファイルをテーブルに登録することができます。

### 構文

サーバ上のファイルを使用する場合

```sql
LOAD DATA INFILE 'ファイル名' INTO TABLE テーブル名
```

ローカルファイルを使用する場合

```sql
LOAD DATA LOCAL INFILE 'ファイル名' INTO TABLE テーブル名
```

### 例

```bash
mysql> system sudo cat /var/lib/mysql-files/test.tsv;
1	isono
2	fuguta

mysql> SELECT * FROM test;
Empty set (0.00 sec)

mysql> LOAD DATA INFILE '/var/lib/mysql-files/test.tsv' INTO TABLE test;
Query OK, 2 rows affected (0.00 sec)
Records: 2  Deleted: 0  Skipped: 0  Warnings: 0

mysql> SELECT * FROM test;
+------+--------+
| id   | name   |
+------+--------+
|    1 | isono  |
|    2 | fuguta |
+------+--------+
2 rows in set (0.00 sec)
```

### secure_file_priv

LOCALオプションを使用せずにサーバ上のファイルを使用する場合で、サーバオプションのsecure_file_privが設定されている場合には、設定されたディレクトリ以外からの入力はエラーになります。

```bash
mysql> SELECT @@secure_file_priv
    -> ;
+-----------------------+
| @@secure_file_priv    |
+-----------------------+
| /var/lib/mysql-files/ |
+-----------------------+
1 row in set (0.00 sec)

mysql> LOAD DATA INFILE '/tmp/test.tsv' INTO TABLE test;
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
```


### FIELDSオプションとLINESオプション

先の例では区切り文字はタブで認識されています。
FIELDSオプションを使用すれば区切り文字を、LINESオプションを使用すれば改行コードを修正できます。

```bash
mysql> system sudo cat /var/lib/mysql-files/test.csv;
1,"磯野"
2,"フグ田"

mysql> SELECT * FROM test;
Empty set (0.00 sec)

mysql> LOAD DATA INFILE '/var/lib/mysql-files/test.csv' INTO TABLE test
    -> FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"'
    -> LINES TERMINATED BY '\r\n';
Query OK, 2 rows affected (0.01 sec)
Records: 2  Deleted: 0  Skipped: 0  Warnings: 0

mysql> SELECT * FROM test;
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | 磯野      |
|    2 | フグ田    |
+------+-----------+
2 rows in set (0.00 sec)
```
メニューが上からふわっと出てくるjQuery plugin「overly_menu」

# overly menu

メニューが上からふわっと落ちてくるpluginを作成しました。

## デモ
![demo_simple.gif](https://qiita-image-store.s3.amazonaws.com/0/63056/79c61bbc-336e-a67f-a4c1-22da0bcf33d8.gif)

## 使い方
htmlファイルの`<head>`内に以下を記述

```html:inedex.html
<head>
  <link rel="stylesheet" href="style/jquery.overly.min.css" />
  <script src="javascript/jquery.overly.js"></script>
</head>
```

`</body>`の直前に以下を記述

```html:inedex.html
<script>
  $(function() {
    $('#overly_menu').overly_menu();
  });
</script>
```

## オプション
'speed': 上から降りてくる速さ
'color': メニューの背景の色
'opacity': メニューの背景の透明度
'style': メニューの並び方
'hover': メニューにmouseoverした時の挙動

### デフォルト設定

```html:inedex.html
$(function() {
  $('#overly_menu').overly_menu({'speed': 300,
    'color': 'rgba(0, 0, 0, 0.8)',
    'opacity': 0.8,
    'style': 'list',
    'hover', 'font-size'
  });
});
```

[Download .zip(mac)](http://www.sottar.net/dist/overly_menu_master.zip)
[source(github)](https://github.com/sottar/overly_menu)


要望やbugがあればコメントやissue、プルリクからお願いします。
まだまだ開発途中なので、使いづらいところも多いと思いますがよろしくお願いします！
STM32CubeMXでSTM32F4Discoveryを動かす1~Lチカ編~

#はじめに
　筆者がはじめてSTM32マイコンに触れたのは2012年である。ちなみにマイコンそのものを学び始めたのも同時期だ。
　その頃はプロジェクトを作成する際に利用するライブラリとして「StandardPeripheralLibrary」(以下SPL)が主流であったと記憶している。
　時は経ち久々にSTM32をいじろうかと思ったところ、どうも状況が様変わりしているようである。CubeMXだのHALライブラリだの見慣れない用語が飛び交っている。この辺の事情は[STM32 - 詳細表示 - チカラの技術 - Yahoo!ブログ](http://blogs.yahoo.co.jp/yukukawano9/folder/22662.html?m=lc
)で解説されている。

　ST社が「これからはHALライブラリを使ってね」ということではそれに従わざるをえないだろう。CubeMXというGUIでのコード生成ツールも使い勝手が良さそうだ。これまでプロジェクトを新たに作成する際にはクロックの設定やそれに紐づくタイマの設定などに手こずっていたりしたが、GUIで一括管理できると意図せぬコーディングミスが潜む確率も格段と下がるだろう。

　SPLとHALライブラリとの間には全く互換性がないそうだ。CubeMXの恩恵を授かるにはHALライブラリについて一から学び直さなければならない。使ってみないとわからないことも多いので、まずは手持ちのSTM32F4DiscoveryをCubeMX+HALライブラリでいろいろいじってみようと思う。

#開発環境
　筆者の開発環境は以下のとおりである。

- OS: Windows7 32bit (VirtualBox上にインストールした)

- IDE: Keil MDK-ARM v5.18

- マイコンボード: STM32F4Discovery

　CubeMXを使って開発するためにはCubeMX本体とSTM32マイコンの各シリーズに対応するパッケージ（今回の場合STM32F4用）が必要である。

　CubeMXのインストーラは[公式サイト](http://www.st-japan.co.jp/web/jp/catalog/tools/PF259242)から入手できる。

　STM32F4のパッケージはCubeMXを起動し、メニューバーの[Help]-[Install New Library]から「Firmware Package for Family STM32F4」を選択して[Install Now]をクリックすることで入手できる。

#手順
 CubeMXを使った具体的なプロジェクト作成手順を説明する。

1. CubeMXを起動し、[New Project]を選択する。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/96262/40940fc3-95a9-1e28-a9d6-d7a526a29904.png)

2. [Board Selector]タブから、下図のようにボードの種類を選択し、[OK]をクリックする。
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/96262/08c7ed5b-18be-383a-dd00-b8978422527d.png)

3.マイコンの各ピンを設定するための画面が現れる。今回は何も設定をいじらず、このままの状態で進める。
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/96262/5d766770-6dbe-668a-bdd2-b459aff0e0fa.png)

4.コード生成のアイコンをクリックする。
![図4.png](https://qiita-image-store.s3.amazonaws.com/0/96262/80a2d89c-7d38-ac76-8950-96f79bcc03f4.png)

5.[Project Name]や[Project Location]を入力する。[Toolchain/IDE]は筆者環境の場合[MDK-ARM v5]を選択する。入力が済んだら[OK]をクリックする。
![図5.png](https://qiita-image-store.s3.amazonaws.com/0/96262/9c831443-cc48-43c9-4a67-4d53c9d9255a.png)

6.コード生成が完了すると下図のようなウィンドウが現れる。[Open Project]をクリックする。
![図6.png](https://qiita-image-store.s3.amazonaws.com/0/96262/25ff0263-8e0f-a068-adc0-65b7b60ff2a1.png)

7.先ほど指定した[ToolChain/IDE]に対応するIDE(筆者の場合Keil MDK-ARM v5)が起動する。プロジェクトファイルの中から[main.c]をダブルクリックし、編集画面を表示させる。
![図7.png](https://qiita-image-store.s3.amazonaws.com/0/96262/00c8c7c2-bacd-8728-23fd-607b9b020f4e.png)


8.[main.c]のmain()関数内にあるwhile文の中に以下のコードを追加する。

```c:main.c
HAL_Delay(500);
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
```

![図8.png](https://qiita-image-store.s3.amazonaws.com/0/96262/42e51708-e491-a096-be9d-1a1dfa9085c7.png)

9.STM32F4DiscoveryをPCに接続し、①コンパイル、②書き込み　のアイコンを順番にクリックする。
![図9.png](https://qiita-image-store.s3.amazonaws.com/0/96262/7a644818-daae-56bc-7851-c14b397fadb7.png)


#結果
　上記手順に従ってプロジェクトを作成し、STM32F4Discoveryにプログラムを書き込むと、LD3(オレンジ色のLED)が1秒周期で点滅を繰り返すことが確認できた。

#感想
　驚くほど簡単にプロジェクトを作成することができた。STM32F4Discoveryに至っては周辺回路や付属するデバイスを有効化するためのソースコードが自動生成されるので、動作させたいプログラムだけに集中してコーディングを進めることができる。
　HALライブラリに関しては確かにSPLとは記法が全く異なるが、ライブラリの中身を見ると使い方が説明されていたりするのでさほど覚え直すのに苦労しなさそうである。
LINQで簡易コマンドラインオプション解析

# C#でコマンドラインオプション解析したい #

C#でコマンドラインの簡単なコマンドラインオプションの例ないかな。と思って以下の記事を見つけました。6年くらい前の記事です
[Linqでコマンドラインオプション解析](http://neue.cc/2009/12/13_229.html)

これ以外の記事は複雑すぎて簡単に適当にいい加減に解析するには少し大きすぎるかな？という様子です。
やはり、C#ってそういう用途に選ばれにくい？


上の記事なんですけれど、使っていてみて少し使いにくいなーという部分がありました。


* 渡されていないオプションは辞書に入ってこない

つまり、辞書に値が入っているかのチェックしてから取り出さないと例外出す

ということは入ってるときと入ってない時があるオプションは、こうかかなきゃいけないわけですよ

```csharp

T val;
if(dictionary.TryGet("キー",out val))
{
  //val
}
```


これ簡易に何かしたい時には長過ぎるなーと思うわけです。だからオプションが入ってない時はnullとか入っててほしい。
これだけなんですけど結構イライラー

* 地味にキーに-が入ってる

これはString.Substringで1文字削ればいい

結果こんなかんじになりました。

```csharp
        static void Main(string[] args)
        {   
            //こんな感じで引数来るよね
            args = "-i 18 -hoge -huga haga -o in.txt".Split(' ');

            args = args.Concat(new string[] {""}).ToArray(); // オプションのみと　そもそも入っていないの識別
            var options = new string[] {"-i", "-hoge", "-huga", "-o"};

            var result = options.ToDictionary(p => p.Substring(1), p => args.SkipWhile(a => a != p).Skip(1).FirstOrDefault());
               
            //パラメータなし引数は値がnullでないかでチェック
            if(result["hoge"] != null) Console.WriteLine("hogeがあります");

            foreach (var param in result)
            {
                Console.WriteLine(param.Key + "=" + param.Value);
            }

        }
```

実行結果

>hogeがあります
i=18
hoge=-huga
huga=haga
o=in.txt
message station > ..v0.29 > メッセージ保持機能実装完了 > EEPROMライブラリ使用

https://hackaday.io/project/9526-bring-your-own-pizero-byop
でBYOPの核となるMessage stationの実装

http://qiita.com/7of9/items/a1aee7c4b8f0d4bc8d9b
の続き

## code v0.29

[v0.29 @ github](https://github.com/yasokada/esp8266_160220_BYOP/releases/tag/v0.29)

### SPIFFSの落とし穴

SPIFFSライブラリを使ってメッセージを保持しようとしたら、他の自作ライブラリが宣言されてないというエラーが出るようになった。

@exabugs さんの記事にて同じFlashに書き込む別の方法としてEEPROMライブラリがあることを覚えていたので、そちらを使うことにした。
http://qiita.com/exabugs/items/0220edd4c9bf93da981b

EEPROMライブラリは uint_8 型での書込みなので、ラッパー関数を自作して使用した。
[filesysLib.ino](https://github.com/yasokada/esp8266_160220_BYOP/blob/master/esp8266_160227_filesysLib.ino)

### ファイル構成

ファイル構成は以下となった。

- dataStructure.h
- esp8266_160217_AQM0802.ino
- esp8266_160220_BYOP.ino
- esp8266_160220_StringLib.ino
- esp8266_160220_UARTlib.ino
- esp8266_160220_dataLib.ino
- esp8266_160221_msgStorageLib.ino
- esp8266_160227_filesysLib.ino
- msgStorage.h

今回追加した esp8266_160227_filesysLib.ino は他のプロジェクトでも使えるように実装したつもりであるが、依存性が何か残っているかもしれない。
debug_outputDebugString()はデバッグ出力用なので、ダミー関数を用意することでesp8266_160227_filesysLibを他プロジェクトで使えると思うが未確認。


## シリアルコマンド

通信プロトコル
http://qiita.com/7of9/items/a62a6f21b00923fe3658


## 使用例

### シリアルモニタの入力例

```
hello,1,7of9
check
post,Vital,hello_Vital,0
bye
```

<font color=red>電源を切る</font>
電源を入れる : Flashからメッセージが読み込まれる


```
hello,2,Vital
check
get
bye
```

### シリアルモニタの出力例

```
hello,7of9
check,0
post,ok
bye,7of9
```

```
hello,Vital
check,1
get,hello_Vital,0
bye,Vital
```

## メッセージクリア

v0.24においてメッセージをクリアするコマンドも入れておいた。
主にテスト用。

```
// serail number of the 1st commit of [esp8266_160220_BYOP]
static const String kAuthorizationCode = "7975f53";
```
として定義しているコードを合わせて以下でメッセージをクリアできる。

```
clear,7975f53
```

kAuthorizationCodeを入れているのは誤操作防止。

VoyagerやNextGenerationとかだと、艦長、副長、中佐くらいのAuthorizationCodeを合わせることで船の自爆シーケンスを開始できるのだが、敵役のボーグ(or カーデシア人 or ロミュラン人)が停止してくれる親切設計。



## TODO

DONE: メッセージpost時の日時を保持する処理が未実装
Laravel5 Intervention Image 2.xを利用した画像加工


[Intervention Image](http://image.intervention.io/getting_started/installation)

## 構成
 * CentOS7
 * PHP 5.4
 * Laravel 5


## 準備
### システム要件を確認
 * PHP >= 5.4
 
```
# php -v 
PHP 5.4.16 (cli) (built: Jun 23 2015 21:17:27) 
```
 * Fileinfo Extension
 
```
# php -r 'phpinfo();'
fileinfo support => enabled
version => 1.0.5
```

* GD Library (>=2.0) … or …

```
# php -r 'var_dump(gd_info());'
array(12) {
  ["GD Version"]=>
  string(26) "bundled (2.1.0 compatible)"
}
```

* Imagick PHP extension (>=6.5.7)

```
# php -r 'print_r(imagick::getVersion());'
Array
(
    [versionNumber] => 1656
    [versionString] => ImageMagick 6.7.8-9 2014-06-10 Q16 http://www.imagemagick.org
)

```

GDを利用するか、Imagickを利用するか……。


## インストール
### Imagickのインストール
[Imagickのインストール](http://qiita.com/m1takahashi/items/712db05253f28d7e34d4)
 
### GDのインストール

```
# yum install php-gd
```


###LaravelにInterventionImageをインストール
 * インストール

```
# /usr/local/src/composer.phar require intervention/image
```

* Laravelへ統合

```PHP:config/app.php
'providers' => [  
    'Intervention\Image\ImageServiceProvider',
],
'aliases' => [ 
    'Image' => 'Intervention\Image\Facades\Image',
],
```

* 設定ファイルの生成

```
# php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5"
```

* 設定ファイル編集

```PHP:config/image.php
return array(
    // GDか、Imagickどちらかを指定 
    //'driver' => 'gd'
    'driver' => 'imagick'
);
```

### サンプルコード
```PHP:app/Http/routes.php

Route::get('/', function() 
{ 
    $img = Image::make('http://upload.wikimedia.org/wikipedia/commons/2/2a/2008_ZB_Viper_SRT-10_blue.jpg')->resize(150, 100);
    return $img->response('jpg');   
});
```
map の関数の呼び方 トリビア

# はじめに

- この記事は単なるトリビアです。~~へぇ〜へぇ〜へぇ〜~~

##省略形の書き方

- 以下のように書けるのは多分みんな知ってる

```rb
pry(main)> [1, 2, 3].map{|num| num.to_s }
=> ["1", "2", "3"]

pry(main)> [1, 2, 3].map(&:to_s)
=> ["1", "2", "3"]
```

##今回のケース

- あくまでNumberオブジェクトの`to_s`を呼んでいますが、同じスコープの関数を以下のように`map(&method(:method_name))`の形で、呼ぶことが出来ます。
- ~~アン◯ニオ猪木は「出る前に負けること考えるバカいるかよ」と言ってアナウンサーをビンタしてムチウチにした経歴があります => [参考](https://ja.wikipedia.org/wiki/%E4%BD%90%E3%80%85%E6%9C%A8%E6%AD%A3%E6%B4%8B_(1954%E5%B9%B4%E7%94%9F))~~

```rb
pry(main)> def inoki(num)
             "#{num.to_s} dar!"
           end
=> :inoki

[2] pry(main)> [1, 2, 3].map(&method(:inoki))
=> ["1 dar!", "2 dar!", "3 dar!"]
```

- 書いといてなんですが、引数が省略されてるのでちょっと気持ち悪いですね

## 元ネタ

- [Cocaine](https://github.com/thoughtbot/cocaine) という Gem でこんな書き方あるんや〜って思って ~~パクリ~~　真似しました。

[この辺り](https://github.com/thoughtbot/cocaine/blob/master/lib/cocaine/command_line.rb#L174-L176)です。

```rb
def shell_quote_all_values(values)
  Array(values).map(&method(:shell_quote)).join(" ")
end
```
Rails 4.2からのメーラのテストの Tips

# もしかして

**今更レールズ4.2の話ですか？**

## 概要

- rails4.2 から ActionMailer が ActiveJob を介して送信できるようになりました。
- `ActionMailer.send_user_mailer(user_id: 20).deliver_later`とかで自動的に非同期送信を勝手にやってくれることになります
- そういったTipsを掲載することにいたします。

## 問題点

- メール送信処理が非同期なので、テストコード上では把握しにくいことが問題です（~~あ、これ実装によるわ、同期的に処理する実装でもいい。いいけど遅いっすよね。~~）

## 対策

### ActiveJobの非同期を解除する

- モンキーパッチを当てて非同期を解除します
  - こうしてやることでメールの送信は全て同期的に動きます。
  - 把握しやすいです。

```rb:spec/support/message_delivery.rb
class ActionMailer::MessageDelivery
  def deliver_later
    deliver_now
  end
end
```

## MailerのAssertion

### 送信されたメールのオブジェクト

- 下記のように持ってくると送信されたメール一覧の取得が可能です。
- mailオブジェクトのインスタンスが取得出来ます。
- 注意すべきは、`ActionMailer::Base.deliveries`はあくまでメモリ上に展開された**グローバルオブジェクト**なので、テストが終了後にも送信されたメールが逐次appendされる（と思います。）[ソース](https://github.com/rspec/rspec-rails/issues/696)

```rb
> ActionMailer::Base.deliveries 
# => #<Mail::Message:69916429804920, Multipart: false, Headers: <From: no-reply@sample.jp>, <To: John12364836@example.com>, <Subject: レールズは5.0にアプデして多分苦しくなるんだろうなぁ　みつを>, <Mime-Version: 1.0>, <Content-Type: text/plain>>
```

- メールが毎回消されるようにするには、Rspecのタイプを`mail`することで解決可能です。

### テスト毎にメールを消す

- 以下のファイルに以下のように書いておくと、`type :mail`以外でも消えてくれると思います。

```rb:spec/support/mailer_macros.rb
module MailerMacros
  def reset_email
    ActionMailer::Base.deliveries = []
  end

  def delivery_mails
    ActionMailer::Base.deliveries.map(&:to).flatten
  end
end
```

```rb:spec/rails_helper.rb
RSpec.configure do |config|
  config.include MailerMacros
  config.before(:each) { reset_email }
```


## 参考文献等

- 以下の書籍で僕は学習しました。良い本だな、と思います。

[Everyday Rails - RSpecによるRailsテスト入門 - テスト駆動開発の習得に向けた実践的アプローチ](https://leanpub.com/everydayrailsrspec-jp)
LaravelのdropForeignでつまづいたのでメモ

## 概要
**dropForeignメソッドの引数はカラム名ではない！**
他のカラムを設定するメソッドのincrementsメソッドやintegerメソッドと同様にそのテーブルを指した状態でカラム名を指定してあげればdropForeignが正しく実行できると勘違いしていました。

## 実行
下記のようなデータ構造で、マイグレーションを実行すると外部キーが除外され、ロールバックで再度、外部キーが設定されるようにしてみました。

- テーブル名：books
- カラム名：category
- 外部キー設定先テーブル名：book_categories
- 外部キー設定先カラム名：id

```php
public function up()
{
	Schema::table('books', function (Blueprint $table) {
		$table->dropForeign('category');
	});
}

public function down()
{
	Schema::table('books', function (Blueprint $table) {
		$table->foreign('category')->references('id')->on('book_categories');
	});
}
```


## エラー
上記のマイグレーションを実行すると以下のエラーが発生します。

```
  [Illuminate\Database\QueryException]
  SQLSTATE[HY000]: General error: 1025 Error on rename of './test/books' to './test/#sql2-102f-174' (errno: 152) (SQL: alter table `books`
   drop foreign key `category`)



  [PDOException]
  SQLSTATE[HY000]: General error: 1025 Error on rename of './test/books' to './co_tech/#sql2-102f-174' (errno: 152)
```

## 修正
原因としてはフォーリンキーの指定がいけないようです。


```php
$table->dropForeign('[テーブル名]_[フォーリンキーを取り除くカラム名]_foreign');
```
上記の通り、dropForeignの引数には、[テーブル名]_[フォーリンキーを取り除くカラム名]_foreignという形になります。


最終的に下記のような形で実行できました。

```php
public function up()
{
	Schema::table('books', function (Blueprint $table) {
		$table->dropForeign('books_category_foreign');
	});
}

public function down()
{
	Schema::table('books', function (Blueprint $table) {
		$table->foreign('category')->references('id')->on('book_categories');
	});
}
```

これでまたマイグレーションで幸せに！
Defensive Copy

##Not-ImmutableなDateManagerクラス
todayへの参照がDateManagerインスタンスの生成時に渡されてしまい、
外部から値が変更できてしまう。

```
public class DateManager {

	private Date day;
	
	public DateManager(Date day){
		this.day = day;      // ・・・Bad 
	}
	
	public Date getMyDay(){
		return day;          // ・・・Bad
	}
	
	public String toString(){
		return day.toLocaleString();
	}
	
	public static void main(String[] args){
		Date today = new Date();
		DateManager dm = new DateManager(today);
		
		System.out.println(dm); // 2016/02/27 13:18:17
		day.setHours(11);	
		System.out.println(dm); // 2016/02/27 11:18:17
	}
}
```

##ImmutableなDateManagerクラス
オブジェクトを共有しないように新しいDate型を生成する。
Cloneでも良さそうだがクラスに参照型オブジェクトや配列のフィールドがあると、
オブジェクトを共有する形でコピーを作成するため問題が解決しない。

```
public class DateManager {

	private Date day;
	
	public DateManager(Date day){
		this.day =　new Date(day.getTime()); 
	}
	
	public Date getMyDay(){
		return new Date(day.getTime());      
	}
	
	public String toString(){
		return day.toLocaleString();
	}
	
	public static void main(String[] args){
		Date today = new Date();
		DateManager dm = new DateManager(today);
		
		System.out.println(dm); // 2016/02/27 13:18:17
		day.setHours(11);	
		System.out.println(dm); // 2016/02/27 13:18:17
	}
}
```
MySQLで抽出結果をファイルに出力する方法


MySQLでのファイル出力方法について。
バージョン5.7.11でmysqlクライアントを使用して確認しています。

## SELECT INTO OUTFILE を使用する

サーバ上のファイルに出力します。

### 構文

以下の構文で抽出結果をファイルに出力することができます。

```sql
SELECT フィールド名 FROM テーブル名 INTO OUTFILE 'ファイル名'
```

### 例

```bash
 SELECT * FROM test;
+------+---------+
| id   | name    |
+------+---------+
|    1 | isono   |
|    2 | fu”guta |
+------+---------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM test INTO OUTFILE '/var/lib/mysql-files/test.dmp';
Query OK, 2 rows affected (0.00 sec)

mysql> system sudo cat /var/lib/mysql-files/test.dmp
1	isono
2	fu"guta
```

### secure_file_priv

サーバオプションのsecure_file_privが設定されている場合は、設定されたディレクトリ以外への出力はエラーになります。

```bash
mysql> SELECT @@secure_file_priv;
+-----------------------+
| @@secure_file_priv    |
+-----------------------+
| /var/lib/mysql-files/ |
+-----------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM test INTO OUTFILE '/tmp/test.dmp';
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
```

### FILESオプションとLINESオプション

各フィールドはタブで区切られています。
FIELDSオプションを使用すれば区切り文字を、LINESオプションを使用すれば改行コードを変更できます。

```bash
mysql> SELECT * FROM test INTO OUTFILE '/var/lib/mysql-files/test.dmp'
    -> FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
    -> LINES TERMINATED BY '\r\n';
Query OK, 2 rows affected (0.00 sec)

mysql> system sudo cat /var/lib/mysql-files/test.dmp
1,"isono"
2,"fu\"guta"

```

"がエクケープされていること確認できます。

### ヘッダをつける

ヘッダをつけるオプションはないようです。
以下の例ではUNIONでヘッダをつけています。

```bash
mysql> SELECT 'id', 'name' UNION SELECT * FROM test INTO OUTFILE '/var/lib/mysql-files/test2.dmp';
;
Query OK, 3 rows affected (0.00 sec)

mysql> system sudo cat /var/lib/mysql-files/test2.dmp
id	name
1	isono
2	fu"guta
```

## リダイレクトによる出力

リダイレクトを使用した出力も可能です。

```bash
shell> echo 'SELECT * FROM test' | mysql -u root -p test > /tmp/test.dmp
Enter password: 
shell> cat /tmp/test.dmp
id	name
1	isono
2	fu"guta
```
El Capitanをクリーンインストールしたので、一からRuby開発環境を作ってみる


##### sublimetext3のインストール
テキストエディタ
https://www.sublimetext.com/3


##### homebrewのインストール
homebrewはOS X　用のパッケージマネージャー

homebrewのホームページを参照し、homebrewをインストールする(下記のURL)
http://brew.sh/index_ja.html


##### homebrewのupdate 

```bash
$ brew update
```

##### rbenvのinstall
rbenvはrubyの開発環境を便利にするコマンド
rubyをインストールしたり、インストールした複数のrubyのバージョンを切り替えたり、アプリごとに環境を切り分けたりができる
https://github.com/rbenv/rbenv

rbenvのインストール

```bash
$ brew install rbenv
$ brew install rbenv-gemset
```

##### rubyのインストール

```bash
$ rbenv install -l # インストールできるrubyの一覧を表示
$ rbenv install 2.3.0 # 現時点での最新安定バージョンをインストール
```	

```bash 
$ benv global 2.3.0 # 全環境共通のバージョン指定
```

##### bundlerのインストール

bundlerはruby gemsのパッケージマネージャー

```bash
$ gem install bundler
```
You don't have write permissions into the /Library/Ruby/Gems...　エラーが出る場合
https://github.com/rbenv/ruby-build/issues/168