OmniAICreator/Qiita-1.07M huggingface dataset:
minecraft のServerのステータスをコマンドラインのPHPで取得する

![h5EzsgF.png](https://qiita-image-store.s3.amazonaws.com/0/43608/c0fedf4d-7143-b5e4-7220-29fa7e5c38e1.png)
- - -
普段サーバー上のtmuxでminecraftサーバーを監視してるんですが、
なんかサクッとサーバーの状態を取得できないかなーって思い、
調べたらQueryってのがあることと、PHPで取得できるってことが
わかったので、備忘録的にしておこうかと。

# 下地

- server
    - Ubuntu server 14.04 LTS
    - Minecraft 1.9.2
- client（サブPC）
    - kona Linux 3.0
    - PHP 5.6.19

# 1. PHPってコマンドラインで動かせる！？

実を言うと、筆者はコマンドライン（shell）上で
PHPを動かしたことがなかったので

- [【php】ちょっとしたphpをコマンドラインからさくっと実行する](https://www.softel.co.jp/blogs/tech/archives/2077)
- [PHPでコマンドライン実行時のパラメータ（引数）取得　- $argv、$argc](http://qiita.com/aic0o/items/91ca1ddc1fc6e025286f)

こちらのありがたい記事を読んでそういう使い方があるのかと知りました
PHPの導入については主題とズレるので別途お願い致します。

# 2.PHP-Minecraft-Queryをつかう

[xPaw/PHP-Minecraft-Query | Github](https://github.com/xPaw/PHP-Minecraft-Query)

探してみたらGithubでありました。
こちらのPHPスクリプトを使おうと思います。
##git cloneでダウンロードします。
> $ git clone https://github.com/xPaw/PHP-Minecraft-Query.git


#3.さあ動かそう

##移動
> cd PHP-Minecraft-Query

##移動しましたらサンプルコードを書きます
> vi test.php

```php
<?php
    require __DIR__ . '/src/MinecraftQuery.php';
    require __DIR__ . '/src/MinecraftQueryException.php';

    use xPaw\MinecraftQuery;
    use xPaw\MinecraftQueryException;

    $Query = new MinecraftQuery( );

    try
    {
        $Query->Connect( '<SERVER_ADDRESS>', 25565 );

        print_r( $Query->GetInfo( ) );
        print_r( $Query->GetPlayers( ) );
    }
    catch( MinecraftQueryException $e )
    {
        echo $e->getMessage( );
    }
?>
```

サーバーのアドレスのところを編集し、保存します。

##いざ、実行

```bash
$ php test.php
Array
(
    [HostName] => A Minecraft Server
    [GameType] => SMP
    [GameName] => MINECRAFT
    [Version] => 1.9.2
    [Plugins] =>
    [Map] => world
    [Players] => 0
    [MaxPlayers] => 20
    [HostPort] => 25565
    [HostIp] => 127.0.1.1
    [Software] => Vanilla
)
```
成功すればこんな感じに表示されるはずです。

#おわりに
minecraftの状態をPHPでサクッと取得出来ちゃうのは良いですね。
これでcurlやMandrillなんかを使って通知とかにも使えそうです。
IFTTTのWebhookを利用した連携なんかも楽しそうです。
成功次第Qiitaに書けたらなと思います。
自分への理解はアウトプットした時のほうが理解できるので。個人的に。
話が逸れました。
とても簡単にできるのでMinecraftサーバーの管理者さんは
試してみると良いのでは、それでは。
Wrangle x Python本やってみたメモ [2]

#これはなに？

これの続きです

>Wrangle x Python本やってみたメモ [1]
http://qiita.com/it_ks/items/baba553ca587ed52a316

前回はp.10に載っていたとこでした。
今回はp.11～p.15らへんまでのPython例文に取り組んでみます

#承前

**Houdini実践ハンドブックWrangle×Python**は
サークル『魔法の蒸留水』さん制作の本です
http://majou.jp/archives/667/

気になる方はこちらでどぞ　って思ってたんですが
https://www.toranoana.jp/mailorder/article/04/0030/38/99/040030389986.html
今見たら無くなってますね！
サークル在庫があったらイベント等で買えるかも知れません。

#hmath.buildRotate

p.11　回転。

```py
for point in geo.points():
    pos = point.position()
    mtx = hou.hmath.buildRotate(0,45,0)
    pos = pos*mtx
    point.setPosition(pos)
```

こうなります
![py_p11.png](https://qiita-image-store.s3.amazonaws.com/0/102581/43eb8111-e3e7-86a9-7d6f-048c13e23a65.png)
回転したぞおおおおおおお

ちなみにですが、
もうひとつGridつくってテンプレートにして
元の状態と回転後とを比較してます。

#find/add/set attribute

p.14のアトリビュートもにょもにょ

![py_p14.png](https://qiita-image-store.s3.amazonaws.com/0/102581/1841cd46-12ad-cc8b-66eb-ff6a4a12efd4.png)
これはスクリーンショット的にはなにも起きないです

ふと冒頭行が

```py
hou.pwd().geometry()
```

になってるのが味わいでした。

#evalParm

p.15、evalParmを使ってのパラメータから値を取得。

まずパラメータを作っておかねばなりません。

##パラメータ作成

パラメータパネルの右上のアクションメニューから、
「Edit Parameter Interface...」
![edit_param.png](https://qiita-image-store.s3.amazonaws.com/0/102581/4bbe6c26-57b1-f2a8-0934-1d66e9a53525.png)

こういうUIが現れます↓
![edit_param_dialog.png](https://qiita-image-store.s3.amazonaws.com/0/102581/265aa5fd-b499-9efa-7f97-65628379012a.png)

左カラムでデータ型を選択し、右カラムへ。
（ドラッグアンドドロップでもいいですし、カラム仕切りにある矢印でもOK）

パラメータ名などは本の指示通りに変更。

＞　Python Code欄の下にスライダーが現れます。

##実行

![py_p15.png](https://qiita-image-store.s3.amazonaws.com/0/102581/c2b2f1d4-7e4e-e11d-13ee-f49bd997da5f.png)
スライダーを動かすと上下に動くぞおおおおおおおお

#まとめ

面白くなってきやがったじゃねーの

（それにつけてもパラメータ追加時のデータ型の豊富さ。頼もしいですね）

#参考

> Edit Parameter Interfaceウィンドウ
http://sidefx.jp/doc/ref/windows/edit_parameter_interface.html

> Geometry > findPointAttrib
http://sidefx.jp/doc/hom/hou/Geometry.html#findPointAttrib
Geometry > addAttrib
http://sidefx.jp/doc/hom/hou/Geometry.html#addAttrib

> Point > setAttribValue
http://sidefx.jp/doc/hom/hou/Point.html#setAttribValue
Line BotをGoogle App Scriptで無料で手軽に試してみる。

今さらですが、Line BotをGoogle App Scriptで、何のインフラももたずに試してみました。
※すでに先着10,000名のトライアルは上限に達したそうです。
申し込みして、まだ試せてない人は、ぜひGoogle App Scriptで試してみてください。

https://developers.line.me/bot-api/overview

Google App Script（GAS）の基本的なところ他の記事にお任せするとして、サンプルコードとおおまかな流れだけを説明します。

# 仕様

Line Botから投稿されたメッセージを、オウム返しするbotです。Line Botはただ送信されたメッセージを自分の持つシステムに届ける（Postされる）だけのシンプルな機構で、それを受け取った後、送信元に同じtextを返すというものです。

# 1. GASのコード

まずはGASのコードを準備していきます。

```js
var channel_id = "<your channel id>"; //LineBotの管理画面から取得
var channel_secret = "<your channel secret>"; //LineBotの管理画面から取得
var mid = "<your mid>"; //LineBotの管理画面から取得

function doGet(e) {
  return ContentService.createTextOutput(UrlFetchApp.fetch("http://ip-api.com/json"));
}

function doPost(e) {
  var json = JSON.parse(e.postData.contents)
  return reply(json.result[0]);
}

function reply(resultJson){
  Logger.log(resultJson);

  var url = "https://trialbot-api.line.me/v1/events";
  var headers = {
    "Content-Type" : "application/json; charset=UTF-8",
    "X-Line-ChannelID" : channel_id,
    "X-Line-ChannelSecret" : channel_secret,
    "X-Line-Trusted-User-With-ACL" : mid
  };
    
  var postData = {
    "to" : [resultJson.content.from],
    "toChannel" : 1383378250, //これは固定値
    "eventType" : "138311608800106203",  //これは固定値
    "content" : {
      "contentType" : 1,
      "toType" : 1,
      "text" : resultJson.content.text + "!"
    }
  };
  
  var options = {
    "method" : "post",
    "headers" : headers,
    "payload" : JSON.stringify(postData)
  };
       
  return UrlFetchApp.fetch(url, options);  
}
```

# 2. アプリケーションを公開する

GASのメニューの「公開」→「WEBアプリケーションとして導入」を開きます。
・プロジェクトバージョン：新規作成
・次のユーザーとしてアプリケーションを実行：自分
・アプリケーションにアクセスできるユーザー：全員（匿名ユーザーを含む）

# 3. LinebotのCallback URLを設定する。

GASの公開されたアプリケーションURLをLine developersの管理画面からCallback URLを設定します。その際、ポート番号を必ず指定する必要があるので、以下の様なURLにします。

```
https://script.google.com:443/macros/s/<xxxxx>/exec
```


※注意：このCallback URLは設定してから有効になるまで、６時間以上かかるようです。急いでも反応しないので気をつけましょう。

# 4. 待ちます。

Callback URLの設定が有効になるのにとにかく時間がかかるので、とにかく待ちます。

# 5. GASからアクセスするIPを調べ、Whitelistに追加します。

上記まで設定で、受信出来るようになりますが、Linebotでメッセージを送信するには、IPをWhitelistに追加する必要があります。

```js
function doGet(e) {
  return ContentService.createTextOutput(UrlFetchApp.fetch("http://ip-api.com/json"));
}
```
この記述によって、GASの公開URLをgetRequestすると、アクセス元のIPを知ることが出来ます。公開URLをブラウザで叩いてみましょう。

IPが分かったらLine developersの管理画面からServer IP Whitelistを追加します。CIDRでの指定です。
例えば、IPが66.249.84.164であれば、66.249.84.1/24としておけばよいでしょう。


# 6. Linebot管理画面のQRコードをLINEに読み込みます。

QRコードから追加し、トークから何か送信してみます。オウム返しでメッセージが帰ってくるはずです。


# 以上です。

今回はGoogle App Scriptで紹介しましたが、シンプルな機構なので他の環境、言語でも可能かと思います。ただ、無料系のSSLではうまくいかない事があるらしいです。

bot元年、これからどういう展開になるか楽しみですね。また今後もGASで色々遊べそうです。
Cloud9でLEMP7-fpm環境をサクっと作り、concrete5を入れてみた

concrete5で手軽にnginx+PHP7-fpm試したいな〜 と思ったので、「**せや、Cloud9に入れたれ！**」と思ったので、どうしたらいいのか考えてみました。

# 既に用意してくれてるヤツがおったで！

とっても親切な人がいました

https://github.com/GabrielGil/c9-lemp

# 使い方

wgetでシェルスクリプトを取ってきて実行します。

```lang:bash
wget -O - https://raw.githubusercontent.com/GabrielGil/c9-lemp/master/install.sh | bash
```

## 起動
```lang:bash
lemp start
```

## 終了
```lang:bash
lemp stop
```

いちいちnginxとMySQLをそれぞれ起動したり終了したりせずに済むので便利ですね。

# concrete5のインストール

[コンクリートファイブジャパンのKatzさんが便利なシェルスクリプトを用意](https://github.com/katzueno/concrete5-install-shell-scripts)してくれています。[こちらの記事](https://concrete5.co.jp/blog/cloud9-concrete5)を参考にインストールすればOK

## nginx.confの設定

concrete5のパスの読み出し方に対応させるため、location /のところを下記の内容に変更します。

```/usr/local/nginx/conf/nginx.conf
        location / {
            index  index.php;
            if (!-e $request_filename) {
            rewrite ^ /index.php last;
            }
        }   
```

これまた、[コンクリートファイブジャパンのiwamon様が書かれた記事]（http://qiita.com/jey0taka/items/b72ec37dfe308bd735ee）を参考に致しました。

# 起動してみよう

`lemp start`した後に、Previewボタンを押せば、concrete5のインストール画面になるかと思います。

インストールが完了したら、その速さにシビれてください。[PHP5.5.9との比較情報はコチラ](http://concrete5-japan.org/community/forums/chat/post-13173/#msg13173)

お疲れ様でした。
spacemacsをproxy越しに使う方法

# spacemacsの動作で苦労しないためには
emacsを最低でも24.4にします。24.3とかだとエラーが発生します。linuxのディストリビューションのデフォルトのままだとemacsが古い場合、ソースからコンパイルして入れたほうが良いです。ついでに global （helm-gtagsで使う）とか使ってる場合、こいつも最新にしておいたほうが幸せになれます（5.xx系は避ける）。

# proxyの設定方法
うちの会社のように腐れ外道なproxyの場合、.spacemacsファイルのspacemacs/init()にある
> dotspacemacs-elpa-https t
> dotspacemacs-elpa-timeout 5

を
> dotspacemacs-elpa-https nil
> dotspacemacs-elpa-timeout 20

とか値を変えておきます。proxy越しで毎回アップデート確認してほしくないときは、

> dotspacemacs-check-for-update t

の値を nil に変えます。emacsの起動も早いし。

## 環境変数http_proxyの値をemacsに反映する方法

環境変数で統一的にproxyの値を書きたいので環境変数 http_proxy　の値をemacsの設定に反映するためのemacs-lispを書きました。 いろんなところにproxyのパスワードがばらまかれて書かれてると変更があったときに反映に苦労します。一つでも減らしておきたいところです。
http://user:passwd@proxy_url:port の形式で書かれているのを前提にしています。

別にspacemacsでなくても普通のemacsのinit.elにも使えると思います。

```el:dot.spacemacs
(defun set-proxy ()
  (when (getenv "http_proxy")
    (cl-flet (
           ;; get user:passwd entry from http_proxy environment var and base64-encode it.
           (get-passwd-encode-string ()
             (let* ((ev (getenv "http_proxy"))
                    (x (decode-coding-string (url-unhex-string ev) 'utf-8))
                    )
               (if (not (equal x ""))
                   (base64-encode-string
                    (substring x (+ 2 (string-match "//" x)) (string-match "@" x))
                    )
                 nil)))
           (get-proxy-url-string ()
             (let* ((ev (getenv "http_proxy"))
                    (x (decode-coding-string (url-unhex-string ev) 'utf-8))
                    )
               (if (not (equal x ""))
                   (substring x (+ 1 (string-match "@" x)))
               ""))) )
    ;; proxy service var
    (setq url-proxy-services `(("no_proxy" . "^\\(localhost \\| 10.*\\)")
                               ("http"  . ,(get-proxy-url-string))
                               ("https" . ,(get-proxy-url-string))
                               ))
```

こいつを.spacemacsの中に書き加え、.spacemacsのuser-initから呼び出されるように記載します。

```el:dot.spacemacs
(defun dotspacemacs/user-init ()
  "Initialization function for user code.
It is called immediately after `dotspacemacs/init', before layer configuration
executes.
 This function is mostly useful for variables that need to be set
before packages are loaded. If you are unsure, you should try in setting them in
`dotspacemacs/user-config' first."

  (set-proxy)    ;; プロキシ設定関数の呼び出し追加

  )
```
CodeIgniter3のlimit()が生成するSQL

## はじめに

CodeIgniter 3.06で確認しました。

CodeIgniterには、Active Record(クエリビルダ)という機能があります。

これはあらかじめ用意されているメソッドを利用することで、SQLを書かずにクエリを発行する機能です。

一番シンプルな形はこれですね。

```
$query = $this->db->get('mytable');
```

これを実行すると、mytableの全レコードを取得します。

その他

- select()
- select_max()
- from()
- join()
- where()
- like()
- group_by()
- distinct()
- order_by()
- insert()
- update()
- delete()

といった対応するSQLをイメージできるメソッドが用意されています。

そんな中

- limit()

というメソッドがあります。

limit()の構文はこうです。
> limit(取得レコード数, オフセット)


21～30のレコードを取得したい場合は、

```
$this->db->limit(10,20);
```

のように書きます。

これはどのようなSQLが生成されるのでしょうか。MySQLはわかるのですが、Oracleはどうなるのでしょうか。
想定する結果を返してくれるのでしょうか。今回の調査の目的はここです。

というわけで、MySql、PostgreSql、Oracleでこのlimit()を使った場合にどのようなSQLが生成されるのかを調べてみました。

sampleテーブルから20件目から10件（21～30件目）を取得するソースです。

実際のソースはこのようになっています。

```
$this->db->limit(10,20);
$query = $this->db->get('sample');
return $query->result();
```

では、実際に発行されるSQLを確認してみます。

## MySqlの場合

```
SELECT * FROM `sample` LIMIT 20, 10
```

想定どおりですね。MySQLは行数の制限がラクでよいですね。

## PostgreSqlの場合

```
SELECT * FROM "sample" LIMIT 10 OFFSET 20
```

Postgresあまり使ったことなかったのですが、LIMITが用意されているのですね。
こちらも納得な感じです。

## Oracleの場合

```
SELECT * FROM
  (
    SELECT
      inner_query.*, rownum rnum
    FROM
        (SELECT * FROM "sample" ) inner_query
    WHERE
      rownum < 31
  )
WHERE rnum >= 21
```

やっぱりOracleはこうなるしかないですよね。limit句がないので。

というようにoracleの場合は自動的にインラインビューとrownumを使ったSQLが組み立てられるという結果になりました。

データ量が多くなると性能的に厳しそうですが、フレームワークでこの差分を吸収してくれるのは助かりますね。
Google Tag Manager の命名規則に沿って実装してみた [タグの実装編]

[Google Tag Manager の命名規則を考えてみた [設計編]](http://qiita.com/tokuda109/items/18ff36097ec6eee0460e) の記事で策定した命名規則の実践編として、今回は実際に実装したタグをいくつか紹介します。

## PageView

### Pageview - Category Detail Page

##### トラッキングタイプ

ページビュー

##### その他の設定: 設定するフィールド

フィールド名: page
値: [{{Variable - Virtual Page View}}](http://qiita.com/tokuda109/items/e829cf1d112cbbe94945#ga---variable---virtual-page-view)

## Event

### Event - Click - Outbound Link

外部サイトに遷移するリンクに対するイベントをトラッキングしています。

##### トラッキングタイプ

イベント

##### カテゴリ

{{Variable - Event Category - Outbound Link}}

##### アクション

{{Variable - Event Action - Click}}

##### ラベル

計測するリンク要素の名前などを指定しています。

###### 例

* footer-link

##### 値

必要に応じて値をセットします。

## Social

### Social - Facebook - Like

Facebook や Twitter 等のソーシャルサービスのボタンプラグインに対してイベントをトラッキングしています。

###### トラッキングタイプ

ソーシャル

###### ネットワーク

打ち間違いをなくしたり、タグを設定する時に補完が表示されるので定数化しています。

[{{Variable - Social Network - Facebook}}](http://qiita.com/tokuda109/items/e829cf1d112cbbe94945#variable---social-network---facebook)

###### アクション

上述と同じ理由から、定数化しています。

[{{Variable - Social Action - Like}}](http://qiita.com/tokuda109/items/e829cf1d112cbbe94945#variable---social-action---like)

###### アクションターゲット

DataLayer変数として受け取った値をセットします。

{{Variable - Social Target}}

### 他のソーシャルの場合

Facebook以外の他のソーシャルサービスにおいても同様に定数化と命名規則で設定しています。

* Social - Facebook - Share
* Social - Twitter - Follow
* Social - Twitter - Tweet
* Social - Google - Plus
* Social - Line - Send

等があります。
GoogleAppEngine/Goで共通の値を保持したままAPI Handlerを実行する

## Context
今回は、contextを使って値を持ち回りながらHandler間で共有しようという話です。

## Motivation
Wrapperで認証などの前処理を行ったあとに処理結果などをAPIに渡したい。
APIの引数にその度に渡す方法だと拡張性に乏しいので何かないか探していた。

## 実践
AppEngineのcontextを取得してから、これを親としたcontextを作成していきます。

```go:wrapper_example
// 前後の処理は割愛します

type contextHandler func(ctx context.Context, w http.ResponseWriter, r *http.Request)

type Wrapper struct {
    handler contextHandler
}

func (w *Wrapper) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    // AppEngineのcontextを取得します
    ctx := appengine.NewContext(r)

    res, err := getHogehoge(foo, bar)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }

    // ここでresを保持するcontextを作成します
    newCtx := context.WithValue(ctx, "hoge", res)
    w.handler(newCtx, w, r)
}
```

contextの内部の値はinterface{]で保持されるため、reflectを使って取得していきます。

```go:handler_example
func exampleHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) {
    // ここではhogeは単純に文字列を保持しているとします
    // structなどはまた違う取り出しかたが必要です
    hoge := reflect.ValueOf(ctx.Value("hoge")).String()

    do(hoge)
}
```

## まとめ
このようにcontextを使用することでstructや変数を減らすことが出来るのでは、と思いました。
複数の値を保持する場合は、さらに重ねるようにしてcontextを作成します。
まだ使ったばかりなので、contextの生成コストを調べていないです。
使いながらパフォーマンスが気になったら、また新しいことを考えようと思います。
間違いの指摘などいつでもお願いします :+1: 

## 追記
https://code.google.com/p/googleappengine/issues/detail?id=12725
ここにある通り、`golang.org/x/net/context/ctxhttp/cancelreq.go`のbuildタグを削除しないと上手く動かないです。
Cloud9でサクっとBASIC認証をかける

Cloud9は、仕様上、無料版で１つの非公開ワークスペースしか設定できません。でも、人には非公開で進めたいプロジェクトもあったりするわけです。

そこで「**せや、BASIC認証かけたれ！**」

# っていうシェルスクリプトを書きました

下記に用意しました。もっとよくできるよ！　ってアイデアある方はプルリクお待ちしております。

https://github.com/kohki-shikata/c9-basic-auth

# 使い方

上記リポジトリにあるシェルスクリプトを取ってきます。

```bash
wget https://raw.githubusercontent.com/kohki-shikata/c9-basic-auth/master/basic.sh
```

Workspaceにbasic.shが出来ると思うので

```bash
sh basic.sh
```

を実行します。

apt-getがhtpasswdコマンドのためのapache2-utilを取ってきてくれたりするので、しばらく待ちます。

最後にIDとPasswordを聞かれますので、入力します。Passwordは確認のため２回聞かれますので、同じ内容を入力してください。

あとは、RunしてPreviewし、Basic認証がかかっているかどうか確認してください。

おつかれさまでした。
Golangで、MessagePackを使い、Redisに書き込み/読み込みをする

下記の書籍の4章のsprinkleを写経中に思い付いたので、やってみた。
「Go言語によるWebアプリケーション開発」
http://www.amazon.co.jp/exec/obidos/ASIN/4873117526/noimpslmtbrk-22/

ライブラリ選定基準は、スターの数やQiitaの記事を参考に選んだ。

Redisへの接続ライブラリはRedigoを使用。
https://github.com/garyburd/redigo

MessagePackのEncode/Decodeライブラリはugorji/goを使用。
https://github.com/ugorji/go

```go:MsgPackToRedis.go
package main

import (
	"github.com/ugorji/go/codec"
	"log"
	"github.com/garyburd/redigo/redis"
	"os"
)

type OtherWord struct {
	Word []string
}

const otherWord = "*"

var transforms = []string{
	otherWord,
	otherWord,
	otherWord,
	otherWord,
	otherWord + "app",
	otherWord + "site",
	otherWord + "time",
	"get" + otherWord,
	"go" + otherWord,
	"lets" + otherWord,
}

//msgpack専用のBundle
var (
	mh codec.MsgpackHandle
)
const message = "length of %#v as MessagePack: %d\n%v"
func main() {
	otherWord := OtherWord{
		Word:transforms,
	}

	writeRedisForUseMsgPack("otherWords", messagePackEncoding(otherWord))

	value := readRedisForUseMsgPack("otherWords")

	messagePackDecoding(value)
}

func messagePackEncoding(otherWord OtherWord) []byte {
	//Encodingされる中身を受け取るbyte[]のスライス
	buf := make([]byte, 0, 64)
	//messagePack専用のBundleを使用してEncoderの準備をして、Encodeする。
	err := codec.NewEncoderBytes(&buf, &mh).Encode(otherWord)
	if err != nil {
		log.Printf("error encoding %v to MessagePack: %v", otherWord, err)
	}
	log.Printf(message, otherWord, len(buf), buf)
	return buf;
}

func messagePackDecoding(buf []byte) OtherWord {
	//Encodingされる中身を受け取るOtherWord構造体型の変数
	var otherWord OtherWord
	//messagePack専用のBundleを使用してDecoderの準備をして、Decodeする。
	err := codec.NewDecoderBytes(buf, &mh).Decode(&otherWord)
	if err != nil {
		log.Printf("error decoding %v to MessagePack: %v", buf, err)
	}
	log.Printf(message, otherWord, len(buf), buf)
	return otherWord;
}

func writeRedisForUseMsgPack(key string, buf []byte) {
	con, err := redis.Dial("tcp", ":6379")
	if err != nil {
		log.Println(err)
		os.Exit(1)
	}
	defer con.Close()

	con.Do("SET", key, buf)
}

func readRedisForUseMsgPack(key string) []byte {
	con, err := redis.Dial("tcp", ":6379")
	if err != nil {
		log.Println(err)
		os.Exit(1)
	}
	defer con.Close()

	buf, err := redis.Bytes(con.Do("GET", key))
	if err != nil {
		log.Println(err)
		os.Exit(1)
	}
	return buf;
}
```
https://gist.github.com/noimpslmtbrk/d128d68f44244454940699213ae89ca0
IntelliJ IDEAでMavenを使ってLWJGLを始める方法

# はじめに
LWJGLとはなんぞや？
といいますとLWJGL(Lightweight Java Game Library)というもので
簡単にいえばJavaでOpenGLを使ってゲームを作れるよ！みたいなものです。
有名な例だとMinecraftなんかが利用していたと思います。

## IntelliJ IDEAでの始め方
とりあえず[ここ(LWJGL use in Maven - LWJGL)](http://wiki.lwjgl.org/wiki/LWJGL_use_in_Maven)見ればなんとなくわかりますね。

じゃあこれでいいじゃないかと。
ダメなんですよ。
![Exception.png](https://qiita-image-store.s3.amazonaws.com/0/114420/9ee97af8-8b95-2d8b-4322-3157e476c572.png)
こうですよ。

## テスト用ソース

```java:Main.java
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;

public class Main {

    public Main() {
        try {
            Display.setDisplayMode(new DisplayMode(800, 600));
            Display.create();
            Display.setTitle("Test");

            while(!Display.isCloseRequested()) {
                Display.update();
            }

            Display.destroy();
        } catch(LWJGLException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Main();
    }

}
```

こんな感じで。

## 対策
まずは
![View.png](https://qiita-image-store.s3.amazonaws.com/0/114420/c22e9372-e6f2-75f0-5fd6-776f99574410.png)
[View->Tool Windows->Maven Project]でMavenProjectのパネル(?)を開きます。

そうしたら
![Plugin.png](https://qiita-image-store.s3.amazonaws.com/0/114420/3fc56d3f-0dcb-4feb-10d3-d9c5e2a7bb39.png)
[Plugins->nativedependencies->nativedependencies:copy]
を実行しましょう。

するとプロジェクトルートにnativesなるフォルダができると思います。
これがLWJGLの必要な実行ファイル群になります。
こいつをプログラムの実行時に参照するように指定してあげましょう。

右上の方にmainメソッドのあるクラスが書いてあるボタンがあるので
![Main.png](https://qiita-image-store.s3.amazonaws.com/0/114420/980c2dff-613e-4f65-cfc2-bb0b4d577fb0.png)
[(クラス名)->Edit Configuration]を選択しましょう。

最後にVM optionsに[-Djava.library.path=natives/]と書き込んで上げればうまく実行されます。
![VMOption.png](https://qiita-image-store.s3.amazonaws.com/0/114420/98ad6cd9-b57a-2c14-3367-b396a2fb04b9.png)

## 最後に
mavenの導入丸投げ？
書くのめんどい。 (あれくらいならみんなわかるでしょ
とりあえず修正あったらコメント下さい
Nagiosであれこれ ～notifications～

# Nagiosのアラート通知
そもそも、nagiosの監視ってホストとサービスで分かれていて、個別にアラート通知が行われてる。
で、例えば特定のサービスのメンテナンスとかで監視NGになるけどアラート飛ばさなくていいよって場合、
Webページ側からちまちまとやるんだけど、対象が多いとひたすらにうざい。。。

# 自動化
ここのところ潮流になってる自動化のビッグウェーブにのってアラート飛ばさない設定を
ある程度自動でやってしまえるという話。

ざっくりとは、[この方の記事](http://mikeda.hatenablog.com/entry/20130525/1369476059)を参考にするとまぁ分かる。

Nagiosには基本的にAPIとかってなくて(あるよって人は教えてくれると嬉しいです)、
外部コマンドというなんか頑張ってるものがあります。
外部コマンドに特定のパラメータを組合せることで、わざわざマウスクリックを連打しなくてすむようになります。

- [Nagios外部コマンド](nagios.x-trans.jp/Nagios-doc/JAPANESE/extcommands.html)

↑で紹介した記事内で下記のコマンドが実行されてるんですが、

```bash
# echo "[$(date +%s)] DISABLE_HOST_SVC_NOTIFICATIONS;test01" > /var/spool/nagios/cmd/nagios.cmd
```

これなにやってるかというと、

- [$(date +%s)] 
    - [UTC表記時間]
- DISABLE_HOST_SVC_NOTIFICATIONS;test01
    - DISABLE_HOST_SVC_NOTIFICATIONS
      - ホストの全てのサービスの通知無効
    - test01
      - 通知を止めたいホスト名
    - /var/spool/nagios/cmd/nagios.cmd
      - 外部コマンドのフルパス
        -  ※パッケージからインストールしている場合
        -  ※ソースから入れている場合、特にインストールディレクトリを変更していなければ下記

```bash
 $ /usr/local/nagios/var/rw/nagios.cmd 
```

実際に実行すると、/usr/local/nagios/var/nagios.logに↓のように記録される。

```sh
[1461240837] EXTERNAL COMMAND: DISABLE_HOST_SVC_NOTIFICATIONS;testo1
```

なのでこいつを上手く利用してやればいい。
上の例は、特定のホストの全サービスだったけど、特定のサービスだけ適応…といったことも可能
Unity StrippingLevelをStrip ByteCodeへ変更時のHttpWebRequest通信するための対応

■StrippingLevelを変更した時の問題点

　別スレッドをたてて通信を行っていた処理がエラーになった。

　下記で落ちる、ログでない、しかも**Android**のみ

　まずは　**HttpWebRequest req = (HttpWebRequest)WebRequest.Create(URL文字列);**

　そして　**var s = req.GetRequestStream();**

　ネットを検索したところ下記のようなページを見つける

　https://gist.github.com/xVir/fc2f450165ec9c84c05d
　http://answers.unity3d.com/questions/800287/using-httpwebrequest-when-stripping-assemblies.html


■対処方法

　Assetsの直下に**link.xml**を作成し、その中に使用した名前空間などを記述する。

　スレッド内でHttpWebRequest・HttpWebResponseを用いた送受信の場合、
　下記のような設定が必要

```link.xml
<linker>
    <assembly fullname="System">
        <namespace fullname="System.Net" preserve="all"/>
        <namespace fullname="System.Threading" preserve="all"/>
        <type fullname="System.Net.WebRequest" preserve="all"/>
    </assembly>

    <assembly fullname="mscorlib">
        <namespace fullname="System.Security.Cryptography" preserve="all"/>
        <type fullname="System.Net.WebResponse" preserve="all" />
        <type fullname="System.Net.HttpWebResponse" preserve="all" />
    </assembly>

    <assembly fullname="Mono.Security">
        <namespace fullname="Mono.Security.Protocol.Tls" preserve="all"/>
        <namespace fullname="Mono.Security.X509" preserve="all"/>
    </assembly>
</linker>
```


■StrippingLevelをMAXの**Use micro mscorlib**にした場合に使用可能なクラスとメソッドの一覧

　https://docs.unity3d.com/400/Documentation/ScriptReference/MonoCompatibility.html


■Stripping Levelに関する参考ページ

　・【Unity】Stripping Levelについて
　http://fspace.hatenablog.com/entry/2016/02/23/180816


　・ビルドした iOS プレイヤーのサイズ最適化
　http://docs.unity3d.com/ja/current/Manual/iphone-playerSizeOptimization.html
Interstage Application Server V9 から GlassFish 3.x - 4.x に EAR を migrate した件

外注したアプリケーションを自社で直せないかという話が持ち上がり、調査している中で手こずった部分があったのでメモ。記憶に頼って書いている部分があるのでバージョン等は前後する可能性あり。これで助かる人はいないかもしれないけど。

# 元の環境

Interstage Application Server V9 = GlassFish 2.x 相当 + Toplink Essentials (JPA実装)

# 移行先の環境

GlassFish 3.x - 4.x (JPA実装は、EclipseLink、JPA2.0相当?)

# 開発環境

Windows 7 + Pleiades (Eclipse 4.4) + Oracle Enterprise Pack for Eclipse 12.1.3.8

# EAR の構造

hoge_ear
　L dao.jar (Persistence.xml あり)
　L その他の jar (EJB等)
　:
　L web.war (フロントエンド部分)

# 始めの一歩

## GlassFish の準備

基本 Web インターフェースの管理コンソールはあまり使わず。以下、GlassFish の管理コマンド asadmin のサブコマンドを併記しているが、引数等は省略。`asadmin help サブコマンド` とかで確認されたし。

1. GlassFish の配置
2. 環境変数 AS_JAVA の設定(先に Pleiades を展開していれば、同梱の JRE を指定する。)
3. GlassFish の起動 `asadmin start-domain`
4. JDBC ドライバを domain の lib ディレクトリに配置 `asadmin add-library`
5. JDBC Connection Pool の追加 `asadmin create-jdbc-connection-pool`
6. 5 で追加した接続が大丈夫か確認 `asadmin ping-connection-pool`
7. JDBC Resource の追加 `asadmin create-jdbc-resource`
8. GlassFish の停止 `asadmin stop-domain`

## Pleiades の準備

1. Pleiades の配置
2. oepe を展開し、フォルダ plugins,features を 2 の同一名フォルダに統合
3. eclipse を起動し、パースフェクティブを JavaEE に変更
4. JRE を java8 から java7 に変更(必須ではないが、GlassFish 3.x では問題起こすかも)
5. サーバービューでサーバーを追加(GlassFish 3.1.2 で GlassFish 4.x に対応)
6. 該当 EAR をインポートし、ビルドパスなどを修正

# 困ったこと

デプロイ自体は難なく行えたが、実際にログインを行おうとするとそんなユーザ知らねえよと拒否された。該当する GlassFish domain の server.log を確認すると以下のエラーになっていた。

`Unable to retrieve EntityManagerFactory for unitName null`

当初は、`@PersistenceContext` で unitName が明示されていないのがダメなのかと思ったが(素人考え)、明示しても null の部分が変わるだけであった。

JPA 自体が使えるのかどうか、簡単な動的Webアプリケーションを作成したりして、切り分けをした。

# 解決への導き

いろいろ検索してみたけど、そのものズバリの答えにはたどりつかず。

[Java Persistence API (JPA) 実践入門(ひだまりソケットは壊れない)](http://vividcode.hatenablog.com/entry/java/jpa-introduction)

にて「永続ユニット (Persistence Unit) のパッケージング」の項にある

> Java EE 環境における永続ユニットのルートは、次のどれかでなければなりません:
>
> - EJB-JAR ファイル
> - WAR ファイルの WEB-INF/classes ディレクトリ
> - WAR ファイルの WEB-INF/lib ディレクトリ内の jar ファイル
> - EAR ライブラリディレクトリ内の jar ファイル
> - アプリケーションクライアント jar ファイル

という記述から、EAR 内における dao.jar (仮)の配備位置が悪いという仮説を立てました。

# 行なった変更

デプロイメント記述子の中で単純に dao.jar を `Library Directory : lib` にドラッグ&ドロップするとデプロイすら失敗した。(なんて乱暴)

1. 新たに「JPAプロジェクト」を作成し、EARに追加。(ちゃんと `Library Directory : lib` に配備される。)
2. dao.jar の persistence.xml を参考に設定。元のは削除。
3. dao.jar から Entity クラスを移動してくる。(正確にはコピー&貼り付けして削除)
4. ear をデプロイ

これでログインしてその後の操作も問題なく行えるようになりました。(比較的、幸運な例かもしれません。)

# 雑感

- 以上の説明はかなり行間を読め、みたいな記述になっていて申し訳ない…
- 正直、Java がこんなに普及するとは思ってなかった…(先見の明なし…)
- DI とか CDI のおかげで書くコードの量が格段に減るよね…
- JPA というか O/R マッピング使うと楽だね。データベースサーバの移行も比較的楽そう。
- JavaSE と JavaEE を単なる Edition の違いと考えちゃダメ。JavaEA とかにしたら良かったのに…(< 英語ダメな人)
Apache2.2でLet's Encrypt する時にドキュメントルートでドメインチェックされたくない

ドキュメントルートに知らない隠しディレクトリ勝手に作られるの嫌だとか、cronで回すのに、sudo付けて外部と連携してドキュメントルートにファイル作るほど信用していいのとか、3ヶ月に一回謎のファイル改ざんアラートが飛んできて夜寝るのが怖いとか色々な理由でLet's Encrypt出来ない時のためのメモ

```httpd.conf
<VirtualHost 10.1.2.3>
  ServerAdmin webmaster@host.foo.com
  DocumentRoot /www/docs/host.foo.com
  ServerName host.foo.com

  Alias /.well-known /tmp/hoge/.well-known
  <Directory /tmp/hoge>
    Order Allow,Deny
    Allow from All
  </Directory>
</VirtualHost>
```

```bash
./letsencrypt-auto certonly --webroot -w /tmp/hoge -d host.foo.com
```

webrootプラグインで指定したとこに「.well-known/acme-challenge/hogefuga」ってドメインチェック用ディレクトリとファイル作るんで、上のようにAliasとかみんな大好きmod_rewriteとかでうまくゴニョって「.well-known/acme-challenge/hogefuga」にアクセスさせてやれば良い
New RelicのMySQL PluginをUbuntuに導入する


![image](https://qiita-image-store.s3.amazonaws.com/0/30079/bfcb3e7a-fc0c-fc46-5914-f3f97e973dc1.png)
(wikipediaより)

今回は、MySQL PluginをUbuntuに導入します。

# 参考URL

* https://discuss.newrelic.com/t/getting-started-with-the-platform-installer/842

# インストール手順

以下を、rootになり実行します。

## Javaのインストール
最初に、Javaが必要なので、インストールします。

```
sudo apt-get install default-jre

インストールできたらバージョンを確かめます。
# java -version
java version "1.7.0_95"
OpenJDK Runtime Environment (IcedTea 2.6.4) (7u95-2.6.4-0ubuntu0.14.04.2)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)
```

## New Relic Plugin Installerのインストール

次に、New Relic Pluginのインストールプラットフォームである、NPI(New Relic Platform Installer)を導入します。

YOUR_KEY_HEREの部分は適宜変えてください。

```
LICENSE_KEY=YOUR_KEY_HERE bash -c "$(curl -sSL https://download.newrelic.com/npi/release/install-npi-linux-debian-x64.sh)"

~/ にインストールされるので、移動する
cd ~/newrelic-npi
```

## MySQL Pluginのインストール

```
./npi install com.newrelic.plugins.mysql.instance
```

途中で設定ファイルを編集するかときかれるので、はいと答え、以下のように編集する。
metricsを以下のように書き換えるととれる指標が増えて便利。

```
{
  "agents": [
    {
      "name"    : "すきな名前",
      "host"    : "DBのホスト名",
      "metrics" : "status,newrelic,master,buffer_pool_stats,innodb_status,innodb_metrics",
      "user"    : "DBのユーザ名",
      "passwd"  : "DBのパスワード"
    }
  ]
}
```

その他、全部、はいと答えておけばいい。

# インストールされたか確認

数分たってから、New RelicのWeb画面から、PLUGINS => MySQL に行き、各種グラフが出ていれば完了。
Errbotのpluginを作ってみる

Hubotのhubot-scriptに当たる仕組みを、Errbotではpluginといいます。

[こちら](https://github.com/errbotio/errbot/wiki)にはサードパーティのPluginが並んでいますが、
せっかくなので作ってみようと思います。

# pluginの基本部分

pluginは2個のファイルが必要です。

* plugファイル
* pythonモジュール

plugファイルは**pluginのメタデータファイル**です。
Pythonのバージョン指定、helpコマンド実行時の説明文などが記述されています。

pythonモジュールは**pluginの実体**です。
ロジックをこちらに書きます。

# 返事をするだけのplugin

![hello_plugin.png](https://qiita-image-store.s3.amazonaws.com/0/6805/485b63d6-3c0d-eb83-f681-45ef890cc735.png)

```ini:hello.plug
[Core]
Name = Hello
Module = hello

[Python]
Version = 2+

[Documentation]
Description = Hello plugin
```

```python:hello.py
# -*- coding:utf8 -*-
from __future__ import division, print_function, absolute_import
from errbot import BotPlugin, botcmd


class Hello(BotPlugin):
    @botcmd
    def hello(self, msg, args):
        return 'Hello world!'
```

## 中身をもうちょっと詳しく

pluginの実体クラスはBotPluginを継承します。初期化時にもろもろの処理をしてくれるのですが、今回は省略します。
`botcmd`デコレータでデコレーションしたメソッドの名前がそのままコマンドになります。

* ここでは`!hello`がそのままコマンドになります。

botコマンドになるメソッドには2個の引数が必要です。

* msg
    * コマンドの全文
* args
    * コマンドに引数がつけられるので、その引数部分
    * 特にlistなどにパースされてはいない

`botcmd`にデコレートしたメソッドが文字列を返すと、それをそのまましゃべってくれます。
楽でいいですね。


# 天気を教えてくれるplugin

![bl549uY4BE.gif](https://qiita-image-store.s3.amazonaws.com/0/6805/31ccef75-ed72-d297-d305-cff1ae2c1f70.gif)

```py3:weather.py
# -*- coding:utf8 -*-
from __future__ import division, print_function, absolute_import
from errbot import BotPlugin, botcmd
import requests
from xml.etree import ElementTree


class Weather(BotPlugin):
    WEATHER_HACK_AREA_URL = \
        'http://weather.livedoor.com/forecast/rss/primary_area.xml'
    WEATHER_HACK_API_URL = \
        'http://weather.livedoor.com/forecast/webservice/json/v1?'

    @botcmd
    def weather(self, msg, args):
        # 引数に指定された都市を探す
        city_id = self.find_city_id(args)
        if city_id is None:
            return u'{} は確認不可能な地域です'.format(args)
        resp = requests.get(
            self.WEATHER_HACK_API_URL,
            {'city': city_id}
        )
        wt_json = resp.json()
        return u'{}: {}は{}'.format(
            wt_json['title'],
            wt_json['forecasts'][0]['dateLabel'],
            wt_json['forecasts'][0]['telop']
        )

    def find_city_id(self, city_name):
        """LivedoorのAPIで天気を返す都市を探す
        """
        resp = requests.get(self.WEATHER_HACK_AREA_URL)
        tree = ElementTree.fromstring(resp.content)
        cities = {
            elm.attrib['title']: elm.attrib['id']
            for elm in tree.findall('.//city')
        }
        return cities.get(city_name, None)
```

この時点では雑にargsをそのまま都市名とみなして天気を返すようにしてますが、
「複数都市をスペース区切りで投げてきたら分割してそれぞれの都市の天気をまとめて返す」
といったことも可能です。
ArgumentParserを利用すれば引数の取り扱いは柔軟にできるので、いろいろな可能性がありそうですね。
「\\fileserver\share」のようなUNCパスにもcdしたい（PowerShell）

# やりたいこと・やり方

Windowsのコマンドラインで「\\fileserver\\share\test」
ようなUNCのパスにcdとかしたい場合とします。

単純にDOSプロンプトでやろうとしてもUNCはサポートしていない旨のエラーとなってしまいます。

```text:DOSプロンプトでcd
D:\>cd \\fileserver\share\test
'\\fileserver\share\test'
CMD では UNC パスは現在のディレクトリとしてサポートされません。
```

そこで、powershellを使います。

```text:PowerShellでcd
D:\>powershell
Windows PowerShell
Copyright (C) 2013 Microsoft Corporation. All rights reserved.

PS D:\> cd \\fileserver\\share\test
PS Microsoft.PowerShell.Core\FileSystem::\\fileserver\share\test> dir


    ディレクトリ: \\fileserver\share\test


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2016/04/21     20:42            新しいフォルダー
-a---        2016/04/21     20:44     500024 text2.txt
-a---        2016/04/21     20:44      71432 text1.txt
-a---        2016/04/21     20:45          4 text3.txt
```
それらしいことが出来ました。

# 少し応用
## 今エクスプローラーで開いているファイルサーバー上のフォルダのファイル名一覧を取得したい場合

1.エクスプローラーで開いている状態から・・
![Image8.png](https://qiita-image-store.s3.amazonaws.com/0/113577/8c126c2c-d801-b21f-e82d-8dde4052e229.png)

2.上のバーの「powershell」と入力してエンター
![Image9.png](https://qiita-image-store.s3.amazonaws.com/0/113577/e9c4b523-3811-9c01-e4bf-6b88c0622075.png)

　※上図はWindows7の例ですが、Windows8からは下図のように
　　エクスプローラーのファイルメニューからでも開けます。
![Image1.png](https://qiita-image-store.s3.amazonaws.com/0/113577/fa96af48-6637-b28f-fa3c-668bd4d5d025.png)

3.開いたPowerShellの画面で「dir -n」と入力してエンター
![Image10.png](https://qiita-image-store.s3.amazonaws.com/0/113577/48880fd4-8aa3-1c8a-d939-c7d583e7a194.png)

表示されました。最後のコマンドは「ls -n」等でもよいです。
UbuntuにNew Relic Serversを入れる


ただの備忘録です。
UbuntuにNew Relic Serversを導入します。New Relic Serversは、サーバのCPUやメモリ、プロセスなど主に、サーバ自体に関わる数値を表示してくれます。

# 参考となるNew Relicページ

* https://rpm.newrelic.com/accounts/1066691/servers/get_started

# インストール手順

まず、sudo権限のあるアカウントでサーバに入ります。

次に、以下をsudoで実行するかrootになって実行してください。

New Relic用のリポジトリを追加します。

```
echo deb http://apt.newrelic.com/debian/ newrelic non-free >> /etc/apt/sources.list.d/newrelic.list

wget -O- https://download.newrelic.com/548C16BF.gpg | apt-key add -

apt-get update
```

次にサーバモニタリングパッケージをインストールします

```
apt-get install newrelic-sysmond
```

最後にデーモンを有効にします。ライセンスキーは適宜自分のものに置き換えてください

```
nrsysmond-config --set license_key=xxx
/etc/init.d/newrelic-sysmond start
```

コンフィグをログは以下なのでうまくいかない場合は参照してください。

```
/etc/newrelic/nrsysmond.cfg
/var/log/newrelic/nrsysmond.log
```

# あとがき

ほぼリンクそのまんまやん。。。
Bluemixでデータ分析！ビッグデータ分析DB「dashDB」：DB作成からデータロードまで

dashDBを試してみた。
## そもそもdashDBとは
DB2のBLUアクセラレーション等を組み込んだ、分析のためのクラウドデータベース。
らしい。
参考：https://www.ibm.com/developerworks/jp/data/library/dashdb/dm-dashdb1-bluemix/
Bluemixでフリーアカウントを作って、1Gまでなら無料で使えるっぽいので、また色々試してみることに。
## DB作成
・Bluemixのカタログから「dashDB」をクリック
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/119378/db0fcbfc-eb94-bc49-4b0a-97ad605f8049.jpeg)

・Entryになっていることを確認して、「作成」をクリック

・数秒経つと、画面遷移するので「LAUNCH」をクリック
・さらにそこから「Work Faster」とでかでかと書かれた画面が出てくる。ここまでくればDB環境の作成は完了
## データロード
・左ペインから「Load」の「Load from Desktop」をクリック
![WS000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/119378/93497644-35f0-4eb6-9007-e0dce8fd3340.jpeg)

・ローカルPCにあるデータを読みこませるようにしてみました。今回は気象庁が公開しているデータをダウンロードしてきました。ただしそのままだと綺麗なcsvではないので、うまく加工して使いました。もともとは、こんなかんじ↓
![WS000020.JPG](https://qiita-image-store.s3.amazonaws.com/0/119378/68d5c680-d493-d9de-9377-740f57ce0aa1.jpeg)

で、これを、行を削ったり、日付をyyyy/mm/dd(2015/4/19を2015/04/19　にしたり）に整えたりしました。そんなこんなをして読み込める形になおして、さて本題のdashDBで読み込む作業・・・

①データファイルを選択します
②最初の行は、項目名が入っているのでここはYES
③1208はUTF8の意味らしい。テキストエディタ等でデータファイルの文字コードをUTF8にしてあげて、ここはこのまま。
④csvだから、commma区切り、ということでそのまま。
⑤最初の列が日付なのでYES.　日付の表示方法はyyyy/mm/ddなので、それを⑥を指定。ここまでできたら、右下のPreviewをクリック
![WS000026.JPG](https://qiita-image-store.s3.amazonaws.com/0/119378/15410352-bc6f-95c6-922a-0cc0593f0a62.jpeg)

・データが入っていることを確認。もしデータファイルに何か不都合がある場合はここでエラーが出ます・・・問題なかったら「Next」をクリック。

・次はテーブル定義。小数点の定義とかを事実に併せて編集して、Finish！
![WS000028.JPG](https://qiita-image-store.s3.amazonaws.com/0/119378/03b56505-a6f5-0243-564f-139ee2d17004.jpeg)

・データのロードがなされます。ここでデータがうまく入らないと、rejectというところにカウントが増えていきますが、今回は0、つまり全部入ったということです。ぱちぱち。![WS000029.JPG](https://qiita-image-store.s3.amazonaws.com/0/119378/9531ec95-2423-055a-a110-08f209fdad19.jpeg)

## 最後の確認（試しにクエリを投げてみる）
・左ペインから「Run SQL」をクリックして、SQLを書いて（簡単なselect countにしてみた）、Runで実行！
・結果が下に出力されることを確認。できあがり〜。
![WS000011.JPG](https://qiita-image-store.s3.amazonaws.com/0/119378/5ce898b3-de6a-a43f-db61-d22e108b68af.jpeg)
FixnumとBignumとRubinius

Ruby向けのC拡張を書いている過程で、Rubiniusのバグらしきものを発見してしまいました。

# FixnumとBignum

Rubyの整数は、メモリの続く限り大きな値を入れられるようになっています。ただ、整数演算が遅ければ言語としての使い勝手を大きく損なう事にもなります。

ということで、Rubyでは整数全般は`Integer`という抽象クラスとして、実装は2つのクラスに分けています。

`Fixnum`は速度を重視した、小さな整数についての型です。[以前に触れましたが](http://qiita.com/jkr_2255/items/ebd7e2e1d24bad0c6a20#%E5%A5%87%E6%95%B0%E3%81%A8%E5%81%B6%E6%95%B0)、Ruby内部では実際にオブジェクトを用意せず、`object_id`と簡単に変換できるようになっています。Fixnumだと識別するためのビットが1ビット必要なので、32ビット環境では31ビット整数、64ビット環境では63ビット整数となっています[^1]。

`Fixnum`に入り切らないサイズの整数は`Bignum`になります。内部的には多倍長整数と言って、値を細かく分けて保存しているのですが、メソッドなどは`Fixnum`と共通なので、（速度が落ちることを除けば）Ruby上からは特に違いなく使えます。

ということで、Ruby上からは、よほどパフォーマンスにこだわるような場面を除いて、基本的に`Fixnum`と`Bignum`を識別する必要はまず生じません。

一方、C言語からRubyの拡張ライブラリを書く場合、`Fixnum`はそのまま計算できるのに対して、`Bignum`は関数やメソッド経由で使うことになるなど、まったくの別物となります。正しくハンドリングしなければ、うまく動きません。

# Rubiniusで起きたこと

作成中のGemのテストをCRuby、JRuby、Rubiniusで行っていたところ、妙な現象が生じました。

Cライブラリに突入する関係上、`Fixnum`と`Bignum`の違いが出てくる場面だったので、両者の境界値をテストケースに入れてテストを回していました。

すると、Rubiniusだけエラーで止まってしまいました。調べてみると、

0. `-0x4000_0000_0000_0000`という、本来なら`Fixnum`となるはずの整数リテラルが`Bignum`となっていた
1. 負の数にビット反転をかけると、`0x3fff_ffff_ffff_ffff`となり、こちらは`Fixnum`になっていた
2. `Bignum`の符号反転が`Fixnum`になるという想定外の事態となり、`TypeError`で死亡

という流れでした。C言語レベルの世界なら別として、Ruby側に「`Fixnum`の範囲内に収まる`Bignum`」が出現しているのはよろしくないので、[Rubinius側にIssueを立てています](https://github.com/rubinius/rubinius/issues/3636)。

[^1]: Windowsでは（x64でも）`long`が32ビットなので、Fixnumは31ビットしかありません。
CakePHPで複数のHABTMをまとめて検索したい

何故か「これだ！」という記事が全く見当たらないので書く。

UserはHobbyとSchoolにHABTMを持っているとする。

```php
class User{
	$hasAndBelongsToMany = ['Hobby', 'School'];
}

class UserHobby{
	public $belongTo = ['User', 'Hobby'];
}

class Hobby{}

class UserSchool{
	public $belongTo = ['User', 'School'];
}

class School{}
```

「Hobby2という趣味を持ってるユーザを検索する」

```php
$this->User->UserHobby->find('all', ['conditions'=>['Hobby.id'=>'2']]);
```

「School3を卒業したユーザを検索する」

```php
$this->User->UserSchool->find('all', ['conditions'=>['School.id'=>'3']]);
```

ここまではいい、何処にでも書いてある。

ところが、これをまとめて「Hobby2という趣味を持っていて、なおかつSchool3を卒業したユーザを検索する」とすると途端に情報が全く無くなるのだ。

そもそもユーザテーブルからHABTMテーブルを参照しようとする時点でUnknown columnとなる。

```php
$this->User->find('all', ['conditions'=>['UserHobby.hobby_id'=>'2']]); // NG
$this->User->find('all', ['conditions'=>['School.id'=>'3']]); // NG
```

実際発行されたSQLを見るとわかるが、HABTMテーブルは特にJOINされているわけではなく、まずUserテーブルを取得した後で個別にSQLを発行して参照していたりする。
これを$hasAndBelongsToManyでどうにかJOINにできないかと調べてみたのだが、どうもそういうことはできないらしい。
http://book.cakephp.org/2.0/ja/models/associations-linking-models-together.html#joining-tables
結局HABTMを使わずに自力でJOINすることに。

```php
$options = [
	'conditions' => ['Hobby.id'=>'2', 'School.id'=>'3'], // WHERE
	'joins' => [
		[
			'table'=>'user_hobby',
			'alias'=>'UserHobby',
			'type' => 'INNER',
			'conditions' => [ 'User.id = UserHobby.user_id'], // JOINのON
		],
		[
			'table'=>'user_school',
			'alias'=>'UserSchool',
			'type' => 'INNER',
			'conditions' => [ 'User.id = UserSchool.user_id'],
		]
	]
];
$this->User->recursive = -1;
$this->User->find('all', $options);
```

できた。

え、なんでモデルに書いた情報使ってくれないの？？
せめて'joins'=>['UserHobby', 'UserSchool']とかでやってくれないですかね。
ちなみに上記例では検索条件をWHERE句に書いていますが、ONの中に入れても問題ないです。

なお、「Hobby2とHobby3という趣味を持ってるユーザを検索する」とかやろうとすると死ぬ模様。
Rails の ActiveRecord で SQL / Arel を使わずに以上・以下・より小さいの比較演算を実現する


Rails の ActiveRecord を使っていると SQL ベタ書きしたり、Arel で書いたりする状況になることがある。そんな中で比較演算のケースは解決策があるのでメモっとく。

実行結果は Rails 4.2.1 で SQLite をデータベースとして利用しているときのもの。

# 範囲（BETWEEN 演算子）

`where` に Range で指定することができるこの方法は有名。コードが綺麗になるし、Rails と SQL の間の違和感もない。

```rb
Person.where(age: 20..35)
```

生成される SQL はこうなる。

```sql
SELECT "people".* FROM "people" WHERE ("people"."age" BETWEEN 20 AND 35)
```

# 以上（>= 演算子）

前述の Range で以上（>= 演算子）を表現するとこうなる。（数学的には正しいけどさ……。って呆れて読むのをやめる前に生成される SQL も見てね。）

```rb
Person.where(age: 20..Float::INFINITY)
```

生成される SQL はこうなる。エラーにならずにきちんと >= 演算子を含む SQL が出力される。

```sql
SELECT "people".* FROM "people" WHERE ("people"."age" >= 20)
```

# 以下（<= 演算子）

同様に Range で以下（<= 演算子）を表現するとこうなる。

```rb
Person.where(age: -Float::INFINITY..20)
```

生成される SQL はこうなる。エラーにならずにきちんと <= 演算子を含む SQL が出力される。

```sql
SELECT "people".* FROM "people" WHERE ("people"."age" <= 20)
```

# より小さい（< 演算子）

同様に Range でより小さい（< 演算子）を表現するとこうなる。

```rb
Person.where(age: -Float::INFINITY...20)
```

生成される SQL はこうなる。エラーにならずにきちんと < 演算子を含む SQL が出力される。

```sql
SELECT "people".* FROM "people" WHERE ("people"."age" < 20)
```

# より大きい（> 演算子）

残念ながら Range でより大きい（> 演算子）は表現できない。

* * *

実用的かどうかは微妙なところだけど、数学的には真っ当な気がするから、見慣れたら便利かもしれない。まあトリビアとして知っておいてもいいんじゃないかな。いきなりプロジェクトで使うとチームのエンジニアからクレームが来るかもしれないので慎重にｗ

# 参考文献

http://stackoverflow.com/questions/23936224/rails-where-for-time-less-than-queries
angular2で再帰的に親directiveを辿る

angular2で再帰的に親directiveを辿りたいときってありますよね？そういうときは`@Optional`, `@Host`, `@SkipSelf`を使いましょう。

ネストしている数を表示する`FooDirective`を作りながら説明します。

```ts:app.ts
//our root app component
import {Component} from 'angular2/core'
import {FooDirective} from './foo'

@Component({
  selector: 'my-app',
  providers: [],
  template: `
    <div>
      <h2>Hello {{name}}</h2>
      <div foo #a="foo">
        {{a.nestCount}}
        <div foo #b="foo">
          {{b.nestCount}}
          <div foo #c="foo">{{c.nestCount}}</div>
        </div>
      </div>
    </div>
  `,
  directives: [FooDirective]
})
export class App {
  constructor() {
    this.name = 'Angular2'
  }
}
```

## とりあえず雛形を作ってみる

こんなかんじですか

```ts:foo.ts
import {
  Directive,
  Optional,
  Host,
  SkipSelf
} from 'angular2/core'


@Directive({
  selector: '[foo]',
  exportAs: 'foo'
})
export class FooDirective {
  // なんとかして親のFooDirectiveをinjectしたい
  constructor(private _parent: FooDirective) {}

  get nestCount() {
    return this._parent ? this._parent.nestCount + 1 : 0; 
  }
}
```

## `@Host`

`@Host`アノテーションをつけると、自分自身の要素からShadow DOM root間を辿って指定された型のdirectiveをinjectしてくれます。とりあえず`FooDirective`型のdirectiveを`_parent`にinjectしてみます。

```ts
export class FooDirective {
  constructor(@Host() private _parent: FooDirective) {}
  // ...
}
```

怒られました。自分自身の要素も含まれるので循環参照となります。

```
EXCEPTION: Cannot instantiate cyclic dependency! (FooDirective -> FooDirective)
```

## `@SkipSelf`

`@SkipSelf`アノテーションをつけると、自分自身の要素は除外して辿ってくれます。以下のように書き換えてみます。

```ts
export class FooDirective {
  constructor(@Host() @SkipSelf() private _parent: FooDirective) {}
  // ...
}
```

また怒られました。辿った結果directiveがないとエラーになります(つまり一番上の`FooDirective`ではエラー)。

```
EXCEPTION: No provider for FooDirective! (FooDirective -> FooDirective)
```

## `@Optional`

`@Optional`アノテーションをつけると、辿った結果directiveが存在しなければ`null`がinjectされます。コードを以下のように書き換えて完成です。http://plnkr.co/edit/9CwZnm?p=preview こんな感じで動いたでしょうか？


```
export class FooDirective {
  constructor(@Optional() @Host() @SkipSelf() private _parent: FooDirective) {}
  // ...
}
```

## 思ったこと

初めて見たときは気持ち悪い書き方だと思ったｗ

## 参考

* [DirectiveMetadata - ts](https://angular.io/docs/ts/latest/api/core/DirectiveMetadata-class.html)
* https://github.com/angular/angular/tree/master/modules/angular2/src/common/forms/directives
プロ野球速報を色々slackに流してみた

# プロ野球速報をslackに流してみた

## ホークススタメン速報を作って

[こんなこと](http://qiita.com/satthi/items/03bc3108716a75a3eb2a)をしたところ社内の一部から非常に好評でした！

![slack1_1.png](https://qiita-image-store.s3.amazonaws.com/0/54588/dd70a8a5-a5a8-8037-f9f9-4399774f766a.png)


・・・

![slack2_2.png](https://qiita-image-store.s3.amazonaws.com/0/54588/1639e510-4d5e-2f0c-7df1-8cc10bbebf0f.png)


あーん！？  
Y田なーに適当なこと言ってやがる！

## という訳で

それとなくモリモリで作った。

https://gist.github.com/satthi/8e7fd9fc0f7db5ded624030a1fd77adf

gist初めて使ったよ！

## 作ったもの
- その日の試合
- スタメン速報(全チーム)
- スコアが動いたタイミングで通知  
※1球速報はつらいし、イニング速報はうざいので
- 全試合終了後、順位表を表示



## 結果

![slack3.png](https://qiita-image-store.s3.amazonaws.com/0/54588/228cfe12-80e0-2adb-b403-786e1087e9c8.png)

![slack4.png](https://qiita-image-store.s3.amazonaws.com/0/54588/3cde3939-9b1b-1a6a-16ec-92afbf4ae540.png)

![slack5.png](https://qiita-image-store.s3.amazonaws.com/0/54588/f531139c-cde1-47d4-510a-c91d66220ce3.png)

![slack6.png](https://qiita-image-store.s3.amazonaws.com/0/54588/15f55ea5-76b2-14c5-4d03-824d953d51be.png)


## 技術的ななにか

とりあえずやってることは基本的には[これ](http://qiita.com/satthi/items/03bc3108716a75a3eb2a)の拡張  
関数化した際、~~データの引き渡しが面倒~~メンバ変数を使って、取得しやすくしました。  
~~手抜きのために頑張るの巻。~~  
初期化とか、static指定が必要とか地味苦戦しました。

あとは単純にやること増やしたんで、普通に時間かかったｗ

## まとめ

ひとまず、プロ野球速報シリーズはひと段落かなー  
あー楽しかった
GroovyとRubyのRangeの違い 

最近Rubyに入門していて、それまでよく使っていたGroovyと同じだったり違ったりしていろいろと新鮮です。その一環で、両者のRangeの違いをまとめてみます。
Groovyは2.4.3、Rubyは2.3.0で試しています。

# GroovyとRubyのRange
## 作り方
### 末尾を含むやつ

```rb:Ruby
range = 1..5
```

```groovy:Groovy
def range = 1..5
```
上記のコードはどちらも1から5までの範囲のRangeを生成します。

### 末尾を含まないやつ
終端に5を含まない場合は、

```rb:Ruby
range = 1...5
```

```groovy:Groovy
def range = 1..<5
```

と書きます。Groovyの書き方は、他の言語とかとも比較するとちょっと特殊かな？という感じですが、5が含まれない感が強く出ていて、個人的には好きです。

## アクセスの仕方
各々こんな感じ

```rb:Ruby
range = (1..5)
range.first #=> 1
range.min #=> 1
range.last #=> 5
range.max #=> 5
range.size #=> 5
range.include? 1 #=> true
```

```groovy:Groovy
def range = (1..5)
range.getFrom() // => 1
range.first() // => 1
range.getTo() // => 5
range.last() // => 5
range.size() // => 5
range.contains(1) // => true
```

## どちらもimmutable
どちらも、一度作ったRangeの中身を変更することはできません。

```rb:Ruby
range.first = 1 #=> NoMethodError
```

```groovy:Groovy
(1..5).set(3, 100) // => java.lang.UnsupportedOperationException
```

Rubyの場合はそもそもセットする系のメソッドが用意されていないのに対して、Groovyはメソッドは用意されている（Listを継承しているから）のですが、実際に値を変えようとするとExceptionを投げるようになっています。

## 繰り返し処理

RubyのRange：Enumerableをincludeしている
GroovyのRange：Groovyは`java.lang.Object`にeachを追加している

結果として、どちらも繰り返し処理ができます。
(Enumerableがeachを実装していないってのが興味深かったけど、この記事のテーマとはずれるので略)

## Rangeはどうやって隣の値を判別できるのか
「隣の値」を返すメソッドを呼んで、隣の値をたどっています。

### 次の値を呼び出す

Rubyの場合は`succ`もしくは`next`

```rb:Ruby
"a".succ #=> "b"
```

Groovyの場合は、`next()`

```groovy:Groovy
"a".next() // => "b"
```

### 前の値を呼び出す

Rubyの場合、標準APIには該当するものがない。
その理由は、`prev`といった前に戻るものには曖昧さが伴うから、らしい。
参考：http://stackoverflow.com/questions/16716522/what-is-the-opposite-of-string-next

Groovyの方は、`previous()`というメソッドを呼びます。

```groovy:Groovy
"b".previous() // => "a"
```

この帰結として、Groovyでは降順のRangeを作成することができます。

```groovy:Groovy
def range = (5..1) // => [5, 4, 3, 2, 1] 
```
近場のRubyistに聞いたところ、「逆順にしたいことある？　逆順にしたいならreverseしたらよくない？」と言ってました。

ちなみにこのnextあたりの処理は掘ってくといろいろ違いがあって面白かったです。

## 独自のクラスのRangeをつくれるようにする

それぞれやり方は下記の通り。基本思想は同じですね。

Ruby： <=>を実装する（eachを実行するにはsuccの実装も必要）
Groovy：　`Comparable`を実装する(昇順のRangeにしたいときは`next()`を、降順のRangeにしたいときは`previous()`を実装する必要がある)

# 感想
基本思想はお互い近いなーという感じ、細かいところにいろんな違いがあって面白いですね。関連してGroovyのRangeの細かい部分もいろいろわかりました。

# 参考にしたもの
* http://qiita.com/abey1192/items/661766fb728fd9b872e2
* http://docs.groovy-lang.org/latest/html/api/groovy/lang/Range.html
* http://docs.ruby-lang.org/ja/2.3.0/class/Range.html
* http://waman.hatenablog.com/entry/20100226/1267145610
* http://mrhaki.blogspot.jp/2009/09/groovy-goodness-keep-your-values-in.html
* http://qiita.com/tbpgr/items/f901f44df6632939eb08
Spring Boot解説第7回(開発環境編：application.propertiesについて)

こんにちは！
株式会社情創 技術開発局
三度の飯より焼肉が好きな@YAKINIKUです！
今回はapplication.propertiesについて解説します。

#application.propertiesとは
application.propertiesとはSpring Bootで用意されている
デフォルトの設定ではなく環境独自の設定を行うためのファイルです。
設定可能な項目は以下を参考にしてください。
https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html


#開発環境と本番環境
共通環境であるapplication.propertiesの他に
開発環境用と本番環境用のファイルを作成することができます。
今回は
application-dev.properties、application-prd.properties
という名前で作成します。

この２つを使うことで開発環境と本番環境でそれぞれ
違う設定を使用することができます。
application-dev.propertiesが開発環境用、
application-prd.propertiesが本番環境用のファイルとなります。

開発環境を使用する際には、
application.propertiesにて
spring.profiles.active=dev
本番環境の際は、
spring.profiles.active=prd
と記述する必要があります。

今回はdev、prdとしていますが。この部分は他の文字でも可能です。
ただしapplication.propertiesで、
spring.profiles.active=**prd**と記述して
この**prd**部分と、
ファイル名application-**prd**.properties
の**prd**部分とで連携しているため
この２つの記述を合わせる必要があります。

#開発環境(dev)
下記のように記述することで、キャッシュを無効化しておきます。
spring.messages.cache-seconds=0
spring.thymeleaf.cache=false
spring.velocity.cache = false

他にはSpring BootにあるActuatorの設定を編集します。
Actuatorは様々な情報がREST APIで提供されているので、
使いやすいのですが、
外部から情報を取得されてしまったりするので
そういったことが無いように下記のように設定します。
management.add-application-context-header=false
このように記述することで、ヘッダに付与される
情報を公開している箇所を無効化することができます。

#本番環境(prd)
本番環境では上記で説明した、actuatorを無効化するので、
endpoints.enabled=false
と記述します。

またキャッシュを有効にするので、
開発環境では無効にした下記を有効にします。
spring.messages.cache-seconds=-1
spring.thymeleaf.cache=true
spring.velocity.cache = true

主な記述の説明は以上になります。
その他にどのような設定が可能か知りたい方は、
一番最初に貼ったURLを参照ください。

最後まで読んでいただきありがとうございました。
それではみなさん、こんにちはこんばんはさようなら！
クリエイターなら入れておきたいオレオレアプリケーション

 


# クリエイターなら入れておきたいオレオレアプリケーション

自分がMACに入れている開発に便利なアプリケーションをメモ程度に書きます。
かなり便利な機能が多いと思うので、是非一度使ってみてください。


## Github

### Github >>> tig (Gitの拡張機能)

git使うならこいつはかなり便利！
Vim仕様でadd, commit 
が行単位でできる差分とかわかりやすい。

ただpushとpull requestとかは送れない。

### Github >>> hub (Gitの拡張機能)

cmdでプルリクエストが送れる

```
$ hub pull-request -i 19 -h ryunosukeOguri:19 -b development
```

## Slack
社内のチャットツールとして主に使っています。
カラフルなデザインで、使っていて心地いい。
絵文字やカスタマイズも出来るので文字だけだとどうしても鋭い言葉になってしまう内容も絵文字を使ってフランクに伝えられる。
クリエイターの友達のアカウント開設して情報交換やコミュニケーションにも使っています。

## Prott
プロトタイプの開発は現在なくてはならないものになってきています。
これを取り入れたことによってデザイナー陣がUXを考えるようになったり、動きがつけられるので相手に伝わりやすい。
プレゼン機能があるので開発前にクライアントに動きをつけて見せることができ、コミュニケーションがしやすい。

## Sketch
デザイナーでなくてもデザインをしているかのようにできるぐらい簡単で、とにかく　軽い！！！！！
iOSやAndroid, Materialデザインのテンプレが豊富なので、ワイヤーフレームの作成やUIの設計、遷移図の作成に使ってます。
プラグインが豊富で、Prottにcmd一つでアップロードまたは更新できるからスライスせずにProttを更新できる。
画面単位でアートボードを作成できるのでスマホなどのような画面が多いデザインやパーツごとに共通化して切り出せるので、作成しながらスタイルガイドも作れてしまう神がかかっているアプリケーション。

## Sequel Pro
無料でほぼphpmyadminと同じ機能だからかなり便利。
クエリ検索やエクスポート、データ操作とか当然のごとく便利

## YouTube
退屈なお仕事中にYouTubeで作業BGMを聞いてテンションあげる。

## Postman
API作成するなら使うべし！Web APIテストクライアントのアプリ。
APIがコールできるクライアントアプリは開発に必須！！
デザインがシンプルで見やすいし、一度コールを登録しておけばワンクリックでコールできるから楽です。