OmniAICreator/Qiita-1.07M huggingface dataset:
MongoDBのEmbedded DocumentsにUnique制限をかけたい


```
[
  {
    "name": "hoge",
    "users": [
      { "email": "..." },
      { "email": "..." },
    ]
  },
  ...
}
```

こういうデータのCollectionがあったとして、`users.email`をユニークにしたいんだけど、MongoDBのUnique Indexはドキュメント毎にユニークかどうかを保証するものなようで、同一ドキュメント内で同じデータがあっても通ってしまう。

つまり`users.email`にUnique Indexを張った場合、これは通らないけど

```
[
  {
    "name": "hoge",
    "users": [
      { "email": "foo@example.com" }
    ]
  },
  {
    "name": "fuga",
    "users": [
      { "email": "foo@example.com" } // 重複エラーになる
    ]
  }
]
```

これは通るということ。

```
{
  "name": "hoge",
  "users": [
    { "email": "foo@example.com" },
    { "email": "foo@example.com" } // 同一ドキュメント内なのでOK！
  ]
}
```

アプリケーション側でなんとかするか、Collectionを分けるしかないんだろうか。umm...
EC2のインスタンスが立ち上がってきた時にEphemeral Diskを束ねてRAID0にするスクリプト

[EC2のインスタンスが立ち上がってきた時にEphemeral Diskを束ねてRAID0にするスクリプト - さよならインターネット](http://blog.kenjiskywalker.org/blog/2014/02/24/ec2-start-raid0-script/)

Ephemeral Diskが8本ある場合は条件を増やせば良い。  

```bash
#!/bin/bash

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/usr/local/bin

if [[ \`test -e /dev/xvdc ; echo \$?\` -eq 0 ]] ; then
    if [[ \`test -e /dev/xvde ; echo \$?\` -eq 0 ]] ; then

        # RAID用のファイルをつくる(ephemeral x4バージョン)
        umount /media/ephemeral0
        yes | mdadm --create /dev/md127 --level=0 --raid-devices=4 /dev/xvd[bcde]
        mkfs.ext4 /dev/md127
        mount /dev/md127 /media/ephemeral0
    else

        # RAID用のファイルをつくる(ephemeral x2バージョン)
        umount /media/ephemeral0
        yes | mdadm --create /dev/md127 --level=0 --raid-devices=2 /dev/xvd[bc]
        mkfs.ext4 /dev/md127
        mount /dev/md127 /media/ephemeral0
    fi
fi
```

このスクリプトを`rc.local`とか`/etc/rc3.d/S~`とかに置いておけば  
起動時にRAID0として束ねて立ち上がってくれる。  
  
> このクールなアイデアは自分発のものではない
MacにてSassを試して見る


下記を参考にRubyをインストール
http://qiita.com/checkpoint/items/f8e65380d9cb0182218d


```
gem update --system
gem update bundler
```

sassのインストール

```
gem install sass
```

確認

```
gem list | grep sass
```

```
sass (3.2.14)
```

コンパイル

```
rbenv exec sass foo.scss bar.css
```

ファイルを監視してコンパイル

```
rbenv exec sass for.scss:bar.css
```


フォルダを指定してコンパイル

```
rbenv exec sass sass_dir/:css_dir/
```

GUIツール

 * http://koala-app.com/
 * http://mhs.github.io/scout-app/
 * http://alphapixels.com/prepros/
YouTubeの動画をYouTubeアプリで直接再生するIntentの書き方


##概要
アプリからYoutubeの動画へ遷移する時のメモ。
単純にIntent#setData()にパースした動画のURLを代入してもうまく動かなかったりする。

###動画を直接表示
```java:sample.java
String videoId = "<VIDEO_ID>";
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("vnd.youtube:" + videoId);
intent.putExtra("VIDEO_ID", videoId);
startActivity(intent);
```


###プレイリストを表示
```java:sample.java
String playListUrl = "<PLAY_LIST_URL>";
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setPackage("com.google.android.youtube");
intent.setData(Uri.parse(playListUrl));
startActivity(intent);
```
How to install ruby without documentations

ruby をインストールするとき、ドキュメントは要らないや…。ということがしばしばあります。例えばサーバや仮想環境へインストールするときとか、rdoc って使いづらいとか…。で、ドキュメントって結構ファイル・システムを消費するし、インストールにも時間かかるし。そういうときのハナシです。

# コンパイル時

`--disable-install-doc` オプションを使います。
`./configure help` によれば「do not install neither rdoc indexes nor C API documents during install」 とのことです。

```shell-session
./configure --disable-install-doc
```

# gem

ホームディレクトリに `.gemrc` というファイルを作り、その中身を以下のようにします。

```
gem: --no-document
gem: --no-ri --no-rdoc
```

`~root` にも同様なファイルを作っておいたほうが良い場合もあると思います。例えばサーバへインストールするときとか。
WebKit系ブラウザでvideoタグにpreload="none"をつけるとwindow.loadの発火がとても遅くなる

パフォーマンスの検証をしていたとき気づきました。

VideoタグをHTMLに書くとブラウザが自動的に動画をプリロードしますが、毎回再生されることのない動画等では回線の負荷となるので、preload属性にnoneを指定することでやめさせることができます。

```html
<video preload="none" src="//example.com/hoge.mp4" />
```

しかし、WebKit系ブラウザではwindow.onloadの発火が遅くなる不具合があるようです。

こちらが、preload="none"のDevTools Networkパネル。
青い縦線がDOMContentLoadedが発火したタイミングで、赤い縦線がLoadが発火したタイミングです。

![ScreenShot 2014-02-24 16.20.21.png](https://qiita-image-store.s3.amazonaws.com/0/17664/01531bfd-c8d9-3eb0-5769-7602ade3803c.png "ScreenShot 2014-02-24 16.20.21.png")


リソースの読み込みが全て完了してから、謎の空白があります。
Windows, Mac版両方のGoogle Chromeで再現しました。

この問題について調べるとIssueが上がっていましたが、今のところ解決策はないようです。
[Issue 284413 - chromium -  Video tag with preload=&quot;none&quot; delays window &quot;load&quot; event](https://code.google.com/p/chromium/issues/detail?id=284413)

対策として、preload属性をmetadataにします。

こうすると、動画のメタデータ部分のみをロードします。

```html
<video preload="metadata" src="//example.com/hoge.mp4" />
```

![ScreenShot 2014-02-24 16.19.46.png](https://qiita-image-store.s3.amazonaws.com/0/17664/f504598b-dc11-e704-2026-7ab81ace4d4f.png "ScreenShot 2014-02-24 16.19.46.png")


正しく最短でLoadイベントが発火するようになりました。（3秒近く早くなってますね）

最近はjQuery等で ```$(function(){  });``` と書いて、DOMContentLoadedのタイミングで処理を実行するようになっています。
しかし、ブラウザのページ読み込み中インジケータは回り続けるので読み込みが遅く感じてしまうでしょう。

良かれと思って書いたpreload="none"で、余計遅くなってしまうことがあるという事例だったのでご紹介してみました。
ソーシャル投稿ボタンのクリックのcallbackをJS から知る方法


<h2>ソーシャルボタンの種類とドキュメント</h2>

|公式ドキュメント|URL|
|:-----------|------------:||
|twitter|https://dev.twitter.com/docs/intents/events#tweet|
|Facebook|https://developers.facebook.com/docs/reference/javascript/FB.Event.subscribe|
|Google+|https://developers.google.com/+/web/+1button/#plusonetag-parameter|

Google+
スニペットgoogle (+https://developers.google.com/+/web/snippet/)というテキストを含むユーザー エージェントのリクエストが表示されます

<h2>html</h2>

Google+ の場合、callbackを呼ぶためにタグにdata-callback="gplus"　を追加しています。
<pre class="lang:xhtml decode:true">&lt;!-- twitter --&gt;
&lt;a href="https://twitter.com/share" class="twitter-share-button" data-lang="ja"&gt;ツイート&lt;/a&gt;
&lt;!-- //twitter --&gt;

&lt;!-- Facebook --&gt;
&lt;div id="fb-root"&gt;&lt;/div&gt;
&lt;div class="fb-like" data-href="{サイトのURL}" data-layout="button_count" data-action="like" data-show-faces="false" data-share="false"&gt;&lt;/div&gt;
&lt;!-- Facebook --&gt;

&lt;!-- Google+ --&gt;
&lt;div class="g-plusone" data-size="medium" data-annotation="none" data-callback="gplus"&gt;&lt;/div&gt;
&lt;!-- //Google+ --&gt;</pre>

<h2>JS</h2>
<h3>投稿コールバック拾うための実装</h3>

<pre class="lang:js decode:true">  // twitter 
  window.twttr = (function (d,s,id) {
  var t, js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return; js=d.createElement(s); js.id=id;
  js.src="//platform.twitter.com/widgets.js"; fjs.parentNode.insertBefore(js, fjs);
  return window.twttr || (t = { _e: [], ready: function(f){ t._e.push(f) } });
  }(document, "script", "twitter-wjs"))

  // twitter callback
  twttr.ready(function (twttr) {
    twttr.events.bind('tweet', function(event) {
      // 何か書く
    });
  });

  // facebook
  (function(d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/ja_JP/all.js#xfbml=1";
    fjs.parentNode.insertBefore(js, fjs);
  }(document, 'script', 'facebook-jssdk'));

  // facebook callback
  window.fbAsyncInit = function() {
    FB.Event.subscribe('edge.create', function(response) {
      // 何か書く
    });
  };

  // googleplus
  window.___gcfg = {lang: 'ja'};
  (function() {
  var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
  po.src = 'https://apis.google.com/js/platform.js';
  var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
  })();

  // googleplus callback
  window.gplus = function (data) {
    // 解除された時もcallback呼ばれるので
    if (data['state'] == 'on') {
        // 何か書く
    }
  }</pre>
<h2>Google Analytics で trackingする方法</h2>
<a title="gaTrackingSocial" href="https://developers.google.com/analytics/devguides/collection/gajs/gaTrackingSocial">gaTrackingSocial</a>

&nbsp;
<h2>Facebookクローラー</h2>
Facebook向けにいい感じにサムネイルされるようにするには、

各ページのHTMLでOGP用のmetaタグで適用される画像や文言を指定します。

<a href="http://ogp.me" title="OGPの公式サイト"></a>

Facebookクローラーのユーザエージェント
 
<pre class="lang:default decode:true ">facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)</pre>
Python: クラスインスタンス用のシリアライザを用意する:


    # jose.py

    class BaseObjectSerializer(json.JSONEncoder):
    
        def default(self, obj):
            if isinstance(obj, Enum):
                return obj.value

            #:...... その他のオブジェクト判定

            if isinstance(obj, object):
                #: フィールドをdict化し、
                #: アンダースコアで始まるフィールドを無視する
                return dict([(k, v) for k, v in obj.__dict__.items()
                             if not k.startswith('_')])
    
            return super(BaseObjectSerializer, self).default(obj)

    
to_json() メソッドでエンコーダクラスを指定して json.dumps する:
    
    # jose.py 

    class BaseObject(object):
        _serializer = BaseObjectSerializer    
    
        def to_json(self, *args, **kwargs):
            kwargs['cls'] = self._serializer    #: Custom Serializer
            return json.dumps(self, *args, **kwargs)
    

足し算の結果のみをシリアライズし、途中のホルダーはシリアライズしない。:
    
    from jose import BaseObject
    
    
    class Message(BaseObject):
    
        def __init__(self, *args, **kwargs):
            super(Message, self).__init__(*args, **kwargs)
            self.total = 0 
            self._x =0
            self._y =0
    
        def sum(self, x, y): 
            self._x = x 
            self._y = y 
            self.total = self._x + self._y
    
    
    m = Message()
    m.sum(3, 4)
    assert m.total == 7
    assert m.to_json() == '{"total": 7}'
    assert m._x == 3
    
    m2 = Message()
    assert m2._x == 0
GITのコマンドメモ

##ブランチを跨いだファイルの差分
> git diff branch1:file branch2:file

##Gitログから変更ファイル一覧
> git log --stat --oneline


## リポジトリの情報を取得する
> git fetch

## 変更ファイルをワーキングツリーに追加
> git add

## Addしたファイルをコミット
##### コメント付き
> git commit -m

##### 前回コミットに追加
> git commit --amend

## 変更したファイルを一時保持
> git stash

##### リスト表示
> git stash list

## 変更をリセット
> git checkout <filename>

##### カレントディレクトリ以下
> git checkout -- .

##### コンフリクトでカレントブランチを優先 (======以前)を優先
> git checkout --ours

##### コンフリクトでマージブランチを優先 (======以下)を優先
> git checkout --theirs

##### \<remote-name>/\<branch-name>でローカルブランチを上書き
> git reset --hard \<remote-name>/\<branch-name>

オプション

> ショートオプション	ロングオプション	説明
> <filepattern>…	                追加するファイル名を指定します。
> -n	                –dry-run	追加されるファイル名を表示します。実際には追加されません。
> -f	                –force	        無視ファイル(.gitignore)を無視して追加します。
> -u	                –update	        既にGit管理下にあるファイルの内、変更点のあるものだけをステージします。
> -A	                –all	-uの挙動に加え、.gitignore で無視されていないファイルをステージします。
> -N	                –intent-to-add	後にステージされる事を記録します。git diff を使った場合、差分表示が行えます。
> –(ハイフン2つ)	                        オプションとファイルを明示的に切り分けます。例えば「-n」という名前のファイルをステージする場合に利用します。
[chef] 特定のsqlを一度だけ実行する方法 [template]

chef が便利すぎて泣けてきてる今日この頃なところで、「アレはどうするんだろう」「コレはどうやって実現するんだろう」
→ 公開されているレシピ使えよ( ﾟдﾟ )ｸﾜｯ!!

という軟弱な思考に頼らず、自ら作ったレシピでどうこうしたい同輩は多いかと思われます。
皆さんの役に立つようにというよりも、もはや自分の備忘録としか思えないような話ではありますが、chef で特定の chefを「一度だけ」実行できるようにするには、どう組み合わせたら良いかなーについて、一時的に結論が出たので、ご紹介します。

後でご説明しますが、この方法にも難があるので、他に良い方法があれば教えてください。

#templateを使ってみよう
sqlを記述した中間ファイルを使って、変更が発生した場合の再実行、一度実行された後の再実行の抑制ができそうです。

今回は `PostgreSQL` で、ユーザのパスワードを変更する SQLで試してみます。

##templateを準備する
まず、template ファイルを準備しましょう。

```ruby:site-cookbooks/pgsql/templates/default/pg_chpasswd.sql.erb
ALTER USER <%= @pg_user %> WITH PASSWORD '<%= @pg_password %>';
```

一旦こんな感じで。好みに応じて、`Encrypted` などつけてたもうれ。

##recipeを準備する
次に、これにあわせて `recipe` を書いてみましょう。

まず、sql を実行するための `execute` パートを作りましょう

```ruby:site-cookbooks/pgsql/recipes/default.rb
execute "pgsql-chpasswd" do
  command "su - postgres -c '/usr/bin/psql -U postgres < /tmp/pg_chpasswd.sql'"
  action  :nothing
end
```

command は `root` で実行されるはずですが、`PostgreSQL` の socket 接続の場合、デフォルトでは `Peer` 接続になっているため、Linux のユーザと、PostgreSQLのユーザが同一でないと、socket通信できないようになっています。
`pg_hba.conf` を適当に変更すれば良いのですが、`su - postgres` すれば特に問題がないので、そのままで実行できるようなコマンドを準備しました。
ここでのポイントは `action :nothing` として、まだじっこうさせないことですね(　´∀｀)bｸﾞｯ!

```ruby:site-cookbooks/pgsql/recipes/default.rb
template "pg_chpasswd.sql" do
  path "/tmp/pg_chpasswd.sql"
  source "pg_chpasswd.sql.erb"
  user  "postgres"
  group "postgres"
  mode  0600
  variables ({
    :pg_user => node[:postgresql][:user],
    :pg_password => node[:postgresql][:password]
 })

  notifies :run, 'execute[pgsql-chpasswd]', :immediately
end
```

次に、`template` のパートです。
ここでは、`/tmp/` に中間ファイルを配置するようにしてます。=> `path "/tmp/pg_chpasswd.sql"`
今回は `PostgreSQL` で利用するので、user(owner)/group は `postgres` を使っています。
`variables` に、今回使用する `pg_user` と `pg_password` の元ネタを配備しています。

最後に `notifies` で `execute` させるという流れです。
対応した template との差異がなければ、実行されないということになりますね。

##attributeどうしよう
対象となる変数をどうするかですが、初期値は `attributes` へ、このの定義は `role` や `node` を使います。

今回は `attribute` と `node` で定義しています。

```ruby:site-cookbooks/pgsql/attributes/default.rb 
default['postgresql']['user'] = ""
default['postgresql']['password'] = ""
```

```ruby:nodes/pgsql.json
{
        "postgresql": {
                "user"                : "zabbix",
                "password"            : "zabbix"
        },

        "run_list":[
						:
        ]
}
```

見ただけで分かるように、`user` = "zabbix" , `password` = "password" という素人定義です。

これにより、sql の中間ファイルの更新状態を見て、chef 側では、一度だけ実行される、と言うことになります。

めでたいヽ(´ー｀)ノ

#課題がないわけじゃない
個人的には、もうコレで十分なのですが、2つほど気がついた点があります。時と場合によっては、致命的です。

1. /tmp/ 配下のファイルが消されたら、また実行される
1. 中間ファイルに残っている情報は見られるかも知れない

##1./tmp/ 配下のファイルが消されたら、また実行される
まんまですね。
とある rebootタイミングや cronなどで、/tmp/ 配下は clearされるように設定されていた場合、中間ファイルが削除されます。
その後に、同じレシピを実行した場合、やらなくても良い SQLが流れることになります。

##2.中間ファイルに残っている情報は見られるかも知れない
今回特にそうですが、めっちゃ password が入ってバレます。
md5sum したものを入れておけば良いじゃんみたいなのはありますが、時と場合によっては SQL文すら見られたくないと言うときなどもあるかと思われます。

そんな時、いくらアクセス制御をしたところで、どうにもならない場合もあるかも知れません。ないかも知れませんが。

少なくとも、脅威が1つ増えることによって、リスクと対策は増えると言うことです。気をつけましょう。

#応用編
すでに想像ついてる方がほとんどでしょうか、中間ファイルを実行させるようにすれば、コマンドを実行するようにもできるでしょう。

また、消されることをうまく使って、何度も実行することもできるかも知れません。元々の使い方ではないでしょうが('A`)

ま、`template` にはこんな使い方もあるんよ( ﾟдﾟ )ｸﾜｯ!!
て感じで、どうぞ。
JSでブラウザを全画面表示（フルスクリーン）に切り替える

```js
// フルスクリーンに切替
$('.fullscreen').on('touchstart', function(){
	if(document.body.webkitRequestFullScreen) {
		document.body.onwebkitfullscreenchange = function(e) {
			document.body.style.width = window.innerWidth + 'px';
			document.body.style.height = window.innerHeight + 'px';
			document.body.onwebkitfullscreenchange = function() {};
		}
		document.body.webkitRequestFullScreen();
	}
});
```
第19回オフラインリアルタイムどう書くの参考問題をRubyで解く

問題は
http://nabetani.sakura.ne.jp/hena/ord19sanwa/

```rb
def solve(q)
  nums = q.split(',').map(&:to_i)
  max_num = nums.max
  sums = []
  (1..max_num).each {|x|
    (x..max_num).each {|y|
      (y..max_num).each {|z|
        sum = [x,y,z,x*2,y*2,z*2,x*3,y*3,z*3]
        [x,y,z].combination(2){|a,b|
          sum << a + b
        }
        [x,x,y,y,z,z].combination(3){|a,b,c|
          sum << a + b + c
        }
        if ((nums & sum) == nums)
            sums << [x,y,z]
        end
      }
    }
  }
  case sums.size
  when 0
    'none'
  when 1
    sums[0].join(',')
  else
    'many'
  end
end

puts Time.now
DATA.readlines.each do |line|
  no,q,a = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans
  puts ans == a ? ' o' : ' x'
end
puts Time.now

__END__
0	3,11,12,102,111,120	1,10,100
1	10,20,30,35,70	many
2	1,5,20,80	none
3	1,2,3,4,5,6,7,8,9,10,11,12,13,14	many
4	1,2,3,4,5,6,7,8,9,10,11,12,13,14,15	1,4,5
```
UISegmentedControlをテキストだけにカスタマイズ

初投稿です。メモ書きとしてちょくちょく残していこうと思います。
ボタンを2個並べてトグルで切り替えるためにUISegmentedControlをカスタマイズして使用しました。
直感的に修正内容がわかりづらかったので誰かのお役に立てればと。

#### カスタマイズ内容

* ボーダーの消去
* selected, highlight時の背景色を透明化
* ラベルのフォントカラーの変更

#### Storyboard上ではこんなデザインが

![storyboard上でのレイアウト](https://www.evernote.com/shard/s5/sh/c09b9041-8151-43c6-8e91-c0ed65a96ff2/854e885c2074acea56dcacefe0f43c7c/res/adffd9d2-5544-4a2d-9131-08bb0c391992/skitch.png)

#### こうなります

![segment0選択時](https://www.evernote.com/shard/s5/sh/cb7fff72-e33e-4520-bc9f-803e97f5152b/4f15ba8dd4cde87a10b2cdda59564659/res/1c06e9bf-e1e6-46ad-b93a-15cbcb9aea34/skitch.png?resizeSmall&width=832)
![segment1選択時](https://www.evernote.com/shard/s5/sh/bd8d11b7-d6f6-4741-864d-355eadbd045e/93ddd4388f59e23f03ddbe47daa732fb/res/db5e9895-6487-4fea-bff4-54df6bbe3ce4/skitch.png)


```objective-c
    NSDictionary *attributes = @{UITextAttributeFont: [UIFont systemFontOfSize:15], UITextAttributeTextColor: [UIColor grayColor]};
    [self setTitleTextAttributes:attributes forState:UIControlStateNormal];

    NSDictionary *onAttributes = @{UITextAttributeTextColor: [UIColor whiteColor]};
    [self setTitleTextAttributes:onAttributes forState:UIControlStateHighlighted];
    [self setTitleTextAttributes:onAttributes forState:UIControlStateSelected];
    self.tintColor = [UIColor clearColor];
```

UIButtonを二つ並べても同じことができますが、トグル切り替えの実装の手間がかかるので
こういう使い方もできるということで。
mRDT (8.5) を公式配布の Eclipse (Luna) で使う


Eclipse 上での mruby 開発を支援する mRDT for PizzaFactory (旧称 PizzaFactory for mruby． 以下，mRDT と略記)が提供するフィーチャー/プラグインは，Eclipse.org から提供されている Eclipse にインストールして使用することもできます．

本稿では，ホスト環境で動作する mruby/mirb/mrbc がビルドされるまでのツールインストールの方法を説明します．

# 想定読者層

本稿は，下記のような読者を想定しています．

* Eclipse そのものに関する基本的な知識は有している
* mruby は名前くらいは聞いたことがある
* 手持ちの開発機に gcc と bison のインストールはしてある

# 動作確認環境

本稿では，OSX 10.10.1 を用いました．
Eclipse は eclipse-cpp-luna-SR1-macosx-cocoa-x86_64.tar.gz を使いました．

現在のところ，PizzaFactory が提供するGNUツールチェインは使えません．よって gcc や bison の別途インストールが必要です．

OSX の場合は，XCode をインストールすることで解決できます．

mRDT によるビルドでは， __Rubyのインストールは不要__ です．
一般的な mruby のビルド環境では，minirake を実行するための Ruby 処理系が必要になります．
しかし，mRDT では，minirake の処理を JRuby が行います．
なお，既に Ruby がインストールしてあっても，競合はしません．

## 他環境での動作可能性

mRDT には動作OSに依存するコードは含まれていません．
よって，古いバージョンの OSX でも，Windows や Linux など他環境であっても，gcc と bison が入っていて，Eclipse Luna SR1 が動作する環境であれば，使用することはできるはずです．(しかし，未確認です．追って検証予定です)

日本では人気のある Pleiades All in one でも，Eclipseのベースバージョンが合致していれば動作する可能性は高いですが，未確認です．(mRDTチームでの検証予定はありません．人柱な方々からの情報を期待します．)

### 他環境での gcc/bisonインストール

Linux の場合は yum や apt-get などで提供されるはずです．

Windows の場合は，MinGW や Cygwin の使用をお勧めします．
VisualStudio でも対応可能かもしれませんが，未確認です．

# Eclipse本体のインストール

Eclipse.org へ行き，Luna SR1 をダウンロードしインストールします．

パッケージは Eclipse IDE for C/C++ Developers を選択します．他のパッケージでも構いませんが，その場合は CDT の別途インストールが必要です．

# mRDT のインストール

mRDT は，PizzaFactory プロジェクトが提供しているリポジトリサイトから，インストールします．

まず，Eclipse を立ち上げます．

## アップデートサイトの登録
メニューから，[Help] - [Install New Software ...] を選択します．


![Install New Software ... の選択](https://qiita-image-store.s3.amazonaws.com/0/5414/f2fa847c-f344-ae68-9040-767d0e994930.png "Install New Software ... の選択")

新しいフィーチャーをインストールするためのダイアログが表示されます．

```Work with:``` の横のテキストボックスに ```http://update.pizzafactory.jp/mruby/8.5/``` と入力しリターンキーを押します．

しばらくすると，ダイアログ中央に ```mRDT for PizzaFactory``` と ```mRDT Source templates``` というチェックボックス付きツリーが表示されます．

この2つをチェックして[Next]ボタンを押します．

## ダウンロードとインストール

このあとは，通常の Eclipse のアップデートと同一です．
いくつかの留意事項を挙げますが，逐次の手順は割愛します．

### Security Warning について

途中で，Eclipseがセキュリティに関する警告を出すかもしれません．
これは，mRDT のプラグイン/フィーチャーが無署名であることを知らせるものです．

![Security Warningダイアログ](https://qiita-image-store.s3.amazonaws.com/0/5414/3e91a290-4176-3f03-9cf0-c8dc4317f98a.png "Security Warningダイアログ")

mRDT の開発チームを信じられない場合には，[Cancel] ボタンを押してインストールを止め，[合同会社もなみ屋](http://www.monami-ya.jp/) へ署名付きパッケージの購入方法についてお問い合わせください．:-)
信じられる方は，[OK] ボタンを押してインストールを継続してください．

## Eclipse の再起動について

フィーチャーのインストールが完了すると，再起動を促すダイアログが表示されます．

![再起動を促すダイアログ](https://qiita-image-store.s3.amazonaws.com/0/5414/435a1813-02bb-9438-e775-35b8e2a18346.png "再起動を促すダイアログ")

ここで[Restart Now]を選んでも，Eclipseが一旦終了し再び起動するだけで，OSの再起動は起こりません．
[Not Now]や[Apply Changes Now]を選ぶとEclipseの不整合を起こすことがまれにあるため，明確な理由がないかぎりは[Restart Now]でEclipseの再起動を行ってください．

# この先は

mRDT で新規プロジェクトを作成し mruby のバイナリを作るまでの手順は[別ページ](http://qiita.com/monamour555/items/b9c5806e1d79c06f5652)に用意してあります．
併せてご参照ください．
ngrepでパケットキャプチャ

多分[tcpdump](http://qiita.com/tukiyo3/items/de3eb4d9afff53ba5aaf)使ったほうがいい。

```bash:キャプチャー開始
sudo ngrep 'POST /' -q  -W single -d br0 port 8000 -N
```

> interface: br0 (192.168.100.0/255.255.255.0)
> filter: (ip or ip6) and ( port 8000 )
> match: POST /

```bash:別のサーバからPOST送信
curl http://192.168.100.62:8000/ -X POST -d "user_name=hoge" -d "user_pass=jfi23j9"
```

* 自分自身からの接続では(この設定だと)取得できません。

```bash:キャプチャー結果
T(6) 192.168.100.3:45135 -> 192.168.100.62:8000 [AP] POST /index.php HTTP/1.1..User-Agent: curl/7.30.0..Host: 192.168.100.62:8000..Accept: */*..Content-Length: 32..Content-Type: application/x-www-form-urlencoded....user_name=hoge&user_pass=jfi23j9
```
ThinReports でテキストを回転させる

## やりたいこと

[ThinReports](http://www.thinreports.org) のテキストブロックを任意の角度で回転させたい
（ 0.7.7 時点で回転機能はない）

## 動作確認環境

  * ThinReports 0.7.6, 0.7.7
  * Ruby 1.8.7, 1.9.3, 2.0
  * Rails 3.2, 4.0

## 準備

以下のパッチを `require` する:

```rb
# coding: utf-8
require 'active_support/core_ext'
require 'thinreports'

module ThinReportsWithTextRotation
  def self.included(base)
    base.class_eval do
      alias_method_chain :text_box, :text_rotation
    end
  end

  def text_box_with_text_rotation(content, x, y, w, h, attrs = {})
    rotation = !attrs[:single] && content && content.match(%r!/r(?<rate>\d+)$!)

    if rotation
      content = content.delete(rotation.to_s)
      attrs   = attrs.merge :rotate => rotation[:rate].to_i,
                            :rotate_around => :lower_left
    end
    text_box_without_text_rotation(content, x, y, w, h, attrs)
  end
end

ThinReports::Generator::PDF::Document.send :include, ThinReportsWithTextRotation
```

## 使い方

  * （前提）テキストブロックの複数行モードのみ回転可能
  * 回転させたいテキストの最後に `/r<回転率>` を付与する
  * 付与された `/r<回転率>` は描画時に取り除かれる

### サンプル

```ruby
# coding: utf-8
require 'thinreports'
require_ralative 'thinreports-with-text-rotation'

report = ThinReports::Report.new layout: 'foo.tlf'
report.start_new_page do |page|
  page.item(:text).value("ラベル\nラベル/r90") # 90度回転させる
end

report.generate_file('foo.pdf')
```

### 回転後

![回転結果](https://qiita-image-store.s3.amazonaws.com/0/4232/1e073ecd-2c84-f430-b4aa-d00d056a9791.png)

  * テキストボックスの **左下を起点に** 回転される

### Rails で使う方法

`thinreports-with-text-rotation.rb` を `config/initializers` に配置すれば OK

## 最後に

ご利用は計画的に
pngquantで一括圧縮する

# pngquant

## pngquantとは
コマンドラインで使えるpng画像圧縮ツール
tinypngなどでもこのコマンドラインが使用されている

## インストール
```
# 適当なディレクトリを作って移動
$ mkdir src
$ cd src

# clone
$ git clone git://github.com/pornel/pngquant.git

# 移動
$ cd pngquant

# make
$ make

# symlink
$ sudo ln -s {Dir}/src/pngquant/pngquant /usr/bin
```

## 基本的な使い方
```
# 特定のファイルを圧縮
$ pngquant {Dir}/hoge.png

# 一括で圧縮
$ pngquant {Dir}/*.png
```

## オプションを利用
```
# 同一ファイル名で上書き
# 指定しない場合`-fs8.png`が自動でつく
$ pngquant --ext .png {Dir}/hoge.png --force

# 色数指定
$ pngquant 256 {Dir}/hoge.png

# 圧縮スピードを指定(1〜10 def:3)
# 数値が低いほど圧縮スピードは遅くなる
# スピードを遅く指定すればするほど圧縮率があがる
$ pngquant --speed 1 {Dir}/hoge.png
>>> 120kb -> 43kb
$ pngquant --speed 10 {Dir}/hoge.png
>>> 120kb -> 74kb

# IE6対応透過適用
$ pngquant --iedebug {Dir}/hoge.png
```

## これがいいかも
```
$ pngquant --ext .png --speed 1 {Dir}/*.png --force
```
プッシュ通知のカスタム警告音で使用できるオーディオデータフォーマット

Remote / Loca Push Notification で使用できる通知音（警告音）のオーディオデータフォーマットについてのメモ。


##オーディオデータフォーマット

iOSのシステムサウンド機能によって再生されるため、次のいずれかのオーディオデータフォーマットでなければならない。

- リニアPCM
- MA4（IMA/ADPCM）
- µLaw
- aLaw

このオーディオデータはaiff、wav、またはcafファイルとして保存できる。


##再生時間

- **30秒未満**
- カスタムのサウンドがこの制限を超える場合、代わりにデフォルトのシステムサウンドが再生される


##情報ソース

 [Local および Push Notification プログラミングガイド](https://developer.apple.com/jp/devcenter/ios/library/documentation/RemoteNotificationsPG.pdf)
iPhoneの回転時のアニメーションを止める方法

iPhone等のデバイスを回転した時、拡張キーボードを縦横で変更するようにしていたりすると、アニメーションがガチャガチャして格好が悪くなります。そのような場合にアニメーションをさせないようにして誤魔化す方法です。副作用として動作がキビキビになります:-)

```objc:ObjectiveC
@interface ViewController : UIViewController
@end

@implementation ViewController
static BOOL needRevert;
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    needRevert = [UIView areAnimationsEnabled];
    [UIView setAnimationsEnabled:NO];
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    if (needRevert) [UIView setAnimationsEnabled:YES];
}
@end
```
プロセスが使用してるポート番号、ポート番号を使用してるプロセス

プロセスが使用してるポート番号

```
# netstat -anp
```

ポート番号を使用してるプロセス

```
# lsof -n -P -i:<portnum>
or
# sudo lsof -n -P -i:<portnum>
```
【メモ】tmux1.9対応


tmux1.9にしたら新規ウィンドウ作成時にカレントディレクトリを引き継がなくなったようなので調べてみた。

デルタを見ると

>
> Incompatible Changes
> ====================
> 
> * 'default-path' has been removed.  The new-window command accepts '-c' to
>  cater for this.  The previous value of "." can be replaced with: 'neww -c
>  $PWD', the previous value of '' which meant current path of the pane can
>  be specified as:  'neww -c "#{pane_current_path}"'


とのことだったので、以下のように対処したら元と同じ動きになった。

```.tmux.conf
-bind ^C new-window -n zsh
-bind c new-window -n zsh
+bind ^C new-window -n zsh -c "#{pane_current_path}"
+bind c new-window -n zsh -c "#{pane_current_path}"
```
これでしばらく様子見。


## 参考
- [端末多重化ソフトウェア「tmux 1.9」リリース](http://www.softantenna.com/wp/software/tmux-1-9-released/?utm_source=rss&utm_medium=rss&utm_campaign=tmux-1-9-released)
- [tmux / Code / \[488583\] /CHANGES](http://sourceforge.net/p/tmux/tmux-code/ci/master/tree/CHANGES)
- [Twitter / nicknisi: tmux 1.9 came out this week. ...](https://twitter.com/nicknisi/status/437745626269237248)
emacs24 : Slimeが動かない

clisp-2.46-full.zipを使ってCommon Lispで遊んでいたのだが、
先日emacs23->emacs24にしたら動作しなくなった。

どうやら、`make-local-hook`がobsolateになったことが
原因らしい。

ということでslime.elのうち、以下の箇所を変更して対処した。

```el:slime.el```
(defun slime-complete-delay-restoration ()
  (if (fboundp 'make-local-hook) (make-local-hook 'pre-command-hook))
  (add-hook 'pre-command-hook
            'slime-complete-maybe-restore-window-configuration))

;;; Stuff only available in XEmacs
(slime-defun-if-undefined add-local-hook (hook function &optional append)
  (if (fboundp 'make-local-hook) (make-local-hook hook))
  (add-hook hook function append t))
```

[参考](http://d.hatena.ne.jp/minazoko/20110307/1299516769 "emacs24 では make-local-hook がエラーになる")
windows7上に、ローカルプロキシを構築

## 目的
* ローカルプロキシを設定して、試す
* appstreamクライアント　→　ローカルプロキシ　→　会社プロキシ

## Proxomitronとは
* http://proxomitron.sakura.ne.jp/
* http://proxomitron.sakura.ne.jp/download.html 

## 参照
* [Fixing the Authenticated Proxy Problem](http://abaditya.com/2010/05/14/fixing-the-authenticated-proxy-problem/)﻿﻿
* [Proxomitronを使ってみましょ！](http://d.hatena.ne.jp/Kei_9/20100428/1272456737)
* [外部プロクシダイアログ](http://proxomitron.sakura.ne.jp/help/External_Proxy_Dialog.html)
 * 高度なプロクシ設定 (username, password)
 * プロクシリストのエディットウィンドウ内で右クリックすると、「Advanced proxy settings」を選択することができます。

## 構築手順
1. DLして、インストールして、起動しよう
1. 外部向けのプロキシ設定
 1. 「Active Filters」に、「Use Remote Proxy」をチェックして、その以外を外す
 1. トップ画面に、proxyボタンを押す
 1. addボタンを押して、「proxy.*」を入力して、OKを押す
 1. プロクシリストのエディットウィンドウ内で右クリックすると、「Advanced proxy settings」を選択することができる
 1. usernameとpasswordを入力して、OKを押す
 1. windows7メニュー　→　コントロールパネル　→　Windowsファイアウォール　→　windowsファイアウォールを介したプログラムまた機能を許可する
 1. The Proxomitronをチェックする
1. 外部向けのプロキシ確認
 1. IEプロキシ設定画面に（Internet Options）、プロキシ(localhost:8080)を設定する
 1. ブラウザから、アクセスして、usernameとpasswordの入力が必要ないように、使える
ViewControllerを閉じる


```objc
[self dismissViewControllerAnimated:true completion:^() {
    NSLog(@"finish closing");
}];
```

１つ目のパラメータでアニメーションしながら消えるかどうかを指定します。
表示の際に使用したアニメーションに応じて閉じる際のアニメーションも変わるようです。

２つ目のパラメータは閉じ終わった後の動作をblocksで指定します。
別のアプリを開く


# Safari

```objc
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://yahoo.co.jp"]]
```

# App Store

単に開くだけなら以下。

```objc
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://itunes.apple.com/jp/app/"]];
```
Dropboxに接続する


アプリケーション起動時にDBAccountManagerを作成する。

```objectivec:Dropboxの初期化
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
	DBAccountManager *accountManager = [[DBAccountManager alloc] initWithAppKey:APP_KEY secret:APP_SECRET];
	[DBAccountManager setSharedManager:accountManager];
```

linkボタンなどを用意しておき、Dropboxへ接続する。

```objectivec:Dropboxに接続しにいく
[[DBAccountManager sharedManager] linkFromController:self.parentViewController];
```

いつものDropboxへのログイン画面が表示され、無事にログインできたらDBAccountを作成する。

```objectivec:接続できた！
- (BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
	DBAccount *account = [[DBAccountManager sharedManager] handleOpenURL:url];
	if (account) {
		NSLog(@"Dropbox connected.");
	}
	return YES;
}

```

試しに、ファイルを作成してみる。

```objectivec:ファイル作成
DBFilesystem *filesystem = [[DBFilesystem alloc] initWithAccount:account];
[DBFilesystem setSharedFilesystem:filesystem];
		
NSError *error = nil;
DBPath *newPath = [[DBPath root] childPath:@"hello.txt"];
DBFile *file = [[DBFilesystem sharedFilesystem] createFile:newPath error:&error];
if (file == nil) {
	NSLog(@"createFile error[%@]", [error localizedDescription]);
	abort();
}
if (! [file writeString:@"Hello World!" error:&error]) {
	NSLog(@"writeString error[%@]", [error localizedDescription]);
	abort();
}
```

Dropboxのフォルダにhello.txtファイルが作成され、「Hello World!」と書き込まれている。
今度は、ファイルを読んでみる。

```objectivec:ファイル読み込み
DBPath *existingPath = [[DBPath root] childPath:@"hello.txt"];
DBFile *file = [[DBFilesystem sharedFilesystem] openFile:existingPath error:&error];
if (file == nil) {
	NSLog(@"openFile error[%@]", [error localizedDescription]);
	abort();
}
NSString *contents = [file readString:&error];
if (contents == nil) {
	NSLog(@"readString error[%@]", [error localizedDescription]);
	abort();
}
NSLog(@"contents[%@]", contents);
```

無事にファイルを読めました。
一度接続してしまえば、オフラインでもファイルの読み書きが可能みたいです。
DropboxのSync APIをプロジェクトに追加する


1. ダウンロードして解凍した「dropbox-ios-sync-sdk-2.1.0」フォルダの中にある「Dropbox.framework」をプロジェクトのフォルダにコピーする。

2. プロジェクトのFrameworksに「Dropbox.framework」を追加する。

3. フレームワークをプロジェクトに追加する。
 - CFNetwork.framework
 - Security.framework
 - SystemConfiguration.framework
 - QuartzCore.framework
 - libc++.dylib

4. Project Navigatorでプロジェクトを選択し、Infoタブの「URL Types」に項目を追加し、「URL Schemes」に「db-(APP_KEY)」を設定する。(「プロジェクト名-Info.plist」に「URL Types」が追加されているはず)

※ SDKのExamplesを参考にするといい。
ターミナルからJavaScriptをCoffeeScriptに変換できるようにする


## CoffeeScriptはかっこいい

こんにちは！最近Titaniumをいじっていて **なんとなく響きがかっこいい** という理由でCoffeeScriptも一緒に勉強しています凸(totz)です。

Titaniumでチュートリアルのサンプル等に沿ってアプリを作っていると、「JavaScriptのコードは分かるのだけど、CoffeeScriptでどう書けばいいのか分かんね…」ってなることがたびたび起こります。

そんなときに便利なツールをご紹介します。

## Js2coffee

Js2coffeeは名前の通り **JavaScriptをCoffeeScriptに変換してくれる** サービスです。

公式サイトは以下です。

[js2coffee](http://js2coffee.org/ "js2coffee")

このサイトを使えば、すっと簡単にJavaScriptをCoffeeScriptに変換できるのですが、（アフリカの通信事情に対応して） **オフラインでも使えるよう、ターミナルからjs2coffeeを使える**よう設定してみます。

## 設定

まずはNode.jsをインストールして下さい。[こちらの公式サイト](http://nodejs.org "Node.js")からインストールすることが出来ます。

下のコマンドでバージョンが表示されれば、無事インストールされていることが確認できます。

```
$ node -v
```

Node.jsのインストールが終わったら、js2coffeeをインストールします。

下のように-gオプションを付けてインストールすれば、パスの設定が不必要になって楽なのでオススメです！ (@kysnmさんに教えていただきました。2/25追記）

```
$ sudo npm install -g js2coffee 
```

これで設定完了です！

---

※　上記の方法でうまくインストールできない方は、こちらの方法も試してみてくださいー

下のコマンドで-gオプションなしでインストールします。

```
$ npm install js2coffee
```


次に.bashrcに下記の１行を追加します。

```
export PATH=$PATH:~/node_modules/js2coffee/out/bin
```

保存できたら次のコマンドを実行！

```
$ source .bashrc
```

これで```js2coffee```コマンドが使えるようパスを通すことが出来ました。

---

## 実行する

下のようにすれば、同じファイル名のCoffeeScriptのファイルを生成してくれます。

```
$ js2coffee file.js > file.coffee
```

また、ソースを確認したいだけなら次のようにコマンドを実行すればcatのようにすぐにソースコードの確認が出来ます。

```
js2coffee file.js
```

重宝してます。
NSOperationQueue に addOperation: すると EXC_BAD_ACCESS になる現象とその回避策の模索

# 現象

NSOperationQueue の `addOperation:` 実行時に **_EXC_BAD_ACCESS_** が発生する現象。しかも NSZombie を有効にするとクラッシュせず普通に動いているように見えてしまう。NSZombie を使い続けていたら発見できなかった現象なので、NSZombie を外しての確認も必須かもしれない。

## 実装条件など

* NSOperation のサブクラスを自前で実装
* 並列実行モード
    * -isConcurrent == YES
* -cancel 対応

## だめだった回避策

`addOperation:` の実行前に、在オペレーション数が maxConcurrentOperationCount を超過しないようにする判定処理を入れたら落ちなくなった気がしたけれどだめだった。

```objc
if (queue.operationCount >= queue.maxConcurrentOperationCount)
	return;

[queue addOperation:operation];
```

## 結局どうしたか

NSOperation のサブクラスで `-cancel` をオーバーライドしたのが悪かったらしい。ただ、NSOperation に対する私の理解が及んでいないため、これで正しいのかは分からないが、とりあえず次に示す方法で例の現象を回避できた。

```objc:MyOperation.m

/* このメソッドはオーバーライドしてはいけない
- (void)cancel
{
	[super cancel];
	
	// キャンセル時の解放処理等……
}
*/
```

> NSOperation のサブクラスでは `-cancel` メソッドのオーバーライドを一切行わない。

`-cancel` をオーバーライドしてはならない、という情報が見当たらなかったので本当にこれで正しいのか自信が無い。ただ、これにより当現象は見られなくなったので、とりあえず現状は良しとしておきたい。。
AngularJS利用時のMinify（ファイル圧縮）適用の注意事項

書籍「Mastering Web Application Development with AngularJS」の「Chapter 12. Packaging and Deploying AngularJS」で記載されていた"minification-safe"な記述方法のところを読んで、意外なAngularJSの弱点を知りました。

AngularJSのDependenciesを調べる方法は、実はFunctionをtoStringの結果から正規表現で行っているそうです。
ドキュメントを読み込んでいればわかることであるかもしれませんが、私は上記の書籍で知ることになりました。

その結果、どんな問題が発生するかというとminifyしたために正常にDependenciesが認識されなくなるという致命的な問題が発生する可能性があります。
例えば下記のようなソースコードを書いているとします。


```js
angular.module ( 'hoge' , ['resources.projects'])
    .controller( 'HogeViewCtrl' , function ($scope, $location) {
        //controller's code
    }); 
```

minifyすると

```js
angular.module ( 'hoge' , ['resources.projects'])
    .controller( 'HogeViewCtrl' , function (e, f) {
        //controller's code
    }); 
```

というように、パラメータに使われていた変数名が圧縮されてしまい、定義されているModuleやServiceなどと依存性が失われてしまうのです。

これを回避するためにAngularJSは、配列を使って定義を記述します。なぜ配列を使っているのかという理由は、このMinifyにより依存性が失われてしまう点を回避しているのでした。

```js
angular.module ( 'hoge' , ['resources.projects'])
    .controller( 'HogeViewCtrl' , ["$scope", "$location", function ($scope, $location) {
        //controller's code
    }]); 
```

上記のように書くとminifyされても、配列で定義したパラメータの名前が残るため、AngularJSの仕組み上依存関係は崩れず問題になりません。

規模の大きいプロジェクトでは、Javascriptファイルの容量は大きくなり快適なユーザ操作を提供するためにminifyすることは大前提になってくるはずです。その際に、気を付けるべきことは、関数のパラメータと配列で定義した重複するパラメータの依存関係をリファクタリング時に壊さないように気を付けることであると記述されています。

（何かサポートしてくれるものがあればいいのですが、それはIDEで回避できるのかもしれませんが情報は今のところ手元にありません。）

以上、AngularJSでMinify（ファイル圧縮）する際に注意するべきは、定義時の配列形式にあることを取りまとめさせていただきました。
Macで踏み台先のサーバにFileZillaでアクセスする方法メモ

# 概要
踏み台サーバを使って接続したいサーバへアクセスすることが多くなってきたので、
自分のメモ用に書いておきます。

windowsでは、WinSCPというソフトがあるので問題はないのですが、
Macではトンネルを使ったFTPソフトがないので、SSHコマンドによるポートフォワードを使う接続方法になります。

# ターミナルを立ち上げてポートフォワード行う
```command
ssh -L 【ローカルポート】:【転送先ホスト】:【転送先ポート】 【踏み台先ユーザ名】@【踏み台先IP】 -p 【踏み台先ポート】
```
・ローカルポート：FileZillaに設定したいポート番号
・転送先ホスト：踏み台からアクセスするサーバ
・転送先ポート：踏み台からアクセス先のサーバへ接続するポート番号
・踏み台先ユーザ名：踏み台先のユーザ名
・踏み台先IP：踏み台先のIP

### 以下のような場合
```command
ssh user1@172.16.33.43 (踏み台)
ssh user2@192.168.1.6 (転送先)
```

割り当てるローカルポート番号を10022とすると

```command
ssh -L 10220:192.168.1.6:22 user1@172.16.33.43 -p 10220
password:【踏み台サーバパスワード】
```

ログインが確認できれば、この状態でlocalhost:10220は、172.16.33.43を踏み台（経由）で192.168.2.6:22に接続される

# FileZillaで接続
・ホスト名：localhost
・ポート番号：ポートに設定した番号
・ユーザ名：user2
・パスワード：アクセス先サーバのパスワード

![スクリーンショット 2014-02-24 01.18.07.png](https://qiita-image-store.s3.amazonaws.com/0/34020/b56327e8-bc25-cb21-6c1f-c3b8696c98e5.png)
自分のGitHub Pagesと独自ドメインの設定方法

#### 2015/2/3 更新
DNSに設定するAレコードが変更になったので、更新しました。

以前の`204.232.175.78`で登録している方はGitHubからメールが届いてると思うので変更しましょう。

---

せっかくドメインを取ったのに何もせず放置してたからそろそろ使ってみようと思って。。

でもサーバー立てる程でもないしと思っていたらGitHub Pagesを見つけました。

リポジトリ単位でしか設定出来ないと思ってたけど、これ自分のアカウント名でPage作れるみたい！

サーバー立てる必要もないしせっかくなので使ってみた。

今回作ったページ

[mofumofu3n.com](http://mofumofu3n.com)

## 必要なもの
* GitHubアカウント
* 独自ドメイン(お名前.comで取りました)
* 設定いじれるDNSサーバ(お名前.comのやつ使った)

## リポジトリの作成
GitHub上で下記のリポジトリを作成する

```
リポジトリ名：<アカウント名>.github.io
```

これで自分のアカウントでGitHub Pagesが作成できた。

こんな感じでアクセスできる。

[mofumofu3n.github.io](http://mofumofu3n.github.io)


## DNSの設定
今回は`mofumofu3n.com`を使います

1. お名前.comにログインしタブから"ドメイン設定"を開く
2. "DNS関連機能の設定"を開く
3. "DNSレコード設定を利用する"の設定を開き、自分の設定するドメインを選択
4. Aレコードに`192.30.252.153`と`192.30.252.154`を追加する
5. 設定を保存する

DNSの設定はこれで終わり

## CNAMEファイルを作成
1. 作成したリポジトリをcloneして、以下のようにCNAMEファイルを作成しリポジトリにプッシュする

```
$ echo mofumofu3n.com > CNAME
ドメインは自分のドメインにしてください
``` 

あとはDNSの設定が完了すれば自動的にリダイレクトされる。

## おわりに
GitHub Pagesを使えば簡単に静的ページが作成できます。

ブログをやりたい場合は[jekyll](http://jekyllrb.com/)を使えば出来るらしいです。

しかもMarkdownで書けるみたいだからエンジニアには嬉しいね！
less コマンド


## `:`の後に入力する代表的なコマンド
|コマンド|説明|
|:--|:--|
|d|ウィンドウ半分、下にスクロール|
|u|ウィンドウ半分、上にスクロール|
|b|1ページ分、上にスクロール|
|f|1ページ分、下にスクロール|
|/パターン|ファイルの末尾に向かって「パターン」を検索してスクロール|
|?パターン|ファイルの先頭に向かって「パターン」を検索してスクロール|
|n|前回の検索を繰り返す|
|:n|復数のファイルをコマンド行から指定してある場合、次のファイルへ移動|
|v|viエディタで今見ているファイルを開き直す|
|q|終了|
sortコマンド

平文の行をアルファベット順や数値順で並べ替えてくれます。 
ファイルそのものを修正しません。

## 代表的なオプション
|オプション|説明|
|:--|:--|
|-n|数値順に並べ替え（10は2より後ろ）。半角空白記号とタブは無視|
|-r|逆順に並べ替え|
|-f|大文字と小文字を区別せず並べ替え|
|+数|最初の「数」欄を使わずに並べ替え|
|-k||

ACL追加情報をもっていて、パーミッションの末尾にプラス記号(+)があるディレクトリの一覧を容量順に並べ替える

```Bash
ls -l | grep "\+" | sort -n -k 5
```

各行に512バイト単位の大きさで容量を記した形式で全ファイルの一覧を生成した後、その結果を`sort -rn`に与えて数値として降順で並べ替え、さらに`head`コマンドで先頭の10行を書き出す

```Bash
find . -type -f -print0 | xargs -0 ls -s1 | sort -rn | head
```
タグ・エディターを作ってみた

# 背景

テキストを入力してカンマやスペースで区切るとタグになるようなタグ・エディターは、本格的なライブラリとしては[Select2のtagging support](http://ivaynberg.github.io/select2/#tags)がありますが、勉強のため自作してみました。

* [デモ](http://hnakamur.github.io/jquery.tag-editor/example.html)
* [github.com/hnakamur/jquery.tag-editor](https://github.com/hnakamur/jquery.tag-editor)

# 操作方法

* タグエディタ内をマウスクリックするかTABでフォーカスを移すと編集できます。
* カンマかスペースを入れるとタグになります。
* 既に入力済みのタグと同じタグは入力できないようになっています。
* カンマやスペースを含んだ文字列をクリップボードからペーストした場合は複数のタグとして入力します。
* Backspaceを押すかxボタンをクリックするとタグを削除できます。

# 実装メモ

* タグの色は[ブクログ](http://booklog.jp/)を真似させていただきました。ありがとうございます。
* IE7ではdisplay: inline-blockの代わりに*display: inline; *zoom: 1というCSSハックを使用していますが、spanだと背景色が表示されなかったのでdivに変更。
* カンマやスペースをキーリピートで入力した場合に削除するようにしてあります。
* タグ入力用のinput要素はCSSでborder: none; outline: noneとしてフォーカスがあるときでもIビームカーソルだけが表示されるようにしてあります。
* ただし、IE7ではborderもoutlineも表示されてしまいます。
* タグ入力して確定した時にフォントが変わらないほうが気持ちが良かったので、同じフォントを使うようにしています。
* タグ入力中にinput要素の幅を文字列に合わせて調整するため、同じフォントを使ったspanをposition: absolute; left: -999pxで画面外に配置し、このspanに文字列を設定して幅を測定しています。
* このとき入力した文字列そのままを設定すると、入力中にinput要素がガクガクしたので、元の文字列にWを1文字加えて幅を測定するようにしました。_だとイマイチでしたが、幅の広いWだと自然な動きになりました。
Railsでアソシエーションされたモデルを条件にして検索する

- - - - - - - - - - - 
ブログを更新しました。<a href="http://workabroad.jp/posts/2060">元の記事はコチラ</a>
- - - - - - - - - - - 
ブログポストが複数カテゴリを持てるという場合で、
ある記事と同じカテゴリを持つ記事を探すということをやりたい。

![Screen Shot 2014-02-23 at 9.34.23 AM](http://image.workabroad.jp/upload/2014/101/workabroad.jpg)



```ruby

#Postモデル
class Post < ActiveRecord::Base
	has_and_belongs_to_many :categories
end

#交差テーブル
class CategoriesPost < ActiveRecord::Base
end

#Categoryモデル
class Category < ActiveRecord::Base
	has_and_belongs_to_many :posts
end

```



```ruby

post = Post.first
categories = Category.joins(:posts).where("posts.id = ?", post.id).select("categories.id")
category_ids = categories.map { |c| c.id }.join(',')

posts = Post.joins(:categories).where("categories.id IN (#{category_ids})").uniq

```
　
これで取り出せはするんだけど、カテゴリは複数持てる設定だから、INでやると当然記事は重複する。id=1の記事はカテゴリ13,33,36を持っているからid=1の記事を3回も取得してしまう。

uniqで重複は消してしまえるけど、もっとスマートな方法ないかな。
SQLに詳しい人教えてください。

---------

references(*args)という便利なメソッドをnaotorさんから教えて頂きましたー。
Categoryのidは自分で集めなくてもpost.category_idsでいけるんですね。
いつかRailsチュートリアルで見た気がするな。


[http://api.rubyonrails.org](http://api.rubyonrails.org)から引用

```ruby

User.includes(:posts).where("posts.name = 'foo'")
# => Doesn't JOIN the posts table, resulting in an error.

User.includes(:posts).where("posts.name = 'foo'").references(:posts)
# => Query now knows the string references posts, so adds a JOIN

```

```ruby

post = Post.first
posts = Post.includes(:categories).where(categories_posts: {category_id: post.category_ids}).references(:categories)

```




 → <a href="http://workabroad.jp/posts/2060">http://workabroad.jp/posts/2060</a>
プロパティにアクセスするとAPIからデータを取得して使うようなModelを作るプラクティス


例えばデータベースにTwitterIDが入っているとする。

Twitterのscreen_nameは自由に変更可能だから、DBには保存せずにAPIから取得するようにして、キャッシュが切れたら勝手に更新されるようにしたい。というケースの時。

FuelPHPでORMモデルを使った時はこういうふうに書ける。

例えばUser_ModelにORMの設定を書いて、以下のようなGetterを書く。

```php
<?php
	protected static $_twitter = array();

	public function twitter() {
		if(!static::$_twitter[$this->twitter_id]) {
			static::$_twitter[$this->twitter_id] = \Model_Twitter::getStatus($this->twitter_id);
		}

		return static::$_twitter[$this->twitter_id];
	}

	public function & __get($property) {
		if($property == 'twitter') {
			return $this->twitter();
		}

		return parent::__get($property);
	}
```

Model_Twitterでは、APIからユーザーのステータスを返すようなコードを適宜書いておく。

そんで、ControllerやViewから以下のようにプロパティアクセスすると、必要な時だけAPIをコールするようになる。


```php
Hello, <?php echo \Model_User::find($user_id)->twitter->screen_name; ?>!
```

もちろん、Model_Twitter側ではmemcachedやRedis等を使ってAPIレスポンスをキャッシュしておく。
OSX10.9でSWI-Prologを起動する

###環境
Mac mini(Intel Core i5 )
OS:OS X 10.9.1
SWI-Prolog 6.6.1

###インストール
http://www.swi-prolog.org/download/stable から
SWI-Prolog 6.6.1 for MacOSX 10.6 (Snow Leopard) and later on intel
をダウンロード、素直にインストール。

###起動
アイコンをダブルクリック。
コマンドラインからは
` /Applications/SWI-Prolog.app/Contents/MacOS/swipl` 
で起動できた。
` swpl`と勘違いしてちょっとハマった。

"Mac swiprolog"でググると`/opt/local/bin`下にswiplがあるという情報がワンさと引っかかるが、
なかったのでここにメモしておく.
zshにおける連想配列の使い方

Zshには連想配列があります。基本的な使い方：

```zsh
% typeset -A map  # 連想配列型を定義
% echo ${(t)map}  # mapの型を表示
association       # 連想配列の型はassociation
% map=(a 10 b 20) # mapの定義、(key1 val1 key2 val2)のようにする
% echo $map
10 20             # 値のみが表示される
% echo $map[a]    # key(a)に対応するvalue(10)が表示される
10
% echo ${(k)map}  # (k)は連想配列のkeyの一覧を取得するフラグ
a b
```

ここで(t),(k)は変数展開フラグと呼ばれるもので、
より詳しくはzshの本6.7節で解説されている。

さらにパターンも記述できる：

```zsh
% map=("a*" 10 "b*" 20) # keyにパターンを記述できる
% echo ${(k)map}        
b* a*
% echo $map[abcd]       # そのままではパターンマッチを行わない

% echo $map[(k)abcd]    # keyの部分に(k)を使用するとマッチを行う
10
% echo $map[(k)bcd]
20
```

こちらの(k)は添字用変数展開フラグと呼ばれ、
パターン(上述の"a*, b*")にマッチするキーの値を返す。
変数展開フラグ(上述)の(k)とは異なるので注意
関数ポインタの構文Demo

###関数ポインタの構文を練習として書いてみたもの
・実用性は全くない。

####使えそうなところ
・コールスタックを手書き、選択的に関数を呼び出す。
・再帰的または複数回の関数コール


```cpp
/* 関数プロトタイプ */

// 引数、戻り型共になし。
void func1( void );

// 引数と戻り値が型をもつ
int func2( int );

// 2つの引数を取る。
double func3( int, double );

//引数に関数へのポインタ,int型,double型を取る。
void func4( double (*func_name)( int, double ), int, double );	

int main()
{
	// ポインタの宣言
	void ( *pFunc1 )( void );
	int ( *pFunc2 )( int );
	double ( *pFunc3 )( int , double );
	void ( *pFunc4 ) ( double( *func_name )( int, double ), int, double );

	// 関数ポインタの代入
	pFunc1 = func1;
	pFunc2 = func2;
	pFunc3 = func3;
	pFunc4 = func4;
	
	// 関数コール
	pFunc1( );
	pFunc2( 2 );
	pFunc3( 1, 2.5 );
	pFunc4( func3, 1, 2.5 );
}

// 関数定義
void func1( )
{
	// 空の文
}

int func2( int j )
{
	return j;
}

double func3( int zahlen, double real )
{
	double num = zahlen + real;
	return num;
}

void func4( double (*func_name)( int, double ), int n, double d )
{
	double (*func)( int, double );
	func = func_name;

	double result = func( n, d );
}
```
HRForecastでKPI可視化(してみようと思った)

![スクリーンショット 2014-02-23 22.53.10.png](https://qiita-image-store.s3.amazonaws.com/0/6661/b8adeaab-6867-497d-75bd-0cdd14b70c37.png)

とあるサービスの開発運用マンをしているわけですが、施策を出した後のKPIをリアルタイムに可視化できたらかっこいいかも…と思いHRForecastを使ってグラフにしてみようと思います。                                      自分でDBにクエリ投げてjson作ってjsでグラフ化するもありですが何よりだるいです。
このツールの凄いところは

- POSTでデータを登録できる。（インターフェースがHTTP）
- インストール、構築が楽（cpanmがさくっと使える程度にPerlあるを知っていれば）

というところにあると思います。
登録したいデータがいくら増えようが、開発運用マンはPOSTでURLを叩くだけでグラフにデータが追加されていきます。グラフの新規作成も作りたいグラフのURLでPOSTを投げることで作られます。
インストールも、MySQLがあれば特にyumとか叩く必要ないのでサーバーを汚さずに構築できます。（cpanmはhomeディレクトリに作られるので特に文句言われることもないはず。不安なら個人ディレクトリに置けばいい）

##インストール
インストールした後は、perlを起動するだけで動作します。

```sh:インストール
あらかじめcpanmをインストールしておく

# HRForecastをダウンロード
cd /path/to/install_dir
git clone https://github.com/kazeburo/HRForecast
cd HRForecast

# 依存関係にあるcpanモジュールをインストール
sudo cpanm --installdeps .

# エラーでて面倒くさくなってきたら--forceオプション追加。多分大体testに失敗しているだけなので問題ないはず
sudo cpanm --installdeps . --force

# mysqlにデータを蓄えていくためのテーブルを作成
mysql -uroot -p test < schema.sql

# DBの接続先とかを設定
vim config.pl

# 起動
perl hrforecast.pl --config ./config.pl &
```

## データ登録
POSTリクエストを行うことで登録できます。コマンドラインから登録したければcurlを使っていけます。

```sh:データ登録
# curlを使ってPOSTリクエストを投げる
curl http://localhost:5127/api/kpi/event/test1 -X POST -d 'number=11&datetime=2014-02-17 00:00:00'

# 標準入力から登録したい場合
echo 'number=11&datetime=2014-02-17 00:00:00' | curl http://localhost:5127/api/kpi/event/test1 -X POST -d @-
```
cronとかで定期的にデータを送ってあげようと思っています。
大量にデータを登録したい場合はどうすればいいんだろう、POSTを件数分投げる必要があるんでしょうか。DB見た感じだと直接insertとかありっぽそうです。

ほむ、cpanmでエラーがでてモジュールをインストールできなかったところ以外はサクッと行けた。
Windows8をMicrosoftアカウントを使ってセットアップするとWeb開発者は後で泣くはめになる

# 結論：Windows8はローカルユーザーでセットアップしよう

地味なんだけど本当に重要で嵌りやすい話。
Windows8から、ユーザーとしてMicrosoftアカウントが登録できるようになった。いや、登録をほぼ強制するようになった。
連携すればSkyDrive改めOneDrive連携がされて、MS Officeのクラウド連携なんかもシームレスにつながって確かに便利なんだけど、Microsoftアカウントを素直に登録すると、Windowsにおけるユーザー名が日本語になってしまう。そしてユーザー名が日本語だとユーザーフォルダも日本語で作成される。

![](https://pbs.twimg.com/media/BXhWClDCUAA7hUp.jpg:large)
(https://twitter.com/muu000/status/394159569787572224/photo/1 より画像引用)
このフォームに素直に従うと日本語入れるよね。

ここまではいい。
問題は、 **ユーザーフォルダに日本語が入っていると、アプリケーションが異常終了するケースがある** ことだ。
私が試したときは **VirtualBoxがインストールできなかった** 。インストーラが異常終了するわけである。他にもSourceTreeで同様の問題があるらしい。流行のOSSばっかりじゃないか。。泣ける。。

別に英語名のローカルユーザーを作って、そのユーザーでインストール作業をすればインストールできるのだが、非常に面倒くさいし、やっててみじめな気持になる。

そしてユーザーフォルダの名前を変更するには、ユーザーを作りなおすのが一番確実である。

[PowerShell でユーザー名と異なる userフォルダを自由に設定する - tech.guitarrapc.cóm](http://tech.guitarrapc.com/entry/2013/10/27/061208)

これもやろうとしたんだけど、うまくいかなくて、結局作りなおすことになった。
一旦英語名のローカルユーザーを作って、あとでMicrosoftアカウントに紐づけるとよい。

ユーザーの作り直しは各種セットアップのやり直しや、データの移行なども発生してかなり面倒くさい。

Microsoftアカウントを使わずにWindowsをセットアップするのは裏技っぽい。。罠すぎるだろこれ。
[Windows 8.1 の新規インストール時に Microsoft アカウントを使わずにインストールする | SE の雑記](http://engineermemo.wordpress.com/2013/09/10/windows-8-1-%e3%81%ae%e6%96%b0%e8%a6%8f%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e6%99%82%e3%81%ab-microsoft-%e3%82%a2%e3%82%ab%e3%82%a6%e3%83%b3%e3%83%88%e3%82%92%e4%bd%bf%e3%82%8f/)
三和数

手元で<del>5分</del>かかりました。遅いです。
<del>自明な枝刈り(take_while)により3分、lazyの利用により2分45秒に。</del>

```rb:hena19pre.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/0a711729fdea28b1c30b
#http://nabetani.sakura.ne.jp/hena/ord19sanwa/
STDOUT.sync=true
while gets
	a=$_.split(',').map(&:to_i).sort
	if a==[1,2,3]
		puts :many
		next
	end
	result=[*1..a.last].combination(3).lazy.take_while{|b|b[0]<=a[0]}.select{|b|
		c=1.step(3).flat_map{|i|b.repeated_combination(i).map{|e|e.reduce(:+)}}
		a&c==a
	}.take(2).to_a
	if result.size==1
		puts result[0]*','
	elsif result.size==0
		puts :none
	else
		puts :many
	end
end
```
zsh + tmux で rbenv など*env系が動作しない時

zsh + tmux 環境でrbenvなどの*envを利用している場合にうまくバージョン設定を解決できない場合がある。

環境変数$PATHを確認し(cf: `echo $PATH | perl -pe 's#:#\n#g'`)、
もし `/path/to/*env/shims` よりもglobalなPATHを参照するような設定になってしまっている場合、
`.zprofile`や`.bash_profile`などで

```shell-session
PATH=$(cat /etc/paths /etc/paths.d/* | tr -s "\n" ":") # defaultのPATH設定
PATH=${PATH%:}
```

のようにPATHをresetするような記述を入れておくとうまくいく。
(上記はmacの場合)
第19回オフラインリアルタイムどう書くの参考問題


オフラインでリアルタイムに「どう書く」をやるイベント
http://atnd.org/events/47670
をやります。

現時点では、まだまだ空きがありますので是非。
で。

今回の参考問題は「三和数」という名前で、
http://nabetani.sakura.ne.jp/hena/ord19sanwa/
です。

当日出す問題の難易度と分量はこれを目安に考えると良いと思いますといいたいところですが、この問題よりも簡単な問題にすると思います。
とはいえ、似たような問題が出ることはあまり多くありません。

参加予定の方は、何分で解けたとかいう情報を付けてくださると、本番用の問題の参考になりますのでできればお願いします。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

それと。
先日 CodeIQ に出した問題(カラフルな八面体を転がそう)の問題と解題
http://nabetani.hatenablog.com/entry/codeiq_octahe_q708
も公開されていますので、こちらも是非。
std::moveはムーブとは限らない

ブログにまとめるのが面倒くさいのでメモ。`std::move`は必ずしも「ムーブ」を強制せず、無条件(unconditionally) rvalueキャストを行う。

http://scottmeyers.blogspot.jp/2012/11/on-superfluousness-of-stdmove.html
http://channel9.msdn.com/Events/GoingNative/2013/An-Effective-Cpp11-14-Sampler

##例外ケース1
ムーブコンストラクタ／代入演算子を提供しないクラス。コピー動作にフォールバックする。

```cpp
struct X {
  X(const X&) = default;
  // ムーブコンストラクタなし
};

X v0;
X v1(std::move(v0));  // コピー
```

##例外ケース2
constオブジェクトからのムーブは行われず、コピー動作にフォールバックする。（一般に、ムーブコンストラクタ／代入演算子は非const rvalue参照型`X&&`を引数にとり、コピーコンストラクタ／代入演算子はconst lvalue参照型`const X&`を引数にとるため。）

```cpp
struct X {
  X(const X&) = default;
  X(X&&) = default;
};

void fuunc(const X arg) {
  X v(std::move(arg));  // コピー
}
```
頭の体操的な問題1_fizzbuzz

2014.2.23の第13回ゆるびぃ会で出題した問題の記録です。

問1. FizzBuzz問題を解く。
==========
- とりあえず1以上の整数nを引数にとるメソッドを実装する感じで。
- 制限時間は5分。
- 言語はなんでもOK。

問2. FizzBuzz問題を%演算子を使わずに解く。
==========
- だいたい問1と同じです。
- 制限時間は10分。

ちなみに
----------
ちなみに私は下記のような感じに書きました。

```ruby:fizzbuzz.rb
# 問1
def fizzbuzz(x)
  res = ""
  res << "Fizz" if x % 3 == 0
  res << "Buzz" if x % 5 == 0
  res.empty? ? x : res
end

# 問2
# 3,5で割り切れるメソッドを作りました。後は問1と同じ。
def divided_by_three?(x)
  case sum_each_place(x)
  when 3, 6, 9
    true
  else
    false
  end
end

def divided_by_five?(x)
  ary = x.to_s.split(//).map(&:to_i)
  case ary.last
  when 0, 5
    true
  else
    false
  end
end

def sum_each_place(x)
  ary = x.to_s.split(//).map(&:to_i)
  return ary.first if ary.size == 1
  sum_each_place(ary.inject(:+))
end
```

しかしよくよく考えたら「7で割り切れる云々」とかにルールが変わったらその都度メソッドを考えないといけないのであんまりイケてねえなと思った。

「もっと良い解き方がある！」とかリベンジしたいという方はコメントお願いします。
コメントでもコード書けるらしいので。
カスタムセルを使うとsegueが有効にならない？


##課題
ストーリーボードでは確かに設定しているはずのsegueが、シミュレータで実行されない。セルを選択してもハイライトされるだけで寂しい感じである。

##解決方法
どうやらカスタムセルを利用すると、セルからのsegueが無効になるため、追加手順として`didSelectedRowAtIndexPath:`でsegueを発生させる。

```objc
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self performSegueWithIdentifier:@"editRecord" sender:self.tableView];
}
```
これで確かに動くことを確認した。

##参考
http://www.slideshare.net/satoshianai/xib#btnNext
ありがとうございました。