OmniAICreator/Qiita-1.07M huggingface dataset:
浪江住民のタブレット活用を考えるアイデアソン(6/10@東京)の個人の記録

code for namie
6/10@東京
浪江住民のタブレット活用を考えるアイデアソン
http://codefornamie.org/post/88717200155/6-10-codefornamie

これに参加してきた。最終的なアウトプットは記事を見てもらうとして、1人のコード書きとして、このアイデアソンで何を考えたか、書き残しておく。過程が残っていて、後でトレースできないと、無駄が多くなると思うので。運営の人は、運営側視点で記録をまとめるだけでなく、参加者にもっとアウトプットを呼び掛けても良いんじゃないかな。まとめは必要だけど、その過程が捨てられると、なぜそこに至ったのかが分からなくなるので。

この日のワークで最初に示されたのは、過去のアイデアソンの結果を運営が16個のアイデアに集約した内容だった。

http://www.slideshare.net/codeforjapan/5-35723677?ref=http://codefornamie.org/post/88717200155/6-10-codefornamie

1 今日の"ふくしま"のローカルニュースが手にとるようによくわかるテレビ番組
2 避難先での生活を助けてくれる便利情報・嬉しい情報満載マップ
3 今のリアルな浪江の状況が 臨場感があるカタチで目で見える
4 機械が苦手な人でも毎日ついつい使えるヘルスケア+サポート
5 知りたい場所の放射線量と除染作業の進捗状況が知りたい時にすぐわかる
6 必要な申請手続きが簡単にシンプルにすぐできる
7 全国の浪江町民で地区対抗バトルができるオンライン対戦イベント
8 ご近所さんや知人の子供の成長を見守れる子供成長日記
9 手描きで書いて紙のハガキが届くお便りツール
10 離れている知人のライフイベントを共有して人生を共に歩むイベントカレンダー
11 浪江弁でしゃべれる可愛がれるペット的存在
12 同じ趣味をもつ人とおもいっきり会話ができる出会い促進サービス
13 困ったことや想っていることを何でも吐き出せる
14 同じ時間に一緒のことをして、ライブでつながるきっかけづくり
15 タブレットやアプリの使い方を町民どうしが教え合える仕組み
16 町民から町民へバトンを渡し、町民から配信するニュース

この中から投票で選んだ上位7つのブラッシュアップを行ったが、私は4と6に投票した、その際の評価について以下に示す。

まず、1、2、3、5については、基本的に町民が情報を受け取るメディアであり、タブレットの利用形態としてあまり新規性を感じなかった。既存のメディアを参考にすれば技術的な問題は起こらないだろうと思ったし、コンテンツの方が重要なので、技術的な観点から評価を加える必要を感じなかった。なので、自分が手伝う方向ではないと考え、投票候補から除外した。

次に、7、9、10、11、12、13については、7ならスポーツタイムマシン( http://sportstimemacine.blogspot.jp/ )、9ならお絵描きワークショップ( http://kgr-lab.ddo.jp/doku.php?id=%E9%81%8A%E3%81%B3%E6%96%B9 )の技術を応用できる、10ならSNSのカレンダやイベントの機能、11ならアルデバランロボティクスのNAO( http://www.aldebaran.com/ja/xiao-xing-robotutonaotoha )、12もSNSやゲーミフィケーションの道具立てを使えるだろう、13ならリグレト( http://rigureto.jp/ )など、既存のソリューションを想起出来たため、これらも投票候補から除外した。

14、15、16については、コンテンツそのものに利用者の能動的な関与が前提となるため、広く使ってもらうのは難しいと考えた。8については、利用者全員が能動的となる必要はないので、少し敷居は下がるが、能動的関与が必要であるので、同じ評価とした。ゆくゆくは、タブレットを能動的に使える利用者を増やし、こうした対称的な情報交換が行えることが理想だとは思うが、最初の一歩には難しいだろう。

というわけで、消去法で、4、6について技術的な観点から意見が出せれば、お役に立てるのではないかと考えた。

4、6は、やらなければならないけれども面倒なことを、タブレットで支援できるのではないかという意味で、同じタイプの問題である。タブレットで町民を繋ぐという理想のために、まずはタブレットを日常的に使ってもらうことが必要で、それをどうにかできるアイデアだと思った。

最終的に私がブラッシュアップに加わったのは、4のグループとなった。

アイデアソンに参加する前に、浪江町の人口ピラミッドについて考えてみた。いくつかのサイトで見てみたところ、60代がピークであり、今後も高齢者の比率が高まっていくだろうと考えられた。これは日本の田舎はみんな同じだろうが。

で、自分の実家を思い浮かべて、田舎の年寄りの生活の中でタブレットの居場所になり得るのはどこか考えてみたが、いきなりテーブルやコタツの上に居場所を得るのは難しいだろうと思った。電話の隣、FAX置くようなイメージを考えた。

このイメージを元に、動線脇に置いてあって、必要な時にそこで置いたまま操作するような利用シーンを念頭に、議論に入ったが、電話より置時計のメタファーで考えた方が良さそうだという結論が出て、これが非常に面白かった。思い立って能動的に操作しに行くのではなく、目覚まし時計のように、呼ばれて操作しに行く。キッカケをタブレット側が投げてくる、利用者は受け身でいられる、とゆーのが、リテラシのない人にも良さそうに思えた。

そんなことを考えてきました。
gofmt のあとに kill-region が動かなくなる問題

go-mode.el についてくる `gofmt` コマンドを実行すると，`kill-region` が壊れる可能性があります．これは，`kill-region` が `defadvice` されている場合に起こります．

私の場合は sense-region.el が `kill-region` を advise していてハマりました．`kill-region` に advice が無ければこの事象は発生しないので，`gofmt` の間だけ advice を外すことにしました．設定変更はこんな感じ↓です．

```diff
--- a/tnoda.org
+++ b/tnoda.org
@@ -2553,8 +2553,16 @@ would be done by the following steps:
 
   (el-get 'sync 'go-autocomplete)
 
+  (defun tnoda/gofmt-before-save ()
+    "The original version of go-fmt may break the kill-region function,
+  if it has an advised version."
+    (interactive)
+    (when (eq major-mode 'go-mode)
+      (sense-region-off)
+      (gofmt)
+      (sense-region-on)))
 
-  (add-hook 'before-save-hook 'gofmt-before-save)
+  (add-hook 'before-save-hook 'tnoda/gofmt-before-save)
   (add-hook 'go-mode-hook 'rainbow-delimiters-mode)
   (add-hook 'go-mode-hook 'turn-on-smartparens-strict-mode)
```

`gofmt` を `defadvice` するかどうかで迷ったのですが，自前の gofmt-before-save を作って様子をみることにしました．


## 参考

* https://github.com/dominikh/go-mode.el/issues/53
  - ここでは volatile-highlights.el が `kill-region` を advise していたようです．
  - ちなみに，go-mode.el の作者の人は，`flet` を `cl-flet` に置き換えるつもりが無いようです．
【Batch】処理時間計測(補助)バッチファイル【備忘録】

#バッチファイル(コマンドプロンプト)で処理時間を計測する
バッチファイルで処理していた時間を計測する
直書きしてもいいけど

##定義

```bat:worktime.bat
@echo off

if "%1" == "START"	goto BEGIN
if "%1" == "STOP"	goto END
if "%1" == "PRINT"	goto PRINT
goto EOF

:BEGIN
SET T=%TIME: =0%
SET H=%T:~0,2%
SET M=%T:~3,2%
SET S=%T:~6,2%
SET L=%T:~9,2%
 
rem --8進対策
set /a H=1%H%-100
set /a M=1%M%-100
set /a S=1%S%-100
goto EOF

:END
SET T1=%TIME: =0%
SET H1=%T1:~0,2%
SET M1=%T1:~3,2%
SET S1=%T1:~6,2%
SET L1=%T1:~9,2%

rem --8進対策
set /a H1=1%H1%-100
set /a M1=1%M1%-100
set /a S1=1%S1%-100
rem --終了時間の計算
SET /a H2=H1-H
 
SET /a M2=M1-M
if %M2% LSS 0 set /a H2=H2-1
if %M2% LSS 0 set /a M2=M2+60
 
SET /a S2=S1-S
if %S2% LSS 0 set /a M2=M2-1
if %S2% LSS 0 set /a S2=S2+60

SET /a L2=L1-L
if %L2% LSS 0 set /a S2=S2-1
if %L2% LSS 0 set /a L2=L2+100

rem 二けた強制表示
rem if %L2% LSS 10 set L2=0%L2%

SET /a DPS=%H2%*3600+%M2%*60+%S2%
SET DPS2=%DPS%.%L2%

set DPS_STAMP=%H2%:%M2%:%S2%
set DPS_STAMP2=%DPS_STAMP%.%L2%

goto EOF

:PRINT 
echo 開始時間：%T%
echo 終了時間：%T1%
echo 経過時間：%DPS_STAMP%
echo 経過秒数：%DPS2%
:EOF
```

##使い方
###パターン1

```bat:test.bat
rem 計測開始
call worktime.bat START

rem 何か処理

rem 計測終了
call worktime.bat STOP

rem 表示
call worktime.bat PRINT

```

###パターン2

```bat:test2.bat

rem 計測開始
call worktime.bat START

rem 何か処理

rem 計測終了
call worktime.bat STOP

rem 経過時間の取得
echo %DPS_STAMP%

rem 経過秒数だけ取得
echo %DPS%

rem 経過秒数の取得
echo %DPS2%


```

##出力
###パターン1

```
開始時間：19:27:28.66
終了時間：19:27:32.89
経過時間：0:0:4.23
経過秒数：4.23
```

###パターン2

```
0:8:26
506
506.27
```

#参考
http://rikutoto.blogspot.jp/2013/06/windows.html
Bundlerで指定したgemにオプションを指定する方法

```bash
gem install sqlite3 --with-sqlite3-dir=$HOME/sqlite3
```

をbundlerで行うには、次のようにする

```bash
bundle config build.sqlite3 --with-sqlite3-dir=$HOME/sqlite3

bundle install
```

複数のオプションを指定する場合、スペースで続けて記述する。

```bash
bundle config build.sqlite3 --with-sqlite3-dir=$HOME/sqlite3 --with-sqlite3-lib=...

bundle install
```

# 参考

http://journal.sooey.com/233
Rails sqlite3とgem sqliteのインストール 

古いCentOS Ver5.x系でrails環境を構築する際、sqlite3のインストールとgem sqlite3に躓いたので、その回避方法。
（前提としてyumできない環境）


# 1. sqlite のインストール
sqliteのソースファイルをダウンロードして、コンパイルする。

```bash

cd ~/
sudo wget http://www.sqlite.org/sqlite-autoconf~.tar.gz
tar xvfz sqlite-autoconf~.tar.gz
cd sqlite3 # ソースファイルのあるフォルダをsqlite3とする。
./configure
make
make install
```
## 参考
http://pirosikick.hateblo.jp/entry/20101103/1288796756


# 2. gem sqlite3のインストール

```rb
# Gemfile
gem sqlite3
```

上記のようにGemfileにsqlite3が記述されている状態で、bundle install を実行すると、sqlite3.hやlibなどが無いと
怒られるのでその回避策。

※ sqlite3-rubyは、sqlite3の旧バージョン

----
以下のコマンドで、sqlite3にオプションを指定できる。

```bash
bundle config build.sqlite3 --with-sqlite3-dir=$HOME/sqlite3 --with-sqlite3-include=$HOME/sqlite3 --with-sqlite3-lib=$HOME/sqlite3/.libs/ --with-opt-dir=$HOME/sqlite3
```
※--with-opt-dirは不要かもしれない。


bundle installで無事インストール完了。
gitコマンドのプロトコルをhttpsに固定する(社内環境でよくある話)

よく忘れるので自分用のメモです。

## 社内からgitプロトコルは使えないこと多いよね

GithubからSubmoduleゲットしようとした場合とか。
firewallにgitプロトコルが許可されて無くて、↓のように接続できませんってなる。

```bash
$ git submodule update --init
(略)
Cloning into 'fuel/app/vendor/Phamlp'...
fatal: unable to connect to github.com:
github.com[0: 192.30.252.129]: errno=Operation timed out
```


そらそうだよね〜
ってことで

## gitプロトコルの代わりに、httpsプロトコルを使うように設定する

下記2つの方法 git config コマンドと ~/.gitcongih を書き換える で起こる結果は同じものでした。
両方 ~/.gitconfig を書き換えることになるため、ユーザ単位での永続的な設定変更となります。
詳細はこちらをご確認ください。
[この記事のコメントへのリンク](http://qiita.com/nntsugu@github/items/38dc49a47d1b658325e8#comment-3ef071e64d6ff5620b13)

yterajima さん、ご指摘ありがとう。

<del> ### その場限りならこちらでOK </del>

```bash
git config --global url."https://".insteadOf git://
```

<del> ###常にhttpsで通信するなら.gitconfigにこう書く </del>

```bash:~/.gitconfig
[url "https://"]
    insteadOf = git://
```
rbenvでRubyの切り替えあるある


rbenvでRubyをインストールしてから`rbenv global version_number`で切り替えるけど、適用されないあるある事例の自分用メモ。

````bash
$ ruby -v
ruby 2.0.0p451 (2014-02-24 revision 45167) [universal.x86_64-darwin13]
````
(´・ω・`)＜なんでやねん

````bash
$ vi ~/.bash_profile

#PATHを通すおまじない
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

:wq

#bashの設定ファイルを再読み込みするおまじない
$ source ~/.bash_profile
````
以上で、`ruby -v`で確認すると、

````bash
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin13.0]
````
※Mavericksさんのデフォルトは2.0なので。
って感じに表示されればおｋ。

めでたしめでたし。
nagiosメールが来たらAsteriskで電話をかける

# 構成例

## Asterisk側の準備

1. asteriskで`4`にダイヤルすると自分の携帯に電話がかかるようにする。
1. http://myhome.com:8888/cgi-bin/callme.py にアクセスが来たら
  1. pythonからasteriskで`4`にダイヤル。
  1. アクセス元制限
1. http://myhome.com:8888/ が落ちないようにmonitにサービス登録

## nagios検知した後

1. nagios検知
1. nagios@server.com -> svadmin@provider.com へメールが届く。
1. /home/svadmin/.procmailrc にてルール記述
  1. curl http://myhome.com:8888/cgi-bin/callme.py
  1. メール転送

----

# 上記内容で実践

## Asterisk側の準備

1. asteriskで`4`にダイヤルすると自分の携帯(09011111111)に電話がかかるようにする。

```bash:/srv/asterisk11/etc/asterisk/extensions.lua
default = {
   ["4"] = function()
           app.Dial("SIP/09011111111@050plus,15")
   end;
};
```

2. http://myhome.com:8888/cgi-bin/callme.py にアクセスが来たら
  1. pythonからasteriskで`4`にダイヤル。
  1. アクセス元制限

```py:/srv/callme/cgi-bin/callme.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import commands

ip = os.environ['REMOTE_ADDR']
# provider.com のIPを222.111.99.88とする。
ip_allow = "222.111.99.88"

def print_html():
  print "Content-type: text/html"
  print """
    <html>
    <head><meta charset="utf-8"/></head>
    <body>
"""

def call():
  if ip == ip_allow:
    exe = "/srv/asterisk11/sbin/asterisk -x 'console dial 4'"
    print commands.getoutput(exe)
  else:
    print "access denied."

print_html()
call()
```

3. http://myhome.com:8888/ が落ちないようにmonitにサービス登録

```bash:/srv/callme/nagios2call.sh
#!/bin/sh
set -e
cd /srv/asterisk_nagios
python -m CGIHTTPServer 8888
```

```bash:/srv/callme/nagios2call_stop.sh
#!/bin/sh
set -eu
PID=pgrep -f "python -m CGIHTTPServer 8888"
/bin/kill -9 ${PID}
```

```bash:/etc/monit/monitrc.d/nagios2asterisk
check host callme with address localhost
    start program = "/srv/callme/nagios2call.sh"
      as uid asterisk and gid asterisk
    stop  program = "/srv/callme/nagios2call_stop.sh"
    if failed host localhost port 8888 then restart
    if 5 restarts within 5 cycles then timeout
```

```bash:シンボリックリンクを貼る
$ sudo ln -s /etc/monit/monitrc.d/nagios2asterisk /etc/monit/conf.d/
$ sudo /etc/init.d/monit restart
```

## nagios検知した後

1. nagios検知
2. nagios@server.com -> svadmin@provider.com へメールが届く。
3. /home/svadmin/.procmailrc にてルール記述
  1. curl http://myhome.com:8888/cgi-bin/callme.py
  1. メール転送

```bash:~/bin/callme.sh
curl http://myhome.com:8888/cgi-bin/callme.py
```

```bash:~/.forward
"| IFS=' ' && exec /usr/bin/procmail -f- || exit 75 "
```

```bash:~/.procmailrc
:0 c
*^From:.*nagios@.*
| /home/svadmin/bin/nagios2call.sh

:0 c
*^From:.*nagios@.*
! svadmin+nagios@gmail.com
```
Git SSL認証チェックを無効にする.

古いCentOSでgit cloneを行った際、以下のようなエラーが出た。

```bash
error: SSL certificate problem, verify that the CA cert is OK. Details:error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed while accessing https://hogehoge
```

とりあえずの対処として、SSL認証を無効にして対応できるらしい。

```bash
export GIT_SSL_NO_VERIFY=true
```

# 参考
http://tadasy.hateblo.jp/entry/20130904/1378299371
意外と知られていない、BitbucketでもGithub PagesのようにWebページを公開 :)


##Github Pages
Githubのリポジトリやアカウント単位でwebページを公開できます。
https://pages.github.com/

##Bitbucketでも出来ます。
ググってみても日本語で書かれた事例とかがあまり無かったので、あんまり知られてないのかなぁって感じですが、Github Pagesと同様のことが出来ます。
Github Pagesのようにリポジトリ単位でURLを持つことは出来ないみたいです。

###手順1 `ユーザー名.bitbucket.org`というリポジトリを作成する。
Bitbucket上で`ユーザー名.bitbucket.org`というリポジトリを作成しましょう。
私の場合はユーザー名がn0bisukeなので`n0bisuke.bitbucket.org`というリポジトリになります。
![](http://i.gyazo.com/17e5c59bf1494e14dc997be1a950bb57.png)

####アクセスレベルの設定
* プライベート [チェックをしましょう。]
　→ Webページは公開されますが、リポジトリページへのアクセスは限定されます。
* パブリック [チェックを外す。]
  → Webページもリポジトリページも公開されます。

###手順2 index.htmlを作ってpushしましょう。

```
$ git init
$ echo 'hello!!' > index.html
$ git add index.html
$ git commit -m "first commit"
$ git remote add origin git@bitbucket.org:ユーザー名/ユーザー名.bitbucket.org.git
$ git push origin master
```

###手順3 確認してみましょう

http://ユーザー名.bitbucket.org

にアクセスすればwebページが出来ていると思います。

例)
Webページ
http://n0bisuke.bitbucket.org/
リポジトリページ (公開設定)
https://bitbucket.org/n0bisuke/n0bisuke.bitbucket.org

* 参考: [BitbucketでWebサイトを公開する - Bitbucket ドキュメンテーション - Atlassian Japanese Documentation](http://go.shr.lc/1vPI1LA)
* 参考: [Publishing a Website on Bitbucket - Bitbucket - Atlassian Documentation](http://go.shr.lc/1vNwlJf)
Chrome extensionのcontent_scriptsから設定情報を読み込むことを試しました

#背景

もう一つのChrome extensionを作りました。これは何が出来るというと、Githubのウェブページでソースを閲覧するとき、空白（Space、Tab、Enter）などを特別の符号で表示してくれます。こういう感じです。

![Screen Shot 2014-06-18 at 下午5.15.45.png](https://qiita-image-store.s3.amazonaws.com/0/2179/b4318b6e-43ca-1470-672d-5d7bcbed172d.png)

また、入替え符号もカスタマイズできるように、Options画面を追加しlocalStorageに保存することで実装しました。

```
// manifest.js
  "options_page": "options.html",

```

設定画面はこんな感じ

![Screen Shot 2014-06-18 at 下午5.18.35.png](https://qiita-image-store.s3.amazonaws.com/0/2179/9cdd302e-20ae-78d7-635a-374944163e6a.png)

#問題発生

でも、実際に動作すると、content_scriptsからその設定が読み込めないです。

〜〜〜〜調べたところ、content_scriptsはTabページのコンテキストの中に動いているので、Extentionとは別のコンテキストです。

GoogleのDoc（ https://developer.chrome.com/extensions/messaging#simple ）によりますと、メッセージでデータを受け渡すことができます。

実装も簡単、

## 1. background.jsを追加（常に動くページが必須）

```
// manifest.js
  "background": {
    "scripts": ["background.js"]
  },
```
メッセージの受信を用意

```js
  chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
      if (request.action == "get_conf"){
        var conf = getConf();
        sendResponse(conf);
      }
    });
```

## 2. content_scriptからメッセージを送る

```js
  chrome.runtime.sendMessage({action: "get_conf"}, function(response) {
   // response はbackground.jsからのデータが格納されています。
  });
```


全ソースはこち　https://github.com/liubin0329/github-source-view-plugin
Mojoliciousアプリをプレフィックス付きで起動


Mojoliciousでアプリを開発後、本番運用時に別のパスで運用したい時の為に、prefixを付ける方法を実験してみた
結果からいうと[Mojolicious::Plugin::Mount](http://mojolicio.us/perldoc/Mojolicious/Plugin/Mount)を使った[Mojolicious::Lite](http://mojolicio.us/perldoc/Mojolicious/Lite)アプリを作成するとよいみたいです。

例では全てPSGIだが他の起動方法でも同じでいいはず

###上手くいった例

script以下の↓こんな感じのコードを準備します。
target_appが作成したアプリの起動スクリプト。

```perl:prefix.psgi
#!/usr/bin/env perl
use Mojolicious::Lite;
use Plack::Builder;

use FindBin;
BEGIN {
  unshift @INC, "$FindBin::Bin/../lib";
  $ENV{MOJO_HOME} ||= "$FindBin::Bin/..";
}

my $prefix = $ENV{MOJO_PREFIX} || "/prefix/";
plugin Mount => { $prefix => app->home->rel_file("target_app") };

get '/' => sub { shift->redirect_to($prefix); };

builder {
  require Mojo::Server::PSGI;
  Mojo::Server::PSGI->new(app => app)->to_psgi_app;
}

```

静的ファイルのパスはurl_for()を使う

```html:default.html.ep
<html>
 <head>
  <meta charset="utf-8" />
  <title><%= title %></title>

  %# '/js/jquery.js' → url_for('/js/jquery.js')
  %= javascript url_for('/js/jquery.js')
  %# '/css/main.css' → url_for('/css/main.css')
  %= stylesheet url_for('/css/main.css')
 </head>
 <body>
...
 </body>
</html>
```

<code>javascript</code>や<code>stylesheet</code>などのMojoliciousのタグヘルパーは
url_for()を使わないとプレフィックスを補完してくれないので
url_for()を使っておく必要がある

plackupで起動

```sh
% plackup script/prefix.psgi
```

プレフィックスを変更する場合、<code>/other_prefix/</code>の様に末尾に"/"を付けること

```sh
% env MOJO_PREFIX="/other_prefix/" plackup script/prefix.psgi
```

###ダメだった例

routesにbridgeを準備してアプリのrouteをbridge以下に格納する

```perl:Mojolicous_app

my $r = $self->mode eq "production" ? $self->routes->bridge("/prefix") : $self->routes;
$r->get("/")->to("target_ctl#sub1");
...
```

routeにはprefixが付くが静的ファイルにはprefixが付かない為、上手くいかなかった。
Python (pandas) 、 R 、 Pig でのデータフレーム取り扱い比較

昨日は [Apache Pig による基本的な文法 (1)](http://qiita.com/ynakayama/items/d2a8c125360e053d5a2f)と題して Pig を触ってみましたので、今日は当然ながら基本的な文法 (2) なのかと思いきや、[一昨日の記事](http://qiita.com/ynakayama/items/8f334b3314561c5d48af)の参考リンク先の[このあたり](http://d.hatena.ne.jp/yutakikuchi/20130107/1357514830)を見れば良いわけですから 1 回きりでなんと文法の話はおしまいです。突然の最終回です。

代わりに本日は、今まで取り扱ってきた pandas 、 R 、 Pig を使うにあたり、ある程度巨大なデータを扱うとするとどれくらい使用感が異なるか調べたいと思います。

## 検証対象としたデータ

次のような行の集合によって形成されたテキストファイルを考えます。キー項目は、日付、主キー、店舗名、時刻印、変換後時刻印、数値です。区切りはタブ区切りとします。

```
20140205 XXXXXXAABBCC    Shop7 1391568621      2014-02-05 11:50:21 +0900       0
```

これが約 1 億行、データサイズ 7.5 ギガバイトのデータが計算機にあります。今回はこの数値のデータについて平均を求めてみます。このタスクを pandas 、 R 、 Pig で取り扱うとするとどれが一番使いか調べます。

なお検証に利用した計算機の性能は Core i7 (Haswell) 、メモリ 32GB です。

## Python (pandas)

Python では pandas というデータフレーム操作用のライブラリがあります。特に制約がなければこれを使うのが良いでしょう。

```bash
$ pip install pandas
$ ipython

In [1]: import pandas as pd
In [2]: df = pd.read_table('sample.txt', header=None)
In [3]: df.ix[:,5].mean()
Out[3]: 305.4479883399822
```

pandas の特長は次の通りです。
* pd.read_table の時点でテキストファイルのデータがすべてメモリ上に乗る (メモリの使用量が約 8 GB 増える)
* pd.read_table の時点で待ち時間が発生する
* データフレームの操作は非常に高速
* df.ix[:,5].mean() の結果も割と高速に返る

つまり操作対象のデータをメモリに載せられるだけの性能が計算機にある場合は pandas が良いでしょう。


## R

データフレームの操作と言えば R です。

```R
df <- read.table("sample.txt", sep="\t")
colMeans(df[6])
#=>     V6
#  305.448
```

R の場合、 pandas と同様に read.table した時点でデータがメモリに載りますが、数ギガバイトのデータとなると明らかに pandas より遅い性能となりました。

また colMeans() で平均を算出しますが、統計関数も実行速度は pandas のほうに優位性がありました。

R の特長をまとめると次の通りです。
* Python の pandas と同様にデータフレーム確保のためにメモリを消費する
* 処理性能は pandas より遅い

## Pig

最後に Apache Pig です。今回は単一の計算機でテキストファイルを取り扱うので pig -x local を利用します。

```bash
df = LOAD 'sample.txt' USING PigStorage('\t') AS (date: chararray, key: chararray, shop: chararray, unixtime: int, humantime: chararray, times: int);

grouped = group df all; 
times_mean = foreach grouped generate AVG(df.times);

dump times_mean;

#=> (305.4479883399822)
```

Pig の場合は LOAD 及びその後の関数を入力してもメモリは確保されません。またインタラクティブシェルも即座に応答を返します。

最後の dump times_mean; をした時点ではじめて MapReduce が実行されます。

* MapReduce でデータを処理するので一気にメモリが確保されない
* pandas や R と異なり、集計するのに複数の手順が必要となる
* 処理対象のデータに対し計算機のメモリが足りない場合は Pig に優位性がある
* また分散処理をしてデータ分析したい場合も Pig を使うことになる

## まとめ

単一の計算機でデータを処理できる性能があるなら pandas 、データに対して計算機の性能が足りない場合は Pig を使うのが良いのではないかと思います。
カスタム投稿タイプを作成するサンプル


```functions.php

// カスタム投稿タイプ
add_action('init', 'register_post_type_and_taxonomy');

function register_post_type_and_taxonomy(){
  register_post_type(
    'works',
    array(
      'labels' => array(
        'name' => 'works',
        'add_new_item' => '新規追加',
        'edit_item' => '編集'
      ),
      'public' => true,
      'hierarchical' => true,
      'has_archive' => true,
      'menu_position' => 5,      
      'supports' => array(
        'title',
        'editor',
        'excerpt',
        'custom-fields',
        'thumbnail',
        'page-attributes'
      )
    )
  );
}

```

functions.phpでregister_post_typeメソッドを使用する。
定義したらadd_action('init')で起動するように設定する。

参照) http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_post_type
SmartyとPHPの変換チートシート


PHPで作ったviewファイルをSmarty化する必要があったので、
Smartyのチートシートを自分向けに作りました。
 
(このご時世、需要は無い気がする。)

環境によって使えないもののあるかも知れない(むしろ環境依存かも)のでコピペ注意です!笑


***
### 値の代入

```
//php
$loop_cnt = 1;

<!--Smarty-->
{assign var="loop_cnt" value=1}

<!--Smarty(新しいバージョンで使えるらしい)-->
{$loop_cnt = 1}
```

***

###foreach文

```
//php
foreach ($variable as $key => $value) {
	# code...
}

<!--Smarty-->
{foreach $variable as $key => $value}
   # code...
{/foreach}
```
***

###if文

```
//php
if($loop_cnt == 1){
	#code...
}else{
	#code...
}

<!--Smarty-->
{if ($loop_cnt == 1)}
	#code...
{else}
	#code...
{/if}
```

***

###ファイル読み込み (CodeIgniter)

```
//PHP-CI
$this->load->view('path/to/header');

<!--Smarty-->
{include file="path/to/header.html"}
```

***

### Viewへの受け渡し(CodeIgniter - Controller)
viewでは$hogeと$hugaが使える。

```
//PHP-CI
$data['hoge'] = 'hoge';
$data['huga'] = 'huga';
$this->load->view('path/to/index', $data);

<!--Smarty-->
$data['hoge'] = 'hoge';
$data['huga'] = 'huga';
foreach ($data as $key => $value){
	$this->smarty->assign($key, $value);
}
$this->smarty->display('path/to/index.html');
```

***
###コメント
```
//php

//これはコメントです。
/*これもコメント*/

<!--Smarty-->
{* これはコメントです *}
```
***

###配列
```
//php
echo mylist(
	array(
		'url'	=> 'liginc.co.jp',
		'page'	=> '404'
	)
);

<!--Smarty-->
{mylist(
	[
		'url'	=> 'liginc.co.jp',
		'page'	=> '404'
	]
)}
```

###文字列連結

```
//php .
echo $hoge.'です';

<!--Smarty |cat: -->
{$hoge|cat:'です'}
```

上手く変換してくれる置換サービスとかあれば楽なんですけどねぇ :(
makoで.mako(.html)に定義したrender関数を直接使う方法について

# makoで.makoに定義したrender関数を直接使う

テンプレートエンジンのhelper関数を定義した時に、テンプレート外から直接使いたいということがある。
[mako](http://docs.makotemplates.org/en/latest/) の場合はget_defを使う。

## makoを使う(前置き)

```bash
$ pip install mako
```

### 直接文字列を指定してレンダリング

直接文字列を指定してレンダリングする方法は以下の通り。

```py
# -*- coding:utf-8 -*-
from mako.template import Template
template = Template(u"""\
hello ${name}
""")

print(template.render(name="world"))
# hello world
```

### 別な場所にhelperを定義して呼ぶ。

別な場所に定義したhelper関数を別な場所(show.html)から呼ぶ方法は以下の通り。
以下のようなファイル構造の時に。

```bash
$ tree
.
|-- greeting.html
|-- hello_with_otherfile.py
`-- show.html
```

TemplateLookupにtemplateを探す際に利用するトップレベルのパスを登録しておく。
そしてshow.html テンプレート越しにgreeting.htmlのhelloを呼んでいる。

hello_with_otherfile.py

```py
# -*- coding:utf-8 -*-
from mako.lookup import TemplateLookup
import os.path
here = os.path.abspath(os.path.dirname(__file__))

lookup = TemplateLookup([here])
template = lookup.get_template("show.html")
print(template.render(name="world"))

# hello world
```

show.html

```
<%namespace file="./greeting.html" name="g"/>
${g.hello(name)}
```

greeting.html

```
<%def name="hello(name)">
hello ${name}
</%def>
```

## makoで.makoに定義したrender関数を直接使う

やっと本題。
makoで.makoに定義したrender関数を直接使う方法。
今回の場合ではgreeting.htmlで定義したhello関数が使いたい関数。
これは以下の様にしてget_defを使う。

```py
# -*- coding:utf-8 -*-
from mako.lookup import TemplateLookup
import os.path
here = os.path.abspath(os.path.dirname(__file__))

lookup = TemplateLookup([here])
hello = lookup.get_template("greeting.html").get_def("hello")

print(hello.render("world"))
# hello world
```
Mavericksにしたらターミナルが

Mavericksにアップグレードしたらターミナルが立ち上がらなくなって焦ってしまった。
いや、正確にはターミナルを立ち上げても「プロセスが終了しました」と表示されてプロンプトから入力できなかった。

よく見たら
/usr/local/bin/zsh no such file or directory
zshがそこにないって書いてあった。zshの場所を探そうにもターミナルからできないし...

何とかzshの場所を探し当てたので、
ターミナルの環境設定 => 起動 で設定できるので、コマンド(完全パス)に
/bin/zsh
と入れ直したら解決した。
www.php.netのキーボードショートカット一覧


[www.php.net](http://www.php.net)のキーボードショートカットをリストアップしておく。
（2014/06/18確認）


## 標準キーボードショートカット

ヘルプに表示されるキーボードショートカットです。

| キーボード入力 | アクション |
|:---:|:---|
| ESC |ヘルプ・検索結果を閉じる|
| ? |ヘルプを表示|
| j | 次のヘッダーに移動（一般ページ）<br>次のメニュー項目にフォーカス（ドキュメントページ） |
| k | 前のヘッダーに移動（一般ページ）<br>前のメニュー項目にフォーカス（ドキュメントページ） |
| gp | 前のページへ移動（\<link rel="prev"\>が設定してあるページに限る） |
| gn | 次のページへ移動（\<link rel="next"\>が設定してあるページに限る） |
| G | ページ最下部へ移動 |
| gg | ページ最上部へ移動 |
| gh | php.netトップへ移動 |
| gs | ページ内のリンクを検索する |
| / | 検索フォームにフォーカスする |


## 隠しキーボードショートカット

ヘルプには表示されないキーボードショートカットです。

| キーボード入力 | アクション |
|:---:|:---|
| rotate（改行） | 画面を右に90度回転させる |
| mirror（改行） | 画面を左右反転させる |
| I hate PHP（改行） | [python.org](http://python.org)へ移動 |
| I love PHP（改行）| 「Live long and prosper !（長寿と繁栄を！）」が表示される。<br>（※スタートレックのバルカン人の挨拶） |
| logo（改行） | 左上のロゴがランダムに変わる |
|↑↑↓↓←→←→ba（改行）<br>（コナミコマンド）|左上のロゴが???に変わる（コントラかな？）|
SwiftでCGPoint(x: 0, y: 0)と書くのが面倒な場合


Swiftでは、構造体またはクラスのイニシャライザ・インスタンスメソッド等の呼び出し時に、外部引数名（External Parameter Names）を書く必要があります。

**構造体CGPoint型のイニシャライザ呼び出し例**

```swift:
var test = CGPoint(x: 0, y: 0)
```

Objective-Cを引きずっているかのような冗長なこの書き方ですが、ちょこっと工夫すれば、短く書く事が出来そうです。

```swift:test.swift
import CoreGraphics

extension CGPoint {
    init(_ x: CGFloat, _ y: CGFloat) {
        self.x = x
        self.y = y
    }
}

var test1 = CGPoint(x: 0, y: 0) // 標準のイニシャライザ
var test2 = CGPoint(0, 0) // 拡張したイニシャライザ
```

通常外部引数名を書く場所にアンダースコア(_)を記述しておくことで、無名にすることができるようです。


賛否両論はありそうな気がしますが、`CGPoint`や`CGSize`ぐらいはこうした書き方でも許されるんじゃないかなと思います。

※コンビニエンスの方が良かったかな？
Asteriskで050plusを使う(外線発信)

[Asteriskで050plusを使う(registerまで) - Qiita](http://qiita.com/tukiyo3/items/ef363b798aafb3027a2b)の続き。

# 外線発信の設定

```diff:extensions.lua
 default = {
   -- by default, do the demo
   include = {"demo"}; 
+  ["4"] = function()
+          app.Dial("SIP/09012345678@050plus")
+  end;
+  ["5"] = function()
+          app.Dial("SIP/09012345678@050plus,1")
+  end;
+  ["3"] = function()
+          app.Dial("SIP/09012345678@050plus,10")
+  end;
 };
```

* `4`にダイヤルすると`09012345678`に発信。
* `5`にダイヤルすると`09012345678`に発信。相手が取る取らないにかかわらず1秒で終話。
* `3`にダイヤルすると`09012345678`に10秒間発信。
  * 終話すると"demo"の`3`が開始する。


* 自分自身の050番号にかけてみると、「ただいま電話にでることが出来ません」ガイダンスが流れる。


# Asteriskコンソールからダイヤル

```bash:4にダイヤル
$ asterisk -r
*CLI> console dial 4
```

# ターミナルからダイヤル

```bash:4にダイヤル
$ asterisk -x "console dial 4"
```
Golangで画像処理をしたい

(処理自体は精度低い or 間違っているかも)

imageパッケージが便利

ちょっとハマったのは `image/jpeg`をimportしないとjpegのDecodeが動かないということ(pngなら`image/png`)

Image structは`.At(x, y)`で指定したpixelの色データが取れるのが便利だ

```go
package main
 
import (
	"fmt"
	"github.com/nfnt/resize"
	"image"
	_ "image/jpeg"
	"os"
)
 
func main() {
	file, err := os.Open("image.jpg")
	defer file.Close()
	if err != nil {
		fmt.Println(err)
		return
	}
	img, _, err := image.Decode(file)
	if err != nil {
		fmt.Println(err)
		return
	}
 
	// resize for performance
	img = resize.Resize(36, 0, img, resize.Lanczos3)
 
	hist := getHistgram(img)
 
	max := 0
	// find most appered color
	for _, val := range hist {
		if val > max {
			max = val
		}
	}
	r, g, b := int2rgb(max)
	colorCode := "#" + dec2hex(r, 2) + dec2hex(g, 2) + dec2hex(b, 2)
 
	// most appered color in image
	println(colorCode)
}
 
func getHistgram(img image.Image) []int {
	hist := make([]int, 1000000)
 
	// get bounds
	rect := img.Bounds()
	// color reduction
	for i := 0; i < rect.Max.Y; i++ {
		for j := 0; j < rect.Max.X; j++ {
			r, g, b, _ := img.At(j, i).RGBA()
			i := rgb2int(int(r), int(g), int(b))
			hist[i]++
		}
	}
	return hist
}
 
func dec2hex(n, beam int) string {
	hex := ""
	str := "0123456789abcdef"
	for i := 0; i < beam; i++ {
		m := n & 0xf
		hex = string(str[m]) + hex
		n -= m
		n >>= 4
	}
	return hex
}
 
func rgb2int(r, g, b int) int {
	return (((r >> 5) << 6) | ((g >> 5) << 3) | ((b >> 5) << 0))
}
 
func int2rgb(i int) (r, g, b int) {
	return ((i >> 6 & 0x7) << 5) + 16, ((i >> 3 & 0x7) << 5) + 16, ((i >> 0 & 0x7) << 5) + 16
}
```
Git rebaseの影響で同内容のコミットが量産される件について

## 前提

feature/hoge
feature/fuga
を並行して開発中。
feature/fugaはfeature/hogeの実装を前提としており、開発着手前に

	git rebase feature/hoge

を行っている。
(feature/hogeのコミットは hogehoge1, hogehoge2)
(feature/fugaのコミットは hogehoge1, hogehoge2, fugafuga1, fugafuga2)

-
### 問題1: feature/hogeを取り込んだブランチ"feature/fuga"の実装

ブランチ"feature/hoge" で実装を進めている。

	git commit -am "hogeの実装その3"

こうしてコミットhogehoge3が作成された。

ここで問題。
ブランチ"feature/fuga" にも、コミットhogehoge3を反映したい。
このとき、どういう操作をすればいい？
feature/fugaにて

	git rebase feature/hoge

を再度行えばいい？
（つまり、
　hogehoge1, hogehoge2, fugafuga1, fugafuga2
　から
　hogehoge1, hogehoge2, hogehoge3, ffuuggaa1, ffuuggaa2
　にする）

ただ、feature/fugaがローカルにのみ存在している場合はそれでもいいが、
既にリモートにpushされていた場合、コミットのSHA-1が変化してしまい、
同内容のコミットが複数現れることになってしまうのでは…？
fugafuga1とffuuggaa1の内容は同じだが、SHA-1が違うので別のコミットとみなされてしまうはず。

…えーと、これについて「そりゃそうだ、やっちゃダメだよ」って一刀両断したい方、もうちょっと待って。最後まで読んでいただきたい。


--
### 問題2: developを取り込んだブランチ"feature/fuga"の実装

feature/hogeの実装は、hogehoge3で完了とする。
これをリモートのdevelopへとmergeしたい。
developのコミットも進んでいるので、グラフを綺麗にするために、

	git rebase develop
	git push
	（GitHubにてプルリクをmergeして、）
	git hf finish

という手順を踏み、無事にdevelopに機能が取り込まれた。

この手順は特に妙なことはしていない…ですよね？

ただ、ここでふたたび問題。
これ以降、feature/fugaにてdevelopの変更を取り込みたいとき、どうすれば良い？
feature/hogeのコミットは、feature/hogeをpushしたときのrebaseにより、
hogehoge1, hogehoge2,hogehoge3
から
hhooggee1, hhooggee2, hhooggee3
に変化している。
この状態で、feature/fugaにて

	git rebase develop

しようとすると、feature/fugaのコミットは、

　hhooggee1, hhooggee2, hhooggee3, hogehoge1, hogehoge2, hogehoge3, ffuuggaa1, ffuuggaa2

となってしまうのでは？

-
rebase絡みでの作業で、同内容のコミットが複数現れることが多くあり、
何がその原因になっているのかうまく頭の中で整理しきれておらず、認識が間違ってるかもしれません。
正しい操作はどうすべきで、何をするときには気をつければいいのか…という点について、
ご教授願えたら幸いです。

## Q.そもそもpush済みのブランチでrebaseするなって話じゃない？

A.そうなんですけど。

以下の記事がよくまとまってますね。読みましたよ。

[git rebase に関するメモ - Life like a clown](http://d.hatena.ne.jp/tt_clown/20130426/git_rebase)

>rebase に関しては、まだ使いどころが今一つ掴めないでいるのですが、明快な指針が一つ示されていました。

>>あぁ、このすばらしいリベース機能。しかし、残念ながら欠点もあります。その欠点はほんの一行でまとめることができます。
公開リポジトリにプッシュしたコミットをリベースしてはいけない
この指針に従っている限り、すべてはうまく進みます。もしこれを守らなければ、あなたは嫌われ者となり、友人や家族からも軽蔑されることになるでしょう。
[Git - リベース](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%99%E3%83%BC%E3%82%B9)

>なぜ、公開リポジトリに push した commit に対して、後から rebase を行ってはいけないのかと言うと、「（rebase で作られた commit は元の commit と同内容でも別の commit となるため）rebase してしまうと push できなくなる」と言う理由のようです。何故、push できなくなってしまうのかについては [こわくない Git](http://www.slideshare.net/kotas/git-15276118) と言うスライドで分かりやすく解説されていますので、このスライドの 104 ～ 146 枚目を何度か追うと理解できると思います。


んー、全部ローカルで作業して最後にpushってフローが守れるならいいんだけれど。

- pushされたブランチではrebaseしてはいけない
- push前にはログを綺麗にするためにrebaseを行う必要がある

このふたつの問題が、それぞれ矛盾していて、どう運用すればいいのかわからないっていうのが現状です。
WIPとして途中のコードをメンバーに見てもらいつつ実装進める場合、最後までpushしないってわけにはいかない。
また、随時developの内容を反映しつつ実装を行うためには、最後のpushの時までrebaseを行わないってわけにもいかない。

ここいら、皆さんどうやって対処してるんだろうなーというのが疑問。
AWS認定ソリューションアーキテクトになってきた

とはいってもアソシエイトレベルの方ですが、合格したので初qiitaに！
（一年以上前の投稿です。誤記を修正したらqiitaさんが注意を表示してくれなったので念のため。）

# AWS認定ソリューションアーキテクトって？
AWS公認の資格です。[AWS認定プログラム](http://aws.amazon.com/jp/certification/)というものがあり、そのうちのアーキテクト向け(?)の資格です。

## アソシエイトレベルって？
アーキテクト向けの試験のうち一番はじめに受けることになる試験です。私にはけっこう難しく感じた試験でした。
難易度は[こちら](http://aws.amazon.com/jp/certification/certification-levels/certified-solutions-architect-associate/)のページにあるサンプル問題を参考にしてみてください。
この問題の選択肢も含めて全部簡単に答えられる方は、試験も簡単に合格できる方だと思います。

# 試験の特徴
* 直訳っぽい表現に苦しんだ
  * 今公開されているサンプル問題はそうでもないですが、例えばサンプル問題のQ5の選択肢Eのホストが何を指すのかがわからないような書かれ方をしていたりしました。
     * (この問題の場合、VPC内だとEIPの紐付が解除されないことを知っていれば消去法で回答できますが…)
* 表記のゆれ(?)が気になった
  * ゆれではないのかもしれないですが、同じものを表現するのに別の文言が使われていて混乱しました
* 理解してないと答えられない
  * なんとなくわかってるレベルだと答えられない問題が大半

もうちょっと書きたいけど規約違反とかになるとやなのでこの辺りでstop

# 私のスペック
AWSの全部のサービスは使ったことはなかったです。

1/3位のサービスはAWS SDK for RubyやCLIを使ってAPIをがっつりたたいたことがある。半分以上はマネジメントコンソールのどこをどうすればやりたいことができるかは理解できている。

サービスの概要は知っているけど使ったことのないサービスがあったり、概要すらも理解できていないものがあったりもする状態でした。
なので、AWS公式のトレーニングを受けたいなーと感じていました。
そこで、受けたいと言ってみることに。

## Architecting on AWSのトレーニングしてきた
http://aws.amazon.com/jp/training/course-descriptions/architect/

* 行きたいと言ったら快く行かせてくださったボスsに感謝です
* Architecting on AWSのトレーニングを受けてほぼ全サービスの使いうときを使い方は理解できました
* AWSの思想のようなものを中の人から直接聞くことができたのはよかったです
* トレーニングを受けてから日があいてしまうと忘れてしまうことが多くあるので、トレーニングを受ける場合はトレーニング直後に試験を受けることを強くオススメします


# 受験する人がやっといた方がいいなと思ったこと
どんなプロダクトを作りたいときにどんなAWSのサービスを利用したら良いのか理由も添えて答えられる状態になっていないと合格できないなーと感じました。
そこで、やっておいたほうがいいと思ったことを残しておきます。

## マイスターシリーズを頼る
http://aws.amazon.com/jp/aws-jp-introduction/

* 似たようなサービスで違いを理解できていないサービスについてはここの資料を見つつ手を動かしつつ理解しておくことをオススメします
* 試験に関係なく困ったときにここにくるとほしい情報は得られることが多いです
* ここのスライドたちはとてもとても助けられ(ています)ました

## ホワイトペーパーやドキュメントを確認しとく
http://aws.amazon.com/jp/whitepapers/

* ディザスタリカバリについて推奨されているものを理解できていなかったのでホワイトペーパーを頼りました

https://aws.amazon.com/jp/documentation/

* よく使われているサービスほど詳しく聞かれそうな気がしたのでよく使われているサービスは公式ドキュメントでSLAなどを確認しておきました


# おもったこと
1発合格できなかったので、受かることが目的になりつつあったことはかなり後悔してます。。。
この資格をとれたから資格を持っていない人より詳しくなれたとは感じないものの、AWSの全体観を掴むにはいいものだと感じました。
あと、何となくな理解度でも合格できる資格もありますが、この資格はちゃんと理解していないと合格できない問い方ですごいなーと思いました。
久々に認定資格のページを見に行くと、日本語のサンプル問題があっていつの間に！といった驚きもありつつこの辺りでおわりに。
誰か試験を受ける方のお役に立てれたら幸いです！
ここまで読んでくださった方、ありがとうございました！




----


2014/06/23 追記

この辺り、読んでおくことをオススメします！

* http://www.slideshare.net/c95029/aws-20829943
* http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/InstanceStorage.html
bitly APIの使い方

# はじめに
[bitly](https://bitly.com)のWeb APIを使ってみたら便利だったのでメモ。
お好みのスクリプトと組み合わせると自動化できて作業効率UPします。

APIドキュメントは↓です。
[http://dev.bitly.com/api.html](http://dev.bitly.com/api.html)

# APIキーの取得
WebAPIを使用するのに必要なoauth2のAPIキーを取得しましょう。

1. bitlyにログインして[https://bitly.com/a/settings/advanced](https://bitly.com/a/settings/advanced)にアクセスします。
2. [OAuth Applications]の[here]をクリックします。
3. [Generic Access Token]でパスワードを入力し[Generate Token]をくリックします。
4. 生成されたAPIキーを控えておきます。（忘れてしまったら作り直し）

なお、[https://bitly.com/a/settings/advanced](https://bitly.com/a/settings/advanced)にはLegacy API Keyが表示されていますが、これだと一部のAPIしか使用できません。


# APIで短縮URLを作成する
`shorten`を使って短縮URLを作成します。
```
https://api-ssl.bitly.com/v3/shorten?access_token=ACCESS_TOKEN&longUrl=短縮したいURL
```

`ACESS_TOKEN`と`短縮したいURL`を置き換えてください。
ブラウザに打ち込めばそのまま実行できます。

```:戻り値
{ "status_code": 200, "status_txt": "OK", "data": { "long_url": "https:\/\/bitly.com\/a\/oauth_apps", "url": "http:\/\/bitly.is\/xxxxxxx", "hash": "xxxxxxx", "global_hash": "xxxxxx", "new_hash": 1 } }
```

ステータスコードや、生成された短縮URLが返ってきます。

何らかのスクリプトで短縮したいURLを動的にセットして実行すると楽ちんです。
わたしは他にも事情があってJava×SeleniumでWevdriverのgetメソッドを使ってブラウザで実行させています。

# APIで細かいアクセスログを取得する
[https://bitly.com/a/stats](https://bitly.com/a/stats)では30日より前の結果や、過去の日付を指定して時間単位のクリック数を見るといったことができません。
ちょっとした分析や報告にも不便なので、細かいログを取り出して見ました。


`link/clicks`を使って指定した短縮URLのログを取得します。
```
https://api-ssl.bitly.com/v3/link/clicks?access_token=ACCESS_TOKEN&unit=day&units=52&unit_reference_ts=1402498800&rollup=false&link=SHORT_URL&timezone=Asia/Tokyo
```

例によってACCESS_TOKENとSHORT_URLは置き換えてください。
いろいろパラメータを指定していますが、こここでは6/12を起点として過去52日分のログを取得しています。
起点の指定は`unit_reference_ts`に日付をエポック秒に直した値をセットします。
何日分欲しいかの指定は`units`に日数をセットします。

結果はJSONで返ってきます。※見やすいように整形しています。

```:戻り値
{"status_code": 200, "data": {
	"units": 52, 
	"unit_reference_ts": 1402498800, 
	"tz_offset": 9, 
	"unit": "day", 
	"link_clicks": [
		{"dt": 1402498800, "clicks": 5}, 
		{"dt": 1402412400, "clicks": 20}, 
		{"dt": 1402326000, "clicks": 4}, 
		{"dt": 1402239600, "clicks": 0}, 
		{"dt": 1402153200, "clicks": 1}, 
		{"dt": 1402066800, "clicks": 0}, 
		
		～中略～ ※52日ぶんなので、52個入っている
		
		{"dt": 1398092400, "clicks": 0}]
	}, 
"status_txt": "OK"}
```
このままだとなんなので、わたしはGsonで分解してCSV形式で出力したものをエクセルで開いて、ピボットテーブルを使って集計したりグラフを作成したりしています。

パラメーターの紹介です。

* link - bitlyの短縮url
* unit - クリック数のカウントを取得する単位。minute, hour, day, week or month, default: day
* units - 単位当たりの数を指定する。unitがdayでunitsが30なら30日分のクリック数を返す。-1だと全部出すけど、クリックがあった日しか出てこずグラフを作ったりしにくいので注意。
* timezone - タイムゾーン。
* rollup - trueまたはfalseを指定。デフォルト（true）だと集計値を返す。* falseだとunit毎の数を返す。
* limit - 1 to 1000 (default=100).
* unit_reference_ts - 基準となるタイムスタンプ。デフォルトは現在時間。5月のクリック数が知りたければ、5/31を指定してunitをday、unitsを31にする
Consulのノードやサービス検出でTTL値の設定

## 概要
[Consul](http://consul.io) の [v0.3.0](https://github.com/hashicorp/consul/blob/master/CHANGELOG.md#030-june-13-2014) から、DNS インターフェースの問い合わせに対して TTL ( Time To Live ) の指定が出来るようになりました。

以下、TTL 設定方法および検証方法です。

## Consul で TTL 設定を行う目的
Consul ノードやサービスの問い合わせ時に、DNS キャッシュを持たせることができるようになりました。従来、Consul の DNS インターフェースに対する問い合わせには、TTL がありませんでした。そのため、問い合わせ毎に、都度 Consul に対するアクセスが発生し、システムに対する負荷や、トラフィックが増えるという課題がありました。

そこで、Consul は DNS インターフェースに対する問い合わせがあった場合に、TTL 値を返すことができます。DNS クライアントは TTL が切れるまで問い合わせを行わないため、余分なトラフィックが発生しません。デフォルト値は、これまでどおりの TTL=0 であり、キャッシュしません。

一方、TTL が有効になることで、DNS を通した障害検出・サービス検知が遅れる懸念もあります。その場合でも、BIND 等の DNS サーバを通さず、直接 Consul の DNS ポート（標準は 8600）を参照すると、随時最新の情報を確認できます。一般的なクライアントは通常通り DNS を通して、クリティカルな運用が必要な場合は、直接 Consul に問い合わせるという使い分けが出来ます。

なお、Consul 自信に対する DNS 問い合わせのトラフィックや負荷を分散するための方法として、v.0.3.0 からは Consul ノードもクエリの応答ができる [Stale 読み込み](http://www.consul.io/docs/guides/dns-cache.html)が実装されていますが、本稿では割愛します。

## 設定および検証方法

httpd サービスの検出に TTL を用いてみます。httpd (Apache) が停止しても、即座に反映して Consul のサービスから消えるのではなく、TTL の期間は、情報が DNS 上で保持されることを確認します。

なお、事前準備として、BIND の設定も行います。これは、DNS の問い合わせは Consul のポートに対して直接行えないので（TTLを指定しても無効になるため；バグ？仕様？）、BIND の IP Forwarding を使った設定を有効にしておきます。

* 関連 ... Consul の TTL 反映を確認するためには、BIND が楽
 *  [Consulの名前解決にDNS Forwardingを使う方法 - Qiita](http://qiita.com/zembutsu/items/ea05fbeff06cafb5ec2e)

Cosul 側では、JSON ファイルで指定を行います。Consul 起動時、`-config-dir=/etc/consul.d/` のように指定し、中で `dns_config.json` を作成します。以下の例は、Consul のサイトのサンプルに手を加えたものです。

```/etc/consul.d/dns_config.json
{
    "dns_config": {
        "service_ttl": {
            "*": "5s",
            "web": "30s"
        }
        "allow_stale": false ,
        "max_stale":   "5s",
    }
}
```
ここでは、`web`という名前の Consul 上のサービスに対して `30s`(秒)の TTL を設定し、それ以外のサービスは `5s` を指定します。ファイル設置後は、Consul を再起動して、設定を有効化します。

次に dig で問い合わせます。

```
$ dig web.service.sakura.consul

(略)
;; QUESTION SECTION:
;web.service.sakura.consul.     IN      A

;; ANSWER SECTION:
web.service.sakura.consul. 30   IN      A       192.168.39.13
web.service.sakura.consul. 30   IN      A       192.168.39.11
```
初回はこのように、TTL 値は 30 秒と分かります。

少し時間をおいて再度問い合わせると

```
;; ANSWER SECTION:
web.service.sakura.consul. 21   IN      A       192.168.39.11
web.service.sakura.consul. 21   IN      A       192.168.39.13
```
TTL が 21 秒まで減少しています。

この状態で、片方の Apache を停止します。Consul 上では、10 秒間隔でサービス監視しているので、Fail を検出していますが、DNS 上は TTL が 0 秒にカウントするまで、両方のサーバが見え続けます。

30秒経過すると、

```
;; ANSWER SECTION:
web.service.sakura.consul. 30   IN      A       192.168.39.11
```
このように一台しか見えなくなります。

その後、Apache を起動しなおすと、ただちに Consul 上ではノードが検出され、再び dig を行うと、両方のサーバの存在が確認できるようになります。

## 参考
* DNS Caching - Consul
 * http://www.consul.io/docs/guides/dns-cache.html
Dockerのbase box、（http経由で）epel-releaseとかが入らない

具体的には

```bash
$ rpm -ivh https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
```

みたいなことをしても

```
Retrieving https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
error: skipping https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm - transfer failed
Retrieving https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
2014/06/18 05:44:33 The command [/bin/sh -c rpm -ivh https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm] returned a non-zero code: 1
```

こんな感じのエラーメッセージが出て止まる。

### なんで

話は単純で、 `curl` が入っていないからでした...

```dockerfile
RUN yum -y install curl
RUN rpm -ivh https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
```

こんな感じで大丈夫そう。
Xcode6 Beta2が出ました！ Swift開発で絶望的な安定性のBeta1から乗り換えよう！


![GitFav_—_VCReposViewController_swift.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/83829d1e-bff2-f333-a52f-78feb440fa64.jpeg "GitFav_—_VCReposViewController_swift.jpg")


WWDC2014から２週間足らずでXcode6のBeta2がリリースされました。
この短期間にBeta2をリリースしたAppleの本気度が伺えます。（Buggyだったとも言えます笑）

早速ダウンロードしてみました。

## ダウンロード

ダウンロード容量は2.3GBでした。昔はAppleの配信サーバがショボくてなかなかダウンロードできなかったですが、１５分程度でダウンロードが完了しました。展開後の容量は5.16GBでBeta1より100MB小さくなっています。インストールするとBeta1とBeta2は別々の異なるアプリとしてインストールされます。上書きされることはありません。親切ですね。

## Swift的な安定性は？

Xcode Beta1でSwiftの開発を行うのは絶望的でした。
以下の３点が怒涛のごとく発生し、プログラマーに大いなる試練を与えていました。

+ 突然クラッシュする
+ コードのシンタックスハイライトがされなくなる
+ 入力補完ができなくなる

１５分ほど触った感触ですと上記の事象はまったく再発していません。
この２週間の間に急ピッチで改善をされたのでしょう。Appleさん素晴らしいですね！
これでガッツリSwiftの開発ができそうです。

## Known Issues in Xcode6 Beta2 / Swift Language

リリースノートを見るとSwift言語では何点か既知の問題が明記されています。
特に以下２点が気になるところです。

```
• Access control (public/private members) is not enabled in this seed. 
• It is not possible to build static libraries which contain Swift code in this release.
```

今後バージョンアップでpublic/privateスコープの設定と、スタティックライブラリの作成が可能になりそうです。
CoreDataのSQLを出力する


SQLiteを永続ストアにしている環境で、CoreDataがどんな風にアクセスしているか知りたかったので設定してみました。


# ターゲット選択のプルダウンからEdit Schemeを開く

![スクリーンショット 2014-06-18 14.25.03.png](https://qiita-image-store.s3.amazonaws.com/0/29860/ce9aa27a-98c9-171a-b31d-6afef162654d.png "スクリーンショット 2014-06-18 14.25.03.png")


# Argumentsを開く

`Run`を選択してArgumentsタブを開く。

![kobito.1403069314.205745.png](https://qiita-image-store.s3.amazonaws.com/0/29860/a2d61c35-57dd-a4d3-d5d8-1c7579affcb0.png "kobito.1403069314.205745.png")


# 引数を追加

下にある＋ボタンをクリックしてアプリケーション起動時の引数を追加。引数の内容は次のようにする。

```
-com.apple.CoreData.SQLDebug 1
```

![kobito.1403069652.169031.png](https://qiita-image-store.s3.amazonaws.com/0/29860/a75bf14d-c5f0-90eb-88ac-a167a8dfc99e.png "kobito.1403069652.169031.png")


----

以上で次回起動時にデバッグログが出力されるようになる。

```text
2014-06-18 13:17:03.601 xxx[31065:60b] CoreData: sql: SELECT t0.Z_ENT, t0.Z_PK, Z_FOK_REPORT FROM ZLMABSTRACTREPORTCONTENTOBJECT t0 WHERE  t0.ZREPORT = ? 
2014-06-18 13:17:03.601 xxx[31065:60b] CoreData: details: SQLite bind[0] = (int64)41
2014-06-18 13:17:03.602 xxx[31065:60b] CoreData: annotation: sql connection fetch time: 0.0004s
```

----

参考

* [Core Data Performance](https://developer.apple.com/library/ios/documentation/cocoa/conceptual/coredata/Articles/cdPerformance.html)
* [Troubleshooting Core Data - Debugging Fetching](https://developer.apple.com/library/ios/documentation/cocoa/conceptual/coredata/Articles/cdTroubleshooting.html#//apple_ref/doc/uid/TP40002320-SW1)
* [CoreDataのSQLiteデバッグモード](http://blog.morizotter.com/2014/01/09/coredata-sql-debug-mode/)
[Swift] ちょこちょこハマったメモ


ハマったことをちょこちょこメモしていきます。
なので随時update気味。


-----------

## `ProjectName-Swift.h`を`.h`で読み込もうとしてエラー

ファイルは生成されているのになんでだーと思っていたら、どうも`.m`ファイルのほうで読み込まないとダメな模様。
知らないと謎いエラーでハマる。

-----------

## `NSStringFromClass`から生成される文字

xibファイルの読み込みに、ファイル名を指定するときにそのクラス名を利用して読み込む、ということをやる場合があると思います。
その場合、Swiftにすると、`NSStringFromClass(Hoge.self)`のように指定することになりますが、これだとうまく行きません。

理由としては、これで生成される文字列はクラス名のみではなく、モジュール名も付加されたものになるからです。

```swift
var nibName: String = NSStringFromClass(Hoge.self) // => "ModuleName.Hoge"
```


-----------

## 配列を特定の個数で初期化

与えられた引数の数だけ配列の中身を初期化したい場合の処理。

```array-init.swift
var a: Double[] = []

// ちなみにbeta3から以下のように書式が変わった模様
// var a: [Double] = []

// -----------

a = Array<Double>(count: num, repeatedValue: Double())
```


-----------

## クラス（`[NSString class]` etc）を渡す方法

クラス自身の参照を渡す必要があるときに、どうやるんだろうと思って調べたのでメモ。
答えは`self`プロパティを利用する、でした。
[詳細はStackOverflow](http://stackoverflow.com/questions/24049673/swift-class-introspection-generics)で。

```class-ref.swift
class TestClass {
    var name: String!
    @required init() {
        self.name = "name!"
    }
}

var t = TestClass.self

// 参照からインスタンスを生成する場合は、initに@requiredが必要
var t2 = t()
println(t2.name)
```

-----------

## Objective-CでSwiftのクラスを利用する際の注意点

通常のSwiftクラスを使う場合は自動生成される<#ProductName#>-swift.hファイルを`import`すればOK。
しかし、そのSwiftクラスがさらにObjective-Cのクラスを継承している場合は注意が必要。
上記の<#ProductName#>-swift.hを`import`する前に、上記の継承元のクラスを宣言したヘッダファイルを`import`しておかないと`Cannot find interface`エラーが出て怒られる。
（冷静に考えれば当然だけど、ふと忘れそうなのでメモ）


## Objective-CのenumをSwift側で使う

公式ドキュメントから引用すると、

```enum-sample.m
typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
	UITableViewCellStyleDefault,
	UITableViewCellStyleValue1,
	UITableViewCellStyleValue2,
	UITableViewCellStyleSubtitle
};
```

こう定義されたものは、

```enum-sample.swift
enum UITableViewCellStyle: Int {
	case Default
	case Value1
	case Value2
	case Subtitle
}
```

こう解釈されるらしい。
そのため、もしSwift側で利用する場合は、Objective-C側の名称ではないので注意。

```enum-sample2.swift
var type = UITableViewCellStyle.Default
```


## メソッド引数のラベルを無名にする「_」

インスタンス生成時、コンストラクタの引数の`label`は必須だが、定義時に`_`を使うと`label`がいらなくなる。

```under-score.swift
class Hoge {
	var name: String?
	init(name: String) {
		self.name = name
	}
}

// 基本はlabel「name:」が必要。
var hoge: Hoge = Hoge(name: "namae")
```

```under-score2.swift
class Hoge {
	var name: String?
	init(_ name: String) {
		self.name = name
	}
}

// initの宣言時に`_`をつけるとlabelを省略できるようになる。
var hoge: Hoge = Hoge("namae")
```

この辺りはObjective-Cのものとある程度互換性を持たせようとしたのでしょうか。
ただ、メソッド内部で宣言した関数に関しては`label`は必須ではないようです。
おそらく、内部関数は外部に公開されないから、と考えています。（あくまで推測）

```non-label.swift
class Hoge {
	var name: String?
	init(name: String) {
		self.name = name
	}
	func doMethod() {
		func add(a: Double, b: Double) -> Double {
			return a + b
		}

		println("10.0 + 20.3 = \(add(10.0, 20.3))")
	}
}
```

-----------

## ランダムな数字を作る

```random.swift
// 1〜6を作る
var num = arc4random_uniform(UInt32(6)) + 1
```
The Swift Prgramming Language ~Control Flow~

The Swift Programming LanguageのLanguage Guideの"Control Flow"をざっとまとめたものです。

Objective-Cを始め、既に他の言語を習得されてる方向けです。

[前章 Collection Dictionary](http://qiita.com/hmu29/items/9095be71496eff368bad)

# 前提

条件式の結果は、Bool型の値の必要がある。

  > if 1 ではなく 
  > if true や if 1 == 1 {} 

と書く必要がある

# For-In 

```Swift
for idx in 1...5 {
  println("\(idx)") // 1 2 3 4 5が出力される
}

idx // コンパイルエラー。変数が定義されていない。
```

- idxは定数(let宣言)されている。letは省略可能.
- idxはforのブロックステートメント中のみ有効で、ブロックを抜けると参照できない。
- idxが不要な場合は、_で省略可能.

```Swift
for _ in 1...5 {
}
```

## 配列の例

```Swift
let values = [1, 2, 3, 4, 5]
for val in values {
  println("\(val)")
}
```

## 辞書の例

```Swift
let values = ["A":1, "B":2]
for (key,val) in values {
}
```

## 文字列の場合

```Swift
for ch in "Hello" {
  ch // chはCharacter型
}
```

# For-Condition-Increment

()なしで書ける事を除いて、C#やJavaと同じ.

# While

C#やJavaと同じ.

# Do-While

C#やJavaと同じ.

# If

C#やJavaと同じ。

# Switch

- caseの対になるbreakは、文が無い場合を除いて不要.
- ブロック{}を利用しなくてもcase内で、変数を定義できる。
- defaultは必須.無いとコンパイルエラーになる.
- case文の値は定数である必要はない.

```Swift
let someCharacter: Character = "x"
switch someCharacter {
case "a", "b", "c": // 複数の条件を定義する場合は,で区切る
  println("abc")
default
  break; // caseやdefault内に文が無い場合は、breakが必須
}
```

## 範囲マッチ

```Swift
var value = 123
var result = ""
switch value {
case 0
  result = "0"
case 1...100 // 1〜100
  result = "1~100"
case 101...1000 // 101~1000
  result = "101~1000"
default
  result = "break"
}
```

## タプル

```Swift
var value = (1,2)
var result = ""
switch value {
case (0, 0)
  result = "0,0"
case (_, 0) // (任意の値, 0)
  result = "_,0"
case (0, _) // (0, 任意の値)
  result = "0,_"
case (1..2, 1..2) // (1~2, 1~2)
  result = "\(value.0) \(value.1)"
default
  result = "break"
}
```

### Value Binding

```swift
var value = (1,2)
var result = ""
switch value {
case (let x, 0)
  result = "0,0"
case (0, let y) // (任意の値, 0)
  result = "_,0"
case (0, _) // (0, 任意の値)
  result = "0,_"
case (1..2, 1..2) // (1~2, 1~2)
  result = "\(value.0) \(value.1)"
default
  result = "break"
}
```

### Where

switch文に条件文を記述できる.

```Swift
var value = (1,2)
var result = ""

switch value {
case (let x, let y) where x == y:
  result = "equals"
case (let x, let y) where x == -y
  result = "x == -y"
case (let x, let y):
  result = ""
}
```

# Control Transfer Statements

## continue

C言語などと同じ

## Break

C言語などと同じ.
ループ中のswitch文中のbreakは、ループをbreakしない。(C言語でのswitchのbreakと同じ扱い)

## Fallthrough

C言語でのcase 1: case 2:とbreakを書かない場合と同様になる。

※　いまいち「使いたい」という気にはならない。

```swift

let val = 1
var result = ""
switch val {
case 1:
  result += "\(val)"
  fallthrough
default:
 }
```

# Labeled Statements

ループをbreakで抜けるときなど、ラベルをつける事で抜け先を明示できる。

```swift

myLoop: while true {
   var result = myfunc();
   switch(result) {
   case 1,2,3:
     break myLoop
   case 4,5,6:
     continue myLoop
   default:
     break
   }
   ...
}
```
[JavaScript] null とか undefined とか 0 とか 空文字('') とか false とかの判定について

**※本家はこちらの[ブログエントリー](http://phiary.me/null_undefined_zero_false)になります.**
**毎日 html, css, js についてのエントリーを公開しているのでよかったら[RSS登録](http://feedly.com/i/subscription/feed/http://phiary.me/feed)してください♪**

<br />
<br />

null とか undefined とか 0 とか 空文字('') とか false とかの
判定について書いてみました.

![js-logo.png](https://qiita-image-store.s3.amazonaws.com/0/7756/1a5aab66-8eaf-1684-01f1-923f07c3f971.png)


## 各型, 値の評価

各型, 値が条件式でどう評価されるのかを見てみましょう.

| value | type | result |
|:-----------:|:------------:|:------------|
| {} | オブジェクト | true |
| "hoge" | 文字列 | true |
| "" | 文字 | false |
| 1 | 数値 | true |
| -1 | 数値 | true |
| 0 | 数値 | false |
| [] | 配列 | true |
| true | 真偽値 | true |
| false | 真偽値 | false |
| undefined | undefined | false |
| null | null | false |


## !hoge による判定

下記のようなコードってよく使いますよね？

```js
if (!hoge) { ... }
```

この条件が true になるのは上の表から分かるように
null, undefined, 0, 空文字(''), false になります.

おそらくこういった処理を使う場面は

- *プロパティの存在チェックだったり*
- *引数の省略チェックに使ったり*

って場面だと思います.

ここで注意点が!!
**数値を受け取るかどうかに気をつけてください.**

何故なら 0 の場合も true になっちゃうので 0 を渡した時に
意図しない挙動をする可能性があるからです.

## 引数が 0 のときにぶち当たる問題例

私が実際に体験した例です.

```js
var fillStar = function(x, y, radius, sides, angle) {
    var angle = angle || 90;
};
```

このコードは angle という引数を受け取ります.
一見問題なさそうですが angle に 0 を渡した際に問題が起きます.

0 を渡すと `angle || 90` の angle の部分で false と判定されてしまい
90 がセットされます.

つまりこの関数は angle に 0 をセットすることができなくなってしまっています.
これのタチの悪いところは 0 を渡した時だけこの問題が起きるので発見しづらいということです.

対策としては, こういった場合はちゃんと undefined と判定することで解決できます.

```js
var angle = (angle !== undefined) ? angle : 90;
```

省略して書くのは便利で気持ち良いですが,
しっかりと何と判定しているのかは意識するようにしましょう.

## hoge != null による判定

null と undefined のときのみ判定したい場合は
下記のコードでいけます.

```js
if (value == null) {
    ... 
}
```

存在チェックとかはこっちのほうが安全ですね.


## undefined という問題児

undefined 書き換えると上の話全部崩れるよー
だからちゃんと undefined 判定するときは

```
if(typeof(hoge) == "undefined") { ... }
```

って書こうねって話をしようと思ったのですが,
ECMAScript 5 で undefined は書き換え不可になったのでこの話はなしで.
ファイルを開かずに行数を指定して削除する

ログをあさったりするときにちょくちょく使うコマンド。
よく忘れるので書いておく。

1.行数カウントする

```
$ wc -l hoge.log
12221189 hoge.log
```

2.古い時間帯は必要ないので削除

```
$ time sed -e "1,11000000d" hoge.log > fuga.log

real	0m4.415s
user	0m2.438s
sys	0m1.973s
$
$ wc -l fuga.log
1221189 fuga.log
```
はやいね！
grunt-contrib-concat 連結元のファイルパスをコメントとして挿入

grunt-contrib-concat 連結元のファイルパスをコメントとして挿入するやり方。
https://www.npmjs.org/package/grunt-contrib-concat
に、サンプルソースとして記載されていたのですが

Gruntfile.js

```
module.exports = function(grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json');
        concat: {
            options: {
                process: function(src, filepath) {
                    // 連結元のファイルパスをコメントとして挿入
                    return '\n'+ '// sourceURL=' + filepath + '\n' + src;
                }
            },
            files: {
                'dist/built.js': ['src/project.js', 'src/project2.js'],
            }
    });

    // grunt.loadNpmTasks, grunt.registerTaskは省略
};
```

これで、grunt実行すると、

```
// sourceURL=src/project.js
// ここにsrc/project.jsのソース内容がはいるよ

// sourceURL=src/project2.js
// ここにsrc/project2.jsのソース内容がはいるよ
```

という感じで、連結前のファイルパスがコメントとして記載される。