OmniAICreator/Qiita-1.07M huggingface dataset:
DockerでRiakイメージを作る


下記の内容を、Dockerfileとして保存し、docker build -t="riak" . でイメージが作成できる。

```Dockerfile
FROM ubuntu

RUN dpkg-divert --local --rename --add /sbin/initctl
RUN ln -s /bin/true /sbin/initctl

RUN apt-get install -y sudo curl

RUN curl http://apt.basho.com/gpg/basho.apt.key | sudo apt-key add -
RUN sudo bash -c "echo deb http://apt.basho.com precise main > /etc/apt/sources.list.d/basho.list"
RUN sudo apt-get update

RUN sudo apt-get install -y riak

RUN sed -i -e 's/127.0.0.1/0.0.0.0/' /etc/riak/app.config
RUN echo "ulimit -n 4096" >> /etc/default/riak

EXPOSE 8087 8098

CMD riak start && tail -f /var/log/riak/console.log
```

## コンテナを立ち上げる

```docker run -d -p 8098:8098 riak```

## 確認

```curl http://localhost:8098/ping```

ok

## ビルドするのが面倒な人むけ

Docker indexのTrusted Buildに登録してあるので、下記コマンドだけでRiakコンテナが動き出します。

```docker run -d -p 8098:8098 reoring/docker-riak```
ハニカム歩き(2013.5.10の過去問)

1日1個 @nabetani さんの作った問題を解くAdventCalendarの11日目です。

今日の問題は http://nabetani.sakura.ne.jp/hena/ord10haniwa/ にあります。

```hs
module Doukaku.Honeycomb (solve) where

type Point = (Double, Double)
type Direction = (Double, Double)

solve :: String -> String
solve = map snd . scanl (\ (p, _) d -> moveOn p d) ((0, 0), 'A') . map direct

direct :: Char -> Direction
direct '0' = (0, 1)
direct '1' = (cos (pi / 6), sin (pi / 6))
direct '2' = (cos (pi / 6), - sin (pi / 6))
direct '3' = (0, - 1)
direct '4' = (- cos (pi / 6), - sin (pi / 6))
direct '5' = (- cos (pi / 6), sin (pi / 6))

(.>.) :: Direction -> Direction -> Direction
(x, y) .>. (x', y') = (x + x', y + y')

move :: Point -> Direction -> Point
move (x, y) (dx, dy) = (x + dx, y + dy)

moveOn :: Point -> Direction -> (Point, Char)
moveOn p d = let p' = move p d
             in case whereIs p' of
               Just c -> (p', c)
               Nothing -> (p, '!')

points :: [(Point, Char)]
points = zip points' alpha
  where
    alpha = ['A' .. 'Z'] ++ ['a' .. 'k']
    circle n = reset $ concatMap (replicate n . direct) "234501"
      where
        reset [] = direct '0' : []
        reset ds = init ds ++ (last ds .>. direct '0') : []
    directions = concatMap circle [0..]
    points' = scanl move (0, 0) directions

whereIs :: Point -> Maybe Char
whereIs pt = fmap snd . head' . filter (inIt pt . fst) $ points
  where
    head' [] = Nothing
    head' xs = Just . head $ xs

inIt :: Point -> Point -> Bool
inIt (x, y) (cx, cy) = (x - cx) ^ (2 :: Int) + (y - cy) ^ (2 :: Int) < 0.5 ^ (2 :: Int)
```

六角のマス目を長方形のマス目にうまくマッピングして扱うのが定石ですが、あえて幾何的に解きました。
`(0, 0)`の座標からスタートして、`1`の長さずつxy平面を移動させています。
六角形に対する点の当たり判定が面倒だったので、半径0.5の円で代用しました。
余程誤差が蓄積しない限り六角形の中心付近を移動するはずですので、実用上これで十分です。

http://qiita.com/items/55641767510c2f9f235f に他の方の回答もありますので、見ると参考になるでしょう。
denyhosts

sshで接続が鬱陶しいIPを/etc/deny.hostsに書き込むデーモン。

logwatchを見ていたら以下の様なアクセスログがあります。

```bash:
 sshd:
    Authentication Failures:
       root (112.4.190.41): 1700 Time(s)
       root (60.169.78.71): 1263 Time(s)
       unknown (202.90.40.156): 663 Time(s)
       root (static-195-228-132-188.sadecehosting.net): 183 Time(s)
       root (202.90.40.156): 180 Time(s)
       unknown (112.4.190.41): 173 Time(s)
       root (61.147.116.20): 83 Time(s)
       root (221.204.231.137): 75 Time(s)
       root (61.147.116.21): 75 Time(s)
       unknown (vm-118-138-241-200.erc.monash.edu.au): 73 Time(s)
       unknown (static-195-228-132-188.sadecehosting.net): 70 Time(s)
       ...
```

鍵認証を必須としているため大丈夫ですが、しかし気持ち悪いので入れとく。

```bash:インストール
sudo apt-get install denyhosts
```

```bash:アクセス拒否したくないIPリスト
sudo sh -c "cat > /var/lib/denyhosts/allowed-hosts <<EOF
192.168.
127.
EOF"
```

```bash:
sudo /etc/init.d/denyhosts restart
```
AS3でArrayとVectorの初期化

複数の言語使ってると配列の初期化っていつも忘れます。
AS3の配列はArrayとVectorがありますが、初期化はそれぞれ以下のようになります。

    var v:Vector.<int> = new <int>[1,2,3];
    var v:Vector.<int> = Vector.<int>([1,2,3]);
    var v:Vector.<int> = Vector.<int>(10); //長さ10の配列

    var a:Array = [1,2,3];
    var a:Array = new Array(1,2,3);
    var a:Array = new Array(10); //長さ10の配列
    

Arrayは割と素直なんですけど、Vectorの文法がすんなり入ってこないです。
検索すればすぐわかるのに、こんなん適当に書いてれば当たるだろうと思って、推測で書いては実行してみてってことをしてたら意外に苦戦してしまいました。



以下オマケの実験結果です。

ArrayとVectorのasキャストは無理です。

    var a:Array = (new <int>[1,2,3]) as Array;//->null
    var v:Vector.<int> = [1, 2, 3] as Vector.<int>;//->null

以下はコンパイル時エラーです。すぐ検出できるのでありがたいです。

    //Incorrect number of arguments.  Expected no more than 1.
    var a:Array = Array(1,2,3);

    //Implicit coercion of a value of type Array to an unrelated type __AS3__.vec:Vector.<int>.
    var v:Vector.<int> = [1, 2, 3];

以下は実行時エラーです。

    //コンストラクター以外にインスタンス化が試行されました。
    var a:Array = new [1, 2, 3];

    //Vector.<int>$cinit() の引数の数が一致していません。0 が必要ですが、5 が指定されました。
    var v:Vector.<int> = new Vector.<int>(1,2,3);

    //クラスの型変換に指定された引数の数が不正です。1 個必要ですが、5 個指定されました。
    var v:Vector.<int> = Vector.<int>(1,2,3);

    //Number にプロパティ 5 が見つからず、デフォルト値もありません。
    var v:Vector.<int> = new Vector.<int>[1, 2, 3];

以下は動作しますが、意図した動作ではないかもしれません。

    var a:Array = Array([1, 2, 3]);//a[0]に配列が格納。２次元配列
    var v:Vector.<int> = new Vector.<int>([1, 2, 3]);//何も起こらない。長さ０の空配列・・・
NetBeans7.4でGlassFish 3.1.2.2の開発する時のメモメモ

NetBeans7.4でGlassFish 3.1.2.2の開発する時のメモメモ
===

    GlassFish 3.1.2.2で運用してんのかぁ！
    よーし、NetBeans7.4をダウンロードして開発すっぺぇ！
    ぁっ、あれ、GlassFish 4.0しか選べない...
    
▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわあああぁぁぁ


というシチュエーションの時のメモ
macの環境で試しております。

まずはダウンロードしてくるべし
---
GlassFish Server Open Source Edition - 3.1.2.2
https://glassfish.java.net/downloads/3.1.2.2-final.html

今回はFull Platformの↓を選びました。

    glassfish-3.1.2.2-ml.zip
    (multilingual) 

解凍した下記をどっかにおくべし
---

    glassfish3


NetBeans7.4を起動すべし
---
![nekobean_smile.png](https://qiita-image-store.s3.amazonaws.com/0/5793/6acd22d7-ddde-93a1-2079-49695301244e.png)


[サービス]タブを選択すべし
---
![001.png](https://qiita-image-store.s3.amazonaws.com/0/5793/553df0ad-7da4-f7f2-3472-3588ac2c06cf.png)


[サーバ]右クリックして[サーバの追加]を選択すべし
---
![002.png](https://qiita-image-store.s3.amazonaws.com/0/5793/08706d5d-ddf1-746c-5360-fbf63d1c4587.png)


[GlassFishServer」選択し「GlassFish Server 3.1.2.2」名前変更すべし
---
![003.png](https://qiita-image-store.s3.amazonaws.com/0/5793/bbe0c466-0632-ba0e-802f-2a0146fc6a9f.png)


zip解凍した場所を選び「次へ」をクリック
---
![004.png](https://qiita-image-store.s3.amazonaws.com/0/5793/d4d454c1-2ecc-e8fd-96aa-8c80c4ce6b9d.png)
☆今すぐダウンロードは押さない☆

そのまま終了で完成！
---
![005.png](https://qiita-image-store.s3.amazonaws.com/0/5793/8a6cbb66-7dbb-0a80-d3fd-154902c29680.png)


これで新規Webプロジェクトで3.1.2.2が選べる！やったー！
---
![006.png](https://qiita-image-store.s3.amazonaws.com/0/5793/7d2b8df8-51d1-3851-0ac3-8da8898ebe26.png)
FuelPHP1.7でSmartyの設定

##Smartyを配置
<a href="http://www.smarty.net/download" title="Download | Smarty">Smartyをダウンロード</a>後、
libsディレクトリを、fuel/app/vendor/Smarty/に配置します。

Smartyディレクトリがない場合はディレクトリを作成してください。

##config.phpにてparser設定

```php
    'packages'  => array(
        'orm',
        'parser',//parserを追加
    ),
```

app.config/config.phpにて、parserを追加します。


##composer.jsonを設定

ドキュメントルート直下のcomposer.jsonを編集。

```php
    "require": {
        "php": ">=5.3.3",
        "monolog/monolog": "1.5.*",
    	"fuelphp/upload": "2.0.1",
        "smarty/smarty": "3.*"//書き換え
    },
```

requireの部分のsmarty/smartyを上記のように書き換えます。

書き換えた後は、コマンドラインで、
以下を実行し、アップデートして下さい。


```php
php composer.phar update
```
[Backbone.js] model.defaults にオブジェクトをつっこんだとき、model.getで各値を取得する方法

```coffeescript:model.coffee
class CalcModel extends Backbone.Model
	defaults:
			inVal:
				frame: 0
				min:   0
				sec:   0
				msec:  0
			outVal:
				frame: 1
				min:   0
				sec:   0
				msec:  0

```

```coffeescript:view.coffee
class CalcView extends Backbone.View
	initialize: ->
		$("#inMinutes").val      @model.get("inVal").min
		$("#inSeconds").val      @model.get("inVal").sec
		$("#inMilliseconds").val @model.get("inVal").msec

		$("#outMinutes").val      @model.get("outVal").min
		$("#outSeconds").val      @model.get("outVal").sec
		$("#outMilliseconds").val @model.get("outVal").msec
```

今まで、`` this.model.attributes.inVal.min `` のように直接アクセスしてましたが
get(attributes) はオブジェクトを返してくることがわかりました。

`` Object Backbone.Model.get(string attributes) `` 

[Backbone Manual](http://backbonejs.org/#Model-get)
マニュアルには詳しく記載されていませんが

[Backbone.js Source](http://backbonejs.org/backbone.js) 
288行目あたり。（ver 1.1.0 / 2013年12月11日現在）
ソースを読めば一目瞭然でした、と。。
Phalconインストール後、PHP起動時エラー(phalcon.so: undefined symbol: output_globals in Unknown on line 0)でる時の回避方法

以下のエラーが出た場合

phalcon.so: undefined symbol: output_globals in Unknown on line 0


※以下は全てルートでやってます

```
cd cphalcon/build/64bits
make clean
phpize --clean
find / -name phpize
/path/to/phpize
find / -name php-config
./configure --with-php-config=/path/to/php-config
make
make install
```

インストール成功すると、phalcon.soが生成され、
生成場所も表示されるので、
そのパスをphp.iniに

```
extension=/path/to/phalcon.so
```

と追記して、Apache再起動する。

/path/to/php -r "phpinfo();" | grep phalcon

で確認してインストールされてればOK！！
JenkinsからBeanstalkへ自動デプロイする

皆様、Beanstalkは使ってますでしょうか。

- デプロイの仕組みがあって手軽
- バージョン管理の仕組みがあって安心
- ELB, EC2, RDS, S3等のAWSのパーツを組み合わせてるだけなので、構成が分かりやすい

などなど、いいところが沢山あるのですが、イマイチ使われてるイメージがないです。

なので、ちょっとでも興味持ってもらおうと、CIの究極系、自動デプロイをやってみました。

# やりかた

## 前提・お断り

- Jenkinsをどこかのサーバに導入してください
- Jenkinsを入れたサーバにAWS-CLIをインストールしてください
- サンプルはWARをアップするパターンです
  - でも多分rubyとかはgit archiveでzip作ったら後は一緒だと思う

## beanstalkでの作業

サンプルアプリケーションを作っておいて下さい。出来上がったアプリのapplication名、environment名を使います。

## jenkinsでの作業

jenkinsで下記の環境変数を設定します。シェル実行でexportで書いてもOK。
  - AWS_ACCESS_KEY_ID
  - AWS_SECRET_ACCESS_KEY
  - AWS_DEFAULT_REGION=ap-northeast-1

そして、アプリケーションのテスト実行後に、下のシェルをオプション付きで実行します。ソースコードのバージョン管理に含めてシェル実行で叩くのがよいと思います。

| オプション | 説明 |
|:--|:--|:--|
| -a | beanstalkでのApplication名 |
| -e | beanstalkでのEnvironment名 |
| -v | 任意のバージョン番号 $BUILD_NUMBER とか使うとよさ気 |
| -w | WARファイルの場所。git archiveで作ったzipでも可だと思う（未確認） |
| -b | S3のバケット名 |

```bash
#!/bin/sh

usage() {
  echo "Usage: $0 [-a application name] [-e environment name] [-v version] [-w war file on local] [-b bucket name for elastic beanstalk]" 1>&2
  exit 1
}

while getopts "a:e:v:w:b:h" opt
do
  case $opt in
    a) APP_NAME=$OPTARG ;;
    e) ENV_NAME=$OPTARG ;;
    v) VERSION=$OPTARG ;;
    w) WAR_PATH=$OPTARG ;;
    b) BUCKET=$OPTARG ;;
    h) usage ;;
  esac
done

if [ -z "$APP_NAME" ] || \
   [ -z "$ENV_NAME" ] || \
   [ -z "$VERSION" ] || \
   [ -z "$WAR_PATH" ] || \
   [ -z "$BUCKET" ]; then
  usage
fi

function error() {
  echo $1
  exit 1
}

aws s3 cp ${WAR_PATH} s3://${BUCKET}/${VERSION}.war \
  || error "failed to upload S3"

aws elasticbeanstalk create-application-version \
  --application-name ${APP_NAME} \
  --version-label ${VERSION} \
  --source-bundle S3Bucket=${BUCKET},S3Key=${VERSION}.war \
  || error "failed to create new version"

aws elasticbeanstalk update-environment \
  --environment-name ${ENV_NAME} \
  --version-label ${VERSION} \
  || error "failed to update environment"
```

うまく行けば、テスト実行後に自動デプロイが行われるはずです。

開発環境への自動デプロイなどにどうぞ。

# まとめ

やってみるとかなり簡単なのが分かります。ぜひお試し下さい。

beanstalkを使ってない方は、ELBでEC2を複数並べるサービスを作る時はぜひ検討してみてください。まったくおんなじ構成をサクッと作れますし、後からbeanstalkを捨てるのも割と簡単です。おんなじパーツで同じ構成を組むのはさほど難しくはないので。AWSからは逃げ出せませんけどね(・ω<)
Time型カラムに記録された時間インスタンスの、平均時刻を取得する（日付は無視）


例えば営業終了時刻の:time_shop_closedカラムをもつDailyReportモデルがあり、特定の検索条件で抽出した@daily_reportsインスタンスに対し、viewで以下のようなコードを記述します。

```
<%second_sum=@daily_reports.pluck(:time_shop_closed).map{
	|x| x.hour*60+x.min
	}.inject(:+)/ @daily_reports.count%>
	
<%=second_sum.div(60).to_s+"時"+second_sum_average.modulo(60).to_s+"分"%>
```

単純に時刻インスタンスの配列全てを.to_fメソッドで数値化して、足して、配列数で割ればいいと思ったてたら、大違いでした。

ハマったので記録。
Docker で Google AppEngine 開発


Google AppEngine 開発用の Docker Container を公開しました。

* https://github.com/essa/docker-gae-python
* https://github.com/essa/docker-gae-python-extra

docker-gae-python の方は、GAE sdk for python + ライブラリやコンパイラで、docker-gae-python-extra はそれに加えて、自分が使っているツールを詰めこんでいます。

## 使い方

どちらも、以下のように起動して、

```bash
sudo docker run -d -p 2022:22 -p 8080:8080 -v (プロジェクトルートへの絶対パス):/home/gae:rw essa/gae-python-extra /usr/sbin/sshd -D
```

以下のようにログインして使います。初期パスワードは python です。

```bash
ssh -p 2022 gae@localhost
```
下記のコマンドで、サンプルのアプリが起動します。

```bash
python /usr/local/google_appengine/dev_appserver.py /usr/local/google_appengine/demos/python/guestbook --port 8080 --host 0.0.0.0
```

ホストから、http://localhost:8080/ でアクセスできます。

ホストのfirewallで 8080を公開していれば、外部からアクセスできます。パスワードが書かれたDockerfileを公開していますので、ssh用ポートの 2022 を外部に公開する場合は、パスワードを変更するようにしてください。

## Dockerの感想

Dockerを初めて使ってみましたが、確かに便利だと思います。

GAE SDK for python の環境は割と簡単に作れますが、今やってるプロジェクトでは、closureCompilerやSASSやcasper.js(phantom.js) を使っているので、rubyやjavaやnode.jsの実行環境も必要になります。これが全部動く環境を一から作るのが大変で、説明をどう書くか悩んでいたのですが、Dockerのイメージとして公開すれば、すぐ揃いますね。

イメージを公開できなくても、Dockerfileをプロジェクトに添付しておけば、時間は少しかかるけど、docker build コマンド一発で、同じ環境を作ることができます。

今の所は、Dockerの実行環境を作るのが大変かもしれませんが、coreosを使えるクラウドが広まれば、それもすぐできますからね。

Dockerfileの作成は、環境構築用のshell script を書くのとほとんど同じですが、RUN コマンド一行ごとに実行結果のファイルシステムイメージをcommitしてくれるので、再実行した時、自動的に修正した行から再開してくれるのがありがたい。

実際に使ってみて、いい方向に予想と違ったのは、この機能のおかげでDockerfileを書くのが思ったより簡単だったことです。

この手のスクリプトや環境構築用のツールは、

1. ひととおり書いてみてテスト実行
2. 時間のかかる処理があって、そこはうまく行く
3. 最後の方に些細なミスがあって修正
4. 全部再実行すると時間がかかるので、修正した部分だけ実行して確認
5. その時はうまく行くが、最初から実行するとエラーになる

で、愚直に全部最初からやっていると、時間がかかるのであせって、環境を初期化する処理を間違えて書きかけのスクリプトも消してしまって涙、なんてパターンになりがちです。

Dockerのメインの使用目的は、本番運用用のマシンをさくっと立ちあげることだと思いますが、開発環境を整えて共有することにも使えそうな気がします。

## TIPS

まだ、あんまりわかってないですが、自分がつまづいた所をメモしておきます。

* -v (ホスト側のパス):(Container内のパス):rw で簡単に、ホスト上のディレクトリをマウントできる。ソースやDBのように残しておきたいファイルは、この方法でホストに残しておけば、仮想イメージを消しても大丈夫。
* 仮想イメージがたくさんできてわからなくなったら、docker images --tree を見て、シッポのIDを docker rmiで消すとそこにつながっているイメージが全部消える
* docker rm はコンテナの削除、docker rmi はイメージの削除、最初混同していた。
* buildの時は、docker build ... - < Dockerfile でやった方が速く終わる (カレントディレクトリにファイルが一杯ある時)
【JavaScript】prototypeの利用

こんにちは。

プロトタイプ(prototype)の学習をしたのでメモ。

>コンストラクタにprototypeを使ってメソッドを定義すると
そのコンストラクタから定義されたオブジェクトは、そのメソッドを使うことができる

何度も定義し直さなくても使えるという便利。

```js
function Tomato() { 
  this.color = "赤"; 
  this.taste = "美味しい" 
}
var tomato = new Tomato(); 
tomato.data = function() { 
  return "トマトの色は" + this.color + "で、味は" + this.taste + "です。"; 
}

tomato.data() ;
output(tomato.data()) ;
```

こうすると、次にTomatoコンストラクタを使うときに
.data()が使えないので、再定義をしなければいけなくなる。

そこでprototypeを利用。

```js
function Tomato() { 
  this.color = "赤"; 
  this.taste = "美味しい" 
}

Tomato.prototype.data = function() {
  return "トマトの色は" + this.color + "で、味は" + this.taste + "です。";
}

var tomato1 = new Tomato();
var tomato2 = new Tomato();

alert(tomato1.data());
alert(tomato2.data());
```

>Tomato.prototype.data = function() {
  return "トマトの色は" + this.color + "で、味は" + this.taste + "です。";
}

ここでdataメソッドを定義しています。

そして、この``` Tomato.prototype.data ```と
>【コンストラクタ】.prototype.【プロパティ/メソッド名

の様に書くだけで、.dataも再度コンストラクタを生成した際に使えるようになります。

```js
alert(tomato1.data());
alert(tomato2.data());
```
上記でしっかり値がかえってくることも確認。

prototypeを指定しない場合、tomato2はエラーでかえってきます。

余談ですが、prototypeは
>原型、試作品などの意味を持つ英単語。ITの分野では、ハードウェア開発の際の量産前の試作品や、動作や機能を検証するために最小限の規模で試作されたソフトウェアなどのことを意味する。
>
プログラミング言語の分野では、関数などの呼び出し方を既定する宣言文(プロトタイプ宣言)や、オブジェクトの雛形の定義などの意味で用いられる。
>
e-Wordsより

コンストラクタに機能を追加させて、新たに生成した際に
再度呼び出し可能になるってイメージでしょうかね。

それでは、これからも宜しくお願いいたします。

(問題は前回同様、CodeStudyを利用しています。)
改行できなくて困ったときのCtrl+m

あるアプリケーションを使っていて、
改行をしようとしたときに「Enter」が効かない場合があります。

例えば、下記のmindmapツールでノードを作成する際など。

> [Coggle](https://coggle.it/ "Coggle")




その場合、「Ctrl + m」で改行できることがあります。
※ちなみにvimや他のエディタ等でも、Ctrl+mで改行できます。

以外に知っていると便利です。

以上、1秒で実現できる有用な技術でした。
Go言語: ディレクトリ内の全ファイルをフォーマットする方法


特定のディレクトリの中にある、ファイル全てにフォーマットをかけて、ソースコードを整えるコマンド

```
gofmt -s -w /path/to/dir
```

`-s` はSimplify Mode。冗長なコードを単純化してくれるらしい。
`-w` は整形したコードで元ファイルを上書きする。


また、以下のコマンドでも同様のことができる

```
go fmt ./...
```
Sigil大好き！一番好きな機能です。

Elixirには、Rubyなどの言語に見られるような `%w(...)` という記法が存在する。Elixirのドキュメントではそれを「Sigil」と呼んでいる。

```elixir
%w(foo bar 123)
#=> ["foo", "bar", "123"]
```

ドキュメントにある通り以下の4つがデフォルトで定義済み。

* %c and %C - Returns a char list;
* %r and %R - Returns a regular expression;
* %s and %S - Returns a string;
* %w and %W - Returns a list of "words" split by whitespace;

また、Rubyの同様の表記と違い、接尾辞を指定できる。「modifier」と呼ばれる。無いものを指定すると例外。

```elixir
%w(foo bar 123)a
#=> [:foo, :bar, :"123"]
%w(foo bar 123)z
# ** (ArgumentError) modifier must be one of: s, a, c
#    /private/tmp/elixir-s8oh/elixir-0.11.2/lib/elixir/lib/kernel.ex:3624: Kernel.split_words/2
#    iex:13: Kernel.sigil_w/2
```

このSigil記法、最終的には`sigil_*`という名前の関数またはマクロが呼ばれることになるので、

```elixir
%p()
# ** (RuntimeError) undefined function: sigil_p/2
```

このような名前の関数もしくはマクロを定義してあげると、独自のSigilを定義できる。

```elixir
defmodule MySigil do
  def sigil_p(string, []) do
    IO.inspect(string)
  end
end

import MySigil
%p(Hello!)
#=> "Hello!"
```

この際`sigil_p/2`になるように定義すること。2番目の引数にはもちろんmodifierが入ってくる。

以下はSigilの内容のmd5ハッシュを出すサンプル。

```elixir
defmodule Crypto do
  def to_md5(str) do
    Enum.join(
      Enum.map(
        bitstring_to_list(:crypto.hash :md5, str),
        fn(x) -> String.rjust(integer_to_binary(x, 16), 2, ?0) end
      )
    )
  end

  def sigil_m(string, []) do
    to_md5(string)
  end
end

import Crypto

%m'''
foo
bar
baz
'''
#=> "268A5059001855FEF30B4F95F82044ED"
```

Enjoy Sigiling!

次回は[さっちゃん](http://qiita.com/ne_sachirou)さんです！！
Gruntでテスト向けの静的サーバを立ち上げる方法

JSのライブラリをちょっと試したいときがある。
それ用の静的サーバをGruntを使えば簡単に立ち上げられるのでメモです。

### あらかじめ必要なもの

- gruntが使える環境
  - node.js
  - grunt-cli

### ステップ

1. `npm init`でプロジェクト作成
1. gruntをインストール
1. grunt-contrib-connectをインストール
1. Gruntfile.jsを作成
1. 実行


## プロジェクト作成

`npm init` でプロジェクトを作成しましょう。
といっても、package.jsonが作成されるだけですが。
テスト用の環境なので、とくに記述は要りません。というかpackage.json自体要らないのかも。
この時点でindex.htmlも作成しておくと動かしたときに確認しやすい。

## gruntインストール

```
$ npm install grunt --save-dev
```

## grunt-contrib-connectをインストール

これが静的サーバになります。

```
$ npm install grunt-contrib-connect --save-dev
```

## Gruntfile.js作成

以下のコードを記述します。

```js
module.exports = function (grunt) {

  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    connect: {
      server: {
        options: {
          port: 9001,  // 適当で可
          keepalive: true,  // これが無いと動き続けないよ〜
          hostname: 'localhost'
        }   
      }   
    }   
  }); 

  grunt.loadNpmTasks('grunt-contrib-connect');
  grunt.registerTask('default', ['connect']);
}
```

## 実行

```
$ grunt
```

これで動きます。
あとは好きな様にCSSなりJSファイルなり、ぶち込めばいいと思います。
初心者が陥りそうな罠 〜なんでもintrosすればいいってわけじゃない〜

# introsタクティック
まず最初に覚えるタクティックがintrosだから、intros出来る形だとついついintrosしたくなりますよね。

```
forall b c : bool, P -> Q -> R
```

という形ならば、

```coq
intros b c p q.
```
としたくなるのが人の性。

では次の例はどうでしょう。

```coq
Theorem andb_eq_orb : 
  forall (b c : bool),
  (andb b c = orb b c) ->
  b = c.
```

早速

```coq
  intros b c H.
```

とすると

```
1 subgoal
b : bool
c : bool
H : (b && c)%bool = (b || c)%bool
______________________________________(1/1)
b = c
```

なるほど。bとcはboolなのでtrueとfalseで場合分けして……

```coq
  destruct b.
  destruct c.
```

```
3 subgoals
H : (true && true)%bool = (true || true)%bool
______________________________________(1/3)
true = true


______________________________________(2/3)
true = false

______________________________________(3/3)
false = c
```

true = true は

```coq
  reflexivity.
```

で片付けて、

```
2 subgoals
H : (true && false)%bool = (true || false)%bool
______________________________________(1/2)
true = false


______________________________________(2/2)
false = c
```

Hの左辺はfalseで右辺はtrueだから、前提に矛盾が含まれるわけだから……

ちょっと待ってください。introsで前提に送ってしまったHの形、複雑過ぎませんか？ 簡約したくなりません？ simplタクティックを使いたくなってきません？

よし、じゃあsimplタクティックを使いましょう。最初のintrosタクティックを使ったところで

```coq
  intros b c.
  destruct b.
  destruct c.
```

としてみましょう。すると……

```
3 subgoals
______________________________________(1/3)
(true && true)%bool = (true || true)%bool -> true = true


______________________________________(2/3)
(true && false)%bool = (true || false)%bool -> true = false

______________________________________(3/3)
(false && c)%bool = (false || c)%bool -> false = c
```

お、simplタクティックがうまくいきそうなゴールの形になりましたね。

```coq
Theorem andb_eq_orb : 
  forall (b c : bool),
  (andb b c = orb b c) ->
  b = c.
Proof.
  intros b c.
  destruct b.
  destruct c.
    simpl.
    reflexivity.

    simpl.
    intros H.
    rewrite H.
    reflexivity.

    simpl.
    intros H.
    rewrite H.
    reflexivity.
Qed.
```

これで完成。なーんだ。最初の intros H は要らなかったんですね。

# あとがき
このTheoremは、 Software Foundations の例題として載っていたものです。この例題が出る段階ではまだ習ったタクティックが非常に少ないため、仮定に矛盾が含まれている場合どうすればいいのかがわかりませんでした。intros出来る形だと何でもかんでもintrosしていた私は見事にハマりました。introsするときはその意味をよく考えるべしといういい教訓になりました。

# 参考
http://www.cis.upenn.edu/~bcpierce/sf/Basics.html
Java MySQL 接続 [ commons-dbutils ]

メモ
ORMツールを自作する場合に便利そうだな。

```java

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapHandler;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class Main {

	public static final String URL = "jdbc:mysql://localhost:3306/base1";
	public static final String USER = "base1";
	public static final String PASS = "base1";

	public static void main(String[] args) throws SQLException {

		MapHandler mapHandler = new MapHandler();

		MysqlDataSource dataSource = new MysqlDataSource();
		dataSource.setUrl(URL);
		dataSource.setUser(USER);
		dataSource.setPassword(PASS);

		QueryRunner runner = new QueryRunner(dataSource);

		for (int i = 0, j = 10; i < 10; i++, j = j << 2) {
			System.out.println(runner.query("SELECT ? + ? AS ANS", mapHandler,
					i, j).get("ANS"));
		}
	}

}

```

URLの形式がわからなくても登録できるみたいなのでいじってみた。

```java

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.MapHandler;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class Main {

	public static final String URL = "jdbc:mysql://localhost:3306/base1";
	public static final String DBNAME = "base1";
	public static final String USER = "base1";
	public static final String PASS = "base1";

	public static void main(String[] args) throws SQLException {

		MapHandler mapHandler = new MapHandler();

		MysqlDataSource dataSource = new MysqlDataSource();
		// dataSource.setUrl(URL);
		dataSource.setDatabaseName(DBNAME);
		dataSource.setUser(USER);
		dataSource.setPassword(PASS);

		QueryRunner runner = new QueryRunner(dataSource);

		for (int i = 0, j = 10; i < 10; i++, j = j << 2) {
			System.out.println(runner.query("SELECT ? + ? AS ANS", mapHandler,
					i, j).get("ANS"));
		}
	}

}
```

こっちのが楽。
Java MySQL 接続

メモ
ORMばかりつかってて忘れていたので。

```java

import static java.sql.DriverManager.*;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Main {

	public static final String URL = "jdbc:mysql://localhost:3306/base1";
	public static final String USER = "base1";
	public static final String PASS = "base1";

	public static void main(String[] args) throws SQLException {
		try (Connection connection = getConnection(URL, USER, PASS)) {

			PreparedStatement prepared = connection
					.prepareStatement("SELECT ? + ? AS ANS");

			for (int i = 0, j = 10; i < 10; i++, j = j << 2) {
				prepared.setInt(1, i);
				prepared.setInt(2, j);

				ResultSet resultSet = prepared.executeQuery();
				if (resultSet.next())
					System.out.println(resultSet.getObject(1));
			}
		}

	}
}
```
Active Recordで特定のカラムのユニークなIDの一覧を配列で受け取る

例えばチェックイン履歴(UserCheckin)からユニークなuser_idを配列で取得したい時

```rb
user_ids = UserCheckin.pluck(:user_id).uniq
```

[追記]
下記コメントいただきました。SQLレベルでgroup byした方がアプリケーションサイドの実行コストが低くていいですね。ありがとうございます。

```rb
user_ids = UserCheckin.group(:user_id).pluck(:user_id)
```

もしくは

```rb
user_ids = UserCheckin.uniq.pluck(:user_id)
```
Lua で実行中のファイル名称と行番号を取得する


## ファイル名称を取得する

```lua
local debugInfo = debug.getinfo(1)
local fileName = debugInfo.source:match("[^/]*$")
```

### 現在行を取得する

```lua
local debugInfo = debug.getinfo(1)
local currentLine = debugInfo.currentline
```
Google SpreadsheetでFacebook Like数を取得する

# GoogleAppScript
わざわざアプリとか作る前に色々試せるので便利だなと言う感じがしてます。
社内の管理部分を試験運用してみて落ち着いたら移植とか良さそうだなーと思って見てたら便利なスクリプトがあったので。

# Facebook Likes Counter
公式ギャラリーの`公開 -> 統計情報`直下にあるので、そこからインストールしてやればOKです。
若しくは[Martin Hassman Labs](http://labs.met.cz/) でソースが取得できます。

![スクリーンショット 2013-12-11 15.26.00.png](https://qiita-image-store.s3.amazonaws.com/0/1946/eca76f62-2c24-df46-e745-087aac8a0fe0.png)

こんな感じでURLを貼っ付ければFacebookの`share/like/comment/total`を取得してくれます。

社内で「ページ毎のFacebookのLike数とか纏めて取得したいんだけど、ささっととやってよ」みたいなケースはありそうなので、そんな時はおもむろにこれを差し出せば幸せになれそうです。
画像の平均色を出す

画像<sup>1</sup>の色の傾向を知る方法はないかしらんと調べていたときに、画像を1ピクセルサイズに縮小してその1ピクセルの色を読む、という方法を Stack Overflow<sup>2</sup> で見つけてなんかすごくスマートに感じたので採用することにした。

厳密な値は求めてないしコードをたくさん書きたくないので、縮小は簡単に済ませることに。iOSのことは知りません。


```objc:Foo.m
+ (NSColor *)averageColor:(NSBitmapImageRep *)bitmapRep
{
    // put image in 1 pixel rect
    NSImage *pixel  = [[NSImage alloc] initWithSize:NSMakeSize(1, 1)];
    [pixel lockFocus];
    [bitmapRep drawInRect:NSMakeRect(0, 0, 1, 1)];
    [pixel unlockFocus];
    NSBitmapImageRep *pixelRep = [[NSBitmapImageRep alloc] initWithData:[pixel TIFFRepresentation]];
    
    // read averaged color
    NSColor *color = [pixelRep colorAtX:0 y:0];

    return color;
}
```
できた。

ちなみに今回は白っぽいか黒っぽいか知りたかっただけなので、さらにここから輝度を取り出した。

```objc
CGFloat brightness = [[Foo averageColor:imageRep]  brightnessComponent];
```

-- 
1. というか今回はWebViewだったんだけど
2. [memory management - How do I release a CGImageRef in iOS - Stack Overflow](http://stackoverflow.com/questions/12147779/how-do-i-release-a-cgimageref-in-ios/12148136#12148136)
Go言語のクロスコンパイル設定値 $GOOS, $GOARCH 一覧リスト

忘れやすいのでメモ。最新情報は公式ドキュメント [Optional environment variables](http://golang.org/doc/install/source#environment) を。

|	$GOOS	|	$GOARCH	|	メモ	|
|	-----------	|	-----------	|	-----------	|
|	darwin	|	386	|	Mac OS X 10.6~	|
| darwin	|	amd64	|	Mac OS X 10.6~	|
|	freebsd	|	386	|	|
|	freebsd	|	amd64	|	|
|	freebsd	|	arm	|	|
|	linux	|	386	| |
|	linux	|	amd64	|	|
|	linux	|	arm	|	|
|	netbsd	|	386	|	|
|	netbsd	|	amd64	|	|
|	netbsd	|	arm	|	|
|	openbsd	|	386	| |
|	openbsd	|	amd64	|	|
|	plan9	|	386	|	|
|	plan9	|	amd64	|	|
|	windows	|	386	|	|
|	windows	|	amd64	|	|	

| $GOARCH	|	メモ	|	
|	-----------	|	-----------	|	
|	amd64	|	64-bit x86	|	
|	386	|	32-bit x86	|	
|	arm	|	32-bit ARM	|
【JavaScript】連想配列の指定した中身を取り出すまとめ

こんにちは。

結構理解も深まってきたし、問題自体も連想配列で
かつ頭の中に入れておきたいからメモです。

```js
var cart = [
  { name:"タマネギ", price:80, quantity:3 },
  { name:"じゃがいも", price:60, quantity:5 },
  { name:"ニンジン", price:40, quantity:4 }
];

var items = [];
var totalPrice = 0;
var totalQuantity = 0;

for(key in cart){
    items.push(cart[key].name);
    totalPrice += cart[key].price  * cart[key].quantity ;
    totalQuantity += cart[key].quantity ;
}
output(items) ;
output(totalPrice);
output(totalQuantity);

```

まずはkey取得の命令
そして配列に値を入れるにはpushを使う。

```js
items.push(cart[key].name); 
```

配列[key].プロパティ名　でアクセスし、　+=　で足していく。

```js
totalPrice += cart[key].price  * cart[key].quantity ;
```

".~"(プロパティ名)を忘れがちなので、要注意と自分に言い聞かせる。


学習は
CodeStudyを主に使っています。
http://jeek.jp/study

そしてここに書くことで、色んなアドバイスも頂けて
頭に入りやすくなるだけでなく、ヒントや知らなかったこと、考え方もいただくことができ
非常にうれしく思っています。

もう少しでJavaScript編が終わりJQuery編に入るので
CodeacademyというサイトでさらにJavaScriptの学習を続けるか
JQueryに入るか悩み中です。

それでは、これからもよろしくお願いいたします。
DJangoメモ：はじめから（管理画面を編集編）　　謎あり


なんだか[前回](http://qiita.com/juniskw/items/9596b78501916f6f6f8d)はちょっと手こずりましたが、ようやくadmin画面を表示できるようになりました。

なお、最新版のドキュメントを教えていただけたので今回からはそちらを参照してやっていこうと思います。
http://docs.djangoproject.jp/en/latest/intro/tutorial01.html

### adminページ内に自分のアプリケーションを含ませる ###

デフォルトのままでadminページにログインすると”Auth”という項目があってその中に”Groups”と”Users”がある。
ここに自分のアプリケーションPollsを表示させて管理画面から編集できるようにするためには、pollsディレクトリにあるadmin.pyを編集する。

###### admin.py ######

```py
from django.contrib import admin
from polls.models import Poll  # インポートして

admin.site.register(Poll)  # admin画面に登録
```

これで追加される。追加・編集・削除も可能。
ためしにここからQuestionを追加してみた。DateとTimeはTodayとNowのショートカットを使用。
すると、現在日時はちゃんと合っている（秒数までは確認しないが）。
#### ただ、なぜかHistoryの方は日時がおかしい ####
９時間マイナスされているから多分これは世界標準で考えた日時と思われるのだけれど、だったら両方とも間違っているはずでは？
Poll追加時のTodayNowだけがちゃんと日本時刻にかみ合っているのが逆に不自然なような気がしてならない。

とはいえここは今のところさほど重要でないので、修正は後回しで。

### adminフォームのカスタマイズ ###
フォームを並び替えるには
###### admin.py ######

```py
class PollAdmin(admin.ModelAdmin):
    fields = ['pub_date', 'question']  # fieldsはおそらく規定の変数名
    # データベースに登録した項目名を配列に入れて指定

admin.site.register(Poll, PollAdmin)
# 一つめの引数でデータを取得し、二つ目の引数に基づいて作成？
```

フォームがたくさんある場合はfieldsetsで分割も出来るらしい

```py
class PollAdmin(admin.ModelAdmin):
    fieldsets = [
    # (“見出し”,{‘fields’:[“項目”,”項目”]})という書き方っぽい
        (None,{'fields': ['question']}),  # Noneは見出しなし
        ('Date information',{'fields': ['pub_date'],'classes': ['collapse']}),
    # classesはHTMLクラスを指定。collapseは折りたたみ機能
    ]
```

ここでいうHTMLクラスというのは\<div class=“collapse”>と同じなのだろうか？（だとしたらCSSも適用できるが）
あとページ内でJavascriptも使われているようなのだけれどJSファイルがどこにも見当たらないのはなぜだろう？
【JavaScript】連想配列のkeyとvalueの取得

こんにちは。

僕は以前PHPをかじっていたのですが、JavaScriptだと
連想配列の扱い方が結構異なる感触があり、なかなか手ごわいです。

最初のミス：

```js
var customers = { "田中太郎":"03-53xx-xxxx", "田中二郎":"03-54xx-xxxx", "田中花子":"03-55xx-xxxx" };
var names = new Array() ;

names[0] = "田中太郎" ;
names[1] = "田中二郎" ;
names[2] = "田中花子" ;

for(var i = 0 ; i<names.length ; i++ ){
    for(var j in customers){
      alert( names[i]  + "さんの番号は" + customers[j] + "です。") ;
    }
}
```

>田中さんがたくさん出てきました。
事故です。

ループの中でさらにループを持たせてたらそうですよね。

調べてみるとどうやらkeyで持ってこれるらしい。
次はこうやってみた。

```js
for(key j in customers){
  alert( key  + "さんの番号は" + customers[j] + "です。") ;
}
```

非常に残念な結果でした。

どうやら
>for in文はループをまわす回数を定義しなくていい。

というところまでこぎつけて、ようやく解決。

```js
var customers = { "田中太郎":"03-53xx-xxxx", "田中二郎":"03-54xx-xxxx", "田中花子":"03-55xx-xxxx" };

for(key in customers){
  alert(key + "さんの番号は、" + customers[key] + "です。") ;
}
```

for文とかなりおごっちゃになっていたようで、
連想配列なので、key と value　を結びつけてあげればよかったんですね。
ここはほかの言語も同じですよね。

(そもそも配列につっこむ必要もなかった。)

ちょっとみたことなかった``` for ~ in ```　文には見慣れなければいけないかつ
反復しなきゃいけない模様です。

少しずつですが、ぐぐる力もでてきたかも。
それではこれからもよろしくお願いいたします。
R で大きな数値を 100,000,000 のように書きたい #rstatsj

[前回の記事](http://qiita.com/hoxo_m/items/9814677db7e9489d1337)とは逆の話です。

Java には[アンダースコア数値リテラル](http://pgbox.grush.jp/ref/java/jdk/java7/underscores_literals.html)という便利な書き方があります。

```java
int MAX_LIMIT = 100_000_000;
```

この書き方は、大きな数値を書くときに桁数がわかりやすくなって便利です。

これを R でも再現できないかと思って下記の関数を作ってみました。

```r
Num <- function(..., digits=3) {
  args <- rev(unlist(list(...)))
  result <- 0
  for(i in seq_along(args)) {
    result <- result + args[i] * 10^(digits*(i-1))
  }
  result
}
```

使い方は下記の通りです。

```r
kMaxLimit <- Num(100,000,000)
print(as.integer(kMaxLimit))
```

```:結果
[1] 100000000
```

### 追記

ゴミ箱さま([@kos59125](https://twitter.com/kos59125/status/410637260636180480))によると次の書き方が速いらしい。

```r
Num <- function(..., digit=3) {
  args <- unlist(list(...))
  result <- 0
  d <- 10 ^ digit
  for(arg in args) {
    result <- result * d + arg
  }
  result
}
```

コメントにありますが、一行で書けるらしい。すごい。

```r
Num <- function(..., digits=3) drop(unlist(list(...)) %*% (10^(digits*((length(list(...)):1)-1))))
```
azure-storage-logging

Python標準のロギングAPIの出力を各種Azureストレージに送信するライブラリを作成し、本日に公開しました。クラウドサービスやWebサイトなど、特にアプリケーションログの回収・保管が煩わしい局面等でご活用ください。使い方等の詳細はPyPIのページ上でご確認ください。
https://pypi.python.org/pypi/azure-storage-logging

なお内部で使用している[azure](https://pypi.python.org/pypi/azure)(Windows Azure SDK for Python)側の事情もあり、こちらのライブラリを利用できるPythonのバージョンは今のところ2.7のみです。SDKもクラウドサービスもWebサイトも、早くPython3サポートが追加されると良いですね！
「要求されたアクションを実行するには、WordPress が Web サーバーにアクセスする必要があります。 」って怒られた

QiitaのMarkdown練習を兼ねて、以前別のところに書いたWordPress関連のメモを投稿してみる

WordPress で、テーマをインストールしようとしたら怒られた。

![要求されたアクションを実行するには、WordPress が Web サーバーにアクセスする必要があります。 次に進むには FTP の接続情報を入力してください。](http://cl.ly/image/2m061e0C0y0s/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202013-08-22%209.37.51.png)

これ。

で、ちょいと調べてみたところ、どうやら、wordpressフォルダへのアクセス権がまずいようだ。

```bash:
$ sudo chown -R daemon:daemon myblog
```

とすることで、解決した。
これでテーマやらプラグインのインストールもサクサク。わーい！

実はコレには紆余曲折があって、参考にしたサイトでは、apacheユーザ/apacheグループでアクセスしていたので、じゃあ

```bash:
$ sudo chown -R apache:apache myblog
```

でいいんじゃね？とか思ったが、apacheグループなんてねえよと怒られ、じゃあ作るよとgroupaddしようとしたら、そんなコマンドねぇよと怒られ、httpd.confのアクセスユーザを変えてみたり、まぁ、初心者ゆえの躓きが多いこと多いこと。

参考にさせていただいたサイト
[自宅サーバー Fedora]
(http://honana.com/apache/apache_22/user)
  httpd.conf の書き換えについても言及している



ポソリ…
daemonの綴り間違い(deamonになってた)とか…
git current-branch, git fetch-pulls, git pull-dry-run など git alias ネタ

Git Advent Calendar 11日目担当の @sonots です。

ちょっとした git alias ネタを紹介します。

# git current-branch

git の current branch をコマンドで取得するにはこんなかんじのことをします。

```bash
$ git rev-parse --abbrev-ref HEAD
```

ということで ~/.gitconfig の `[alias]` の下に

```
  current-branch = rev-parse --abbrev-ref HEAD
```

と追記し、`git current-branch` と打って使っています．

# ggpull

origin リモートの current-branch を pull する alias です。
[oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh) の git plugin を真似して git の alias ではなくシェルの alias にしています。.zshrc または .bashrc に、

```
alias ggpull='git pull --rebase origin $(git current-branch)'
```

ついでに、いつも fork 元のレポジトリは upstream という名前にするようにしているので、次のようにして gupull でもってこれるようにもしています。

```
alias gupull='git pull --rebase upstream $(git current-branch)'
```

# git fetch-pulls

こんなかんじにすると [github の pull requests を手元に持ってくる](http://qiita.com/sonots/items/16df445132e704198e3e)ことができます。

```bash
$ git fetch origin '+refs/pull/*:refs/remotes/pr/*'
```

ということで ~/.gitconfig の `[alias]` の下に

```
  fetch-pulls = fetch origin +refs/pull/*:refs/remotes/pull/*
```

と追記し、`git fetch-pulls` と打って使っています．

pull request をもらった時に、その pull req ブランチを手元に持ってきて実際に走らせたりするときに使ってます。

# git pull-dry-run

git pull してからコンフリクトすると嫌なので、git pull する前に変更をあらかじめ調べるにはどうしたら良い？
という話が社内IRCでちょろっと出た時に見つかった解決策です。こんなかんじでできます。

```
$ git fetch origin; B=$(git rev-parse --abbrev-ref HEAD); git diff --stat --summary ${B}..origin/${B}
 CHANGELOG.md                       | 6 ++++++
 README.md                          | 8 ++++----
 2 files changed, 12 insertions(+), 4 deletions(-)
```

ということで ~/.gitconfig の `[alias]` の下に

```
  pull-dry-run  = !"git fetch origin; B=$(git rev-parse --abbrev-ref HEAD); git diff --stat --summary ${B}..origin/${B}"
```

と追記し、`git pull-dry-run` と打って使っています．

※ あ、[(ひ)メモ](http://d.hatena.ne.jp/hirose31/20130724/1374648978) にすでに書いてあった。。。まぁ、alias 化したということで。。。

# おわりに

もっと改善点とか alias ネタあったらウェルカム！
Ceylonの型合成(Union Type) 機能

あまりにマイナーでライブラリやフレームワークの紹介も出来ないので
ネタ切れになりそうですがアドベントしています。。

今回は合成型について。

たまーにですが２つの型を同じ入れ物に入れたいって時がありますよね？
そんなときはこんな感じで使えます。

```ceylon

	List<String|Integer> list = LazyList{ 1, "two" , 3 };

````

「 | 」で結合するとその型を両方使うことを表すことが出来ます。
今回のコードではListにIntegerもStringも入れることが出来るようになります。

Javaであればこのようになってしまうと

```java

 List<Object> list;

````

のようにObjectになってしまいます。
Ceylonであればそんなことは無く、何の型が入るかはっきり表現することが出来ます。


さてListに入ったオブジェクトの使い方ですが、
このまま取り出すとそのオブジェクトがIntegerかStringにしぼられているとはいえ
どちらか分かりません。

なので使うときは以下のようになります。

```ceylon

	for(e in list) {
		if(is String e) {
			// ここでStringのメソッドが使える
		}
		if(is Integer e) {
			// ここでIntegerのメソッドが使える
		}
	}

````

はい。ちゃんと型チェックしてやる必要があります。
[こちらの記事] (http://qiita.com/newta/items/41d5bc6f25b0ba8d9cc6) でも書きました。
未チェックな人はチェックしてみてくださいー。

今回のListのケースは既に設計がイマイチ感がありますが
現場ではもっと適切に使える機会もありそうな合成型でした。
本当にあったAndroidの怖い話


随時更新するメモ。 
## GalaxySⅢで、fixedな要素にscaleかけても効かない
 - そのほかにも再現する端末けっこうあり。fixedは全体的に、いろいろ制約受けてると思ってよい。

## Nexus7で、scaleかけているelementとbackground-attachment: fixedがかちあうと、文字化けする

 - なんだそりゃ…。

## Android3.1は、blur 0pxのbox-shadowに対応してない

 - なにも言わずにshadow自体消えるので注意

 - http://jsdo.it/a_t/3a3g

## ％指定のborder-radiusが効かない

 - これはまぁなんか、おおむね代替可能なので許す。
 - 横幅より大きいpx指定すると効かない、とかいうのもあるらしい。これもなんかまぁまっとうな気もするので許す。
   - http://micomura.hatenablog.jp/entry/2012/01/05/113802
iOS 64bit対応ではまったところ (書きかけ)

# NSInteger CGFloatなどの型

64bit環境では CGFloatはdouble型!

```objc
#if defined(__LP64__) && __LP64__
# define CGFLOAT_TYPE double
# define CGFLOAT_IS_DOUBLE 1
# define CGFLOAT_MIN DBL_MIN
# define CGFLOAT_MAX DBL_MAX
#else
# define CGFLOAT_TYPE float
# define CGFLOAT_IS_DOUBLE 0
# define CGFLOAT_MIN FLT_MIN
# define CGFLOAT_MAX FLT_MAX
#endif

typedef CGFLOAT_TYPE CGFloat;
```

あるところで

```objc
 - (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
```

と書くべきところを

```objc
 - (float) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
```

と書いていただけで、ヘッダーの高さがすべて0に...

```objc
#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
```

同様に`NSInteger`も `long`になっています.  

```objc 
int index = [someArray indexOfObject: someObj];
if ( index !=  NSNotFound) { ... }
```

の  `( index !=  NSNotFound)` は常に`true`になるので注意が必要. 


# objc_msgSend()はタイプキャストしないといけない
RPM・yumでインストールしたJenkinsの設定メモ

yumリポジトリを追加してJenkinsをインストールした場合の起動時JVMのメモリ指定方法をメモ。

/etc/sysconfig/jenkins に起動時のオプションを指定するのがお作法っぽく意図されているのでこちらに書き込むのがよいと思われます。

いろいろと指定できますがVMのメモリはJENKINS_JAVA_OPTIONSに指定します。

```shell-session:/etc/sysconfig/jenkins
#
# Options to pass to java when running Jenkins.
#
JENKINS_JAVA_OPTIONS="-Xms256m -Xmx1024m -Djava.awt.headless=true"
```

他にもポートやデバッグレベルなど指定できますがみればわかるのでここでは書きません。

/etc/rc.d/init.d/jenkinsをみればどの変数が起動時にどのように使われているかわかりますのでご参考までに。
CoreData経由でsqliteに保存した日付データをunixtimeに変換する

CoreData+sqliteでNSDateオブジェクトを永続化すると、sqlite上では2001/1/1 00:00:00GMT (unixtime=978307200)を基点とした秒数がtimestamp型で保存される。

NSDate#timeIntervalSinceReferenceDateを内部で使ってるんでしょうかね。

なので.sqliteから直接日付を取り出して確認したい場合は

```
978307200 + (timestamp) = unixtime
```

でOK

###2015-02-05追記###
全CoreData使いが幸せになれるツールをご用意しました。
http://kenmaz.net/tools/unixtime.html
余計な差分“No newline at end of file”を何とかしたい


とあるファイルをVimで修正して保存したら、元のファイルに改行コード(`\n`)がなくて
Git等で余計な差分が出て困る場合の対処方法


事前にファイル末尾に`\n`がないやつを探し出して、一括修正する。
例えばカレント配下の*.jspなら

```sh
find . -type f -name '*.jsp' -exec sh -c "tail -1 {} | xxd -p | tail -1 | grep -q -v 0a$" ';' -exec sh -c "echo >> {}" ';'
```

###### やっていること
* `find -exec`で見つかったファイルに対して処理。ここでは`sh -c`でダブルクォート内部をシェル実行。`’;’`は`-exec`の終端子。
* `tail -1`で最終行のみ出力
* `xxd -p`で素のhex dump
*  `grep -q -v 0a$`でサイレントモードで末尾に`0a`(=`\n`)が無い物を探す。
* 見つかった末尾改行がないファイルに対して`echo >>`して改行を追記。`-exec`は連鎖の絞り込みが効く模様。

もっとエレガントな方法はないものか・・・

# 参考
[objective c - How to fix “No newline at end of file” compiler warning for lots of files - Stack Overflow](http://stackoverflow.com/questions/3261925/how-to-fix-no-newline-at-end-of-file-compiler-warning-for-lots-of-files)
package.jsonとGruntfile.jsのサンプル

grunt.jsで、以下のタスクを行うようにするサンプル。
ファイル一式を置いたら、以下のコマンドのみでインストールできる。

```npm install```

### Sass

_files/css/*.scssに変更があれば
resources/css/style.cssにコンパイルしたCSSを自動で出力する

### JavaScriptの圧縮

_files/js/*.jsに変更があれば
resources/js/all.jsに圧縮したJSを自動で出力する

```json
{
  "name": "grunt",
  "version": "0.0.0",
  "description": "",
  "main": "Gruntfile.js",

  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "BSD-2-Clause",
  "devDependencies": {
    "grunt-contrib-sass": "~0.5.1",
    "grunt-contrib-watch": "~0.5.3",
    "grunt": "~0.4.2",
    "grunt-contrib-uglify": "~0.2.7"
  }
}
```


```js
module.exports = function(grunt) {
"use strict";

  grunt.initConfig({

    sass: {
      dist: {
        options: {
//          style: 'expanded'
          style: 'compressed'
        },
        files: {
          'resources/css/style.css': '_files/sass/style.scss'
        }
      }
    },

    uglify: {
      options: {
        mangle: false,
        //beautify: true
      },
      my_target: {
        files: {
          'resources/js/all.js': [
            '_files/js/jquery.easing.js',
            '_files/js/common.js'
          ]
        }
      }
    },

    watch: {
      uglify: {
        files: [
          '_files/js/*.js'
        ],
        tasks: [
          'uglify'
        ]
      },
      sass: {
        files: [
          '_files/sass/*.scss'
        ],
        tasks: [
          'sass'
        ]
      },
      all: {
        files: [
          '<%= watch.uglify.files %>',
          '<%= watch.sass.files %>'
        ],
        tasks: ['uglify', 'sass']
      }
    }

  });

  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-sass');
  grunt.loadNpmTasks('grunt-contrib-uglify');

  grunt.registerTask('default', ['watch']);

};
```
iOS版safariのfont-size拡大バグ

iOS版safariで、font-sizeが勝手に拡大されるというバグが時々発生する。

html上もcss上もなんら不備はないのに、特定の箇所だけ突然拡大されて表示されてしまうのでなかなか厄介。

どうやら文字サイズの自動調整機能が勝手に発動しているらしい。

というわけで、

```css
body {
    -webkit-text-size-adjust: 100%;
}
```

としてやって、文字サイズ調整機能自体を無効にしてしまうことで解決。

ただ、これをやるとブラウザの拡大機能を使った時に文字サイズが大きくならないので、そのへんはjsでiOS safariのみに適用するとか調整が必要そう。

なお、原因はよくわかっていないので時間があるときに調べておきたい。
FinderでDownloadディレクトリに最速移動


FinderでDownloadディレクトリには
`Opt+Command+L`
で行ける。
Down`L`oadの`L`と覚える。
修飾キーが`Shift`じゃなくて`Opt`なので注意。

戻る、進むは
`Command+[`
`Command+]`
で。
Rangeで取得したデータを常に配列型として扱う

```vbnet
    Dim lastRow As Long
    Dim varData As Variant

    ' なんらかの方法でlastRowを取得
    varData = Worksheets("address").Range("B2:B" & lastRow).Value
    
    If Not IsArray(varData) Then
        varData = Array(varData)
    End If
```
公式ガイドの「Dialogs and Sidebars in Google Apps」を制覇する！（その２）

この記事は、Google Apps Script Advent Calendar 2013 11日目の記事です。

前回、AlertDialogの表示方法について書いたので、その続きで、PromptDialogについてです。

## PromptDialog？
PromptDialogはGoogle Document、Spreadsheet、Formエディタでクライアント側に表示される、メッセージと入力欄があるダイアログです。
ユーザがボタンが押すまで、サーバ側の処理は止まりますが、JDBC接続は切れてしまいます。
（したがって、プロンプトを使ってユーザの入力を取得し、かつJDBCを使う場合は、PromptDialogの表示後に接続にいくようにしないと正常に動作しないということですね）

Document、Formどちらも、ui.prompt()を呼び出すことで、PromptDialogを表示させる事ができます。
戻り値が押されたボタンと入力されたテキストを持つオブジェクトなので、入力されたテキストを取得するには、result.getResponseText()を呼び出し、押されたボタンを取得するには、result.getSelectedButton()を呼び出すと取得できます。

PromptDialog1つでも、任意の書類を自動生成するための入力項目に使用するなどの用途が考えられますし、手軽に利用できるので、ユーザの簡単な入力等に利用してみて下さい。

## PromptDialogを表示する。

### Google Document編
```js:コード.gs
// 事前にUiオブジェクトを取得しておく
var ui = DocumentApp.getUi();

function onOpen(e) {
  ui.createMenu("テストメニュー")
  .addItem("PromptDialog表示", 'showPromptDialog')
  .addToUi();
}

// ※最初の実行時に承認が必要です。
function showPromptDialog() {
  var doc = DocumentApp.getActiveDocument();
  var result = ui.prompt("PromptDialog", "名前を入力して下さい。", ui.ButtonSet.OK_CANCEL);
  
  // 押されたボタンを取得する。
  var btn = result.getSelectedButton();
  
  // getResponseText()はキャンセル、×ボタンを押した時も、入力があれば取得できます。
  if(btn == ui.Button.OK) {
    doc.getBody().appendParagraph("あなたの名前は「" + result.getResponseText() +  "」です。")
  } else if(btn == ui.Button.CANCEL) {
    doc.getBody().appendParagraph("キャンセルを押した！(" + result.getResponseText() + ")")
  } else if(btn == ui.Button.CLOSE) {
    doc.getBody().appendParagraph("×ボタンを押した！(" + result.getResponseText() + ")");
  }
}
```

### Spreadsheet編
これは、Browser.inputBox()で表示できますので、私の書籍をごらん下さい…。

### Google Form編
```js:コード.gs
// 事前にUiオブジェクトを取得しておく
var ui = FormApp.getUi();

function onOpen(e) {
  ui.createMenu("テストメニュー")
  .addItem("PromptDialog表示", 'showPromptDialog')
  .addToUi();
}

// ※最初の実行時に承認が必要です。
function showPromptDialog() {
  var form = FormApp.getActiveForm();
  var result = ui.prompt("PromptDialog", "名前を入力して下さい。", ui.ButtonSet.OK_CANCEL);
  
  // 押されたボタンを取得する。
  var btn = result.getSelectedButton();
  
  // getResponseText()はキャンセル、×ボタンを押した時も、入力があれば取得できます。
  if(btn == ui.Button.OK) {
    form.addTextItem().setTitle("あなたの名前は「" + result.getResponseText() +  "」です。");
  } else if(btn == ui.Button.CANCEL) {
    form.addTextItem().setTitle("キャンセルを押した！(" + result.getResponseText() + ")");
  } else if(btn == ui.Button.CLOSE) {
    form.addTextItem().setTitle("×ボタンを押した！(" + result.getResponseText() + ")");
  }
}
```
【JavaScript】連想配列で要素数の取得

こんにちは。

そうそう、昨日こんな記事を見ました。

>ブログを三ヶ月毎日続けるためにやったこと
http://d.hatena.ne.jp/shu223/20131209/1386578929

特にこの中にあるスライドショーがすごいと思った。

僕の中ではすごい

>「スキルなし・実績なし」 32歳窓際エンジニアがシリコンバレーで働くようになるまで

ここに惹かれました。
それで記事を読んでいくと、メモがわりに使っていたと。

確かにメモを取るにはすごい便利かも。
（というかやっていたので、そのまま続投です。

長くなりそうなので、感想は別ブログで行います。


さて、はまりました。

連想配列の要素数をとりだしたいがために

```js
var hogeArr = { hoge1 : "h" , hoge2 : "o" , hoge3 : "g" , hoge4 : "e" } ;


for(var i = 0 ;  i < hogeArr.length ; i++){
    alert(hogeArr["hoge" + i]) ;
}
```

これ、なにも反応しませんでした。
調べてみるとどうやら
>JavaScriptの連想配列には.lengthが使えません。
理由は添字が数値でなくなるから。

・・・。
連想配列と配列は別物みたいですね。

今はhoge1みたいに最後に数字をつけていたり全体の要素数が見えているから

```js
for(var i = 1 ; i < 5 ; i ++){
}
```

とか出来るけど、
と考えていたらどうやら``` for in```文でオブジェクトを取り出していく方法があるみたいですね。

```js
for(var i in hoge){
    output(hoge[i]) ;
}
```

だったらこうやって要素数をしらべるのかな。

```js
var hogeArr = 0 ;
for(var j in hogeArr){
}
hogeArr = j ;
alert(hogeArr) ;
```

alertで出してみたけど、なんか要素数を出したいのに違う答えが・・・。
もう少し調査です。

しかし、皆さんあたまいいなぁ・・・と思う今日この頃でした。
それではこれからも宜しくお願いいたします。


*****
追記：
解決しました！

for in のなかに 回数判定用の変数をいれたり、 .lengthを使用したり
やり方は多義にわたりますね。

コメントくださった方々ありがとうございます！
Macのupdatedbの場所


`locate`コマンドのデータを更新するためのコマンド
`updatedb`をMacでやるときは
`/usr/libexec/locate.updatedb`
を叩く


# 参考
http://d.hatena.ne.jp/hekyou/20110922/p1
http://ka-zoo.net/2013/04/locate-and-updatedb-on-os/
Gitのpre-commit.sampleにある4b825dc642cb6eb9a060e54bf8d69288fbee4904とは？


`.git/hooks/pre-commit.sample`

```sh
~~
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments.  The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".

if git rev-parse --verify HEAD >/dev/null 2>&1
then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
~~
```

にあるマジックナンバー的なSHA値
`4b825dc642cb6eb9a060e54bf8d69288fbee4904`
はempty treeを表す特殊なSHA値とのこと

# 参考
[git's semi-secret empty tree - Stack Overflow](http://stackoverflow.com/questions/9765453/gits-semi-secret-empty-tree)
with_indexが便利だという話とstable_sort_by


Rubyはいろんなことがone lineで書けて便利ですよね。

いろんなことを1行に書けるようにするには

[String](http://ruby-doc.org/core-2.0.0/String.html), [Array](http://ruby-doc.org/core-2.0.0/Array.html), [Hash](http://ruby-doc.org/core-2.0.0/Hash.html), [Enumerable](http://ruby-doc.org/core-2.0.0/Enumerable.html)

あたりの、リスト系の構造になったものにどういうメソッドがあるかを覚えておけば、たいていのことは1行で書けます。

今回の話は、これに加えて、

[Enumerator](http://ruby-doc.org/core-2.0.0/Enumerator.html)

のメソッドも知っておくともっと世界が広がるよという話です。


## map_with_indexが欲しい！

例えば、あるユーザーのリストに対して、名前の前に通し番号をふった文字列を出力したい（あんまり無さそうな例でごめんなさい）という要求があったとしましょう。

それをただ出力すれば良いのであれば、`each_with_index`を使って

```ruby
users.each_with_index do |user, i|
  puts "#{i+1}: #{user.name}"
end
```

とすれば実現できます。

ですが、この結果が配列として欲しいとなると、`map`を使いたいところですが、`map_with_index`なんて関数ないしなぁとなります。

これを解決する一つの方法としては、`each_with_index`の結果を`map`して

```ruby
users.each_with_index.map { |user, i| "#{i+1}: #{user.name}" }
```

とやる方法があります。

でも、これ、カッコ悪いですよね？

で、調べてみると、ありました！[Enumerator](http://ruby-doc.org/core-2.0.0/Enumerator.html)の中に`with_index`というメソッドが！
これを使うと、

```ruby
users.map.with_index { |user, i| "#{i+1}: #{user.name}" }
```

と書くことができ、とても読みやすくなります。
めでたしめでたし。

ちなみに、`with_index`は何の数値からはじめるかを引数にとることができます。なので、

```ruby
users.map.with_index(1) { |user, i| "#{i}: #{user.name}" }
```

として、1-originにすることで`i+1`と毎回しなくてよくなり、少し綺麗に書くことができます。

## with_indexを使って安定ソートを1行で

with_indexにはかなり使える応用があって、それが安定ソート(Stable Sort)です。
何故かRubyはデフォルトで安定ソートが提供されてないんですよね。


例えばFacebookの投稿のようなモデルがあって、それの配列をLike数が多い順、Like数が同じ場合は作られた順でソートしようと思った場合、もし`sort_by`がstableであれば以下の様なコードでうまくいくはず。

```ruby
posts.sort_by(&:created_at).sort_by(&:like_count)
```

ですが、多分ソートの内部実装がQuick Sortなため、値が等しい時の順番が崩れてしまいます。

```
posts.sort_by(&:created_at).sort_by.with_index{ |x,i| x.like_count }
```

と書いて、2回目のソートをstable sort風にすればone lineで書くことができるようになります。


## 普通にstable_sort_byを使えるようにする

上でもコマンド上でやるときはいいですが、通常は

```ruby:enumerable.rb
module Enumerable
  def stable_sort_by
    self.sort_by.with_index{ |e, index| [yield(e), index] }
  end
end
```

とやった上で、

```ruby
posts.stable_sort_by(&:created_at).stable_sort_by(&:like_count)
```

のほうが綺麗ですね。
CodeIgniterでエラーの出力レベルを環境毎に変更する方法

この記事は[CodeIgniter Advent Calendar 2013](http://qiita.com/advent-calendar/2013/codeigniter "CodeIgniter Advent Calendar 2013")の10日目の記事です。

これまで[kaneshinth](http://qiita.com/kaneshinth kaneshinth)さんが1人で書かれていたので、参加させていただきました。

Codeigniterは仕事で2年ほど使っているのですが、度々出くわす問題が、「ステージングサーバでwarningのエラーを表示したい」とか「開発サーバでdeprecatedのエラーを非表示にしたい」とかです。
それぞれ以下ようにphp.iniに設定してWEBサーバをリブートすればいけそうですが、うまくいきません。

```php:php.ini
// 全てのエラーを表示
error_reporting = E_ALL

// deprecatedのエラーを非表示
error_reporting = E_ALL & ~E_DEPRECATED
```

というかやってみると、php.iniのerror_reportingの設定が全然効かない。。

実はこれ、Codeigniterのフロントコントローラーで実行時に設定されているんです。

```php:index.php
if (defined('ENVIRONMENT'))
{
    switch (ENVIRONMENT)
    {
        case 'development':
            error_reporting(E_ALL);
        break;

        case 'testing':
        case 'production':
            error_reporting(0);
        break;

        default:
            exit('The application environment is not set correctly.');
    }
}
```

なので、ここのerror_reportingを変更しないと出力レベルは変わりません。
実行時に設定されているので、リブートは必要ないですね。

どこまでphp.iniで設定するのか、アプリケーションで設定するのかは議論の余地がありますが、ひとまず設定できました。
Codeigniterは他のフレームワークと比べると小回りが効いて、小規模～中規模の開発には向いていると思うので、もっと盛り上げていきたいですね！
SQLではNOT INを使うならNOT EXISTSを使う


psqlとかで`\timing`や`explain`で実行計画取ってもやはり`NOT EXISTS`の方が早かった。

# 参考
[sql - NOT IN vs NOT EXISTS - Stack Overflow](http://stackoverflow.com/questions/173041/not-in-vs-not-exists)
[ＯＲＡＣＬＥ／オラクルＳＱＬリファレンス（チューニング）](http://oracle.se-free.com/tuning/B1_sql3.html)