OmniAICreator/Qiita-1.07M huggingface dataset:
groupcache‎ で組み込み型分散キャッシュ


[groupcache‎](https://github.com/golang/groupcache) は Go で書かれた分散キャッシュライブラリで、複数プロセスでキャッシュを共有するプログラムが簡単に書けます。多くの用途で memcached を置き換えることを目指していて、Google のプロダクション環境で使われているようです。

個人的に groupcache の魅力は、

* キャッシュを複数のピアに分散する (sharding)
* キャッシュに無いデータを同時に大量にリクエストしても、キャッシュ生成処理は1度だけ実行され、他のリクエストには生成されたキャッシュを返す（厳密では無いが、だいたいの場合1度きり）
* 頻繁にリクエストされるデータがリモートにあった場合、ローカルにもキャッシュする

一方、注意しないといけない点はキャッシュのアップデートには対応していないことです。groupcache には expire や明示的な破棄は存在しません。あるキーに対する値は **常に同じ** であることが要求されます。

## サンプル
サンプルコードがほとんどなくて、groupcache の使い方が分かりにくかったのでサンプルを貼っておきます。このサンプルではピアと通信するのに http を使いますが、フロントとはポートを分けておきたかったので martini とは別で動かしています。

```go
package main

import (
	"encoding/json"
	"github.com/codegangsta/martini"
	"github.com/golang/groupcache"
	"net/http"
	"os"
	"time"
)

func main() {
	addr := os.Getenv("GROUPCACHE_ADDR")
	peers := groupcache.NewHTTPPool("http://" + addr)
	peers.Set("http://127.0.0.1:8000", "http://127.0.0.1:8001")
	go http.ListenAndServe(addr, peers)
	heavy := groupcache.NewGroup("heavy", 64<<20, groupcache.GetterFunc(heavyTask))

	m := martini.Classic()
	m.Get("/_stats", func() []byte {
		v, err := json.Marshal(&heavy.Stats)
		if err != nil {
			panic(err)
		}
		return v
	})
	m.Get("/:key", func(params martini.Params) string {
		var result string
		if err := heavy.Get(nil, params["key"], groupcache.StringSink(&result)); err != nil {
			panic(err)
		}
		return result
	})
	m.Run()
}

func heavyTask(ctx groupcache.Context, key string, dst groupcache.Sink) error {
	time.Sleep(400 * time.Millisecond)
	dst.SetString("Value of " + key)
	return nil
}
```

### 実行
上記のコードを `main.go` というファイル名で保存したら、端末を2つ開いて以下のように実行します。

```bash
$ GROUPCACHE_ADDR=127.0.0.1:8000 go run main.go
$ GROUPCACHE_ADDR=127.0.0.1:8001 PORT=3001 go run main.go
```

3つ目を開いて curl で試すと、キャッシュされているのが分かると思います。

```bash
$ curl localhost:3000/foo  # 400ms
$ curl localhost:3001/foo  # <1ms
```

また、`http://localhost:3000/_stats` にアクセスすると統計情報が JSON で取れます。

## 課題
groupcache にはピアの自動更新機能はありません。そのため、うまく使うにはピアの管理がポイントになります。

orchestration ツールと組み合わせるか、[memberlist](https://github.com/hashicorp/memberlist) や [etcd](https://github.com/coreos/etcd) と組み合わせて使うとよさそうです。

## 参考
* [dl.google.com: Powered by Go](http://talks.golang.org/2013/oscon-dl.slide)
* [groupcache を読む #1 - Kato Kazuyoshi](http://2013.8-p.info/japanese/07-31-groupcache-1.html)
* [groupcache を読む #2 - Kato Kazuyoshi](http://2013.8-p.info/japanese/08-02-groupcache-2.html)
Rで可視化。Pixivタグ検索結果からタグの関係マップを出力

#出力イメージ（タグの関係マップ）
![Rbiplot.png](https://qiita-image-store.s3.amazonaws.com/0/38787/aad5d423-a6c2-1144-f6c4-15520b9a2b51.png)

#概要
タグの関係性を描いた二次元マップを見て、自分も作りたくなった。
[対応分析](http://mjin.doshisha.ac.jp/R/26/26.html)の代表的な可視化手法である[バイプロット](http://case.f7.ems.okayama-u.ac.jp/statedu/hbw2-book/node179.html)という手法を使えば良いらしいので、使った。

#処理
##01.Pixivの検索結果をCSV形式で取得する。
[-> Pixiv検索結果をCSVダウンロードするHTMLファイルを用意した](http://qiita.com/nezuq/items/55800d55c03606e0b13c)

##02.Pixivの検索結果から1タグ1カラムの表データを作る。(Ruby)
[-> Rubyで前処理。Pixivのタグ検索結果から1タグ1カラムの表データを作る](http://qiita.com/nezuq/items/69d15011b6c4b73830b7)
##03.分割表に対し対応分析を実施し、その結果をバイプロットで可視化する。(R)
```
x <- read.csv("OUTPUT.csv")
biplot(corresp(x,nf=2))
```
ClojureでJava 7対応版のwith-open関数を作ってみる

Clojureの標準にあるwith-open関数（マクロ）にはちょっとした問題があります。
本体の処理とクローズ処理の両方で例外が発生した場合、クローズ処理で発生した例外が伝播してしまいます。

```with-open-sample.clj
(with-open [c (reify java.lang.AutoCloseable
                (close [this] (throw (java.io.IOException. "closeA"))))]
  (throw (IllegalStateException. "tryB")))
```

```
java.io.IOException: closeA
         (Unknown Source) user/eval7216[fn]
         (Unknown Source) user/eval7216
...
```


Java 7で導入されたtry-with-resources構文ではそのへんのことが考慮されていて、クローズ処理で発生した例外は本体の例外のSuppressed領域に入るようになっています。
例えば、以下のコードを実行すると

```TrySample.java
package trysample;

public class TrySample {
    public static void main(String[] args) throws Exception{
        try(AutoCloseable a = () -> {throw new java.io.IOException("closeA");}){
            throw new IllegalStateException("tryB");
        }
    }
}
```

このような結果になります。

```
Exception in thread "main" java.lang.IllegalStateException: tryB
	at trysample.TrySample.main(TrySample.java:6)
	Suppressed: java.io.IOException: closeA
		at trysample.TrySample.lambda$main$0(TrySample.java:5)
		at trysample.TrySample$$Lambda$1/2536472.close(Unknown Source)
		at trysample.TrySample.main(TrySample.java:7)
```

Java 7ではこれを実現するためにThrowableクラスにaddSuppressedメソッド、getSuppressedメソッドなどが追加されています。

これを利用してJava 7対応版のwith-openとしてauto-closeマクロを作ってみます。

```auto-close.clj
(defmacro try-finally [main-form dispose-form]
  `(with-local-vars [th# nil]
     (try ~main-form
       (catch Throwable t# (do (var-set th# t#) (throw t#)))
       (finally
         (try ~dispose-form
           (catch Throwable t#
             (if (nil? @th#) (throw t#) (do (.addSuppressed ^Throwable @th# t#) (throw @th#)))))))))

(defmacro auto-close [bindings & body]
  {:pre[(vector? bindings)
        (even? (count bindings))
        (every? symbol? (take-nth 2 bindings))]}
  (if (zero? (count bindings)) `(do ~@body)
    `(let ~(subvec bindings 0 2)
       (try-finally (auto-close ~(subvec bindings 2) ~@body)
                    (.close ~(bindings 0))))))
```


これでちゃんと本体の例外が返るようになりました。

```auto-close-sample.clj
(auto-close [c (reify java.lang.AutoCloseable
                (close [this] (throw (java.io.IOException. "closeA"))))]
  (throw (IllegalStateException. "tryB")))
```

```
 java.lang.IllegalStateException: tryB
         (Unknown Source) user/eval7222
...
```

※副作用があるコードの場合、with-local-varsとvar-setの組み合わせを使うと便利ですね～
HerokuでMySqlの設定をする

HerokuでMysqlを使える設定する。

まずはHerokuにログインしてもらう。

初期の設定ではPostgresqlになっている。
Herokuではmysqlを使うためにクレジットカードの登録が必要なので登録。
HerokuのDashbordの一番左側のAccountの項目からBillingを選択してクレジット情報を登録する。

一番上のheroku　dashbordの部分のAdd-onの項目をクリックする。

DateBase Storesの所に<ClearDB MySQL Databas>の欄があるのでそこをクリックする。
Plansの箇所でFreeプランを選択する。

自分のプロジェクトのパスで下記のコマンドを入力する。

```
$ heroku addons:add cleardb
```

Ruby on Railsを使う場合はmysqlのversionは対応するgemに合わせる。

```
$ heroku config | grep CLEARDB_DATABASE_URL

CLEARDB_DATABASE_URL => mysql://adffdadf2341:adf4234@us-cdbr-east.cleardb.com/heroku_db?reconnect=true
```

のコマンドを打つと自分のデータバースのURLの情報がでてくる。
mysqlになっているのでmysql2にかえる。

```
$ heroku config:set DATABASE_URL='mysql2://adffdadf2341:adf4234@us-cdbr-east.cleardb.com/heroku_db?reconnect=true'

Adding config vars:
DATABASE_URL => mysql2://adffd...b?reconnect=true
Restarting app... done, v61.
```

参考url: https://devcenter.heroku.com/articles/cleardb
Gemymotionをcocos2dx3.0rc0で試す


新規プロジェクトを作成して、Gemymotionを起動し、何も考えずにcocosコマンドでビルドすると

```Bash
 cocos run -p android
```

次のようなエラーがでます。

*INSTALL_FAILED_CPU_ABI_INCOMPATIBLE*

Genymotionはx86で動作するので、x86でビルドする必要があります。
変更するファイルは次の通りです。

```CMake:jni/Application.mk
APP_STL := gnustl_static
APP_ABI := armeabi x86
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -DCOCOS2D_DEBUG=1 -std=c++11 -fsigned-char
```
Serverspecのメモ・疑問点

最近ChefとServerspecを始めたので、備忘録としてメモを記載。Rubyも初心者です。

# 解決済み

## 実行時の警告

```rb
describe file("/etc/yum.repos.d/epel.repo") do
  its(:content) { should match /enabled=1/ }
end
```

など、ファイルの中身を検証しようとすると

```
.CommandResult#[] is obsolete. Use accessors instead. in C:/Users/hogehoge/.vagrant.d/gems/gems/serverspec-0.12.0/lib/serverspec/type/file.rb:80:in `content'.
```

と警告が表示される。

(2014/03/30 追記)
`serverspec`のバージョンが0.12.0と古かったことが原因でした。
Vagrantのプラグイン`vagrant-serverspec`(0.0.1)をインストールした際に一緒にインストールされる`serverspec`が古かったようです。
ご指摘ありがとうございました。

## packageの提供しているbe_installed.byの種類
　serverspecというよりもspecinfraの話ですが、be_installed.byに指定できる引数の種類についてメモ。
　specinfra-1.0.1で確認。

* gem
* npm
* pecl
* pear
* pip
* cpan

　be_installed.by('bundle')とか書いても動きませんよ。（自戒）

# 悩み
## ChefSpecとServerspec
`ChefSpec`を単体テスト、`Serverspec`を結合テストと捉えると、両方記載しないといけないんだろうけど、
`Vagrant`で仮想マシンを立てて`chef_solo`流して`Serverspec`流して...、とやっていると、
`ChefSpec`と`Serverspec`で記載内容がかなり被るのもあり、`ChefSpec`を記載するのが億劫。というかほとんど`Serverspec`しか書いていません、すみません。

単体テスト用の`Vagrantfile`と結合テスト用の`Vagrantfile`を用意して、

・単体テスト
Vagrantから１つのレシピとそれに対応する`Serverspec`のみ実行。

・結合テスト
Vagrantから複数のレシピを組合せて実行し、`Serverspec`でテストする。テストコードは単体テスト用の`Serverspec`を使いまわしつつ、結合独自のテスト観点を追加する。

みたいな開発でもいいんかなあ。

いちいち仮想マシンを起動してテストすると遅いから、CIすることを考えると`ChefSpec`は必要ってことなのかな？
AWS S3 で listObjects が "AccessDenied" を返す場合

# 問題です

下記の IAM Role だと、 listObjects が 403 を返します。なぜでしょう？

```json
{
    "Version": "2012-10-17", "Statement": [
       {
          "Action": [
               "*"
           ],
           "Resource": [
               "arn:aws:s3:::s3jstest/*"
           ],
           "Effect": "Allow"
        }
    ]
}
```

# 答え

ここがぬけてるからでしたーm9(^Д^)

```js
           "Resource": [
               "arn:aws:s3:::s3jstest", // ←ここ
               "arn:aws:s3:::s3jstest/*"
           ]
```

# 理由

参考URLで知ったんですが、[S3のAction一覧](http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingIAMPolicies.html)に listObjects なんて権限はなく、 listBucket の権限が必要になるとのことです。

確かに、[APIドキュメント](http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)にも `GET Bucket (List Objects)` なんて書かれてます。

で、ワイルドカードで指定するだけだと、bucketに対するAPIはたたけないということで、listObjects もできないと、そういうことですね。

# 参考

<http://qiita.com/rch850/items/068a323e50b906384930>

# 2014/04/16 追記

PutObject や GetObject ではワイルドカードによる指定が必要みたいです。ぐぬぬ。
Ubuntuのデフォルトのファイルマネージャを変更する簡単な方法

デフォルトのファイルマネージャを **Nautilus** からLinux Mintで使われている **Nemo** に変更します。

1. Nemoをインストールします。

    `$ sudo apt-get install nemo`

2. /usr/binより優先度の高いPATHにnautilusという名前でnemoへのリンクを作成します。

    `$ ln -s /usr/bin/nemo $HOME/bin/nautilus`

3. 再起動。

Nautilusに戻したい時は、nemoへのリンクを削除してください。
iOSでチュートリアル画面を作るメモ

※追記・注意 情報が古くなってる可能性があります. あと前試したときにNavigationBarをつけたらうまく行きませんでした. [2015/8/2]

初めて起動した時に出るようなもの。
Storyboardでサクッと作りたいときのメモ

↓こんな感じの  
![06.jpg](https://qiita-image-store.s3.amazonaws.com/0/31202/87e5ad13-4edd-4b40-c804-8b5ef3564182.jpeg)


## やること
* チュートリアルの画面にしたいViewControllerを選択して、Simulated SizeをFreeformにする。WidthとHeightはチュートリアル画面の全体の大きさになる。  
![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/31202/e8d05621-036c-1fbf-96f1-dad709013f74.jpeg)
* 元からあるViewにScrollViewを追加してScrollViewにViewを追加(大きさなどはどちらも元のViewに揃える)
* AutoLayoutを設定
  * ScrollViewのAutoLayout(Spaceを0、Width・Heightの指定なし)  
  * 内側のViewのAutoLayout(Spaceを0、Width・Heightを指定)  
* Viewに色々配置していく
  * ラベルとか、ボタンとかを好きなように
* その他
  * ScrollViewのPaging Enabledにチェックをつける
  * ScrollViewのShows Horizontal IndicatorやShows Vertical Indicatorのチェックを外す
  * PageControlとかつける
  * NavigationBarつけたいときはScrollViewとかを配置する前にSimulated MetricsのTop Barを適当なものに設定しておくと良い
パイプで渡したテキストデータを標準出力するJavaプログラム


[InputStreamReader](http://docs.oracle.com/javase/jp/7/api/java/io/InputStreamReader.html)でパイプで渡したテキストを、[BufferedReader](http://docs.oracle.com/javase/jp/7/api/java/io/BufferedReader.html)で行ごとに出力する。

```PipeCat.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class PipeCat {

	public static void main(String[] args) {
		InputStreamReader pr;
		try {
			pr = new InputStreamReader(System.in, "UTF-8");

			BufferedReader br = new BufferedReader(pr);
			String line = null;
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
```

javaコンパイルをした後、実行する。

```bash
$ ls
PipeCat.java
$ javac PipeCat.java
$ ls
PipeCat.class PipeCat.java
$ echo -e "aaa\nbbb" | java PipeCat
aaa
bbb
```
Pythonで総乗（functoolsを使って）


たまに使いたくなって，いつも覚えてないのでメモ．

```python:prod.py
>>> import functools
>>> import operator
>>> prod = functools.partial(functools.reduce, operator.mul)
>>> print(prod([1, 2, 3]))
6
```

Docstring抜粋．

* partial(func, *args, **keywords) - new function with partial application of the given arguments and keywords.

* reduce(function, sequence[, initial]) -> value

* mul(a, b) -- Same as a * b.


[functoolsのドキュメント](http://docs.python.jp/2/library/functools.html)
[operatorのドキュメント](http://docs.python.jp/2/library/operator.html)

numpy使えば単純に

```python:prod.py
>>> import numpy as np
>>> np.prod([1, 2, 3])
6
```
C#でDxLibDotNetを使うときのTips

## 画像ロードを簡単にしたい！！！

```csharp:image.cs

namespace Test
{
    static class Images
    {
        public static ImgHandler Ins = new ImgHandler(){FileName=@"images\hoge.png"};
        //ここに上のように使いたい画像を追加する
    }

    public class ImgHandler
    {
        public ImgHandler()
        {
            CsLib.RegisterImage(this);
        }

        public int Handler_ID
        {
            set;
            get;
        }

        public string FileName
        {
            set;
            get;
        }
    }

    class CsLib
    {
        private static Queue<ImgHandler> loadImageQueue;

        public static void RegisterImage(ImgHandler h)
        {
            loadImageQueue.Enqueue(h);
        }

        //この関数をDxLib_Init()の後に呼び出せばOK
        public static void LoadImages()
        {
            while (loadImageQueue.Count > 0)
            {
                var img = loadImageQueue.Dequeue();
                int ptr = DX.LoadGraph(img.FileName);
                img.Handler_ID = ptr;
            }
        }
    }
}
```
原理はわかりませんが自動的にQueueに追加されます。

## whileで3つの関数の戻り値を処理するとか大変
一般的にDxLibDotNetを使うときは
* DX.ScreenFlip()
* DX.ProcessMessage()
* DX.ClearDrawScreen()
を一気にするのが鉄則(だと思います)。
しかし処理1個1個にif(0 == DX.Hogehoge())などと書いていては日が暮れてしまいます。
そこで

```csharp:enumerable.cs
private static IEnumerable<int> ProcessWorks()
{
    yield return DX.ScreenFlip();
    yield return DX.ProcessMessage();
    yield return DX.ClearDrawScreen();
}
```

という関数を用意して

```csharp:work.cs
public static bool Process()
{
    return ProcessWorks().All(x => x == 0);
}
```

こうする。
ループごとに処理を追加したくなっても  

```csharp:aone.cs
yield return DX.Hogehoge(); 
```

を追加するだけで済む。というのを教えていただきました。
cocos2d-x-3.0rc0 Luaバインディング（LuaからC++呼び出し）

#はじめに
LuaとC++のバインディングは、それなりに難しい。
lua_Stack っていうのに 引数をpushしたりpopしたりして
データの受け渡ししたり
そういうあたりは、わりと 解説されているので
そちらで理解してください

勝手にリンクしてすみません 例えば

[5.1さらうどん](http://giginet.hateblo.jp/entry/2012/10/10/070651)

等からリンクたどっていけば すぐわかると思います

ただ、同じように書いた場合 cocos2d-xでは 動きません
特に LuaBindingsあたり ノードキュメントなので
ソースを解析したメモ


##愚直にBindingsやってみる  ダメな例

定石通りに lua_open() からやってみる
(説明のため、クラスではなく 平べったい関数を登録してます)

関数は 引数なし、戻り値 文字列


```cpp:AppDelegate.cpp
        // Luaエンジンを作成
	auto engine = LuaEngine::getInstance();
	ScriptEngineManager::getInstance()->setScriptEngine(engine);

        // 定石どおり、lua_open()で lua_Stateを作成する
        lua_State* L = lua_open();

        // Luaから呼べる関数の登録関数
        tolua_hoge_open(L); 

        // スクリプト実行
        engine->executeScriptFile("src/main.lua");

```

```cpp:hoge.cpp
extern "C" {
#include "tolua++.h"
#include "tolua_fix.h"
}

//GetHogeのグルーコード
int hogeGlue(lua_State *L){
  const char* hoge = "test";
  lua_settop(L, 0); // スタックをトップに。おまじない？
  tolua_pushstring(L, hoge);  //Luaスタックにhogeをpushし Luaに渡す
  return 1;  //返り値の数
}

TOLUA_API int tolua_hoge_open(lua_State* L){

// Luaのグローバルテーブルに hogeという関数名で hogeGlue()を登録する
lua_register(L, "hoge", hogeGlue);

    return 1;
}
```


```lua:main.lua
    local s = hoge();
    print( "s=" .. s )
```


実行すると、main.luaで  hogeって関数がないよ！！ って怒られます


##なぜ見えないの？
何故見えないのか、私はこう推測しました

```cpp:AppDelegate.cpp
        // ここのLuaスタックと
	auto engine = LuaEngine::getInstance();
	ScriptEngineManager::getInstance()->setScriptEngine(engine);

        // ここのLuaスタックが違うので
        lua_State* L = lua_open();

        // ここでグローバルに登録したスタックは
        tolua_hoge_open(L); 

        // 実行されるスタックとは違うのではないか？
        engine->executeScriptFile("src/main.lua");

```


##解決
lua_open()で新しい lua_Stackを作らず、おそらく ScripeEntineManagerの lua_Stackに登録すれば
いいのではないか？
ってことで、その辺りのソースを解析した結果

```cpp:AppDelegate.cpp
        // ここのLuaステートを使いたい
	auto engine = LuaEngine::getInstance();
	ScriptEngineManager::getInstance()->setScriptEngine(engine);

        // lua_open()せずに、取得関数あったよ！！
        lua_State* L = LuaEngine::getInstance()->getLuaStack()->getLuaState();


        // LuaEngineと同じlua_Stackに 関数登録
        tolua_hoge_open(L); 

        // 
        engine->executeScriptFile("src/main.lua");

```


原因わかればすごい単純な事でしたが
情報がみつけられず 少し悩みました

スタックが違うんじゃないか？って想定してからは、すぐに解決しましたが
他にも悩んでいる方がいれば参考に。


もっと詳しい方、補足してくれたら嬉しい！
Dockerでタブ補完を効かせて入力を楽にする(Mac)


## 概要

homebrewのDockerにはbash-completionが同梱されています。サブコマンド、引数となるCONTAINER IDやIMAGE IDが補完され大変便利です。

```bash:
# サブコマンドの補完
bash-3.2$ docker r
restart  rm       rmi      run

# IMAGE IDの補完
bash-3.2$ docker run 
539c0211cd76   centos         centos:latest  
bash-3.2$ docker run centos /bin/bash

# optionの補完
bash-3.2$ docker ps -
--all        --latest     --quiet      --size       -l           -q           
--before-id  --no-trunc   --since-id   -a           -n           -s               

# CONTAINER IDも補完
bash-3.2$ docker rm b
b04da2233b11  bebb6336d2f2  boring_tesla  
bash-3.2$ docker rm bebb6336d2f2 
bebb6336d2f2

```

## 環境

* Mac OS X
* bash
* homebrew
* boot2docker

## 手順


install

`brew install bash-completion`

install時のCaveats（注意書き）

```bash:
==> Caveats
Add the following lines to your ~/.bash_profile:
  if [ -f $(brew --prefix)/etc/bash_completion ]; then
    . $(brew --prefix)/etc/bash_completion
  fi

Homebrew's own bash completion script has been installed to
  /usr/local/etc/bash_completion.d

Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
```

Caveatsに従って~/.bash_profile追記

```profile:.bash_profile
# bash-completion
  if [ -f $(brew --prefix)/etc/bash_completion ]; then
    . $(brew --prefix)/etc/bash_completion
  fi
```

~/.bash_profile読み込み

`source ~/.bash_profile`

またはターミナルを開き直してもokです。
これでタブ補完が効くようになります。

## 備考

EPELのdocker-ioにもありましたね。
素晴らしい！

```bash:
#CentOS 6.5
$ rpm -q docker-io
docker-io-0.8.0-3.el6.x86_64
$ rpm -ql docker-io | grep bash
/etc/bash_completion.d
/etc/bash_completion.d/docker.bash
```
iOS開発していて気がついたら一杯のハードディスクを20GB以上軽くする方法！


* 気がついたら121GBすべて使い切ってしまってた。
* 内訳を見ても、その他の項目がほとんど。。どこを削除すればいいのだろうという人は以下を試してみてください
* 削除してみたら20GB以上スペースができた！！！
* (問題ないと思いますが、心配な方は、いきなりrmせずにファイル名変更しながら試したほうがいいかもしれないです。。)

### iPhoneのバックアップを削除する
-> MacBookAirのハードディスクに保存するのはないかな
-> これは最初に昔に試していた
-> バックアップをとらない設定も忘れずに
-> これだけで20GBくらい軽くなった

### DeveloperのArchiveの履歴を削除する
* リリースやテストを何度もしていたら自然に溜まってくる。
* いらないし、削除していいのでは！
* (追記) クラッシュログをシンボルつきのログに変換する.dSYMというファイルも消えるので、気をつけて削除してください。
* https://developer.apple.com/library/iOS/technotes/tn2151/_index.html
* crashlyticsやtestflightでは、自動的にdSYMのファイルをアップロードしていて、ログを見やすくしているそうです。

```
sudo rm -rf ~/Library/Developer/Xcode/Archives
```
-> これで4GBくらい軽くなった

### DerivedDataをすべて削除
* 過去に起動したアプリも重なるとすごい量になっていた
* ここはシミュレーターに過去に入れたアプリが入っている
* 過去のバージョンのシミュレータのアプリとかもここに入ってるみたい
* いったん削除して使うものはまた勝手に作られる
* 削除していいのでは！

```
sudo rm -rf ~/Library/Developer/Xcode/DerivedData
```
-> これで11GBくらい軽くなった

### iOS DeviceSupport
* iOSのDeviceが何種類も入っている。
* 6系とか7系の古いversionなど使わないものは削除していいのでは！

```
sudo rm -rf ~/Library/Developer/Xcode/iOS\ DeviceSupport/6.0*
```
-> 1GBくらい軽くなった

### ~/Library/Logs/iOS Simulator
* 6GBくらいあった
* 所詮ログだし、削除したらいいのでは！

```
sudo rm -rf ~/Library/Logs/iOS\ Simulator
```

### ~/Library/Caches
* 1.3GBくらいになっていた
* 所詮キャッシュだし、削除したらいいのでは！

```
sudo rm -rf ~/Library/Caches
```
jQueryセレクタのエスケープ


jQueryの小ネタです。

### セレクタに使用するときエスケープが必要な文字

公式の説明によれば、この31字

```
 !"#$%&'()*+,./:;<=>?@[\]^`{|}~
```
は2つのバックスラッシュ`\\\`でエスケープする必要があります。

[Category: Selectors](http://api.jquery.com/category/selectors/)

>To use any of the meta-characters ( such as  !"#$%&'()*+,./:;<=>?@[\]^`{|}~ ) as a literal part of a name, it must be escaped with with two backslashes: \\. 

### エスケープするメソッドを作っておいて

```Javascript
function selectorEscape(val){
    return val.replace(/[ !"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~]/g, '\\$&');
}
```

### このようなときに

selectorを動的に組み立てたいようなときに使います。

```Javascript
function(form, val){
...
    var selector = 'input[name="' + name + '"][value="' + selectorEscape(val) +'"]';
    var found = form.find(selector);
...
}
```
Windowsでハードリンクやシンボリックリンクを作成する

Windows でもハードリンクやシンボリックリンクが作れることを初めて知ったのでメモ。

#それぞれの対象

| |ハードリンク|ジャンクション|シンボリックリンク|
|:---|:---|:---|:---|
|対象|ファイル|フォルダ|ファイル＋フォルダ|

#ハードリンク
##書式
```bat:
mklink /h <リンク> <ターゲット>
```

##例
```bat:
>dir /b
hoge.txt

>type hoge.txt
hoge

>mklink /h hard_link.txt hoge.txt
hard_link.txt <<===>> hoge.txt のハードリンクが作成されました

>dir /b
hard_link.txt
hoge.txt

>type hard_link.txt
hoge

>echo aaa >> hoge.txt

>type hard_link.txt
hoge
aaa

>mkdir dir & move hoge.txt dir
        1 個のファイルを移動しました。

>tree /f
│  hard_link.txt
│
└─dir
        hoge.txt

>type hard_link.txt
hoge
aaa

>rmdir /s /q dir

>dir /b
hard_link.txt

>type hard_link.txt
hoge
aaa
```

最初に存在したファイル（`hoge.txt`）が移動されたり削除されたりしても、ハードリンクはターゲットの実体を指し続ける。


#ジャンクション
##書式
```bat:
mklink /j <リンク> <ターゲット>
```

##例
```bat:
>tree /f
└─dir
        hoge.txt

>mklink /j junction_dir dir
junction_dir <<===>> dir のジャンクションが作成されました

>tree /f
├─dir
│      hoge.txt
│
└─junction_dir
        hoge.txt

>echo fuga.txt > junction_dir\fuga.txt

>tree /f
├─dir
│      fuga.txt
│      hoge.txt
│
└─junction_dir
        fuga.txt
        hoge.txt

>rmdir /s /q dir

>tree /f
└─junction_dir

>cd junction_dir
指定されたファイルが見つかりません。
```

オリジナルのフォルダ（`dir`）が削除されると、ジャンクションは残るがアクセスできなくなる。

#シンボリックリンク

作成には __管理者権限が必要__ 。

##書式
```bat:ファイルの場合
mklink <リンク> <ターゲット>
```

```bat:フォルダの場合
mklink /d <リンク> <ターゲット>
```

##例
```bat:
>dir /b
hoge.txt

>type hoge.txt
hoge

>mklink symbolic_link.txt hoge.txt
symbolic_link.txt <<===>> hoge.txt のシンボリック リンクが作成されました

>type symbolic_link.txt
hoge

>echo sss >> symbolic_link.txt

>type hoge.txt
hoge
sss

>mkdir dir & move hoge.txt dir
        1 個のファイルを移動しました。

>tree /f
│  symbolic_link.txt
│
└─dir
        hoge.txt

>type symbolic_link.txt
指定されたファイルが見つかりません。

>echo fuga > hoge.txt & tree /f
│  hoge.txt
│  symbolic_link.txt
│
└─dir
        hoge.txt

>type symbolic_link.txt
fuga

>move symbolic_link.txt dir & tree /f
        1 個のファイルを移動しました。
│  hoge.txt
│
└─dir
        hoge.txt
        symbolic_link.txt

>type dir\symbolic_link.txt
hoge
sss

>del dir\hoge.txt & tree /f
│  hoge.txt
│
└─dir
       symbolic_link.txt

>type dir\symbolic_link.txt
指定されたファイルが見つかりません。
```

- シンボリックリンクを作成したときに指定したパスにファイルがなくなると、参照できなくなる。
- 相対パス指定で作成した場合、シンボリックリンクの場所から相対パスで指定した場所にあるファイルが参照される（もともとあったファイルと別のファイルでも問題ない）。
- 絶対パスでも作成可能。

#参考
- [Windows TIPS：シンボリック・リンクとジャンクションとハードリンクの違い - ＠IT](http://www.atmarkit.co.jp/ait/articles/1306/07/news111.html)
cgroupsによるCPU使用時間優先度設定


cgroupsのcpuサブシステムのcpu.sharesを使用して、
コントロールグループのタスクのCPU使用時間の優先度を設定します。

__※CPU使用時間の優先度（配分）を設定するのであって上限を設定するものでないことに注意__


## 異なる２つのコントロールグループ作成

groupAとgroupBの２つのコントロールグループを作成します。

```
# mount -t cgroup -o cpu none /cgroup/
# mkdir /cgroup/groupA
# mkdir /cgroup/groupB
```

## タスクをコントロールグループに移動

CPU時間を浪費する２つのタスクtaskAとtaskBをバックグラウンド実行し、それぞれをgroupAとgroupBに登録します。
taskA、taskBの実体はCPU時間を浪費させるyesコマンドです。

```
$ ln -s /usr/bin/yes taskA
$ ln -s /usr/bin/yes taskB
$ ./taskA > /dev/null &
[1] 2249
# echo 2249 > /cgroup/groupA/tasks
$ ./taskB > /dev/null &
[2] 2263
# echo 2263 > /cgroup/groupB/tasks
```

## CPU使用優先度設定をしない場合
topコマンドでtaskAとtaskBのCPU使用率を確認します。

```
$ top
top - 01:01:49 up 5 min,  1 user,  load average: 1.85, 0.89, 0.36
Tasks:  65 total,   3 running,  62 sleeping,   0 stopped,   0 zombie
%Cpu(s): 99.0 us,  0.6 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
KiB Mem:    447284 total,    54608 used,   392676 free,     8560 buffers
KiB Swap:   102396 total,        0 used,   102396 free,    24340 cached

  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
 2249 pi        20   0  3192  528  456 R  49.3  0.1   1:44.16 taskA
 2263 pi        20   0  3192  528  456 R  49.3  0.1   1:01.97 taskB
(以下略)
```

taskAとtaskBが半々の割合でCPU時間を消費しています。

## CPU使用優先度設定をする場合
今回はgroupA(taskA)とgroupB(taskB)のCPU使用割合を3:1に設定します。

```
# echo 768 > /cgroup/groupA/cpu.shares
# echo 256 > /cgroup/groupB/cpu.shares
```

期待された割合になっているか確認します。

```
$ top
top - 01:03:08 up 6 min,  1 user,  load average: 2.02, 1.18, 0.50
Tasks:  64 total,   3 running,  61 sleeping,   0 stopped,   0 zombie
%Cpu(s): 98.4 us,  1.3 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
KiB Mem:    447284 total,    54724 used,   392560 free,     8612 buffers
KiB Swap:   102396 total,        0 used,   102396 free,    24340 cached

  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
 2249 pi        20   0  3192  528  456 R  73.8  0.1   2:27.39 taskA
 2263 pi        20   0  3192  528  456 R  24.7  0.1   1:35.26 taskB
(以下略)
```

設定した割合でCPU時間が配分されました。
0が多すぎるデータでの最尤推定(EMアルゴリズム)


webサイトのログ分析のような、「疎」なデータをいじっていると、大体 **分布なんだけど0のデータが多すぎるよん、という事はよく有る。そういう時は、zero inflated ** distribution というのの出番らしい。

これは、要するに、0に確率が集中したデルタ分布と、普通の ** 分布との混合分布で、EMアルゴリズムで最尤推定出来る。

参考文献：Murphy, Kevin P. Machine learning: a probabilistic perspective. MIT Press, 2012. の、Chap.11

## zero inflated geometric distribution の例

### ソース

```r:zi_geom.r

num <- 1000
eps <- 0.3
prob <- 0.2




z <- ifelse(runif(num) < eps, 1, 0)
y <- ifelse(z==1, rgeom(num, prob), 0)




geom.est <- function(x, weight=1){
    a <- sum(weight)
    b <- sum(weight * (1 + x))
    a / b
}




e.step <- function(obs, p.hat, eps.hat){
    num <- length(obs)
    ret <- matrix(nrow=num, ncol=2) ## Prob(z=0 | y[i]), Prob(z=1 | y[i])
    flag <- obs > 0
    ret[flag, 1] <- 0
    ret[flag, 2] <- 1
    ret[!flag, 1] <- 1 - eps.hat
    ret[!flag, 2] <- eps.hat * pgeom(0, p.hat)
    c <- apply(ret, 1, sum)
    ret / c
}
m.step <- function(obs, post){
    num <- length(obs)
    eps.hat <- sum(post[,2]) / num
    p.hat <- geom.est(obs, post[,2])
    list(eps=eps.hat, p=p.hat)
}



eps.hat <- 0.5
prob.hat <- 0.5
for(i in 1:20){
    cat(sprintf("eps=%f, prob=%f\n", eps.hat, prob.hat))
    post <- e.step(y, prob.hat, eps.hat)
    m.ret <- m.step(y, post)
    eps.hat <- m.ret$eps
    prob.hat <- m.ret$p
}
```

### 結果
```r:
> source("zi_geom.r")
eps=0.500000, prob=0.500000
eps=0.491333, prob=0.301370
eps=0.409031, prob=0.264227
eps=0.354965, prob=0.237599
eps=0.325227, prob=0.222115
eps=0.310784, prob=0.214366
eps=0.304253, prob=0.210811
eps=0.301402, prob=0.209249
eps=0.300179, prob=0.208576
eps=0.299657, prob=0.208289
eps=0.299435, prob=0.208167
eps=0.299341, prob=0.208115
eps=0.299301, prob=0.208093
eps=0.299284, prob=0.208084
eps=0.299277, prob=0.208080
eps=0.299274, prob=0.208078
eps=0.299273, prob=0.208078
eps=0.299272, prob=0.208077
eps=0.299272, prob=0.208077
eps=0.299272, prob=0.208077
```
githubにいつもと違うPCからアクセスしようとしたら403で蹴られた

``` 
fatal: unable to access 'https://github.com/ShinSemiya/koreyomo.git/': The requested URL returned error: 403
```

と言われた。

githubの公開鍵登録手順にあやまりはないし

``` 
ssh git@github.com
```
も通る

答えはユーザ名とパスワードが登録されていなかったから

 git remote set-url origin https://ShinSemiya@github.com/ShinSemiya/%(リポジトリ名).git
でOK
Scala - 自身のインスタンスでメソッドチェインしている時の畳み込み


## 環境
* Mac OSX Version 10.9.2
* sbt 0.13.1
* scala 2.10.3

## 実装
* specs2のソースコードから一部抜粋

```scala
case class Chain(list: List[Int]) {
  def withNewElement(e: Int): Chain = this.copy(list = (list.to[ListBuffer] += e).toList)
}
def fold(chain: Chain, list: List[Int]): Chain = {
  list match {
    case Nil => chain
    case x :: xs => fold(chain.withNewElement(x), xs)
  }
}
val chain = Chain(List(1, 2, 3))
val newChain = fold(chain, List(4, 5, 6))
def e1 = newChain must_== Chain(List(1, 2, 3, 4, 5, 6))

```
Unityをマルチモニタでフルスクリーン実行する(Windows限定)

# Unityをマルチモニタでフルスクリーン実行する(Windows限定) #

Unityのアプリ（スタンドアロンプレイヤー）の実行時にフルスクリーン設定で複数画面で実行する方法 (Windows限定です)

### 1.Unityアプリを書き出す ###
とくに特別な設定はいらないはず。。

### 2. .batファイルを作成 ###
1920×1080 のモニターを横に2つの場合

```bat:
(アプリケーション名).exe -popupwindow -screen-width 3840 -screen-height 1080
```
と記述した.batファイルを作成
この.batファイルを.exeのあるディレクトリに配置

↓Unityのコマンドラインのリファレンス
http://docs-jp.unity3d.com/Documentation/Manual/CommandLineArguments.html

### 3.一度、Windowed設定で.exeを実行する ###
Display Resolution Dialog で Windowed のチェックボックスにチェックを入れ、実行し閉じます。
(前回アプリがフルスクリーンで実行されていた場合、うまく複数のモニタ上でアプリが実行されないようです）

### 4. .batファイルを実行 ###
同様のコマンドをコマンドプロンプトで実行しても可能です。



#### (備考) ####
※Windows8で、1920×1080のモニタを縦置き設定で横に6台配置し、6480×1920の解像度でフルスクリーン出力するということもできました。
※Windows8の場合、アプリをフルスクリーンで実行しても、チャームなどのホットコーナー機能は優先されてしまうので、別にホットコーナー機能を無効にする設定を行なう必要があります。
↓こちらのアプリが便利でした
ttp://yakushima-tonbo.com/windows/Windows8/Skip_Metro_Suite.html

※この方法を知らない時期はグラフィックスカードのドライバの設定でディスプレイグループを作成し、複数画面を1枚のディスプレイとみなしてマルチモニタのフルスクリーン設定を行なっていましたが、複数のタッチパネルのタッチイベントを取得したい場合、タッチの座標の取得がうまくいかない問題がありました。しかし、上記の方法だと、タッチの座標も複数モニタで正常に取ることができます。
Windows, Mac, Linuxで使えるMarkdownエディタ、HarooPadを使う

2015/05/12追記 : [Kobito for Windows](http://kobito.qiita.com/win)が出ました。

# Windowsでも使えるMarkdownエディタ

KobitoとかMouとかいい感じのMarkdownエディタはなぜかWindows対応してない！なので、WindowsユーザーでMarkdownを編集するのに良いエディタがなくて困っているという人は多いんじゃないでしょうか？

しかし先日、[Moongiftで紹介](https://www.moongift.jp/2014/03/haroopad-%E9%96%8B%E7%99%BA%E8%80%85%E3%81%AB%E3%81%B4%E3%81%A3%E3%81%9F%E3%82%8A%E3%81%AAmarkdown%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/)されていた[Haroopad](http://pad.haroopress.com/)というエディタがなかなかいい感じでした。


# Haroopadとは

![capture-20140328-231437.png](https://qiita-image-store.s3.amazonaws.com/0/2685/37b39397-350c-cc50-b0e7-d7db0fb97815.png)

Haroopadは、[node-webkit](https://github.com/rogerwang/node-webkit)というNode.js + WebKitのクロスプラットフォームなUIキットを使って作られたMarkDownエディタです。

QiitaやGithubと同じように

> \`\`\`js
> console.log("hello");
> \`\`\`

みたいに記述すれば、コードのシンタックスハイライトも使えます。つかえる言語は[このあたり](http://highlightjs.org/static/test.html)を見れば載ってます。

ダウンロードは[このページ](http://pad.haroopress.com/user.html)からできます。


海外製のエディタは、日本語がうまく使えないものも多いですがHaroopadは日本語にも十分に対応しています。

# Haroopadを日本語化する
Haroopadをインストールした後 ```File > Prefarence``` で設定画面を開く。すると、自動的にリソースファイルのアップデートが開始して、アップデートの終了後、再起動をすればUIが日本語化される。…はずですがうちのWindows8.1ではうまくいきませんでした。

なので、直接Githubからリソースファイルをダウンロードしてきます。

https://github.com/rhiokim/haroopad-locales
このページの右側のDownload Zipからダウンロードできます。

ダウンロードしたZipを解答して、```(HarooPadのインストールフォルダ)/Libraries/.locales```に丸ごと上書きしてしまいましょう。

その後、Haroopadを再起動すればUIが日本語化されます。


# エディタ側のフォントを変更する
デフォルトだと、漢字のフォントがなんかちょっと読みづらいです。CSSに変更を加えて、好きなフォントに変更してしまいましょう。

ファイル > 設定 > エディタ > defaultをEdit

cssの```editor{}```のところを以下のように編集してしまいましょう。

```css
editor {
	font-family: 'Bitstream Vera Sans Mono', 'Courier New', Courier, 'MS Gothic', 'Osaka-Mono', 'TakaoGothic', 'Hiragino Kaku Gothic ProN', 'メイリオ', monospace !important;
}
```

ここで、重要なのは最後に```!important```をつけることです。これをつけないとフォントの設定が反映されません。

# ビューア側のフォントを変更する
ビューア側の日本語フォントも読みづらいですね。こちらも変えてしまいましょう。

ファイル > 設定 > ビューワ > defaultをEdit

```css
>* {
	font-family:'Helvetica Neue', Helvetica, 'Hiragino Kaku Gothic ProN', Meiryo, sans-serif;
}

code {
	font-family: 'Bitstream Vera Sans Mono', Courier, monospace;
	font-weight: normal;
}
```

codeには等幅、それ以外にはプロポーショナルフォントを指定しました。

ここまで、設定しておけば日本語も問題なく使えるはずです。


バージョン0.11.1ということで、まだまだ発展途上ですがかなり期待が持てるエディタではないでしょうか
簡単にスライドメニューを実装できるjQuery.Mmenuを試してみました

簡単にスライドメニューを実装できるjQuery.Mmenuというのを知ったので試してみました。

公式サイトはこちらです。
http://www.hongkiat.com/blog/jquery-mmenu-sliding-menu/

Getting Startedの辺りにあるリンクから必要なファイルをダウンロードできます。
![2014-03-28_222901.png](https://qiita-image-store.s3.amazonaws.com/0/8407/5e376c0e-928a-f610-2bc8-a7a703c38bce.png)

Zipファイルの中はこんな感じでした。
![2014-03-28_223047.png](https://qiita-image-store.s3.amazonaws.com/0/8407/ba161da8-07f1-d475-dbcc-22f1e29aaad5.png)

実際に使用するJSファイルやCSSファイルはsrcフォルダ内に入っています。demoフォルダではどのような画面を実装できるか確認するためのファイル一式が入っていました。

デモ画面として用意されているファイルは以下のとおりです。

- index.html
- horizontal-submenus.html
- vertical-submenus.html
- photos.html
- positions.html
- colors.html
- advanced.html
- onepage.html

このファイルの他にもjQueryMobile用のデモページが用意されていました。

##index.html
このページからそれぞれのページにアクセスできます。
![2014-03-28_224002.png](https://qiita-image-store.s3.amazonaws.com/0/8407/3c993923-fb9c-6860-1b99-6462ab8f8ae7.png)

##horizontal-submenus.html
横スライドでサブメニューを表示できます。
![2014-03-28_224218.png](https://qiita-image-store.s3.amazonaws.com/0/8407/c6d4303e-2a7b-842f-2e14-abf6f7718f4c.png)

##vertical-submenus.html
縦方向にサブメニューを表示できます。
![2014-03-28_224350.png](https://qiita-image-store.s3.amazonaws.com/0/8407/fed986fb-f0a8-7e2e-d8fc-1fb51d3c3de0.png)

##photos.html
画像のリストを表示できます。
![2014-03-28_224501.png](https://qiita-image-store.s3.amazonaws.com/0/8407/d01a918e-44f6-6329-1eab-229b00b8c1d8.png)

こういう表示もできるみたいです。
![2014-03-28_224512.png](https://qiita-image-store.s3.amazonaws.com/0/8407/c9d70c30-590d-bd96-47df-775624b9f175.png)

##positions.html
メニューの位置や表示タイプの切替ができます。
![2014-03-28_224707.png](https://qiita-image-store.s3.amazonaws.com/0/8407/3f70a94a-57c7-f1c4-bc98-ab70cf9aae17.png)

##colors.html
メニューの色を変更できます。
![2014-03-28_224830.png](https://qiita-image-store.s3.amazonaws.com/0/8407/b53e70cb-f9d3-8089-fd83-da7f350e4e55.png)

##advanced.html
こんな機能のサンプルです。
![2014-03-28_224931.png](https://qiita-image-store.s3.amazonaws.com/0/8407/d374817c-5c7d-db47-4f2f-9859d740a165.png)

##onepage.html
同じページ内に移動するリンクのサンプルページです。
![2014-03-28_225106.png](https://qiita-image-store.s3.amazonaws.com/0/8407/93289cb7-cf23-d131-f15f-7f320cd7e693.png)

##jQueryMobile
jQueryMobile向けのページみたいです。
![2014-03-28_225211.png](https://qiita-image-store.s3.amazonaws.com/0/8407/9351a5e0-e68d-e7b8-cfab-fac0e367cbfd.png)


サンプルページはこんな感じでした。
すごく便利そうです。
zsh で path にディレクトリを追加するときは (N-/) を付けよう

## はじめに

.zshenv とかで path にディレクトリを追加するとき、こんなふうに普通に追加してる人がいると思う。

```zsh
# path の先頭に $HOME/bin を追加する(あんまり良くない例)
path=($HOME/bin $path)
```

これでも間違いというわけではないんだけど、追加するディレクトリが存在しない場合も path に追加されて、結果として無駄なディレクトリが含まれている状態になってしまう。あんまりうれしくない。

でも zsh にはちゃんとそれを防ぐ方法があって、ディレクトリ名の後ろに `(N-/)` を付ければうまく解決できる。

```zsh
# 良い例
path=($HOME/bin(N-/) $path)
```

これで `$HOME/bin` が存在しているときだけ path に追加する、という動作になる。

ディレクトリを複数同時に追加するときも同じように並べて書けば OK。

```zsh
path=($HOME/bin(N-/) /usr/local/bin(N-/) $path)
```

## 解説

なんにも考えずにコピペで使ってもいいんだけど、もうちょっと詳しく説明してみる。

この `(N-/)` はファイル名修飾子というやつで、ファイル名に条件つけて絞り込みができるようになる。この場合は `N`, `-`, `/` という3つの条件を指定してる。

まず `/` というのは「ディレクトリだけ」という意味で、ディレクトリが存在するときだけ `()` の左側の値に展開される。

```
# /tmp というディレクトリ、/etc/passwd という通常のファイルが存在するとする

# 存在するディレクトリ名は OK
% echo /tmp(/)
/tmp

# 存在しないディレクトリの場合はエラーになる
% echo /hoge(/)
zsh: no matches found: /hoge(/)

# ディレクトリじゃなくて通常ファイルの場合もエラーになる
% echo /etc/passwd(/)
zsh: no matches found: /etc/passwd(/)
```

で、`N` を付けるとマッチしない(ディレクトリが存在しない)時にエラーの代わりに黙って空文字列に展開されるようになる。

```
# ディレクトリが存在する場合は N 無しと同じ
% echo /tmp(N/)
/tmp

# ディレクトリが存在しない場合は空文字列
% echo /hoge(N/)
```

これを使うと $HOME/bin が存在しない状態で `path=($HOME/bin(N/) $path)` とした時に `$HOME/bin(N/)` の部分が空文字列になるので、結果として path には何も追加されない、という動作になる。

これでだいたい問題ないんだけど、`$HOME/bin` がシンボリックリンクだったときに困る。`$HOME/bin` がシンボリックリンクで存在するディレクトリを指している場合は本当は path に追加して欲しいんだけど、`(N/)` は「ディレクトリであった場合だけ展開する」という意味なので、空文字列になってしまう。

そういう時のために `-` っていうのがある。これを付けるとシンボリックリンクの実態を追いかけて条件をチェックするようになる。つまり、`(N-/)` は「ディレクトリが存在する、またはシンボリックリンクで存在するディレクトリを指している」という条件指定になる。

```
# $HOME/bin はシンボリックリンクで、$HOME/scripts というディレクトリを指しているとする
% ls -l $HOME
bin -> scripts
scripts/

# $HOME/bin はディレクトリではないので空文字列になる
% echo $HOME/bin(N/)

# - を付けるとシンボリックリンクの実態に対して条件をチェックする
% echo $HOME/bin(N-/)
/home/mollifier/bin
```

というわけで、結論として `(N-/)` を付けるとディレクトリが存在するときだけ path に追加する、という動作になる。

```zsh
path=($HOME/bin(N-/) $path)
```

こうやっておくと .zshrc をいろんな環境で使いまわす時に変なのが path に追加されなくて便利。path 以外でも fpath とか manpath とかディレクトリを追加する系の環境変数の場合は同じようにしたほうが良いと思う。

if 文とかでチェックしてもいいんだけど、こっちのほうが1行で済んでスマートだと思うのでぜひ試してみてください!

### 参考
* [man zshexpn の「FILENAME GENERATION」->「Glob Qualifiers」](http://zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Qualifiers)
* [zsh で find を使わずに簡単にファイルを絞り込む - Qiita](http://qiita.com/mollifier/items/1c4a4930a89aa75e5ced)
hello, world × 3

[「hello, world」 を 3つの言語で、できるだけ別々の文字で書いてください。](https://codeiq.jp/ace/nabetani_takenori/q766)というcodeiqの問題に挑戦しました。利用可能文字はASCII範囲内の基本的な文字です。応募した解答は[ここ](http://nabetani.hatenablog.com/entry/codeiq_hwx3_q766)にありますが、せっかくなので記載します。

###Ruby

```rb:hello.rb
$><<%?\150\145\154\154\157\054\040\167\157\162\154\144?
```

###bash

```bash:hello.sh
echo hello, world
```

###VB.net
Markdownだとtab文字をうまく扱えません。

```vbnet:hello.vb
MODULE	MODULEE
SUB	MAIN()
CONSOLE.WRITELINE("HELLO".TOLOWER()	&	CHR(83-39)	&	SPACE(LEN("L"))	&	"WORLD".TOLOWER())
END	SUB
END	MODULE
```

Basic, Fortranといった古い言語は大文字小文字を同一視するものが大多数です。[パンチカード](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%B3%E3%83%81%E3%82%AB%E3%83%BC%E3%83%89#IBM.E3.81.AE80.E6.AC.84.E3.82.AB.E3.83.BC.E3.83.89.E3.81.A8.E6.96.87.E5.AD.97.E3.82.B3.E3.83.BC.E3.83.89)の時代には大文字しか使えなかったことが理由かもしれません。
homesickとhomeshickの違い


## dotfilesとは
`.bashrc`だったり`.vimrc`だったり`.zshrc`だったり、Unixライクな環境で自分の使いやすいような設定が書かれている、人によっては消えたら茫然自失になるほど重要なファイル群です。ですよね？
消えちゃったら大変なので、GitHubやbitbucketで管理している方が多いと思います。でも、シンボリックリンク張ったり色々大変ですよね。

## homesickとは
そんなdotfilesの管理を代わりにしてくれるのがhomesickです。
[technicalpickles/homesick](https://github.com/technicalpickles/homesick)
[homesick を使って dotfiles を管理する！](http://qiita.com/s_tomoyuki/items/650ff995e6906bdecc17)

## homeshickとは
[andsens/homeshick](https://github.com/andsens/homeshick)
これも同じように、dotfilesの管理を代わりにイイ感じにしてくれるやつです。
**sick** じゃなくて **shick** です。何が違うのでしょう？

## 違いはrubyかbashか
homesickはrubyで実装されていますが、homeshickはすべてシェルスクリプトで書かれています。
homesickの[README](https://github.com/technicalpickles/homesick/blob/master/README.markdown)にも、
>## Need homesick without the ruby dependency?
>Check out [homeshick](https://github.com/andsens/homeshick).

と書かれています。(rubyに依存せずにhomesick使えないの？→homeshick使え)

## 機能面での優劣
ちょっと見た感じではなさそうでした。使い込んだり込み入ったことをしようとすると違いが出てくるのでしょうが、個人がdotfilesを管理する分には機能面での優劣はないように感じます。

## どっちがおすすめか
どっちも使ったことない(これから始めようとして調べ始めたら2つ出てきたからこんな記事書いてる)のでアレですけど、調べると記事が出てくるのはhomesickです。GitHubでのstarとwatchが多いのもこっちです。
一から始めようとする僕みたいなのはhomesickで、rubyとか入れてらんねぇよ軽いのくれって人はhomeshickがいいのかもしれません。
技術者向け Ethereumの基礎知識 (イーサリアム、エセリウム)

以下に移行しました<br><a href="http://block-chain.jp/tech/ethereum-basics-for-engineer/" title="技術者向け Ethereumの基礎知識 (イーサリアム、エセリウム)">技術者向け Ethereumの基礎知識 (イーサリアム、エセリウム)</a>
Cocos2d-x V3.0 rc0 で extensions 系の使用


`Scale9Sprite` 等、cocos2d/extensions 配下を使いたい場合に、Android のビルドではまったのでメモ。

こんな感じで使います。

```Hoge.cpp
#include "extensions/cocos-ext.h"

using namespace extension;

bool Hoge::init() {

    if (!Layer::init()) {
        return false;
    }

    Size visibleSize = Director::getInstance()->getVisibleSize();

    Scale9Sprite* hoge = Scale9Sprite::create("hoge.png");
    hoge->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));
    hoge->setContentSize(Size(200, 200));

    this->addChild(hoge, 1);

    return true;
}

```

Android でビルドする場合、`jni/Android.mk` を修正する必要があります。

LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static
と
$(call import-module,extensions)
を追加してください。


```Android.mk
--- a/proj.android/jni/Android.mk
+++ b/proj.android/jni/Android.mk
@@ -7,18 +7,25 @@ LOCAL_MODULE := cocos2dcpp_shared
 LOCAL_MODULE_FILENAME := libcocos2dcpp

 LOCAL_SRC_FILES := hellocpp/main.cpp \
(snip...)
../../Classes/AppDelegate.cpp

 LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes

 LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
 LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
 LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static
+LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static

 include $(BUILD_SHARED_LIBRARY)

 $(call import-module,2d)
 $(call import-module,audio/android)
 $(call import-module,Box2D)
+$(call import-module,extensions)
```
QNAP-112 で TimeMachine に繋がらない問題


(書き途中)

## すること

* Finderで ユーザ名 TimeMachine で接続テスト
* afp:// でユーザ名(TimeMachine)で繋いてみる
* TMBackup を TimeMachineでマウントしている状態になっていることを確認

で、ダメなら

* ssh でつないで rm -r /share/HDA_DATA/.timemachine (バックアップした方がいいかも)


## 手順

Finder から AFP (afp://192.168.x.x/) に接続して試してみる

```
1. Set up Time Machine according to the QNAP instructions
2. In Finder menu: Go > Connect To Server (or Command-K)
3. Type in your NAS's IP address (e.g. 192.168.1.xxx)
4. At the logon prompt, use "TimeMachine" and the password you set up in Step 1
5. Continue per the QNAP instructions to set up the backup in TimeMachine's preferences
```

上記でダメだったら、以下を試してみる。

* ssh で QNAP にログインして、以下を実行
* rm -r /share/HDA_DATA/.timemachine


```
1. Disable Time Machine backup from the NAS admin page
2. Access the NAS via SSH in Terminal i.e. ssh admin@your_NAS_IP
3. Delete the Time Machine files with the command: rm -r /share/HDA_DATA/.timemachine
4. Enable Time Machine backup again
5. Run a Time Machine backup from your Mac
```

from
[Time Machine problem with Qnap NAS: Apple Support Communities](https://discussions.apple.com/message/19078416#19078416 "Time Machine problem with Qnap NAS: Apple Support Communities")


## 注意

バックアップ・スピードがすごく遅い…
対策は、色々あり、明確にわからない。

[Time Machineバックアップを高速化しよう！ - Yahoo!知恵袋](http://note.chiebukuro.yahoo.co.jp/detail/n124512 "Time Machineバックアップを高速化しよう！ - Yahoo!知恵袋")

* ウィルスソフトをオフにする
* Spotlightをオフにする (10.7.5のバグは修正されたそう)

[10.7.5 で Time Machine が遅すぎる (解決 ?) - thyVikings : iMac, iPad, iMat by aged engine](http://thyvikings.cool.coocan.jp/wordpress/?p=14311 "10.7.5 で Time Machine が遅すぎる (解決 ?) - thyVikings : iMac, iPad, iMat by aged engine")


上記どちらでもないが、遅い…

そのままにしていたら、繋がっているからダメというエラーが何回も出て、そのまま放置していたら、突然バックアップを早い速度で始めて、ある程度いったらまた遅くなってバックアップができてない状態になったりしました。
何が原因で突然早くバックアップをはじめ、何が原因で突然遅くなるのかが全くわかりません…


## 日本語の公式ドキュメント

[QNAP Turbo NAS 取扱説明書](http://docs.qnap.com/nas/jp/index.html?time_machine.htm "QNAP Turbo NAS 取扱説明書")

## Community Wiki

[How to setup your QNAP NAS with Apple Time Machine - QNAPedia](http://wiki.qnap.com/wiki/How_to_setup_your_QNAP_NAS_with_Apple_Time_Machine "How to setup your QNAP NAS with Apple Time Machine - QNAPedia")
Cocos2d-x V3.0 rc0 で縦画面表示


##iOS
`Xcode` で `General - Deployment Info - DeviceOrientation` をいじりましょう。

Portrait にだけチェックを入れれば OK です。

```Info.plist
--- a/proj.ios_mac/ios/Info.plist
+++ b/proj.ios_mac/ios/Info.plist
@@ -61,10 +61,13 @@
        <array/>
        <key>UIPrerenderedIcon</key>
        <true/>
+       <key>UIStatusBarHidden</key>
+       <false/>
+       <key>UIStatusBarStyle</key>
+       <string>UIStatusBarStyleDefault</string>
        <key>UISupportedInterfaceOrientations</key>
        <array>
-               <string>UIInterfaceOrientationLandscapeRight</string>
-               <string>UIInterfaceOrientationLandscapeLeft</string>
+               <string>UIInterfaceOrientationPortrait</string>
        </array>
 </dict>
 </plist>
```

##Android
AndroidManifest.xml の android:screenOrientation を "portrait" に変更しましょう。

```AndroidManifest.xml
--- a/proj.android/AndroidManifest.xml
+++ b/proj.android/AndroidManifest.xml
@@ -13,7 +13,7 @@

         <activity android:name="org.cocos2dx.cpp.Cocos2dxActivity"
                   android:label="@string/app_name"
-                  android:screenOrientation="landscape"
+                  android:screenOrientation="portrait"
                   android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
                   android:configChanges="orientation">
```

これで縦表示になります。

![kobito.1396005427.975935.png](https://qiita-image-store.s3.amazonaws.com/0/25416/fa45c6bd-5209-378c-7a50-ab6a2948dc20.png "kobito.1396005427.975935.png")
emoji-vimを試した！

**追記**
Mac でアイコンが表示されない場合はコメント欄を参照して下さいませ。  （mattnさん、mapk0yさん、lingrのvim部屋のみなさんに感謝です。）

vimから絵文字を入力するプラグインを試してみました。 
[mattn/emoji-vim](https://github.com/mattn/emoji-vim)

試したのですが、
`:Emoji` をしても、、、どれも `X` 。。。

![emoji-vim-run.png](https://qiita-image-store.s3.amazonaws.com/0/26586/458817e7-4672-bac0-e48d-17169e3dcc92.png "emoji-vim-run.png")

`:sign list` の結果がこちら。

![sign-list.png](https://qiita-image-store.s3.amazonaws.com/0/26586/f78537ac-893d-6ea4-32a3-341b54cd1315.png "sign-list.png")

あるよ！pngあるよ！

![emoji-vim-png.png](https://qiita-image-store.s3.amazonaws.com/0/26586/ca59b35e-6e86-d396-a117-bba64a0bd1fb.png "emoji-vim-png.png")


どちらも同じ結果でした。

- Custom Version 7.4 (KaoriYa 20140107)
`/usr/local/Cellar/macvim-kaoriya/HEAD/MacVim.app`
- Custom Version 7.4 (72)
`/usr/local/Cellar/macvim/HEAD/MacVim.app`


なーんでだろー。

tweet.vimとかもicon表示されない。
dockerのコマンドで、Error: bad file descriptorが出て辛い気持ちになる

```
[error] client.go:2315 Error resize: Error: bad file descriptor
```

あるいは、`docker build`とかを実行するとこんな感じでノンゼロコードとか言われて進まない問題も直る。

```
2014/03/28 10:26:46 The command [/bin/sh -c yum -y install wget] returned a non-zero code: -1
```

なにやらcgroup周りでアレしてるらしいが、 HEAD では直っている模様。

https://github.com/dotcloud/docker/pull/4574

Go側の問題ではなく、サービスのinit scriptの問題のようなので、例えばUbuntuなら以下の感じで直る。

```bash
sudo wget -O /etc/init/docker.conf https://raw.github.com/dotcloud/docker/master/contrib/init/upstart/docker.conf
sudo service docker restart
```

以上よろしくお願いします。
docomo絵文字をスマホサイトで表示する②


[前回の投稿](http://hoge)に引きつづいて、スマホサイトでdocomo絵文字(ていうか今回はガラケー絵文字)の装飾を試してみたメモです。

![スクリーンショット 2014-03-28 19.34.20.png](https://qiita-image-store.s3.amazonaws.com/0/35733/a8425a40-d00a-8973-5892-36ca43013ff2.png "スクリーンショット 2014-03-28 19.34.20.png")

こんな感じ `<span class="emoji sun"></span>` の記述でガラケー絵文字をスマホサイト(for iOS/Android)へ表示します。

- HTMLファイルは UTF-8 形式を想定しています。
- 最終的には今回も画像(CSSスプライト)で表示でします。

# デモ

こちらをご覧ください。

- http://hkusu.github.io/emojisprite_demo/

# 利用するライブラリ

この「emoji-splite」というJavaScriptライブラリを使います。

- https://github.com/matsubo/emoji-sprite/wiki

# 導入手順メモ

## 手順

- このライブラリを取得
	- https://github.com/matsubo/emoji-sprite

```
$ git clone git://github.com/matsubo/emoji-sprite.git
```

- index.html で CSSファイル をインクルード

```html:index.html
<link rel="stylesheet" href="emoji-sprite/lib/emoji-sprite/emoji.css">
```

- HTMLへの記載

```html:index.html
これは<span class="emoji sun"></span>晴れマークです。<br>
これは<span class="emoji cloud"></span>曇りマークです。
```

## 結果

ブラウザで表示するとこんな感じ。

![スクリーンショット 2014-03-28 18.24.58.png](https://qiita-image-store.s3.amazonaws.com/0/35733/583d9a6f-b8a6-a7b4-6c3e-14e545db24e2.png "スクリーンショット 2014-03-28 18.24.58.png")

デモのソースはこちらに置いておきます。

- https://github.com/hkusu/emojisprite_demo
	- `index.html`を見てください。

# ほか

- 参考にした記事はこちら
	- [1時間で携帯サイトをスマートフォン対応にする方法](http://labs.gree.jp/blog/2011/04/3282/)
- 絵文字の画像は、シックス・アパートさんが公開しています。
	- http://www.sixapart.jp/about/emoji.html
	- 利用する際はライセンスに従ってください。
transformにmatrixかけた要素のクリック座標取得

============================

```
// 
var x = e.offsetX, y = e.offsetY;
if ( 'offsetX' in e !== true ) {
    x = e.layerX - e.currentTarget.offsetLeft;
    y = e.layerY - e.currentTarget.offsetTop;
    if( this.style.transform!=="" ) {
        var p = { x: x, y: y };
        var val = this.style.transform;
        var matrix = [];
        val.split(",").forEach(function(value){ matrix.push( parseFloat(value) ); });
        x = p.x*matrix[0] + p.y*matrix[2] + 1*matrix[4];
        y = p.x*matrix[1] + p.y*matrix[3] + 1*matrix[5];
    }
}
console.log( x, y );

```
Clojureでzip関数を作ってみる

* テスト投稿～

Clojureでzipmap関数はあるのにzipseq関数がないので作ってみた。
といっても簡単

```zipseq1.clj
(defn zipseq [& colls] (partition (count colls) (apply interleave colls)))
```

#### 実行結果

```
(zipseq [1 2 3] [:a :b :c]) ; => ((1 :a) (2 :b) (3 :c))
(zipseq [1 2] [:a :b] [:c :d]) ; => ((1 :a :c) (2 :b :d))
```


これだと引数が1つの時に例外発生するので、1引数にも対応してみる。（1引数にも対応すると転置行列を作るときに使えるかなあと）

```zipseq2.clj
(defn zipseq
  ([coll] (partition 1 coll))
  ([c1 & colls] (let [c (cons c1 colls)] (partition (count c) (apply interleave c)))))
```

#### 実行結果

```
(zipseq [1 2 3]) ; => ((1) (2) (3))
```

できた～♪
fdiskでDisk容量を拡張する

## はじめに
- vpsとかでディスク容量を増やした場合
- たまにしかやらないので忘れる
- でも、やるときミスると困るのでメモっておく
- LVMは使わない
- 気をつけないとデータ全部消えます
- なので、作業は各自の責任でおねがいします

## なにをするのか
- ディスク容量が足りなくなった！
- よし、新しいディスクを追加しよう
- そうしたら、パーティショニングしなきゃ

## 環境
- Debian7 3.2.54-2 x86_64 GNU/Linux
- df (GNU coreutils) 8.13
- fdisk (util-linux 2.20.1)

## どうするのか
### 1. 現状を確認
- diskを確認

```bash:df
// 拡張したいディレクトリがmountされているdiskを確認する
$ df -h
```
- diskのパーティションを確認

```bash:fdisk
// 仮想ディスクならデバイス名はvda
// 仮想環境じゃなければsdaとか
$ fdisk -l /dev/vda
```

### 2. rescue modeで起動
- とにかくパーティショニングを行うディスク以外でshellを実行したい

1. Debian7のインストール用CDなどから「Advanced Options」を選択
2. 続いて「Rescue mode」を選択
3. 日本語とかいろいろ選択して、「レスキューモードに移行」で「ルートファイルシステムとして使用しない」を選択
4. 「インストーラ環境内でシェルを実行」を選択すると、シェルが起動


### 3. パーティションの削除と作成
- 現状の拡張したいパーティションの開始シリンダ番号以降を使っているパーティションを削除

```bash:fdisk
$ fdisk /dev/vda

// 現在の状況を表示
// ここで表示されるstart, end, blocksなどをメモっておく
> p

// パーティションを削除
// 拡張したいパーティションとそれよりも後のシリンダを使っているパーティションを削除
// 以下、例
// パーティション2を削除（外側から）
> d
> 2
// パーティション1を削除
> d
> 1
```
- で、拡張したパーティションとその他いろいろ必要なパーティションを作成

```bash:fdisk
// 拡張したパーティションを作成
// パーティションの開始位置（start）は削除前と同じにする
// 間違えるとヤバイ
// 以下、例
> n
> p
> 1
> [この後start, endなどを入力]

// その他のパーティションを作成
// 上で作ったパーティションに続いてstartを指定する
> n
> p
> 2
> [この後start, endなどを入力]

// パーティションをswapに変更
> t
> 2
> 82
```
- 各自、必要なパーティションを作ってください
- パーティションを書き込み

```bash:fdisk
// 書き込み前に確認
> p
// 実際にパーティションが反映されます
> w
```

### 4. ファイルシステムの拡張
- 実際にファイルシステムが拡張されるのはresize2fsをしてから

```bash:e2fsck
// Linux ext2/ext3 ファイルシステムのチェックを行う
$ e2fsck -f /dev/sda2
```

```bash:resize2fs
// ファイルシステムの拡大・縮小を行う
$ resize2fs /dev/sda2
```

### 5. 再起動
- インストールCDを取り出す
- rebootを実行する

### 6. 確認
- ファイルシステムが拡張されていることを確認

```bash:df
// 拡張したいディスクのにマウントされているディレクトリの容量が増えていることを確認
$ df -h
```
- diskのパーティションを確認

```bash:fdisk
// パーティションが変更されていることを確認
$ fdisk -l /dev/vda
```


## 参考
- [ext3容量拡張](http://qiita.com/amidaku/items/febad4fad1eb91990cb6)
- [resize2fsでディスク容量を拡張する](http://knowledge.sakura.ad.jp/tech/925/)
- [Linux におけるデバイス名](http://www.debian.org/releases/wheezy/i386/apcs04.html.ja)
- [【 fdisk 】 ハード・ディスクのパーティションを設定する](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230775/)
スマホアプリをjsで開発するHerlock HTML5版

=========================

描画はWebGL。最新のブラウザならどれでも多分動きます。

開発中ですが、ちょっと晒してみます。
アレなサンプルですみません。

[FlappyBirdのパクリ](http://bobbysmv.github.io/Herlock.js-for-Web/?url=http://bobbysmv.github.io/games/sample/main.js)

[jsdo.it: Herlock.js Webテスト](http://jsdo.it/bobby/kGcv)


[Herlock](https://herlock.do)?
----------
iPhone,Androidアプリをjavascriptワンソースで作るための技術,サービスです。


API Reference & Guides
--------
[HerlockJS Documentation](http://doc.herlock.do/js/ja/)

※この内描画系はひと通り動きます