OmniAICreator/Qiita-1.07M huggingface dataset:
MacにTomcatをインストールする


PHPerな僕ですが時々Tomcatが欲しくなる時もあります。  
ということでMacにTomcat入れる方法を考えてたのですが、よく考えたらhomebrew使えばいいんですよね。

## brewがあるか調べる

```
$ brew search tomcat

tomcat	       tomcat-native
homebrew/versions/tomcat6    homebrew/versions/tomcat7
```

どうやらあるみたいです。

## とりあえずインストールしてみる

```
$ brew install tomcat

==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/tomcat-7.0.54.mountain_lion.bottle.tar.gz
######################################################################## 100.0%
==> Pouring tomcat-7.0.54.mountain_lion.bottle.tar.gz
?  /usr/local/Cellar/tomcat/7.0.54: 623 files, 14M
```

無事に7.0が入ったぽい。

## 起動してみよう

```
$(brew --prefix)/bin/catalina start
```


![kobito.1415335350.244903.png](https://qiita-image-store.s3.amazonaws.com/0/2095/ac283328-aa5f-89bb-76b7-a013dd199ab7.png "kobito.1415335350.244903.png")


 起動できた。めでたしめでたし。
iOS7 Safari固定要素問題の回避策

## 概要
iOS7 SafariでURL・ブックマークバーが表示・非表示になる仕様変更を行ったため、position: fixed;などで上下に要素を固定している場合にバグが発生することが出てきました。

### バグ一例
* 上部（または下部）固定したナビゲーションに、表示したURLバーがかぶさる
* 一定条件下で、固定したエリアのクリック・タップイベントが起こらない
    * URLバーが表示に切り替わった直後、画面をスクロールせずにボタンを押すと問題が発生（固定ヘッダーの位置が変わるため起こっている？）

等々



## 回避策
resizeイベントが発生しないということで回避策に困っていましたが、

参考：[iOS7 では URL バーの表示／非表示が切り替わるタイミングのイベントが走らない](http://h2ham.net/ios7-urlbar-resize)

下記の方法に辿りつきました。

[Safari on IOS7 – Address and Bookmark Bars Fixed Position Bug](http://steveush.wordpress.com/2014/03/13/safari-on-ios7-address-and-bookmark-bars-fixed-position-bug/)

ざっくり説明すると、__“実際のscreenの高さとviewportの高さを一定時間ごとに比べて、監視を続ける”__という感じです。
とても無理やりな感じですがどうしても対応しなくてはならない場合は、この方法を検討してみるのもいいかもしれません。

下記コードは参考元のママコピペですがメモまでに。

    /**
     * This fix should only be applied when your content is shown. In my case it was a modal so this script is only executed
     * on Safari on IOS7 when my modal is shown and stopped once the modal is closed.
     */
    (function(){
      var ios7bars = null, // Variable to hold the state of the address and bookmarks bar so the event is triggered only once per state once.
          refresh = function(){ // This function forces Safari to redraw the page and triggers the window resize event that was removed.
            window.scrollTo(document.body.scrollLeft, document.body.scrollTop);
            window.dispatchEvent(new Event('resize'));
          };
     
      setInterval(function(){
        var landscape = window.orientation == 90 || window.orientation == -90,
            viewportHeight = window.innerHeight,
            // The testHeight is based off the actual screen height multiplied by a fudge factor that allows for the status and mini address bar in portrait mode and the fullscreen in landscape mode.
            testHeight = (landscape ? screen.availWidth : screen.availHeight) * 0.85;
     
        if ((ios7bars == null || ios7bars == false) && ((landscape && viewportHeight < testHeight) || (!landscape && viewportHeight < testHeight))){
          ios7bars = true;
          refresh();
        } else if ((ios7bars == null || ios7bars == true) && ((landscape && viewportHeight > testHeight) || (!landscape && viewportHeight > testHeight))) {
          ios7bars = false;
          refresh();
        }
      }, 500); // To get a better response to the bars being toggled you can lower the interval however the lower you go the more page performance on a whole may slow down.
    })();
Apache rewirteルールの第三引数の説明

# rewirteルールの第三引数の説明

## 第三引数の説明

|第三引数|説明|
|--------------|------------------------|
|[C]|chain 次のRewriteRuleと条件を結合する(置換禁止文字列”-“を用いて複数の条件をANDで複合適用する場合に用いる)|
|[E]|environment E=VAR:VAL 環境変数のセット。VAR という名前の環境変数の値を VAL に するよう指示します|
|[F]|forbidden(403) マッチしたURLへのアクセスを禁止する(クライアントには”403 Forbidden”のレスポンスが返される)|
|[G]|gone(410) マッチしたURLは行方不明であることを伝える(クライアントには”410 Gone”のレスポンスが返される)|
|[L]|last 条件にマッチした場合そこで判定を終了する(以下に続くRewriteRuleを評価しない)|
|[N]|next 書き換えが済んだURLを新たなリクエストとして書き換え処理を再度最初のルールから繰り返す|
|[P]|proxy PROXYモジュールを使用して他のサーバー(URL)にあるコンテンツを取得しその内容をクライントに返す|
|[R]|redirect “302 Moved Temporaily”のレスポンスを返しクライアントをリダイレクトする。[R=301] と書けば、”301 Moved Permanently”に変更することもできる|
|[S]|skip 現在のルールがマッチしたら、次の'数字'番目のルールをスキップするよう指示します。これを使って、擬似的に if-then-else 構造を作ることができます|
|[NC]|no case 大文字小文字を区別しない|
|[NE]|no escape 書き換え結果に対して通常行なわれるURLエスケープルールを適用しないようにします。出力の中にパーセント文字を 使うことができます|
|[NS]|no subrequest 一次的なURLリクエストの場合のみ条件を評価(サーバー内部で発せられるサブリクエストの場合は判定をスキップする)|
|[OR]|or 条件をorでつなぐ(背反する and は暗黙であるため、何も書かなければ and として扱われる)|
|[PT]|pass through mod_alias と mod_rewrite の同時使用時などで使用する|
|[QSA]|query string append 置換文字列の中でマッチしたものを書き換えるのではなく、そこにクエリー文字列部分を追加するように書き換えエンジンに強制します。書き換えルールを通してクエリー文字列に何かデータを追加したい場合にこのフラグを使います|

オプション機能は組み合わせて使用することもできる。
例）[R=301,L,NS]

## QSAフラグがあるケース

上記のように入力URLにクエリ文字列が存在する場合は、QSAをいれて以下のようにしておけばよい。
RewriteRule ^/(.+)/pg/(.*)$ /$1/index.php?pg=$2 [QSA,L]
http://hikkosizamurai.jp/fork/pg/sample?code=1 はhttp://hikkoshizamurai.com/fork/index.php?pg=sample&code=1
のように最後にクエリ文字列code=1が付加された形に変換される。
レスポンシブデザイン時のposition指定方法

レスポンシブデザイン（リキッドレイアウト）時の、ポジションスタイルの記述方法です。

## 指定方法
left、right値をコンテンツエリア（親要素）に対してそれぞれパーセントにて指定すると、親要素の幅に合わせて子要素が可変するようになります。
top、bottomは適宜指定して下さい。
なお画像の場合は“Fluid Image”を忘れずに。

## 例
ざっくりですが、下記のようになります。

### ■デザイン
![position_img.png](https://qiita-image-store.s3.amazonaws.com/0/42330/57fda540-00c1-6a78-da08-ccc8c0d546cc.png)
※コンテンツエリア640pxの場合のデザインです


### ■マークアップ

#### HTML

    <div class="contentsArea">
      <div class="circle"><img src="circle.png" alt=""></div>
      <div class="rect"><img src="rect.png" alt=""></div>
    </div>

※円形をクラスcircle、長方形をクラスrectとしております

#### css

    .contentsArea {
      position: relative;
    }
    .contentsArea .circle,
    .contentsArea .rect {
      position: absolute;
    }
    .contentsArea .circle {
      top: 20%;
      left: 15.625%;
      right: 62.5%;
    }
    .contentsArea .rect {
      top: 70.25%;
      left: 37.5%;
      right: 15.625%;
    }
    .contentsArea img{
      max-width: 100%;
    }
【メモ】WindowsでGit(msys2でEGit)

WindowsでGitを使う場合、実は3つ(以上)の方法がある。

ひとつは、Git for Windows(所謂msys-git)を使う。
Cygwinを入れる。
そして、もう一つは、msys2を入れる。

Cygwinとmsys2、大きな差はないように感じられるけど(実際に似てるから、大差ないのかも)、今回はmsys2を使う。

msys2ではパッケージ管理にpacmanというコマンドを使うため、初めての方も多いだろうが、使い方の説明は割愛する。


まぁ、基本はapt-get install <パッケージ>みたいに、pacman -S <パッケージ>とか、アップデートはyum updateな感覚でpacman -Syuだけで、時折、パッケージを消して入れ直さないと、アップデート出来なかったりすることもある(でも、msys2だから気にしない)

と、前置きが長くなったが、msys2のコンソールから

pacman -S git

とする。

インストールの許可を求められた後に勝手にインストールしてくれるから、あとは待つだけ。

そして、今回の目玉(？)…お椀が湯船…ではないが、EclipseのEGitに設定してみる。

Window → Performances → Team → Git → ConfigurationのSystem Settingsタブを選択し、
Browse...をクリックする。

C:¥msys64¥usr を選択すると、

Location: には、C:¥msys64¥usr¥etc¥gitconfig

が設定されるはずなので、OKを押して設定終了。

まさかの、msys-git無しで行けるようになっていたとは！状態である。
0って10進数/8進数どっちのリテラル?

Stack Overflowで見かけたちょっと変わった質問とその回答。

質問：[Is 0 a decimal literal or an octal literal?](http://stackoverflow.com/questions/6895522/)

回答：[8進リテラル](http://stackoverflow.com/questions/6895522/6895543#6895543)

> +1 for asking an entirely irrelevant question and getting tons of upvotes :-)
CoreOSのNIC冗長化



# 参考

* [Introduction to networkd, network management from systemd](https://coreos.com/blog/intro-to-systemd-networkd/)
* [CoreOS cloud-init cloud config for bonding/nic teaming](https://gist.github.com/spkane/8f117f67533822b2481f)
* [CoreOS + etcd + fleetによるクラスタリング事始め - さくらのナレッジ](http://knowledge.sakura.ad.jp/tech/2519/)

# 設定

```yml:cloud-config.yml
#cloud-config
 
coreos:
  units:

    - name: eth0.network
      command: restart
      content: "[Match]\nName=eth0\n\n[Network]\nBond=bond0"
    - name: eth1.network
      command: restart
      content: "[Match]\nName=eth1\n\n[Network]\nBond=bond0"
    - name: bond0.netdev
      command: restart
      content: "[NetDev]\nName=bond0\nKind=bond"
    - name: bond0.network
      command: restart
      content: |
        [Match]
        Name=bond0
 
        [Network]
        Address=192.168.100.4/24
        Gateway=192.168.100.1
        DNS=8.8.8.8
        DNS=8.8.4.4
```

> ip link set eth0 down

一回これしないとダメだった

# /etc/issue

eth0の表示をさせているのでbond0とか修正すればよいのかな。
Webページの更新日時を調べる方法

当時は有益な情報だったとしても、
時間経過と共に劣化していくもの。

よって、
そのWebページの更新日時を確認することで、
情報が効果的かどうか判断することができる。


##Chrome

1.Ctrl+Shift+JでjavaScriptコンソールを出し、
「javascript:alert(document.lastModified);」
　を打つ。

2.ブックマークのアドレス部分に
「javascript:alert(document.lastModified);」を
　登録し調べたいページでそのブックマークを
　クリックする

3.拡張機能「lastModified」を導入し右クリックで調べる


##Firefox

1.Ctrl+Shift+KでjavaScriptコンソールを出し、
「javascript:alert(document.lastModified);」
　を打つ。

2.ブックマークのアドレス部分に
「javascript:alert(document.lastModified);」を
　登録し調べたいページでそのブックマークを
　クリックする

3.アドオン「LastModified Date」を導入しアドレスバーの
　左側に表示される内容を確認する


##その他のブラウザ

同様にブックマーク登録するかjavaScriptコンソールを出し、
「javascript:alert(document.lastModified);」を打つ

###注意点

・あくまでもサーバー上にそのページがアップロード
　された日時なので古い内容を変更せず再度上書きで
　アップロードしていればわからない

・.html等の静的ページにのみ有効で、.phpの動的なページ
　だと現在の時刻が返ってきてしまう

・まれに更新日時を知られたくない場合「lastModified」対策
　をしているページがあること


####ref

http://d.hatena.ne.jp/upquark/20121224/p1
CoreOSでnfsd

## 参考

* [RPCMNT: clnt_create: RPC: Program not registered - FreeBSD/footnote](http://d.hatena.ne.jp/footnote/20130811/1376191183)

## CoreOS側の準備

```bash:/etc/exports
/mnt 192.168.100.0/24(rw,sync,no_subtree_check,all_squash)
```

* Nobodyとしてアクセスすることになる。Mappingは`/etc/idmapd.conf`で定義。

```bash:設定反映
exportfs -rav
```

```bash:サービス起動
systemctl start rpc-mountd
systemctl start nfsd
```

`rpcinfo -p`で`mountd`が存在することを確認。


## マウント

```bash:
mount 192.168.100.4:/mnt a
```
Go 配列の宣言 罠

？？？って思ったのでメモ

```go
// これはOK
urls := []string {
	"http://udzura.jp/hello/world",
	"http://udzura.jp/hello/hoge3",
	"http://udzura.jp/hello/FooBar",
	"http://udzura.jp/hello/yey_123"}
```

```go
// これはNG
urls := []string {
	"http://udzura.jp/hello/world",
	"http://udzura.jp/hello/hoge3",
	"http://udzura.jp/hello/FooBar",
	"http://udzura.jp/hello/yey_123"
	}
```

```go
// これはOK
urls := []string {
	"http://udzura.jp/hello/world",
	"http://udzura.jp/hello/hoge3",
	"http://udzura.jp/hello/FooBar",
	"http://udzura.jp/hello/yey_123",
	}
```

----

今思ったけど、ツアーオブゴーに書いてたっけ...
gitでコミットの内容をissueにひもづける

githubのissueでタスクなどを管理している場合、コミットをissueに紐付けたいかと思います。

その場合にどうするか。

コミットのコメントにissueの番号をつけるだけです。

```
#501 バグ修正
```

これだけでOK！！！...かと思いましたが、実はダメでした。

<pre>
Aborting commit due to empty commit message.
</pre>

コミットメッセージが空だからコミット中止したよ！と。

実は、行頭の`#`というのはコミットログの中ではコメントとして認識されてしまうのです。

なので、下記のように、先頭にスペースをつける。
何か文字列を追加するなどして、この`#`はコメントの`#`って意味じゃないよ。
ということをgitに教えてあげる必要あります。

* 先頭にスペースを入れる

```
 #501 バグ修正
```

* 先頭に文字列を入れる

```
fix #501 バグ修正
```
[Swift] AnyObject を CGRect や CGSize にキャストするイディオム

Swift では `CGRect` や `CGSize` 系の構造体は `AnyObject` として扱えません。
なので、`NSValue` にしてやりとりする必要があります。

```swift
func hoge(obj: AnyObject) {
    let size = (obj as NSValue).CGSizeValue()
}
hoge(NSValue(CGSize: CGSizeMake(5, 10)))
```

で、ReactiveCocoa とか使っている時に 引数が `AnyObject` で `CGSize` や `CGRect` を受け取るときは、`NSValue` で渡されていると思うので、`NSValue` で受けてやります。

```swift
RACObserve(self.tableView, "contentSize")
    .subscribeNext({
        let size = ($0 as NSValue).CGSizeValue()
        size.width
        size.height
    })
```
Mac YosemiteのTerminalのshellをzshにする

簡単な小ネタを一つ。

##ハマったところ
普通にTerminalを開いて`chsh`で変更しようとしたら、変更できなかった。

```
chsh: /usr/local/bin/zsh is an invalid shell
```

とかでやがった。invalidじゃねえよ！

##解決方法

2コマンドでOK!

```
command -v zsh | sudo tee -a /etc/shells
sudo chsh -s "$(command -v zsh)" "${USER}"
```
DB 設計時のサイズ見積り[最新版]

こんにちは、すっかり秋ですね！[@yone098](http://twitter.com/yone098) です。
みなさんDBの設計してますか？

[DB設計時のサイズ見積り](http://d.hatena.ne.jp/yone098/20090512/1242088638) <img src="http://b.hatena.ne.jp/entry/image/http://yone098.hatenablog.com/entry/20090512/1242088638" title="はてなブックマーク - DB設計時のサイズ見積もり" alt="">

以前はてなダイアリーで書いた記事は5年前のものであり、リンクが切れているものがあるので最新版として MySQL, PostgreSQL, Oracle, SQLServer におけるDB設計時のサイズ見積りをまとめ直しました。

# MySQL
URL内のバージョン表記を変えると以前のバージョンの情報になります。
MySQLは、あまり情報に変化は無かったので Excel でマクロなどを作成して自社で自動算出出来るようにするのが良いと思います。
データタイプごとに必要な要求ストレージが決まっているのでレコードサイズが決まり、あとは要件次第で何レコードになるかを予測します。


#### データタイプごとに必要な記憶容量
http://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html


#### テーブルの最大サイズ関連
http://dev.mysql.com/doc/refman/5.6/en/full-table.html
http://dev.mysql.com/doc/refman/5.6/en/table-size-limit.html

#### キーに必要な領域
http://dev.mysql.com/doc/refman/5.6/en/key-space.html

#### InnoDB ファイル領域の管理とディスク I/O
http://dev.mysql.com/doc/refman/5.6/en/innodb-disk-management.html


# PostgreSQL
バージョン8.2から9.3まで。
PostgreSQL に関しても Excel マクロを作って概算をすぐ算出出来るようにしておくとハードディスクの容量算出などに役立つと思います。

#### ディスク使用量の決定
http://www.postgresql.jp/document/8.2/html/disk-usage.html
http://www.postgresql.jp/document/8.3/html/disk-usage.html
http://www.postgresql.jp/document/8.4/html/disk-usage.html
http://www.postgresql.jp/document/9.0/html/disk-usage.html
http://www.postgresql.jp/document/9.1/html/disk-usage.html
http://www.postgresql.jp/document/9.2/html/disk-usage.html
http://www.postgresql.jp/document/9.3/html/disk-usage.html


# Oracle
以前は OTN からログインしてオンラインで容量見積りが出来たのですが現在はサイトのリンク切れが多くて見つけられませんでした。
追記：Oracleのオンライン領域サイズ見積りサービスは2010年に終了したとコメント頂きました。
http://www.oracle.com/technetwork/jp/content/index-097457-ja.html

#### 見積りシート
ダウンロード出来る見積りシートの URL は以前のままのようでしたので以下リンクから直接ダウンロードしてローカルでツールを使って算出しましょう。
軽く調べてみたものの、OTN内で該当ページは見つかりませんでした。
http://otndnld.oracle.co.jp/deploy/maintenance/zip/est_tool.zip

#### 領域サイズの見積り方法
古いですが、情報として知っておいて損はないpdfです。
http://otndnld.oracle.co.jp/deploy/maintenance/pdf/size_est.pdf


# SQLServer
msdn のサイトは数年前のURLがそのまま生きておりました。素敵！

#### データベース サイズの見積もり
http://msdn.microsoft.com/ja-jp/library/ms187445.aspx

#### テーブル サイズの見積もり
http://msdn.microsoft.com/ja-jp/library/ms175991.aspx

#### ヒープ サイズの見積もり
http://msdn.microsoft.com/ja-jp/library/ms189124.aspx

#### クラスタ化インデックスのサイズの見積もり
http://msdn.microsoft.com/ja-jp/library/ms178085.aspx
gitのコミットログの内容を修正する

#### 直前のコミットログを修正する

```
git commit --amend
```

これでコメントの内容を修正して、`:wq`で保存して終了すれば書き換えられます。

#### 直前以外のコミットログを修正する

例) 過去3つ分のコミットログを修正

* 1. 編集対象のコミットを選ぶ

```
git rebase -i HEAD~3
```

エディタが開きます。
コメント修正したいコミットの、`pick`ってなってる部分を`edit(eでもOK)`に書き換えて保存。

* 2. コメントを編集する

```
git commit --amend
```

これでコメントを修正して保存します。

```
git rebase --continue
```

編集するコミット分だけ、`git commit --amend`と`git rebase --continue`を繰り返す。
rails consoleにて、dbをproductionに接続する。


何かとrails consoleでデータを加工したり、出力したりする際に、適当なスクリプト作成して、ローカルで確認して、スクリプトをプロダクションにコピーして、console立ち上げてとか、めんどい。

sshでトンネル接続して、そこに接続

## database.ymlの設定
プロダクション環境のDB、ならびに、ssh設定

```yml
production_tunnel:
  adapter: mysql2
  host: 127.0.0.1
  port: 1234
  encoding: utf8
  reconnect: false
  database: <your databaes name>
  pool: 5
  timeout: 5000
  username: <your user name>
  password: <your password>
  socket: <your socket path if you need>
```

## ssh接続
```bash
ssh username@host -L 1234:127.0.0.1:production_port
```

## rails console
```bash
#起動
rails c
```

```ruby
#接続先変更
ActiveRecord::Base.establish_connection(:production_tunnel)
```

以上
[apache]外と内で見せるサイトを切り替える設定例

外側からは準備中サイトを見せつつ、内側（社内アクセスとか）では開発中のβサイトを見せたい！apacheでそんな設定を書いてみた例です。

##前提
この設定は静的コンテンツのみのサイトを前提にしています。動的コンテンツは考慮していません。

今回の例として以下のようなディレクトリ構成を取ります。
外からのアクセスでは、一部のページを除いて全て準備中ページ (/common/html/coming_soon.html) を返すようにします。

```
 DocumentRoot/
   ├ ja/
   │  ├ html/
   │  └ とかとか
   ├ en/
   │  ├ html/
   │  └ とかとか
   └ common/    #言語によらず共通のhtml,css,jsなど
      ├  html/    #今回はここに準備中ページを置きます
      │    ├ coming_soon.html
      │    └ とかとか
      └ とかとか
```

##設定例

```
# 内外のアクセスを判別する設定
# 例としてクライアントのIPで判別します
SetEnvIf Remote_Addr "xxx.xxxx.xxx.xxx" inside_user

# 外部に見せていいページの設定
## 各言語のトップページ
SetEnvIf Request_URI "^/(ja|en)(/?|/index.html)$" open_uri

# /common以下 (準備中ページもこれで公開します)
SetEnvIf Request_URI "^/common/*$" open_uri

# 各言語の404ページ
SetEnvIf Request_URI "^/(ja|en)/404.html$" open_uri

# 各言語のヘッダ・フッタ
SetEnvIf Request_URI "^/(ja|en)/html/header.html$" open_uri
SetEnvIf Request_URI "^/(ja|en)/html/footer.html$" open_uri

# favicon
SetEnvIf Request_URI "^/favicon.ico$" open_uri

# リクエストの振り分け設定
Listen 80
<VirtualHost *:80>
  DocumentRoot /xxx/yyy/zzz
  RewriteCond %{ENV:inside_user} ^$  # 内側からのアクセスではなくて
  RewriteCond %{ENV:open_uri} ^$     # 外部に公開していないURLで
  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} -f [OR]　# リクエストしたリソースが存在する場合は
  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} -d
  RewriteRule ^(.*)$ http://myhost.com/common/html/coming_soon.html [P,L]  # 準備中ページを見せる

  # 他に必要な設定を書く
  ....
</VirtualHost>
```
Loki.js: Mongo風APIを持ったクライアントJS/node両対応のストレージエンジン

某アプリでストレージどうしようかなーという感じだったので適当に探してて、昨日echo.jsで偶然紹介されてたライブラリ、試してみたらチョット便利だったので紹介。

[Lightweight javascript in-memory database: LokiJS](http://lokijs.org/#/ "Lightweight javascript in-memory database: LokiJS")

注意: 自分はnode環境下で試したので、以下のサンプルはnode用です。ブラウザでも動くはずです。

## 特長

Mongo風API。

```javascript
var DB_PATH = process.env.HOME + '/.loki.json'
var db = new Loki(DB_PATH);
var items = db.addCollection('items');

items.insert({a: 1, b: 2});
items.insert({a: 2, b: 3});

obj = items.findOne({a: 1}) // search by json query
obj.a = 3;
items.update(obj) // update first item
```

## 永続化する

```javascript
var DB_PATH = process.env.HOME + '/.loki.json'
var db = new Loki(DB_PATH);
var items = db.addCollection('items');
items.insert({foo:1, bar: '2'});
items.saveToDisk()
```

この例だと saveToDiskで ~/.loki.json にデータが書き出されます。

自分も最初勘違いしていたんですが、node環境下でもsaveToDiskしたものは次回起動時に自動的に読み込まれてはいません。
次のように初期化時に読み込む必要があります。

```javascript
var DB_PATH = process.env.HOME + '/.loki.json'
var db = new Loki(DB_PATH);

var initDb = function(cb){
  if(!fs.existsSync(DB_PATH)) {
    db.loadDatabase(function(serialized){
      db.loadJSON(serialized)
      cb();
    });
  } else {
    cb();
  }
}

initDb(function(){
  // Storages restored
})
```

## 雑感

- クライアント-サーバー間で同じコードでストレージを永続化したい時に便利な気がする
  - バックエンドはIndexedDb or ファイルストレージ
- Mongoを知ってる自分にはMongo風APIの書き味は良い
- 全部オンメモリに乗ってしまい、毎回大きな一つのjsonで書きだすので、大きなデータの一部を高い頻度書き換えるようなものには向かない気がする
　　- 中規模のアプリなら問題なさそう(TODOアプリとか)
Python で Project Euler #4「最大の回文積」

[Problem 4 「最大の回文積」](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%204)

> 左右どちらから読んでも同じ値になる数を回文数という. 2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である.
> では, 3桁の数の積で表される回文数の最大値を求めよ.

```py:Python
digits = 3

min_num = 10 ** (digits - 1)
max_num = (10 ** digits) - 1
seq = range(min_num ** 2, (max_num ** 2) + 1)

def is_kaibun(x):
  x_str = str(x)
  x_str_reverse = x_str[::-1]
  return x_str == x_str_reverse

def is_same_digits(num1, num2):
  return len(str(num1)) == len(str(num2))

result_dic = {}
for x in seq:
  if(is_kaibun(x)):
    for i in range(min_num, max_num+1):
      if x % i == 0 and is_same_digits(i, x/i):
        result_dic[x] = (i, x/i)
        break
 
result = max(result_dic.keys())
print result
print result == 906609
print result_dic[result]
```

```:結果
906609
True
(913, 993)
```
[swift]unwind segueを設定する


久々にStoryboardをいじっていたら、すっかり忘れてはまったのでメモ。
## Cancelボタンを押して前の画面に戻る
子画面から戻る遷移をつけたい場合、Storyboard上でCancelボタンをExitへCtrl＋ドラッグする。

![kobito.1415320044.458358.png](https://qiita-image-store.s3.amazonaws.com/0/57570/95227d9a-4457-c8b4-022d-5dd88c17245d.png "kobito.1415320044.458358.png")

が、なぜか上の図のように、Exitボタンにドロップできない！！！


と思っていろいろ調べたら、先に親画面のクラスに、unwindのコードを追加しなければいけなかったらしい。

```
@IBAction func unwindToTop(segue: UIStoryboardSegue) {
}
```

ドロップできました。めでたしめでたし。
fluentdの実行時のユーザなど変更手順

デフォルトのtd-agentユーザでは、
権限の関係上実行できない処理などがあります。
その際に、fluentdの実行ユーザを変更する手順です。
rootに変更します。


# 環境

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS"

$ td-agent --version
td-agent 0.10.50
```

# 変更箇所

1.実行ユーザの変更
2.ログの出力モード変更

```
$ diff /etc/init.d/td-agent /etc/init.d/td-agent.org
22c22
< USER=root                   # Running user
---
> USER=td-agent                   # Running user
28c28
< DAEMON_ARGS="/usr/sbin/td-agent $DAEMON_ARGS -v --daemon $PIDFILE --log /var/log/td-agent/td-agent.log"
---
> DAEMON_ARGS="/usr/sbin/td-agent $DAEMON_ARGS --daemon $PIDFILE --log /var/log/td-agent/td-agent.log"
```

↓再起動したら、反映される。

```
$ sudo /etc/init.d/td-agent restart
```

以上
Postgresでデーターベースに接続できない非エンジニアです。

#ドットインストールを見ながら学習中

『Heroku入門』の「Railsアプリケーションを作ろう」の回。
http://dotinstall.com/lessons/basic_heroku/28805

#Postgresでデータベースに接続
rails -sでサーバーを起動するも、ページには下記の通りの表示。

```could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"?```

ん？これはおかしい。

#いろいろ調べてみる。
どうやら、そもそもPostgresでデータベースの作成ができていない？
ターミナルで「psql s」と打つと下記の表示。

```psql: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/tmp/.s.PGSQL.5432"?```

#ググると解決策は出てくるが・・・
どれを適用しても、同じ表示が出てくる。
困っています。

このエントリーとか参考になりそう。
http://taise.hatenablog.com/entry/2013/10/13/162546

もう少し調べてみないと・・・。
jQueryでテキストエリアの文字数を取得時に、改行＋スペースは無視したい場合

textareaの入力文字数によってメッセージを表示したい時に、
val().lengthでは改行も文字として扱われるため、事前に取り除きます。
`
var len = $('#target').val().replace(/\n/g, "").length;
`
* /gを付けないと最初の改行コードのみ変換され、２個目以降は残るので注意。

スペースも除きたい場合は正規表現を追加
`
var len = $('#target').val().replace(/[\n\s　]/g, "").length;
`
AWS/GCP/Apacheで提供されているサービス対応表

いろいろな団体、企業で提供されているストレージや分散処理などのサービスをゆるふわにまとめてみた。
2つ以上の団体で提供されているサービスのみ掲載。
足りないとか間違ってるとか、他の団体でこんなんあるよとかあれば教えていただけるとありがたいです。

|種別|Google内部|GCP(Google Cloud Platform)|AWS(Amazon Web Services)|Apache|
|:--|:--|:---|:---|:--|
|データウェアハウス|[Dremel](http://research.google.com/pubs/pub36632.html)|[BiqQuery](https://cloud.google.com/bigquery/?hl=ja)|[Redshift](http://aws.amazon.com/jp/redshift/)|[Apache Drill](http://incubator.apache.org/drill/)|
|分散処理フレームワーク|[MapReduce](http://research.google.com/archive/mapreduce.html)|[Apache Hadoop](https://cloud.google.com/solutions/hadoop/)※|[Elastic MapReduce](http://aws.amazon.com/jp/elasticmapreduce/)|[Apache Hadoop](http://hadoop.apache.org/)|
|分散ファイルシステム|[GFS](http://research.google.com/archive/gfs.html)|||[HDFS](http://hadoop.apache.org/docs/r1.2.1/hdfs_user_guide.html)|
|NoSQL DB|[BigTable](http://research.google.com/archive/bigtable.html)|[Cloud Datastore](https://cloud.google.com/datastore/)|[SimpleDB](http://aws.amazon.com/jp/simpledb/)|[Apache HBase](http://hbase.apache.org/)|
|RDB||[Cloud SQL](https://cloud.google.com/sql/?hl=ja)|[RDS](http://aws.amazon.com/jp/rds/)|
|オブジェクトストレージ||[Cloud Storage](https://cloud.google.com/storage/)|[S3](http://aws.amazon.com/jp/s3/)|
|DNS||[Cloud DNS](https://cloud.google.com/dns/)|[Route 53](http://aws.amazon.com/jp/route53/)||

※GCE上でApacheのHadoopが動作する
Swiftでハマったこととその対応

## 概要

下記のように配列にクラスオブジェクトを格納し、protocolで定義されたクラスメソッドを呼び出そうとしたときに悩んだのでメモします。


```swift

protocol SomeProtocol {
    class func call()
}

class SomeClass: SomeProtocol {
    class func call() {
        
    }
}

var arr = [SomeProtocol.Type]()

arr.append(SomeClass.self)

for v in arr {
    // この箇所がコンパイルできない
	// accessing members of protocol type value 'SomeProtocol.Type' is unimplemented
	v.call() 
}

```

しばらく格闘したのですが、Swiftだけでは解決することが出来ませんでした。
結局、実際の処理部分をObjective-Cで実装し、Swift側でそれを呼び出すという形に落ち着きました。

一つ注意点としてObjctive-CからSwiftのクラスを操作する際には、下記のどちらかの対応が必要です。
後者のほうがクラスの継承元関係なく利用できるのでおすすめです。

+ NSObjectを継承したクラス
+ @objcアトリビュートをObjective-Cで呼び出したいメソッドにつける



## サンプルコード


```objc
@interface ObjcSomeProtocolService : NSObject

- (void)add:(Class)aClass;
- (void)launch;

@end

@protocol ObjcSomeProtocolDummy <NSObject>
+ (void)call;
@end

@interface ObjcSomeProtocolService ()
@property (nonatomic, retain) NSMutableArray *arr;
@end

@implementation ObjcSomeProtocolService

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.arr = @[].mutableCopy;
    }
    return self;
}

- (void)add:(Class)aClass
{
    [self.arr addObject:aClass];
}

- (void)launch
{
    for (Class c in self.arr) {
        [c call];
    }
}

@end
```

```swift
class SomeClass {
}

extension SomeClass: SomeProtocol {
    @objc class func call() {
        println("called")
    }
}


let s = ObjcSomeProtocolService()
s.add(SomeClass.self)
s.launch()

```
プルリク四天王をコンプリートする

# プルリク四天王をコンプリートする
## 概要
プルリク四天王（独断と偏見）を紹介。
主に普段 OSS のプロダクトをよく利用するけど、プルリクはしたことが無い人に向けた内容です。

ちょうど今日るりまにプルリクしたので、るりまへのプルリクを例にします。
自分の関心領域のコンテキストに置き換えて想像していただけると幸いです。
（自分が日常良く使う、言語・ライブラリ・技術ドキュメントなど）

## 四天王 1 人目 「不足・不満を感じる」
るりまの例なら、

* この説明だと分からない
* ここは体裁が崩れていて読みにくい
* 誤字を見つけた
* 情報が不足している

ソフトウェアなら

* ここは設定ファイルから設定可能にしたい
* 適切なデフォルト値が欲しい
* コードリーディングをしていたらコードの臭いがあった

不足・不満を感じることが出来るということは、
「より良い、あるべき姿」が分かっているということになります。
（それが正しいかどうかはさておき）
それだけでもあなたの能力は高く、役に立つ可能性を秘めています。

「 **［不足・不満を感じる］** がやられたようだな…」
「ククク…奴はプルリク四天王の中でも最弱…」
「るりまごときに負けるとはプルリクの面汚しよ…」

## 四天王 2 人目 「正解、解法を調べる」
例えば、るりまのドキュメントをみても仕様や用途が載っていない メソッドがあった場合、
四天王 1 人目でアクションを止めている人よりワンランク上の開発者は、

* Google で検索して、正解の情報を探し、以下の様な場所で正解を見つける
    * 上級者のブログ
    * Ruby コミッタのブログ
    * Ruby メーリングリストのログ
* 友人に教えてもらう
* QAサイトで質問する

プログラムの機能不足などに置き換えるならば、実装手段や設計方法を調べて
自分自身が不満に思っていた点を解消すること。

しかし、見つけた正解、解法に満足しているだけでは、まだまだ四天王ブービー賞。

## 四天王 3 人目 「ブログにポストする」
技術ブログや Wiki などに調べた内容をポストして、得た知識を共有する。
ここまで来ると大分手強い四天王です。
コミュニティへの貢献が発生して来ました。

## 四天王 4 人目 「プルリクする」
事の発端は何だったでしょうか？
るりまの記載に不足があったことです。

ここで想像力を働かせます。
日本人が Ruby のクラスやメソッドなどの情報を探す時、
多くの人は るりまを利用するでしょう。
（多分・・・。もし違うと思っていても話の流れ上そういうことにしておいてください。後生ですから。）

自分が得た知識を 3 人目の四天王で広めることができたかもしれませんが、それは一過性です。
記事の露出が減った頃に新たに Ruby のことを学び始めた人は
るりまの記載が不足しているのを見つけて、不足・不備を自分で調べ始めます。

これって、コミュニティ全体のリソースをすごく無駄遣いしている気がします。

そこで、プルリクです。
各ユーザーが仕様を確認する時に訪れるであろう、 るりまの情報を Fix すれば、
以降は同じ部分にハマる開発者が大幅に減るはずです。

四天王 1 ＝＞ 4 と数が大きくなるほど手間が増えるかもしれませんが、
その結果がもたらす効果は何百人どころでは収まりません。
影響範囲は該当技術のコミュニティ全体です。

あなたが30分使ってプルリクを行っただけで、
他の開発者が同じことを調べるのに使う必要があった時間、

 30分 ✕ 10,000人（仮） = 5, 000 時間

を節約することができている・・・のかもしれません。

ここまで来たあなたは、訪れてきた敵を全回復してから戦うくらい強い四天王です。
**「さあ！回復してやろう！もてる力のすべてでかかってこい！」**

## まとめ
時間という有限かつ希少なリソースと相談する必要がありますが、
普段コミットしている技術分野にはちょくちょく貢献しておいたほうが気持ちいいものですし、
該当分野での信頼貯金もたまるのではないでしょうか。
それは利益になって返ってくると思っています。

特に、ドキュメントの不足・不備などは、調査段階で得た情報を
プルリクするのはそれほど大きな手間がかかりません。

ブログにまとめたりする人なら尚更です。
ブログ用にまとめた情報をちょっと整理してプルリクするだけです。

プログラムのスキル的にも、上級者である必要はないので
かなり貢献しやすい領域では無いかと思います。

## 補足
* メタファが破綻している？そうですね。
* るりまの貢献手順は下記に体験談をまとめてあります。
    * [Rubyリファレンスマニュアル「るりま」の誤字などを見つけた時の貢献フロー](http://qiita.com/tbpgr/items/2072a9a743918b8cfb34)
* この流れで、今日送ったプルリクが reject だったらそれはそれでおいしい展開かもしれない
* こういう記事ってポエムに入るんですか？よくわかりません。
Homebrewでのblockdiagのインストールが簡単になっていた

## 経緯

[blockdiag](https://bitbucket.org/blockdiag/blockdiag)使いたいんだけど、[homebrewでのインストールはfreetype2の対応がめんどい](http://blockdiag.com/ja/blockdiag/introduction.html#macosx-homebrew)なーと思って試していたら、freetype使って簡単にインストールできるようになっていたのでまとめておく。

## 方法

```zsh
$ brew install freetype
$ brew install python --framework
$ pip install blockdiag
```

これだけ。

一応、ちゃんと動作するか確認しておく。

```zsh
$ vim test.diag
```

```
blockdiag {
   A -> B -> C -> D;
   A -> E -> F -> G;
}
```

```zsh
$ blockdiag test.diag
$ open test.png
```
![test.png](https://qiita-image-store.s3.amazonaws.com/0/8064/94d472f2-f405-6208-1680-16b64188945a.png)

enjoy!
デフォルトの malloc を差し替えずに tc_malloc を使う


## tcmalloc とは
Google 製のメモリチェックライブラリ gperftools の一部. 高速なアロケーションを売りにしている.

https://code.google.com/p/gperftools/

既存のコードを書き換えずに, tcmalloc.so をリンクしてビルドするだけで, malloc が tc_malloc に差し替わり, プログラムの高速化が期待できる. 特に VC++ のを差し替えるとびっくりする.

## 課題
しかしながら勝手に差し替えられたくないこともある. tcmalloc を選択的に利用するにはどうすればよいか.

## 解法

上記サイトからソースを取ってくる

```sh
% curl -O https://gperftools.googlecode.com/files/gperftools-2.1.tar.gz
% tar xf gperftools-2.1.tar.gz
% cd gperftools
```

src/tcmalloc.cc の900行目くらいにある変数をコメントアウトする.
TCMallocGuard のコンストラクタでデフォルトランタイムの関数を差し替えているので, コンストラクトしないようにする.

```diff
#ifndef WIN32_OVERRIDE_ALLOCATORS
-static TCMallocGuard module_enter_exit_hook;
+//static TCMallocGuard module_enter_exit_hook;
#endif
```

そしてビルド(make or msbuild).

使うときは gperftools/tcmalloc.h をインクルードする.

```cpp
#include <gperftools/tcmalloc.h>
// ...
char* p = (char*)tc_malloc(1024);
tc_free(p);
```

これで通常 malloc と tc_malloc の共存ができた. ただし VC++ 環境でしか試してません.
**2014/11/07 追記**: OS X 上の Clang でも有効でした.
Jenkinsでジョブ毎のキュー管理、的なこと

互いに無関係なジョブ A とジョブ B がある状態で、一つのノードに対して

1. ビルド A-1
2. ビルド B-1
3. ビルド A-2
4. ビルド B-2

という順番でビルドを実行させようとすると、A-1 → B-1 → A-2 → B-2 と待つことになります。

自分以外のジョブのビルドは待たないようにしたいです。上記の場合だと例えば B-1 は A-1 を待たずに実行したいです。

以下のやりとりを参考にして、

"Multiple build queues in Jenkins"
http://stackoverflow.com/questions/8731422/multiple-build-queues-in-jenkins

ジョブ A 用のスレーブ A とジョブ B 用のスレーブ B を作成して実現できました。(スレーブ A, B は同一マシンで立ち上げ)

キューではなくてノードを分けるという発想がありませんでした・・・。
コマンドラインからアクセスログに Woothee を適用して分析

[Woothee](http://woothee.github.io/) は User-Agent のパース・分類を行うライブラリです。
JavaScript, Java, Ruby, Perl, Python, PHP, Golang と、複数の実装が用意されており、共通のテストデータを使うことで同一の判定結果が保証されているのが特徴です。

Web エンジニアならコマンド上でちょっとしたアクセスログの分析を行うこともあると思いますが、バラバラな User-Agent に Woothee を適用して下処理ができれば捗るでしょう。

# テスト用データの用意

こんな感じの LTSV ファイルを用意してみました。
自サイトから引っ張りだしたリアルなログです。
クローラーっぽいのだけに絞り込んで、一応ホストは除外しています。

https://gist.github.com/yuya-takeyama/7e7ce74794d39ed78dac

# まずは Woothee のインストール

今回は [woothee-ruby](https://github.com/woothee/woothee-ruby) を使いますが、他の言語でもだいたい似たようなことはできるでしょう。

```
$ gem i woothee --no-ri --no-rdoc
```

# LTSV から User-Agent だけ抽出

LTSV なので `awk` と `cut` の合わせ技だけで十分です。

```
$ awk -F "\t" '{ print $11 }' crawler.txt | cut -b4-
Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Fastladder FeedFetcher/0.0.3 (http://fastladder.org/)
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
```

# Woothee を適用

`ruby` の `-r` オプションで `woothee` を読み込みつつワンライナーを実行します。
ここではクローラ名だけを抽出してみました。

```
$ awk -F "\t" '{ print $11 }' crawler.txt | cut -b4- | ruby -r woothee -ne 'puts Woothee.parse($_.chop)[:name]'
Googlebot
bingbot
Baiduspider
bingbot
bingbot
Googlebot
Googlebot
livedoor FeedFetcher
Googlebot
Googlebot
```

# 集計

`sort` と `uniq` でランキング化してみましょう。

```
$ awk -F "\t" '{ print $11 }' crawler.txt | cut -b4- | ruby -r woothee -ne 'puts Woothee.parse($_.chop)[:name]' | sort | uniq -c | sort -nr
  95 Googlebot
  75 livedoor FeedFetcher
  45 Baiduspider
  44 bingbot
  21 Yahoo! Slurp
  18 Google Feedfetcher
  13 ahref AhrefsBot
  10 salesforce radian6
   7 Hatena
   5 Googlebot Mobile
   1 Google AppEngine
```

Google が多いですね。

# それ jr でできるよ

拙作の、jq 風の JSON フィルタリングを Ruby で書けるツール、[jr](https://github.com/yuya-takeyama/jr) ならもっと簡単にできます。
`--require` オプションによるライブラリの読み込みに対応したので、Woothee など様々な Gem と組み合わせて使えるようになりました。
これまた拙作の [ltsv2json](https://github.com/yuya-takeyama/ltsv2json) と組み合わせて使います。
(ltsv2json と jr の組み合わせについては [LTSV のログを jq でフィルタする](http://qiita.com/yuya_takeyama/items/f29b37302db0ce70de0c) もお読みください)

それでは jr をインストールしてみましょう。

```
$ gem i jr-cli --no-ri --no-rdoc
```

jr なら以下のようにできます。

```
$ ltsv2json crawler.txt | jr --require woothee 'map{|j| Woothee.parse(j[:ua])[:name] }' | sort | uniq -c | sort -nr
  95 "Googlebot"
  75 "livedoor FeedFetcher"
  45 "Baiduspider"
  44 "bingbot"
  21 "Yahoo! Slurp"
  18 "Google Feedfetcher"
  13 "ahref AhrefsBot"
  10 "salesforce radian6"
   7 "Hatena"
   5 "Googlebot Mobile"
   1 "Google AppEngine"
```

簡単ですね。
[Scala]Option型から値を取り出すあれこれまとめ

# [Scala]Option型から値を取り出すあれこれまとめ

下記の変数がセットされていると仮定します
>前提：
    val haveFoo: Option[String] = Option("foo")
    val haveNothing: Option[String] = None

## 1. get, getOrElse
最も単純なもの。

.getは、Noneに対して行ってしまうとエラーになり止まってしまうので、
基本的に「.get」は使わず、「.getOrElse」を使用します。

```scala
haveFoo.get // "foo"
haveFoo.getOrElse("bar") // Option("foo")

haveNothing.get // Exception
haveNothing.getOrElse("bar") // "bar"
```

## 2. match ~ case ~

可読性が高い

色んなところで多用されます

```scala
haveFoo match {
    case Some(x) => println(x)          // ここに来る x = "foo"
    case None => println("Noneです")    // ここにはこない
}

haveNothing match {
    case Some(x) => println(x)         // ここにはこない
    case None => println("Noneです")   // ここに来る。Noneの時の処理を書く
}

```

取り出した値を変数に入れることも可能

```
val message1: String = haveFoo match {
    case Some(x) => x + "が入っています"
    case None => "何も入っていません"
}
println(message1) // "fooが入っています"

val message2: String = haveNothing match {
    case Some(x) => x + "が入っています"
    case None => "何も入っていません"
}
println(message2) // "何も入っていません"
```

## 3. foreach ~
Some( )の時だけ処理をしたいときに使用します。

```scala
var count: Int = 0
haveFoo.foreach { x => // x = "foo"
    count + 1
}
println(count) // 1

haveNothing.foreach { x => // 何も処理されない
    count + 1
}
println(count) // 1 
```

## 4. for~
Option型がネストされていて、その中身に対して処理をしたい時など。

```scala
val nestedFooBar: Option[Option[String]] = Option(haveFoo)
for{
    haveFoo <- nestedFooBar
    text    <- haveFoo
} {
    println(haveFoo) //Some("foo")
    println(text)    // "foo"
}

val nestedNone: Option[Option[String]] = Option(haveNothing)
for{
    haveNothing <- nestedNone
    text        <- haveNothing
} {
    println(haveFoo)  // 何も出力されない
    println(text)     // 何も出力されない
}
```
## 5. for ~ yield ~
forの結果を返したい時。(forだけだと戻り値がUnit型なので何も返せない)

Option型がネストされている時に重宝します。

```scala
val message1: Option[String] = for(text <- haveFoo) yield text
println(message1) // Some("foo")

val message2: Option[String] = for(text <- haveNothing) yield text
println(message2) // 何も出力されない

```

ネスト版

```scala

val nestedFooBar: Option[ Option[String]] = Option(haveFoo)
val message1: String = (for{
    haveFoo <- nestedFooBar
    text    <- haveFoo
} yield {
    text
}).getOrElse("なにも入っていません")

println(message1) // "foo"

val nestedNone: Option[ Option[String]] = Option(haveNothing)
val message2: String = (for{
    haveNothing <- nestedNone
    text        <- haveNothing
} yield {
    text
}).getOrElse("なにも入っていません")

println(message2) // "なにも入っていません"
```

***

とりあえず、簡単なところをまとめました。

コンソールなどで試していただければ
すぐに結果が見れると思います。

Scalaを書く中で、少しでも参考になれば幸いです。
vagrant で VM 起動


debian7 を Vagrant で動かしたときのお手軽手順。
Vagrant 等々のインストールは終わった段階から。
box ファイルは予め手元にダウンロード済み(debian-7.1.0.box)。

こんな状態でスタート。

```bash
$ ls
debian-7.1.0.box
```

まずは Vagrantfile を生成。

```bash
$ vagrant init
```

VM の名前は適当に、`my-debian-7.1.0` で。
IP アドレスはお好みで。
Vagrantfile は、最低限下記 2 項目だけ指定しておけば。

```bash:Vagrantfile
config.vm.box = "my-debian-7.1.0"
config.vm.network :private_network, ip: "192.168.33.10"
```

VM 追加。

```bash
$ vagrant box add 'my-debian-7.1.0' ./debian-7.1.0.box
```

追加されてるのを確認。

```bash
$ vagrant box list
my-debian-7.1.0 (virtualbox, 0)
```

VM 起動。

```bash
$ vagrant up
```

起動したら、vagrant ユーザでログイン可能。

```bash
$ vagrant ssh
```

`vagrant-ssh` でもいいんですが、Host 側の `./ssh/config` に登録しておくと便利かと。
今回は `my` って名前で。

```bash
$ vagrant ssh-config --host my >> ~/.ssh/config
```

以降、`my` て名称でアクセスできます。

```bash
$ ssh my
```
nginxでベーシック認証して、zabbixサーバに飛ばしてみた

#初めに
zabbixサーバにアクセスするIPアドレスが解らず怖いので、何か認証をかけたい！ってことで検証してみました。本当に最低限だけ搭載しています。nginx勉強しないと・・・・

#動作環境
Amazon Linuxの最新版（2014/11/06）時点で実施しました。

#アクセス順の概要
以下のようにして認証を2回しています。
80ポートに関して最低限のIPを開けます。

インターネット
　　　↓
　　　＜パブリックIP＞
EC2：【認証①】nginxサーバ
　　　＜プライベートIP＞
　　　↓
　　　＜パブリックIP＞
EC2：【認証②】Zabbixサーバ

#設定方法

--nginxの導入--
nginxの導入
`$ sudo yum install nginx`

自動起動の有効化
`$ sudo chkconfig nginx on`

サービス起動
`$ sudo service nginx start`

--basic認証の設定--
設定用のコンポーネントをインストール
`$ sudo yum install httpd-tools`

パスワードの作成
`$ cd /etc/nginx`
`$ sudo htpasswd -c .htpasswd ユーザ名`
　　パスワード要求されるので設定したいものを入力
　　※7文字以内じゃないとダメなようです

設定ファイルを作成します
`$ sudo vi /etc/nginx/conf.d/default.conf`

```default.conf
#
# A virtual host using mix of IP-, name-, and port-based configuration
#

server {
    listen       80;
#    listen       somename:8080;
#    server_name  somename  alias  another.alias;

    location / {
        auth_basic "Restricated";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://zabbixサーバIP;
#        root   html;
#        index  index.html index.htm;
    }
}
```

#アクセスしてみる
http://nginxサーバのIP/zabbix

これでzabbixサーバにnginx経由で行けるはずです！
浮動小数点数のリストの表示出力

こんにちは。
浮動小数点数のリストを、見栄え良く print 表示出力（小数点以下の桁数を指定、float クラス の subclassing）。[分数の表示（リスト）prettyfrac()](http://qiita.com/kkdd/items/d3eda81b69610201279d "分数の表示（リスト）")と同様。

```python
print(prettyfloat([1./3, 2./3], ndec=3)) # print pretty float numbers
# ==> [0.333, 0.667]
```

```python
# ndec: a number of decimal places

def prettyfloat(x, ndec=2):
    def pfform(x):
        return ("%0." + str(ndec) + "f") % x
    pfclas = type('', (float,), {'__repr__': pfform, '__str__': pfform})
    def pf(x):
        if isinstance(x, float):
            return pfclas(x)
        else:
            return x
    return map_recur(pf, x)
```
Python 3 対応したのでメモ

io_bit.py, io_midi.py を Python 2 で書き始めたので、 3 対応で手当したもの。

関連) http://d.hatena.ne.jp/yoya/20141106/io_midi

- ファイルをバイナリとして open する場合は "b" を指定する。(2 だとなくても動く)
<pre>
X data = open(file).read()
O data = open(file,"rb").read()
</pre>
    - ちなみに、3 で出るエラーはこれ。
<pre>
  File "/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/codecs.py", line 313, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe0 in position 13: invalid continuation byte
</pre>
  - 切り出したデータもバイナリ(バイト列)になるので、比較チェックでは data == b"〜" のように bを付ける。
<pre>
X   chunk == "MThd"
O   chunk == b"MThd"
</pre>
- has_key は使えないので in を使う。
<pre>
X a.has_key("x")
O "x" in a
</pre>
- バイト列から1バイト切り出すのを範囲指定に書き換え。
<pre>
X bytes[i] # ←これだと 2 と 3 で挙動が違う
O bytes[i:i+1] 
</pre>
<pre>
$ python2 -c 'print(b"AB"[1])'
B
$ python3 -c 'print(b"AB"[1])'
66
$ python3 -c 'print(b"AB"[1:2])'
b'B'
</pre>
- ハードタブをソフトタブに修正。(2だとハードタブでも動く)
[PHP] Travis CI で memcached を使う

Travis CI で memcached を使う方法を調べました。

[ドキュメント](http://docs.travis-ci.com/user/database-setup/#Memcached)によると memcached はインストールされているもののサービスは起動していないので、`.travis.yml` で `services` に `memcached` を指定する必要があるとのことです。また、PHP から memcached を利用するために `php5-memcached` のインストールと php.ini に memcached.so を読み込むように設定を追記します。php.ini への追記は `phpenv config-add` コマンドによって実現できました。`travis.php.ini` の内容が php.ini へ反映されます。

```yaml:.travis.yml
language: php
services:
  - memcached
before_script:
  - "sudo apt-get install php5-memcached"
  - "phpenv config-add travis.php.ini"
script:
  - phpunit MemcachedTest.php
```

```travis.php.ini
extension=memcached.so
```

PHP から memcached を使えるか確かめるテストです。

```MemcachedTest.php
<?php

class MemcachedTest extends PHPUnit_Framework_TestCase{
  function testMemcached(){
    $m = new Memcached();
    $m->addServer('localhost', 11211);
    $m->add('name', 'yamada');
    $this->assertEquals('yamada', $m->get('name'));
  }
}
```

テストはパスしました。

```
$ phpunit MemcachedTest.php
PHPUnit 4.3.4 by Sebastian Bergmann.
.
Time: 64 ms, Memory: 3.75Mb
OK (1 test, 1 assertion)
```

GitHub
https://github.com/suzuki86/sample-of-using-memcached-on-travisci

Travis CI
https://travis-ci.org/suzuki86/sample-of-using-memcached-on-travisci
SublimeHighlight導入でつまづいたメモ

エディタの中身をHTMLとかRTFで出力したいなーと思い、[SublimeHighlight](https://github.com/n1k0/SublimeHighlight/tree/python3)を導入したときにつまずいたメモ

## 導入
導入の際に参考にした記事は[こちら](http://monkeyhacks.com/sublime-text-3-copy-as-rtf-and-html-with-sublimehighlight)

`Cmd`+`P`でダイアログを出し、`Add Repositry`を選択。
![addRepository.png](https://qiita-image-store.s3.amazonaws.com/0/2037/fd3db060-8a3c-ee15-d998-ab3c16c1936b.png)


次にエディタ下部の欄に`https://github.com/n1k0/SublimeHighlight/tree/python3`をこぴぺで貼付け。
![SublimeHighlight.png](https://qiita-image-store.s3.amazonaws.com/0/2037/d6197ed5-06e8-6e1c-17ea-da672cfb4119.png)


上部の画像では正しく書かれていますが、最初のリンク先の記事に書いてあるものをコピって、ペッとした際に、改行コードもコピーしてしまい、貼り付けしても何も表示されてませんでした。
そして、そのままエンターをポチっと押したところ、何も起きません。。

## 解決
`Shift`+`Cmd`+`P`でダイアログを出し、`Install Package`を出そうと思ったのですが、何も出てこなくなってしまいました。。
さすがに`Install Package`が出なくなるのはまずいなーと思ったので、`ctrl`+ \` でエラーログをチェック！

```
Exception in thread Thread-64:
Traceback (most recent call last):
  File "./threading.py", line 901, in _bootstrap_inner
  File "/Users/Ken/Library/Application Support/Sublime Text 3/Packages/Package Control/package_control/commands/install_package_command.py", line 43, in run
    'reinstall', 'pull', 'none'])
  File "/Users/Ken/Library/Application Support/Sublime Text 3/Packages/Package Control/package_control/package_installer.py", line 54, in make_package_list
    packages = self.manager.list_available_packages()
  File "/Users/Ken/Library/Application Support/Sublime Text 3/Packages/Package Control/package_control/package_manager.py", line 260, in list_available_packages
    provider = bg_downloader.get_provider(repo)
  File "/Users/Ken/Library/Application Support/Sublime Text 3/Packages/Package Control/package_control/downloaders/background_downloader.py", line 52, in get_provider
    return self.used_providers[url]
KeyError: 'https://github.com/n1k0/SublimeHighlight/tree/python3\nhttps://github.com/n1k0/SublimeHighlight/tree/python3\nhttps://github.com/n1k0/SublimeHighlight/tree/python3'
```

やはり、改行コード付きの`https://github.com/n1k0/SublimeHighlight/tree/python3`を何回もこぴぺしたのが原因でした。最後の行を見ると、repositoryが多重登録されてしまっています。

どうすればーいいのかなーと調べたところ、[ここ](http://stackoverflow.com/questions/18456708/sublime-text-remove-repository)が参考になりました。

回答を参考にして`/Users/Ken/Library/Application Support/Sublime Text 3/Packages/User/Package\ Control.sublime-settings`を見ると、

```
"repositories":
        [
                "https://github.com/n1k0/SublimeHighlight/tree/python3\nhttps://github.com/n1k0/SublimeHighlight/tree/pyt$
        ]
```
怪しそうな部分がありました！
なので、このrepositoriesの中身を削除し、

```
"repositories":
        [
                "https://github.com/n1k0/SublimeHighlight/tree/python3
        ]
```
としました。


## めでたし
そして、SublimeText3を再起動したところ、`Install Package`でパッケージ一覧が出るようになり、`SublimeHighlight`も入れられるようになりました。

これでエディタの中身をHTMLやRTFで出力できるようになりました。
コーディング規約的なもの

# はじめに

コーディング規約と銘打っていますが、そんな大層なものではなく、
単に「こうすると少しは読みやすくなるかも、便利かも」くらいのレベルのものです。
参考になるものもあるかも知れません。

予めアクションタグの書き方の取り決めは、他のプログラミング言語同様、定義しておいた方が良いと思うので、良さそうな取り決めを書いてみました。

# 規約的なもの

## 特別な場合以外はStart～End内はインデントする

これは…説明不要かと思います。
Action系やIfなどはインデントすることで、始まりと終わりの対応が分かりやすくなります。

特別な場合と言うのは、下記の様な一行に収めないといけない場合です。

* Record
* Substring
* DateFormat
* etc...

特別な場合の方が数が多い気がするのは気のせいです。
使用頻度はきっとAction系やIfの方が多い…はず。

あとは、アクションタグとhtmlでインデントレベルを独立させるとかあるかと思いますが
これは好みの範疇だと思うので割愛します。

## アクションタグは頭大文字、コンポーネント呼び出しは全て小文字

アクションタグは特に大文字小文字の区別が無いので全て小文字で書いても問題無く動作しますが、
コンポーネントの呼び出しと書き方が同じなので、大文字小文字で区別すると良いかと思います。
アクションタグは特にBasic ActionTag Guideを読むと頭大文字なので、それに準拠する、とかでも良いと思います。

```
[[---アクションタグの表記はBasic ActionTag Guideに準拠---]]
[[--ActionStart, category, row:*--]]
	[[---コンポーネントの呼び出しは定義の通り全て小文字---]]
	[[--tag_sample--]]
[[--ActionEnd--]]
```

## IfとThenは同じ行に書く

これは何かと言うと、下記の様に書くと良いです、と言う事です。

```
[[--IfStart, exist:afield_link--]][[--ThenStart--]]
	<li><a href="[[--ArtFieldValue, field:afield_link--]]">[[--ArtFieldValue, field:afield_text--]]</a></li>
[[--ThenStart--]][[--ElseStart--]]
	<li>[[--ArtFieldValue, field:afield_text--]]</li>
[[--ElseEnd--]][[--IfEnd--]]
```

シェルスクリプトなんかでもそうですが、こう書くことでインデントレベルを節約出来ます。
Ifの入れ子をしたときに凄まじくインデントしなければならなくなるので、この表記はおすすめです。

例えばこれが、

```
[[--IfStart--]]
	[[--ThenStart--]]
		[[--IfStart--]]
			[[--ThenStart--]]
			[[--ThenEnd--]]
			[[--ElseStart--]]
				[[--IfStart--]]
					[[--ThenStart--]]
					[[--ThenEnd--]]
				[[--IfEnd--]]
			[[--ElseEnd--]]
		[[--IfEnd--]]
	[[--ThenEnd--]]
[[--IfEnd--]]
```

こうなります。

```
[[--IfStart--]][[--ThenStart--]]
	[[--IfStart--]][[--ThenStart--]]
	[[--ThenEnd--]][[--ElseStart--]]
		[[--IfStart--]][[--ThenStart--]]
		[[--ThenEnd--]][[--IfEnd--]]
	[[--ElseEnd--]][[--IfEnd--]]
[[--ThenEnd--]][[--IfEnd--]]
```

そもそもIfをネストしてしまうと重くなってしまうので、出来ればこんな処理は書かない方が良いのですが。

## 変数を使う時、固定値はDefine、変化する値はRecord

DefineとRecordの違いは、Start～Endの中のアクションタグを解釈するかどうかです。
つまり、処理速度はDefine > Recordです。
(これはBasic ActionTag Guideにも書いてあったと思います)

なので、単にテキストを変数に入れる場合はDefine、アクションフィールドの中身を変数に入れる、など
アクションタグの呼び出しがある場合にはRecordを使うと処理は効率的です。

```
[[--DefineStart, name:var--]]text[[--DefineEnd--]]
[[--RecordStart, name:var--]][[--ArtFieldValue, field:afield--]][[--RecordEnd--]]
```

あとは、好みの問題ですが、

```
[[--DefineStart, name:var, value:text--]]
```

の様な書き方はしない方が良いと思います。
Recordと書き方のレベルを合わせた方が良いかと思うので。

## コンポーネントを変更するときは説明に識別子を書いておく

本番環境と開発環境が独立している場合に有用です。
コンポーネントの説明はエクスポートする時の検索に引っかかるので、
開発環境から本番環境に導入するときの作業がとても楽になります。

識別子は改修案件ごとに一意であれば何でも良くて、例えばコンポーネントソースを
gitなんかで別途管理している場合にはブランチ名にしておいたりすると良いです。
改修案件ごとにブランチを切る運用をすればとても分かりやすいです。

# おわりに

書いていて全て好みの問題の様な気がしてきました…
内容はともかく、コーディング規約はあると良いと思います。
後から検索かけて一括置換したいときとか、担当者で思い思いの書き方をしていたら全く一括では無くなりますし。
[ajax/pjax]複数枚の画像読み込み後に処理を実行する




# **概要**

jQueryのpjaxやajaxを使って遷移をしたとき、複数枚の画像読み込み(imgObj.onload)後に処理を実行する方法を紹介します。

基本的に、pjaxやajaxには、onloadイベントはありません（似たようなのはあります）。なので、window.onloadではなく、imgObj.onloadを使います。



# **１：要素を取得する**

まず、ターゲットとなる画像を普通に取得します。このとき、pjaxの場合、pjax:complete後に、ajaxの場合、success後に実行します。

```js
// 画像は３つのli要素の中にそれぞれ1枚あるとします。
var img_elm = $('li img');
```

# **２：Imageオブジェクトをつくる**

要素を取得したらImageオブジェクトをつくります。$eachで３枚分つくってます。

```js
createImgObj(img_elm);

function createImgObj(img_elm) {
	num = img_elm.length - 1; // 最後の画像のindexをもっておく
	img_elm.each(function(i, elm) {
		imgObj[i] = new Image();
		imgObj[i].src = elm.src;
	});
}
```

# **３：最後の画像が読まれた時に処理を実行する**

最後の画像が読まれたら`flg`を`true`にします。`setInterval`で連続で実行している処理をつくっておいて、`flg`が`true`になったらそれをとめ、実行したい処理を好きに書きます。

```js
imgObj[num].onload = function() {
	setSlider(function(){flg = true;});
}

var timer = setInterval(function() {
	if(flg) {
            clearInterval(timer); // setIntervalをとめる
            // 画像読み込み後に実行したい処理。
	}
},1);

```



これにて、ajax/pjax遷移でも、画像読み込み後に処理を実行することができます（もっと良いやり方あれば教えて下さい）。
Java備忘録：標準出力のプログラムをコマンドプロンプト内で実行

Jarファイルにしたはいいがしかし動かない・・・。
なになに？「ＯＳのコンソールを一緒に使えば動く」とな？


先ほど作成したJar形式のファイルが入っているdistフォルダをデスクトップにコピー
フォルダ内にテキストファイルを作る。

![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/58653/0071ac8e-b2b9-3a5f-8dbf-833c96d2af5e.jpeg)



んでもってテキストファイルには以下のように記述。

java -jar masuQuiz.jar
pause!


テキストファイルの拡張子を「.txt」から「.bad」に変更し、そいつをダブルクリック。

![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/58653/3abe2b3e-5c41-2047-b91d-2829a7e53b00.jpeg)


すると・・・

![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/58653/604f76dd-eadf-4aa5-d7c1-593337bb4be8.jpeg)


おおおお！動いてるぅ～！




・・・とまあ人生初めて作った
クイズ形式のプログラムが動いた瞬間でしたとさ。
分数の表示（リスト）

こんにちは。
Python で Fraction を使えば分数を扱えます。そのような分数の値がリストに入っている時、見栄え良く print 表示出力させるための関数```prettyfrac()```を作ってみました。Fraction クラスの subclassing で、[浮動小数点数のリストの表示出力 prettyfloat()](http://qiita.com/kkdd/items/4f3c112ccb043d4bc501 "浮動小数点数のリストの表示出力")と同様です。

下記例は[楕円弧長計算](http://qiita.com/kkdd/items/acc933680ac013eee905 "楕円弧長計算")での係数の計算およびその表示出力。

```python
print(prettyfrac(...)) # print pretty fractions
# ==>  [[1, 1/4, 1/64, 1/256], [1/2, -1/16, -1/128], ...]
```

```python
from fractions import Fraction

def prettyfrac(x):
    def pfform(x):
        num, den = str(x.numerator), str(x.denominator)
        return num + ("" if den == "1" else "/" + den)
    pfclas = type('', (Fraction,), {'__repr__': pfform, '__str__': pfform})
    def pf(x):
        if isinstance(x, Fraction):
            return pfclas(x)
        else:
            return x
    return map_recur(pf, x)

def map_recur(func, args):
    if isinstance(args, list):
        return [map_recur(func, x) for x in args]
    return func(args)

def binom(frac, n):
    b = 1
    while (n > 0):
        b *= frac / n
        frac, n = frac - 1, n - 1
    return b

def coef(k, maxorder):
    k1 = k if k > 0 else 1
    half = Fraction(1, 2) # 1/2
    return map(lambda j: binom(half,j)*binom(half,j+k)/k1, range((maxorder-k)/2+1))

def main():
    maxorder = 6
    print(prettyfrac([coef(k, maxorder) for k in range(maxorder+1)]))

# ==>  [[1, 1/4, 1/64, 1/256], [1/2, -1/16, -1/128], [-1/16, 1/64, 5/2048], [1/48, -5/768], [-5/512, 7/2048], [7/1280], [-7/2048]]
```
Java備忘録：ネットビーンズでプロジェクトをJar配布形式にする

とりあえずネットで調べながら作ったクイズをJar形式にするやり方。

まず、プロジェクトを右クリック
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/58653/ba5644b1-f493-6361-6b1b-05200e8f5103.jpeg)



上から３番目「消去してビルド」をクリック
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/58653/ba97ffda-0100-bbc8-7f7a-73fa6d1215cf.jpeg)



出力ウィンドウの最後のメッセージでJarファイルの出力先を確認できる
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/58653/2995409f-0c44-d9f6-4170-8608d820f989.jpeg)



すると・・・なんということでしょう！
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/58653/f9ad6737-47ba-1d7f-78da-86e4dcd413b1.jpeg)





・・・とJarファイルにしてみたものの今回書いたプログラムは
標準出力を使っているので動かなかった・・・。

と、ここで画像の制限に引っかかったっぽいんで次の投稿へ
Vine Linux6.2にNetBeans8.0.1をインストールする

###Javaのインストール

PHPのNetBeans8.0.1を動作させるには、JRE7以上が必要です。

>PHPおよびC/C++ NetBeansバンドルでは、インストールおよび実行のためにJava Runtime Environment (JRE) 7または8のみが必要です。

VineのデフォルトのリポジトリではJRE6までしかありません。以下のページからJRE8のrpmをダウンロードし、インストールします。

JREのダウンロード：
https://java.com/ja/download/linux_manual.jsp?locale=ja

JREインストール：
`#rpm -ivh jre-8u25-linux-x64.rpm`

###NetBeansのインストール

以下のサイトからダウンロードスクリプトをダウンロードし、実行権限を与えた後に、実行すればインストールが進みます。

NetBeansダウンロード：
https://netbeans.org/downloads/index.html

`#chmod u+x netbeans-8.0.1-php-linux.sh`
`#./netbeans-8.0.1-php-linux.sh`