OmniAICreator/Qiita-1.07M huggingface dataset:
Windows - SublimeText のTerminalをCygwin+minttyにしたい

chereをインストール
`$ cyg-fast install chere`

SublimeTextの [基本設定]->[Package Settings]->[Terminal]->[Settings - User]を開き、以下のように設定
セパレーターは`￥`ではなく`/`です

```sublime-settings:Terminal.sublime-settings
{
    "terminal": "C:/cygwin64/bin/mintty.exe",
    "parameters": ["/bin/xhere", "/bin/bash",  "`%CWD%`"]
}

```

後は[Ctrl]+[Shift]+t で
ViewControllerの外にViewを作成する(Swift)

## ViewControllerからViewの記述を排除する

言葉にしづらいのだけれど、ViewControllerにViewをドンドン追加していくと、Controllerがでかくなってしまうので、各々Viewは個別に記述したいと思った。

例えば、FirstViewControllerにUIWebViewを4個追加したいと思った時(思わないけど)、4つ追加するとViewController大変なことになるじゃないですか。
だからそれぞれのViewをControllerの外に持ったらControllerスッキリしていいよねって思った。

iOSネイティブ開発はじめたばかりで???ってなりながらやってるし、アンチパターン踏んでいたら教えて欲しいし、もっといい方法あったら知りたいです。


## ViewController

画面サイズ決めて(frame1-4)、WebViewを1-4まで作って、表示する。

```

import UIKit

class FirstViewController: UIViewController{

    override func viewDidLoad() {
        super.viewDidLoad()

        let frame1 = CGRect(x: 0, y: 0, width: self.view.bounds.width / 2, height: self.view.bounds.height / 2)
        let frame2 = CGRect(x: self.view.bounds.width / 2, y: 0, width: self.view.bounds.width / 2, height: self.view.bounds.height / 2)
        let frame3 = CGRect(x: 0, y: self.view.bounds.height / 2, width: self.view.bounds.width / 2, height: self.view.bounds.height / 2)
        let frame4 = CGRect(x: self.view.bounds.width / 2, y: self.view.bounds.height / 2, width: self.view.bounds.width / 2, height: self.view.bounds.height / 2)


        let web1 = AppleWebView(frame:frame1)
        let web2 = AppleWebView(frame:frame2)
        let web3 = AppleWebView(frame:frame3)
        let web4 = AppleWebView(frame:frame4)


        self.view.addSubview(web1.createWebView())
        self.view.addSubview(web2.createWebView())
        self.view.addSubview(web3.createWebView())
        self.view.addSubview(web4.createWebView())
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
```

## AppleWebView

```
import UIKit

class AppleWebView: UIWebView,UIWebViewDelegate {

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.delegate = self
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    func createWebView() -> UIWebView{
        let url: NSURL = NSURL(string: "http://apple.com")!
        let request: NSURLRequest = NSURLRequest(URL: url)
        self.loadRequest(request)

        return self
    }

    func webViewDidFinishLoad(webView: UIWebView!) {
        println("webViewDidFinishLoad")
    }

    func webViewDidStartLoad(webView: UIWebView!) {
        println("webViewDidStartLoad")
    }
}
```

## 画面

StatusBarとかNavigationBarの高さ考慮してないからか、画面崩れてる。

![サイズ変更済みイメージ.png](https://qiita-image-store.s3.amazonaws.com/0/5678/4fa11304-6d62-01a0-76bd-e0977c4e4498.png)


「👿お前そのやり方はまずいよ…」とか、「😊もっといい方法ある」って場合は教えて下さい！
filterの使い方

Swiftの標準関数にfilterという指定した条件を満たす要素からなる新しい配列を返す関数があります。

`[1, 2, 3, 4, 5]`という配列から偶数の個数を求めるコードを書いていきます。

`for in`文を使ってカウントした場合です。

```swift:sample1.swift
var count = 0
for n in [1, 2, 3, 4, 5] {
  if n % 2 == 0 {
    count++
  }
}
println(count)
```

実行結果は`2`となります。偶数は2と4の2つなので実行結果は正しいことがわかります。

次に`filter`を使います。
ドキュメントを読むと、`func filter(includeElement: (T) -> Bool) -> [T]`とあります。
Tは型を示すので、今回の場合はIntとなります。返り値はBoolなので何かの処理をしてBoolを返せばいいことがわかります。今回は偶数のときにtrueを返すようにします。
このとおり書き換えると次のようになります。

```swift:sample2.swift
println([1, 2, 3, 4, 5].filter({(n:Int) -> Bool in return n % 2 == 0}).count)
```

1行になりました。実行結果は`2`となり、実行結果は正しいです。

コードを分解してみてみます。
`[1, 2, 3, 4, 5].filter({(i:Int) -> Bool in return i % 2 == 0})`
この実行結果は、`[2, 4]`となります。次に`.count`で配列の数を求めます。
従って実行結果は`2`となります。

第2引数の関数は引数を1つしか取らないため`$0`を使ってもっと短く書くことができます。

```swift:sample3.swift
println([1, 2, 3, 4, 5].filter { $0 % 2 == 0 }.count)
```

文字列の配列でも同様の処理ができます。

```swift:sample4.swift
println(["りんご", "みかん", "メロン", "バナナ"].filter { $0 != "メロン"}) // [りんご, みかん, バナナ]
```

最後に指定した値を削除する拡張(extension)を書いてみます。

```swift:sample5.swift
extension Array {
    mutating func remove<T : Equatable>(element: T) -> Array {
        return self.filter({$0 as? T != element})
    }
}
```

```swift:sample6.swift
var fruits:[String] = ["りんご", "みかん", "メロン", "バナナ"] as [String]
println(fruits.remove("メロン")) // [りんご, みかん, バナナ]

var num:[Int] = [1, 2, 3, 4, 5] as [Int]
println(num.remove(3)) // [1, 2, 4, 5]
```
git stash -uの挙動に注意

## 現象

* `git stash -u`とした時に特定のファイルが消滅
* `git stash pop`としても復元されない

## 状況

`git`管理下の以下の構造
<pre>
.
├── foo.txt
└── hoge
    └── bar.txt
</pre>

`.gitignore`の中身
<pre>
hoge/*
</pre>

この状態で一度コミット
<pre>
git add .
git commit -m 'first commit'
</pre>

## 操作

`foo.txt`を適当に編集して差分を発生させる。
上記の状態で`git stash -u`を実行すると
<pre>
.
└── foo.txt
</pre>
となり、`hoge`以下の`ignore`しているものまで消えてしまう。
しかも`git stash pop`しても復元されない。

## 一連のコマンド履歴

<pre>
git init
touch foo.txt
mkdir hoge
touch hoge/bar.txt
echo 'hoge/*' > .gitignore
git add .
git commit -m 'first commit'
echo 'diff text' > foo.txt
git stash -u
tree
git stash show
git stash pop
tree
</pre>

## 原因

恐らく`.gitignore`内の記述の問題かと思われる。
`.gitignore`を`hoge/*`ではなく`hoge/`に書き換えて、他の状態は同じで`git stash -u`をすると
`hoge`ディレクトリが消えずに残る。
バグなのか仕様なのか分からないが、git管理外のものがgitの操作で消えるという悲惨な目に合った。
みなさんも`.gitignore`と`git stash -u`には気をつけましょう。
password manager exからKeePassXへの移行

# 概要
windowsからubuntuへ移行するとき、password管理ソフトとして
password manager exというものを使っていたが、鍵の検索ができないため、
KeePassXに移行したのでそのメモ。

PasswordManagerExは、csvにエクスポートできるが、
KeePassXは、csvでのインポートに対応していない。

そのため、KeePassという、csvをインポートしKeePassXで使える形式にエクスポートできるソフトを使う。

KeePassそのままubuntuで使えばいいんじゃね？という意見はあると思うが
これはwindowsを前提にしており、ubuntuでも一応動くけれども日本語が文字化けしてしまう。(インポートcsvファイルをshift_jisからutf8に変換してもダメだった。)

よって、今回はPasswordManagerEx -> KeePass -> KeePassXという手順ですすめる。

# バージョン情報
一応書いておくが、特に気にしなくてもできそう

移行元は

OS:Windows7
Password Manager Ex: バージョン情報が載ってなかった。2000-2002って書いてあったから、まぁずっと止まってるのかな…。
KeePass: 2.28

移行先は

OS:Ubuntu14.10
KeePassX: 0.4.3

# password manager exからエクスポート
適当にp.csvとしてエクスポートする。

特に説明なし。
# (ポイント)KeePassにインポート
Windows環境にKeePass 2.xを適当にインストールして開いて、csvファイルを形式に従って編集し、インポートする。
形式とは、n列目をusernameフィールドとする・・といったこと。インポートするときに確認できる。

まずはcsvファイルの編集。

６列目移行は削除、もしくは移動する。
６列目移行で必要なデータは、５列目にまとめて入れてあげる。
同じバージョンだったら多分、Notesという項目としてインポートされることになる。

編集を終えたら保存し、
File -> Importで、Generic File Importerを選択する。

ここでcsvの列とインポートされる先(name, url, passwordなど)を確認できる。
1〜５列目は並びが一緒だったが念のために確認しておき、問題なければインポートする。

# Keepassから.kdbファイルへエクスポート
KeePass 2.xから、.kdbファイルへエクスポートする。

File -> Exportで、KeePass KDB(1.x)

を選択して、エクスポートする。

(1.x)を選択すること。KeePassX
[{本家のFAQ}]({http://www.keepassx.org/faq/#q_3})
にも書いてあったが、
2.xの形式はKeePassXに対応していない。

# KeePassXで.kdbファイルを開く
あとは、KeePassXで、エクスポートした.kdbファイルをubuntuに転送して、開くだけ。

KeePassXを起動後、「データベースを開く」で、.kdbファイルを指定すると良い。

# やってみた感想とか
上記手順を踏めば、手動でcsvを作成してもインポートできるかな。

xmlファイルを自分で作るのであれば、KeePassを経由する必要もないけれども。

あと、csvファイルがshift_jisのままKeePassにインポート・エクスポートしてKeePassXに入れると文字化けするかな？と思っていたがしなかった。
最初はそれが不安でutf8に変換してから入れたが、特に問題はなかった。あとでshiftjisのまま変換せずにやってみたけれども問題なかったので、
上記では変換するプロセスを除外している。
String クラスのメソッドを類似グループ分け

個人的なイメージです。
`String` クラスのメソッドの全てではありません。念のため。

追加: `*`/`+`/`concat`(`<<`)/`prepend`/`insert`
バイト指定追加: `setbyte`
末尾除去: `chomp`/`chomp!`/`chop`/`chop!`（!付きメソッドの返値注意）
端部空白除去: `strip`/`strip!`/`lstrip`/`lstrip!`/`rstrip`/`rstrip!`（!付きメソッドの返値注意）
削除: `clear`/`delete`/`delete!`
重複削除: `squeeze`/`squeeze!`
切り出し: `[]`(`slice`)/`slice!`/`byteslice`/`chr`
バイト指定切り出し: `getbyte`
数量: `size`(`length`)/`bytesize`/`empty?`
置き換え: `replace`/`tr`/`tr!`/`tr_s`/`tr_s!`/`sub`/`sub!`/`gsub`/`gsub!`/`scrub`/`scrub!`（!付きメソッドの返値注意）
フォーマット: `format`/`%`/`printf`/`center`/`ljust`/`rjust`
逆順: `reverse`/`reverse!`
大文字小文字: `capitalize`/`capitalize!`/`upcase`/`upcase!`/`downcase`/`downcase!`/`swapcase`/`swapcase!`
正規表現での評価: `match`
区分した配列: `split`/`partition`/`rpartition`
繰り返しマッチした配列: `scan`
配列へ変換: `split`/`bytes`/`chars`/`codepoints`/`lines`
Enumeratorに変換: `each_byte`/`each_char`/`each_codepoint`/`each_line`
数値へ変換: `to_i`/`to_f`/`to_c`/`to_r`/`oct`/`hex`
シンボルへ変換: `to_sym`(`intern`)
文字列: `to_s`(`to_str`)/`inspect`/`dump`
変換: `unpack`
暗号化: `crypt`
チェックサム: `sum`
比較: `==`(`===`)(`eql?`)/`=~`/`<=>`/`casecmp`
文字列評価: `include?`/`ascii_only?`/`start_with?`/`end_with?`
エンコード変更: `b`/`encode`/`encode!`/`force_encoding`/`unicode_normalize`/`unicode_normalize!`
エンコード情報: `encoding`/`unicode_normalized?`/`valid_encoding?`
文字コード: `ord`
次の文字列: `succ`(`next`)/`succ!`(`next!`)/`upto`
要素位置: `index`/`rindex`
数え上げ: `count`

参考：[class String](http://rurema.clear-code.com/2.2.0/class/String.html)

関連：

- [Ruby - Enumerable モジュールのメソッドを類似グループ分け - Qiita](http://qiita.com/riocampos/items/a0527e4e654a4021e0dc)
- [Ruby - Array クラスのメソッドを類似グループ分け - Qiita](http://qiita.com/riocampos/items/6fdc5ce90eda53e18228)
- [Ruby - Hash クラスのメソッドを類似グループ分け - Qiita](http://qiita.com/riocampos/items/46cf01b1753ef8a1d081)
仮想hostやリモートhostからのssh

# ログイン先のマシンからSSH!!!
備忘録的に書きます。

ログイン先からGitを利用する、さらに他の端末へSSHする際など、毎回鍵を作っていませんか？
**No more 鍵だらけの生活**

現在接続中の秘密鍵を利用する方法があります。
一般的なvagrant(仮想VM)での設定を例にしましょう

## 設定ファイル
```bash:~/.ssh/config
Host node1
  HostName 127.0.0.1
  User vagrant
  Port 2001
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/himinato/.ssh/mykey_rsa
  IdentitiesOnly yes
  LogLevel FATAL
  ForwardAgent yes # <- これな
```

**ForwardAgent**を設定する事により、接続先から現在接続している秘密鍵(この例ではmykey_rsa)を利用してssh接続をすることができます。

## ssh-agent
あまり詳しいことは分かりませんがSSHでは**ssh-agent**という認証鍵を管理してくれるやつがいたそうな。
そいつに**ssh-add**することによって鍵を管理してくれるからパスワード入力などを省略できるらしい。
もちろん設定ファイルからではなく、コマンドからでもいける

```bash
$ ssh-add .ssh/your-key
```

## まとめ
何がうれしいかというとローカルで使うssh鍵の公開鍵をgithubなどに登録しておけば、リモート接続先から不要な鍵の登録なく使える点だろう。

sshには今回紹介した**ForwardAgent**とは別に**port forward**機能もあり、それがAWSのRDSに接続する際に利用出来ることはまた別の話

便利なんで使ってみて。(最近AnsibleやCapistrano使いはじめて知りました)
古いバージョンのRasbianにrpi-updateが入ってなかった時

久しぶり(1年ぶり？)に起動したRaspberryPi(Rasbian,バージョン忘れました;;)で、
`sudo apt-get update`
`sudo apt-get upgrade`
`sudo rpi-update`
を実行したら、

rpi-updateなんてないよ
というエラーが発生したので、その時の対応メモ


1． wgetで取ってくる
`wget https://raw.githubusercontent.com/Hexxeh/rpi-update/master/rpi-update`

2． /usr/bin配下に移動
`mv ./rpi-update /usr/bin/rpi-update`

3． 実行権限を付与
`sudo chmod +x /usr/bin/rpi-update`

これで実行できた。
`sudo rpi-update`
Go用のGoogle製のGUIツールキットgxuiのインストール(Windows版)

## 注意

2015/10/28時点で、

> Unfortunately due to a shortage of hours in a day, GXUI is no longer maintained.
> If you're looking for a GUI library for your next Go project, [check out these alternatives](https://github.com/avelino/awesome-go#gui).

とあり、GXUIのメンテナンスは終了しました。
以下の記事は、残しますが別のライブラリに移るべきという状況です。


以下、本文です。

---

> GoogleがGo用の新しいGUIライブラリの[gxui](https://github.com/google/gxui) をリリースしました。
http://qiita.com/shibukawa/items/549bc3af2232099112ac

ということで、自分もWindowsで試してみました。
結論から言うと、3回目のトライのやり方で簡単にンストールすることが可能です。
go getのみでインストールできるので良いですね。

## 環境

Window8.1 64bit
go version go1.4.2 windows/amd64

## 最初のトライ

最初は、@shibukawa さんが書かれているMac用の手順を見つつインストールしましたが、それなりに面倒でした。
(当時は面倒だったという意味です)

http://sourceforge.net/projects/glew/files/glew/snapshots/ から glew-1.12.0-win32.zip をダウンロード。
Windows用はBuild済みのため、includeとbin以下のみ使います。


以下の順にgo get。
go-gl-legacyあたりからinclude pathの変更やLDFLAGSなどが必要でした。

    $ go get github.com/google/gxui
    $ go get code.google.com/p/freetype-go/freetype/truetype
    $ go get github.com/go-gl-legacy/gl
    $ go get github.com/go-gl/glfw/v3.1/glfw

とはいえ無事にインストールは完了し、gxuiのサンプルは動作しました。
(2回目のトライのが簡単なので詳細は割愛)


## 2回目のトライ

この記事を書くにあたり、再度手順の確認を実施しました。
今度は、単純にエラーメッセージに従ってのインストールをしてみました。
gxui/sample/polygon等をgo buildするにあたり、以下のエラーメッセージがでるので順番に対処します。

    $ go get github.com/google/gxui
    $ cd %GOPATH%\src\github.com\google\gxui\samples\polygon
    $ go build
    (ここで cannot find package "code.google.com/p/freetype-go/freetype/raster" が出力される)
    $ go get code.google.com/p/freetype-go/freetype/raster

    $ go build
    (ここで ～～略～～が出力される)
    $ go get github.com/go-gl/gl/v3.2-core/gl

    $ go build
    (ここで ～～略～～が出力される)
    $ go get github.com/go-gl/glfw/v3.1/glfw

    $ go build
    (build成功)

C言語まったくわからなくても大丈夫ですね。
実行は以下のようにします。
実行には、[SourceCodePro-Regular.ttf](https://github.com/drusellers/nixtools/blob/master/fonts/SourceCodePro_FontsOnly-1.009/SourceCodePro-Regular.ttf)が必要なので、適宜DLしておきます。

    $ dir
    2015/03/18  22:32             2,609 main.go
    2015/03/18  22:36        10,180,096 polygon.exe
    2015/03/18  22:23           103,820 SourceCodePro-Regular.ttf

    $ polygon.exe -data=.

10MB超とそれなりに大きいですが、単体で動くのでいい感じです。

progress_barのサンプルは以下のイメージ。

![gxui_progress_bar.png](https://qiita-image-store.s3.amazonaws.com/0/63649/2de8bf87-fc43-3fd7-de28-dce756504bf1.png)

## 3回目のトライ

2015/06/16に追加しています。

Win8.1 64bit + go1.4.2 windows/amd64 + gcc 4.8.3 64bit (strawberry perl 5.20.2 64bitに付属)という環境で現時点のインストール方法は以下になります。
試したコマンドは以下で、ある程度環境変数PATHを絞った内容としています。
gccは、c:\strawberry\c\bin以下にあるものを使っています。

```
$ set GOPATH=c:\new_dir_for_test
$ set PATH=%GOPATH%\bin;%GOROOT%\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\Program Files (x86)\Git\cmd;C:\Program Files\Mercurial;c:\Strawberry\c\bin
$ go get -u github.com/google/gxui/...
```

とても簡単にインストールすることができました。
以下は、file_dlg.exeのDemoとなります。

![file_dlg.png](https://qiita-image-store.s3.amazonaws.com/0/63649/4d1abb1d-1bd8-8777-14ae-a8bd3a99a76a.png)


## 最後に

まだサンプルをBuildしただけなのでよくわかっていませんが、インストールは簡単だ、というのはわかりました。
Google Analytics Real Time Reporting API 事始め

カスタムダッシュボードつくるのに便利なんじゃないかと思って調べてる。

## Google Analytics Real Time Reporting APIとは何か

[What Is The Real Time Reporting API - Overview - Google Analytics — Google Developers](https://developers.google.com/analytics/devguides/reporting/realtime/v3/)

> You can use the Real Time Reporting API to:
> 
> * Display active viewers of a page and create a sense of urgency for users that are looking at an item with finite inventory.
> * Display the most popular content such as the top 10 active pages.
> * Create and display a real time dashboard.

要は、いままさに訪問中のアクティブユーザや、いままさに多くのユーザが訪れているページの上位10件などをとれて、リアルタムデータを表示するダッシュボードを作るものらしい。

これを使うと下記のようなGAの「Real-Time -> Summary」のようなダッシュボードを作れるのかなと。ただGA embed APIみたいになviewはなくてデータを取ってくるだけなので、viewは自分で作らなきゃいけないようだ。

![image](https://qiita-image-store.s3.amazonaws.com/0/207/c0e2907a-ab35-4b39-de37-c475b1352c59.png)

## 注意点

注意点として、2015年3月現在private βであって、使うために申請が必要だということが一つ。

もう一つ、あとはこれはあくまでも「データをリアルタイムに取得するもの」であって、listenしたらどんどんAPIからデータをpushしてくれる、ストリーミングAPI的なものではないということ。「limitに達するようならポーリングの間隔をあけるかサーバーサイドでキャッシュしてくれよナ」てな警告がかいてある。

## APIの調べ方

Google API documentは慣れるまでがとにかくつらい。これの場合、APIは一つだけらしい。

[`GET https://www.googleapis.com/analytics/v3/data/realtime`](https://developers.google.com/analytics/devguides/reporting/realtime/v3/reference/data/realtime/get)

API docの下部に実際にリクエストを発行できるところがあって、そこで得られるのはこんなデータ：

```js
{
 "kind": "analytics#realtimeData",
 "id": "https://www.googleapis.com/analytics/v3/data/realtime?ids=ga:XXXX&metrics=rt:activeUsers",
 "query": {
  "ids": "ga:XXXX",
  "metrics": [
   "rt:activeUsers"
  ],
  "max-results": 1000
 },
 "totalResults": 1,
 "selfLink": "https://www.googleapis.com/analytics/v3/data/realtime?ids=ga:XXXX&metrics=rt:activeUsers",
 "profileInfo": "**MASKED**",
 "columnHeaders": [
  {
   "name": "rt:activeUsers",
   "columnType": "METRIC",
   "dataType": "INTEGER"
  }
 ],
 "totalsForAllResults": {
  "rt:activeUsers": "3"
 },
 "rows": [
  [
   "3"
  ]
 ]
}
```

このデータ構造の意味は[Real Time Data - Google Analytics — Google Developers](https://developers.google.com/analytics/devguides/reporting/realtime/v3/reference/data/realtime#resource) にある。

# JavaScript Interface

で、これをJSから利用するのはどうしたらいいかなと思ってサンプルコードを探した。

* [googleanalytics/ga-dev-tools](https://github.com/googleanalytics/ga-dev-tools)

コードを見るに、これのデモサイトの [Third Party Visualizations](https://ga-dev-tools.appspot.com/embed-api/third-party-visualizations/) にある「Active User」が /data/realtime を使っているようだ。

![image](https://qiita-image-store.s3.amazonaws.com/0/207/357ddfff-1206-bc5c-026b-4a7353713bbb.png)

ファイルでいうとこれかな。

* [ga-dev-tools/active-users.js at master · googleanalytics/ga-dev-tools](https://github.com/googleanalytics/ga-dev-tools/blob/master/assets%2Fjavascript%2Fembed-api%2Factive-users.js)

なかなかよさそうだ。
Project Euler 45

問題
---
三角数, 五角数, 六角数は以下のように生成される.

三角数	Tn=n(n+1)/2	1, 3, 6, 10, 15, ...
五角数	Pn=n(3n-1)/2	1, 5, 12, 22, 35, ...
六角数	Hn=n(2n-1)	1, 6, 15, 28, 45, ...
T285 = P165 = H143 = 40755であることが分かる.

次の三角数かつ五角数かつ六角数な数を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2045

回答方針
---
六角数の各項は三角数の奇数項なのだけど、このような事実は無視して、とりあえず簡単にすべての項が等しくなるような仕組みを考えてみた。
1. 各角数のジェネレータgeneと値valueとを一組にしてリストang_list化する。
2. 各値valueが等しくなるまで、値の最大値ang_maxよりも小さい値valueをジェネレータで更新する。valueを更新したときは、flagをFalseにする。
3. 各角数の全てで値valueの更新がなければ、各角数の値valueが最大値ang_maxと等しい、つまり、全ての角数の値が等しいということなので、終了する。

コード
---

```py
from mytools import *


def t(n):
  return n*(n+1)/2

def p(n):
  return n*(3*n-1)/2

def h(n):
  return n*(2*n-1)

@get_time
@main_start
def main():
  #(TRI_START,PEN_START,HEX_START) = (2, 2, 2) 
  (TRI_START,PEN_START,HEX_START) = (286, 166, 144) 
  MAX = 10**8

  tri_gene = ( t(n) for n in xrange(TRI_START, MAX))
  pen_gene = ( p(n) for n in xrange(PEN_START, MAX))
  hex_gene = ( h(n) for n in xrange(HEX_START, MAX))
  ang_list = [
              {'value': tri_gene.next(), 'gene': tri_gene},
              {'value': pen_gene.next(), 'gene': pen_gene},
              {'value': hex_gene.next(), 'gene': hex_gene}
             ]

  ang_max = max(ang_list[0]['value'], ang_list[1]['value'], ang_list[2]['value']) 
  flag = False  
  while not flag:
    flag = True
    for ang in ang_list:
      if ang['value'] < ang_max:
         ang['value'] = ang['gene'].next()
         flag = False
         if ang['value'] > ang_max:
           ang_max = ang['value']
  print ang_max

main()
```
GitLabをサブディレクトリで運用する(omnibus 7.8.1) ※2016/04/05 追記あり

# 追記(2016/04/05)

GitLab 8.5 にて、experimentalではありますが、標準でサブディレクトリ運用できるような機能追加がされました。
以下のURIに実装方法が書いてあるので、基本的にはこちらをご利用ください。

http://doc.gitlab.com/omnibus/settings/configuration.html#configuring-a-relative-url-for-gitlab

当時の参考資料として、以下の記事は残しておきますが、古い資料であることをご了承ください。

# ここから元記事

ほぼ下の記事通りなのですが、このままだとunicornがエラーを吐き続けて502 GitLab is not respondingを吐くので、改めて纏めておきます。

[GitLab omnibus をサブディレクトリで運用する](http://qiita.com/tnamao/items/a7bb1ca868b594eaf788)
## 作業環境
- CentOS release 6.5 (Final)
- GitLab 7.8.1
- http://example.com/gitlab で運用を目的とする

## 作業
行数はあくまで参考です。

- /opt/gitlab/embedded/cookbooks/gitlab/templates/default/gitlab.yml.erb の24行目

```
    # relative_url_root: /gitlab
```

  を

```
     relative_url_root: /gitlab
```
に変更

- /opt/gitlab/embedded/cookbooks/gitlab/templates/default/unicorn.rb.erb
ファイルの一番最後の行に以下を追加

```
ENV['RAILS_RELATIVE_URL_ROOT'] = '/gitlab'
```
上記記事ではダブルクォート(")ですが、現在の環境ではシングルクォート(')でないとunicornがエラーを出力するので気をつけます。

- /opt/gitlab/embedded/cookbooks/gitlab/templates/default/gitlab-shell-config.yml.erb の9行目

```
gitlab_url: "<%= @api_url %>"
```
を

```
gitlab_url: "http://127.0.0.1:8080/gitlab"
```
に変更

unicornが動作するURLを指定します。デフォルトだと127.0.0.1:8080で動作するので、サブディレクトリの場合はそのように修正してください。  

- /opt/gitlab/embedded/cookbooks/gitlab/templates/default/nginx-gitlab-http.conf.erb の84行目

```
  location / {
    ## Serve static files from defined root folder.
    ## @gitlab is a named location for the upstream fallback, see below.
    try_files $uri $uri/index.html $uri.html @gitlab;
  }
```
を

```
  location /gitlab {
    ## Serve static files from defined root folder.
    ## @gitlab is a named location for the upstream fallback, see below.
    alias /opt/gitlab/embedded/service/gitlab-rails/public;
    try_files $uri $uri/index.html $uri.html @gitlab;
  }
```
に変更

## 結果
この状態で ```sudo gitlab-ctl reconfigure``` することで、 http://example.com/gitlab にてGitLabを運用出来ます。
もし何らかの仕様変更があったとしても、テンプレートを編集しているのでreconfigureしても問題ないです。
## おまけ
GitLabは最初のreconfigure後に初期化処理を挟んでいるようなのですが、マシンスペックによってはこれにかなり時間がかかります。
別に時間がかかっても真面に動くなら良いのですが、unicornがタイムアウトを出力してしまいタイムアウトになり続ける可能性があるので、タイムアウトと判定される時間を修正しておく事をお勧めします。

- /etc/gitlab/gitlab.rb の223行目

```
# unicorn['worker_timeout'] = 60
```
を

```
unicorn['worker_timeout'] = 180
```
に変更  
もしコメントアウトするような記載が無い場合は追記するだけで構いません。
180秒というのは自分の体験からなので、適宜修正してください。
Mac OS X 10.9.5 上でNokogiriのインストールに失敗した話


InfratasterをMac OS X上にインストールしようとして依存してるnokogiriのインストールに失敗しまくったので、まずはnokogiri単体でインストールできる手段を調査.

ライブラリ足りない感じに見えたので以下を試す。

```
$ brew install libxml2 libxslt libiconv     
$ brew link --force libxml2           
$ brew link --force libxslt            
```

駄目だった。

以下も試したけど駄目だった。

```
$brew unlink gcc-4.2      # you might not need this step
$gem uninstall nokogiri
$xcode-select --install
$gem install nokogiri
```

http://www.nokogiri.org/tutorials/installing_nokogiri.html


これも駄目だった。

```
$brew unlink libxml2
$brew unlink libxslt
$brew unlink libiconv
$sudo xcode-select --install
$gem install nokogiri
```

https://github.com/sparklemotion/nokogiri/issues/1166#issuecomment-57040359

最終的に[githubのコメント](https://github.com/sparklemotion/nokogiri/issues/1166#issuecomment-57593142)を参考に以下でいけたけど、最終的に必要だった作業が不明。ここで書いてない事もやったかも。

```
$sudo gem install nokogiri -- --use-system-libraries --with-xml2-include=/usr/include/libxml2 --with-xml2-lib=/usr/lib/
```

上記でいけたので、以下の設定をしてbundle installで無事infratasterのインストールに成功.

```
$bundle config build.nokogiri '--use-system-libraries --with-xml2-include=/usr/include/libxml2 --with-xml2-lib=/usr/lib/'
$bundle install --path vendor/bundle
```
Selenium WebDriver、Firefox を使ってPDFを自動ダウンロード

Selenium WebDriver、Firefoxを使ってWebページを自動で遷移して、PDFをダウンロードするっていうのを作りたかったんですが、実現できるまでに大変だったので設定方法を備忘録として書いておきます。

基本的にこのブログに全て書いてあるとおりです。
http://yizeng.me/2014/05/23/download-pdf-files-automatically-in-firefox-using-selenium-webdriver/


```` sample.rb
profile = Selenium::WebDriver::Firefox::Profile.new

profile["browser.download.folderList"] = 2
# 0:デスクトップ、1: システム規定のフォルダ、2:ユーザ定義フォルダ（"browser.download.dir"で定義） 

profile["browser.download.dir"] = 'C:\\'
# "browser.download.folderList"で2を指定した場合に保存されるフォルダ

profile["browser.helperApps.neverAsk.saveToDisk"] = 'application/pdf'

profile["pdfjs.disabled"] = true
# Firefoxがブラウザ内でPDFを開きにいこうとするので、それを無効化するのに必要

profile["plugin.scan.plid.all"] = false
profile["plugin.scan.Acrobat"] = "99.0"
# サードパーティのPDFソフトがPDFを開きにいってしまうので、それを無効化するのに必要
````

元記事の方に感謝。
Excelの場合は、上３の設定で問題なくダウンロードできていたけど、PDFをうまくダウンロードできなかった。
※Excelの場合は、'application/vnd.ms-excel"
PDFの場合は、下３つの設定が追加で必要なようです。
dplyr でグループごとに複数カラムを追加したい #rstatsj

dplyr でグループごとの quantile をカラムに追加したくなったんですが、複数カラムを追加する方法がよくわかりませんでした。

例えば、`iris` データに対して、`Species` ごとの `Sepal.Length` の `quantile` が知りたかったとします。

それはこのようにすれば一応は結果が見れるんですが、

```r:R
iris %>% group_by(Species) %>% 
  summarize(sepal_length_quantile = quantile(Sepal.Length) %>% list %>% as.character)
```

```:結果
     Species        sepal_length_quantile
1     setosa     c(4.3, 4.8, 5, 5.2, 5.8)
2 versicolor     c(4.9, 5.6, 5.9, 6.3, 7)
3  virginica c(4.9, 6.225, 6.5, 6.9, 7.9)
```

やはりこの `sepal_length_quantile` を複数列に分けて見たいですよね。

色々やり方を試してみて、下記に落ち着きました。

```r:R
iris %>% group_by(Species) %>% 
  summarize(sepal_length_quantile = quantile(Sepal.Length) %>% list) %>%
  cbind(do.call(rbind, .$sepal_length_quantile)) %>%
  select(-sepal_length_quantile)
```

```:結果
     Species  0%   25% 50% 75% 100%
1     setosa 4.3 4.800 5.0 5.2  5.8
2 versicolor 4.9 5.600 5.9 6.3  7.0
3  virginica 4.9 6.225 6.5 6.9  7.9
```

一旦リストとして保存して、`do.call` で `matrix` を作り、`cbind` で結合するという方法です。

ちなみに、リストとして保存するところは `dplyr::do` を使った方が正式かもしれません。

```r:R
iris %>% group_by(Species) %>% 
  do(sepal_length_quantile = quantile(.$Sepal.Length)) %>%
  cbind(do.call(rbind, .$sepal_length_quantile)) %>%
  select(-sepal_length_quantile)
```

```:結果
     Species  0%   25% 50% 75% 100%
1     setosa 4.3 4.800 5.0 5.2  5.8
2 versicolor 4.9 5.600 5.9 6.3  7.0
3  virginica 4.9 6.225 6.5 6.9  7.9
```

enjoy!

## 追記

- [dplyrで複数カラムを追加したいと思ったときはpurrrでslice_rows+by_slice](http://notchained.hatenablog.com/entry/2016/04/11/231143)
- [dplyrでgroup_byした後にquantilesする関数](http://rpubs.com/kazutan/d_quant)
- [Optional parameter to control length of summarise](https://github.com/hadley/dplyr/issues/154)
- [dplyr でグループごとに複数カラムを追加したい](http://d.hatena.ne.jp/teramonagi/20160413/1460503995)
Project Euler 44

問題
---
五角数は `Pn = n(3n-1)/2` で生成される. 最初の10項は

```
1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...
```

である.

`P4 + P7 = 22 + 70 = 92 = P8` である. しかし差 `70 - 22 = 48` は五角数ではない.

五角数のペア Pj と Pk について, 差と和が五角数になるものを考える. 差を `D = |Pk - Pj|` と書く. 差 D の最小値を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2044

回答
---
第2n項までの5角数の数列を作成してから、第n項の5角数と第1項～第n項の5角数の和及び差がいずれも5角数か否かを判定した。
append属性等の参照に時間がかかるということであったので、あらかじめappend属性、add属性を変数に入れておいた。また、要素が所定の集合に含まれるか否かについては、setオブジェクトを参照することにより、速度向上を目指した。

結果として、最初に和と差が5角数となるような数は見つかったものの、それが最小であることは確かめることができなかった。

```py
def pe44():
  start, stop = 1, 10**8
  pen = ((n * ( 3*n - 1))//2 for n in xrange(start, stop))
  p_list, p_set = [], set([])
  ans = 10**10
  i = 0
  append = p_list.append
  add = p_set.add
  while 1:
    append(pen.next())
    append(pen.next())
    add(p_list[2*i])
    add(p_list[2*i+1])
    
    d = search(p_list[i],p_list[:i+1],p_set)
    if d:
      min_d = min(d)
      if min_d < ans:
        found_answer(min_d)
        ans = min_d
    if ans < p_list[i+1] - p_list[i]:
      break
    i+=1
  return ans

def found_answer(n):
  print n

#@debug
def search(p1,p_list,p_set):
  d = []
  for p2 in p_list:
    if (p1+p2 in p_set) and (p1-p2 in p_set):
    #if (p1+p2 in p_list) and (p1-p2 in p_list):
      d.append(p1-p2)
  return d

pe44()
```
Grunt で即席テンプレートエンジンが必要になったので、えいやっと作ってみた

jade とか ejs とかもいいんだけど、もっとシンプルにやりたいなっと思って。

![json-html.png](https://qiita-image-store.s3.amazonaws.com/0/20773/32621a65-b792-977e-b39a-b88e084e145d.png)
_json落としましたよ_

## HTMLテンプレート
プレースホルダー（:TAG）を設けて、こういうHTML作っておく。

```html:template.html
<!DOCTYPE HTML>
<html lang="ja">
<head>
    <title>:NAME</title>
</head>
<body>
    <p id=":ID">:TEXT</p>
</body>
</html>
```

## データとなる JSONを用意する
プレースホルダーの文字列をキーにしたオブジェクトをつくる。
このJSONの値が挿入されるという仕組み。
スプレッドシートとかから出力できるようにしておくと、さらに便利かもしれない。

```json:data.json
[
    {
        ":ID": 1,
        ":NAME": "name",
        ":TEXT": "text."
    },
    {
        ":ID": 2,
        ":NAME": "なまえ",
        ":TEXT": "テキスト。"
    }
]
```

## Grunt でプライベートタスクを定義する

で、Grunt 側にこんな感じのプライベートタスクを設定する。

```js:Gruntfile.js
grunt.registerTask('make-html', 'make html.', function ()
{
    var template = grunt.file.read('./src/template.html'),
        data = grunt.file.readJSON('./src/data.json'),
        item,
        key,
        reg,
        html;

    for (var i = 0, l = data.length; i < l; i++)
    {
        item = data[i];
        html = template;
        for (key in item)
        {
            reg = new RegExp(key, "ig");
            html = html.replace(reg, item[key]);
        }
        grunt.file.write('./dest/'+ i + '.html', html, {force: true});
    }
});
```
そんで grunt make-html とやるとHTMLファイルが生成される。
もちろん、HTMLじゃなくってもできる。

見てのとおり、JSONのキー名にマッチしたとこを置き換えるという、超シンプル機構。書き込みの機構はたぶんこの程度で必要十分な気がしました。

データをあれこれ操作できる自由度があるので、ここからアレンジすればいいのだと思います。

### サンプル一式
https://github.com/nenjiru/super-ultra-simple-template
部分的なチャット履歴を記録する hubot-rec の使い方

## 概要

チャット、手軽でいいけどフロー情報なのでどんどんログが流れていく。
特に大事な部分だけ抜粋してストック情報として残しておきたい場面もあると思う。
たとえば、

* イベントがあった特定の 1 日の twitter タイムラインを保存しておきたい
* IRC で特定の期間だけのログを保存しておきたい
* 重要なメンテナンスのはじまりから終わりまでのログを保存してチケットに添付しておきたい

みたいな感じ (個人的には一番最後)。
探してみたけど、ありそうでなかったので [tily/hubot-rec](https://github.com/tily/hubot-rec) という hubot スクリプトを作ってみた。
[adragomir/hubot-logger](https://github.com/adragomir/hubot-logger) というのが似ているけど、これは IRC の全ログを収集して保存するもののようなので少し用途が違うように思う。

## コマンド一覧

```
hubot rec start <title> - 記録スタート、タイトルの指定も可能
hubot rec cancel - スタートした記録のキャンセル
hubot rec stop - 記録ストップ
hubot rec title <title> - 今記録しているレコーディングのタイトルを変更
hubot rec status - 記録しているかどうかを表示
hubot rec list - 記録の一覧を表示
hubot rec delete <number> - 記録を消す
```

## 使い方の例

```
## 記録スタート
Hubot> Hubot rec start Some Chat History
Shell: started recording: Some Chat History at 2015/03/18 09:13:56 (room=Shell, duration=00:00:00, messages=0)

## 記録してるかどうか確認
Hubot> Hubot rec status
Shell: now recording: Some Chat History at 2015/03/18 09:13:56 (room=Shell, duration=00:00:04, messages=1)

## 記録キャンセル
Hubot> Hubot rec cancel
Shell: cancelled recording: Some Chat History at 2015/03/18 09:13:56 (room=Shell, duration=00:00:09, messages=2)

## また記録スタート
Hubot> Hubot rec start Other Chat History
Shell: started recording: Other Chat History at 2015/03/18 09:14:13 (room=Shell, duration=00:00:00, messages=0)

## 記録のタイトルを変更
Hubot> Hubot rec title Other Chat History for README
Shell: renamed Other Chat History to Other Chat History for README

## しばしご歓談
Hubot> this is message

Hubot> this is message again

Hubot> this is another one

## 記録ストップ
Hubot> Hubot rec stop
Shell: stopped recording: Other Chat History for README at 2015/03/18 09:14:13 (room=Shell, duration=00:01:09, messages=5)

## 記録したものの一覧
Hubot> Hubot rec list
Shell: [0] Other Chat History for README at 2015/03/18 09:14:13 (room=Shell, duration=00:01:09, messages=5)

## 記録したものを消す
Hubot> Hubot rec delete 0

## 一覧してみると空になっている
Hubot> Hubot rec list
Shell: (no recordings)
```

## イベント

`rec stop` で記録を停止したときに `recStopped` というイベントが発生するので、これを捕捉してメールを送るとか redmine のチケットにチャットログを添付するとかなんでもできるはず。

```
recStopped - {rec: <rec>, msg: <msg>}
```

イベント発生時には `rec` というプロパティで今録音したレコーディングに関する情報が取得できる。`rec` の中身はこんな感じ。

```
{
  room: <room>,
  title: <title>,
  startedAt: <timestamp>,
  stoppedAt: <timestamp>,
  messages: <list of msgs>
}
```

## ウェブ画面

ウェブ画面から記録されたチャットの履歴を確認できます (v0.0.3 から)。

```
/rec
/rec/:id
```

![](http://i.gyazo.com/c58bf80ce5bfec621b45e1db0b2588c6.png)

![](http://i.gyazo.com/a13e40243df42c8f525155671c3a3b29.png)

## その他

あまりテストしていない、かつアダプターもそれほど試していないので、環境によってはうまく動かないことがあるかもしれません。
Python 今日のワンコ

```py
import random
class Dog(object):
    _range = [1, 189]
    _base_url = 'http://www.robots.ox.ac.uk/~vgg/data/pets/data/images/{}_{}.jpg'
    dogs = ['shiba_inu','staffordshire_bull_terrier','shiba_inu','english_setter','great_pyrenees','leonberger','saint_bernard']
    @classmethod
    def today(cls):
        return cls._base_url.format(random.choice(cls.dogs), random.randint(*cls._range))

print Dog.today()
```

**Wandbox**
http://melpon.org/wandbox/permlink/wYVzLWuBSxpg0Fac

**Downlod**
http://www.robots.ox.ac.uk/~vgg/data/pets/

**Sample**
![alt](http://www.robots.ox.ac.uk/~vgg/data/pets/data/images/great_pyrenees_41.jpg)
![alt](http://www.robots.ox.ac.uk/~vgg/data/pets/data/images/saint_bernard_31.jpg)
![alt](http://www.robots.ox.ac.uk/~vgg/data/pets/data/images/staffordshire_bull_terrier_160.jpg)
フォームからPOSTされた値をstructにバインドできるbindformを書いた

GolangではJSONを構造体にそのままバインドできる[json.Unmarshal](http://golang.org/pkg/encoding/json/#Unmarshal)とかがあって、それなりに便利だ。同じようにフォームからPOSTされた値も構造体にバインドできるようにしたい。WAFのいくつかはこれを実現している。

- https://github.com/martini-contrib/binding
- http://www.gorillatoolkit.org/pkg/Schema

最近あまりWAFを使わずに`net/http`を使うことが多いし、リフレクションの勉強にもなりそうだったので、フォームからPOSTされた値をバインドできるライブラリをつくった。

- [harukasan/bindform - Github](https://github.com/harukasan/bindform)

## 使い方

リフレクションを使っているので、`json.Unmarshal`と同じ感覚で使用できる。

```go
type ContactForm struct {
  Name    string `form:"name"`
  Email   string `form:"email"`
  Message string `form:"message"`
}

func HandlePostContactForm(w http.ResponseWriter, r *http.Request) {
    form := &ContactForm{}

    err := bindform.BindPostForm(r, form)
    if err != nil {
        http.Error(w, "Bad Request", 400)
    }

  // Debug print
  // log.Println(form)

  // needs more validations ...
}
```

構造体にタグをつけておいて、`bindform.BindPostForm`、または`bindform.BindForm`を呼ぶだけである。jsonと同じ感覚で利用できて便利。

[martini-contrib/binding](https://github.com/martini-contrib/binding)と違ってバリデーションなどは実装していないので、バリデーションを行うには自分でやる必要がある。JSONであってもバリデーションが必要になるためここは割り切っている。

なお、作り終わった後に[mholt/binding](http://mholt.github.io/binding/)の存在に気づいた。リフレクション使ってなくて高速っぽい。
Mac に OpenBLAS 版の R をインストールする

Mac では、Homebrew を使うことで OpenBLAS 版の R を簡単にインストールできます。インストール手順は次の3ステップです。

1. homebrew/science を tap する
2. OpenBLAS をソースからインストールする
3. R をインストールする

## homebrew/science を tap する

OpenBLAS と R は homebrew/science tap に含まれるので、先にこの tap を導入する必要があります。

```shell-session
$ brew tap homebrew/science
```

## OpenBLAS をソースからインストールする

openblas パッケージは bottle 化されているようです。そのため普通に brew install すると自分の Mac に最適化できません。次のように `--build-from-source` オプションを指定して、ソースからビルドしましょう。

```shell-session
$ brew install openblas --build-from-source
```

## R をインストールする

```shell-session
$ brew install r --with-openblas
```

これだけです。簡単でしょう。

## 一応、確認する

```shell-session
$ otool -L /usr/local/opt/r/lib/libR.dylib | grep -e blas
        /usr/local/opt/openblas/lib/libopenblas_haswellp-r0.2.13.dylib (compatibility version 0.0.0, current version 0.0.0)
```

ちゃんと使われてますね。

## まとめ

Mac では OpenBLAS 版の R を簡単に導入できるので今すぐやろう。
プロダクトバックログアイテムに書くこと

## プロダクトバックログアイテム名

プロダクトバックログアイテム名は、ユーザ視点に立った名前にする。「〜できる」といった形式で書く。

> 例: 「複数のテストスクリプトを保存できる」

## プロダクトバックログアイテムの詳細

プロダクトバックログに追加するに至った具体的な「背景」を書く。背景は、一般的なことではなく、具体的なエピソードを書くようにする。

> 例:
> 背景: ひとつのページにログインフォームと新規登録フォームがあると、『「ログイン」ボタンをクリックする』というステップだけでは、両方のフォームのテストが実施できなかった。
Fx0買いました！Firefox OSでゲームアプリを動かしてみる！～（5）enchant.jsで作ったアプリをFx0で動かしてみる（余白の対応 3）～

# Fx0買いました！Firefox OSでゲームアプリを動かしてみる！ <br>　～（5）enchant.jsで作ったアプリをFx0で動かしてみる（余白の対応 3）～
ちょっと、間があいてしましいました。

しかし、今日は本当に暖かい一日でしたね。コートが要らないくらいでした。

それはさておき、、余白をどうにかしたい対応の続きです。

# 余白が広がる原因（つづき）
[前回](http://qiita.com/onaona/items/90e8f329711ccd2c1047)まででgetbananaの画面サイズの設定について確認しましたので、
今回は実際に余白を消す対応をして終わりたいと思います。（今回で最終回です。(´Д｀。)グスン）

[前回](http://qiita.com/onaona/items/90e8f329711ccd2c1047)までの調査を元に余白のできる理由をまとめます。

■ 余白が出来る理由 ■ 
1. main.jsにてゲームのベースサイズを 320 × 320に設定しており、それがcanvasに描画される
   ↓
2.enchant.jsにてwindow.innerWidth(360)に合わせて、canvasを1.125倍に拡大しを横縦360 × 360 にしている
  ↓
3.ところが、window.innerHeightは616なので、616 - 360 = 256px　となり、ここの領域が余白となる

# 余白を消す対応
前置きが長くなりました。それでは余白を消しましょう。

##### **ベースサイズの変更**
まずは、単純にベースサイズの縦を伸ばしてみます。
window.innerHeight(616) / window.innerWidth(360) × ベースサイズのwidth(320) = 547.55555... -> 547
こんな感じ

```js:enchant.js

enchant();

window.onload = function() {
    game = new Game(320, 547);

```
結果的に、見た目は変わりませんでした。。
でも、バナナが余白の部分まで表示されるています
それと余白部分をタップしても反応すしています。よってゲームとしての領域は広がったようです。
！![getbanana-change-heightsize-noeffect.gif](https://qiita-image-store.s3.amazonaws.com/0/70507/bc43238d-e94d-a2dd-95e3-3be0f3ca568d.gif)

##### **バックグラウンドサイズの変更**
次にmain.jsの24行目にバックグラウンドのサイズを設定しているところがあって、ここで320×320を設定していたので、
その縦のサイズも547に変更します。

```js:main.js

window.onload = function() {
        background = new Sprite(320, 547);  // 320x320 サイズの Sprite オブジェクトを生成 -> 縦を547に変更
```

やった！！余白だった部分に画像が設定されました。
元の画像が正方形のため、2つ繋がっているような画像になっていますが、enchant.jsが画像のサイズが足りないときは重ねるようなことをしているのかと思います。
！![getbanana-change-heightsize.gif](https://qiita-image-store.s3.amazonaws.com/0/70507/5f48a0de-80cf-dfcd-c1a0-45cf6ae1f5b3.gif)


縦長の画像を用意すると2つ繋がるようなことはないは思いますが、余白は消す目的は達成できたので、今回は終了とします。
ありがとうございました！！<(_ _*)> ｱﾘｶﾞﾄｫ

[（1）enchant.jsを使ってみる](http://qiita.com/onaona/items/6f30f5239ebd61391fe2)
[（2）enchant.jsで作ったアプリをFx0で動かしてみる](http://qiita.com/onaona/items/f75becbe1c5f0f301f3b)
[（3）enchant.jsで作ったアプリをFx0で動かしてみる（余白の対応1）](http://qiita.com/onaona/items/a325f0a5023a6388f104)
[（4）enchant.jsで作ったアプリをFx0で動かしてみる（余白の対応2）](http://qiita.com/onaona/items/90e8f329711ccd2c1047)


[PHASERを使ってゲームアプリを動かしてみた](http://qiita.com/onaona/items/ef113de5e1efdef74c93)
仮想IPを使用したzabbixのserver,agent間の通信確認で困ったときに

server <-> agent での通信確認に使用するzabbix_get
仮想IPを使用した際にzabbix_getが動作していないように見えたのでメモ
(知らなかっただけで正常に動いてた)

# 現象
仮想IPを使用した構成
WebGUIから見るとagent.pingの値を取得している
zabbix_getではagent.pingを取得出来ない(空欄が返ってくる)


# 設定
server側情報

```
IP設定：
eth0 172.16.0.1
eth0:0 192.168.0.1

zabbix_server.conf：
SourceIP=192.168.0.1
```

agent側設定

```
IP設定：
eth0 192.168.0.10

zabbix_agent.conf：
Server=192.168.0.1
ServerActive=192.168.0.1
```

後は基本的な設定をしていると想定


# 解決方法
```
# zabbix_get -s 192.168.0.10 -k agent.ping

> 空欄が返ってくる
　(送信元がeth0 172.16.0.1の為だと思う)

# zabbix_get -s 192.168.0.10 -k agent.ping --source-address 192.168.0.1
1

> WebGUIで見ている値と同じように取得出来た
　(zabbix_serverはSourceIPを指定しているから取得できていた)
```

# 反省点
そりゃそうだよなという内容
SourceIP指定するんだからzabbix_getにも同様のものがあると考えてればすぐわかったはず
というかDocument見ればすぐ解決しているような問題
さくらレンタルサーバーでs3cmdをcronで動かす時にはまったこと

# 結論

最初に結論を書くと、Pythonまでのパスをちゃんと通さないとs3cmdが動かない。

# 現象

適当にs3cmdでputするshellを作成する。

```bash:put.sh
#!/bin/bash

/path/to/s3cmd  --config=/path/to/.s3cfg put /path/to/file.txt s3://bucket_name/file.txt
```

sshから実行すると問題なく動く。

```bash
% bash /path/to/put.sh
```

定期実行させたかったので、さくらの管理画面にあるcron設定から実行コマンドを設定。

```bash:cron実行コマンド
cd /home/username/; /usr/local/bin/bash put.sh 1> /dev/null
```

s3にfile.txtがputされない。


# 原因

ssh接続時のPATHとcron実行時のPATHの値が違うせいで、s3cmd内で使用するPythonが見つからない。

## Pythonの場所

```bash
/usr/local/bin/python
```
## ssh接続時のPATH

```bash
/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/home/username/bin
```
## cron実行時のPATH

```bash
/usr/bin:/bin:/
```
/usr/local/binがない！


# 対策

実行したいshellの中でPythonのパス解決をしてあげる

```bash:put.sh
#!/bin/bash

PATH="$PATH":/usr/local/sbin:/usr/local/bin

/path/to/s3cmd  --config=/path/to/.s3cfg put /path/to/file.txt s3://bucket_name/file.txt
```
バックログアイテムに書いていいこと

1. Feature
2. Bugs
3. Technical Work
    * リファクタリング
    * 単体テスト
    * インフラの改善
4. Knowledge Acquisition
    * 技術書を読んで勉強する
    * JSのライブラリを調査する
    * 新しい技術を選定する
CoffeeScriptで配列の連結


配列で`a + b`はできないけど、`[a..., b...]`は可能で、読みやすいというメモです。(個人差あり)

## 普通の方法

```coffeescript
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9]
```

という配列があったとして、連結しようとすると

```coffeescript
d = a.concat b, c # [1, 2, 3, 4, 5, 6, 7, 8, 9]
```

となってしまい、若干のロジック感が気になっていました。

## splat演算子が使えるじゃないか

ところが、[CoffeeScript Cookbook](https://coffeescript-cookbook.github.io/chapters/arrays/concatenating-arrays)を眺めていて、

```conffeescript
d = [a..., b..., c...] # [1, 2, 3, 4, 5, 6, 7, 8, 9]
```

が可能なことに気づいたのでした。

ただし、書き出されるJavaScriptが、

```javascript
var d, slice = [].slice;

d = slice.call(a).concat(slice.call(b), slice.call(c));
```

のようになるので、本番に入れて良いのかなーという気はしないでもなし。


## gulpで使うと良さげ

gulpの設定ファイルとかだといい感じ。

```conffeescript
$ =
  js: ['./src/app.js', './src/lib/**/*.js']
  components: ['./src/components/*.html']

gulp.task 'watch', ->
  browserSync.init
  gulp.watch [$.js..., $.components...], ['browserify']
```
Windows rubygems error

windowsで下記のようなエラーが出ました。

```
$ gem install pry
ERROR: Could not find a valid gem 'pry' (>= 0), here is why:
Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://s3.amazonaws.com/production.s3.rubygems.org/latest_specs.4.8.gz)
```

これ、gemの特定のversionで起きるエラーらしいっす。
対処法は[SSL upgrades on rubygems.org and RubyInstaller versions](https://gist.github.com/luislavena/f064211759ee0f806c88)に載ってます。

1. [rubygems 2.2.3 Released](https://github.com/rubygems/rubygems/releases/tag/v2.2.3)からrubygems-update-2.2.3.gemをダウンロード
2. rubygems-update-2.2.3.gemを `E:\ruby\Ruby2.1.0\lib\ruby\2.1.0` の下に保存
3. その後で下記コードを打つ

```
C:\>gem install --local E:\ruby\Ruby2.1.0\lib\ruby\2.1.0\rubygems-update-2.2.3.gem
C:\>update_rubygems --no-ri --no-rdoc
C:\>gem uninstall rubygems-update -x # 削除
Removing update_rubygems
Successfully uninstalled rubygems-update-2.2.3
```

これで、無事解消。めでたしめでたし。
ウェブ開発者向け Google Chrome の拡張機能まとめ


ウェブ開発者寄りの Google Chrome の拡張機能まとめです。一部は誰が使っても便利な拡張機能だと思います。

## ユーティリティ
### Chrome リモート デスクトップ
https://chrome.google.com/webstore/detail/chrome-remote-desktop/gbchcmhmhahfdphkhkmpfmihenigjmpp

### 1Password: Password Manager and Secure Wallet
https://chrome.google.com/webstore/detail/1password-password-manage/aomjjhallfgjeglblehebfpbcfeobpgk

### Add Search Options
Googleの検索オプションに「3ヶ月以内」と「6ヶ月以内」を追加する
https://chrome.google.com/webstore/detail/add-search-options/kaifgnoibnjldmdkkfogenbfbfgcbiao

### OneTab
複数のタブを 1 つのページに纏める。
https://chrome.google.com/webstore/detail/onetab/chphlpgkkbolifaimnlloiipkdnihall

### RSS Subscription Extension
ワンクリックで RSS の登録ができるボタンをアドレスバーに追加
https://chrome.google.com/webstore/detail/rss-subscription-extensio/nlbjncdgjeocebhnmkbbbdekmmmcbfjd

### Save to Pocket
Chrome 向け Pocket 拡張機能 - 記事、ビデオなどを保存するベストな方法
https://chrome.google.com/webstore/detail/save-to-pocket/niloccemoadcdkdjlinkgdfekeahmflj

### Save to Facebook
Facebook には、投稿や動画、リンクの保存機能があり、この拡張機能は、現在表示しているページを Facebook に保存することができる
https://chrome.google.com/webstore/detail/save-to-facebook/jmfikkaogpplgnfjmbjdpalkhclendgd

### AddThis - Share & Bookmark
各 SNS へ現在見ているページを簡単にシェアできるようになる
https://chrome.google.com/webstore/detail/addthis-share-bookmark-ne/cgbogdmdefihhljhfeiklfiedefalcde

### 緊急地震速報 by Extension
https://chrome.google.com/webstore/detail/%E7%B7%8A%E6%80%A5%E5%9C%B0%E9%9C%87%E9%80%9F%E5%A0%B1-by-extension/pebgngldogenhmnokpncolbajkelhjba

### goo.gl URL Shortener
ttp://goo.gl/ のショートリンクの作成と QR コードの表示ができる
https://chrome.google.com/webstore/detail/googl-url-shortener/iblijlcdoidgdpfknkckljiocdbnlagk

## デペロッパー向け

### Full Page Screen Capture
ページ全体キャプチャーし、画像として保存することができる。履歴機能もある
https://chrome.google.com/webstore/detail/full-page-screen-capture/fdpohaocaechififmbbbbbknoalclacl

### BuiltWith Technology Profiler
サイトがどんな CMS や Web アプリケーション、ツールを使用しているのを調べることができる
https://chrome.google.com/webstore/detail/builtwith-technology-prof/dapjbgnjinbpoindlpdmhochffioedbn

### EditThisCookie
Cookieを追加、削除、編集、検索、保護、そしてブロックすることができる
https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg

### HTML5 Outliner
HTML5 のアウトラインをアドレスバーのアイコンをワンクリックすると確認できる
https://chrome.google.com/webstore/detail/html5-outliner/afoibpobokebhgfnknfndkgemglggomo

### JavaScript Errors Notifier
JavaScript エラーがアドレスバーで確認できる
https://chrome.google.com/webstore/detail/javascript-errors-notifie/jafmfknfnkoekkdocjiaipcnmkklaajd

### Page Ruler
ブラウザー上でサイズ / 位置を測れる
https://chrome.google.com/webstore/detail/page-ruler/jlpkojjdgbllmedoapgfodplfhcbnbpn

### YSlow
デベロッパーツールから YSlow の実行ができる
https://chrome.google.com/webstore/detail/yslow/ninejjcohidippngpapiilnmkgllmakh

### Sourcegraph for GitHub
Github でリポジトリを表示した際、左側にファイルのツリー構造が表示されたり、VS Code 風に表示することもできる
https://chrome.google.com/webstore/detail/sourcegraph-for-github/dgjhfomjieaadpoljlnidmbgkdffpack
atomicとzabbixのリポジトリで優先度をつける

# 説明
wmiクライアントをインストールするときに、追加したatomic.repoリポジトリは
zabbix.repoのリポジトリよりも優先度が高いようです。

これにより、zabbixインストール時に１時間程度時間がとられました。

当初導入したzabbix2.2.9がyum update時に2.4系に更新する恐れを解消する（したい）ため、備忘録としてのこします。

# やったこと

## yum-plugin-propertiesのインストール

```shell-session
# yum install yum-plugin-properties
```
## atomic, zabbixの優先度設定

/etc/yum.repos.d以下のatomic.repo, zabbix.repoを編集
atomicの優先度を低く、zabbixを高く設定する。

```atomic.repo

[atomic]

priority=10

[atomic-testing]

priority=10

```

```zabbix.repo
[zabbix]

priority=1

[zabbix-non-supoorted]

priority=1

```

# 参考リンク
http://easyramble.com/add-repositories-and-set-priorities.html
SCLAlertViewをキーボードの高さ文ずらす

初投稿です。
Swiftを学び始めてまだ間もないので間違ってることもあるかもしれません。間違いがあれば教えてもらえると幸いですm(_ _)m

#経緯
[iOSで気になるライブラリ Swift編](http://qiita.com/PGMY/items/cf2d34e335f03f821f72)で紹介されているのを見て導入したのですが、TextFieldをおいた時にキーボードでボタンが隠れてしまったので、キーボード表示時に重なったら上にずらす処理を書いてみました。

#SCLAlertViewとは
SCLAlertViewはFlatなデザインのAlertViewです。
詳しくは->https://github.com/vikmeup/SCLAlertView-Swift

#コード
SCLAlertView.swiftのinitに以下の文を挿入します。

```swift:SCLAlertView.swift
public class SCLAlertView: UIViewController {
    required override public init() {
        super.init()
        
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil);
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil);

    ...
    }
...
}
```
initでNSNotificationCenter.defaultCenter().addObserverを使うことでキーボードの表示時にkeyboardWillShowが、非表示時にkeyboardWillHideが呼ばれるようになります。あとはSCLAlertViewクラス内に関数の中身を書いてあげましょう。

```swift:SCLAlertView.swift
public class SCLAlertView: UIViewController {

    func keyboardWillShow(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            let viewBottom = UIScreen.mainScreen().bounds.size.height - (self.baseView.center.y + kWindowHeight/2)
            let hideHeight = keyboardSize.height - viewBottom + 10
            if  hideHeight > 0 {
                UIView.animateWithDuration(0.2, animations: {
                    self.baseView.center.y -= hideHeight
                })
            }
        }
    }
    func keyboardWillHide(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            if UIScreen.mainScreen().bounds.size.height/2 != self.baseView.center.y {
                UIView.animateWithDuration(0.2, animations: {
                    self.baseView.center.y = UIScreen.mainScreen().bounds.size.height/2
                })
            }
        }
    }

...
}

```

これでキーボードの高さに合わせてSCLAlertViewが移動するようになります。



#参考サイト
【iOS】LINE風チャットUIを実装〜メッセージ入力欄編〜(http://qiita.com/Kaiketch/items/1d0cc3f7bc3aa4d4161a)
SwiftでNSNotificationを利用してクラス間の処理を連携する(http://qiita.com/taka000826/items/2460869a01766fdd221a)
Move textfield when keyboard appears swift(http://stackoverflow.com/questions/25693130/move-textfield-when-keyboard-appears-swift)
Evothings Studio 〜 もうひとつのスマホアプリ開発環境

## ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png) 「Evothings Studio」って何？

![evothings_top.png](https://qiita-image-store.s3.amazonaws.com/0/36751/c7bbc13d-26a5-ff91-21db-1c11220779fc.png)

**Evothings Studio** は PhoneGap（Cordova）ベースのハイブリッドなスマホアプリ開発環境で、
　・PCソフトの **Evothings Workbench**
　・スマホアプリの **Evothings Client**
で構成されます。無料です。

**Evothings Workbench**でソースを書いて保存すると、自動的に**Evothings Client**（つまりはスマホ）でアプリが動き出します。Monacaの「WEBブラウザ＋スマホアプリ」という開発環境を使ったことがある人はイメージしやすいかなと思います。

一般的に、PhoneGapはスマホのネイティブ機能に弱いですが、そのあたりが強化されてるっぽいです。軽くさわってみただけなので深くは理解できてません。
あしからず。。。m(_ _)m

## ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png) ダウンロード

↓ここから。
http://evothings.com/download/

> ![evothings_dl.png](https://qiita-image-store.s3.amazonaws.com/0/36751/512e9759-6d06-100f-630c-59db15049b81.png)

PCソフトを上記ページからダウンロードし、スマホアプリはスマホ内でそれぞれのストアからダウンロードする感じです。

ハローワールド的なやつは、また、おいおい。。。m(_ _)m
（直感的に扱える感じで、サンプルソース動くとこまですぐでした）

(･o･ゞ いじょー。
[UNIX] コマンドラインからアスキー文字列を16進数に変換する

アスキー文字列を16進数(Hex)に変換します。


環境
=====

以下で確認取れました。

* OSX bash
* FreeBSD /bin/sh (ash)


実行サンプル
==============

```bash:コマンド(例)
string='HelloWorld!HappyHacking!UNIXPhilosophyBSDLinuxOSX'
```

```bash:コマンド
hex=$(for x in $(echo ${string} | grep -o '.');do printf "%2X" \"$x; done) \
  && echo $hex
```

```text:結果(例)
48656C6C6F576F726C642148617070794861636B696E6721554E49585068696C6F736F7068794253444C696E75784F5358
```

謝辞
========

塩原さん、竹迫さん、その他コメントいただいたみなさん
jQueryを標準APIに置き換える


jQuery追放作業用の備忘録です。

## NG:不明
### title取得
```js
$(el).attr('title');
```

↓

```js
el.title;
```

### outerWidth
```js
$(el).outerWidth();
```

↓

```js
el.offsetWidth
```

### outerHeight
```js
$(el).outerHeight();
```

↓

```js
el.offsetHeight
```

### style設定
```js
$(el).css('border-width', '20px');
```

↓

```js
el.style.borderWidth = '20px';
```

## NG:IE8
### 子供をeach
```js
$(el).chidlren().each(function(index, element){
  // do anything...
});
```

↓

```js
Array.prototype.forEach.call(el.children, function(element, index){
  // do anything...
});
```

### next
```js
$(el).next();
```

↓

```js
el.nextElementSibling
```

### prev
```js
$(el).prev();
```

↓

```js
el.previousElementSibling
```

## NG:IE9
### hasClass
```js
$(el).hasClass(className);
```

↓

```js
el.classList.contains(className);
```


## 参考リンク
[You Might Not Need jQuery](http://youmightnotneedjquery.com/)
Xcode がアップデートして Unity から自動で Build できなくなったら

この動画のとおり、設定すればいいよ。
https://www.youtube.com/watch?v=_3Ef_d2JvAE&t=40

`DVTPlugInCompatibilityUUIDs` ってのを `/Applications/Xcode.app/Contents/Info.plist` のなかからみつけてきて、それを `/Applications/Unity/Unity.app/Contents/PlaybackEngines/iOSSupport/Tools/OSX/Unity4XC.xcplugin/Contents/Info.plist` のてきとうなとこに追加。パッケージのに入るには右クリックで。