OmniAICreator/Qiita-1.07M huggingface dataset:
テーブルのカラムの値をnullかゼロ値かを判別する

not nullが指定されていないテーブルがあった場合の話。

```postgres
CREATE TABLE "users" (
  "id" serial not null primary key,
  "name" text,
  "age" integer
)
```

gorpで単純にinsertすると、ゼロ値が入っていまいます。

```go
  dbmap.Insert(
    &User{Name: "John", Age: 0},　// insert into "users" ("id","name","age") values (default,$1,$2) returning Id; [1:"John" 2:0]
    &User{Name: "John"}, // insert into "users" ("id","name","age") values (default,$1,$2) returning Id; [1:"John" 2:0]
    &User{Name: "", Age: 8}, // insert into "users" ("id","name","age") values (default,$1,$2) returning Id; [1:"" 2:8]
    &User{Age: 30}, // insert into "users" ("id","name","age") values (default,$1,$2) returning Id; [1:"" 2:30]
  )
```

go言語はゼロ値があるので、空文字なのか`NULL`なのかが判別できないのが原因です。
これに対応するために、`database/sql`パッケージには、`null`値を扱うために
`sql.NullString`や`sql.NullBool`などが用意されています。

## 使い方

nullの可能性のある型に`sql.NullString`などを指定。

```go
type User struct {
  Id   int            `db:id`
  Name sql.NullString `db:name`
  Age  sql.NullInt64  `db:age`
}
```

この`sql.NullString`などは、こんな構造体になってます。

```go
type NullString struct {
        String string
        Valid  bool // Valid is true if String is not NULL
}
```

Insertを呼び出す前に、`Valid`の値を`false`にすると`null`としてINSERTされるようになります。

```go
  dbmap.Insert(
    &User{
      Name: sql.NullString{"Mike", true},
      Age: sql.NullInt64{0, true},
    }, //  insert into "users" ("id","name","age") values (default,$1,$2) returning Id; [1:"Mike" 2:0]
    &User{
      Name: sql.NullString{"", false},
      Age: sql.NullInt64{30, true},
    }, // insert into "users" ("id","name","age") values (default,$1,$2) returning Id; [1:<nil> 2:30]
  )
```

取り出すときもこの`Valid`の値をみることになります。

```go
  dbmap.Insert(
    &User{Name: sql.NullString{"Mike", true}, Age: sql.NullInt64{0, true}},
    &User{Name: sql.NullString{"John", true}, Age: sql.NullInt64{0, false}},
    &User{Name: sql.NullString{"John", true}, Age: sql.NullInt64{8, true}},
    &User{Name: sql.NullString{"", false}, Age: sql.NullInt64{30, true}},
  )

  users := []User{}
  _, err := dbmap.Select(&users, "select * from users")
  if err != nil {
    log.Fatal(err)
  }
  for _, user := range users {
    spew.Dump(user)
  }
/*
(main.User) {
 Id: (int) 1,
 Name: (sql.NullString) {
  String: (string) (len=4) "Mike",
  Valid: (bool) true
 },
 Age: (sql.NullInt64) {
  Int64: (int64) 0,
  Valid: (bool) true
 }
}
(main.User) {
 Id: (int) 2,
 Name: (sql.NullString) {
  String: (string) (len=4) "John",
  Valid: (bool) true
 },
 Age: (sql.NullInt64) {
  Int64: (int64) 0,
  Valid: (bool) false
 }
}
(main.User) {
 Id: (int) 3,
 Name: (sql.NullString) {
  String: (string) (len=4) "John",
  Valid: (bool) true
 },
 Age: (sql.NullInt64) {
  Int64: (int64) 8,
  Valid: (bool) true
 }
}
(main.User) {
 Id: (int) 4,
 Name: (sql.NullString) {
  String: (string) "",
  Valid: (bool) false
 },
 Age: (sql.NullInt64) {
  Int64: (int64) 30,
  Valid: (bool) true
 }
}
*/
```

ちなみにこれ、普通にScanをするときも使えます。

```go
var s NullString
err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&s)
...
if s.Valid {
   // use s.String
} else {
   // NULL value
}
```
http://golang.org/src/database/sql/sql.go?s=1845:1938#L63
【Swift】カスタムUIAlertControllerを作ってみた

## はじめに
iOS8からUIAlertViewがdeprecatedとなりました。UIAlertViewは色々な箇所で使用したいのですが、UIAlertControllerに対応しようとしたときに、iOS7とiOS8で分岐を書くのが何となくイマイチだったので自前で作ってみました。

作り込んでいった結果、UIAlertControllerとほぼ同じ機能を持つものが出来上がったので紹介させてください。
Swiftファイルひとつ追加するだけで簡単に使用できます。

アラートのデザインを変えたい方、自作する方のお役に立てれば幸いです。

## **DOAlertController**
**GitHub** : **https://github.com/okmr-d/DOAlertController**

▽ スクリーンショット
![BackgroundImage](https://raw.githubusercontent.com/okmr-d/okmr-d.github.io/master/img/DOAlertController/Alert.gif) ![BackgroundImage](https://raw.githubusercontent.com/okmr-d/okmr-d.github.io/master/img/DOAlertController/ActionSheet.gif)

## 使い方
UIAlertController とほぼ同じ書き方で使用できます。

```swift:シンプルなアラートを表示
// アラートコントローラ：　タイトル、メッセージ、アラートスタイル(Alert/ActionSheet)を設定
let alertController = DOAlertController(title: "title", message: "message", preferredStyle: .Alert)

// アクション：　ボタンの文字、ボタンスタイル(Default/Cancel/Destructive)、ボタンを押した時の処理を設定
let cancelAction = DOAlertAction(title: "キャンセル", style: .Cancel, handler: nil)

// アクションは複数設定できます
let okAction = DOAlertAction(title: "OK" style: .Default) { action in
    NSLog("OKボタンが押されました。")
}

// アラートコントローラにアクションを追加
alertController.addAction(cancelAction)
alertController.addAction(okAction)

// 表示
presentViewController(alertController, animated: true, completion: nil)
```

### カスタマイズ
テキストフィールドの追加や、フォントや色の変更が可能です。
![BackgroundImage](https://raw.githubusercontent.com/okmr-d/okmr-d.github.io/master/img/DOAlertController/CustomAlert.png) ![BackgroundImage](https://raw.githubusercontent.com/okmr-d/okmr-d.github.io/master/img/DOAlertController/CustomActionSheet.png)

```swift:テキストフィールドの追加
alertController.addTextFieldWithConfigurationHandler { textField in
    // テキストフィールド(UITextField)の設定を自由に行えます
    // textField.placeholder = "Password"
    // textField.secureTextEntry = true
}
```

```swift:デザインカスタマイズ
// オーバーレイの色
alertController.overlayColor = UIColor(red:235/255, green:245/255, blue:255/255, alpha:0.7)

// アラートビューの背景色
alertController.alertViewBgColor = UIColor(red:44/255, green:62/255, blue:80/255, alpha:1)

// タイトルのフォント、文字色
alertController.titleFont = UIFont(name: "GillSans-Bold", size: 18.0)
alertController.titleTextColor = UIColor(red:241/255, green:196/255, blue:15/255, alpha:1)

// メッセージのフォント、文字色
alertController.messageFont = UIFont(name: "GillSans-Italic", size: 15.0)
alertController.messageTextColor = UIColor.whiteColor()

// ボタンのフォント、文字色、背景色(通常時/ハイライト時)
// [.Default]を[.Cancel][.Destructive]に変更すればそれぞれのアクションごとにボタンのカスタマイズが可能
alertController.buttonFont[.Default] = UIFont(name: "GillSans-Bold", size: 16.0)
alertController.buttonTextColor[.Default] = UIColor(red:44/255, green:62/255, blue:80/255, alpha:1)
alertController.buttonBgColor[.Default] = UIColor(red: 46/255, green:204/255, blue:113/255, alpha:1)
alertController.buttonBgColorHighlighted[.Default] = UIColor(red:64/255, green:212/255, blue:126/255, alpha:1)
```

### 注意点
* キャンセルアクションは一つしか追加できません。
* Action Sheetを選択した場合、UITextFieldの表示はできません。  
（どちらもUIAlertControllerと同じ仕様です。）

## さいごに
一見大したことなさそうですが、一から自分で作ってみるととてもいい勉強になりました。
これから自作される方の参考になれば幸いです。

**GitHub** : **https://github.com/okmr-d/DOAlertController**
RでGoogle Mapsを使う

# Google Mapsから取得した静的な地図の画像上にRからプロットを重ねる方法を紹介します。

## 以下のライブラリを使います。
### RgoogleMaps
* http://cran.r-project.org/web/packages/RgoogleMaps/index.html
* RgoogleMapsはR上でGoogle mapサービスを利用できる便利ライブラリです。
* マニュアルはこちら　http://cran.r-project.org/web/packages/RgoogleMaps/RgoogleMaps.pdf

```lang:GoogleMapsSample.R
#install.packages("RgoogleMaps",dep = TRUE) # 初めての時はライブラリをダウンロードする
library(RgoogleMaps)

zoom<-14 #地図の倍率指定。大きいほど地図が拡大されます
map = GetMap(c(lat = 35.681382, lon = 139.766084), # 地図の中心点を指定。緯度経度
             zoom=zoom, # 地図の倍率指定
             sensor="false", 
             hl="ja" # 地図表示の言語を指定。
             )

PlotOnStaticMap(map) # 地図の描画


# すでに描画したMapに点を重ねる
PlotOnStaticMap(map,
                lat=35.681382,  # 点を重ねる緯度
                lon=139.766084, # 点を重ねる経度
                pch=19, 
                cex=2,
                col = rgb(0, 0, 1, alpha=1),
                add=TRUE # 描画済の地図に点を重ねるオプションを有効化
                )

```

***
## 以下のような画像を取得できます。
* 画像のダウンロードは、RStudioを使っていればポチポチすればできます。
* 今回は東京駅が中心の地図を出してみました。
* 今回は、1ポイントのみの描画ですが、緯度経度を外部ファイルに書き出し、それを読み込んでLoopで回すことで複数点の描画もできます。（300ポイントぐらいはやってみました。）
![東京駅.PNG](https://qiita-image-store.s3.amazonaws.com/0/15448/ff68c7e9-4a07-1829-366a-2bb4024d342b.png)
JavaScript  忘れがちな　=== と == の違い

いつも何も考えずに**==**を使ってしまいがちですが、僕がずっと使っているIDE  NetBeansでは、**===**を使えと警告してくれます。
この違いって何でしょうか？

#==と===の違い
まず、文字と数値の比較実験

````js
var a = "1";
var b = 1;

console.log(a==b);
結果：true
console.log(a===b);
結果:false
````

それぞれの演算子について[ここ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Identity)で調べてみると、それぞれ機能が違うことがわかります。
##== 等価演算子
>数値と文字列を比較するとき、文字列は数値に変換されます。JavaScript は文字列の数値リテラルを Number 型の数値に変換しようと試みます。最初に、その文字列の数値リテラルから数学的な値を引き出します。次に、最も近い Number 型の値にこの値を丸めます。

つまり**==**は、文字列と数値の比較の場合、文字列を数値に変換してくれるわけです。

##=== 厳密等価演算子

>オペランド同士が、型を変換することなく(上に示した通り)厳密に等しいならば真を返します。

この場合、文字列は数値にに変換されないので、falseが返るわけです。



#型変換について
等価演算子==では型変換が行われる場合があると説明しました。
型ていってもいろいろあるけど、どんな風に変換されるんでしょうか？


##Boolean型

>もしオペランドの片方が Boolean ならば、その論理オペランドは true ならば 1 に、そして false ならば +0 に変換されます。

````js
console.log(true==1); // true
console.log(true===1); // false
console.log(false== 0); // true
console.log(false=== 0); //false
````


##オブジェクト
>オブジェクトを数値または文字列と比較する場合、JavaScript はそのオブジェクトの既定値を返そうとします。演算子はそのオブジェクトを、そのオブジェクトの valueOf や toString といったメソッドを用いて、プリミティブな値か、String か、あるいは Number の値に変換しようとします。そうした変換の試みが失敗したときにはランタイムエラーが生成されます。

````js
console.log("foo" == new String("foo")); //true
console.log("foo" === new String("foo")); //false

````
上記は、プリミティブ型と、String型の比較であるため、String型がプリミティブに型変換してくれたわけです。
従って、下記はfalseです。

````js
console.log(new String("foo")==new String("foo"));
````
異なるオブジェクト(というよりインスタンス)同士の比較になるため、falseになります。

ところで、こんないたずらするとどうなるか

````js
var s = new String("foo");
console.log("foo"==s);//結果：true

//valueOfメソッドを書き換え
s.valueOf=function(){return "boo";}
console.log("foo"==s); //結果：false
console.log("boo"==s); //結果：true
````
String型とプリミティブ型の文字列を比較した場合、確かにvalueOfが呼ばれて、文字列と比較していることがわかります。

あと、undefinedとnullの比較をするとこうなります。

````js
console.log(null == undefined);
結果：true
console.log(null === undefined);
結果：false
````

#終わり
うまくまとめられないけど、名前の通り、
**===**のほうが厳密に比較してくれるってことです。
実務でよく使っている列挙型Enum

お疲れ様です。

本日は備忘録として実務でよく使う用語について紹介していきます。
Objective-C として、自分へのメモ代わり。

列挙型 Enum の記述方法

    typedef NS_ENUM(NSInteger, SampleEnum) {
        SampleEnumType0 = 0,
        SampleEnumType1 = 1,
        SampleEnumType2 = 2,
    };

こんな記載方法を(自分は)一番採用しています。

よくプログラミングでは整数であるNSInteger(int)型を
使われています。(特にTableView系の実装)、
あまりに0,1,2,3と数字をベタ打ちしていると自分のコードを
見直したときにあちこちに0,1,2,3の数字群が残ってしまうわけです。

プログラマの人はこの状況を一般的には好ましいとは思います。

というのも、あとでどっかでバグが発生したときに
そのバグを消す作業(デバッグ)をする過程で
あちこちにこれらの1,2,2,3などの数字がベタ打ちされていると
その数字にどんな意味があるのかをたどる必要が出てくるためです。

Enum という列挙型というのは、
この一件意味がない数字に対して他人がすぐに理解できるように
「ラベル」を付けることを可能にするテクニックです。

簡単にいえば、
数字をテキストとして扱えるようになるということです。

今までは int型でcountという変数を宣言して、

    int count;

switch文による条件分岐をするときに


    switch (count) {
        case 0:
            //メソッド0
            break;
        case 1:
            // メソッド1
            break;
        case 2:
            // メソッド2
            break;
        default:
            break;
    }

これだとこのメソッドでバグが起きたら、

「これらの0,1,2がどんなときに起きるパターンをいちいち
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
再現しないと0,1,2がどういう状態なのかが全く分からない」
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


のです。
(これは実際にデバッグをする側にならないと、
さらに複雑なシステムにならないと怖さが理解できません。)

そのため、実務ではこういった無機質な記号である数字はなるべく使わないように

Enum で数字を列挙してそれらにラベルを貼っていきます。
これが列挙型の特徴です。

今回の例では、列挙型を使うとさっきのswitch文が

    switch (count) {
        case SampleEnumType0:
            //メソッド0
            break;
        case SampleEnumType1:
            // メソッド1
            break;
        case SampleEnumType2:
            // メソッド2
            break;
        default:
            break;
    }


という風に書き換えることができます。

今日はこれで終わります。
NSDateを扱いやすくする「DateTools」ライブラリを使ってみた


## まだNSDateで消耗してるの？
iPhoneアプリで日付の処理を行いたい場合、NSDateクラスを利用するわけですが、どうにも使いづらく感じてました。

そこで、「便利なライブラリが無いかな」と思って探していたところ、良さそうなのがあったので紹介したいと思います。(日本語の記事があまりなかったことですし。)

## 導入

https://github.com/MatthewYork/DateTools

こちらのgithubから導入します。おなじみのCocoaPodsでインストールしましょう。ライセンスは  MIT License です。

色々と多機能なんですが、最低限のNSDateの拡張を使いたいだけなら

```
#import <NSDate+DateTools.h>
```

とソースコードにかけばokです。


## 機能
NSDate+DateTools, Time Periods, Time Period Groupsという3つの機能があるようなのですが、ここでは、NSDate+DateTools.hで利用できるメソッドを中心に紹介します。(Time Periods機能の方は、自分があまり利用していないこともあり...)

[ヘッダファイル](https://github.com/MatthewYork/DateTools/blob/master/DateTools/NSDate%2BDateTools.h)をみると、たくさんのメソッドが用意されていますが、ここでは代表的なものだけをご紹介します。


### NSDate 生成
日付・時刻を指定して、NSDateを作ることができます。

```
NSDate *date = [NSDate dateWithYear:2015 month:6 day:1];
NSDate *datetime = [NSDate dateWithYear:2015 month:6 day:1 hour:11 minute:22 second:33];
```

### NSDateの 年・月・日・時・分・秒
「NSDate の 年・月・日・時・分・秒 を求めたい」というのは、よくありがち。ですが、NSDateにはそれ用のメソッドはなく、NSDateComponentsを利用しなければなりません…。

それがDateToolsだと、簡単に書けます。

```
// 年月日
NSDate *date = [NSDate date];
date.year
date.day
date.hour
date.second
```

といった感じになります。

### m日後、n年後などを求める
"dateByAddingYears”などの各種メソッドが用意されています。

```
NSDate *nextYear = [date dateByAddingYears:1];
NSDate *nextMonth = [date dateByAddingMonths:1];
NSDate *nextDay = [date dateByAddingDays:1];
```

当然ですが、年月が変わるような演算も全然okです。

### 日付比較
```
-(NSInteger)yearsEarlierThan:(NSDate *)date;
-(NSInteger)yearsLaterThan:(NSDate *)date;
```

などの各種メソッドが用意されています。

個人的には

```
// date == 今日
[date isToday] 
```

が嬉しかったです。

※“2つのNSDateの年月日だけ合致している” といった比較は、できないのかな…。

### 注意点：和暦に対応するには
日付を扱うアプリを作ると、iPhoneの本体設定で「和暦」が選択されているときの対応でバグが起こりやすいです。
(私も何度か痛い目にあったことがあります…)

DateToolsライブラリを使用するときも、和暦対応には注意する必要があります。

#### date.year対応
まず、date.year は本体設定に関わらず、西暦が帰ってきます。本体設定に応じた値が必要な場合は、独自実装が必要です。

#### dateFromString対応
dateFromStringをオプションなしで使用する場合、本体設定に応じた「年」が返ってきます。本体が和暦なら、和暦の年数が得られます。

```
// 本体設定により、”年"が異なる
NSString* formattedDate = [date formattedDateWithFormat:@"yyyy-MM-dd HH:mm:ss"];
```

西暦が欲しい場合は、locale指定のメソッドを使用するとokです。

```
// “年”を西暦で出力
NSString* formattedDate = [dateformattedDateWithFormat:@"yyyy-MM-dd HH:mm:ss" locale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
```

## まとめ：個人的には大助かりでした。
このライブラリだけで、日付処理の全てが解決するわけでは無いです。が、個人的にはNSDateクラスをとても扱い辛いと感じてたので、そこらへんのストレスはだいぶ改善されました。

今回紹介した以外のメソッドもたくさんあります。うまく組み合わせて使えば、開発がはかどると思います。
【Unity】Animator has not been initialized についてメモ

# Animator has not been initializedって？
そのままなのですが、「Animatorが初期化されてませんよ！」
というWarningです。
UnityのMechanimを利用したキャラクターを使用しようとすると、
極稀に、会う事があるようです。
しかし、Warningのため、ゲームは止まりませんし、
AnimatorのDefault Stateは動いていたりと、
よく分からない状態になります。

![スクリーンショット 2015-06-15 23.12.30.png](https://qiita-image-store.s3.amazonaws.com/0/26453/db4e6969-242d-1f66-6180-c21edae94ac6.png)

# どうして発生するの？
検索してみて分かったのですが、
一概に原因はコレ！って言える訳では無いようです。
Unityの昔のバグで、今は直ってるとか、そんな話まで出てきます。
以下のような状況で出会うユーザーが多いようです。

* Animatorを内包しているGameObjectのprefabをAttachして使用している。
* animator.SetFloat、SetBoolなどを呼び出した瞬間に発生。
* GetComponent<Animator>()などは正常に動作。
* 別キャラクターで同じAnimatorControllerを使い回している。

原因はユーザーの状況によって様々なので、その他にもあると思います。

# 解決策 その1 コードの凡ミス
間違ってこんな風に書いちゃったりすると、発生します。

```csharp:Sample.cs

// OriginalCharacterは
// [RequireComponent(typeof(Animator))]って思ってください。
public List<OriginalCharacter> characters;

public void CreateCharacter(string chrId){
    OriginalCharacter chr = characters.Where(c => c.chrId == chrId).FirstOrDefault();
    if(chr != null){
        Instantiate(chr);

        chr.gameObject.transform.position = new Vector3(10.0f , 1.0f , 0.0f);
        Animator anim = chr.gameObject.GetComponent<Animator>();
        anim.SetBool("Run" , true); // !!!! Error !!!!
    }
}

```

はい、正解はこうです。

```csharp:Sample.cs

public List<OriginalCharacter> characters;

public void CreateCharacter(string chrId){
    OriginalCharacter chrPrefab = characters.Where(c => c.chrId == chrId).FirstOrDefault();
    if(chrPrefab != null){
        // これが正しい
        OriginalCharacter chr = Instantiate(chrPrefab) as OriginalCharacter;

        chr.gameObject.transform.position = new Vector3(10.0f , 1.0f , 0.0f);
        Animator anim = chr.gameObject.GetComponent<Animator>();
        anim.SetBool("Run" , true); // Success
    }
}

```

Attachはしているので、nullにならず、
正常に起動出来ますが、参照先がInstance化されていないため、
not Initializedとなります。
正しくInstance化している参照先を指定してあげるだけでOKです。

# 解決策 その2 Componentの順番を変える
その１では無さそうだ、って時にチェックしてみてください。
AnimatorをComponentの一番下に置くとこのエラーが解消されることが
あるそうです。(自分は未確認ですが)
しかし、少し古い情報なので、昔のUnityの解決法かも？
Inspectorの各Component右上のギアから
MoveDown , MoveUpで移動させる事が出来ます。

![スクリーンショット 2015-06-15 23.34.47.png](https://qiita-image-store.s3.amazonaws.com/0/26453/21ec30d1-68af-2d9e-c09b-23809bf75f19.png)

# 解決策 その3 Rebind
なんか一番それっぽいです。
Initialize出来てないなら、してしまえ！ってやつです。

[API : Animator.Rebind](http://docs.unity3d.com/ScriptReference/Animator.Rebind.html)

```csharp:Sample.cs

    Animator anim = obj.GetComponent<Animator>();
    anim.Rebind();
    
    // 処理

```

キャラクター間で同じAnimatorを使いまわしている時に発生した時は、
これが有効なようです。
GetComponentした後、Rebindしてから使用すればOK。

# 調べたり、自分で書いてみたりしたけど
その1以外の発生条件はよく分かりませんでした。
たまたまそんな現象があるって話を聞いて、気になって調べてみたのですが…。
同じように書いてみても自分の環境では上手くいってしまったり。
余り参考にならないかもしれませんが、少しでもお力になれば幸いです。
データサイエンスの不都合な真実

[Linkedinの記事](https://www.linkedin.com/pulse/inconvenient-truth-data-science-kamil-bartocha "The Inconvenient Truth About Data Science")に強く同意したのでシェアします．
（8.は必ずしも，という気もしますが）

1. 綺麗なデータなんて無い

2. データの準備，前処理が一番大変

3. 95%のタスクでディープラーニングは不要

4. 9割のケースは一般化線形モデル（シンプルなモデル）で十分

5. ビッグデータは単なるツールの一つだ

6. ベイズ推定を使おう

7. どうやったか何て誰も気にしない（何をしたかだ）

8. アカデミアとビジネスは別物

9. （分析も大事だけど）プレゼン大事（パワポマスターになろう）

10. 真のモデルなんてない．使えるモデルがあるだけだ

11. 全自動分析なんてない．泥臭く手を動かそう
Rのスクリプトをコマンドライン実行し、ついでに引数を受け取る


# Rのスクリプトをコマンドライン実行し、引数を受け取る方法

Rは通常、インタラクティブに関数を実行し、統計的処理を行うことができます。
しかし、バッチ処理などで、インタラクティブにではなく、Rのスクリプトを実行したい時があります。
その時の方法を紹介し、ついでに、引数を受け取る方法も紹介します。

## 以下でコマンドライン実行できます。
    Rscript hoge.R

## 引数を受け取る方法
### 以下のコマンドを実行した時の引数の受け取り方
    Rscript hoge.R args1 args2 args3

```lang:hoge.R
args1 = commandArgs(trailingOnly=TRUE)[1] #1番目の引数を取得する
args2 = commandArgs(trailingOnly=TRUE)[2] #2番目の引数を取得する
args3 = commandArgs(trailingOnly=TRUE)[3] #3番目の引数を取得する
```
libGDXの基礎１２ Mapの代わりにObjectMapを使う

libGDXとはWindows、Linux、Mac、Android、iPhone、HTMLに対応したクロスプラットフォームゲームライブラリです。有名なIngressでも利用されています。欧米ではわりとメジャーどころです。

#Map使ってますか?

前回はListの代わりにArrayを使おうというものでした。今回はMapの代わりにObjectMapを使おうという安易なネタです。

こちらも軽量かつ、パフォーマンスが出るように調整されています。

ソースの行数はObjectMapが771行。HashMapは2380行です。HashMapも例によってAbstractMapを継承しておりそちらも含めると規模の大きさが違うのがわかりますね。

#ObjectMapもコレクションフレームワークではない

こちらもArray同様コレクションインターフェースを実装していません。実装しているのはイテレータのみ。

そのため単純な置き換えはできません。パフォーマンスを求められるところで利用しましょう。

個人的にですが、Mapはループの内側で利用することも多いかと思います。
ここが早いかどうかはかなり影響する場面は多いはずです。作業用と割り切って使いましょう。


#使い方

Mapをこんな感じで使ったとします。

```java
Map<Integer,String> map = new HashMap<>();
map.put(1, "１つめ");
map.put(2, "２つめ");
map.put(3, "３つめ");

for(Map.Entry<Integer,String> e : map.entrySet()){
    System.out.println(e.getKey() + "=" + e.getValue());
}
```

ObjectMapはこのようになります。HashMapなので出力される順序は期待しないでください。

```java
ObjectMap<Integer,String> omap = new ObjectMap<>();
omap.put(1, "１つめ");
omap.put(2, "２つめ");
omap.put(3, "３つめ");
        
for(ObjectMap.Entry<Integer,String> e: omap){
    System.out.println(e.key + "=" + e.value);   
}
```

ほとんど同じですね。ObjectMapはそれ自体がIterableを実装しているため、そのままループで描けるのがポイントです。

ほかにもEntryが軽量化しています。インターフェースと実装が分かれているMap.Entryと違い、ObjectMap.EntryはPublicフィールドのみのシンプルなクラスです。ソースは以下のようになっています。

```java
	static public class Entry<K, V> {
		public K key;
		public V value;

		public String toString () {
			return key + "=" + value;
		}
	}
```

#より安全に

Map#get()の引数は型パラメータが使われません。これは歴史的な制限です。かならずObject型になってしまい、安全ではありませんでした。

ObjectMapではMapとの互換性を気にしていないのでちゃんと型パラメータが使われます。Integer以外は利用することができません。

また、Mapはデフォルトメソッドでデフォルト値が使えるようになっていますが、これはJava8からです。Java7や6などAndroidやHTML出力などを利用する場合はJava8ではないため利用することができません。

一方ObjectMapはデフォルトの値を使うgetメソッドが用意されています。

```java
System.out.println(omap.get(1, "でふぉるとばりゅー1"));
System.out.println(omap.get(4, "でふぉるとばりゅー4"));
```
キーが存在すればその値を、なければ2つ目の引数が返されます。
最初の方で描いたサンプルに上のコードを組み合わせると1つ目のほうは通常のgetメソッドと同じ結果、「１つめ」が返ってきますが、2つ目は「デフォルトバリュー4」という値が表示されます。

ObjectMapはArrayと比べると便利な命令は少ないですが、単純に高速化がわかりやすいので恩恵も大きいと思います。

#ObjectMapの亜種

ArrayにおけるIntArrayなどと同様にMapにもプリミティブ対応版があります。

キーがint固定のもの。型パラメータがバリューのみになっているのがわかります。

```java
IntMap<String> intmap = new IntMap<>();
intmap.put(1, "１つめ");
intmap.put(2, "２つめ");
intmap.put(3, "３つめ");
for(IntMap.Entry<String> e: intmap){
    System.out.println(e.key + "=" + e.value);
}
```

ほかにもlongに対応するLongMap、equalsではなく==で判定するIdentityMapなどもあります。


中でも利用頻度が高いのがIntIntMapです。キーのみならずバリューもプリミティブのint型です。業務アプリでもよく使うタイプのものです。型パラメータはすでにありません。

面白い機能としてバリューからキーを取得する機能が付いています。もちろん、バリューが重なる場合はダメですが、これは使う場面もあるかもしれません。

```java
IntIntMap iimap = new IntIntMap();
iimap.put(1, 100);
iimap.put(2, 200);
iimap.put(3, 300);

System.out.println(iimap.findKey(200, 22));//200を探す
System.out.println(iimap.findKey(400, 44));//400は見つからないのでデフォルトが返される
```

そのほかに

```public int getAndIncrement (int key, int defaultValue, int increment) ```

といったものもあります。引数名で動きは想像できるかと思います。件数を数えるときなど便利ですね

バリューにfloat型を利用したIntFloatMapがありますが、こちらは利用頻度は多くないと思われます。



これらはObjectMapより高速なので、できる限りこちらを使うとよいでしょう。
【iOS】構造体とクラスの違い


## 構造体はプロパティもメソッドも定義できる。じゃあ、クラスと何が違うんだ！？
　決定的に違うのは、変数を入れるとき`クラスは参照渡し`で、`構造体は値渡し`という点です。
- クラスは、参照渡しなのでアドレスを渡す
- 構造体は、コピーを渡す

**その他の違い**
· 構造体はクラスとは違って継承ができません。
· クラスのプロパティを宣言する場合は、宣言時に初期化するか、initメソッド内で初期化処理をかかないとエラーが起きる。一方、構造体はプロパティの宣言時に初期化しなくてもエラーは起きません。
· 型のキャストができない


### 構造体を使うパターン
· 小さくても単純なデータをカプセル化したい場合
· 参照渡しより値渡しがいい場合
· 継承が必要ない場合

### 構造体を避けた方がいいパターン
· データが大きい
· プロパティが多い

**理由としては、以下の2つ**
· 構造体は変数にセットする度にコピーされるため、データが大きいと処理時間が遅くなる
· 構造体はスタック領域に確保されるため、データが大きいと溢れる可能性が高くなる

**結論としては、APIやDBの取得などは構造体ではなく、クラスで作成した方がよさそう**

　
ちなみに、Swiftでのデータ型は構造体で作成されている
· String
· Array
· Dictionary
· Bool
· Int
· Double
· Float

などなど

なので、これらのものは変数に入れる度にコピーされています。


## さいごに
本当は、構造体だけではなく列挙型もメソッドを定義できるのですが、今回は構造体に的をしぼって説明しました。
Elixir のオペレータについて


Elixir のオペレータについての覚え書き。

```
iex(1)> 1 = 1
1

iex(2)> 1 == 1
true

iex(3)> 1 == 1.0
true

iex(4)> 1 === 1.0
false

iex(4)> true == true
true

iex(6)> true == false
false

iex(7)> true or false
true

iex(8)> true and false
false
```


変わりどころで下記のオペレータ。
Stringの連結。リストの連結。リストの差分。含まれているかどうか。

```
iex(1)> "Hello " <> "World!!"
"Hello World!!"

iex(2)> [1,2,3] ++ [4,5,6]   
[1, 2, 3, 4, 5, 6]

iex(3)> [1,2,3] -- [1,2]  
[3]

iex(4)> [1,2] -- [1,2,3]  
[]

iex(5)> [1,2,4] -- [1,2,3]
[4]

iex(6)> 2 in [1,2,3,4,5]
true

iex(7)> 6 in [1,2,3,4,5]
false
```

なるほど。なかなか・・・。
Elixirで "Hello World"


いつもながらの浮気症で、`Elixir`という言語に興味を持った。
Elixirでの標準出力は`IO.puts()`のようである。

そこで、iexを起動し下記コマンド。

```
$ iex
Erlang/OTP 17 [erts-6.4] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Interactive Elixir (1.0.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> IO.puts "Hello Elixir"
Hello Elixir
:ok
```

これをファイルに記述して実行もできる。

```Hello.exs
IO.puts "Hello Elixir!!!"
```

```
iex(2)> c "Hello.exs"
Hello Elixir!!!
[]
```

ちなみに"Hello.exs"をコマンド実行する時の`c`は何ですかということで、`c`のヘルプ `h c` を参照してみる。

```
iex(3)> h c

    def c(files, path \\ ".")                            

Expects a list of files to compile and a path to write their object code to. It
returns the name of the compiled modules.

When compiling one file, there is no need to wrap it in a list.

Examples

┃ c ["foo.ex", "bar.ex"], "ebin"
┃ #=> [Foo,Bar]
┃ 
┃ c "baz.ex"
┃ #=> [Baz]

```

つたない翻訳ではあが、引数のファイル名をコンパイル実行するようだ。

今日はここまで。
【デザインパターン】 Template Methodパターン

##概要
アルゴリズムのスケルトンを定義しておき、その具体的なステップの実装をサブクラスに任せるパターン

以下の2種類のクラスからなる
1. AbstractClassクラス(抽象化されたprimitive operation(2.で具体的に定義される)と、それらを呼び出すtemplate methodを定義
2. ConcreteClassクラス(primitive operationを具体的に実装する)

##具体例と実装
コース料理を例にすると

上記1,2はそれぞれ
1. 共通コース料理クラス
2. 和食コース料理クラス、中華コース料理クラス、フランスコース料理クラス

が対応する。

コードの詳細は以下

```rb:course_cuisine.rb
class CourceCuisine
  def searve_cource_cuisine # template method
    searve_appetizer
    searve_sub_dish
    searve_main_dish
    searve_desert
    searve_hot_drink
  end

  private

  def searve_appetizer # primitive operation
  end

  def searve_sub_dish # primitive operation
  end

  def searve_main_dish # primitive operation
  end

  def searve_desert # primitive operation
  end

  def searve_hot_drink # primitive operation
  end

  def serve(cuisine)
    # 客に#{cuisine}を提供するコードを実装
  end
end
```

```rb:japanese_course_cuisine.rb
class JapaneseCourceCuisine < CourceCuisine

  private

  def searve_appetizer
    serve('おひたし')
  end

  def searve_sub_dish
    serve('煮物')
  end

  def searve_main_dish
    serve('お刺身')
  end

  def searve_desert
    serve('和菓子')
  end

  def searve_hot_drink
    serve('日本茶')
  end
end
```

```rb:chinese_course_cuisine.rb
class ChineseCourceCuisine < CourceCuisine

  private

  def searve_appetizer
    serve('点心')
  end

  def searve_sub_dish
    serve('エビチリ')
  end

  def searve_main_dish
    serve('酢豚')
  end

  def searve_desert
    serve('杏仁豆腐')
  end

  def searve_hot_drink
    serve('中国茶')
  end
end
```

```rb:french_course_cuisine.rb
class FrenchCourceCuisine < CourceCuisine

  private

  def searve_appetizer
    serve('スープ')
  end

  def searve_sub_dish
    serve('ヒラメのムニエル')
  end

  def searve_main_dish
    serve('牛肉の赤ワイン煮込み')
  end

  def searve_desert
    serve('いちごムース')
  end

  def searve_hot_drink
    serve('コーヒー')
  end
end
```


##メリット
* 共通の振る舞いを一箇所にまとめるため、DRYなコードが書ける
* primitive methodはtemplate methodからのみ呼び出され、protectedに定義されるため、委譲を使って機能の共通化と拡張を行う場合に比べて安全

##まとめ
継承を使って処理の共通化を行うパターン
アルゴリズムのステップが共通で、ステップごとの詳細が異なる複数の機能を実装する場合に用いる
Elixir on Dockerで関数型言語をはじめよう - Part2: 関数の実行

前回はiexのインタラクティブシェルに実行しました。はじめてRubyでコードを書いたときのような楽しさがあります。次はファイルに書いたモジュールをコンパイルして実行してみます。またEmacsのelixir-modeをインストールして開発環境を整備していきます。

## 開発環境

### Docker Compose

前回と同様にElixirのコマンドはDocker Composeで実行します。

```yaml:~/elixir_apps/docker-compose.yml
elixir: &defaults
  image: trenpixster/elixir
  working_dir: /app
  volumes:
    - .:/app
  entrypoint: ["elixir"]
elixirc:
  <<: *defaults
  entrypoint: ["elixirc"]
iex:
  <<: *defaults
  entrypoint: ["iex"]
bash:
  <<: *defaults
  entrypoint: ["bash"]
```

以下のようにiexサービスを使い捨てのコンテナで起動します。

```bash
$ docker-compose run --rm iex
Erlang/OTP 17 [erts-6.4] [source] [64-bit] [async-threads:10] [kernel-poll:false]

Interactive Elixir (1.0.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
```

### elixir-mode

少しずつElixirの開発環境を用意していきます。Docker Composeからカレントディレクトリをボリュームとしてコンテナの`/app`ディレクトリにマップしています。DockerホストのEmacsでElixirのファイルを編集してコンテナで実行します。

[emacs-elixir](https://github.com/elixir-lang/emacs-elixir)を[Cask](https://github.com/cask/cask)を使いEmacsにインストールします。

```bash
$ cd ~/.emacs.d
$ cat << EOF >> Cask
;; elixir
(depends-on "elixir-mode")
EOF
$ cask install
```

## コードの実行

Elixirはコードを実行するコマンドが3つあります。

* iex: インタラクティブシェルで実行
* elixirc: コンパイルして実行 (.ex)
* elixir: スクリプト実行 (.exs)


### iexでインタラクティブ実行

ErlangやScalaなどと同様でElixirは純粋に関数だけを定義することができません。

```iex
$ iex
iex(1)> def hello do
...(1)>   IO.puts "Hello World"
...(1)> end
** (ArgumentError) cannot invoke def/2 outside module
    (elixir) lib/kernel.ex:3563: Kernel.assert_module_scope/3
    (elixir) lib/kernel.ex:2823: Kernel.define/4
    (elixir) expanding macro: Kernel.def/2
             iex:1: (file)
iex(1)>
```

関数はモジュールの内部に定義する必要があります。

```iex
iex(2)> defmodule MyModule do
...(2)>   def hello do
...(2)>     IO.puts "Another Hello"
...(2)>   end
...(2)> end
```

関数の実行は`()`を省略することができます。この例のように引数がない場合は省略しても良いですが、引数がある関数の実行は`()`を付けた方が読みやすくなります。

```iex
iex(3)> MyModule.hello
Another Hello
:ok
```

hello関数をMyModuleに定義して`my_module.ex`ファイルを作成します。

```ex:my_module.ex
defmodule MyModule do
  def hello do
     IO.puts "Another Hello"
  end
end
```

iexを起動してからモジュールをコンパイルとロードをします。

```iex
$ iex
iex(1)> c("my_module.ex")
[MyModule]
iex(2)> MyModule.hello
Another Hello
:ok
```

iexコマンドはモジュールが定義されたファイルを引数にするとコンパイルとロードができます。また、カレントディレクトリにコンパイル済の`.beam`ファイルがある場合は自動的にロードされます。以下のようにiexコマンドで同じ名前のモジュールを再度コンパイルした警告がでますが、この場合は無視できます。

```iex
$ ls Elixir.MyModule.beam
Elixir.MyModule.beam
$ iex my_module.ex
my_module.ex:1: warning: redefining module MyModule
iex(1)> MyModule.hello
Another Hello
:ok
```

### elixircでコンパイル

elixircコマンドでモジュールファイルをコンパイルして、`Elixir.モジュール名.beam`の中間ファイルを作成します。

```bash
$ elixirc my_module.ex
$ ls Elixir.MyModule.beam
Elixir.MyModule.beam
```

コンパイルした`.beam`ファイルのモジュールは、先ほどのようにiexやmixコマンドでロードすることができます。

### elixirでスクリプト実行

`ex`と`exs`は拡張子が違っても動作に影響はありません。スクリプトの場合`.exs`と拡張子を付けるようです。`my_module.exs`はファイル内で定義したモジュールの関数を実行しています。

```ex:my_module.exs
defmodule MyModule do
  def hello do
     IO.puts "Hello Script"
  end
end

MyModule.hello
```

`elixir`コマンドで実行すると`.beam`中間ファイルを生成せずにコンパイルして実行します。

```bash
$ elixir my_module.exs
Hello Script
```
Kinesisの雰囲気をつかむためにawscliで操作する

やること
---------------
Streamの作成、Recordの追加／確認、Streamの削除、Shardの分割／結合をawscliコマンドで確認する

コマンド
---------------
### Stream作成
コマンド投入後はStreamStatusがCREATINGになり、数秒でACTIVEとなり使用できるようになりました。

```bash
$ stream_name=好きな名前
$ aws kinesis create-stream --stream-name $stream_name --shard-count 1
```

### put-recordでデータを投入
put-recordsで入れるのがデフォだが、テストなのでput-recordを使う。古いawscliではput-recordsがサポートされていないのでもし使うときは注意。

```bash
$ aws kinesis put-record --stream-name $stream_name --data hoge --partition-key key1
{
    "ShardId": "shardId-000000000000",
    "SequenceNumber": "49551577762526400408247905360155882849256718234908884994"
}
$ aws kinesis put-record --stream-name $stream_name --data foo --partition-key key2
{
    "SequenceNumber": "49551577762526400408247905360157091775076333207680974850",
    "ShardId": "shardId-000000000000"
}
```

### get-recordsでデータ取り出し
- shard_id取得、shard_iteratorを取得してからget-recordsが使用できる。
- 取得したshard_iteratorは5分間有効。
- shard-iterator-type には`AT_SEQUENCE_NUMBER`, `AFTER_SEQUENCE_NUMBER`, `TRIM_HORIZON`, `LATEST`のいずれかを指定する。

```bash
$ shard_id=$(aws kinesis describe-stream --stream-name $stream_name | jq -r ".StreamDescription.Shards[0].ShardId")
$ shard_iterator=$(aws kinesis get-shard-iterator --stream-name $stream_name --shard-id $shard_id --shard-iterator-type TRIM_HORIZON | jq -r ".ShardIterator")

$ aws kinesis get-records --shard-iterator $shard_iterator --limit 10
{
    "NextShardIterator": "xxx",
    "MillisBehindLatest": 67000,
    "Records": [
        {
            "Data": "aG9nZQ==",
            "PartitionKey": "key1",
            "SequenceNumber": "49551577762526400408247905360155882849256718234908884994"
        },
        {
            "Data": "Zm9v",
            "PartitionKey": "key2",
            "SequenceNumber": "49551577762526400408247905360157091775076333207680974850"
        }
    ]
}
```

### streamを削除

```bash
$ aws kinesis delete-stream --stream-name $stream_name
```

### シャードを確認
```bash
aws kinesis describe-stream --stream-name $stream_name
```

### シャード分割
- 隣接しているシャードを分割／結合できる
- (StartingHashKeyとEndingHashKeyが重なっているシャード)

```bash
$ aws kinesis split-shard --stream-name $stream_name --shard-to-split ${splitするシャード} --new-starting-hash-key ${どのhash-keyから分割するか}
```

### シャード結合
```bash
$ aws kinesis merge-shards --stream-name $stream_name --shard-to-merge ${mergeするシャード前半} --adjacent-shard-to-merge ${mergeするシャード後半}
```
ActiveRecordのinitialize飛ばし

ActiveRecordを使っていたところ、意外な挙動をすることがありましたが、実はRubyの標準機能で実現できることでした。

# `initialize`…されない！？

ActiveRecordにある処理を組む過程で、（素直に`after_initialize`を使えばいいものを）何を思ったか`initialize`のオーバーライドを行って実装する…というように書いてしまったのですが、その`initialize`内の処理が、ときどきしか実行されないということに気づきました。

調べてみると、ActiveRecordを本当に`new`する際には`initialize`が呼ばれるのですが、`ActiveRecord::Relation`から実体化するなど、DBから引いてきたときには`initialize`は**走らない**とのことでした。

# Ruby標準で作れる、未初期化オブジェクト
では、一体どんな手法を使えば`initialize`しないオブジェクトを作れるのだろうと調べてみたら、じつは標準ライブラリに`Class#allocate`というのがあって、これを使うとまさに「特定のクラスだけど、`inialize`していないオブジェクト」を作れるということでした。

ActiveRecordの場合は、「どうせすぐにデータを詰めるのだから、`initialize`は無駄」という最適化なのでしょうが、なかなか使う機会の少ない機能かなという気もしています。

#余談
`initialize`をオーバーライドする際に、引数は直接`super`に投げるだけで、オーバーライドした中では使わない、というような状況の場合、変数名を省略することもできます。

```rb
def initialize(*)
  #元の引数、ブロックはそのままsuperへ
  super
 
  #引数を使わない拡張処理
end
```
【iOS】CGPoint()とCGPointMake()の違い


## CGPoint()とCGPointMake()はなにが違うの？
　CGPoint()はinitメソッドではなくstructの初期化であり、CGPointMake()はそのstructの初期化を行うだけのメソッドです。
　
#### 簡単に言うと、
- CGPoint()は`構造体`
- CGPointMake()は`メソッド`

です。
　

### じゃあ、どっちを使えばいいんだ？
　**一般的にCGPoint()を使うのが主流となっています。**
　
　
### ここから下は興味本意なので見なくてもいいです。

## CGPointMake()メソッドはどこで定義されているのか気になったので調べた
Ruby思考なぼくは最初、CGPointのオブジェクトを生成するためのメソッドだからCGPointクラスの中に定義されている？と思った。しかし、CGPointは`構造体だからメソッドが定義されているはずがない！`
じゃあ、どこで定義されているんだ？


![CGPointMake定義場所](http://i.imgur.com/HAeqDIN.png)

CoreGraphicsを継承したCGGeometryというところに定義されていました。

　
さきほど、構造体だからメソッドが定義されているはずがないと言いましたが、 **SwiftはC言語と違って構造体にプロパティだけでなくメソッドも定義できるらしいです。**

### 構造体はプロパティも、メソッドも定義できる。じゃあ、クラスとは何が違うんだ！！？

長くなりそうなので[別の記事](http://qiita.com/SoyaTakahashi/items/f8d586a0635d10e5f668)で説明します。
Python Tools for Visual Studio Installation Guide

長いので, Python Tools for Visual Studioを以下**PTVS**とします．

#Introduction
Microsoft 大先生が PTVSをリリースしてくださったことにより，VSでPythonのプロジェクト作成，コーディング，実行，デバッグが行えるようになりました．(/・ω・)/ コード補完も普通に効くのでVSでの開発に慣れている方は，わざわざ従来のPython向けIDEを使う必要はないでしょう．他のIDEは知りませんが． ~~OS X?なにそれ?~~
ということでVisual StudioへのPTVS導入方法を書きました．

> **Note**
> 私は VS2013 で環境構築したので他のバージョンに関しては知らぬ．
> HPにはVS2015, VS2013, VS2012, VS2010向けのInstallerがあるようなのでそのあたりは大丈夫でしょう...~~2008はもうやめて~~

#PTVSのインストール
1. Python Tools for Visual Studio HP http://pytools.codeplex.com/ にアクセス.
	リンクが切れていたらググる．
        
2. インストーラをダウンロードする.

![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/80851/ad780620-aeb8-e680-eafa-e970df9c4836.png)
Fig:1 PTVS HP

downloadsページに飛ぶ．(fig:1を参考に)
Dev states: stable になっているバージョンのインストーラを選ぶ．(fig:2を参考に)
Dev states: beta ってなっているのはやめといたほうがトラブルが発生しにくいかも．
自分が使っているVSのバージョンにあったのを選択する．(fig:2を参考に)
あとは，実行して流れに任せる．

![fig2.png](https://qiita-image-store.s3.amazonaws.com/0/80851/0abf2532-12b5-6288-1e05-6fa062af2a4f.png)
Fig:2 States, Versionの確認



#Pythonのインストール
前章でインストールしたのはVSからPythonへアクセスするツールなので，PCにPythonのパッケージが入っていない人はインストールしましょう．

1. Python HP https://www.python.org/ にアクセス．
    リンクが切れてたらググる．

2.インストーラをダウンロードする．

![fig3.png](https://qiita-image-store.s3.amazonaws.com/0/80851/76250b04-186b-6598-48de-ba5d6f789062.png)
Fig:3 Pythonのインストーラの場所

HPのdownloadsページに飛ぶ．(fig:3を参考に)
インストーラをダウンロードする．(fig:3を参考に)

>**Note**
>2015/06/15 現在，Python 3.X系と Python 2.X系の主に二つのバージョンがあります．
>Python 3.X系のほうが新しいのですが，過去のバージョンの互換を保証していない部分があるそうなので，Python 2.X系で書かれたmoduleは一部非対応になっているものがあるそうです．

**ここでは，Python 2.X系を入れます．**
~~*私はROS indigo環境で動かすのでPython 2.X系を使います．そもそも, このためにPythonに慣れる必要があったので...*~~
ダウンロードが完了したら，実行して流れに任せる．


#Conclusion
これでVS上でPythonをゴリゴリ書くための基本的なパッケージのインストールは終了です．
VS上でのPythonプロジェクトの作成，私のLabで使いそうなPackageのインストールは書きます…そのうち．
Re:dashをつかって、Prestogres経由でTreasureDataにクエリを投げる。

NOTE: 現在はこちらをご利用ください。http://qiita.com/toru-takahashi/items/9f1f425a1474d1f2c6da

[Re:dash](http://redash.io/)とは、Open Source Data Collaboration and Visualization Platformらしいです。
クエリを登録していろんなデータソースからデータを取得して可視化できるダッシュボードにできるオープンソースです。

データソースとしては、今の所下記があり、今どきのデータ分析エンジンは、可視化エンジンはついてないので、嬉しいですね。

* PostgreSQL / Redshift
* MySQL
* Graphite
* Google BigQuery
* MongoDB
* URL
* Script

# セットアップ
Google Compute EngineとAWSのテンプレートがありますが、今回はgithub上にあるインストールスクリプトを使います。

環境は、Ubuntu14.04です。

```bash
$ sudo apt-get update
$ sudo apt-get install git
$ git clone https://github.com/EverythingMe/redash.git
$ cd redash/setup/
$ chmod +x bootstrap.sh
$ ./bootstrap.sh
```

セットアップ終わり！

# ログインしてみる。
セットアップが終わると、IP Addressにアクセスするとログインができます。

![Login](http://gyazo.com/15f23a6ee215f542b18f8b8af108663e.png)

デフォルトのログインIDとPasswordはadmin/adminです。

![top](http://gyazo.com/d5381be533ebb15b681aba5d5e2a29e2.png)

パスワードを変更したいときは下記で実施できます。

```
$ sudo -u redash bin/run ./manage.py users password admin {new password}
```

# データソースの追加
データベースの接続設定を追加したいのですが、Webからはできません。
サーバ内で下記コマンドを実施して、TreasureDataのPrestogresにアクセスしてみましょう。

```
$ sudo -u redash bin/run ./manage.py ds new
[2015-06-15 05:26:02,813][PID:20994][WARNING][google_oauth] No Google Apps domain defined, all Google accounts allowed.
Name: Prestogres (任意)
Select type:
1. script
2. url
3. mongodb
4. bigquery
5. graphite
6. pg
7. mysql
[1-7]: 6
Host (optional): pggw.treasuredata.com
Password (optional): (TD Password)
User (optional): (TD Email)
Database Name (required): T(TD Database)
Port (optional): 5439
Creating pg data source (Prestogres) with options:
{"port": 5439, "host": "pggw.treasuredata.com", "password": "~", "user": "~", "dbname": "sample_datasets"}
Id: 2
```

# クエリを作る
さて、New Queryからクエリを追加します。
データソースで先ほど作成したデータソースを選びましょう。
![Query](http://gyazo.com/e9a836b647ff1cc219536fe74442ff2a.png)

クエリを作成して実行！あとは、更新頻度とかを選べるのがいいですね。

![Query2](http://gyazo.com/42dfbc042393fd81872861f20fb72b44.png)

そして、ダッシュボードでAdd Widgetで先ほどのクエリの結果を登録できます！
しかし、グラフが描画ができない・・・
![Dashboard](http://gyazo.com/8b0fa1d7f96410b3b917b4529ea42459.png)

クエリの結果がダメなのか・・・とか思って書き直してたら、そんなことなかった
![Query3](http://gyazo.com/eaa6466404639c5ed6e4f76b715cba99.png)

タブのPivot Tableがドラッグアンドドロップできる！！
そして、タブのNewでChartを追加するのでした。
![chart](http://gyazo.com/dd6acb84365cfa2be06fda723939ae65.png)

# 終わりに
マート的に使ったりできるのかわからないけれども、簡単なチャートを作るダッシュボードとしては便利そう。
![dashboard2](http://gyazo.com/8e93dfda9c1683472c349926691be9cd.png)

自動で更新もしてくれるしね！

あと、某CTOがこう言ってたので、td-client-pythonを使ってデータソース追加も面白いかもしれないですね！
（誰かおなしゃす＜⚪︎＞　＜⚪︎＞）

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/nora96o">@nora96o</a> td-client-python経由で出来たらいあなあ</p>&mdash; Kazuki Ohta (@kzk_mover) <a href="https://twitter.com/kzk_mover/status/610324922225659905">2015, 6月 15</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
ArchLinuxで、EscapeをCapsLockに割り当てる(xmodmap未使用)

vimを使う人は、Escapeキーの使用頻度が高いです。
また、一般的にCapsLockを活用している人はいません。

そこで、**CapsLockにEscapeを割り当ててしまいましょう。**

一般的に使われるのが、
`gnome-tweak-tool`から変える方法、
`xmodmap`を使う方法、
などですが、私の環境はそもそもgnomeでないのと、`xmodmap`ではスリープした際やキーボードを取り外した際などに設定がリセットされてしまいます。

そこで今回は、Xorgの設定を変更する方法を使います。

## 設定
まず、現在使っているキーボードの種類とレイアウトを調べます。
以下のコマンドを実行してください。

```bash
$ setxkbmap -print -verbose 10
Setting verbose level to 10
locale is C
Trying to load rules file ./rules/evdev...
Trying to load rules file /usr/share/X11/xkb/rules/evdev...
Success.
Applied rules from evdev:
rules:      evdev
model:      pc105
layout:     us
options:    
Trying to build keymap using the following components:
keycodes:   evdev+aliases(qwerty)
types:      complete
compat:     complete
symbols:    pc+us+inet(evdev)+capslock(swapescape)+capslock(escape)
geometry:   pc(pc105)
xkb_keymap {
	xkb_keycodes  { include "evdev+aliases(qwerty)"	};
	xkb_types     { include "complete"	};
	xkb_compat    { include "complete"	};
	xkb_symbols   { include "pc+us+inet(evdev)+capslock(swapescape)+capslock(escape)"	};
	xkb_geometry  { include "pc(pc105)"	};
};
```

つらつらと出てきましたが、`model`と`layout`という欄をメモしておいてください。この場合は、`pc105`と`us`ですね。

次に、`/etc/X11/xorg.conf.d/10-keyboard.conf`を作成します。今回は`vim`を使いますが、`nano`など好きなエディタで構いません。

```bash
$ sudo vim /etc/X11/xorg.conf.d/10-keyboard.conf
Section "InputClass"

	Identifier "keyboard"

	MatchIsKeyboard "on"
	Option "XkbLayout" "メモをしたlayout"
	Option "XkbModel"  "メモをしたmodel"
	Option "XkbOptions" "caps:escape"

EndSection
```

あとは、これを保存して再起動(またはディスプレイマネージャを再起動)をすることで反映されます。

```bash
$ systemctl reboot
または
$ sudo systemctl restart ディスプレイマネージャ
```

## CapsLockとEscapeをスワップしたい場合
CapsLockにEscapeを割り当てるのではなく、
CapsLockとEscapeの役割を入れ替えたい場合もあるかと思います。

そのときは、

```bash:/etc/X11/xorg.conf.d/10-keyboard.conf
Option"XkbOptions""caps:escape"
```
の`caps:escape`部分を`caps:swapescape`に変更してみましょう。
「OSSエンジニアのための(はじめての!)ドローン勉強会」

## はじめに
今まで組み込みOSやっていましたが、異動して仕事柄、「ドローン的な何かを使った何か」を少しウォッチすることになったため、2015/6/13に、[OSS Japan](https://www.ossj.jp/)主催の[「OSSエンジニアのための(はじめての!)ドローン勉強会」](https://www.ossj.jp/article.php/20150613222747436)に参加した。

## 日米の差

日米双方ドローンに対する規制があるが、以下の根本的に異なるスタンスがある。

| 国 | ドローンの扱い | 備考 |
|:-----------|:------------|:------------|
| 日本       | 模型飛行機 | ラジコンヘリコプターの延長 |
| アメリカ | 航空機 | もともと軍用 |

アメリカでは大学で無人(というより遠隔)操縦するためのパイロットを育成している。
FAAという政府機関からライセンスを受ける。一度全部ドローンを禁止した上で、政府機関限定で許可。民間ビジネス利用は2015/9/30以降とのこと。
ここで、無人機は航空機と同様の扱いとしていることに注意。つまり、管制がしゃべっている言葉を理解し、場合によっては回避行動などが必要となる。
Amazonがセスナの免許所有者を採用していることは有名らしい。
さらに、副操縦士も必要。例えば操縦士がトイレに行くことを想定すればわかる。

日本は、模型飛行機という扱い故に航空法で飛行範囲に大きな縛りを受ける。さらに場合によっては条例の縛りも加わる。
歴史的な経緯から、倶楽部(民間団体)前提。ドローンは航空機でないので、航空法上の飛行許可はされない。

さらに、電波法の縛りもある。例えば、Youtubeに動画をアップして再生すると広告が表示される。それ故に商用扱いとなる。このことにより、アマチュア無線の電波を使ってFPVした動画をYoutubeにアップできない。陸上無線の3級以上が必要になる方向。

## デバッグ
ちなみに、ドローンの規制が少ないのはカナダ。カナダでデバッグ(笑)。
シミュレータがあろうとも、どうしても実機を飛ばす試験は必要。そのときに地方に行かないといけないのは厳しい。首都圏で飛ばせる場所を作ることは急務であろう。(プライバシーの問題などで難しいけど)

## Dronecodeについて
[Dronecode](https://www.dronecode.org/)は、Linux Foundationがドローン関係のオープンソース、ハードウェアのプロジェクトを取りまとめる目的で組織している。
これまでのプロジェクトで有力なものは[APM/Ardupilot](http://ardupilot.com/)と[PX4](https://pixhawk.org/start)がある。Linux Foundationはこれらをまとめる役割を担おうとしている。
しかし、Linux Foundationだからといって、Linuxで全て賄おうとしていない。(事実、PX4は一部のPOSIX I/Fを持ったリアルタイムOSを使っている。もちろんオープンソースだ)

また、Linux実装もあるらしいのだが、リアルタイム機能のパッチがあたっているものである。(Linux実装については、筆者は未確認)

どちらかというと、APMのほうが古株で枯れて実績がある。しかし、PX4はARMの32bitの石を使っていて、ソフトウェアプラットフォームを見ると色々できそうなのはPX4である印象を承けた。

## ドローンを外部から制御するソフトウェア
Dronecodeがドローン自体に組み込んでフライトコントローラやセンサを制御することを目的としている。
それとは別に外部からドローンを制御するためのソフトを書くプラットフォームには、[Dronekit](http://dronekit.io/)がある。

また、Scratchでドローンを外部から制御するためのソフトを書けるプラットフォームが[Tickle](https://www.tickleapp.com/en-us/)である。
実際に会場でデモンストレーションした人がいましたが、実際に動くものを見た瞬間本当に衝撃を受けました。プロトタイプを作るのには大変適していて、試したいことをすぐに試せる・・・。自分の勉強不足を痛感した瞬間でした。

## その他雑談にて
備忘録的に箇条書きにします。

 - 64bit H/Wプラットフォーム欲しい。OpenCVを実用的範囲で動かせるじゃん。個人的にはドローン側で何もかもをするのは実際的でなく、受信側の端末とドローン側での役割分担が重要になると感じます。
 - 最初の講演のトピックで、室内で正確な位置情報(誤差30cm前後)をとるのにビーコンを使った実験をしている話がありましたが、個人的には興味ありました。室内の位置推定は日本ロボット学会(に限らず)の論文も出ていますし、難しい課題の一つです。
 - ドローンを飛ばすシミュレータにはheli-xのようなソフトがある。練習に良い。
 - 中国の「Zero UAV (Beijing) Intelligence Technology」という会社のどローンにはフライトコントローラが二重化されている。(ちなみに、ドローン業界の主な会社は[ここ](https://www.jma.or.jp/TF/ja/event/drone.html)参考にするとわかりやすい。
 - PX4には[Unit Test](https://pixhawk.org/dev/unit_tests)があったり、開発中とはいえ[シミュレータI/F](https://pixhawk.org/dev/sim_interface/start)もあるんですね。ものがものだけに品質重要です。飛ばす場所が限られているし、ビッグバンテストをいきなりする勇気はとても私にはございません。よって、シミュレータ技術は今後の大きな課題になるのでは、と推定しています。

// 以上
Sassミニマムスタートのススメ

#できることから始める

**ワシ「Sass使おうよ、便利だよ」**
Aさん「難しそう…」
Bさん「プログラムっぽい…」
Cさん「何が出来るかわかんない…」

**ワシ「じゃあ簡単なものだけ使ってみようよ」**
A,B,C「これだけならじゃあ…使ってみようかな…！」


##変数

###カラーコード

```scss
$keyColor : #000;
 
.hoge {
    color: $keyColor;
}
```

###ルートディレクトリ

```scss
$imgRoot : '../img/';
 
.fuga {
    background-image: '#{$imgRoot}abc.png';
}
```

##ネスト

```scss
.hoge {
    width: 200px;
        li {
            width: 80px;
            img {
                width: 20px;
            }
        }
}
```

##親セレクタの継承

```scss
a {
    font-size: 12px;
    &:hover {
        font-size: 18px;
    }
}
```

##コメント

```scss
//コメント
```

#あとは便利な機能を少しずつ教えるだけ

**ワシ「よし、Sassを浸透させる舞台は整った！！」**
Deep LearningのライブラリChainerをインストールして使ってみた

#インストール
PFIのDeep LearningライブラリのChainerをインストールしてみた。
基本的にhttp://chainer.org/ のQUICK STARTの通り
`pip install chainer`
でインストール完了。超簡単。
自分がインストールした環境はMac OS X Mavericks 10.9.5
#センチメント分析のサンプルを動かしてみる
https://github.com/pfnet/chainer/tree/master/examples/sentiment

download.shを実行すると解析用のデータをダウンロードしてくれる。
学習データ、テストデータ、開発データが入ってる。こんな形式。
> (3 (2 (2 The) (2 Rock)) (4 (3 (2 is) (4 (2 destined) (2 (2 (2 (2 (2 to) (2 (2 be) (2 (2 the) (2 (2 21st) (2 (2 (2 Century) (2 's)) (2 (3 new) (2 (2 ``) (2 Conan)))))))) (2 '')) (2 and)) (3 (2 that) (3 (2 he) (3 (2 's) (3 (2 going) (3 (2 to) (4 (3 (2 make) (3 (3 (2 a) (3 splash)) (2 (2 even) (3 greater)))) (2 (2 than) (2 (2 (2 (2 (1 (2 Arnold) (2 Schwarzenegger)) (2 ,)) (2 (2 Jean-Claud) (2 (2 Van) (2 Damme)))) (2 or)) (2 (2 Steven) (2 Segal))))))))))))) (2 .)))

`python train_sentiment.py`
で学習開始。

学習結果はこんな感じ（途中結果）
> Epoch: 0
loss: 272091.89
15.52 iters/sec, 550.39 sec

> Epoch: 1
loss: 231616.00
16.56 iters/sec, 516.08 sec

> Epoch: 2
loss: 214706.52
19.19 iters/sec, 445.15 sec

> Epoch: 3
loss: 203173.80
14.26 iters/sec, 599.03 sec

> Epoch: 4
loss: 193821.91
19.16 iters/sec, 445.83 sec

> Train data evaluation:
 Node accuracy: 77.93 %% (248,265/318,582)
 Root accuracy: 39.56 %% (3,380/8,544)
Develop data evaluation:
 Node accuracy: 74.72 %% (30,968/41,447)
 Root accuracy: 34.15 %% (376/1,101)

とりあえず動きそうなので自分のデータでやってみよう。
goでC言語風の配列のキャストをする

```go
> hello := []byte("hello world")
[]byte{0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64}
> len(hello)
11
```

byteの配列に入れたデータを16ビット単位で数値型として扱いたい、みたいなのはC言語ではよくあります。Cだとポインタ型をキャストするだけです。

Goでやるにはunsafeパッケージを使えばいいみたいです。

```go
import "unsafe"

> castArray := *(*[]uint16)(unsafe.Pointer(&hello))
[]uint16{0x6568, 0x6c6c, 0x206f, 0x6f77, 0x6c72, 0x64, 0x0, 0x0, 0x5d5b, 0x6975, 0x746e}
> len(castArray)
11
```

なんかそれっぽいのが出てきました。ただし、長さは元のスライスの時の長さのままなので、容易に範囲外アクセスになっちゃいます。まあunsafeなのでお気をつけて。
【PHP】配列から指定したエントリの数のバリューをランダムに抽出する

## 前書き
既知のメソッドがあるかなーと思ったらなかったので、作りました。

## code
```php:array_rand_value.php
/**
 * 配列から指定したエントリの数のバリューをランダムに抽出する
 * 
 * @param array $array 抽出元の配列
 * @param int $num 取得する要素数
 * @return array 抽出後の配列
 */
function array_rand_value($arr, $num = 1)
{
	if ($num >= count($arr)) {
		return $arr;
	}

	$result = array();
	$rand_keys = array_rand($arr, $num);
	foreach ($rand_keys as $key) {
		$result[] = $arr[$key];
	}

	return $result;
}
```
CSVデータのヒストグラム値（頻度数）の計算（qコマンド利用）

こんにちは。
CSVデータに対して、```q```コマンドを使ってヒストグラムデータ（頻度数）を計算してみました。
第一カラムの値に対して、0.5 刻みで出力する例は

```console
$ cat data.csv | q "select round(c1/0.5-0.5)*0.5, count(round(c1/0.5-0.5)) from - group by round(c1/0.5-0.5)" | awk '{r="";i=$2;while(i-->0)r=r"#";printf "%s %2d %s\n",$1,$2,r;}'
1.0  4 #### 
1.5  8 ######## 
2.0 12 ############ 
2.5  5 ##### 
3.0  1 # 
```
- 1.0 以上、1.5 未満の頻度数が 4 です
- ```awk```コマンドで図示（```#```の連続）を付け加えています
smallbasicでgo ide

smallbasicでgo言語のideを作りました。
自作のエクステンション使ってます。
![go.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/fd6e1268-5475-17b7-8b48-19ff1deda220.png)

```
C = Text.GetCharacter(34)
R = Text.GetCharacter(13) + Text.GetCharacter(10)
code = ""
code = code + "package main" + R 
code = code + "import " + C + "fmt" + C + R
code = code + R
code = code + "func main() {"  + R
code = code + "   fmt.Printf(" + C + "Hello, world\n" + C + ") " + R
code = code + "}" + R
GraphicsWindow.BackgroundColor = "skyblue"
button = Controls.AddButton("caption", 300, 300)
Controls.SetButtonCaption(button, "go")
textbox = Controls.AddTextBox(10, 300)
Controls.SetTextBoxText(textbox, "main.go")
mtextbox = Controls.AddMultiLineTextBox(0, 0)
Controls.HideControl(mtextbox)
Controls.SetSize(mtextbox, 400, 280) 
Controls.SetTextBoxText(mtextbox, code)
Controls.Move(mtextbox, 10, 10)
Controls.ShowControl(mtextbox)
Controls.ButtonClicked = output
Sub output
  file = "c:\go\" + Controls.GetTextBoxText(textbox)
  text = Controls.GetTextBoxText(mtextbox)
  TextWindow.WriteLine("run")
  File.WriteContents(file, text)
  code = ""
  code = code + "Function setup(a)" + R 
  code = code + "Set obj = CreateObject(" + C + "WScript.Shell" + C + ")" + R
  code = code + "  obj.run " + C + "cmd /K CD C:\go & go run " + file + C + R
  code = code + "setup = "  + C + C + R
  code = code + "End Function" + R
  a = Class1.VBSrun(code)
EndSub
  
```
Electronのdialog.showMessageBox()を試してみる

# Electronのdialog.showMessageBox()を試してみる

[Electron開発環境を構築](http://qiita.com/furandon_pig/items/31c0578037e3a27b4ce4 "Electron開発環境をLinux Mint上に構築する")したので、早速サンプルプログラムを作って行こうと思います。

## dialogモジュール

今回はdialogモジュールの機能を試してみます。

 * [dialog](http://electron.atom.io/docs/v0.27.0/api/dialog/ "dialog")

上記のドキュメントを元に、dialogモジュールの概要を以下に示します。

 * dialogモジュール
   * ネイティブシステムダイアログを表示ためのAPIを提供する
     * ファイルのオープン・保存といったダイアログが利用できる
   * Webアプリケーションにネイティブアプリと同じユーザエクスペリエンスを適用できる
     * (ネイティブアプリと同じダイアログ利用できる、という意味だと思う)

サンプルとして、dialogモジュールのshowMessageBox()を動かしてみます。

## dialog.showMessageBox()

dialog.showMessageBox()は名前の通りメッセージボックスを表示するメソッドです。WebブラウザのJavaScript環境で提供されているwindow.alert()と機能的には同じですが、こちらはタイトルやアイコン画像を設定できたり、プッシュボタンを任意の数だけ指定できるようになっています。

簡単なサンプルプログラムをGitHubに用意したので、以下の手順で試せます。

```
$ git clone https://github.com/furandon-pig/electron_sample.git
$ cd electron_sample
$ ./setup.sh  # 画像アイコン等をダウンロードする
$ cd dialog_sample
$ ln -s ../RESOURCE ./RESOURCE  # 画像ファイルのディレクトリをsymlinkする
```

electronコマンドでサンプルプログラムを起動します。

```
$ electron dialog_sample
```

以下のような感じでサンプルプログラムが起動します。showMessageBox()への引数をあれこれ変えてダイアログを表示させることができます。

![img00.png](https://qiita-image-store.s3.amazonaws.com/0/61137/570e1b07-552b-ce4e-57cf-81542e833694.png)

ダイアログは以下のような表示になります。アイコンが大きすぎるので表示がちょっと変な感じですね....

![img01.png](https://qiita-image-store.s3.amazonaws.com/0/61137/dda5dbca-8a29-d440-d4c7-9dd3002a9b81.png)

## まとめ

Electronのdialog.showMessageBox()のサンプルプログラムを作成してみました。他にも面白そうなモジュールが用意されているので、そちらも試してみたいと思います。

## 参考URL

 * Electron
   * http://electron.atom.io/docs/v0.27.0/
 * dialog
   * http://electron.atom.io/docs/v0.27.0/api/dialog/
 * Getting Started(Twitter Bootstrap)
   * http://getbootstrap.com/getting-started/
IE で A href=""

IE と Chrome でしか試していないので、厳密に IE だけ、とは言い切れず、あまり多くのパターンを試していないのですが、例えば、

http://example.com/hoge/hoge.html

から、自分自身にリンクさせるとき、

```html
<a href="">このページへアクセスするリンク</a>
```

とすると、Chrome の場合、hoge.html にアクセスできるのですが、IE の場合、

http://example.com/hoge/

にアクセスしてしまう模様です。
CakePHPでAn Internal Error Has Occurredがエラーが表示される解決方法。

CakePHPのコードとMySQLのテーブルカラムを変更したらエラーがでて困りました。環境はCakePHP1.3です。

# An Internal Error Has Occurredが発生
テーブルカラムの変更の後にエラーが出て困りました。

```html:CakePHPのエラー
An Internal Error Has Occurred
```

結論からして、debugレベルを変更してから戻すと直りました。

```
vi app/config/core.php

Configure::write('debug', 0);
```
上記ではdebugレベルを0になっていたので、2にすると`An Internal Error Has Occurred`が消えます。

その後にdebugレベルを0に戻しました。どういうことなの(☝ ՞ਊ ՞)

追記：聞いたことによるとキャッシュなどが影響しているとか(☝ ՞ਊ ՞)