OmniAICreator/Qiita-1.07M huggingface dataset:
FuelPHP 勉強中２ oilでコントローラとアクションの作成

Oilコマンドでコントローラの作成する。

```shell-session
oil g controller index index
```

複数アクション作る場合は以下の通り。

```shell-session
oil g controller index index1 index2 index3
```

まぁ１つ作ったらコピーしちゃいそうだ・・・
BASIC認証あり Composerサーバと接続

社内でcomposerサーバを立ている場合は以下のようにすればアクセスできる。

        { "type": "composer", "url": "http://ユーザ名:パスワード@composerサーバ名" }

でもこれだといろいろと問題が起きそうなのでcomposer.jsonと同じフォルダにauth.jsonを配置するとユーザやパスワードのファイルがわけれる。

```json:auth.json
{
    "http-basic": {
        "repo.example1.org": {
            "username": "my-username1",
            "password": "my-secret-password1"
        },
        "repo.example2.org": {
            "username": "my-username2",
            "password": "my-secret-password2"
        }
    }
}
```
FuelPHP 勉強中１ インストールの仕方

+ インストール

適当にプロジェクト用のフォルダに移動してまずはoilコマンドを使用できるようにする。

```shell-session:
curl get.fuelphp.com/oil | sh
```

+ プロジェクト作成

oilコマンドを使用してプロジェクトを作成する。

```shell-session:
oil create <project_name>
```

+ 手動でインストールする場合

手動でやる場合はgitから直接落とす。

```shell-session:
git clone git://github.com/fuel/fuel.git .
./composer.phar self-update
./composer.phar update --prefer-dist

composer create-project fuel/fuel:dev-1.7/master --prefer-dist
```

+ アクセス権をつける

```shell-session:
cd <project_name>
oil refine install
```

+ 基礎メモ

名前は"_"=フォルダできられる。
つまりサブディレクトリ内のクラスは
app/classes/session/driver.php
だと
Session_Driver
となる。
今更、Atom導入

今更ながら、Atom導入しました。
理由としては、同僚達ともっと効率の上がるエディタは無いのか？って事で探し始めました。

個人的に、必須だと思っているのは、

- プロジェクト管理
- ファイルリストから右クリックでパスのコピー（またはFinderでの表示）が出来たら嬉しい
- emmetが導入できること
- 矩形選択がある、もしくは導入できる
- ソースフォーマットができる

こんな所でしょうか、これが満たせてるならエディタにはこだわらないつもりです。
といっても初期状態のAtomも上記は満たせていないので、パッケージを何個か入れました。

## project-manager
url : https://github.com/danielbrodin/atom-project-manager
名前の通り、プロジェクト管理のパッケージですね
プロジェクト切り替えたときに新規画面になるのがなんかアレ（変える設定あるのかね）

## synced-sidebar
url : https://github.com/peterdotjs/atom-synced-sidebar
開いているファイルと、サイトバーのファイルリストを同期させるパッケージ
実は、この機能がすごくありがたい。

## emmet
url : https://github.com/emmetio/emmet-atom
まぁ、言わなくてもわかるよね、皆大好きemmet大先生

## multi-cursor
url : https://github.com/joseramonc/multi-cursor
矩形選択のパッケージ、なにやらキーボードだけでもできるらしい。

## atom-beautify
url : https://github.com/Glavin001/atom-beautify
ソースフォーマット用、対応言語が多くて設定も細かく出来るので有り難い。


とまぁ、こんな感じかなと。
今後ずっとAtomで行くかわからないけど、できるだけ効率化できるなら、しておきたい。
mysqlで重複する期間があるレコードを取得する

もーなんか、どハマりしたので。。。orz

たとえば
「掲載期間を設定して記事を一つ公開する」
といったシステムがあるとする。

テーブルカラムは、ものスゲーシンプルにすると

・タイトル（title）
・掲載開始日（startdate）
・掲載終了日（enddate）

という感じとする。
管理システム側で、新規記事を登録する場合

タイトル
掲載開始日
掲載終了日

といった入力項目がある。

バリデーションとして
「掲載期間が重複している記事があれば登録させない」
という場合、
登録しようとした掲載期間でレコード取得しに行く。


SELECT * FROM テーブル名
WHERE 
startdate <= '掲載終了日'
AND
enddate >= '掲載開始日'


開始日－enddateといった具合にカラムと入力値を逆に比較するのね。。。

もースゲーはまったわ。。。orz
Note: Embulk Meetup Tokyo #2

2015/12/15

## メモ

- Embulkに足りない5つのこと by Civitaspo
https://speakerdeck.com/civitaspo/embulknizu-rinai5tufalsekoto

- Embulkを活用したログ管理システム
http://www.slideshare.net/zoetrope/embulk

- Fluentdのバッチ版Embulk(エンバルク)のまとめ
http://qiita.com/hiroysato/items/397f36c4838a0a93e352

- あえてEmbulkを使ってログ監視すると幸せになれる状況、およびその導入事例 / Embulk Meetup Tokyo #2
https://speakerdeck.com/muziyoshiz/embulk-meetup-tokyo-number-2

- digdag, a workflow automation tool
https://github.com/treasure-data/digdag-docs

- sidekiqの使い方
http://qiita.com/nysalor/items/94ecd53c2141d1c27d1f


(11:25 追加)

- ERRORログが多すぎるWebアプリに出会ったら
http://recruit.gmo.jp/engineer/jisedai/blog/struggle-against-too-many-errors/

- 謎の独自ERRORログをEmbulk + Elasticsearch + Kibana + PostgreSQLで監視する：運用設計からシステム構築まで
http://recruit.gmo.jp/engineer/jisedai/blog/embulk-elasticsearch-kibana-postgresql/

- 20151215 embulk 『新人がEmbulk mBaaSプラグインを開発した話』
http://www.slideshare.net/yuyaniimi/20151215-embulk


(2015/12/17 10:32 追加)

- Embulk at Treasure Data
http://www.slideshare.net/oreradio/embulk-at-treasure-data

- Embulk Meetup Tokyo #2 での LT 内容の補足と、イベントの感想
http://recruit.gmo.jp/engineer/jisedai/blog/embulk-meetup-tokyo-2/

あとで読む。
jqで連続するオブジェクトを配列にする


以下のようなやつ。

```shell
$ echo '{ "a": "1" }' '{ "b": "2"}' | jq
{
  "a": "1"
}
{
  "b": "2"
}
```

-s を使うと配列にできる

```
echo '{ "a": "1" }' '{ "b": "2"}' | jq -s
[
  {
    "a": "1"
  },
  {
    "b": "2"
  }
]
```

manにはこうかいてある

```
--slurp/-s:

           Instead  of  running  the  filter  for each JSON object in the
           input, read the entire input stream into a large array and run
           the filter just once.
```
テキストフィールドのキーボードを引っ込める

みなさん、こんにちは。アプリ道場の蒲池です。

今回はテキストフィールドなどが入力状態になった時に表示される「キーボードを引っ込めるボタン」を追加する方法について、勉強したことを書いてみます。

テキストフィールドに入力する際に表示されるキーボードを引っ込めるタイミングは、

* 他の画面（テキストフィールドの外）がタップされた時
* キーボードにある「return」が押された時

などがありますが、Doneボタンを作ってキーボードに乗せて表示させておいて、入力が終わってそのDoneボタンを押したら、キーボードが引っ込む、そういうやり方が安定していて好きなのです。

キードードに初めから備わっていない「Doneボタン」を追加してやって、それを押した時に、引っこませようとするわけです。

--------------

# ツールバー（ボタンビュー）部分を作成する

色は分かりやすくするためgreenColorにしましたが、実際は、lightGrayColorなどが良いと思います。

// Doneボタンの乗るボタンビュー buttonViewForKeyboard を作成します。

そのビューの位置・サイズは、frame: CGRectMake(0, 0, 320, 40)で設定すれば、乗せるキーボードの端から、この場合は、幅320高さ40です。

```swift:ボタンビュー作成
let buttonViewForKeyboard = UIView(frame: CGRectMake(0, 0, 320, 40))
buttonViewForKeyboard.backgroundColor = UIColor.greenColor()
```

# Doneボタンを作成します。

「Done」の位置は、ビューの右側。幅80、高さ30です。

```swift:Doneボタンを作成
let myButton = UIButton(frame: CGRectMake((self.view.bounds.size.width
- 80), 5, 80, 30))
myButton.backgroundColor = UIColor.greenColor()
myButton.setTitle("Done", forState: UIControlState.Normal)
```

# Doneボタンが押された時のメソッドを指定する

```swift:Doneボタンが押されたらonMyButtonのメソッドを呼び出す
myButton.addTarget(self, action: "onMyButton", forControlEvents:
UIControlEvents.TouchUpInside)
```

# ボタンの乗ったボタンビューをKeyboardのビューに追加 add する

```swift:ボタンビューをaddする
buttonViewForKeyboard.addSubview(myButton)
```

# ボタンの乗ったビューたる buttonViewForKeyboard をフィールドに設定

いくつTextFieldを作っても、全部、このようにbuttonViewForKeyboardを設定すれば良いようです。inputAccessoryView のおかげで、どのデバイスでもうまく収まるようです。

```swift:ボタンの乗ったビューをフィールドに設定
firstTextField.inputAccessoryView = buttonViewForKeyboard
secondTextField.inputAccessoryView = buttonViewForKeyboard
andSoOnTextField.inputAccessoryView = buttonViewForKeyboard
```

#  Doneボタンを押した時呼ばれるメソッド。

その名前が、onMyButton。

つまり、これが、キーボードを引っ込める命令。

```swift:キーボードを引っ込める
func onMyButton(){
self.view.endEditing(true)
}
```

僕のアプリはこの機能が頻繁に発生するので、定番化しています。
SublimeText3 での矩型選択(Mac)

毎回わかんなくなるのでもう一度復習。
ちなみに、「矩型」は「くけい」と読むそうです（知らなかった）
コマンドは下記。

- OS X：alt を押しながら、左クリックしドラッグで選択。
- Windows：Shift を押しながら、右クリックしドラッグで選択。

![subl.gif](https://qiita-image-store.s3.amazonaws.com/0/87650/7c8b2c98-e7c4-7b2b-b99d-814d12604397.gif)
IE8 ,IE9上でJsonレスポンスをした場合にダウンロードダイアログが開いてしまう問題


## 概要
今回、ajax通信で画像をPOSTしてs3にアップしたURLをjsondで返すという実装を行った際に、IEではダウンロードダイアログが開いてしまう問題が発生したのでその時の対処方の覚書

↓こういうやつ

![スクリーンショット 2015-12-16 9.55.26.png](https://qiita-image-store.s3.amazonaws.com/0/70031/ce0fb19d-22c8-f6a7-dc59-8e3b05eedcdc.png "スクリーンショット 2015-12-16 9.55.26.png")

## 対処法
レスポンスヘッダをtext/plainとし、js側でパースという実装となった

```Ruby
  def uploader
    // レスポンスヘッダの書き換え
    response.headers['Content-Type'] = 'text/plain'

    @image_url = ゴニョゴニョして返却
  end

```


## 余談
やっと入れましたが、modern.IE が便利でいい！
http://nyangryy.hatenablog.com/entry/2015/03/28/232330
viやvimで「Encounter E437: terminal capability "cm" required」が出た時の対処法

エラーの内容
------------
CentOS 7でviを起動した時に、以下の様なエラーが発生し、他で見つけた情報にしたがって、"export TERM=vt100"などとしてみたのですが、私の環境では解決しませんでした。

    Encounter E437: terminal capability "cm" required 
    Press ENTER or type command to continue

対処法
------
下記の参照元にしたがって、ncurses-term をインストールしたところ、解決しました。

    # yum install ncurses-term

以下のコマンドを実行して、多数のエントリーが表示されれば、正しくインストールされています。

    # ls /usr/share/terminfo/d  

なお、参照元の情報はCentOS 6のものですが、私のCentOS 7の環境でも有効でした。

参照元
------
http://linuxtoolkit.blogspot.jp/2013/04/encounter-e437-terminal-capability-cm.html
golangでUTF8以外で書かれたページを読み込む　※iconvは使わない

## たとえばgoでSJISで書かれたページをスクレイピングしたいとき

goqueryでUTF8以外の文字コードで書かれたページを読み込む方法は、goqueryのwikiでも紹介されています。

+ [Tips and tricks · PuerkitoBio/goquery Wiki](https://github.com/PuerkitoBio/goquery/wiki/Tips-and-tricks#handle-non-utf8-html-pages)

ここで紹介されているのはiconv-goを使った方法ですが、別解として、[transform](https://godoc.org/golang.org/x/text/transform)と[encoding/japanese](https://godoc.org/golang.org/x/text/encoding/japanese)を使う方法を書きます。

## iconv-goを使う（引用）

```go
// Load the URL
res, err := http.Get(url)
if err != nil {
    // handle error
}
defer res.Body.Close()

// Convert the designated charset HTML to utf-8 encoded HTML.
// `charset` being one of the charsets known by the iconv package.
utfBody, err := iconv.NewReader(res.Body, charset, "utf-8")
if err != nil {
    // handler error
}

// use utfBody using goquery
doc, err := goquery.NewDocumentFromReader(utfBody)
if err != nil {
    // handler error
}
// use doc...
```

[Tips and tricks · PuerkitoBio/goquery Wiki](https://github.com/PuerkitoBio/goquery/wiki/Tips-and-tricks#handle-non-utf8-html-pages)

## iconvを使わない

たとえばSJISのページを読み込む場合。

```go
// Load the URL
res, err := http.Get(url)
if err != nil {
	// handle error
}
defer res.Body.Close()
	
// Convert the designated charset HTML to utf-8 encoded HTML.
utfBody := transform.NewReader(bufio.NewReader(res.Body), japanese.ShiftJIS.NewDecoder())

// use utfBody using goquery
doc, err := goquery.NewDocumentFromReader(utfBody)
if err != nil {
	// handler error
}
// use doc...
```

## なんでこんなことを？

iconv-goを使うためには、cgoが必要で、libiconvやglibcも必要。

>PLEASE NOTE that this package requires the use of cgo, since it is only a wrapper around iconv - either provided by libiconv or glibc on your system. Attempts to build without cgo enabled will fail.

[djimenez/iconv-go](https://github.com/djimenez/iconv-go#install)

大抵の環境なら使えると思うけど、万が一、使えない環境に遭遇したときのリスクヘッジとして。

## 最後に

goをはじめてまだ２日目なので、いろいろとツッコミどころもあると思います。お気づきの点がございましたら、コメントを残していただけると嬉しいです。
動き続けていたCrontabを止める

以前、cronを使ったSlackの時報アプリを作成して削除したのですが、Cronは動き続けているようで、きちんと理解できていなかったので改めて自分の整理のためにログを確認して管理したいと思います。

↓ ターミナルを開くとこんな感じでメールが来てました。

```
 N [ユーザー名]  Tue Dec 15 10:00  19/905   "Cron ..."
 N  [ユーザー名]  Tue Dec 15 11:00  19/905   "Cron ..."
 N  [ユーザー名]  Tue Dec 15 12:00  19/905   "Cron ..."
 N  [ユーザー名]  Tue Dec 15 13:00  19/905   "Cron ..."
 N  [ユーザー名]  Tue Dec 15 14:00  19/905   "Cron ..."
 N  [ユーザー名]  Tue Dec 15 15:00  19/905   "Cron ..."
 N  [ユーザー名]  Tue Dec 15 16:00  19/905   "Cron ..."
 N  [ユーザー名]  Tue Dec 15 17:00  19/905   "Cron ..."
 N  [ユーザー名]  Tue Dec 15 18:00  19/905   "Cron ..."
```

## crontabの確認
自分で設定したcrontabについては、`$ crontab -l`コマンドで確認できます。


確認結果は下記。

```
$ crontab -l
0 10-18 * * 1-5 /bin/bash -l -c '~/Desktop/slack_time_signal/time_signal.rb'
```

ちなみに復習のために。
crontab設定項目 `* * * * * [実行コマンド]` は左から「分」「時」「日」「月」「曜日」となっています。
今回の設定でいうと、平日の10:00~18:00に1時間おきに実行という設定です。

## crontabの編集
すでに、「time_signal.rb」ファイルは削除してしまっているため、このタスクを削除します。
crontabの削除は、`crontab -r`コマンド（r = remove）

これで、再度`$ crontab -l`で確認すると、
`crontab: no crontab for [ユーザー名]`
ということで削除完了。

ちなみに、`$ crontab -e`は、編集です。
window.location.hashに渡す文字列は、1個目のハッシュが無視される


```js
// http://example.com/を閲覧していると想定してください。

// location.hashの値を変更すると、現在開いてるURIのハッシュ値が変わります。
// windowは省略可
window.location.hash = "child"
// -> http://example.com/#child

// 1個目のシャープは無視されます。
window.location.hash = "#child"
// -> http://example.com/#child
```
WP4.3のビジュアルエディタにてIE11で日本語入力に不具合がある件

[結論] WP4.4で解消された模様なのでバージョアップすればOK。
WordPress › フォーラム » IE11とTinyMCEとの相性 https://ja.forums.wordpress.org/topic/156974

バージョンアップ以外の対処方法は下記を参照。
WordPress › フォーラム » TinyMCE Advanced リンクの挿入が出来ない https://ja.forums.wordpress.org/topic/31124

コアを書き換えるとWPのアップデートで上書きされてしまうので下記のスニペットで対応した方が良いかな。

```
// 管理画面のヘッダにX-UA-Compatibleの指定を追加
function add_xua_admin_head() {
	echo "\n".’<meta http-equiv="X-UA-Compatible" content="IE=8, chrome=1">'."\n";
}
add_action( 'admin_head', 'add_xua_admin_head' );
```
Coding Inverviewに出そうな、QuotingとEscape処理をするSplitCSV()関数作成

簡単にcommaでsplitすることで済む場合もありますが、quotingとEscape文字列処理も一緒にやらないといけない場合には少しややこしいですね。
実際に必要だったので作りました。

RegExでMatchのIEnumerableを取る方法も出来そうでしたが、簡単にすべてをTraverseするのが分かりやすいし、Performance的にもよさそうでした。Split()関数にだけ慣れているCoderにはフレッシュな感じであるかも知れませんね。


```csharp：SplitCS.cs
    public static IEnumerable<string> SplitCSV(string csvString)
    {
        var sb = new StringBuilder();
        bool quoted = false;
        bool escaped = false;

        foreach (char c in csvString)
        {
            if (quoted)
            {
                if (!escaped && c == '\\')
                {
                    escaped = true;
                    continue;
                }

                if (escaped)
                {
                    sb.Append(c);
                    escaped = false;
                }
                else
                {
                    if (c == '"')
                        quoted = false;

                    sb.Append(c);
                }
            }
            else
            {
                if (c == '"')
                {
                    quoted = true;
                    sb.Append(c);
                }
                else if (c == ',')
                {
                    yield return sb.ToString();
                    sb.Length = 0;
                }
                else
                {
                    sb.Append(c);
                }
            }
        }

        //if (quoted)
        //	throw new ArgumentException("csvString", "Unterminated quotation mark.");

        yield return sb.ToString();
    }
}
```
Coding Inverviewに出してもよさそうと感じました。
【Swift】warning: could not load any Objective-C class information. This will significantly reduce the quality of type information available.


Swiftでタイトルのようなランタイムエラーが出たので、メモ。

## 問題の実行コード

UILabelを拡張して、Interface Builder上でテキストの下線の有無の設定ができるようにしようとしていました。

```swift

extension UILabel {

    @IBInspectable
    var underline: Bool {
        get {
            return self.underline
        }
        set {
            guard let text: String = self.text else {
                return
            }
            let textAttributes =  NSMutableAttributedString(string: text)
            if newValue {
                textAttributes.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.StyleSingle.rawValue, range: NSMakeRange(0, text.characters.count))
            } else {
                textAttributes.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.StyleNone.rawValue, range: NSMakeRange(0, text.characters.count))
            }
            self.attributedText = textAttributes
            self.underline = newValue
        }
    }
}
```

## エラー全文

`warning: could not load any Objective-C class information. This will significantly reduce the quality of type information available.`



## エラーの内容

ググってみたところ、以下のような事例が見つかり再帰的な呼び出しで無限ループに陥っている模様。

#### 参考
http://qiita.com/_Nanagin/items/5d0f94abdb54b4cefeda

その他の情報は英語情報がほとんどでよくわからず、、

## 結論

`var underline`の`setter`の中で`newValue`を自身に代入するという盛大な勘違い処理をしてしまっていたことが問題でした。
このため、`setter`の中で再度`setter`が呼ばれ、また`setter`が呼ばれ、、という無限ループになっていたようです。

ということで、19行目の
`self.underline = newValue`
を削除で修正できました。

基本的なところが抜けているな、、恥ずかしい :sweat_smile: 


## ちなみに

上記ExtensionのコードはGithubにおいています。
https://github.com/taji-taji/TJExtension/tree/master/TJExtension/TJExtension
Ubuntu(UTF-8)からEUC-JPの環境にsshログインした際に文字化けしないようにした時のメモ

タイトルの通り、Ubuntu(UTF-8)からEUC-JPの環境にsshログインすると日本語が文字化けしてしまいます・・・
上記について[cocot ](http://vmi.jp/software/cygwin/cocot.html)を使って文字化けしないようにできたのでメモ。

# 参考

+ [UTF-8環境からEUC-JP環境のサーバにsshした時の文字化けを防ぐ](http://d.hatena.ne.jp/mickey24/20090122/1232583961)
+ [bashで複数コマンドのエイリアス](http://qiita.com/mikakane/items/ac27582e8e52228adced)
+ [ssh_configに設定したホスト名をTABで補完できるようにする](http://hack.aipo.com/archives/9500/)

# インストール

tarを落としてきてビルドしてインストールします。

```bash
$ mkdir src
$ cd src
$ wget http://vmi.jp/software/cygwin/cocot-20080315.tar.bz2
$ tar jxvf cocot-20080315.tar.bz2
$ cd cocot-20080315
$ ./configure
$ make
$ sudo make install
```

これで`cocot`というコマンドが使えるようになっていると思います。


# sshしてみる

以下のようにsshログインすれば文字コードがEUC-JPの環境でも日本語が文字化けしないようになります。

```bash
$cocot -t UTF-8 -p EUC-JP -- ssh user@example.com
```

# 使いやすくする

上記だとコマンドが長くて打つのが面倒なのでaliasを指定し、またaliasのコマンドでも`~.ssh/sshd_config`に指定したホスト名がtabキーで補完されるようにします。

以下の例では`cssh`というコマンドをaliasとして設定しました。

```lang:~.bashrc
 #!/bin/bash
_ssh_list(){
  OLDIFS=$IFS
  IFS=$'\n'
  OUT=""
  for ITEM in `grep "Host " ~/.ssh/config | sed -e "s/ \+/ /g" |cut -f2 -d" "`
  do
    OUT="${ITEM} ${OUT}"
  done
  IFS=$OLDIFS
  echo ${OUT}
}

_ssh_comp() {
  local cur
  cur=${COMP_WORDS[COMP_CWORD]}
  if (( $COMP_CWORD <= 1 )); then
    COMPREPLY=($( compgen -W "`_ssh_list`" -- $cur ))
  else
    COMPREPLY=()
  fi
}

alias cssh="cocot -t UTF-8 -p EUC-JP ssh"
complete -o bashdefault -F _ssh_comp cssh
```

として~/.ssh/configに予めホスト名と対応するログインユーザー名を書いておけば、`cssh [tab]`とするとことで補完ができ、また以下のようにホスト名のみでのログインが可能となります。

```bash
$cssh web
```
line monitor > 消費電流の計測 (151216) > 動作時: 5.25V 300mA / shutdown時: 90mA

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

```txt:動作確認
Raspberry Pi2 + raspbian
Anker Astro E1 (5200mAh)
```

http://qiita.com/7of9/items/f24c9b931851ca0e3bb6
で行った連続試験において11時間の動作となった。情報を整理するため、消費電流を計測した。

## 条件

- 7セグメントLEDオン : IPアドレスの表示
- USBシリアルケーブル x 2
- 有線LAN接続
- 9600bpsで通信を続けている

Astro E1からPi2へのUSB接続の途中でCHARGER Doctorを挿して電圧と消費電流を計測したのが以下。

- 電圧: 5.25V
- 消費電流: 0.30A (300mA)

## 動作時間の計算

Astro E1の公称容量が5200mAhなので、動作時間は

5200mAh / 300mA = 17h

実際のところ、5200mAhぎりぎりまで使えなくて 11h / 17h = 0.64 なので、6割程度までの容量で計算すればいいようだ。

この程度の容量のモバイルバッテリーは５時間くらいで充電完了しそうなので、夜に充電しておいて、次の日１１時間程度使う、というので運用できそう。


## shutdown時 90mA

shutdownした時の消費電流は以下だった。

- 電圧: 5.30V
- 消費電流: 90mA

HDMIなど不使用にしたType Zeroと同等の消費となる。
c++ builder > public, private, クラスでないstaticな関数の使い分け

この記事は[Delphi Advent Calender 2015](http://qiita.com/advent-calendar/2015/delphi)の16日目の記事です。

やましょうさん、お疲れ様でした。
リレータッチボードドライバなるものがあるのですね。自動化に良さそうで、トライしてみたくなりました。とりあえず注文しておきました。
ESP8266を動かせてからの次のターゲットとして検討中です。

<hr>
今回はpublic, private, クラスでないstatic関数の使い分けについてです。

```txt:動作環境
C++ Builder XE4
```

## ソースリーディングの流れ

半年前や３年前のソースを見て、バグ対応なり機能追加なりすることがありますね。
そういう時に、ソースの構造をどうしておけば、前準備であるプログラムの構造調査をすぐに終わらせることができるのか、試行錯誤中です。

以下は僕のソースリーディングの流れです。

1. ヘッダファイル > public関数のうち外部から呼ばれるエントリ関数を調べる
2. ヘッダファイル > public関数のうちエントリ関数以外を調べる
3. ヘッダファイル > private関数のうちpublic関数から呼ばれるエントリ関数を調べる
4. ヘッダファイル > private関数のうちprivate関数から呼ばれる非エントリ関数を調べる
5. (詳細を見たい時) ソースファイル > 調査対象の関数をステップ実行などして調べていく
6. (詳細を見たい時) ソースファイル > static関数を調べる

ここで「エントリ」の定義は「その時々で自分が見たいまとまった処理の最上位の関数」とします。

ソースリーディングのほとんどはpublic関数とprivate関数までの読込み(1から4)までで構造を理解して終わり、実際の作業に入ることが多いです。

## 大きなユニットファイル

1. フォームを作ります。
2. ButtonClick()などUIとその動作について実装します。
3. 数値表示処理を追加します。
4. 要求によって、データ処理も追加します。
5. グラフを追加することになりました。
6. ...

気づいたらユニットファイルの中にたくさんの関数ができています。
それらの関数が同列に見える場合、ソースリーディング（構造調査）の時間がかかってしまいます。
そしてその時間の消費は、「毎回そのプログラムに取り組み始めるたびにかかってしまう」ものになります。

なんとかしたいものです。

## コーディングの流れ

ボトムアップとトップダウンの２種類がありますが、トップダウンの方法とします。

Code Completeでいうところの、Pseudocode Programming Process (PPP) @ Chapter9. The Pseudecode Programming Process (Kindle No.7351)で作ります。

PPPで関数を構造化したものを考えます。その際のそれぞれの関数をどこに置くのがいいか。
僕は、とりあえずprivate関数としてスタートします。

[関数作成の流れ @ mindmup](https://atlas.mindmup.com/2015/12/b020d840850a0133ac690b9c54d577ca/functioncreatingsteps_151215/index.html)

そしてコーディングを進めるにつれて上記の流れのように、private関数だったものを適宜別のアクセス修飾子にしたり、別ソースに切り出しをしていきます。

private関数の処理でも、「細かいことをしすぎている」と感じる処理はクラスでないstatic関数(.cppでstatic宣言している関数)にしていきます。そのstatic関数はソースリーディングにおいて目を通さなくなるので、構造理解の邪魔にならなくなります。

static関数にする時に注意点としては「リエントラントな関数にしておく」ことです。そのstatic関数内において、static変数の書き換えや読み込みにしておくと失敗します。実際、2日前の実装で失敗して修正しました (メンバ変数の読書きにしました)。

プログラムが小さいうちは、上記の流れのうちの緑色の関数だけの構造になります。大きくなるにつれて、ほかの部分の扱いをすることになります。

なお、プログラムが6割程度までできたと感じるまでは別ソース(UtilSetting.cppなど)に分岐するのは控えています。途中段階ではよい構造が見えないというのが理由です。
6割程度までできてだいたいの構造が見えてからテストをしながらリファクタリングします。
このあたりは、ここ４年のうちに読んだ本かPDF資料で「プロジェクトがひと段落したら構造を整理しよう」と記載があったのを参考にしています。どの本だったか失念しました。

6割になる前に、ある程度の処理のグルーピングはprefixをつけて行ったりします。「これはUIまわりの処理」、や「これはxxのロジックに関する処理」など。
prefixでまとめる「この関数はどのグループに属するのか」はコーディングの中でどんどん変化していく場合もあります。そういう場合でも、１つのcppファイル、1つのヘッダファイルで扱っている間は、リファクタリングがやりやすいです。早い段階で外部クラス化してしまうと、再グルーピングに手間がかかります。

構造がある程度落ち着いた段階で、prefixでグルーピングできたものを外部クラスにまとめたりなどしていきます。


だいたいこのような感じでコーディングを進めていってます。
技術英語 > my ship specs / leads to / right behind the Bridge > If I remember my ship specs correctly, there should be an emergency access conduit which leads directly from this deck to Deck 1, right behind the Bridge.

@ Star Trek Voyager > TWISTED

議論の中でキムが船の構造について

> If I remember <font color=red>my ship specs</font> correctly, there should be an emergency access conduit which <font color=red>leads</font> directly from this deck <font color=red>to</font> Deck 1, <font color=red>right behind</font> the Bridge.

<hr>
http://www.thefreedictionary.com/spec
> 1. specs The specifications, as for a building to be constructed.

<hr>
conduitというのはStar Trekでよく出てくる艦内の通路のこと。

元々の意味は以下のようなものらしい。

http://www.thefreedictionary.com/conduit

> 1. A pipe or channel for conveying fluids, such as water.
2. A tube or duct for enclosing electric wires or cable.
webpackのチュートリアルエラー回避

[webpackのチュートリアル](https://webpack.github.io/docs/tutorials/getting-started/)をやってるとcss-loaderのところでwebpackを実行すると

``% webpack ./entry.js bundle.js --module-bind "css=style!.css"
zsh: event not found: .css``

とエラーが出るんだけど、[GitHub](https://github.com/webpack/webpack/issues/1453)にも出てるようにダブルクォテーションをシングルクォーテーションにすれば解決する。

``% webpack ./entry.js bundle.js --module-bind 'css=style!css'
Hash: aa51824889799250cc68
Version: webpack 1.12.9
Time: 3593ms
    Asset     Size  Chunks             Chunk Names
bundle.js  11.8 kB       0  [emitted]  main
   [0] ./entry.js 64 bytes {0} [built]
   [5] ./content.js 44 bytes {0} [built]
    + 4 hidden modules
  ``
iOSでカレンダーにアクセスしてイベントを取得する



```swift
import UIKit
import EventKit

// 関数定義
func eventsWithStore(eventStore: EKEventStore ) -> [EKEvent]{
    let startDate = NSDate()
    let endDate = startDate.dateByAddingTimeInterval(86400*100) // 100日後を指定
    let predicate = eventStore.predicateForEventsWithStartDate(startDate, endDate: endDate, calendars: nil)
    let events = eventStore.eventsMatchingPredicate(predicate)
    return events;
}

// main
let eventStore = EKEventStore() // 生成にコストがかかるので毎回生成はしない
var events: [EKEvent]?
// カレンダーにアクセスが許可されているかチェック
if EKEventStore.authorizationStatusForEntityType(.Event) == EKAuthorizationStatus.Authorized {
    events = eventsWithStore(eventStore)
}else{
    // 許可されてないので許可を要求
    eventStore.requestAccessToEntityType(.Event,
        completion: {(granted: Bool, error: NSError?) -> Void in
            if granted{
                print("granted!")
                events = eventsWithStore(eventStore)
            }else{
                print("denied!")
            }
    })
}

// 取得したイベントをハンドリング
if let _events = events{
    print("Events count is \(_events.count)")
    for event in _events{
        print(event.title)
    }
}

        
```
異なるアドベントカレンダーでの記事の重複


## アドベントカレンダーとは

[「Qiita Advent Calendar 2015」の募集が始まりました - Qiita Blog](http://blog.qiita.com/post/132928437279/adcal2015?utm_source=qiita&utm_medium=advent_calendar_jumbotron)

>
そもそもAdvent Calendarとは?
>
元はクリスマスまでの期間を数えるために使われていたカレンダーのことで、12月1日からはじまり、24個ある「窓」を毎日1つずつ開けて中に入っている小さなお菓子やプレゼントを楽しむものが有名です。近年、インターネット上において、このカレンダーにならい、定められたテーマに従い、参加者が持ち回りで自身のブログやサイトに記事を投稿する企画が多く実施されています。

## 情報共有サイト上のアドベントカレンダーの意味

１つのテーマに特化した情報が限られた数（その２などもあるが）で、
その年の流行りなどを反映してまとめられているのが良く、

`タグ`の分類とは区別すべきだと思うので、
「同じ記事を複数のアドベントカレンダーに投稿すべきではない」と思っていましたが、

現在カレンダー数が `374` 。
２年前の２桁の時とはカレンダー１つの情報単位の意味が確実に変わってきていると思います。

![https://gyazo.com/adefab6b92643f5d8b7c31d296bf854c](https://i.gyazo.com/adefab6b92643f5d8b7c31d296bf854c.png)


## 存在を知らない数多のカレンダー

テーマ見たらめちゃくちゃ記事見たくなりそうなカレンダーが、今後きっといっぱい埋もれるのかなと思います。

`374` という数字はもはや、すべてのカレンダーのテーマタイトルを確認するのはちょっと骨が折れます。

### カテゴリ分け

新機能として`カテゴリ分け`ができましたが、来年には１つのカテゴリで３桁いくカテゴリが出てくるのではと思います。

カレンダーとしての良さを保持したまま、どう分類するか難しいですね。

## 複数のカレンダーに

### 予約投稿

もはや、同一の記事の複数のカレンダーへの登録を許してしまえばいいと思います汗

ということで、同じ`下書きURL`を別のカレンダーの同じ日に登録してみました。

#### 結果

結果としては、片方のカレンダーの予約投稿が済んだ時点で`下書きURL`が無効になるので予約投稿に失敗します。

![https://gyazo.com/3995611e279ef73ec3a30a32ea9d1f9b](https://i.gyazo.com/3995611e279ef73ec3a30a32ea9d1f9b.png)

### 参加登録

単純に後から登録しようとしてもできませんでした。

`Qiita` 意外のURLに関しては試していません。
Window Functions in Spark SQL using HiveQL

SparkでHiveContextを用いてwindow functionを使用するサンプル。

build.sbt

```
...
libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "1.5.2" % "provided",
  "org.apache.spark" %% "spark-sql" % "1.5.2" % "provided",
  "org.apache.spark" %% "spark-hive" % "1.5.2" % "provided"
)
...
```

scalaサンプル

```
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.hive.HiveContext
...

val conf = new SparkConf()
val sc = new SparkContext(conf)

val sqlContext = new HiveContext(sc)
import sqlContext.implicits._

val src = sqlContext.read.json(test_data)
src.registerTempTable("test")

val r = sqlContext.sql("select id, time, row_number() over(partition by id order by time) num from test")
...
```
C++ のライブラリチェックを configure.ac (or configure.in) で書く方法


試してみると C++ の場合は AC_CHECK_LIB が使えないので辛い。
そこで，ライブラリチェックを行う別な方法を考える必要があります。
例えば boost_system に依存している時の書き方を以下で考えてみます。

# 自前でプログラムを作ってみてチェック
http://nerdland.net/2009/07/detecting-c-libraries-with-autotools/ で Solution Two として紹介されている方法です。

```
AC_LANG_PUSH([C++])
[SAVED_LIBS=$LIBS]
[LIBS="-lboost_system $LIBS"]
AC_MSG_CHECKING([libboost_system])
AC_LINK_IFELSE(
  [AC_LANG_PROGRAM([#include <boost/system/error_code.hpp>],
    [boost::system::error_code err])],
  [AC_MSG_RESULT([yes])]
  [HAVE_LIBBOOST_SYSTEM=1]
  [SAVED_LIBS="$LIBS"],
  [AC_MSG_RESULT([no])])
LIBS="$SAVED_LIBS"
AC_LANG_POP()
```

上記コードは AC_CHECK_LIB の挙動に近づけるために元のコードに少しばかり修正を加えています。
このままだと再利用性が悪いので，m4マクロを使って使いやすくしてあげましょう。

```
AC_DEFUN([CXX_CHECK_LIB],[
AC_LANG_PUSH([C++])
[SAVED_LIBS=$LIBS]
[LIBS="-l$1 $LIBS"]
AC_MSG_CHECKING([lib$1])
AC_LINK_IFELSE(
	[$2],
	[AC_MSG_RESULT([yes])]
	[HAVE_LIB]m4_translit($1, [a-z], [A-Z])[=1]
	[SAVED_LIBS="$LIBS"],
	[AC_MSG_RESULT([no])])
[LIBS="$SAVED_LIBS"]
AC_LANG_POP()])

CXX_CHECK_LIB([boost_system],
[AC_LANG_PROGRAM([#include <boost/system/error_code.hpp>],
[boost::system::error_code err])])
```

CXX_CHECK_LIB の第1引数にライブラリの名前，第2引数にチェック用のプログラムを渡せばOKです。やっていることもシンプルですから改造もし易いのではないでしょうか。

# 配布されているマクロを使う方法
http://ac-archive.sourceforge.net/guidod/ax_cxx_check_lib.html のマクロを使うのも良さそうです。
最初の方法より洗礼されていそうですが，私はまだ使っていませんので使い勝手についてはノーコメントで。
ColoredLoggerを作った


[Package colored-logger - DUB - The D package registry](http://code.dlang.org/packages/colored-logger)

[std.experimental.logger](http://qiita.com/repeatedly/items/27d4656e76fa4c78201c)でD言語の新しいロギングモジュールについて書きましたが，これのロガーの1実装であるColoredLoggerを自分が欲しかったので実装した．

出来ることは名前の通りで，ログの出力に色を着けます．

## インストール

dubに登録してあるので，dependenciesに以下を追加するだけです．

```json
"colored-logger": "~>0.1.0"
```

## サンプルコード

以下はREADMEに載せている例ですが，他のロガーと同じようにnewします．デフォルトだと`LogLevel`は`info`になっていて，デモのためにあえて`all`にしているだけで，第二引数は省略出来ます．

```dlang
import coloredlogger;
import std.experimental.logger : LogLevel;
import std.stdio : stdout;

void main()
{
    auto logger = new ColoredLogger(stdout, LogLevel.all);

    logger.trace("trace");
    logger.info("info");
    logger.warning("warning");
    logger.error("error");
    logger.critical("critical");
    logger.fatal("fatal");
}
```

結果

![example](https://i.gyazo.com/6dcaf43bcb963a894d003368b50aa5d7.png)

### ログの色の変更

`ColoredLogger`には以下のコンストラクタがあるので，第二引数に` [LogLevel.info : ColoredLogger.Color.White]`みたいに渡せば色を変更出来ます．

```dlang
this(File file, in string[LogLevel] colorMap, const LogLevel lv = LogLevel.info) @safe
```

## まとめ

ターミナルに出すログをカラフルにしたいなー，って人には有用だと思います．
Gemfile.lockからバージョンの変更を取得する

# こんなとき
+ 大きめのRails/ライブラリアップデートを控えている
+ アップデート時にテストを行いたいが, テストスートが不十分
+ アップデートにもテストにも十分な時間を割くことができない

# できたこと
gemのアップデート(bundle updateとか)をした後にGenfile.lockのdiffからgemの変更差分を表示するスクリプトを作成しました. [travelog](https://rubygems.org/gems/travelog)
これを使ってアップデートされた各gemの変更差分を追いやすくします.
変更の入ったところには, バグなどの不具合が起こりやすいと思うのでテスト設計の際に参考にできると思います.

# 導入
```shell-session
$ gem install travelog
$ type travelog
```

# 使い方
railsのリポジトリを使って試してみます.

```shell-session
$ git clone https://github.com/rails/rails.git
$ cd rails
$ git diff b1edc37 HEAD -- Gemfile.lock | travelog
```

次のような出力が得られます.
バージョンに変更があった場合は, bundler形式で変更を出力し, 別途インストールのみされたgemとアンインストールされたgemを出力するようにしています

```
***** CHANGED GEM'S *****
globalid 0.3.6(was 0.3.3)
jquery-rails 4.0.5(was 4.0.3)
sprockets 4.0.0(was 2.12.3)
turbolinks 3.0.0(was 2.5.3)
amq-protocol 2.0.0(was 1.9.2)
~~省略~~

***** INSTALLED GEM'S *****
sass-rails 6.0.0
sass 3.4.19
byebug 8.2.0
celluloid-essentials 0.20.5
~~省略~~

***** UNINSTALLED GEM'S *****
hike 1.2.3
mail 2.6.3
mini_portile 0.6.2
queue_classic 3.1.0
rack 1.6.0
rack-protection 1.5.3
ruby-prof 0.11.3
sprockets-rails 2.2.4
tilt 1.4.1

```

# 参考
https://rubygems.org/gems/travelog
https://github.com/rentalname/travelog

# 感想
このgemを公開するモチベーションをくれたrubykaigiに感謝です. :sushi:
特定の日付になったらリンクのURLの一部をかえる

jsの練習がてら

ためしがきです。ちゃんと検証してないのであくまで参考程度に。


```
$(function() {
     var nowDate = new Date();
     var changeDate = '特定の日付';

　　　if(changeDate <= nowDate){
        var changeClass = document.getElementsByClassName('取得したいaタグにつけるクラス');
        for( i = 0; i < changeClass.length; i++ ){
           changeClass[i].href = changeClass[i].href.replace( '変更前の文字列', '変更後' );
        }
　　　}
});
```

作ってはみたけどあんまり現実的な実装ではないかもしれない（実行タイミングとかを考えると）
[C#]DelegateのFunctionPointerがいつまで有効か

## はじめに
C#からC++等で作成したdllにCallbackを渡したいとき、
`Marshal.GetFunctionPointerForDelegate`を使って`Delegate`から`FunctionPointer`にしたものを渡せばいい。
このときの`FunctionPointer`がいつまで有効なのかを調べた。

## 結論
`Delegate`の寿命が来るまでは少なくとも有効だと思われる。
よって、`Delegate`への参照をどこかに残しておくとよい。
(monoの場合はAOT.MonoPInvokeCallbackAttribute属性を使えばstatic関数を直接渡すことが可能)



### 参考
[[C#] デリゲートをGCの対象から外す方法](http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36275&forum=7)
[NativePluginsにC#デリゲートを登録する](http://tsubakit1.hateblo.jp/entry/20140326/1395783640)
【Rails】localhost:3000でsubdomainのurlを叩く方法



# routes.rb


```ruby
constraints subdomain: 'api' do
  get 'status' => 'status#index'
  resources :users
end
```


# rake routes

```shell-session
     users GET    /users(.:format)          users#index {:subdomain=>"api"}
           POST   /users(.:format)          users#create {:subdomain=>"api"}
  new_user GET    /users/new(.:format)      users#new {:subdomain=>"api"}
 edit_user GET    /users/:id/edit(.:format) users#edit {:subdomain=>"api"}
      user GET    /users/:id(.:format)      users#show {:subdomain=>"api"}
           PATCH  /users/:id(.:format)      users#update {:subdomain=>"api"}
           PUT    /users/:id(.:format)      users#update {:subdomain=>"api"}
           DELETE /users/:id(.:format)      users#destroy {:subdomain=>"api"}
```


ちゃんと  ```subdomain => "api"``` が追加されています。

# users_controller

特殊なことはしていません。

```ruby
class UsersController < ApplicationController
  def index
    render :text => 'ok!'
  end
end
```


# etc/hostsを開く

こいつにsubdomainを追加しないとダメなんです。

```shell-session
$ vim etc/hosts
```

etc/hostsに以下のスクリプトを追加

```
127.0.0.1 api.localhost.local
```


# http://api.localhost.local:3000/usersを叩く

"ok!"
Perl6でも0や空文字はFalseだけど

こんばんは :whale2: 
[Perl 6 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/perl6)の15日目です。(遅刻)

### はじめに

```pl
use v6;

if !() {
  print "()はFalseです\n";
}

if !'' {
  say "''はFalseです";
}

if !0 {
  put '0はFalseです';
}
```

### しかし

`but`キーワードを使うことで`True`として扱うことができます。

```
use v6;

my $空文字 = '' but role { method Bool  { True } };
my $ゼロ = 0 but True;

say ? $空文字; #=> True
say so $ゼロ; #=> True
```

## でも

配列やハッシュはだめなんだろうか。

```pl
use v6;

my @小かっこ = () but True;
my %中カッコ = {} but True;

say @小かっこ.Bool; #=> False
say %中カッコ.so; #=> False
```


定数`constant`キーワードを付けると`True`になるけど…原理がわかったら更新します…[^help]

```pl
use v6;

my constant @小かっこ = () but True;
my constant %中カッコ = {} but True;

say @小かっこ.Bool; #=> True
say %中カッコ.so; #=> True
```

## おまけ

逆に、普段は`True`になる値を`False`扱いしたい時にも使えます

```pl
use v6;

my Str constant $返事 = 'ぽんぽこタヌキさん' but False ;

$返事.say if $返事.not ; #=> ぽんぽこタヌキさん
```

おわりです。

## 参考と注釈

* [Perl6の Context Forcing Operators](http://qiita.com/B73W56H84/items/73150216006192096b27)
* [perl - にも真偽値は存在する - 404 Blog Not Found](http://blog.livedoor.jp/dankogai/archives/51268304.html)
* [Day 19 – False truth - Perl 6 Advent Calendar 2010](https://perl6advent.wordpress.com/2010/12/19/day-19-false-truth/)

[^help]: おしえてえらいひと。
Bashでリダイレクトにより誤って既存ファイルを上書きしてしまわないようにする

Bashでリダイレクトにより誤って既存ファイルを上書きしてしまわないようにする
====================

## 背景

[bashクックブック](https://www.oreilly.co.jp/books/9784873113760/) を読み進めています。

標準で **ON** にしておくと良さそうな設定がありました。
Bashでリダイレクトにより誤って既存ファイルを上書きしてしまわないようにする設定です。



## 環境

```sh
$ uname -a
Darwin genzouw-MacBook-Pro.local 15.2.0 Darwin Kernel Version 15.2.0: Fri Nov 13 19:56:56 PST 2015; root:xnu-3248.20.55~2/RELEASE_X86_64 x86_64 i386 MacBookPro10,1 Darwin


$ bash -version
GNU bash, バージョン 4.3.42(1)-release (x86_64-apple-darwin14.5.0)
    Copyright (C) 2013 Free Software Foundation, Inc.
    ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

    This is free software; you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
```


## "set -o noclobber"

**"set -o noclobber"** を実行すると、すでに存在しているファイルをリダイレクトにより上書きできなくなります。
ファイルが存在しない場合は問題なく新規作成されます。
追記も問題なくできます。

## 例

```sh
$ set -o noclobber

# 新規はできる
$ echo 123 > x.txt

$ ls
x.txt

# 上書きはできない
$ echo 456 > x.txt
bash: x.txt: 存在するファイルを上書きできません

# 追記はできる
$ echo 456 >> x.txt

# >| を使えば上書き可能
$ echo abc >| x.txt

# -o ではなく +o で設定をOFFにできる
$ set +o noclobber

# OFFにしていれば、上書き可能
$ echo 789 > x.txt
```


## ひとこと

明示的な上書きは **>|** を使うという書き方でルール化するのは有りだなと思いました。
Swiftは関数型の型推論にどのくらい耐えられるのか

Swiftを書いていらっしゃる方なら、型推論が弱くて困る経験をされたことがあるかもしれません。  

> Expression was too complex to be solved in reasonable time

~~最近↑に愛着湧いてきました。~~嘘です。

気になったので、Swiftに関数型の型推論を少しずつ食わせていってどこで潰れるか少しだけ試してみることにします。

# 実験道具

さっきわたしが拾ってきたものを使う。

* App StoreにあったXcode7.2(7C68)
* [Argo v2.2.0](https://github.com/thoughtbot/Argo)

Argoはjsonのパースをするものである。結果が enumの ```Decoded<T>``` であり、functor( ```<^>``` )とapplicative( ```<*>``` )と、それから ```map``` / ```flatMap``` を使うと楽しい。
詳しい話は色々な方がすでにされているので省略。

# 題材

次のようなものをつくってビルドが通るか試す。

```swift
struct Hoge {
    let args0: String
    let args1: String
    //略
    let argsN: String

    static func create(args0: String)(args1: String)/*以下略*/(argsN: String) -> Hoge {
        return Hoge(args0: args0, args1: args1, /*以下略*/, argsN: argsN)
    }
}

extension Hoge: Decodable {
    static func decode(json: JSON) -> Decoded<Hoge> {
        return create
            <^> json <| "args0" // Functor
            <*> json <| "args1" // Applicative
            // 以下ずっとApplicative
            <*> json <| "argsN"
    }
}

```

# 実験開始

https://github.com/S-Shimotori/SwiftTypeInference
紙面の都合上省略して掲載します

## ひたすらApplicative

↑に ```let argsN: String``` を増やすだけ。
引数14個までOK。15個目で力尽きた。

## mapとApplicative

↑の ```json <| "argsN"``` を全部 ```(json <|? "argsN").map { $0 ?? "default" }``` に変えて、やはり増やす。
引数13個までOK。Applicativeのみの時と比べると1個減っただけだが、ビルドにものすごく時間がかかる。

## AlternativeとApplicative

```map``` ではなくAlternative( ```<|>``` )でやってみる。

```swift
json <| "argsN" <|> json <| "argsN_1"
```

```<|>``` の右が ```pure("")``` であるぶんには14個まで行けるが、 ```<|``` だと7個まで。  
数が半減した割には ```map``` より処理も諦めも早い。

## 入れ子状態

次のようなものを増やす。

```swift
struct Hoge {
    struct Nested {
        let args0: String
        let args1: String

        static func create(args0: String)(args1: String) -> Nested {
            return Nested(args0: args0, args1: args1)
        }
    }
}
```

でもって引数の型を ```Hoge.Nested``` にし、 ```json <| "argsN"``` を

```swift
(Hoge.Nested.create <^> json <| ["nestedN", "args0"] <*> json <| ["nestedN", "args1"])
```

に変えてみる。
6個までOK。

# まとめ

まあこんなもんですよね。
thoughtbot, inc.はCurryも出してるけど、到底アレは使い切れない。

# 個人的な感想

今年はついにオープンソース化されたし、来年は色々カンファレンスも控えてワクワクしますね。

わたしはいままで初心者本レベルのプログラミングしかしてなかったし、それもCやJavaといった既に安定した言語だったので、__発表→β版→仕様変更の嵐__という時代の流れを楽しみながらやってます。Swiftは安定してないからとまだ様子見の方も多いでしょうが、そういう楽しみ方も人生に1回くらい……なんて。
ChatHeadを召喚するUIBarButtonItemを作ったよ

#FlowBarButtonItem

![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/24979/ab0b1f0c-0792-57fe-b184-5ee435c23a8f.gif)

https://github.com/noppefoxwolf/FlowBarButtonItem

#概要
上のgifのまんまです。
UIBarButtonItemを長押しするとChatHeadが出てきて自由にボタンを配置することができます。
またナビゲーションバーにChatHeadを持っていけばChatHeadは消えてボタンが元に戻ります。

#インストール

```:Podfile
use_frameworks!
pod "FlowBarButtonItem"
```

`$ bundle exec pod install`

#使い方

```swift
import FlowBarButtonItem


let right = FlowBarButtonItem(image: UIImage(named: "image"), style: .Done, target: self, action: "rightAction:")
navigationItem.rightBarButtonItem = right
right.enableFlow()
```

基本的にはUIBarButtonItemと一緒です。
クラス名を置き換えて、enableFlow()を呼べばOKです。
SHODAN


[SHODAN](https://www.shodan.io/)は、インターネット上で公開されている機器に関する情報をデータベース化しているサービスです。オフィス機器や、家電が意図せず公開してしまっているポート番号などもわかってしまいます。

+ [複合機や家電の不要な公開サーバーは「SHODAN」で発見を、IPAが利用法を指南](http://internet.watch.impress.co.jp/docs/news/20140228_637532.html)
+ [検索サービスSHODANを使うと何が見えるのか](http://itpro.nikkeibp.co.jp/article/COLUMN/20140610/562887/?rt=nocnt)
+ [グーグルでは分からないインターネット裏情報を引き出す「SHODAN」](http://ascii.jp/elem/000/000/779/779119/)


ブラウザから検索可能です。
無料アカウントでは、一部しか検索できないようですが、[一回だけ$49を支払う](https://www.shodan.io/store/member)とその制限が外れるようです。

[RESP API](https://developer.shodan.io/api)が提供されているので、アカウント情報にあるAPI_KEYを使ってアクセスが可能です。



## スクリプト提供
スクリプトは、無料でアカウントを作成してAPI Keyを取得することで使えるようになります。[Python](https://shodan.readthedocs.org/en/latest/), [Ruby](https://github.com/achillean/shodan-ruby/), [NodeJS](https://github.com/jesusprubio/node-shodan-client)、などなどLibraryが提供されています。

## Python
例えば、Pythonではeasy_installでインストールできてしまいます。

```python
$ easy_install shodan
```

そして、この[サンプル](https://shodan.readthedocs.org/en/latest/tutorial.html#connect-to-the-api)のように、これだけでapacheサーバーがずらずら出てきます。他のキーワードを入れてみても、ずらずら出てきます。あらら、危ないですねぇ。

```python
import shodan

SHODAN_API_KEY = "insert your API key here"
api = shodan.Shodan(SHODAN_API_KEY)

# Wrap the request in a try/ except block to catch errors
try:
        # Search Shodan
        results = api.search('apache')

        # Show the results
        print 'Results found: %s' % results['total']
        for result in results['matches']:
                print 'IP: %s' % result['ip_str']
                print result['data']
                print ''
except shodan.APIError, e:
        print 'Error: %s' % e
```

## 有料メニュー


また、スクリプトで利用する時の有料メニューは別途用意されているようで、[月間のクエリ数で$19/月, $99/月, $499/月の３つの選択肢](https://developer.shodan.io/billing)があります。


## 所感
悪用すると危ない反面、自分たちのサーバーに穴がないかのチェックにも使えるかもしれませんね。便利です。
本当に悪い人たちは、API_KEY登録してこんなところで調べたりしないですよね。きっと。


おわり。
CircleCIライクに、JenkinsジョブをDockerコンテナ内で実行してみる




ここ数年、CircleCIやTravis CIに代表されるクラウドCIサービスがメジャーになり、Jenkinsの影がめっきり薄くなりました。
でも、自社のプロダクトではクラウドサービスダメ!であったりで、恩恵を受けられない人のために、Jenkinsで少しでもその恩恵受けたい！というのが、この記事です。

# CircleCIに対するJenkinsのデメリット
個人的に、Jenkins離れが多い理由は、
1. 初めのセットアップが面倒
2. 複数プロジェクトで共有すると環境が混ざって大変
3. ジョブ設定に関する知識が属人的になりやすい(Jenkinsおじさんの出現)
の３つだと考えています。

今回は、特に2.に注目します。

# 複数プロジェクトの環境が混ざる
あるプロジェクトAは、Rubyでサーバサイドアプリを、別のプロジェクトBは、Androidを、というような場合、
Aのビルドには、rbenv, rais, ...etc
Bのビルドには、jdk, android-sdk, ...etc
というふうに、それぞれのsdkやランタイムが必要ですが、これらが一つのビルドサーバにインストールされると、それぞれ干渉してしまうかもしれません。
ビルドサーバをプロジェクトごとに分けることができれば問題ないですが、そんなにたくさんのサーバを用意できない！という人も多いですよね？

## CircleCIでは？
CircleCIでは、プロジェクト(リポジトリ)がビルドされるたびにコンテナが作られ、そこにミドルウェアをセットアップします。コンテナ内は独立したサーバとみなせるので、それぞれが干渉する危険はありません。

# Jenkinsジョブをコンテナ内で実行してみる
Jenkinsでも、CircleCIのようにコンテナ内でジョブを実行することができます。

今回は、Vagrantで動作確認用の環境を作ります。

```:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "centos7"
  config.vm.network "forwarded_port", host:8080, guest:8080
  config.vm.network inline: <<-SHELL
    #  install jenkins
    sudo yum -y install java-1.7.0-openjdk
    sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
    sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
    sudo yum -y install --enablerepo=jenkins jenkins
    sudo systemctl start jenkins
    sudo iptables -I INPUT -p tcp -m tcp --dport 8080 -j ACCEPT

    # install Docker
    sudo yum -y update
    sudo yum -y install docker
    sudo systemctl start docker
  SHELL
end
```

今回作る環境では、CentOS7にJenkinsとDockerをインストールします。

Jenkinsのジョブを、Dockerコンテナ内で実行するには、[CloudBees Docker Custom Build Environment Plugin](https://wiki.jenkins-ci.org/display/JENKINS/CloudBees+Docker+Custom+Build+Environment+Plugin)を、Jenkinsにインストールします。

![Screen Shot 2015-12-16 at 0.09.59.png](https://qiita-image-store.s3.amazonaws.com/0/79078/b5b985ee-e30d-40c4-6bea-b371749b4087.png "Screen Shot 2015-12-16 at 0.09.59.png")

Jenkinsのインストール環境が、CentOSなので、コンテナ内でジョブが実行されたことを明らかにするため、コンテナには、Ubuntuを使います。
ジョブ内では、Ubuntuのバージョンを確認しています。

![Screen Shot 2015-12-16 at 0.24.18.png](https://qiita-image-store.s3.amazonaws.com/0/79078/bbbb069f-40dd-6db1-c4c6-ebf26f5be0f6.png "Screen Shot 2015-12-16 at 0.24.18.png")

## 動作確認
![Screen Shot 2015-12-16 at 0.55.25.png](https://qiita-image-store.s3.amazonaws.com/0/79078/b97fb7ab-1d90-3c41-1427-0ec4b2414aa3.png "Screen Shot 2015-12-16 at 0.55.25.png")

 ` $ docker exec ~ ` により、シェル内に記述した `$ cat /etc/lsb-release` が、コンテナ内で実行されました。
 
# まとめ
UIがイケてない、設定がわかりづらいなどあるものの、Jenkinsは柔軟性があり、クラウドCIでできることは、ほぼJenkinsでも実現できます。

手軽にCIを始めたい場合はクラウドCIを、凝ったCIを組みたい場合はJenkins、というように、用途に合わせてツールを使い分けるのが良いと思います。
JavaScriptでBrainF*ckインタプリタを実装する

ニジボックスAdvent Calendar 2015 16日目の記事です。
# BrainF*ckとは
BrainF*ckとは難解言語の一種で、下記の8つの実行可能な命令を持っている言語です。
1. `>` ポインタをインクリメントする
2. `<` ポインタをデクリメントする
3. `+` ポインタが指す値をインクリメントする
4. `-` ポインタが指す値をデクリメントする
5. `.` ポインタが指す値を出力する
6. `,` 入力から1バイト読み込んで、ポインタが指す先に代入する
7. `[` ポインタが指す値が0なら対応する`]`の直後にジャンプする
8. `]` ポインタが指す値が0以外なら対応する`[`の直後にジャンプする
以上Wikipedia先生から抜粋。


やたらとポインタと言う単語が出てきており、学生時代にC言語にいじめられた自分としては今すぐブラウザを閉じてお家へ帰りたいところではありますが、
折角なので、JavaScriptでBFのインタプリタを実装して、アドレスとその中の数値の動きを視覚的に見られるようにしてみましょう。

# 実装
まず実際の数値を入れる配列とその配列のキー(ポインタ)がどこかを示す変数が必要になります。
また、BFのソースコードのどこを読んでいるかを示すプログラムカウンタが必要です。
ブラウザから受け取るソースと出力用の変数も書いておきます。

```
var mem = [];
var ptr = 0;
var pc = 0;
var source = "input";
var result = "";
```

受取りの細かい部分は割愛して、BFの言語仕様を１つずつ実装していきます。
以下の処理をソースの読み込みが終わるまで繰り返します。

```
var c = source.substring(pc, pc+1);    //1文字取得
pc++;                                  //プログラムカウンタをインクリメント
switch(c){
}
```

簡単に実装できそうな値の加減算から

```
case '>':pt++; break;
case '<':pt--; break;
case '+':mem[pt]++; break;
case '-':mem[pt]--; break;
```

BFの出力はC言語でいうputcharと同じ動きのため、こちらもそのまま実装します。
入力はブラウザから行っているため実装しません。

```
case '.':result += String.fromCharCode(mem[pt]); break;
```

そして繰り返し処理につかうジャンプ命令を実装します。
処理自体は単純で、プログラムカウンタを増やし(減らし)ながら、対応するジャンプ命令を検知し、その時点のカウンタより1大きい数をプログラムカウンタに代入します。

この時に注意が必要なのは、ジャンプ命令のネストがあった場合に、単純に対応する命令を検知するだけでは正しく動作しないことです。

そのため、処理している命令と同種のジャンプ命令があった場合その数をカウントしておき、対応するジャンプ命令があった時にカウンタが0だったらループから抜けるようにします。

```
case '[':
	if(mem[pt] == 0){
		var count = 0;
		for(var i = pc; i < source.length; i++){
			if(source.substring(i, i + 1) == '['){
				count++;
			}
			if(source.substring(i, i + 1) == ']'){
				if(count == 0){
					break;
				}
				count--;
			}
		}
		pc = i + 1;
	}
	break;
case ']':
	if(mem[pt] != 0){
		var count = 0;
		for(var i = pc - 2; i >= 0; i--){
			if(source.substring(i, i + 1) == ']'){
				count++;
			}
			if(source.substring(i, i + 1) == '['){
				if(count == 0){
					break;
				}
		count--;
			}
		}
		pc = i;
	}
	break;
```

以上で一通りの機能実装が完了です。
あとはフロント側で見た目を整えたり、アドレスや数値の流れを追いやすいようにスリープやステップ実行を好みで付けてこうなりました。

![bf_before.jpg](https://qiita-image-store.s3.amazonaws.com/0/101501/8c0ecf82-58c5-c48a-b531-03f706da286f.jpeg)

Runボタンを押すことで緑色のプログラムカウンタがソース上を読み取っていき、出力命令があった場合はresultに出力されます。
また今どこのメモリを指しているかはピンクの網掛けで表しています。


途中経過。
![bf_run.jpg](https://qiita-image-store.s3.amazonaws.com/0/101501/e1e2a114-d742-3ba8-7355-e358c384bd29.jpeg)


無事、ハロワが表示されました。
![bf_after.jpg](https://qiita-image-store.s3.amazonaws.com/0/101501/de576fdb-80c8-66b7-5c44-d5f2084a9c98.jpeg)


# 終わりに
今回、本当はGCPのCloudVisionの記事を書くつもりだったのですが、Googleの審査が間に合わずファ〇ク！ファ〇ク！と言っていたらこのネタ記事が出来上がりました。
審査が通ったら、笑わせた福沢諭吉を認識するか遊んでみたいと思っています。
VirtualBox上の仮想ディスク(Windows XP)を拡張する

VirtualBoxのバージョンは5.0.10
仮想HDDにはVDIを使用しています

Cドライブのプログラムフォルダ内の
Oracle￥VirtualBox下にVBoxManage.exeがあることを確認した後
コマンドプロンプトを開き以下を変更して実行する

$ VBoxManage modifyhd "VDIが保存されているパス\ファイル名.vdi" --resize 欲しいGB数＊1024（例:128GBに変更なら131072）

成功すると
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
と表示される

これでVDIのサイズは変更されたがXPのCドライブはもとのまま

次に仮想ディスクのパーティションを変更する
窓の社よりEaseUS Partition Master Freeをダウンロード
http://www.forest.impress.co.jp/library/software/easeuspart/
起動すると簡単にパーティションが変更できる
再起動をかけると完了

HDDのパーティションをいじるので
データのバックアップは大事です。
何かあっても戻せるようにしましょう。
UnityでアドベンチャーゲームやRPGで見られる登場人物同士による会話劇を作れるツールを作ってみた

よくアドベンチャーやロールプレイングなどで見られる登場人物同士による会話劇を
Unityで作ってみました。
と言っても、現在関わっているプロジェクトで必要になったので実装＋実際に会話劇を組み立てる人たちが作業しやすいように補助ツールなども作ったというお話です。
（概念的なお話）

UnityEditor側でやっていることは２つあり、
・Editor上で会話劇（以降2Dデモと呼称）を作る
・外部ファイルを読み込んで2Dデモを自動生成する
です。

#1.Editor上で2Dデモを作る#
書いてその通り、Editor上で2Dデモを作れる機能です。
そもそもこれが無いと2Dデモを作れません。

仕組みとしては、
1. [背景を表示する]
2. [BGMを再生する]
3. [テキストAを表示する]
4. [立ち絵Aを表示する]
5. [テキストAを消す]
6. [テキストBを表示する]
7. [立ち絵Bを表示する]
という感じでアクション（「立ち絵を表示する」や「テキストを表示する」）を
順に登録したアクションリストを作り、
順番に再生していくだけというよくある仕組みです。

これを実現するために使用しているのが、ScriptableObjectです。
ScriptableObjectはよくパラメータや参照を格納する用途で使われると思います。
こいつを利用して、
1.アクションのパラメータと参照を格納するScriptableObject(を継承したクラス)を用意する
例：立ち絵を表示するアクションクラス（仮称：Event_StandChara）
　ー 立ち絵として表示する画像の参照
　ー 立ち絵prefabの参照（gameobject側にイメージをaddcomponentしておき、そこに画像をセット）
　ー 立ち絵の表示位置
　ー 立ち絵反転フラグ etc...
2.複数のアクションを格納するScriptableObject(を継承したクラス)を用意する
3.2のScriptableObjectを解析し、再生する仕組みを用意する
とう流れで実現しています。


**【実際に表示される画面】**
※素材は[プロ生ちゃん](http://pronama.azurewebsites.net/pronama/download/)をお借りしています。
![スクリーンショット 2015-12-16 0.18.42.png](https://qiita-image-store.s3.amazonaws.com/0/34019/70b91aef-2566-baea-9558-01ecef7077aa.png)
一応、現在台詞を話しているキャラに対してフォーカスを当てたり、話していないキャラはグレーをかけたり、
立ち絵の優先順位を変えたり（話しているキャラを手前に表示）など細かい部分は内部で勝手にやってくれるようにしてます。
（エディタは社内で使っているので見せらないよ！）


#2.外部ファイルを読み込んで2Dデモを自動生成する#
もう一つは外部ファイルを読み込んで、自動でアクション生成＋アクションを格納するScriptableObjectを作成するという機能です。
これを用意したのはスクリプターさんが実際に2Dデモを作ろうとした時に、
毎回Unityを起動して、2Dデモを作るエディタを起動して、一つ一つアクションを登録していくという作業で結構な時間を取られてしまうということが起きてしまうため、
出来るだけ簡単にかつUnityが無くても作業が出来るように外部ファイルからでも2Dデモを作れる仕組みを用意しました。

機能としてはシンプルです。
ルールに従って作られた外部ファイルを読み込み、解析し、ScriptableObjectを作成し、保存する。
これだけです。

外部ファイル自体はtextファイルを使用しています。
基本的に社内で使用して、最終的にアクションを格納するScriptableObjectを作成して出力するので
特に凝る必要はないと考えました。

textファイルの方に予め用意したルールを元にアクションを記述してもらい、それをローダーに通すと自動で2Dデモファイルを作成してくれるので、特に難しい操作はないです。



その内、ちゃんと記事にしたいなーと思っていますがだいたいはやらないフラグ…
Haskell for Mac でちょっと Haskell をさわってみる

ちょっと Haskell をさわってみようと思った場合、定番としては、[Haskell Platform](https://www.haskell.org/platform/) をインストールして ghci を使う、といった方法があります。

ここではそれとは違う環境として、[Haskell for Mac](http://haskellformac.com/) を紹介します（名前の通り、Mac OS X 向けです）。

# Haskell for Mac とは

単体アプリで Haskell が動作する開発環境です。Mac App Store で販売されています。有償アプリではありますが、導入が手軽で便利だと思います。アプリをインストールするだけで準備完了です。

最大の特徴は Playgrounds 機能です。書いたコードがその場で自動的に実行される対話的環境です。これについて後述します。

また、簡易なプロジェクト管理機能もあります。

Haskell にはたくさんのライブラリ（パッケージ）があります。Haskell for Mac に含まれているライブラリは [Library Documentation](http://support.hfm.io/1.0/api/) で確認できます。とても多くのライブラリが含まれていることが分かります。

# Playgrounds 機能を試してみる

まず、Haskell for Mac を起動して新規プロジェクトを作成します。

<img width="462" alt="NewProject.png" src="https://qiita-image-store.s3.amazonaws.com/0/6204/b429f37c-7881-45d0-cb92-9e417e966c22.png">

画面は、プロジェクト管理（左）、モジュールエディタ（中）、Playground エディタ（右）、の3つに大きく分かれています。画面右上の「Show or Hide Area」のボタンで、それぞれの表示・非表示を切り替えることができます。

<img width="1056" alt="Screen.png" src="https://qiita-image-store.s3.amazonaws.com/0/6204/e75a5972-32f2-9126-45df-2d5ab0ccca4e.png">

まずは、右のみ表示すると、Playground エディタ画面のみになります。この状態で Haskell のコードを書くと、自動的に実行結果が表示されます。

<img width="674" alt="Playground.png" src="https://qiita-image-store.s3.amazonaws.com/0/6204/ed998086-6f42-405b-a8eb-470fa01c05e8.png">

# 自分で定義した関数を試す

試しているとすぐ気付くかと思いますが、前節の Playgrounds 画面では、そのままでは自分で関数を定義することができません（`let` を使えば可能ですが）。

そこで、中のモジュールエディタ画面を表示させます。これはプロジェクト内の hs ファイルの編集を行う画面です。ここに関数を定義して、右の Playground エディタでその関数を実行することができます。つまり、右の Playground エディタは、hs ファイルで実装した内容を試してみるための実験場なのです。

<img width="904" alt="Module.png" src="https://qiita-image-store.s3.amazonaws.com/0/6204/6c09f715-2342-b569-acf0-511b7ff7b8a8.png">

# 複数ファイルを管理する

次に左のプロジェクト管理画面を開いてみます。ここで、hs ファイルを新規作成することができます。ひとつの hs ファイルがひとつの Haskell モジュールになります。

メイン以外のモジュールでは、最初にモジュールヘッダを書く必要があります。

<img width="1017" alt="NewModule.png" src="https://qiita-image-store.s3.amazonaws.com/0/6204/85e7cb7e-eade-5bcd-f80d-5bfcaf956d41.png">

作成したモジュールは、別のモジュールで import して使うことができます。

<img width="1017" alt="ImportModule.png" src="https://qiita-image-store.s3.amazonaws.com/0/6204/e9c911c3-fb88-4779-8179-aebf3cbbf6c4.png">

# サンプルプロジェクトを見る

実は Haskell for Mac にはサンプルプロジェクトがいくつか付属しています。サンプルを一通り見てみると、より雰囲気がわかるかと思います。

SpriteKit を使ってグラフィックス描画をするサンプルもあったりして面白いです。

<img width="1249" alt="SpriteKit.png" src="https://qiita-image-store.s3.amazonaws.com/0/6204/5d1fcf00-8f94-94c4-985b-54ecfeafbf02.png">

# 最後におまけ

大阪・梅田で Haskell 本の読書会をやっています。興味がある方は [Umekita.hs](http://umekitahs.connpass.com/) をご覧ください。今は「Haskellによる並列・並行プログラミング」を読んでいます。

また、今の本を読む前には「すごいHaskellたのしく学ぼう!」を読んでいたのですが（[すごいHaskell読書会](http://iseebi.github.io/sugoih/)）、これをもう一度最初から読んでみてもいいのでは、と考えています。興味がある方は Twitter 等で声をかけていただければと思います。