OmniAICreator/Qiita-1.07M huggingface dataset:
Play-Scalaの環境をWindowsのEclipseで作ったときの覚書

#環境構築
1. [Playの公式](https://www.playframework.com/)に行って、DownLoadクリックからのPlayをDLする
2. 適当な場所に解凍
3. 環境変数のPATHをいじって、↑で解凍したにパスを通す
4. サインアウト→サインインor再起動でパスを反映する(コマンドプロンプトで「activator help」で反応すればOK)
5. プロジェクトを作りたい場所に移動
6. コマンドプロンプトを開き、「activator new」と入力
7. 対話式でどのタイプのプロジェクトにするか聞かれるので、「play-scala」を選択
8. プロジェクト名入力してね、と言われるので適当に(play-scala-sampleとする)
9. play-scala-sampleに移動する
10. 「activator ui」とクリック(Play関連のファイルを生成させるため一度ビルドする)
11. ブラウザが立ち上がるので、Buildタブ→Compleをクリックしてしばしまつ(最初はSBTの更新やらで時間がかかる)
12. Runタブを開き、Runをクリック
13. localhost:9000にアクセスし、動いてるかチェック
14. STOPをクリックして止める
15. play-scala-sample/project/plugins.sbtをエディタで開く
16. 末尾に「addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")」を記載する。これによりEclipse変換用のプラグインが読み込まれる。最後の数字はVersionなので[ここ](https://github.com/typesafehub/sbteclipse)で最新版を確認するとよい
17. 保存して閉じる
18. play-scala-sampleに移動し、「activator」と入力
19. activatorモード？っぽいのになったら「eclipse」と入力すると変換が始まる。(ここからの流れは[公式の手順](https://www.playframework.com/documentation/ja/2.3.x/IDE)と一緒なのでそちら参照でもOK)
20. 変換が完了したら、Eclipseを立ち上げ、File->Import->General->Existing project...と進み、play-scala-sampleを選択

#デバッグ
[公式の手順](https://www.playframework.com/documentation/ja/2.3.x/IDE)と同じでOK
1. play-scala-sampleディレクトリに行き、コマンドプロンプトを開く
2. 「activator -jvm-debug 9999 run」と入力して、ローカルサーバを立ち上げる(最初は時間がかかる場合がある)
3. Eclipseプロジェクトを右クリック->Debug As -> Debug Configurations を選択。
4. Debug Configurationsのダイアログ画面でRemote Java Applicationを右クリック→Newと選択
5. Portを9999に変更しApply
6. Debugボタン押下でデバッグ開始(サーバが立ち上がってないとここでエラーが出る)
fuelphpをドキュメントルート以外で使う方法　サブディレクトリ付きにする

#メモの要旨
http://localhost/hoge/
でfuleを動かした時設定した内容
##動作確認環境

- OS windows 7 64bit
- Xampp 1.7.3<br>
c:\xampp で動かす
- fulephp 1.7.3<br>
c:\tmp\hoge\{fule,html} に設置

##apacheの設定
C:\xampp\apache\conf\httpd.conf
に以下追加

```lang:httpd.conf
Alias /hoge/ "/tmp/hoge/html/"
<Directory "/tmp/hoge/html/">
   Options Indexes FollowSymLinks Includes ExecCGI
   AllowOverride All
   Order allow,deny
   Allow from all
</Directory>
```

##fuelphpの設定
c:\tmp\hoge\html\\.htaccess
の10行目あたり RewriteBase にAliasしたディレクトリを設定

```lang:.htaccess
<IfModule mod_rewrite.c>

	RewriteEngine on

	# NOTICE: If you get a 404 play with combinations of the following commented out lines
	#AllowOverride All
	RewriteBase /hoge ←ここ

    # Make sure directory listing is disabled
	Options +FollowSymLinks -Indexes

```
StoryBoardでUIImageViewのtintColorを変更する

# Solution

```swift
// MyImageView.swift:

import UIKit

@IBDesignable
class MyImageView: UIImageView {
  @IBInspectable internal var tintColorCode: String = "" {
    didSet {
      image = image?.imageWithRenderingMode(.AlwaysTemplate)
      tintColor = MyColor.fromCode(tintColorCode)
    }
  }
}
```

ColorCodeで色を指定する方法は以下を参考にして下さい

- [Storyboard上でViewにプロジェクトで定義した色を指定する方法](http://qiita.com/k-yamada@github/items/db033695a0e15f23313e)

# 参考


- [Modify UIImage renderingMode from storyboard/xib file](http://stackoverflow.com/questions/19517334/modify-uiimage-renderingmode-from-storyboard-xib-file)
MysqlをMACにインストールして起動出来るようにする

※homebrewとかつかわず何かとGUIを使いたい人向けの超単純な方法です。
mysql-5.7.9-osx10.10-x86_64.dmgをインストールした場合の動作になります。

# Mysql Community Serverをinstallする
- mysqlのdownloadサイトにアクセス
http://dev.mysql.com/downloads/mysql/
- 現在インストールしているOSのバージョン用の「DMG Archive」版をダウンロード
- ダウンロードしたdmgをクリックするとファインダーが開く
- pkgファイルをクリック
- インストールが開始されるのでインストールする
- パスワードを設定したというアラートが出るので初期パスワードを保存しておく

# Mysqlを設定画面から起動する

- (MAC左上リンゴマーク)→システム環境設定を起動
- システム環境設定にMYSQLのメニューができてるはず（前はMySQL.prefPaneとか入れる必要あったけどいらないっぽい）
- MYSQLメニューをクリックすることでMYSQLが起動出来る

# パスワード更新
初期パスワードを使ってパスワードを初期設定します。
>mysqladmin -u root password 'newpassword' -p

上記を入力すると「Enter password:」と出るのでさっきの初期パスワードを入れる。
WARNINGが出るけど更新される

# 接続してみる

- ツールはなんでもいいけど今回はSequel Proを使います。ホットケーキがカワイイですねw
http://www.sequelpro.com/
- Sequel Proはダウンロードしたらホットケーキもといアプリを配置したい任意のフォルダに移動します。
- Sequel Proを起動すると接続画面が開きます
- 下記のように入力して接続。パスワードはさっき更新したやつです。
![スクリーンショット 2015-11-20 1.16.34.png](https://qiita-image-store.s3.amazonaws.com/0/101014/334d3cd6-37e3-7893-4747-503b1f97f053.png)

- これで接続が出来るはず。

この後いろいろ変えていきたい感じですがこの記事ではここまでとします。
MySQL5.6から5.7にYumでサクッとアップグレードする

#前提
- いわゆるインプレイスアップグレードの手法です。
- MySQL 5.6は[公式レポジトリ](https://dev.mysql.com/downloads/repo/yum/)からインストールしている場合のお話です。
- 不測の事態に備え、MySQLのデータフォルダやmy.cnfはバックアップしておきましょう。
- bashとvim上で操作を完結させます。

# 1. 公式レポジトリの更新
```bash
yum remove -y mysql-community-release-el7-5.noarch
yum localinstall -y http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
# 上記をワンライナーで
yum swap -y -- remove mysql-community-release -- install http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
```
# 2. MySQLをシャットダウンする
```bash
mysql -u root -p -e "set global innodb_fast_shutdown=0"
mysqladmin -u root -p shutdown
```
※[公式ドキュメント](https://dev.mysql.com/doc/refman/5.7/en/upgrading.html#upgrade-procedure-inplace)では、パスワードをコマンドに書いています。ですが、今回は履歴に残さないよう、あえて対話式にてパスワードを入力しています。

# 3. Let's upgrade!
```bash
yum remove -y mysql-server
yum install -y mysql-server
```
※yum update mysql-serverだと旧バージョンの削除の段階でフリーズしたので、一旦removeしてからinstallしています。

# 4. my.cnfを書き直す
```bash
rm /etc/my.cnf
rm /etc/my.cnf.rpmnew
mv /etc/my.cnf.rpmsave /etc/my.cnf
vi /etc/my.cnf
```
私が書き換えたのは下記4点です。
- `innodb_file_format = Barracuda`は[5.7.7からdepracated](https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_file_format)になったので削除しました。
- [systemdをサポート開始した](http://mysqlserverteam.com/mysql-5-7-native-systemd-support/)ので、`[mysqld_safe]`を削除しました。`[mysqld_safe]`の行以降にpidファイルのパスを書いていたので、pidが無いとログにて指摘されました。
- パスワードの強制変更機能がデフォルトで有効なので、それを無効にする`default_password_lifetime = 0`を書き足しました。
- 5.6デフォルトの`sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES`を削除しましたが、削除には慎重になったほうが良さそうです。

# 5. 起動して自動起動を有効にする
```bash
systemctl start mysqld && systemctl enable mysqld
```

# 6. データベース自体をアップグレードする
```bash
mysql_upgrade -u root -p
```

# これで完了！[3倍速い](http://cloud.watch.impress.co.jp/docs/news/20151022_726934.html)MySQLを使い倒しましょう！

# 参考URL
https://dev.mysql.com/doc/refman/5.7/en/updating-yum-repo.html
https://dev.mysql.com/doc/refman/5.7/en/upgrading.html#upgrade-procedure-inplace
http://www.slideshare.net/yoku0825/mysql-57-53449734
http://mysqlserverteam.com/mysql-5-7-native-systemd-support/
http://d.hatena.ne.jp/indigo13love/20140606/1402026594


# アップグレード後のつまづきポイント（2015-11-20 13:15:00更新）
- `SQL_MODE`にて`ONLY_FULL_GROUP_BY`が有効になっているので、`ORDER_BY`のカラムを`GPOUP_BY`に入れるようエラーがでます。
TWE-Lite-Rでtwe-liteのファームウェア書き込みしたらエラーが出た

# Macでjenprogを使った書き込み

プログラムモードにしたあとで、jenprogでbinファイルを指定して書き込む。
しかし、TWE-Liteのページは情報量が豊富なようなきがするんだけどやたらとわかりづらいような気がする。

```
$./jenprog -t /dev/tty.usbserial-AHXTVEKN  -s
$./jenprog -t /dev/tty.usbserial-AHXTVEKN  App_TweLite_Master_JN5164_1_6_6.bin
```

ここでエラーになってひやっとした。何回やってもエラーが出て、諦めかけたがケーブルを変えてやったら書き込めた。繊細みたい。書き込みでエラーになってもIPL的な部分は無事なので、成功するまで繰り返しチャレンジすれば焼ける。もう一枚のTWE-Liteも何回か失敗して、`-b 38400` を追加してボーレートを変えたら通った。

```
➜  jenprog  ./jenprog -t /dev/tty.usbserial-AHXTVEKN  App_TweLite_Master_JN5164_1_6_6.bin
*** jenprog ver 1.3 ***
 file info: 04 03 0008
writing...
  0%..
ERROR(2): communication with the target
```


成功すると下記のような表示になるので、再度リセットしてつなぎなおせばシリアル経由でアクセスできるようになる。

```
➜  jenprog  ./jenprog -t /dev/tty.usbserial-AHXTVEKN  App_TweLite_Master_JN5164_1_6_6.bin
*** jenprog ver 1.3 ***
 file info: 04 03 0008
writing...
  0%..10%..20%..30%..40%..50%..60%..70%..80%..90%..done - 7.89 kb/s
done

OK: firmware is successfully programmed.
```

## ボーレート指定の方法
```
➜  jenprog  ./jenprog -t /dev/tty.usbserial-AHXTVEKN  App_TweLite_Master_JN5164_1_6_6.bin -b 38400
```
SwiftBondの作者さんが作った新ライブラリ「ReactiveKit」を使ってみた

# SwiftBondの作者さんが作った新ライブラリ「ReactiveKit」を使ってみた

[SwiftBond](https://github.com/SwiftBond/Bond)の作者である@srdanrasicさんが、[ReactiveKit](https://github.com/ReactiveKit/ReactiveKit)というライブラリを開発していました。

https://github.com/ReactiveKit/ReactiveKit

この記事を投稿した（2015/11）時点で、スター数が30弱しかないです。

READMEを少し見てみたところ、ほぼSwiftBondですが、OperationというRxのObservableのようなものが追加されているようです。その他も少し変わっているっぽい？

ということで検証してみました。

**※ 今回検証するバージョンは「1.0.4」です。**

## Observable

### Basic

SwiftBondと同じですね。

```swift
let value1 = Observable(1)
let value2 = Observable(2)
        
print(value2.value) // => 2
        
value1.bindTo(value2) // バインド
        
print(value2.value) // => 1
        
value1.next(7)
        
print(value2.value) // => 7
```

### UIKit
ReactiveUIKitをimportすることでUIKitのObservableプロパティを使用することも可能です。ViewのプロパティとViewModelのプロパティのバインドするのに便利です。

```swift
textField.rText.bindTo(label)
textField.rText.bindTo(viewModel.emailAddress)
```

### Collection
配列はObservableCollectionを使います。

```swift
var list = ObservableCollection([Int]())
        
list.observe{e in
	print("array: \(e.collection), inserts: \(e.inserts)")
}
        
list.append(10) // => array: [10], inserts: [0]
list.append(10) // => array: [10, 10], inserts: [1]
```

## Operation
さらっと見た感じRxのObservableと同じようなものっぽいです。

### Operationの作成

ReactiveXのcreateメソッドと同じです。Operation構造体のイニシャライザにオブザーバーがセットされた時の処理を記述したクロージャを渡します。返り値にはDisposableType?を指定する必要があります。BlockDisposableを使うとdisposeされた時の処理をかけるっぽい。

```swift
let operation = Operation {(observer: OperationObserver<NSData, NSError>) in
	let request = Alamofire.request(.GET, url: url).response { _, _, data, error in
		if let error = error {
			observer.failure(error)
		} else {
			observer.next(data)
			observer.success()
		}
	}
	return BlockDisposable {
		request.cancel()
	}
}

let disposable = operation.observe(on: Queue.main.context){event in
	switch event{
	case .Next(let value):
		print(value)
	case .Failure(let error):
		print("エラーハンドリング \(error)")
	case .Success:
		print("Success")
	}
}
```

上記のコードは、オブザーバーがセットされた時にAlamofireでAPIを叩いて結果が返ってきた時にオブザーバーにイベントを伝える例です。リクエストキャンセルするには

```swift
disposable.dispose()
```

とすれば良いです。

うーん、めっちゃRxSwiftに似ているなぁ。

## StreamTypeとObservableとOperation
ObservableはObservableTypeに適合しており、OperationはOperationTypeに適合しています。さらに、ObservableTypeとOperationTypeは共にStreamTypeに適合しています。

つまり、ObservableやOperationに使えるメソッドはStreamTypeのProtocol Extensionで実装されているものがほとんどです。

メソッドは、Rxでよく見るmapやfilterやthrottleやzipなどなどです。

ReaciveKit = SwiftBond + RxSwift って感じなのかなーと個人的には思っています。
ライブラリのコード読んでいると基本的にSwiftBondのコードを流用しつつ新しい要素取り入れていってる感じでした。

## おまけ
StreamType ProtocolのExtensionで実装されているzipメソッドが凄かった

```swift
@warn_unused_result
public func zip<A: StreamType, B: StreamType, C: StreamType, D: StreamType, E: StreamType, F: StreamType, G: StreamType, H: StreamType, I: StreamType, J: StreamType, K: StreamType>
  ( a: A, _ b: B, _ c: C, _ d: D, _ e: E, _ f: F, _ g: G, _ h: H, _ i: I, _ j: J, _ k: K) -> Stream<(A.Event, B.Event, C.Event, D.Event, E.Event, F.Event, G.Event, H.Event, I.Event, J.Event, K.Event)>
{
  return zip(a, b, c, d, e, f, g, h, i, j).zipWith(k).map { ($0.0, $0.1, $0.2, $0.3, $0.4, $0.5, $0.6, $0.7, $0.8, $0.9, $1) }
}
```
HTMLセキュリティの用語まとめ

1. リダイレクト
2. プライベートブラウジング
3. コード・インジェクション
4. クレデンシャル情報
5. プライバシーポリシー
6. サブドメイン
7. オリジン
8. クリックジャッキング
9. Web Storage
10. Access-Control-Allow-Origin
11. Application Cache
12. Cross-Origin Resource Sharing
13. DNSキャッシュ・ポイズニング
14. DOM
15. XMLHTTPRequest Level2
16. X-Frame-Options
17. Web Workers
18. Web Messaging
19. Server-sent Events
20. DoS攻撃
21. Geo-location API
22. Server-sent Events
dockerでSPARK SQL

# DockerでSPARKを。

といっても、コンテナを一から作成するのは大変なので、sequenceiq/sparkを使わせてもらいます。
投稿時点では、1.5.1が最新でした。

# Dockerのインストールは省略
因みに使用バージョンは1.9.0

# Docker pull
といっても、導入に関しては下記に記載してくれているのでそのまま実行します。
https://hub.docker.com/r/sequenceiq/spark/

```> docker pull sequenceiq/spark:1.5.1
```
pull出来たら実行ですが、4040ポートも足してあげたいので下記のように。

```
> docker run -it -p 8088:8088 -p 8042:8042 -p 4040:4040 -h sandbox --name="spark" sequenceiq/spark:1.5.1 /bin/bash
```

起動したら、

```
> cd /usr/local/spark
> bin/spark-sql --master yarn-client
```
# Hadoop
yarnで起動したので、下記からクラスタを見れる。
http://127.0.0.1:8088/cluster

![All Applications 2015-11-20 00-20-41.png](https://qiita-image-store.s3.amazonaws.com/0/84915/ece7e9b0-36b3-b4cf-d230-2ff1a74f8007.png)



hostsにsandbox 127.0.0.1を追加しておけば、リンクからSpark Jobsも見れます。

![SparkSQL::172.17.0.3 - Details for Stage 1 (Attempt 0) 2015-11-20 00-22-32.png](https://qiita-image-store.s3.amazonaws.com/0/84915/2ed62b67-e3d0-036c-fa57-57b6690a1f1e.png)

dockerだからいぢったらcommitしておかないと後で泣いちゃうかも。
javascriptでループを管理するクラス「IntervalLoopManager」を作ってみました

# 目的
間隔をとってループを回したい。
ループを止めたり、間隔を変更したりしたい。

# 使い方

例として下記の関数をループさせます。

````js:sample_function_to_loop
function yourFunction() {
  // some process
}
````

## ループ開始

5秒間隔で実行させます。

````js
var managedLoop =
  new IntervalLoopManager(
    yoruFunction,
    { interval: 5000 }
  )
````
または

````js
var managedLoop = new IntervalLoopManager( yourFunction )
managedLoop.start({ interval: 5000 })
````

## 実行間隔時間の変更

7秒間隔に変更します。

すぐに変えたい場合

````js
managedLoop.restart({ interval: 7000 })
````

今のループが終わってからで良い場合

````js
managedLoop.assignValues({ interval: 7000 })
````

## ループ停止

````js
managedLoop.stop()
````

## ループ開始・再開

````js
managedLoop.start()
````

## ループのリセット

````js
managedLoop.restart()
````

## ループの動作判定

````js
if ( managedLoop.isRunning() ) {
  console.log('running')
} else {
  console.log('is not running')
}
````

説明は以上です。

# ソースコード

バクや改善点があれば、pull requestを投げていただくか、コメントで教えて頂けると嬉しいです。
https://github.com/asukiaaa/interval_loop_manager

````interval_loop_manager.js
var IntervalLoopManager = function(functionToLoop, options) {
  this.functionToLoop = functionToLoop
  this.assignValues(options)
  this.start()
}

IntervalLoopManager.prototype.start = function(options) {
  this.assignValues(options)
  if ( typeof this.interval === 'undefined' ||
       this.isRunning() ) {
    return
  }
  var that = this
  function loop(){
    that.functionToLoop()
    that.timeout = setTimeout(loop, that.interval)
  }
  loop()
}

IntervalLoopManager.prototype.stop = function() {
  if ( this.isRunning() ) {
    clearTimeout(this.timeout)
    this.timeout = null
  }
}

IntervalLoopManager.prototype.restart = function(options) {
  this.stop()
  this.start(options)
}

IntervalLoopManager.prototype.assignValues = function(options) {
  if ( typeof options !== 'undefined' ){
    if ( typeof options['interval'] !== 'undefined' ) {
      this.interval = options['interval']
    }
  }
}

IntervalLoopManager.prototype.isRunning = function(options) {
  return ( typeof this.timeout !== 'undefined' &&
           this.timeout != null )
}
````

以上、誰かのお役に立てれば幸いです。


# 参考
http://stackoverflow.com/questions/1280263/changing-the-interval-of-setinterval-while-its-running
Webセキュリティ 用語のまとめ

1. SQLインジェクション攻撃
2. クロスサイト・スクリプティング (XSS)
3. クロスサイトリクエストフォージェリ (CSRF)
4. HTTP ヘッダ・インジェクション
2. エスケープ処理
3. 共有資源
4. エスケープ処理
5. システム管理者
6. ショルダーハッキング
7. 静的プレースホルダ
8. 総当たり攻撃(ブルートフォース攻 撃)
9. 動的プレースホルダ
10. 排他制御
11. プレースホルダ
12. メールヘッダ・インジェクション
13. 文字エンコーディング
14. evalインジェクション
15. HTTP ヘッダ・インジェクション
16. OSコマンドインジェクション
17. Referer
18. オートコンプリート機能
19. 換金性の高い情報
18. UTF-8の非最短形式
19. Webアプリに渡されるパラメータ
20. 重要情報
21. クッションページ
22. コモンネーム(CN)
23. シェル呼び出し機能のある関数
24. 排他制御
25. プレースホルダ
26. 文字エンコーディング
27. ルート証明書
28. HSM(Hardware Security Module)
29. OSコマンドインジェクション
30. UTF-8の非最短形式
31. Webアプリに渡されるパラメータ
【緩募】Golangでスライスの型のキャストをする方法が知りたい

``[]float32``を``[]byte``にキャストしたい。けど方法がわからない。

http://qiita.com/mattn/items/176459728ff4f854b165

mattnさんがunsafeを使って、str→[]byteの方法を紹介してくれています。これが応用できないか？

float32だと分かりにくいので、uint16→byteで試してみます。gore上でやってます, 513, 1027という数値の配列をリトルエンディアンでうまくバイトごとに取れると、1, 2, 3, 4という配列になるはずなので、それを目標に。

unsafeで[]uint16を[]byteに
============================

```go
gore> a := []uint16{513, 1027}  // []uint16{0x201, 0x403}
gore> b := *(*[]byte)(unsafe.Pointer(&a[0]))

unexpected fault address 0x4030201
fatal error: fault
[signal 0xa code=0x2 addr=0x4030201 pc=0x5ced6]
```

だめでした。確かに、スライスは長さ情報を持つオブジェクトで、まったく別のものなのでダメかもしれません。

unsafeで[]uint16を[4]byteに
============================

```go
gore> a := []uint16{513, 1027}  // []uint16{0x201, 0x403}
gore> b := *(*[4]byte)(unsafe.Pointer(&a[0]))
[4]uint8{0x1, 0x2, 0x3, 0x4}
```

今度は長さ指定の配列に。今度はうまくいったように見えます。固定長配列の``[4]byte``から``[]byte``へのキャストは問題なくコピーなしでいけます。じゃあa[0]を変更してみますか。

```go
gore> a[0] = 0
0x0
gore> b
[4]uint8{0x1, 0x2, 0x3, 0x4}
```

あれ、変わってない。newされてコピーされてしまったようですね。

なお、元データの方を固定長配列にしても結果は同じでした。

今回はコピーがあろうがなかろうが、時間のペナルティはあるもののロジックは正しく動くので(union的にその後お互いにやりとりすることはなくて、OpenGLで送っちゃっておしまいなので)、このコピーは許容範囲ということにしておいてとりあえず作業は進めますが、もしゼロコピー化する方法が分かる方がいらっしゃいましたら教えて下さい。
ディスク容量が貧弱なYARNクラスタでSparkを動かす際の注意点

Apache SparkをYARN上で動かしていて、気づいたことのメモ。

ディスク容量が非常に小さいサーバをスレーブにしていた時に、ある程度Sparkアプリケーションを実行していると、NodeManagerのUnhealthy化が起きたので調査しました。

# NodeManagerのUnhealthyとは

YARNでは、各スレーブサーバで動作しているNodeManagerは自身のサーバでYARNコンテナの動作に利用するディスク領域のチェックを定期的に実行しています。パーミッションが適切か、ディスクの空き容量が十分余っているかを確認しており、デフォルトでは90%以上容量を使ってしまっていると、UNHEALTHYという状態であることをResourceManagerに通知し、新しいYARNコンテナの割り当てがされないようにします。

このあたりの仕様はHadoopのドキュメントに書いてあります。
https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/NodeManager.html

ただし、上記ページは左側のメニュー一覧には存在しないので、存在していることを知らないと辿りつけないという罠。。。

「NodeManager Unhealthy」とかでググるとStackOverflowとかいろいろ引っかかるので、皆一度はハマっているのかなぁと思います。

# NodeManagerのUnhealthy化が招くトラブル

Unhealthy化したNodeManagerはYARNコンテナ割当対象から外されるため、Hadoopクラスタ上で新しいアプリケーションを動かすためのリソース量が減ってしまいます。

大体、運用していると各スレーブに平均的に処理が分散されるので、NodeManagerのディスク使用量の推移もほぼ均等に進むため、いつのまにか使えるNodeManagerが1つも居なくなって、投入したYARNアプリケーションが進まなくなるという恐ろしい事態になります。

ResourceManagerのWebUIで「Unhealthy Nodes」列を見たり、`yarn node -list -all`コマンドで「Node-State」の列を見たりしてチェックします。`yarn node`コマンドは`-all`オプションを付けないと、UnhealthyになったNodeManagerを表示しないので注意が必要です。

# SparkとNodeManagerのUnhealthy化

SparkをYARN上で実行すると、アプリケーションごとにエグゼキュータが動作しているスレーブ上にDistributed CacheとしてSparkの設定ファイルやjarファイル(200MBくらいある！)を配布するようです。
このため、気づかないうちにNodeManagerが利用しているディスク容量が増加しがちです。

```
# ls -lRh filecache/
filecache/:
total 4.0K
drwxr-xr-x 2 yarn yarn 4.0K Nov 16 14:49 18

filecache/18:
total 176M
-r-x------ 1 yarn yarn 176M Nov 16 14:49 spark-assembly-1.5.2-hadoop2.6.0.jar
```

Sparkのドキュメントを改めて見ると、確かにそれっぽいことが書いてありました。

```
  Note that JARs and files are copied to the working directory for
  each SparkContext on the executor nodes. This can use up a significant
  amount of space over time and will need to be cleaned up. With YARN,
  cleanup is handled automatically, and with Spark standalone, automatic
  cleanup can be configured with the spark.worker.cleanup.appDataTtl property.
```
http://spark.apache.org/docs/latest/submitting-applications.html


YARNだと自動的にクリーンアップされると書いてありますね。
このクリーンアップを制御するパラメータを調査したところ、以下のものが該当しそうです。

```yarn-default.xml

  <property>
    <description>Interval in between cache cleanups.</description>
    <name>yarn.nodemanager.localizer.cache.cleanup.interval-ms</name>
    <value>600000</value>
  </property>

  <property>
    <description>Target size of localizer cache in MB, per nodemanager. It is
      a target retention size that only includes resources with PUBLIC and
      PRIVATE visibility and excludes resources with APPLICATION visibility
    </description>
    <name>yarn.nodemanager.localizer.cache.target-size-mb</name>
    <value>10240</value>
  </property>
```

デフォルトだと10分に1回チェックが走り、10GB以上になっていると削除が行われるようです。

ディスク容量が10GB以下のサーバ上でYARNを動かしているときは、このしきい値を変えた方が良さそうです。
普通はないと思いますが、手元のノートPC上でVMとしてHadoopクラスタを組んでいたりすると、たまにハマるんですよね。。。
HDFSが使う領域と共存してたりすると、影響がHDFS側にも出るのでさらにbad。


試しに、`yarn.nodemanager.localizer.cache.target-size-mb`をyarn-site.xmlで1024(=1GB)に変更してみたところ、NodeManagerのUnhealty化が発生しなくなりました。

だた、このクリーンアップ処理が動作してもNodeManagerのログには特にメッセージが出ないようです。
INFOくらい出してくれてもいいかも？
リンクを新規タブで開く方法(cakephp2系)

これがqiita初めての投稿になります。
とりあえず、ネットで調べたこととかを書いていき
自分の作業のまとめ的な形で残していこうと思い始めました。

まず、自分が使用しているcakephp のversionは
Release Notes for CakePHP 2.5.8.
です。

そこで、今回やりたかったことはリンクをクリックしたときに別のタブで開くようにします。

echo $this->Html->link('表示内容',
	array('controller' => 'Controller名', 'action' => 'Controller内のアクション名'));

最初はこんな感じでやってたんですが、
新規タブで開かなかったので、
http://ivoice.hateblo.jp/entry/2015/02/03/135858

を参考にして(ほとんど同じ)

echo $this->Html->link('表示内容',
	array('controller' => 'Controller名', 'action' => 'Controller内のアクション名'), array('target' => '_blank'));

とすることでリンクを新規タブとして開くことができました。


ここで、なぜこのような書き方をするのかというと
cakphp2系のドキュメントによると
HtmlHelper::link(string $title, mixed $url = null, array $options = array())
第3引数では$optionsを入れることができ、
$options (array) – HTML属性 の配列を設定します。
となるため、HTMLで新しいウインドウまたはタブを開く Target=”_blank” を使えるからです。

また、$options に confirm キーを指定すると、JavaScript の confirm() を
表示できるようになるそうです。


今回初めて、記事を投稿してみて、もっとドキュメントをよくよもうと思いましたまる


それでは、おかしいところや解釈が間違ってるところがあるかもしれませんが、
今回は、リンクを新規タブで開く方法(cakephp2系)についてまとめました！

ここまで読んでくださった人はありがとうございました！

おしまい。
一度のコマンドで過去のコミットを修正する (git fixup)

typoとか1行程度の変更とかすごい軽い修正を見つけた時、以前の変更にくっつけたい(fix,squash)時がある。
直前のコミットを修正したいなら`git commit --amend`で良いのだが、直前ではない何個か前のコミットを修正したい場合少し面倒。

一般的な流れは

```bash
git add
git commit

git stash
git rebase -i abcd12e^
# fix とか squash

git stash pop
```

参考:
[How can I easily fixup a past commit?](http://stackoverflow.com/questions/3103589/how-can-i-easily-fixup-a-past-commit)
[git: squash/fixup earlier commit](http://stackoverflow.com/questions/204461/git-squash-fixup-earlier-commit)

`git commit --fixup`とか`git rebase -i --autosquash`などの手がかりはあるが、人それぞれいろいろなやり方でやってるし、コマンド1回でちゃんと動くやつがうまく見つからなかった。

# git fixup

まだ、長い期間試してないが、数回試みて動いた一例
[git fixup (Gist)](https://gist.github.com/kyamaguchi/548d8b03880251f6827a)

`git-fixup`というファイルを`~/bin/`などに作成して、実行権限を与える(chmod)

```bash
git add
git fixup abcd12e
# OR
git fixup HEAD^
```

CONFLICTが起きた場合どうなるかは未確認

スクリプト内の`GIT_SEQUENCE_EDITOR`の変数が不要に見えたが、どうやらこれがrebaseを自動的に先に進める役割を果たしている模様（これを消すといつものrebaseのコミット履歴変更を尋ねる画面になる）

### Issues

[元ネタ](https://github.com/deiwin/git-dotfiles/blob/69270be52e60c8281c2d7fb18031cdc5c379c524/bin/git-fixup)を試したらエラーになるケースがあったので、AUTOSQUASHのオプションのケースだけに削ったら思い通りに動いた。

あと、`git stash --include-untracked`のオプションが付いていたが、これはけっこう危険（なので外した）
`include-untracked`の良い点としてはrebase時の追加/削除されたファイルによるCONFLICTが起こりにくくなる点だが、悪い点としてはignoreされているファイルが消えてしまうという問題がある。
Python の or と and 演算子の罠

普通、プログラム言語では`or`と`and` (または`||`と`&&`などの類似表現) は (2項の) 論理演算を意味します。
つまり`or`や`and`が返す値は bool 値 (True/False) です。
C系の言語では True/False が 1/0 で代用されたりもしますが、とにかく論理演算 or と and は論理値に相当する値を返します。
しかし、Python では、`or`と`and`は論理値を返すとは限りません。
Pythonにおいて、式`x and y`は、次と等価です：

```py
if not bool(x):  # xの論理値がFalseなら
    return x  # yを見ることなく、しかもFalseではなくxそのものをリターン
else:  # xの論理値がTrueなら
    return y  # bool(y) ではなく、yそのものをリターン
```
同様に、式`x or y`は次と等価です：

```py
if bool(x):  # xの論理値がTrueなら
    return x  # yを見ることなく、しかもTrueではなくxそのものをリターン
else:  # xの論理値がFalseなら
    return y  # bool(y) ではなく、yそのものをリターン
```
Pythonでは、長さ0の文字列の論理値が`False`、長さ1以上の文字列の論理値が`True`であることに気をつけると、次のようにまとめることができます：

```py
'123' or '456'  -> '123'  # bool('123') がTrueなので、 左辺値'123'をリターン
'123' or ''     -> '123'  # bool('123') がTrueなので、 左辺値'123'をリターン
''    or '456'  -> '456'  # bool('')    がFalseなので、右辺値'456'をリターン
''    or ''     -> ''     # bool('')    がFalseなので、右辺値''   をリターン
'123' and '456' -> '456'  # bool('123') がTrueなので、 右辺値'456'をリターン
'123' and ''    -> ''     # bool('123') がTrueなので、 右辺値''   をリターン
''    and '456' -> ''     # bool('')    がFalseなので、左辺値''   をリターン
''    and ''    -> ''     # bool('')    がFalseなので、左辺値''   をリターン
```
上の例では、`or`と`and`の結果であるにも関わらず、**`True/False`は一切返ってきません**。
もしもPythonで2項論理演算子 (orとand) から返ってくる値が常に論理値`True/False`であることを保証したい場合は、`bool(x) or bool(y)`または`bool(x) and bool(y)`とする必要があります (`bool(x or y)`, `bool(x and y)` でも良いですが)。
普通、`x`や`y`として論理値`True/False`以外の値を渡すことはないですが、自動的に`bool(x)`が評価されるため、たまに忘れることがあります。
なんでこんなことになっているのかというと、よく言われているのは、`None`の扱いが便利になるからだそうです。
Pythonでは`None`の論理値は`False`です (`bool(None) -> False`) ので、次のコード

```py
# x には None が格納されているのかどうかわからない
if x is None:
    x = '456'
# x = '456' if x is None とも書けるが個人的に好きじゃない
```
は、**`x = x or '456'`で代用できます**。
ただし、**等価ではありません**。`x`に 空文字列`''`や 空リスト`[]`が格納されていた時の振る舞いが異なります。
`x`に`''`や`[]`が格納されていた場合、`x is None`も`bool(x)`も`False`です。よって、 `is None`を用いたコードの場合`x`は再代入されませんが、
`x or '456'`を用いたコードの場合`x`には`'456'`が再代入されます。 

## 待て、 `if x or y:` はどうなる？
もしも`or`が論理値を返さないとするならば、`if`で今まで`x or y`を使っていたのは偶然うまくいっていたのか？
いえ、それは偶然ではなく必然的にうまくいっていました。
Pythonでは、`if`の条件式は勝手に真理値が判別されます。つまり、`if bool(x or y):` と同じことが勝手におこなわれています。
iOSでサイズクラスを使って特定のデバイスだけレイアウトを切り替える


AutoLayoutを使ってレイアウト設計をちゃんとすればデバイスサイズが違おうが、横に向けようがまぁまぁマトモな見た目になってくれます。
けれどレイアウトによっては横向きにした場合にあまりにもレイアウトが崩れてしまう場合、Landscapeを非対応にするとかそんな消極的なやり方をチョイスせず、どの向きでもベストな使い勝手を提供すべきでしょ、となった場合の手順。

##サイズクラスという考え方
サイズクラスというのはInterfaceBuilderにおけるこちらです。
![screen1.png](https://qiita-image-store.s3.amazonaws.com/0/77573/78b858ae-ccad-0178-2bc9-22ac009cb77d.png "screen1.png")

初期状態では「wAny hAny」となっていますがこれは全てのサイズに対応するデフォルトとしてのレイアウトを意味します。
この状態でうまく制約を設定してやればデバイスサイズや向きに関わらず、少なくともコントロール間の位置関係は維持してくれます。
この「wAny hAny」をクリックするとでてくる吹き出し内の枠をドラッグしてやると「Compact Width」とか「Regular Height」と表示されます。これが各デバイスサイズや向きに対応したサイズクラスで実機との対応関係は以下のようになります。

| デバイス/向き | 横サイズクラス | 縦サイズクラス |
|:-------------|:------------|:-------------|
| iPhone縦     | Compact      | Regular     |
| iPhone横     | Compact      | Compact     |
| iPhone6Plus横| Regular      | Compact     |
| iPad縦       | Regular      | Regular     |
| iPad横       | Regular      | Regular     |

6Plus以外のiPhoneはPortraitでは「CompactxRegular」なのにLandscapeでは「CompactxCompact」なので注意。
とりあえず実験用として「wAny hAny」でラベルを３つ配置してみます。

![screen2.png](https://qiita-image-store.s3.amazonaws.com/0/77573/7a3d1bc1-d6b6-43d1-6d9a-6fad0a868e3c.png "screen2.png")


サンプルとして分かりやすいレイアウトにしてみました。
それぞれ位置を固定できるようにAutoLayoutは設定済みです。
通常、ラベルに幅と高さは指定する必要はありませんが、ここでは縦書きにするためにLINE数を３〜4にした上で幅、高さも固定しています。シミュレータで動かしてみて横に向けるとこんな感じです。

![screen3.png](https://qiita-image-store.s3.amazonaws.com/0/77573/57834161-05c3-9f16-20a6-974c35df6cc1.png "screen3.png")



ここで、6Plusの場合のみ横を向いたら横書きになるようにしてみます。

##特定デバイスのレイアウトだけ変更する
まずサイズクラスを横向きのiPhone6Plusに当たる「wRegular hCompact」に変更します。

![screen4.png](https://qiita-image-store.s3.amazonaws.com/0/77573/2fec27c4-1da6-4731-cbfe-5ad6a1925b89.png "screen4.png")

ラベルの文字を横書きにしたいので幅/高さを固定している制約を解除します。
アウトラインから各ラベルに設定しているwidthかheightの制約を１つ選択します。
そしてサイズインスペクターの一番下にいる「installed」の左側にある「+」をクリックします。

![screen5.png](https://qiita-image-store.s3.amazonaws.com/0/77573/e359854a-2f25-3bcf-02a0-e879b3b15ea1.png "screen5.png")



表示されるポップアップに現在表示中のサイズクラスである「Regular width | Compact height」という行があるので選択します。
すると先ほどまで「installed」とあった行の下に「wR hC　installed」という行が追加されました。
この新たに追加された行にチェックが入っていると思いますが、これを外します。
こうすることで「Regular width | Compact heightの時はこの制約は有効ではない」という指定がなされたことになります。
同様の設定を各ラベルのwidth/height制約に対して行っていきます。

次に一番上のラベルを左に寄せるためにtrailingを、一番下のラベルを右に寄せるためにleadingを変更します。
それぞれの制約を選択して「wR hC」のサイズクラスを追加してチェックを外します。
次に各ラベルを適切な位置に移動して一番上のラベルにはLeading制約、一番下のラベルにはTrailing制約を追加します。
アウトラインはこんな感じになります。

![screen6.png](https://qiita-image-store.s3.amazonaws.com/0/77573/6e8e4d4f-19bb-3be8-514a-d2eaec281f14.png "screen6.png")


色が薄くなっている箇所は現在のサイズクラスでは無効になっている制約です。
これを6Plusで実行してみましょう。

Portrait時
![screen7.png](https://qiita-image-store.s3.amazonaws.com/0/77573/3923df0b-6fb6-cf0a-fbb3-6692fb5e2f90.png "screen7.png")


Landscape時
![screen8.png](https://qiita-image-store.s3.amazonaws.com/0/77573/e2d11dc1-962c-3b8f-0235-c5317c9fdea3.png "screen8.png")



##課題
このサンプルプログラムですが、上下逆さまにすると横向き扱いです。
ソースコード（と言ってもStoryboardしか触ってませんが）は[こちら](https://github.com/kukimo/SizeClassSample)に置いているので興味ある方は直してみてください。
ちなみに私は直し方が分かりません。。
PowerShell でウインドウの位置と大きさを指定

アプリケーションのウインドウの位置と大きさをコマンドで指定してみたかったので、やってみた。

今回は下記のCodeを参考に実装。コードは[Code](#code)の節参照。

* [win7 powershell script to automatically resize a minecraft window for 1280x720 HD fraps recording. · GitHub](https://gist.github.com/coldnebo/1148334)



## 使ってみる

### 位置と大きさの取得

下記の通り、`Get-WindowRect`で左上の位置と大きさを取得できる。

```
PS> Get-WindowRect * | ft

Name            X      Y Width Height
----            -      - ----- ------
EXCEL         650     92   702    525
powershell     38    131   589    615
```

![001.png](https://qiita-image-store.s3.amazonaws.com/0/36744/71ae646a-1836-7950-b2f5-3057666546e7.png)

### 位置と大きさの指定

下記の通り、`Move-WindowRect`で左上の位置と大きさを指定できる。

```
PS> Move-WindowRect powershell 650 92 702 525
PS> Move-WindowRect Excel 38 131 589 615
PS> Get-WindowRect * | ft
Name            X      Y Width Height
----            -      - ----- ------
EXCEL          38    131   589    615
powershell    650     92   702    525
```

![002.png](https://qiita-image-store.s3.amazonaws.com/0/36744/a11a2b4e-04d1-e3cd-5760-f587ee45e181.png)


### 位置と大きさの保存、復元

`Export-WindowRect`で、各ウィンドウの現在の位置と大きさをcsvファイルに吐き出し、それを`Import-WindowRect`で読みこめば各ウィンドウの位置と大きさを復元できる。

```
PS> Export-WindowRect .\wr.csv
PS> cat .\wr.csv
"Name,"X","Y","Width","Height"
"EXCEL,"38","131","589","615"
"powershell,"650","92","702","525"
PS> 
PS> # 適当にウィンドウを動かして、大きさを変える
PS> 
PS> Import-WindowRect .\wr.csv
```




# Code

```ps1
filter Import-WindowRect ($Path)
{Import-Csv $Path | %{Move-WindowRect $_.Name $_.X $_.Y $_.Width $_.Height}}

filter Export-WindowRect ($Path)
{Get-Process -Name * | %{Get-WindowRect $_.Name} | Export-Csv $Path -Encoding UTF8 -NoTypeInformation}

filter Move-WindowRect
{
  Param
  (
    [String]$Name,
    [Int]$X = 0,
    [Int]$Y = 0,
    [Int]$Width = 400,
    [Int]$Height = 300
  )

  Get-Process -Name $Name | ?{$_.MainWindowTitle -ne ""} | %{
    [Win32]::MoveWindow($_.MainWindowHandle, $X, $Y, $Width, $Height, $true)
  } | Out-Null
}

filter Get-WindowRect ([String]$Name)
{
  Get-Process -Name $Name | ?{$_.MainWindowTitle -ne ""} | %{
    $rc = New-Object RECT
    [Win32]::GetWindowRect($_.MainWindowHandle, [ref]$rc) | Out-Null
    ConvertTo-Rect2 $_.Name $rc
  }
}


# Helper
# ------

filter ConvertTo-Rect2 ($name, $rc)
{
  $rc2 = New-Object RECT2

  $rc2.Name = $name
  $rc2.X = $rc.Left
  $rc2.Y = $rc.Top
  $rc2.Width = $rc.Right - $rc.Left
  $rc2.Height = $rc.Bottom - $rc.Top

  $rc2
}

# C#
# --

Add-Type @"
  using System;
  using System.Runtime.InteropServices;

  public class Win32 {
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
  }

  public struct RECT
  {
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
  }

  public struct RECT2
  {
    public string Name;
    public int X;
    public int Y;
    public int Width;
    public int Height;
  }
"@
```
line monitor > UI部分(v0.1) > UDP受信 (ring buffer)を実装

line monitor
http://qiita.com/7of9/items/028556c5a819a6a8de96

RS-232Cラインモニタに関して、UI部分の実装を始めている。

```txt:実装環境
Unity 5.1.3-f1 on MacOS X 10.8.5
```

## 受信側 (MacOS X 10.8.5, IP: 192.168.10.4)

Unity にて実装

[v0.1 @ github](https://github.com/yasokada/unity-151117-linemonitor-UI/releases/tag/v0.1)

実装できたのは以下
- UDP受信 (RingBuffer対応)

## 送信側 (CentOS 6.5)
http://qiita.com/7of9/items/3da0eb0cad00584cc5db
で作ったv0.3をRPi2で使ってもよかったが、bashでUDP送信だけのスクリプトを作った.

```bash
#!/usr/bin/env bash

for idx in $(seq 1 100); do
	date | nc -w 1 -u 192.168.10.4 9000
	sleep 1
done
```

2秒おきに日付情報をUDP送信する (ポート9000)

## 実行の様子

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/aef9d180-41f4-8403-2333-006b0ca02a48.png)

最新の6行を残すようにしてる。最後の１行が空白になっているので、5行のデータが表示される。
MyBatisGeneratorに関するメモ

転職により開発環境が一新して、覚える事ばかりなので、
自分用のメモも兼ねてQiitaに登録してみた。

お仕事で使う開発環境で覚えたことを書いていきます。

# MyBatis
> Javaならびに.NET Frameworkで利用可能な、XMLまたはアノテーションを用いてストアドプロシージャやSQL文をオブジェクトと紐付ける永続性フレームワークである。

(引用：Wikipedia)

で、MyBatisGenerator。
DB環境を作成済であれば、configファイルからJavaソースが生成できる。

- Mapperクラス(java)
- Entityクラス(java)
- Mapper(XML)

生成されるのは上記の3種類。
生成時に作成するDDLメソッドを決めるので、CRUDの設計は事前にしっかりしておく必要がある。
(selectで参照するだけのテーブル、とかinsertするけどupdate・deleteはさせない。とかとか)

テーブル1つに閉じた単純SQLであれば、自動作成できるExampleメソッドを通してWHERE句の実装をJava内で行える。
テーブルをJOINして返却させたり、副問い合わせを使うようなケースではXMLの手直しが必要。

とりあえず今日理解したのはここまで。

明日は、2テーブルをJOINして返却する際の流れを覚える予定。
(XML作ってみたものの、実行エラーになって挫折した！)
Decision Tree

#決定木Decision Tree：rpart.control( )

##データの作成と取得
「kguの日記」さんをなぞっていきます。
まずはサンプルデータを手作業で作成し、それをread.table( )でRに取り込みます。

```
gender	age	income	most_cost
male	22	330	food
male	25	390	food
male	29	450	food
male	31	490	beauty
male	35	520	learning
male	39	640	car
male	40	630	car
male	47	600	car
male	49	790	car
male	51	530	learning
male	53	540	learning
male	57	800	car
male	60	450	food
male	68	330	food
male	72	310	food
female	22	310	food
female	24	320	food
female	27	400	food
female	31	410	food
female	35	450	beauty
female	37	530	beauty
female	42	590	beauty
female	47	700	car
female	49	600	beauty
female	50	420	food
female	55	510	beauty
female	59	390	food
female	62	600	learning
female	63	350	food
female	79	300	food
```

```
data <- read.table("/Users/kazuki/Desktop/data.txt",header=T)
```

##決定木decision treeの作成
rpart, partykitライブラリを用いて決定木のグラフを書きます。

```
> library(rpart)
> library(partykit)
rpctrl <- rpart.control(minplit=10)
> model = rpart(most_cost~., data, control=rpctrl)
> plot(as.party(model))
```


![スクリーンショット 2015-11-19 21.35.30.png](https://qiita-image-store.s3.amazonaws.com/0/72840/6e34977c-f523-7cb6-e7d9-b5380de1956c.png)


##決定木による予測

テストデータを作成します。

```
gender	age	income	most_cost
male	45	290	    food(exp)
male	57	730 	car(exp)
female	33	490	    beauty(exp)
```

このデータから、先ほどの決定木にかけてみることで予測が可能です。(要考！)

```
> test <- read.table("/Users/kazuki/Desktop/test.txt",header = T)
> pred <- predict(model, test)
> pred
      beauty car      food  learning
1 0.06666667 0.0 0.9333333 0.0000000
2 0.33333333 0.4 0.0000000 0.2666667
3 0.33333333 0.4 0.0000000 0.2666667
```



[参考 http://d.hatena.ne.jp/kgu/20140104/1388812002]
MacOSX > spotlight > MyNetUtil.csのように"Util.cs"で終わるファイルの検索 > "Util.cs"で検索

```txt:動作環境
MacOS X 10.8.5
```

Unityの複数のプロジェクトで...Util.csのような名前付けのファイルをいくつか作った。
今やろうとしているString関連の処理で同じような名前のファイルがないか知りたかった。

MacOS Xのsplotlightで検索してみた。

1. "*Util.cs"で検索 >> 結果0 
2. "Util.cs"で検索 >> いくつか出てきた。

アスタリスクはいらないようだ。

さらに、2の結果の中で「Finderにすべてを表示します」というのがある(下図)。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/edaf1eda-6dda-8b91-ef9b-98d10b1dde35.png)

この「Finderにすべてを表示します」を選択することで、検索にひっかかったファイル全てを見れて便利だ。

Finderを開いてからは、「変更日」でソートすれば最終更新のファイルなど分かりそう。
また、Finderにてファイルをクリックすると、その保存フォルダは下部に表示されるので知ることができる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f3985bbf-73c3-7e61-5707-b0d9e85fc086.png)
Python - アンチエイリアスで写真をキレイに縮小

アンチエイリアスを掛けると写真縮小時のジャギジャギが軽減します。フォルダ内の写真ファイルをアスペクト比（縦横比率）を保ったまま一括で縮小してアンチエイリアスを掛け保存するPythonコードです。

# アンチエリアスあり/なし比較
4000pxくらいの写真を300pxに縮小して比較しました。AA有りの鳥画像は地面の小さな砂が、地面と色が一体化して見えにくくなっています。


![スクリーンショット 2015-11-19 21.03.02.png](https://qiita-image-store.s3.amazonaws.com/0/65312/f45a21ad-2202-5b0f-16c9-cff81a3cbf7e.png)
![スクリーンショット 2015-11-19 21.03.06.png](https://qiita-image-store.s3.amazonaws.com/0/65312/624a308f-d4ca-8c64-d2d1-94a5678af751.png)




# インストール

```shell-session
# PILのインストール
pip install PIL --allow-external PIL --allow-unverified PIL
```

# 拡大と縮小のコード
macのpython2.7環境でのみ動作確認済み

```py:resize.py

# -*- coding: utf-8 -*-
import commands
import Image
import re

# 縮小する際の画像の高さピクセル
PHOTO_HEIGHT = 300

# 画像があるフォルダのフルパス
BASE_DIR = "/Users/XXXXX/Desktop/Photos"

# 画像の正規表現名
PHOTO_REGEX = r"P.*.[jpg|JPG]"

# リサイズ後の画像の接頭語
PHOTO_RESIZE_PREFIX = "r_"


def main():
    # 画像フルパスを取得
    _cmd = "cd {} && ls".format(BASE_DIR)
    l = commands.getoutput(_cmd)
    l = l.split("\n")
    l = [_l for _l in l if re.match(PHOTO_REGEX, _l)]

    # 出力用のフォルダを生成
    commands.getoutput("mkdir {}/output".format(BASE_DIR))

    # 既存ファイルを readモードで読み込み
    for _l in l:
        before_path = '{}/{}'.format(BASE_DIR, _l)
        filename = '{}{}'.format(PHOTO_RESIZE_PREFIX, _l)
        after_path = '{}/output/{}'.format(BASE_DIR, filename)
        resize(before_path, after_path, filename=_l)  # 縮小


def resize(before, after, height=PHOTO_HEIGHT, filename="", aa_enable=True):
    """
    画像をリサイズする
    :param str before: 元画像ファイルパス
    :param str after: リサイズ後の画像ファイルパス
    :param int height: リサイズ後の画像の高さ
    :param bool aa_enable: アンチエイリアスを有効にするか
    :return:
    """
    # 画像をreadonlyで開く
    img = Image.open(before, 'r')
    # リサイズ後の画像ピクセルを計算
    before_x, before_y = img.size[0], img.size[1]
    x = int(round(float(height / float(before_y) * float(before_x))))
    y = height
    resize_img = img
    if aa_enable:
        # アンチエイリアスありで縮小
        resize_img.thumbnail((x, y), Image.ANTIALIAS)
    else:
        # アンチエイリアスなしで縮小
        resize_img = resize_img.resize((x, y))

    # リサイズ後の画像を保存
    resize_img.save(after, 'jpeg', quality=100)
    print "RESIZED!:{}[{}x{}] --> {}x{}".format(filename, before_x, before_y, x, y)

# 実行
main()

```

```shell-session:実行結果
>>> python resize.py
RESIZED!:P1040673.jpg[4592x3448] --> 400x300
RESIZED!:P1050388.JPG[4592x3448] --> 400x300
RESIZED!:P1050389.JPG[4592x3448] --> 400x300
RESIZED!:P1050390.JPG[4592x3448] --> 400x300
RESIZED!:P1050391.JPG[4592x3448] --> 400x300
RESIZED!:P1050392.JPG[4592x3448] --> 400x300
RESIZED!:P1050393.JPG[4592x3448] --> 400x300
RESIZED!:P1050394.JPG[4592x3448] --> 400x300
```
Windows版DockerでROSを動かしてみたメモ

実質Ubuntuのみで動くROSをDockerから使えるようなので，Windows上で試してみたメモ

Tutorialが用意されているようなので，こいつをやってみる
https://hub.docker.com/_/ros/

##使用した環境

- Windows 10 Education

- Docker 1.9.0

http://docs.docker.com/engine/installation/windows/ に従ってDockerを入れ， ほかは何もしていない状態を仮定

##Dockerfileの準備
インストール時に出来たDocker Quickstart Terminalを開く．
VMが立ち上がったらとりあえず作業用フォルダを作成．

```
$ mkdir -p workspace/ros-tutorials
$ cd workspace/ros-tutorials
```

チュートリアルで使う最小限のROS構成をDockerで構成

```
$ vi Dockerfile
```
このファイルに下記の内容を記載．

```
FROM ros:indigo-ros-base
# install ros tutorials packages
RUN apt-get update && apt-get install -y \
    ros-indigo-ros-tutorials \
    ros-indigo-common-tutorials \
    && rm -rf /var/lib/apt/lists/
```

そしてこれをビルドする．apt-getなどをするので少し時間がかかる．

```
$ docker build --tag ros:ros-tutorials .
```

##ROSの通信をしてみる
###ネットワークの作成
まずは，ROSノードたちが通信するネットワークを作成する．

```
$ docker network create foo
```
###Masterの起動
次に，コンテナの作成とその中でのプロセス起動を行う．
２行目のコマンドは，もとは--publish-serviceだったけれど，今は--netを使うようになっているらしい．
(参考:https://github.com/docker/libnetwork/issues/662)

```
$ docker run -it --rm \
--net=foo \
--name master \
ros:ros-tutorials \
roscore
```
これでroscoreが起動する．

###パブリッシャーの起動
DockerはOne container one processらしいので，次のコンテナにプロセスを起動してみる．
新しくDocker Quickstart Terminalを開いて，下記を実行

```
$ docker run -it --rm \
--net=foo \
--env ROS_HOSTNAME=talker \
--env ROS_MASTER_URI=http://master:11311 \
--name talker \
ros:ros-tutorials \
rosrun roscpp_tutorials talker
```

これでパブリッシュするノードが動き始めた．

###サブスクライバーの起動
次にこれをサブスクライブしてみる．
Docker Quickstart Terminalを開いて，下記を実行

```
$ docker run -it --rm \
--net=foo \
--env ROS_HOSTNAME=listener \
--env ROS_MASTER_URI=http://master:11311 \
--name listener \
ros:ros-tutorials \
rosrun roscpp_tutorials listener
```

いい感じに通信できましたとさ
csharp > string > ringBuffer > 最新の数行を常に保持

通信などで受信をし続ける場合、最新の数行の文字だけ保持したい。
その実装を以下のようにした。

https://dotnetfiddle.net/LEmRWi

```test.cs
using System;
using System.Linq;
					
public class Program
{
//	public static string addString(string src, string addStr) //{
//			return src + addStr;
//	}
	public static string removeLine(string src, int numRemove)
	{
		string work = src;
		for(int loop=0; loop < numRemove; loop++) {
		  int pos = work.IndexOf('\n');
		  work = work.Substring(pos+1);
		}
		return work;
	}
	public static string addToRingBuffer(string src, string addStr, int maxline) 
	{
		string work = src + addStr;
		int numline = work.Count( c => c == '\n') + 1;
		int numRemove = numline - maxline;
		work = removeLine(work, numRemove);		
		return work;
	}
	
	public static void Main()
	{
		string text = "AAA\nBBB\nCCC\nDDD\nEEE\n";		
		text = addToRingBuffer(text, "FFF\n", /* maxline=*/5);
		Console.WriteLine(text);
		text = addToRingBuffer(text, "GGG\n", /* maxline=*/5);
		Console.WriteLine(text);			
	}
}
```

```txt:結果
CCC
DDD
EEE
FFF

DDD
EEE
FFF
GGG

```

FFFの後とGGGの後は空白の1行があるので、「最新の５行を保持」という機能が働いしていることが分かる。

あまりスマートな実装ではないが機能としては使える。
csharp > string > 改行の数のカウント > return s.Count( c => c == '\n' ) + 1; > 遅いらしい

C#にて改行の数を取得する色々な方法の処理時間。

参考: [SO](http://stackoverflow.com/questions/2557002/what-is-the-fastest-way-to-count-newlines-in-a-large-net-string)

> Here are my timing results for 100000 iterations on a string of ~25k. Lower is faster.

```
              Time  Factor
Count1   4.8581503     1.4
Count2   4.1406059     1.2
Count3  45.3614124    13.4
Count4   3.3896130     1.0
Count5   5.9304543     1.7
```


Count3というのが以下。

```test.cs
private static int Count3(string s)
{
    return s.Count( c => c == '\n' ) + 1;
}
```

Count3は遅いが、1行で意味がすぐに分かる上記の書き方はソースリーディングしやすそう。

上記の時間は25k程度の文字で100,000回の処理なので、1000文字程度の処理であれば使っても影響は少ないと考えている。
csharp > string > 先頭のN行を取り除く > IndexOf()とSubstring()の組合せ

参考 [SO](http://stackoverflow.com/questions/4940124/how-can-i-delete-the-first-n-lines-in-a-string-in-c)のLukas Novotnyの
> Combination of C# - indexOf the nth occurrence of a string? (search for Environment.NewLine) and substring should do the trick.

上記の考えを参考に以下のように実装した。

```test.cs

public string removeLine(string src, int numRemove)
{
	string work = src;
    for(int loop=0; loop < numRemove; loop++) {
      int pos = work.IndexOf('\n');
      work = work.Substring(pos+1);
    }
    return work;
}

public void Main()
{
  string text = "AAA\nBBB\nCCC\nDDD\nEEE\nFFF\n";
  string res;
  
  res = removeLine(text, /* numRemove=*/2);
  
  Console.WriteLine(res);  
}
```

```txt:結果
CCC
DDD
EEE
FFF
```
csharp > string > 4番目から最後までを取得 > .Substring(3)

参考
http://dobon.net/vb/dotnet/string/substring.html

```test.cs
string text2 = "123456789";
string res = text2.Substring(3);
Console.WriteLine(res);
```

```txt:結果
456789
```

C++ Builderなどでは SubString(位置, MAXINT)のような記載をしたりしていたが、C#の場合は単純に2つ目のパラメータを省略すればいいようだ。
画像認識のフレームワークcaffeとGPUについての調査


# 概要

機械学習のためのライブラリえあるcaffeを使用するに当たって、GPUが必要ということで調べたことのまとめ。

1. GPUとはなにか
2. ローカル編
3. リモート編
4. 結論


# 1. GPUとは

## キーワード

* CPU
* GPU
* AMD
* NVIDA
* CUDA

## 内容

GPUはCPUの最強バージョン...というわけではなく、CPUとGPUは全然違うもの。
CPUはセントラルプロセッシングユニット(中央処理装置)、GPUはグラフィックプロセッシングユニット。

CPUは連続的な計算が得意で、対してGPUは並列的な演算が得意。
名前の通り、GPUは画像処理を得意としています。

さて、GPUを開発している会社は、Intel、NVIDIA、AMD/ATI、...などがあります。
この中で、NVIDIAが開発しているGPUは、CUDA(クーダ)というGUIを使って開発を行うことができるという特徴があり、caffeはCUDAを利用しています。

## 参考

GPUについては以下のページに詳しく書いてます。
http://www.gdep.jp/page/view/248


# 2. ローカル編

## 結論

Mac Bookだとcaffeを動かすことは出来ない。

## 詳細

現在発売しているmac bookだと、基本的にintelのPro GaraphicsというGPUが積まれてます。
さらに15インチ以上からAMD RadeonというGPUを積んでるモデルがあります。
http://www.apple.com/jp/shop/buy-mac/macbook-pro

しかしcaffeは、CUDAを使わないと動かない、つまり、NVIDIAのGPUじゃないと動きません。
なのでせっかく良いGPUを積んだmacを買っても、現状xaffeは動かせません。

なお、2014年のモデルだとNVIDIAのGPUを積んでるので、動かせるかもしれません。
http://little-beans.net/exposition/mbp15-mid2015/

## 参考

ローカルでは素直にCPUモードで動かす。
http://qiita.com/knao124/items/c76e974cfbaabb5542e8



# 3. リモート編

## 結論

AWSでGPUを動かせる。g2.2xlargeなどが該当。
https://aws.amazon.com/jp/ec2/pricing/

## 詳細

気になるのは値段。2週間付けっぱなしで、2万円程度かかるとのこと。
http://qiita.com/knao124/private/5993b500e3bfc575060a

トレーニング中のみ起動して、それ以外の時はstopするといった作戦もある。
テストのときは別のインスタンスで動かす。

## 参考

AWSでcaffeを動かす方法。
http://hogehuga.com/post-438/


# 4. 結論

ローカルでGPUモードを動かすことは諦めて、GPUを積んだAWSのインスタンスを借りる。
トレーニング中のみ当該インスタンスを起動させ、テストは別のCPUで動かす(ローカルでもOK)。
冷静に考えて、ローカルに大量の画像を保存したり、GPUでがんがん重い処理をやってるというのも、そんな気分の良い話ではない。
【Swift2.0】String型をInt型に変換する

# Swift2.0でString型をInt型に変換する

※勉強用メモ

背景
toInt関数がSwift2.0で使えなくなった。
そのため代替え方法を調べた。

以下の記述にすることでString型からInt型への型変換が可能に。

注意点
数値に変換できない文字列を変換しようとするとnilが返ってくるので注意。

コード

```swift

   let strVal: String! = "123"
if let intVal: Int? = Int(strVal) {
   print(intVal)
}

```

結果

```swift

intVal : 123
```

Swift2.0の情報が少なすぎる。。。

# 補足
サンプルコードにおいてnilの場合の考慮と定数宣言にする箇所ができていなかった為、修正しました。
関数言語の話


## 簡単な紹介
- 関数言語は、誕生してから約50年になります。
- 主な関数言語は、Erlang、Haskell、Scheme、clojure、Scala、LISP。
- 最近大規模な開発で、関数言語を用いて、注目されています。
- 例：WhatsAppの例だと、Erlangによって構築され、月間アクティブユーザーが4億5000万時に、エンジニアの数32人。

## スタイル
関数言語の基本のスタイルは、[プログラミングパラダイム](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%91%E3%83%A9%E3%83%80%E3%82%A4%E3%83%A0)(英: programming paradigm)である。
>関数型プログラミングにおいては、状態を持たない関数の評価の連続である。(引用)

簡単にいうと、複数の式を関数の適用によって組み合わせていくプログラミングというスタイルです。

下記の例で見てみましょう。

```lang:問題
(1 + 2) * 3 - 4
```

```lang:javascript　答えのイメージ
var a = 1 + 2;
var b = a * 3;
var c = b - 4;
```
```lang:関数言語　答えのイメージ
var result = subtract(multiply(add(1,2), 3), 4);
```
関数型プログラミングは複数の式を関数の適用によって組み合わせていくプログラミングスタイルである

## 特徴

#### [1) **第一級関数**](https://ja.wikipedia.org/wiki/%E7%AC%AC%E4%B8%80%E7%B4%9A%E9%96%A2%E6%95%B0)
**僕的**の理解の第一級関数とは、関数とデータ型と同じく、変数の割り当てることができるし、変数で別の関数の引数としてもできます。また関数の戻る値としても可能です。

たとえば、下記のprintは関数である，引数もしている。
var print = function(i){ console.log(i);};
[1,2,3].forEach(print);


#### 2) **副作用ない**(完全ではないけど)
いわゆる「副作用」（side effect）は、関数内と関数外の動作の関連性があること。最も典型的なケースは、グローバル変数の値の変化である。変更より関数内部に影響与える。
関数型プログラミング、「副作用」を無くすを強調し、関数の独立性を重視します。特に外部変数の値を変更しないことです。

#### 3) **参照透過性**（Referential transparency）
参照透過性とは、関数の結果は、関数外の変数、変量に影響しないことです。関数の結果は、引数により、違う結果になるけど、環境変数などの影響しません。これにより、副作用のない開発になります。

#### **開発早くなる**
関数言語なれると、開発はやくなります。
ある意味では、関数言語は、自然言語ともいえます。下記の例を見てみましょう。

```lang:関数言語の表現
 ■ (1 + 2) * 3 - 4 を求める

　eg1)　subtract(multiply(add(1,2), 3), 4)
　eg2)　add(1,2).multiply(3).subtract(4)　#　これもいけます

 ■  合併、ソート、検索を求める
　eg)　merge([1,2],[3,4]).sort().search("2")　#　わかりやすい
```

#### ソース管理
関数言語の副作用ない、個々の関数の独立性が高いため、unit testingとdebugしやすい。
ソース管理コスト低いと思います。

#### 並列開発向き
関数言語は、deadlockの考量必要ないです。各プロセスは、独立し、lockという概念がないのです。


#### 最後erlangの並列の例で終りします
```lang:正方形＆円の計算
-module(area_server).
-export([loop/0]).

loop() ->
   receive
      {rectangle, Width, Height} ->
         io:format("Area of rectangle is ~p~n", [Width * Height]),
         loop();
      {circle, R} ->
         io:format("Area of circle is ~p~n", [3.141519 * R * R]),
         loop();
      Other ->
         io:format("Error ~p~n", [Other]),
         loop()
   end.
```

```lang:プロセスの生成
1> c(area_server).
{ok,area_server}
2> Pid = spawn(fun area_server:loop/0).
<0.37.0>
```

```lang:Pidプロセスにメッセージを送信
 Pid ! {rectangle, 5, 12}.
{rectangle,5,12}Area of rectangle is 60
```

```lang:Pidプロセスに別の引数を指定してメッセージを送信
4> Pid ! {circle, 7}.
{circle,7}Area of circle is 153.934

5> Pid ! {triangle, 3,4,5}.
{triangle,3,4,5}Error {triangle,3,4,5}
```
OCaml でマイナンバーのチェックデジットを計算する

cf. [マイナンバーのチェックデジットを計算する](http://qiita.com/qube81/items/fa6ef94d3c8615b0ce64)
n+1 匹目のドジョウに挑戦。

```ocaml:mynumber.ml
let digits_pattern = Str.regexp "^[0-9]+$"

let checkdigit n =
  let q i =
    if i < 6 then i + 2
    else i - 4 in
  let rec accumulate n i acc =
    if n = 0 then 11 - (acc mod 11)
    else accumulate (n / 10) (i + 1) (acc + (n mod 10) * (q i)) in
  if String.length n <> 11
     || not (Str.string_match digits_pattern n 0) then None
  else Some (accumulate (int_of_string n) 0 0)

let valid n =
  String.length n = 12
  && Str.string_match digits_pattern n 0
  && let c = (int_of_char n.[11]) - (int_of_char '0') in
     let m = String.init 11 (fun i -> n.[i]) in
     match checkdigit m with
     | None -> false
     | Some d -> c = d

let () =
  List.iter
    (fun n -> Printf.printf "%s: %b\n" n @@ valid n)
    [ "123456789010";
      "123456789011";
      "123456789012";
      "123456789013";
      "123456789014";
      "123456789015";
      "123456789016";
      "123456789017";
      "123456789018";
      "123456789019";
      "023456789013" ]
```

`checkdigit` はマイナンバーの先頭11桁を `string` として取ってチェックディジットを計算する関数。入力文字列が数字じゃなかったり桁が足りない場合失敗するため戻り値の型は `int option`。
`valid` はマイナンバー12桁を `string` で受けて `checkdigit` で得たチェックディジットが与えられたものと同じか突き合わせるだけ。

入力チェックは横着して正規表現。`Str` がサポートする正規表現は PCRE じゃないので `\d` を `[0-9]` としています。`\A` や `\z` もないので入力が改行を含む場合は知らない。

整数型が11桁以上必要なので 32bit 環境だと動かないと思います。

コンパイルして実行:

```
$ ocamlfind ocamlc -linkpkg -package str mynumber.ml
$ ./a.out 
123456789010: false
123456789011: false
123456789012: false
123456789013: false
123456789014: false
123456789015: false
123456789016: false
123456789017: false
123456789018: true
123456789019: false
023456789013: true
```

合ってますね。
Quick[select]でフォームを自動送信させない

[Quick[select]](http://quick-select.eggbox.io/)ってすごく秀逸なアイデアですよね。
プルダウンとラジオボタンだと後者のほうが「ちゃんと選ばれる」率が高いのですが、項目数が増えると表示領域をとっちゃうので、Quick[select]が提案してる「よく使われる項目だけ外出しにする」というのはすばらしい。

さっそく「まんがseek」の管理画面でも使ってみました。
これが以前の画面です。ある人物が当該マンガ作品にどんな役割を担っているかを選択するところです。

![old.png](https://qiita-image-store.s3.amazonaws.com/0/32093/47c01064-0036-7fb1-ea48-04ed26c9e636.png)

Quick[select]を使用するとこうなります。
よく選択される項目だけボタン化しています。

![new.png](https://qiita-image-store.s3.amazonaws.com/0/32093/d7911663-d08a-3161-e081-3f7804609768.png)

「それ以外」をクリックするとすべての項目が表示されます。

![new2.png](https://qiita-image-store.s3.amazonaws.com/0/32093/c26eb30b-2f49-e29d-971f-b41c3b09d641.png)

こりゃいいなと思ったんですが、プルダウンをボタンにする副作用で、クリックするとフォームを送信してしまう現象が起きました。
なので、クリックしても送信しないように対策。

```html
<script type="text/javascript">
	$('#roleselect').quickselect({
		activeButtonClass: 'btn-primary active',
		//breakOutAll: true,
		breakOutValues: ['0', '1', '2', '3'],
		buttonClass: 'btn btn-default',
		selectDefaultText: '<i class="fa fa-bars"></i> それ以外',
		wrapperClass: 'btn-group'
	});
	$('.quickselect__btn').click(function () {
        return false;
    });
</script>
```
じっさいには以下の部分になります。

```js
	$('.quickselect__btn').click(function () {
        return false;
    });
```