OmniAICreator/Qiita-1.07M huggingface dataset:
vimをソースからビルド

将来的にはluaとrubyでプラグインをかけたらいいなと思うのでlua,rubyを使えるvimを作成することが今回の目的です。途中でいろいろ手こずったので作業メモとして残して置きます。

#ソースの入手 
vim-jpが非公式ではあるがgithubに最新ソースをあげているようなのでそこからソースを入手する。

```:sh
cd 作業ディレクトリ
git clone https://github.com/vim-jp/vim.git
```

#configure
利用可能なオプションの調べ方は./configure --helpで確認できる。
また現在利用中のvimのオプションは、vim --versionで確認できる。

```sh
./configure --with-features=huge  --enable-luainterp  --enable-perlinterp  --enable-pythoninterp  --enable-rubyinterp --enable-fail-if-missin
make
```
#設定を確認する
src以下にvimのバイナリができるので設定したオプションが有効になっているか確認する。
今回は+lua, +rubyとなっていればOK

```sh
./src/vim --version
```


#インストール

```sh
make install
```

#困ったこと

##perlインタプリタを有効にするオプションをつけるとエラー
下記のようなエラーが出た。

```sh
auto/if_perl.c
/usr/bin/perl /usr/share/perl5/ExtUtils/xsubpp -prototypes -typemap \
/usr/share/perl5/ExtUtils/typemap if_perl.xs >> auto/if_perl.c
Can't open perl script "/usr/share/perl5/ExtUtils/xsubpp": そのようなファイルやディレクトリはありません
```

ググったら、perl-ExtUtils-Embedをインストールすれば良いみたいなので、下記コマンドでインストールする
## perl-ExtUtils-Embedをインストール

```sh
yum install perl-ExtUtils-Embed
```

このあと再ビルドしたがビルドエラーはとれず1時間ぐらい悩んだ。
どうもsrc/Makefileを読むと「/usr/share/perl5/ExtUtils/xsubpp」にあることを期待しているようですが、Fedora20のyumコマンドインストールされたのは、「/usr/share/perl5/vendor_perl/ExtUtils」のようでした。とりあえず暫定で「src/Makefile」を下記のように直せばビルドエラーは解消された。

```diff
diff --git a/src/Makefile b/src/Makefile
index 772b15c..cd28553 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -2477,7 +2477,7 @@ lintinstall:
 
 auto/if_perl.c: if_perl.xs
        $(PERL) -e 'unless ( $$] >= 5.005 ) { for (qw(na defgv errgv)) { print "#define PL_$$_ $$_\n" }}' > $@
-       $(PERL) $(PERLLIB)/ExtUtils/xsubpp -prototypes -typemap \
+       $(PERL) $(PERLLIB)/vendor_perl/ExtUtils/xsubpp -prototypes -typemap \
            $(PERLLIB)/ExtUtils/typemap if_perl.xs >> $@
 
 auto/osdef.h: auto/config.h osdef.sh osdef1.h.in osdef2.h.in
```

#2014/08/26に追記
最新版にアップデートして再ビルドしたところビルドが通ることを確認した。
実際どうやって対応しているのか見ると下記ログが見つかった。
src/Makefileへのパスの渡し方がいまいち分からないのでその辺を時間があるときに勉強しようと思う。

https://code.google.com/p/vim/source/detail?r=de35e123e63c326be4a576f8e678ed9e63ed1f48
Project Eulerをhaskellで練習していく日記: Problem 4

# 問題
回文になっている数の問題です。
二桁の数同士の積で回文になっている最大の数は、9009 = 91 × 99です。
同様に、三桁の数同士の積で回文になっている最大の数を求めよ。

# 回答
```hs
isPar :: Integer -> Bool
isPar n = m == reverse m
  where m = show n

main = do 
     print $ maximum $ filter isPar [x*y| x<-[100..999], y<-[100..x]]
```

#感想
安直に列挙して最大を求めるようにした。
あまり知恵を使っていない感じがするのがなんとも、、、。
Rx-Mainを試す

Rx-Mainを試してみた。
Mac+Xamarin Studio
endもmain waitも呼ばれないので想定通り。


```csharp
using System;
using System.Reactive;
using System.Reactive.Linq;
namespace p2
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			Observable.Create <string> (
				observer => {
					Console.WriteLine ("start");

					while (true) {
						observer.OnNext (Console.ReadLine ());
					}
					return () => Console.WriteLine ("end");
				}).Subscribe(s => Console.WriteLine ("subscribe:" + s ));
			Console.WriteLine ("main wait");
			Console.ReadLine ();
		}
	}
}
```
Chatterが有効化されているか判定する


[Chatterのプロファイルベースのロールアウト](http://docs.releasenotes.salesforce.com/ja-jp/api/release-notes/rn_chatter_pbr.htm)がSummer'14からGAとなりました(有効化するためにはサポートへの連絡が必要)。

これによって、組織としてはChatterを有効化してもユーザレベルではChatterを無効化することができるようになりました。そのため、利用しているユーザがChatterを利用できるか判定するための方法が変わってきます。

ということで、Chatterが利用できるか判定する方法を調べてみました。
### 有効化していない場合
組織単位でChatterが有効化されているかチェックする

``` java:Apex
ConnectApi.OrganizationSettings o = ConnectApi.Organization.getSettings();
System.debug('Chatter=' + o.features.chatter);
```


### 有効化した場合
ユーザごとにChatterが有効化されているかチェックする

``` java:Apex
ConnectApi.UserSettings u = ConnectApi.Organization.getSettings().userSettings;
System.debug('Chatter=' + u.hasChatter);
```

基本的には、ConnectApiを叩けば値を取得できます。UserSettingsクラスのhasChatterはChatterのプロファイルベースのロールアウトを有効化していない状態でも値を取得できたので、有効化した場合の書き方をしておけば、どちらの状況でも対応できそうです。

~~ただ、UserSettingsのhasChatterはAPIレファレンスに載っていないようなので今後変更になるかもしれません。~~
Unityで複数選択した時に「-」みたいのでますよね。あれどうやんの？

```
EditorGUI.showMixedValue = true;
param = (GameObject)EditorGUILayout.ObjectField("Object paramater", param, typeof(GameObject), true);

EditorGUI.showMixedValue = false;
```

こんなかんじでできるらしいよ。

実際そうなった。
Project Eulerをhaskellで練習していく日記: Problem 3

# 問題
13195の素因数は、5, 7, 13, 29である。
600851475143の最大の素因数を求めよ。

# 回答
```hs
maxDiv q n = case m of 
         [] -> n
         x:xs -> maxDiv x $ n `div` x
       where m = [y|y<-[q..(truncate $ sqrt $ fromIntegral n)], n `mod` y == 0]

main = do 
     print $ maxDiv 2 600851475143
```

# 感想
効率的かは不明ですが、
与えられた数`n`に対し、最小の素因数`x`を求め、`n = xq`として因数`q`を削りだしていき、`q`が素数になるまでそれを繰り返すという策をとりました。
パスワードは間違っても NSUserDefaults に入れない

かなり広く知られてきましたが、`NSUserDefaults` は安全ではないので、漏れたらまずい情報は KeyChain を使うのがベストプラクティスです。
が、KeyChain なにかと面倒くさい。

今までいい感じの KeyChain ラッパを知らなかったのですが、最近やっと見つけたのでご紹介します。

```objc
LUKeychainAccess *keychainAccess = [LUKeychainAccess standardKeychainAccess];
[keychainAccess setString:@"SOME_SECRET_STRING" forKey:@"SOMEKEY"];
```

読み出しは

```objc
[keychainAccess stringForKey:@"SOMEKEY"];
// => "SOME_SECRET_STRING"
```

ほとんど `NSUserDefaults` と使い方変わらないので違和感なく使えます。

Pod は

```rb:Podfile
pod 'LUKeyChainAccess'
```

https://github.com/TheLevelUp/LUKeychainAccess

ライセンスは MIT です。
[obsolete] Wandboxを確実に導入する


[141013] WandboxはCppCMSに移行しました。 https://gist.github.com/cielavenir/f72ae830d3b6ad80240d を実行するだけで導入できます。UbuntuTrsuty/CentOS7で確認済。

[追記] 初めから https://github.com/melpon/chef-melpon.org/tree/master/site-cookbooks/wandbox を使ったほうが良いです。この記事の内容は無意味です。笑

https://github.com/melpon/wandbox/ を<del>最速で</del>確実に導入します。

- Vagrantfileとwandbox.shを用意します。

```Vagrantfile
#coding:utf-8

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.provider :virtualbox do |vb|
    vb.memory=2048
  end
  config.vm.box = "trusty32"
  config.vm.box_url = "https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-i386-vagrant-disk1.box"
  #config.vm.provision "shell", inline: $script
end
```

```sh:wandbox.sh
#install apt
sudo apt-get update -y
sudo apt-get install -y git ghc haskell-platform g++ libboost-all-dev libcap-dev autoconf libtool automake
#git
git clone https://github.com/melpon/wandbox/
cd wandbox/
git submodule init
git submodule update
#cattleshed
cd cattleshed/
autoreconf -i
./configure
make install
sudo mkdir -p /tmp/wandbox /var/log/wandbox/ran /home/jail
sudo ln -s /lib /lib32
sudo mkdir /lib64
sudo mkdir /usr/lib64
sudo chown vagrant:vagrant /tmp/wandbox
#cattleshed -c /usr/local/etc/cattleshed.conf -c /usr/local/etc/cattleshed.conf.d/compilers.default
#kennel
cd ../kennel/
export PATH=$HOME/.cabal/bin:$PATH
cabal update
cabal install cabal-dev
cabal-dev install yesod-platform-1.2.5.2
cabal-dev install yesod-bin
cabal-dev install persistent-sqlite-1.2.1
cabal-dev install wai-eventsource-2.0.0
cabal-dev install dataenc
#cabal-dev/bin/yesod --dev devel -n
```

- 以下を実行します。

```
vagrant up
vagrant ssh
$ sh /vagrant/wandbox.sh # 最初の１回だけで良い
$ screen
  $ cattleshed -c /usr/local/etc/cattleshed.conf -c /usr/local/etc/cattleshed.conf.d/compilers.default
$ cd ~/wandbox/kennel
$ screen
  $ export PATH=$HOME/.cabal/bin:$PATH
  $ vi config/setting.yml # comment out Development's approot
  $ cabal-dev/bin/yesod --dev devel -n
```

- 本来は起動時にデーモンを立てるようChefで設定すべきだと思いますが、すみません。
Hubot | 自作Script | qiita_new.coffee - Qiitaの新規記事からランダムで取得した1件を表示する

# Hubot | 自作Script | qiita_new.coffee - Qiitaの新規記事からランダムで取得した1件を表示する

## 概要
qiita_new.coffee - Qiitaの新規記事からランダムで取得した1件を表示する

## 用途
* Qiitaの新規記事を読んでみたいお年ごろの時

## 仕様
### filename
qiita_new.coffee

### respond or hear
respond

### 起動メッセージ

* 正規表現

~~~coffee
/qiita new/i
~~~

## Qiita DevAPI
QiitaのAPIについては下記参照
http://qiita.com/docs/api#12

今回取得するのは新規投稿です。

https://qiita.com/api/v1/items

## ソースコード

~~~coffee
# Description
#   Output Qiita new article(random).
#
# Dependencies:
#   None
#
# Configuration:
#   None
#
# Commands:
#   hubot qiita new ... - Output qiita new article(random)
#
# Author:
#   tbpgr
module.exports = (robot) ->

  robot.respond /qiita new/i, (msg) ->
    robot.http("https://qiita.com/api/v1/items")
      .get() (err, res, body) ->
        articles = JSON.parse(body)
        article = msg.random(articles)
        msg.send "title:#{article['title']}"
        msg.send "url => "
        msg.send article['url']
        msg.send "author:#{article['user']['url_name']}"
~~~

## 試行結果

~~~
$ ./bin/hubot

Hubot> title:Project Eulerをhaskellで練習していく日記: Problem 2
Hubot> author:hiroshi75
Hubot> url =>
Hubot> http://qiita.com/hiroshi75/items/33fd2e780fc702b7266b
Hubot> hubot qiita new
Hubot> hogehoge
Hubot> title:Boot2Dockerを試す (Windows)
Hubot> author:pomutemu
Hubot> url =>
Hubot> http://qiita.com/pomutemu/items/72d0fb9cf8eed465da5d
Hubot> hubot qiita new
Hubot> hogehoge
Hubot> title:NutchでクロールしたWebページをSolrで検索する
Hubot> author:pika-shi@github
Hubot> url =>
Hubot> http://qiita.com/pika-shi@github/items/b7e8fb356aca244ba099
~~~

## 補足
今のところ、 npm で公開したりする予定はないので適当にGitHubに突っ込んでおきます。
https://github.com/tbpgr/hubot_scripts
gitattributes に lisp用正規表現を入れて diff を見やすくした


これとか

https://github.com/gonzojive/iolib/blob/master/.gitconfig

これとか(scala)

http://akiomik.hatenablog.jp/entry/2013/12/20/004111

これとか(各種正規表現詰め合わせ) を参考に。

https://gist.github.com/ruediger/5647207

結局自分で使ったのはこれ

```
[diff "lisp"]
# xfuncname = "^(\\(.*)$"
# xfuncname = "^(\\((cl-)?def(un|macro|method).*)$"
xfuncname = "^(\\((def|.*let|with-).*)$"
```

結果、diffはこうなります。いいね。defpackage/defvar/defun で区切られてる。

![Screenshot_from_2014-08-16 22:46:35.png](https://qiita-image-store.s3.amazonaws.com/0/6090/8024c935-bfbf-05df-a1bf-96d9e03d36ba.png)
スマホでArduino Uno + Arduino Ethernet Shield(Webサーバー)に接続

# やりたいこと

[Arduino Uno](http://www.amazon.co.jp/gp/product/B0044X2E5S/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B0044X2E5S&linkCode=as2&tag=chicagoblues-22)（[Arduino Ethernet Shield](http://www.amazon.co.jp/gp/product/B003YXPPD2/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B003YXPPD2&linkCode=as2&tag=chicagoblues-22)搭載）をWebサーバーにして、スマホでHTTPアクセスした時にLEDを点滅させる

## 事前準備

[Arduino Ethernet Shield](http://www.amazon.co.jp/gp/product/B003YXPPD2/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B003YXPPD2&linkCode=as2&tag=chicagoblues-22)は当然ながらLANケーブルと接続する必要があります。

スマホでLANケーブルなんて嫌なので、LANポートを備えたWifiルータなどを用いて
[Arduino Ethernet Shield](http://www.amazon.co.jp/gp/product/B003YXPPD2/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B003YXPPD2&linkCode=as2&tag=chicagoblues-22)とwifiルータをLANケーブルで接続し、wifiルータ経由でスマホから[Arduino Uno](http://www.amazon.co.jp/gp/product/B0044X2E5S/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B0044X2E5S&linkCode=as2&tag=chicagoblues-22)にアクセスすることにします。

自分はTAXANの[MeoBankSD ワイヤレスSDカードリーダー&WiFiルーター](http://www.amazon.co.jp/gp/product/B00A7JYQCM/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B00A7JYQCM&linkCode=as2&tag=chicagoblues-22)を持ってたので今回はこれを使いました。

![IMG_2310.JPG](https://qiita-image-store.s3.amazonaws.com/0/51849/3fb74ff3-d786-5cfa-225e-e0419d6e0429.jpeg)

## 回路

```
Arduinoの8番PIN - 200kΩ(100kΩ x 2本)のカーボン抵抗 - LED - GND
```
![IMG_2309.JPG](https://qiita-image-store.s3.amazonaws.com/0/51849/052a7ee3-e105-5b3d-9d81-ca2c47653cf9.jpeg)

## スケッチ(プログラム)

MACアドレスの部分は自分の持ってるArduino Ethernet Shieldに記載してあるものを記述して下さい

```c
// イーサネットライブラリを読み込み
#include <SPI.h>
#include <Ethernet.h>

// Arduino Ethernet ShieldのMACアドレスをセット
byte mac[] = {0x**, 0x**, 0x**, 0x**, 0x**, 0x**};

// サーバーとなるArduinoのIPアドレス
IPAddress ip(10, 10, 1, 101);

// HTTP通信をするのでサーバーのポートは80でセット
EthernetServer server(80);

// LEDライト用PIN番号
int ledPin = 8;

void setup() {
  pinMode(ledPin, OUTPUT);

  // LEDの明かりは初期状態では切っておく
  digitalWrite(ledPin, LOW);

  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  
  //イーサネット通信開始
  Ethernet.begin(mac, ip);

  //サーバ開始
  server.begin();
  
  // デバッグログ用
  Serial.begin(9600);
  
  // サーバーのIPアドレス
  Serial.println(Ethernet.localIP());
}

void loop() {
  // クライアントからのアクセス受信
  EthernetClient client = server.available();
  if (client) {
    // LEDの明かりを入れる 
    digitalWrite(ledPin, HIGH);
  }

  // サーバーがコネクションを早く閉じ過ぎる為、
  // Firefoxがプロトコル違反を報告するみないなので、ここでdelay(1)を入れておく
  delay(1);
  client.stop();

  // LEDの明かりを切る
  digitalWrite(ledPin, LOW);
}
```

## 最後に

以上でやりたいことが完了しました。

今後はこの辺を応用してArduinoをWebから操作していきたいと思います。
[Mac] Atomの基本的なショートカットキー



## 表記方法

| 記号 | 意味 |
|:----|:----|
| ^ | Ctrl |
| ⌥ | Option |
| ⇧ | Shift |
| ⌘ | Command |
| ⌫ | Delete |
| Enter | Enter |
| Space | Space |
| ←↑↓→ | 矢印キー | 
| tab | タブキー |
| `⌘A`-`B` | Command-A を押し、全てのキーを離した後で B を押す |

## 備考

- アルファベットは大文字で書く

# 1. 一般

| 操作 | 備考 | 覚え方 |
|:----|:----|:----|
| ⌘⇧P | コマンドパレットを開く/閉じる | Command `P`alette |
| ^⇧L | 言語の選択 (シンタックスハイライトの変更) | |


# 2. カーソル移動

## 2-1. OS共通

| 操作 | 備考 | 覚え方 |
|:----|:----|:----|
| ^F | カーソルを1文字右へ移動 | `^F`orward |
| ^B | カーソルを1文字左へ移動 | `^B`ack |
| ^N | カーソルを次の行へ移動 | `^N`ext line |
| ^P | カーソルを前の行へ移動 | `^P`revious line |
| ⌘↑ | ファイルの先頭へ移動 |  |
| ⌘↓ | ファイルの末尾へ移動 |  |

## 2-2. Atom

| 操作 | 備考 | 覚え方 |
|:----|:----|:----|
| ⌥B | 単語の先頭へ移動 | `⌥B`ack |
| ⌥F | 単語の末尾へ移動 | `⌥F`orward |
| ^A | 行頭へ移動 | ABCDE...の先頭のA |
| ^E | 行末へ移動 | `^E`nd |
| ^G | 行を指定して移動 | `^G`oto |
| ^M | 括弧の先頭へ移動 |  |

# 3. 選択

カーソル移動のショートカットに`⇧`を追加すればだいたい使える。

| 操作 | 備考 | 覚え方 |
|:----|:----|:-----|
| ⌥⇧B | 単語の先頭まで選択 | `⌥⇧B`ack |
| ⌥⇧F | 単語の末尾まで選択 | `⌥⇧F`orward |
| ^⇧W | 単語全体を選択 | `^⇧W`ord |
| ^⇧A | 行頭まで選択 | ABCDE...の先頭のA |
| ^⇧E | 行末まで選択 | `^⇧E`nd |
| ^⇧N | 次の行の同じ位置まで選択 | `^⇧N`ext line |
| ^⇧P | 前の行の同じ位置まで選択 | `^⇧P`revious line |
| ⌘⇧↑ | ファイルの先頭まで選択 |  |
| ⌘⇧↓ | ファイルの末尾まで選択 |  |
| ⌘A | 全て選択 | `⌘A`ll |
| ⌘D | カーソル位置の単語を選択。または、選択範囲の文字列が次にマッチする箇所を選択して、マルチカーソル状態になる。 | `⌘D`uplicate |
| ^⌘G | カーソル位置の単語(または選択範囲の文字列)にマッチする箇所を全て選択。 |

# 4. 編集

# 4-1. 行

| 操作 | 備考 | 覚え方 |
|:----|:----|:----|
| ^⌘↑ | 現在行を上へ移動 |  |
| ^⌘↓ | 現在行を下へ移動 |  |
| ⌥⌫ | 単語の先頭まで削除 |  |
| ^K | 行末までを削除 | `^K`ill |
| ^⇧K | 現在行を削除 | `^⇧K`ill |
| ⌘⇧D | 現在行を複製 | `⌘⇧D`uplicate |
| ⌘J | 現在行の改行を削除 | HJKLのJ |
| ⌘Enter | 現在行の下に行を追加 |
| ⌘⇧Enter | 現在行の上に行を追加 |
| ⌘] | インデントをひとつ追加 |  |
| ⌘[ | インデントをひとつ解除 |  |
| ⌘/ | コメントアウト、またはコメントアウト解除 |  |

# 4-2. 単語

| 操作 | 備考 | 覚え方 |
|:----|:----|:----|
| ^T | カーソルの前後の1文字を入れ替える<br>例えば `Char` の `h` 後にカーソルがある状態で実行すると `h` と `a` か入れ替わって `Cahr` となる。 | `T`ranspose characters |
| ⌥⌫ | カーソル位置から単語の先頭まで削除 | |


# 4-3. ブロック

| 操作 | 備考 | 覚え方 |
|:----|:----|:----|
| ⌥⌘[ | カーソル位置のブロックをたたむ |
| ⌥⌘] | カーソル位置のブロックをひらく |
| ⌥⇧⌘[ | カーソル位置のひとつ上のブロックをたたむ |
| ⌥⇧⌘] | カーソル位置のひとつ上のブロックをひらく |

# 5. 検索／置換

| 操作 | 備考 | 覚え方 |
|:----|:----|:----|
| ⌘F | ファイルの中から文字列を検索 | `F`ind |
| ⌘⇧F | プロジェクト内のファイルから文字列を検索 | `F`ind |
| ⌘E | 選択中の文字で検索 | S`e`lect |
| ⌘R | シンボルを検索 | |
| ⌘T | プロジェクト内からファイルを検索 | |
| ⌘B | 開いているタブの中からファイルを検索 | |

# 6. プロジェクトファイルペイン

| 操作 | 備考 |
|:----|:----|
| ^0 | ファイルツリー/ファイル編集エリアのフォーカスを切り替える |
| `H` `J` `K` `L` | ファイル選択/フォルダの開閉 |
| A | ファイルの新規作成 |
| ⇧A | フォルダの新規作成 |
| D | ファイルのコピー |
| ⌥⌘¥ | ファイルツリーを開閉 |
| ⌫ | ファイル/フォルダ削除 |
| M | リネーム |
| `⇧⌘\`-`M` | 編集中のファイルのリネーム |
| ⇧⌘\ | 編集中のファイルを選択する |

# 7. パネル

| 操作 | 備考 |
|:----|:----|
| `⌘K`-`←` | パネルを分割 (分割する方向に合わせて矢印キーを変更する) |
| ⌘W | パネルを閉じる |

# 8. タブ

| 操作 | 備考 |
|:----|:----|
| ⌘N | 新規タブを追加 |
| ⌘⇧T | 最後に閉じたタブを復元 |
| `⌥⌘→` or `^tab` or `⌘⇧]` | 次のタブを選択 |
| ⌘F2 | 現在行をブックマーク/解除 |
| F2 | 次のブックマークへ移動 |


# 9. git関係

| 操作 | 備考 |
|:----|:----|
| ⌘⇧B | 変更したファイル／Gitでまだトラッキングしていないファイルを検索 |
| ⌥⌘Z | 現在の変更を破棄して最新バージョンをチェックアウトする |
| `⌥G`-`↓` | 次のDiffに移動する |
| `⌥G`-`↑` | 前のDiffに移動する |

# 10. 未分類

| 操作 | 備考 |
|:----|:----|
| ^⇧M | Markdownプレビューを開く |
New Relicを使ってる人に見て欲しい指標。「Apdex」

おそらくweb開発をしている会社で導入していない方が珍しいぐらい
利用されているNew Relic。
[New Reilic](http://newrelic.com/)
![qiita_1.png](https://qiita-image-store.s3.amazonaws.com/0/15812/ef05e524-3418-00a3-23e6-0b5ff938cb3f.png)


## Apdex(New Relic独自指標)
![qiita_2.png](https://qiita-image-store.s3.amazonaws.com/0/15812/73a27945-ee01-e38c-bc12-41cf53b77567.png)

この指標は
<b>管理画面のページ下</b>
にあるもので
New Relicが出しているユーザーの満足度を計測する指標です。

## Apdexの算出方法

###(500ms以内にかえってきたリクエスト + (500〜2000ms以内にかえってリクエスト/2))/トータルリクエスト

例：
- 200トータルリクエスト

- 500ms以内のリクエスト170

- 500〜2000ms以内のリクエスト20

- 2秒以内にかえってきたリクエスト10

であった場合
Apdex score は
#### 0.9: (170 + (20/2))/200 = 0.9
になります。

![qiita_3.png](https://qiita-image-store.s3.amazonaws.com/0/15812/b0a59186-dae3-2612-6317-2612143b5906.png)

### Apdex scoreが表す内容
- スコアが高い→ユーザーの満足度が高い
- スコアが低い→ユーザーの満足度が低い
Dashのスニペット機能をちゃんと使う


# はじめに

恥ずかしながら、せっかく[Dash](http://kapeli.com/dash)を有料で購入していながら、その機能をろくに使えていなかった。今になってDashのスニペット機能の使い方がだんだんわかってきたのでここにメモ。
目標は、同じことを二度も三度もググらないようになること。

# スニペット機能

スニペットの検索機能を使いやすくするためにいくつか工夫した。

## 1. Macのキーボードのグローバル設定で、`Ctrl + Space`をDash呼び出しに割り当てる。

たぶんデフォルトでそうなっていると思うけどメモ。Dashを開いた状態で`⌘ + ,`で設定画面を開き、Generalの Global search shortcutでDash呼び出しのグローバルキー設定を行なう。気に入らなければ既存のアプリと当たらない範囲で好きなだけ変えればよい。
![dash1.png](https://qiita-image-store.s3.amazonaws.com/0/20266/89f8b628-459b-60e3-2448-40e63efa7204.png "dash1.png")

もう一つのSearch using selected textの方は選択文字列が検索キーワードになるものだけど、今はこれは重視していない。各自で設定するよろし。

ついでながら、スニペットの保存場所はDropboxにしておくのがお勧め。複数のMac間でスニペットを共有できる。

## 2. スニペットの命名法を工夫

* スニペット名は必ずセミコロン`;`で始めること
Dashはキー操作をウォッチしているので、ターミナルを含むどんなアプリケーションでもスニペットが使用できる。頭にセミコロンのような記号を付けておかないと、たとえばメールを書いていて突然スニペットが動き出したりする。他の記号でもよいのかもしれないけど、セミコロンは日本語でまず使わないので向いている。

* スニペット名はアンダースコアで区切り、完全部分集合ができないようにすること
たとえば`;html5_min`と`;html5_min_meta`というスニペットを作ると、`;html5_min`と入力した途端に1つ目のスニペットが動き出すので、2つ目のスニペットが入力できなくなってしまう。完全部分集合にしないというのはそういうこと。やってみればすぐわかると思うけど。

追記: 完全部分集合にしなくても、スニペット末尾にたとえば`#`を置くと決めれば上のような気遣いをしないで済むことをTwitterで指摘いただきました。ありがとうございます！

* 直接呼び出したいスニペット名は短めに、メモ的なスニペットは長くなってもよいので検索キーワードを十分含んだスニペット名にする

自分はスニペットを2とおりに使っている。1つは、入力を楽にするためのキーボードマクロ的な使い方。これはスニペット名を短くして呼びやすくしておく。

2つ目はメモ的な使い方。会心のシェルスクリプトや複雑なgitコマンドなんかがこれ。この記事で説明しているのはこの2つ目の方。こちらは名前が長くなってもよいので後で検索しやすい名前を付けておく。
なお、入力しやすいようにタグ名は`rb`とか`js`のように短く、母音のないものにしておきたい。

* スニペットのタグ名と同じ単語を、セミコロンの直後に置く

これが一番肝心な工夫。図を見てもらうとわかると思うけど、`css`というタグの中にあるスニペットは全部`;css_`で始まっている。タグにも`css`があり、スニペット名にも`css`とあるのは一見無駄に見えるのだけど、これが大事。

![dash2.png](https://qiita-image-store.s3.amazonaws.com/0/20266/bd3b755f-3005-9e5e-f6fe-17d37a7b6776.png)

## 3. Dashのスニペット検索をカスタマイズ

`⌘ + 3` (または`⌘ + 2`) で表示されるスニペット検索画面の検索ウィンドウに小さな黒い三角形 (図) があり、これをクリックするとスニペットの検索条件をいろいろ設定できる。これがなかなか気付きにくい。

![dash3.png](https://qiita-image-store.s3.amazonaws.com/0/20266/9e267d9d-fd6f-bb84-9f69-b657c4950445.png "dash3.png")

ポイントは、Snippets Onlyのプロファイルで、スニペットの検索時にDocsetを検索しないようにすること。スニペットとDocsetを同時に検索するとうざいので。
Snippets Onlyプロファイルで`+`を押して`Search Keyword`を選び、セミコロン`;`を入力する。これで、検索キーワードにセミコロンがあればスニペットしか検索しなくなる。よしよし。

## 準備完了

以上で準備が整った。`ctrl + space`でDashを呼び出す。当然ながらDashは起動時に入力フォーカスを検索窓に置いてくれている。スニペットを検索するにはまず`;`を入力する。続いてタグ名(`css`とか)を入力すると、その名前を持つスニペットだけが高速でインクリメンタルで絞り込まれる。

それにさらに続けてキーワードを入力すると、スニペット名がさらにインクリメンタルに絞り込まれる。ここで重要なのは「**入力をスペースで区切らない**」こと。スペースで区切ると、以後の入力はスニペット内の検索に切り替わるので、絞り込みにならなくなる。逆に言えば、Docsetの検索ではスペースで区切ることでそのままドキュメント内を検索できる。

その状態で上下キーで探し、見つけたら`Enter`を押せば貼り込まれる。

この検索のありがたいところは、スニペット名に文字列さえあれば、スニペット内の位置とは無関係に絞り込んでくれ、単語の一部であってもよいところ。

![dash7.gif](https://qiita-image-store.s3.amazonaws.com/0/20266/dd34ab0a-4e45-2be2-28bf-87b61f28a72b.gif)

使い方がわかってくると、この爆速ぶりが病み付きになる。スニペットでは言語を指定するとシンタックスハイライトもやってくれる。

vimのneosnippetのようにエディタと一体化したスニペットよりは1ステップ増えるけど、どんなところでも使えるメリットはそれを補ってあまりある。

後はスニペットにどしどし登録するだけ。いつの日か同じことを2度ググらなくて済む日まで。(Evernoteがこのぐらい高速に検索できればそっちにするのだけど)。
Leaflet.TileLayer.Filter を使う

https://github.com/humangeo/leaflet-tilefilter/wiki に用意されている Leaflet.TileLayer.Filter を試しに使ってみた。
→ http://handygeospatial.github.io/mapsites/2014/08/09/

```html
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
    <title></title>
    <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.css"/>
    <script src="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.js"></script>
    <script src="http://handygeospatial.github.io/mapsites/js/leaflet-hash.js"></script>
    <script src="http://handygeospatial.github.io/mapsites/js/TileLayer.GeoJSON.js"></script>
    <script src="http://handygeospatial.github.io/mapsites/js/TileLayer.Filter.min.js"></script>
    <style>
      body {padding: 0; margin: 0}
      html, body, #mapdiv {height: 100%; width: 100%;}
      .leaflet-container {background: #000;}
    </style>
  </head>
  <body>
    <div id="mapdiv">
    <script>
      var std = L.tileLayer(
        'http://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png',
        {attribution: "地理院タイル（標準地図）",
         filter: function() {
           new L.CSSFilter(this, {filters: ['invert(100%)']}).render();
         }});

      var map = L.map('mapdiv', {
        center: [35.3622222, 138.7313889], zoom: 5,
        layers: [std]});

      var hash = L.hash(map);
      L.control.layers({'地理院タイル（標準地図）': std}).addTo(map);
    </script>
  </body>
</html>
```
今後、filter にさまざまなフィルタをあてていきたい。
フィルタの種類には、次のふたつがある。

- L.CSSFilter
- L.CanvasFilter
Project Eulerをhaskellで練習していく日記: Problem 2

# 問題２
1,2で始まるフィボナッチ数列のうち、4000000未満の偶数項の和を求めよ。
# 回答
```hs
fib = [1,2] ++ (zipWith (+) fib $ tail fib)

main = do 
     print $ sum $ filter even $ takeWhile  (<4000000) fib
```
# 感想
haskellでは配列の定義自体に再帰が使えることは驚くばかり。
Windows8.1にVirtualBox + Vagrant + Chef + Berkshelf構築メモ

# 事前準備に下記を実施

* RubyInstallerでRubyのインストール(ruby 2.0.0p481 (2014-05-08) [x64-mingw32]で)
* DevelopmentKitのインストール
* Gem経由でBundlerのインストール(Bundler version 1.6.5)

# VirtualBoxのインストール

バージョンは4.3.12を使用
(4.3.14も出ていたが、2014-08-16現在ではWindows8.1環境では起動できず)

# Vagrantのインストール

Boxは下記を使用した
https://oss-binaries.phusionpassenger.com/vagrant/boxes/latest/ubuntu-14.04-amd64-vbox.box

```filename:command
> vagrant box add [BOX名] [BOX URL]

> vagrant box list
rails (virtualbox, 0)

> cd [BOX格納ディレクトリ]
> vagrant init [BOX名]
```

下記を追記する

```filename:Vagrantfile
config.vm.box = "[BOX名]"
```

追記後仮想マシンを起動する

```filename:command
> vagrant up
> vagrant ssh
```

* VT-x/AMD-Vを有効化されていない的なエラーが出たため、BIOSから有効化したら起動できた

下記を追記する

```filename:Vagrantfile
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "private_network", ip: "192.168.33.xxx"
config.ssh.forward_agent = true
config.vm.synced_folder "[共有フォルダパス]", "[仮想マシンのマウント先]"
```

* Vagrantfileの中身はRubyのため、パスの円マークはエスケープが必要

```filename:command
> vagrant reload
```

# VagrantとChefを連携させる

## Chef, Berkshelfのインストール

```filename:command
> Bundle init
```

```filename:Gemfile
# A sample Gemfile
source "https://rubygems.org"

gem "chef","11.12.4"
gem "berkshelf","3.1.2"

gem "knife-solo"
gem "win32-process"
gem "windows-pr"
```

* `win32-process`と`windows-pr`はknife-solo実行時にエラーが出たため追加

DevelopmentKitの不具合？でTarが利用できず、Berkshelfのインストールでエラーが発生するため、
http://gnuwin32.sourceforge.net/packages/gtar.htm
から
http://gnuwin32.sourceforge.net/downlinks/tar-bin-zip.php
http://gnuwin32.sourceforge.net/downlinks/tar-dep-zip.php
をDLし、解答したファイルをDevelopmentKitのインストール先に移しておく

```filename:command
> Bundle install
```

RubyでOpenSSHを使用する際に証明書のエラーが出るため、環境変数`SSL_CERT_FILE=[CA局の証明書パス]`を登録必要がある
(証明書は http://curl.haxx.se/ca/cacert.pem を保存する)

```filename:Berkshelf実行時のエラーメッセージ
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
```

Vagrantファイルと同じディレクトリにBerksfileを作成する
(サンプルとしてgitをインストール)

```filename:Berksfile
source "https://api.berkshelf.com"

cookbook '[クックブック名]'
```

下記コマンドでクックブックをダウンロード

```filename:command
> bundle exec berks vendor [格納ディレクトリ名]
```

VagrantファイルにChef-soloの記述を追加

```filename:Vagrantfile
config.vm.provision "chef_solo" do |chef|
  chef.cookbooks_path = ["[クックブック格納ディレクトリ]"]
  chef.add_recipe '[クックブック名]'
end
```

仮想マシンに反映

```filename:command
> vagrant reload
> vagrant provision
```

仮想マシンにログインして`git --version`で確認
メモ：UINavigationBarの当たり判定が下にはみ出す、その理由


以前、[UINavigationBarのleftBarButtonItem の当たり判定が見た目よりも広かった件](http://qiita.com/paming/items/2b91caea5cf25a9886c0)なんてのを書いていました。
この現象をもっとちゃんと調べて書いてあるブログ記事があります。[iPhone の当たり判定を検証した](https://www.sociomedia.co.jp/4152)
UINavigationBarに乗せるBarButtonItemは、当たり判定がはみ出しています。シンプルなUIだと良いのですが、NavigationBarの真下に何か配置すると、下の方を押したつもりでBarButtonItemが反応する事があって、「押しにくい」と言われる事があります。

下にはみ出している当たり判定は、UINavigationBarのhitTest:を上書きして回避出来る
----
[UINavigationBarのleftBarButtonItem の当たり判定が見た目よりも広かった件](http://qiita.com/paming/items/2b91caea5cf25a9886c0)だと、UINavigationBarにaddSubviewして制御しようとしてます。他の方法で当たり判定を制御する実装がStack Overflowに紹介されていました。[Why does UINavigationBar steal touch events? - Stack Overflow](http://stackoverflow.com/questions/9079907/why-does-uinavigationbar-steal-touch-events) この実装はUINavigationBarのhitTestを上書きしています。

```
@interface HitTestNavigationBar : UINavigationBar
@end
@implementation HitTestNavigationBar
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    NSLog( @"hitTest point.y=%.1f",point.y);
    if ([self pointInside:point withEvent:event]) {
        self.userInteractionEnabled = YES;
    } else {
        self.userInteractionEnabled = NO;
    }
    UIView *view = [super hitTest:point withEvent:event];
    return view;
}
@end
```

このコード、self.userInteractionEnableを変えてるだけ、なのだけど、これで上手く動作します。
ではなぜ、userInterfaceEnableを変えるだけで当たり判定が変わるのでしょうか？


UINavigationBarのuserInteractionEnableの状態で、pointの値に補正が入る
----
まず、UINavigationBarのhistTestは、「２度」呼ばれます。
そして２度目に呼ばれたときのpoint.yの値が、userInteractionEnableの状態で変わります。

userInterfactionEnable=NOの時は、一度目と二度目でpoint.yの値は同じです。

```
2014-08-16 18:07:23.846 HitTest[79584:60b] hitTest point.y=37.0   // NavigationBarの中でタップ、1度目
2014-08-16 18:07:23.849 HitTest[79584:60b] hitTest point.y=37.0   // NavigationBarの中でタップ、2度目
2014-08-16 18:07:26.692 HitTest[79584:60b] hitTest point.y=49.5   // NavigationBarの外でタップ、1度目
2014-08-16 18:07:26.693 HitTest[79584:60b] hitTest point.y=49.5   // NavigationBarの外でタップ、2度目

```

しかしuserInterfactionEnable=YESの時は、UINavigationBarの外側でのタップの場合、二度目のpoint.yの値が補正がかかっているようです。

```
2014-08-16 18:09:52.293 HitTest[79743:60b] hitTest point.y=37.0  // NavigationBarの中でタップ、1度目
2014-08-16 18:09:52.296 HitTest[79743:60b] hitTest point.y=37.0  // NavigationBarの中でタップ、2度目
2014-08-16 18:09:56.658 HitTest[79743:60b] hitTest point.y=49.0  // (A)NavigationBarの外でタップ、1度目
2014-08-16 18:09:56.659 HitTest[79743:60b] hitTest point.y=34.0  // (B)NavigationBarの外でタップ、2度目
```

この(A)が補正無しのpoint.yで、(B)が補正されたpoint.yです。NavigationBarの下のタップでは-15されるようです。この-15の補正が入るので、NavigationBarの真下でのタップもNavigationBarの「中」でのタップと認識させてるようです。

この補正、下だけでなくて「上」にも効いてるようです。


なんでこんな事してるのAppleさん
----
ユーザビリティを上げるために当たり判定を広げてのだとは思うのだけど、広げ方が「histTestに渡すpoint.yに補正を入れる」って作り方は勘弁してください分からなかったです。
[Swift]UserAgentを設定する

##UIWebViewを使うときにUserAgentを設定する(Swift)

iPhoneのUIWebViewで見るときだけ違うものを表示させたいときに便利なのがUserAgent
これを設定することでサーバーサイドでUIWebViewでアクセスしていることを判定できます。



```swift:AppDelegate.swift
func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
        // Override point for customization after application launch.
        
   //UserAgentを上書き
   let webView:UIWebView = UIWebView()
   webView.frame = CGRectZero
   let userAgent:String! = webView.stringByEvaluatingJavaScriptFromString("navigator.userAgent")
   let userAgentStr = "from UIWebView"
   let customUserAgent:String = userAgent.stringByAppendingString(userAgentStr)
        
   let dic:NSDictionary = ["UserAgent":customUserAgent]
   NSUserDefaults.standardUserDefaults().registerDefaults(dic)
      
   return true
}

```

今回"from UIWebView"となっているところに好きなUserAgentを設定すればokです。
AFNetworkingの処理をViewControllerに書かないでModelに書きたいとき

ってどうしてます？

自分は以下に示すようにやっているのですが、良い・悪い判断できないのでコメントいただけると助かりますm(_ _)m

### Model

```obj-c:Hoge.h
#import "AFHTTPSessionManager.h"
@interface Hoge : NSObject
+ (Hoge*)sharedClient;
- (void)hogeWithId:(NSString *)hogeId completion:(void (^)(NSDictionary *results, NSError *error))block;
@end
```

```obj-c:Hoge.m
#import "Hoge.h"

static NSString * const APIBaseURLString = @"http://example.com/";

@implementation Hoge

+ (Hoge*)sharedClient
{
    static Hoge* _sharedClient = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedClient = [[Hoge alloc] init];
    });
    return _sharedClient;
}

- (NSURL *)url
{
    return [[NSURL URLWithString:APIBaseURLString] URLByAppendingPathComponent:@"api/hoges"];
}

- (void)hogeWithId:(NSString *)hogeId completion:(void (^)(NSDictionary *results, NSError *error))block
{
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager GET:[[self url] absoluteString]
       parameters:nil
          success:^(NSURLSessionDataTask *task, id responseObject) {
              if (block) block(responseObject, nil);
          }
          failure:^(NSURLSessionDataTask *task, NSError *error) {
              if (block) block(nil, error);
          }];
}
@end
```

### Controller

```obj-c:MainViewController.m
#import "MainViewController.h"
#import "Hoge.h"

<略>

- (IBAction)getHoge:(id)sender {
    NSString* id = _hogeId.text;

    [[Authentication sharedClient]
     hogeWithId:id
     completion:^(NSDictionary *results, NSError *error) { //通信完了時のViewなどの処理はblockにして渡す
         if (error) { NSLog(@"Error %@", error); return; }
         if ([results[@"success"] isEqual: @(YES)]) {
             // 成功時の処理
         } else {
             // 失敗時の処理
         }
     }];
}

<略>

```
[Rails]条件によって異なるlayoutを使い分けたいとき


たとえばユーザが一般ユーザか管理ユーザかとか、多言語対応してたりしてる時に同一controllerだけど異なるlayoutを呼び出したいときある。そんな時はこうするのがいいみたい。

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
 def determine_layout
   if is_admin?
     "admin"
   else
     "application"
   end
end
```

```ruby:app/controllers/some_controller.rb
class ApplicationController < ApplicationController
  layout :determine_layout
  ...
end
```

参考：http://apidock.com/rails/ActionController/Layout/ClassMethods/layout
Adobe AIRのBitmapDataをObjectiveCでUIImageにするANEなやり方

```objective-c:BitmapData2UIImage.m
FREObject bitmapData2UIImage(FREContext ctx, void* funcData, 
    uint32_t argc, FREObject argv[]) {

    FREObject data = argv[0];
    FREBitmapData2 bitmapData;
    
    FREAcquireBitmapData2(data, &bitmapData);
    
    int width = bitmapData.width;
    int height = bitmapData.height;
    CGDataProviderRef provider = CGDataProviderCreateWithData(
                NULL, bitmapData.bits32, (width * height * 4), NULL);
    
    int bitsPerComponent = 8;
    int bitsPerPixel = 32;
    int bytesPerRow = 4 * width;
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo;
    
    if (bitmapData.hasAlpha) {
        if (bitmapData.isPremultiplied) {
            bitmapInfo = 
                kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst;
        } else {
            bitmapInfo = 
                kCGBitmapByteOrder32Little | kCGImageAlphaFirst;
        }
    } else {
         bitmapInfo = 
             kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst;
    }
        
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
    CGImageRef imageRef = CGImageCreate(width, height, 
        bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef,
        bitmapInfo, provider, NULL, NO, renderingIntent);
        
    UIImage *image = [UIImage imageWithCGImage:imageRef];
    FREReleaseBitmapData(data);
    return NULL;
}
```
cronからbundle exec...はsu - <USER> -lc ...が一番便利

って自分は思ったのですが、みなさんはどうやってるんでしょうか？

```cron
0 */1 * * * root su - <USER_NAME> -lc "cd /home/<USER_NAME>/yourproject_path && bundle exec ruby hoge.rb" >> /var/log/yourproject/cron/hoge.log 2>&1
```

ちなみに実行するユーザーである`<USER_NAME>`の`.bash*`とかにruby関連の設定が書いてある前提です。

rbenvだったら

```bash:.bash_profile
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

[xbuild](https://github.com/tagomoris/xbuild)とかで入れてるなら

```bash:.bashrc
export PATH=$HOME/local/ruby-2.1/bin:$PATH
```
CoreOS上のコンテナはnsenterでログインする

#Docker1.3, またはCoreOS 472.0.0 以上の方へ
docker execコマンドで入れるようになりました。こっちの方が便利。
[Qiita - コンテナに入りたい？それ docker exec でできるよ](http://qiita.com/yosisa/items/a5670e4da3ff22e9411a)

#参考ページ
[RHEL/CentOS 6で Docker に nsinit/nsenter する](http://qiita.com/comutt/items/2f873a0e7eaddd3f647e)

[How to enter a Docker container](https://blog.codecentric.de/en/2014/07/enter-docker-container/)

#あらまし
CoreOS上にて動作中のコンテナに入る方法を模索してたけど、
sshやnsinitを使うよりも、nsenterが簡単との話。
で、CoreOSはnsenterが標準で入っているので、ワンライナーで接続できる。

```
$ sudo nsenter --target $(docker inspect --format '{{.State.Pid}}' コンテナID) --mount --uts --ipc --net --pid
```

コンテナIDを動作中の環境のものに変更してください。
例によって頭3文字程度でもOK。

#結論
Docker運用はCoreOSが一番楽なんじゃないかな！かな！

#念のため
読みはエヌエスエンターらしい。
危うく「コンテナにはエヌセンターで入るといいですよ(ドヤァ……」と語る所だったので注意。
https://github.com/jpetazzo/nsenter
SwiftでTabBarの選択時の色とフォントを変える


##SwiftでTabBarの選択時の色とフォントを変える方法

```swift:TabBarController.swift
override func viewDidLoad() {
        super.viewDidLoad()
        let font:UIFont! = UIFont(name:"HelveticaNeue-Bold",size:10)
        let selectedAttributes:NSDictionary! = [NSFontAttributeName : font, NSForegroundColorAttributeName : UIColor(red:0.13, green:0.55, blue:0.83, alpha:1.0)]

      UITabBarItem.appearance().setTitleTextAttributes(selectedAttributes, forState: UIControlState.Selected)

        UITabBar.appearance().tintColor = UIColor(red: 0.13, green: 0.55, blue: 0.83, alpha: 1.0)
}
```

![スクリーンショット 2014-08-16 17.24.27.png](https://qiita-image-store.s3.amazonaws.com/0/48286/2a178232-687b-3339-e779-82665ba39ebe.png)


これで簡単に色を変えることができます。
俺のJunosコマンドリファレンス（随時更新）

# Junos コマンド

##Config参照

```lang:srx
#Config
show configure
#流し込み形式
show configure | display set
#すべて表示
show configure | display set | no-more
```

##設定

Configをそのまま流し込みたい場合
```lang:srx
root# load override terminal
```

Configをすべて削除する
パスワードの設定を行わないとCommitできないので注意

```lang:srx
root# delete
This will delete the entire configuration
Delete everything under this level? [yes,no] (no) yes

set system root-authentication encrypted-password "ホゲホゲ"
```

Commit履歴保存領域
```lang:srx
set system max-configuration-rollbacks 49
```



##管理機能

```lang:srx
#SSH
set system services ssh
```

##DHCP設定

```lang:srx
#GW
set system services dhcp router 192.168.11.1
#配布アドレスレンジここから
set system services dhcp pool 192.168.11.0/24 address-range low 192.168.11.10
#配布アドレスレンジここまで
set system services dhcp pool 192.168.11.0/24 address-range high 192.168.11.100
#DNS 
set system services dhcp pool 192.168.11.0/24 name-server 8.8.8.8
#DNS
set system services dhcp pool 192.168.1.0/24 name-server 8.8.4.4
#3時間リリース
set system services dhcp pool 192.168.11.0/24 default-lease-time 10800
#DHCPのセキュリティ設定
set security zones security-zone trust interfaces ge-0/0/1.0 host-inbound-traffic system-services dhcp
```

確認

```lang:srx
#プール
show system services dhcp pool
#Dropなどの情報数値
show system services dhcp statistics
#配布一覧
show system services dhcp binding
```

##ルーテッドポート設定
```lang:srx
set interfaces ge-0/0/0 unit 0 family inet address 192.168.10.2/24
set interfaces ge-0/0/1 unit 0 family inet address 192.168.11.1/24
```

確認

```lang:srx
show interface terse
show interfaces terse detail
show interfaces terse extensive
show interface <IF>
```
image onloadをfor文で回す際の注意


割りとjavaScriptでハマりがちな定番例かとは思いますが、
ご多分に漏れず僕もハマってしまいました。
for文の中に非同期処理を入れる際の落とし穴です。

例えば、Imageオブジェクトのonloadメソッドのような非同期処理を
for文の中に入れようとすると、

```
for(var i = 0; i < 5; i++){
	img[i] = new Image();
	img[i].onload = function(){
		console.log(i);
	}; 
	img[i].src = url;
}

```

とかって最初は書いちゃうかと思います。
これで、望まれる結果としてはimageのloadが完了した順に

3
4
2
1
5

とかって出力してほしいんですが、実際には

5
5
5
5
5

という結果が出力されます。

これは、console.logが出力している変数iが値そのものではなく、
あくまで参照値としてのiであるためです。
したがって、onloadが発火する際にはfor文が最後まで回りきっているため、全て5が出力されてしまいます。

これを解決するには、もうひとつ関数を作ってiを引数として渡してあげる必要があります。

すなわち、


```
for(var i = 0; i < 5; i++){
	img[i] = new Image();
	img[i].onload = finish(i);
	img[i].src = url;

	function finish(i){
		return function(){
			console.log(i);
		}
	}
}

```

とすることで、望むべき結果を得ることができます。

このfinish関数内のconsole.logは出力している変数iは、
参照値ではなく値そのものを出力しているためです。
MKMapView のユーザートラッキングモードを標準マップアプリと同等に実装する

iOS 8 がそろそろ出る、というタイミングでずいぶんレガシーな話ですいません。iOS 5 の頃からある MKUserTrackingMode をどう扱えば標準マップアプリと同等になるか、の実装手順メモです。ここはアプリによって違うことはあまりなく、だいたいワンパターンだと思うので。

##ユーザートラッキングモードとは

ユーザートラッキングモードというのは、標準マップアプリにも Google Maps アプリにもついている、

![trackingmode.jpg](https://qiita-image-store.s3.amazonaws.com/0/3180/7b36e06c-e489-0ffd-355b-a7461481f4b4.jpeg)

こういうボタンで順番に切り替わるもので、MKMapView では以下の3種が定義されてます。

- `MKUserTrackingModeNone` ・・・ユーザーの現在位置に応じてマップを更新しない
- `MKUserTrackingModeFollow` ・・・ユーザーの現在位置に応じてマップを更新する
- `MKUserTrackingModeFollowWithHeading` ・・・ユーザーの現在位置と **進行方向** に応じてマップを更新する

ちなみに上の写真は自分の進行方向に応じて地図の向きが変わる `MKUserTrackingModeFollowWithHeading` です。


##ボタン画像変更メソッド

モードが切り替わったときにボタンの画像を切り替えるメソッドを用意します。

```
- (void)updateUserTrackingModeBtn:(MKUserTrackingMode)mode {
    
    NSString *filename = nil;
    
    switch (mode) {
        case MKUserTrackingModeNone:
        default:
            filename = @"tracking_no";
            break;
        case MKUserTrackingModeFollow:
            filename = @"tracking_follow";
            break;
        case MKUserTrackingModeFollowWithHeading:
            filename = @"tracking_heading";
            break;
    }
    
    [self.userTrackingModeBtn setImage:[UIImage imageNamed:filename]
                              forState:UIControlStateNormal];
}
```


##ボタンのアクション

モード切り替えボタンのアクションとして、MKMapView の `userTrackingMode` プロパティを順番に変更し、それに応じてボタンの画像を変更するメソッドを用意します。

```
- (IBAction)userTrackingModeBtnTapped:(id)sender {
    
    MKUserTrackingMode mode;
    
    switch (self.mapView.userTrackingMode) {
        case MKUserTrackingModeNone:
        default:
            mode = MKUserTrackingModeFollow;
            break;
        case MKUserTrackingModeFollow:
            mode = MKUserTrackingModeFollowWithHeading;
            break;
        case MKUserTrackingModeFollowWithHeading:
            mode = MKUserTrackingModeNone;
            break;
    }

    [self updateUserTrackingModeBtn:mode];
    [self.mapView setUserTrackingMode:mode animated:YES];
}
```


##初期設定

`viewDidLoad` あたりで、初期値にしておきます。

```
[self.mapView setUserTrackingMode:MKUserTrackingModeNone animated:YES];
[self updateUserTrackingModeBtn:MKUserTrackingModeNone];
```


##ユーザー操作による変更

標準マップアプリを見てると、少しマップを動かすと、そのとき MKUserTrackingMode が `MKUserTrackingModeFollow` であっても `MKUserTrackingModeFollowWithHeading` であっても、`MKUserTrackingModeNone` に **強制的に戻される**ことがわかります。

これを実現するのに、最初は自分で `mapView:regionDidChangeAnimated:` でマップ移動をフックしてモード切り替えするのかなーと思ったのですがそうではなく、 **MKMapView内部で勝手に切り替えてくれている** ようです。

というわけで、 `mapView:didChangeUserTrackingMode:animated:` でモード切り替えをフックし、ボタン画像をそれに適したものに変更すればOK。

```
- (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated {
    [self updateUserTrackingModeBtn:mode];
}
```
Google Maps Androidの利用に必要なものがいろいろ増えてた

久しぶりに用事があって、[Android API プログラミング・リファレンス](http://www.amazon.co.jp/dp/4839943230)
のGoogle Maps Androidのサンプルを使ってみたのですが、エラーが出て全く動作しなくなってました。

いくつか設定を変更すると解決したので、とりあえずメモ。

# メタデータを追加

まず一つ目は、メタデータの追加。このままの状態でアプリを起動すると、ログに次の文言が表示されます。

> 08-16 14:19:21.638: E/AndroidRuntime(30325): FATAL EXCEPTION: main
> 08-16 14:19:21.638: E/AndroidRuntime(30325): Process: jp.android.booksample.mapsample, PID: 30325
> 08-16 14:19:21.638: E/AndroidRuntime(30325): java.lang.RuntimeException: Unable to start activity ComponentInfo{jp.android.booksample.mapsample/jp.android.booksample.mapsample.MapActivity}: java.lang.IllegalStateException: The meta-data tag in your app's AndroidManifest.xml does not have the right value.  Expected 5089000 but found 0.  You must have the following declaration within the <application> element:     <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
> ・・・ 以下略 ・・・

詳しくはログの通りなのですが、Google Maps Androidを使う場合、いつのバージョンからかメタデータとして、新しい指定が必要になったようです。

* 名前：com.google.android.gms.version・値：@integer/google_play_services_version

なので、書籍に書かれている「com.google.android.maps.v2.API_KEY」に加えて、メタデータとして「com.google.android.gms.version」を追加します。

![メタデータを追加](https://qiita-image-store.s3.amazonaws.com/0/14499/d52cbc21-aec4-d45e-8561-4323c283fd54.png)

# 権限の追加
次にアプリを起動すると、次のようなログが出力されました。

> 08-16 15:23:05.798: E/AndroidRuntime(12819): FATAL EXCEPTION: main
> 08-16 15:23:05.798: E/AndroidRuntime(12819): Process: jp.android.booksample.mapsample, PID: 12819
> 08-16 15:23:05.798: E/AndroidRuntime(12819): java.lang.RuntimeException: Unable to start activity ComponentInfo{jp.android.booksample.mapsample/jp.android.booksample.mapsample.MapActivity}: java.lang.SecurityException: The Maps API requires the additional following permissions to be set in the AndroidManifest.xml to ensure a correct behavior:
> 08-16 15:23:05.798: E/AndroidRuntime(12819): \<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/\>
> 08-16 15:23:05.798: E/AndroidRuntime(12819): \<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/\>

こちらも指示の通り、次の権限を追加します。

* android.permission.ACCESS_NETWORK_STATE
* android.permission.WRITE_EXTERNAL_STORAGE

![権限の追加](https://qiita-image-store.s3.amazonaws.com/0/14499/e4e873e5-2196-615d-7376-243e7135c375.png)

このふたつを行うと、とりあえずアプリは今までどおり起動できるようになります。

![アプリが動いた！](https://qiita-image-store.s3.amazonaws.com/0/14499/94334b80-4d36-d79b-8914-1d771b51bc58.png)

# まとめ
というわけで、Google Maps Androidには以下の権限・メタデータが必要になったようです。動かないという人は、試してみてね。

## メタデータ
* 名前：com.google.android.gms.version・値：@integer/google_play_services_version

## 権限
* android.permission.ACCESS_NETWORK_STATE
* android.permission.WRITE_EXTERNAL_STORAGE
WAKATE Wanted! 情報科学若手の会の紹介

皆さん、こんにちは、@sowawaです。
今日は、**情報処理学会プログラミングシンポジウム委員会主催**の[情報科学若手の会](http://wakate.org)の紹介です。

毎年、暑さがまだまだ厳しい9月頃に開催していて、今年で47回を迎える超々歴史ある情報系若手コミュニティです。私は3年前から幹事を拝命させていただきました。

例年は、招待講演と若手特別講演（「若手」の方をお招きする講演）の2本の招待講演を中心に参加者講演も含めて3日間の合宿形式で行われています。今年も例年と同様の構成で行われる予定です。

## 2013年（去年）の情報科学若手の会

私の記憶をさかのぼり去年の様子を振り返ってみましょう。

2013年の第46回は、招待講演にバーチャルアイドル**初音ミク**で有名な**歌声合成技術VOCALOID**と新しい音楽についてヤマハ株式会社の剣持さんにご講演いただきました。ニコニコ動画を超えて活躍する初音ミクにふさわしく堅苦しい話抜きのライブコーディングならぬライブ打ち込みによる生演奏をご披露頂きました。もちろん、情報科学若手の会ですので、美しくより自然な歌声を作るための波形を合成についてもご解説頂きました。剣持さんが実際にVOCALOIDを世に送り出すまでのキャリアについてもお話いただき趣味の音楽を仕事とされていることもお話いただきました。これから研究を始めたり社会人になる情報系の若手のキャリアをどのように歩んでいくのかという部分で大変勉強になります。VOCALOIDがピアノなどと同じ一つの楽器として多くの人に演奏されるようになったと伺ったことは大変印象に残っています。

![初音ミク](https://qiita-image-store.s3.amazonaws.com/27/552/b479c60b-31e8-bd2e-0218-0bf6ce863369.jpeg)

若手特別講演には伏見さんには**enchant.js**についてご講演いただきました。伏見さん達によって開発されているenchant.jsはモバイルフォンやパーソナルコンピュータのブラウザで動作するゲームやアプリケーションを作成できるフレームワークです。講演ではenchant.jsを使ったプログラミング教育についてご講演いただきました。簡単に使うこととができるためだれでも使えるプログラミングを学ぶことができ、身近にプログラミングが学べるということを熱く語っていただきました。

![enchant.js](https://qiita-image-store.s3.amazonaws.com/27/552/473fd919-ba70-21c4-5553-c3a90862c4e1.png "スクリーンショット 2014-08-16 15.02.38.png")

参加者によるご講演では、セキュリティやCPU、コンパイラなどの情報科学若手の会にぴったりのトピックから、GoogleやMixiのような企業につとめているエンジニアの方にもご講演いただきました。異色の発表としては情報科学を専攻される博士課程の学生でありながら個人ブロガー[@did2memo](http://did2memo.net/)さんには大きなトラフィックを集めるブログポストの裏話についてお話いただきました。この話は一見すると情報科学に関係がないような話と思われるかもしれませんが、@did2memoさんのブログでは、普段私達が使っている用語や情報技術を一般の人からみてわかりやすく解説していて、こういった内容の記事にいかに需要があるのかということを示されていました。私達の情報科学コミュニティと世の中のコミュニティとの乖離を意識させられる内容でした。

一つ一つの発表を細かくレポートしたいのですが、そろそろ今年の予告を行いたいと思います。（[去年の講演内容はこちら](http://wakate.org/29)）

## 今年の情報科学若手の会

今年の情報科学若手の会は招待講演にNICTの井上さんと若手特別講演にインターネットマルチフィードの川上さんをお呼びしました。

井上さんには、サイバー攻撃の統合分析プラットフォーム**"NIRVANA改"**等についてご講演いただきます。NIRVANAは、**某アニメ**を彷彿とさせるグラフィカルなインタラクションで世界中から飛来するネットワーク攻撃を分析することができます。ぜひ開発秘話をお伺いしてみましょう。

![NIRVANA改](https://qiita-image-store.s3.amazonaws.com/27/552/6f861598-b029-c13c-f92b-df48bc7cea52.png)

若手特別講演の川上さんは@yuyarinのIDで有名な、インターネットを支える業界の若手として**アジア最大のインターネットエクスチェンジ「JPNAP」**の運用についてご講演していただきます。川上さんは、情報科学若手の会のようなコミュニティ活動にも積極的に取り組まれており、JANOG、Interop Tokyo、wakamonogなどに携わられております。情報科学若手の会の幹事陣も若手コミュニティの運営術を勉強させてもらいたいところですね。若手の皆さんは、"最近流行り"のL1〜L7まで扱えるまさにフルスタックなエンジニアの川上さんに、明日から使える技術の身につけ方を習いに来てください。

![puchiko.gif](https://qiita-image-store.s3.amazonaws.com/27/552/021be6c8-c730-460b-f793-dd3c889db1e1.gif)

さて情報科学若手の会の紹介は以上です。
これから参加したくなった人は、[ぜひ申し込み](https://docs.google.com/forms/d/1PABnbtU4UlTH38_Llkz-OlFP0zfkV71NIIY0e7Gm9po/viewform)を

### 若手の会の開催情報

> 日程
> 2014年9月13日(土)-15日(月・祝) (2泊3日の合宿形式)
> 13日は14時集合(13時30分受付)、15日は12時解散を予定しています
> 土日のみ、あるいは日曜のみの参加なども可能です。
> 
> 場所
> 山喜旅館(静岡県伊東市東松原町4番7号) 

```
P.S. 去年までの参加者へ
情報科学若手の会でインターネットが使いづらかった問題は解決済みです。
Enjoy Internet!
```
macでsshfsを使うのにハマった点

# 失敗例

```bash:インストール
brew install sshfs osxfuse
```

```bash:sshfsをおもむろに使う。
$ sshfs 192.168.11.2:/mnt $HOME/mnt
/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext failed to load - (libkern/kext) not loadable (reason unspecified); check the system/kernel logs for errors or try kextutil(8).
the OSXFUSE file system is not available (71)
```

* osxfusefs.kext が読み込めないとのエラー。

```bash:手動でkextを読み込んでみる
$ sudo kextutil /Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext
Password:
Diagnostics for /Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext:
Code Signing Failure: not code signed
ERROR: invalid signature for com.github.osxfuse.filesystems.osxfusefs, will not load
```

* kextが署名されていないので読み込みませんでしたとのこと。

# 成功例

```bash:
brew install sshfs
brew uninstall osxfuse
```

[FUSE for OS X - Browse Files at SourceForge.net](http://sourceforge.net/projects/osxfuse/files/)からdmgをダウンロードしインストール

```bash:もしかしたらこれしたほうがいいかも。
sudo /bin/cp -RfX /usr/local/opt/osxfuse/Library/Filesystems/osxfusefs.fs /Library/Filesystems
sudo chmod +s /Library/Filesystems/osxfusefs.fs/Support/load_osxfusefs
```

## 動作確認

```bash:成功
$ sshfs 192.168.11.2:/mnt $HOME/mnt
```
Macの移行アシスタントを使ったらhomebrew環境が壊滅した


## 移行したら死んだ
大体上手く移行できたけど、ATOKの辞書セットが死んだのとhomebrew環境が死んで(`/usr/local/bin`以下がほぼ空)terminalが起動しなくなって困った
ATOKはインストーラー使って入れ直せば設定引き継いで動いてくれるんだけどhomebrewは面倒くさそうだったから適当に直した

## 権限がおかしい
`/usr/local`下がroot権限になっていて、brewコマンドを打ってもパーミッションエラーで動いてくれない
とりあえず`sudo chown`で強制的にユーザ権限に戻した

```
$ sudo chown -R {user}:admin /usr/local/
```

## リンクを張り直す
`/usr/local/Cellar`を見てみると移行前に使っていたパッケージはそのまま入っているっぽかったので、アンインストールせずにそのまま使うことにした
`brew list`の結果をそのまま`brew link`する

```
$ brew list | xargs brew link
```

## 動いた
実際は他にもちょっと別の操作挟んだりしたから、上記だけで動くか確認できてはないけど多分動くはず
なんか間違ってたりまずいことしてたら教えてください
一行で出来る！!「objective-c【iOS】」タッチイベントの無効化・有効化

#はじめに
非同期通信等を行う際に画像が表示されるまで、タッチを無効にしたい...!
そんな時、たった一行でタッチイベントを無効化・有効化することが出来ます！！


#タッチイベント無効化

```objc:無効化
//ボタンのセット
self.btImageView = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)] autorelease];

//ボタンの無効化
self.btImageView.userInteractionEnabled = NO;
```

#タッチイベント有効化
```objc:有効化
//ボタンのセット
self.btImageView = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)] autorelease];

//ボタンの有効化
self.btImageView.userInteractionEnabled = YES;
```

これだけです。
有効化・無効化したいタッチイベントに対して
self.btImageView.userInteractionEnabled = NO  //無効化
self.btImageView.userInteractionEnabled = YES //有効化

是非試してみてください。
Reverse Engineering for Beginners

"Reverse Engineering for Beginners" free book
http://beginners.re/

> Contents
>
> Topics discussed: x86, ARM.
> Topics touched: Oracle RDBMS, Itanium, copy-protection dongles, LD_PRELOAD, stack overflow, ELF, win32 PE file format, x86-64, critical sections, syscalls, TLS, position-independent code (PIC), profile-guided optimization, C++ STL, OpenMP, win32 SEH.

Licensed under [CC BY-NC-ND 3.0](http://creativecommons.org/licenses/by-nc-nd/3.0/).
Debian(or Ubuntu)+nvidia+PyQt5+QtQuick2のエラー回避

表題の条件でShaderのコンパイルエラーが発生し、QtQuick2が正しく動作しない場合の回避策。
以下のコードをスクリプトに追加。

```py3
import ctypes
ctypes.CDLL('libGL.so.1', ctypes.RTLD_GLOBAL)
```

参考
https://bugs.launchpad.net/ubuntu/+source/python-qt4/+bug/941826

どうやらnvidia提供のlibGL.so.1を読み込んでくれない不具合があるらしい。
Hexoの新規投稿をちょっと使いやすくする


# はじめに

こんにちは。インフラエンジニアレベル１の[f_prg](http://twitter.com/f_prg "f_prg")です。
Hexoで新規投稿でファイルを生成しますと、source/_postsフォルダにファイルが生成されます。今後投稿していきますと、ファイルの管理が必要になりそうです。
今回はちょっとだけ投稿を使いやすくする方法をご紹介します。

# 日付ごとにファイルを生成するようにする
## _config.ymlの設定を変更する
初期状態のconfigは下記の通りですが

```_config.yml
new_post_name: :title.md # File name of new posts
```

を

```_config.yml
new_post_name: :year/:month/:day/:title.md # File name of new posts
```

と変更します。

## 新規投稿を生成する

```bash
[01:20:43][f_prg@mba:_posts]# hexo new hexo_easy_post
[info] File created at /Users/f_prg/Documents/project/node-hexo-blog/blog/source/_posts/2014/08/16/hexo_easy_post.md
```

と日付ごとのフォルダができて、ファイルが生成されます。

# まとめ
できるかなーと思ってちょっとやったら、とても簡単にできました。
ちょっと_config.yml変更させるだけで、いろいろとできそうです。
その前の記事は、自分で移動させました。まあ。仕方が無いですね。
管理画面のhexo-adminプラグインを使っており
一覧で投稿日時がでてましたので、面倒な作業はなくドラッグアンドドロップの移動だけでした。

[http://hexo.io/docs/migration.html](http://hexo.io/docs/migration.html "http://hexo.io/docs/migration.html")
こちらに同じような内容がありました。

# 参考資料・リンク
[http://hexo.io/docs/migration.html](http://hexo.io/docs/migration.html "http://hexo.io/docs/migration.html")