OmniAICreator/Qiita-1.07M huggingface dataset:
Python + matplotlib によるヒートマップ

Python と matploblib によるデータ可視化についてはすでに [pandas + matplotlib による多彩なデータプロッティング](http://qiita.com/ynakayama/items/68eff3cb146181329b48)や [pandas を利用してデータセットの可視化を素早く試行する](http://qiita.com/ynakayama/items/94779651d09e1004fd46)、 [matplotlib (+ pandas) によるデータ可視化の方法](http://qiita.com/ynakayama/items/2ec380ab1176e4569ebe)などでさまざまな方法を説明してきました。

今回はヒートマップを描くわけですが、その前にあらためで可視化の方法についておさらいしましょう。

## 配列からのデータ可視化方法のまとめ

ここでのデータ可視化とは配列からなるポピュラーな図示をさしています。配列とは、複数の属性値を持ち、 1 つのデータが 1 つの行で表されるデータの形式です。 いろいろなバリエーションがありますが、主軸となる代表的な可視化方法をまとめます。

### 棒グラフ (bar)

データの大きさの比較に適したグラフです。縦や横に描画する方法、積み上げる方法、複数の系列を並べる方法といったバリエーションがあります。

### 折れ線グラフ (line)

matplotlib で plot 関数を利用したときの既定値です。データは点と点を結ぶ線で描かれ、ひとつの系列が一本の線になります。特に時間の経過にともなうデータの変化を可視化するのに最適な表現方法です。

### 面グラフ (area)

エリアチャートとも言います。これも折れ線グラフと同じく時系列のデータの変化を追いやすいですが、データの割合や総計の変化を追うのに特に向いています。

### 散布図 (scatter)

2 つのデータ系列の相関を見るときに適した可視化方法です。 X と Y 軸の関係性をデータ点の位置で図示します。関係が明らかな場合、わざわざ計算するまでもなくひと目で相関関係が把握できることもあります。

## ヒートマップを描く

ヒートマップは度数を色の主に濃淡などで示し、どの位置でデータが多いかといったことを可視化することができます。地理情報のどの場所で人が多いあるいは気温が高い、ウェブサイトのどの場所がアクセスやクリック数が多い、といったことを可視化することができます。

### 多次元配列からヒートマップを描く

matplotlib の pcolor 関数でヒートマップが使えます。以下のメソッドは n x m 行列と X および Y 軸のラベルを行列で渡すことにより、シンプルなヒートマップを描きます。

```py3
# 正方行列と X および Y のラベルの行列を渡す
def draw_heatmap(data, row_labels, column_labels):
    # 描画する
    fig, ax = plt.subplots()
    heatmap = ax.pcolor(data, cmap=plt.cm.Blues)

    ax.set_xticks(np.arange(data.shape[0]) + 0.5, minor=False)
    ax.set_yticks(np.arange(data.shape[1]) + 0.5, minor=False)

    ax.invert_yaxis()
    ax.xaxis.tick_top()

    ax.set_xticklabels(row_labels, minor=False)
    ax.set_yticklabels(column_labels, minor=False)
    plt.show()
    plt.savefig('image.png')

    return heatmap
```

30 x 30 の 900 個のデータを乱数生成してみました。次のように描画されます。

![heatmap.png](https://qiita-image-store.s3.amazonaws.com/0/38501/d6d19fb0-734c-08df-e496-6a9fc0a217df.png)

値の高低によって色の濃淡が決定しています。

### ヒストグラムを使う

次に NumPy の [histgram2d](http://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram2d.html) を利用します。

x と y にそれぞれ数百の適当な数の配列を渡すと画像の対応する点に着色されます。

```py3
def draw_heatmap(x, y):
    heatmap, xedges, yedges = np.histogram2d(x, y, bins=50)
    extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]

    plt.figure()
    plt.imshow(heatmap, extent=extent)
    plt.show()
    plt.savefig('image.png')
```

以下の図は X と Y にそれぞれ 500 個ほど正規分布の乱数を生成し描画した例です。

![hist.png](https://qiita-image-store.s3.amazonaws.com/0/38501/031dcf89-95e8-51a8-9a50-6ad9de2d3f62.png)

## まとめ

ヒートマップは 2 次元の空間に色という次元を加えてデータの可視化をおこないます。これも応用次第では強力な可視化方法として活用することができます。
複数行ラベル

複数行のテキストを表示したい場合は、Label オブジェクトを生成し、setWidth(幅）をコールするといいぞ。
文字列の途中で改行したい場合は \n を書くといいぞ。

> auto label = Label::createWithSystemFont("Hello World. \nposition the label on the center of the screen", "Arial", 24);
> label->setWidth(400);

ちなみに、LabelTTF クラスには setWidth() が無いぞ。
Railsでナビゲーションの現在地をアクティブにする

現在いるページのナビゲーションメニューのみに`.active`とかcssを適用したいとき、いつもこう書いてる。
ただなんかもっと良い書き方ないかなーと思っているので、誰か良い案ある方いれば教えて下さい :disappointed_relieved: 

```html+erb:application.html.erb
<ul class="nav">
  <li class="<%= active_class_for('controller1') %>"><a href="#">Controller1</a></li>
  <li class="<%= active_class_for('controller2') %>"><a href="#">Controller2</a></li>
  <li class="<%= active_class_for('controller3') %>"><a href="#">Controller3</a></li>
</ul>
```

```rb:application_helper.rb
module ApplicationHelper
  def active_class_for controller_name
    'active' if params[:controller] == controller_name
  end
end
```
HIVEコマンドでのDatabase選択について


コマンドラインからHIVEコマンド経由でHQLを叩く方法として、

```hive
hive -e "SELECT * FROM hoge_table;"
```

と書けます。
しかし、この書き方では、hoge_tableのデータベースがdefaultにある場合のみ実行できます。

データベースを指定して書く場合には、一行の中で

``` hive
hive -e "USE foo_db; SELECT * FROM hoge_table;"
```

とすると、foo_dbのhoge_tableが選択されることになります。
もちろん、foo_dbのhoge_tableがなければいけません。

fileの中にHQLを書いた場合の実行は、

``` hive
hive -f /path/to/hivescript.hql
```

と書くことができます。
さくらのレンタルサーバのMLのカスタマイズ

さくらのレンタルサーバに付属するメーリングリスト（fml）について、サーバコントロールパネル以外で行う設定のメモ。


## HTML アーカイブをアクセス制限する

コントロールパネルの［メーリングリストの動作を設定する］＞［詳細表示］にて［HTMLファイルの自動生成］を設定すると、`~/www/` 直下に `ml` というディレクトリができて［＊］、過去記事が HTML 形式で保存されるようになる。

（＊：できていない場合は、［メーリングリスト管理］にて［過去記事を再生成する場合は、こちらをクリックして下さい。］を実行。）

この `ml` 直下に `.htaccess` をおいて Basic 認証をかける。

```apache:.htaccess
# アクセス制限

AuthUserFile /home/[user]/.htpasswd
AuthType Basic
AuthName "ML Archives"

Require valid-user
```

SSH して `.htpasswd` を作成。

```console:
$ htpasswd -c .htpasswd [username]
New password: 
Re-type new password: 
Adding password for user [username]
```


## HTML アーカイブのインデックス・ページを月別にする

デフォルトでは日別（目次ページが1日ごとに分割して作られる）。
それほど投稿数が多くなければ月別などにしたい。

`~/fml/spool/ml/[ml-name]/cf` を編集する。

```text:~/fml/spool/ml/[ml-name]/cf[before]
### Automatic Html Generation
AUTO_HTML_GEN            	1
HTML_THREAD_REF_TYPE     	prefer-in-reply-to
HTML_STYLESHEET_BASENAME
```
↓

```diff:~/fml/spool/ml/[ml-name]/cf[after]
  ### Automatic Html Generation
  AUTO_HTML_GEN            	1
  HTML_THREAD_REF_TYPE     	prefer-in-reply-to
  HTML_STYLESHEET_BASENAME
+ HTML_INDEX_UNIT             month
```

＊「+」の文字は不要。

取りうる値は `[number] / day / week / month / infinite` のいずれか。
参考：[1 HTML形式の記事を作成する](http://www.fml.org/fml/Japanese/html_convert/1.html)

上記編集後、以下のコマンドを実行して、`cf`（設定ファイルの原本） から `config.ph`（設定ファイルの実体）を生成する。
（なお、`config.ph` を直接編集してしまうと、さくらのコントロールパネルから ML の設定を変更したときに上書きされて編集内容が消えてしまう。）

```console:
# 初期状態では実行パーミションが無いので付与。2回目以降は不要。
$ chmod u+x ~/fml/sbin/makefml 
# config.ph を生成。
$ ~/fml/sbin/makefml update-config [ml-name]

   THIS HOST (wwwXXX.sakura.ne.jp) IS [amd64-unknown-freebsd9.1]

DO "update-config" for [ml-name] mailing list.
O.K. Try to re-create /home/[user]/fml/spool/ml/[ml-name]/config.ph !!!

   Create config.ph(/home/[user]/fml/spool/ml/[ml-name]/config.ph):
	/home/[user]/fml/spool/ml/[ml-name]/cf  ->  config.ph ... Done.
	(configuration is backuped in /home/[user]/fml/spool/ml/[ml-name]/config.ph.bak)
done.

```

参考：[9 設定ファイルの編集について](http://www.fml.org/fml/INSTALL/9.html)


## HTML アーカイブのメールアドレスを伏せ字にする

`~/fml/libsynchtml.pl` を直接編集する。
（もっとスマートなやり方があるかもしれないが、とりあえず。）
（編集前と編集後のファイル、両方ともバックアップを取っておく。）


```text:~/fml/libsynchtml.pl[before]
    $s =~ s/\r\n/\n/g; # too obstinate ;-) to cut off \r ?
    $s =~ s/\r//g;     # too obstinate ;-) to cut off \r ?
    $s =~ s/&/&amp;/g;
    $s =~ s/</&lt;/g;
    $s =~ s/>/&gt;/g;
    $s =~ s/\"/&quot;/g;
    &jcode'convert(*s, 'jis'); #';
    ### special character convertion ends
```

↓

```diff:~/fml/libsynchtml.pl[after]
     $s =~ s/\r\n/\n/g; # too obstinate ;-) to cut off \r ?
     $s =~ s/\r//g;     # too obstinate ;-) to cut off \r ?
     $s =~ s/&/&amp;/g;
     $s =~ s/</&lt;/g;
     $s =~ s/>/&gt;/g;
     $s =~ s/\"/&quot;/g;
+    $s =~ s/([a-zA-Z0-9.!\#$%&'*+\/=?^_`{|}~-]+)@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*/$1@.../g; # Anti-spam
     &jcode'convert(*s, 'jis'); #';
     ### special character convertion ends
```

＊「+」の文字は不要。
＊正規表現でメールアドレスっぽいものを見つけて `@` より後を `...` に置換している。

編集後、さくらのコントロールパネルの［メーリングリスト管理］にて［過去記事を再生成する場合は、こちらをクリックして下さい。］で過去記事を再生成。
一行のみでC++のヘッダーファイルを一括してインクルードする

```cpp
#include <bits/stdc++.h>
```

と一行記述すると以下のヘッダーファイルを一括してインクルードすることができる。
http://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/api/a01040_source.html

【参考】
http://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/api/a01040_source.html
vk - CoffeeScript DSLでVirtual DOM をテンプレーティングする

vk は facebook/reactのvirtual DOM 用のテンプレートエンジンみたいなものです。

[https://github.com/mizchi/vk](https://github.com/mizchi/vk)

```
bower install mizchi/vk --save
```

まだbowerに上げてない。

JSXを使わずCoffeeScriptでReactの仮想DOMを記述するとこうなる。

```coffeescript
React.createClass
  render: ->
    React.DOM.div {}, [
      React.DOM.h1 {}, "Hello"
      React.DOM.ul className: 'foobar-container', "bar"
        React.DOM.li {}, "foo"
        React.DOM.li {}, "bar"
      ]
    ]
```

vkを使うとこんなに短く、直感的に！

```coffeescript
React.createClass
  render: -> vk (d) ->
    d.h1 'Hello'
    d.ul className: 'foobar-container', ->
      d.li "foo"
      d.li "bar"
```


ワ～スゴ～イ
実態はただのReactのラッパーです。



## 開発経緯

その昔、coffeekupというテンプレートエンジンがありまして、開発が止まってしまったのですが個人的には結構気に入ってたテンプレートエンジンでした。ただのDSLとしてDOMを生成する、という設計です。

[mauricemach/coffeekup](https://github.com/mauricemach/coffeekup "mauricemach/coffeekup")

で、reactはjsxというAltjs泣かせな独自シンタックスを持っていて、APIを直接叩いてもいいのですが、どうせなら、ラップしたい。Virtual DOM は DOMとJSが密結合することを厭わない設計思想で、今こそCoffeekup的なDSL設計が生きるのでは？と思い、さっくり移植しました。

コンセプト実装的なノリで作ったので、まだコンポーネントの埋め込みとかは細かいのは対応してないです。

## JSXのつらさ

次のようなDOMを出力したいとします。

```
<div>
  <h1> Hello </h1>
  <ul class='foobar-container'>
    <li>foo</li>
    <li>bar</li>
  </ul>
</div>
```

この場合、reactのjsx記法を使うと、次のようになることでしょう

```javascript
React.createClass({
  render: function(){
    return <div>
      <h1> Hello </h1>
      <ul class='foobar-container'>
        <li>foo</li>
        <li>bar</li>
      </ul>
    </div>
  }
});
```

jsxが使えないcoffee-script でベタに書くとこうなります。

```coffeescript
React.createClass
  render: ->
    React.DOM.div {}, [
      React.DOM.h1 {}, "Hello"
      React.DOM.ul className: 'foobar-container', "bar"
        React.DOM.li {}, "foo"
        React.DOM.li {}, "bar"
      ]
    ]
```

明らかにだるい。
で、冒頭にvkならこうなるっていう話。

```coffeescript
React.createClass
  render: -> vk (d) ->
    d.h1 'Hello'
    d.ul className: 'foobar-container', ->
      d.li "foo"
      d.li "bar"
```
ChromeのJSONViewエクステンションを段組表示にする。

Chromeの機能拡張のJSONViewはすごく便利なんですが、サンプルでちょっと画面ショットを取りたいときには縦長になりすぎてちょっと不便なのでCSSをいじって段組表示にしてます。

![jsonview.png](https://qiita-image-store.s3.amazonaws.com/0/51116/6b462f9c-5b47-0834-f7c9-f0c88ef6116f.png)

下記のCSSをいじってます。

Windows例
`C:\Users\[USER]\AppData\Local\Google\Chrome\User Data\Default\Extensions\chklaanhfefbnpoihckbnefhakgolnmc\[Version]\jsonview-core.css`

Mac例
`/Users/[USER]/Library/Application\ Support/Google/Chrome/Default/Extensions/chklaanhfefbnpoihckbnefhakgolnmc/[Version]\jsonview-core.css`

のbodyタグのCSSをこんな感じに変更してます。
body {
	margin-bottom: 23px;
	white-space: normal !important;

	/* column */
	-webkit-column-count: 4;
	-webkit-column-gap:2em;
	-webkit-column-rule:1px dashed #aaa;
	border:1px solid #aaa;
	height:640px;
	margin:2em;
	padding:1em;
	/* column */

}

高さや線の色などはご自由に...
AndroidStudio 0.8.6 でプロジェクトにFacebookSDK を導入


備忘録

# 環境
Mac OS X 10.9.4
AndroidStudio 0.8.6
FacebookSDK 3.17.2

# FacebookSDK をダウンロード
[ここから](https://developers.facebook.com/docs/android)zipをダウンロードし解凍。

# プロジェクトにインポート

1.メニューの [File] -> [Import Module]
2.Source directory に先ほど解凍したディレクトリを指定
3.「facebook」 を選択した状態に Finish

すると以下のようなエラーが発生

`Error:(9, 0) Could not find property 'ANDROID_BUILD_SDK_VERSION' on project ':facebook'.`

これは、`facebook/build.gradle` で以下が記述されているため

```
project.ANDROID_BUILD_SDK_VERSION
project.ANDROID_BUILD_TOOLS_VERSION
project.ANDROID_BUILD_MIN_SDK_VERSION
project.ANDROID_BUILD_TARGET_SDK_VERSION
```


```:facebook/build.gradle
apply plugin: 'android-library'

dependencies {
    compile 'com.android.support:support-v4:19.1.+'
    compile 'com.parse.bolts:bolts-android:1.1.2'
}

android {
    compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)
    buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION

    defaultConfig {
        minSdkVersion Integer.parseInt(project.ANDROID_BUILD_MIN_SDK_VERSION)
        targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION)
    }

    lintOptions {
        abortOnError false
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            res.srcDirs = ['res']
        }
    }
}
```

なので、`gradle.properties` に以下を追記し sync

```
ANDROID_BUILD_SDK_VERSION=18
ANDROID_BUILD_TOOLS_VERSION=20
ANDROID_BUILD_MIN_SDK_VERSION=15
ANDROID_BUILD_TARGET_SDK_VERSION=18
```

# 依存関係を設定

FacebookSDK のモジュールをプロジェクトと関連付ける

1.メニューの [File] -> [Project Structure]
2.[app] を選択し [Dependencies] タブを選択
3.プラス記号のボタンを押下し [Module Dependensy] から [:facebook] を選択する

これで、com.facebookパッケージが使えるようになった！
FuelPHPでMustacheテンプレートのpartials機能を利用する方法

以下のようにparserパッケージ修正したのち、コンフィグファイルの設定を行うと利用できる。
なぜにデフォルトで使えない。。。

```php:parser/classes/view/mustache.php
namespace Parser;

use Mustache_Engine;
// 追記
use Mustache_Loader_FilesystemLoader;

class View_Mustache extends \View
{
	protected static $_parser;

	protected function process_file($file_override = false)
	{
		$file = $file_override ?: $this->file_name;
		$data = $this->get_data();

		try
		{
			return static::parser()->render(file_get_contents($file)
, $data);
		}
		catch (\Exception $e)
		{
			// Delete the output buffer & re-throw the exception
			ob_end_clean();
			throw $e;
		}
	}

	public $extension = 'mustache';

	/**
	 * Returns the Parser lib object
	 *
	 * @return  Mustache_Engine
	 */
	public static function parser()
	{
		if ( ! empty(static::$_parser))
		{
			return static::$_parser;
		}

		$options = array(
			// TODO: set 'logger' with Monolog instance.
			'cache'   => \Config::get('parser.View_Mustache.environm
ent.cache_dir', APPPATH.'cache'.DS.'mustache'.DS),
			'charset' => \Config::get('parser.View_Mustache.environm
ent.charset', 'UTF-8'),
		);

		if ($partials = \Config::get('parser.View_Mustache.environment.p
artials', array())) {
			$options['partials'] = $partials;
		}

		if ($helpers = \Config::get('parser.View_Mustache.environment.he
lpers', array())) {
			$options['helpers'] = $helpers;
		}

       // 追記（ディレクトリは好きな位置を指定）
   　　$options['partials_loader'] =
         new Mustache_Loader_FilesystemLoader(
           dirname(__FILE__) . '/../../../../app/views');
    
		static::$_parser = new Mustache_Engine($options);

		return static::$_parser;
	}
}

```
考えてみれば当たり前なんだけどstrncmp(str1, str2, 0)は0文字分の比較 → 真


`string.h` の `strncmp(str1, str2, n)` は、str1とstr2をn文字分比較してくれます。
当然 `int n=0` なんて初期化して臨むといきなりやられる。

こんなのにハマるなんて。。くちおしや。。

```:test.c
#include <stdio.h>
#include <string.h>

int main(void)
{
  char* str1 = "ponta";
  char* str2 = "pontasan";
  char* str3 = "fuwafuwa";

  printf("strncmp(str1, str2, 7): %d\n", strncmp(str1, str2, 7) );
  printf("strncmp(str1, str2, 6): %d\n", strncmp(str1, str2, 6) );
  printf("strncmp(str1, str2, 5): %d\n", strncmp(str1, str2, 5) );
  printf("strncmp(str1, str2, 4): %d\n", strncmp(str1, str2, 4) );
  printf("strncmp(str1, str2, 3): %d\n", strncmp(str1, str2, 3) );

  printf("\n");

  printf("strncmp(str2, str3, 5): %d\n", strncmp(str2, str3, 5) );
  printf("strncmp(str2, str3, 0): %d\n", strncmp(str2, str3, 0) );

  return 4444;
}
```

```:a.out
strncmp(str1, str2, 7): -115
strncmp(str1, str2, 6): -115
strncmp(str1, str2, 5): 0
strncmp(str1, str2, 4): 0
strncmp(str1, str2, 3): 0

strncmp(str2, str3, 5): 10
strncmp(str2, str3, 0): 0
```
GitHubにて他プロジェクトのissueへのリンクの貼り方メモ


Githubのissueやpull requestなどのコメントの中で```#[IssueNumber]```のように書けば自動的にissueページへのリンクになります。

```markdown
#32
```

他のプロジェクトのissueへのリンクは```[UserName]/[ProjectName]```を```#[IssueNumber]```の前に付ければOKです。

```markdown
myname/sampleprojcet#32
```

逆にissueページのURLをコメント等に貼付けると自動的に上記の表記に変換してくれます。
cpanm + cpanfileでインストール


```bash
cpanm --installdeps .
```

｢.｣は、ディレクトリ指定なので。
cpanfileのディレクトリにいない場合は、

```bash
cpanm --installdeps /home/user/dir
```

のようにディレクトリを指定してあげる。

```bash
cpanm --installdeps /home/user/dir/cpanfile
```

という感じにファイルまで指定しないこと。
あんまり使わないけど便利なコマンドライン

#OSXでのあんまり使わないけど便利なコマンドライン
##Finderの設定
`defaults write com.apple.finder AppleShowAllFiles -bool YES`
`defaults write com.apple.finder QuitMenuItem -bool YES`
##DVDを作る
ターミナルを使ってDVDイメージファイルを作成する。
`mkisofs -f -dvd-video -udf -V DVD_VIDEO -o DVD_VIDEO.img DVD/`
##画像編集 
hoge.jpgって画像をリサイズしたい場合、縦横比を維持したままwidthを400に変更
`sips --resampleWidth 400 hoge.jpg`
 fooフォルダの画像を全部同じサイズに変更するなら sips -z 600 800 ./foo/* とか
###sips集
`sips -s format pdf -s dpiHeight 72 -s dpiWidth 72 -s formatOptions low /path/to/pdf.pdf --out /path/to/converted/pdf.pdf`
`sips --resampleWidth 480 --out ww.pdf small.pdf`
`sips -s format pdf -s dpiHeight 72 -s dpiWidth 72 -s formatOptions low MobileHIG.pdf --out lowMobileHIG.pdf`
`sips --resampleWidth 180 -s format jpeg profile/*.* --out profile2`

##画像の情報を削除してサイズを減らす
pngcrushコマンド
`/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush -iphone -d ./ImageSrc/ *.png`
##音楽ファイル
`/usr/bin/afconvert -f caff -d LEI16 {INPUT} {OUTPUT}` 
##XCodeのデフォルト値
`defaults write com.apple.Xcode PBXCustomTemplateMacroDefinitions '{"ORGANIZATIONNAME" = "名前";}'`


##ファイルを開いてるプロセスをみる。
`lsof`

##ffmpegで変換
`ffmpeg -i hoge.avi -y -v 0 -f flv -b 500k hoge.flv`
bashで関数プログラミングしたらlispになった

使い方:

```bash
$ map $(lambda a -- echo "\$(( 1 + \$a ))") 1 2 3
2
3
4
```

実用的には

```bash
countline (){
    wc -l $1 | cut -d " " -f 1
}
realcost=$(min $(map countline $(ls $probname.$config.plan.*)))
```
とか。

シンタックスを考えると、シェルスクリプトで良い点は変数と文字列の垣根が低い点、悪い点は正則評価しか無い点(`$var` は呼び出し前に必ず展開される == 必ず評価される)、シンボルを作りにくい点。lambdaを実用しやすくするには 変数の記述方法を変えて、あとで`$`記号に変換するようにしないといけないかなあ。問題は余ってる記号が少ないこと。`"#$%&'()=~|@{[}]<>?` 使えそうなのはだいたい使われてるなあ。残ってるのは @ と _ だな。 @ かな。

```bash

map (){
    pred=$1
    first=$2
    shift 2
    echo $($pred $first)
    if [[ $1 != "" ]]
    then
        map $pred $@
    fi
}

reduce (){                         # list of numbers
    if [[ $3 == "" ]]
    then
        echo $2
    else
        pred=$1
        first=$2
        second=$3
        shift 3
        next=$($pred $first $second)
        reduce $pred $next $@
    fi
}

gensym (){ mktemp --tmpdir lambda.XXXXXXXX; }
localdef (){ echo "$1=$2;" ;}
localdefs (){
    local i=0
    for arg in $@
    do
        i=$(( $i + 1 ))
        localdef $arg "\$$i"
    done
}
lambda (){
    local sym=$(gensym)
    local args=
    while [[ $1 != "--" ]]
    do
        args="$args $1"
        shift
    done
    shift
    echo "#!/bin/bash" > $sym
    localdefs $args >> $sym
    echo "{ $* ;}" >> $sym
    chmod +x $sym
    echo $sym
}

gt (){ if [[ $1 -gt $2 ]] ; then echo $1 ; else echo $2 ; fi }
lt (){ if [[ $1 -lt $2 ]] ; then echo $1 ; else echo $2 ; fi }
ge (){ if [[ $1 -ge $2 ]] ; then echo $1 ; else echo $2 ; fi }
le (){ if [[ $1 -le $2 ]] ; then echo $1 ; else echo $2 ; fi }
max (){
    reduce gt $@
}
min (){
    reduce lt $@
}
```
重複していない行の抽出


｢sort｣ と ｢uniq -u｣ がキーです。

### 単一のファイルから

```baz.txt
A
B
A
B
C
```

```sh
> sort baz.txt | uniq -u
C
```

### 複数のファイルから

```foo.txt
A
B
C
```

```bar.txt
A
B
D
```

```sh
> sort foo.txt bar.txt | uniq -u
C
D
```

また、片方のファイルの｢D｣だけ抽出したい場合は、

foo.txtを重ねることで｢C｣を重複させる。

```sh
> sort foo.txt foo.txt bar.txt | uniq -u
D
```
Django事始め その3 about Python3 ＆ MySQLコネクタ


## ※この記事は未解決記事です。

##開発環境
PC: MacOS X 10.9.4
Python3.4.1
Django1.6.6

##DB設定が反映されない現象

[前回の記事](http://qiita.com/tajihiro/items/932b14dee0ec2efbf1a7)ですんなりプロジェクト作成がうまくいったと思ったが、下記の`Eclipse`のデータベースの設定が反映されていないことに気づいた。

![スクリーンショット 2014-09-02 14.46.18.png](https://qiita-image-store.s3.amazonaws.com/0/3184/5125c8d4-87a9-6f8a-e64f-6f2550329fa8.png "スクリーンショット 2014-09-02 14.46.18.png")

データベースと同期(`$ python3 manage.py syncdb`)したのだが、対象の`MySQL`データベースに反映されない。`setting.py`のDB設定の記述を確認してみたら`sqlite3`の設定となっている。そこでコメントアウトして、直接`mySQL`の設定を記述してみた。

```setting.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_db',
        'USER':'db_user',
        'PASSWORD':'xxxxxxx',
        'HOST':'localhost',
        'PORT':'3306',
    }
}
#DATABASES = {
#    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#    }
#}
```

## MySQLモジュールエラーの頻発

しかし、再度、同期(`$ python3 manage.py syncdb`)すると下記エラーが発生するようになった。

　`ImportError: No module named 'MySQLdb'`

どうやら、`MySQL`モジュールが見つからないようだ。そこで、`MySQL`モジュールのインストールを試みた。

　`$ pip3 install mysql-python`

しかし、今度は下記エラー。

　`ImportError: No module named 'ConfigParser'`

今度は、下記にてインストールを試みた。

　`$ pip3 install mysql-connector-python --allow-external mysql-connector-python`

今度は、インストール自体はうまく行ったようだ。
しかし、まだエラーが続く。

　`ImportError: No module named 'MySQLdb'`

## MySQL-for-Python-3 のインストール

諦めず、最新の`MySQL-for-Python-3`とやらが、Githubにあったので、インストールを試してみた。

　`pip3 install --user https://github.com/davispuh/MySQL-for-Python-3/archive/1.0.tar.gz`

インストール自体はうまく行ったようだ。しかし、また別のエラーが続く。

　`Library not loaded: libmysqlclient.18.dylib`

そこで、`MySQL`のライブラリにあるであろう`libmysqlclient.18.dylib`のシンボリックリンクを `/usr/lib`に作ってみた。

　`$ sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib`



##補足事項

その後、[Django公式マニュアル](https://docs.djangoproject.com/en/1.6/ref/databases/#python-3)を読んででみたら下記の記述。

>Python 3
At the time of writing, the latest release of MySQLdb (1.2.4) doesn’t support Python 3. In order to use MySQL under Python 3, you’ll have to install an unofficial fork, such as MySQL-for-Python-3.
This port is still in alpha. In particular, it doesn’t support binary data, making it impossible to use django.db.models.BinaryField.

簡単に言うと、
>Python3
マニュアル記述時点では、MySQLdb (1.2.4)最新リリース版ではPython 3をサポートしていない。MySQLを使用するなら MySQL-for-Python-3のような非公式なフォーク版をインストールしたほうが良い。
この移植版はまだαバージョンで、とりわけ、バイナリ型データをサポートしていない為、django.db.modules.BinaryFieldも利用できない。

ふむむ～。


##途中経過として

どうやらWebやマニュアルで調べる限り、現時点(2014年08月末)では`Python3`に`MySQLdb`が対応していないようだ。

それでは、どのように諦めるべきか？ 
`Python`初心者なので、リリース間隔(いつまで待てば対応されるか)の感覚が掴めない。

 1. DBを変更する (MySQL → 他のDB)
 2. Pythonのバージョンを変更する (3.4 → 3.1)
 3. Python/Djangoの勉強をやめる

そう言えば1〜2年前に`Ruby on Rails`でも、`MySQL`コネクタ周りでハマったな。

やっぱ、`Python`初心者が首を突っ込むような問題では無い気がしてきた。悔しいのでアドバイスやご指摘をよろしくお願いします。
foreigner の SQLite3 アダプタを書いた

Rails 4.2 からの DB Migration は FK を標準でサポートする予定になっていますが、現時点では、多くの方が foreigner を使っている状況かと思います。

https://github.com/matthuhiggins/foreigner

foreigner は SQLite3 の場合は処理をスキップするようになっています。

https://github.com/matthuhiggins/foreigner/blob/master/lib/foreigner/connection_adapters/noop_adapter.rb

これは、まあ以下の issue でも回答されている通り、妥当なところではあって

https://github.com/matthuhiggins/foreigner/issues/65

SQLite3 はデフォルトでは off の pragma を有効にすれば FK を使うことも出来るのですが

http://www.sqlite.org/foreignkeys.html

SQLite3 は以下に明記されている通り

http://www.sqlite.org/omitted.html

alter table の構文では、何と add column くらいしかまともにサポートしていないという状況で、他の RDBMS のように add constraint することができず、テーブルの再作成が必要になってしまいます。

実際、ActiveRecord の sqlite3_adapter に #remove_column が実装されていますが、こんな感じの力技です。

https://github.com/rails/rails/blob/v4.1.5/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb#L465-L469

```rb
[1] pry(main)> ActiveRecord::Base.connection.remove_column("user", "company_id")
   (0.1ms)  begin transaction
   (1.1ms)  CREATE TEMPORARY TABLE "auser" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "company_id" integer NOT NULL, "created_at" datetime NOT NULL)
   (0.5ms)  SELECT * FROM "user"
   (1.1ms)  DROP TABLE "user"
   (0.2ms)  CREATE TABLE "user" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "created_at" datetime NOT NULL)
   (0.1ms)  SELECT * FROM "auser"
   (0.3ms)  DROP TABLE "auser"
   (0.9ms)  commit transaction
=> []
```

そんな感じなので、ほとんどの方は MySQL なり PostgreSQL を development や test でも使えばいいじゃんというスタンスだと思うし、実際わざわざ違う RDBMS で動かす必要もないのですが、とはいえ、SQLite3 の手軽さは、デザイナーとの協業やら、普段触ってないプロジェクトをちょっと起動するときやら、CI の設定をするときやら、いろんなケースで嬉しいというのもまた事実です。

できれば FK を使った DB 設計のテストでも SQLite3 を使えないものか。ということで foreigner の SQLite3 で動作する adapter を実装してみました。

https://github.com/seratch/sqlite3-foreigner

最初は ActiveRecord の remove_column とか使っていましたが、テーブル再作成するタイミングで元々ある FK の設定が失われてしまうため、sqlite_master テーブルから create table の DDL をとってきて置換するようにしました。

元々データがある時の扱いが結構厄介なのですが、とりあえずそういうケースでは標準出力に warning を出して foreigner と同様スキップしています。この辺は私は今すぐ必要とはしていないのですが、うまく実装できれば対応したいところです。

追記：2015/12

Rails 4.2 からは foreigner が存在すると正常に動作しなくなっています。
http://qiita.com/seratch@github/items/4cccda08f8ba96ac6173
ASP.NET MVC 5.2でひっそりとoptgroupがサポートされている

ASP.NET MVCのDropDownListForはoptgoupがサポートされていなくて残念な思いをしていましたが、5.2でひっそりとサポートされるようになりました。

新しいヘルパが増えるのではなく、System.Web.Mvc.SelectListItemクラスにGroupというプロパティが追加されていて、このプロパティにSystem.Web.Mvc.SelectListGroupオブジェクトを設定します。同じオブジェクトが設定されているSelectListItemがoptgroupとしてグルーピングされるという仕組みです。名前が同じだけではグルーピングされません。

```csharp
var items = new List<SelectListItem>();

var group1 = new SelectListGroup() { Name = "Group 1" };
var group1_2 = new SelectListGroup() { Name = "Group 1" };
var group2 = new SelectListGroup() { Name = "Group 2" };

items.Add(new SelectListItem() { Text = "Item1", Group = group1 });
items.Add(new SelectListItem() { Text = "Item2", Group = group1 });
items.Add(new SelectListItem() { Text = "Item3", Group = group1_2 }); // 別のグループになる
items.Add(new SelectListItem() { Text = "Item4", Group = group2 });
items.Add(new SelectListItem() { Text = "Item5", Group = group2 });
items.Add(new SelectListItem() { Text = "Item6", Group = group1 }); // 初めのgroup1と一緒になる
items.Add(new SelectListItem() { Text = "Item7", Group = group1 }); // 初めのgroup1と一緒になる
```
```html
@Html.DropDownList("select", items)
```

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/42710/7257abad-9e17-62b5-4deb-b98a69e36160.png)

参考

* http://msdn.microsoft.com/en-us/library/system.web.mvc.selectlistitem(v=vs.118).aspx
* http://msdn.microsoft.com/en-us/library/system.web.mvc.selectlistgroup(v=vs.118).aspx
* http://msdn.microsoft.com/en-us/library/system.web.mvc.selectlist(v=vs.118).aspx
[sftp] SOCKS5プロキシを利用したSFTP接続

## 謝辞
すごい時間をかけて調べた結果、Qiitaにたどり着きました。
ありがとうございました。

[SOCKS5プロキシを利用したSSH接続](http://qiita.com/mechamogera/items/ac06f6363f99d674af63)


## コマンド

``connect``を使う場合

```shell-session:
$ sftp -o ProxyCommand="/usr/bin/connect -S [SOCKS5プロキシサーバー]:[ポート] %h %p" [user]@[sftpサーバー]
```

``nc``を使う場合

```shell-session:
$ sftp -o ProxyCommand="/usr/bin/nc -X 5 -x [SOCKS5プロキシサーバー]:[ポート] %h %p" [user]@[sftpサーバー]
```

公開鍵認証を行う場合
（事前に鍵ペアを生成し、公開鍵をサーバーに登録してもらう必要があります）

```shell-session:
$ sftp -o ProxyCommand="/usr/bin/nc -X 5 -x [SOCKS5プロキシサーバー]:[ポート] %h %p" -o IdentityFile="[秘密鍵のパス]" [user]@[sftpサーバー]
```


## 参考

[SSH_CONFIG (5)](http://www.unixuser.org/~euske/doc/openssh/jman/ssh_config.html)
Yahoo Map API

YOLPで地図を作成する際に、
下記のようにラベルを表示し、ラベルの色を変更したいのですが
スタイルの表記などのサンプルが見つからないので、
どなたかご教授いただけないでしょうか？

var label = new Y.Label(new Y.LatLng(35.64997652994234,139.72116702175174), "打ち上げ会場");
ymap.addFeature(label);
Ubuntu 14.04 でネットワーク設定の変更を反映させる操作

※ Cinnamon を使っているUbuntuの場合

1. [ネットワーク設定]から、設定するデバイスを適当に設定する
2. 反映させるには、以下のコマンドを実行
```
sudo service network-manager restart
```

※ ``` sudo service network restart``` では変更が反映されない

RedHat 系との微妙な違いは、慣れるまでなかなか厳しそう......
Apache2のログで日本語がエスケープされる。

Apache2では日本語文字列が安全の為にエスケープされるようになってるので、ちょっと確認用に
print STDERR "日本語だよ\n";
とか入れても、\xnnで出力されてしまう...

ということで、.cshrcにエイリアスを設定しました。
`alias   ap2w    'perl -nle ' \' 'use Encode;s/\\x(..)/pack("C",hex($1))/eg;Encode::from_to($_,"UTF8","EUC-JP");print $_;' \'`
`alias   ap2e    'perl -nle ' \' 'use Encode;s/\\x(..)/pack("C",hex($1))/eg;Encode::from_to($_,"EUC-JP","EUC-JP");print $_;' \'`
`alias   ap2s    'perl -nle ' \' 'use Encode;s/\\x(..)/pack("C",hex($1))/eg;Encode::from_to($_,"SHIFT_JIS","EUC-JP");print $_;' \'`

wesは文字コードです。出力はEUC固定。
`tail -f ～/error_log | ap2e`
のように使ってます。
「とりあえず JSON」の根拠

なんか XML で作られようとしている API があって、「JSON でよくね?」って話をした。
そのとき考えたことを一応メモしておく。

# とりあえず JSON

Web API など、言語やサービスを越えてのデータをやり取りしたいケースはいくらでもある。
そういうときはとりあえず JSON を選択することにしている。
まぁいまどきだいたいみんなそうですよね。
なんで XML やその他のフォーマットと比べて JSON が良いと感じるのか。

## 根拠

* XML ほどリッチではないがほとんどの場合事足りるしわかりやすい
* だいたいどんな言語のデータ構造にもわかりやすくマッピングできる
* だいたいどんな言語でも定番のライブラリがある
* 文字コードとして Unicode を強制されるので文字コードまわりの面倒が起こりにくい
* エンコード/デコードのパフォーマンスが求められるようになったら MessagePack に移行すれば良い

あとは、まだ実践したことはないけど

* バリデーションとかに JSON Schema 使えると便利 (XML Schema は XML にしか使えないが、JSON Schema ならあらゆる用途・あらゆる言語で使えるし、データ自体は読みやすいように YAML ファイルとかで持っておくこともできる)

突っ込みどころあったらお願いします。

# XML について

XML に関しては、JSON よりもリッチなデータを表現できるので、XML の方が良いケースというのも確かにあるんだろうけど、個人的にはそういうのに遭遇したことないです。
別に XML の存在意義を否定するような意図はありません。
まぁ普通の WebAPI でレスポンスが XML だったらちょっとダルイなとは思いますが。

# YAML について

YAML でもいいんじゃないか、と考えた。
が、結論としては JSON の方が良いのではと思う。

## 良い点

* 読みやすい
* 概ね JSON と相互変換でき、JSON で表現できることは大体 YAML にも表現できる

## 悪い点

* 単純な「データ」ではない部分がある
    * アンカー/エイリアスという仕様があり、要は変数みたいなもの (詳細は[プログラマーのための YAML 入門 (初級編)](http://magazine.rubyist.net/?0009-YAML#l10)を参照)

Web API の実装として、パラメータか何かで出力フォーマットを切り替えることができて、YAML でも出力できるようになっている、というのはデバッグ時に読みやすいので便利だと思う。
でもあくまでもメインは JSON。
c++でopenGLをはじめた

# 1.はじめに

今C++でプログラムを作っていて、グラフィックが必要でもともとUnityでやろうと思っていたが、C++のプログラムを呼び出すのが無料版ではできなさそうなのでopenGLでグラフィックを。

今回は本当に触りの部分で、以下のようなウィンドウを表示させます。

![window.png](https://qiita-image-store.s3.amazonaws.com/0/32946/7fbd5f0f-4f21-b611-3136-21278aaff287.png)

# 2.プログラム

```cpp:test.cpp
#include <GL/glut.h>

void display()
{
}

int main(int argc, char *argv[]){
	// 初期化
	glutInit(&argc, argv);
	// ウィンドウを開く
	glutCreateWindow("Hello OpenGL/GLUT world.");
	// ウィンドウへの描画関数の登録
	glutDisplayFunc(display);
	// メインループ開始
	glutMainLoop();
	return 0;
}
```

# 3. ターミナルコマンド

```
$ gcc test.cpp -framework GLUT -framework OpenGL -Wno-deprecated
$ ./a.out
```

これで実行できました。
MySQL コマンドメモ


## index を見る
```mysql
show index from table_name;
```

## index を貼る
```mysql
ALTER TABLE table_name ADD INDEX index_name (column1, column2)
```

## index を削除する
```mysql
ALTER TABLE table_name DROP INDEX index_name;
```

## column をDROPする
```mysql
ALTER TABLE table_name DROP column_name;
```

## record を DELETEする
```mysql
delete from schema_migrations where version="20140728111111";
```

## tableの容量を見る
```mysql
show table status like 'users'\G;
```

## 接続しているprocessを見る
```mysql
show processlist;
```

## slaveの状況確認
```mysql
show slave status\G
```

## slaveでqueryをskipする場合
```mysql
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE SQL_THREAD;
``` 

## database を createする
```mysql
CREATE DATABASE db_name
```

## cnfの場所を確認する
```bash
mysql --help | grep my.cnf
```

## genral logを出力する
```
[mysqld]
#  Query log
general_log=1
general_log_file="/var/log/mysql/sql.log"
log_output=FILE
```
Django事始め その2 with eclipseプラグイン(PyDev)


##開発環境
PC: MacOS X 10.9.4
Python3.4.1
Django1.6.6

##PyDevを利用したDjango Project の作成
`Django`のアプリを作成する場合、コマンドラインで作成するようであるが、統合開発環境(`IDE`)を使用した方が便利だ。`IDE`といえば、私自身は`Java`出身で根っからの`eclipse`好きなので、`Python`用`IDE`の`PyDev`というプラグインがあるらしいので、これを利用しようと思う。
以下は`eclipse`に`PyDev`プラグインを既にインストールした状態での説明とする。

##Pythonインタプリタのパス設定

まずは前回インストールした下記の`Python`を設定するために、[Eclipse]-[環境設定]-[PyDev]を選択して、新規インタプリタ`Interpreter-Python`を追加し、先日インストールした、下記パスの`Python3`を指定する。

`/Library/Frameworks/Python.framework/Versions/3.4/bin/Python3`

![スクリーンショット 2014-09-02 15.09.51.png](https://qiita-image-store.s3.amazonaws.com/0/3184/f6e400a8-f66e-8c04-d974-bb441fc9a40e.png "スクリーンショット 2014-09-02 15.09.51.png")


##Projectの作成

それでは、早速`Eclipse`でプロジェクトの作成。メニューに'PyDev Django Project'があるので選択する。

![スクリーンショット 2014-09-02 14.44.00.png](https://qiita-image-store.s3.amazonaws.com/0/3184/472fe653-5299-8d30-e832-8af356f949b5.png "スクリーンショット 2014-09-02 14.44.00.png")

##プロジェクトの設定
プロジェクト名と作業ディレクトリと`Python`バージョンと、先ほど新規に追加したインタプリタ`Python3.4`を設定する。

![スクリーンショット 2014-09-02 14.44.38.png](https://qiita-image-store.s3.amazonaws.com/0/3184/90c0aa52-858e-8ead-b877-d4f10091e4ef.png "スクリーンショット 2014-09-02 14.44.38.png")

##DBの設定
デフォルトで使用できるデータベースは`SQLite`らしいのであるが、私の好みは`MySQL`なので、ローカルPC環境にインストールされている`MySQL`を使用することにする。

ちなみに、今回使用する`Django`アプリ用のデータベースは、`MySQL`上に前もって作成してしておく必要があるようだ。

```create_db.sql
--DB作成
CREATE DATABASE django_db CHARACTER SET utf8
;
--DBユーザ作成と権限付与
GRANT ALL ON django_db.* TO db_user@localhost IDENTIFIED BY '*****'
;
```


**※後日、下記の`Eclipse`によるデータベースの設定がうまく行っていないことに気づいた。詳細は[次回記事](http://qiita.com/tajihiro/items/e9b5122872b61eb3a8ca)参照。**

![スクリーンショット 2014-09-02 14.46.18.png](https://qiita-image-store.s3.amazonaws.com/0/3184/5125c8d4-87a9-6f8a-e64f-6f2550329fa8.png "スクリーンショット 2014-09-02 14.46.18.png")



##プロジェクト内容

特にエラーが無くすんなりと行けば、下記のようにプロジェクトが作成される。

![スクリーンショット 2014-09-02 14.41.43.png](https://qiita-image-store.s3.amazonaws.com/0/3184/2944037e-43b4-a2b7-7715-033037c01097.png "スクリーンショット 2014-09-02 14.41.43.png")

今後は、このサンプルプロジェクトをもとに勉強して行く予定。

***Lovely Django!!!***
Wantedlyで行っている開発者用Macの設定方法（主にインターン用）


Wantedlyでは、開発PCは基本的にはMacで統一しており、社員全員にMacbook AirかMacbook Proを支給している。
インターンも最近人数が多いのである程度の数のMacを用意しておいて、それを使いまわすという運用を行うようになってきている。

Wantedlyでは、新しいMacを買ってから行う設定をある程度自動化しているので、今回はこの流れを公開しようと思う。

本来はこの作業を行った後、プロジェクトごと（Web/iOS/Android等)のセットアップを行うという流れになる。ここも特にWeb用の設定は結構自動化されている。

## Macの初回セットアップ

日本語でセットアップ
iCloudなどEmailが必要なものは登録しないでスキップ

## 起動後、Xcodeダウンロードまで

### Dockにデフォルトで存在しているものを消す

好みの問題だがほぼすべて消してOK

最終的に以下の2つぐらいなら残っていればOKな気がする

- Finder
- システム環境設定

この後Chromeなどをインストールするのでそれらは適宜Dockにデフォルトで表示するようにすれば良い

### キーボード設定

システム環境設定からキーボードを選択して以下の部分を変更

キーのリピート：速い
リピート入力認識までの時間：短い
修飾キー：Caps Lock -> Control

### ターミナルの設定

ターミナル.appをSpotlightを使って開いた後、環境設定(⌘,)から以下のように設定。

#### 起動タブ
起動時に開く：次の設定の新しいウィンドウ：Basic -> Pro
(Zshを使いたい人は、開くシェル：`/bin/zsh`に変更)

#### 設定タブ
Proのプロファイルに行って、以下のように設定

Proをデフォルトに設定
テキストタブ：テキストをアンチエイリアス処理にチェック
キーボードタブ：メタキーとしてoptionキーを使用
詳細タブ：ベルでオーディオベルを外してビジュアルベルにチェック


### Xcodeダウンロード

AppstoreからXcodeをダウンロード
ダウンロード時のアカウントは指定されたものを使う
ダウンロードが終わったら一度開いて、規約に同意し、インストールする

## Cookerの使用

CookerはWantedlyのインフラエンジニアが用意してくれたChefベースのセットアップスクリプト
オープンソースになっているので、外部の人も使うことが出来る
https://github.com/wantedly/cooker

### Cookerのダウンロード

Xcodeが正しくインストールされていたら既に`git`が使えるはず
作業用ディレクトリに行って以下をタイプ

```bash
git clone https://github.com/wantedly/cooker.git
```

## Cookerで色んな物をインストール

```
cd cooker
script/cooker
```

何回か`y`を入力したり、Macのログインパスワードを入力する必要がある。

具体的には以下のものが入る:
(情報が古くなる可能性もあるので、詳細はこのコード参照: https://github.com/wantedly/cooker/blob/master/roles/projects.rb )

### 基本セットアップツール

- Xcode Command Line Tool
- Chef
- Berkshelf

### ターミナルで使うツール

- homebrew
- bash-completion
- ruby
- git
- hub
- heroku-toolbelt

### アプリ

- Google Chrome
- Google日本語入力
- CotEditor
- Sublime Text
- Slack
- Skitch
- Evernote
- Dropbox
- Dropbox-encore(Dropboxの2つ目のアカウントを使えるようにする)
- Caffeine
- Postgres

### Wantedlyサーバーをローカルで動かすのに必要な少しマイナーなツール

- imagemagick
- phantomjs
- openssl
- readline

### 簡単な設定

- rbenv用の.bash_profile, .zshenv
- .gitconfig ([Wantedlyで開発するときにとりあえず設定してもらう事一覧](http://qiita.com/awakia/items/4c599ebe29a8b2b6ca27)参照)
- Postgresのパスの設定

## Cooker後の設定

### 日本語入力

システム環境設定 -> キーボード -> 入力ソース

で、ひらがな（Google）を追加する
これで日本語入力ができるようになる

# 設定済みのお下がりをもらったインターンの場合ここから
## 個人ごとの設定

ここの部分は抜ける時に情報を消すのを忘れないようにすること
逆に前の設定が残っていた場合、それを消してあげて上書きすること

### gitconfig

以下は誰がコミットしたかわからなくなるので確実に設定

```bash
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
```

エディタにこだわりがある人は、以下のように設定

```bash
git config --global core.editor emacs
```

### Chromeのログイン

設定から新しいユーザーを作る形でやると良い
こうすると個人用と会社用の2つのemailでログインすることも可能

### Slackのログイン

### Dropboxのログイン

### Evernoteのログイン

### その他
Twitterクライアント等入れたいものがあれば好きにインストールして構わない。ログインしたものがある場合は覚えておくこと。後々他人に使われても知らない。


## おまけ：新品のMacじゃない場合

基本的にはChefを使っている + 設定ファイルはそれぞれのファイルが存在しない時のみ置くという実装になっているため、基本的にはこのスクリプトを実行して問題はない。

ただし、Homebrew Caskを使用している問題で、アプリケーションに関してはCaskでダウンロードしたものと通常通りダウンロードしたものの2重にインストールされるので注意。
ココらへんの良い改善案があれば是非コメントでください。
CakePHPのuploadプラグイン(josegonzalez/cakephp-upload)のパス設定

ファイルアップロードした画像の保存先ではまったのでメモ。

以下のアップロードプラグインを使う。

https://github.com/josegonzalez/cakephp-upload

基本的には上記ページの

Using a Polymorphic Attachment Model for File Storage

に書かれている方法で、attachments というテーブルにファイル情報をまとめて保存して、以下のようなパスにファイルが保存されることを想定している。

```
webroot/files/image/attachment/47
```

このプラグインのデフォルトのファイル保存先パスは、

```
'{ROOT}webroot{DS}files{DS}{model}{DS}{field}{DS}'
```

だということになっている。これを見てROOTって、CakePHPのwebroot直下のindex.phpにあるROOTのことかと思ったら大間違い。
これはrootDirのことで、

```
ROOT . DS . APP_DIR . DS
```

なんだそうだ。
なので解凍したCakePHPをそのままの階層で使ってる場合はいいが、アプリケーション本体とwebroot以下を別のフォルダに設置した場合なんかは、全然パスが合わなくなってファイルが保存されなくなってしまう。

ということで、以下のようにしてみた。

```php
class Attachment extends AppModel {

	public $actsAs = array(
		'Upload.Upload' => array(
			'attachment' => array(
				'rootDir' => WWW_ROOT,
                'path' => 'files{DS}{model}{DS}{field}{DS}'
			),
		),
	);
```
存在を確認する関数

『JavaScriptで学ぶ関数型プログラミング』O'REILLYで紹介されていた、関数で私がとても便利だなと感じ、よく使うものを紹介させて頂きます。

著者の方が自分のくせを修正するために用いている関数として紹介されているものです。

JavaScriptで学ぶ関数型プログラミング
http://www.oreilly.co.jp/books/9784873116600/

```existy.js
//関数existyは、何かの存在の有無を明瞭にします
function existy(x) {
  
  return x != null;
}

existy(null);
//=>false

existy(undefined);
//=>false

existy({}.notHere);
//=>false
```


非等値演算子!=を使うことによって、null/undefinedとその他を区別しています。


```truthy.js
//関数truthyは、与えられた値がtrueとみなされるかどうかを判定している
function truthy(x) {
  
  return (x !== false) && existy(x);
}

truthy(false);
//=>false

truthy(undefined);
//=>false

truthy(0);
//=>true

truthy('');
//=>true
```

わたしは、この関数を処理分岐の条件式などでよく用いています。

以上、お役に立てれば幸いです。
IEの為のCSSハック

# IEの為のCSSハック

## IEってめんどくさい

Webサービスを作成しているときに考えないといけないのは、ブラウザ毎に事なる挙動にならないようにすることです。
特にIEはほかのブラウザ（Chrome, Firefox, Opera, Safari...）に比べるとバージョンごとに変な挙動を起こしたりすることが多くて大変です。
そのため、IEバージョン○○のみこの挙動とかを設定してあげる必要があります。
それを実現するのがCSSハックです。

※一応これは応急処置的な書き方なので、非推奨です。。。

## IEのCSSハック方法

CSSに以下の記述をすることで、ハック（適応）が可能になります。

* IE6

先頭に「_」をつけることでハック！

```css
.sample {
  _color: red;
}
```

* IE7

先頭に「*」をつけることでハック！

```css
.sample {
  *color: red;
}
```

* IE8

末尾に「\9」をつけることでハック！

```css
.sample {
  color: red\9;
}
```

* IE9

親要素として「:root」をつけて、
末尾に「\0/」をつけることでハック！

```css
:root .sample {
  color: red\0/;
}
```

## 使用例

例えば、IE6, 7だけ挙動を制限したい時

```css
.ie_hack {
  _visibility: hidden;
  *visibility: hidden;
}
```

上記のようにclassを作って、隠したい要素に

```html
<p class="ie_hack">この文字は消えます</p>
```

これでうまく機能を制限することができます。

以上、がIEのCSSをハックする方法でした。
入門: 祝日を取得してみた

# gem holidays

[公式ページ](https://github.com/alexdunae/holidays)

```bash:gemインストール
gem install holidays
```

```bash:holidaysのHomePage情報
gem list holidays -d
```

もしくは

```bash:gem&nbsp;serverでwebページでのマニュアル閲覧
$ gem server
Server started at http://0.0.0.0:8808
```

```ruby:irb
require 'holidays'
date = Date.civil(2014,9,15)
date.holiday?(:jp)
Holidays.on(date, :jp)
```

```ruby:一年間の祝日一覧を取得
require 'holidays'
from = Date.civil(2014,1,1)
to = Date.civil(2014,12,31)
Holidays.between(from, to, :jp)
```

# Dateクラス

```ruby:Dateクラス使い方
t = Date.today()
p t
p t.next_month(12) # 一年後
p t.next_day(13)
p t.cweek
p t.tuesday?
p t.wednesday?
```


Dateクラスについて目を通したページ:

* `$ ri Date`
* [class Date](http://docs.ruby-lang.org/ja/2.1.0/class/Date.html)
* [rubyで現在日時を取得する - Qiita](http://qiita.com/ta1kt0me@github/items/e890a568d0440b371880)
* [Ruby - [memo] 当月の日付一覧 （Date.newの引数に負） - Qiita](http://qiita.com/mojamoja_mixi/items/9b8e47fe42b466b8f5c5)
* [Ruby で 現在日時の 14 桁の文字列を生成する - Qiita](http://qiita.com/suzuki86/items/556ce38e3c7629d69ded)
* [Rubyで、gem installした後、ざっとドキュメントを見たいとき、どうするのが良いでしょうか？→gem serverで解決 - rubyco（るびこ）の日記](http://d.hatena.ne.jp/rubyco/20090824/doc)
Invalid Bundle Structure エラー


AppStoreへiOSアプリを申請するときに、validationでエラーになりました。
「Invalid Bundle Structure - The binary file 'XXXX' is not permitted. Your app may contain only one executable file. ----」

![スクリーンショット 2014-09-02 2.58.55.png](https://qiita-image-store.s3.amazonaws.com/0/30731/73d8d323-57d0-a084-e6e7-9a3e2367e83d.png "スクリーンショット 2014-09-02 2.58.55.png")

エラーの内容を読んでも、どこが悪いのか分かりませんでしたので、ネットで調べたところ、なんとか解決できました。

どうやら、Xcodeでプロジェクトにプラグインなどのライブラリを追加すると、リソースとして登録されてしまうようです。

Xcodeで下記の操作をすることで解決できました。

- TARGETSでターゲットを選択する。
- Build Phasesを選択する。
- Copy Bundle Resourcesを展開する。
- プラグインのライブラリなど不要なファイルが登録されていたら削除する。

以上
Ridgepole を PostgreSQL と組み合わせて使う

[クックパッド開発者ブログ](http://techlife.cookpad.com/entry/2014/08/28/194147)で紹介されていたデータベーススキーマ管理ツール [Ridgepole](https://github.com/winebarrel/ridgepole) を PostgreSQL と組み合わせて利用した際の備忘録

検証環境
--------------------------------------------------------------------------------

- CentOS 6.5
- Ruby 2.1.2
- Bundler 1.6.2

Ridgepole セットアップ
--------------------------------------------------------------------------------

PostgreSQL に接続するのが目的だが Ridgepole が MySQL のライブラリをデフォルトで要求することに注意。

依存ライブラリインストール:

```sh
$ sudo yum install -y postgresql-devel mysql-devel
```

Ridgepole を動かすディレクトリと Gemfile を用意:

```sh
$ mkdir ridgepole-pgsql
$ cd rigepole-pgsql
$ cat Gemfile
source 'https://rubygems.org'
gem 'ridgepole'
gem 'pg'
```

インストール:

```sh
$ bundle install --path vendor/bundle
```

データベースへの接続設定を追加:

```sh
$ cat database.yml
adapter: postgresql
encoding: utf8
port: 5432
database: example
username: foo
password: bar 
```

PostgreSQL サーバに接続して各種操作を行う
--------------------------------------------------------------------------------

スキーマのエクスポート:

```sh
$ bundle exec ridgepole --config database.yml \
  --export --output=Schemafile \
  --disable-mysql-unsigned  # Postgres に接続するため MySQL のオプションを無効にする
```

スキーマの分割エクスポート:

```sh
$ mkdir schema
$ bundle exec ridgepole --config database.yml \
  --export --split --output schema/Schemafile \
  --disable-mysql-unsigned
```

テーブル定義の変更の適用:

```sh 
$ vi Schemafile # スキーマを編集
$ bundle exec ridgepole \
    --config database.yml \
    --file Schemefile --apply \
    --disable-mysql-unsigned
```

参考
--------------------------------------------------------------------------------

- [クックパッドにおける最近のActiveRecord運用事情 - クックパッド開発者ブログ](http://techlife.cookpad.com/entry/2014/08/28/194147)
- [winebarrel/ridgepole](https://github.com/winebarrel/ridgepole)
- [winebarrel/ridgepole-example](https://github.com/winebarrel/ridgepole-example)
[Objective-C] 配列から特定要素を安全に削除する


イテレーション中に削除はできないので、以下のように削除用配列を作ってまるっと消すのがいいみたい。

```objc
int main() {
    NSMutableArray *array = [@[@1, @2, @1, @3, @1, @4, @1, @5] mutableCopy];
    NSMutableArray *discards = [NSMutableArray array];

    for (NSNumber *n in array) {
        if ([n isEqualToNumber:@1]) {
            [discards addObject:n];
        }
    }

    [array removeObjectsInArray:discards];

    NSLog(@"Result: %@", array);

    return 0;
}
```

実行結果。

```console
2014-09-02 12:28:27.298 sample[57334:507] Result: (
    2,
    3,
    4,
    5
)
```
CordovaのFacebook PluginをiOS, Android, Web全てで導入する方法、詰まったこと

cordovaでnativeのFacebook SDKを利用してFacebook連携出来るようにする`phonegap-facebook-plugin`というものがある。これを使いたい。

http://plugreg.com/plugin/phonegap/phonegap-facebook-plugin

##導入

インストール

```
ionic plugin add https://github.com/phonegap/phonegap-facebook-plugin.git --variable APP_ID="123456789" --variable APP_NAME="myApplication"
```

APP_IDとAPP_NAMEを指定しないと後でplatform別に怒られるので指定しておく。

例えば以下の様な感じでaccess_tokenが取れる。公式のサンプルは`public_info`のアクセス権を指定しているが、いきなり`public_info`は怒られるので`email`とかにしとく。

```
var fbLoginSuccess = function (userData) {
    alert("UserInfo: " + JSON.stringify(userData));
    facebookConnectPlugin.getAccessToken(function(token) {
        alert("Token: " + token);
    }, function(err) {
        alert("Could not get access token: " + err);
    });
}

facebookConnectPlugin.login(["email"],
    fbLoginSuccess,
    function (error) { alert("" + error) }
);
```


##つまったこと

これを導入したとたんにビルド通らなくてまじ泣きそうになったので、詰まったことの解決方法を書いてみます。

### iOS, Android

#### platformをrmしてaddしなおせばなんとかなる

全体を通して言えることで、試行錯誤してるうちに`platform`以下の環境がおかしくなることがある。
その場合は`platform/`以下のディレクトを自前で消すのではなく、きちんとコマンドを発行して消してあげる。さらに言えば、エラーになりうるpluginも消してしまったほうがよい。

```
ionic platform rm ios
ionic platform rm android
ionic plugin remove com.phonegap.plugins.facebookconnect 
```

例えばfacebookconnectプラグインを残して、`ionic platform add ios`をするとAPP_IDがないと怒られて追加が途中で失敗する。困るのがfacebookconnect plugin以降に行われる処理も止まるので、怒られた後に`ionic plugin add ~`でfacebook connect pluginのみ追加すればいいという話ではなくなってしまう。綺麗に`platform add`したいので、自分はplatformと合わせてfacebookconnect pluginも消すことを選んだ流れ。

iOSで、`Plugin 'org.apache.cordova.facebook.Connect' not found, or is not a CDVPlugin`とか、
Androindで、`Error initializing Cordova: Class not found`とか、
エラーが出る時は上記の理由で`platform add`が正常に完了していないのが理由だったりした。

### iOS

#### Xcodeで開けばなんとかなる

buildできなくて`platform/ios`をXcodeで開いたら`FacebookSDK.h`がないというエラーが出てた。
自分の環境が悪かったのかverの問題かまでわかってないんですが、Facebookの[サイト](https://developers.facebook.com/docs/ios/getting-started/jp)からSDK落としてきてXcodeからimportしてあげることで解決出来た。
`ionic build`では表示されないエラーがあったりするので、迷宮入りしそうだったらXcodeやEcliseで開いてみるのはあり。

### Android

#### 公式のREAD MEに従えばなんとかなる

てきとーにやってて、動かなくてなんなんだ！Android！ってなってたら公式のREAD MEにAndroid用の手順が書いてあった。ちゃんと読むようにしたい。

https://github.com/Wizcorp/phonegap-facebook-plugin/tree/master/platforms/android

### Web

#### ライブラリとか追加すればなんとかなる

Web向けにライブラリがまとめられたファイルがあるのでそれを読み込むようにしてあげる。
以下の場所に設置してあるので適当な場所に移して、読み込んであげる。
`plugins/com.phonegap.plugins.facebookconnect/www/js/facebookConnectPlugin.js`

```
<div id="fb-root"></div>
<script type="text/javascript" src="js/facebookConnectPlugin.js"></script>
```

あと、Webのみapp_idのセットが必要だったのでそれも以下でやってる。

```
if (!window.cordova) {
  facebookConnectPlugin.browserInit(app_id);
}
```

以上。楽な道などない。
coreutils 8.23 以降、realpath の動作が変わる

Linux には指定したファイルの絶対パスを表示する realpath というコマンドがありますが、この動作が GNU coreutils 8.23 以降変わります。

# なんで?

独立して提供されていた realpath コマンドが coreutils に統合されたからです。

# どう変わるの?

今のところ分かっているのは下記の2つです。

| 旧              | coreutils 8.23 以降 | 動作
|:----------------|:-------------------|:-----------------
| `realpath FILE` | `realpath -e FILE` | FILE の正規化された絶対パスを表示。<br>シンボリックリンクは展開する。
| `realpath -s FILE` | `realpath -s -m FILE` | FILE の正規化された絶対パスを表示。<br>シンボリックリンクでも展開しない。
Macのadbで認識されないAndroid端末を追加する手順

[android端末がadbで認識されないとき](http://akiniwa.hatenablog.jp/entry/2014/03/08/013820)
を参照して、「システム情報」がどこにあるか分からず一瞬詰まったのでメモ。

0. Application > Utilities > System Information
0. Hardware から USB の項目を探す
0. USB接続されている端末が表示されるので Vendor ID を確認
0. adb_usb.ini にそれを追記： `echo 調べたVenderID >> ~/.android/adb_usb.ini`
2. adb を再起動

```
adb kill-server
adb start-server
```
UIButtonの画像(imageView)の左寄せ、右寄せ(alignment)の設定

###参考
> http://stackoverflow.com/questions/17873879/aligning-image-and-title-in-uibutton


###要約
`contentHorizontalAlignment` のプロパティを指定すればいい
その後に`titleEdgInsets`、`imageViewInsets`をそれぞれ設定すればおk


###実装
```objc
- (void)createButton
{
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    [self.view addSunbView:btn];

    [btn setTitle:@"てすと" forState:UIControlStateNormal];
    [btn setImage:[UIImage imageNamed:@"hoge_20x20.png"] forState:UIControlStateNormal];
    btn.frame = (CGRect){0,0,320,44};
    // [　　●てすと　　] ← 現在のボタンの見た目

    btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
    // [●てすと　　　　] ← 左寄せ

    btn.imageEdgeInsets = (UIEdgeInsets){0,10,0,0};
    btn.titleEdgeInsets = (UIEdgeInsets){0,btn.imageEdgeInsets.left + 10,0,10};
    // [ ●てすと　　　 ] ← 細かい調整
}
```


###備考
`contentHorizontalAlignment`を使わずに`drawRect`とかで`frame`いじったり
`edgeInsets`だけで頑張ろうとすると
ボタンクリックした時だけデフォルト設定に戻るとか、
テキストが長すぎると画像の位置がずれるとかめんどくさいことになる　なった
多分いけるはず
[Git] 色々メモ


ハマったこと、あんまり使わないけどあとあと使いたいものなどをざっくりとメモ。
なので随時更新です。

## `log`の`format`オプション

```console
$ git log --pretty=format:"[%ad] %h %an : %s"
```

| オプション | 出力される内容 |
|:-----------|:--------------|
| %H | コミットのハッシュ |
| %h | コミットのハッシュ (短縮版) |
| %T | ツリーのハッシュ |
| %t | ツリーのハッシュ (短縮版) |
| %P | 親のハッシュ |
| %p | 親のハッシュ (短縮版) |
| %an | Author の名前 |
| %ae | Author のメールアドレス |
| %ad | Author の日付 (--date= オプションに従った形式) |
| %ar | Author の相対日付 |
| %cn | Committer の名前 |
| %ce | Committer のメールアドレス |
| %cd | Committer の日付 |
| %cr | Committer の相対日付 |
| %s | 件名 |
| %x09 | タブ文字 |

### ログを桁あわせする

`%<(10)%h`などのように`%<(n)`を指定すると、続く内容を指定した数字で桁あわせしてくれる。

```console
$ g log -2 --pretty=format:"[%h](%<(10)%an) %s"
[2733c5d](edom18            ) コード整理
[8f2545f](otherMember       ) コメントを整理
```

みたいな感じになる


## 過去の変更から、特定の文字列を含んだものを検索する

`-S`オプションを使います。

```console
$ git log -p -S hoge
```

こうすると、`hoge`という文字列を含んだ変更を列挙してくれます。

## branchの派生を視覚的に表示する

```console
$ git log --graph --branches --pretty=format:"%d [%h] \"%s\""
```

## branchの派生元確認

*[追記]*
コメントで教えてもらいましたが、以下のようにするとダイレクトに派生元のコミットのハッシュが得られるので便利です。

```console
$ git merge-base develop feature/hoge
```

```console
$ git show-branch --sha1-name develop feature/hoge | tail -1
```

とすることで、`feature/hoge`が`develop`のどこから派生したかのコミットを表示してくれる。


## リポジトリから最新の履歴だけを取得する

```console
$ git clone —-depth 1 https://github.com/***
```

## patchを作ってマージできるかチェックする

手順は、パッチ作成→パッチ適用テスト、な感じ。
まず、パッチを「当てる元」のブランチに移動。（例えばmasterにマージする予定のtopicブランチに移動）
その後、以下のコマンドでパッチファイルを作成

```console
$ git format-patch <BRANCH-NAME> — stdout > <PATCH-FILE-NAME>
$ git co master
$ git apply <PATCH-FILE-NAME> —check
```


## とあるコミットから変更のあったファイルだけを一覧表示

```console
$ git diff --name-only HEAD <any commit>
```


## コミットした内容がどこにいってしまったか分からないときは(reflog (レフログ))

```console
$ git log -g --oneline HEAD
```


## 競合解決がされていないファイルのチェック

```console
$ git ls-files -u
```


## 差分ファイルの適用

```console
$ git diff hoge > pending.diff
$ ….
$ git apply pending.diff
```


## 差分ファイルの作成と適用 (make diff file(s) and apply)

```console
$ git diff HEAD^..HEAD hoge.js > foo.patch
$ patch --dry-run -p1 < foo.patch
$ patch -p1 < foo.patch
```

※gitのrootで差分作成・適用をやること。
※-p1はパスを1階層無視。
※-dry-runは適用後どうなるかのチェック

Refer to: http://d.hatena.ne.jp/zariganitosh/20080325/1206435474


## ファイルを消しちゃった場合にもとに戻す
```console
$ git rm hoge.png //しちゃった場合は↓でいけました
$ git reset HEAD hoge.png
$ git checkout hoge.png
```
DeviseでGmail経由でメールを送信する方法


開発環境（Vagrant）のRailsアプリから手軽にメール送信を確認するため、Gmail経由でメールを送信する。
なお、Gmailは送信数に制限があるようなので注意が必要。

## 動作環境

- Ruby on Rails 4.1.1
- Devise 3.3.0

## 設定

`default_url_options`や`user_name`、`password`は適宜変更する。
設定後はサーバの再起動を忘れない。

```ruby:config/environments/development.rb
Rails.application.configure do

  # ...

  config.action_mailer.default_url_options = { host: '192.168.33.10', port: 3000 }
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.smtp_settings = {
    address: 'smtp.gmail.com',
    port: 587,
    user_name: 'username@gmail.com',
    password: 'password',
    authentication: :plain,
    enable_starttls_auto: true
  }
end
```

## 参考

- http://qiita.com/ytr_i/items/0907ee3312ed9d79c9e8
- http://morizyun.github.io/blog/action-mailer-rails-mail/
- http://easyramble.com/devise-on-rails.html