OmniAICreator/Qiita-1.07M huggingface dataset:
派遣エンジニアのススメ（2015年版）

昨今、非正規雇用であることがさも悪いことのように扱われています。 

本当にそうなのでしょうか？

少なくともIT系のエンジニアであれば非正規雇用は決して悪くはありません。
むしろオススメしたいくらいです。

派遣エンジニアのおすすめポイントを私の経験（派遣側、採用側）を踏まえメリットとデメリットをまとめます。
あなたの現在の状況と照らし合わせ考えてみてください。

# **メリット**
・ブラック企業に出会いにくい
・技術スキルが上がる
・コミュニケーションコストが低い
・嫌な職場は簡単に変更できる
・様々な職場を見ることができる
・実力次第で年齢は関係ない
・社会保障がついている
・正社員への近道
・しばらく仕事に困らない
・仕事は派遣会社が見つけてくれる
・派遣会社があなたを守ってくれている
・失業保険がすぐおりる
・定時で帰りやすい
・残業代は割り増しで全て支払われる
・人脈ができる

# **デメリット**
・非正規雇用である
・派遣会社の中間搾取がある
・職が安定しない
・開発機がダサい

# **最後に**
重要なポイントとして派遣会社の選択が重要です。
いい派遣会社であればあなたをブラック企業から守ってくれますが、悪い派遣会社だと派遣会社そのものがブラックだったりします。

内容の解説は私の[ブログ](http://pcnikki.blog.jp/archives/453629.html)でやっています。興味があればご覧ください。
WP-CLIで特定投稿のコメントのみ削除する


##考え方
$ wp comment delete COMMENT_ID
でコメントを削除できるので、COMMENT_IDに該当記事についているコメントを入れるようにする。

###参考:スパムコメントの全削除

	# delete all spam comments.
	# from http://wp-cli.org/commands/comment/
	$ wp comment delete $(wp comment list --status=spam --format=ids)
	

###投稿IDからのコメントリスト取得

	$ wp comment list --post_id=2
	[vagrant@wp-theme ~]$ wp comment list
	+------------+-----------------+---------------------+------------------+------------------------------------------------------------------------------------------------+----------------------------+
	| comment_ID | comment_post_ID | comment_date        | comment_approved | comment_author                                                                                 | comment_author_email       |
	+------------+-----------------+---------------------+------------------+------------------------------------------------------------------------------------------------+----------------------------+
	| 1          | 2               | 2015-09-13 06:39:14 | 1                | Mr WordPress                                                                                   |                            |
	| 30         | 2            | 2013-03-14 12:35:07 | 1                | John Doe                                                                                       | example@example.org        |

###組み合わせるとこうなる
	
投稿IDさえわかっていれば以下のコマンドで該当記事のコメントのみ全削除が可能

	$ wp comment delete $(wp comment list --post_id=2)
sumologicにコマンドの結果を送るシェルスクリプト

dfの結果を送るのが以下。

```bash
#!/bin/bash

DATA_FILE=/tmp/dfresult
SUMOLOGIC_COLLECTOR_ENDPOINT=http://.....

df > ${DATA_FILE}
sed -i "s/^/${HOSTNAME} /g" ${DATA_FILE}

curl -v -X POST -T ${DATA_FILE} ${SUMOLOGIC_COLLECTOR_ENDPOINT}

```
64ビット版のCentOSをVMwareにインストールできない場合の対処法

##　メモする。

PC起動するとき、F10かESCでBIOSの設定に入る

以下、図の通りに設定すれば

![20140811-01-resized.jpg](https://qiita-image-store.s3.amazonaws.com/0/96431/dec46bb3-6706-bf67-76ac-968899273ada.jpeg)

![20140811-02-resized.jpg](https://qiita-image-store.s3.amazonaws.com/0/96431/46f997e4-2a7e-881c-c11e-299ac14b3b39.jpeg)


[参照元](http://tomoyamkung.net/2014/08/11/linux-x86os-install-vmware/#2)
プロキシ環境下でapm installできない


タイトルの通り、プロキシ環境下で ``apm install atom-typescript`` とか出来ずに困った時のまとめ。

## apm proxy

``apm`` のプロキシ設定の仕方.

```
$ apm config set http-proxy http://(proxy-addr):(proxy-port)
$ apm config set https-proxy http://(proxy-addr):(proxy-port)
$ apm config set strict-ssl false
```

設定ファイルは ``~/.atom/.apmrc`` にできる。
認証ありプロキシの場合は ``http://(user):(pass)@(proxy-addr):(proxy-port)``

## まだ、できない

それでもErrorが出る時は↓の環境変数をsetする。


Windows temporary:

```
set ATOM_NODE_URL=http://gh-contractor-zcbenz.s3.amazonaws.com/atom-shell/dist
```

Windows permanently:

```
setx ATOM_NODE_URL http://gh-contractor-zcbenz.s3.amazonaws.com/atom-shell/dist /M
```

Mac & Linux ``~/.bash_profile``:

```
export ATOM_NODE_URL=http://gh-contractor-zcbenz.s3.amazonaws.com/atom-shell/dist
```

## References

* [Unable to install packages behind corporate proxy]


[Unable to install packages behind corporate proxy]:https://github.com/atom/apm/issues/322
Springの出力時のHTMLエスケープの仕様と注意点について



Springの出力時のHTMLエスケープの仕様について、調査した結果を記載しておきます。なお、バージョン4.1.4での調査結果で、バージョンによって動作は異なる可能性があります。

HTMLエスケープは、以下のレベルで設定できます。1 < 2 < 3 での順で設定が上書きされます。 

#### 1. アプリケーションレベル 

web.xmlにdefaultHtmlEscapeを定義 

```xml:web.xml 
<context-param> 
<param-name>defaultHtmlEscape</param-name> 
<param-value>true</param-value> 
</context-param> 
```

#### 2. ページレベル 

ページ内にdefaultHtmlEscapeを定義 

```jsp 
<spring:htmlEscape defaultHtmlEscape="true" /> 
```

#### 3. タグレベル 

ページの各タグにhtmlEscapeを定義 

```jsp 
<spring:message htmlEscape="true" ...> 
```
```jsp 
<form:input path="name" htmlEscape="true" ...> 
```

で、ここで注意したいのは、web.xmlのdefaultHtmlEscapeの評価の仕方がタグによって異なっているということです。 <spring:message>などのspringタグの場合は、defaultHtmlEscapeが明示的にtrueに設定してあった場合にのみ、HTMLエスケープします。これに対して、<form:input>などのformタグの場合は、defaultHtmlEscapeが明示的にtrueに設定していなくても、未設定であればHTMLエスケープします。 

全てのレベルで設定が無かった場合にのみ両者に違いが出ます。
springタグの場合は、以下の条件で判定し、 

```java
(this.defaultHtmlEscape != null && this.defaultHtmlEscape.booleanValue()) 
```

formタグの場合は、以下の条件で判定します。 

```java
(defaultHtmlEscape == null || defaultHtmlEscape.booleanValue()) 
```

[参考]
詳細に関しては、実際にソースコードを確認してみると分かると思います。 

HtmlEscapingAwareTag.java
http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-webmvc/4.1.4.RELEASE/org/springframework/web/servlet/tags/HtmlEscapingAwareTag.java?av=f 

AbstractFormTag.java
http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-webmvc/4.1.4.RELEASE/org/springframework/web/servlet/tags/form/AbstractFormTag.java?av=f 

RequestContextAwareTag.java
http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-webmvc/4.1.4.RELEASE/org/springframework/web/servlet/tags/RequestContextAwareTag.java?av=f
CentOS 7 で日本語対応の mscgen をビルドしてシーケンス図を書く

[Mscgen: A Message Sequence Chart Renderer](http://www.mcternan.me.uk/mscgen/index.html "Mscgen: A Message Sequence Chart Renderer")

ダウンロードしてビルドしてインストール。

```sh
wget http://www.mcternan.me.uk/mscgen/software/mscgen-src-0.20.tar.gz
tar zxf mscgen-src-0.20.tar.gz
cd mscgen-0.20
./configure --prefix=$HOME --with-freetype
make
make install
```

日本語フォントを検索。

```
$ sudo yum search japanese font

(snip)

ipa-gothic-fonts.noarch : Japanese Gothic-typeface OpenType font by IPA
ipa-mincho-fonts.noarch : Japanese Mincho-typeface OpenType font by IPA
ipa-pgothic-fonts.noarch : Japanese Proportional Gothic-typeface OpenType font by IPA
ipa-pmincho-fonts.noarch : Japanese Proportional Mincho-typeface OpenType font by IPA
vlgothic-fonts.noarch : Japanese TrueType font
vlgothic-p-fonts.noarch : Proportional Japanese TrueType font

(snip)
```

日本語フォントをインストール。

```
$ sudo yum install vlgothic-fonts
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile

(snip)

Installed:
  vlgothic-fonts.noarch 0:20130607-2.el7

Complete!
```

インストールされたフォントを確認。

```
$ fc-list vlgothic
/usr/share/fonts/vlgothic/VL-Gothic-Regular.ttf: VL Gothic,VL ゴシック:style=regular
```

シーケンス図の dot を作成。

*msc.txt*

```
msc {
    arcgradient = 5, width = 500;

    ore [label="俺"],
    are [label="あれ"],
    sore [label="それ"];

    ore => are  [label="ほげ"];
    are => sore [label="ふが"];
    ore <= sore [label="はげ"];
    ore =x sore [label="なんだと"];
}
```

mscgen コマンドでシーケンス図を PNG で出力。

```
mscgen -F "VL Gothic" -T png -i msc.txt -o msc.png
```

作成された画像を開く。

```
open msc.png
```

![msc.png](https://qiita-image-store.s3.amazonaws.com/0/8734/d7e47469-2d3c-4835-b5a8-570af63ed70e.png)
Swift 覚書

#これは？

- 便利なんだけど、忘れちゃいがちなSwiftのコードの備忘録です。
- 初心者向け（自分も初心者）。
- ちょこちょこ加筆予定。

#変数関連

####型を指定して、tupleに値を代入
地味に情報が少ないシリーズ。

```swift
var x = (Int(10), UInt8(10), Double(5.2), CGFloat(5.2))

// tuple内の各要素に名前を付けたい場合は：
var y = (one: Int(10), two: UInt8(10), three: Double(5.2), four: CGFloat(5.2))

// 空っぽのtupleも作れる
var z = (foo: Int(), bar: Double())
```


####Range使って、一気に配列作っちゃう
```swift
var x : [Int] = Array(0...7) // [0, 1, 2, 3, 4, 5, 6, 7]
var y = [Int](0...7) // [0, 1, 2, 3, 4, 5, 6, 7]

// どっちの書き方でもOK
```

####指定した部分の文字列を抜き出す
Extension作りました。
http://qiita.com/i6r/items/49a7f738631dd9fde1b1

上記Extensionの使用例：

```swift
var str = "いろはにほへとちりぬるを"
print(str.substringEasily(8, end:9)) // りぬ
print(str.substringEasily(1...4))    // ろはにほ
```

#gesture/target関連

ジェスチャやターゲットの登録や削除など。登録関連は多いのに、削除に関するサンプルコードはなぜか少ない。

####gestureの登録と削除


```Swift
// タップのジェスチャを登録し、タップ後にジェスチャを削除する。
// gestureの登録
myView.addGestureRecognizer(UITapGestureRecognizer(target:self, action: Selector("didClick:")))

func didClick(gestureRecognizer: UIGestureRecognizer){
	// gestureの削除
	myView.removeGestureRecognizer(gestureRecognizer)
}
```

####UIButtonのgestureを削除
地味に情報が少ない気が。

```swift
myButton.gestureRecognizers?.removeAll()
```

##NSTimer関連

タイマーがアクティブかどうかを調べる

```swift
if myTimer?.valid == true{
	// タイマーはアクティブ
}
else{
	// タイマーは止まっている
}
```

##条件分岐関連

####Switchで「OR」が使える
else if地獄は美しくない。

```swift
switch foo{
	case 0:
		print("0が代入されている")
		break
	case 1, 2, 3:
		print("1,2,3のいずれかが代入されている")
		break
	...
}

```

####Switchで「AND」を使う
tupleを使えば、シンプルに。

```swift
// foo -> Int型
// bar -> Bool型

switch (foo, bar){
	case (0, true):
		print("tupleに突っ込むことで、一度に複数の条件の比較が出来る")
		break
	case (1, _):
		print("アンダーバー'_'を使うことで、特定の要素を除外して比較することも可能")
		break
	...
}

```
tupleが便利すぎる例ですね。


##その他

####Playgroundで自作Extensionの動作確認
日本語の解説が無かったので少し躓きましたが、下記StackOverflowの解答で解決。
（Xcode7.3で確認したところ、他の解答で挙がってた方法ではダメでした。）
http://stackoverflow.com/a/33115438/3678391

簡単に解説すると：
1. Xcodeのプロジェクトにplaygroundを突っ込む（ドラッグ&ドロップでOK）
2. 動作確認したいExtensionを、上記StackOverflowの記事内のスクリーンショットのように、Playgroundファイルの中のSourceフォルダに放り込む
3. ※Extension内の関数、変数などは全てpublicにする
4. それでも動かない場合は、念のためXcodeを再起動
この3~4ステップでOKです。簡単。



もちろん、Extensionに限らず、Playgroundのコードを整理するのに色々と活用可能だと思います。
Alamofire のリクエストをコマンドライン(curl)で再現する


Alamofire のリクエストを調べていて発見したのでメモ。

Alamofre の Request インスタンスを生成する部分で break させて、 この時に lldb の po コマンドで評価してみると、

![スクリーンショット 2015-10-13 8.35.08.png](https://qiita-image-store.s3.amazonaws.com/0/27210/73c605d0-c487-5231-13cf-7b338c8530fe.png "スクリーンショット 2015-10-13 8.35.08.png")

下記のように Alamofire で送信するリクエスト相当の curl コマンドが吐き出されます。

![スクリーンショット 2015-10-13 8.50.51.png](https://qiita-image-store.s3.amazonaws.com/0/27210/0d26e495-893c-15e7-d1ba-2e0cbe32d9a1.png "スクリーンショット 2015-10-13 8.50.51.png")

(※これって内部的には iOS アプリの通信は curl が使われているってことなんでしょうか)

たまたま気づいただけなのですがこれでサーバーとうまく通信できない時の問題の切り分けに使えますね。

# おまけ

試したコードは下記です。

```
import Alamofire

enum Router: URLRequestConvertible {
    static let baseUrl = "https://example.com/1.1/"
    
    case ReadSelf([String: AnyObject])
    
    var method: Alamofire.Method {
        switch self {
        case .ReadSelf:
            return .GET
        }
    }
    
    var path: String {
        switch self {
        case .ReadSelf(_):
            return "users/show.json"
        }
    }
    
    var URLRequest: NSMutableURLRequest {
        get {
            let URL = NSURL(string: TwitterRouter.baseUrl)!.URLByAppendingPathComponent(path)
            
            var mutableURLRequest = NSMutableURLRequest(URL: URL)
            mutableURLRequest.HTTPMethod = method.rawValue
            
            switch self {
            case .ReadSelf(let parameters):
                mutableURLRequest = ParameterEncoding.URL.encode(mutableURLRequest, parameters: parameters).0
            }

            return mutableURLRequest
        }
    }
}

class Client: NSObject {

    class func getuserInfo(userid: String, screenName: String, success: SucessHandler, failure: FailureHandler) {
        let req = request(Router.ReadSelf(["user_id" : userid, "screen_name" : screenName]))
        self.sendRequest(req, success: success, failure: failure, block: nil) // <- ここで break
    }

    class func sendRequest(request: Request, success: SucessHandler, failure: FailureHandler, block: ((AnyObject?) -> Void)?) {
        request.responseJSON(options: NSJSONReadingOptions.AllowFragments) { (request, response, json) -> Void in
            switch json{
            case .Success(let data):
                block?(data)
                success(data)
            case .Failure(let data, let _):
                Logger.log("failed. status code = \(response?.statusCode), \(request?.URL?.absoluteString)")
                let err = NSError(domain: "howdy", code: 1, userInfo:nil)
                failure(response, data, err)
            }
        }
    }
}

```

 Swift2 用 Alamofire になってエラーハンドリングのやり方がうまくできず悩み中。。
LollipopでCardViewの影がつかなかったり余白が小さかったりした時の対処方法	

Lollipop未満の端末で確認して大丈夫なのに、Lollipopだとpadding/marginが小さくなり、shadowもつかなくしまった時の対処方法です。

結論から言うと `cardUseCompatPadding="true"` をセットするだけです。

# Before
上下の影がなく、CardView同士のmarginも少し小さいです。

![2015-10-12_23_37_34_png.png](https://qiita-image-store.s3.amazonaws.com/0/15267/9992a702-0185-ec41-29d9-3b768364520c.png "2015-10-12_23_37_34_png.png")


```xml
<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp">

    <!-- 略 -->

</<android.support.v7.widget.CardView>
```


# After
上下の影がつき、CardView同士のmarginもいい感じになりました。

![2015-10-12_23_23_28_png.png](https://qiita-image-store.s3.amazonaws.com/0/15267/7fd69efe-0730-3250-100c-1e362df6a603.png "2015-10-12_23_23_28_png.png")

```xml
<android.support.v7.widget.CardView
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    app:cardUseCompatPadding="true">

    <!-- 略 -->

</<android.support.v7.widget.CardView>
```

# 内部のコード
なぜこんなことが起こるかと言うと、Lollipop未満では `elevation` プロパティがないために影を別の方法でつけていて、実装が異なるからです。

CardViewの実装を見てみると、APIバージョンによって実装クラスを分けています。

```java
static {
    if (Build.VERSION.SDK_INT >= 21) {
        IMPL = new CardViewApi21();
    } else if (Build.VERSION.SDK_INT >= 17) {
        IMPL = new CardViewJellybeanMr1();
    } else {
        IMPL = new CardViewEclairMr1();
    }
    IMPL.initStatic();
}
```

Lollipop未満は、基本的に `CardViewEclairMr1` に実装があり、 `RoundRectDrawableWithShadow` というDrawableで影を表現しています。

```java
@Override
public void initialize(CardViewDelegate cardView, Context context, int backgroundColor, float radius, float elevation, float maxElevation) {
    RoundRectDrawableWithShadow background = createBackground(context, backgroundColor, radius, elevation, maxElevation);
    background.setAddPaddingForCorners(cardView.getPreventCornerOverlap());
    cardView.setBackgroundDrawable(background);
    updatePadding(cardView);
}
```

Drawableで影をつけるということは、影がViewの内側で描画されるということなので、影の分だけ余白が増えます。そのため、Lollipopよりも少し余白が大きく見えます。

`cardUseCompatPadding` は、その余剰分のpaddingをLollipopにも適用して見た目を同じようにするためのプロパティです。

```java
@Override
public void updatePadding(CardViewDelegate cardView) {
    if (!cardView.getUseCompatPadding()) {
        cardView.setShadowPadding(0, 0, 0, 0);
        return;
    }
    float elevation = getMaxElevation(cardView);
    final float radius = getRadius(cardView);
    int hPadding = (int) Math.ceil(RoundRectDrawableWithShadow
            .calculateHorizontalPadding(elevation, radius, cardView.getPreventCornerOverlap()));
    int vPadding = (int) Math.ceil(RoundRectDrawableWithShadow
            .calculateVerticalPadding(elevation, radius, cardView.getPreventCornerOverlap()));
    cardView.setShadowPadding(hPadding, vPadding, hPadding, vPadding);
}
```

このプロパティを有効にすることで、paddingがなくて影がつぶされたり余白が小さくなる問題を回避できるというわけです。
Unity rigidbody2Dでよく使うメソッド一覧


## 角度取得
```
transform.localEulerAngles.z;
```

## 上下左右に押す力
```
GetComponent<Rigidbody2D> ().velocity.y; // 上下
GetComponent<Rigidbody2D> ().velocity.x; // 左右
```

## 指定角度＆指定スピードで大砲みたいに飛ばす
```
Vector2 v;
v.x = Mathf.Cos(Mathf.Deg2Rad * direction) * speed;
v.y = Mathf.Sin(Mathf.Deg2Rad * direction) * speed;
GetComponent<Rigidbody2D>().velocity = v;
```

## 速度や重力のスピード制限に、全方向の速度取得

```
GetComponent<Rigidbody2D> ().velocity.magnitude
```

## 速度方向取得（移動量が大きい角度を取得）

```
dirVelocity = Mathf.Atan2 (GetComponent<Rigidbody2D>().velocity.y, GetComponent<Rigidbody2D>().velocity.x) * Mathf.Rad2Deg;
```

## 回転させないように固定など。

```
GetComponent<Rigidbody2D> ().constraints = RigidbodyConstraints2D.FreezeRotation; // 回転させないように、zだけ固定
GetComponent<Rigidbody2D> ().constraints = RigidbodyConstraints2D.FreezePosition; // x,y,z 全て固定
```

```
GetComponent<Rigidbody2D> ().constraints = RigidbodyConstraints2D.None; // x,y,zの固定解除
```
iOS9にするとアプリ内のサイト表示ができなくなったときの解決法（HTTP通信ができない）

#背景
アプリ内で自社広告のために、ブラウザ(UIWebView)を貼り付けて広告を出しているのだけれど、iOS9にあげると表示がされなくなってしまった。

アプリ：[【くまのがっこう】ジャッキーのほしあつめ](http://blog.tadamatuapps.com/2015/09/blog-post_27.html)
![IMG_2835.png](https://qiita-image-store.s3.amazonaws.com/0/94988/4f249f29-8690-515a-ef6b-a7351c3d6ee1.png) ![IMG_2836.png](https://qiita-image-store.s3.amazonaws.com/0/94988/49bf1a07-16c3-c9e2-7016-a3b189e6da90.png)

左画面の下部分にバナー状の広告を表示しているのと、右上のアイコンをクリックすると右画面が表示されて、自社作成アプリが表示される仕様なのだけれど、何も表示されず真っ白になってしまった。


#原因
どうやらiOS 9.0（OS Xは10.11）以上から導入されたATS(App Transport Security) という、アプリとウェブサービスとの間でセキュアな接続を確保するためのものです。
デフォルトではHTTP通信がHTTPS通信(SSL通信)に切り替えらてしまいます。

実行すると以下のようなエラーが出ているのがわかります。
`didFailLoadWithError error: Error Domain=NSURLErrorDomain Code=-999 "The operation couldn’t be completed. (NSURLErrorDomain error -999.)" UserInfo=0x14e989f0 {NSErrorFailingURLKey=http://tadamatu0001.web.fc2.com/, NSErrorFailingURLStringKey=http://tadamatu0001.web.fc2.com/}
shouldStartLoadWithRequest url: https://tadamatu0001.web.fc2.com/
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)`

これによりHTTP通信がHTTPS通信(SSL通信)に切り替えられているのが分かる。

参考：[App Transport Security Technote(英語)](https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/)

#解決方法
ATSを有効にした状態で、ATSの対象にしないドメインを設定すればよい。

具体的には以下のようにする。

まずは`Info.plist`を`Source Code`で開く。
`[Info.plist]-[Open As]-[Source Code]`
![スクリーンショット 2015-10-12 8.27.27.png](https://qiita-image-store.s3.amazonaws.com/0/94988/1c468658-e9c5-80d4-cc65-c018c7f467a9.png)

次にATSを有効にした状態で、ATSの対象にしないドメインを`Info.plist`に記載する。

```lang:Info.plist
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>tadamatu0001.web.fc2.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
            </dict>
        </dict>
    </dict>
```

`NSIncludesSubdomains`はサブドメインにも適用するかどうかを設定しています。
他のオプションは以下を参考にしてください。
[iOS 9 で追加された App Transport Security の概要](http://dev.classmethod.jp/smartphone/iphone/ios-9-intro-ats/)


#結果
これで無事に表示されるようになりました。

アプリ：[【くまのがっこう】ジャッキーのほしあつめ](http://blog.tadamatuapps.com/2015/09/blog-post_27.html)
![IMG_2840.png](https://qiita-image-store.s3.amazonaws.com/0/94988/b7a1df35-b31f-9bf1-a468-935507873151.png)　![IMG_2839y.png](https://qiita-image-store.s3.amazonaws.com/0/94988/77d8a411-b817-0f53-62ea-91af4efffc4e.png)


めでたしめでたし。

この記事が皆様のお役に立てば幸いです。

ではまた。
csharp > System.Threading.Thread.Sleep() > オンライン実行環境での実行結果

http://qiita.com/7of9/items/830cc07d8c1606fd18e9

現在勉強している本でLINQに関してWhereやSelectは一要素ずつ処理されると記載がある。
それを試すコードとして System.Threading.Thread.Sleep(100);というコードが含まれる。

ふと思ったのは、オンライン実行環境で上記のスレッドスリープがどうなるかということ。時間がないので、２つだけ試した。

http://ideone.com/5RsBIQ
https://dotnetfiddle.net/tS6IFs

両者ともスレッドスリープ分の待ちが確かに入るようだ。
結果は最後に一斉に出力される。

スレッド待ちごとに処理を出力するよりは実装しやすいのだろう。
csharp > TryParse パターン > public static bool TryParse(string s, out int result)

引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら
3.1 例外の利用場面

> TryParseパターン
...そこで、以下のように、bool型の戻り値で成否を返し、別途、out 引数で値を返すパターンが推奨されます（この例のように、Parse メソッドに対してTryParse メソッドを作る場合で使われることが多いため、TryParse パターンと呼ばれる)

```
public static bool TryParse(string s, out int result)
```

<hr>
引数に戻り値を設定し、関数自体の戻り値にboolを設定するのは時々使う。これら全てを TryXXX() という括りになるのだろうか？

bool getXXX(..., int result)という関数名(getXXX)よりは関数名tryXXXがいいかは分からない。
技術英語 > So then [it occurred to us if] we could narrow ... / We narrowed down the candidates to three.

@ Star Trek Voyager > FACES

議論の中で Harry Kimが

> So then <font color=red>it occurred to us if </font> if we could narrow ...

字幕では「...かもしれません」という訳がついていたが「...とふと思った」と訳してもいいかもしれない。

http://american-phrases.blogspot.jp/2012/02/it-occurred-to-me-that.html
> 「意味」．．．だとふと思った。．．．だということをふと思い出した。

<hr>
could narrow ...の部分は多くの選択肢の中で「絞り込んでいく」という意味で使われている

関連して思い出したのは

http://ejje.weblio.jp/content/narrow+down
> We narrowed down the candidates to three.
gitをビルドする際にエラー "error: 'CURLOPT_LOGIN_OPTIONS' undeclared" が発生する場合の対処


## 環境

下記条件でエラーが発生しました。

* ビルドするgitのバージョン: 2.6.1
* インストール済みのcurlのバージョン: 7.45.0

## エラーメッセージ

```
imap-send.c: In function 'setup_curl':
imap-send.c:1428: error: 'CURLOPT_LOGIN_OPTIONS' undeclared (first use in this function)
imap-send.c:1428: error: (Each undeclared identifier is reported only once
imap-send.c:1428: error: for each function it appears in.)
Makefile:1903: recipe for target 'imap-send.o' failed
gmake: *** [imap-send.o] Error 1
```

## 原因

どうやら、`git imap-send`から`curl`を利用するための設定が悪さをしている模様。

## 対処

`Makefile` 1070行目あたりからのこの辺をコメントアウトしてやると吉。

```
        curl_check := $(shell (echo 072200; curl-config --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/n
ull | sort -r | sed -ne 2p)
        ifeq "$(curl_check)" "072200"
                USE_CURL_FOR_IMAP_SEND = YesPlease
        endif
        ifdef USE_CURL_FOR_IMAP_SEND
                BASIC_CFLAGS += -DUSE_CURL_FOR_IMAP_SEND
                IMAP_SEND_BUILDDEPS = http.o
                IMAP_SEND_LDFLAGS += $(CURL_LIBCURL)
        endif
```
PythonのbotoでS3に接続した時のSSLエラー対処法

S3を独自ドメインで使う際に、バケット名に「.」が入るけど、この際、SSL接続はサポートされなくなるみたい。

この時、botoでS3に接続すると、SSL周りのエラーが出ちゃう。

以下のコードで解決。

```py
from boto import s3
from boto.s3.connection import OrdinaryCallingFormat 
conn = s3.connect_to_region('eu-central-1', calling_format=OrdinaryCallingFormat())
```

元ネタ（下の方に、US以外の国の話題）
https://github.com/boto/boto/issues/2836
ElCapitanでLatexToolsを使う

ElCapitanでLatexToolsを使おうとしたらうまくコンパイルできなかったのでメモ。

1.Latexのアップデート

まずElCapitanでLatexがいろんな理由で使えなくなったようなのでアップデート。
手っ取り早い方法は以下。
http://abenori.blogspot.jp/2015/10/el-capitantexplatex-dvipdfmxpdflatexmac.html

2.SublimeTextの設定

texbinのpathが変わったようなのでPreference->PackageSettings->LatexTools->Settings->Userから以下のように修正。

```LatexTools.sublime-settings
// ------------------------------------------------------------------
// Platform settings: adapt as needed for your machine
// ------------------------------------------------------------------

	"osx": 	{
		// Path used when invoking tex & friends; MUST include $PATH
		//"texpath" : "$PATH:/usr/texbin:/usr/local/bin:/opt/local/bin"
		// texpath for ElCapitan
		"texpath" : "$PATH:/Library/TeX/texbin:/usr/local/bin:/opt/local/bin"
		// Path to PDF viewer, if needed
		// TODO think about it. Also, maybe configure it here!
	},
```

参考:https://github.com/SublimeText/LaTeXTools/issues/531
swiftで任意の同一文字の連続を削除する

# Problem

同一文字が4回以上続いた場合に、4回目以降の文字を削除する処理を実装したい。

```
aaabbbbcccdeeeee
↓
aaabbbcccdeee
```

# Solution


```swift
import UIKit

var source = "aaabbbbcccdeeeee"
let dest = source.stringByReplacingOccurrencesOfString("(.)\\1{2,}", withString: "$1$1$1", options: NSStringCompareOptions.RegularExpressionSearch, range: nil)

print(dest) //-> aaabbbcccdeee
```

## ポイント

* 「`(.)\\1{2,}`」という正規表現は、同一文字「`(.)\\1`」の2回以上の繰り返し「`{2,}`」を表しています。

* 「`\\N`」は置換用のメタ文字で、検索文字列で指定したN番目の()で囲まれたパターンと一致した文字列（部分文字列）を引用します(Nは1～9のいずれか)。
* 今回は「`(.)`」と「`\\1`」組み合わせることによって、**任意の同一文字**の連続にマッチさせています。単に「`.{2,}`」としてしまうと、**任意の文字**の連続にマッチしてしまうので注意してください。

# 参考

* 正規表現の実験ができるサイト　http://regexr.com/
* http://www.megasoft.co.jp/mifes/seiki/meta.html
ある要素が含まれているかどうかの処理を各コレクションオブジェクトごとに計測

include?メソッドの実行時間は
Array : O(n)
Hash : O(log n)
SetはHashと同じくらいらしい


## ベンチマーク
### ruby 2.3

```rb:benchmark.rb
require 'benchmark'
require 'set'

my_array = Array(1..1000)
my_set = Set.new(my_array)
my_hash = my_array.each_with_object({}) do |elem, obj|
  obj[elem] = true
end

select_state = Proc.new do |collection|
  collection.include?(500)
end

puts Benchmark::CAPTION

loop_num = 1000

puts Benchmark.measure {
  loop_num.times do |i|
    select_state.call(my_array)
  end
}

puts Benchmark.measure {
  loop_num.times do |i|
    select_state.call(my_set)
  end
}

puts Benchmark.measure {
  loop_num.times do |i|
    select_state.call(my_hash)
  end
}
```

## 実行結果

```shell-session
    user     system      total        real
0.000000   0.000000   0.000000 (  0.003784)
0.000000   0.000000   0.000000 (  0.000235)
0.000000   0.000000   0.000000 (  0.000188)
```
上からArray, Set, Hash


実行時間早くしたいならHash or Setだけどオブジェクトの生成コストとメモリ消費が少なそうなのはArray
Docker公式のPHPイメージとMySQLイメージを使ってコンテナ間通信させる方法

Docker公式のPHPイメージとMySQLイメージを使って通信させる方法を紹介します。(あくまで入門用です。)

MySQLイメージ
https://hub.docker.com/_/mysql/
PHPイメージ
https://hub.docker.com/_/php/

# docker-toolboxを使ってDocker実行環境を構築する
OSXでDockerを使うには、docker toolbooxというものを使います。

https://www.docker.com/toolbox

Docker Toolboxの説明は割愛します。

(かつてデファクトスタンダートだったboot2dockerは2015年8月より非推奨扱いのようです)

# MySQLイメージの使い方

## MySQLイメージを取得する

```
docker pull mysql
```

タグ名を省略した場合、現時点(2016.3)ではMySQL 5.7が使われます。
最新版を使いたい場合は明示的にバージョンを指定するとよいでしょう。

```
docker pull mysql:5.7
```

以下、mysql:5.7を使う前提で解説を進めます。

## MySQLサーバコンテナを起動する

まず一番シンプルな起動方法を紹介します。

```
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7
```

この場合、次のフェーズでMySQLクライアントからrootでログインすることになります。

## 起動したMySQLサーバコンテナに、MySQLクライアントコンテナを作って接続する

接続確認のために、「MySQLクライアントコンテナ」を起動してコンテナ間通信がうまく行くかを見てみます。

下記に出てくる環境変数はDockerの--link機能が提供してくれるもので、コンテナ内からのみ見える変数です。

```
docker run -it --link some-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
``` 
これでMySQL接続ができたらコンテナ間通信成功です。

# PHPイメージからコンテナを作る

## PHPイメージを取得する

PHP7のイメージが公開されているのでこれを使います。

```
docker pull php:7-apache
```

(fpm版でもいいのですが、Apache版の方がブラウザから動作確認するときに楽なので)

## PHPコンテナを単体で起動してみる

まず、MySQLとは関係なしにPHPコンテナ単体で起動して動作確認します。

```
echo '<?php phpinfo();' > $HOME/info.php
docker run -it --rm -v $HOME:/var/www/html -p 8000:80 php:7-apache
```

これでPHPコンテナ(正確にはApacheコンテナというべきか)が起動するので、docker machineのIPアドレスにアクセスして、phpinfo画面が表示されることを確認します。


http://(dockerホストのIPアドレス):8000/info.php

![SS 2015-10-13 2.02.47.png](https://qiita-image-store.s3.amazonaws.com/0/18740/f13937f7-fb51-5164-d02a-2930951ee519.png)


dockerホストのIPがわからない場合は下記コマンドで調べられます。

```
docker-machine ip <マシン名>
```

## 自分用のカスタマイズイメージを作る

公式PHPイメージはPHP Extensionが貧弱でPDOすら入っていないので不便です。
公式イメージを継承して自分用イメージを作っておきましょう。

下記のようなDockerfileを用意して、~/tmp/Dockerfileとして保存します。

```Dockerfile:~/tmp/Dockerfile
FROM php:7-apache
RUN apt-get update
RUN docker-php-ext-install pdo_mysql mbstring
RUN echo 'error_reporting = E_ALL' >> /usr/local/etc/php/conf.d/99_myconf.ini
RUN echo 'date.timezone = Asia/Tokyo' >> /usr/local/etc/php/conf.d/99_myconf.ini
```

ビルドします。
```
cd ~/tmp/ ;  docker build -t myphp7  .
```

これで、自分用のカスタマイズPHPイメージができました。

## カスタマイズイメージからPHPコンテナを起動してMySQLサーバコンテナに接続する 

接続テスト用にこんなPHPスクリプトを用意しておきます。

```php:~/use-mysql.php
<?php

$dsn = 'mysql:host=' . $_ENV['MYSQL_PORT_3306_TCP_ADDR'];
$user = 'root';
$password = $_ENV['MYSQL_ENV_MYSQL_ROOT_PASSWORD'];

$dbh = new PDO($dsn, $user, $password);

$sql = "SELECT version();";

foreach ($dbh->query($sql, PDO::FETCH_ASSOC) as $row) {
    print_r($row);
}
```

コンテナを起動します。

```
docker run -it --rm --link some-mysql:mysql -v $HOME:/var/www/html -p 8000:80 myphp7
```

下記URLにアクセスします。
http://(dockerホストのIPアドレス):8000/use-mysql.php

これで、`Array ( [version()] => 5.7.8-rc )`のようにMySQLサーバのバージョンが表示されれば成功です。
phpenvでlocalを設定するとなぜか.ruby-versionな件

## 2017年1月3日 追記

今日、まっさらな状態のところへphpenvをインストールしたところ、スクリプトの該当箇所が全て`/.php-version`になっていました。いつの間に直されたんでしょうね…？とりあえず、手間が一つ減りましたね。

## compassが使えない！！

PHPで複数人で開発をしているので、バージョンを合わせるために`phpenv local`でバージョンを設定すると、なぜか`.ruby-version`ファイルが生成されています。

```bash
$ phpenv local 5.4.32
$ ls -ahlF
total 152
drwxr-xr-x  27 user  staff   918B 10 13 00:02 ./
drwxr-xr-x   5 user  staff   170B 10  7 11:05 ../
-rw-r--r--@  1 user  staff    10K 10 12 22:22 .DS_Store
-rw-r--r--   1 user  staff   205B 10 12 22:32 .buildpath
-rw-r--r--   1 user  staff   557B 10  9 14:16 .project
-rw-r--r--   1 user  staff     7B 10 13 00:02 .ruby-version  <== ｱｲｴｴｴ! Ruby!? Rubyﾅﾝﾃﾞ??????
drwxr-xr-x  17 user  staff   578B 10  9 14:31 .sass-cache/
drwxr-xr-x   3 user  staff   102B 10  7 11:11 .settings/
drwxr-xr-x   7 user  staff   238B 10 12 23:50 .svn/
・・・
```

Rubyは関係ないプロジェクトだから別にいいか…と思って気にせず使っていたのですが、`compass`を使おうとしたら問題発生！

```bash
$ compass compile ・・・
rbenv: version `5.4.32` is not installed (set by /path/to/project/.ruby-version)
```

ですよねー！！でもどうやって回避する！？

と思って、ちょっと調べてみると**env系って殆どシェルスクリプトらしい…
ならば書き換えてしまえば良い、という安直な発想に至ったわけです。

## phpenvのスクリプトを書き換える

**以下の内容は私の環境では問題なく動作しているものですが、保証は致しません。自己責任にてお願いします。**

まず、`.ruby-version`が含まれるスクリプトを洗い出します。

```bash
$ grep -l .ruby-version $(phpenv root)/libexec/phpenv-*
/Users/user/.anyenv/envs/phpenv/libexec/phpenv-local
/Users/user/.anyenv/envs/phpenv/libexec/phpenv-version-file
```

というわけで、この2つの中身の.ruby-versionを全て.php-versionに書き換えるというかなり横暴な手段に出ます。

```bash
$ sed -i -e 's/.ruby-version/.php-version/g' $(phpenv root)/libexec/phpenv-local
$ sed -i -e 's/.ruby-version/.php-version/g' $(phpenv root)/libexec/phpenv-version-file
```

さくっとワンライナーにてやりたい方はこちら。

```bash
$ grep -l .ruby-version $(phpenv root)/libexec/phpenv-* | xargs -n1 sed -i -e 's/.ruby-version/.php-version/g'
```

xargsコマンドってめちゃ便利ですね、最近知ったばかりですが(ーー;)

以上で、`phpenv`のローカルのバージョン設定が`.php-version`に書き出されるようになりました。

```bash
$ ls -ahlF
total 144
drwxr-xr-x  26 user  staff   884B 10 13 00:20 ./
drwxr-xr-x   5 user  staff   170B 10  7 11:05 ../
-rw-r--r--@  1 user  staff    10K 10 12 22:22 .DS_Store
-rw-r--r--   1 user  staff   205B 10 12 22:32 .buildpath
-rw-r--r--   1 user  staff     7B 10 12 23:42 .php-version    <== これでOK!
-rw-r--r--   1 user  staff   557B 10  9 14:16 .project
drwxr-xr-x  17 user  staff   578B 10  9 14:31 .sass-cache/
drwxr-xr-x   3 user  staff   102B 10  7 11:11 .settings/
drwxr-xr-x   7 user  staff   238B 10 12 23:50 .svn/
```

## 何か背景があるのでしょうか？

この事については、他の**envはそれぞれの名前になってるし、PHPでWebサイトを作るならば、その中でcompassを使うことも多々ある筈なので、どこかしかで話題に登っていると思い、Googleで調べてみました。
しかし、私の調べ方が悪いのか、あるいはそもそも話題に登っていないのか、それらしき情報が全くヒットしませんでした。

何か、phpenvだけ`.ruby-version`である理由があるのでしょうか？ご存知の方、ご教授頂ければ幸いです。
初心者だけどlastafluteを使ってみたい！〜”ちょっと前提”まで〜

ほぼ自分用メモです。
この記事書いたら作者さんが直してくれました！

# なんでLastaFlute?
とある勉強会で作者の[@jfluteさん](https://twitter.com/jflute)と知り合いになったので、
最悪でもTwitterで質問できると考えたからです。

公式ドキュメントでも「Twitterで質問してね」的なことが書いてあるので、
みなさんもどうぞ。

http://dbflute.seasar.org/ja/lastaflute/tutorial/laimpl.html#acquaintanceship
> 5. jflute に遠慮なく聞キナガラ実装
近くにいなければ、DBFluteユーザーの集いML や Twitter などで遠慮なく聞きましょう。 開発者に直接聞くことをぜひ楽しんでください。jfluteは、それがフィードバックとなって、さらに LastaFlute の品質があげることができるのです。それこそオープンソースの醍醐味。

敷居が高いそうなので頑張ります。
それによってスキルアップになることも狙ってます。

# 私のローカル環境
* Debian
* Intellij IDEA (学生は申しこめばタダで使える)
* Java 8


# まずはハンズオンで試す
http://dbflute.seasar.org/ja/lastaflute/howto/action/makeashtml.html
### 理由
作者に勧められたからです（単純）
<blockquote class="twitter-tweet" data-cards="hidden" data-partner="tweetdeck"><p lang="ja" dir="ltr"><a href="https://twitter.com/tresener_yu1ro">@tresener_yu1ro</a> とりあえず、このハンズオンやってみるべし！ <a href="http://t.co/bOPZPkwIOp">http://t.co/bOPZPkwIOp</a> 最初はコピペでもいいと思うよ。</p>&mdash; jflute (@jflute) <a href="https://twitter.com/jflute/status/653468463239856128">October 12, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 手順１ ちょっと前提
### MySQLの設定
Debianなので
/etc/mysql/my.cnfを編集
[mysqld]
に追記

```conf:my.cnf
[mysqld]
# /* * * * * * * * * * * * * * * * * * * * * * * * Custom Settings
character_set_server=utf8mb4
lower_case_table_names=1

# to avoid easy deadlock of repeatable-read
transaction-isolation=READ-COMMITTED

# TRADITIONAL contains STRICT_ALL_TABLES, NO_ZERO_DATE and so on...
sql_mode="TRADITIONAL"
# * * * * * * * * * */
```
保存したら再起動

```bash
$ sudo service mysql restart
```

### Exampleのclone
https://github.com/lastaflute/lastaflute-example-harbor
これのQuick Tutorialから
```
$ git clone git@github.com:lastaflute/lastaflute-example-harbor.git
```

### ReplaceSchema
```
$ cd lastaflute-example-harbor/dbflute_maihamadb/
$ sh manage.sh 
```
これで0番 delete? y
を選択
MySQLを覗いても何もできていない**ので心配です**

### コンパイル
Intellijでいつも通り

### HarborBootクラスのmain()を実行
一度ここで***とてつもなくはまりました***が作者が対応してくださったので、
今はそんなことありません。
変更履歴とコメントを見て頂ければ大変だったことと作者の対応の速さをご理解いただけると思います。

```java:console
(中略)
2015-10-13 21:20:55,694 [main] INFO  (DBFluteSystem@lock():232) - ...Locking the DBFlute system
2015-10-13 21:20:55,700 [main] INFO  (LastaToActionFilter@showBoot():105) - _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
2015-10-13 21:20:55,701 [main] INFO  (LastaToActionFilter@showBoot():106) -  the system has been initialized:
2015-10-13 21:20:55,701 [main] INFO  (LastaToActionFilter@showBoot():107) - 
2015-10-13 21:20:55,701 [main] INFO  (LastaToActionFilter@showBoot():108) -   -> Harbor (Local Development)
2015-10-13 21:20:55,701 [main] INFO  (LastaToActionFilter@showBoot():109) - _/_/_/_/_/_/_/_/_/_/
Boot successful as development: url -> http://localhost:8090/harbor
```
動きました。
ブラウザで開くと・・・
http://localhost:8090/harbor
![LastaFlute Example - SignIn.clipular.png](https://qiita-image-store.s3.amazonaws.com/0/35448/a6e17fc3-e99c-670c-b9ec-0eb00871a358.png)

この記事ではここまでです。
また次回
El Capitanにしたらgitコマンド(CUI)が動かなくなった。

#####El Capitanにアップデートした後、gitコマンドが以下のエラーを吐いて動かなくなった。
```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```


##Terminalからxcode-selectをインストールしたら正常に動き出した。
```
xcode-select --install
```
ISUCON4の予選問題をやってみる。(その4)


[その1](http://qiita.com/hiyuzawa/items/dfeb4362916732f4d067)
[その2](http://qiita.com/hiyuzawa/items/f67711458887a1b7137c)
[その3](http://qiita.com/hiyuzawa/items/039c3905fa384a06c1c4)

## nginx のチューニング

### パラメータ調整

初期状態のnginxのパラメータは以下のとおり.

```bash
# /etc/nginx/nginx.conf
worker_processes  1;

events {
  worker_connections  1024;
}
```


ベンチマーク実行とReverseProxyも同一サーバで稼働する状態でチューニングがやりにくいけど、
とりあえず、CPU(m3.xlarge=4)に対して設定値を変更して調整してみる。

```bash
# /etc/nginx/nginx.conf
worker_processes  2;
worker_rlimit_nofile 40000;
events {
  worker_connections  10000;
}
http {
  sendfile on;
  tcp_nopush on;
  ...
```

プロセス単位のファイルディスクリプタのOpen数 (worker_rlimit_nofile) を大きくしとく

```bash
$ sudo service nginx restart
```

```bash
$ cat /proc/2559/limits
Max open files            40000                40000                files
```

### nginx と ReverseProxy間をUnix domain socket 通信へ変更

```bash
# /etc/nginx/nginx.conf
...
http {
  ...
  upstream app_socket {
    server unix:/var/log/nginx/starman.sock;
  }
  ...
  server {
     ...
     location / {
     proxy_pass http://app_socket;
  }
}
```

```bash
#/etc/supervisord.conf
...
# command=/home/isucon/env.sh carton exec plackup -s Starman --host localhost:8080 -E prod app.psgi
command=/home/isucon/env.sh carton exec plackup -s Starman --listen /var/log/nginx/starman.sock -E prod app.psgi
...
```

これで nginx と Starmanを再起動したろころ、nginxからsocketファイルのアクセスでpermission deniedがでた。
nginx を user isucon; で起動したら正常にアクセスできたのでとりあえずそうしておく。

## あらめてベンチマーク

```
$  ./benchmarker bench --workload 10
14:10:18 type:info      message:launch benchmarker
14:10:18 type:warning   message:Result not sent to server because API key is not set
14:10:18 type:info      message:init environment
14:10:35 type:info      message:run benchmark workload: 10
14:11:36 type:info      message:finish benchmark workload: 10
14:11:41 type:info      message:check banned ips and locked users report
14:11:43 type:report    count:banned ips        value:642
14:11:43 type:report    count:locked users      value:4299
14:11:43 type:info      message:Result not sent to server because API key is not set
14:11:43 type:score     success:179350  fail:0  score:38744
```
38774点 

## MySQLのチューニング

チューニングというか、これぐらいの利用だとMyISAMでいいんじゃね？ということでそうしてみる

```bash
#sql/schema.sql
CREATE TABLE IF NOT EXISTS `users` (
...
) DEFAULT CHARSET=utf8, ENGINE=myisam;

CREATE TABLE IF NOT EXISTS `login_log` (
...
) DEFAULT CHARSET=utf8, ENGINE=myisam;
```

これでベンチマーク

```
14:40:35 type:score     success:183000  fail:0  score:39533
```

39533点
とりあえずヒカリエレベルまで達した。
http://isucon.net/archives/40576269.html
typedtupleという酔狂なものを作った

# [typedtuple](https://github.com/succhiello/typedtuple)とは

平たく言えば、[voluptuous](https://github.com/alecthomas/voluptuous)の形式で宣言的に記述可能/生成時にバリデーションを行うnamedtuple。所謂case class的な利用を意図している。

# もう少し詳しく

例えばDBのrow itemを色々ハンドリングする時に、生dictでもいいんだけど添字アクセスとかだるいしコードそのもので意図を伝えられるように型化したいんだけど、そのためにclassを定義するのはtoo matchなんだよなーと思うことはないだろうか。私はあります。

また、[toolz](https://github.com/pytoolz/toolz)とか[fn.py](https://github.com/kachayev/fn.py)使ってpythonでも大分FPっぽく書けるけど、immutableなobjectが欲しいんだよなーと思うことはないだろうか。私はあります。

どちらもそれだけなら単にnamedtupleを使えば全て解決する問題ではあるが、その上で、アプリケーションコードを大量に書いているといちいち面倒になってくるのが属性の型が今なんなのかチェックする必要があるということや、例えばISO-8601な文字列を自動的にdatetimeに変換したい、ということだった。

このような事情に対して、型の構造の宣言的な記述を行うだけでnamedtupleの生成時に型チェックや変換が自動的に行われる実装を提供しようというのがtypedtupleである。

# 使い方

[こちら](https://github.com/xica/typedtuple)に色々書いているが、`typedtuple.TypedTuple`をnamedtupleと同じ要領で使うか`typedtuple.schema`デコレータを使う(TypedTupleにプロパティやメソッドを追加したい場合)かして、`voluptuous.Schema`を指定することで型の定義を行う。インスタンスの生成時に、指定したSchemaを利用して値の検証や自動変換が行われる。voluptuousによる検証・変換についてはそちらのドキュメントやコードを参照のこと。

```py
from typedtuple import TypedTuple
from voluptuous import Coerce

Vector = TypedTuple('Vector', {'x': Coerce(float), 'y': Coerce(float)})

v0 = Vector(x=10, y='20.0')

# voluptuous.Coerceにより、floatに変換可能なものは自動的に変換される
print v0  # Vector(x=10.0, y=20.0)

v1 = Vector(x='x', y=20.0)  # raises exception

# TypedTuple=namedtupleでありimmutableなので、属性の更新はnamedtuple._replaceをを用いて別の値を生成することになる
v2 = v0._replace(y=30.0)  
```

# 注意点

如何せん要素順序が保証されない`dict`で構造を指定するので、実態は`tuple`なのに属性の順番を指定することがそのままだとできない。基本的な利用では問題にならないはずだが、順序を厳格に指定したい場合は`collections.OrderedDict`を使えばよい。

```py
from collections import OrderedDict
from typedtuple import TypedTuple
from voluptuous import Coerce

Vector = TypedTuple('Vector', OrderedDict((('x', Coerce(float)), ('y', Coerce(float))))
print Vector._fields  # 必ず('x', 'y', 'z')になる(OrderedDictを使わない場合、順序は不定になる)
```

他の注意点としては、多分生成がかなり重い。多分とか言ってても仕方ないのでベンチマークを取る。

# その他の例

```py
from voluptuous import All, Range, Length, Optional
from typedtuple import schema

@schema({
    'id': All(int, Range(min=0)),                # idは必ず正の整数とか
    'password': All(str, Length(min=8)),  # passwordは8文字以上の文字列とか
    'first_name': str,
    'last_name': str,
    Optional('nickname'): str,            # Optionalにすると生成時省略可能
})
class User(object):
    # typedtuple(というかnamedtuple)は属性を追加することはできないが、プロパティやメソッドは追加可能
    @property
    def full_name(self):
        return '{} {}'.format(self.first_name, self.nick_name)

# raises exception
alice = User(id=-1, password='xxxxxxxx', first_name='Alice', last_name='Kakehashi', nick_name='kkhs')

# raises exception
bob = User(id=1, password='short', first_name='Bob', last_name='Kakehashi', nick_name='kkhs')

# nick_name is optional
carol = User(id=2, password='xxxxxxxx', first_name='Carol', last_name='Kakehashi')
```

# 終わり
そのうちvoluptuousについても書こうと思う。
初めてGulpを触ってみた

## はじめに
最近Web系のことを触り始めて、初めてgulpを使ってみたのでそのメモ。

### gulpとは
gulp公式サイト
http://gulpjs.com/

javascript（nodejs)を利用したタスクランナー。
あらかじめ一連の動作をコマンドをトリガーに実行したり、ファイルを監視して変更をトリガーに実行することが可能。
例えば、javascriptの圧縮処理や、LESSからCSSへ書き出したり、HTMLでファイルが変更された時にブラウザをリロードさせることなどができる。

今回は単純にファイルを監視して更新があったときに特定の場所にコピーしてみた。

## 導入
### node.jsのインストール
公式サイトよりnode.jsをダウンロード＆インストール。
https://nodejs.org/en/

### npmからgulpをインストール

```
//グローバルインストール
npm install gulp -g

//アプリフォルダ内にもインストール(アプリ階層にて)
npm install gulp
```

### gulpfile.jsを作る

```js:gulpfile.js
//gulpの読み込み
var gulp = require('gulp');

//copytaskの作成
gulp.task("copytask", function () {
	 gulp.src("./src/*.html")
	.pipe(gulp.dest("./copy/"))
});

//監視の設定
//src内のhtmlファイルに変更があった場合copytaskを実行
gulp.task("watch", function () {
	gulp.watch("./src/*.html", ["copytask"]);
})

//デフォルトタスクに設定する
gulp.task("default",["watch"]);
```
実行するタスクはgulp.task()の中に記載する。
gulp.srcで対象となるファイルを指定する。
以降の操作は.pipeメソッドでメソッドチェーンを使って記載。
gulp.destは出力を意味する。

## gulpの実行
コマンドプロンプトより
 
> gulp

で実行。終了させるときはctrl+c

なお、Visual studio codeを使っている場合はコマンドパレット(ctrl+shift+p)より

> task default

から実行可能
[baserCMS] ビューキャッシュがクリアされるタイミング

baserCMSには、キャッシュを利用する仕組みの内のひとつにビューキャッシュがあります。
ビューキャッシュとは、フロントの表示内容をマルッと一時ファイルとして生成しておき、そのキャッシュファイルの有効時間内では表示する際に再利用され、プログラムの内部処理を省略し、表示を早めることのできる仕組みです。
※管理システムにログイン中は、このキャッシュは利用されません。

では、そのキャッシュファイルはいつクリアされるのか？という点が気になって調べてみました。

## 想定している対象者

- baserCMSでウェブサイトを制作をしている方


## ビューキャッシュの基本動作
ビューキャッシュの有効期限は 5分 で設定される。
デバッグモードが有効な場合は 10秒 で設定される。 

```app/Config/core.php
$duration = '+5 min';
if (Configure::read('debug') > 0) {
	$duration = '+10 seconds';
}
```

## ビューキャッシュが削除されるタイミング一覧

- 固定ページ追加時、ステータス、公開期間共に公開状態にあるとき
- 固定ページ編集保存時、タイトル、URL、公開状態が更新された場合は全てのビューキャッシュを削除
  - 上記以外のときは編集保存時ページのビューキャッシュのみ削除
- 固定ページテンプレートの書出を行ったタイミング
- 固定ページの並び替えを行ったタイミング
- 固定ページの公開状態を変更したタイミングでは、切替えたページのビューキャッシュのみ削除
- 固定ページ削除時は、削除したページのビューキャッシュのみ削除

- ブログ記事の編集保存時
- ブログ記事の追加保存時
- ブログ記事の削除時
- ブログ記事の公開状態を切替えたタイミング（一括指定含む）

- ブログコメントの公開状態を切替えたタイミング（一括指定含む）

- サイト設定を保存したタイミング
- ウィジェットを更新したタイミング
- ウィジェットを並び替えたタイミング
- ウィジェットを削除したタイミング

## ビューキャッシュの削除方法

clearViewCache を実行すると削除できます。

```php:/lib/Baser/basics.php
clearViewCache();
```
Linuxサーバー管理をWindowsで行うべきでない重要な１つの理由

サーバー接続に使うSSHクライアントは今の所フリーソフトしかありません。（注：コスト的に商用のものは選択され辛いと言う意です）

フリーソフトを使っている管理者はSSHクライアントのソフトが安全かどうかの検証はどのように行っていますか？
ネットの噂等で判断するのは危険ですし説得力がありません。大人しくOSXかLinuxかUNIXを使うべきです。

一度セキュリティについて考えておくべきです。


ちなみにPowerShellにSSHがサポートされる動きはあるようですね。
[Looking Forward: Microsoft Support for Secure Shell (SSH)](http://blogs.msdn.com/b/powershell/archive/2015/06/03/looking-forward-microsoft-support-for-secure-shell-ssh.aspx)

# 補足(2015/10/15)

当エントリの反響は予想を上回り驚いています。

舌足らずな表現も誤解を与えた感がありましたので補足させて頂きます。
経緯が分からなくなるので元の文章はそのまま残します。

言いたかったことは、SSHと言うソフトウェアの性質上のバイナリの正当性が確保できているのか一度考えて欲しいと言うことです。

なぜそう考えたかと言うと私の知り得る企業のサーバー管理用OSはほとんどがWindowsを使っています。
サーバー管理者たちの技術スキルや日々の仕事ぶりは否定するものはありませんが、セキュリティの意識はあまり高くありません。
もちろんサーバーのセキュアな設定、パスワードの管理などは当然あり問題ない範囲ですが。
ただSSHも含め、Windows環境で使うオープンソース、フリーソフトの入手については無知な人が多いです。

無知を指摘するのは下記についてです。

```・SSHなどアプリケーションソフトのバイナリ入手について、ハッシュの検証を行っていない。組織にそのルールすらない。

・使用するアプリケーションソフトのセキュリティホールなどの情報管理を行っていない。古いものをそのまま使っている。

・使用するアプリケーションソフトのフォークされた亜流を使っている。亜流のソフトが不正な改ざんされてないか安全かどうかの検証を行っていない。

・例えばSSHのアプリケーションソフトが組織内で個人個人の趣味で選択（Putty, Poderosa, TeraTerm, RLogin）されている。情報管理は個人の意識に依存している。
```

などです。
これらの指摘した内容をすべて、セキュリティ管理、情報管理ができている個人、組織であれば全く問題ありません。
そう言う意味でWindowsが問題ではありませんので。

いちいちセキュリティ管理、情報管理を都度実施するのは面倒だったりします。
それであればコメントにご指摘のあるように商用のSSHを使ったり、OSX、Linux、UNIXを使えばセキュリティ管理、情報管理の負担は減ると考えました。

Linuxもオープンソースだから危険と言う意見もありますがその通りです。
（ISOを入手するときはちゃんとハッシュの確認をします）
ですが、開発者のがっつりいる層の厚い強固なコミュニティのオープンソースと、個人レベルに近いオープンソースを同列に考えるのは疑問があります。



組織内には必ずしもセキュリティ、技術レベルの高い人ばかりではありません。

今一度あなたが使っている、部下使っている、同僚が使っている、ソフトや環境が入手経路も含めて安全かどうか考えてみてください。

状況はどうであれXcodeが改ざんされて不正なアプリが公開されてしまう時代なのです。
[ご興味があれば](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=xcode%20%E6%94%B9%E3%81%96%E3%82%93)

危機感を持ちましょう。
F#でPRMLに出てくるガウス分布に従うランダムノイズを乗せたデータを作る


PRMLの付録Aにでてくる人工データ集合をF#でコーディングしました。
sin(2πx)に対して、標準偏差が0.2のガウス分布に従うランダムノイズを加算してデータを作成します。PRLMでは標準偏差が0.3でしたが、sinカーブとは似ても似つかぬ何かになったので0.2に変えています。

ガウス分布に従うノイズ生成のアルゴリズムは、こちらをそのまま持ってきました。
http://www.sat.t.u-tokyo.ac.jp/~omi/random_variables_generation.html#Gauss

```fsharp
open System
let random = System.Random()

//Gaissian noise
//http://www.sat.t.u-tokyo.ac.jp/~omi/random_variables_generation.html#Gauss
let randomNormal (u:float) (s:float) : float =
    let x = random.NextDouble()
    let y = random.NextDouble()
    let z = sqrt(-2.0*log(x)) * sin(2.0*Math.PI*y)
    u + s * z

let makeSinData (num:int) = 
    let mutable l = []
    for x in 0.0..float(num) do
        let xrad = x*2.0*Math.PI/float(num)
        let noise = randomNormal 0.0 0.2
        let y = sin(xrad)+noise
        l <- l@[y]
    l

[<EntryPoint>]
let main argv = 
    let data = makeSinData 10
    printfn "%A" data
    0 // 整数の終了コードを返します
        
```
実行結果をExcelでプロットするとこんな感じです。


![plot.png](https://qiita-image-store.s3.amazonaws.com/0/327/c1788dc6-b4fc-ca83-8284-f312c2520368.png)
それっぽいのできてますね。
Chef実践入門に書かれてるけど今使えないコマンド覚書（随時追加）


発行から１年が経っているためか非推奨のコマンドが出てきたのでメモしていきます。

###P.141: berks install

	$ bundle exec berks install --path ./cookbooks
	DEPRECATED: `berks install --path [PATH]` has been replaced by `berks vendor`.
	DEPRECATED: Re-run your command as `berks vendor [PATH]` or see `berks help vendor`.
Use berks vendor

	$ bundle exec berks vendor ./cookbooks
slack api で bot を作ってみた

# slack 用 bot の作り方

slack 用の bot を作るには方法がいくつが方法がある．
ruby エンジニアなら [lita](https://github.com/jimmycuadra/lita) か [ruboty](https://github.com/r7kamura/ruboty)，node が使えるなら [hubot](https://github.com/github/hubot) を使うのが簡単だけど，それぞれに一長一短がある．

ruboty はちょっと特殊で，専用の integration があるわけではなくコードをみた限り xmpp を使用するので，誰かのユーザーとしてログインするか(その場合は発言はそのユーザーのものになってしまうはず?)，bot 専用のユーザーを作る必要がありそう．もし専用ユーザーを作るとしたら，課金をしている場合は1ユーザーとしてカウントされてしまうので使い難い．

lita/hubot は integration として用意されているので bot とし slack 上にユーザーが常駐する．
この場合は課金対象にはならないけど，1 integration 消費してしまう．

たまたま別件の bot を作ろうとして api 眺めていたら，api を使う事で integration 枠を消費せず，
且つ既存ユーザーとは別ユーザーとして( bot として)反応できる bot を作れる事がわかったので，試してみた．

## と言うわけで slack api を使用して bot を作る

必要なのは slack の api token だけ．token は [ここ](https://api.slack.com/web) で確認． 
bot は token を発行した自分自身のアカウントとして行動するが，発言をする時は username を変更できる(変更すると名前に `bot` と追加表示される)ので，あたかも bot として発言ができる．

lita のコードを確認したわけではないのでもしかすればできるかもしれないが，この方法だと file の upload や，channel の archive 等もできるので lita より高機能なのが作れる．
あと integration 枠消費しないのが良い．

# TL;DR

https://github.com/takesato/slack-aria
THE AVVENIRE 良過ぎた勢いで生れた．

# 解説とか

api を使用して bot を作るには slack の realtime api を使う必要がある．
thread 処理書くの面倒だったので今回は [aki017/slack-ruby-gem](https://github.com/aki017/slack-ruby-gem) を使用

```rb
require 'slack'
Slack.configure {|config| config.token = TOKEN }
client = Slack.realtime

client.on :hello do
  puts 'Successfully connected.'
end

client.on :message do |data|
  # respond to messages
end

client.start
```

とりあえずこれだけで bot ができあがる．
あとはイベントに対してそれぞれ振る舞いを書けばいい．

RTM API(Real Time Messaging API) のイベントがどんなの使えるかは公式をみるのが早いので [Real Time Messaging API | Slack](https://api.slack.com/rtm) を参照．

## メッセージに応答する bot を作る

ユーザーの発言に反応する bot は `message` イベントを拾えばいい

```rb
client.on :message do |data|
  # respond to messages
end
```
この時， data には発言の情報が色々含まれているので，その内容をチェックして処理を書く．

良く使うのは

- channel
- user
- subtype
- text

あたり．
subtype で bot の発言 ( `data['subtype'] == 'bot_message'` ) とか file の upload  (`data['subtype'] == 'file_share'` ) とかがわかる

## 返事の仕方

返事は realtime api は使わず，普通に web api の方を使う．
web api 自体はシンプルなので slack-ruby-gem を使わないでも簡単に書けるけど，今回は RTM API を使用するのに導入しているので， slack-ruby-gem の web api wrapper を使う

api の種類は [API Methods | Slack](https://api.slack.com/methods) 参照

今回は発言する処理を書くので [chat.postMessage](https://api.slack.com/methods/chat.postMessage) を使う

```rb
  params = {
    token = SLACK_TOKEN,
    channel: channel_id.
    username: bot_name,
    text: 'message',
    icon_url: 'http://url/to/icon/imgage'
  } 
  Slack.postMessage params
```
内容的には incoming webhook とほぼ一緒(ほぼというか完全?)
逆に incoming webhook でも，web api で使えるオプションが使える．

RTM API と組合せるとこんな感じ

```rb
client.on :message do |data|
  if data['text'] == 'おはよう' && data['subtype'] != 'bot_message'
    params = {
      token = SLACK_TOKEN,
      channel: data['channel'].
      text: "<@#{data['user']}> おやすみ",
    } 
    Slack.postMessage params
  end
end
```
raspberryPi AirPlayインストール方法

数十回もインストールして、洗練された方法です
raspberryPiを起動し、コマンドをそのままコピーぺすればできます。

# 必要なライブラリーインストール

```
sudo apt-get install  libao-dev libssl-dev git avahi-utils libwww-perl
sudo apt-get install libcrypt-openssl-rsa-perl libio-socket-inet6-perl  libmodule-build-perl
```


# 作業ティレクトリ作成
```
mkdir airplay-audio-project
cd airplay-audio-project
```

# perlビルド
```
git clone https://github.com/njh/perl-net-sdp.git
cd perl-net-sdp
perl Build.PL
./Build
./Build test
sudo ./Build install
cd ..
```
# shairplayインストール
```
git clone https://github.com/abrasive/shairport.git
cd shairport
make
```

＃試しにairplay 立ち上げ
```
./shairport -a RaspberryPi
```
iphoneから検出できれば成功です


# raspberry起動時自動airPlay立ち上げ設定
```
sudo make install
```

```
cd scripts/debian/init.d
sudo cp shairport /etc/init.d/shairport
sudo chmod +x /etc/init.d/shairport
sudo useradd -g audio shairport
sudo update-rc.d shairport defaults
sudo /etc/init.d/shairport start
```