OmniAICreator/Qiita-1.07M huggingface dataset:
レスポンシブWebデザイン(nojimayusuke)

##レスポンシブWebデザイン
* 概要
 -  PC/Tablet/SmartPhone向けのサイトを1つのHTMLで実現するためのテクニック(CSSでレイアウトを調整する)
 
###HTMLファイルの作成
```html
<!DOCTYPE>
<html lang="ja">
 <head>
   <meta charset="utf-8">
   <title>レスポンシブwebデザイン</title>
   <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/3.16.0/build/cssreset/cssreset-min.css">
 </head>
 <body>

  <div id="header">
    <div id="footerNavLink"><a href="">+</a></div>
    <h1>Header</h1>
    <div id="headerNav">
     <ul>
       <li><a href="">Home</a></li>
       <li><a href="">About</a></li>
       <li><a href="">Contact</a></li>
     </ul>
    </div>
</div>

  <div id="container">

  <div id="main">
    <h2>Main</h2>
    <img src="cafe.jpg">
    <p>Hello.Hello.Hello.Hello.Hello.</p>
   </div>

   <div id="sub">
     <h2>Sub</h2>
     <P>Hello.Hello.Hello.Hello.Hello.</p>
   </div>
  </div>

  <div id="footer">
    <p>Footer</p>
    <div id="FooterNav">
      <ul>
        <li><a href="">Home</a></li>
        <li><a href="">About</a></li>
        <li><a href="">Contact</a></li>
      </ul>
    </div>
  </div>

 </body>
</html>

```

###CSSファイルの作成

```css
charset "utf-8"

body {
  font-family: Arial,Verdana,sans-serif;
}
#header {
  background: red;
}
#footer {
background: green;
}
#container {
}
#main {
  background: orange;
}
#sub {
  background: yellow;
}
```

###スタイルの振り分け
* メディアクエリーを使い、画面幅に合わせてスタイルを振り分ける
 * スマートフォン: 320px-480px
 * タブレット: 480px-768px
 * PC: 768px以上

####共通部分の設定

```css
body {
  font-family: Arial,Verdana,sans-serif;
  width: 95%;
  margin: 0 auto;
}

#headerNav ul {
  list-style: none;
  over-flow: hidden;
}
#headerNav li {
  float: left;
  width: 33%;
  text-align: center;
}
img {
  max-width: 100%;
}
```
* 左右に余白を作り、中央揃えにする。
* headerをリスト形式ではなく横に並べる。


####スマートフォン向けのスタイル 

```css
#headerNav {
  display: none;
}
```

```html
<div id="footerNavLink"><a href="#footerNav">+</a></div>
```

* ヘッダーメニューを消して、フッターメニューへリンクするようにする。

```html
<meta name="viewport" content="width=device-width,initial=1.0>
```
* スマートフォンデバイスに最適な表示領域を調整する。

####タブレット向けのスタイル

```css
@media all and (min-width: 480px) {
  #footerNavLink {
     display: none;
  }
  #headerNav {
     display: block;
  }
  #footerNav {
     display: none;
  }
```

* 画面サイズが480px以上のとき、footerNavLinkとfooterNavを消して、headerNavは表示を固定させる。

####PC向けのスタイル

```css
@media all and (min-width: 768px) {
  #container {
    overflow: hidden;
  }
  #main {
    float: left;
    width: 78.0612245%;
  }
  #sub {
    float: right;
    width: 20.4081633%;
  }
```
* 画面を広げていくとsubがmainの横に表示される。
* mainのwidthの計算方法「main(765px) / all(980px) * 100」
* subのwidthの計算方法「sub(200px) / all(980px) * 100」

###iframeを埋め込む
* サイトにyoutubeを表示させる。

```html
<div style="width: 75%; margin: 0 auto;">
<div class="movie">
  <iframe src="http://www.youtube.com/embed/XvannIPtbQ"frameborder="0"></iftame>
</div>
</div>
```

```css
.movie {
  position: relative;
  height: 0;
  padding-top: 56.25%;
}

iframe {
  height: 100%;
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
}
```
* 「padding-top: 56.25%;」iframeで表示する箇所のサイズの比率を「16:9」とした場合、56.25%と指定すると、画面に縦幅と基準に「16:9」の比率に調整される。
JavaでもScalaでも便利で重宝するMultiMap

# はじめに
Mapの値型にSeq、Set、Listあたりを取るときにありがちなコード。
キーが無かったらコレクションをnewして・・・という部分を書くのがかったるい。
※scala.mutable.Seqなどは値の追加をすると新しいコレクションが返ってきてしまうのでここではListBufferを使った。

```scala
val m = mutable.Map.empty[Int, ListBuffer[String]]

def addKeyValue(k: Int, v: String) = {
  if (!m.contains(k)) {
    m += (k -> new ListBuffer[String])
  }

  m(k) += v
}
```

# MultiMapでリファクタリング
こんな時は、[scala.collection.mutable.MultiMap](http://www.scala-lang.org/api/2.10.4/index.html#scala.collection.mutable.MultiMap)を使うとスッキリ書ける。
MultiMapはtraitであり、具象クラスが用意されていないので以下のようにmix-inして使うのが基本となる。

```scala
val m = new mutable.HashMap[Int, mutable.Set[String]] with mutable.MultiMap[Int, String]

def addKeyValue(k: Int, v: String) = m.addBinding(k, v)
```

但し、MultiMapの値はSet型になるので注意が必要だ。以下のように宣言されている。
TreeSetのような順序を保持できるSetを使うことも出来ない。

```scala
trait MultiMap[A, B] extends Map[A, Set[B]] {
```

自作するにしても、MultiMapの[ソースコード](https://github.com/scala/scala/blob/v2.10.4/src/library/scala/collection/mutable/MultiMap.scala#L76-L117)はたかだかこの程度でありそんなに難しいものでもないだろう。

# おまけ
なお、最初のコードは以下のようにMap#getOrElseUpdateメソッドを使うことでもう少し簡潔に書くことも出来る。

```scala
val m = mutable.Map.empty[String, ListBuffer[String]]

def addKeyValue(k: String, v: String) = {
  val l = m.getOrElseUpdate(k, new mutable.ListBuffer[String])
  l += v
}
```

## Java編
あと、Javaでは標準ライブラリには存在しないものの、Google製guavaライブラリには同名の[MultiMap](http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/collect/Multimap.html)が存在する。
同様にif文が不要になり重宝する。

```java
Multimap<Int, String> m = ArrayListMultimap.create();
m.put(1, "one");
```
PHPUnitの新しいバージョンはPEARに公開されない事に。

![Retire_pear_phpunit_de_·_Issue__1229_·_sebastianbergmann_phpunit.png](https://qiita-image-store.s3.amazonaws.com/0/10032/472dd957-59a6-7838-1e3b-55e83cf599e9.png)

時代を感じますね。

- [Retire pear.phpunit.de · Issue #1229 · sebastianbergmann/phpunit](https://github.com/sebastianbergmann/phpunit/issues/1229)
Facebookのgraph apiを使ってGrowthHackする（1/8）


facebookのapiを利用して、色々なGrowthHackができるので、少しずつこのスレッドに更新をしていきたいと思います。
facebookアプリを開発していたり、運営している方などの参考になれば幸いです。

ちなみに、全8項目を予定してます！


### ログアウトしているユーザーを特定して、ログイン前に情報を表示する

```js:_facebook_api.html.erb
FB.getLoginStatus(function(response) {
	//facebookのログイン情報をresponseで受け取る
	if (response.status === 'connected') {
		var uid = response.authResponse.userID; //facebookにログインしていたらfacebookのuidを取得できる
		if(uid.length > 0){
			//ここにajaxとかの処理を作成
			$.ajax({
				type: "get",
				data: "uid=" + uid,
				url: "/facebook_api/get_user_data",
				success: function(data,status){
					$(data.html).appendTo(
						//取得したhtmlを表示させたい場所を指定
					);
				},
				error: {
					//error時の処理を記載
				}
		}
	}
});
```

```ruby:/controller/facebook_api_controller.rb
def get_user_data
    #controllerでfacebookのuidを受け取り、データベースのuserインスタンスを取得する
	user = User.find_by_uid(params[:uid])
	html = render_to_string :partial => "user_data", :locals => { :user => user }
	render json: {html: html}
end
```

```html+erb:/views/facebook_api/_user_data.html.erb
<div>
	#ここに取得したuserインスタンスを使って、表示したいviewを作成
</div>
```

###1. facebookへの投稿に自由にリンクをつける

###2. facebookへの投稿にタグ付けする

###3. facebookのお知らせに通知する

###4. facebookへの投稿にハッシュタグをつける

###5. アプリでfacebookのいいね！と連動する

###6. facebook apiのpermissionをユーザーによって変える

###7. later...
Clojureでproxyオブジェクトにメタ情報を付与する

reifyで作成したオブジェクトはclojure.lang.IObjを実装しているのでwith-metaでメタ情報を付与できますが、proxyで作成したオブジェクトはそうはいきません。

```clj
(def v (proxy [Object] []
              (toString [] (str :abc))))
(with-meta v {:A 111})
```

```
java.lang.ClassCastException: user.proxy$java.lang.Object$ff19274a cannot be cast to clojure.lang.IObj
```

以下のようにclojure.lang.IObjのwithMetaとmetaを実装すればwith-metaでproxyオブジェクトにもメタ情報を付与できます。

```clj
(def v (proxy [Object clojure.lang.IObj] []
              (toString [] (str :abc))
              (withMeta [m] (update-proxy this {"meta" (fn [this] m)}))
              (meta [] nil)))
(with-meta v {:A 111})
(meta v)
```

ただし、通常のwith-metaとは違ってメタ情報はmutableに変更されます。
JavaScriptでシェルスクリプト、ついでにCoffeeScriptでもシェルスクリプト

# 準備
brewを使って装備を整える。

```shell-session
brew install spidermonkey
brew install node
npm install -g coffee-script
```
spidermonkey : JavaScriptをシェルスクリプトとして使えるやつ
node : これでnpmコマンドをゲットする
coffee-script : CoffeeScriptのコンパイラ

# 自分の使っているシェルの設定ファイルにaliasを追加

```zsh:.zprofile
alias -s js='js'
alias -s coffee='(){coffee -p $1 | js}'
```

2行目の匿名関数はZShellで通る構文ですので他シェルの方は工夫してください。

# テストする

## まずはJavaScript

以下のテストファイルを作成し

```js:test.js
print('Hello World');
```

実行する。

```shell-session
./test.js
```

すると

```shell-session
Hello World
```

ここまではノーマル。

## 次はCoffeeScript

テストファイルを書いて

```coffeescript:test.coffee
print 'Hello World'
```

実行する。

```shell-session
./test.coffee
```

すると

```shell-session
Hello World
```

coffee -pのpにより標準出力のみにしているのでコンパイル後のjsファイルが残らないため、あたかもシェルスクリプトのように使える。
MongoDBのインストール

# Windowsにインストール
① MongoDBをダウンロードする
http://www.mongodb.org/downloads

② C:\ にダウンロードしてきたzipを展開する

③ 展開したフォルダ名を mongodb に変更する

④　以下のフォルダを作成する

```
mkdir C:\mongodb\data C:\mongodb\logs
```

⑤ C:\mongodb\binにパスを通す

⑥ mongodbを起動

```
mongod --dbpath c:\mongodb\data --logpath c:\mongodb\logs\mongodb.log
```

⑦ 別のコマンドプロンプトからmongoシェルを扱う

# OSXにインストール

MacPorts（長時間）

```
$ sudo port install mongodb
```

Homebrew（短時間）

```
$ brew install mongodb
```

/var/lib/mongodbを作成

```
$ sudo mkdir /var/lib/mongodb
```

/var/log/mongodb.logを作成

```
$ sudo touch /var/log/mongodb.log
```

mongodbの起動

```
$ sudo mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb.log
```

別のターミナルからmongoシェルを扱う

```
$ mongo
```

# Linuxにインストール

## CentOS

### リポジトリの追加

#### 64ビットの場合

```
$ su
# vim /etc/yum.repos.d/10gen.repo
```

```
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=1
```

#### 32ビットの場合

```
$ su
# vim /etc/yum.repos.d/10gen.repo
```

```
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/i686
gpgcheck=0
enabled=1
```

### インストール

```
$ sudo yum install mongo-10gen mongo-10gen-server
```

### 起動する

```
$ sudo service mongod start
```

### 停止する

```
$ sudo service mongod stop
```

### 再起動する


```
$ sudo service mongod restart
```

### 自動起動するように設定する

```
$ sudo chkconfig mongod on
```

## Ubuntu

↓検証中

1. パッケージ管理システム (APT) の設定
UbuntuはMongoDBのリポジトリへのアドレスを知らないので、それを設定ファイルに書いてやる。

まず、リポジトリの公開鍵を手に入れる。以下のコマンドをコンソールで実行する。

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10

続いて、/etc/apt/sources.list.d/10gen.listをエディタで開き（存在しないはずなので新規作成）、以下1行を書き込んで保存。

deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen

次のコマンドを実行して、リポジトリを更新する。

sudo apt-get update

次のコマンドを実行して、MongoDBをインストールする。

sudo apt-get install mongodb-10gen

2. 設定ファイル 設定ファイルは /etc/mongodb.conf に、コントロールスクリプトは /etc/init.d/mongodb に置かれている。

3. MongoDBの実行 以下のコマンドを実行して、MongoDBのプロセスを開始する。

sudo service mongodb start

以下のコマンドを実行して、MongoDBのプロセスを停止する。

sudo service mongodb stop

以下のコマンドを実行して、MongoDBのプロセスを再起動する。

sudo service mongodb restart
pixiv

```rb
pixiv = "Pixiv".downcase!
```

```php
$pixiv = strtolower("PIXIV");
```

```el
(setq pixiv (downcase "PiXiV"))
```

転んでも泣かない。私からは以上です。 [`p(ixi)v`](http://dic.pixiv.net/a/p(ixi)v)
Markdown で分かったことまとめ


H1 - H6
省略
pre > code
上下に空行を置いて、```で囲むだけなので省略
ul or ol > li
先頭に+-とか数字をつける。
木構造にするならインテンドで下げる。省略。


引用
---------

入れ子構造をして簡単に使える。
使い方は先頭に引用レベルの数だけ括弧をつける。

``` markdown
>
a
>>
b
>>>
c

orange

>
d
>>
e
>>>>
f
```

>
a
>>
b
>>>
c

orange

>
d
>>
e
>>>>
f


テーブルグラフ
----------


作り方： ヘッダー行を書く、text-align の設定行を書く、本体を書く

行の書き方は「｜」パイプで要素を区切って書く。
ヘッダー行は省略可能。
設定行では「 - 」ハイフンで埋めるだけ。
コロンのあるほうに寄るので、中央寄せだと左右にコロンをつける。



``` markdown
|通常|左寄せ|中央寄せ|右寄せ|
|---|:---|:---:|---:|
|grape|orange|apple|pine|
```

|a|b|c|d|
|---|---|---|---|
|grape|orange|apple|pine|



数式
----------

MathJaxが導入されているMarkdownなら「$$」で囲むと中央寄せでTEX形式の数式に変換される。「 $ 」で囲むとその部分だけ変換してくれる場合がある。
kobitoのリアルタイムビューは数式をリアルタイムで変換できない。
数式を使ってガンガン編集したいなら、Mou(mac用のMarkdown編集エディタ)か、StackEdit(chrome app)でできる。
下のマークダウンはkobito上では見れない。

``` markdown
$$ x ^ 2 + y ^ 2 = 1 $$ 
$ x ^ 2 + y ^ 2 = 1 $
```

$$ x ^ 2 + y ^ 2 = 1 $$ 
$ x ^ 2 + y ^ 2 = 1 $


テキストアライン
----------

中央寄せ、右寄せはデフォルトではない、直接HTMLにスタイルを埋め込むのは微妙なので、せめてクラスにして、css templateに右寄せ、左寄せの設定を直接用意しておくのがいい気がする。

Markdown CSS template
--------------
CSSの中身は普通のHTMLのスタイリングとまったく同じなので簡単に編集できる。markdownの仕様を確認したり、他人のCSS templateを利用をするためにも、Mouをおすすめする。Mouは簡単にテンプレートを入れ替えてリアルタイムビューで編集できるので、テンプレートを集めた分だけページができる。
現在僕のお気に入りのテンプレートは２つ。

#### Github-Readme.css
かなり完成度が高い。枠組みがかわいい。余白がありすぎて、pdfにするときに微妙になったりするけど。ぐぐったらどっかで拾えた。別だが、Mouにデフォで入ってるGithubもまぁまぁいい。

#### StackEdit のデフォルトtemplate
見やすい、かわいい。レビュー見て、ソースから拾ってきた。中学生に数学のプリント作るのに使ってます。


使い道が広いし、プレゼンも作るようになった時に参考にできるテンプレートは多いほうがいい。
Markdown css template と検索すると、おすすめまとめのページとか結構でてくる。
すぐにMouで試してみると楽しいし、好きなフォントや空間構成色構成があればすぐに参考にできる。





> またQiitaに低級まとめ増やしてごめんなさい＞＜
LogCat のログの内容をファイルに書き込む方法 と tail -fで監視



ADT の LogCat があまりに使いにくいので、コンソールで見ることにした

## やり方

```
% adb logcat > logcat.log &
% tail -f logcat.log
```

以下のようにして必要なのだけ見る

```
% tail -f logcat.log | grep 文字列
```


## 検索用語

Android, ADT, log, tail, eclipse, mac
Apache Camel (Java)を使うと開発が楽になる７つの理由

まず本題に入る前に、ApacheCamelの簡単な説明から

# Apache Camelとは
Javaのフレームワーク。どんなフレームワークかというと

* ベルトコンベア（ライン生産的な）フレームワーク
* 「生産物」に相当するものはデータ
* 「生産物を作るロボットや人」に相当するものはコンポーネントや個別実装
* 「スタート」は外部からのリクエストやタイマーでの監視（例えばメールチェックみたいな）
* 「最終生成物」はリクエストもらった人に返す
* フレームワーク自体は超軽量。

概要すぎるので、もうちょっと細かな話をすると

## データ

* `エクスチェンジ`と呼ばれる「箱」でベルトコンベアに流れている
* 箱の中には`メッセージ`と呼ばれる生産物が入っている
* 箱の中には`メッセージ`の他に「エラー」やIDや処理過程の「パンくずリスト」なども入っている
* `メッセージ`の中は`ヘッダー`と`ボディ`があって、`ヘッダー`がMap型、`ボディ`がObject型になっている。メインとなるデータは`ボディ`で作って、サブ的なデータは`ヘッダー`にどんどん入れていく使い方。
* 例えばファイルでいうと、ファイルの中身が`ボディ`、ファイ名やサイズ、日付等が`ヘッダー`といった感じ。
* Camelではベルトコンベアの事を`ルート`と呼んでいる

## コンポーネントや個別実装

＜動作内容＞
1. ベルトコンベアから箱をもらうので、中身を取り出す
2. 内容を見て処理をする
3. 処理した結果を箱に入れる

* `コンポーネント`は色々準備されていて、外部システム接続の部分だったり、データ変換だったりが100種類以上用意されている。
* `コンポーネント`は独自な実装というよりも、外部のよく使われているOSSライブラリのラッパーになっている
* 既存のコンポーネントに頼らずとも、もちろん独自に自分で実装もできる。

## 外部からのリクエストやタイマー

* HTTPリクエストなどを受信
* その他のプログラムからのリクエストを受け取る
* タイマーは1秒間隔だったり、毎週月曜だったり
* ファイルコンポーネントをスタートに配置すると、毎秒指定のディレクトリをチェックして、新規ファイルがあったら読み込むといった処理になる

もっと細かな説明やサンプルは別の機会に書くことにして、理由のほうを。

# 理由1 > 既存コンポーネントが便利

* ファイルを出力するコンポーネントを`ルート`に配置して、`ヘッダー`にファイル名、`ボディ`に内容を入れて渡すとファイルを生成してくれるといった感じ。
* メールコンポーネントはメールを送ってくれる
* Execコンポーネントはシェルやバッチファイルを起動してくれ、結果を`ボディ`につめて`ルート`に戻してくれる
* コンポーネントを使うと個別のライブラリの使用方法をいちいち勉強しなくてもすむ
* コンポーネントは全部で http://camel.apache.org/components.html と http://camel.apache.org/data-format.html の２ページ。
* コンポーネントもシンプルな作りなので、機能が足りなかったりしても自分でextendして機能を継ぎ足せる。

# 理由2 > どこでも動く

* JavaVMのみでも
* Tomcatでも
* GoogleAppEnginでも
* JBossでも
* Groovyでも
* JUnitでも
* Jenkinsでも

軽量ライブラリだから環境選ばない。
軽量ライブラリだから、コンポーネントだけを使うという方法もできるんだけど、それは別の機会に説明。

# 理由3 > コードが読みやすくなる

* コードの大きな流れを読むには`ルート`(ベルトコンベア)を見ればいいだけ
* やりたい事を順に`ルート`に並べていく
* 細かな処理は`ルート`から呼び出す処理に書ける
* いろんな所に変数が散らばらない。すべての情報は`エクスチェンジ`に入れるだけ。
* 設計もいたって簡単になって、メインはデータ部分とベルトコンベアでの機能分割になると思う。
* クラス変換が便利。クラスキャストのノリでクラス変換（データマッピング）ができる。

# 理由4 > デバッグがしやすい

* `エクスチェンジ`という箱の中身を見ると全部の処理中のデータが詰まっている。
* つまり`エクスチェンジ`をログ出力すると、処理中のデータがすべて見える。
* エラーが発生するとスタックトレースとパンくずリスト（ベルトコンベア上でどの処理を通ったか）やエクスチェンジの内容全部がログに出力される
* 試験コードが書きやすい。できていない処理を飛ばしてデータを流す事もできる。どう書けばいいかは、また別の機会。

# 理由5 > 複数人数で開発・分業しやすい

* ベルトコンベア式だから、これができないとだねぇ。
* どの処理でも`エクスチェンジ`という同じ箱を使うので、前の処理が完成していなくても実装可能。
* 処理単体での試験もできる。（想定データをエクスチェンジに詰めて投げるだけ）

# 理由6 > 意外としっかりした作り

* 軽量なフレームワークなので、逆に機能不足かと思いきや・・・
* EIPとか呼ばれる(https://www.graffletopia.com/stencils/137) 処理フローパターンを網羅するように意識して実装されている
* 例外ハンドラ、トランザクション制御、リトライ制御、グレースフルな停止（処理中のデータが処理完了するまで待つ）、処理回数や時間などの統計などなど。
* エラーになった処理（例えば外部にhttpリクエスト）を飛ばして後続の処理に進むという強制続行的なハンドリングすることもできる。

# 理由7 > ネタ的に

* ルートはワンライナーで書けちゃう。

# サンプル

HelloWorldなサンプルぐらい１個つけておかないと実感もできないのでちょっとだけ。
`ルート`（ベルトコンベア部分）は下記のようになる。

```java
from("jetty:http://0.0.0.0:8081/api")
.to("sql:SELECT * FROM students WHERE id = :#id")
.marshal().json(JsonLibrary.Gson)
.to("log:resultMessage");
```

これを起動するとwebサーバ的な動作するので、次のようにアクセスすると
http://localhost:8081/api?id=1234
sqlが実行されて、結果のレコードがjson形式で結果として戻ってくる。
ログには結果データが吐出される。
といった感じ。

すべて既存コンポーネントをつなげただけで完成したので、独自実装が入ってない。
SQLの設定部分が書いてないのでこのままだと動かないけど、全体は次回にでも。
Chef で iptables の nat, mangle テーブルを編集する

前提
====

こちらの Cookbook 限定の Tips です。

opscode-cookbooks / iptables (v0.13.2)
http://community.opscode.com/cookbooks/iptables


問題と症状
=========

GitHub のサンプルと同じような感じで以下のようなテンプレートを作ると…
iptables-restore に怒られる。


### エラー例1

```shell:templates/default/masquerade-bad-1
-A POSTROUTING -s 10.0.0.0/16 -j MASQUERADE
```

```
iptables: Applying firewall rules: iptables-restore: line 10 failed
```

### エラー例2

```shell:templates/default/masquerade-bad-2
-t nat -A POSTROUTING -s 10.0.0.0/16 -j MASQUERADE
```

```
iptables: Applying firewall rules: iptables-restore v1.4.18: The -t option (seen in line 15) cannot be used in iptables-restore.
```

対策
====

```shell:templates/default/masquerade
*nat
-t nat -A POSTROUTING -s 10.0.0.0/16 -j MASQUERADE
```

解説
----

``iptables::default`` は、``/usr/sbin/rebuild-iptables.rb`` なるスクリプトをインストールする。
これは iptables-save のエミュレータみたいなもので、内部で1ライン毎に以下のような処理をしている。

```rb:/usr/sbin/rebuild-iptables.rb
(snip)
rule.each do |line|
  (snip)
  elsif line =~ /^\s*\*([a-z]+)\s*$/
    table = $1.to_sym
(snip)
```

つまり、``*hoge`` を見つけたら ``table`` 変数を切り替えるようになっている。
最終的には iptables-restore に食わせるためのファイルを作る。

結論としては、iptables-save で保存されるシンタックスを利用すればOK。

参考 : http://www.faqs.org/docs/iptables/iptables-save.html
ZShellからMacアプリを起動（改訂版）

#ターミナルからMacアプリをシームレスに起動
ターミナルからMacアプリをシームレスに起動するためのZShell設定(.zprofile)について、以前も書きました。
http://qiita.com/GeneralD/items/58588e22fe7bb3e10205
しかし実は挙動としてイマイチ思わしくない点があったため、自分で弄ってみました。

実は前の記事を書いた時もZshellについての知識が貧しかったため、かなりエレガントでないスクリプトを載せてしまいましたが、
親切な方がよりエレガントなコードを書いてマージして下さいました。ありがとうございました。

しかしいざ自分で弄ろうと思うと自分で書いてないコードの意味など分かるわけもなく、情報を探すのですがなかなか欲しい情報を見つけるのも一苦労。特にZShell特有の書き方などについての情報が少ないようにな気がしました。（すいません、公式のドキュメントとかあるのでしょうが長そうなので読んでません。）

スタックオーバー風呂で外人さんに聞いてみました。
http://stackoverflow.com/questions/23166496/alias-definition-on-mac
そしたら適当にリンクを貼ってくれたので読みました。
英語で「参考にして頑張ります、ありがとう。」的なことを書きましたがジッサイは「頑張ったけどワカラナカッタ」のが本音です。
なのでガチャガチャやってたらおおよそいい感じになりました。

匿名関数を使っているのでグローバルを汚しません。

```zsh
# Mac Applications in 'Applications' directories -> runnable from the terminal
() { local app dir
  for dir in $@; do
    for app in $dir/*.app(N); do; alias ${app:t:r:gs/ //}="open \$1 -a ${app:gs/ /\\ /}"; done
    for app in $dir/*/*.app(N); do; alias ${app:t:r:gs/ //}="open \$1 -a ${app:gs/ /\\ /}"; done
  done
} '/Applications' '~/Applications' '/Applications/Xcode.app/Contents/Applications'
```

これで例えばCotEditor .zprofileのように的確にドキュメントファイルを指定して開けます。

```zsh
alias cot=CotEditor
```

とやると読む時はcat、書く時はcotって感じで面白いですよ。
appleのサイトで使われているReveal.js



chromeの[Wappalyzer](https://chrome.google.com/webstore/detail/wappalyzer/gppongmhjkpfnbhagpmjfkannfbllamg)が見つけたReveal.js

気になります。
どこで使っているんだろ？

Markdownとの組み合わせが便利そう。

[Reveal.js](http://lab.hakim.se/reveal-js/#/)

## 見つけたところ

http://www.apple.com/jp/iphone/

## 参考にしたサイト

[Reveal.js、Markdown、Githubでスライドを作成する。](http://qiita.com/budougumi0617/items/19b19019bbe01f86e251)
Project Atomicを調べてみた


週末寒くて引きこもったので、Project Atomicについて調べてみた。


Project Atomic
====
RedHatがDockerコンテナのために始めた軽量OSを作るプロジェクト

http://www.projectatomic.io/

##コンセプト
コンテナ化されたアプリケーションを素早くデプロイするためのソリューションを提供。

現在利用可能なのは、RHELとfedora20ベース

CentOS版は、まもなく提供するとのこと

構成する主コンポは以下
### docker https://www.docker.io/
-----
 言わずとも知れたコンテナ

###rpm-OSTree  http://rpm-ostree.cloud.fedoraproject.org
----
 <b>新提供</b>
 
 OSのアップデートシステム。

 新たなアップデートが見つかった場合には、/etc配下を3way-mergeする。
 システム情報をTree(スナップショット）で、rollbackも行うことが出来る。
  
###systemd http://freedesktop.org/wiki/Software/systemd/
----
 Linuxシステムのinitの代替
  
 systemdは、cgroupに多く依存し、PIDを監視するのではなく、cgroupを使ってサービスプロセス郡を監視する。即ち、デーモンの実行制御をする

 Project Atomic Hostと呼ばれるベースOSでは、systemdのjournaldを使い、コンテナのログをセキュアに収集する

###geard  http://openshift.github.io/geard/
----
 
 geard自身は、Dockerとsystemdを使って、マルチホスト環境を繋ぐ橋渡し的存在

 geardは、次期openshiftのコアコンポーネントになるもの。

 Docker自身だけでは足りない、実運用に耐えるための機構を用意している。

 例えば、セキュリテイ面では、Linuxのcgroupを使い、namespaceとSELinuxによって、アクセスをセキュアにしている。

![スクリーンショット 2014-04-20 2.33.27.png](https://qiita-image-store.s3.amazonaws.com/0/28157/9d28f51d-9951-b499-d45b-92d5e50ab96e.png "スクリーンショット 2014-04-20 2.33.27.png")
 


### Cockpit http://cockpit-project.org/
---
デフォルト無効だが、フロントエンドUIとして、Cockpitを用意
ホスト情報の取得、コンテナ管理（作成・起動・停止・削除など）、ユーザ管理に加え、マルチサーバ管理も可能

![a.png](https://qiita-image-store.s3.amazonaws.com/0/28157/dfc614d1-94d2-cd52-6f1a-0d509331e0ab.png "a.png")


まとめ
====

現状のところ、ドキュメントもいまいち揃っていない。
加えて、コンテナホストのgeard側もいまいち揃っていない。
ただ、github上にあるgeardコンテナのgear linkのドキュメントを見ると、かなりの可能性を秘めているのではないかと個人的には思う。
https://github.com/openshift/geard/blob/master/docs/linking.md


実際に触って見た詳細は次の機会に。

いろいろDeepな感じで追い切れず、理解しきれず・・・。
Fiddlerを使って任意のJavaScriptを実行する方法

- インターネット上のサイト等，様々なWebサイトにJavaScriptを埋める方法．テストとか，お遊び向け．
- Fiddlerを使えばWebページのレスポンスにいろいろできるけど，書き換えるには設定ファイルに手を加える必要がある模様．
- FiddlerScriptと呼ばれるものをを使えばいいっぽい．
- FiddlerScriptは，JavaScriptに似た，JScriptという言語らしい．

## 編集方法
- Fiddlerにて，メニューバー「Rules」→「Customize Rules..」を選択
- メモ帳で対象ファイルが開く．
- ファイルのありかは，C:\Users\ユーザ名\Documents\Fiddler2\Scripts\CustomRules.js
- エディタの変更は，メニューバー「Tools」→「Fiddler Options」→「Tools」
- 専用のFiddler2 ScriptEditorもある．補完が効くのでいいかも．

## 編集例
- OnBeforeResponseメソッドを編集する．(レスポンスを返す直前のコールバックメソッド)
- その他，Request，Responseの各タイミングでコールバックがある模様(参考URL参照)
- 以下の通り書くと，bodyタグが閉じる前に，URLで示すJavaScriptを挿入可能

```
static function OnBeforeResponse(oSession: Session) {
    if (m_Hide304s && oSession.responseCode == 304) {
        oSession["ui-hide"] = "true";
    }

    // ここから↓を編集
    if (oSession.oResponse.headers.ExistsAndContains("Content-Type", "html")) {
        var oBody = oSession.GetResponseBodyAsString();
        // Remove any compression or chunking
        oSession.utilDecodeResponse();
        var oBody = System.Text.Encoding.UTF8.GetString(oSession.responseBodyBytes);

        oBody = oBody.Replace("</body>", "<script src=\"http://hoge/hogehoge.js\"></script></body>");

        oSession.utilSetResponseBody(oBody);
    }
}
```

## 参考URL
* [Fiddler Documentation](http://docs.telerik.com/fiddler/KnowledgeBase/FiddlerScript/ModifyRequestOrResponse)
* [Understanding FiddlerScript](http://blogs.telerik.com/fiddler/posts/13-07-15/understanding-fiddlerscript)
* [今から始めるFiddler Script](http://www.slideshare.net/hebikuzure/fiddler-script)
シグナル・スロット(Signal/Slot)の仕組みをBoost.Signal2で試してみる

はじめに
=======

最近、JavaやObjective-Cでいわゆるオブザーバー・パターン(Observer pattern)を使う機会があったので、C++でもやってみたいと思い探していました。

すると、シグナル・スロットという仕組みを発見し、ちょうどBoostライブラリーによさそうなのがあったので試してみました。

何より、名前がちょっと格好いいですよね　←


シグナルとスロットとは何か？
-------------------------

シグナルとスロットとは何かというのが、まず、あやふやだったので調べました。

まあ、ぐぐっただけなので調べたうちには入らないので、あえて載せませんが・・・。

一言で言うと、Qtというプラットフォームでよく使われている通知を送る仕組みのようですね。


とりあえず試してみる
=================

とりあえず、作ってみました！

demo_modelなるモデルがあり、状態が変わるとシグナルを発生して通知を送るというシチュエーションを妄想しています。

```cpp:demo1.cpp
#include <iostream>
#include <boost/system/error_code.hpp>
#include <boost/signals2.hpp>
#include <boost/asio.hpp>

class demo_model
{
public:
    demo_model(boost::asio::io_service& io_service)
    :   io_service_(io_service)
    ,   timer_(io_service)
    {}

    boost::signals2::signal<void ()> signal;

    void do_something()
    {
        timer_.expires_from_now(boost::posix_time::seconds(5));
        timer_.async_wait([this](boost::system::error_code const& ec)
        {
            if (ec) return;

            this->signal();
        });
    }

private:
    boost::asio::io_service& io_service_;
    boost::asio::deadline_timer timer_;
};

int main()
{
    using namespace std;

    boost::asio::io_service io_service;
    demo_model m(io_service);

    m.signal.connect([]{ cout << "Signalled! (1)" << endl; });
    m.signal.connect([]{ cout << "Signalled! (2)" << endl; });

    m.do_something();

    io_service.run();

    return 0;
}
```

ビルドに使ったbjamのプロジェクトファイル

```text:Jamroot.jam
import testing ;
import os ;

BOOST_INCLUDE = [ os.environ BOOST_ROOT ] ;

run demo1.cpp
    :
    :
    :
    <include>$(BOOST_INCLUDE)
    <toolset>clang:<cxxflags>-std=c++11
    <toolset>gcc:<cxxflags>-std=gnu++0x
    <define>BOOST_ERROR_CODE_HEADER_ONLY
    ;
```

５秒後に、Signalled!っていうのが表示されます。



使ってみて
=========

特に、何かにはまることもなく簡単でした。

むしろ、Jamrootの書き方を思い出すのに苦労しました。

もし、需要があれば、サンプルで作ってみたプログラムの解説もしてみようと思います。
CSSでは任意のElementをピンポイントで修飾できる

意外と知られているようで知られていないが、CSSのセレクタで任意のElement（要素）を指定してスタイルを適用できる。

少し考えれば簡単で単にfirst-childと隣接ノードのセレクタを組み合わせるだけ。
div:first-child + div + span

自分自身で作ってるページ用には使わないが、
何かのライブラリの一部の要素を変えたい場合とかに要素を指定してスタイル適用したいときに使える。
RubyGemsの探し方

## Ruby Toolbox
[The Ruby Toolbox](https://www.ruby-toolbox.com/)はgemをカテゴリ別に分類して人気度順に並べたサイト。大まかな開発状況の推移なども分かる。

## awesome-ruby
[Sdogruyol/awesome-ruby](https://github.com/Sdogruyol/awesome-ruby)は[awesome-php](https://github.com/ziadoz/awesome-php)などのRuby版。各カテゴリの優れたgemを短い文章で解説する。GitHubで管理されている。

## RubyGems.org
[RubyGems.org](https://rubygems.org)はgemのホスティングサイト。`gem install`からインストールできるgemは基本的にここに登録されている。

RubyGems.orgのサイト上の検索システムや`gem search`では、rubygemsのパッケージ名でしか検索できないので、キラキラネームが付いたrubygemsを見逃す可能性がある。

サードパーティーの検索サービスがいくつかある。

- [libraries.io](https://libraries.io/)
    - platformにRubygemsを指定する[^liblang]とrubygemのみを検索できる
    - descriptionなども検索の対象になる
    - 検索結果にはdescriptionのほか、バージョン番号、最終更新日、GitHubのスターの数、ライセンスが表示される
    - GitHubのスターの数、依存されているライブラリの数、最終更新日時、公開日時などでソートできる[^sourcerank]
    - ライセンスで絞り込める
    - 検索結果をフィードで取得できる
- [Ruby Gem Search: Search Gems](http://www.rubygemsearch.org/rubygems)
    - 検索条件を細かく指定できる（gemの説明文（info）、ライセンス、作者名、ダウンロード数、依存ライブラリなど）
    - 結果をダウンロード数などでソートできる
    - 検索条件の指定が煩雑で、検索結果ページにはgemの説明文が表示されない
- Google
    - [site:rubygems.org/gems/ -intitle:"all gems" -inurl:"/versions/" -inurl:"letter=" -inurl:"page=" -inurl:"locale="](https://www.google.co.jp/search?q=site%3Arubygems.org%2Fgems%2F+-intitle%3A"all+gems"+-inurl%3A"%2Fversions%2F"+-inurl%3A"letter%3D"+-inurl%3A"page%3D"+-inurl%3A"locale%3D"&oq=cache+site%3Arubygems.org%2Fgems%2F+-intitle%3A"all+gems"+-inurl%3A"%2Fversions%2F"+-inurl%3A"letter%3D"+-inurl%3A"page%3D"+-inurl%3A"locale%3D")のようなクエリを使うことで不要なページを排除できる

[^liblang]: [nokogiri](https://libraries.io/rubygems/nokogiri)のように、拡張ライブラリはRuby以外の言語に分類されることがある。languageにRubyを指定するとそのようなgemが検索結果から外れる。

[^sourcerank]: SourceRankというオプションもあるが、どのような基準なのかよく分からない。

## GitHub
RubyGems.orgには登録されていないが、GitHubなどでソースが公開されているgemもある。[https://github.com/search?q=foo&type=Repositories&l=Ruby](https://github.com/search?q=foo&type=Repositories&l=Ruby)のように言語をRubyに絞ってGitHubのリポジトリ検索を行うと効率よく探せる。（その他の有用なクエリについては[Ruby - gemを探す知恵 - Qiita](http://qiita.com/kbaba1001/items/1f01524eeb35ce610676)で詳しく解説されている。）

ただし、拡張ライブラリはRuby以外のコードの比率が高いので、使用言語がRubyと判定されないケースがある（例: [flori/json](https://github.com/flori/json)）。この場合はRubyに絞るとヒットしない。

## その他
特に実装に手間がかかるジャンルでは、gemのREADMEや作者のブログ記事などで類似のgemがいくつか紹介されていることもある。それぞれのgemの特徴の比較などが付いている場合もあるので、ドキュメントやコードを読んで検討する手間を省くために積極的に活用するとよい。

## See also
* [gem ソムリエになる方法 - 刺身☆ブーメランのはてなダイアリー](http://d.hatena.ne.jp/a666666/20110331/1301499299)
  * 「ruby-toolbox.com をみる」
  * 「GitHub のレポジトリをみる」
  * 「コミュニティにたずねる」
* [BestGems -- Ruby Gems Download Ranking](http://bestgems.org/) - Gemのダウンロード数ランキング。[Featured Gems Ranking](http://bestgems.org/featured)で最近利用者が増えたgemを追いかけることができる。

---

<p>
This document is licensed under
 <a rel="license" href="http://creativecommons.org/publicdomain/zero/1.0/">CC0</a>.
</p>
[一日一Vim](その6)マクロ

# マクロ
一定の動作を繰り返し行いたいなんてのは
よくあることですが。

vim では `qa` で記録して `q` で記録終了
`@a`でマクロ実行のようです。

ただ、そのマクロを保存しておく。
とかはどうするんでしょうね。
そのあたり、調べておきたいと思います。

# 参考サイト

http://www.ksknet.net/vi/vim_-.html
DNSキャッシュの削除

chromeのアドレスバーに

```
chrome://net-internals/#dns
```
で、clear host cacheボタンをクリック。

ついでに
OSのDNSキャッシュも、

```lang:コンソール
sudo killall -HUP mDNSResponder
```

## 参考にしたサイト

[OS X：DNS キャッシュをリセットする方法](http://support.apple.com/kb/HT5343?viewlocale=ja_JP)

[ChromeのDNSキャッシュをclearしたい](http://crifff.tumblr.com/post/23207516580/chrome-dns-clear)
HTTP通信を確認するためのメモ

サーバーがどのような通信をしているのかをnetstatコマンドでチェック
参考：http://ratememo.blog17.fc2.com/blog-entry-791.html

ping ドメイン
通信がつながっているかをチェックできる。

curlコマンドを使うと、ブラウザ上でどのような通信が行われ、レスポンスを返してくるのかをチェック
参考：http://sitearo.com/cocoa/0800_internet/curl/
Wildflyのインストールレシピ

`Zabbix`で`JMXエージェント`の試行をする前に、
監視対象の`Wildfly`のインストールレシピを作成する。

```rb
# OpenJDKをインストール
package "java-1.7.0-openjdk"

# wildflyをダウンロード・インストール
download_dir = Chef::Config[:file_cache_path]
tar_filename = node['wildfly']['tar_filename']
remote_file File.join(download_dir, tar_filename) do
  source node['wildfly']['tar_url']
end

install_dir = node['wildfly']['install_dir']
jboss_home  = node['wildfly']['jboss_home']
execute "uncompress wildfly.tar.gz" do
  command "tar xf #{File.join(download_dir, tar_filename)} -C #{install_dir}"
  not_if  { Dir.exists?(jboss_home) }
end

# jboss用ユーザの作成
jboss_user = node['wildfly']['jboss_user']
jboss_group = node['wildfly']['jboss_group']
group jboss_group

user node['wildfly']['jboss_user'] do
  gid    jboss_group
  home   "/home/#{jboss_user}"
  action :create 
end

template "/etc/sudoers.d/wildfly" do
  source "sudoers_wildfly.erb"
  mode   0440
  owner  "root"
  group  "root"
  variables(
    :jboss_user => node['wildfly']['jboss_user']
  )
end

# JBOSS_HOME以下のファイル全ての所有ユーザをJBoss用ユーザに変更
execute "modify #{jboss_home} owner" do
  command "chown -R #{jboss_user}:#{jboss_group} #{jboss_home}"
end

# 環境変数の追加（JAVA_HOME、JBOSS_HOME）
template "/etc/profile.d/jboss.sh" do
  source "profile_jboss.sh.erb"
  variables(
    :jboss_home => jboss_home
  )
end

# service経由で起動する際の設定ファイルを作成
# JBOSS_MODE = "standalone"、JBOSS_CONFIG = "standalone.xml -b 0.0.0.0 -bmanagement=0.0.0.0"で動作確認
template "/etc/default/wildfly.conf" do
  source "wildfly.conf.erb"
  variables(
    :jboss_home => jboss_home,
    :jboss_user => jboss_user,
    :jboss_mode => node['wildfly']['jboss_mode'],
    :jboss_config => node['wildfly']['jboss_config']
  )
end

# wildflyをサービス登録、自動起動設定、サービス起動
# ファイルのコピーをfileでやるとエラーになったのでexecuteで実施
execute "copy wildfly-init.sh" do
  command "cp #{jboss_home}/bin/init.d/wildfly-init-redhat.sh /etc/init.d/wildfly && chmod 755 /etc/init.d/wildfly"
  not_if  { File.exists?("/etc/init.d/wildfly") }
end

execute "add wildfly service" do
  command "chkconfig --add wildfly"
  not_if  "chkconfig --list wildfly 2> /dev/null"
end

service "wildfly" do
  supports :status => true, :restart => true
  action   [:enable, :start]
end

# JBossの管理ユーザを追加
management_user = node['wildfly']['management_user']
management_password = node['wildfly']['management_password']
execute "add management user" do
  command "./add-user.sh --silent=true #{management_user} #{management_password}"
  cwd     "#{jboss_home}/bin"
  user    jboss_user
  not_if  "grep '^#{management_user}=' #{node['wildfly']['configuration_dir']}/mgmt-users.properties"
end
```
sudo設定とchmodでの書き込み[メモ]


参考URL
※sudoについて
http://linuxserver.jp/linux/sudo%E3%81%A7%E4%B8%80%E8%88%AC%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%A7%E3%82%82root%E6%A8%A9%E9%99%90%E3%81%A7%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C.php

※chmodについて
http://codezine.jp/unixdic/w/chmod
逆引きレシピ
http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231050/
Hello, Scala! (初めての scala)

# はじめに
* 興味本位で scala のインストールとお決まりの Hello, World までやってみました。
* 今回は Mac でやっています。

# 事前準備
* java のインストール
* HomeBrew のインストール

## java がインストールされているかを確認

```bash
$ java -version
$ javac -version
```

* インストールされていなければ、別途インストール
* ついでにパスが通っているかを確認

```bash
$ echo $JAVA_HOME
```

* 通っていなければ、 .bash_profile に下記を追記

```bash
export JAVA_HOME=/Library/Java/Home
export PATH=$PATH:$JAVA_HOME/bin
```

## HomeBrew がインストールされているかを確認

```bash
$ brew -v
```

# scala のインストール
* HomeBrew を使って scala のインストール

```bash
$ brew install scala
```

* scala のバージョン確認

```bash
$ scala -version
```

> Scala code runner version 2.10.3 -- Copyright 2002-2013, LAMP/EPFL

```bash
$ scalac -version
```

> Scala compiler version 2.10.3 -- Copyright 2002-2013, LAMP/EPFL

# Hello, World の作成

* hello ファイルを作成する
    * 拡張子は .scala

```scala:hello.scala
object Hello {
  def main(args: Array[String]) {
    println("Hello, Scala!")
  }
}
```

* コンパイル

```bash
$ scalac hello.scala
```

* 実行

```bash
$ scala Hello
```

> Hello, Scala!

# 参考ページ
* [公式ページ](http://www.scala-lang.org/)
* [Hello world](http://www.scala-lang.org/documentation/getting-started.html)
Node.jsのORマッパー、Sequelizeのサンプル

## 参考

基本編
http://blog.excale.net/index.php/archives/1173

応用編
http://blog.excale.net/index.php/archives/1538

## サンプルソース

```js:app.js
var Sequelize = require ('sequelize');
var sequelize = new Sequelize('blogapp', 'postgres', 'root', { host: 'localhost', port: 5433,dialect: 'postgres' });
 
//定義
//データ型参考
//http://sequelizejs.com/docs/latest/models#data-types
var User = sequelize.define('User', {
      name: Sequelize.STRING,
      email: Sequelize.STRING
});
 
//create table
//User.sync();
 
//insert
/*
User.create({ name: 'hoge', email: 'hoge@hoge.com'})
    .error(function(err) {
          //エラー時の処理
          console.log(err);
    })
    .success(function(result) {
          //成功時の処理
          console.log(result);
    });
*/
 
//select
User.find({ where: {name: 'hoge'} })
    .error(function(err) {
          //エラー時の処理
          console.log(err);
    })
    .success(function(result) {
          //成功時の処理
          //console.log(result)
          console.log(result.name);
          console.log(result.email);
    });
    
//update
/*
User.update(
    //更新内容
    {
        email: 'foo@foo.com',
        name: 'foo'
    },
    //対象
    { id: '3'}
    )
    .error(function(err) {
          //エラー時の処理
          console.log(err);
    })
    .success(function(result) {
          //成功時の処理
          console.log(result);
    });
*/
 
 
//delete
/*
User.destroy({name: 'foo'})
    .error(function(err) {
          //エラー時の処理
          console.log(err);
    })
    .success(function(result) {
          //成功時の処理
          console.log(result);
    });
*/
```
OS X のディレクトリ構成


|ディレクトリ|説明|
|:--|:--|
|/Users/ユーザ名|各ユーザのホームディレクトリ|
|/Applications|アプリケーションがインストールされるディレクトリ|
|/bin|極めて基本的なコマンドが置かれているディレクトリ|
|/sbin|極めて基本的なシステム管理系のコマンドが置かれているディレクトリ|
|/usr/bin|一般的なコマンドが置かれているディレクトリ|
|/usr/sbin|一般的なシステム管理系のコマンドが置かれているディレクトリ|
|/usr/local|ユーザが自分で管理している、比較的規模が小さいソフトウェアを配置するディレクトリ（`Homebrew`は、このディレクトリ以下にソフトウェアをインストールする）|
|/opt|ユーザが自分で管理している、比較的規模が大きいソフトウェアを配置するディレクトリ（`MacPorts`は、このディレクトリ以下にソフトウェアをインストールする）|

# 参考
[WEB+DB PRESS Vol.80](http://gihyo.jp/magazine/wdpress/archive/2014/vol80?ard=1397998378)
特集3 はじめてのMac開発環境 第２章コマンド操作
香り屋gvimでマークダウンのファイルをシンタックスハイライトする方法＠Mac

## syntax 定義ファイルを持ってくる
* [PlasticBoy](https://github.com/plasticboy/vim-markdown)の
https://github.com/plasticboy/vim-markdown/tree/master/syntax/mkd.vim
が今の所無難そう

* [jtratner](https://github.com/jtratner/vim-flavored-markdown) とかもある


## syntax 定義ファイルを配置する
* /Applications/MacVim.app/Contents/Resources/vim/runtime/syntax 配下に配置する

## 配置したsyntax定義ファイルを読み込むようにする
* `:echo $VIMRUNTIME`して出るパス配下にftdetectディレクトリを作成
> /Applications/MacVim.app/Contents/Resources/vim/runtime/ftdetect

* 上書き定義記載のvimファイル配置

  ```vim:/Applications/MacVim.app/Contents/Resources/vim/runtime/ftdetect/mkd.vim
" Markdown
au BufNewFile,BufRead *.markdown,*.mdown,*.mkd,*.mkdn,*.md set filetype={syntax配下に配置したvimファイル名}
```

以上でmd形式のファイルを開いたときにハイライトされるようになる

## その他
* 無名ファイルにmkdを適用する  
`set ft=mkd`


************************************************************
# Markdown Viewer @Web

* [Markdown Previewer](http://playground.k11i.biz/mp/)
    > ローカルのファイルをドラッグしておけば、ローカルの修正内容が即時反映される

* [Markdown Edit](http://georgeosddev.github.io/markdown-edit/)
    > Auto Reloadにチェックを付ければいい感じ

* [wri.pe#Webエディタ](https://wri.pe/)
    > 使ってないけど気になる

# Markdown Viewer ＠local
* [MarkDown#Editor＠Windows](http://hibara.org/software/markdownsharpeditor/#download)
    > デザインがダサけど動きはそこそこ

* [MarkdownPad＠Windows](http://markdownpad.com/)
    > 定番らしい

* [Kobito＠Mac](http://kobito.qiita.com/)
    > インストールはしたが使っていない


# 参考リンク
* [香り屋Vim](http://www.kaoriya.net/software/vim/)

************************************************************
* [Previm](https://github.com/kannokanno/previm/blob/master/README.mkd)

* [VimでMarkdownをプレビューする環境を整えてみた](http://mba-hack.blogspot.jp/2013/11/vimmarkdown.html)

* [MarkdownのプレビューをVimで見る2つの方法](http://note103.hateblo.jp/entry/2014/02/11/005326)

* [VimでのMarkdown環境を整える](http://rcmdnk.github.io/blog/2013/11/17/computer-vim/)

### マークダウン記法チートシート
* [Markdown記法 チートシート](http://qiita.com/Qiita/items/c686397e4a0f4f11683d)

* [Markdown Cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet)
ClojureからApache Camelを使ってみる

いろんな定常処理を自動でやってくれるらしいApache CamelをClojureから使ってみたいと思います。

まずは、project.cljでcamel-coreへの依存を設定しておきます。

```clj
  :dependencies [[org.apache.camel/camel-core "2.13.0"] [org.clojure/clojure "1.6.0"]]
```

簡単なファイルコピーのサンプルはこんな感じでできました。
このサンプルではsrc/camel_sampleディレクトリ内のファイルを./out.txtにコピーします。（新しいファイルがあったらコピーし続けます）

```camel_sample.clj
(ns camel-sample.core
  (:import [org.apache.camel.impl DefaultCamelContext]
           [org.apache.camel.builder RouteBuilder])
  (:gen-class))

(let [context (DefaultCamelContext.)]
  (.addRoutes context (proxy [RouteBuilder] []
                        (configure [] (.. this
                                          (from "file:src/camel_sample?noop=true")
                                          (to "file:.?fileName=out.txt")))))
  (.start context))
```

Apache Camelの`file:`では`noop=true`のオプションを指定すると、ファイルの移動の代わりにコピーを行います。
※ちなみに`noop=true`とすると`idempotent=true`も設定されるので、同じファイルは複数回コピーされなくなるようです

また、`file:`のURIフォーマットは`file:directoryName[?options]`となっているので、ディレクトリを指定します。単一のファイルを指定したい場合は`fileName`のオプションを使えばよいようです。

上のサンプルを関数・マクロとして定義しなおすと、このようにも書けます。

```camel_sample_core.clj
(ns camel-sample.core
  (:import [org.apache.camel.impl DefaultCamelContext]
           [org.apache.camel.builder RouteBuilder])
  (:gen-class))

(defn- create-builder [f]
  (proxy [RouteBuilder] [] (configure [] (f this))))

(defmacro add-route [context & body]
  `(.addRoutes ~context (create-builder (fn [~'this] (.. ~'this ~@body)))))

(def c (DefaultCamelContext.))
(add-route c (from "file:src/camel_sample?noop=true")
             (to "file:.?fileName=out.txt"))
(.start c)
```

とりあえずは動くところまでできました。
ファイルコピー以外にもSSHでのコマンド実行やSFTPやWindowsファイル共有からのファイル取得、さらにはAmazon, Google, Twitter連携なども、簡単なURIを指定するだけで行えるっぽいですね。
ReactiveCocoaでJavaScriptのsetTimeoutっぽいことをやる


以下のように書けばよい。

```
        [[[RACSignal interval:3 onScheduler:[RACScheduler scheduler]]
                take: 1]

                subscribeNext:^(id x) {
                    NSLog(@"done");
                }]

```
~~(第三引数は適当でよい。RACSignal+Operations.mのソースを確認した限りでは使用していない引数)~~ (第三引数がある版ではタイマーの許容遅延量を指定できるとのこと。コメント欄参照)

ReactiveCocoaのRACSignalには`interval~`と`timeout~`というメソッドがそれぞれ用意されているので、それぞれJavascriptの`setInterval`と`setTimeout`に対応してるかと思いきやそうではない。

`- (RACSignal *) timeout:(NSTimeInterval)interval onSchedular:(RACSchedular *)schedular`
というメソッドはそのシグナルにスケジュールされている何らかのアクションが一定時間内に完了しなかった場合に終了させるためのもの。


上記の例だと1回だけで終了するが、10秒後に終了させたい場合等に`RACSignal timeout~`の方をつかう

```
        [[[RACSignal interval:3 onScheduler:[RACScheduler scheduler] :0]
                timeout:10 onScheduler:[RACScheduler scheduler]]

                subscribeNext:^(id x) {
                    NSLog(@"done");
                }]
```


そもそも`RACSignal timeout~`はインスタンスメソッドになっているので`interval~`と同じような使いかたはできない。


ちなみに `[RACSignal interval:1]`のような書き方はdeprecatedになったので、`RACSchedular`を引数で明示してやる必要がある。
pythonのsqlite3モジュールのメモ


使う度に調べているので、メモメモ。
Connectionのrow_factoryをRowにセットしておくと、クエリの結果に列名でアクセス出来る。

```python:sqlite.py
#!/usr/bin/env python




import sqlite3




con = sqlite3.connect(":memory:")
con.executescript("""
create table temp (hoge text);
insert into temp values ('piyo');
insert into temp values ('fuga');
""")
con.commit()




con.row_factory = sqlite3.Row
cur = con.execute("""
select * from temp
""")




for c in cur:
    print c["hoge"]
```
Node.jsをHerokuへデプロイ

## heroku toolbeltのインストール

heroku toolbeld（heroku推奨）
https://toolbelt.heroku.com/

herokuコマンドと同時にrubyとgitが同時にインストールされる。

すでにRubyや、windowsでmsysgitをインストールしていると、rubyやgitのバージョンが下がることもある。

すでにRubyをインストールしている場合は

```
$ gem install heroku
```


herokuツールベルトのバージョン確認

```
$ heroku version
```

herokuコマンドのhelp


```
$ heroku help
```

## herokuにログイン


herokuに登録したEメールとパスワードをきかれる

```
$ heroku login
```

sshキーが使用中のPCアカウントになければsshキーの生成


```
$ ssh-keygen
```

windowsではssh-keygenコマンドは実行できないが、msysgitを使えば可能

herokuにssh公開鍵をアップロード

```
$ heroku keys:add ~/.ssh/id_rsa.pub
```

herokuの管理画面からでも可能


## Herokuにからアプリをコマンドから生成

cd アプリのパス

git init

git status

herokuに空アプリ生成

heroku create アプリ名（半角英数字記号ハイフンのみ）

※heroku createだけだと勝手にアプリ名が付けられる

package.jsonに使用するモジュールを記述

※Expressを使用する場合はpackage.jsonのファイルは自動生成される

```json:package.json
{
  "name": "application-name",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app.js"
  },
  
  "engine": {
    "node": "v0.10.x",
    "npm": "1.3.x"
  },
  "dependencies": {
    "express": "3.3.4",
    "ejs": "*",
    "mongodb": "*" //←使用するモジュールを追加しておく
  }
}
```


参考
Node.jsのバージョン確認
node -v
npmコマンドのバージョン確認
npm -v


## Procfile作成

アプリを起動するコマンドを指定（※拡張子なし）

```:Procfile
web: node app.js 
```

CoffeeScriptで起動する場合

```:Procfile
web: node app.coffee
```


デプロイする前にコミットしておく


cd myapp

git init



git add Procfile *.js *.json public views routes



git commit -m "コミットメッセージ"


git tag v1.0


node_moduleは.gitignoreに登録

```:.gitignore
node_modules
.
.
```

リモートリポジトリ追加

※heroku create app名のときに自動的に追加されている



git remote add heroku git@heroku.com:アプリ名.git




リモートリポジトリ削除



git remote remove heroku




herokuにpush



git push heroku master




アプリを既定のブラウザで起動



heroku open



更新



git add .



git commit -m "message"



git push heroku master


heroku run rake db:migrade



heroku run rake db:seed

```json:package.json
{
        "name": "sample03",
        "version": "0.0.1",
        "private": true,
        "scripts" : {
                "start": "node app"
        }
        "engines": {
                "node": "0.8.x",
                "npm": "1.1.x"
        }
        "dependencies": {
                "express": "3.0.0beta7",
                "jade": "*"
        }
}
```

Procfile

web: node app.js


foreman start

ローカルでアプリケーションが実行できるか確認するコマンド

ctrl + c



heroku apps:info



heroku logs



heroku apps:destroy



heroku apps:destroy -a node-sample-2012-0922 --confirm node-sample-2012-0922



参考
Herokuで作るFacebookアプリ 
http://gihyo.jp/dev/serial/01/heroku



heroku再起動
heroku restart
Objective-Cでカテゴリ拡張およびUtilクラスによる空文字列チェック


先日、以下のような記事を書いた。
[Objective-Cで空文字列のチェック iOS](http://qiita.com/YusukeHosonuma/items/3103ca5353fd585b08bd)

ざっくりといえば、Objective-Cの言語仕様上、nilに対するメッセージ送信はnil(0)を返すので、空文字列チェックは以下でよいというものだ。

```objectivec
if ([someString length])
```

しかし、コメント欄にてカテゴリ拡張やStringUtils的な方がすっきりするのでは、というご意見をいただいた。ということで試してみた。

ちなみに今回はXCTestによるテストコード付き。

カテゴリ拡張バージョン
------------------

```objectivec:NSString+Additions.m
#import "NSString+Additions.h"

@implementation NSString (Additions)

- (BOOL)isNotEmpty {
    return [self length] > 0;
}

@end
```

```objectivec:XCTest
- (void)test_Additions_isNotEmpty
{
    NSString *string;
    
    string = @"foo";
    XCTAssertTrue ([string isNotEmpty], @"長さを持った文字列はTrueを返す");
    
    string = @"";
    XCTAssertFalse([string isNotEmpty], @"長さが0の文字列はFalseを返す");
    
    string = nil;
    XCTAssertFalse([string isNotEmpty], @"nilに対しては(言語仕様上)Falseを返す");
}
```

StringUtilsバージョン
-------------------

```objectivec:StringUtils.m
#import "StringUtils.h"

@implementation StringUtils

+ (BOOL)isEmpty:(NSString*)string {
    return string == nil || [string length] == 0;
}

+ (BOOL)isNotEmpty:(NSString*)string {
    return ![StringUtils isEmpty:string];
}

@end
```

```objectivec:XCTest
- (void)test_StringUtils_isEmpty
{
    XCTAssertFalse([StringUtils isEmpty:@"foo"]);
    XCTAssertTrue ([StringUtils isEmpty:@""]);
    XCTAssertTrue ([StringUtils isEmpty:nil]);
}

- (void)test_StringUtils_isNotEmpty
{
    XCTAssertTrue ([StringUtils isNotEmpty:@"foo"]);
    XCTAssertFalse([StringUtils isNotEmpty:@""]);
    XCTAssertFalse([StringUtils isNotEmpty:nil]);
}
```

感想
---
個人的には、StringUtils的なクラスを作ったほうが分かりやすいと感じた。

nilに対するメッセージ送信結果がnil(0)であるという言語仕様上、
カテゴリ拡張バージョンは、isEmptyを提供できないのが非常に歯がゆい。
Node.jsでRedisと連携する

node_redis npmパッケージサイト
https://npmjs.org/package/redis

node_redis GitHubサイト
https://github.com/mranney/node_redis

## インストール

```
$ npm install redis
```

## サンプルコード

```js:app.js
var http = require('http');
var redis = require('redis');
var client = redis.createClient();
 
var kyeword = '';
 
//文字列挿入
client.set('mydata', 'こんにちは');
 
//文字列検索
client.get('mydata',function(err,data){
        keyword = data;
});
 
//ハッシュデータ検索
var find = ['email', 'score'];
client.hmget('myhash',find,function(err,replies){
    replies.forEach(function(reply, i){
        //コンソールに出力
        console.log(find[i] + ': ' + replies[i]);
    });
});
 
//ハッシュデータ全リスト
client.hgetall('myhash',function(err,replies){
    //コンソールに出力
    console.log(replies);
});
 
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    
    //文字列をブラウザに出力
    res.end(keyword + '\n');
    
}).listen(1337, '127.0.0.1');
 
console.log('Server running at http://127.0.0.1:1337/');
```
Docker で OpenGL(GLX) アプリを動かす.


漢なら Docker で OpenGL アプリを HW accelerated で(GLX)動かしたいですね!

できました.

https://github.com/syoyo/docker-utils/tree/master/ubuntu-glx

## TODO

現状だと 1 container が GPU を占有するようなので, 複数 container で共有できるようにする.
PHPにおけるシングルクォーテーションとダブルクォーテーションの違い

シングルクォーテーションとダブルクォーテーションの違いで詰まった。



http://qiita.com/suin/items/cbbbe8844fd734fa20e2 を参考にした、改行コードを統一するコード

```php
$tmp = preg_replace("/\r\n|\r|\n/",'\n', $hogehoge);

$tmp = preg_replace("/\r\n|\r|\n/","\n", $hogehoge);

```

どのように挙動が異なるかは上のコードと以下を続けて試してみれば良い。
4パターンが想定される。

```php
explode('\n',$tmp);
explode("\n",$tmp);
```

クォーテーションを統一しないと、意図したとおりの挙動を示さない。

というのも、シングルかダブルかによって、\nを改行として扱うかが変わるからだ。

ダブルはシングルより多くの文字を、エスケープして扱う。

http://www.php.net/manual/ja/language.types.string.php#language.types.string.syntax.double を見れば何がエスケープされるか分かる。

変数の展開だけがクォーテーションの違いではないという教訓です。
scala の validation イディオム

パラメータをバリデーションするのにfor を使うのがイディオムなのかなー。

```scala
case class Person(val name:String)

object Hello {
        def validate(p:Person):Either[String,Boolean] =
                for {
                        _ <- checkNotNull(p).right
                        v <- checkNotNullAndEmpty(p.name).right
                } yield v

        def checkNotNull[A](a:A):Either[String,Boolean] = if (a==null) Left("is null") else Right(true)
        def checkNotNullAndEmpty[A](s:String):Either[String,Boolean] = {
                if (s==null) Left("is null")
                else if (s=="") Left("is empty")
                else Right(true)
        }

        def main(args:Array[String]) = {
                val p0 = new Person("taro")
                val p1 = null
                val p2 = new Person(null)
                val p3 = new Person("")

                val list = for ( p <- List(p0,p1,p2,p3)) yield (p, validate(p))

                println(list)
        }
}
```

```bash
└─[0] sbt run
[info] Set current project to validation (in build file:/Users/iwag/Devel/sandbox/scala/validation/)
[info] Running Hello
List((Person(taro),Right(true)), (null,Left(is null)), (Person(null),Left(is null)), (Person(),Left(is empty)))
[success] Total time: 1 s, completed 2014/04/20 17:06:23
```

どうでもいいけど、for () と for {} の違いなんだっけって思ったら、()ないだと区切りは;、{}だと改行。

元ネタ。
http://stackoverflow.com/questions/21351391/how-to-accumulate-errors-in-either-in-scala
http://stackoverflow.com/questions/12307965/method-parameters-validation-in-scala-with-for-comprehension-and-monads
元のstackoverflowは検出したエラーをaccumulateしたいとかだけど。