OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerコンテナ内部からホストのSMTPを利用したい

ちょっとハマったのでメモ書き。
綺麗な形での解決はしていないです。

# 目的
Docker のホスト側には Postfix が設置してある。
Dockerコンテナの内部アプリからメール送信をする際に、このホスト側の Postfix を利用したい。

# 環境の説明
ホストは Debian7 GNU/Linux で、そこに Docker を導入しました。
元々ホスト側には内部からの通知のために Postfix が設置してありました。この Postfix は外部の SMTP にリレーをするだけのサテライトサーバーという構成です。

主に Wordpress からの通知やコンソールエラーの通知といった内部の情報をメールで送信するためのもので、外部からのリクエストは全て遮断し、localhost のリクエストのみ受け付ける形になっています。

# 問題点
Docker は標準状態では仮想ネットワークポートを利用したブリッジ接続を行います。
これは便利で良いのですが、Docker コンテナはホストから見て他のマシンに見えてしまいます。
また Docker コンテナ内部は通常の DNS 経由でしか外の状況がわからないので、ブリッジ上のホストのアドレスが分からない様です。

# 課題
1. ホスト側の Postfix が Docker コンテナからのリクエストを受け入れること
1. Docker コンテナ内でホストを認識できること

# やったこと
## ホスト側で Docker コンテナからのリクエストに応える
`# ip a` と入力しインタフェース一覧を確認します。

```
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 66:ed:33:97:db:48 brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/16 scope global docker0
    inet6 fe80::6819:82ff:fe40:a9c5/64 scope link 
       valid_lft forever preferred_lft forever
```

何番目かは環境に因りますが、手元では `docker0` という名前でブリッジインタフェースが割り当てられていました。
IPv4 アドレスでいうと `172.17.42.1/16` です。
ブリッジネットワークは `172.17.0.0/16` なので、Docker コンテナはここのどこかにいることになります。

これまでの Postfix の設定は `127.0.0.1` のみ受け付ける様になっていたのですが、`172.17.0.0/16` もローカルと見なして受け付けるように設定します。

```
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128, 172.17.0.0/16
inet_interfaces = 127.0.0.1, 172.17.42.1
```

ちょいとハマったのが `inet_interfaces` で、default だと loopback-only(=127.0.0.1) になっていました。これまでは合致していたので問題なかったのですが、今回の目的では明記してやる必要があります。
ずいぶんと昔は default で全インタフェースだったそうで、その頃の記憶があって悩んでいたようです。

## コンテナ内部でホストのブリッジ上アドレスを知る
ホスト側の `172.17.42.1` というアドレスに向かってコンテナ内部から SMTP リクエストを投げてやれば今回の目的は達成です。
さて、ホストのアドレスをどうやって取得するのか。

ホストはインターネット接続されていて DNS も振ってあるのですが、コンテナ内部から DNS で得たアドレスにアクセスすると `docker0` インタフェースではなく、外部と接続されている `eth0` インタフェースからのリクエストと認識してしまいます。
Postfix は外部からのリクエストを塞ぎたいというポリシーで設定していますので、これでは Docker コンテナからのリクエストも弾いてしまします。

今ひとつ有効な手段が見つからなかったので、コンテナ起動時に環境変数としてIPアドレスを渡してやることにしました。
ホスト側で `docker0` インタフェースのアドレスを得る方法もわからなかったので `ip` コマンドの出力結果から抽出しています。

```
# ip r | grep 'docker0' | awk '{print $9}'
```

Docker コンテナの起動時にこれを環境変数として渡してやります。

```
# docker run -d -e "SMTPHOST=`ip r | grep 'docker0' | awk '{print $9}'`"
```

Docker コンテナ内部では `SMTPHOST` という環境変数でホストのIPアドレスが利用できる様になります。

## fig から行うにはどうすれば？
Docker コンテナの起動管理に fig を使い始めているのですが、fig ファイルで上記の様なコマンド結果を含めるにはどうしたら良いのでしょうか？

流石にコマンド実行＆展開はしてくれませんでした。

```
  environment:
    - SMTPHOST=`ip r | grep 'docker0' | awk '{print $9}'`
```

最終的には諦めて、今回は IPアドレスの固定値を渡してやることにしました。

```
  environment:
    - SMTPHOST=172.17.42.1
```
まあ、そうそう変わる情報でもないだろうという妥協のもとに。
宣教師と人喰い人問題を解く

#問題概要
川の左岸に3人の宣教師と3人の人喰い人がいる。
一つの小舟を使って6人とも右岸に渡りたいものとする。
ただし、小舟は最大2人しか乗れない。
左岸・右岸のいずれにおいても人喰い人の人数よりも宣教師の人数がすくなければ宣教師は喰われる。
6人とも無事に右岸に渡る手順を求めよ。

#解法
コードはpython 3で書いた。

左岸の宣教師と人喰い人、小舟の個数を状態とし、深さ優先探索で解く。

左岸のそれぞれの人数が求まれば、右岸の人数も一意的に定まることに注目し、左岸の数だけを考える。

ここで、
左岸の宣教師と人喰い人、小舟の個数の状態を'sXYZ'と定義する。(0<=X<=3,0<=Y<=3,0<=Z<=1)
つまり、宣教師3人、人喰い人3人、小舟1つだった場合は's331'、
宣教師1人、人喰い人2人、小舟0つだった場合は's120'となる。

つまり、この問題は探索木において's331'をスタートとし、's000'をゴールとするような経路を求めることになる。
宣教師の数＞人喰い人の数（'s230'など）の状態は宣教師が人喰い人に喰われてしまうので、遷移先を空集合とする。

遷移先の明示はリストを使うことにする。

上記の内容をソースコードに書くと以下のようになる。
#コード

```Python:DFS.py

children = {'s331':['s310','s130','s220','s320','s230',],'s310':['s321','s331'],
            's130':[],'s220':['s321','s231','s331'],'s320':['s331'],'s230':[],
            's321':['s120','s300','s210','s220','s310'],'s120':[],'s231':[],'s300':['s311','s321'],'s210':[],
            's311':['s110','s210','s200','s300'],'s200':[],'s110':['s131','s311','s211','s121','s221'],
            's131':[],'s211':[],'s121':[],'s221':['s020','s110','s200'],'s020':['s121','s221','s131','s031'],
            's031':['s010','s020'],'s010':['s211','s121','s031','s111','s021'],'s111':['s000','s100','s010'],
            's021':['s000','s010'],'s100':[]}

def Print(List,Close,s):
    list_num = len(List)
    print(List,end = "")
    if list_num == 0:
        base = 78
    elif list_num > 0:
        base = 80
    for i in range(0,base-(list_num*6 + (list_num-1)*2)):
        print(" ",end = "")
        
    close_num = len(Close)
    print(Close,end = "")
    if close_num == 0:
        base = 118
    elif close_num > 0:
        base = 120
    for i in range(0,base-(close_num*6 + (close_num-1)*2)):
        print(" ",end = "")
    print("|",s)    
    
    
L = ['s331']
C = []
print("|List                                                                             |Close                                                                                                                    |s")
print("/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////")
while len(L) != 0:
    s = L.pop(0)
    Print(L,C,s)
    if s == 's000':
        print("I found a goal!!!!!!!!!!!!")
        break
    C = C + [s] 
    Print(L,C,s)
    m = [v for v in children[s] if (v not in C)&(v not in L)]
    L = m + L
    Print(L,C,s)

```

#考察
この方法だと汎用性が無く、遷移を書くときにもミスが起きる可能性が高い。
さらに、宣教師と人喰い人の人数が多くなった場合の遷移が多すぎて書ききれない。
したがって、本来は状態遷移をリストではなく再帰的な手法を用いるとよい。
しかし、今回は学校の課題として方法を指定されたのでこの方法を取った。
cloud-init を None データソースで動作確認する

AWS の CentOS 6 に cloud-init をインストールしていろいろ試してみようと思ったのですが、動きを確認するためにいちいちインスタンスを起動していたのではたまらんわーっと思いました。

そこで、None データソースを使ってローカルの環境で簡単に確認できるようにしてみました。

 - http://cloudinit.readthedocs.org/en/latest/topics/datasources.html#fallback-none

## インストール

yum でインストールします。

```
yum install cloud-init
```

## cloud.cfg

`datasource_list` で `None` データソースだけを指定し、`datasource` でメタデータとユーザーデータを指定します。

ユーザーデータは `#include` で `/etc/cloud/user-data` を読み込むようにします。

`cloud_***_modules` には動作を試したいモジュールを記述します。

```yaml:/etc/cloud/cloud.cfg
datasource_list: [None]
datasource:
  None:
    metadata:
    userdata_raw: |
      #include
      /etc/cloud/user-data

cloud_init_modules:
 - bootcmd
 - set-hostname
 - update-hostname

cloud_config_modules:
 - runcmd

cloud_final_modules:
 - scripts-user
```

## user-data

ユーザーデータをそれっぽく作ります。

```yaml:/etc/cloud/user-data
#cloud-config

hostname: oreore.example.net
fqdn: oreore.example.net

bootcmd:
 - ["bash", "-c", "echo `date`: bootcmd | tee -a /tmp/bootcmd"]

runcmd:
 - ["bash", "-c", "echo `date`: runcmd | tee -a /tmp/runcmd"]
```

## 動作確認用のスクリプト

リブートせずに動作確認するために次のスクリプトを作成します。

```bash:cloud-init-test
#!/bin/bash

rm -f /etc/hostname
hostname localhost.localdomain

rm -f /tmp/bootcmd
rm -f /tmp/runcmd

if [ "first" == "$1" ]; then
  rm -fr /var/lib/cloud/*
fi

for x in cloud-init-local cloud-init cloud-config cloud-final; do
  service $x start
done
```

## 初回ブート時

スクリプトに `first` と引数を付けて実行します。これは初回ブート時の動作です。

```console
# ./cloud-init-test first
```

ホスト名が設定されていることを確認します。

```console
# hostname
oreore.example.net

# cat /etc/hostname 
oreore.example.net
```

bootcmd が実行されていることを確認します。

```console
# cat /tmp/bootcmd
Sun Nov 16 16:58:36 JST 2014: bootcmd
```

runcmd が実行されていることを確認します。

```console
# cat /tmp/runcmd
Sun Nov 16 16:58:37 JST 2014: runcmd
```

## ２回目以降のブート時

スクリプトに引数を付けずに実行します。これは２回目以降のブート時の動作です。

```console
# ./cloud-init-test
```

ホスト名が設定されていることを確認します。

```console
# hostname
oreore.example.net

# cat /etc/hostname 
oreore.example.net
```

bootcmd が実行されていることを確認します。

```console
# cat /tmp/bootcmd
Sun Nov 16 16:59:23 JST 2014: bootcmd
```

runcmd は実行されませんでした。runcmd は初回のブート時にだけ実行されるもののようです。

```console
# cat /tmp/runcmd
cat: /tmp/runcmd: No such file or directory
```
Unity　プラットフォーム判別

#プラットフォーム判別#

Unityでプラットフォームごとに、コードを変えたい場合は多々あると思います
このページではUnityでのプラットフォーム判別方法をまとめています

##1.Platform Dependent Compilationを使う##


Platform Dependent Compilation(プラットフォーム依存コンパイル)を使う事で、コンパイル時に
プラットフォームに応じてコードを分けることが出来ます

実際のコードは以下のように書きます if,else if,elseを使う事が出来ます

```csharp:unity.cs
#if UNITY_EDITOR
    Debug.Log("Unity Editor");

#elif UNITY_IPHONE
    Debug.Log("Unity iPhone");
#else
    Debug.Log("Any other platform");
#endif
```

条件は、プラットフォームやUnityのバージョンを指定する事が出来ます

よく使われる例を挙げておきます

| プラットフォーム | 条件文 | 
|:-----------|:------------|
| Unityエディタ| UNITY_EDITOR |
| MacOS  |     UNITY_STANDALONE_OSX| 
| Windows  |  UNITY_STANDALONE_WIN |
| LINUX      |  UNITY_STANDALONE_LINUX|
| WebPlayer| UNITY_WEBPLAYER|
| iPhone  | UNITY_IPHONE| 
|Android|UNITY_ANDROID|
|Unity 4.5|UNITY_4_5|

詳細は[公式ページ](http://docs.unity3d.com/Manual/PlatformDependentCompilation.html)をご覧下さい


また、Player Settings の Other Settingsからカスタム定義を加える事も出来ます
![2_1.png](https://qiita-image-store.s3.amazonaws.com/0/59429/ef128986-6d9b-ec5f-cd1e-b28938d6bfd0.png)

詳細は[公式ページ](http://docs-jp.unity3d.com/Documentation/Manual/PlatformDependentCompilation.html)をご覧下さい

##2.Application.platformを使う##

Application.platformを使う事で、実行時のプラットフォームを判別することが出来ます

```csharp:Unity.cs
if (Application.platform == RuntimePlatform.Android) {
  // Android
}
else if (Application.platform == RuntimePlatform.IPhonePlayer) {
  // iOS
}
else if (Application.platform == RuntimePlatform.WindowsPlayer) {
  // Windows
}
else  {

}
```

指定出来るプラットフォームは[公式サイト](http://docs.unity3d.com/ScriptReference/RuntimePlatform.html)を参照してください


##3.Debug.isDebugBuildを使う##

![2_2.png](https://qiita-image-store.s3.amazonaws.com/0/59429/58a598c3-de45-563e-1183-72b9cd8deca4.png)

Debug.isDebugBuildによってデバッグ状態でビルドされたかどうかを判別することが出来ます

```csharp:Unity.cs
 if (Debug.isDebugBuild)
            Debug.Log("This is a debug build!");
```
ディレクトリ中の元ファイルと.gzファイルを比較して元ファイルが新しいものだけをgzipするバッチ

<p>久しぶりにコマンドプロンプトでバッチコマンドを作ってみた。</p>
<p>何気にコマンドプロンプトも機能拡張していることに今頃気づいた私であった。
</p>
<p>事前にgzipコマンドをインストールしておかないと動かないので注意。</p>
<pre>
@ECHO off
rem #############################################################
rem 指定したディレクトリ中の元ファイルと.gzファイルを比較して元ファイルが新しいものだけをgzip化
rem もし.gzファイルがない場合は作る
rem #############################################################
rem 環境変数の遅延展開を可能にする
setlocal enabledelayedexpansion
for /R %1 %%1 in (*.*) do (
   if &quot;%%~x1&quot; NEQ &quot;.gz&quot; (
		set gzipf=%%1.gz
		if EXIST !gzipf! (
		   for %%g in (!gzipf!) do (
				set tf=%%~t1
				set tgzip=%%~tg
				if &quot;!tf!&quot; GTR &quot;!tgzip!&quot; (
					@echo 日付が新しい: %%1
					gzip -9Nfk %%1
			   )
		   )
		) else (
			 @echo gzファイルが存在しない: %%1
			 gzip -9Nfk %%1
		)
	)
)
</pre>
VNCServerをUbuntu14.04で建てる。

#前提
Ubuntu14.04にvncserverを入れた。vncはいい、どんなマシンでもつながるし実績が豊富だ。
動画はとってもカクつくけどね。AndroidもiOSも分け隔てしない。
ただし、当方のマシンはUbuntu12.04からのアップグレードである。
問題発生以降はトラブルシューティングなので、最初の方で成功したらあとは無視していい。

##手順
※ネットで出てくる順当な方法
Ubuntu14.04をインストールした前提で
`sudo apt-get install vnc4server`
`vncserver :1`
パスワード8文字を決める。
`vncpasswd　`
確認
`netstat -an | grep 5901`
これで
`tcp        0      0 0.0.0.0:5901            0.0.0.0:*               LISTEN`
が出てくればOK

###設定ファイル~/.vnc/xstartup
標準ではgnomeとか慣れ親しんだ系が出てこないのでgnomeを使えるようにする。
`sudo apt-get install gnome-core gdm`
現在このような設定で動かしている。
`nano ~/.vnc/xstartup`

```filname:~/.vnc/xstartup
#!/bin/sh

# Uncomment the following two lines for normal desktop:
#export XKL_XMODMAP_DISABLE=1
#unset SESSION_MANAGER
#日本語入力設定
unset DBUS_SESSION_BUS_ADDRESS
export GTK_IM_MODULE=ibus
export XMODIFIERS="@im=ibus"
export QT_IM_MODULE=ibus
/usr/bin/ibus-daemon -dxr

#/usr/bin/gnome-session --session=ubuntu-2d

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
exec gnome-session &
gnome-panel &
gnome-settings-daemon &
metacity &
nautilus -n &
gnome-terminal &
```
### 日本語入力を行う場合
日本語言語パックと、ibusを使うという前提でibus-mozcを入れる。
`sudo apt-get install language-pack-ja-base language-pack-ja ibus-mozc`
ロケールを日本語にして、面倒なので再起動する。
`sudo update-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"`

ここは適当で申し分けないのだが、英語版から入れたのでフォントがなく、上記の設定のみでは動かないようである。
lxdeとフォントも入れておくことにする。多分フォントだけが必要。
`sudo apt-get install lxde fonts-ipafont-mincho`


### 音楽を流したい場合
ストックしてある音声ファイルをvncserverから流したい場合は次のようにuserをaudioグループに追加する。
※userAを自分のユーザに置き換え
`sudo gpasswd -a userA audio`

画面のないつないでない、画面をいちいち見たくないマシンを音声再生専用マシンにするには便利である。

## 問題発生

* つながらない。再起動前はつかえていたのに。
* `netstat -an | grep 5901`とやると　`tcp6       0      0 :::5901                 :::*                    LISTEN `なんて帰ってくる。ipv4が開いてない。
* ipv6を無効化しても同じ。
> `sudo nano /etc/sysctl.conf`
> 以下のような行を追加した。
> `net.ipv6.conf.all.disable_ipv6 = 1`
> `net.ipv6.conf.default.disable_ipv6 = 1`
> 反映
> `sudo sysctl -p`

※新規インストールの場合はvnc4serverでもipv6でも使えた。

* Unity-2d（`/usr/bin/gnome-session --session=ubuntu-2d`）は使えなくなった。仕方ないのでgnome-fallbackを使う。※上記xstartupファイルを参照
* apparmorを無効化しても効果がない。

##解決方法
Xvnc4というのがはじめにvnc4serverとして入るのだがこれをtightvncに切り替える。
`sudo apt-get purge vnc4server`
`sudo apt-get install tightvncserver`

これで当方は解決した。

##キーボード問題
以下の事象はvnc4serverでは発生しないようでは有る。
###sとdと上、下キーの挙動がおかしい・・
* s:キーを押すとgnomeのメニューが開く
* d:キーを押すとデスクトップ表示になる。
* 上:キーを押すとWindowが最大化表示になる。
* 下:キーを押すとWindowが最小化表示になる。

###解決策
VNCなどGnomeの表示が生きている状態で
* `gsettings set org.gnome.desktop.wm.keybindings panel-main-menu "['<Alt>F1']";`
* `gsettings set org.gnome.desktop.wm.keybindings show-desktop "['<Shift><Alt>F1']";`
* `gsettings set org.gnome.desktop.wm.keybindings maximize "['<Primary><Super>Up','<Alt>KP_5']";`
* `gsettings set org.gnome.desktop.wm.keybindings unmaximize "['<Primary><Super>Down','<Alt>F5']";`

もしくは
gconf-editorを使ってもorg→gnome→desktop→wm→keybindingsから設定は可能ではある・・・もちろんキーボードが正確に動けばだが。
まあマウスで消していくことも可能。目安として<Super>キーになっている奴は<Super>が有効に選抜に関われてないので問答無用でキーアクションを上書きしてしまうようだ。

これで解決。
Rails responseにrenderでjsファイルを返すには


render js: 'ファイル名'とかやって無駄に時間を費やした自分向けのメモです。

# NGケース

```ruby
class CommandsController < ApplicationController
  def create
    # command_result.js.erbが読まれると期待しても、クライアントへの応答は'command_result'という文字列
    render js: 'command_result'
  end
end
```

# OKケース

```ruby
class CommandsController < ApplicationController
  def create
    # command_result.jsやcommand_result.coffeeの内容を、クライアントへ返す
    render 'command_result'
  end
end
```
GFMS + Marked を改良して、Qiita っぽいものを作る

# 動機

自分、Markdown が好きです。ちょっと前までは Google Docs などでメモを取っていたのですが

* オンラインでないといけない
* Vim が使えない（Vim も大好きです）
* 汎用性がない（データを取り出しにくい）

などとちょっと不便に感じていたのでメモも Markdown で取るようになってきました。

なので、Markdown で技術的なコンテンツを書いて気軽に公開できる Qiita も好きです。

ただ、パッとローカルで好きなエディタで書いてすぐに検証できる方法がほしいなぁ〜と思い、 探しまわってたら、

[GitHub Flavored Markdown Server (GFMS)](https://github.com/pawel-wiejacha/gfms)

ってのを見つけました。ローカルの Markdown ファイルを [Marked](https://github.com/chjj/marked) + [node.js](http://nodejs.org/) でブラウザ上で簡単に見られるようにするツールです。

自分のほしいものに近かったのですが、そのままだと

1. カレントディレクトリからしか起動できない
1. 言語名の後にコロン ( : ) が付いていると動かない
1. emoji が使えない

と、ちょっと使いづらい・足りない部分があったので、自分で改良していって見ようと思いました。


# カレントディレクトリからしか起動できない

GFMS を起動する際に起動したときにいるディレクトリを Web サーバのルートとして動くので、起動時にいちいちそのディレクトリに移動しないといけないのが面倒です。
これは結構簡単なんでないかな、と思い、[ちょっと変更](https://github.com/diskshima/gfms/commit/6b9eabe145f0aac03c13ee61d21cddac17e52e10)してみました。

抜けてた文末のセミコロンを入れるコミットも一緒にしてしまったので、diff が美しくないですが、大事なのはこの部分です。

-d/--directory コマンドライン引数を付ける。

```diff:
+ .alias('d', 'directory')
+ .describe('h', 'Directory to use as root.')
+ .default('d', process.cwd())
```

プロセスのカレントディレクトリを取るのではなく、引数から取ってくる。

```diff:
+ var rootDir = argv.d;

- var dir = decodeURI(process.cwd() + base);
+ var dir = decodeURI(rootDir + base);
```


# 言語名の後にコロン ( : ) が付いていると動かない

Qiita の Markdown ではコードの言語をしている後に `javascript:main.js` のように ファイル名を指定することができます。
ただ、この記法 GitHub の Markdown にはないので Marked もここでエラーしちゃいます。
ということで、ファイル名をいきなり出すのはちょっと面倒そうだったので、Marked に手を入れて、[とりあえずエラーしないようにだけしてみました](https://github.com/diskshima/marked/commit/8153dcd61b946d325f6b714e25fc763e17ad0fe0)。

```diff:
- fences: /^ *(`{3,}|~{3,}) *(\S+)? *\n([\s\S]+?)\s*\1 *(?:\n+|$)/,
+ fences: /^ *(`{3,}|~{3,}) *([^\s:]+)?[ :]*\n([\s\S]+?)\s*\1 *(?:\n+|$)/,
```

まあ、シンプルに : を読んで無視するようにしただけですが、これで Qiita 向けに書いている内容も処理できるようになりました。


# emoji が使えない

これ重要ですね :smile:

いや、真面目は話、こういう小さいものでも感情が出ており、雰囲気とかを出すのにすごくいいと思うのですよ（LINE のスタンプしかり）。

ただこれはさすがに誰かやってるだろうと思って調べた所、ありました。

[Bartvds/marked](https://github.com/Bartvds/marked/)

[emoji 対応のコミット](https://github.com/Bartvds/marked/commit/640f829404b7173bf1f78072257c1509e9e5dec8)

残念ながら、この commit、オリジナルの Marked にはマージされていないので、仕方なく[自分の Fork](https://github.com/diskshima/marked/) にこの commit を持ってきました。

この commit は残念ながら emoji の表記 (コロンで囲まれている文字）があったらどうするか、という部分は自分で書かないといけないです。
ということで、とりあえず Qiita の emoji 用 URL に置き換えるようにしてみました
（Qiitaさん、もしマズければ変更しますので、連絡ください。）

[GitHub Diff](https://github.com/diskshima/gfms/commit/f86241b93448b344aa16d0cabaa6323e39ccca1a)

```diff
+ emoji: function (emoji) {
+ var imageUrl = "https://cdn.qiita.com/emoji/" + encodeURIComponent(emoji) + ".png";
+ return '<img src="' + imageUrl + '" alt="' + emoji + '" width="20" height="20"></img>';
+ },
```


# ということで Push してみた

* [diskshima/marked](https://github.com/diskshima/marked)
* [diskshima/gfms](https://github.com/diskshima/gfms)

GFMS の依存関係（`package.json`）に [diskshima/marked](https://github.com/diskshima/marked) を記載してあるので、下だけ clone すれば使えます。


# 今後

もっと使いやすくするのに以下もやってみたいなーって考えてます。

* Qiita みたいにコードブロックの左上にファイル名を表示する。
* Live Reload（ファイルが更新されたら自動的にブラウザのページもリロード）
* [CommonMark](http://commonmark.org/) 対応（と言っても、Qiita が対応したらですが）
* README.md に説明を付ける。
sassでmediaQueryを簡潔に書く


例えば、

```value.sass
$sp: "only screen and (max-width: 800px), (max-device-width: 800px)"
```

という風に条件を変数に定義しておいて、
使う場面で

```main.sass
@media #{$sp}
	width: 320px
```

というふうに書けばmediaQueryもスッキリ！
vim-auto-saveでインサートモードで自動保存される機能をOFFにする


https://github.com/vim-scripts/vim-auto-save


vimで自動的に保存してくれる機能、便利に使わせてもらってます。



でも、デフォルトで200msec何もしなかったら保存してくれる機能があって、
インサートモードで文字をペチペチ打ってたらちょっと打つ度に保存されて微妙に重くなったり（気のせいな可能性高い）、
気分的にあれな感じになってきた。

githubのページを見てみると、インサートモードの時は自動保存しないというオプションがあったので、それをやってみる事にした。


```
let g:auto_save_in_insert_mode = 0
```


ついでに、保存した時にいちいち`(AutoSaved at 08:40:55)`とかが出てチカチカするのが嫌だったので、
メッセージを表示しないオプションもつけてみた。

```
let g:auto_save_silent = 1
```

https://github.com/vim-scripts/vim-auto-save/blob/master/README.md


これらの設定は普通にREADME見てたら書いてた！ので見てみるといいと思います。
拡張tuple_element


\<utility>のstd::tuple_elementはtupleしか受け取ることができません
なんの意図があるのか知りませんが不便なので汎用のものつくります
GCCとVS2014 CTPで動作確認済みです

```cpp

// for remove_const, remove_cv, remove_reference
#include <type_traits>
//
// 下準備
//
// remove_const
template < class T >
using remove_const_t = typename std::remove_const< T >::type;
// remove_volatile
template < class T >
using remove_volatile_t = typename std::remove_volatile< T >::type;
// remove_cv
template < class T >
using remove_cv_t = typename std::remove_cv< T >::type;
// remove_reference
template < class T >
using remove_reference_t = typename std::remove_reference< T >::type;


//
// extended tuple_element
template < std::size_t, class >
struct _type_element
{ // Ty has no template-parameter
};
template <
  template < class... > class Ty, 
  class Head, class... Body >
struct _type_element< 0, Ty < Head, Body... > >
{ 
  using type = Head; 
};
template <
  std::size_t N,
  template < class... > class Ty,
  class Head, class... Body >
struct _type_element< N, Ty< Head, Body... > >
{ 
  using type = typename _type_element< N - 1, Ty < Body... > >::type; 
};
template < std::size_t N, class Ty >
using _type_element_t = typename _type_element < N, Ty >::type;

template < std::size_t N, class Ty >
using type_element = _type_element< N, remove_cv_t < remove_reference_t < Ty > > >;
template < std::size_t N, class Ty >
using type_element_t = typename type_element< N, Ty >::type;

//
// type_element ここまで
//



template < class... >
struct something {};


#include <iostream>
#include <typeinfo>

int main()
{
  using hoge = something < char, int, long, long long >;
  using hoge_0 = type_element_t < 0, hoge >;  // 0個目
  using hoge_1 = type_element_t < 1, hoge >;  // 1個目
  std::cout << typeid( hoge_0 ).name();
  std::cout << typeid( hoge_1 ).name();
}
```
SwiftでKeychainに保存したデータが取れないときに確認すること


デバッグ版でテストしていざリリース版でテストするぞ！ってときに
盛大にこけたので、記念にメモメモ

## 環境
x-code6.1
swift1.1
ios8.1

## 現象
デバッグモードでビルドしてるときは、保存していた値が問題なく取れていたのに
何故かリリースでビルドすると取れないという。
調べてみると保存は成功しており、値の読み込みが出来ないというよくわからない事が発生してました。

## コード
抜粋ですが保存、読み込みの処理は以下のように実装してました。

```swift:KeychainHelper.swift
import Foundation

import Security

class KeychainHelper {
	// 保存.
    class func save(key:String, value:String) -> Bool {
        let query : [String:AnyObject] = [
            kSecClass : kSecClassGenericPassword,
            kSecAttrAccount : key,
            kSecValueData : value.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion:true)!
        ]
        SecItemDelete(query as CFDictionaryRef)
        let status : OSStatus = SecItemAdd(query as CFDictionaryRef, nil)
        return status == noErr
    }
	// 読み込み.
	class func load(key:String) -> String? {
        let query : [String:AnyObject] = [
            kSecClass       : kSecClassGenericPassword,
            kSecAttrAccount : key,
            kSecReturnData  : kCFBooleanTrue,
            kSecMatchLimit  : kSecMatchLimitOne ]
        
        var dataTypeRef :Unmanaged<AnyObject>?
        
        let status: OSStatus = SecItemCopyMatching(query, &dataTypeRef)

        if status != noErr {
            return nil
        }
        
        if let op = dataTypeRef?.toOpaque() {
            let retrievedData = Unmanaged<NSData>.fromOpaque(op).takeUnretainedValue();
            let result =  NSString(data: retrievedData, encoding: NSUTF8StringEncoding) as String
            return result
        }else{
            return nil
        }
    }
}
```

```swift:サンプル
KeychainHelper.save('key', 'xxx')

// 何度やってもここでnilが帰る
KeychainHelper.load('key')
```

## 解決方法
コードを何度見直しても問題なく動いて、何が悪いんだと調べまくった結果
Swift Compilerの設定で解決できました。 (・ω<)


![xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/13729/e401d20a-7694-49c7-343f-77d1e2660edf.png "xcodeproj.png")

## 参考URL

http://stackoverflow.com/questions/26355630/swift-keychain-and-provisioning-profiles
DexIndexOverflowExceptionと戦った話


Android Studioでビルドした時に、
`com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536`
っていうが出て困った。

なんとか解決したので、メモ

# 参考

- [Building Apps with Over 65K Methods | Android Developers](http://developer.android.com/tools/building/multidex.html)
- [android - Unable to execute dex: method ID not in [0, 0xffff]: 65536 - Stack Overflow](http://stackoverflow.com/questions/15209831/unable-to-execute-dex-method-id-not-in-0-0xffff-65536)
- [Version Compatibility - Android Tools Project Site](http://tools.android.com/tech-docs/new-build-system/version-compatibility)

# 手順

## Android Studioのアップデート

Canaryチャンネルから最新版をダウンロードする


![studio_update_1.png](https://qiita-image-store.s3.amazonaws.com/0/280/7688810b-43b6-56b4-22d3-2a8ac90ba2af.png "studio_update_1.png")

![studio_update_2.png](https://qiita-image-store.s3.amazonaws.com/0/280/da16186c-cfd8-b113-bf19-81fc95f77d5b.png "studio_update_2.png")

ここでCanaryチャンネルを選択する

![studio_update_3.png](https://qiita-image-store.s3.amazonaws.com/0/280/f2c35248-1b57-45e9-66df-f9046d28f291.png "studio_update_3.png")

ここまで行ってから、再度「Check for Update」を選択するとAndroid Studioのアップデートが行えるようになる。

2014年11月16日の時点では0.9.3が最新版となる

![studio_update_4.png](https://qiita-image-store.s3.amazonaws.com/0/280/fad6538b-2a34-8b30-f50c-b66116446d6e.png "studio_update_4.png")

## Gradleのアップデート

Android Studioをアップデートすれば、勝手に`Gradle`はアップデートしてくれる

gradle-wrapper.propertiesの`distributionUrl`で`gradle-2.1-all.zip`が指定してあれば良い

```groovy:gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-2.1-all.zip
```

### Android Gradle Pluginのアップデート

`gradle-2.1`を使うためには`Android Gradle Plugin`をアップデートする必要がある
build.gradleで`0.14.+`が指定してあれば良い

```groovy:build.gradle
dependencies {
    classpath 'com.android.tools.build:gradle:0.14.+'
}
```

## build.gradleの変更

```groovy:build.gradle
// 最新のbuildToolsを指定
buildToolsVersion '21.1.1'
defaultConfig {     
    // 追加
    multiDexEnabled true
}
dependencies {
    // 追加
    compile 'com.android.support:multidex:1.0.0'
}
```

## applicationの修正

例えばApp.javaなどの

```xml
<application
    android:name=".App" ...
```

のようにAndroidManifest.xmlの`application`に指定しているjavaファイルで
継承している`android.app.Application`を`android.support.multidex.MultiDexApplication`に変更し、
`attachBaseContext`を`Override`する

```java:App.java
public class App extends MultiDexApplication {
    ...

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
}
```

これでとりあえず出来た。


## 必要無さそう

```groovy:build.gradle
afterEvaluate {
    tasks.matching {
        it.name.startsWith('dex')
    }.each { dx ->
        if (dx.additionalParameters == null) {
            dx.additionalParameters = []
        }
        dx.additionalParameters += '--multi-dex'

        // this is optional
        // dx.additionalParameters += "--main-dex-list=$projectDir/multidex.keep".toString()
    }
}
dexOptions {
    preDexLibraries = false
}
```

としてみたり、いろいろやったが、最終的にこの辺りを削除しても問題なかった

## 所感

もっと良い解決策ありそう
CentOS6.5でElasticSearchを動かす


Vagrantで立ち上げたCentOS6.5のサーバに公式サイトからElasticSearchのtarをダウンロードして起動するまでのメモ。

公式サイトからtarをダウンロード。
バージョンは現時点（2014.11.16）では1.4.0だった。

```
$ sudo yum install wget java-1.8.0-openjdk-devel -y
$ wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.4.0.tar.gz
$ tar -xvf elasticsearch-1.4.0.tar.gz
```

ElasticSearchを起動する。

```
$ cd elasticsearch-1.4.0/
$ ./bin/elasticsearch
[2014-11-16 04:29:28,660][INFO ][node                     ] [Thena] version[1.4.0], pid[2551], build[bc94bd8/2014-11-05T14:26:12Z]
[2014-11-16 04:29:28,661][INFO ][node                     ] [Thena] initializing ...
[2014-11-16 04:29:28,668][INFO ][plugins                  ] [Thena] loaded [], sites []
[2014-11-16 04:29:32,724][INFO ][node                     ] [Thena] initialized
[2014-11-16 04:29:32,731][INFO ][node                     ] [Thena] starting ...
[2014-11-16 04:29:32,968][INFO ][transport                ] [Thena] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/10.0.2.15:9300]}
[2014-11-16 04:29:33,030][INFO ][discovery                ] [Thena] elasticsearch/9IhKlDvZQE-T0zT5SXRaSA
[2014-11-16 04:29:36,873][INFO ][cluster.service          ] [Thena] new_master [Thena][9IhKlDvZQE-T0zT5SXRaSA][elastic-search][inet[/10.0.2.15:9300]], reason: zen-disco-join (elected_as_master)
[2014-11-16 04:29:36,929][INFO ][http                     ] [Thena] bound_address {inet[/0:0:0:0:0:0:0:0:9200]}, publish_address {inet[/10.0.2.15:9200]}
[2014-11-16 04:29:36,930][INFO ][node                     ] [Thena] started
```

ElasticSearchにアクセス（HTTPリクエスト）する。

```
$ curl localhost:9200
{
  "status" : 200,
  "name" : "Thena",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.4.0",
    "build_hash" : "bc94bd81298f81c656893ab1ddddd30a99356066",
    "build_timestamp" : "2014-11-05T14:26:12Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.2"
  },
  "tagline" : "You Know, for Search"
}
```

終わり。
時刻を10分ごと増加させる iterator を作つた．

Ruby で，Date の Range を作ることができる．例へば，

```range_of_date.rb
require "active_support/time"

a = Date.today
b = a + 3.days

range = a..b
```

のやうに．この range に對して each を使ふことができる：

```range_of_date.rb
range.each do |day|
  puts day
end
```

結果は以下の通り：

```出力
2014-11-16
2014-11-17
2014-11-18
2014-11-19
```

Date の Range と同樣に， Time の Range も作れる：

```range_of_time.rb
require "active_support/time"

c = Time.now
d = Time.now + 2.hours

range = c..d
```

しかしこの range に對しては each が用意されてゐないので，自分で作つてみた．次のやうに作つた．

```each_10_min.rb
require "active_support/time"

class Range
  def each_10_min
    @i = self.first
    until @i > self.last
      yield @i
      @i += 10.minutes
    end
  end
end

c = Time.now
d = Time.now + 2.hours

range = c..d
range.each_10_min do |j|
  puts j
end
```

結果は以下のやうになる：

```出力
2014-11-16 14:40:27 +0900
2014-11-16 14:50:27 +0900
2014-11-16 15:00:27 +0900
2014-11-16 15:10:27 +0900
2014-11-16 15:20:27 +0900
2014-11-16 15:30:27 +0900
2014-11-16 15:40:27 +0900
2014-11-16 15:50:27 +0900
2014-11-16 16:00:27 +0900
2014-11-16 16:10:27 +0900
2014-11-16 16:20:27 +0900
2014-11-16 16:30:27 +0900
2014-11-16 16:40:27 +0900
```

なほ，active_support とは，Date, Time の扱ひを容易にしてくれる library である．詳しくは


[Rubyで日付の計算するならactive_support使っとけって世間で言われてるけどマジだわ](http://yachibit.hatenablog.jp/entry/2013/06/08/030926)

に書いてある．
Elixir | Mix | Test を実行する #elixir

# Elixir | Mix | Test を実行する #elixir

## 概要
Elixir に付属している CLI Tool の Mix でテストを行います

## 事前準備
`mix new` で FizzBuzz プロジェクトを作成します

~~~bash
$ mix new fizzbuzz
* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/fizzbuzz.ex
* creating test
* creating test/test_helper.exs
* creating test/fizzbuzz_test.exs

$ tree
.
`-- fizzbuzz
    |-- config
    |   `-- config.exs
    |-- lib
    |   `-- fizzbuzz.ex
    |-- mix.exs
    |-- README.md
    `-- test
        |-- fizzbuzz_test.exs
        `-- test_helper.exs
~~~

## テスト対象の実装

FizzBuzz を実装します。
数値以外の引数はエラーとします。

~~~elixir:lib/fizzbuzz.ex
defmodule Fizzbuzz do
  def fizzbuzz(from, to) when is_integer(from) and is_integer(to) do
    from..to |> Enum.map(&fizzbuzz/1)
  end
  def fizzbuzz(_from, _to) do
    raise "invalid argument"
  end
  defp fizzbuzz(n) when rem(n, 15) == 0 , do: "FizzBuzz"
  defp fizzbuzz(n) when rem(n, 3) == 0, do: "Fizz"
  defp fizzbuzz(n) when rem(n, 5) == 0, do: "Buzz"
  defp fizzbuzz(n), do: n
end
~~~

## テストを実装
テストのひな形は `mix new` で生成済みのため、中身だけ実装します

~~~elixir:test/fizzbuzz_test.exs
defmodule FizzbuzzTest do
  use ExUnit.Case

  test "FizzBuzz from 1 to 15" do
    assert Fizzbuzz.fizzbuzz(1, 15) ==  [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz"]
  end

  test "If from is not integer, raise Error" do
    assert_raise RuntimeError, "invalid argument", fn ->
      Fizzbuzz.fizzbuzz("1", 15)
    end
  end

  test "If to is not integer, raise Error" do
    assert_raise RuntimeError, "invalid argument", fn ->
      Fizzbuzz.fizzbuzz(1, "15")
    end
  end
end
~~~

## テストを実行

~~~bash
$ mix test
...

Finished in 0.06 seconds (0.05s on load, 0.01s on tests)
3 tests, 0 failures

Randomized with seed 180549
~~~

## 詳細レポート付きでテストを実行

~~~bash
$ mix test --trace

FizzbuzzTest
  * If from is not integer, raise Error (11.0ms)
  * If to is not integer, raise Error (0.06ms)
  * FizzBuzz from 1 to 15 (10.3ms)


Finished in 0.05 seconds (0.04s on load, 0.01s on tests)
3 tests, 0 failures

Randomized with seed 600613
~~~

## 参照
* [Introduction to Mix](http://elixir-lang.org/getting_started/mix_otp/1.html)
SailsのSocket周りが色々と変更になってたメモ


node.jsでフルスタックMVCフレームワークではSailsが一番素晴らしいと思っている私です。
最近はGruntからGulpに置き換えたり、CoffeeScriptで書いたりしています。

# 経緯
・Socket.ioを使おうとした
・サンプル通りにやっても動かない
・ドキュメントが整理中でまともに機能してない
・ソースコードリーディングした
・解決！

# 本題

SailsにはblueprintsというModelを定義するだけでREST APIを作成することができるツールがあります。
これは、最近のモダンなフレームワークにならよくある機能かと思います。
このREST APIを生成出来る機能が`sails.io`と併合して、より使いやすくなりました。

まず、`sails.io.js`をscriptタグで読み込んでおくのが前提です。
そしたらブラウザでログを開いてみましょう。

舟のAAが表示されていれば接続完了です。
特に何もコードを書いていなくてもブラウザのログに表示されるかと思います。
もし表示されなかったり、表示されるまで時間がかかった場合は、WebSocket非対応か、Nginxなどでリバースプロキシを使用している際にheaderを削ってしまっている可能性があります。

それでは早速socketを使ってみましょう。

まずは普通にAPIを叩いてみましょう。
通常はjquery等のXHRを使ったり、AngularJSの$httpのようなものを使用するかと思います。しかし、これらは毎回TCPのコネクションを使用するため、あまりモダンではありません。

SailsではREST APIをblueprintsを通してsocketを使って取得することができます。

```CoffeeScript
io.socket.get "/st?limit=0", (msg)->
  console.log msg
```

普通にGETを叩くときのように使用出来ます。
大量のAPIを叩くときもsocket.ioを使用して通信するため、非常にモダンな感じになります。

また、modelの変更情報も簡単に取得することができます。

```CoffeeScript
io.socket.on "st", (msg)->
  console.log msg
```

もうお気づきかもしれませんが、普通にhttpで叩いた時と同じデータが返ってくるので、pathにパラーメーターを追加して、より細かく待ち受けることができます。

また、Socket.ioの要であるroom機能もラップされて実装されていますので、詳しくは公式ドキュメントを御覧ください。
http://sailsjs.org/#/documentation/reference/websockets/sails.sockets/sails.sockets.join.html
jqコマンドを使ってJSONを作り替える

### 元データ

```json:jq

$ echo '{"age":"20", "foo":"bar"}{"age":"15", "foo":"fuga"}' | jq '.'
{
  "age": "20",
  "foo": "bar"
}
{
  "age": "15",
  "foo": "fuga"
}

```

理想

```json:jq
{
  "20": "bar"
}
{
  "15": "fuga"
}
```

### 作り変え

```json:jq

$ echo '[{"age":"20", "foo":"bar"},{"age":"15", "foo":"fuga"}]' | jq  '.[] | {(.age): .foo}'
{
  "20": "bar"
}
{
  "15": "fuga"
}

```
Coqで証明書いてみた

```coq
Require Import Arith.

Theorem Th1 : 
forall (n : nat),
(exists m : nat, n = m * 2)
-> exists k : nat,  n * 2 = k * 4.

Proof.
intros.
destruct H.
exists x.
rewrite H.
rewrite mult_assoc_reverse.
simpl.
reflexivity.
Qed.
```
[iOS][Git] apple申請中にバグが見つかった場合のリポジトリの運用（これでいいのだろうか）


# 最初に

iOSの開発に携わるようになって2ヶ月くらい経ちました。
元々Subversion だったプロジェクトをGit に移行して運用していますが、中々うまいこといかないなあと思っているので、ちょっと整理しようと思います。

Gitの運用で引っ張る人がいないため、いろいろ悩んでいます。
お気づきの点ご教授いただけたら幸いです。

図がなくてすみません。（なにかいいツールとかあるのかな）

# 現状の運用フロー

ひとまず、[A successful Git branching model](http://keijinsonyaban.blogspot.jp/2010/10/successful-git-branching-model.html) を参考に、なるべく忠実にやろうとしています。

 - v1.0 のリリースに向けて、develop にfeature/A ブランチをマージ
 - release/1.0 のブランチをdevelopから派生させて作成
 - ipa に固めて顧客に提供する
 - 顧客がiTunes Connect で申請する
 - 問題なくapp store にリリースされたらrelease/1.0 をmaster にマージしてtag をつける

請負の場合、こんなパターンになるかな、と思います。

# apple審査中にバグが見つかった場合

本題です。
まず簡単に、リリース用ipa を作成するまでのコマンドです。

```bash
git checkout develop
git merge --no-ff feature/A
git checkout -b release/1.0
git commit -am "version 1.0"
```

ここで、apple に申請した後は１週間くらい時間があります。
この間に、次のバージョンv1.1 へ向けて開発は進みます。
一段落したので、developにマージしちゃいました。

```bash
# v1.1 のリリースに向けて、develop にfeature/Bブランチをマージ
git checkout develop
git merge --no-ff feature/B
```


**ここで、v1.0 のアプリにバグが見つかりました。**
feature/A に新たに修正を施します。

```bash
git checkout feature/A
git commit -am "bug fix"
```

無事開発者の対応が終わりました。
さて、これをどこのブランチにマージしたらよいでしょうか。

なお顧客はv1.0 のアプリをまだapple審査には出していませんでした。
つまり、バージョンは1.0 のままがいい、と言っています。
さらに、v1.0 とv1.1 のリリースタイミングは分けたいので、v1.0 にfeature/B を含めることはできません。

## develop にはマージしないこと
develop にはfeature/B の修正がマージされてしまっています。
不慣れだと、"じゃあfeature/B をマージするひとつ前のバージョンから分岐させてdevelop_B を作ろう" とか考えちゃうんですが、そうするともはやdevelop ブランチの役割が意味不明になります。

## 対処法その１

ここは、直接release/1.0 にfeature/B をマージしましょう。
そして必要なら、develop にもマージしましょう。

```bash
git checkout release/1.0
git merge --no-ff feature/A
git checkout develop
git merge --no-ff feature/A
```

これで再度ipa を作ればokですね。

## 対処法その２
もう１つのやり方として、release/1.0.1 のブランチを切る、というのもあると思います。
アプリのバージョンはそのままなので、release/1.0 のブランチから派生させちゃいます。

```bash
git checkout release/1.0
git checkout -b release/1.0.1
# Build Version をbranch名とそろえます
git commit -am "build version up to 1.0.1"
git merge --no-ff feature/A
```

## 対処法その３
そもそもdevelop にfeature/B をマージするのが早かったのが悪いとして、develop のfeature/B の歴史を消します。
その上で、feature/A の修正を新たにdevelop にマージします。
（リモートにあるものは一度消してpush し直します。）

```bash
git checkout develop
git reset --hard HEAD^
git merge --no-ff feature/A
git checkout release/1.0
git merge --no-ff develop
```

# まとめ
ひとまず選択肢としてはこんな感じでしょうか。
これがいいと思う、とかこれはないわ、とかご意見いただけたらうれしいです。

以上になります。
ActiveRecord 4.1+MySQLで任意のカラムをPKにする

ActiveRecord 4.1+MySQLで、特別な拡張を入れなくても任意の名前・型のカラムをPKにできたのでメモしておきます。

# 書き方
## 名前だけ変える
`primary_key: 'my_id'`

```rb
create_table "items", primary_key: 'my_id', force: true do |t|
  ...
end
```

## 型だけ変える
`id: 'bigint primary key auto_increment'`

```rb
create_table "items", id: 'bigint primary key auto_increment', force: true do |t|
  ...
end
```

## 名前・型を変える
`primary_key: 'my_id', id: 'bigint primary key auto_increment'`

```rb
create_table "items", primary_key: 'my_id', id: 'bigint primary key auto_increment', force: true do |t|
  ...
end
```

# ダンプ
ダンプすると名前の情報は出力されますが型の情報（`id: xxx`）は出力されません。

```rb
create_table "items", primary_key: "my_id", force: true do |t|
  ...
end
```

# 解説
`create_table`でPKの定義を生成しているのが以下の箇所:

[schema_statements.rb#L190](https://github.com/rails/rails/blob/v4.1.7/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb#L190)

```rb
unless options[:id] == false
  pk = options.fetch(:primary_key) {
    Base.get_primary_key table_name.to_s.singularize
  }

  td.primary_key pk, options.fetch(:id, :primary_key), options
end
```

`:id`が`false`でないとき、`:primary_key`の値を名前、`:id`の値を型としてPKを定義しています。

MySQLのネイティブな型の定義は以下の通り:

[abstract_mysql_adapter.rb#L152](https://github.com/rails/rails/blob/v4.1.7/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb#L152)

```rb
NATIVE_DATABASE_TYPES = {
  :primary_key => "int(11) auto_increment PRIMARY KEY",
  :string      => { :name => "varchar", :limit => 255 },
  :text        => { :name => "text" },
  :integer     => { :name => "int", :limit => 4 },
  :float       => { :name => "float" },
  :decimal     => { :name => "decimal" },
  :datetime    => { :name => "datetime" },
  :timestamp   => { :name => "datetime" },
  :time        => { :name => "time" },
  :date        => { :name => "date" },
  :binary      => { :name => "blob" },
  :boolean     => { :name => "tinyint", :limit => 1 }
}
```

実際にSQLを発行するときは[type_to_sqlメソッド](https://github.com/rails/rails/blob/v4.1.7/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb#L685)でネイティブな型に変換していますが

```rb
if native = native_database_types[type.to_sym]
  ...
else
  type.to_s
end
```

`native_database_types`にないものはそのままSQLの型として使われるので、`:id`に「任意の型」+`primary key`を設定すると、任意の型でPKを作成できます。
GNU C コンパイラ： gccをとりあえず動かす

gccのオプションにソース・ファイル名だけを指定すると、
自動的にa.outという名前の実行可能なファイルが作成される。

gcc <i>source_file</i>.c





例：

```hello.c

#include <stdio.h>

int main()
{
    puts("hello");
    return 0;
}

```

> $ gcc hello.c 

”a.out” が作成されるので実行する。

> $ ./a.out

結果：
hello

----

###実行ファイル名を指定して作成： gcc -o <i>name source_file</i>.c

> gcc -o hello hello.c

hello という名前の実行ファイルが作成される。

----

gcc は プログラムのビルドまでの過程を次の通り行う。

1.　プリプロセス（前処理）
2.　コンパイル
3.　アセンブル
4.　リンク

各課程はオプションにより、途中で終わることができる。


|処理過程|プログラム名|対応するgcc オプション|
|:--------------------|:------------------------|:-----------|
|1.プリプロセス  |cpp |-E を指定するとここで終わる|
|2.コンパイル  |cc1 |-S を指定するとここで終わる |
|3.アセンブル  |as |-c を指定するとここで終わる |
|4.リンク  |ld | |


以下、main.cという名前のソースファイルがあるという前提。

###プリプロセスで終了 -E

> $ gcc -E main.c

上のように行うと次のような結果が標準出力に出力される。

```

# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "main.c"

(中略)

extern void *sbrk (intptr_t __delta) __attribute\__ ((__nothrow__ , __leaf__));
# 1080 "/usr/include/unistd.h" 3 4
extern long int syscall (long int __sysno, ...) __attribute__ ((__nothrow__ , __leaf__));
# 1103 "/usr/include/unistd.h" 3 4
extern int lockf (int __fd, int __cmd, __off_t __len) ;
# 1134 "/usr/include/unistd.h" 3 4
extern int fdatasync (int __fildes);
# 1172 "/usr/include/unistd.h" 3 4

# 5 "main.c" 2

int main() { return 0; }

```

この結果はパイプやリダイレクトで別のコマンドや出力先が指定できる。

結果をファイルに出力

> $ gcc -E main.c > preproc

結果を別プロセスに渡す。

> $ gcc -E main.c | cat -s | less


###コンパイルで終了 -S

次のように行うとmain.sという名前のアセンブラファイルが作成される。

> gcc -s main.c

main.sの内容を確認

> less main.s

```
	.file	"main.c"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	$0, %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (GNU) 4.8.3 20140624 (Red Hat 4.8.3-1)"
	.section	.note.GNU-stack,"",@progbits
```


###アセンブルで終了(オブジェクト・ファイル作成) -c

次のように行うとmain.oというオブジェクト・ファイルの作成のみ行われ、リンクは行われない。

> gcc -c main.c


リンクをするには gcc -main.o -o <i>name</i> とする。

> gcc -main.o -o hello

これでhelloという名前の実行ファイルが作成される。

### 追加のインクルード・ディレクトリを指定 -I

"/usr/local/include"を include ディレクティブの探索範囲として追加。

> gcc -I/usr/local/include

### 依存するライブラリがあるディレクトリを指定 -L

> gcc -L/usr/lib/X11 -lX11

-L<i>directory</i>のあと -l(小文字エル)で追加する libxxxx を指定できる。
上の-lX11 は libX11.so といった名前で存在する。

### 知っておくと便利なオプション -D と -U

-DSYMBOL

とすると、ソース・ファイルの先頭に　#define SYMBOL　と書くのと同様になる。

> gcc -main.c -DLEN_MAX 1000 は #define LEN_MAX 1000と同じになる。


-USYMBOL

とすると。#undef SYMBOL　と書くのと同様になる。
OSX Yosemiteアップデート後のApache2.4の起動でハマった

# 事象

「Operation already in progress」って表示されたり、
プロセスにapacheが見つからなかったり(立ち上がってなかっただけ)
立ち上げても localhost でつなぎにいくとエラーになったり。

# 原因

・2.2と2.4で色々書き方が変わっててエラー出してた。
・よくわかんないけど、vhostの一番上の設定がlocalhostとして設定されてた。
　⇒(vhostの記述方法が2.4に沿ってなければ接続できない)

# 対処法

・とりあえず```apachectl configtest```を実行してエラーを潰しまくる。
・書き方が変わってるので、下記の感じで修正する。(httpd.confもvhostの方も両方)

```apache
Order deny,allow
Allow from all
↓
Require all granted
```

```apache:httpd-vhost.confの方だけ
NameVirtualHost
は、必要なくなったので削除
```

・vhostの設定にlocalhostの設定を追加しておく。
  (これが一番ハマった)

---

おわり。
Android Volleyを使った同期処理サンプル(InstrumentationTestCaseを使ったテストコード)

Android Volleyを使った同期通信をテストコードで実相してみました。

実装中にどうしてもタイムアウトしちゃう所があって、その原因の追究のために作成したものなんですが、もしかしたらどなたかのお役にたつかもしれません。

Android Studioの「Run/Debug Configuration」で「Android Tests」を追加して頂ければ使えるはずです。
Contextの取得はこちらの記事を参考にさせていただきました。
http://qiita.com/amay077/items/e3741f6789d663b40183

同期処理についてはこちらを参考にさせてもらいました。
http://nice20blog.blogspot.jp/2014/01/volley.html

ちなみにStringRequestでなくても、JSONObjectRequestでも全然OKです。

```
/**
 * 
 */
public class VolleySyncTest extends InstrumentationTestCase {

    private static final String TAG = VolleySyncTest.class.getSimpleName();

    /**
     * ApplicationContext を取得します
     */
    private Context getApplicationContext() {
        return this.getInstrumentation().getTargetContext().getApplicationContext();
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
    }

    public void testVolleySync() {
        Context context = getApplicationContext();

        RequestQueue mQueue = Volley.newRequestQueue(context);

        String url = "https://www.google.co.jp/";
        //同期処理サンプル
        RequestFuture<String> f = RequestFuture.newFuture();
        StringRequest r= new StringRequest(Request.Method.GET, url, f, f);
        mQueue.add(r);
        mQueue.start();

        try {
            String string = f.get(15000, TimeUnit.MILLISECONDS);
            Log.i(TAG, string);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
    }
}
```
[解決]RailsのSTIでJSONにtypeを含むには


たとえば、TopicというモデルがSTI(Single Table Inheritance)の親モデルだとして、その下に、NewsやReleaseがあったとする。

そのTopicをJSONに変換しようとすると、STIの`type`属性が削除される。これは`to_json`が`type`を削除してJSON文字列を作ってしまうから。

これを回避するには`methods`オプションを使用。

```ruby
pry(main)> Topic.first.to_json
=> {"id":1,"uri":"http:..."}

pry(main)> Topic.first.to_json(methods[:type])
=> {"id":1,"type":"News","uri":"http:..."}
```
xxxhdpiのAction Bar Icon Packを手に入れる


※ただしIllustrator必須

ActionBar用のアイコンセットが公式で配布されているが、これには<b>xx</b>hdpiまでの画像しか含まれていない。

> Action Bar Icon Pack
> https://developer.android.com/intl/ja/design/downloads/index.html#action-bar-icon-pack

しかし、このセットには任意のDPI用に書き出してくれるスクリプトが付属しているので、Illustratorさえ持っていれば簡単にxxxhdpiの画像も作れる。

手順
----

1. `Android_Design_Icons_20131106.zip`をダウンロード
2. 解凍し、中にある`Action_Bar_Icons_Export.jsx`をテキストエディタで開く。
3. 最初の部分に書き出し対象のDPI名と比率の設定があるので、そこにxxxhdpiを書き足す。

    ```js:Action_Bar_Icons_Export.jsx
    var DPIS = {
     'xxxhdpi': 4, // <- この行を書き足す
      'xxhdpi': 3,
       'xhdpi': 2,
        'hdpi': 1.5,
        'mdpi': 1
    };
    ```

4. Illustratorを起動し、ファイル > スクリプト > その他のスクリプト から`Action_Bar_Icons_Export.jsx`を実行する。
5. こういうディレクトリ構成で生成される

    ```
    Action Bar Icons/
    └── out/
        └── holo_dark/
            └── 01_core_accept/
                └── drawable-xxxhdpi/
                    └── ic_action_accept.png
    ```
Kivy-iOSで実機転送後にAPLが起動しない問題の解決方法

| ソフトウェア | バージョン |
|:-----------|------------:|
|python|2.7.3|
|Kivy-iOS|1.8.0|
|Pygame|1.9.0-dev|
|Cython|0.21.0|


の組み合わせでiPhone（iOS8.1）への実機転送を行いテストを実施したところ
Application quit abnormally! RuntimeError
で落ちるという現象に見舞われた．．．

ちょろっと調べたところ以下の記事にあるように
Cythonのバージョンが問題だったらしい．
https://github.com/kivy/kivy-ios/issues/104


```
pip unstall Cython
pip install Cython==0.20.0
```

をしてからkivy-iOSも入れなおして問題解決．
めでたし．
Ruby on RailsでPolymerを使う

参考にさせていただいたページです。
[http://qiita.com/daei/items/37fe0d014f10f146812a](http://qiita.com/daei/items/37fe0d014f10f146812a)
[https://github.com/alchapone/polymer-rails](https://github.com/alchapone/polymer-rails)
基本的な使い方は上記ページ内で解説されています。

## polymerを使う準備をする
まず、Gemfileに以下のgemを追記します。

```Gemfile
gem 'polymer-rails' 
gem 'polymer-core-rails'
gem 'polymer-paper-rails'
```

- `polymer-rails`:polymerの基本要素
- `polymer-core-rails`:polymerが提供する[core-erements](https://www.polymer-project.org/docs/elements/core-elements.html)を使えるようにする。一覧は[ここ](https://github.com/alchapone/polymer-core-rails)の **Available elements**を参考。
- `polymer-paper-rails`:polymerが提供する[paper-elements](https://www.polymer-project.org/docs/elements/paper-elements.html)を使えるようにする。一覧は[ここ](https://github.com/alchapone/polymer-paper-rails)の **Available elements**を参考。

そして、
`$ bundle install`
をする。


次に、Railsプロジェクトにpolymerファイル等の生成を行います。
`$ rails g polymer:install`

これによって、`apprication.js`ファイルに`//=require polymer/platform`が書き加えられ、
`app/assets/components`ディレクトリが作成され、その中に`application.html.erb`ファイルが生成されます。

そして、そのファイルに`//= require polymer/webcomponents`を書き加えます。

```app/assets/components/apprication.html.erb
//= require polymer/polymer
```

次に、polymerのimport文を書きます。`app/views/layout/apprication.html.erb`ファイルの`<head>~</head>`タグ内に記述するのが無難でしょう。

```app/views/layout/apprication.hrml.erb
<head>
...
<%= html_import_tag 'application' %>
...
</head>
```

これで準備完了です。

## polymerを使う
まず、使う部品をコマンドラインから生成します。

`$ rails g polymer:component <部品名>`

`<部品名>`には自分が使いたい部品名を書いて下さい。例えば、`<paper-button>`を使いたければ

`$ rails g polymer:component paper-button`

とすれば、`components`ディレクトリ以下に部品が自動生成されます。

次に、`app/assets/components/apprication.html.erb`に

```app/assets/components/apprication.html.erb
//= require paper-button/paper-button
```

と追記します。書き方は、`//=require <部品名>/<部品名>`
これで、Railsでも`<paper-button></paper-button>`が使えるようになりました。

## 実演
早速使いましょう

```index.html.erb
<h1>Ruby on Railsでpolymerを使う</h1>

<paper-button>button</paper-button>
<paper-button disabled>disabled</paper-button>
<paper-button noink>noink</paper-button>

```
実行後はこんな感じ
![スクリーンショット 2014-11-16 2.01.58.png](https://qiita-image-store.s3.amazonaws.com/0/45047/578f0793-1a98-da1d-76b9-64fec5d9d683.png "スクリーンショット 2014-11-16 2.01.58.png")

＞Material Design＜

## 最後に
意外と簡単に使えますね。デザインとかはCSSを書かないといけませんが…。
あと、私が確認したのだと、

```
safari ×
firefox ×
chrome ○
opera ○
sleipnir ×
```
でした。対応ブラウザが少ないのはちょっと痛いですね。
ですが、これからどんどんと対応されていくはずです。なぜならば、polymerは **web Components時代を先導する存在**となるのですから（[polymer公式ページ](https://www.polymer-project.org)要約）。
WindowsでPythonがLookupError: unknown encoding: cp65001

Windows7のコマンドプロンプトでpythonが以下のようなエラーをはいた

```
LookupError: unknown encoding: cp65001
```

これはコマンドプロンプトの文字コードであるcp65001がpythonにとって未知であるため。

#### 自前プログラムの場合の対応

自前のプログラムだったら

```py
import sys
import codecs
def cp65001(name):
    if name.lower() == 'cp65001':
        return codecs.lookup('utf-8')
codecs.register(cp65001)
```

という風に書いて、cp65001がutf-8だと定義してあげればよい。


#### pipなどのpythonツールの場合の対応

上記の方法はpipなどのpythonのツールだと使えない。
例えば、pip installなどでこれが出るとだめ。

そう言う場合は環境変数を

```
PYTHONIOENCODING=utf-8
```

としてあげればよい。
Mac OSXでApacheをソースからビルドするとconfigureでエラーが出るときの対処法

# 環境
* OSX 10.10 (Yosemite)
* httpd 2.2.29

## Apacheのソースコード

ここからDLしました。
http://httpd.apache.org/download.cgi

## 手順

```
wget http://ftp.riken.jp/net/apache//httpd/httpd-2.2.29.tar.gz
tar xvfz httpd-2.2.29.tar.gz
cd httpd-2.2.29
./configure --prefix=/opt/httpd-2.2.29
make
sudo make install
```

# ./configureすると何故かXcodeがらみでエラー

```
Configuring Apache Portable Runtime library ...

checking for APR... yes
  setting CC to "/Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.10.xctoolchain/usr/bin/cc"
  setting CPP to "/Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.10.xctoolchain/usr/bin/cc -E"
  setting CFLAGS to " "
  setting CPPFLAGS to " -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -DDARWIN_10"
  setting LDFLAGS to " "

Configuring Apache Portable Runtime Utility library...

checking for APR-util... yes
checking for gcc... /Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.10.xctoolchain/usr/bin/cc
checking whether the C compiler works... no
configure: error: in `/Users/DQNEO/src/tarball/httpd-2.2.29':
configure: error: C compiler cannot create executables
See `config.log' for more details
```

むむむ。

/Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.10.xctoolchain

というディレクトリが存在しないのでこけている。


# 対処法

下記のようにシムリンクを貼ればいけました。

```shell-session
cd  /Applications/Xcode.app/Contents/Developer/Toolchains/
sudo ln -s XcodeDefault.xctoolchain OSX10.10.xctoolchain
```

# 謝辞

http://fibonacci.hateblo.jp/entry/2013/07/21/122543

ありがとうそしてありがとう。